diff --git a/protomap/integration_tests/integration_test.go b/protomap/integration_tests/integration_test.go index b384e676..171cea0d 100644 --- a/protomap/integration_tests/integration_test.go +++ b/protomap/integration_tests/integration_test.go @@ -224,6 +224,35 @@ func TestGRIBIAFTToStruct(t *testing.T) { SrcIp: &wpb.StringValue{Value: "1.1.1.1"}, }, }, + }, { + desc: "pushed mpls label stack", + inPaths: map[*gpb.Path]interface{}{ + mustPath("state/pushed-mpls-label-stack"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{ + mustValue(t, uint64(20)), + mustValue(t, uint64(30)), + mustValue(t, uint64(40)), + mustValue(t, uint64(50)), + }, + }, + }, + }, + }, + inProto: &gribi_aft.Afts_NextHop{}, + inPrefix: mustPath("afts/next-hops/next-hop"), + wantProto: &gribi_aft.Afts_NextHop{ + PushedMplsLabelStack: []*gribi_aft.Afts_NextHop_PushedMplsLabelStackUnion{{ + PushedMplsLabelStackUint64: 20, + }, { + PushedMplsLabelStackUint64: 30, + }, { + PushedMplsLabelStackUint64: 40, + }, { + PushedMplsLabelStackUint64: 50, + }}, + }, }} for _, tt := range tests { diff --git a/protomap/proto.go b/protomap/proto.go index 99661ec9..aa9f7ced 100644 --- a/protomap/proto.go +++ b/protomap/proto.go @@ -24,6 +24,7 @@ import ( "strconv" "strings" + "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/types/descriptorpb" @@ -618,6 +619,11 @@ func protoFromPathsInternal(p proto.Message, vals map[*gpb.Path]any, valPrefix, return false } + leaflist, leaflistunion, err := annotatedYANGFieldInfo(fd) + if err != nil { + rangeErr = fmt.Errorf("cannot extract field information for %s, %v", fd.FullName(), err) + } + if len(directCh) != 0 { for _, ap := range annotatedPath { trimmedPrefix := schemaPath(protoPrefix) @@ -632,17 +638,39 @@ func protoFromPathsInternal(p proto.Message, vals map[*gpb.Path]any, valPrefix, if proto.Equal(trimmedAP, chp) { switch fd.Kind() { case protoreflect.MessageKind: - v, isWrap, err := makeWrapper(m, fd, chv) - if err != nil { - rangeErr = err - return false - } - // Only handle wrapper messages here, other embedded messages are covered by - // checking the field type below (since we must handle cases where there are - // indirect children). - if isWrap { + // If this is is a leaf-list or a leaf-list of union values, then we + // need to handle it like a scalar field rather than recursing into + // the child messages. + switch { + case leaflist: + v, err := makeSimpleLeafList(m, fd, chv) + if err != nil { + rangeErr = err + return false + } mapped[chp] = true - m.Set(fd, protoreflect.ValueOfMessage(v)) + m.Set(fd, v) + case leaflistunion: + v, err := makeUnionLeafList(m, fd, chv) + if err != nil { + rangeErr = err + return false + } + mapped[chp] = true + m.Set(fd, v) + default: + v, isWrap, err := makeWrapper(m, fd, chv) + if err != nil { + rangeErr = err + return false + } + // Only handle wrapper messages here, other embedded messages are covered by + // checking the field type below (since we must handle cases where there are + // indirect children). + if isWrap { + mapped[chp] = true + m.Set(fd, protoreflect.ValueOfMessage(v)) + } } case protoreflect.EnumKind: v, err := enumValue(fd, chv) @@ -666,13 +694,9 @@ func protoFromPathsInternal(p proto.Message, vals map[*gpb.Path]any, valPrefix, if fd.Kind() == protoreflect.MessageKind { switch { case fd.IsList(): - leaflist, leaflistunion, err := annotatedYANGFieldInfo(fd) - if err != nil { - rangeErr = fmt.Errorf("cannot extract field information for %s, %v", fd.FullName(), err) - } switch { case leaflist, leaflistunion: - // TODO(robjs): Support these fields, silently dropped for backwards compatibility. + // These fields are handled earlier as individual fields above, thus, do nothing here. default: // This is a YANG list field which is a repeated within a protobuf. We need to extract the // keys from this message and create a list in the entry. @@ -920,6 +944,12 @@ func hasValuePathPrefix(opts []UnmapOpt) (*gpb.Path, error) { // type of payload is provided for the message. The second, boolean, return argument specifies whether // the message provided was a known wrapper type. func makeWrapper(msg protoreflect.Message, fd protoreflect.FieldDescriptor, val interface{}) (protoreflect.Message, bool, error) { + // If this field was a repeated then it could be a typed value -- but this is handled + // separately, thus we simply return false here. + if fd.IsList() { + return nil, false, fmt.Errorf("%s: unexpectedly got a protobuf repeated field in makeWrapper, logic error", fd.FullName()) + } + var wasTypedVal bool if tv, ok := val.(*gpb.TypedValue); ok { pv, err := value.ToScalar(tv) @@ -930,6 +960,9 @@ func makeWrapper(msg protoreflect.Message, fd protoreflect.FieldDescriptor, val wasTypedVal = true } + // TODO(robjs): Support wpb.IntValue and wpb.BoolValue and add corresponding + // tests. + newV := msg.NewField(fd) switch newV.Message().Interface().(type) { case *wpb.StringValue: @@ -950,7 +983,6 @@ func makeWrapper(msg protoreflect.Message, fd protoreflect.FieldDescriptor, val } nsv = uint64(iv) } - return (&wpb.UintValue{Value: nsv}).ProtoReflect(), true, nil case *wpb.BytesValue: bv, ok := val.([]byte) @@ -974,6 +1006,248 @@ func isWrapper(msg protoreflect.Message, fd protoreflect.FieldDescriptor) bool { } } +// makeUnionLeafList makes a protoreflect.Value corresponding to the leaf-list field fd of message m, containing +// the values within chv, which is checked to be either a slice of Go inbuilt values, or gNMI TypedValue +// protobufs. It returns an error if the leaf-list cannot be created. +func makeUnionLeafList(msg protoreflect.Message, fd protoreflect.FieldDescriptor, chv any) (protoreflect.Value, error) { + newV := msg.NewField(fd) + + inputVal := reflect.ValueOf(chv) + switch { + case inputVal.Kind() != reflect.Slice && !util.IsValueStructPtr(inputVal): + return protoreflect.ValueOf(nil), fmt.Errorf("invalid value %v (%T) for a leaf-list of unions", chv, chv) + case util.IsValueStructPtr(inputVal): + tv, ok := inputVal.Interface().(*gpb.TypedValue) + if !ok { + return protoreflect.ValueOf(nil), fmt.Errorf("invalid struct type in slice %v (%T) for a leaf-list of unions", chv, inputVal.Elem().Interface()) + } + + for _, inputVal := range tv.GetLeaflistVal().GetElement() { + protoListElem := newV.List().NewElement() + var ( + retErr error + handled bool + ) + unpopRange{protoListElem.Message()}.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { + switch ee := inputVal.GetValue().(type) { + case *gpb.TypedValue_StringVal: + if fd.Kind() == protoreflect.StringKind { + protoListElem.Message().Set(fd, protoreflect.ValueOfString(ee.StringVal)) + newV.List().Append(protoListElem) + handled = true + return false + } + if fd.Kind() == protoreflect.EnumKind { + ev, err := enumValue(fd, ee.StringVal) + if err != nil { + retErr = err + return false + } + protoListElem.Message().Set(fd, ev) + newV.List().Append(protoListElem) + handled = true + return false + } + case *gpb.TypedValue_UintVal: + if fd.Kind() == protoreflect.Uint64Kind { + protoListElem.Message().Set(fd, protoreflect.ValueOfUint64(ee.UintVal)) + newV.List().Append(protoListElem) + handled = true + return false + } + case *gpb.TypedValue_BoolVal: + if fd.Kind() == protoreflect.BoolKind { + protoListElem.Message().Set(fd, protoreflect.ValueOfBool(ee.BoolVal)) + newV.List().Append(protoListElem) + handled = true + return false + } + default: + // TODO(robjs): implement type handling for other TypedValues. + retErr = fmt.Errorf("unhandled type %T in leaf-list of unions", ee) + return false + } + return true + }) + if retErr != nil { + return protoreflect.ValueOf(nil), retErr + } + if !handled { + return protoreflect.ValueOf(nil), fmt.Errorf("invalid type %T for value %v in union", inputVal.GetValue(), inputVal) + } + } + return newV, nil + } + + for i := 0; i < inputVal.Len(); i++ { + protoListElem := newV.List().NewElement() + inputElem := inputVal.Index(i) + var ( + retErr error + handled bool + ) + + unpopRange{protoListElem.Message()}.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { + if inputElem.Kind() != reflect.Interface { + retErr = fmt.Errorf("invalid input type for leaf-list of unions, %T, expect []any", inputElem.Interface()) + return false + } + + switch inputElem.Elem().Kind() { + case reflect.String: + if fd.Kind() == protoreflect.StringKind { + protoListElem.Message().Set(fd, protoreflect.ValueOfString(inputElem.Elem().String())) + newV.List().Append(protoListElem) + handled = true + return false + } + if fd.Kind() == protoreflect.EnumKind { + v, err := enumValue(fd, inputElem.Interface()) + if err != nil { + retErr = err + return false + } + protoListElem.Message().Set(fd, v) + newV.List().Append(protoListElem) + handled = true + return false + } + case reflect.Uint64: + if fd.Kind() == protoreflect.Uint64Kind { + protoListElem.Message().Set(fd, protoreflect.ValueOfUint64(inputElem.Elem().Uint())) + newV.List().Append(protoListElem) + handled = true + return false + } + case reflect.Bool: + if fd.Kind() == protoreflect.BoolKind { + protoListElem.Message().Set(fd, protoreflect.ValueOfBool(inputElem.Elem().Bool())) + newV.List().Append(protoListElem) + handled = true + return false + } + default: + retErr = fmt.Errorf("unhandled type %T for union", inputElem.Interface()) + return false + } + + return true + }) + if retErr != nil { + return protoreflect.ValueOf(nil), retErr + } + if !handled { + return protoreflect.ValueOf(nil), fmt.Errorf("invalid type %T for value %v in union", inputElem.Interface(), inputElem.Interface()) + } + } + + return newV, nil +} + +// makeSimpleLeafList makes a repeated value of wrapper protobufs for the field fd of the message msg containing +// the values in chv. It returns an error if the type is unhandled. +func makeSimpleLeafList(msg protoreflect.Message, fd protoreflect.FieldDescriptor, chv any) (protoreflect.Value, error) { + if tv, ok := chv.(*gpb.TypedValue); ok { + if len(tv.GetLeaflistVal().GetElement()) == 0 { + return protoreflect.ValueOf(nil), fmt.Errorf("invalid leaf-list value, does not include a scalar array, %s", prototext.Format(tv)) + } + } + // If this is not a union, then we need to return a list field that contains + // a slice of wrapper values for the specified type. + newV := msg.NewField(fd) + elem := newV.List().NewElement() + switch elem.Message().Interface().(type) { + case *wpb.StringValue: + // This is a repeated of strings. + switch lv := chv.(type) { + case *gpb.TypedValue: + for _, v := range lv.GetLeaflistVal().GetElement() { + if vf, ok := v.GetValue().(*gpb.TypedValue_StringVal); !ok { + return protoreflect.ValueOf(nil), fmt.Errorf("wrong typed value set got %T and expected string", vf) + } + newV.List().Append(protoreflect.ValueOf((&wpb.StringValue{Value: v.GetStringVal()}).ProtoReflect())) + } + case []string: + for _, v := range lv { + newV.List().Append(protoreflect.ValueOf((&wpb.StringValue{Value: v}).ProtoReflect())) + } + default: + return protoreflect.ValueOf(nil), fmt.Errorf("invalid type %T (value: %v) for repeated string field", lv, lv) + } + return newV, nil + case *wpb.UintValue: + switch lv := chv.(type) { + case *gpb.TypedValue: + for _, v := range lv.GetLeaflistVal().GetElement() { + if vf, ok := v.GetValue().(*gpb.TypedValue_UintVal); !ok { + return protoreflect.ValueOf(nil), fmt.Errorf("wrong typed value set got %T and expected uint", vf) + } + newV.List().Append(protoreflect.ValueOf((&wpb.UintValue{Value: v.GetUintVal()}).ProtoReflect())) + } + case []uint64: + for _, v := range lv { + newV.List().Append(protoreflect.ValueOf((&wpb.UintValue{Value: v}).ProtoReflect())) + } + default: + return protoreflect.ValueOf(nil), fmt.Errorf("invalid type %T (value: %v) for repeated uint field", lv, lv) + } + return newV, nil + case *wpb.BoolValue: + switch lv := chv.(type) { + case *gpb.TypedValue: + for _, v := range lv.GetLeaflistVal().GetElement() { + if vf, ok := v.GetValue().(*gpb.TypedValue_BoolVal); !ok { + return protoreflect.ValueOf(nil), fmt.Errorf("wrong typed value set got %T and expected bool", vf) + } + newV.List().Append(protoreflect.ValueOf((&wpb.BoolValue{Value: v.GetBoolVal()}).ProtoReflect())) + } + case []bool: + for _, v := range lv { + newV.List().Append(protoreflect.ValueOf((&wpb.BoolValue{Value: v}).ProtoReflect())) + } + default: + return protoreflect.ValueOf(nil), fmt.Errorf("invalid type %T (value: %v) for repeated bool field", lv, lv) + } + return newV, nil + case *wpb.IntValue: + switch lv := chv.(type) { + case *gpb.TypedValue: + for _, v := range lv.GetLeaflistVal().GetElement() { + if vf, ok := v.GetValue().(*gpb.TypedValue_IntVal); !ok { + return protoreflect.ValueOf(nil), fmt.Errorf("wrong typed value set got %T and expected int", vf) + } + newV.List().Append(protoreflect.ValueOf((&wpb.IntValue{Value: v.GetIntVal()}).ProtoReflect())) + } + case []int64: + for _, v := range lv { + newV.List().Append(protoreflect.ValueOf((&wpb.IntValue{Value: v}).ProtoReflect())) + } + default: + return protoreflect.ValueOf(nil), fmt.Errorf("invalid type %T (value: %v) for repeated int field", lv, lv) + } + return newV, nil + case *wpb.BytesValue: + switch lv := chv.(type) { + case *gpb.TypedValue: + for _, v := range lv.GetLeaflistVal().GetElement() { + if vf, ok := v.GetValue().(*gpb.TypedValue_BytesVal); !ok { + return protoreflect.ValueOf(nil), fmt.Errorf("wrong typed value set got %T and expected bytes", vf) + } + newV.List().Append(protoreflect.ValueOf((&wpb.BytesValue{Value: v.GetBytesVal()}).ProtoReflect())) + } + case [][]byte: + for _, v := range lv { + newV.List().Append(protoreflect.ValueOf((&wpb.BytesValue{Value: v}).ProtoReflect())) + } + default: + return protoreflect.ValueOf(nil), fmt.Errorf("invalid type %T (value: %v) for repeated byte field", lv, lv) + } + return newV, nil + default: + return protoreflect.ValueOf(nil), fmt.Errorf("unhandled leaf-list value, %v", chv) + } +} + // enumValue returns the concrete implementation of the enumeration with the yang_name annotation set // to the string contained in val of the enumeration within the field descriptor fd. It returns an // error if the value cannot be found, or the input value is not valid. diff --git a/protomap/proto_test.go b/protomap/proto_test.go index 7b141e34..13e581ea 100644 --- a/protomap/proto_test.go +++ b/protomap/proto_test.go @@ -826,6 +826,558 @@ func TestProtoFromPaths(t *testing.T) { mustPath("/interfaces/interface[name=eth0][type=ETHERNET]/config/description"): "invalid", }, wantErrSubstring: "received additional keys", + }, { + desc: "leaf-list of non-union", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-string"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_StringVal{StringVal: "one"}, + }, { + Value: &gpb.TypedValue_StringVal{StringVal: "two"}, + }, { + Value: &gpb.TypedValue_StringVal{StringVal: "three"}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistString: []*wpb.StringValue{{ + Value: "one", + }, { + Value: "two", + }, { + Value: "three", + }}, + }, + }, { + desc: "leaf-list of non-union, simple values", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-string"): []string{"hello", "world"}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistString: []*wpb.StringValue{{ + Value: "hello", + }, { + Value: "world", + }}, + }, + }, { + desc: "leaf-list - wrong type for repeated string", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-string"): "fish", + }, + wantErrSubstring: "invalid type", + }, { + desc: "leaf-list - zero length typed value", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-string"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{}, + }, + }, + }, + }, + wantErrSubstring: "invalid leaf-list value", + }, { + desc: "leaf-list - wrong field in typed value", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-string"): &gpb.TypedValue{ + Value: &gpb.TypedValue_StringVal{ + StringVal: "fish", + }, + }, + }, + wantErrSubstring: "invalid leaf-list value", + }, { + desc: "leaf-list - wrong type for uint", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-uint"): []string{"one", "two"}, + }, + wantErrSubstring: "invalid type", + }, { + desc: "leaf-list - wrong type for uint64", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-uint"): []string{"one", "two"}, + }, + wantErrSubstring: "invalid type", + }, { + desc: "leaf-list - wrong type for bool", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bool"): []string{"one", "two"}, + }, + wantErrSubstring: "invalid type", + }, { + desc: "leaf-list - wrong type for bytes", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bytes"): []string{"one", "two"}, + }, + wantErrSubstring: "invalid type", + }, { + desc: "leaf-list of uint64", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-uint"): []uint64{1, 2, 3, 4}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUint: []*wpb.UintValue{{ + Value: 1, + }, { + Value: 2, + }, { + Value: 3, + }, { + Value: 4, + }}, + }, + }, { + desc: "leaf-list of typed value uint64", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-uint"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_UintVal{UintVal: 1}, + }, { + Value: &gpb.TypedValue_UintVal{UintVal: 2}, + }, { + Value: &gpb.TypedValue_UintVal{UintVal: 3}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUint: []*wpb.UintValue{{ + Value: 1, + }, { + Value: 2, + }, { + Value: 3, + }}, + }, + }, { + desc: "leaf-list of int", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-int"): []int64{1, 2, 3, 4}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistInt: []*wpb.IntValue{{ + Value: 1, + }, { + Value: 2, + }, { + Value: 3, + }, { + Value: 4, + }}, + }, + }, { + desc: "leaf-list of typed value int", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-int"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_IntVal{IntVal: 1}, + }, { + Value: &gpb.TypedValue_IntVal{IntVal: 2}, + }, { + Value: &gpb.TypedValue_IntVal{IntVal: 3}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistInt: []*wpb.IntValue{{ + Value: 1, + }, { + Value: 2, + }, { + Value: 3, + }}, + }, + }, { + desc: "leaf-list - wrong type for int", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-int"): "fish", + }, + wantErrSubstring: "invalid type", + }, { + desc: "leaf-list of bool", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bool"): []bool{true, false}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistBool: []*wpb.BoolValue{{ + Value: true, + }, { + Value: false, + }}, + }, + }, { + desc: "leaf-list of typed value bool", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bool"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_BoolVal{BoolVal: true}, + }, { + Value: &gpb.TypedValue_BoolVal{BoolVal: false}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistBool: []*wpb.BoolValue{{ + Value: true, + }, { + Value: false, + }}, + }, + }, { + desc: "leaf-list - int - wrong type typed value input", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + // int value containing bools. + mustPath("/leaflist-int"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_BoolVal{BoolVal: true}, + }, { + Value: &gpb.TypedValue_BoolVal{BoolVal: false}, + }}, + }, + }, + }, + }, + wantErrSubstring: "wrong typed value", + }, { + desc: "leaf-list - string - wrong type typed value input", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + // string value containing bools. + mustPath("/leaflist-string"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_BoolVal{BoolVal: true}, + }, { + Value: &gpb.TypedValue_BoolVal{BoolVal: false}, + }}, + }, + }, + }, + }, + wantErrSubstring: "wrong typed value", + }, { + desc: "leaf-list - uint - wrong type typed value input", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + // uint value containing bools. + mustPath("/leaflist-uint"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_BoolVal{BoolVal: true}, + }, { + Value: &gpb.TypedValue_BoolVal{BoolVal: false}, + }}, + }, + }, + }, + }, + wantErrSubstring: "wrong typed value", + }, { + desc: "leaf-list - bool - wrong type typed value input", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bool"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_IntVal{IntVal: 1}, + }, { + Value: &gpb.TypedValue_IntVal{IntVal: 2}, + }, { + Value: &gpb.TypedValue_IntVal{IntVal: 3}, + }}, + }, + }, + }, + }, + wantErrSubstring: "wrong typed value", + }, { + desc: "leaf-list of bytes", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bytes"): [][]byte{{1}, {2}}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistBytes: []*wpb.BytesValue{{ + Value: []byte{1}, + }, { + Value: []byte{2}, + }}, + }, + }, { + desc: "leaf-list of typed value bytes", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bytes"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_BytesVal{BytesVal: []byte{1}}, + }, { + Value: &gpb.TypedValue_BytesVal{BytesVal: []byte{2}}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistBytes: []*wpb.BytesValue{{ + Value: []byte{1}, + }, { + Value: []byte{2}, + }}, + }, + }, { + desc: "leaf-list - wrong type for bytes", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bytes"): "fish", + }, + wantErrSubstring: "invalid type", + }, { + desc: "leaf-list - wrong type of typed value for bytes", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-bytes"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_IntVal{IntVal: 1}, + }, { + Value: &gpb.TypedValue_IntVal{IntVal: 2}, + }, { + Value: &gpb.TypedValue_IntVal{IntVal: 3}, + }}, + }, + }, + }, + }, + wantErrSubstring: "wrong typed value", + }, { + desc: "leaf-list - unhandled deprecated type", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-decimal64"): []float64{0.1, 0.2}, + }, + wantErrSubstring: "unhandled leaf-list value", + }, { + desc: "leaf-list - unions - enum and uint", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union-b"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_StringVal{StringVal: "VAL_ONE"}, + }, { + Value: &gpb.TypedValue_UintVal{UintVal: 1}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUnionB: []*epb.ExampleUnionUnambiguous{{ + Enum: epb.ExampleEnum_ENUM_VALONE, + }, { + Uint: 1, + }}, + }, + }, { + desc: "leaf-list - unions - uint and string", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_StringVal{StringVal: "hi mars!"}, + }, { + Value: &gpb.TypedValue_UintVal{UintVal: 1}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUnion: []*epb.ExampleUnion{{ + Str: "hi mars!", + }, { + Uint: 1, + }}, + }, + }, { + desc: "leaf-list - unions - mix of invalid and valid types", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_StringVal{StringVal: "hi mars!"}, + }, { + Value: &gpb.TypedValue_UintVal{UintVal: 1}, + }, { + Value: &gpb.TypedValue_BoolVal{BoolVal: true}, + }}, + }, + }, + }, + }, + wantErrSubstring: "invalid type *gnmi.TypedValue_BoolVal", + }, { + desc: "leaf-list - unions - wrong type of input", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): "fish", + }, + wantErrSubstring: "invalid value", + }, { + desc: "leaf-list - unions - slice of non-typed values", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): &gpb.Notification{}, + }, + wantErrSubstring: "invalid struct type", + }, { + desc: "leaf-list - unions - currently unhandled type", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_IntVal{IntVal: 42}, + }}, + }, + }, + }, + }, + wantErrSubstring: "unhandled type", + }, { + desc: "leaf-list - unions - slice input", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): []any{"hello", "world", uint64(1)}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUnion: []*epb.ExampleUnion{{ + Str: "hello", + }, { + Str: "world", + }, { + Uint: 1, + }}, + }, + }, { + desc: "leaf-list - unions - mix of valid and unhandled types", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): []any{"hello", "world", uint64(1), float64(1.0)}, + }, + wantErrSubstring: "unhandled type float64", + }, { + desc: "leaf-list - unions - mix of valid and invalid types", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union"): []any{"hello", "world", uint64(1), true}, + }, + wantErrSubstring: "invalid type bool for value true", + }, { + desc: "leaf-list - unions - slice input - enum", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union-b"): []any{uint64(1), "VAL_ONE"}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUnionB: []*epb.ExampleUnionUnambiguous{{ + Uint: 1, + }, { + Enum: epb.ExampleEnum_ENUM_VALONE, + }}, + }, + }, { + desc: "leaf-list unions with bool in - slice", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union-c"): []any{true, false}, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUnionC: []*epb.ExampleUnionTwo{{ + B: true, + }, { + B: false, + }}, + }, + }, { + desc: "leaf-list unions with bool in - typed value", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/leaflist-union-c"): &gpb.TypedValue{ + Value: &gpb.TypedValue_LeaflistVal{ + LeaflistVal: &gpb.ScalarArray{ + Element: []*gpb.TypedValue{{ + Value: &gpb.TypedValue_BoolVal{BoolVal: true}, + }, { + Value: &gpb.TypedValue_BoolVal{BoolVal: false}, + }}, + }, + }, + }, + }, + wantProto: &epb.ExampleMessage{ + LeaflistUnionC: []*epb.ExampleUnionTwo{{ + B: true, + }, { + B: false, + }}, + }, + }, { + // TODO(robjs): support unions within fields directly. + desc: "union", + inProto: &epb.ExampleMessage{}, + inVals: map[*gpb.Path]any{ + mustPath("/union"): "fish", + }, + wantErrSubstring: `did not map path elem:{name:"union"}`, }} for _, tt := range tests { diff --git a/protomap/testdata/exschemapath/exschemapath.pb.go b/protomap/testdata/exschemapath/exschemapath.pb.go index 61582332..f7672286 100644 --- a/protomap/testdata/exschemapath/exschemapath.pb.go +++ b/protomap/testdata/exschemapath/exschemapath.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.27.1 +// protoc v3.21.9 // source: exschemapath.proto package exschemapath @@ -295,7 +295,6 @@ type ExampleMessage struct { En ExampleEnum `protobuf:"varint,10,opt,name=en,proto3,enum=exschemapath.ExampleEnum" json:"en,omitempty"` Compress *ywrapper.StringValue `protobuf:"bytes,11,opt,name=compress,proto3" json:"compress,omitempty"` // Types that are assignable to OneofField: - // // *ExampleMessage_OneofOne // *ExampleMessage_OneofTwo OneofField isExampleMessage_OneofField `protobuf_oneof:"oneof_field"` @@ -307,6 +306,10 @@ type ExampleMessage struct { LeaflistDecimal64 []*ywrapper.Decimal64Value `protobuf:"bytes,20,rep,name=leaflist_decimal64,json=leaflistDecimal64,proto3" json:"leaflist_decimal64,omitempty"` LeaflistUnion []*ExampleUnion `protobuf:"bytes,15,rep,name=leaflist_union,json=leaflistUnion,proto3" json:"leaflist_union,omitempty"` Nested *ExampleNestedMessage `protobuf:"bytes,21,opt,name=nested,proto3" json:"nested,omitempty"` + // TODO(robjs): support union fields, this needs a new annotation. + Union *BasicUnion `protobuf:"bytes,22,opt,name=union,proto3" json:"union,omitempty"` + LeaflistUnionB []*ExampleUnionUnambiguous `protobuf:"bytes,23,rep,name=leaflist_union_b,json=leaflistUnionB,proto3" json:"leaflist_union_b,omitempty"` + LeaflistUnionC []*ExampleUnionTwo `protobuf:"bytes,24,rep,name=leaflist_union_c,json=leaflistUnionC,proto3" json:"leaflist_union_c,omitempty"` } func (x *ExampleMessage) Reset() { @@ -495,6 +498,27 @@ func (x *ExampleMessage) GetNested() *ExampleNestedMessage { return nil } +func (x *ExampleMessage) GetUnion() *BasicUnion { + if x != nil { + return x.Union + } + return nil +} + +func (x *ExampleMessage) GetLeaflistUnionB() []*ExampleUnionUnambiguous { + if x != nil { + return x.LeaflistUnionB + } + return nil +} + +func (x *ExampleMessage) GetLeaflistUnionC() []*ExampleUnionTwo { + if x != nil { + return x.LeaflistUnionC + } + return nil +} + type isExampleMessage_OneofField interface { isExampleMessage_OneofField() } @@ -629,6 +653,53 @@ func (x *ExampleNestedGrandchild) GetTwo() *ywrapper.StringValue { return nil } +type BasicUnion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Str string `protobuf:"bytes,1,opt,name=str,proto3" json:"str,omitempty"` +} + +func (x *BasicUnion) Reset() { + *x = BasicUnion{} + if protoimpl.UnsafeEnabled { + mi := &file_exschemapath_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BasicUnion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BasicUnion) ProtoMessage() {} + +func (x *BasicUnion) ProtoReflect() protoreflect.Message { + mi := &file_exschemapath_proto_msgTypes[7] + 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 BasicUnion.ProtoReflect.Descriptor instead. +func (*BasicUnion) Descriptor() ([]byte, []int) { + return file_exschemapath_proto_rawDescGZIP(), []int{7} +} + +func (x *BasicUnion) GetStr() string { + if x != nil { + return x.Str + } + return "" +} + type ExampleUnion struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -642,7 +713,7 @@ type ExampleUnion struct { func (x *ExampleUnion) Reset() { *x = ExampleUnion{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[7] + mi := &file_exschemapath_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -655,7 +726,7 @@ func (x *ExampleUnion) String() string { func (*ExampleUnion) ProtoMessage() {} func (x *ExampleUnion) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[7] + mi := &file_exschemapath_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -668,7 +739,7 @@ func (x *ExampleUnion) ProtoReflect() protoreflect.Message { // Deprecated: Use ExampleUnion.ProtoReflect.Descriptor instead. func (*ExampleUnion) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{7} + return file_exschemapath_proto_rawDescGZIP(), []int{8} } func (x *ExampleUnion) GetStr() string { @@ -692,6 +763,116 @@ func (x *ExampleUnion) GetEnum() ExampleEnum { return ExampleEnum_ENUM_UNSET } +type ExampleUnionTwo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + B bool `protobuf:"varint,1,opt,name=b,proto3" json:"b,omitempty"` + F float32 `protobuf:"fixed32,2,opt,name=f,proto3" json:"f,omitempty"` +} + +func (x *ExampleUnionTwo) Reset() { + *x = ExampleUnionTwo{} + if protoimpl.UnsafeEnabled { + mi := &file_exschemapath_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExampleUnionTwo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExampleUnionTwo) ProtoMessage() {} + +func (x *ExampleUnionTwo) ProtoReflect() protoreflect.Message { + mi := &file_exschemapath_proto_msgTypes[9] + 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 ExampleUnionTwo.ProtoReflect.Descriptor instead. +func (*ExampleUnionTwo) Descriptor() ([]byte, []int) { + return file_exschemapath_proto_rawDescGZIP(), []int{9} +} + +func (x *ExampleUnionTwo) GetB() bool { + if x != nil { + return x.B + } + return false +} + +func (x *ExampleUnionTwo) GetF() float32 { + if x != nil { + return x.F + } + return 0 +} + +type ExampleUnionUnambiguous struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uint uint64 `protobuf:"varint,1,opt,name=uint,proto3" json:"uint,omitempty"` + Enum ExampleEnum `protobuf:"varint,2,opt,name=enum,proto3,enum=exschemapath.ExampleEnum" json:"enum,omitempty"` +} + +func (x *ExampleUnionUnambiguous) Reset() { + *x = ExampleUnionUnambiguous{} + if protoimpl.UnsafeEnabled { + mi := &file_exschemapath_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExampleUnionUnambiguous) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExampleUnionUnambiguous) ProtoMessage() {} + +func (x *ExampleUnionUnambiguous) ProtoReflect() protoreflect.Message { + mi := &file_exschemapath_proto_msgTypes[10] + 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 ExampleUnionUnambiguous.ProtoReflect.Descriptor instead. +func (*ExampleUnionUnambiguous) Descriptor() ([]byte, []int) { + return file_exschemapath_proto_rawDescGZIP(), []int{10} +} + +func (x *ExampleUnionUnambiguous) GetUint() uint64 { + if x != nil { + return x.Uint + } + return 0 +} + +func (x *ExampleUnionUnambiguous) GetEnum() ExampleEnum { + if x != nil { + return x.Enum + } + return ExampleEnum_ENUM_UNSET +} + type ExampleMessageChild struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -703,7 +884,7 @@ type ExampleMessageChild struct { func (x *ExampleMessageChild) Reset() { *x = ExampleMessageChild{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[8] + mi := &file_exschemapath_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -716,7 +897,7 @@ func (x *ExampleMessageChild) String() string { func (*ExampleMessageChild) ProtoMessage() {} func (x *ExampleMessageChild) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[8] + mi := &file_exschemapath_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -729,7 +910,7 @@ func (x *ExampleMessageChild) ProtoReflect() protoreflect.Message { // Deprecated: Use ExampleMessageChild.ProtoReflect.Descriptor instead. func (*ExampleMessageChild) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{8} + return file_exschemapath_proto_rawDescGZIP(), []int{11} } func (x *ExampleMessageChild) GetStr() *ywrapper.StringValue { @@ -751,7 +932,7 @@ type ExampleMessageKey struct { func (x *ExampleMessageKey) Reset() { *x = ExampleMessageKey{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[9] + mi := &file_exschemapath_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -764,7 +945,7 @@ func (x *ExampleMessageKey) String() string { func (*ExampleMessageKey) ProtoMessage() {} func (x *ExampleMessageKey) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[9] + mi := &file_exschemapath_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -777,7 +958,7 @@ func (x *ExampleMessageKey) ProtoReflect() protoreflect.Message { // Deprecated: Use ExampleMessageKey.ProtoReflect.Descriptor instead. func (*ExampleMessageKey) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{9} + return file_exschemapath_proto_rawDescGZIP(), []int{12} } func (x *ExampleMessageKey) GetSingleKey() string { @@ -806,7 +987,7 @@ type ExampleMessageListMember struct { func (x *ExampleMessageListMember) Reset() { *x = ExampleMessageListMember{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[10] + mi := &file_exschemapath_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -819,7 +1000,7 @@ func (x *ExampleMessageListMember) String() string { func (*ExampleMessageListMember) ProtoMessage() {} func (x *ExampleMessageListMember) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[10] + mi := &file_exschemapath_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -832,7 +1013,7 @@ func (x *ExampleMessageListMember) ProtoReflect() protoreflect.Message { // Deprecated: Use ExampleMessageListMember.ProtoReflect.Descriptor instead. func (*ExampleMessageListMember) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{10} + return file_exschemapath_proto_rawDescGZIP(), []int{13} } func (x *ExampleMessageListMember) GetStr() *ywrapper.StringValue { @@ -861,7 +1042,7 @@ type NestedListKey struct { func (x *NestedListKey) Reset() { *x = NestedListKey{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[11] + mi := &file_exschemapath_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -874,7 +1055,7 @@ func (x *NestedListKey) String() string { func (*NestedListKey) ProtoMessage() {} func (x *NestedListKey) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[11] + mi := &file_exschemapath_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -887,7 +1068,7 @@ func (x *NestedListKey) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedListKey.ProtoReflect.Descriptor instead. func (*NestedListKey) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{11} + return file_exschemapath_proto_rawDescGZIP(), []int{14} } func (x *NestedListKey) GetKeyOne() string { @@ -915,7 +1096,7 @@ type NestedListMember struct { func (x *NestedListMember) Reset() { *x = NestedListMember{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[12] + mi := &file_exschemapath_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -928,7 +1109,7 @@ func (x *NestedListMember) String() string { func (*NestedListMember) ProtoMessage() {} func (x *NestedListMember) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[12] + mi := &file_exschemapath_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -941,7 +1122,7 @@ func (x *NestedListMember) ProtoReflect() protoreflect.Message { // Deprecated: Use NestedListMember.ProtoReflect.Descriptor instead. func (*NestedListMember) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{12} + return file_exschemapath_proto_rawDescGZIP(), []int{15} } func (x *NestedListMember) GetStr() *ywrapper.StringValue { @@ -964,7 +1145,7 @@ type ExampleMessageMultiKey struct { func (x *ExampleMessageMultiKey) Reset() { *x = ExampleMessageMultiKey{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[13] + mi := &file_exschemapath_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -977,7 +1158,7 @@ func (x *ExampleMessageMultiKey) String() string { func (*ExampleMessageMultiKey) ProtoMessage() {} func (x *ExampleMessageMultiKey) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[13] + mi := &file_exschemapath_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -990,7 +1171,7 @@ func (x *ExampleMessageMultiKey) ProtoReflect() protoreflect.Message { // Deprecated: Use ExampleMessageMultiKey.ProtoReflect.Descriptor instead. func (*ExampleMessageMultiKey) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{13} + return file_exschemapath_proto_rawDescGZIP(), []int{16} } func (x *ExampleMessageMultiKey) GetIndex() uint32 { @@ -1025,7 +1206,7 @@ type MultiKeyListMember struct { func (x *MultiKeyListMember) Reset() { *x = MultiKeyListMember{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[14] + mi := &file_exschemapath_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1038,7 +1219,7 @@ func (x *MultiKeyListMember) String() string { func (*MultiKeyListMember) ProtoMessage() {} func (x *MultiKeyListMember) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[14] + mi := &file_exschemapath_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1051,7 +1232,7 @@ func (x *MultiKeyListMember) ProtoReflect() protoreflect.Message { // Deprecated: Use MultiKeyListMember.ProtoReflect.Descriptor instead. func (*MultiKeyListMember) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{14} + return file_exschemapath_proto_rawDescGZIP(), []int{17} } func (x *MultiKeyListMember) GetChild() *ywrapper.StringValue { @@ -1082,7 +1263,7 @@ type InvalidMessage struct { func (x *InvalidMessage) Reset() { *x = InvalidMessage{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[15] + mi := &file_exschemapath_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1095,7 +1276,7 @@ func (x *InvalidMessage) String() string { func (*InvalidMessage) ProtoMessage() {} func (x *InvalidMessage) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[15] + mi := &file_exschemapath_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1108,7 +1289,7 @@ func (x *InvalidMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use InvalidMessage.ProtoReflect.Descriptor instead. func (*InvalidMessage) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{15} + return file_exschemapath_proto_rawDescGZIP(), []int{18} } func (x *InvalidMessage) GetMapField() map[string]string { @@ -1199,7 +1380,7 @@ type InvalidAnnotationMessage struct { func (x *InvalidAnnotationMessage) Reset() { *x = InvalidAnnotationMessage{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[16] + mi := &file_exschemapath_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1212,7 +1393,7 @@ func (x *InvalidAnnotationMessage) String() string { func (*InvalidAnnotationMessage) ProtoMessage() {} func (x *InvalidAnnotationMessage) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[16] + mi := &file_exschemapath_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1225,7 +1406,7 @@ func (x *InvalidAnnotationMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use InvalidAnnotationMessage.ProtoReflect.Descriptor instead. func (*InvalidAnnotationMessage) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{16} + return file_exschemapath_proto_rawDescGZIP(), []int{19} } func (x *InvalidAnnotationMessage) GetNoAnnotation() string { @@ -1246,7 +1427,7 @@ type BadMessageKeyTwo struct { func (x *BadMessageKeyTwo) Reset() { *x = BadMessageKeyTwo{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[17] + mi := &file_exschemapath_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1259,7 +1440,7 @@ func (x *BadMessageKeyTwo) String() string { func (*BadMessageKeyTwo) ProtoMessage() {} func (x *BadMessageKeyTwo) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[17] + mi := &file_exschemapath_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1272,7 +1453,7 @@ func (x *BadMessageKeyTwo) ProtoReflect() protoreflect.Message { // Deprecated: Use BadMessageKeyTwo.ProtoReflect.Descriptor instead. func (*BadMessageKeyTwo) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{17} + return file_exschemapath_proto_rawDescGZIP(), []int{20} } func (x *BadMessageKeyTwo) GetKey() string { @@ -1293,7 +1474,7 @@ type BadMessageKey struct { func (x *BadMessageKey) Reset() { *x = BadMessageKey{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[18] + mi := &file_exschemapath_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1306,7 +1487,7 @@ func (x *BadMessageKey) String() string { func (*BadMessageKey) ProtoMessage() {} func (x *BadMessageKey) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[18] + mi := &file_exschemapath_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1319,7 +1500,7 @@ func (x *BadMessageKey) ProtoReflect() protoreflect.Message { // Deprecated: Use BadMessageKey.ProtoReflect.Descriptor instead. func (*BadMessageKey) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{18} + return file_exschemapath_proto_rawDescGZIP(), []int{21} } func (x *BadMessageKey) GetBadKeyType() float32 { @@ -1341,7 +1522,7 @@ type BadMessageMember struct { func (x *BadMessageMember) Reset() { *x = BadMessageMember{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[19] + mi := &file_exschemapath_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1354,7 +1535,7 @@ func (x *BadMessageMember) String() string { func (*BadMessageMember) ProtoMessage() {} func (x *BadMessageMember) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[19] + mi := &file_exschemapath_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1367,7 +1548,7 @@ func (x *BadMessageMember) ProtoReflect() protoreflect.Message { // Deprecated: Use BadMessageMember.ProtoReflect.Descriptor instead. func (*BadMessageMember) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{19} + return file_exschemapath_proto_rawDescGZIP(), []int{22} } func (x *BadMessageMember) GetKey() string { @@ -1395,7 +1576,7 @@ type BadKeyPathMessage struct { func (x *BadKeyPathMessage) Reset() { *x = BadKeyPathMessage{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[20] + mi := &file_exschemapath_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1408,7 +1589,7 @@ func (x *BadKeyPathMessage) String() string { func (*BadKeyPathMessage) ProtoMessage() {} func (x *BadKeyPathMessage) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[20] + mi := &file_exschemapath_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1421,7 +1602,7 @@ func (x *BadKeyPathMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use BadKeyPathMessage.ProtoReflect.Descriptor instead. func (*BadKeyPathMessage) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{20} + return file_exschemapath_proto_rawDescGZIP(), []int{23} } func (x *BadKeyPathMessage) GetKey() string { @@ -1442,7 +1623,7 @@ type InvalidKeyPathKey struct { func (x *InvalidKeyPathKey) Reset() { *x = InvalidKeyPathKey{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[21] + mi := &file_exschemapath_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1455,7 +1636,7 @@ func (x *InvalidKeyPathKey) String() string { func (*InvalidKeyPathKey) ProtoMessage() {} func (x *InvalidKeyPathKey) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[21] + mi := &file_exschemapath_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1468,7 +1649,7 @@ func (x *InvalidKeyPathKey) ProtoReflect() protoreflect.Message { // Deprecated: Use InvalidKeyPathKey.ProtoReflect.Descriptor instead. func (*InvalidKeyPathKey) Descriptor() ([]byte, []int) { - return file_exschemapath_proto_rawDescGZIP(), []int{21} + return file_exschemapath_proto_rawDescGZIP(), []int{24} } func (x *InvalidKeyPathKey) GetKey() string { @@ -1490,7 +1671,7 @@ type Root_InterfaceKey struct { func (x *Root_InterfaceKey) Reset() { *x = Root_InterfaceKey{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[22] + mi := &file_exschemapath_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1503,7 +1684,7 @@ func (x *Root_InterfaceKey) String() string { func (*Root_InterfaceKey) ProtoMessage() {} func (x *Root_InterfaceKey) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[22] + mi := &file_exschemapath_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1545,7 +1726,7 @@ type Interface_SubinterfaceKey struct { func (x *Interface_SubinterfaceKey) Reset() { *x = Interface_SubinterfaceKey{} if protoimpl.UnsafeEnabled { - mi := &file_exschemapath_proto_msgTypes[23] + mi := &file_exschemapath_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1558,7 +1739,7 @@ func (x *Interface_SubinterfaceKey) String() string { func (*Interface_SubinterfaceKey) ProtoMessage() {} func (x *Interface_SubinterfaceKey) ProtoReflect() protoreflect.Message { - mi := &file_exschemapath_proto_msgTypes[23] + mi := &file_exschemapath_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1664,7 +1845,7 @@ var file_exschemapath_proto_rawDesc = []byte{ 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x81, 0x0b, 0x0a, 0x0e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, + 0x6e, 0x22, 0x88, 0x0d, 0x0a, 0x0e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x02, 0x62, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0x82, 0x41, 0x05, 0x2f, 0x62, 0x6f, 0x6f, 0x6c, 0x52, @@ -1751,189 +1932,223 @@ var file_exschemapath_proto_rawDesc = []byte{ 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x0a, 0x82, 0x41, 0x07, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x06, - 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xd7, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, - 0x0a, 0x03, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, - 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x42, 0x0e, 0x82, 0x41, 0x0b, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x6f, - 0x6e, 0x65, 0x52, 0x03, 0x6f, 0x6e, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x74, 0x77, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0e, 0x82, 0x41, 0x0b, - 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x74, 0x77, 0x6f, 0x52, 0x03, 0x74, 0x77, 0x6f, - 0x12, 0x4d, 0x0a, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x47, 0x72, 0x61, 0x6e, - 0x64, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x42, 0x10, 0x82, 0x41, 0x0d, 0x2f, 0x6e, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, - 0x97, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4e, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6f, - 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, - 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x14, 0x82, 0x41, 0x11, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x2f, 0x6f, 0x6e, 0x65, 0x52, 0x03, 0x6f, 0x6e, 0x65, 0x12, 0x3d, 0x0a, 0x03, 0x74, 0x77, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, - 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x14, - 0x82, 0x41, 0x11, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, - 0x2f, 0x74, 0x77, 0x6f, 0x52, 0x03, 0x74, 0x77, 0x6f, 0x22, 0x9f, 0x01, 0x0a, 0x0c, 0x45, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x03, 0x73, 0x74, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0x82, 0x41, 0x0f, 0x2f, 0x6c, 0x65, 0x61, - 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x73, 0x74, 0x72, - 0x12, 0x26, 0x0a, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x12, - 0x82, 0x41, 0x0f, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, 0x6e, 0x69, - 0x6f, 0x6e, 0x52, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, - 0x6d, 0x42, 0x12, 0x82, 0x41, 0x0f, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, - 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x4f, 0x0a, 0x13, 0x45, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x12, 0x38, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, 0x82, 0x41, 0x0c, 0x2f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x52, 0x03, 0x73, 0x74, 0x72, 0x22, 0xa9, 0x01, 0x0a, - 0x11, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x54, 0x0a, 0x0a, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0x82, 0x41, 0x32, 0x2f, 0x6c, 0x69, 0x73, 0x74, - 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x6b, 0x65, 0x79, - 0x7c, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x73, - 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x42, + 0x09, 0x82, 0x41, 0x06, 0x2f, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x75, 0x6e, 0x69, 0x6f, + 0x6e, 0x12, 0x68, 0x0a, 0x10, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x6e, + 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x78, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x6f, + 0x75, 0x73, 0x42, 0x17, 0x82, 0x41, 0x11, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, + 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x2d, 0x62, 0xe0, 0x49, 0x01, 0x52, 0x0e, 0x6c, 0x65, 0x61, + 0x66, 0x6c, 0x69, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x60, 0x0a, 0x10, 0x6c, + 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x18, + 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x6f, + 0x6e, 0x54, 0x77, 0x6f, 0x42, 0x17, 0x82, 0x41, 0x11, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, + 0x73, 0x74, 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0xe0, 0x49, 0x01, 0x52, 0x0e, 0x6c, + 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x43, 0x42, 0x0d, 0x0a, + 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0xd7, 0x01, 0x0a, + 0x14, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1b, 0x82, 0x41, 0x18, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, - 0x2d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x03, 0x73, 0x74, 0x72, 0x12, 0x54, 0x0a, 0x0a, 0x63, - 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x4e, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x18, 0x82, 0x41, - 0x15, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x20, 0x82, 0x41, 0x1d, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, - 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x6b, - 0x65, 0x79, 0x2d, 0x6f, 0x6e, 0x65, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4f, 0x6e, 0x65, 0x12, 0x34, - 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x4e, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x22, 0x59, 0x0a, 0x10, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1c, 0x82, 0x41, - 0x19, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x73, 0x74, 0x72, 0x52, 0x03, 0x73, 0x74, 0x72, 0x22, - 0xd8, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x43, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x2d, 0x82, 0x41, 0x2a, 0x2f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7c, - 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0x82, - 0x41, 0x28, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x6e, 0x61, - 0x6d, 0x65, 0x7c, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x38, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x5e, 0x0a, 0x12, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x48, 0x0a, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0e, 0x82, 0x41, 0x0b, 0x2f, 0x6e, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x6f, 0x6e, 0x65, 0x52, 0x03, 0x6f, 0x6e, 0x65, 0x12, 0x37, + 0x0a, 0x03, 0x74, 0x77, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x42, 0x0e, 0x82, 0x41, 0x0b, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x74, + 0x77, 0x6f, 0x52, 0x03, 0x74, 0x77, 0x6f, 0x12, 0x4d, 0x0a, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4e, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x42, 0x10, 0x82, + 0x41, 0x0d, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x52, + 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1b, 0x82, 0x41, 0x18, 0x2f, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x68, - 0x69, 0x6c, 0x64, 0x52, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0xb1, 0x06, 0x0a, 0x0e, 0x49, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x5d, 0x0a, - 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, - 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, - 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x14, 0x82, 0x41, - 0x11, 0x2f, 0x61, 0x6e, 0x2f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x2f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x6e, 0x6f, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3d, 0x0a, 0x02, 0x6b, 0x6d, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0c, - 0x82, 0x41, 0x09, 0x2f, 0x6f, 0x6e, 0x65, 0x7c, 0x2f, 0x74, 0x77, 0x6f, 0x52, 0x02, 0x6b, 0x6d, - 0x12, 0x19, 0x0a, 0x02, 0x6b, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x09, 0x82, 0x41, - 0x06, 0x2f, 0x74, 0x68, 0x72, 0x65, 0x65, 0x52, 0x02, 0x6b, 0x65, 0x12, 0x35, 0x0a, 0x02, 0x62, - 0x6b, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x4b, 0x65, 0x79, 0x42, 0x08, 0x82, 0x41, 0x05, 0x2f, 0x66, 0x6f, 0x75, 0x72, 0x52, 0x02, - 0x62, 0x6b, 0x12, 0x38, 0x0a, 0x02, 0x62, 0x6d, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, 0x61, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x08, - 0x82, 0x41, 0x05, 0x2f, 0x66, 0x69, 0x76, 0x65, 0x52, 0x02, 0x62, 0x6d, 0x12, 0x59, 0x0a, 0x16, - 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, - 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x0c, 0x82, 0x41, 0x09, 0x2f, 0x6f, 0x6e, 0x65, 0x5b, 0x74, 0x77, 0x6f, - 0x5d, 0x52, 0x14, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x62, 0x6b, 0x5f, 0x74, 0x77, - 0x6f, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x4b, 0x65, 0x79, 0x54, 0x77, 0x6f, 0x42, 0x07, 0x82, 0x41, 0x04, 0x2f, 0x73, 0x69, 0x78, - 0x52, 0x05, 0x62, 0x6b, 0x54, 0x77, 0x6f, 0x12, 0x79, 0x0a, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, - 0x66, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, - 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x42, 0x0e, 0x82, 0x41, 0x0b, 0x2f, 0x73, 0x69, 0x78, 0x7c, 0x2f, 0x73, 0x65, 0x76, 0x65, - 0x6e, 0x52, 0x1f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x04, 0x62, 0x6b, 0x70, 0x6d, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, - 0x42, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x42, 0x09, 0x82, 0x41, 0x06, 0x2f, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x04, 0x62, 0x6b, - 0x70, 0x6d, 0x12, 0x3d, 0x0a, 0x04, 0x69, 0x6b, 0x70, 0x6b, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, - 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x4b, 0x65, - 0x79, 0x42, 0x08, 0x82, 0x41, 0x05, 0x2f, 0x6e, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x69, 0x6b, 0x70, - 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 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, 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, 0x3f, - 0x0a, 0x18, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, - 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x36, 0x0a, 0x10, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, - 0x54, 0x77, 0x6f, 0x12, 0x22, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x10, 0x82, 0x41, 0x0d, 0x2f, 0x6f, 0x6e, 0x65, 0x7c, 0x2f, 0x6f, 0x6e, 0x65, 0x2f, 0x74, - 0x77, 0x6f, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x3f, 0x0a, 0x0d, 0x42, 0x61, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x0c, 0x62, 0x61, 0x64, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x42, 0x0c, - 0x82, 0x41, 0x09, 0x2f, 0x66, 0x6f, 0x75, 0x72, 0x2f, 0x6b, 0x65, 0x79, 0x52, 0x0a, 0x62, 0x61, - 0x64, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x22, 0x58, 0x0a, 0x10, 0x42, 0x61, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0x82, 0x41, 0x07, 0x2f, 0x6f, - 0x6b, 0x2d, 0x6b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x08, 0x62, 0x61, - 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0b, 0x82, 0x41, - 0x08, 0x2f, 0x62, 0x61, 0x64, 0x2d, 0x6b, 0x65, 0x79, 0x52, 0x07, 0x62, 0x61, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x11, 0x42, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0x82, 0x41, 0x01, 0x2f, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, - 0x33, 0x0a, 0x11, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, - 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x0c, 0x82, 0x41, 0x09, 0x2f, 0x6f, 0x6e, 0x65, 0x5b, 0x74, 0x77, 0x6f, 0x5d, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x2a, 0x7e, 0x0a, 0x0b, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, - 0x6e, 0x75, 0x6d, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x45, - 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x0b, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x56, 0x41, 0x4c, 0x4f, - 0x4e, 0x45, 0x10, 0x01, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x56, 0x41, 0x4c, 0x5f, 0x4f, 0x4e, 0x45, - 0x12, 0x1b, 0x0a, 0x0b, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x56, 0x41, 0x4c, 0x54, 0x57, 0x4f, 0x10, - 0x02, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x56, 0x41, 0x4c, 0x5f, 0x54, 0x57, 0x4f, 0x12, 0x25, 0x0a, - 0x10, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x56, 0x41, 0x4c, 0x46, 0x4f, 0x52, 0x54, 0x59, 0x54, 0x57, - 0x4f, 0x10, 0x2a, 0x1a, 0x0f, 0x82, 0x41, 0x0c, 0x56, 0x41, 0x4c, 0x5f, 0x46, 0x4f, 0x52, 0x54, - 0x59, 0x54, 0x57, 0x4f, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x79, 0x67, - 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6d, 0x61, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, - 0x64, 0x61, 0x74, 0x61, 0x2f, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, - 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x14, 0x82, 0x41, 0x11, 0x2f, 0x6e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2f, 0x6f, 0x6e, 0x65, 0x52, 0x03, 0x6f, 0x6e, + 0x65, 0x12, 0x3d, 0x0a, 0x03, 0x74, 0x77, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x14, 0x82, 0x41, 0x11, 0x2f, 0x6e, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2f, 0x74, 0x77, 0x6f, 0x52, 0x03, 0x74, 0x77, 0x6f, + 0x22, 0x29, 0x0a, 0x0a, 0x42, 0x61, 0x73, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x1b, + 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0x82, 0x41, 0x06, + 0x2f, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x73, 0x74, 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x0c, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x03, + 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0x82, 0x41, 0x0f, 0x2f, 0x6c, + 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x73, + 0x74, 0x72, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x12, 0x82, 0x41, 0x0f, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, + 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x65, 0x6e, + 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, + 0x6e, 0x75, 0x6d, 0x42, 0x12, 0x82, 0x41, 0x0f, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, + 0x74, 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x59, 0x0a, + 0x0f, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x77, 0x6f, + 0x12, 0x22, 0x0a, 0x01, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x14, 0x82, 0x41, 0x11, + 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x2d, + 0x63, 0x52, 0x01, 0x62, 0x12, 0x22, 0x0a, 0x01, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x42, + 0x14, 0x82, 0x41, 0x11, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, 0x6e, + 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x52, 0x01, 0x66, 0x22, 0x88, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x61, 0x6d, 0x62, 0x69, 0x67, + 0x75, 0x6f, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x14, 0x82, 0x41, 0x11, 0x2f, 0x6c, 0x65, 0x61, 0x66, 0x6c, 0x69, 0x73, 0x74, + 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x2d, 0x62, 0x52, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x12, 0x43, + 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x65, + 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x14, 0x82, 0x41, 0x11, 0x2f, 0x6c, 0x65, 0x61, + 0x66, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x2d, 0x62, 0x52, 0x04, 0x65, + 0x6e, 0x75, 0x6d, 0x22, 0x4f, 0x0a, 0x13, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x12, 0x38, 0x0a, 0x03, 0x73, 0x74, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, + 0x82, 0x41, 0x0c, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x52, + 0x03, 0x73, 0x74, 0x72, 0x22, 0xa9, 0x01, 0x0a, 0x11, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x0a, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, + 0x82, 0x41, 0x32, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x6b, 0x65, 0x79, 0x7c, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, + 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x2d, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, + 0x03, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x42, 0x1b, 0x82, 0x41, 0x18, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, 0x61, 0x6d, 0x65, + 0x2f, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x03, + 0x73, 0x74, 0x72, 0x12, 0x54, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x4b, 0x65, 0x79, 0x42, 0x18, 0x82, 0x41, 0x15, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, + 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x09, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x4e, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x07, 0x6b, + 0x65, 0x79, 0x5f, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x20, 0x82, 0x41, + 0x1d, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x6b, 0x65, 0x79, 0x2d, 0x6f, 0x6e, 0x65, 0x52, 0x06, + 0x6b, 0x65, 0x79, 0x4f, 0x6e, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x59, 0x0a, 0x10, + 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x45, 0x0a, 0x03, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1c, 0x82, 0x41, 0x19, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6e, + 0x61, 0x6d, 0x65, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x73, + 0x74, 0x72, 0x52, 0x03, 0x73, 0x74, 0x72, 0x22, 0xd8, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4b, + 0x65, 0x79, 0x12, 0x43, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x42, 0x2d, 0x82, 0x41, 0x2a, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6c, 0x69, 0x73, + 0x74, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7c, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6c, + 0x69, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2b, 0x82, 0x41, 0x28, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x7c, 0x2f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6e, 0x61, + 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4b, 0x65, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x5e, 0x0a, 0x12, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x05, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1b, + 0x82, 0x41, 0x18, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x22, 0xb1, 0x06, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x5d, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x61, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x42, 0x14, 0x82, 0x41, 0x11, 0x2f, 0x61, 0x6e, 0x2f, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x41, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x02, 0x6b, 0x6d, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0c, 0x82, 0x41, 0x09, 0x2f, 0x6f, 0x6e, 0x65, 0x7c, + 0x2f, 0x74, 0x77, 0x6f, 0x52, 0x02, 0x6b, 0x6d, 0x12, 0x19, 0x0a, 0x02, 0x6b, 0x65, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x09, 0x82, 0x41, 0x06, 0x2f, 0x74, 0x68, 0x72, 0x65, 0x65, 0x52, + 0x02, 0x6b, 0x65, 0x12, 0x35, 0x0a, 0x02, 0x62, 0x6b, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, + 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x08, 0x82, 0x41, + 0x05, 0x2f, 0x66, 0x6f, 0x75, 0x72, 0x52, 0x02, 0x62, 0x6b, 0x12, 0x38, 0x0a, 0x02, 0x62, 0x6d, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x08, 0x82, 0x41, 0x05, 0x2f, 0x66, 0x69, 0x76, 0x65, + 0x52, 0x02, 0x62, 0x6d, 0x12, 0x59, 0x0a, 0x16, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0c, 0x82, 0x41, 0x09, + 0x2f, 0x6f, 0x6e, 0x65, 0x5b, 0x74, 0x77, 0x6f, 0x5d, 0x52, 0x14, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x3e, 0x0a, 0x06, 0x62, 0x6b, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, + 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x77, 0x6f, 0x42, + 0x07, 0x82, 0x41, 0x04, 0x2f, 0x73, 0x69, 0x78, 0x52, 0x05, 0x62, 0x6b, 0x54, 0x77, 0x6f, 0x12, + 0x79, 0x0a, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x65, 0x78, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x0e, 0x82, 0x41, 0x0b, 0x2f, 0x73, + 0x69, 0x78, 0x7c, 0x2f, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x52, 0x1f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, + 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x04, 0x62, 0x6b, + 0x70, 0x6d, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x42, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x50, 0x61, + 0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x09, 0x82, 0x41, 0x06, 0x2f, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x52, 0x04, 0x62, 0x6b, 0x70, 0x6d, 0x12, 0x3d, 0x0a, 0x04, 0x69, 0x6b, + 0x70, 0x6b, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x78, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4b, + 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0x82, 0x41, 0x05, 0x2f, 0x6e, + 0x69, 0x6e, 0x65, 0x52, 0x04, 0x69, 0x6b, 0x70, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x61, 0x70, + 0x46, 0x69, 0x65, 0x6c, 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, 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, 0x3f, 0x0a, 0x18, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x41, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x36, 0x0a, 0x10, 0x42, 0x61, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x77, 0x6f, 0x12, 0x22, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x10, 0x82, 0x41, 0x0d, 0x2f, 0x6f, 0x6e, + 0x65, 0x7c, 0x2f, 0x6f, 0x6e, 0x65, 0x2f, 0x74, 0x77, 0x6f, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, + 0x3f, 0x0a, 0x0d, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x2e, 0x0a, 0x0c, 0x62, 0x61, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x42, 0x0c, 0x82, 0x41, 0x09, 0x2f, 0x66, 0x6f, 0x75, 0x72, + 0x2f, 0x6b, 0x65, 0x79, 0x52, 0x0a, 0x62, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x22, 0x58, 0x0a, 0x10, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0a, 0x82, 0x41, 0x07, 0x2f, 0x6f, 0x6b, 0x2d, 0x6b, 0x65, 0x79, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x26, 0x0a, 0x08, 0x62, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x0b, 0x82, 0x41, 0x08, 0x2f, 0x62, 0x61, 0x64, 0x2d, 0x6b, 0x65, + 0x79, 0x52, 0x07, 0x62, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x11, 0x42, 0x61, + 0x64, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x16, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0x82, 0x41, + 0x01, 0x2f, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x33, 0x0a, 0x11, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0x82, 0x41, 0x09, 0x2f, 0x6f, + 0x6e, 0x65, 0x5b, 0x74, 0x77, 0x6f, 0x5d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x2a, 0x7e, 0x0a, 0x0b, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0e, 0x0a, 0x0a, 0x45, + 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x0b, 0x45, + 0x4e, 0x55, 0x4d, 0x5f, 0x56, 0x41, 0x4c, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x1a, 0x0a, 0x82, 0x41, + 0x07, 0x56, 0x41, 0x4c, 0x5f, 0x4f, 0x4e, 0x45, 0x12, 0x1b, 0x0a, 0x0b, 0x45, 0x4e, 0x55, 0x4d, + 0x5f, 0x56, 0x41, 0x4c, 0x54, 0x57, 0x4f, 0x10, 0x02, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x56, 0x41, + 0x4c, 0x5f, 0x54, 0x57, 0x4f, 0x12, 0x25, 0x0a, 0x10, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x56, 0x41, + 0x4c, 0x46, 0x4f, 0x52, 0x54, 0x59, 0x54, 0x57, 0x4f, 0x10, 0x2a, 0x1a, 0x0f, 0x82, 0x41, 0x0c, + 0x56, 0x41, 0x4c, 0x5f, 0x46, 0x4f, 0x52, 0x54, 0x59, 0x54, 0x57, 0x4f, 0x42, 0x3b, 0x5a, 0x39, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x6d, 0x61, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x65, 0x78, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x74, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -1949,7 +2164,7 @@ func file_exschemapath_proto_rawDescGZIP() []byte { } var file_exschemapath_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_exschemapath_proto_msgTypes = make([]protoimpl.MessageInfo, 25) +var file_exschemapath_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_exschemapath_proto_goTypes = []interface{}{ (ExampleEnum)(0), // 0: exschemapath.ExampleEnum (*Root)(nil), // 1: exschemapath.Root @@ -1959,87 +2174,94 @@ var file_exschemapath_proto_goTypes = []interface{}{ (*ExampleMessage)(nil), // 5: exschemapath.ExampleMessage (*ExampleNestedMessage)(nil), // 6: exschemapath.ExampleNestedMessage (*ExampleNestedGrandchild)(nil), // 7: exschemapath.ExampleNestedGrandchild - (*ExampleUnion)(nil), // 8: exschemapath.ExampleUnion - (*ExampleMessageChild)(nil), // 9: exschemapath.ExampleMessageChild - (*ExampleMessageKey)(nil), // 10: exschemapath.ExampleMessageKey - (*ExampleMessageListMember)(nil), // 11: exschemapath.ExampleMessageListMember - (*NestedListKey)(nil), // 12: exschemapath.NestedListKey - (*NestedListMember)(nil), // 13: exschemapath.NestedListMember - (*ExampleMessageMultiKey)(nil), // 14: exschemapath.ExampleMessageMultiKey - (*MultiKeyListMember)(nil), // 15: exschemapath.MultiKeyListMember - (*InvalidMessage)(nil), // 16: exschemapath.InvalidMessage - (*InvalidAnnotationMessage)(nil), // 17: exschemapath.InvalidAnnotationMessage - (*BadMessageKeyTwo)(nil), // 18: exschemapath.BadMessageKeyTwo - (*BadMessageKey)(nil), // 19: exschemapath.BadMessageKey - (*BadMessageMember)(nil), // 20: exschemapath.BadMessageMember - (*BadKeyPathMessage)(nil), // 21: exschemapath.BadKeyPathMessage - (*InvalidKeyPathKey)(nil), // 22: exschemapath.InvalidKeyPathKey - (*Root_InterfaceKey)(nil), // 23: exschemapath.Root.InterfaceKey - (*Interface_SubinterfaceKey)(nil), // 24: exschemapath.Interface.SubinterfaceKey - nil, // 25: exschemapath.InvalidMessage.MapFieldEntry - (*ywrapper.StringValue)(nil), // 26: ywrapper.StringValue - (*ywrapper.BoolValue)(nil), // 27: ywrapper.BoolValue - (*ywrapper.BytesValue)(nil), // 28: ywrapper.BytesValue - (*ywrapper.Decimal64Value)(nil), // 29: ywrapper.Decimal64Value - (*ywrapper.IntValue)(nil), // 30: ywrapper.IntValue - (*ywrapper.UintValue)(nil), // 31: ywrapper.UintValue + (*BasicUnion)(nil), // 8: exschemapath.BasicUnion + (*ExampleUnion)(nil), // 9: exschemapath.ExampleUnion + (*ExampleUnionTwo)(nil), // 10: exschemapath.ExampleUnionTwo + (*ExampleUnionUnambiguous)(nil), // 11: exschemapath.ExampleUnionUnambiguous + (*ExampleMessageChild)(nil), // 12: exschemapath.ExampleMessageChild + (*ExampleMessageKey)(nil), // 13: exschemapath.ExampleMessageKey + (*ExampleMessageListMember)(nil), // 14: exschemapath.ExampleMessageListMember + (*NestedListKey)(nil), // 15: exschemapath.NestedListKey + (*NestedListMember)(nil), // 16: exschemapath.NestedListMember + (*ExampleMessageMultiKey)(nil), // 17: exschemapath.ExampleMessageMultiKey + (*MultiKeyListMember)(nil), // 18: exschemapath.MultiKeyListMember + (*InvalidMessage)(nil), // 19: exschemapath.InvalidMessage + (*InvalidAnnotationMessage)(nil), // 20: exschemapath.InvalidAnnotationMessage + (*BadMessageKeyTwo)(nil), // 21: exschemapath.BadMessageKeyTwo + (*BadMessageKey)(nil), // 22: exschemapath.BadMessageKey + (*BadMessageMember)(nil), // 23: exschemapath.BadMessageMember + (*BadKeyPathMessage)(nil), // 24: exschemapath.BadKeyPathMessage + (*InvalidKeyPathKey)(nil), // 25: exschemapath.InvalidKeyPathKey + (*Root_InterfaceKey)(nil), // 26: exschemapath.Root.InterfaceKey + (*Interface_SubinterfaceKey)(nil), // 27: exschemapath.Interface.SubinterfaceKey + nil, // 28: exschemapath.InvalidMessage.MapFieldEntry + (*ywrapper.StringValue)(nil), // 29: ywrapper.StringValue + (*ywrapper.BoolValue)(nil), // 30: ywrapper.BoolValue + (*ywrapper.BytesValue)(nil), // 31: ywrapper.BytesValue + (*ywrapper.Decimal64Value)(nil), // 32: ywrapper.Decimal64Value + (*ywrapper.IntValue)(nil), // 33: ywrapper.IntValue + (*ywrapper.UintValue)(nil), // 34: ywrapper.UintValue } var file_exschemapath_proto_depIdxs = []int32{ 3, // 0: exschemapath.Root.system:type_name -> exschemapath.System - 23, // 1: exschemapath.Root.interface:type_name -> exschemapath.Root.InterfaceKey - 26, // 2: exschemapath.Interface.description:type_name -> ywrapper.StringValue - 24, // 3: exschemapath.Interface.subinterface:type_name -> exschemapath.Interface.SubinterfaceKey - 26, // 4: exschemapath.System.hostname:type_name -> ywrapper.StringValue - 26, // 5: exschemapath.Subinterface.description:type_name -> ywrapper.StringValue - 27, // 6: exschemapath.ExampleMessage.bo:type_name -> ywrapper.BoolValue - 28, // 7: exschemapath.ExampleMessage.by:type_name -> ywrapper.BytesValue - 29, // 8: exschemapath.ExampleMessage.de:type_name -> ywrapper.Decimal64Value - 30, // 9: exschemapath.ExampleMessage.in:type_name -> ywrapper.IntValue - 26, // 10: exschemapath.ExampleMessage.str:type_name -> ywrapper.StringValue - 31, // 11: exschemapath.ExampleMessage.ui:type_name -> ywrapper.UintValue - 9, // 12: exschemapath.ExampleMessage.ex:type_name -> exschemapath.ExampleMessageChild - 10, // 13: exschemapath.ExampleMessage.em:type_name -> exschemapath.ExampleMessageKey - 14, // 14: exschemapath.ExampleMessage.multi:type_name -> exschemapath.ExampleMessageMultiKey + 26, // 1: exschemapath.Root.interface:type_name -> exschemapath.Root.InterfaceKey + 29, // 2: exschemapath.Interface.description:type_name -> ywrapper.StringValue + 27, // 3: exschemapath.Interface.subinterface:type_name -> exschemapath.Interface.SubinterfaceKey + 29, // 4: exschemapath.System.hostname:type_name -> ywrapper.StringValue + 29, // 5: exschemapath.Subinterface.description:type_name -> ywrapper.StringValue + 30, // 6: exschemapath.ExampleMessage.bo:type_name -> ywrapper.BoolValue + 31, // 7: exschemapath.ExampleMessage.by:type_name -> ywrapper.BytesValue + 32, // 8: exschemapath.ExampleMessage.de:type_name -> ywrapper.Decimal64Value + 33, // 9: exschemapath.ExampleMessage.in:type_name -> ywrapper.IntValue + 29, // 10: exschemapath.ExampleMessage.str:type_name -> ywrapper.StringValue + 34, // 11: exschemapath.ExampleMessage.ui:type_name -> ywrapper.UintValue + 12, // 12: exschemapath.ExampleMessage.ex:type_name -> exschemapath.ExampleMessageChild + 13, // 13: exschemapath.ExampleMessage.em:type_name -> exschemapath.ExampleMessageKey + 17, // 14: exschemapath.ExampleMessage.multi:type_name -> exschemapath.ExampleMessageMultiKey 0, // 15: exschemapath.ExampleMessage.en:type_name -> exschemapath.ExampleEnum - 26, // 16: exschemapath.ExampleMessage.compress:type_name -> ywrapper.StringValue - 26, // 17: exschemapath.ExampleMessage.leaflist_string:type_name -> ywrapper.StringValue - 27, // 18: exschemapath.ExampleMessage.leaflist_bool:type_name -> ywrapper.BoolValue - 30, // 19: exschemapath.ExampleMessage.leaflist_int:type_name -> ywrapper.IntValue - 31, // 20: exschemapath.ExampleMessage.leaflist_uint:type_name -> ywrapper.UintValue - 28, // 21: exschemapath.ExampleMessage.leaflist_bytes:type_name -> ywrapper.BytesValue - 29, // 22: exschemapath.ExampleMessage.leaflist_decimal64:type_name -> ywrapper.Decimal64Value - 8, // 23: exschemapath.ExampleMessage.leaflist_union:type_name -> exschemapath.ExampleUnion + 29, // 16: exschemapath.ExampleMessage.compress:type_name -> ywrapper.StringValue + 29, // 17: exschemapath.ExampleMessage.leaflist_string:type_name -> ywrapper.StringValue + 30, // 18: exschemapath.ExampleMessage.leaflist_bool:type_name -> ywrapper.BoolValue + 33, // 19: exschemapath.ExampleMessage.leaflist_int:type_name -> ywrapper.IntValue + 34, // 20: exschemapath.ExampleMessage.leaflist_uint:type_name -> ywrapper.UintValue + 31, // 21: exschemapath.ExampleMessage.leaflist_bytes:type_name -> ywrapper.BytesValue + 32, // 22: exschemapath.ExampleMessage.leaflist_decimal64:type_name -> ywrapper.Decimal64Value + 9, // 23: exschemapath.ExampleMessage.leaflist_union:type_name -> exschemapath.ExampleUnion 6, // 24: exschemapath.ExampleMessage.nested:type_name -> exschemapath.ExampleNestedMessage - 26, // 25: exschemapath.ExampleNestedMessage.one:type_name -> ywrapper.StringValue - 26, // 26: exschemapath.ExampleNestedMessage.two:type_name -> ywrapper.StringValue - 7, // 27: exschemapath.ExampleNestedMessage.child:type_name -> exschemapath.ExampleNestedGrandchild - 26, // 28: exschemapath.ExampleNestedGrandchild.one:type_name -> ywrapper.StringValue - 26, // 29: exschemapath.ExampleNestedGrandchild.two:type_name -> ywrapper.StringValue - 0, // 30: exschemapath.ExampleUnion.enum:type_name -> exschemapath.ExampleEnum - 26, // 31: exschemapath.ExampleMessageChild.str:type_name -> ywrapper.StringValue - 11, // 32: exschemapath.ExampleMessageKey.member:type_name -> exschemapath.ExampleMessageListMember - 26, // 33: exschemapath.ExampleMessageListMember.str:type_name -> ywrapper.StringValue - 12, // 34: exschemapath.ExampleMessageListMember.child_list:type_name -> exschemapath.NestedListKey - 13, // 35: exschemapath.NestedListKey.field:type_name -> exschemapath.NestedListMember - 26, // 36: exschemapath.NestedListMember.str:type_name -> ywrapper.StringValue - 15, // 37: exschemapath.ExampleMessageMultiKey.member:type_name -> exschemapath.MultiKeyListMember - 26, // 38: exschemapath.MultiKeyListMember.child:type_name -> ywrapper.StringValue - 25, // 39: exschemapath.InvalidMessage.map_field:type_name -> exschemapath.InvalidMessage.MapFieldEntry - 10, // 40: exschemapath.InvalidMessage.km:type_name -> exschemapath.ExampleMessageKey - 19, // 41: exschemapath.InvalidMessage.bk:type_name -> exschemapath.BadMessageKey - 20, // 42: exschemapath.InvalidMessage.bm:type_name -> exschemapath.BadMessageMember - 26, // 43: exschemapath.InvalidMessage.invalid_annotated_path:type_name -> ywrapper.StringValue - 18, // 44: exschemapath.InvalidMessage.bk_two:type_name -> exschemapath.BadMessageKeyTwo - 16, // 45: exschemapath.InvalidMessage.multiple_annotations_for_container:type_name -> exschemapath.InvalidMessage - 21, // 46: exschemapath.InvalidMessage.bkpm:type_name -> exschemapath.BadKeyPathMessage - 22, // 47: exschemapath.InvalidMessage.ikpk:type_name -> exschemapath.InvalidKeyPathKey - 2, // 48: exschemapath.Root.InterfaceKey.interface:type_name -> exschemapath.Interface - 4, // 49: exschemapath.Interface.SubinterfaceKey.subinterface:type_name -> exschemapath.Subinterface - 50, // [50:50] is the sub-list for method output_type - 50, // [50:50] is the sub-list for method input_type - 50, // [50:50] is the sub-list for extension type_name - 50, // [50:50] is the sub-list for extension extendee - 0, // [0:50] is the sub-list for field type_name + 8, // 25: exschemapath.ExampleMessage.union:type_name -> exschemapath.BasicUnion + 11, // 26: exschemapath.ExampleMessage.leaflist_union_b:type_name -> exschemapath.ExampleUnionUnambiguous + 10, // 27: exschemapath.ExampleMessage.leaflist_union_c:type_name -> exschemapath.ExampleUnionTwo + 29, // 28: exschemapath.ExampleNestedMessage.one:type_name -> ywrapper.StringValue + 29, // 29: exschemapath.ExampleNestedMessage.two:type_name -> ywrapper.StringValue + 7, // 30: exschemapath.ExampleNestedMessage.child:type_name -> exschemapath.ExampleNestedGrandchild + 29, // 31: exschemapath.ExampleNestedGrandchild.one:type_name -> ywrapper.StringValue + 29, // 32: exschemapath.ExampleNestedGrandchild.two:type_name -> ywrapper.StringValue + 0, // 33: exschemapath.ExampleUnion.enum:type_name -> exschemapath.ExampleEnum + 0, // 34: exschemapath.ExampleUnionUnambiguous.enum:type_name -> exschemapath.ExampleEnum + 29, // 35: exschemapath.ExampleMessageChild.str:type_name -> ywrapper.StringValue + 14, // 36: exschemapath.ExampleMessageKey.member:type_name -> exschemapath.ExampleMessageListMember + 29, // 37: exschemapath.ExampleMessageListMember.str:type_name -> ywrapper.StringValue + 15, // 38: exschemapath.ExampleMessageListMember.child_list:type_name -> exschemapath.NestedListKey + 16, // 39: exschemapath.NestedListKey.field:type_name -> exschemapath.NestedListMember + 29, // 40: exschemapath.NestedListMember.str:type_name -> ywrapper.StringValue + 18, // 41: exschemapath.ExampleMessageMultiKey.member:type_name -> exschemapath.MultiKeyListMember + 29, // 42: exschemapath.MultiKeyListMember.child:type_name -> ywrapper.StringValue + 28, // 43: exschemapath.InvalidMessage.map_field:type_name -> exschemapath.InvalidMessage.MapFieldEntry + 13, // 44: exschemapath.InvalidMessage.km:type_name -> exschemapath.ExampleMessageKey + 22, // 45: exschemapath.InvalidMessage.bk:type_name -> exschemapath.BadMessageKey + 23, // 46: exschemapath.InvalidMessage.bm:type_name -> exschemapath.BadMessageMember + 29, // 47: exschemapath.InvalidMessage.invalid_annotated_path:type_name -> ywrapper.StringValue + 21, // 48: exschemapath.InvalidMessage.bk_two:type_name -> exschemapath.BadMessageKeyTwo + 19, // 49: exschemapath.InvalidMessage.multiple_annotations_for_container:type_name -> exschemapath.InvalidMessage + 24, // 50: exschemapath.InvalidMessage.bkpm:type_name -> exschemapath.BadKeyPathMessage + 25, // 51: exschemapath.InvalidMessage.ikpk:type_name -> exschemapath.InvalidKeyPathKey + 2, // 52: exschemapath.Root.InterfaceKey.interface:type_name -> exschemapath.Interface + 4, // 53: exschemapath.Interface.SubinterfaceKey.subinterface:type_name -> exschemapath.Subinterface + 54, // [54:54] is the sub-list for method output_type + 54, // [54:54] is the sub-list for method input_type + 54, // [54:54] is the sub-list for extension type_name + 54, // [54:54] is the sub-list for extension extendee + 0, // [0:54] is the sub-list for field type_name } func init() { file_exschemapath_proto_init() } @@ -2133,7 +2355,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExampleUnion); i { + switch v := v.(*BasicUnion); i { case 0: return &v.state case 1: @@ -2145,7 +2367,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExampleMessageChild); i { + switch v := v.(*ExampleUnion); i { case 0: return &v.state case 1: @@ -2157,7 +2379,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExampleMessageKey); i { + switch v := v.(*ExampleUnionTwo); i { case 0: return &v.state case 1: @@ -2169,7 +2391,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExampleMessageListMember); i { + switch v := v.(*ExampleUnionUnambiguous); i { case 0: return &v.state case 1: @@ -2181,7 +2403,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NestedListKey); i { + switch v := v.(*ExampleMessageChild); i { case 0: return &v.state case 1: @@ -2193,7 +2415,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NestedListMember); i { + switch v := v.(*ExampleMessageKey); i { case 0: return &v.state case 1: @@ -2205,7 +2427,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExampleMessageMultiKey); i { + switch v := v.(*ExampleMessageListMember); i { case 0: return &v.state case 1: @@ -2217,7 +2439,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MultiKeyListMember); i { + switch v := v.(*NestedListKey); i { case 0: return &v.state case 1: @@ -2229,7 +2451,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InvalidMessage); i { + switch v := v.(*NestedListMember); i { case 0: return &v.state case 1: @@ -2241,7 +2463,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InvalidAnnotationMessage); i { + switch v := v.(*ExampleMessageMultiKey); i { case 0: return &v.state case 1: @@ -2253,7 +2475,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BadMessageKeyTwo); i { + switch v := v.(*MultiKeyListMember); i { case 0: return &v.state case 1: @@ -2265,7 +2487,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BadMessageKey); i { + switch v := v.(*InvalidMessage); i { case 0: return &v.state case 1: @@ -2277,7 +2499,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BadMessageMember); i { + switch v := v.(*InvalidAnnotationMessage); i { case 0: return &v.state case 1: @@ -2289,7 +2511,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BadKeyPathMessage); i { + switch v := v.(*BadMessageKeyTwo); i { case 0: return &v.state case 1: @@ -2301,7 +2523,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InvalidKeyPathKey); i { + switch v := v.(*BadMessageKey); i { case 0: return &v.state case 1: @@ -2313,7 +2535,7 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Root_InterfaceKey); i { + switch v := v.(*BadMessageMember); i { case 0: return &v.state case 1: @@ -2325,6 +2547,42 @@ func file_exschemapath_proto_init() { } } file_exschemapath_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BadKeyPathMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_exschemapath_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvalidKeyPathKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_exschemapath_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Root_InterfaceKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_exschemapath_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Interface_SubinterfaceKey); i { case 0: return &v.state @@ -2347,7 +2605,7 @@ func file_exschemapath_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_exschemapath_proto_rawDesc, NumEnums: 1, - NumMessages: 25, + NumMessages: 28, NumExtensions: 0, NumServices: 0, }, diff --git a/protomap/testdata/exschemapath/exschemapath.proto b/protomap/testdata/exschemapath/exschemapath.proto index 3a2e60fa..b7f4a4a3 100644 --- a/protomap/testdata/exschemapath/exschemapath.proto +++ b/protomap/testdata/exschemapath/exschemapath.proto @@ -57,6 +57,10 @@ message ExampleMessage { repeated ywrapper.Decimal64Value leaflist_decimal64 = 20 [(yext.schemapath) = "/leaflist-decimal64", (yext.leaflist) = true]; repeated ExampleUnion leaflist_union = 15 [(yext.schemapath) = "/leaflist-union", (yext.leaflistunion) = true]; ExampleNestedMessage nested = 21 [(yext.schemapath) = "/nested"]; + // TODO(robjs): support union fields, this needs a new annotation. + BasicUnion union = 22 [(yext.schemapath) = "/union"]; + repeated ExampleUnionUnambiguous leaflist_union_b = 23 [(yext.schemapath) = "/leaflist-union-b", (yext.leaflistunion) = true]; + repeated ExampleUnionTwo leaflist_union_c = 24 [(yext.schemapath) = "/leaflist-union-c", (yext.leaflistunion) = true]; } message ExampleNestedMessage { @@ -70,6 +74,9 @@ message ExampleNestedGrandchild { ywrapper.StringValue two = 2 [(yext.schemapath) = "/nested/child/two"]; } +message BasicUnion { + string str = 1 [(yext.schemapath) = "/union"]; +} message ExampleUnion { string str = 1 [(yext.schemapath) = "/leaflist-union"]; @@ -77,6 +84,16 @@ message ExampleUnion { ExampleEnum enum = 3 [(yext.schemapath) = "/leaflist-union"]; } +message ExampleUnionTwo { + bool b = 1 [(yext.schemapath) = "/leaflist-union-c"]; + float f = 2 [(yext.schemapath) = "/leaflist-union-c"]; +} + +message ExampleUnionUnambiguous { + uint64 uint = 1 [(yext.schemapath) = "/leaflist-union-b"]; + ExampleEnum enum = 2 [(yext.schemapath) = "/leaflist-union-b"]; +} + enum ExampleEnum { ENUM_UNSET = 0; ENUM_VALONE = 1 [(yext.yang_name) = "VAL_ONE"];