diff --git a/api/client/client.go b/api/client/client.go index 070dd63927b83..bba7826e04c31 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -60,6 +60,7 @@ import ( integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubeproto "github.com/gravitational/teleport/api/gen/proto/go/teleport/kube/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" oktapb "github.com/gravitational/teleport/api/gen/proto/go/teleport/okta/v1" pluginspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" resourceusagepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/resourceusage/v1" @@ -849,6 +850,11 @@ func (c *Client) EmbeddingClient() assist.AssistEmbeddingServiceClient { return assist.NewAssistEmbeddingServiceClient(c.conn) } +// BotServiceClient returns an unadorned client for the bot service. +func (c *Client) BotServiceClient() machineidv1pb.BotServiceClient { + return machineidv1pb.NewBotServiceClient(c.conn) +} + // Ping gets basic info about the auth server. func (c *Client) Ping(ctx context.Context) (proto.PingResponse, error) { rsp, err := c.grpc.Ping(ctx, &proto.PingRequest{}) @@ -1135,7 +1141,11 @@ func (c *Client) CreateResetPasswordToken(ctx context.Context, req *proto.Create } // CreateBot creates a new bot from the specified descriptor. +// +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: use [machineidv1pb.BotServiceClient.CreateBot] instead. func (c *Client) CreateBot(ctx context.Context, req *proto.CreateBotRequest) (*proto.CreateBotResponse, error) { + //nolint:staticcheck // SA1019. Kept for backward compatibility. response, err := c.grpc.CreateBot(ctx, req) if err != nil { return nil, trace.Wrap(err) @@ -1145,7 +1155,11 @@ func (c *Client) CreateBot(ctx context.Context, req *proto.CreateBotRequest) (*p } // DeleteBot deletes a bot and associated resources. +// +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: use [machineidv1pb.BotServiceClient.DeleteBot] instead. func (c *Client) DeleteBot(ctx context.Context, botName string) error { + //nolint:staticcheck // SA1019. Kept for backward compatibility. _, err := c.grpc.DeleteBot(ctx, &proto.DeleteBotRequest{ Name: botName, }) @@ -1153,7 +1167,11 @@ func (c *Client) DeleteBot(ctx context.Context, botName string) error { } // GetBotUsers fetches all bot users. +// +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: use [machineidv1pb.BotServiceClient.ListBots] instead. func (c *Client) GetBotUsers(ctx context.Context) ([]types.User, error) { + //nolint:staticcheck // SA1019. Kept for backward compatibility. stream, err := c.grpc.GetBotUsers(ctx, &proto.GetBotUsersRequest{}) if err != nil { return nil, trace.Wrap(err) diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index e8526cbd4ea07..284ef92c81317 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -15209,247 +15209,247 @@ func init() { var fileDescriptor_0ffcffcda38ae159 = []byte{ // 13739 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x6c, 0x5c, 0x49, - 0x7a, 0x18, 0xcc, 0x6e, 0x92, 0x22, 0xf9, 0xf1, 0xd6, 0x2a, 0x92, 0x22, 0xd5, 0xa2, 0xd4, 0xd2, - 0xd1, 0x48, 0xa3, 0xd1, 0xee, 0xea, 0x42, 0xcd, 0xcc, 0xce, 0x7d, 0xb6, 0xbb, 0x49, 0x91, 0x94, - 0x78, 0xe9, 0x39, 0xcd, 0xcb, 0xcc, 0xee, 0x78, 0x7b, 0x0f, 0xbb, 0x4b, 0xe4, 0xf9, 0xd5, 0x3c, - 0xa7, 0xf7, 0x9c, 0xd3, 0xba, 0xac, 0x7f, 0xfb, 0xff, 0x1d, 0x27, 0x46, 0x5e, 0xe2, 0x38, 0x80, - 0x1d, 0xd8, 0x88, 0x01, 0x27, 0x48, 0x02, 0x24, 0x01, 0x02, 0xf8, 0x25, 0xf0, 0x43, 0x9e, 0x82, - 0x04, 0xc8, 0x26, 0x80, 0x81, 0x00, 0x76, 0x10, 0x20, 0x0f, 0x74, 0xbc, 0x40, 0x5e, 0x08, 0xfb, - 0x21, 0x08, 0x92, 0x20, 0x0b, 0x04, 0x08, 0xea, 0x7a, 0xaa, 0xce, 0xad, 0x9b, 0x92, 0x66, 0x93, - 0x17, 0x89, 0x5d, 0xf5, 0x7d, 0x5f, 0x55, 0x7d, 0x55, 0xa7, 0xea, 0xab, 0xaf, 0xbe, 0x0b, 0xdc, - 0x09, 0x70, 0x1b, 0x77, 0x5c, 0x2f, 0xb8, 0xdb, 0xc6, 0x87, 0x56, 0xf3, 0xe5, 0xdd, 0x66, 0xdb, - 0xc6, 0x4e, 0x70, 0xb7, 0xe3, 0xb9, 0x81, 0x7b, 0xd7, 0xea, 0x06, 0x47, 0x3e, 0xf6, 0x9e, 0xd9, - 0x4d, 0x7c, 0x87, 0x96, 0xa0, 0x61, 0xfa, 0x5f, 0x71, 0xf6, 0xd0, 0x3d, 0x74, 0x19, 0x0c, 0xf9, - 0x8b, 0x55, 0x16, 0x2f, 0x1d, 0xba, 0xee, 0x61, 0x1b, 0x33, 0xe4, 0x83, 0xee, 0x93, 0xbb, 0xf8, - 0xb8, 0x13, 0xbc, 0xe4, 0x95, 0xa5, 0x68, 0x65, 0x60, 0x1f, 0x63, 0x3f, 0xb0, 0x8e, 0x3b, 0x1c, - 0xe0, 0x1d, 0xd9, 0x15, 0x2b, 0x08, 0x48, 0x4d, 0x60, 0xbb, 0xce, 0xdd, 0x67, 0xf7, 0xd5, 0x9f, - 0x1c, 0xf4, 0x56, 0x66, 0xaf, 0x9b, 0xd8, 0x0b, 0xfc, 0xbe, 0x20, 0xf1, 0x33, 0xec, 0x04, 0xb1, - 0xe6, 0x39, 0x64, 0xf0, 0xb2, 0x83, 0x7d, 0x06, 0x22, 0xfe, 0xe3, 0xa0, 0xd7, 0x92, 0x41, 0xe9, - 0xbf, 0x1c, 0xe4, 0x3b, 0xc9, 0x20, 0xcf, 0xf1, 0x01, 0xe1, 0xa9, 0x23, 0xff, 0xe8, 0x01, 0xee, - 0x59, 0x9d, 0x0e, 0xf6, 0xc2, 0x3f, 0x62, 0x7d, 0xed, 0xfa, 0xd6, 0x21, 0xe6, 0x7d, 0x7c, 0x76, - 0x5f, 0xfd, 0xc9, 0x40, 0x8d, 0x3f, 0xc8, 0xc1, 0xf0, 0xbe, 0x15, 0x34, 0x8f, 0xd0, 0xe7, 0x30, - 0xfc, 0xd8, 0x76, 0x5a, 0xfe, 0x42, 0xee, 0xea, 0xe0, 0xad, 0xf1, 0xa5, 0xc2, 0x1d, 0xd6, 0x5f, - 0x5a, 0x49, 0x2a, 0x2a, 0xf3, 0x3f, 0x3d, 0x29, 0x0d, 0x9c, 0x9e, 0x94, 0xa6, 0x9f, 0x12, 0xb0, - 0x6f, 0xbb, 0xc7, 0x76, 0x40, 0x27, 0xd0, 0x64, 0x78, 0x68, 0x17, 0x66, 0xca, 0xed, 0xb6, 0xfb, - 0xbc, 0x66, 0x79, 0x81, 0x6d, 0xb5, 0xeb, 0xdd, 0x66, 0x13, 0xfb, 0xfe, 0x42, 0xfe, 0x6a, 0xee, - 0xd6, 0x68, 0xe5, 0xfa, 0xe9, 0x49, 0xa9, 0x64, 0x91, 0xea, 0x46, 0x87, 0xd5, 0x37, 0x7c, 0x06, - 0xa0, 0x10, 0x4a, 0xc2, 0x37, 0xfe, 0x62, 0x18, 0x0a, 0x6b, 0xae, 0x1f, 0x54, 0xc9, 0xb4, 0x99, - 0xf8, 0xc7, 0x5d, 0xec, 0x07, 0xe8, 0x3a, 0x9c, 0x23, 0x65, 0xeb, 0xcb, 0x0b, 0xb9, 0xab, 0xb9, - 0x5b, 0x63, 0x95, 0xf1, 0xd3, 0x93, 0xd2, 0xc8, 0x91, 0xeb, 0x07, 0x0d, 0xbb, 0x65, 0xf2, 0x2a, - 0xf4, 0x0e, 0x8c, 0x6e, 0xb9, 0x2d, 0xbc, 0x65, 0x1d, 0x63, 0xda, 0x8b, 0xb1, 0xca, 0xe4, 0xe9, - 0x49, 0x69, 0xcc, 0x71, 0x5b, 0xb8, 0xe1, 0x58, 0xc7, 0xd8, 0x94, 0xd5, 0x68, 0x0f, 0x86, 0x4c, - 0xb7, 0x8d, 0x17, 0x06, 0x29, 0x58, 0xe5, 0xf4, 0xa4, 0x34, 0xe4, 0xb9, 0x6d, 0xfc, 0xf3, 0x93, - 0xd2, 0xfb, 0x87, 0x76, 0x70, 0xd4, 0x3d, 0xb8, 0xd3, 0x74, 0x8f, 0xef, 0x1e, 0x7a, 0xd6, 0x33, - 0x9b, 0xad, 0x34, 0xab, 0x7d, 0x37, 0x5c, 0x8f, 0x1d, 0x9b, 0x4f, 0x6e, 0xfd, 0xa5, 0x1f, 0xe0, - 0x63, 0x42, 0xc9, 0xa4, 0xf4, 0xd0, 0x3e, 0xcc, 0x96, 0x5b, 0x2d, 0x9b, 0x61, 0xd4, 0x3c, 0xdb, - 0x69, 0xda, 0x1d, 0xab, 0xed, 0x2f, 0x0c, 0x5d, 0x1d, 0xbc, 0x35, 0xc6, 0x99, 0x22, 0xeb, 0x1b, - 0x1d, 0x09, 0xa0, 0x30, 0x25, 0x91, 0x00, 0x7a, 0x00, 0xa3, 0xcb, 0x5b, 0x75, 0xd2, 0x77, 0x7f, - 0x61, 0x98, 0x12, 0x9b, 0x3f, 0x3d, 0x29, 0xcd, 0xb4, 0x1c, 0x9f, 0x0e, 0x4d, 0x25, 0x20, 0x01, - 0xd1, 0xfb, 0x30, 0x51, 0xeb, 0x1e, 0xb4, 0xed, 0xe6, 0xce, 0x46, 0xfd, 0x31, 0x7e, 0xb9, 0x70, - 0xee, 0x6a, 0xee, 0xd6, 0x44, 0x05, 0x9d, 0x9e, 0x94, 0xa6, 0x3a, 0xb4, 0xbc, 0x11, 0xb4, 0xfd, - 0xc6, 0x53, 0xfc, 0xd2, 0xd4, 0xe0, 0x42, 0xbc, 0x7a, 0x7d, 0x8d, 0xe0, 0x8d, 0xc4, 0xf0, 0x7c, - 0xff, 0x48, 0xc5, 0x63, 0x70, 0xe8, 0x2e, 0x80, 0x89, 0x8f, 0xdd, 0x00, 0x97, 0x5b, 0x2d, 0x6f, - 0x61, 0x94, 0xf2, 0x76, 0xfa, 0xf4, 0xa4, 0x34, 0xee, 0xd1, 0xd2, 0x86, 0xd5, 0x6a, 0x79, 0xa6, - 0x02, 0x82, 0xaa, 0x30, 0x6a, 0xba, 0x8c, 0xc1, 0x0b, 0x63, 0x57, 0x73, 0xb7, 0xc6, 0x97, 0xa6, - 0xf9, 0x32, 0x14, 0xc5, 0x95, 0x0b, 0xa7, 0x27, 0x25, 0xe4, 0xf1, 0x5f, 0xea, 0x28, 0x05, 0x04, - 0x2a, 0xc1, 0xc8, 0x96, 0x5b, 0xb5, 0x9a, 0x47, 0x78, 0x01, 0xe8, 0xda, 0x1b, 0x3e, 0x3d, 0x29, - 0xe5, 0xbe, 0x63, 0x8a, 0x52, 0xf4, 0x0c, 0xc6, 0xc3, 0x89, 0xf2, 0x17, 0xc6, 0x29, 0xfb, 0x76, - 0x4e, 0x4f, 0x4a, 0x17, 0x7c, 0x5a, 0xdc, 0x20, 0x53, 0xaf, 0x70, 0xf0, 0x35, 0x56, 0x81, 0xda, - 0xd0, 0xa3, 0xa1, 0xd1, 0x89, 0xc2, 0xa4, 0x79, 0x79, 0xd7, 0xf1, 0x03, 0xeb, 0xa0, 0x8d, 0xc3, - 0xaa, 0xb2, 0xef, 0x63, 0x8f, 0xd0, 0x5b, 0x5f, 0x36, 0xfe, 0x57, 0x0e, 0xd0, 0x76, 0x07, 0x3b, - 0xf5, 0xfa, 0x1a, 0x59, 0xf1, 0x62, 0xc1, 0x7f, 0x1b, 0xc6, 0x18, 0x6b, 0x09, 0xff, 0xf3, 0x94, - 0xff, 0x53, 0xa7, 0x27, 0x25, 0xe0, 0xfc, 0x27, 0xbc, 0x0f, 0x01, 0xd0, 0x0d, 0x18, 0xdc, 0xd9, - 0xd9, 0xa0, 0xab, 0x79, 0xb0, 0x32, 0x73, 0x7a, 0x52, 0x1a, 0x0c, 0x82, 0xf6, 0xcf, 0x4f, 0x4a, - 0xa3, 0xcb, 0x5d, 0x8f, 0x76, 0xdc, 0x24, 0xf5, 0xe8, 0x06, 0x8c, 0x54, 0xdb, 0x5d, 0x3f, 0xc0, - 0xde, 0xc2, 0x50, 0xf8, 0x19, 0x35, 0x59, 0x91, 0x29, 0xea, 0xd0, 0xb7, 0x60, 0x68, 0xd7, 0xc7, - 0xde, 0xc2, 0x30, 0x9d, 0x91, 0x49, 0x3e, 0x23, 0xa4, 0x68, 0x6f, 0xa9, 0x32, 0x4a, 0xbe, 0x95, - 0xae, 0x8f, 0x3d, 0x93, 0x02, 0xa1, 0x3b, 0x30, 0xcc, 0xd8, 0x7a, 0x8e, 0x6e, 0x23, 0x93, 0x72, - 0xfe, 0xda, 0x78, 0xef, 0xfd, 0xca, 0xd8, 0xe9, 0x49, 0x69, 0x98, 0xb2, 0xd7, 0x1c, 0x16, 0x4c, - 0xc9, 0x15, 0xf2, 0xe6, 0x28, 0xc1, 0x25, 0x0b, 0xd7, 0xf8, 0x16, 0x8c, 0x2b, 0xc3, 0x47, 0x8b, - 0x30, 0x44, 0xfe, 0xa7, 0x9f, 0xf9, 0x04, 0x6b, 0x8c, 0xec, 0xdf, 0x26, 0x2d, 0x35, 0x7e, 0x7f, - 0x1a, 0x0a, 0x04, 0x53, 0xdb, 0x1b, 0x34, 0x56, 0xe5, 0x7a, 0xb1, 0xea, 0x16, 0xc8, 0xb6, 0xf9, - 0x26, 0x31, 0x71, 0x7a, 0x52, 0x1a, 0xed, 0xf2, 0xb2, 0xb0, 0x67, 0xa8, 0x0e, 0x23, 0x2b, 0x2f, - 0x3a, 0xb6, 0x87, 0x7d, 0xca, 0xd8, 0xf1, 0xa5, 0xe2, 0x1d, 0x76, 0x66, 0xdd, 0x11, 0x67, 0xd6, - 0x9d, 0x1d, 0x71, 0x66, 0x55, 0x2e, 0xf3, 0xcd, 0xf2, 0x3c, 0x66, 0x28, 0xe1, 0x6a, 0xfa, 0xad, - 0x3f, 0x2b, 0xe5, 0x4c, 0x41, 0x09, 0x7d, 0x1b, 0xce, 0x3d, 0x74, 0xbd, 0x63, 0x2b, 0xe0, 0x33, - 0x30, 0x7b, 0x7a, 0x52, 0x2a, 0x3c, 0xa1, 0x25, 0xca, 0xe2, 0xe6, 0x30, 0xe8, 0x21, 0x4c, 0x99, - 0x6e, 0x37, 0xc0, 0x3b, 0xae, 0x98, 0xb7, 0x61, 0x8a, 0x75, 0xe5, 0xf4, 0xa4, 0x54, 0xf4, 0x48, - 0x4d, 0x23, 0x70, 0x1b, 0x7c, 0x02, 0x15, 0xfc, 0x08, 0x16, 0x5a, 0x81, 0xa9, 0x32, 0xdd, 0x5d, - 0x39, 0xcf, 0xd8, 0x6c, 0x8d, 0x55, 0x2e, 0x9f, 0x9e, 0x94, 0x2e, 0x5a, 0xb4, 0xa6, 0xe1, 0xf1, - 0x2a, 0x95, 0x8c, 0x8e, 0x84, 0xb6, 0xe0, 0xfc, 0xe3, 0xee, 0x01, 0xf6, 0x1c, 0x1c, 0x60, 0x5f, - 0xf4, 0x68, 0x84, 0xf6, 0xe8, 0xea, 0xe9, 0x49, 0x69, 0xf1, 0xa9, 0xac, 0x4c, 0xe8, 0x53, 0x1c, - 0x15, 0x61, 0x98, 0xe6, 0x1d, 0x5d, 0xb6, 0x02, 0xeb, 0xc0, 0xf2, 0x31, 0xdd, 0x34, 0xc6, 0x97, - 0x2e, 0x30, 0x16, 0xdf, 0x89, 0xd4, 0x56, 0xae, 0x73, 0x2e, 0x5f, 0x92, 0x63, 0x6f, 0xf1, 0x2a, - 0xa5, 0xa1, 0x28, 0x4d, 0xb2, 0x77, 0xca, 0x73, 0x61, 0x8c, 0xf6, 0x96, 0xee, 0x9d, 0xf2, 0x5c, - 0x50, 0x77, 0x15, 0x79, 0x42, 0x6c, 0xc0, 0xf0, 0x2e, 0x39, 0x3d, 0xe9, 0x9e, 0x32, 0xb5, 0x74, - 0x8d, 0xf7, 0x28, 0xba, 0xfa, 0xee, 0x90, 0x1f, 0x14, 0x90, 0x7e, 0x77, 0xd3, 0xf4, 0xc4, 0x55, - 0xcf, 0x4a, 0x5a, 0x87, 0xbe, 0x00, 0xe0, 0xbd, 0x2a, 0x77, 0x3a, 0x0b, 0xe3, 0x74, 0x90, 0xe7, - 0xf5, 0x41, 0x96, 0x3b, 0x9d, 0xca, 0x15, 0x3e, 0xbe, 0x0b, 0x72, 0x7c, 0x56, 0xa7, 0xa3, 0x50, - 0x53, 0x88, 0xa0, 0xcf, 0x61, 0x82, 0x6e, 0x39, 0x62, 0x46, 0x27, 0xe8, 0x8c, 0x5e, 0x3a, 0x3d, - 0x29, 0xcd, 0x93, 0x0f, 0x2e, 0x69, 0x3e, 0x35, 0x04, 0xf4, 0xab, 0x30, 0xc7, 0xc9, 0xed, 0xdb, - 0x4e, 0xcb, 0x7d, 0xee, 0x2f, 0x63, 0xff, 0x69, 0xe0, 0x76, 0x16, 0x26, 0x69, 0xf7, 0x16, 0xf5, - 0xee, 0xe9, 0x30, 0x95, 0xdb, 0xbc, 0xa7, 0x86, 0xec, 0xe9, 0x73, 0x06, 0xd0, 0x68, 0x31, 0x08, - 0xa5, 0xd9, 0xe4, 0x66, 0xd0, 0x3a, 0x4c, 0xef, 0xfa, 0x58, 0x1b, 0xc3, 0x14, 0xdd, 0xbf, 0x4b, - 0x64, 0x86, 0xbb, 0x3e, 0x6e, 0xa4, 0x8d, 0x23, 0x8a, 0x87, 0x4c, 0x40, 0xcb, 0x9e, 0xdb, 0x89, - 0xac, 0xf1, 0x69, 0xca, 0x11, 0xe3, 0xf4, 0xa4, 0x74, 0xa5, 0xe5, 0xb9, 0x9d, 0x46, 0xfa, 0x42, - 0x4f, 0xc0, 0x46, 0x3f, 0x84, 0x0b, 0x55, 0xd7, 0x71, 0x70, 0x93, 0xec, 0x9f, 0xcb, 0xb6, 0x75, - 0xe8, 0xb8, 0x7e, 0x60, 0x37, 0xd7, 0x97, 0x17, 0x0a, 0x74, 0x0d, 0xdd, 0x24, 0xa3, 0x6f, 0x4a, - 0x88, 0x46, 0x4b, 0x82, 0x34, 0xec, 0x96, 0x42, 0x3b, 0x85, 0x0a, 0xfa, 0x01, 0x4c, 0xf2, 0xb6, - 0xb0, 0x47, 0x97, 0xe6, 0xf9, 0xec, 0x85, 0x26, 0x81, 0xd9, 0x41, 0xec, 0x89, 0x9f, 0x4c, 0xb4, - 0xd1, 0x69, 0xa1, 0xaf, 0x61, 0x7c, 0xf3, 0x61, 0xd9, 0xc4, 0x7e, 0xc7, 0x75, 0x7c, 0xbc, 0x80, - 0xe8, 0x8c, 0x5e, 0xe1, 0xa4, 0x37, 0x1f, 0x96, 0xcb, 0xdd, 0xe0, 0x08, 0x3b, 0x81, 0xdd, 0xb4, - 0x02, 0x2c, 0xa0, 0x2a, 0x45, 0xb2, 0xf2, 0x8e, 0x9f, 0x58, 0x0d, 0x8f, 0x97, 0x28, 0xa3, 0x50, - 0xc9, 0xa1, 0x22, 0x8c, 0xd6, 0xeb, 0x6b, 0x1b, 0xee, 0xa1, 0xed, 0x2c, 0xcc, 0x10, 0x66, 0x98, - 0xf2, 0x37, 0x3a, 0x80, 0x39, 0x45, 0x40, 0x6f, 0x90, 0xff, 0xf1, 0x31, 0x76, 0x82, 0x85, 0x59, - 0xda, 0x87, 0xef, 0xc8, 0x1b, 0xc6, 0x1d, 0x55, 0x8e, 0x7f, 0x76, 0xff, 0x4e, 0x39, 0xfc, 0x59, - 0x17, 0x48, 0xe6, 0xac, 0x95, 0x50, 0x8a, 0x76, 0x60, 0xa4, 0xd6, 0xf5, 0x3a, 0xae, 0x8f, 0x17, - 0xe6, 0x28, 0xd3, 0xae, 0x67, 0x7d, 0x9d, 0x1c, 0xb4, 0x32, 0x47, 0xb6, 0xe7, 0x0e, 0xfb, 0xa1, - 0x8c, 0x4c, 0x90, 0x32, 0xbe, 0x84, 0x31, 0xf9, 0x31, 0xa3, 0x11, 0x18, 0x2c, 0xb7, 0xdb, 0x85, - 0x01, 0xf2, 0x47, 0xbd, 0xbe, 0x56, 0xc8, 0xa1, 0x29, 0x80, 0x70, 0x07, 0x2b, 0xe4, 0xd1, 0x04, - 0x8c, 0x8a, 0x1d, 0xa6, 0x30, 0x48, 0xe1, 0x3b, 0x9d, 0xc2, 0x10, 0x42, 0x30, 0xa5, 0xaf, 0xf3, - 0xc2, 0xb0, 0xf1, 0x02, 0xc6, 0xe4, 0xf4, 0xa0, 0x69, 0x18, 0xdf, 0xdd, 0xaa, 0xd7, 0x56, 0xaa, - 0xeb, 0x0f, 0xd7, 0x57, 0x96, 0x0b, 0x03, 0xe8, 0x32, 0x5c, 0xdc, 0xa9, 0xaf, 0x35, 0x96, 0x2b, - 0x8d, 0x8d, 0xed, 0x6a, 0x79, 0xa3, 0x51, 0x33, 0xb7, 0xbf, 0xfc, 0xaa, 0xb1, 0xb3, 0xbb, 0xb5, - 0xb5, 0xb2, 0x51, 0xc8, 0xa1, 0x05, 0x98, 0x25, 0xd5, 0x8f, 0x77, 0x2b, 0x2b, 0x2a, 0x40, 0x21, - 0x8f, 0xae, 0xc1, 0xe5, 0xa4, 0x9a, 0xc6, 0xda, 0x4a, 0x79, 0x79, 0x63, 0xa5, 0x5e, 0x2f, 0x0c, - 0x1a, 0x6d, 0x18, 0x57, 0x58, 0x80, 0x16, 0x61, 0xa1, 0xba, 0x62, 0xee, 0x34, 0x6a, 0xbb, 0x66, - 0x6d, 0xbb, 0xbe, 0xd2, 0xd0, 0x3b, 0x12, 0xad, 0xdd, 0xd8, 0x5e, 0x5d, 0xdf, 0x6a, 0x90, 0xa2, - 0x7a, 0x21, 0x47, 0x5a, 0xd3, 0x6a, 0xeb, 0xeb, 0x5b, 0xab, 0x1b, 0x2b, 0x8d, 0xdd, 0xfa, 0x0a, - 0x07, 0xc9, 0x1b, 0xff, 0x21, 0x17, 0xdb, 0xd0, 0xd1, 0x12, 0x8c, 0xd7, 0xd9, 0x95, 0x91, 0x2e, - 0x72, 0x26, 0xbe, 0x17, 0x4e, 0x4f, 0x4a, 0x13, 0xfc, 0x26, 0xc9, 0xd6, 0xaf, 0x0a, 0x44, 0xce, - 0xe8, 0x1a, 0x99, 0xcf, 0xa6, 0xdb, 0x56, 0xcf, 0xe8, 0x0e, 0x2f, 0x33, 0x65, 0x2d, 0x5a, 0x52, - 0x4e, 0x73, 0x26, 0xcb, 0x53, 0x79, 0x51, 0x9c, 0xe6, 0xea, 0xce, 0x2e, 0xcf, 0xf5, 0xa5, 0x70, - 0xe2, 0xf8, 0x21, 0x4c, 0x71, 0x12, 0x4e, 0x12, 0x09, 0x67, 0x74, 0x53, 0xf6, 0x4a, 0xf4, 0x71, - 0x74, 0xba, 0xf9, 0x08, 0xe9, 0x61, 0x10, 0xd9, 0x12, 0xcd, 0x08, 0x28, 0x2a, 0xc1, 0x30, 0xfb, - 0x88, 0xd8, 0x20, 0xa9, 0xb0, 0xd4, 0x26, 0x05, 0x26, 0x2b, 0x37, 0x7e, 0x73, 0x50, 0x3d, 0x37, - 0x88, 0x70, 0xa4, 0x30, 0x91, 0x0a, 0x47, 0x94, 0x79, 0xb4, 0x94, 0xc8, 0x41, 0x75, 0xec, 0xfb, - 0x54, 0xac, 0xe4, 0x14, 0xa9, 0x1c, 0xe4, 0xb3, 0x42, 0x72, 0x53, 0x0a, 0x01, 0x88, 0xac, 0xce, - 0x84, 0x22, 0x2a, 0xab, 0x0f, 0x86, 0xb2, 0x3a, 0x17, 0x9b, 0x98, 0xac, 0x1e, 0x82, 0x90, 0x89, - 0xe4, 0xe7, 0x36, 0xed, 0xc3, 0x50, 0x38, 0x91, 0xfc, 0xac, 0xe7, 0x13, 0xa9, 0x00, 0xa1, 0x8f, - 0x00, 0xca, 0xfb, 0x75, 0x2a, 0xf2, 0x9a, 0x5b, 0x5c, 0x76, 0xa1, 0xbb, 0x8c, 0xf5, 0xdc, 0x67, - 0xbb, 0xbb, 0xe5, 0xa9, 0x42, 0xbd, 0x02, 0x8d, 0x2a, 0x30, 0x59, 0xfe, 0x49, 0xd7, 0xc3, 0xeb, - 0x2d, 0xb2, 0x51, 0x05, 0xec, 0xf6, 0x32, 0x56, 0x59, 0x3c, 0x3d, 0x29, 0x2d, 0x58, 0xa4, 0xa2, - 0x61, 0xf3, 0x1a, 0x85, 0x80, 0x8e, 0x82, 0xb6, 0xe1, 0xfc, 0x6a, 0xb5, 0xc6, 0x97, 0x56, 0xb9, - 0xd9, 0x74, 0xbb, 0x4e, 0xc0, 0x05, 0x96, 0x6b, 0xa7, 0x27, 0xa5, 0xcb, 0x87, 0xcd, 0x4e, 0x43, - 0x2c, 0x43, 0x8b, 0x55, 0xab, 0x12, 0x4b, 0x0c, 0xd7, 0x68, 0xc3, 0xd4, 0x2a, 0x0e, 0xc8, 0x52, - 0x12, 0xd2, 0x67, 0xf6, 0x9c, 0x7c, 0x02, 0xe3, 0xfb, 0x76, 0x70, 0x54, 0xc7, 0x4d, 0x0f, 0x07, - 0xe2, 0x6e, 0x4c, 0x39, 0xf0, 0xdc, 0x0e, 0x8e, 0x1a, 0x3e, 0x2b, 0x57, 0xf7, 0x59, 0x05, 0xdc, - 0x58, 0x81, 0x69, 0xde, 0x9a, 0x14, 0x76, 0x97, 0x74, 0x82, 0x39, 0x4a, 0x90, 0xce, 0x82, 0x4a, - 0x50, 0x27, 0xf3, 0xcf, 0xf2, 0x30, 0x57, 0x3d, 0xb2, 0x9c, 0x43, 0x5c, 0xb3, 0x7c, 0xff, 0xb9, - 0xeb, 0xb5, 0x94, 0xce, 0x53, 0x49, 0x3f, 0xd6, 0x79, 0x2a, 0xda, 0x2f, 0xc1, 0xf8, 0x76, 0xbb, - 0x25, 0x70, 0xf8, 0x2d, 0x84, 0xb6, 0xe5, 0xb6, 0x5b, 0x8d, 0x8e, 0xa0, 0xa5, 0x02, 0x11, 0x9c, - 0x2d, 0xfc, 0x5c, 0xe2, 0x0c, 0x86, 0x38, 0x0e, 0x7e, 0xae, 0xe0, 0x28, 0x40, 0x68, 0x05, 0xce, - 0xd7, 0x71, 0xd3, 0x75, 0x5a, 0x0f, 0xad, 0x66, 0xe0, 0x7a, 0x3b, 0xee, 0x53, 0xec, 0xf0, 0xf5, - 0x45, 0x05, 0x35, 0x9f, 0x56, 0x36, 0x9e, 0xd0, 0xda, 0x46, 0x40, 0xaa, 0xcd, 0x38, 0x06, 0xda, - 0x86, 0xd1, 0x7d, 0xae, 0x46, 0xe1, 0x57, 0x97, 0x1b, 0x77, 0xa4, 0x5e, 0xa5, 0xea, 0x61, 0xba, - 0x28, 0xac, 0xb6, 0xbc, 0x7c, 0xc9, 0x73, 0x8f, 0x6e, 0x2e, 0x02, 0xd2, 0x94, 0x44, 0x8c, 0x5d, - 0x98, 0xac, 0xb5, 0xbb, 0x87, 0xb6, 0x43, 0xb6, 0x81, 0x3a, 0xfe, 0x31, 0x5a, 0x06, 0x08, 0x0b, - 0xb8, 0xde, 0x64, 0x86, 0x5f, 0x78, 0xc2, 0x8a, 0xbd, 0x07, 0xfc, 0x43, 0xa2, 0x25, 0x54, 0x42, - 0x35, 0x15, 0x3c, 0xe3, 0x7f, 0x0e, 0x02, 0xe2, 0x13, 0x40, 0x8f, 0xb4, 0x3a, 0x0e, 0xc8, 0xb9, - 0x70, 0x01, 0xf2, 0x52, 0xbd, 0x71, 0xee, 0xf4, 0xa4, 0x94, 0xb7, 0x5b, 0x66, 0x7e, 0x7d, 0x19, - 0xbd, 0x0b, 0xc3, 0x14, 0x8c, 0xf2, 0x7f, 0x4a, 0xb6, 0xa7, 0x52, 0x60, 0x3b, 0x07, 0x3d, 0x6a, - 0x4d, 0x06, 0x8c, 0xde, 0x83, 0xb1, 0x65, 0xdc, 0xc6, 0x87, 0x56, 0xe0, 0x8a, 0xaf, 0x9b, 0x29, - 0x0c, 0x44, 0xa1, 0xb2, 0xe6, 0x42, 0x48, 0x72, 0x3d, 0x31, 0xb1, 0xe5, 0xbb, 0x8e, 0x7a, 0x3d, - 0xf1, 0x68, 0x89, 0x7a, 0x3d, 0x61, 0x30, 0xe8, 0x77, 0x72, 0x30, 0x5e, 0x76, 0x1c, 0x7e, 0x11, - 0xf7, 0x39, 0xd7, 0xe7, 0xee, 0x48, 0xf5, 0xd4, 0x86, 0x75, 0x80, 0xdb, 0x7b, 0x56, 0xbb, 0x8b, - 0xfd, 0xca, 0xd7, 0x44, 0x62, 0xfc, 0x8f, 0x27, 0xa5, 0x8f, 0xcf, 0x70, 0xb5, 0x0e, 0x15, 0x5d, - 0x3b, 0x9e, 0x65, 0x07, 0xfe, 0xe9, 0x49, 0x69, 0xce, 0x0a, 0x1b, 0x54, 0xbf, 0x1b, 0xa5, 0x1f, - 0xe8, 0x1d, 0xf5, 0x4e, 0xca, 0xf7, 0xe2, 0xc8, 0x1d, 0x9f, 0x5f, 0x47, 0xd1, 0x31, 0x4c, 0x97, - 0x7d, 0xbf, 0x7b, 0x8c, 0xeb, 0x81, 0xe5, 0x05, 0xe4, 0x3e, 0x47, 0xf7, 0x87, 0xec, 0xcb, 0xde, - 0xdb, 0x3f, 0x3d, 0x29, 0xe5, 0x88, 0x90, 0x6a, 0x51, 0x54, 0x22, 0xe4, 0x78, 0x41, 0x23, 0xb0, - 0xd5, 0x03, 0x87, 0x5e, 0xfb, 0xa2, 0xb4, 0x8d, 0xeb, 0x52, 0x12, 0x58, 0x5f, 0x4e, 0x9b, 0x71, - 0xa3, 0x0a, 0x8b, 0xab, 0x38, 0x30, 0xb1, 0x8f, 0x03, 0xf1, 0x8d, 0xd0, 0x15, 0x1e, 0x2a, 0xc3, - 0x46, 0xe8, 0x6f, 0x89, 0x4c, 0xa7, 0x9f, 0x7d, 0x17, 0xa2, 0xc6, 0xf8, 0xab, 0x39, 0x28, 0x55, - 0x3d, 0xcc, 0xe4, 0xbb, 0x14, 0x42, 0xd9, 0x7b, 0xd7, 0x22, 0x0c, 0xed, 0xbc, 0xec, 0x88, 0x5b, - 0x32, 0xad, 0x25, 0x93, 0x62, 0xd2, 0xd2, 0x3e, 0x55, 0x0e, 0xc6, 0x13, 0x98, 0x33, 0xb1, 0x83, - 0x9f, 0x5b, 0x07, 0x6d, 0xac, 0xdd, 0xda, 0x4b, 0x30, 0xcc, 0x3e, 0xf4, 0xd8, 0x10, 0x58, 0xf9, - 0xd9, 0x34, 0x20, 0xc6, 0x3f, 0xce, 0x43, 0x81, 0x0d, 0xb7, 0xe2, 0x06, 0xfd, 0x8d, 0x8f, 0x8f, - 0x20, 0xdf, 0x43, 0x69, 0x72, 0x33, 0xe4, 0xf6, 0x60, 0x28, 0x8b, 0xd0, 0xae, 0x92, 0x23, 0x55, - 0x54, 0x92, 0x01, 0xb1, 0x45, 0xc7, 0x74, 0x7d, 0x31, 0xcd, 0x07, 0xfa, 0x8d, 0x1c, 0x9c, 0x63, - 0xcb, 0x38, 0xfb, 0x43, 0xd9, 0x7f, 0x33, 0x1f, 0x4a, 0x21, 0xa0, 0x7f, 0xa9, 0x9f, 0x2d, 0xab, - 0x33, 0xfe, 0x69, 0x1e, 0xce, 0x2b, 0xbc, 0xe2, 0x42, 0xfd, 0x3b, 0x4c, 0x94, 0x52, 0x18, 0x46, - 0xb5, 0xa7, 0x44, 0x94, 0x6a, 0x84, 0x9a, 0x11, 0xca, 0xb9, 0x77, 0x60, 0x94, 0x0c, 0x29, 0xaa, - 0x68, 0xa5, 0x07, 0x3a, 0x03, 0x15, 0xd5, 0x7d, 0x73, 0xef, 0x2e, 0x8c, 0xd2, 0x3f, 0xc9, 0x8c, - 0x0c, 0xa5, 0xcf, 0x88, 0x04, 0x42, 0x36, 0xc0, 0x23, 0xd7, 0x76, 0x36, 0x71, 0x70, 0xe4, 0xb6, - 0xb8, 0x68, 0xb1, 0x4e, 0xb6, 0xdd, 0xff, 0xc7, 0xb5, 0x9d, 0xc6, 0x31, 0x2d, 0x3e, 0xab, 0x22, - 0x2f, 0x24, 0x68, 0x2a, 0xc4, 0x8d, 0x7b, 0x50, 0x20, 0x3b, 0x64, 0xff, 0x4b, 0xcb, 0x98, 0x05, - 0xb4, 0x8a, 0x83, 0x8a, 0xab, 0x9d, 0xdd, 0xc6, 0x24, 0x8c, 0xd7, 0x6c, 0xe7, 0x50, 0xfc, 0xfc, - 0xc3, 0x41, 0x98, 0x60, 0xbf, 0xf9, 0x0c, 0x44, 0x24, 0xac, 0x5c, 0x3f, 0x12, 0xd6, 0x07, 0x30, - 0x49, 0x44, 0x14, 0xec, 0xed, 0x61, 0x8f, 0x48, 0x76, 0x7c, 0x3e, 0xe8, 0x15, 0xd1, 0xa7, 0x15, - 0x8d, 0x67, 0xac, 0xc6, 0xd4, 0x01, 0xd1, 0x06, 0x4c, 0xb1, 0x82, 0x87, 0xd8, 0x0a, 0xba, 0xa1, - 0x96, 0x6b, 0x9a, 0xdf, 0xa5, 0x44, 0x31, 0xdb, 0x3e, 0x39, 0xad, 0x27, 0xbc, 0xd0, 0x8c, 0xe0, - 0xa2, 0xcf, 0x61, 0xba, 0xe6, 0xb9, 0x2f, 0x5e, 0x2a, 0x32, 0x25, 0x3b, 0x41, 0xd8, 0xad, 0x8b, - 0x54, 0x35, 0x54, 0xc9, 0x32, 0x0a, 0x4d, 0xd6, 0xd4, 0xba, 0x5f, 0x71, 0x3d, 0xdb, 0x39, 0xa4, - 0xb3, 0x39, 0xca, 0xd6, 0x94, 0xed, 0x37, 0x0e, 0x68, 0xa1, 0x29, 0xab, 0x23, 0x6a, 0xe6, 0x91, - 0xde, 0x6a, 0xe6, 0x7b, 0x00, 0x1b, 0xae, 0xd5, 0x2a, 0xb7, 0xdb, 0xd5, 0xb2, 0x4f, 0x55, 0x4c, - 0x5c, 0x66, 0x6a, 0xbb, 0x56, 0xab, 0x61, 0xb5, 0xdb, 0x8d, 0xa6, 0xe5, 0x9b, 0x0a, 0xcc, 0xa3, - 0xa1, 0xd1, 0x73, 0x85, 0x11, 0x73, 0x7a, 0xc3, 0x6e, 0x62, 0xc7, 0xc7, 0xfb, 0x96, 0xe7, 0xd8, - 0xce, 0xa1, 0x6f, 0xfc, 0xfe, 0x38, 0x8c, 0xca, 0x21, 0xdf, 0x51, 0x2f, 0x84, 0x5c, 0x12, 0xa3, - 0x3b, 0x54, 0xa8, 0x06, 0x33, 0x15, 0x08, 0x74, 0x91, 0x5e, 0x11, 0xb9, 0x0c, 0x38, 0x42, 0x56, - 0xb7, 0xd5, 0xe9, 0x98, 0xa4, 0x8c, 0x9c, 0x04, 0xcb, 0x15, 0xca, 0xff, 0x51, 0x76, 0x12, 0xb4, - 0x0e, 0xcc, 0xfc, 0x72, 0x85, 0xac, 0xb2, 0xed, 0xf5, 0xe5, 0x2a, 0x65, 0xe5, 0x28, 0x5b, 0x65, - 0xae, 0xdd, 0x6a, 0x9a, 0xb4, 0x94, 0xd4, 0xd6, 0xcb, 0x9b, 0x1b, 0x9c, 0x5d, 0xb4, 0xd6, 0xb7, - 0x8e, 0xdb, 0x26, 0x2d, 0x25, 0x37, 0x13, 0xa6, 0xd1, 0xa8, 0xba, 0x4e, 0xe0, 0xb9, 0x6d, 0x9f, - 0x0a, 0xd0, 0xa3, 0x6c, 0x3a, 0xb9, 0x2a, 0xa4, 0xc9, 0xab, 0xcc, 0x08, 0x28, 0xda, 0x87, 0xf9, - 0x72, 0xeb, 0x99, 0xe5, 0x34, 0x71, 0x8b, 0xd5, 0xec, 0xbb, 0xde, 0xd3, 0x27, 0x6d, 0xf7, 0xb9, - 0x4f, 0xf9, 0x3d, 0xca, 0x35, 0x87, 0x1c, 0x44, 0x68, 0x56, 0x9e, 0x0b, 0x20, 0x33, 0x0d, 0x9b, - 0xec, 0x92, 0xd5, 0xb6, 0xdb, 0x6d, 0xf1, 0x59, 0xa0, 0xbb, 0x64, 0x93, 0x14, 0x98, 0xac, 0x9c, - 0x70, 0x69, 0xad, 0xbe, 0x49, 0xf5, 0x74, 0x9c, 0x4b, 0x47, 0xfe, 0xb1, 0x49, 0xca, 0xd0, 0x0d, - 0x18, 0x11, 0x97, 0x2c, 0xa6, 0xe8, 0xa7, 0xea, 0x6b, 0x71, 0xb9, 0x12, 0x75, 0xe4, 0x93, 0x30, - 0x71, 0xd3, 0x7d, 0x86, 0xbd, 0x97, 0x55, 0xb7, 0x85, 0x85, 0x56, 0x89, 0x6b, 0x4d, 0x58, 0x45, - 0xa3, 0x49, 0x6a, 0x4c, 0x1d, 0x90, 0x34, 0xc0, 0xe4, 0x34, 0x7f, 0x61, 0x3a, 0x6c, 0x80, 0xc9, - 0x71, 0xbe, 0x29, 0xea, 0xd0, 0x32, 0x9c, 0x2f, 0x77, 0x03, 0xf7, 0xd8, 0x0a, 0xec, 0xe6, 0x6e, - 0xe7, 0xd0, 0xb3, 0x48, 0x23, 0x05, 0x8a, 0x40, 0x6f, 0x92, 0x96, 0xa8, 0x6c, 0x74, 0x79, 0xad, - 0x19, 0x47, 0x40, 0xef, 0xc3, 0xc4, 0xba, 0xcf, 0x34, 0x87, 0x96, 0x8f, 0x5b, 0x54, 0xfd, 0xc3, - 0x7b, 0x69, 0xfb, 0x0d, 0xaa, 0x47, 0x6c, 0x90, 0xbb, 0x67, 0xcb, 0xd4, 0xe0, 0x90, 0x01, 0xe7, - 0xca, 0xbe, 0x6f, 0xfb, 0x01, 0xd5, 0xea, 0x8c, 0x56, 0xe0, 0xf4, 0xa4, 0x74, 0xce, 0xa2, 0x25, - 0x26, 0xaf, 0x41, 0xfb, 0x30, 0xbe, 0x8c, 0xc9, 0xbd, 0x65, 0xc7, 0xeb, 0xfa, 0x01, 0xd5, 0xd1, - 0x8c, 0x2f, 0x5d, 0xe4, 0x1f, 0xb6, 0x52, 0xc3, 0xd7, 0x32, 0xbb, 0x91, 0xb4, 0x68, 0x79, 0x23, - 0x20, 0x15, 0xaa, 0x64, 0xa5, 0xc0, 0x93, 0x4b, 0x19, 0xc7, 0x59, 0xb3, 0x5b, 0xe4, 0x53, 0x9d, - 0xa5, 0x7d, 0xa0, 0x97, 0x32, 0xbe, 0x37, 0x34, 0x8e, 0x68, 0x8d, 0x7a, 0x29, 0xd3, 0x50, 0x50, - 0x33, 0xa6, 0x8c, 0x9e, 0xd3, 0x14, 0x8e, 0x7a, 0xa5, 0xe8, 0xe2, 0x19, 0x55, 0xd5, 0x9f, 0xc0, - 0x78, 0xb5, 0xeb, 0x07, 0xee, 0xf1, 0xce, 0x11, 0x3e, 0xc6, 0x0b, 0x17, 0xc2, 0xab, 0x67, 0x93, - 0x16, 0x37, 0x02, 0x52, 0xae, 0x0e, 0x53, 0x01, 0x47, 0x5f, 0x00, 0x12, 0x77, 0xc8, 0x55, 0xb2, - 0x3e, 0x1c, 0xb2, 0x96, 0x17, 0xe6, 0xe9, 0x58, 0xe9, 0xc5, 0x51, 0x5c, 0x3d, 0x1b, 0x87, 0xb2, - 0x5a, 0x55, 0x27, 0xc6, 0x91, 0x49, 0x87, 0x58, 0x17, 0x57, 0x3d, 0xab, 0x73, 0xb4, 0xb0, 0x10, - 0xde, 0x04, 0xf9, 0xa0, 0x0e, 0x49, 0xb9, 0x26, 0xd1, 0x86, 0xe0, 0xa8, 0x0e, 0xc0, 0x7e, 0x6e, - 0x90, 0x89, 0xbf, 0x48, 0xf9, 0xb5, 0xa0, 0xf1, 0x8b, 0x54, 0x08, 0x5e, 0x5d, 0xa4, 0x72, 0x32, - 0x23, 0xdb, 0xb6, 0xb5, 0xd9, 0x54, 0xc8, 0xa0, 0xa7, 0x50, 0x60, 0xbf, 0x36, 0x5d, 0xc7, 0x0e, - 0xd8, 0xd6, 0x5b, 0xd4, 0x34, 0x85, 0xd1, 0x6a, 0xd1, 0x00, 0xd5, 0xd0, 0xf2, 0x06, 0x8e, 0x65, - 0xad, 0xd2, 0x4c, 0x8c, 0x30, 0xaa, 0xc1, 0x78, 0xcd, 0x73, 0x5b, 0xdd, 0x66, 0x40, 0x85, 0xca, - 0x4b, 0xf4, 0x32, 0x83, 0x78, 0x3b, 0x4a, 0x0d, 0xe3, 0x49, 0x87, 0x15, 0x34, 0xc8, 0xb9, 0xac, - 0xf2, 0x44, 0x01, 0x7c, 0x34, 0x34, 0x3a, 0x5e, 0x98, 0x60, 0x8f, 0x6c, 0x8f, 0x86, 0x46, 0x27, - 0x0b, 0x53, 0xc6, 0xef, 0xe6, 0x00, 0xc5, 0x57, 0x37, 0xba, 0x0b, 0x23, 0xd8, 0x21, 0x02, 0x68, - 0x8b, 0xef, 0xd2, 0xf4, 0x4c, 0xe2, 0x45, 0xaa, 0x26, 0x90, 0x17, 0xa1, 0x2f, 0x60, 0x86, 0x7d, - 0x0c, 0xe2, 0x3b, 0x6c, 0xdb, 0xc7, 0x76, 0x40, 0x77, 0xee, 0x61, 0x36, 0xff, 0x09, 0xd5, 0xaa, - 0xe2, 0x80, 0x57, 0xd3, 0xaf, 0x76, 0x83, 0x54, 0x1a, 0x5d, 0x98, 0x4b, 0x5c, 0xd7, 0x68, 0x13, - 0xe6, 0x8e, 0x5d, 0x27, 0x38, 0x6a, 0xbf, 0x14, 0xcb, 0x9a, 0xb7, 0x96, 0xa3, 0xad, 0xd1, 0xa9, - 0x4c, 0x04, 0x30, 0x67, 0x78, 0x31, 0xa7, 0x48, 0xdb, 0x79, 0x34, 0x34, 0x9a, 0x2f, 0x0c, 0xca, - 0x91, 0x18, 0x26, 0x9c, 0x8f, 0x2d, 0x0f, 0xf4, 0x29, 0x4c, 0x34, 0xa9, 0xf8, 0xa7, 0xb5, 0xc4, - 0x3e, 0x0e, 0xa5, 0x5c, 0xe5, 0x3b, 0x2b, 0x67, 0x43, 0xf9, 0x87, 0x39, 0x98, 0x4f, 0x59, 0x18, - 0x67, 0x67, 0xf5, 0x57, 0x70, 0xe1, 0xd8, 0x7a, 0xd1, 0xf0, 0xa8, 0x28, 0xd6, 0xf0, 0x2c, 0x27, - 0xc2, 0xed, 0xb7, 0x4e, 0x4f, 0x4a, 0x57, 0x93, 0x21, 0x54, 0x43, 0x82, 0x63, 0xeb, 0x85, 0x49, - 0x01, 0x4c, 0x52, 0xcf, 0xfa, 0x79, 0x1f, 0xce, 0x33, 0xb1, 0xad, 0x6f, 0x75, 0x8d, 0x51, 0x03, - 0xa8, 0xe3, 0x63, 0xab, 0x73, 0xe4, 0x92, 0x03, 0xbe, 0xa2, 0xfe, 0xe2, 0xd7, 0x7d, 0xc4, 0xaf, - 0xdf, 0xb2, 0x62, 0xef, 0x81, 0xd0, 0xb2, 0x09, 0x48, 0x53, 0xc1, 0x32, 0xfe, 0x38, 0x0f, 0xa8, - 0xdc, 0x6d, 0xd9, 0x41, 0x3d, 0xf0, 0xb0, 0x75, 0x2c, 0xba, 0xf1, 0x21, 0x4c, 0x30, 0x09, 0x9c, - 0x15, 0xd3, 0xee, 0x8c, 0x2f, 0xcd, 0xf0, 0xcf, 0x41, 0xad, 0x5a, 0x1b, 0x30, 0x35, 0x50, 0x82, - 0x6a, 0x62, 0x76, 0xab, 0xa4, 0xa8, 0x79, 0x0d, 0x55, 0xad, 0x22, 0xa8, 0xea, 0x6f, 0xf4, 0x39, - 0x4c, 0x55, 0xdd, 0xe3, 0x0e, 0xe1, 0x09, 0x47, 0x1e, 0xe4, 0x17, 0x11, 0xde, 0xae, 0x56, 0xb9, - 0x36, 0x60, 0x46, 0xc0, 0xd1, 0x16, 0xcc, 0x3c, 0x6c, 0x77, 0xfd, 0xa3, 0xb2, 0xd3, 0xaa, 0xb6, - 0x5d, 0x5f, 0x50, 0x19, 0xe2, 0x37, 0x66, 0x2e, 0x38, 0xc6, 0x21, 0xd6, 0x06, 0xcc, 0x24, 0x44, - 0x74, 0x03, 0x86, 0x57, 0x9e, 0x61, 0x27, 0x90, 0x4f, 0xcd, 0xdc, 0x56, 0x65, 0xdb, 0xc1, 0xdb, - 0x4f, 0xd6, 0x06, 0x4c, 0x56, 0x5b, 0x19, 0x83, 0x11, 0x21, 0x34, 0xdf, 0x25, 0x67, 0xaf, 0x64, - 0x67, 0x3d, 0xb0, 0x82, 0xae, 0x8f, 0x8a, 0x30, 0xba, 0xdb, 0x21, 0xb2, 0x9c, 0xb8, 0x11, 0x9b, - 0xf2, 0xb7, 0xf1, 0x6d, 0x9d, 0xd3, 0x68, 0x51, 0xd5, 0x92, 0x32, 0xe0, 0xb0, 0xc0, 0x58, 0xd3, - 0x99, 0x9b, 0x0d, 0xad, 0xb5, 0x9b, 0x8f, 0xb4, 0x5b, 0x88, 0xf2, 0xda, 0x98, 0x4b, 0x64, 0x9e, - 0xf1, 0x25, 0x5c, 0xd9, 0xed, 0xf8, 0xd8, 0x0b, 0xca, 0x9d, 0x4e, 0xdb, 0x6e, 0xb2, 0xa7, 0x0e, - 0x2a, 0x5c, 0x8b, 0xc5, 0xf2, 0x3e, 0x9c, 0x63, 0x05, 0x7c, 0x99, 0x88, 0x35, 0x58, 0xee, 0x74, - 0xb8, 0x48, 0xff, 0x80, 0x49, 0x01, 0x4c, 0x48, 0x37, 0x39, 0xb4, 0xf1, 0x5b, 0x39, 0xb8, 0xc2, - 0xbe, 0x80, 0x54, 0xd2, 0xdf, 0x82, 0x31, 0x6a, 0x2a, 0xd2, 0xb1, 0x9a, 0xda, 0xad, 0xcf, 0x11, - 0x85, 0x66, 0x58, 0xaf, 0x18, 0xe1, 0xe4, 0xd3, 0x8d, 0x70, 0xc4, 0x07, 0x36, 0x98, 0xf8, 0x81, - 0x7d, 0x01, 0x06, 0xef, 0x51, 0xbb, 0x1d, 0xeb, 0x94, 0xff, 0x2a, 0xbd, 0x32, 0xfe, 0x32, 0x0f, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x6c, 0x1c, 0x49, + 0x96, 0x18, 0xca, 0x2a, 0x92, 0x22, 0x79, 0xf8, 0x2a, 0x05, 0x49, 0x91, 0x2a, 0x51, 0x2a, 0x29, + 0xd5, 0x52, 0xab, 0x35, 0x33, 0x7a, 0x50, 0xdd, 0x3d, 0xfd, 0xee, 0xa9, 0x2a, 0x52, 0x24, 0x25, + 0x3e, 0xaa, 0xb3, 0xf8, 0xe8, 0x9e, 0xe9, 0x9d, 0x9a, 0x64, 0x55, 0x88, 0xcc, 0xab, 0x62, 0x66, + 0x4d, 0x66, 0x96, 0x1e, 0xb3, 0x77, 0xf7, 0xde, 0xf5, 0xda, 0x0b, 0xff, 0x78, 0xbd, 0x06, 0x76, + 0x8d, 0x5d, 0x78, 0x81, 0xb5, 0x61, 0x1b, 0xb0, 0x0d, 0x18, 0xd8, 0x1f, 0x63, 0x3f, 0xfc, 0x65, + 0xd8, 0x80, 0xc7, 0x06, 0x16, 0x30, 0xb0, 0x6b, 0x18, 0xf0, 0x07, 0xd7, 0x3b, 0x80, 0x7f, 0x88, + 0xf5, 0x87, 0x61, 0xd8, 0x86, 0x07, 0x36, 0x60, 0xc4, 0x33, 0x23, 0xf2, 0x55, 0x45, 0x49, 0x3d, + 0xf6, 0x8f, 0xc4, 0x8a, 0x38, 0xe7, 0x44, 0xc4, 0x89, 0xc8, 0x88, 0x13, 0x27, 0xce, 0x03, 0xee, + 0x04, 0xb8, 0x8d, 0x3b, 0xae, 0x17, 0xdc, 0x6d, 0xe3, 0x43, 0xab, 0xf9, 0xf2, 0x6e, 0xb3, 0x6d, + 0x63, 0x27, 0xb8, 0xdb, 0xf1, 0xdc, 0xc0, 0xbd, 0x6b, 0x75, 0x83, 0x23, 0x1f, 0x7b, 0xcf, 0xec, + 0x26, 0xbe, 0x43, 0x4b, 0xd0, 0x30, 0xfd, 0xaf, 0x38, 0x7b, 0xe8, 0x1e, 0xba, 0x0c, 0x86, 0xfc, + 0xc5, 0x2a, 0x8b, 0x97, 0x0e, 0x5d, 0xf7, 0xb0, 0x8d, 0x19, 0xf2, 0x41, 0xf7, 0xc9, 0x5d, 0x7c, + 0xdc, 0x09, 0x5e, 0xf2, 0xca, 0x52, 0xb4, 0x32, 0xb0, 0x8f, 0xb1, 0x1f, 0x58, 0xc7, 0x1d, 0x0e, + 0xf0, 0x8e, 0xec, 0x8a, 0x15, 0x04, 0xa4, 0x26, 0xb0, 0x5d, 0xe7, 0xee, 0xb3, 0xfb, 0xea, 0x4f, + 0x0e, 0x7a, 0x2b, 0xb3, 0xd7, 0x4d, 0xec, 0x05, 0x7e, 0x5f, 0x90, 0xf8, 0x19, 0x76, 0x82, 0x58, + 0xf3, 0x1c, 0x32, 0x78, 0xd9, 0xc1, 0x3e, 0x03, 0x11, 0xff, 0x71, 0xd0, 0x6b, 0xc9, 0xa0, 0xf4, + 0x5f, 0x0e, 0xf2, 0x9d, 0x64, 0x90, 0xe7, 0xf8, 0x80, 0xf0, 0xd4, 0x91, 0x7f, 0xf4, 0x00, 0xf7, + 0xac, 0x4e, 0x07, 0x7b, 0xe1, 0x1f, 0xb1, 0xbe, 0x76, 0x7d, 0xeb, 0x10, 0xf3, 0x3e, 0x3e, 0xbb, + 0xaf, 0xfe, 0x64, 0xa0, 0xc6, 0x1f, 0xe4, 0x60, 0x78, 0xdf, 0x0a, 0x9a, 0x47, 0xe8, 0x73, 0x18, + 0x7e, 0x6c, 0x3b, 0x2d, 0x7f, 0x21, 0x77, 0x75, 0xf0, 0xd6, 0xf8, 0x52, 0xe1, 0x0e, 0xeb, 0x2f, + 0xad, 0x24, 0x15, 0x95, 0xf9, 0x9f, 0x9e, 0x94, 0x06, 0x4e, 0x4f, 0x4a, 0xd3, 0x4f, 0x09, 0xd8, + 0xb7, 0xdd, 0x63, 0x3b, 0xa0, 0x13, 0x68, 0x32, 0x3c, 0xb4, 0x0b, 0x33, 0xe5, 0x76, 0xdb, 0x7d, + 0x5e, 0xb3, 0xbc, 0xc0, 0xb6, 0xda, 0xf5, 0x6e, 0xb3, 0x89, 0x7d, 0x7f, 0x21, 0x7f, 0x35, 0x77, + 0x6b, 0xb4, 0x72, 0xfd, 0xf4, 0xa4, 0x54, 0xb2, 0x48, 0x75, 0xa3, 0xc3, 0xea, 0x1b, 0x3e, 0x03, + 0x50, 0x08, 0x25, 0xe1, 0x1b, 0x7f, 0x31, 0x0c, 0x85, 0x35, 0xd7, 0x0f, 0xaa, 0x64, 0xda, 0x4c, + 0xfc, 0xe3, 0x2e, 0xf6, 0x03, 0x74, 0x1d, 0xce, 0x91, 0xb2, 0xf5, 0xe5, 0x85, 0xdc, 0xd5, 0xdc, + 0xad, 0xb1, 0xca, 0xf8, 0xe9, 0x49, 0x69, 0xe4, 0xc8, 0xf5, 0x83, 0x86, 0xdd, 0x32, 0x79, 0x15, + 0x7a, 0x07, 0x46, 0xb7, 0xdc, 0x16, 0xde, 0xb2, 0x8e, 0x31, 0xed, 0xc5, 0x58, 0x65, 0xf2, 0xf4, + 0xa4, 0x34, 0xe6, 0xb8, 0x2d, 0xdc, 0x70, 0xac, 0x63, 0x6c, 0xca, 0x6a, 0xb4, 0x07, 0x43, 0xa6, + 0xdb, 0xc6, 0x0b, 0x83, 0x14, 0xac, 0x72, 0x7a, 0x52, 0x1a, 0xf2, 0xdc, 0x36, 0xfe, 0xf9, 0x49, + 0xe9, 0xfd, 0x43, 0x3b, 0x38, 0xea, 0x1e, 0xdc, 0x69, 0xba, 0xc7, 0x77, 0x0f, 0x3d, 0xeb, 0x99, + 0xcd, 0x56, 0x9a, 0xd5, 0xbe, 0x1b, 0xae, 0xc7, 0x8e, 0xcd, 0x27, 0xb7, 0xfe, 0xd2, 0x0f, 0xf0, + 0x31, 0xa1, 0x64, 0x52, 0x7a, 0x68, 0x1f, 0x66, 0xcb, 0xad, 0x96, 0xcd, 0x30, 0x6a, 0x9e, 0xed, + 0x34, 0xed, 0x8e, 0xd5, 0xf6, 0x17, 0x86, 0xae, 0x0e, 0xde, 0x1a, 0xe3, 0x4c, 0x91, 0xf5, 0x8d, + 0x8e, 0x04, 0x50, 0x98, 0x92, 0x48, 0x00, 0x3d, 0x80, 0xd1, 0xe5, 0xad, 0x3a, 0xe9, 0xbb, 0xbf, + 0x30, 0x4c, 0x89, 0xcd, 0x9f, 0x9e, 0x94, 0x66, 0x5a, 0x8e, 0x4f, 0x87, 0xa6, 0x12, 0x90, 0x80, + 0xe8, 0x7d, 0x98, 0xa8, 0x75, 0x0f, 0xda, 0x76, 0x73, 0x67, 0xa3, 0xfe, 0x18, 0xbf, 0x5c, 0x38, + 0x77, 0x35, 0x77, 0x6b, 0xa2, 0x82, 0x4e, 0x4f, 0x4a, 0x53, 0x1d, 0x5a, 0xde, 0x08, 0xda, 0x7e, + 0xe3, 0x29, 0x7e, 0x69, 0x6a, 0x70, 0x21, 0x5e, 0xbd, 0xbe, 0x46, 0xf0, 0x46, 0x62, 0x78, 0xbe, + 0x7f, 0xa4, 0xe2, 0x31, 0x38, 0x74, 0x17, 0xc0, 0xc4, 0xc7, 0x6e, 0x80, 0xcb, 0xad, 0x96, 0xb7, + 0x30, 0x4a, 0x79, 0x3b, 0x7d, 0x7a, 0x52, 0x1a, 0xf7, 0x68, 0x69, 0xc3, 0x6a, 0xb5, 0x3c, 0x53, + 0x01, 0x41, 0x55, 0x18, 0x35, 0x5d, 0xc6, 0xe0, 0x85, 0xb1, 0xab, 0xb9, 0x5b, 0xe3, 0x4b, 0xd3, + 0x7c, 0x19, 0x8a, 0xe2, 0xca, 0x85, 0xd3, 0x93, 0x12, 0xf2, 0xf8, 0x2f, 0x75, 0x94, 0x02, 0x02, + 0x95, 0x60, 0x64, 0xcb, 0xad, 0x5a, 0xcd, 0x23, 0xbc, 0x00, 0x74, 0xed, 0x0d, 0x9f, 0x9e, 0x94, + 0x72, 0xdf, 0x31, 0x45, 0x29, 0x7a, 0x06, 0xe3, 0xe1, 0x44, 0xf9, 0x0b, 0xe3, 0x94, 0x7d, 0x3b, + 0xa7, 0x27, 0xa5, 0x0b, 0x3e, 0x2d, 0x6e, 0x90, 0xa9, 0x57, 0x38, 0xf8, 0x1a, 0xab, 0x40, 0x6d, + 0xe8, 0xd1, 0xd0, 0xe8, 0x44, 0x61, 0xd2, 0xbc, 0xbc, 0xeb, 0xf8, 0x81, 0x75, 0xd0, 0xc6, 0x61, + 0x55, 0xd9, 0xf7, 0xb1, 0x47, 0xe8, 0xad, 0x2f, 0x1b, 0xff, 0x2b, 0x07, 0x68, 0xbb, 0x83, 0x9d, + 0x7a, 0x7d, 0x8d, 0xac, 0x78, 0xb1, 0xe0, 0xbf, 0x0d, 0x63, 0x8c, 0xb5, 0x84, 0xff, 0x79, 0xca, + 0xff, 0xa9, 0xd3, 0x93, 0x12, 0x70, 0xfe, 0x13, 0xde, 0x87, 0x00, 0xe8, 0x06, 0x0c, 0xee, 0xec, + 0x6c, 0xd0, 0xd5, 0x3c, 0x58, 0x99, 0x39, 0x3d, 0x29, 0x0d, 0x06, 0x41, 0xfb, 0xe7, 0x27, 0xa5, + 0xd1, 0xe5, 0xae, 0x47, 0x3b, 0x6e, 0x92, 0x7a, 0x74, 0x03, 0x46, 0xaa, 0xed, 0xae, 0x1f, 0x60, + 0x6f, 0x61, 0x28, 0xfc, 0x8c, 0x9a, 0xac, 0xc8, 0x14, 0x75, 0xe8, 0x5b, 0x30, 0xb4, 0xeb, 0x63, + 0x6f, 0x61, 0x98, 0xce, 0xc8, 0x24, 0x9f, 0x11, 0x52, 0xb4, 0xb7, 0x54, 0x19, 0x25, 0xdf, 0x4a, + 0xd7, 0xc7, 0x9e, 0x49, 0x81, 0xd0, 0x1d, 0x18, 0x66, 0x6c, 0x3d, 0x47, 0xb7, 0x91, 0x49, 0x39, + 0x7f, 0x6d, 0xbc, 0xf7, 0x7e, 0x65, 0xec, 0xf4, 0xa4, 0x34, 0x4c, 0xd9, 0x6b, 0x0e, 0x0b, 0xa6, + 0xe4, 0x0a, 0x79, 0x73, 0x94, 0xe0, 0x92, 0x85, 0x6b, 0x7c, 0x0b, 0xc6, 0x95, 0xe1, 0xa3, 0x45, + 0x18, 0x22, 0xff, 0xd3, 0xcf, 0x7c, 0x82, 0x35, 0x46, 0xf6, 0x6f, 0x93, 0x96, 0x1a, 0xbf, 0x3f, + 0x0d, 0x05, 0x82, 0xa9, 0xed, 0x0d, 0x1a, 0xab, 0x72, 0xbd, 0x58, 0x75, 0x0b, 0x64, 0xdb, 0x7c, + 0x93, 0x98, 0x38, 0x3d, 0x29, 0x8d, 0x76, 0x79, 0x59, 0xd8, 0x33, 0x54, 0x87, 0x91, 0x95, 0x17, + 0x1d, 0xdb, 0xc3, 0x3e, 0x65, 0xec, 0xf8, 0x52, 0xf1, 0x0e, 0x3b, 0xb3, 0xee, 0x88, 0x33, 0xeb, + 0xce, 0x8e, 0x38, 0xb3, 0x2a, 0x97, 0xf9, 0x66, 0x79, 0x1e, 0x33, 0x94, 0x70, 0x35, 0xfd, 0xd6, + 0x9f, 0x95, 0x72, 0xa6, 0xa0, 0x84, 0xbe, 0x0d, 0xe7, 0x1e, 0xba, 0xde, 0xb1, 0x15, 0xf0, 0x19, + 0x98, 0x3d, 0x3d, 0x29, 0x15, 0x9e, 0xd0, 0x12, 0x65, 0x71, 0x73, 0x18, 0xf4, 0x10, 0xa6, 0x4c, + 0xb7, 0x1b, 0xe0, 0x1d, 0x57, 0xcc, 0xdb, 0x30, 0xc5, 0xba, 0x72, 0x7a, 0x52, 0x2a, 0x7a, 0xa4, + 0xa6, 0x11, 0xb8, 0x0d, 0x3e, 0x81, 0x0a, 0x7e, 0x04, 0x0b, 0xad, 0xc0, 0x54, 0x99, 0xee, 0xae, + 0x9c, 0x67, 0x6c, 0xb6, 0xc6, 0x2a, 0x97, 0x4f, 0x4f, 0x4a, 0x17, 0x2d, 0x5a, 0xd3, 0xf0, 0x78, + 0x95, 0x4a, 0x46, 0x47, 0x42, 0x5b, 0x70, 0xfe, 0x71, 0xf7, 0x00, 0x7b, 0x0e, 0x0e, 0xb0, 0x2f, + 0x7a, 0x34, 0x42, 0x7b, 0x74, 0xf5, 0xf4, 0xa4, 0xb4, 0xf8, 0x54, 0x56, 0x26, 0xf4, 0x29, 0x8e, + 0x8a, 0x30, 0x4c, 0xf3, 0x8e, 0x2e, 0x5b, 0x81, 0x75, 0x60, 0xf9, 0x98, 0x6e, 0x1a, 0xe3, 0x4b, + 0x17, 0x18, 0x8b, 0xef, 0x44, 0x6a, 0x2b, 0xd7, 0x39, 0x97, 0x2f, 0xc9, 0xb1, 0xb7, 0x78, 0x95, + 0xd2, 0x50, 0x94, 0x26, 0xd9, 0x3b, 0xe5, 0xb9, 0x30, 0x46, 0x7b, 0x4b, 0xf7, 0x4e, 0x79, 0x2e, + 0xa8, 0xbb, 0x8a, 0x3c, 0x21, 0x36, 0x60, 0x78, 0x97, 0x9c, 0x9e, 0x74, 0x4f, 0x99, 0x5a, 0xba, + 0xc6, 0x7b, 0x14, 0x5d, 0x7d, 0x77, 0xc8, 0x0f, 0x0a, 0x48, 0xbf, 0xbb, 0x69, 0x7a, 0xe2, 0xaa, + 0x67, 0x25, 0xad, 0x43, 0x5f, 0x00, 0xf0, 0x5e, 0x95, 0x3b, 0x9d, 0x85, 0x71, 0x3a, 0xc8, 0xf3, + 0xfa, 0x20, 0xcb, 0x9d, 0x4e, 0xe5, 0x0a, 0x1f, 0xdf, 0x05, 0x39, 0x3e, 0xab, 0xd3, 0x51, 0xa8, + 0x29, 0x44, 0xd0, 0xe7, 0x30, 0x41, 0xb7, 0x1c, 0x31, 0xa3, 0x13, 0x74, 0x46, 0x2f, 0x9d, 0x9e, + 0x94, 0xe6, 0xc9, 0x07, 0x97, 0x34, 0x9f, 0x1a, 0x02, 0xfa, 0x55, 0x98, 0xe3, 0xe4, 0xf6, 0x6d, + 0xa7, 0xe5, 0x3e, 0xf7, 0x97, 0xb1, 0xff, 0x34, 0x70, 0x3b, 0x0b, 0x93, 0xb4, 0x7b, 0x8b, 0x7a, + 0xf7, 0x74, 0x98, 0xca, 0x6d, 0xde, 0x53, 0x43, 0xf6, 0xf4, 0x39, 0x03, 0x68, 0xb4, 0x18, 0x84, + 0xd2, 0x6c, 0x72, 0x33, 0x68, 0x1d, 0xa6, 0x77, 0x7d, 0xac, 0x8d, 0x61, 0x8a, 0xee, 0xdf, 0x25, + 0x32, 0xc3, 0x5d, 0x1f, 0x37, 0xd2, 0xc6, 0x11, 0xc5, 0x43, 0x26, 0xa0, 0x65, 0xcf, 0xed, 0x44, + 0xd6, 0xf8, 0x34, 0xe5, 0x88, 0x71, 0x7a, 0x52, 0xba, 0xd2, 0xf2, 0xdc, 0x4e, 0x23, 0x7d, 0xa1, + 0x27, 0x60, 0xa3, 0x1f, 0xc2, 0x85, 0xaa, 0xeb, 0x38, 0xb8, 0x49, 0xf6, 0xcf, 0x65, 0xdb, 0x3a, + 0x74, 0x5c, 0x3f, 0xb0, 0x9b, 0xeb, 0xcb, 0x0b, 0x05, 0xba, 0x86, 0x6e, 0x92, 0xd1, 0x37, 0x25, + 0x44, 0xa3, 0x25, 0x41, 0x1a, 0x76, 0x4b, 0xa1, 0x9d, 0x42, 0x05, 0xfd, 0x00, 0x26, 0x79, 0x5b, + 0xd8, 0xa3, 0x4b, 0xf3, 0x7c, 0xf6, 0x42, 0x93, 0xc0, 0xec, 0x20, 0xf6, 0xc4, 0x4f, 0x26, 0xda, + 0xe8, 0xb4, 0xd0, 0xd7, 0x30, 0xbe, 0xf9, 0xb0, 0x6c, 0x62, 0xbf, 0xe3, 0x3a, 0x3e, 0x5e, 0x40, + 0x74, 0x46, 0xaf, 0x70, 0xd2, 0x9b, 0x0f, 0xcb, 0xe5, 0x6e, 0x70, 0x84, 0x9d, 0xc0, 0x6e, 0x5a, + 0x01, 0x16, 0x50, 0x95, 0x22, 0x59, 0x79, 0xc7, 0x4f, 0xac, 0x86, 0xc7, 0x4b, 0x94, 0x51, 0xa8, + 0xe4, 0x50, 0x11, 0x46, 0xeb, 0xf5, 0xb5, 0x0d, 0xf7, 0xd0, 0x76, 0x16, 0x66, 0x08, 0x33, 0x4c, + 0xf9, 0x1b, 0x1d, 0xc0, 0x9c, 0x22, 0xa0, 0x37, 0xc8, 0xff, 0xf8, 0x18, 0x3b, 0xc1, 0xc2, 0x2c, + 0xed, 0xc3, 0x77, 0xe4, 0x0d, 0xe3, 0x8e, 0x2a, 0xc7, 0x3f, 0xbb, 0x7f, 0xa7, 0x1c, 0xfe, 0xac, + 0x0b, 0x24, 0x73, 0xd6, 0x4a, 0x28, 0x45, 0x3b, 0x30, 0x52, 0xeb, 0x7a, 0x1d, 0xd7, 0xc7, 0x0b, + 0x73, 0x94, 0x69, 0xd7, 0xb3, 0xbe, 0x4e, 0x0e, 0x5a, 0x99, 0x23, 0xdb, 0x73, 0x87, 0xfd, 0x50, + 0x46, 0x26, 0x48, 0x19, 0x5f, 0xc2, 0x98, 0xfc, 0x98, 0xd1, 0x08, 0x0c, 0x96, 0xdb, 0xed, 0xc2, + 0x00, 0xf9, 0xa3, 0x5e, 0x5f, 0x2b, 0xe4, 0xd0, 0x14, 0x40, 0xb8, 0x83, 0x15, 0xf2, 0x68, 0x02, + 0x46, 0xc5, 0x0e, 0x53, 0x18, 0xa4, 0xf0, 0x9d, 0x4e, 0x61, 0x08, 0x21, 0x98, 0xd2, 0xd7, 0x79, + 0x61, 0xd8, 0x78, 0x01, 0x63, 0x72, 0x7a, 0xd0, 0x34, 0x8c, 0xef, 0x6e, 0xd5, 0x6b, 0x2b, 0xd5, + 0xf5, 0x87, 0xeb, 0x2b, 0xcb, 0x85, 0x01, 0x74, 0x19, 0x2e, 0xee, 0xd4, 0xd7, 0x1a, 0xcb, 0x95, + 0xc6, 0xc6, 0x76, 0xb5, 0xbc, 0xd1, 0xa8, 0x99, 0xdb, 0x5f, 0x7e, 0xd5, 0xd8, 0xd9, 0xdd, 0xda, + 0x5a, 0xd9, 0x28, 0xe4, 0xd0, 0x02, 0xcc, 0x92, 0xea, 0xc7, 0xbb, 0x95, 0x15, 0x15, 0xa0, 0x90, + 0x47, 0xd7, 0xe0, 0x72, 0x52, 0x4d, 0x63, 0x6d, 0xa5, 0xbc, 0xbc, 0xb1, 0x52, 0xaf, 0x17, 0x06, + 0x8d, 0x36, 0x8c, 0x2b, 0x2c, 0x40, 0x8b, 0xb0, 0x50, 0x5d, 0x31, 0x77, 0x1a, 0xb5, 0x5d, 0xb3, + 0xb6, 0x5d, 0x5f, 0x69, 0xe8, 0x1d, 0x89, 0xd6, 0x6e, 0x6c, 0xaf, 0xae, 0x6f, 0x35, 0x48, 0x51, + 0xbd, 0x90, 0x23, 0xad, 0x69, 0xb5, 0xf5, 0xf5, 0xad, 0xd5, 0x8d, 0x95, 0xc6, 0x6e, 0x7d, 0x85, + 0x83, 0xe4, 0x8d, 0x7f, 0x97, 0x8b, 0x6d, 0xe8, 0x68, 0x09, 0xc6, 0xeb, 0xec, 0xca, 0x48, 0x17, + 0x39, 0x13, 0xdf, 0x0b, 0xa7, 0x27, 0xa5, 0x09, 0x7e, 0x93, 0x64, 0xeb, 0x57, 0x05, 0x22, 0x67, + 0x74, 0x8d, 0xcc, 0x67, 0xd3, 0x6d, 0xab, 0x67, 0x74, 0x87, 0x97, 0x99, 0xb2, 0x16, 0x2d, 0x29, + 0xa7, 0x39, 0x93, 0xe5, 0xa9, 0xbc, 0x28, 0x4e, 0x73, 0x75, 0x67, 0x97, 0xe7, 0xfa, 0x52, 0x38, + 0x71, 0xfc, 0x10, 0xa6, 0x38, 0x09, 0x27, 0x89, 0x84, 0x33, 0xba, 0x29, 0x7b, 0x25, 0xfa, 0x38, + 0x3a, 0xdd, 0x7c, 0x84, 0xf4, 0x30, 0x88, 0x6c, 0x89, 0x66, 0x04, 0x14, 0x95, 0x60, 0x98, 0x7d, + 0x44, 0x6c, 0x90, 0x54, 0x58, 0x6a, 0x93, 0x02, 0x93, 0x95, 0x1b, 0xbf, 0x39, 0xa8, 0x9e, 0x1b, + 0x44, 0x38, 0x52, 0x98, 0x48, 0x85, 0x23, 0xca, 0x3c, 0x5a, 0x4a, 0xe4, 0xa0, 0x3a, 0xf6, 0x7d, + 0x2a, 0x56, 0x72, 0x8a, 0x54, 0x0e, 0xf2, 0x59, 0x21, 0xb9, 0x29, 0x85, 0x00, 0x44, 0x56, 0x67, + 0x42, 0x11, 0x95, 0xd5, 0x07, 0x43, 0x59, 0x9d, 0x8b, 0x4d, 0x4c, 0x56, 0x0f, 0x41, 0xc8, 0x44, + 0xf2, 0x73, 0x9b, 0xf6, 0x61, 0x28, 0x9c, 0x48, 0x7e, 0xd6, 0xf3, 0x89, 0x54, 0x80, 0xd0, 0x47, + 0x00, 0xe5, 0xfd, 0x3a, 0x15, 0x79, 0xcd, 0x2d, 0x2e, 0xbb, 0xd0, 0x5d, 0xc6, 0x7a, 0xee, 0xb3, + 0xdd, 0xdd, 0xf2, 0x54, 0xa1, 0x5e, 0x81, 0x46, 0x15, 0x98, 0x2c, 0xff, 0xa4, 0xeb, 0xe1, 0xf5, + 0x16, 0xd9, 0xa8, 0x02, 0x76, 0x7b, 0x19, 0xab, 0x2c, 0x9e, 0x9e, 0x94, 0x16, 0x2c, 0x52, 0xd1, + 0xb0, 0x79, 0x8d, 0x42, 0x40, 0x47, 0x41, 0xdb, 0x70, 0x7e, 0xb5, 0x5a, 0xe3, 0x4b, 0xab, 0xdc, + 0x6c, 0xba, 0x5d, 0x27, 0xe0, 0x02, 0xcb, 0xb5, 0xd3, 0x93, 0xd2, 0xe5, 0xc3, 0x66, 0xa7, 0x21, + 0x96, 0xa1, 0xc5, 0xaa, 0x55, 0x89, 0x25, 0x86, 0x6b, 0xb4, 0x61, 0x6a, 0x15, 0x07, 0x64, 0x29, + 0x09, 0xe9, 0x33, 0x7b, 0x4e, 0x3e, 0x81, 0xf1, 0x7d, 0x3b, 0x38, 0xaa, 0xe3, 0xa6, 0x87, 0x03, + 0x71, 0x37, 0xa6, 0x1c, 0x78, 0x6e, 0x07, 0x47, 0x0d, 0x9f, 0x95, 0xab, 0xfb, 0xac, 0x02, 0x6e, + 0xac, 0xc0, 0x34, 0x6f, 0x4d, 0x0a, 0xbb, 0x4b, 0x3a, 0xc1, 0x1c, 0x25, 0x48, 0x67, 0x41, 0x25, + 0xa8, 0x93, 0xf9, 0x27, 0x79, 0x98, 0xab, 0x1e, 0x59, 0xce, 0x21, 0xae, 0x59, 0xbe, 0xff, 0xdc, + 0xf5, 0x5a, 0x4a, 0xe7, 0xa9, 0xa4, 0x1f, 0xeb, 0x3c, 0x15, 0xed, 0x97, 0x60, 0x7c, 0xbb, 0xdd, + 0x12, 0x38, 0xfc, 0x16, 0x42, 0xdb, 0x72, 0xdb, 0xad, 0x46, 0x47, 0xd0, 0x52, 0x81, 0x08, 0xce, + 0x16, 0x7e, 0x2e, 0x71, 0x06, 0x43, 0x1c, 0x07, 0x3f, 0x57, 0x70, 0x14, 0x20, 0xb4, 0x02, 0xe7, + 0xeb, 0xb8, 0xe9, 0x3a, 0xad, 0x87, 0x56, 0x33, 0x70, 0xbd, 0x1d, 0xf7, 0x29, 0x76, 0xf8, 0xfa, + 0xa2, 0x82, 0x9a, 0x4f, 0x2b, 0x1b, 0x4f, 0x68, 0x6d, 0x23, 0x20, 0xd5, 0x66, 0x1c, 0x03, 0x6d, + 0xc3, 0xe8, 0x3e, 0x57, 0xa3, 0xf0, 0xab, 0xcb, 0x8d, 0x3b, 0x52, 0xaf, 0x52, 0xf5, 0x30, 0x5d, + 0x14, 0x56, 0x5b, 0x5e, 0xbe, 0xe4, 0xb9, 0x47, 0x37, 0x17, 0x01, 0x69, 0x4a, 0x22, 0xc6, 0x2e, + 0x4c, 0xd6, 0xda, 0xdd, 0x43, 0xdb, 0x21, 0xdb, 0x40, 0x1d, 0xff, 0x18, 0x2d, 0x03, 0x84, 0x05, + 0x5c, 0x6f, 0x32, 0xc3, 0x2f, 0x3c, 0x61, 0xc5, 0xde, 0x03, 0xfe, 0x21, 0xd1, 0x12, 0x2a, 0xa1, + 0x9a, 0x0a, 0x9e, 0xf1, 0x3f, 0x06, 0x01, 0xf1, 0x09, 0xa0, 0x47, 0x5a, 0x1d, 0x07, 0xe4, 0x5c, + 0xb8, 0x00, 0x79, 0xa9, 0xde, 0x38, 0x77, 0x7a, 0x52, 0xca, 0xdb, 0x2d, 0x33, 0xbf, 0xbe, 0x8c, + 0xde, 0x85, 0x61, 0x0a, 0x46, 0xf9, 0x3f, 0x25, 0xdb, 0x53, 0x29, 0xb0, 0x9d, 0x83, 0x1e, 0xb5, + 0x26, 0x03, 0x46, 0xef, 0xc1, 0xd8, 0x32, 0x6e, 0xe3, 0x43, 0x2b, 0x70, 0xc5, 0xd7, 0xcd, 0x14, + 0x06, 0xa2, 0x50, 0x59, 0x73, 0x21, 0x24, 0xb9, 0x9e, 0x98, 0xd8, 0xf2, 0x5d, 0x47, 0xbd, 0x9e, + 0x78, 0xb4, 0x44, 0xbd, 0x9e, 0x30, 0x18, 0xf4, 0x3b, 0x39, 0x18, 0x2f, 0x3b, 0x0e, 0xbf, 0x88, + 0xfb, 0x9c, 0xeb, 0x73, 0x77, 0xa4, 0x7a, 0x6a, 0xc3, 0x3a, 0xc0, 0xed, 0x3d, 0xab, 0xdd, 0xc5, + 0x7e, 0xe5, 0x6b, 0x22, 0x31, 0xfe, 0xfb, 0x93, 0xd2, 0xc7, 0x67, 0xb8, 0x5a, 0x87, 0x8a, 0xae, + 0x1d, 0xcf, 0xb2, 0x03, 0xff, 0xf4, 0xa4, 0x34, 0x67, 0x85, 0x0d, 0xaa, 0xdf, 0x8d, 0xd2, 0x0f, + 0xf4, 0x8e, 0x7a, 0x27, 0xe5, 0x7b, 0x71, 0xe4, 0x8e, 0xcf, 0xaf, 0xa3, 0xe8, 0x18, 0xa6, 0xcb, + 0xbe, 0xdf, 0x3d, 0xc6, 0xf5, 0xc0, 0xf2, 0x02, 0x72, 0x9f, 0xa3, 0xfb, 0x43, 0xf6, 0x65, 0xef, + 0xed, 0x9f, 0x9e, 0x94, 0x72, 0x44, 0x48, 0xb5, 0x28, 0x2a, 0x11, 0x72, 0xbc, 0xa0, 0x11, 0xd8, + 0xea, 0x81, 0x43, 0xaf, 0x7d, 0x51, 0xda, 0xc6, 0x75, 0x29, 0x09, 0xac, 0x2f, 0xa7, 0xcd, 0xb8, + 0x51, 0x85, 0xc5, 0x55, 0x1c, 0x98, 0xd8, 0xc7, 0x81, 0xf8, 0x46, 0xe8, 0x0a, 0x0f, 0x95, 0x61, + 0x23, 0xf4, 0xb7, 0x44, 0xa6, 0xd3, 0xcf, 0xbe, 0x0b, 0x51, 0x63, 0xfc, 0xe5, 0x1c, 0x94, 0xaa, + 0x1e, 0x66, 0xf2, 0x5d, 0x0a, 0xa1, 0xec, 0xbd, 0x6b, 0x11, 0x86, 0x76, 0x5e, 0x76, 0xc4, 0x2d, + 0x99, 0xd6, 0x92, 0x49, 0x31, 0x69, 0x69, 0x9f, 0x2a, 0x07, 0xe3, 0x09, 0xcc, 0x99, 0xd8, 0xc1, + 0xcf, 0xad, 0x83, 0x36, 0xd6, 0x6e, 0xed, 0x25, 0x18, 0x66, 0x1f, 0x7a, 0x6c, 0x08, 0xac, 0xfc, + 0x6c, 0x1a, 0x10, 0xe3, 0x1f, 0xe6, 0xa1, 0xc0, 0x86, 0x5b, 0x71, 0x83, 0xfe, 0xc6, 0xc7, 0x47, + 0x90, 0xef, 0xa1, 0x34, 0xb9, 0x19, 0x72, 0x7b, 0x30, 0x94, 0x45, 0x68, 0x57, 0xc9, 0x91, 0x2a, + 0x2a, 0xc9, 0x80, 0xd8, 0xa2, 0x63, 0xba, 0xbe, 0x98, 0xe6, 0x03, 0xfd, 0x46, 0x0e, 0xce, 0xb1, + 0x65, 0x9c, 0xfd, 0xa1, 0xec, 0xbf, 0x99, 0x0f, 0xa5, 0x10, 0xd0, 0xbf, 0xd4, 0xcf, 0x96, 0xd5, + 0x19, 0xff, 0x38, 0x0f, 0xe7, 0x15, 0x5e, 0x71, 0xa1, 0xfe, 0x1d, 0x26, 0x4a, 0x29, 0x0c, 0xa3, + 0xda, 0x53, 0x22, 0x4a, 0x35, 0x42, 0xcd, 0x08, 0xe5, 0xdc, 0x3b, 0x30, 0x4a, 0x86, 0x14, 0x55, + 0xb4, 0xd2, 0x03, 0x9d, 0x81, 0x8a, 0xea, 0xbe, 0xb9, 0x77, 0x17, 0x46, 0xe9, 0x9f, 0x64, 0x46, + 0x86, 0xd2, 0x67, 0x44, 0x02, 0x21, 0x1b, 0xe0, 0x91, 0x6b, 0x3b, 0x9b, 0x38, 0x38, 0x72, 0x5b, + 0x5c, 0xb4, 0x58, 0x27, 0xdb, 0xee, 0xff, 0xe3, 0xda, 0x4e, 0xe3, 0x98, 0x16, 0x9f, 0x55, 0x91, + 0x17, 0x12, 0x34, 0x15, 0xe2, 0xc6, 0x3d, 0x28, 0x90, 0x1d, 0xb2, 0xff, 0xa5, 0x65, 0xcc, 0x02, + 0x5a, 0xc5, 0x41, 0xc5, 0xd5, 0xce, 0x6e, 0x63, 0x12, 0xc6, 0x6b, 0xb6, 0x73, 0x28, 0x7e, 0xfe, + 0xe1, 0x20, 0x4c, 0xb0, 0xdf, 0x7c, 0x06, 0x22, 0x12, 0x56, 0xae, 0x1f, 0x09, 0xeb, 0x03, 0x98, + 0x24, 0x22, 0x0a, 0xf6, 0xf6, 0xb0, 0x47, 0x24, 0x3b, 0x3e, 0x1f, 0xf4, 0x8a, 0xe8, 0xd3, 0x8a, + 0xc6, 0x33, 0x56, 0x63, 0xea, 0x80, 0x68, 0x03, 0xa6, 0x58, 0xc1, 0x43, 0x6c, 0x05, 0xdd, 0x50, + 0xcb, 0x35, 0xcd, 0xef, 0x52, 0xa2, 0x98, 0x6d, 0x9f, 0x9c, 0xd6, 0x13, 0x5e, 0x68, 0x46, 0x70, + 0xd1, 0xe7, 0x30, 0x5d, 0xf3, 0xdc, 0x17, 0x2f, 0x15, 0x99, 0x92, 0x9d, 0x20, 0xec, 0xd6, 0x45, + 0xaa, 0x1a, 0xaa, 0x64, 0x19, 0x85, 0x26, 0x6b, 0x6a, 0xdd, 0xaf, 0xb8, 0x9e, 0xed, 0x1c, 0xd2, + 0xd9, 0x1c, 0x65, 0x6b, 0xca, 0xf6, 0x1b, 0x07, 0xb4, 0xd0, 0x94, 0xd5, 0x11, 0x35, 0xf3, 0x48, + 0x6f, 0x35, 0xf3, 0x3d, 0x80, 0x0d, 0xd7, 0x6a, 0x95, 0xdb, 0xed, 0x6a, 0xd9, 0xa7, 0x2a, 0x26, + 0x2e, 0x33, 0xb5, 0x5d, 0xab, 0xd5, 0xb0, 0xda, 0xed, 0x46, 0xd3, 0xf2, 0x4d, 0x05, 0xe6, 0xd1, + 0xd0, 0xe8, 0xb9, 0xc2, 0x88, 0x39, 0xbd, 0x61, 0x37, 0xb1, 0xe3, 0xe3, 0x7d, 0xcb, 0x73, 0x6c, + 0xe7, 0xd0, 0x37, 0x7e, 0x7f, 0x1c, 0x46, 0xe5, 0x90, 0xef, 0xa8, 0x17, 0x42, 0x2e, 0x89, 0xd1, + 0x1d, 0x2a, 0x54, 0x83, 0x99, 0x0a, 0x04, 0xba, 0x48, 0xaf, 0x88, 0x5c, 0x06, 0x1c, 0x21, 0xab, + 0xdb, 0xea, 0x74, 0x4c, 0x52, 0x46, 0x4e, 0x82, 0xe5, 0x0a, 0xe5, 0xff, 0x28, 0x3b, 0x09, 0x5a, + 0x07, 0x66, 0x7e, 0xb9, 0x42, 0x56, 0xd9, 0xf6, 0xfa, 0x72, 0x95, 0xb2, 0x72, 0x94, 0xad, 0x32, + 0xd7, 0x6e, 0x35, 0x4d, 0x5a, 0x4a, 0x6a, 0xeb, 0xe5, 0xcd, 0x0d, 0xce, 0x2e, 0x5a, 0xeb, 0x5b, + 0xc7, 0x6d, 0x93, 0x96, 0x92, 0x9b, 0x09, 0xd3, 0x68, 0x54, 0x5d, 0x27, 0xf0, 0xdc, 0xb6, 0x4f, + 0x05, 0xe8, 0x51, 0x36, 0x9d, 0x5c, 0x15, 0xd2, 0xe4, 0x55, 0x66, 0x04, 0x14, 0xed, 0xc3, 0x7c, + 0xb9, 0xf5, 0xcc, 0x72, 0x9a, 0xb8, 0xc5, 0x6a, 0xf6, 0x5d, 0xef, 0xe9, 0x93, 0xb6, 0xfb, 0xdc, + 0xa7, 0xfc, 0x1e, 0xe5, 0x9a, 0x43, 0x0e, 0x22, 0x34, 0x2b, 0xcf, 0x05, 0x90, 0x99, 0x86, 0x4d, + 0x76, 0xc9, 0x6a, 0xdb, 0xed, 0xb6, 0xf8, 0x2c, 0xd0, 0x5d, 0xb2, 0x49, 0x0a, 0x4c, 0x56, 0x4e, + 0xb8, 0xb4, 0x56, 0xdf, 0xa4, 0x7a, 0x3a, 0xce, 0xa5, 0x23, 0xff, 0xd8, 0x24, 0x65, 0xe8, 0x06, + 0x8c, 0x88, 0x4b, 0x16, 0x53, 0xf4, 0x53, 0xf5, 0xb5, 0xb8, 0x5c, 0x89, 0x3a, 0xf2, 0x49, 0x98, + 0xb8, 0xe9, 0x3e, 0xc3, 0xde, 0xcb, 0xaa, 0xdb, 0xc2, 0x42, 0xab, 0xc4, 0xb5, 0x26, 0xac, 0xa2, + 0xd1, 0x24, 0x35, 0xa6, 0x0e, 0x48, 0x1a, 0x60, 0x72, 0x9a, 0xbf, 0x30, 0x1d, 0x36, 0xc0, 0xe4, + 0x38, 0xdf, 0x14, 0x75, 0x68, 0x19, 0xce, 0x97, 0xbb, 0x81, 0x7b, 0x6c, 0x05, 0x76, 0x73, 0xb7, + 0x73, 0xe8, 0x59, 0xa4, 0x91, 0x02, 0x45, 0xa0, 0x37, 0x49, 0x4b, 0x54, 0x36, 0xba, 0xbc, 0xd6, + 0x8c, 0x23, 0xa0, 0xf7, 0x61, 0x62, 0xdd, 0x67, 0x9a, 0x43, 0xcb, 0xc7, 0x2d, 0xaa, 0xfe, 0xe1, + 0xbd, 0xb4, 0xfd, 0x06, 0xd5, 0x23, 0x36, 0xc8, 0xdd, 0xb3, 0x65, 0x6a, 0x70, 0xc8, 0x80, 0x73, + 0x65, 0xdf, 0xb7, 0xfd, 0x80, 0x6a, 0x75, 0x46, 0x2b, 0x70, 0x7a, 0x52, 0x3a, 0x67, 0xd1, 0x12, + 0x93, 0xd7, 0xa0, 0x7d, 0x18, 0x5f, 0xc6, 0xe4, 0xde, 0xb2, 0xe3, 0x75, 0xfd, 0x80, 0xea, 0x68, + 0xc6, 0x97, 0x2e, 0xf2, 0x0f, 0x5b, 0xa9, 0xe1, 0x6b, 0x99, 0xdd, 0x48, 0x5a, 0xb4, 0xbc, 0x11, + 0x90, 0x0a, 0x55, 0xb2, 0x52, 0xe0, 0xc9, 0xa5, 0x8c, 0xe3, 0xac, 0xd9, 0x2d, 0xf2, 0xa9, 0xce, + 0xd2, 0x3e, 0xd0, 0x4b, 0x19, 0xdf, 0x1b, 0x1a, 0x47, 0xb4, 0x46, 0xbd, 0x94, 0x69, 0x28, 0xa8, + 0x19, 0x53, 0x46, 0xcf, 0x69, 0x0a, 0x47, 0xbd, 0x52, 0x74, 0xf1, 0x8c, 0xaa, 0xea, 0x4f, 0x60, + 0xbc, 0xda, 0xf5, 0x03, 0xf7, 0x78, 0xe7, 0x08, 0x1f, 0xe3, 0x85, 0x0b, 0xe1, 0xd5, 0xb3, 0x49, + 0x8b, 0x1b, 0x01, 0x29, 0x57, 0x87, 0xa9, 0x80, 0xa3, 0x2f, 0x00, 0x89, 0x3b, 0xe4, 0x2a, 0x59, + 0x1f, 0x0e, 0x59, 0xcb, 0x0b, 0xf3, 0x74, 0xac, 0xf4, 0xe2, 0x28, 0xae, 0x9e, 0x8d, 0x43, 0x59, + 0xad, 0xaa, 0x13, 0xe3, 0xc8, 0xa4, 0x43, 0xac, 0x8b, 0xab, 0x9e, 0xd5, 0x39, 0x5a, 0x58, 0x08, + 0x6f, 0x82, 0x7c, 0x50, 0x87, 0xa4, 0x5c, 0x93, 0x68, 0x43, 0x70, 0x54, 0x07, 0x60, 0x3f, 0x37, + 0xc8, 0xc4, 0x5f, 0xa4, 0xfc, 0x5a, 0xd0, 0xf8, 0x45, 0x2a, 0x04, 0xaf, 0x2e, 0x52, 0x39, 0x99, + 0x91, 0x6d, 0xdb, 0xda, 0x6c, 0x2a, 0x64, 0xd0, 0x53, 0x28, 0xb0, 0x5f, 0x9b, 0xae, 0x63, 0x07, + 0x6c, 0xeb, 0x2d, 0x6a, 0x9a, 0xc2, 0x68, 0xb5, 0x68, 0x80, 0x6a, 0x68, 0x79, 0x03, 0xc7, 0xb2, + 0x56, 0x69, 0x26, 0x46, 0x18, 0xd5, 0x60, 0xbc, 0xe6, 0xb9, 0xad, 0x6e, 0x33, 0xa0, 0x42, 0xe5, + 0x25, 0x7a, 0x99, 0x41, 0xbc, 0x1d, 0xa5, 0x86, 0xf1, 0xa4, 0xc3, 0x0a, 0x1a, 0xe4, 0x5c, 0x56, + 0x79, 0xa2, 0x00, 0x3e, 0x1a, 0x1a, 0x1d, 0x2f, 0x4c, 0xb0, 0x47, 0xb6, 0x47, 0x43, 0xa3, 0x93, + 0x85, 0x29, 0xe3, 0x77, 0x73, 0x80, 0xe2, 0xab, 0x1b, 0xdd, 0x85, 0x11, 0xec, 0x10, 0x01, 0xb4, + 0xc5, 0x77, 0x69, 0x7a, 0x26, 0xf1, 0x22, 0x55, 0x13, 0xc8, 0x8b, 0xd0, 0x17, 0x30, 0xc3, 0x3e, + 0x06, 0xf1, 0x1d, 0xb6, 0xed, 0x63, 0x3b, 0xa0, 0x3b, 0xf7, 0x30, 0x9b, 0xff, 0x84, 0x6a, 0x55, + 0x71, 0xc0, 0xab, 0xe9, 0x57, 0xbb, 0x41, 0x2a, 0x8d, 0x2e, 0xcc, 0x25, 0xae, 0x6b, 0xb4, 0x09, + 0x73, 0xc7, 0xae, 0x13, 0x1c, 0xb5, 0x5f, 0x8a, 0x65, 0xcd, 0x5b, 0xcb, 0xd1, 0xd6, 0xe8, 0x54, + 0x26, 0x02, 0x98, 0x33, 0xbc, 0x98, 0x53, 0xa4, 0xed, 0x3c, 0x1a, 0x1a, 0xcd, 0x17, 0x06, 0xe5, + 0x48, 0x0c, 0x13, 0xce, 0xc7, 0x96, 0x07, 0xfa, 0x14, 0x26, 0x9a, 0x54, 0xfc, 0xd3, 0x5a, 0x62, + 0x1f, 0x87, 0x52, 0xae, 0xf2, 0x9d, 0x95, 0xb3, 0xa1, 0xfc, 0xfd, 0x1c, 0xcc, 0xa7, 0x2c, 0x8c, + 0xb3, 0xb3, 0xfa, 0x2b, 0xb8, 0x70, 0x6c, 0xbd, 0x68, 0x78, 0x54, 0x14, 0x6b, 0x78, 0x96, 0x13, + 0xe1, 0xf6, 0x5b, 0xa7, 0x27, 0xa5, 0xab, 0xc9, 0x10, 0xaa, 0x21, 0xc1, 0xb1, 0xf5, 0xc2, 0xa4, + 0x00, 0x26, 0xa9, 0x67, 0xfd, 0xbc, 0x0f, 0xe7, 0x99, 0xd8, 0xd6, 0xb7, 0xba, 0xc6, 0xa8, 0x01, + 0xd4, 0xf1, 0xb1, 0xd5, 0x39, 0x72, 0xc9, 0x01, 0x5f, 0x51, 0x7f, 0xf1, 0xeb, 0x3e, 0xe2, 0xd7, + 0x6f, 0x59, 0xb1, 0xf7, 0x40, 0x68, 0xd9, 0x04, 0xa4, 0xa9, 0x60, 0x19, 0x7f, 0x9c, 0x07, 0x54, + 0xee, 0xb6, 0xec, 0xa0, 0x1e, 0x78, 0xd8, 0x3a, 0x16, 0xdd, 0xf8, 0x10, 0x26, 0x98, 0x04, 0xce, + 0x8a, 0x69, 0x77, 0xc6, 0x97, 0x66, 0xf8, 0xe7, 0xa0, 0x56, 0xad, 0x0d, 0x98, 0x1a, 0x28, 0x41, + 0x35, 0x31, 0xbb, 0x55, 0x52, 0xd4, 0xbc, 0x86, 0xaa, 0x56, 0x11, 0x54, 0xf5, 0x37, 0xfa, 0x1c, + 0xa6, 0xaa, 0xee, 0x71, 0x87, 0xf0, 0x84, 0x23, 0x0f, 0xf2, 0x8b, 0x08, 0x6f, 0x57, 0xab, 0x5c, + 0x1b, 0x30, 0x23, 0xe0, 0x68, 0x0b, 0x66, 0x1e, 0xb6, 0xbb, 0xfe, 0x51, 0xd9, 0x69, 0x55, 0xdb, + 0xae, 0x2f, 0xa8, 0x0c, 0xf1, 0x1b, 0x33, 0x17, 0x1c, 0xe3, 0x10, 0x6b, 0x03, 0x66, 0x12, 0x22, + 0xba, 0x01, 0xc3, 0x2b, 0xcf, 0xb0, 0x13, 0xc8, 0xa7, 0x66, 0x6e, 0xab, 0xb2, 0xed, 0xe0, 0xed, + 0x27, 0x6b, 0x03, 0x26, 0xab, 0xad, 0x8c, 0xc1, 0x88, 0x10, 0x9a, 0xef, 0x92, 0xb3, 0x57, 0xb2, + 0xb3, 0x1e, 0x58, 0x41, 0xd7, 0x47, 0x45, 0x18, 0xdd, 0xed, 0x10, 0x59, 0x4e, 0xdc, 0x88, 0x4d, + 0xf9, 0xdb, 0xf8, 0xb6, 0xce, 0x69, 0xb4, 0xa8, 0x6a, 0x49, 0x19, 0x70, 0x58, 0x60, 0xac, 0xe9, + 0xcc, 0xcd, 0x86, 0xd6, 0xda, 0xcd, 0x47, 0xda, 0x2d, 0x44, 0x79, 0x6d, 0xcc, 0x25, 0x32, 0xcf, + 0xf8, 0x12, 0xae, 0xec, 0x76, 0x7c, 0xec, 0x05, 0xe5, 0x4e, 0xa7, 0x6d, 0x37, 0xd9, 0x53, 0x07, + 0x15, 0xae, 0xc5, 0x62, 0x79, 0x1f, 0xce, 0xb1, 0x02, 0xbe, 0x4c, 0xc4, 0x1a, 0x2c, 0x77, 0x3a, + 0x5c, 0xa4, 0x7f, 0xc0, 0xa4, 0x00, 0x26, 0xa4, 0x9b, 0x1c, 0xda, 0xf8, 0xad, 0x1c, 0x5c, 0x61, + 0x5f, 0x40, 0x2a, 0xe9, 0x6f, 0xc1, 0x18, 0x35, 0x15, 0xe9, 0x58, 0x4d, 0xed, 0xd6, 0xe7, 0x88, + 0x42, 0x33, 0xac, 0x57, 0x8c, 0x70, 0xf2, 0xe9, 0x46, 0x38, 0xe2, 0x03, 0x1b, 0x4c, 0xfc, 0xc0, + 0xbe, 0x00, 0x83, 0xf7, 0xa8, 0xdd, 0x8e, 0x75, 0xca, 0x7f, 0x95, 0x5e, 0x19, 0xff, 0x29, 0x0f, 0xf3, 0xab, 0xd8, 0xc1, 0x9e, 0x45, 0xc7, 0xa9, 0x29, 0x38, 0xd4, 0xc7, 0xfe, 0x5c, 0xe6, 0x63, 0xbf, 0xbc, 0xbd, 0xe7, 0x53, 0x6e, 0xef, 0x17, 0x61, 0x70, 0xd7, 0x5c, 0xe7, 0xc3, 0xa2, 0x72, 0x69, 0xd7, 0xb3, 0x4d, 0x52, 0x86, 0xd6, 0x43, 0x43, 0x81, 0xa1, 0x9e, 0xba, 0xa3, 0x19, 0xfe, @@ -15477,7 +15477,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x2e, 0x08, 0x44, 0x3e, 0x82, 0xb3, 0xcf, 0xe0, 0x7b, 0x30, 0xc1, 0x71, 0x77, 0xc2, 0xc5, 0x52, 0x39, 0x7f, 0x7a, 0x52, 0x9a, 0x14, 0x1b, 0x16, 0xdb, 0xf5, 0x34, 0x30, 0xf4, 0x9e, 0xa2, 0xe3, 0x64, 0x7a, 0x73, 0x22, 0xdd, 0x8f, 0x31, 0x65, 0x68, 0xaa, 0xa6, 0xd3, 0xf8, 0x1a, 0xae, 0xa4, - 0x75, 0xfc, 0x0d, 0xf0, 0xe5, 0x5f, 0xe4, 0xe0, 0x12, 0x27, 0xaf, 0x7d, 0x4e, 0xaf, 0xb4, 0x33, + 0x75, 0xfc, 0x0d, 0xf0, 0xe5, 0x9f, 0xe5, 0xe0, 0x12, 0x27, 0xaf, 0x7d, 0x4e, 0xaf, 0xb4, 0x33, 0x9f, 0xc1, 0xba, 0xee, 0x11, 0x8c, 0x93, 0x06, 0x45, 0xbf, 0x07, 0xf9, 0xf1, 0xc3, 0xa5, 0xeb, 0xb0, 0x66, 0xd9, 0x0a, 0x2c, 0x6e, 0x2f, 0x60, 0x1d, 0xb7, 0x1b, 0xa2, 0xff, 0x2a, 0xb2, 0xf1, 0x7d, 0x58, 0x4c, 0x1e, 0xc2, 0x1b, 0xe0, 0xcf, 0x23, 0x28, 0x26, 0x6c, 0x9c, 0xaf, 0x76, 0x6e, @@ -15493,7 +15493,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x74, 0xa3, 0xf0, 0x29, 0x77, 0xb6, 0x03, 0xb1, 0xb6, 0xd3, 0xe8, 0xf7, 0xe5, 0x09, 0x21, 0x2e, 0x61, 0xf9, 0xc4, 0x4b, 0xd8, 0x75, 0xb8, 0x26, 0x2f, 0x61, 0xd1, 0x66, 0xe4, 0x63, 0xd5, 0xf7, 0xe1, 0x12, 0x1b, 0xa8, 0xb0, 0x81, 0xd2, 0xbb, 0xf1, 0x71, 0x64, 0x98, 0xf3, 0x7c, 0x98, 0x3a, - 0x74, 0xca, 0x20, 0xff, 0x46, 0x4e, 0x7c, 0x72, 0xc9, 0xc4, 0x7f, 0xd1, 0xb7, 0xd2, 0x2d, 0x28, + 0x74, 0xca, 0x20, 0xff, 0x5a, 0x4e, 0x7c, 0x72, 0xc9, 0xc4, 0x7f, 0xd1, 0xb7, 0xd2, 0x2d, 0x28, 0x49, 0x86, 0xe8, 0x3d, 0x7a, 0xb5, 0x2b, 0xe9, 0x26, 0xcc, 0xa9, 0x64, 0xec, 0x26, 0xde, 0xbb, 0x4f, 0x35, 0xae, 0xef, 0x92, 0xcf, 0x82, 0x16, 0x88, 0x65, 0xb7, 0x90, 0xc0, 0x37, 0x0a, 0x6f, 0x4a, 0x48, 0xa3, 0x01, 0x8b, 0xf1, 0xa9, 0xb0, 0x9b, 0xc2, 0xfc, 0x15, 0x7d, 0x4e, 0x3e, 0x61, @@ -15503,7 +15503,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x7c, 0x1f, 0x52, 0xeb, 0xa3, 0xa1, 0xd1, 0xc1, 0xc2, 0x90, 0x89, 0xea, 0xf6, 0xa1, 0xb3, 0x6f, 0x07, 0x47, 0xb2, 0xc1, 0xb2, 0xf1, 0x03, 0x98, 0xd1, 0x9a, 0xe7, 0x5f, 0x71, 0xa6, 0xbb, 0x00, 0xba, 0x09, 0x23, 0xd5, 0x32, 0xb5, 0x3a, 0xa0, 0xd7, 0xfa, 0x09, 0xb6, 0xdf, 0x34, 0xad, 0x06, - 0x75, 0x09, 0x33, 0x45, 0xa5, 0xf1, 0x0f, 0x86, 0x14, 0xea, 0x8a, 0x13, 0x46, 0xc6, 0xe8, 0xee, + 0x75, 0x09, 0x33, 0x45, 0xa5, 0xf1, 0xf7, 0x86, 0x14, 0xea, 0x8a, 0x13, 0x46, 0xc6, 0xe8, 0xee, 0x03, 0xb0, 0x15, 0xa2, 0x0c, 0x8e, 0x08, 0x80, 0xe3, 0xfc, 0xa1, 0x94, 0x6d, 0xc9, 0xa6, 0x02, 0xd4, 0xaf, 0x93, 0x06, 0x37, 0x98, 0x64, 0x48, 0xc2, 0x9a, 0x40, 0x1a, 0x4c, 0x72, 0xd2, 0xbe, 0xa9, 0x02, 0xa1, 0x1f, 0x46, 0x6d, 0x89, 0x87, 0xa9, 0x7a, 0xfd, 0x2d, 0xf1, 0xe2, 0x13, 0x1f, @@ -15528,11 +15528,11 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xe6, 0xc1, 0x65, 0xfc, 0x4e, 0x0e, 0xe6, 0x53, 0x1c, 0x09, 0xd0, 0x3b, 0xda, 0x70, 0x66, 0x94, 0xe1, 0x08, 0x90, 0xb5, 0x01, 0x3e, 0x9e, 0xaa, 0x62, 0xb4, 0x39, 0x78, 0x06, 0xa3, 0xcd, 0xb5, 0x81, 0xd0, 0x50, 0xb3, 0x02, 0x30, 0x2a, 0xca, 0x8d, 0x69, 0x98, 0xd4, 0xf8, 0x66, 0x18, 0x30, - 0xa1, 0xb6, 0x4c, 0x26, 0xa7, 0xea, 0xb6, 0xe4, 0xe4, 0x90, 0xbf, 0x8d, 0xbf, 0x95, 0x83, 0x59, + 0xa1, 0xb6, 0x4c, 0x26, 0xa7, 0xea, 0xb6, 0xe4, 0xe4, 0x90, 0xbf, 0x8d, 0xbf, 0x91, 0x83, 0x59, 0x3a, 0xc4, 0x43, 0x9b, 0xec, 0x1a, 0x21, 0x87, 0x96, 0xb4, 0x91, 0x2c, 0x6a, 0x23, 0x89, 0xc0, 0xca, 0x21, 0x7d, 0x14, 0x1b, 0xd2, 0x62, 0xd2, 0x90, 0xe8, 0xf2, 0xb6, 0x5d, 0x47, 0x1b, 0x89, 0xf2, 0xd2, 0xf1, 0xbb, 0x39, 0x98, 0x51, 0xfa, 0x24, 0xfb, 0x7f, 0x5f, 0xeb, 0xd2, 0xa5, 0x84, - 0x2e, 0xc5, 0x98, 0x5c, 0x89, 0xf5, 0xe8, 0xad, 0xac, 0x1e, 0xf5, 0xe4, 0xf1, 0x7f, 0xce, 0xc1, + 0x2e, 0xc5, 0x98, 0x5c, 0x89, 0xf5, 0xe8, 0xad, 0xac, 0x1e, 0xf5, 0xe4, 0xf1, 0x7f, 0xcc, 0xc1, 0x5c, 0x22, 0x0f, 0xd0, 0x05, 0x22, 0x16, 0x36, 0x3d, 0x1c, 0x70, 0xf6, 0xf2, 0x5f, 0xa4, 0x7c, 0xdd, 0xf7, 0xbb, 0xd8, 0xe3, 0x8a, 0x35, 0xfe, 0x0b, 0xbd, 0x05, 0x93, 0x35, 0xec, 0xd9, 0x6e, 0x8b, 0x99, 0xf3, 0x32, 0x1b, 0xa4, 0x49, 0x53, 0x2f, 0x44, 0x8b, 0x30, 0x56, 0x6e, 0x1f, 0xba, @@ -15548,14 +15548,14 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xf1, 0x96, 0x77, 0x61, 0x56, 0xe9, 0x50, 0xb8, 0x8f, 0x31, 0x9e, 0x94, 0x92, 0x87, 0xa3, 0x7e, 0x68, 0x89, 0xe8, 0x68, 0x1f, 0xe6, 0xf5, 0x4e, 0x85, 0x94, 0xf5, 0x8f, 0x25, 0x09, 0x64, 0x6d, 0xc0, 0x4c, 0xc3, 0x46, 0x4b, 0x30, 0x58, 0x6e, 0x3e, 0xe5, 0x6c, 0x49, 0x9e, 0x32, 0x36, 0xb2, - 0x72, 0xf3, 0xe9, 0xda, 0x80, 0x49, 0x80, 0xb5, 0xef, 0xe5, 0x5f, 0xe5, 0x60, 0x3e, 0x65, 0x86, + 0x72, 0xf3, 0xe9, 0xda, 0x80, 0x49, 0x80, 0xb5, 0xef, 0xe5, 0x5f, 0xe4, 0x60, 0x3e, 0x65, 0x86, 0xd1, 0x15, 0x00, 0x56, 0xa8, 0x9c, 0x18, 0x4a, 0x09, 0x11, 0x34, 0xb9, 0x49, 0xc3, 0xcb, 0x0e, 0x9b, 0x99, 0x29, 0xe9, 0x39, 0x18, 0x56, 0x98, 0x0a, 0x10, 0xaa, 0x09, 0xeb, 0x1f, 0xe6, 0xc0, 0xa8, 0x6f, 0xeb, 0x4a, 0x8d, 0x66, 0xf6, 0x13, 0x75, 0x5c, 0x54, 0x49, 0x70, 0xd5, 0x6c, 0x35, 0x3a, 0x0a, 0x39, 0x68, 0x74, 0x0b, 0xce, 0xb1, 0x42, 0x3e, 0x87, 0x22, 0x9a, 0x40, 0x08, 0xcc, - 0xeb, 0x8d, 0xbf, 0x9b, 0x83, 0x0b, 0xec, 0xc4, 0x8c, 0x7d, 0x1a, 0xdf, 0xd5, 0x3e, 0x8d, 0x6b, + 0xeb, 0x8d, 0xbf, 0x9d, 0x83, 0x0b, 0xec, 0xc4, 0x8c, 0x7d, 0x1a, 0xdf, 0xd5, 0x3e, 0x8d, 0x6b, 0xb2, 0xc3, 0x49, 0xc0, 0xda, 0xd7, 0x51, 0xd1, 0xbd, 0xdd, 0xfa, 0xfd, 0x2a, 0x54, 0x24, 0x75, - 0xdd, 0xfe, 0xfd, 0x9c, 0xd0, 0x54, 0xc5, 0x97, 0xee, 0x0a, 0x4c, 0xbc, 0xda, 0x92, 0xd5, 0xd0, + 0xdd, 0xfe, 0xdd, 0x9c, 0xd0, 0x54, 0xc5, 0x97, 0xee, 0x0a, 0x4c, 0xbc, 0xda, 0x92, 0xd5, 0xd0, 0xd0, 0x7b, 0x6c, 0x45, 0xe5, 0xb3, 0x47, 0x9a, 0xb9, 0xa8, 0x3e, 0x81, 0x62, 0x3a, 0x6b, 0x7a, 0x2d, 0x2b, 0xe3, 0x61, 0x02, 0xf6, 0xab, 0x4c, 0xe7, 0x5f, 0xe4, 0x62, 0x84, 0xea, 0x2f, 0x9d, 0xa6, 0x98, 0xd2, 0x9b, 0x51, 0x53, 0xf5, 0x54, 0xf3, 0x5f, 0xb5, 0xbb, 0xf9, 0xf0, 0x4d, 0x84, @@ -15572,7 +15572,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x8c, 0xdf, 0xcb, 0xc1, 0x45, 0xaa, 0x01, 0xb6, 0x9d, 0xc3, 0x36, 0xde, 0xf5, 0x75, 0x2f, 0x8a, 0xef, 0x68, 0x5b, 0xe6, 0x7c, 0x8a, 0x1b, 0xec, 0x37, 0xb5, 0x51, 0xfe, 0x41, 0x0e, 0x8a, 0x49, 0x7d, 0x7b, 0xb3, 0x7b, 0xe5, 0x1d, 0x7e, 0xbd, 0xce, 0x6b, 0x56, 0x8f, 0xb2, 0x4d, 0x31, 0x58, - 0x32, 0x48, 0xf2, 0xbf, 0xb6, 0x49, 0xfe, 0xf7, 0x1c, 0xcc, 0xae, 0xfb, 0xea, 0x55, 0x86, 0x33, + 0x32, 0x48, 0xf2, 0xbf, 0xb6, 0x49, 0xfe, 0xb7, 0x1c, 0xcc, 0xae, 0xfb, 0xea, 0x55, 0x86, 0x33, 0xee, 0x4e, 0x52, 0x28, 0x03, 0x3a, 0xaf, 0x6b, 0x03, 0x49, 0xa1, 0x0a, 0xde, 0x55, 0x9c, 0x46, 0xf3, 0x59, 0x31, 0x0a, 0x88, 0xd0, 0x2c, 0x9d, 0x5f, 0x6f, 0xc2, 0xd0, 0x16, 0x11, 0x14, 0x07, 0xf9, 0xfa, 0x63, 0x18, 0xa4, 0x88, 0xfa, 0x77, 0x92, 0x2e, 0x93, 0x1f, 0xe8, 0x61, 0xcc, 0x8b, @@ -15583,13 +15583,13 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xf9, 0xb5, 0x0a, 0x67, 0x56, 0x1b, 0xe6, 0x22, 0x53, 0x11, 0xba, 0x93, 0xcb, 0x3b, 0x28, 0xb5, 0x1a, 0x34, 0xe5, 0xef, 0xe8, 0x15, 0x35, 0xdf, 0xd7, 0x15, 0xd5, 0xa8, 0xc2, 0xf9, 0xd8, 0xfa, 0x40, 0x88, 0x7a, 0x72, 0x33, 0x2d, 0x0d, 0x39, 0x50, 0xeb, 0xf5, 0x35, 0x52, 0xb6, 0xb3, 0x51, - 0x67, 0xee, 0x45, 0xa4, 0x6c, 0x67, 0xa3, 0x5e, 0x39, 0xc7, 0xd6, 0x9b, 0xf1, 0x4f, 0xf2, 0x54, + 0x67, 0xee, 0x45, 0xa4, 0x6c, 0x67, 0xa3, 0x5e, 0x39, 0xc7, 0xd6, 0x9b, 0xf1, 0x8f, 0xf2, 0x54, 0x79, 0x11, 0xe3, 0x5c, 0x44, 0x0f, 0xac, 0xea, 0xa2, 0x2b, 0x30, 0x46, 0xf9, 0xb4, 0x2c, 0xfc, 0xf5, 0xb2, 0x6d, 0x81, 0x46, 0x7f, 0x7a, 0x52, 0x1a, 0xa0, 0x06, 0x40, 0x21, 0x1a, 0xfa, 0x0c, 0x46, 0x56, 0x9c, 0x16, 0xa5, 0x30, 0x78, 0x06, 0x0a, 0x02, 0x89, 0xcc, 0x1e, 0xed, 0x32, 0x11, 0x05, 0xb9, 0xfa, 0xd0, 0x54, 0x4a, 0xe8, 0xe4, 0x50, 0x03, 0xcb, 0x61, 0x3a, 0xb1, 0xec, 0x07, 0x75, 0xe9, 0x27, 0x5d, 0x10, 0x61, 0x82, 0xc6, 0x4c, 0xf9, 0x1b, 0x19, 0x30, 0xbc, 0xed, 0xb5, - 0x78, 0xa8, 0x8f, 0xa9, 0xa5, 0x09, 0xce, 0x7d, 0x5a, 0x66, 0xb2, 0x2a, 0xe3, 0xbf, 0xe6, 0x60, + 0x78, 0xa8, 0x8f, 0xa9, 0xa5, 0x09, 0xce, 0x7d, 0x5a, 0x66, 0xb2, 0x2a, 0xe3, 0xbf, 0xe4, 0x60, 0x7e, 0x15, 0x07, 0x89, 0xab, 0x4d, 0xe3, 0x4a, 0xee, 0xb5, 0xb9, 0x92, 0x7f, 0x15, 0xae, 0xc8, 0x51, 0x0f, 0xa6, 0x8d, 0x7a, 0x28, 0x6d, 0xd4, 0xc3, 0xe9, 0xa3, 0x5e, 0x85, 0x73, 0x6c, 0xa8, 0xe8, 0x3a, 0x0c, 0xaf, 0x07, 0xf8, 0x38, 0x54, 0x6a, 0xa9, 0x96, 0x8c, 0x26, 0xab, 0x23, 0x37, @@ -15617,23 +15617,23 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xf7, 0x1e, 0x7d, 0x08, 0xb0, 0xe3, 0x06, 0x56, 0xbb, 0x4a, 0x75, 0x80, 0x83, 0xa1, 0x3f, 0x45, 0x40, 0x4a, 0x1b, 0xd1, 0x70, 0x0f, 0x0a, 0xb0, 0xf1, 0x3d, 0xfa, 0x45, 0x26, 0x77, 0xba, 0xbf, 0x8f, 0xa4, 0x0a, 0xd7, 0x23, 0x56, 0x25, 0xaf, 0x40, 0x24, 0x80, 0x39, 0xc2, 0x7e, 0x22, 0xc2, - 0xac, 0x7a, 0x6e, 0xb7, 0xf3, 0x8b, 0x99, 0xf5, 0x7f, 0x9b, 0x63, 0xa6, 0xb0, 0x6a, 0xb3, 0x7c, + 0xac, 0x7a, 0x6e, 0xb7, 0xf3, 0x8b, 0x99, 0xf5, 0x7f, 0x9d, 0x63, 0xa6, 0xb0, 0x6a, 0xb3, 0x7c, 0xa2, 0xab, 0x00, 0x61, 0x69, 0xc4, 0x25, 0x42, 0x56, 0xec, 0xdd, 0x67, 0x77, 0x77, 0xfa, 0xde, 0x74, 0xc8, 0x08, 0x28, 0x68, 0xbf, 0xd8, 0x99, 0x7c, 0x40, 0x4d, 0x49, 0x64, 0xeb, 0xfd, 0xf1, 0xfd, 0x7d, 0xa1, 0xa3, 0x3a, 0x23, 0xde, 0x11, 0xcc, 0x92, 0x6f, 0x97, 0xdc, 0x6b, 0x5c, 0xcf, 0x0e, 0x84, 0x6b, 0x0e, 0xaa, 0x71, 0x57, 0x7a, 0x86, 0xf5, 0xc9, 0xcf, 0x4f, 0x4a, 0x1f, 0x9c, 0xc5, 0x2f, 0x59, 0xd0, 0xdc, 0x91, 0xee, 0xf7, 0xc6, 0x3c, 0x0c, 0x56, 0xcd, 0x0d, 0xba, 0x55, - 0x99, 0x1b, 0x72, 0xab, 0x32, 0x37, 0x8c, 0xff, 0x92, 0x87, 0x12, 0x0b, 0xf6, 0x41, 0x2d, 0x90, + 0x99, 0x1b, 0x72, 0xab, 0x32, 0x37, 0x8c, 0xff, 0x9c, 0x87, 0x12, 0x0b, 0xf6, 0x41, 0x2d, 0x90, 0xc2, 0x1b, 0x96, 0x62, 0xd2, 0xd4, 0xaf, 0xa6, 0x22, 0x12, 0xcc, 0x23, 0xdf, 0x4f, 0x30, 0x8f, 0x5f, 0x7e, 0x75, 0xad, 0x72, 0xe5, 0xed, 0xd3, 0x93, 0xd2, 0xf5, 0x50, 0x9d, 0xc0, 0x6a, 0x93, 0xf4, 0x0a, 0x29, 0x4d, 0xc4, 0x15, 0x21, 0x43, 0xaf, 0xa0, 0x08, 0xb9, 0x07, 0x23, 0xf4, 0xc2, 0xb2, 0x5e, 0xe3, 0x76, 0xb3, 0x74, 0x79, 0xd2, 0xb8, 0x3c, 0x0d, 0x5b, 0x8d, 0x6b, 0x26, 0xc0, - 0x8c, 0xbf, 0x9d, 0x87, 0xab, 0xe9, 0x3c, 0xe7, 0x7d, 0x5b, 0x06, 0x08, 0x6d, 0x9f, 0xb2, 0x6c, + 0x8c, 0xbf, 0x99, 0x87, 0xab, 0xe9, 0x3c, 0xe7, 0x7d, 0x5b, 0x06, 0x08, 0x6d, 0x9f, 0xb2, 0x6c, 0xad, 0xe8, 0xb7, 0xf3, 0x1c, 0x1f, 0x48, 0x5b, 0x47, 0x05, 0x8f, 0x48, 0x2d, 0xc2, 0x67, 0x35, 0xf2, 0x5a, 0xa8, 0xb9, 0xb2, 0xf2, 0xb0, 0x99, 0xbc, 0x48, 0x0b, 0x9b, 0xc9, 0xcb, 0xd0, 0x01, 0xcc, 0xd7, 0x3c, 0xfb, 0x99, 0x15, 0xe0, 0xc7, 0xf8, 0x65, 0xcd, 0x6d, 0xdb, 0xcd, 0x97, 0x2b, 0xdc, 0x75, 0x8b, 0x39, 0x22, 0xdf, 0x3a, 0x3d, 0x29, 0xbd, 0xd5, 0x61, 0x20, 0xe4, 0xc3, 0x6c, - 0x74, 0x28, 0x50, 0x23, 0xee, 0xcd, 0x95, 0x46, 0xc8, 0xf8, 0x37, 0x39, 0xb8, 0x44, 0x05, 0x6a, + 0x74, 0x28, 0x50, 0x23, 0xee, 0xcd, 0x95, 0x46, 0xc8, 0xf8, 0x57, 0x39, 0xb8, 0x44, 0x05, 0x6a, 0xfe, 0xf2, 0x22, 0x1a, 0x7f, 0x25, 0x93, 0x5b, 0x75, 0x80, 0x7c, 0x2d, 0x52, 0x93, 0x5b, 0xcd, 0xa7, 0xd7, 0xd4, 0xc0, 0xd0, 0x3a, 0x8c, 0xf3, 0xdf, 0x8a, 0xfa, 0x7c, 0x4e, 0xd9, 0xb0, 0xe8, 0x52, 0x67, 0x3a, 0x27, 0xba, 0xb0, 0x39, 0x31, 0xea, 0x78, 0x68, 0xaa, 0xb8, 0xc6, 0xcf, 0xf2, @@ -15642,11 +15642,11 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x63, 0xda, 0x77, 0x61, 0x34, 0x12, 0x72, 0x87, 0xce, 0xbf, 0xf8, 0x42, 0xc3, 0xa9, 0x5a, 0x1b, 0x30, 0x25, 0x24, 0xfa, 0xf5, 0xf4, 0x27, 0x5c, 0xae, 0x7f, 0xe8, 0xa5, 0x48, 0xa5, 0x1f, 0x2c, 0xf9, 0x58, 0x2d, 0xa5, 0x36, 0xe1, 0x83, 0x5d, 0x1b, 0x30, 0xd3, 0x5a, 0xaa, 0x8c, 0xc3, 0x58, - 0x99, 0x3e, 0x4b, 0x93, 0x8b, 0xfb, 0x7f, 0xcb, 0xc3, 0x15, 0xe1, 0x36, 0x95, 0xc2, 0xe6, 0x2f, + 0x99, 0x3e, 0x4b, 0x93, 0x8b, 0xfb, 0x7f, 0xcd, 0xc3, 0x15, 0xe1, 0x36, 0x95, 0xc2, 0xe6, 0x2f, 0x61, 0x5e, 0x14, 0x95, 0x3b, 0x44, 0x60, 0xc0, 0x2d, 0x9d, 0xd3, 0x2c, 0x38, 0xa6, 0xe0, 0xb4, 0xc5, 0x61, 0x42, 0x66, 0xa7, 0xa1, 0xbf, 0x19, 0x35, 0xea, 0x67, 0x49, 0x01, 0x90, 0xa8, 0x3a, 0x53, 0xdd, 0x33, 0x35, 0xd6, 0x68, 0xfb, 0x67, 0x2b, 0xa6, 0x86, 0x1d, 0x7a, 0x5d, 0x35, 0xec, - 0xda, 0x40, 0x54, 0x11, 0x5b, 0x99, 0x82, 0x89, 0x2d, 0xfc, 0x3c, 0xe4, 0xfb, 0x5f, 0xcb, 0x45, + 0xda, 0x40, 0x54, 0x11, 0x5b, 0x99, 0x82, 0x89, 0x2d, 0xfc, 0x3c, 0xe4, 0xfb, 0x5f, 0xc9, 0x45, 0x9c, 0xe6, 0x89, 0x84, 0xc1, 0xbc, 0xe7, 0x73, 0x61, 0x0c, 0x1d, 0xea, 0x34, 0xaf, 0x4a, 0x18, 0x0c, 0x74, 0x1d, 0x46, 0x98, 0xad, 0x46, 0xab, 0x8f, 0xbb, 0xb9, 0xf4, 0x7f, 0x62, 0x2e, 0xa5, 0x2d, 0x76, 0x4d, 0xe7, 0xf8, 0xc6, 0x63, 0xb8, 0xc6, 0xad, 0xff, 0xf5, 0xc9, 0xa7, 0x0d, 0x9d, @@ -15665,7 +15665,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xee, 0x1e, 0xe4, 0xcc, 0xb6, 0xdb, 0x98, 0xfb, 0x36, 0x89, 0x15, 0x90, 0xf2, 0xae, 0x96, 0xfb, 0x86, 0xdf, 0xd5, 0xfe, 0x30, 0x2f, 0x9c, 0x5c, 0x62, 0xaf, 0xef, 0x67, 0x7f, 0x5e, 0x4b, 0x1c, 0x41, 0x5f, 0x07, 0x5a, 0xb2, 0xa1, 0x44, 0x45, 0x7b, 0x82, 0xcf, 0xa7, 0x3c, 0xc1, 0x6b, 0xef, - 0x95, 0x41, 0x8f, 0x37, 0xf9, 0xc1, 0xd7, 0x7f, 0xf9, 0xfa, 0xe7, 0x23, 0x70, 0xbe, 0x66, 0x1d, + 0x95, 0x41, 0x8f, 0x37, 0xf9, 0xc1, 0xd7, 0x7f, 0xf9, 0xfa, 0xa7, 0x23, 0x70, 0xbe, 0x66, 0x1d, 0xda, 0x0e, 0xd9, 0x38, 0x4d, 0xec, 0xbb, 0x5d, 0xaf, 0x89, 0x51, 0x19, 0xa6, 0x74, 0x0b, 0xe6, 0x1e, 0xf6, 0xd9, 0xe4, 0x6c, 0xd0, 0xcb, 0xd0, 0x12, 0x8c, 0x49, 0xcf, 0x62, 0xbe, 0xa1, 0x27, 0x78, 0x1c, 0xaf, 0x0d, 0x98, 0x21, 0x18, 0xfa, 0x50, 0x7b, 0xe8, 0x98, 0x96, 0x4e, 0xf2, 0x14, @@ -15681,7 +15681,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xa7, 0x27, 0xa5, 0xd9, 0x50, 0xbd, 0xa0, 0xd1, 0x0c, 0x09, 0xa0, 0x9f, 0xc0, 0x35, 0xb9, 0x44, 0xb7, 0xbd, 0x64, 0x45, 0x0c, 0x0f, 0xc6, 0x7d, 0x3b, 0xba, 0xc2, 0xd3, 0xe0, 0xf7, 0xee, 0xaf, 0x0d, 0x98, 0xbd, 0xc9, 0x56, 0x00, 0x46, 0x3d, 0xfe, 0x51, 0x3e, 0x1a, 0x1a, 0x1d, 0x2a, 0x0c, - 0xb3, 0x75, 0x23, 0x4c, 0xee, 0xff, 0xc7, 0x39, 0xe6, 0xc3, 0xba, 0xeb, 0xd8, 0x4f, 0xec, 0xf0, + 0xb3, 0x75, 0x23, 0x4c, 0xee, 0xff, 0xfb, 0x39, 0xe6, 0xc3, 0xba, 0xeb, 0xd8, 0x4f, 0xec, 0xf0, 0xfb, 0x55, 0x15, 0x3c, 0x61, 0x76, 0x0e, 0x2e, 0x7e, 0xa5, 0xe4, 0xe1, 0x90, 0xba, 0xa0, 0x7c, 0x4f, 0x5d, 0xd0, 0x03, 0xe5, 0xbd, 0x43, 0x09, 0x0a, 0xc9, 0x8e, 0x59, 0x5d, 0xf7, 0x12, 0x3e, 0x84, 0x7c, 0x0d, 0xe7, 0x68, 0x78, 0x3a, 0xf6, 0x98, 0x34, 0xbe, 0x74, 0x87, 0xef, 0x5a, 0x19, @@ -15699,9 +15699,9 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x17, 0x9d, 0x26, 0x42, 0xaf, 0xc3, 0x6a, 0x93, 0x08, 0xc6, 0x91, 0xd1, 0x87, 0x00, 0x35, 0xdb, 0x71, 0x70, 0x8b, 0xbe, 0x59, 0x8d, 0x53, 0x52, 0x54, 0xab, 0xd7, 0xa1, 0xa5, 0x0d, 0xd7, 0x69, 0xab, 0x2c, 0x55, 0x80, 0x8b, 0x1f, 0xc2, 0xb8, 0xb2, 0xc4, 0x12, 0xe2, 0x1a, 0xcc, 0xaa, 0x71, - 0x0d, 0xc6, 0xd4, 0xf8, 0x05, 0x7f, 0x2f, 0x07, 0x8b, 0xc9, 0x4b, 0x97, 0x1f, 0xf7, 0xdb, 0x30, + 0x0d, 0xc6, 0xd4, 0xf8, 0x05, 0x7f, 0x27, 0x07, 0x8b, 0xc9, 0x4b, 0x97, 0x1f, 0xf7, 0xdb, 0x30, 0x26, 0x0b, 0xa5, 0x97, 0x8e, 0x10, 0xf6, 0x22, 0xe7, 0x2d, 0xfb, 0x7e, 0xc4, 0x87, 0xae, 0x8e, - 0x37, 0xa4, 0xf1, 0x0a, 0x1a, 0xd8, 0x7f, 0x39, 0x02, 0xb3, 0xa4, 0x8f, 0xb1, 0x6d, 0xe1, 0x73, + 0x37, 0xa4, 0xf1, 0x0a, 0x1a, 0xd8, 0x7f, 0x3e, 0x02, 0xb3, 0xa4, 0x8f, 0xb1, 0x6d, 0xe1, 0x73, 0x1a, 0x9f, 0x84, 0x96, 0x29, 0x0a, 0x45, 0xae, 0x5b, 0x60, 0xe5, 0xd1, 0x98, 0x49, 0x1a, 0x02, 0x7a, 0x4f, 0x7d, 0xbf, 0xce, 0x2b, 0xc9, 0x10, 0x44, 0xa1, 0x3a, 0x84, 0xf0, 0x61, 0xfb, 0x1d, 0xed, 0xf9, 0xb4, 0xef, 0x3d, 0x66, 0xa8, 0xdf, 0x3d, 0x66, 0x57, 0xee, 0x31, 0x2c, 0xee, 0xc5, @@ -15711,7 +15711,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xfe, 0x86, 0x37, 0xa9, 0x89, 0xd7, 0xd8, 0xa4, 0x5e, 0x67, 0xa7, 0xf9, 0x8c, 0x5a, 0x92, 0xd5, 0xeb, 0x6b, 0xfc, 0x95, 0x5e, 0x79, 0x16, 0x5f, 0x73, 0x7d, 0x61, 0x22, 0x4f, 0xff, 0x26, 0x65, 0x35, 0xd7, 0x13, 0x4f, 0x8b, 0xf4, 0x6f, 0xa3, 0x42, 0xed, 0xc7, 0x54, 0x7c, 0xe9, 0x5f, 0x31, - 0xc2, 0xdd, 0x13, 0xf9, 0xfe, 0x14, 0x15, 0xb8, 0x4d, 0x51, 0x6f, 0xfc, 0xfb, 0x1c, 0x7b, 0x42, + 0xc2, 0xdd, 0x13, 0xf9, 0xfe, 0x14, 0x15, 0xb8, 0x4d, 0x51, 0x6f, 0xfc, 0xdb, 0x1c, 0x7b, 0x42, 0xfa, 0xbf, 0x71, 0x9b, 0x7b, 0x9d, 0x67, 0x9d, 0x5f, 0x0f, 0xc3, 0x16, 0xf0, 0x10, 0x0b, 0x9e, 0xd5, 0x7c, 0x1a, 0xbe, 0xab, 0xfd, 0x90, 0x7c, 0xa3, 0x6a, 0x05, 0x8d, 0xe8, 0x18, 0xde, 0x2a, 0xf4, 0xca, 0xbd, 0xfb, 0xe2, 0xe3, 0xe5, 0xd1, 0x1b, 0x58, 0xb1, 0xfe, 0xf1, 0xaa, 0x08, 0xd4, @@ -15723,7 +15723,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x7e, 0x46, 0x2e, 0x95, 0x4a, 0x0d, 0x3f, 0xfe, 0xc3, 0x02, 0x2d, 0xf6, 0x5f, 0x58, 0x6c, 0x60, 0x28, 0x45, 0xd9, 0x43, 0x58, 0xa6, 0xb6, 0x59, 0x81, 0x49, 0xe5, 0xa7, 0x54, 0x30, 0xd1, 0x50, 0x95, 0x4a, 0x0b, 0x3a, 0xc3, 0x74, 0x14, 0xa3, 0x09, 0xc5, 0x24, 0xa6, 0xd1, 0x68, 0x4d, 0x2f, - 0xd1, 0x4a, 0x18, 0xf7, 0xa9, 0xb7, 0x55, 0xd3, 0x74, 0x5a, 0xcc, 0x27, 0xe3, 0x6f, 0x0e, 0xc1, + 0xd1, 0x4a, 0x18, 0xf7, 0xa9, 0xb7, 0x55, 0xd3, 0x74, 0x5a, 0xcc, 0x27, 0xe3, 0xaf, 0x0f, 0xc1, 0x25, 0x3e, 0x19, 0x6f, 0x72, 0xc6, 0xd1, 0x8f, 0x60, 0x5c, 0x99, 0x63, 0xce, 0xf4, 0xab, 0xc2, 0x7c, 0x32, 0x6d, 0x2d, 0xb0, 0xcb, 0x6f, 0x97, 0x16, 0x34, 0x22, 0xd3, 0x4d, 0x2e, 0xbf, 0xea, 0xb2, 0x69, 0xc3, 0x94, 0x3e, 0xd1, 0xfc, 0xfe, 0x7f, 0x3d, 0xb1, 0x11, 0x1d, 0x54, 0x44, 0x90, @@ -15731,7 +15731,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xeb, 0xdc, 0x4c, 0x6c, 0x30, 0x06, 0xcd, 0x94, 0x67, 0x1e, 0x2d, 0x4e, 0x6d, 0x36, 0xde, 0x08, 0x6a, 0xc1, 0x84, 0x3a, 0xf1, 0x5c, 0x41, 0x71, 0x2d, 0x83, 0x95, 0x0c, 0x90, 0x09, 0x66, 0x9c, 0x97, 0x74, 0xee, 0x5f, 0xea, 0x0a, 0x41, 0x0d, 0x78, 0x14, 0xce, 0xb1, 0xdf, 0x64, 0x0b, 0xa8, - 0x79, 0xd8, 0xc7, 0x4e, 0x13, 0xab, 0x96, 0xb0, 0xaf, 0xbb, 0x05, 0xfc, 0xeb, 0x1c, 0x2c, 0x24, + 0x79, 0xd8, 0xc7, 0x4e, 0x13, 0xab, 0x96, 0xb0, 0xaf, 0xbb, 0x05, 0xfc, 0xcb, 0x1c, 0x2c, 0x24, 0xd1, 0xad, 0x63, 0xa7, 0x85, 0x6a, 0x50, 0x88, 0x36, 0xc4, 0x57, 0xb5, 0x21, 0x83, 0x74, 0xa6, 0x76, 0x69, 0x6d, 0xc0, 0x8c, 0x61, 0xa3, 0x2d, 0x38, 0xaf, 0x94, 0x9d, 0xd1, 0xe4, 0x38, 0x8e, 0xaa, 0x6a, 0x31, 0xd7, 0xe8, 0xc9, 0xb8, 0xec, 0x1e, 0x5b, 0xb6, 0x43, 0x84, 0x54, 0x25, 0xf4, @@ -15765,7 +15765,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x91, 0x73, 0x3c, 0x01, 0x8f, 0x40, 0xd1, 0x11, 0xda, 0xce, 0x21, 0xda, 0x10, 0x02, 0x14, 0x57, 0xf2, 0x0c, 0x6a, 0x52, 0x5b, 0x02, 0xb6, 0x0a, 0x1d, 0x0a, 0x4a, 0xec, 0xb7, 0x18, 0xe0, 0x3b, 0x30, 0x9f, 0xd2, 0x2e, 0x77, 0xc6, 0x26, 0x63, 0x1b, 0xa2, 0xa7, 0xd2, 0xdb, 0x30, 0x97, 0x38, - 0x05, 0x31, 0xc0, 0x7f, 0x94, 0xb4, 0x96, 0xd8, 0xc8, 0x17, 0x60, 0x44, 0xe4, 0xd8, 0x60, 0x17, + 0x05, 0x31, 0xc0, 0x7f, 0x90, 0xb4, 0x96, 0xd8, 0xc8, 0x17, 0x60, 0x44, 0xe4, 0xd8, 0x60, 0x17, 0x77, 0xf1, 0x93, 0x7a, 0x11, 0xd0, 0xeb, 0x76, 0x18, 0x06, 0x58, 0xfc, 0x46, 0x7b, 0x4a, 0xc4, 0x9f, 0x41, 0xaa, 0x25, 0xfa, 0xe8, 0x35, 0xd2, 0x0b, 0x4b, 0x5a, 0xa4, 0xcd, 0x35, 0xd7, 0x0f, 0x1c, 0x69, 0xe4, 0x66, 0xca, 0xdf, 0xe8, 0x36, 0x14, 0x56, 0x5e, 0x04, 0xd8, 0x73, 0xac, 0x36, @@ -15795,8 +15795,8 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x0a, 0xef, 0xb2, 0x56, 0x56, 0xfc, 0x1e, 0xa0, 0xf8, 0xb8, 0x7a, 0xad, 0xa6, 0x49, 0x65, 0x35, 0x15, 0xcb, 0x30, 0x93, 0x30, 0x80, 0x33, 0x91, 0xf8, 0x1e, 0xa0, 0x78, 0x4f, 0xcf, 0x42, 0xc1, 0xb8, 0x05, 0x37, 0x25, 0x0b, 0xe4, 0x6a, 0xd0, 0x68, 0x8a, 0xdb, 0xfe, 0xaf, 0xe5, 0xa1, 0xd4, - 0x03, 0x14, 0xfd, 0x9d, 0x5c, 0x94, 0xdb, 0x6c, 0x35, 0x7e, 0x18, 0xe5, 0x76, 0x32, 0x7e, 0x02, - 0xdb, 0x2b, 0x1f, 0xfd, 0x95, 0x3f, 0x7b, 0xe5, 0x83, 0x3a, 0x3e, 0x65, 0x67, 0xe7, 0xd6, 0x90, + 0x03, 0x14, 0xfd, 0xad, 0x5c, 0x94, 0xdb, 0x6c, 0x35, 0x7e, 0x18, 0xe5, 0x76, 0x32, 0x7e, 0x02, + 0xdb, 0x2b, 0x1f, 0xfd, 0xa5, 0x3f, 0x7b, 0xe5, 0x83, 0x3a, 0x3e, 0x65, 0x67, 0xe7, 0xd6, 0x90, 0xca, 0x2d, 0x13, 0x66, 0x35, 0x11, 0xa7, 0x9f, 0xbd, 0xfb, 0x0a, 0x00, 0x4f, 0xe8, 0xb4, 0xe1, 0x1e, 0x72, 0x9f, 0x40, 0xa5, 0xc4, 0x78, 0x08, 0x73, 0x11, 0x9a, 0x5c, 0x03, 0xf1, 0x1d, 0x90, 0xde, 0x4b, 0x94, 0xe8, 0x60, 0xe5, 0xfc, 0xcf, 0x4f, 0x4a, 0x93, 0xe4, 0x04, 0xbc, 0x13, 0x06, @@ -15844,230 +15844,230 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x37, 0x79, 0xd8, 0x03, 0x34, 0x05, 0xb0, 0xbc, 0x52, 0xaf, 0xae, 0x6c, 0x2d, 0xaf, 0x6f, 0xad, 0x16, 0x06, 0xd0, 0x24, 0x8c, 0x95, 0xe5, 0xcf, 0xdc, 0xed, 0x8f, 0x60, 0x3a, 0x72, 0x63, 0x22, 0x10, 0xf2, 0xb2, 0x51, 0x18, 0x20, 0x3c, 0x92, 0x3f, 0xe9, 0x35, 0x97, 0x5d, 0x7e, 0x0a, 0xb9, - 0xa5, 0xbf, 0xfc, 0xbd, 0x1c, 0x8c, 0x93, 0xed, 0x40, 0x98, 0x7d, 0x7e, 0xad, 0x5c, 0x30, 0xf8, - 0x67, 0xc0, 0x13, 0x30, 0xa5, 0xde, 0x26, 0xe8, 0xc9, 0x50, 0xcc, 0x50, 0x5c, 0x51, 0x80, 0x5b, - 0xb9, 0x7b, 0x39, 0x64, 0xd2, 0x57, 0x9a, 0x88, 0xbc, 0x2d, 0x29, 0x27, 0x5f, 0x89, 0x8a, 0x97, - 0x33, 0xc5, 0x74, 0xf4, 0xcb, 0x60, 0xa8, 0x34, 0x53, 0xa4, 0xd2, 0xef, 0xf4, 0x27, 0x7d, 0x8a, - 0x36, 0x6f, 0xf6, 0x07, 0x8e, 0x1e, 0xc1, 0x24, 0x91, 0xd7, 0x24, 0x18, 0xba, 0x14, 0x45, 0x54, - 0x44, 0xc4, 0xe2, 0x62, 0x72, 0xa5, 0x8c, 0xff, 0x3e, 0x41, 0x07, 0xc2, 0x2e, 0x5b, 0x3e, 0x12, - 0xce, 0x71, 0xa2, 0x84, 0xd9, 0xe9, 0x14, 0xcf, 0x47, 0x8a, 0xf7, 0xee, 0xdf, 0xcb, 0xa1, 0x3a, - 0x8d, 0x29, 0xa1, 0x09, 0x7e, 0x48, 0xd8, 0x21, 0xc7, 0x25, 0x42, 0xd6, 0x9b, 0x92, 0xcc, 0x68, - 0x94, 0x22, 0x31, 0x6e, 0x01, 0x8a, 0xcb, 0x53, 0xe8, 0x6a, 0xb8, 0x0e, 0x92, 0x45, 0xad, 0xe2, - 0x85, 0xd8, 0xe3, 0xfb, 0x0a, 0x39, 0x51, 0xd1, 0x0a, 0x4c, 0x71, 0xcf, 0x17, 0x2e, 0xe1, 0xa1, - 0x2c, 0x19, 0x31, 0x95, 0xcc, 0x2a, 0xe5, 0x93, 0x94, 0x12, 0x51, 0x31, 0x1c, 0x47, 0x54, 0x74, - 0x2c, 0x5e, 0x4a, 0xac, 0xe3, 0xe3, 0x7b, 0x08, 0x53, 0xba, 0xc0, 0x89, 0xc4, 0x04, 0x25, 0xca, - 0xa1, 0xa9, 0x1d, 0x6a, 0xc0, 0xfc, 0xa6, 0x65, 0x53, 0x75, 0x13, 0x7f, 0xe2, 0x15, 0x0f, 0xb4, - 0xa8, 0x94, 0xf1, 0x62, 0x5b, 0xc7, 0x4e, 0xab, 0xd8, 0x2b, 0x06, 0x13, 0xfd, 0x6c, 0xea, 0x42, - 0x6e, 0xd2, 0x1f, 0xb8, 0x91, 0xa1, 0x67, 0xa9, 0x4b, 0xb2, 0x59, 0x28, 0xa6, 0x99, 0xd9, 0xa0, - 0x4d, 0x2a, 0xb8, 0x45, 0x28, 0x2a, 0x6b, 0xe2, 0xcc, 0xe4, 0x16, 0xa8, 0xff, 0x55, 0x60, 0x47, - 0xed, 0x65, 0x7c, 0x94, 0xc2, 0xb8, 0x54, 0x62, 0xf7, 0x72, 0xe8, 0x6b, 0xfa, 0x55, 0x27, 0x92, - 0xdb, 0xb7, 0x83, 0x23, 0x6e, 0xb3, 0x76, 0x29, 0x91, 0x00, 0xff, 0x50, 0x32, 0xa8, 0x9b, 0x30, - 0x9b, 0x64, 0xd9, 0x23, 0x19, 0x9a, 0x61, 0xf6, 0x93, 0xba, 0x0a, 0x4c, 0x22, 0x7e, 0xb6, 0xd2, - 0x27, 0x29, 0xc3, 0xb0, 0x24, 0x95, 0xe6, 0x27, 0x30, 0x45, 0x56, 0xc9, 0x63, 0x8c, 0x3b, 0xe5, - 0xb6, 0xfd, 0x0c, 0xfb, 0x48, 0xc4, 0x27, 0x93, 0x45, 0x69, 0xb8, 0xb7, 0x72, 0xe8, 0x5b, 0x30, - 0xbe, 0x6f, 0x05, 0xcd, 0x23, 0x1e, 0x18, 0x47, 0xc4, 0xcd, 0xa1, 0x65, 0x45, 0xf1, 0x8b, 0x56, - 0xde, 0xcb, 0xa1, 0x4f, 0x61, 0x64, 0x15, 0x07, 0xd4, 0x0f, 0xe4, 0x9a, 0x7c, 0xe4, 0x66, 0x06, - 0x65, 0xeb, 0x8e, 0x34, 0x3f, 0x15, 0x1d, 0x8e, 0x2a, 0xb7, 0xd0, 0x5d, 0x00, 0xb6, 0x21, 0x50, - 0x0a, 0xd1, 0xea, 0x62, 0xac, 0xdb, 0x68, 0x95, 0x1c, 0xfc, 0x6d, 0x1c, 0xe0, 0x7e, 0x9b, 0x4c, - 0xe3, 0xd1, 0x06, 0x4c, 0xc9, 0x90, 0xf9, 0x5b, 0xd4, 0x0b, 0xd2, 0x88, 0x10, 0xf3, 0xcf, 0x40, - 0xed, 0x23, 0xf2, 0x55, 0xb0, 0x9c, 0x6a, 0x32, 0x76, 0x1b, 0x4a, 0x8b, 0xe6, 0x26, 0x99, 0xc8, - 0xc0, 0x14, 0xdc, 0x35, 0xd7, 0x0f, 0x74, 0x5c, 0x59, 0x92, 0x8c, 0x8b, 0xa1, 0xa8, 0xb6, 0xab, - 0xc7, 0x71, 0x0b, 0xf7, 0xdc, 0xb4, 0xf0, 0x73, 0xc5, 0x6b, 0x19, 0x10, 0x6c, 0xbb, 0xa3, 0x3b, - 0xc9, 0x32, 0xb9, 0xd1, 0xb3, 0x66, 0xb6, 0x3b, 0xd8, 0xa9, 0xd7, 0xd7, 0x68, 0x40, 0x2e, 0xf1, - 0xa6, 0xa6, 0x94, 0x09, 0xc2, 0x28, 0x5e, 0x45, 0x4e, 0x3d, 0xcd, 0x23, 0x0e, 0x65, 0xf9, 0xc9, - 0x85, 0xa7, 0x5e, 0x62, 0xc8, 0xb1, 0xc7, 0x4c, 0xc7, 0xa0, 0x65, 0x64, 0xdd, 0x5b, 0x42, 0xc5, - 0x24, 0x39, 0x95, 0x7f, 0xd8, 0x17, 0x92, 0xea, 0xf6, 0x1e, 0xdc, 0xcb, 0xa1, 0x15, 0x98, 0x91, - 0x4e, 0xab, 0x61, 0x15, 0x4a, 0x41, 0xc8, 0x38, 0x61, 0xe6, 0x12, 0xc8, 0xec, 0x2d, 0x65, 0x10, - 0x4a, 0x2c, 0x47, 0x9f, 0xc3, 0x0c, 0x5f, 0x9b, 0x5a, 0x7f, 0x0a, 0x72, 0x9b, 0xe1, 0xa2, 0x7d, - 0x6a, 0x4f, 0x1e, 0xc1, 0x5c, 0x3d, 0xc2, 0x1d, 0x66, 0xf0, 0x75, 0x51, 0x27, 0x41, 0x0b, 0xeb, - 0x38, 0x60, 0xec, 0x49, 0xa6, 0xf5, 0x18, 0x10, 0xd3, 0x07, 0x08, 0x72, 0xcf, 0x6c, 0xfc, 0x1c, - 0x5d, 0x8e, 0x74, 0x9d, 0x14, 0x52, 0x30, 0xba, 0x4f, 0xa5, 0x8e, 0x6c, 0x87, 0x25, 0xfe, 0x63, - 0xb9, 0xca, 0xad, 0x8e, 0x75, 0x60, 0xb7, 0xed, 0xc0, 0xc6, 0x64, 0xa9, 0xaa, 0x08, 0x6a, 0x95, - 0x58, 0x0f, 0x17, 0x53, 0x21, 0xd0, 0xaf, 0xd2, 0x70, 0x51, 0xd9, 0x77, 0x13, 0xf4, 0xad, 0xa4, - 0xec, 0xd4, 0x29, 0xb7, 0xab, 0xe2, 0xb7, 0xfb, 0x03, 0xe6, 0x8b, 0xf1, 0x33, 0x98, 0x5c, 0xc5, - 0x01, 0xcb, 0x2e, 0xbe, 0x6c, 0x05, 0x16, 0x92, 0xfa, 0x02, 0x59, 0xc4, 0xd7, 0xa0, 0x88, 0xf5, - 0x10, 0x56, 0xd4, 0xf1, 0x8f, 0xd1, 0x3a, 0x14, 0xd8, 0x36, 0xaf, 0x90, 0xb8, 0x1c, 0x23, 0xc1, - 0x41, 0x2c, 0xcf, 0x3a, 0xf6, 0x53, 0x67, 0xeb, 0x2e, 0x7b, 0xde, 0x45, 0x32, 0x31, 0xb3, 0x22, - 0x47, 0xce, 0x68, 0x65, 0x32, 0xa2, 0x27, 0x99, 0x11, 0x13, 0xfb, 0x38, 0x10, 0xde, 0xad, 0x2c, - 0xd9, 0xd9, 0xf5, 0xf0, 0x4c, 0x8f, 0xd7, 0x86, 0x9f, 0x79, 0x24, 0x12, 0xc3, 0xde, 0x03, 0x24, - 0x13, 0xc0, 0x25, 0x10, 0xbd, 0xa9, 0x89, 0x1e, 0x67, 0xa3, 0xfb, 0x19, 0x8c, 0x31, 0xb4, 0x8a, - 0x1b, 0xc8, 0xfd, 0x51, 0x96, 0x08, 0xcc, 0x85, 0x78, 0x05, 0x1f, 0xe9, 0x27, 0x30, 0xc6, 0xbe, - 0x2a, 0x15, 0x5f, 0x96, 0xf4, 0xda, 0xe1, 0x3f, 0x84, 0xf1, 0x55, 0x1c, 0x54, 0x5c, 0xea, 0x52, - 0xec, 0xcb, 0x0f, 0x49, 0x29, 0x13, 0x14, 0x26, 0x95, 0xbe, 0xef, 0x2d, 0xdd, 0xcb, 0xa1, 0x77, - 0xe9, 0x19, 0x49, 0x5d, 0x91, 0xe7, 0x42, 0x34, 0x25, 0xa9, 0x71, 0x04, 0xc5, 0x18, 0xfc, 0xeb, - 0xf9, 0x1c, 0x39, 0xc4, 0x89, 0x88, 0xdd, 0xf5, 0x3c, 0xec, 0x30, 0xe4, 0x34, 0x79, 0x28, 0x09, - 0xfb, 0x33, 0xba, 0x3f, 0x2a, 0xd8, 0xcc, 0xbc, 0xbe, 0x17, 0x09, 0x96, 0x1a, 0xe1, 0x5e, 0x0e, - 0x7d, 0x00, 0xa3, 0xbc, 0x8f, 0x04, 0x49, 0xeb, 0xb4, 0x9f, 0xd1, 0x6b, 0x8a, 0x09, 0x8c, 0xf7, - 0xb4, 0xcf, 0x3a, 0x4c, 0x1a, 0x77, 0x59, 0x9f, 0x3f, 0x20, 0xc2, 0x40, 0xeb, 0x55, 0x30, 0xab, - 0x42, 0x2a, 0xa0, 0x98, 0x0b, 0xda, 0xdc, 0xaa, 0x7c, 0xce, 0x24, 0x42, 0xe4, 0x7a, 0x1a, 0x03, - 0x46, 0x86, 0x72, 0x90, 0x72, 0xbd, 0x56, 0xdc, 0x6b, 0xa5, 0xac, 0x43, 0xa1, 0xdc, 0xa4, 0xc7, - 0x95, 0x4c, 0x23, 0x2d, 0x2f, 0x55, 0xd1, 0x0a, 0x41, 0x6b, 0x2e, 0x9a, 0x95, 0x7a, 0x03, 0x5b, - 0x34, 0xc4, 0xdd, 0xbc, 0x14, 0x7d, 0x22, 0x55, 0xc9, 0x18, 0x19, 0x97, 0xa8, 0xd9, 0x2a, 0xb9, - 0xf6, 0xb5, 0x5f, 0x8f, 0xcc, 0x47, 0x74, 0xa7, 0x53, 0x52, 0x6c, 0x5f, 0x88, 0xe2, 0xcb, 0xeb, - 0xa6, 0xb0, 0xad, 0x95, 0xa0, 0x65, 0x98, 0xe6, 0x01, 0xb5, 0x24, 0x5b, 0xd2, 0xb0, 0xd3, 0x9a, - 0xff, 0x2e, 0x4c, 0xad, 0x90, 0x93, 0xa8, 0xdb, 0xb2, 0x59, 0x58, 0x4f, 0xa4, 0xc7, 0x69, 0x4c, - 0x45, 0x5c, 0x13, 0xd9, 0x48, 0x94, 0xdc, 0xd3, 0xf2, 0x1b, 0x8e, 0xa7, 0xf7, 0x2e, 0xce, 0x0a, - 0xb2, 0x6a, 0x9a, 0x6a, 0xae, 0x8b, 0x98, 0x4f, 0xc9, 0xf6, 0x8c, 0x6e, 0x68, 0x57, 0xdc, 0xb4, - 0x94, 0xcd, 0x09, 0x42, 0xed, 0x97, 0x4a, 0x62, 0xbd, 0x14, 0x9a, 0xd9, 0x69, 0xa0, 0x53, 0xc7, - 0x2d, 0x03, 0xf1, 0x25, 0xa6, 0x6b, 0x46, 0xef, 0xe8, 0xd4, 0x33, 0x52, 0x3a, 0xa7, 0xb6, 0x40, - 0x55, 0x08, 0x7a, 0x36, 0x61, 0x74, 0x25, 0x3b, 0xe9, 0xb1, 0xa2, 0x42, 0x48, 0x49, 0x43, 0xfc, - 0x88, 0x2e, 0xb3, 0x30, 0xfb, 0x1e, 0x52, 0x2f, 0xe4, 0xd1, 0xe4, 0x83, 0x52, 0x52, 0x4c, 0x4e, - 0x29, 0x5c, 0x83, 0xe9, 0x48, 0xb2, 0x5e, 0xa9, 0x39, 0x4a, 0x4e, 0x17, 0x5c, 0xbc, 0x92, 0x56, - 0x2d, 0xf5, 0xa4, 0x85, 0x68, 0x86, 0x53, 0x39, 0xe4, 0x94, 0xec, 0xb2, 0x72, 0xc8, 0xa9, 0xa9, - 0x51, 0x1f, 0x41, 0x21, 0x9a, 0x5c, 0x51, 0x12, 0x4d, 0xc9, 0xba, 0x98, 0x3a, 0x27, 0x0f, 0x61, - 0x56, 0x9d, 0x51, 0x39, 0xee, 0xb4, 0xdd, 0x3f, 0x8d, 0xce, 0x0e, 0xcc, 0x25, 0xe6, 0x42, 0x94, - 0xb2, 0x41, 0x56, 0xa6, 0xc4, 0x54, 0xaa, 0x18, 0x2e, 0x24, 0xa7, 0x43, 0x45, 0x6f, 0xe9, 0x8a, - 0x89, 0xe4, 0xe4, 0x90, 0xc5, 0x1b, 0x3d, 0xa0, 0x38, 0x43, 0xbf, 0xa6, 0x27, 0x60, 0xac, 0x8d, - 0x6b, 0x8a, 0xaa, 0x22, 0xa5, 0x01, 0x23, 0x0b, 0x44, 0xae, 0x81, 0xd9, 0xa4, 0x74, 0xcc, 0xa9, - 0x2c, 0xbe, 0x9e, 0x4e, 0x33, 0x5c, 0x58, 0x7b, 0x22, 0x6a, 0x5d, 0x2a, 0x67, 0x32, 0xd3, 0x66, - 0x66, 0xdc, 0x75, 0x8b, 0x72, 0x3d, 0xf4, 0xdf, 0xe5, 0x74, 0xbd, 0xd5, 0x6c, 0x52, 0xb2, 0xd6, - 0xa8, 0x5a, 0x29, 0x29, 0x17, 0xa7, 0x64, 0x43, 0x66, 0xb6, 0xd7, 0x3d, 0xa6, 0x62, 0xd2, 0xa9, - 0xab, 0x2a, 0xa6, 0x44, 0xd2, 0x57, 0xd3, 0x01, 0xc2, 0x15, 0x91, 0x90, 0x75, 0x5a, 0xae, 0x88, - 0xf4, 0xfc, 0xd7, 0x72, 0x45, 0x64, 0x25, 0xad, 0x36, 0xc5, 0x47, 0x97, 0xc2, 0x96, 0x8c, 0x14, - 0xa5, 0x19, 0xf7, 0xb8, 0x85, 0x70, 0xe2, 0x22, 0xdd, 0x3e, 0xeb, 0xb4, 0x7d, 0x0d, 0x17, 0x53, - 0xd3, 0x91, 0xa2, 0xb7, 0x63, 0x1f, 0x74, 0x0a, 0x27, 0xd2, 0x7b, 0x3a, 0xa9, 0x65, 0x12, 0x95, - 0x3a, 0xb6, 0x48, 0xd2, 0xd2, 0xd8, 0x8e, 0x9d, 0x90, 0xd1, 0x74, 0x95, 0x4a, 0xbe, 0x4a, 0x56, - 0xd2, 0xd4, 0xb1, 0x5e, 0x4e, 0xa2, 0xe3, 0xc7, 0xf7, 0x54, 0xa5, 0x5f, 0x42, 0x12, 0x8b, 0x56, - 0x9c, 0x65, 0x4f, 0xed, 0xa7, 0x6b, 0x69, 0x74, 0x96, 0xe9, 0x3d, 0x42, 0x24, 0x29, 0x45, 0x17, - 0x35, 0x36, 0x69, 0xa7, 0x64, 0x51, 0x1b, 0x9c, 0x7e, 0x40, 0x56, 0xa9, 0x32, 0x5b, 0x26, 0x45, - 0x4d, 0xed, 0xc5, 0xa5, 0x38, 0x0d, 0x4d, 0x91, 0x2d, 0xb9, 0xc0, 0x7a, 0xb3, 0x18, 0x65, 0x8e, - 0xd6, 0xa1, 0xf4, 0x21, 0x21, 0x95, 0x35, 0x3d, 0xba, 0x94, 0x2e, 0xa1, 0xce, 0xf0, 0xc4, 0x6f, - 0x34, 0xac, 0xb4, 0x88, 0xcf, 0x72, 0x41, 0x6a, 0xe5, 0x94, 0xd2, 0x0c, 0x25, 0x4c, 0x8d, 0xda, - 0xff, 0x26, 0xe4, 0x77, 0x95, 0x7b, 0x68, 0x66, 0xfa, 0xd7, 0x04, 0xe9, 0x4c, 0xee, 0xca, 0xa9, - 0x14, 0x33, 0x13, 0xbe, 0xa6, 0xf6, 0xf4, 0x87, 0xca, 0xae, 0x1c, 0xcb, 0xe2, 0x8a, 0x6e, 0x45, - 0x45, 0xb3, 0xb4, 0x44, 0xaf, 0x19, 0xbb, 0xfe, 0x6c, 0x52, 0x02, 0x58, 0x45, 0xb3, 0x9c, 0x9a, - 0x1d, 0x36, 0x81, 0x0b, 0x72, 0x7b, 0x4b, 0xa1, 0x96, 0x91, 0x0e, 0x36, 0xb5, 0x87, 0xdf, 0x57, - 0xb6, 0xb7, 0x48, 0xda, 0x56, 0xa9, 0x29, 0xe8, 0x91, 0xd7, 0x35, 0x95, 0xf6, 0x16, 0xb5, 0x18, - 0x8f, 0xe7, 0x5c, 0x95, 0xb2, 0x4b, 0x56, 0x46, 0xd6, 0x44, 0xc5, 0xf3, 0x5c, 0x7c, 0x88, 0x84, - 0xde, 0x85, 0x88, 0xda, 0xb8, 0x57, 0xc7, 0xe4, 0x3e, 0x9c, 0x90, 0xab, 0x35, 0xb2, 0x0f, 0xa7, - 0x67, 0x73, 0xcd, 0xb8, 0xe8, 0x4c, 0xd7, 0xed, 0x43, 0x47, 0x49, 0xb5, 0x2a, 0xaf, 0x39, 0xf1, - 0xec, 0xaf, 0x72, 0x8b, 0x49, 0xca, 0xcc, 0xba, 0x4d, 0x24, 0x1c, 0x26, 0x9f, 0xab, 0x49, 0x33, - 0x51, 0x31, 0x3d, 0x57, 0xa8, 0xdc, 0x6e, 0x12, 0xb3, 0x6c, 0x2a, 0x04, 0xd5, 0x8c, 0x95, 0x92, - 0x60, 0x42, 0xf2, 0x4c, 0x49, 0x30, 0x31, 0xc5, 0xe5, 0x5d, 0xaa, 0x57, 0x31, 0xdd, 0x36, 0x56, - 0xf5, 0x2a, 0x4a, 0x1e, 0xc7, 0x88, 0x5a, 0x03, 0x7d, 0x4c, 0x95, 0x1a, 0xd9, 0x9a, 0x90, 0x79, - 0x9d, 0x92, 0x9a, 0x6f, 0x1a, 0xc2, 0x84, 0x96, 0x48, 0x57, 0x33, 0x65, 0xb4, 0xf9, 0x9e, 0x50, - 0x6a, 0x68, 0x68, 0xb1, 0x14, 0x97, 0x51, 0xb4, 0xef, 0xc2, 0x44, 0x98, 0xce, 0x72, 0x6f, 0x49, - 0x41, 0x8c, 0xe4, 0xb8, 0x8c, 0x22, 0x7e, 0x20, 0x5e, 0x54, 0x68, 0x7b, 0x7a, 0x65, 0xb6, 0xfe, - 0xe3, 0x33, 0xa1, 0x44, 0xd1, 0x7a, 0x1a, 0x4b, 0x8e, 0x99, 0xb1, 0xf3, 0x4e, 0xa8, 0x99, 0x7c, - 0xe4, 0xbc, 0x26, 0x24, 0x4e, 0x93, 0xf3, 0x9a, 0x94, 0x8e, 0x8c, 0xf6, 0x86, 0xde, 0xb5, 0xbf, - 0x12, 0x1a, 0x83, 0x90, 0xe8, 0xe5, 0xcc, 0xa4, 0x62, 0xc5, 0x2b, 0xd9, 0x99, 0xb8, 0x42, 0xd2, - 0x75, 0x28, 0x44, 0xd3, 0x0e, 0xa1, 0xa4, 0xc4, 0x70, 0x4a, 0x7e, 0x28, 0x79, 0x87, 0x4b, 0xcd, - 0x57, 0x54, 0x13, 0x7a, 0x7b, 0x9d, 0x6e, 0x4a, 0x7a, 0x30, 0x95, 0x74, 0xb6, 0x58, 0x15, 0x66, - 0x20, 0x52, 0x2f, 0xc2, 0xb1, 0x0c, 0x47, 0xaa, 0x58, 0x95, 0x90, 0xb4, 0xc8, 0x16, 0x01, 0x17, - 0x92, 0x53, 0x98, 0xbe, 0xa3, 0xdf, 0x50, 0x33, 0xa2, 0x4c, 0xf6, 0x7c, 0x7d, 0x46, 0xbf, 0x04, - 0xf3, 0x29, 0xc1, 0x00, 0xd1, 0x8d, 0x88, 0x06, 0x38, 0x39, 0x58, 0x60, 0x31, 0x2b, 0xd3, 0x1f, - 0xda, 0xa4, 0x66, 0x0b, 0x9a, 0x6b, 0x65, 0xec, 0x29, 0x70, 0xdf, 0x0e, 0x8e, 0x58, 0xee, 0x4a, - 0x65, 0xcf, 0x4c, 0xf4, 0xc9, 0x44, 0x75, 0x7a, 0xdf, 0xd0, 0x4a, 0x13, 0x5e, 0x03, 0x13, 0x08, - 0x16, 0x93, 0x09, 0xd2, 0x4c, 0xe1, 0x35, 0xf1, 0xa6, 0x14, 0xed, 0xa6, 0x3a, 0xfc, 0x24, 0x6f, - 0xd2, 0xd4, 0x6e, 0xd6, 0x84, 0x80, 0x94, 0x4c, 0x31, 0xdd, 0x05, 0x36, 0x95, 0xe2, 0x23, 0x42, - 0x31, 0xe6, 0xd5, 0x8a, 0x52, 0xc0, 0xb3, 0x77, 0x0f, 0x53, 0x9c, 0xb7, 0x3a, 0xd6, 0x92, 0xd2, - 0xbf, 0x34, 0xff, 0xd9, 0xd4, 0xfe, 0xad, 0x88, 0xef, 0x29, 0xb9, 0x7f, 0xfd, 0x9e, 0xb8, 0xf2, - 0x5d, 0x2e, 0xe2, 0x58, 0xad, 0x0d, 0x54, 0x29, 0x2f, 0xa6, 0x94, 0xa3, 0x2d, 0x6a, 0x87, 0x14, - 0x2d, 0x55, 0x2e, 0x9e, 0xc9, 0x9e, 0xdb, 0xa9, 0xf4, 0xd8, 0x3a, 0xd6, 0x3c, 0x5f, 0xcf, 0xb2, - 0x8e, 0x23, 0x2e, 0xb3, 0x7c, 0x1d, 0x6b, 0xa5, 0x67, 0x5b, 0xc7, 0x11, 0x82, 0xfa, 0x3a, 0x8e, - 0x76, 0x33, 0x7a, 0x91, 0x4f, 0x9d, 0xd5, 0x68, 0x37, 0xe5, 0x3a, 0x4e, 0xa6, 0x98, 0xee, 0xa1, - 0x9c, 0x4a, 0x51, 0xae, 0x63, 0x9d, 0x62, 0x0a, 0x78, 0x9f, 0xeb, 0x38, 0xda, 0x88, 0xbe, 0x8e, - 0xcf, 0xd4, 0x3f, 0xb9, 0x8e, 0x93, 0xfb, 0x77, 0xe6, 0x75, 0x1c, 0x71, 0xe9, 0xd7, 0x06, 0x9a, - 0xb4, 0x8e, 0xa3, 0xf0, 0x6c, 0x1d, 0x47, 0x4b, 0x23, 0x0a, 0x94, 0x8c, 0x75, 0x1c, 0xc5, 0xfc, - 0x82, 0xd2, 0x8b, 0xb8, 0x23, 0xf7, 0xb3, 0x92, 0x53, 0x3d, 0x99, 0xd1, 0x3e, 0xd5, 0xde, 0x45, - 0xca, 0xfb, 0x5b, 0xcd, 0x8b, 0x69, 0x44, 0xe9, 0x7a, 0xde, 0x13, 0x4c, 0x8c, 0x76, 0x57, 0x57, - 0x4d, 0x25, 0x7b, 0x63, 0x67, 0x74, 0x78, 0x8f, 0xac, 0x9b, 0x56, 0x06, 0xdd, 0x2c, 0x67, 0xf2, - 0x0c, 0xba, 0xf2, 0x1e, 0x13, 0xa5, 0x9b, 0x8a, 0x92, 0xbd, 0xbe, 0xbf, 0x14, 0xef, 0x17, 0x51, - 0xbc, 0xa5, 0xc8, 0xcd, 0xe8, 0xcc, 0x3d, 0x95, 0x37, 0xa4, 0x68, 0x4f, 0xcf, 0xba, 0xce, 0x37, - 0x85, 0xf4, 0x10, 0x8b, 0x42, 0x11, 0x19, 0xb4, 0xba, 0xd6, 0x53, 0x6b, 0xd0, 0x0e, 0x55, 0xd5, - 0xc6, 0xcb, 0x15, 0x35, 0x6f, 0x5a, 0xb8, 0x8b, 0x9e, 0x54, 0x63, 0xfe, 0xf4, 0x2a, 0xd5, 0x34, - 0x67, 0x7b, 0x49, 0x35, 0x8e, 0xfd, 0x39, 0x55, 0x7d, 0x71, 0x07, 0x20, 0xe7, 0x89, 0x9b, 0x7e, - 0x4f, 0x99, 0xd1, 0x6c, 0xa5, 0x08, 0x2c, 0x35, 0x51, 0xfb, 0x84, 0x3f, 0xd0, 0x89, 0xc2, 0x54, - 0xe6, 0x27, 0xe1, 0xa3, 0xcf, 0xa1, 0xc0, 0xb7, 0xb7, 0x90, 0x40, 0x12, 0x60, 0xea, 0xd4, 0x55, - 0x84, 0xc6, 0xad, 0x8f, 0x1e, 0xf4, 0xa3, 0x69, 0xeb, 0x87, 0x13, 0xe9, 0x6a, 0x29, 0x72, 0x1c, - 0xee, 0x78, 0x5d, 0x3f, 0xc0, 0xad, 0xb8, 0x3a, 0x49, 0xef, 0x8c, 0xb0, 0xd8, 0xd0, 0xc1, 0xf7, - 0x96, 0xd0, 0x3a, 0xdd, 0xdb, 0xf4, 0xe2, 0x2c, 0x7d, 0x5b, 0x32, 0x19, 0xba, 0xf5, 0xac, 0x49, - 0x4f, 0x13, 0xbd, 0x4f, 0x69, 0x6d, 0xa7, 0x77, 0x4a, 0xb2, 0xa8, 0xcf, 0xd1, 0xa5, 0xb1, 0x88, - 0x5d, 0x88, 0x99, 0xee, 0xaf, 0x17, 0x67, 0xa2, 0xbe, 0x2f, 0xe8, 0x7b, 0x30, 0x26, 0x90, 0x7b, - 0x33, 0x24, 0x8a, 0x4d, 0x19, 0xb2, 0x0c, 0x93, 0x9a, 0x63, 0x8f, 0xbc, 0xdd, 0x24, 0xb9, 0xfb, - 0x64, 0xcc, 0xf3, 0xa4, 0xe6, 0xc0, 0x23, 0xa9, 0x24, 0xb9, 0xf5, 0xa4, 0x52, 0xf9, 0x14, 0xc6, - 0x39, 0x4b, 0x33, 0xb9, 0x91, 0xae, 0x6c, 0x9b, 0x53, 0x0c, 0xa2, 0xbb, 0x2d, 0x3b, 0xa8, 0xba, - 0xce, 0x13, 0xfb, 0xb0, 0x27, 0x63, 0xe2, 0x28, 0x7b, 0x4b, 0x68, 0x8f, 0x26, 0x68, 0x13, 0x69, - 0xf3, 0x70, 0xf0, 0xdc, 0xf5, 0x9e, 0xda, 0xce, 0x61, 0x0f, 0x92, 0x57, 0x75, 0x92, 0x51, 0x3c, - 0x46, 0xb7, 0x9e, 0x4e, 0xb7, 0x27, 0x7e, 0x86, 0xb2, 0x6d, 0x91, 0xda, 0xf2, 0x9c, 0xb5, 0xc7, - 0xe9, 0x0f, 0x8f, 0x17, 0x43, 0x53, 0x62, 0x13, 0x37, 0x5d, 0xaf, 0xd5, 0x9b, 0x58, 0x49, 0x37, - 0xdc, 0x8d, 0xa0, 0xed, 0x2d, 0x11, 0xaa, 0xf5, 0x54, 0xaa, 0xbd, 0xb0, 0x33, 0x4e, 0xab, 0x4b, - 0x74, 0xec, 0x67, 0xec, 0x6d, 0xf6, 0xae, 0x45, 0x4e, 0x9a, 0x9a, 0x87, 0x9f, 0x60, 0x8f, 0xda, - 0x83, 0xf7, 0xb2, 0x84, 0xd6, 0xc1, 0xf7, 0x96, 0x08, 0x95, 0x7a, 0x8c, 0x4a, 0x1a, 0x74, 0x96, - 0x4a, 0x9e, 0x0e, 0xad, 0xcf, 0xde, 0xa4, 0x91, 0xf9, 0x80, 0x3e, 0x79, 0xec, 0xae, 0xf7, 0xe0, - 0x88, 0xf0, 0x50, 0x10, 0x80, 0x7b, 0xf7, 0x09, 0x66, 0x5d, 0xc1, 0x8c, 0x43, 0xa4, 0xb6, 0xf9, - 0x3d, 0xf1, 0xb6, 0xd1, 0xb3, 0xd9, 0x34, 0x0a, 0x0f, 0xe8, 0xf6, 0xc6, 0x8d, 0xa0, 0x15, 0xad, - 0xa0, 0x96, 0x1a, 0xb5, 0x38, 0xa9, 0xda, 0x43, 0xfb, 0xa8, 0xcc, 0x6e, 0x74, 0x6a, 0x12, 0x55, - 0xc5, 0x1a, 0x22, 0x31, 0xbb, 0x6a, 0x94, 0x04, 0xd3, 0x6a, 0x6e, 0xb8, 0xcd, 0xa7, 0xaa, 0x56, - 0x53, 0xc9, 0xca, 0x59, 0xd4, 0x73, 0x66, 0xf2, 0x4d, 0x9c, 0x26, 0xce, 0x54, 0x4d, 0xb5, 0xd4, - 0xbc, 0x9c, 0xaa, 0x56, 0x53, 0xcf, 0x20, 0xfa, 0x40, 0xa8, 0x0b, 0x69, 0x83, 0x3a, 0xe5, 0x54, - 0xd6, 0x48, 0x4d, 0x21, 0x45, 0xd2, 0x35, 0x85, 0x6a, 0x47, 0xd3, 0xb7, 0x0b, 0x14, 0x4f, 0x21, - 0x2a, 0xef, 0x1f, 0xa9, 0xd9, 0x45, 0x33, 0x2c, 0xae, 0x66, 0x12, 0x72, 0x25, 0xcb, 0x1b, 0x5b, - 0x7a, 0x1e, 0xe5, 0xa2, 0x6e, 0x3e, 0x74, 0x2f, 0x87, 0xb6, 0xe0, 0xc2, 0x2a, 0x0e, 0xf8, 0x06, - 0x66, 0x62, 0x3f, 0xf0, 0xec, 0x66, 0x90, 0xf9, 0xd0, 0x27, 0xae, 0x1b, 0x09, 0x38, 0x7b, 0xef, - 0x12, 0x7a, 0xf5, 0x64, 0x7a, 0x99, 0x78, 0x19, 0xd6, 0xb8, 0xfc, 0xf5, 0xe0, 0x2c, 0x5d, 0x4c, - 0x5f, 0xe2, 0x23, 0xcc, 0x66, 0x26, 0x1d, 0xb5, 0x10, 0x86, 0xd5, 0xe7, 0x17, 0xa8, 0x3b, 0x70, - 0x8e, 0x21, 0xa5, 0x9e, 0x91, 0x13, 0x2a, 0x0e, 0xba, 0x2f, 0xcc, 0x36, 0x09, 0x8a, 0x56, 0x95, - 0xda, 0xaf, 0xfb, 0x30, 0xc6, 0x6e, 0x4b, 0xfd, 0xa3, 0x7c, 0x2c, 0x8c, 0x3b, 0xb3, 0x3a, 0x96, - 0x86, 0xfc, 0x39, 0x4c, 0xaa, 0xf6, 0x32, 0x67, 0x67, 0xe4, 0xa7, 0xf4, 0x39, 0x56, 0xbc, 0x7a, - 0xa4, 0xe3, 0xcf, 0x45, 0x52, 0x2d, 0x70, 0x96, 0xb2, 0x0d, 0x52, 0x26, 0x1d, 0x4f, 0xeb, 0xfe, - 0xf9, 0x18, 0x36, 0xfa, 0x58, 0xf8, 0x46, 0x49, 0xe4, 0x38, 0x50, 0x06, 0xcf, 0xa6, 0x18, 0x9b, - 0x5f, 0x05, 0x59, 0x6e, 0xb0, 0x3d, 0xbb, 0xdd, 0xcf, 0xb3, 0x71, 0x6f, 0xd6, 0xa5, 0x51, 0xd9, - 0xa6, 0x82, 0x57, 0x2c, 0x09, 0x48, 0x3a, 0xa1, 0x2b, 0xe9, 0x79, 0x43, 0xe8, 0x64, 0x3c, 0xa2, - 0x17, 0xbb, 0x78, 0x02, 0xf9, 0xb4, 0xe1, 0x65, 0xe4, 0x21, 0x09, 0x6f, 0xb2, 0x71, 0x72, 0x19, - 0x68, 0x59, 0x17, 0x63, 0xee, 0xad, 0xf9, 0x46, 0xc8, 0xad, 0x0b, 0xb3, 0xc3, 0xfe, 0x07, 0x9b, - 0x21, 0x04, 0x25, 0x3c, 0x54, 0xf7, 0x9c, 0x8b, 0x34, 0x72, 0xbf, 0x44, 0xe5, 0xbf, 0xe4, 0xfc, - 0xcf, 0xa9, 0xc4, 0x6e, 0x29, 0xb6, 0x0e, 0xd9, 0x99, 0xa3, 0x9f, 0x52, 0xa7, 0xb3, 0xe4, 0x34, - 0x29, 0x37, 0x7b, 0x50, 0x11, 0x9c, 0x78, 0xbb, 0x27, 0x9c, 0x7c, 0xf6, 0xbc, 0xc4, 0x4e, 0xd8, - 0xe4, 0xf6, 0x7a, 0xa4, 0x7d, 0x49, 0x78, 0x89, 0x4e, 0x49, 0xae, 0x2c, 0x08, 0xea, 0x36, 0x9d, - 0x99, 0x63, 0x48, 0x63, 0xff, 0x17, 0x50, 0x0a, 0x0d, 0x3a, 0xce, 0x36, 0x09, 0xe9, 0x12, 0x3d, - 0x8a, 0xa7, 0x9c, 0x46, 0x59, 0x91, 0xe9, 0x8b, 0xd7, 0xd2, 0x38, 0xec, 0x2b, 0x96, 0x42, 0xdc, - 0x14, 0x2d, 0x92, 0x30, 0x28, 0x2d, 0xf5, 0x50, 0x86, 0x6a, 0x95, 0x7b, 0xe1, 0xbd, 0x11, 0x42, - 0xf1, 0xd9, 0x3e, 0x3b, 0x21, 0x69, 0x6f, 0x11, 0x21, 0x64, 0x64, 0x4c, 0xef, 0x59, 0xcc, 0xc9, - 0xa2, 0x53, 0x71, 0xd6, 0x09, 0xb5, 0x42, 0xcf, 0xb3, 0x78, 0x5e, 0x6c, 0x29, 0xcb, 0xa5, 0xe6, - 0xe8, 0x96, 0xb3, 0x9b, 0x91, 0x54, 0xbb, 0x4a, 0x3e, 0x53, 0xd6, 0x84, 0x96, 0x94, 0xb7, 0x6a, - 0x6e, 0x84, 0x9a, 0x82, 0x84, 0x6c, 0xbd, 0x45, 0x10, 0x95, 0xe6, 0x06, 0xaa, 0x8b, 0xb0, 0xaa, - 0x49, 0x31, 0x50, 0xa4, 0x97, 0x4d, 0x52, 0x65, 0xc6, 0xed, 0xa2, 0x2e, 0x02, 0xa9, 0xbe, 0x49, - 0xa2, 0x0d, 0x98, 0x4f, 0x89, 0x1c, 0x23, 0x1f, 0x4d, 0xb3, 0x23, 0xcb, 0x14, 0xb3, 0x1b, 0x46, - 0x3f, 0x80, 0xb9, 0xc4, 0xd0, 0x32, 0x52, 0xf1, 0x9b, 0x15, 0x78, 0xa6, 0x17, 0xf1, 0xa7, 0xb0, - 0x90, 0x96, 0x41, 0x37, 0xf4, 0xfa, 0xc9, 0x4e, 0x6b, 0x2c, 0xf7, 0xd4, 0x9e, 0xa9, 0x78, 0xb7, - 0x60, 0x36, 0x29, 0x2b, 0xad, 0xfc, 0x38, 0x32, 0x52, 0xd6, 0x26, 0xba, 0x16, 0xd5, 0x60, 0x2e, - 0x31, 0x33, 0xac, 0xe4, 0x4c, 0x56, 0xde, 0xd8, 0x44, 0x8a, 0x5f, 0xc2, 0x7c, 0x4a, 0x1a, 0xd4, - 0xf0, 0x05, 0x3c, 0x33, 0x4d, 0x6a, 0x86, 0xfd, 0x50, 0x31, 0x3d, 0xc3, 0xa6, 0x34, 0x1b, 0xeb, - 0x99, 0x84, 0xb3, 0x98, 0x98, 0x76, 0x18, 0xed, 0xd0, 0x45, 0x98, 0x94, 0x72, 0x53, 0x5d, 0x84, - 0x19, 0x29, 0x39, 0x53, 0x5c, 0xc2, 0xe6, 0x53, 0xb2, 0x6c, 0x66, 0x50, 0xed, 0xa3, 0xb7, 0x5b, - 0x62, 0xff, 0xd7, 0x73, 0x21, 0x46, 0x4c, 0x91, 0x13, 0x13, 0x25, 0x26, 0xf6, 0x53, 0x89, 0xa5, - 0xd0, 0x6e, 0x67, 0x88, 0x41, 0x48, 0x0d, 0xa6, 0x40, 0x20, 0xa9, 0xee, 0x7c, 0x52, 0xc5, 0xcd, - 0xda, 0x51, 0x63, 0xc8, 0x54, 0xf0, 0xfc, 0x08, 0x26, 0xea, 0x6a, 0xe3, 0x09, 0x8d, 0xa4, 0x2e, - 0x0a, 0xe9, 0x5b, 0xd3, 0xbb, 0xef, 0x19, 0xca, 0x1e, 0x79, 0x38, 0xf4, 0x35, 0x8a, 0x54, 0x8b, - 0x15, 0x2d, 0x5d, 0x89, 0xdc, 0xa9, 0x93, 0x32, 0x01, 0x49, 0x8b, 0x95, 0xe4, 0x0c, 0x27, 0x0d, - 0x16, 0x60, 0x3d, 0x9a, 0xe8, 0x09, 0x19, 0xbd, 0x13, 0x98, 0x49, 0x4b, 0xf3, 0xcc, 0x4c, 0x51, - 0xcc, 0xbc, 0x26, 0x4c, 0xd0, 0xa2, 0x9a, 0xd7, 0xc4, 0xd2, 0xbe, 0xa8, 0xe6, 0x35, 0x09, 0x39, - 0x5d, 0x56, 0x28, 0xad, 0x30, 0x32, 0x7d, 0x86, 0xc2, 0x40, 0x92, 0x49, 0x08, 0x80, 0xff, 0x58, - 0x0d, 0xc9, 0xc1, 0xe2, 0xd9, 0x67, 0x68, 0x3c, 0xa3, 0xa1, 0x38, 0x22, 0x01, 0xf0, 0x1f, 0x41, - 0x21, 0x1a, 0xcb, 0x4b, 0xaa, 0xa3, 0x52, 0x82, 0x7c, 0x65, 0x2c, 0x31, 0x08, 0x23, 0x76, 0x49, - 0xa5, 0x4f, 0x2c, 0x88, 0x57, 0xf1, 0x62, 0x42, 0x8d, 0x14, 0xd7, 0x26, 0xd4, 0xf8, 0x5e, 0xd2, - 0x42, 0x2c, 0x21, 0xe8, 0x57, 0xf1, 0x52, 0x62, 0x1d, 0x27, 0x14, 0xb0, 0xdc, 0x7b, 0xc9, 0x99, - 0xfb, 0x42, 0xb7, 0xa6, 0x0c, 0x18, 0xd1, 0xcc, 0xed, 0x7e, 0x40, 0x79, 0xab, 0x58, 0xc6, 0xd3, - 0x8f, 0x43, 0xa1, 0xb7, 0x13, 0xdc, 0x0f, 0x34, 0x88, 0xd0, 0x78, 0x2a, 0x7c, 0x44, 0x4f, 0xca, - 0x4e, 0x88, 0xf6, 0x45, 0x7c, 0xf3, 0x94, 0x96, 0x7a, 0x11, 0x48, 0x9d, 0xc1, 0x7d, 0x11, 0xd1, - 0xfc, 0x4d, 0x13, 0x3e, 0x80, 0xc5, 0x88, 0x77, 0x83, 0x4e, 0xf8, 0x76, 0xb2, 0x0b, 0x44, 0x22, - 0x7b, 0xd2, 0xe5, 0xe1, 0xab, 0x71, 0x57, 0x88, 0xc8, 0xbc, 0x9f, 0x75, 0xaf, 0xda, 0x84, 0x29, - 0xba, 0x3d, 0x88, 0x7c, 0x93, 0x61, 0x24, 0x17, 0xbd, 0x38, 0x1a, 0x52, 0x28, 0x5a, 0x2b, 0xdd, - 0xc0, 0x27, 0xb8, 0x8b, 0x2c, 0xcb, 0x5e, 0x59, 0xd4, 0xfd, 0x66, 0x69, 0x61, 0xd2, 0xe9, 0xc3, - 0x93, 0x62, 0xa2, 0x4f, 0x61, 0x3a, 0xf4, 0x9c, 0x65, 0x24, 0x12, 0xc0, 0x32, 0x94, 0x50, 0xd3, - 0xa1, 0xfb, 0xec, 0xd9, 0xd1, 0xd7, 0xc4, 0x11, 0x12, 0xa2, 0x5f, 0x8e, 0x79, 0x85, 0x68, 0x63, - 0xe8, 0xe7, 0x24, 0x51, 0x78, 0x7b, 0xd6, 0xd9, 0x69, 0xd2, 0xcf, 0x2d, 0x39, 0x70, 0x9d, 0xfa, - 0xb9, 0x65, 0x06, 0xd7, 0x93, 0x62, 0x6b, 0x0a, 0x9d, 0x4d, 0xb8, 0x4e, 0x03, 0x9b, 0xd4, 0xb0, - 0xd3, 0xb2, 0x9d, 0xc3, 0x64, 0xa8, 0xf4, 0xbe, 0x47, 0xc3, 0xa1, 0xb4, 0xe1, 0x5a, 0xcf, 0xc8, - 0x7d, 0xe8, 0xae, 0x66, 0x11, 0xd2, 0x3b, 0xc6, 0x5f, 0x96, 0x27, 0x56, 0x52, 0x00, 0x3c, 0x79, - 0x3e, 0x66, 0xc4, 0xe2, 0x93, 0xe7, 0x63, 0x66, 0x04, 0xbd, 0x2f, 0x69, 0xd2, 0x00, 0x7e, 0xb6, - 0xd0, 0x60, 0x45, 0xd8, 0x61, 0x21, 0x7d, 0x33, 0x9f, 0x54, 0xae, 0xe9, 0x0f, 0x89, 0x31, 0x44, - 0x7a, 0x17, 0xb9, 0xc2, 0x6f, 0x50, 0x69, 0xc4, 0x7b, 0x13, 0xc9, 0xb0, 0x44, 0xbe, 0xc2, 0x16, - 0xe0, 0x99, 0x7b, 0x9e, 0x52, 0x5e, 0x59, 0xfe, 0xe9, 0x9f, 0x5f, 0xc9, 0xfd, 0xf4, 0x67, 0x57, - 0x72, 0xff, 0xee, 0x67, 0x57, 0x72, 0xff, 0xe9, 0x67, 0x57, 0x72, 0xdf, 0x5f, 0xea, 0x2f, 0xb0, - 0x6c, 0xb3, 0x6d, 0x63, 0x27, 0xb8, 0xcb, 0xc8, 0x9d, 0xa3, 0xff, 0x3d, 0xf8, 0xdf, 0x01, 0x00, - 0x00, 0xff, 0xff, 0x0d, 0x3d, 0x3a, 0xf6, 0xa5, 0xdb, 0x00, 0x00, + 0xa5, 0xff, 0xf9, 0x7b, 0x39, 0x18, 0x27, 0xdb, 0x81, 0x30, 0xfb, 0xfc, 0x5a, 0xb9, 0x60, 0xf0, + 0xcf, 0x80, 0x27, 0x60, 0x4a, 0xbd, 0x4d, 0xd0, 0x93, 0xa1, 0x98, 0xa1, 0xb8, 0xa2, 0x00, 0xb7, + 0x72, 0xf7, 0x72, 0xc8, 0xa4, 0xaf, 0x34, 0x11, 0x79, 0x5b, 0x52, 0x4e, 0xbe, 0x12, 0x15, 0x2f, + 0x67, 0x8a, 0xe9, 0xe8, 0x97, 0xc1, 0x50, 0x69, 0xa6, 0x48, 0xa5, 0xdf, 0xe9, 0x4f, 0xfa, 0x14, + 0x6d, 0xde, 0xec, 0x0f, 0x1c, 0x3d, 0x82, 0x49, 0x22, 0xaf, 0x49, 0x30, 0x74, 0x29, 0x8a, 0xa8, + 0x88, 0x88, 0xc5, 0xc5, 0xe4, 0x4a, 0x19, 0xff, 0x7d, 0x82, 0x0e, 0x84, 0x5d, 0xb6, 0x7c, 0x24, + 0x9c, 0xe3, 0x44, 0x09, 0xb3, 0xd3, 0x29, 0x9e, 0x8f, 0x14, 0xef, 0xdd, 0xbf, 0x97, 0x43, 0x75, + 0x1a, 0x53, 0x42, 0x13, 0xfc, 0x90, 0xb0, 0x43, 0x8e, 0x4b, 0x84, 0xac, 0x37, 0x25, 0x99, 0xd1, + 0x28, 0x45, 0x62, 0xdc, 0x02, 0x14, 0x97, 0xa7, 0xd0, 0xd5, 0x70, 0x1d, 0x24, 0x8b, 0x5a, 0xc5, + 0x0b, 0xb1, 0xc7, 0xf7, 0x15, 0x72, 0xa2, 0xa2, 0x15, 0x98, 0xe2, 0x9e, 0x2f, 0x5c, 0xc2, 0x43, + 0x59, 0x32, 0x62, 0x2a, 0x99, 0x55, 0xca, 0x27, 0x29, 0x25, 0xa2, 0x62, 0x38, 0x8e, 0xa8, 0xe8, + 0x58, 0xbc, 0x94, 0x58, 0xc7, 0xc7, 0xf7, 0x10, 0xa6, 0x74, 0x81, 0x13, 0x89, 0x09, 0x4a, 0x94, + 0x43, 0x53, 0x3b, 0xd4, 0x80, 0xf9, 0x4d, 0xcb, 0xa6, 0xea, 0x26, 0xfe, 0xc4, 0x2b, 0x1e, 0x68, + 0x51, 0x29, 0xe3, 0xc5, 0xb6, 0x8e, 0x9d, 0x56, 0xb1, 0x57, 0x0c, 0x26, 0xfa, 0xd9, 0xd4, 0x85, + 0xdc, 0xa4, 0x3f, 0x70, 0x23, 0x43, 0xcf, 0x52, 0x97, 0x64, 0xb3, 0x50, 0x4c, 0x33, 0xb3, 0x41, + 0x9b, 0x54, 0x70, 0x8b, 0x50, 0x54, 0xd6, 0xc4, 0x99, 0xc9, 0x2d, 0x50, 0xff, 0xab, 0xc0, 0x8e, + 0xda, 0xcb, 0xf8, 0x28, 0x85, 0x71, 0xa9, 0xc4, 0xee, 0xe5, 0xd0, 0xd7, 0xf4, 0xab, 0x4e, 0x24, + 0xb7, 0x6f, 0x07, 0x47, 0xdc, 0x66, 0xed, 0x52, 0x22, 0x01, 0xfe, 0xa1, 0x64, 0x50, 0x37, 0x61, + 0x36, 0xc9, 0xb2, 0x47, 0x32, 0x34, 0xc3, 0xec, 0x27, 0x75, 0x15, 0x98, 0x44, 0xfc, 0x6c, 0xa5, + 0x4f, 0x52, 0x86, 0x61, 0x49, 0x2a, 0xcd, 0x4f, 0x60, 0x8a, 0xac, 0x92, 0xc7, 0x18, 0x77, 0xca, + 0x6d, 0xfb, 0x19, 0xf6, 0x91, 0x88, 0x4f, 0x26, 0x8b, 0xd2, 0x70, 0x6f, 0xe5, 0xd0, 0xb7, 0x60, + 0x7c, 0xdf, 0x0a, 0x9a, 0x47, 0x3c, 0x30, 0x8e, 0x88, 0x9b, 0x43, 0xcb, 0x8a, 0xe2, 0x17, 0xad, + 0xbc, 0x97, 0x43, 0x9f, 0xc2, 0xc8, 0x2a, 0x0e, 0xa8, 0x1f, 0xc8, 0x35, 0xf9, 0xc8, 0xcd, 0x0c, + 0xca, 0xd6, 0x1d, 0x69, 0x7e, 0x2a, 0x3a, 0x1c, 0x55, 0x6e, 0xa1, 0xbb, 0x00, 0x6c, 0x43, 0xa0, + 0x14, 0xa2, 0xd5, 0xc5, 0x58, 0xb7, 0xd1, 0x2a, 0x39, 0xf8, 0xdb, 0x38, 0xc0, 0xfd, 0x36, 0x99, + 0xc6, 0xa3, 0x0d, 0x98, 0x92, 0x21, 0xf3, 0xb7, 0xa8, 0x17, 0xa4, 0x11, 0x21, 0xe6, 0x9f, 0x81, + 0xda, 0x47, 0xe4, 0xab, 0x60, 0x39, 0xd5, 0x64, 0xec, 0x36, 0x94, 0x16, 0xcd, 0x4d, 0x32, 0x91, + 0x81, 0x29, 0xb8, 0x6b, 0xae, 0x1f, 0xe8, 0xb8, 0xb2, 0x24, 0x19, 0x17, 0x43, 0x51, 0x6d, 0x57, + 0x8f, 0xe3, 0x16, 0xee, 0xb9, 0x69, 0xe1, 0xe7, 0x8a, 0xd7, 0x32, 0x20, 0xd8, 0x76, 0x47, 0x77, + 0x92, 0x65, 0x72, 0xa3, 0x67, 0xcd, 0x6c, 0x77, 0xb0, 0x53, 0xaf, 0xaf, 0xd1, 0x80, 0x5c, 0xe2, + 0x4d, 0x4d, 0x29, 0x13, 0x84, 0x51, 0xbc, 0x8a, 0x9c, 0x7a, 0x9a, 0x47, 0x1c, 0xca, 0xf2, 0x93, + 0x0b, 0x4f, 0xbd, 0xc4, 0x90, 0x63, 0x8f, 0x99, 0x8e, 0x41, 0xcb, 0xc8, 0xba, 0xb7, 0x84, 0x8a, + 0x49, 0x72, 0x2a, 0xff, 0xb0, 0x2f, 0x24, 0xd5, 0xed, 0x3d, 0xb8, 0x97, 0x43, 0x2b, 0x30, 0x23, + 0x9d, 0x56, 0xc3, 0x2a, 0x94, 0x82, 0x90, 0x71, 0xc2, 0xcc, 0x25, 0x90, 0xd9, 0x5b, 0xca, 0x20, + 0x94, 0x58, 0x8e, 0x3e, 0x87, 0x19, 0xbe, 0x36, 0xb5, 0xfe, 0x14, 0xe4, 0x36, 0xc3, 0x45, 0xfb, + 0xd4, 0x9e, 0x3c, 0x82, 0xb9, 0x7a, 0x84, 0x3b, 0xcc, 0xe0, 0xeb, 0xa2, 0x4e, 0x82, 0x16, 0xd6, + 0x71, 0xc0, 0xd8, 0x93, 0x4c, 0xeb, 0x31, 0x20, 0xa6, 0x0f, 0x10, 0xe4, 0x9e, 0xd9, 0xf8, 0x39, + 0xba, 0x1c, 0xe9, 0x3a, 0x29, 0xa4, 0x60, 0x74, 0x9f, 0x4a, 0x1d, 0xd9, 0x0e, 0x4b, 0xfc, 0xc7, + 0x72, 0x95, 0x5b, 0x1d, 0xeb, 0xc0, 0x6e, 0xdb, 0x81, 0x8d, 0xc9, 0x52, 0x55, 0x11, 0xd4, 0x2a, + 0xb1, 0x1e, 0x2e, 0xa6, 0x42, 0xa0, 0x5f, 0xa5, 0xe1, 0xa2, 0xb2, 0xef, 0x26, 0xe8, 0x5b, 0x49, + 0xd9, 0xa9, 0x53, 0x6e, 0x57, 0xc5, 0x6f, 0xf7, 0x07, 0xcc, 0x17, 0xe3, 0x67, 0x30, 0xb9, 0x8a, + 0x03, 0x96, 0x5d, 0x7c, 0xd9, 0x0a, 0x2c, 0x24, 0xf5, 0x05, 0xb2, 0x88, 0xaf, 0x41, 0x11, 0xeb, + 0x21, 0xac, 0xa8, 0xe3, 0x1f, 0xa3, 0x75, 0x28, 0xb0, 0x6d, 0x5e, 0x21, 0x71, 0x39, 0x46, 0x82, + 0x83, 0x58, 0x9e, 0x75, 0xec, 0xa7, 0xce, 0xd6, 0x5d, 0xf6, 0xbc, 0x8b, 0x64, 0x62, 0x66, 0x45, + 0x8e, 0x9c, 0xd1, 0xca, 0x64, 0x44, 0x4f, 0x32, 0x23, 0x26, 0xf6, 0x71, 0x20, 0xbc, 0x5b, 0x59, + 0xb2, 0xb3, 0xeb, 0xe1, 0x99, 0x1e, 0xaf, 0x0d, 0x3f, 0xf3, 0x48, 0x24, 0x86, 0xbd, 0x07, 0x48, + 0x26, 0x80, 0x4b, 0x20, 0x7a, 0x53, 0x13, 0x3d, 0xce, 0x46, 0xb7, 0x0a, 0x63, 0x0c, 0xad, 0xe2, + 0x06, 0x72, 0x7f, 0x94, 0x25, 0x02, 0x73, 0x21, 0x5e, 0xc1, 0x95, 0x13, 0x83, 0x7f, 0x35, 0x9f, + 0x43, 0x65, 0x18, 0x63, 0x9f, 0x96, 0x4a, 0x44, 0x96, 0xf4, 0xd8, 0xe6, 0x19, 0x89, 0xcf, 0x60, + 0x7c, 0x15, 0x07, 0x15, 0x97, 0x3a, 0x17, 0xfb, 0xf2, 0x93, 0x52, 0xca, 0x04, 0x99, 0x49, 0x65, + 0x14, 0x7b, 0x4b, 0x14, 0xfb, 0x5e, 0x0e, 0xbd, 0x4b, 0x8f, 0x4c, 0xea, 0x99, 0x3c, 0x17, 0xe2, + 0x2a, 0x39, 0x8e, 0x93, 0xf0, 0xc8, 0x99, 0x4e, 0x24, 0xee, 0xae, 0xe7, 0x61, 0x87, 0x21, 0xa7, + 0x89, 0x47, 0x49, 0xd8, 0x9f, 0xd1, 0xed, 0x52, 0xc1, 0x66, 0xd6, 0xf6, 0xbd, 0x48, 0xb0, 0x4c, + 0x09, 0xf7, 0x72, 0xe8, 0x03, 0x18, 0xe5, 0x7d, 0x24, 0x48, 0x5a, 0xa7, 0x7b, 0x8c, 0xf6, 0x03, + 0x00, 0x36, 0x15, 0xb4, 0xcf, 0x3a, 0x4c, 0x36, 0x9f, 0x3f, 0x20, 0xb2, 0x41, 0xeb, 0x55, 0x30, + 0xab, 0x42, 0x48, 0xa0, 0x98, 0x0b, 0xda, 0x2c, 0xab, 0x7c, 0xce, 0x24, 0x42, 0xc4, 0x7c, 0x1a, + 0x12, 0x46, 0x46, 0x76, 0x90, 0x62, 0xbe, 0x56, 0xdc, 0x4b, 0x34, 0x58, 0x87, 0x42, 0xb9, 0x49, + 0x4f, 0x2f, 0x99, 0x55, 0x5a, 0xde, 0xb1, 0xa2, 0x15, 0x82, 0xd6, 0x5c, 0x34, 0x49, 0xf5, 0x06, + 0xb6, 0x68, 0xc4, 0xbb, 0x79, 0x29, 0x09, 0x45, 0xaa, 0x92, 0x31, 0x32, 0xee, 0x54, 0xb3, 0x55, + 0x72, 0x0b, 0x6c, 0xbf, 0x1e, 0x99, 0x8f, 0xe8, 0xc6, 0xa7, 0x64, 0xdc, 0xbe, 0x10, 0xc5, 0x97, + 0xb7, 0x4f, 0x61, 0x6a, 0x2b, 0x41, 0xcb, 0x30, 0xcd, 0xe3, 0x6b, 0x49, 0xb6, 0xa4, 0x61, 0xa7, + 0x35, 0xff, 0x5d, 0x98, 0x5a, 0x21, 0x07, 0x53, 0xb7, 0x65, 0xb3, 0x28, 0x9f, 0x48, 0x0f, 0xdb, + 0x98, 0x8a, 0xb8, 0x26, 0x92, 0x93, 0x28, 0xa9, 0xa8, 0xe5, 0x87, 0x1c, 0xcf, 0xf6, 0x5d, 0x9c, + 0x15, 0x64, 0xd5, 0xac, 0xd5, 0x5c, 0x35, 0x31, 0x9f, 0x92, 0xfc, 0x19, 0xdd, 0xd0, 0x6e, 0xbc, + 0x69, 0x19, 0x9c, 0x13, 0x64, 0xdc, 0x2f, 0x95, 0x3c, 0x7b, 0x29, 0x34, 0xb3, 0xb3, 0x42, 0xa7, + 0x8e, 0x5b, 0xc6, 0xe5, 0x4b, 0xcc, 0xde, 0x8c, 0xde, 0xd1, 0xa9, 0x67, 0x64, 0x78, 0x4e, 0x6d, + 0x81, 0x6a, 0x14, 0xf4, 0xe4, 0xc2, 0xe8, 0x4a, 0x76, 0x0e, 0x64, 0x45, 0xa3, 0x90, 0x92, 0x95, + 0xf8, 0x11, 0x5d, 0x66, 0x61, 0x32, 0x3e, 0xa4, 0xde, 0xcf, 0xa3, 0xb9, 0x08, 0xa5, 0xe0, 0x98, + 0x9c, 0x61, 0xb8, 0x06, 0xd3, 0x91, 0xdc, 0xbd, 0x52, 0x91, 0x94, 0x9c, 0x3d, 0xb8, 0x78, 0x25, + 0xad, 0x5a, 0xaa, 0x4d, 0x0b, 0xd1, 0x84, 0xa7, 0x72, 0xc8, 0x29, 0xc9, 0x66, 0xe5, 0x90, 0x53, + 0x33, 0xa5, 0x3e, 0x82, 0x42, 0x34, 0xd7, 0xa2, 0x24, 0x9a, 0x92, 0x84, 0x31, 0x75, 0x4e, 0x1e, + 0xc2, 0xac, 0x3a, 0xa3, 0x72, 0xdc, 0x69, 0xbb, 0x7f, 0x1a, 0x9d, 0x1d, 0x98, 0x4b, 0x4c, 0x8d, + 0x28, 0x45, 0x85, 0xac, 0xc4, 0x89, 0xa9, 0x54, 0x31, 0x5c, 0x48, 0xce, 0x8e, 0x8a, 0xde, 0xd2, + 0xf5, 0x14, 0xc9, 0xb9, 0x22, 0x8b, 0x37, 0x7a, 0x40, 0x71, 0x86, 0x7e, 0x4d, 0x4f, 0xc0, 0x58, + 0x1b, 0xd7, 0x14, 0xcd, 0x45, 0x4a, 0x03, 0x46, 0x16, 0x88, 0x5c, 0x03, 0xb3, 0x49, 0xd9, 0x99, + 0x53, 0x59, 0x7c, 0x3d, 0x9d, 0x66, 0xb8, 0xb0, 0xf6, 0x44, 0x10, 0xbb, 0x54, 0xce, 0x64, 0x66, + 0xd1, 0xcc, 0xb8, 0xfa, 0x16, 0xe5, 0x7a, 0xe8, 0xbf, 0xcb, 0xe9, 0x6a, 0xac, 0xd9, 0xa4, 0xdc, + 0xad, 0x51, 0x2d, 0x53, 0x52, 0x6a, 0x4e, 0xc9, 0x86, 0xcc, 0xe4, 0xaf, 0x7b, 0x4c, 0xe3, 0xa4, + 0x53, 0x57, 0x35, 0x4e, 0x89, 0xa4, 0xaf, 0xa6, 0x03, 0x84, 0x2b, 0x22, 0x21, 0x09, 0xb5, 0x5c, + 0x11, 0xe9, 0xe9, 0xb0, 0xe5, 0x8a, 0xc8, 0xca, 0x61, 0x6d, 0x8a, 0x8f, 0x2e, 0x85, 0x2d, 0x19, + 0x19, 0x4b, 0x33, 0xae, 0x75, 0x0b, 0xe1, 0xc4, 0x45, 0xba, 0x7d, 0xd6, 0x69, 0xfb, 0x1a, 0x2e, + 0xa6, 0x66, 0x27, 0x45, 0x6f, 0xc7, 0x3e, 0xe8, 0x14, 0x4e, 0xa4, 0xf7, 0x74, 0x52, 0x4b, 0x2c, + 0x2a, 0x55, 0x6e, 0x91, 0x1c, 0xa6, 0xb1, 0x1d, 0x3b, 0x21, 0xc1, 0xe9, 0x2a, 0x95, 0x7c, 0x95, + 0x24, 0xa5, 0xa9, 0x63, 0xbd, 0x9c, 0x44, 0xc7, 0x8f, 0xef, 0xa9, 0x4a, 0xbf, 0x84, 0x24, 0x16, + 0xad, 0x38, 0xcb, 0x9e, 0xda, 0x4f, 0xd7, 0xd2, 0xe8, 0x2c, 0xd3, 0xcb, 0x84, 0xc8, 0x59, 0x8a, + 0x2e, 0x6a, 0x6c, 0xd2, 0x4e, 0xc9, 0xa2, 0x36, 0x38, 0xfd, 0x80, 0xac, 0x52, 0xdd, 0xb6, 0xcc, + 0x91, 0x9a, 0xda, 0x8b, 0x4b, 0x71, 0x1a, 0x9a, 0x5e, 0x5b, 0x72, 0x81, 0xf5, 0x66, 0x31, 0xca, + 0x1c, 0xad, 0x43, 0xe9, 0x43, 0x42, 0x2a, 0x6b, 0x7a, 0x74, 0x29, 0x5d, 0x42, 0x9d, 0xe1, 0x79, + 0xe0, 0x68, 0x94, 0x69, 0x11, 0xae, 0xe5, 0x82, 0x54, 0xd2, 0x29, 0xa5, 0x19, 0x3a, 0x99, 0x1a, + 0x35, 0x07, 0x4e, 0x48, 0xf7, 0x2a, 0xf7, 0xd0, 0xcc, 0x6c, 0xb0, 0x09, 0xd2, 0x99, 0xdc, 0x95, + 0x53, 0x29, 0x66, 0xe6, 0x7f, 0x4d, 0xed, 0xe9, 0x0f, 0x95, 0x5d, 0x39, 0x96, 0xd4, 0x15, 0xdd, + 0x8a, 0x8a, 0x66, 0x69, 0x79, 0x5f, 0x33, 0x76, 0xfd, 0xd9, 0xa4, 0x7c, 0xb0, 0x8a, 0xa2, 0x39, + 0x35, 0x59, 0x6c, 0x02, 0x17, 0xe4, 0xf6, 0x96, 0x42, 0x2d, 0x23, 0x3b, 0x6c, 0x6a, 0x0f, 0xbf, + 0xaf, 0x6c, 0x6f, 0x91, 0x2c, 0xae, 0x52, 0x71, 0xd0, 0x23, 0xcd, 0x6b, 0x2a, 0xed, 0x2d, 0x6a, + 0x40, 0x1e, 0x4f, 0xc1, 0x2a, 0x65, 0x97, 0xac, 0x04, 0xad, 0x89, 0x7a, 0xe8, 0xb9, 0xf8, 0x10, + 0x09, 0xbd, 0x0b, 0x11, 0x2d, 0x72, 0xaf, 0x8e, 0xc9, 0x7d, 0x38, 0x21, 0x75, 0x6b, 0x64, 0x1f, + 0x4e, 0x4f, 0xee, 0x9a, 0x71, 0xd1, 0x99, 0xae, 0xdb, 0x87, 0x8e, 0x92, 0x79, 0x55, 0x5e, 0x73, + 0xe2, 0xc9, 0x60, 0xe5, 0x16, 0x93, 0x94, 0xa8, 0x75, 0x9b, 0x48, 0x38, 0x4c, 0x3e, 0x57, 0x73, + 0x68, 0xa2, 0x62, 0x7a, 0xea, 0x50, 0xb9, 0xdd, 0x24, 0x26, 0xdd, 0x54, 0x08, 0xaa, 0x09, 0x2c, + 0x25, 0xc1, 0x84, 0x5c, 0x9a, 0x92, 0x60, 0x62, 0xc6, 0xcb, 0xbb, 0x54, 0xaf, 0x62, 0xba, 0x6d, + 0xac, 0xea, 0x55, 0x94, 0xb4, 0x8e, 0x11, 0xb5, 0x06, 0xfa, 0x98, 0x2a, 0x35, 0xb2, 0x35, 0x21, + 0xf3, 0x3a, 0x25, 0x35, 0xfd, 0x34, 0x84, 0xf9, 0x2d, 0x91, 0xae, 0x75, 0xca, 0x68, 0xf3, 0x3d, + 0xa1, 0xd4, 0xd0, 0xd0, 0x62, 0x19, 0x2f, 0xa3, 0x68, 0xdf, 0x85, 0x89, 0x30, 0xbb, 0xe5, 0xde, + 0x92, 0x82, 0x18, 0x49, 0x79, 0x19, 0x45, 0xfc, 0x40, 0x3c, 0xb0, 0xd0, 0xf6, 0xf4, 0xca, 0x5e, + 0x6a, 0x2e, 0x08, 0x13, 0x63, 0x46, 0x94, 0x28, 0x6a, 0x83, 0xe9, 0x3b, 0xef, 0x84, 0x9a, 0xd8, + 0x47, 0xce, 0x6b, 0x42, 0x1e, 0x35, 0x39, 0xaf, 0x49, 0xd9, 0xc9, 0x68, 0x6f, 0xe8, 0x5d, 0xfb, + 0x2b, 0xa1, 0x31, 0x08, 0x89, 0x5e, 0xce, 0xcc, 0x31, 0x56, 0xbc, 0x92, 0x9d, 0x98, 0x2b, 0x24, + 0x5d, 0x87, 0x42, 0x34, 0x0b, 0x11, 0x4a, 0xca, 0x13, 0xa7, 0xa4, 0x8b, 0x92, 0x77, 0xb8, 0xd4, + 0xf4, 0x45, 0x35, 0xa1, 0xc6, 0xd7, 0xe9, 0xa6, 0x64, 0x0b, 0x53, 0x49, 0x67, 0x8b, 0x55, 0x61, + 0x42, 0x22, 0xf5, 0x22, 0x1c, 0x4b, 0x78, 0xa4, 0x8a, 0x55, 0x09, 0x39, 0x8c, 0x6c, 0x11, 0x7f, + 0x21, 0x39, 0xa3, 0xe9, 0x3b, 0xfa, 0x0d, 0x35, 0x23, 0xe8, 0x64, 0xcf, 0xc7, 0x68, 0xf4, 0x4b, + 0x30, 0x9f, 0x12, 0x1b, 0x10, 0xdd, 0x88, 0x28, 0x84, 0x93, 0x63, 0x07, 0x16, 0xb3, 0x12, 0xff, + 0xa1, 0x4d, 0x6a, 0xc5, 0xa0, 0x79, 0x5a, 0xc6, 0x5e, 0x06, 0xf7, 0xed, 0xe0, 0x88, 0xa5, 0xb2, + 0x54, 0xf6, 0xcc, 0x44, 0x17, 0x4d, 0x54, 0xa7, 0xf7, 0x0d, 0xad, 0x34, 0xe1, 0x71, 0x30, 0x81, + 0x60, 0x31, 0x99, 0x20, 0x4d, 0x1c, 0x5e, 0x13, 0x4f, 0x4c, 0xd1, 0x6e, 0xaa, 0xc3, 0x4f, 0x72, + 0x2e, 0x4d, 0xed, 0x66, 0x4d, 0x08, 0x48, 0xc9, 0x14, 0xd3, 0x3d, 0x62, 0x53, 0x29, 0x3e, 0x22, + 0x14, 0x63, 0x4e, 0xae, 0x28, 0x05, 0x3c, 0x7b, 0xf7, 0x30, 0xc5, 0x79, 0xab, 0x63, 0x2d, 0x29, + 0xfd, 0x4b, 0x73, 0xa7, 0x4d, 0xed, 0xdf, 0x8a, 0xf8, 0x9e, 0x92, 0xfb, 0xd7, 0xef, 0x89, 0x2b, + 0x9f, 0xe9, 0x22, 0x7e, 0xd6, 0xda, 0x40, 0x95, 0xf2, 0x62, 0x4a, 0x39, 0xda, 0xa2, 0x66, 0x49, + 0xd1, 0x52, 0xe5, 0xe2, 0x99, 0xec, 0xc8, 0x9d, 0x4a, 0x8f, 0xad, 0x63, 0xcd, 0x11, 0xf6, 0x2c, + 0xeb, 0x38, 0xe2, 0x41, 0xcb, 0xd7, 0xb1, 0x56, 0x7a, 0xb6, 0x75, 0x1c, 0x21, 0xa8, 0xaf, 0xe3, + 0x68, 0x37, 0xa3, 0x17, 0xf9, 0xd4, 0x59, 0x8d, 0x76, 0x53, 0xae, 0xe3, 0x64, 0x8a, 0xe9, 0x0e, + 0xcb, 0xa9, 0x14, 0xe5, 0x3a, 0xd6, 0x29, 0xa6, 0x80, 0xf7, 0xb9, 0x8e, 0xa3, 0x8d, 0xe8, 0xeb, + 0xf8, 0x4c, 0xfd, 0x93, 0xeb, 0x38, 0xb9, 0x7f, 0x67, 0x5e, 0xc7, 0x11, 0x0f, 0x7f, 0x6d, 0xa0, + 0x49, 0xeb, 0x38, 0x0a, 0xcf, 0xd6, 0x71, 0xb4, 0x34, 0xa2, 0x40, 0xc9, 0x58, 0xc7, 0x51, 0xcc, + 0x2f, 0x28, 0xbd, 0x88, 0x77, 0x72, 0x3f, 0x2b, 0x39, 0xd5, 0xb1, 0x19, 0xed, 0x53, 0xed, 0x5d, + 0xa4, 0xbc, 0xbf, 0xd5, 0xbc, 0x98, 0x46, 0x94, 0xae, 0xe7, 0x3d, 0xc1, 0xc4, 0x68, 0x77, 0x75, + 0xd5, 0x54, 0xb2, 0x73, 0x76, 0x46, 0x87, 0xf7, 0xc8, 0xba, 0x69, 0x65, 0xd0, 0xcd, 0xf2, 0x2d, + 0xcf, 0xa0, 0x2b, 0xef, 0x31, 0x51, 0xba, 0xa9, 0x28, 0xd9, 0xeb, 0xfb, 0x4b, 0xf1, 0x7e, 0x11, + 0xc5, 0x5b, 0x8a, 0xdc, 0x8c, 0xce, 0xdc, 0x53, 0x79, 0x43, 0x8a, 0xf6, 0xf4, 0xac, 0xeb, 0x7c, + 0x53, 0x48, 0x0f, 0xb1, 0xa0, 0x14, 0x91, 0x41, 0xab, 0x6b, 0x3d, 0xb5, 0x06, 0xed, 0x50, 0x55, + 0x6d, 0xbc, 0x5c, 0x51, 0xf3, 0xa6, 0x45, 0xbf, 0xe8, 0x49, 0x35, 0xe6, 0x5e, 0xaf, 0x52, 0x4d, + 0xf3, 0xbd, 0x97, 0x54, 0xe3, 0xd8, 0x9f, 0x53, 0xd5, 0x17, 0xf7, 0x07, 0x72, 0x9e, 0xb8, 0xe9, + 0xf7, 0x94, 0x19, 0xcd, 0x74, 0x8a, 0xc0, 0x52, 0x8b, 0xb5, 0x4f, 0xf8, 0x03, 0x9d, 0x28, 0x4c, + 0x65, 0x7e, 0x12, 0x3e, 0xfa, 0x1c, 0x0a, 0x7c, 0x7b, 0x0b, 0x09, 0x24, 0x01, 0xa6, 0x4e, 0x5d, + 0x45, 0x68, 0xdc, 0xfa, 0xe8, 0x41, 0x3f, 0x9a, 0xb6, 0x7e, 0x38, 0x91, 0xae, 0x96, 0x22, 0xc7, + 0xe1, 0x8e, 0xd7, 0xf5, 0x03, 0xdc, 0x8a, 0xab, 0x93, 0xf4, 0xce, 0x08, 0x03, 0x0e, 0x1d, 0x7c, + 0x6f, 0x09, 0xad, 0xd3, 0xbd, 0x4d, 0x2f, 0xce, 0xd2, 0xb7, 0x25, 0x93, 0xa1, 0x5b, 0xcf, 0x9a, + 0x74, 0x3c, 0xd1, 0xfb, 0x94, 0xd6, 0x76, 0x7a, 0xa7, 0x24, 0x8b, 0xfa, 0x1c, 0x5d, 0x1a, 0x8b, + 0xd8, 0x85, 0x98, 0xe9, 0xfe, 0x7a, 0x71, 0x26, 0xea, 0x0a, 0x83, 0xbe, 0x07, 0x63, 0x02, 0xb9, + 0x37, 0x43, 0xa2, 0xd8, 0x94, 0x21, 0xcb, 0x30, 0xa9, 0xf9, 0xf9, 0xc8, 0xdb, 0x4d, 0x92, 0xf7, + 0x4f, 0xc6, 0x3c, 0x4f, 0x6a, 0xfe, 0x3c, 0x92, 0x4a, 0x92, 0x97, 0x4f, 0x2a, 0x95, 0x4f, 0x61, + 0x9c, 0xb3, 0x34, 0x93, 0x1b, 0xe9, 0xca, 0xb6, 0x39, 0xc5, 0x3e, 0xba, 0xdb, 0xb2, 0x83, 0xaa, + 0xeb, 0x3c, 0xb1, 0x0f, 0x7b, 0x32, 0x26, 0x8e, 0xb2, 0xb7, 0x84, 0xf6, 0x68, 0xbe, 0x36, 0x91, + 0x45, 0x0f, 0x07, 0xcf, 0x5d, 0xef, 0xa9, 0xed, 0x1c, 0xf6, 0x20, 0x79, 0x55, 0x27, 0x19, 0xc5, + 0x63, 0x74, 0xeb, 0xe9, 0x74, 0x7b, 0xe2, 0x67, 0x28, 0xdb, 0x16, 0xa9, 0x69, 0xcf, 0x59, 0x7b, + 0x9c, 0xfe, 0xf0, 0x78, 0x31, 0xb4, 0x2c, 0x36, 0x71, 0xd3, 0xf5, 0x5a, 0xbd, 0x89, 0x95, 0x74, + 0x3b, 0xde, 0x08, 0xda, 0xde, 0x12, 0xa1, 0x5a, 0x4f, 0xa5, 0xda, 0x0b, 0x3b, 0xe3, 0xb4, 0xba, + 0x44, 0xc7, 0x7e, 0xc6, 0xde, 0x66, 0xef, 0x5a, 0xe4, 0xa4, 0xa9, 0x79, 0xf8, 0x09, 0xf6, 0xa8, + 0x79, 0x78, 0x2f, 0xc3, 0x68, 0x1d, 0x7c, 0x6f, 0x89, 0x50, 0xa9, 0xc7, 0xa8, 0xa4, 0x41, 0x67, + 0xa9, 0xe4, 0xe9, 0xd0, 0xfa, 0xec, 0x4d, 0x1a, 0x99, 0x0f, 0xe8, 0x93, 0xc7, 0xee, 0x7a, 0x0f, + 0x8e, 0x08, 0x87, 0x05, 0x01, 0xb8, 0x77, 0x9f, 0x60, 0xd6, 0x15, 0xcc, 0x38, 0x44, 0x6a, 0x9b, + 0xdf, 0x13, 0x6f, 0x1b, 0x3d, 0x9b, 0x4d, 0xa3, 0xf0, 0x80, 0x6e, 0x6f, 0xdc, 0x26, 0x5a, 0xd1, + 0x0a, 0x6a, 0x99, 0x52, 0x8b, 0x93, 0xaa, 0x79, 0xb4, 0x8f, 0xca, 0xec, 0x46, 0xa7, 0xe6, 0x54, + 0x55, 0xac, 0x21, 0x12, 0x93, 0xad, 0x46, 0x49, 0x30, 0xad, 0xe6, 0x86, 0xdb, 0x7c, 0xaa, 0x6a, + 0x35, 0x95, 0x24, 0x9d, 0x45, 0x3d, 0x85, 0x26, 0xdf, 0xc4, 0x69, 0x1e, 0x4d, 0xd5, 0x54, 0x4b, + 0x4d, 0xd3, 0xa9, 0x6a, 0x35, 0xf5, 0x84, 0xa2, 0x0f, 0x84, 0xba, 0x90, 0x36, 0xa8, 0x53, 0x4e, + 0x65, 0x8d, 0xd4, 0x14, 0x52, 0x24, 0x5d, 0x53, 0xa8, 0x76, 0x34, 0x7d, 0xbb, 0x40, 0xf1, 0x8c, + 0xa2, 0xf2, 0xfe, 0x91, 0x9a, 0x6c, 0x34, 0xc3, 0xe2, 0x6a, 0x26, 0x21, 0x75, 0xb2, 0xbc, 0xb1, + 0xa5, 0xa7, 0x55, 0x2e, 0xea, 0xe6, 0x43, 0xf7, 0x72, 0x68, 0x0b, 0x2e, 0xac, 0xe2, 0x80, 0x6f, + 0x60, 0x26, 0xf6, 0x03, 0xcf, 0x6e, 0x06, 0x99, 0x0f, 0x7d, 0xe2, 0xba, 0x91, 0x80, 0xb3, 0xf7, + 0x2e, 0xa1, 0x57, 0x4f, 0xa6, 0x97, 0x89, 0x97, 0x61, 0x9c, 0xcb, 0x5f, 0x0f, 0xce, 0xd2, 0xc5, + 0xf4, 0x25, 0x3e, 0xc2, 0x6c, 0x66, 0xd2, 0x51, 0x0b, 0x61, 0x94, 0x7d, 0x7e, 0x81, 0xba, 0x03, + 0xe7, 0x18, 0x52, 0xea, 0x19, 0x39, 0xa1, 0xe2, 0xa0, 0xfb, 0xc2, 0x8a, 0x93, 0xa0, 0x68, 0x55, + 0xa9, 0xfd, 0xba, 0x0f, 0x63, 0xec, 0xb6, 0xd4, 0x3f, 0xca, 0xc7, 0xc2, 0xcc, 0x33, 0xab, 0x63, + 0x69, 0xc8, 0x9f, 0xc3, 0xa4, 0x6a, 0x2f, 0x73, 0x76, 0x46, 0x7e, 0x4a, 0x9f, 0x63, 0xc5, 0xab, + 0x47, 0x3a, 0xfe, 0x5c, 0x24, 0xf3, 0x02, 0x67, 0x29, 0xdb, 0x20, 0x65, 0x0e, 0xf2, 0xb4, 0xee, + 0x9f, 0x8f, 0x61, 0xa3, 0x8f, 0x85, 0xab, 0x94, 0x44, 0x8e, 0x03, 0x65, 0xf0, 0x6c, 0x8a, 0xb1, + 0xf9, 0x55, 0x90, 0xe5, 0x06, 0xdb, 0xb3, 0xdb, 0xfd, 0x3c, 0x1b, 0xf7, 0x66, 0x5d, 0x1a, 0x95, + 0x6d, 0x2a, 0x78, 0xc5, 0x72, 0x82, 0xa4, 0x13, 0xba, 0x92, 0x9e, 0x46, 0x84, 0x4e, 0xc6, 0x23, + 0x7a, 0xb1, 0x8b, 0xe7, 0x93, 0x4f, 0x1b, 0x5e, 0x46, 0x5a, 0x92, 0xf0, 0x26, 0x1b, 0x27, 0x97, + 0x81, 0x96, 0x75, 0x31, 0xe6, 0xce, 0x9b, 0x6f, 0x84, 0xdc, 0xba, 0x30, 0x3b, 0xec, 0x7f, 0xb0, + 0x19, 0x42, 0x50, 0xc2, 0x43, 0x75, 0xcf, 0xb9, 0x48, 0x23, 0xf7, 0x4b, 0x54, 0xfe, 0x4b, 0x4e, + 0x07, 0x9d, 0x4a, 0xec, 0x96, 0x62, 0xeb, 0x90, 0x9d, 0x48, 0xfa, 0x29, 0xf5, 0x41, 0x4b, 0xce, + 0x9a, 0x72, 0xb3, 0x07, 0x15, 0xc1, 0x89, 0xb7, 0x7b, 0xc2, 0xc9, 0x67, 0xcf, 0x4b, 0xec, 0x84, + 0x4d, 0x6e, 0xaf, 0x47, 0x16, 0x98, 0x84, 0x97, 0xe8, 0x94, 0x5c, 0xcb, 0x82, 0xa0, 0x6e, 0xd3, + 0x99, 0x39, 0x86, 0x34, 0xf6, 0x7f, 0x01, 0xa5, 0xd0, 0xa0, 0xe3, 0x6c, 0x93, 0x90, 0x2e, 0xd1, + 0xa3, 0x78, 0x06, 0x6a, 0x94, 0x15, 0xa8, 0xbe, 0x78, 0x2d, 0x8d, 0xc3, 0xbe, 0x62, 0x29, 0xc4, + 0x4d, 0xd1, 0x22, 0xf9, 0x83, 0xd2, 0x32, 0x11, 0x65, 0xa8, 0x56, 0xb9, 0x53, 0xde, 0x1b, 0x21, + 0x14, 0x9f, 0xed, 0xb3, 0x13, 0x92, 0xf6, 0x16, 0x11, 0x42, 0x46, 0xc6, 0xf4, 0x9e, 0xc5, 0x9c, + 0x2c, 0x3a, 0x15, 0x67, 0x9d, 0x50, 0x2b, 0x74, 0x44, 0x8b, 0xa7, 0xc9, 0x96, 0xb2, 0x5c, 0x6a, + 0xca, 0x6e, 0x39, 0xbb, 0x19, 0x39, 0xb6, 0xab, 0xe4, 0x33, 0x65, 0x4d, 0x68, 0x39, 0x7a, 0xab, + 0xe6, 0x46, 0xa8, 0x29, 0x48, 0x48, 0xde, 0x5b, 0x04, 0x51, 0x69, 0x6e, 0xa0, 0xba, 0x88, 0xb2, + 0x9a, 0x14, 0x12, 0x45, 0x3a, 0xdd, 0x24, 0x55, 0x66, 0xdc, 0x2e, 0xea, 0x22, 0xae, 0xea, 0x9b, + 0x24, 0xda, 0x80, 0xf9, 0x94, 0x40, 0x32, 0xf2, 0xd1, 0x34, 0x3b, 0xd0, 0x4c, 0x31, 0xbb, 0x61, + 0xf4, 0x03, 0x98, 0x4b, 0x8c, 0x34, 0x23, 0x15, 0xbf, 0x59, 0x71, 0x68, 0x7a, 0x11, 0x7f, 0x0a, + 0x0b, 0x69, 0x09, 0x75, 0x43, 0x27, 0xa0, 0xec, 0x2c, 0xc7, 0x72, 0x4f, 0xed, 0x99, 0x99, 0x77, + 0x0b, 0x66, 0x93, 0x92, 0xd4, 0xca, 0x8f, 0x23, 0x23, 0x83, 0x6d, 0xa2, 0xa7, 0x51, 0x0d, 0xe6, + 0x12, 0x13, 0xc5, 0x4a, 0xce, 0x64, 0xa5, 0x91, 0x4d, 0xa4, 0xf8, 0x25, 0xcc, 0xa7, 0x64, 0x45, + 0x0d, 0x5f, 0xc0, 0x33, 0xb3, 0xa6, 0x66, 0xd8, 0x0f, 0x15, 0xd3, 0x13, 0x6e, 0x4a, 0xb3, 0xb1, + 0x9e, 0x39, 0x39, 0x8b, 0x89, 0x59, 0x88, 0xd1, 0x0e, 0x5d, 0x84, 0x49, 0x19, 0x38, 0xd5, 0x45, + 0x98, 0x91, 0xa1, 0x33, 0xc5, 0x43, 0x6c, 0x3e, 0x25, 0xe9, 0x66, 0x06, 0xd5, 0x3e, 0x7a, 0xbb, + 0x25, 0xf6, 0x7f, 0x3d, 0x35, 0x62, 0xc4, 0x14, 0x39, 0x31, 0x6f, 0x62, 0x62, 0x3f, 0x95, 0xd0, + 0x0a, 0xed, 0x76, 0x86, 0x18, 0x84, 0xd4, 0xd8, 0x0a, 0x04, 0x92, 0xea, 0xce, 0x27, 0x55, 0xdc, + 0xac, 0x1d, 0x35, 0x86, 0x4c, 0x05, 0xcf, 0x8f, 0x60, 0xa2, 0xae, 0x36, 0x9e, 0xd0, 0x48, 0xea, + 0xa2, 0x90, 0xbe, 0x35, 0xbd, 0xfb, 0x9e, 0xa1, 0xec, 0x91, 0x87, 0x43, 0x5f, 0xa3, 0x48, 0xb5, + 0x58, 0xd1, 0xb2, 0x97, 0xc8, 0x9d, 0x3a, 0x29, 0x31, 0x90, 0xb4, 0x58, 0x49, 0x4e, 0x78, 0xd2, + 0x60, 0xf1, 0xd6, 0xa3, 0x79, 0x9f, 0x90, 0xd1, 0x3b, 0x9f, 0x99, 0xb4, 0x34, 0xcf, 0x4c, 0x1c, + 0xc5, 0xcc, 0x6b, 0xc2, 0x7c, 0x2d, 0xaa, 0x79, 0x4d, 0x2c, 0x0b, 0x8c, 0x6a, 0x5e, 0x93, 0x90, + 0xe2, 0x65, 0x85, 0xd2, 0x0a, 0x03, 0xd5, 0x67, 0x28, 0x0c, 0x24, 0x99, 0x84, 0x78, 0xf8, 0x8f, + 0xd5, 0x08, 0x1d, 0x2c, 0xbc, 0x7d, 0x86, 0xc6, 0x33, 0x1a, 0x99, 0x23, 0x12, 0x0f, 0xff, 0x11, + 0x14, 0xa2, 0xa1, 0xbd, 0xa4, 0x3a, 0x2a, 0x25, 0xe6, 0x57, 0xc6, 0x12, 0x83, 0x30, 0x80, 0x97, + 0x54, 0xfa, 0xc4, 0x62, 0x7a, 0x15, 0x2f, 0x26, 0xd4, 0x48, 0x71, 0x6d, 0x42, 0x0d, 0xf7, 0x25, + 0x2d, 0xc4, 0x12, 0x62, 0x80, 0x15, 0x2f, 0x25, 0xd6, 0x71, 0x42, 0x01, 0x4b, 0xc5, 0x97, 0x9c, + 0xc8, 0x2f, 0x74, 0x6b, 0xca, 0x80, 0x11, 0xcd, 0xdc, 0xee, 0x07, 0x94, 0xb7, 0x8a, 0x65, 0x78, + 0xfd, 0x38, 0x14, 0x7a, 0x3b, 0xc1, 0xfd, 0x40, 0x83, 0x08, 0x8d, 0xa7, 0xc2, 0x47, 0xf4, 0xa4, + 0x64, 0x85, 0x68, 0x5f, 0x84, 0x3b, 0x4f, 0x69, 0xa9, 0x17, 0x81, 0xd4, 0x19, 0xdc, 0x17, 0x01, + 0xce, 0xdf, 0x34, 0xe1, 0x03, 0x58, 0x8c, 0x78, 0x37, 0xe8, 0x84, 0x6f, 0x27, 0xbb, 0x40, 0x24, + 0xb2, 0x27, 0x5d, 0x1e, 0xbe, 0x1a, 0x77, 0x85, 0x88, 0xcc, 0xfb, 0x59, 0xf7, 0xaa, 0x4d, 0x98, + 0xa2, 0xdb, 0x83, 0x48, 0x3f, 0x19, 0x06, 0x76, 0xd1, 0x8b, 0xa3, 0x11, 0x86, 0xa2, 0xb5, 0xd2, + 0x2b, 0x7c, 0x82, 0xbb, 0xc8, 0xb2, 0x64, 0x96, 0x45, 0xdd, 0x6f, 0x96, 0x16, 0x26, 0x9d, 0x3e, + 0x3c, 0x47, 0x26, 0xfa, 0x14, 0xa6, 0x43, 0xcf, 0x59, 0x46, 0x22, 0x01, 0x2c, 0x43, 0x09, 0x35, + 0x1d, 0xba, 0xcf, 0x9e, 0x1d, 0x7d, 0x4d, 0x1c, 0x21, 0x21, 0xfa, 0xe5, 0x98, 0x57, 0x88, 0x36, + 0x86, 0x7e, 0x4e, 0x12, 0x85, 0xb7, 0x67, 0x9d, 0x9d, 0x26, 0xfd, 0xdc, 0x92, 0xe3, 0xd8, 0xa9, + 0x9f, 0x5b, 0x66, 0xac, 0x3d, 0x29, 0xb6, 0xa6, 0xd0, 0xd9, 0x84, 0xeb, 0x34, 0xce, 0x49, 0x0d, + 0x3b, 0x2d, 0xdb, 0x39, 0x4c, 0x86, 0x4a, 0xef, 0x7b, 0x34, 0x3a, 0x4a, 0x1b, 0xae, 0xf5, 0x0c, + 0xe4, 0x87, 0xee, 0x6a, 0x16, 0x21, 0xbd, 0x43, 0xfe, 0x65, 0x79, 0x62, 0x25, 0xc5, 0xc3, 0x93, + 0xe7, 0x63, 0x46, 0x68, 0x3e, 0x79, 0x3e, 0x66, 0x06, 0xd4, 0xfb, 0x92, 0xe6, 0x10, 0xe0, 0x67, + 0x0b, 0x8d, 0x5d, 0x84, 0x1d, 0x16, 0xe1, 0x37, 0xf3, 0x49, 0xe5, 0x9a, 0xfe, 0x90, 0x18, 0x43, + 0xa4, 0x77, 0x91, 0x2b, 0xfc, 0x06, 0x95, 0x46, 0xbc, 0x37, 0x91, 0x0c, 0x4b, 0xe4, 0x2b, 0x6c, + 0x01, 0x9e, 0xb9, 0xe7, 0x29, 0xe5, 0x95, 0xe5, 0x9f, 0xfe, 0xf9, 0x95, 0xdc, 0x4f, 0x7f, 0x76, + 0x25, 0xf7, 0x6f, 0x7e, 0x76, 0x25, 0xf7, 0x1f, 0x7e, 0x76, 0x25, 0xf7, 0xfd, 0xa5, 0xfe, 0xe2, + 0xcc, 0x36, 0xdb, 0x36, 0x76, 0x82, 0xbb, 0x8c, 0xdc, 0x39, 0xfa, 0xdf, 0x83, 0xff, 0x1d, 0x00, + 0x00, 0xff, 0xff, 0x0a, 0xaf, 0x3d, 0x6e, 0xb4, 0xdb, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -16177,10 +16177,16 @@ type AuthServiceClient interface { // password token. CreateResetPasswordToken(ctx context.Context, in *CreateResetPasswordTokenRequest, opts ...grpc.CallOption) (*types.UserTokenV3, error) // CreateBot creates a new bot user. + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. CreateBot(ctx context.Context, in *CreateBotRequest, opts ...grpc.CallOption) (*CreateBotResponse, error) // DeleteBot deletes a bot user. + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. DeleteBot(ctx context.Context, in *DeleteBotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // GetBotUsers gets all users with bot labels. + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. GetBotUsers(ctx context.Context, in *GetBotUsersRequest, opts ...grpc.CallOption) (AuthService_GetBotUsersClient, error) // GetUser gets a user resource by name. // @@ -17310,6 +17316,7 @@ func (c *authServiceClient) CreateResetPasswordToken(ctx context.Context, in *Cr return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) CreateBot(ctx context.Context, in *CreateBotRequest, opts ...grpc.CallOption) (*CreateBotResponse, error) { out := new(CreateBotResponse) err := c.cc.Invoke(ctx, "/proto.AuthService/CreateBot", in, out, opts...) @@ -17319,6 +17326,7 @@ func (c *authServiceClient) CreateBot(ctx context.Context, in *CreateBotRequest, return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) DeleteBot(ctx context.Context, in *DeleteBotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/proto.AuthService/DeleteBot", in, out, opts...) @@ -17328,6 +17336,7 @@ func (c *authServiceClient) DeleteBot(ctx context.Context, in *DeleteBotRequest, return out, nil } +// Deprecated: Do not use. func (c *authServiceClient) GetBotUsers(ctx context.Context, in *GetBotUsersRequest, opts ...grpc.CallOption) (AuthService_GetBotUsersClient, error) { stream, err := c.cc.NewStream(ctx, &_AuthService_serviceDesc.Streams[9], "/proto.AuthService/GetBotUsers", opts...) if err != nil { @@ -19558,10 +19567,16 @@ type AuthServiceServer interface { // password token. CreateResetPasswordToken(context.Context, *CreateResetPasswordTokenRequest) (*types.UserTokenV3, error) // CreateBot creates a new bot user. + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. CreateBot(context.Context, *CreateBotRequest) (*CreateBotResponse, error) // DeleteBot deletes a bot user. + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. DeleteBot(context.Context, *DeleteBotRequest) (*emptypb.Empty, error) // GetBotUsers gets all users with bot labels. + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. GetBotUsers(*GetBotUsersRequest, AuthService_GetBotUsersServer) error // GetUser gets a user resource by name. // diff --git a/api/gen/proto/go/teleport/machineid/v1/bot.pb.go b/api/gen/proto/go/teleport/machineid/v1/bot.pb.go index 3e9a29dc9fdc6..7135c67a4eaa1 100644 --- a/api/gen/proto/go/teleport/machineid/v1/bot.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/bot.pb.go @@ -263,7 +263,7 @@ type BotStatus struct { // The name of the user associated with the bot. UserName string `protobuf:"bytes,1,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"` // The name of the role associated with the bot. - RoleRole string `protobuf:"bytes,2,opt,name=role_role,json=roleRole,proto3" json:"role_role,omitempty"` + RoleName string `protobuf:"bytes,3,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` } func (x *BotStatus) Reset() { @@ -305,9 +305,9 @@ func (x *BotStatus) GetUserName() string { return "" } -func (x *BotStatus) GetRoleRole() string { +func (x *BotStatus) GetRoleName() string { if x != nil { - return x.RoleRole + return x.RoleName } return "" } @@ -345,17 +345,18 @@ var file_teleport_machineid_v1_bot_proto_rawDesc = []byte{ 0x61, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, - 0x22, 0x45, 0x0a, 0x09, 0x42, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, + 0x22, 0x56, 0x0a, 0x09, 0x42, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, - 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x6f, 0x6c, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, - 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x76, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x09, 0x72, + 0x6f, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, + 0x64, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 3581feccc8320..226bf41080080 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -2650,11 +2650,23 @@ service AuthService { rpc CreateResetPasswordToken(CreateResetPasswordTokenRequest) returns (types.UserTokenV3); // CreateBot creates a new bot user. - rpc CreateBot(CreateBotRequest) returns (CreateBotResponse); + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. + rpc CreateBot(CreateBotRequest) returns (CreateBotResponse) { + option deprecated = true; + } // DeleteBot deletes a bot user. - rpc DeleteBot(DeleteBotRequest) returns (google.protobuf.Empty); + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. + rpc DeleteBot(DeleteBotRequest) returns (google.protobuf.Empty) { + option deprecated = true; + } // GetBotUsers gets all users with bot labels. - rpc GetBotUsers(GetBotUsersRequest) returns (stream types.UserV2); + // + // Deprecated: Use [teleport.machineid.v1.BotService] instead. + rpc GetBotUsers(GetBotUsersRequest) returns (stream types.UserV2) { + option deprecated = true; + } // GetUser gets a user resource by name. // diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index afe7f02c5f7e8..f25c8d927aa89 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -1959,6 +1959,78 @@ message RoleDelete { ]; } +// BotCreate is emitted when a bot is created/upserted. +message BotCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// BotCreate is emitted when a bot is created/updated. +message BotUpdate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// BotDelete is emitted when a bot is deleted. +message BotDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + // TrustedClusterCreate is the event for creating a trusted cluster. message TrustedClusterCreate { // Metadata is a common event metadata @@ -3671,6 +3743,9 @@ message OneOf { events.UserUpdate UserUpdate = 140; events.ExternalAuditStorageEnable ExternalAuditStorageEnable = 141; events.ExternalAuditStorageDisable ExternalAuditStorageDisable = 142; + events.BotCreate BotCreate = 143; + events.BotDelete BotDelete = 144; + events.BotUpdate BotUpdate = 145; } } diff --git a/api/proto/teleport/machineid/v1/bot.proto b/api/proto/teleport/machineid/v1/bot.proto index bca6e1a77339e..976f68b910110 100644 --- a/api/proto/teleport/machineid/v1/bot.proto +++ b/api/proto/teleport/machineid/v1/bot.proto @@ -63,8 +63,11 @@ message BotSpec { // Fields that are set by the server as results of operations. These should not // be modified by users. message BotStatus { + reserved 2; + reserved "role_role"; + // The name of the user associated with the bot. string user_name = 1; // The name of the role associated with the bot. - string role_role = 2; + string role_name = 3; } diff --git a/api/types/constants.go b/api/types/constants.go index 139492e6e2cf3..0c697d71db37f 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -63,6 +63,9 @@ const ( // KindUser is a user resource KindUser = "user" + // KindBot is a Machine ID bot resource + KindBot = "bot" + // KindHostCert is a host certificate KindHostCert = "host_cert" diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index 70ea37789ca1d..d13828984e5e2 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -3443,6 +3443,144 @@ func (m *RoleDelete) XXX_DiscardUnknown() { var xxx_messageInfo_RoleDelete proto.InternalMessageInfo +// BotCreate is emitted when a bot is created/upserted. +type BotCreate struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BotCreate) Reset() { *m = BotCreate{} } +func (m *BotCreate) String() string { return proto.CompactTextString(m) } +func (*BotCreate) ProtoMessage() {} +func (*BotCreate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{60} +} +func (m *BotCreate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BotCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BotCreate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BotCreate) XXX_Merge(src proto.Message) { + xxx_messageInfo_BotCreate.Merge(m, src) +} +func (m *BotCreate) XXX_Size() int { + return m.Size() +} +func (m *BotCreate) XXX_DiscardUnknown() { + xxx_messageInfo_BotCreate.DiscardUnknown(m) +} + +var xxx_messageInfo_BotCreate proto.InternalMessageInfo + +// BotCreate is emitted when a bot is created/updated. +type BotUpdate struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BotUpdate) Reset() { *m = BotUpdate{} } +func (m *BotUpdate) String() string { return proto.CompactTextString(m) } +func (*BotUpdate) ProtoMessage() {} +func (*BotUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{61} +} +func (m *BotUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BotUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BotUpdate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BotUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_BotUpdate.Merge(m, src) +} +func (m *BotUpdate) XXX_Size() int { + return m.Size() +} +func (m *BotUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_BotUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_BotUpdate proto.InternalMessageInfo + +// BotDelete is emitted when a bot is deleted. +type BotDelete struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BotDelete) Reset() { *m = BotDelete{} } +func (m *BotDelete) String() string { return proto.CompactTextString(m) } +func (*BotDelete) ProtoMessage() {} +func (*BotDelete) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{62} +} +func (m *BotDelete) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BotDelete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BotDelete.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BotDelete) XXX_Merge(src proto.Message) { + xxx_messageInfo_BotDelete.Merge(m, src) +} +func (m *BotDelete) XXX_Size() int { + return m.Size() +} +func (m *BotDelete) XXX_DiscardUnknown() { + xxx_messageInfo_BotDelete.DiscardUnknown(m) +} + +var xxx_messageInfo_BotDelete proto.InternalMessageInfo + // TrustedClusterCreate is the event for creating a trusted cluster. type TrustedClusterCreate struct { // Metadata is a common event metadata @@ -3460,7 +3598,7 @@ func (m *TrustedClusterCreate) Reset() { *m = TrustedClusterCreate{} } func (m *TrustedClusterCreate) String() string { return proto.CompactTextString(m) } func (*TrustedClusterCreate) ProtoMessage() {} func (*TrustedClusterCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{60} + return fileDescriptor_007ba1c3d6266d56, []int{63} } func (m *TrustedClusterCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3506,7 +3644,7 @@ func (m *TrustedClusterDelete) Reset() { *m = TrustedClusterDelete{} } func (m *TrustedClusterDelete) String() string { return proto.CompactTextString(m) } func (*TrustedClusterDelete) ProtoMessage() {} func (*TrustedClusterDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{61} + return fileDescriptor_007ba1c3d6266d56, []int{64} } func (m *TrustedClusterDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3552,7 +3690,7 @@ func (m *ProvisionTokenCreate) Reset() { *m = ProvisionTokenCreate{} } func (m *ProvisionTokenCreate) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenCreate) ProtoMessage() {} func (*ProvisionTokenCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{62} + return fileDescriptor_007ba1c3d6266d56, []int{65} } func (m *ProvisionTokenCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3601,7 +3739,7 @@ func (m *TrustedClusterTokenCreate) Reset() { *m = TrustedClusterTokenCr func (m *TrustedClusterTokenCreate) String() string { return proto.CompactTextString(m) } func (*TrustedClusterTokenCreate) ProtoMessage() {} func (*TrustedClusterTokenCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{63} + return fileDescriptor_007ba1c3d6266d56, []int{66} } func (m *TrustedClusterTokenCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3647,7 +3785,7 @@ func (m *GithubConnectorCreate) Reset() { *m = GithubConnectorCreate{} } func (m *GithubConnectorCreate) String() string { return proto.CompactTextString(m) } func (*GithubConnectorCreate) ProtoMessage() {} func (*GithubConnectorCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{64} + return fileDescriptor_007ba1c3d6266d56, []int{67} } func (m *GithubConnectorCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3693,7 +3831,7 @@ func (m *GithubConnectorUpdate) Reset() { *m = GithubConnectorUpdate{} } func (m *GithubConnectorUpdate) String() string { return proto.CompactTextString(m) } func (*GithubConnectorUpdate) ProtoMessage() {} func (*GithubConnectorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{65} + return fileDescriptor_007ba1c3d6266d56, []int{68} } func (m *GithubConnectorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3739,7 +3877,7 @@ func (m *GithubConnectorDelete) Reset() { *m = GithubConnectorDelete{} } func (m *GithubConnectorDelete) String() string { return proto.CompactTextString(m) } func (*GithubConnectorDelete) ProtoMessage() {} func (*GithubConnectorDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{66} + return fileDescriptor_007ba1c3d6266d56, []int{69} } func (m *GithubConnectorDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3785,7 +3923,7 @@ func (m *OIDCConnectorCreate) Reset() { *m = OIDCConnectorCreate{} } func (m *OIDCConnectorCreate) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorCreate) ProtoMessage() {} func (*OIDCConnectorCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{67} + return fileDescriptor_007ba1c3d6266d56, []int{70} } func (m *OIDCConnectorCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3831,7 +3969,7 @@ func (m *OIDCConnectorUpdate) Reset() { *m = OIDCConnectorUpdate{} } func (m *OIDCConnectorUpdate) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorUpdate) ProtoMessage() {} func (*OIDCConnectorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{68} + return fileDescriptor_007ba1c3d6266d56, []int{71} } func (m *OIDCConnectorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3877,7 +4015,7 @@ func (m *OIDCConnectorDelete) Reset() { *m = OIDCConnectorDelete{} } func (m *OIDCConnectorDelete) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorDelete) ProtoMessage() {} func (*OIDCConnectorDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{69} + return fileDescriptor_007ba1c3d6266d56, []int{72} } func (m *OIDCConnectorDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3923,7 +4061,7 @@ func (m *SAMLConnectorCreate) Reset() { *m = SAMLConnectorCreate{} } func (m *SAMLConnectorCreate) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorCreate) ProtoMessage() {} func (*SAMLConnectorCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{70} + return fileDescriptor_007ba1c3d6266d56, []int{73} } func (m *SAMLConnectorCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3969,7 +4107,7 @@ func (m *SAMLConnectorUpdate) Reset() { *m = SAMLConnectorUpdate{} } func (m *SAMLConnectorUpdate) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorUpdate) ProtoMessage() {} func (*SAMLConnectorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{71} + return fileDescriptor_007ba1c3d6266d56, []int{74} } func (m *SAMLConnectorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4015,7 +4153,7 @@ func (m *SAMLConnectorDelete) Reset() { *m = SAMLConnectorDelete{} } func (m *SAMLConnectorDelete) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorDelete) ProtoMessage() {} func (*SAMLConnectorDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{72} + return fileDescriptor_007ba1c3d6266d56, []int{75} } func (m *SAMLConnectorDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4081,7 +4219,7 @@ func (m *KubeRequest) Reset() { *m = KubeRequest{} } func (m *KubeRequest) String() string { return proto.CompactTextString(m) } func (*KubeRequest) ProtoMessage() {} func (*KubeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{73} + return fileDescriptor_007ba1c3d6266d56, []int{76} } func (m *KubeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4129,7 +4267,7 @@ func (m *AppMetadata) Reset() { *m = AppMetadata{} } func (m *AppMetadata) String() string { return proto.CompactTextString(m) } func (*AppMetadata) ProtoMessage() {} func (*AppMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{74} + return fileDescriptor_007ba1c3d6266d56, []int{77} } func (m *AppMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4177,7 +4315,7 @@ func (m *AppCreate) Reset() { *m = AppCreate{} } func (m *AppCreate) String() string { return proto.CompactTextString(m) } func (*AppCreate) ProtoMessage() {} func (*AppCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{75} + return fileDescriptor_007ba1c3d6266d56, []int{78} } func (m *AppCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4225,7 +4363,7 @@ func (m *AppUpdate) Reset() { *m = AppUpdate{} } func (m *AppUpdate) String() string { return proto.CompactTextString(m) } func (*AppUpdate) ProtoMessage() {} func (*AppUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{76} + return fileDescriptor_007ba1c3d6266d56, []int{79} } func (m *AppUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4271,7 +4409,7 @@ func (m *AppDelete) Reset() { *m = AppDelete{} } func (m *AppDelete) String() string { return proto.CompactTextString(m) } func (*AppDelete) ProtoMessage() {} func (*AppDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{77} + return fileDescriptor_007ba1c3d6266d56, []int{80} } func (m *AppDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4326,7 +4464,7 @@ func (m *AppSessionStart) Reset() { *m = AppSessionStart{} } func (m *AppSessionStart) String() string { return proto.CompactTextString(m) } func (*AppSessionStart) ProtoMessage() {} func (*AppSessionStart) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{78} + return fileDescriptor_007ba1c3d6266d56, []int{81} } func (m *AppSessionStart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4378,7 +4516,7 @@ func (m *AppSessionEnd) Reset() { *m = AppSessionEnd{} } func (m *AppSessionEnd) String() string { return proto.CompactTextString(m) } func (*AppSessionEnd) ProtoMessage() {} func (*AppSessionEnd) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{79} + return fileDescriptor_007ba1c3d6266d56, []int{82} } func (m *AppSessionEnd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4435,7 +4573,7 @@ func (m *AppSessionChunk) Reset() { *m = AppSessionChunk{} } func (m *AppSessionChunk) String() string { return proto.CompactTextString(m) } func (*AppSessionChunk) ProtoMessage() {} func (*AppSessionChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{80} + return fileDescriptor_007ba1c3d6266d56, []int{83} } func (m *AppSessionChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4489,7 +4627,7 @@ func (m *AppSessionRequest) Reset() { *m = AppSessionRequest{} } func (m *AppSessionRequest) String() string { return proto.CompactTextString(m) } func (*AppSessionRequest) ProtoMessage() {} func (*AppSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{81} + return fileDescriptor_007ba1c3d6266d56, []int{84} } func (m *AppSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4537,7 +4675,7 @@ func (m *AWSRequestMetadata) Reset() { *m = AWSRequestMetadata{} } func (m *AWSRequestMetadata) String() string { return proto.CompactTextString(m) } func (*AWSRequestMetadata) ProtoMessage() {} func (*AWSRequestMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{82} + return fileDescriptor_007ba1c3d6266d56, []int{85} } func (m *AWSRequestMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4603,7 +4741,7 @@ func (m *DatabaseMetadata) Reset() { *m = DatabaseMetadata{} } func (m *DatabaseMetadata) String() string { return proto.CompactTextString(m) } func (*DatabaseMetadata) ProtoMessage() {} func (*DatabaseMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{83} + return fileDescriptor_007ba1c3d6266d56, []int{86} } func (m *DatabaseMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4651,7 +4789,7 @@ func (m *DatabaseCreate) Reset() { *m = DatabaseCreate{} } func (m *DatabaseCreate) String() string { return proto.CompactTextString(m) } func (*DatabaseCreate) ProtoMessage() {} func (*DatabaseCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{84} + return fileDescriptor_007ba1c3d6266d56, []int{87} } func (m *DatabaseCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4699,7 +4837,7 @@ func (m *DatabaseUpdate) Reset() { *m = DatabaseUpdate{} } func (m *DatabaseUpdate) String() string { return proto.CompactTextString(m) } func (*DatabaseUpdate) ProtoMessage() {} func (*DatabaseUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{85} + return fileDescriptor_007ba1c3d6266d56, []int{88} } func (m *DatabaseUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4745,7 +4883,7 @@ func (m *DatabaseDelete) Reset() { *m = DatabaseDelete{} } func (m *DatabaseDelete) String() string { return proto.CompactTextString(m) } func (*DatabaseDelete) ProtoMessage() {} func (*DatabaseDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{86} + return fileDescriptor_007ba1c3d6266d56, []int{89} } func (m *DatabaseDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4799,7 +4937,7 @@ func (m *DatabaseSessionStart) Reset() { *m = DatabaseSessionStart{} } func (m *DatabaseSessionStart) String() string { return proto.CompactTextString(m) } func (*DatabaseSessionStart) ProtoMessage() {} func (*DatabaseSessionStart) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{87} + return fileDescriptor_007ba1c3d6266d56, []int{90} } func (m *DatabaseSessionStart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4853,7 +4991,7 @@ func (m *DatabaseSessionQuery) Reset() { *m = DatabaseSessionQuery{} } func (m *DatabaseSessionQuery) String() string { return proto.CompactTextString(m) } func (*DatabaseSessionQuery) ProtoMessage() {} func (*DatabaseSessionQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{88} + return fileDescriptor_007ba1c3d6266d56, []int{91} } func (m *DatabaseSessionQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4906,7 +5044,7 @@ func (m *PostgresParse) Reset() { *m = PostgresParse{} } func (m *PostgresParse) String() string { return proto.CompactTextString(m) } func (*PostgresParse) ProtoMessage() {} func (*PostgresParse) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{89} + return fileDescriptor_007ba1c3d6266d56, []int{92} } func (m *PostgresParse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4961,7 +5099,7 @@ func (m *PostgresBind) Reset() { *m = PostgresBind{} } func (m *PostgresBind) String() string { return proto.CompactTextString(m) } func (*PostgresBind) ProtoMessage() {} func (*PostgresBind) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{90} + return fileDescriptor_007ba1c3d6266d56, []int{93} } func (m *PostgresBind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5012,7 +5150,7 @@ func (m *PostgresExecute) Reset() { *m = PostgresExecute{} } func (m *PostgresExecute) String() string { return proto.CompactTextString(m) } func (*PostgresExecute) ProtoMessage() {} func (*PostgresExecute) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{91} + return fileDescriptor_007ba1c3d6266d56, []int{94} } func (m *PostgresExecute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5065,7 +5203,7 @@ func (m *PostgresClose) Reset() { *m = PostgresClose{} } func (m *PostgresClose) String() string { return proto.CompactTextString(m) } func (*PostgresClose) ProtoMessage() {} func (*PostgresClose) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{92} + return fileDescriptor_007ba1c3d6266d56, []int{95} } func (m *PostgresClose) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5118,7 +5256,7 @@ func (m *PostgresFunctionCall) Reset() { *m = PostgresFunctionCall{} } func (m *PostgresFunctionCall) String() string { return proto.CompactTextString(m) } func (*PostgresFunctionCall) ProtoMessage() {} func (*PostgresFunctionCall) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{93} + return fileDescriptor_007ba1c3d6266d56, []int{96} } func (m *PostgresFunctionCall) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5183,7 +5321,7 @@ func (m *WindowsDesktopSessionStart) Reset() { *m = WindowsDesktopSessio func (m *WindowsDesktopSessionStart) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSessionStart) ProtoMessage() {} func (*WindowsDesktopSessionStart) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{94} + return fileDescriptor_007ba1c3d6266d56, []int{97} } func (m *WindowsDesktopSessionStart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5231,7 +5369,7 @@ func (m *DatabaseSessionEnd) Reset() { *m = DatabaseSessionEnd{} } func (m *DatabaseSessionEnd) String() string { return proto.CompactTextString(m) } func (*DatabaseSessionEnd) ProtoMessage() {} func (*DatabaseSessionEnd) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{95} + return fileDescriptor_007ba1c3d6266d56, []int{98} } func (m *DatabaseSessionEnd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5277,7 +5415,7 @@ func (m *MFADeviceMetadata) Reset() { *m = MFADeviceMetadata{} } func (m *MFADeviceMetadata) String() string { return proto.CompactTextString(m) } func (*MFADeviceMetadata) ProtoMessage() {} func (*MFADeviceMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{96} + return fileDescriptor_007ba1c3d6266d56, []int{99} } func (m *MFADeviceMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5323,7 +5461,7 @@ func (m *MFADeviceAdd) Reset() { *m = MFADeviceAdd{} } func (m *MFADeviceAdd) String() string { return proto.CompactTextString(m) } func (*MFADeviceAdd) ProtoMessage() {} func (*MFADeviceAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{97} + return fileDescriptor_007ba1c3d6266d56, []int{100} } func (m *MFADeviceAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5369,7 +5507,7 @@ func (m *MFADeviceDelete) Reset() { *m = MFADeviceDelete{} } func (m *MFADeviceDelete) String() string { return proto.CompactTextString(m) } func (*MFADeviceDelete) ProtoMessage() {} func (*MFADeviceDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{98} + return fileDescriptor_007ba1c3d6266d56, []int{101} } func (m *MFADeviceDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5413,7 +5551,7 @@ func (m *BillingInformationUpdate) Reset() { *m = BillingInformationUpda func (m *BillingInformationUpdate) String() string { return proto.CompactTextString(m) } func (*BillingInformationUpdate) ProtoMessage() {} func (*BillingInformationUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{99} + return fileDescriptor_007ba1c3d6266d56, []int{102} } func (m *BillingInformationUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5457,7 +5595,7 @@ func (m *BillingCardCreate) Reset() { *m = BillingCardCreate{} } func (m *BillingCardCreate) String() string { return proto.CompactTextString(m) } func (*BillingCardCreate) ProtoMessage() {} func (*BillingCardCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{100} + return fileDescriptor_007ba1c3d6266d56, []int{103} } func (m *BillingCardCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5501,7 +5639,7 @@ func (m *BillingCardDelete) Reset() { *m = BillingCardDelete{} } func (m *BillingCardDelete) String() string { return proto.CompactTextString(m) } func (*BillingCardDelete) ProtoMessage() {} func (*BillingCardDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{101} + return fileDescriptor_007ba1c3d6266d56, []int{104} } func (m *BillingCardDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5552,7 +5690,7 @@ func (m *LockCreate) Reset() { *m = LockCreate{} } func (m *LockCreate) String() string { return proto.CompactTextString(m) } func (*LockCreate) ProtoMessage() {} func (*LockCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{102} + return fileDescriptor_007ba1c3d6266d56, []int{105} } func (m *LockCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5598,7 +5736,7 @@ func (m *LockDelete) Reset() { *m = LockDelete{} } func (m *LockDelete) String() string { return proto.CompactTextString(m) } func (*LockDelete) ProtoMessage() {} func (*LockDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{103} + return fileDescriptor_007ba1c3d6266d56, []int{106} } func (m *LockDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5642,7 +5780,7 @@ func (m *RecoveryCodeGenerate) Reset() { *m = RecoveryCodeGenerate{} } func (m *RecoveryCodeGenerate) String() string { return proto.CompactTextString(m) } func (*RecoveryCodeGenerate) ProtoMessage() {} func (*RecoveryCodeGenerate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{104} + return fileDescriptor_007ba1c3d6266d56, []int{107} } func (m *RecoveryCodeGenerate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5689,7 +5827,7 @@ func (m *RecoveryCodeUsed) Reset() { *m = RecoveryCodeUsed{} } func (m *RecoveryCodeUsed) String() string { return proto.CompactTextString(m) } func (*RecoveryCodeUsed) ProtoMessage() {} func (*RecoveryCodeUsed) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{105} + return fileDescriptor_007ba1c3d6266d56, []int{108} } func (m *RecoveryCodeUsed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5755,7 +5893,7 @@ func (m *WindowsDesktopSessionEnd) Reset() { *m = WindowsDesktopSessionE func (m *WindowsDesktopSessionEnd) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSessionEnd) ProtoMessage() {} func (*WindowsDesktopSessionEnd) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{106} + return fileDescriptor_007ba1c3d6266d56, []int{109} } func (m *WindowsDesktopSessionEnd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5801,7 +5939,7 @@ func (m *CertificateCreate) Reset() { *m = CertificateCreate{} } func (m *CertificateCreate) String() string { return proto.CompactTextString(m) } func (*CertificateCreate) ProtoMessage() {} func (*CertificateCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{107} + return fileDescriptor_007ba1c3d6266d56, []int{110} } func (m *CertificateCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5849,7 +5987,7 @@ func (m *RenewableCertificateGenerationMismatch) Reset() { func (m *RenewableCertificateGenerationMismatch) String() string { return proto.CompactTextString(m) } func (*RenewableCertificateGenerationMismatch) ProtoMessage() {} func (*RenewableCertificateGenerationMismatch) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{108} + return fileDescriptor_007ba1c3d6266d56, []int{111} } func (m *RenewableCertificateGenerationMismatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5901,7 +6039,7 @@ func (m *BotJoin) Reset() { *m = BotJoin{} } func (m *BotJoin) String() string { return proto.CompactTextString(m) } func (*BotJoin) ProtoMessage() {} func (*BotJoin) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{109} + return fileDescriptor_007ba1c3d6266d56, []int{112} } func (m *BotJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5961,7 +6099,7 @@ func (m *InstanceJoin) Reset() { *m = InstanceJoin{} } func (m *InstanceJoin) String() string { return proto.CompactTextString(m) } func (*InstanceJoin) ProtoMessage() {} func (*InstanceJoin) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{110} + return fileDescriptor_007ba1c3d6266d56, []int{113} } func (m *InstanceJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6009,7 +6147,7 @@ func (m *Unknown) Reset() { *m = Unknown{} } func (m *Unknown) String() string { return proto.CompactTextString(m) } func (*Unknown) ProtoMessage() {} func (*Unknown) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{111} + return fileDescriptor_007ba1c3d6266d56, []int{114} } func (m *Unknown) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6059,7 +6197,7 @@ func (m *DeviceMetadata) Reset() { *m = DeviceMetadata{} } func (m *DeviceMetadata) String() string { return proto.CompactTextString(m) } func (*DeviceMetadata) ProtoMessage() {} func (*DeviceMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{112} + return fileDescriptor_007ba1c3d6266d56, []int{115} } func (m *DeviceMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6110,7 +6248,7 @@ func (m *DeviceEvent) Reset() { *m = DeviceEvent{} } func (m *DeviceEvent) String() string { return proto.CompactTextString(m) } func (*DeviceEvent) ProtoMessage() {} func (*DeviceEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{113} + return fileDescriptor_007ba1c3d6266d56, []int{116} } func (m *DeviceEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6162,7 +6300,7 @@ func (m *DeviceEvent2) Reset() { *m = DeviceEvent2{} } func (m *DeviceEvent2) String() string { return proto.CompactTextString(m) } func (*DeviceEvent2) ProtoMessage() {} func (*DeviceEvent2) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{114} + return fileDescriptor_007ba1c3d6266d56, []int{117} } func (m *DeviceEvent2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6337,6 +6475,9 @@ type OneOf struct { // *OneOf_UserUpdate // *OneOf_ExternalAuditStorageEnable // *OneOf_ExternalAuditStorageDisable + // *OneOf_BotCreate + // *OneOf_BotDelete + // *OneOf_BotUpdate Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -6347,7 +6488,7 @@ func (m *OneOf) Reset() { *m = OneOf{} } func (m *OneOf) String() string { return proto.CompactTextString(m) } func (*OneOf) ProtoMessage() {} func (*OneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{115} + return fileDescriptor_007ba1c3d6266d56, []int{118} } func (m *OneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6805,6 +6946,15 @@ type OneOf_ExternalAuditStorageEnable struct { type OneOf_ExternalAuditStorageDisable struct { ExternalAuditStorageDisable *ExternalAuditStorageDisable `protobuf:"bytes,142,opt,name=ExternalAuditStorageDisable,proto3,oneof" json:"ExternalAuditStorageDisable,omitempty"` } +type OneOf_BotCreate struct { + BotCreate *BotCreate `protobuf:"bytes,143,opt,name=BotCreate,proto3,oneof" json:"BotCreate,omitempty"` +} +type OneOf_BotDelete struct { + BotDelete *BotDelete `protobuf:"bytes,144,opt,name=BotDelete,proto3,oneof" json:"BotDelete,omitempty"` +} +type OneOf_BotUpdate struct { + BotUpdate *BotUpdate `protobuf:"bytes,145,opt,name=BotUpdate,proto3,oneof" json:"BotUpdate,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -6947,6 +7097,9 @@ func (*OneOf_RoleUpdate) isOneOf_Event() {} func (*OneOf_UserUpdate) isOneOf_Event() {} func (*OneOf_ExternalAuditStorageEnable) isOneOf_Event() {} func (*OneOf_ExternalAuditStorageDisable) isOneOf_Event() {} +func (*OneOf_BotCreate) isOneOf_Event() {} +func (*OneOf_BotDelete) isOneOf_Event() {} +func (*OneOf_BotUpdate) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -7942,6 +8095,27 @@ func (m *OneOf) GetExternalAuditStorageDisable() *ExternalAuditStorageDisable { return nil } +func (m *OneOf) GetBotCreate() *BotCreate { + if x, ok := m.GetEvent().(*OneOf_BotCreate); ok { + return x.BotCreate + } + return nil +} + +func (m *OneOf) GetBotDelete() *BotDelete { + if x, ok := m.GetEvent().(*OneOf_BotDelete); ok { + return x.BotDelete + } + return nil +} + +func (m *OneOf) GetBotUpdate() *BotUpdate { + if x, ok := m.GetEvent().(*OneOf_BotUpdate); ok { + return x.BotUpdate + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -8086,6 +8260,9 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_UserUpdate)(nil), (*OneOf_ExternalAuditStorageEnable)(nil), (*OneOf_ExternalAuditStorageDisable)(nil), + (*OneOf_BotCreate)(nil), + (*OneOf_BotDelete)(nil), + (*OneOf_BotUpdate)(nil), } } @@ -8106,7 +8283,7 @@ func (m *StreamStatus) Reset() { *m = StreamStatus{} } func (m *StreamStatus) String() string { return proto.CompactTextString(m) } func (*StreamStatus) ProtoMessage() {} func (*StreamStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{116} + return fileDescriptor_007ba1c3d6266d56, []int{119} } func (m *StreamStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8152,7 +8329,7 @@ func (m *SessionUpload) Reset() { *m = SessionUpload{} } func (m *SessionUpload) String() string { return proto.CompactTextString(m) } func (*SessionUpload) ProtoMessage() {} func (*SessionUpload) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{117} + return fileDescriptor_007ba1c3d6266d56, []int{120} } func (m *SessionUpload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8262,7 +8439,7 @@ func (m *Identity) Reset() { *m = Identity{} } func (m *Identity) String() string { return proto.CompactTextString(m) } func (*Identity) ProtoMessage() {} func (*Identity) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{118} + return fileDescriptor_007ba1c3d6266d56, []int{121} } func (m *Identity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8316,7 +8493,7 @@ func (m *RouteToApp) Reset() { *m = RouteToApp{} } func (m *RouteToApp) String() string { return proto.CompactTextString(m) } func (*RouteToApp) ProtoMessage() {} func (*RouteToApp) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{119} + return fileDescriptor_007ba1c3d6266d56, []int{122} } func (m *RouteToApp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8364,7 +8541,7 @@ func (m *RouteToDatabase) Reset() { *m = RouteToDatabase{} } func (m *RouteToDatabase) String() string { return proto.CompactTextString(m) } func (*RouteToDatabase) ProtoMessage() {} func (*RouteToDatabase) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{120} + return fileDescriptor_007ba1c3d6266d56, []int{123} } func (m *RouteToDatabase) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8421,7 +8598,7 @@ func (m *AccessRequestResourceSearch) Reset() { *m = AccessRequestResour func (m *AccessRequestResourceSearch) String() string { return proto.CompactTextString(m) } func (*AccessRequestResourceSearch) ProtoMessage() {} func (*AccessRequestResourceSearch) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{121} + return fileDescriptor_007ba1c3d6266d56, []int{124} } func (m *AccessRequestResourceSearch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8472,7 +8649,7 @@ func (m *MySQLStatementPrepare) Reset() { *m = MySQLStatementPrepare{} } func (m *MySQLStatementPrepare) String() string { return proto.CompactTextString(m) } func (*MySQLStatementPrepare) ProtoMessage() {} func (*MySQLStatementPrepare) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{122} + return fileDescriptor_007ba1c3d6266d56, []int{125} } func (m *MySQLStatementPrepare) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8525,7 +8702,7 @@ func (m *MySQLStatementExecute) Reset() { *m = MySQLStatementExecute{} } func (m *MySQLStatementExecute) String() string { return proto.CompactTextString(m) } func (*MySQLStatementExecute) ProtoMessage() {} func (*MySQLStatementExecute) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{123} + return fileDescriptor_007ba1c3d6266d56, []int{126} } func (m *MySQLStatementExecute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8580,7 +8757,7 @@ func (m *MySQLStatementSendLongData) Reset() { *m = MySQLStatementSendLo func (m *MySQLStatementSendLongData) String() string { return proto.CompactTextString(m) } func (*MySQLStatementSendLongData) ProtoMessage() {} func (*MySQLStatementSendLongData) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{124} + return fileDescriptor_007ba1c3d6266d56, []int{127} } func (m *MySQLStatementSendLongData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8631,7 +8808,7 @@ func (m *MySQLStatementClose) Reset() { *m = MySQLStatementClose{} } func (m *MySQLStatementClose) String() string { return proto.CompactTextString(m) } func (*MySQLStatementClose) ProtoMessage() {} func (*MySQLStatementClose) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{125} + return fileDescriptor_007ba1c3d6266d56, []int{128} } func (m *MySQLStatementClose) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8682,7 +8859,7 @@ func (m *MySQLStatementReset) Reset() { *m = MySQLStatementReset{} } func (m *MySQLStatementReset) String() string { return proto.CompactTextString(m) } func (*MySQLStatementReset) ProtoMessage() {} func (*MySQLStatementReset) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{126} + return fileDescriptor_007ba1c3d6266d56, []int{129} } func (m *MySQLStatementReset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8735,7 +8912,7 @@ func (m *MySQLStatementFetch) Reset() { *m = MySQLStatementFetch{} } func (m *MySQLStatementFetch) String() string { return proto.CompactTextString(m) } func (*MySQLStatementFetch) ProtoMessage() {} func (*MySQLStatementFetch) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{127} + return fileDescriptor_007ba1c3d6266d56, []int{130} } func (m *MySQLStatementFetch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8788,7 +8965,7 @@ func (m *MySQLStatementBulkExecute) Reset() { *m = MySQLStatementBulkExe func (m *MySQLStatementBulkExecute) String() string { return proto.CompactTextString(m) } func (*MySQLStatementBulkExecute) ProtoMessage() {} func (*MySQLStatementBulkExecute) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{128} + return fileDescriptor_007ba1c3d6266d56, []int{131} } func (m *MySQLStatementBulkExecute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8839,7 +9016,7 @@ func (m *MySQLInitDB) Reset() { *m = MySQLInitDB{} } func (m *MySQLInitDB) String() string { return proto.CompactTextString(m) } func (*MySQLInitDB) ProtoMessage() {} func (*MySQLInitDB) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{129} + return fileDescriptor_007ba1c3d6266d56, []int{132} } func (m *MySQLInitDB) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8889,7 +9066,7 @@ func (m *MySQLCreateDB) Reset() { *m = MySQLCreateDB{} } func (m *MySQLCreateDB) String() string { return proto.CompactTextString(m) } func (*MySQLCreateDB) ProtoMessage() {} func (*MySQLCreateDB) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{130} + return fileDescriptor_007ba1c3d6266d56, []int{133} } func (m *MySQLCreateDB) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8939,7 +9116,7 @@ func (m *MySQLDropDB) Reset() { *m = MySQLDropDB{} } func (m *MySQLDropDB) String() string { return proto.CompactTextString(m) } func (*MySQLDropDB) ProtoMessage() {} func (*MySQLDropDB) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{131} + return fileDescriptor_007ba1c3d6266d56, []int{134} } func (m *MySQLDropDB) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8987,7 +9164,7 @@ func (m *MySQLShutDown) Reset() { *m = MySQLShutDown{} } func (m *MySQLShutDown) String() string { return proto.CompactTextString(m) } func (*MySQLShutDown) ProtoMessage() {} func (*MySQLShutDown) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{132} + return fileDescriptor_007ba1c3d6266d56, []int{135} } func (m *MySQLShutDown) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9038,7 +9215,7 @@ func (m *MySQLProcessKill) Reset() { *m = MySQLProcessKill{} } func (m *MySQLProcessKill) String() string { return proto.CompactTextString(m) } func (*MySQLProcessKill) ProtoMessage() {} func (*MySQLProcessKill) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{133} + return fileDescriptor_007ba1c3d6266d56, []int{136} } func (m *MySQLProcessKill) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9087,7 +9264,7 @@ func (m *MySQLDebug) Reset() { *m = MySQLDebug{} } func (m *MySQLDebug) String() string { return proto.CompactTextString(m) } func (*MySQLDebug) ProtoMessage() {} func (*MySQLDebug) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{134} + return fileDescriptor_007ba1c3d6266d56, []int{137} } func (m *MySQLDebug) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9137,7 +9314,7 @@ func (m *MySQLRefresh) Reset() { *m = MySQLRefresh{} } func (m *MySQLRefresh) String() string { return proto.CompactTextString(m) } func (*MySQLRefresh) ProtoMessage() {} func (*MySQLRefresh) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{135} + return fileDescriptor_007ba1c3d6266d56, []int{138} } func (m *MySQLRefresh) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9189,7 +9366,7 @@ func (m *SQLServerRPCRequest) Reset() { *m = SQLServerRPCRequest{} } func (m *SQLServerRPCRequest) String() string { return proto.CompactTextString(m) } func (*SQLServerRPCRequest) ProtoMessage() {} func (*SQLServerRPCRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{136} + return fileDescriptor_007ba1c3d6266d56, []int{139} } func (m *SQLServerRPCRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9239,7 +9416,7 @@ func (m *DatabaseSessionMalformedPacket) Reset() { *m = DatabaseSessionM func (m *DatabaseSessionMalformedPacket) String() string { return proto.CompactTextString(m) } func (*DatabaseSessionMalformedPacket) ProtoMessage() {} func (*DatabaseSessionMalformedPacket) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{137} + return fileDescriptor_007ba1c3d6266d56, []int{140} } func (m *DatabaseSessionMalformedPacket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9306,7 +9483,7 @@ func (m *ElasticsearchRequest) Reset() { *m = ElasticsearchRequest{} } func (m *ElasticsearchRequest) String() string { return proto.CompactTextString(m) } func (*ElasticsearchRequest) ProtoMessage() {} func (*ElasticsearchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{138} + return fileDescriptor_007ba1c3d6266d56, []int{141} } func (m *ElasticsearchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9372,7 +9549,7 @@ func (m *OpenSearchRequest) Reset() { *m = OpenSearchRequest{} } func (m *OpenSearchRequest) String() string { return proto.CompactTextString(m) } func (*OpenSearchRequest) ProtoMessage() {} func (*OpenSearchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{139} + return fileDescriptor_007ba1c3d6266d56, []int{142} } func (m *OpenSearchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9432,7 +9609,7 @@ func (m *DynamoDBRequest) Reset() { *m = DynamoDBRequest{} } func (m *DynamoDBRequest) String() string { return proto.CompactTextString(m) } func (*DynamoDBRequest) ProtoMessage() {} func (*DynamoDBRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{140} + return fileDescriptor_007ba1c3d6266d56, []int{143} } func (m *DynamoDBRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9498,7 +9675,7 @@ func (m *AppSessionDynamoDBRequest) Reset() { *m = AppSessionDynamoDBReq func (m *AppSessionDynamoDBRequest) String() string { return proto.CompactTextString(m) } func (*AppSessionDynamoDBRequest) ProtoMessage() {} func (*AppSessionDynamoDBRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{141} + return fileDescriptor_007ba1c3d6266d56, []int{144} } func (m *AppSessionDynamoDBRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9540,7 +9717,7 @@ func (m *UpgradeWindowStartMetadata) Reset() { *m = UpgradeWindowStartMe func (m *UpgradeWindowStartMetadata) String() string { return proto.CompactTextString(m) } func (*UpgradeWindowStartMetadata) ProtoMessage() {} func (*UpgradeWindowStartMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{142} + return fileDescriptor_007ba1c3d6266d56, []int{145} } func (m *UpgradeWindowStartMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9588,7 +9765,7 @@ func (m *UpgradeWindowStartUpdate) Reset() { *m = UpgradeWindowStartUpda func (m *UpgradeWindowStartUpdate) String() string { return proto.CompactTextString(m) } func (*UpgradeWindowStartUpdate) ProtoMessage() {} func (*UpgradeWindowStartUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{143} + return fileDescriptor_007ba1c3d6266d56, []int{146} } func (m *UpgradeWindowStartUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9635,7 +9812,7 @@ func (m *SessionRecordingAccess) Reset() { *m = SessionRecordingAccess{} func (m *SessionRecordingAccess) String() string { return proto.CompactTextString(m) } func (*SessionRecordingAccess) ProtoMessage() {} func (*SessionRecordingAccess) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{144} + return fileDescriptor_007ba1c3d6266d56, []int{147} } func (m *SessionRecordingAccess) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9677,7 +9854,7 @@ func (m *KubeClusterMetadata) Reset() { *m = KubeClusterMetadata{} } func (m *KubeClusterMetadata) String() string { return proto.CompactTextString(m) } func (*KubeClusterMetadata) ProtoMessage() {} func (*KubeClusterMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{145} + return fileDescriptor_007ba1c3d6266d56, []int{148} } func (m *KubeClusterMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9725,7 +9902,7 @@ func (m *KubernetesClusterCreate) Reset() { *m = KubernetesClusterCreate func (m *KubernetesClusterCreate) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterCreate) ProtoMessage() {} func (*KubernetesClusterCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{146} + return fileDescriptor_007ba1c3d6266d56, []int{149} } func (m *KubernetesClusterCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9773,7 +9950,7 @@ func (m *KubernetesClusterUpdate) Reset() { *m = KubernetesClusterUpdate func (m *KubernetesClusterUpdate) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterUpdate) ProtoMessage() {} func (*KubernetesClusterUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{147} + return fileDescriptor_007ba1c3d6266d56, []int{150} } func (m *KubernetesClusterUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9819,7 +9996,7 @@ func (m *KubernetesClusterDelete) Reset() { *m = KubernetesClusterDelete func (m *KubernetesClusterDelete) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterDelete) ProtoMessage() {} func (*KubernetesClusterDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{148} + return fileDescriptor_007ba1c3d6266d56, []int{151} } func (m *KubernetesClusterDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9873,7 +10050,7 @@ func (m *SSMRun) Reset() { *m = SSMRun{} } func (m *SSMRun) String() string { return proto.CompactTextString(m) } func (*SSMRun) ProtoMessage() {} func (*SSMRun) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{149} + return fileDescriptor_007ba1c3d6266d56, []int{152} } func (m *SSMRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9926,7 +10103,7 @@ func (m *CassandraPrepare) Reset() { *m = CassandraPrepare{} } func (m *CassandraPrepare) String() string { return proto.CompactTextString(m) } func (*CassandraPrepare) ProtoMessage() {} func (*CassandraPrepare) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{150} + return fileDescriptor_007ba1c3d6266d56, []int{153} } func (m *CassandraPrepare) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9976,7 +10153,7 @@ func (m *CassandraExecute) Reset() { *m = CassandraExecute{} } func (m *CassandraExecute) String() string { return proto.CompactTextString(m) } func (*CassandraExecute) ProtoMessage() {} func (*CassandraExecute) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{151} + return fileDescriptor_007ba1c3d6266d56, []int{154} } func (m *CassandraExecute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10032,7 +10209,7 @@ func (m *CassandraBatch) Reset() { *m = CassandraBatch{} } func (m *CassandraBatch) String() string { return proto.CompactTextString(m) } func (*CassandraBatch) ProtoMessage() {} func (*CassandraBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{152} + return fileDescriptor_007ba1c3d6266d56, []int{155} } func (m *CassandraBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10078,7 +10255,7 @@ func (m *CassandraBatch_BatchChild) Reset() { *m = CassandraBatch_BatchC func (m *CassandraBatch_BatchChild) String() string { return proto.CompactTextString(m) } func (*CassandraBatch_BatchChild) ProtoMessage() {} func (*CassandraBatch_BatchChild) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{152, 0} + return fileDescriptor_007ba1c3d6266d56, []int{155, 0} } func (m *CassandraBatch_BatchChild) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10122,7 +10299,7 @@ func (m *CassandraBatch_BatchChild_Value) Reset() { *m = CassandraBatch_ func (m *CassandraBatch_BatchChild_Value) String() string { return proto.CompactTextString(m) } func (*CassandraBatch_BatchChild_Value) ProtoMessage() {} func (*CassandraBatch_BatchChild_Value) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{152, 0, 0} + return fileDescriptor_007ba1c3d6266d56, []int{155, 0, 0} } func (m *CassandraBatch_BatchChild_Value) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10173,7 +10350,7 @@ func (m *CassandraRegister) Reset() { *m = CassandraRegister{} } func (m *CassandraRegister) String() string { return proto.CompactTextString(m) } func (*CassandraRegister) ProtoMessage() {} func (*CassandraRegister) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{153} + return fileDescriptor_007ba1c3d6266d56, []int{156} } func (m *CassandraRegister) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10219,7 +10396,7 @@ func (m *LoginRuleCreate) Reset() { *m = LoginRuleCreate{} } func (m *LoginRuleCreate) String() string { return proto.CompactTextString(m) } func (*LoginRuleCreate) ProtoMessage() {} func (*LoginRuleCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{154} + return fileDescriptor_007ba1c3d6266d56, []int{157} } func (m *LoginRuleCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10265,7 +10442,7 @@ func (m *LoginRuleDelete) Reset() { *m = LoginRuleDelete{} } func (m *LoginRuleDelete) String() string { return proto.CompactTextString(m) } func (*LoginRuleDelete) ProtoMessage() {} func (*LoginRuleDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{155} + return fileDescriptor_007ba1c3d6266d56, []int{158} } func (m *LoginRuleDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10315,7 +10492,7 @@ func (m *SAMLIdPAuthAttempt) Reset() { *m = SAMLIdPAuthAttempt{} } func (m *SAMLIdPAuthAttempt) String() string { return proto.CompactTextString(m) } func (*SAMLIdPAuthAttempt) ProtoMessage() {} func (*SAMLIdPAuthAttempt) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{156} + return fileDescriptor_007ba1c3d6266d56, []int{159} } func (m *SAMLIdPAuthAttempt) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10361,7 +10538,7 @@ func (m *SAMLIdPServiceProviderCreate) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderCreate) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderCreate) ProtoMessage() {} func (*SAMLIdPServiceProviderCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{157} + return fileDescriptor_007ba1c3d6266d56, []int{160} } func (m *SAMLIdPServiceProviderCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10407,7 +10584,7 @@ func (m *SAMLIdPServiceProviderUpdate) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderUpdate) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderUpdate) ProtoMessage() {} func (*SAMLIdPServiceProviderUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{158} + return fileDescriptor_007ba1c3d6266d56, []int{161} } func (m *SAMLIdPServiceProviderUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10453,7 +10630,7 @@ func (m *SAMLIdPServiceProviderDelete) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderDelete) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderDelete) ProtoMessage() {} func (*SAMLIdPServiceProviderDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{159} + return fileDescriptor_007ba1c3d6266d56, []int{162} } func (m *SAMLIdPServiceProviderDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10497,7 +10674,7 @@ func (m *SAMLIdPServiceProviderDeleteAll) Reset() { *m = SAMLIdPServiceP func (m *SAMLIdPServiceProviderDeleteAll) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderDeleteAll) ProtoMessage() {} func (*SAMLIdPServiceProviderDeleteAll) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{160} + return fileDescriptor_007ba1c3d6266d56, []int{163} } func (m *SAMLIdPServiceProviderDeleteAll) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10543,7 +10720,7 @@ func (m *OktaResourcesUpdate) Reset() { *m = OktaResourcesUpdate{} } func (m *OktaResourcesUpdate) String() string { return proto.CompactTextString(m) } func (*OktaResourcesUpdate) ProtoMessage() {} func (*OktaResourcesUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{161} + return fileDescriptor_007ba1c3d6266d56, []int{164} } func (m *OktaResourcesUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10589,7 +10766,7 @@ func (m *OktaSyncFailure) Reset() { *m = OktaSyncFailure{} } func (m *OktaSyncFailure) String() string { return proto.CompactTextString(m) } func (*OktaSyncFailure) ProtoMessage() {} func (*OktaSyncFailure) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{162} + return fileDescriptor_007ba1c3d6266d56, []int{165} } func (m *OktaSyncFailure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10639,7 +10816,7 @@ func (m *OktaAssignmentResult) Reset() { *m = OktaAssignmentResult{} } func (m *OktaAssignmentResult) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentResult) ProtoMessage() {} func (*OktaAssignmentResult) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{163} + return fileDescriptor_007ba1c3d6266d56, []int{166} } func (m *OktaAssignmentResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10685,7 +10862,7 @@ func (m *AccessListCreate) Reset() { *m = AccessListCreate{} } func (m *AccessListCreate) String() string { return proto.CompactTextString(m) } func (*AccessListCreate) ProtoMessage() {} func (*AccessListCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{164} + return fileDescriptor_007ba1c3d6266d56, []int{167} } func (m *AccessListCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10731,7 +10908,7 @@ func (m *AccessListUpdate) Reset() { *m = AccessListUpdate{} } func (m *AccessListUpdate) String() string { return proto.CompactTextString(m) } func (*AccessListUpdate) ProtoMessage() {} func (*AccessListUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{165} + return fileDescriptor_007ba1c3d6266d56, []int{168} } func (m *AccessListUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10777,7 +10954,7 @@ func (m *AccessListDelete) Reset() { *m = AccessListDelete{} } func (m *AccessListDelete) String() string { return proto.CompactTextString(m) } func (*AccessListDelete) ProtoMessage() {} func (*AccessListDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{166} + return fileDescriptor_007ba1c3d6266d56, []int{169} } func (m *AccessListDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10825,7 +11002,7 @@ func (m *AccessListMemberCreate) Reset() { *m = AccessListMemberCreate{} func (m *AccessListMemberCreate) String() string { return proto.CompactTextString(m) } func (*AccessListMemberCreate) ProtoMessage() {} func (*AccessListMemberCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{167} + return fileDescriptor_007ba1c3d6266d56, []int{170} } func (m *AccessListMemberCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10873,7 +11050,7 @@ func (m *AccessListMemberUpdate) Reset() { *m = AccessListMemberUpdate{} func (m *AccessListMemberUpdate) String() string { return proto.CompactTextString(m) } func (*AccessListMemberUpdate) ProtoMessage() {} func (*AccessListMemberUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{168} + return fileDescriptor_007ba1c3d6266d56, []int{171} } func (m *AccessListMemberUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10921,7 +11098,7 @@ func (m *AccessListMemberDelete) Reset() { *m = AccessListMemberDelete{} func (m *AccessListMemberDelete) String() string { return proto.CompactTextString(m) } func (*AccessListMemberDelete) ProtoMessage() {} func (*AccessListMemberDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{169} + return fileDescriptor_007ba1c3d6266d56, []int{172} } func (m *AccessListMemberDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10971,7 +11148,7 @@ func (m *AccessListMemberDeleteAllForAccessList) Reset() { func (m *AccessListMemberDeleteAllForAccessList) String() string { return proto.CompactTextString(m) } func (*AccessListMemberDeleteAllForAccessList) ProtoMessage() {} func (*AccessListMemberDeleteAllForAccessList) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{170} + return fileDescriptor_007ba1c3d6266d56, []int{173} } func (m *AccessListMemberDeleteAllForAccessList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11019,7 +11196,7 @@ func (m *AccessListReview) Reset() { *m = AccessListReview{} } func (m *AccessListReview) String() string { return proto.CompactTextString(m) } func (*AccessListReview) ProtoMessage() {} func (*AccessListReview) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{171} + return fileDescriptor_007ba1c3d6266d56, []int{174} } func (m *AccessListReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11067,7 +11244,7 @@ func (m *AuditQueryRun) Reset() { *m = AuditQueryRun{} } func (m *AuditQueryRun) String() string { return proto.CompactTextString(m) } func (*AuditQueryRun) ProtoMessage() {} func (*AuditQueryRun) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{172} + return fileDescriptor_007ba1c3d6266d56, []int{175} } func (m *AuditQueryRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11117,7 +11294,7 @@ func (m *AuditQueryDetails) Reset() { *m = AuditQueryDetails{} } func (m *AuditQueryDetails) String() string { return proto.CompactTextString(m) } func (*AuditQueryDetails) ProtoMessage() {} func (*AuditQueryDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{173} + return fileDescriptor_007ba1c3d6266d56, []int{176} } func (m *AuditQueryDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11173,7 +11350,7 @@ func (m *SecurityReportRun) Reset() { *m = SecurityReportRun{} } func (m *SecurityReportRun) String() string { return proto.CompactTextString(m) } func (*SecurityReportRun) ProtoMessage() {} func (*SecurityReportRun) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{174} + return fileDescriptor_007ba1c3d6266d56, []int{177} } func (m *SecurityReportRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11221,7 +11398,7 @@ func (m *ExternalAuditStorageEnable) Reset() { *m = ExternalAuditStorage func (m *ExternalAuditStorageEnable) String() string { return proto.CompactTextString(m) } func (*ExternalAuditStorageEnable) ProtoMessage() {} func (*ExternalAuditStorageEnable) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{175} + return fileDescriptor_007ba1c3d6266d56, []int{178} } func (m *ExternalAuditStorageEnable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11269,7 +11446,7 @@ func (m *ExternalAuditStorageDisable) Reset() { *m = ExternalAuditStorag func (m *ExternalAuditStorageDisable) String() string { return proto.CompactTextString(m) } func (*ExternalAuditStorageDisable) ProtoMessage() {} func (*ExternalAuditStorageDisable) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{176} + return fileDescriptor_007ba1c3d6266d56, []int{179} } func (m *ExternalAuditStorageDisable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11330,7 +11507,7 @@ func (m *ExternalAuditStorageDetails) Reset() { *m = ExternalAuditStorag func (m *ExternalAuditStorageDetails) String() string { return proto.CompactTextString(m) } func (*ExternalAuditStorageDetails) ProtoMessage() {} func (*ExternalAuditStorageDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{177} + return fileDescriptor_007ba1c3d6266d56, []int{180} } func (m *ExternalAuditStorageDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11430,6 +11607,9 @@ func init() { proto.RegisterType((*RoleCreate)(nil), "events.RoleCreate") proto.RegisterType((*RoleUpdate)(nil), "events.RoleUpdate") proto.RegisterType((*RoleDelete)(nil), "events.RoleDelete") + proto.RegisterType((*BotCreate)(nil), "events.BotCreate") + proto.RegisterType((*BotUpdate)(nil), "events.BotUpdate") + proto.RegisterType((*BotDelete)(nil), "events.BotDelete") proto.RegisterType((*TrustedClusterCreate)(nil), "events.TrustedClusterCreate") proto.RegisterType((*TrustedClusterDelete)(nil), "events.TrustedClusterDelete") proto.RegisterType((*ProvisionTokenCreate)(nil), "events.ProvisionTokenCreate") @@ -11563,825 +11743,831 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 13076 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0x47, - 0x76, 0x18, 0xe7, 0x83, 0xc3, 0x61, 0xf1, 0x6b, 0xb6, 0xf6, 0xab, 0x45, 0xed, 0xee, 0x48, 0xad, - 0xbb, 0xd5, 0xae, 0x6e, 0xc5, 0x3d, 0xad, 0x56, 0xd2, 0x49, 0x27, 0x9d, 0x34, 0x9c, 0x19, 0x2e, - 0x47, 0xcb, 0x8f, 0x51, 0x0f, 0x57, 0x7b, 0xba, 0xf3, 0x69, 0xdc, 0x9c, 0xae, 0x25, 0x5b, 0x9c, - 0xe9, 0x9e, 0xeb, 0xee, 0x59, 0x2e, 0x95, 0x2f, 0x5f, 0xe2, 0x8f, 0xb3, 0x73, 0x36, 0x0c, 0x07, - 0x81, 0x83, 0xc4, 0x40, 0xec, 0x04, 0x01, 0x1c, 0xc3, 0xb1, 0xe3, 0x24, 0xb0, 0xe3, 0x38, 0x46, - 0xe2, 0xdc, 0x25, 0x91, 0x73, 0xb1, 0x63, 0x27, 0x81, 0x03, 0xe4, 0x83, 0xe7, 0x38, 0x70, 0x02, - 0x10, 0x09, 0x60, 0x20, 0x46, 0x72, 0x71, 0x9c, 0x0f, 0xd4, 0xab, 0xea, 0xee, 0xaa, 0xee, 0x9e, - 0xe1, 0xd7, 0xca, 0x14, 0xb5, 0xfc, 0xb3, 0xcb, 0x79, 0xef, 0xd5, 0xab, 0xea, 0x57, 0xaf, 0xaa, - 0x5e, 0x55, 0xbd, 0x7a, 0x0f, 0x5d, 0xf5, 0x48, 0x9b, 0x74, 0x6d, 0xc7, 0xbb, 0xde, 0x26, 0x6b, - 0x7a, 0x6b, 0xeb, 0xba, 0xb7, 0xd5, 0x25, 0xee, 0x75, 0x72, 0x9f, 0x58, 0x9e, 0xff, 0xdf, 0x4c, - 0xd7, 0xb1, 0x3d, 0x1b, 0xe7, 0xd8, 0xaf, 0xe9, 0x33, 0x6b, 0xf6, 0x9a, 0x0d, 0xa0, 0xeb, 0xf4, - 0x2f, 0x86, 0x9d, 0xbe, 0xb0, 0x66, 0xdb, 0x6b, 0x6d, 0x72, 0x1d, 0x7e, 0xad, 0xf6, 0xee, 0x5d, - 0x77, 0x3d, 0xa7, 0xd7, 0xf2, 0x38, 0xb6, 0x18, 0xc5, 0x7a, 0x66, 0x87, 0xb8, 0x9e, 0xde, 0xe9, - 0x72, 0x82, 0x4b, 0x51, 0x82, 0x4d, 0x47, 0xef, 0x76, 0x89, 0xc3, 0x2b, 0x9f, 0x7e, 0x32, 0xb9, - 0x9d, 0xf0, 0x2f, 0x27, 0x79, 0x36, 0x99, 0xc4, 0x67, 0x14, 0xe1, 0xa8, 0xfe, 0x48, 0x1a, 0xe5, - 0x17, 0x89, 0xa7, 0x1b, 0xba, 0xa7, 0xe3, 0x0b, 0x68, 0xb8, 0x66, 0x19, 0xe4, 0x81, 0x92, 0x7a, - 0x22, 0x75, 0x25, 0x33, 0x9b, 0xdb, 0xd9, 0x2e, 0xa6, 0x89, 0xa9, 0x31, 0x20, 0xbe, 0x88, 0xb2, - 0x2b, 0x5b, 0x5d, 0xa2, 0xa4, 0x9f, 0x48, 0x5d, 0x19, 0x9d, 0x1d, 0xdd, 0xd9, 0x2e, 0x0e, 0x83, - 0x2c, 0x34, 0x00, 0xe3, 0x27, 0x51, 0xba, 0x56, 0x51, 0x32, 0x80, 0x3c, 0xb5, 0xb3, 0x5d, 0x9c, - 0xe8, 0x99, 0xc6, 0x35, 0xbb, 0x63, 0x7a, 0xa4, 0xd3, 0xf5, 0xb6, 0xb4, 0x74, 0xad, 0x82, 0x2f, - 0xa3, 0x6c, 0xd9, 0x36, 0x88, 0x92, 0x05, 0x22, 0xbc, 0xb3, 0x5d, 0x9c, 0x6c, 0xd9, 0x06, 0x11, - 0xa8, 0x00, 0x8f, 0xdf, 0x40, 0xd9, 0x15, 0xb3, 0x43, 0x94, 0xe1, 0x27, 0x52, 0x57, 0xc6, 0x6e, - 0x4c, 0xcf, 0x30, 0xa9, 0xcc, 0xf8, 0x52, 0x99, 0x59, 0xf1, 0xc5, 0x36, 0x5b, 0xf8, 0x60, 0xbb, - 0x38, 0xb4, 0xb3, 0x5d, 0xcc, 0x52, 0x49, 0xfe, 0xf0, 0xb7, 0x8a, 0x29, 0x0d, 0x4a, 0xe2, 0x57, - 0xd1, 0x58, 0xb9, 0xdd, 0x73, 0x3d, 0xe2, 0x2c, 0xe9, 0x1d, 0xa2, 0xe4, 0xa0, 0xc2, 0xe9, 0x9d, - 0xed, 0xe2, 0xb9, 0x16, 0x03, 0x37, 0x2d, 0xbd, 0x23, 0x56, 0x2c, 0x92, 0xab, 0x7f, 0x37, 0x85, - 0xa6, 0x1a, 0xc4, 0x75, 0x4d, 0xdb, 0x0a, 0x64, 0xf3, 0x49, 0x34, 0xca, 0x41, 0xb5, 0x0a, 0xc8, - 0x67, 0x74, 0x76, 0x64, 0x67, 0xbb, 0x98, 0x71, 0x4d, 0x43, 0x0b, 0x31, 0xf8, 0xd3, 0x68, 0xe4, - 0xae, 0xe9, 0xad, 0x2f, 0xce, 0x95, 0xb8, 0x9c, 0xce, 0xed, 0x6c, 0x17, 0xf1, 0xa6, 0xe9, 0xad, - 0x37, 0x3b, 0xf7, 0x74, 0xa1, 0x42, 0x9f, 0x0c, 0x2f, 0xa0, 0x42, 0xdd, 0x31, 0xef, 0xeb, 0x1e, - 0xb9, 0x4d, 0xb6, 0xea, 0x76, 0xdb, 0x6c, 0x6d, 0x71, 0x29, 0x3e, 0xb1, 0xb3, 0x5d, 0xbc, 0xd0, - 0x65, 0xb8, 0xe6, 0x06, 0xd9, 0x6a, 0x76, 0x01, 0x2b, 0x30, 0x89, 0x95, 0x54, 0xff, 0x30, 0x8b, - 0xc6, 0xef, 0xb8, 0xc4, 0x09, 0xda, 0x7d, 0x19, 0x65, 0xe9, 0x6f, 0xde, 0x64, 0x90, 0x79, 0xcf, - 0x25, 0x8e, 0x28, 0x73, 0x8a, 0xc7, 0x57, 0xd1, 0xf0, 0x82, 0xbd, 0x66, 0x5a, 0xbc, 0xd9, 0xa7, - 0x77, 0xb6, 0x8b, 0x53, 0x6d, 0x0a, 0x10, 0x28, 0x19, 0x05, 0xfe, 0x1c, 0x1a, 0xaf, 0x75, 0xa8, - 0x0e, 0xd9, 0x96, 0xee, 0xd9, 0x0e, 0x6f, 0x2d, 0x48, 0xd7, 0x14, 0xe0, 0x42, 0x41, 0x89, 0x1e, - 0xbf, 0x82, 0x50, 0xe9, 0x6e, 0x43, 0xb3, 0xdb, 0xa4, 0xa4, 0x2d, 0x71, 0x65, 0x80, 0xd2, 0xfa, - 0xa6, 0xdb, 0x74, 0xec, 0x36, 0x69, 0xea, 0x8e, 0x58, 0xad, 0x40, 0x8d, 0xab, 0x68, 0xb2, 0xd4, - 0x6a, 0x11, 0xd7, 0xd5, 0xc8, 0x97, 0x7b, 0xc4, 0xf5, 0x5c, 0x65, 0xf8, 0x89, 0xcc, 0x95, 0xd1, - 0xd9, 0x8b, 0x3b, 0xdb, 0xc5, 0xc7, 0x74, 0xc0, 0x34, 0x1d, 0x8e, 0x12, 0x58, 0x44, 0x0a, 0xe1, - 0x59, 0x34, 0x51, 0x7a, 0xbf, 0xe7, 0x90, 0x9a, 0x41, 0x2c, 0xcf, 0xf4, 0xb6, 0xb8, 0x86, 0x5c, - 0xd8, 0xd9, 0x2e, 0x2a, 0x3a, 0x45, 0x34, 0x4d, 0x8e, 0x11, 0x98, 0xc8, 0x45, 0xf0, 0x32, 0x3a, - 0x75, 0xab, 0x5c, 0x6f, 0x10, 0xe7, 0xbe, 0xd9, 0x22, 0xa5, 0x56, 0xcb, 0xee, 0x59, 0x9e, 0x32, - 0x02, 0x7c, 0x9e, 0xdc, 0xd9, 0x2e, 0x5e, 0x5c, 0x6b, 0x75, 0x9b, 0x2e, 0xc3, 0x36, 0x75, 0x86, - 0x16, 0x98, 0xc5, 0xcb, 0xe2, 0x2f, 0xa0, 0x89, 0x15, 0x87, 0x6a, 0xa1, 0x51, 0x21, 0x14, 0xae, - 0xe4, 0x41, 0xff, 0xcf, 0xcd, 0xf0, 0x09, 0x88, 0x41, 0xfd, 0x9e, 0x65, 0x8d, 0xf5, 0x58, 0x81, - 0xa6, 0x01, 0x38, 0xb1, 0xb1, 0x12, 0x2b, 0x4c, 0x90, 0x42, 0x3f, 0xde, 0x74, 0x88, 0x11, 0xd3, - 0xb6, 0x51, 0x68, 0xf3, 0xd5, 0x9d, 0xed, 0xe2, 0x27, 0x1d, 0x4e, 0xd3, 0x1c, 0xa8, 0x76, 0x7d, - 0x59, 0xa9, 0x7f, 0x3b, 0x8b, 0x26, 0xe9, 0x57, 0x09, 0x0a, 0x58, 0xa2, 0x63, 0x89, 0x42, 0xe8, - 0xd0, 0x72, 0xbb, 0x7a, 0x8b, 0x70, 0x5d, 0x3c, 0xbf, 0xb3, 0x5d, 0x3c, 0x6d, 0xf9, 0x40, 0x81, - 0x7d, 0x94, 0x1e, 0x5f, 0x45, 0x79, 0x06, 0xaa, 0x55, 0xb8, 0x7a, 0x4e, 0xec, 0x6c, 0x17, 0x47, - 0x5d, 0x80, 0x35, 0x4d, 0x43, 0x0b, 0xd0, 0x54, 0x3f, 0xd8, 0xdf, 0xf3, 0xb6, 0xeb, 0x51, 0xe6, - 0x5c, 0x3b, 0x41, 0x3f, 0x78, 0x81, 0x75, 0x8e, 0x12, 0xf5, 0x43, 0x2e, 0x84, 0x5f, 0x46, 0x88, - 0x41, 0x4a, 0x86, 0xe1, 0x70, 0x15, 0x7d, 0x6c, 0x67, 0xbb, 0x78, 0x96, 0xb3, 0xd0, 0x0d, 0x43, - 0xd4, 0x6f, 0x81, 0x18, 0x77, 0xd0, 0x38, 0xfb, 0xb5, 0xa0, 0xaf, 0x92, 0x36, 0xd3, 0xcf, 0xb1, - 0x1b, 0x57, 0xfc, 0x4e, 0x94, 0xa5, 0x33, 0x23, 0x92, 0x56, 0x2d, 0xcf, 0xd9, 0x9a, 0x2d, 0xf2, - 0x29, 0xed, 0x3c, 0xaf, 0xaa, 0x0d, 0x38, 0x71, 0x30, 0x89, 0x65, 0xe8, 0x4c, 0x37, 0x67, 0x3b, - 0x9b, 0xba, 0x63, 0x10, 0x63, 0x76, 0x4b, 0x9c, 0xe9, 0xee, 0xf9, 0xe0, 0xe6, 0xaa, 0xd8, 0x79, - 0x22, 0x39, 0x2e, 0xa3, 0x09, 0xc6, 0xad, 0xd1, 0x5b, 0xbd, 0x6d, 0x5a, 0x06, 0xd7, 0x5f, 0x51, - 0x5a, 0x6e, 0x6f, 0xb5, 0xb9, 0x61, 0x5a, 0xe2, 0x5c, 0x2e, 0x97, 0x99, 0x7e, 0x1d, 0x9d, 0x8a, - 0x7d, 0x06, 0x2e, 0xa0, 0xcc, 0x06, 0xd9, 0x62, 0x5d, 0xad, 0xd1, 0x3f, 0xf1, 0x19, 0x34, 0x7c, - 0x5f, 0x6f, 0xf7, 0xf8, 0x02, 0xa2, 0xb1, 0x1f, 0xaf, 0xa4, 0x3f, 0x93, 0xa2, 0xf3, 0x2d, 0x2e, - 0xdb, 0x96, 0x45, 0x5a, 0x9e, 0x38, 0xe5, 0xbe, 0x88, 0x46, 0x17, 0xec, 0x96, 0xde, 0x86, 0x3e, - 0x60, 0x3a, 0xa3, 0xec, 0x6c, 0x17, 0xcf, 0x50, 0xe1, 0xcf, 0xb4, 0x29, 0x46, 0x68, 0x53, 0x48, - 0x4a, 0x3b, 0x4f, 0x23, 0x1d, 0xdb, 0x23, 0x50, 0x30, 0x1d, 0x76, 0x1e, 0x14, 0x74, 0x00, 0x25, - 0x76, 0x5e, 0x48, 0x8c, 0xaf, 0xa3, 0x7c, 0x9d, 0xae, 0x32, 0x2d, 0xbb, 0xcd, 0x15, 0x07, 0x26, - 0x42, 0x58, 0x79, 0x84, 0x22, 0x01, 0x91, 0x3a, 0x8f, 0x26, 0xcb, 0x6d, 0x93, 0x58, 0x9e, 0xd8, - 0x6a, 0x3a, 0xa1, 0x96, 0xd6, 0x88, 0xe5, 0x89, 0xad, 0xa6, 0xb3, 0x6e, 0x53, 0xa7, 0x50, 0xb1, - 0xd5, 0x01, 0xa9, 0xfa, 0xeb, 0x19, 0xf4, 0xd8, 0xed, 0xde, 0x2a, 0x71, 0x2c, 0xe2, 0x11, 0x97, - 0x2f, 0x47, 0x01, 0xd7, 0x25, 0x74, 0x2a, 0x86, 0xe4, 0xdc, 0x61, 0x99, 0xd8, 0x08, 0x90, 0x4d, - 0xbe, 0xc2, 0x89, 0x73, 0x4d, 0xac, 0x28, 0x9e, 0x47, 0x53, 0x21, 0x90, 0x36, 0xc2, 0x55, 0xd2, - 0x30, 0x91, 0x5e, 0xda, 0xd9, 0x2e, 0x4e, 0x0b, 0xdc, 0x68, 0xb3, 0x45, 0xed, 0x8b, 0x16, 0xc3, - 0xb7, 0x51, 0x21, 0x04, 0xdd, 0x72, 0xec, 0x5e, 0xd7, 0x55, 0x32, 0xc0, 0xaa, 0xb8, 0xb3, 0x5d, - 0x7c, 0x5c, 0x60, 0xb5, 0x06, 0x48, 0x71, 0xf9, 0x8a, 0x16, 0xc4, 0xdf, 0x9d, 0x12, 0xb9, 0xf1, - 0x11, 0x94, 0x85, 0x11, 0xf4, 0x92, 0x3f, 0x82, 0xfa, 0x0a, 0x69, 0x26, 0x5a, 0x92, 0x0f, 0xa8, - 0x48, 0x33, 0x62, 0x03, 0x2a, 0x56, 0xe3, 0x74, 0x19, 0x9d, 0x4d, 0xe4, 0xb5, 0x2f, 0xad, 0xfe, - 0xdd, 0x8c, 0xc8, 0xa5, 0x6e, 0x1b, 0x41, 0x67, 0x2e, 0x8b, 0x9d, 0x59, 0xb7, 0x0d, 0xb0, 0x51, - 0x52, 0xe1, 0xca, 0x21, 0x34, 0xb6, 0x6b, 0x1b, 0x51, 0x53, 0x25, 0x5e, 0x16, 0xbf, 0x8b, 0xce, - 0xc5, 0x80, 0x6c, 0xaa, 0x65, 0xda, 0x7f, 0x79, 0x67, 0xbb, 0xa8, 0x26, 0x70, 0x8d, 0xce, 0xbc, - 0x7d, 0xb8, 0x60, 0x1d, 0x9d, 0x17, 0xa4, 0x6e, 0x5b, 0x9e, 0x6e, 0x5a, 0xdc, 0xb4, 0x62, 0xa3, - 0xe4, 0xe9, 0x9d, 0xed, 0xe2, 0x53, 0xa2, 0x0e, 0xfa, 0x34, 0xd1, 0xc6, 0xf7, 0xe3, 0x83, 0x0d, - 0xa4, 0x24, 0xa0, 0x6a, 0x1d, 0x7d, 0xcd, 0xb7, 0x17, 0xaf, 0xec, 0x6c, 0x17, 0x3f, 0x91, 0x58, - 0x87, 0x49, 0xa9, 0xc4, 0xf5, 0xa9, 0x1f, 0x27, 0xac, 0x21, 0x1c, 0xe2, 0x96, 0x6c, 0x83, 0xc0, - 0x37, 0x0c, 0x03, 0x7f, 0x75, 0x67, 0xbb, 0x78, 0x49, 0xe0, 0x6f, 0xd9, 0x06, 0x89, 0x36, 0x3f, - 0xa1, 0xb4, 0xfa, 0x5f, 0x52, 0xe8, 0x52, 0xa3, 0xb4, 0xb8, 0x50, 0x33, 0xfc, 0x05, 0xbd, 0xee, - 0xd8, 0xf7, 0x4d, 0x43, 0x18, 0xbd, 0xab, 0xe8, 0x7c, 0x04, 0x55, 0x05, 0x1b, 0x22, 0x30, 0x25, - 0xe1, 0xdb, 0x7c, 0x63, 0xa1, 0xcb, 0x69, 0x9a, 0xcc, 0xd0, 0x68, 0x4a, 0x76, 0x74, 0x3f, 0x46, - 0xb4, 0x8f, 0x22, 0xa8, 0xc6, 0xba, 0xed, 0x78, 0xad, 0x9e, 0xc7, 0x95, 0x00, 0xfa, 0x28, 0x56, - 0x87, 0xcb, 0x89, 0x06, 0x54, 0xe1, 0xf3, 0x51, 0x7f, 0x24, 0x83, 0x2e, 0x2c, 0x6f, 0x78, 0xba, - 0x46, 0x5c, 0xbb, 0xe7, 0xb4, 0x88, 0x7b, 0xa7, 0x6b, 0xe8, 0x1e, 0x09, 0x15, 0xbb, 0x88, 0x86, - 0x4b, 0x86, 0x41, 0x0c, 0xf8, 0xaa, 0x61, 0xb6, 0x47, 0xd0, 0x29, 0x40, 0x63, 0x70, 0xfc, 0x49, - 0x34, 0xc2, 0xcb, 0x40, 0xa3, 0x86, 0x67, 0xc7, 0x76, 0xb6, 0x8b, 0x23, 0x3d, 0x06, 0xd2, 0x7c, - 0x1c, 0x25, 0xab, 0x90, 0x36, 0xa1, 0x64, 0x99, 0x90, 0xcc, 0x60, 0x20, 0xcd, 0xc7, 0xe1, 0xb7, - 0xd0, 0x24, 0xb0, 0x0d, 0xda, 0xc3, 0xa7, 0x8a, 0x33, 0xfe, 0x54, 0x21, 0x36, 0x96, 0xcd, 0xe4, - 0xd0, 0x9a, 0xa6, 0xe3, 0x17, 0xd0, 0x22, 0x0c, 0xf0, 0x5d, 0x54, 0xe0, 0x8d, 0x08, 0x99, 0x0e, - 0x0f, 0x60, 0x7a, 0x76, 0x67, 0xbb, 0x78, 0x8a, 0xb7, 0x5f, 0x60, 0x1b, 0x63, 0x42, 0x19, 0xf3, - 0x66, 0x87, 0x8c, 0x73, 0xbb, 0x31, 0xe6, 0x5f, 0x2c, 0x32, 0x8e, 0x32, 0x51, 0xdf, 0x41, 0xe3, - 0x62, 0x41, 0x7c, 0x0e, 0xf6, 0x61, 0x4c, 0xad, 0x60, 0x07, 0x67, 0x1a, 0xb0, 0xf9, 0x7a, 0x0e, - 0x8d, 0x55, 0x88, 0xdb, 0x72, 0xcc, 0x2e, 0x5d, 0x64, 0xb9, 0x4e, 0x4c, 0xed, 0x6c, 0x17, 0xc7, - 0x8c, 0x10, 0xac, 0x89, 0x34, 0xea, 0xff, 0x48, 0xa1, 0x73, 0x94, 0x77, 0xc9, 0x75, 0xcd, 0x35, - 0xab, 0x23, 0xae, 0x72, 0xd7, 0x50, 0xae, 0x01, 0xf5, 0xf1, 0x9a, 0xce, 0xec, 0x6c, 0x17, 0x0b, - 0xac, 0x05, 0x82, 0x26, 0x71, 0x9a, 0x60, 0x13, 0x92, 0xde, 0x65, 0x13, 0x42, 0xad, 0x37, 0x4f, - 0x77, 0x3c, 0xd3, 0x5a, 0x6b, 0x78, 0xba, 0xd7, 0x73, 0x25, 0xeb, 0x8d, 0x63, 0x9a, 0x2e, 0xa0, - 0x24, 0xeb, 0x4d, 0x2a, 0x84, 0x5f, 0x47, 0xe3, 0x55, 0xcb, 0x08, 0x99, 0xb0, 0xf9, 0xe3, 0x71, - 0x6a, 0x54, 0x11, 0x80, 0xc7, 0x59, 0x48, 0x05, 0xd4, 0xbf, 0x91, 0x42, 0x0a, 0xdb, 0x31, 0x2c, - 0x98, 0xae, 0xb7, 0x48, 0x3a, 0xab, 0xc2, 0x60, 0x9e, 0xf3, 0xb7, 0x20, 0x14, 0x27, 0x4c, 0xdd, - 0xb0, 0x72, 0xf2, 0x2d, 0x48, 0xdb, 0x74, 0xbd, 0xe8, 0xdc, 0x11, 0x29, 0x85, 0x6b, 0x68, 0x84, - 0x71, 0x66, 0x4b, 0xef, 0xd8, 0x0d, 0xc5, 0x57, 0x84, 0x68, 0xd5, 0x4c, 0x19, 0x3a, 0x8c, 0x58, - 0xdc, 0x43, 0xf2, 0xf2, 0xea, 0xdf, 0x4c, 0xa3, 0x42, 0xb4, 0x10, 0xbe, 0x8b, 0xf2, 0x6f, 0xda, - 0xa6, 0x45, 0x8c, 0x65, 0x0b, 0x5a, 0x38, 0x78, 0x27, 0xed, 0x9b, 0x9d, 0xa7, 0xdf, 0x83, 0x32, - 0x4d, 0x5b, 0xd8, 0x81, 0xc1, 0xc6, 0x3a, 0x60, 0x86, 0xbf, 0x80, 0x46, 0xa9, 0xc9, 0x74, 0x1f, - 0x38, 0xa7, 0x77, 0xe5, 0xfc, 0x04, 0xe7, 0x7c, 0xc6, 0x61, 0x85, 0xe2, 0xac, 0x43, 0x76, 0x54, - 0xaf, 0x34, 0xa2, 0xbb, 0xb6, 0xc5, 0x7b, 0x1e, 0xf4, 0xca, 0x01, 0x88, 0xa8, 0x57, 0x8c, 0x86, - 0x5a, 0x7a, 0xec, 0x63, 0xa1, 0x1b, 0x04, 0x33, 0x9d, 0xc9, 0x2a, 0xda, 0x03, 0x02, 0xb1, 0xfa, - 0xbd, 0x69, 0xf4, 0x6c, 0x28, 0x32, 0x8d, 0xdc, 0x37, 0xc9, 0x26, 0x17, 0xe7, 0xba, 0xd9, 0xe5, - 0x1b, 0x1c, 0xaa, 0xf2, 0x6e, 0x79, 0x5d, 0xb7, 0xd6, 0x88, 0x41, 0x77, 0xc8, 0x74, 0x17, 0xea, - 0x2a, 0x29, 0xb0, 0x6e, 0x60, 0x3a, 0xa1, 0xbb, 0x55, 0xb1, 0x47, 0x18, 0x05, 0xb6, 0x51, 0x6e, - 0xc5, 0xd1, 0x4d, 0xcf, 0xef, 0xd9, 0x52, 0xbc, 0x67, 0xf7, 0x50, 0xe3, 0x0c, 0xe3, 0xc1, 0xac, - 0x18, 0x10, 0x84, 0x07, 0x00, 0x51, 0x10, 0x8c, 0x64, 0xfa, 0x65, 0x34, 0x26, 0x10, 0xef, 0xcb, - 0x4c, 0xf9, 0xc5, 0xac, 0xa8, 0xeb, 0x7e, 0xb3, 0xb8, 0xae, 0x5f, 0xa7, 0x3a, 0xea, 0xba, 0x74, - 0x11, 0x66, 0x4a, 0xce, 0x35, 0x11, 0x40, 0xb2, 0x26, 0x02, 0x08, 0x3f, 0x8f, 0xf2, 0x8c, 0x45, - 0xb0, 0x55, 0x83, 0x6d, 0x9e, 0x03, 0x30, 0x79, 0x25, 0x0b, 0x08, 0xf1, 0x4f, 0xa5, 0xd0, 0xc5, - 0x81, 0x92, 0x00, 0x65, 0x18, 0xbb, 0xf1, 0xc2, 0x81, 0xc4, 0x38, 0xfb, 0xec, 0xce, 0x76, 0xf1, - 0x6a, 0x27, 0x20, 0x69, 0x3a, 0x02, 0x4d, 0xb3, 0xc5, 0x88, 0x84, 0x76, 0x0d, 0x6e, 0x0a, 0xb5, - 0xb5, 0x58, 0xa5, 0x73, 0x70, 0xce, 0x60, 0xb5, 0xb6, 0xfc, 0x46, 0x66, 0x43, 0x5b, 0x8b, 0x7f, - 0xef, 0x3d, 0x9f, 0x24, 0xa1, 0x9a, 0x3e, 0x5c, 0x70, 0x0b, 0x9d, 0x67, 0x98, 0x8a, 0xbe, 0xb5, - 0x7c, 0x6f, 0xd1, 0xb6, 0xbc, 0x75, 0xbf, 0x82, 0x61, 0x71, 0xa3, 0x0e, 0x15, 0x18, 0xfa, 0x56, - 0xd3, 0xbe, 0xd7, 0xec, 0x50, 0xaa, 0x84, 0x3a, 0xfa, 0x71, 0xa2, 0x13, 0x2d, 0x1f, 0x73, 0xfe, - 0x14, 0x94, 0x0b, 0x8f, 0x51, 0xfc, 0x71, 0x1a, 0x9f, 0x70, 0x22, 0x85, 0xd4, 0x6f, 0x0d, 0xd3, - 0xcd, 0x2e, 0x9c, 0x7d, 0xc1, 0x14, 0x8c, 0x5f, 0x09, 0x4f, 0x13, 0xf9, 0x9c, 0x53, 0xf0, 0xfb, - 0x2c, 0x38, 0xb7, 0x18, 0xa7, 0xf3, 0xc1, 0x6f, 0x6c, 0x17, 0x53, 0x3b, 0xdb, 0xc5, 0x21, 0x2d, - 0x2f, 0x6c, 0x9c, 0xc2, 0x45, 0x42, 0x58, 0x15, 0xc5, 0xd3, 0xac, 0x48, 0x59, 0xb6, 0x68, 0xbc, - 0x8e, 0x46, 0x78, 0x1b, 0xb8, 0x9a, 0x9c, 0x0f, 0xf7, 0xda, 0xd2, 0x19, 0x5e, 0xa4, 0xb4, 0x5f, - 0x0a, 0xbf, 0x8a, 0x72, 0x6c, 0xff, 0x0a, 0x3d, 0x28, 0x1c, 0xb8, 0xc8, 0x7b, 0xf5, 0x48, 0x71, - 0x5e, 0x06, 0xcf, 0x23, 0x14, 0xee, 0x5d, 0x83, 0x23, 0x4b, 0xce, 0x21, 0xbe, 0xab, 0x8d, 0x70, - 0x11, 0xca, 0xe2, 0x17, 0xd1, 0xf8, 0x0a, 0x71, 0x3a, 0xa6, 0xa5, 0xb7, 0x1b, 0xe6, 0xfb, 0xfe, - 0xa9, 0x25, 0xac, 0x96, 0xae, 0xf9, 0xbe, 0x38, 0xdc, 0x24, 0x3a, 0xfc, 0xa5, 0xa4, 0xbd, 0xe1, - 0x08, 0x34, 0xe4, 0xc9, 0x5d, 0x37, 0x4d, 0x91, 0xf6, 0x24, 0x6c, 0x15, 0xdf, 0x42, 0x13, 0xd2, - 0xb6, 0x80, 0x1f, 0x4b, 0x5d, 0x8c, 0xb3, 0x16, 0xf6, 0x38, 0x11, 0xb6, 0x32, 0x07, 0xaa, 0x7e, - 0x35, 0xcb, 0xf4, 0x4c, 0xbd, 0x5d, 0xb6, 0x3b, 0x1d, 0xdd, 0x32, 0x94, 0xd1, 0x50, 0xfd, 0x4c, - 0x86, 0x69, 0xb6, 0x18, 0x4a, 0x54, 0x3f, 0xb9, 0x10, 0xdd, 0x7a, 0xf2, 0x3e, 0xd4, 0x48, 0xcb, - 0x76, 0xe8, 0x02, 0xae, 0x20, 0x10, 0x1a, 0xec, 0xf9, 0x5c, 0x86, 0x6b, 0x3a, 0x3e, 0x52, 0xdc, - 0xf3, 0x45, 0x0b, 0xbe, 0x99, 0xcd, 0x8f, 0x15, 0xc6, 0xa3, 0x07, 0x85, 0xea, 0x5f, 0xcf, 0xa0, - 0x31, 0x4e, 0x4a, 0xd7, 0xbf, 0x13, 0x05, 0x3f, 0x8c, 0x82, 0x27, 0x2a, 0x6a, 0xee, 0x61, 0x29, - 0xaa, 0xfa, 0xb5, 0x74, 0x30, 0x1b, 0xd5, 0x1d, 0xd3, 0x3a, 0xdc, 0x6c, 0x74, 0x19, 0xa1, 0xf2, - 0x7a, 0xcf, 0xda, 0x60, 0x17, 0x22, 0xe9, 0xf0, 0x42, 0xa4, 0x65, 0x6a, 0x02, 0x06, 0x5f, 0x44, - 0xd9, 0x0a, 0xe5, 0x4f, 0x7b, 0x66, 0x7c, 0x76, 0xf4, 0x03, 0xc6, 0x29, 0xf5, 0xac, 0x06, 0x60, - 0xba, 0x23, 0x9a, 0xdd, 0xf2, 0x08, 0xb3, 0x41, 0x33, 0x6c, 0x47, 0xb4, 0x4a, 0x01, 0x1a, 0x83, - 0xe3, 0x9b, 0xe8, 0x54, 0x85, 0xb4, 0xf5, 0xad, 0x45, 0xb3, 0xdd, 0x36, 0x5d, 0xd2, 0xb2, 0x2d, - 0xc3, 0x05, 0x21, 0xf3, 0xea, 0x3a, 0xae, 0x16, 0x27, 0xc0, 0x2a, 0xca, 0x2d, 0xdf, 0xbb, 0xe7, - 0x12, 0x0f, 0xc4, 0x97, 0x99, 0x45, 0x3b, 0xdb, 0xc5, 0x9c, 0x0d, 0x10, 0x8d, 0x63, 0xd4, 0x9f, - 0x4d, 0xd1, 0x2d, 0x87, 0xbb, 0xe1, 0xd9, 0xdd, 0x40, 0xcb, 0x0f, 0x25, 0x92, 0xab, 0xa1, 0x31, - 0x90, 0x86, 0xaf, 0x9d, 0xe2, 0x5f, 0x3b, 0xc2, 0x0d, 0x82, 0xd0, 0x0c, 0x48, 0xfc, 0xaa, 0xcc, - 0x2e, 0x5f, 0xa5, 0xfe, 0x5e, 0x1a, 0x9d, 0xe7, 0x2d, 0x2e, 0xb7, 0xcd, 0xee, 0xaa, 0xad, 0x3b, - 0x86, 0x46, 0x5a, 0xc4, 0xbc, 0x4f, 0x8e, 0xe7, 0xc0, 0x93, 0x87, 0x4e, 0xf6, 0x10, 0x43, 0xe7, - 0x06, 0xec, 0xde, 0xa8, 0x64, 0xe0, 0x50, 0x93, 0x59, 0x02, 0x85, 0x9d, 0xed, 0xe2, 0xb8, 0xc1, - 0xc0, 0x70, 0x24, 0xad, 0x89, 0x44, 0x54, 0x49, 0x16, 0x88, 0xb5, 0xe6, 0xad, 0x83, 0x92, 0x0c, - 0x33, 0x25, 0x69, 0x03, 0x44, 0xe3, 0x18, 0xf5, 0xbf, 0xa5, 0xd1, 0x99, 0xa8, 0xc8, 0x1b, 0xc4, - 0x32, 0x4e, 0xe4, 0xfd, 0xe1, 0xc8, 0xfb, 0xf7, 0x33, 0xe8, 0x71, 0x5e, 0xa6, 0xb1, 0xae, 0x3b, - 0xc4, 0xa8, 0x98, 0x0e, 0x69, 0x79, 0xb6, 0xb3, 0x75, 0x8c, 0x0d, 0xa8, 0x87, 0x27, 0xf6, 0x9b, - 0x28, 0xc7, 0xf7, 0xec, 0x6c, 0x9d, 0x99, 0x0c, 0x5a, 0x02, 0xd0, 0xd8, 0x0a, 0xc5, 0xf6, 0xfb, - 0x91, 0xce, 0xca, 0xed, 0xa5, 0xb3, 0x3e, 0x83, 0x26, 0x02, 0xd1, 0xc3, 0xee, 0x71, 0x24, 0xb4, - 0xb6, 0x0c, 0x1f, 0x01, 0x1b, 0x48, 0x4d, 0x26, 0x84, 0xda, 0x7c, 0x40, 0xad, 0x02, 0xd6, 0xd0, - 0x04, 0xaf, 0x2d, 0x28, 0x67, 0x1a, 0x9a, 0x48, 0xa4, 0x6e, 0x67, 0xd1, 0x74, 0x72, 0xb7, 0x6b, - 0x44, 0x37, 0x4e, 0x7a, 0xfd, 0x63, 0xd9, 0xeb, 0xf8, 0x49, 0x94, 0xad, 0xeb, 0xde, 0x3a, 0xbf, - 0x60, 0x85, 0x3b, 0xcb, 0x7b, 0x66, 0x9b, 0x34, 0xbb, 0xba, 0xb7, 0xae, 0x01, 0x4a, 0x98, 0x33, - 0x10, 0x70, 0x4c, 0x98, 0x33, 0x84, 0xc5, 0x7e, 0xec, 0x89, 0xd4, 0x95, 0x6c, 0xe2, 0x62, 0xff, - 0xad, 0x6c, 0xbf, 0x79, 0xe5, 0xae, 0x63, 0x7a, 0xe4, 0x44, 0xc3, 0x4e, 0x34, 0xec, 0x90, 0x1a, - 0xf6, 0x2f, 0xd3, 0x68, 0x22, 0xd8, 0x34, 0xbd, 0x47, 0x5a, 0x47, 0xb3, 0x56, 0x85, 0x5b, 0x99, - 0xcc, 0xa1, 0xb7, 0x32, 0x87, 0x51, 0x28, 0x35, 0x38, 0xa7, 0x64, 0xa6, 0x01, 0x48, 0x8c, 0x9d, - 0x53, 0x06, 0xa7, 0x93, 0x4f, 0xa2, 0x91, 0x45, 0xfd, 0x81, 0xd9, 0xe9, 0x75, 0xb8, 0x95, 0x0e, - 0x0e, 0x43, 0x1d, 0xfd, 0x81, 0xe6, 0xc3, 0xd5, 0x7f, 0x9d, 0x42, 0x93, 0x5c, 0xa8, 0x9c, 0xf9, - 0xa1, 0xa4, 0x1a, 0x4a, 0x27, 0x7d, 0x68, 0xe9, 0x64, 0x0e, 0x2e, 0x1d, 0xf5, 0xc7, 0x32, 0x48, - 0x99, 0x33, 0xdb, 0x64, 0xc5, 0xd1, 0x2d, 0xf7, 0x1e, 0x71, 0xf8, 0x76, 0xba, 0x4a, 0x59, 0x1d, - 0xea, 0x03, 0x85, 0x29, 0x25, 0x7d, 0xa0, 0x29, 0xe5, 0x53, 0x68, 0x94, 0x37, 0x26, 0x70, 0x56, - 0x83, 0x51, 0xe3, 0xf8, 0x40, 0x2d, 0xc4, 0x53, 0xe2, 0x52, 0xb7, 0xeb, 0xd8, 0xf7, 0x89, 0xc3, - 0xae, 0x96, 0x38, 0xb1, 0xee, 0x03, 0xb5, 0x10, 0x2f, 0x70, 0x26, 0xbe, 0xbd, 0x28, 0x72, 0x26, - 0x8e, 0x16, 0xe2, 0xf1, 0x15, 0x94, 0x5f, 0xb0, 0x5b, 0x3a, 0x08, 0x9a, 0x4d, 0x2b, 0xe3, 0x3b, - 0xdb, 0xc5, 0x7c, 0x9b, 0xc3, 0xb4, 0x00, 0x4b, 0x29, 0x2b, 0xf6, 0xa6, 0xd5, 0xb6, 0x75, 0xe6, - 0x9c, 0x91, 0x67, 0x94, 0x06, 0x87, 0x69, 0x01, 0x96, 0x52, 0x52, 0x99, 0x83, 0xd3, 0x4b, 0x3e, - 0xe4, 0x79, 0x8f, 0xc3, 0xb4, 0x00, 0xab, 0xfe, 0x6c, 0x96, 0x6a, 0xaf, 0x6b, 0xbe, 0xff, 0xc8, - 0xaf, 0x0b, 0xe1, 0x80, 0x19, 0x3e, 0xc0, 0x80, 0x79, 0x64, 0x0e, 0xec, 0xd4, 0xff, 0x39, 0x82, - 0x10, 0x97, 0x7e, 0xf5, 0x64, 0x73, 0x78, 0x38, 0xad, 0xa9, 0xa0, 0x53, 0x55, 0x6b, 0x5d, 0xb7, - 0x5a, 0xc4, 0x08, 0x8f, 0x2d, 0x73, 0x30, 0xb4, 0xc1, 0x59, 0x94, 0x70, 0x64, 0x78, 0x6e, 0xa9, - 0xc5, 0x0b, 0xe0, 0xe7, 0xd0, 0x58, 0xcd, 0xf2, 0x88, 0xa3, 0xb7, 0x3c, 0xf3, 0x3e, 0xe1, 0x53, - 0x03, 0x5c, 0xe7, 0x9a, 0x21, 0x58, 0x13, 0x69, 0xf0, 0x4d, 0x34, 0x5e, 0xd7, 0x1d, 0xcf, 0x6c, - 0x99, 0x5d, 0xdd, 0xf2, 0x5c, 0x25, 0x0f, 0x33, 0x1a, 0x58, 0x18, 0x5d, 0x01, 0xae, 0x49, 0x54, - 0xf8, 0x4b, 0x68, 0x14, 0xb6, 0xa6, 0xe0, 0x91, 0x3b, 0xba, 0xeb, 0x6d, 0xdf, 0x53, 0xa1, 0xfb, - 0x1a, 0x3b, 0x7d, 0x85, 0x6b, 0xdb, 0xe8, 0x85, 0x5f, 0xc0, 0x11, 0x7f, 0x1e, 0x8d, 0x54, 0x2d, - 0x03, 0x98, 0xa3, 0x5d, 0x99, 0xab, 0x9c, 0xf9, 0xb9, 0x90, 0xb9, 0xdd, 0x8d, 0xf0, 0xf6, 0xd9, - 0x25, 0x8f, 0xb2, 0xb1, 0x0f, 0x6f, 0x94, 0x8d, 0x7f, 0x08, 0xc7, 0xe2, 0x13, 0x0f, 0xeb, 0x58, - 0x7c, 0xf2, 0x80, 0xc7, 0xe2, 0xea, 0xfb, 0x68, 0x6c, 0xb6, 0x3e, 0x17, 0x8c, 0xde, 0xc7, 0x50, - 0xa6, 0xce, 0xdd, 0x0b, 0xb2, 0xcc, 0x9e, 0xe9, 0x9a, 0x86, 0x46, 0x61, 0xf8, 0x2a, 0xca, 0x97, - 0xc1, 0xc5, 0x8b, 0x5f, 0xfd, 0x65, 0xd9, 0xfa, 0xd7, 0x02, 0x18, 0x78, 0x69, 0xfa, 0x68, 0xfc, - 0x49, 0x34, 0x52, 0x77, 0xec, 0x35, 0x47, 0xef, 0xf0, 0x35, 0x18, 0xfc, 0x3b, 0xba, 0x0c, 0xa4, - 0xf9, 0x38, 0xf5, 0xcf, 0xa5, 0x7c, 0xb3, 0x9d, 0x96, 0x68, 0xf4, 0xe0, 0x68, 0x1e, 0xea, 0xce, - 0xb3, 0x12, 0x2e, 0x03, 0x69, 0x3e, 0x0e, 0x5f, 0x45, 0xc3, 0x55, 0xc7, 0xb1, 0x1d, 0xd1, 0x8b, - 0x99, 0x50, 0x80, 0x78, 0x47, 0x0b, 0x14, 0xf8, 0x25, 0x34, 0xc6, 0xe6, 0x1c, 0x76, 0xa2, 0x99, - 0x19, 0x74, 0xbd, 0x29, 0x52, 0xaa, 0x5f, 0xcf, 0x08, 0x36, 0x1b, 0x93, 0xf8, 0x23, 0x78, 0x2b, - 0xf0, 0x3c, 0xca, 0xcc, 0xd6, 0xe7, 0xf8, 0x04, 0x78, 0xda, 0x2f, 0x2a, 0xa8, 0x4a, 0xa4, 0x1c, - 0xa5, 0xc6, 0x17, 0x50, 0xb6, 0x4e, 0xd5, 0x27, 0x07, 0xea, 0x91, 0xdf, 0xd9, 0x2e, 0x66, 0xbb, - 0x54, 0x7f, 0x00, 0x0a, 0x58, 0xba, 0x99, 0x61, 0x3b, 0x26, 0x86, 0x0d, 0xf7, 0x31, 0x17, 0x50, - 0xb6, 0xe4, 0xac, 0xdd, 0xe7, 0xb3, 0x16, 0x60, 0x75, 0x67, 0xed, 0xbe, 0x06, 0x50, 0x7c, 0x1d, - 0x21, 0x8d, 0x78, 0x3d, 0xc7, 0x82, 0x07, 0x06, 0xa3, 0x70, 0xfe, 0x06, 0xb3, 0xa1, 0x03, 0xd0, - 0x66, 0xcb, 0x36, 0x88, 0x26, 0x90, 0xa8, 0x7f, 0x2d, 0xbc, 0xd8, 0xa9, 0x98, 0xee, 0xc6, 0x49, - 0x17, 0xee, 0xa3, 0x0b, 0x75, 0x7e, 0xc4, 0x19, 0xef, 0xa4, 0x22, 0x1a, 0x9e, 0x6b, 0xeb, 0x6b, - 0x2e, 0xf4, 0x21, 0x77, 0x00, 0xbb, 0x47, 0x01, 0x1a, 0x83, 0x47, 0xfa, 0x29, 0xbf, 0x7b, 0x3f, - 0xfd, 0xe8, 0x70, 0x30, 0xda, 0x96, 0x88, 0xb7, 0x69, 0x3b, 0x27, 0x5d, 0xb5, 0xd7, 0xae, 0xba, - 0x8c, 0x46, 0x1a, 0x4e, 0x4b, 0x38, 0xba, 0x80, 0xfd, 0x80, 0xeb, 0xb4, 0xd8, 0xb1, 0x85, 0x8f, - 0xa4, 0x74, 0x15, 0xd7, 0x03, 0xba, 0x91, 0x90, 0xce, 0x70, 0x3d, 0x4e, 0xc7, 0x91, 0x9c, 0xae, - 0x6e, 0x3b, 0x1e, 0xef, 0xb8, 0x80, 0xae, 0x6b, 0x3b, 0x9e, 0xe6, 0x23, 0xf1, 0xa7, 0x10, 0x5a, - 0x29, 0xd7, 0xdf, 0x26, 0x0e, 0x88, 0x6b, 0x34, 0x74, 0xe0, 0xbb, 0xcf, 0x40, 0x9a, 0x80, 0xc6, - 0x2b, 0x68, 0x74, 0xb9, 0x4b, 0x1c, 0xb6, 0x15, 0xa2, 0x16, 0xc0, 0xe4, 0x8d, 0xa7, 0x23, 0xa2, - 0xe5, 0xfd, 0x3e, 0xc3, 0xff, 0x0f, 0xc8, 0xd9, 0xfa, 0x62, 0xfb, 0x3f, 0xb5, 0x90, 0x11, 0x7e, - 0x09, 0xe5, 0x4a, 0xcc, 0xce, 0x1b, 0x03, 0x96, 0x81, 0xc8, 0x60, 0x0b, 0xca, 0x50, 0x6c, 0xcf, - 0xae, 0xc3, 0xdf, 0x1a, 0x27, 0x57, 0xaf, 0xa2, 0x42, 0xb4, 0x1a, 0x3c, 0x86, 0x46, 0xca, 0xcb, - 0x4b, 0x4b, 0xd5, 0xf2, 0x4a, 0x61, 0x08, 0xe7, 0x51, 0xb6, 0x51, 0x5d, 0xaa, 0x14, 0x52, 0xea, - 0x4f, 0x0b, 0x33, 0x08, 0x55, 0xad, 0x93, 0xab, 0xe1, 0x43, 0xdd, 0xb7, 0x14, 0xe0, 0x3e, 0x14, - 0x4e, 0x0c, 0x3a, 0xa6, 0xe7, 0x11, 0x83, 0xaf, 0x12, 0x70, 0x5f, 0xe8, 0x3d, 0xd0, 0x62, 0x78, - 0x7c, 0x0d, 0x4d, 0x00, 0x8c, 0x5f, 0x11, 0xb2, 0xfd, 0x31, 0x2f, 0xe0, 0x3c, 0xd0, 0x64, 0xa4, - 0xfa, 0xcd, 0xf0, 0x76, 0x78, 0x81, 0xe8, 0xc7, 0xf5, 0x46, 0xf1, 0x23, 0xd2, 0x5f, 0xea, 0x1f, - 0x66, 0xd9, 0x33, 0x07, 0xf6, 0x22, 0xec, 0x28, 0x44, 0x19, 0x1e, 0xe9, 0x66, 0xf6, 0x71, 0xa4, - 0x7b, 0x0d, 0xe5, 0x16, 0x89, 0xb7, 0x6e, 0xfb, 0xde, 0x5a, 0xe0, 0x56, 0xd7, 0x01, 0x88, 0xe8, - 0x56, 0xc7, 0x68, 0xf0, 0x06, 0xc2, 0xfe, 0x73, 0xaf, 0x92, 0xe7, 0x39, 0xe6, 0x6a, 0xcf, 0x23, - 0xfe, 0x11, 0xf2, 0xf9, 0xd8, 0x3e, 0xa5, 0x01, 0x6f, 0x3d, 0xc1, 0x8f, 0xfc, 0x8c, 0x1e, 0x90, - 0x87, 0x6c, 0xff, 0x60, 0xbb, 0x98, 0x63, 0x34, 0x5a, 0x02, 0x5b, 0xfc, 0x16, 0x1a, 0x5d, 0x9c, - 0x2b, 0xf1, 0xa7, 0x5f, 0xcc, 0x2b, 0xe2, 0xb1, 0x40, 0x8a, 0x3e, 0x22, 0x10, 0x09, 0xbc, 0x29, - 0xe9, 0xdc, 0xd3, 0xe3, 0x2f, 0xbf, 0x42, 0x2e, 0x54, 0x5b, 0xd8, 0xeb, 0x14, 0x7e, 0xba, 0x10, - 0x68, 0x8b, 0xfc, 0x66, 0x25, 0x2a, 0x2b, 0x86, 0x8d, 0x68, 0x4b, 0xfe, 0x10, 0xa3, 0x7b, 0x19, - 0x9d, 0x2a, 0x75, 0xbb, 0x6d, 0x93, 0x18, 0xa0, 0x2f, 0x5a, 0xaf, 0x4d, 0x5c, 0xee, 0xf2, 0x03, - 0x0f, 0x1e, 0x74, 0x86, 0x6c, 0xc2, 0x83, 0xc3, 0xa6, 0xd3, 0x93, 0x9d, 0x2a, 0xe3, 0x65, 0xd5, - 0xff, 0x9a, 0x42, 0x05, 0xdf, 0xe3, 0x59, 0x7c, 0xea, 0x28, 0xb8, 0xe3, 0xc2, 0x31, 0x4c, 0xc4, - 0x01, 0x14, 0xf0, 0xb8, 0x81, 0x46, 0xaa, 0x0f, 0xba, 0xa6, 0x43, 0xdc, 0x3d, 0x78, 0xaf, 0x5e, - 0xe4, 0x5b, 0xce, 0x53, 0x84, 0x15, 0x89, 0xed, 0x36, 0x19, 0x18, 0x9e, 0xfd, 0x30, 0x9f, 0xef, - 0x59, 0xff, 0xfd, 0x26, 0x7b, 0xf6, 0xc3, 0x7d, 0xc3, 0xa5, 0x37, 0x58, 0x21, 0x29, 0x7e, 0x0a, - 0x65, 0x56, 0x56, 0x16, 0xb8, 0x36, 0xc2, 0xbb, 0x59, 0xcf, 0x13, 0xdf, 0x35, 0x51, 0xac, 0xfa, - 0x23, 0x69, 0x84, 0xa8, 0xd2, 0x97, 0x1d, 0xa2, 0x1f, 0xd1, 0x65, 0xce, 0x2c, 0xca, 0xfb, 0x02, - 0xe7, 0x03, 0x2e, 0x70, 0x57, 0x8e, 0x76, 0x44, 0xb4, 0xee, 0xc0, 0x35, 0xbd, 0xe8, 0x7b, 0xd0, - 0xb2, 0xb3, 0x54, 0xb0, 0x0e, 0xc1, 0x83, 0xd6, 0xf7, 0x9b, 0xfd, 0x14, 0x1a, 0xe5, 0x5a, 0x63, - 0x4b, 0x67, 0xa8, 0x2d, 0x1f, 0xa8, 0x85, 0xf8, 0x40, 0x28, 0x4c, 0x96, 0x27, 0x42, 0x01, 0xa1, - 0x7c, 0x23, 0xc5, 0x84, 0xc2, 0x9e, 0x09, 0x1c, 0x57, 0xa1, 0xa8, 0x5f, 0x4d, 0x21, 0x4c, 0x99, - 0xd5, 0x75, 0xd7, 0xdd, 0xb4, 0x1d, 0x83, 0xf9, 0xad, 0x1e, 0xc5, 0xe7, 0xa8, 0x5f, 0xcf, 0xa3, - 0xd3, 0x92, 0x53, 0xe0, 0x31, 0x1f, 0x84, 0x57, 0x65, 0x7d, 0x1b, 0xe4, 0xc6, 0xfe, 0x09, 0xf1, - 0xb2, 0x64, 0x58, 0x7a, 0x51, 0x22, 0xdc, 0x92, 0x3c, 0x8b, 0xc6, 0xf9, 0x0f, 0xba, 0xc6, 0xfa, - 0xa7, 0xe0, 0xa0, 0xc7, 0x2e, 0x05, 0x68, 0x12, 0x1a, 0xbf, 0x80, 0x46, 0xa9, 0x72, 0xae, 0xc1, - 0xd3, 0xf1, 0x91, 0xd0, 0x45, 0xdc, 0xf0, 0x81, 0xe2, 0x3c, 0x19, 0x50, 0x0a, 0x0f, 0x03, 0xf2, - 0x7b, 0x78, 0x18, 0xf0, 0x2e, 0x1a, 0x2b, 0x59, 0x96, 0xed, 0x81, 0x01, 0xef, 0xf2, 0x63, 0xcb, - 0xbe, 0x2b, 0xf6, 0x53, 0xf0, 0x38, 0x34, 0xa4, 0x4f, 0x5c, 0xb2, 0x45, 0x86, 0xf8, 0x86, 0xef, - 0xe6, 0x4e, 0x1c, 0xee, 0x71, 0x0a, 0x47, 0xb7, 0x0e, 0x87, 0xc5, 0xbd, 0xdc, 0xa1, 0xf3, 0x26, - 0xea, 0x8e, 0xdd, 0xb5, 0x5d, 0x62, 0x30, 0x41, 0x8d, 0x85, 0x6f, 0xce, 0xbb, 0x1c, 0x01, 0x0f, - 0x53, 0xa4, 0x67, 0xdc, 0x52, 0x11, 0x7c, 0x0f, 0x9d, 0xf1, 0x2f, 0x91, 0x82, 0x27, 0x40, 0xb5, - 0x8a, 0xab, 0x8c, 0xc3, 0x33, 0x03, 0x1c, 0x55, 0x86, 0x5a, 0x65, 0xf6, 0x92, 0x7f, 0x64, 0xea, - 0xbf, 0x21, 0x6a, 0x9a, 0x86, 0xd8, 0xd5, 0x89, 0xfc, 0xf0, 0x77, 0xa2, 0xb1, 0x45, 0xfd, 0x41, - 0xa5, 0xc7, 0xf7, 0x65, 0x13, 0x7b, 0x3f, 0x99, 0xed, 0xe8, 0x0f, 0x9a, 0x06, 0x2f, 0x17, 0x59, - 0x2b, 0x45, 0x96, 0xb8, 0x89, 0xce, 0xd5, 0x1d, 0xbb, 0x63, 0x7b, 0xc4, 0x88, 0xbc, 0xa6, 0x99, - 0x0a, 0x5f, 0xab, 0x75, 0x39, 0x45, 0x73, 0xc0, 0xb3, 0x9a, 0x3e, 0x6c, 0x70, 0x07, 0x4d, 0x95, - 0x5c, 0xb7, 0xd7, 0x21, 0xe1, 0xe9, 0x75, 0x61, 0xd7, 0xcf, 0x78, 0x9a, 0x7b, 0x34, 0x3e, 0xae, - 0x43, 0x51, 0x76, 0x78, 0xdd, 0xf4, 0x4c, 0xb1, 0x46, 0xf8, 0x96, 0x28, 0xef, 0x37, 0xb3, 0xf9, - 0xc9, 0xc2, 0x94, 0x76, 0x3e, 0xde, 0x98, 0x15, 0xd3, 0x6b, 0x13, 0xf5, 0x97, 0x53, 0x08, 0x85, - 0x02, 0xc6, 0xcf, 0xca, 0xf1, 0x29, 0x52, 0xe1, 0x21, 0x28, 0x7f, 0xbd, 0x2b, 0x05, 0xa4, 0xc0, - 0x17, 0x50, 0x16, 0x5e, 0x67, 0xa7, 0xc3, 0x43, 0x97, 0x0d, 0xd3, 0x32, 0x34, 0x80, 0x52, 0xac, - 0xf0, 0x14, 0x13, 0xb0, 0x70, 0xe1, 0xc7, 0xac, 0x9d, 0x0a, 0x9a, 0x6a, 0xf4, 0x56, 0xfd, 0xba, - 0x85, 0x87, 0x32, 0xf0, 0x48, 0xdc, 0xed, 0xad, 0x06, 0xaf, 0xcb, 0xa4, 0x27, 0xf8, 0x72, 0x11, - 0xf5, 0x67, 0x53, 0x91, 0x59, 0xf0, 0x08, 0x17, 0x98, 0x4f, 0xc4, 0xef, 0x70, 0xe3, 0xd3, 0x92, - 0xfa, 0x97, 0xd3, 0x68, 0xac, 0x6e, 0x3b, 0x1e, 0x7f, 0xee, 0x7e, 0x24, 0x2d, 0x7d, 0x68, 0x37, - 0xea, 0xc2, 0x6e, 0x27, 0xbb, 0x8f, 0xdd, 0xce, 0x05, 0x94, 0x15, 0xdc, 0x17, 0xd9, 0x99, 0xa9, - 0x61, 0x38, 0x1a, 0x40, 0xd5, 0xef, 0x4a, 0x23, 0xf4, 0xf9, 0xe7, 0x9e, 0x7b, 0x84, 0x05, 0xa4, - 0xfe, 0xa5, 0x14, 0x9a, 0xe2, 0x87, 0xf8, 0x42, 0xa4, 0x97, 0x11, 0xff, 0xfa, 0x45, 0x1c, 0x97, - 0x0c, 0xa4, 0xf9, 0x38, 0xba, 0x04, 0x54, 0x1f, 0x98, 0x1e, 0x9c, 0x63, 0x0a, 0xa1, 0x5e, 0x08, - 0x87, 0x89, 0x4b, 0x80, 0x4f, 0x87, 0x9f, 0xf5, 0xaf, 0x27, 0x32, 0xe1, 0xba, 0x47, 0x0b, 0x54, - 0x13, 0xaf, 0x28, 0xd4, 0x9f, 0xcf, 0xa2, 0x6c, 0xf5, 0x01, 0x69, 0x1d, 0xf3, 0xae, 0x11, 0x0e, - 0x3d, 0xb2, 0x87, 0x3c, 0xf4, 0x38, 0xc8, 0x7d, 0xeb, 0xeb, 0x61, 0x7f, 0xe6, 0xe4, 0xea, 0x23, - 0x3d, 0x1f, 0xad, 0xde, 0xef, 0xe9, 0xe3, 0x77, 0x5d, 0xff, 0x8f, 0x33, 0x28, 0xd3, 0x28, 0xd7, - 0x4f, 0xf4, 0xe6, 0x48, 0xf5, 0x66, 0xf0, 0x7d, 0x96, 0x1a, 0x1c, 0x51, 0xe7, 0x43, 0x0f, 0xb2, - 0xc8, 0x69, 0xf4, 0xef, 0x67, 0xd0, 0x64, 0x63, 0x6e, 0xa5, 0x2e, 0x9c, 0x12, 0xdd, 0x66, 0x5e, - 0x3e, 0xe0, 0x6f, 0xc2, 0xba, 0xf4, 0x42, 0xcc, 0x9e, 0xb9, 0x53, 0xb3, 0xbc, 0x17, 0x6f, 0xbe, - 0xad, 0xb7, 0x7b, 0x04, 0x8e, 0x14, 0x98, 0x4f, 0xa0, 0x6b, 0xbe, 0x4f, 0x7e, 0x1c, 0x5e, 0xf2, - 0xfa, 0x0c, 0xf0, 0x67, 0x51, 0xe6, 0x0e, 0xbf, 0xad, 0xed, 0xc7, 0xe7, 0xf9, 0x1b, 0x8c, 0x0f, - 0x9d, 0x04, 0x33, 0x3d, 0xd3, 0x00, 0x0e, 0xb4, 0x14, 0x2d, 0x7c, 0x8b, 0x2f, 0xc0, 0x7b, 0x2a, - 0xbc, 0xe6, 0x17, 0xbe, 0x55, 0xab, 0xe0, 0x06, 0x1a, 0xab, 0x13, 0xa7, 0x63, 0x42, 0x47, 0xf9, - 0x73, 0xf6, 0x60, 0x26, 0x74, 0xa7, 0x32, 0xd6, 0x0d, 0x0b, 0x01, 0x33, 0x91, 0x0b, 0x7e, 0x07, - 0x21, 0x66, 0xa3, 0xec, 0x31, 0x7a, 0xd8, 0x45, 0xb0, 0xfb, 0x99, 0x69, 0x99, 0x60, 0xe3, 0x09, - 0xcc, 0xf0, 0x06, 0x2a, 0x2c, 0xda, 0x86, 0x79, 0xcf, 0x64, 0x6e, 0x59, 0x50, 0x41, 0x6e, 0x77, - 0x67, 0x08, 0x6a, 0x4a, 0x76, 0x84, 0x72, 0x49, 0xd5, 0xc4, 0x18, 0xab, 0xff, 0x60, 0x18, 0x65, - 0x69, 0xb7, 0x9f, 0x8c, 0xdf, 0xc3, 0x8c, 0xdf, 0x12, 0x2a, 0xdc, 0xb5, 0x9d, 0x0d, 0xd3, 0x5a, - 0x0b, 0x3c, 0x66, 0xf9, 0xde, 0x14, 0x6e, 0xf9, 0x37, 0x19, 0xae, 0x19, 0x38, 0xd7, 0x6a, 0x31, - 0xf2, 0x5d, 0x46, 0xf0, 0xcb, 0x08, 0xad, 0xe8, 0xce, 0x1a, 0xf1, 0x80, 0x26, 0x1f, 0xbe, 0x3e, - 0xf7, 0x00, 0x0a, 0x4e, 0xb8, 0xe2, 0xeb, 0xf3, 0x90, 0x98, 0x6e, 0xc2, 0xd9, 0x3d, 0xe9, 0x28, - 0xf8, 0xe4, 0xc2, 0x26, 0x1c, 0xee, 0x49, 0x45, 0x23, 0x80, 0xdd, 0x98, 0xd6, 0x11, 0x12, 0xce, - 0x9e, 0x51, 0x44, 0x10, 0xd2, 0xe4, 0xc0, 0xc3, 0x23, 0x25, 0x1c, 0x3d, 0x6b, 0x02, 0x0f, 0xfc, - 0x62, 0xe4, 0x72, 0x0c, 0x4b, 0xdc, 0xfa, 0xde, 0x8d, 0x85, 0xce, 0x15, 0xe3, 0xbb, 0x39, 0x57, - 0xa8, 0x5f, 0x4b, 0xa3, 0xd1, 0x46, 0x6f, 0xd5, 0xdd, 0x72, 0x3d, 0xd2, 0x39, 0xe6, 0x6a, 0xec, - 0x6f, 0xaf, 0xb2, 0x89, 0xdb, 0xab, 0xa7, 0x7c, 0xa1, 0x08, 0x27, 0x73, 0x81, 0x49, 0xe7, 0x8b, - 0xe3, 0x6f, 0xa5, 0x51, 0x81, 0x1d, 0xaa, 0x57, 0x4c, 0xb7, 0xf5, 0x10, 0x1c, 0x7d, 0x8f, 0x5e, - 0x2a, 0x87, 0xbb, 0x88, 0xda, 0x83, 0xfb, 0xb4, 0xfa, 0x95, 0x34, 0x1a, 0x2b, 0xf5, 0xbc, 0xf5, - 0x92, 0x07, 0xba, 0xf5, 0x48, 0xee, 0x4f, 0x7e, 0x35, 0x85, 0xa6, 0x68, 0x43, 0x56, 0xec, 0x0d, - 0x62, 0x3d, 0x84, 0x83, 0x47, 0xf1, 0x00, 0x31, 0x7d, 0xc0, 0x03, 0x44, 0x5f, 0x96, 0x99, 0x7d, - 0x1e, 0xa4, 0x7e, 0x23, 0x85, 0x90, 0x66, 0xb7, 0xc9, 0xc7, 0xe4, 0x33, 0x1e, 0xc2, 0xb5, 0xc3, - 0x47, 0xe1, 0x33, 0x1e, 0xc2, 0x39, 0xce, 0x51, 0x7e, 0xc6, 0xaf, 0xa7, 0xd0, 0x19, 0x1e, 0xe9, - 0x92, 0xef, 0xa7, 0x8e, 0xb9, 0x7a, 0xc5, 0x3f, 0xe8, 0x98, 0xf7, 0xd0, 0x4f, 0x66, 0xd0, 0x19, - 0x88, 0x24, 0x46, 0x4d, 0xba, 0x8f, 0xc1, 0x3c, 0x86, 0x5b, 0xf2, 0x05, 0xca, 0x62, 0xc2, 0x05, - 0xca, 0x1f, 0x6c, 0x17, 0x5f, 0x5c, 0x33, 0xbd, 0xf5, 0xde, 0xea, 0x4c, 0xcb, 0xee, 0x5c, 0x5f, - 0x73, 0xf4, 0xfb, 0x26, 0xbb, 0x3a, 0xd0, 0xdb, 0xd7, 0x83, 0x00, 0xcd, 0x7a, 0xd7, 0xe4, 0xa1, - 0x9b, 0x1b, 0x60, 0x27, 0x51, 0xae, 0xfe, 0xd5, 0x8b, 0x8b, 0xd0, 0x9b, 0xb6, 0x69, 0x71, 0x5f, - 0x05, 0xb6, 0x48, 0x36, 0xa8, 0x6d, 0xf9, 0x9e, 0x6d, 0x5a, 0xcd, 0xa8, 0xc3, 0xc2, 0x7e, 0xeb, - 0x0b, 0x59, 0x6b, 0x42, 0x35, 0xea, 0xbf, 0x4a, 0xa1, 0xc7, 0x64, 0xdd, 0xfb, 0x38, 0xac, 0x3b, - 0xff, 0x22, 0x85, 0xce, 0xde, 0x02, 0xe1, 0x04, 0xd7, 0xa4, 0x1f, 0xbf, 0x2f, 0x3a, 0xe6, 0xab, - 0x51, 0xc2, 0x17, 0x1d, 0xf3, 0x69, 0xef, 0xd7, 0x52, 0xe8, 0xf4, 0x72, 0xad, 0x52, 0xfe, 0xb8, - 0xe8, 0x5c, 0xec, 0x7b, 0x8e, 0xb9, 0xc6, 0xc5, 0xbe, 0xe7, 0x63, 0xa0, 0x6f, 0x8d, 0xd2, 0xe2, - 0xc2, 0xc7, 0x49, 0xdf, 0xa4, 0xef, 0xf9, 0x18, 0xe8, 0x9b, 0xf4, 0x3d, 0xc7, 0x5c, 0xdf, 0xbe, - 0x91, 0x43, 0x63, 0xb7, 0x7b, 0xab, 0x84, 0x5f, 0xb8, 0x3e, 0xd2, 0xa7, 0x19, 0x37, 0xd0, 0x18, - 0x17, 0x03, 0x9c, 0x04, 0x0a, 0xc1, 0x62, 0xf8, 0xe3, 0x5f, 0xf6, 0x1e, 0x5f, 0x24, 0xc2, 0x17, - 0x50, 0xf6, 0x6d, 0xe2, 0xac, 0x8a, 0xef, 0x28, 0xee, 0x13, 0x67, 0x55, 0x03, 0x28, 0x5e, 0x08, - 0xdd, 0x1b, 0x4b, 0xf5, 0x1a, 0x04, 0xc7, 0xe6, 0x87, 0x90, 0x10, 0xed, 0x3b, 0xf0, 0xe5, 0xd0, - 0xbb, 0x26, 0x0b, 0xab, 0x2d, 0xbe, 0xe1, 0x8a, 0x96, 0xc4, 0x4b, 0xe8, 0x94, 0x78, 0x99, 0xcf, - 0x22, 0x43, 0xe7, 0x13, 0xd8, 0x25, 0xc5, 0x84, 0x8e, 0x17, 0xc5, 0xaf, 0xa3, 0x71, 0x1f, 0x08, - 0x6e, 0x09, 0xa3, 0x61, 0x7c, 0xd5, 0x80, 0x55, 0x24, 0x64, 0xbc, 0x54, 0x40, 0x64, 0x00, 0x47, - 0x6b, 0x28, 0x81, 0x41, 0xc4, 0xcd, 0x43, 0x2a, 0x80, 0x5f, 0x00, 0x06, 0x5d, 0xdb, 0x72, 0x09, - 0x5c, 0xc0, 0x8e, 0xc1, 0x23, 0x03, 0x70, 0x9f, 0x74, 0x38, 0x9c, 0x3d, 0x25, 0x91, 0xc8, 0xf0, - 0x32, 0x42, 0xe1, 0x45, 0x19, 0x7f, 0xb0, 0xb7, 0xef, 0x2b, 0x3c, 0x81, 0x85, 0x78, 0xc4, 0x3d, - 0x71, 0x90, 0x23, 0x6e, 0xf5, 0x37, 0xd3, 0x68, 0xac, 0xd4, 0xed, 0x06, 0x43, 0xe1, 0x59, 0x94, - 0x2b, 0x75, 0xbb, 0x77, 0xb4, 0x9a, 0x18, 0x6f, 0x53, 0xef, 0x76, 0x9b, 0x3d, 0xc7, 0x14, 0xfd, - 0x9c, 0x18, 0x11, 0x2e, 0xa3, 0x89, 0x52, 0xb7, 0x5b, 0xef, 0xad, 0xb6, 0xcd, 0x96, 0x10, 0xed, - 0x9e, 0x65, 0xc3, 0xe8, 0x76, 0x9b, 0x5d, 0xc0, 0x44, 0xd3, 0x15, 0xc8, 0x65, 0xf0, 0xbb, 0xf0, - 0xcc, 0x9d, 0x07, 0x5b, 0xcf, 0x80, 0x27, 0x91, 0x1a, 0x44, 0xda, 0x0c, 0xdb, 0x36, 0x13, 0x10, - 0xb1, 0x88, 0xa4, 0x17, 0xfc, 0xb8, 0xae, 0xb4, 0xa2, 0x58, 0x50, 0xf5, 0x90, 0x25, 0xfe, 0x34, - 0x1a, 0x29, 0x75, 0xbb, 0xc2, 0x19, 0x2a, 0x5c, 0x94, 0xd3, 0x52, 0x91, 0x3e, 0xf6, 0xc9, 0xa6, - 0x5f, 0x45, 0x93, 0x72, 0x65, 0xfb, 0x8a, 0x68, 0xfa, 0xed, 0x14, 0x7c, 0xd0, 0x31, 0xf7, 0xd3, - 0x7b, 0x1e, 0x65, 0x4a, 0xdd, 0x2e, 0x9f, 0x8f, 0x4e, 0x27, 0xf4, 0x47, 0xf4, 0xc9, 0x4f, 0xa9, - 0xdb, 0xf5, 0x3f, 0xfd, 0x98, 0xbb, 0xc4, 0x1e, 0xe8, 0xd3, 0xbf, 0xce, 0x3e, 0xfd, 0x98, 0x3b, - 0xbe, 0xfe, 0x7c, 0x06, 0x4d, 0x95, 0xba, 0xdd, 0x93, 0xa0, 0xaa, 0x0f, 0xeb, 0x61, 0xd1, 0x73, - 0x08, 0x09, 0xd3, 0xe3, 0x48, 0xe0, 0x66, 0x3f, 0x26, 0x4c, 0x8d, 0x4a, 0x4a, 0x13, 0x88, 0x7c, - 0xf5, 0xcb, 0xef, 0x4b, 0xfd, 0xbe, 0x92, 0x81, 0xa9, 0xf8, 0xb8, 0x07, 0x49, 0xf8, 0xa8, 0x74, - 0x1b, 0xef, 0x83, 0xdc, 0xbe, 0xfa, 0xe0, 0x57, 0xa4, 0xc1, 0x03, 0x41, 0x3a, 0x4f, 0x7a, 0x61, - 0xf8, 0x50, 0x66, 0xf1, 0xa4, 0x28, 0x4c, 0xfe, 0x72, 0xdb, 0x8f, 0xf6, 0xcf, 0xe3, 0x08, 0xb4, - 0x28, 0xaa, 0x69, 0x1a, 0x5a, 0x84, 0xd6, 0xef, 0xc3, 0x91, 0x7d, 0xf5, 0xe1, 0x76, 0x1a, 0xde, - 0x0a, 0x05, 0x71, 0x08, 0x0e, 0xbf, 0xbb, 0xb8, 0x8e, 0x10, 0xbb, 0x4d, 0x0b, 0x5c, 0xf5, 0x26, - 0xd8, 0x93, 0x63, 0x96, 0x04, 0x80, 0x3f, 0x39, 0x0e, 0x49, 0x82, 0x5b, 0xff, 0x4c, 0xe2, 0xad, - 0xff, 0x55, 0x94, 0xd7, 0xf4, 0xcd, 0xb7, 0x7a, 0xc4, 0xd9, 0xe2, 0xe6, 0x0c, 0x0b, 0xf3, 0xa3, - 0x6f, 0x36, 0xbf, 0x4c, 0x81, 0x5a, 0x80, 0xc6, 0x6a, 0xf0, 0xd8, 0x4c, 0xb8, 0xe5, 0x64, 0x67, - 0xb7, 0xc1, 0x13, 0xb3, 0x83, 0x28, 0x3a, 0x7e, 0x05, 0x65, 0x4a, 0x77, 0x1b, 0x5c, 0xb2, 0x41, - 0xd7, 0x96, 0xee, 0x36, 0xb8, 0xbc, 0xfa, 0x96, 0xbd, 0xdb, 0x50, 0xbf, 0x92, 0x46, 0x38, 0x4e, - 0x89, 0x5f, 0x44, 0xa3, 0x00, 0x5d, 0xa3, 0x3a, 0x23, 0x26, 0x5b, 0xda, 0x74, 0x9b, 0x0e, 0x40, - 0x25, 0xe3, 0xce, 0x27, 0xc5, 0x2f, 0x43, 0x32, 0x37, 0x9e, 0x31, 0x44, 0x4a, 0xb6, 0xb4, 0xe9, - 0xfa, 0xe9, 0xcf, 0x22, 0xb9, 0xdc, 0x38, 0x31, 0xd8, 0x85, 0x77, 0x1b, 0xf3, 0xb6, 0xeb, 0x71, - 0x51, 0x33, 0xbb, 0x70, 0xd3, 0x85, 0x0c, 0x5d, 0x92, 0x5d, 0xc8, 0xc8, 0x20, 0xf5, 0xc2, 0xdd, - 0x06, 0x73, 0xbd, 0x36, 0x34, 0xbb, 0xed, 0x1b, 0x94, 0x2c, 0xf5, 0xc2, 0xa6, 0xdb, 0x64, 0x6e, - 0xdb, 0x06, 0x64, 0x91, 0x93, 0x52, 0x2f, 0x48, 0xa5, 0xd4, 0x1f, 0xcc, 0xa3, 0x42, 0x45, 0xf7, - 0xf4, 0x55, 0xdd, 0x25, 0xc2, 0x6e, 0x7a, 0xca, 0x87, 0xf9, 0x9f, 0x23, 0xc8, 0xc1, 0x58, 0x4d, - 0xf8, 0x9a, 0x68, 0x01, 0xfc, 0xd9, 0x90, 0x6f, 0x90, 0x47, 0x4a, 0xcc, 0xb4, 0xb1, 0xda, 0xec, - 0x72, 0xb0, 0x16, 0x23, 0xc4, 0xd7, 0xd0, 0x98, 0x0f, 0xa3, 0x1b, 0x80, 0x4c, 0xa8, 0x33, 0xc6, - 0x2a, 0xb5, 0xff, 0x35, 0x11, 0x8d, 0x5f, 0x46, 0xe3, 0xfe, 0x4f, 0xc1, 0xb4, 0x66, 0x69, 0x43, - 0x56, 0x63, 0xbb, 0x27, 0x91, 0x54, 0x2c, 0x0a, 0xf3, 0xdb, 0xb0, 0x54, 0x34, 0x92, 0x99, 0x43, - 0x22, 0xc5, 0x5f, 0x46, 0x93, 0xfe, 0x6f, 0xbe, 0x61, 0x60, 0x49, 0x4c, 0xae, 0x05, 0x49, 0xea, - 0x22, 0x62, 0x9d, 0x91, 0xc9, 0xd9, 0xd6, 0xe1, 0x71, 0x3f, 0xd9, 0x84, 0xb1, 0x1a, 0xdf, 0x39, - 0x44, 0x2a, 0xc0, 0x35, 0x74, 0xca, 0x87, 0x84, 0x1a, 0x3a, 0x12, 0xee, 0x18, 0x8d, 0xd5, 0x66, - 0xa2, 0x92, 0xc6, 0x4b, 0xe1, 0x36, 0xba, 0x20, 0x01, 0x0d, 0x77, 0xdd, 0xbc, 0xe7, 0xf1, 0xed, - 0x1e, 0x8f, 0xb9, 0xc7, 0x93, 0xf1, 0x04, 0x5c, 0x19, 0x8d, 0x9f, 0x55, 0x4b, 0x4e, 0x61, 0x30, - 0x90, 0x1b, 0x6e, 0xa0, 0x33, 0x3e, 0xfe, 0x56, 0xb9, 0x5e, 0x77, 0xec, 0xf7, 0x48, 0xcb, 0xab, - 0x55, 0xf8, 0x76, 0x19, 0x62, 0xb1, 0x18, 0xab, 0xcd, 0xb5, 0x56, 0x97, 0x2a, 0x05, 0xc5, 0xc9, - 0xcc, 0x13, 0x0b, 0xe3, 0xb7, 0xd1, 0x59, 0x01, 0x5e, 0xb3, 0x5c, 0x4f, 0xb7, 0x5a, 0xa4, 0x56, - 0xe1, 0x7b, 0x68, 0xd8, 0xcf, 0x73, 0xae, 0x26, 0x47, 0xca, 0x6c, 0x93, 0x8b, 0xe3, 0x57, 0xd1, - 0x84, 0x8f, 0x60, 0xb7, 0x5b, 0x63, 0x70, 0xbb, 0x05, 0x43, 0xd2, 0x58, 0x6d, 0x46, 0x5f, 0x08, - 0xc9, 0xc4, 0xa2, 0x46, 0x41, 0x8e, 0xd0, 0x71, 0x49, 0xa3, 0xbc, 0xad, 0x6e, 0xa2, 0x32, 0x42, - 0xde, 0xd0, 0xd7, 0x43, 0x8d, 0x5a, 0x76, 0xcc, 0x35, 0x93, 0xed, 0xa4, 0xfd, 0x47, 0x41, 0xab, - 0x4d, 0x1b, 0x80, 0x49, 0xfa, 0xc1, 0xc8, 0xa7, 0x4b, 0xe8, 0x74, 0x82, 0x8e, 0xed, 0x6b, 0xc7, - 0xf8, 0xb5, 0x74, 0xd8, 0x88, 0x63, 0xbe, 0x6d, 0x9c, 0x45, 0x79, 0xff, 0x4b, 0xb8, 0xf1, 0xa0, - 0xf4, 0x1b, 0x9a, 0x51, 0x1e, 0x3e, 0x5e, 0x12, 0xc7, 0x31, 0xdf, 0x4a, 0x3e, 0x0c, 0x71, 0x7c, - 0x90, 0x0a, 0xc5, 0x71, 0xcc, 0xb7, 0x97, 0xbf, 0x96, 0x09, 0xe7, 0xa4, 0x93, 0x3d, 0xe6, 0xc3, - 0x32, 0x93, 0x43, 0xdf, 0xae, 0xdc, 0x3e, 0x1e, 0xe7, 0x88, 0xaa, 0x39, 0x72, 0x40, 0xd5, 0xfc, - 0xad, 0x78, 0x7f, 0x32, 0xd3, 0xf3, 0x58, 0xf6, 0xe7, 0x43, 0x18, 0xac, 0xf8, 0x46, 0xb8, 0x8e, - 0x31, 0x1b, 0x7d, 0x58, 0x08, 0x69, 0xb3, 0xca, 0x4d, 0x74, 0x99, 0x04, 0x7f, 0x11, 0x9d, 0x97, - 0x00, 0x75, 0xdd, 0xd1, 0x3b, 0xc4, 0x0b, 0xd3, 0xe2, 0x40, 0x90, 0x02, 0xbf, 0x74, 0xb3, 0x1b, - 0xa0, 0xc5, 0x54, 0x3b, 0x7d, 0x38, 0x08, 0xca, 0x31, 0xb2, 0x0f, 0xc7, 0xbf, 0xff, 0x94, 0x46, - 0x13, 0x75, 0xdb, 0xf5, 0xd6, 0x1c, 0xe2, 0xd6, 0x75, 0xc7, 0x25, 0x8f, 0x6e, 0x8f, 0x7e, 0x06, - 0x4d, 0xc0, 0xe3, 0xd7, 0x0e, 0xb1, 0x3c, 0x21, 0x5d, 0x23, 0x0b, 0xb3, 0xe9, 0x23, 0x78, 0x44, - 0x65, 0x89, 0x10, 0x17, 0xd1, 0x30, 0xd3, 0x01, 0xe1, 0x49, 0x32, 0x53, 0x00, 0x06, 0x57, 0xff, - 0x4a, 0x06, 0x8d, 0xfb, 0x52, 0x9e, 0x35, 0x8f, 0xeb, 0x99, 0xcd, 0xd1, 0x0a, 0xf9, 0x3a, 0x42, - 0x75, 0xdb, 0xf1, 0xf4, 0xb6, 0x90, 0x69, 0x1d, 0x36, 0x3b, 0x5d, 0x80, 0xb2, 0x32, 0x02, 0x09, - 0x9e, 0x41, 0x48, 0x18, 0x60, 0x23, 0x30, 0xc0, 0x26, 0x77, 0xb6, 0x8b, 0x28, 0x1c, 0x57, 0x9a, - 0x40, 0xa1, 0xfe, 0x52, 0x1a, 0x4d, 0xf9, 0x9d, 0x54, 0x7d, 0x40, 0x5a, 0x3d, 0xef, 0x11, 0x1e, - 0x0c, 0xb2, 0xb4, 0x87, 0x77, 0x95, 0xb6, 0xfa, 0xdf, 0x85, 0x89, 0xa4, 0xdc, 0xb6, 0x4f, 0x26, - 0x92, 0x3f, 0x0a, 0x1d, 0x57, 0xbf, 0x3b, 0x83, 0xce, 0xf8, 0x52, 0x9f, 0xeb, 0x59, 0x60, 0x26, - 0x94, 0xf5, 0x76, 0xfb, 0x51, 0x5e, 0x97, 0xc7, 0x7c, 0x41, 0x2c, 0xf3, 0x68, 0x12, 0x3c, 0xba, - 0xfd, 0x3d, 0x0e, 0x6e, 0xda, 0xa6, 0xa1, 0x89, 0x44, 0xf8, 0x75, 0x34, 0xee, 0xff, 0x2c, 0x39, - 0x6b, 0xfe, 0x62, 0x0c, 0x9b, 0xfe, 0xa0, 0x90, 0xee, 0x48, 0x8f, 0x66, 0xa4, 0x02, 0xea, 0x7f, - 0xce, 0xa1, 0xe9, 0xbb, 0xa6, 0x65, 0xd8, 0x9b, 0xae, 0x9f, 0x1c, 0xe1, 0xd8, 0x1b, 0xbd, 0x47, - 0x9d, 0x14, 0xe1, 0x2d, 0x74, 0x36, 0x2a, 0x52, 0x27, 0x08, 0x59, 0xc5, 0x7b, 0x67, 0x93, 0x11, - 0x34, 0xfd, 0x34, 0x09, 0xfc, 0xe4, 0x4c, 0x4b, 0x2e, 0x19, 0xcd, 0xb3, 0x30, 0xb2, 0x97, 0x3c, - 0x0b, 0xcf, 0xa0, 0x5c, 0xc5, 0xee, 0xe8, 0xa6, 0xff, 0x7c, 0x12, 0x46, 0x71, 0x50, 0x2f, 0x60, - 0x34, 0x4e, 0x41, 0xf9, 0xf3, 0x8a, 0xa1, 0xcb, 0x46, 0x43, 0xfe, 0x7e, 0x81, 0x9e, 0x4b, 0x1c, - 0x4d, 0x24, 0xc2, 0x36, 0x9a, 0xe0, 0xd5, 0xf1, 0x73, 0x2e, 0x04, 0xe7, 0x5c, 0x41, 0x0a, 0xca, - 0xfe, 0x6a, 0x35, 0x23, 0x95, 0x63, 0x07, 0x5e, 0x2c, 0xfd, 0x03, 0xff, 0x18, 0x76, 0xe2, 0xa5, - 0xc9, 0xfc, 0x05, 0x21, 0xc0, 0x24, 0x33, 0x16, 0x17, 0x02, 0xcc, 0x32, 0x22, 0x11, 0xae, 0xa2, - 0x53, 0xa5, 0x76, 0xdb, 0xde, 0x0c, 0x62, 0x43, 0x51, 0x95, 0x18, 0x87, 0xf8, 0xb8, 0x70, 0x7c, - 0xa2, 0x53, 0x24, 0x7c, 0x5c, 0xb3, 0xc5, 0xd1, 0x5a, 0xbc, 0xc4, 0xf4, 0x1b, 0x08, 0xc7, 0xdb, - 0xbc, 0xaf, 0x03, 0x94, 0x1f, 0x4c, 0x23, 0x1c, 0xd9, 0x87, 0x54, 0x1f, 0x61, 0x73, 0x4a, 0xfd, - 0x99, 0x14, 0x3a, 0x15, 0x8b, 0xd9, 0x86, 0x9f, 0x47, 0x88, 0x41, 0x84, 0xa0, 0x1f, 0xf0, 0x8a, - 0x2e, 0x8c, 0xe3, 0xc6, 0x97, 0x92, 0x90, 0x0c, 0x5f, 0x47, 0x79, 0xf6, 0x2b, 0xc8, 0xa8, 0x1a, - 0x2d, 0xd2, 0xeb, 0x99, 0x86, 0x16, 0x10, 0x85, 0xb5, 0xc0, 0x49, 0x5c, 0x26, 0xb1, 0x88, 0xb7, - 0xd5, 0x0d, 0x6a, 0xa1, 0x64, 0xea, 0xd7, 0x53, 0x68, 0x3c, 0x68, 0x70, 0xc9, 0x38, 0xaa, 0xae, - 0xcb, 0xf1, 0xf0, 0x77, 0x99, 0xdd, 0xc2, 0xdf, 0x45, 0xe6, 0x26, 0x86, 0x55, 0xff, 0x49, 0x0a, - 0x4d, 0x05, 0xb4, 0x47, 0x78, 0x54, 0x73, 0xe8, 0x0f, 0xf9, 0xa1, 0x14, 0x52, 0x66, 0xcd, 0x76, - 0xdb, 0xb4, 0xd6, 0x6a, 0xd6, 0x3d, 0xdb, 0xe9, 0xc0, 0x40, 0x3d, 0xba, 0xb3, 0x38, 0xf5, 0xfb, - 0x52, 0xe8, 0x14, 0x6f, 0x50, 0x59, 0x77, 0x8c, 0xa3, 0x3b, 0x24, 0x8d, 0xb6, 0xe4, 0xe8, 0x7a, - 0x59, 0xfd, 0x7f, 0x29, 0x84, 0x16, 0xec, 0xd6, 0xc6, 0x31, 0x7f, 0xcf, 0xf2, 0x32, 0xca, 0xb1, - 0x97, 0xc9, 0x7c, 0xb6, 0x3b, 0x35, 0xc3, 0x1e, 0x89, 0xd0, 0x4f, 0x63, 0x88, 0xd9, 0x49, 0x7e, - 0x5f, 0x93, 0x63, 0x2f, 0x9b, 0x35, 0x5e, 0x00, 0x1e, 0x91, 0x51, 0xb2, 0x63, 0xee, 0xcb, 0xfa, - 0x03, 0x29, 0x74, 0x46, 0x23, 0x2d, 0xfb, 0x3e, 0x71, 0xb6, 0xca, 0xb6, 0x41, 0x6e, 0x11, 0x8b, - 0x38, 0x47, 0xa5, 0xdf, 0x7f, 0x1f, 0x42, 0x5b, 0x86, 0x8d, 0xb9, 0xe3, 0x12, 0xe3, 0xf8, 0x04, - 0x58, 0x55, 0xff, 0xce, 0x08, 0x52, 0x12, 0x6d, 0xa3, 0x63, 0x6b, 0x0f, 0xf4, 0x35, 0x78, 0xb3, - 0x0f, 0xcb, 0xe0, 0x1d, 0xde, 0x9f, 0xc1, 0x9b, 0xdb, 0xaf, 0xc1, 0x3b, 0xb2, 0x17, 0x83, 0xb7, - 0x13, 0x35, 0x78, 0xf3, 0x60, 0xf0, 0x3e, 0x3f, 0xd0, 0xe0, 0xad, 0x5a, 0xc6, 0x01, 0xcd, 0xdd, - 0x63, 0x9b, 0x56, 0xe4, 0x20, 0x76, 0xfa, 0x15, 0x3a, 0xb9, 0xb5, 0x6c, 0xc7, 0x20, 0x06, 0x37, - 0xcf, 0xe1, 0x3c, 0xda, 0xe1, 0x30, 0x2d, 0xc0, 0xc6, 0x72, 0xb4, 0x4c, 0xec, 0x25, 0x47, 0xcb, - 0x43, 0x30, 0xe0, 0x7f, 0x3d, 0x85, 0x4e, 0x95, 0x89, 0xe3, 0xb1, 0x40, 0x24, 0x0f, 0xe3, 0x12, - 0xb4, 0x84, 0xa6, 0x04, 0x86, 0x60, 0x8b, 0xa6, 0xc3, 0x8b, 0xdd, 0x16, 0x71, 0xbc, 0xe8, 0xbd, - 0x70, 0x94, 0x9e, 0x56, 0xef, 0xc7, 0x49, 0xe6, 0x63, 0x37, 0xa8, 0xde, 0x87, 0x33, 0x41, 0x9a, - 0xfc, 0x97, 0x16, 0xd0, 0xab, 0x3f, 0x9d, 0x42, 0x97, 0x35, 0x62, 0x91, 0x4d, 0x7d, 0xb5, 0x4d, - 0x04, 0xc6, 0x7c, 0x6e, 0xa7, 0xe3, 0xde, 0x74, 0x3b, 0xba, 0xd7, 0x5a, 0x3f, 0xd4, 0x57, 0xce, - 0xa1, 0x71, 0x71, 0x06, 0xda, 0xc7, 0xec, 0x24, 0x95, 0x53, 0x7f, 0x2f, 0x8d, 0x46, 0x66, 0x6d, - 0xef, 0xd0, 0x39, 0xc6, 0xc3, 0x49, 0x3b, 0xbd, 0x8f, 0x3d, 0xfd, 0xa7, 0xa1, 0x72, 0x21, 0x88, - 0x20, 0x5c, 0xfb, 0xaf, 0xda, 0xb1, 0x60, 0x8b, 0x3e, 0xd9, 0x3e, 0xe3, 0x68, 0xbf, 0x88, 0x46, - 0xe1, 0x25, 0xa9, 0x70, 0xea, 0x06, 0x4e, 0x35, 0x1e, 0x05, 0x46, 0xeb, 0x08, 0x49, 0xf1, 0x17, - 0xa5, 0xd8, 0x27, 0xb9, 0xc3, 0xc7, 0xdd, 0x16, 0xd8, 0xa9, 0x3f, 0x95, 0x45, 0xe3, 0xbe, 0x03, - 0xc4, 0x11, 0xc9, 0xfd, 0x59, 0x94, 0x9b, 0xb7, 0x85, 0x30, 0x86, 0xe0, 0x30, 0xb1, 0x6e, 0xbb, - 0x11, 0x4f, 0x10, 0x4e, 0x84, 0x9f, 0x47, 0xf9, 0x25, 0xdb, 0x10, 0xdd, 0x7d, 0x60, 0x2c, 0x59, - 0xb6, 0x11, 0x7b, 0x2e, 0x11, 0x10, 0xe2, 0xcb, 0x28, 0x0b, 0x9e, 0x52, 0xc2, 0x61, 0x67, 0xc4, - 0x3b, 0x0a, 0xf0, 0x42, 0x8f, 0xe6, 0xf6, 0xdb, 0xa3, 0x23, 0x07, 0xed, 0xd1, 0xfc, 0x43, 0xed, - 0x51, 0xfc, 0x0e, 0x1a, 0x87, 0x9a, 0xfc, 0xe8, 0xde, 0xbb, 0x2f, 0x2b, 0x8f, 0xf1, 0x99, 0x7f, - 0x82, 0xb5, 0x9b, 0xc7, 0xf8, 0x86, 0x09, 0x5f, 0x62, 0xa5, 0xfe, 0x56, 0x0a, 0x8d, 0xdc, 0xb1, - 0x36, 0x2c, 0x7b, 0xf3, 0x70, 0x7a, 0xf2, 0x3c, 0x1a, 0xe3, 0x6c, 0x84, 0x19, 0x11, 0xde, 0xad, - 0xf4, 0x18, 0xb8, 0x09, 0x9c, 0x34, 0x91, 0x0a, 0xbf, 0x1a, 0x14, 0x02, 0x17, 0xc6, 0x4c, 0x18, - 0xbe, 0xd3, 0x2f, 0xd4, 0x92, 0x23, 0x0e, 0x8a, 0xe4, 0xf8, 0x02, 0xcf, 0x50, 0x2f, 0xc4, 0xaf, - 0xa1, 0x4d, 0x61, 0x09, 0xea, 0xd5, 0x7f, 0x9e, 0x46, 0x93, 0x91, 0x63, 0x8a, 0x67, 0xd0, 0x28, - 0x3f, 0x26, 0x30, 0xfd, 0x10, 0x88, 0xe0, 0xe2, 0x18, 0x00, 0xb5, 0x3c, 0xfb, 0xb3, 0x66, 0xe0, - 0xcf, 0xa1, 0x11, 0xdb, 0x85, 0x89, 0x1c, 0xbe, 0x65, 0x32, 0x54, 0xfc, 0xe5, 0x06, 0x6d, 0x3b, - 0x53, 0x69, 0x4e, 0x22, 0xea, 0x91, 0xed, 0xc2, 0xa7, 0xdd, 0x44, 0xa3, 0xba, 0xeb, 0x12, 0xaf, - 0xe9, 0xe9, 0x6b, 0x62, 0x54, 0xc4, 0x00, 0x28, 0xea, 0x34, 0x00, 0x57, 0xf4, 0x35, 0xfc, 0x06, - 0x9a, 0x68, 0x39, 0x04, 0xa6, 0x7a, 0xbd, 0x4d, 0x5b, 0x29, 0x98, 0x62, 0x12, 0x42, 0x3c, 0x19, - 0x0e, 0x11, 0x35, 0x03, 0xbf, 0x8d, 0x26, 0xf8, 0xe7, 0x30, 0xff, 0x22, 0x18, 0x1e, 0x93, 0xe1, - 0xc4, 0xcd, 0x44, 0xc2, 0x3c, 0x8c, 0xb8, 0x9b, 0x99, 0x48, 0x2e, 0xf2, 0x35, 0x04, 0x52, 0xf5, - 0x9b, 0x29, 0x6a, 0x1e, 0x50, 0x40, 0x90, 0xec, 0xb2, 0xb3, 0x4f, 0x5d, 0xe9, 0x84, 0xf1, 0xec, - 0x73, 0xee, 0x80, 0x39, 0x45, 0xe3, 0x58, 0x3c, 0x83, 0x72, 0x86, 0x78, 0xda, 0x70, 0x4e, 0xfe, - 0x08, 0xbf, 0x1e, 0x8d, 0x53, 0xe1, 0x2b, 0x28, 0x4b, 0xcd, 0x3f, 0xbe, 0xdd, 0x4b, 0x5c, 0xab, - 0x34, 0xa0, 0x50, 0xbf, 0x2b, 0x8d, 0xc6, 0x85, 0xaf, 0xb9, 0x71, 0xa8, 0xcf, 0x79, 0x65, 0x6f, - 0xcd, 0xe4, 0x1e, 0x8f, 0x00, 0x0b, 0x9a, 0x7c, 0x33, 0x10, 0xc5, 0x9e, 0x8e, 0xaa, 0xb9, 0x60, - 0x5e, 0xe4, 0x1f, 0x9a, 0xdb, 0xfb, 0x96, 0x81, 0xd2, 0xbf, 0x99, 0xcd, 0xa7, 0x0b, 0x99, 0x37, - 0xb3, 0xf9, 0x6c, 0x61, 0x58, 0xfd, 0x31, 0x0d, 0x0d, 0x2f, 0x5b, 0x64, 0xf9, 0x1e, 0x7e, 0x4e, - 0xc8, 0x78, 0xc1, 0x3f, 0xfe, 0x94, 0xc8, 0x12, 0x10, 0xf3, 0x43, 0x9a, 0x90, 0x17, 0xe3, 0xa6, - 0x18, 0xb6, 0x9f, 0xf7, 0x22, 0x16, 0xcb, 0x30, 0xcc, 0xfc, 0x90, 0x26, 0x86, 0xf7, 0xbf, 0x29, - 0x86, 0x70, 0xe7, 0xc2, 0x92, 0x4a, 0x31, 0x8c, 0x5f, 0x8a, 0x6f, 0xbe, 0x17, 0x92, 0x22, 0xa6, - 0x47, 0xef, 0x07, 0xe2, 0x14, 0xf3, 0x43, 0x5a, 0x72, 0xa4, 0xf5, 0x71, 0xf1, 0x4c, 0x9b, 0x8b, - 0xfd, 0x4c, 0x64, 0xeb, 0x04, 0xb8, 0xf9, 0x21, 0x4d, 0xa2, 0xc5, 0x2f, 0x05, 0x79, 0x71, 0xe8, - 0xb2, 0x1a, 0x75, 0x6d, 0x16, 0x50, 0xf3, 0x43, 0x9a, 0x48, 0x29, 0x54, 0x5a, 0x77, 0xcc, 0x20, - 0x69, 0x45, 0xb4, 0x52, 0xc0, 0x09, 0x95, 0xc2, 0x6f, 0xfc, 0x5a, 0x24, 0x3b, 0x31, 0x5f, 0x5b, - 0xce, 0x46, 0x0a, 0x33, 0xe4, 0xfc, 0x90, 0x16, 0xc9, 0x65, 0x7c, 0xc5, 0xcf, 0x88, 0xca, 0x17, - 0x8d, 0x49, 0xe1, 0xf0, 0xc1, 0x7c, 0x9f, 0x4a, 0xc9, 0xcf, 0x98, 0x7a, 0x53, 0xcc, 0x84, 0xc9, - 0x37, 0x17, 0x38, 0x52, 0x4b, 0xd5, 0x32, 0x68, 0xef, 0x08, 0x3b, 0xdf, 0x37, 0xa2, 0x39, 0xe3, - 0x78, 0x26, 0xc2, 0x73, 0x91, 0x92, 0x1c, 0x3b, 0x3f, 0xa4, 0x45, 0x73, 0xcc, 0xbd, 0x24, 0xe5, - 0x2b, 0xe3, 0x8f, 0x17, 0xa3, 0x52, 0xa5, 0x28, 0x41, 0xaa, 0x90, 0xd9, 0xec, 0x8d, 0x68, 0x02, - 0x2d, 0xfe, 0x54, 0xf1, 0x5c, 0x72, 0x9a, 0x25, 0xa1, 0x6a, 0x3f, 0xe1, 0xd6, 0x4b, 0x52, 0xa2, - 0x23, 0xc8, 0x25, 0x98, 0x50, 0xb5, 0xee, 0xe9, 0x62, 0xd5, 0x6c, 0xc8, 0x4b, 0x29, 0x77, 0x20, - 0xb4, 0x77, 0xbc, 0x43, 0x01, 0x27, 0x74, 0x28, 0x4b, 0xcf, 0xf3, 0x92, 0x14, 0xbe, 0x99, 0xc7, - 0xee, 0x0e, 0x2a, 0x15, 0x50, 0xb4, 0x52, 0x31, 0xd0, 0xf3, 0x4d, 0x31, 0xaa, 0xb1, 0x72, 0x4a, - 0xee, 0xa0, 0x10, 0x43, 0x3b, 0x48, 0x88, 0x7e, 0x5c, 0x84, 0x88, 0xa9, 0x0a, 0x06, 0xf2, 0xb1, - 0xa0, 0x85, 0xe5, 0xfa, 0xfc, 0x90, 0x06, 0xb1, 0x54, 0x55, 0x16, 0x8b, 0x57, 0x39, 0x0d, 0x14, - 0xe3, 0x41, 0x42, 0xa9, 0x07, 0xa4, 0x35, 0x3f, 0xa4, 0xb1, 0x38, 0xbd, 0xcf, 0x09, 0x51, 0xef, - 0x94, 0x33, 0xf2, 0x14, 0x11, 0x20, 0xe8, 0x14, 0x11, 0xc6, 0xc6, 0x9b, 0x8b, 0x47, 0x86, 0x53, - 0xce, 0xca, 0xe7, 0x5f, 0x51, 0xfc, 0xfc, 0x90, 0x16, 0x8f, 0x26, 0xf7, 0x92, 0x14, 0x2c, 0x4d, - 0x39, 0x17, 0x79, 0x4f, 0x10, 0xa2, 0xa8, 0xb8, 0xc4, 0xb0, 0x6a, 0xcb, 0x89, 0xe9, 0x0d, 0x94, - 0xf3, 0xc0, 0xe0, 0xf1, 0x80, 0x41, 0x9c, 0x64, 0x7e, 0x48, 0x4b, 0x4c, 0x8c, 0x50, 0x8e, 0x85, - 0x2c, 0x53, 0x14, 0xf9, 0xe0, 0x25, 0x82, 0x9e, 0x1f, 0xd2, 0x62, 0x41, 0xce, 0x6e, 0x8a, 0xb1, - 0xc2, 0x94, 0xc7, 0xe4, 0x4e, 0x0c, 0x31, 0xb4, 0x13, 0x85, 0x98, 0x62, 0x37, 0xc5, 0x98, 0x56, - 0xca, 0x74, 0xbc, 0x54, 0x38, 0x73, 0x0a, 0xb1, 0xaf, 0xb4, 0xe4, 0x10, 0x52, 0xca, 0xe3, 0x3c, - 0x28, 0x29, 0x2f, 0x9f, 0x44, 0x33, 0x3f, 0xa4, 0x25, 0x87, 0x9f, 0xd2, 0x92, 0xa3, 0x38, 0x29, - 0x17, 0x06, 0xf1, 0x0c, 0x5a, 0x97, 0x1c, 0x01, 0x4a, 0x1f, 0x10, 0x9d, 0x47, 0xb9, 0x28, 0x3f, - 0x66, 0xee, 0x4b, 0x38, 0x3f, 0xa4, 0x0d, 0x88, 0xf1, 0x73, 0xa7, 0x4f, 0xa8, 0x1c, 0xe5, 0x92, - 0x1c, 0x93, 0x38, 0x91, 0x68, 0x7e, 0x48, 0xeb, 0x13, 0x68, 0xe7, 0x4e, 0x9f, 0xe8, 0x2e, 0x4a, - 0x71, 0x20, 0xdb, 0x40, 0x1e, 0x7d, 0x62, 0xc3, 0x2c, 0x27, 0x86, 0x58, 0x51, 0x9e, 0x90, 0x55, - 0x37, 0x81, 0x84, 0xaa, 0x6e, 0x52, 0x70, 0x96, 0xe5, 0xc4, 0x98, 0x20, 0xca, 0x93, 0x03, 0x18, - 0x06, 0x6d, 0x4c, 0x8c, 0x26, 0xb2, 0x9c, 0x18, 0x94, 0x43, 0x51, 0x65, 0x86, 0x09, 0x24, 0x94, - 0x61, 0x52, 0x38, 0x8f, 0xe5, 0xc4, 0x28, 0x12, 0xca, 0x53, 0x03, 0x18, 0x86, 0x2d, 0x4c, 0x8a, - 0x3f, 0xf1, 0x92, 0x14, 0xc6, 0x41, 0xf9, 0x84, 0x3c, 0x6f, 0x08, 0x28, 0x3a, 0x6f, 0x88, 0x01, - 0x1f, 0xca, 0xb1, 0x87, 0xaa, 0xca, 0x27, 0xe5, 0x61, 0x1e, 0x41, 0xd3, 0x61, 0x1e, 0x7d, 0xda, - 0x5a, 0x8e, 0x3d, 0xd8, 0x53, 0x2e, 0xf7, 0x63, 0x02, 0x68, 0x99, 0x09, 0x7b, 0xe2, 0x57, 0x4b, - 0x78, 0x31, 0xa6, 0x3c, 0x2d, 0x5f, 0xbc, 0xc5, 0x08, 0xe6, 0x87, 0xb4, 0x84, 0x77, 0x66, 0x5a, - 0xb2, 0x7b, 0xb4, 0x72, 0x45, 0x1e, 0xb6, 0x49, 0x34, 0x74, 0xd8, 0x26, 0xba, 0x56, 0x2f, 0x24, - 0x5d, 0x8d, 0x2b, 0x57, 0x65, 0xc3, 0x2c, 0x4e, 0x41, 0x0d, 0xb3, 0x84, 0x2b, 0x75, 0x2d, 0xd9, - 0xe1, 0x57, 0x79, 0x66, 0x60, 0x0b, 0x81, 0x26, 0xa1, 0x85, 0xcc, 0xff, 0x35, 0xb4, 0x9d, 0xee, - 0x74, 0x21, 0xd1, 0xfc, 0xa7, 0x12, 0x6d, 0x27, 0x86, 0x14, 0x6c, 0x27, 0x06, 0xa0, 0xab, 0xbc, - 0x78, 0x75, 0xac, 0x5c, 0x93, 0x57, 0x79, 0x11, 0x47, 0x57, 0x79, 0xe9, 0x9a, 0xb9, 0x1c, 0xbb, - 0xb0, 0x55, 0x9e, 0x95, 0x15, 0x20, 0x82, 0xa6, 0x0a, 0x10, 0xbd, 0xe2, 0x7d, 0xb7, 0xff, 0x65, - 0xa9, 0x32, 0x03, 0xdc, 0x9e, 0x08, 0x52, 0x66, 0xf6, 0xa1, 0x9b, 0x1f, 0xd2, 0xfa, 0x5f, 0xb8, - 0xd6, 0x12, 0xee, 0x3e, 0x95, 0xeb, 0xb2, 0x82, 0xc5, 0x08, 0xa8, 0x82, 0xc5, 0x6f, 0x4c, 0x6b, - 0x09, 0x97, 0x97, 0xca, 0xa7, 0xfb, 0xb2, 0x0a, 0xbe, 0x39, 0xe1, 0xca, 0xf3, 0xa6, 0x78, 0xfb, - 0xa8, 0x3c, 0x27, 0x2f, 0x76, 0x21, 0x86, 0x2e, 0x76, 0xc2, 0x2d, 0xe5, 0x4d, 0xf1, 0xc6, 0x4e, - 0xb9, 0x11, 0x2f, 0x15, 0x2e, 0x91, 0xc2, 0xcd, 0x9e, 0x96, 0x7c, 0x41, 0xa6, 0x3c, 0x2f, 0x6b, - 0x5d, 0x12, 0x0d, 0xd5, 0xba, 0xc4, 0xcb, 0xb5, 0xb9, 0xf8, 0x3d, 0x97, 0x72, 0x33, 0x7a, 0xf3, - 0x27, 0xe3, 0xa9, 0xe5, 0x13, 0xbb, 0x1b, 0x7b, 0x23, 0xfa, 0x76, 0x47, 0x79, 0x21, 0xb2, 0xbf, - 0x94, 0xb0, 0xd4, 0xbe, 0x8d, 0xbc, 0xf5, 0x79, 0x23, 0xfa, 0xdc, 0x45, 0x79, 0x31, 0x99, 0x43, - 0xa0, 0x2b, 0xd1, 0xe7, 0x31, 0x6f, 0x44, 0x5f, 0x88, 0x28, 0x2f, 0x25, 0x73, 0x08, 0xa4, 0x1b, - 0x7d, 0x51, 0xf2, 0x9c, 0x10, 0xb3, 0x42, 0xf9, 0x8c, 0x6c, 0x3a, 0x06, 0x08, 0x6a, 0x3a, 0x86, - 0x91, 0x2d, 0x9e, 0x13, 0x62, 0x3d, 0x28, 0x2f, 0xc7, 0x8a, 0x04, 0x8d, 0x15, 0x22, 0x42, 0x3c, - 0x27, 0xc4, 0x48, 0x50, 0x5e, 0x89, 0x15, 0x09, 0x5a, 0x27, 0x44, 0x52, 0x30, 0x06, 0xb9, 0xd0, - 0x29, 0x9f, 0x05, 0x1e, 0xea, 0xee, 0x5e, 0x51, 0xf3, 0x43, 0xda, 0x20, 0x57, 0xbc, 0x77, 0xfb, - 0xdf, 0x1a, 0x2a, 0xaf, 0xca, 0x43, 0xb8, 0x1f, 0x1d, 0x1d, 0xc2, 0x7d, 0x6f, 0x1e, 0x5f, 0x8b, - 0xb8, 0xd3, 0x2b, 0xaf, 0xc9, 0x53, 0x9c, 0x84, 0xa4, 0x53, 0x5c, 0xd4, 0xf9, 0x5e, 0xf2, 0x13, - 0x57, 0x3e, 0x27, 0x4f, 0x71, 0x22, 0x8e, 0x4e, 0x71, 0x92, 0x4f, 0x79, 0x39, 0xe6, 0xbe, 0xac, - 0xbc, 0x2e, 0x4f, 0x71, 0x11, 0x34, 0x9d, 0xe2, 0xa2, 0x0e, 0xcf, 0xaf, 0x45, 0xbc, 0x78, 0x95, - 0x37, 0x92, 0xdb, 0x0f, 0x48, 0xb1, 0xfd, 0xcc, 0xe7, 0x57, 0x4b, 0x76, 0x47, 0x55, 0x4a, 0xf2, - 0xf8, 0x4d, 0xa2, 0xa1, 0xe3, 0x37, 0xd1, 0x95, 0x75, 0x39, 0x31, 0x23, 0x90, 0x32, 0x3b, 0x60, - 0xe3, 0x10, 0x9a, 0x22, 0x49, 0xb9, 0x84, 0xc4, 0x3d, 0x32, 0xdb, 0x08, 0x95, 0xfb, 0xec, 0x91, - 0xfd, 0x6d, 0x50, 0x84, 0x9e, 0xce, 0xae, 0xb1, 0x4b, 0x2c, 0xa5, 0x22, 0xcf, 0xae, 0x31, 0x02, - 0x3a, 0xbb, 0xc6, 0xaf, 0xbe, 0xe6, 0x50, 0x81, 0x6b, 0x51, 0x98, 0x44, 0xbf, 0x1a, 0xf1, 0x06, - 0x8b, 0xe0, 0xe9, 0xec, 0x14, 0x85, 0xc1, 0x7a, 0xcd, 0x60, 0xe5, 0xb6, 0xd9, 0x5d, 0xb5, 0x75, - 0xc7, 0x68, 0x10, 0xcb, 0x50, 0xe6, 0x22, 0xeb, 0x75, 0x02, 0x0d, 0xac, 0xd7, 0x09, 0x70, 0x78, - 0xaf, 0x12, 0x81, 0xf3, 0x34, 0xb7, 0xca, 0x2d, 0x60, 0x5b, 0xec, 0xc7, 0x96, 0x93, 0xcd, 0x0f, - 0x69, 0xfd, 0x38, 0x50, 0x5b, 0x7d, 0x71, 0xab, 0xf1, 0xd6, 0x42, 0xe0, 0x01, 0x5d, 0x77, 0x48, - 0x57, 0x77, 0x88, 0x32, 0x2f, 0xdb, 0xea, 0x89, 0x44, 0xd4, 0x56, 0x4f, 0x44, 0xc4, 0xd9, 0xfa, - 0x63, 0xa1, 0x36, 0x88, 0x6d, 0x38, 0x22, 0x92, 0x4b, 0xd3, 0xd9, 0x49, 0x46, 0x50, 0x01, 0x2d, - 0xd8, 0xd6, 0x1a, 0x9c, 0x54, 0xbc, 0x29, 0xcf, 0x4e, 0xfd, 0x29, 0xe9, 0xec, 0xd4, 0x1f, 0x4b, - 0x55, 0x5d, 0xc6, 0xb2, 0x31, 0x78, 0x5b, 0x56, 0xf5, 0x04, 0x12, 0xaa, 0xea, 0x09, 0xe0, 0x38, - 0x43, 0x8d, 0xb8, 0xc4, 0x53, 0x16, 0x06, 0x31, 0x04, 0x92, 0x38, 0x43, 0x00, 0xc7, 0x19, 0xce, - 0x11, 0xaf, 0xb5, 0xae, 0x2c, 0x0e, 0x62, 0x08, 0x24, 0x71, 0x86, 0x00, 0xa6, 0x9b, 0x4d, 0x19, - 0x3c, 0xdb, 0x6b, 0x6f, 0xf8, 0x7d, 0xb6, 0x24, 0x6f, 0x36, 0xfb, 0x12, 0xd2, 0xcd, 0x66, 0x5f, - 0x24, 0xfe, 0xea, 0x9e, 0xaf, 0x68, 0x95, 0x65, 0xa8, 0x70, 0x26, 0xb4, 0x0b, 0xf6, 0x52, 0x6a, - 0x7e, 0x48, 0xdb, 0xeb, 0x15, 0xf0, 0xa7, 0x82, 0xdb, 0x1d, 0xa5, 0x0e, 0x55, 0x4d, 0x05, 0x67, - 0x15, 0x0c, 0x3c, 0x3f, 0xa4, 0x05, 0xf7, 0x3f, 0x2f, 0xa1, 0x31, 0xf8, 0xa8, 0x9a, 0x65, 0x7a, - 0x95, 0x59, 0xe5, 0x2d, 0x79, 0xcb, 0x24, 0xa0, 0xe8, 0x96, 0x49, 0xf8, 0x49, 0x27, 0x71, 0xf8, - 0xc9, 0xa6, 0x98, 0xca, 0xac, 0xa2, 0xc9, 0x93, 0xb8, 0x84, 0xa4, 0x93, 0xb8, 0x04, 0x08, 0xea, - 0xad, 0x38, 0x76, 0xb7, 0x32, 0xab, 0x34, 0x12, 0xea, 0x65, 0xa8, 0xa0, 0x5e, 0xf6, 0x33, 0xa8, - 0xb7, 0xb1, 0xde, 0xf3, 0x2a, 0xf4, 0x1b, 0x57, 0x12, 0xea, 0xf5, 0x91, 0x41, 0xbd, 0x3e, 0x80, - 0x4e, 0x85, 0x00, 0xa8, 0x3b, 0x36, 0x9d, 0xb4, 0x6f, 0x9b, 0xed, 0xb6, 0x72, 0x47, 0x9e, 0x0a, - 0xa3, 0x78, 0x3a, 0x15, 0x46, 0x61, 0xd4, 0xf4, 0x64, 0xad, 0x22, 0xab, 0xbd, 0x35, 0xe5, 0x6d, - 0xd9, 0xf4, 0x0c, 0x31, 0xd4, 0xf4, 0x0c, 0x7f, 0xc1, 0xee, 0x82, 0xfe, 0xd2, 0xc8, 0x3d, 0x87, - 0xb8, 0xeb, 0xca, 0xdd, 0xc8, 0xee, 0x42, 0xc0, 0xc1, 0xee, 0x42, 0xf8, 0x8d, 0xd7, 0xd0, 0xe3, - 0xd2, 0x42, 0xe3, 0x7b, 0x8a, 0x35, 0x88, 0xee, 0xb4, 0xd6, 0x95, 0xcf, 0x03, 0xab, 0xa7, 0x12, - 0x97, 0x2a, 0x99, 0x74, 0x7e, 0x48, 0x1b, 0xc4, 0x09, 0xb6, 0xe5, 0x6f, 0x2d, 0xb0, 0x87, 0xa5, - 0x5a, 0xbd, 0xec, 0x6f, 0x42, 0xdf, 0x89, 0x6c, 0xcb, 0xe3, 0x24, 0xb0, 0x2d, 0x8f, 0x83, 0x71, - 0x17, 0x5d, 0x8a, 0x6c, 0xd5, 0x16, 0xf5, 0x36, 0xdd, 0x97, 0x10, 0xa3, 0xae, 0xb7, 0x36, 0x88, - 0xa7, 0x7c, 0x01, 0x78, 0x5f, 0xee, 0xb3, 0xe1, 0x8b, 0x50, 0xcf, 0x0f, 0x69, 0xbb, 0xf0, 0xc3, - 0x2a, 0xcb, 0x39, 0xa3, 0x7c, 0x51, 0x3e, 0xdf, 0xa4, 0xb0, 0xf9, 0x21, 0x8d, 0xe5, 0xa3, 0x79, - 0x17, 0x29, 0x77, 0xba, 0x6b, 0x8e, 0x6e, 0x10, 0x66, 0x68, 0x81, 0xed, 0xc6, 0x0d, 0xd0, 0xef, - 0x90, 0xad, 0xb4, 0x7e, 0x74, 0xd4, 0x4a, 0xeb, 0x87, 0xa3, 0x8a, 0x2a, 0xc5, 0x50, 0x52, 0xbe, - 0x24, 0x2b, 0xaa, 0x84, 0xa4, 0x8a, 0x2a, 0x47, 0x5c, 0xfa, 0x3c, 0x3a, 0x17, 0xec, 0xe7, 0xf9, - 0xfa, 0xcb, 0x3a, 0x4d, 0x79, 0x17, 0xf8, 0x5c, 0x8a, 0x5d, 0x06, 0x48, 0x54, 0xf3, 0x43, 0x5a, - 0x9f, 0xf2, 0x74, 0xc5, 0x8d, 0x85, 0x07, 0xe4, 0xe6, 0xc5, 0x77, 0xca, 0x2b, 0x6e, 0x1f, 0x32, - 0xba, 0xe2, 0xf6, 0x41, 0x25, 0x32, 0xe7, 0x42, 0xd5, 0x77, 0x61, 0x1e, 0xc8, 0xb4, 0x1f, 0x87, - 0x44, 0xe6, 0xdc, 0x52, 0x5b, 0xdd, 0x85, 0x79, 0x60, 0xad, 0xf5, 0xe3, 0x80, 0xaf, 0xa0, 0x5c, - 0xa3, 0xb1, 0xa8, 0xf5, 0x2c, 0xa5, 0x15, 0xb9, 0x96, 0x03, 0xe8, 0xfc, 0x90, 0xc6, 0xf1, 0xd4, - 0x0c, 0xaa, 0xb6, 0x75, 0xd7, 0x33, 0x5b, 0x2e, 0x8c, 0x18, 0x7f, 0x84, 0x18, 0xb2, 0x19, 0x94, - 0x44, 0x43, 0xcd, 0xa0, 0x24, 0x38, 0xb5, 0x17, 0xcb, 0xba, 0xeb, 0xea, 0x96, 0xe1, 0xe8, 0xb3, - 0xb0, 0x4c, 0x90, 0x48, 0x96, 0x73, 0x09, 0x4b, 0xed, 0x45, 0x19, 0x02, 0x87, 0xef, 0x3e, 0xc4, - 0x37, 0x73, 0xee, 0x45, 0x0e, 0xdf, 0x23, 0x78, 0x38, 0x7c, 0x8f, 0xc0, 0xc0, 0xee, 0xf4, 0x61, - 0x1a, 0x59, 0x33, 0x21, 0x43, 0xdc, 0x5a, 0xc4, 0xee, 0x8c, 0x12, 0x80, 0xdd, 0x19, 0x05, 0x4a, - 0x4d, 0xf2, 0x97, 0xdb, 0xf5, 0x3e, 0x4d, 0x0a, 0x57, 0xd9, 0x58, 0x19, 0xba, 0x7e, 0x87, 0x83, - 0xa3, 0xb2, 0x65, 0xe9, 0x1d, 0xbb, 0x32, 0xeb, 0x4b, 0xdd, 0x94, 0xd7, 0xef, 0xbe, 0x84, 0x74, - 0xfd, 0xee, 0x8b, 0xa4, 0xb3, 0xab, 0xbf, 0xd1, 0x5a, 0xd7, 0x1d, 0x62, 0x04, 0x79, 0x93, 0xd8, - 0xd6, 0xf0, 0x3d, 0x79, 0x76, 0x1d, 0x40, 0x4a, 0x67, 0xd7, 0x01, 0x68, 0x6a, 0xe4, 0x25, 0xa3, - 0x35, 0xa2, 0x1b, 0xca, 0x86, 0x6c, 0xe4, 0xf5, 0xa7, 0xa4, 0x46, 0x5e, 0x7f, 0x6c, 0xff, 0xcf, - 0xb9, 0xeb, 0x98, 0x1e, 0x51, 0xda, 0x7b, 0xf9, 0x1c, 0x20, 0xed, 0xff, 0x39, 0x80, 0xa6, 0x1b, - 0xc2, 0x68, 0x87, 0x74, 0xe4, 0x0d, 0x61, 0xbc, 0x1b, 0xa2, 0x25, 0xa8, 0xc5, 0xc2, 0xfd, 0xc5, - 0x14, 0x4b, 0xb6, 0x58, 0x38, 0x98, 0x5a, 0x2c, 0xa1, 0x47, 0x99, 0xe4, 0xe9, 0xa4, 0xd8, 0xf2, - 0x1a, 0x2a, 0xe2, 0xe8, 0x1a, 0x2a, 0x79, 0x45, 0xbd, 0x24, 0x39, 0x34, 0x28, 0x5d, 0xd9, 0xea, - 0x10, 0x50, 0xd4, 0xea, 0x10, 0x5d, 0x1f, 0xca, 0x68, 0x2a, 0xc8, 0xd8, 0xcf, 0xe7, 0xca, 0x2f, - 0xcb, 0x9f, 0x19, 0x41, 0xd3, 0xcf, 0x8c, 0x80, 0x24, 0x26, 0x7c, 0xda, 0x72, 0xfa, 0x30, 0x09, - 0xcf, 0x07, 0x23, 0x20, 0xbc, 0x80, 0x70, 0xa3, 0xb4, 0xb8, 0x50, 0x33, 0xea, 0xe2, 0x15, 0x99, - 0x2b, 0x9f, 0xc0, 0xc6, 0x29, 0xe6, 0x87, 0xb4, 0x84, 0x72, 0xf8, 0x3d, 0x74, 0x81, 0x43, 0xb9, - 0x3b, 0x2f, 0x64, 0xb7, 0x30, 0x82, 0x05, 0xc1, 0x03, 0xbe, 0x9f, 0x88, 0xf0, 0x4d, 0xa4, 0x9d, - 0x1f, 0xd2, 0x06, 0xf2, 0xea, 0x5f, 0x17, 0x5f, 0x1f, 0x7a, 0x7b, 0xa9, 0x2b, 0x58, 0x24, 0x06, - 0xf2, 0xea, 0x5f, 0x17, 0x97, 0xfb, 0xfd, 0xbd, 0xd4, 0x15, 0x74, 0xc2, 0x40, 0x5e, 0xd8, 0x45, - 0xc5, 0x41, 0xf8, 0x52, 0xbb, 0xad, 0x6c, 0x42, 0x75, 0x4f, 0xef, 0xa5, 0xba, 0x12, 0x18, 0x9c, - 0xbb, 0x71, 0xa4, 0xb3, 0xf4, 0x72, 0x97, 0x58, 0x0d, 0x69, 0x01, 0x7a, 0x20, 0xcf, 0xd2, 0x31, - 0x02, 0x3a, 0x4b, 0xc7, 0x80, 0x74, 0x40, 0x89, 0x7e, 0x31, 0xca, 0x96, 0x3c, 0xa0, 0x44, 0x1c, - 0x1d, 0x50, 0x92, 0x0f, 0xcd, 0x32, 0x3a, 0xbd, 0xbc, 0xe1, 0xe9, 0xbe, 0x05, 0xe9, 0xf2, 0xae, - 0x7c, 0x3f, 0x72, 0xc9, 0x14, 0x27, 0x81, 0x4b, 0xa6, 0x38, 0x98, 0x8e, 0x11, 0x0a, 0x6e, 0x6c, - 0x59, 0xad, 0x39, 0xdd, 0x6c, 0xf7, 0x1c, 0xa2, 0xfc, 0x31, 0x79, 0x8c, 0x44, 0xd0, 0x74, 0x8c, - 0x44, 0x40, 0x74, 0x81, 0xa6, 0xa0, 0x92, 0xeb, 0x9a, 0x6b, 0x16, 0xdf, 0x57, 0xf6, 0xda, 0x9e, - 0xf2, 0xc7, 0xe5, 0x05, 0x3a, 0x89, 0x86, 0x2e, 0xd0, 0x49, 0x70, 0x38, 0x75, 0x4a, 0xc8, 0xfc, - 0xa2, 0xfc, 0x89, 0xc8, 0xa9, 0x53, 0x02, 0x0d, 0x9c, 0x3a, 0x25, 0x65, 0x8d, 0x99, 0x43, 0x85, - 0x30, 0xb7, 0x36, 0xe7, 0xf7, 0x27, 0xe5, 0xf5, 0x31, 0x8a, 0xa7, 0xeb, 0x63, 0x14, 0x26, 0xf3, - 0xe1, 0x5d, 0xf0, 0xa7, 0xfa, 0xf1, 0x09, 0xe4, 0x1f, 0x2b, 0x83, 0x6f, 0x89, 0x7c, 0xf8, 0x48, - 0xf9, 0xae, 0x54, 0x3f, 0x46, 0xc1, 0xf0, 0x88, 0x15, 0x92, 0x19, 0xb1, 0xa4, 0xf1, 0xca, 0x57, - 0xfa, 0x32, 0x62, 0x04, 0x32, 0x23, 0x06, 0xc3, 0xef, 0xa0, 0x73, 0x21, 0x6c, 0x91, 0x74, 0x56, - 0x83, 0x99, 0xe9, 0x4f, 0xa7, 0x64, 0x33, 0x38, 0x99, 0x8c, 0x9a, 0xc1, 0xc9, 0x98, 0x24, 0xd6, - 0x5c, 0x74, 0x7f, 0x66, 0x17, 0xd6, 0x81, 0x04, 0xfb, 0x30, 0x48, 0x62, 0xcd, 0xa5, 0xf9, 0xdd, - 0xbb, 0xb0, 0x0e, 0x64, 0xda, 0x87, 0x01, 0xfe, 0xfe, 0x14, 0xba, 0x9c, 0x8c, 0x2a, 0xb5, 0xdb, - 0x73, 0xb6, 0x13, 0xe2, 0x94, 0xef, 0x49, 0xc9, 0x07, 0x0d, 0x7b, 0x2b, 0x36, 0x3f, 0xa4, 0xed, - 0xb1, 0x02, 0xfc, 0x39, 0x34, 0x51, 0xea, 0x19, 0xa6, 0x07, 0x17, 0x6f, 0xd4, 0x70, 0xfe, 0xde, - 0x54, 0x64, 0x8b, 0x23, 0x62, 0x61, 0x8b, 0x23, 0x02, 0xf0, 0x9b, 0xe8, 0x54, 0x83, 0xb4, 0x7a, - 0x8e, 0xe9, 0x6d, 0x69, 0x90, 0xd5, 0x87, 0xf2, 0xf8, 0xbe, 0x94, 0x3c, 0x89, 0xc5, 0x28, 0xe8, - 0x24, 0x16, 0x03, 0xe2, 0xb7, 0xfb, 0x64, 0x91, 0x51, 0xbe, 0x9a, 0x1a, 0x78, 0x2d, 0x1f, 0xf4, - 0x65, 0x9f, 0x24, 0x34, 0xf5, 0xc4, 0x4c, 0x21, 0xca, 0xf7, 0xa7, 0x06, 0x5c, 0xa3, 0x0b, 0x33, - 0x5c, 0x42, 0x92, 0x91, 0x7a, 0x62, 0x2e, 0x08, 0xe5, 0x07, 0x52, 0x03, 0xae, 0xbd, 0x43, 0x8e, - 0x49, 0x69, 0x24, 0x5e, 0x10, 0x93, 0xb8, 0x29, 0x7f, 0x36, 0x15, 0x77, 0x15, 0x09, 0xca, 0x8b, - 0xd9, 0xde, 0x5e, 0x60, 0xae, 0x79, 0xbc, 0xd8, 0xd7, 0x52, 0x71, 0xdf, 0xbc, 0xb0, 0x58, 0xf8, - 0x0b, 0x13, 0x34, 0x5d, 0x7d, 0xe0, 0x11, 0xc7, 0xd2, 0xdb, 0xd0, 0x9d, 0x0d, 0xcf, 0x76, 0xf4, - 0x35, 0x52, 0xb5, 0xf4, 0xd5, 0x36, 0x51, 0x7e, 0x30, 0x25, 0x5b, 0xb0, 0xfd, 0x49, 0xa9, 0x05, - 0xdb, 0x1f, 0x8b, 0xd7, 0xd1, 0xe3, 0x49, 0xd8, 0x8a, 0xe9, 0x42, 0x3d, 0x3f, 0x94, 0x92, 0x4d, - 0xd8, 0x01, 0xb4, 0xd4, 0x84, 0x1d, 0x80, 0x9e, 0x1d, 0x41, 0xc3, 0xb0, 0x9a, 0xa9, 0x3f, 0x9e, - 0x42, 0xe3, 0x0d, 0xcf, 0x21, 0x7a, 0x87, 0xbb, 0xb4, 0x4f, 0xa3, 0x3c, 0xbb, 0x16, 0xae, 0x55, - 0xf8, 0xcb, 0x93, 0xe0, 0x37, 0xbe, 0x8c, 0x26, 0x17, 0x74, 0xd7, 0x83, 0x92, 0x35, 0xcb, 0x20, - 0x0f, 0xc0, 0x25, 0x32, 0xa3, 0x45, 0xa0, 0x78, 0x81, 0xd1, 0xb1, 0x72, 0xf0, 0x86, 0x27, 0xb3, - 0xab, 0x27, 0x77, 0xfe, 0x83, 0xed, 0xe2, 0x10, 0x38, 0x6e, 0x47, 0xca, 0xaa, 0xdf, 0x4c, 0xa1, - 0xd8, 0x85, 0xf5, 0xc1, 0x1d, 0xb8, 0x97, 0xd1, 0x54, 0xe4, 0xdd, 0x18, 0xf7, 0xeb, 0xdc, 0xe3, - 0xb3, 0xb2, 0x68, 0x69, 0xfc, 0x74, 0xe0, 0x4f, 0x78, 0x47, 0x5b, 0xe0, 0x5e, 0xfa, 0x23, 0x90, - 0x6c, 0xd9, 0x69, 0x6b, 0x02, 0x8a, 0xfb, 0xa3, 0xfe, 0xc5, 0xa9, 0xf0, 0x51, 0x0c, 0xbe, 0xcc, - 0xdf, 0xc4, 0xa5, 0x42, 0xdf, 0xfe, 0x48, 0xf4, 0x4e, 0xf6, 0x06, 0xee, 0x73, 0x68, 0xbc, 0xd6, - 0xe9, 0x12, 0xc7, 0xb5, 0x2d, 0xdd, 0xb3, 0xfd, 0x2c, 0x01, 0xe0, 0x41, 0x6e, 0x0a, 0x70, 0xd1, - 0xab, 0x59, 0xa4, 0xc7, 0x57, 0xfd, 0x94, 0x67, 0x19, 0x78, 0x8e, 0x74, 0x3a, 0x21, 0xe5, 0x99, - 0x9f, 0xb8, 0xec, 0x2a, 0x1a, 0xbe, 0xe3, 0xea, 0xe0, 0x79, 0x1a, 0x90, 0xf6, 0x28, 0x40, 0x24, - 0x05, 0x0a, 0x7c, 0x0d, 0xe5, 0xc0, 0x52, 0x77, 0x95, 0x61, 0xa0, 0x85, 0x17, 0x07, 0x6d, 0x80, - 0x88, 0x9e, 0xe2, 0x8c, 0x06, 0xdf, 0x46, 0x85, 0xf0, 0x18, 0x02, 0xf2, 0x5a, 0xf8, 0x01, 0x41, - 0x20, 0x92, 0xe6, 0x46, 0x80, 0x63, 0x09, 0x31, 0x44, 0x16, 0xb1, 0x82, 0x78, 0x1e, 0x4d, 0x85, - 0x30, 0x2a, 0x22, 0x3f, 0x10, 0x11, 0x44, 0x92, 0x15, 0x78, 0x51, 0x71, 0x8a, 0xac, 0xa2, 0xc5, - 0x70, 0x0d, 0x8d, 0xf8, 0xcf, 0x0d, 0xf2, 0xbb, 0x2a, 0xe9, 0x69, 0xfe, 0xdc, 0x60, 0x44, 0x7c, - 0x68, 0xe0, 0x97, 0xc7, 0x73, 0x68, 0x52, 0xb3, 0x7b, 0x1e, 0x59, 0xb1, 0xfd, 0x24, 0xf3, 0xa3, - 0x61, 0x74, 0x5b, 0x87, 0x62, 0x9a, 0x9e, 0xed, 0x07, 0x22, 0x15, 0x03, 0x62, 0xca, 0xa5, 0xf0, - 0x52, 0x52, 0xbe, 0x7a, 0x21, 0x3c, 0xa8, 0xf0, 0x79, 0x71, 0x66, 0x09, 0x09, 0xea, 0xbf, 0x37, - 0x85, 0x72, 0x2b, 0x8e, 0x6e, 0x7a, 0x2e, 0x77, 0x5a, 0x3d, 0x3b, 0xb3, 0xe9, 0xe8, 0x5d, 0xaa, - 0x1f, 0x33, 0xf0, 0xde, 0x0c, 0xf2, 0x73, 0xbb, 0xb3, 0x77, 0xe9, 0xd7, 0xfd, 0xdb, 0xed, 0xe2, - 0x67, 0xf7, 0x91, 0x8a, 0xee, 0x7a, 0xc0, 0x89, 0xd5, 0x40, 0x55, 0xc0, 0x83, 0xbf, 0x44, 0x15, - 0x60, 0x38, 0xbc, 0x44, 0x27, 0x6d, 0xf8, 0xd4, 0x52, 0xb7, 0xcb, 0x3d, 0x60, 0x85, 0x39, 0xdb, - 0xc7, 0x30, 0xc5, 0x0e, 0x04, 0xa6, 0x77, 0xc5, 0xec, 0x28, 0x02, 0x07, 0xaa, 0x05, 0x2b, 0xbc, - 0x45, 0xbe, 0x98, 0x26, 0x42, 0x89, 0xfb, 0x8d, 0x4d, 0x10, 0x52, 0xb4, 0x18, 0x5e, 0x45, 0x53, - 0x9c, 0x6f, 0x10, 0x3a, 0x62, 0x52, 0x9e, 0x15, 0x22, 0x68, 0xa6, 0xb4, 0x41, 0x1b, 0x0d, 0x0e, - 0x16, 0xeb, 0x88, 0x94, 0xc0, 0xb3, 0x61, 0x64, 0x3b, 0x48, 0xc5, 0xa2, 0x4c, 0x81, 0xc6, 0x5e, - 0xd8, 0xd9, 0x2e, 0x2a, 0x7e, 0x79, 0x96, 0xc1, 0x25, 0x29, 0x4e, 0x2b, 0x14, 0x11, 0x79, 0x30, - 0xad, 0x2f, 0x24, 0xf0, 0x88, 0xea, 0xbc, 0x5c, 0x04, 0x97, 0xd1, 0x44, 0xe0, 0x80, 0x73, 0xe7, - 0x4e, 0xad, 0x02, 0x2e, 0xb6, 0x3c, 0xe7, 0x48, 0x24, 0x2a, 0x85, 0xc8, 0x44, 0x2a, 0x83, 0x9f, - 0x47, 0x79, 0xe6, 0xc2, 0x5a, 0x63, 0x3e, 0xb7, 0xfe, 0xb3, 0x40, 0x80, 0x35, 0x4d, 0xb1, 0xc7, - 0x02, 0x42, 0xfc, 0x1a, 0x1a, 0x2b, 0xdd, 0x6d, 0xd0, 0x79, 0xa6, 0xa4, 0x2d, 0xb9, 0xca, 0xe9, - 0x30, 0x1c, 0x10, 0x84, 0xea, 0xb5, 0xdb, 0xa4, 0xa9, 0x3b, 0xd2, 0xe4, 0x21, 0xd2, 0xe3, 0x2a, - 0x9a, 0x94, 0xce, 0xf0, 0x5d, 0xe5, 0x0c, 0x70, 0x60, 0xd9, 0x52, 0x58, 0x1a, 0x78, 0x9e, 0xb0, - 0x47, 0x8a, 0x47, 0x2c, 0x17, 0xa2, 0x5a, 0x43, 0x97, 0xc1, 0x76, 0xdb, 0xde, 0xd4, 0x88, 0xe9, - 0xba, 0x3d, 0x02, 0x0e, 0xbb, 0x79, 0xa6, 0x35, 0x06, 0x47, 0x35, 0x1d, 0x86, 0x93, 0xa2, 0x45, - 0xcb, 0xc5, 0xf0, 0x7b, 0x08, 0x43, 0x30, 0x16, 0x62, 0xf8, 0x5b, 0xba, 0x5a, 0xc5, 0x55, 0xce, - 0xc1, 0xbb, 0x5b, 0x1c, 0x7d, 0xfd, 0x5e, 0xab, 0xcc, 0x5e, 0xe6, 0xd3, 0xc7, 0x25, 0x9d, 0x95, - 0x6a, 0x06, 0xc9, 0x72, 0x4c, 0x43, 0x6c, 0x71, 0x02, 0x57, 0xbc, 0x89, 0xce, 0xd7, 0x1d, 0x72, - 0xdf, 0xb4, 0x7b, 0xae, 0xbf, 0x7c, 0xf8, 0xf3, 0xd6, 0xf9, 0x5d, 0xe7, 0xad, 0x27, 0x79, 0xc5, - 0x67, 0xbb, 0x0e, 0xb9, 0xdf, 0xf4, 0x5f, 0x5b, 0x4a, 0xcf, 0xa5, 0xfa, 0x71, 0xa7, 0xe2, 0x2a, - 0xbd, 0xdf, 0x73, 0x08, 0x87, 0x9b, 0xc4, 0x55, 0x94, 0x70, 0xaa, 0xd5, 0x29, 0xca, 0xe7, 0x68, - 0x4a, 0xaa, 0x1b, 0x2d, 0x86, 0x35, 0x84, 0x6f, 0x95, 0xfd, 0xed, 0x7d, 0xa9, 0xd5, 0xb2, 0x7b, - 0x96, 0xe7, 0x2a, 0x8f, 0x01, 0x33, 0x95, 0x8a, 0x65, 0xad, 0x15, 0xbc, 0xbc, 0x6e, 0xea, 0x1c, - 0x2f, 0x8a, 0x25, 0x5e, 0x1a, 0x2f, 0xa0, 0x42, 0xdd, 0x31, 0xef, 0xeb, 0x1e, 0xb9, 0x4d, 0xb6, - 0xea, 0x76, 0xdb, 0x6c, 0x6d, 0x81, 0xdf, 0x30, 0x9f, 0x2a, 0xbb, 0x0c, 0xd7, 0xdc, 0x20, 0x5b, - 0xcd, 0x2e, 0x60, 0xc5, 0x65, 0x25, 0x5a, 0x52, 0xfd, 0xa1, 0x8c, 0x38, 0x43, 0x05, 0x99, 0xc3, - 0x53, 0x89, 0x99, 0xc3, 0xaf, 0xa1, 0x51, 0xbe, 0xba, 0x07, 0x91, 0x5d, 0x20, 0x0c, 0x9e, 0xff, - 0x08, 0xd9, 0x34, 0xb4, 0x90, 0x00, 0x42, 0x90, 0x85, 0x79, 0x2c, 0x32, 0x42, 0x08, 0xb2, 0x30, - 0x8f, 0x85, 0x94, 0xc5, 0xe2, 0x06, 0x1a, 0xe3, 0xb3, 0x93, 0xf0, 0x5e, 0x10, 0x1e, 0x12, 0xfb, - 0xa1, 0xac, 0xd9, 0x3b, 0x65, 0x81, 0x08, 0xbf, 0x02, 0xc1, 0xdc, 0xf9, 0x80, 0xe1, 0xb6, 0x08, - 0x4c, 0xa6, 0xe2, 0xf8, 0x8a, 0x44, 0x73, 0xe7, 0xd4, 0x74, 0x6a, 0x11, 0x3b, 0xcc, 0x0f, 0xba, - 0x08, 0x53, 0x8b, 0xd4, 0xcb, 0x5b, 0x52, 0x26, 0x22, 0xb1, 0x08, 0x5e, 0x46, 0xa7, 0x62, 0x7d, - 0xc4, 0x5f, 0x17, 0x42, 0x08, 0xce, 0x84, 0x0e, 0x16, 0x97, 0xae, 0x58, 0x59, 0xf5, 0xdf, 0xa4, - 0x62, 0x13, 0x33, 0x15, 0x0c, 0xa7, 0x12, 0x3a, 0x07, 0x04, 0xe3, 0xb3, 0x66, 0x82, 0x11, 0x88, - 0xf0, 0x15, 0x94, 0x8f, 0xc4, 0x73, 0x87, 0x77, 0xc7, 0x41, 0x30, 0xf7, 0x00, 0x8b, 0x6f, 0xa0, - 0x3c, 0x9d, 0x26, 0xad, 0xc8, 0x5b, 0xda, 0x1e, 0x87, 0x89, 0xf3, 0x9a, 0x4f, 0x47, 0xcb, 0x48, - 0x11, 0x87, 0xfc, 0xb0, 0xdb, 0xf1, 0x45, 0x21, 0x8c, 0x30, 0xf4, 0xbf, 0xb3, 0x03, 0xef, 0x36, - 0x8f, 0x24, 0xd4, 0xc2, 0xcb, 0xd4, 0xd0, 0xa6, 0xb5, 0x97, 0xdc, 0x98, 0xb9, 0xc8, 0xae, 0x6e, - 0x9a, 0x3a, 0xd3, 0x23, 0x57, 0x93, 0x29, 0xc5, 0x8c, 0x60, 0xf0, 0x30, 0x32, 0x9b, 0x90, 0x11, - 0x2c, 0x1a, 0x46, 0x5c, 0x2c, 0x80, 0x5f, 0x40, 0xa3, 0x61, 0x6e, 0xb3, 0x61, 0xe1, 0x71, 0x6c, - 0x42, 0x4a, 0xb3, 0x90, 0x12, 0x7f, 0x09, 0xe5, 0xa4, 0x38, 0xf6, 0xd7, 0xf7, 0x70, 0x19, 0x3c, - 0x23, 0x86, 0x3a, 0x60, 0x46, 0x6b, 0x34, 0x86, 0x3d, 0x67, 0x8a, 0x57, 0xd0, 0xe9, 0xba, 0x43, - 0x0c, 0x70, 0x3b, 0xa8, 0x3e, 0xe8, 0x3a, 0x3c, 0x10, 0x05, 0x53, 0x69, 0x98, 0xb3, 0xba, 0x3e, - 0x9a, 0xce, 0xa6, 0x1c, 0x2f, 0x30, 0x4a, 0x2a, 0x4e, 0x17, 0x32, 0xd6, 0x92, 0xdb, 0x64, 0x6b, - 0xd3, 0x76, 0x0c, 0x16, 0xab, 0x81, 0x2f, 0x64, 0x5c, 0xd0, 0x1b, 0x1c, 0x25, 0x2e, 0x64, 0x72, - 0xa1, 0xe9, 0x97, 0xd1, 0xd8, 0x41, 0xc3, 0x05, 0xfc, 0x5c, 0xba, 0x8f, 0x97, 0xd0, 0xa3, 0x1b, - 0xe0, 0x30, 0x08, 0x36, 0x3b, 0xdc, 0x27, 0xd8, 0xec, 0xef, 0xa7, 0xfb, 0xb8, 0x40, 0x3d, 0xd2, - 0x41, 0x21, 0x03, 0x61, 0xc8, 0x41, 0x21, 0xc3, 0x78, 0x9c, 0xa6, 0xa1, 0x89, 0x44, 0x91, 0xf0, - 0xb1, 0xb9, 0x5d, 0xc3, 0xc7, 0xfe, 0x64, 0x66, 0x90, 0x8b, 0xd8, 0x89, 0xec, 0xf7, 0x23, 0xfb, - 0x1b, 0x68, 0x2c, 0x90, 0x2c, 0x4f, 0x06, 0x34, 0x11, 0x04, 0x27, 0x61, 0x60, 0x28, 0x23, 0x10, - 0xe1, 0xab, 0xac, 0xad, 0x0d, 0xf3, 0x7d, 0x16, 0x28, 0x60, 0x82, 0x3f, 0x26, 0xd7, 0x3d, 0xbd, - 0xe9, 0x9a, 0xef, 0x13, 0x2d, 0x40, 0xab, 0xff, 0x28, 0x9d, 0xe8, 0x67, 0x77, 0xd2, 0x47, 0xfb, - 0xe8, 0xa3, 0x04, 0x21, 0x32, 0x0f, 0xc1, 0x13, 0x21, 0xee, 0x43, 0x88, 0xbf, 0x97, 0x4e, 0xf4, - 0xa7, 0x3c, 0x11, 0xe2, 0x7e, 0x66, 0x8b, 0x6b, 0x68, 0x54, 0xb3, 0x37, 0xdd, 0x32, 0x58, 0xf1, - 0x6c, 0xae, 0x80, 0x89, 0xda, 0xb1, 0x37, 0xdd, 0x26, 0xd8, 0xe7, 0x5a, 0x48, 0xa0, 0x7e, 0x3b, - 0x3d, 0xc0, 0xe3, 0xf4, 0x44, 0xf0, 0x1f, 0xe6, 0x12, 0xf9, 0x0b, 0x69, 0xc9, 0xa3, 0xf5, 0x91, - 0x8e, 0xae, 0xde, 0x68, 0xad, 0x93, 0x8e, 0x1e, 0x8d, 0xae, 0xee, 0x02, 0x94, 0x07, 0x67, 0x0d, - 0x49, 0xd4, 0x5f, 0x4c, 0x47, 0x5c, 0x7a, 0x4f, 0x64, 0xb7, 0x67, 0xd9, 0x05, 0x5a, 0xc7, 0xbd, - 0x94, 0x4f, 0x24, 0xb7, 0x57, 0xc9, 0x7d, 0x35, 0x1d, 0x71, 0xe8, 0x7e, 0x74, 0x03, 0x2d, 0xff, - 0x62, 0x3a, 0xee, 0x9c, 0xfe, 0xe8, 0x6a, 0xd2, 0x35, 0x34, 0xca, 0xe5, 0x10, 0x2c, 0x15, 0x6c, - 0xde, 0x67, 0x40, 0x38, 0x52, 0x0c, 0x08, 0xd4, 0xef, 0x49, 0x23, 0xd9, 0xd1, 0xfe, 0x11, 0xd5, - 0xa1, 0x5f, 0x48, 0xcb, 0x4f, 0x0c, 0x1e, 0x5d, 0xfd, 0x99, 0x41, 0xa8, 0xd1, 0x5b, 0x6d, 0xf1, - 0x08, 0x35, 0xc3, 0xc2, 0x99, 0x74, 0x00, 0xd5, 0x04, 0x0a, 0xf5, 0xff, 0xa4, 0x13, 0xdf, 0x3d, - 0x3c, 0xba, 0x02, 0x7c, 0x1e, 0xce, 0x89, 0x5b, 0x56, 0x38, 0x91, 0xc3, 0x21, 0x24, 0x1d, 0x7f, - 0xb1, 0x08, 0x7d, 0x3e, 0x21, 0xfe, 0x4c, 0x82, 0xb9, 0x06, 0xc1, 0xf4, 0x12, 0x13, 0x4d, 0x89, - 0x86, 0xdb, 0x3f, 0x4b, 0xef, 0xf6, 0x4c, 0xe4, 0x51, 0x5e, 0x55, 0x47, 0xea, 0xfa, 0x16, 0x84, - 0x33, 0xa0, 0x3d, 0x31, 0xce, 0x22, 0xd1, 0x75, 0x19, 0x48, 0x0c, 0x69, 0xc9, 0xa9, 0xd4, 0xdf, - 0x1d, 0x4e, 0x7e, 0xa3, 0xf0, 0xe8, 0x8a, 0xd0, 0x4f, 0x84, 0x3c, 0xbc, 0x6b, 0x22, 0xe4, 0xdc, - 0x5e, 0x13, 0x21, 0x8f, 0xf4, 0x4d, 0x84, 0x7c, 0x01, 0x65, 0x67, 0x6d, 0x63, 0x0b, 0xbc, 0x28, - 0xc6, 0x59, 0x65, 0xab, 0xb6, 0xb1, 0xa5, 0x01, 0x14, 0x7f, 0x7f, 0x0a, 0x8d, 0xcc, 0x13, 0xdd, - 0xa0, 0x23, 0x64, 0x74, 0x90, 0x13, 0xc2, 0xe7, 0x1f, 0x8e, 0x13, 0xc2, 0xa9, 0x75, 0x56, 0x99, - 0xa8, 0x28, 0xbc, 0x7e, 0x7c, 0x0b, 0xe5, 0xcb, 0xba, 0x47, 0xd6, 0x6c, 0x67, 0x0b, 0xdc, 0x2a, - 0x26, 0x43, 0x4f, 0x39, 0x49, 0x7f, 0x7c, 0x22, 0x76, 0x57, 0xd4, 0xe2, 0xbf, 0xb4, 0xa0, 0x30, - 0x15, 0x0b, 0x8f, 0xbc, 0x3e, 0x16, 0x8a, 0x45, 0x0e, 0xb1, 0x1e, 0x1e, 0x2b, 0x8f, 0x27, 0x1f, - 0x2b, 0x47, 0xd2, 0x5b, 0x4f, 0xec, 0x9a, 0xde, 0x5a, 0xfd, 0xd6, 0x30, 0x4a, 0xf4, 0x68, 0x3e, - 0x51, 0xf2, 0x13, 0x25, 0x0f, 0x95, 0xbc, 0x12, 0x53, 0xf2, 0xe9, 0xb8, 0x8f, 0xfc, 0x47, 0x54, - 0xc3, 0x7f, 0x34, 0x1b, 0x7b, 0x61, 0xf3, 0x68, 0xef, 0x2e, 0x43, 0xe9, 0x0d, 0xef, 0x3d, 0xfd, - 0x7d, 0x6e, 0xd7, 0x01, 0x31, 0xb2, 0xd7, 0x01, 0x91, 0xef, 0x3b, 0x20, 0x42, 0x05, 0x19, 0xed, - 0xab, 0x20, 0x35, 0x3e, 0x68, 0xd0, 0xe0, 0x68, 0xc1, 0x17, 0x76, 0xb6, 0x8b, 0x93, 0x74, 0x34, - 0x25, 0xc6, 0x09, 0x06, 0x16, 0xea, 0x37, 0xb3, 0x03, 0x9e, 0xc5, 0x1d, 0x89, 0x8e, 0xf0, 0xfc, - 0xff, 0x99, 0x83, 0xe4, 0xff, 0xcf, 0x1e, 0x20, 0xff, 0x3f, 0x7e, 0x35, 0x8c, 0xb2, 0xb1, 0xde, - 0xb3, 0x36, 0xf8, 0x46, 0x91, 0x7b, 0x5f, 0xfa, 0xbe, 0x27, 0x2d, 0x8a, 0xa2, 0xdb, 0xc5, 0x08, - 0x6d, 0x44, 0x9b, 0x72, 0x7b, 0xd7, 0xa6, 0x91, 0x5d, 0xb5, 0x29, 0xbf, 0x57, 0x6d, 0x1a, 0xdd, - 0x83, 0x36, 0xa1, 0x5d, 0xb5, 0x69, 0xec, 0xf0, 0xda, 0xd4, 0x45, 0xd3, 0xf1, 0xa7, 0xcc, 0x81, - 0x46, 0x68, 0x08, 0xc7, 0xb1, 0xdc, 0xdd, 0x04, 0xae, 0xfe, 0x7b, 0x0c, 0xdb, 0x64, 0x39, 0x19, - 0xa2, 0x19, 0x0d, 0xb4, 0x84, 0xd2, 0xea, 0xcf, 0xa5, 0xfb, 0xbf, 0xc0, 0x3e, 0x9e, 0x53, 0xdc, - 0x77, 0x26, 0x4a, 0x29, 0x2b, 0x7b, 0xc4, 0xf7, 0x97, 0x72, 0x84, 0x6d, 0x92, 0xcc, 0xbe, 0x9e, - 0xea, 0xf7, 0x2c, 0xfc, 0x50, 0x12, 0xfb, 0x64, 0xdc, 0x7d, 0x0b, 0xdc, 0xb6, 0x5d, 0xd9, 0x6f, - 0x2b, 0x9a, 0x20, 0x20, 0x73, 0xc0, 0x04, 0x01, 0xff, 0x30, 0x85, 0x4e, 0xdf, 0xee, 0xad, 0x12, - 0xee, 0xae, 0x15, 0x34, 0xe3, 0x3d, 0x84, 0x28, 0x98, 0x3b, 0xb1, 0xa4, 0xc0, 0x89, 0xe5, 0x53, - 0xe2, 0x93, 0xee, 0x48, 0x81, 0x99, 0x90, 0x9a, 0x39, 0xb0, 0x5c, 0xf4, 0x7d, 0xfb, 0x36, 0x7a, - 0xab, 0xa4, 0x19, 0xf3, 0x64, 0x11, 0xb8, 0x4f, 0xbf, 0xc6, 0xbc, 0xa6, 0x0f, 0xea, 0x34, 0xf2, - 0x33, 0xe9, 0xbe, 0xaf, 0xe8, 0x8f, 0x6d, 0x7e, 0xf9, 0x2f, 0x26, 0xf6, 0x0a, 0xd7, 0xdf, 0xc7, - 0x07, 0xf4, 0x43, 0x84, 0x63, 0x12, 0x97, 0x64, 0x81, 0x1d, 0xf3, 0x84, 0xfc, 0x1f, 0xaa, 0xc0, - 0x7e, 0x33, 0xd5, 0x37, 0xda, 0xc1, 0xb1, 0x4d, 0xd9, 0xff, 0x8d, 0xb4, 0x1f, 0x64, 0xe1, 0x50, - 0x9f, 0x70, 0x0d, 0x8d, 0xf2, 0x48, 0xd2, 0xb2, 0xb7, 0x29, 0x3f, 0xca, 0x83, 0xa3, 0xe1, 0x80, - 0x80, 0x2e, 0xf3, 0xfe, 0x23, 0xf0, 0x20, 0x39, 0x05, 0x2c, 0xf3, 0x26, 0x87, 0x52, 0x7a, 0x81, - 0x84, 0x2e, 0xe4, 0xd5, 0x07, 0xa6, 0x07, 0x56, 0x01, 0xed, 0xcb, 0x0c, 0x5b, 0xc8, 0xc9, 0x03, - 0xd3, 0x63, 0x36, 0x41, 0x80, 0xa6, 0x8b, 0xb4, 0x90, 0x76, 0x94, 0x2f, 0xd2, 0x2e, 0x0f, 0x69, - 0xcf, 0x5f, 0x11, 0x5d, 0x43, 0xa3, 0xdc, 0x85, 0x93, 0xbb, 0x99, 0xf0, 0xd6, 0x72, 0xa7, 0x4f, - 0x68, 0x6d, 0x40, 0x40, 0x39, 0x6a, 0x64, 0x2d, 0x74, 0xac, 0x03, 0x8e, 0x0e, 0x40, 0x34, 0x8e, - 0x51, 0x77, 0xd2, 0xf1, 0x58, 0x0f, 0x8f, 0xee, 0xa6, 0xe0, 0xaa, 0xec, 0xac, 0x06, 0x1e, 0x9a, - 0x60, 0x70, 0x89, 0xaf, 0x74, 0x98, 0xdd, 0x75, 0x03, 0xe5, 0x6f, 0x93, 0x2d, 0xe6, 0x57, 0x99, - 0x0b, 0x9d, 0x53, 0x37, 0x38, 0x4c, 0x3c, 0xd1, 0xf4, 0xe9, 0xd4, 0x5f, 0x4e, 0xc7, 0xa3, 0x58, - 0x3c, 0xba, 0xc2, 0xfe, 0x34, 0x1a, 0x01, 0x51, 0xd6, 0xfc, 0x23, 0x75, 0x10, 0x20, 0x88, 0x5b, - 0x4e, 0x51, 0xe1, 0x93, 0xa9, 0x3f, 0x91, 0x8b, 0x86, 0x36, 0x79, 0x74, 0xa5, 0xf7, 0x59, 0x34, - 0x56, 0xb6, 0x2d, 0xd7, 0x74, 0x3d, 0x62, 0xb5, 0x7c, 0x85, 0x7d, 0x8c, 0x1a, 0x2c, 0xad, 0x10, - 0x2c, 0x3e, 0xf9, 0x10, 0xa8, 0x0f, 0xa2, 0xbc, 0xf8, 0x45, 0x34, 0x0a, 0x22, 0x07, 0x3f, 0x64, - 0x21, 0xb5, 0xcd, 0x2a, 0x05, 0x46, 0x9d, 0x90, 0x43, 0x52, 0x7c, 0x07, 0xe5, 0xcb, 0xeb, 0x66, - 0xdb, 0x70, 0x88, 0xc5, 0x73, 0xa7, 0x3d, 0x99, 0x1c, 0x88, 0x66, 0x06, 0xfe, 0x05, 0x5a, 0xd6, - 0x9c, 0x16, 0x2f, 0x26, 0x3d, 0x7a, 0xe1, 0xb0, 0xe9, 0x3f, 0x9f, 0x46, 0x28, 0x2c, 0x80, 0x9f, - 0x40, 0x69, 0xff, 0x65, 0x25, 0x73, 0x03, 0x91, 0x34, 0x28, 0x0d, 0x53, 0x31, 0x1f, 0xdb, 0xe9, - 0x5d, 0xc7, 0xf6, 0x1d, 0x94, 0x63, 0x27, 0x4a, 0xe0, 0xa9, 0x2d, 0x44, 0x5b, 0xe8, 0xdb, 0xe0, - 0x19, 0xa0, 0x67, 0x9b, 0x45, 0xb0, 0xec, 0x24, 0xaf, 0x67, 0xc6, 0x6c, 0xba, 0x85, 0x86, 0xe1, - 0x2f, 0x7c, 0x19, 0x65, 0x41, 0x8a, 0x29, 0xd8, 0x27, 0xc2, 0xfb, 0xc4, 0x88, 0xfc, 0x00, 0x4f, - 0xbb, 0xa9, 0x6c, 0x5b, 0x1e, 0xad, 0x1a, 0x5a, 0x3d, 0xce, 0xe5, 0xc2, 0x61, 0x92, 0x5c, 0x38, - 0x4c, 0xfd, 0xa7, 0xe9, 0x84, 0xa0, 0x3b, 0x8f, 0xee, 0x30, 0x79, 0x19, 0x21, 0x78, 0x41, 0x4b, - 0xe5, 0xe9, 0x3f, 0xa8, 0x84, 0x51, 0x02, 0x8c, 0x40, 0x6d, 0x25, 0xb3, 0x3e, 0x24, 0x56, 0x7f, - 0x35, 0x15, 0x8b, 0xd4, 0x72, 0x6c, 0x53, 0x79, 0x4a, 0xdf, 0x72, 0xcc, 0xd3, 0x92, 0x7e, 0x2b, - 0x9d, 0x14, 0xb7, 0xe6, 0x78, 0xaa, 0x78, 0x98, 0x1f, 0x2d, 0xbb, 0x8f, 0xfc, 0x68, 0xef, 0xa2, - 0xa9, 0x48, 0x34, 0x17, 0x9e, 0x88, 0xe6, 0xf2, 0xe0, 0xb0, 0x30, 0xfd, 0xdf, 0x5e, 0x4b, 0x64, - 0xea, 0xff, 0x4d, 0x0d, 0x8e, 0xe5, 0x73, 0xe4, 0xaa, 0x93, 0x20, 0x80, 0xcc, 0x1f, 0x8d, 0x00, - 0x1e, 0xc2, 0x36, 0xf3, 0x78, 0x0b, 0xe0, 0x23, 0x32, 0x79, 0x7c, 0xd8, 0x02, 0xf8, 0x89, 0xd4, - 0xae, 0xa1, 0x98, 0x8e, 0x5a, 0x06, 0xea, 0x7f, 0x48, 0x25, 0x86, 0x4c, 0x3a, 0x54, 0xbb, 0x5e, - 0x45, 0x39, 0xe6, 0xb6, 0xc2, 0x5b, 0x25, 0x04, 0x99, 0xa6, 0xd0, 0x7e, 0xf9, 0xd9, 0x19, 0x16, - 0x2f, 0xa0, 0x11, 0xd6, 0x06, 0x83, 0xf7, 0xc6, 0x27, 0x06, 0xc4, 0x6d, 0x32, 0xfa, 0x4d, 0x8e, - 0x1c, 0xad, 0xfe, 0x4a, 0x2a, 0x16, 0xc1, 0xe9, 0x08, 0xbf, 0xed, 0x60, 0x79, 0x9f, 0x7f, 0x3b, - 0x9d, 0x1c, 0x40, 0xea, 0x08, 0x3f, 0xe4, 0x61, 0x1c, 0x57, 0x1d, 0x6c, 0xdd, 0x5a, 0x41, 0x93, - 0xb2, 0x2c, 0xf8, 0xb2, 0x75, 0x29, 0x39, 0x8c, 0x56, 0x9f, 0x56, 0x44, 0x78, 0xa8, 0x1f, 0xa4, - 0xe2, 0xb1, 0xaf, 0x8e, 0x7c, 0x7e, 0x3a, 0x98, 0xb6, 0xc8, 0x9f, 0xf2, 0x11, 0x59, 0x6b, 0x1e, - 0xc6, 0xa7, 0x7c, 0x44, 0x56, 0x8d, 0x83, 0x7d, 0xca, 0x4f, 0xa5, 0xfb, 0x85, 0x0e, 0x3b, 0xf2, - 0x0f, 0xfa, 0x82, 0x28, 0x64, 0xd6, 0x32, 0xfe, 0x69, 0x4f, 0xf4, 0x8b, 0xd5, 0xd5, 0x87, 0x67, - 0x8c, 0xcf, 0xc1, 0xc6, 0x78, 0xa2, 0xb0, 0x3e, 0x22, 0x8a, 0x7c, 0x3c, 0x84, 0xf5, 0x11, 0x19, - 0x2a, 0x1f, 0x3d, 0x61, 0xfd, 0xbd, 0xf4, 0x5e, 0xe3, 0xd5, 0x9d, 0x08, 0x2f, 0x26, 0xbc, 0x1f, - 0x4e, 0xc7, 0xe3, 0x28, 0x1e, 0xb9, 0x98, 0xe6, 0x50, 0x8e, 0x47, 0x74, 0xec, 0x2b, 0x1c, 0x86, - 0xef, 0x67, 0xd1, 0xf0, 0xef, 0x08, 0xd3, 0xe0, 0x66, 0xf7, 0x9e, 0x06, 0x57, 0xfd, 0x76, 0x2a, - 0x12, 0x74, 0xf0, 0x48, 0x8e, 0x10, 0x0e, 0xb4, 0x24, 0xe1, 0xd7, 0xfc, 0xc3, 0xcc, 0x6c, 0x24, - 0x9f, 0x5b, 0xf0, 0x3d, 0x15, 0xe2, 0xe9, 0x66, 0x3b, 0x5a, 0x9e, 0xbf, 0xb9, 0xff, 0xe5, 0x34, - 0x3a, 0x15, 0x23, 0xc5, 0x97, 0xa5, 0xb8, 0x2c, 0x70, 0x2c, 0x19, 0x71, 0xce, 0x66, 0x11, 0x5a, - 0xf6, 0x71, 0x92, 0x7a, 0x19, 0x65, 0x2b, 0xfa, 0x16, 0xfb, 0xb6, 0x61, 0xc6, 0xd2, 0xd0, 0xb7, - 0xc4, 0x13, 0x37, 0xc0, 0xe3, 0x55, 0x74, 0x96, 0xdd, 0x87, 0x98, 0xb6, 0xb5, 0x62, 0x76, 0x48, - 0xcd, 0x5a, 0x34, 0xdb, 0x6d, 0xd3, 0xe5, 0x97, 0x66, 0xd7, 0x76, 0xb6, 0x8b, 0x57, 0x3c, 0xdb, - 0xd3, 0xdb, 0x4d, 0xe2, 0x93, 0x35, 0x3d, 0xb3, 0x43, 0x9a, 0xa6, 0xd5, 0xec, 0x00, 0xa5, 0xc0, - 0x32, 0x99, 0x15, 0xae, 0xb1, 0x84, 0x73, 0x8d, 0x96, 0x6e, 0x59, 0xc4, 0xa8, 0x59, 0xb3, 0x5b, - 0x1e, 0x61, 0x97, 0x6d, 0x19, 0x76, 0x24, 0xc8, 0xde, 0x5e, 0x33, 0x34, 0x65, 0xbc, 0x4a, 0x09, - 0xb4, 0x84, 0x42, 0xea, 0x2f, 0x65, 0x13, 0xe2, 0x4d, 0x1e, 0x23, 0xf5, 0xf1, 0x7b, 0x3a, 0xbb, - 0x4b, 0x4f, 0x5f, 0x47, 0x23, 0x6f, 0x13, 0x07, 0xce, 0xb7, 0x86, 0xc3, 0x4c, 0xfc, 0xf7, 0x19, - 0x48, 0xbc, 0xa1, 0xe1, 0x54, 0xb8, 0x8d, 0xa6, 0x57, 0x68, 0x37, 0x25, 0x77, 0x66, 0xee, 0x00, - 0x9d, 0x39, 0x80, 0x1f, 0x7e, 0x07, 0x9d, 0x07, 0x6c, 0x42, 0xb7, 0x8e, 0x40, 0x55, 0x10, 0x4d, - 0x8c, 0x55, 0x95, 0xdc, 0xb9, 0xfd, 0xca, 0xe3, 0x2f, 0xa0, 0xf1, 0x60, 0x80, 0x98, 0xc4, 0xe5, - 0x37, 0x17, 0x03, 0xc6, 0x19, 0x8b, 0xb7, 0x45, 0xc1, 0xe0, 0xa2, 0x25, 0xc7, 0x6c, 0x92, 0x78, - 0xa9, 0xff, 0x2e, 0x35, 0x28, 0xee, 0xe5, 0x91, 0xcf, 0xca, 0xaf, 0xa1, 0x11, 0x83, 0x7d, 0x14, - 0xd7, 0xa9, 0xc1, 0x91, 0x31, 0x19, 0xa9, 0xe6, 0x97, 0x51, 0xff, 0x7d, 0x6a, 0x60, 0xb8, 0xcd, - 0xe3, 0xfe, 0x79, 0x3f, 0x9c, 0xe9, 0xf3, 0x79, 0x7c, 0x12, 0xbd, 0x8a, 0x0a, 0xa6, 0xe5, 0x91, - 0x35, 0x96, 0x49, 0xa7, 0x19, 0x06, 0x3c, 0xd2, 0xa6, 0x04, 0x38, 0x8c, 0xae, 0x9b, 0xe8, 0x9c, - 0xef, 0x58, 0xe8, 0xf8, 0x1e, 0x58, 0x6e, 0xb3, 0xe7, 0x98, 0x6c, 0x5c, 0x6a, 0x67, 0xdc, 0x88, - 0x7b, 0x96, 0x7b, 0xc7, 0x31, 0x69, 0x05, 0xba, 0xb7, 0x4e, 0x2c, 0xbd, 0xb9, 0x69, 0x3b, 0x1b, - 0x10, 0xd4, 0x91, 0x0d, 0x4e, 0x6d, 0x8a, 0xc1, 0xef, 0xfa, 0x60, 0xfc, 0x14, 0x9a, 0x58, 0x6b, - 0xf7, 0x48, 0x10, 0x46, 0x8f, 0xdd, 0xf5, 0x69, 0xe3, 0x14, 0x18, 0xdc, 0x90, 0x5c, 0x44, 0x08, - 0x88, 0x3c, 0x08, 0x86, 0x0a, 0x17, 0x7b, 0xda, 0x28, 0x85, 0xac, 0xf0, 0xee, 0x9a, 0x66, 0x5a, - 0xcd, 0x84, 0xd4, 0x6c, 0xdb, 0xd6, 0x5a, 0xd3, 0x23, 0x4e, 0x07, 0x1a, 0x0a, 0xce, 0x89, 0xda, - 0x39, 0xa0, 0x80, 0xab, 0x13, 0x77, 0xc1, 0xb6, 0xd6, 0x56, 0x88, 0xd3, 0xa1, 0x4d, 0xbd, 0x86, - 0x30, 0x6f, 0xaa, 0x03, 0x87, 0x1e, 0xec, 0xe3, 0xc0, 0x4f, 0x51, 0xe3, 0x1f, 0xc1, 0x4e, 0x43, - 0xe0, 0xc3, 0x8a, 0x68, 0x8c, 0xc5, 0x12, 0x63, 0x42, 0x03, 0x57, 0x45, 0x0d, 0x31, 0x10, 0xc8, - 0xeb, 0x1c, 0xe2, 0xde, 0x0b, 0xcc, 0x6b, 0x5a, 0xe3, 0xbf, 0x9e, 0x79, 0x1a, 0x8d, 0x41, 0xdd, - 0x25, 0x48, 0xc2, 0x86, 0xc7, 0x51, 0x7e, 0x79, 0xb6, 0x51, 0xd5, 0xde, 0xae, 0x56, 0x0a, 0x43, - 0x18, 0xa1, 0x5c, 0xa5, 0xba, 0x54, 0xab, 0x56, 0x0a, 0xa9, 0x67, 0xfe, 0x57, 0x0a, 0xa1, 0xc6, - 0xdc, 0x4a, 0x9d, 0x13, 0x8e, 0xa1, 0x91, 0xda, 0xd2, 0xdb, 0xa5, 0x85, 0x1a, 0xa5, 0xcb, 0xa3, - 0xec, 0x72, 0xbd, 0xba, 0x54, 0x48, 0xe1, 0x51, 0x34, 0x5c, 0x5e, 0x58, 0x6e, 0x54, 0x0b, 0x69, - 0x0a, 0xd4, 0xaa, 0xa5, 0x4a, 0x21, 0x43, 0x81, 0x77, 0xb5, 0xda, 0x4a, 0xb5, 0x90, 0xa5, 0x7f, - 0x2e, 0x34, 0x56, 0x4a, 0x2b, 0x85, 0x61, 0xfa, 0xe7, 0x1c, 0xfc, 0x99, 0xa3, 0xcc, 0x1a, 0xd5, - 0x15, 0xf8, 0x31, 0x42, 0x9b, 0x30, 0xe7, 0xff, 0xca, 0x53, 0x14, 0x65, 0x5d, 0xa9, 0x69, 0x85, - 0x51, 0xfa, 0x83, 0xb2, 0xa4, 0x3f, 0x10, 0x6d, 0x9c, 0x56, 0x5d, 0x5c, 0x7e, 0xbb, 0x5a, 0x18, - 0xa3, 0xbc, 0x16, 0x6f, 0x53, 0xf0, 0x38, 0xfd, 0x53, 0x5b, 0xa4, 0x7f, 0x4e, 0x50, 0x4e, 0x5a, - 0xb5, 0xb4, 0x50, 0x2f, 0xad, 0xcc, 0x17, 0x26, 0x69, 0x7b, 0x80, 0xe7, 0x14, 0x2b, 0xb9, 0x54, - 0x5a, 0xac, 0x16, 0x0a, 0x9c, 0xa6, 0xb2, 0x50, 0x5b, 0xba, 0x5d, 0x38, 0x05, 0x0d, 0x79, 0x67, - 0x11, 0x7e, 0x60, 0x5a, 0x00, 0xfe, 0x3a, 0xfd, 0xcc, 0x77, 0xa0, 0xdc, 0x72, 0x03, 0x6e, 0x15, - 0xcf, 0xa3, 0xd3, 0xcb, 0x8d, 0xe6, 0xca, 0x3b, 0xf5, 0x6a, 0xf3, 0xce, 0x52, 0xa3, 0x5e, 0x2d, - 0xd7, 0xe6, 0x6a, 0x20, 0xaa, 0x53, 0x68, 0xc2, 0x47, 0x2c, 0xd4, 0x96, 0xee, 0x7c, 0xbe, 0x90, - 0x12, 0x41, 0x8b, 0xa5, 0xf2, 0x72, 0xa3, 0x90, 0xc6, 0xa7, 0xd1, 0x94, 0x0f, 0xba, 0x5b, 0x5b, - 0xaa, 0x2c, 0xdf, 0x6d, 0x14, 0x32, 0xcf, 0xdc, 0xf7, 0x03, 0xbf, 0x2f, 0x3b, 0xe6, 0x9a, 0x69, - 0xe1, 0x8b, 0xe8, 0xb1, 0x4a, 0xf5, 0xed, 0x5a, 0xb9, 0xda, 0x5c, 0xd6, 0x6a, 0xb7, 0x6a, 0x4b, - 0x91, 0x9a, 0xce, 0xa2, 0x53, 0x32, 0xba, 0x54, 0xaf, 0x15, 0x52, 0xf8, 0x1c, 0xc2, 0x32, 0xf8, - 0xcd, 0xd2, 0xe2, 0x5c, 0x21, 0x8d, 0x15, 0x74, 0x46, 0x86, 0xd7, 0x96, 0x56, 0xee, 0x2c, 0x55, - 0x0b, 0x99, 0x67, 0xfe, 0x6a, 0x0a, 0x9d, 0x4d, 0x7c, 0x5c, 0x82, 0x55, 0x74, 0xa9, 0xba, 0x50, - 0x6a, 0xac, 0xd4, 0xca, 0x8d, 0x6a, 0x49, 0x2b, 0xcf, 0x37, 0xcb, 0xa5, 0x95, 0xea, 0xad, 0x65, - 0xed, 0x9d, 0xe6, 0xad, 0xea, 0x52, 0x55, 0x2b, 0x2d, 0x14, 0x86, 0xf0, 0x53, 0xa8, 0xd8, 0x87, - 0xa6, 0x51, 0x2d, 0xdf, 0xd1, 0x6a, 0x2b, 0xef, 0x14, 0x52, 0xf8, 0x49, 0x74, 0xb1, 0x2f, 0x11, - 0xfd, 0x5d, 0x48, 0xe3, 0x4b, 0x68, 0xba, 0x1f, 0xc9, 0x5b, 0x0b, 0x85, 0xcc, 0x33, 0x7f, 0x21, - 0x85, 0x70, 0xfc, 0x75, 0x00, 0x7e, 0x02, 0x5d, 0xa0, 0x7a, 0xd1, 0xec, 0xdf, 0xc0, 0x27, 0xd1, - 0xc5, 0x44, 0x0a, 0xa1, 0x79, 0x45, 0xf4, 0x78, 0x1f, 0x12, 0xde, 0xb8, 0x0b, 0x48, 0x49, 0x26, - 0xa0, 0x4d, 0x9b, 0xad, 0x7c, 0xf0, 0x1f, 0x2f, 0x0d, 0x7d, 0xf0, 0x3b, 0x97, 0x52, 0xbf, 0xf1, - 0x3b, 0x97, 0x52, 0xbf, 0xfd, 0x3b, 0x97, 0x52, 0x5f, 0xb8, 0xb1, 0x9f, 0xc7, 0x13, 0x6c, 0x52, - 0x58, 0xcd, 0x81, 0x9b, 0xf0, 0xf3, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x71, 0xcd, 0x6e, 0x2d, - 0x31, 0x1e, 0x01, 0x00, + // 13175 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x1c, 0x47, + 0x76, 0x18, 0xf6, 0x03, 0x8b, 0x45, 0xe3, 0x6b, 0xd9, 0xa4, 0xc8, 0x11, 0x44, 0x72, 0xa5, 0xd1, + 0x1d, 0x45, 0xea, 0x28, 0xf0, 0x44, 0x52, 0xd2, 0x49, 0x27, 0x9d, 0xb4, 0xd8, 0x5d, 0x10, 0x2b, + 0xe2, 0x63, 0x35, 0x0b, 0x8a, 0xa7, 0x3b, 0x9f, 0xd6, 0x83, 0x9d, 0x26, 0x30, 0xc2, 0xee, 0xcc, + 0xde, 0xcc, 0x2c, 0x41, 0x28, 0x5f, 0xbe, 0xc4, 0x1f, 0x67, 0xe7, 0xec, 0x5c, 0x9c, 0x4a, 0x39, + 0x95, 0xa4, 0x2a, 0x76, 0x52, 0xa9, 0x72, 0x5c, 0x8e, 0x1d, 0x27, 0x29, 0x7f, 0xc4, 0x71, 0x25, + 0xce, 0x5d, 0x12, 0x39, 0x17, 0x3b, 0x76, 0x92, 0x72, 0xaa, 0xf2, 0x81, 0x73, 0x9c, 0x72, 0x52, + 0x85, 0x4a, 0xaa, 0x5c, 0x15, 0x57, 0x72, 0x71, 0x9c, 0x8f, 0xea, 0xd7, 0x3d, 0x33, 0xdd, 0x33, + 0xb3, 0x8b, 0x2f, 0x9e, 0x21, 0x88, 0xf8, 0x43, 0x62, 0xdf, 0x7b, 0xfd, 0xba, 0xe7, 0xf5, 0xeb, + 0xee, 0xd7, 0xdd, 0xaf, 0xdf, 0x43, 0x57, 0x3c, 0xd2, 0x26, 0x5d, 0xdb, 0xf1, 0xae, 0xb5, 0xc9, + 0x9a, 0xde, 0xda, 0xba, 0xe6, 0x6d, 0x75, 0x89, 0x7b, 0x8d, 0xdc, 0x27, 0x96, 0xe7, 0xff, 0x37, + 0xd3, 0x75, 0x6c, 0xcf, 0xc6, 0x39, 0xf6, 0x6b, 0xfa, 0xcc, 0x9a, 0xbd, 0x66, 0x03, 0xe8, 0x1a, + 0xfd, 0x8b, 0x61, 0xa7, 0xcf, 0xaf, 0xd9, 0xf6, 0x5a, 0x9b, 0x5c, 0x83, 0x5f, 0xab, 0xbd, 0x7b, + 0xd7, 0x5c, 0xcf, 0xe9, 0xb5, 0x3c, 0x8e, 0x2d, 0x46, 0xb1, 0x9e, 0xd9, 0x21, 0xae, 0xa7, 0x77, + 0xba, 0x9c, 0xe0, 0x62, 0x94, 0x60, 0xd3, 0xd1, 0xbb, 0x5d, 0xe2, 0xf0, 0xca, 0xa7, 0x9f, 0x4a, + 0x6e, 0x27, 0xfc, 0xcb, 0x49, 0x9e, 0x4b, 0x26, 0xf1, 0x19, 0x45, 0x38, 0xaa, 0x3f, 0x9c, 0x46, + 0xf9, 0x45, 0xe2, 0xe9, 0x86, 0xee, 0xe9, 0xf8, 0x3c, 0x1a, 0xae, 0x59, 0x06, 0x79, 0xa0, 0xa4, + 0x9e, 0x4c, 0x5d, 0xce, 0xcc, 0xe6, 0x76, 0xb6, 0x8b, 0x69, 0x62, 0x6a, 0x0c, 0x88, 0x2f, 0xa0, + 0xec, 0xca, 0x56, 0x97, 0x28, 0xe9, 0x27, 0x53, 0x97, 0x47, 0x67, 0x47, 0x77, 0xb6, 0x8b, 0xc3, + 0x20, 0x0b, 0x0d, 0xc0, 0xf8, 0x29, 0x94, 0xae, 0x55, 0x94, 0x0c, 0x20, 0x4f, 0xed, 0x6c, 0x17, + 0x27, 0x7a, 0xa6, 0x71, 0xd5, 0xee, 0x98, 0x1e, 0xe9, 0x74, 0xbd, 0x2d, 0x2d, 0x5d, 0xab, 0xe0, + 0x4b, 0x28, 0x5b, 0xb6, 0x0d, 0xa2, 0x64, 0x81, 0x08, 0xef, 0x6c, 0x17, 0x27, 0x5b, 0xb6, 0x41, + 0x04, 0x2a, 0xc0, 0xe3, 0x37, 0x50, 0x76, 0xc5, 0xec, 0x10, 0x65, 0xf8, 0xc9, 0xd4, 0xe5, 0xb1, + 0xeb, 0xd3, 0x33, 0x4c, 0x2a, 0x33, 0xbe, 0x54, 0x66, 0x56, 0x7c, 0xb1, 0xcd, 0x16, 0x3e, 0xd8, + 0x2e, 0x0e, 0xed, 0x6c, 0x17, 0xb3, 0x54, 0x92, 0x5f, 0xfd, 0x66, 0x31, 0xa5, 0x41, 0x49, 0xfc, + 0x2a, 0x1a, 0x2b, 0xb7, 0x7b, 0xae, 0x47, 0x9c, 0x25, 0xbd, 0x43, 0x94, 0x1c, 0x54, 0x38, 0xbd, + 0xb3, 0x5d, 0x3c, 0xdb, 0x62, 0xe0, 0xa6, 0xa5, 0x77, 0xc4, 0x8a, 0x45, 0x72, 0xf5, 0xe7, 0x53, + 0x68, 0xaa, 0x41, 0x5c, 0xd7, 0xb4, 0xad, 0x40, 0x36, 0x1f, 0x47, 0xa3, 0x1c, 0x54, 0xab, 0x80, + 0x7c, 0x46, 0x67, 0x47, 0x76, 0xb6, 0x8b, 0x19, 0xd7, 0x34, 0xb4, 0x10, 0x83, 0x3f, 0x89, 0x46, + 0xee, 0x9a, 0xde, 0xfa, 0xe2, 0x5c, 0x89, 0xcb, 0xe9, 0xec, 0xce, 0x76, 0x11, 0x6f, 0x9a, 0xde, + 0x7a, 0xb3, 0x73, 0x4f, 0x17, 0x2a, 0xf4, 0xc9, 0xf0, 0x02, 0x2a, 0xd4, 0x1d, 0xf3, 0xbe, 0xee, + 0x91, 0xdb, 0x64, 0xab, 0x6e, 0xb7, 0xcd, 0xd6, 0x16, 0x97, 0xe2, 0x93, 0x3b, 0xdb, 0xc5, 0xf3, + 0x5d, 0x86, 0x6b, 0x6e, 0x90, 0xad, 0x66, 0x17, 0xb0, 0x02, 0x93, 0x58, 0x49, 0xf5, 0x0f, 0xb2, + 0x68, 0xfc, 0x8e, 0x4b, 0x9c, 0xa0, 0xdd, 0x97, 0x50, 0x96, 0xfe, 0xe6, 0x4d, 0x06, 0x99, 0xf7, + 0x5c, 0xe2, 0x88, 0x32, 0xa7, 0x78, 0x7c, 0x05, 0x0d, 0x2f, 0xd8, 0x6b, 0xa6, 0xc5, 0x9b, 0x7d, + 0x7a, 0x67, 0xbb, 0x38, 0xd5, 0xa6, 0x00, 0x81, 0x92, 0x51, 0xe0, 0xcf, 0xa0, 0xf1, 0x5a, 0x87, + 0xea, 0x90, 0x6d, 0xe9, 0x9e, 0xed, 0xf0, 0xd6, 0x82, 0x74, 0x4d, 0x01, 0x2e, 0x14, 0x94, 0xe8, + 0xf1, 0x2b, 0x08, 0x95, 0xee, 0x36, 0x34, 0xbb, 0x4d, 0x4a, 0xda, 0x12, 0x57, 0x06, 0x28, 0xad, + 0x6f, 0xba, 0x4d, 0xc7, 0x6e, 0x93, 0xa6, 0xee, 0x88, 0xd5, 0x0a, 0xd4, 0xb8, 0x8a, 0x26, 0x4b, + 0xad, 0x16, 0x71, 0x5d, 0x8d, 0x7c, 0xb1, 0x47, 0x5c, 0xcf, 0x55, 0x86, 0x9f, 0xcc, 0x5c, 0x1e, + 0x9d, 0xbd, 0xb0, 0xb3, 0x5d, 0x7c, 0x5c, 0x07, 0x4c, 0xd3, 0xe1, 0x28, 0x81, 0x45, 0xa4, 0x10, + 0x9e, 0x45, 0x13, 0xa5, 0xf7, 0x7b, 0x0e, 0xa9, 0x19, 0xc4, 0xf2, 0x4c, 0x6f, 0x8b, 0x6b, 0xc8, + 0xf9, 0x9d, 0xed, 0xa2, 0xa2, 0x53, 0x44, 0xd3, 0xe4, 0x18, 0x81, 0x89, 0x5c, 0x04, 0x2f, 0xa3, + 0x53, 0xb7, 0xca, 0xf5, 0x06, 0x71, 0xee, 0x9b, 0x2d, 0x52, 0x6a, 0xb5, 0xec, 0x9e, 0xe5, 0x29, + 0x23, 0xc0, 0xe7, 0xa9, 0x9d, 0xed, 0xe2, 0x85, 0xb5, 0x56, 0xb7, 0xe9, 0x32, 0x6c, 0x53, 0x67, + 0x68, 0x81, 0x59, 0xbc, 0x2c, 0xfe, 0x1c, 0x9a, 0x58, 0x71, 0xa8, 0x16, 0x1a, 0x15, 0x42, 0xe1, + 0x4a, 0x1e, 0xf4, 0xff, 0xec, 0x0c, 0x9f, 0x80, 0x18, 0xd4, 0xef, 0x59, 0xd6, 0x58, 0x8f, 0x15, + 0x68, 0x1a, 0x80, 0x13, 0x1b, 0x2b, 0xb1, 0xc2, 0x04, 0x29, 0xf4, 0xe3, 0x4d, 0x87, 0x18, 0x31, + 0x6d, 0x1b, 0x85, 0x36, 0x5f, 0xd9, 0xd9, 0x2e, 0x7e, 0xdc, 0xe1, 0x34, 0xcd, 0x81, 0x6a, 0xd7, + 0x97, 0x95, 0xfa, 0x77, 0xb2, 0x68, 0x92, 0x7e, 0x95, 0xa0, 0x80, 0x25, 0x3a, 0x96, 0x28, 0x84, + 0x0e, 0x2d, 0xb7, 0xab, 0xb7, 0x08, 0xd7, 0xc5, 0x73, 0x3b, 0xdb, 0xc5, 0xd3, 0x96, 0x0f, 0x14, + 0xd8, 0x47, 0xe9, 0xf1, 0x15, 0x94, 0x67, 0xa0, 0x5a, 0x85, 0xab, 0xe7, 0xc4, 0xce, 0x76, 0x71, + 0xd4, 0x05, 0x58, 0xd3, 0x34, 0xb4, 0x00, 0x4d, 0xf5, 0x83, 0xfd, 0x3d, 0x6f, 0xbb, 0x1e, 0x65, + 0xce, 0xb5, 0x13, 0xf4, 0x83, 0x17, 0x58, 0xe7, 0x28, 0x51, 0x3f, 0xe4, 0x42, 0xf8, 0x65, 0x84, + 0x18, 0xa4, 0x64, 0x18, 0x0e, 0x57, 0xd1, 0xc7, 0x77, 0xb6, 0x8b, 0x8f, 0x71, 0x16, 0xba, 0x61, + 0x88, 0xfa, 0x2d, 0x10, 0xe3, 0x0e, 0x1a, 0x67, 0xbf, 0x16, 0xf4, 0x55, 0xd2, 0x66, 0xfa, 0x39, + 0x76, 0xfd, 0xb2, 0xdf, 0x89, 0xb2, 0x74, 0x66, 0x44, 0xd2, 0xaa, 0xe5, 0x39, 0x5b, 0xb3, 0x45, + 0x3e, 0xa5, 0x9d, 0xe3, 0x55, 0xb5, 0x01, 0x27, 0x0e, 0x26, 0xb1, 0x0c, 0x9d, 0xe9, 0xe6, 0x6c, + 0x67, 0x53, 0x77, 0x0c, 0x62, 0xcc, 0x6e, 0x89, 0x33, 0xdd, 0x3d, 0x1f, 0xdc, 0x5c, 0x15, 0x3b, + 0x4f, 0x24, 0xc7, 0x65, 0x34, 0xc1, 0xb8, 0x35, 0x7a, 0xab, 0xb7, 0x4d, 0xcb, 0xe0, 0xfa, 0x2b, + 0x4a, 0xcb, 0xed, 0xad, 0x36, 0x37, 0x4c, 0x4b, 0x9c, 0xcb, 0xe5, 0x32, 0xd3, 0xaf, 0xa3, 0x53, + 0xb1, 0xcf, 0xc0, 0x05, 0x94, 0xd9, 0x20, 0x5b, 0xac, 0xab, 0x35, 0xfa, 0x27, 0x3e, 0x83, 0x86, + 0xef, 0xeb, 0xed, 0x1e, 0x5f, 0x40, 0x34, 0xf6, 0xe3, 0x95, 0xf4, 0xa7, 0x52, 0x74, 0xbe, 0xc5, + 0x65, 0xdb, 0xb2, 0x48, 0xcb, 0x13, 0xa7, 0xdc, 0x17, 0xd1, 0xe8, 0x82, 0xdd, 0xd2, 0xdb, 0xd0, + 0x07, 0x4c, 0x67, 0x94, 0x9d, 0xed, 0xe2, 0x19, 0x2a, 0xfc, 0x99, 0x36, 0xc5, 0x08, 0x6d, 0x0a, + 0x49, 0x69, 0xe7, 0x69, 0xa4, 0x63, 0x7b, 0x04, 0x0a, 0xa6, 0xc3, 0xce, 0x83, 0x82, 0x0e, 0xa0, + 0xc4, 0xce, 0x0b, 0x89, 0xf1, 0x35, 0x94, 0xaf, 0xd3, 0x55, 0xa6, 0x65, 0xb7, 0xb9, 0xe2, 0xc0, + 0x44, 0x08, 0x2b, 0x8f, 0x50, 0x24, 0x20, 0x52, 0xe7, 0xd1, 0x64, 0xb9, 0x6d, 0x12, 0xcb, 0x13, + 0x5b, 0x4d, 0x27, 0xd4, 0xd2, 0x1a, 0xb1, 0x3c, 0xb1, 0xd5, 0x74, 0xd6, 0x6d, 0xea, 0x14, 0x2a, + 0xb6, 0x3a, 0x20, 0x55, 0x7f, 0x2d, 0x83, 0x1e, 0xbf, 0xdd, 0x5b, 0x25, 0x8e, 0x45, 0x3c, 0xe2, + 0xf2, 0xe5, 0x28, 0xe0, 0xba, 0x84, 0x4e, 0xc5, 0x90, 0x9c, 0x3b, 0x2c, 0x13, 0x1b, 0x01, 0xb2, + 0xc9, 0x57, 0x38, 0x71, 0xae, 0x89, 0x15, 0xc5, 0xf3, 0x68, 0x2a, 0x04, 0xd2, 0x46, 0xb8, 0x4a, + 0x1a, 0x26, 0xd2, 0x8b, 0x3b, 0xdb, 0xc5, 0x69, 0x81, 0x1b, 0x6d, 0xb6, 0xa8, 0x7d, 0xd1, 0x62, + 0xf8, 0x36, 0x2a, 0x84, 0xa0, 0x5b, 0x8e, 0xdd, 0xeb, 0xba, 0x4a, 0x06, 0x58, 0x15, 0x77, 0xb6, + 0x8b, 0x4f, 0x08, 0xac, 0xd6, 0x00, 0x29, 0x2e, 0x5f, 0xd1, 0x82, 0xf8, 0xbb, 0x53, 0x22, 0x37, + 0x3e, 0x82, 0xb2, 0x30, 0x82, 0x5e, 0xf2, 0x47, 0x50, 0x5f, 0x21, 0xcd, 0x44, 0x4b, 0xf2, 0x01, + 0x15, 0x69, 0x46, 0x6c, 0x40, 0xc5, 0x6a, 0x9c, 0x2e, 0xa3, 0xc7, 0x12, 0x79, 0xed, 0x4b, 0xab, + 0x7f, 0x27, 0x23, 0x72, 0xa9, 0xdb, 0x46, 0xd0, 0x99, 0xcb, 0x62, 0x67, 0xd6, 0x6d, 0x03, 0x6c, + 0x94, 0x54, 0xb8, 0x72, 0x08, 0x8d, 0xed, 0xda, 0x46, 0xd4, 0x54, 0x89, 0x97, 0xc5, 0xef, 0xa2, + 0xb3, 0x31, 0x20, 0x9b, 0x6a, 0x99, 0xf6, 0x5f, 0xda, 0xd9, 0x2e, 0xaa, 0x09, 0x5c, 0xa3, 0x33, + 0x6f, 0x1f, 0x2e, 0x58, 0x47, 0xe7, 0x04, 0xa9, 0xdb, 0x96, 0xa7, 0x9b, 0x16, 0x37, 0xad, 0xd8, + 0x28, 0x79, 0x66, 0x67, 0xbb, 0xf8, 0xb4, 0xa8, 0x83, 0x3e, 0x4d, 0xb4, 0xf1, 0xfd, 0xf8, 0x60, + 0x03, 0x29, 0x09, 0xa8, 0x5a, 0x47, 0x5f, 0xf3, 0xed, 0xc5, 0xcb, 0x3b, 0xdb, 0xc5, 0x8f, 0x25, + 0xd6, 0x61, 0x52, 0x2a, 0x71, 0x7d, 0xea, 0xc7, 0x09, 0x6b, 0x08, 0x87, 0xb8, 0x25, 0xdb, 0x20, + 0xf0, 0x0d, 0xc3, 0xc0, 0x5f, 0xdd, 0xd9, 0x2e, 0x5e, 0x14, 0xf8, 0x5b, 0xb6, 0x41, 0xa2, 0xcd, + 0x4f, 0x28, 0xad, 0xfe, 0x97, 0x14, 0xba, 0xd8, 0x28, 0x2d, 0x2e, 0xd4, 0x0c, 0x7f, 0x41, 0xaf, + 0x3b, 0xf6, 0x7d, 0xd3, 0x10, 0x46, 0xef, 0x2a, 0x3a, 0x17, 0x41, 0x55, 0xc1, 0x86, 0x08, 0x4c, + 0x49, 0xf8, 0x36, 0xdf, 0x58, 0xe8, 0x72, 0x9a, 0x26, 0x33, 0x34, 0x9a, 0x92, 0x1d, 0xdd, 0x8f, + 0x11, 0xed, 0xa3, 0x08, 0xaa, 0xb1, 0x6e, 0x3b, 0x5e, 0xab, 0xe7, 0x71, 0x25, 0x80, 0x3e, 0x8a, + 0xd5, 0xe1, 0x72, 0xa2, 0x01, 0x55, 0xf8, 0x7c, 0xd4, 0x1f, 0xce, 0xa0, 0xf3, 0xcb, 0x1b, 0x9e, + 0xae, 0x11, 0xd7, 0xee, 0x39, 0x2d, 0xe2, 0xde, 0xe9, 0x1a, 0xba, 0x47, 0x42, 0xc5, 0x2e, 0xa2, + 0xe1, 0x92, 0x61, 0x10, 0x03, 0xbe, 0x6a, 0x98, 0xed, 0x11, 0x74, 0x0a, 0xd0, 0x18, 0x1c, 0x7f, + 0x1c, 0x8d, 0xf0, 0x32, 0xd0, 0xa8, 0xe1, 0xd9, 0xb1, 0x9d, 0xed, 0xe2, 0x48, 0x8f, 0x81, 0x34, + 0x1f, 0x47, 0xc9, 0x2a, 0xa4, 0x4d, 0x28, 0x59, 0x26, 0x24, 0x33, 0x18, 0x48, 0xf3, 0x71, 0xf8, + 0x2d, 0x34, 0x09, 0x6c, 0x83, 0xf6, 0xf0, 0xa9, 0xe2, 0x8c, 0x3f, 0x55, 0x88, 0x8d, 0x65, 0x33, + 0x39, 0xb4, 0xa6, 0xe9, 0xf8, 0x05, 0xb4, 0x08, 0x03, 0x7c, 0x17, 0x15, 0x78, 0x23, 0x42, 0xa6, + 0xc3, 0x03, 0x98, 0x3e, 0xb6, 0xb3, 0x5d, 0x3c, 0xc5, 0xdb, 0x2f, 0xb0, 0x8d, 0x31, 0xa1, 0x8c, + 0x79, 0xb3, 0x43, 0xc6, 0xb9, 0xdd, 0x18, 0xf3, 0x2f, 0x16, 0x19, 0x47, 0x99, 0xa8, 0xef, 0xa0, + 0x71, 0xb1, 0x20, 0x3e, 0x0b, 0xfb, 0x30, 0xa6, 0x56, 0xb0, 0x83, 0x33, 0x0d, 0xd8, 0x7c, 0x3d, + 0x8f, 0xc6, 0x2a, 0xc4, 0x6d, 0x39, 0x66, 0x97, 0x2e, 0xb2, 0x5c, 0x27, 0xa6, 0x76, 0xb6, 0x8b, + 0x63, 0x46, 0x08, 0xd6, 0x44, 0x1a, 0xf5, 0x7f, 0xa4, 0xd0, 0x59, 0xca, 0xbb, 0xe4, 0xba, 0xe6, + 0x9a, 0xd5, 0x11, 0x57, 0xb9, 0xab, 0x28, 0xd7, 0x80, 0xfa, 0x78, 0x4d, 0x67, 0x76, 0xb6, 0x8b, + 0x05, 0xd6, 0x02, 0x41, 0x93, 0x38, 0x4d, 0xb0, 0x09, 0x49, 0xef, 0xb2, 0x09, 0xa1, 0xd6, 0x9b, + 0xa7, 0x3b, 0x9e, 0x69, 0xad, 0x35, 0x3c, 0xdd, 0xeb, 0xb9, 0x92, 0xf5, 0xc6, 0x31, 0x4d, 0x17, + 0x50, 0x92, 0xf5, 0x26, 0x15, 0xc2, 0xaf, 0xa3, 0xf1, 0xaa, 0x65, 0x84, 0x4c, 0xd8, 0xfc, 0xf1, + 0x04, 0x35, 0xaa, 0x08, 0xc0, 0xe3, 0x2c, 0xa4, 0x02, 0xea, 0xdf, 0x4c, 0x21, 0x85, 0xed, 0x18, + 0x16, 0x4c, 0xd7, 0x5b, 0x24, 0x9d, 0x55, 0x61, 0x30, 0xcf, 0xf9, 0x5b, 0x10, 0x8a, 0x13, 0xa6, + 0x6e, 0x58, 0x39, 0xf9, 0x16, 0xa4, 0x6d, 0xba, 0x5e, 0x74, 0xee, 0x88, 0x94, 0xc2, 0x35, 0x34, + 0xc2, 0x38, 0xb3, 0xa5, 0x77, 0xec, 0xba, 0xe2, 0x2b, 0x42, 0xb4, 0x6a, 0xa6, 0x0c, 0x1d, 0x46, + 0x2c, 0xee, 0x21, 0x79, 0x79, 0xf5, 0x6f, 0xa5, 0x51, 0x21, 0x5a, 0x08, 0xdf, 0x45, 0xf9, 0x37, + 0x6d, 0xd3, 0x22, 0xc6, 0xb2, 0x05, 0x2d, 0x1c, 0xbc, 0x93, 0xf6, 0xcd, 0xce, 0xd3, 0xef, 0x41, + 0x99, 0xa6, 0x2d, 0xec, 0xc0, 0x60, 0x63, 0x1d, 0x30, 0xc3, 0x9f, 0x43, 0xa3, 0xd4, 0x64, 0xba, + 0x0f, 0x9c, 0xd3, 0xbb, 0x72, 0x7e, 0x92, 0x73, 0x3e, 0xe3, 0xb0, 0x42, 0x71, 0xd6, 0x21, 0x3b, + 0xaa, 0x57, 0x1a, 0xd1, 0x5d, 0xdb, 0xe2, 0x3d, 0x0f, 0x7a, 0xe5, 0x00, 0x44, 0xd4, 0x2b, 0x46, + 0x43, 0x2d, 0x3d, 0xf6, 0xb1, 0xd0, 0x0d, 0x82, 0x99, 0xce, 0x64, 0x15, 0xed, 0x01, 0x81, 0x58, + 0xfd, 0xde, 0x34, 0x7a, 0x2e, 0x14, 0x99, 0x46, 0xee, 0x9b, 0x64, 0x93, 0x8b, 0x73, 0xdd, 0xec, + 0xf2, 0x0d, 0x0e, 0x55, 0x79, 0xb7, 0xbc, 0xae, 0x5b, 0x6b, 0xc4, 0xa0, 0x3b, 0x64, 0xba, 0x0b, + 0x75, 0x95, 0x14, 0x58, 0x37, 0x30, 0x9d, 0xd0, 0xdd, 0xaa, 0xd8, 0x23, 0x8c, 0x02, 0xdb, 0x28, + 0xb7, 0xe2, 0xe8, 0xa6, 0xe7, 0xf7, 0x6c, 0x29, 0xde, 0xb3, 0x7b, 0xa8, 0x71, 0x86, 0xf1, 0x60, + 0x56, 0x0c, 0x08, 0xc2, 0x03, 0x80, 0x28, 0x08, 0x46, 0x32, 0xfd, 0x32, 0x1a, 0x13, 0x88, 0xf7, + 0x65, 0xa6, 0xfc, 0x42, 0x56, 0xd4, 0x75, 0xbf, 0x59, 0x5c, 0xd7, 0xaf, 0x51, 0x1d, 0x75, 0x5d, + 0xba, 0x08, 0x33, 0x25, 0xe7, 0x9a, 0x08, 0x20, 0x59, 0x13, 0x01, 0x84, 0x6f, 0xa0, 0x3c, 0x63, + 0x11, 0x6c, 0xd5, 0x60, 0x9b, 0xe7, 0x00, 0x4c, 0x5e, 0xc9, 0x02, 0x42, 0xfc, 0x13, 0x29, 0x74, + 0x61, 0xa0, 0x24, 0x40, 0x19, 0xc6, 0xae, 0xbf, 0x70, 0x20, 0x31, 0xce, 0x3e, 0xb7, 0xb3, 0x5d, + 0xbc, 0xd2, 0x09, 0x48, 0x9a, 0x8e, 0x40, 0xd3, 0x6c, 0x31, 0x22, 0xa1, 0x5d, 0x83, 0x9b, 0x42, + 0x6d, 0x2d, 0x56, 0xe9, 0x1c, 0x9c, 0x33, 0x58, 0xad, 0x2d, 0xbf, 0x91, 0xd9, 0xd0, 0xd6, 0xe2, + 0xdf, 0x7b, 0xcf, 0x27, 0x49, 0xa8, 0xa6, 0x0f, 0x17, 0xdc, 0x42, 0xe7, 0x18, 0xa6, 0xa2, 0x6f, + 0x2d, 0xdf, 0x5b, 0xb4, 0x2d, 0x6f, 0xdd, 0xaf, 0x60, 0x58, 0xdc, 0xa8, 0x43, 0x05, 0x86, 0xbe, + 0xd5, 0xb4, 0xef, 0x35, 0x3b, 0x94, 0x2a, 0xa1, 0x8e, 0x7e, 0x9c, 0xe8, 0x44, 0xcb, 0xc7, 0x9c, + 0x3f, 0x05, 0xe5, 0xc2, 0x63, 0x14, 0x7f, 0x9c, 0xc6, 0x27, 0x9c, 0x48, 0x21, 0xf5, 0x9b, 0xc3, + 0x74, 0xb3, 0x0b, 0x67, 0x5f, 0x30, 0x05, 0xe3, 0x57, 0xc2, 0xd3, 0x44, 0x3e, 0xe7, 0x14, 0xfc, + 0x3e, 0x0b, 0xce, 0x2d, 0xc6, 0xe9, 0x7c, 0xf0, 0xeb, 0xdb, 0xc5, 0xd4, 0xce, 0x76, 0x71, 0x48, + 0xcb, 0x0b, 0x1b, 0xa7, 0x70, 0x91, 0x10, 0x56, 0x45, 0xf1, 0x34, 0x2b, 0x52, 0x96, 0x2d, 0x1a, + 0xaf, 0xa3, 0x11, 0xde, 0x06, 0xae, 0x26, 0xe7, 0xc2, 0xbd, 0xb6, 0x74, 0x86, 0x17, 0x29, 0xed, + 0x97, 0xc2, 0xaf, 0xa2, 0x1c, 0xdb, 0xbf, 0x42, 0x0f, 0x0a, 0x07, 0x2e, 0xf2, 0x5e, 0x3d, 0x52, + 0x9c, 0x97, 0xc1, 0xf3, 0x08, 0x85, 0x7b, 0xd7, 0xe0, 0xc8, 0x92, 0x73, 0x88, 0xef, 0x6a, 0x23, + 0x5c, 0x84, 0xb2, 0xf8, 0x45, 0x34, 0xbe, 0x42, 0x9c, 0x8e, 0x69, 0xe9, 0xed, 0x86, 0xf9, 0xbe, + 0x7f, 0x6a, 0x09, 0xab, 0xa5, 0x6b, 0xbe, 0x2f, 0x0e, 0x37, 0x89, 0x0e, 0x7f, 0x21, 0x69, 0x6f, + 0x38, 0x02, 0x0d, 0x79, 0x6a, 0xd7, 0x4d, 0x53, 0xa4, 0x3d, 0x09, 0x5b, 0xc5, 0xb7, 0xd0, 0x84, + 0xb4, 0x2d, 0xe0, 0xc7, 0x52, 0x17, 0xe2, 0xac, 0x85, 0x3d, 0x4e, 0x84, 0xad, 0xcc, 0x81, 0xaa, + 0x5f, 0xcd, 0x32, 0x3d, 0x53, 0x6f, 0x97, 0xed, 0x4e, 0x47, 0xb7, 0x0c, 0x65, 0x34, 0x54, 0x3f, + 0x93, 0x61, 0x9a, 0x2d, 0x86, 0x12, 0xd5, 0x4f, 0x2e, 0x44, 0xb7, 0x9e, 0xbc, 0x0f, 0x35, 0xd2, + 0xb2, 0x1d, 0xba, 0x80, 0x2b, 0x08, 0x84, 0x06, 0x7b, 0x3e, 0x97, 0xe1, 0x9a, 0x8e, 0x8f, 0x14, + 0xf7, 0x7c, 0xd1, 0x82, 0x6f, 0x66, 0xf3, 0x63, 0x85, 0xf1, 0xe8, 0x41, 0xa1, 0xfa, 0x37, 0x32, + 0x68, 0x8c, 0x93, 0xd2, 0xf5, 0xef, 0x44, 0xc1, 0x0f, 0xa3, 0xe0, 0x89, 0x8a, 0x9a, 0x7b, 0x58, + 0x8a, 0xaa, 0x7e, 0x25, 0x1d, 0xcc, 0x46, 0x75, 0xc7, 0xb4, 0x0e, 0x37, 0x1b, 0x5d, 0x42, 0xa8, + 0xbc, 0xde, 0xb3, 0x36, 0xd8, 0x85, 0x48, 0x3a, 0xbc, 0x10, 0x69, 0x99, 0x9a, 0x80, 0xc1, 0x17, + 0x50, 0xb6, 0x42, 0xf9, 0xd3, 0x9e, 0x19, 0x9f, 0x1d, 0xfd, 0x80, 0x71, 0x4a, 0x3d, 0xa7, 0x01, + 0x98, 0xee, 0x88, 0x66, 0xb7, 0x3c, 0xc2, 0x6c, 0xd0, 0x0c, 0xdb, 0x11, 0xad, 0x52, 0x80, 0xc6, + 0xe0, 0xf8, 0x26, 0x3a, 0x55, 0x21, 0x6d, 0x7d, 0x6b, 0xd1, 0x6c, 0xb7, 0x4d, 0x97, 0xb4, 0x6c, + 0xcb, 0x70, 0x41, 0xc8, 0xbc, 0xba, 0x8e, 0xab, 0xc5, 0x09, 0xb0, 0x8a, 0x72, 0xcb, 0xf7, 0xee, + 0xb9, 0xc4, 0x03, 0xf1, 0x65, 0x66, 0xd1, 0xce, 0x76, 0x31, 0x67, 0x03, 0x44, 0xe3, 0x18, 0xf5, + 0xa7, 0x53, 0x74, 0xcb, 0xe1, 0x6e, 0x78, 0x76, 0x37, 0xd0, 0xf2, 0x43, 0x89, 0xe4, 0x4a, 0x68, + 0x0c, 0xa4, 0xe1, 0x6b, 0xa7, 0xf8, 0xd7, 0x8e, 0x70, 0x83, 0x20, 0x34, 0x03, 0x12, 0xbf, 0x2a, + 0xb3, 0xcb, 0x57, 0xa9, 0xbf, 0x9b, 0x46, 0xe7, 0x78, 0x8b, 0xcb, 0x6d, 0xb3, 0xbb, 0x6a, 0xeb, + 0x8e, 0xa1, 0x91, 0x16, 0x31, 0xef, 0x93, 0xe3, 0x39, 0xf0, 0xe4, 0xa1, 0x93, 0x3d, 0xc4, 0xd0, + 0xb9, 0x0e, 0xbb, 0x37, 0x2a, 0x19, 0x38, 0xd4, 0x64, 0x96, 0x40, 0x61, 0x67, 0xbb, 0x38, 0x6e, + 0x30, 0x30, 0x1c, 0x49, 0x6b, 0x22, 0x11, 0x55, 0x92, 0x05, 0x62, 0xad, 0x79, 0xeb, 0xa0, 0x24, + 0xc3, 0x4c, 0x49, 0xda, 0x00, 0xd1, 0x38, 0x46, 0xfd, 0x6f, 0x69, 0x74, 0x26, 0x2a, 0xf2, 0x06, + 0xb1, 0x8c, 0x13, 0x79, 0x7f, 0x7b, 0xe4, 0xfd, 0x7b, 0x19, 0xf4, 0x04, 0x2f, 0xd3, 0x58, 0xd7, + 0x1d, 0x62, 0x54, 0x4c, 0x87, 0xb4, 0x3c, 0xdb, 0xd9, 0x3a, 0xc6, 0x06, 0xd4, 0xc3, 0x13, 0xfb, + 0x4d, 0x94, 0xe3, 0x7b, 0x76, 0xb6, 0xce, 0x4c, 0x06, 0x2d, 0x01, 0x68, 0x6c, 0x85, 0x62, 0xfb, + 0xfd, 0x48, 0x67, 0xe5, 0xf6, 0xd2, 0x59, 0x9f, 0x42, 0x13, 0x81, 0xe8, 0x61, 0xf7, 0x38, 0x12, + 0x5a, 0x5b, 0x86, 0x8f, 0x80, 0x0d, 0xa4, 0x26, 0x13, 0x42, 0x6d, 0x3e, 0xa0, 0x56, 0x01, 0x6b, + 0x68, 0x82, 0xd7, 0x16, 0x94, 0x33, 0x0d, 0x4d, 0x24, 0x52, 0xb7, 0xb3, 0x68, 0x3a, 0xb9, 0xdb, + 0x35, 0xa2, 0x1b, 0x27, 0xbd, 0xfe, 0x91, 0xec, 0x75, 0xfc, 0x14, 0xca, 0xd6, 0x75, 0x6f, 0x9d, + 0x5f, 0xb0, 0xc2, 0x9d, 0xe5, 0x3d, 0xb3, 0x4d, 0x9a, 0x5d, 0xdd, 0x5b, 0xd7, 0x00, 0x25, 0xcc, + 0x19, 0x08, 0x38, 0x26, 0xcc, 0x19, 0xc2, 0x62, 0x3f, 0xf6, 0x64, 0xea, 0x72, 0x36, 0x71, 0xb1, + 0xff, 0x66, 0xb6, 0xdf, 0xbc, 0x72, 0xd7, 0x31, 0x3d, 0x72, 0xa2, 0x61, 0x27, 0x1a, 0x76, 0x48, + 0x0d, 0xfb, 0x97, 0x69, 0x34, 0x11, 0x6c, 0x9a, 0xde, 0x23, 0xad, 0xa3, 0x59, 0xab, 0xc2, 0xad, + 0x4c, 0xe6, 0xd0, 0x5b, 0x99, 0xc3, 0x28, 0x94, 0x1a, 0x9c, 0x53, 0x32, 0xd3, 0x00, 0x24, 0xc6, + 0xce, 0x29, 0x83, 0xd3, 0xc9, 0xa7, 0xd0, 0xc8, 0xa2, 0xfe, 0xc0, 0xec, 0xf4, 0x3a, 0xdc, 0x4a, + 0x07, 0x87, 0xa1, 0x8e, 0xfe, 0x40, 0xf3, 0xe1, 0xea, 0xbf, 0x4e, 0xa1, 0x49, 0x2e, 0x54, 0xce, + 0xfc, 0x50, 0x52, 0x0d, 0xa5, 0x93, 0x3e, 0xb4, 0x74, 0x32, 0x07, 0x97, 0x8e, 0xfa, 0x97, 0x33, + 0x48, 0x99, 0x33, 0xdb, 0x64, 0xc5, 0xd1, 0x2d, 0xf7, 0x1e, 0x71, 0xf8, 0x76, 0xba, 0x4a, 0x59, + 0x1d, 0xea, 0x03, 0x85, 0x29, 0x25, 0x7d, 0xa0, 0x29, 0xe5, 0x13, 0x68, 0x94, 0x37, 0x26, 0x70, + 0x56, 0x83, 0x51, 0xe3, 0xf8, 0x40, 0x2d, 0xc4, 0x53, 0xe2, 0x52, 0xb7, 0xeb, 0xd8, 0xf7, 0x89, + 0xc3, 0xae, 0x96, 0x38, 0xb1, 0xee, 0x03, 0xb5, 0x10, 0x2f, 0x70, 0x26, 0xbe, 0xbd, 0x28, 0x72, + 0x26, 0x8e, 0x16, 0xe2, 0xf1, 0x65, 0x94, 0x5f, 0xb0, 0x5b, 0x3a, 0x08, 0x9a, 0x4d, 0x2b, 0xe3, + 0x3b, 0xdb, 0xc5, 0x7c, 0x9b, 0xc3, 0xb4, 0x00, 0x4b, 0x29, 0x2b, 0xf6, 0xa6, 0xd5, 0xb6, 0x75, + 0xe6, 0x9c, 0x91, 0x67, 0x94, 0x06, 0x87, 0x69, 0x01, 0x96, 0x52, 0x52, 0x99, 0x83, 0xd3, 0x4b, + 0x3e, 0xe4, 0x79, 0x8f, 0xc3, 0xb4, 0x00, 0xab, 0xfe, 0x74, 0x96, 0x6a, 0xaf, 0x6b, 0xbe, 0xff, + 0xc8, 0xaf, 0x0b, 0xe1, 0x80, 0x19, 0x3e, 0xc0, 0x80, 0x79, 0x64, 0x0e, 0xec, 0xd4, 0xff, 0x39, + 0x82, 0x10, 0x97, 0x7e, 0xf5, 0x64, 0x73, 0x78, 0x38, 0xad, 0xa9, 0xa0, 0x53, 0x55, 0x6b, 0x5d, + 0xb7, 0x5a, 0xc4, 0x08, 0x8f, 0x2d, 0x73, 0x30, 0xb4, 0xc1, 0x59, 0x94, 0x70, 0x64, 0x78, 0x6e, + 0xa9, 0xc5, 0x0b, 0xe0, 0xe7, 0xd1, 0x58, 0xcd, 0xf2, 0x88, 0xa3, 0xb7, 0x3c, 0xf3, 0x3e, 0xe1, + 0x53, 0x03, 0x5c, 0xe7, 0x9a, 0x21, 0x58, 0x13, 0x69, 0xf0, 0x4d, 0x34, 0x5e, 0xd7, 0x1d, 0xcf, + 0x6c, 0x99, 0x5d, 0xdd, 0xf2, 0x5c, 0x25, 0x0f, 0x33, 0x1a, 0x58, 0x18, 0x5d, 0x01, 0xae, 0x49, + 0x54, 0xf8, 0x0b, 0x68, 0x14, 0xb6, 0xa6, 0xe0, 0x91, 0x3b, 0xba, 0xeb, 0x6d, 0xdf, 0xd3, 0xa1, + 0xfb, 0x1a, 0x3b, 0x7d, 0x85, 0x6b, 0xdb, 0xe8, 0x85, 0x5f, 0xc0, 0x11, 0x7f, 0x16, 0x8d, 0x54, + 0x2d, 0x03, 0x98, 0xa3, 0x5d, 0x99, 0xab, 0x9c, 0xf9, 0xd9, 0x90, 0xb9, 0xdd, 0x8d, 0xf0, 0xf6, + 0xd9, 0x25, 0x8f, 0xb2, 0xb1, 0x6f, 0xdf, 0x28, 0x1b, 0xff, 0x36, 0x1c, 0x8b, 0x4f, 0x3c, 0xac, + 0x63, 0xf1, 0xc9, 0x03, 0x1e, 0x8b, 0xab, 0xef, 0xa3, 0xb1, 0xd9, 0xfa, 0x5c, 0x30, 0x7a, 0x1f, + 0x47, 0x99, 0x3a, 0x77, 0x2f, 0xc8, 0x32, 0x7b, 0xa6, 0x6b, 0x1a, 0x1a, 0x85, 0xe1, 0x2b, 0x28, + 0x5f, 0x06, 0x17, 0x2f, 0x7e, 0xf5, 0x97, 0x65, 0xeb, 0x5f, 0x0b, 0x60, 0xe0, 0xa5, 0xe9, 0xa3, + 0xf1, 0xc7, 0xd1, 0x48, 0xdd, 0xb1, 0xd7, 0x1c, 0xbd, 0xc3, 0xd7, 0x60, 0xf0, 0xef, 0xe8, 0x32, + 0x90, 0xe6, 0xe3, 0xd4, 0x3f, 0x97, 0xf2, 0xcd, 0x76, 0x5a, 0xa2, 0xd1, 0x83, 0xa3, 0x79, 0xa8, + 0x3b, 0xcf, 0x4a, 0xb8, 0x0c, 0xa4, 0xf9, 0x38, 0x7c, 0x05, 0x0d, 0x57, 0x1d, 0xc7, 0x76, 0x44, + 0x2f, 0x66, 0x42, 0x01, 0xe2, 0x1d, 0x2d, 0x50, 0xe0, 0x97, 0xd0, 0x18, 0x9b, 0x73, 0xd8, 0x89, + 0x66, 0x66, 0xd0, 0xf5, 0xa6, 0x48, 0xa9, 0x7e, 0x2d, 0x23, 0xd8, 0x6c, 0x4c, 0xe2, 0x8f, 0xe0, + 0xad, 0xc0, 0x0d, 0x94, 0x99, 0xad, 0xcf, 0xf1, 0x09, 0xf0, 0xb4, 0x5f, 0x54, 0x50, 0x95, 0x48, + 0x39, 0x4a, 0x8d, 0xcf, 0xa3, 0x6c, 0x9d, 0xaa, 0x4f, 0x0e, 0xd4, 0x23, 0xbf, 0xb3, 0x5d, 0xcc, + 0x76, 0xa9, 0xfe, 0x00, 0x14, 0xb0, 0x74, 0x33, 0xc3, 0x76, 0x4c, 0x0c, 0x1b, 0xee, 0x63, 0xce, + 0xa3, 0x6c, 0xc9, 0x59, 0xbb, 0xcf, 0x67, 0x2d, 0xc0, 0xea, 0xce, 0xda, 0x7d, 0x0d, 0xa0, 0xf8, + 0x1a, 0x42, 0x1a, 0xf1, 0x7a, 0x8e, 0x05, 0x0f, 0x0c, 0x46, 0xe1, 0xfc, 0x0d, 0x66, 0x43, 0x07, + 0xa0, 0xcd, 0x96, 0x6d, 0x10, 0x4d, 0x20, 0x51, 0xff, 0x7a, 0x78, 0xb1, 0x53, 0x31, 0xdd, 0x8d, + 0x93, 0x2e, 0xdc, 0x47, 0x17, 0xea, 0xfc, 0x88, 0x33, 0xde, 0x49, 0x45, 0x34, 0x3c, 0xd7, 0xd6, + 0xd7, 0x5c, 0xe8, 0x43, 0xee, 0x00, 0x76, 0x8f, 0x02, 0x34, 0x06, 0x8f, 0xf4, 0x53, 0x7e, 0xf7, + 0x7e, 0xfa, 0x91, 0xe1, 0x60, 0xb4, 0x2d, 0x11, 0x6f, 0xd3, 0x76, 0x4e, 0xba, 0x6a, 0xaf, 0x5d, + 0x75, 0x09, 0x8d, 0x34, 0x9c, 0x96, 0x70, 0x74, 0x01, 0xfb, 0x01, 0xd7, 0x69, 0xb1, 0x63, 0x0b, + 0x1f, 0x49, 0xe9, 0x2a, 0xae, 0x07, 0x74, 0x23, 0x21, 0x9d, 0xe1, 0x7a, 0x9c, 0x8e, 0x23, 0x39, + 0x5d, 0xdd, 0x76, 0x3c, 0xde, 0x71, 0x01, 0x5d, 0xd7, 0x76, 0x3c, 0xcd, 0x47, 0xe2, 0x4f, 0x20, + 0xb4, 0x52, 0xae, 0xbf, 0x4d, 0x1c, 0x10, 0xd7, 0x68, 0xe8, 0xc0, 0x77, 0x9f, 0x81, 0x34, 0x01, + 0x8d, 0x57, 0xd0, 0xe8, 0x72, 0x97, 0x38, 0x6c, 0x2b, 0x44, 0x2d, 0x80, 0xc9, 0xeb, 0xcf, 0x44, + 0x44, 0xcb, 0xfb, 0x7d, 0x86, 0xff, 0x1f, 0x90, 0xb3, 0xf5, 0xc5, 0xf6, 0x7f, 0x6a, 0x21, 0x23, + 0xfc, 0x12, 0xca, 0x95, 0x98, 0x9d, 0x37, 0x06, 0x2c, 0x03, 0x91, 0xc1, 0x16, 0x94, 0xa1, 0xd8, + 0x9e, 0x5d, 0x87, 0xbf, 0x35, 0x4e, 0xae, 0x5e, 0x41, 0x85, 0x68, 0x35, 0x78, 0x0c, 0x8d, 0x94, + 0x97, 0x97, 0x96, 0xaa, 0xe5, 0x95, 0xc2, 0x10, 0xce, 0xa3, 0x6c, 0xa3, 0xba, 0x54, 0x29, 0xa4, + 0xd4, 0x9f, 0x14, 0x66, 0x10, 0xaa, 0x5a, 0x27, 0x57, 0xc3, 0x87, 0xba, 0x6f, 0x29, 0xc0, 0x7d, + 0x28, 0x9c, 0x18, 0x74, 0x4c, 0xcf, 0x23, 0x06, 0x5f, 0x25, 0xe0, 0xbe, 0xd0, 0x7b, 0xa0, 0xc5, + 0xf0, 0xf8, 0x2a, 0x9a, 0x00, 0x18, 0xbf, 0x22, 0x64, 0xfb, 0x63, 0x5e, 0xc0, 0x79, 0xa0, 0xc9, + 0x48, 0xf5, 0x1b, 0xe1, 0xed, 0xf0, 0x02, 0xd1, 0x8f, 0xeb, 0x8d, 0xe2, 0x87, 0xa4, 0xbf, 0xd4, + 0x3f, 0xc8, 0xb2, 0x67, 0x0e, 0xec, 0x45, 0xd8, 0x51, 0x88, 0x32, 0x3c, 0xd2, 0xcd, 0xec, 0xe3, + 0x48, 0xf7, 0x2a, 0xca, 0x2d, 0x12, 0x6f, 0xdd, 0xf6, 0xbd, 0xb5, 0xc0, 0xad, 0xae, 0x03, 0x10, + 0xd1, 0xad, 0x8e, 0xd1, 0xe0, 0x0d, 0x84, 0xfd, 0xe7, 0x5e, 0x25, 0xcf, 0x73, 0xcc, 0xd5, 0x9e, + 0x47, 0xfc, 0x23, 0xe4, 0x73, 0xb1, 0x7d, 0x4a, 0x03, 0xde, 0x7a, 0x82, 0x1f, 0xf9, 0x19, 0x3d, + 0x20, 0x0f, 0xd9, 0xfe, 0xfe, 0x76, 0x31, 0xc7, 0x68, 0xb4, 0x04, 0xb6, 0xf8, 0x2d, 0x34, 0xba, + 0x38, 0x57, 0xe2, 0x4f, 0xbf, 0x98, 0x57, 0xc4, 0xe3, 0x81, 0x14, 0x7d, 0x44, 0x20, 0x12, 0x78, + 0x53, 0xd2, 0xb9, 0xa7, 0xc7, 0x5f, 0x7e, 0x85, 0x5c, 0xa8, 0xb6, 0xb0, 0xd7, 0x29, 0xfc, 0x74, + 0x21, 0xd0, 0x16, 0xf9, 0xcd, 0x4a, 0x54, 0x56, 0x0c, 0x1b, 0xd1, 0x96, 0xfc, 0x21, 0x46, 0xf7, + 0x32, 0x3a, 0x55, 0xea, 0x76, 0xdb, 0x26, 0x31, 0x40, 0x5f, 0xb4, 0x5e, 0x9b, 0xb8, 0xdc, 0xe5, + 0x07, 0x1e, 0x3c, 0xe8, 0x0c, 0xd9, 0x84, 0x07, 0x87, 0x4d, 0xa7, 0x27, 0x3b, 0x55, 0xc6, 0xcb, + 0xaa, 0xff, 0x35, 0x85, 0x0a, 0xbe, 0xc7, 0xb3, 0xf8, 0xd4, 0x51, 0x70, 0xc7, 0x85, 0x63, 0x98, + 0x88, 0x03, 0x28, 0xe0, 0x71, 0x03, 0x8d, 0x54, 0x1f, 0x74, 0x4d, 0x87, 0xb8, 0x7b, 0xf0, 0x5e, + 0xbd, 0xc0, 0xb7, 0x9c, 0xa7, 0x08, 0x2b, 0x12, 0xdb, 0x6d, 0x32, 0x30, 0x3c, 0xfb, 0x61, 0x3e, + 0xdf, 0xb3, 0xfe, 0xfb, 0x4d, 0xf6, 0xec, 0x87, 0xfb, 0x86, 0x4b, 0x6f, 0xb0, 0x42, 0x52, 0xfc, + 0x34, 0xca, 0xac, 0xac, 0x2c, 0x70, 0x6d, 0x84, 0x77, 0xb3, 0x9e, 0x27, 0xbe, 0x6b, 0xa2, 0x58, + 0xf5, 0x87, 0xd3, 0x08, 0x51, 0xa5, 0x2f, 0x3b, 0x44, 0x3f, 0xa2, 0xcb, 0x9c, 0x59, 0x94, 0xf7, + 0x05, 0xce, 0x07, 0x5c, 0xe0, 0xae, 0x1c, 0xed, 0x88, 0x68, 0xdd, 0x81, 0x6b, 0x7a, 0xd1, 0xf7, + 0xa0, 0x65, 0x67, 0xa9, 0x60, 0x1d, 0x82, 0x07, 0xad, 0xef, 0x37, 0xfb, 0x09, 0x34, 0xca, 0xb5, + 0xc6, 0x96, 0xce, 0x50, 0x5b, 0x3e, 0x50, 0x0b, 0xf1, 0x81, 0x50, 0x98, 0x2c, 0x4f, 0x84, 0x02, + 0x42, 0xf9, 0x7a, 0x8a, 0x09, 0x85, 0x3d, 0x13, 0x38, 0xae, 0x42, 0x51, 0xbf, 0x9c, 0x42, 0x98, + 0x32, 0xab, 0xeb, 0xae, 0xbb, 0x69, 0x3b, 0x06, 0xf3, 0x5b, 0x3d, 0x8a, 0xcf, 0x51, 0xbf, 0x96, + 0x47, 0xa7, 0x25, 0xa7, 0xc0, 0x63, 0x3e, 0x08, 0xaf, 0xc8, 0xfa, 0x36, 0xc8, 0x8d, 0xfd, 0x63, + 0xe2, 0x65, 0xc9, 0xb0, 0xf4, 0xa2, 0x44, 0xb8, 0x25, 0x79, 0x0e, 0x8d, 0xf3, 0x1f, 0x74, 0x8d, + 0xf5, 0x4f, 0xc1, 0x41, 0x8f, 0x5d, 0x0a, 0xd0, 0x24, 0x34, 0x7e, 0x01, 0x8d, 0x52, 0xe5, 0x5c, + 0x83, 0xa7, 0xe3, 0x23, 0xa1, 0x8b, 0xb8, 0xe1, 0x03, 0xc5, 0x79, 0x32, 0xa0, 0x14, 0x1e, 0x06, + 0xe4, 0xf7, 0xf0, 0x30, 0xe0, 0x5d, 0x34, 0x56, 0xb2, 0x2c, 0xdb, 0x03, 0x03, 0xde, 0xe5, 0xc7, + 0x96, 0x7d, 0x57, 0xec, 0xa7, 0xe1, 0x71, 0x68, 0x48, 0x9f, 0xb8, 0x64, 0x8b, 0x0c, 0xf1, 0x75, + 0xdf, 0xcd, 0x9d, 0x38, 0xdc, 0xe3, 0x14, 0x8e, 0x6e, 0x1d, 0x0e, 0x8b, 0x7b, 0xb9, 0x43, 0xe7, + 0x4d, 0xd4, 0x1d, 0xbb, 0x6b, 0xbb, 0xc4, 0x60, 0x82, 0x1a, 0x0b, 0xdf, 0x9c, 0x77, 0x39, 0x02, + 0x1e, 0xa6, 0x48, 0xcf, 0xb8, 0xa5, 0x22, 0xf8, 0x1e, 0x3a, 0xe3, 0x5f, 0x22, 0x05, 0x4f, 0x80, + 0x6a, 0x15, 0x57, 0x19, 0x87, 0x67, 0x06, 0x38, 0xaa, 0x0c, 0xb5, 0xca, 0xec, 0x45, 0xff, 0xc8, + 0xd4, 0x7f, 0x43, 0xd4, 0x34, 0x0d, 0xb1, 0xab, 0x13, 0xf9, 0xe1, 0xef, 0x44, 0x63, 0x8b, 0xfa, + 0x83, 0x4a, 0x8f, 0xef, 0xcb, 0x26, 0xf6, 0x7e, 0x32, 0xdb, 0xd1, 0x1f, 0x34, 0x0d, 0x5e, 0x2e, + 0xb2, 0x56, 0x8a, 0x2c, 0x71, 0x13, 0x9d, 0xad, 0x3b, 0x76, 0xc7, 0xf6, 0x88, 0x11, 0x79, 0x4d, + 0x33, 0x15, 0xbe, 0x56, 0xeb, 0x72, 0x8a, 0xe6, 0x80, 0x67, 0x35, 0x7d, 0xd8, 0xe0, 0x0e, 0x9a, + 0x2a, 0xb9, 0x6e, 0xaf, 0x43, 0xc2, 0xd3, 0xeb, 0xc2, 0xae, 0x9f, 0xf1, 0x0c, 0xf7, 0x68, 0x7c, + 0x42, 0x87, 0xa2, 0xec, 0xf0, 0xba, 0xe9, 0x99, 0x62, 0x8d, 0xf0, 0x2d, 0x51, 0xde, 0x6f, 0x66, + 0xf3, 0x93, 0x85, 0x29, 0xed, 0x5c, 0xbc, 0x31, 0x2b, 0xa6, 0xd7, 0x26, 0xea, 0x2f, 0xa5, 0x10, + 0x0a, 0x05, 0x8c, 0x9f, 0x93, 0xe3, 0x53, 0xa4, 0xc2, 0x43, 0x50, 0xfe, 0x7a, 0x57, 0x0a, 0x48, + 0x81, 0xcf, 0xa3, 0x2c, 0xbc, 0xce, 0x4e, 0x87, 0x87, 0x2e, 0x1b, 0xa6, 0x65, 0x68, 0x00, 0xa5, + 0x58, 0xe1, 0x29, 0x26, 0x60, 0xe1, 0xc2, 0x8f, 0x59, 0x3b, 0x15, 0x34, 0xd5, 0xe8, 0xad, 0xfa, + 0x75, 0x0b, 0x0f, 0x65, 0xe0, 0x91, 0xb8, 0xdb, 0x5b, 0x0d, 0x5e, 0x97, 0x49, 0x4f, 0xf0, 0xe5, + 0x22, 0xea, 0x4f, 0xa7, 0x22, 0xb3, 0xe0, 0x11, 0x2e, 0x30, 0x1f, 0x8b, 0xdf, 0xe1, 0xc6, 0xa7, + 0x25, 0xf5, 0xaf, 0xa4, 0xd1, 0x58, 0xdd, 0x76, 0x3c, 0xfe, 0xdc, 0xfd, 0x48, 0x5a, 0xfa, 0xd0, + 0x6e, 0xd4, 0x85, 0xdd, 0x4e, 0x76, 0x1f, 0xbb, 0x9d, 0xf3, 0x28, 0x2b, 0xb8, 0x2f, 0xb2, 0x33, + 0x53, 0xc3, 0x70, 0x34, 0x80, 0xaa, 0xdf, 0x95, 0x46, 0xe8, 0xb3, 0xcf, 0x3f, 0xff, 0x08, 0x0b, + 0x48, 0xfd, 0x4b, 0x29, 0x34, 0xc5, 0x0f, 0xf1, 0x85, 0x48, 0x2f, 0x23, 0xfe, 0xf5, 0x8b, 0x38, + 0x2e, 0x19, 0x48, 0xf3, 0x71, 0x74, 0x09, 0xa8, 0x3e, 0x30, 0x3d, 0x38, 0xc7, 0x14, 0x42, 0xbd, + 0x10, 0x0e, 0x13, 0x97, 0x00, 0x9f, 0x0e, 0x3f, 0xe7, 0x5f, 0x4f, 0x64, 0xc2, 0x75, 0x8f, 0x16, + 0xa8, 0x26, 0x5e, 0x51, 0xa8, 0x3f, 0x9b, 0x45, 0xd9, 0xea, 0x03, 0xd2, 0x3a, 0xe6, 0x5d, 0x23, + 0x1c, 0x7a, 0x64, 0x0f, 0x79, 0xe8, 0x71, 0x90, 0xfb, 0xd6, 0xd7, 0xc3, 0xfe, 0xcc, 0xc9, 0xd5, + 0x47, 0x7a, 0x3e, 0x5a, 0xbd, 0xdf, 0xd3, 0xc7, 0xef, 0xba, 0xfe, 0x1f, 0x67, 0x50, 0xa6, 0x51, + 0xae, 0x9f, 0xe8, 0xcd, 0x91, 0xea, 0xcd, 0xe0, 0xfb, 0x2c, 0x35, 0x38, 0xa2, 0xce, 0x87, 0x1e, + 0x64, 0x91, 0xd3, 0xe8, 0xdf, 0xcb, 0xa0, 0xc9, 0xc6, 0xdc, 0x4a, 0x5d, 0x38, 0x25, 0xba, 0xcd, + 0xbc, 0x7c, 0xc0, 0xdf, 0x84, 0x75, 0xe9, 0xf9, 0x98, 0x3d, 0x73, 0xa7, 0x66, 0x79, 0x2f, 0xde, + 0x7c, 0x5b, 0x6f, 0xf7, 0x08, 0x1c, 0x29, 0x30, 0x9f, 0x40, 0xd7, 0x7c, 0x9f, 0xfc, 0x28, 0xbc, + 0xe4, 0xf5, 0x19, 0xe0, 0x4f, 0xa3, 0xcc, 0x1d, 0x7e, 0x5b, 0xdb, 0x8f, 0xcf, 0x8d, 0xeb, 0x8c, + 0x0f, 0x9d, 0x04, 0x33, 0x3d, 0xd3, 0x00, 0x0e, 0xb4, 0x14, 0x2d, 0x7c, 0x8b, 0x2f, 0xc0, 0x7b, + 0x2a, 0xbc, 0xe6, 0x17, 0xbe, 0x55, 0xab, 0xe0, 0x06, 0x1a, 0xab, 0x13, 0xa7, 0x63, 0x42, 0x47, + 0xf9, 0x73, 0xf6, 0x60, 0x26, 0x74, 0xa7, 0x32, 0xd6, 0x0d, 0x0b, 0x01, 0x33, 0x91, 0x0b, 0x7e, + 0x07, 0x21, 0x66, 0xa3, 0xec, 0x31, 0x7a, 0xd8, 0x05, 0xb0, 0xfb, 0x99, 0x69, 0x99, 0x60, 0xe3, + 0x09, 0xcc, 0xf0, 0x06, 0x2a, 0x2c, 0xda, 0x86, 0x79, 0xcf, 0x64, 0x6e, 0x59, 0x50, 0x41, 0x6e, + 0x77, 0x67, 0x08, 0x6a, 0x4a, 0x76, 0x84, 0x72, 0x49, 0xd5, 0xc4, 0x18, 0xab, 0xff, 0x60, 0x18, + 0x65, 0x69, 0xb7, 0x9f, 0x8c, 0xdf, 0xc3, 0x8c, 0xdf, 0x12, 0x2a, 0xdc, 0xb5, 0x9d, 0x0d, 0xd3, + 0x5a, 0x0b, 0x3c, 0x66, 0xf9, 0xde, 0x14, 0x6e, 0xf9, 0x37, 0x19, 0xae, 0x19, 0x38, 0xd7, 0x6a, + 0x31, 0xf2, 0x5d, 0x46, 0xf0, 0xcb, 0x08, 0xad, 0xe8, 0xce, 0x1a, 0xf1, 0x80, 0x26, 0x1f, 0xbe, + 0x3e, 0xf7, 0x00, 0x0a, 0x4e, 0xb8, 0xe2, 0xeb, 0xf3, 0x90, 0x98, 0x6e, 0xc2, 0xd9, 0x3d, 0xe9, + 0x28, 0xf8, 0xe4, 0xc2, 0x26, 0x1c, 0xee, 0x49, 0x45, 0x23, 0x80, 0xdd, 0x98, 0xd6, 0x11, 0x12, + 0xce, 0x9e, 0x51, 0x44, 0x10, 0xd2, 0xe4, 0xc0, 0xc3, 0x23, 0x25, 0x1c, 0x3d, 0x6b, 0x02, 0x0f, + 0xfc, 0x62, 0xe4, 0x72, 0x0c, 0x4b, 0xdc, 0xfa, 0xde, 0x8d, 0x85, 0xce, 0x15, 0xe3, 0xbb, 0x39, + 0x57, 0xa8, 0x5f, 0x49, 0xa3, 0xd1, 0x46, 0x6f, 0xd5, 0xdd, 0x72, 0x3d, 0xd2, 0x39, 0xe6, 0x6a, + 0xec, 0x6f, 0xaf, 0xb2, 0x89, 0xdb, 0xab, 0xa7, 0x7d, 0xa1, 0x08, 0x27, 0x73, 0x81, 0x49, 0xe7, + 0x8b, 0xe3, 0x6f, 0xa7, 0x51, 0x81, 0x1d, 0xaa, 0x57, 0x4c, 0xb7, 0xf5, 0x10, 0x1c, 0x7d, 0x8f, + 0x5e, 0x2a, 0x87, 0xbb, 0x88, 0xda, 0x83, 0xfb, 0xb4, 0xfa, 0xa5, 0x34, 0x1a, 0x2b, 0xf5, 0xbc, + 0xf5, 0x92, 0x07, 0xba, 0xf5, 0x48, 0xee, 0x4f, 0x7e, 0x25, 0x85, 0xa6, 0x68, 0x43, 0x56, 0xec, + 0x0d, 0x62, 0x3d, 0x84, 0x83, 0x47, 0xf1, 0x00, 0x31, 0x7d, 0xc0, 0x03, 0x44, 0x5f, 0x96, 0x99, + 0x7d, 0x1e, 0xa4, 0x7e, 0x3d, 0x85, 0x90, 0x66, 0xb7, 0xc9, 0x47, 0xe4, 0x33, 0x1e, 0xc2, 0xb5, + 0xc3, 0x87, 0xe1, 0x33, 0x1e, 0xc2, 0x39, 0xce, 0x51, 0x7e, 0xc6, 0xd7, 0x52, 0x68, 0x74, 0xd6, + 0xf6, 0x8e, 0xb9, 0x4e, 0xf1, 0xaf, 0x38, 0xe6, 0x2a, 0xc5, 0xbf, 0xe2, 0x98, 0x6b, 0xd4, 0xaf, + 0xa5, 0xd0, 0x19, 0x1e, 0x3b, 0x95, 0xef, 0xd0, 0x8f, 0xb9, 0x72, 0xc5, 0x3f, 0xe8, 0x98, 0xf7, + 0xd0, 0x8f, 0x67, 0xd0, 0x19, 0x88, 0x4d, 0x47, 0x37, 0x09, 0x1f, 0x81, 0x95, 0x11, 0xb7, 0xe4, + 0x2b, 0xb9, 0xc5, 0x84, 0x2b, 0xb9, 0xdf, 0xdf, 0x2e, 0xbe, 0xb8, 0x66, 0x7a, 0xeb, 0xbd, 0xd5, + 0x99, 0x96, 0xdd, 0xb9, 0xb6, 0xe6, 0xe8, 0xf7, 0x4d, 0x76, 0x19, 0xa5, 0xb7, 0xaf, 0x05, 0x21, + 0xbf, 0xf5, 0xae, 0xc9, 0x83, 0x81, 0x37, 0xc0, 0xf2, 0xa6, 0x5c, 0xfd, 0xcb, 0x3c, 0x17, 0xa1, + 0x37, 0x6d, 0xd3, 0xe2, 0xde, 0x2f, 0xcc, 0xec, 0x6a, 0xd0, 0xdd, 0xca, 0x7b, 0xb6, 0x69, 0x35, + 0xa3, 0x2e, 0x30, 0xfb, 0xad, 0x2f, 0x64, 0xad, 0x09, 0xd5, 0xa8, 0xff, 0x2a, 0x85, 0x1e, 0x97, + 0x75, 0xef, 0xa3, 0x60, 0xc9, 0xfc, 0x8b, 0x14, 0x7a, 0xec, 0x16, 0x08, 0x27, 0xb8, 0x78, 0xff, + 0xe8, 0x7d, 0xd1, 0x31, 0x5f, 0x8c, 0x12, 0xbe, 0xe8, 0x98, 0x4f, 0x7b, 0xbf, 0x9a, 0x42, 0xa7, + 0x97, 0x6b, 0x95, 0xf2, 0x47, 0x45, 0xe7, 0x62, 0xdf, 0x73, 0xcc, 0x35, 0x2e, 0xf6, 0x3d, 0x1f, + 0x01, 0x7d, 0x6b, 0x94, 0x16, 0x17, 0x3e, 0x4a, 0xfa, 0x26, 0x7d, 0xcf, 0x47, 0x40, 0xdf, 0xa4, + 0xef, 0x39, 0xe6, 0xfa, 0xf6, 0xf5, 0x1c, 0x1a, 0xbb, 0xdd, 0x5b, 0x25, 0xfc, 0x0a, 0xff, 0x91, + 0x3e, 0x1f, 0xbb, 0x8e, 0xc6, 0xb8, 0x18, 0xe0, 0x6c, 0x59, 0x08, 0x3f, 0xc4, 0x9f, 0x93, 0xb3, + 0x08, 0x0f, 0x22, 0x11, 0x3e, 0x8f, 0xb2, 0x6f, 0x13, 0x67, 0x55, 0x7c, 0x99, 0x73, 0x9f, 0x38, + 0xab, 0x1a, 0x40, 0xf1, 0x42, 0xe8, 0x30, 0x5b, 0xaa, 0xd7, 0x20, 0xdc, 0x3a, 0x3f, 0xd6, 0x86, + 0xf8, 0xf1, 0x81, 0x77, 0x90, 0xde, 0x35, 0x59, 0xa0, 0x76, 0xf1, 0x55, 0x60, 0xb4, 0x24, 0x5e, + 0x42, 0xa7, 0x44, 0xf7, 0x10, 0x16, 0x6b, 0x3c, 0x9f, 0xc0, 0x2e, 0x29, 0xca, 0x78, 0xbc, 0x28, + 0x7e, 0x1d, 0x8d, 0xfb, 0x40, 0x70, 0x74, 0x19, 0x0d, 0x23, 0xf6, 0x06, 0xac, 0x22, 0x49, 0x08, + 0xa4, 0x02, 0x22, 0x03, 0x38, 0xac, 0x45, 0x09, 0x0c, 0x22, 0x8e, 0x43, 0x52, 0x01, 0xfc, 0x02, + 0x30, 0xe8, 0xda, 0x96, 0x4b, 0xe0, 0x4a, 0x7f, 0x0c, 0x9e, 0xad, 0x80, 0x43, 0xae, 0xc3, 0xe1, + 0xec, 0x71, 0x92, 0x44, 0x86, 0x97, 0x11, 0x0a, 0xaf, 0x5e, 0xf9, 0x13, 0xd0, 0x7d, 0x5f, 0x0a, + 0x0b, 0x2c, 0xc4, 0x4b, 0x93, 0x89, 0x83, 0x5c, 0x9a, 0xa8, 0xbf, 0x91, 0x46, 0x63, 0xa5, 0x6e, + 0x37, 0x18, 0x0a, 0xcf, 0xa1, 0x5c, 0xa9, 0xdb, 0xbd, 0xa3, 0xd5, 0xc4, 0x08, 0xae, 0x7a, 0xb7, + 0xdb, 0xec, 0x39, 0xa6, 0xe8, 0x39, 0xc7, 0x88, 0x70, 0x19, 0x4d, 0x94, 0xba, 0xdd, 0x7a, 0x6f, + 0xb5, 0x6d, 0xb6, 0x84, 0xfc, 0x09, 0x2c, 0xbf, 0x4a, 0xb7, 0xdb, 0xec, 0x02, 0x26, 0x9a, 0x00, + 0x43, 0x2e, 0x83, 0xdf, 0x85, 0xc0, 0x09, 0x3c, 0x7c, 0x7f, 0x06, 0x7c, 0xd3, 0xd4, 0x20, 0x76, + 0x6b, 0xd8, 0xb6, 0x99, 0x80, 0x88, 0xc5, 0xb8, 0x3d, 0xef, 0x47, 0x0a, 0xa6, 0x15, 0xc5, 0xc2, + 0xf4, 0x87, 0x2c, 0xf1, 0x27, 0xd1, 0x48, 0xa9, 0xdb, 0x15, 0x4e, 0xe5, 0xc1, 0xf5, 0x82, 0x96, + 0x8a, 0xf4, 0xb1, 0x4f, 0x36, 0xfd, 0x2a, 0x9a, 0x94, 0x2b, 0xdb, 0x57, 0x8c, 0xdc, 0x6f, 0xa5, + 0xe0, 0x83, 0x8e, 0xb9, 0xe7, 0xe7, 0x0d, 0x94, 0x29, 0x75, 0xbb, 0x7c, 0x3e, 0x3a, 0x9d, 0xd0, + 0x1f, 0xd1, 0x47, 0x64, 0xa5, 0x6e, 0xd7, 0xff, 0xf4, 0x63, 0xee, 0x64, 0x7d, 0xa0, 0x4f, 0xff, + 0x1a, 0xfb, 0xf4, 0x63, 0xee, 0x4a, 0xfd, 0xb3, 0x19, 0x34, 0x55, 0xea, 0x76, 0x4f, 0xc2, 0xf4, + 0x3e, 0xac, 0xa7, 0x6a, 0xcf, 0x23, 0x24, 0x4c, 0x8f, 0x23, 0xc1, 0xc3, 0x8d, 0x31, 0x61, 0x6a, + 0x54, 0x52, 0x9a, 0x40, 0xe4, 0xab, 0x5f, 0x7e, 0x5f, 0xea, 0xf7, 0xa5, 0x0c, 0x4c, 0xc5, 0xc7, + 0x3d, 0xec, 0xc6, 0x87, 0xa5, 0xdb, 0x78, 0x1f, 0xe4, 0xf6, 0xd5, 0x07, 0xbf, 0x2c, 0x0d, 0x1e, + 0x08, 0xfb, 0x7a, 0xd2, 0x0b, 0xc3, 0x87, 0x32, 0x8b, 0x27, 0x45, 0x61, 0xf2, 0x58, 0x00, 0x7e, + 0xfe, 0x08, 0x1e, 0x99, 0xa2, 0x45, 0x51, 0x4d, 0xd3, 0xd0, 0x22, 0xb4, 0x7e, 0x1f, 0x8e, 0xec, + 0xab, 0x0f, 0xb7, 0xd3, 0xf0, 0xfa, 0x2c, 0x88, 0x6c, 0x71, 0xf8, 0xdd, 0xc5, 0x35, 0x84, 0xd8, + 0xfd, 0x6c, 0xe0, 0xfc, 0x39, 0xc1, 0x1e, 0xb1, 0xb3, 0xb4, 0x12, 0xfc, 0x11, 0x7b, 0x48, 0x12, + 0xf8, 0x91, 0x64, 0x12, 0xfd, 0x48, 0xae, 0xa0, 0xbc, 0xa6, 0x6f, 0xbe, 0xd5, 0x23, 0xce, 0x16, + 0x37, 0x67, 0x58, 0xe0, 0x28, 0x7d, 0xb3, 0xf9, 0x45, 0x0a, 0xd4, 0x02, 0x34, 0x56, 0x83, 0xe7, + 0x8b, 0xc2, 0xbd, 0x39, 0x3b, 0xbb, 0x0d, 0x1e, 0x2d, 0x1e, 0x44, 0xd1, 0xf1, 0x2b, 0x28, 0x53, + 0xba, 0xdb, 0xe0, 0x92, 0x0d, 0xba, 0xb6, 0x74, 0xb7, 0xc1, 0xe5, 0xd5, 0xb7, 0xec, 0xdd, 0x86, + 0xfa, 0xa5, 0x34, 0xc2, 0x71, 0x4a, 0xfc, 0x22, 0x1a, 0x05, 0xe8, 0x1a, 0xd5, 0x19, 0x31, 0x7d, + 0xd7, 0xa6, 0xdb, 0x74, 0x00, 0x2a, 0x19, 0x77, 0x3e, 0x29, 0x7e, 0x19, 0xd2, 0x03, 0xf2, 0x1c, + 0x34, 0x52, 0xfa, 0xae, 0x4d, 0xd7, 0x4f, 0xa8, 0x17, 0xc9, 0x0e, 0xc8, 0x89, 0xc1, 0x2e, 0xbc, + 0xdb, 0x98, 0xb7, 0x5d, 0x8f, 0x8b, 0x9a, 0xd9, 0x85, 0x9b, 0x2e, 0xe4, 0x7c, 0x93, 0xec, 0x42, + 0x46, 0x06, 0xc9, 0x3c, 0xee, 0x36, 0x98, 0x33, 0xbf, 0xa1, 0xd9, 0x6d, 0xdf, 0xa0, 0x64, 0xc9, + 0x3c, 0x36, 0xdd, 0x26, 0x7b, 0x08, 0x60, 0x40, 0x5e, 0x42, 0x29, 0x99, 0x87, 0x54, 0x4a, 0xfd, + 0xc1, 0x3c, 0x2a, 0x54, 0x74, 0x4f, 0x5f, 0xd5, 0x5d, 0x22, 0xec, 0xa6, 0xa7, 0x7c, 0x98, 0xff, + 0x39, 0x82, 0x1c, 0x8c, 0xd5, 0x84, 0xaf, 0x89, 0x16, 0xc0, 0x9f, 0x0e, 0xf9, 0x06, 0x99, 0xc9, + 0xc4, 0xdc, 0x2d, 0xab, 0xcd, 0x2e, 0x07, 0x6b, 0x31, 0x42, 0x7c, 0x15, 0x8d, 0xf9, 0x30, 0xba, + 0x01, 0xc8, 0x84, 0x3a, 0x63, 0xac, 0x52, 0xfb, 0x5f, 0x13, 0xd1, 0xf8, 0x65, 0x34, 0xee, 0xff, + 0x14, 0x4c, 0x6b, 0x96, 0x88, 0x66, 0x35, 0xb6, 0x7b, 0x12, 0x49, 0xc5, 0xa2, 0x30, 0xbf, 0x0d, + 0x4b, 0x45, 0x23, 0xb9, 0x5e, 0x24, 0x52, 0xfc, 0x45, 0x34, 0xe9, 0xff, 0xe6, 0x1b, 0x06, 0x96, + 0x16, 0xe7, 0x6a, 0x90, 0xf6, 0x30, 0x22, 0xd6, 0x19, 0x99, 0x9c, 0x6d, 0x1d, 0x9e, 0xf0, 0xd3, + 0x97, 0x18, 0xab, 0xf1, 0x9d, 0x43, 0xa4, 0x02, 0x5c, 0x43, 0xa7, 0x7c, 0x48, 0xa8, 0xa1, 0x23, + 0xe1, 0x8e, 0xd1, 0x58, 0x6d, 0x26, 0x2a, 0x69, 0xbc, 0x14, 0x6e, 0xa3, 0xf3, 0x12, 0xd0, 0x70, + 0xd7, 0xcd, 0x7b, 0x1e, 0xdf, 0xee, 0xf1, 0x28, 0x8e, 0x3c, 0xbd, 0x53, 0xc0, 0x95, 0xd1, 0xf8, + 0x79, 0xda, 0xe4, 0xa4, 0x18, 0x03, 0xb9, 0xe1, 0x06, 0x3a, 0xe3, 0xe3, 0x6f, 0x95, 0xeb, 0x75, + 0xc7, 0x7e, 0x8f, 0xb4, 0xbc, 0x5a, 0x85, 0x6f, 0x97, 0x21, 0xba, 0x8f, 0xb1, 0xda, 0x5c, 0x6b, + 0x75, 0xa9, 0x52, 0x50, 0x9c, 0xcc, 0x3c, 0xb1, 0x30, 0x7e, 0x1b, 0x3d, 0x26, 0xc0, 0x6b, 0x96, + 0xeb, 0xe9, 0x56, 0x8b, 0xd4, 0x2a, 0x7c, 0x0f, 0x0d, 0xfb, 0x79, 0xce, 0xd5, 0xe4, 0x48, 0x99, + 0x6d, 0x72, 0x71, 0xfc, 0x2a, 0x9a, 0xf0, 0x11, 0xec, 0x76, 0x6b, 0x0c, 0x6e, 0xb7, 0x60, 0x48, + 0x1a, 0xab, 0xcd, 0xe8, 0x9b, 0x33, 0x99, 0x58, 0xd4, 0x28, 0xc8, 0x3a, 0x3b, 0x2e, 0x69, 0x94, + 0xb7, 0xd5, 0x4d, 0x54, 0x46, 0xc8, 0x44, 0xfb, 0x7a, 0xa8, 0x51, 0xcb, 0x8e, 0xb9, 0x66, 0xb2, + 0x9d, 0xb4, 0xff, 0xcc, 0x6c, 0xb5, 0x69, 0x03, 0x30, 0x49, 0x3f, 0x18, 0xf9, 0x74, 0x09, 0x9d, + 0x4e, 0xd0, 0xb1, 0x7d, 0xed, 0x18, 0xbf, 0x92, 0x0e, 0x1b, 0x71, 0xcc, 0xb7, 0x8d, 0xb3, 0x28, + 0xef, 0x7f, 0x09, 0x37, 0x1e, 0x94, 0x7e, 0x43, 0x33, 0xca, 0xc3, 0xc7, 0x4b, 0xe2, 0x38, 0xe6, + 0x5b, 0xc9, 0x87, 0x21, 0x8e, 0x0f, 0x52, 0xa1, 0x38, 0x8e, 0xf9, 0xf6, 0xf2, 0x57, 0x33, 0xe1, + 0x9c, 0x74, 0xb2, 0xc7, 0x7c, 0x58, 0x66, 0x72, 0xe8, 0x2d, 0x98, 0xdb, 0xc7, 0x73, 0x2f, 0x51, + 0x35, 0x47, 0x0e, 0xa8, 0x9a, 0xbf, 0x19, 0xef, 0x4f, 0x66, 0x7a, 0x1e, 0xcb, 0xfe, 0x7c, 0x08, + 0x83, 0x15, 0x5f, 0x0f, 0xd7, 0x31, 0x66, 0xa3, 0x0f, 0x0b, 0x41, 0x92, 0x56, 0xb9, 0x89, 0x2e, + 0x93, 0xe0, 0xcf, 0xa3, 0x73, 0x12, 0xa0, 0xae, 0x3b, 0x7a, 0x87, 0x78, 0x61, 0xa2, 0x25, 0x08, + 0x7b, 0xe1, 0x97, 0x6e, 0x76, 0x03, 0xb4, 0x98, 0xbc, 0xa9, 0x0f, 0x07, 0x41, 0x39, 0x46, 0xf6, + 0xe1, 0x4a, 0xfa, 0x9f, 0xd2, 0x68, 0xa2, 0x6e, 0xbb, 0xde, 0x9a, 0x43, 0xdc, 0xba, 0xee, 0xb8, + 0xe4, 0xd1, 0xed, 0xd1, 0x4f, 0xa1, 0x09, 0x78, 0x4e, 0xdd, 0x21, 0x96, 0x27, 0x24, 0x00, 0x65, + 0x81, 0x5b, 0x7d, 0x04, 0x8f, 0xd1, 0x2d, 0x11, 0xe2, 0x22, 0x1a, 0x66, 0x3a, 0x20, 0x3c, 0x72, + 0x67, 0x0a, 0xc0, 0xe0, 0xea, 0x5f, 0xcd, 0xa0, 0x71, 0x5f, 0xca, 0xb3, 0xe6, 0x71, 0x3d, 0xb3, + 0x39, 0x5a, 0x21, 0x5f, 0x43, 0xa8, 0x6e, 0x3b, 0x9e, 0xde, 0x16, 0x72, 0xf7, 0xc3, 0x66, 0xa7, + 0x0b, 0x50, 0x56, 0x46, 0x20, 0xc1, 0x33, 0x08, 0x09, 0x03, 0x6c, 0x04, 0x06, 0xd8, 0xe4, 0xce, + 0x76, 0x11, 0x85, 0xe3, 0x4a, 0x13, 0x28, 0xd4, 0x5f, 0x4c, 0xa3, 0x29, 0xbf, 0x93, 0xaa, 0x0f, + 0x48, 0xab, 0xe7, 0x3d, 0xc2, 0x83, 0x41, 0x96, 0xf6, 0xf0, 0xae, 0xd2, 0x56, 0xff, 0xbb, 0x30, + 0x91, 0x94, 0xdb, 0xf6, 0xc9, 0x44, 0xf2, 0x87, 0xa1, 0xe3, 0xea, 0x77, 0x67, 0xd0, 0x19, 0x5f, + 0xea, 0x73, 0x3d, 0x0b, 0xcc, 0x84, 0xb2, 0xde, 0x6e, 0x3f, 0xca, 0xeb, 0xf2, 0x98, 0x2f, 0x88, + 0x65, 0x1e, 0x9f, 0x84, 0xe7, 0x4b, 0xb8, 0xc7, 0xc1, 0x4d, 0xdb, 0x34, 0x34, 0x91, 0x08, 0xbf, + 0x8e, 0xc6, 0xfd, 0x9f, 0x25, 0x67, 0xcd, 0x5f, 0x8c, 0x61, 0xd3, 0x1f, 0x14, 0xd2, 0x1d, 0xe9, + 0x19, 0x96, 0x54, 0x40, 0xfd, 0xcf, 0x39, 0x34, 0x7d, 0xd7, 0xb4, 0x0c, 0x7b, 0xd3, 0xf5, 0xd3, + 0x6d, 0x1c, 0x7b, 0xa3, 0xf7, 0xa8, 0xd3, 0x6c, 0xbc, 0x85, 0x1e, 0x8b, 0x8a, 0xd4, 0x09, 0x82, + 0xa0, 0xf1, 0xde, 0xd9, 0x64, 0x04, 0x4d, 0x3f, 0xf1, 0x06, 0x3f, 0x39, 0xd3, 0x92, 0x4b, 0x46, + 0x33, 0x77, 0x8c, 0xec, 0x25, 0x73, 0xc7, 0xb3, 0x28, 0x57, 0xb1, 0x3b, 0xba, 0xe9, 0x3f, 0xc8, + 0x85, 0x51, 0x1c, 0xd4, 0x0b, 0x18, 0x8d, 0x53, 0x50, 0xfe, 0xbc, 0x62, 0xe8, 0xb2, 0xd1, 0x90, + 0xbf, 0x5f, 0xa0, 0xe7, 0x12, 0x47, 0x13, 0x89, 0xb0, 0x8d, 0x26, 0x78, 0x75, 0xfc, 0x9c, 0x0b, + 0xc1, 0x39, 0x57, 0x90, 0xd4, 0xb4, 0xbf, 0x5a, 0xcd, 0x48, 0xe5, 0xd8, 0x81, 0x17, 0x4b, 0x28, + 0xc2, 0x3f, 0x86, 0x9d, 0x78, 0x69, 0x32, 0x7f, 0x41, 0x08, 0x30, 0xc9, 0x8c, 0xc5, 0x85, 0x00, + 0xb3, 0x8c, 0x48, 0x84, 0xab, 0xe8, 0x54, 0xa9, 0xdd, 0xb6, 0x37, 0x83, 0x68, 0x63, 0x54, 0x25, + 0xc6, 0x21, 0xe2, 0x32, 0x1c, 0x9f, 0xe8, 0x14, 0x09, 0x1f, 0xd7, 0x6c, 0x71, 0xb4, 0x16, 0x2f, + 0x31, 0xfd, 0x06, 0xc2, 0xf1, 0x36, 0xef, 0xeb, 0x00, 0xe5, 0x07, 0xd3, 0x08, 0x47, 0xf6, 0x21, + 0xd5, 0x47, 0xd8, 0x9c, 0x52, 0x7f, 0x2a, 0x85, 0x4e, 0xc5, 0xa2, 0x00, 0xe2, 0x1b, 0x08, 0x31, + 0x88, 0x10, 0x46, 0x06, 0xde, 0x65, 0x86, 0x91, 0x01, 0xf9, 0x52, 0x12, 0x92, 0xe1, 0x6b, 0x28, + 0xcf, 0x7e, 0x05, 0x39, 0x7a, 0xa3, 0x45, 0x7a, 0x3d, 0xd3, 0xd0, 0x02, 0xa2, 0xb0, 0x16, 0x38, + 0x89, 0xcb, 0x24, 0x16, 0xf1, 0xb6, 0xba, 0x41, 0x2d, 0x94, 0x4c, 0xfd, 0x5a, 0x0a, 0x8d, 0x07, + 0x0d, 0x2e, 0x19, 0x47, 0xd5, 0x75, 0x39, 0x1e, 0x50, 0x31, 0xb3, 0x5b, 0x40, 0xc5, 0xc8, 0xdc, + 0xc4, 0xb0, 0xea, 0x3f, 0x49, 0xa1, 0xa9, 0x80, 0xf6, 0x08, 0x8f, 0x6a, 0x0e, 0xfd, 0x21, 0x3f, + 0x94, 0x42, 0xca, 0xac, 0xd9, 0x6e, 0x9b, 0xd6, 0x5a, 0xcd, 0xba, 0x67, 0x3b, 0x1d, 0x18, 0xa8, + 0x47, 0x77, 0x16, 0xa7, 0x7e, 0x5f, 0x0a, 0x9d, 0xe2, 0x0d, 0x2a, 0xeb, 0x8e, 0x71, 0x74, 0x87, + 0xa4, 0xd1, 0x96, 0x1c, 0x5d, 0x2f, 0xab, 0xff, 0x2f, 0x85, 0xd0, 0x82, 0xdd, 0xda, 0x38, 0xe6, + 0xef, 0x59, 0x5e, 0x46, 0x39, 0xf6, 0xd6, 0x9d, 0xcf, 0x76, 0xa7, 0x66, 0xd8, 0x23, 0x11, 0xfa, + 0x69, 0x0c, 0x31, 0x3b, 0xc9, 0xef, 0x6b, 0x72, 0xec, 0xad, 0xbc, 0xc6, 0x0b, 0xc0, 0xb3, 0x44, + 0x4a, 0x76, 0xcc, 0x7d, 0x59, 0x7f, 0x20, 0x85, 0xce, 0x68, 0xa4, 0x65, 0xdf, 0x27, 0xce, 0x56, + 0xd9, 0x36, 0xc8, 0x2d, 0x62, 0x11, 0xe7, 0xa8, 0xf4, 0xfb, 0xef, 0x43, 0xb0, 0xd4, 0xb0, 0x31, + 0x77, 0x5c, 0x62, 0x1c, 0x9f, 0x90, 0xbd, 0xea, 0xdf, 0x1d, 0x41, 0x4a, 0xa2, 0x6d, 0x74, 0x6c, + 0xed, 0x81, 0xbe, 0x06, 0x6f, 0xf6, 0x61, 0x19, 0xbc, 0xc3, 0xfb, 0x33, 0x78, 0x73, 0xfb, 0x35, + 0x78, 0x47, 0xf6, 0x62, 0xf0, 0x76, 0xa2, 0x06, 0x6f, 0x1e, 0x0c, 0xde, 0x1b, 0x03, 0x0d, 0xde, + 0xaa, 0x65, 0x1c, 0xd0, 0xdc, 0x3d, 0xb6, 0x89, 0x6a, 0x0e, 0x62, 0xa7, 0x5f, 0xa6, 0x93, 0x5b, + 0xcb, 0x76, 0x0c, 0x62, 0x70, 0xf3, 0x1c, 0xce, 0xa3, 0x1d, 0x0e, 0xd3, 0x02, 0x6c, 0x2c, 0xeb, + 0xcf, 0xc4, 0x5e, 0xb2, 0xfe, 0x3c, 0x04, 0x03, 0xfe, 0xd7, 0x52, 0xe8, 0x54, 0x99, 0x38, 0x1e, + 0x0b, 0x6d, 0xf3, 0x30, 0x2e, 0x41, 0x4b, 0x68, 0x4a, 0x60, 0x08, 0xb6, 0x68, 0x3a, 0xbc, 0xd8, + 0x6d, 0x11, 0xc7, 0x8b, 0xde, 0x0b, 0x47, 0xe9, 0x69, 0xf5, 0x7e, 0xe4, 0x6d, 0x3e, 0x76, 0x83, + 0xea, 0x7d, 0x38, 0x13, 0xa4, 0xc9, 0x7f, 0x69, 0x01, 0xbd, 0xfa, 0x93, 0x29, 0x74, 0x49, 0x23, + 0x16, 0xd9, 0xd4, 0x57, 0xdb, 0x44, 0x60, 0xcc, 0xe7, 0x76, 0x3a, 0xee, 0x4d, 0xb7, 0xa3, 0x7b, + 0xad, 0xf5, 0x43, 0x7d, 0xe5, 0x1c, 0x1a, 0x17, 0x67, 0xa0, 0x7d, 0xcc, 0x4e, 0x52, 0x39, 0xf5, + 0x77, 0xd3, 0x68, 0x64, 0xd6, 0xf6, 0x0e, 0x9d, 0xb5, 0x3e, 0x9c, 0xb4, 0xd3, 0xfb, 0xd8, 0xd3, + 0x7f, 0x12, 0x2a, 0x17, 0xc2, 0x52, 0xc2, 0xb5, 0xff, 0xaa, 0x1d, 0x0b, 0xdf, 0xe9, 0x93, 0xed, + 0x33, 0x32, 0xfb, 0x8b, 0x68, 0x14, 0x5e, 0x92, 0x0a, 0xa7, 0x6e, 0xe0, 0x54, 0xe3, 0x51, 0x60, + 0xb4, 0x8e, 0x90, 0x14, 0x7f, 0x5e, 0x8a, 0xa6, 0x93, 0x3b, 0x7c, 0x24, 0x77, 0x81, 0x9d, 0xfa, + 0x13, 0x59, 0x34, 0xee, 0x3b, 0x40, 0x1c, 0x91, 0xdc, 0x9f, 0x43, 0xb9, 0x79, 0x5b, 0x08, 0x8c, + 0x09, 0x0e, 0x13, 0xeb, 0xb6, 0x1b, 0xf1, 0x04, 0xe1, 0x44, 0xf8, 0x06, 0xca, 0x2f, 0xd9, 0x86, + 0xe8, 0xee, 0x03, 0x63, 0xc9, 0xb2, 0x8d, 0xd8, 0x73, 0x89, 0x80, 0x10, 0x5f, 0x42, 0x59, 0xf0, + 0x94, 0x12, 0x0e, 0x3b, 0x23, 0xde, 0x51, 0x80, 0x17, 0x7a, 0x34, 0xb7, 0xdf, 0x1e, 0x1d, 0x39, + 0x68, 0x8f, 0xe6, 0x1f, 0x6a, 0x8f, 0xe2, 0x77, 0xd0, 0x38, 0xd4, 0xe4, 0xc7, 0x8b, 0xdf, 0x7d, + 0x59, 0x79, 0x9c, 0xcf, 0xfc, 0x13, 0xac, 0xdd, 0x3c, 0x6a, 0x3c, 0x4c, 0xf8, 0x12, 0x2b, 0xf5, + 0x37, 0x53, 0x68, 0xe4, 0x8e, 0xb5, 0x61, 0xd9, 0x9b, 0x87, 0xd3, 0x93, 0x1b, 0x68, 0x8c, 0xb3, + 0x11, 0x66, 0x44, 0x78, 0xb7, 0xd2, 0x63, 0xe0, 0x26, 0x70, 0xd2, 0x44, 0x2a, 0xfc, 0x6a, 0x50, + 0x08, 0x5c, 0x18, 0x33, 0x61, 0x40, 0x58, 0xbf, 0x50, 0x4b, 0x8e, 0x61, 0x29, 0x92, 0xe3, 0xf3, + 0x28, 0x5b, 0xa1, 0x4d, 0x15, 0x22, 0x22, 0xd1, 0xa6, 0x68, 0x00, 0x55, 0xff, 0x79, 0x1a, 0x4d, + 0x46, 0x8e, 0x29, 0x9e, 0x45, 0xa3, 0xfc, 0x98, 0xc0, 0xf4, 0x83, 0x6a, 0x82, 0x8b, 0x63, 0x00, + 0xd4, 0xf2, 0xec, 0xcf, 0x9a, 0x81, 0x3f, 0x83, 0x46, 0x6c, 0x17, 0x26, 0x72, 0xf8, 0x96, 0xc9, + 0x50, 0xf1, 0x97, 0x1b, 0xb4, 0xed, 0x4c, 0xa5, 0x39, 0x89, 0xa8, 0x47, 0xb6, 0x0b, 0x9f, 0x76, + 0x13, 0x8d, 0xea, 0xae, 0x4b, 0xbc, 0xa6, 0xa7, 0xaf, 0x89, 0x71, 0x36, 0x03, 0xa0, 0xa8, 0xd3, + 0x00, 0x5c, 0xd1, 0xd7, 0xf0, 0x1b, 0x68, 0xa2, 0xe5, 0x10, 0x98, 0xea, 0xf5, 0x36, 0x6d, 0xa5, + 0x60, 0x8a, 0x49, 0x08, 0xf1, 0x64, 0x38, 0x44, 0xd4, 0x0c, 0xfc, 0x36, 0x9a, 0xe0, 0x9f, 0xc3, + 0xfc, 0x8b, 0x60, 0x78, 0x4c, 0x86, 0x13, 0x37, 0x13, 0x09, 0xf3, 0x30, 0xe2, 0x6e, 0x66, 0x22, + 0xb9, 0xc8, 0xd7, 0x10, 0x48, 0xd5, 0x6f, 0xa4, 0xa8, 0x79, 0x40, 0x01, 0x41, 0xfa, 0xd4, 0xce, + 0x3e, 0x75, 0xa5, 0x13, 0x66, 0x48, 0xc8, 0xb9, 0x03, 0xe6, 0x14, 0x8d, 0x63, 0xf1, 0x0c, 0xca, + 0x19, 0xe2, 0x69, 0xc3, 0x59, 0xf9, 0x23, 0xfc, 0x7a, 0x34, 0x4e, 0x85, 0x2f, 0xa3, 0x2c, 0x35, + 0xff, 0xf8, 0x76, 0x2f, 0x71, 0xad, 0xd2, 0x80, 0x42, 0xfd, 0xae, 0x34, 0x1a, 0x17, 0xbe, 0xe6, + 0xfa, 0xa1, 0x3e, 0xe7, 0x95, 0xbd, 0x35, 0x93, 0x7b, 0x3c, 0x02, 0x2c, 0x68, 0xf2, 0xcd, 0x40, + 0x14, 0x7b, 0x3a, 0xaa, 0xe6, 0x82, 0x79, 0x91, 0x7f, 0x68, 0x6e, 0xef, 0x5b, 0x06, 0x4a, 0xff, + 0x66, 0x36, 0x9f, 0x2e, 0x64, 0xde, 0xcc, 0xe6, 0xb3, 0x85, 0x61, 0xf5, 0xe7, 0x1b, 0x68, 0x78, + 0xd9, 0x22, 0xcb, 0xf7, 0xf0, 0xf3, 0x42, 0x0e, 0x15, 0xfe, 0xf1, 0xa7, 0x44, 0x96, 0x80, 0x98, + 0x1f, 0xd2, 0x84, 0x4c, 0x2b, 0x37, 0xc5, 0x44, 0x10, 0xbc, 0x17, 0xb1, 0x58, 0x86, 0x61, 0xe6, + 0x87, 0x34, 0x31, 0x61, 0xc4, 0x4d, 0x31, 0x29, 0x00, 0x17, 0x96, 0x54, 0x8a, 0x61, 0xfc, 0x52, + 0x7c, 0xf3, 0xbd, 0x90, 0x14, 0x83, 0x3f, 0x7a, 0x3f, 0x10, 0xa7, 0x98, 0x1f, 0xd2, 0x92, 0x63, + 0xf7, 0x8f, 0x8b, 0x67, 0xda, 0x5c, 0xec, 0x67, 0x22, 0x5b, 0x27, 0xc0, 0xcd, 0x0f, 0x69, 0x12, + 0x2d, 0x7e, 0x29, 0xc8, 0xb4, 0x44, 0x97, 0xd5, 0xa8, 0x6b, 0xb3, 0x80, 0x9a, 0x1f, 0xd2, 0x44, + 0x4a, 0xa1, 0xd2, 0xba, 0x63, 0x06, 0x69, 0x50, 0xa2, 0x95, 0x02, 0x4e, 0xa8, 0x14, 0x7e, 0xe3, + 0xd7, 0x22, 0xf9, 0xae, 0xf9, 0xda, 0xf2, 0x58, 0xa4, 0x30, 0x43, 0xce, 0x0f, 0x69, 0x91, 0xec, + 0xd8, 0x97, 0xfd, 0x1c, 0xbb, 0x7c, 0xd1, 0x98, 0x14, 0x0e, 0x1f, 0xcc, 0xf7, 0xa9, 0x94, 0xfc, + 0x1c, 0xbc, 0x37, 0xc5, 0xdc, 0xaa, 0x7c, 0x73, 0x81, 0x23, 0xb5, 0x54, 0x2d, 0x83, 0xf6, 0x8e, + 0xb0, 0xf3, 0x7d, 0x23, 0x9a, 0x85, 0x90, 0xe7, 0xb6, 0x3c, 0x1b, 0x29, 0xc9, 0xb1, 0xf3, 0x43, + 0x5a, 0x34, 0x6b, 0xe1, 0x4b, 0x52, 0x06, 0x3c, 0xfe, 0x78, 0x31, 0x2a, 0x55, 0x8a, 0x12, 0xa4, + 0x0a, 0xb9, 0xf2, 0xde, 0x88, 0xa6, 0x64, 0xe3, 0x4f, 0x15, 0xcf, 0x26, 0x27, 0xee, 0x12, 0xaa, + 0xf6, 0x53, 0xb8, 0xbd, 0x24, 0xa5, 0xce, 0x82, 0xec, 0x94, 0x09, 0x55, 0xeb, 0x9e, 0x2e, 0x56, + 0xcd, 0x86, 0xbc, 0x94, 0xc4, 0x09, 0x82, 0xc5, 0xc7, 0x3b, 0x14, 0x70, 0x42, 0x87, 0xb2, 0x84, + 0x4f, 0x2f, 0x49, 0x01, 0xc1, 0x79, 0x34, 0xf8, 0xa0, 0x52, 0x01, 0x45, 0x2b, 0x15, 0x43, 0x87, + 0xdf, 0x14, 0xe3, 0x64, 0x2b, 0xa7, 0xe4, 0x0e, 0x0a, 0x31, 0xb4, 0x83, 0x84, 0x78, 0xda, 0x45, + 0x88, 0xc1, 0xab, 0x60, 0x20, 0x1f, 0x0b, 0x5a, 0x58, 0xae, 0xcf, 0x0f, 0x69, 0x10, 0x9d, 0x57, + 0x65, 0xd1, 0x9d, 0x95, 0xd3, 0x40, 0x31, 0x1e, 0xa4, 0x28, 0x7b, 0x40, 0x5a, 0xf3, 0x43, 0x1a, + 0x8b, 0xfc, 0xfc, 0xbc, 0x10, 0x47, 0x51, 0x39, 0x23, 0x4f, 0x11, 0x01, 0x82, 0x4e, 0x11, 0x61, + 0xb4, 0xc5, 0xb9, 0x78, 0xac, 0x41, 0xe5, 0x31, 0xf9, 0xfc, 0x2b, 0x8a, 0x9f, 0x1f, 0xd2, 0xe2, + 0xf1, 0x09, 0x5f, 0x92, 0xc2, 0xef, 0x29, 0x67, 0x23, 0xef, 0x09, 0x42, 0x14, 0x15, 0x97, 0x18, + 0xa8, 0x6f, 0x39, 0x31, 0x61, 0x86, 0x72, 0x0e, 0x18, 0x3c, 0x11, 0x30, 0x88, 0x93, 0xcc, 0x0f, + 0x69, 0x89, 0xa9, 0x36, 0xca, 0xb1, 0x20, 0x78, 0x8a, 0x22, 0x1f, 0xbc, 0x44, 0xd0, 0xf3, 0x43, + 0x5a, 0x2c, 0x6c, 0xde, 0x4d, 0x31, 0xfa, 0x9c, 0xf2, 0xb8, 0xdc, 0x89, 0x21, 0x86, 0x76, 0xa2, + 0x10, 0xa5, 0xee, 0xa6, 0x18, 0x25, 0x4d, 0x99, 0x8e, 0x97, 0x0a, 0x67, 0x4e, 0x21, 0x9a, 0x9a, + 0x96, 0x1c, 0x42, 0x4a, 0x79, 0x82, 0x87, 0xb9, 0xe5, 0xe5, 0x93, 0x68, 0xe6, 0x87, 0xb4, 0xe4, + 0xf0, 0x53, 0x5a, 0x72, 0x14, 0x27, 0xe5, 0xfc, 0x20, 0x9e, 0x41, 0xeb, 0x92, 0x23, 0x40, 0xe9, + 0x03, 0xa2, 0xf3, 0x28, 0x17, 0xe4, 0xc7, 0xcc, 0x7d, 0x09, 0xe7, 0x87, 0xb4, 0x01, 0x31, 0x7e, + 0xee, 0xf4, 0x09, 0x95, 0xa3, 0x5c, 0x94, 0xa3, 0x5c, 0x27, 0x12, 0xcd, 0x0f, 0x69, 0x7d, 0x02, + 0xed, 0xdc, 0xe9, 0x13, 0xdd, 0x45, 0x29, 0x0e, 0x64, 0x1b, 0xc8, 0xa3, 0x4f, 0x6c, 0x98, 0xe5, + 0xc4, 0x10, 0x2b, 0xca, 0x93, 0xb2, 0xea, 0x26, 0x90, 0x50, 0xd5, 0x4d, 0x0a, 0xce, 0xb2, 0x9c, + 0x18, 0x13, 0x44, 0x79, 0x6a, 0x00, 0xc3, 0xa0, 0x8d, 0x89, 0xd1, 0x44, 0x96, 0x13, 0x83, 0x72, + 0x28, 0xaa, 0xcc, 0x30, 0x81, 0x84, 0x32, 0x4c, 0x0a, 0xe7, 0xb1, 0x9c, 0x18, 0x45, 0x42, 0x79, + 0x7a, 0x00, 0xc3, 0xb0, 0x85, 0x49, 0xf1, 0x27, 0x5e, 0x92, 0xc2, 0x38, 0x28, 0x1f, 0x93, 0xe7, + 0x0d, 0x01, 0x45, 0xe7, 0x0d, 0x31, 0xe0, 0x43, 0x39, 0xf6, 0x50, 0x55, 0xf9, 0xb8, 0x3c, 0xcc, + 0x23, 0x68, 0x3a, 0xcc, 0xa3, 0x4f, 0x5b, 0xcb, 0xb1, 0x07, 0x7b, 0xca, 0xa5, 0x7e, 0x4c, 0x00, + 0x2d, 0x33, 0x61, 0x4f, 0xfc, 0x6a, 0x09, 0x2f, 0xc6, 0x94, 0x67, 0xe4, 0x8b, 0xb7, 0x18, 0xc1, + 0xfc, 0x90, 0x96, 0xf0, 0xce, 0x4c, 0x4b, 0x76, 0x8f, 0x56, 0x2e, 0xcb, 0xc3, 0x36, 0x89, 0x86, + 0x0e, 0xdb, 0x44, 0xd7, 0xea, 0x85, 0xa4, 0xab, 0x71, 0xe5, 0x8a, 0x6c, 0x98, 0xc5, 0x29, 0xa8, + 0x61, 0x96, 0x70, 0xa5, 0xae, 0x25, 0x3b, 0xfc, 0x2a, 0xcf, 0x0e, 0x6c, 0x21, 0xd0, 0x24, 0xb4, + 0x90, 0xf9, 0xbf, 0x86, 0xb6, 0xd3, 0x9d, 0x6e, 0xdb, 0xd6, 0x0d, 0xe5, 0x13, 0x89, 0xb6, 0x13, + 0x43, 0x0a, 0xb6, 0x13, 0x03, 0xd0, 0x55, 0x5e, 0xbc, 0x3a, 0x56, 0xae, 0xca, 0xab, 0xbc, 0x88, + 0xa3, 0xab, 0xbc, 0x74, 0xcd, 0x5c, 0x8e, 0x5d, 0xd8, 0x2a, 0xcf, 0xc9, 0x0a, 0x10, 0x41, 0x53, + 0x05, 0x88, 0x5e, 0xf1, 0xbe, 0xdb, 0xff, 0xb2, 0x54, 0x99, 0x01, 0x6e, 0x4f, 0x06, 0x49, 0x58, + 0xfb, 0xd0, 0xcd, 0x0f, 0x69, 0xfd, 0x2f, 0x5c, 0x6b, 0x09, 0x77, 0x9f, 0xca, 0x35, 0x59, 0xc1, + 0x62, 0x04, 0x54, 0xc1, 0xe2, 0x37, 0xa6, 0xb5, 0x84, 0xcb, 0x4b, 0xe5, 0x93, 0x7d, 0x59, 0x05, + 0xdf, 0x9c, 0x70, 0xe5, 0x79, 0x53, 0xbc, 0x7d, 0x54, 0x9e, 0x97, 0x17, 0xbb, 0x10, 0x43, 0x17, + 0x3b, 0xe1, 0x96, 0xf2, 0xa6, 0x78, 0x63, 0xa7, 0x5c, 0x8f, 0x97, 0x0a, 0x97, 0x48, 0xe1, 0x66, + 0x4f, 0x4b, 0xbe, 0x20, 0x53, 0x6e, 0xc8, 0x5a, 0x97, 0x44, 0x43, 0xb5, 0x2e, 0xf1, 0x72, 0x6d, + 0x2e, 0x7e, 0xcf, 0xa5, 0xdc, 0x8c, 0xde, 0xfc, 0xc9, 0x78, 0x6a, 0xf9, 0xc4, 0xee, 0xc6, 0xde, + 0x88, 0xbe, 0xdd, 0x51, 0x5e, 0x88, 0xec, 0x2f, 0x25, 0x2c, 0xb5, 0x6f, 0x23, 0x6f, 0x7d, 0xde, + 0x88, 0x3e, 0x77, 0x51, 0x5e, 0x4c, 0xe6, 0x10, 0xe8, 0x4a, 0xf4, 0x79, 0xcc, 0x1b, 0xd1, 0x17, + 0x22, 0xca, 0x4b, 0xc9, 0x1c, 0x02, 0xe9, 0x46, 0x5f, 0x94, 0x3c, 0x2f, 0xc4, 0xac, 0x50, 0x3e, + 0x25, 0x9b, 0x8e, 0x01, 0x82, 0x9a, 0x8e, 0x61, 0x64, 0x8b, 0xe7, 0x85, 0x58, 0x0f, 0xca, 0xcb, + 0xb1, 0x22, 0x41, 0x63, 0x85, 0x88, 0x10, 0xcf, 0x0b, 0x31, 0x12, 0x94, 0x57, 0x62, 0x45, 0x82, + 0xd6, 0x09, 0x91, 0x14, 0x8c, 0x41, 0x2e, 0x74, 0xca, 0xa7, 0x81, 0x87, 0xba, 0xbb, 0x57, 0xd4, + 0xfc, 0x90, 0x36, 0xc8, 0x15, 0xef, 0xdd, 0xfe, 0xb7, 0x86, 0xca, 0xab, 0xf2, 0x10, 0xee, 0x47, + 0x47, 0x87, 0x70, 0xdf, 0x9b, 0xc7, 0xd7, 0x22, 0xee, 0xf4, 0xca, 0x6b, 0xf2, 0x14, 0x27, 0x21, + 0xe9, 0x14, 0x17, 0x75, 0xbe, 0x97, 0xfc, 0xc4, 0x95, 0xcf, 0xc8, 0x53, 0x9c, 0x88, 0xa3, 0x53, + 0x9c, 0xe4, 0x53, 0x5e, 0x8e, 0xb9, 0x2f, 0x2b, 0xaf, 0xcb, 0x53, 0x5c, 0x04, 0x4d, 0xa7, 0xb8, + 0xa8, 0xc3, 0xf3, 0x6b, 0x11, 0x2f, 0x5e, 0xe5, 0x8d, 0xe4, 0xf6, 0x03, 0x52, 0x6c, 0x3f, 0xf3, + 0xf9, 0xd5, 0x92, 0xdd, 0x51, 0x95, 0x92, 0x3c, 0x7e, 0x93, 0x68, 0xe8, 0xf8, 0x4d, 0x74, 0x65, + 0x5d, 0x4e, 0xcc, 0x31, 0xa5, 0xcc, 0x0e, 0xd8, 0x38, 0x84, 0xa6, 0x48, 0x52, 0x76, 0x2a, 0x71, + 0x8f, 0xcc, 0x36, 0x42, 0xe5, 0x3e, 0x7b, 0x64, 0x7f, 0x1b, 0x14, 0xa1, 0xa7, 0xb3, 0x6b, 0xec, + 0x12, 0x4b, 0xa9, 0xc8, 0xb3, 0x6b, 0x8c, 0x80, 0xce, 0xae, 0xf1, 0xab, 0xaf, 0x39, 0x54, 0xe0, + 0x5a, 0xc4, 0xee, 0xe6, 0x4c, 0x6b, 0x4d, 0xa9, 0x46, 0xbc, 0xc1, 0x22, 0x78, 0x3a, 0x3b, 0x45, + 0x61, 0xb0, 0x5e, 0x33, 0x58, 0xb9, 0x6d, 0x76, 0x57, 0x6d, 0xdd, 0x31, 0x1a, 0xc4, 0x32, 0x94, + 0xb9, 0xc8, 0x7a, 0x9d, 0x40, 0x03, 0xeb, 0x75, 0x02, 0x1c, 0xde, 0xab, 0x44, 0xe0, 0x3c, 0x71, + 0xb2, 0x72, 0x0b, 0xd8, 0x16, 0xfb, 0xb1, 0xe5, 0x64, 0xf3, 0x43, 0x5a, 0x3f, 0x0e, 0xd4, 0x56, + 0x5f, 0xdc, 0x6a, 0xbc, 0xb5, 0x10, 0x78, 0x40, 0xd7, 0x1d, 0xd2, 0xd5, 0x1d, 0xa2, 0xcc, 0xcb, + 0xb6, 0x7a, 0x22, 0x11, 0xb5, 0xd5, 0x13, 0x11, 0x71, 0xb6, 0xfe, 0x58, 0xa8, 0x0d, 0x62, 0x1b, + 0x8e, 0x88, 0xe4, 0xd2, 0x74, 0x76, 0x92, 0x11, 0x54, 0x40, 0x0b, 0xb6, 0xb5, 0x06, 0x27, 0x15, + 0x6f, 0xca, 0xb3, 0x53, 0x7f, 0x4a, 0x3a, 0x3b, 0xf5, 0xc7, 0x52, 0x55, 0x97, 0xb1, 0x6c, 0x0c, + 0xde, 0x96, 0x55, 0x3d, 0x81, 0x84, 0xaa, 0x7a, 0x02, 0x38, 0xce, 0x50, 0x23, 0x2e, 0xf1, 0x94, + 0x85, 0x41, 0x0c, 0x81, 0x24, 0xce, 0x10, 0xc0, 0x71, 0x86, 0x73, 0xc4, 0x6b, 0xad, 0x2b, 0x8b, + 0x83, 0x18, 0x02, 0x49, 0x9c, 0x21, 0x80, 0xe9, 0x66, 0x53, 0x06, 0xcf, 0xf6, 0xda, 0x1b, 0x7e, + 0x9f, 0x2d, 0xc9, 0x9b, 0xcd, 0xbe, 0x84, 0x74, 0xb3, 0xd9, 0x17, 0x89, 0xbf, 0xbc, 0xe7, 0x2b, + 0x5a, 0x65, 0x19, 0x2a, 0x9c, 0x09, 0xed, 0x82, 0xbd, 0x94, 0x9a, 0x1f, 0xd2, 0xf6, 0x7a, 0x05, + 0xfc, 0x89, 0xe0, 0x76, 0x47, 0xa9, 0x43, 0x55, 0x53, 0xc1, 0x59, 0x05, 0x03, 0xcf, 0x0f, 0x69, + 0xc1, 0xfd, 0xcf, 0x4b, 0x68, 0x0c, 0x3e, 0xaa, 0x66, 0x99, 0x5e, 0x65, 0x56, 0x79, 0x4b, 0xde, + 0x32, 0x09, 0x28, 0xba, 0x65, 0x12, 0x7e, 0xd2, 0x49, 0x1c, 0x7e, 0xb2, 0x29, 0xa6, 0x32, 0xab, + 0x68, 0xf2, 0x24, 0x2e, 0x21, 0xe9, 0x24, 0x2e, 0x01, 0x82, 0x7a, 0x2b, 0x8e, 0xdd, 0xad, 0xcc, + 0x2a, 0x8d, 0x84, 0x7a, 0x19, 0x2a, 0xa8, 0x97, 0xfd, 0x0c, 0xea, 0x6d, 0xac, 0xf7, 0xbc, 0x0a, + 0xfd, 0xc6, 0x95, 0x84, 0x7a, 0x7d, 0x64, 0x50, 0xaf, 0x0f, 0xa0, 0x53, 0x21, 0x00, 0xea, 0x8e, + 0x4d, 0x27, 0xed, 0xdb, 0x66, 0xbb, 0xad, 0xdc, 0x91, 0xa7, 0xc2, 0x28, 0x9e, 0x4e, 0x85, 0x51, + 0x18, 0x35, 0x3d, 0x59, 0xab, 0xc8, 0x6a, 0x6f, 0x4d, 0x79, 0x5b, 0x36, 0x3d, 0x43, 0x0c, 0x35, + 0x3d, 0xc3, 0x5f, 0xb0, 0xbb, 0xa0, 0xbf, 0x34, 0x72, 0xcf, 0x21, 0xee, 0xba, 0x72, 0x37, 0xb2, + 0xbb, 0x10, 0x70, 0xb0, 0xbb, 0x10, 0x7e, 0xe3, 0x35, 0xf4, 0x84, 0xb4, 0xd0, 0xf8, 0x9e, 0x62, + 0x0d, 0xa2, 0x3b, 0xad, 0x75, 0xe5, 0xb3, 0xc0, 0xea, 0xe9, 0xc4, 0xa5, 0x4a, 0x26, 0x9d, 0x1f, + 0xd2, 0x06, 0x71, 0x82, 0x6d, 0xf9, 0x5b, 0x0b, 0xec, 0x61, 0xa9, 0x56, 0x2f, 0xfb, 0x9b, 0xd0, + 0x77, 0x22, 0xdb, 0xf2, 0x38, 0x09, 0x6c, 0xcb, 0xe3, 0x60, 0xdc, 0x45, 0x17, 0x23, 0x5b, 0xb5, + 0x45, 0xbd, 0x4d, 0xf7, 0x25, 0xc4, 0xa8, 0xeb, 0xad, 0x0d, 0xe2, 0x29, 0x9f, 0x03, 0xde, 0x97, + 0xfa, 0x6c, 0xf8, 0x22, 0xd4, 0xf3, 0x43, 0xda, 0x2e, 0xfc, 0xb0, 0xca, 0xb2, 0x18, 0x29, 0x9f, + 0x97, 0xcf, 0x37, 0x29, 0x6c, 0x7e, 0x48, 0x63, 0x19, 0x8e, 0xde, 0x45, 0xca, 0x9d, 0xee, 0x9a, + 0xa3, 0x1b, 0x84, 0x19, 0x5a, 0x60, 0xbb, 0x71, 0x03, 0xf4, 0x3b, 0x64, 0x2b, 0xad, 0x1f, 0x1d, + 0xb5, 0xd2, 0xfa, 0xe1, 0xa8, 0xa2, 0x4a, 0x31, 0x94, 0x94, 0x2f, 0xc8, 0x8a, 0x2a, 0x21, 0xa9, + 0xa2, 0xca, 0x11, 0x97, 0x3e, 0x8b, 0xce, 0x06, 0xfb, 0x79, 0xbe, 0xfe, 0xb2, 0x4e, 0x53, 0xde, + 0x05, 0x3e, 0x17, 0x63, 0x97, 0x01, 0x12, 0xd5, 0xfc, 0x90, 0xd6, 0xa7, 0x3c, 0x5d, 0x71, 0x63, + 0xe1, 0x01, 0xb9, 0x79, 0xf1, 0x9d, 0xf2, 0x8a, 0xdb, 0x87, 0x8c, 0xae, 0xb8, 0x7d, 0x50, 0x89, + 0xcc, 0xb9, 0x50, 0xf5, 0x5d, 0x98, 0x07, 0x32, 0xed, 0xc7, 0x21, 0x91, 0x39, 0xb7, 0xd4, 0x56, + 0x77, 0x61, 0x1e, 0x58, 0x6b, 0xfd, 0x38, 0xe0, 0xcb, 0x28, 0xd7, 0x68, 0x2c, 0x6a, 0x3d, 0x4b, + 0x69, 0x45, 0xae, 0xe5, 0x00, 0x3a, 0x3f, 0xa4, 0x71, 0x3c, 0x35, 0x83, 0xaa, 0x6d, 0xdd, 0xf5, + 0xcc, 0x96, 0x0b, 0x23, 0xc6, 0x1f, 0x21, 0x86, 0x6c, 0x06, 0x25, 0xd1, 0x50, 0x33, 0x28, 0x09, + 0x4e, 0xed, 0xc5, 0xb2, 0xee, 0xba, 0xba, 0x65, 0x38, 0xfa, 0x2c, 0x2c, 0x13, 0x24, 0x92, 0x37, + 0x5f, 0xc2, 0x52, 0x7b, 0x51, 0x86, 0xc0, 0xe1, 0xbb, 0x0f, 0xf1, 0xcd, 0x9c, 0x7b, 0x91, 0xc3, + 0xf7, 0x08, 0x1e, 0x0e, 0xdf, 0x23, 0x30, 0xb0, 0x3b, 0x7d, 0x98, 0x46, 0xd6, 0x4c, 0xc8, 0x39, + 0xb8, 0x16, 0xb1, 0x3b, 0xa3, 0x04, 0x60, 0x77, 0x46, 0x81, 0x52, 0x93, 0xfc, 0xe5, 0x76, 0xbd, + 0x4f, 0x93, 0xc2, 0x55, 0x36, 0x56, 0x86, 0xae, 0xdf, 0xe1, 0xe0, 0xa8, 0x6c, 0x59, 0x7a, 0xc7, + 0xae, 0xcc, 0xfa, 0x52, 0x37, 0xe5, 0xf5, 0xbb, 0x2f, 0x21, 0x5d, 0xbf, 0xfb, 0x22, 0xe9, 0xec, + 0xea, 0x6f, 0xb4, 0xd6, 0x75, 0x87, 0x18, 0x41, 0x26, 0x2e, 0xb6, 0x35, 0x7c, 0x4f, 0x9e, 0x5d, + 0x07, 0x90, 0xd2, 0xd9, 0x75, 0x00, 0x9a, 0x1a, 0x79, 0xc9, 0x68, 0x8d, 0xe8, 0x86, 0xb2, 0x21, + 0x1b, 0x79, 0xfd, 0x29, 0xa9, 0x91, 0xd7, 0x1f, 0xdb, 0xff, 0x73, 0xee, 0x3a, 0xa6, 0x47, 0x94, + 0xf6, 0x5e, 0x3e, 0x07, 0x48, 0xfb, 0x7f, 0x0e, 0xa0, 0xe9, 0x86, 0x30, 0xda, 0x21, 0x1d, 0x79, + 0x43, 0x18, 0xef, 0x86, 0x68, 0x09, 0x6a, 0xb1, 0x70, 0x7f, 0x31, 0xc5, 0x92, 0x2d, 0x16, 0x0e, + 0xa6, 0x16, 0x4b, 0xe8, 0x51, 0x26, 0x79, 0x3a, 0x29, 0xb6, 0xbc, 0x86, 0x8a, 0x38, 0xba, 0x86, + 0x4a, 0x5e, 0x51, 0x2f, 0x49, 0x0e, 0x0d, 0x4a, 0x57, 0xb6, 0x3a, 0x04, 0x14, 0xb5, 0x3a, 0x44, + 0xd7, 0x87, 0x32, 0x9a, 0x82, 0x5b, 0x70, 0xad, 0x17, 0xdc, 0xe3, 0x7c, 0x51, 0xfe, 0xcc, 0x08, + 0x9a, 0x7e, 0x66, 0x04, 0x24, 0x31, 0xe1, 0xd3, 0x96, 0xd3, 0x87, 0x49, 0x78, 0x3e, 0x18, 0x01, + 0xe1, 0x05, 0x84, 0x1b, 0xa5, 0xc5, 0x85, 0x9a, 0x51, 0x17, 0xaf, 0xc8, 0x5c, 0xf9, 0x04, 0x36, + 0x4e, 0x31, 0x3f, 0xa4, 0x25, 0x94, 0xc3, 0xef, 0xa1, 0xf3, 0x1c, 0xca, 0xdd, 0x79, 0x21, 0xbb, + 0x85, 0x11, 0x2c, 0x08, 0x1e, 0xf0, 0xfd, 0x58, 0x84, 0x6f, 0x22, 0xed, 0xfc, 0x90, 0x36, 0x90, + 0x57, 0xff, 0xba, 0xf8, 0xfa, 0xd0, 0xdb, 0x4b, 0x5d, 0xc1, 0x22, 0x31, 0x90, 0x57, 0xff, 0xba, + 0xb8, 0xdc, 0xef, 0xef, 0xa5, 0xae, 0xa0, 0x13, 0x06, 0xf2, 0xc2, 0x2e, 0x2a, 0x0e, 0xc2, 0x97, + 0xda, 0x6d, 0x65, 0x13, 0xaa, 0x7b, 0x66, 0x2f, 0xd5, 0x95, 0xc0, 0xe0, 0xdc, 0x8d, 0x23, 0x9d, + 0xa5, 0x97, 0xbb, 0xc4, 0x6a, 0x48, 0x0b, 0xd0, 0x03, 0x79, 0x96, 0x8e, 0x11, 0xd0, 0x59, 0x3a, + 0x06, 0xa4, 0x03, 0x4a, 0xf4, 0x8b, 0x51, 0xb6, 0xe4, 0x01, 0x25, 0xe2, 0xe8, 0x80, 0x92, 0x7c, + 0x68, 0x96, 0xd1, 0xe9, 0xe5, 0x0d, 0x4f, 0xf7, 0x2d, 0x48, 0x97, 0x77, 0xe5, 0xfb, 0x91, 0x4b, + 0xa6, 0x38, 0x09, 0x5c, 0x32, 0xc5, 0xc1, 0x74, 0x8c, 0x50, 0x70, 0x63, 0xcb, 0x6a, 0xcd, 0xe9, + 0x66, 0xbb, 0xe7, 0x10, 0xe5, 0x8f, 0xc8, 0x63, 0x24, 0x82, 0xa6, 0x63, 0x24, 0x02, 0xa2, 0x0b, + 0x34, 0x05, 0x95, 0x5c, 0xd7, 0x5c, 0xb3, 0xf8, 0xbe, 0xb2, 0xd7, 0xf6, 0x94, 0x3f, 0x2a, 0x2f, + 0xd0, 0x49, 0x34, 0x74, 0x81, 0x4e, 0x82, 0xc3, 0xa9, 0x53, 0x42, 0xe6, 0x17, 0xe5, 0x8f, 0x45, + 0x4e, 0x9d, 0x12, 0x68, 0xe0, 0xd4, 0x29, 0x29, 0x6b, 0xcc, 0x1c, 0x2a, 0x84, 0xd9, 0xda, 0x39, + 0xbf, 0x3f, 0x2e, 0xaf, 0x8f, 0x51, 0x3c, 0x5d, 0x1f, 0xa3, 0x30, 0x99, 0x0f, 0xef, 0x82, 0x3f, + 0xd1, 0x8f, 0x4f, 0x20, 0xff, 0x58, 0x19, 0x7c, 0x4b, 0xe4, 0xc3, 0x47, 0xca, 0x77, 0xa5, 0xfa, + 0x31, 0x0a, 0x86, 0x47, 0xac, 0x90, 0xcc, 0x48, 0x23, 0xf7, 0x4d, 0xb2, 0xa9, 0x7c, 0xa9, 0x2f, + 0x23, 0x46, 0x20, 0x33, 0x62, 0x30, 0xfc, 0x0e, 0x3a, 0x1b, 0xc2, 0x16, 0x49, 0x67, 0x35, 0x98, + 0x99, 0xfe, 0x64, 0x4a, 0x36, 0x83, 0x93, 0xc9, 0xa8, 0x19, 0x9c, 0x8c, 0x49, 0x62, 0xcd, 0x45, + 0xf7, 0xa7, 0x76, 0x61, 0x1d, 0x48, 0xb0, 0x0f, 0x83, 0x24, 0xd6, 0x5c, 0x9a, 0xdf, 0xbd, 0x0b, + 0xeb, 0x40, 0xa6, 0x7d, 0x18, 0xe0, 0xef, 0x4f, 0xa1, 0x4b, 0xc9, 0xa8, 0x52, 0xbb, 0x3d, 0x67, + 0x3b, 0x21, 0x4e, 0xf9, 0x9e, 0x94, 0x7c, 0xd0, 0xb0, 0xb7, 0x62, 0xf3, 0x43, 0xda, 0x1e, 0x2b, + 0xc0, 0x9f, 0x41, 0x13, 0xa5, 0x9e, 0x61, 0x7a, 0x70, 0xf1, 0x46, 0x0d, 0xe7, 0xef, 0x4d, 0x45, + 0xb6, 0x38, 0x22, 0x16, 0xb6, 0x38, 0x22, 0x00, 0xbf, 0x89, 0x4e, 0x35, 0x48, 0xab, 0xe7, 0x98, + 0xde, 0x96, 0x06, 0x59, 0x7d, 0x28, 0x8f, 0xef, 0x4b, 0xc9, 0x93, 0x58, 0x8c, 0x82, 0x4e, 0x62, + 0x31, 0x20, 0x7e, 0xbb, 0x4f, 0x16, 0x19, 0xe5, 0xcb, 0xa9, 0x81, 0xd7, 0xf2, 0x41, 0x5f, 0xf6, + 0x49, 0x42, 0x53, 0x4f, 0xcc, 0x14, 0xa2, 0x7c, 0x7f, 0x6a, 0xc0, 0x35, 0xba, 0x30, 0xc3, 0x25, + 0x24, 0x19, 0xa9, 0x27, 0xe6, 0x82, 0x50, 0x7e, 0x20, 0x35, 0xe0, 0xda, 0x3b, 0xe4, 0x98, 0x94, + 0x46, 0xe2, 0x05, 0x31, 0x2d, 0xa0, 0xf2, 0xa7, 0x53, 0x71, 0x57, 0x91, 0xa0, 0xbc, 0x98, 0x3f, + 0xf0, 0x05, 0xe6, 0x9a, 0xc7, 0x8b, 0x7d, 0x25, 0x15, 0xf7, 0xcd, 0x0b, 0x8b, 0x85, 0xbf, 0x30, + 0x41, 0xd3, 0xd5, 0x07, 0x1e, 0x71, 0x2c, 0xbd, 0x0d, 0xdd, 0xd9, 0xf0, 0x6c, 0x47, 0x5f, 0x23, + 0x55, 0x4b, 0x5f, 0x6d, 0x13, 0xe5, 0x07, 0x53, 0xb2, 0x05, 0xdb, 0x9f, 0x94, 0x5a, 0xb0, 0xfd, + 0xb1, 0x78, 0x1d, 0x3d, 0x91, 0x84, 0xad, 0x98, 0x2e, 0xd4, 0xf3, 0x43, 0x29, 0xd9, 0x84, 0x1d, + 0x40, 0x4b, 0x4d, 0xd8, 0x01, 0x68, 0x7c, 0x5d, 0xc8, 0xe3, 0xa7, 0xfc, 0x99, 0x88, 0x33, 0x64, + 0x80, 0x99, 0x1f, 0xd2, 0x84, 0x74, 0x7f, 0xd7, 0x85, 0x7c, 0x73, 0xca, 0x57, 0xe3, 0x65, 0xc2, + 0xcb, 0xa7, 0x30, 0x2d, 0xdd, 0x75, 0x21, 0xd3, 0x9e, 0xf2, 0x67, 0xe3, 0x65, 0xc2, 0x3b, 0xae, + 0xe0, 0xc7, 0xec, 0x08, 0x1a, 0x86, 0x95, 0x56, 0xfd, 0xd1, 0x14, 0x1a, 0x6f, 0x78, 0x0e, 0xd1, + 0x3b, 0xdc, 0xdd, 0x7e, 0x1a, 0xe5, 0xd9, 0x95, 0x75, 0xad, 0xc2, 0x5f, 0xc5, 0x04, 0xbf, 0xf1, + 0x25, 0x34, 0xb9, 0xa0, 0xbb, 0x1e, 0x94, 0xac, 0x59, 0x06, 0x79, 0x00, 0xee, 0x9a, 0x19, 0x2d, + 0x02, 0xc5, 0x0b, 0x8c, 0x8e, 0x95, 0x83, 0xf7, 0x45, 0x99, 0x5d, 0xbd, 0xcc, 0xf3, 0x1f, 0x6c, + 0x17, 0x87, 0xc0, 0xa9, 0x3c, 0x52, 0x56, 0xfd, 0x46, 0x0a, 0xc5, 0x2e, 0xd3, 0x0f, 0xee, 0x5c, + 0xbe, 0x8c, 0xa6, 0x22, 0x6f, 0xda, 0xb8, 0xcf, 0xe9, 0x1e, 0x9f, 0xbc, 0x45, 0x4b, 0xe3, 0x67, + 0x02, 0x5f, 0xc7, 0x3b, 0xda, 0x02, 0x7f, 0x41, 0x30, 0x02, 0xa9, 0xc5, 0x9d, 0xb6, 0x26, 0xa0, + 0xb8, 0xaf, 0xec, 0x5f, 0x9c, 0x0a, 0x1f, 0xec, 0xe0, 0x4b, 0xfc, 0xbd, 0x5e, 0x2a, 0x7c, 0x77, + 0x10, 0x89, 0x2c, 0xca, 0xde, 0xe7, 0x7d, 0x06, 0x8d, 0xd7, 0x3a, 0x5d, 0xe2, 0xb8, 0xb6, 0xa5, + 0x7b, 0xb6, 0x9f, 0xc1, 0x00, 0xbc, 0xdb, 0x4d, 0x01, 0x2e, 0x7a, 0x5c, 0x8b, 0xf4, 0xf8, 0x8a, + 0x9f, 0x8e, 0x2d, 0x03, 0x4f, 0xa5, 0x4e, 0x27, 0xa4, 0x63, 0xf3, 0x93, 0xaa, 0x5d, 0x41, 0xc3, + 0x77, 0x5c, 0x1d, 0xbc, 0x62, 0x03, 0xd2, 0x1e, 0x05, 0x88, 0xa4, 0x40, 0x81, 0xaf, 0xa2, 0x1c, + 0xec, 0x22, 0x5c, 0x65, 0x18, 0x68, 0xe1, 0x35, 0x44, 0x1b, 0x20, 0xa2, 0x17, 0x3b, 0xa3, 0xc1, + 0xb7, 0x51, 0x21, 0x3c, 0x22, 0x81, 0x9c, 0x1b, 0x7e, 0xb0, 0x12, 0x88, 0xf2, 0xb9, 0x11, 0xe0, + 0x58, 0xb2, 0x0e, 0x91, 0x45, 0xac, 0x20, 0x9e, 0x47, 0x53, 0x21, 0x8c, 0x8a, 0xc8, 0x0f, 0x92, + 0x04, 0x51, 0x6e, 0x05, 0x5e, 0x54, 0x9c, 0x22, 0xab, 0x68, 0x31, 0x5c, 0x43, 0x23, 0xfe, 0x53, + 0x88, 0xfc, 0xae, 0x4a, 0x7a, 0x9a, 0x3f, 0x85, 0x18, 0x11, 0x1f, 0x41, 0xf8, 0xe5, 0xf1, 0x1c, + 0x9a, 0xd4, 0xec, 0x9e, 0x47, 0x56, 0x6c, 0x7e, 0x02, 0xc4, 0xa3, 0x68, 0x40, 0x9b, 0x1c, 0x8a, + 0x69, 0x7a, 0xb6, 0x1f, 0x24, 0x55, 0x0c, 0xd6, 0x29, 0x97, 0xc2, 0x4b, 0xe8, 0x54, 0xec, 0x30, + 0x49, 0x0c, 0x5d, 0x2a, 0x7c, 0x5e, 0x9c, 0x59, 0xbc, 0x28, 0xfe, 0xde, 0x14, 0xca, 0xad, 0x38, + 0xba, 0xe9, 0xb9, 0xdc, 0xa1, 0xf6, 0xb1, 0x99, 0x4d, 0x47, 0xef, 0x52, 0xfd, 0x98, 0x81, 0xb7, + 0x70, 0x90, 0x8d, 0xde, 0x9d, 0xbd, 0x4b, 0xbf, 0xee, 0xdf, 0x6e, 0x17, 0x3f, 0xbd, 0x8f, 0x34, + 0x79, 0xd7, 0x02, 0x4e, 0xac, 0x06, 0xaa, 0x02, 0x1e, 0xfc, 0x25, 0xaa, 0x00, 0xc3, 0xe1, 0x25, + 0xba, 0xa0, 0xc0, 0xa7, 0x96, 0xba, 0x5d, 0xee, 0x9d, 0x2b, 0xac, 0x27, 0x3e, 0x86, 0x29, 0x76, + 0x20, 0x30, 0xbd, 0x2b, 0x66, 0x6e, 0x11, 0x38, 0x50, 0x2d, 0x58, 0xe1, 0x2d, 0xf2, 0xc5, 0x34, + 0x11, 0x4a, 0xdc, 0x6f, 0x6c, 0x82, 0x90, 0xa2, 0xc5, 0xf0, 0x2a, 0x9a, 0xe2, 0x7c, 0x83, 0xb0, + 0x16, 0x93, 0xf2, 0xac, 0x10, 0x41, 0x33, 0xa5, 0x0d, 0xda, 0x68, 0x70, 0xb0, 0x58, 0x47, 0xa4, + 0x04, 0x9e, 0x0d, 0xa3, 0xee, 0x41, 0x9a, 0x18, 0x65, 0x0a, 0x34, 0xf6, 0xfc, 0xce, 0x76, 0x51, + 0xf1, 0xcb, 0xb3, 0xec, 0x32, 0x49, 0x31, 0x64, 0xa1, 0x88, 0xc8, 0x83, 0x69, 0x7d, 0x21, 0x81, + 0x47, 0x54, 0xe7, 0xe5, 0x22, 0xb8, 0x8c, 0x26, 0x02, 0xe7, 0xa0, 0x3b, 0x77, 0x6a, 0x15, 0x70, + 0xff, 0xe5, 0xf9, 0x50, 0x22, 0x11, 0x33, 0x44, 0x26, 0x52, 0x19, 0x7c, 0x03, 0xe5, 0x99, 0x7b, + 0x6d, 0x8d, 0xf9, 0x03, 0xfb, 0x4f, 0x16, 0x01, 0xd6, 0x34, 0xc5, 0x1e, 0x0b, 0x08, 0xf1, 0x6b, + 0x68, 0xac, 0x74, 0xb7, 0x41, 0xe7, 0x99, 0x92, 0xb6, 0xe4, 0x2a, 0xa7, 0xc3, 0x50, 0x45, 0x10, + 0x46, 0xd8, 0x6e, 0x93, 0xa6, 0xee, 0x48, 0x93, 0x87, 0x48, 0x8f, 0xab, 0x68, 0x52, 0xba, 0x5f, + 0x70, 0x95, 0x33, 0xc0, 0x81, 0x65, 0x72, 0x01, 0x4c, 0x93, 0x27, 0x13, 0x92, 0x62, 0x25, 0xcb, + 0x85, 0xa8, 0xd6, 0xd0, 0x25, 0xba, 0xdd, 0xb6, 0x37, 0x35, 0x62, 0xba, 0x6e, 0x8f, 0x80, 0x33, + 0x71, 0x9e, 0x69, 0x8d, 0xc1, 0x51, 0x4d, 0x87, 0xe1, 0xa4, 0x48, 0xd6, 0x72, 0x31, 0xfc, 0x1e, + 0xc2, 0x10, 0x28, 0x86, 0x18, 0xfe, 0x76, 0xb3, 0x56, 0x71, 0x95, 0xb3, 0xf0, 0x26, 0x18, 0x47, + 0x5f, 0xe6, 0xd7, 0x2a, 0xb3, 0x97, 0xf8, 0xf4, 0x71, 0x51, 0x67, 0xa5, 0x9a, 0x41, 0x22, 0x1f, + 0xd3, 0x10, 0x5b, 0x9c, 0xc0, 0x15, 0x6f, 0xa2, 0x73, 0x75, 0x87, 0xdc, 0x37, 0xed, 0x9e, 0xeb, + 0x2f, 0x1f, 0xfe, 0xbc, 0x75, 0x6e, 0xd7, 0x79, 0xeb, 0x29, 0x5e, 0xf1, 0x63, 0x5d, 0x87, 0xdc, + 0x6f, 0xfa, 0x2f, 0x41, 0xa5, 0xa7, 0x5c, 0xfd, 0xb8, 0x53, 0x71, 0x95, 0xde, 0xef, 0x39, 0x84, + 0xc3, 0x4d, 0xe2, 0x2a, 0x4a, 0x38, 0xd5, 0xea, 0x14, 0xe5, 0x73, 0x34, 0x25, 0xd5, 0x8d, 0x16, + 0xc3, 0x1a, 0xc2, 0xb7, 0xca, 0xfe, 0xd1, 0x43, 0xa9, 0xd5, 0xb2, 0x7b, 0x96, 0xe7, 0x2a, 0x8f, + 0x03, 0x33, 0x95, 0x8a, 0x65, 0xad, 0x15, 0xbc, 0x0a, 0x6f, 0xea, 0x1c, 0x2f, 0x8a, 0x25, 0x5e, + 0x1a, 0x2f, 0xa0, 0x42, 0xdd, 0x31, 0xef, 0xeb, 0x1e, 0xb9, 0x4d, 0xb6, 0xea, 0x76, 0xdb, 0x6c, + 0x6d, 0x81, 0x4f, 0x33, 0x9f, 0x2a, 0xbb, 0x0c, 0xd7, 0xdc, 0x20, 0x5b, 0xcd, 0x2e, 0x60, 0xc5, + 0x65, 0x25, 0x5a, 0x52, 0xfd, 0xa1, 0x8c, 0x38, 0x43, 0x05, 0x79, 0xf2, 0x53, 0x89, 0x79, 0xf2, + 0xaf, 0xa2, 0x51, 0xbe, 0xba, 0x07, 0x51, 0x67, 0x20, 0x44, 0x9f, 0xff, 0x40, 0xda, 0x34, 0xb4, + 0x90, 0x00, 0xc2, 0xa3, 0x85, 0x39, 0x36, 0x32, 0x42, 0x78, 0xb4, 0x30, 0xc7, 0x86, 0x94, 0x61, + 0xe3, 0x3a, 0x1a, 0xe3, 0xb3, 0x93, 0xf0, 0x96, 0x11, 0x1e, 0x39, 0xfb, 0x61, 0xb6, 0xd9, 0x1b, + 0x6a, 0x81, 0x08, 0xbf, 0x02, 0x81, 0xe6, 0xf9, 0x80, 0xe1, 0xb6, 0x08, 0x4c, 0xa6, 0xe2, 0xf8, + 0x8a, 0x44, 0x9a, 0xe7, 0xd4, 0x74, 0x6a, 0x11, 0x3b, 0xcc, 0x0f, 0x08, 0x09, 0x53, 0x8b, 0xd4, + 0xcb, 0x5b, 0x52, 0x96, 0x24, 0xb1, 0x08, 0x5e, 0x46, 0xa7, 0x62, 0x7d, 0xc4, 0x5f, 0x3e, 0x42, + 0x78, 0xd0, 0x84, 0x0e, 0x16, 0x97, 0xae, 0x58, 0x59, 0xf5, 0xdf, 0xa4, 0x62, 0x13, 0x33, 0x15, + 0x0c, 0xa7, 0x12, 0x3a, 0x07, 0x04, 0xe3, 0xb3, 0x66, 0x82, 0x11, 0x88, 0xf0, 0x65, 0x94, 0x8f, + 0xc4, 0x9a, 0x87, 0x37, 0xd1, 0x41, 0xa0, 0xf9, 0x00, 0x8b, 0xaf, 0xa3, 0x3c, 0x9d, 0x26, 0xad, + 0xc8, 0x3b, 0xdf, 0x1e, 0x87, 0x89, 0xf3, 0x9a, 0x4f, 0x47, 0xcb, 0x48, 0xd1, 0x90, 0xfc, 0x90, + 0xe0, 0xf1, 0x45, 0x21, 0x8c, 0x7e, 0xf4, 0xbf, 0xb3, 0x03, 0xef, 0x5d, 0x8f, 0x24, 0x0c, 0xc4, + 0xcb, 0xd4, 0xd0, 0xa6, 0xb5, 0x97, 0xdc, 0x98, 0xb9, 0xc8, 0xae, 0x95, 0x9a, 0x3a, 0xd3, 0x23, + 0x57, 0x93, 0x29, 0xc5, 0x6c, 0x65, 0xf0, 0x68, 0x33, 0x9b, 0x90, 0xad, 0x2c, 0x1a, 0xe2, 0x5c, + 0x2c, 0x80, 0x5f, 0x40, 0xa3, 0x61, 0xde, 0xb5, 0x61, 0xe1, 0xe1, 0x6e, 0x42, 0xba, 0xb5, 0x90, + 0x12, 0x7f, 0x01, 0xe5, 0xa4, 0x18, 0xfb, 0xd7, 0xf6, 0x70, 0x51, 0x3d, 0x23, 0x86, 0x61, 0x60, + 0x46, 0x6b, 0x34, 0xbe, 0x3e, 0x67, 0x8a, 0x57, 0xd0, 0xe9, 0xba, 0x43, 0x0c, 0x70, 0x89, 0xa8, + 0x3e, 0xe8, 0x3a, 0x3c, 0x48, 0x06, 0x53, 0x69, 0x98, 0xb3, 0xba, 0x3e, 0x9a, 0xce, 0xa6, 0x1c, + 0x2f, 0x30, 0x4a, 0x2a, 0x4e, 0x17, 0x32, 0xd6, 0x92, 0xdb, 0x64, 0x6b, 0xd3, 0x76, 0x0c, 0x16, + 0x47, 0x82, 0x2f, 0x64, 0x5c, 0xd0, 0x1b, 0x1c, 0x25, 0x2e, 0x64, 0x72, 0xa1, 0xe9, 0x97, 0xd1, + 0xd8, 0x41, 0x43, 0x19, 0xfc, 0x4c, 0xba, 0x8f, 0x07, 0xd3, 0xa3, 0x1b, 0x7c, 0x31, 0x08, 0x84, + 0x3b, 0xdc, 0x27, 0x10, 0xee, 0xef, 0xa5, 0xfb, 0xb8, 0x67, 0x3d, 0xd2, 0x01, 0x2b, 0x03, 0x61, + 0xc8, 0x01, 0x2b, 0xc3, 0x58, 0xa1, 0xa6, 0xa1, 0x89, 0x44, 0x91, 0xd0, 0xb6, 0xb9, 0x5d, 0x43, + 0xdb, 0xfe, 0x78, 0x66, 0x90, 0xfb, 0xda, 0x89, 0xec, 0xf7, 0x23, 0xfb, 0xeb, 0x68, 0x2c, 0x90, + 0x2c, 0x4f, 0x54, 0x34, 0x11, 0x04, 0x4e, 0x61, 0x60, 0x28, 0x23, 0x10, 0xe1, 0x2b, 0xac, 0xad, + 0x0d, 0xf3, 0x7d, 0x16, 0xc4, 0x60, 0x82, 0x3f, 0x74, 0xd7, 0x3d, 0xbd, 0xe9, 0x9a, 0xef, 0x13, + 0x2d, 0x40, 0xab, 0xff, 0x28, 0x9d, 0xe8, 0x03, 0x78, 0xd2, 0x47, 0xfb, 0xe8, 0xa3, 0x04, 0x21, + 0x32, 0xef, 0xc5, 0x13, 0x21, 0xee, 0x43, 0x88, 0xbf, 0x9b, 0x4e, 0xf4, 0xf5, 0x3c, 0x11, 0xe2, + 0x7e, 0x66, 0x8b, 0xab, 0x68, 0x54, 0xb3, 0x37, 0xdd, 0x32, 0x58, 0xf1, 0x6c, 0xae, 0x80, 0x89, + 0xda, 0xb1, 0x37, 0xdd, 0x26, 0xd8, 0xe7, 0x5a, 0x48, 0xa0, 0x7e, 0x2b, 0x3d, 0xc0, 0x1b, 0xf6, + 0x44, 0xf0, 0xdf, 0xce, 0x25, 0xf2, 0xe7, 0xd2, 0x92, 0xb7, 0xed, 0x23, 0x1d, 0xf9, 0xbd, 0xd1, + 0x5a, 0x27, 0x1d, 0x3d, 0x1a, 0xf9, 0xdd, 0x05, 0x28, 0x0f, 0x1c, 0x1b, 0x92, 0xa8, 0xbf, 0x90, + 0x8e, 0xb8, 0x1b, 0x9f, 0xc8, 0x6e, 0xcf, 0xb2, 0x0b, 0xb4, 0x8e, 0x7b, 0x50, 0x9f, 0x48, 0x6e, + 0xaf, 0x92, 0xfb, 0x72, 0x3a, 0xe2, 0x6c, 0xfe, 0xe8, 0x06, 0x81, 0xfe, 0x85, 0x74, 0xdc, 0x71, + 0xfe, 0xd1, 0xd5, 0xa4, 0xab, 0x68, 0x94, 0xcb, 0x21, 0x58, 0x2a, 0xd8, 0xbc, 0xcf, 0x80, 0x70, + 0xa4, 0x18, 0x10, 0xa8, 0xdf, 0x93, 0x46, 0xf2, 0x23, 0x80, 0x47, 0x54, 0x87, 0x7e, 0x2e, 0x2d, + 0x3f, 0x7f, 0x78, 0x74, 0xf5, 0x67, 0x06, 0xa1, 0x46, 0x6f, 0xb5, 0xc5, 0xa3, 0xe7, 0x0c, 0x0b, + 0x67, 0xd2, 0x01, 0x54, 0x13, 0x28, 0xd4, 0xff, 0x93, 0x4e, 0x7c, 0x93, 0xf1, 0xe8, 0x0a, 0xf0, + 0x06, 0x9c, 0x13, 0xb7, 0xac, 0x70, 0x22, 0x87, 0x43, 0x48, 0x3a, 0xfe, 0x62, 0xd1, 0x03, 0x7d, + 0x42, 0xfc, 0xa9, 0x04, 0x73, 0x0d, 0x02, 0xfd, 0x25, 0x26, 0xc1, 0x12, 0x0d, 0xb7, 0x7f, 0x96, + 0xde, 0xed, 0x09, 0xcb, 0xa3, 0xbc, 0xaa, 0x8e, 0xd4, 0xf5, 0x2d, 0x08, 0xb5, 0x40, 0x7b, 0x62, + 0x9c, 0x45, 0xc9, 0xeb, 0x32, 0x90, 0x18, 0x6e, 0x93, 0x53, 0xa9, 0xbf, 0x33, 0x9c, 0xfc, 0x7e, + 0xe2, 0xd1, 0x15, 0xa1, 0x9f, 0xa4, 0x79, 0x78, 0xd7, 0x24, 0xcd, 0xb9, 0xbd, 0x26, 0x69, 0x1e, + 0xe9, 0x9b, 0xa4, 0xf9, 0x3c, 0xca, 0xce, 0xda, 0xc6, 0x16, 0x78, 0x51, 0x8c, 0xb3, 0xca, 0x56, + 0x6d, 0x63, 0x4b, 0x03, 0x28, 0xfe, 0xfe, 0x14, 0x1a, 0x99, 0x27, 0xba, 0x41, 0x47, 0xc8, 0xe8, + 0x20, 0x27, 0x84, 0xcf, 0x3e, 0x1c, 0x27, 0x84, 0x53, 0xeb, 0xac, 0x32, 0x51, 0x51, 0x78, 0xfd, + 0xf8, 0x16, 0xca, 0x97, 0x75, 0x8f, 0xac, 0xd9, 0xce, 0x16, 0xb8, 0x55, 0x4c, 0x86, 0x5e, 0x7c, + 0x92, 0xfe, 0xf8, 0x44, 0xec, 0xae, 0xa8, 0xc5, 0x7f, 0x69, 0x41, 0x61, 0x2a, 0x16, 0x1e, 0x15, + 0x7e, 0x2c, 0x14, 0x8b, 0x1c, 0xfe, 0x3d, 0x3c, 0x56, 0x1e, 0x4f, 0x3e, 0x56, 0x8e, 0xa4, 0xde, + 0x9e, 0xd8, 0x35, 0xf5, 0xb6, 0xfa, 0xcd, 0x61, 0x94, 0xe8, 0x6d, 0x7d, 0xa2, 0xe4, 0x27, 0x4a, + 0x1e, 0x2a, 0x79, 0x25, 0xa6, 0xe4, 0xd3, 0x71, 0xff, 0xfd, 0x0f, 0xa9, 0x86, 0xff, 0x48, 0x36, + 0xf6, 0xfa, 0xe7, 0xd1, 0xde, 0x5d, 0x86, 0xd2, 0x1b, 0xde, 0x7b, 0x6a, 0xfe, 0xdc, 0xae, 0x03, + 0x62, 0x64, 0xaf, 0x03, 0x22, 0xdf, 0x77, 0x40, 0x84, 0x0a, 0x32, 0xda, 0x57, 0x41, 0x6a, 0x7c, + 0xd0, 0xa0, 0xc1, 0x91, 0x8c, 0xcf, 0xef, 0x6c, 0x17, 0x27, 0xe9, 0x68, 0x4a, 0x8c, 0x61, 0x0c, + 0x2c, 0xd4, 0x6f, 0x64, 0x07, 0x3c, 0xd9, 0x3b, 0x12, 0x1d, 0xb9, 0x81, 0x32, 0xa5, 0x6e, 0x97, + 0xeb, 0xc7, 0x69, 0xe1, 0xb5, 0x60, 0x9f, 0x52, 0x94, 0x1a, 0xbf, 0x82, 0x32, 0xa5, 0xbb, 0x8d, + 0x68, 0xe0, 0x51, 0x48, 0x90, 0x0e, 0x5f, 0xd2, 0xb7, 0xec, 0xdd, 0x06, 0x7e, 0x35, 0x8c, 0x00, + 0xb2, 0xde, 0xb3, 0x36, 0xf8, 0x46, 0x91, 0x7b, 0x5f, 0xfa, 0xbe, 0x27, 0x2d, 0x8a, 0xa2, 0xdb, + 0xc5, 0x08, 0x6d, 0x44, 0x9b, 0x72, 0x7b, 0xd7, 0xa6, 0x91, 0x5d, 0xb5, 0x29, 0xbf, 0x57, 0x6d, + 0x1a, 0xdd, 0x83, 0x36, 0xa1, 0x5d, 0xb5, 0x69, 0xec, 0xf0, 0xda, 0xd4, 0x45, 0xd3, 0xf1, 0x67, + 0xd6, 0x81, 0x46, 0x68, 0x08, 0xc7, 0xb1, 0xdc, 0xdd, 0x04, 0xae, 0xfe, 0x7b, 0x0c, 0xdb, 0x64, + 0xf9, 0x22, 0xa2, 0xd9, 0x16, 0xb4, 0x84, 0xd2, 0xea, 0xcf, 0xa4, 0xfb, 0xbf, 0x0e, 0x3f, 0x9e, + 0x53, 0xdc, 0x77, 0x26, 0x4a, 0x29, 0x2b, 0x7b, 0xeb, 0xf7, 0x97, 0x72, 0x84, 0x6d, 0x92, 0xcc, + 0xbe, 0x96, 0xea, 0xf7, 0x64, 0xfd, 0x50, 0x12, 0xfb, 0x78, 0xdc, 0x7d, 0x0b, 0xdc, 0xb6, 0x5d, + 0xd9, 0x6f, 0x2b, 0x9a, 0xbc, 0x20, 0x73, 0xc0, 0xe4, 0x05, 0xff, 0x30, 0x85, 0x4e, 0xdf, 0xee, + 0xad, 0x12, 0xee, 0xae, 0x15, 0x34, 0xe3, 0x3d, 0x84, 0x28, 0x98, 0x3b, 0xb1, 0xa4, 0xc0, 0x89, + 0xe5, 0x13, 0xe2, 0x73, 0xf3, 0x48, 0x81, 0x99, 0x90, 0x9a, 0x39, 0xb0, 0x5c, 0xf0, 0x7d, 0xfb, + 0x36, 0x7a, 0xab, 0xa4, 0x19, 0xf3, 0x64, 0x11, 0xb8, 0x4f, 0xbf, 0xc6, 0xbc, 0xa6, 0x0f, 0xea, + 0x34, 0xf2, 0x53, 0xe9, 0xbe, 0x2f, 0xfc, 0x8f, 0x6d, 0xee, 0xfb, 0xcf, 0x27, 0xf6, 0x0a, 0xd7, + 0xdf, 0x27, 0x06, 0xf4, 0x43, 0x84, 0x63, 0x12, 0x97, 0x64, 0x81, 0x1d, 0xe1, 0x60, 0xff, 0xd0, + 0x0b, 0xec, 0x37, 0x52, 0x7d, 0x23, 0x31, 0x1c, 0x57, 0x81, 0xa9, 0x5f, 0x4f, 0xfb, 0x01, 0x20, + 0x0e, 0xf5, 0x09, 0x57, 0xd1, 0x28, 0x8f, 0x72, 0x2d, 0x7b, 0x9b, 0xf2, 0xa3, 0x3c, 0x38, 0x1a, + 0x0e, 0x08, 0xe8, 0x32, 0xef, 0x3f, 0x50, 0x0f, 0x12, 0x67, 0xc0, 0x32, 0x6f, 0x72, 0x28, 0xa5, + 0x17, 0x48, 0xe8, 0x42, 0x5e, 0x7d, 0x60, 0x7a, 0x60, 0x15, 0xd0, 0xbe, 0xcc, 0xb0, 0x85, 0x9c, + 0x3c, 0x30, 0x3d, 0x66, 0x13, 0x04, 0x68, 0xba, 0x48, 0x0b, 0x29, 0x51, 0xf9, 0x22, 0xed, 0xf2, + 0x70, 0xfb, 0xfc, 0x15, 0xd1, 0x55, 0x34, 0xca, 0x5d, 0x38, 0xb9, 0x9b, 0x09, 0x6f, 0x2d, 0x77, + 0xfa, 0x84, 0xd6, 0x06, 0x04, 0x94, 0xa3, 0x46, 0xd6, 0x42, 0xc7, 0x3a, 0xe0, 0xe8, 0x00, 0x44, + 0xe3, 0x18, 0x75, 0x27, 0x1d, 0x8f, 0x43, 0xf1, 0xe8, 0x6e, 0x0a, 0xae, 0xc8, 0xce, 0x6a, 0xe0, + 0xa1, 0x09, 0x06, 0x97, 0xf8, 0x4a, 0x87, 0xd9, 0x5d, 0xd7, 0x51, 0xfe, 0x36, 0xd9, 0x62, 0x7e, + 0x95, 0xb9, 0xd0, 0x39, 0x75, 0x83, 0xc3, 0xc4, 0x13, 0x4d, 0x9f, 0x4e, 0xfd, 0xa5, 0x74, 0x3c, + 0xc2, 0xc6, 0xa3, 0x2b, 0xec, 0x4f, 0xa2, 0x11, 0x10, 0x65, 0xcd, 0x3f, 0x52, 0x07, 0x01, 0x82, + 0xb8, 0xe5, 0xf4, 0x19, 0x3e, 0x99, 0xfa, 0x63, 0xb9, 0x68, 0xd8, 0x95, 0x47, 0x57, 0x7a, 0x9f, + 0x46, 0x63, 0x65, 0xdb, 0x72, 0x4d, 0xd7, 0x23, 0x56, 0xcb, 0x57, 0xd8, 0xc7, 0xa9, 0xc1, 0xd2, + 0x0a, 0xc1, 0xe2, 0x93, 0x0f, 0x81, 0xfa, 0x20, 0xca, 0x8b, 0x5f, 0x44, 0xa3, 0x20, 0x72, 0xf0, + 0x43, 0x16, 0xd2, 0xee, 0xac, 0x52, 0x60, 0xd4, 0x09, 0x39, 0x24, 0xc5, 0x77, 0x50, 0xbe, 0xbc, + 0x6e, 0xb6, 0x0d, 0x87, 0x58, 0x3c, 0xaf, 0xdb, 0x53, 0xc9, 0x41, 0x72, 0x66, 0xe0, 0x5f, 0xa0, + 0x65, 0xcd, 0x69, 0xf1, 0x62, 0xd2, 0xa3, 0x17, 0x0e, 0x9b, 0xfe, 0xf3, 0x69, 0x84, 0xc2, 0x02, + 0xf8, 0x49, 0x94, 0xf6, 0x5f, 0x56, 0x32, 0x37, 0x10, 0x49, 0x83, 0xd2, 0x30, 0x15, 0xf3, 0xb1, + 0x9d, 0xde, 0x75, 0x6c, 0xdf, 0x41, 0x39, 0x76, 0xa2, 0x04, 0x9e, 0xda, 0x42, 0x24, 0x88, 0xbe, + 0x0d, 0x9e, 0x01, 0x7a, 0xb6, 0x59, 0x04, 0xcb, 0x4e, 0xf2, 0x7a, 0x66, 0xcc, 0xa6, 0x5b, 0x68, + 0x18, 0xfe, 0xc2, 0x97, 0x50, 0x16, 0xa4, 0x98, 0x82, 0x7d, 0x22, 0xbc, 0x4f, 0x8c, 0xc8, 0x0f, + 0xf0, 0xb4, 0x9b, 0xca, 0xb6, 0xe5, 0xd1, 0xaa, 0xa1, 0xd5, 0xe3, 0x5c, 0x2e, 0x1c, 0x26, 0xc9, + 0x85, 0xc3, 0xd4, 0x7f, 0x9a, 0x4e, 0x08, 0x08, 0xf4, 0xe8, 0x0e, 0x93, 0x97, 0x11, 0x82, 0x17, + 0xb4, 0x54, 0x9e, 0xfe, 0x83, 0x4a, 0x18, 0x25, 0xc0, 0x08, 0xd4, 0x56, 0x32, 0xeb, 0x43, 0x62, + 0xf5, 0x57, 0x52, 0xb1, 0x28, 0x32, 0xc7, 0x36, 0xcd, 0xa8, 0xf4, 0x2d, 0xc7, 0x3c, 0x65, 0xea, + 0x37, 0xd3, 0x49, 0x31, 0x75, 0x8e, 0xa7, 0x8a, 0x87, 0xb9, 0xdb, 0xb2, 0xfb, 0xc8, 0xdd, 0xf6, + 0x2e, 0x9a, 0x8a, 0x44, 0x9a, 0xe1, 0x49, 0x72, 0x2e, 0x0d, 0x0e, 0x59, 0xd3, 0xff, 0xed, 0xb5, + 0x44, 0xa6, 0xfe, 0xdf, 0xd4, 0xe0, 0x38, 0x43, 0x47, 0xae, 0x3a, 0x09, 0x02, 0xc8, 0xfc, 0xe1, + 0x08, 0xe0, 0x21, 0x6c, 0x33, 0x8f, 0xb7, 0x00, 0x3e, 0x24, 0x93, 0xc7, 0xb7, 0x5b, 0x00, 0x3f, + 0x96, 0xda, 0x35, 0x4c, 0xd4, 0x51, 0xcb, 0x40, 0xfd, 0x0f, 0xa9, 0xc4, 0x70, 0x4e, 0x87, 0x6a, + 0xd7, 0xab, 0x28, 0xc7, 0xdc, 0x56, 0x78, 0xab, 0x84, 0x00, 0xd8, 0x14, 0xda, 0x2f, 0x77, 0x3c, + 0xc3, 0xe2, 0x05, 0x34, 0xc2, 0xda, 0x60, 0xf0, 0xde, 0xf8, 0xd8, 0x80, 0x98, 0x52, 0x46, 0xbf, + 0xc9, 0x91, 0xa3, 0xd5, 0x5f, 0x4e, 0xc5, 0xa2, 0x4b, 0x1d, 0xe1, 0xb7, 0x1d, 0x2c, 0x27, 0xf5, + 0x6f, 0xa5, 0x93, 0x83, 0x5b, 0x1d, 0xe1, 0x87, 0x3c, 0x8c, 0xe3, 0xaa, 0x83, 0xad, 0x5b, 0x2b, + 0x68, 0x52, 0x96, 0x05, 0x5f, 0xb6, 0x2e, 0x26, 0x87, 0xf8, 0xea, 0xd3, 0x8a, 0x08, 0x0f, 0xf5, + 0x83, 0x54, 0x3c, 0x2e, 0xd7, 0x91, 0xcf, 0x4f, 0x07, 0xd3, 0x16, 0xf9, 0x53, 0x3e, 0x24, 0x6b, + 0xcd, 0xc3, 0xf8, 0x94, 0x0f, 0xc9, 0xaa, 0x71, 0xb0, 0x4f, 0xf9, 0x89, 0x74, 0xbf, 0xb0, 0x66, + 0x47, 0xfe, 0x41, 0x9f, 0x13, 0x85, 0xcc, 0x5a, 0xc6, 0x3f, 0xed, 0xc9, 0x7e, 0x71, 0xc4, 0xfa, + 0xf0, 0x8c, 0xf1, 0x39, 0xd8, 0x18, 0x4f, 0x14, 0xd6, 0x87, 0x44, 0x91, 0x8f, 0x87, 0xb0, 0x3e, + 0x24, 0x43, 0xe5, 0xc3, 0x27, 0xac, 0xbf, 0x97, 0xde, 0x6b, 0x2c, 0xbd, 0x13, 0xe1, 0xc5, 0x84, + 0xf7, 0xd5, 0x74, 0x3c, 0xc6, 0xe3, 0x91, 0x8b, 0x69, 0x0e, 0xe5, 0x78, 0xb4, 0xc9, 0xbe, 0xc2, + 0x61, 0xf8, 0x7e, 0x16, 0x0d, 0xff, 0x8e, 0x30, 0x45, 0x6f, 0x76, 0xef, 0x29, 0x7a, 0xd5, 0x6f, + 0xa5, 0x22, 0x01, 0x11, 0x8f, 0xe4, 0x08, 0xe1, 0x40, 0x4b, 0x12, 0x7e, 0xcd, 0x3f, 0xcc, 0xcc, + 0x46, 0x72, 0xcd, 0x05, 0xdf, 0x53, 0x21, 0x9e, 0x6e, 0xb6, 0xa3, 0xe5, 0xf9, 0x9b, 0xfb, 0x5f, + 0x4a, 0xa3, 0x53, 0x31, 0x52, 0x7c, 0x49, 0x8a, 0xcb, 0x02, 0xc7, 0x92, 0x11, 0xe7, 0x6c, 0x16, + 0xa1, 0x65, 0x1f, 0x27, 0xa9, 0x97, 0x50, 0xb6, 0xa2, 0x6f, 0xb1, 0x6f, 0x1b, 0x66, 0x2c, 0x0d, + 0x7d, 0x4b, 0x3c, 0x71, 0x03, 0x3c, 0x5e, 0x45, 0x8f, 0xb1, 0xfb, 0x10, 0xd3, 0xb6, 0x56, 0xcc, + 0x0e, 0xa9, 0x59, 0x8b, 0x66, 0xbb, 0x6d, 0xba, 0xfc, 0xd2, 0xec, 0xea, 0xce, 0x76, 0xf1, 0xb2, + 0x67, 0x7b, 0x7a, 0xbb, 0x49, 0x7c, 0xb2, 0xa6, 0x67, 0x76, 0x48, 0xd3, 0xb4, 0x9a, 0x1d, 0xa0, + 0x14, 0x58, 0x26, 0xb3, 0xc2, 0x35, 0x96, 0x0c, 0xaf, 0xd1, 0xd2, 0x2d, 0x8b, 0x18, 0x35, 0x6b, + 0x76, 0xcb, 0x23, 0xec, 0xb2, 0x2d, 0xc3, 0x8e, 0x04, 0xd9, 0xdb, 0x6b, 0x86, 0xa6, 0x8c, 0x57, + 0x29, 0x81, 0x96, 0x50, 0x48, 0xfd, 0xc5, 0x6c, 0x42, 0x2c, 0xcc, 0x63, 0xa4, 0x3e, 0x7e, 0x4f, + 0x67, 0x77, 0xe9, 0xe9, 0x6b, 0x68, 0xe4, 0x6d, 0xe2, 0xc0, 0xf9, 0x16, 0xbb, 0x60, 0x00, 0x67, + 0xf1, 0xfb, 0x0c, 0x24, 0xde, 0xd0, 0x70, 0x2a, 0xdc, 0x46, 0xd3, 0x2b, 0xb4, 0x9b, 0x92, 0x3b, + 0x33, 0x77, 0x80, 0xce, 0x1c, 0xc0, 0x0f, 0xbf, 0x83, 0xce, 0x01, 0x36, 0xa1, 0x5b, 0x47, 0xa0, + 0x2a, 0x88, 0x26, 0xc6, 0xaa, 0x4a, 0xee, 0xdc, 0x7e, 0xe5, 0xf1, 0xe7, 0xd0, 0x78, 0x30, 0x40, + 0x4c, 0xe2, 0xf2, 0x9b, 0x8b, 0x01, 0xe3, 0x8c, 0xc5, 0xdb, 0xa2, 0x60, 0x70, 0xd1, 0x92, 0x63, + 0x36, 0x49, 0xbc, 0xd4, 0x7f, 0x97, 0x1a, 0x14, 0x93, 0xf3, 0xc8, 0x67, 0xe5, 0xd7, 0xd0, 0x88, + 0xc1, 0x3e, 0x8a, 0xeb, 0xd4, 0xe0, 0xa8, 0x9d, 0x8c, 0x54, 0xf3, 0xcb, 0xa8, 0xff, 0x3e, 0x35, + 0x30, 0x14, 0xe8, 0x71, 0xff, 0xbc, 0xaf, 0x66, 0xfa, 0x7c, 0x1e, 0x9f, 0x44, 0xaf, 0xa0, 0x82, + 0x69, 0x79, 0x64, 0x8d, 0x65, 0xf9, 0x69, 0x86, 0x01, 0x8f, 0xb4, 0x29, 0x01, 0x0e, 0xa3, 0xeb, + 0x26, 0x3a, 0xeb, 0x3b, 0x16, 0x3a, 0xbe, 0x07, 0x96, 0xdb, 0xec, 0x39, 0x26, 0x1b, 0x97, 0xda, + 0x19, 0x37, 0xe2, 0x9e, 0xe5, 0xde, 0x71, 0x4c, 0x5a, 0x81, 0xee, 0xad, 0x13, 0x4b, 0x6f, 0x6e, + 0xda, 0xce, 0x06, 0x04, 0x75, 0x64, 0x83, 0x53, 0x9b, 0x62, 0xf0, 0xbb, 0x3e, 0x18, 0x3f, 0x8d, + 0x26, 0xd6, 0xda, 0x3d, 0x12, 0x84, 0xd1, 0x63, 0x77, 0x7d, 0xda, 0x38, 0x05, 0x06, 0x37, 0x24, + 0x17, 0x10, 0x02, 0x22, 0x0f, 0x02, 0xb5, 0xc2, 0xc5, 0x9e, 0x36, 0x4a, 0x21, 0x2b, 0xbc, 0xbb, + 0xa6, 0x99, 0x56, 0x33, 0x21, 0x35, 0xdb, 0xb6, 0xb5, 0xd6, 0xf4, 0x88, 0xd3, 0x81, 0x86, 0x82, + 0x73, 0xa2, 0x76, 0x16, 0x28, 0xe0, 0xea, 0xc4, 0x5d, 0xb0, 0xad, 0xb5, 0x15, 0xe2, 0x74, 0x68, + 0x53, 0xaf, 0x22, 0xcc, 0x9b, 0xea, 0xc0, 0xa1, 0x07, 0xfb, 0x38, 0xf0, 0x53, 0xd4, 0xf8, 0x47, + 0xb0, 0xd3, 0x10, 0xf8, 0xb0, 0x22, 0x1a, 0x63, 0xb1, 0xc4, 0x98, 0xd0, 0xc0, 0x55, 0x51, 0x43, + 0x0c, 0x04, 0xf2, 0x3a, 0x8b, 0xb8, 0xf7, 0x02, 0xf3, 0x9a, 0xd6, 0xf8, 0xaf, 0x67, 0x9f, 0x41, + 0x63, 0x50, 0x77, 0x09, 0x12, 0xc4, 0xe1, 0x71, 0x94, 0x5f, 0x9e, 0x6d, 0x54, 0xb5, 0xb7, 0xab, + 0x95, 0xc2, 0x10, 0x46, 0x28, 0x57, 0xa9, 0x2e, 0xd5, 0xaa, 0x95, 0x42, 0xea, 0xd9, 0xff, 0x95, + 0x42, 0xa8, 0x31, 0xb7, 0x52, 0xe7, 0x84, 0x63, 0x68, 0xa4, 0xb6, 0xf4, 0x76, 0x69, 0xa1, 0x46, + 0xe9, 0xf2, 0x28, 0xbb, 0x5c, 0xaf, 0x2e, 0x15, 0x52, 0x78, 0x14, 0x0d, 0x97, 0x17, 0x96, 0x1b, + 0xd5, 0x42, 0x9a, 0x02, 0xb5, 0x6a, 0xa9, 0x52, 0xc8, 0x50, 0xe0, 0x5d, 0xad, 0xb6, 0x52, 0x2d, + 0x64, 0xe9, 0x9f, 0x0b, 0x8d, 0x95, 0xd2, 0x4a, 0x61, 0x98, 0xfe, 0x39, 0x07, 0x7f, 0xe6, 0x28, + 0xb3, 0x46, 0x75, 0x05, 0x7e, 0x8c, 0xd0, 0x26, 0xcc, 0xf9, 0xbf, 0xf2, 0x14, 0x45, 0x59, 0x57, + 0x6a, 0x5a, 0x61, 0x94, 0xfe, 0xa0, 0x2c, 0xe9, 0x0f, 0x44, 0x1b, 0xa7, 0x55, 0x17, 0x97, 0xdf, + 0xae, 0x16, 0xc6, 0x28, 0xaf, 0xc5, 0xdb, 0x14, 0x3c, 0x4e, 0xff, 0xd4, 0x16, 0xe9, 0x9f, 0x13, + 0x94, 0x93, 0x56, 0x2d, 0x2d, 0xd4, 0x4b, 0x2b, 0xf3, 0x85, 0x49, 0xda, 0x1e, 0xe0, 0x39, 0xc5, + 0x4a, 0x2e, 0x95, 0x16, 0xab, 0x85, 0x02, 0xa7, 0xa9, 0x2c, 0xd4, 0x96, 0x6e, 0x17, 0x4e, 0x41, + 0x43, 0xde, 0x59, 0x84, 0x1f, 0x98, 0x16, 0x80, 0xbf, 0x4e, 0x3f, 0xfb, 0x1d, 0x28, 0xb7, 0xdc, + 0x80, 0x5b, 0xc5, 0x73, 0xe8, 0xf4, 0x72, 0xa3, 0xb9, 0xf2, 0x4e, 0xbd, 0xda, 0xbc, 0xb3, 0xd4, + 0xa8, 0x57, 0xcb, 0xb5, 0xb9, 0x1a, 0x88, 0xea, 0x14, 0x9a, 0xf0, 0x11, 0x0b, 0xb5, 0xa5, 0x3b, + 0x9f, 0x2d, 0xa4, 0x44, 0xd0, 0x62, 0xa9, 0xbc, 0xdc, 0x28, 0xa4, 0xf1, 0x69, 0x34, 0xe5, 0x83, + 0xee, 0xd6, 0x96, 0x2a, 0xcb, 0x77, 0x1b, 0x85, 0xcc, 0xb3, 0xf7, 0xfd, 0xa0, 0xf4, 0xcb, 0x8e, + 0xb9, 0x66, 0x5a, 0xf8, 0x02, 0x7a, 0xbc, 0x52, 0x7d, 0xbb, 0x56, 0xae, 0x36, 0x97, 0xb5, 0xda, + 0xad, 0xda, 0x52, 0xa4, 0xa6, 0xc7, 0xd0, 0x29, 0x19, 0x5d, 0xaa, 0xd7, 0x0a, 0x29, 0x7c, 0x16, + 0x61, 0x19, 0xfc, 0x66, 0x69, 0x71, 0xae, 0x90, 0xc6, 0x0a, 0x3a, 0x23, 0xc3, 0x6b, 0x4b, 0x2b, + 0x77, 0x96, 0xaa, 0x85, 0xcc, 0xb3, 0x7f, 0x2d, 0x85, 0x1e, 0x4b, 0x7c, 0x5c, 0x82, 0x55, 0x74, + 0xb1, 0xba, 0x50, 0x6a, 0xac, 0xd4, 0xca, 0x8d, 0x6a, 0x49, 0x2b, 0xcf, 0x37, 0xcb, 0xa5, 0x95, + 0xea, 0xad, 0x65, 0xed, 0x9d, 0xe6, 0xad, 0xea, 0x52, 0x55, 0x2b, 0x2d, 0x14, 0x86, 0xf0, 0xd3, + 0xa8, 0xd8, 0x87, 0xa6, 0x51, 0x2d, 0xdf, 0xd1, 0x6a, 0x2b, 0xef, 0x14, 0x52, 0xf8, 0x29, 0x74, + 0xa1, 0x2f, 0x11, 0xfd, 0x5d, 0x48, 0xe3, 0x8b, 0x68, 0xba, 0x1f, 0xc9, 0x5b, 0x0b, 0x85, 0xcc, + 0xb3, 0x7f, 0x21, 0x85, 0x70, 0xfc, 0x75, 0x00, 0x7e, 0x12, 0x9d, 0xa7, 0x7a, 0xd1, 0xec, 0xdf, + 0xc0, 0xa7, 0xd0, 0x85, 0x44, 0x0a, 0xa1, 0x79, 0x45, 0xf4, 0x44, 0x1f, 0x12, 0xde, 0xb8, 0xf3, + 0x48, 0x49, 0x26, 0xa0, 0x4d, 0x9b, 0xad, 0x7c, 0xf0, 0x1f, 0x2f, 0x0e, 0x7d, 0xf0, 0xdb, 0x17, + 0x53, 0xbf, 0xfe, 0xdb, 0x17, 0x53, 0xbf, 0xf5, 0xdb, 0x17, 0x53, 0x9f, 0xbb, 0xbe, 0x9f, 0xc7, + 0x13, 0x6c, 0x52, 0x58, 0xcd, 0x81, 0x9b, 0xf0, 0x8d, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x33, + 0xea, 0x96, 0xb6, 0x1f, 0x21, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -16960,7 +17146,7 @@ func (m *RoleDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *TrustedClusterCreate) Marshal() (dAtA []byte, err error) { +func (m *BotCreate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -16970,12 +17156,12 @@ func (m *TrustedClusterCreate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TrustedClusterCreate) MarshalTo(dAtA []byte) (int, error) { +func (m *BotCreate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TrustedClusterCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *BotCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -17017,7 +17203,7 @@ func (m *TrustedClusterCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *TrustedClusterDelete) Marshal() (dAtA []byte, err error) { +func (m *BotUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -17027,12 +17213,12 @@ func (m *TrustedClusterDelete) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TrustedClusterDelete) MarshalTo(dAtA []byte) (int, error) { +func (m *BotUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TrustedClusterDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *BotUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -17074,7 +17260,7 @@ func (m *TrustedClusterDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ProvisionTokenCreate) Marshal() (dAtA []byte, err error) { +func (m *BotDelete) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -17084,12 +17270,12 @@ func (m *ProvisionTokenCreate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ProvisionTokenCreate) MarshalTo(dAtA []byte) (int, error) { +func (m *BotDelete) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ProvisionTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *BotDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -17098,21 +17284,119 @@ func (m *ProvisionTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.JoinMethod) > 0 { - i -= len(m.JoinMethod) - copy(dAtA[i:], m.JoinMethod) - i = encodeVarintEvents(dAtA, i, uint64(len(m.JoinMethod))) - i-- - dAtA[i] = 0x2a + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Roles[iNdEx]) - copy(dAtA[i:], m.Roles[iNdEx]) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Roles[iNdEx]))) - i-- - dAtA[i] = 0x22 + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *TrustedClusterCreate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TrustedClusterCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TrustedClusterCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *TrustedClusterDelete) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TrustedClusterDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TrustedClusterDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } { size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) @@ -17147,7 +17431,7 @@ func (m *ProvisionTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *TrustedClusterTokenCreate) Marshal() (dAtA []byte, err error) { +func (m *ProvisionTokenCreate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -17157,12 +17441,12 @@ func (m *TrustedClusterTokenCreate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TrustedClusterTokenCreate) MarshalTo(dAtA []byte) (int, error) { +func (m *ProvisionTokenCreate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TrustedClusterTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ProvisionTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -17171,6 +17455,22 @@ func (m *TrustedClusterTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.JoinMethod) > 0 { + i -= len(m.JoinMethod) + copy(dAtA[i:], m.JoinMethod) + i = encodeVarintEvents(dAtA, i, uint64(len(m.JoinMethod))) + i-- + dAtA[i] = 0x2a + } + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Roles[iNdEx]) + copy(dAtA[i:], m.Roles[iNdEx]) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Roles[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } { size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -17204,7 +17504,7 @@ func (m *TrustedClusterTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *GithubConnectorCreate) Marshal() (dAtA []byte, err error) { +func (m *TrustedClusterTokenCreate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -17214,12 +17514,12 @@ func (m *GithubConnectorCreate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GithubConnectorCreate) MarshalTo(dAtA []byte) (int, error) { +func (m *TrustedClusterTokenCreate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GithubConnectorCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TrustedClusterTokenCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -17261,7 +17561,7 @@ func (m *GithubConnectorCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GithubConnectorUpdate) Marshal() (dAtA []byte, err error) { +func (m *GithubConnectorCreate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -17271,12 +17571,12 @@ func (m *GithubConnectorUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GithubConnectorUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *GithubConnectorCreate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GithubConnectorUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GithubConnectorCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -17318,7 +17618,7 @@ func (m *GithubConnectorUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GithubConnectorDelete) Marshal() (dAtA []byte, err error) { +func (m *GithubConnectorUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -17328,12 +17628,12 @@ func (m *GithubConnectorDelete) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GithubConnectorDelete) MarshalTo(dAtA []byte) (int, error) { +func (m *GithubConnectorUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GithubConnectorDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GithubConnectorUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -17375,7 +17675,7 @@ func (m *GithubConnectorDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *OIDCConnectorCreate) Marshal() (dAtA []byte, err error) { +func (m *GithubConnectorDelete) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -17385,12 +17685,69 @@ func (m *OIDCConnectorCreate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *OIDCConnectorCreate) MarshalTo(dAtA []byte) (int, error) { +func (m *GithubConnectorDelete) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *OIDCConnectorCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GithubConnectorDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *OIDCConnectorCreate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OIDCConnectorCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OIDCConnectorCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -20231,20 +20588,20 @@ func (m *WindowsDesktopSessionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error i-- dAtA[i] = 0x5a } - n331, err331 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) - if err331 != nil { - return 0, err331 + n340, err340 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) + if err340 != nil { + return 0, err340 } - i -= n331 - i = encodeVarintEvents(dAtA, i, uint64(n331)) + i -= n340 + i = encodeVarintEvents(dAtA, i, uint64(n340)) i-- dAtA[i] = 0x52 - n332, err332 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err332 != nil { - return 0, err332 + n341, err341 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err341 != nil { + return 0, err341 } - i -= n332 - i = encodeVarintEvents(dAtA, i, uint64(n332)) + i -= n341 + i = encodeVarintEvents(dAtA, i, uint64(n341)) i-- dAtA[i] = 0x4a if len(m.DesktopLabels) > 0 { @@ -20534,12 +20891,12 @@ func (m *InstanceJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n343, err343 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.TokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.TokenExpires):]) - if err343 != nil { - return 0, err343 + n352, err352 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.TokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.TokenExpires):]) + if err352 != nil { + return 0, err352 } - i -= n343 - i = encodeVarintEvents(dAtA, i, uint64(n343)) + i -= n352 + i = encodeVarintEvents(dAtA, i, uint64(n352)) i-- dAtA[i] = 0x4a if m.Attributes != nil { @@ -24119,6 +24476,75 @@ func (m *OneOf_ExternalAuditStorageDisable) MarshalToSizedBuffer(dAtA []byte) (i } return len(dAtA) - i, nil } +func (m *OneOf_BotCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_BotCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.BotCreate != nil { + { + size, err := m.BotCreate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x8 + i-- + dAtA[i] = 0xfa + } + return len(dAtA) - i, nil +} +func (m *OneOf_BotDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_BotDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.BotDelete != nil { + { + size, err := m.BotDelete.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x9 + i-- + dAtA[i] = 0x82 + } + return len(dAtA) - i, nil +} +func (m *OneOf_BotUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_BotUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.BotUpdate != nil { + { + size, err := m.BotUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x9 + i-- + dAtA[i] = 0x8a + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -24143,12 +24569,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n497, err497 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err497 != nil { - return 0, err497 + n509, err509 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err509 != nil { + return 0, err509 } - i -= n497 - i = encodeVarintEvents(dAtA, i, uint64(n497)) + i -= n509 + i = encodeVarintEvents(dAtA, i, uint64(n509)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -24275,12 +24701,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n500, err500 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err500 != nil { - return 0, err500 + n512, err512 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err512 != nil { + return 0, err512 } - i -= n500 - i = encodeVarintEvents(dAtA, i, uint64(n500)) + i -= n512 + i = encodeVarintEvents(dAtA, i, uint64(n512)) i-- dAtA[i] = 0x1 i-- @@ -24428,12 +24854,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n504, err504 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err504 != nil { - return 0, err504 + n516, err516 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err516 != nil { + return 0, err516 } - i -= n504 - i = encodeVarintEvents(dAtA, i, uint64(n504)) + i -= n516 + i = encodeVarintEvents(dAtA, i, uint64(n516)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -30625,6 +31051,60 @@ func (m *RoleDelete) Size() (n int) { return n } +func (m *BotCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BotUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BotDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *TrustedClusterCreate) Size() (n int) { if m == nil { return 0 @@ -33715,6 +34195,42 @@ func (m *OneOf_ExternalAuditStorageDisable) Size() (n int) { } return n } +func (m *OneOf_BotCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BotCreate != nil { + l = m.BotCreate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_BotDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BotDelete != nil { + l = m.BotDelete.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_BotUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BotUpdate != nil { + l = m.BotUpdate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -45900,14 +46416,560 @@ func (m *AccessRequestCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RequestedResourceIDs = append(m.RequestedResourceIDs, ResourceID{}) - if err := m.RequestedResourceIDs[len(m.RequestedResourceIDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.RequestedResourceIDs = append(m.RequestedResourceIDs, ResourceID{}) + if err := m.RequestedResourceIDs[len(m.RequestedResourceIDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxDuration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.MaxDuration, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PromotedAccessListName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PromotedAccessListName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AssumeStartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AssumeStartTime == nil { + m.AssumeStartTime = new(time.Time) + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.AssumeStartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceID) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SubResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SubResourceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessRequestDelete) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessRequestDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessRequestDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RequestID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PortForward) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PortForward: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PortForward: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 13: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxDuration", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -45934,15 +46996,15 @@ func (m *AccessRequestCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.MaxDuration, dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 15: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PromotedAccessListName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -45952,29 +47014,30 @@ func (m *AccessRequestCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.PromotedAccessListName = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 16: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AssumeStartTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -45984,27 +47047,23 @@ func (m *AccessRequestCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.AssumeStartTime == nil { - m.AssumeStartTime = new(time.Time) - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.AssumeStartTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Addr = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -46028,7 +47087,7 @@ func (m *AccessRequestCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResourceID) Unmarshal(dAtA []byte) error { +func (m *X11Forward) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -46051,17 +47110,17 @@ func (m *ResourceID) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResourceID: wiretype end group for non-group") + return fmt.Errorf("proto: X11Forward: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceID: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: X11Forward: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46071,29 +47130,30 @@ func (m *ResourceID) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterName = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46103,29 +47163,30 @@ func (m *ResourceID) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46135,29 +47196,30 @@ func (m *ResourceID) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46167,23 +47229,24 @@ func (m *ResourceID) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.SubResourceName = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -46207,7 +47270,7 @@ func (m *ResourceID) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessRequestDelete) Unmarshal(dAtA []byte) error { +func (m *CommandMetadata) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -46230,17 +47293,17 @@ func (m *AccessRequestDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessRequestDelete: wiretype end group for non-group") + return fmt.Errorf("proto: CommandMetadata: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessRequestDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CommandMetadata: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46250,30 +47313,29 @@ func (m *AccessRequestDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Command = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ExitCode", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46283,28 +47345,27 @@ func (m *AccessRequestDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ExitCode = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RequestID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -46332,7 +47393,7 @@ func (m *AccessRequestDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RequestID = string(dAtA[iNdEx:postIndex]) + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -46356,7 +47417,7 @@ func (m *AccessRequestDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *PortForward) Unmarshal(dAtA []byte) error { +func (m *Exec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -46379,10 +47440,10 @@ func (m *PortForward) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PortForward: wiretype end group for non-group") + return fmt.Errorf("proto: Exec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PortForward: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Exec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -46447,13 +47508,112 @@ func (m *PortForward) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CommandMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -46480,13 +47640,13 @@ func (m *PortForward) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CommandMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesClusterMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -46513,15 +47673,15 @@ func (m *PortForward) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.KubernetesClusterMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesPodMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46531,23 +47691,24 @@ func (m *PortForward) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Addr = string(dAtA[iNdEx:postIndex]) + if err := m.KubernetesPodMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -46571,7 +47732,7 @@ func (m *PortForward) Unmarshal(dAtA []byte) error { } return nil } -func (m *X11Forward) Unmarshal(dAtA []byte) error { +func (m *SCP) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -46594,10 +47755,10 @@ func (m *X11Forward) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: X11Forward: wiretype end group for non-group") + return fmt.Errorf("proto: SCP: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: X11Forward: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SCP: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -46701,7 +47862,7 @@ func (m *X11Forward) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -46728,66 +47889,48 @@ func (m *X11Forward) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + if msglen < 0 { + return ErrInvalidLengthEvents } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CommandMetadata) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents } - if iNdEx >= l { + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: CommandMetadata: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommandMetadata: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CommandMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -46797,27 +47940,28 @@ func (m *CommandMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Command = string(dAtA[iNdEx:postIndex]) + if err := m.CommandMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExitCode", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -46845,11 +47989,11 @@ func (m *CommandMetadata) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExitCode = string(dAtA[iNdEx:postIndex]) + m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -46877,7 +48021,7 @@ func (m *CommandMetadata) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + m.Action = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -46901,7 +48045,7 @@ func (m *CommandMetadata) Unmarshal(dAtA []byte) error { } return nil } -func (m *Exec) Unmarshal(dAtA []byte) error { +func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -46924,15 +48068,15 @@ func (m *Exec) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Exec: wiretype end group for non-group") + return fmt.Errorf("proto: SFTPAttributes: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Exec: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SFTPAttributes: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FileSize", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -46959,13 +48103,16 @@ func (m *Exec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.FileSize == nil { + m.FileSize = new(uint64) + } + if err := github_com_gogo_protobuf_types.StdUInt64Unmarshal(m.FileSize, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -46992,13 +48139,16 @@ func (m *Exec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.UID == nil { + m.UID = new(uint32) + } + if err := github_com_gogo_protobuf_types.StdUInt32Unmarshal(m.UID, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GID", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47025,13 +48175,16 @@ func (m *Exec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.GID == nil { + m.GID = new(uint32) + } + if err := github_com_gogo_protobuf_types.StdUInt32Unmarshal(m.GID, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47058,13 +48211,16 @@ func (m *Exec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Permissions == nil { + m.Permissions = new(uint32) + } + if err := github_com_gogo_protobuf_types.StdUInt32Unmarshal(m.Permissions, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AccessTime", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47091,46 +48247,16 @@ func (m *Exec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CommandMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF + if m.AccessTime == nil { + m.AccessTime = new(time.Time) } - if err := m.CommandMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.AccessTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 7: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesClusterMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ModificationTime", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47157,40 +48283,10 @@ func (m *Exec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.KubernetesClusterMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesPodMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF + if m.ModificationTime == nil { + m.ModificationTime = new(time.Time) } - if err := m.KubernetesPodMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.ModificationTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -47216,7 +48312,7 @@ func (m *Exec) Unmarshal(dAtA []byte) error { } return nil } -func (m *SCP) Unmarshal(dAtA []byte) error { +func (m *SFTP) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -47239,10 +48335,10 @@ func (m *SCP) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SCP: wiretype end group for non-group") + return fmt.Errorf("proto: SFTP: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SCP: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SFTP: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -47412,9 +48508,9 @@ func (m *SCP) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CommandMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkingDirectory", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -47424,24 +48520,23 @@ func (m *SCP) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.CommandMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.WorkingDirectory = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 7: if wireType != 2 { @@ -47477,8 +48572,114 @@ func (m *SCP) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 8: if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Flags", wireType) + } + m.Flags = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Flags |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Attributes == nil { + m.Attributes = &SFTPAttributes{} + } + if err := m.Attributes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) } + m.Action = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Action |= SFTPAction(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { @@ -47505,7 +48706,7 @@ func (m *SCP) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Action = string(dAtA[iNdEx:postIndex]) + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -47529,7 +48730,7 @@ func (m *SCP) Unmarshal(dAtA []byte) error { } return nil } -func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { +func (m *Subsystem) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -47552,15 +48753,15 @@ func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SFTPAttributes: wiretype end group for non-group") + return fmt.Errorf("proto: Subsystem: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SFTPAttributes: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Subsystem: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FileSize", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47587,16 +48788,13 @@ func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.FileSize == nil { - m.FileSize = new(uint64) - } - if err := github_com_gogo_protobuf_types.StdUInt64Unmarshal(m.FileSize, dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47623,16 +48821,13 @@ func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.UID == nil { - m.UID = new(uint32) - } - if err := github_com_gogo_protobuf_types.StdUInt32Unmarshal(m.UID, dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47659,18 +48854,15 @@ func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.GID == nil { - m.GID = new(uint32) - } - if err := github_com_gogo_protobuf_types.StdUInt32Unmarshal(m.GID, dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -47680,69 +48872,29 @@ func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Permissions == nil { - m.Permissions = new(uint32) - } - if err := github_com_gogo_protobuf_types.StdUInt32Unmarshal(m.Permissions, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.AccessTime == nil { - m.AccessTime = new(time.Time) - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.AccessTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ModificationTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -47752,27 +48904,23 @@ func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ModificationTime == nil { - m.ModificationTime = new(time.Time) - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.ModificationTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -47796,7 +48944,7 @@ func (m *SFTPAttributes) Unmarshal(dAtA []byte) error { } return nil } -func (m *SFTP) Unmarshal(dAtA []byte) error { +func (m *ClientDisconnect) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -47819,10 +48967,10 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SFTP: wiretype end group for non-group") + return fmt.Errorf("proto: ClientDisconnect: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SFTP: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ClientDisconnect: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -47854,46 +49002,13 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47920,13 +49035,13 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -47953,11 +49068,11 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) } @@ -47990,9 +49105,9 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkingDirectory", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -48020,13 +49135,64 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.WorkingDirectory = string(dAtA[iNdEx:postIndex]) + m.Reason = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthAttempt) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthAttempt: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthAttempt: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -48036,29 +49202,30 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Path = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 8: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TargetPath", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -48068,46 +49235,28 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.TargetPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Flags", wireType) - } - m.Flags = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Flags |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - case 10: + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -48134,37 +49283,15 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Attributes == nil { - m.Attributes = &SFTPAttributes{} - } - if err := m.Attributes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) - } - m.Action = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Action |= SFTPAction(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 12: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -48174,23 +49301,24 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -48214,7 +49342,7 @@ func (m *SFTP) Unmarshal(dAtA []byte) error { } return nil } -func (m *Subsystem) Unmarshal(dAtA []byte) error { +func (m *UserTokenCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -48237,10 +49365,10 @@ func (m *Subsystem) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Subsystem: wiretype end group for non-group") + return fmt.Errorf("proto: UserTokenCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Subsystem: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTokenCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -48278,7 +49406,7 @@ func (m *Subsystem) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -48305,13 +49433,13 @@ func (m *Subsystem) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -48338,74 +49466,10 @@ func (m *Subsystem) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Error = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -48428,7 +49492,7 @@ func (m *Subsystem) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClientDisconnect) Unmarshal(dAtA []byte) error { +func (m *RoleCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -48451,10 +49515,10 @@ func (m *ClientDisconnect) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ClientDisconnect: wiretype end group for non-group") + return fmt.Errorf("proto: RoleCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ClientDisconnect: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RoleCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -48486,11 +49550,44 @@ func (m *ClientDisconnect) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } @@ -48523,104 +49620,6 @@ func (m *ClientDisconnect) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Reason = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -48643,7 +49642,7 @@ func (m *ClientDisconnect) Unmarshal(dAtA []byte) error { } return nil } -func (m *AuthAttempt) Unmarshal(dAtA []byte) error { +func (m *RoleUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -48666,10 +49665,10 @@ func (m *AuthAttempt) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AuthAttempt: wiretype end group for non-group") + return fmt.Errorf("proto: RoleUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AuthAttempt: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RoleUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -48707,7 +49706,7 @@ func (m *AuthAttempt) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -48734,46 +49733,13 @@ func (m *AuthAttempt) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -48800,7 +49766,7 @@ func (m *AuthAttempt) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -48826,7 +49792,7 @@ func (m *AuthAttempt) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTokenCreate) Unmarshal(dAtA []byte) error { +func (m *RoleDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -48849,10 +49815,10 @@ func (m *UserTokenCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTokenCreate: wiretype end group for non-group") + return fmt.Errorf("proto: RoleDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTokenCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RoleDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -48976,7 +49942,7 @@ func (m *UserTokenCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *RoleCreate) Unmarshal(dAtA []byte) error { +func (m *BotCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -48999,10 +49965,10 @@ func (m *RoleCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RoleCreate: wiretype end group for non-group") + return fmt.Errorf("proto: BotCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RoleCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BotCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -49126,7 +50092,7 @@ func (m *RoleCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *RoleUpdate) Unmarshal(dAtA []byte) error { +func (m *BotUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -49149,10 +50115,10 @@ func (m *RoleUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RoleUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: BotUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RoleUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BotUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -49276,7 +50242,7 @@ func (m *RoleUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *RoleDelete) Unmarshal(dAtA []byte) error { +func (m *BotDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -49299,10 +50265,10 @@ func (m *RoleDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RoleDelete: wiretype end group for non-group") + return fmt.Errorf("proto: BotDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RoleDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BotDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -66037,6 +67003,111 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { } m.Event = &OneOf_ExternalAuditStorageDisable{v} iNdEx = postIndex + case 143: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BotCreate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &BotCreate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_BotCreate{v} + iNdEx = postIndex + case 144: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BotDelete", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &BotDelete{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_BotDelete{v} + iNdEx = postIndex + case 145: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BotUpdate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &BotUpdate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_BotUpdate{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index c88c7417d2c39..3ee143f9f4736 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -515,6 +515,18 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_InstanceJoin{ InstanceJoin: e, } + case *BotCreate: + out.Event = &OneOf_BotCreate{ + BotCreate: e, + } + case *BotUpdate: + out.Event = &OneOf_BotUpdate{ + BotUpdate: e, + } + case *BotDelete: + out.Event = &OneOf_BotDelete{ + BotDelete: e, + } case *LoginRuleCreate: out.Event = &OneOf_LoginRuleCreate{ LoginRuleCreate: e, diff --git a/api/types/user.go b/api/types/user.go index 8a27369e21532..bf5bd931682c9 100644 --- a/api/types/user.go +++ b/api/types/user.go @@ -506,7 +506,7 @@ func (u UserV2) GetUserType() UserType { // IsBot returns true if the user is a bot. func (u UserV2) IsBot() bool { - _, ok := u.GetMetadata().Labels[BotGenerationLabel] + _, ok := u.GetMetadata().Labels[BotLabel] return ok } diff --git a/api/types/userloginstate/user_login_state.go b/api/types/userloginstate/user_login_state.go index e7079afbeb34c..97c4b51b08674 100644 --- a/api/types/userloginstate/user_login_state.go +++ b/api/types/userloginstate/user_login_state.go @@ -132,11 +132,6 @@ func (u *UserLoginState) IsBot() bool { return ok } -// BotGenerationLabel returns the bot generation label. -func (u *UserLoginState) BotGenerationLabel() string { - return u.GetMetadata().Labels[types.BotGenerationLabel] -} - // GetMetadata returns metadata. This is specifically for conforming to the Resource interface, // and should be removed when possible. func (u *UserLoginState) GetMetadata() types.Metadata { diff --git a/lib/auth/access_request_test.go b/lib/auth/access_request_test.go index ad64a753719a1..5597d6a1a19ab 100644 --- a/lib/auth/access_request_test.go +++ b/lib/auth/access_request_test.go @@ -36,6 +36,8 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/defaults" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/header" @@ -615,22 +617,28 @@ func testBotAccessRequestReview(t *testing.T, testPack *accessRequestTestPack) { adminClient, err := testPack.tlsServer.NewClient(TestAdmin()) require.NoError(t, err) defer adminClient.Close() - bot, err := adminClient.CreateBot(ctx, &proto.CreateBotRequest{ - Name: "request-approver", - Roles: []string{ - // Grants the ability to approve requests - "admins", + bot, err := adminClient.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "request-approver", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{ + // Grants the ability to approve requests + "admins", + }, + }, }, }) require.NoError(t, err) // Use the bot user to generate some certs using role impersonation. // This mimics what the bot actually does. - botClient, err := testPack.tlsServer.NewClient(TestUser(bot.UserName)) + botClient, err := testPack.tlsServer.NewClient(TestUser(bot.Status.UserName)) require.NoError(t, err) defer botClient.Close() certRes, err := botClient.GenerateUserCerts(ctx, proto.UserCertsRequest{ - Username: bot.UserName, + Username: bot.Status.UserName, PublicKey: testPack.pubKey, Expires: time.Now().Add(time.Hour), @@ -662,7 +670,7 @@ func testBotAccessRequestReview(t *testing.T, testPack *accessRequestTestPack) { require.NoError(t, err) // Check the final state of the request - require.Equal(t, bot.UserName, accessRequest.GetReviews()[0].Author) + require.Equal(t, bot.Status.UserName, accessRequest.GetReviews()[0].Author) require.Equal(t, types.RequestState_APPROVED, accessRequest.GetState()) } diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index c7c7df80efd39..e2a7e160f56a6 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -3109,58 +3109,6 @@ func (a *ServerWithRoles) verifyUserDeviceForCertIssuance(usage proto.UserCertsR return trace.Wrap(dtauthz.VerifyTLSUser(dt, identity)) } -// CreateBot creates a new certificate renewal bot and returns a join token. -func (a *ServerWithRoles) CreateBot(ctx context.Context, req *proto.CreateBotRequest) (*proto.CreateBotResponse, error) { - // Note: this creates a role with role impersonation privileges for all - // roles listed in the request and doesn't attempt to verify that the - // current user has permissions for those embedded roles. We assume that - // "create role" is effectively root already and validate only that. - if err := a.action(apidefaults.Namespace, types.KindUser, types.VerbRead, types.VerbCreate); err != nil { - return nil, trace.Wrap(err) - } - if err := a.action(apidefaults.Namespace, types.KindRole, types.VerbRead, types.VerbCreate); err != nil { - return nil, trace.Wrap(err) - } - if err := a.action(apidefaults.Namespace, types.KindToken, types.VerbRead, types.VerbCreate); err != nil { - return nil, trace.Wrap(err) - } - - if err := authz.AuthorizeAdminAction(ctx, &a.context); err != nil { - return nil, trace.Wrap(err) - } - - return a.authServer.CreateBot(ctx, req) -} - -// DeleteBot removes a certificate renewal bot by name. -func (a *ServerWithRoles) DeleteBot(ctx context.Context, botName string) error { - // Requires read + delete on users and roles. We do verify the user and - // role are explicitly associated with a bot before doing anything (must - // match bot-$name and have a matching teleport.dev/bot label set). - if err := a.action(apidefaults.Namespace, types.KindUser, types.VerbRead, types.VerbDelete); err != nil { - return trace.Wrap(err) - } - if err := a.action(apidefaults.Namespace, types.KindRole, types.VerbRead, types.VerbDelete); err != nil { - return trace.Wrap(err) - } - - if err := authz.AuthorizeAdminAction(ctx, &a.context); err != nil { - return trace.Wrap(err) - } - - return a.authServer.DeleteBot(ctx, botName) -} - -// GetBotUsers fetches all users with bot labels. It does not fetch users with -// secrets. -func (a *ServerWithRoles) GetBotUsers(ctx context.Context) ([]types.User, error) { - if err := a.action(apidefaults.Namespace, types.KindUser, types.VerbList, types.VerbRead); err != nil { - return nil, trace.Wrap(err) - } - - return a.authServer.getBotUsers(ctx) -} - func (a *ServerWithRoles) CreateResetPasswordToken(ctx context.Context, req CreateUserTokenRequest) (types.UserToken, error) { if err := a.action(apidefaults.Namespace, types.KindUser, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) diff --git a/lib/auth/auth_with_roles_okta_rbac_test.go b/lib/auth/auth_with_roles_okta_rbac_test.go index db5f181050f14..d5eb7a3f8d883 100644 --- a/lib/auth/auth_with_roles_okta_rbac_test.go +++ b/lib/auth/auth_with_roles_okta_rbac_test.go @@ -27,7 +27,6 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/authz" ) @@ -389,28 +388,6 @@ func TestOktaMayNotResetPasswords(t *testing.T) { }) } -func TestOktaMayNotCreateBotUser(t *testing.T) { - ctx := context.Background() - - // Given an auth server... - srv, err := NewTestAuthServer(TestAuthServerConfig{Dir: t.TempDir()}) - require.NoError(t, err) - t.Cleanup(func() { srv.Close() }) - - // And an RBAC-checking `ServerWithRoles` facade configured with the - // built-in Okta Role... - authWithOktaRole := newTestServerWithRoles(t, srv, types.RoleOkta) - - // When I attempt to create a Bot user - _, err = authWithOktaRole.CreateBot(ctx, &proto.CreateBotRequest{ - Name: t.Name(), - Roles: []string{string(types.RoleDiscovery)}, - }) - - // The attempt should fail with access denied - requireAccessDenied(t, err) -} - func newTestLock(t *testing.T, target types.User, origin string) types.Lock { lockSpec := types.LockSpecV2{ Target: types.LockTarget{ diff --git a/lib/auth/bot.go b/lib/auth/bot.go index 37ddea0d69f61..934c1887ea6aa 100644 --- a/lib/auth/bot.go +++ b/lib/auth/bot.go @@ -21,9 +21,7 @@ package auth import ( "context" "fmt" - "slices" "strconv" - "strings" "time" "github.com/google/uuid" @@ -32,320 +30,13 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" - "github.com/gravitational/teleport/api/types/wrappers" apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/services" - usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport" - "github.com/gravitational/teleport/lib/utils" ) -// BotResourceName returns the default name for resources associated with the -// given named bot. -func BotResourceName(botName string) string { - return "bot-" + strings.ReplaceAll(botName, " ", "-") -} - -// createBotRole creates a role from a bot template with the given parameters. -func createBotRole(ctx context.Context, s *Server, botName string, resourceName string, roleRequests []string) (types.Role, error) { - role, err := types.NewRole(resourceName, types.RoleSpecV6{ - Options: types.RoleOptions{ - // TODO: inherit TTLs from cert length? - MaxSessionTTL: types.Duration(12 * time.Hour), - }, - Allow: types.RoleConditions{ - Rules: []types.Rule{ - // Bots read certificate authorities to watch for CA rotations - types.NewRule(types.KindCertAuthority, []string{types.VerbReadNoSecrets}), - }, - Impersonate: &types.ImpersonateConditions{ - Roles: roleRequests, - }, - }, - }) - if err != nil { - return nil, trace.Wrap(err) - } - - meta := role.GetMetadata() - meta.Description = fmt.Sprintf("Automatically generated role for bot %s", botName) - if meta.Labels == nil { - meta.Labels = map[string]string{} - } - meta.Labels[types.BotLabel] = botName - role.SetMetadata(meta) - - role, err = s.CreateRole(ctx, role) - if err != nil { - return nil, trace.Wrap(err) - } - - return role, nil -} - -// createBotUser creates a new backing User for bot use. A role with a -// matching name must already exist (see createBotRole). -func createBotUser( - ctx context.Context, - s *Server, - botName string, - resourceName string, - traits wrappers.Traits, -) (types.User, error) { - user, err := types.NewUser(resourceName) - if err != nil { - return nil, trace.Wrap(err) - } - - user.SetRoles([]string{resourceName}) - - metadata := user.GetMetadata() - metadata.Labels = map[string]string{ - types.BotLabel: botName, - types.BotGenerationLabel: "0", - } - user.SetMetadata(metadata) - user.SetTraits(traits) - - user, err = s.CreateUser(ctx, user) - if err != nil { - return nil, trace.Wrap(err) - } - - return user, nil -} - -// CreateBot creates a new certificate renewal bot from a bot request. -func (a *Server) CreateBot(ctx context.Context, req *proto.CreateBotRequest) (*proto.CreateBotResponse, error) { - if req.Name == "" { - return nil, trace.BadParameter("bot name must not be empty") - } - - resourceName := BotResourceName(req.Name) - - // Ensure conflicting resources don't already exist. - // We skip the cache here to allow for bot recreation shortly after bot - // deletion. - _, err := a.Services.GetRole(ctx, resourceName) - if err != nil && !trace.IsNotFound(err) { - return nil, trace.Wrap(err) - } - if roleExists := (err == nil); roleExists { - return nil, trace.AlreadyExists("cannot add bot: role %q already exists", resourceName) - } - _, err = a.Services.GetUser(ctx, resourceName, false) - if err != nil && !trace.IsNotFound(err) { - return nil, trace.Wrap(err) - } - if userExists := (err == nil); userExists { - return nil, trace.AlreadyExists("cannot add bot: user %q already exists", resourceName) - } - - // Ensure at least one role was requested. - if len(req.Roles) == 0 { - return nil, trace.BadParameter("cannot add bot: at least one role is required") - } - - // Ensure all requested roles exist. - for _, roleName := range req.Roles { - _, err := a.GetRole(ctx, roleName) - if err != nil { - return nil, trace.Wrap(err) - } - } - - provisionToken, err := a.checkOrCreateBotToken(ctx, req) - if err != nil { - return nil, trace.Wrap(err) - } - - // Create the resources. - if _, err := createBotRole(ctx, a, req.Name, resourceName, req.Roles); err != nil { - return nil, trace.Wrap(err) - } - - if _, err := createBotUser(ctx, a, req.Name, resourceName, req.Traits); err != nil { - return nil, trace.Wrap(err) - } - - tokenTTL := time.Duration(0) - if exp := provisionToken.Expiry(); !exp.IsZero() { - tokenTTL = time.Until(exp) - } - - // Emit usage analytics event for bot creation. - a.AnonymizeAndSubmit(&usagereporter.BotCreateEvent{ - UserName: authz.ClientUsername(ctx), - BotUserName: resourceName, - RoleName: resourceName, - BotName: req.Name, - RoleCount: int64(len(req.Roles)), - JoinMethod: string(provisionToken.GetJoinMethod()), - }) - - return &proto.CreateBotResponse{ - TokenID: provisionToken.GetName(), - UserName: resourceName, - RoleName: resourceName, - TokenTTL: proto.Duration(tokenTTL), - JoinMethod: provisionToken.GetJoinMethod(), - }, nil -} - -// deleteBotUser removes an existing bot user, ensuring that it has bot labels -// matching the bot before deleting anything. -func (a *Server) deleteBotUser(ctx context.Context, botName, resourceName string) error { - user, err := a.GetUser(ctx, resourceName, false) - if err != nil { - return trace.Wrap(err, "could not fetch expected bot user %s", resourceName) - } - - label, ok := user.GetMetadata().Labels[types.BotLabel] - if !ok { - err = trace.Errorf("will not delete user %s that is missing label %s; delete the user manually if desired", resourceName, types.BotLabel) - } else if label != botName { - err = trace.Errorf("will not delete user %s with mismatched label %s = %s", resourceName, types.BotLabel, label) - } else { - err = a.DeleteUser(ctx, resourceName) - } - - return err -} - -// deleteBotRole removes an existing bot role, ensuring that it has bot labels -// matching the bot before deleting anything. -func (a *Server) deleteBotRole(ctx context.Context, botName, resourceName string) error { - role, err := a.GetRole(ctx, resourceName) - if err != nil { - return trace.Wrap(err, "could not fetch expected bot role %s", resourceName) - } - - label, ok := role.GetMetadata().Labels[types.BotLabel] - if !ok { - err = trace.Errorf("will not delete role %s that is missing label %s; delete the role manually if desired", resourceName, types.BotLabel) - } else if label != botName { - err = trace.Errorf("will not delete role %s with mismatched label %s = %s", resourceName, types.BotLabel, label) - } else { - err = a.DeleteRole(ctx, resourceName) - } - - return err -} - -func (a *Server) DeleteBot(ctx context.Context, botName string) error { - // Note: this does not remove any locks for the bot's user / role. That - // might be convenient in case of accidental bot locking but there doesn't - // seem to be any automatic deletion of locks in teleport today (other - // than expiration). Consistency around security controls seems important - // but we can revisit this if desired. - resourceName := BotResourceName(botName) - - userErr := a.deleteBotUser(ctx, botName, resourceName) - roleErr := a.deleteBotRole(ctx, botName, resourceName) - return trace.NewAggregate(userErr, roleErr) -} - -// getBotUsers fetches all Users with the BotLabel field set. Users are fetched -// without secrets. -func (a *Server) getBotUsers(ctx context.Context) ([]types.User, error) { - var botUsers []types.User - - users, err := a.GetUsers(ctx, false) - if err != nil { - return nil, trace.Wrap(err) - } - - for _, user := range users { - if _, ok := user.GetMetadata().Labels[types.BotLabel]; ok { - botUsers = append(botUsers, user) - } - } - - return botUsers, nil -} - -// supportedBotJoinMethods should match SupportedJoinMethods declared in -// lib/tbot/config -var supportedBotJoinMethods = []types.JoinMethod{ - types.JoinMethodAzure, - types.JoinMethodCircleCI, - types.JoinMethodGCP, - types.JoinMethodGitHub, - types.JoinMethodGitLab, - types.JoinMethodIAM, - types.JoinMethodKubernetes, - types.JoinMethodSpacelift, - types.JoinMethodToken, -} - -// checkOrCreateBotToken checks the existing token if given, or creates a new -// random dynamic provision token which allows bots to join with the given -// botName. Returns the token and any error. -func (a *Server) checkOrCreateBotToken(ctx context.Context, req *proto.CreateBotRequest) (types.ProvisionToken, error) { - botName := req.Name - - // if the request includes a TokenID it should already exist - if req.TokenID != "" { - provisionToken, err := a.GetToken(ctx, req.TokenID) - if err != nil { - if trace.IsNotFound(err) { - return nil, trace.NotFound("token with name %q not found, create the token or do not set TokenName: %v", - req.TokenID, err) - } - return nil, trace.Wrap(err) - } - if !provisionToken.GetRoles().Include(types.RoleBot) { - return nil, trace.BadParameter("token %q is not valid for role %q", - req.TokenID, types.RoleBot) - } - if provisionToken.GetBotName() != botName { - return nil, trace.BadParameter("token %q is valid for bot with name %q, not %q", - req.TokenID, provisionToken.GetBotName(), botName) - } - - if !slices.Contains(supportedBotJoinMethods, provisionToken.GetJoinMethod()) { - return nil, trace.BadParameter( - "token %q has join method %q which is not supported for bots. Supported join methods are %v", - req.TokenID, - provisionToken.GetJoinMethod(), - supportedBotJoinMethods, - ) - } - return provisionToken, nil - } - - // create a new random dynamic token - tokenName, err := utils.CryptoRandomHex(TokenLenBytes) - if err != nil { - return nil, trace.Wrap(err) - } - - ttl := time.Duration(req.TTL) - if ttl == 0 { - ttl = defaults.DefaultBotJoinTTL - } - - tokenSpec := types.ProvisionTokenSpecV2{ - Roles: types.SystemRoles{types.RoleBot}, - JoinMethod: types.JoinMethodToken, - BotName: botName, - } - token, err := types.NewProvisionTokenFromSpec(tokenName, a.clock.Now().Add(ttl), tokenSpec) - if err != nil { - return nil, trace.Wrap(err) - } - - if err := a.UpsertToken(ctx, token); err != nil { - return nil, trace.Wrap(err) - } - - // TODO: audit log event - - return token, nil -} - // validateGenerationLabel validates and updates a generation label. func (a *Server) validateGenerationLabel(ctx context.Context, username string, certReq *certRequest, currentIdentityGeneration uint64) error { // Fetch the user, bypassing the cache. We might otherwise fetch a stale diff --git a/lib/auth/bot_test.go b/lib/auth/bot_test.go index 9305c2964f83b..92cd8e459775c 100644 --- a/lib/auth/bot_test.go +++ b/lib/auth/bot_test.go @@ -38,9 +38,10 @@ import ( "golang.org/x/crypto/ssh" "github.com/gravitational/teleport/api/client/proto" - "github.com/gravitational/teleport/api/constants" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/api/types/wrappers" + "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/cloud/azure" "github.com/gravitational/teleport/lib/fixtures" @@ -48,132 +49,6 @@ import ( "github.com/gravitational/teleport/lib/utils" ) -// TestServerCreateBot ensures that the create bot RPC creates the appropriate -// role and users. -// -// TODO: We should add more cases to this to properly exercise the token -// creation elements of createBot. -func TestServerCreateBot(t *testing.T) { - t.Parallel() - srv := newTestTLSServer(t) - ctx := context.Background() - testRole := "test-role" - _, err := CreateRole(ctx, srv.Auth(), testRole, types.RoleSpecV6{}) - require.NoError(t, err) - - tests := []struct { - name string - request *proto.CreateBotRequest - - checkErr func(*testing.T, error) - - checkUser func(*testing.T, types.User) - checkRole func(*testing.T, types.Role) - }{ - { - name: "no roles", - request: &proto.CreateBotRequest{ - Name: "no-roles", - }, - checkErr: func(t *testing.T, err error) { - require.ErrorContains(t, err, "at least one role is required") - require.True(t, trace.IsBadParameter(err)) - }, - }, - { - name: "success", - request: &proto.CreateBotRequest{ - Name: "success", - Roles: []string{testRole}, - Traits: wrappers.Traits{ - constants.TraitLogins: []string{ - "a-principal", - }, - }, - }, - checkUser: func(t *testing.T, got types.User) { - require.Equal(t, []string{"bot-success"}, got.GetRoles()) - require.Equal(t, map[string]string{ - types.BotLabel: "success", - types.BotGenerationLabel: "0", - }, got.GetMetadata().Labels) - // Ensure bot user receives requested traits - require.Equal( - t, - []string{"a-principal"}, - got.GetTraits()[constants.TraitLogins], - ) - }, - checkRole: func(t *testing.T, got types.Role) { - require.Equal( - t, "success", got.GetMetadata().Labels[types.BotLabel], - ) - require.Equal( - t, - []string{testRole}, - got.GetImpersonateConditions(types.Allow).Roles, - ) - require.Equal( - t, - types.Duration(12*time.Hour), - got.GetOptions().MaxSessionTTL, - ) - // Ensure bot will be able to read the cert authorities - require.Equal( - t, - []types.Rule{ - types.NewRule( - types.KindCertAuthority, - []string{types.VerbReadNoSecrets}, - ), - }, - got.GetRules(types.Allow), - ) - }, - }, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - ctx := context.Background() - res, err := srv.Auth().CreateBot(ctx, tt.request) - if tt.checkErr != nil { - tt.checkErr(t, err) - return - } - require.NoError(t, err) - - // Ensure createBot produces the expected role and user. - resourceName := BotResourceName(tt.request.Name) - usr, err := srv.Auth().Services.GetUser(ctx, resourceName, false) - require.NoError(t, err) - tt.checkUser(t, usr) - role, err := srv.Auth().Services.GetRole(ctx, resourceName) - require.NoError(t, err) - tt.checkRole(t, role) - - // Ensure response includes the correct details - require.Equal(t, resourceName, res.UserName) - require.Equal(t, resourceName, res.RoleName) - require.Equal(t, types.JoinMethodToken, res.JoinMethod) - - // Check generated token exists - token, err := srv.Auth().Services.GetToken(ctx, res.TokenID) - require.NoError(t, err) - require.Equal(t, tt.request.Name, token.GetBotName()) - require.Equal(t, types.JoinMethodToken, token.GetJoinMethod()) - require.Equal(t, types.SystemRoles{types.RoleBot}, token.GetRoles()) - }) - } -} - -func TestBotResourceName(t *testing.T) { - require.Equal(t, "bot-name", BotResourceName("name")) - require.Equal(t, "bot-name-with-spaces", BotResourceName("name with spaces")) -} - func renewBotCerts( ctx context.Context, srv *TestTLSServer, @@ -213,12 +88,27 @@ func TestRegisterBotCertificateGenerationCheck(t *testing.T) { require.NoError(t, err) // Create a new bot. - bot, err := srv.Auth().CreateBot(ctx, &proto.CreateBotRequest{ - Name: "test", - Roles: []string{"example"}, + client, err := srv.NewClient(TestAdmin()) + require.NoError(t, err) + bot, err := client.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "test", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{"example"}, + }, + }, }) require.NoError(t, err) + token, err := types.NewProvisionTokenFromSpec("testxyzzy", time.Time{}, types.ProvisionTokenSpecV2{ + Roles: types.SystemRoles{types.RoleBot}, + BotName: bot.Metadata.Name, + }) + require.NoError(t, err) + require.NoError(t, client.CreateToken(ctx, token)) + privateKey, publicKey, err := testauthority.New().GenerateKeyPair() require.NoError(t, err) sshPrivateKey, err := ssh.ParseRawPrivateKey(privateKey) @@ -227,7 +117,7 @@ func TestRegisterBotCertificateGenerationCheck(t *testing.T) { require.NoError(t, err) certs, err := Register(RegisterParams{ - Token: bot.TokenID, + Token: token.GetName(), ID: IdentityID{ Role: types.RoleBot, }, @@ -243,7 +133,7 @@ func TestRegisterBotCertificateGenerationCheck(t *testing.T) { // Renew the cert a bunch of times. for i := 0; i < 10; i++ { - _, certs, tlsCert, err = renewBotCerts(ctx, srv, tlsCert, bot.UserName, publicKey, privateKey) + _, certs, tlsCert, err = renewBotCerts(ctx, srv, tlsCert, bot.Status.UserName, publicKey, privateKey) require.NoError(t, err) // Parse the Identity @@ -271,12 +161,27 @@ func TestRegisterBotCertificateGenerationStolen(t *testing.T) { require.NoError(t, err) // Create a new bot. - bot, err := srv.Auth().CreateBot(ctx, &proto.CreateBotRequest{ - Name: "test", - Roles: []string{"example"}, + client, err := srv.NewClient(TestAdmin()) + require.NoError(t, err) + bot, err := client.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "test", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{"example"}, + }, + }, }) require.NoError(t, err) + token, err := types.NewProvisionTokenFromSpec("testxyzzy", time.Time{}, types.ProvisionTokenSpecV2{ + Roles: types.SystemRoles{types.RoleBot}, + BotName: bot.Metadata.Name, + }) + require.NoError(t, err) + require.NoError(t, client.CreateToken(ctx, token)) + privateKey, publicKey, err := testauthority.New().GenerateKeyPair() require.NoError(t, err) sshPrivateKey, err := ssh.ParseRawPrivateKey(privateKey) @@ -285,7 +190,7 @@ func TestRegisterBotCertificateGenerationStolen(t *testing.T) { require.NoError(t, err) certs, err := Register(RegisterParams{ - Token: bot.TokenID, + Token: token.GetName(), ID: IdentityID{ Role: types.RoleBot, }, @@ -299,7 +204,7 @@ func TestRegisterBotCertificateGenerationStolen(t *testing.T) { require.NoError(t, err) // Renew the certs once (e.g. this is the actual bot process) - _, certsReal, _, err := renewBotCerts(ctx, srv, tlsCert, bot.UserName, publicKey, privateKey) + _, certsReal, _, err := renewBotCerts(ctx, srv, tlsCert, bot.Status.UserName, publicKey, privateKey) require.NoError(t, err) // Check the generation, it should be 2. @@ -310,7 +215,7 @@ func TestRegisterBotCertificateGenerationStolen(t *testing.T) { require.Equal(t, uint64(2), impersonatedIdent.Generation) // Meanwhile, the initial set of certs was stolen. Let's try to renew those. - _, _, _, err = renewBotCerts(ctx, srv, tlsCert, bot.UserName, publicKey, privateKey) + _, _, _, err = renewBotCerts(ctx, srv, tlsCert, bot.Status.UserName, publicKey, privateKey) require.Error(t, err) require.True(t, trace.IsAccessDenied(err)) @@ -344,10 +249,14 @@ func TestRegisterBot_RemoteAddr(t *testing.T) { require.NoError(t, err) botName := "botty" - _, err = a.CreateBot(ctx, &proto.CreateBotRequest{ - Name: botName, - Roles: []string{roleName}, - }) + _, err = machineidv1.UpsertBot(ctx, a, &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: botName, + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{roleName}, + }, + }, a.clock.Now(), "") require.NoError(t, err) remoteAddr := "42.42.42.42:42" diff --git a/lib/auth/clt.go b/lib/auth/clt.go index da67f6852716d..adfa7b6fc5a9c 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -35,6 +35,7 @@ import ( assistpb "github.com/gravitational/teleport/api/gen/proto/go/assist/v1" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" pluginspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" resourceusagepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/resourceusage/v1" samlidppb "github.com/gravitational/teleport/api/gen/proto/go/teleport/samlidp/v1" @@ -921,6 +922,12 @@ type ClientI interface { // (as per the default gRPC behavior). SecReportsClient() *secreport.Client + // BotServiceClient returns a client for security reports. + // Clients connecting to older Teleport versions, still get a bot service client + // when calling this method, but all RPCs will return "not implemented" errors + // (as per the default gRPC behavior). + BotServiceClient() machineidv1pb.BotServiceClient + // UserLoginStateClient returns a user login state client. // Clients connecting to older Teleport versions still get a user login state client // when calling this method, but all RPCs will return "not implemented" errors diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 3da38ffc1337e..66859478cb4d0 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -52,6 +52,7 @@ import ( discoveryconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" oktapb "github.com/gravitational/teleport/api/gen/proto/go/teleport/okta/v1" trustpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/trust/v1" userloginstatev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/userloginstate/v1" @@ -68,6 +69,7 @@ import ( "github.com/gravitational/teleport/lib/auth/discoveryconfig/discoveryconfigv1" integrationService "github.com/gravitational/teleport/lib/auth/integration/integrationv1" "github.com/gravitational/teleport/lib/auth/loginrule" + "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" "github.com/gravitational/teleport/lib/auth/okta" "github.com/gravitational/teleport/lib/auth/trust/trustv1" "github.com/gravitational/teleport/lib/auth/userloginstate" @@ -132,6 +134,10 @@ type GRPCServer struct { // TODO(tross) DELETE IN 16.0.0 usersService *usersv1.Service + // botService is used to forward requests to deprecated bot RPCs to the + // new service. + botService *machineidv1.BotService + // TraceServiceServer exposes the exporter server so that the auth server may // collect and forward spans collectortracepb.TraceServiceServer @@ -1083,45 +1089,26 @@ func (g *GRPCServer) GetResetPasswordToken(ctx context.Context, req *authpb.GetR } // CreateBot creates a new bot and an optional join token. +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: use [machineidv1.BotService.CreateBot] instead. func (g *GRPCServer) CreateBot(ctx context.Context, req *authpb.CreateBotRequest) (*authpb.CreateBotResponse, error) { - auth, err := g.authenticate(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - - response, err := auth.ServerWithRoles.CreateBot(ctx, req) - if err != nil { - return nil, trace.Wrap(err) - } - - log.Infof("%q bot created", req.GetName()) - - return response, nil + return g.botService.CreateBotLegacy(ctx, req) } // DeleteBot removes a bot and its associated resources. +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: use [machineidv1.BotService.DeleteBot] instead. func (g *GRPCServer) DeleteBot(ctx context.Context, req *authpb.DeleteBotRequest) (*emptypb.Empty, error) { - auth, err := g.authenticate(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - - if err := auth.ServerWithRoles.DeleteBot(ctx, req.Name); err != nil { - return nil, trace.Wrap(err) - } - - log.Infof("%q bot deleted", req.Name) - - return &emptypb.Empty{}, nil + return g.botService.DeleteBot(ctx, &machineidv1pb.DeleteBotRequest{ + BotName: req.Name, + }) } // GetBotUsers lists all users with a bot label +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: use [machineidv1.BotService.ListBots] instead. func (g *GRPCServer) GetBotUsers(_ *authpb.GetBotUsersRequest, stream authpb.AuthService_GetBotUsersServer) error { - auth, err := g.authenticate(stream.Context()) - if err != nil { - return trace.Wrap(err) - } - users, err := auth.ServerWithRoles.GetBotUsers(stream.Context()) + users, err := g.botService.GetBotUsersLegacy(stream.Context()) if err != nil { return trace.Wrap(err) } @@ -5676,6 +5663,19 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { return nil, trace.Wrap(err) } + botService, err := machineidv1.NewBotService(machineidv1.BotServiceConfig{ + Authorizer: cfg.Authorizer, + Cache: cfg.AuthServer.Cache, + Backend: cfg.AuthServer.Services, + Reporter: cfg.AuthServer.Services.UsageReporter, + Emitter: cfg.Emitter, + Clock: cfg.AuthServer.GetClock(), + }) + if err != nil { + return nil, trace.Wrap(err, "creating bot service") + } + machineidv1pb.RegisterBotServiceServer(server, botService) + authServer := &GRPCServer{ APIConfig: cfg.APIConfig, Entry: logrus.WithFields(logrus.Fields{ @@ -5683,6 +5683,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { }), server: server, usersService: usersService, + botService: botService, } authpb.RegisterAuthServiceServer(server, authServer) diff --git a/lib/auth/init.go b/lib/auth/init.go index 8ae6f5dd015c8..7ac41fc8649fd 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -40,6 +40,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client/proto" apidefaults "github.com/gravitational/teleport/api/defaults" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" apiutils "github.com/gravitational/teleport/api/utils" @@ -49,6 +50,7 @@ import ( "github.com/gravitational/teleport/lib/ai" "github.com/gravitational/teleport/lib/ai/embedding" "github.com/gravitational/teleport/lib/auth/keystore" + "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" "github.com/gravitational/teleport/lib/auth/migration" "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/backend" @@ -1377,6 +1379,10 @@ var ResourceApplyPriority = map[string]int{ types.KindToken: 3, types.KindClusterNetworkingConfig: 3, types.KindClusterAuthPreference: 3, + // Bots should be applied after users and roles as at the moment they are actually converted to users and roles. + // This will ensure that Bot Users/Roles are properly created regardless of the Teleport version from which the + // resources have been exported. + types.KindBot: 3, } // Unlike when resources are loaded via --bootstrap, we're inserting elements via their service. @@ -1390,7 +1396,13 @@ func applyResources(ctx context.Context, service *Services, resources []types.Re return priorityA - priorityB }) for _, resource := range resources { - switch r := resource.(type) { + // Unwrap "new style" resources. + // We always want to switch over the underlying type. + var res any = resource + if w, ok := res.(interface{ Unwrap() types.Resource153 }); ok { + res = w.Unwrap() + } + switch r := res.(type) { case types.ProvisionToken: err = service.Provisioner.UpsertToken(ctx, r) case types.User: @@ -1405,6 +1417,8 @@ func applyResources(ctx context.Context, service *Services, resources []types.Re err = service.ClusterConfiguration.SetClusterNetworkingConfig(ctx, r) case types.AuthPreference: err = service.ClusterConfiguration.SetAuthPreference(ctx, r) + case *machineidv1pb.Bot: + _, err = machineidv1.UpsertBot(ctx, service, r, time.Now(), "system") default: return trace.NotImplemented("cannot apply resource of type %T", resource) } diff --git a/lib/auth/join.go b/lib/auth/join.go index caaad2ab726f2..9557213ad8041 100644 --- a/lib/auth/join.go +++ b/lib/auth/join.go @@ -33,6 +33,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" @@ -214,7 +215,7 @@ func (a *Server) generateCertsBot( joinMethod := provisionToken.GetJoinMethod() // Check this is a join method for bots we support. - if !slices.Contains(supportedBotJoinMethods, joinMethod) { + if !slices.Contains(machineidv1.SupportedJoinMethods, joinMethod) { return nil, trace.BadParameter( "unsupported join method %q for bot", joinMethod, ) @@ -238,7 +239,7 @@ func (a *Server) generateCertsBot( } certs, err := a.generateInitialBotCerts( - ctx, BotResourceName(botName), req.RemoteAddr, req.PublicSSHKey, expires, renewable, + ctx, machineidv1.BotResourceName(botName), req.RemoteAddr, req.PublicSSHKey, expires, renewable, ) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/auth/join_test.go b/lib/auth/join_test.go index 8dfe97c26adeb..ca19dca8def60 100644 --- a/lib/auth/join_test.go +++ b/lib/auth/join_test.go @@ -29,10 +29,12 @@ import ( "golang.org/x/crypto/ssh" "github.com/gravitational/teleport/api/client/proto" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" - "github.com/gravitational/teleport/api/types/wrappers" "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" @@ -301,21 +303,23 @@ func TestRegister_Bot(t *testing.T) { srv := newTestTLSServer(t) - botName := "test" - botResourceName := BotResourceName(botName) - - _, err := createBotRole(ctx, srv.Auth(), botName, botResourceName, []string{}) - require.NoError(t, err) - _, err = createBotUser(ctx, srv.Auth(), botName, botResourceName, wrappers.Traits{}) + bot, err := machineidv1.UpsertBot(ctx, srv.Auth(), &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "test", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{}, + }, + }, srv.Clock().Now(), "") require.NoError(t, err) later := srv.Clock().Now().Add(4 * time.Hour) - goodToken := newBotToken(t, "good-token", botName, types.RoleBot, later) - expiredToken := newBotToken(t, "expired", botName, types.RoleBot, srv.Clock().Now().Add(-1*time.Hour)) + goodToken := newBotToken(t, "good-token", bot.Metadata.Name, types.RoleBot, later) + expiredToken := newBotToken(t, "expired", bot.Metadata.Name, types.RoleBot, srv.Clock().Now().Add(-1*time.Hour)) wrongKind := newBotToken(t, "wrong-kind", "", types.RoleNode, later) wrongUser := newBotToken(t, "wrong-user", "llama", types.RoleBot, later) - invalidToken := newBotToken(t, "this-token-does-not-exist", botName, types.RoleBot, later) + invalidToken := newBotToken(t, "this-token-does-not-exist", bot.Metadata.Name, types.RoleBot, later) err = srv.Auth().UpsertToken(ctx, goodToken) require.NoError(t, err) @@ -456,14 +460,15 @@ func TestRegister_Bot_Expiry(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { botName := t.Name() - botResourceName := BotResourceName(botName) - _, err := createBotRole( - ctx, srv.Auth(), botName, botResourceName, []string{}, - ) - require.NoError(t, err) - _, err = createBotUser( - ctx, srv.Auth(), botName, botResourceName, wrappers.Traits{}, - ) + _, err = machineidv1.UpsertBot(ctx, srv.Auth(), &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: botName, + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{}, + Traits: []*machineidv1pb.Trait{}, + }, + }, srv.Clock().Now(), "") require.NoError(t, err) tok := newBotToken(t, t.Name(), botName, types.RoleBot, srv.Clock().Now().Add(time.Hour)) require.NoError(t, srv.Auth().UpsertToken(ctx, tok)) diff --git a/lib/auth/machineid/machineidv1/bot_service.go b/lib/auth/machineid/machineidv1/bot_service.go new file mode 100644 index 0000000000000..9e6a4f1b6088e --- /dev/null +++ b/lib/auth/machineid/machineidv1/bot_service.go @@ -0,0 +1,733 @@ +/* + * Teleport + * Copyright (C) 2023 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 machineidv1 + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/sirupsen/logrus" + "google.golang.org/protobuf/types/known/emptypb" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/events" + usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport" +) + +// SupportedJoinMethods should match SupportedJoinMethods declared in +// lib/tbot/config +var SupportedJoinMethods = []types.JoinMethod{ + types.JoinMethodAzure, + types.JoinMethodCircleCI, + types.JoinMethodGCP, + types.JoinMethodGitHub, + types.JoinMethodGitLab, + types.JoinMethodIAM, + types.JoinMethodKubernetes, + types.JoinMethodSpacelift, + types.JoinMethodToken, +} + +// BotResourceName returns the default name for resources associated with the +// given named bot. +func BotResourceName(botName string) string { + return "bot-" + strings.ReplaceAll(botName, " ", "-") +} + +// Cache is the subset of the cached resources that the Service queries. +type Cache interface { + // GetUser returns a user by name. + GetUser(ctx context.Context, user string, withSecrets bool) (types.User, error) + // ListUsers lists users + ListUsers(ctx context.Context, pageSize int, pageToken string, withSecrets bool) ([]types.User, string, error) + // GetRole returns a role by name. + GetRole(ctx context.Context, name string) (types.Role, error) +} + +// Backend is the subset of the backend resources that the Service modifies. +type Backend interface { + // CreateUser creates user, only if the user entry does not exist + CreateUser(ctx context.Context, user types.User) (types.User, error) + // CreateRole creates role, only if the role entry does not exist + CreateRole(ctx context.Context, role types.Role) (types.Role, error) + // UpdateUser updates an existing user if revisions match. + UpdateUser(ctx context.Context, user types.User) (types.User, error) + // UpdateRole updates an existing role if revisions match. + UpdateRole(ctx context.Context, role types.Role) (types.Role, error) + // UpsertUser creates a new user or forcefully updates an existing user. + UpsertUser(ctx context.Context, user types.User) (types.User, error) + // UpsertRole creates a new role or forcefully updates an existing role. + UpsertRole(ctx context.Context, role types.Role) (types.Role, error) + // UpsertToken creates a new token or forcefully updates an existing token. + UpsertToken(ctx context.Context, token types.ProvisionToken) error + // DeleteRole deletes a role by name. + DeleteRole(ctx context.Context, name string) error + // DeleteUser deletes a user and all associated objects. + DeleteUser(ctx context.Context, user string) error + // GetUser returns a user by name. + GetUser(ctx context.Context, name string, withSecrets bool) (types.User, error) + // GetRole returns a role by name. + GetRole(ctx context.Context, name string) (types.Role, error) + // GetToken returns a token by name. + GetToken(ctx context.Context, name string) (types.ProvisionToken, error) +} + +// BotServiceConfig holds configuration options for +// the bots gRPC service. +type BotServiceConfig struct { + Authorizer authz.Authorizer + Cache Cache + Backend Backend + Logger logrus.FieldLogger + Emitter apievents.Emitter + Reporter usagereporter.UsageReporter + Clock clockwork.Clock +} + +// NewBotService returns a new instance of the BotService. +func NewBotService(cfg BotServiceConfig) (*BotService, error) { + switch { + case cfg.Cache == nil: + return nil, trace.BadParameter("cache service is required") + case cfg.Backend == nil: + return nil, trace.BadParameter("backend service is required") + case cfg.Authorizer == nil: + return nil, trace.BadParameter("authorizer is required") + case cfg.Emitter == nil: + return nil, trace.BadParameter("emitter is required") + case cfg.Reporter == nil: + return nil, trace.BadParameter("reporter is required") + } + + if cfg.Logger == nil { + cfg.Logger = logrus.WithField(trace.Component, "bot.service") + } + if cfg.Clock == nil { + cfg.Clock = clockwork.NewRealClock() + } + + return &BotService{ + logger: cfg.Logger, + authorizer: cfg.Authorizer, + cache: cfg.Cache, + backend: cfg.Backend, + emitter: cfg.Emitter, + reporter: cfg.Reporter, + clock: cfg.Clock, + }, nil +} + +// BotService implements the teleport.machineid.v1.BotService RPC service. +type BotService struct { + pb.UnimplementedBotServiceServer + + cache Cache + backend Backend + authorizer authz.Authorizer + logger logrus.FieldLogger + emitter apievents.Emitter + reporter usagereporter.UsageReporter + clock clockwork.Clock +} + +// GetBot gets a bot by name. It will throw an error if the bot does not exist. +func (bs *BotService) GetBot(ctx context.Context, req *pb.GetBotRequest) (*pb.Bot, error) { + _, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindBot, types.VerbRead, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + if req.BotName == "" { + return nil, trace.BadParameter("bot_name: must be non-empty") + } + + user, err := bs.cache.GetUser(ctx, BotResourceName(req.BotName), false) + if err != nil { + return nil, trace.Wrap(err, "fetching bot user") + } + role, err := bs.cache.GetRole(ctx, BotResourceName(req.BotName)) + if err != nil { + return nil, trace.Wrap(err, "fetching bot role") + } + + bot, err := botFromUserAndRole(user, role) + if err != nil { + return nil, trace.Wrap(err, "converting from resources") + } + + return bot, nil +} + +// ListBots lists all bots. +func (bs *BotService) ListBots( + ctx context.Context, req *pb.ListBotsRequest, +) (*pb.ListBotsResponse, error) { + _, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindBot, types.VerbList, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + // TODO(noah): Rewrite this to be less janky/better performing. + // - Concurrency for fetching roles + bots := []*pb.Bot{} + users, token, err := bs.cache.ListUsers( + ctx, int(req.PageSize), req.PageToken, false, + ) + if err != nil { + return nil, trace.Wrap(err, "listing users") + } + for _, u := range users { + botName, isBot := u.GetLabel(types.BotLabel) + if !isBot { + continue + } + + role, err := bs.cache.GetRole(ctx, BotResourceName(botName)) + if err != nil { + bs.logger.WithError(err).WithFields(logrus.Fields{ + "bot.name": botName, + }).Warn("Failed to fetch role for bot during ListBots. Bot will be omitted from results.") + continue + } + + bot, err := botFromUserAndRole(u, role) + if err != nil { + bs.logger.WithError(err).WithFields(logrus.Fields{ + "bot.name": botName, + }).Warn("Failed to convert bot during ListBots. Bot will be omitted from results.") + continue + } + bots = append(bots, bot) + } + + return &pb.ListBotsResponse{ + Bots: bots, + NextPageToken: token, + }, nil +} + +// createBotAuthz allows the legacy rbac noun/verbs to continue being used until +// v16.0.0. +func (bs *BotService) createBotAuthz(ctx context.Context) (*authz.Context, error) { + var authCtx *authz.Context + var originalErr error + authCtx, originalErr = authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindBot, types.VerbCreate, + ) + if originalErr != nil { + // TODO(noah): DELETE IN 16.0.0 + if _, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindUser, types.VerbCreate, + ); err != nil { + return nil, originalErr + } + if _, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindRole, types.VerbCreate, + ); err != nil { + return nil, originalErr + } + var err error + authCtx, err = authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindToken, types.VerbCreate, + ) + if err != nil { + return nil, originalErr + } + bs.logger.Warn("CreateBot authz fell back to legacy resource/verbs. Explicitly grant access to the Bot resource. From V16.0.0, this will fail!") + } + if err := authz.AuthorizeAdminAction(ctx, authCtx); err != nil { + return nil, trace.Wrap(err) + } + return authCtx, nil +} + +// CreateBot creates a new bot. It will throw an error if the bot already +// exists. +func (bs *BotService) CreateBot( + ctx context.Context, req *pb.CreateBotRequest, +) (*pb.Bot, error) { + authCtx, err := bs.createBotAuthz(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := validateBot(req.Bot); err != nil { + return nil, trace.Wrap(err, "validating bot") + } + + user, role, err := botToUserAndRole( + req.Bot, bs.clock.Now(), authCtx.User.GetName(), + ) + if err != nil { + return nil, trace.Wrap(err, "converting to resources") + } + + user, err = bs.backend.CreateUser(ctx, user) + if err != nil { + return nil, trace.Wrap(err, "creating bot user") + } + role, err = bs.backend.CreateRole(ctx, role) + if err != nil { + return nil, trace.Wrap(err, "creating bot role") + } + + bot, err := botFromUserAndRole(user, role) + if err != nil { + return nil, trace.Wrap(err, "converting from resources") + } + + bs.reporter.AnonymizeAndSubmit(&usagereporter.BotCreateEvent{ + UserName: authz.ClientUsername(ctx), + BotUserName: BotResourceName(bot.Metadata.Name), + RoleName: BotResourceName(bot.Metadata.Name), + BotName: bot.Metadata.Name, + RoleCount: int64(len(bot.Spec.Roles)), + }) + if err := bs.emitter.EmitAuditEvent(ctx, &apievents.BotCreate{ + Metadata: apievents.Metadata{ + Type: events.BotCreateEvent, + Code: events.BotCreateCode, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: bot.Metadata.Name, + }, + }); err != nil { + bs.logger.WithError(err).Warn("Failed to emit BotCreate audit event.") + } + + return bot, nil +} + +// UpsertBot creates a new bot or forcefully updates an existing bot. This is +// a function rather than a method so that it can be used by both the gRPC +// service and the auth server init code when dealing with resources to be +// applied at startup. +func UpsertBot( + ctx context.Context, + backend Backend, + bot *pb.Bot, + now time.Time, + createdBy string, +) (*pb.Bot, error) { + if err := validateBot(bot); err != nil { + return nil, trace.Wrap(err, "validating bot") + } + user, role, err := botToUserAndRole(bot, now, createdBy) + if err != nil { + return nil, trace.Wrap(err, "converting to resources") + } + + // Copy in generation from existing user if exists + existingUser, err := backend.GetUser(ctx, BotResourceName(bot.Metadata.Name), false) + if err == nil { + if existingGeneration, ok := existingUser.GetLabel(types.BotGenerationLabel); ok { + meta := user.GetMetadata() + meta.Labels[types.BotGenerationLabel] = existingGeneration + user.SetMetadata(meta) + } else { + return nil, trace.BadParameter("unable to determine existing generation for bot due to missing label") + } + } + + user, err = backend.UpsertUser(ctx, user) + if err != nil { + return nil, trace.Wrap(err, "upserting bot user") + } + role, err = backend.UpsertRole(ctx, role) + if err != nil { + return nil, trace.Wrap(err, "upserting bot role") + } + + bot, err = botFromUserAndRole(user, role) + if err != nil { + return nil, trace.Wrap(err, "converting from resources") + } + return bot, nil +} + +// UpsertBot creates a new bot or forcefully updates an existing bot. +func (bs *BotService) UpsertBot(ctx context.Context, req *pb.UpsertBotRequest) (*pb.Bot, error) { + authCtx, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindBot, types.VerbCreate, types.VerbUpdate, + ) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authz.AuthorizeAdminAction(ctx, authCtx); err != nil { + return nil, trace.Wrap(err) + } + + bot, err := UpsertBot( + ctx, bs.backend, req.Bot, bs.clock.Now(), authCtx.User.GetName(), + ) + if err != nil { + return nil, trace.Wrap(err) + } + + bs.reporter.AnonymizeAndSubmit(&usagereporter.BotCreateEvent{ + UserName: authz.ClientUsername(ctx), + BotUserName: BotResourceName(bot.Metadata.Name), + RoleName: BotResourceName(bot.Metadata.Name), + BotName: bot.Metadata.Name, + RoleCount: int64(len(bot.Spec.Roles)), + }) + if err := bs.emitter.EmitAuditEvent(ctx, &apievents.BotCreate{ + Metadata: apievents.Metadata{ + Type: events.BotCreateEvent, + Code: events.BotCreateCode, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: bot.Metadata.Name, + }, + }); err != nil { + bs.logger.WithError(err).Warn("Failed to emit BotCreate audit event.") + } + + return bot, nil +} + +// UpdateBot updates an existing bot. It will throw an error if the bot does +// not exist. +func (bs *BotService) UpdateBot( + ctx context.Context, req *pb.UpdateBotRequest, +) (*pb.Bot, error) { + authCtx, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindBot, types.VerbUpdate, + ) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authz.AuthorizeAdminAction(ctx, authCtx); err != nil { + return nil, trace.Wrap(err) + } + + switch { + case req.Bot == nil: + return nil, trace.BadParameter("bot: must be non-nil") + case req.Bot.Metadata == nil: + return nil, trace.BadParameter("bot.metadata: must be non-nil") + case req.Bot.Metadata.Name == "": + return nil, trace.BadParameter("bot.metadata.name: must be non-empty") + case req.Bot.Spec == nil: + return nil, trace.BadParameter("bot.spec: must be non-nil") + case req.UpdateMask == nil: + return nil, trace.BadParameter("update_mask: must be non-nil") + case len(req.UpdateMask.Paths) == 0: + return nil, trace.BadParameter("update_mask.paths: must be non-empty") + } + + user, err := bs.backend.GetUser(ctx, BotResourceName(req.Bot.Metadata.Name), false) + if err != nil { + return nil, trace.Wrap(err, "getting bot user") + } + role, err := bs.backend.GetRole(ctx, BotResourceName(req.Bot.Metadata.Name)) + if err != nil { + return nil, trace.Wrap(err, "getting bot role") + } + + for _, path := range req.UpdateMask.Paths { + switch { + case path == "spec.roles": + role.SetImpersonateConditions(types.Allow, types.ImpersonateConditions{ + Roles: req.Bot.Spec.Roles, + }) + case path == "spec.traits": + traits := map[string][]string{} + for _, t := range req.Bot.Spec.Traits { + if len(t.Values) == 0 { + continue + } + if traits[t.Name] == nil { + traits[t.Name] = []string{} + } + traits[t.Name] = append(traits[t.Name], t.Values...) + } + user.SetTraits(traits) + default: + return nil, trace.BadParameter("update_mask: unsupported path %q", path) + } + } + + user, err = bs.backend.UpdateUser(ctx, user) + if err != nil { + return nil, trace.Wrap(err, "updating bot user") + } + role, err = bs.backend.UpdateRole(ctx, role) + if err != nil { + return nil, trace.Wrap(err, "updating bot role") + } + + if err := bs.emitter.EmitAuditEvent(ctx, &apievents.BotUpdate{ + Metadata: apievents.Metadata{ + Type: events.BotUpdateEvent, + Code: events.BotUpdateCode, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.Bot.Metadata.Name, + }, + }); err != nil { + bs.logger.WithError(err).Warn("Failed to emit BotUpdate audit event.") + } + + bot, err := botFromUserAndRole(user, role) + if err != nil { + return nil, trace.Wrap(err, "converting from resources") + } + + return bot, nil +} + +func (bs *BotService) deleteBotUser(ctx context.Context, botName string) error { + // Check the user that's being deleted is linked to the bot. + user, err := bs.backend.GetUser(ctx, BotResourceName(botName), false) + if err != nil { + return trace.Wrap(err, "fetching bot user") + } + if v := user.GetMetadata().Labels[types.BotLabel]; v != botName { + return trace.BadParameter( + "user missing bot label matching bot name; consider manually deleting user", + ) + } + return bs.backend.DeleteUser(ctx, user.GetName()) +} + +func (bs *BotService) deleteBotRole(ctx context.Context, botName string) error { + // Check the role that's being deleted is linked to the bot. + role, err := bs.backend.GetRole(ctx, BotResourceName(botName)) + if err != nil { + return trace.Wrap(err, "fetching bot role") + } + if v := role.GetMetadata().Labels[types.BotLabel]; v != botName { + return trace.BadParameter( + "role missing bot label matching bot name; consider manually deleting role", + ) + } + return bs.backend.DeleteRole(ctx, role.GetName()) +} + +// deleteBotAuthz allows the legacy rbac noun/verbs to continue being used until +// v16.0.0. +func (bs *BotService) deleteBotAuthz(ctx context.Context) error { + var authCtx *authz.Context + var originalErr error + authCtx, originalErr = authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindBot, types.VerbDelete, + ) + if originalErr != nil { + // TODO(noah): DELETE IN 16.0.0 + var err error + authCtx, err = authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindUser, types.VerbDelete, + ) + if err != nil { + return originalErr + } + if _, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindRole, types.VerbDelete, + ); err != nil { + return originalErr + } + if _, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindToken, types.VerbDelete, + ); err != nil { + return originalErr + } + bs.logger.Warn("DeleteBot authz fell back to legacy resource/verbs. Explicitly grant access to the Bot resource. From V16.0.0, this will fail!") + } + if err := authz.AuthorizeAdminAction(ctx, authCtx); err != nil { + return trace.Wrap(err) + } + return nil +} + +// DeleteBot deletes an existing bot. It will throw an error if the bot does +// not exist. +func (bs *BotService) DeleteBot( + ctx context.Context, req *pb.DeleteBotRequest, +) (*emptypb.Empty, error) { + // Note: this does not remove any locks for the bot's user / role. That + // might be convenient in case of accidental bot locking but there doesn't + // seem to be any automatic deletion of locks in teleport today (other + // than expiration). Consistency around security controls seems important + // but we can revisit this if desired. + if err := bs.deleteBotAuthz(ctx); err != nil { + return nil, trace.Wrap(err) + } + + if req.BotName == "" { + return nil, trace.BadParameter("bot_name: must be non-empty") + } + + err := trace.NewAggregate( + trace.Wrap(bs.deleteBotUser(ctx, req.BotName), "deleting bot user"), + trace.Wrap(bs.deleteBotRole(ctx, req.BotName), "deleting bot role"), + ) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := bs.emitter.EmitAuditEvent(ctx, &apievents.BotDelete{ + Metadata: apievents.Metadata{ + Type: events.BotDeleteEvent, + Code: events.BotDeleteCode, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.BotName, + }, + }); err != nil { + bs.logger.WithError(err).Warn("Failed to emit BotDelete audit event.") + } + + return &emptypb.Empty{}, nil +} + +func validateBot(b *pb.Bot) error { + if b == nil { + return trace.BadParameter("must be non-nil") + } + if b.Metadata == nil { + return trace.BadParameter("metadata: must be non-nil") + } + if b.Metadata.Name == "" { + return trace.BadParameter("metadata.name: must be non-empty") + } + if b.Spec == nil { + return trace.BadParameter("spec: must be non-nil") + } + return nil +} + +// botFromUserAndRole +// +// Typically, we treat the bot user as the "canonical" source of information +// where possible. The bot role should be used for information which cannot +// come from the bot user. +func botFromUserAndRole(user types.User, role types.Role) (*pb.Bot, error) { + // User label is canonical source of bot name + botName, ok := user.GetLabel(types.BotLabel) + if !ok { + return nil, trace.BadParameter("user missing bot label") + } + + b := &pb.Bot{ + Kind: types.KindBot, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: botName, + }, + Status: &pb.BotStatus{ + UserName: user.GetName(), + RoleName: role.GetName(), + }, + Spec: &pb.BotSpec{ + Roles: role.GetImpersonateConditions(types.Allow).Roles, + }, + } + + for k, v := range user.GetTraits() { + if len(v) == 0 { + continue + } + b.Spec.Traits = append(b.Spec.Traits, &pb.Trait{ + Name: k, + Values: v, + }) + } + + return b, nil +} + +func botToUserAndRole(bot *pb.Bot, now time.Time, createdBy string) (types.User, types.Role, error) { + // Setup role + resourceName := BotResourceName(bot.Metadata.Name) + role, err := types.NewRole(resourceName, types.RoleSpecV6{ + Options: types.RoleOptions{ + MaxSessionTTL: types.Duration(12 * time.Hour), + }, + Allow: types.RoleConditions{ + Rules: []types.Rule{ + // Bots read certificate authorities to watch for CA rotations + types.NewRule(types.KindCertAuthority, []string{types.VerbReadNoSecrets}), + }, + Impersonate: &types.ImpersonateConditions{ + Roles: bot.Spec.Roles, + }, + }, + }) + if err != nil { + return nil, nil, trace.Wrap(err, "new role") + } + roleMeta := role.GetMetadata() + roleMeta.Description = fmt.Sprintf( + "Automatically generated role for bot %s", bot.Metadata.Name, + ) + roleMeta.Labels = map[string]string{ + types.BotLabel: bot.Metadata.Name, + } + role.SetMetadata(roleMeta) + + // Setup user + user, err := types.NewUser(resourceName) + if err != nil { + return nil, nil, trace.Wrap(err, "new user") + } + user.SetRoles([]string{resourceName}) + userMeta := user.GetMetadata() + userMeta.Labels = map[string]string{ + types.BotLabel: bot.Metadata.Name, + // We always set this to zero here - but in Upsert, we copy from the + // previous user before writing if necessary. + types.BotGenerationLabel: "0", + } + user.SetMetadata(userMeta) + + traits := map[string][]string{} + for _, t := range bot.Spec.Traits { + if len(t.Values) == 0 { + continue + } + if traits[t.Name] == nil { + traits[t.Name] = []string{} + } + traits[t.Name] = append(traits[t.Name], t.Values...) + } + user.SetTraits(traits) + user.SetCreatedBy(types.CreatedBy{ + User: types.UserRef{Name: createdBy}, + Time: now, + }) + + return user, role, nil +} diff --git a/lib/auth/machineid/machineidv1/bot_service_legacy.go b/lib/auth/machineid/machineidv1/bot_service_legacy.go new file mode 100644 index 0000000000000..cb6774ae55331 --- /dev/null +++ b/lib/auth/machineid/machineidv1/bot_service_legacy.go @@ -0,0 +1,184 @@ +/* + * Teleport + * Copyright (C) 2023 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 machineidv1 + +import ( + "context" + "slices" + "time" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/client/proto" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/utils" +) + +// GetBotUsersLegacy fetches all Users with the BotLabel field set. Users are fetched +// without secrets. +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: Switch to [BotService.ListBots]. +func (bs *BotService) GetBotUsersLegacy(ctx context.Context) ([]types.User, error) { + bs.logger.Warn("Deprecated GetBotUsers RPC called. Upgrade your client. From V16.0.0, this will fail!") + _, err := authz.AuthorizeWithVerbs( + ctx, bs.logger, bs.authorizer, false, types.KindUser, types.VerbList, types.VerbRead, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + var botUsers []types.User + var pageToken string + for { + users, token, err := bs.cache.ListUsers( + ctx, 0, pageToken, false, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + for _, user := range users { + if _, ok := user.GetMetadata().Labels[types.BotLabel]; ok { + botUsers = append(botUsers, user) + } + } + + if token == "" { + break + } + pageToken = token + } + + return botUsers, nil +} + +func (bs *BotService) checkOrCreateBotToken(ctx context.Context, req *proto.CreateBotRequest) (types.ProvisionToken, error) { + if req.TokenID != "" { + // if the request includes a TokenID it should already exist + token, err := bs.backend.GetToken(ctx, req.TokenID) + if err != nil { + if trace.IsNotFound(err) { + return nil, trace.NotFound("token with name %q not found, create the token or do not set TokenName: %v", + req.TokenID, err) + } + return nil, trace.Wrap(err) + } + if !token.GetRoles().Include(types.RoleBot) { + return nil, trace.BadParameter("token %q is not valid for role %q", + req.TokenID, types.RoleBot) + } + if token.GetBotName() != req.Name { + return nil, trace.BadParameter("token %q is valid for bot with name %q, not %q", + req.TokenID, token.GetBotName(), req.Name) + } + + if !slices.Contains(SupportedJoinMethods, token.GetJoinMethod()) { + return nil, trace.BadParameter( + "token %q has join method %q which is not supported for bots. Supported join methods are %v", + req.TokenID, + token.GetJoinMethod(), + SupportedJoinMethods, + ) + } + return token, nil + } + + tokenName, err := utils.CryptoRandomHex(16) + if err != nil { + return nil, trace.Wrap(err) + } + + ttl := time.Duration(req.TTL) + if ttl == 0 { + ttl = defaults.DefaultBotJoinTTL + } + + tokenSpec := types.ProvisionTokenSpecV2{ + Roles: types.SystemRoles{types.RoleBot}, + JoinMethod: types.JoinMethodToken, + BotName: req.Name, + } + token, err := types.NewProvisionTokenFromSpec(tokenName, bs.clock.Now().Add(ttl), tokenSpec) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := bs.backend.UpsertToken(ctx, token); err != nil { + return nil, trace.Wrap(err) + } + return token, nil +} + +// CreateBotLegacy creates a bot and a join token. +// TODO(noah): DELETE IN 16.0.0 +// Deprecated: Switch to calling [BotService.CreateBot] and CreateToken separately. +func (bs *BotService) CreateBotLegacy(ctx context.Context, req *proto.CreateBotRequest) (*proto.CreateBotResponse, error) { + bs.logger.Warn("Deprecated CreateBot RPC called. Upgrade your client. From V16.0.0, this will fail!") + if _, err := bs.createBotAuthz(ctx); err != nil { + return nil, trace.Wrap(err) + } + + newReq := &pb.CreateBotRequest{ + Bot: &pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: req.Name, + }, + Spec: &pb.BotSpec{ + Roles: req.Roles, + Traits: []*pb.Trait{}, + }, + }, + } + for k, v := range req.Traits { + if len(v) == 0 { + continue + } + newReq.Bot.Spec.Traits = append(newReq.Bot.Spec.Traits, &pb.Trait{ + Name: k, + Values: v, + }) + } + bot, err := bs.CreateBot(ctx, newReq) + if err != nil { + return nil, trace.Wrap(err) + } + + // Now we perform the legacy behavior of creating or checking an existing token + token, err := bs.checkOrCreateBotToken(ctx, req) + if err != nil { + return nil, trace.Wrap(err) + } + + tokenTTL := time.Duration(0) + if exp := token.Expiry(); !exp.IsZero() { + tokenTTL = time.Until(exp) + } + + return &proto.CreateBotResponse{ + TokenID: token.GetName(), + UserName: bot.Status.UserName, + RoleName: bot.Status.RoleName, + TokenTTL: proto.Duration(tokenTTL), + JoinMethod: token.GetJoinMethod(), + }, nil +} diff --git a/lib/auth/machineid/machineidv1/machineidv1_test.go b/lib/auth/machineid/machineidv1/machineidv1_test.go new file mode 100644 index 0000000000000..0f07f1f862762 --- /dev/null +++ b/lib/auth/machineid/machineidv1/machineidv1_test.go @@ -0,0 +1,1681 @@ +/* + * Teleport + * Copyright (C) 2023 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 machineidv1_test + +import ( + "context" + "errors" + "net" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + "google.golang.org/protobuf/types/known/fieldmaskpb" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/constants" + "github.com/gravitational/teleport/api/defaults" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/wrappers" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" +) + +func TestBotResourceName(t *testing.T) { + require.Equal( + t, + "bot-name", + machineidv1.BotResourceName("name"), + ) + require.Equal( + t, + "bot-name-with-spaces", + machineidv1.BotResourceName("name with spaces"), + ) +} + +// TestCreateBot is an integration test that uses a real gRPC client/server. +func TestCreateBot(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + + botCreator, _, err := auth.CreateUserAndRole( + srv.Auth(), + "bot-creator", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbCreate}, + }, + }) + require.NoError(t, err) + legacyBotCreator, _, err := auth.CreateUserAndRole( + srv.Auth(), + "legacy-bot-creator", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindUser}, + Verbs: []string{types.VerbCreate}, + }, + { + Resources: []string{types.KindRole}, + Verbs: []string{types.VerbCreate}, + }, { + Resources: []string{types.KindToken}, + Verbs: []string{types.VerbCreate}, + }, + }) + require.NoError(t, err) + testRole, err := auth.CreateRole( + ctx, srv.Auth(), "test-role", types.RoleSpecV6{}, + ) + require.NoError(t, err) + unprivilegedUser, err := auth.CreateUser( + ctx, srv.Auth(), "no-perms", testRole, + ) + require.NoError(t, err) + + client, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + preExistingBot, err := client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + + tests := []struct { + name string + user string + req *machineidv1pb.CreateBotRequest + + assertError require.ErrorAssertionFunc + want *machineidv1pb.Bot + wantUser *types.UserV2 + wantRole *types.RoleV6 + }{ + { + name: "success", + user: botCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "success", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + { + Name: constants.TraitKubeUsers, + Values: []string{}, + }, + }, + }, + }, + }, + + assertError: require.NoError, + want: &machineidv1pb.Bot{ + Kind: types.KindBot, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "success", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + Status: &machineidv1pb.BotStatus{ + UserName: "bot-success", + RoleName: "bot-success", + }, + }, + wantUser: &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: "bot-success", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "success", + types.BotGenerationLabel: "0", + }, + }, + Spec: types.UserSpecV2{ + CreatedBy: types.CreatedBy{ + User: types.UserRef{Name: botCreator.GetName()}, + }, + Roles: []string{"bot-success"}, + Traits: map[string][]string{ + constants.TraitLogins: {"root"}, + }, + }, + }, + wantRole: &types.RoleV6{ + Kind: types.KindRole, + Version: types.V7, + Metadata: types.Metadata{ + Name: "bot-success", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "success", + }, + Description: "Automatically generated role for bot success", + }, + Spec: types.RoleSpecV6{ + Options: types.RoleOptions{ + MaxSessionTTL: types.Duration(12 * time.Hour), + }, + Allow: types.RoleConditions{ + Impersonate: &types.ImpersonateConditions{ + Roles: []string{testRole.GetName()}, + }, + Rules: []types.Rule{ + types.NewRule( + types.KindCertAuthority, + []string{types.VerbReadNoSecrets}, + ), + }, + }, + }, + }, + }, + { + name: "success - legacy", + user: legacyBotCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "success-legacy", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + }, + }, + + assertError: require.NoError, + want: &machineidv1pb.Bot{ + Kind: types.KindBot, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "success-legacy", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + Status: &machineidv1pb.BotStatus{ + UserName: "bot-success-legacy", + RoleName: "bot-success-legacy", + }, + }, + }, + { + name: "bot already exists", + user: botCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: preExistingBot, + }, + + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAlreadyExists(err), "error should be already exists") + }, + }, + { + name: "no permissions", + user: unprivilegedUser.GetName(), + req: &machineidv1pb.CreateBotRequest{}, + + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), "error should be access denied") + }, + }, + { + name: "validation - nil bot", + user: botCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: nil, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - nil metadata", + user: botCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: nil, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - no name", + user: botCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{}, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "must be non-empty") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - nil spec", + user: botCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "terminator", + }, + Spec: nil, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "spec: must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := srv.NewClient(auth.TestUser(tt.user)) + require.NoError(t, err) + + bot, err := client.BotServiceClient().CreateBot(ctx, tt.req) + tt.assertError(t, err) + if tt.want != nil { + // Check that the returned bot matches + require.Empty(t, cmp.Diff(tt.want, bot, protocmp.Transform())) + } + if tt.wantUser != nil { + gotUser, err := srv.Auth().GetUser(ctx, tt.wantUser.GetName(), false) + require.NoError(t, err) + require.Empty(t, + cmp.Diff( + tt.wantUser, + gotUser, + cmpopts.IgnoreFields(types.Metadata{}, "ID", "Revision"), + cmpopts.IgnoreFields(types.CreatedBy{}, "Time"), + ), + ) + } + if tt.wantRole != nil { + require.NoError(t, tt.wantRole.CheckAndSetDefaults()) + + gotUser, err := srv.Auth().GetRole(ctx, tt.wantRole.GetName()) + require.NoError(t, err) + require.Empty(t, cmp.Diff( + tt.wantRole, + gotUser, + cmpopts.IgnoreFields(types.Metadata{}, "ID", "Revision")), + ) + } + }) + } +} + +// TestUpdateBot is an integration test that uses a real gRPC client/server. +func TestUpdateBot(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + + botUpdaterUser, _, err := auth.CreateUserAndRole(srv.Auth(), "bot-updater", []string{}, []types.Rule{ + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbUpdate}, + }, + }) + require.NoError(t, err) + beforeRole, err := auth.CreateRole(ctx, srv.Auth(), "before-role", types.RoleSpecV6{}) + require.NoError(t, err) + afterRole, err := auth.CreateRole(ctx, srv.Auth(), "after-role", types.RoleSpecV6{}) + require.NoError(t, err) + unprivilegedUser, err := auth.CreateUser(ctx, srv.Auth(), "no-perms", beforeRole) + require.NoError(t, err) + + // Create a pre-existing bot so we can check you can update an existing bot. + client, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + preExistingBot, err := client.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{beforeRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"before"}, + }, + }, + }, + }, + }) + require.NoError(t, err) + + // We find the user associated with the Bot and set the generation label. This allows us to ensure that the + // generation label is preserved when UpsertBot is called. + { + preExistingBotUser, err := srv.Auth().GetUser(ctx, preExistingBot.Status.UserName, false) + require.NoError(t, err) + meta := preExistingBotUser.GetMetadata() + meta.Labels[types.BotGenerationLabel] = "1337" + preExistingBotUser.SetMetadata(meta) + _, err = srv.Auth().UpsertUser(ctx, preExistingBotUser) + require.NoError(t, err) + } + + tests := []struct { + name string + user string + req *machineidv1pb.UpdateBotRequest + + assertError require.ErrorAssertionFunc + want *machineidv1pb.Bot + wantUser *types.UserV2 + wantRole *types.RoleV6 + }{ + { + name: "success", + user: botUpdaterUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: preExistingBot.Metadata.Name, + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{afterRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"after"}, + }, + { + Name: constants.TraitKubeUsers, + Values: []string{ + "after", + }, + }, + }, + }, + }, + UpdateMask: &fieldmaskpb.FieldMask{ + Paths: []string{"spec.roles", "spec.traits"}, + }, + }, + + assertError: require.NoError, + want: &machineidv1pb.Bot{ + Kind: types.KindBot, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: preExistingBot.Metadata.Name, + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{afterRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"after"}, + }, + { + Name: constants.TraitKubeUsers, + Values: []string{ + "after", + }, + }, + }, + }, + Status: &machineidv1pb.BotStatus{ + UserName: preExistingBot.Status.UserName, + RoleName: preExistingBot.Status.RoleName, + }, + }, + wantUser: &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: preExistingBot.Status.UserName, + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: preExistingBot.Metadata.Name, + types.BotGenerationLabel: "1337", + }, + }, + Spec: types.UserSpecV2{ + Roles: []string{preExistingBot.Status.RoleName}, + Traits: map[string][]string{ + constants.TraitLogins: {"after"}, + constants.TraitKubeUsers: {"after"}, + }, + CreatedBy: types.CreatedBy{ + // We don't expect this to change because an update does + // not adjust the CreatedBy field. + User: types.UserRef{Name: "Admin.localhost"}, + }, + }, + }, + wantRole: &types.RoleV6{ + Kind: types.KindRole, + Version: types.V7, + Metadata: types.Metadata{ + Name: preExistingBot.Status.RoleName, + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: preExistingBot.Metadata.Name, + }, + Description: "Automatically generated role for bot pre-existing", + }, + Spec: types.RoleSpecV6{ + Options: types.RoleOptions{ + MaxSessionTTL: types.Duration(12 * time.Hour), + }, + Allow: types.RoleConditions{ + Impersonate: &types.ImpersonateConditions{ + Roles: []string{afterRole.GetName()}, + }, + Rules: []types.Rule{ + types.NewRule(types.KindCertAuthority, []string{types.VerbReadNoSecrets}), + }, + }, + }, + }, + }, + { + name: "no permissions", + user: unprivilegedUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{}, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), "error should be access denied") + }, + }, + { + name: "validation - nil bot", + user: botUpdaterUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{ + Bot: nil, + UpdateMask: &fieldmaskpb.FieldMask{ + Paths: []string{"spec.roles"}, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "bot: must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - nil bot spec", + user: botUpdaterUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "bernard-lowe", + }, + Spec: nil, + }, + UpdateMask: &fieldmaskpb.FieldMask{ + Paths: []string{"spec.roles"}, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "bot.spec: must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - nil metadata", + user: botUpdaterUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{ + Bot: &machineidv1pb.Bot{ + Spec: &machineidv1pb.BotSpec{ + Roles: []string{beforeRole.GetName()}, + }, + }, + UpdateMask: &fieldmaskpb.FieldMask{ + Paths: []string{"spec.roles"}, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "bot.metadata: must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - no name", + user: botUpdaterUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{beforeRole.GetName()}, + }, + }, + UpdateMask: &fieldmaskpb.FieldMask{ + Paths: []string{"spec.roles"}, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "bot.metadata.name: must be non-empty") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - no update mask", + user: botUpdaterUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "foo", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{beforeRole.GetName()}, + }, + }, + UpdateMask: nil, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "update_mask: must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - no update mask paths", + user: botUpdaterUser.GetName(), + req: &machineidv1pb.UpdateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "foo", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{beforeRole.GetName()}, + }, + }, + UpdateMask: &fieldmaskpb.FieldMask{ + Paths: []string{}, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "update_mask.paths: must be non-empty") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := srv.NewClient(auth.TestUser(tt.user)) + require.NoError(t, err) + + bot, err := client.BotServiceClient().UpdateBot(ctx, tt.req) + tt.assertError(t, err) + if tt.want != nil { + // Check that the returned bot matches + require.Empty( + t, + cmp.Diff( + tt.want, + bot, + protocmp.Transform(), + protocmp.SortRepeatedFields( + &machineidv1pb.BotSpec{}, + "traits", + ), + ), + ) + } + if tt.wantUser != nil { + gotUser, err := srv.Auth().GetUser(ctx, tt.wantUser.GetName(), false) + require.NoError(t, err) + require.Empty(t, + cmp.Diff( + tt.wantUser, + gotUser, + cmpopts.IgnoreFields(types.Metadata{}, "ID", "Revision"), + cmpopts.IgnoreFields(types.CreatedBy{}, "Time"), + ), + ) + } + if tt.wantRole != nil { + require.NoError(t, tt.wantRole.CheckAndSetDefaults()) + gotUser, err := srv.Auth().GetRole(ctx, tt.wantRole.GetName()) + require.NoError(t, err) + require.Empty(t, cmp.Diff( + tt.wantRole, + gotUser, + cmpopts.IgnoreFields(types.Metadata{}, "ID", "Revision")), + ) + } + }) + } +} + +// TestUpsertBot is an integration test that uses a real gRPC client/server. +func TestUpsertBot(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + + botCreator, _, err := auth.CreateUserAndRole(srv.Auth(), "bot-creator", []string{}, []types.Rule{ + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbCreate, types.VerbUpdate}, + }, + }) + require.NoError(t, err) + testRole, err := auth.CreateRole(ctx, srv.Auth(), "test-role", types.RoleSpecV6{}) + require.NoError(t, err) + unprivilegedUser, err := auth.CreateUser(ctx, srv.Auth(), "no-perms", testRole) + require.NoError(t, err) + + // Create a pre-existing bot so we can check you can upsert over an existing bot. + client, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + preExistingBot, err := client.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }) + require.NoError(t, err) + + // We find the user associated with the Bot and set the generation label. This allows us to ensure that the + // generation label is preserved when UpsertBot is called. + { + preExistingBotUser, err := srv.Auth().GetUser(ctx, preExistingBot.Status.UserName, false) + require.NoError(t, err) + meta := preExistingBotUser.GetMetadata() + meta.Labels[types.BotGenerationLabel] = "1337" + preExistingBotUser.SetMetadata(meta) + _, err = srv.Auth().UpsertUser(ctx, preExistingBotUser) + require.NoError(t, err) + } + + tests := []struct { + name string + user string + req *machineidv1pb.UpsertBotRequest + + assertError require.ErrorAssertionFunc + want *machineidv1pb.Bot + wantUser *types.UserV2 + wantRole *types.RoleV6 + }{ + { + name: "new", + user: botCreator.GetName(), + req: &machineidv1pb.UpsertBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "new", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + }, + }, + + assertError: require.NoError, + want: &machineidv1pb.Bot{ + Kind: types.KindBot, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "new", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + Status: &machineidv1pb.BotStatus{ + UserName: "bot-new", + RoleName: "bot-new", + }, + }, + wantUser: &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: "bot-new", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "new", + types.BotGenerationLabel: "0", + }, + }, + Spec: types.UserSpecV2{ + Roles: []string{"bot-new"}, + Traits: map[string][]string{ + constants.TraitLogins: {"root"}, + }, + CreatedBy: types.CreatedBy{ + User: types.UserRef{Name: botCreator.GetName()}, + }, + }, + }, + wantRole: &types.RoleV6{ + Kind: types.KindRole, + Version: types.V7, + Metadata: types.Metadata{ + Name: "bot-new", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "new", + }, + Description: "Automatically generated role for bot new", + }, + Spec: types.RoleSpecV6{ + Options: types.RoleOptions{ + MaxSessionTTL: types.Duration(12 * time.Hour), + }, + Allow: types.RoleConditions{ + Impersonate: &types.ImpersonateConditions{ + Roles: []string{testRole.GetName()}, + }, + Rules: []types.Rule{ + types.NewRule(types.KindCertAuthority, []string{types.VerbReadNoSecrets}), + }, + }, + }, + }, + }, + { + name: "already exists", + user: botCreator.GetName(), + req: &machineidv1pb.UpsertBotRequest{ + Bot: preExistingBot, + }, + + assertError: require.NoError, + want: preExistingBot, + wantUser: &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: "bot-pre-existing", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "pre-existing", + types.BotGenerationLabel: "1337", + }, + }, + Spec: types.UserSpecV2{ + CreatedBy: types.CreatedBy{ + User: types.UserRef{Name: botCreator.GetName()}, + }, + Roles: []string{"bot-pre-existing"}, + Traits: nil, + }, + }, + wantRole: &types.RoleV6{ + Kind: types.KindRole, + Version: types.V7, + Metadata: types.Metadata{ + Name: "bot-pre-existing", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "pre-existing", + }, + Description: "Automatically generated role for bot pre-existing", + }, + Spec: types.RoleSpecV6{ + Options: types.RoleOptions{ + MaxSessionTTL: types.Duration(12 * time.Hour), + }, + Allow: types.RoleConditions{ + Impersonate: &types.ImpersonateConditions{ + Roles: []string{testRole.GetName()}, + }, + Rules: []types.Rule{ + types.NewRule( + types.KindCertAuthority, + []string{types.VerbReadNoSecrets}, + ), + }, + }, + }, + }, + }, + { + name: "no permissions", + user: unprivilegedUser.GetName(), + req: &machineidv1pb.UpsertBotRequest{}, + + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), "error should be access denied") + }, + }, + { + name: "validation - nil bot", + user: botCreator.GetName(), + req: &machineidv1pb.UpsertBotRequest{ + Bot: nil, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - nil metadata", + user: botCreator.GetName(), + req: &machineidv1pb.UpsertBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: nil, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "must be non-nil") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "validation - no name", + user: botCreator.GetName(), + req: &machineidv1pb.UpsertBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{}, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "must be non-empty") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := srv.NewClient(auth.TestUser(tt.user)) + require.NoError(t, err) + + bot, err := client.BotServiceClient().UpsertBot(ctx, tt.req) + tt.assertError(t, err) + if tt.want != nil { + // Check that the returned bot matches + require.Empty(t, cmp.Diff(tt.want, bot, protocmp.Transform())) + } + if tt.wantUser != nil { + gotUser, err := srv.Auth().GetUser(ctx, tt.wantUser.GetName(), false) + require.NoError(t, err) + require.Empty(t, + cmp.Diff( + tt.wantUser, + gotUser, + cmpopts.IgnoreFields(types.Metadata{}, "ID", "Revision"), + cmpopts.IgnoreFields(types.CreatedBy{}, "Time"), + ), + ) + } + if tt.wantRole != nil { + require.NoError(t, tt.wantRole.CheckAndSetDefaults()) + gotUser, err := srv.Auth().GetRole(ctx, tt.wantRole.GetName()) + require.NoError(t, err) + require.Empty(t, cmp.Diff( + tt.wantRole, + gotUser, + cmpopts.IgnoreFields(types.Metadata{}, "ID", "Revision")), + ) + } + }) + } +} + +// TestGetBot is an integration test that uses a real gRPC client/server. +func TestGetBot(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + + botGetterUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "bot-getter", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbRead}, + }, + }) + require.NoError(t, err) + testRole, err := auth.CreateRole( + ctx, srv.Auth(), "test-role", types.RoleSpecV6{}, + ) + require.NoError(t, err) + unprivilegedUser, err := auth.CreateUser( + ctx, srv.Auth(), "no-perms", testRole, + ) + require.NoError(t, err) + + client, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + preExistingBot, err := client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + + tests := []struct { + name string + user string + req *machineidv1pb.GetBotRequest + assertError require.ErrorAssertionFunc + want *machineidv1pb.Bot + }{ + { + name: "success", + user: botGetterUser.GetName(), + req: &machineidv1pb.GetBotRequest{ + BotName: preExistingBot.Metadata.Name, + }, + + assertError: require.NoError, + want: preExistingBot, + }, + { + name: "no permissions", + user: unprivilegedUser.GetName(), + req: &machineidv1pb.GetBotRequest{ + BotName: preExistingBot.Metadata.Name, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), "error should be access denied") + }, + }, + { + name: "validation - no bot name", + user: botGetterUser.GetName(), + req: &machineidv1pb.GetBotRequest{ + BotName: "", + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "must be non-empty") + require.True(t, trace.IsBadParameter(err), "error should be bad parameter") + }, + }, + { + name: "bot doesnt exist", + user: botGetterUser.GetName(), + req: &machineidv1pb.GetBotRequest{ + BotName: "non-existent", + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsNotFound(err), "error should be bad parameter") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := srv.NewClient(auth.TestUser(tt.user)) + require.NoError(t, err) + + bot, err := client.BotServiceClient().GetBot(ctx, tt.req) + tt.assertError(t, err) + if tt.want != nil { + // Check that the returned bot matches + require.Empty(t, cmp.Diff(tt.want, bot, protocmp.Transform())) + } + }) + } +} + +// TestListBots is an integration test that uses a real gRPC client/server. +func TestListBots(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + + botListerUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "bot-lister", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbList}, + }, + }) + require.NoError(t, err) + testRole, err := auth.CreateRole( + ctx, srv.Auth(), "test-role", types.RoleSpecV6{}, + ) + require.NoError(t, err) + unprivilegedUser, err := auth.CreateUser( + ctx, srv.Auth(), "no-perms", testRole, + ) + require.NoError(t, err) + + client, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + preExistingBot, err := client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + preExistingBot2, err := client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing-2", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + + tests := []struct { + name string + user string + req *machineidv1pb.ListBotsRequest + assertError require.ErrorAssertionFunc + want *machineidv1pb.ListBotsResponse + }{ + { + name: "success", + user: botListerUser.GetName(), + req: &machineidv1pb.ListBotsRequest{}, + assertError: require.NoError, + want: &machineidv1pb.ListBotsResponse{ + Bots: []*machineidv1pb.Bot{ + preExistingBot, + preExistingBot2, + }, + }, + }, + { + name: "no permissions", + user: unprivilegedUser.GetName(), + req: &machineidv1pb.ListBotsRequest{}, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), "error should be access denied") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := srv.NewClient(auth.TestUser(tt.user)) + require.NoError(t, err) + + res, err := client.BotServiceClient().ListBots(ctx, tt.req) + tt.assertError(t, err) + if tt.want != nil { + // Check that the returned data matches + require.Empty( + t, cmp.Diff( + tt.want, + res, + protocmp.Transform(), + protocmp.SortRepeatedFields(&machineidv1pb.ListBotsResponse{}, "bots"), + ), + ) + } + }) + } +} + +// TestDeleteBot is an integration test that uses a real gRPC client/server. +func TestDeleteBot(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + + botDeleterUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "bot-deleter", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbDelete}, + }, + }) + require.NoError(t, err) + botDeleterLegacyUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "bot-deleter-legacy", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbDelete}, + }, + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbDelete}, + }, + { + Resources: []string{types.KindBot}, + Verbs: []string{types.VerbDelete}, + }, + }) + require.NoError(t, err) + testRole, err := auth.CreateRole( + ctx, srv.Auth(), "test-role", types.RoleSpecV6{}, + ) + require.NoError(t, err) + unprivilegedUser, err := auth.CreateUser( + ctx, srv.Auth(), "no-perms", testRole, + ) + require.NoError(t, err) + + // Create a user/role with a bot-like name but that isn't a bot to ensure we + // don't delete it + _, err = auth.CreateUser( + ctx, srv.Auth(), "bot-not-bot", testRole, + ) + require.NoError(t, err) + _, err = auth.CreateRole( + ctx, srv.Auth(), "bot-not-bot", types.RoleSpecV6{}, + ) + require.NoError(t, err) + + client, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + preExistingBot, err := client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + preExistingBot2, err := client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing-2", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + preExistingBot3, err := client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing-3", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + + tests := []struct { + name string + user string + req *machineidv1pb.DeleteBotRequest + assertError require.ErrorAssertionFunc + checkResourcesDeleted bool + }{ + { + name: "success", + user: botDeleterUser.GetName(), + req: &machineidv1pb.DeleteBotRequest{ + BotName: preExistingBot.Metadata.Name, + }, + assertError: require.NoError, + checkResourcesDeleted: true, + }, + { + name: "success-legacy", + user: botDeleterLegacyUser.GetName(), + req: &machineidv1pb.DeleteBotRequest{ + BotName: preExistingBot2.Metadata.Name, + }, + assertError: require.NoError, + checkResourcesDeleted: true, + }, + { + name: "no permissions", + user: unprivilegedUser.GetName(), + req: &machineidv1pb.DeleteBotRequest{ + BotName: preExistingBot3.Metadata.Name, + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), "error should be access denied") + }, + }, + { + name: "non existent", + user: botDeleterUser.GetName(), + req: &machineidv1pb.DeleteBotRequest{ + BotName: "does-not-exist", + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsNotFound(err), "error should be not found") + }, + }, + { + name: "non-bot role", + user: botDeleterUser.GetName(), + req: &machineidv1pb.DeleteBotRequest{ + BotName: "not-bot", + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "missing bot label matching bot name") + }, + }, + { + name: "validation - no bot name", + user: botDeleterUser.GetName(), + req: &machineidv1pb.DeleteBotRequest{ + BotName: "", + }, + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorContains(t, err, "bot_name: must be non-empty") + require.True(t, trace.IsBadParameter(err), "error should be access denied") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := srv.NewClient(auth.TestUser(tt.user)) + require.NoError(t, err) + + _, err = client.BotServiceClient().DeleteBot(ctx, tt.req) + tt.assertError(t, err) + if tt.checkResourcesDeleted { + _, err := srv.Auth().GetUser(ctx, machineidv1.BotResourceName(tt.req.BotName), false) + require.True(t, trace.IsNotFound(err), "bot user should be deleted") + _, err = srv.Auth().GetRole(ctx, machineidv1.BotResourceName(tt.req.BotName)) + require.True(t, trace.IsNotFound(err), "bot role should be deleted") + } + }) + } +} + +// TODO(noah): DELETE IN 16.0.0 +func TestCreateBotLegacy(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + testRole := "test-role" + _, err := auth.CreateRole(ctx, srv.Auth(), testRole, types.RoleSpecV6{}) + require.NoError(t, err) + + tests := []struct { + name string + request *proto.CreateBotRequest + + checkErr func(*testing.T, error) + + checkUser func(*testing.T, types.User) + checkRole func(*testing.T, types.Role) + }{ + { + name: "success", + request: &proto.CreateBotRequest{ + Name: "success", + Roles: []string{testRole}, + Traits: wrappers.Traits{ + constants.TraitLogins: []string{ + "a-principal", + }, + }, + }, + checkUser: func(t *testing.T, got types.User) { + require.Equal(t, []string{"bot-success"}, got.GetRoles()) + require.Equal(t, map[string]string{ + types.BotLabel: "success", + types.BotGenerationLabel: "0", + }, got.GetMetadata().Labels) + // Ensure bot user receives requested traits + require.Equal( + t, + []string{"a-principal"}, + got.GetTraits()[constants.TraitLogins], + ) + }, + checkRole: func(t *testing.T, got types.Role) { + require.Equal( + t, "success", got.GetMetadata().Labels[types.BotLabel], + ) + require.Equal( + t, + []string{testRole}, + got.GetImpersonateConditions(types.Allow).Roles, + ) + require.Equal( + t, + types.Duration(12*time.Hour), + got.GetOptions().MaxSessionTTL, + ) + // Ensure bot will be able to read the cert authorities + require.Equal( + t, + []types.Rule{ + types.NewRule( + types.KindCertAuthority, + []string{types.VerbReadNoSecrets}, + ), + }, + got.GetRules(types.Allow), + ) + }, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctx := context.Background() + c, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + + res, err := c.CreateBot(ctx, tt.request) + if tt.checkErr != nil { + tt.checkErr(t, err) + return + } + require.NoError(t, err) + + // Ensure createBot produces the expected role and user. + resourceName := machineidv1.BotResourceName(tt.request.Name) + usr, err := srv.Auth().Services.GetUser(ctx, resourceName, false) + require.NoError(t, err) + tt.checkUser(t, usr) + role, err := srv.Auth().Services.GetRole(ctx, resourceName) + require.NoError(t, err) + tt.checkRole(t, role) + + // Ensure response includes the correct details + require.Equal(t, resourceName, res.UserName) + require.Equal(t, resourceName, res.RoleName) + require.Equal(t, types.JoinMethodToken, res.JoinMethod) + + // Check generated token exists + token, err := srv.Auth().Services.GetToken(ctx, res.TokenID) + require.NoError(t, err) + require.Equal(t, tt.request.Name, token.GetBotName()) + require.Equal(t, types.JoinMethodToken, token.GetJoinMethod()) + require.Equal(t, types.SystemRoles{types.RoleBot}, token.GetRoles()) + }) + } +} + +// TODO(noah): DELETE IN 16.0.0 +func TestGetBotUsersLegacy(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + ctx := context.Background() + + getBotsUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "get-bots-user", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindUser}, + Verbs: []string{types.VerbList, types.VerbRead}, + }, + }) + require.NoError(t, err) + testRole, err := auth.CreateRole( + ctx, srv.Auth(), "test-role", types.RoleSpecV6{}, + ) + require.NoError(t, err) + unprivilegedUser, err := auth.CreateUser( + ctx, srv.Auth(), "no-perms", testRole, + ) + require.NoError(t, err) + + client, err := srv.NewClient(auth.TestAdmin()) + require.NoError(t, err) + _, err = client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + _, err = client.BotServiceClient().CreateBot( + ctx, + &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "pre-existing-2", + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + }, + }, + }, + ) + require.NoError(t, err) + + tests := []struct { + name string + user string + assertError require.ErrorAssertionFunc + want []types.User + }{ + { + name: "success", + user: getBotsUser.GetName(), + assertError: require.NoError, + want: []types.User{ + &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: "bot-pre-existing", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "pre-existing", + types.BotGenerationLabel: "0", + }, + }, + Spec: types.UserSpecV2{ + Roles: []string{"bot-pre-existing"}, + CreatedBy: types.CreatedBy{ + User: types.UserRef{Name: "Admin.localhost"}, + }, + }, + }, + &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: "bot-pre-existing-2", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "pre-existing-2", + types.BotGenerationLabel: "0", + }, + }, + Spec: types.UserSpecV2{ + Roles: []string{"bot-pre-existing-2"}, + CreatedBy: types.CreatedBy{ + User: types.UserRef{Name: "Admin.localhost"}, + }, + }, + }, + }, + }, + { + name: "no permissions", + user: unprivilegedUser.GetName(), + assertError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), "error should be access denied") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client, err := srv.NewClient(auth.TestUser(tt.user)) + require.NoError(t, err) + + res, err := client.GetBotUsers(ctx) + tt.assertError(t, err) + if tt.want != nil { + // Check that the returned data matches + require.Empty( + t, cmp.Diff( + tt.want, + res, + cmpopts.IgnoreFields(types.Metadata{}, "ID", "Revision"), + cmpopts.IgnoreFields(types.CreatedBy{}, "Time"), + cmpopts.SortSlices(func(a, b types.User) bool { + return a.GetName() < b.GetName() + }), + ), + ) + } + }) + } +} + +func newTestTLSServer(t testing.TB) *auth.TestTLSServer { + as, err := auth.NewTestAuthServer(auth.TestAuthServerConfig{ + Dir: t.TempDir(), + Clock: clockwork.NewFakeClockAt(time.Now().Round(time.Second).UTC()), + }) + require.NoError(t, err) + + srv, err := as.NewTestTLSServer() + require.NoError(t, err) + + t.Cleanup(func() { + err := srv.Close() + if errors.Is(err, net.ErrClosed) { + return + } + require.NoError(t, err) + }) + + return srv +} diff --git a/lib/events/api.go b/lib/events/api.go index 83aae2a8691aa..96de8be8a8a3e 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -632,6 +632,13 @@ const ( // BotJoinEvent is emitted when a bot joins BotJoinEvent = "bot.join" + // BotCreateEvent is emitted when a bot is created + BotCreateEvent = "bot.create" + // BotUpdateEvent is emitted when a bot is updated + BotUpdateEvent = "bot.update" + // BotDeleteEvent is emitted when a bot is deleted + BotDeleteEvent = "bot.delete" + // InstanceJoinEvent is emitted when an instance joins InstanceJoinEvent = "instance.join" diff --git a/lib/events/codes.go b/lib/events/codes.go index 21b364e0858ee..5770c2bb49b78 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -402,6 +402,13 @@ const ( // InstanceJoinCode is the 'node.join' event code. InstanceJoinCode = "TJ002I" + // BotCreateCode is the `bot.create` event code. + BotCreateCode = "TB001I" + // BotUpdateCode is the `bot.update` event code. + BotUpdateCode = "TB002I" + // BotDeleteCode is the `bot.delete` event code. + BotDeleteCode = "TB003I" + // LockCreatedCode is the lock created event code. LockCreatedCode = "TLK00I" // LockDeletedCode is the lock deleted event code. diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index 812109ca72c48..af6122674d997 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -295,6 +295,12 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { e = &events.BotJoin{} case InstanceJoinEvent: e = &events.InstanceJoin{} + case BotCreateEvent: + e = &events.BotCreate{} + case BotUpdateEvent: + e = &events.BotUpdate{} + case BotDeleteEvent: + e = &events.BotDelete{} case LoginRuleCreateEvent: e = &events.LoginRuleCreate{} case LoginRuleDeleteEvent: diff --git a/lib/services/access_checker.go b/lib/services/access_checker.go index dd8baad06c816..96db0fd9ef074 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -1171,9 +1171,6 @@ type UserState interface { // IsBot returns true if the user belongs to a bot. IsBot() bool - - // BotGenerationLabel returns the bot generation label for the user. - BotGenerationLabel() string } // AccessInfoFromUser return a new AccessInfo populated from the roles and diff --git a/lib/services/presets.go b/lib/services/presets.go index cb75b98bc2311..526e3ab458836 100644 --- a/lib/services/presets.go +++ b/lib/services/presets.go @@ -129,6 +129,7 @@ func NewPresetEditorRole() types.Role { Rules: []types.Rule{ types.NewRule(types.KindUser, RW()), types.NewRule(types.KindRole, RW()), + types.NewRule(types.KindBot, RW()), types.NewRule(types.KindOIDC, RW()), types.NewRule(types.KindSAML, RW()), types.NewRule(types.KindGithub, RW()), diff --git a/lib/services/resource.go b/lib/services/resource.go index e06e754d19117..dd0f43dc071a2 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -26,8 +26,10 @@ import ( "time" "github.com/gravitational/trace" + "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/protoadapt" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils" ) @@ -226,6 +228,8 @@ func ParseShortcut(in string) (string, error) { return types.KindSecurityReport, nil case types.KindServerInfo: return types.KindServerInfo, nil + case types.KindBot, "bots": + return types.KindBot, nil } return "", trace.BadParameter("unsupported resource: %q - resources should be expressed as 'type/name', for example 'connector/github'", in) } @@ -637,6 +641,13 @@ func init() { } return ap, nil }) + RegisterResourceUnmarshaler(types.KindBot, func(bytes []byte, option ...MarshalOption) (types.Resource, error) { + b := &machineidv1pb.Bot{} + if err := protojson.Unmarshal(bytes, b); err != nil { + return nil, trace.Wrap(err) + } + return types.Resource153ToLegacy(b), nil + }) } // CheckAndSetDefaults calls [r.CheckAndSetDefaults] if r implements the method. diff --git a/tool/tctl/common/admin_action_test.go b/tool/tctl/common/admin_action_test.go index 436b7eaec9aa6..8c9622034c760 100644 --- a/tool/tctl/common/admin_action_test.go +++ b/tool/tctl/common/admin_action_test.go @@ -34,10 +34,13 @@ import ( "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/mocku2f" wancli "github.com/gravitational/teleport/lib/auth/webauthncli" wantypes "github.com/gravitational/teleport/lib/auth/webauthntypes" @@ -122,29 +125,39 @@ func (s *adminActionTestSuite) testUsers(t *testing.T) { func (s *adminActionTestSuite) testBots(t *testing.T) { ctx := context.Background() - botReq := &proto.CreateBotRequest{ - Name: "bot", - Roles: []string{teleport.PresetAccessRoleName}, + botName := "bot" + botReq := &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: botName, + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{teleport.PresetAccessRoleName}, + }, + }, } createBot := func() error { - _, err := s.authServer.CreateBot(ctx, botReq) + _, err := s.localAdminClient.BotServiceClient().CreateBot(ctx, botReq) return trace.Wrap(err) } deleteBot := func() error { - return s.authServer.DeleteBot(ctx, botReq.Name) + _, err := s.localAdminClient.BotServiceClient().DeleteBot(ctx, &machineidv1pb.DeleteBotRequest{ + BotName: botName, + }) + return trace.Wrap(err) } t.Run("BotCommands", func(t *testing.T) { for name, tc := range map[string]adminActionTestCase{ "tctl bots add": { - command: fmt.Sprintf("bots add --roles=%v %v", teleport.PresetAccessRoleName, botReq.Name), + command: fmt.Sprintf("bots add --roles=%v %v", teleport.PresetAccessRoleName, botName), cliCommand: &tctl.BotsCommand{}, cleanup: deleteBot, }, "tctl bots rm": { - command: fmt.Sprintf("bots rm %v", botReq.Name), + command: fmt.Sprintf("bots rm %v", botName), cliCommand: &tctl.BotsCommand{}, setup: createBot, cleanup: deleteBot, @@ -631,7 +644,8 @@ type adminActionTestSuite struct { // userClientWithMFA supports MFA prompt for admin actions. userClientWithMFA auth.ClientI // userClientWithMFA does not support MFA prompt for admin actions. - userClientNoMFA auth.ClientI + userClientNoMFA auth.ClientI + localAdminClient *auth.Client } func newAdminActionTestSuite(t *testing.T) *adminActionTestSuite { @@ -740,10 +754,27 @@ func newAdminActionTestSuite(t *testing.T) *adminActionTestSuite { }) require.NoError(t, err) + hostUUID, err := utils.ReadHostUUID(process.Config.DataDir) + require.NoError(t, err) + localAdmin, err := auth.ReadLocalIdentity( + filepath.Join(process.Config.DataDir, teleport.ComponentProcess), + auth.IdentityID{Role: types.RoleAdmin, HostUUID: hostUUID}, + ) + require.NoError(t, err) + localAdminTLS, err := localAdmin.TLSConfig(nil) + require.NoError(t, err) + localAdminClient, err := authclient.Connect(ctx, &authclient.Config{ + TLS: localAdminTLS, + AuthServers: []utils.NetAddr{*authAddr}, + Log: utils.NewLoggerForTests(), + }) + require.NoError(t, err) + return &adminActionTestSuite{ authServer: authServer, userClientNoMFA: userClientNoMFA, userClientWithMFA: userClientWithMFA, + localAdminClient: localAdminClient, } } diff --git a/tool/tctl/common/bots_command.go b/tool/tctl/common/bots_command.go index 64d293db2d51f..ff3802a6abf6d 100644 --- a/tool/tctl/common/bots_command.go +++ b/tool/tctl/common/bots_command.go @@ -30,13 +30,18 @@ import ( "github.com/alecthomas/kingpin/v2" "github.com/google/uuid" "github.com/gravitational/trace" + log "github.com/sirupsen/logrus" "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/asciitable" "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" + "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/service/servicecfg" "github.com/gravitational/teleport/lib/utils" ) @@ -69,7 +74,7 @@ func (c *BotsCommand) Initialize(app *kingpin.Application, config *servicecfg.Co c.botsAdd = bots.Command("add", "Add a new certificate renewal bot to the cluster.") c.botsAdd.Arg("name", "A name to uniquely identify this bot in the cluster.").Required().StringVar(&c.botName) - c.botsAdd.Flag("roles", "Roles the bot is able to assume.").Required().StringVar(&c.botRoles) + c.botsAdd.Flag("roles", "Roles the bot is able to assume.").StringVar(&c.botRoles) c.botsAdd.Flag("ttl", "TTL for the bot join token.").DurationVar(&c.tokenTTL) c.botsAdd.Flag("token", "Name of an existing token to use.").StringVar(&c.tokenID) c.botsAdd.Flag("format", "Output format, 'text' or 'json'").Hidden().Default(teleport.Text).EnumVar(&c.format, teleport.Text, teleport.JSON) @@ -103,10 +108,8 @@ func (c *BotsCommand) TryRun(ctx context.Context, cmd string, client auth.Client return true, trace.Wrap(err) } -// ListBots writes a listing of the cluster's certificate renewal bots -// to standard out. -func (c *BotsCommand) ListBots(ctx context.Context, client auth.ClientI) error { - // TODO: consider adding a custom column for impersonator roles, locks, ?? +// TODO(noah): DELETE IN 16.0.0 +func (c *BotsCommand) listBotsLegacy(ctx context.Context, client auth.ClientI) error { users, err := client.GetBotUsers(ctx) if err != nil { return trace.Wrap(err) @@ -142,6 +145,48 @@ func (c *BotsCommand) ListBots(ctx context.Context, client auth.ClientI) error { return nil } +// ListBots writes a listing of the cluster's certificate renewal bots +// to standard out. +func (c *BotsCommand) ListBots(ctx context.Context, client auth.ClientI) error { + var bots []*machineidv1pb.Bot + req := &machineidv1pb.ListBotsRequest{} + for { + resp, err := client.BotServiceClient().ListBots(ctx, req) + if err != nil { + if trace.IsNotImplemented(err) { + return trace.Wrap(c.listBotsLegacy(ctx, client)) + } + return trace.Wrap(err) + } + + bots = append(bots, resp.Bots...) + if resp.NextPageToken == "" { + break + } + req.PageToken = resp.NextPageToken + } + + if c.format == teleport.Text { + if len(bots) == 0 { + fmt.Println("No bots found") + return nil + } + t := asciitable.MakeTable([]string{"Bot", "User", "Roles"}) + for _, u := range bots { + t.AddRow([]string{ + u.Metadata.Name, u.Status.UserName, strings.Join(u.Spec.GetRoles(), ","), + }) + } + fmt.Println(t.AsBuffer().String()) + } else { + err := utils.WriteJSONArray(os.Stdout, bots) + if err != nil { + return trace.Wrap(err, "failed to marshal bots") + } + } + return nil +} + // bold wraps the given text in an ANSI escape to bold it func bold(text string) string { return utils.Color(utils.Bold, text) @@ -181,11 +226,11 @@ Please note: - {{.addr}} must be reachable from the new node `)) -// AddBot adds a new certificate renewal bot to the cluster. -func (c *BotsCommand) AddBot(ctx context.Context, client auth.ClientI) error { +// TODO(noah): DELETE IN 16.0.0 +func (c *BotsCommand) addBotLegacy(ctx context.Context, client auth.ClientI) error { roles := splitRoles(c.botRoles) if len(roles) == 0 { - return trace.BadParameter("at least one role must be specified with --roles") + log.Warning("No roles specified. The bot will not be able to produce outputs until a role is added to the bot.") } traits := map[string][]string{ @@ -200,7 +245,7 @@ func (c *BotsCommand) AddBot(ctx context.Context, client auth.ClientI) error { Traits: traits, }) if err != nil { - return trace.WrapWithMessage(err, "error while creating bot") + return trace.Wrap(err, "creating bot") } if c.format == teleport.JSON { @@ -218,7 +263,7 @@ func (c *BotsCommand) AddBot(ctx context.Context, client auth.ClientI) error { return trace.Wrap(err) } if len(proxies) == 0 { - return trace.Errorf("This cluster does not have any proxy servers running.") + return trace.Errorf("bot was created but this cluster does not have any proxy servers running so unable to display success message") } addr := proxies[0].GetPublicAddr() if addr == "" { @@ -238,9 +283,158 @@ func (c *BotsCommand) AddBot(ctx context.Context, client auth.ClientI) error { }) } +// AddBot adds a new certificate renewal bot to the cluster. +func (c *BotsCommand) AddBot(ctx context.Context, client auth.ClientI) error { + // Jankily call the endpoint invalidly. This lets us version check and use + // the legacy version of this CLI tool if we are talking to an older + // server. + // DELETE IN 16.0 + { + _, err := client.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: nil, + }) + if trace.IsNotImplemented(err) { + return trace.Wrap(c.addBotLegacy(ctx, client)) + } + } + + roles := splitRoles(c.botRoles) + if len(roles) == 0 { + log.Warning("No roles specified. The bot will not be able to produce outputs until a role is added to the bot.") + } + var token types.ProvisionToken + var err error + if c.tokenID == "" { + // If there's no token specified, generate one + tokenName, err := utils.CryptoRandomHex(16) + if err != nil { + return trace.Wrap(err) + } + ttl := c.tokenTTL + if ttl == 0 { + ttl = defaults.DefaultBotJoinTTL + } + tokenSpec := types.ProvisionTokenSpecV2{ + Roles: types.SystemRoles{types.RoleBot}, + JoinMethod: types.JoinMethodToken, + BotName: c.botName, + } + token, err = types.NewProvisionTokenFromSpec(tokenName, time.Now().Add(ttl), tokenSpec) + if err != nil { + return trace.Wrap(err) + } + if err := client.UpsertToken(ctx, token); err != nil { + return trace.Wrap(err) + } + } else { + // If there is, check the token matches the potential bot + token, err = client.GetToken(ctx, c.tokenID) + if err != nil { + if trace.IsNotFound(err) { + return trace.NotFound("token with name %q not found, create the token or do not set TokenName: %v", + c.tokenID, err) + } + return trace.Wrap(err) + } + if !token.GetRoles().Include(types.RoleBot) { + return trace.BadParameter("token %q is not valid for role %q", + c.tokenID, types.RoleBot) + } + if token.GetBotName() != c.botName { + return trace.BadParameter("token %q is valid for bot with name %q, not %q", + c.tokenID, token.GetBotName(), c.botName) + } + } + + bot := &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: c.botName, + }, + Spec: &machineidv1pb.BotSpec{ + Roles: roles, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: flattenSlice(c.allowedLogins), + }, + }, + }, + } + + bot, err = client.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: bot, + }) + if err != nil { + return trace.Wrap(err) + } + + if c.format == teleport.JSON { + tokenTTL := time.Duration(0) + if exp := token.Expiry(); !exp.IsZero() { + tokenTTL = time.Until(exp) + } + // This struct is equivalent to a legacy bit of JSON we used to output + // when we called an older RPC. We've preserved it here to avoid + // breaking customer scripts. + response := struct { + UserName string `json:"user_name"` + RoleName string `json:"role_name"` + TokenID string `json:"token_id"` + TokenTTL time.Duration `json:"token_ttl"` + }{ + UserName: bot.Status.UserName, + RoleName: bot.Status.RoleName, + TokenID: token.GetName(), + TokenTTL: tokenTTL, + } + out, err := json.MarshalIndent(response, "", " ") + if err != nil { + return trace.Wrap(err, "failed to marshal CreateBot response") + } + + fmt.Println(string(out)) + return nil + } + + proxies, err := client.GetProxies() + if err != nil { + return trace.Wrap(err) + } + if len(proxies) == 0 { + return trace.Errorf("bot was created but this cluster does not have any proxy servers running so unable to display success message") + } + addr := proxies[0].GetPublicAddr() + if addr == "" { + addr = proxies[0].GetAddr() + } + + joinMethod := token.GetJoinMethod() + if joinMethod == types.JoinMethodUnspecified { + joinMethod = types.JoinMethodToken + } + + return startMessageTemplate.Execute(os.Stdout, map[string]interface{}{ + "token": token.GetName(), + "minutes": int(time.Until(token.Expiry()).Minutes()), + "addr": addr, + "join_method": joinMethod, + }) +} + func (c *BotsCommand) RemoveBot(ctx context.Context, client auth.ClientI) error { - if err := client.DeleteBot(ctx, c.botName); err != nil { - return trace.WrapWithMessage(err, "error deleting bot") + _, err := client.BotServiceClient().DeleteBot(ctx, &machineidv1pb.DeleteBotRequest{ + BotName: c.botName, + }) + if err != nil { + if trace.IsNotImplemented(err) { + // This falls back to the deprecated RPC. + // TODO(noah): DELETE IN 16.0.0 + if err := client.DeleteBot(ctx, c.botName); err != nil { + return trace.Wrap(err, "error deleting bot") + } + } else { + return trace.Wrap(err) + } } fmt.Printf("Bot %q deleted successfully.\n", c.botName) @@ -254,7 +448,7 @@ func (c *BotsCommand) LockBot(ctx context.Context, client auth.ClientI) error { return trace.Wrap(err) } - user, err := client.GetUser(ctx, auth.BotResourceName(c.botName), false) + user, err := client.GetUser(ctx, machineidv1.BotResourceName(c.botName), false) if err != nil { return trace.Wrap(err) } diff --git a/tool/tctl/common/collection.go b/tool/tctl/common/collection.go index ab5a31b92bed5..5564eb884559d 100644 --- a/tool/tctl/common/collection.go +++ b/tool/tctl/common/collection.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/constants" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/discoveryconfig" "github.com/gravitational/teleport/api/types/externalauditstorage" @@ -1138,6 +1139,30 @@ func (c *samlIdPServiceProviderCollection) writeText(w io.Writer, verbose bool) return trace.Wrap(err) } +type botCollection struct { + bots []*machineidv1pb.Bot +} + +func (c *botCollection) resources() []types.Resource { + resources := make([]types.Resource, len(c.bots)) + for i, b := range c.bots { + resources[i] = types.Resource153ToLegacy(b) + } + return resources +} + +func (c *botCollection) writeText(w io.Writer, verbose bool) error { + t := asciitable.MakeTable([]string{"Name", "Roles"}) + for _, b := range c.bots { + t.AddRow([]string{ + b.Metadata.Name, + strings.Join(b.Spec.Roles, ", "), + }) + } + _, err := t.AsBuffer().WriteTo(w) + return trace.Wrap(err) +} + type deviceCollection struct { devices []*devicepb.Device } diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index ab74f8124cbb8..b2da724ede687 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -34,6 +34,7 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/trace/trail" log "github.com/sirupsen/logrus" + "google.golang.org/protobuf/encoding/protojson" kyaml "k8s.io/apimachinery/pkg/util/yaml" "github.com/gravitational/teleport" @@ -42,6 +43,7 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" + machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/internalutils/stream" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/discoveryconfig" @@ -142,6 +144,7 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, config *servicec types.KindAuditQuery: rc.createAuditQuery, types.KindSecurityReport: rc.createSecurityReport, types.KindServerInfo: rc.createServerInfo, + types.KindBot: rc.createBot, } rc.UpdateHandlers = map[ResourceKind]ResourceCreateHandler{ types.KindUser: rc.updateUser, @@ -530,6 +533,32 @@ func (rc *ResourceCommand) createUser(ctx context.Context, client auth.ClientI, return nil } +func (rc *ResourceCommand) createBot(ctx context.Context, client auth.ClientI, raw services.UnknownResource) error { + bot := &machineidv1pb.Bot{} + if err := protojson.Unmarshal(raw.Raw, bot); err != nil { + return trace.Wrap(err) + } + if rc.IsForced() { + _, err := client.BotServiceClient().UpsertBot(ctx, &machineidv1pb.UpsertBotRequest{ + Bot: bot, + }) + if err != nil { + return trace.Wrap(err) + } + fmt.Printf("bot %q has been created\n", bot.Metadata.Name) + return nil + } + + _, err := client.BotServiceClient().CreateBot(ctx, &machineidv1pb.CreateBotRequest{ + Bot: bot, + }) + if err != nil { + return trace.Wrap(err) + } + fmt.Printf("bot %q has been created\n", bot.Metadata.Name) + return nil +} + // updateUser implements `tctl create user.yaml` command. func (rc *ResourceCommand) updateUser(ctx context.Context, client auth.ClientI, raw services.UnknownResource) error { user, err := services.UnmarshalUser(raw.Raw) @@ -1504,6 +1533,11 @@ func (rc *ResourceCommand) Delete(ctx context.Context, client auth.ClientI) (err return trace.Wrap(err) } fmt.Printf("Server info %q has been deleted\n", rc.ref.Name) + case types.KindBot: + if _, err := client.BotServiceClient().DeleteBot(ctx, &machineidv1pb.DeleteBotRequest{BotName: rc.ref.Name}); err != nil { + return trace.Wrap(err) + } + fmt.Printf("Bot %q has been deleted\n", rc.ref.Name) default: return trace.BadParameter("deleting resources of type %q is not supported", rc.ref.Kind) } @@ -2148,6 +2182,35 @@ func (rc *ResourceCommand) getCollection(ctx context.Context, client auth.Client }) return &deviceCollection{devices: devs}, nil + case types.KindBot: + remote := client.BotServiceClient() + if rc.ref.Name != "" { + bot, err := remote.GetBot(ctx, &machineidv1pb.GetBotRequest{ + BotName: rc.ref.Name, + }) + if err != nil { + return nil, trace.Wrap(err) + } + + return &botCollection{bots: []*machineidv1pb.Bot{bot}}, nil + } + + req := &machineidv1pb.ListBotsRequest{} + var bots []*machineidv1pb.Bot + for { + resp, err := remote.ListBots(ctx, req) + if err != nil { + return nil, trace.Wrap(err) + } + + bots = append(bots, resp.Bots...) + + if resp.NextPageToken == "" { + break + } + req.PageToken = resp.NextPageToken + } + return &botCollection{bots: bots}, nil case types.KindOktaImportRule: if rc.ref.Name != "" { importRule, err := client.OktaClient().GetOktaImportRule(ctx, rc.ref.Name) diff --git a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx index 748cde5418d69..dc3f32fb4f7cf 100644 --- a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx +++ b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx @@ -107,6 +107,9 @@ const EventIconMap: Record = { [eventCodes.USER_CREATED]: Icons.Info, [eventCodes.USER_UPDATED]: Icons.Info, [eventCodes.USER_DELETED]: Icons.Info, + [eventCodes.BOT_CREATED]: Icons.Info, + [eventCodes.BOT_UPDATED]: Icons.Info, + [eventCodes.BOT_DELETED]: Icons.Info, [eventCodes.RESET_PASSWORD_TOKEN_CREATED]: Icons.Info, [eventCodes.USER_PASSWORD_CHANGED]: Icons.Info, [eventCodes.ACCESS_REQUEST_CREATED]: Icons.Info, diff --git a/web/packages/teleport/src/Audit/__snapshots__/Audit.story.test.tsx.snap b/web/packages/teleport/src/Audit/__snapshots__/Audit.story.test.tsx.snap index 15c14965fb9f4..65ba878cf6eb6 100644 --- a/web/packages/teleport/src/Audit/__snapshots__/Audit.story.test.tsx.snap +++ b/web/packages/teleport/src/Audit/__snapshots__/Audit.story.test.tsx.snap @@ -446,12 +446,12 @@ exports[`list of all events 1`] = ` - - 224 + 226 of - 224 + 226 + + + + +
+ + + + + + + + Bot Deleted +
+ + + User [noah] deleted a Bot [review2] + + + 2023-12-08T09:52:30.579Z + + + + + { + return `User [${user}] created a Bot [${name}]`; + }, + }, + [eventCodes.BOT_UPDATED]: { + type: 'bot.update', + desc: 'Bot Updated', + format: ({ user, name }) => { + return `User [${user}] modified a Bot [${name}]`; + }, + }, + [eventCodes.BOT_DELETED]: { + type: 'bot.delete', + desc: 'Bot Deleted', + format: ({ user, name }) => { + return `User [${user}] deleted a Bot [${name}]`; + }, + }, [eventCodes.LOGIN_RULE_CREATE]: { type: 'login_rule.create', desc: 'Login Rule Created', diff --git a/web/packages/teleport/src/services/audit/types.ts b/web/packages/teleport/src/services/audit/types.ts index a35940faea2fa..82f62634954a7 100644 --- a/web/packages/teleport/src/services/audit/types.ts +++ b/web/packages/teleport/src/services/audit/types.ts @@ -231,6 +231,9 @@ export const eventCodes = { UPGRADE_WINDOW_UPDATED: 'TUW01I', BOT_JOIN: 'TJ001I', INSTANCE_JOIN: 'TJ002I', + BOT_CREATED: 'TB001I', + BOT_UPDATED: 'TB002I', + BOT_DELETED: 'TB003I', LOGIN_RULE_CREATE: 'TLR00I', LOGIN_RULE_DELETE: 'TLR01I', SAML_IDP_AUTH_ATTEMPT: 'TSI000I', @@ -1240,6 +1243,9 @@ export type RawEvents = { role: string; } >; + [eventCodes.BOT_CREATED]: RawEvent; + [eventCodes.BOT_UPDATED]: RawEvent; + [eventCodes.BOT_DELETED]: RawEvent; [eventCodes.LOGIN_RULE_CREATE]: RawEvent< typeof eventCodes.LOGIN_RULE_CREATE, HasName