diff --git a/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go b/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go index 35d699131..6ced62544 100644 --- a/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go +++ b/api/genpb/cerbos/policy/v1/hashpb_helpers.pb.go @@ -69,6 +69,19 @@ func cerbos_engine_v1_CheckInput_hashpb_sum(m *v1.CheckInput, hasher hash.Hash, } } +func cerbos_engine_v1_OutputEntry_hashpb_sum(m *v1.OutputEntry, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.engine.v1.OutputEntry.src"]; !ok { + _, _ = hasher.Write(protowire.AppendString(nil, m.Src)) + + } + if _, ok := ignore["cerbos.engine.v1.OutputEntry.val"]; !ok { + if m.Val != nil { + google_protobuf_Value_hashpb_sum(m.Val, hasher, ignore) + } + + } +} + func cerbos_engine_v1_Principal_hashpb_sum(m *v1.Principal, hasher hash.Hash, ignore map[string]struct{}) { if _, ok := ignore["cerbos.engine.v1.Principal.id"]; !ok { _, _ = hasher.Write(protowire.AppendString(nil, m.Id)) @@ -707,6 +720,63 @@ func cerbos_policy_v1_TestResults_Failure_hashpb_sum(m *TestResults_Failure, has _, _ = hasher.Write(protowire.AppendVarint(nil, uint64(m.Actual))) } + if _, ok := ignore["cerbos.policy.v1.TestResults.Failure.outputs"]; !ok { + if len(m.Outputs) > 0 { + for _, v := range m.Outputs { + if v != nil { + cerbos_policy_v1_TestResults_OutputFailure_hashpb_sum(v, hasher, ignore) + } + + } + } + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_MismatchedValue_hashpb_sum(m *TestResults_OutputFailure_MismatchedValue, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.expected"]; !ok { + if m.Expected != nil { + google_protobuf_Value_hashpb_sum(m.Expected, hasher, ignore) + } + + } + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.actual"]; !ok { + if m.Actual != nil { + google_protobuf_Value_hashpb_sum(m.Actual, hasher, ignore) + } + + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_MissingValue_hashpb_sum(m *TestResults_OutputFailure_MissingValue, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MissingValue.expected"]; !ok { + if m.Expected != nil { + google_protobuf_Value_hashpb_sum(m.Expected, hasher, ignore) + } + + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_hashpb_sum(m *TestResults_OutputFailure, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.src"]; !ok { + _, _ = hasher.Write(protowire.AppendString(nil, m.Src)) + + } + if m.Outcome != nil { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.outcome"]; !ok { + switch t := m.Outcome.(type) { + case *TestResults_OutputFailure_Mismatched: + if t.Mismatched != nil { + cerbos_policy_v1_TestResults_OutputFailure_MismatchedValue_hashpb_sum(t.Mismatched, hasher, ignore) + } + + case *TestResults_OutputFailure_Missing: + if t.Missing != nil { + cerbos_policy_v1_TestResults_OutputFailure_MissingValue_hashpb_sum(t.Missing, hasher, ignore) + } + + } + } + } } func cerbos_policy_v1_TestResults_Principal_hashpb_sum(m *TestResults_Principal, hasher hash.Hash, ignore map[string]struct{}) { @@ -974,6 +1044,16 @@ func cerbos_policy_v1_TestTable_Expectation_hashpb_sum(m *TestTable_Expectation, } } } + if _, ok := ignore["cerbos.policy.v1.TestTable.Expectation.outputs"]; !ok { + if len(m.Outputs) > 0 { + for _, v := range m.Outputs { + if v != nil { + cerbos_policy_v1_TestTable_OutputExpectations_hashpb_sum(v, hasher, ignore) + } + + } + } + } } func cerbos_policy_v1_TestTable_Input_hashpb_sum(m *TestTable_Input, hasher hash.Hash, ignore map[string]struct{}) { @@ -1007,6 +1087,23 @@ func cerbos_policy_v1_TestTable_Input_hashpb_sum(m *TestTable_Input, hasher hash } } +func cerbos_policy_v1_TestTable_OutputExpectations_hashpb_sum(m *TestTable_OutputExpectations, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestTable.OutputExpectations.action"]; !ok { + _, _ = hasher.Write(protowire.AppendString(nil, m.Action)) + + } + if _, ok := ignore["cerbos.policy.v1.TestTable.OutputExpectations.expected"]; !ok { + if len(m.Expected) > 0 { + for _, v := range m.Expected { + if v != nil { + cerbos_engine_v1_OutputEntry_hashpb_sum(v, hasher, ignore) + } + + } + } + } +} + func cerbos_policy_v1_TestTable_hashpb_sum(m *TestTable, hasher hash.Hash, ignore map[string]struct{}) { if _, ok := ignore["cerbos.policy.v1.TestTable.name"]; !ok { _, _ = hasher.Write(protowire.AppendString(nil, m.Name)) @@ -1048,6 +1145,28 @@ func cerbos_policy_v1_TestTable_hashpb_sum(m *TestTable, hasher hash.Hash, ignor } } +func cerbos_policy_v1_Test_OutputEntries_hashpb_sum(m *Test_OutputEntries, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.Test.OutputEntries.entries"]; !ok { + if len(m.Entries) > 0 { + keys := make([]string, len(m.Entries)) + i := 0 + for k := range m.Entries { + keys[i] = k + i++ + } + + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + + for _, k := range keys { + if m.Entries[k] != nil { + google_protobuf_Value_hashpb_sum(m.Entries[k], hasher, ignore) + } + + } + } + } +} + func cerbos_policy_v1_Test_TestName_hashpb_sum(m *Test_TestName, hasher hash.Hash, ignore map[string]struct{}) { if _, ok := ignore["cerbos.policy.v1.Test.TestName.test_table_name"]; !ok { _, _ = hasher.Write(protowire.AppendString(nil, m.TestTableName)) @@ -1111,6 +1230,25 @@ func cerbos_policy_v1_Test_hashpb_sum(m *Test, hasher hash.Hash, ignore map[stri } } + if _, ok := ignore["cerbos.policy.v1.Test.expected_outputs"]; !ok { + if len(m.ExpectedOutputs) > 0 { + keys := make([]string, len(m.ExpectedOutputs)) + i := 0 + for k := range m.ExpectedOutputs { + keys[i] = k + i++ + } + + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + + for _, k := range keys { + if m.ExpectedOutputs[k] != nil { + cerbos_policy_v1_Test_OutputEntries_hashpb_sum(m.ExpectedOutputs[k], hasher, ignore) + } + + } + } + } } func google_protobuf_ListValue_hashpb_sum(m *structpb.ListValue, hasher hash.Hash, ignore map[string]struct{}) { diff --git a/api/genpb/cerbos/policy/v1/policy.pb.go b/api/genpb/cerbos/policy/v1/policy.pb.go index 1a9e3fbae..afb4e9678 100644 --- a/api/genpb/cerbos/policy/v1/policy.pb.go +++ b/api/genpb/cerbos/policy/v1/policy.pb.go @@ -15,6 +15,7 @@ import ( _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" @@ -1313,13 +1314,14 @@ type Test struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name *Test_TestName `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - Skip bool `protobuf:"varint,3,opt,name=skip,proto3" json:"skip,omitempty"` - SkipReason string `protobuf:"bytes,4,opt,name=skip_reason,json=skipReason,proto3" json:"skip_reason,omitempty"` - Input *v11.CheckInput `protobuf:"bytes,5,opt,name=input,proto3" json:"input,omitempty"` - Expected map[string]v1.Effect `protobuf:"bytes,6,rep,name=expected,proto3" json:"expected,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=cerbos.effect.v1.Effect"` - Options *TestOptions `protobuf:"bytes,7,opt,name=options,proto3" json:"options,omitempty"` + Name *Test_TestName `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Skip bool `protobuf:"varint,3,opt,name=skip,proto3" json:"skip,omitempty"` + SkipReason string `protobuf:"bytes,4,opt,name=skip_reason,json=skipReason,proto3" json:"skip_reason,omitempty"` + Input *v11.CheckInput `protobuf:"bytes,5,opt,name=input,proto3" json:"input,omitempty"` + Expected map[string]v1.Effect `protobuf:"bytes,6,rep,name=expected,proto3" json:"expected,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=cerbos.effect.v1.Effect"` + Options *TestOptions `protobuf:"bytes,7,opt,name=options,proto3" json:"options,omitempty"` + ExpectedOutputs map[string]*Test_OutputEntries `protobuf:"bytes,8,rep,name=expected_outputs,json=expectedOutputs,proto3" json:"expected_outputs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Test) Reset() { @@ -1403,6 +1405,13 @@ func (x *Test) GetOptions() *TestOptions { return nil } +func (x *Test) GetExpectedOutputs() map[string]*Test_OutputEntries { + if x != nil { + return x.ExpectedOutputs + } + return nil +} + type TestResults struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1898,20 +1907,76 @@ func (x *TestTable_Input) GetAuxData() string { return "" } +type TestTable_OutputExpectations struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action string `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` + Expected []*v11.OutputEntry `protobuf:"bytes,2,rep,name=expected,proto3" json:"expected,omitempty"` +} + +func (x *TestTable_OutputExpectations) Reset() { + *x = TestTable_OutputExpectations{} + if protoimpl.UnsafeEnabled { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TestTable_OutputExpectations) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestTable_OutputExpectations) ProtoMessage() {} + +func (x *TestTable_OutputExpectations) ProtoReflect() protoreflect.Message { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestTable_OutputExpectations.ProtoReflect.Descriptor instead. +func (*TestTable_OutputExpectations) Descriptor() ([]byte, []int) { + return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{15, 1} +} + +func (x *TestTable_OutputExpectations) GetAction() string { + if x != nil { + return x.Action + } + return "" +} + +func (x *TestTable_OutputExpectations) GetExpected() []*v11.OutputEntry { + if x != nil { + return x.Expected + } + return nil +} + type TestTable_Expectation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Principal string `protobuf:"bytes,1,opt,name=principal,proto3" json:"principal,omitempty"` - Resource string `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` - Actions map[string]v1.Effect `protobuf:"bytes,3,rep,name=actions,proto3" json:"actions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=cerbos.effect.v1.Effect"` + Principal string `protobuf:"bytes,1,opt,name=principal,proto3" json:"principal,omitempty"` + Resource string `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` + Actions map[string]v1.Effect `protobuf:"bytes,3,rep,name=actions,proto3" json:"actions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=cerbos.effect.v1.Effect"` + Outputs []*TestTable_OutputExpectations `protobuf:"bytes,4,rep,name=outputs,proto3" json:"outputs,omitempty"` } func (x *TestTable_Expectation) Reset() { *x = TestTable_Expectation{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[34] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1924,7 +1989,7 @@ func (x *TestTable_Expectation) String() string { func (*TestTable_Expectation) ProtoMessage() {} func (x *TestTable_Expectation) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[34] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1937,7 +2002,7 @@ func (x *TestTable_Expectation) ProtoReflect() protoreflect.Message { // Deprecated: Use TestTable_Expectation.ProtoReflect.Descriptor instead. func (*TestTable_Expectation) Descriptor() ([]byte, []int) { - return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{15, 1} + return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{15, 2} } func (x *TestTable_Expectation) GetPrincipal() string { @@ -1961,6 +2026,13 @@ func (x *TestTable_Expectation) GetActions() map[string]v1.Effect { return nil } +func (x *TestTable_Expectation) GetOutputs() []*TestTable_OutputExpectations { + if x != nil { + return x.Outputs + } + return nil +} + type Test_TestName struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1974,7 +2046,7 @@ type Test_TestName struct { func (x *Test_TestName) Reset() { *x = Test_TestName{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[36] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1987,7 +2059,7 @@ func (x *Test_TestName) String() string { func (*Test_TestName) ProtoMessage() {} func (x *Test_TestName) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[36] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2024,6 +2096,53 @@ func (x *Test_TestName) GetResourceKey() string { return "" } +type Test_OutputEntries struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Entries map[string]*structpb.Value `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Test_OutputEntries) Reset() { + *x = Test_OutputEntries{} + if protoimpl.UnsafeEnabled { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Test_OutputEntries) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Test_OutputEntries) ProtoMessage() {} + +func (x *Test_OutputEntries) ProtoReflect() protoreflect.Message { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Test_OutputEntries.ProtoReflect.Descriptor instead. +func (*Test_OutputEntries) Descriptor() ([]byte, []int) { + return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{16, 1} +} + +func (x *Test_OutputEntries) GetEntries() map[string]*structpb.Value { + if x != nil { + return x.Entries + } + return nil +} + type TestResults_Tally struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2036,7 +2155,7 @@ type TestResults_Tally struct { func (x *TestResults_Tally) Reset() { *x = TestResults_Tally{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[38] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2049,7 +2168,7 @@ func (x *TestResults_Tally) String() string { func (*TestResults_Tally) ProtoMessage() {} func (x *TestResults_Tally) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[38] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2092,7 +2211,7 @@ type TestResults_Summary struct { func (x *TestResults_Summary) Reset() { *x = TestResults_Summary{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[39] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2105,7 +2224,7 @@ func (x *TestResults_Summary) String() string { func (*TestResults_Summary) ProtoMessage() {} func (x *TestResults_Summary) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[39] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2160,7 +2279,7 @@ type TestResults_Suite struct { func (x *TestResults_Suite) Reset() { *x = TestResults_Suite{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[40] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2173,7 +2292,7 @@ func (x *TestResults_Suite) String() string { func (*TestResults_Suite) ProtoMessage() {} func (x *TestResults_Suite) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[40] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2251,7 +2370,7 @@ type TestResults_TestCase struct { func (x *TestResults_TestCase) Reset() { *x = TestResults_TestCase{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[41] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2264,7 +2383,7 @@ func (x *TestResults_TestCase) String() string { func (*TestResults_TestCase) ProtoMessage() {} func (x *TestResults_TestCase) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[41] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2306,7 +2425,7 @@ type TestResults_Principal struct { func (x *TestResults_Principal) Reset() { *x = TestResults_Principal{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[42] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2319,7 +2438,7 @@ func (x *TestResults_Principal) String() string { func (*TestResults_Principal) ProtoMessage() {} func (x *TestResults_Principal) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[42] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2361,7 +2480,7 @@ type TestResults_Resource struct { func (x *TestResults_Resource) Reset() { *x = TestResults_Resource{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[43] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2374,7 +2493,7 @@ func (x *TestResults_Resource) String() string { func (*TestResults_Resource) ProtoMessage() {} func (x *TestResults_Resource) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[43] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2416,7 +2535,7 @@ type TestResults_Action struct { func (x *TestResults_Action) Reset() { *x = TestResults_Action{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[44] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2429,7 +2548,7 @@ func (x *TestResults_Action) String() string { func (*TestResults_Action) ProtoMessage() {} func (x *TestResults_Action) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[44] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2476,7 +2595,7 @@ type TestResults_Details struct { func (x *TestResults_Details) Reset() { *x = TestResults_Details{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[45] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2489,7 +2608,7 @@ func (x *TestResults_Details) String() string { func (*TestResults_Details) ProtoMessage() {} func (x *TestResults_Details) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[45] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2556,19 +2675,109 @@ func (*TestResults_Details_Failure) isTestResults_Details_Outcome() {} func (*TestResults_Details_Error) isTestResults_Details_Outcome() {} +type TestResults_OutputFailure struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Src string `protobuf:"bytes,1,opt,name=src,proto3" json:"src,omitempty"` + // Types that are assignable to Outcome: + // + // *TestResults_OutputFailure_Mismatched + // *TestResults_OutputFailure_Missing + Outcome isTestResults_OutputFailure_Outcome `protobuf_oneof:"outcome"` +} + +func (x *TestResults_OutputFailure) Reset() { + *x = TestResults_OutputFailure{} + if protoimpl.UnsafeEnabled { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TestResults_OutputFailure) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestResults_OutputFailure) ProtoMessage() {} + +func (x *TestResults_OutputFailure) ProtoReflect() protoreflect.Message { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestResults_OutputFailure.ProtoReflect.Descriptor instead. +func (*TestResults_OutputFailure) Descriptor() ([]byte, []int) { + return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{17, 8} +} + +func (x *TestResults_OutputFailure) GetSrc() string { + if x != nil { + return x.Src + } + return "" +} + +func (m *TestResults_OutputFailure) GetOutcome() isTestResults_OutputFailure_Outcome { + if m != nil { + return m.Outcome + } + return nil +} + +func (x *TestResults_OutputFailure) GetMismatched() *TestResults_OutputFailure_MismatchedValue { + if x, ok := x.GetOutcome().(*TestResults_OutputFailure_Mismatched); ok { + return x.Mismatched + } + return nil +} + +func (x *TestResults_OutputFailure) GetMissing() *TestResults_OutputFailure_MissingValue { + if x, ok := x.GetOutcome().(*TestResults_OutputFailure_Missing); ok { + return x.Missing + } + return nil +} + +type isTestResults_OutputFailure_Outcome interface { + isTestResults_OutputFailure_Outcome() +} + +type TestResults_OutputFailure_Mismatched struct { + Mismatched *TestResults_OutputFailure_MismatchedValue `protobuf:"bytes,2,opt,name=mismatched,proto3,oneof"` +} + +type TestResults_OutputFailure_Missing struct { + Missing *TestResults_OutputFailure_MissingValue `protobuf:"bytes,3,opt,name=missing,proto3,oneof"` +} + +func (*TestResults_OutputFailure_Mismatched) isTestResults_OutputFailure_Outcome() {} + +func (*TestResults_OutputFailure_Missing) isTestResults_OutputFailure_Outcome() {} + type TestResults_Failure struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Expected v1.Effect `protobuf:"varint,1,opt,name=expected,proto3,enum=cerbos.effect.v1.Effect" json:"expected,omitempty"` - Actual v1.Effect `protobuf:"varint,2,opt,name=actual,proto3,enum=cerbos.effect.v1.Effect" json:"actual,omitempty"` + Expected v1.Effect `protobuf:"varint,1,opt,name=expected,proto3,enum=cerbos.effect.v1.Effect" json:"expected,omitempty"` + Actual v1.Effect `protobuf:"varint,2,opt,name=actual,proto3,enum=cerbos.effect.v1.Effect" json:"actual,omitempty"` + Outputs []*TestResults_OutputFailure `protobuf:"bytes,3,rep,name=outputs,proto3" json:"outputs,omitempty"` } func (x *TestResults_Failure) Reset() { *x = TestResults_Failure{} if protoimpl.UnsafeEnabled { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[46] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2581,7 +2790,7 @@ func (x *TestResults_Failure) String() string { func (*TestResults_Failure) ProtoMessage() {} func (x *TestResults_Failure) ProtoReflect() protoreflect.Message { - mi := &file_cerbos_policy_v1_policy_proto_msgTypes[46] + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2594,7 +2803,7 @@ func (x *TestResults_Failure) ProtoReflect() protoreflect.Message { // Deprecated: Use TestResults_Failure.ProtoReflect.Descriptor instead. func (*TestResults_Failure) Descriptor() ([]byte, []int) { - return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{17, 8} + return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{17, 9} } func (x *TestResults_Failure) GetExpected() v1.Effect { @@ -2611,6 +2820,115 @@ func (x *TestResults_Failure) GetActual() v1.Effect { return v1.Effect(0) } +func (x *TestResults_Failure) GetOutputs() []*TestResults_OutputFailure { + if x != nil { + return x.Outputs + } + return nil +} + +type TestResults_OutputFailure_MismatchedValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Expected *structpb.Value `protobuf:"bytes,1,opt,name=expected,proto3" json:"expected,omitempty"` + Actual *structpb.Value `protobuf:"bytes,2,opt,name=actual,proto3" json:"actual,omitempty"` +} + +func (x *TestResults_OutputFailure_MismatchedValue) Reset() { + *x = TestResults_OutputFailure_MismatchedValue{} + if protoimpl.UnsafeEnabled { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TestResults_OutputFailure_MismatchedValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestResults_OutputFailure_MismatchedValue) ProtoMessage() {} + +func (x *TestResults_OutputFailure_MismatchedValue) ProtoReflect() protoreflect.Message { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestResults_OutputFailure_MismatchedValue.ProtoReflect.Descriptor instead. +func (*TestResults_OutputFailure_MismatchedValue) Descriptor() ([]byte, []int) { + return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{17, 8, 0} +} + +func (x *TestResults_OutputFailure_MismatchedValue) GetExpected() *structpb.Value { + if x != nil { + return x.Expected + } + return nil +} + +func (x *TestResults_OutputFailure_MismatchedValue) GetActual() *structpb.Value { + if x != nil { + return x.Actual + } + return nil +} + +type TestResults_OutputFailure_MissingValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Expected *structpb.Value `protobuf:"bytes,1,opt,name=expected,proto3" json:"expected,omitempty"` +} + +func (x *TestResults_OutputFailure_MissingValue) Reset() { + *x = TestResults_OutputFailure_MissingValue{} + if protoimpl.UnsafeEnabled { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TestResults_OutputFailure_MissingValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestResults_OutputFailure_MissingValue) ProtoMessage() {} + +func (x *TestResults_OutputFailure_MissingValue) ProtoReflect() protoreflect.Message { + mi := &file_cerbos_policy_v1_policy_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TestResults_OutputFailure_MissingValue.ProtoReflect.Descriptor instead. +func (*TestResults_OutputFailure_MissingValue) Descriptor() ([]byte, []int) { + return file_cerbos_policy_v1_policy_proto_rawDescGZIP(), []int{17, 8, 1} +} + +func (x *TestResults_OutputFailure_MissingValue) GetExpected() *structpb.Value { + if x != nil { + return x.Expected + } + return nil +} + var File_cerbos_policy_v1_policy_proto protoreflect.FileDescriptor var file_cerbos_policy_v1_policy_proto_rawDesc = []byte{ @@ -2621,500 +2939,568 @@ var file_cerbos_policy_v1_policy_proto_rawDesc = []byte{ 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb6, 0x04, 0x0a, 0x06, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, - 0x0a, 0x11, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x64, 0x65, 0x76, - 0x2f, 0x76, 0x31, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x4e, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, - 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, - 0x00, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x45, 0x0a, 0x0d, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x65, 0x72, 0x62, - 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x72, - 0x69, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x72, - 0x69, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x76, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, - 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x12, - 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x12, 0x03, 0xf8, - 0x42, 0x01, 0x22, 0xc4, 0x02, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x4d, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x30, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x65, 0x72, 0x12, 0x29, - 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x03, 0x0a, 0x0e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x66, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4a, - 0xfa, 0x42, 0x47, 0x72, 0x45, 0x10, 0x01, 0x32, 0x41, 0x5e, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, - 0x5c, 0x2e, 0x5c, 0x2d, 0x2f, 0x5d, 0x2a, 0x28, 0x5c, 0x3a, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, - 0x5c, 0x2e, 0x5c, 0x2d, 0x2f, 0x5d, 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xfa, 0x42, 0x11, 0x72, 0x0f, 0x32, 0x0d, 0x5e, 0x5b, - 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2b, 0x24, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x14, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x64, - 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x1f, 0xfa, 0x42, 0x1c, 0x92, 0x01, 0x19, 0x18, 0x01, 0x22, 0x15, 0x72, 0x13, - 0x32, 0x11, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, - 0x5d, 0x2b, 0x24, 0x52, 0x12, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x72, 0x69, 0x76, - 0x65, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x4c, 0x0a, - 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, 0xfa, 0x42, - 0x33, 0x72, 0x31, 0x32, 0x2f, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x3a, - 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5d, 0x2a, 0x28, - 0x5c, 0x2e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5d, 0x2a, 0x29, - 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb6, 0x04, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x0a, 0x11, + 0x61, 0x70, 0x69, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x76, + 0x31, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x22, 0xa5, 0x03, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, 0x18, 0x01, 0x22, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, - 0x0d, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x42, 0x1f, 0xfa, 0x42, 0x1c, 0x92, 0x01, 0x19, 0x18, 0x01, 0x22, 0x15, - 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, - 0x5c, 0x2e, 0x5d, 0x2b, 0x24, 0x52, 0x0c, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x24, 0xfa, 0x42, 0x21, 0x92, 0x01, 0x1e, 0x18, 0x01, 0x22, 0x1a, 0x72, 0x18, - 0x32, 0x16, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, - 0x2e, 0x5d, 0x2b, 0x7c, 0x5c, 0x2a, 0x29, 0x24, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, - 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x18, 0x01, 0x18, 0x02, - 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, - 0x28, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, - 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, 0x5c, 0x2e, 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x24, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xae, 0x02, 0x0a, 0x0f, 0x50, 0x72, 0x69, - 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x66, 0x0a, 0x09, - 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x48, 0xfa, 0x42, 0x45, 0x72, 0x43, 0x10, 0x01, 0x32, 0x3f, 0x5e, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, - 0x40, 0x5c, 0x2e, 0x5c, 0x2d, 0x5d, 0x2a, 0x28, 0x5c, 0x3a, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, - 0x5c, 0x2e, 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xfa, 0x42, 0x11, 0x72, 0x0f, 0x32, 0x0d, 0x5e, 0x5b, - 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2b, 0x24, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x00, + 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x4e, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x00, 0x52, + 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x45, 0x0a, 0x0d, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x72, 0x69, 0x76, + 0x65, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x72, 0x69, 0x76, + 0x65, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x3c, + 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x12, 0x0a, 0x0b, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x12, 0x03, 0xf8, 0x42, 0x01, + 0x22, 0xc4, 0x02, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x4d, + 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, + 0x2b, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x03, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x66, 0x0a, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4a, 0xfa, 0x42, + 0x47, 0x72, 0x45, 0x10, 0x01, 0x32, 0x41, 0x5e, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, 0x5c, 0x2e, + 0x5c, 0x2d, 0x2f, 0x5d, 0x2a, 0x28, 0x5c, 0x3a, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, 0x5c, 0x2e, + 0x5c, 0x2d, 0x2f, 0x5d, 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x14, 0xfa, 0x42, 0x11, 0x72, 0x0f, 0x32, 0x0d, 0x5e, 0x5b, 0x5b, 0x3a, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2b, 0x24, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x14, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x72, + 0x69, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x1f, 0xfa, 0x42, 0x1c, 0x92, 0x01, 0x19, 0x18, 0x01, 0x22, 0x15, 0x72, 0x13, 0x32, 0x11, + 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, 0x2b, + 0x24, 0x52, 0x12, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x05, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, 0xfa, 0x42, 0x33, 0x72, + 0x63, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, 0xfa, 0x42, 0x33, 0x72, 0x31, 0x32, 0x2f, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5d, 0x2a, 0x28, 0x5c, 0x2e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x29, - 0x2a, 0x24, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x95, 0x03, 0x0a, 0x0d, 0x50, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x4a, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x2a, 0x24, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0xa5, + 0x03, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, + 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, 0x18, 0x01, 0x22, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x64, + 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x42, 0x1f, 0xfa, 0x42, 0x1c, 0x92, 0x01, 0x19, 0x18, 0x01, 0x22, 0x15, 0x72, 0x13, + 0x32, 0x11, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, + 0x5d, 0x2b, 0x24, 0x52, 0x0c, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x12, 0x3a, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x24, 0xfa, 0x42, 0x21, 0x92, 0x01, 0x1e, 0x18, 0x01, 0x22, 0x1a, 0x72, 0x18, 0x32, 0x16, + 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, + 0x2b, 0x7c, 0x5c, 0x2a, 0x29, 0x24, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x39, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x18, 0x01, 0x18, 0x02, 0x52, 0x06, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x28, 0x5b, + 0x5b, 0x3a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x5d, 0x5c, 0x40, 0x5c, 0x2e, 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xae, 0x02, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x66, 0x0a, 0x09, 0x70, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x48, 0xfa, + 0x42, 0x45, 0x72, 0x43, 0x10, 0x01, 0x32, 0x3f, 0x5e, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, 0x5c, + 0x2e, 0x5c, 0x2d, 0x5d, 0x2a, 0x28, 0x5c, 0x3a, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, 0x5c, 0x2e, + 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x14, 0xfa, 0x42, 0x11, 0x72, 0x0f, 0x32, 0x0d, 0x5e, 0x5b, 0x5b, 0x3a, + 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5d, 0x2b, 0x24, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x75, - 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, - 0x02, 0x08, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x92, 0x02, 0x0a, - 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x42, 0x0a, 0xfa, - 0x42, 0x07, 0x82, 0x01, 0x04, 0x18, 0x01, 0x18, 0x02, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x28, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, - 0x5c, 0x2e, 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x30, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x1a, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x10, 0x01, 0x32, 0x11, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, - 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x44, - 0x65, 0x66, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0b, 0x64, 0x65, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x07, 0x52, 0x6f, - 0x6c, 0x65, 0x44, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5b, 0x3a, - 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x42, 0x23, 0x92, 0x01, - 0x20, 0x08, 0x01, 0x18, 0x01, 0x22, 0x1a, 0x72, 0x18, 0x32, 0x16, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, - 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, 0x2b, 0x7c, 0x5c, 0x2a, 0x29, - 0x24, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x39, - 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x68, 0x0a, 0x09, 0x43, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, - 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x42, 0x10, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x03, - 0xf8, 0x42, 0x01, 0x22, 0x8b, 0x02, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x34, 0x0a, - 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, - 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, - 0x61, 0x6c, 0x6c, 0x12, 0x34, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x4c, 0x69, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x12, 0x36, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x2e, 0x45, 0x78, 0x70, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x6e, - 0x65, 0x12, 0x14, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x3d, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x72, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x02, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, - 0x08, 0x01, 0x52, 0x02, 0x6f, 0x66, 0x42, 0x09, 0x0a, 0x02, 0x6f, 0x70, 0x12, 0x03, 0xf8, 0x42, - 0x01, 0x22, 0x1c, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, - 0x78, 0x70, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, - 0xc7, 0x02, 0x0a, 0x07, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x70, - 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, - 0x61, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x1a, 0x38, 0x0a, 0x0a, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x57, 0x68, 0x65, - 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, 0x18, 0x01, 0x22, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6a, 0x0a, - 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x19, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x72, - 0x65, 0x66, 0x12, 0x45, 0x0a, 0x0b, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x77, 0x68, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x73, 0x2e, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x57, 0x68, 0x65, 0x6e, 0x52, 0x0a, 0x69, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x57, 0x68, 0x65, 0x6e, 0x22, 0xc2, 0x04, 0x0a, 0x0b, 0x54, 0x65, - 0x73, 0x74, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x1a, 0xc2, 0x01, 0x0a, 0x0a, 0x50, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, - 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x63, - 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, - 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, - 0x6c, 0x73, 0x1a, 0x5a, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, - 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xbb, - 0x01, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x09, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x1a, 0x58, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xaf, 0x01, 0x0a, - 0x07, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x08, 0x61, 0x75, 0x78, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x65, 0x72, - 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, - 0x61, 0x2e, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x61, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x55, 0x0a, 0x0c, 0x41, 0x75, 0x78, 0x44, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, - 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x78, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3b, - 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, - 0x03, 0x6e, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x6e, 0x6f, 0x77, 0x22, 0xde, 0x05, 0x0a, 0x09, - 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, - 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, - 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, - 0x02, 0x08, 0x01, 0x52, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x70, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x05, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, 0xfa, 0x42, 0x33, 0x72, 0x31, 0x32, + 0x2f, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5d, 0x2a, 0x28, 0x5c, 0x2e, 0x5b, 0x5b, + 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x29, 0x2a, 0x24, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x95, 0x03, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, + 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, + 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x92, 0x02, 0x0a, 0x06, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x42, 0x0a, 0xfa, 0x42, 0x07, + 0x82, 0x01, 0x04, 0x18, 0x01, 0x18, 0x02, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, + 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xfa, + 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x3a, 0x5d, 0x5d, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x40, 0x5c, 0x2e, + 0x5c, 0x2d, 0x5d, 0x2a, 0x29, 0x2a, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x85, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x12, 0x2e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, + 0xfa, 0x42, 0x17, 0x72, 0x15, 0x10, 0x01, 0x32, 0x11, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, 0x72, + 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x45, 0x0a, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x66, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x07, 0x52, 0x6f, 0x6c, 0x65, + 0x44, 0x65, 0x66, 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x18, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x42, 0x23, 0x92, 0x01, 0x20, 0x08, + 0x01, 0x18, 0x01, 0x22, 0x1a, 0x72, 0x18, 0x32, 0x16, 0x5e, 0x28, 0x5b, 0x5b, 0x3a, 0x77, 0x6f, + 0x72, 0x64, 0x3a, 0x5d, 0x5c, 0x2d, 0x5c, 0x2e, 0x5d, 0x2b, 0x7c, 0x5c, 0x2a, 0x29, 0x24, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x68, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x05, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x42, + 0x10, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x03, 0xf8, 0x42, + 0x01, 0x22, 0x8b, 0x02, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x34, 0x0a, 0x03, 0x61, + 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6c, + 0x6c, 0x12, 0x34, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, - 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x69, - 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x65, 0x72, + 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x12, 0x36, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x45, + 0x78, 0x70, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, + 0x14, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x04, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x3d, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x31, 0x0a, 0x02, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, + 0x52, 0x02, 0x6f, 0x66, 0x42, 0x09, 0x0a, 0x02, 0x6f, 0x70, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, + 0x1c, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x78, 0x70, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x22, 0xc7, 0x02, + 0x0a, 0x07, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x70, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x1a, 0x38, 0x0a, 0x0a, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x57, 0x68, 0x65, 0x6e, 0x12, + 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, 0x18, 0x01, 0x22, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6a, 0x0a, 0x06, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x19, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x72, 0x65, 0x66, + 0x12, 0x45, 0x0a, 0x0b, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2e, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x57, 0x68, 0x65, 0x6e, 0x52, 0x0a, 0x69, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x57, 0x68, 0x65, 0x6e, 0x22, 0xc2, 0x04, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, + 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x1a, 0xc2, 0x01, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x12, 0x43, 0x0a, 0x08, 0x61, 0x75, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, - 0x2e, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, - 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x5a, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x73, 0x74, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, + 0x1a, 0x5a, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xbb, 0x01, 0x0a, + 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x09, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x1a, 0x58, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0c, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xaf, 0x01, 0x0a, 0x07, 0x41, + 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x08, 0x61, 0x75, 0x78, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x2e, + 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, 0x75, + 0x78, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x55, 0x0a, 0x0c, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, 0x06, 0x0a, - 0x09, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, - 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x1f, 0x0a, - 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x41, - 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x4d, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, + 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3b, 0x0a, 0x0b, + 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x03, 0x6e, + 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x6e, 0x6f, 0x77, 0x22, 0xde, 0x05, 0x0a, 0x09, 0x54, 0x65, + 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x05, 0x74, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, + 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, + 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, + 0x01, 0x52, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, + 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x53, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, + 0x43, 0x0a, 0x08, 0x61, 0x75, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x41, + 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, 0x75, 0x78, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5a, 0x0a, + 0x0f, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0c, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd5, 0x07, 0x0a, 0x09, 0x54, + 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x05, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x65, + 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x4d, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x45, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, + 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x37, + 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xb0, 0x01, 0x0a, 0x05, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, 0x18, + 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, + 0x18, 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, 0x18, 0x01, + 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x75, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x7a, 0x0a, 0x12, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1f, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x43, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0xd9, 0x02, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0x9a, 0x01, + 0x08, 0x08, 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x48, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x2e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xb0, 0x01, 0x0a, 0x05, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, - 0x01, 0x18, 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, - 0x08, 0x01, 0x18, 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x92, 0x01, 0x0a, 0x08, 0x01, - 0x18, 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x8f, 0x02, 0x0a, - 0x0b, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x09, - 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x65, 0x72, 0x62, + 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x1a, 0x54, 0x0a, 0x0c, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xc9, 0x07, 0x0a, 0x04, 0x54, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, - 0x0e, 0xfa, 0x42, 0x0b, 0x9a, 0x01, 0x08, 0x08, 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x54, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, - 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, - 0x04, 0x0a, 0x04, 0x54, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, - 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, - 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x50, 0x0a, 0x08, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x6b, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x12, 0x3c, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x50, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0x9a, 0x01, 0x08, 0x08, + 0x01, 0x22, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x56, 0x0a, 0x10, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x73, 0x1a, 0x95, 0x01, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2f, 0x0a, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2c, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2a, + 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x1a, 0xb0, 0x01, 0x0a, 0x0d, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x07, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, + 0x0d, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x68, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0x9a, 0x01, 0x08, 0x08, 0x01, 0x22, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x37, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb0, + 0x10, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3b, + 0x0a, 0x06, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x95, 0x01, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, - 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x1a, 0x55, - 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x0c, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x52, 0x06, 0x73, 0x75, 0x69, 0x74, - 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x2e, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x1a, 0x5b, 0x0a, 0x05, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, + 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x52, 0x06, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x1a, 0xc1, 0x01, 0x0a, 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x4b, 0x0a, 0x0e, - 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0d, 0x6f, 0x76, 0x65, 0x72, - 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x73, - 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x74, 0x65, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0d, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x2e, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x1a, 0xbc, 0x02, 0x0a, 0x05, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, + 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x1a, 0x5b, 0x0a, 0x05, + 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xc1, 0x01, 0x0a, 0x07, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x4b, 0x0a, 0x0e, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, + 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x52, 0x0d, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, - 0x61, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x0a, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, 0x09, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x67, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x52, + 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0xbc, 0x02, + 0x0a, 0x05, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x4b, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, - 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x1a, 0x65, 0x0a, 0x09, - 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, - 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, + 0x09, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x67, 0x0a, 0x08, + 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0a, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x1a, 0x5e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x5d, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x1a, 0xe9, 0x01, 0x0a, 0x07, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3c, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, - 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x41, 0x0a, 0x07, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x73, 0x1a, 0x65, 0x0a, 0x09, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0x5e, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x07, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x46, 0x61, 0x69, - 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, - 0x16, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x0c, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x54, 0x72, - 0x61, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0x71, - 0x0a, 0x07, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, - 0x30, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, - 0x6c, 0x22, 0x6e, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x52, + 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5d, 0x0a, 0x06, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, + 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0xe9, 0x01, 0x0a, 0x07, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x41, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, + 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x3a, 0x0a, 0x0c, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, + 0x0b, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x54, 0x72, 0x61, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, + 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0x9c, 0x03, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x72, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x72, 0x63, 0x12, 0x5d, 0x0a, 0x0a, 0x6d, + 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x4d, 0x69, 0x73, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0a, + 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x07, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x63, 0x65, + 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x1a, 0x75, 0x0a, 0x0f, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x1a, 0x42, 0x0a, 0x0c, 0x4d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x6f, + 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0xb8, 0x01, 0x0a, 0x07, 0x46, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x08, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x75, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x2e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x52, 0x06, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x12, 0x45, 0x0a, 0x07, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x65, + 0x72, 0x62, 0x6f, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x73, 0x22, 0x6e, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x53, 0x55, 0x4c, @@ -3144,64 +3530,73 @@ func file_cerbos_policy_v1_policy_proto_rawDescGZIP() []byte { } var file_cerbos_policy_v1_policy_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_cerbos_policy_v1_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 47) +var file_cerbos_policy_v1_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 54) var file_cerbos_policy_v1_policy_proto_goTypes = []interface{}{ - (TestResults_Result)(0), // 0: cerbos.policy.v1.TestResults.Result - (*Policy)(nil), // 1: cerbos.policy.v1.Policy - (*Metadata)(nil), // 2: cerbos.policy.v1.Metadata - (*ResourcePolicy)(nil), // 3: cerbos.policy.v1.ResourcePolicy - (*ResourceRule)(nil), // 4: cerbos.policy.v1.ResourceRule - (*PrincipalPolicy)(nil), // 5: cerbos.policy.v1.PrincipalPolicy - (*PrincipalRule)(nil), // 6: cerbos.policy.v1.PrincipalRule - (*DerivedRoles)(nil), // 7: cerbos.policy.v1.DerivedRoles - (*RoleDef)(nil), // 8: cerbos.policy.v1.RoleDef - (*Condition)(nil), // 9: cerbos.policy.v1.Condition - (*Match)(nil), // 10: cerbos.policy.v1.Match - (*Output)(nil), // 11: cerbos.policy.v1.Output - (*Schemas)(nil), // 12: cerbos.policy.v1.Schemas - (*TestFixture)(nil), // 13: cerbos.policy.v1.TestFixture - (*TestOptions)(nil), // 14: cerbos.policy.v1.TestOptions - (*TestSuite)(nil), // 15: cerbos.policy.v1.TestSuite - (*TestTable)(nil), // 16: cerbos.policy.v1.TestTable - (*Test)(nil), // 17: cerbos.policy.v1.Test - (*TestResults)(nil), // 18: cerbos.policy.v1.TestResults - nil, // 19: cerbos.policy.v1.Policy.VariablesEntry - nil, // 20: cerbos.policy.v1.Metadata.AnnotationsEntry - (*PrincipalRule_Action)(nil), // 21: cerbos.policy.v1.PrincipalRule.Action - (*Match_ExprList)(nil), // 22: cerbos.policy.v1.Match.ExprList - (*Schemas_IgnoreWhen)(nil), // 23: cerbos.policy.v1.Schemas.IgnoreWhen - (*Schemas_Schema)(nil), // 24: cerbos.policy.v1.Schemas.Schema - (*TestFixture_Principals)(nil), // 25: cerbos.policy.v1.TestFixture.Principals - (*TestFixture_Resources)(nil), // 26: cerbos.policy.v1.TestFixture.Resources - (*TestFixture_AuxData)(nil), // 27: cerbos.policy.v1.TestFixture.AuxData - nil, // 28: cerbos.policy.v1.TestFixture.Principals.PrincipalsEntry - nil, // 29: cerbos.policy.v1.TestFixture.Resources.ResourcesEntry - nil, // 30: cerbos.policy.v1.TestFixture.AuxData.AuxDataEntry - nil, // 31: cerbos.policy.v1.TestSuite.PrincipalsEntry - nil, // 32: cerbos.policy.v1.TestSuite.ResourcesEntry - nil, // 33: cerbos.policy.v1.TestSuite.AuxDataEntry - (*TestTable_Input)(nil), // 34: cerbos.policy.v1.TestTable.Input - (*TestTable_Expectation)(nil), // 35: cerbos.policy.v1.TestTable.Expectation - nil, // 36: cerbos.policy.v1.TestTable.Expectation.ActionsEntry - (*Test_TestName)(nil), // 37: cerbos.policy.v1.Test.TestName - nil, // 38: cerbos.policy.v1.Test.ExpectedEntry - (*TestResults_Tally)(nil), // 39: cerbos.policy.v1.TestResults.Tally - (*TestResults_Summary)(nil), // 40: cerbos.policy.v1.TestResults.Summary - (*TestResults_Suite)(nil), // 41: cerbos.policy.v1.TestResults.Suite - (*TestResults_TestCase)(nil), // 42: cerbos.policy.v1.TestResults.TestCase - (*TestResults_Principal)(nil), // 43: cerbos.policy.v1.TestResults.Principal - (*TestResults_Resource)(nil), // 44: cerbos.policy.v1.TestResults.Resource - (*TestResults_Action)(nil), // 45: cerbos.policy.v1.TestResults.Action - (*TestResults_Details)(nil), // 46: cerbos.policy.v1.TestResults.Details - (*TestResults_Failure)(nil), // 47: cerbos.policy.v1.TestResults.Failure - (*wrapperspb.UInt64Value)(nil), // 48: google.protobuf.UInt64Value - (v1.Effect)(0), // 49: cerbos.effect.v1.Effect - (*timestamppb.Timestamp)(nil), // 50: google.protobuf.Timestamp - (*v11.CheckInput)(nil), // 51: cerbos.engine.v1.CheckInput - (*v11.Principal)(nil), // 52: cerbos.engine.v1.Principal - (*v11.Resource)(nil), // 53: cerbos.engine.v1.Resource - (*v11.AuxData)(nil), // 54: cerbos.engine.v1.AuxData - (*v11.Trace)(nil), // 55: cerbos.engine.v1.Trace + (TestResults_Result)(0), // 0: cerbos.policy.v1.TestResults.Result + (*Policy)(nil), // 1: cerbos.policy.v1.Policy + (*Metadata)(nil), // 2: cerbos.policy.v1.Metadata + (*ResourcePolicy)(nil), // 3: cerbos.policy.v1.ResourcePolicy + (*ResourceRule)(nil), // 4: cerbos.policy.v1.ResourceRule + (*PrincipalPolicy)(nil), // 5: cerbos.policy.v1.PrincipalPolicy + (*PrincipalRule)(nil), // 6: cerbos.policy.v1.PrincipalRule + (*DerivedRoles)(nil), // 7: cerbos.policy.v1.DerivedRoles + (*RoleDef)(nil), // 8: cerbos.policy.v1.RoleDef + (*Condition)(nil), // 9: cerbos.policy.v1.Condition + (*Match)(nil), // 10: cerbos.policy.v1.Match + (*Output)(nil), // 11: cerbos.policy.v1.Output + (*Schemas)(nil), // 12: cerbos.policy.v1.Schemas + (*TestFixture)(nil), // 13: cerbos.policy.v1.TestFixture + (*TestOptions)(nil), // 14: cerbos.policy.v1.TestOptions + (*TestSuite)(nil), // 15: cerbos.policy.v1.TestSuite + (*TestTable)(nil), // 16: cerbos.policy.v1.TestTable + (*Test)(nil), // 17: cerbos.policy.v1.Test + (*TestResults)(nil), // 18: cerbos.policy.v1.TestResults + nil, // 19: cerbos.policy.v1.Policy.VariablesEntry + nil, // 20: cerbos.policy.v1.Metadata.AnnotationsEntry + (*PrincipalRule_Action)(nil), // 21: cerbos.policy.v1.PrincipalRule.Action + (*Match_ExprList)(nil), // 22: cerbos.policy.v1.Match.ExprList + (*Schemas_IgnoreWhen)(nil), // 23: cerbos.policy.v1.Schemas.IgnoreWhen + (*Schemas_Schema)(nil), // 24: cerbos.policy.v1.Schemas.Schema + (*TestFixture_Principals)(nil), // 25: cerbos.policy.v1.TestFixture.Principals + (*TestFixture_Resources)(nil), // 26: cerbos.policy.v1.TestFixture.Resources + (*TestFixture_AuxData)(nil), // 27: cerbos.policy.v1.TestFixture.AuxData + nil, // 28: cerbos.policy.v1.TestFixture.Principals.PrincipalsEntry + nil, // 29: cerbos.policy.v1.TestFixture.Resources.ResourcesEntry + nil, // 30: cerbos.policy.v1.TestFixture.AuxData.AuxDataEntry + nil, // 31: cerbos.policy.v1.TestSuite.PrincipalsEntry + nil, // 32: cerbos.policy.v1.TestSuite.ResourcesEntry + nil, // 33: cerbos.policy.v1.TestSuite.AuxDataEntry + (*TestTable_Input)(nil), // 34: cerbos.policy.v1.TestTable.Input + (*TestTable_OutputExpectations)(nil), // 35: cerbos.policy.v1.TestTable.OutputExpectations + (*TestTable_Expectation)(nil), // 36: cerbos.policy.v1.TestTable.Expectation + nil, // 37: cerbos.policy.v1.TestTable.Expectation.ActionsEntry + (*Test_TestName)(nil), // 38: cerbos.policy.v1.Test.TestName + (*Test_OutputEntries)(nil), // 39: cerbos.policy.v1.Test.OutputEntries + nil, // 40: cerbos.policy.v1.Test.ExpectedEntry + nil, // 41: cerbos.policy.v1.Test.ExpectedOutputsEntry + nil, // 42: cerbos.policy.v1.Test.OutputEntries.EntriesEntry + (*TestResults_Tally)(nil), // 43: cerbos.policy.v1.TestResults.Tally + (*TestResults_Summary)(nil), // 44: cerbos.policy.v1.TestResults.Summary + (*TestResults_Suite)(nil), // 45: cerbos.policy.v1.TestResults.Suite + (*TestResults_TestCase)(nil), // 46: cerbos.policy.v1.TestResults.TestCase + (*TestResults_Principal)(nil), // 47: cerbos.policy.v1.TestResults.Principal + (*TestResults_Resource)(nil), // 48: cerbos.policy.v1.TestResults.Resource + (*TestResults_Action)(nil), // 49: cerbos.policy.v1.TestResults.Action + (*TestResults_Details)(nil), // 50: cerbos.policy.v1.TestResults.Details + (*TestResults_OutputFailure)(nil), // 51: cerbos.policy.v1.TestResults.OutputFailure + (*TestResults_Failure)(nil), // 52: cerbos.policy.v1.TestResults.Failure + (*TestResults_OutputFailure_MismatchedValue)(nil), // 53: cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue + (*TestResults_OutputFailure_MissingValue)(nil), // 54: cerbos.policy.v1.TestResults.OutputFailure.MissingValue + (*wrapperspb.UInt64Value)(nil), // 55: google.protobuf.UInt64Value + (v1.Effect)(0), // 56: cerbos.effect.v1.Effect + (*timestamppb.Timestamp)(nil), // 57: google.protobuf.Timestamp + (*v11.CheckInput)(nil), // 58: cerbos.engine.v1.CheckInput + (*v11.Principal)(nil), // 59: cerbos.engine.v1.Principal + (*v11.Resource)(nil), // 60: cerbos.engine.v1.Resource + (*v11.AuxData)(nil), // 61: cerbos.engine.v1.AuxData + (*v11.OutputEntry)(nil), // 62: cerbos.engine.v1.OutputEntry + (*structpb.Value)(nil), // 63: google.protobuf.Value + (*v11.Trace)(nil), // 64: cerbos.engine.v1.Trace } var file_cerbos_policy_v1_policy_proto_depIdxs = []int32{ 2, // 0: cerbos.policy.v1.Policy.metadata:type_name -> cerbos.policy.v1.Metadata @@ -3210,11 +3605,11 @@ var file_cerbos_policy_v1_policy_proto_depIdxs = []int32{ 7, // 3: cerbos.policy.v1.Policy.derived_roles:type_name -> cerbos.policy.v1.DerivedRoles 19, // 4: cerbos.policy.v1.Policy.variables:type_name -> cerbos.policy.v1.Policy.VariablesEntry 20, // 5: cerbos.policy.v1.Metadata.annotations:type_name -> cerbos.policy.v1.Metadata.AnnotationsEntry - 48, // 6: cerbos.policy.v1.Metadata.hash:type_name -> google.protobuf.UInt64Value + 55, // 6: cerbos.policy.v1.Metadata.hash:type_name -> google.protobuf.UInt64Value 4, // 7: cerbos.policy.v1.ResourcePolicy.rules:type_name -> cerbos.policy.v1.ResourceRule 12, // 8: cerbos.policy.v1.ResourcePolicy.schemas:type_name -> cerbos.policy.v1.Schemas 9, // 9: cerbos.policy.v1.ResourceRule.condition:type_name -> cerbos.policy.v1.Condition - 49, // 10: cerbos.policy.v1.ResourceRule.effect:type_name -> cerbos.effect.v1.Effect + 56, // 10: cerbos.policy.v1.ResourceRule.effect:type_name -> cerbos.effect.v1.Effect 11, // 11: cerbos.policy.v1.ResourceRule.output:type_name -> cerbos.policy.v1.Output 6, // 12: cerbos.policy.v1.PrincipalPolicy.rules:type_name -> cerbos.policy.v1.PrincipalRule 21, // 13: cerbos.policy.v1.PrincipalRule.actions:type_name -> cerbos.policy.v1.PrincipalRule.Action @@ -3226,58 +3621,70 @@ var file_cerbos_policy_v1_policy_proto_depIdxs = []int32{ 22, // 19: cerbos.policy.v1.Match.none:type_name -> cerbos.policy.v1.Match.ExprList 24, // 20: cerbos.policy.v1.Schemas.principal_schema:type_name -> cerbos.policy.v1.Schemas.Schema 24, // 21: cerbos.policy.v1.Schemas.resource_schema:type_name -> cerbos.policy.v1.Schemas.Schema - 50, // 22: cerbos.policy.v1.TestOptions.now:type_name -> google.protobuf.Timestamp + 57, // 22: cerbos.policy.v1.TestOptions.now:type_name -> google.protobuf.Timestamp 16, // 23: cerbos.policy.v1.TestSuite.tests:type_name -> cerbos.policy.v1.TestTable 31, // 24: cerbos.policy.v1.TestSuite.principals:type_name -> cerbos.policy.v1.TestSuite.PrincipalsEntry 32, // 25: cerbos.policy.v1.TestSuite.resources:type_name -> cerbos.policy.v1.TestSuite.ResourcesEntry 33, // 26: cerbos.policy.v1.TestSuite.aux_data:type_name -> cerbos.policy.v1.TestSuite.AuxDataEntry 14, // 27: cerbos.policy.v1.TestSuite.options:type_name -> cerbos.policy.v1.TestOptions 34, // 28: cerbos.policy.v1.TestTable.input:type_name -> cerbos.policy.v1.TestTable.Input - 35, // 29: cerbos.policy.v1.TestTable.expected:type_name -> cerbos.policy.v1.TestTable.Expectation + 36, // 29: cerbos.policy.v1.TestTable.expected:type_name -> cerbos.policy.v1.TestTable.Expectation 14, // 30: cerbos.policy.v1.TestTable.options:type_name -> cerbos.policy.v1.TestOptions - 37, // 31: cerbos.policy.v1.Test.name:type_name -> cerbos.policy.v1.Test.TestName - 51, // 32: cerbos.policy.v1.Test.input:type_name -> cerbos.engine.v1.CheckInput - 38, // 33: cerbos.policy.v1.Test.expected:type_name -> cerbos.policy.v1.Test.ExpectedEntry + 38, // 31: cerbos.policy.v1.Test.name:type_name -> cerbos.policy.v1.Test.TestName + 58, // 32: cerbos.policy.v1.Test.input:type_name -> cerbos.engine.v1.CheckInput + 40, // 33: cerbos.policy.v1.Test.expected:type_name -> cerbos.policy.v1.Test.ExpectedEntry 14, // 34: cerbos.policy.v1.Test.options:type_name -> cerbos.policy.v1.TestOptions - 41, // 35: cerbos.policy.v1.TestResults.suites:type_name -> cerbos.policy.v1.TestResults.Suite - 40, // 36: cerbos.policy.v1.TestResults.summary:type_name -> cerbos.policy.v1.TestResults.Summary - 9, // 37: cerbos.policy.v1.PrincipalRule.Action.condition:type_name -> cerbos.policy.v1.Condition - 49, // 38: cerbos.policy.v1.PrincipalRule.Action.effect:type_name -> cerbos.effect.v1.Effect - 11, // 39: cerbos.policy.v1.PrincipalRule.Action.output:type_name -> cerbos.policy.v1.Output - 10, // 40: cerbos.policy.v1.Match.ExprList.of:type_name -> cerbos.policy.v1.Match - 23, // 41: cerbos.policy.v1.Schemas.Schema.ignore_when:type_name -> cerbos.policy.v1.Schemas.IgnoreWhen - 28, // 42: cerbos.policy.v1.TestFixture.Principals.principals:type_name -> cerbos.policy.v1.TestFixture.Principals.PrincipalsEntry - 29, // 43: cerbos.policy.v1.TestFixture.Resources.resources:type_name -> cerbos.policy.v1.TestFixture.Resources.ResourcesEntry - 30, // 44: cerbos.policy.v1.TestFixture.AuxData.aux_data:type_name -> cerbos.policy.v1.TestFixture.AuxData.AuxDataEntry - 52, // 45: cerbos.policy.v1.TestFixture.Principals.PrincipalsEntry.value:type_name -> cerbos.engine.v1.Principal - 53, // 46: cerbos.policy.v1.TestFixture.Resources.ResourcesEntry.value:type_name -> cerbos.engine.v1.Resource - 54, // 47: cerbos.policy.v1.TestFixture.AuxData.AuxDataEntry.value:type_name -> cerbos.engine.v1.AuxData - 52, // 48: cerbos.policy.v1.TestSuite.PrincipalsEntry.value:type_name -> cerbos.engine.v1.Principal - 53, // 49: cerbos.policy.v1.TestSuite.ResourcesEntry.value:type_name -> cerbos.engine.v1.Resource - 54, // 50: cerbos.policy.v1.TestSuite.AuxDataEntry.value:type_name -> cerbos.engine.v1.AuxData - 36, // 51: cerbos.policy.v1.TestTable.Expectation.actions:type_name -> cerbos.policy.v1.TestTable.Expectation.ActionsEntry - 49, // 52: cerbos.policy.v1.TestTable.Expectation.ActionsEntry.value:type_name -> cerbos.effect.v1.Effect - 49, // 53: cerbos.policy.v1.Test.ExpectedEntry.value:type_name -> cerbos.effect.v1.Effect - 0, // 54: cerbos.policy.v1.TestResults.Tally.result:type_name -> cerbos.policy.v1.TestResults.Result - 0, // 55: cerbos.policy.v1.TestResults.Summary.overall_result:type_name -> cerbos.policy.v1.TestResults.Result - 39, // 56: cerbos.policy.v1.TestResults.Summary.result_counts:type_name -> cerbos.policy.v1.TestResults.Tally - 43, // 57: cerbos.policy.v1.TestResults.Suite.principals:type_name -> cerbos.policy.v1.TestResults.Principal - 40, // 58: cerbos.policy.v1.TestResults.Suite.summary:type_name -> cerbos.policy.v1.TestResults.Summary - 42, // 59: cerbos.policy.v1.TestResults.Suite.test_cases:type_name -> cerbos.policy.v1.TestResults.TestCase - 43, // 60: cerbos.policy.v1.TestResults.TestCase.principals:type_name -> cerbos.policy.v1.TestResults.Principal - 44, // 61: cerbos.policy.v1.TestResults.Principal.resources:type_name -> cerbos.policy.v1.TestResults.Resource - 45, // 62: cerbos.policy.v1.TestResults.Resource.actions:type_name -> cerbos.policy.v1.TestResults.Action - 46, // 63: cerbos.policy.v1.TestResults.Action.details:type_name -> cerbos.policy.v1.TestResults.Details - 0, // 64: cerbos.policy.v1.TestResults.Details.result:type_name -> cerbos.policy.v1.TestResults.Result - 47, // 65: cerbos.policy.v1.TestResults.Details.failure:type_name -> cerbos.policy.v1.TestResults.Failure - 55, // 66: cerbos.policy.v1.TestResults.Details.engine_trace:type_name -> cerbos.engine.v1.Trace - 49, // 67: cerbos.policy.v1.TestResults.Failure.expected:type_name -> cerbos.effect.v1.Effect - 49, // 68: cerbos.policy.v1.TestResults.Failure.actual:type_name -> cerbos.effect.v1.Effect - 69, // [69:69] is the sub-list for method output_type - 69, // [69:69] is the sub-list for method input_type - 69, // [69:69] is the sub-list for extension type_name - 69, // [69:69] is the sub-list for extension extendee - 0, // [0:69] is the sub-list for field type_name + 41, // 35: cerbos.policy.v1.Test.expected_outputs:type_name -> cerbos.policy.v1.Test.ExpectedOutputsEntry + 45, // 36: cerbos.policy.v1.TestResults.suites:type_name -> cerbos.policy.v1.TestResults.Suite + 44, // 37: cerbos.policy.v1.TestResults.summary:type_name -> cerbos.policy.v1.TestResults.Summary + 9, // 38: cerbos.policy.v1.PrincipalRule.Action.condition:type_name -> cerbos.policy.v1.Condition + 56, // 39: cerbos.policy.v1.PrincipalRule.Action.effect:type_name -> cerbos.effect.v1.Effect + 11, // 40: cerbos.policy.v1.PrincipalRule.Action.output:type_name -> cerbos.policy.v1.Output + 10, // 41: cerbos.policy.v1.Match.ExprList.of:type_name -> cerbos.policy.v1.Match + 23, // 42: cerbos.policy.v1.Schemas.Schema.ignore_when:type_name -> cerbos.policy.v1.Schemas.IgnoreWhen + 28, // 43: cerbos.policy.v1.TestFixture.Principals.principals:type_name -> cerbos.policy.v1.TestFixture.Principals.PrincipalsEntry + 29, // 44: cerbos.policy.v1.TestFixture.Resources.resources:type_name -> cerbos.policy.v1.TestFixture.Resources.ResourcesEntry + 30, // 45: cerbos.policy.v1.TestFixture.AuxData.aux_data:type_name -> cerbos.policy.v1.TestFixture.AuxData.AuxDataEntry + 59, // 46: cerbos.policy.v1.TestFixture.Principals.PrincipalsEntry.value:type_name -> cerbos.engine.v1.Principal + 60, // 47: cerbos.policy.v1.TestFixture.Resources.ResourcesEntry.value:type_name -> cerbos.engine.v1.Resource + 61, // 48: cerbos.policy.v1.TestFixture.AuxData.AuxDataEntry.value:type_name -> cerbos.engine.v1.AuxData + 59, // 49: cerbos.policy.v1.TestSuite.PrincipalsEntry.value:type_name -> cerbos.engine.v1.Principal + 60, // 50: cerbos.policy.v1.TestSuite.ResourcesEntry.value:type_name -> cerbos.engine.v1.Resource + 61, // 51: cerbos.policy.v1.TestSuite.AuxDataEntry.value:type_name -> cerbos.engine.v1.AuxData + 62, // 52: cerbos.policy.v1.TestTable.OutputExpectations.expected:type_name -> cerbos.engine.v1.OutputEntry + 37, // 53: cerbos.policy.v1.TestTable.Expectation.actions:type_name -> cerbos.policy.v1.TestTable.Expectation.ActionsEntry + 35, // 54: cerbos.policy.v1.TestTable.Expectation.outputs:type_name -> cerbos.policy.v1.TestTable.OutputExpectations + 56, // 55: cerbos.policy.v1.TestTable.Expectation.ActionsEntry.value:type_name -> cerbos.effect.v1.Effect + 42, // 56: cerbos.policy.v1.Test.OutputEntries.entries:type_name -> cerbos.policy.v1.Test.OutputEntries.EntriesEntry + 56, // 57: cerbos.policy.v1.Test.ExpectedEntry.value:type_name -> cerbos.effect.v1.Effect + 39, // 58: cerbos.policy.v1.Test.ExpectedOutputsEntry.value:type_name -> cerbos.policy.v1.Test.OutputEntries + 63, // 59: cerbos.policy.v1.Test.OutputEntries.EntriesEntry.value:type_name -> google.protobuf.Value + 0, // 60: cerbos.policy.v1.TestResults.Tally.result:type_name -> cerbos.policy.v1.TestResults.Result + 0, // 61: cerbos.policy.v1.TestResults.Summary.overall_result:type_name -> cerbos.policy.v1.TestResults.Result + 43, // 62: cerbos.policy.v1.TestResults.Summary.result_counts:type_name -> cerbos.policy.v1.TestResults.Tally + 47, // 63: cerbos.policy.v1.TestResults.Suite.principals:type_name -> cerbos.policy.v1.TestResults.Principal + 44, // 64: cerbos.policy.v1.TestResults.Suite.summary:type_name -> cerbos.policy.v1.TestResults.Summary + 46, // 65: cerbos.policy.v1.TestResults.Suite.test_cases:type_name -> cerbos.policy.v1.TestResults.TestCase + 47, // 66: cerbos.policy.v1.TestResults.TestCase.principals:type_name -> cerbos.policy.v1.TestResults.Principal + 48, // 67: cerbos.policy.v1.TestResults.Principal.resources:type_name -> cerbos.policy.v1.TestResults.Resource + 49, // 68: cerbos.policy.v1.TestResults.Resource.actions:type_name -> cerbos.policy.v1.TestResults.Action + 50, // 69: cerbos.policy.v1.TestResults.Action.details:type_name -> cerbos.policy.v1.TestResults.Details + 0, // 70: cerbos.policy.v1.TestResults.Details.result:type_name -> cerbos.policy.v1.TestResults.Result + 52, // 71: cerbos.policy.v1.TestResults.Details.failure:type_name -> cerbos.policy.v1.TestResults.Failure + 64, // 72: cerbos.policy.v1.TestResults.Details.engine_trace:type_name -> cerbos.engine.v1.Trace + 53, // 73: cerbos.policy.v1.TestResults.OutputFailure.mismatched:type_name -> cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue + 54, // 74: cerbos.policy.v1.TestResults.OutputFailure.missing:type_name -> cerbos.policy.v1.TestResults.OutputFailure.MissingValue + 56, // 75: cerbos.policy.v1.TestResults.Failure.expected:type_name -> cerbos.effect.v1.Effect + 56, // 76: cerbos.policy.v1.TestResults.Failure.actual:type_name -> cerbos.effect.v1.Effect + 51, // 77: cerbos.policy.v1.TestResults.Failure.outputs:type_name -> cerbos.policy.v1.TestResults.OutputFailure + 63, // 78: cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.expected:type_name -> google.protobuf.Value + 63, // 79: cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.actual:type_name -> google.protobuf.Value + 63, // 80: cerbos.policy.v1.TestResults.OutputFailure.MissingValue.expected:type_name -> google.protobuf.Value + 81, // [81:81] is the sub-list for method output_type + 81, // [81:81] is the sub-list for method input_type + 81, // [81:81] is the sub-list for extension type_name + 81, // [81:81] is the sub-list for extension extendee + 0, // [0:81] is the sub-list for field type_name } func init() { file_cerbos_policy_v1_policy_proto_init() } @@ -3599,6 +4006,18 @@ func file_cerbos_policy_v1_policy_proto_init() { } } file_cerbos_policy_v1_policy_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TestTable_OutputExpectations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cerbos_policy_v1_policy_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestTable_Expectation); i { case 0: return &v.state @@ -3610,7 +4029,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Test_TestName); i { case 0: return &v.state @@ -3623,6 +4042,18 @@ func file_cerbos_policy_v1_policy_proto_init() { } } file_cerbos_policy_v1_policy_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Test_OutputEntries); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cerbos_policy_v1_policy_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Tally); i { case 0: return &v.state @@ -3634,7 +4065,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Summary); i { case 0: return &v.state @@ -3646,7 +4077,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Suite); i { case 0: return &v.state @@ -3658,7 +4089,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_TestCase); i { case 0: return &v.state @@ -3670,7 +4101,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Principal); i { case 0: return &v.state @@ -3682,7 +4113,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Resource); i { case 0: return &v.state @@ -3694,7 +4125,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Action); i { case 0: return &v.state @@ -3706,7 +4137,7 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Details); i { case 0: return &v.state @@ -3718,7 +4149,19 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } - file_cerbos_policy_v1_policy_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_cerbos_policy_v1_policy_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TestResults_OutputFailure); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cerbos_policy_v1_policy_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestResults_Failure); i { case 0: return &v.state @@ -3730,6 +4173,30 @@ func file_cerbos_policy_v1_policy_proto_init() { return nil } } + file_cerbos_policy_v1_policy_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TestResults_OutputFailure_MismatchedValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cerbos_policy_v1_policy_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TestResults_OutputFailure_MissingValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_cerbos_policy_v1_policy_proto_msgTypes[0].OneofWrappers = []interface{}{ (*Policy_ResourcePolicy)(nil), @@ -3746,17 +4213,21 @@ func file_cerbos_policy_v1_policy_proto_init() { (*Match_None)(nil), (*Match_Expr)(nil), } - file_cerbos_policy_v1_policy_proto_msgTypes[45].OneofWrappers = []interface{}{ + file_cerbos_policy_v1_policy_proto_msgTypes[49].OneofWrappers = []interface{}{ (*TestResults_Details_Failure)(nil), (*TestResults_Details_Error)(nil), } + file_cerbos_policy_v1_policy_proto_msgTypes[50].OneofWrappers = []interface{}{ + (*TestResults_OutputFailure_Mismatched)(nil), + (*TestResults_OutputFailure_Missing)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cerbos_policy_v1_policy_proto_rawDesc, NumEnums: 1, - NumMessages: 47, + NumMessages: 54, NumExtensions: 0, NumServices: 0, }, diff --git a/api/genpb/cerbos/policy/v1/policy.pb.validate.go b/api/genpb/cerbos/policy/v1/policy.pb.validate.go index c6aaf365a..95be7740b 100644 --- a/api/genpb/cerbos/policy/v1/policy.pb.validate.go +++ b/api/genpb/cerbos/policy/v1/policy.pb.validate.go @@ -3331,6 +3331,52 @@ func (m *Test) validate(all bool) error { } } + { + sorted_keys := make([]string, len(m.GetExpectedOutputs())) + i := 0 + for key := range m.GetExpectedOutputs() { + sorted_keys[i] = key + i++ + } + sort.Slice(sorted_keys, func(i, j int) bool { return sorted_keys[i] < sorted_keys[j] }) + for _, key := range sorted_keys { + val := m.GetExpectedOutputs()[key] + _ = val + + // no validation rules for ExpectedOutputs[key] + + if all { + switch v := interface{}(val).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestValidationError{ + field: fmt.Sprintf("ExpectedOutputs[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestValidationError{ + field: fmt.Sprintf("ExpectedOutputs[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(val).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestValidationError{ + field: fmt.Sprintf("ExpectedOutputs[%v]", key), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + if len(errors) > 0 { return TestMultiError(errors) } @@ -4871,6 +4917,165 @@ var _ interface { ErrorName() string } = TestTable_InputValidationError{} +// Validate checks the field values on TestTable_OutputExpectations with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TestTable_OutputExpectations) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TestTable_OutputExpectations with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// TestTable_OutputExpectationsMultiError, or nil if none found. +func (m *TestTable_OutputExpectations) ValidateAll() error { + return m.validate(true) +} + +func (m *TestTable_OutputExpectations) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetAction()) < 1 { + err := TestTable_OutputExpectationsValidationError{ + field: "Action", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(m.GetExpected()) < 1 { + err := TestTable_OutputExpectationsValidationError{ + field: "Expected", + reason: "value must contain at least 1 item(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetExpected() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestTable_OutputExpectationsValidationError{ + field: fmt.Sprintf("Expected[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestTable_OutputExpectationsValidationError{ + field: fmt.Sprintf("Expected[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestTable_OutputExpectationsValidationError{ + field: fmt.Sprintf("Expected[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return TestTable_OutputExpectationsMultiError(errors) + } + + return nil +} + +// TestTable_OutputExpectationsMultiError is an error wrapping multiple +// validation errors returned by TestTable_OutputExpectations.ValidateAll() if +// the designated constraints aren't met. +type TestTable_OutputExpectationsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TestTable_OutputExpectationsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TestTable_OutputExpectationsMultiError) AllErrors() []error { return m } + +// TestTable_OutputExpectationsValidationError is the validation error returned +// by TestTable_OutputExpectations.Validate if the designated constraints +// aren't met. +type TestTable_OutputExpectationsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TestTable_OutputExpectationsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TestTable_OutputExpectationsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TestTable_OutputExpectationsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TestTable_OutputExpectationsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TestTable_OutputExpectationsValidationError) ErrorName() string { + return "TestTable_OutputExpectationsValidationError" +} + +// Error satisfies the builtin error interface +func (e TestTable_OutputExpectationsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTestTable_OutputExpectations.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TestTable_OutputExpectationsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TestTable_OutputExpectationsValidationError{} + // Validate checks the field values on TestTable_Expectation with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. @@ -4953,6 +5158,40 @@ func (m *TestTable_Expectation) validate(all bool) error { } } + for idx, item := range m.GetOutputs() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestTable_ExpectationValidationError{ + field: fmt.Sprintf("Outputs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestTable_ExpectationValidationError{ + field: fmt.Sprintf("Outputs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestTable_ExpectationValidationError{ + field: fmt.Sprintf("Outputs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + if len(errors) > 0 { return TestTable_ExpectationMultiError(errors) } @@ -5166,46 +5405,88 @@ var _ interface { ErrorName() string } = Test_TestNameValidationError{} -// Validate checks the field values on TestResults_Tally with the rules defined -// in the proto definition for this message. If any rules are violated, the -// first error encountered is returned, or nil if there are no violations. -func (m *TestResults_Tally) Validate() error { +// Validate checks the field values on Test_OutputEntries with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *Test_OutputEntries) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on TestResults_Tally with the rules +// ValidateAll checks the field values on Test_OutputEntries with the rules // defined in the proto definition for this message. If any rules are // violated, the result is a list of violation errors wrapped in -// TestResults_TallyMultiError, or nil if none found. -func (m *TestResults_Tally) ValidateAll() error { +// Test_OutputEntriesMultiError, or nil if none found. +func (m *Test_OutputEntries) ValidateAll() error { return m.validate(true) } -func (m *TestResults_Tally) validate(all bool) error { +func (m *Test_OutputEntries) validate(all bool) error { if m == nil { return nil } var errors []error - // no validation rules for Result + { + sorted_keys := make([]string, len(m.GetEntries())) + i := 0 + for key := range m.GetEntries() { + sorted_keys[i] = key + i++ + } + sort.Slice(sorted_keys, func(i, j int) bool { return sorted_keys[i] < sorted_keys[j] }) + for _, key := range sorted_keys { + val := m.GetEntries()[key] + _ = val - // no validation rules for Count + // no validation rules for Entries[key] + + if all { + switch v := interface{}(val).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, Test_OutputEntriesValidationError{ + field: fmt.Sprintf("Entries[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, Test_OutputEntriesValidationError{ + field: fmt.Sprintf("Entries[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(val).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return Test_OutputEntriesValidationError{ + field: fmt.Sprintf("Entries[%v]", key), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } if len(errors) > 0 { - return TestResults_TallyMultiError(errors) + return Test_OutputEntriesMultiError(errors) } return nil } -// TestResults_TallyMultiError is an error wrapping multiple validation errors -// returned by TestResults_Tally.ValidateAll() if the designated constraints +// Test_OutputEntriesMultiError is an error wrapping multiple validation errors +// returned by Test_OutputEntries.ValidateAll() if the designated constraints // aren't met. -type TestResults_TallyMultiError []error +type Test_OutputEntriesMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m TestResults_TallyMultiError) Error() string { +func (m Test_OutputEntriesMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -5214,11 +5495,11 @@ func (m TestResults_TallyMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m TestResults_TallyMultiError) AllErrors() []error { return m } +func (m Test_OutputEntriesMultiError) AllErrors() []error { return m } -// TestResults_TallyValidationError is the validation error returned by -// TestResults_Tally.Validate if the designated constraints aren't met. -type TestResults_TallyValidationError struct { +// Test_OutputEntriesValidationError is the validation error returned by +// Test_OutputEntries.Validate if the designated constraints aren't met. +type Test_OutputEntriesValidationError struct { field string reason string cause error @@ -5226,24 +5507,24 @@ type TestResults_TallyValidationError struct { } // Field function returns field value. -func (e TestResults_TallyValidationError) Field() string { return e.field } +func (e Test_OutputEntriesValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e TestResults_TallyValidationError) Reason() string { return e.reason } +func (e Test_OutputEntriesValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e TestResults_TallyValidationError) Cause() error { return e.cause } +func (e Test_OutputEntriesValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e TestResults_TallyValidationError) Key() bool { return e.key } +func (e Test_OutputEntriesValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e TestResults_TallyValidationError) ErrorName() string { - return "TestResults_TallyValidationError" +func (e Test_OutputEntriesValidationError) ErrorName() string { + return "Test_OutputEntriesValidationError" } // Error satisfies the builtin error interface -func (e TestResults_TallyValidationError) Error() string { +func (e Test_OutputEntriesValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5255,14 +5536,14 @@ func (e TestResults_TallyValidationError) Error() string { } return fmt.Sprintf( - "invalid %sTestResults_Tally.%s: %s%s", + "invalid %sTest_OutputEntries.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = TestResults_TallyValidationError{} +var _ error = Test_OutputEntriesValidationError{} var _ interface { Field() string @@ -5270,9 +5551,115 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = TestResults_TallyValidationError{} +} = Test_OutputEntriesValidationError{} -// Validate checks the field values on TestResults_Summary with the rules +// Validate checks the field values on TestResults_Tally with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *TestResults_Tally) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TestResults_Tally with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// TestResults_TallyMultiError, or nil if none found. +func (m *TestResults_Tally) ValidateAll() error { + return m.validate(true) +} + +func (m *TestResults_Tally) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Result + + // no validation rules for Count + + if len(errors) > 0 { + return TestResults_TallyMultiError(errors) + } + + return nil +} + +// TestResults_TallyMultiError is an error wrapping multiple validation errors +// returned by TestResults_Tally.ValidateAll() if the designated constraints +// aren't met. +type TestResults_TallyMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TestResults_TallyMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TestResults_TallyMultiError) AllErrors() []error { return m } + +// TestResults_TallyValidationError is the validation error returned by +// TestResults_Tally.Validate if the designated constraints aren't met. +type TestResults_TallyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TestResults_TallyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TestResults_TallyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TestResults_TallyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TestResults_TallyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TestResults_TallyValidationError) ErrorName() string { + return "TestResults_TallyValidationError" +} + +// Error satisfies the builtin error interface +func (e TestResults_TallyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTestResults_Tally.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TestResults_TallyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TestResults_TallyValidationError{} + +// Validate checks the field values on TestResults_Summary with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. func (m *TestResults_Summary) Validate() error { @@ -6362,6 +6749,197 @@ var _ interface { ErrorName() string } = TestResults_DetailsValidationError{} +// Validate checks the field values on TestResults_OutputFailure with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TestResults_OutputFailure) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TestResults_OutputFailure with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// TestResults_OutputFailureMultiError, or nil if none found. +func (m *TestResults_OutputFailure) ValidateAll() error { + return m.validate(true) +} + +func (m *TestResults_OutputFailure) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Src + + switch v := m.Outcome.(type) { + case *TestResults_OutputFailure_Mismatched: + if v == nil { + err := TestResults_OutputFailureValidationError{ + field: "Outcome", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMismatched()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestResults_OutputFailureValidationError{ + field: "Mismatched", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestResults_OutputFailureValidationError{ + field: "Mismatched", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMismatched()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestResults_OutputFailureValidationError{ + field: "Mismatched", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *TestResults_OutputFailure_Missing: + if v == nil { + err := TestResults_OutputFailureValidationError{ + field: "Outcome", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetMissing()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestResults_OutputFailureValidationError{ + field: "Missing", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestResults_OutputFailureValidationError{ + field: "Missing", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMissing()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestResults_OutputFailureValidationError{ + field: "Missing", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + + if len(errors) > 0 { + return TestResults_OutputFailureMultiError(errors) + } + + return nil +} + +// TestResults_OutputFailureMultiError is an error wrapping multiple validation +// errors returned by TestResults_OutputFailure.ValidateAll() if the +// designated constraints aren't met. +type TestResults_OutputFailureMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TestResults_OutputFailureMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TestResults_OutputFailureMultiError) AllErrors() []error { return m } + +// TestResults_OutputFailureValidationError is the validation error returned by +// TestResults_OutputFailure.Validate if the designated constraints aren't met. +type TestResults_OutputFailureValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TestResults_OutputFailureValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TestResults_OutputFailureValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TestResults_OutputFailureValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TestResults_OutputFailureValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TestResults_OutputFailureValidationError) ErrorName() string { + return "TestResults_OutputFailureValidationError" +} + +// Error satisfies the builtin error interface +func (e TestResults_OutputFailureValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTestResults_OutputFailure.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TestResults_OutputFailureValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TestResults_OutputFailureValidationError{} + // Validate checks the field values on TestResults_Failure with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. @@ -6388,6 +6966,40 @@ func (m *TestResults_Failure) validate(all bool) error { // no validation rules for Actual + for idx, item := range m.GetOutputs() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestResults_FailureValidationError{ + field: fmt.Sprintf("Outputs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestResults_FailureValidationError{ + field: fmt.Sprintf("Outputs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestResults_FailureValidationError{ + field: fmt.Sprintf("Outputs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + if len(errors) > 0 { return TestResults_FailureMultiError(errors) } @@ -6467,3 +7079,302 @@ var _ interface { Cause() error ErrorName() string } = TestResults_FailureValidationError{} + +// Validate checks the field values on +// TestResults_OutputFailure_MismatchedValue with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *TestResults_OutputFailure_MismatchedValue) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on +// TestResults_OutputFailure_MismatchedValue with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in +// TestResults_OutputFailure_MismatchedValueMultiError, or nil if none found. +func (m *TestResults_OutputFailure_MismatchedValue) ValidateAll() error { + return m.validate(true) +} + +func (m *TestResults_OutputFailure_MismatchedValue) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetExpected()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestResults_OutputFailure_MismatchedValueValidationError{ + field: "Expected", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestResults_OutputFailure_MismatchedValueValidationError{ + field: "Expected", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetExpected()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestResults_OutputFailure_MismatchedValueValidationError{ + field: "Expected", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetActual()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestResults_OutputFailure_MismatchedValueValidationError{ + field: "Actual", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestResults_OutputFailure_MismatchedValueValidationError{ + field: "Actual", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetActual()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestResults_OutputFailure_MismatchedValueValidationError{ + field: "Actual", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TestResults_OutputFailure_MismatchedValueMultiError(errors) + } + + return nil +} + +// TestResults_OutputFailure_MismatchedValueMultiError is an error wrapping +// multiple validation errors returned by +// TestResults_OutputFailure_MismatchedValue.ValidateAll() if the designated +// constraints aren't met. +type TestResults_OutputFailure_MismatchedValueMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TestResults_OutputFailure_MismatchedValueMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TestResults_OutputFailure_MismatchedValueMultiError) AllErrors() []error { return m } + +// TestResults_OutputFailure_MismatchedValueValidationError is the validation +// error returned by TestResults_OutputFailure_MismatchedValue.Validate if the +// designated constraints aren't met. +type TestResults_OutputFailure_MismatchedValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TestResults_OutputFailure_MismatchedValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TestResults_OutputFailure_MismatchedValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TestResults_OutputFailure_MismatchedValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TestResults_OutputFailure_MismatchedValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TestResults_OutputFailure_MismatchedValueValidationError) ErrorName() string { + return "TestResults_OutputFailure_MismatchedValueValidationError" +} + +// Error satisfies the builtin error interface +func (e TestResults_OutputFailure_MismatchedValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTestResults_OutputFailure_MismatchedValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TestResults_OutputFailure_MismatchedValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TestResults_OutputFailure_MismatchedValueValidationError{} + +// Validate checks the field values on TestResults_OutputFailure_MissingValue +// with the rules defined in the proto definition for this message. If any +// rules are violated, the first error encountered is returned, or nil if +// there are no violations. +func (m *TestResults_OutputFailure_MissingValue) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on +// TestResults_OutputFailure_MissingValue with the rules defined in the proto +// definition for this message. If any rules are violated, the result is a +// list of violation errors wrapped in +// TestResults_OutputFailure_MissingValueMultiError, or nil if none found. +func (m *TestResults_OutputFailure_MissingValue) ValidateAll() error { + return m.validate(true) +} + +func (m *TestResults_OutputFailure_MissingValue) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetExpected()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TestResults_OutputFailure_MissingValueValidationError{ + field: "Expected", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TestResults_OutputFailure_MissingValueValidationError{ + field: "Expected", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetExpected()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TestResults_OutputFailure_MissingValueValidationError{ + field: "Expected", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TestResults_OutputFailure_MissingValueMultiError(errors) + } + + return nil +} + +// TestResults_OutputFailure_MissingValueMultiError is an error wrapping +// multiple validation errors returned by +// TestResults_OutputFailure_MissingValue.ValidateAll() if the designated +// constraints aren't met. +type TestResults_OutputFailure_MissingValueMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TestResults_OutputFailure_MissingValueMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TestResults_OutputFailure_MissingValueMultiError) AllErrors() []error { return m } + +// TestResults_OutputFailure_MissingValueValidationError is the validation +// error returned by TestResults_OutputFailure_MissingValue.Validate if the +// designated constraints aren't met. +type TestResults_OutputFailure_MissingValueValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TestResults_OutputFailure_MissingValueValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TestResults_OutputFailure_MissingValueValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TestResults_OutputFailure_MissingValueValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TestResults_OutputFailure_MissingValueValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TestResults_OutputFailure_MissingValueValidationError) ErrorName() string { + return "TestResults_OutputFailure_MissingValueValidationError" +} + +// Error satisfies the builtin error interface +func (e TestResults_OutputFailure_MissingValueValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTestResults_OutputFailure_MissingValue.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TestResults_OutputFailure_MissingValueValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TestResults_OutputFailure_MissingValueValidationError{} diff --git a/api/genpb/cerbos/policy/v1/policy_hashpb.pb.go b/api/genpb/cerbos/policy/v1/policy_hashpb.pb.go index 59e4ec420..962c61799 100644 --- a/api/genpb/cerbos/policy/v1/policy_hashpb.pb.go +++ b/api/genpb/cerbos/policy/v1/policy_hashpb.pb.go @@ -168,6 +168,14 @@ func (m *TestTable_Input) HashPB(hasher hash.Hash, ignore map[string]struct{}) { } } +// HashPB computes a hash of the message using the given hash function +// The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash +func (m *TestTable_OutputExpectations) HashPB(hasher hash.Hash, ignore map[string]struct{}) { + if m != nil { + cerbos_policy_v1_TestTable_OutputExpectations_hashpb_sum(m, hasher, ignore) + } +} + // HashPB computes a hash of the message using the given hash function // The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash func (m *TestTable_Expectation) HashPB(hasher hash.Hash, ignore map[string]struct{}) { @@ -192,6 +200,14 @@ func (m *Test_TestName) HashPB(hasher hash.Hash, ignore map[string]struct{}) { } } +// HashPB computes a hash of the message using the given hash function +// The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash +func (m *Test_OutputEntries) HashPB(hasher hash.Hash, ignore map[string]struct{}) { + if m != nil { + cerbos_policy_v1_Test_OutputEntries_hashpb_sum(m, hasher, ignore) + } +} + // HashPB computes a hash of the message using the given hash function // The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash func (m *TestResults) HashPB(hasher hash.Hash, ignore map[string]struct{}) { @@ -264,6 +280,30 @@ func (m *TestResults_Details) HashPB(hasher hash.Hash, ignore map[string]struct{ } } +// HashPB computes a hash of the message using the given hash function +// The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash +func (m *TestResults_OutputFailure) HashPB(hasher hash.Hash, ignore map[string]struct{}) { + if m != nil { + cerbos_policy_v1_TestResults_OutputFailure_hashpb_sum(m, hasher, ignore) + } +} + +// HashPB computes a hash of the message using the given hash function +// The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash +func (m *TestResults_OutputFailure_MismatchedValue) HashPB(hasher hash.Hash, ignore map[string]struct{}) { + if m != nil { + cerbos_policy_v1_TestResults_OutputFailure_MismatchedValue_hashpb_sum(m, hasher, ignore) + } +} + +// HashPB computes a hash of the message using the given hash function +// The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash +func (m *TestResults_OutputFailure_MissingValue) HashPB(hasher hash.Hash, ignore map[string]struct{}) { + if m != nil { + cerbos_policy_v1_TestResults_OutputFailure_MissingValue_hashpb_sum(m, hasher, ignore) + } +} + // HashPB computes a hash of the message using the given hash function // The ignore set must contain fully-qualified field names (pkg.msg.field) that should be ignored from the hash func (m *TestResults_Failure) HashPB(hasher hash.Hash, ignore map[string]struct{}) { diff --git a/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go b/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go index 08ed7129d..9d6192e9a 100644 --- a/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go +++ b/api/genpb/cerbos/policy/v1/policy_vtproto.pb.go @@ -10,6 +10,7 @@ import ( v11 "github.com/cerbos/cerbos/api/genpb/cerbos/engine/v1" proto "google.golang.org/protobuf/proto" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" io "io" @@ -1710,6 +1711,70 @@ func (m *TestTable_Input) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TestTable_OutputExpectations) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TestTable_OutputExpectations) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TestTable_OutputExpectations) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Expected) > 0 { + for iNdEx := len(m.Expected) - 1; iNdEx >= 0; iNdEx-- { + if vtmsg, ok := interface{}(m.Expected[iNdEx]).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(m.Expected[iNdEx]) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = encodeVarint(dAtA, i, uint64(len(encoded))) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarint(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *TestTable_Expectation) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -1740,6 +1805,18 @@ func (m *TestTable_Expectation) MarshalToSizedBufferVT(dAtA []byte) (int, error) i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Outputs) > 0 { + for iNdEx := len(m.Outputs) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Outputs[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 + } + } if len(m.Actions) > 0 { for k := range m.Actions { v := m.Actions[k] @@ -1924,6 +2001,73 @@ func (m *Test_TestName) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Test_OutputEntries) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Test_OutputEntries) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Test_OutputEntries) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Entries) > 0 { + for k := range m.Entries { + v := m.Entries[k] + baseI := i + if vtmsg, ok := interface{}(v).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(v) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = encodeVarint(dAtA, i, uint64(len(encoded))) + } + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *Test) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -1954,6 +2098,28 @@ func (m *Test) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.ExpectedOutputs) > 0 { + for k := range m.ExpectedOutputs { + v := m.ExpectedOutputs[k] + baseI := i + size, err := v.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarint(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarint(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } if m.Options != nil { size, err := m.Options.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { @@ -2543,7 +2709,7 @@ func (m *TestResults_Details_Error) MarshalToSizedBufferVT(dAtA []byte) (int, er dAtA[i] = 0x1a return len(dAtA) - i, nil } -func (m *TestResults_Failure) MarshalVT() (dAtA []byte, err error) { +func (m *TestResults_OutputFailure_MismatchedValue) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -2556,12 +2722,12 @@ func (m *TestResults_Failure) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TestResults_Failure) MarshalToVT(dAtA []byte) (int, error) { +func (m *TestResults_OutputFailure_MismatchedValue) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *TestResults_Failure) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *TestResults_OutputFailure_MismatchedValue) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -2573,20 +2739,54 @@ func (m *TestResults_Failure) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Actual != 0 { - i = encodeVarint(dAtA, i, uint64(m.Actual)) + if m.Actual != nil { + if vtmsg, ok := interface{}(m.Actual).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(m.Actual) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = encodeVarint(dAtA, i, uint64(len(encoded))) + } i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } - if m.Expected != 0 { - i = encodeVarint(dAtA, i, uint64(m.Expected)) + if m.Expected != nil { + if vtmsg, ok := interface{}(m.Expected).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(m.Expected) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = encodeVarint(dAtA, i, uint64(len(encoded))) + } i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *TestResults) MarshalVT() (dAtA []byte, err error) { +func (m *TestResults_OutputFailure_MissingValue) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -2599,12 +2799,12 @@ func (m *TestResults) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TestResults) MarshalToVT(dAtA []byte) (int, error) { +func (m *TestResults_OutputFailure_MissingValue) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *TestResults) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *TestResults_OutputFailure_MissingValue) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -2616,54 +2816,251 @@ func (m *TestResults) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.Summary != nil { - size, err := m.Summary.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0x12 - } - if len(m.Suites) > 0 { - for iNdEx := len(m.Suites) - 1; iNdEx >= 0; iNdEx-- { - size, err := m.Suites[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if m.Expected != nil { + if vtmsg, ok := interface{}(m.Expected).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { return 0, err } i -= size i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa + } else { + encoded, err := proto.Marshal(m.Expected) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = encodeVarint(dAtA, i, uint64(len(encoded))) } + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func encodeVarint(dAtA []byte, offset int, v uint64) int { - offset -= sov(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *TestResults_OutputFailure) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil } - dAtA[offset] = uint8(v) - return base + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func (m *Policy) SizeVT() (n int) { + +func (m *TestResults_OutputFailure) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TestResults_OutputFailure) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { - return 0 + return 0, nil } + i := len(dAtA) + _ = i var l int _ = l - l = len(m.ApiVersion) - if l > 0 { - n += 1 + l + sov(uint64(l)) + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) } - if m.Disabled { - n += 2 + if vtmsg, ok := m.Outcome.(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + } + if len(m.Src) > 0 { + i -= len(m.Src) + copy(dAtA[i:], m.Src) + i = encodeVarint(dAtA, i, uint64(len(m.Src))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TestResults_OutputFailure_Mismatched) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TestResults_OutputFailure_Mismatched) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Mismatched != nil { + size, err := m.Mismatched.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *TestResults_OutputFailure_Missing) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TestResults_OutputFailure_Missing) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Missing != nil { + size, err := m.Missing.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *TestResults_Failure) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TestResults_Failure) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TestResults_Failure) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Outputs) > 0 { + for iNdEx := len(m.Outputs) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Outputs[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + } + if m.Actual != 0 { + i = encodeVarint(dAtA, i, uint64(m.Actual)) + i-- + dAtA[i] = 0x10 + } + if m.Expected != 0 { + i = encodeVarint(dAtA, i, uint64(m.Expected)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *TestResults) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TestResults) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *TestResults) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if m.Summary != nil { + size, err := m.Summary.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + if len(m.Suites) > 0 { + for iNdEx := len(m.Suites) - 1; iNdEx >= 0; iNdEx-- { + size, err := m.Suites[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarint(dAtA []byte, offset int, v uint64) int { + offset -= sov(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Policy) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ApiVersion) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + if m.Disabled { + n += 2 } l = len(m.Description) if l > 0 { @@ -3383,6 +3780,32 @@ func (m *TestTable_Input) SizeVT() (n int) { return n } +func (m *TestTable_OutputExpectations) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + if len(m.Expected) > 0 { + for _, e := range m.Expected { + if size, ok := interface{}(e).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(e) + } + n += 1 + l + sov(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + func (m *TestTable_Expectation) SizeVT() (n int) { if m == nil { return 0 @@ -3405,6 +3828,12 @@ func (m *TestTable_Expectation) SizeVT() (n int) { n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) } } + if len(m.Outputs) > 0 { + for _, e := range m.Outputs { + l = e.SizeVT() + n += 1 + l + sov(uint64(l)) + } + } n += len(m.unknownFields) return n } @@ -3470,6 +3899,35 @@ func (m *Test_TestName) SizeVT() (n int) { return n } +func (m *Test_OutputEntries) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Entries) > 0 { + for k, v := range m.Entries { + _ = k + _ = v + l = 0 + if v != nil { + if size, ok := interface{}(v).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(v) + } + } + l += 1 + sov(uint64(l)) + mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l + n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + } + } + n += len(m.unknownFields) + return n +} + func (m *Test) SizeVT() (n int) { if m == nil { return 0 @@ -3513,6 +3971,19 @@ func (m *Test) SizeVT() (n int) { l = m.Options.SizeVT() n += 1 + l + sov(uint64(l)) } + if len(m.ExpectedOutputs) > 0 { + for k, v := range m.ExpectedOutputs { + _ = k + _ = v + l = 0 + if v != nil { + l = v.SizeVT() + } + l += 1 + sov(uint64(l)) + mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l + n += mapEntrySize + 1 + sov(uint64(mapEntrySize)) + } + } n += len(m.unknownFields) return n } @@ -3725,22 +4196,119 @@ func (m *TestResults_Details_Error) SizeVT() (n int) { n += 1 + l + sov(uint64(l)) return n } -func (m *TestResults_Failure) SizeVT() (n int) { +func (m *TestResults_OutputFailure_MismatchedValue) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.Expected != 0 { - n += 1 + sov(uint64(m.Expected)) - } - if m.Actual != 0 { - n += 1 + sov(uint64(m.Actual)) + if m.Expected != nil { + if size, ok := interface{}(m.Expected).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(m.Expected) + } + n += 1 + l + sov(uint64(l)) } - n += len(m.unknownFields) - return n -} - + if m.Actual != nil { + if size, ok := interface{}(m.Actual).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(m.Actual) + } + n += 1 + l + sov(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TestResults_OutputFailure_MissingValue) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Expected != nil { + if size, ok := interface{}(m.Expected).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(m.Expected) + } + n += 1 + l + sov(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *TestResults_OutputFailure) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Src) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + if vtmsg, ok := m.Outcome.(interface{ SizeVT() int }); ok { + n += vtmsg.SizeVT() + } + n += len(m.unknownFields) + return n +} + +func (m *TestResults_OutputFailure_Mismatched) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Mismatched != nil { + l = m.Mismatched.SizeVT() + n += 1 + l + sov(uint64(l)) + } + return n +} +func (m *TestResults_OutputFailure_Missing) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Missing != nil { + l = m.Missing.SizeVT() + n += 1 + l + sov(uint64(l)) + } + return n +} +func (m *TestResults_Failure) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Expected != 0 { + n += 1 + sov(uint64(m.Expected)) + } + if m.Actual != 0 { + n += 1 + sov(uint64(m.Actual)) + } + if len(m.Outputs) > 0 { + for _, e := range m.Outputs { + l = e.SizeVT() + n += 1 + l + sov(uint64(l)) + } + } + n += len(m.unknownFields) + return n +} + func (m *TestResults) SizeVT() (n int) { if m == nil { return 0 @@ -8157,6 +8725,131 @@ func (m *TestTable_Input) UnmarshalVT(dAtA []byte) error { } return nil } +func (m *TestTable_OutputExpectations) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestTable_OutputExpectations: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestTable_OutputExpectations: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expected", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expected = append(m.Expected, &v11.OutputEntry{}) + if unmarshal, ok := interface{}(m.Expected[len(m.Expected)-1]).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Expected[len(m.Expected)-1]); err != nil { + return err + } + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TestTable_Expectation) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8363,6 +9056,40 @@ func (m *TestTable_Expectation) UnmarshalVT(dAtA []byte) error { } m.Actions[mapkey] = mapvalue iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Outputs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Outputs = append(m.Outputs, &TestTable_OutputExpectations{}) + if err := m.Outputs[len(m.Outputs)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -8805,7 +9532,7 @@ func (m *Test_TestName) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *Test) UnmarshalVT(dAtA []byte) error { +func (m *Test_OutputEntries) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8828,15 +9555,15 @@ func (m *Test) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Test: wiretype end group for non-group") + return fmt.Errorf("proto: Test_OutputEntries: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Test: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Test_OutputEntries: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8863,29 +9590,217 @@ func (m *Test) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Name == nil { - m.Name = &Test_TestName{} - } - if err := m.Name.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + if m.Entries == nil { + m.Entries = make(map[string]*structpb.Value) } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { + var mapkey string + var mapvalue *structpb.Value + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &structpb.Value{} + if unmarshal, ok := interface{}(mapvalue).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postmsgIndex], mapvalue); err != nil { + return err + } + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Entries[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Test) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Test: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Test: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Name == nil { + m.Name = &Test_TestName{} + } + if err := m.Name.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { break } } @@ -9147,39 +10062,168 @@ func (m *Test) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpectedOutputs", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + if msglen < 0 { + return ErrInvalidLength } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TestResults_Tally) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength } - if iNdEx >= l { + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExpectedOutputs == nil { + m.ExpectedOutputs = make(map[string]*Test_OutputEntries) + } + var mapkey string + var mapvalue *Test_OutputEntries + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLength + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLength + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLength + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLength + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Test_OutputEntries{} + if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ExpectedOutputs[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TestResults_Tally) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] @@ -9310,7 +10354,394 @@ func (m *TestResults_Summary) UnmarshalVT(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field TestsCount", wireType) } - m.TestsCount = 0 + m.TestsCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TestsCount |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResultCounts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResultCounts = append(m.ResultCounts, &TestResults_Tally{}) + if err := m.ResultCounts[len(m.ResultCounts)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestResults_Suite: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestResults_Suite: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field File", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.File = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Principals", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Principals = append(m.Principals, &TestResults_Principal{}) + if err := m.Principals[len(m.Principals)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Summary", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Summary == nil { + m.Summary = &TestResults_Summary{} + } + if err := m.Summary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TestCases", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TestCases = append(m.TestCases, &TestResults_TestCase{}) + if err := m.TestCases[len(m.TestCases)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TestResults_TestCase) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestResults_TestCase: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestResults_TestCase: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -9320,14 +10751,27 @@ func (m *TestResults_Summary) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TestsCount |= uint32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - case 3: + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResultCounts", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Principals", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9354,8 +10798,8 @@ func (m *TestResults_Summary) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResultCounts = append(m.ResultCounts, &TestResults_Tally{}) - if err := m.ResultCounts[len(m.ResultCounts)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Principals = append(m.Principals, &TestResults_Principal{}) + if err := m.Principals[len(m.Principals)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -9381,7 +10825,7 @@ func (m *TestResults_Summary) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { +func (m *TestResults_Principal) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9404,45 +10848,13 @@ func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TestResults_Suite: wiretype end group for non-group") + return fmt.Errorf("proto: TestResults_Principal: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TestResults_Suite: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TestResults_Principal: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field File", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.File = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } @@ -9474,9 +10886,9 @@ func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { } m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Principals", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9503,50 +10915,65 @@ func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Principals = append(m.Principals, &TestResults_Principal{}) - if err := m.Principals[len(m.Principals)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Resources = append(m.Resources, &TestResults_Resource{}) + if err := m.Resources[len(m.Resources)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Summary", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err } - postIndex := iNdEx + msglen - if postIndex < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLength } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if m.Summary == nil { - m.Summary = &TestResults_Summary{} + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TestResults_Resource) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow } - if err := m.Summary.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + if iNdEx >= l { + return io.ErrUnexpectedEOF } - iNdEx = postIndex - case 5: + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestResults_Resource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestResults_Resource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -9574,11 +11001,11 @@ func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TestCases", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9605,43 +11032,11 @@ func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TestCases = append(m.TestCases, &TestResults_TestCase{}) - if err := m.TestCases[len(m.TestCases)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + m.Actions = append(m.Actions, &TestResults_Action{}) + if err := m.Actions[len(m.Actions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -9664,7 +11059,7 @@ func (m *TestResults_Suite) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TestResults_TestCase) UnmarshalVT(dAtA []byte) error { +func (m *TestResults_Action) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9687,10 +11082,10 @@ func (m *TestResults_TestCase) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TestResults_TestCase: wiretype end group for non-group") + return fmt.Errorf("proto: TestResults_Action: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TestResults_TestCase: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TestResults_Action: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -9727,7 +11122,7 @@ func (m *TestResults_TestCase) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Principals", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9754,8 +11149,10 @@ func (m *TestResults_TestCase) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Principals = append(m.Principals, &TestResults_Principal{}) - if err := m.Principals[len(m.Principals)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if m.Details == nil { + m.Details = &TestResults_Details{} + } + if err := m.Details.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -9781,7 +11178,7 @@ func (m *TestResults_TestCase) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TestResults_Principal) UnmarshalVT(dAtA []byte) error { +func (m *TestResults_Details) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9791,28 +11188,88 @@ func (m *TestResults_Principal) UnmarshalVT(dAtA []byte) error { if shift >= 64 { return ErrIntOverflow } - if iNdEx >= l { + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestResults_Details: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestResults_Details: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + m.Result = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Result |= TestResults_Result(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Failure", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if oneof, ok := m.Outcome.(*TestResults_Details_Failure); ok { + if err := oneof.Failure.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &TestResults_Failure{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Outcome = &TestResults_Details_Failure{Failure: v} } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TestResults_Principal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TestResults_Principal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -9840,11 +11297,11 @@ func (m *TestResults_Principal) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Outcome = &TestResults_Details_Error{Error: string(dAtA[iNdEx:postIndex])} iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EngineTrace", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9871,9 +11328,17 @@ func (m *TestResults_Principal) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Resources = append(m.Resources, &TestResults_Resource{}) - if err := m.Resources[len(m.Resources)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + m.EngineTrace = append(m.EngineTrace, &v11.Trace{}) + if unmarshal, ok := interface{}(m.EngineTrace[len(m.EngineTrace)-1]).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.EngineTrace[len(m.EngineTrace)-1]); err != nil { + return err + } } iNdEx = postIndex default: @@ -9898,7 +11363,7 @@ func (m *TestResults_Principal) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TestResults_Resource) UnmarshalVT(dAtA []byte) error { +func (m *TestResults_OutputFailure_MismatchedValue) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9921,17 +11386,17 @@ func (m *TestResults_Resource) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TestResults_Resource: wiretype end group for non-group") + return fmt.Errorf("proto: TestResults_OutputFailure_MismatchedValue: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TestResults_Resource: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TestResults_OutputFailure_MismatchedValue: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expected", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -9941,27 +11406,39 @@ func (m *TestResults_Resource) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + if m.Expected == nil { + m.Expected = &structpb.Value{} + } + if unmarshal, ok := interface{}(m.Expected).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Expected); err != nil { + return err + } + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Actual", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9988,9 +11465,19 @@ func (m *TestResults_Resource) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Actions = append(m.Actions, &TestResults_Action{}) - if err := m.Actions[len(m.Actions)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + if m.Actual == nil { + m.Actual = &structpb.Value{} + } + if unmarshal, ok := interface{}(m.Actual).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Actual); err != nil { + return err + } } iNdEx = postIndex default: @@ -10015,7 +11502,7 @@ func (m *TestResults_Resource) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TestResults_Action) UnmarshalVT(dAtA []byte) error { +func (m *TestResults_OutputFailure_MissingValue) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10038,47 +11525,15 @@ func (m *TestResults_Action) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TestResults_Action: wiretype end group for non-group") + return fmt.Errorf("proto: TestResults_OutputFailure_MissingValue: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TestResults_Action: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TestResults_OutputFailure_MissingValue: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expected", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10105,11 +11560,19 @@ func (m *TestResults_Action) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Details == nil { - m.Details = &TestResults_Details{} + if m.Expected == nil { + m.Expected = &structpb.Value{} } - if err := m.Details.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + if unmarshal, ok := interface{}(m.Expected).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Expected); err != nil { + return err + } } iNdEx = postIndex default: @@ -10134,7 +11597,7 @@ func (m *TestResults_Action) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *TestResults_Details) UnmarshalVT(dAtA []byte) error { +func (m *TestResults_OutputFailure) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10157,17 +11620,17 @@ func (m *TestResults_Details) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TestResults_Details: wiretype end group for non-group") + return fmt.Errorf("proto: TestResults_OutputFailure: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TestResults_Details: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TestResults_OutputFailure: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Src", wireType) } - m.Result = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -10177,14 +11640,27 @@ func (m *TestResults_Details) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Result |= TestResults_Result(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Src = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Failure", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Mismatched", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10211,53 +11687,21 @@ func (m *TestResults_Details) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if oneof, ok := m.Outcome.(*TestResults_Details_Failure); ok { - if err := oneof.Failure.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if oneof, ok := m.Outcome.(*TestResults_OutputFailure_Mismatched); ok { + if err := oneof.Mismatched.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } } else { - v := &TestResults_Failure{} + v := &TestResults_OutputFailure_MismatchedValue{} if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Outcome = &TestResults_Details_Failure{Failure: v} + m.Outcome = &TestResults_OutputFailure_Mismatched{Mismatched: v} } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Outcome = &TestResults_Details_Error{Error: string(dAtA[iNdEx:postIndex])} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EngineTrace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Missing", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -10284,17 +11728,16 @@ func (m *TestResults_Details) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EngineTrace = append(m.EngineTrace, &v11.Trace{}) - if unmarshal, ok := interface{}(m.EngineTrace[len(m.EngineTrace)-1]).(interface { - UnmarshalVT([]byte) error - }); ok { - if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if oneof, ok := m.Outcome.(*TestResults_OutputFailure_Missing); ok { + if err := oneof.Missing.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } } else { - if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.EngineTrace[len(m.EngineTrace)-1]); err != nil { + v := &TestResults_OutputFailure_MissingValue{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Outcome = &TestResults_OutputFailure_Missing{Missing: v} } iNdEx = postIndex default: @@ -10386,6 +11829,40 @@ func (m *TestResults_Failure) UnmarshalVT(dAtA []byte) error { break } } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Outputs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Outputs = append(m.Outputs, &TestResults_OutputFailure{}) + if err := m.Outputs[len(m.Outputs)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) diff --git a/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go b/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go index ba8e630a8..7208e04ad 100644 --- a/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go +++ b/api/genpb/cerbos/private/v1/hashpb_helpers.pb.go @@ -915,6 +915,63 @@ func cerbos_policy_v1_TestResults_Failure_hashpb_sum(m *v11.TestResults_Failure, _, _ = hasher.Write(protowire.AppendVarint(nil, uint64(m.Actual))) } + if _, ok := ignore["cerbos.policy.v1.TestResults.Failure.outputs"]; !ok { + if len(m.Outputs) > 0 { + for _, v := range m.Outputs { + if v != nil { + cerbos_policy_v1_TestResults_OutputFailure_hashpb_sum(v, hasher, ignore) + } + + } + } + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_MismatchedValue_hashpb_sum(m *v11.TestResults_OutputFailure_MismatchedValue, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.expected"]; !ok { + if m.Expected != nil { + google_protobuf_Value_hashpb_sum(m.Expected, hasher, ignore) + } + + } + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.actual"]; !ok { + if m.Actual != nil { + google_protobuf_Value_hashpb_sum(m.Actual, hasher, ignore) + } + + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_MissingValue_hashpb_sum(m *v11.TestResults_OutputFailure_MissingValue, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MissingValue.expected"]; !ok { + if m.Expected != nil { + google_protobuf_Value_hashpb_sum(m.Expected, hasher, ignore) + } + + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_hashpb_sum(m *v11.TestResults_OutputFailure, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.src"]; !ok { + _, _ = hasher.Write(protowire.AppendString(nil, m.Src)) + + } + if m.Outcome != nil { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.outcome"]; !ok { + switch t := m.Outcome.(type) { + case *v11.TestResults_OutputFailure_Mismatched: + if t.Mismatched != nil { + cerbos_policy_v1_TestResults_OutputFailure_MismatchedValue_hashpb_sum(t.Mismatched, hasher, ignore) + } + + case *v11.TestResults_OutputFailure_Missing: + if t.Missing != nil { + cerbos_policy_v1_TestResults_OutputFailure_MissingValue_hashpb_sum(t.Missing, hasher, ignore) + } + + } + } + } } func cerbos_policy_v1_TestResults_Principal_hashpb_sum(m *v11.TestResults_Principal, hasher hash.Hash, ignore map[string]struct{}) { @@ -1090,6 +1147,16 @@ func cerbos_policy_v1_TestTable_Expectation_hashpb_sum(m *v11.TestTable_Expectat } } } + if _, ok := ignore["cerbos.policy.v1.TestTable.Expectation.outputs"]; !ok { + if len(m.Outputs) > 0 { + for _, v := range m.Outputs { + if v != nil { + cerbos_policy_v1_TestTable_OutputExpectations_hashpb_sum(v, hasher, ignore) + } + + } + } + } } func cerbos_policy_v1_TestTable_Input_hashpb_sum(m *v11.TestTable_Input, hasher hash.Hash, ignore map[string]struct{}) { @@ -1123,6 +1190,23 @@ func cerbos_policy_v1_TestTable_Input_hashpb_sum(m *v11.TestTable_Input, hasher } } +func cerbos_policy_v1_TestTable_OutputExpectations_hashpb_sum(m *v11.TestTable_OutputExpectations, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestTable.OutputExpectations.action"]; !ok { + _, _ = hasher.Write(protowire.AppendString(nil, m.Action)) + + } + if _, ok := ignore["cerbos.policy.v1.TestTable.OutputExpectations.expected"]; !ok { + if len(m.Expected) > 0 { + for _, v := range m.Expected { + if v != nil { + cerbos_engine_v1_OutputEntry_hashpb_sum(v, hasher, ignore) + } + + } + } + } +} + func cerbos_policy_v1_TestTable_hashpb_sum(m *v11.TestTable, hasher hash.Hash, ignore map[string]struct{}) { if _, ok := ignore["cerbos.policy.v1.TestTable.name"]; !ok { _, _ = hasher.Write(protowire.AppendString(nil, m.Name)) @@ -1164,6 +1248,28 @@ func cerbos_policy_v1_TestTable_hashpb_sum(m *v11.TestTable, hasher hash.Hash, i } } +func cerbos_policy_v1_Test_OutputEntries_hashpb_sum(m *v11.Test_OutputEntries, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.Test.OutputEntries.entries"]; !ok { + if len(m.Entries) > 0 { + keys := make([]string, len(m.Entries)) + i := 0 + for k := range m.Entries { + keys[i] = k + i++ + } + + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + + for _, k := range keys { + if m.Entries[k] != nil { + google_protobuf_Value_hashpb_sum(m.Entries[k], hasher, ignore) + } + + } + } + } +} + func cerbos_policy_v1_Test_TestName_hashpb_sum(m *v11.Test_TestName, hasher hash.Hash, ignore map[string]struct{}) { if _, ok := ignore["cerbos.policy.v1.Test.TestName.test_table_name"]; !ok { _, _ = hasher.Write(protowire.AppendString(nil, m.TestTableName)) @@ -1227,6 +1333,25 @@ func cerbos_policy_v1_Test_hashpb_sum(m *v11.Test, hasher hash.Hash, ignore map[ } } + if _, ok := ignore["cerbos.policy.v1.Test.expected_outputs"]; !ok { + if len(m.ExpectedOutputs) > 0 { + keys := make([]string, len(m.ExpectedOutputs)) + i := 0 + for k := range m.ExpectedOutputs { + keys[i] = k + i++ + } + + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + + for _, k := range keys { + if m.ExpectedOutputs[k] != nil { + cerbos_policy_v1_Test_OutputEntries_hashpb_sum(m.ExpectedOutputs[k], hasher, ignore) + } + + } + } + } } func cerbos_private_v1_AttrWrapper_hashpb_sum(m *AttrWrapper, hasher hash.Hash, ignore map[string]struct{}) { diff --git a/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go b/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go index 6bbb992f6..354658bf8 100644 --- a/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go +++ b/api/genpb/cerbos/response/v1/hashpb_helpers.pb.go @@ -1147,6 +1147,63 @@ func cerbos_policy_v1_TestResults_Failure_hashpb_sum(m *v12.TestResults_Failure, _, _ = hasher.Write(protowire.AppendVarint(nil, uint64(m.Actual))) } + if _, ok := ignore["cerbos.policy.v1.TestResults.Failure.outputs"]; !ok { + if len(m.Outputs) > 0 { + for _, v := range m.Outputs { + if v != nil { + cerbos_policy_v1_TestResults_OutputFailure_hashpb_sum(v, hasher, ignore) + } + + } + } + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_MismatchedValue_hashpb_sum(m *v12.TestResults_OutputFailure_MismatchedValue, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.expected"]; !ok { + if m.Expected != nil { + google_protobuf_Value_hashpb_sum(m.Expected, hasher, ignore) + } + + } + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue.actual"]; !ok { + if m.Actual != nil { + google_protobuf_Value_hashpb_sum(m.Actual, hasher, ignore) + } + + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_MissingValue_hashpb_sum(m *v12.TestResults_OutputFailure_MissingValue, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.MissingValue.expected"]; !ok { + if m.Expected != nil { + google_protobuf_Value_hashpb_sum(m.Expected, hasher, ignore) + } + + } +} + +func cerbos_policy_v1_TestResults_OutputFailure_hashpb_sum(m *v12.TestResults_OutputFailure, hasher hash.Hash, ignore map[string]struct{}) { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.src"]; !ok { + _, _ = hasher.Write(protowire.AppendString(nil, m.Src)) + + } + if m.Outcome != nil { + if _, ok := ignore["cerbos.policy.v1.TestResults.OutputFailure.outcome"]; !ok { + switch t := m.Outcome.(type) { + case *v12.TestResults_OutputFailure_Mismatched: + if t.Mismatched != nil { + cerbos_policy_v1_TestResults_OutputFailure_MismatchedValue_hashpb_sum(t.Mismatched, hasher, ignore) + } + + case *v12.TestResults_OutputFailure_Missing: + if t.Missing != nil { + cerbos_policy_v1_TestResults_OutputFailure_MissingValue_hashpb_sum(t.Missing, hasher, ignore) + } + + } + } + } } func cerbos_policy_v1_TestResults_Principal_hashpb_sum(m *v12.TestResults_Principal, hasher hash.Hash, ignore map[string]struct{}) { diff --git a/api/public/cerbos/policy/v1/policy.proto b/api/public/cerbos/policy/v1/policy.proto index 5fdf74d5f..80b08da56 100644 --- a/api/public/cerbos/policy/v1/policy.proto +++ b/api/public/cerbos/policy/v1/policy.proto @@ -7,6 +7,7 @@ package cerbos.policy.v1; import "cerbos/effect/v1/effect.proto"; import "cerbos/engine/v1/engine.proto"; +import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "validate/validate.proto"; @@ -233,6 +234,11 @@ message TestTable { string aux_data = 4; } + message OutputExpectations { + string action = 1 [(validate.rules).string.min_len = 1]; + repeated cerbos.engine.v1.OutputEntry expected = 2 [(validate.rules).repeated.min_items = 1]; + } + message Expectation { string principal = 1 [(validate.rules).string.min_len = 1]; string resource = 2 [(validate.rules).string.min_len = 1]; @@ -242,6 +248,7 @@ message TestTable { string: {min_len: 1} } }]; + repeated OutputExpectations outputs = 4; } string name = 1 [(validate.rules).string.min_len = 1]; @@ -260,6 +267,10 @@ message Test { string resource_key = 3 [(validate.rules).string.min_len = 1]; } + message OutputEntries { + map entries = 1; + } + TestName name = 1 [(validate.rules).message.required = true]; string description = 2; bool skip = 3; @@ -272,6 +283,7 @@ message Test { } }]; TestOptions options = 7; + map expected_outputs = 8; } message TestResults { @@ -333,9 +345,27 @@ message TestResults { repeated cerbos.engine.v1.Trace engine_trace = 4; } + message OutputFailure { + message MismatchedValue { + google.protobuf.Value expected = 1; + google.protobuf.Value actual = 2; + } + + message MissingValue { + google.protobuf.Value expected = 1; + } + + string src = 1; + oneof outcome { + MismatchedValue mismatched = 2; + MissingValue missing = 3; + } + } + message Failure { cerbos.effect.v1.Effect expected = 1; cerbos.effect.v1.Effect actual = 2; + repeated OutputFailure outputs = 3; } repeated Suite suites = 1; diff --git a/cmd/cerbos/compile/internal/verification/display.go b/cmd/cerbos/compile/internal/verification/display.go index a9af20d0b..c7864b61c 100644 --- a/cmd/cerbos/compile/internal/verification/display.go +++ b/cmd/cerbos/compile/internal/verification/display.go @@ -10,6 +10,8 @@ import ( "github.com/pterm/pterm" "github.com/pterm/pterm/putils" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" policyv1 "github.com/cerbos/cerbos/api/genpb/cerbos/policy/v1" "github.com/cerbos/cerbos/cmd/cerbos/compile/internal/flagset" @@ -21,12 +23,15 @@ import ( ) const ( - suiteLevel = 0 - testCaseLevel = 1 - principalLevel = 2 - resourceLevel = 3 - actionLevel = 4 - resultLevel = 5 + suiteLevel = 0 + testCaseLevel = 1 + principalLevel = 2 + resourceLevel = 3 + actionLevel = 4 + resultLevel = 5 + outputSrcLevel = 6 + outputErrKindLevel = 7 + outputErrValLevel = 8 listIndent = 2 ) @@ -233,7 +238,24 @@ func (o *testOutput) addAction(suite *policyv1.TestResults_Suite, principal *pol case policyv1.TestResults_RESULT_FAILED: failure := action.Details.GetFailure() o.traces.Add(suite.Name, principal.Name, resource.Name, action.Name, action.Details.EngineTrace) - o.appendNode(resultLevel, fmt.Sprintf("%s expected: %s, actual: %s", colored.ErrorMsg("OUTCOME:"), failure.Expected, colored.FailedTest(failure.Actual))) + if len(failure.Outputs) > 0 { + o.appendNode(resultLevel, fmt.Sprintf("%s output expectation unsatisfied", colored.ErrorMsg("OUTCOME:"))) + for _, output := range failure.Outputs { + o.appendNode(outputSrcLevel, colored.TestOutputSrc(output.Src)) + switch t := output.Outcome.(type) { + case *policyv1.TestResults_OutputFailure_Mismatched: + o.appendNode(outputErrKindLevel, fmt.Sprintf("%s %s", colored.TestOutputVal("EXPECTED:"), singleLineJSON(t.Mismatched.Expected))) + o.appendNode(outputErrKindLevel, fmt.Sprintf("%s %s", colored.TestOutputVal("ACTUAL:"), singleLineJSON(t.Mismatched.Actual))) + case *policyv1.TestResults_OutputFailure_Missing: + o.appendNode(outputErrKindLevel, fmt.Sprintf("%s %s", colored.TestOutputVal("EXPECTED:"), singleLineJSON(t.Missing.Expected))) + o.appendNode(outputErrKindLevel, fmt.Sprintf("%s %s", colored.TestOutputVal("ACTUAL:"), colored.ErrorMsg("MISSING"))) + default: + o.appendNode(outputErrKindLevel, colored.ErrorMsg("")) + } + } + } else { + o.appendNode(resultLevel, fmt.Sprintf("%s expected: %s, actual: %s", colored.ErrorMsg("OUTCOME:"), failure.Expected, colored.FailedTest(failure.Actual))) + } case policyv1.TestResults_RESULT_ERRORED: o.traces.Add(suite.Name, principal.Name, resource.Name, action.Name, action.Details.EngineTrace) @@ -258,3 +280,12 @@ func resultLabel(result policyv1.TestResults_Result) string { func tallyLabel(tally *policyv1.TestResults_Tally) string { return labelColors[tally.Result](fmt.Sprintf("[%d %s]", tally.Count, labels[tally.Result])) } + +func singleLineJSON(m proto.Message) string { + v, err := protojson.Marshal(m) + if err != nil { + return "" + } + + return string(v) +} diff --git a/docs/modules/policies/pages/compile.adoc b/docs/modules/policies/pages/compile.adoc index 350268483..7e3eaace8 100644 --- a/docs/modules/policies/pages/compile.adoc +++ b/docs/modules/policies/pages/compile.adoc @@ -80,6 +80,15 @@ tests: <7> actions: <18> view: EFFECT_ALLOW delete: EFFECT_ALLOW + outputs: <19> + - action: view <20> + expected: <21> + - src: resource.album.vdefault#view-rule + val: + key1: value1 + key2: ["value2", "value3"] + - src: resource.album.vdefault#token-lifetime + val: 1h - principal: bradley resource: bradley_album actions: @@ -104,6 +113,9 @@ tests: <7> <16> Key of the principal fixture under test <17> Key of the resource fixture under test <18> Expected outcomes for each action for the principal+resource pair +<19> Optional list of xref:outputs.adoc[output values] to match +<20> Name of the action that would produce the output +<21> List of expected output values === Sharing test fixtures diff --git a/internal/printer/colored/colored.go b/internal/printer/colored/colored.go index c1598a980..ad22a727e 100644 --- a/internal/printer/colored/colored.go +++ b/internal/printer/colored/colored.go @@ -14,6 +14,8 @@ var ( Header = color.New(color.FgHiWhite, color.Bold).SprintFunc() PassedTest = color.New(color.FgGreen).SprintFunc() TestCase = color.New(color.FgBlue).SprintFunc() + TestOutputSrc = color.New(color.FgBlue).SprintFunc() + TestOutputVal = color.New(color.FgBlue).SprintFunc() Principal = color.New(color.FgCyan).SprintFunc() REPLCmd = color.New(color.FgYellow).SprintFunc() REPLError = color.New(color.FgRed).SprintFunc() diff --git a/internal/test/testdata/verify/cases/case_011.yaml b/internal/test/testdata/verify/cases/case_011.yaml new file mode 100644 index 000000000..4112e98c2 --- /dev/null +++ b/internal/test/testdata/verify/cases/case_011.yaml @@ -0,0 +1 @@ +description: Verify outputs diff --git a/internal/test/testdata/verify/cases/case_011.yaml.golden b/internal/test/testdata/verify/cases/case_011.yaml.golden new file mode 100644 index 000000000..d38e69de7 --- /dev/null +++ b/internal/test/testdata/verify/cases/case_011.yaml.golden @@ -0,0 +1,258 @@ +{ + "suites": [ + { + "file": "suite_test.yaml", + "name": "TestSuite", + "summary": { + "overallResult": "RESULT_FAILED", + "testsCount": 18, + "resultCounts": [ + { + "result": "RESULT_PASSED", + "count": 16 + }, + { + "result": "RESULT_FAILED", + "count": 2 + } + ] + }, + "testCases": [ + { + "name": "John's request", + "principals": [ + { + "name": "john", + "resources": [ + { + "name": "john_equipment_request", + "actions": [ + { + "name": "view:public", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "approve", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "create", + "details": { + "result": "RESULT_PASSED" + } + } + ] + }, + { + "name": "john_pending_equipment_request", + "actions": [ + { + "name": "view:public", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "approve", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "create", + "details": { + "result": "RESULT_PASSED" + } + } + ] + } + ] + }, + { + "name": "bev", + "resources": [ + { + "name": "john_equipment_request", + "actions": [ + { + "name": "view:public", + "details": { + "result": "RESULT_FAILED", + "failure": { + "expected": "EFFECT_ALLOW", + "actual": "EFFECT_ALLOW", + "outputs": [ + { + "src": "resource.equipment_request.vdefault#public-view", + "mismatched": { + "expected": { + "formatted_string": "id:john", + "id": "john", + "keys": "XX125", + "some_bool": true, + "some_list": [ + "foo", + "bar" + ], + "something_nested": { + "nested_bool": false, + "nested_formatted_string": "id:john", + "nested_list": [ + "nest_foo", + 1.01 + ], + "nested_str": "foo" + } + }, + "actual": { + "formatted_string": "id:bev", + "id": "bev", + "keys": "XX125", + "some_bool": true, + "some_list": [ + "foo", + "bar" + ], + "something_nested": { + "nested_bool": false, + "nested_formatted_string": "id:bev", + "nested_list": [ + "nest_foo", + 1.01 + ], + "nested_str": "foo" + } + } + } + } + ] + } + } + }, + { + "name": "approve", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "create", + "details": { + "result": "RESULT_PASSED" + } + } + ] + }, + { + "name": "john_pending_equipment_request", + "actions": [ + { + "name": "view:public", + "details": { + "result": "RESULT_FAILED", + "failure": { + "expected": "EFFECT_ALLOW", + "actual": "EFFECT_ALLOW", + "outputs": [ + { + "src": "resource.equipment_request.vdefault#foo", + "missing": { + "expected": "bar" + } + } + ] + } + } + }, + { + "name": "approve", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "create", + "details": { + "result": "RESULT_PASSED" + } + } + ] + } + ] + }, + { + "name": "terry_tibbs", + "resources": [ + { + "name": "john_equipment_request", + "actions": [ + { + "name": "view:public", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "approve", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "create", + "details": { + "result": "RESULT_PASSED" + } + } + ] + }, + { + "name": "john_pending_equipment_request", + "actions": [ + { + "name": "view:public", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "approve", + "details": { + "result": "RESULT_PASSED" + } + }, + { + "name": "create", + "details": { + "result": "RESULT_PASSED" + } + } + ] + } + ] + } + ] + } + ], + "description": "Tests for equipment requests" + } + ], + "summary": { + "overallResult": "RESULT_FAILED", + "testsCount": 18, + "resultCounts": [ + { + "result": "RESULT_PASSED", + "count": 16 + }, + { + "result": "RESULT_FAILED", + "count": 2 + } + ] + } +} \ No newline at end of file diff --git a/internal/test/testdata/verify/cases/case_011.yaml.input b/internal/test/testdata/verify/cases/case_011.yaml.input new file mode 100644 index 000000000..6b8d15591 --- /dev/null +++ b/internal/test/testdata/verify/cases/case_011.yaml.input @@ -0,0 +1,176 @@ +-- testdata/principals.yaml -- +--- +principals: + john: + id: john + roles: + - employee + attr: + department: marketing + geography: GB + team: design + bev: + id: bev + roles: + - employee + - manager + attr: + department: marketing + geography: GB + managed_geographies: GB + team: design + terry_tibbs: + id: terry_tibbs + roles: + - employee + attr: + department: accounting + geography: GB + team: payroll + +-- testdata/resources.yaml -- +--- +resources: + john_equipment_request: + kind: equipment_request + id: XX125 + scope: acme + attr: &attr + department: marketing + geography: GB + id: XX125 + owner: john + team: design + john_pending_equipment_request: + kind: equipment_request + id: XX225 + scope: acme + attr: + << : *attr + status: PENDING_APPROVAL + +-- suite_test.yaml -- +--- +name: TestSuite +description: Tests for equipment requests +tests: + - name: John's request + input: + principals: + - john + - bev + - terry_tibbs + resources: + - john_equipment_request + - john_pending_equipment_request + actions: + - view:public + - approve + - create + expected: + - principal: john + resource: john_equipment_request + actions: + view:public: EFFECT_ALLOW + approve: EFFECT_DENY + create: EFFECT_ALLOW + outputs: + - action: view:public + expected: + - src: "resource.equipment_request.vdefault#public-view" + val: + id: john + keys: XX125 + formatted_string: "id:john" + some_bool: true + some_list: ["foo", "bar"] + something_nested: + nested_str: foo + nested_bool: false + nested_list: ["nest_foo", 1.01] + nested_formatted_string: "id:john" + + - action: create + expected: + - src: "resource.equipment_request.vdefault/acme#rule-001" + val: "create_allowed:john" + + - principal: bev + resource: john_equipment_request + actions: + view:public: EFFECT_ALLOW + approve: EFFECT_DENY + create: EFFECT_ALLOW + outputs: + - action: view:public + expected: + - src: "resource.equipment_request.vdefault#public-view" + val: + id: john + keys: XX125 + formatted_string: "id:john" + some_bool: true + some_list: ["foo", "bar"] + something_nested: + nested_str: foo + nested_bool: false + nested_list: ["nest_foo", 1.01] + nested_formatted_string: "id:john" + + - action: create + expected: + - src: "resource.equipment_request.vdefault/acme#rule-001" + val: "create_allowed:bev" + + - principal: terry_tibbs + resource: john_equipment_request + actions: + view:public: EFFECT_ALLOW + approve: EFFECT_DENY + create: EFFECT_ALLOW + outputs: + - action: create + expected: + - src: "principal.terry_tibbs.vdefault#create-rule" + val: ["foo", ["bar", true]] + + - principal: john + resource: john_pending_equipment_request + actions: + view:public: EFFECT_ALLOW + approve: EFFECT_DENY + create: EFFECT_ALLOW + + - principal: bev + resource: john_pending_equipment_request + actions: + view:public: EFFECT_ALLOW + approve: EFFECT_ALLOW + create: EFFECT_ALLOW + outputs: + - action: view:public + expected: + - src: "resource.equipment_request.vdefault#foo" + val: "bar" + + - action: approve + expected: + - src: "resource.equipment_request.vdefault#rule-002" + val: "approval_status:bev:PENDING_APPROVAL" + + - action: create + expected: + - src: "resource.equipment_request.vdefault/acme#rule-001" + val: "create_allowed:bev" + + - principal: terry_tibbs + resource: john_pending_equipment_request + actions: + view:public: EFFECT_ALLOW + approve: EFFECT_DENY + create: EFFECT_ALLOW + outputs: + - action: create + expected: + - src: "principal.terry_tibbs.vdefault#create-rule" + val: ["foo", ["bar", true]] diff --git a/internal/test/testdata/verify_junit/cases/case_001.yaml.golden b/internal/test/testdata/verify_junit/cases/case_001.yaml.golden index f0262e739..590ff661a 100644 --- a/internal/test/testdata/verify_junit/cases/case_001.yaml.golden +++ b/internal/test/testdata/verify_junit/cases/case_001.yaml.golden @@ -2,7 +2,7 @@ - + EFFECT_ALLOW EFFECT_DENY @@ -13,7 +13,7 @@ - + EFFECT_ALLOW EFFECT_DENY @@ -24,7 +24,7 @@ - + EFFECT_ALLOW EFFECT_DENY @@ -35,7 +35,7 @@ - + EFFECT_ALLOW EFFECT_DENY diff --git a/internal/test/testdata/verify_junit/cases/case_003.yaml.golden b/internal/test/testdata/verify_junit/cases/case_003.yaml.golden index 492752ab4..c70ee477a 100644 --- a/internal/test/testdata/verify_junit/cases/case_003.yaml.golden +++ b/internal/test/testdata/verify_junit/cases/case_003.yaml.golden @@ -10,7 +10,7 @@ - + EFFECT_ALLOW EFFECT_DENY diff --git a/internal/test/testdata/verify_junit/cases/case_004.yaml.golden b/internal/test/testdata/verify_junit/cases/case_004.yaml.golden index 492752ab4..c70ee477a 100644 --- a/internal/test/testdata/verify_junit/cases/case_004.yaml.golden +++ b/internal/test/testdata/verify_junit/cases/case_004.yaml.golden @@ -10,7 +10,7 @@ - + EFFECT_ALLOW EFFECT_DENY diff --git a/internal/test/testdata/verify_junit/cases/case_007.yaml b/internal/test/testdata/verify_junit/cases/case_007.yaml new file mode 100644 index 000000000..dcb107fbf --- /dev/null +++ b/internal/test/testdata/verify_junit/cases/case_007.yaml @@ -0,0 +1,2 @@ +--- +description: Outputs mismatch diff --git a/internal/test/testdata/verify_junit/cases/case_007.yaml.golden b/internal/test/testdata/verify_junit/cases/case_007.yaml.golden new file mode 100644 index 000000000..3c7464fc9 --- /dev/null +++ b/internal/test/testdata/verify_junit/cases/case_007.yaml.golden @@ -0,0 +1,59 @@ + + + + + + + + + + + + EFFECT_ALLOW + EFFECT_ALLOW + + + admin + company + create + + + + + admin + company + read + + + + + user + company + create + + + + + + + + + + + EFFECT_ALLOW + EFFECT_ALLOW + + + user + company + read + + + + \ No newline at end of file diff --git a/internal/test/testdata/verify_junit/cases/case_007.yaml.input b/internal/test/testdata/verify_junit/cases/case_007.yaml.input new file mode 100644 index 000000000..4840103c3 --- /dev/null +++ b/internal/test/testdata/verify_junit/cases/case_007.yaml.input @@ -0,0 +1,70 @@ +-- suite_test.yaml -- +--- +name: CompanyTestSuite +description: Tests for verifying the company resource policy +principals: + admin: + id: admin + roles: + - admin + user: + id: user + roles: + - user +resources: + company: + id: xx1 + kind: company + +tests: + - name: Company Test 1 + input: + principals: + - admin + resources: + - company + actions: + - create + - read + expected: + - principal: admin + resource: company + actions: + create: EFFECT_ALLOW + read: EFFECT_ALLOW + outputs: + - action: create + expected: + - src: resource.company.vdefault#rule-001 + val: "foo" + + - name: Company Test 2 + input: + principals: + - user + resources: + - company + actions: + - create + - read + expected: + - principal: user + resource: company + actions: + create: EFFECT_ALLOW + read: EFFECT_ALLOW + outputs: + - action: create + expected: + - src: resource.company.vdefault#rule-001 + val: + principal: user + resource: xx1 + + - action: read + expected: + - src: resource.company.vdefault#rule-001 + val: + principal: blah + resource: yy1 + diff --git a/internal/test/testdata/verify_junit/store/company.yaml b/internal/test/testdata/verify_junit/store/company.yaml index 9d1b51743..bb7faca18 100644 --- a/internal/test/testdata/verify_junit/store/company.yaml +++ b/internal/test/testdata/verify_junit/store/company.yaml @@ -11,6 +11,9 @@ resourcePolicy: effect: EFFECT_ALLOW roles: - user + output: + expr: |- + {"principal": P.id, "resource": R.id} - actions: - "*" diff --git a/internal/verify/junit/junit.go b/internal/verify/junit/junit.go index 39373a05e..4ddd0d616 100644 --- a/internal/verify/junit/junit.go +++ b/internal/verify/junit/junit.go @@ -7,6 +7,8 @@ import ( "encoding/xml" "fmt" + "google.golang.org/protobuf/encoding/protojson" + policyv1 "github.com/cerbos/cerbos/api/genpb/cerbos/policy/v1" ) @@ -116,12 +118,40 @@ func processTestCases(s *policyv1.TestResults_Suite) ([]testCase, Summary, error case policyv1.TestResults_RESULT_FAILED: f, _ := a.Details.Outcome.(*policyv1.TestResults_Details_Failure) testCase.Failure = &failure{ - Type: a.Details.Result.String(), + Type: a.Details.Result.String(), + Message: "Effect expectation unsatisfied", resultFailed: resultFailed{ Actual: f.Failure.Actual.String(), Expected: f.Failure.Expected.String(), }, } + + if len(f.Failure.Outputs) > 0 { + outputSet := make([]output, len(f.Failure.Outputs)) + for i, o := range f.Failure.Outputs { + switch t := o.Outcome.(type) { + case *policyv1.TestResults_OutputFailure_Mismatched: + outputSet[i] = output{ + Src: o.Src, + Actual: outputValue{Value: protojson.Format(t.Mismatched.Actual)}, + Expected: outputValue{Value: protojson.Format(t.Mismatched.Expected)}, + } + case *policyv1.TestResults_OutputFailure_Missing: + outputSet[i] = output{ + Src: o.Src, + Expected: outputValue{Value: protojson.Format(t.Missing.Expected)}, + } + default: + outputSet[i] = output{ + Src: o.Src, + } + } + } + + testCase.Failure.Message = "Output expectation unsatisfied" + testCase.Failure.Outputs = &outputSet + } + summary.Failures++ case policyv1.TestResults_RESULT_PASSED: case policyv1.TestResults_RESULT_SKIPPED: @@ -181,14 +211,27 @@ type testError struct { } type failure struct { + resultFailed XMLName xml.Name `xml:"failure"` Type string `xml:"type,attr,omitempty"` - resultFailed + Message string `xml:"message,attr"` } type resultFailed struct { - Actual string `xml:"actual,omitempty"` - Expected string `xml:"expected,omitempty"` + Outputs *[]output `xml:"outputs>output,omitempty"` + Actual string `xml:"actual,omitempty"` + Expected string `xml:"expected,omitempty"` +} + +type output struct { + XMLName xml.Name `xml:"output"` + Src string `xml:"src,attr"` + Expected outputValue `xml:"expected"` + Actual outputValue `xml:"actual"` +} + +type outputValue struct { + Value string `xml:",cdata"` //nolint:tagliatelle } type skipped struct { diff --git a/internal/verify/test_fixture.go b/internal/verify/test_fixture.go index a32f2b5e6..a221c2f4a 100644 --- a/internal/verify/test_fixture.go +++ b/internal/verify/test_fixture.go @@ -13,6 +13,10 @@ import ( "go.uber.org/multierr" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/testing/protocmp" + "google.golang.org/protobuf/types/known/structpb" + + "github.com/google/go-cmp/cmp" enginev1 "github.com/cerbos/cerbos/api/genpb/cerbos/engine/v1" policyv1 "github.com/cerbos/cerbos/api/genpb/cerbos/policy/v1" @@ -218,6 +222,53 @@ func runTest(ctx context.Context, eng Checker, test *policyv1.Test, action strin return details } + if expectedOutputs, ok := test.ExpectedOutputs[action]; ok { + actualOutputs := make(map[string]*structpb.Value, len(actual[0].Outputs)) + for _, output := range actual[0].Outputs { + actualOutputs[output.Src] = output.Val + } + + var failures []*policyv1.TestResults_OutputFailure + for wantKey, wantValue := range expectedOutputs.Entries { + haveValue, ok := actualOutputs[wantKey] + if !ok { + failures = append(failures, &policyv1.TestResults_OutputFailure{ + Src: wantKey, + Outcome: &policyv1.TestResults_OutputFailure_Missing{ + Missing: &policyv1.TestResults_OutputFailure_MissingValue{ + Expected: wantValue, + }, + }, + }) + continue + } + + if !cmp.Equal(wantValue, haveValue, protocmp.Transform()) { + failures = append(failures, &policyv1.TestResults_OutputFailure{ + Src: wantKey, + Outcome: &policyv1.TestResults_OutputFailure_Mismatched{ + Mismatched: &policyv1.TestResults_OutputFailure_MismatchedValue{ + Actual: haveValue, + Expected: wantValue, + }, + }, + }) + } + } + + if len(failures) > 0 { + details.Result = policyv1.TestResults_RESULT_FAILED + details.Outcome = &policyv1.TestResults_Details_Failure{ + Failure: &policyv1.TestResults_Failure{ + Expected: test.Expected[action], + Actual: actual[0].Actions[action].Effect, + Outputs: failures, + }, + } + return details + } + } + details.Result = policyv1.TestResults_RESULT_PASSED return details } @@ -362,8 +413,9 @@ func (tf *testFixture) buildTest(suite *policyv1.TestSuite, table *policyv1.Test Actions: table.Input.Actions, AuxData: auxData, }, - Expected: matrixElement.Expected, - Options: options, + Expected: matrixElement.Expected.actions, + ExpectedOutputs: matrixElement.Expected.outputs, + Options: options, }, nil } diff --git a/internal/verify/test_matrix.go b/internal/verify/test_matrix.go index 7d195847a..898908b33 100644 --- a/internal/verify/test_matrix.go +++ b/internal/verify/test_matrix.go @@ -6,6 +6,8 @@ package verify import ( "fmt" + "google.golang.org/protobuf/types/known/structpb" + effectv1 "github.com/cerbos/cerbos/api/genpb/cerbos/effect/v1" policyv1 "github.com/cerbos/cerbos/api/genpb/cerbos/policy/v1" ) @@ -15,10 +17,13 @@ type testMatrixKey struct { Resource string } -type testMatrixExpectation = map[string]effectv1.Effect +type testMatrixExpectations struct { + actions map[string]effectv1.Effect + outputs map[string]*policyv1.Test_OutputEntries +} type testMatrixElement struct { - Expected testMatrixExpectation + Expected testMatrixExpectations testMatrixKey } @@ -51,8 +56,8 @@ func buildTestMatrix(table *policyv1.TestTable) ([]testMatrixElement, error) { return matrix, nil } -func buildExpectationLookup(table *policyv1.TestTable) (map[testMatrixKey]testMatrixExpectation, error) { - lookup := make(map[testMatrixKey]testMatrixExpectation, len(table.Expected)) +func buildExpectationLookup(table *policyv1.TestTable) (map[testMatrixKey]testMatrixExpectations, error) { + lookup := make(map[testMatrixKey]testMatrixExpectations, len(table.Expected)) for _, expectation := range table.Expected { key := testMatrixKey{Principal: expectation.Principal, Resource: expectation.Resource} @@ -61,16 +66,29 @@ func buildExpectationLookup(table *policyv1.TestTable) (map[testMatrixKey]testMa return nil, fmt.Errorf("found multiple expectations for principal %q and resource %q", key.Principal, key.Resource) } - lookup[key] = expectation.Actions + tmExpectation := testMatrixExpectations{actions: expectation.Actions} + if n := len(expectation.Outputs); n > 0 { + tmExpectation.outputs = make(map[string]*policyv1.Test_OutputEntries, n) + for _, oe := range expectation.Outputs { + entries := make(map[string]*structpb.Value, len(oe.Expected)) + for _, entry := range oe.Expected { + entries[entry.Src] = entry.Val + } + tmExpectation.outputs[oe.Action] = &policyv1.Test_OutputEntries{Entries: entries} + } + } + + lookup[key] = tmExpectation } return lookup, nil } -func buildDefaultExpectation(table *policyv1.TestTable) testMatrixExpectation { - expectation := make(testMatrixExpectation, len(table.Input.Actions)) - for _, action := range table.Input.Actions { - expectation[action] = effectv1.Effect_EFFECT_DENY +func buildDefaultExpectation(table *policyv1.TestTable) testMatrixExpectations { + actions := make(map[string]effectv1.Effect, len(table.Input.Actions)) + for _, a := range table.Input.Actions { + actions[a] = effectv1.Effect_EFFECT_DENY } - return expectation + + return testMatrixExpectations{actions: actions} } diff --git a/schema/jsonschema/cerbos/policy/v1/Test.schema.json b/schema/jsonschema/cerbos/policy/v1/Test.schema.json index 6916184b0..d8fcc25fe 100644 --- a/schema/jsonschema/cerbos/policy/v1/Test.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/Test.schema.json @@ -123,6 +123,18 @@ } } }, + "cerbos.policy.v1.Test.OutputEntries": { + "type": "object", + "additionalProperties": false, + "properties": { + "entries": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + } + }, "cerbos.policy.v1.Test.TestName": { "type": "object", "required": [ @@ -188,6 +200,12 @@ "minLength": 1 } }, + "expectedOutputs": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/cerbos.policy.v1.Test.OutputEntries" + } + }, "input": { "$ref": "#/definitions/cerbos.engine.v1.CheckInput" }, diff --git a/schema/jsonschema/cerbos/policy/v1/Test/OutputEntries.schema.json b/schema/jsonschema/cerbos/policy/v1/Test/OutputEntries.schema.json new file mode 100644 index 000000000..187c87c1e --- /dev/null +++ b/schema/jsonschema/cerbos/policy/v1/Test/OutputEntries.schema.json @@ -0,0 +1,20 @@ +{ + "$id": "https://api.cerbos.dev/cerbos/policy/v1/Test/OutputEntries.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "entries": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + } +} diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json index df12e661d..77975f0c3 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults.schema.json @@ -169,6 +169,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json index 9341944ff..02a731f70 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Action.schema.json @@ -157,6 +157,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json index 02f21895d..b10a6a569 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Details.schema.json @@ -136,6 +136,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Failure.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Failure.schema.json index 68c433881..292eff719 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults/Failure.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Failure.schema.json @@ -10,6 +10,46 @@ "EFFECT_DENY", "EFFECT_NO_MATCH" ] + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." } }, "type": "object", @@ -20,6 +60,12 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } } } } diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure.schema.json new file mode 100644 index 000000000..02289bf03 --- /dev/null +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure.schema.json @@ -0,0 +1,44 @@ +{ + "$id": "https://api.cerbos.dev/cerbos/policy/v1/TestResults/OutputFailure.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } +} diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure/MismatchedValue.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure/MismatchedValue.schema.json new file mode 100644 index 000000000..8d9554472 --- /dev/null +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure/MismatchedValue.schema.json @@ -0,0 +1,20 @@ +{ + "$id": "https://api.cerbos.dev/cerbos/policy/v1/TestResults/OutputFailure/MismatchedValue.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } +} diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure/MissingValue.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure/MissingValue.schema.json new file mode 100644 index 000000000..696e683b2 --- /dev/null +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/OutputFailure/MissingValue.schema.json @@ -0,0 +1,17 @@ +{ + "$id": "https://api.cerbos.dev/cerbos/policy/v1/TestResults/OutputFailure/MissingValue.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } +} diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json index 96b07e40c..c47ae9455 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Principal.schema.json @@ -169,6 +169,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json index 50651957f..d4816d073 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Resource.schema.json @@ -169,6 +169,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json index a9e7bc9ae..0d6be76b1 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/Suite.schema.json @@ -169,6 +169,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json b/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json index e86c0957e..9b2ceee8a 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestResults/TestCase.schema.json @@ -169,6 +169,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/policy/v1/TestSuite.schema.json b/schema/jsonschema/cerbos/policy/v1/TestSuite.schema.json index 491679b6d..0af70c677 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestSuite.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestSuite.schema.json @@ -23,6 +23,18 @@ } } }, + "cerbos.engine.v1.OutputEntry": { + "type": "object", + "additionalProperties": false, + "properties": { + "src": { + "type": "string" + }, + "val": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, "cerbos.engine.v1.Principal": { "type": "object", "required": [ @@ -159,6 +171,12 @@ "minLength": 1 } }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestTable.OutputExpectations" + } + }, "principal": { "type": "string", "minLength": 1 @@ -210,6 +228,27 @@ } } }, + "cerbos.policy.v1.TestTable.OutputExpectations": { + "type": "object", + "required": [ + "action", + "expected" + ], + "additionalProperties": false, + "properties": { + "action": { + "type": "string", + "minLength": 1 + }, + "expected": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.engine.v1.OutputEntry" + }, + "minItems": 1 + } + } + }, "google.protobuf.Timestamp": { "title": "Timestamp", "description": "A point in time, independent of any time zone or calendar.", diff --git a/schema/jsonschema/cerbos/policy/v1/TestTable.schema.json b/schema/jsonschema/cerbos/policy/v1/TestTable.schema.json index d7a3f3ced..86382417c 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestTable.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestTable.schema.json @@ -11,6 +11,18 @@ "EFFECT_NO_MATCH" ] }, + "cerbos.engine.v1.OutputEntry": { + "type": "object", + "additionalProperties": false, + "properties": { + "src": { + "type": "string" + }, + "val": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, "cerbos.policy.v1.TestOptions": { "type": "object", "additionalProperties": false, @@ -40,6 +52,12 @@ "minLength": 1 } }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestTable.OutputExpectations" + } + }, "principal": { "type": "string", "minLength": 1 @@ -91,11 +109,36 @@ } } }, + "cerbos.policy.v1.TestTable.OutputExpectations": { + "type": "object", + "required": [ + "action", + "expected" + ], + "additionalProperties": false, + "properties": { + "action": { + "type": "string", + "minLength": 1 + }, + "expected": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.engine.v1.OutputEntry" + }, + "minItems": 1 + } + } + }, "google.protobuf.Timestamp": { "title": "Timestamp", "description": "A point in time, independent of any time zone or calendar.", "type": "string", "format": "date-time" + }, + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." } }, "type": "object", diff --git a/schema/jsonschema/cerbos/policy/v1/TestTable/Expectation.schema.json b/schema/jsonschema/cerbos/policy/v1/TestTable/Expectation.schema.json index 34f30e6ff..7790b697a 100644 --- a/schema/jsonschema/cerbos/policy/v1/TestTable/Expectation.schema.json +++ b/schema/jsonschema/cerbos/policy/v1/TestTable/Expectation.schema.json @@ -10,6 +10,43 @@ "EFFECT_DENY", "EFFECT_NO_MATCH" ] + }, + "cerbos.engine.v1.OutputEntry": { + "type": "object", + "additionalProperties": false, + "properties": { + "src": { + "type": "string" + }, + "val": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestTable.OutputExpectations": { + "type": "object", + "required": [ + "action", + "expected" + ], + "additionalProperties": false, + "properties": { + "action": { + "type": "string", + "minLength": 1 + }, + "expected": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.engine.v1.OutputEntry" + }, + "minItems": 1 + } + } + }, + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." } }, "type": "object", @@ -31,6 +68,12 @@ "minLength": 1 } }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestTable.OutputExpectations" + } + }, "principal": { "type": "string", "minLength": 1 diff --git a/schema/jsonschema/cerbos/policy/v1/TestTable/OutputExpectations.schema.json b/schema/jsonschema/cerbos/policy/v1/TestTable/OutputExpectations.schema.json new file mode 100644 index 000000000..401e48713 --- /dev/null +++ b/schema/jsonschema/cerbos/policy/v1/TestTable/OutputExpectations.schema.json @@ -0,0 +1,41 @@ +{ + "$id": "https://api.cerbos.dev/cerbos/policy/v1/TestTable/OutputExpectations.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "cerbos.engine.v1.OutputEntry": { + "type": "object", + "additionalProperties": false, + "properties": { + "src": { + "type": "string" + }, + "val": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "google.protobuf.Value": { + "title": "Value", + "description": "A dynamically-typed value." + } + }, + "type": "object", + "required": [ + "action", + "expected" + ], + "additionalProperties": false, + "properties": { + "action": { + "type": "string", + "minLength": 1 + }, + "expected": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.engine.v1.OutputEntry" + }, + "minItems": 1 + } + } +} diff --git a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json index 723e30349..9319b90fa 100644 --- a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json +++ b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse.schema.json @@ -184,6 +184,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json index 1d6701f02..326459e83 100644 --- a/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json +++ b/schema/jsonschema/cerbos/response/v1/PlaygroundTestResponse/TestResults.schema.json @@ -184,6 +184,48 @@ }, "expected": { "$ref": "#/definitions/cerbos.effect.v1.Effect" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure" + } + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure": { + "type": "object", + "additionalProperties": false, + "properties": { + "mismatched": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue" + }, + "missing": { + "$ref": "#/definitions/cerbos.policy.v1.TestResults.OutputFailure.MissingValue" + }, + "src": { + "type": "string" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MismatchedValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "actual": { + "$ref": "#/definitions/google.protobuf.Value" + }, + "expected": { + "$ref": "#/definitions/google.protobuf.Value" + } + } + }, + "cerbos.policy.v1.TestResults.OutputFailure.MissingValue": { + "type": "object", + "additionalProperties": false, + "properties": { + "expected": { + "$ref": "#/definitions/google.protobuf.Value" } } }, diff --git a/schema/openapiv2/cerbos/svc/v1/svc.swagger.json b/schema/openapiv2/cerbos/svc/v1/svc.swagger.json index dba297d75..4ba4a23e2 100644 --- a/schema/openapiv2/cerbos/svc/v1/svc.swagger.json +++ b/schema/openapiv2/cerbos/svc/v1/svc.swagger.json @@ -1196,6 +1196,19 @@ }, "description": "Unique resource instance ID supplied in the request." }, + "OutputFailureMismatchedValue": { + "type": "object", + "properties": { + "expected": {}, + "actual": {} + } + }, + "OutputFailureMissingValue": { + "type": "object", + "properties": { + "expected": {} + } + }, "PlanResourcesFilterExpression": { "type": "object", "properties": { @@ -1323,6 +1336,27 @@ }, "actual": { "$ref": "#/definitions/v1Effect" + }, + "outputs": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/TestResultsOutputFailure" + } + } + } + }, + "TestResultsOutputFailure": { + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "mismatched": { + "$ref": "#/definitions/OutputFailureMismatchedValue" + }, + "missing": { + "$ref": "#/definitions/OutputFailureMissingValue" } } },