diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 35458ceeba79e..d562c44348f03 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -14324,10 +14324,10 @@ func (m *InventoryConnectedServiceCounts) GetServiceCounts() map[github_com_grav type InventoryPingRequest struct { // ServerID is the ID of the instance to ping. ServerID string `protobuf:"bytes,1,opt,name=ServerID,proto3" json:"ServerID,omitempty"` - // ControlLog forces the ping to use the standard "commit then act" model of control log synchronization - // for the ping. This significantly increases the amount of time it takes for the ping request to - // complete, but is useful for testing/debugging control log issues. - ControlLog bool `protobuf:"varint,2,opt,name=ControlLog,proto3" json:"ControlLog,omitempty"` + // ControlLog used to signal that the ping should use the control log synchronization. + // + // Deprecated: the control log is unsupported and unsound to use. + ControlLog bool `protobuf:"varint,2,opt,name=ControlLog,proto3" json:"ControlLog,omitempty"` // Deprecated: Do not use. XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -14373,6 +14373,7 @@ func (m *InventoryPingRequest) GetServerID() string { return "" } +// Deprecated: Do not use. func (m *InventoryPingRequest) GetControlLog() bool { if m != nil { return m.ControlLog @@ -15814,7 +15815,7 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 15101 bytes of a gzipped FileDescriptorProto + // 15105 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x6c, 0x5c, 0x49, 0x76, 0x18, 0xbb, 0xf9, 0x3e, 0x7c, 0xa8, 0x55, 0x24, 0xc5, 0x16, 0xf5, 0x68, 0xe9, 0x6a, 0x34, 0xa3, 0xd1, 0xce, 0xea, 0x41, 0xcd, 0xcc, 0xce, 0x6b, 0x67, 0xa6, 0xf9, 0x90, 0x48, 0x89, 0xaf, @@ -16471,294 +16472,295 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x48, 0xba, 0xa5, 0x27, 0xe1, 0x60, 0x5d, 0x83, 0xd7, 0x95, 0x08, 0xd4, 0x6c, 0x30, 0x78, 0x4a, 0x0b, 0xf8, 0xaf, 0x16, 0xa1, 0xd2, 0x03, 0x95, 0xfc, 0xa3, 0x42, 0x52, 0xda, 0x7c, 0x36, 0xbe, 0x9f, 0x94, 0x76, 0x36, 0x7d, 0x86, 0xd8, 0x17, 0x3e, 0xf8, 0xb5, 0x3f, 0x7d, 0xe1, 0x93, 0x47, - 0x7a, 0xc8, 0x4e, 0x2e, 0xad, 0x01, 0x5d, 0x5a, 0x36, 0x4c, 0x1b, 0x67, 0xb6, 0xe3, 0x6c, 0x5e, - 0x17, 0x01, 0x44, 0x8e, 0xda, 0x35, 0x7f, 0x4f, 0xe8, 0x89, 0x1a, 0xc4, 0xba, 0x0b, 0x33, 0x09, - 0x9e, 0xc2, 0x2a, 0xff, 0x5d, 0x50, 0x0f, 0xe4, 0x91, 0x69, 0xff, 0xc2, 0xe9, 0x9f, 0x1d, 0x56, - 0x26, 0x98, 0x4a, 0x7f, 0x23, 0xce, 0x51, 0x20, 0xff, 0xb2, 0xd6, 0xf5, 0x7b, 0x85, 0x6a, 0x4b, - 0x0f, 0x1c, 0x44, 0x6e, 0xc3, 0x10, 0x87, 0x24, 0x22, 0x81, 0xeb, 0xd8, 0x62, 0x4d, 0x10, 0x88, - 0xd6, 0x0c, 0x3e, 0xe7, 0xc5, 0x1f, 0xd5, 0x38, 0xfc, 0x84, 0xb5, 0xc3, 0x33, 0xe3, 0xc4, 0x60, - 0x15, 0x6d, 0x7c, 0xa0, 0x1a, 0x87, 0xc9, 0x90, 0x0e, 0x26, 0x12, 0xcf, 0xf3, 0x9f, 0xb5, 0x68, - 0x93, 0xa7, 0x34, 0x5c, 0x18, 0x17, 0x0e, 0x26, 0x03, 0x0e, 0x63, 0x80, 0x64, 0xd6, 0x27, 0x30, - 0xc3, 0x34, 0x85, 0x20, 0x59, 0x1f, 0xe6, 0xc3, 0x60, 0x30, 0xd3, 0x6b, 0xdf, 0x61, 0x20, 0xf4, - 0xda, 0x17, 0x85, 0xd6, 0x1a, 0x9c, 0xe5, 0x56, 0x49, 0xbd, 0x4b, 0xf1, 0x1d, 0xc0, 0x20, 0xfe, - 0x4e, 0x3c, 0x06, 0xcd, 0xe8, 0x3d, 0xc7, 0xb3, 0x3e, 0xc6, 0xd7, 0x46, 0x62, 0x92, 0xba, 0xbe, - 0x17, 0x9b, 0x20, 0x8f, 0xf7, 0x3c, 0xf9, 0xaf, 0xc2, 0xf9, 0x6a, 0xbb, 0x4d, 0xbd, 0x66, 0x4c, - 0xb8, 0x1d, 0x38, 0xc7, 0x0c, 0x1e, 0x41, 0xaa, 0x30, 0x88, 0xd8, 0xea, 0x72, 0x56, 0x34, 0x37, - 0xa3, 0x39, 0x88, 0x27, 0x42, 0xc3, 0x62, 0x05, 0x9c, 0xd2, 0x6a, 0xc2, 0x6c, 0xad, 0xf3, 0xe8, - 0xc0, 0x8d, 0xd0, 0xd7, 0x1f, 0x03, 0xb0, 0xc8, 0xba, 0x57, 0x65, 0x32, 0x33, 0x2e, 0x8c, 0x6b, - 0xf1, 0xab, 0x14, 0x7c, 0x2e, 0x20, 0x82, 0xb2, 0x3c, 0xbd, 0x7d, 0x23, 0x26, 0x45, 0xf3, 0x0b, - 0xaf, 0x05, 0x8b, 0x45, 0xc2, 0x33, 0x6b, 0x0a, 0x4e, 0xeb, 0x97, 0x51, 0x7c, 0x86, 0xcc, 0xc0, - 0x94, 0x79, 0xc9, 0xc4, 0xc1, 0x5f, 0xc3, 0x34, 0x37, 0x82, 0xf3, 0xd0, 0xee, 0xf3, 0x71, 0x14, - 0xf3, 0xe2, 0xee, 0x7c, 0xe2, 0x91, 0x01, 0xfa, 0x1e, 0xab, 0xa4, 0x1d, 0xbb, 0xf3, 0xfc, 0xc5, - 0xe8, 0xd3, 0x79, 0xe3, 0x9a, 0xb4, 0xb8, 0x3b, 0xbf, 0x30, 0x2c, 0x42, 0xe4, 0x32, 0xee, 0x7c, - 0xf8, 0xbf, 0x15, 0xee, 0xf3, 0x18, 0xa4, 0x60, 0x85, 0x3a, 0xf8, 0xa0, 0x28, 0xfb, 0xa9, 0xf7, - 0x24, 0x14, 0x55, 0x0c, 0xcc, 0xa2, 0xdb, 0xb4, 0x7e, 0xbf, 0x00, 0xd7, 0xb8, 0x32, 0x96, 0x4d, - 0x87, 0x37, 0x4e, 0x39, 0xc4, 0xe4, 0x3d, 0x18, 0x0c, 0x35, 0xcf, 0x0b, 0x4b, 0xb4, 0xbc, 0x1b, - 0x27, 0x4e, 0x40, 0xaa, 0x30, 0xae, 0xbf, 0x9b, 0x39, 0x5e, 0x78, 0x3d, 0x7b, 0xec, 0xe0, 0xb1, - 0xa3, 0xde, 0xd2, 0x3c, 0x81, 0x73, 0xcb, 0xdf, 0xb0, 0x09, 0x21, 0x76, 0x27, 0x71, 0x72, 0x88, - 0x9f, 0x12, 0x9f, 0xda, 0x16, 0x33, 0xc6, 0x3c, 0xd6, 0x27, 0xc1, 0xec, 0x8c, 0x2c, 0x37, 0x38, - 0xa5, 0xbe, 0x8f, 0xda, 0x06, 0xcc, 0xfa, 0xa3, 0x02, 0x9c, 0xcf, 0xae, 0x4d, 0x2c, 0x2c, 0xab, - 0x70, 0x7a, 0xd1, 0xf1, 0x7c, 0xcf, 0x6d, 0x38, 0xad, 0x5a, 0x63, 0x9f, 0x36, 0x3b, 0x2a, 0x90, - 0xae, 0x5a, 0x65, 0xf6, 0xa8, 0x27, 0xc9, 0x25, 0x8a, 0x9d, 0xa6, 0x62, 0xa7, 0x43, 0x7c, 0x7a, - 0xc1, 0xd7, 0xde, 0x16, 0x0d, 0x14, 0x3f, 0xde, 0xb2, 0x9c, 0x52, 0x72, 0x4b, 0x5a, 0xfb, 0x9b, - 0x3b, 0x9e, 0x1b, 0x29, 0x22, 0x6e, 0xe6, 0xc9, 0x2a, 0xb2, 0xfe, 0x63, 0x01, 0xce, 0x62, 0xee, - 0x2c, 0x23, 0x1b, 0x67, 0x1c, 0x4f, 0x5a, 0x86, 0x44, 0x2e, 0x18, 0x4f, 0x49, 0x0c, 0x6c, 0x33, - 0x36, 0x32, 0x79, 0x0b, 0x06, 0x6a, 0xd2, 0x13, 0x6c, 0x32, 0x91, 0x47, 0x59, 0x50, 0xb0, 0x72, - 0x1b, 0xb1, 0xd8, 0x9e, 0xb3, 0x44, 0xc3, 0x06, 0xf5, 0x30, 0xe1, 0x35, 0xb7, 0x3a, 0x68, 0x90, - 0x38, 0xd4, 0xd3, 0x40, 0x5e, 0xa8, 0xa7, 0x41, 0x33, 0xd4, 0x93, 0xf5, 0x94, 0x67, 0xce, 0x4a, - 0x76, 0x48, 0x0c, 0xd2, 0xc7, 0xa9, 0xfc, 0xd8, 0x7c, 0x1f, 0x38, 0x93, 0xd5, 0x33, 0xa6, 0xa0, - 0x27, 0x52, 0x5f, 0xe7, 0xc7, 0x6f, 0xde, 0x82, 0xd7, 0x0c, 0xdc, 0x6a, 0xab, 0xe5, 0x3f, 0xa3, - 0xcd, 0xad, 0xc0, 0x3f, 0xf0, 0x23, 0x23, 0x73, 0x90, 0x48, 0x10, 0x1f, 0xdf, 0xe7, 0x88, 0x59, - 0x99, 0x00, 0x5b, 0x7f, 0x05, 0xae, 0xf6, 0xe0, 0x28, 0x3a, 0x55, 0x83, 0xd3, 0x4e, 0xa2, 0x4c, - 0xba, 0xf4, 0x5c, 0xcd, 0xea, 0x57, 0x92, 0x51, 0x68, 0xa7, 0xe9, 0xaf, 0x6f, 0x1b, 0x39, 0xa5, - 0x49, 0x19, 0xa6, 0xb7, 0xec, 0xcd, 0xa5, 0x9d, 0xc5, 0xed, 0xfa, 0xf6, 0x17, 0x5b, 0xcb, 0xf5, - 0x9d, 0x8d, 0x07, 0x1b, 0x9b, 0x0f, 0x37, 0x78, 0x00, 0x74, 0xa3, 0x64, 0x7b, 0xb9, 0xba, 0x5e, - 0x2a, 0x90, 0x69, 0x28, 0x19, 0xe0, 0xe5, 0x9d, 0x85, 0x52, 0xf1, 0xfa, 0xd7, 0x46, 0xae, 0x64, - 0x72, 0x1e, 0xca, 0xb5, 0x9d, 0xad, 0xad, 0x4d, 0x5b, 0x71, 0xd5, 0xc3, 0xaf, 0xcf, 0xc0, 0x69, - 0xa3, 0xf4, 0xae, 0xbd, 0xbc, 0x5c, 0x2a, 0xb0, 0xa6, 0x18, 0xe0, 0x2d, 0x7b, 0x79, 0x7d, 0x75, - 0x67, 0xbd, 0x54, 0xbc, 0x5e, 0xd7, 0xdf, 0xaf, 0x91, 0x73, 0x30, 0xbb, 0xb4, 0xbc, 0xbb, 0xba, - 0xb8, 0x9c, 0xc5, 0x7b, 0x1a, 0x4a, 0x7a, 0xe1, 0xf6, 0xe6, 0xf6, 0x16, 0x67, 0xad, 0x43, 0x1f, - 0x2e, 0x2f, 0x54, 0x77, 0xb6, 0x57, 0x36, 0x4a, 0xfd, 0xd6, 0xc0, 0x48, 0xb1, 0x54, 0xbc, 0xfe, - 0x43, 0xe3, 0x71, 0x1b, 0x6b, 0xbe, 0x40, 0xdf, 0xa9, 0x55, 0xef, 0xe5, 0x57, 0xc1, 0x4b, 0xd7, - 0xef, 0x56, 0x4b, 0x05, 0x72, 0x01, 0xce, 0x1a, 0xd0, 0xad, 0x6a, 0xad, 0xf6, 0x70, 0xd3, 0x5e, - 0x5a, 0x5b, 0xae, 0xd5, 0x4a, 0xc5, 0xeb, 0xbb, 0x46, 0x78, 0x3b, 0x56, 0xc3, 0xfa, 0xdd, 0x6a, - 0xdd, 0x5e, 0xfe, 0x6c, 0x67, 0xd5, 0x5e, 0x5e, 0x4a, 0xd7, 0x60, 0x94, 0x7e, 0xb1, 0x5c, 0x2b, - 0x15, 0xc8, 0x14, 0x9c, 0x32, 0xa0, 0x1b, 0x9b, 0xa5, 0xe2, 0xf5, 0xd7, 0x45, 0x04, 0x34, 0x32, - 0x09, 0xb0, 0xb4, 0x5c, 0x5b, 0x5c, 0xde, 0x58, 0x5a, 0xdd, 0xb8, 0x57, 0xea, 0x23, 0x13, 0x30, - 0x5a, 0x55, 0x3f, 0x0b, 0xd7, 0x3f, 0x80, 0x53, 0x89, 0xa3, 0x3d, 0xc3, 0x50, 0x87, 0xe2, 0x52, - 0x1f, 0x8a, 0x5f, 0xfe, 0x44, 0xfb, 0x2a, 0x3f, 0xa5, 0x97, 0x0a, 0xd7, 0x17, 0x64, 0x7a, 0x5d, - 0xed, 0x3b, 0x27, 0x63, 0x30, 0xbc, 0xb4, 0x7c, 0xb7, 0xba, 0xb3, 0xb6, 0x5d, 0xea, 0x63, 0x3f, - 0x16, 0xed, 0xe5, 0xea, 0xf6, 0xf2, 0x52, 0xa9, 0x40, 0x46, 0x61, 0xb0, 0xb6, 0x5d, 0xdd, 0x5e, - 0x2e, 0x15, 0xc9, 0x08, 0x0c, 0xec, 0xd4, 0x96, 0xed, 0x52, 0xff, 0xfc, 0xbf, 0xf9, 0x87, 0x05, - 0x6e, 0x64, 0x94, 0x0f, 0xa5, 0xbe, 0xd6, 0x0e, 0x93, 0x62, 0xc9, 0x13, 0xb9, 0x44, 0x73, 0x4f, - 0x8e, 0xa8, 0x05, 0xcc, 0x75, 0xb9, 0x75, 0x41, 0x84, 0x6b, 0x85, 0x5b, 0x05, 0x62, 0xa3, 0x97, - 0x4a, 0xe2, 0x6c, 0xa5, 0x38, 0x67, 0x1f, 0x7f, 0xe7, 0x2e, 0x74, 0x3d, 0x92, 0x91, 0x5f, 0x02, - 0x4b, 0xe7, 0x99, 0x73, 0x02, 0xf9, 0xee, 0xf1, 0x4e, 0x1a, 0xb2, 0xce, 0xd7, 0x8f, 0x87, 0x4e, - 0xee, 0xc3, 0x04, 0xd3, 0xcd, 0x15, 0x1a, 0x39, 0x97, 0x24, 0xd4, 0x8e, 0x03, 0x73, 0xe7, 0xb3, - 0x0b, 0x55, 0xba, 0x9f, 0x71, 0xec, 0x08, 0x3f, 0x58, 0x87, 0x44, 0x46, 0xc9, 0x90, 0x10, 0xbe, - 0xe2, 0xcf, 0x9d, 0x4e, 0x80, 0x77, 0x6f, 0xdf, 0x2a, 0x90, 0x1a, 0x86, 0xa8, 0x33, 0x94, 0x7c, - 0x22, 0x5f, 0xee, 0xa5, 0xb5, 0x7f, 0xde, 0x9a, 0x8a, 0x4a, 0xce, 0x99, 0x73, 0x3a, 0xd8, 0x00, - 0x92, 0xd6, 0x9d, 0xc9, 0xa5, 0x78, 0x1e, 0x64, 0xab, 0xd5, 0x73, 0x67, 0x52, 0x8e, 0x8d, 0xcb, - 0x4c, 0x7b, 0x22, 0xcb, 0x30, 0x29, 0x9e, 0xc0, 0x0b, 0x6d, 0x9e, 0x74, 0x3b, 0x0f, 0xe4, 0xb2, - 0xb9, 0x87, 0x72, 0x52, 0x27, 0x02, 0x32, 0x17, 0xf7, 0x23, 0x79, 0x4c, 0x98, 0x3b, 0x97, 0x59, - 0x26, 0xfa, 0x77, 0x17, 0x26, 0xcd, 0xc3, 0x05, 0x91, 0x03, 0x94, 0x79, 0xe6, 0xc8, 0x6d, 0x50, - 0x1d, 0x66, 0xd7, 0x1d, 0x17, 0xef, 0x4a, 0x84, 0xf7, 0x9c, 0x74, 0x50, 0x23, 0x95, 0x2e, 0x1e, - 0x6b, 0x35, 0xea, 0x35, 0xd5, 0x20, 0xe4, 0x85, 0xee, 0xc7, 0xcf, 0xa6, 0x26, 0x75, 0x64, 0xd3, - 0x79, 0x90, 0x58, 0x66, 0xc2, 0xe5, 0x2c, 0x7f, 0xd0, 0xb9, 0x3c, 0x17, 0x66, 0xb2, 0x8e, 0x4a, - 0x7a, 0x82, 0xa3, 0x36, 0x27, 0x4e, 0xcc, 0xae, 0x8c, 0x81, 0x18, 0xb4, 0x2c, 0xf8, 0xa2, 0x30, - 0x24, 0x39, 0x82, 0xcb, 0x65, 0x76, 0xab, 0x40, 0xbe, 0xc6, 0xaf, 0x3a, 0x93, 0xdd, 0x43, 0x37, - 0xda, 0x17, 0xda, 0xcf, 0xb9, 0x4c, 0x06, 0xe2, 0x43, 0xe9, 0xc2, 0xdd, 0x86, 0xe9, 0x2c, 0xaf, - 0x69, 0x25, 0xd0, 0x2e, 0x2e, 0xd5, 0xb9, 0xb3, 0xc0, 0x66, 0x47, 0x8d, 0x66, 0xfe, 0x20, 0x75, - 0x71, 0xda, 0xcd, 0xe5, 0xf9, 0x11, 0x4c, 0xb2, 0x59, 0xf2, 0x80, 0xd2, 0x76, 0xb5, 0xe5, 0x3e, - 0xa5, 0x21, 0x91, 0xf1, 0x85, 0x15, 0x28, 0x8f, 0xf6, 0x5a, 0x81, 0x7c, 0x07, 0xc6, 0x1e, 0x3a, - 0x51, 0x63, 0x5f, 0xc4, 0xd9, 0x94, 0x61, 0x38, 0x11, 0x36, 0x27, 0x7f, 0x61, 0xe1, 0xad, 0x02, - 0xf9, 0x3e, 0x0c, 0xdf, 0xa3, 0x11, 0xbe, 0x9c, 0xbe, 0xac, 0x9c, 0xfc, 0xb8, 0x6d, 0x72, 0xd5, - 0x53, 0xcf, 0x83, 0x64, 0x83, 0x93, 0x86, 0x5c, 0x72, 0x13, 0x80, 0x2f, 0x08, 0xc8, 0x21, 0x59, - 0x3c, 0x97, 0x6a, 0x36, 0xb9, 0xc7, 0x94, 0x87, 0x16, 0x8d, 0xe8, 0x71, 0xab, 0xcc, 0x93, 0xd1, - 0x1a, 0x4c, 0xaa, 0x0c, 0x49, 0x1b, 0x18, 0x0e, 0xc5, 0x4a, 0x30, 0x0b, 0x4f, 0xc0, 0xed, 0x03, - 0xf6, 0x55, 0xf0, 0xf4, 0xc0, 0x18, 0x37, 0x03, 0x57, 0xd2, 0x59, 0x3d, 0xf8, 0x86, 0xbe, 0x84, - 0x4a, 0x21, 0x72, 0x34, 0x8d, 0x76, 0xc5, 0x0f, 0x23, 0x93, 0x56, 0x41, 0xb2, 0x69, 0x7f, 0x11, - 0xe6, 0xf4, 0x7a, 0xcd, 0x40, 0xcf, 0xf1, 0x9a, 0x9b, 0x17, 0x3f, 0x7a, 0xee, 0x72, 0x17, 0x0c, - 0x71, 0x7e, 0xeb, 0xff, 0x8d, 0x62, 0x01, 0x97, 0x93, 0x25, 0x98, 0x92, 0x75, 0x6d, 0xb6, 0xa9, - 0x57, 0xab, 0xad, 0x60, 0x36, 0x1c, 0xe9, 0x52, 0xa2, 0xc1, 0x24, 0x77, 0x92, 0x2e, 0x62, 0x5b, - 0x9f, 0x11, 0x1f, 0x83, 0x74, 0x8b, 0x9a, 0x11, 0x6f, 0x7d, 0x99, 0x11, 0x88, 0x1f, 0x70, 0xa3, - 0x92, 0xa1, 0xfc, 0xef, 0xce, 0x93, 0x2e, 0x07, 0xa0, 0xb9, 0x9c, 0x23, 0xc4, 0xad, 0x02, 0xf9, - 0x02, 0x48, 0xfa, 0x48, 0xa2, 0x44, 0x98, 0x7b, 0xfc, 0x52, 0x22, 0xec, 0x72, 0x9e, 0xb9, 0x07, - 0x33, 0x2a, 0x3a, 0x8e, 0x56, 0xeb, 0x3c, 0xc9, 0x69, 0x4d, 0x5e, 0x2b, 0xc9, 0x27, 0x30, 0x25, - 0x26, 0xad, 0x5e, 0x40, 0x4a, 0x6a, 0xfd, 0x11, 0xa7, 0x92, 0xdc, 0x79, 0x7a, 0x1f, 0x66, 0x6a, - 0x09, 0x89, 0x71, 0x2f, 0xfb, 0xb3, 0x26, 0x0b, 0x04, 0xd6, 0x68, 0xc4, 0x45, 0x96, 0xcd, 0xeb, - 0x01, 0x10, 0x6e, 0x14, 0x92, 0xec, 0x9e, 0xba, 0xf4, 0x19, 0xb9, 0x90, 0x68, 0x3a, 0x03, 0x22, - 0x1a, 0x2e, 0x60, 0xb9, 0x3d, 0xdb, 0xe6, 0xc9, 0xad, 0x11, 0x6a, 0xdc, 0xa1, 0x5f, 0x32, 0x08, - 0x8c, 0x6b, 0x78, 0x31, 0x00, 0x67, 0x73, 0x31, 0xc8, 0xaf, 0x60, 0x58, 0xda, 0xee, 0xc7, 0x2a, - 0xf2, 0x9d, 0xac, 0xd3, 0x6f, 0xce, 0xc1, 0x70, 0xee, 0xad, 0xe3, 0x21, 0xab, 0x83, 0xec, 0xc4, - 0x3d, 0x1a, 0x6d, 0xb5, 0x3a, 0x7b, 0x2e, 0xa6, 0x3d, 0x25, 0xca, 0x68, 0xa4, 0x40, 0x62, 0x5e, - 0xca, 0x68, 0x70, 0x71, 0x41, 0x8d, 0xfe, 0x88, 0xac, 0x42, 0x89, 0xaf, 0xff, 0x1a, 0x8b, 0x0b, - 0x29, 0x16, 0x02, 0xc5, 0x09, 0x9c, 0x83, 0x30, 0x77, 0xb4, 0x6e, 0x72, 0xa7, 0x25, 0x22, 0xbf, - 0x49, 0x5d, 0xc1, 0x9c, 0x32, 0x60, 0x2a, 0x54, 0x3f, 0x1b, 0x11, 0x9b, 0x86, 0x34, 0x92, 0xf1, - 0x6f, 0x78, 0xd2, 0xdb, 0x2b, 0xf1, 0x66, 0x9f, 0x2e, 0x8d, 0x3f, 0xfd, 0x44, 0xac, 0xb6, 0xdd, - 0x3b, 0x44, 0x25, 0x02, 0xce, 0x60, 0xfa, 0xba, 0xa1, 0x93, 0x9c, 0x8c, 0xef, 0xdb, 0xb8, 0x07, - 0x61, 0xcc, 0x9f, 0x99, 0xb8, 0x6d, 0xec, 0xb7, 0xa4, 0x9a, 0xd0, 0xa8, 0x76, 0xe7, 0x71, 0x49, - 0x63, 0x9b, 0x24, 0x53, 0x61, 0x3b, 0x41, 0x40, 0x3d, 0x4e, 0x9c, 0xa7, 0x6f, 0x64, 0x51, 0x7f, - 0x8c, 0x4b, 0x8f, 0x46, 0xcd, 0x1f, 0x03, 0xf6, 0x62, 0xc1, 0x93, 0x34, 0xdd, 0x2a, 0x90, 0xf7, - 0x60, 0x44, 0xb4, 0x91, 0x11, 0x19, 0x8d, 0x0e, 0xbb, 0xb4, 0x1a, 0x29, 0x81, 0x0b, 0x09, 0xdb, - 0x6c, 0xe2, 0xe4, 0x8d, 0x3e, 0x6f, 0xf3, 0x7b, 0x6c, 0xb3, 0x6d, 0xbe, 0x08, 0xe5, 0xa2, 0xdc, - 0x75, 0x91, 0xb2, 0xac, 0xe2, 0xc4, 0x48, 0x50, 0x8f, 0xed, 0x91, 0x33, 0x61, 0x7a, 0x33, 0x06, - 0x5b, 0x54, 0x31, 0xd3, 0x94, 0xde, 0x6c, 0x80, 0x7b, 0xed, 0xb5, 0xab, 0x50, 0xaa, 0x36, 0x70, - 0x27, 0xa8, 0xd1, 0x03, 0xa7, 0xbd, 0xef, 0x07, 0x54, 0x1d, 0x5a, 0x92, 0x05, 0x92, 0xd7, 0x8c, - 0xd2, 0x2c, 0x44, 0xc1, 0x1a, 0x75, 0x30, 0x22, 0xf5, 0xac, 0x52, 0x2d, 0x12, 0x45, 0xd9, 0x14, - 0x5d, 0x0e, 0x29, 0xd3, 0x8b, 0xec, 0x58, 0xd5, 0x7a, 0x39, 0x36, 0x1f, 0xe0, 0x82, 0xa1, 0x90, - 0x43, 0xb5, 0x43, 0x28, 0x90, 0x3a, 0xce, 0xc9, 0x77, 0x41, 0x0a, 0xb5, 0x2a, 0xef, 0x8c, 0x63, - 0xb1, 0xe4, 0x51, 0xe7, 0x55, 0xff, 0x3d, 0x98, 0x5c, 0x66, 0x0b, 0x7a, 0xa7, 0xe9, 0xf2, 0x28, - 0xfc, 0xc4, 0x0c, 0xab, 0x9e, 0x4b, 0xb8, 0x22, 0xf3, 0xa2, 0x21, 0xa9, 0x38, 0xfa, 0xcb, 0x3d, - 0x45, 0x83, 0xc9, 0xf1, 0x98, 0x96, 0x6c, 0x45, 0x22, 0x04, 0x3c, 0x9a, 0x8b, 0xb3, 0xfe, 0x2c, - 0xd7, 0x08, 0xab, 0xed, 0x76, 0x4b, 0x9a, 0xa4, 0xf9, 0xbd, 0xfb, 0x55, 0xe3, 0x08, 0x99, 0x2a, - 0x97, 0xbc, 0xd3, 0x4a, 0xe3, 0xe7, 0x5a, 0x9e, 0xe2, 0x1c, 0x9e, 0x39, 0xe5, 0xbd, 0xe6, 0xa2, - 0x8a, 0x9b, 0x5d, 0x6d, 0xb5, 0x52, 0xc4, 0x21, 0x79, 0xd3, 0xe4, 0x9e, 0x85, 0xd3, 0xab, 0x06, - 0x3c, 0xa2, 0x73, 0xad, 0xab, 0xda, 0x6e, 0xf3, 0xc5, 0xf2, 0xa2, 0x5a, 0x30, 0xcc, 0x82, 0xf4, - 0x11, 0x3d, 0x59, 0x2e, 0xd6, 0xf6, 0xfb, 0x38, 0xcd, 0xe2, 0x64, 0xc6, 0x44, 0x3f, 0xf0, 0x26, - 0x73, 0x39, 0x2b, 0x25, 0x2c, 0x51, 0xa8, 0xf6, 0x89, 0x53, 0xa8, 0xfa, 0xc4, 0x99, 0x91, 0x95, - 0x65, 0x26, 0x01, 0x97, 0xfc, 0x2e, 0xe6, 0x15, 0x2b, 0x4b, 0x69, 0x29, 0x99, 0x30, 0x5e, 0x75, - 0x39, 0x9d, 0x49, 0xde, 0xec, 0x72, 0x6e, 0xa6, 0xf9, 0xfb, 0x50, 0x4a, 0xe6, 0xaa, 0x56, 0x4c, - 0x73, 0x92, 0x58, 0xe7, 0x8e, 0xc9, 0x5d, 0x98, 0xd6, 0x47, 0x54, 0xf5, 0x3b, 0x6f, 0xf5, 0xcf, - 0xe3, 0xb3, 0x0d, 0x33, 0x99, 0xa9, 0xa5, 0xd5, 0x16, 0xdb, 0x2d, 0xf1, 0x74, 0x2e, 0x57, 0x0a, - 0x67, 0xb2, 0xb3, 0xcb, 0x93, 0xd7, 0xcc, 0x83, 0x7f, 0x76, 0xae, 0xed, 0xb9, 0xab, 0x3d, 0xb0, - 0x84, 0x40, 0xbf, 0xc6, 0x1d, 0x30, 0x55, 0xc7, 0x65, 0xcd, 0x14, 0x90, 0x53, 0x81, 0xd5, 0x0d, - 0x45, 0xcd, 0x81, 0xe9, 0x8c, 0xe2, 0x7c, 0x11, 0x5f, 0xc9, 0xe7, 0x19, 0x4f, 0xac, 0x5d, 0x19, - 0x1e, 0x3a, 0x57, 0x32, 0x5d, 0xb3, 0x90, 0x77, 0x39, 0x4b, 0xce, 0xa9, 0xf9, 0x70, 0xfc, 0x26, - 0xe7, 0x71, 0x6b, 0x2a, 0xb3, 0x8d, 0x91, 0x22, 0x3c, 0x69, 0xb6, 0xc9, 0x4a, 0x6d, 0xae, 0xc4, - 0xd0, 0x2d, 0x79, 0x3e, 0xdf, 0x8d, 0xbf, 0xe2, 0x76, 0x1c, 0xb3, 0x0a, 0xdd, 0x8e, 0x93, 0xc9, - 0xff, 0x52, 0x3e, 0x82, 0xce, 0xdc, 0xe1, 0x97, 0xb6, 0x89, 0x1c, 0xe7, 0x44, 0x3f, 0x2a, 0x65, - 0xe7, 0x3f, 0x57, 0x73, 0x23, 0x13, 0x45, 0xaf, 0xe2, 0xa1, 0xfc, 0x06, 0x73, 0xa4, 0xd4, 0x25, - 0x01, 0x7c, 0x77, 0x35, 0x65, 0x13, 0xca, 0xf1, 0x60, 0x26, 0x3a, 0x70, 0xc2, 0xa1, 0x94, 0xc2, - 0x38, 0x9b, 0x9b, 0xf6, 0x9d, 0xbc, 0x91, 0xfa, 0xd2, 0x73, 0x04, 0xd3, 0xb5, 0x0a, 0xbe, 0x9e, - 0x6b, 0xe1, 0xa6, 0xcf, 0xc5, 0x46, 0x5c, 0x3d, 0x43, 0x7c, 0x6a, 0x3d, 0xcf, 0x48, 0x1f, 0x7f, - 0x0f, 0xf5, 0x62, 0x2d, 0x05, 0x7c, 0x6e, 0xaf, 0x2f, 0x64, 0xf1, 0x09, 0xd3, 0x2b, 0xae, 0xd6, - 0x2e, 0xa9, 0xa7, 0x25, 0x0b, 0x4e, 0xb2, 0xe2, 0x1e, 0xa7, 0x69, 0x79, 0x7c, 0x96, 0x60, 0x4c, - 0xcb, 0x1d, 0x4f, 0xce, 0x1a, 0x62, 0x32, 0xf6, 0xd0, 0x39, 0xa3, 0x73, 0xe6, 0xf6, 0xb9, 0x88, - 0xa6, 0x64, 0x95, 0x81, 0x3e, 0xb7, 0x15, 0xe7, 0xd2, 0x3c, 0x0c, 0x33, 0xb2, 0x92, 0x02, 0x6f, - 0xcd, 0xf9, 0xa4, 0x70, 0x8c, 0x06, 0xe5, 0x77, 0x89, 0xe8, 0xa2, 0xe9, 0xd1, 0xa4, 0x7c, 0xfd, - 0x75, 0x4a, 0x24, 0xa8, 0xc5, 0x1c, 0x31, 0x32, 0x9e, 0xe0, 0x19, 0x65, 0x13, 0xd3, 0xa0, 0x68, - 0xa0, 0xc8, 0x66, 0xb3, 0x85, 0x4f, 0x47, 0x32, 0x92, 0xe9, 0xab, 0x15, 0xb6, 0x6b, 0xae, 0xfd, - 0x0c, 0xdd, 0x4d, 0xad, 0xd9, 0xb9, 0x1c, 0xbb, 0x66, 0xd7, 0xcf, 0x6d, 0xe9, 0x0f, 0xb4, 0x35, - 0x3b, 0x95, 0x32, 0x9f, 0x5c, 0x4b, 0x2a, 0x6e, 0x79, 0x59, 0xf5, 0xbb, 0xec, 0x09, 0xd3, 0x59, - 0xd9, 0xf6, 0x35, 0xbb, 0x6e, 0x6e, 0x2a, 0xfe, 0x0c, 0x29, 0xd8, 0x72, 0xfe, 0xe7, 0x70, 0xeb, - 0x92, 0x7b, 0x3f, 0xb7, 0x85, 0x5f, 0x6a, 0x0b, 0x5d, 0x22, 0x47, 0xbe, 0x3a, 0x8e, 0xf7, 0x48, - 0xa2, 0x9f, 0xcb, 0x7b, 0x03, 0x1f, 0x1b, 0xa5, 0x13, 0xdc, 0x2b, 0xcd, 0xa6, 0x5b, 0xfa, 0xfb, - 0x4c, 0xb3, 0xef, 0x4c, 0xba, 0x8b, 0x8c, 0xdf, 0x99, 0x84, 0xd1, 0xb6, 0x57, 0xc3, 0xbe, 0x96, - 0x8b, 0x71, 0x46, 0x62, 0xfc, 0xc4, 0x62, 0x9c, 0x9f, 0x3a, 0xbf, 0xcb, 0x31, 0xe8, 0x54, 0xcd, - 0xdd, 0xf3, 0xb4, 0xbc, 0xf6, 0xea, 0x10, 0x94, 0x4e, 0xb5, 0xaf, 0x96, 0x98, 0xac, 0x34, 0xf8, - 0x9b, 0x4c, 0xff, 0xe1, 0xda, 0xbb, 0x9e, 0xa1, 0x9c, 0xcc, 0xe5, 0x27, 0x66, 0x57, 0xcb, 0x4d, - 0x66, 0x4a, 0x73, 0x8d, 0xa1, 0x9e, 0x1e, 0x5c, 0x31, 0xcc, 0xc8, 0x54, 0xae, 0x18, 0x66, 0xe6, - 0x13, 0xbf, 0x89, 0x56, 0x17, 0xdb, 0x6f, 0x51, 0xdd, 0xea, 0xa2, 0xe5, 0x9b, 0x4e, 0x18, 0x3d, - 0xc8, 0xc7, 0x30, 0xaa, 0xf2, 0x71, 0x2b, 0xfb, 0x76, 0x32, 0x25, 0xf8, 0x5c, 0x39, 0x5d, 0x20, - 0x2a, 0x7c, 0x47, 0x1a, 0x3e, 0xb0, 0xce, 0xb2, 0x69, 0x30, 0xca, 0xaf, 0xf6, 0x1d, 0x69, 0xf5, - 0x30, 0xc8, 0x52, 0xd9, 0xb8, 0x93, 0x64, 0xdf, 0x83, 0xf1, 0x38, 0xf3, 0xf6, 0xee, 0xbc, 0x46, - 0x98, 0x48, 0xc7, 0x9d, 0x24, 0x7c, 0x4f, 0x5e, 0x69, 0x60, 0x7d, 0x66, 0x61, 0xf7, 0x5d, 0xfc, - 0x63, 0x69, 0x65, 0x31, 0x5a, 0x9a, 0xca, 0xe3, 0xdd, 0x65, 0xf1, 0x1d, 0xd7, 0x53, 0x61, 0xaa, - 0xa1, 0xcd, 0x48, 0x66, 0xab, 0x86, 0x36, 0x2b, 0x19, 0x6d, 0x6c, 0xf2, 0xff, 0x42, 0x9a, 0x14, - 0x62, 0xa6, 0x17, 0x8c, 0x66, 0xa5, 0xf8, 0x5e, 0xcc, 0x2b, 0x4e, 0xb2, 0xae, 0x41, 0x29, 0x99, - 0xb7, 0x53, 0x9d, 0xc7, 0x72, 0x12, 0xac, 0xaa, 0x43, 0x5e, 0x6e, 0xc2, 0xcf, 0x2d, 0x69, 0x1f, - 0x37, 0xf9, 0x5e, 0xce, 0x6e, 0x94, 0xce, 0x3a, 0xdf, 0x60, 0x3e, 0x61, 0xa4, 0xf0, 0xd4, 0x4f, - 0xca, 0xa9, 0x14, 0xa1, 0xba, 0x66, 0x95, 0x91, 0xf5, 0xd3, 0x95, 0xd1, 0xa4, 0xb2, 0xb3, 0xad, - 0xbf, 0x69, 0x1e, 0x61, 0xbb, 0xc4, 0x7b, 0xef, 0x79, 0xfd, 0x4b, 0x7e, 0x01, 0x66, 0x73, 0xe2, - 0x57, 0x93, 0xab, 0x09, 0x4b, 0x6b, 0x76, 0x7c, 0x6b, 0x35, 0x41, 0x32, 0x73, 0x6b, 0xaf, 0xa3, - 0xdf, 0x80, 0x11, 0xdb, 0x21, 0x75, 0x17, 0xf7, 0xd0, 0x8d, 0xf6, 0x79, 0x0a, 0x69, 0x6d, 0xd9, - 0xcc, 0x0c, 0x0a, 0x41, 0x6a, 0x78, 0x16, 0x31, 0xa0, 0x19, 0xd7, 0x71, 0x19, 0x0c, 0xe7, 0xb2, - 0x19, 0xb2, 0xb5, 0x83, 0xcd, 0x85, 0x8c, 0xc0, 0x1b, 0x6a, 0x2e, 0xe4, 0x07, 0xe5, 0xc8, 0x6d, - 0xe6, 0x96, 0xd4, 0x91, 0xb2, 0x39, 0xe6, 0xc7, 0xe0, 0xc8, 0xe5, 0x78, 0x9f, 0x71, 0x4c, 0x85, - 0xd5, 0x20, 0x39, 0xe8, 0xdd, 0x57, 0x0f, 0x5b, 0x6e, 0xb9, 0x26, 0xd5, 0xbc, 0xd6, 0xbe, 0xbc, - 0x00, 0x1e, 0xb9, 0xed, 0x5b, 0x96, 0xdf, 0x53, 0x76, 0xfb, 0x8e, 0xbb, 0xe9, 0xaa, 0xfb, 0xaf, - 0x44, 0x64, 0x17, 0xa3, 0xa3, 0x1a, 0x7c, 0x2e, 0x07, 0x4e, 0x36, 0xd0, 0x11, 0x28, 0x09, 0xd5, - 0x0e, 0xa5, 0xd9, 0xa1, 0x63, 0x72, 0xf9, 0xf1, 0x79, 0x6c, 0x84, 0xde, 0x38, 0xc9, 0x3c, 0x4e, - 0xc4, 0xec, 0x10, 0xf3, 0xd8, 0x80, 0x9e, 0x6c, 0x1e, 0x27, 0x18, 0x9a, 0xf3, 0x38, 0xd9, 0xcc, - 0xe4, 0x49, 0x3f, 0x77, 0x54, 0x93, 0xcd, 0x54, 0xf3, 0x38, 0x9b, 0x63, 0x7e, 0x88, 0x94, 0x5c, - 0x8e, 0x6a, 0x1e, 0x9b, 0x1c, 0x73, 0xd0, 0x8f, 0x39, 0x8f, 0x93, 0x95, 0x98, 0xf3, 0xf8, 0x44, - 0xed, 0x53, 0xf3, 0x38, 0xbb, 0x7d, 0x27, 0x9e, 0xc7, 0x89, 0x98, 0x42, 0x46, 0x47, 0xb3, 0xe6, - 0x71, 0x12, 0x9f, 0xcf, 0xe3, 0x24, 0x34, 0x61, 0x5c, 0xe9, 0x32, 0x8f, 0x93, 0x94, 0x9f, 0x21, - 0xbf, 0x44, 0x3c, 0x94, 0xe3, 0xcc, 0xe4, 0xdc, 0x50, 0x2a, 0xe4, 0x21, 0x9a, 0xf7, 0x12, 0xf0, - 0xe3, 0xcd, 0xe6, 0xf3, 0x79, 0x4c, 0x71, 0x3e, 0xef, 0x4a, 0x21, 0x26, 0x9b, 0x6b, 0xda, 0xae, - 0xb2, 0xc3, 0xc1, 0x74, 0x69, 0xf0, 0x2e, 0x9b, 0x37, 0xcd, 0x2e, 0x7c, 0xbb, 0x45, 0xb3, 0xe9, - 0xc2, 0x57, 0x1d, 0x65, 0x92, 0x7c, 0x73, 0x49, 0xba, 0xcf, 0xef, 0xcf, 0xe5, 0x05, 0x47, 0x92, - 0x6e, 0x3e, 0x71, 0x38, 0x3a, 0x71, 0x4b, 0xd5, 0x21, 0x29, 0xd9, 0xd2, 0x93, 0xce, 0xf3, 0x75, - 0xa9, 0x3d, 0xa4, 0xc2, 0x60, 0x25, 0x3a, 0xad, 0xcf, 0xf5, 0xdc, 0x12, 0xb2, 0x8d, 0xb6, 0xdc, - 0x34, 0x5c, 0xb3, 0x03, 0xe7, 0xc5, 0xdb, 0xea, 0xc9, 0x35, 0x15, 0xd0, 0x47, 0xe7, 0x9a, 0x17, - 0xed, 0x47, 0x71, 0x4d, 0x53, 0x7f, 0x82, 0xd6, 0x2f, 0xf1, 0xda, 0xca, 0x7b, 0xec, 0xe7, 0x5b, - 0x52, 0xa6, 0x0c, 0x67, 0x25, 0x86, 0x8b, 0x3e, 0x62, 0x1f, 0x89, 0x1b, 0x3c, 0x09, 0xcc, 0x15, - 0x7e, 0x16, 0x3d, 0xf9, 0x04, 0x4a, 0x62, 0x79, 0x8b, 0x19, 0x64, 0x21, 0xe6, 0x0e, 0xdd, 0x82, - 0x34, 0xba, 0x1d, 0xa3, 0x05, 0xc7, 0x31, 0xb6, 0x1d, 0x47, 0x12, 0xf9, 0x96, 0x29, 0xb6, 0x1d, - 0x6e, 0x07, 0x9d, 0x30, 0xa2, 0xcd, 0xb4, 0x45, 0xc9, 0x6c, 0x8c, 0xf4, 0x8c, 0x30, 0xd1, 0x77, - 0xe7, 0xc9, 0x2a, 0xae, 0x6d, 0x26, 0xb8, 0x9b, 0xc9, 0x2d, 0x9b, 0x0d, 0x2e, 0x3d, 0x2b, 0xea, - 0x59, 0x8f, 0xd9, 0xa6, 0xbc, 0xba, 0xf3, 0x1b, 0xa5, 0x44, 0x74, 0xcc, 0xde, 0xe5, 0x89, 0xe8, - 0x43, 0x74, 0x03, 0xe0, 0xe6, 0xbf, 0x5e, 0x92, 0x49, 0x3e, 0x34, 0x22, 0x9f, 0xc2, 0xa8, 0x24, - 0xee, 0x2d, 0x90, 0x24, 0x35, 0x0a, 0x64, 0x09, 0x26, 0x8c, 0x57, 0x54, 0xea, 0x74, 0x93, 0xf5, - 0xb6, 0xaa, 0xcb, 0x38, 0x4f, 0x18, 0xaf, 0xa5, 0x14, 0x97, 0xac, 0x37, 0x54, 0xb9, 0x5c, 0xbe, - 0x0f, 0x63, 0x42, 0xa4, 0x5d, 0xa5, 0x91, 0x6f, 0x6f, 0x9b, 0xd1, 0x3c, 0x92, 0x3b, 0x4d, 0x37, - 0x5a, 0xf4, 0xbd, 0xc7, 0xee, 0x5e, 0x4f, 0xc1, 0xa4, 0x49, 0x76, 0xe7, 0xc9, 0x57, 0x98, 0x70, - 0x59, 0xa6, 0xc1, 0xa6, 0xd1, 0x33, 0x3f, 0x78, 0xe2, 0x7a, 0x7b, 0x3d, 0x58, 0x5e, 0x32, 0x59, - 0x26, 0xe9, 0xa4, 0xef, 0xc8, 0x57, 0x30, 0x57, 0xcb, 0x67, 0xde, 0x93, 0x49, 0xf7, 0xed, 0xa5, - 0x06, 0xe7, 0xd1, 0x7b, 0xe6, 0xa4, 0x6d, 0xef, 0xca, 0xf4, 0x0b, 0x1e, 0x49, 0x51, 0xda, 0xea, - 0x1b, 0x7e, 0xd0, 0xec, 0xcd, 0xb1, 0x62, 0x3a, 0xd2, 0x26, 0xc8, 0xa4, 0x30, 0xbe, 0x80, 0xb3, - 0xb5, 0x5c, 0xd6, 0xbd, 0x58, 0xf4, 0xd2, 0x24, 0xcf, 0xa1, 0x28, 0x4e, 0xd8, 0xee, 0xae, 0x3c, - 0x57, 0x71, 0x4d, 0x63, 0xfb, 0xd0, 0x56, 0x40, 0x1f, 0xd3, 0x00, 0xdd, 0xb5, 0x7b, 0x39, 0x2a, - 0x9b, 0xe8, 0xb2, 0xe7, 0xab, 0x70, 0xba, 0x96, 0x62, 0x95, 0x47, 0xd2, 0xeb, 0xfe, 0x67, 0x0a, - 0x7b, 0x7a, 0xcc, 0x76, 0xf5, 0xf0, 0x12, 0x1a, 0xbb, 0x47, 0xa3, 0x9d, 0xd5, 0x1e, 0x52, 0x92, - 0xef, 0x09, 0x24, 0xe2, 0xee, 0x6d, 0x46, 0x59, 0xd3, 0x28, 0xd3, 0x18, 0xb9, 0x1f, 0xef, 0xa7, - 0xf2, 0x2e, 0xa4, 0x67, 0xb5, 0x79, 0x1c, 0xee, 0xe0, 0x5a, 0x28, 0x5c, 0x96, 0x67, 0x63, 0x15, - 0x80, 0x43, 0x62, 0x53, 0x9d, 0xe6, 0xbd, 0x1c, 0x92, 0x2a, 0x3f, 0xfe, 0xf1, 0xe9, 0x21, 0x60, - 0x17, 0x53, 0xae, 0xec, 0x5d, 0x59, 0x70, 0x2b, 0xe8, 0x9a, 0xdf, 0x78, 0xa2, 0x5b, 0x41, 0xb5, - 0x94, 0xfc, 0x73, 0x66, 0xc2, 0x7c, 0xb1, 0xe2, 0x63, 0xd6, 0x7c, 0xdd, 0xf1, 0x4b, 0x4f, 0xca, - 0x3f, 0x37, 0x9b, 0x82, 0x0b, 0x0b, 0xd2, 0x1d, 0x69, 0x5b, 0xc4, 0x0a, 0x4d, 0xce, 0xb9, 0xa2, - 0x51, 0x66, 0x45, 0x24, 0x32, 0xcd, 0x8a, 0x7a, 0x43, 0xf3, 0x6d, 0xf9, 0xc4, 0xa6, 0xed, 0x16, - 0x7a, 0x41, 0x1f, 0xf8, 0x9c, 0x26, 0x76, 0x8c, 0x4d, 0x17, 0xf5, 0xf6, 0xdf, 0x9a, 0x12, 0x5e, - 0x3f, 0x86, 0xe0, 0x55, 0xa4, 0xe3, 0x74, 0x59, 0x2c, 0x4a, 0xdd, 0x19, 0xe9, 0x56, 0x81, 0x6c, - 0xc0, 0x99, 0x7b, 0x34, 0x12, 0x6b, 0x9c, 0x4d, 0xc3, 0x28, 0x70, 0x1b, 0x51, 0xd7, 0x8b, 0x41, - 0x79, 0x36, 0xc9, 0xa0, 0xd9, 0x7d, 0x9b, 0xf1, 0xab, 0x65, 0xf3, 0xeb, 0x4a, 0xd7, 0xc5, 0x45, - 0x56, 0xdc, 0x36, 0x9c, 0xa4, 0x89, 0xf9, 0x53, 0x7c, 0x98, 0x7b, 0xe0, 0xe4, 0x93, 0x96, 0xe2, - 0xc8, 0x27, 0xe2, 0xb4, 0x75, 0x03, 0x86, 0x38, 0x51, 0xee, 0x86, 0x3a, 0xae, 0xd3, 0x90, 0xdb, - 0x30, 0xaa, 0x5c, 0x68, 0x88, 0x51, 0x94, 0xdb, 0xae, 0xdb, 0x30, 0xca, 0x8f, 0x56, 0xc7, 0x27, - 0xf9, 0x10, 0x46, 0x95, 0xcf, 0xcd, 0x89, 0x77, 0xfa, 0x4f, 0x60, 0x42, 0xf7, 0xbe, 0x39, 0xb9, - 0x20, 0xbf, 0x8f, 0xd7, 0xb7, 0xf2, 0x96, 0x24, 0x9f, 0x7e, 0x26, 0x11, 0x10, 0x46, 0x88, 0x94, - 0x2f, 0x90, 0x12, 0x98, 0xdb, 0xfc, 0xd3, 0x29, 0x6a, 0xf2, 0xa1, 0x7c, 0xc9, 0xa4, 0x88, 0xd3, - 0x48, 0x5d, 0x64, 0x36, 0xc9, 0xc5, 0xfc, 0x22, 0xc4, 0x6a, 0x81, 0xed, 0xd9, 0xec, 0xe3, 0x5c, - 0x33, 0xf7, 0x16, 0x5d, 0x1e, 0x97, 0x4d, 0xd4, 0xd2, 0x52, 0x49, 0xee, 0xf2, 0x19, 0x5d, 0xcc, - 0xcf, 0x8b, 0x87, 0x83, 0x71, 0x1f, 0x4f, 0x81, 0xa9, 0xd2, 0xdc, 0xee, 0x75, 0xc9, 0xb3, 0x17, - 0x1f, 0x7b, 0xd3, 0xec, 0xba, 0x90, 0x75, 0x3b, 0x45, 0x8b, 0xf7, 0x99, 0xaf, 0x84, 0xdd, 0xaa, - 0x74, 0x62, 0x3c, 0x7e, 0x67, 0xf3, 0x5b, 0x76, 0x2e, 0xe3, 0x62, 0xbb, 0xe7, 0x58, 0xe4, 0xb1, - 0xfb, 0x05, 0xd4, 0x0e, 0x33, 0x23, 0x82, 0xe5, 0x33, 0xbb, 0xa6, 0xf9, 0x46, 0x64, 0x52, 0xaa, - 0x4d, 0xef, 0x09, 0x3e, 0x11, 0xcb, 0x4e, 0x03, 0xf8, 0x7a, 0x0f, 0x2e, 0x52, 0x12, 0x6f, 0xf4, - 0xc4, 0x53, 0xd7, 0xa4, 0xe7, 0xf8, 0x0e, 0x9b, 0x5d, 0x5f, 0x8f, 0xb4, 0x86, 0x19, 0x37, 0xd7, - 0xca, 0x43, 0x34, 0x9b, 0xa1, 0xe9, 0x21, 0xda, 0xb5, 0x0f, 0x79, 0xe2, 0xff, 0x0c, 0x2a, 0xb1, - 0x03, 0xc8, 0xc9, 0x06, 0x21, 0xdf, 0x31, 0x91, 0xa4, 0x24, 0x15, 0x92, 0x6e, 0x79, 0x7e, 0xe6, - 0x2e, 0xe7, 0x49, 0x58, 0x7f, 0x06, 0x23, 0x1c, 0xdb, 0x12, 0x09, 0x31, 0xf3, 0x52, 0x6b, 0x76, - 0xb1, 0xc3, 0x8a, 0x37, 0x73, 0xaf, 0x84, 0x51, 0x7a, 0xb4, 0x4f, 0xce, 0x48, 0xf9, 0x67, 0x24, - 0x18, 0x59, 0x5d, 0x86, 0xb7, 0xf7, 0xd5, 0x63, 0x39, 0x67, 0x5c, 0x4f, 0x3e, 0xa0, 0x4e, 0xfc, - 0x4e, 0x2c, 0x11, 0x40, 0x50, 0x7f, 0x9b, 0x9b, 0x2e, 0x4a, 0x3e, 0x72, 0xca, 0xc2, 0x50, 0x4e, - 0x51, 0x65, 0x59, 0x05, 0x83, 0xb3, 0xa3, 0x88, 0x1f, 0xb8, 0xd1, 0xf3, 0x45, 0x7b, 0x2d, 0x36, - 0x2b, 0xe8, 0x05, 0x92, 0x37, 0xc8, 0x42, 0x7b, 0x8d, 0x7c, 0x89, 0x4b, 0x89, 0x60, 0xbf, 0xe0, - 0xfb, 0x51, 0x18, 0x05, 0x4e, 0xbb, 0xd6, 0x08, 0xdc, 0x76, 0x94, 0xdb, 0xe9, 0xd8, 0x87, 0x3b, - 0x8b, 0x4c, 0x73, 0x29, 0x15, 0x01, 0xe6, 0xb3, 0x22, 0xdf, 0xa8, 0x67, 0x35, 0x59, 0x85, 0x5d, - 0x4e, 0x2e, 0x35, 0x19, 0x52, 0xfe, 0x55, 0x32, 0xad, 0xc3, 0x6c, 0x4e, 0xbc, 0x20, 0x75, 0x7b, - 0xdb, 0x3d, 0x9e, 0xd0, 0x5c, 0xf7, 0x8a, 0xc9, 0x57, 0x30, 0x93, 0x19, 0x50, 0x48, 0x59, 0xa0, - 0xbb, 0x85, 0x1b, 0xea, 0xc5, 0xfc, 0x09, 0x94, 0xf9, 0x83, 0x0e, 0xf4, 0x5b, 0x36, 0x62, 0xcb, - 0xc4, 0xcf, 0x7c, 0x72, 0x10, 0x92, 0xeb, 0x75, 0x3e, 0x9e, 0x7a, 0x6c, 0x3e, 0x8d, 0x41, 0x45, - 0x12, 0xa9, 0xdc, 0xd5, 0x87, 0x97, 0x55, 0xd8, 0xed, 0x2d, 0xd1, 0x16, 0xcc, 0xec, 0xd2, 0xc0, - 0x7d, 0xfc, 0x3c, 0xc9, 0x50, 0x4a, 0x26, 0xb3, 0xb4, 0x1b, 0xc7, 0xcf, 0x61, 0x76, 0xd1, 0x3f, - 0x68, 0x8b, 0x57, 0x7b, 0x06, 0x4f, 0x75, 0x15, 0x9f, 0x5d, 0xde, 0xdb, 0x97, 0x69, 0x2e, 0x3f, - 0xe9, 0xbe, 0x72, 0x61, 0xeb, 0x99, 0x97, 0x5f, 0xbd, 0x3d, 0x33, 0xe9, 0xb7, 0x71, 0x12, 0x66, - 0x65, 0xe1, 0xd7, 0x27, 0x61, 0x97, 0x2c, 0xfd, 0x39, 0x6f, 0xc0, 0x66, 0x73, 0x12, 0xef, 0x77, - 0xe1, 0x7a, 0x8c, 0xd6, 0x6e, 0xc8, 0xbd, 0xc5, 0xcc, 0x23, 0x9e, 0x70, 0x9a, 0xce, 0x4c, 0x32, - 0x9e, 0xd9, 0x4e, 0x2d, 0xaa, 0x42, 0xab, 0xd5, 0x45, 0xc5, 0x22, 0x7a, 0x58, 0x05, 0x86, 0x89, - 0x46, 0xfc, 0x09, 0x9d, 0xb6, 0xdb, 0x6a, 0x9d, 0x22, 0x46, 0xa5, 0xf6, 0x03, 0x18, 0xaf, 0xe9, - 0x95, 0x67, 0x54, 0x92, 0x3b, 0x29, 0xd4, 0x2b, 0xa0, 0xde, 0x6d, 0xef, 0xe2, 0x0b, 0xaa, 0x36, - 0x9e, 0x63, 0xf5, 0x22, 0xd7, 0x75, 0xc6, 0x48, 0x0a, 0xa7, 0x76, 0x81, 0xac, 0x9c, 0x8d, 0xca, - 0x75, 0x26, 0x3b, 0x8f, 0x5c, 0x9d, 0xa7, 0x9a, 0x49, 0xa6, 0xe4, 0x24, 0x56, 0xef, 0xdc, 0xb7, - 0xca, 0x27, 0xbe, 0x6b, 0x4e, 0x4f, 0xee, 0xe7, 0x13, 0xa7, 0xc1, 0xd3, 0xfd, 0x7c, 0x52, 0xc9, - 0xf5, 0x74, 0x3f, 0x9f, 0x8c, 0xcc, 0x79, 0xcb, 0xc8, 0x2b, 0xce, 0xd1, 0xd3, 0xc5, 0x18, 0xa1, - 0xd8, 0x64, 0xa4, 0x02, 0x7a, 0xa0, 0x07, 0xe7, 0xe0, 0x99, 0x7d, 0xba, 0xd8, 0x5a, 0x93, 0x41, - 0x39, 0x12, 0xa9, 0x80, 0xee, 0x42, 0x89, 0x27, 0x39, 0x88, 0xe3, 0x19, 0xc6, 0xae, 0x7f, 0xe9, - 0xdc, 0x0b, 0x5d, 0x06, 0xb5, 0x94, 0x8c, 0x04, 0xa7, 0x4c, 0x66, 0x39, 0x21, 0xe2, 0xba, 0x4c, - 0x55, 0x88, 0xe3, 0xbd, 0x29, 0xc3, 0x54, 0x2a, 0x04, 0xdc, 0xdc, 0xd9, 0x8c, 0x12, 0xa5, 0x52, - 0x8e, 0xeb, 0xd1, 0xe1, 0x54, 0x97, 0x32, 0x42, 0xc6, 0xcd, 0x9d, 0xcb, 0x2c, 0x13, 0x8c, 0x22, - 0x9e, 0xfe, 0x39, 0x3b, 0x69, 0x75, 0xfc, 0x90, 0xab, 0x0b, 0x8e, 0xac, 0xe6, 0xfa, 0x71, 0x50, - 0x45, 0xad, 0x54, 0x65, 0x28, 0xca, 0xc8, 0x94, 0xfd, 0x46, 0xc6, 0x5b, 0x0b, 0x03, 0x23, 0xf6, - 0x06, 0xeb, 0x9e, 0xb6, 0x9b, 0x3c, 0x94, 0x19, 0x63, 0x72, 0x6a, 0xea, 0xc5, 0x20, 0x77, 0x04, - 0x1f, 0xca, 0x1c, 0x31, 0xaf, 0x9a, 0xf1, 0x23, 0x38, 0x9f, 0x78, 0xc0, 0x61, 0x32, 0xbe, 0x9e, - 0xfd, 0xca, 0x23, 0x53, 0x3c, 0xf9, 0x3a, 0xfb, 0xa5, 0xf4, 0x43, 0x8f, 0xc4, 0xb8, 0x9f, 0x74, - 0xcd, 0x5b, 0x87, 0x49, 0x5c, 0x66, 0x64, 0xce, 0xf7, 0x38, 0x36, 0x8c, 0x09, 0x4e, 0x06, 0x29, - 0x4a, 0x96, 0xaa, 0xf7, 0xe3, 0xe3, 0xe2, 0x51, 0x30, 0xcf, 0x20, 0x3f, 0x67, 0xbe, 0x14, 0x46, - 0x60, 0xd6, 0x2e, 0x26, 0x12, 0xd3, 0x93, 0xef, 0xc3, 0xa9, 0xf8, 0xad, 0x30, 0x67, 0x91, 0x81, - 0xd6, 0xc5, 0x50, 0x76, 0x2a, 0x7e, 0x30, 0x7c, 0x72, 0xf2, 0x15, 0xb9, 0x15, 0xc5, 0xe4, 0x17, - 0x52, 0xcf, 0x5d, 0x8c, 0x3e, 0x1c, 0x67, 0x47, 0xd2, 0x64, 0x7b, 0xd2, 0xd1, 0x69, 0xe0, 0xe7, - 0x96, 0x1d, 0xf6, 0x50, 0xff, 0xdc, 0xba, 0x86, 0x66, 0x54, 0xea, 0x6f, 0x0e, 0x9f, 0x75, 0xb8, - 0x82, 0xa1, 0x52, 0xb6, 0x78, 0x70, 0xbc, 0x6c, 0xac, 0xfc, 0xb6, 0x27, 0x03, 0xac, 0xb4, 0xe0, - 0x72, 0xcf, 0xb8, 0x8f, 0xe4, 0xa6, 0xe1, 0xe2, 0xd2, 0x3b, 0x42, 0x64, 0x97, 0x93, 0xc7, 0x74, - 0x56, 0xf8, 0x44, 0xb5, 0xcf, 0x76, 0x89, 0xe4, 0xa8, 0xf6, 0xd9, 0xae, 0xf1, 0x17, 0x3f, 0xc7, - 0x34, 0x4c, 0x62, 0x8f, 0xc2, 0xf0, 0x47, 0xd4, 0xe3, 0x01, 0xa1, 0xbb, 0x5e, 0xfb, 0x5c, 0x36, - 0x2f, 0x45, 0x53, 0x84, 0x78, 0xa6, 0xb9, 0x28, 0x4e, 0x62, 0x79, 0xcc, 0x7b, 0x33, 0xe9, 0xe2, - 0x5a, 0x7d, 0x91, 0x4f, 0xc0, 0x13, 0xb7, 0x3c, 0x07, 0xbe, 0xb0, 0xf4, 0x93, 0xff, 0x7e, 0xb1, - 0xf0, 0x93, 0x9f, 0x5e, 0x2c, 0xfc, 0xa7, 0x9f, 0x5e, 0x2c, 0xfc, 0xb7, 0x9f, 0x5e, 0x2c, 0x7c, - 0x39, 0x7f, 0xbc, 0xb0, 0xc4, 0x3c, 0x71, 0xe2, 0x4d, 0xce, 0x6e, 0x08, 0xff, 0xbb, 0xf3, 0xff, - 0x02, 0x00, 0x00, 0xff, 0xff, 0x8f, 0xb6, 0x8e, 0x56, 0x77, 0xeb, 0x00, 0x00, + 0x7a, 0xc8, 0x4e, 0x2e, 0xad, 0x01, 0x5d, 0x5a, 0xbb, 0x30, 0x6d, 0x9c, 0xd9, 0x8e, 0xb3, 0x79, + 0x59, 0x00, 0x22, 0x47, 0xed, 0x9a, 0xbf, 0x27, 0x52, 0xe9, 0x16, 0xcb, 0x05, 0x5b, 0x83, 0x5a, + 0x77, 0x61, 0x26, 0xc1, 0x57, 0x58, 0xe6, 0xbf, 0x0b, 0xea, 0x91, 0x3c, 0x32, 0xee, 0x5f, 0x38, + 0xfd, 0xb3, 0xc3, 0xca, 0x04, 0x53, 0xeb, 0x6f, 0xc4, 0x79, 0x0a, 0xe4, 0x5f, 0xd6, 0xba, 0x7e, + 0xb7, 0x50, 0x6d, 0xe9, 0xc1, 0x83, 0xc8, 0x6d, 0x18, 0xe2, 0x90, 0x44, 0x34, 0x70, 0x1d, 0x5b, + 0xac, 0x0b, 0x02, 0xd1, 0x9a, 0xc1, 0x27, 0xbd, 0xf8, 0xa3, 0x1a, 0x87, 0xa0, 0xb0, 0x76, 0x78, + 0x76, 0x9c, 0x18, 0xac, 0x22, 0x8e, 0x0f, 0x54, 0xe3, 0x50, 0x19, 0xd2, 0xc9, 0x44, 0xe2, 0x79, + 0xfe, 0xb3, 0x16, 0x6d, 0xf2, 0xb4, 0x86, 0x0b, 0xe3, 0xc2, 0xc9, 0x64, 0xc0, 0x61, 0x0c, 0x90, + 0xcc, 0xfa, 0x04, 0x66, 0x98, 0xb6, 0x10, 0x24, 0xeb, 0xc3, 0x9c, 0x18, 0x0c, 0x66, 0x7a, 0xee, + 0x3b, 0x0c, 0x84, 0x9e, 0xfb, 0xa2, 0xd0, 0x5a, 0x83, 0xb3, 0xdc, 0x32, 0xa9, 0x77, 0x29, 0xbe, + 0x07, 0x18, 0xc4, 0xdf, 0x89, 0x07, 0xa1, 0x19, 0xbd, 0xe7, 0x78, 0xd6, 0xc7, 0xf8, 0xe2, 0x48, + 0x4c, 0x54, 0xd7, 0xf7, 0x62, 0x33, 0xe4, 0xf1, 0x9e, 0x28, 0xff, 0x55, 0x38, 0x5f, 0x6d, 0xb7, + 0xa9, 0xd7, 0x8c, 0x09, 0xb7, 0x03, 0xe7, 0x98, 0x01, 0x24, 0x48, 0x15, 0x06, 0x11, 0x5b, 0x5d, + 0xd0, 0x8a, 0xe6, 0x66, 0x34, 0x07, 0xf1, 0x44, 0x78, 0x58, 0xac, 0x80, 0x53, 0x5a, 0x4d, 0x98, + 0xad, 0x75, 0x1e, 0x1d, 0xb8, 0x11, 0xfa, 0xfb, 0x63, 0x10, 0x16, 0x59, 0xf7, 0xaa, 0x4c, 0x68, + 0xc6, 0x85, 0x71, 0x2d, 0x7e, 0x99, 0x82, 0x4f, 0x06, 0x44, 0x60, 0x96, 0xa7, 0xb7, 0x6f, 0xc4, + 0xa4, 0x68, 0x82, 0xe1, 0xb5, 0x60, 0xb1, 0x48, 0x7a, 0x66, 0x4d, 0xc1, 0x69, 0xfd, 0x42, 0x8a, + 0xcf, 0x90, 0x19, 0x98, 0x32, 0x2f, 0x9a, 0x38, 0xf8, 0x6b, 0x98, 0xe6, 0x86, 0x70, 0x1e, 0xde, + 0x7d, 0x3e, 0x8e, 0x64, 0x5e, 0xdc, 0x9d, 0x4f, 0x3c, 0x34, 0x40, 0xff, 0x63, 0x95, 0xb8, 0x63, + 0x77, 0x9e, 0xbf, 0x1a, 0x7d, 0x3a, 0x6f, 0x5c, 0x95, 0x16, 0x77, 0xe7, 0x17, 0x86, 0x45, 0x98, + 0x5c, 0xc6, 0x9d, 0x0f, 0xff, 0xb7, 0xc2, 0x7d, 0x1e, 0x03, 0x15, 0xac, 0x50, 0x07, 0x1f, 0x15, + 0x65, 0x3f, 0xf7, 0x9e, 0x84, 0xa2, 0x8a, 0x83, 0x59, 0x74, 0x9b, 0xd6, 0xef, 0x17, 0xe0, 0x1a, + 0x57, 0xc8, 0xb2, 0xe9, 0xf0, 0xd6, 0x29, 0x87, 0x98, 0xbc, 0x07, 0x83, 0xa1, 0xe6, 0x7d, 0x61, + 0x89, 0x96, 0x77, 0xe3, 0xc4, 0x09, 0x48, 0x15, 0xc6, 0xf5, 0xb7, 0x33, 0xc7, 0x0b, 0xb1, 0x67, + 0x8f, 0x1d, 0x3c, 0x76, 0xd4, 0x7b, 0x9a, 0x27, 0x70, 0x6e, 0xf9, 0x1b, 0x36, 0x21, 0xc4, 0x0e, + 0x25, 0x4e, 0x0f, 0xf1, 0x73, 0xe2, 0x53, 0xdb, 0x62, 0xc6, 0x98, 0x47, 0xfb, 0x24, 0x98, 0x9d, + 0x93, 0xe5, 0x26, 0xa7, 0x54, 0xf8, 0x51, 0xdb, 0x80, 0x59, 0x7f, 0x54, 0x80, 0xf3, 0xd9, 0xb5, + 0x89, 0x85, 0x65, 0x15, 0x4e, 0x2f, 0x3a, 0x9e, 0xef, 0xb9, 0x0d, 0xa7, 0x55, 0x6b, 0xec, 0xd3, + 0x66, 0x47, 0x05, 0xd3, 0x55, 0xab, 0xcc, 0x1e, 0xf5, 0x24, 0xb9, 0x44, 0xb1, 0xd3, 0x54, 0xec, + 0x84, 0x88, 0xcf, 0x2f, 0xf8, 0xda, 0xdb, 0xa2, 0x81, 0xe2, 0xc7, 0x5b, 0x96, 0x53, 0x4a, 0x6e, + 0x49, 0x8b, 0x7f, 0x73, 0xc7, 0x73, 0x23, 0x45, 0xc4, 0x4d, 0x3d, 0x59, 0x45, 0xd6, 0x7f, 0x2c, + 0xc0, 0x59, 0xcc, 0x9f, 0x65, 0x64, 0xe4, 0x8c, 0x63, 0x4a, 0xcb, 0xb0, 0xc8, 0x05, 0xe3, 0x39, + 0x89, 0x81, 0x6d, 0xc6, 0x47, 0x26, 0x6f, 0xc1, 0x40, 0x4d, 0x7a, 0x83, 0x4d, 0x26, 0x72, 0x29, + 0x0b, 0x0a, 0x56, 0x6e, 0x23, 0x16, 0x3b, 0xc3, 0x2f, 0xd1, 0xb0, 0x41, 0x3d, 0x4c, 0x7a, 0xcd, + 0x2d, 0x0f, 0x1a, 0x24, 0x0e, 0xf7, 0x34, 0x90, 0x17, 0xee, 0x69, 0xd0, 0x0c, 0xf7, 0x64, 0x3d, + 0xe5, 0xd9, 0xb3, 0x92, 0x1d, 0x12, 0x83, 0xf4, 0x71, 0x2a, 0x47, 0x36, 0xdf, 0x07, 0xce, 0x64, + 0xf5, 0x8c, 0x29, 0xe9, 0x89, 0xf4, 0xd7, 0xf9, 0x31, 0x9c, 0xb7, 0xe0, 0x35, 0x03, 0xb7, 0xda, + 0x6a, 0xf9, 0xcf, 0x68, 0x73, 0x2b, 0xf0, 0x0f, 0xfc, 0xc8, 0xc8, 0x1e, 0x24, 0x92, 0xc4, 0xc7, + 0x77, 0x3a, 0x62, 0x56, 0x26, 0xc0, 0xd6, 0x5f, 0x81, 0xab, 0x3d, 0x38, 0x8a, 0x4e, 0xd5, 0xe0, + 0xb4, 0x93, 0x28, 0x93, 0x6e, 0x3d, 0x57, 0xb3, 0xfa, 0x95, 0x64, 0x14, 0xda, 0x69, 0xfa, 0xeb, + 0xdb, 0x46, 0x5e, 0x69, 0x52, 0x86, 0xe9, 0x2d, 0x7b, 0x73, 0x69, 0x67, 0x71, 0xbb, 0xbe, 0xfd, + 0xc5, 0xd6, 0x72, 0x7d, 0x67, 0xe3, 0xc1, 0xc6, 0xe6, 0xc3, 0x0d, 0x1e, 0x04, 0xdd, 0x28, 0xd9, + 0x5e, 0xae, 0xae, 0x97, 0x0a, 0x64, 0x1a, 0x4a, 0x06, 0x78, 0x79, 0x67, 0xa1, 0x54, 0xbc, 0xfe, + 0xb5, 0x91, 0x2f, 0x99, 0x9c, 0x87, 0x72, 0x6d, 0x67, 0x6b, 0x6b, 0xd3, 0x56, 0x5c, 0xf5, 0x10, + 0xec, 0x33, 0x70, 0xda, 0x28, 0xbd, 0x6b, 0x2f, 0x2f, 0x97, 0x0a, 0xac, 0x29, 0x06, 0x78, 0xcb, + 0x5e, 0x5e, 0x5f, 0xdd, 0x59, 0x2f, 0x15, 0xaf, 0xd7, 0xf5, 0x37, 0x6c, 0xe4, 0x1c, 0xcc, 0x2e, + 0x2d, 0xef, 0xae, 0x2e, 0x2e, 0x67, 0xf1, 0x9e, 0x86, 0x92, 0x5e, 0xb8, 0xbd, 0xb9, 0xbd, 0xc5, + 0x59, 0xeb, 0xd0, 0x87, 0xcb, 0x0b, 0xd5, 0x9d, 0xed, 0x95, 0x8d, 0x52, 0xbf, 0x35, 0x30, 0x52, + 0x2c, 0x15, 0xaf, 0xff, 0xd0, 0x78, 0xe0, 0xc6, 0x9a, 0x2f, 0xd0, 0x77, 0x6a, 0xd5, 0x7b, 0xf9, + 0x55, 0xf0, 0xd2, 0xf5, 0xbb, 0xd5, 0x52, 0x81, 0x5c, 0x80, 0xb3, 0x06, 0x74, 0xab, 0x5a, 0xab, + 0x3d, 0xdc, 0xb4, 0x97, 0xd6, 0x96, 0x6b, 0xb5, 0x52, 0xf1, 0xfa, 0xae, 0x11, 0xe2, 0x8e, 0xd5, + 0xb0, 0x7e, 0xb7, 0x5a, 0xb7, 0x97, 0x3f, 0xdb, 0x59, 0xb5, 0x97, 0x97, 0xd2, 0x35, 0x18, 0xa5, + 0x5f, 0x2c, 0xd7, 0x4a, 0x05, 0x32, 0x05, 0xa7, 0x0c, 0xe8, 0xc6, 0x66, 0xa9, 0x78, 0xfd, 0x75, + 0x11, 0x05, 0x8d, 0x4c, 0x02, 0x2c, 0x2d, 0xd7, 0x16, 0x97, 0x37, 0x96, 0x56, 0x37, 0xee, 0x95, + 0xfa, 0xc8, 0x04, 0x8c, 0x56, 0xd5, 0xcf, 0xc2, 0xf5, 0x0f, 0xe0, 0x54, 0xe2, 0x78, 0xcf, 0x30, + 0xd4, 0xc1, 0xb8, 0xd4, 0x87, 0xe2, 0x97, 0x3f, 0xd1, 0xc6, 0xca, 0x4f, 0xea, 0xa5, 0xc2, 0xf5, + 0x05, 0x99, 0x62, 0x57, 0xfb, 0xce, 0xc9, 0x18, 0x0c, 0x2f, 0x2d, 0xdf, 0xad, 0xee, 0xac, 0x6d, + 0x97, 0xfa, 0xd8, 0x8f, 0x45, 0x7b, 0xb9, 0xba, 0xbd, 0xbc, 0x54, 0x2a, 0x90, 0x51, 0x18, 0xac, + 0x6d, 0x57, 0xb7, 0x97, 0x4b, 0x45, 0x32, 0x02, 0x03, 0x3b, 0xb5, 0x65, 0xbb, 0xd4, 0x3f, 0xff, + 0x6f, 0xfe, 0x61, 0x81, 0x1b, 0x1a, 0xe5, 0x63, 0xa9, 0xaf, 0xb5, 0x03, 0xa5, 0x58, 0xf2, 0x44, + 0x3e, 0xd1, 0xdc, 0xd3, 0x23, 0x6a, 0x01, 0x73, 0x5d, 0x6e, 0x5e, 0x10, 0xe1, 0x5a, 0xe1, 0x56, + 0x81, 0xd8, 0xe8, 0xa9, 0x92, 0x38, 0x5f, 0x29, 0xce, 0xd9, 0x47, 0xe0, 0xb9, 0x0b, 0x5d, 0x8f, + 0x65, 0xe4, 0x97, 0xc0, 0xd2, 0x79, 0xe6, 0x9c, 0x42, 0xbe, 0x7b, 0xbc, 0xd3, 0x86, 0xac, 0xf3, + 0xf5, 0xe3, 0xa1, 0x93, 0xfb, 0x30, 0xc1, 0x74, 0x73, 0x85, 0x46, 0xce, 0x25, 0x09, 0xb5, 0x23, + 0xc1, 0xdc, 0xf9, 0xec, 0x42, 0x95, 0xf2, 0x67, 0x1c, 0x3b, 0xc2, 0x0f, 0xd7, 0x21, 0x91, 0x91, + 0x32, 0x24, 0x84, 0xaf, 0xf8, 0x73, 0xa7, 0x13, 0xe0, 0xdd, 0xdb, 0xb7, 0x0a, 0xa4, 0x86, 0x61, + 0xea, 0x0c, 0x25, 0x9f, 0xc8, 0xd7, 0x7b, 0x69, 0xed, 0x9f, 0xb7, 0xa6, 0xa2, 0x12, 0x74, 0xe6, + 0x9c, 0x0e, 0x36, 0x80, 0xa4, 0x75, 0x67, 0x72, 0x29, 0x9e, 0x07, 0xd9, 0x6a, 0xf5, 0xdc, 0x99, + 0x94, 0x73, 0xe3, 0x32, 0xd3, 0x9e, 0xc8, 0x32, 0x4c, 0x8a, 0x67, 0xf0, 0x42, 0x9b, 0x27, 0xdd, + 0xce, 0x03, 0xb9, 0x6c, 0xee, 0xa1, 0x9c, 0xd4, 0x89, 0x80, 0xcc, 0xc5, 0xfd, 0x48, 0x1e, 0x13, + 0xe6, 0xce, 0x65, 0x96, 0x89, 0xfe, 0xdd, 0x85, 0x49, 0xf3, 0x70, 0x41, 0xe4, 0x00, 0x65, 0x9e, + 0x39, 0x72, 0x1b, 0x54, 0x87, 0xd9, 0x75, 0xc7, 0xc5, 0xfb, 0x12, 0xe1, 0x41, 0x27, 0x9d, 0xd4, + 0x48, 0xa5, 0x8b, 0xd7, 0x5a, 0x8d, 0x7a, 0x4d, 0x35, 0x08, 0x79, 0xe1, 0xfb, 0xf1, 0xb3, 0xa9, + 0x49, 0x1d, 0xd9, 0x74, 0x20, 0x24, 0x96, 0x99, 0x74, 0x39, 0xcb, 0x27, 0x74, 0x2e, 0xcf, 0x8d, + 0x99, 0xac, 0xa3, 0x92, 0x9e, 0xe0, 0xa8, 0xcd, 0x89, 0x13, 0xb3, 0x2b, 0x63, 0x30, 0x06, 0x2d, + 0x13, 0xbe, 0x28, 0x0c, 0x49, 0x8e, 0xe0, 0x72, 0x99, 0xdd, 0x2a, 0x90, 0xaf, 0xf1, 0xab, 0xce, + 0x64, 0xf7, 0xd0, 0x8d, 0xf6, 0x85, 0xf6, 0x73, 0x2e, 0x93, 0x81, 0xf8, 0x50, 0xba, 0x70, 0xb7, + 0x61, 0x3a, 0xcb, 0x73, 0x5a, 0x09, 0xb4, 0x8b, 0x5b, 0x75, 0xee, 0x2c, 0xb0, 0xd9, 0x51, 0xa3, + 0x99, 0x3f, 0x48, 0x5d, 0x1c, 0x77, 0x73, 0x79, 0x7e, 0x04, 0x93, 0x6c, 0x96, 0x3c, 0xa0, 0xb4, + 0x5d, 0x6d, 0xb9, 0x4f, 0x69, 0x48, 0x64, 0x8c, 0x61, 0x05, 0xca, 0xa3, 0xbd, 0x56, 0x20, 0xdf, + 0x81, 0xb1, 0x87, 0x4e, 0xd4, 0xd8, 0x17, 0xb1, 0x36, 0x65, 0x28, 0x4e, 0x84, 0xcd, 0xc9, 0x5f, + 0x58, 0x78, 0xab, 0x40, 0xbe, 0x0f, 0xc3, 0xf7, 0x68, 0x84, 0xaf, 0xa7, 0x2f, 0x2b, 0x47, 0x3f, + 0x6e, 0x9f, 0x5c, 0xf5, 0xd4, 0x13, 0x21, 0xd9, 0xe0, 0xa4, 0x31, 0x97, 0xdc, 0x04, 0xe0, 0x0b, + 0x02, 0x72, 0x48, 0x16, 0xcf, 0xa5, 0x9a, 0x4d, 0xee, 0x31, 0xe5, 0xa1, 0x45, 0x23, 0x7a, 0xdc, + 0x2a, 0xf3, 0x64, 0xb4, 0x06, 0x93, 0x2a, 0x4b, 0xd2, 0x06, 0x86, 0x44, 0xb1, 0x12, 0xcc, 0xc2, + 0x13, 0x70, 0xfb, 0x80, 0x7d, 0x15, 0x3c, 0x45, 0x30, 0xc6, 0xce, 0xc0, 0x95, 0x74, 0x56, 0x0f, + 0xc0, 0xa1, 0x2f, 0xa1, 0x52, 0x88, 0x1c, 0x4d, 0xa3, 0x5d, 0xf1, 0xc3, 0xc8, 0xa4, 0x55, 0x90, + 0x6c, 0xda, 0x5f, 0x84, 0x39, 0xbd, 0x5e, 0x33, 0xd8, 0x73, 0xbc, 0xe6, 0xe6, 0xc5, 0x90, 0x9e, + 0xbb, 0xdc, 0x05, 0x43, 0x9c, 0xdf, 0xfa, 0x7f, 0xa3, 0x58, 0xc0, 0xe5, 0x64, 0x09, 0xa6, 0x64, + 0x5d, 0x9b, 0x6d, 0xea, 0xd5, 0x6a, 0x2b, 0x98, 0x11, 0x47, 0xba, 0x95, 0x68, 0x30, 0xc9, 0x9d, + 0xa4, 0x8b, 0xd8, 0xd6, 0x67, 0xc4, 0xc8, 0x20, 0xdd, 0x22, 0x67, 0xc4, 0x5b, 0x5f, 0x66, 0x14, + 0xe2, 0x07, 0xdc, 0xa8, 0x64, 0x28, 0xff, 0xbb, 0xf3, 0xa4, 0xcb, 0x01, 0x68, 0x2e, 0xe7, 0x08, + 0x71, 0xab, 0x40, 0xbe, 0x00, 0x92, 0x3e, 0x92, 0x28, 0x11, 0xe6, 0x1e, 0xbf, 0x94, 0x08, 0xbb, + 0x9c, 0x67, 0xee, 0xc1, 0x8c, 0x8a, 0x90, 0xa3, 0xd5, 0x3a, 0x4f, 0x72, 0x5a, 0x93, 0xd7, 0x4a, + 0xf2, 0x09, 0x4c, 0x89, 0x49, 0xab, 0x17, 0x90, 0x92, 0x5a, 0x7f, 0xc4, 0xa9, 0x24, 0x77, 0x9e, + 0xde, 0x87, 0x99, 0x5a, 0x42, 0x62, 0xdc, 0xd3, 0xfe, 0xac, 0xc9, 0x02, 0x81, 0x35, 0x1a, 0x71, + 0x91, 0x65, 0xf3, 0x7a, 0x00, 0x84, 0x1b, 0x85, 0x24, 0xbb, 0xa7, 0x2e, 0x7d, 0x46, 0x2e, 0x24, + 0x9a, 0xce, 0x80, 0x88, 0x86, 0x0b, 0x58, 0x6e, 0xcf, 0xb6, 0x79, 0x82, 0x6b, 0x84, 0x1a, 0xf7, + 0xe8, 0x97, 0x0c, 0x02, 0xe3, 0x2a, 0x5e, 0x0c, 0xc0, 0xd9, 0x5c, 0x0c, 0xf2, 0x2b, 0x18, 0x9a, + 0xb6, 0xfb, 0xb1, 0x8a, 0x7c, 0x27, 0xeb, 0xf4, 0x9b, 0x73, 0x30, 0x9c, 0x7b, 0xeb, 0x78, 0xc8, + 0xea, 0x20, 0x3b, 0x71, 0x8f, 0x46, 0x5b, 0xad, 0xce, 0x9e, 0x8b, 0xa9, 0x4f, 0x89, 0x32, 0x1a, + 0x29, 0x90, 0x98, 0x97, 0x32, 0x22, 0x5c, 0x5c, 0x50, 0xa3, 0x3f, 0x22, 0xab, 0x50, 0xe2, 0xeb, + 0xbf, 0xc6, 0xe2, 0x42, 0x8a, 0x85, 0x40, 0x71, 0x02, 0xe7, 0x20, 0xcc, 0x1d, 0xad, 0x9b, 0xdc, + 0x71, 0x89, 0xc8, 0x6f, 0x52, 0x57, 0x30, 0xa7, 0x0c, 0x98, 0x0a, 0xd7, 0xcf, 0x46, 0xc4, 0xa6, + 0x21, 0x8d, 0x64, 0x0c, 0x1c, 0x9e, 0xf8, 0xf6, 0x4a, 0xbc, 0xd9, 0xa7, 0x4b, 0xe3, 0x4f, 0x3f, + 0x11, 0xaf, 0x6d, 0xf7, 0x0e, 0x51, 0xc9, 0x80, 0x33, 0x98, 0xbe, 0x6e, 0xe8, 0x24, 0x27, 0xe3, + 0xfb, 0x36, 0xee, 0x41, 0x18, 0xf7, 0x67, 0x26, 0x6e, 0x1b, 0xfb, 0x2d, 0xa9, 0x26, 0x34, 0xaa, + 0xdd, 0x79, 0x5c, 0xd2, 0xd8, 0x26, 0xc9, 0x54, 0xd8, 0x4e, 0x10, 0x50, 0x8f, 0x13, 0xe7, 0xe9, + 0x1b, 0x59, 0xd4, 0x1f, 0xe3, 0xd2, 0xa3, 0x51, 0xf3, 0x07, 0x81, 0xbd, 0x58, 0xf0, 0x44, 0x4d, + 0xb7, 0x0a, 0xe4, 0x3d, 0x18, 0x11, 0x6d, 0x64, 0x44, 0x46, 0xa3, 0xc3, 0x2e, 0xad, 0x46, 0x4a, + 0xe0, 0x42, 0xc2, 0x36, 0x9b, 0x38, 0x79, 0xa3, 0xcf, 0xdb, 0xfc, 0x1e, 0xdb, 0x6c, 0x9b, 0x2f, + 0x42, 0xb9, 0x28, 0x77, 0x5d, 0xa4, 0x2c, 0xab, 0x58, 0x31, 0x12, 0xd4, 0x63, 0x7b, 0xe4, 0x4c, + 0x98, 0xde, 0x8c, 0x01, 0x17, 0x55, 0xdc, 0x34, 0xa5, 0x37, 0x1b, 0xe0, 0x5e, 0x7b, 0xed, 0x2a, + 0x94, 0xaa, 0x0d, 0xdc, 0x09, 0x6a, 0xf4, 0xc0, 0x69, 0xef, 0xfb, 0x01, 0x55, 0x87, 0x96, 0x64, + 0x81, 0xe4, 0x35, 0xa3, 0x34, 0x0b, 0x51, 0xb0, 0x46, 0x1d, 0x8c, 0x4a, 0x3d, 0xab, 0x54, 0x8b, + 0x44, 0x51, 0x36, 0x45, 0x97, 0x43, 0xca, 0xf4, 0x22, 0x3b, 0x56, 0xb5, 0x5e, 0x8e, 0xcd, 0x07, + 0xb8, 0x60, 0x28, 0xe4, 0x50, 0xed, 0x10, 0x0a, 0xa4, 0x8e, 0x73, 0xf2, 0x6d, 0x90, 0x42, 0xad, + 0xca, 0x7b, 0xe3, 0x58, 0x2c, 0x79, 0xd4, 0x79, 0xd5, 0x7f, 0x0f, 0x26, 0x97, 0xd9, 0x82, 0xde, + 0x69, 0xba, 0x3c, 0x12, 0x3f, 0x31, 0x43, 0xab, 0xe7, 0x12, 0xae, 0xc8, 0xdc, 0x68, 0x48, 0x2a, + 0x8e, 0xfe, 0x72, 0x4f, 0xd1, 0x60, 0x72, 0x3c, 0xa6, 0x25, 0x5b, 0x91, 0x0c, 0x01, 0x8f, 0xe6, + 0xe2, 0xac, 0x3f, 0xcb, 0x35, 0xc2, 0x6a, 0xbb, 0xdd, 0x92, 0x26, 0x69, 0x7e, 0xf7, 0x7e, 0xd5, + 0x38, 0x42, 0xa6, 0xca, 0x25, 0xef, 0xb4, 0xd2, 0xf8, 0xb9, 0x96, 0xab, 0x38, 0x87, 0x67, 0x4e, + 0x79, 0xaf, 0xb9, 0xa8, 0x62, 0x67, 0x57, 0x5b, 0xad, 0x14, 0x71, 0x48, 0xde, 0x34, 0xb9, 0x67, + 0xe1, 0xf4, 0xaa, 0x01, 0x8f, 0xe8, 0x5c, 0xeb, 0xaa, 0xb6, 0xdb, 0x7c, 0xb1, 0xbc, 0xa8, 0x16, + 0x0c, 0xb3, 0x20, 0x7d, 0x44, 0x4f, 0x96, 0x8b, 0xb5, 0xfd, 0x3e, 0x4e, 0xb3, 0x38, 0xa1, 0x31, + 0xd1, 0x0f, 0xbc, 0xc9, 0x7c, 0xce, 0x4a, 0x09, 0x4b, 0x14, 0xaa, 0x7d, 0xe2, 0x14, 0xaa, 0x3e, + 0x71, 0x76, 0x64, 0x65, 0x99, 0x49, 0xc0, 0x25, 0xbf, 0x8b, 0x79, 0xc5, 0xca, 0x52, 0x5a, 0x4a, + 0x26, 0x8d, 0x57, 0x5d, 0x4e, 0x67, 0x93, 0x37, 0xbb, 0x9c, 0x9b, 0x6d, 0xfe, 0x3e, 0x94, 0x92, + 0xf9, 0xaa, 0x15, 0xd3, 0x9c, 0x44, 0xd6, 0xb9, 0x63, 0x72, 0x17, 0xa6, 0xf5, 0x11, 0x55, 0xfd, + 0xce, 0x5b, 0xfd, 0xf3, 0xf8, 0x6c, 0xc3, 0x4c, 0x66, 0x7a, 0x69, 0xb5, 0xc5, 0x76, 0x4b, 0x3e, + 0x9d, 0xcb, 0x95, 0xc2, 0x99, 0xec, 0x0c, 0xf3, 0xe4, 0x35, 0xf3, 0xe0, 0x9f, 0x9d, 0x6f, 0x7b, + 0xee, 0x6a, 0x0f, 0x2c, 0x21, 0xd0, 0xaf, 0x71, 0x07, 0x4c, 0xd5, 0x71, 0x59, 0x33, 0x05, 0xe4, + 0x54, 0x60, 0x75, 0x43, 0x51, 0x73, 0x60, 0x3a, 0xa3, 0x38, 0x5f, 0xc4, 0x57, 0xf2, 0x79, 0xc6, + 0x13, 0x6b, 0x57, 0x86, 0x88, 0xce, 0x95, 0x4c, 0xd7, 0x4c, 0xe4, 0x5d, 0xce, 0x92, 0x73, 0x6a, + 0x3e, 0x1c, 0xbf, 0xc9, 0x79, 0xdc, 0x9a, 0xca, 0x6c, 0x63, 0xa4, 0x09, 0x4f, 0x9a, 0x6d, 0xb2, + 0xd2, 0x9b, 0x2b, 0x31, 0x74, 0x4b, 0xa0, 0xcf, 0x77, 0xe3, 0xaf, 0xb8, 0x1d, 0xc7, 0xac, 0x42, + 0xb7, 0xe3, 0x64, 0xf2, 0xbf, 0x94, 0x8f, 0xa0, 0x33, 0x77, 0xf8, 0xa5, 0x6d, 0x22, 0xcf, 0x39, + 0xd1, 0x8f, 0x4a, 0xd9, 0x39, 0xd0, 0xd5, 0xdc, 0xc8, 0x44, 0xd1, 0xab, 0x78, 0x28, 0xbf, 0xc1, + 0x1c, 0x29, 0x75, 0x49, 0x02, 0xdf, 0x5d, 0x4d, 0xd9, 0x84, 0x72, 0x3c, 0x98, 0x89, 0x0e, 0x9c, + 0x70, 0x28, 0xa5, 0x30, 0xce, 0xe6, 0xa6, 0x7e, 0x27, 0x6f, 0xa4, 0xbe, 0xf4, 0x1c, 0xc1, 0x74, + 0xad, 0x82, 0xaf, 0xe7, 0x5a, 0xc8, 0xe9, 0x73, 0xb1, 0x11, 0x57, 0xcf, 0x12, 0x9f, 0x5a, 0xcf, + 0x33, 0x52, 0xc8, 0xdf, 0x43, 0xbd, 0x58, 0x4b, 0x03, 0x9f, 0xdb, 0xeb, 0x0b, 0x59, 0x7c, 0xc2, + 0xf4, 0x8a, 0xab, 0xb5, 0x4b, 0xea, 0x69, 0xc9, 0x82, 0x93, 0xac, 0xb8, 0xc7, 0x69, 0x5a, 0x1e, + 0x9f, 0x25, 0x18, 0xd3, 0xf2, 0xc7, 0x93, 0xb3, 0x86, 0x98, 0x8c, 0x3d, 0x74, 0xce, 0xe8, 0x9c, + 0xb9, 0x7d, 0x2e, 0xa2, 0x29, 0x59, 0x65, 0xa1, 0xcf, 0x6d, 0xc5, 0xb9, 0x34, 0x0f, 0xc3, 0x8c, + 0xac, 0xa4, 0xc0, 0x5b, 0x73, 0x3e, 0x29, 0x1c, 0xa3, 0x41, 0xf9, 0x5d, 0x22, 0xba, 0x68, 0x7a, + 0x34, 0x29, 0x5f, 0x7f, 0x9d, 0x12, 0x49, 0x6a, 0x31, 0x4f, 0x8c, 0x8c, 0x29, 0x78, 0x46, 0xd9, + 0xc4, 0x34, 0x28, 0x1a, 0x28, 0xb2, 0xd9, 0x6c, 0xe1, 0xf3, 0x91, 0x8c, 0x84, 0xfa, 0x6a, 0x85, + 0xed, 0x9a, 0x6f, 0x3f, 0x43, 0x77, 0x53, 0x6b, 0x76, 0x2e, 0xc7, 0xae, 0x19, 0xf6, 0x73, 0x5b, + 0xfa, 0x03, 0x6d, 0xcd, 0x4e, 0xa5, 0xcd, 0x27, 0xd7, 0x92, 0x8a, 0x5b, 0x5e, 0x66, 0xfd, 0x2e, + 0x7b, 0xc2, 0x74, 0x56, 0xc6, 0x7d, 0xcd, 0xae, 0x9b, 0x9b, 0x8e, 0x3f, 0x43, 0x0a, 0xb6, 0x9c, + 0xff, 0x39, 0xdc, 0xba, 0xe4, 0xdf, 0xcf, 0x6d, 0xe1, 0x97, 0xda, 0x42, 0x97, 0xc8, 0x93, 0xaf, + 0x8e, 0xe3, 0x3d, 0x12, 0xe9, 0xe7, 0xf2, 0xde, 0xc0, 0x07, 0x47, 0xe9, 0x24, 0xf7, 0x4a, 0xb3, + 0xe9, 0x96, 0x02, 0x3f, 0xd3, 0xec, 0x3b, 0x93, 0xee, 0x22, 0xe3, 0x77, 0x26, 0x61, 0xb4, 0xed, + 0xd5, 0xb0, 0xaf, 0xe5, 0x62, 0x9c, 0x91, 0x1c, 0x3f, 0xb1, 0x18, 0xe7, 0xa7, 0xcf, 0xef, 0x72, + 0x0c, 0x3a, 0x55, 0x73, 0xf7, 0x3c, 0x2d, 0xb7, 0xbd, 0x3a, 0x04, 0xa5, 0xd3, 0xed, 0xab, 0x25, + 0x26, 0x2b, 0x15, 0xfe, 0x26, 0xd3, 0x7f, 0xb8, 0xf6, 0xae, 0x67, 0x29, 0x27, 0x73, 0xf9, 0xc9, + 0xd9, 0xd5, 0x72, 0x93, 0x99, 0xd6, 0x5c, 0x63, 0xa8, 0xa7, 0x08, 0x57, 0x0c, 0x33, 0xb2, 0x95, + 0x2b, 0x86, 0x99, 0x39, 0xc5, 0x6f, 0xa2, 0xd5, 0xc5, 0xf6, 0x5b, 0x54, 0xb7, 0xba, 0x68, 0x39, + 0xa7, 0x13, 0x46, 0x0f, 0xf2, 0x31, 0x8c, 0xaa, 0x9c, 0xdc, 0xca, 0xbe, 0x9d, 0x4c, 0x0b, 0x3e, + 0x57, 0x4e, 0x17, 0x88, 0x0a, 0xdf, 0x91, 0x86, 0x0f, 0xac, 0xb3, 0x6c, 0x1a, 0x8c, 0xf2, 0xab, + 0x7d, 0x47, 0x5a, 0x3d, 0x0c, 0xb2, 0x54, 0x46, 0xee, 0x24, 0xd9, 0xf7, 0x60, 0x3c, 0xce, 0xbe, + 0xbd, 0x3b, 0xaf, 0x11, 0x26, 0x52, 0x72, 0x27, 0x09, 0xdf, 0x93, 0x57, 0x1a, 0x58, 0x9f, 0x59, + 0xd8, 0x7d, 0x17, 0xff, 0x58, 0x5a, 0x59, 0x8c, 0x96, 0xa6, 0x72, 0x79, 0x77, 0x59, 0x7c, 0xc7, + 0xf5, 0x74, 0x98, 0x6a, 0x68, 0x33, 0x12, 0xda, 0xaa, 0xa1, 0xcd, 0x4a, 0x48, 0x1b, 0x9b, 0xfc, + 0xbf, 0x90, 0x26, 0x85, 0x98, 0xe9, 0x05, 0xa3, 0x59, 0x29, 0xbe, 0x17, 0xf3, 0x8a, 0x93, 0xac, + 0x6b, 0x50, 0x4a, 0xe6, 0xee, 0x54, 0xe7, 0xb1, 0x9c, 0x24, 0xab, 0xea, 0x90, 0x97, 0x9b, 0xf4, + 0x73, 0x4b, 0xda, 0xc7, 0x4d, 0xbe, 0x97, 0xb3, 0x1b, 0xa5, 0xb3, 0xce, 0x37, 0x98, 0x4f, 0x18, + 0x69, 0x3c, 0xf5, 0x93, 0x72, 0x2a, 0x4d, 0xa8, 0xae, 0x59, 0x65, 0x64, 0xfe, 0x74, 0x65, 0x44, + 0xa9, 0xec, 0x8c, 0xeb, 0x6f, 0x9a, 0x47, 0xd8, 0x2e, 0x31, 0xdf, 0x7b, 0x5e, 0xff, 0x92, 0x5f, + 0x80, 0xd9, 0x9c, 0x18, 0xd6, 0xe4, 0x6a, 0xc2, 0xd2, 0x9a, 0x1d, 0xe3, 0x5a, 0x4d, 0x90, 0xcc, + 0xfc, 0xda, 0xeb, 0xe8, 0x37, 0x60, 0xc4, 0x77, 0x48, 0xdd, 0xc5, 0x3d, 0x74, 0xa3, 0x7d, 0x9e, + 0x46, 0x5a, 0x5b, 0x36, 0x33, 0x03, 0x43, 0x90, 0x1a, 0x9e, 0x45, 0x0c, 0x68, 0xc6, 0x75, 0x5c, + 0x06, 0xc3, 0xb9, 0x6c, 0x86, 0x6c, 0xed, 0x60, 0x73, 0x21, 0x23, 0xf8, 0x86, 0x9a, 0x0b, 0xf9, + 0x81, 0x39, 0x72, 0x9b, 0xb9, 0x25, 0x75, 0xa4, 0x6c, 0x8e, 0xf9, 0x71, 0x38, 0x72, 0x39, 0xde, + 0x67, 0x1c, 0x53, 0xa1, 0x35, 0x48, 0x0e, 0x7a, 0xf7, 0xd5, 0xc3, 0x96, 0x5b, 0xae, 0x49, 0x35, + 0xaf, 0xb5, 0x2f, 0x2f, 0x88, 0x47, 0x6e, 0xfb, 0x96, 0xe5, 0xf7, 0x94, 0xdd, 0xbe, 0xe3, 0x6e, + 0xba, 0xea, 0xfe, 0x2b, 0x11, 0xdd, 0xc5, 0xe8, 0xa8, 0x06, 0x9f, 0xcb, 0x81, 0x93, 0x0d, 0x74, + 0x04, 0x4a, 0x42, 0xb5, 0x43, 0x69, 0x76, 0xf8, 0x98, 0x5c, 0x7e, 0x7c, 0x1e, 0x1b, 0xe1, 0x37, + 0x4e, 0x32, 0x8f, 0x13, 0x71, 0x3b, 0xc4, 0x3c, 0x36, 0xa0, 0x27, 0x9b, 0xc7, 0x09, 0x86, 0xe6, + 0x3c, 0x4e, 0x36, 0x33, 0x79, 0xd2, 0xcf, 0x1d, 0xd5, 0x64, 0x33, 0xd5, 0x3c, 0xce, 0xe6, 0x98, + 0x1f, 0x26, 0x25, 0x97, 0xa3, 0x9a, 0xc7, 0x26, 0xc7, 0x1c, 0xf4, 0x63, 0xce, 0xe3, 0x64, 0x25, + 0xe6, 0x3c, 0x3e, 0x51, 0xfb, 0xd4, 0x3c, 0xce, 0x6e, 0xdf, 0x89, 0xe7, 0x71, 0x22, 0xae, 0x90, + 0xd1, 0xd1, 0xac, 0x79, 0x9c, 0xc4, 0xe7, 0xf3, 0x38, 0x09, 0x4d, 0x18, 0x57, 0xba, 0xcc, 0xe3, + 0x24, 0xe5, 0x67, 0xc8, 0x2f, 0x11, 0x13, 0xe5, 0x38, 0x33, 0x39, 0x37, 0x9c, 0x0a, 0x79, 0x88, + 0xe6, 0xbd, 0x04, 0xfc, 0x78, 0xb3, 0xf9, 0x7c, 0x1e, 0x53, 0x9c, 0xcf, 0xbb, 0x52, 0x88, 0xc9, + 0xe6, 0x9a, 0xb6, 0xab, 0xec, 0x90, 0x30, 0x5d, 0x1a, 0xbc, 0xcb, 0xe6, 0x4d, 0xb3, 0x0b, 0xdf, + 0x6e, 0x11, 0x6d, 0xba, 0xf0, 0x55, 0x47, 0x99, 0x24, 0xdf, 0x5c, 0x92, 0xee, 0xf3, 0xfb, 0x73, + 0x79, 0xc1, 0x91, 0xa4, 0x9b, 0x4f, 0x1c, 0x8e, 0x4e, 0xdc, 0x52, 0x75, 0x48, 0x4a, 0xb6, 0xf4, + 0xa4, 0xf3, 0x7c, 0x5d, 0x6a, 0x0f, 0xa9, 0x50, 0x58, 0x89, 0x4e, 0xeb, 0x73, 0x3d, 0xb7, 0x84, + 0x6c, 0xa3, 0x2d, 0x37, 0x0d, 0xd7, 0xec, 0xc0, 0x79, 0x31, 0xb7, 0x7a, 0x72, 0x4d, 0x05, 0xf5, + 0xd1, 0xb9, 0xe6, 0x45, 0xfc, 0x51, 0x5c, 0xd3, 0xd4, 0x9f, 0xa0, 0xf5, 0x4b, 0xbc, 0xb8, 0xf2, + 0x1e, 0xfb, 0xf9, 0x96, 0x94, 0x29, 0xc3, 0x59, 0x89, 0xe1, 0xa2, 0x8f, 0xd8, 0x47, 0xe2, 0x06, + 0x4f, 0x02, 0x73, 0x85, 0x9f, 0x45, 0x4f, 0x3e, 0x81, 0x92, 0x58, 0xde, 0x62, 0x06, 0x59, 0x88, + 0xb9, 0x43, 0xb7, 0x20, 0x8d, 0x6e, 0xc7, 0x68, 0xc1, 0x71, 0x8c, 0x6d, 0xc7, 0x91, 0x44, 0xbe, + 0x65, 0x8a, 0x6d, 0x87, 0xdb, 0x41, 0x27, 0x8c, 0x68, 0x33, 0x6d, 0x51, 0x32, 0x1b, 0x23, 0x3d, + 0x23, 0x4c, 0xf4, 0xdd, 0x79, 0xb2, 0x8a, 0x6b, 0x9b, 0x09, 0xee, 0x66, 0x72, 0xcb, 0x66, 0x83, + 0x4b, 0xcf, 0x8a, 0x7a, 0xd6, 0x63, 0xb6, 0x29, 0xaf, 0xee, 0xfc, 0x46, 0x29, 0x11, 0x1d, 0xb3, + 0x77, 0x79, 0x22, 0xfa, 0x10, 0xdd, 0x00, 0xb8, 0xf9, 0xaf, 0x97, 0x64, 0x92, 0x0f, 0x8d, 0xc8, + 0xa7, 0x30, 0x2a, 0x89, 0x7b, 0x0b, 0x24, 0x49, 0x8d, 0x02, 0x59, 0x82, 0x09, 0xe3, 0x15, 0x95, + 0x3a, 0xdd, 0x64, 0xbd, 0xad, 0xea, 0x32, 0xce, 0x13, 0xc6, 0x6b, 0x29, 0xc5, 0x25, 0xeb, 0x0d, + 0x55, 0x2e, 0x97, 0xef, 0xc3, 0x98, 0x10, 0x69, 0x57, 0x69, 0xe4, 0xdb, 0xdb, 0x66, 0x34, 0x8f, + 0xe4, 0x4e, 0xd3, 0x8d, 0x16, 0x7d, 0xef, 0xb1, 0xbb, 0xd7, 0x53, 0x30, 0x69, 0x92, 0xdd, 0x79, + 0xf2, 0x15, 0x26, 0x5d, 0x96, 0xa9, 0xb0, 0x69, 0xf4, 0xcc, 0x0f, 0x9e, 0xb8, 0xde, 0x5e, 0x0f, + 0x96, 0x97, 0x4c, 0x96, 0x49, 0x3a, 0xe9, 0x3b, 0xf2, 0x15, 0xcc, 0xd5, 0xf2, 0x99, 0xf7, 0x64, + 0xd2, 0x7d, 0x7b, 0xa9, 0xc1, 0x79, 0xf4, 0x9e, 0x39, 0x69, 0xdb, 0xbb, 0x32, 0xfd, 0x82, 0x47, + 0x53, 0x94, 0xb6, 0xfa, 0x86, 0x1f, 0x34, 0x7b, 0x73, 0xac, 0x98, 0x8e, 0xb4, 0x09, 0x32, 0x29, + 0x8c, 0x2f, 0xe0, 0x6c, 0x2d, 0x97, 0x75, 0x2f, 0x16, 0xbd, 0x34, 0xc9, 0x73, 0x28, 0x8a, 0x13, + 0xb6, 0xbb, 0x2b, 0xcf, 0x55, 0x5c, 0xd3, 0xd8, 0x3e, 0xb4, 0x15, 0xd0, 0xc7, 0x34, 0x40, 0x77, + 0xed, 0x5e, 0x8e, 0xca, 0x26, 0xba, 0xec, 0xf9, 0x2a, 0x9c, 0xae, 0xa5, 0x58, 0xe5, 0x91, 0xf4, + 0xba, 0xff, 0x99, 0xc2, 0x9e, 0x1e, 0xb3, 0x5d, 0x3d, 0xbc, 0x84, 0xc6, 0xee, 0xd1, 0x68, 0x67, + 0xb5, 0x87, 0x94, 0xe4, 0x7b, 0x02, 0x89, 0xb8, 0x7b, 0x9b, 0x51, 0xd6, 0x34, 0xca, 0x34, 0x46, + 0xee, 0xc7, 0xfb, 0xa9, 0xbc, 0x0b, 0xe9, 0x59, 0x6d, 0x1e, 0x87, 0x3b, 0xb8, 0x16, 0x0a, 0x97, + 0xe5, 0xd9, 0x58, 0x05, 0xe0, 0x90, 0xd8, 0x54, 0xa7, 0x79, 0x2f, 0x87, 0xa4, 0xca, 0x8f, 0x7f, + 0x7c, 0x7a, 0x08, 0xd8, 0xc5, 0x94, 0x2b, 0x7b, 0x57, 0x16, 0xdc, 0x0a, 0xba, 0xe6, 0x37, 0x9e, + 0xe8, 0x56, 0x50, 0x2d, 0x2d, 0xff, 0x9c, 0x99, 0x34, 0x5f, 0xac, 0xf8, 0x98, 0x39, 0x5f, 0x77, + 0xfc, 0xd2, 0x13, 0xf3, 0xcf, 0xcd, 0xa6, 0xe0, 0xc2, 0x82, 0x74, 0x47, 0xda, 0x16, 0xb1, 0x42, + 0x93, 0x73, 0xae, 0x68, 0x94, 0x59, 0x11, 0x89, 0x4c, 0xb3, 0xa2, 0xde, 0xd0, 0x7c, 0x5b, 0x3e, + 0xb1, 0x69, 0xbb, 0x85, 0x5e, 0xd0, 0x07, 0x3e, 0xa7, 0x89, 0x1d, 0x63, 0xd3, 0x45, 0xbd, 0xfd, + 0xb7, 0xa6, 0x84, 0xd7, 0x8f, 0x21, 0x78, 0x15, 0xed, 0x38, 0x5d, 0x16, 0x8b, 0x52, 0x77, 0x46, + 0xba, 0x55, 0x20, 0x1b, 0x70, 0xe6, 0x1e, 0x8d, 0xc4, 0x1a, 0x67, 0xd3, 0x30, 0x0a, 0xdc, 0x46, + 0xd4, 0xf5, 0x62, 0x50, 0x9e, 0x4d, 0x32, 0x68, 0x76, 0xdf, 0x66, 0xfc, 0x6a, 0xd9, 0xfc, 0xba, + 0xd2, 0x75, 0x71, 0x91, 0x15, 0xb7, 0x0d, 0x27, 0x69, 0x62, 0xfe, 0x14, 0x1f, 0xe6, 0x1e, 0x38, + 0xf9, 0xa4, 0xa5, 0x38, 0xfa, 0x89, 0x38, 0x6d, 0xdd, 0x80, 0x21, 0x4e, 0x94, 0xbb, 0xa1, 0x8e, + 0xeb, 0x34, 0xe4, 0x36, 0x8c, 0x2a, 0x17, 0x1a, 0x62, 0x14, 0xe5, 0xb6, 0xeb, 0x36, 0x8c, 0xf2, + 0xa3, 0xd5, 0xf1, 0x49, 0x3e, 0x84, 0x51, 0xe5, 0x73, 0x73, 0xe2, 0x9d, 0xfe, 0x13, 0x98, 0xd0, + 0xbd, 0x6f, 0x4e, 0x2e, 0xc8, 0xef, 0xe3, 0xf5, 0xad, 0xbc, 0x25, 0xc9, 0xa7, 0x9f, 0x49, 0x04, + 0x85, 0x11, 0x22, 0xe5, 0x0b, 0xa4, 0x04, 0xe6, 0x36, 0xff, 0x74, 0x8a, 0x9a, 0x7c, 0x28, 0x5f, + 0x32, 0x29, 0xe2, 0x34, 0x52, 0x17, 0x99, 0x4d, 0x72, 0x31, 0xbf, 0x08, 0xb1, 0x5a, 0x60, 0x7b, + 0x36, 0xfb, 0x38, 0xd7, 0xcc, 0xbd, 0x45, 0x97, 0xc7, 0x65, 0x13, 0xb5, 0xb4, 0x54, 0xa2, 0xbb, + 0x7c, 0x46, 0x17, 0xf3, 0x73, 0xe3, 0xe1, 0x60, 0xdc, 0xc7, 0x53, 0x60, 0xaa, 0x34, 0xb7, 0x7b, + 0x5d, 0x72, 0xed, 0xc5, 0xc7, 0xde, 0x34, 0xbb, 0x2e, 0x64, 0xdd, 0x4e, 0xd1, 0xe2, 0x7d, 0xe6, + 0x2b, 0x61, 0xb7, 0x2a, 0x9d, 0x18, 0x8f, 0xdf, 0xd9, 0xfc, 0x96, 0x9d, 0xcb, 0xb8, 0xd8, 0xee, + 0x39, 0x16, 0x79, 0xec, 0x7e, 0x01, 0xb5, 0xc3, 0xcc, 0xa8, 0x60, 0xf9, 0xcc, 0xae, 0x69, 0xbe, + 0x11, 0x99, 0x94, 0x6a, 0xd3, 0x7b, 0x82, 0x4f, 0xc4, 0xb2, 0x53, 0x01, 0xbe, 0xde, 0x83, 0x8b, + 0x94, 0xc4, 0x1b, 0x3d, 0xf1, 0xd4, 0x35, 0xe9, 0x39, 0xbe, 0xc3, 0x66, 0xd7, 0xd7, 0x23, 0xb5, + 0x61, 0xc6, 0xcd, 0xb5, 0xf2, 0x10, 0xcd, 0x66, 0x68, 0x7a, 0x88, 0x76, 0xed, 0x43, 0x9e, 0xf8, + 0x3f, 0x83, 0x4a, 0xec, 0x00, 0x72, 0xb2, 0x41, 0xc8, 0x77, 0x4c, 0x24, 0x29, 0x49, 0x85, 0xa4, + 0x5b, 0xae, 0x9f, 0xb9, 0xcb, 0x79, 0x12, 0xd6, 0x9f, 0xc1, 0x08, 0xc7, 0xb6, 0x44, 0x52, 0xcc, + 0xbc, 0xf4, 0x9a, 0x5d, 0xec, 0xb0, 0xe2, 0xcd, 0xdc, 0x2b, 0x61, 0x94, 0x1e, 0xed, 0x93, 0x33, + 0x52, 0xfe, 0x19, 0x09, 0x46, 0x56, 0x97, 0xe1, 0xed, 0x7d, 0xf5, 0x58, 0xce, 0x19, 0xd7, 0x93, + 0x0f, 0xa8, 0x13, 0xbf, 0x13, 0x4b, 0x04, 0x11, 0xd4, 0xdf, 0xe6, 0xa6, 0x8b, 0x92, 0x8f, 0x9c, + 0xb2, 0x30, 0x94, 0x53, 0x54, 0x59, 0x56, 0xc1, 0xe0, 0xec, 0x28, 0xe2, 0x07, 0x6e, 0xf4, 0x7c, + 0xd1, 0x5e, 0x8b, 0xcd, 0x0a, 0x7a, 0x81, 0xe4, 0x0d, 0xb2, 0xd0, 0x5e, 0x23, 0x5f, 0xe2, 0x52, + 0x22, 0xd8, 0x2f, 0xf8, 0x7e, 0x14, 0x46, 0x81, 0xd3, 0xae, 0x35, 0x02, 0xb7, 0x1d, 0xe5, 0x76, + 0x3a, 0xf6, 0xe1, 0xce, 0x22, 0xd3, 0x5c, 0x4a, 0x45, 0x90, 0xf9, 0xac, 0xc8, 0x37, 0xea, 0x59, + 0x4d, 0x56, 0x61, 0x97, 0x93, 0x4b, 0x4d, 0x86, 0x95, 0x7f, 0x95, 0x4c, 0xeb, 0x30, 0x9b, 0x13, + 0x2f, 0x48, 0xdd, 0xde, 0x76, 0x8f, 0x27, 0x34, 0xd7, 0xbd, 0x62, 0xf2, 0x15, 0xcc, 0x64, 0x06, + 0x14, 0x52, 0x16, 0xe8, 0x6e, 0xe1, 0x86, 0x7a, 0x31, 0x7f, 0x02, 0x65, 0xfe, 0xa0, 0x03, 0xfd, + 0x96, 0x8d, 0xd8, 0x32, 0xf1, 0x33, 0x9f, 0x1c, 0x84, 0xe4, 0x7a, 0x9d, 0x8f, 0xa7, 0x1e, 0x9b, + 0x4f, 0x63, 0x50, 0x91, 0x44, 0x3a, 0x77, 0xf5, 0xe1, 0x65, 0x15, 0x76, 0x7b, 0x4b, 0xb4, 0x05, + 0x33, 0xbb, 0x34, 0x70, 0x1f, 0x3f, 0x4f, 0x32, 0x94, 0x92, 0xc9, 0x2c, 0xed, 0xc6, 0xf1, 0x73, + 0x98, 0x5d, 0xf4, 0x0f, 0xda, 0xe2, 0xd5, 0x9e, 0xc1, 0x53, 0x5d, 0xc5, 0x67, 0x97, 0xf7, 0xf6, + 0x65, 0x9a, 0xcb, 0x4f, 0xbc, 0xaf, 0x5c, 0xd8, 0x7a, 0xe6, 0xe6, 0x57, 0x6f, 0xcf, 0x4c, 0xfa, + 0x6d, 0x9c, 0x84, 0x59, 0x99, 0xf8, 0xf5, 0x49, 0xd8, 0x25, 0x53, 0x7f, 0xce, 0x1b, 0xb0, 0xd9, + 0x9c, 0xe4, 0xfb, 0x5d, 0xb8, 0x1e, 0xa3, 0xb5, 0x1b, 0x72, 0x6f, 0x31, 0x73, 0x89, 0x27, 0x9c, + 0xa6, 0x33, 0x13, 0x8d, 0x67, 0xb6, 0x53, 0x8b, 0xaa, 0xd0, 0x6a, 0x75, 0x51, 0xb1, 0x88, 0x1e, + 0x56, 0x81, 0x61, 0xa2, 0x11, 0x7f, 0x42, 0xa7, 0xed, 0xb6, 0x5a, 0xa7, 0x88, 0x51, 0xa9, 0xfd, + 0x00, 0xc6, 0x6b, 0x7a, 0xe5, 0x19, 0x95, 0xe4, 0x4e, 0x0a, 0xf5, 0x0a, 0xa8, 0x77, 0xdb, 0xbb, + 0xf8, 0x82, 0xaa, 0x8d, 0xe7, 0x58, 0xbd, 0xc8, 0x75, 0x9d, 0x31, 0x12, 0xc3, 0xa9, 0x5d, 0x20, + 0x2b, 0x6f, 0xa3, 0x72, 0x9d, 0xc9, 0xce, 0x25, 0x57, 0xe7, 0xe9, 0x66, 0x92, 0x69, 0x39, 0x89, + 0xd5, 0x3b, 0xff, 0xad, 0xf2, 0x89, 0xef, 0x9a, 0xd7, 0x93, 0xfb, 0xf9, 0xc4, 0xa9, 0xf0, 0x74, + 0x3f, 0x9f, 0x54, 0x82, 0x3d, 0xdd, 0xcf, 0x27, 0x23, 0x7b, 0xde, 0x32, 0xf2, 0x8a, 0xf3, 0xf4, + 0x74, 0x31, 0x46, 0x28, 0x36, 0x19, 0xe9, 0x80, 0x1e, 0xe8, 0xc1, 0x39, 0x78, 0x76, 0x9f, 0x2e, + 0xb6, 0xd6, 0x64, 0x50, 0x8e, 0x44, 0x3a, 0xa0, 0xbb, 0x50, 0xe2, 0x89, 0x0e, 0xe2, 0x98, 0x86, + 0xb1, 0xeb, 0x5f, 0x3a, 0xff, 0x42, 0x97, 0x41, 0x2d, 0x25, 0x23, 0xc1, 0x29, 0x93, 0x59, 0x4e, + 0x88, 0xb8, 0x2e, 0x53, 0x15, 0xe2, 0x78, 0x6f, 0xca, 0x30, 0x95, 0x0a, 0x01, 0x37, 0x77, 0x36, + 0xa3, 0x44, 0xa9, 0x94, 0xe3, 0x7a, 0x74, 0x38, 0xd5, 0xa5, 0x8c, 0x90, 0x71, 0x73, 0xe7, 0x32, + 0xcb, 0x04, 0xa3, 0x88, 0xa7, 0x80, 0xce, 0x4e, 0x5c, 0x1d, 0x3f, 0xe4, 0xea, 0x82, 0x23, 0xab, + 0xb9, 0x7e, 0x1c, 0x54, 0x51, 0x2b, 0x55, 0x59, 0x8a, 0x32, 0xb2, 0x65, 0xbf, 0x91, 0xf1, 0xd6, + 0xc2, 0xc0, 0x88, 0xbd, 0xc1, 0xba, 0xa7, 0xee, 0x26, 0x0f, 0x65, 0xd6, 0x98, 0x9c, 0x9a, 0x7a, + 0x31, 0xc8, 0x1d, 0xc1, 0x87, 0x32, 0x4f, 0xcc, 0xab, 0x66, 0xfc, 0x08, 0xce, 0x27, 0x1e, 0x70, + 0x98, 0x8c, 0xaf, 0x67, 0xbf, 0xf2, 0xc8, 0x14, 0x4f, 0xbe, 0xce, 0x7e, 0x29, 0xfd, 0xd0, 0x23, + 0x31, 0xee, 0x27, 0x5d, 0xf3, 0xd6, 0x61, 0x12, 0x97, 0x19, 0x99, 0xf7, 0x3d, 0x8e, 0x0d, 0x63, + 0x82, 0x93, 0x41, 0x8a, 0x92, 0xa5, 0xea, 0xfd, 0xf8, 0xb8, 0x78, 0x14, 0xcc, 0xb3, 0xc8, 0xcf, + 0x99, 0x2f, 0x85, 0x11, 0x98, 0xb5, 0x8b, 0x89, 0xe4, 0xf4, 0xe4, 0xfb, 0x70, 0x2a, 0x7e, 0x2b, + 0xcc, 0x59, 0x64, 0xa0, 0x75, 0x31, 0x94, 0x9d, 0x8a, 0x1f, 0x0c, 0x9f, 0x9c, 0x7c, 0x45, 0x6e, + 0x45, 0x31, 0xf9, 0x85, 0xd4, 0x73, 0x17, 0xa3, 0x0f, 0xc7, 0xd9, 0x91, 0x34, 0xd9, 0x9e, 0x74, + 0x74, 0x1a, 0xf8, 0xb9, 0x65, 0x87, 0x3d, 0xd4, 0x3f, 0xb7, 0xae, 0xa1, 0x19, 0x95, 0xfa, 0x9b, + 0xc3, 0x67, 0x1d, 0xae, 0x60, 0xa8, 0x94, 0x2d, 0x1e, 0x1c, 0x2f, 0x1b, 0x2b, 0xbf, 0xed, 0xc9, + 0x00, 0x2b, 0x2d, 0xb8, 0xdc, 0x33, 0xee, 0x23, 0xb9, 0x69, 0xb8, 0xb8, 0xf4, 0x8e, 0x10, 0xd9, + 0xe5, 0xe4, 0x31, 0x9d, 0x15, 0x3e, 0x51, 0xed, 0xb3, 0x5d, 0x22, 0x39, 0xaa, 0x7d, 0xb6, 0x6b, + 0xfc, 0xc5, 0xcf, 0x31, 0x15, 0x93, 0xd8, 0xa3, 0x30, 0xfc, 0x11, 0xf5, 0x78, 0x50, 0xe8, 0xae, + 0xd7, 0x3e, 0x97, 0xcd, 0x4b, 0xd1, 0x14, 0x21, 0x9e, 0x69, 0x2e, 0x8a, 0x93, 0x58, 0x1e, 0xf3, + 0xde, 0x4c, 0xba, 0xb8, 0x56, 0x5f, 0xe4, 0x13, 0xf0, 0xc4, 0x2d, 0xcf, 0x81, 0x2f, 0x2c, 0xfd, + 0xe4, 0xbf, 0x5f, 0x2c, 0xfc, 0xe4, 0xa7, 0x17, 0x0b, 0xff, 0xe9, 0xa7, 0x17, 0x0b, 0xff, 0xed, + 0xa7, 0x17, 0x0b, 0x5f, 0xce, 0x1f, 0x2f, 0x34, 0x31, 0x4f, 0x9e, 0x78, 0x93, 0xb3, 0x1b, 0xc2, + 0xff, 0xee, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xc8, 0x6e, 0x7b, 0x7b, 0xeb, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 03b6f9ac35439..e804925ea3e3a 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -2553,10 +2553,10 @@ message InventoryPingRequest { // ServerID is the ID of the instance to ping. string ServerID = 1; - // ControlLog forces the ping to use the standard "commit then act" model of control log synchronization - // for the ping. This significantly increases the amount of time it takes for the ping request to - // complete, but is useful for testing/debugging control log issues. - bool ControlLog = 2; + // ControlLog used to signal that the ping should use the control log synchronization. + // + // Deprecated: the control log is unsupported and unsound to use. + bool ControlLog = 2 [deprecated = true]; } // InventoryPingResponse returns the result of an inventory ping initiated via an diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 7ce195c24b94c..e6365f6a7ac53 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -4826,9 +4826,6 @@ func (a *Server) GetInventoryConnectedServiceCount(service types.SystemRole) uin } func (a *Server) PingInventory(ctx context.Context, req proto.InventoryPingRequest) (proto.InventoryPingResponse, error) { - const pingAttempt = "ping-attempt" - const pingSuccess = "ping-success" - const maxAttempts = 16 stream, ok := a.inventory.GetControlStream(req.ServerID) if !ok { return proto.InventoryPingResponse{}, trace.NotFound("no control stream found for server %q", req.ServerID) @@ -4836,65 +4833,8 @@ func (a *Server) PingInventory(ctx context.Context, req proto.InventoryPingReque id := mathrand.Uint64() - if !req.ControlLog { - // this ping doesn't pass through the control log, so just execute it immediately. - d, err := stream.Ping(ctx, id) - return proto.InventoryPingResponse{ - Duration: d, - }, trace.Wrap(err) - } - - // matchEntry is used to check if our log entry has been included - // in the control log. - matchEntry := func(entry types.InstanceControlLogEntry) bool { - return entry.Type == pingAttempt && entry.ID == id - } - - var included bool - for i := 1; i <= maxAttempts; i++ { - stream.VisitInstanceState(func(ref inventory.InstanceStateRef) (update inventory.InstanceStateUpdate) { - // check if we've already successfully included the ping entry - if ref.LastHeartbeat != nil { - if slices.IndexFunc(ref.LastHeartbeat.GetControlLog(), matchEntry) >= 0 { - included = true - return - } - } - - // if the entry pending already, we just need to wait - if slices.IndexFunc(ref.QualifiedPendingControlLog, matchEntry) >= 0 { - return - } - - // either this is the first iteration, or the pending control log was reset. - update.QualifiedPendingControlLog = append(update.QualifiedPendingControlLog, types.InstanceControlLogEntry{ - Type: pingAttempt, - ID: id, - Time: time.Now(), - }) - stream.HeartbeatInstance() - return - }) - - if included { - // entry appeared in control log - break - } - - // pause briefly, then re-sync our state. note that this strategy is not scalable. control log usage is intended only - // for periodic operations. control-log based pings are a mechanism for testing/debugging only, hence the use of a - // simple sleep loop. - select { - case <-time.After(time.Millisecond * 100 * time.Duration(i)): - case <-stream.Done(): - return proto.InventoryPingResponse{}, trace.Errorf("control stream closed during ping attempt") - case <-ctx.Done(): - return proto.InventoryPingResponse{}, trace.Wrap(ctx.Err()) - } - } - - if !included { - return proto.InventoryPingResponse{}, trace.LimitExceeded("failed to include ping %d in control log for instance %q (max attempts exceeded)", id, req.ServerID) + if req.ControlLog { //nolint:staticcheck // SA1019. Checking deprecated field that may be sent by older clients. + return proto.InventoryPingResponse{}, trace.BadParameter("ControlLog pings are not supported") } d, err := stream.Ping(ctx, id) @@ -4902,18 +4842,6 @@ func (a *Server) PingInventory(ctx context.Context, req proto.InventoryPingReque return proto.InventoryPingResponse{}, trace.Wrap(err) } - stream.VisitInstanceState(func(_ inventory.InstanceStateRef) (update inventory.InstanceStateUpdate) { - update.UnqualifiedPendingControlLog = append(update.UnqualifiedPendingControlLog, types.InstanceControlLogEntry{ - Type: pingSuccess, - ID: id, - Labels: map[string]string{ - "duration": d.String(), - }, - }) - return - }) - stream.HeartbeatInstance() - return proto.InventoryPingResponse{ Duration: d, }, nil diff --git a/lib/inventory/controller.go b/lib/inventory/controller.go index 274a0d9a4af01..1100447ad982c 100644 --- a/lib/inventory/controller.go +++ b/lib/inventory/controller.go @@ -25,7 +25,6 @@ import ( "time" "github.com/gravitational/trace" - "github.com/jonboulle/clockwork" log "github.com/sirupsen/logrus" "github.com/gravitational/teleport/api/client" @@ -34,6 +33,7 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/retryutils" + "github.com/gravitational/teleport/lib/inventory/internal/delay" usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/utils/interval" @@ -107,16 +107,10 @@ const ( handlerStart = "handler-start" handlerClose = "handler-close" - keepAliveTick = "keep-alive-tick" -) - -// intervalKey is used to uniquely identify the subintervals registered with the interval.MultiInterval -// instance that we use for managing periodics associated with upstream handles. -type intervalKey int - -const ( - instanceHeartbeatKey intervalKey = 1 + iota - serverKeepAliveKey + keepAliveSSHTick = "keep-alive-ssh-tick" + keepAliveAppTick = "keep-alive-app-tick" + keepAliveDatabaseTick = "keep-alive-db-tick" + keepAliveKubeTick = "keep-alive-kube-tick" ) // instanceHBStepSize is the step size used for the variable instance hearbteat duration. This value is @@ -217,7 +211,6 @@ type Controller struct { serviceCounter *serviceCounter auth Auth authID string - serverKeepAliveEnabled bool serverKeepAlive time.Duration serverTTL time.Duration instanceTTL time.Duration @@ -232,18 +225,6 @@ type Controller struct { cancel context.CancelFunc } -// serverKeepAliveDisabledEnv checks if the periodic server keepalive has been -// explicitly disabled via environment variable. -func serverKeepAliveDisabledEnv() bool { - return os.Getenv("TELEPORT_UNSTABLE_DISABLE_SERVER_KEEPALIVE") == "yes" -} - -// instanceHeartbeatsDisabledEnv checks if instance heartbeats have been explicitly disabled -// via environment variable. -func instanceHeartbeatsDisabledEnv() bool { - return os.Getenv("TELEPORT_UNSTABLE_DISABLE_INSTANCE_HB") == "yes" -} - // NewController sets up a new controller instance. func NewController(auth Auth, usageReporter usagereporter.UsageReporter, opts ...ControllerOption) *Controller { var options controllerOptions @@ -262,7 +243,6 @@ func NewController(auth Auth, usageReporter usagereporter.UsageReporter, opts .. return &Controller{ store: NewStore(), serviceCounter: &serviceCounter{}, - serverKeepAliveEnabled: !serverKeepAliveDisabledEnv(), serverKeepAlive: options.serverKeepAlive, serverTTL: apidefaults.ServerAnnounceTTL, instanceTTL: apidefaults.InstanceHeartbeatTTL, @@ -282,25 +262,17 @@ func NewController(auth Auth, usageReporter usagereporter.UsageReporter, opts .. // RegisterControlStream registers a new control stream with the controller. func (c *Controller) RegisterControlStream(stream client.UpstreamInventoryControlStream, hello proto.UpstreamInventoryHello) { - // increment the concurrent connection counter that we use to calculate the variable - // instance heartbeat duration. - c.instanceHBVariableDuration.Inc() - // set up ticker with instance HB sub-interval. additional sub-intervals are added as needed. - // note that we are using fullJitter on the first duration to spread out initial instance heartbeats - // as much as possible. this is intended to mitigate load spikes on auth restart, and is reasonably - // safe to do since the instance resource is not directly relied upon for use of any particular teleport - // service. - ticker := interval.NewMulti( - clockwork.NewRealClock(), - interval.SubInterval[intervalKey]{ - Key: instanceHeartbeatKey, - VariableDuration: c.instanceHBVariableDuration, - FirstDuration: retryutils.FullJitter(c.instanceHBVariableDuration.Duration()), - Jitter: retryutils.SeventhJitter, - }) - handle := newUpstreamHandle(stream, hello, ticker) + handle := newUpstreamHandle(stream, hello) c.store.Insert(handle) - go c.handleControlStream(handle) + + // Increment the concurrent connection counter that we use to calculate the + // variable instance heartbeat duration. It's done here synchronously rather + // than in handleControlStream for the sake of tests. + c.instanceHBVariableDuration.Inc() + go func() { + defer c.instanceHBVariableDuration.Dec() + c.handleControlStream(handle) + }() } // GetControlStream gets a control stream for the given server ID if one exists (if multiple control streams @@ -345,6 +317,33 @@ func (c *Controller) testEvent(event testEvent) { func (c *Controller) handleControlStream(handle *upstreamHandle) { c.testEvent(handlerStart) + // Note that we are using fullJitter on the first duration to spread out + // initial instance heartbeats as much as possible. This is intended to + // mitigate load spikes on auth restart, and is reasonably safe to do since + // the instance resource is not directly relied upon for use of any + // particular Teleport service. + instanceHeartbeatDelay := delay.New(delay.Params{ + FirstInterval: retryutils.FullJitter(c.instanceHBVariableDuration.Duration()), + VariableInterval: c.instanceHBVariableDuration, + Jitter: retryutils.SeventhJitter, + }) + defer instanceHeartbeatDelay.Stop() + + // these delays are lazily initialized upon receipt of the first heartbeat + // since not all servers send all heartbeats + var sshKeepAliveDelay *delay.Delay + var appKeepAliveDelay *delay.Delay + var dbKeepAliveDelay *delay.Delay + var kubeKeepAliveDelay *delay.Delay + defer func() { + // this is a function expression because the variables are initialized + // later and we want to call Stop on the initialized value (if any) + sshKeepAliveDelay.Stop() + appKeepAliveDelay.Stop() + dbKeepAliveDelay.Stop() + kubeKeepAliveDelay.Stop() + }() + for _, service := range handle.hello.Services { c.serviceCounter.increment(service) } @@ -376,13 +375,11 @@ func (c *Controller) handleControlStream(handle *upstreamHandle) { } } - c.instanceHBVariableDuration.Dec() for _, service := range handle.hello.Services { c.serviceCounter.decrement(service) } c.store.Remove(handle) handle.Close() // no effect if CloseWithError was called below - handle.ticker.Stop() if handle.sshServer != nil { c.onDisconnectFunc(constants.KeepAliveNode, 1) @@ -406,11 +403,6 @@ func (c *Controller) handleControlStream(handle *upstreamHandle) { c.testEvent(handlerClose) }() - // keepAliveNeedInit tracks wether or not we should initialize the server - // keepalive sub-interval upon receiving a heartbeat. We do this lazily upon - // receipt of the first heartbeat since not all servers send heartbeats. - keepAliveNeedInit := c.serverKeepAliveEnabled - for { select { case msg := <-handle.Recv(): @@ -426,15 +418,35 @@ func (c *Controller) handleControlStream(handle *upstreamHandle) { handle.CloseWithError(err) return } - if keepAliveNeedInit { - // this is the first heartbeat, so we need to initialize the keepalive sub-interval - handle.ticker.Push(interval.SubInterval[intervalKey]{ - Key: serverKeepAliveKey, - Duration: c.serverKeepAlive, - FirstDuration: retryutils.HalfJitter(c.serverKeepAlive), + + // we initialize delays lazily here, depending on the protocol + if sshKeepAliveDelay == nil && m.SSHServer != nil { + sshKeepAliveDelay = delay.New(delay.Params{ + FirstInterval: retryutils.HalfJitter(c.serverKeepAlive), + FixedInterval: c.serverKeepAlive, + Jitter: retryutils.SeventhJitter, + }) + } + if appKeepAliveDelay == nil && m.AppServer != nil { + appKeepAliveDelay = delay.New(delay.Params{ + FirstInterval: retryutils.HalfJitter(c.serverKeepAlive), + FixedInterval: c.serverKeepAlive, + Jitter: retryutils.SeventhJitter, + }) + } + if dbKeepAliveDelay == nil && m.DatabaseServer != nil { + dbKeepAliveDelay = delay.New(delay.Params{ + FirstInterval: retryutils.HalfJitter(c.serverKeepAlive), + FixedInterval: c.serverKeepAlive, + Jitter: retryutils.SeventhJitter, + }) + } + if kubeKeepAliveDelay == nil && m.KubernetesServer != nil { + kubeKeepAliveDelay = delay.New(delay.Params{ + FirstInterval: retryutils.HalfJitter(c.serverKeepAlive), + FixedInterval: c.serverKeepAlive, Jitter: retryutils.SeventhJitter, }) - keepAliveNeedInit = false } case proto.UpstreamInventoryPong: c.handlePong(handle, m) @@ -445,21 +457,50 @@ func (c *Controller) handleControlStream(handle *upstreamHandle) { handle.CloseWithError(trace.BadParameter("unexpected upstream message type %T", m)) return } - case tick := <-handle.ticker.Next(): - switch tick.Key { - case instanceHeartbeatKey: - if err := c.heartbeatInstanceState(handle, tick.Time); err != nil { - handle.CloseWithError(err) - return - } - case serverKeepAliveKey: - if err := c.keepAliveServer(handle, tick.Time); err != nil { - handle.CloseWithError(err) - return - } - default: - log.Warnf("Unexpected sub-interval key '%v' in control stream handler of server %q (this is a bug).", tick.Key, handle.Hello().ServerID) + case now := <-instanceHeartbeatDelay.Elapsed(): + instanceHeartbeatDelay.Advance(now) + + if err := c.heartbeatInstanceState(handle, now); err != nil { + handle.CloseWithError(err) + return } + + case now := <-sshKeepAliveDelay.Elapsed(): + sshKeepAliveDelay.Advance(now) + + if err := c.keepAliveSSHServer(handle, now); err != nil { + handle.CloseWithError(err) + return + } + c.testEvent(keepAliveSSHTick) + + case now := <-appKeepAliveDelay.Elapsed(): + appKeepAliveDelay.Advance(now) + + if err := c.keepAliveAppServer(handle, now); err != nil { + handle.CloseWithError(err) + return + } + c.testEvent(keepAliveAppTick) + + case now := <-dbKeepAliveDelay.Elapsed(): + dbKeepAliveDelay.Advance(now) + + if err := c.keepAliveDatabaseServer(handle, now); err != nil { + handle.CloseWithError(err) + return + } + c.testEvent(keepAliveDatabaseTick) + + case now := <-kubeKeepAliveDelay.Elapsed(): + kubeKeepAliveDelay.Advance(now) + + if err := c.keepAliveKubernetesServer(handle, now); err != nil { + handle.CloseWithError(err) + return + } + c.testEvent(keepAliveKubeTick) + case req := <-handle.pingC: // pings require multiplexing, so we need to do the sending from this // goroutine rather than sending directly via the handle. @@ -475,6 +516,12 @@ func (c *Controller) handleControlStream(handle *upstreamHandle) { } } +// instanceHeartbeatsDisabledEnv checks if instance heartbeats have been explicitly disabled +// via environment variable. +func instanceHeartbeatsDisabledEnv() bool { + return os.Getenv("TELEPORT_UNSTABLE_DISABLE_INSTANCE_HB") == "yes" +} + func (c *Controller) heartbeatInstanceState(handle *upstreamHandle, now time.Time) error { if !c.instanceHBEnabled { return nil @@ -804,35 +851,7 @@ func (c *Controller) handleAgentMetadata(handle *upstreamHandle, m proto.Upstrea }) } -func (c *Controller) keepAliveServer(handle *upstreamHandle, now time.Time) error { - // always fire off 'tick' event after keepalive processing to ensure - // that waiting for N ticks maps intuitively to waiting for N keepalive - // processing steps. - defer c.testEvent(keepAliveTick) - if err := c.keepAliveSSHServer(handle, now); err != nil { - return trace.Wrap(err) - } - - if err := c.keepAliveAppServer(handle, now); err != nil { - return trace.Wrap(err) - } - - if err := c.keepAliveDatabaseServer(handle, now); err != nil { - return trace.Wrap(err) - } - - if err := c.keepAliveKubernetesServer(handle, now); err != nil { - return trace.Wrap(err) - } - - return nil -} - func (c *Controller) keepAliveAppServer(handle *upstreamHandle, now time.Time) error { - if handle.appServers == nil { - return nil - } - for name, srv := range handle.appServers { if srv.lease != nil { lease := *srv.lease diff --git a/lib/inventory/controller_test.go b/lib/inventory/controller_test.go index ba16edf66994f..f6d188e02f2c2 100644 --- a/lib/inventory/controller_test.go +++ b/lib/inventory/controller_test.go @@ -465,7 +465,7 @@ func TestAppServerBasics(t *testing.T) { // ensure that local app keepalive states have reset to healthy by waiting // on a full cycle+ worth of keepalives without errors. awaitEvents(t, events, - expect(keepAliveTick, keepAliveTick), + expect(keepAliveAppTick, keepAliveAppTick), deny(appKeepAliveErr, handlerClose), ) @@ -490,7 +490,7 @@ func TestAppServerBasics(t *testing.T) { // verify that further keepalive ticks to not result in attempts to keepalive // apps (successful or not). awaitEvents(t, events, - expect(keepAliveTick, keepAliveTick, keepAliveTick), + expect(keepAliveAppTick, keepAliveAppTick, keepAliveAppTick), deny(appKeepAliveOk, appKeepAliveErr, handlerClose), ) @@ -684,7 +684,7 @@ func TestDatabaseServerBasics(t *testing.T) { // ensure that local db keepalive states have reset to healthy by waiting // on a full cycle+ worth of keepalives without errors. awaitEvents(t, events, - expect(keepAliveTick, keepAliveTick), + expect(keepAliveDatabaseTick, keepAliveDatabaseTick), deny(dbKeepAliveErr, handlerClose), ) @@ -709,7 +709,7 @@ func TestDatabaseServerBasics(t *testing.T) { // verify that further keepalive ticks to not result in attempts to keepalive // dbs (successful or not). awaitEvents(t, events, - expect(keepAliveTick, keepAliveTick, keepAliveTick), + expect(keepAliveDatabaseTick, keepAliveDatabaseTick, keepAliveDatabaseTick), deny(dbKeepAliveOk, dbKeepAliveErr, handlerClose), ) @@ -813,18 +813,6 @@ func TestInstanceHeartbeatDisabledEnv(t *testing.T) { require.False(t, controller.instanceHBEnabled) } -func TestServerKeepaliveDisabledEnv(t *testing.T) { - t.Setenv("TELEPORT_UNSTABLE_DISABLE_SERVER_KEEPALIVE", "yes") - - controller := NewController( - &fakeAuth{}, - usagereporter.DiscardUsageReporter{}, - ) - defer controller.Close() - - require.False(t, controller.serverKeepAliveEnabled) -} - // TestInstanceHeartbeat verifies basic expected behaviors for instance heartbeat. func TestInstanceHeartbeat(t *testing.T) { const serverID = "test-instance" @@ -1296,7 +1284,7 @@ func TestKubernetesServerBasics(t *testing.T) { // ensure that local app keepalive states have reset to healthy by waiting // on a full cycle+ worth of keepalives without errors. awaitEvents(t, events, - expect(keepAliveTick, keepAliveTick), + expect(keepAliveKubeTick, keepAliveKubeTick), deny(kubeKeepAliveErr, handlerClose), ) @@ -1321,7 +1309,7 @@ func TestKubernetesServerBasics(t *testing.T) { // verify that further keepalive ticks to not result in attempts to keepalive // apps (successful or not). awaitEvents(t, events, - expect(keepAliveTick, keepAliveTick, keepAliveTick), + expect(keepAliveKubeTick, keepAliveKubeTick, keepAliveKubeTick), deny(kubeKeepAliveOk, kubeKeepAliveErr, handlerClose), ) diff --git a/lib/inventory/internal/delay/delay.go b/lib/inventory/internal/delay/delay.go new file mode 100644 index 0000000000000..7a5ac8a06d74a --- /dev/null +++ b/lib/inventory/internal/delay/delay.go @@ -0,0 +1,122 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package delay + +import ( + "time" + + "github.com/jonboulle/clockwork" + + "github.com/gravitational/teleport/api/utils/retryutils" + "github.com/gravitational/teleport/lib/utils/interval" +) + +// Params contains the parameters for [New]. +type Params struct { + // FirstInterval is the expected time between the creation of the [Delay] + // and the first tick. It's not modified by the configured jitter. + FirstInterval time.Duration + // FixedInterval is the interval of the delay, unless VariableInterval is + // set. If a jitter is configured, the interval will be jittered every tick. + FixedInterval time.Duration + // VariableInterval, if set, overrides FixedInterval at every tick. + VariableInterval *interval.VariableDuration + // Jitter is a jitter function, applied every tick (if set) to the fixed or + // variable interval. + Jitter retryutils.Jitter + + clock clockwork.Clock +} + +// New returns a new, running [*Delay]. +func New(p Params) *Delay { + if p.clock == nil { + p.clock = clockwork.NewRealClock() + } + return &Delay{ + clock: p.clock, + timer: p.clock.NewTimer(p.FirstInterval), + + fixedInterval: p.FixedInterval, + variableInterval: p.VariableInterval, + + jitter: p.Jitter, + } +} + +// Delay is a ticker-like abstraction around a [*time.Timer] that's made to tick +// periodically with a potentially varying interval and optionally some jitter. +// Its use requires some care as the logic driving the ticks and the jittering +// must be explicitly invoked by the code making use of it, but uses no +// background resources. +type Delay struct { + clock clockwork.Clock + timer clockwork.Timer + + fixedInterval time.Duration + variableInterval *interval.VariableDuration + + jitter retryutils.Jitter +} + +// Elapsed returns the channel on which the ticks are delivered. This method can +// be called on a nil delay, resulting in a nil channel. The [*Delay.Advance] +// method must be called after receiving a tick from the channel. +// +// select { +// // other cases +// case now := <-t.Elapsed(): +// t.Advance(now) +// // business logic here +// } +func (i *Delay) Elapsed() <-chan time.Time { + if i == nil { + return nil + } + return i.timer.Chan() +} + +func (i *Delay) interval() time.Duration { + ivl := i.fixedInterval + if i.variableInterval != nil { + ivl = i.variableInterval.Duration() + } + if i.jitter != nil { + ivl = i.jitter(ivl) + } + return ivl +} + +// Advance sets up the next tick of the delay. Must be called after receiving +// from the [*Delay.Elapsed] channel; specifically, to maintain compatibility +// with [clockwork.Clock], it must only be called with a drained timer channel. +// For consistency, the value passed to Advance should be the value received +// from the Elapsed channel (passing the current time will also work, but will +// not compensate for the time that passed since the last tick). +func (i *Delay) Advance(now time.Time) { + i.timer.Reset(i.interval() - i.clock.Since(now)) +} + +// Stop stops the delay. Only needed for [clockwork.Clock] compatibility. Can be +// called on a nil delay, as a no-op. The delay should not be used afterwards. +func (i *Delay) Stop() { + if i == nil { + return + } + + i.timer.Stop() +} diff --git a/lib/inventory/internal/delay/delay_test.go b/lib/inventory/internal/delay/delay_test.go new file mode 100644 index 0000000000000..2f93d7902e5ee --- /dev/null +++ b/lib/inventory/internal/delay/delay_test.go @@ -0,0 +1,198 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package delay + +import ( + "os" + "testing" + "time" + + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/interval" +) + +func TestMain(m *testing.M) { + utils.InitLoggerForTests() + os.Exit(m.Run()) +} + +func TestFixed(t *testing.T) { + t.Parallel() + + require := require.New(t) + clock := clockwork.NewFakeClock() + start := clock.Now() + + const first = time.Second + const ivl = time.Minute + const offset = 10 * time.Second + + ticker := New(Params{ + FirstInterval: first, + FixedInterval: ivl, + + clock: clock, + }) + defer ticker.Stop() + + clock.BlockUntil(1) + // advance by more than the first interval but not enough to reach the + // second tick + clock.Advance(offset) + + tick := <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first), tick) + + clock.BlockUntil(1) + clock.Advance(ivl) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first+ivl), tick) + + // difference in behavior compared to a [time.Ticker], but it's only really + // noticeable after lagging behind for at least two ticks and only when + // jitters are not involved + + clock.BlockUntil(1) + clock.Advance(3 * ivl) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + // this is the expected tick since the previous one that was received + require.Equal(start.Add(first+2*ivl), tick) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + // this is the tick (received immediately) corresponding to a whole interval + // since the wall time at which the ticker was advanced the last time + require.Equal(start.Add(offset+4*ivl), tick) +} + +func TestJitter(t *testing.T) { + t.Parallel() + + require := require.New(t) + clock := clockwork.NewFakeClock() + start := clock.Now() + + const first = time.Second + const ivl = time.Minute + + // we test a variable jitter that alternates between the full interval and + // half of it, deterministically + var applyJitter bool + ticker := New(Params{ + FirstInterval: first, + FixedInterval: ivl, + + Jitter: func(d time.Duration) time.Duration { + if applyJitter { + d /= 2 + } + applyJitter = !applyJitter + return d + }, + + clock: clock, + }) + defer ticker.Stop() + + clock.BlockUntil(1) + clock.Advance(first) + + tick := <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first), tick) + + clock.BlockUntil(1) + clock.Advance(ivl) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first+ivl), tick) + + clock.BlockUntil(1) + clock.Advance(ivl / 2) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first+ivl+ivl/2), tick) + + clock.BlockUntil(1) + clock.Advance(ivl) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first+ivl+ivl/2+ivl), tick) +} + +func TestVariable(t *testing.T) { + t.Parallel() + + require := require.New(t) + clock := clockwork.NewFakeClock() + start := clock.Now() + + const first = time.Second + ivl := interval.NewVariableDuration(interval.VariableDurationConfig{ + MinDuration: 2 * time.Minute, + MaxDuration: 4 * time.Minute, + Step: 1, + }) + + // deterministic jitter, always half the actual time + ticker := New(Params{ + FirstInterval: first, + VariableInterval: ivl, + Jitter: func(d time.Duration) time.Duration { + return d / 2 + }, + + clock: clock, + }) + defer ticker.Stop() + + clock.BlockUntil(1) + clock.Advance(first) + + tick := <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first), tick) + + clock.BlockUntil(1) + clock.Advance(time.Minute) + + // this is enough to saturate the VariableDuration, so we are going to hit + // the max duration every time + ivl.Add(100) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first+time.Minute), tick) + + clock.BlockUntil(1) + clock.Advance(2 * time.Minute) + + tick = <-ticker.Elapsed() + ticker.Advance(tick) + require.Equal(start.Add(first+3*time.Minute), tick) +} diff --git a/lib/inventory/inventory.go b/lib/inventory/inventory.go index b50ee56e83fcc..2e4f38e1e39d0 100644 --- a/lib/inventory/inventory.go +++ b/lib/inventory/inventory.go @@ -34,7 +34,6 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/inventory/metadata" "github.com/gravitational/teleport/lib/utils" - "github.com/gravitational/teleport/lib/utils/interval" vc "github.com/gravitational/teleport/lib/versioncontrol" ) @@ -401,11 +400,6 @@ type UpstreamHandle interface { // for an explanation of how this system works. VisitInstanceState(func(ref InstanceStateRef) InstanceStateUpdate) - // HeartbeatInstance triggers an early instance heartbeat. This function does not - // wait for the instance heartbeat to actually be completed, so calling this and then - // immediately locking the instanceStateTracker will likely result in observing the - // pre-heartbeat state. - HeartbeatInstance() // UpdateLabels updates the labels on the instance. UpdateLabels(ctx context.Context, kind proto.LabelUpdateKind, labels map[string]string) error } @@ -563,8 +557,6 @@ type upstreamHandle struct { agentMDLock sync.RWMutex agentMetadata proto.UpstreamInventoryAgentMetadata - ticker *interval.MultiInterval[intervalKey] - pingC chan pingRequest stateTracker instanceStateTracker @@ -603,17 +595,12 @@ type heartBeatInfo[T any] struct { keepAliveErrs int } -func (h *upstreamHandle) HeartbeatInstance() { - h.ticker.FireNow(instanceHeartbeatKey) -} - -func newUpstreamHandle(stream client.UpstreamInventoryControlStream, hello proto.UpstreamInventoryHello, ticker *interval.MultiInterval[intervalKey]) *upstreamHandle { +func newUpstreamHandle(stream client.UpstreamInventoryControlStream, hello proto.UpstreamInventoryHello) *upstreamHandle { return &upstreamHandle{ UpstreamInventoryControlStream: stream, pingC: make(chan pingRequest), hello: hello, pings: make(map[uint64]pendingPing), - ticker: ticker, } } diff --git a/lib/utils/interval/duration.go b/lib/utils/interval/duration.go index 644325955b7f3..fbae9656600a7 100644 --- a/lib/utils/interval/duration.go +++ b/lib/utils/interval/duration.go @@ -81,6 +81,12 @@ func (v *VariableDuration) Dec() { v.counter.Add(-1) } +// Add adds to the counter. Can be used with a negative value to reduce the +// counter. +func (v *VariableDuration) Add(n int) { + v.counter.Add(int64(n)) +} + // Count loads the current counter value. func (c *VariableDuration) Count() int64 { return c.counter.Load() diff --git a/lib/utils/interval/duration_test.go b/lib/utils/interval/duration_test.go index f0653ed9b875e..eed1df9cc0d86 100644 --- a/lib/utils/interval/duration_test.go +++ b/lib/utils/interval/duration_test.go @@ -92,40 +92,57 @@ func TestVariableDurationIncDec(t *testing.T) { vd := NewVariableDuration(VariableDurationConfig{}) var wg sync.WaitGroup + start := make(chan struct{}) + wg.Add(100) for i := 0; i < 100; i++ { - wg.Add(1) go func() { defer wg.Done() - vd.Inc() + <-start + if i%2 == 0 { + vd.Inc() + } else { + vd.Add(i) + } }() } + close(start) wg.Wait() - require.Equal(t, int64(100), vd.Count()) - - wg = sync.WaitGroup{} + require.Equal(t, int64(50+50*49+50), vd.Count()) + start = make(chan struct{}) + wg.Add(50) for i := 0; i < 50; i++ { - wg.Add(1) go func() { defer wg.Done() - vd.Dec() + <-start + if i%2 == 0 { + vd.Dec() + } else { + vd.Add(-i) + } }() } + close(start) wg.Wait() - require.Equal(t, int64(50), vd.Count()) + require.Equal(t, int64(50+50*49+50-(25+25*24+25)), vd.Count()) - wg = sync.WaitGroup{} - - for i := 0; i < 50; i++ { - wg.Add(1) + start = make(chan struct{}) + wg.Add(50) + for i := 50; i < 100; i++ { go func() { defer wg.Done() - vd.Dec() + <-start + if i%2 == 0 { + vd.Dec() + } else { + vd.Add(-i) + } }() } + close(start) wg.Wait() require.Equal(t, int64(0), vd.Count()) }