From 8cf833afa7cec9bcdf8f8f4e999687eb1b7e62de Mon Sep 17 00:00:00 2001 From: Sven Grossmann Date: Mon, 6 May 2024 15:26:07 +0200 Subject: [PATCH 1/4] feat(detectedFields): change parser prop to be array --- pkg/logproto/logproto.pb.go | 381 ++++++++++++++-------------- pkg/logproto/logproto.proto | 2 +- pkg/querier/querier.go | 26 +- pkg/storage/detected/fields.go | 28 +- pkg/storage/detected/fields_test.go | 28 +- 5 files changed, 253 insertions(+), 212 deletions(-) diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go index ac9bd37a06186..5ba5e49c1060b 100644 --- a/pkg/logproto/logproto.pb.go +++ b/pkg/logproto/logproto.pb.go @@ -2818,7 +2818,7 @@ type DetectedField struct { Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` Type DetectedFieldType `protobuf:"bytes,2,opt,name=type,proto3,casttype=DetectedFieldType" json:"type,omitempty"` Cardinality uint64 `protobuf:"varint,3,opt,name=cardinality,proto3" json:"cardinality,omitempty"` - Parser string `protobuf:"bytes,4,opt,name=parser,proto3" json:"parser,omitempty"` + Parsers []string `protobuf:"bytes,4,rep,name=parsers,proto3" json:"parsers,omitempty"` Sketch []byte `protobuf:"bytes,5,opt,name=sketch,proto3" json:"sketch,omitempty"` } @@ -2875,11 +2875,11 @@ func (m *DetectedField) GetCardinality() uint64 { return 0 } -func (m *DetectedField) GetParser() string { +func (m *DetectedField) GetParsers() []string { if m != nil { - return m.Parser + return m.Parsers } - return "" + return nil } func (m *DetectedField) GetSketch() []byte { @@ -3105,174 +3105,174 @@ func init() { func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) } var fileDescriptor_c28a5f14f1f4c79a = []byte{ - // 2671 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x8c, 0x1b, 0x57, - 0xd9, 0x63, 0x8f, 0xbd, 0xf6, 0x67, 0xef, 0x66, 0xf3, 0xd6, 0x49, 0xac, 0x4d, 0xea, 0xd9, 0x3e, - 0x41, 0x1b, 0x9a, 0x74, 0xdd, 0xa4, 0xb4, 0xa4, 0x29, 0xa5, 0xc4, 0xbb, 0xcd, 0x36, 0xe9, 0x36, - 0x4d, 0xdf, 0xa6, 0x69, 0x41, 0x54, 0xd5, 0xc4, 0x7e, 0xeb, 0x1d, 0xc5, 0x9e, 0x71, 0x66, 0x9e, - 0x9b, 0xee, 0x0d, 0x89, 0x33, 0xa2, 0x12, 0x07, 0xe0, 0x82, 0x84, 0x84, 0x04, 0x02, 0xf5, 0x82, - 0x38, 0x70, 0x40, 0x70, 0xe1, 0x50, 0x6e, 0xe5, 0x56, 0xf5, 0x60, 0xe8, 0xf6, 0x82, 0xf6, 0x54, - 0x09, 0x89, 0x43, 0x4f, 0xe8, 0xfd, 0xcd, 0xbc, 0x99, 0xb5, 0x49, 0xbd, 0x0d, 0x2a, 0xb9, 0xd8, - 0xf3, 0xbe, 0xf7, 0xbd, 0xef, 0xbd, 0xef, 0xe7, 0x7d, 0x7f, 0x33, 0x70, 0x72, 0x78, 0xbb, 0xd7, - 0xea, 0x07, 0xbd, 0x61, 0x18, 0xb0, 0x20, 0x7e, 0x58, 0x15, 0xbf, 0xa8, 0xac, 0xc7, 0xcb, 0xf5, - 0x5e, 0xd0, 0x0b, 0x24, 0x0e, 0x7f, 0x92, 0xf3, 0xcb, 0x4e, 0x2f, 0x08, 0x7a, 0x7d, 0xda, 0x12, - 0xa3, 0x5b, 0xa3, 0xed, 0x16, 0xf3, 0x06, 0x34, 0x62, 0xee, 0x60, 0xa8, 0x10, 0x56, 0x14, 0xf5, - 0x3b, 0xfd, 0x41, 0xd0, 0xa5, 0xfd, 0x56, 0xc4, 0x5c, 0x16, 0xc9, 0x5f, 0x85, 0xb1, 0xc4, 0x31, - 0x86, 0xa3, 0x68, 0x47, 0xfc, 0x48, 0x20, 0xfe, 0xbd, 0x05, 0xc7, 0x36, 0xdd, 0x5b, 0xb4, 0x7f, - 0x23, 0xb8, 0xe9, 0xf6, 0x47, 0x34, 0x22, 0x34, 0x1a, 0x06, 0x7e, 0x44, 0xd1, 0x1a, 0x94, 0xfa, - 0x7c, 0x22, 0x6a, 0x58, 0x2b, 0x85, 0xd3, 0xd5, 0xf3, 0x67, 0x56, 0xe3, 0x23, 0x4f, 0x5c, 0x20, - 0xa1, 0xd1, 0x0b, 0x3e, 0x0b, 0x77, 0x89, 0x5a, 0xba, 0x7c, 0x13, 0xaa, 0x06, 0x18, 0x2d, 0x42, - 0xe1, 0x36, 0xdd, 0x6d, 0x58, 0x2b, 0xd6, 0xe9, 0x0a, 0xe1, 0x8f, 0xe8, 0x1c, 0x14, 0xdf, 0xe6, - 0x64, 0x1a, 0xf9, 0x15, 0xeb, 0x74, 0xf5, 0xfc, 0xc9, 0x64, 0x93, 0xd7, 0x7c, 0xef, 0xce, 0x88, - 0x8a, 0xd5, 0x6a, 0x23, 0x89, 0x79, 0x31, 0x7f, 0xc1, 0xc2, 0x67, 0xe0, 0xe8, 0x81, 0x79, 0x74, - 0x1c, 0x4a, 0x02, 0x43, 0x9e, 0xb8, 0x42, 0xd4, 0x08, 0xd7, 0x01, 0x6d, 0xb1, 0x90, 0xba, 0x03, - 0xe2, 0x32, 0x7e, 0xde, 0x3b, 0x23, 0x1a, 0x31, 0xfc, 0x32, 0x2c, 0xa5, 0xa0, 0x8a, 0xed, 0xa7, - 0xa1, 0x1a, 0x25, 0x60, 0xc5, 0x7b, 0x3d, 0x39, 0x56, 0xb2, 0x86, 0x98, 0x88, 0xf8, 0xe7, 0x16, - 0x40, 0x32, 0x87, 0x9a, 0x00, 0x72, 0xf6, 0x45, 0x37, 0xda, 0x11, 0x0c, 0xdb, 0xc4, 0x80, 0xa0, - 0xb3, 0x70, 0x34, 0x19, 0x5d, 0x0b, 0xb6, 0x76, 0xdc, 0xb0, 0x2b, 0x64, 0x60, 0x93, 0x83, 0x13, - 0x08, 0x81, 0x1d, 0xba, 0x8c, 0x36, 0x0a, 0x2b, 0xd6, 0xe9, 0x02, 0x11, 0xcf, 0x9c, 0x5b, 0x46, - 0x7d, 0xd7, 0x67, 0x0d, 0x5b, 0x88, 0x53, 0x8d, 0x38, 0x9c, 0xeb, 0x97, 0x46, 0x8d, 0xe2, 0x8a, - 0x75, 0x7a, 0x9e, 0xa8, 0x11, 0xfe, 0x77, 0x01, 0x6a, 0xaf, 0x8e, 0x68, 0xb8, 0xab, 0x04, 0x80, - 0x9a, 0x50, 0x8e, 0x68, 0x9f, 0x76, 0x58, 0x10, 0x4a, 0x8d, 0xb4, 0xf3, 0x0d, 0x8b, 0xc4, 0x30, - 0x54, 0x87, 0x62, 0xdf, 0x1b, 0x78, 0x4c, 0x1c, 0x6b, 0x9e, 0xc8, 0x01, 0xba, 0x08, 0xc5, 0x88, - 0xb9, 0x21, 0x13, 0x67, 0xa9, 0x9e, 0x5f, 0x5e, 0x95, 0x86, 0xb9, 0xaa, 0x0d, 0x73, 0xf5, 0x86, - 0x36, 0xcc, 0x76, 0xf9, 0xfd, 0xb1, 0x93, 0x7b, 0xf7, 0xef, 0x8e, 0x45, 0xe4, 0x12, 0xf4, 0x34, - 0x14, 0xa8, 0xdf, 0x15, 0xe7, 0xfd, 0xbc, 0x2b, 0xf9, 0x02, 0x74, 0x0e, 0x2a, 0x5d, 0x2f, 0xa4, - 0x1d, 0xe6, 0x05, 0xbe, 0xe0, 0x6a, 0xe1, 0xfc, 0x52, 0xa2, 0x91, 0x75, 0x3d, 0x45, 0x12, 0x2c, - 0x74, 0x16, 0x4a, 0x11, 0x17, 0x5d, 0xd4, 0x98, 0xe3, 0xb6, 0xd0, 0xae, 0xef, 0x8f, 0x9d, 0x45, - 0x09, 0x39, 0x1b, 0x0c, 0x3c, 0x46, 0x07, 0x43, 0xb6, 0x4b, 0x14, 0x0e, 0x7a, 0x0c, 0xe6, 0xba, - 0xb4, 0x4f, 0xb9, 0xc2, 0xcb, 0x42, 0xe1, 0x8b, 0x06, 0x79, 0x31, 0x41, 0x34, 0x02, 0x7a, 0x13, - 0xec, 0x61, 0xdf, 0xf5, 0x1b, 0x15, 0xc1, 0xc5, 0x42, 0x82, 0x78, 0xbd, 0xef, 0xfa, 0xed, 0x67, - 0x3e, 0x1a, 0x3b, 0x4f, 0xf5, 0x3c, 0xb6, 0x33, 0xba, 0xb5, 0xda, 0x09, 0x06, 0xad, 0x5e, 0xe8, - 0x6e, 0xbb, 0xbe, 0xdb, 0xea, 0x07, 0xb7, 0xbd, 0xd6, 0xdb, 0x4f, 0xb6, 0xf8, 0x1d, 0xbc, 0x33, - 0xa2, 0xa1, 0x47, 0xc3, 0x16, 0x27, 0xb3, 0x2a, 0x54, 0xc2, 0x97, 0x12, 0x41, 0x16, 0x5d, 0xe5, - 0xf6, 0x17, 0x84, 0x74, 0x6d, 0x67, 0xe4, 0xdf, 0x8e, 0x1a, 0x20, 0x76, 0x39, 0x91, 0xec, 0x22, - 0xe0, 0x84, 0x6e, 0x6f, 0x84, 0xc1, 0x68, 0xd8, 0x3e, 0xb2, 0x3f, 0x76, 0x4c, 0x7c, 0x62, 0x0e, - 0xae, 0xda, 0xe5, 0xd2, 0xe2, 0x1c, 0x7e, 0xaf, 0x00, 0x68, 0xcb, 0x1d, 0x0c, 0xfb, 0x74, 0x26, - 0xf5, 0xc7, 0x8a, 0xce, 0x1f, 0x5a, 0xd1, 0x85, 0x59, 0x15, 0x9d, 0x68, 0xcd, 0x9e, 0x4d, 0x6b, - 0xc5, 0xcf, 0xab, 0xb5, 0xd2, 0xff, 0xbd, 0xd6, 0x70, 0x03, 0x6c, 0x4e, 0x99, 0x3b, 0xcb, 0xd0, - 0xbd, 0x2b, 0x74, 0x53, 0x23, 0xfc, 0x11, 0x6f, 0x42, 0x49, 0xf2, 0x85, 0x96, 0xb3, 0xca, 0x4b, - 0xdf, 0xdb, 0x44, 0x71, 0x05, 0xad, 0x92, 0xc5, 0x44, 0x25, 0x05, 0x21, 0x6c, 0xfc, 0x47, 0x0b, - 0xe6, 0x95, 0x45, 0x28, 0xdf, 0x77, 0x0b, 0xe6, 0xa4, 0xef, 0xd1, 0x7e, 0xef, 0x44, 0xd6, 0xef, - 0x5d, 0xea, 0xba, 0x43, 0x46, 0xc3, 0x76, 0xeb, 0xfd, 0xb1, 0x63, 0x7d, 0x34, 0x76, 0x1e, 0x9d, - 0x26, 0x34, 0x1d, 0x6b, 0xb4, 0xbf, 0xd4, 0x84, 0xd1, 0x19, 0x71, 0x3a, 0x16, 0x29, 0xb3, 0x3a, - 0xb2, 0x2a, 0x43, 0xd4, 0x15, 0xbf, 0x47, 0x23, 0x4e, 0xd9, 0xe6, 0x16, 0x41, 0x24, 0x0e, 0x67, - 0xf3, 0xae, 0x1b, 0xfa, 0x9e, 0xdf, 0x8b, 0x1a, 0x05, 0xe1, 0xd3, 0xe3, 0x31, 0xfe, 0xa9, 0x05, - 0x4b, 0x29, 0xb3, 0x56, 0x4c, 0x5c, 0x80, 0x52, 0xc4, 0x35, 0xa5, 0x79, 0x30, 0x8c, 0x62, 0x4b, - 0xc0, 0xdb, 0x0b, 0xea, 0xf0, 0x25, 0x39, 0x26, 0x0a, 0xff, 0xfe, 0x1d, 0xed, 0x2f, 0x16, 0xd4, - 0x44, 0x60, 0xd2, 0x77, 0x0d, 0x81, 0xed, 0xbb, 0x03, 0xaa, 0x54, 0x25, 0x9e, 0x8d, 0x68, 0xc5, - 0xb7, 0x2b, 0xeb, 0x68, 0x35, 0xab, 0x83, 0xb5, 0x0e, 0xed, 0x60, 0xad, 0xe4, 0xde, 0xd5, 0xa1, - 0xc8, 0xcd, 0x7b, 0x57, 0x38, 0xd7, 0x0a, 0x91, 0x03, 0xfc, 0x28, 0xcc, 0x2b, 0x2e, 0x94, 0x68, - 0xa7, 0x05, 0xd8, 0x01, 0x94, 0xa4, 0x26, 0xd0, 0x57, 0xa0, 0x12, 0x27, 0x26, 0x82, 0xdb, 0x42, - 0xbb, 0xb4, 0x3f, 0x76, 0xf2, 0x2c, 0x22, 0xc9, 0x04, 0x72, 0xcc, 0xa0, 0x6f, 0xb5, 0x2b, 0xfb, - 0x63, 0x47, 0x02, 0x54, 0x88, 0x47, 0xa7, 0xc0, 0xde, 0xe1, 0x71, 0x93, 0x8b, 0xc0, 0x6e, 0x97, - 0xf7, 0xc7, 0x8e, 0x18, 0x13, 0xf1, 0x8b, 0x37, 0xa0, 0xb6, 0x49, 0x7b, 0x6e, 0x67, 0x57, 0x6d, - 0x5a, 0xd7, 0xe4, 0xf8, 0x86, 0x96, 0xa6, 0xf1, 0x30, 0xd4, 0xe2, 0x1d, 0xdf, 0x1a, 0x44, 0xea, - 0x36, 0x54, 0x63, 0xd8, 0xcb, 0x11, 0xfe, 0x99, 0x05, 0xca, 0x06, 0x10, 0x36, 0xb2, 0x1d, 0xee, - 0x0b, 0x61, 0x7f, 0xec, 0x28, 0x88, 0x4e, 0x66, 0xd0, 0xb3, 0x30, 0x17, 0x89, 0x1d, 0x39, 0xb1, - 0xac, 0x69, 0x89, 0x89, 0xf6, 0x11, 0x6e, 0x22, 0xfb, 0x63, 0x47, 0x23, 0x12, 0xfd, 0x80, 0x56, - 0x53, 0x09, 0x81, 0x64, 0x6c, 0x61, 0x7f, 0xec, 0x18, 0x50, 0x33, 0x41, 0xc0, 0x9f, 0x59, 0x50, - 0xbd, 0xe1, 0x7a, 0xb1, 0x09, 0x35, 0xb4, 0x8a, 0x12, 0x5f, 0x2d, 0x01, 0xdc, 0x12, 0xbb, 0xb4, - 0xef, 0xee, 0x5e, 0x0e, 0x42, 0x41, 0x77, 0x9e, 0xc4, 0xe3, 0x24, 0x86, 0xdb, 0x13, 0x63, 0x78, - 0x71, 0x76, 0xd7, 0xfe, 0xbf, 0x75, 0xa4, 0x57, 0xed, 0x72, 0x7e, 0xb1, 0x80, 0xdf, 0xb3, 0xa0, - 0x26, 0x99, 0x57, 0x96, 0xf7, 0x3d, 0x28, 0x49, 0xd9, 0x08, 0xf6, 0xff, 0x8b, 0x63, 0x3a, 0x33, - 0x8b, 0x53, 0x52, 0x34, 0xd1, 0xf3, 0xb0, 0xd0, 0x0d, 0x83, 0xe1, 0x90, 0x76, 0xb7, 0x94, 0xfb, - 0xcb, 0x67, 0xdd, 0xdf, 0xba, 0x39, 0x4f, 0x32, 0xe8, 0xf8, 0xaf, 0x16, 0xcc, 0x2b, 0x67, 0xa2, - 0xd4, 0x15, 0x8b, 0xd8, 0x3a, 0x74, 0xf4, 0xcc, 0xcf, 0x1a, 0x3d, 0x8f, 0x43, 0xa9, 0xc7, 0xe3, - 0x8b, 0x76, 0x48, 0x6a, 0x34, 0x5b, 0x54, 0xc5, 0x57, 0x61, 0x41, 0xb3, 0x32, 0xc5, 0xa3, 0x2e, - 0x67, 0x3d, 0xea, 0x95, 0x2e, 0xf5, 0x99, 0xb7, 0xed, 0xc5, 0x3e, 0x52, 0xe1, 0xe3, 0x1f, 0x59, - 0xb0, 0x98, 0x45, 0x41, 0xeb, 0x99, 0xc2, 0xe2, 0x91, 0xe9, 0xe4, 0xcc, 0x9a, 0x42, 0x93, 0x56, - 0x95, 0xc5, 0x53, 0xf7, 0xaa, 0x2c, 0xea, 0xa6, 0x93, 0xa9, 0x28, 0xaf, 0x80, 0x7f, 0x62, 0xc1, - 0x7c, 0x4a, 0x97, 0xe8, 0x02, 0xd8, 0xdb, 0x61, 0x30, 0x98, 0x49, 0x51, 0x62, 0x05, 0xfa, 0x3a, - 0xe4, 0x59, 0x30, 0x93, 0x9a, 0xf2, 0x2c, 0xe0, 0x5a, 0x52, 0xec, 0x17, 0x64, 0xde, 0x2e, 0x47, - 0xf8, 0x29, 0xa8, 0x08, 0x86, 0xae, 0xbb, 0x5e, 0x38, 0x31, 0x60, 0x4c, 0x66, 0xe8, 0x59, 0x38, - 0x22, 0x9d, 0xe1, 0xe4, 0xc5, 0xb5, 0x49, 0x8b, 0x6b, 0x7a, 0xf1, 0x49, 0x28, 0x8a, 0xa4, 0x83, - 0x2f, 0xe9, 0xba, 0xcc, 0xd5, 0x4b, 0xf8, 0x33, 0x3e, 0x06, 0x4b, 0xfc, 0x0e, 0xd2, 0x30, 0x5a, - 0x0b, 0x46, 0x3e, 0xd3, 0x75, 0xd3, 0x59, 0xa8, 0xa7, 0xc1, 0xca, 0x4a, 0xea, 0x50, 0xec, 0x70, - 0x80, 0xa0, 0x31, 0x4f, 0xe4, 0x00, 0xff, 0xd2, 0x02, 0xb4, 0x41, 0x99, 0xd8, 0xe5, 0xca, 0x7a, - 0x7c, 0x3d, 0x96, 0xa1, 0x3c, 0x70, 0x59, 0x67, 0x87, 0x86, 0x91, 0xce, 0x5f, 0xf4, 0xf8, 0xcb, - 0x48, 0x3c, 0xf1, 0x39, 0x58, 0x4a, 0x9d, 0x52, 0xf1, 0xb4, 0x0c, 0xe5, 0x8e, 0x82, 0xa9, 0x90, - 0x17, 0x8f, 0xf1, 0xef, 0xf2, 0x50, 0xd6, 0x69, 0x1d, 0x3a, 0x07, 0xd5, 0x6d, 0xcf, 0xef, 0xd1, - 0x70, 0x18, 0x7a, 0x4a, 0x04, 0xb6, 0x4c, 0xf3, 0x0c, 0x30, 0x31, 0x07, 0xe8, 0x71, 0x98, 0x1b, - 0x45, 0x34, 0x7c, 0xcb, 0x93, 0x37, 0xbd, 0xd2, 0xae, 0xef, 0x8d, 0x9d, 0xd2, 0x6b, 0x11, 0x0d, - 0xaf, 0xac, 0xf3, 0xe0, 0x33, 0x12, 0x4f, 0x44, 0xfe, 0x77, 0xd1, 0x4b, 0xca, 0x4c, 0x45, 0x02, - 0xd7, 0xfe, 0x06, 0x3f, 0x7e, 0xc6, 0xd5, 0x0d, 0xc3, 0x60, 0x40, 0xd9, 0x0e, 0x1d, 0x45, 0xad, - 0x4e, 0x30, 0x18, 0x04, 0x7e, 0x4b, 0x74, 0x02, 0x04, 0xd3, 0x3c, 0x82, 0xf2, 0xe5, 0xca, 0x72, - 0x6f, 0xc0, 0x1c, 0xdb, 0x09, 0x83, 0x51, 0x6f, 0x47, 0x04, 0x86, 0x42, 0xfb, 0xe2, 0xec, 0xf4, - 0x34, 0x05, 0xa2, 0x1f, 0xd0, 0xc3, 0x5c, 0x5a, 0xb4, 0x73, 0x3b, 0x1a, 0x0d, 0x64, 0xed, 0xd9, - 0x2e, 0xee, 0x8f, 0x1d, 0xeb, 0x71, 0x12, 0x83, 0xf1, 0x25, 0x98, 0x4f, 0xa5, 0xc2, 0xe8, 0x09, - 0xb0, 0x43, 0xba, 0xad, 0x5d, 0x01, 0x3a, 0x98, 0x31, 0xcb, 0xe8, 0xcf, 0x71, 0x88, 0xf8, 0xc5, - 0x3f, 0xcc, 0x83, 0x63, 0x54, 0xfd, 0x97, 0x83, 0xf0, 0x65, 0xca, 0x42, 0xaf, 0x73, 0xcd, 0x1d, - 0x50, 0x6d, 0x5e, 0x0e, 0x54, 0x07, 0x02, 0xf8, 0x96, 0x71, 0x8b, 0x60, 0x10, 0xe3, 0xa1, 0x87, - 0x00, 0xc4, 0xb5, 0x93, 0xf3, 0xf2, 0x42, 0x55, 0x04, 0x44, 0x4c, 0xaf, 0xa5, 0x84, 0xdd, 0x9a, - 0x51, 0x38, 0x4a, 0xc8, 0x57, 0xb2, 0x42, 0x9e, 0x99, 0x4e, 0x2c, 0x59, 0xf3, 0xba, 0x14, 0xd3, - 0xd7, 0x05, 0xff, 0xcd, 0x82, 0xe6, 0xa6, 0x3e, 0xf9, 0x21, 0xc5, 0xa1, 0xf9, 0xcd, 0xdf, 0x27, - 0x7e, 0x0b, 0x5f, 0x8c, 0x5f, 0xdc, 0x04, 0xd8, 0xf4, 0x7c, 0x7a, 0xd9, 0xeb, 0x33, 0x1a, 0x4e, - 0x28, 0x84, 0x7e, 0x5c, 0x48, 0xbc, 0x0a, 0xa1, 0xdb, 0x9a, 0xcf, 0x35, 0xc3, 0x95, 0xdf, 0x0f, - 0x36, 0xf2, 0xf7, 0x51, 0x6d, 0x85, 0x8c, 0x97, 0xf3, 0x61, 0x6e, 0x5b, 0xb0, 0x27, 0xa3, 0x72, - 0xaa, 0xc7, 0x94, 0xf0, 0xde, 0xfe, 0x96, 0xda, 0xfc, 0xe9, 0x7b, 0x24, 0x55, 0xa2, 0xf3, 0xd7, - 0x8a, 0x76, 0x7d, 0xe6, 0xbe, 0x63, 0xac, 0x27, 0x7a, 0x13, 0xe4, 0xaa, 0xbc, 0xad, 0x38, 0x31, - 0x6f, 0x7b, 0x4e, 0x6d, 0xf3, 0x45, 0x72, 0x37, 0xfc, 0x5c, 0xe2, 0x44, 0x85, 0x52, 0x94, 0x13, - 0x7d, 0xe4, 0x5e, 0x57, 0x5c, 0x5d, 0xec, 0x3f, 0x59, 0xb0, 0xb8, 0x41, 0x59, 0x3a, 0x8f, 0x7a, - 0x80, 0x54, 0x8a, 0x5f, 0x84, 0xa3, 0xc6, 0xf9, 0x15, 0xf7, 0x4f, 0x66, 0x92, 0xa7, 0x63, 0x09, - 0xff, 0x57, 0xfc, 0x2e, 0x7d, 0x47, 0xd5, 0xa4, 0xe9, 0xbc, 0xe9, 0x3a, 0x54, 0x8d, 0x49, 0x74, - 0x29, 0x93, 0x31, 0x2d, 0x65, 0x5a, 0xb1, 0x3c, 0xea, 0xb7, 0xeb, 0x8a, 0x27, 0x59, 0x79, 0xaa, - 0x7c, 0x38, 0xce, 0x2e, 0xb6, 0x00, 0x09, 0x75, 0x09, 0xb2, 0x66, 0x7c, 0x13, 0xd0, 0x97, 0xe2, - 0xd4, 0x29, 0x1e, 0xa3, 0x87, 0xc1, 0x0e, 0x83, 0xbb, 0x3a, 0x15, 0x9e, 0x4f, 0xb6, 0x24, 0xc1, - 0x5d, 0x22, 0xa6, 0xf0, 0xb3, 0x50, 0x20, 0xc1, 0x5d, 0xd4, 0x04, 0x08, 0x5d, 0xbf, 0x47, 0x6f, - 0xc6, 0x45, 0x58, 0x8d, 0x18, 0x90, 0x29, 0xb9, 0xc7, 0x1a, 0x1c, 0x35, 0x4f, 0x24, 0xd5, 0xbd, - 0x0a, 0x73, 0xaf, 0x8e, 0x4c, 0x71, 0xd5, 0x33, 0xe2, 0x92, 0xb5, 0xbe, 0x46, 0xe2, 0x36, 0x03, - 0x09, 0x1c, 0x9d, 0x82, 0x0a, 0x73, 0x6f, 0xf5, 0xe9, 0xb5, 0xc4, 0xcd, 0x25, 0x00, 0x3e, 0xcb, - 0xeb, 0xc7, 0x9b, 0x46, 0x12, 0x95, 0x00, 0xd0, 0x63, 0xb0, 0x98, 0x9c, 0xf9, 0x7a, 0x48, 0xb7, - 0xbd, 0x77, 0x84, 0x86, 0x6b, 0xe4, 0x00, 0x1c, 0x9d, 0x86, 0x23, 0x09, 0x6c, 0x4b, 0x24, 0x2b, - 0xb6, 0x40, 0xcd, 0x82, 0xb9, 0x6c, 0x04, 0xbb, 0x2f, 0xdc, 0x19, 0xb9, 0x7d, 0x71, 0xf9, 0x6a, - 0xc4, 0x80, 0xe0, 0x3f, 0x5b, 0x70, 0x54, 0xaa, 0x9a, 0xb9, 0xec, 0x81, 0xb4, 0xfa, 0x5f, 0x59, - 0x80, 0x4c, 0x0e, 0x94, 0x69, 0x7d, 0xd5, 0xec, 0x25, 0xf1, 0x6c, 0xa8, 0x2a, 0xca, 0x62, 0x09, - 0x4a, 0xda, 0x41, 0x18, 0x4a, 0x1d, 0xd9, 0x33, 0x13, 0xcd, 0x6f, 0x59, 0x77, 0x4b, 0x08, 0x51, - 0xff, 0xc8, 0x81, 0xe2, 0xad, 0x5d, 0x46, 0x23, 0x55, 0x35, 0x8b, 0x76, 0x81, 0x00, 0x10, 0xf9, - 0xc7, 0xf7, 0xa2, 0x3e, 0x13, 0x56, 0x63, 0x27, 0x7b, 0x29, 0x10, 0xd1, 0x0f, 0xf8, 0xb7, 0x79, - 0x98, 0xbf, 0x19, 0xf4, 0x47, 0x49, 0x60, 0x7c, 0x90, 0x02, 0x46, 0xaa, 0x94, 0x2f, 0xea, 0x52, - 0x1e, 0x81, 0x1d, 0x31, 0x3a, 0x14, 0x96, 0x55, 0x20, 0xe2, 0x19, 0x61, 0xa8, 0x31, 0x37, 0xec, - 0x51, 0x26, 0x0b, 0xa4, 0x46, 0x49, 0x64, 0xae, 0x29, 0x18, 0x5a, 0x81, 0xaa, 0xdb, 0xeb, 0x85, - 0xb4, 0xe7, 0x32, 0xda, 0xde, 0x6d, 0xcc, 0x89, 0xcd, 0x4c, 0x10, 0x7e, 0x03, 0x16, 0xb4, 0xb0, - 0x94, 0x4a, 0x9f, 0x80, 0xb9, 0xb7, 0x05, 0x64, 0x42, 0x6b, 0x4d, 0xa2, 0x2a, 0x37, 0xa6, 0xd1, - 0xd2, 0xaf, 0x10, 0xf4, 0x99, 0xf1, 0x55, 0x28, 0x49, 0x74, 0x74, 0xca, 0x2c, 0x73, 0x64, 0xa6, - 0xc7, 0xc7, 0xaa, 0x66, 0xc1, 0x50, 0x92, 0x84, 0x94, 0xe2, 0x85, 0x6d, 0x48, 0x08, 0x51, 0xff, - 0xf8, 0x5f, 0x16, 0x1c, 0x5b, 0xa7, 0x8c, 0x76, 0x18, 0xed, 0x5e, 0xf6, 0x68, 0xbf, 0xfb, 0xa5, - 0x56, 0xe0, 0x71, 0x1f, 0xad, 0x60, 0xf4, 0xd1, 0xb8, 0xdf, 0xe9, 0x7b, 0x3e, 0xdd, 0x34, 0x1a, - 0x31, 0x09, 0x80, 0x7b, 0x88, 0x6d, 0x7e, 0x70, 0x39, 0x2d, 0xdf, 0xd9, 0x18, 0x90, 0x58, 0xc3, - 0xa5, 0x44, 0xc3, 0xf8, 0x07, 0x16, 0x1c, 0xcf, 0x72, 0xad, 0x94, 0xd4, 0x82, 0x92, 0x58, 0x3c, - 0xa1, 0x85, 0x9b, 0x5a, 0x41, 0x14, 0x1a, 0xba, 0x90, 0xda, 0x5f, 0xbc, 0xeb, 0x69, 0x37, 0xf6, - 0xc7, 0x4e, 0x3d, 0x81, 0x1a, 0x5d, 0x02, 0x03, 0x17, 0xff, 0x81, 0xd7, 0xd2, 0x26, 0x4d, 0xa1, - 0x6f, 0x6e, 0x5f, 0xca, 0xf7, 0xca, 0x01, 0xfa, 0x1a, 0xd8, 0x6c, 0x77, 0xa8, 0x5c, 0x6e, 0xfb, - 0xd8, 0x67, 0x63, 0xe7, 0x68, 0x6a, 0xd9, 0x8d, 0xdd, 0x21, 0x25, 0x02, 0x85, 0x9b, 0x65, 0xc7, - 0x0d, 0xbb, 0x9e, 0xef, 0xf6, 0x3d, 0x26, 0xc5, 0x68, 0x13, 0x13, 0x24, 0x5e, 0x6f, 0xb9, 0x61, - 0x44, 0x43, 0xfd, 0xda, 0x4b, 0x8e, 0x44, 0x93, 0xe3, 0x36, 0x65, 0x9d, 0x1d, 0xe9, 0x64, 0x55, - 0x93, 0x43, 0x40, 0x52, 0x4d, 0x0e, 0x01, 0xc1, 0xbf, 0x30, 0xcc, 0x46, 0xde, 0x88, 0x43, 0x9a, - 0x8d, 0x75, 0x68, 0xb3, 0xb1, 0xee, 0x61, 0x36, 0xf8, 0x3b, 0x89, 0x8e, 0xf5, 0x11, 0x95, 0x8e, - 0x9f, 0x87, 0x85, 0x6e, 0x6a, 0x66, 0xba, 0xae, 0x65, 0x03, 0x37, 0x83, 0x8e, 0x37, 0x12, 0xc5, - 0x09, 0xc8, 0x14, 0xc5, 0x65, 0xb4, 0x91, 0x3f, 0xa0, 0x8d, 0xc7, 0x1e, 0x81, 0x4a, 0xfc, 0xfa, - 0x0d, 0x55, 0x61, 0xee, 0xf2, 0x2b, 0xe4, 0xf5, 0x4b, 0x64, 0x7d, 0x31, 0x87, 0x6a, 0x50, 0x6e, - 0x5f, 0x5a, 0x7b, 0x49, 0x8c, 0xac, 0xf3, 0xbf, 0x29, 0xe9, 0xc0, 0x1e, 0xa2, 0x6f, 0x42, 0x51, - 0x46, 0xeb, 0xe3, 0xc9, 0x71, 0xcd, 0x37, 0x53, 0xcb, 0x27, 0x0e, 0xc0, 0x25, 0xdf, 0x38, 0xf7, - 0x84, 0x85, 0xae, 0x41, 0x55, 0x00, 0x55, 0xef, 0xf7, 0x54, 0xb6, 0x05, 0x9b, 0xa2, 0xf4, 0xd0, - 0x94, 0x59, 0x83, 0xde, 0x45, 0x28, 0x4a, 0x11, 0x1c, 0xcf, 0x24, 0x55, 0x13, 0x4e, 0x93, 0xea, - 0x86, 0xe3, 0x1c, 0x7a, 0x06, 0xec, 0x1b, 0xae, 0xd7, 0x47, 0x46, 0x4e, 0x67, 0xb4, 0x6c, 0x97, - 0x8f, 0x67, 0xc1, 0xc6, 0xb6, 0xcf, 0xc5, 0x9d, 0xe7, 0x13, 0xd9, 0xf6, 0x97, 0x5e, 0xde, 0x38, - 0x38, 0x11, 0xef, 0xfc, 0x8a, 0xec, 0x8f, 0xea, 0x26, 0x0c, 0x7a, 0x28, 0xbd, 0x55, 0xa6, 0x67, - 0xb3, 0xdc, 0x9c, 0x36, 0x1d, 0x13, 0xdc, 0x84, 0xaa, 0xd1, 0x00, 0x31, 0xc5, 0x7a, 0xb0, 0x7b, - 0x63, 0x8a, 0x75, 0x42, 0xd7, 0x04, 0xe7, 0xd0, 0x06, 0x94, 0x79, 0x26, 0x2c, 0x5e, 0x94, 0x9c, - 0xcc, 0x26, 0xbc, 0x46, 0xa2, 0xb3, 0x7c, 0x6a, 0xf2, 0x64, 0x4c, 0xe8, 0xdb, 0x50, 0xd9, 0xa0, - 0x4c, 0x45, 0x8b, 0x13, 0xd9, 0x70, 0x33, 0x41, 0x52, 0xe9, 0x90, 0x85, 0x73, 0xe8, 0x0d, 0x91, - 0x94, 0xa7, 0x9d, 0x25, 0x72, 0xa6, 0x38, 0xc5, 0xf8, 0x5c, 0x2b, 0xd3, 0x11, 0x62, 0xca, 0xaf, - 0xa7, 0x28, 0xab, 0xb8, 0xea, 0x4c, 0xb9, 0x82, 0x31, 0x65, 0xe7, 0x1e, 0x9f, 0x51, 0xe0, 0xdc, - 0xf9, 0x37, 0xf5, 0x97, 0x04, 0xeb, 0x2e, 0x73, 0xd1, 0x2b, 0xb0, 0x20, 0x64, 0x19, 0x7f, 0x6a, - 0x90, 0xb2, 0xf9, 0x03, 0xdf, 0x35, 0xa4, 0x6c, 0xfe, 0xe0, 0xf7, 0x0d, 0x38, 0xd7, 0x7e, 0xf3, - 0x83, 0x8f, 0x9b, 0xb9, 0x0f, 0x3f, 0x6e, 0xe6, 0x3e, 0xfd, 0xb8, 0x69, 0x7d, 0x7f, 0xaf, 0x69, - 0xfd, 0x7a, 0xaf, 0x69, 0xbd, 0xbf, 0xd7, 0xb4, 0x3e, 0xd8, 0x6b, 0x5a, 0xff, 0xd8, 0x6b, 0x5a, - 0xff, 0xdc, 0x6b, 0xe6, 0x3e, 0xdd, 0x6b, 0x5a, 0xef, 0x7e, 0xd2, 0xcc, 0x7d, 0xf0, 0x49, 0x33, - 0xf7, 0xe1, 0x27, 0xcd, 0xdc, 0x77, 0x1f, 0xbd, 0x77, 0x01, 0x2a, 0x1d, 0x5d, 0x49, 0xfc, 0x3d, - 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x82, 0x5c, 0x85, 0xa1, 0xef, 0x22, 0x00, 0x00, + // 2670 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x8c, 0x5b, 0x47, + 0xd9, 0xcf, 0x7e, 0xfe, 0xfb, 0xec, 0xdd, 0x6c, 0x66, 0x9d, 0xc4, 0xda, 0xa4, 0x7e, 0xdb, 0x11, + 0xb4, 0xa1, 0x49, 0xd7, 0x4d, 0x4a, 0x4b, 0x9a, 0x52, 0x4a, 0xbc, 0xdb, 0x6c, 0x93, 0x6e, 0xd3, + 0x74, 0x36, 0x4d, 0x0b, 0xa2, 0xaa, 0x5e, 0xec, 0x59, 0xef, 0x53, 0xec, 0xf7, 0x9c, 0xf7, 0xc6, + 0x4d, 0xf7, 0x86, 0xc4, 0x19, 0x51, 0x89, 0x03, 0x70, 0x41, 0x42, 0x42, 0x02, 0x81, 0x7a, 0x41, + 0x9c, 0x10, 0x82, 0x0b, 0x87, 0x72, 0x2b, 0xb7, 0xaa, 0x07, 0x43, 0xb7, 0x17, 0xb4, 0xa7, 0x4a, + 0x48, 0x1c, 0x7a, 0x42, 0xf3, 0xf7, 0xde, 0xbc, 0xb7, 0x5e, 0x52, 0x6f, 0x83, 0x4a, 0x2e, 0xf6, + 0xcc, 0x37, 0xdf, 0x7c, 0x33, 0xdf, 0xcf, 0x7c, 0x7f, 0x36, 0x9c, 0x1c, 0xdd, 0xee, 0xb7, 0x07, + 0x41, 0x7f, 0x14, 0x06, 0x2c, 0x88, 0x07, 0x2b, 0xe2, 0x13, 0x55, 0xf4, 0x7c, 0xa9, 0xd1, 0x0f, + 0xfa, 0x81, 0xc4, 0xe1, 0x23, 0xb9, 0xbe, 0xe4, 0xf4, 0x83, 0xa0, 0x3f, 0xa0, 0x6d, 0x31, 0xbb, + 0x35, 0xde, 0x6a, 0x33, 0x6f, 0x48, 0x23, 0xe6, 0x0e, 0x47, 0x0a, 0x61, 0x59, 0x51, 0xbf, 0x33, + 0x18, 0x06, 0x3d, 0x3a, 0x68, 0x47, 0xcc, 0x65, 0x91, 0xfc, 0x54, 0x18, 0x8b, 0x1c, 0x63, 0x34, + 0x8e, 0xb6, 0xc5, 0x87, 0x04, 0xe2, 0xdf, 0x5b, 0x70, 0x6c, 0xc3, 0xbd, 0x45, 0x07, 0x37, 0x82, + 0x9b, 0xee, 0x60, 0x4c, 0x23, 0x42, 0xa3, 0x51, 0xe0, 0x47, 0x14, 0xad, 0x42, 0x69, 0xc0, 0x17, + 0xa2, 0xa6, 0xb5, 0x5c, 0x38, 0x5d, 0x3b, 0x7f, 0x66, 0x25, 0xbe, 0xf2, 0xd4, 0x0d, 0x12, 0x1a, + 0xbd, 0xe0, 0xb3, 0x70, 0x87, 0xa8, 0xad, 0x4b, 0x37, 0xa1, 0x66, 0x80, 0xd1, 0x02, 0x14, 0x6e, + 0xd3, 0x9d, 0xa6, 0xb5, 0x6c, 0x9d, 0xae, 0x12, 0x3e, 0x44, 0xe7, 0xa0, 0xf8, 0x36, 0x27, 0xd3, + 0xcc, 0x2f, 0x5b, 0xa7, 0x6b, 0xe7, 0x4f, 0x26, 0x87, 0xbc, 0xe6, 0x7b, 0x77, 0xc6, 0x54, 0xec, + 0x56, 0x07, 0x49, 0xcc, 0x8b, 0xf9, 0x0b, 0x16, 0x3e, 0x03, 0x47, 0xf7, 0xad, 0xa3, 0xe3, 0x50, + 0x12, 0x18, 0xf2, 0xc6, 0x55, 0xa2, 0x66, 0xb8, 0x01, 0x68, 0x93, 0x85, 0xd4, 0x1d, 0x12, 0x97, + 0xf1, 0xfb, 0xde, 0x19, 0xd3, 0x88, 0xe1, 0x97, 0x61, 0x31, 0x05, 0x55, 0x6c, 0x3f, 0x0d, 0xb5, + 0x28, 0x01, 0x2b, 0xde, 0x1b, 0xc9, 0xb5, 0x92, 0x3d, 0xc4, 0x44, 0xc4, 0x3f, 0xb7, 0x00, 0x92, + 0x35, 0xd4, 0x02, 0x90, 0xab, 0x2f, 0xba, 0xd1, 0xb6, 0x60, 0xd8, 0x26, 0x06, 0x04, 0x9d, 0x85, + 0xa3, 0xc9, 0xec, 0x5a, 0xb0, 0xb9, 0xed, 0x86, 0x3d, 0x21, 0x03, 0x9b, 0xec, 0x5f, 0x40, 0x08, + 0xec, 0xd0, 0x65, 0xb4, 0x59, 0x58, 0xb6, 0x4e, 0x17, 0x88, 0x18, 0x73, 0x6e, 0x19, 0xf5, 0x5d, + 0x9f, 0x35, 0x6d, 0x21, 0x4e, 0x35, 0xe3, 0x70, 0xae, 0x5f, 0x1a, 0x35, 0x8b, 0xcb, 0xd6, 0xe9, + 0x39, 0xa2, 0x66, 0xf8, 0xdf, 0x05, 0xa8, 0xbf, 0x3a, 0xa6, 0xe1, 0x8e, 0x12, 0x00, 0x6a, 0x41, + 0x25, 0xa2, 0x03, 0xda, 0x65, 0x41, 0x28, 0x35, 0xd2, 0xc9, 0x37, 0x2d, 0x12, 0xc3, 0x50, 0x03, + 0x8a, 0x03, 0x6f, 0xe8, 0x31, 0x71, 0xad, 0x39, 0x22, 0x27, 0xe8, 0x22, 0x14, 0x23, 0xe6, 0x86, + 0x4c, 0xdc, 0xa5, 0x76, 0x7e, 0x69, 0x45, 0x1a, 0xe6, 0x8a, 0x36, 0xcc, 0x95, 0x1b, 0xda, 0x30, + 0x3b, 0x95, 0xf7, 0x27, 0x4e, 0xee, 0xdd, 0xbf, 0x3b, 0x16, 0x91, 0x5b, 0xd0, 0xd3, 0x50, 0xa0, + 0x7e, 0x4f, 0xdc, 0xf7, 0xf3, 0xee, 0xe4, 0x1b, 0xd0, 0x39, 0xa8, 0xf6, 0xbc, 0x90, 0x76, 0x99, + 0x17, 0xf8, 0x82, 0xab, 0xf9, 0xf3, 0x8b, 0x89, 0x46, 0xd6, 0xf4, 0x12, 0x49, 0xb0, 0xd0, 0x59, + 0x28, 0x45, 0x5c, 0x74, 0x51, 0xb3, 0xcc, 0x6d, 0xa1, 0xd3, 0xd8, 0x9b, 0x38, 0x0b, 0x12, 0x72, + 0x36, 0x18, 0x7a, 0x8c, 0x0e, 0x47, 0x6c, 0x87, 0x28, 0x1c, 0xf4, 0x18, 0x94, 0x7b, 0x74, 0x40, + 0xb9, 0xc2, 0x2b, 0x42, 0xe1, 0x0b, 0x06, 0x79, 0xb1, 0x40, 0x34, 0x02, 0x7a, 0x13, 0xec, 0xd1, + 0xc0, 0xf5, 0x9b, 0x55, 0xc1, 0xc5, 0x7c, 0x82, 0x78, 0x7d, 0xe0, 0xfa, 0x9d, 0x67, 0x3e, 0x9a, + 0x38, 0x4f, 0xf5, 0x3d, 0xb6, 0x3d, 0xbe, 0xb5, 0xd2, 0x0d, 0x86, 0xed, 0x7e, 0xe8, 0x6e, 0xb9, + 0xbe, 0xdb, 0x1e, 0x04, 0xb7, 0xbd, 0xf6, 0xdb, 0x4f, 0xb6, 0xf9, 0x1b, 0xbc, 0x33, 0xa6, 0xa1, + 0x47, 0xc3, 0x36, 0x27, 0xb3, 0x22, 0x54, 0xc2, 0xb7, 0x12, 0x41, 0x16, 0x5d, 0xe5, 0xf6, 0x17, + 0x84, 0x74, 0x75, 0x7b, 0xec, 0xdf, 0x8e, 0x9a, 0x20, 0x4e, 0x39, 0x91, 0x9c, 0x22, 0xe0, 0x84, + 0x6e, 0xad, 0x87, 0xc1, 0x78, 0xd4, 0x39, 0xb2, 0x37, 0x71, 0x4c, 0x7c, 0x62, 0x4e, 0xae, 0xda, + 0x95, 0xd2, 0x42, 0x19, 0xbf, 0x57, 0x00, 0xb4, 0xe9, 0x0e, 0x47, 0x03, 0x3a, 0x93, 0xfa, 0x63, + 0x45, 0xe7, 0x0f, 0xad, 0xe8, 0xc2, 0xac, 0x8a, 0x4e, 0xb4, 0x66, 0xcf, 0xa6, 0xb5, 0xe2, 0xe7, + 0xd5, 0x5a, 0xe9, 0xff, 0x5e, 0x6b, 0xb8, 0x09, 0x36, 0xa7, 0xcc, 0x9d, 0x65, 0xe8, 0xde, 0x15, + 0xba, 0xa9, 0x13, 0x3e, 0xc4, 0x1b, 0x50, 0x92, 0x7c, 0xa1, 0xa5, 0xac, 0xf2, 0xd2, 0xef, 0x36, + 0x51, 0x5c, 0x41, 0xab, 0x64, 0x21, 0x51, 0x49, 0x41, 0x08, 0x1b, 0xff, 0xd1, 0x82, 0x39, 0x65, + 0x11, 0xca, 0xf7, 0xdd, 0x82, 0xb2, 0xf4, 0x3d, 0xda, 0xef, 0x9d, 0xc8, 0xfa, 0xbd, 0x4b, 0x3d, + 0x77, 0xc4, 0x68, 0xd8, 0x69, 0xbf, 0x3f, 0x71, 0xac, 0x8f, 0x26, 0xce, 0xa3, 0x07, 0x09, 0x4d, + 0xc7, 0x1a, 0xed, 0x2f, 0x35, 0x61, 0x74, 0x46, 0xdc, 0x8e, 0x45, 0xca, 0xac, 0x8e, 0xac, 0xc8, + 0x10, 0x75, 0xc5, 0xef, 0xd3, 0x88, 0x53, 0xb6, 0xb9, 0x45, 0x10, 0x89, 0xc3, 0xd9, 0xbc, 0xeb, + 0x86, 0xbe, 0xe7, 0xf7, 0xa3, 0x66, 0x41, 0xf8, 0xf4, 0x78, 0x8e, 0x7f, 0x6a, 0xc1, 0x62, 0xca, + 0xac, 0x15, 0x13, 0x17, 0xa0, 0x14, 0x71, 0x4d, 0x69, 0x1e, 0x0c, 0xa3, 0xd8, 0x14, 0xf0, 0xce, + 0xbc, 0xba, 0x7c, 0x49, 0xce, 0x89, 0xc2, 0xbf, 0x7f, 0x57, 0xfb, 0x8b, 0x05, 0x75, 0x11, 0x98, + 0xf4, 0x5b, 0x43, 0x60, 0xfb, 0xee, 0x90, 0x2a, 0x55, 0x89, 0xb1, 0x11, 0xad, 0xf8, 0x71, 0x15, + 0x1d, 0xad, 0x66, 0x75, 0xb0, 0xd6, 0xa1, 0x1d, 0xac, 0x95, 0xbc, 0xbb, 0x06, 0x14, 0xb9, 0x79, + 0xef, 0x08, 0xe7, 0x5a, 0x25, 0x72, 0x82, 0x1f, 0x85, 0x39, 0xc5, 0x85, 0x12, 0xed, 0x41, 0x01, + 0x76, 0x08, 0x25, 0xa9, 0x09, 0xf4, 0x15, 0xa8, 0xc6, 0x89, 0x89, 0xe0, 0xb6, 0xd0, 0x29, 0xed, + 0x4d, 0x9c, 0x3c, 0x8b, 0x48, 0xb2, 0x80, 0x1c, 0x33, 0xe8, 0x5b, 0x9d, 0xea, 0xde, 0xc4, 0x91, + 0x00, 0x15, 0xe2, 0xd1, 0x29, 0xb0, 0xb7, 0x79, 0xdc, 0xe4, 0x22, 0xb0, 0x3b, 0x95, 0xbd, 0x89, + 0x23, 0xe6, 0x44, 0x7c, 0xe2, 0x75, 0xa8, 0x6f, 0xd0, 0xbe, 0xdb, 0xdd, 0x51, 0x87, 0x36, 0x34, + 0x39, 0x7e, 0xa0, 0xa5, 0x69, 0x3c, 0x0c, 0xf5, 0xf8, 0xc4, 0xb7, 0x86, 0x91, 0x7a, 0x0d, 0xb5, + 0x18, 0xf6, 0x72, 0x84, 0x7f, 0x66, 0x81, 0xb2, 0x01, 0x84, 0x8d, 0x6c, 0x87, 0xfb, 0x42, 0xd8, + 0x9b, 0x38, 0x0a, 0xa2, 0x93, 0x19, 0xf4, 0x2c, 0x94, 0x23, 0x71, 0x22, 0x27, 0x96, 0x35, 0x2d, + 0xb1, 0xd0, 0x39, 0xc2, 0x4d, 0x64, 0x6f, 0xe2, 0x68, 0x44, 0xa2, 0x07, 0x68, 0x25, 0x95, 0x10, + 0x48, 0xc6, 0xe6, 0xf7, 0x26, 0x8e, 0x01, 0x35, 0x13, 0x04, 0xfc, 0x99, 0x05, 0xb5, 0x1b, 0xae, + 0x17, 0x9b, 0x50, 0x53, 0xab, 0x28, 0xf1, 0xd5, 0x12, 0xc0, 0x2d, 0xb1, 0x47, 0x07, 0xee, 0xce, + 0xe5, 0x20, 0x14, 0x74, 0xe7, 0x48, 0x3c, 0x4f, 0x62, 0xb8, 0x3d, 0x35, 0x86, 0x17, 0x67, 0x77, + 0xed, 0xff, 0x5b, 0x47, 0x7a, 0xd5, 0xae, 0xe4, 0x17, 0x0a, 0xf8, 0x3d, 0x0b, 0xea, 0x92, 0x79, + 0x65, 0x79, 0xdf, 0x83, 0x92, 0x94, 0x8d, 0x60, 0xff, 0xbf, 0x38, 0xa6, 0x33, 0xb3, 0x38, 0x25, + 0x45, 0x13, 0x3d, 0x0f, 0xf3, 0xbd, 0x30, 0x18, 0x8d, 0x68, 0x6f, 0x53, 0xb9, 0xbf, 0x7c, 0xd6, + 0xfd, 0xad, 0x99, 0xeb, 0x24, 0x83, 0x8e, 0xff, 0x6a, 0xc1, 0x9c, 0x72, 0x26, 0x4a, 0x5d, 0xb1, + 0x88, 0xad, 0x43, 0x47, 0xcf, 0xfc, 0xac, 0xd1, 0xf3, 0x38, 0x94, 0xfa, 0x3c, 0xbe, 0x68, 0x87, + 0xa4, 0x66, 0xb3, 0x45, 0x55, 0x7c, 0x15, 0xe6, 0x35, 0x2b, 0x07, 0x78, 0xd4, 0xa5, 0xac, 0x47, + 0xbd, 0xd2, 0xa3, 0x3e, 0xf3, 0xb6, 0xbc, 0xd8, 0x47, 0x2a, 0x7c, 0xfc, 0x23, 0x0b, 0x16, 0xb2, + 0x28, 0x68, 0x2d, 0x53, 0x58, 0x3c, 0x72, 0x30, 0x39, 0xb3, 0xa6, 0xd0, 0xa4, 0x55, 0x65, 0xf1, + 0xd4, 0xbd, 0x2a, 0x8b, 0x86, 0xe9, 0x64, 0xaa, 0xca, 0x2b, 0xe0, 0x9f, 0x58, 0x30, 0x97, 0xd2, + 0x25, 0xba, 0x00, 0xf6, 0x56, 0x18, 0x0c, 0x67, 0x52, 0x94, 0xd8, 0x81, 0xbe, 0x0e, 0x79, 0x16, + 0xcc, 0xa4, 0xa6, 0x3c, 0x0b, 0xb8, 0x96, 0x14, 0xfb, 0x05, 0x99, 0xb7, 0xcb, 0x19, 0x7e, 0x0a, + 0xaa, 0x82, 0xa1, 0xeb, 0xae, 0x17, 0x4e, 0x0d, 0x18, 0xd3, 0x19, 0x7a, 0x16, 0x8e, 0x48, 0x67, + 0x38, 0x7d, 0x73, 0x7d, 0xda, 0xe6, 0xba, 0xde, 0x7c, 0x12, 0x8a, 0x22, 0xe9, 0xe0, 0x5b, 0x7a, + 0x2e, 0x73, 0xf5, 0x16, 0x3e, 0xc6, 0xc7, 0x60, 0x91, 0xbf, 0x41, 0x1a, 0x46, 0xab, 0xc1, 0xd8, + 0x67, 0xba, 0x6e, 0x3a, 0x0b, 0x8d, 0x34, 0x58, 0x59, 0x49, 0x03, 0x8a, 0x5d, 0x0e, 0x10, 0x34, + 0xe6, 0x88, 0x9c, 0xe0, 0x5f, 0x5a, 0x80, 0xd6, 0x29, 0x13, 0xa7, 0x5c, 0x59, 0x8b, 0x9f, 0xc7, + 0x12, 0x54, 0x86, 0x2e, 0xeb, 0x6e, 0xd3, 0x30, 0xd2, 0xf9, 0x8b, 0x9e, 0x7f, 0x19, 0x89, 0x27, + 0x3e, 0x07, 0x8b, 0xa9, 0x5b, 0x2a, 0x9e, 0x96, 0xa0, 0xd2, 0x55, 0x30, 0x15, 0xf2, 0xe2, 0x39, + 0xfe, 0x5d, 0x1e, 0x2a, 0x3a, 0xad, 0x43, 0xe7, 0xa0, 0xb6, 0xe5, 0xf9, 0x7d, 0x1a, 0x8e, 0x42, + 0x4f, 0x89, 0xc0, 0x96, 0x69, 0x9e, 0x01, 0x26, 0xe6, 0x04, 0x3d, 0x0e, 0xe5, 0x71, 0x44, 0xc3, + 0xb7, 0x3c, 0xf9, 0xd2, 0xab, 0x9d, 0xc6, 0xee, 0xc4, 0x29, 0xbd, 0x16, 0xd1, 0xf0, 0xca, 0x1a, + 0x0f, 0x3e, 0x63, 0x31, 0x22, 0xf2, 0xbb, 0x87, 0x5e, 0x52, 0x66, 0x2a, 0x12, 0xb8, 0xce, 0x37, + 0xf8, 0xf5, 0x33, 0xae, 0x6e, 0x14, 0x06, 0x43, 0xca, 0xb6, 0xe9, 0x38, 0x6a, 0x77, 0x83, 0xe1, + 0x30, 0xf0, 0xdb, 0xa2, 0x13, 0x20, 0x98, 0xe6, 0x11, 0x94, 0x6f, 0x57, 0x96, 0x7b, 0x03, 0xca, + 0x6c, 0x3b, 0x0c, 0xc6, 0xfd, 0x6d, 0x11, 0x18, 0x0a, 0x9d, 0x8b, 0xb3, 0xd3, 0xd3, 0x14, 0x88, + 0x1e, 0xa0, 0x87, 0xb9, 0xb4, 0x68, 0xf7, 0x76, 0x34, 0x1e, 0xca, 0xda, 0xb3, 0x53, 0xdc, 0x9b, + 0x38, 0xd6, 0xe3, 0x24, 0x06, 0xe3, 0x4b, 0x30, 0x97, 0x4a, 0x85, 0xd1, 0x13, 0x60, 0x87, 0x74, + 0x4b, 0xbb, 0x02, 0xb4, 0x3f, 0x63, 0x96, 0xd1, 0x9f, 0xe3, 0x10, 0xf1, 0x89, 0x7f, 0x98, 0x07, + 0xc7, 0xa8, 0xfa, 0x2f, 0x07, 0xe1, 0xcb, 0x94, 0x85, 0x5e, 0xf7, 0x9a, 0x3b, 0xa4, 0xda, 0xbc, + 0x1c, 0xa8, 0x0d, 0x05, 0xf0, 0x2d, 0xe3, 0x15, 0xc1, 0x30, 0xc6, 0x43, 0x0f, 0x01, 0x88, 0x67, + 0x27, 0xd7, 0xe5, 0x83, 0xaa, 0x0a, 0x88, 0x58, 0x5e, 0x4d, 0x09, 0xbb, 0x3d, 0xa3, 0x70, 0x94, + 0x90, 0xaf, 0x64, 0x85, 0x3c, 0x33, 0x9d, 0x58, 0xb2, 0xe6, 0x73, 0x29, 0xa6, 0x9f, 0x0b, 0xfe, + 0x9b, 0x05, 0xad, 0x0d, 0x7d, 0xf3, 0x43, 0x8a, 0x43, 0xf3, 0x9b, 0xbf, 0x4f, 0xfc, 0x16, 0xbe, + 0x18, 0xbf, 0xb8, 0x05, 0xb0, 0xe1, 0xf9, 0xf4, 0xb2, 0x37, 0x60, 0x34, 0x9c, 0x52, 0x08, 0xfd, + 0xb8, 0x90, 0x78, 0x15, 0x42, 0xb7, 0x34, 0x9f, 0xab, 0x86, 0x2b, 0xbf, 0x1f, 0x6c, 0xe4, 0xef, + 0xa3, 0xda, 0x0a, 0x19, 0x2f, 0xe7, 0x43, 0x79, 0x4b, 0xb0, 0x27, 0xa3, 0x72, 0xaa, 0xc7, 0x94, + 0xf0, 0xde, 0xf9, 0x96, 0x3a, 0xfc, 0xe9, 0x7b, 0x24, 0x55, 0xa2, 0xf3, 0xd7, 0x8e, 0x76, 0x7c, + 0xe6, 0xbe, 0x63, 0xec, 0x27, 0xfa, 0x10, 0xe4, 0xaa, 0xbc, 0xad, 0x38, 0x35, 0x6f, 0x7b, 0x4e, + 0x1d, 0xf3, 0x45, 0x72, 0x37, 0xfc, 0x5c, 0xe2, 0x44, 0x85, 0x52, 0x94, 0x13, 0x7d, 0xe4, 0x5e, + 0x4f, 0x5c, 0x3d, 0xec, 0x3f, 0x59, 0xb0, 0xb0, 0x4e, 0x59, 0x3a, 0x8f, 0x7a, 0x80, 0x54, 0x8a, + 0x5f, 0x84, 0xa3, 0xc6, 0xfd, 0x15, 0xf7, 0x4f, 0x66, 0x92, 0xa7, 0x63, 0x09, 0xff, 0x57, 0xfc, + 0x1e, 0x7d, 0x47, 0xd5, 0xa4, 0xe9, 0xbc, 0xe9, 0x3a, 0xd4, 0x8c, 0x45, 0x74, 0x29, 0x93, 0x31, + 0x2d, 0x66, 0x5a, 0xb1, 0x3c, 0xea, 0x77, 0x1a, 0x8a, 0x27, 0x59, 0x79, 0xaa, 0x7c, 0x38, 0xce, + 0x2e, 0x36, 0x01, 0x09, 0x75, 0x09, 0xb2, 0x66, 0x7c, 0x13, 0xd0, 0x97, 0xe2, 0xd4, 0x29, 0x9e, + 0xa3, 0x87, 0xc1, 0x0e, 0x83, 0xbb, 0x3a, 0x15, 0x9e, 0x4b, 0x8e, 0x24, 0xc1, 0x5d, 0x22, 0x96, + 0xf0, 0xb3, 0x50, 0x20, 0xc1, 0x5d, 0xd4, 0x02, 0x08, 0x5d, 0xbf, 0x4f, 0x6f, 0xc6, 0x45, 0x58, + 0x9d, 0x18, 0x90, 0x03, 0x72, 0x8f, 0x55, 0x38, 0x6a, 0xde, 0x48, 0xaa, 0x7b, 0x05, 0xca, 0xaf, + 0x8e, 0x4d, 0x71, 0x35, 0x32, 0xe2, 0x92, 0xb5, 0xbe, 0x46, 0xe2, 0x36, 0x03, 0x09, 0x1c, 0x9d, + 0x82, 0x2a, 0x73, 0x6f, 0x0d, 0xe8, 0xb5, 0xc4, 0xcd, 0x25, 0x00, 0xbe, 0xca, 0xeb, 0xc7, 0x9b, + 0x46, 0x12, 0x95, 0x00, 0xd0, 0x63, 0xb0, 0x90, 0xdc, 0xf9, 0x7a, 0x48, 0xb7, 0xbc, 0x77, 0x84, + 0x86, 0xeb, 0x64, 0x1f, 0x1c, 0x9d, 0x86, 0x23, 0x09, 0x6c, 0x53, 0x24, 0x2b, 0xb6, 0x40, 0xcd, + 0x82, 0xb9, 0x6c, 0x04, 0xbb, 0x2f, 0xdc, 0x19, 0xbb, 0x03, 0xf1, 0xf8, 0xea, 0xc4, 0x80, 0xe0, + 0x3f, 0x5b, 0x70, 0x54, 0xaa, 0x9a, 0xb9, 0xec, 0x81, 0xb4, 0xfa, 0x5f, 0x59, 0x80, 0x4c, 0x0e, + 0x94, 0x69, 0x7d, 0xd5, 0xec, 0x25, 0xf1, 0x6c, 0xa8, 0x26, 0xca, 0x62, 0x09, 0x4a, 0xda, 0x41, + 0x18, 0x4a, 0x5d, 0xd9, 0x33, 0x13, 0xcd, 0x6f, 0x59, 0x77, 0x4b, 0x08, 0x51, 0xdf, 0xc8, 0x81, + 0xe2, 0xad, 0x1d, 0x46, 0x23, 0x55, 0x35, 0x8b, 0x76, 0x81, 0x00, 0x10, 0xf9, 0xc5, 0xcf, 0xa2, + 0x3e, 0x13, 0x56, 0x63, 0x27, 0x67, 0x29, 0x10, 0xd1, 0x03, 0xfc, 0xdb, 0x3c, 0xcc, 0xdd, 0x0c, + 0x06, 0xe3, 0x24, 0x30, 0x3e, 0x48, 0x01, 0x23, 0x55, 0xca, 0x17, 0x75, 0x29, 0x8f, 0xc0, 0x8e, + 0x18, 0x1d, 0x09, 0xcb, 0x2a, 0x10, 0x31, 0x46, 0x18, 0xea, 0xcc, 0x0d, 0xfb, 0x94, 0xc9, 0x02, + 0xa9, 0x59, 0x12, 0x99, 0x6b, 0x0a, 0x86, 0x96, 0xa1, 0xe6, 0xf6, 0xfb, 0x21, 0xed, 0xbb, 0x8c, + 0x76, 0x76, 0x9a, 0x65, 0x71, 0x98, 0x09, 0xc2, 0x6f, 0xc0, 0xbc, 0x16, 0x96, 0x52, 0xe9, 0x13, + 0x50, 0x7e, 0x5b, 0x40, 0xa6, 0xb4, 0xd6, 0x24, 0xaa, 0x72, 0x63, 0x1a, 0x2d, 0xfd, 0x13, 0x82, + 0xbe, 0x33, 0xbe, 0x0a, 0x25, 0x89, 0x8e, 0x4e, 0x99, 0x65, 0x8e, 0xcc, 0xf4, 0xf8, 0x5c, 0xd5, + 0x2c, 0x18, 0x4a, 0x92, 0x90, 0x52, 0xbc, 0xb0, 0x0d, 0x09, 0x21, 0xea, 0x1b, 0xff, 0xcb, 0x82, + 0x63, 0x6b, 0x94, 0xd1, 0x2e, 0xa3, 0xbd, 0xcb, 0x1e, 0x1d, 0xf4, 0xbe, 0xd4, 0x0a, 0x3c, 0xee, + 0xa3, 0x15, 0x8c, 0x3e, 0x1a, 0xf7, 0x3b, 0x03, 0xcf, 0xa7, 0x1b, 0x46, 0x23, 0x26, 0x01, 0x70, + 0x0f, 0xb1, 0xc5, 0x2f, 0x2e, 0x97, 0xe5, 0x6f, 0x36, 0x06, 0x24, 0xd6, 0x70, 0x29, 0xd1, 0x30, + 0xfe, 0x81, 0x05, 0xc7, 0xb3, 0x5c, 0x2b, 0x25, 0xb5, 0xa1, 0x24, 0x36, 0x4f, 0x69, 0xe1, 0xa6, + 0x76, 0x10, 0x85, 0x86, 0x2e, 0xa4, 0xce, 0x17, 0xbf, 0xf5, 0x74, 0x9a, 0x7b, 0x13, 0xa7, 0x91, + 0x40, 0x8d, 0x2e, 0x81, 0x81, 0x8b, 0xff, 0xc0, 0x6b, 0x69, 0x93, 0xa6, 0xd0, 0x37, 0xb7, 0x2f, + 0xe5, 0x7b, 0xe5, 0x04, 0x7d, 0x0d, 0x6c, 0xb6, 0x33, 0x52, 0x2e, 0xb7, 0x73, 0xec, 0xb3, 0x89, + 0x73, 0x34, 0xb5, 0xed, 0xc6, 0xce, 0x88, 0x12, 0x81, 0xc2, 0xcd, 0xb2, 0xeb, 0x86, 0x3d, 0xcf, + 0x77, 0x07, 0x1e, 0x93, 0x62, 0xb4, 0x89, 0x09, 0x42, 0x4d, 0x28, 0x8f, 0xdc, 0x30, 0xd2, 0x79, + 0x53, 0x95, 0xe8, 0xa9, 0x68, 0x73, 0xdc, 0xa6, 0xac, 0xbb, 0x2d, 0xdd, 0xac, 0x6a, 0x73, 0x08, + 0x48, 0xaa, 0xcd, 0x21, 0x20, 0xf8, 0x17, 0x86, 0xe1, 0xc8, 0x37, 0x71, 0x48, 0xc3, 0xb1, 0x0e, + 0x6d, 0x38, 0xd6, 0x3d, 0x0c, 0x07, 0x7f, 0x27, 0xd1, 0xb2, 0xbe, 0xa2, 0xd2, 0xf2, 0xf3, 0x30, + 0xdf, 0x4b, 0xad, 0x1c, 0xac, 0x6d, 0xd9, 0xc2, 0xcd, 0xa0, 0xe3, 0xf5, 0x44, 0x75, 0x02, 0x72, + 0x80, 0xea, 0x32, 0xfa, 0xc8, 0xef, 0xd3, 0xc7, 0x63, 0x8f, 0x40, 0x35, 0xfe, 0x01, 0x0e, 0xd5, + 0xa0, 0x7c, 0xf9, 0x15, 0xf2, 0xfa, 0x25, 0xb2, 0xb6, 0x90, 0x43, 0x75, 0xa8, 0x74, 0x2e, 0xad, + 0xbe, 0x24, 0x66, 0xd6, 0xf9, 0xdf, 0x94, 0x74, 0x68, 0x0f, 0xd1, 0x37, 0xa1, 0x28, 0xe3, 0xf5, + 0xf1, 0xe4, 0xba, 0xe6, 0x6f, 0x53, 0x4b, 0x27, 0xf6, 0xc1, 0x25, 0xdf, 0x38, 0xf7, 0x84, 0x85, + 0xae, 0x41, 0x4d, 0x00, 0x55, 0xf7, 0xf7, 0x54, 0xb6, 0x09, 0x9b, 0xa2, 0xf4, 0xd0, 0x01, 0xab, + 0x06, 0xbd, 0x8b, 0x50, 0x94, 0x22, 0x38, 0x9e, 0x49, 0xab, 0xa6, 0xdc, 0x26, 0xd5, 0x0f, 0xc7, + 0x39, 0xf4, 0x0c, 0xd8, 0x37, 0x5c, 0x6f, 0x80, 0x8c, 0xac, 0xce, 0x68, 0xda, 0x2e, 0x1d, 0xcf, + 0x82, 0x8d, 0x63, 0x9f, 0x8b, 0x7b, 0xcf, 0x27, 0xb2, 0x0d, 0x30, 0xbd, 0xbd, 0xb9, 0x7f, 0x21, + 0x3e, 0xf9, 0x15, 0xd9, 0x21, 0xd5, 0x6d, 0x18, 0xf4, 0x50, 0xfa, 0xa8, 0x4c, 0xd7, 0x66, 0xa9, + 0x75, 0xd0, 0x72, 0x4c, 0x70, 0x03, 0x6a, 0x46, 0x0b, 0xc4, 0x14, 0xeb, 0xfe, 0xfe, 0x8d, 0x29, + 0xd6, 0x29, 0x7d, 0x13, 0x9c, 0x43, 0xeb, 0x50, 0xe1, 0xb9, 0xb0, 0xf8, 0xa9, 0xe4, 0x64, 0x36, + 0xe5, 0x35, 0x52, 0x9d, 0xa5, 0x53, 0xd3, 0x17, 0x63, 0x42, 0xdf, 0x86, 0xea, 0x3a, 0x65, 0x2a, + 0x5e, 0x9c, 0xc8, 0x06, 0x9c, 0x29, 0x92, 0x4a, 0x07, 0x2d, 0x9c, 0x43, 0x6f, 0x88, 0xb4, 0x3c, + 0xed, 0x2e, 0x91, 0x73, 0x80, 0x5b, 0x8c, 0xef, 0xb5, 0x7c, 0x30, 0x42, 0x4c, 0xf9, 0xf5, 0x14, + 0x65, 0x15, 0x59, 0x9d, 0x03, 0x9e, 0x60, 0x4c, 0xd9, 0xb9, 0xc7, 0x1f, 0x29, 0x70, 0xee, 0xfc, + 0x9b, 0xfa, 0xbf, 0x04, 0x6b, 0x2e, 0x73, 0xd1, 0x2b, 0x30, 0x2f, 0x64, 0x19, 0xff, 0xd9, 0x20, + 0x65, 0xf3, 0xfb, 0xfe, 0xd9, 0x90, 0xb2, 0xf9, 0xfd, 0xff, 0x70, 0xc0, 0xb9, 0xce, 0x9b, 0x1f, + 0x7c, 0xdc, 0xca, 0x7d, 0xf8, 0x71, 0x2b, 0xf7, 0xe9, 0xc7, 0x2d, 0xeb, 0xfb, 0xbb, 0x2d, 0xeb, + 0xd7, 0xbb, 0x2d, 0xeb, 0xfd, 0xdd, 0x96, 0xf5, 0xc1, 0x6e, 0xcb, 0xfa, 0xc7, 0x6e, 0xcb, 0xfa, + 0xe7, 0x6e, 0x2b, 0xf7, 0xe9, 0x6e, 0xcb, 0x7a, 0xf7, 0x93, 0x56, 0xee, 0x83, 0x4f, 0x5a, 0xb9, + 0x0f, 0x3f, 0x69, 0xe5, 0xbe, 0xfb, 0xe8, 0xbd, 0x4b, 0x50, 0xe9, 0xe8, 0x4a, 0xe2, 0xeb, 0xc9, + 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x04, 0x88, 0x1d, 0xe6, 0xf1, 0x22, 0x00, 0x00, } func (x Direction) String() string { @@ -4964,9 +4964,14 @@ func (this *DetectedField) Equal(that interface{}) bool { if this.Cardinality != that1.Cardinality { return false } - if this.Parser != that1.Parser { + if len(this.Parsers) != len(that1.Parsers) { return false } + for i := range this.Parsers { + if this.Parsers[i] != that1.Parsers[i] { + return false + } + } if !bytes.Equal(this.Sketch, that1.Sketch) { return false } @@ -5736,7 +5741,7 @@ func (this *DetectedField) GoString() string { s = append(s, "Label: "+fmt.Sprintf("%#v", this.Label)+",\n") s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") s = append(s, "Cardinality: "+fmt.Sprintf("%#v", this.Cardinality)+",\n") - s = append(s, "Parser: "+fmt.Sprintf("%#v", this.Parser)+",\n") + s = append(s, "Parsers: "+fmt.Sprintf("%#v", this.Parsers)+",\n") s = append(s, "Sketch: "+fmt.Sprintf("%#v", this.Sketch)+",\n") s = append(s, "}") return strings.Join(s, "") @@ -8691,12 +8696,14 @@ func (m *DetectedField) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a } - if len(m.Parser) > 0 { - i -= len(m.Parser) - copy(dAtA[i:], m.Parser) - i = encodeVarintLogproto(dAtA, i, uint64(len(m.Parser))) - i-- - dAtA[i] = 0x22 + if len(m.Parsers) > 0 { + for iNdEx := len(m.Parsers) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Parsers[iNdEx]) + copy(dAtA[i:], m.Parsers[iNdEx]) + i = encodeVarintLogproto(dAtA, i, uint64(len(m.Parsers[iNdEx]))) + i-- + dAtA[i] = 0x22 + } } if m.Cardinality != 0 { i = encodeVarintLogproto(dAtA, i, uint64(m.Cardinality)) @@ -9868,9 +9875,11 @@ func (m *DetectedField) Size() (n int) { if m.Cardinality != 0 { n += 1 + sovLogproto(uint64(m.Cardinality)) } - l = len(m.Parser) - if l > 0 { - n += 1 + l + sovLogproto(uint64(l)) + if len(m.Parsers) > 0 { + for _, s := range m.Parsers { + l = len(s) + n += 1 + l + sovLogproto(uint64(l)) + } } l = len(m.Sketch) if l > 0 { @@ -10622,7 +10631,7 @@ func (this *DetectedField) String() string { `Label:` + fmt.Sprintf("%v", this.Label) + `,`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, `Cardinality:` + fmt.Sprintf("%v", this.Cardinality) + `,`, - `Parser:` + fmt.Sprintf("%v", this.Parser) + `,`, + `Parsers:` + fmt.Sprintf("%v", this.Parsers) + `,`, `Sketch:` + fmt.Sprintf("%v", this.Sketch) + `,`, `}`, }, "") @@ -17495,7 +17504,7 @@ func (m *DetectedField) Unmarshal(dAtA []byte) error { } case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Parser", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Parsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -17523,7 +17532,7 @@ func (m *DetectedField) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Parser = string(dAtA[iNdEx:postIndex]) + m.Parsers = append(m.Parsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 5: if wireType != 2 { diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto index f6f8c12a8fdec..b9c3cd987c7aa 100644 --- a/pkg/logproto/logproto.proto +++ b/pkg/logproto/logproto.proto @@ -471,7 +471,7 @@ message DetectedField { string label = 1; string type = 2 [(gogoproto.casttype) = "DetectedFieldType"]; uint64 cardinality = 3; - string parser = 4; + repeated string parsers = 4; bytes sketch = 5 [(gogoproto.jsontag) = "sketch,omitempty"]; } diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 73ea98d05fef5..12557d46b2aab 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -1108,7 +1108,7 @@ func (q *SingleTenantQuerier) DetectedFields(ctx context.Context, req *logproto. Type: v.fieldType, Cardinality: v.Estimate(), Sketch: sketch, - Parser: v.parser, + Parsers: v.parsers, } fieldCount++ @@ -1122,10 +1122,9 @@ func (q *SingleTenantQuerier) DetectedFields(ctx context.Context, req *logproto. } type parsedFields struct { - sketch *hyperloglog.Sketch - isTypeDetected bool - fieldType logproto.DetectedFieldType - parser string + sketch *hyperloglog.Sketch + fieldType logproto.DetectedFieldType + parsers []string } func newParsedFields(parser *string) *parsedFields { @@ -1134,10 +1133,9 @@ func newParsedFields(parser *string) *parsedFields { p = *parser } return &parsedFields{ - sketch: hyperloglog.New(), - isTypeDetected: false, - fieldType: logproto.DetectedFieldString, - parser: p, + sketch: hyperloglog.New(), + fieldType: logproto.DetectedFieldString, + parsers: []string{p}, } } @@ -1155,7 +1153,6 @@ func (p *parsedFields) Marshal() ([]byte, error) { func (p *parsedFields) DetermineType(value string) { p.fieldType = determineType(value) - p.isTypeDetected = true } func determineType(value string) logproto.DetectedFieldType { @@ -1187,6 +1184,7 @@ func parseDetectedFields(ctx context.Context, limit uint32, streams logqlmodel.S fieldCount := uint32(0) for _, stream := range streams { + detectType := true level.Debug(spanlogger.FromContext(ctx)).Log( "detected_fields", "true", "msg", fmt.Sprintf("looking for detected fields in stream %d with %d lines", stream.Hash, len(stream.Entries))) @@ -1196,7 +1194,6 @@ func parseDetectedFields(ctx context.Context, limit uint32, streams logqlmodel.S for k, vals := range detected { df, ok := detectedFields[k] if !ok && fieldCount < limit { - df = newParsedFields(parser) detectedFields[k] = df fieldCount++ @@ -1206,10 +1203,15 @@ func parseDetectedFields(ctx context.Context, limit uint32, streams logqlmodel.S continue } + if slices.Contains(df.parsers, *parser) == false { + df.parsers = append(df.parsers, *parser) + } + for _, v := range vals { parsedFields := detectedFields[k] - if !parsedFields.isTypeDetected { + if detectType { parsedFields.DetermineType(v) + detectType = false } parsedFields.Insert(v) diff --git a/pkg/storage/detected/fields.go b/pkg/storage/detected/fields.go index 6310448216653..55fbd3428c654 100644 --- a/pkg/storage/detected/fields.go +++ b/pkg/storage/detected/fields.go @@ -1,16 +1,18 @@ package detected import ( + "slices" + "github.com/axiomhq/hyperloglog" "github.com/grafana/loki/v3/pkg/logproto" ) type UnmarshaledDetectedField struct { - Label string - Type logproto.DetectedFieldType - Parser string - Sketch *hyperloglog.Sketch + Label string + Type logproto.DetectedFieldType + Parsers []string + Sketch *hyperloglog.Sketch } func UnmarshalDetectedField(f *logproto.DetectedField) (*UnmarshaledDetectedField, error) { @@ -21,10 +23,10 @@ func UnmarshalDetectedField(f *logproto.DetectedField) (*UnmarshaledDetectedFiel } return &UnmarshaledDetectedField{ - Label: f.Label, - Type: f.Type, - Parser: f.Parser, - Sketch: sketch, + Label: f.Label, + Type: f.Type, + Parsers: f.Parsers, + Sketch: sketch, }, nil } @@ -35,6 +37,14 @@ func (f *UnmarshaledDetectedField) Merge(df *logproto.DetectedField) error { return err } + if f.Type != df.Type { + f.Type = logproto.DetectedFieldString + } + + f.Parsers = append(f.Parsers, df.Parsers...) + slices.Sort(f.Parsers) + f.Parsers = slices.Compact(f.Parsers) + return f.Sketch.Merge(sketch) } @@ -79,7 +89,7 @@ func MergeFields( Label: field.Label, Type: field.Type, Cardinality: field.Sketch.Estimate(), - Parser: field.Parser, + Parsers: field.Parsers, Sketch: nil, } result = append(result, detectedField) diff --git a/pkg/storage/detected/fields_test.go b/pkg/storage/detected/fields_test.go index 0e6ad800738ad..789b601253138 100644 --- a/pkg/storage/detected/fields_test.go +++ b/pkg/storage/detected/fields_test.go @@ -34,7 +34,7 @@ func Test_MergeFields(t *testing.T) { Type: logproto.DetectedFieldString, Cardinality: 1, Sketch: marshalledFooSketch, - Parser: "logfmt", + Parsers: []string{"logfmt", "json"}, }, { Label: "bar", @@ -47,6 +47,19 @@ func Test_MergeFields(t *testing.T) { Type: logproto.DetectedFieldString, Cardinality: 3, Sketch: marhsalledOtherFooSketch, + Parsers: []string{"json"}, + }, + { + Label: "baz", + Type: logproto.DetectedFieldBoolean, + Cardinality: 3, + Sketch: marhsalledOtherFooSketch, + }, + { + Label: "baz", + Type: logproto.DetectedFieldFloat, + Cardinality: 3, + Sketch: marhsalledOtherFooSketch, }, } @@ -55,18 +68,25 @@ func Test_MergeFields(t *testing.T) { t.Run("merges fields", func(t *testing.T) { result, err := MergeFields(fields, limit) require.NoError(t, err) - assert.Equal(t, 2, len(result)) + assert.Equal(t, 3, len(result)) var foo *logproto.DetectedField + var baz *logproto.DetectedField + for _, field := range result { if field.Label == "foo" { foo = field } + if field.Label == "baz" { + baz = field + } } assert.Equal(t, logproto.DetectedFieldString, foo.Type) assert.Equal(t, uint64(3), foo.Cardinality) - assert.Equal(t, "logfmt", foo.Parser) + assert.Equal(t, []string{"json", "logfmt"}, foo.Parsers) + + assert.Equal(t, logproto.DetectedFieldString, baz.Type) }) t.Run("returns up to limit number of fields", func(t *testing.T) { @@ -78,7 +98,7 @@ func Test_MergeFields(t *testing.T) { highLimit := uint32(4) result, err = MergeFields(fields, highLimit) require.NoError(t, err) - assert.Equal(t, 2, len(result)) + assert.Equal(t, 3, len(result)) }) t.Run("returns an error when the field cannot be unmarshalled", func(t *testing.T) { From f18aea782b1e46b04041e050d91555597d403222 Mon Sep 17 00:00:00 2001 From: Sven Grossmann Date: Mon, 6 May 2024 15:41:11 +0200 Subject: [PATCH 2/4] feat(detectedFields): lint --- pkg/storage/detected/fields.go | 2 +- pkg/storage/detected/fields_test.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/storage/detected/fields.go b/pkg/storage/detected/fields.go index 55fbd3428c654..9d6a699bc1e14 100644 --- a/pkg/storage/detected/fields.go +++ b/pkg/storage/detected/fields.go @@ -89,7 +89,7 @@ func MergeFields( Label: field.Label, Type: field.Type, Cardinality: field.Sketch.Estimate(), - Parsers: field.Parsers, + Parsers: field.Parsers, Sketch: nil, } result = append(result, detectedField) diff --git a/pkg/storage/detected/fields_test.go b/pkg/storage/detected/fields_test.go index 789b601253138..2c31fa1d2775e 100644 --- a/pkg/storage/detected/fields_test.go +++ b/pkg/storage/detected/fields_test.go @@ -72,7 +72,6 @@ func Test_MergeFields(t *testing.T) { var foo *logproto.DetectedField var baz *logproto.DetectedField - for _, field := range result { if field.Label == "foo" { foo = field From ea2491176cabcb55d26e7524557480e5f0af0717 Mon Sep 17 00:00:00 2001 From: Sven Grossmann Date: Mon, 6 May 2024 15:50:14 +0200 Subject: [PATCH 3/4] feat(detectedFields): lint --- pkg/querier/querier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 12557d46b2aab..82235d4d8aaa3 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -1203,7 +1203,7 @@ func parseDetectedFields(ctx context.Context, limit uint32, streams logqlmodel.S continue } - if slices.Contains(df.parsers, *parser) == false { + if !slices.Contains(df.parsers, *parser) { df.parsers = append(df.parsers, *parser) } From 58dd930c48e1535043423e8f162b865070575c16 Mon Sep 17 00:00:00 2001 From: Sven Grossmann Date: Tue, 7 May 2024 13:10:29 +0200 Subject: [PATCH 4/4] feat(detectedFields): add comment --- pkg/querier/querier.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 82235d4d8aaa3..0223b89b1b388 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -1210,6 +1210,7 @@ func parseDetectedFields(ctx context.Context, limit uint32, streams logqlmodel.S for _, v := range vals { parsedFields := detectedFields[k] if detectType { + // we don't want to determine the type for every line, so we assume the type in each stream will be the same, and re-detect the type for the next stream parsedFields.DetermineType(v) detectType = false }