diff --git a/docs/generated/sql/aggregates.md b/docs/generated/sql/aggregates.md index 5a6d27a7a16e..a57ae3a2059d 100644 --- a/docs/generated/sql/aggregates.md +++ b/docs/generated/sql/aggregates.md @@ -249,6 +249,24 @@ regr_avgx(arg1: int, arg2: int) → float

Calculates the average of the independent variable (sum(X)/N).

+regr_avgy(arg1: decimal, arg2: decimal) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: decimal, arg2: float) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: decimal, arg2: int) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: float, arg2: decimal) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: float, arg2: float) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: float, arg2: int) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: int, arg2: decimal) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: int, arg2: float) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
+regr_avgy(arg1: int, arg2: int) → float

Calculates the average of the dependent variable (sum(Y)/N).

+
regr_count(arg1: decimal, arg2: decimal) → int

Calculates number of input rows in which both expressions are nonnull.

regr_count(arg1: decimal, arg2: float) → int

Calculates number of input rows in which both expressions are nonnull.

diff --git a/pkg/sql/distsql/columnar_operators_test.go b/pkg/sql/distsql/columnar_operators_test.go index a7d5257e8844..eccc42feb17f 100644 --- a/pkg/sql/distsql/columnar_operators_test.go +++ b/pkg/sql/distsql/columnar_operators_test.go @@ -80,6 +80,7 @@ var aggregateFuncToNumArguments = map[execinfrapb.AggregatorSpec_Func]int{ execinfrapb.AggregatorSpec_REGR_SYY: 2, execinfrapb.AggregatorSpec_REGR_COUNT: 2, execinfrapb.AggregatorSpec_REGR_AVGX: 2, + execinfrapb.AggregatorSpec_REGR_AVGY: 2, } // TestAggregateFuncToNumArguments ensures that all aggregate functions are diff --git a/pkg/sql/execinfrapb/processors_sql.pb.go b/pkg/sql/execinfrapb/processors_sql.pb.go index 58516d9f9675..ab612013aab8 100644 --- a/pkg/sql/execinfrapb/processors_sql.pb.go +++ b/pkg/sql/execinfrapb/processors_sql.pb.go @@ -64,7 +64,7 @@ func (x *ScanVisibility) UnmarshalJSON(data []byte) error { return nil } func (ScanVisibility) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{0} } // These mirror the aggregate functions supported by sql/parser. See @@ -117,6 +117,7 @@ const ( AggregatorSpec_REGR_SXY AggregatorSpec_Func = 42 AggregatorSpec_REGR_COUNT AggregatorSpec_Func = 43 AggregatorSpec_REGR_AVGX AggregatorSpec_Func = 44 + AggregatorSpec_REGR_AVGY AggregatorSpec_Func = 45 ) var AggregatorSpec_Func_name = map[int32]string{ @@ -164,6 +165,7 @@ var AggregatorSpec_Func_name = map[int32]string{ 42: "REGR_SXY", 43: "REGR_COUNT", 44: "REGR_AVGX", + 45: "REGR_AVGY", } var AggregatorSpec_Func_value = map[string]int32{ "ANY_NOT_NULL": 0, @@ -210,6 +212,7 @@ var AggregatorSpec_Func_value = map[string]int32{ "REGR_SXY": 42, "REGR_COUNT": 43, "REGR_AVGX": 44, + "REGR_AVGY": 45, } func (x AggregatorSpec_Func) Enum() *AggregatorSpec_Func { @@ -229,7 +232,7 @@ func (x *AggregatorSpec_Func) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Func) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{13, 0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{13, 0} } type AggregatorSpec_Type int32 @@ -275,7 +278,7 @@ func (x *AggregatorSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{13, 1} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{13, 1} } type WindowerSpec_WindowFunc int32 @@ -339,7 +342,7 @@ func (x *WindowerSpec_WindowFunc) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_WindowFunc) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 0} } // Mode indicates which mode of framing is used. @@ -383,7 +386,7 @@ func (x *WindowerSpec_Frame_Mode) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_Mode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 1, 0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 1, 0} } // BoundType indicates which type of boundary is used. @@ -430,7 +433,7 @@ func (x *WindowerSpec_Frame_BoundType) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_BoundType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 1, 1} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 1, 1} } // Exclusion specifies the type of frame exclusion. @@ -473,7 +476,7 @@ func (x *WindowerSpec_Frame_Exclusion) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_Exclusion) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 1, 2} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 1, 2} } // ValuesCoreSpec is the core of a processor that has no inputs and generates @@ -493,7 +496,7 @@ func (m *ValuesCoreSpec) Reset() { *m = ValuesCoreSpec{} } func (m *ValuesCoreSpec) String() string { return proto.CompactTextString(m) } func (*ValuesCoreSpec) ProtoMessage() {} func (*ValuesCoreSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{0} } func (m *ValuesCoreSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -603,7 +606,7 @@ func (m *TableReaderSpec) Reset() { *m = TableReaderSpec{} } func (m *TableReaderSpec) String() string { return proto.CompactTextString(m) } func (*TableReaderSpec) ProtoMessage() {} func (*TableReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{1} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{1} } func (m *TableReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -640,7 +643,7 @@ func (m *FiltererSpec) Reset() { *m = FiltererSpec{} } func (m *FiltererSpec) String() string { return proto.CompactTextString(m) } func (*FiltererSpec) ProtoMessage() {} func (*FiltererSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{2} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{2} } func (m *FiltererSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -695,7 +698,7 @@ func (m *IndexSkipTableReaderSpec) Reset() { *m = IndexSkipTableReaderSp func (m *IndexSkipTableReaderSpec) String() string { return proto.CompactTextString(m) } func (*IndexSkipTableReaderSpec) ProtoMessage() {} func (*IndexSkipTableReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{3} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{3} } func (m *IndexSkipTableReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -866,7 +869,7 @@ func (m *JoinReaderSpec) Reset() { *m = JoinReaderSpec{} } func (m *JoinReaderSpec) String() string { return proto.CompactTextString(m) } func (*JoinReaderSpec) ProtoMessage() {} func (*JoinReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{4} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{4} } func (m *JoinReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -910,7 +913,7 @@ func (m *SorterSpec) Reset() { *m = SorterSpec{} } func (m *SorterSpec) String() string { return proto.CompactTextString(m) } func (*SorterSpec) ProtoMessage() {} func (*SorterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{5} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{5} } func (m *SorterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -972,7 +975,7 @@ func (m *DistinctSpec) Reset() { *m = DistinctSpec{} } func (m *DistinctSpec) String() string { return proto.CompactTextString(m) } func (*DistinctSpec) ProtoMessage() {} func (*DistinctSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{6} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{6} } func (m *DistinctSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1007,7 +1010,7 @@ func (m *OrdinalitySpec) Reset() { *m = OrdinalitySpec{} } func (m *OrdinalitySpec) String() string { return proto.CompactTextString(m) } func (*OrdinalitySpec) ProtoMessage() {} func (*OrdinalitySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{7} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{7} } func (m *OrdinalitySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1065,7 +1068,7 @@ func (m *ZigzagJoinerSpec) Reset() { *m = ZigzagJoinerSpec{} } func (m *ZigzagJoinerSpec) String() string { return proto.CompactTextString(m) } func (*ZigzagJoinerSpec) ProtoMessage() {} func (*ZigzagJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{8} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{8} } func (m *ZigzagJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1145,7 +1148,7 @@ func (m *MergeJoinerSpec) Reset() { *m = MergeJoinerSpec{} } func (m *MergeJoinerSpec) String() string { return proto.CompactTextString(m) } func (*MergeJoinerSpec) ProtoMessage() {} func (*MergeJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{9} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{9} } func (m *MergeJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1218,7 +1221,7 @@ func (m *HashJoinerSpec) Reset() { *m = HashJoinerSpec{} } func (m *HashJoinerSpec) String() string { return proto.CompactTextString(m) } func (*HashJoinerSpec) ProtoMessage() {} func (*HashJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{10} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{10} } func (m *HashJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1334,7 +1337,7 @@ func (m *InvertedJoinerSpec) Reset() { *m = InvertedJoinerSpec{} } func (m *InvertedJoinerSpec) String() string { return proto.CompactTextString(m) } func (*InvertedJoinerSpec) ProtoMessage() {} func (*InvertedJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{11} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{11} } func (m *InvertedJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1395,7 +1398,7 @@ func (m *InvertedFiltererSpec) Reset() { *m = InvertedFiltererSpec{} } func (m *InvertedFiltererSpec) String() string { return proto.CompactTextString(m) } func (*InvertedFiltererSpec) ProtoMessage() {} func (*InvertedFiltererSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{12} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{12} } func (m *InvertedFiltererSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1436,7 @@ func (m *InvertedFiltererSpec_PreFiltererSpec) Reset() { *m = InvertedFi func (m *InvertedFiltererSpec_PreFiltererSpec) String() string { return proto.CompactTextString(m) } func (*InvertedFiltererSpec_PreFiltererSpec) ProtoMessage() {} func (*InvertedFiltererSpec_PreFiltererSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{12, 0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{12, 0} } func (m *InvertedFiltererSpec_PreFiltererSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1479,7 +1482,7 @@ func (m *AggregatorSpec) Reset() { *m = AggregatorSpec{} } func (m *AggregatorSpec) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec) ProtoMessage() {} func (*AggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{13} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{13} } func (m *AggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1530,7 +1533,7 @@ func (m *AggregatorSpec_Aggregation) Reset() { *m = AggregatorSpec_Aggre func (m *AggregatorSpec_Aggregation) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec_Aggregation) ProtoMessage() {} func (*AggregatorSpec_Aggregation) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{13, 0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{13, 0} } func (m *AggregatorSpec_Aggregation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1570,7 +1573,7 @@ func (m *ProjectSetSpec) Reset() { *m = ProjectSetSpec{} } func (m *ProjectSetSpec) String() string { return proto.CompactTextString(m) } func (*ProjectSetSpec) ProtoMessage() {} func (*ProjectSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{14} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{14} } func (m *ProjectSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1612,7 +1615,7 @@ func (m *WindowerSpec) Reset() { *m = WindowerSpec{} } func (m *WindowerSpec) String() string { return proto.CompactTextString(m) } func (*WindowerSpec) ProtoMessage() {} func (*WindowerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15} } func (m *WindowerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1648,7 +1651,7 @@ func (m *WindowerSpec_Func) Reset() { *m = WindowerSpec_Func{} } func (m *WindowerSpec_Func) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Func) ProtoMessage() {} func (*WindowerSpec_Func) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 0} } func (m *WindowerSpec_Func) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1684,7 +1687,7 @@ func (m *WindowerSpec_Frame) Reset() { *m = WindowerSpec_Frame{} } func (m *WindowerSpec_Frame) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame) ProtoMessage() {} func (*WindowerSpec_Frame) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 1} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 1} } func (m *WindowerSpec_Frame) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1725,7 +1728,7 @@ func (m *WindowerSpec_Frame_Bound) Reset() { *m = WindowerSpec_Frame_Bou func (m *WindowerSpec_Frame_Bound) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bound) ProtoMessage() {} func (*WindowerSpec_Frame_Bound) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 1, 0} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 1, 0} } func (m *WindowerSpec_Frame_Bound) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1761,7 +1764,7 @@ func (m *WindowerSpec_Frame_Bounds) Reset() { *m = WindowerSpec_Frame_Bo func (m *WindowerSpec_Frame_Bounds) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bounds) ProtoMessage() {} func (*WindowerSpec_Frame_Bounds) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 1, 1} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 1, 1} } func (m *WindowerSpec_Frame_Bounds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1811,7 +1814,7 @@ func (m *WindowerSpec_WindowFn) Reset() { *m = WindowerSpec_WindowFn{} } func (m *WindowerSpec_WindowFn) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_WindowFn) ProtoMessage() {} func (*WindowerSpec_WindowFn) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_sql_0901999adc18b9c0, []int{15, 2} + return fileDescriptor_processors_sql_fcf41d6067fc431e, []int{15, 2} } func (m *WindowerSpec_WindowFn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7999,190 +8002,190 @@ var ( ) func init() { - proto.RegisterFile("sql/execinfrapb/processors_sql.proto", fileDescriptor_processors_sql_0901999adc18b9c0) + proto.RegisterFile("sql/execinfrapb/processors_sql.proto", fileDescriptor_processors_sql_fcf41d6067fc431e) } -var fileDescriptor_processors_sql_0901999adc18b9c0 = []byte{ +var fileDescriptor_processors_sql_fcf41d6067fc431e = []byte{ // 2881 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcd, 0x6f, 0x1b, 0xc7, - 0x15, 0xd7, 0xf2, 0x43, 0x22, 0x1f, 0x3f, 0x34, 0x1e, 0x3b, 0x31, 0xa3, 0xa4, 0xb2, 0x4c, 0x3b, - 0xb6, 0xec, 0x38, 0x52, 0xa3, 0x16, 0x29, 0x92, 0x16, 0x45, 0x57, 0xe4, 0x92, 0xa6, 0x4c, 0xed, - 0xd2, 0x4b, 0x52, 0x96, 0x13, 0x20, 0x83, 0x15, 0x39, 0xa2, 0x36, 0x5e, 0xee, 0x52, 0xbb, 0x4b, - 0x4b, 0xca, 0xa9, 0xe8, 0xa5, 0xa7, 0x02, 0x05, 0x7a, 0x29, 0x50, 0xa0, 0x08, 0x0a, 0xf4, 0x3f, - 0xe8, 0xb9, 0xa7, 0x1e, 0x7c, 0xcc, 0xa9, 0xcd, 0x29, 0x68, 0x9c, 0x9e, 0xfa, 0x0f, 0x14, 0xbd, - 0x15, 0x33, 0x3b, 0xbb, 0x5a, 0x0a, 0xa2, 0x6b, 0x3a, 0x4e, 0x7c, 0x31, 0x38, 0xef, 0xbd, 0xdf, - 0x9b, 0x37, 0xef, 0x6b, 0xde, 0xac, 0x0c, 0xd7, 0xbd, 0x43, 0x6b, 0x9d, 0x1e, 0xd3, 0x9e, 0x69, - 0xef, 0xbb, 0xc6, 0x68, 0x6f, 0x7d, 0xe4, 0x3a, 0x3d, 0xea, 0x79, 0x8e, 0xeb, 0x11, 0xef, 0xd0, - 0x5a, 0x1b, 0xb9, 0x8e, 0xef, 0xe0, 0x52, 0xcf, 0xe9, 0x3d, 0x72, 0x1d, 0xa3, 0x77, 0xb0, 0xc6, - 0x88, 0x7d, 0xd3, 0xf3, 0xbd, 0x43, 0xcb, 0x1d, 0xdb, 0x4b, 0xd7, 0x18, 0xbe, 0x67, 0xf8, 0x86, - 0xe5, 0x0c, 0xd6, 0xfb, 0xd4, 0xeb, 0x8d, 0xf6, 0xd6, 0x3d, 0xdf, 0x1d, 0xf7, 0xfc, 0xb1, 0x4b, - 0xfb, 0x01, 0x7c, 0xa9, 0x7c, 0x8e, 0xd0, 0xa7, 0x8e, 0x69, 0x13, 0xff, 0x64, 0x44, 0x85, 0xcc, - 0xca, 0x39, 0x32, 0x96, 0xd3, 0x7b, 0x64, 0xda, 0x03, 0x21, 0xf1, 0x1a, 0x93, 0x60, 0x08, 0x2f, - 0xf8, 0x57, 0x90, 0x97, 0xce, 0x9e, 0xa0, 0x6f, 0xf8, 0x86, 0xe0, 0xbd, 0xfd, 0x8c, 0xd3, 0xed, - 0x19, 0x5e, 0xb8, 0xf7, 0x6d, 0x26, 0xe6, 0x8c, 0xfc, 0x75, 0xd3, 0x7e, 0x4c, 0x5d, 0x9f, 0xf6, - 0xe9, 0xf1, 0xc8, 0x5d, 0xf7, 0x46, 0x86, 0x4d, 0xd8, 0x2f, 0xea, 0x79, 0xa6, 0x63, 0x0b, 0xd9, - 0x4b, 0x03, 0x67, 0xe0, 0xf0, 0x9f, 0xeb, 0xec, 0x57, 0x40, 0x2d, 0xff, 0x4e, 0x82, 0xe2, 0x8e, - 0x61, 0x8d, 0xa9, 0x57, 0x71, 0x5c, 0xda, 0x1e, 0xd1, 0x1e, 0xae, 0xc0, 0x42, 0xcf, 0xb1, 0xc6, - 0x43, 0xdb, 0x2b, 0x49, 0x2b, 0xc9, 0xd5, 0xdc, 0xc6, 0xb5, 0xb5, 0x69, 0x5e, 0x5c, 0xab, 0x1a, - 0xfe, 0x78, 0xd8, 0xb0, 0xf7, 0x9d, 0xcd, 0xd4, 0x93, 0xaf, 0xae, 0xcc, 0xe9, 0x21, 0x12, 0xbf, - 0x09, 0x59, 0xd7, 0x38, 0x22, 0x7b, 0x27, 0x3e, 0xf5, 0x4a, 0x89, 0x95, 0xe4, 0x6a, 0x5e, 0xcf, - 0xb8, 0xc6, 0xd1, 0x26, 0x5b, 0xe3, 0x2b, 0x90, 0xb1, 0xc7, 0x43, 0xe2, 0x3a, 0x47, 0x5e, 0x29, - 0xb9, 0x22, 0xad, 0xa6, 0x42, 0xb4, 0x3d, 0x1e, 0xea, 0xce, 0x91, 0x57, 0xfe, 0xd5, 0x3c, 0x2c, - 0x76, 0x8c, 0x3d, 0x8b, 0xea, 0xd4, 0xe8, 0x53, 0x97, 0x9b, 0xb5, 0x09, 0x69, 0x9f, 0x91, 0x4a, - 0xd2, 0x8a, 0xb4, 0x9a, 0xdb, 0xb8, 0x71, 0xc6, 0x28, 0xef, 0xd0, 0xe2, 0x8e, 0xe1, 0xb0, 0x2a, - 0xf5, 0x7a, 0xae, 0x39, 0xf2, 0x1d, 0x57, 0x68, 0x0e, 0xa0, 0xf8, 0x2a, 0x64, 0x4d, 0xbb, 0x4f, - 0x8f, 0x89, 0xd9, 0x3f, 0x2e, 0x25, 0x56, 0xa4, 0xd5, 0x82, 0xe0, 0x67, 0x38, 0xb9, 0xd1, 0x3f, - 0xc6, 0xcb, 0xb0, 0xe0, 0xd2, 0xc7, 0xd4, 0xf5, 0x28, 0x37, 0x2d, 0x13, 0x9a, 0x26, 0x88, 0x58, - 0x81, 0x34, 0xf3, 0xaf, 0x57, 0x4a, 0x71, 0xdf, 0xdc, 0x9a, 0xee, 0x9b, 0x89, 0x03, 0x18, 0x76, - 0x68, 0x09, 0x47, 0xe3, 0x6b, 0x00, 0x96, 0x39, 0x34, 0x7d, 0x72, 0x60, 0xda, 0x7e, 0x29, 0xbd, - 0x22, 0xad, 0x26, 0x85, 0x40, 0x96, 0xd3, 0xef, 0x9a, 0xb6, 0xcf, 0xfc, 0x64, 0x7a, 0xa4, 0x77, - 0x40, 0x7b, 0x8f, 0x4a, 0xf3, 0x71, 0x63, 0x4c, 0xaf, 0xc2, 0x88, 0x58, 0x05, 0x78, 0x6c, 0x7a, - 0xe6, 0x9e, 0x69, 0x99, 0xfe, 0x49, 0x69, 0x61, 0x45, 0x5a, 0x2d, 0x6e, 0xac, 0x4e, 0xb7, 0xa8, - 0xdd, 0x33, 0xec, 0x9d, 0x48, 0x5e, 0x28, 0x8b, 0x69, 0xc0, 0x3f, 0x85, 0xcb, 0x43, 0xe3, 0x98, - 0xf8, 0xe6, 0x90, 0x7a, 0xbe, 0x31, 0x1c, 0x11, 0x63, 0x40, 0x89, 0x6d, 0xd8, 0x8e, 0x57, 0xca, - 0xc6, 0xe2, 0x74, 0x69, 0x68, 0x1c, 0x77, 0x42, 0x19, 0x79, 0x40, 0x55, 0x26, 0x81, 0x3f, 0x06, - 0x24, 0xf2, 0x9e, 0x78, 0xbe, 0x4b, 0xed, 0x81, 0x7f, 0x50, 0x02, 0x6e, 0xd2, 0xed, 0x29, 0xb1, - 0x62, 0xf6, 0x34, 0x03, 0x48, 0x5b, 0x20, 0xc4, 0x0e, 0x8b, 0xd6, 0x24, 0x19, 0xef, 0xc1, 0xc5, - 0x50, 0xf9, 0x91, 0x61, 0xfa, 0x64, 0xe4, 0x58, 0x66, 0xef, 0xa4, 0x94, 0xe3, 0xfa, 0xef, 0xfc, - 0x7f, 0xfd, 0x0f, 0x0c, 0xd3, 0x6f, 0x71, 0x8c, 0xd8, 0xe1, 0x82, 0x75, 0x96, 0x81, 0x6f, 0x40, - 0x6e, 0x64, 0xb8, 0x86, 0x65, 0x51, 0xcb, 0xfc, 0x8c, 0x96, 0xf2, 0x31, 0x8f, 0xc7, 0x19, 0x78, - 0x03, 0xf0, 0x81, 0xe1, 0x11, 0xef, 0xc4, 0xf3, 0xe9, 0x90, 0x84, 0xb5, 0x52, 0x8c, 0x89, 0xa3, - 0x03, 0xc3, 0x6b, 0x73, 0x76, 0x45, 0xd4, 0xc3, 0xdb, 0x50, 0xb4, 0x29, 0xed, 0xd3, 0x7e, 0x24, - 0xbf, 0xb8, 0x92, 0x5c, 0x2d, 0xe8, 0x85, 0x80, 0x2a, 0xc4, 0xb6, 0x52, 0x99, 0x0c, 0xca, 0x6e, - 0xa5, 0x32, 0x05, 0x54, 0x2c, 0xeb, 0x90, 0xaf, 0x99, 0x96, 0x4f, 0xdd, 0xa8, 0x00, 0xe6, 0xf7, - 0xf9, 0x5a, 0x54, 0xc0, 0xf5, 0xe9, 0x81, 0x56, 0xa2, 0xe2, 0x17, 0x06, 0x09, 0x64, 0xf9, 0xbf, - 0x49, 0x28, 0x35, 0x58, 0xaa, 0xb7, 0x1f, 0x99, 0xa3, 0x57, 0x54, 0x61, 0x51, 0x05, 0x25, 0xbf, - 0x55, 0x05, 0x4d, 0xe6, 0x7e, 0xea, 0x5b, 0xe7, 0x7e, 0xac, 0xf0, 0xd3, 0xe7, 0x15, 0xfe, 0x79, - 0xe9, 0x3d, 0xff, 0x1d, 0xa7, 0xf7, 0xc2, 0x4b, 0x4c, 0xef, 0xf2, 0x2f, 0x17, 0xa0, 0xb8, 0xe5, - 0x98, 0xf6, 0xf7, 0x1f, 0xf1, 0x5b, 0x50, 0xb4, 0x1c, 0xe7, 0xd1, 0x78, 0x14, 0x25, 0x3f, 0x0b, - 0x7d, 0x61, 0x33, 0x81, 0x24, 0xbd, 0x10, 0x70, 0xc2, 0x3a, 0xa9, 0xc0, 0x82, 0x13, 0x5c, 0x5e, - 0x3c, 0xa4, 0x33, 0x66, 0xb9, 0x63, 0x33, 0x1a, 0xfe, 0x00, 0x52, 0xec, 0xa2, 0x15, 0xe1, 0xb9, - 0x32, 0xe5, 0x54, 0xcc, 0x17, 0x9d, 0x93, 0x11, 0x15, 0x60, 0x0e, 0x79, 0xe9, 0x1d, 0xf5, 0x03, - 0x78, 0x7d, 0xf2, 0xe8, 0xc4, 0x70, 0x29, 0x79, 0x44, 0x4f, 0x4a, 0x99, 0x58, 0x92, 0x5d, 0x9c, - 0x70, 0x82, 0xec, 0xd2, 0x7b, 0xf4, 0xe4, 0xdc, 0x84, 0xcb, 0x7e, 0xc7, 0x09, 0x07, 0x2f, 0xb3, - 0x9f, 0xbe, 0x07, 0x17, 0x86, 0x86, 0x69, 0xfb, 0x86, 0x69, 0x13, 0xc7, 0xed, 0x53, 0xd7, 0xb4, - 0x07, 0xbc, 0x63, 0x47, 0x6d, 0x32, 0x64, 0x6b, 0x82, 0x3b, 0xa5, 0xb5, 0x16, 0x9e, 0xd9, 0x5a, - 0xab, 0xf0, 0x96, 0x45, 0xf7, 0x7d, 0xc2, 0x07, 0xb3, 0x23, 0xd3, 0x3f, 0x20, 0x23, 0xc3, 0x74, - 0x69, 0x9f, 0x13, 0xa8, 0x3b, 0xd1, 0x98, 0x4b, 0x4c, 0x92, 0x05, 0xfe, 0x81, 0xe9, 0x1f, 0xb4, - 0xb8, 0xd8, 0x16, 0x97, 0xc2, 0x0f, 0xe0, 0x86, 0x33, 0xf6, 0x47, 0x63, 0x9f, 0x0c, 0x5c, 0x87, - 0x87, 0xcb, 0xf6, 0x4d, 0x7b, 0x6c, 0xf8, 0xa6, 0x63, 0x93, 0x7d, 0xc7, 0x25, 0x7c, 0x0f, 0xd7, - 0x39, 0x2a, 0x2d, 0xc6, 0xf4, 0x5d, 0x0d, 0x30, 0x75, 0x06, 0xa9, 0xc4, 0x10, 0x35, 0xc7, 0x6d, - 0xd2, 0x7d, 0x5f, 0x77, 0x8e, 0xb6, 0x52, 0x99, 0x34, 0x9a, 0xdf, 0x4a, 0x65, 0xf2, 0xa8, 0xc0, - 0xa6, 0x2d, 0x68, 0x3b, 0xae, 0x2f, 0xca, 0xef, 0x3e, 0x2c, 0x8a, 0x3d, 0x23, 0xf7, 0x04, 0x85, - 0x58, 0x9e, 0x9e, 0x71, 0xa1, 0xab, 0x84, 0x01, 0xc5, 0x40, 0x41, 0xdc, 0x81, 0xa1, 0x2e, 0x32, - 0x34, 0xfc, 0xde, 0x01, 0xb1, 0xa8, 0x3d, 0x51, 0x96, 0x28, 0xe4, 0x6f, 0x33, 0x76, 0x93, 0xda, - 0xe5, 0xbf, 0x4a, 0x90, 0xaf, 0x9a, 0x9e, 0x6f, 0xda, 0x3d, 0x9f, 0xdb, 0x75, 0x13, 0x16, 0xb9, - 0x50, 0xec, 0xb6, 0x92, 0xf8, 0x6d, 0x55, 0x14, 0xe4, 0xd0, 0xf5, 0xb7, 0x00, 0xf5, 0x05, 0x30, - 0x92, 0x4c, 0x70, 0xc9, 0xc5, 0x90, 0x1e, 0x8a, 0x6e, 0x00, 0xb6, 0xc7, 0x96, 0x15, 0xe4, 0x7f, - 0xc8, 0x9c, 0x18, 0xb1, 0x10, 0xe7, 0xcb, 0x2e, 0x0d, 0x6d, 0xc1, 0x37, 0x20, 0x4f, 0x5d, 0xd7, - 0x71, 0x89, 0x63, 0x93, 0xfe, 0x78, 0xc4, 0x3b, 0x42, 0x36, 0x2c, 0x32, 0xce, 0xd1, 0xec, 0xea, - 0x78, 0x54, 0x46, 0x50, 0xd4, 0xdc, 0xbe, 0x69, 0x1b, 0xac, 0xe4, 0xd8, 0x09, 0xca, 0xbf, 0x4f, - 0x02, 0xfa, 0xc8, 0x1c, 0x7c, 0x66, 0x0c, 0x82, 0xf0, 0xf2, 0x63, 0x55, 0x61, 0x9e, 0xb7, 0xac, - 0x70, 0xae, 0x9d, 0xad, 0xdd, 0x09, 0x2c, 0xae, 0x01, 0xd0, 0xc3, 0x89, 0xd3, 0xe6, 0x36, 0xae, - 0x4e, 0x8f, 0x97, 0x38, 0x7f, 0x38, 0xdc, 0xd1, 0xc3, 0x53, 0xdf, 0x15, 0x83, 0xbe, 0xe9, 0x04, - 0xa6, 0x4f, 0x34, 0x45, 0xce, 0x11, 0x67, 0x7a, 0x49, 0x4d, 0xf1, 0x1e, 0xe4, 0xf7, 0xcd, 0x63, - 0xda, 0x27, 0x8f, 0xf9, 0xb8, 0x5f, 0x4a, 0x73, 0xcb, 0x9f, 0xd1, 0xdb, 0x26, 0x9f, 0x05, 0x7a, - 0x8e, 0xa3, 0x03, 0xe2, 0xb7, 0xe8, 0xb0, 0xe5, 0xbf, 0x27, 0x61, 0x71, 0x9b, 0xba, 0x03, 0x1a, - 0x8b, 0xcc, 0x36, 0x14, 0x78, 0x79, 0xbd, 0x70, 0x19, 0xe4, 0x19, 0x3c, 0x2a, 0x02, 0x0d, 0x8a, - 0xae, 0x39, 0x38, 0x88, 0xe9, 0x4b, 0xcc, 0xa8, 0xaf, 0xc0, 0xf1, 0x91, 0xc2, 0x58, 0x00, 0xd2, - 0xaf, 0xe2, 0x56, 0xba, 0x05, 0x05, 0x56, 0x1c, 0x84, 0x1e, 0x8e, 0x8d, 0xe8, 0x62, 0x0a, 0xeb, - 0x26, 0xcf, 0x58, 0x8a, 0xe0, 0xe0, 0x0f, 0xe1, 0x32, 0x77, 0xe5, 0x69, 0x8e, 0x4e, 0xb9, 0x71, - 0xe8, 0xbe, 0xaf, 0x1c, 0x4e, 0xde, 0x38, 0x3f, 0x83, 0x52, 0xe0, 0xb7, 0x73, 0xc0, 0xd9, 0x18, - 0xf8, 0x12, 0x97, 0x3a, 0x83, 0x2e, 0xff, 0x3b, 0x01, 0xc5, 0xbb, 0x86, 0x77, 0x10, 0x8b, 0xeb, - 0x6d, 0x58, 0x3c, 0x63, 0x4c, 0xd0, 0x48, 0xc4, 0xcd, 0x1f, 0x37, 0x01, 0xdf, 0x01, 0x74, 0x76, - 0xf3, 0xa0, 0x97, 0x70, 0xe1, 0xe2, 0xe4, 0x96, 0xaf, 0x3c, 0x22, 0xaf, 0xcc, 0xcd, 0x5b, 0xa9, - 0xcc, 0x02, 0xca, 0x94, 0xbf, 0x4a, 0x02, 0x6e, 0x88, 0x47, 0x7f, 0xcc, 0xe1, 0xdf, 0xd3, 0x40, - 0xa7, 0x41, 0x21, 0xfc, 0xe2, 0xf0, 0xa2, 0x6d, 0x29, 0x1f, 0x2a, 0xe0, 0x91, 0x78, 0xd5, 0xe1, - 0x3c, 0x77, 0x54, 0x59, 0x78, 0xe6, 0xa8, 0xf2, 0xfc, 0x03, 0x43, 0x66, 0xd6, 0x81, 0x21, 0x89, - 0x52, 0xe5, 0x3f, 0x25, 0xe1, 0x52, 0x18, 0xe0, 0x89, 0x67, 0xe0, 0x1a, 0xa0, 0xc8, 0xf7, 0x3d, - 0xc7, 0xe2, 0x51, 0x92, 0x62, 0x51, 0x2a, 0x86, 0xdc, 0x8a, 0x63, 0xb1, 0x58, 0x7d, 0x72, 0x36, - 0x56, 0x41, 0x2f, 0xfc, 0xd1, 0x19, 0xf7, 0x38, 0x23, 0x7f, 0x2d, 0xfe, 0x15, 0x69, 0x8d, 0xbd, - 0xb8, 0x4e, 0x5d, 0xdd, 0x72, 0x1d, 0xdf, 0x39, 0x37, 0x74, 0x9f, 0xc2, 0x85, 0x91, 0x4b, 0xc9, - 0xbe, 0xb0, 0x91, 0x78, 0x23, 0xda, 0xe3, 0x21, 0xc8, 0x6d, 0xfc, 0x7c, 0x7a, 0x10, 0xcf, 0x3b, - 0xda, 0x5a, 0xcb, 0xa5, 0xf1, 0xb5, 0xbe, 0x38, 0x9a, 0x24, 0x2c, 0xfd, 0x46, 0x82, 0xc5, 0x33, - 0x42, 0x78, 0x0b, 0xe0, 0xf4, 0x5b, 0xd7, 0x0b, 0x3c, 0x8d, 0x63, 0x68, 0xbc, 0x26, 0x32, 0x28, - 0x70, 0xd1, 0xd2, 0xd9, 0x0c, 0xa2, 0xc3, 0xb5, 0xe0, 0x03, 0x5e, 0x47, 0xdc, 0x65, 0xff, 0xca, - 0x42, 0x51, 0x1e, 0x0c, 0x5c, 0x3a, 0x30, 0x7c, 0x27, 0x30, 0xe7, 0x2a, 0x40, 0x98, 0x0f, 0x56, - 0xbc, 0x81, 0x65, 0x07, 0x41, 0xc8, 0x2d, 0x0f, 0x7f, 0x02, 0x79, 0x43, 0x80, 0x4c, 0x27, 0x7a, - 0x07, 0xff, 0x78, 0xba, 0xcd, 0x93, 0x5b, 0x44, 0xcb, 0x58, 0x31, 0xc5, 0xf5, 0xe1, 0x1f, 0x8a, - 0x19, 0x90, 0xf6, 0x49, 0xcc, 0x94, 0x54, 0x64, 0x0a, 0x12, 0xdc, 0x7a, 0x64, 0x51, 0x5d, 0x9c, - 0x3b, 0xcd, 0x2b, 0xe7, 0xdd, 0xe7, 0xb6, 0xe4, 0x6c, 0x1d, 0x2d, 0xfd, 0x3a, 0x01, 0xb9, 0x98, - 0x79, 0x4c, 0xf1, 0xfe, 0xd8, 0xee, 0xf1, 0xb0, 0xcc, 0xa2, 0xb8, 0x36, 0xb6, 0x7b, 0xa1, 0x62, - 0xa6, 0x00, 0xaf, 0x40, 0x26, 0x1a, 0x1a, 0x13, 0xb1, 0x7a, 0x8a, 0xa8, 0xf8, 0x3a, 0x14, 0x83, - 0x1c, 0x8c, 0xaa, 0x82, 0x35, 0xa5, 0x82, 0x9e, 0x0f, 0xa8, 0xa2, 0x1a, 0x2e, 0xf3, 0x8f, 0x9b, - 0x9c, 0x9d, 0xe6, 0x83, 0xea, 0x7c, 0x2f, 0x60, 0xdc, 0x85, 0xac, 0xe1, 0x0e, 0xc6, 0x43, 0x6a, - 0xfb, 0x5e, 0x69, 0x9e, 0x47, 0x64, 0x96, 0x2c, 0x3a, 0x05, 0x8b, 0xfa, 0xfd, 0x43, 0x1a, 0x52, - 0xec, 0x14, 0x18, 0x41, 0x5e, 0x56, 0x1f, 0x12, 0x55, 0xeb, 0x10, 0xb5, 0xdb, 0x6c, 0xa2, 0x39, - 0xbc, 0x00, 0x49, 0x79, 0xa7, 0x8e, 0x24, 0x9c, 0x87, 0xcc, 0xa6, 0xa6, 0x35, 0x89, 0xac, 0x56, - 0x51, 0x02, 0xe7, 0x60, 0x81, 0xaf, 0x34, 0x1d, 0x25, 0x71, 0x11, 0xa0, 0xa2, 0xa9, 0x15, 0xb9, - 0x43, 0xe4, 0x7a, 0x1d, 0xa5, 0x70, 0x16, 0xd2, 0x15, 0xad, 0xab, 0x76, 0x50, 0x9a, 0xc1, 0xb7, - 0xe5, 0x5d, 0xb4, 0xc0, 0x7f, 0x34, 0x54, 0x94, 0xc1, 0x00, 0xf3, 0xed, 0x4e, 0xb5, 0xaa, 0xec, - 0xa0, 0x2c, 0x23, 0xb6, 0xbb, 0xdb, 0x08, 0x98, 0xba, 0x76, 0x77, 0x9b, 0x34, 0xd4, 0x0e, 0xca, - 0xb1, 0x9d, 0x76, 0x64, 0xbd, 0x21, 0xab, 0x15, 0x05, 0xe5, 0x19, 0x6b, 0x57, 0xd3, 0xb9, 0xe6, - 0x42, 0xb0, 0x53, 0x57, 0xed, 0x10, 0x5d, 0x7b, 0xd0, 0x46, 0x45, 0x8e, 0xbb, 0xaf, 0x57, 0x1b, - 0xb5, 0x1a, 0x5a, 0xc4, 0x18, 0x8a, 0xb5, 0x86, 0x2a, 0x37, 0x49, 0x84, 0x46, 0xec, 0x40, 0x01, - 0x4d, 0xec, 0x79, 0x01, 0x17, 0x20, 0x2b, 0xeb, 0xba, 0xfc, 0x90, 0x6b, 0xc4, 0x6c, 0xb3, 0xad, - 0xb6, 0xa6, 0xf2, 0xd5, 0x45, 0xc6, 0x64, 0xab, 0x4d, 0xbe, 0xbc, 0xc4, 0xb6, 0x6b, 0x77, 0xf4, - 0x86, 0x5a, 0xe7, 0xeb, 0xd7, 0xf8, 0xa9, 0x1b, 0x1d, 0xee, 0x82, 0xd7, 0xd9, 0x41, 0xd8, 0x42, - 0xd3, 0xd1, 0x65, 0x9c, 0x81, 0x54, 0x45, 0xd3, 0x75, 0x54, 0xc2, 0x25, 0xb8, 0xd4, 0x52, 0xf4, - 0x8a, 0xa2, 0x76, 0x1a, 0x4d, 0x85, 0x54, 0x1b, 0xed, 0x0a, 0x69, 0x6c, 0xb7, 0x9a, 0xe8, 0x8d, - 0x33, 0x9c, 0x8a, 0xa6, 0x76, 0x02, 0xce, 0x12, 0xbe, 0x08, 0x8b, 0xdc, 0x06, 0x6d, 0x73, 0x4b, - 0xa9, 0x04, 0x4e, 0x7c, 0x13, 0x5f, 0x02, 0x14, 0x98, 0x12, 0xa3, 0xbe, 0xc5, 0x2c, 0xd8, 0x91, - 0x75, 0xd2, 0xd2, 0x5a, 0xe8, 0x07, 0x81, 0x79, 0xec, 0x58, 0x7c, 0xbd, 0x8c, 0x17, 0x21, 0xd7, - 0xee, 0x90, 0x6d, 0xf9, 0x9e, 0xd2, 0x6c, 0xa8, 0x0a, 0xba, 0xc2, 0x8e, 0xd3, 0xee, 0x10, 0x65, - 0xb7, 0xa3, 0xa8, 0x1d, 0xb4, 0xc2, 0xce, 0xda, 0xee, 0x90, 0xae, 0xda, 0xd0, 0x54, 0x74, 0x35, - 0x40, 0x93, 0x8a, 0xd6, 0x6c, 0x2a, 0x95, 0x0e, 0x2a, 0x33, 0xe1, 0x8a, 0x16, 0x2a, 0xbf, 0x16, - 0xb8, 0x9a, 0x2d, 0xdb, 0xf2, 0x76, 0x0b, 0x5d, 0x67, 0xde, 0xd5, 0x95, 0xba, 0xce, 0x62, 0xc4, - 0x4e, 0xd1, 0xea, 0xa0, 0xb7, 0x99, 0x35, 0x9c, 0xa6, 0x6f, 0xa0, 0x1b, 0x0c, 0xc0, 0x17, 0xed, - 0xa6, 0xd6, 0x52, 0xd0, 0x4d, 0xb6, 0x5b, 0xb0, 0xde, 0xdd, 0x45, 0xab, 0xa7, 0xab, 0x87, 0x0f, - 0xd1, 0xad, 0x18, 0xef, 0x21, 0xba, 0x1d, 0x21, 0x83, 0xa4, 0x79, 0x87, 0x59, 0xc2, 0xd7, 0xf2, - 0x4e, 0x7d, 0x17, 0xdd, 0x29, 0xdf, 0x81, 0x14, 0xab, 0x5d, 0xe6, 0x64, 0xb9, 0xdb, 0xd1, 0xd0, - 0x1c, 0xcf, 0xa1, 0x8a, 0xdc, 0x94, 0x75, 0x24, 0x31, 0xb0, 0xaa, 0xa9, 0x44, 0xac, 0x13, 0xe5, - 0xbf, 0x49, 0x50, 0x6c, 0xb9, 0xce, 0xa7, 0xb4, 0xe7, 0xb7, 0x69, 0xf0, 0x44, 0xfc, 0x05, 0xa4, - 0x59, 0xdf, 0x0c, 0x9f, 0x52, 0xb3, 0x94, 0x4a, 0x00, 0xc4, 0x75, 0xb8, 0x30, 0xa0, 0x36, 0x75, - 0x0d, 0x3f, 0xf6, 0xcc, 0x0c, 0x9e, 0x53, 0xcf, 0x6a, 0xbc, 0x28, 0x02, 0x85, 0xa3, 0xe0, 0x4d, - 0x40, 0xf6, 0x98, 0x7f, 0x2c, 0xf0, 0xc8, 0x88, 0xba, 0x64, 0x40, 0xed, 0xe0, 0x29, 0xa5, 0x17, - 0xec, 0xf1, 0x90, 0xf5, 0xb7, 0x16, 0x75, 0xeb, 0xd4, 0x2e, 0x7f, 0x5d, 0x80, 0xfc, 0x03, 0xd3, - 0xee, 0x3b, 0x47, 0xe2, 0xea, 0x58, 0xe1, 0x1f, 0x7c, 0x7d, 0x93, 0x77, 0xd2, 0x13, 0xf1, 0xc6, - 0x8d, 0x93, 0x70, 0x1b, 0xb2, 0x47, 0x1c, 0x51, 0x8b, 0x8c, 0x5b, 0x9f, 0x7e, 0xd4, 0xb8, 0x72, - 0xb1, 0xa8, 0x45, 0x0d, 0x22, 0xd2, 0xb3, 0xf4, 0x17, 0x49, 0xb4, 0x86, 0x36, 0x14, 0xc2, 0xc6, - 0x4d, 0x6b, 0x2f, 0xda, 0x26, 0xf5, 0x49, 0x1d, 0xf8, 0x3e, 0x80, 0xd8, 0x8a, 0x69, 0x4c, 0x70, - 0x8d, 0xef, 0xcd, 0x66, 0x33, 0xd3, 0x1a, 0x53, 0xf2, 0x61, 0xea, 0xc9, 0xe7, 0x57, 0xa4, 0xa5, - 0xcf, 0x17, 0x20, 0x5d, 0x73, 0x8d, 0x21, 0xc5, 0xf7, 0x20, 0x35, 0x74, 0xfa, 0x54, 0x98, 0xfb, - 0xbc, 0xca, 0x39, 0x76, 0x6d, 0xdb, 0xe9, 0x47, 0x57, 0x06, 0x53, 0x82, 0xef, 0xc3, 0xfc, 0x9e, - 0x33, 0xb6, 0xfb, 0xde, 0x94, 0xc1, 0xe4, 0xd9, 0xea, 0x36, 0x39, 0x34, 0x1c, 0x04, 0x03, 0x45, - 0xf8, 0x23, 0xc8, 0xd2, 0xe3, 0x9e, 0x35, 0xe6, 0x13, 0x41, 0x92, 0x1b, 0xf9, 0xfe, 0x4c, 0x5a, - 0x95, 0x10, 0x1d, 0x3d, 0xdb, 0x43, 0xc2, 0xd2, 0x7f, 0x24, 0x48, 0xf3, 0x4d, 0xd9, 0x2e, 0x7c, - 0x3f, 0x56, 0x48, 0xc2, 0x15, 0xef, 0xcf, 0x6e, 0x7b, 0xec, 0x0a, 0x3d, 0x55, 0x87, 0xaf, 0x01, - 0x98, 0xb6, 0x4f, 0x9c, 0xfd, 0x7d, 0x8f, 0x06, 0x17, 0x5e, 0xf8, 0xb7, 0x97, 0xac, 0x69, 0xfb, - 0x1a, 0x27, 0xe3, 0xab, 0x90, 0x67, 0x55, 0xd1, 0x0f, 0xc5, 0xd8, 0x49, 0xf3, 0x7a, 0x8e, 0xd3, - 0x84, 0xc8, 0x16, 0xe4, 0x02, 0x26, 0xff, 0x8b, 0xa5, 0x18, 0xd3, 0x67, 0xf8, 0x7b, 0x1e, 0x04, - 0x68, 0x66, 0xd3, 0xd2, 0x1f, 0x25, 0x98, 0x0f, 0xdc, 0x8d, 0x55, 0x48, 0x7b, 0xbe, 0xe1, 0xfa, - 0x62, 0xdc, 0xda, 0x98, 0xfd, 0xd8, 0xd1, 0xb7, 0x7c, 0xa6, 0x06, 0x57, 0x21, 0x49, 0xed, 0xbe, - 0x48, 0x80, 0x17, 0xd0, 0xa6, 0x33, 0x78, 0xf9, 0x26, 0xa4, 0x58, 0x76, 0xb1, 0xbb, 0x52, 0x97, - 0xd5, 0xba, 0x82, 0xe6, 0x58, 0x7f, 0xe3, 0xd7, 0x9a, 0xc4, 0xfa, 0x5b, 0x5d, 0xd7, 0xba, 0xad, - 0x36, 0x4a, 0x94, 0x3f, 0x83, 0x6c, 0xe4, 0x7b, 0x7c, 0x19, 0x2e, 0x76, 0xd5, 0x4d, 0xad, 0xab, - 0x56, 0x95, 0x2a, 0x69, 0xe9, 0x4a, 0x45, 0xa9, 0x36, 0xd4, 0x3a, 0x9a, 0x9b, 0x64, 0xd4, 0xb4, - 0x66, 0x53, 0x7b, 0xc0, 0x18, 0x12, 0xbb, 0x46, 0xb4, 0x5a, 0xad, 0xad, 0x74, 0x62, 0xe2, 0x89, - 0x18, 0xf5, 0x54, 0x36, 0xc9, 0xee, 0x8f, 0x4a, 0x57, 0xd7, 0x95, 0xe0, 0x7e, 0x45, 0xa9, 0xf2, - 0xc7, 0x90, 0x8d, 0xb2, 0x8b, 0x5d, 0xa5, 0xaa, 0x46, 0x94, 0xdd, 0x4a, 0xb3, 0xdb, 0x66, 0x37, - 0x08, 0xdf, 0x94, 0x2f, 0xab, 0x0a, 0x89, 0xe3, 0x24, 0x7c, 0x01, 0x0a, 0x21, 0x83, 0x9f, 0x03, - 0x25, 0x18, 0x3a, 0x24, 0x75, 0x1a, 0x4a, 0x1b, 0x25, 0x97, 0xfe, 0x91, 0x80, 0x4c, 0xd8, 0x77, - 0xb0, 0x12, 0x9b, 0xbd, 0x72, 0x1b, 0xef, 0x3c, 0xaf, 0x57, 0xcf, 0x4e, 0x5e, 0x55, 0xc8, 0x44, - 0x2f, 0xa2, 0xd4, 0x8c, 0x9f, 0x51, 0x22, 0x24, 0x7b, 0x98, 0xee, 0xb3, 0x78, 0x89, 0xe7, 0xdd, - 0x9d, 0x59, 0x62, 0xac, 0x07, 0x50, 0xbc, 0x0a, 0x13, 0xb3, 0x1c, 0x7f, 0x64, 0xa4, 0xc3, 0x09, - 0x78, 0x62, 0xca, 0x5b, 0x82, 0x8c, 0xe1, 0x0e, 0xbc, 0x46, 0xff, 0xd8, 0x2b, 0x2d, 0xf0, 0xae, - 0x1e, 0xad, 0x99, 0x96, 0xe0, 0x0d, 0x26, 0xb4, 0x64, 0x62, 0x6f, 0xa7, 0x09, 0xce, 0x56, 0x2a, - 0x93, 0x40, 0x49, 0x31, 0xce, 0xfd, 0x59, 0x02, 0x38, 0xed, 0x8e, 0xfc, 0x7a, 0xd5, 0x1e, 0x10, - 0xb5, 0xbb, 0xbd, 0xa9, 0xe8, 0x22, 0xcf, 0x64, 0xf5, 0x5e, 0x70, 0x77, 0x56, 0x15, 0xb5, 0xad, - 0x10, 0xbe, 0xe6, 0x41, 0x12, 0x23, 0x4a, 0x40, 0x49, 0xf2, 0xa1, 0xa0, 0xbb, 0xcd, 0x07, 0x99, - 0x4e, 0x30, 0xd9, 0xf1, 0xf1, 0x25, 0x98, 0xec, 0x9a, 0x72, 0x1d, 0xcd, 0x33, 0x75, 0x4d, 0x45, - 0xae, 0xa2, 0x05, 0x96, 0x3f, 0xb5, 0x86, 0xde, 0xee, 0x90, 0x1d, 0xb9, 0xd9, 0x55, 0x50, 0x86, - 0xe9, 0x6f, 0xca, 0xd1, 0x3a, 0xcb, 0xb4, 0xa9, 0x9d, 0xbb, 0x62, 0x09, 0xb7, 0x7f, 0x02, 0xc5, - 0xc9, 0xbf, 0x49, 0xb0, 0xc4, 0x6f, 0x75, 0x37, 0x9b, 0x8d, 0x0a, 0x9a, 0xc3, 0x6f, 0xc0, 0x6b, - 0xc1, 0x6f, 0x36, 0x6f, 0xf1, 0x91, 0x54, 0xb0, 0xa4, 0xcd, 0x77, 0x9f, 0x7c, 0xbd, 0x3c, 0xf7, - 0xe4, 0xe9, 0xb2, 0xf4, 0xc5, 0xd3, 0x65, 0xe9, 0xcb, 0xa7, 0xcb, 0xd2, 0x3f, 0x9f, 0x2e, 0x4b, - 0xbf, 0xfd, 0x66, 0x79, 0xee, 0x8b, 0x6f, 0x96, 0xe7, 0xbe, 0xfc, 0x66, 0x79, 0xee, 0xa3, 0x5c, - 0xec, 0xff, 0x23, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x31, 0x0f, 0x09, 0x60, 0x7f, 0x21, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x1a, 0x4d, 0x6c, 0xdb, 0xd6, + 0xd9, 0xd4, 0x8f, 0x2d, 0x7d, 0xfa, 0xf1, 0xcb, 0x4b, 0xda, 0xa8, 0x6e, 0xe7, 0x38, 0x4a, 0x9a, + 0x38, 0x69, 0x6a, 0xaf, 0xde, 0xd0, 0xa1, 0xdd, 0x30, 0x8c, 0x96, 0x28, 0x45, 0x8e, 0x4c, 0x2a, + 0x94, 0xe4, 0x38, 0x2d, 0xd0, 0x07, 0x5a, 0x7a, 0x96, 0xd9, 0x50, 0xa4, 0x4c, 0x52, 0xb1, 0xdd, + 0xd3, 0xb0, 0xcb, 0x4e, 0x03, 0x06, 0xec, 0xb2, 0xd3, 0x50, 0x0c, 0xd8, 0x65, 0xe7, 0x9d, 0x77, + 0xda, 0x21, 0xc7, 0x9e, 0xb6, 0x9e, 0x8a, 0x35, 0xbd, 0xed, 0xba, 0xc3, 0xb0, 0xdb, 0xf0, 0x1e, + 0x1f, 0x69, 0xca, 0xb0, 0xb2, 0x28, 0x4d, 0x9b, 0x4b, 0xa0, 0xef, 0xf7, 0x7d, 0xff, 0xef, 0x7b, + 0x74, 0xe0, 0xba, 0x77, 0x68, 0xad, 0xd3, 0x63, 0xda, 0x33, 0xed, 0x7d, 0xd7, 0x18, 0xed, 0xad, + 0x8f, 0x5c, 0xa7, 0x47, 0x3d, 0xcf, 0x71, 0x3d, 0xe2, 0x1d, 0x5a, 0x6b, 0x23, 0xd7, 0xf1, 0x1d, + 0x5c, 0xea, 0x39, 0xbd, 0x47, 0xae, 0x63, 0xf4, 0x0e, 0xd6, 0x18, 0xb2, 0x6f, 0x7a, 0xbe, 0x77, + 0x68, 0xb9, 0x63, 0x7b, 0xe9, 0x1a, 0x93, 0xef, 0x19, 0xbe, 0x61, 0x39, 0x83, 0xf5, 0x3e, 0xf5, + 0x7a, 0xa3, 0xbd, 0x75, 0xcf, 0x77, 0xc7, 0x3d, 0x7f, 0xec, 0xd2, 0x7e, 0x20, 0xbe, 0x54, 0x3e, + 0x87, 0xe9, 0x53, 0xc7, 0xb4, 0x89, 0x7f, 0x32, 0xa2, 0x82, 0x67, 0xe5, 0x1c, 0x1e, 0xcb, 0xe9, + 0x3d, 0x32, 0xed, 0x81, 0xe0, 0x78, 0x8d, 0x71, 0x30, 0x09, 0x2f, 0xf8, 0x57, 0xa0, 0x97, 0xce, + 0x7a, 0xd0, 0x37, 0x7c, 0x43, 0xd0, 0xde, 0x7e, 0x86, 0x77, 0x7b, 0x86, 0x17, 0x9e, 0x7d, 0x9b, + 0xb1, 0x39, 0x23, 0x7f, 0xdd, 0xb4, 0x1f, 0x53, 0xd7, 0xa7, 0x7d, 0x7a, 0x3c, 0x72, 0xd7, 0xbd, + 0x91, 0x61, 0x13, 0xf6, 0x8b, 0x7a, 0x9e, 0xe9, 0xd8, 0x82, 0xf7, 0xd2, 0xc0, 0x19, 0x38, 0xfc, + 0xe7, 0x3a, 0xfb, 0x15, 0x60, 0xcb, 0xbf, 0x93, 0xa0, 0xb8, 0x63, 0x58, 0x63, 0xea, 0x55, 0x1c, + 0x97, 0xb6, 0x47, 0xb4, 0x87, 0x2b, 0xb0, 0xd0, 0x73, 0xac, 0xf1, 0xd0, 0xf6, 0x4a, 0xd2, 0x4a, + 0x72, 0x35, 0xb7, 0x71, 0x6d, 0x6d, 0x5a, 0x14, 0xd7, 0xaa, 0x86, 0x3f, 0x1e, 0x36, 0xec, 0x7d, + 0x67, 0x33, 0xf5, 0xe4, 0xab, 0x2b, 0x73, 0x7a, 0x28, 0x89, 0xdf, 0x84, 0xac, 0x6b, 0x1c, 0x91, + 0xbd, 0x13, 0x9f, 0x7a, 0xa5, 0xc4, 0x4a, 0x72, 0x35, 0xaf, 0x67, 0x5c, 0xe3, 0x68, 0x93, 0xc1, + 0xf8, 0x0a, 0x64, 0xec, 0xf1, 0x90, 0xb8, 0xce, 0x91, 0x57, 0x4a, 0xae, 0x48, 0xab, 0xa9, 0x50, + 0xda, 0x1e, 0x0f, 0x75, 0xe7, 0xc8, 0x2b, 0xff, 0x6a, 0x1e, 0x16, 0x3b, 0xc6, 0x9e, 0x45, 0x75, + 0x6a, 0xf4, 0xa9, 0xcb, 0xcd, 0xda, 0x84, 0xb4, 0xcf, 0x50, 0x25, 0x69, 0x45, 0x5a, 0xcd, 0x6d, + 0xdc, 0x38, 0x63, 0x94, 0x77, 0x68, 0xf1, 0xc0, 0x70, 0xb1, 0x2a, 0xf5, 0x7a, 0xae, 0x39, 0xf2, + 0x1d, 0x57, 0x68, 0x0e, 0x44, 0xf1, 0x55, 0xc8, 0x9a, 0x76, 0x9f, 0x1e, 0x13, 0xb3, 0x7f, 0x5c, + 0x4a, 0xac, 0x48, 0xab, 0x05, 0x41, 0xcf, 0x70, 0x74, 0xa3, 0x7f, 0x8c, 0x97, 0x61, 0xc1, 0xa5, + 0x8f, 0xa9, 0xeb, 0x51, 0x6e, 0x5a, 0x26, 0x34, 0x4d, 0x20, 0xb1, 0x02, 0x69, 0x16, 0x5f, 0xaf, + 0x94, 0xe2, 0xb1, 0xb9, 0x35, 0x3d, 0x36, 0x13, 0x0e, 0x18, 0x76, 0x68, 0x09, 0x97, 0xc6, 0xd7, + 0x00, 0x2c, 0x73, 0x68, 0xfa, 0xe4, 0xc0, 0xb4, 0xfd, 0x52, 0x7a, 0x45, 0x5a, 0x4d, 0x0a, 0x86, + 0x2c, 0xc7, 0xdf, 0x35, 0x6d, 0x9f, 0xc5, 0xc9, 0xf4, 0x48, 0xef, 0x80, 0xf6, 0x1e, 0x95, 0xe6, + 0xe3, 0xc6, 0x98, 0x5e, 0x85, 0x21, 0xb1, 0x0a, 0xf0, 0xd8, 0xf4, 0xcc, 0x3d, 0xd3, 0x32, 0xfd, + 0x93, 0xd2, 0xc2, 0x8a, 0xb4, 0x5a, 0xdc, 0x58, 0x9d, 0x6e, 0x51, 0xbb, 0x67, 0xd8, 0x3b, 0x11, + 0xbf, 0x50, 0x16, 0xd3, 0x80, 0x7f, 0x0a, 0x97, 0x87, 0xc6, 0x31, 0xf1, 0xcd, 0x21, 0xf5, 0x7c, + 0x63, 0x38, 0x22, 0xc6, 0x80, 0x12, 0xdb, 0xb0, 0x1d, 0xaf, 0x94, 0x8d, 0xe5, 0xe9, 0xd2, 0xd0, + 0x38, 0xee, 0x84, 0x3c, 0xf2, 0x80, 0xaa, 0x8c, 0x03, 0x7f, 0x0c, 0x48, 0xd4, 0x3d, 0xf1, 0x7c, + 0x97, 0xda, 0x03, 0xff, 0xa0, 0x04, 0xdc, 0xa4, 0xdb, 0x53, 0x72, 0xc5, 0xec, 0x69, 0x06, 0x22, + 0x6d, 0x21, 0x21, 0x4e, 0x58, 0xb4, 0x26, 0xd1, 0x78, 0x0f, 0x2e, 0x86, 0xca, 0x8f, 0x0c, 0xd3, + 0x27, 0x23, 0xc7, 0x32, 0x7b, 0x27, 0xa5, 0x1c, 0xd7, 0x7f, 0xe7, 0xff, 0xeb, 0x7f, 0x60, 0x98, + 0x7e, 0x8b, 0xcb, 0x88, 0x13, 0x2e, 0x58, 0x67, 0x09, 0xf8, 0x06, 0xe4, 0x46, 0x86, 0x6b, 0x58, + 0x16, 0xb5, 0xcc, 0xcf, 0x68, 0x29, 0x1f, 0x8b, 0x78, 0x9c, 0x80, 0x37, 0x00, 0x1f, 0x18, 0x1e, + 0xf1, 0x4e, 0x3c, 0x9f, 0x0e, 0x49, 0xd8, 0x2b, 0xc5, 0x18, 0x3b, 0x3a, 0x30, 0xbc, 0x36, 0x27, + 0x57, 0x44, 0x3f, 0xbc, 0x0d, 0x45, 0x9b, 0xd2, 0x3e, 0xed, 0x47, 0xfc, 0x8b, 0x2b, 0xc9, 0xd5, + 0x82, 0x5e, 0x08, 0xb0, 0x82, 0x6d, 0x2b, 0x95, 0xc9, 0xa0, 0xec, 0x56, 0x2a, 0x53, 0x40, 0xc5, + 0xb2, 0x0e, 0xf9, 0x9a, 0x69, 0xf9, 0xd4, 0x8d, 0x1a, 0x60, 0x7e, 0x9f, 0xc3, 0xa2, 0x03, 0xae, + 0x4f, 0x4f, 0xb4, 0x12, 0x35, 0xbf, 0x30, 0x48, 0x48, 0x96, 0xff, 0x9b, 0x84, 0x52, 0x83, 0x95, + 0x7a, 0xfb, 0x91, 0x39, 0x7a, 0x45, 0x1d, 0x16, 0x75, 0x50, 0xf2, 0x5b, 0x75, 0xd0, 0x64, 0xed, + 0xa7, 0xbe, 0x75, 0xed, 0xc7, 0x1a, 0x3f, 0x7d, 0x5e, 0xe3, 0x9f, 0x57, 0xde, 0xf3, 0xdf, 0x71, + 0x79, 0x2f, 0xbc, 0xc4, 0xf2, 0x2e, 0xff, 0x72, 0x01, 0x8a, 0x5b, 0x8e, 0x69, 0x7f, 0xff, 0x19, + 0xbf, 0x05, 0x45, 0xcb, 0x71, 0x1e, 0x8d, 0x47, 0x51, 0xf1, 0xb3, 0xd4, 0x17, 0x36, 0x13, 0x48, + 0xd2, 0x0b, 0x01, 0x25, 0xec, 0x93, 0x0a, 0x2c, 0x38, 0xc1, 0xe5, 0xc5, 0x53, 0x3a, 0x63, 0x95, + 0x3b, 0x36, 0xc3, 0xe1, 0x0f, 0x20, 0xc5, 0x2e, 0x5a, 0x91, 0x9e, 0x2b, 0x53, 0xbc, 0x62, 0xb1, + 0xe8, 0x9c, 0x8c, 0xa8, 0x10, 0xe6, 0x22, 0x2f, 0x7d, 0xa2, 0x7e, 0x00, 0xaf, 0x4f, 0xba, 0x4e, + 0x0c, 0x97, 0x92, 0x47, 0xf4, 0xa4, 0x94, 0x89, 0x15, 0xd9, 0xc5, 0x89, 0x20, 0xc8, 0x2e, 0xbd, + 0x47, 0x4f, 0xce, 0x2d, 0xb8, 0xec, 0x77, 0x5c, 0x70, 0xf0, 0x32, 0xe7, 0xe9, 0x7b, 0x70, 0x61, + 0x68, 0x98, 0xb6, 0x6f, 0x98, 0x36, 0x71, 0xdc, 0x3e, 0x75, 0x4d, 0x7b, 0xc0, 0x27, 0x76, 0x34, + 0x26, 0x43, 0xb2, 0x26, 0xa8, 0x53, 0x46, 0x6b, 0xe1, 0x99, 0xa3, 0xb5, 0x0a, 0x6f, 0x59, 0x74, + 0xdf, 0x27, 0x7c, 0x31, 0x3b, 0x32, 0xfd, 0x03, 0x32, 0x32, 0x4c, 0x97, 0xf6, 0x39, 0x82, 0xba, + 0x13, 0x83, 0xb9, 0xc4, 0x38, 0x59, 0xe2, 0x1f, 0x98, 0xfe, 0x41, 0x8b, 0xb3, 0x6d, 0x71, 0x2e, + 0xfc, 0x00, 0x6e, 0x38, 0x63, 0x7f, 0x34, 0xf6, 0xc9, 0xc0, 0x75, 0x78, 0xba, 0x6c, 0xdf, 0xb4, + 0xc7, 0x86, 0x6f, 0x3a, 0x36, 0xd9, 0x77, 0x5c, 0xc2, 0xcf, 0x70, 0x9d, 0xa3, 0xd2, 0x62, 0x4c, + 0xdf, 0xd5, 0x40, 0xa6, 0xce, 0x44, 0x2a, 0x31, 0x89, 0x9a, 0xe3, 0x36, 0xe9, 0xbe, 0xaf, 0x3b, + 0x47, 0x5b, 0xa9, 0x4c, 0x1a, 0xcd, 0x6f, 0xa5, 0x32, 0x79, 0x54, 0x60, 0xdb, 0x16, 0xb4, 0x1d, + 0xd7, 0x17, 0xed, 0x77, 0x1f, 0x16, 0xc5, 0x99, 0x51, 0x78, 0x82, 0x46, 0x2c, 0x4f, 0xaf, 0xb8, + 0x30, 0x54, 0xc2, 0x80, 0x62, 0xa0, 0x20, 0x1e, 0xc0, 0x50, 0x17, 0x19, 0x1a, 0x7e, 0xef, 0x80, + 0x58, 0xd4, 0x9e, 0x68, 0x4b, 0x14, 0xd2, 0xb7, 0x19, 0xb9, 0x49, 0xed, 0xf2, 0x5f, 0x25, 0xc8, + 0x57, 0x4d, 0xcf, 0x37, 0xed, 0x9e, 0xcf, 0xed, 0xba, 0x09, 0x8b, 0x9c, 0x29, 0x76, 0x5b, 0x49, + 0xfc, 0xb6, 0x2a, 0x0a, 0x74, 0x18, 0xfa, 0x5b, 0x80, 0xfa, 0x42, 0x30, 0xe2, 0x4c, 0x70, 0xce, + 0xc5, 0x10, 0x1f, 0xb2, 0x6e, 0x00, 0xb6, 0xc7, 0x96, 0x15, 0xd4, 0x7f, 0x48, 0x9c, 0x58, 0xb1, + 0x10, 0xa7, 0xcb, 0x2e, 0x0d, 0x6d, 0xc1, 0x37, 0x20, 0x4f, 0x5d, 0xd7, 0x71, 0x89, 0x63, 0x93, + 0xfe, 0x78, 0xc4, 0x27, 0x42, 0x36, 0x6c, 0x32, 0x4e, 0xd1, 0xec, 0xea, 0x78, 0x54, 0x46, 0x50, + 0xd4, 0xdc, 0xbe, 0x69, 0x1b, 0xac, 0xe5, 0x98, 0x07, 0xe5, 0xdf, 0x27, 0x01, 0x7d, 0x64, 0x0e, + 0x3e, 0x33, 0x06, 0x41, 0x7a, 0xb9, 0x5b, 0x55, 0x98, 0xe7, 0x23, 0x2b, 0xdc, 0x6b, 0x67, 0x1b, + 0x77, 0x42, 0x16, 0xd7, 0x00, 0xe8, 0xe1, 0x84, 0xb7, 0xb9, 0x8d, 0xab, 0xd3, 0xf3, 0x25, 0xfc, + 0x0f, 0x97, 0x3b, 0x7a, 0x78, 0x1a, 0xbb, 0x62, 0x30, 0x37, 0x9d, 0xc0, 0xf4, 0x89, 0xa1, 0xc8, + 0x29, 0xc2, 0xa7, 0x97, 0x34, 0x14, 0xef, 0x41, 0x7e, 0xdf, 0x3c, 0xa6, 0x7d, 0xf2, 0x98, 0xaf, + 0xfb, 0xa5, 0x34, 0xb7, 0xfc, 0x19, 0xb3, 0x6d, 0xf2, 0x59, 0xa0, 0xe7, 0xb8, 0x74, 0x80, 0xfc, + 0x16, 0x13, 0xb6, 0xfc, 0xf7, 0x24, 0x2c, 0x6e, 0x53, 0x77, 0x40, 0x63, 0x99, 0xd9, 0x86, 0x02, + 0x6f, 0xaf, 0x17, 0x6e, 0x83, 0x3c, 0x13, 0x8f, 0x9a, 0x40, 0x83, 0xa2, 0x6b, 0x0e, 0x0e, 0x62, + 0xfa, 0x12, 0x33, 0xea, 0x2b, 0x70, 0xf9, 0x48, 0x61, 0x2c, 0x01, 0xe9, 0x57, 0x71, 0x2b, 0xdd, + 0x82, 0x02, 0x6b, 0x0e, 0x42, 0x0f, 0xc7, 0x46, 0x74, 0x31, 0x85, 0x7d, 0x93, 0x67, 0x24, 0x45, + 0x50, 0xf0, 0x87, 0x70, 0x99, 0x87, 0xf2, 0xb4, 0x46, 0xa7, 0xdc, 0x38, 0x74, 0xdf, 0x57, 0x0e, + 0x27, 0x6f, 0x9c, 0x9f, 0x41, 0x29, 0x88, 0xdb, 0x39, 0xc2, 0xd9, 0x98, 0xf0, 0x25, 0xce, 0x75, + 0x46, 0xba, 0xfc, 0xaf, 0x04, 0x14, 0xef, 0x1a, 0xde, 0x41, 0x2c, 0xaf, 0xb7, 0x61, 0xf1, 0x8c, + 0x31, 0xc1, 0x20, 0x11, 0x37, 0x7f, 0xdc, 0x04, 0x7c, 0x07, 0xd0, 0xd9, 0xc3, 0x83, 0x59, 0xc2, + 0x99, 0x8b, 0x93, 0x47, 0xbe, 0xf2, 0x8c, 0xbc, 0xb2, 0x30, 0x6f, 0xa5, 0x32, 0x0b, 0x28, 0x53, + 0xfe, 0x2a, 0x09, 0xb8, 0x21, 0x1e, 0xfd, 0xb1, 0x80, 0x7f, 0x4f, 0x0b, 0x9d, 0x06, 0x85, 0xf0, + 0x8b, 0xc3, 0x8b, 0x8e, 0xa5, 0x7c, 0xa8, 0x80, 0x67, 0xe2, 0x55, 0xa7, 0xf3, 0xdc, 0x55, 0x65, + 0xe1, 0x99, 0xab, 0xca, 0xf3, 0x2f, 0x0c, 0x99, 0x59, 0x17, 0x86, 0x24, 0x4a, 0x95, 0xff, 0x98, + 0x84, 0x4b, 0x61, 0x82, 0x27, 0x9e, 0x81, 0x6b, 0x80, 0xa2, 0xd8, 0xf7, 0x1c, 0x8b, 0x67, 0x49, + 0x8a, 0x65, 0xa9, 0x18, 0x52, 0x2b, 0x8e, 0xc5, 0x72, 0xf5, 0xc9, 0xd9, 0x5c, 0x05, 0xb3, 0xf0, + 0x47, 0x67, 0xc2, 0xe3, 0x8c, 0xfc, 0xb5, 0xf8, 0x57, 0xa4, 0x35, 0xf6, 0xe2, 0x3a, 0x0d, 0x75, + 0xcb, 0x75, 0x7c, 0xe7, 0xdc, 0xd4, 0x7d, 0x0a, 0x17, 0x46, 0x2e, 0x25, 0xfb, 0xc2, 0x46, 0xe2, + 0x8d, 0x68, 0x8f, 0xa7, 0x20, 0xb7, 0xf1, 0xf3, 0xe9, 0x49, 0x3c, 0xcf, 0xb5, 0xb5, 0x96, 0x4b, + 0xe3, 0xb0, 0xbe, 0x38, 0x9a, 0x44, 0x2c, 0xfd, 0x46, 0x82, 0xc5, 0x33, 0x4c, 0x78, 0x0b, 0xe0, + 0xf4, 0x5b, 0xd7, 0x0b, 0x3c, 0x8d, 0x63, 0xd2, 0x78, 0x4d, 0x54, 0x50, 0x10, 0xa2, 0xa5, 0xb3, + 0x15, 0x44, 0x87, 0x6b, 0xc1, 0x07, 0xbc, 0x8e, 0xb8, 0xcb, 0xfe, 0x9d, 0x85, 0xa2, 0x3c, 0x18, + 0xb8, 0x74, 0x60, 0xf8, 0x4e, 0x60, 0xce, 0x55, 0x80, 0xb0, 0x1e, 0xac, 0xf8, 0x00, 0xcb, 0x0e, + 0x82, 0x94, 0x5b, 0x1e, 0xfe, 0x04, 0xf2, 0x86, 0x10, 0x32, 0x9d, 0xe8, 0x1d, 0xfc, 0xe3, 0xe9, + 0x36, 0x4f, 0x1e, 0x11, 0x81, 0xb1, 0x66, 0x8a, 0xeb, 0xc3, 0x3f, 0x14, 0x3b, 0x20, 0xed, 0x93, + 0x98, 0x29, 0xa9, 0xc8, 0x14, 0x24, 0xa8, 0xf5, 0xc8, 0xa2, 0xba, 0xf0, 0x3b, 0xcd, 0x3b, 0xe7, + 0xdd, 0xe7, 0xb6, 0xe4, 0x6c, 0x1f, 0x2d, 0xfd, 0x3a, 0x01, 0xb9, 0x98, 0x79, 0x4c, 0xf1, 0xfe, + 0xd8, 0xee, 0xf1, 0xb4, 0xcc, 0xa2, 0xb8, 0x36, 0xb6, 0x7b, 0xa1, 0x62, 0xa6, 0x00, 0xaf, 0x40, + 0x26, 0x5a, 0x1a, 0x13, 0xb1, 0x7e, 0x8a, 0xb0, 0xf8, 0x3a, 0x14, 0x83, 0x1a, 0x8c, 0xba, 0x82, + 0x0d, 0xa5, 0x82, 0x9e, 0x0f, 0xb0, 0xa2, 0x1b, 0x2e, 0xf3, 0x8f, 0x9b, 0x9c, 0x9c, 0xe6, 0x8b, + 0xea, 0x7c, 0x2f, 0x20, 0xdc, 0x85, 0xac, 0xe1, 0x0e, 0xc6, 0x43, 0x6a, 0xfb, 0x5e, 0x69, 0x9e, + 0x67, 0x64, 0x96, 0x2a, 0x3a, 0x15, 0x16, 0xfd, 0xfb, 0xe7, 0x34, 0xa4, 0x98, 0x17, 0x18, 0x41, + 0x5e, 0x56, 0x1f, 0x12, 0x55, 0xeb, 0x10, 0xb5, 0xdb, 0x6c, 0xa2, 0x39, 0xbc, 0x00, 0x49, 0x79, + 0xa7, 0x8e, 0x24, 0x9c, 0x87, 0xcc, 0xa6, 0xa6, 0x35, 0x89, 0xac, 0x56, 0x51, 0x02, 0xe7, 0x60, + 0x81, 0x43, 0x9a, 0x8e, 0x92, 0xb8, 0x08, 0x50, 0xd1, 0xd4, 0x8a, 0xdc, 0x21, 0x72, 0xbd, 0x8e, + 0x52, 0x38, 0x0b, 0xe9, 0x8a, 0xd6, 0x55, 0x3b, 0x28, 0xcd, 0xc4, 0xb7, 0xe5, 0x5d, 0xb4, 0xc0, + 0x7f, 0x34, 0x54, 0x94, 0xc1, 0x00, 0xf3, 0xed, 0x4e, 0xb5, 0xaa, 0xec, 0xa0, 0x2c, 0x43, 0xb6, + 0xbb, 0xdb, 0x08, 0x98, 0xba, 0x76, 0x77, 0x9b, 0x34, 0xd4, 0x0e, 0xca, 0xb1, 0x93, 0x76, 0x64, + 0xbd, 0x21, 0xab, 0x15, 0x05, 0xe5, 0x19, 0x69, 0x57, 0xd3, 0xb9, 0xe6, 0x42, 0x70, 0x52, 0x57, + 0xed, 0x10, 0x5d, 0x7b, 0xd0, 0x46, 0x45, 0x2e, 0x77, 0x5f, 0xaf, 0x36, 0x6a, 0x35, 0xb4, 0x88, + 0x31, 0x14, 0x6b, 0x0d, 0x55, 0x6e, 0x92, 0x48, 0x1a, 0x31, 0x87, 0x02, 0x9c, 0x38, 0xf3, 0x02, + 0x2e, 0x40, 0x56, 0xd6, 0x75, 0xf9, 0x21, 0xd7, 0x88, 0xd9, 0x61, 0x5b, 0x6d, 0x4d, 0xe5, 0xd0, + 0x45, 0x46, 0x64, 0xd0, 0x26, 0x07, 0x2f, 0xb1, 0xe3, 0xda, 0x1d, 0xbd, 0xa1, 0xd6, 0x39, 0xfc, + 0x1a, 0xf7, 0xba, 0xd1, 0xe1, 0x21, 0x78, 0x9d, 0x39, 0xc2, 0x00, 0x4d, 0x47, 0x97, 0x71, 0x06, + 0x52, 0x15, 0x4d, 0xd7, 0x51, 0x09, 0x97, 0xe0, 0x52, 0x4b, 0xd1, 0x2b, 0x8a, 0xda, 0x69, 0x34, + 0x15, 0x52, 0x6d, 0xb4, 0x2b, 0xa4, 0xb1, 0xdd, 0x6a, 0xa2, 0x37, 0xce, 0x50, 0x2a, 0x9a, 0xda, + 0x09, 0x28, 0x4b, 0xf8, 0x22, 0x2c, 0x72, 0x1b, 0xb4, 0xcd, 0x2d, 0xa5, 0x12, 0x04, 0xf1, 0x4d, + 0x7c, 0x09, 0x50, 0x60, 0x4a, 0x0c, 0xfb, 0x16, 0xb3, 0x60, 0x47, 0xd6, 0x49, 0x4b, 0x6b, 0xa1, + 0x1f, 0x04, 0xe6, 0x31, 0xb7, 0x38, 0xbc, 0x8c, 0x17, 0x21, 0xd7, 0xee, 0x90, 0x6d, 0xf9, 0x9e, + 0xd2, 0x6c, 0xa8, 0x0a, 0xba, 0xc2, 0xdc, 0x69, 0x77, 0x88, 0xb2, 0xdb, 0x51, 0xd4, 0x0e, 0x5a, + 0x61, 0xbe, 0xb6, 0x3b, 0xa4, 0xab, 0x36, 0x34, 0x15, 0x5d, 0x0d, 0xa4, 0x49, 0x45, 0x6b, 0x36, + 0x95, 0x4a, 0x07, 0x95, 0x19, 0x73, 0x45, 0x0b, 0x95, 0x5f, 0x0b, 0x42, 0xcd, 0xc0, 0xb6, 0xbc, + 0xdd, 0x42, 0xd7, 0x59, 0x74, 0x75, 0xa5, 0xae, 0xb3, 0x1c, 0x31, 0x2f, 0x5a, 0x1d, 0xf4, 0x36, + 0xb3, 0x86, 0xe3, 0xf4, 0x0d, 0x74, 0x83, 0x09, 0x70, 0xa0, 0xdd, 0xd4, 0x5a, 0x0a, 0xba, 0xc9, + 0x4e, 0x0b, 0xe0, 0xdd, 0x5d, 0xb4, 0x7a, 0x0a, 0x3d, 0x7c, 0x88, 0x6e, 0xc5, 0x68, 0x0f, 0xd1, + 0xed, 0x48, 0x32, 0x28, 0x9a, 0x77, 0x98, 0x25, 0x1c, 0x96, 0x77, 0xea, 0xbb, 0xe8, 0x4e, 0x1c, + 0x7c, 0x88, 0xde, 0x2d, 0xdf, 0x81, 0x14, 0x6b, 0x65, 0x16, 0x73, 0xb9, 0xdb, 0xd1, 0xd0, 0x1c, + 0x2f, 0xa9, 0x8a, 0xdc, 0x94, 0x75, 0x24, 0x31, 0x5d, 0xaa, 0xa6, 0x12, 0x01, 0x27, 0xca, 0x7f, + 0x93, 0xa0, 0xd8, 0x72, 0x9d, 0x4f, 0x69, 0xcf, 0x6f, 0xd3, 0xe0, 0xc5, 0xf8, 0x0b, 0x48, 0xb3, + 0x31, 0x1a, 0xbe, 0xac, 0x66, 0xe9, 0x9c, 0x40, 0x10, 0xd7, 0xe1, 0xc2, 0x80, 0xda, 0xd4, 0x35, + 0xfc, 0xd8, 0xab, 0x33, 0x78, 0x5d, 0x3d, 0x6b, 0x0e, 0xa3, 0x48, 0x28, 0xdc, 0x0c, 0x6f, 0x02, + 0xb2, 0xc7, 0xfc, 0xdb, 0x81, 0x47, 0x46, 0xd4, 0x25, 0x03, 0x6a, 0x07, 0x2f, 0x2b, 0xbd, 0x60, + 0x8f, 0x87, 0x6c, 0xdc, 0xb5, 0xa8, 0x5b, 0xa7, 0x76, 0xf9, 0xeb, 0x02, 0xe4, 0x1f, 0x98, 0x76, + 0xdf, 0x39, 0x12, 0x37, 0xc9, 0x0a, 0xff, 0xfe, 0xeb, 0x9b, 0x7c, 0xb0, 0x9e, 0x88, 0x27, 0x6f, + 0x1c, 0x85, 0xdb, 0x90, 0x3d, 0xe2, 0x12, 0xb5, 0xc8, 0xb8, 0xf5, 0xe9, 0xae, 0xc6, 0x95, 0x0b, + 0xa0, 0x16, 0xcd, 0x8b, 0x48, 0xcf, 0xd2, 0x5f, 0x24, 0x31, 0x29, 0xda, 0x50, 0x08, 0xe7, 0x38, + 0xad, 0xbd, 0xe8, 0xd4, 0xd4, 0x27, 0x75, 0xe0, 0xfb, 0x00, 0xe2, 0x28, 0xa6, 0x31, 0xc1, 0x35, + 0xbe, 0x37, 0x9b, 0xcd, 0x4c, 0x6b, 0x4c, 0xc9, 0x87, 0xa9, 0x27, 0x9f, 0x5f, 0x91, 0x96, 0x3e, + 0x5f, 0x80, 0x74, 0xcd, 0x35, 0x86, 0x14, 0xdf, 0x83, 0xd4, 0xd0, 0xe9, 0x53, 0x61, 0xee, 0xf3, + 0x2a, 0xe7, 0xb2, 0x6b, 0xdb, 0x4e, 0x3f, 0xba, 0x41, 0x98, 0x12, 0x7c, 0x1f, 0xe6, 0xf7, 0x9c, + 0xb1, 0xdd, 0xf7, 0xa6, 0xec, 0x29, 0xcf, 0x56, 0xb7, 0xc9, 0x45, 0xc3, 0xbd, 0x30, 0x50, 0x84, + 0x3f, 0x82, 0x2c, 0x3d, 0xee, 0x59, 0x63, 0xbe, 0x20, 0x24, 0xb9, 0x91, 0xef, 0xcf, 0xa4, 0x55, + 0x09, 0xa5, 0xa3, 0x57, 0x7c, 0x88, 0x58, 0xfa, 0x8f, 0x04, 0x69, 0x7e, 0x28, 0x3b, 0x85, 0x9f, + 0xc7, 0x1a, 0x49, 0x84, 0xe2, 0xfd, 0xd9, 0x6d, 0x8f, 0xdd, 0xa8, 0xa7, 0xea, 0xf0, 0x35, 0x00, + 0xd3, 0xf6, 0x89, 0xb3, 0xbf, 0xef, 0xd1, 0xe0, 0xfe, 0x0b, 0xff, 0x14, 0x93, 0x35, 0x6d, 0x5f, + 0xe3, 0x68, 0x7c, 0x15, 0xf2, 0xac, 0x2b, 0xfa, 0x21, 0x1b, 0xf3, 0x34, 0xaf, 0xe7, 0x38, 0x4e, + 0xb0, 0x6c, 0x41, 0x2e, 0x20, 0xf2, 0x3f, 0x60, 0x8a, 0xad, 0x7d, 0x86, 0x3f, 0xef, 0x41, 0x20, + 0xcd, 0x6c, 0x5a, 0xfa, 0x83, 0x04, 0xf3, 0x41, 0xb8, 0xb1, 0x0a, 0x69, 0xcf, 0x37, 0x5c, 0x5f, + 0x6c, 0x5f, 0x1b, 0xb3, 0xbb, 0x1d, 0x7d, 0xda, 0x67, 0x6a, 0x70, 0x15, 0x92, 0xd4, 0xee, 0x8b, + 0x02, 0x78, 0x01, 0x6d, 0x3a, 0x13, 0x2f, 0xdf, 0x84, 0x14, 0xab, 0x2e, 0x76, 0x75, 0xea, 0xb2, + 0x5a, 0x57, 0xd0, 0x1c, 0x9b, 0x6f, 0xfc, 0x96, 0x93, 0xd8, 0x7c, 0xab, 0xeb, 0x5a, 0xb7, 0xd5, + 0x46, 0x89, 0xf2, 0x67, 0x90, 0x8d, 0x62, 0x8f, 0x2f, 0xc3, 0xc5, 0xae, 0xba, 0xa9, 0x75, 0xd5, + 0xaa, 0x52, 0x25, 0x2d, 0x5d, 0xa9, 0x28, 0xd5, 0x86, 0x5a, 0x47, 0x73, 0x93, 0x84, 0x9a, 0xd6, + 0x6c, 0x6a, 0x0f, 0x18, 0x41, 0x62, 0xb7, 0x8a, 0x56, 0xab, 0xb5, 0x95, 0x4e, 0x8c, 0x3d, 0x11, + 0xc3, 0x9e, 0xf2, 0x26, 0xd9, 0x75, 0x52, 0xe9, 0xea, 0xba, 0x12, 0x5c, 0xb7, 0x28, 0x55, 0xfe, + 0x18, 0xb2, 0x51, 0x75, 0xb1, 0x9b, 0x55, 0xd5, 0x88, 0xb2, 0x5b, 0x69, 0x76, 0xdb, 0xec, 0x42, + 0xe1, 0x87, 0x72, 0xb0, 0xaa, 0x90, 0xb8, 0x9c, 0x84, 0x2f, 0x40, 0x21, 0x24, 0x70, 0x3f, 0x50, + 0x82, 0x49, 0x87, 0xa8, 0x4e, 0x43, 0x69, 0xa3, 0xe4, 0xd2, 0x3f, 0x12, 0x90, 0x09, 0xe7, 0x0e, + 0x56, 0x62, 0xab, 0x58, 0x6e, 0xe3, 0x9d, 0xe7, 0x8d, 0xea, 0xd9, 0x45, 0xac, 0x0a, 0x99, 0xe8, + 0x81, 0x94, 0x9a, 0xf1, 0xab, 0x4a, 0x24, 0xc9, 0xde, 0xa9, 0xfb, 0x2c, 0x5f, 0xe2, 0xb5, 0x77, + 0x67, 0x96, 0x1c, 0xeb, 0x81, 0x28, 0x5e, 0x85, 0x89, 0xd5, 0x8e, 0xbf, 0x39, 0xd2, 0xe1, 0x42, + 0x3c, 0xb1, 0xf4, 0x2d, 0x41, 0xc6, 0x70, 0x07, 0x5e, 0xa3, 0x7f, 0xec, 0x95, 0x16, 0xf8, 0x54, + 0x8f, 0x60, 0xa6, 0x25, 0x78, 0x92, 0x09, 0x2d, 0x99, 0xd8, 0x53, 0x6a, 0x82, 0xb2, 0x95, 0xca, + 0x24, 0x50, 0x52, 0x6c, 0x77, 0x7f, 0x92, 0x00, 0x4e, 0xa7, 0x23, 0xbf, 0x6d, 0xb5, 0x07, 0x44, + 0xed, 0x6e, 0x6f, 0x2a, 0xba, 0xa8, 0x33, 0x59, 0xbd, 0x17, 0xdc, 0x9d, 0x55, 0x45, 0x6d, 0x2b, + 0x84, 0xc3, 0x3c, 0x49, 0x62, 0x63, 0x09, 0x30, 0x49, 0xbe, 0x23, 0x74, 0xb7, 0xf9, 0x5e, 0xd3, + 0x09, 0x16, 0x3d, 0xbe, 0xcd, 0x04, 0x8b, 0x5e, 0x53, 0xae, 0xa3, 0x79, 0xa6, 0xae, 0xa9, 0xc8, + 0x55, 0xb4, 0xc0, 0xea, 0xa7, 0xd6, 0xd0, 0xdb, 0x1d, 0xb2, 0x23, 0x37, 0xbb, 0x0a, 0xca, 0x30, + 0xfd, 0x4d, 0x39, 0x82, 0xb3, 0x4c, 0x9b, 0xda, 0xb9, 0x2b, 0x40, 0xb8, 0xfd, 0x13, 0x28, 0x4e, + 0xfe, 0x89, 0x82, 0x15, 0x7e, 0xab, 0xbb, 0xd9, 0x6c, 0x54, 0xd0, 0x1c, 0x7e, 0x03, 0x5e, 0x0b, + 0x7e, 0xb3, 0xf5, 0x8b, 0x6f, 0xa8, 0x82, 0x24, 0x6d, 0xbe, 0xfb, 0xe4, 0xeb, 0xe5, 0xb9, 0x27, + 0x4f, 0x97, 0xa5, 0x2f, 0x9e, 0x2e, 0x4b, 0x5f, 0x3e, 0x5d, 0x96, 0xfe, 0xf9, 0x74, 0x59, 0xfa, + 0xed, 0x37, 0xcb, 0x73, 0x5f, 0x7c, 0xb3, 0x3c, 0xf7, 0xe5, 0x37, 0xcb, 0x73, 0x1f, 0xe5, 0x62, + 0xff, 0x3d, 0xe1, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1f, 0xb5, 0xe2, 0x09, 0x8e, 0x21, 0x00, 0x00, } diff --git a/pkg/sql/execinfrapb/processors_sql.proto b/pkg/sql/execinfrapb/processors_sql.proto index 8201628f3c84..2ae09ea3269f 100644 --- a/pkg/sql/execinfrapb/processors_sql.proto +++ b/pkg/sql/execinfrapb/processors_sql.proto @@ -734,6 +734,7 @@ message AggregatorSpec { REGR_SXY = 42; REGR_COUNT = 43; REGR_AVGX = 44; + REGR_AVGY = 45; } enum Type { diff --git a/pkg/sql/logictest/testdata/logic_test/aggregate b/pkg/sql/logictest/testdata/logic_test/aggregate index 2d0ea5429e65..63c1d4cfe00a 100644 --- a/pkg/sql/logictest/testdata/logic_test/aggregate +++ b/pkg/sql/logictest/testdata/logic_test/aggregate @@ -10,14 +10,14 @@ CREATE TABLE kv ( ) # Aggregate functions return NULL if there are no rows. -query IIIIRRRRRRRRBBTIIRRRRRRRRRRIR +query IIIIRRRRRRRRBBTIIRRRRRRRRRRIRR SELECT min(1), max(1), count(1), sum_int(1), avg(1), sum(1), stddev(1), stddev_samp(1), stddev_pop(1), var_samp(1), variance(1), var_pop(1), bool_and(true), bool_and(false), xor_agg(b'\x01'), bit_and(1), bit_or(1), corr(1, 1), covar_pop(1, 1), covar_samp(1, 1), sqrdiff(1), regr_intercept(1, 1), regr_r2(1, 1), regr_slope(1, 1), -regr_sxx(1, 1), regr_sxy(1, 1), regr_syy(1, 1), regr_count(1, 1), regr_avgx(1, 1) +regr_sxx(1, 1), regr_sxy(1, 1), regr_syy(1, 1), regr_count(1, 1), regr_avgx(1, 1), regr_avgy(1, 1) FROM kv ---- -NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0 NULL +NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0 NULL NULL # Regression test for #29695 query T @@ -46,14 +46,14 @@ SELECT min(i), avg(i), max(i), sum(i) FROM kv ---- NULL NULL NULL NULL -query IIIIRRRRRRRBBTRRRRRRRRRRIR +query IIIIRRRRRRRBBTRRRRRRRRRRIRR SELECT min(v), max(v), count(v), sum_int(1), avg(v), sum(v), stddev(v), stddev_pop(v), variance(v), var_pop(v), var_samp(v), bool_and(v = 1), bool_and(v = 1), xor_agg(s::bytes), corr(v,k), sqrdiff(v), covar_pop(v, k), covar_samp(v, k), regr_intercept(v, k), regr_r2(v, k), regr_slope(v, k), regr_sxx(v, k), regr_sxy(v, k), regr_syy(v, k), regr_count(v, k), -regr_avgx(v, k) +regr_avgx(v, k), regr_avgy(v, k) FROM kv ---- -NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0 NULL +NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0 NULL NULL query T SELECT array_agg(v) FROM kv @@ -71,13 +71,13 @@ SELECT jsonb_agg(v) FROM kv NULL # Aggregate functions triggers aggregation and computation when there is no source. -query IIIIRRRRRRRBBTRRRRRRRRRRIR +query IIIIRRRRRRRBBTRRRRRRRRRRIRR SELECT min(1), count(1), max(1), sum_int(1), avg(1)::float, sum(1), stddev_samp(1), stddev_pop(1), variance(1), var_pop(1), var_samp(1), bool_and(true), bool_or(true), to_hex(xor_agg(b'\x01')), corr(1, 2), sqrdiff(1), covar_pop(1, 2), covar_samp(1, 2), regr_intercept(1, 2), regr_r2(1, 2), regr_slope(1, 2), regr_sxx(1, 1), regr_sxy(1, 1), -regr_syy(1, 1), regr_count(1, 1), regr_avgx(1, 1) +regr_syy(1, 1), regr_count(1, 1), regr_avgx(1, 1), regr_avgy(1, 1) ---- -1 1 1 1 1 1 NULL 0 NULL 0 NULL true true 01 NULL 0 0 NULL NULL NULL NULL 0 0 0 1 1 +1 1 1 1 1 1 NULL 0 NULL 0 NULL true true 01 NULL 0 0 NULL NULL NULL NULL 0 0 0 1 1 1 # Aggregate functions triggers aggregation and computation when there is no source. query T @@ -2302,6 +2302,101 @@ SELECT regr_avgx(y, x) FROM statistics_agg_test ---- NULL +subtest regr_avgy + +statement OK +INSERT INTO statistics_agg_test (y, x, int_y, int_x, dy, dx) +VALUES (0.0, 0.09561, 1, 10, 0.0, 0.09561), + (42.0, 324.78, 2, 25, 42.0, 324.78), + (42.0, 324.78, 2, 25, 42.0, 324.78), + (56.0, 7.8, 3, 40, 56.0, 7.8), + (56.0, 7.8, 3, 40, 56.0, 7.8), + (56.0, 7.8, 3, 40, 56.0, 7.8), + (100.0, 99.097, 4, 100, 100.0, 99.097), + (100.0, 99.097, 4, 100, 100.0, 99.097), + (100.0, 99.097, 4, 100, 100.0, 99.097), + (100.0, 99.097, 4, 100, 100.0, 99.097), + (NULL, NULL, NULL, NULL, NULL, NULL); + +query FFFFF +SELECT regr_avgy(y, x), regr_avgy(int_y, int_x), regr_avgy(y, int_x), regr_avgy(int_y, x), regr_avgy(dy, dx) +FROM statistics_agg_test +---- +65.2 3 65.2 3 65.2 + +query FFFF +SELECT regr_avgy(y, dx), regr_avgy(int_y, dx), regr_avgy(dy, int_x), regr_avgy(dy, x) +FROM statistics_agg_test +---- +65.2 3 65.2 65.2 + +query F +SELECT regr_avgy(DISTINCT y, x) +FROM statistics_agg_test +---- +49.5 + +query F +SELECT CAST(regr_avgy(DISTINCT y, x) FILTER (WHERE x > 3 AND y < 100) AS decimal) +FROM statistics_agg_test +---- +49 + +query error pq: unknown signature: regr_avgy\(string, string\) +SELECT regr_avgy(y::string, x::string) FROM statistics_agg_test + +statement OK +INSERT INTO statistics_agg_test (y, x, int_y, int_x) VALUES + (1.797693134862315708145274237317043567981e+308, 0, 0, 0) + +query error float out of range +SELECT regr_avgy(y, x), regr_avgy(int_y, int_x) FROM statistics_agg_test + +statement OK +TRUNCATE statistics_agg_test + +statement OK +INSERT INTO statistics_agg_test (y, x, int_y, int_x, dy, dx) VALUES + (1.0, 10.0, 1, 10, 1.0, 10.0), + (2.0, 20.0, 2, 20, 2.0, 20.0) + +query FFF +SELECT regr_avgy(y, x), regr_avgy(int_y, int_x), regr_avgy(dy, dx) +FROM statistics_agg_test +---- +1.5 1.5 1.5 + +statement OK +TRUNCATE statistics_agg_test + +statement OK +INSERT INTO statistics_agg_test (y, x, int_y, int_x, dy, dx) VALUES + (1.0, 10.0, 1, 10, 1.0, 10.0), + (2.0, -20.0, 2, -20, 2.0, -20.0) + +query FFF +SELECT regr_avgy(y, x), regr_avgy(int_y, int_x), regr_avgy(dy, dx) +FROM statistics_agg_test +---- +1.5 1.5 1.5 + +statement OK +TRUNCATE statistics_agg_test + +statement OK +INSERT INTO statistics_agg_test (y, x, int_y, int_x, dy, dx) VALUES + (1.0, -1.0, 1, -1, 1.0, -1.0), + (1.0, 1.0, 1, 1, 1.0, 1.0) + +query FFF +SELECT regr_avgy(y, x), regr_avgy(int_y, int_x), regr_avgy(dy, dx) +FROM statistics_agg_test +---- +1 1 1 + +statement OK +TRUNCATE statistics_agg_test + subtest string_agg statement OK diff --git a/pkg/sql/logictest/testdata/logic_test/distsql_agg b/pkg/sql/logictest/testdata/logic_test/distsql_agg index 12f1eefede7f..7bca8d477674 100644 --- a/pkg/sql/logictest/testdata/logic_test/distsql_agg +++ b/pkg/sql/logictest/testdata/logic_test/distsql_agg @@ -592,6 +592,11 @@ SELECT regr_count(y, x) FROM statistics_agg_test ---- 100 +query FF +SELECT regr_avgx(y, x), regr_avgy(y, x) FROM statistics_agg_test +---- +4.5 50.5 + # Regression test for #37211 (incorrect ordering between aggregator stages). statement ok CREATE TABLE uv (u INT PRIMARY KEY, v INT); diff --git a/pkg/sql/opt/exec/execbuilder/testdata/aggregate b/pkg/sql/opt/exec/execbuilder/testdata/aggregate index c151567e1e1e..36e8f50e2cfa 100644 --- a/pkg/sql/opt/exec/execbuilder/testdata/aggregate +++ b/pkg/sql/opt/exec/execbuilder/testdata/aggregate @@ -12,14 +12,14 @@ query T EXPLAIN (TYPES) SELECT min(1), max(1), count(NULL), sum_int(1), avg(1), sum(1), stddev(1), variance(1), bool_and(true), bool_or(false), xor_agg(b'\x01'), corr(1, 1), covar_pop(1, 1), covar_samp(1, 1), sqrdiff(1), regr_intercept(1, 1), regr_r2(1, 1), regr_slope(1, 1), regr_sxx(1, 1), regr_sxy(1, 1), regr_syy(1, 1), -regr_count(1, 1) +regr_count(1, 1), regr_avgx(1, 1), regr_avgy(1, 1) FROM kv ---- distribution: local vectorized: true · • group (scalar) -│ columns: (min int, max int, count int, sum_int int, avg decimal, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, xor_agg bytes, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, regr_count int) +│ columns: (min int, max int, count int, sum_int int, avg decimal, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, xor_agg bytes, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, regr_count int, regr_avgx float, regr_avgy float) │ estimated row count: 1 (missing stats) │ aggregate 0: min(column7) │ aggregate 1: max(column7) @@ -43,6 +43,8 @@ vectorized: true │ aggregate 19: regr_sxy(column7, column7) │ aggregate 20: regr_syy(column7, column7) │ aggregate 21: count_rows() +│ aggregate 22: regr_avgx(column7, column7) +│ aggregate 23: regr_avgy(column7, column7) │ └── • render │ columns: (column7 int, column10 unknown, column17 bool, column19 bool, column21 bytes) @@ -63,14 +65,14 @@ query T EXPLAIN (TYPES) SELECT min(v), max(v), count(v), sum_int(1), avg(v), sum(v), stddev(v), variance(v), bool_and(v = 1), bool_or(v = 1), xor_agg(s::bytes), corr(v, k), covar_pop(v, k), covar_samp(v, k), sqrdiff(v), regr_intercept(1, 1), regr_r2(1, 1), regr_slope(1, 1), regr_sxx(1, 1), regr_sxy(1, 1), regr_syy(1, 1), -regr_count(1, 1) +regr_count(1, 1), regr_avgx(1, 1), regr_avgy(1, 1) FROM kv ---- distribution: local vectorized: true · • group (scalar) -│ columns: (min int, max int, count int, sum_int int, avg decimal, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, xor_agg bytes, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, regr_count int) +│ columns: (min int, max int, count int, sum_int int, avg decimal, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, xor_agg bytes, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, regr_count int, regr_avgx float, regr_avgy float) │ estimated row count: 1 (missing stats) │ aggregate 0: min(v) │ aggregate 1: max(v) @@ -94,6 +96,8 @@ vectorized: true │ aggregate 19: regr_sxy(column10, column10) │ aggregate 20: regr_syy(column10, column10) │ aggregate 21: count_rows() +│ aggregate 22: regr_avgx(column10, column10) +│ aggregate 23: regr_avgy(column10, column10) │ └── • render │ columns: (column10 int, column16 bool, column19 bytes, k int, v int) @@ -115,13 +119,13 @@ query T EXPLAIN (TYPES) SELECT min(1), count(NULL), max(1), sum_int(1), avg(1)::float, sum(1), stddev(1), variance(1), bool_and(true), bool_or(true), to_hex(xor_agg(b'\x01')), corr(1, 1), covar_pop(1, 1), covar_samp(1, 1), sqrdiff(1), regr_intercept(1, 1), regr_r2(1, 1), regr_slope(1, 1), regr_sxx(1, 1), regr_sxy(1, 1), regr_syy(1, 1), -regr_count(1, 1) +regr_count(1, 1), regr_avgx(1, 1), regr_avgy(1, 1) ---- distribution: local vectorized: false · • render -│ columns: (min int, count int, max int, sum_int int, avg float, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, to_hex string, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, regr_count int) +│ columns: (min int, count int, max int, sum_int int, avg float, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, to_hex string, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, regr_count int, regr_avgx float, regr_avgy float) │ estimated row count: 1 │ render 0: ((avg)[decimal]::FLOAT8)[float] │ render 1: (to_hex((xor_agg)[bytes]))[string] @@ -145,9 +149,11 @@ vectorized: false │ render 19: (regr_sxy)[float] │ render 20: (regr_syy)[float] │ render 21: (count_rows)[int] +│ render 22: (regr_avgx)[float] +│ render 23: (regr_avgy)[float] │ └── • group (scalar) - │ columns: (min int, count int, max int, sum_int int, avg decimal, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, xor_agg bytes, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, count_rows int) + │ columns: (min int, count int, max int, sum_int int, avg decimal, sum decimal, stddev decimal, variance decimal, bool_and bool, bool_or bool, xor_agg bytes, corr float, covar_pop float, covar_samp float, sqrdiff decimal, regr_intercept float, regr_r2 float, regr_slope float, regr_sxx float, regr_sxy float, regr_syy float, count_rows int, regr_avgx float, regr_avgy float) │ estimated row count: 1 │ aggregate 0: min(column1) │ aggregate 1: count(column3) @@ -171,6 +177,8 @@ vectorized: false │ aggregate 19: regr_sxy(column1, column1) │ aggregate 20: regr_syy(column1, column1) │ aggregate 21: count_rows() + │ aggregate 22: regr_avgx(column1, column1) + │ aggregate 23: regr_avgy(column1, column1) │ └── • values columns: (column1 int, column3 unknown, column11 bool, column14 bytes) diff --git a/pkg/sql/opt/operator.go b/pkg/sql/opt/operator.go index 93f562389d14..5cb1ba04950e 100644 --- a/pkg/sql/opt/operator.go +++ b/pkg/sql/opt/operator.go @@ -191,6 +191,7 @@ var AggregateOpReverseMap = map[Operator]string{ CovarPopOp: "covar_pop", CovarSampOp: "covar_samp", RegressionAvgXOp: "regr_avgx", + RegressionAvgYOp: "regr_avgy", RegressionInterceptOp: "regr_intercept", RegressionR2Op: "regr_r2", RegressionSlopeOp: "regr_slope", @@ -318,9 +319,9 @@ func AggregateIgnoresNulls(op Operator) bool { ConstNotNullAggOp, CorrOp, CountOp, MaxOp, MinOp, SqrDiffOp, StdDevOp, StringAggOp, SumOp, SumIntOp, VarianceOp, XorAggOp, PercentileDiscOp, PercentileContOp, STMakeLineOp, STCollectOp, STExtentOp, STUnionOp, StdDevPopOp, - VarPopOp, CovarPopOp, CovarSampOp, RegressionAvgXOp, RegressionInterceptOp, - RegressionR2Op, RegressionSlopeOp, RegressionSXXOp, RegressionSXYOp, - RegressionSYYOp, RegressionCountOp: + VarPopOp, CovarPopOp, CovarSampOp, RegressionAvgXOp, RegressionAvgYOp, + RegressionInterceptOp, RegressionR2Op, RegressionSlopeOp, RegressionSXXOp, + RegressionSXYOp, RegressionSYYOp, RegressionCountOp: return true case ArrayAggOp, ConcatAggOp, ConstAggOp, CountRowsOp, FirstAggOp, JsonAggOp, @@ -344,9 +345,9 @@ func AggregateIsNullOnEmpty(op Operator) bool { MaxOp, MinOp, SqrDiffOp, StdDevOp, STMakeLineOp, StringAggOp, SumOp, SumIntOp, VarianceOp, XorAggOp, PercentileDiscOp, PercentileContOp, JsonObjectAggOp, JsonbObjectAggOp, StdDevPopOp, STCollectOp, STExtentOp, STUnionOp, - VarPopOp, CovarPopOp, CovarSampOp, RegressionAvgXOp, RegressionInterceptOp, - RegressionR2Op, RegressionSlopeOp, RegressionSXXOp, RegressionSXYOp, - RegressionSYYOp: + VarPopOp, CovarPopOp, CovarSampOp, RegressionAvgXOp, RegressionAvgYOp, + RegressionInterceptOp, RegressionR2Op, RegressionSlopeOp, RegressionSXXOp, + RegressionSXYOp, RegressionSYYOp: return true case CountOp, CountRowsOp, RegressionCountOp: @@ -373,8 +374,8 @@ func AggregateIsNeverNullOnNonNullInput(op Operator) bool { JsonAggOp, JsonbAggOp, MaxOp, MinOp, SqrDiffOp, STMakeLineOp, StringAggOp, SumOp, SumIntOp, XorAggOp, PercentileDiscOp, PercentileContOp, JsonObjectAggOp, JsonbObjectAggOp, StdDevPopOp, STCollectOp, STExtentOp, STUnionOp, - VarPopOp, CovarPopOp, RegressionAvgXOp, RegressionSXXOp, RegressionSXYOp, - RegressionSYYOp, RegressionCountOp: + VarPopOp, CovarPopOp, RegressionAvgXOp, RegressionAvgYOp, RegressionSXXOp, + RegressionSXYOp, RegressionSYYOp, RegressionCountOp: return true case VarianceOp, StdDevOp, CorrOp, CovarSampOp, RegressionInterceptOp, @@ -427,9 +428,9 @@ func AggregatesCanMerge(inner, outer Operator) bool { case ArrayAggOp, AvgOp, ConcatAggOp, CorrOp, JsonAggOp, JsonbAggOp, JsonObjectAggOp, JsonbObjectAggOp, PercentileContOp, PercentileDiscOp, SqrDiffOp, STCollectOp, StdDevOp, StringAggOp, VarianceOp, StdDevPopOp, - VarPopOp, CovarPopOp, CovarSampOp, RegressionAvgXOp, RegressionInterceptOp, - RegressionR2Op, RegressionSlopeOp, RegressionSXXOp, RegressionSXYOp, - RegressionSYYOp, RegressionCountOp: + VarPopOp, CovarPopOp, CovarSampOp, RegressionAvgXOp, RegressionAvgYOp, + RegressionInterceptOp, RegressionR2Op, RegressionSlopeOp, RegressionSXXOp, + RegressionSXYOp, RegressionSYYOp, RegressionCountOp: return false default: @@ -449,9 +450,9 @@ func AggregateIgnoresDuplicates(op Operator) bool { SumOp, SqrDiffOp, VarianceOp, StdDevOp, XorAggOp, JsonAggOp, JsonbAggOp, StringAggOp, PercentileDiscOp, PercentileContOp, StdDevPopOp, STMakeLineOp, VarPopOp, JsonObjectAggOp, JsonbObjectAggOp, STCollectOp, CovarPopOp, - CovarSampOp, RegressionAvgXOp, RegressionInterceptOp, RegressionR2Op, - RegressionSlopeOp, RegressionSXXOp, RegressionSXYOp, RegressionSYYOp, - RegressionCountOp: + CovarSampOp, RegressionAvgXOp, RegressionAvgYOp, RegressionInterceptOp, + RegressionR2Op, RegressionSlopeOp, RegressionSXXOp, RegressionSXYOp, + RegressionSYYOp, RegressionCountOp: return false default: diff --git a/pkg/sql/opt/ops/scalar.opt b/pkg/sql/opt/ops/scalar.opt index 3f83e86fc0ec..6754b708972f 100644 --- a/pkg/sql/opt/ops/scalar.opt +++ b/pkg/sql/opt/ops/scalar.opt @@ -836,6 +836,12 @@ define RegressionAvgX { X ScalarExpr } +[Scalar, Aggregate] +define RegressionAvgY { + Y ScalarExpr + X ScalarExpr +} + [Scalar, Aggregate] define RegressionIntercept { Y ScalarExpr diff --git a/pkg/sql/opt/optbuilder/groupby.go b/pkg/sql/opt/optbuilder/groupby.go index f9038aa6bdf4..e8a09f0e72fa 100644 --- a/pkg/sql/opt/optbuilder/groupby.go +++ b/pkg/sql/opt/optbuilder/groupby.go @@ -811,6 +811,8 @@ func (b *Builder) constructAggregate(name string, args []opt.ScalarExpr) opt.Sca return b.factory.ConstructCovarSamp(args[0], args[1]) case "regr_avgx": return b.factory.ConstructRegressionAvgX(args[0], args[1]) + case "regr_avgy": + return b.factory.ConstructRegressionAvgY(args[0], args[1]) case "regr_intercept": return b.factory.ConstructRegressionIntercept(args[0], args[1]) case "regr_r2": diff --git a/pkg/sql/opt/optbuilder/testdata/aggregate b/pkg/sql/opt/optbuilder/testdata/aggregate index 5c82e4bb4168..2e852b35ea32 100644 --- a/pkg/sql/opt/optbuilder/testdata/aggregate +++ b/pkg/sql/opt/optbuilder/testdata/aggregate @@ -3304,6 +3304,150 @@ SELECT regr_count('foo', v) FROM kv ---- error (22P02): regr_count(): could not parse "foo" as type int: strconv.ParseInt: parsing "foo": invalid syntax +# Tests for regr_avgx. + +build +SELECT regr_avgx(k, v) FROM kv +---- +scalar-group-by + ├── columns: regr_avgx:6 + ├── project + │ ├── columns: k:1!null v:2 + │ └── scan kv + │ └── columns: k:1!null v:2 w:3 s:4 crdb_internal_mvcc_timestamp:5 + └── aggregations + └── regression-avg-x [as=regr_avgx:6] + ├── k:1 + └── v:2 + +build +SELECT regr_avgx(k) FROM kv +---- +error (42883): unknown signature: regr_avgx(int) + +build +SELECT regr_avgx(k, 'x', 'y') FROM kv +---- +error (42883): unknown signature: regr_avgx(int, string, string) + +build +SELECT regr_avgx(DISTINCT k, v) FROM kv +---- +scalar-group-by + ├── columns: regr_avgx:6 + ├── project + │ ├── columns: k:1!null v:2 + │ └── scan kv + │ └── columns: k:1!null v:2 w:3 s:4 crdb_internal_mvcc_timestamp:5 + └── aggregations + └── agg-distinct [as=regr_avgx:6] + └── regression-avg-x + ├── k:1 + └── v:2 + +build +SELECT max(s), regr_avgx(k, v), min(s) FROM kv +---- +scalar-group-by + ├── columns: max:6 regr_avgx:7 min:8 + ├── project + │ ├── columns: k:1!null v:2 s:4 + │ └── scan kv + │ └── columns: k:1!null v:2 w:3 s:4 crdb_internal_mvcc_timestamp:5 + └── aggregations + ├── max [as=max:6] + │ └── s:4 + ├── regression-avg-x [as=regr_avgx:7] + │ ├── k:1 + │ └── v:2 + └── min [as=min:8] + └── s:4 + +build +SELECT regr_avgx(k, NULL) FROM kv +---- +error (42725): ambiguous call: regr_avgx(int, unknown), candidates are: +regr_avgx(int, int) -> float +regr_avgx(int, float) -> float +regr_avgx(int, decimal) -> float + +build +SELECT regr_avgx('foo', v) FROM kv +---- +error (22P02): regr_avgx(): could not parse "foo" as type int: strconv.ParseInt: parsing "foo": invalid syntax + +# Tests for regr_avgy. + +build +SELECT regr_avgy(k, v) FROM kv +---- +scalar-group-by + ├── columns: regr_avgy:6 + ├── project + │ ├── columns: k:1!null v:2 + │ └── scan kv + │ └── columns: k:1!null v:2 w:3 s:4 crdb_internal_mvcc_timestamp:5 + └── aggregations + └── regression-avg-y [as=regr_avgy:6] + ├── k:1 + └── v:2 + +build +SELECT regr_avgy(k) FROM kv +---- +error (42883): unknown signature: regr_avgy(int) + +build +SELECT regr_avgy(k, 'x', 'y') FROM kv +---- +error (42883): unknown signature: regr_avgy(int, string, string) + +build +SELECT regr_avgy(DISTINCT k, v) FROM kv +---- +scalar-group-by + ├── columns: regr_avgy:6 + ├── project + │ ├── columns: k:1!null v:2 + │ └── scan kv + │ └── columns: k:1!null v:2 w:3 s:4 crdb_internal_mvcc_timestamp:5 + └── aggregations + └── agg-distinct [as=regr_avgy:6] + └── regression-avg-y + ├── k:1 + └── v:2 + +build +SELECT max(s), regr_avgy(k, v), min(s) FROM kv +---- +scalar-group-by + ├── columns: max:6 regr_avgy:7 min:8 + ├── project + │ ├── columns: k:1!null v:2 s:4 + │ └── scan kv + │ └── columns: k:1!null v:2 w:3 s:4 crdb_internal_mvcc_timestamp:5 + └── aggregations + ├── max [as=max:6] + │ └── s:4 + ├── regression-avg-y [as=regr_avgy:7] + │ ├── k:1 + │ └── v:2 + └── min [as=min:8] + └── s:4 + +build +SELECT regr_avgy(k, NULL) FROM kv +---- +error (42725): ambiguous call: regr_avgy(int, unknown), candidates are: +regr_avgy(int, int) -> float +regr_avgy(int, float) -> float +regr_avgy(int, decimal) -> float + +build +SELECT regr_avgy('foo', v) FROM kv +---- +error (22P02): regr_avgy(): could not parse "foo" as type int: strconv.ParseInt: parsing "foo": invalid syntax + # Tests for string_agg. build diff --git a/pkg/sql/sem/builtins/aggregate_builtins.go b/pkg/sql/sem/builtins/aggregate_builtins.go index 82d3c091c862..b12d0c6ca990 100644 --- a/pkg/sql/sem/builtins/aggregate_builtins.go +++ b/pkg/sql/sem/builtins/aggregate_builtins.go @@ -185,6 +185,10 @@ var aggregates = map[string]builtinDefinition{ newRegressionAvgXAggregate, "Calculates the average of the independent variable (sum(X)/N).", ), + "regr_avgy": makeRegressionAggregateBuiltin( + newRegressionAvgYAggregate, "Calculates the average of the dependent variable (sum(Y)/N).", + ), + "regr_intercept": makeRegressionAggregateBuiltin( newRegressionInterceptAggregate, "Calculates y-intercept of the least-squares-fit linear equation determined by the (X, Y) pairs.", ), @@ -1089,6 +1093,8 @@ var _ tree.AggregateFunc = ®ressionSXXAggregate{} var _ tree.AggregateFunc = ®ressionSXYAggregate{} var _ tree.AggregateFunc = ®ressionSYYAggregate{} var _ tree.AggregateFunc = ®ressionCountAggregate{} +var _ tree.AggregateFunc = ®ressionAvgXAggregate{} +var _ tree.AggregateFunc = ®ressionAvgYAggregate{} const sizeOfArrayAggregate = int64(unsafe.Sizeof(arrayAggregate{})) const sizeOfAvgAggregate = int64(unsafe.Sizeof(avgAggregate{})) @@ -2037,6 +2043,25 @@ func (a *regressionAvgXAggregate) Result() (tree.Datum, error) { return tree.NewDFloat(tree.DFloat(a.sx / a.n)), nil } +// regressionAvgYAggregate represents SQL:2003 average of the dependent +// variable (sum(Y)/N). +type regressionAvgYAggregate struct { + regressionAccumulatorBase +} + +func newRegressionAvgYAggregate([]*types.T, *tree.EvalContext, tree.Datums) tree.AggregateFunc { + return ®ressionAvgYAggregate{} +} + +// Result implements tree.AggregateFunc interface. +func (a *regressionAvgYAggregate) Result() (tree.Datum, error) { + if a.n < 1 { + return tree.DNull, nil + } + + return tree.NewDFloat(tree.DFloat(a.sy / a.n)), nil +} + // regressionInterceptAggregate represents y-intercept. type regressionInterceptAggregate struct { regressionAccumulatorBase diff --git a/pkg/sql/sem/builtins/aggregate_builtins_test.go b/pkg/sql/sem/builtins/aggregate_builtins_test.go index 8f42ba024d35..f2d68feffd67 100644 --- a/pkg/sql/sem/builtins/aggregate_builtins_test.go +++ b/pkg/sql/sem/builtins/aggregate_builtins_test.go @@ -371,6 +371,11 @@ func TestRegressionAvgX(t *testing.T) { testRegressionAggregateFunctionResultDeepCopy(t, newRegressionAvgXAggregate) } +func TestRegressionAvgY(t *testing.T) { + defer leaktest.AfterTest(t)() + testRegressionAggregateFunctionResultDeepCopy(t, newRegressionAvgYAggregate) +} + // testRegressionAggregateFunctionResultDeepCopy is a helper function // for testing regression aggregate functions. func testRegressionAggregateFunctionResultDeepCopy( @@ -833,6 +838,10 @@ func BenchmarkRegressionAvgXAggregate(b *testing.B) { runRegressionAggregateBenchmarks(b, newRegressionAvgXAggregate) } +func BenchmarkRegressionAvgYAggregate(b *testing.B) { + runRegressionAggregateBenchmarks(b, newRegressionAvgYAggregate) +} + // runRegressionAggregateBenchmarks is a helper function for running // benchmarks for regression aggregate functions. func runRegressionAggregateBenchmarks( diff --git a/scripts/crlogictest.vim b/scripts/crlogictest.vim index d981dac86517..8fbe1c8f9e88 100644 --- a/scripts/crlogictest.vim +++ b/scripts/crlogictest.vim @@ -81,7 +81,7 @@ syn keyword sqlType TIME TIMESTAMP TIMESTAMPTZ TREAT TRIM VALUES VARCHAR syn keyword sqlKeyword COLLATION CROSS FULL INNER ILIKE IS JOIN LEFT LIKE NATURAL OUTER OVERLAPS RIGHT SIMILAR -syn keyword sqlFunc MIN MAX CORR COUNT SUM_INT AVG SUM STDDEV VARIANCE BOOL_AND BOOL_OR ARRAY_AGG BIT_AND BIT_OR STDDEV_POP VAR_POP COVAR_POP COVAR_SAMP REGR_AVGX REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY REGR_COUNT +syn keyword sqlFunc MIN MAX CORR COUNT SUM_INT AVG SUM STDDEV VARIANCE BOOL_AND BOOL_OR ARRAY_AGG BIT_AND BIT_OR STDDEV_POP VAR_POP COVAR_POP COVAR_SAMP REGR_AVGX REGR_AVGY REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY REGR_COUNT hi def link valueKeyword Constant