From 2117505b31f99dff2498399f36b6185207a7b375 Mon Sep 17 00:00:00 2001 From: Frederic Branczyk Date: Fri, 24 May 2024 17:01:18 +0200 Subject: [PATCH 1/2] Allow exporting via signed URL This patch deprecates the pprof report type for a more generic export type, which both extends the functionality to allow for more formats to be possible in the future as well as allow either serving the download content inline in the response like the pprof report does, or if Parca is configured this way, then upload the export to object storage and serve a download URL that is a signed URL from object storage. --- gen/proto/go/parca/query/v1alpha1/query.pb.go | 1547 ++++++++++------- .../parca/query/v1alpha1/query_vtproto.pb.go | 653 +++++++ .../parca/query/v1alpha1/query.swagger.json | 79 +- .../parca/share/v1alpha1/share.swagger.json | 5 +- parca.yaml | 10 +- pkg/parca/parca.go | 5 + pkg/query/columnquery.go | 92 + proto/buf.lock | 4 +- proto/parca/query/v1alpha1/query.proto | 51 +- .../client/src/parca/query/v1alpha1/query.ts | 290 ++- .../profile/src/ProfileViewWithData.tsx | 21 +- ui/packages/shared/profile/src/utils.ts | 15 +- ui/packages/shared/utilities/src/index.ts | 7 + 13 files changed, 2156 insertions(+), 623 deletions(-) diff --git a/gen/proto/go/parca/query/v1alpha1/query.pb.go b/gen/proto/go/parca/query/v1alpha1/query.pb.go index 0c4697653cc..fb66f60d4e5 100644 --- a/gen/proto/go/parca/query/v1alpha1/query.pb.go +++ b/gen/proto/go/parca/query/v1alpha1/query.pb.go @@ -7,6 +7,9 @@ package queryv1alpha1 import ( + reflect "reflect" + sync "sync" + v1alpha11 "github.com/parca-dev/parca/gen/proto/go/parca/metastore/v1alpha1" v1alpha1 "github.com/parca-dev/parca/gen/proto/go/parca/profilestore/v1alpha1" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -14,8 +17,6 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( @@ -25,6 +26,55 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// format is the format to offer the data in for the download +type Format int32 + +const ( + // FORMAT_UNSPECIFIED unspecified + Format_FORMAT_UNSPECIFIED Format = 0 + // DOWNLOAD_FORMAT_PPROF pprof format + Format_FORMAT_PPROF Format = 1 +) + +// Enum value maps for Format. +var ( + Format_name = map[int32]string{ + 0: "FORMAT_UNSPECIFIED", + 1: "FORMAT_PPROF", + } + Format_value = map[string]int32{ + "FORMAT_UNSPECIFIED": 0, + "FORMAT_PPROF": 1, + } +) + +func (x Format) Enum() *Format { + p := new(Format) + *p = x + return p +} + +func (x Format) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Format) Descriptor() protoreflect.EnumDescriptor { + return file_parca_query_v1alpha1_query_proto_enumTypes[0].Descriptor() +} + +func (Format) Type() protoreflect.EnumType { + return &file_parca_query_v1alpha1_query_proto_enumTypes[0] +} + +func (x Format) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Format.Descriptor instead. +func (Format) EnumDescriptor() ([]byte, []int) { + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{0} +} + // Mode specifies the type of diff type ProfileDiffSelection_Mode int32 @@ -58,11 +108,11 @@ func (x ProfileDiffSelection_Mode) String() string { } func (ProfileDiffSelection_Mode) Descriptor() protoreflect.EnumDescriptor { - return file_parca_query_v1alpha1_query_proto_enumTypes[0].Descriptor() + return file_parca_query_v1alpha1_query_proto_enumTypes[1].Descriptor() } func (ProfileDiffSelection_Mode) Type() protoreflect.EnumType { - return &file_parca_query_v1alpha1_query_proto_enumTypes[0] + return &file_parca_query_v1alpha1_query_proto_enumTypes[1] } func (x ProfileDiffSelection_Mode) Number() protoreflect.EnumNumber { @@ -111,11 +161,11 @@ func (x QueryRequest_Mode) String() string { } func (QueryRequest_Mode) Descriptor() protoreflect.EnumDescriptor { - return file_parca_query_v1alpha1_query_proto_enumTypes[1].Descriptor() + return file_parca_query_v1alpha1_query_proto_enumTypes[2].Descriptor() } func (QueryRequest_Mode) Type() protoreflect.EnumType { - return &file_parca_query_v1alpha1_query_proto_enumTypes[1] + return &file_parca_query_v1alpha1_query_proto_enumTypes[2] } func (x QueryRequest_Mode) Number() protoreflect.EnumNumber { @@ -136,6 +186,8 @@ const ( // Deprecated: Marked as deprecated in parca/query/v1alpha1/query.proto. QueryRequest_REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED QueryRequest_ReportType = 0 // REPORT_TYPE_PPROF unspecified + // + // Deprecated: Marked as deprecated in parca/query/v1alpha1/query.proto. QueryRequest_REPORT_TYPE_PPROF QueryRequest_ReportType = 1 // REPORT_TYPE_TOP unspecified QueryRequest_REPORT_TYPE_TOP QueryRequest_ReportType = 2 @@ -151,6 +203,8 @@ const ( QueryRequest_REPORT_TYPE_TABLE_ARROW QueryRequest_ReportType = 7 // REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels QueryRequest_REPORT_TYPE_PROFILE_METADATA QueryRequest_ReportType = 8 + // REPORT_TYPE_EXPORT contains the profile as a downloadable file + QueryRequest_REPORT_TYPE_EXPORT QueryRequest_ReportType = 9 ) // Enum value maps for QueryRequest_ReportType. @@ -165,6 +219,7 @@ var ( 6: "REPORT_TYPE_SOURCE", 7: "REPORT_TYPE_TABLE_ARROW", 8: "REPORT_TYPE_PROFILE_METADATA", + 9: "REPORT_TYPE_EXPORT", } QueryRequest_ReportType_value = map[string]int32{ "REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED": 0, @@ -176,6 +231,7 @@ var ( "REPORT_TYPE_SOURCE": 6, "REPORT_TYPE_TABLE_ARROW": 7, "REPORT_TYPE_PROFILE_METADATA": 8, + "REPORT_TYPE_EXPORT": 9, } ) @@ -190,11 +246,11 @@ func (x QueryRequest_ReportType) String() string { } func (QueryRequest_ReportType) Descriptor() protoreflect.EnumDescriptor { - return file_parca_query_v1alpha1_query_proto_enumTypes[2].Descriptor() + return file_parca_query_v1alpha1_query_proto_enumTypes[3].Descriptor() } func (QueryRequest_ReportType) Type() protoreflect.EnumType { - return &file_parca_query_v1alpha1_query_proto_enumTypes[2] + return &file_parca_query_v1alpha1_query_proto_enumTypes[3] } func (x QueryRequest_ReportType) Number() protoreflect.EnumNumber { @@ -986,6 +1042,8 @@ type QueryRequest struct { InvertCallStack *bool `protobuf:"varint,11,opt,name=invert_call_stack,json=invertCallStack,proto3,oneof" json:"invert_call_stack,omitempty"` // a set of filter to apply to the query request Filter []*Filter `protobuf:"bytes,12,rep,name=filter,proto3" json:"filter,omitempty"` + // the format to respond the data in for the export + ExportFormat *Format `protobuf:"varint,13,opt,name=export_format,json=exportFormat,proto3,enum=parca.query.v1alpha1.Format,oneof" json:"export_format,omitempty"` } func (x *QueryRequest) Reset() { @@ -1112,6 +1170,13 @@ func (x *QueryRequest) GetFilter() []*Filter { return nil } +func (x *QueryRequest) GetExportFormat() Format { + if x != nil && x.ExportFormat != nil { + return *x.ExportFormat + } + return Format_FORMAT_UNSPECIFIED +} + type isQueryRequest_Options interface { isQueryRequest_Options() } @@ -2723,6 +2788,7 @@ type QueryResponse struct { // *QueryResponse_Source // *QueryResponse_TableArrow // *QueryResponse_ProfileMetadata + // *QueryResponse_Export Report isQueryResponse_Report `protobuf_oneof:"report"` // total is the total number of samples shown in the report. Total int64 `protobuf:"varint,9,opt,name=total,proto3" json:"total,omitempty"` @@ -2825,6 +2891,13 @@ func (x *QueryResponse) GetProfileMetadata() *ProfileMetadata { return nil } +func (x *QueryResponse) GetExport() *Export { + if x, ok := x.GetReport().(*QueryResponse_Export); ok { + return x.Export + } + return nil +} + func (x *QueryResponse) GetTotal() int64 { if x != nil { return x.Total @@ -2883,6 +2956,11 @@ type QueryResponse_ProfileMetadata struct { ProfileMetadata *ProfileMetadata `protobuf:"bytes,14,opt,name=profile_metadata,json=profileMetadata,proto3,oneof"` } +type QueryResponse_Export struct { + // export is the response for an export request. + Export *Export `protobuf:"bytes,15,opt,name=export,proto3,oneof"` +} + func (*QueryResponse_Flamegraph) isQueryResponse_Report() {} func (*QueryResponse_Pprof) isQueryResponse_Report() {} @@ -2899,6 +2977,205 @@ func (*QueryResponse_TableArrow) isQueryResponse_Report() {} func (*QueryResponse_ProfileMetadata) isQueryResponse_Report() {} +func (*QueryResponse_Export) isQueryResponse_Report() {} + +// Export is the response for an export request. +type Export struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The format of the download. + Format Format `protobuf:"varint,1,opt,name=format,proto3,enum=parca.query.v1alpha1.Format" json:"format,omitempty"` + // The type of download. + // + // Types that are assignable to Content: + // + // *Export_Inline + // *Export_Url + Content isExport_Content `protobuf_oneof:"content"` +} + +func (x *Export) Reset() { + *x = Export{} + if protoimpl.UnsafeEnabled { + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Export) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Export) ProtoMessage() {} + +func (x *Export) ProtoReflect() protoreflect.Message { + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Export.ProtoReflect.Descriptor instead. +func (*Export) Descriptor() ([]byte, []int) { + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{34} +} + +func (x *Export) GetFormat() Format { + if x != nil { + return x.Format + } + return Format_FORMAT_UNSPECIFIED +} + +func (m *Export) GetContent() isExport_Content { + if m != nil { + return m.Content + } + return nil +} + +func (x *Export) GetInline() *InlineExport { + if x, ok := x.GetContent().(*Export_Inline); ok { + return x.Inline + } + return nil +} + +func (x *Export) GetUrl() *URLExport { + if x, ok := x.GetContent().(*Export_Url); ok { + return x.Url + } + return nil +} + +type isExport_Content interface { + isExport_Content() +} + +type Export_Inline struct { + // InlineExport is the response for an export request where actual content + // is inlined in the response. + Inline *InlineExport `protobuf:"bytes,2,opt,name=inline,proto3,oneof"` +} + +type Export_Url struct { + // URL is the response for an export request where actual content + // is to be downloaded from the provided URL. + Url *URLExport `protobuf:"bytes,3,opt,name=url,proto3,oneof"` +} + +func (*Export_Inline) isExport_Content() {} + +func (*Export_Url) isExport_Content() {} + +// URLExport is the response for an export request where actual content is +// to be downloaded from the provided URL. +type URLExport struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The URL to download the content from. + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *URLExport) Reset() { + *x = URLExport{} + if protoimpl.UnsafeEnabled { + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *URLExport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*URLExport) ProtoMessage() {} + +func (x *URLExport) ProtoReflect() protoreflect.Message { + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[35] + 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 URLExport.ProtoReflect.Descriptor instead. +func (*URLExport) Descriptor() ([]byte, []int) { + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{35} +} + +func (x *URLExport) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +// InlineExport is the response for an export request where actual content is +// inlined in the response. +type InlineExport struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Content of the export. + Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *InlineExport) Reset() { + *x = InlineExport{} + if protoimpl.UnsafeEnabled { + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InlineExport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InlineExport) ProtoMessage() {} + +func (x *InlineExport) ProtoReflect() protoreflect.Message { + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[36] + 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 InlineExport.ProtoReflect.Descriptor instead. +func (*InlineExport) Descriptor() ([]byte, []int) { + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{36} +} + +func (x *InlineExport) GetContent() []byte { + if x != nil { + return x.Content + } + return nil +} + // SeriesRequest is unimplemented type SeriesRequest struct { state protoimpl.MessageState @@ -2916,7 +3193,7 @@ type SeriesRequest struct { func (x *SeriesRequest) Reset() { *x = SeriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[34] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2929,7 +3206,7 @@ func (x *SeriesRequest) String() string { func (*SeriesRequest) ProtoMessage() {} func (x *SeriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[34] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2942,7 +3219,7 @@ func (x *SeriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SeriesRequest.ProtoReflect.Descriptor instead. func (*SeriesRequest) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{34} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{37} } func (x *SeriesRequest) GetMatch() []string { @@ -2976,7 +3253,7 @@ type SeriesResponse struct { func (x *SeriesResponse) Reset() { *x = SeriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[35] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2989,7 +3266,7 @@ func (x *SeriesResponse) String() string { func (*SeriesResponse) ProtoMessage() {} func (x *SeriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[35] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3002,7 +3279,7 @@ func (x *SeriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SeriesResponse.ProtoReflect.Descriptor instead. func (*SeriesResponse) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{35} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{38} } // LabelsRequest are the request values for labels @@ -3022,7 +3299,7 @@ type LabelsRequest struct { func (x *LabelsRequest) Reset() { *x = LabelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[36] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3035,7 +3312,7 @@ func (x *LabelsRequest) String() string { func (*LabelsRequest) ProtoMessage() {} func (x *LabelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[36] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3048,7 +3325,7 @@ func (x *LabelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LabelsRequest.ProtoReflect.Descriptor instead. func (*LabelsRequest) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{36} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{39} } func (x *LabelsRequest) GetMatch() []string { @@ -3087,7 +3364,7 @@ type LabelsResponse struct { func (x *LabelsResponse) Reset() { *x = LabelsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[37] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3100,7 +3377,7 @@ func (x *LabelsResponse) String() string { func (*LabelsResponse) ProtoMessage() {} func (x *LabelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[37] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3113,7 +3390,7 @@ func (x *LabelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LabelsResponse.ProtoReflect.Descriptor instead. func (*LabelsResponse) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{37} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{40} } func (x *LabelsResponse) GetLabelNames() []string { @@ -3149,7 +3426,7 @@ type ValuesRequest struct { func (x *ValuesRequest) Reset() { *x = ValuesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[38] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3162,7 +3439,7 @@ func (x *ValuesRequest) String() string { func (*ValuesRequest) ProtoMessage() {} func (x *ValuesRequest) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[38] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3175,7 +3452,7 @@ func (x *ValuesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValuesRequest.ProtoReflect.Descriptor instead. func (*ValuesRequest) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{38} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{41} } func (x *ValuesRequest) GetLabelName() string { @@ -3221,7 +3498,7 @@ type ValuesResponse struct { func (x *ValuesResponse) Reset() { *x = ValuesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[39] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3234,7 +3511,7 @@ func (x *ValuesResponse) String() string { func (*ValuesResponse) ProtoMessage() {} func (x *ValuesResponse) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[39] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3247,7 +3524,7 @@ func (x *ValuesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValuesResponse.ProtoReflect.Descriptor instead. func (*ValuesResponse) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{39} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{42} } func (x *ValuesResponse) GetLabelValues() []string { @@ -3279,7 +3556,7 @@ type ValueType struct { func (x *ValueType) Reset() { *x = ValueType{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[40] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3292,7 +3569,7 @@ func (x *ValueType) String() string { func (*ValueType) ProtoMessage() {} func (x *ValueType) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[40] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3305,7 +3582,7 @@ func (x *ValueType) ProtoReflect() protoreflect.Message { // Deprecated: Use ValueType.ProtoReflect.Descriptor instead. func (*ValueType) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{40} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{43} } func (x *ValueType) GetType() string { @@ -3337,7 +3614,7 @@ type ShareProfileRequest struct { func (x *ShareProfileRequest) Reset() { *x = ShareProfileRequest{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[41] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3350,7 +3627,7 @@ func (x *ShareProfileRequest) String() string { func (*ShareProfileRequest) ProtoMessage() {} func (x *ShareProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[41] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3363,7 +3640,7 @@ func (x *ShareProfileRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShareProfileRequest.ProtoReflect.Descriptor instead. func (*ShareProfileRequest) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{41} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{44} } func (x *ShareProfileRequest) GetQueryRequest() *QueryRequest { @@ -3393,7 +3670,7 @@ type ShareProfileResponse struct { func (x *ShareProfileResponse) Reset() { *x = ShareProfileResponse{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[42] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3406,7 +3683,7 @@ func (x *ShareProfileResponse) String() string { func (*ShareProfileResponse) ProtoMessage() {} func (x *ShareProfileResponse) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[42] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3419,7 +3696,7 @@ func (x *ShareProfileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ShareProfileResponse.ProtoReflect.Descriptor instead. func (*ShareProfileResponse) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{42} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{45} } func (x *ShareProfileResponse) GetLink() string { @@ -3444,7 +3721,7 @@ type TableArrow struct { func (x *TableArrow) Reset() { *x = TableArrow{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[43] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3457,7 +3734,7 @@ func (x *TableArrow) String() string { func (*TableArrow) ProtoMessage() {} func (x *TableArrow) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[43] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3470,7 +3747,7 @@ func (x *TableArrow) ProtoReflect() protoreflect.Message { // Deprecated: Use TableArrow.ProtoReflect.Descriptor instead. func (*TableArrow) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{43} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{46} } func (x *TableArrow) GetRecord() []byte { @@ -3502,7 +3779,7 @@ type ProfileMetadata struct { func (x *ProfileMetadata) Reset() { *x = ProfileMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[44] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3515,7 +3792,7 @@ func (x *ProfileMetadata) String() string { func (*ProfileMetadata) ProtoMessage() {} func (x *ProfileMetadata) ProtoReflect() protoreflect.Message { - mi := &file_parca_query_v1alpha1_query_proto_msgTypes[44] + mi := &file_parca_query_v1alpha1_query_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3528,7 +3805,7 @@ func (x *ProfileMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileMetadata.ProtoReflect.Descriptor instead. func (*ProfileMetadata) Descriptor() ([]byte, []int) { - return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{44} + return file_parca_query_v1alpha1_query_proto_rawDescGZIP(), []int{47} } func (x *ProfileMetadata) GetMappingFiles() []string { @@ -3667,7 +3944,7 @@ var file_parca_query_v1alpha1_query_proto_rawDesc = []byte{ 0x0a, 0x17, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x10, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xde, 0x09, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd4, 0x0a, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, @@ -3715,286 +3992,323 @@ var file_parca_query_v1alpha1_query_proto_rawDesc = []byte{ 0x01, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x1b, 0x0a, 0x17, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, - 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x10, 0x02, 0x22, 0x9a, 0x02, 0x0a, 0x0a, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x22, 0x52, 0x45, - 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x4d, 0x45, 0x47, - 0x52, 0x41, 0x50, 0x48, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x50, 0x52, 0x4f, 0x46, 0x10, 0x01, 0x12, 0x13, 0x0a, - 0x0f, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x4f, 0x50, - 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x47, 0x52, 0x41, 0x50, 0x48, 0x10, 0x03, 0x12, 0x20, 0x0a, - 0x1c, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x41, - 0x4d, 0x45, 0x47, 0x52, 0x41, 0x50, 0x48, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, - 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, - 0x4c, 0x41, 0x4d, 0x45, 0x47, 0x52, 0x41, 0x50, 0x48, 0x5f, 0x41, 0x52, 0x52, 0x4f, 0x57, 0x10, - 0x05, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x41, - 0x52, 0x52, 0x4f, 0x57, 0x10, 0x07, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x4d, 0x45, - 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x10, 0x08, 0x42, 0x09, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x72, - 0x69, 0x6d, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x11, - 0x0a, 0x0f, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x22, 0xa2, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, + 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x48, 0x07, 0x52, 0x0c, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x88, 0x01, 0x01, 0x22, + 0x42, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x4f, 0x44, 0x45, 0x5f, + 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x49, 0x46, + 0x46, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x45, 0x52, 0x47, + 0x45, 0x10, 0x02, 0x22, 0xb6, 0x02, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x22, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x4d, 0x45, 0x47, 0x52, 0x41, 0x50, 0x48, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x19, + 0x0a, 0x11, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x50, + 0x52, 0x4f, 0x46, 0x10, 0x01, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x50, + 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x19, + 0x0a, 0x15, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, + 0x4c, 0x4c, 0x47, 0x52, 0x41, 0x50, 0x48, 0x10, 0x03, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x50, + 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x4d, 0x45, 0x47, 0x52, + 0x41, 0x50, 0x48, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x52, + 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x41, 0x4d, 0x45, + 0x47, 0x52, 0x41, 0x50, 0x48, 0x5f, 0x41, 0x52, 0x52, 0x4f, 0x57, 0x10, 0x05, 0x12, 0x16, 0x0a, + 0x12, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x41, 0x52, 0x52, 0x4f, 0x57, + 0x10, 0x07, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, + 0x54, 0x41, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x10, 0x09, 0x42, 0x09, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x74, 0x72, 0x69, 0x6d, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x42, 0x13, 0x0a, + 0x11, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xa2, 0x01, + 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x46, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x22, 0x85, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x12, 0x6c, 0x0a, 0x1a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x17, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x47, 0x0a, 0x17, 0x46, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0x72, 0x0a, 0x0b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x12, 0x59, 0x0a, 0x13, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x11, 0x62, 0x69, 0x6e, 0x61, + 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, 0x0a, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x0a, 0x11, 0x42, 0x69, 0x6e, 0x61, 0x72, + 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, + 0x69, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x6f, + 0x77, 0x5f, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x73, 0x68, 0x6f, 0x77, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, + 0x6f, 0x77, 0x5f, 0x72, 0x75, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, + 0x68, 0x6f, 0x77, 0x52, 0x75, 0x62, 0x79, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x68, 0x6f, 0x77, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x69, 0x0a, 0x0f, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x21, 0x0a, 0x07, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x03, 0x54, 0x6f, + 0x70, 0x12, 0x31, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x12, 0x18, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, + 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x88, + 0x01, 0x0a, 0x07, 0x54, 0x6f, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x65, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0c, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x85, 0x01, 0x0a, - 0x0b, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x6c, 0x0a, 0x1a, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x17, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x22, 0x47, 0x0a, 0x17, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, - 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x72, 0x0a, - 0x0b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x13, - 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x61, 0x72, 0x63, - 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x11, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x22, 0x3e, 0x0a, 0x11, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x70, 0x79, 0x74, 0x68, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x68, 0x6f, 0x77, 0x50, 0x79, - 0x74, 0x68, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x72, 0x75, 0x62, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x77, 0x52, 0x75, 0x62, - 0x79, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, - 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x73, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, - 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x69, 0x0a, 0x0f, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x6e, 0x6c, 0x79, - 0x22, 0x21, 0x0a, 0x07, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x03, 0x54, 0x6f, 0x70, 0x12, 0x31, 0x0a, 0x04, 0x6c, - 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x61, 0x72, 0x63, - 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x54, 0x6f, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x05, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x07, 0x54, 0x6f, 0x70, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x4e, 0x6f, 0x64, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, - 0x6c, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, - 0x69, 0x66, 0x66, 0x22, 0xfe, 0x01, 0x0a, 0x0b, 0x54, 0x6f, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, - 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, - 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x12, 0x3e, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, - 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x12, 0x3c, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6f, - 0x74, 0x12, 0x18, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x07, - 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a, 0x08, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, + 0x54, 0x6f, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x04, 0x66, 0x6c, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0xfe, 0x01, 0x0a, 0x0b, 0x54, 0x6f, + 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x0f, 0x75, 0x6e, 0x74, - 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, - 0x22, 0x6f, 0x0a, 0x0f, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x41, 0x72, - 0x72, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x6d, 0x6d, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, - 0x64, 0x22, 0x4c, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, - 0x8a, 0x01, 0x0a, 0x12, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x52, 0x6f, - 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x12, 0x40, 0x0a, 0x08, 0x63, 0x68, - 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, - 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0xc4, 0x01, 0x0a, - 0x0e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x3c, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, - 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x69, 0x66, - 0x66, 0x12, 0x40, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, + 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0xb9, 0x03, 0x0a, 0x0a, 0x46, + 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x3c, 0x0a, 0x04, 0x72, 0x6f, 0x6f, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, + 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x40, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, + 0x3e, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2b, 0x0a, 0x0f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x75, 0x6e, + 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, + 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x22, 0x6f, 0x0a, 0x0f, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, + 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x22, 0x4c, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x8a, 0x01, 0x0a, 0x12, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x69, 0x66, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, + 0x12, 0x40, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, - 0x72, 0x65, 0x6e, 0x22, 0xcb, 0x02, 0x0a, 0x12, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, - 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, + 0x65, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x12, 0x40, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x61, 0x72, 0x63, + 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0xcb, 0x02, 0x0a, 0x12, 0x46, 0x6c, + 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a, + 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, + 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x07, - 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, - 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, - 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x90, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, - 0x66, 0x6c, 0x61, 0x74, 0x22, 0x84, 0x02, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, - 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x69, + 0x6e, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x90, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x74, 0x22, 0x84, 0x02, 0x0a, 0x11, 0x43, + 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x3e, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3b, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a, + 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, + 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x07, - 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, - 0x61, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x6d, 0x65, - 0x74, 0x61, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x0d, - 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, - 0x22, 0xa5, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x39, - 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, - 0x64, 0x67, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x63, 0x75, - 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0xbc, 0x04, 0x0a, 0x0d, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x66, 0x6c, - 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, + 0x65, 0x22, 0x92, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x45, + 0x64, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, + 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x43, 0x6f, 0x6c, + 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x22, 0xa5, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x6c, 0x6c, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x12, 0x39, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, + 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x48, 0x00, 0x52, 0x0a, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x16, - 0x0a, 0x05, 0x70, 0x70, 0x72, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, - 0x05, 0x70, 0x70, 0x72, 0x6f, 0x66, 0x12, 0x2d, 0x0a, 0x03, 0x74, 0x6f, 0x70, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x48, 0x00, - 0x52, 0x03, 0x74, 0x6f, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, - 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x52, 0x0a, 0x10, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x5f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x0f, 0x66, 0x6c, 0x61, 0x6d, 0x65, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x61, 0x72, - 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x72, 0x6f, - 0x77, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x12, 0x52, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x42, 0x08, 0x0a, - 0x06, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x75, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x0a, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0xf4, + 0x04, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x42, 0x0a, 0x0a, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, 0x61, 0x6d, + 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x12, 0x16, 0x0a, 0x05, 0x70, 0x70, 0x72, 0x6f, 0x66, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x70, 0x70, 0x72, 0x6f, 0x66, 0x12, 0x2d, 0x0a, 0x03, + 0x74, 0x6f, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x61, 0x72, 0x63, + 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x54, 0x6f, 0x70, 0x48, 0x00, 0x52, 0x03, 0x74, 0x6f, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x63, + 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x48, + 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x12, 0x52, 0x0a, 0x10, + 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x61, 0x72, 0x72, 0x6f, 0x77, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6c, + 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x48, 0x00, 0x52, + 0x0f, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x41, 0x72, 0x72, 0x6f, 0x77, + 0x12, 0x36, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, + 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x48, + 0x00, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x12, 0x52, 0x0a, + 0x10, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, + 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x36, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x48, + 0x00, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x06, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x12, 0x34, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1c, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x3c, 0x0a, 0x06, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x06, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x33, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x52, 0x4c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x48, 0x00, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x1d, 0x0a, 0x09, 0x55, 0x52, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0x28, 0x0a, 0x0c, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x85, 0x01, + 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, @@ -4002,130 +4316,123 @@ var file_parca_query_v1alpha1_query_proto_rawDesc = []byte{ 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, - 0x10, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, - 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4d, 0x0a, 0x0e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, - 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, - 0x4f, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x33, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, - 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, - 0x14, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x38, 0x0a, 0x0a, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x6e, 0x69, 0x74, 0x22, 0x4e, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x32, 0xdf, 0x06, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x27, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x61, + 0x4d, 0x0a, 0x0e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xa4, + 0x01, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4f, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x33, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x13, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x61, 0x72, + 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0c, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x14, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, + 0x38, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x72, 0x6f, 0x77, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x4e, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, + 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2a, 0x32, 0x0a, 0x06, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x50, 0x50, 0x52, 0x4f, 0x46, 0x10, 0x01, 0x32, 0xdf, 0x06, + 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7e, + 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x27, 0x2e, 0x70, + 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x69, + 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x69, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, - 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x6d, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, - 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x7e, - 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x29, - 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x61, 0x72, 0x63, - 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6d, - 0x0a, 0x06, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, + 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x6d, 0x0a, 0x06, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x81, 0x01, - 0x0a, 0x06, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0c, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x42, 0xe4, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x61, - 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, - 0x63, 0x61, 0x2d, 0x64, 0x65, 0x76, 0x2f, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2f, 0x67, 0x65, 0x6e, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2f, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, - 0x51, 0x58, 0xaa, 0x02, 0x14, 0x50, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x14, 0x50, 0x61, 0x72, 0x63, - 0x61, 0x5c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0xe2, 0x02, 0x20, 0x50, 0x61, 0x72, 0x63, 0x61, 0x5c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x5c, 0x56, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, 0x50, 0x61, 0x72, 0x63, 0x61, 0x3a, 0x3a, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x06, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x06, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0c, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x29, 0x2e, 0x70, + 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x3a, 0x01, 0x2a, 0x22, 0x0f, + 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x42, + 0xe4, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0a, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2d, 0x64, 0x65, 0x76, + 0x2f, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x61, 0x72, 0x63, 0x61, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x51, 0x58, 0xaa, 0x02, 0x14, 0x50, + 0x61, 0x72, 0x63, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0xca, 0x02, 0x14, 0x50, 0x61, 0x72, 0x63, 0x61, 0x5c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x20, 0x50, 0x61, 0x72, + 0x63, 0x61, 0x5c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, + 0x50, 0x61, 0x72, 0x63, 0x61, 0x3a, 0x3a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x3a, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4140,154 +4447,163 @@ func file_parca_query_v1alpha1_query_proto_rawDescGZIP() []byte { return file_parca_query_v1alpha1_query_proto_rawDescData } -var file_parca_query_v1alpha1_query_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_parca_query_v1alpha1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 45) +var file_parca_query_v1alpha1_query_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_parca_query_v1alpha1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 48) var file_parca_query_v1alpha1_query_proto_goTypes = []interface{}{ - (ProfileDiffSelection_Mode)(0), // 0: parca.query.v1alpha1.ProfileDiffSelection.Mode - (QueryRequest_Mode)(0), // 1: parca.query.v1alpha1.QueryRequest.Mode - (QueryRequest_ReportType)(0), // 2: parca.query.v1alpha1.QueryRequest.ReportType - (*ProfileTypesRequest)(nil), // 3: parca.query.v1alpha1.ProfileTypesRequest - (*ProfileTypesResponse)(nil), // 4: parca.query.v1alpha1.ProfileTypesResponse - (*ProfileType)(nil), // 5: parca.query.v1alpha1.ProfileType - (*QueryRangeRequest)(nil), // 6: parca.query.v1alpha1.QueryRangeRequest - (*QueryRangeResponse)(nil), // 7: parca.query.v1alpha1.QueryRangeResponse - (*MetricsSeries)(nil), // 8: parca.query.v1alpha1.MetricsSeries - (*MetricsSample)(nil), // 9: parca.query.v1alpha1.MetricsSample - (*MergeProfile)(nil), // 10: parca.query.v1alpha1.MergeProfile - (*SingleProfile)(nil), // 11: parca.query.v1alpha1.SingleProfile - (*DiffProfile)(nil), // 12: parca.query.v1alpha1.DiffProfile - (*ProfileDiffSelection)(nil), // 13: parca.query.v1alpha1.ProfileDiffSelection - (*QueryRequest)(nil), // 14: parca.query.v1alpha1.QueryRequest - (*Filter)(nil), // 15: parca.query.v1alpha1.Filter - (*StackFilter)(nil), // 16: parca.query.v1alpha1.StackFilter - (*FunctionNameStackFilter)(nil), // 17: parca.query.v1alpha1.FunctionNameStackFilter - (*FrameFilter)(nil), // 18: parca.query.v1alpha1.FrameFilter - (*BinaryFrameFilter)(nil), // 19: parca.query.v1alpha1.BinaryFrameFilter - (*RuntimeFilter)(nil), // 20: parca.query.v1alpha1.RuntimeFilter - (*SourceReference)(nil), // 21: parca.query.v1alpha1.SourceReference - (*GroupBy)(nil), // 22: parca.query.v1alpha1.GroupBy - (*Top)(nil), // 23: parca.query.v1alpha1.Top - (*TopNode)(nil), // 24: parca.query.v1alpha1.TopNode - (*TopNodeMeta)(nil), // 25: parca.query.v1alpha1.TopNodeMeta - (*Flamegraph)(nil), // 26: parca.query.v1alpha1.Flamegraph - (*FlamegraphArrow)(nil), // 27: parca.query.v1alpha1.FlamegraphArrow - (*Source)(nil), // 28: parca.query.v1alpha1.Source - (*FlamegraphRootNode)(nil), // 29: parca.query.v1alpha1.FlamegraphRootNode - (*FlamegraphNode)(nil), // 30: parca.query.v1alpha1.FlamegraphNode - (*FlamegraphNodeMeta)(nil), // 31: parca.query.v1alpha1.FlamegraphNodeMeta - (*CallgraphNode)(nil), // 32: parca.query.v1alpha1.CallgraphNode - (*CallgraphNodeMeta)(nil), // 33: parca.query.v1alpha1.CallgraphNodeMeta - (*CallgraphEdge)(nil), // 34: parca.query.v1alpha1.CallgraphEdge - (*Callgraph)(nil), // 35: parca.query.v1alpha1.Callgraph - (*QueryResponse)(nil), // 36: parca.query.v1alpha1.QueryResponse - (*SeriesRequest)(nil), // 37: parca.query.v1alpha1.SeriesRequest - (*SeriesResponse)(nil), // 38: parca.query.v1alpha1.SeriesResponse - (*LabelsRequest)(nil), // 39: parca.query.v1alpha1.LabelsRequest - (*LabelsResponse)(nil), // 40: parca.query.v1alpha1.LabelsResponse - (*ValuesRequest)(nil), // 41: parca.query.v1alpha1.ValuesRequest - (*ValuesResponse)(nil), // 42: parca.query.v1alpha1.ValuesResponse - (*ValueType)(nil), // 43: parca.query.v1alpha1.ValueType - (*ShareProfileRequest)(nil), // 44: parca.query.v1alpha1.ShareProfileRequest - (*ShareProfileResponse)(nil), // 45: parca.query.v1alpha1.ShareProfileResponse - (*TableArrow)(nil), // 46: parca.query.v1alpha1.TableArrow - (*ProfileMetadata)(nil), // 47: parca.query.v1alpha1.ProfileMetadata - (*timestamppb.Timestamp)(nil), // 48: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 49: google.protobuf.Duration - (*v1alpha1.LabelSet)(nil), // 50: parca.profilestore.v1alpha1.LabelSet - (*v1alpha11.Location)(nil), // 51: parca.metastore.v1alpha1.Location - (*v1alpha11.Mapping)(nil), // 52: parca.metastore.v1alpha1.Mapping - (*v1alpha11.Function)(nil), // 53: parca.metastore.v1alpha1.Function - (*v1alpha11.Line)(nil), // 54: parca.metastore.v1alpha1.Line + (Format)(0), // 0: parca.query.v1alpha1.Format + (ProfileDiffSelection_Mode)(0), // 1: parca.query.v1alpha1.ProfileDiffSelection.Mode + (QueryRequest_Mode)(0), // 2: parca.query.v1alpha1.QueryRequest.Mode + (QueryRequest_ReportType)(0), // 3: parca.query.v1alpha1.QueryRequest.ReportType + (*ProfileTypesRequest)(nil), // 4: parca.query.v1alpha1.ProfileTypesRequest + (*ProfileTypesResponse)(nil), // 5: parca.query.v1alpha1.ProfileTypesResponse + (*ProfileType)(nil), // 6: parca.query.v1alpha1.ProfileType + (*QueryRangeRequest)(nil), // 7: parca.query.v1alpha1.QueryRangeRequest + (*QueryRangeResponse)(nil), // 8: parca.query.v1alpha1.QueryRangeResponse + (*MetricsSeries)(nil), // 9: parca.query.v1alpha1.MetricsSeries + (*MetricsSample)(nil), // 10: parca.query.v1alpha1.MetricsSample + (*MergeProfile)(nil), // 11: parca.query.v1alpha1.MergeProfile + (*SingleProfile)(nil), // 12: parca.query.v1alpha1.SingleProfile + (*DiffProfile)(nil), // 13: parca.query.v1alpha1.DiffProfile + (*ProfileDiffSelection)(nil), // 14: parca.query.v1alpha1.ProfileDiffSelection + (*QueryRequest)(nil), // 15: parca.query.v1alpha1.QueryRequest + (*Filter)(nil), // 16: parca.query.v1alpha1.Filter + (*StackFilter)(nil), // 17: parca.query.v1alpha1.StackFilter + (*FunctionNameStackFilter)(nil), // 18: parca.query.v1alpha1.FunctionNameStackFilter + (*FrameFilter)(nil), // 19: parca.query.v1alpha1.FrameFilter + (*BinaryFrameFilter)(nil), // 20: parca.query.v1alpha1.BinaryFrameFilter + (*RuntimeFilter)(nil), // 21: parca.query.v1alpha1.RuntimeFilter + (*SourceReference)(nil), // 22: parca.query.v1alpha1.SourceReference + (*GroupBy)(nil), // 23: parca.query.v1alpha1.GroupBy + (*Top)(nil), // 24: parca.query.v1alpha1.Top + (*TopNode)(nil), // 25: parca.query.v1alpha1.TopNode + (*TopNodeMeta)(nil), // 26: parca.query.v1alpha1.TopNodeMeta + (*Flamegraph)(nil), // 27: parca.query.v1alpha1.Flamegraph + (*FlamegraphArrow)(nil), // 28: parca.query.v1alpha1.FlamegraphArrow + (*Source)(nil), // 29: parca.query.v1alpha1.Source + (*FlamegraphRootNode)(nil), // 30: parca.query.v1alpha1.FlamegraphRootNode + (*FlamegraphNode)(nil), // 31: parca.query.v1alpha1.FlamegraphNode + (*FlamegraphNodeMeta)(nil), // 32: parca.query.v1alpha1.FlamegraphNodeMeta + (*CallgraphNode)(nil), // 33: parca.query.v1alpha1.CallgraphNode + (*CallgraphNodeMeta)(nil), // 34: parca.query.v1alpha1.CallgraphNodeMeta + (*CallgraphEdge)(nil), // 35: parca.query.v1alpha1.CallgraphEdge + (*Callgraph)(nil), // 36: parca.query.v1alpha1.Callgraph + (*QueryResponse)(nil), // 37: parca.query.v1alpha1.QueryResponse + (*Export)(nil), // 38: parca.query.v1alpha1.Export + (*URLExport)(nil), // 39: parca.query.v1alpha1.URLExport + (*InlineExport)(nil), // 40: parca.query.v1alpha1.InlineExport + (*SeriesRequest)(nil), // 41: parca.query.v1alpha1.SeriesRequest + (*SeriesResponse)(nil), // 42: parca.query.v1alpha1.SeriesResponse + (*LabelsRequest)(nil), // 43: parca.query.v1alpha1.LabelsRequest + (*LabelsResponse)(nil), // 44: parca.query.v1alpha1.LabelsResponse + (*ValuesRequest)(nil), // 45: parca.query.v1alpha1.ValuesRequest + (*ValuesResponse)(nil), // 46: parca.query.v1alpha1.ValuesResponse + (*ValueType)(nil), // 47: parca.query.v1alpha1.ValueType + (*ShareProfileRequest)(nil), // 48: parca.query.v1alpha1.ShareProfileRequest + (*ShareProfileResponse)(nil), // 49: parca.query.v1alpha1.ShareProfileResponse + (*TableArrow)(nil), // 50: parca.query.v1alpha1.TableArrow + (*ProfileMetadata)(nil), // 51: parca.query.v1alpha1.ProfileMetadata + (*timestamppb.Timestamp)(nil), // 52: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 53: google.protobuf.Duration + (*v1alpha1.LabelSet)(nil), // 54: parca.profilestore.v1alpha1.LabelSet + (*v1alpha11.Location)(nil), // 55: parca.metastore.v1alpha1.Location + (*v1alpha11.Mapping)(nil), // 56: parca.metastore.v1alpha1.Mapping + (*v1alpha11.Function)(nil), // 57: parca.metastore.v1alpha1.Function + (*v1alpha11.Line)(nil), // 58: parca.metastore.v1alpha1.Line } var file_parca_query_v1alpha1_query_proto_depIdxs = []int32{ - 5, // 0: parca.query.v1alpha1.ProfileTypesResponse.types:type_name -> parca.query.v1alpha1.ProfileType - 48, // 1: parca.query.v1alpha1.QueryRangeRequest.start:type_name -> google.protobuf.Timestamp - 48, // 2: parca.query.v1alpha1.QueryRangeRequest.end:type_name -> google.protobuf.Timestamp - 49, // 3: parca.query.v1alpha1.QueryRangeRequest.step:type_name -> google.protobuf.Duration - 8, // 4: parca.query.v1alpha1.QueryRangeResponse.series:type_name -> parca.query.v1alpha1.MetricsSeries - 50, // 5: parca.query.v1alpha1.MetricsSeries.labelset:type_name -> parca.profilestore.v1alpha1.LabelSet - 9, // 6: parca.query.v1alpha1.MetricsSeries.samples:type_name -> parca.query.v1alpha1.MetricsSample - 43, // 7: parca.query.v1alpha1.MetricsSeries.period_type:type_name -> parca.query.v1alpha1.ValueType - 43, // 8: parca.query.v1alpha1.MetricsSeries.sample_type:type_name -> parca.query.v1alpha1.ValueType - 48, // 9: parca.query.v1alpha1.MetricsSample.timestamp:type_name -> google.protobuf.Timestamp - 48, // 10: parca.query.v1alpha1.MergeProfile.start:type_name -> google.protobuf.Timestamp - 48, // 11: parca.query.v1alpha1.MergeProfile.end:type_name -> google.protobuf.Timestamp - 48, // 12: parca.query.v1alpha1.SingleProfile.time:type_name -> google.protobuf.Timestamp - 13, // 13: parca.query.v1alpha1.DiffProfile.a:type_name -> parca.query.v1alpha1.ProfileDiffSelection - 13, // 14: parca.query.v1alpha1.DiffProfile.b:type_name -> parca.query.v1alpha1.ProfileDiffSelection - 0, // 15: parca.query.v1alpha1.ProfileDiffSelection.mode:type_name -> parca.query.v1alpha1.ProfileDiffSelection.Mode - 10, // 16: parca.query.v1alpha1.ProfileDiffSelection.merge:type_name -> parca.query.v1alpha1.MergeProfile - 11, // 17: parca.query.v1alpha1.ProfileDiffSelection.single:type_name -> parca.query.v1alpha1.SingleProfile - 1, // 18: parca.query.v1alpha1.QueryRequest.mode:type_name -> parca.query.v1alpha1.QueryRequest.Mode - 12, // 19: parca.query.v1alpha1.QueryRequest.diff:type_name -> parca.query.v1alpha1.DiffProfile - 10, // 20: parca.query.v1alpha1.QueryRequest.merge:type_name -> parca.query.v1alpha1.MergeProfile - 11, // 21: parca.query.v1alpha1.QueryRequest.single:type_name -> parca.query.v1alpha1.SingleProfile - 2, // 22: parca.query.v1alpha1.QueryRequest.report_type:type_name -> parca.query.v1alpha1.QueryRequest.ReportType - 22, // 23: parca.query.v1alpha1.QueryRequest.group_by:type_name -> parca.query.v1alpha1.GroupBy - 21, // 24: parca.query.v1alpha1.QueryRequest.source_reference:type_name -> parca.query.v1alpha1.SourceReference - 20, // 25: parca.query.v1alpha1.QueryRequest.runtime_filter:type_name -> parca.query.v1alpha1.RuntimeFilter - 15, // 26: parca.query.v1alpha1.QueryRequest.filter:type_name -> parca.query.v1alpha1.Filter - 16, // 27: parca.query.v1alpha1.Filter.stack_filter:type_name -> parca.query.v1alpha1.StackFilter - 18, // 28: parca.query.v1alpha1.Filter.frame_filter:type_name -> parca.query.v1alpha1.FrameFilter - 17, // 29: parca.query.v1alpha1.StackFilter.function_name_stack_filter:type_name -> parca.query.v1alpha1.FunctionNameStackFilter - 19, // 30: parca.query.v1alpha1.FrameFilter.binary_frame_filter:type_name -> parca.query.v1alpha1.BinaryFrameFilter - 24, // 31: parca.query.v1alpha1.Top.list:type_name -> parca.query.v1alpha1.TopNode - 25, // 32: parca.query.v1alpha1.TopNode.meta:type_name -> parca.query.v1alpha1.TopNodeMeta - 51, // 33: parca.query.v1alpha1.TopNodeMeta.location:type_name -> parca.metastore.v1alpha1.Location - 52, // 34: parca.query.v1alpha1.TopNodeMeta.mapping:type_name -> parca.metastore.v1alpha1.Mapping - 53, // 35: parca.query.v1alpha1.TopNodeMeta.function:type_name -> parca.metastore.v1alpha1.Function - 54, // 36: parca.query.v1alpha1.TopNodeMeta.line:type_name -> parca.metastore.v1alpha1.Line - 29, // 37: parca.query.v1alpha1.Flamegraph.root:type_name -> parca.query.v1alpha1.FlamegraphRootNode - 51, // 38: parca.query.v1alpha1.Flamegraph.locations:type_name -> parca.metastore.v1alpha1.Location - 52, // 39: parca.query.v1alpha1.Flamegraph.mapping:type_name -> parca.metastore.v1alpha1.Mapping - 53, // 40: parca.query.v1alpha1.Flamegraph.function:type_name -> parca.metastore.v1alpha1.Function - 30, // 41: parca.query.v1alpha1.FlamegraphRootNode.children:type_name -> parca.query.v1alpha1.FlamegraphNode - 31, // 42: parca.query.v1alpha1.FlamegraphNode.meta:type_name -> parca.query.v1alpha1.FlamegraphNodeMeta - 30, // 43: parca.query.v1alpha1.FlamegraphNode.children:type_name -> parca.query.v1alpha1.FlamegraphNode - 51, // 44: parca.query.v1alpha1.FlamegraphNodeMeta.location:type_name -> parca.metastore.v1alpha1.Location - 52, // 45: parca.query.v1alpha1.FlamegraphNodeMeta.mapping:type_name -> parca.metastore.v1alpha1.Mapping - 53, // 46: parca.query.v1alpha1.FlamegraphNodeMeta.function:type_name -> parca.metastore.v1alpha1.Function - 54, // 47: parca.query.v1alpha1.FlamegraphNodeMeta.line:type_name -> parca.metastore.v1alpha1.Line - 33, // 48: parca.query.v1alpha1.CallgraphNode.meta:type_name -> parca.query.v1alpha1.CallgraphNodeMeta - 51, // 49: parca.query.v1alpha1.CallgraphNodeMeta.location:type_name -> parca.metastore.v1alpha1.Location - 52, // 50: parca.query.v1alpha1.CallgraphNodeMeta.mapping:type_name -> parca.metastore.v1alpha1.Mapping - 53, // 51: parca.query.v1alpha1.CallgraphNodeMeta.function:type_name -> parca.metastore.v1alpha1.Function - 54, // 52: parca.query.v1alpha1.CallgraphNodeMeta.line:type_name -> parca.metastore.v1alpha1.Line - 32, // 53: parca.query.v1alpha1.Callgraph.nodes:type_name -> parca.query.v1alpha1.CallgraphNode - 34, // 54: parca.query.v1alpha1.Callgraph.edges:type_name -> parca.query.v1alpha1.CallgraphEdge - 26, // 55: parca.query.v1alpha1.QueryResponse.flamegraph:type_name -> parca.query.v1alpha1.Flamegraph - 23, // 56: parca.query.v1alpha1.QueryResponse.top:type_name -> parca.query.v1alpha1.Top - 35, // 57: parca.query.v1alpha1.QueryResponse.callgraph:type_name -> parca.query.v1alpha1.Callgraph - 27, // 58: parca.query.v1alpha1.QueryResponse.flamegraph_arrow:type_name -> parca.query.v1alpha1.FlamegraphArrow - 28, // 59: parca.query.v1alpha1.QueryResponse.source:type_name -> parca.query.v1alpha1.Source - 46, // 60: parca.query.v1alpha1.QueryResponse.table_arrow:type_name -> parca.query.v1alpha1.TableArrow - 47, // 61: parca.query.v1alpha1.QueryResponse.profile_metadata:type_name -> parca.query.v1alpha1.ProfileMetadata - 48, // 62: parca.query.v1alpha1.SeriesRequest.start:type_name -> google.protobuf.Timestamp - 48, // 63: parca.query.v1alpha1.SeriesRequest.end:type_name -> google.protobuf.Timestamp - 48, // 64: parca.query.v1alpha1.LabelsRequest.start:type_name -> google.protobuf.Timestamp - 48, // 65: parca.query.v1alpha1.LabelsRequest.end:type_name -> google.protobuf.Timestamp - 48, // 66: parca.query.v1alpha1.ValuesRequest.start:type_name -> google.protobuf.Timestamp - 48, // 67: parca.query.v1alpha1.ValuesRequest.end:type_name -> google.protobuf.Timestamp - 14, // 68: parca.query.v1alpha1.ShareProfileRequest.query_request:type_name -> parca.query.v1alpha1.QueryRequest - 6, // 69: parca.query.v1alpha1.QueryService.QueryRange:input_type -> parca.query.v1alpha1.QueryRangeRequest - 14, // 70: parca.query.v1alpha1.QueryService.Query:input_type -> parca.query.v1alpha1.QueryRequest - 37, // 71: parca.query.v1alpha1.QueryService.Series:input_type -> parca.query.v1alpha1.SeriesRequest - 3, // 72: parca.query.v1alpha1.QueryService.ProfileTypes:input_type -> parca.query.v1alpha1.ProfileTypesRequest - 39, // 73: parca.query.v1alpha1.QueryService.Labels:input_type -> parca.query.v1alpha1.LabelsRequest - 41, // 74: parca.query.v1alpha1.QueryService.Values:input_type -> parca.query.v1alpha1.ValuesRequest - 44, // 75: parca.query.v1alpha1.QueryService.ShareProfile:input_type -> parca.query.v1alpha1.ShareProfileRequest - 7, // 76: parca.query.v1alpha1.QueryService.QueryRange:output_type -> parca.query.v1alpha1.QueryRangeResponse - 36, // 77: parca.query.v1alpha1.QueryService.Query:output_type -> parca.query.v1alpha1.QueryResponse - 38, // 78: parca.query.v1alpha1.QueryService.Series:output_type -> parca.query.v1alpha1.SeriesResponse - 4, // 79: parca.query.v1alpha1.QueryService.ProfileTypes:output_type -> parca.query.v1alpha1.ProfileTypesResponse - 40, // 80: parca.query.v1alpha1.QueryService.Labels:output_type -> parca.query.v1alpha1.LabelsResponse - 42, // 81: parca.query.v1alpha1.QueryService.Values:output_type -> parca.query.v1alpha1.ValuesResponse - 45, // 82: parca.query.v1alpha1.QueryService.ShareProfile:output_type -> parca.query.v1alpha1.ShareProfileResponse - 76, // [76:83] is the sub-list for method output_type - 69, // [69:76] is the sub-list for method input_type - 69, // [69:69] is the sub-list for extension type_name - 69, // [69:69] is the sub-list for extension extendee - 0, // [0:69] is the sub-list for field type_name + 6, // 0: parca.query.v1alpha1.ProfileTypesResponse.types:type_name -> parca.query.v1alpha1.ProfileType + 52, // 1: parca.query.v1alpha1.QueryRangeRequest.start:type_name -> google.protobuf.Timestamp + 52, // 2: parca.query.v1alpha1.QueryRangeRequest.end:type_name -> google.protobuf.Timestamp + 53, // 3: parca.query.v1alpha1.QueryRangeRequest.step:type_name -> google.protobuf.Duration + 9, // 4: parca.query.v1alpha1.QueryRangeResponse.series:type_name -> parca.query.v1alpha1.MetricsSeries + 54, // 5: parca.query.v1alpha1.MetricsSeries.labelset:type_name -> parca.profilestore.v1alpha1.LabelSet + 10, // 6: parca.query.v1alpha1.MetricsSeries.samples:type_name -> parca.query.v1alpha1.MetricsSample + 47, // 7: parca.query.v1alpha1.MetricsSeries.period_type:type_name -> parca.query.v1alpha1.ValueType + 47, // 8: parca.query.v1alpha1.MetricsSeries.sample_type:type_name -> parca.query.v1alpha1.ValueType + 52, // 9: parca.query.v1alpha1.MetricsSample.timestamp:type_name -> google.protobuf.Timestamp + 52, // 10: parca.query.v1alpha1.MergeProfile.start:type_name -> google.protobuf.Timestamp + 52, // 11: parca.query.v1alpha1.MergeProfile.end:type_name -> google.protobuf.Timestamp + 52, // 12: parca.query.v1alpha1.SingleProfile.time:type_name -> google.protobuf.Timestamp + 14, // 13: parca.query.v1alpha1.DiffProfile.a:type_name -> parca.query.v1alpha1.ProfileDiffSelection + 14, // 14: parca.query.v1alpha1.DiffProfile.b:type_name -> parca.query.v1alpha1.ProfileDiffSelection + 1, // 15: parca.query.v1alpha1.ProfileDiffSelection.mode:type_name -> parca.query.v1alpha1.ProfileDiffSelection.Mode + 11, // 16: parca.query.v1alpha1.ProfileDiffSelection.merge:type_name -> parca.query.v1alpha1.MergeProfile + 12, // 17: parca.query.v1alpha1.ProfileDiffSelection.single:type_name -> parca.query.v1alpha1.SingleProfile + 2, // 18: parca.query.v1alpha1.QueryRequest.mode:type_name -> parca.query.v1alpha1.QueryRequest.Mode + 13, // 19: parca.query.v1alpha1.QueryRequest.diff:type_name -> parca.query.v1alpha1.DiffProfile + 11, // 20: parca.query.v1alpha1.QueryRequest.merge:type_name -> parca.query.v1alpha1.MergeProfile + 12, // 21: parca.query.v1alpha1.QueryRequest.single:type_name -> parca.query.v1alpha1.SingleProfile + 3, // 22: parca.query.v1alpha1.QueryRequest.report_type:type_name -> parca.query.v1alpha1.QueryRequest.ReportType + 23, // 23: parca.query.v1alpha1.QueryRequest.group_by:type_name -> parca.query.v1alpha1.GroupBy + 22, // 24: parca.query.v1alpha1.QueryRequest.source_reference:type_name -> parca.query.v1alpha1.SourceReference + 21, // 25: parca.query.v1alpha1.QueryRequest.runtime_filter:type_name -> parca.query.v1alpha1.RuntimeFilter + 16, // 26: parca.query.v1alpha1.QueryRequest.filter:type_name -> parca.query.v1alpha1.Filter + 0, // 27: parca.query.v1alpha1.QueryRequest.export_format:type_name -> parca.query.v1alpha1.Format + 17, // 28: parca.query.v1alpha1.Filter.stack_filter:type_name -> parca.query.v1alpha1.StackFilter + 19, // 29: parca.query.v1alpha1.Filter.frame_filter:type_name -> parca.query.v1alpha1.FrameFilter + 18, // 30: parca.query.v1alpha1.StackFilter.function_name_stack_filter:type_name -> parca.query.v1alpha1.FunctionNameStackFilter + 20, // 31: parca.query.v1alpha1.FrameFilter.binary_frame_filter:type_name -> parca.query.v1alpha1.BinaryFrameFilter + 25, // 32: parca.query.v1alpha1.Top.list:type_name -> parca.query.v1alpha1.TopNode + 26, // 33: parca.query.v1alpha1.TopNode.meta:type_name -> parca.query.v1alpha1.TopNodeMeta + 55, // 34: parca.query.v1alpha1.TopNodeMeta.location:type_name -> parca.metastore.v1alpha1.Location + 56, // 35: parca.query.v1alpha1.TopNodeMeta.mapping:type_name -> parca.metastore.v1alpha1.Mapping + 57, // 36: parca.query.v1alpha1.TopNodeMeta.function:type_name -> parca.metastore.v1alpha1.Function + 58, // 37: parca.query.v1alpha1.TopNodeMeta.line:type_name -> parca.metastore.v1alpha1.Line + 30, // 38: parca.query.v1alpha1.Flamegraph.root:type_name -> parca.query.v1alpha1.FlamegraphRootNode + 55, // 39: parca.query.v1alpha1.Flamegraph.locations:type_name -> parca.metastore.v1alpha1.Location + 56, // 40: parca.query.v1alpha1.Flamegraph.mapping:type_name -> parca.metastore.v1alpha1.Mapping + 57, // 41: parca.query.v1alpha1.Flamegraph.function:type_name -> parca.metastore.v1alpha1.Function + 31, // 42: parca.query.v1alpha1.FlamegraphRootNode.children:type_name -> parca.query.v1alpha1.FlamegraphNode + 32, // 43: parca.query.v1alpha1.FlamegraphNode.meta:type_name -> parca.query.v1alpha1.FlamegraphNodeMeta + 31, // 44: parca.query.v1alpha1.FlamegraphNode.children:type_name -> parca.query.v1alpha1.FlamegraphNode + 55, // 45: parca.query.v1alpha1.FlamegraphNodeMeta.location:type_name -> parca.metastore.v1alpha1.Location + 56, // 46: parca.query.v1alpha1.FlamegraphNodeMeta.mapping:type_name -> parca.metastore.v1alpha1.Mapping + 57, // 47: parca.query.v1alpha1.FlamegraphNodeMeta.function:type_name -> parca.metastore.v1alpha1.Function + 58, // 48: parca.query.v1alpha1.FlamegraphNodeMeta.line:type_name -> parca.metastore.v1alpha1.Line + 34, // 49: parca.query.v1alpha1.CallgraphNode.meta:type_name -> parca.query.v1alpha1.CallgraphNodeMeta + 55, // 50: parca.query.v1alpha1.CallgraphNodeMeta.location:type_name -> parca.metastore.v1alpha1.Location + 56, // 51: parca.query.v1alpha1.CallgraphNodeMeta.mapping:type_name -> parca.metastore.v1alpha1.Mapping + 57, // 52: parca.query.v1alpha1.CallgraphNodeMeta.function:type_name -> parca.metastore.v1alpha1.Function + 58, // 53: parca.query.v1alpha1.CallgraphNodeMeta.line:type_name -> parca.metastore.v1alpha1.Line + 33, // 54: parca.query.v1alpha1.Callgraph.nodes:type_name -> parca.query.v1alpha1.CallgraphNode + 35, // 55: parca.query.v1alpha1.Callgraph.edges:type_name -> parca.query.v1alpha1.CallgraphEdge + 27, // 56: parca.query.v1alpha1.QueryResponse.flamegraph:type_name -> parca.query.v1alpha1.Flamegraph + 24, // 57: parca.query.v1alpha1.QueryResponse.top:type_name -> parca.query.v1alpha1.Top + 36, // 58: parca.query.v1alpha1.QueryResponse.callgraph:type_name -> parca.query.v1alpha1.Callgraph + 28, // 59: parca.query.v1alpha1.QueryResponse.flamegraph_arrow:type_name -> parca.query.v1alpha1.FlamegraphArrow + 29, // 60: parca.query.v1alpha1.QueryResponse.source:type_name -> parca.query.v1alpha1.Source + 50, // 61: parca.query.v1alpha1.QueryResponse.table_arrow:type_name -> parca.query.v1alpha1.TableArrow + 51, // 62: parca.query.v1alpha1.QueryResponse.profile_metadata:type_name -> parca.query.v1alpha1.ProfileMetadata + 38, // 63: parca.query.v1alpha1.QueryResponse.export:type_name -> parca.query.v1alpha1.Export + 0, // 64: parca.query.v1alpha1.Export.format:type_name -> parca.query.v1alpha1.Format + 40, // 65: parca.query.v1alpha1.Export.inline:type_name -> parca.query.v1alpha1.InlineExport + 39, // 66: parca.query.v1alpha1.Export.url:type_name -> parca.query.v1alpha1.URLExport + 52, // 67: parca.query.v1alpha1.SeriesRequest.start:type_name -> google.protobuf.Timestamp + 52, // 68: parca.query.v1alpha1.SeriesRequest.end:type_name -> google.protobuf.Timestamp + 52, // 69: parca.query.v1alpha1.LabelsRequest.start:type_name -> google.protobuf.Timestamp + 52, // 70: parca.query.v1alpha1.LabelsRequest.end:type_name -> google.protobuf.Timestamp + 52, // 71: parca.query.v1alpha1.ValuesRequest.start:type_name -> google.protobuf.Timestamp + 52, // 72: parca.query.v1alpha1.ValuesRequest.end:type_name -> google.protobuf.Timestamp + 15, // 73: parca.query.v1alpha1.ShareProfileRequest.query_request:type_name -> parca.query.v1alpha1.QueryRequest + 7, // 74: parca.query.v1alpha1.QueryService.QueryRange:input_type -> parca.query.v1alpha1.QueryRangeRequest + 15, // 75: parca.query.v1alpha1.QueryService.Query:input_type -> parca.query.v1alpha1.QueryRequest + 41, // 76: parca.query.v1alpha1.QueryService.Series:input_type -> parca.query.v1alpha1.SeriesRequest + 4, // 77: parca.query.v1alpha1.QueryService.ProfileTypes:input_type -> parca.query.v1alpha1.ProfileTypesRequest + 43, // 78: parca.query.v1alpha1.QueryService.Labels:input_type -> parca.query.v1alpha1.LabelsRequest + 45, // 79: parca.query.v1alpha1.QueryService.Values:input_type -> parca.query.v1alpha1.ValuesRequest + 48, // 80: parca.query.v1alpha1.QueryService.ShareProfile:input_type -> parca.query.v1alpha1.ShareProfileRequest + 8, // 81: parca.query.v1alpha1.QueryService.QueryRange:output_type -> parca.query.v1alpha1.QueryRangeResponse + 37, // 82: parca.query.v1alpha1.QueryService.Query:output_type -> parca.query.v1alpha1.QueryResponse + 42, // 83: parca.query.v1alpha1.QueryService.Series:output_type -> parca.query.v1alpha1.SeriesResponse + 5, // 84: parca.query.v1alpha1.QueryService.ProfileTypes:output_type -> parca.query.v1alpha1.ProfileTypesResponse + 44, // 85: parca.query.v1alpha1.QueryService.Labels:output_type -> parca.query.v1alpha1.LabelsResponse + 46, // 86: parca.query.v1alpha1.QueryService.Values:output_type -> parca.query.v1alpha1.ValuesResponse + 49, // 87: parca.query.v1alpha1.QueryService.ShareProfile:output_type -> parca.query.v1alpha1.ShareProfileResponse + 81, // [81:88] is the sub-list for method output_type + 74, // [74:81] is the sub-list for method input_type + 74, // [74:74] is the sub-list for extension type_name + 74, // [74:74] is the sub-list for extension extendee + 0, // [0:74] is the sub-list for field type_name } func init() { file_parca_query_v1alpha1_query_proto_init() } @@ -4705,7 +5021,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SeriesRequest); i { + switch v := v.(*Export); i { case 0: return &v.state case 1: @@ -4717,7 +5033,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SeriesResponse); i { + switch v := v.(*URLExport); i { case 0: return &v.state case 1: @@ -4729,7 +5045,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelsRequest); i { + switch v := v.(*InlineExport); i { case 0: return &v.state case 1: @@ -4741,7 +5057,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelsResponse); i { + switch v := v.(*SeriesRequest); i { case 0: return &v.state case 1: @@ -4753,7 +5069,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValuesRequest); i { + switch v := v.(*SeriesResponse); i { case 0: return &v.state case 1: @@ -4765,7 +5081,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValuesResponse); i { + switch v := v.(*LabelsRequest); i { case 0: return &v.state case 1: @@ -4777,7 +5093,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValueType); i { + switch v := v.(*LabelsResponse); i { case 0: return &v.state case 1: @@ -4789,7 +5105,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShareProfileRequest); i { + switch v := v.(*ValuesRequest); i { case 0: return &v.state case 1: @@ -4801,7 +5117,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShareProfileResponse); i { + switch v := v.(*ValuesResponse); i { case 0: return &v.state case 1: @@ -4813,7 +5129,7 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableArrow); i { + switch v := v.(*ValueType); i { case 0: return &v.state case 1: @@ -4825,6 +5141,42 @@ func file_parca_query_v1alpha1_query_proto_init() { } } file_parca_query_v1alpha1_query_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShareProfileRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_parca_query_v1alpha1_query_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShareProfileResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_parca_query_v1alpha1_query_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TableArrow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_parca_query_v1alpha1_query_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProfileMetadata); i { case 0: return &v.state @@ -4865,15 +5217,20 @@ func file_parca_query_v1alpha1_query_proto_init() { (*QueryResponse_Source)(nil), (*QueryResponse_TableArrow)(nil), (*QueryResponse_ProfileMetadata)(nil), + (*QueryResponse_Export)(nil), + } + file_parca_query_v1alpha1_query_proto_msgTypes[34].OneofWrappers = []interface{}{ + (*Export_Inline)(nil), + (*Export_Url)(nil), } - file_parca_query_v1alpha1_query_proto_msgTypes[41].OneofWrappers = []interface{}{} + file_parca_query_v1alpha1_query_proto_msgTypes[44].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_parca_query_v1alpha1_query_proto_rawDesc, - NumEnums: 3, - NumMessages: 45, + NumEnums: 4, + NumMessages: 48, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/proto/go/parca/query/v1alpha1/query_vtproto.pb.go b/gen/proto/go/parca/query/v1alpha1/query_vtproto.pb.go index acd4de73f8d..525fb26ad97 100644 --- a/gen/proto/go/parca/query/v1alpha1/query_vtproto.pb.go +++ b/gen/proto/go/parca/query/v1alpha1/query_vtproto.pb.go @@ -1048,6 +1048,11 @@ func (m *QueryRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { } i -= size } + if m.ExportFormat != nil { + i = protohelpers.EncodeVarint(dAtA, i, uint64(*m.ExportFormat)) + i-- + dAtA[i] = 0x68 + } if len(m.Filter) > 0 { for iNdEx := len(m.Filter) - 1; iNdEx >= 0; iNdEx-- { size, err := m.Filter[iNdEx].MarshalToSizedBufferVT(dAtA[:i]) @@ -2714,6 +2719,190 @@ func (m *QueryResponse_ProfileMetadata) MarshalToSizedBufferVT(dAtA []byte) (int } return len(dAtA) - i, nil } +func (m *QueryResponse_Export) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *QueryResponse_Export) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Export != nil { + size, err := m.Export.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x7a + } + return len(dAtA) - i, nil +} +func (m *Export) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Export) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Export) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if vtmsg, ok := m.Content.(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := vtmsg.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + } + if m.Format != 0 { + i = protohelpers.EncodeVarint(dAtA, i, uint64(m.Format)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Export_Inline) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Export_Inline) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Inline != nil { + size, err := m.Inline.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *Export_Url) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *Export_Url) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Url != nil { + size, err := m.Url.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = protohelpers.EncodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *URLExport) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *URLExport) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *URLExport) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Url) > 0 { + i -= len(m.Url) + copy(dAtA[i:], m.Url) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Url))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *InlineExport) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InlineExport) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *InlineExport) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Content) > 0 { + i -= len(m.Content) + copy(dAtA[i:], m.Content) + i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.Content))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *SeriesRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -3573,6 +3762,9 @@ func (m *QueryRequest) SizeVT() (n int) { n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) } } + if m.ExportFormat != nil { + n += 1 + protohelpers.SizeOfVarint(uint64(*m.ExportFormat)) + } n += len(m.unknownFields) return n } @@ -4257,6 +4449,86 @@ func (m *QueryResponse_ProfileMetadata) SizeVT() (n int) { } return n } +func (m *QueryResponse_Export) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Export != nil { + l = m.Export.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + return n +} +func (m *Export) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Format != 0 { + n += 1 + protohelpers.SizeOfVarint(uint64(m.Format)) + } + if vtmsg, ok := m.Content.(interface{ SizeVT() int }); ok { + n += vtmsg.SizeVT() + } + n += len(m.unknownFields) + return n +} + +func (m *Export_Inline) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Inline != nil { + l = m.Inline.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + return n +} +func (m *Export_Url) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Url != nil { + l = m.Url.SizeVT() + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + return n +} +func (m *URLExport) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Url) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + +func (m *InlineExport) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Content) + if l > 0 { + n += 1 + l + protohelpers.SizeOfVarint(uint64(l)) + } + n += len(m.unknownFields) + return n +} + func (m *SeriesRequest) SizeVT() (n int) { if m == nil { return 0 @@ -6415,6 +6687,26 @@ func (m *QueryRequest) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExportFormat", wireType) + } + var v Format + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= Format(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ExportFormat = &v default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) @@ -9954,6 +10246,367 @@ func (m *QueryResponse) UnmarshalVT(dAtA []byte) error { m.Report = &QueryResponse_ProfileMetadata{ProfileMetadata: v} } iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Export", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if oneof, ok := m.Report.(*QueryResponse_Export); ok { + if err := oneof.Export.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &Export{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Report = &QueryResponse_Export{Export: v} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Export) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Export: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Export: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) + } + m.Format = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Format |= Format(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Inline", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if oneof, ok := m.Content.(*Export_Inline); ok { + if err := oneof.Inline.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &InlineExport{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Content = &Export_Inline{Inline: v} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Url", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if oneof, ok := m.Content.(*Export_Url); ok { + if err := oneof.Url.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &URLExport{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Content = &Export_Url{Url: v} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *URLExport) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: URLExport: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: URLExport: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Url", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Url = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := protohelpers.Skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protohelpers.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InlineExport) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InlineExport: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InlineExport: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Content", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protohelpers.ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protohelpers.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protohelpers.ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Content = append(m.Content[:0], dAtA[iNdEx:postIndex]...) + if m.Content == nil { + m.Content = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := protohelpers.Skip(dAtA[iNdEx:]) diff --git a/gen/proto/swagger/parca/query/v1alpha1/query.swagger.json b/gen/proto/swagger/parca/query/v1alpha1/query.swagger.json index e99e9de5feb..fc9fc611e94 100644 --- a/gen/proto/swagger/parca/query/v1alpha1/query.swagger.json +++ b/gen/proto/swagger/parca/query/v1alpha1/query.swagger.json @@ -299,7 +299,7 @@ }, { "name": "reportType", - "description": "report_type is the type of report to return\n\n - REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED: REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED unspecified\n - REPORT_TYPE_PPROF: REPORT_TYPE_PPROF unspecified\n - REPORT_TYPE_TOP: REPORT_TYPE_TOP unspecified\n - REPORT_TYPE_CALLGRAPH: REPORT_TYPE_CALLGRAPH unspecified\n - REPORT_TYPE_FLAMEGRAPH_TABLE: REPORT_TYPE_FLAMEGRAPH_TABLE unspecified\n - REPORT_TYPE_FLAMEGRAPH_ARROW: REPORT_TYPE_FLAMEGRAPH_ARROW unspecified\n - REPORT_TYPE_SOURCE: REPORT_TYPE_SOURCE contains source code annotated with profiling information\n - REPORT_TYPE_TABLE_ARROW: REPORT_TYPE_TABLE_ARROW unspecified\n - REPORT_TYPE_PROFILE_METADATA: REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels", + "description": "report_type is the type of report to return\n\n - REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED: REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED unspecified\n - REPORT_TYPE_PPROF: REPORT_TYPE_PPROF unspecified\n - REPORT_TYPE_TOP: REPORT_TYPE_TOP unspecified\n - REPORT_TYPE_CALLGRAPH: REPORT_TYPE_CALLGRAPH unspecified\n - REPORT_TYPE_FLAMEGRAPH_TABLE: REPORT_TYPE_FLAMEGRAPH_TABLE unspecified\n - REPORT_TYPE_FLAMEGRAPH_ARROW: REPORT_TYPE_FLAMEGRAPH_ARROW unspecified\n - REPORT_TYPE_SOURCE: REPORT_TYPE_SOURCE contains source code annotated with profiling information\n - REPORT_TYPE_TABLE_ARROW: REPORT_TYPE_TABLE_ARROW unspecified\n - REPORT_TYPE_PROFILE_METADATA: REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels\n - REPORT_TYPE_EXPORT: REPORT_TYPE_EXPORT contains the profile as a downloadable file", "in": "query", "required": false, "type": "string", @@ -312,7 +312,8 @@ "REPORT_TYPE_FLAMEGRAPH_ARROW", "REPORT_TYPE_SOURCE", "REPORT_TYPE_TABLE_ARROW", - "REPORT_TYPE_PROFILE_METADATA" + "REPORT_TYPE_PROFILE_METADATA", + "REPORT_TYPE_EXPORT" ], "default": "REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED" }, @@ -390,6 +391,18 @@ "in": "query", "required": false, "type": "boolean" + }, + { + "name": "exportFormat", + "description": "the format to respond the data in for the export\n\n - FORMAT_UNSPECIFIED: FORMAT_UNSPECIFIED unspecified\n - FORMAT_PPROF: DOWNLOAD_FORMAT_PPROF pprof format", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "FORMAT_UNSPECIFIED", + "FORMAT_PPROF" + ], + "default": "FORMAT_UNSPECIFIED" } ], "tags": [ @@ -581,10 +594,11 @@ "REPORT_TYPE_FLAMEGRAPH_ARROW", "REPORT_TYPE_SOURCE", "REPORT_TYPE_TABLE_ARROW", - "REPORT_TYPE_PROFILE_METADATA" + "REPORT_TYPE_PROFILE_METADATA", + "REPORT_TYPE_EXPORT" ], "default": "REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED", - "description": "- REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED: REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED unspecified\n - REPORT_TYPE_PPROF: REPORT_TYPE_PPROF unspecified\n - REPORT_TYPE_TOP: REPORT_TYPE_TOP unspecified\n - REPORT_TYPE_CALLGRAPH: REPORT_TYPE_CALLGRAPH unspecified\n - REPORT_TYPE_FLAMEGRAPH_TABLE: REPORT_TYPE_FLAMEGRAPH_TABLE unspecified\n - REPORT_TYPE_FLAMEGRAPH_ARROW: REPORT_TYPE_FLAMEGRAPH_ARROW unspecified\n - REPORT_TYPE_SOURCE: REPORT_TYPE_SOURCE contains source code annotated with profiling information\n - REPORT_TYPE_TABLE_ARROW: REPORT_TYPE_TABLE_ARROW unspecified\n - REPORT_TYPE_PROFILE_METADATA: REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels", + "description": "- REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED: REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED unspecified\n - REPORT_TYPE_PPROF: REPORT_TYPE_PPROF unspecified\n - REPORT_TYPE_TOP: REPORT_TYPE_TOP unspecified\n - REPORT_TYPE_CALLGRAPH: REPORT_TYPE_CALLGRAPH unspecified\n - REPORT_TYPE_FLAMEGRAPH_TABLE: REPORT_TYPE_FLAMEGRAPH_TABLE unspecified\n - REPORT_TYPE_FLAMEGRAPH_ARROW: REPORT_TYPE_FLAMEGRAPH_ARROW unspecified\n - REPORT_TYPE_SOURCE: REPORT_TYPE_SOURCE contains source code annotated with profiling information\n - REPORT_TYPE_TABLE_ARROW: REPORT_TYPE_TABLE_ARROW unspecified\n - REPORT_TYPE_PROFILE_METADATA: REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels\n - REPORT_TYPE_EXPORT: REPORT_TYPE_EXPORT contains the profile as a downloadable file", "title": "ReportType is the type of report to return" }, "metastorev1alpha1Function": { @@ -813,6 +827,10 @@ "$ref": "#/definitions/v1alpha1Filter" }, "title": "a set of filter to apply to the query request" + }, + "exportFormat": { + "$ref": "#/definitions/v1alpha1Format", + "title": "the format to respond the data in for the export" } }, "title": "QueryRequest is a request for a profile query" @@ -853,6 +871,10 @@ "$ref": "#/definitions/v1alpha1ProfileMetadata", "title": "profile_metadata contains metadata about the profile i.e. binaries, labels" }, + "export": { + "$ref": "#/definitions/v1alpha1Export", + "description": "export is the response for an export request." + }, "total": { "type": "string", "format": "int64", @@ -1068,6 +1090,24 @@ }, "title": "DiffProfile contains parameters for a profile diff request" }, + "v1alpha1Export": { + "type": "object", + "properties": { + "format": { + "$ref": "#/definitions/v1alpha1Format", + "description": "The format of the download." + }, + "inline": { + "$ref": "#/definitions/v1alpha1InlineExport", + "description": "InlineExport is the response for an export request where actual content\nis inlined in the response." + }, + "url": { + "$ref": "#/definitions/v1alpha1URLExport", + "description": "URL is the response for an export request where actual content\nis to be downloaded from the provided URL." + } + }, + "description": "Export is the response for an export request." + }, "v1alpha1Filter": { "type": "object", "properties": { @@ -1256,6 +1296,16 @@ }, "title": "FlamegraphRootNode is a root node of a flame graph" }, + "v1alpha1Format": { + "type": "string", + "enum": [ + "FORMAT_UNSPECIFIED", + "FORMAT_PPROF" + ], + "default": "FORMAT_UNSPECIFIED", + "description": "- FORMAT_UNSPECIFIED: FORMAT_UNSPECIFIED unspecified\n - FORMAT_PPROF: DOWNLOAD_FORMAT_PPROF pprof format", + "title": "format is the format to offer the data in for the download" + }, "v1alpha1FrameFilter": { "type": "object", "properties": { @@ -1289,6 +1339,17 @@ }, "title": "GroupBy encapsulates the repeated fields to group by" }, + "v1alpha1InlineExport": { + "type": "object", + "properties": { + "content": { + "type": "string", + "format": "byte", + "description": "Content of the export." + } + }, + "description": "InlineExport is the response for an export request where actual content is\ninlined in the response." + }, "v1alpha1LabelSet": { "type": "object", "properties": { @@ -1677,6 +1738,16 @@ }, "title": "TopNodeMeta is the metadata for a given node" }, + "v1alpha1URLExport": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The URL to download the content from." + } + }, + "description": "URLExport is the response for an export request where actual content is\nto be downloaded from the provided URL." + }, "v1alpha1ValuesResponse": { "type": "object", "properties": { diff --git a/gen/proto/swagger/parca/share/v1alpha1/share.swagger.json b/gen/proto/swagger/parca/share/v1alpha1/share.swagger.json index 6a4ae807bbf..7447f445bda 100644 --- a/gen/proto/swagger/parca/share/v1alpha1/share.swagger.json +++ b/gen/proto/swagger/parca/share/v1alpha1/share.swagger.json @@ -28,10 +28,11 @@ "REPORT_TYPE_FLAMEGRAPH_ARROW", "REPORT_TYPE_SOURCE", "REPORT_TYPE_TABLE_ARROW", - "REPORT_TYPE_PROFILE_METADATA" + "REPORT_TYPE_PROFILE_METADATA", + "REPORT_TYPE_EXPORT" ], "default": "REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED", - "description": "- REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED: REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED unspecified\n - REPORT_TYPE_PPROF: REPORT_TYPE_PPROF unspecified\n - REPORT_TYPE_TOP: REPORT_TYPE_TOP unspecified\n - REPORT_TYPE_CALLGRAPH: REPORT_TYPE_CALLGRAPH unspecified\n - REPORT_TYPE_FLAMEGRAPH_TABLE: REPORT_TYPE_FLAMEGRAPH_TABLE unspecified\n - REPORT_TYPE_FLAMEGRAPH_ARROW: REPORT_TYPE_FLAMEGRAPH_ARROW unspecified\n - REPORT_TYPE_SOURCE: REPORT_TYPE_SOURCE contains source code annotated with profiling information\n - REPORT_TYPE_TABLE_ARROW: REPORT_TYPE_TABLE_ARROW unspecified\n - REPORT_TYPE_PROFILE_METADATA: REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels", + "description": "- REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED: REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED unspecified\n - REPORT_TYPE_PPROF: REPORT_TYPE_PPROF unspecified\n - REPORT_TYPE_TOP: REPORT_TYPE_TOP unspecified\n - REPORT_TYPE_CALLGRAPH: REPORT_TYPE_CALLGRAPH unspecified\n - REPORT_TYPE_FLAMEGRAPH_TABLE: REPORT_TYPE_FLAMEGRAPH_TABLE unspecified\n - REPORT_TYPE_FLAMEGRAPH_ARROW: REPORT_TYPE_FLAMEGRAPH_ARROW unspecified\n - REPORT_TYPE_SOURCE: REPORT_TYPE_SOURCE contains source code annotated with profiling information\n - REPORT_TYPE_TABLE_ARROW: REPORT_TYPE_TABLE_ARROW unspecified\n - REPORT_TYPE_PROFILE_METADATA: REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels\n - REPORT_TYPE_EXPORT: REPORT_TYPE_EXPORT contains the profile as a downloadable file", "title": "ReportType is the type of report to return" }, "metastorev1alpha1Function": { diff --git a/parca.yaml b/parca.yaml index 5b5e6238623..d1bb75e7438 100644 --- a/parca.yaml +++ b/parca.yaml @@ -9,11 +9,11 @@ object_storage: # Scraping tends to produce a lot more data than Parca Agent CPU which # results in memory usage by the server. # -# scrape_configs: -# - job_name: "parca" -# scrape_interval: "10s" -# static_configs: -# - targets: [ '127.0.0.1:7070' ] +scrape_configs: + - job_name: "parca" + scrape_interval: "10s" + static_configs: + - targets: [ '127.0.0.1:7070' ] # Nested under the job config: # diff --git a/pkg/parca/parca.go b/pkg/parca/parca.go index 6cfcab2ced3..c023604bf9d 100644 --- a/pkg/parca/parca.go +++ b/pkg/parca/parca.go @@ -110,6 +110,8 @@ type Flags struct { Storage FlagsStorage `embed:"" prefix:"storage-"` + ObjectStorageExport bool `default:"false" help:"Export profiles to object storage first before serving them via a signed URL."` + Symbolizer FlagsSymbolizer `embed:"" prefix:"symbolizer-"` Debuginfo FlagsDebuginfo `embed:"" prefix:"debuginfo-"` @@ -424,6 +426,9 @@ func Run(ctx context.Context, logger log.Logger, reg *prometheus.Registry, flags debuginfoBucket, debuginfodClients, ), + flags.ObjectStorageExport, + signedRequestsClient, + bucket, ) t := telemetryservice.NewTelemetry( diff --git a/pkg/query/columnquery.go b/pkg/query/columnquery.go index 76350df6963..1cb80596bad 100644 --- a/pkg/query/columnquery.go +++ b/pkg/query/columnquery.go @@ -18,6 +18,9 @@ import ( "context" "errors" "fmt" + "io" + "path" + "strconv" "strings" "sync" "time" @@ -27,6 +30,7 @@ import ( "github.com/apache/arrow/go/v16/arrow/bitutil" "github.com/apache/arrow/go/v16/arrow/math" "github.com/apache/arrow/go/v16/arrow/memory" + "github.com/cespare/xxhash/v2" "github.com/go-kit/log" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -62,6 +66,14 @@ type SourceFinder interface { SourceExists(ctx context.Context, ref *pb.SourceReference) (bool, error) } +type SignedGetClient interface { + SignedGET(ctx context.Context, objectKey string, expiry time.Time) (string, error) +} + +type ObjectStoreUploadClient interface { + Upload(ctx context.Context, objectKey string, r io.Reader) error +} + // ColumnQueryAPI is the read api interface for parca // It implements the proto/query/query.proto APIServer interface. type ColumnQueryAPI struct { @@ -77,6 +89,13 @@ type ColumnQueryAPI struct { converter *parcacol.ArrowToProfileConverter sourceFinder SourceFinder + + // Whether to first upload an export to object storage and returning a + // signed URL to the client instead of serving the export directly within + // the API response. + objectStorgeExport bool + signedGetClient SignedGetClient + objectStore ObjectStoreUploadClient } func NewColumnQueryAPI( @@ -87,6 +106,9 @@ func NewColumnQueryAPI( mem memory.Allocator, converter *parcacol.ArrowToProfileConverter, sourceFinder SourceFinder, + objectStorageExport bool, + signedGetClient SignedGetClient, + objectStore ObjectStoreUploadClient, ) *ColumnQueryAPI { return &ColumnQueryAPI{ logger: logger, @@ -97,6 +119,9 @@ func NewColumnQueryAPI( mem: mem, converter: converter, sourceFinder: sourceFinder, + objectStorgeExport: objectStorageExport, + signedGetClient: signedGetClient, + objectStore: objectStore, } } @@ -320,9 +345,16 @@ func (q *ColumnQueryAPI) Query(ctx context.Context, req *pb.QueryRequest) (*pb.Q return nil, fmt.Errorf("filtering profile: %w", err) } + data, err := req.MarshalVT() + if err != nil { + return nil, fmt.Errorf("marshaling request: %w", err) + } + requestKey := xxhash.Sum64(data) + return q.renderReport( ctx, p, + strconv.FormatUint(requestKey, 16), req.GetReportType(), req.GetNodeTrimThreshold(), filtered, @@ -330,6 +362,7 @@ func (q *ColumnQueryAPI) Query(ctx context.Context, req *pb.QueryRequest) (*pb.Q req.GetSourceReference(), source, isDiff, + req.GetExportFormat(), ) } @@ -474,6 +507,7 @@ func filterRecord( func (q *ColumnQueryAPI) renderReport( ctx context.Context, p profile.Profile, + requestKey string, typ pb.QueryRequest_ReportType, nodeTrimThreshold float32, filtered int64, @@ -481,10 +515,12 @@ func (q *ColumnQueryAPI) renderReport( sourceReference *pb.SourceReference, source string, isDiff bool, + exportFormat pb.Format, ) (*pb.QueryResponse, error) { return RenderReport( ctx, q.tracer, + requestKey, p, typ, nodeTrimThreshold, @@ -496,12 +532,17 @@ func (q *ColumnQueryAPI) renderReport( sourceReference, source, isDiff, + exportFormat, + q.objectStorgeExport, + q.signedGetClient, + q.objectStore, ) } func RenderReport( ctx context.Context, tracer trace.Tracer, + requestKey string, p profile.Profile, typ pb.QueryRequest_ReportType, nodeTrimThreshold float32, @@ -513,6 +554,10 @@ func RenderReport( sourceReference *pb.SourceReference, source string, isDiff bool, + exportFormat pb.Format, + objectStorageExport bool, + signedGetClient SignedGetClient, + objectStore ObjectStoreUploadClient, ) (*pb.QueryResponse, error) { ctx, span := tracer.Start(ctx, "renderReport") span.SetAttributes(attribute.String("reportType", typ.String())) @@ -609,6 +654,53 @@ func RenderReport( Filtered: filtered, Report: &pb.QueryResponse_Pprof{Pprof: buf}, }, nil + case pb.QueryRequest_REPORT_TYPE_EXPORT: + var buf []byte + + switch exportFormat { + case pb.Format_FORMAT_PPROF: + pp, err := GenerateFlatPprof(ctx, isDiff, p) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to generate pprof: %v", err.Error()) + } + + buf, err = SerializePprof(pp) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to generate pprof: %v", err.Error()) + } + default: + return nil, status.Errorf(codes.InvalidArgument, "requested export format does not exist") + } + + if objectStorageExport { + key := path.Join(requestKey, "pprof") + if err := objectStore.Upload(ctx, key, bytes.NewReader(buf)); err != nil { + return nil, status.Errorf(codes.Internal, "failed to upload export to object storage: %v", err.Error()) + } + + signedURL, err := signedGetClient.SignedGET(ctx, key, time.Now().Add(time.Hour)) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to generate signed URL: %v", err.Error()) + } + + return &pb.QueryResponse{ + Report: &pb.QueryResponse_Export{ + Export: &pb.Export{ + Format: exportFormat, + Content: &pb.Export_Url{Url: &pb.URLExport{Url: signedURL}}, + }, + }, + }, nil + } + + return &pb.QueryResponse{ + Report: &pb.QueryResponse_Export{ + Export: &pb.Export{ + Format: exportFormat, + Content: &pb.Export_Inline{Inline: &pb.InlineExport{Content: buf}}, + }, + }, + }, nil case pb.QueryRequest_REPORT_TYPE_TOP: op, err := converter.Convert(ctx, p) if err != nil { diff --git a/proto/buf.lock b/proto/buf.lock index 022c81edc58..52c16bc128a 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -4,10 +4,10 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: 4383c33e6c714f8bb30a26a6d838e217 + commit: bec0f0b526624d66af9e5cd771efe9a9 digest: shake256:de26a277fc28b8b411ecf58729d78d32fcf15090ffd998a4469225b17889bfb51442eaab04bb7a8d88d203ecdf0a9febd4ffd52c18ed1c2229160c7bd353ca95 - remote: buf.build owner: grpc-ecosystem repository: grpc-gateway - commit: 05684d294cc5420e95a903ff363ed347 + commit: fff35d47bf314175b476c0dd34b20da7 digest: shake256:67b115260e12cb2d6c5d5ce8dbbf3a095c86f0e52b84f9dbd16dec9433b218f8694bc9aadb1d45eb6fd52f5a7029977d460e2d58afb3208ab6c680e7b21c80e4 diff --git a/proto/parca/query/v1alpha1/query.proto b/proto/parca/query/v1alpha1/query.proto index 1c5c3e999ff..46f41328c3b 100644 --- a/proto/parca/query/v1alpha1/query.proto +++ b/proto/parca/query/v1alpha1/query.proto @@ -219,7 +219,7 @@ message QueryRequest { REPORT_TYPE_FLAMEGRAPH_UNSPECIFIED = 0 [deprecated = true]; // REPORT_TYPE_PPROF unspecified - REPORT_TYPE_PPROF = 1; + REPORT_TYPE_PPROF = 1 [deprecated = true]; // REPORT_TYPE_TOP unspecified REPORT_TYPE_TOP = 2; @@ -241,6 +241,9 @@ message QueryRequest { // REPORT_TYPE_PROFILE_METADATA contains metadata about the profile i.e. binaries, labels REPORT_TYPE_PROFILE_METADATA = 8; + + // REPORT_TYPE_EXPORT contains the profile as a downloadable file + REPORT_TYPE_EXPORT = 9; } // report_type is the type of report to return @@ -266,6 +269,18 @@ message QueryRequest { // a set of filter to apply to the query request repeated Filter filter = 12; + + // the format to respond the data in for the export + optional Format export_format = 13; +} + +// format is the format to offer the data in for the download +enum Format { + // FORMAT_UNSPECIFIED unspecified + FORMAT_UNSPECIFIED = 0; + + // DOWNLOAD_FORMAT_PPROF pprof format + FORMAT_PPROF = 1; } // Filter to apply to the query request @@ -579,6 +594,9 @@ message QueryResponse { // profile_metadata contains metadata about the profile i.e. binaries, labels ProfileMetadata profile_metadata = 14; + + // export is the response for an export request. + Export export = 15; } // total is the total number of samples shown in the report. @@ -588,6 +606,37 @@ message QueryResponse { int64 filtered = 10; } +// Export is the response for an export request. +message Export { + // The format of the download. + Format format = 1; + + // The type of download. + oneof content { + // InlineExport is the response for an export request where actual content + // is inlined in the response. + InlineExport inline = 2; + + // URL is the response for an export request where actual content + // is to be downloaded from the provided URL. + URLExport url = 3; + } +} + +// URLExport is the response for an export request where actual content is +// to be downloaded from the provided URL. +message URLExport { + // The URL to download the content from. + string url = 1; +} + +// InlineExport is the response for an export request where actual content is +// inlined in the response. +message InlineExport { + // Content of the export. + bytes content = 1; +} + // SeriesRequest is unimplemented message SeriesRequest { // match ... diff --git a/ui/packages/shared/client/src/parca/query/v1alpha1/query.ts b/ui/packages/shared/client/src/parca/query/v1alpha1/query.ts index 746cc5c5b7c..b636bd87d4d 100644 --- a/ui/packages/shared/client/src/parca/query/v1alpha1/query.ts +++ b/ui/packages/shared/client/src/parca/query/v1alpha1/query.ts @@ -401,6 +401,12 @@ export interface QueryRequest { * @generated from protobuf field: repeated parca.query.v1alpha1.Filter filter = 12; */ filter: Filter[]; + /** + * the format to respond the data in for the export + * + * @generated from protobuf field: optional parca.query.v1alpha1.Format export_format = 13; + */ + exportFormat?: Format; } /** * Mode is the type of query request @@ -443,7 +449,8 @@ export enum QueryRequest_ReportType { /** * REPORT_TYPE_PPROF unspecified * - * @generated from protobuf enum value: REPORT_TYPE_PPROF = 1; + * @deprecated + * @generated from protobuf enum value: REPORT_TYPE_PPROF = 1 [deprecated = true]; */ PPROF = 1, /** @@ -487,7 +494,13 @@ export enum QueryRequest_ReportType { * * @generated from protobuf enum value: REPORT_TYPE_PROFILE_METADATA = 8; */ - PROFILE_METADATA = 8 + PROFILE_METADATA = 8, + /** + * REPORT_TYPE_EXPORT contains the profile as a downloadable file + * + * @generated from protobuf enum value: REPORT_TYPE_EXPORT = 9; + */ + EXPORT = 9 } /** * Filter to apply to the query request @@ -1170,6 +1183,14 @@ export interface QueryResponse { * @generated from protobuf field: parca.query.v1alpha1.ProfileMetadata profile_metadata = 14; */ profileMetadata: ProfileMetadata; + } | { + oneofKind: "export"; + /** + * export is the response for an export request. + * + * @generated from protobuf field: parca.query.v1alpha1.Export export = 15; + */ + export: Export; } | { oneofKind: undefined; }; @@ -1186,6 +1207,71 @@ export interface QueryResponse { */ filtered: bigint; } +/** + * Export is the response for an export request. + * + * @generated from protobuf message parca.query.v1alpha1.Export + */ +export interface Export { + /** + * The format of the download. + * + * @generated from protobuf field: parca.query.v1alpha1.Format format = 1; + */ + format: Format; + /** + * @generated from protobuf oneof: content + */ + content: { + oneofKind: "inline"; + /** + * InlineExport is the response for an export request where actual content + * is inlined in the response. + * + * @generated from protobuf field: parca.query.v1alpha1.InlineExport inline = 2; + */ + inline: InlineExport; + } | { + oneofKind: "url"; + /** + * URL is the response for an export request where actual content + * is to be downloaded from the provided URL. + * + * @generated from protobuf field: parca.query.v1alpha1.URLExport url = 3; + */ + url: URLExport; + } | { + oneofKind: undefined; + }; +} +/** + * URLExport is the response for an export request where actual content is + * to be downloaded from the provided URL. + * + * @generated from protobuf message parca.query.v1alpha1.URLExport + */ +export interface URLExport { + /** + * The URL to download the content from. + * + * @generated from protobuf field: string url = 1; + */ + url: string; +} +/** + * InlineExport is the response for an export request where actual content is + * inlined in the response. + * + * @generated from protobuf message parca.query.v1alpha1.InlineExport + */ +export interface InlineExport { + /** + * Content of the export. + * + * @generated from protobuf field: bytes content = 1; + */ + content: Uint8Array; +} /** * SeriesRequest is unimplemented * @@ -1401,6 +1487,25 @@ export interface ProfileMetadata { */ labels: string[]; } +/** + * format is the format to offer the data in for the download + * + * @generated from protobuf enum parca.query.v1alpha1.Format + */ +export enum Format { + /** + * FORMAT_UNSPECIFIED unspecified + * + * @generated from protobuf enum value: FORMAT_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + /** + * DOWNLOAD_FORMAT_PPROF pprof format + * + * @generated from protobuf enum value: FORMAT_PPROF = 1; + */ + PPROF = 1 +} // @generated message type with reflection information, may provide speed optimized methods class ProfileTypesRequest$Type extends MessageType { constructor() { @@ -2072,7 +2177,8 @@ class QueryRequest$Type extends MessageType { { no: 9, name: "source_reference", kind: "message", T: () => SourceReference }, { no: 10, name: "runtime_filter", kind: "message", T: () => RuntimeFilter }, { no: 11, name: "invert_call_stack", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }, - { no: 12, name: "filter", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Filter } + { no: 12, name: "filter", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Filter }, + { no: 13, name: "export_format", kind: "enum", opt: true, T: () => ["parca.query.v1alpha1.Format", Format, "FORMAT_"] } ]); } create(value?: PartialMessage): QueryRequest { @@ -2135,6 +2241,9 @@ class QueryRequest$Type extends MessageType { case /* repeated parca.query.v1alpha1.Filter filter */ 12: message.filter.push(Filter.internalBinaryRead(reader, reader.uint32(), options)); break; + case /* optional parca.query.v1alpha1.Format export_format */ 13: + message.exportFormat = reader.int32(); + break; default: let u = options.readUnknownField; if (u === "throw") @@ -2183,6 +2292,9 @@ class QueryRequest$Type extends MessageType { /* repeated parca.query.v1alpha1.Filter filter = 12; */ for (let i = 0; i < message.filter.length; i++) Filter.internalBinaryWrite(message.filter[i], writer.tag(12, WireType.LengthDelimited).fork(), options).join(); + /* optional parca.query.v1alpha1.Format export_format = 13; */ + if (message.exportFormat !== undefined) + writer.tag(13, WireType.Varint).int32(message.exportFormat); let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); @@ -3587,6 +3699,7 @@ class QueryResponse$Type extends MessageType { { no: 12, name: "source", kind: "message", oneof: "report", T: () => Source }, { no: 13, name: "table_arrow", kind: "message", oneof: "report", T: () => TableArrow }, { no: 14, name: "profile_metadata", kind: "message", oneof: "report", T: () => ProfileMetadata }, + { no: 15, name: "export", kind: "message", oneof: "report", T: () => Export }, { no: 9, name: "total", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, { no: 10, name: "filtered", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } ]); @@ -3653,6 +3766,12 @@ class QueryResponse$Type extends MessageType { profileMetadata: ProfileMetadata.internalBinaryRead(reader, reader.uint32(), options, (message.report as any).profileMetadata) }; break; + case /* parca.query.v1alpha1.Export export */ 15: + message.report = { + oneofKind: "export", + export: Export.internalBinaryRead(reader, reader.uint32(), options, (message.report as any).export) + }; + break; case /* int64 total */ 9: message.total = reader.int64().toBigInt(); break; @@ -3695,6 +3814,9 @@ class QueryResponse$Type extends MessageType { /* parca.query.v1alpha1.ProfileMetadata profile_metadata = 14; */ if (message.report.oneofKind === "profileMetadata") ProfileMetadata.internalBinaryWrite(message.report.profileMetadata, writer.tag(14, WireType.LengthDelimited).fork(), options).join(); + /* parca.query.v1alpha1.Export export = 15; */ + if (message.report.oneofKind === "export") + Export.internalBinaryWrite(message.report.export, writer.tag(15, WireType.LengthDelimited).fork(), options).join(); /* int64 total = 9; */ if (message.total !== 0n) writer.tag(9, WireType.Varint).int64(message.total); @@ -3712,6 +3834,168 @@ class QueryResponse$Type extends MessageType { */ export const QueryResponse = new QueryResponse$Type(); // @generated message type with reflection information, may provide speed optimized methods +class Export$Type extends MessageType { + constructor() { + super("parca.query.v1alpha1.Export", [ + { no: 1, name: "format", kind: "enum", T: () => ["parca.query.v1alpha1.Format", Format, "FORMAT_"] }, + { no: 2, name: "inline", kind: "message", oneof: "content", T: () => InlineExport }, + { no: 3, name: "url", kind: "message", oneof: "content", T: () => URLExport } + ]); + } + create(value?: PartialMessage): Export { + const message = globalThis.Object.create((this.messagePrototype!)); + message.format = 0; + message.content = { oneofKind: undefined }; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Export): Export { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* parca.query.v1alpha1.Format format */ 1: + message.format = reader.int32(); + break; + case /* parca.query.v1alpha1.InlineExport inline */ 2: + message.content = { + oneofKind: "inline", + inline: InlineExport.internalBinaryRead(reader, reader.uint32(), options, (message.content as any).inline) + }; + break; + case /* parca.query.v1alpha1.URLExport url */ 3: + message.content = { + oneofKind: "url", + url: URLExport.internalBinaryRead(reader, reader.uint32(), options, (message.content as any).url) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Export, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* parca.query.v1alpha1.Format format = 1; */ + if (message.format !== 0) + writer.tag(1, WireType.Varint).int32(message.format); + /* parca.query.v1alpha1.InlineExport inline = 2; */ + if (message.content.oneofKind === "inline") + InlineExport.internalBinaryWrite(message.content.inline, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* parca.query.v1alpha1.URLExport url = 3; */ + if (message.content.oneofKind === "url") + URLExport.internalBinaryWrite(message.content.url, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message parca.query.v1alpha1.Export + */ +export const Export = new Export$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class URLExport$Type extends MessageType { + constructor() { + super("parca.query.v1alpha1.URLExport", [ + { no: 1, name: "url", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): URLExport { + const message = globalThis.Object.create((this.messagePrototype!)); + message.url = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: URLExport): URLExport { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string url */ 1: + message.url = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: URLExport, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string url = 1; */ + if (message.url !== "") + writer.tag(1, WireType.LengthDelimited).string(message.url); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message parca.query.v1alpha1.URLExport + */ +export const URLExport = new URLExport$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class InlineExport$Type extends MessageType { + constructor() { + super("parca.query.v1alpha1.InlineExport", [ + { no: 1, name: "content", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): InlineExport { + const message = globalThis.Object.create((this.messagePrototype!)); + message.content = new Uint8Array(0); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: InlineExport): InlineExport { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes content */ 1: + message.content = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: InlineExport, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes content = 1; */ + if (message.content.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.content); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message parca.query.v1alpha1.InlineExport + */ +export const InlineExport = new InlineExport$Type(); +// @generated message type with reflection information, may provide speed optimized methods class SeriesRequest$Type extends MessageType { constructor() { super("parca.query.v1alpha1.SeriesRequest", [ diff --git a/ui/packages/shared/profile/src/ProfileViewWithData.tsx b/ui/packages/shared/profile/src/ProfileViewWithData.tsx index d1ad42793ee..06726184b01 100644 --- a/ui/packages/shared/profile/src/ProfileViewWithData.tsx +++ b/ui/packages/shared/profile/src/ProfileViewWithData.tsx @@ -15,7 +15,7 @@ import {useEffect, useMemo, useState} from 'react'; import {QueryRequest_ReportType, QueryServiceClient} from '@parca/client'; import {useGrpcMetadata, useParcaContext, useURLState} from '@parca/components'; -import {saveAsBlob, type NavigateFunction} from '@parca/utilities'; +import {saveAsBlob, saveUrlAs, type NavigateFunction} from '@parca/utilities'; import {FIELD_FUNCTION_NAME} from './ProfileIcicleGraph/IcicleGraphArrow'; import {ProfileSource} from './ProfileSource'; @@ -157,9 +157,22 @@ export const ProfileViewWithData = ({ try { setPprofDownloading(true); - const blob = await downloadPprof(profileSource.QueryRequest(), queryClient, metadata); - saveAsBlob(blob, `profile.pb.gz`); - setPprofDownloading(false); + const exp = await downloadPprof(profileSource.QueryRequest(), queryClient, metadata); + const filename = `profile.pb.gz`; + + if (exp.content.oneofKind === 'inline') { + const blob = new Blob([exp.content.inline.content], {type: 'application/octet-stream'}); + saveAsBlob(blob, filename); + setPprofDownloading(false); + return; + } + + if (exp.content.oneofKind === 'url') { + const url = exp.content.url.url; + saveUrlAs(url, filename); + setPprofDownloading(false); + return; + } } catch (error) { setPprofDownloading(false); console.error('Error while querying', error); diff --git a/ui/packages/shared/profile/src/utils.ts b/ui/packages/shared/profile/src/utils.ts index f1a22d98c77..061ec0b0f63 100644 --- a/ui/packages/shared/profile/src/utils.ts +++ b/ui/packages/shared/profile/src/utils.ts @@ -13,7 +13,7 @@ import type {RpcMetadata} from '@protobuf-ts/runtime-rpc'; -import {QueryRequest, QueryRequest_ReportType, QueryServiceClient} from '@parca/client'; +import {QueryRequest, QueryRequest_ReportType, Format, Export, QueryServiceClient} from '@parca/client'; export const hexifyAddress = (address?: bigint): string => { if (address == null) { @@ -26,22 +26,23 @@ export const downloadPprof = async ( request: QueryRequest, queryClient: QueryServiceClient, metadata: RpcMetadata -): Promise => { +): Promise => { const req = { ...request, - reportType: QueryRequest_ReportType.PPROF, + reportType: QueryRequest_ReportType.EXPORT, + exportFormat: Format.PPROF, }; const {response} = await queryClient.query(req, {meta: metadata}); - if (response.report.oneofKind !== 'pprof') { + if (response.report.oneofKind !== 'export') { throw new Error( - `Expected pprof report, got: ${ + `Expected export report, got: ${ response.report.oneofKind !== undefined ? response.report.oneofKind : 'undefined' }` ); } - const blob = new Blob([response.report.pprof], {type: 'application/octet-stream'}); - return blob; + + return response.report.export; }; export const truncateString = (str: string, num: number): string => { diff --git a/ui/packages/shared/utilities/src/index.ts b/ui/packages/shared/utilities/src/index.ts index 221c5505315..c106e03cda1 100644 --- a/ui/packages/shared/utilities/src/index.ts +++ b/ui/packages/shared/utilities/src/index.ts @@ -367,6 +367,13 @@ export const saveAsBlob = (blob: Blob, filename: string): void => { link.click(); }; +export const saveUrlAs = (url: string, filename: string): void => { + const link = document.createElement('a'); + link.href = url; + link.download = filename; + link.click(); +}; + export const sanitizeLabelValue = (labels: string[]): string[] => { return labels.map((value: string) => value.includes('\\') ? value.replaceAll('\\', '\\\\') : value From 4dc5e7d74445c7cc9b43009dca96a144904fecd0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 12:59:10 +0000 Subject: [PATCH 2/2] [pre-commit.ci lite] apply automatic fixes --- gen/proto/go/parca/query/v1alpha1/query.pb.go | 5 ++--- proto/buf.lock | 4 ++-- ui/packages/shared/profile/src/utils.ts | 8 +++++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gen/proto/go/parca/query/v1alpha1/query.pb.go b/gen/proto/go/parca/query/v1alpha1/query.pb.go index fb66f60d4e5..9173e8fcb76 100644 --- a/gen/proto/go/parca/query/v1alpha1/query.pb.go +++ b/gen/proto/go/parca/query/v1alpha1/query.pb.go @@ -7,9 +7,6 @@ package queryv1alpha1 import ( - reflect "reflect" - sync "sync" - v1alpha11 "github.com/parca-dev/parca/gen/proto/go/parca/metastore/v1alpha1" v1alpha1 "github.com/parca-dev/parca/gen/proto/go/parca/profilestore/v1alpha1" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -17,6 +14,8 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) const ( diff --git a/proto/buf.lock b/proto/buf.lock index 52c16bc128a..34b627f3754 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -4,10 +4,10 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: bec0f0b526624d66af9e5cd771efe9a9 + commit: f0e53af8f2fc4556b94f482688b57223 digest: shake256:de26a277fc28b8b411ecf58729d78d32fcf15090ffd998a4469225b17889bfb51442eaab04bb7a8d88d203ecdf0a9febd4ffd52c18ed1c2229160c7bd353ca95 - remote: buf.build owner: grpc-ecosystem repository: grpc-gateway - commit: fff35d47bf314175b476c0dd34b20da7 + commit: f04e50c23f5f40f786d0e8fa3fe3d713 digest: shake256:67b115260e12cb2d6c5d5ce8dbbf3a095c86f0e52b84f9dbd16dec9433b218f8694bc9aadb1d45eb6fd52f5a7029977d460e2d58afb3208ab6c680e7b21c80e4 diff --git a/ui/packages/shared/profile/src/utils.ts b/ui/packages/shared/profile/src/utils.ts index 061ec0b0f63..9c08daa3576 100644 --- a/ui/packages/shared/profile/src/utils.ts +++ b/ui/packages/shared/profile/src/utils.ts @@ -13,7 +13,13 @@ import type {RpcMetadata} from '@protobuf-ts/runtime-rpc'; -import {QueryRequest, QueryRequest_ReportType, Format, Export, QueryServiceClient} from '@parca/client'; +import { + Export, + Format, + QueryRequest, + QueryRequest_ReportType, + QueryServiceClient, +} from '@parca/client'; export const hexifyAddress = (address?: bigint): string => { if (address == null) {