Fail backup if it already exists in object storage

Signed-off-by: Andy Goldstein <andy.goldstein@gmail.com>
This commit is contained in:
Andy Goldstein
2018-06-29 13:54:44 -04:00
committed by Carlisia
parent 134323fbf7
commit 01d0b026e9
18 changed files with 640 additions and 72 deletions

View File

@@ -57,6 +57,54 @@ func (m *PutObjectRequest) GetBody() []byte {
return nil
}
type ObjectExistsRequest struct {
Plugin string `protobuf:"bytes,1,opt,name=plugin" json:"plugin,omitempty"`
Bucket string `protobuf:"bytes,2,opt,name=bucket" json:"bucket,omitempty"`
Key string `protobuf:"bytes,3,opt,name=key" json:"key,omitempty"`
}
func (m *ObjectExistsRequest) Reset() { *m = ObjectExistsRequest{} }
func (m *ObjectExistsRequest) String() string { return proto.CompactTextString(m) }
func (*ObjectExistsRequest) ProtoMessage() {}
func (*ObjectExistsRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} }
func (m *ObjectExistsRequest) GetPlugin() string {
if m != nil {
return m.Plugin
}
return ""
}
func (m *ObjectExistsRequest) GetBucket() string {
if m != nil {
return m.Bucket
}
return ""
}
func (m *ObjectExistsRequest) GetKey() string {
if m != nil {
return m.Key
}
return ""
}
type ObjectExistsResponse struct {
Exists bool `protobuf:"varint,1,opt,name=exists" json:"exists,omitempty"`
}
func (m *ObjectExistsResponse) Reset() { *m = ObjectExistsResponse{} }
func (m *ObjectExistsResponse) String() string { return proto.CompactTextString(m) }
func (*ObjectExistsResponse) ProtoMessage() {}
func (*ObjectExistsResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} }
func (m *ObjectExistsResponse) GetExists() bool {
if m != nil {
return m.Exists
}
return false
}
type GetObjectRequest struct {
Plugin string `protobuf:"bytes,1,opt,name=plugin" json:"plugin,omitempty"`
Bucket string `protobuf:"bytes,2,opt,name=bucket" json:"bucket,omitempty"`
@@ -66,7 +114,7 @@ type GetObjectRequest struct {
func (m *GetObjectRequest) Reset() { *m = GetObjectRequest{} }
func (m *GetObjectRequest) String() string { return proto.CompactTextString(m) }
func (*GetObjectRequest) ProtoMessage() {}
func (*GetObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} }
func (*GetObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} }
func (m *GetObjectRequest) GetPlugin() string {
if m != nil {
@@ -96,7 +144,7 @@ type Bytes struct {
func (m *Bytes) Reset() { *m = Bytes{} }
func (m *Bytes) String() string { return proto.CompactTextString(m) }
func (*Bytes) ProtoMessage() {}
func (*Bytes) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} }
func (*Bytes) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} }
func (m *Bytes) GetData() []byte {
if m != nil {
@@ -115,7 +163,7 @@ type ListCommonPrefixesRequest struct {
func (m *ListCommonPrefixesRequest) Reset() { *m = ListCommonPrefixesRequest{} }
func (m *ListCommonPrefixesRequest) String() string { return proto.CompactTextString(m) }
func (*ListCommonPrefixesRequest) ProtoMessage() {}
func (*ListCommonPrefixesRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} }
func (*ListCommonPrefixesRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} }
func (m *ListCommonPrefixesRequest) GetPlugin() string {
if m != nil {
@@ -152,7 +200,7 @@ type ListCommonPrefixesResponse struct {
func (m *ListCommonPrefixesResponse) Reset() { *m = ListCommonPrefixesResponse{} }
func (m *ListCommonPrefixesResponse) String() string { return proto.CompactTextString(m) }
func (*ListCommonPrefixesResponse) ProtoMessage() {}
func (*ListCommonPrefixesResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} }
func (*ListCommonPrefixesResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} }
func (m *ListCommonPrefixesResponse) GetPrefixes() []string {
if m != nil {
@@ -170,7 +218,7 @@ type ListObjectsRequest struct {
func (m *ListObjectsRequest) Reset() { *m = ListObjectsRequest{} }
func (m *ListObjectsRequest) String() string { return proto.CompactTextString(m) }
func (*ListObjectsRequest) ProtoMessage() {}
func (*ListObjectsRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} }
func (*ListObjectsRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} }
func (m *ListObjectsRequest) GetPlugin() string {
if m != nil {
@@ -200,7 +248,7 @@ type ListObjectsResponse struct {
func (m *ListObjectsResponse) Reset() { *m = ListObjectsResponse{} }
func (m *ListObjectsResponse) String() string { return proto.CompactTextString(m) }
func (*ListObjectsResponse) ProtoMessage() {}
func (*ListObjectsResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} }
func (*ListObjectsResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{8} }
func (m *ListObjectsResponse) GetKeys() []string {
if m != nil {
@@ -218,7 +266,7 @@ type DeleteObjectRequest struct {
func (m *DeleteObjectRequest) Reset() { *m = DeleteObjectRequest{} }
func (m *DeleteObjectRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteObjectRequest) ProtoMessage() {}
func (*DeleteObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} }
func (*DeleteObjectRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{9} }
func (m *DeleteObjectRequest) GetPlugin() string {
if m != nil {
@@ -251,7 +299,7 @@ type CreateSignedURLRequest struct {
func (m *CreateSignedURLRequest) Reset() { *m = CreateSignedURLRequest{} }
func (m *CreateSignedURLRequest) String() string { return proto.CompactTextString(m) }
func (*CreateSignedURLRequest) ProtoMessage() {}
func (*CreateSignedURLRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{8} }
func (*CreateSignedURLRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{10} }
func (m *CreateSignedURLRequest) GetPlugin() string {
if m != nil {
@@ -288,7 +336,7 @@ type CreateSignedURLResponse struct {
func (m *CreateSignedURLResponse) Reset() { *m = CreateSignedURLResponse{} }
func (m *CreateSignedURLResponse) String() string { return proto.CompactTextString(m) }
func (*CreateSignedURLResponse) ProtoMessage() {}
func (*CreateSignedURLResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{9} }
func (*CreateSignedURLResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{11} }
func (m *CreateSignedURLResponse) GetUrl() string {
if m != nil {
@@ -305,7 +353,7 @@ type ObjectStoreInitRequest struct {
func (m *ObjectStoreInitRequest) Reset() { *m = ObjectStoreInitRequest{} }
func (m *ObjectStoreInitRequest) String() string { return proto.CompactTextString(m) }
func (*ObjectStoreInitRequest) ProtoMessage() {}
func (*ObjectStoreInitRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{10} }
func (*ObjectStoreInitRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{12} }
func (m *ObjectStoreInitRequest) GetPlugin() string {
if m != nil {
@@ -323,6 +371,8 @@ func (m *ObjectStoreInitRequest) GetConfig() map[string]string {
func init() {
proto.RegisterType((*PutObjectRequest)(nil), "generated.PutObjectRequest")
proto.RegisterType((*ObjectExistsRequest)(nil), "generated.ObjectExistsRequest")
proto.RegisterType((*ObjectExistsResponse)(nil), "generated.ObjectExistsResponse")
proto.RegisterType((*GetObjectRequest)(nil), "generated.GetObjectRequest")
proto.RegisterType((*Bytes)(nil), "generated.Bytes")
proto.RegisterType((*ListCommonPrefixesRequest)(nil), "generated.ListCommonPrefixesRequest")
@@ -348,6 +398,7 @@ const _ = grpc.SupportPackageIsVersion4
type ObjectStoreClient interface {
Init(ctx context.Context, in *ObjectStoreInitRequest, opts ...grpc.CallOption) (*Empty, error)
PutObject(ctx context.Context, opts ...grpc.CallOption) (ObjectStore_PutObjectClient, error)
ObjectExists(ctx context.Context, in *ObjectExistsRequest, opts ...grpc.CallOption) (*ObjectExistsResponse, error)
GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (ObjectStore_GetObjectClient, error)
ListCommonPrefixes(ctx context.Context, in *ListCommonPrefixesRequest, opts ...grpc.CallOption) (*ListCommonPrefixesResponse, error)
ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error)
@@ -406,6 +457,15 @@ func (x *objectStorePutObjectClient) CloseAndRecv() (*Empty, error) {
return m, nil
}
func (c *objectStoreClient) ObjectExists(ctx context.Context, in *ObjectExistsRequest, opts ...grpc.CallOption) (*ObjectExistsResponse, error) {
out := new(ObjectExistsResponse)
err := grpc.Invoke(ctx, "/generated.ObjectStore/ObjectExists", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *objectStoreClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (ObjectStore_GetObjectClient, error) {
stream, err := grpc.NewClientStream(ctx, &_ObjectStore_serviceDesc.Streams[1], c.cc, "/generated.ObjectStore/GetObject", opts...)
if err != nil {
@@ -479,6 +539,7 @@ func (c *objectStoreClient) CreateSignedURL(ctx context.Context, in *CreateSigne
type ObjectStoreServer interface {
Init(context.Context, *ObjectStoreInitRequest) (*Empty, error)
PutObject(ObjectStore_PutObjectServer) error
ObjectExists(context.Context, *ObjectExistsRequest) (*ObjectExistsResponse, error)
GetObject(*GetObjectRequest, ObjectStore_GetObjectServer) error
ListCommonPrefixes(context.Context, *ListCommonPrefixesRequest) (*ListCommonPrefixesResponse, error)
ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error)
@@ -534,6 +595,24 @@ func (x *objectStorePutObjectServer) Recv() (*PutObjectRequest, error) {
return m, nil
}
func _ObjectStore_ObjectExists_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ObjectExistsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ObjectStoreServer).ObjectExists(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/generated.ObjectStore/ObjectExists",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ObjectStoreServer).ObjectExists(ctx, req.(*ObjectExistsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _ObjectStore_GetObject_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(GetObjectRequest)
if err := stream.RecvMsg(m); err != nil {
@@ -635,6 +714,10 @@ var _ObjectStore_serviceDesc = grpc.ServiceDesc{
MethodName: "Init",
Handler: _ObjectStore_Init_Handler,
},
{
MethodName: "ObjectExists",
Handler: _ObjectStore_ObjectExists_Handler,
},
{
MethodName: "ListCommonPrefixes",
Handler: _ObjectStore_ListCommonPrefixes_Handler,
@@ -670,39 +753,42 @@ var _ObjectStore_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("ObjectStore.proto", fileDescriptor1) }
var fileDescriptor1 = []byte{
// 531 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x5f, 0x8b, 0xd3, 0x40,
0x10, 0x67, 0x9b, 0x5c, 0x31, 0xd3, 0x82, 0x71, 0x4f, 0x6a, 0xcc, 0xa9, 0xd4, 0x45, 0x21, 0x22,
0x16, 0x39, 0x5f, 0xce, 0x3f, 0x0f, 0x62, 0x2d, 0x22, 0x14, 0x3c, 0x52, 0x45, 0x1f, 0x7c, 0x49,
0x9b, 0xb9, 0x5e, 0x6c, 0x9a, 0xc4, 0x64, 0x23, 0xe6, 0xd1, 0xcf, 0xe0, 0x37, 0xf1, 0x13, 0x4a,
0x36, 0x7b, 0xed, 0xa6, 0x97, 0xbb, 0x42, 0xe9, 0xdb, 0xcc, 0xec, 0xcc, 0xfc, 0x7e, 0xb3, 0xbb,
0xbf, 0x81, 0x5b, 0x9f, 0xa6, 0x3f, 0x70, 0xc6, 0x27, 0x3c, 0x4e, 0x71, 0x90, 0xa4, 0x31, 0x8f,
0xa9, 0x31, 0xc7, 0x08, 0x53, 0x8f, 0xa3, 0x6f, 0x77, 0x27, 0xe7, 0x5e, 0x8a, 0x7e, 0x75, 0xc0,
0xce, 0xc1, 0x3c, 0xcd, 0x79, 0x55, 0xe0, 0xe2, 0xcf, 0x1c, 0x33, 0x4e, 0x7b, 0xd0, 0x4e, 0xc2,
0x7c, 0x1e, 0x44, 0x16, 0xe9, 0x13, 0xc7, 0x70, 0xa5, 0x57, 0xc6, 0xa7, 0xf9, 0x6c, 0x81, 0xdc,
0x6a, 0x55, 0xf1, 0xca, 0xa3, 0x26, 0x68, 0x0b, 0x2c, 0x2c, 0x4d, 0x04, 0x4b, 0x93, 0x52, 0xd0,
0xa7, 0xb1, 0x5f, 0x58, 0x7a, 0x9f, 0x38, 0x5d, 0x57, 0xd8, 0xec, 0x33, 0x98, 0x1f, 0x70, 0xdf,
0x48, 0xec, 0x08, 0x0e, 0xde, 0x15, 0x1c, 0xb3, 0x12, 0xd2, 0xf7, 0xb8, 0x27, 0x1a, 0x75, 0x5d,
0x61, 0xb3, 0x3f, 0x04, 0xee, 0x8e, 0x83, 0x8c, 0x0f, 0xe3, 0xe5, 0x32, 0x8e, 0x4e, 0x53, 0x3c,
0x0b, 0x7e, 0x63, 0xb6, 0x2b, 0xf8, 0x3d, 0x30, 0x7c, 0x0c, 0x83, 0x65, 0xc0, 0x31, 0x95, 0x14,
0xd6, 0x01, 0xd1, 0x4d, 0x00, 0x88, 0xa1, 0xcb, 0x6e, 0xc2, 0x63, 0x27, 0x60, 0x37, 0x51, 0xc8,
0x92, 0x38, 0xca, 0x90, 0xda, 0x70, 0x23, 0x91, 0x31, 0x8b, 0xf4, 0x35, 0xc7, 0x70, 0x57, 0x3e,
0xfb, 0x0e, 0xb4, 0xac, 0xac, 0x6e, 0x6c, 0x67, 0xd6, 0x6b, 0x5e, 0x5a, 0x8d, 0xd7, 0x13, 0x38,
0xac, 0x75, 0x97, 0x84, 0x28, 0xe8, 0x0b, 0x2c, 0x2e, 0xc8, 0x08, 0x9b, 0x7d, 0x85, 0xc3, 0xf7,
0x18, 0x22, 0xc7, 0x7d, 0x3f, 0x5e, 0x08, 0xbd, 0x61, 0x8a, 0x1e, 0xc7, 0x49, 0x30, 0x8f, 0xd0,
0xff, 0xe2, 0x8e, 0xf7, 0xf7, 0x05, 0x4d, 0xd0, 0x38, 0x0f, 0xc5, 0x63, 0x68, 0x6e, 0x69, 0xb2,
0xa7, 0x70, 0xe7, 0x12, 0x9a, 0x9c, 0xda, 0x04, 0x2d, 0x4f, 0x43, 0x89, 0x55, 0x9a, 0xec, 0x1f,
0x81, 0x9e, 0x22, 0xa3, 0x8f, 0x51, 0xb0, 0x75, 0xee, 0x11, 0xb4, 0x67, 0x71, 0x74, 0x16, 0xcc,
0xad, 0x56, 0x5f, 0x73, 0x3a, 0xc7, 0xcf, 0x06, 0x2b, 0xd1, 0x0d, 0x9a, 0x5b, 0x0d, 0x86, 0x22,
0x7f, 0x14, 0xf1, 0xb4, 0x70, 0x65, 0xb1, 0xfd, 0x12, 0x3a, 0x4a, 0xf8, 0x62, 0x32, 0xb2, 0x9e,
0xec, 0x36, 0x1c, 0xfc, 0xf2, 0xc2, 0x1c, 0xe5, 0x15, 0x54, 0xce, 0xab, 0xd6, 0x09, 0x39, 0xfe,
0xab, 0x43, 0x47, 0x41, 0xa2, 0xaf, 0x41, 0x2f, 0xd1, 0xe8, 0xc3, 0xad, 0x4c, 0x6c, 0x53, 0x49,
0x19, 0x2d, 0x13, 0x5e, 0xd0, 0x37, 0x60, 0xac, 0x36, 0x03, 0x3d, 0x52, 0x8e, 0x37, 0xf7, 0xc5,
0xe5, 0x5a, 0x87, 0x94, 0xd5, 0x2b, 0xb5, 0xd7, 0xaa, 0x37, 0x77, 0x40, 0xad, 0x5a, 0x48, 0xf9,
0x39, 0xa1, 0x5e, 0xf5, 0xf5, 0xeb, 0xa2, 0xa1, 0x8f, 0x94, 0xcc, 0x2b, 0x65, 0x6d, 0x3f, 0xde,
0x92, 0x25, 0x9f, 0x7c, 0x0c, 0x1d, 0xe5, 0xff, 0xd3, 0xfb, 0x1b, 0x55, 0x75, 0xd5, 0xd9, 0x0f,
0xae, 0x3a, 0x96, 0xdd, 0xde, 0x42, 0x57, 0x95, 0x08, 0x55, 0xf3, 0x1b, 0xb4, 0xd3, 0x70, 0xdd,
0xdf, 0xe0, 0xe6, 0xc6, 0xef, 0xac, 0x3d, 0x5b, 0xb3, 0x4e, 0x6c, 0x76, 0x5d, 0x4a, 0xc5, 0x6d,
0xda, 0x16, 0x9b, 0xfe, 0xc5, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe6, 0x73, 0xe9, 0xf8, 0x17,
0x06, 0x00, 0x00,
// 577 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xcd, 0x6e, 0xd3, 0x40,
0x10, 0xd6, 0xc6, 0x69, 0x54, 0x4f, 0x22, 0x61, 0xb6, 0x55, 0x30, 0x2e, 0x94, 0xb0, 0x02, 0x29,
0x08, 0x11, 0xa1, 0x72, 0x29, 0xd0, 0x03, 0x22, 0x44, 0x08, 0x29, 0x52, 0x2b, 0x07, 0x04, 0x07,
0x2e, 0x4e, 0x3c, 0x4d, 0x4d, 0x1c, 0x3b, 0xd8, 0x6b, 0x54, 0x1f, 0x79, 0x25, 0x9e, 0x89, 0x07,
0x41, 0xbb, 0xde, 0x26, 0xde, 0xfc, 0x10, 0xa9, 0xca, 0x6d, 0x66, 0x76, 0xe7, 0x9b, 0x6f, 0x66,
0xfd, 0x8d, 0xe1, 0xee, 0xf9, 0xf0, 0x07, 0x8e, 0xf8, 0x80, 0xc7, 0x09, 0x76, 0x66, 0x49, 0xcc,
0x63, 0x6a, 0x8e, 0x31, 0xc2, 0xc4, 0xe3, 0xe8, 0x3b, 0x8d, 0xc1, 0x95, 0x97, 0xa0, 0x5f, 0x1c,
0xb0, 0x2b, 0xb0, 0x2e, 0x32, 0x5e, 0x24, 0xb8, 0xf8, 0x33, 0xc3, 0x94, 0xd3, 0x26, 0xd4, 0x66,
0x61, 0x36, 0x0e, 0x22, 0x9b, 0xb4, 0x48, 0xdb, 0x74, 0x95, 0x27, 0xe2, 0xc3, 0x6c, 0x34, 0x41,
0x6e, 0x57, 0x8a, 0x78, 0xe1, 0x51, 0x0b, 0x8c, 0x09, 0xe6, 0xb6, 0x21, 0x83, 0xc2, 0xa4, 0x14,
0xaa, 0xc3, 0xd8, 0xcf, 0xed, 0x6a, 0x8b, 0xb4, 0x1b, 0xae, 0xb4, 0xd9, 0x57, 0x38, 0x28, 0xca,
0xf4, 0xae, 0x83, 0x94, 0xa7, 0x3b, 0x2b, 0xc6, 0x3a, 0x70, 0xa8, 0x03, 0xa7, 0xb3, 0x38, 0x4a,
0x51, 0x20, 0xa0, 0x8c, 0x48, 0xe4, 0x7d, 0x57, 0x79, 0xec, 0x33, 0x58, 0x1f, 0x71, 0xd7, 0x2d,
0xb3, 0x23, 0xd8, 0x7b, 0x9f, 0x73, 0x4c, 0x45, 0xef, 0xbe, 0xc7, 0x3d, 0x09, 0xd4, 0x70, 0xa5,
0xcd, 0x7e, 0x13, 0xb8, 0xdf, 0x0f, 0x52, 0xde, 0x8d, 0xa7, 0xd3, 0x38, 0xba, 0x48, 0xf0, 0x32,
0xb8, 0xc6, 0x5b, 0x8f, 0xe0, 0x01, 0x98, 0x3e, 0x86, 0xc1, 0x34, 0xe0, 0x98, 0x28, 0x0a, 0x8b,
0x80, 0x44, 0x93, 0x05, 0xe4, 0xf4, 0x05, 0x9a, 0xf4, 0xd8, 0x29, 0x38, 0xeb, 0x28, 0xa8, 0x61,
0x39, 0xb0, 0x3f, 0x53, 0x31, 0x9b, 0xb4, 0x8c, 0xb6, 0xe9, 0xce, 0x7d, 0xf6, 0x1d, 0xa8, 0xc8,
0x2c, 0x26, 0x76, 0x6b, 0xd6, 0x0b, 0x5e, 0x86, 0xc6, 0xeb, 0x19, 0x1c, 0x68, 0xe8, 0x8a, 0x10,
0x85, 0xea, 0x04, 0xf3, 0x1b, 0x32, 0xd2, 0x16, 0x9f, 0xd0, 0x07, 0x0c, 0x91, 0xe3, 0xae, 0x1f,
0x2f, 0x84, 0x66, 0x37, 0x41, 0x8f, 0xe3, 0x20, 0x18, 0x47, 0xe8, 0x7f, 0x71, 0xfb, 0xbb, 0xd3,
0x82, 0x05, 0x06, 0xe7, 0xa1, 0x7c, 0x0c, 0xc3, 0x15, 0x26, 0x7b, 0x0e, 0xf7, 0x56, 0xaa, 0xa9,
0xae, 0x2d, 0x30, 0xb2, 0x24, 0x54, 0xb5, 0x84, 0xc9, 0xfe, 0x10, 0x68, 0x96, 0xf4, 0xfc, 0x29,
0x0a, 0xb6, 0xf6, 0xdd, 0x83, 0xda, 0x28, 0x8e, 0x2e, 0x83, 0xb1, 0x5d, 0x69, 0x19, 0xed, 0xfa,
0xc9, 0x8b, 0xce, 0x5c, 0xfd, 0x9d, 0xf5, 0x50, 0x9d, 0xae, 0xbc, 0xdf, 0x8b, 0x78, 0x92, 0xbb,
0x2a, 0xd9, 0x79, 0x0d, 0xf5, 0x52, 0xf8, 0xa6, 0x33, 0xb2, 0xe8, 0xec, 0x10, 0xf6, 0x7e, 0x79,
0x61, 0x86, 0x6a, 0x04, 0x85, 0xf3, 0xa6, 0x72, 0x4a, 0x4e, 0xfe, 0x56, 0xa1, 0x5e, 0xaa, 0x44,
0xdf, 0x42, 0x55, 0x54, 0xa3, 0x8f, 0xb7, 0x32, 0x71, 0xac, 0xd2, 0x95, 0xde, 0x74, 0xc6, 0x73,
0x7a, 0x06, 0xe6, 0x7c, 0x45, 0xd1, 0xa3, 0xd2, 0xf1, 0xf2, 0xe2, 0x5a, 0xcd, 0x6d, 0x13, 0x7a,
0x0e, 0x8d, 0xf2, 0x76, 0xa0, 0xc7, 0x2b, 0x14, 0xb4, 0x7d, 0xe4, 0x3c, 0xda, 0x78, 0xae, 0x9e,
0xe8, 0x0c, 0xcc, 0xf9, 0xfa, 0xd0, 0xe8, 0x2c, 0x2f, 0x15, 0x8d, 0x8e, 0xdc, 0x0d, 0x2f, 0x09,
0xf5, 0x0a, 0x2d, 0xe9, 0x2a, 0xa4, 0x4f, 0x4a, 0x37, 0x37, 0xee, 0x09, 0xe7, 0xe9, 0x96, 0x5b,
0x8a, 0x60, 0x1f, 0xea, 0x25, 0x41, 0xd1, 0x87, 0x4b, 0x59, 0xba, 0x8c, 0x9d, 0xe3, 0x4d, 0xc7,
0x0a, 0xed, 0x1d, 0x34, 0xca, 0x9a, 0xd3, 0xe6, 0xb7, 0x46, 0x8c, 0x6b, 0xde, 0xef, 0x1b, 0xdc,
0x59, 0xfa, 0xdc, 0xb5, 0xef, 0x60, 0xbd, 0xf0, 0x1c, 0xf6, 0xbf, 0x2b, 0x05, 0xb7, 0x61, 0x4d,
0xfe, 0xc3, 0x5e, 0xfd, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x4e, 0x76, 0xa3, 0xf1, 0x06, 0x00,
0x00,
}