Commit 8b7fb7d0 authored by Sydney Acksman's avatar Sydney Acksman

Add tests for field presence and default values

Adjust APIs for extensions to properly return default values for extensions
Fix issues with IsInitialized and proto2 field reflection
parent a976158b
......@@ -764,6 +764,12 @@ message TestRequiredOneof {
}
}
message TestRequiredMap {
map<int32, NestedMessage> foo = 1;
message NestedMessage {
required int32 required_int32 = 1;
}
}
// Test messages for packed fields
......
......@@ -33,6 +33,7 @@
using System;
using System.IO;
using Google.Protobuf.TestProtos;
using Proto2 = Google.Protobuf.TestProtos.Proto2;
using NUnit.Framework;
using System.Collections;
using System.Collections.Generic;
......@@ -111,6 +112,50 @@ namespace Google.Protobuf
Assert.AreEqual("", message.OneofString);
Assert.AreEqual(ByteString.Empty, message.OneofBytes);
Assert.IsNull(message.OneofNestedMessage);
// proto2 default values
var message2 = new Proto2.TestAllTypes();
Assert.AreEqual(true, message2.DefaultBool);
Assert.AreEqual(ByteString.CopyFromUtf8("world"), message2.DefaultBytes);
Assert.AreEqual("123", message2.DefaultCord);
Assert.AreEqual(52e3, message2.DefaultDouble);
Assert.AreEqual(47, message2.DefaultFixed32);
Assert.AreEqual(48, message2.DefaultFixed64);
Assert.AreEqual(51.5, message2.DefaultFloat);
Assert.AreEqual(Proto2.ForeignEnum.ForeignBar, message2.DefaultForeignEnum);
Assert.AreEqual(Proto2.ImportEnum.ImportBar, message2.DefaultImportEnum);
Assert.AreEqual(41, message2.DefaultInt32);
Assert.AreEqual(42, message2.DefaultInt64);
Assert.AreEqual(Proto2.TestAllTypes.Types.NestedEnum.Bar, message2.DefaultNestedEnum);
Assert.AreEqual(49, message2.DefaultSfixed32);
Assert.AreEqual(-50, message2.DefaultSfixed64);
Assert.AreEqual(-45, message2.DefaultSint32);
Assert.AreEqual(46, message2.DefaultSint64);
Assert.AreEqual("hello", message2.DefaultString);
Assert.AreEqual("abc", message2.DefaultStringPiece);
Assert.AreEqual(43, message2.DefaultUint32);
Assert.AreEqual(44, message2.DefaultUint64);
Assert.False(message2.HasDefaultBool);
Assert.False(message2.HasDefaultBytes);
Assert.False(message2.HasDefaultCord);
Assert.False(message2.HasDefaultDouble);
Assert.False(message2.HasDefaultFixed32);
Assert.False(message2.HasDefaultFixed64);
Assert.False(message2.HasDefaultFloat);
Assert.False(message2.HasDefaultForeignEnum);
Assert.False(message2.HasDefaultImportEnum);
Assert.False(message2.HasDefaultInt32);
Assert.False(message2.HasDefaultInt64);
Assert.False(message2.HasDefaultNestedEnum);
Assert.False(message2.HasDefaultSfixed32);
Assert.False(message2.HasDefaultSfixed64);
Assert.False(message2.HasDefaultSint32);
Assert.False(message2.HasDefaultSint64);
Assert.False(message2.HasDefaultString);
Assert.False(message2.HasDefaultStringPiece);
Assert.False(message2.HasDefaultUint32);
Assert.False(message2.HasDefaultUint64);
}
[Test]
......@@ -123,6 +168,107 @@ namespace Google.Protobuf
Assert.Throws<ArgumentNullException>(() => message.OneofBytes = null);
}
[Test]
public void FieldPresence()
{
var message = new Proto2.TestAllTypes();
Assert.False(message.HasOptionalBool);
Assert.False(message.OptionalBool);
message.OptionalBool = true;
Assert.True(message.HasOptionalBool);
Assert.True(message.OptionalBool);
message.OptionalBool = false;
Assert.True(message.HasOptionalBool);
Assert.False(message.OptionalBool);
message.ClearOptionalBool();
Assert.False(message.HasOptionalBool);
Assert.False(message.OptionalBool);
Assert.False(message.HasDefaultBool);
Assert.True(message.DefaultBool);
message.DefaultBool = false;
Assert.True(message.HasDefaultBool);
Assert.False(message.DefaultBool);
message.DefaultBool = true;
Assert.True(message.HasDefaultBool);
Assert.True(message.DefaultBool);
message.ClearDefaultBool();
Assert.False(message.HasDefaultBool);
Assert.True(message.DefaultBool);
}
[Test]
public void RequiredFields()
{
var message = new Proto2.TestRequired();
Assert.False(message.IsInitialized());
message.A = 1;
message.B = 2;
message.C = 3;
Assert.True(message.IsInitialized());
}
[Test]
public void RequiredFieldsInExtensions()
{
var message = new Proto2.TestAllExtensions();
Assert.True(message.IsInitialized());
message.SetExtension(Proto2.TestRequired.Extensions.Single, new Proto2.TestRequired());
Assert.False(message.IsInitialized());
var extensionMessage = message.GetExtension(Proto2.TestRequired.Extensions.Single);
extensionMessage.A = 1;
extensionMessage.B = 2;
extensionMessage.C = 3;
Assert.True(message.IsInitialized());
message.RegisterExtension(Proto2.TestRequired.Extensions.Multi);
Assert.True(message.IsInitialized());
message.GetExtension(Proto2.TestRequired.Extensions.Multi).Add(new Proto2.TestRequired());
Assert.False(message.IsInitialized());
extensionMessage = message.GetExtension(Proto2.TestRequired.Extensions.Multi)[0];
extensionMessage.A = 1;
extensionMessage.B = 2;
extensionMessage.C = 3;
Assert.True(message.IsInitialized());
}
[Test]
public void RequiredFieldInNestedMessageMapValue()
{
var message = new Proto2.TestRequiredMap();
message.Foo.Add(0, new Proto2.TestRequiredMap.Types.NestedMessage());
Assert.False(message.IsInitialized());
message.Foo[0].RequiredInt32 = 12;
Assert.True(message.IsInitialized());
}
[Test]
public void RoundTrip_Empty()
{
......
......@@ -32,6 +32,7 @@
using System;
using Google.Protobuf.TestProtos;
using Proto2 = Google.Protobuf.TestProtos.Proto2;
namespace Google.Protobuf
{
......@@ -95,5 +96,56 @@ namespace Google.Protobuf
OneofString = "Oneof string"
};
}
public static Proto2.TestAllTypes CreateFullTestAllTypesProto2()
{
return new Proto2.TestAllTypes
{
OptionalBool = true,
OptionalBytes = ByteString.CopyFrom(1, 2, 3, 4),
OptionalDouble = 23.5,
OptionalFixed32 = 23,
OptionalFixed64 = 1234567890123,
OptionalFloat = 12.25f,
OptionalForeignEnum = Proto2.ForeignEnum.ForeignBar,
OptionalForeignMessage = new Proto2.ForeignMessage { C = 10 },
OptionalImportEnum = Proto2.ImportEnum.ImportBaz,
OptionalImportMessage = new Proto2.ImportMessage { D = 20 },
OptionalInt32 = 100,
OptionalInt64 = 3210987654321,
OptionalNestedEnum = Proto2.TestAllTypes.Types.NestedEnum.Foo,
OptionalNestedMessage = new Proto2.TestAllTypes.Types.NestedMessage { Bb = 35 },
OptionalPublicImportMessage = new Proto2.PublicImportMessage { E = 54 },
OptionalSfixed32 = -123,
OptionalSfixed64 = -12345678901234,
OptionalSint32 = -456,
OptionalSint64 = -12345678901235,
OptionalString = "test",
OptionalUint32 = UInt32.MaxValue,
OptionalUint64 = UInt64.MaxValue,
RepeatedBool = { true, false },
RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6), ByteString.CopyFrom(new byte[1000]) },
RepeatedDouble = { -12.25, 23.5 },
RepeatedFixed32 = { UInt32.MaxValue, 23 },
RepeatedFixed64 = { UInt64.MaxValue, 1234567890123 },
RepeatedFloat = { 100f, 12.25f },
RepeatedForeignEnum = { Proto2.ForeignEnum.ForeignFoo, Proto2.ForeignEnum.ForeignBar },
RepeatedForeignMessage = { new Proto2.ForeignMessage(), new Proto2.ForeignMessage { C = 10 } },
RepeatedImportEnum = { Proto2.ImportEnum.ImportBaz, Proto2.ImportEnum.ImportFoo },
RepeatedImportMessage = { new Proto2.ImportMessage { D = 20 }, new Proto2.ImportMessage { D = 25 } },
RepeatedInt32 = { 100, 200 },
RepeatedInt64 = { 3210987654321, Int64.MaxValue },
RepeatedNestedEnum = { Proto2.TestAllTypes.Types.NestedEnum.Foo, Proto2.TestAllTypes.Types.NestedEnum.Neg },
RepeatedNestedMessage = { new Proto2.TestAllTypes.Types.NestedMessage { Bb = 35 }, new Proto2.TestAllTypes.Types.NestedMessage { Bb = 10 } },
RepeatedSfixed32 = { -123, 123 },
RepeatedSfixed64 = { -12345678901234, 12345678901234 },
RepeatedSint32 = { -456, 100 },
RepeatedSint64 = { -12345678901235, 123 },
RepeatedString = { "foo", "bar" },
RepeatedUint32 = { UInt32.MaxValue, UInt32.MinValue },
RepeatedUint64 = { UInt64.MaxValue, UInt32.MinValue },
OneofString = "Oneof string"
};
}
}
}
\ No newline at end of file
......@@ -281,386 +281,391 @@ namespace Google.Protobuf.TestProtos.Proto2 {
"Cgdmb29faW50GAEgASgFSAASFAoKZm9vX3N0cmluZxgCIAEoCUgAElAKC2Zv",
"b19tZXNzYWdlGAMgASgLMjkucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RSZXF1aXJlZE9uZW9mLk5lc3RlZE1lc3NhZ2VIABooCg1OZXN0ZWRNZXNz",
"YWdlEhcKD3JlcXVpcmVkX2RvdWJsZRgBIAIoAUIFCgNmb28isQMKD1Rlc3RQ",
"YWNrZWRUeXBlcxIYCgxwYWNrZWRfaW50MzIYWiADKAVCAhABEhgKDHBhY2tl",
"ZF9pbnQ2NBhbIAMoA0ICEAESGQoNcGFja2VkX3VpbnQzMhhcIAMoDUICEAES",
"GQoNcGFja2VkX3VpbnQ2NBhdIAMoBEICEAESGQoNcGFja2VkX3NpbnQzMhhe",
"IAMoEUICEAESGQoNcGFja2VkX3NpbnQ2NBhfIAMoEkICEAESGgoOcGFja2Vk",
"X2ZpeGVkMzIYYCADKAdCAhABEhoKDnBhY2tlZF9maXhlZDY0GGEgAygGQgIQ",
"ARIbCg9wYWNrZWRfc2ZpeGVkMzIYYiADKA9CAhABEhsKD3BhY2tlZF9zZml4",
"ZWQ2NBhjIAMoEEICEAESGAoMcGFja2VkX2Zsb2F0GGQgAygCQgIQARIZCg1w",
"YWNrZWRfZG91YmxlGGUgAygBQgIQARIXCgtwYWNrZWRfYm9vbBhmIAMoCEIC",
"EAESPgoLcGFja2VkX2VudW0YZyADKA4yJS5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuRm9yZWlnbkVudW1CAhABIs8DChFUZXN0VW5wYWNrZWRUeXBlcxIa",
"Cg51bnBhY2tlZF9pbnQzMhhaIAMoBUICEAASGgoOdW5wYWNrZWRfaW50NjQY",
"WyADKANCAhAAEhsKD3VucGFja2VkX3VpbnQzMhhcIAMoDUICEAASGwoPdW5w",
"YWNrZWRfdWludDY0GF0gAygEQgIQABIbCg91bnBhY2tlZF9zaW50MzIYXiAD",
"KBFCAhAAEhsKD3VucGFja2VkX3NpbnQ2NBhfIAMoEkICEAASHAoQdW5wYWNr",
"ZWRfZml4ZWQzMhhgIAMoB0ICEAASHAoQdW5wYWNrZWRfZml4ZWQ2NBhhIAMo",
"BkICEAASHQoRdW5wYWNrZWRfc2ZpeGVkMzIYYiADKA9CAhAAEh0KEXVucGFj",
"a2VkX3NmaXhlZDY0GGMgAygQQgIQABIaCg51bnBhY2tlZF9mbG9hdBhkIAMo",
"AkICEAASGwoPdW5wYWNrZWRfZG91YmxlGGUgAygBQgIQABIZCg11bnBhY2tl",
"ZF9ib29sGGYgAygIQgIQABJACg11bnBhY2tlZF9lbnVtGGcgAygOMiUucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLkZvcmVpZ25FbnVtQgIQACIgChRUZXN0",
"UGFja2VkRXh0ZW5zaW9ucyoICAEQgICAgAIiIgoWVGVzdFVucGFja2VkRXh0",
"ZW5zaW9ucyoICAEQgICAgAIitQQKFVRlc3REeW5hbWljRXh0ZW5zaW9ucxIZ",
"ChBzY2FsYXJfZXh0ZW5zaW9uGNAPIAEoBxI+Cg5lbnVtX2V4dGVuc2lvbhjR",
"DyABKA4yJS5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuRm9yZWlnbkVudW0S",
"YAoWZHluYW1pY19lbnVtX2V4dGVuc2lvbhjSDyABKA4yPy5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdER5bmFtaWNFeHRlbnNpb25zLkR5bmFtaWNF",
"bnVtVHlwZRJEChFtZXNzYWdlX2V4dGVuc2lvbhjTDyABKAsyKC5wcm90b2J1",
"Zl91bml0dGVzdF9wcm90bzIuRm9yZWlnbk1lc3NhZ2USZgoZZHluYW1pY19t",
"ZXNzYWdlX2V4dGVuc2lvbhjUDyABKAsyQi5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuVGVzdER5bmFtaWNFeHRlbnNpb25zLkR5bmFtaWNNZXNzYWdlVHlw",
"ZRIbChJyZXBlYXRlZF9leHRlbnNpb24Y1Q8gAygJEh0KEHBhY2tlZF9leHRl",
"bnNpb24Y1g8gAygRQgIQARosChJEeW5hbWljTWVzc2FnZVR5cGUSFgoNZHlu",
"YW1pY19maWVsZBi0ECABKAUiRwoPRHluYW1pY0VudW1UeXBlEhAKC0RZTkFN",
"SUNfRk9PEJgREhAKC0RZTkFNSUNfQkFSEJkREhAKC0RZTkFNSUNfQkFaEJoR",
"IsABCiNUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcxIYChBy",
"ZXBlYXRlZF9maXhlZDMyGAwgAygHEhYKDnJlcGVhdGVkX2ludDMyGA0gAygF",
"EhkKEHJlcGVhdGVkX2ZpeGVkNjQY/g8gAygGEhcKDnJlcGVhdGVkX2ludDY0",
"GP8PIAMoAxIYCg5yZXBlYXRlZF9mbG9hdBj+/w8gAygCEhkKD3JlcGVhdGVk",
"X3VpbnQ2NBj//w8gAygEIoMLChBUZXN0UGFyc2luZ01lcmdlEkIKEnJlcXVp",
"cmVkX2FsbF90eXBlcxgBIAIoCzImLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsVHlwZXMSQgoSb3B0aW9uYWxfYWxsX3R5cGVzGAIgASgLMiYu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlcxJCChJyZXBl",
"YXRlZF9hbGxfdHlwZXMYAyADKAsyJi5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuVGVzdEFsbFR5cGVzEk8KDW9wdGlvbmFsZ3JvdXAYCiABKAoyOC5wcm90",
"b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFBhcnNpbmdNZXJnZS5PcHRpb25h",
"bEdyb3VwEk8KDXJlcGVhdGVkZ3JvdXAYFCADKAoyOC5wcm90b2J1Zl91bml0",
"dGVzdF9wcm90bzIuVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEdyb3VwGukE",
"ChdSZXBlYXRlZEZpZWxkc0dlbmVyYXRvchI2CgZmaWVsZDEYASADKAsyJi5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzEjYKBmZpZWxk",
"MhgCIAMoCzImLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlw",
"ZXMSNgoGZmllbGQzGAMgAygLMiYucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8y",
"LlRlc3RBbGxUeXBlcxJZCgZncm91cDEYCiADKAoySS5wcm90b2J1Zl91bml0",
"dGVzdF9wcm90bzIuVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dl",
"bmVyYXRvci5Hcm91cDESWQoGZ3JvdXAyGBQgAygKMkkucHJvdG9idWZfdW5p",
"dHRlc3RfcHJvdG8yLlRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNH",
"ZW5lcmF0b3IuR3JvdXAyEjUKBGV4dDEY6AcgAygLMiYucHJvdG9idWZfdW5p",
"dHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlcxI1CgRleHQyGOkHIAMoCzImLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlwZXMaQAoGR3JvdXAx",
"EjYKBmZpZWxkMRgLIAEoCzImLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5U",
"ZXN0QWxsVHlwZXMaQAoGR3JvdXAyEjYKBmZpZWxkMRgVIAEoCzImLnByb3Rv",
"YnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlwZXMaWQoNT3B0aW9uYWxH",
"cm91cBJIChhvcHRpb25hbF9ncm91cF9hbGxfdHlwZXMYCyABKAsyJi5wcm90",
"b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzGlkKDVJlcGVhdGVk",
"R3JvdXASSAoYcmVwZWF0ZWRfZ3JvdXBfYWxsX3R5cGVzGBUgASgLMiYucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlcyoJCOgHEICAgIAC",
"MmkKDG9wdGlvbmFsX2V4dBIqLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5U",
"ZXN0UGFyc2luZ01lcmdlGOgHIAEoCzImLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5UZXN0QWxsVHlwZXMyaQoMcmVwZWF0ZWRfZXh0EioucHJvdG9idWZf",
"dW5pdHRlc3RfcHJvdG8yLlRlc3RQYXJzaW5nTWVyZ2UY6QcgAygLMiYucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlcyJEChtUZXN0Q29t",
"bWVudEluamVjdGlvbk1lc3NhZ2USJQoBYRgBIAEoCToaKi8gPC0gTmVpdGhl",
"ciBzaG91bGQgdGhpcy4iDAoKRm9vUmVxdWVzdCINCgtGb29SZXNwb25zZSIS",
"ChBGb29DbGllbnRNZXNzYWdlIhIKEEZvb1NlcnZlck1lc3NhZ2UiDAoKQmFy",
"UmVxdWVzdCINCgtCYXJSZXNwb25zZSKSAQoMVGVzdEpzb25OYW1lEhMKC2Zp",
"ZWxkX25hbWUxGAEgASgFEhIKCmZpZWxkTmFtZTIYAiABKAUSEgoKRmllbGRO",
"YW1lMxgDIAEoBRIUCgxfZmllbGRfbmFtZTQYBCABKAUSEwoLRklFTERfTkFN",
"RTUYBSABKAUSGgoLZmllbGRfbmFtZTYYBiABKAVSBUB0eXBlIqAGChRUZXN0",
"SHVnZUZpZWxkTnVtYmVycxIaCg5vcHRpb25hbF9pbnQzMhjw+P//ASABKAUS",
"FAoIZml4ZWRfMzIY8fj//wEgASgFEh4KDnJlcGVhdGVkX2ludDMyGPL4//8B",
"IAMoBUICEAASHAoMcGFja2VkX2ludDMyGPP4//8BIAMoBUICEAESQAoNb3B0",
"aW9uYWxfZW51bRj0+P//ASABKA4yJS5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuRm9yZWlnbkVudW0SGwoPb3B0aW9uYWxfc3RyaW5nGPX4//8BIAEoCRIa",
"Cg5vcHRpb25hbF9ieXRlcxj2+P//ASABKAwSRgoQb3B0aW9uYWxfbWVzc2Fn",
"ZRj3+P//ASABKAsyKC5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuRm9yZWln",
"bk1lc3NhZ2USVwoNb3B0aW9uYWxncm91cBj4+P//ASABKAoyPC5wcm90b2J1",
"Zl91bml0dGVzdF9wcm90bzIuVGVzdEh1Z2VGaWVsZE51bWJlcnMuT3B0aW9u",
"YWxHcm91cBJiChFzdHJpbmdfc3RyaW5nX21hcBj6+P//ASADKAsyQy5wcm90",
"b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEh1Z2VGaWVsZE51bWJlcnMuU3Ry",
"aW5nU3RyaW5nTWFwRW50cnkSGgoMb25lb2ZfdWludDMyGPv4//8BIAEoDUgA",
"EkoKFG9uZW9mX3Rlc3RfYWxsX3R5cGVzGPz4//8BIAEoCzImLnByb3RvYnVm",
"X3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlwZXNIABIaCgxvbmVvZl9zdHJp",
"bmcY/fj//wEgASgJSAASGQoLb25lb2ZfYnl0ZXMY/vj//wEgASgMSAAaJAoN",
"T3B0aW9uYWxHcm91cBITCgdncm91cF9hGPn4//8BIAEoBRo2ChRTdHJpbmdT",
"dHJpbmdNYXBFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgB",
"KgwI4Kr//wEQ8Pj//wFCDQoLb25lb2ZfZmllbGQisQEKGFRlc3RFeHRlbnNp",
"b25JbnNpZGVUYWJsZRIOCgZmaWVsZDEYASABKAUSDgoGZmllbGQyGAIgASgF",
"Eg4KBmZpZWxkMxgDIAEoBRIOCgZmaWVsZDQYBCABKAUSDgoGZmllbGQ2GAYg",
"ASgFEg4KBmZpZWxkNxgHIAEoBRIOCgZmaWVsZDgYCCABKAUSDgoGZmllbGQ5",
"GAkgASgFEg8KB2ZpZWxkMTAYCiABKAUqBAgFEAYqQAoLRm9yZWlnbkVudW0S",
"DwoLRk9SRUlHTl9GT08QBBIPCgtGT1JFSUdOX0JBUhAFEg8KC0ZPUkVJR05f",
"QkFaEAYqSwoUVGVzdEVudW1XaXRoRHVwVmFsdWUSCAoERk9PMRABEggKBEJB",
"UjEQAhIHCgNCQVoQAxIICgRGT08yEAESCAoEQkFSMhACGgIQASqJAQoOVGVz",
"dFNwYXJzZUVudW0SDAoIU1BBUlNFX0EQexIOCghTUEFSU0VfQhCm5wMSDwoI",
"U1BBUlNFX0MQsrGABhIVCghTUEFSU0VfRBDx//////////8BEhUKCFNQQVJT",
"RV9FELTe/P///////wESDAoIU1BBUlNFX0YQABIMCghTUEFSU0VfRxACKosP",
"Cg1WZXJ5TGFyZ2VFbnVtEhYKEkVOVU1fTEFCRUxfREVGQVVMVBAAEhAKDEVO",
"VU1fTEFCRUxfMRABEhAKDEVOVU1fTEFCRUxfMhACEhAKDEVOVU1fTEFCRUxf",
"MxADEhAKDEVOVU1fTEFCRUxfNBAEEhAKDEVOVU1fTEFCRUxfNRAFEhAKDEVO",
"VU1fTEFCRUxfNhAGEhAKDEVOVU1fTEFCRUxfNxAHEhAKDEVOVU1fTEFCRUxf",
"OBAIEhAKDEVOVU1fTEFCRUxfORAJEhEKDUVOVU1fTEFCRUxfMTAQChIRCg1F",
"TlVNX0xBQkVMXzExEAsSEQoNRU5VTV9MQUJFTF8xMhAMEhEKDUVOVU1fTEFC",
"RUxfMTMQDRIRCg1FTlVNX0xBQkVMXzE0EA4SEQoNRU5VTV9MQUJFTF8xNRAP",
"EhEKDUVOVU1fTEFCRUxfMTYQEBIRCg1FTlVNX0xBQkVMXzE3EBESEQoNRU5V",
"TV9MQUJFTF8xOBASEhEKDUVOVU1fTEFCRUxfMTkQExIRCg1FTlVNX0xBQkVM",
"XzIwEBQSEQoNRU5VTV9MQUJFTF8yMRAVEhEKDUVOVU1fTEFCRUxfMjIQFhIR",
"Cg1FTlVNX0xBQkVMXzIzEBcSEQoNRU5VTV9MQUJFTF8yNBAYEhEKDUVOVU1f",
"TEFCRUxfMjUQGRIRCg1FTlVNX0xBQkVMXzI2EBoSEQoNRU5VTV9MQUJFTF8y",
"NxAbEhEKDUVOVU1fTEFCRUxfMjgQHBIRCg1FTlVNX0xBQkVMXzI5EB0SEQoN",
"RU5VTV9MQUJFTF8zMBAeEhEKDUVOVU1fTEFCRUxfMzEQHxIRCg1FTlVNX0xB",
"QkVMXzMyECASEQoNRU5VTV9MQUJFTF8zMxAhEhEKDUVOVU1fTEFCRUxfMzQQ",
"IhIRCg1FTlVNX0xBQkVMXzM1ECMSEQoNRU5VTV9MQUJFTF8zNhAkEhEKDUVO",
"VU1fTEFCRUxfMzcQJRIRCg1FTlVNX0xBQkVMXzM4ECYSEQoNRU5VTV9MQUJF",
"TF8zORAnEhEKDUVOVU1fTEFCRUxfNDAQKBIRCg1FTlVNX0xBQkVMXzQxECkS",
"EQoNRU5VTV9MQUJFTF80MhAqEhEKDUVOVU1fTEFCRUxfNDMQKxIRCg1FTlVN",
"X0xBQkVMXzQ0ECwSEQoNRU5VTV9MQUJFTF80NRAtEhEKDUVOVU1fTEFCRUxf",
"NDYQLhIRCg1FTlVNX0xBQkVMXzQ3EC8SEQoNRU5VTV9MQUJFTF80OBAwEhEK",
"DUVOVU1fTEFCRUxfNDkQMRIRCg1FTlVNX0xBQkVMXzUwEDISEQoNRU5VTV9M",
"QUJFTF81MRAzEhEKDUVOVU1fTEFCRUxfNTIQNBIRCg1FTlVNX0xBQkVMXzUz",
"EDUSEQoNRU5VTV9MQUJFTF81NBA2EhEKDUVOVU1fTEFCRUxfNTUQNxIRCg1F",
"TlVNX0xBQkVMXzU2EDgSEQoNRU5VTV9MQUJFTF81NxA5EhEKDUVOVU1fTEFC",
"RUxfNTgQOhIRCg1FTlVNX0xBQkVMXzU5EDsSEQoNRU5VTV9MQUJFTF82MBA8",
"EhEKDUVOVU1fTEFCRUxfNjEQPRIRCg1FTlVNX0xBQkVMXzYyED4SEQoNRU5V",
"TV9MQUJFTF82MxA/EhEKDUVOVU1fTEFCRUxfNjQQQBIRCg1FTlVNX0xBQkVM",
"XzY1EEESEQoNRU5VTV9MQUJFTF82NhBCEhEKDUVOVU1fTEFCRUxfNjcQQxIR",
"Cg1FTlVNX0xBQkVMXzY4EEQSEQoNRU5VTV9MQUJFTF82ORBFEhEKDUVOVU1f",
"TEFCRUxfNzAQRhIRCg1FTlVNX0xBQkVMXzcxEEcSEQoNRU5VTV9MQUJFTF83",
"MhBIEhEKDUVOVU1fTEFCRUxfNzMQSRIRCg1FTlVNX0xBQkVMXzc0EEoSEQoN",
"RU5VTV9MQUJFTF83NRBLEhEKDUVOVU1fTEFCRUxfNzYQTBIRCg1FTlVNX0xB",
"QkVMXzc3EE0SEQoNRU5VTV9MQUJFTF83OBBOEhEKDUVOVU1fTEFCRUxfNzkQ",
"TxIRCg1FTlVNX0xBQkVMXzgwEFASEQoNRU5VTV9MQUJFTF84MRBREhEKDUVO",
"VU1fTEFCRUxfODIQUhIRCg1FTlVNX0xBQkVMXzgzEFMSEQoNRU5VTV9MQUJF",
"TF84NBBUEhEKDUVOVU1fTEFCRUxfODUQVRIRCg1FTlVNX0xBQkVMXzg2EFYS",
"EQoNRU5VTV9MQUJFTF84NxBXEhEKDUVOVU1fTEFCRUxfODgQWBIRCg1FTlVN",
"X0xBQkVMXzg5EFkSEQoNRU5VTV9MQUJFTF85MBBaEhEKDUVOVU1fTEFCRUxf",
"OTEQWxIRCg1FTlVNX0xBQkVMXzkyEFwSEQoNRU5VTV9MQUJFTF85MxBdEhEK",
"DUVOVU1fTEFCRUxfOTQQXhIRCg1FTlVNX0xBQkVMXzk1EF8SEQoNRU5VTV9M",
"QUJFTF85NhBgEhEKDUVOVU1fTEFCRUxfOTcQYRIRCg1FTlVNX0xBQkVMXzk4",
"EGISEQoNRU5VTV9MQUJFTF85ORBjEhIKDkVOVU1fTEFCRUxfMTAwEGQytQEK",
"C1Rlc3RTZXJ2aWNlElIKA0ZvbxIkLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5Gb29SZXF1ZXN0GiUucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLkZvb1Jl",
"c3BvbnNlElIKA0JhchIkLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5CYXJS",
"ZXF1ZXN0GiUucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLkJhclJlc3BvbnNl",
"Ok0KGG9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0",
"ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgBIAEoBTpNChhvcHRpb25h",
"bF9pbnQ2NF9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYAiABKAM6TgoZb3B0aW9uYWxfdWludDMyX2V4",
"dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0",
"ZW5zaW9ucxgDIAEoDTpOChlvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uEisu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGAQg",
"ASgEOk4KGW9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24SKy5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYBSABKBE6TgoZb3B0",
"aW9uYWxfc2ludDY0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgGIAEoEjpPChpvcHRpb25hbF9maXhl",
"ZDMyX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"QWxsRXh0ZW5zaW9ucxgHIAEoBzpPChpvcHRpb25hbF9maXhlZDY0X2V4dGVu",
"c2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5z",
"aW9ucxgIIAEoBjpQChtvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24SKy5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYCSAB",
"KA86UAobb3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uEisucHJvdG9idWZf",
"dW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGAogASgQOk0KGG9w",
"dGlvbmFsX2Zsb2F0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgLIAEoAjpOChlvcHRpb25hbF9kb3Vi",
"bGVfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RB",
"bGxFeHRlbnNpb25zGAwgASgBOkwKF29wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9u",
"EisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25z",
"GA0gASgIOk4KGW9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24SKy5wcm90b2J1",
"Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYDiABKAk6TQoY",
"b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3Rf",
"cHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGA8gASgMOn8KF29wdGlvbmFsZ3Jv",
"dXBfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RB",
"bGxFeHRlbnNpb25zGBAgASgKMjEucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8y",
"Lk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uOowBCiFvcHRpb25hbF9uZXN0ZWRf",
"bWVzc2FnZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYEiABKAsyNC5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U6gQEKIm9wdGlvbmFs",
"X2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVz",
"dF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYEyABKAsyKC5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuRm9yZWlnbk1lc3NhZ2U6hgEKIW9wdGlvbmFsX2lt",
"cG9ydF9tZXNzYWdlX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgUIAEoCzIuLnByb3RvYnVmX3VuaXR0",
"ZXN0X2ltcG9ydF9wcm90bzIuSW1wb3J0TWVzc2FnZTqGAQoeb3B0aW9uYWxf",
"bmVzdGVkX2VudW1fZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJv",
"dG8yLlRlc3RBbGxFeHRlbnNpb25zGBUgASgOMjEucHJvdG9idWZfdW5pdHRl",
"c3RfcHJvdG8yLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtOnsKH29wdGlvbmFs",
"X2ZvcmVpZ25fZW51bV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYFiABKA4yJS5wcm90b2J1Zl91bml0",
"dGVzdF9wcm90bzIuRm9yZWlnbkVudW06gAEKHm9wdGlvbmFsX2ltcG9ydF9l",
"bnVtX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"QWxsRXh0ZW5zaW9ucxgXIAEoDjIrLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9y",
"dF9wcm90bzIuSW1wb3J0RW51bTpYCh9vcHRpb25hbF9zdHJpbmdfcGllY2Vf",
"YWdlEhcKD3JlcXVpcmVkX2RvdWJsZRgBIAIoAUIFCgNmb28i4AEKD1Rlc3RS",
"ZXF1aXJlZE1hcBI/CgNmb28YASADKAsyMi5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuVGVzdFJlcXVpcmVkTWFwLkZvb0VudHJ5GmMKCEZvb0VudHJ5EgsK",
"A2tleRgBIAEoBRJGCgV2YWx1ZRgCIAEoCzI3LnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0UmVxdWlyZWRNYXAuTmVzdGVkTWVzc2FnZToCOAEaJwoN",
"TmVzdGVkTWVzc2FnZRIWCg5yZXF1aXJlZF9pbnQzMhgBIAIoBSKxAwoPVGVz",
"dFBhY2tlZFR5cGVzEhgKDHBhY2tlZF9pbnQzMhhaIAMoBUICEAESGAoMcGFj",
"a2VkX2ludDY0GFsgAygDQgIQARIZCg1wYWNrZWRfdWludDMyGFwgAygNQgIQ",
"ARIZCg1wYWNrZWRfdWludDY0GF0gAygEQgIQARIZCg1wYWNrZWRfc2ludDMy",
"GF4gAygRQgIQARIZCg1wYWNrZWRfc2ludDY0GF8gAygSQgIQARIaCg5wYWNr",
"ZWRfZml4ZWQzMhhgIAMoB0ICEAESGgoOcGFja2VkX2ZpeGVkNjQYYSADKAZC",
"AhABEhsKD3BhY2tlZF9zZml4ZWQzMhhiIAMoD0ICEAESGwoPcGFja2VkX3Nm",
"aXhlZDY0GGMgAygQQgIQARIYCgxwYWNrZWRfZmxvYXQYZCADKAJCAhABEhkK",
"DXBhY2tlZF9kb3VibGUYZSADKAFCAhABEhcKC3BhY2tlZF9ib29sGGYgAygI",
"QgIQARI+CgtwYWNrZWRfZW51bRhnIAMoDjIlLnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5Gb3JlaWduRW51bUICEAEizwMKEVRlc3RVbnBhY2tlZFR5cGVz",
"EhoKDnVucGFja2VkX2ludDMyGFogAygFQgIQABIaCg51bnBhY2tlZF9pbnQ2",
"NBhbIAMoA0ICEAASGwoPdW5wYWNrZWRfdWludDMyGFwgAygNQgIQABIbCg91",
"bnBhY2tlZF91aW50NjQYXSADKARCAhAAEhsKD3VucGFja2VkX3NpbnQzMhhe",
"IAMoEUICEAASGwoPdW5wYWNrZWRfc2ludDY0GF8gAygSQgIQABIcChB1bnBh",
"Y2tlZF9maXhlZDMyGGAgAygHQgIQABIcChB1bnBhY2tlZF9maXhlZDY0GGEg",
"AygGQgIQABIdChF1bnBhY2tlZF9zZml4ZWQzMhhiIAMoD0ICEAASHQoRdW5w",
"YWNrZWRfc2ZpeGVkNjQYYyADKBBCAhAAEhoKDnVucGFja2VkX2Zsb2F0GGQg",
"AygCQgIQABIbCg91bnBhY2tlZF9kb3VibGUYZSADKAFCAhAAEhkKDXVucGFj",
"a2VkX2Jvb2wYZiADKAhCAhAAEkAKDXVucGFja2VkX2VudW0YZyADKA4yJS5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuRm9yZWlnbkVudW1CAhAAIiAKFFRl",
"c3RQYWNrZWRFeHRlbnNpb25zKggIARCAgICAAiIiChZUZXN0VW5wYWNrZWRF",
"eHRlbnNpb25zKggIARCAgICAAiK1BAoVVGVzdER5bmFtaWNFeHRlbnNpb25z",
"EhkKEHNjYWxhcl9leHRlbnNpb24Y0A8gASgHEj4KDmVudW1fZXh0ZW5zaW9u",
"GNEPIAEoDjIlLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5Gb3JlaWduRW51",
"bRJgChZkeW5hbWljX2VudW1fZXh0ZW5zaW9uGNIPIAEoDjI/LnByb3RvYnVm",
"X3VuaXR0ZXN0X3Byb3RvMi5UZXN0RHluYW1pY0V4dGVuc2lvbnMuRHluYW1p",
"Y0VudW1UeXBlEkQKEW1lc3NhZ2VfZXh0ZW5zaW9uGNMPIAEoCzIoLnByb3Rv",
"YnVmX3VuaXR0ZXN0X3Byb3RvMi5Gb3JlaWduTWVzc2FnZRJmChlkeW5hbWlj",
"X21lc3NhZ2VfZXh0ZW5zaW9uGNQPIAEoCzJCLnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0RHluYW1pY0V4dGVuc2lvbnMuRHluYW1pY01lc3NhZ2VU",
"eXBlEhsKEnJlcGVhdGVkX2V4dGVuc2lvbhjVDyADKAkSHQoQcGFja2VkX2V4",
"dGVuc2lvbhjWDyADKBFCAhABGiwKEkR5bmFtaWNNZXNzYWdlVHlwZRIWCg1k",
"eW5hbWljX2ZpZWxkGLQQIAEoBSJHCg9EeW5hbWljRW51bVR5cGUSEAoLRFlO",
"QU1JQ19GT08QmBESEAoLRFlOQU1JQ19CQVIQmRESEAoLRFlOQU1JQ19CQVoQ",
"mhEiwAEKI1Rlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzEhgK",
"EHJlcGVhdGVkX2ZpeGVkMzIYDCADKAcSFgoOcmVwZWF0ZWRfaW50MzIYDSAD",
"KAUSGQoQcmVwZWF0ZWRfZml4ZWQ2NBj+DyADKAYSFwoOcmVwZWF0ZWRfaW50",
"NjQY/w8gAygDEhgKDnJlcGVhdGVkX2Zsb2F0GP7/DyADKAISGQoPcmVwZWF0",
"ZWRfdWludDY0GP//DyADKAQigwsKEFRlc3RQYXJzaW5nTWVyZ2USQgoScmVx",
"dWlyZWRfYWxsX3R5cGVzGAEgAigLMiYucHJvdG9idWZfdW5pdHRlc3RfcHJv",
"dG8yLlRlc3RBbGxUeXBlcxJCChJvcHRpb25hbF9hbGxfdHlwZXMYAiABKAsy",
"Ji5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzEkIKEnJl",
"cGVhdGVkX2FsbF90eXBlcxgDIAMoCzImLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5UZXN0QWxsVHlwZXMSTwoNb3B0aW9uYWxncm91cBgKIAEoCjI4LnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0UGFyc2luZ01lcmdlLk9wdGlv",
"bmFsR3JvdXASTwoNcmVwZWF0ZWRncm91cBgUIAMoCjI4LnByb3RvYnVmX3Vu",
"aXR0ZXN0X3Byb3RvMi5UZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkR3JvdXAa",
"6QQKF1JlcGVhdGVkRmllbGRzR2VuZXJhdG9yEjYKBmZpZWxkMRgBIAMoCzIm",
"LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlwZXMSNgoGZmll",
"bGQyGAIgAygLMiYucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxU",
"eXBlcxI2CgZmaWVsZDMYAyADKAsyJi5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuVGVzdEFsbFR5cGVzElkKBmdyb3VwMRgKIAMoCjJJLnByb3RvYnVmX3Vu",
"aXR0ZXN0X3Byb3RvMi5UZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRz",
"R2VuZXJhdG9yLkdyb3VwMRJZCgZncm91cDIYFCADKAoySS5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxk",
"c0dlbmVyYXRvci5Hcm91cDISNQoEZXh0MRjoByADKAsyJi5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzEjUKBGV4dDIY6QcgAygLMiYu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlcxpACgZHcm91",
"cDESNgoGZmllbGQxGAsgASgLMiYucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8y",
"LlRlc3RBbGxUeXBlcxpACgZHcm91cDISNgoGZmllbGQxGBUgASgLMiYucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlcxpZCg1PcHRpb25h",
"bEdyb3VwEkgKGG9wdGlvbmFsX2dyb3VwX2FsbF90eXBlcxgLIAEoCzImLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlwZXMaWQoNUmVwZWF0",
"ZWRHcm91cBJIChhyZXBlYXRlZF9ncm91cF9hbGxfdHlwZXMYFSABKAsyJi5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzKgkI6AcQgICA",
"gAIyaQoMb3B0aW9uYWxfZXh0EioucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8y",
"LlRlc3RQYXJzaW5nTWVyZ2UY6AcgASgLMiYucHJvdG9idWZfdW5pdHRlc3Rf",
"cHJvdG8yLlRlc3RBbGxUeXBlczJpCgxyZXBlYXRlZF9leHQSKi5wcm90b2J1",
"Zl91bml0dGVzdF9wcm90bzIuVGVzdFBhcnNpbmdNZXJnZRjpByADKAsyJi5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzIkQKG1Rlc3RD",
"b21tZW50SW5qZWN0aW9uTWVzc2FnZRIlCgFhGAEgASgJOhoqLyA8LSBOZWl0",
"aGVyIHNob3VsZCB0aGlzLiIMCgpGb29SZXF1ZXN0Ig0KC0Zvb1Jlc3BvbnNl",
"IhIKEEZvb0NsaWVudE1lc3NhZ2UiEgoQRm9vU2VydmVyTWVzc2FnZSIMCgpC",
"YXJSZXF1ZXN0Ig0KC0JhclJlc3BvbnNlIpIBCgxUZXN0SnNvbk5hbWUSEwoL",
"ZmllbGRfbmFtZTEYASABKAUSEgoKZmllbGROYW1lMhgCIAEoBRISCgpGaWVs",
"ZE5hbWUzGAMgASgFEhQKDF9maWVsZF9uYW1lNBgEIAEoBRITCgtGSUVMRF9O",
"QU1FNRgFIAEoBRIaCgtmaWVsZF9uYW1lNhgGIAEoBVIFQHR5cGUioAYKFFRl",
"c3RIdWdlRmllbGROdW1iZXJzEhoKDm9wdGlvbmFsX2ludDMyGPD4//8BIAEo",
"BRIUCghmaXhlZF8zMhjx+P//ASABKAUSHgoOcmVwZWF0ZWRfaW50MzIY8vj/",
"/wEgAygFQgIQABIcCgxwYWNrZWRfaW50MzIY8/j//wEgAygFQgIQARJACg1v",
"cHRpb25hbF9lbnVtGPT4//8BIAEoDjIlLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5Gb3JlaWduRW51bRIbCg9vcHRpb25hbF9zdHJpbmcY9fj//wEgASgJ",
"EhoKDm9wdGlvbmFsX2J5dGVzGPb4//8BIAEoDBJGChBvcHRpb25hbF9tZXNz",
"YWdlGPf4//8BIAEoCzIoLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5Gb3Jl",
"aWduTWVzc2FnZRJXCg1vcHRpb25hbGdyb3VwGPj4//8BIAEoCjI8LnByb3Rv",
"YnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0SHVnZUZpZWxkTnVtYmVycy5PcHRp",
"b25hbEdyb3VwEmIKEXN0cmluZ19zdHJpbmdfbWFwGPr4//8BIAMoCzJDLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0SHVnZUZpZWxkTnVtYmVycy5T",
"dHJpbmdTdHJpbmdNYXBFbnRyeRIaCgxvbmVvZl91aW50MzIY+/j//wEgASgN",
"SAASSgoUb25lb2ZfdGVzdF9hbGxfdHlwZXMY/Pj//wEgASgLMiYucHJvdG9i",
"dWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlc0gAEhoKDG9uZW9mX3N0",
"cmluZxj9+P//ASABKAlIABIZCgtvbmVvZl9ieXRlcxj++P//ASABKAxIABok",
"Cg1PcHRpb25hbEdyb3VwEhMKB2dyb3VwX2EY+fj//wEgASgFGjYKFFN0cmlu",
"Z1N0cmluZ01hcEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToC",
"OAEqDAjgqv//ARDw+P//AUINCgtvbmVvZl9maWVsZCKxAQoYVGVzdEV4dGVu",
"c2lvbkluc2lkZVRhYmxlEg4KBmZpZWxkMRgBIAEoBRIOCgZmaWVsZDIYAiAB",
"KAUSDgoGZmllbGQzGAMgASgFEg4KBmZpZWxkNBgEIAEoBRIOCgZmaWVsZDYY",
"BiABKAUSDgoGZmllbGQ3GAcgASgFEg4KBmZpZWxkOBgIIAEoBRIOCgZmaWVs",
"ZDkYCSABKAUSDwoHZmllbGQxMBgKIAEoBSoECAUQBipACgtGb3JlaWduRW51",
"bRIPCgtGT1JFSUdOX0ZPTxAEEg8KC0ZPUkVJR05fQkFSEAUSDwoLRk9SRUlH",
"Tl9CQVoQBipLChRUZXN0RW51bVdpdGhEdXBWYWx1ZRIICgRGT08xEAESCAoE",
"QkFSMRACEgcKA0JBWhADEggKBEZPTzIQARIICgRCQVIyEAIaAhABKokBCg5U",
"ZXN0U3BhcnNlRW51bRIMCghTUEFSU0VfQRB7Eg4KCFNQQVJTRV9CEKbnAxIP",
"CghTUEFSU0VfQxCysYAGEhUKCFNQQVJTRV9EEPH//////////wESFQoIU1BB",
"UlNFX0UQtN78////////ARIMCghTUEFSU0VfRhAAEgwKCFNQQVJTRV9HEAIq",
"iw8KDVZlcnlMYXJnZUVudW0SFgoSRU5VTV9MQUJFTF9ERUZBVUxUEAASEAoM",
"RU5VTV9MQUJFTF8xEAESEAoMRU5VTV9MQUJFTF8yEAISEAoMRU5VTV9MQUJF",
"TF8zEAMSEAoMRU5VTV9MQUJFTF80EAQSEAoMRU5VTV9MQUJFTF81EAUSEAoM",
"RU5VTV9MQUJFTF82EAYSEAoMRU5VTV9MQUJFTF83EAcSEAoMRU5VTV9MQUJF",
"TF84EAgSEAoMRU5VTV9MQUJFTF85EAkSEQoNRU5VTV9MQUJFTF8xMBAKEhEK",
"DUVOVU1fTEFCRUxfMTEQCxIRCg1FTlVNX0xBQkVMXzEyEAwSEQoNRU5VTV9M",
"QUJFTF8xMxANEhEKDUVOVU1fTEFCRUxfMTQQDhIRCg1FTlVNX0xBQkVMXzE1",
"EA8SEQoNRU5VTV9MQUJFTF8xNhAQEhEKDUVOVU1fTEFCRUxfMTcQERIRCg1F",
"TlVNX0xBQkVMXzE4EBISEQoNRU5VTV9MQUJFTF8xORATEhEKDUVOVU1fTEFC",
"RUxfMjAQFBIRCg1FTlVNX0xBQkVMXzIxEBUSEQoNRU5VTV9MQUJFTF8yMhAW",
"EhEKDUVOVU1fTEFCRUxfMjMQFxIRCg1FTlVNX0xBQkVMXzI0EBgSEQoNRU5V",
"TV9MQUJFTF8yNRAZEhEKDUVOVU1fTEFCRUxfMjYQGhIRCg1FTlVNX0xBQkVM",
"XzI3EBsSEQoNRU5VTV9MQUJFTF8yOBAcEhEKDUVOVU1fTEFCRUxfMjkQHRIR",
"Cg1FTlVNX0xBQkVMXzMwEB4SEQoNRU5VTV9MQUJFTF8zMRAfEhEKDUVOVU1f",
"TEFCRUxfMzIQIBIRCg1FTlVNX0xBQkVMXzMzECESEQoNRU5VTV9MQUJFTF8z",
"NBAiEhEKDUVOVU1fTEFCRUxfMzUQIxIRCg1FTlVNX0xBQkVMXzM2ECQSEQoN",
"RU5VTV9MQUJFTF8zNxAlEhEKDUVOVU1fTEFCRUxfMzgQJhIRCg1FTlVNX0xB",
"QkVMXzM5ECcSEQoNRU5VTV9MQUJFTF80MBAoEhEKDUVOVU1fTEFCRUxfNDEQ",
"KRIRCg1FTlVNX0xBQkVMXzQyECoSEQoNRU5VTV9MQUJFTF80MxArEhEKDUVO",
"VU1fTEFCRUxfNDQQLBIRCg1FTlVNX0xBQkVMXzQ1EC0SEQoNRU5VTV9MQUJF",
"TF80NhAuEhEKDUVOVU1fTEFCRUxfNDcQLxIRCg1FTlVNX0xBQkVMXzQ4EDAS",
"EQoNRU5VTV9MQUJFTF80ORAxEhEKDUVOVU1fTEFCRUxfNTAQMhIRCg1FTlVN",
"X0xBQkVMXzUxEDMSEQoNRU5VTV9MQUJFTF81MhA0EhEKDUVOVU1fTEFCRUxf",
"NTMQNRIRCg1FTlVNX0xBQkVMXzU0EDYSEQoNRU5VTV9MQUJFTF81NRA3EhEK",
"DUVOVU1fTEFCRUxfNTYQOBIRCg1FTlVNX0xBQkVMXzU3EDkSEQoNRU5VTV9M",
"QUJFTF81OBA6EhEKDUVOVU1fTEFCRUxfNTkQOxIRCg1FTlVNX0xBQkVMXzYw",
"EDwSEQoNRU5VTV9MQUJFTF82MRA9EhEKDUVOVU1fTEFCRUxfNjIQPhIRCg1F",
"TlVNX0xBQkVMXzYzED8SEQoNRU5VTV9MQUJFTF82NBBAEhEKDUVOVU1fTEFC",
"RUxfNjUQQRIRCg1FTlVNX0xBQkVMXzY2EEISEQoNRU5VTV9MQUJFTF82NxBD",
"EhEKDUVOVU1fTEFCRUxfNjgQRBIRCg1FTlVNX0xBQkVMXzY5EEUSEQoNRU5V",
"TV9MQUJFTF83MBBGEhEKDUVOVU1fTEFCRUxfNzEQRxIRCg1FTlVNX0xBQkVM",
"XzcyEEgSEQoNRU5VTV9MQUJFTF83MxBJEhEKDUVOVU1fTEFCRUxfNzQQShIR",
"Cg1FTlVNX0xBQkVMXzc1EEsSEQoNRU5VTV9MQUJFTF83NhBMEhEKDUVOVU1f",
"TEFCRUxfNzcQTRIRCg1FTlVNX0xBQkVMXzc4EE4SEQoNRU5VTV9MQUJFTF83",
"ORBPEhEKDUVOVU1fTEFCRUxfODAQUBIRCg1FTlVNX0xBQkVMXzgxEFESEQoN",
"RU5VTV9MQUJFTF84MhBSEhEKDUVOVU1fTEFCRUxfODMQUxIRCg1FTlVNX0xB",
"QkVMXzg0EFQSEQoNRU5VTV9MQUJFTF84NRBVEhEKDUVOVU1fTEFCRUxfODYQ",
"VhIRCg1FTlVNX0xBQkVMXzg3EFcSEQoNRU5VTV9MQUJFTF84OBBYEhEKDUVO",
"VU1fTEFCRUxfODkQWRIRCg1FTlVNX0xBQkVMXzkwEFoSEQoNRU5VTV9MQUJF",
"TF85MRBbEhEKDUVOVU1fTEFCRUxfOTIQXBIRCg1FTlVNX0xBQkVMXzkzEF0S",
"EQoNRU5VTV9MQUJFTF85NBBeEhEKDUVOVU1fTEFCRUxfOTUQXxIRCg1FTlVN",
"X0xBQkVMXzk2EGASEQoNRU5VTV9MQUJFTF85NxBhEhEKDUVOVU1fTEFCRUxf",
"OTgQYhIRCg1FTlVNX0xBQkVMXzk5EGMSEgoORU5VTV9MQUJFTF8xMDAQZDK1",
"AQoLVGVzdFNlcnZpY2USUgoDRm9vEiQucHJvdG9idWZfdW5pdHRlc3RfcHJv",
"dG8yLkZvb1JlcXVlc3QaJS5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuRm9v",
"UmVzcG9uc2USUgoDQmFyEiQucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLkJh",
"clJlcXVlc3QaJS5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuQmFyUmVzcG9u",
"c2U6TQoYb3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5p",
"dHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGAEgASgFOk0KGG9wdGlv",
"bmFsX2ludDY0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsRXh0ZW5zaW9ucxgCIAEoAzpOChlvcHRpb25hbF91aW50MzJf",
"ZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxF",
"eHRlbnNpb25zGBggASgJQgIIAjpQChdvcHRpb25hbF9jb3JkX2V4dGVuc2lv",
"bhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9u",
"cxgZIAEoCUICCAE6kwEKKG9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2Fn",
"eHRlbnNpb25zGAMgASgNOk4KGW9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24S",
"Ky5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMY",
"BCABKAQ6TgoZb3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbhIrLnByb3RvYnVm",
"X3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgFIAEoETpOChlv",
"cHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3Rf",
"cHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGAYgASgSOk8KGm9wdGlvbmFsX2Zp",
"eGVkMzJfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGAcgASgHOk8KGm9wdGlvbmFsX2ZpeGVkNjRfZXh0",
"ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRl",
"bnNpb25zGAggASgGOlAKG29wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbhIr",
"LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgJ",
"IAEoDzpQChtvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb24SKy5wcm90b2J1",
"Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYCiABKBA6TQoY",
"b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3Rf",
"cHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGAsgASgCOk4KGW9wdGlvbmFsX2Rv",
"dWJsZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVz",
"dEFsbEV4dGVuc2lvbnMYDCABKAE6TAoXb3B0aW9uYWxfYm9vbF9leHRlbnNp",
"b24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lv",
"bnMYDSABKAg6TgoZb3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbhIrLnByb3Rv",
"YnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgOIAEoCTpN",
"ChhvcHRpb25hbF9ieXRlc19leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVz",
"dF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYDyABKAw6fwoXb3B0aW9uYWxn",
"cm91cF9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVz",
"dEFsbEV4dGVuc2lvbnMYECABKAoyMS5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuT3B0aW9uYWxHcm91cF9leHRlbnNpb246jAEKIW9wdGlvbmFsX25lc3Rl",
"ZF9tZXNzYWdlX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsRXh0ZW5zaW9ucxgSIAEoCzI0LnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZTqBAQoib3B0aW9u",
"YWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0",
"ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgTIAEoCzIoLnByb3RvYnVm",
"X3VuaXR0ZXN0X3Byb3RvMi5Gb3JlaWduTWVzc2FnZTqGAQohb3B0aW9uYWxf",
"aW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3Rf",
"cHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGBQgASgLMi4ucHJvdG9idWZfdW5p",
"dHRlc3RfaW1wb3J0X3Byb3RvMi5JbXBvcnRNZXNzYWdlOoYBCh5vcHRpb25h",
"bF9uZXN0ZWRfZW51bV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYFSABKA4yMS5wcm90b2J1Zl91bml0",
"dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW06ewofb3B0aW9u",
"YWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgWIAEoDjIlLnByb3RvYnVmX3Vu",
"aXR0ZXN0X3Byb3RvMi5Gb3JlaWduRW51bTqAAQoeb3B0aW9uYWxfaW1wb3J0",
"X2VudW1fZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGBcgASgOMisucHJvdG9idWZfdW5pdHRlc3RfaW1w",
"b3J0X3Byb3RvMi5JbXBvcnRFbnVtOlgKH29wdGlvbmFsX3N0cmluZ19waWVj",
"ZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFs",
"bEV4dGVuc2lvbnMYGiABKAsyNC5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnRf",
"cHJvdG8yLlB1YmxpY0ltcG9ydE1lc3NhZ2U6jgEKH29wdGlvbmFsX2xhenlf",
"bWVzc2FnZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYGyABKAsyNC5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2VCAigBOk0KGHJlcGVh",
"dGVkX2ludDMyX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsRXh0ZW5zaW9ucxgfIAMoBTpNChhyZXBlYXRlZF9pbnQ2NF9l",
"eHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4",
"dGVuc2lvbnMYICADKAM6TgoZcmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbhIr",
"LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgh",
"IAMoDTpOChlyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uEisucHJvdG9idWZf",
"dW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGCIgAygEOk4KGXJl",
"cGVhdGVkX3NpbnQzMl9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYIyADKBE6TgoZcmVwZWF0ZWRfc2lu",
"dDY0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"QWxsRXh0ZW5zaW9ucxgkIAMoEjpPChpyZXBlYXRlZF9maXhlZDMyX2V4dGVu",
"c2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5z",
"aW9ucxglIAMoBzpPChpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbhIrLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgmIAMo",
"BjpQChtyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24SKy5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYJyADKA86UAobcmVw",
"ZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3Rf",
"cHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGCggAygQOk0KGHJlcGVhdGVkX2Zs",
"b2F0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"QWxsRXh0ZW5zaW9ucxgpIAMoAjpOChlyZXBlYXRlZF9kb3VibGVfZXh0ZW5z",
"aW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNp",
"b25zGCogAygBOkwKF3JlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uEisucHJvdG9i",
"dWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGCsgAygIOk4K",
"GXJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVz",
"dF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYLCADKAk6TQoYcmVwZWF0ZWRf",
"Ynl0ZXNfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGC0gAygMOn8KF3JlcGVhdGVkZ3JvdXBfZXh0ZW5z",
"bEV4dGVuc2lvbnMYGCABKAlCAggCOlAKF29wdGlvbmFsX2NvcmRfZXh0ZW5z",
"aW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNp",
"b25zGC4gAygKMjEucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlJlcGVhdGVk",
"R3JvdXBfZXh0ZW5zaW9uOowBCiFyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9l",
"eHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4",
"dGVuc2lvbnMYMCADKAsyNC5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVz",
"dEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U6gQEKInJlcGVhdGVkX2ZvcmVpZ25f",
"bWVzc2FnZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYMSADKAsyKC5wcm90b2J1Zl91bml0dGVzdF9w",
"cm90bzIuRm9yZWlnbk1lc3NhZ2U6hgEKIXJlcGVhdGVkX2ltcG9ydF9tZXNz",
"b25zGBkgASgJQgIIATqTAQoob3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNz",
"YWdlX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"QWxsRXh0ZW5zaW9ucxgyIAMoCzIuLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9y",
"dF9wcm90bzIuSW1wb3J0TWVzc2FnZTqGAQoecmVwZWF0ZWRfbmVzdGVkX2Vu",
"dW1fZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RB",
"bGxFeHRlbnNpb25zGDMgAygOMjEucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8y",
"LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtOnsKH3JlcGVhdGVkX2ZvcmVpZ25f",
"ZW51bV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVz",
"dEFsbEV4dGVuc2lvbnMYNCADKA4yJS5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuRm9yZWlnbkVudW06gAEKHnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVu",
"c2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5z",
"aW9ucxg1IAMoDjIrLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9wcm90bzIu",
"SW1wb3J0RW51bTpYCh9yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9u",
"QWxsRXh0ZW5zaW9ucxgaIAEoCzI0LnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9y",
"dF9wcm90bzIuUHVibGljSW1wb3J0TWVzc2FnZTqOAQofb3B0aW9uYWxfbGF6",
"eV9tZXNzYWdlX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsRXh0ZW5zaW9ucxgbIAEoCzI0LnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZUICKAE6TQoYcmVw",
"ZWF0ZWRfaW50MzJfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJv",
"dG8yLlRlc3RBbGxFeHRlbnNpb25zGB8gAygFOk0KGHJlcGVhdGVkX2ludDY0",
"X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxs",
"RXh0ZW5zaW9ucxggIAMoAzpOChlyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9u",
"EisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25z",
"GDYgAygJQgIIAjpQChdyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbhIrLnByb3Rv",
"YnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxg3IAMoCUIC",
"CAE6jgEKH3JlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24SKy5wcm90",
"b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYOSADKAsy",
"NC5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbFR5cGVzLk5lc3Rl",
"ZE1lc3NhZ2VCAigBOlAKF2RlZmF1bHRfaW50MzJfZXh0ZW5zaW9uEisucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGD0gASgF",
"OgI0MTpQChdkZWZhdWx0X2ludDY0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3Vu",
"aXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxg+IAEoAzoCNDI6UQoY",
"ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3Rf",
"cHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGD8gASgNOgI0MzpRChhkZWZhdWx0",
"X3VpbnQ2NF9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYQCABKAQ6AjQ0OlIKGGRlZmF1bHRfc2ludDMy",
"GCEgAygNOk4KGXJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24SKy5wcm90b2J1",
"Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYIiADKAQ6TgoZ",
"cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgjIAMoETpOChlyZXBlYXRlZF9z",
"aW50NjRfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGCQgAygSOk8KGnJlcGVhdGVkX2ZpeGVkMzJfZXh0",
"ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRl",
"bnNpb25zGCUgAygHOk8KGnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uEisu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGCYg",
"AygGOlAKG3JlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbhIrLnByb3RvYnVm",
"X3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgnIAMoDzpQChty",
"ZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVz",
"dF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYKCADKBA6TQoYcmVwZWF0ZWRf",
"ZmxvYXRfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGCkgAygCOk4KGXJlcGVhdGVkX2RvdWJsZV9leHRl",
"bnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVu",
"c2lvbnMYKiADKAE6TAoXcmVwZWF0ZWRfYm9vbF9leHRlbnNpb24SKy5wcm90",
"b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYKyADKAg6",
"TgoZcmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0",
"ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxgsIAMoCTpNChhyZXBlYXRl",
"ZF9ieXRlc19leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYLSADKAw6fwoXcmVwZWF0ZWRncm91cF9leHRl",
"bnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVu",
"c2lvbnMYLiADKAoyMS5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuUmVwZWF0",
"ZWRHcm91cF9leHRlbnNpb246jAEKIXJlcGVhdGVkX25lc3RlZF9tZXNzYWdl",
"X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxs",
"RXh0ZW5zaW9ucxhBIAEoEToDLTQ1OlEKGGRlZmF1bHRfc2ludDY0X2V4dGVu",
"c2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5z",
"aW9ucxhCIAEoEjoCNDY6UgoZZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbhIr",
"LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxhD",
"IAEoBzoCNDc6UgoZZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbhIrLnByb3Rv",
"YnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxhEIAEoBjoC",
"NDg6UwoaZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24SKy5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYRSABKA86AjQ5OlQK",
"GmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRl",
"c3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGEYgASgQOgMtNTA6UgoXZGVm",
"YXVsdF9mbG9hdF9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuVGVzdEFsbEV4dGVuc2lvbnMYRyABKAI6BDUxLjU6VAoYZGVmYXVsdF9k",
"b3VibGVfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGEggASgBOgU1MjAwMDpRChZkZWZhdWx0X2Jvb2xf",
"ZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxF",
"eHRlbnNpb25zGEkgASgIOgR0cnVlOlQKGGRlZmF1bHRfc3RyaW5nX2V4dGVu",
"c2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5z",
"aW9ucxhKIAEoCToFaGVsbG86UwoXZGVmYXVsdF9ieXRlc19leHRlbnNpb24S",
"Ky5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMY",
"SyABKAw6BXdvcmxkOooBCh1kZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lv",
"RXh0ZW5zaW9ucxgwIAMoCzI0LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5U",
"ZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZTqBAQoicmVwZWF0ZWRfZm9yZWln",
"bl9tZXNzYWdlX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsRXh0ZW5zaW9ucxgxIAMoCzIoLnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5Gb3JlaWduTWVzc2FnZTqGAQohcmVwZWF0ZWRfaW1wb3J0X21l",
"c3NhZ2VfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGDIgAygLMi4ucHJvdG9idWZfdW5pdHRlc3RfaW1w",
"b3J0X3Byb3RvMi5JbXBvcnRNZXNzYWdlOoYBCh5yZXBlYXRlZF9uZXN0ZWRf",
"ZW51bV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVz",
"dEFsbEV4dGVuc2lvbnMYMyADKA4yMS5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW06ewofcmVwZWF0ZWRfZm9yZWln",
"bl9lbnVtX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5U",
"ZXN0QWxsRXh0ZW5zaW9ucxg0IAMoDjIlLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5Gb3JlaWduRW51bTqAAQoecmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0",
"ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRl",
"bnNpb25zGDUgAygOMisucHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0X3Byb3Rv",
"Mi5JbXBvcnRFbnVtOlgKH3JlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNp",
"b24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lv",
"bnMYNiADKAlCAggCOlAKF3JlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uEisucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGDcgAygJ",
"QgIIATqOAQofcmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbhIrLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxg5IAMo",
"CzI0LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVz",
"dGVkTWVzc2FnZUICKAE6UAoXZGVmYXVsdF9pbnQzMl9leHRlbnNpb24SKy5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYPSAB",
"KAU6AjQxOlAKF2RlZmF1bHRfaW50NjRfZXh0ZW5zaW9uEisucHJvdG9idWZf",
"dW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGD4gASgDOgI0MjpR",
"ChhkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVz",
"dF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYPyABKA06AjQzOlEKGGRlZmF1",
"bHRfdWludDY0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsRXh0ZW5zaW9ucxhAIAEoBDoCNDQ6UgoYZGVmYXVsdF9zaW50",
"MzJfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RB",
"bGxFeHRlbnNpb25zGEEgASgROgMtNDU6UQoYZGVmYXVsdF9zaW50NjRfZXh0",
"ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRl",
"bnNpb25zGEIgASgSOgI0NjpSChlkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9u",
"EisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25z",
"GEMgASgHOgI0NzpSChlkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uEisucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNpb25zGEQgASgG",
"OgI0ODpTChpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbhIrLnByb3RvYnVm",
"X3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxhFIAEoDzoCNDk6",
"VAoaZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0",
"dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYRiABKBA6Ay01MDpSChdk",
"ZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxhHIAEoAjoENTEuNTpUChhkZWZhdWx0",
"X2RvdWJsZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYSCABKAE6BTUyMDAwOlEKFmRlZmF1bHRfYm9v",
"bF9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFs",
"bEV4dGVuc2lvbnMYSSABKAg6BHRydWU6VAoYZGVmYXVsdF9zdHJpbmdfZXh0",
"ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRl",
"bnNpb25zGEogASgJOgVoZWxsbzpTChdkZWZhdWx0X2J5dGVzX2V4dGVuc2lv",
"bhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9u",
"cxhRIAEoDjIxLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsVHlw",
"ZXMuTmVzdGVkRW51bToDQkFSOocBCh5kZWZhdWx0X2ZvcmVpZ25fZW51bV9l",
"eHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4",
"dGVuc2lvbnMYUiABKA4yJS5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuRm9y",
"ZWlnbkVudW06C0ZPUkVJR05fQkFSOosBCh1kZWZhdWx0X2ltcG9ydF9lbnVt",
"cxhLIAEoDDoFd29ybGQ6igEKHWRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5z",
"aW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNp",
"b25zGFEgASgOMjEucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxU",
"eXBlcy5OZXN0ZWRFbnVtOgNCQVI6hwEKHmRlZmF1bHRfZm9yZWlnbl9lbnVt",
"X2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxs",
"RXh0ZW5zaW9ucxhTIAEoDjIrLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydF9w",
"cm90bzIuSW1wb3J0RW51bToKSU1QT1JUX0JBUjpcCh5kZWZhdWx0X3N0cmlu",
"Z19waWVjZV9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEFsbEV4dGVuc2lvbnMYVCABKAk6A2FiY0ICCAI6VAoWZGVmYXVsdF9j",
"b3JkX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"QWxsRXh0ZW5zaW9ucxhVIAEoCToDMTIzQgIIATpLChZvbmVvZl91aW50MzJf",
"ZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxF",
"eHRlbnNpb25zGG8gASgNOokBCh5vbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRl",
"bnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVu",
"c2lvbnMYcCABKAsyNC5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFs",
"bFR5cGVzLk5lc3RlZE1lc3NhZ2U6SwoWb25lb2Zfc3RyaW5nX2V4dGVuc2lv",
"bhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9u",
"cxhxIAEoCTpKChVvbmVvZl9ieXRlc19leHRlbnNpb24SKy5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdEFsbEV4dGVuc2lvbnMYciABKAw6SQoTbXlf",
"ZXh0ZW5zaW9uX3N0cmluZxIsLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5U",
"ZXN0RmllbGRPcmRlcmluZ3MYMiABKAk6RgoQbXlfZXh0ZW5zaW9uX2ludBIs",
"LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0RmllbGRPcmRlcmluZ3MY",
"BSABKAU6UgoWcGFja2VkX2ludDMyX2V4dGVuc2lvbhIuLnByb3RvYnVmX3Vu",
"aXR0ZXN0X3Byb3RvMi5UZXN0UGFja2VkRXh0ZW5zaW9ucxhaIAMoBUICEAE6",
"UgoWcGFja2VkX2ludDY0X2V4dGVuc2lvbhIuLnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0UGFja2VkRXh0ZW5zaW9ucxhbIAMoA0ICEAE6UwoXcGFj",
"a2VkX3VpbnQzMl9leHRlbnNpb24SLi5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuVGVzdFBhY2tlZEV4dGVuc2lvbnMYXCADKA1CAhABOlMKF3BhY2tlZF91",
"aW50NjRfZXh0ZW5zaW9uEi4ucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RQYWNrZWRFeHRlbnNpb25zGF0gAygEQgIQATpTChdwYWNrZWRfc2ludDMy",
"X2V4dGVuc2lvbhIuLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0UGFj",
"a2VkRXh0ZW5zaW9ucxheIAMoEUICEAE6UwoXcGFja2VkX3NpbnQ2NF9leHRl",
"bnNpb24SLi5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFBhY2tlZEV4",
"dGVuc2lvbnMYXyADKBJCAhABOlQKGHBhY2tlZF9maXhlZDMyX2V4dGVuc2lv",
"bhIuLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0UGFja2VkRXh0ZW5z",
"aW9ucxhgIAMoB0ICEAE6VAoYcGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uEi4u",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRlbnNpb25z",
"GGEgAygGQgIQATpVChlwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uEi4ucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRlbnNpb25zGGIg",
"AygPQgIQATpVChlwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uEi4ucHJvdG9i",
"dWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRlbnNpb25zGGMgAygQ",
"QgIQATpSChZwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uEi4ucHJvdG9idWZfdW5p",
"dHRlc3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRlbnNpb25zGGQgAygCQgIQATpT",
"ChdwYWNrZWRfZG91YmxlX2V4dGVuc2lvbhIuLnByb3RvYnVmX3VuaXR0ZXN0",
"X3Byb3RvMi5UZXN0UGFja2VkRXh0ZW5zaW9ucxhlIAMoAUICEAE6UQoVcGFj",
"a2VkX2Jvb2xfZXh0ZW5zaW9uEi4ucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8y",
"LlRlc3RQYWNrZWRFeHRlbnNpb25zGGYgAygIQgIQATp4ChVwYWNrZWRfZW51",
"bV9leHRlbnNpb24SLi5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFBh",
"Y2tlZEV4dGVuc2lvbnMYZyADKA4yJS5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuRm9yZWlnbkVudW1CAhABOlYKGHVucGFja2VkX2ludDMyX2V4dGVuc2lv",
"RXh0ZW5zaW9ucxhSIAEoDjIlLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5G",
"b3JlaWduRW51bToLRk9SRUlHTl9CQVI6iwEKHWRlZmF1bHRfaW1wb3J0X2Vu",
"dW1fZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RB",
"bGxFeHRlbnNpb25zGFMgASgOMisucHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0",
"X3Byb3RvMi5JbXBvcnRFbnVtOgpJTVBPUlRfQkFSOlwKHmRlZmF1bHRfc3Ry",
"aW5nX3BpZWNlX2V4dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0QWxsRXh0ZW5zaW9ucxhUIAEoCToDYWJjQgIIAjpUChZkZWZhdWx0",
"X2NvcmRfZXh0ZW5zaW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RBbGxFeHRlbnNpb25zGFUgASgJOgMxMjNCAggBOksKFm9uZW9mX3VpbnQz",
"Ml9leHRlbnNpb24SKy5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdEFs",
"bEV4dGVuc2lvbnMYbyABKA06iQEKHm9uZW9mX25lc3RlZF9tZXNzYWdlX2V4",
"dGVuc2lvbhIrLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0",
"ZW5zaW9ucxhwIAEoCzI0LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"QWxsVHlwZXMuTmVzdGVkTWVzc2FnZTpLChZvbmVvZl9zdHJpbmdfZXh0ZW5z",
"aW9uEisucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RBbGxFeHRlbnNp",
"b25zGHEgASgJOkoKFW9uZW9mX2J5dGVzX2V4dGVuc2lvbhIrLnByb3RvYnVm",
"X3VuaXR0ZXN0X3Byb3RvMi5UZXN0QWxsRXh0ZW5zaW9ucxhyIAEoDDpJChNt",
"eV9leHRlbnNpb25fc3RyaW5nEiwucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8y",
"LlRlc3RGaWVsZE9yZGVyaW5ncxgyIAEoCTpGChBteV9leHRlbnNpb25faW50",
"EiwucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RGaWVsZE9yZGVyaW5n",
"cxgFIAEoBTpSChZwYWNrZWRfaW50MzJfZXh0ZW5zaW9uEi4ucHJvdG9idWZf",
"dW5pdHRlc3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRlbnNpb25zGFogAygFQgIQ",
"ATpSChZwYWNrZWRfaW50NjRfZXh0ZW5zaW9uEi4ucHJvdG9idWZfdW5pdHRl",
"c3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRlbnNpb25zGFsgAygDQgIQATpTChdw",
"YWNrZWRfdWludDMyX2V4dGVuc2lvbhIuLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5UZXN0UGFja2VkRXh0ZW5zaW9ucxhcIAMoDUICEAE6UwoXcGFja2Vk",
"X3VpbnQ2NF9leHRlbnNpb24SLi5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdFBhY2tlZEV4dGVuc2lvbnMYXSADKARCAhABOlMKF3BhY2tlZF9zaW50",
"MzJfZXh0ZW5zaW9uEi4ucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RQ",
"YWNrZWRFeHRlbnNpb25zGF4gAygRQgIQATpTChdwYWNrZWRfc2ludDY0X2V4",
"dGVuc2lvbhIuLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0UGFja2Vk",
"RXh0ZW5zaW9ucxhfIAMoEkICEAE6VAoYcGFja2VkX2ZpeGVkMzJfZXh0ZW5z",
"aW9uEi4ucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRl",
"bnNpb25zGGAgAygHQgIQATpUChhwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24S",
"Li5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFBhY2tlZEV4dGVuc2lv",
"bnMYYSADKAZCAhABOlUKGXBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24SLi5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFBhY2tlZEV4dGVuc2lvbnMY",
"YiADKA9CAhABOlUKGXBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24SLi5wcm90",
"b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFBhY2tlZEV4dGVuc2lvbnMYYyAD",
"KBBCAhABOlIKFnBhY2tlZF9mbG9hdF9leHRlbnNpb24SLi5wcm90b2J1Zl91",
"bml0dGVzdF9wcm90bzIuVGVzdFBhY2tlZEV4dGVuc2lvbnMYZCADKAJCAhAB",
"OlMKF3BhY2tlZF9kb3VibGVfZXh0ZW5zaW9uEi4ucHJvdG9idWZfdW5pdHRl",
"c3RfcHJvdG8yLlRlc3RQYWNrZWRFeHRlbnNpb25zGGUgAygBQgIQATpRChVw",
"YWNrZWRfYm9vbF9leHRlbnNpb24SLi5wcm90b2J1Zl91bml0dGVzdF9wcm90",
"bzIuVGVzdFBhY2tlZEV4dGVuc2lvbnMYZiADKAhCAhABOngKFXBhY2tlZF9l",
"bnVtX2V4dGVuc2lvbhIuLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0",
"UGFja2VkRXh0ZW5zaW9ucxhnIAMoDjIlLnByb3RvYnVmX3VuaXR0ZXN0X3By",
"b3RvMi5Gb3JlaWduRW51bUICEAE6VgoYdW5wYWNrZWRfaW50MzJfZXh0ZW5z",
"aW9uEjAucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4",
"dGVuc2lvbnMYWiADKAVCAhAAOlYKGHVucGFja2VkX2ludDY0X2V4dGVuc2lv",
"bhIwLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0VW5wYWNrZWRFeHRl",
"bnNpb25zGFogAygFQgIQADpWChh1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24S",
"bnNpb25zGFsgAygDQgIQADpXChl1bnBhY2tlZF91aW50MzJfZXh0ZW5zaW9u",
"EjAucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVu",
"c2lvbnMYXCADKA1CAhAAOlcKGXVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24S",
"MC5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFVucGFja2VkRXh0ZW5z",
"aW9ucxhbIAMoA0ICEAA6VwoZdW5wYWNrZWRfdWludDMyX2V4dGVuc2lvbhIw",
"aW9ucxhdIAMoBEICEAA6VwoZdW5wYWNrZWRfc2ludDMyX2V4dGVuc2lvbhIw",
"LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0VW5wYWNrZWRFeHRlbnNp",
"b25zGFwgAygNQgIQADpXChl1bnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uEjAu",
"b25zGF4gAygRQgIQADpXChl1bnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uEjAu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVuc2lv",
"bnMYXSADKARCAhAAOlcKGXVucGFja2VkX3NpbnQzMl9leHRlbnNpb24SMC5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFVucGFja2VkRXh0ZW5zaW9u",
"cxheIAMoEUICEAA6VwoZdW5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbhIwLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0VW5wYWNrZWRFeHRlbnNpb25z",
"GF8gAygSQgIQADpYChp1bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbhIwLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0VW5wYWNrZWRFeHRlbnNpb25z",
"GGAgAygHQgIQADpYChp1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbhIwLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0VW5wYWNrZWRFeHRlbnNpb25z",
"GGEgAygGQgIQADpZCht1bnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24SMC5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFVucGFja2VkRXh0ZW5zaW9u",
"cxhiIAMoD0ICEAA6WQobdW5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uEjAu",
"bnMYXyADKBJCAhAAOlgKGnVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uEjAu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVuc2lv",
"bnMYYCADKAdCAhAAOlgKGnVucGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uEjAu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVuc2lv",
"bnMYYSADKAZCAhAAOlkKG3VucGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbhIw",
"LnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0VW5wYWNrZWRFeHRlbnNp",
"b25zGGIgAygPQgIQADpZCht1bnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24S",
"MC5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFVucGFja2VkRXh0ZW5z",
"aW9ucxhjIAMoEEICEAA6VgoYdW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uEjAu",
"cHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVuc2lv",
"bnMYYyADKBBCAhAAOlYKGHVucGFja2VkX2Zsb2F0X2V4dGVuc2lvbhIwLnBy",
"b3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5UZXN0VW5wYWNrZWRFeHRlbnNpb25z",
"GGQgAygCQgIQADpXChl1bnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uEjAucHJv",
"dG9idWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMY",
"ZSADKAFCAhAAOlUKF3VucGFja2VkX2Jvb2xfZXh0ZW5zaW9uEjAucHJvdG9i",
"dWZfdW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMYZiAD",
"KAhCAhAAOnwKF3VucGFja2VkX2VudW1fZXh0ZW5zaW9uEjAucHJvdG9idWZf",
"dW5pdHRlc3RfcHJvdG8yLlRlc3RVbnBhY2tlZEV4dGVuc2lvbnMYZyADKA4y",
"JS5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIuRm9yZWlnbkVudW1CAhAAOnIK",
"DnRlc3RfYWxsX3R5cGVzEi4ucHJvdG9idWZfdW5pdHRlc3RfcHJvdG8yLlRl",
"c3RIdWdlRmllbGROdW1iZXJzGOCq//8BIAEoCzImLnByb3RvYnVmX3VuaXR0",
"ZXN0X3Byb3RvMi5UZXN0QWxsVHlwZXM6YQoldGVzdF9leHRlbnNpb25faW5z",
"aWRlX3RhYmxlX2V4dGVuc2lvbhIyLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3Rv",
"Mi5UZXN0RXh0ZW5zaW9uSW5zaWRlVGFibGUYBSABKAVCMkgBgAEBiAEBkAEB",
"+AEBqgIhR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHJvdG8y"));
"bnMYZCADKAJCAhAAOlcKGXVucGFja2VkX2RvdWJsZV9leHRlbnNpb24SMC5w",
"cm90b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFVucGFja2VkRXh0ZW5zaW9u",
"cxhlIAMoAUICEAA6VQoXdW5wYWNrZWRfYm9vbF9leHRlbnNpb24SMC5wcm90",
"b2J1Zl91bml0dGVzdF9wcm90bzIuVGVzdFVucGFja2VkRXh0ZW5zaW9ucxhm",
"IAMoCEICEAA6fAoXdW5wYWNrZWRfZW51bV9leHRlbnNpb24SMC5wcm90b2J1",
"Zl91bml0dGVzdF9wcm90bzIuVGVzdFVucGFja2VkRXh0ZW5zaW9ucxhnIAMo",
"DjIlLnByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvMi5Gb3JlaWduRW51bUICEAA6",
"cgoOdGVzdF9hbGxfdHlwZXMSLi5wcm90b2J1Zl91bml0dGVzdF9wcm90bzIu",
"VGVzdEh1Z2VGaWVsZE51bWJlcnMY4Kr//wEgASgLMiYucHJvdG9idWZfdW5p",
"dHRlc3RfcHJvdG8yLlRlc3RBbGxUeXBlczphCiV0ZXN0X2V4dGVuc2lvbl9p",
"bnNpZGVfdGFibGVfZXh0ZW5zaW9uEjIucHJvdG9idWZfdW5pdHRlc3RfcHJv",
"dG8yLlRlc3RFeHRlbnNpb25JbnNpZGVUYWJsZRgFIAEoBUIySAGAAQGIAQGQ",
"AQH4AQGqAiFHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Qcm90bzI="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.TestProtos.Proto2.UnittestImportReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Google.Protobuf.TestProtos.Proto2.ForeignEnum), typeof(global::Google.Protobuf.TestProtos.Proto2.TestEnumWithDupValue), typeof(global::Google.Protobuf.TestProtos.Proto2.TestSparseEnum), typeof(global::Google.Protobuf.TestProtos.Proto2.VeryLargeEnum), }, new pb::Extension[] { UnittestExtensions.OptionalInt32Extension, UnittestExtensions.OptionalInt64Extension, UnittestExtensions.OptionalUint32Extension, UnittestExtensions.OptionalUint64Extension, UnittestExtensions.OptionalSint32Extension, UnittestExtensions.OptionalSint64Extension, UnittestExtensions.OptionalFixed32Extension, UnittestExtensions.OptionalFixed64Extension, UnittestExtensions.OptionalSfixed32Extension, UnittestExtensions.OptionalSfixed64Extension, UnittestExtensions.OptionalFloatExtension, UnittestExtensions.OptionalDoubleExtension, UnittestExtensions.OptionalBoolExtension, UnittestExtensions.OptionalStringExtension, UnittestExtensions.OptionalBytesExtension, UnittestExtensions.OptionalGroupExtension, UnittestExtensions.OptionalNestedMessageExtension, UnittestExtensions.OptionalForeignMessageExtension, UnittestExtensions.OptionalImportMessageExtension, UnittestExtensions.OptionalNestedEnumExtension, UnittestExtensions.OptionalForeignEnumExtension, UnittestExtensions.OptionalImportEnumExtension, UnittestExtensions.OptionalStringPieceExtension, UnittestExtensions.OptionalCordExtension, UnittestExtensions.OptionalPublicImportMessageExtension, UnittestExtensions.OptionalLazyMessageExtension, UnittestExtensions.RepeatedInt32Extension, UnittestExtensions.RepeatedInt64Extension, UnittestExtensions.RepeatedUint32Extension, UnittestExtensions.RepeatedUint64Extension, UnittestExtensions.RepeatedSint32Extension, UnittestExtensions.RepeatedSint64Extension, UnittestExtensions.RepeatedFixed32Extension, UnittestExtensions.RepeatedFixed64Extension, UnittestExtensions.RepeatedSfixed32Extension, UnittestExtensions.RepeatedSfixed64Extension, UnittestExtensions.RepeatedFloatExtension, UnittestExtensions.RepeatedDoubleExtension, UnittestExtensions.RepeatedBoolExtension, UnittestExtensions.RepeatedStringExtension, UnittestExtensions.RepeatedBytesExtension, UnittestExtensions.RepeatedGroupExtension, UnittestExtensions.RepeatedNestedMessageExtension, UnittestExtensions.RepeatedForeignMessageExtension, UnittestExtensions.RepeatedImportMessageExtension, UnittestExtensions.RepeatedNestedEnumExtension, UnittestExtensions.RepeatedForeignEnumExtension, UnittestExtensions.RepeatedImportEnumExtension, UnittestExtensions.RepeatedStringPieceExtension, UnittestExtensions.RepeatedCordExtension, UnittestExtensions.RepeatedLazyMessageExtension, UnittestExtensions.DefaultInt32Extension, UnittestExtensions.DefaultInt64Extension, UnittestExtensions.DefaultUint32Extension, UnittestExtensions.DefaultUint64Extension, UnittestExtensions.DefaultSint32Extension, UnittestExtensions.DefaultSint64Extension, UnittestExtensions.DefaultFixed32Extension, UnittestExtensions.DefaultFixed64Extension, UnittestExtensions.DefaultSfixed32Extension, UnittestExtensions.DefaultSfixed64Extension, UnittestExtensions.DefaultFloatExtension, UnittestExtensions.DefaultDoubleExtension, UnittestExtensions.DefaultBoolExtension, UnittestExtensions.DefaultStringExtension, UnittestExtensions.DefaultBytesExtension, UnittestExtensions.DefaultNestedEnumExtension, UnittestExtensions.DefaultForeignEnumExtension, UnittestExtensions.DefaultImportEnumExtension, UnittestExtensions.DefaultStringPieceExtension, UnittestExtensions.DefaultCordExtension, UnittestExtensions.OneofUint32Extension, UnittestExtensions.OneofNestedMessageExtension, UnittestExtensions.OneofStringExtension, UnittestExtensions.OneofBytesExtension, UnittestExtensions.MyExtensionString, UnittestExtensions.MyExtensionInt, UnittestExtensions.PackedInt32Extension, UnittestExtensions.PackedInt64Extension, UnittestExtensions.PackedUint32Extension, UnittestExtensions.PackedUint64Extension, UnittestExtensions.PackedSint32Extension, UnittestExtensions.PackedSint64Extension, UnittestExtensions.PackedFixed32Extension, UnittestExtensions.PackedFixed64Extension, UnittestExtensions.PackedSfixed32Extension, UnittestExtensions.PackedSfixed64Extension, UnittestExtensions.PackedFloatExtension, UnittestExtensions.PackedDoubleExtension, UnittestExtensions.PackedBoolExtension, UnittestExtensions.PackedEnumExtension, UnittestExtensions.UnpackedInt32Extension, UnittestExtensions.UnpackedInt64Extension, UnittestExtensions.UnpackedUint32Extension, UnittestExtensions.UnpackedUint64Extension, UnittestExtensions.UnpackedSint32Extension, UnittestExtensions.UnpackedSint64Extension, UnittestExtensions.UnpackedFixed32Extension, UnittestExtensions.UnpackedFixed64Extension, UnittestExtensions.UnpackedSfixed32Extension, UnittestExtensions.UnpackedSfixed64Extension, UnittestExtensions.UnpackedFloatExtension, UnittestExtensions.UnpackedDoubleExtension, UnittestExtensions.UnpackedBoolExtension, UnittestExtensions.UnpackedEnumExtension, UnittestExtensions.TestAllTypes, UnittestExtensions.TestExtensionInsideTableExtension }, new pbr::GeneratedClrTypeInfo[] {
......@@ -716,6 +721,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestOneof2), global::Google.Protobuf.TestProtos.Proto2.TestOneof2.Parser, new[]{ "FooInt", "FooString", "FooCord", "FooStringPiece", "FooBytes", "FooEnum", "FooMessage", "FooGroup", "FooLazyMessage", "BarInt", "BarString", "BarCord", "BarStringPiece", "BarBytes", "BarEnum", "BazInt", "BazString" }, new[]{ "Foo", "Bar" }, new[]{ typeof(global::Google.Protobuf.TestProtos.Proto2.TestOneof2.Types.NestedEnum) }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestOneof2.Types.FooGroup), global::Google.Protobuf.TestProtos.Proto2.TestOneof2.Types.FooGroup.Parser, new[]{ "A", "B" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestOneof2.Types.NestedMessage), global::Google.Protobuf.TestProtos.Proto2.TestOneof2.Types.NestedMessage.Parser, new[]{ "QuxInt", "CorgeInt" }, null, null, null, null)}),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestRequiredOneof), global::Google.Protobuf.TestProtos.Proto2.TestRequiredOneof.Parser, new[]{ "FooInt", "FooString", "FooMessage" }, new[]{ "Foo" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestRequiredOneof.Types.NestedMessage), global::Google.Protobuf.TestProtos.Proto2.TestRequiredOneof.Types.NestedMessage.Parser, new[]{ "RequiredDouble" }, null, null, null, null)}),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap), global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Parser, new[]{ "Foo" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage), global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage.Parser, new[]{ "RequiredInt32" }, null, null, null, null)}),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestPackedTypes), global::Google.Protobuf.TestProtos.Proto2.TestPackedTypes.Parser, new[]{ "PackedInt32", "PackedInt64", "PackedUint32", "PackedUint64", "PackedSint32", "PackedSint64", "PackedFixed32", "PackedFixed64", "PackedSfixed32", "PackedSfixed64", "PackedFloat", "PackedDouble", "PackedBool", "PackedEnum" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestUnpackedTypes), global::Google.Protobuf.TestProtos.Proto2.TestUnpackedTypes.Parser, new[]{ "UnpackedInt32", "UnpackedInt64", "UnpackedUint32", "UnpackedUint64", "UnpackedSint32", "UnpackedSint64", "UnpackedFixed32", "UnpackedFixed64", "UnpackedSfixed32", "UnpackedSfixed64", "UnpackedFloat", "UnpackedDouble", "UnpackedBool", "UnpackedEnum" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.TestProtos.Proto2.TestPackedExtensions), global::Google.Protobuf.TestProtos.Proto2.TestPackedExtensions.Parser, null, null, null, null, null),
......@@ -18148,6 +18154,278 @@ namespace Google.Protobuf.TestProtos.Proto2 {
}
public sealed partial class TestRequiredMap : pb::IMessage<TestRequiredMap> {
private static readonly pb::MessageParser<TestRequiredMap> _parser = new pb::MessageParser<TestRequiredMap>(() => new TestRequiredMap());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<TestRequiredMap> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[47]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public TestRequiredMap() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public TestRequiredMap(TestRequiredMap other) : this() {
foo_ = other.foo_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public TestRequiredMap Clone() {
return new TestRequiredMap(this);
}
/// <summary>Field number for the "foo" field.</summary>
public const int FooFieldNumber = 1;
private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage>.Codec _map_foo_codec
= new pbc::MapField<int, global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage>.Codec(pb::FieldCodec.ForInt32(8, 0), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage.Parser), 10);
private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage> foo_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public pbc::MapField<int, global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Types.NestedMessage> Foo {
get { return foo_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as TestRequiredMap);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(TestRequiredMap other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (!Foo.Equals(other.Foo)) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
hash ^= Foo.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
foo_.WriteTo(output, _map_foo_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
size += foo_.CalculateSize(_map_foo_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(TestRequiredMap other) {
if (other == null) {
return;
}
foo_.Add(other.foo_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10: {
foo_.AddEntriesFrom(input, _map_foo_codec);
break;
}
}
}
}
#region Nested types
/// <summary>Container for nested types declared in the TestRequiredMap message type.</summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static partial class Types {
public sealed partial class NestedMessage : pb::IMessage<NestedMessage> {
private static readonly pb::MessageParser<NestedMessage> _parser = new pb::MessageParser<NestedMessage>(() => new NestedMessage());
private pb::UnknownFieldSet _unknownFields;
private int _hasBits0;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<NestedMessage> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.TestRequiredMap.Descriptor.NestedTypes[1]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public NestedMessage() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public NestedMessage(NestedMessage other) : this() {
_hasBits0 = other._hasBits0;
requiredInt32_ = other.requiredInt32_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public NestedMessage Clone() {
return new NestedMessage(this);
}
/// <summary>Field number for the "required_int32" field.</summary>
public const int RequiredInt32FieldNumber = 1;
private readonly static int RequiredInt32DefaultValue = 0;
private int requiredInt32_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int RequiredInt32 {
get { if ((_hasBits0 & 1) != 0) { return requiredInt32_; } else { return RequiredInt32DefaultValue; } }
set {
_hasBits0 |= 1;
requiredInt32_ = value;
}
}
/// <summary>Gets whether the "required_int32" field is set</summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool HasRequiredInt32 {
get { return (_hasBits0 & 1) != 0; }
}
/// <summary>Clears the value of the "required_int32" field</summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void ClearRequiredInt32() {
_hasBits0 &= ~1;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override bool Equals(object other) {
return Equals(other as NestedMessage);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public bool Equals(NestedMessage other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (RequiredInt32 != other.RequiredInt32) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override int GetHashCode() {
int hash = 1;
if (HasRequiredInt32) hash ^= RequiredInt32.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void WriteTo(pb::CodedOutputStream output) {
if (HasRequiredInt32) {
output.WriteRawTag(8);
output.WriteInt32(RequiredInt32);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public int CalculateSize() {
int size = 0;
if (HasRequiredInt32) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(RequiredInt32);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(NestedMessage other) {
if (other == null) {
return;
}
if (other.HasRequiredInt32) {
RequiredInt32 = other.RequiredInt32;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(pb::CodedInputStream input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 8: {
RequiredInt32 = input.ReadInt32();
break;
}
}
}
}
}
}
#endregion
}
public sealed partial class TestPackedTypes : pb::IMessage<TestPackedTypes> {
private static readonly pb::MessageParser<TestPackedTypes> _parser = new pb::MessageParser<TestPackedTypes>(() => new TestPackedTypes());
private pb::UnknownFieldSet _unknownFields;
......@@ -18156,7 +18434,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[47]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[48]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -18555,7 +18833,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[48]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[49]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -18951,7 +19229,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[49]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[50]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -19088,7 +19366,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[50]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[51]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -19230,7 +19508,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[51]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[52]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -19741,7 +20019,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[52]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[53]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -19987,7 +20265,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[53]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[54]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21157,7 +21435,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[54]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[55]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21304,7 +21582,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[55]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[56]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21405,7 +21683,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[56]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[57]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21506,7 +21784,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[57]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[58]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21607,7 +21885,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[58]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[59]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21708,7 +21986,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[59]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[60]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21809,7 +22087,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[60]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[61]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -21911,7 +22189,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[61]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[62]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -22261,7 +22539,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[62]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[63]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......@@ -23112,7 +23390,7 @@ namespace Google.Protobuf.TestProtos.Proto2 {
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[63]; }
get { return global::Google.Protobuf.TestProtos.Proto2.UnittestReflection.Descriptor.MessageTypes[64]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
......
......@@ -79,6 +79,8 @@ namespace Google.Protobuf
internal override Type TargetType => typeof(TTarget);
internal TValue DefaultValue => codec.DefaultValue;
internal override IExtensionValue CreateValue()
{
return new ExtensionValue<TValue>(codec);
......
......@@ -330,5 +330,10 @@ namespace Google.Protobuf
value.WriteTo(stream);
}
}
internal bool IsInitialized()
{
return ValuesByNumber.Values.All(v => v.IsInitialized());
}
}
}
......@@ -32,6 +32,7 @@
using Google.Protobuf.Collections;
using System;
using System.Linq;
namespace Google.Protobuf
{
......@@ -41,6 +42,7 @@ namespace Google.Protobuf
void MergeFrom(IExtensionValue value);
void WriteTo(CodedOutputStream output);
int CalculateSize();
bool IsInitialized();
}
internal sealed class ExtensionValue<T> : IExtensionValue
......@@ -137,6 +139,11 @@ namespace Google.Protobuf
}
public bool HasValue => hasValue;
public bool IsInitialized()
{
return HasValue && field is IMessage && (field as IMessage).IsInitialized();
}
}
internal sealed class RepeatedExtensionValue<T> : IExtensionValue
......@@ -203,5 +210,10 @@ namespace Google.Protobuf
}
public RepeatedField<T> GetValue() => field;
public bool IsInitialized()
{
return field.All(m => m is IMessage && (m as IMessage).IsInitialized());
}
}
}
......@@ -148,20 +148,33 @@ namespace Google.Protobuf
/// </summary>
public static bool IsInitialized(this IMessage message)
{
if (message.Descriptor.File.Proto.Syntax != "proto2")
if (message.Descriptor.File.Proto.Syntax == "proto3")
{
return true;
}
if (!message.Descriptor.GetIsExtensionsInitialized(message))
{
return false;
}
return message.Descriptor
.Fields
.InDeclarationOrder()
.All(f =>
{
if (f.IsMap)
{
var valueField = f.MessageType.Fields[2];
if (valueField.FieldType == FieldType.Message)
{
var map = (IDictionary)f.Accessor.GetValue(message);
return map.Values.OfType<IMessage>().All(IsInitialized);
return map.Values.Cast<IMessage>().All(IsInitialized);
}
else
{
return true;
}
}
else if (f.IsRepeated && f.FieldType == FieldType.Message || f.FieldType == FieldType.Group)
{
......
......@@ -34,6 +34,7 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
#if NET35
// Needed for ReadOnlyDictionary, which does not exist in .NET 3.5
using Google.Protobuf.Collections;
......@@ -63,6 +64,7 @@ namespace Google.Protobuf.Reflection
private readonly IList<FieldDescriptor> fieldsInDeclarationOrder;
private readonly IList<FieldDescriptor> fieldsInNumberOrder;
private readonly IDictionary<string, FieldDescriptor> jsonFieldMap;
private Func<IMessage, bool> extensionSetIsInitialized;
internal MessageDescriptor(DescriptorProto proto, FileDescriptor file, MessageDescriptor parent, int typeIndex, GeneratedClrTypeInfo generatedCodeInfo)
: base(file, file.ComputeFullName(parent, proto.Name), typeIndex)
......@@ -134,6 +136,26 @@ namespace Google.Protobuf.Reflection
internal DescriptorProto Proto { get; }
internal bool GetIsExtensionsInitialized(IMessage message)
{
if (!object.ReferenceEquals(message.Descriptor, this))
{
throw new InvalidOperationException("message's descriptor reference does not match this");
}
if (Proto.ExtensionRange.Count == 0)
{
return true;
}
if (extensionSetIsInitialized == null)
{
extensionSetIsInitialized = ReflectionUtil.CreateIsInitializedCaller(ClrType);
}
return extensionSetIsInitialized(message);
}
/// <summary>
/// The CLR type used to represent message instances from this descriptor.
/// </summary>
......
......@@ -71,7 +71,7 @@ namespace Google.Protobuf.Reflection
/// <summary>
/// Empty Type[] used when calling GetProperty to force property instead of indexer fetching.
/// </summary>
/// </summary>getFieldFunc
internal static readonly Type[] EmptyTypes = new Type[0];
/// <summary>
......@@ -115,6 +115,9 @@ namespace Google.Protobuf.Reflection
internal static Func<IMessage, bool> CreateFuncIMessageBool(MethodInfo method) =>
GetReflectionHelper(method.DeclaringType, method.ReturnType).CreateFuncIMessageBool(method);
internal static Func<IMessage, bool> CreateIsInitializedCaller(Type msg) =>
((IExtensionSetReflector)Activator.CreateInstance(typeof(ExtensionSetReflector<>).MakeGenericType(msg))).CreateIsInitializedCaller();
/// <summary>
/// Creates a delegate which will execute the given method after casting the first argument to
/// the type that declares the method, and the second argument to the first parameter type of the method.
......@@ -150,6 +153,11 @@ namespace Google.Protobuf.Reflection
void ClearExtension(IMessage message);
}
private interface IExtensionSetReflector
{
Func<IMessage, bool> CreateIsInitializedCaller();
}
private class ReflectionHelper<T1, T2> : IReflectionHelper
{
......@@ -300,6 +308,23 @@ namespace Google.Protobuf.Reflection
}
}
private class ExtensionSetReflector<T1> : IExtensionSetReflector where T1 : IExtendableMessage<T1>
{
public Func<IMessage, bool> CreateIsInitializedCaller()
{
var field = typeof(T1).GetTypeInfo().GetDeclaredField("_extensions");
var initializedFunc = (Func<ExtensionSet<T1>, bool>)
typeof(ExtensionSet<T1>)
.GetTypeInfo()
.GetDeclaredMethod("IsInitialized")
.CreateDelegate(typeof(Func<ExtensionSet<T1>, bool>));
return (m) => {
var set = field.GetValue(m) as ExtensionSet<T1>;
return set == null || initializedFunc(set);
};
}
}
// Runtime compatibility checking code - see ReflectionHelper<T1, T2>.CreateFuncIMessageInt32 for
// details about why we're doing this.
......
......@@ -57,20 +57,7 @@ namespace Google.Protobuf.Reflection
throw new ArgumentException("Not all required properties/methods available");
}
setValueDelegate = ReflectionUtil.CreateActionIMessageObject(property.GetSetMethod());
if (descriptor.File.Proto.Syntax == "proto2")
{
MethodInfo hasMethod = property.DeclaringType.GetRuntimeProperty("Has" + property.Name).GetMethod;
if (hasMethod == null) {
throw new ArgumentException("Not all required properties/methods are available");
}
hasDelegate = ReflectionUtil.CreateFuncIMessageBool(hasMethod);
MethodInfo clearMethod = property.DeclaringType.GetRuntimeMethod("Clear" + property.Name, ReflectionUtil.EmptyTypes);
if (clearMethod == null) {
throw new ArgumentException("Not all required properties/methods are available");
}
clearDelegate = ReflectionUtil.CreateActionIMessage(clearMethod);
}
else
if (descriptor.File.Proto.Syntax == "proto3")
{
hasDelegate = message => {
throw new InvalidOperationException("HasValue is not implemented for proto3 fields");
......@@ -85,6 +72,19 @@ namespace Google.Protobuf.Reflection
: Activator.CreateInstance(clrType);
clearDelegate = message => SetValue(message, defaultValue);
}
else
{
MethodInfo hasMethod = property.DeclaringType.GetRuntimeProperty("Has" + property.Name).GetMethod;
if (hasMethod == null) {
throw new ArgumentException("Not all required properties/methods are available");
}
hasDelegate = ReflectionUtil.CreateFuncIMessageBool(hasMethod);
MethodInfo clearMethod = property.DeclaringType.GetRuntimeMethod("Clear" + property.Name, ReflectionUtil.EmptyTypes);
if (clearMethod == null) {
throw new ArgumentException("Not all required properties/methods are available");
}
clearDelegate = ReflectionUtil.CreateActionIMessage(clearMethod);
}
}
public override void Clear(IMessage message)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment