Commit 3635c238 authored by 袁兴强's avatar 袁兴强

add wasm rpc

parent 9b63bae9
...@@ -74,7 +74,7 @@ func checkContract(cmd *cobra.Command, args []string) { ...@@ -74,7 +74,7 @@ func checkContract(cmd *cobra.Command, args []string) {
params := rpctypes.Query4Jrpc{ params := rpctypes.Query4Jrpc{
Execer: wasmtypes.WasmX, Execer: wasmtypes.WasmX,
FuncName: "Check", FuncName: "Check",
Payload: types.MustPBToJSON(&wasmtypes.QueryCheckConract{ Payload: types.MustPBToJSON(&wasmtypes.QueryCheckContract{
Name: name, Name: name,
}), }),
} }
......
#include "common.h" #include "../common.h"
#include "dice.hpp" #include "dice.hpp"
#include <string.h> #include <string.h>
......
...@@ -108,7 +108,7 @@ func (w *Wasm) Exec_Call(payload *types2.WasmCall, tx *types.Transaction, index ...@@ -108,7 +108,7 @@ func (w *Wasm) Exec_Call(payload *types2.WasmCall, tx *types.Transaction, index
KV: w.kvs, KV: w.kvs,
Logs: logs, Logs: logs,
} }
if ret != 0 { if ret < 0 {
receipt.Ty = types.ExecPack receipt.Ty = types.ExecPack
} }
......
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
types2 "github.com/33cn/plugin/plugin/dapp/wasm/types" types2 "github.com/33cn/plugin/plugin/dapp/wasm/types"
) )
func (w *Wasm) Query_Check(query *types2.QueryCheckConract) (types.Message, error) { func (w *Wasm) Query_Check(query *types2.QueryCheckContract) (types.Message, error) {
if query == nil { if query == nil {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
......
...@@ -4,7 +4,7 @@ import ( ...@@ -4,7 +4,7 @@ import (
"github.com/33cn/chain33/pluginmgr" "github.com/33cn/chain33/pluginmgr"
"github.com/33cn/plugin/plugin/dapp/wasm/commands" "github.com/33cn/plugin/plugin/dapp/wasm/commands"
"github.com/33cn/plugin/plugin/dapp/wasm/executor" "github.com/33cn/plugin/plugin/dapp/wasm/executor"
_ "github.com/33cn/plugin/plugin/dapp/wasm/rpc" "github.com/33cn/plugin/plugin/dapp/wasm/rpc"
"github.com/33cn/plugin/plugin/dapp/wasm/types" "github.com/33cn/plugin/plugin/dapp/wasm/types"
) )
...@@ -14,6 +14,6 @@ func init() { ...@@ -14,6 +14,6 @@ func init() {
ExecName: executor.GetName(), ExecName: executor.GetName(),
Exec: executor.Init, Exec: executor.Init,
Cmd: commands.Cmd, Cmd: commands.Cmd,
//RPC: rpc.Init, RPC: rpc.Init,
}) })
} }
...@@ -21,19 +21,10 @@ message wasmCall { ...@@ -21,19 +21,10 @@ message wasmCall {
repeated int64 parameters = 3; repeated int64 parameters = 3;
} }
message queryCheckConract { message queryCheckContract {
string name = 1; string name = 1;
} }
message queryCreateTransaction{
int32 ty = 1;
string name = 2;
bytes code = 3;
string method = 4;
repeated int64 parameters = 5;
int64 fee = 6;
}
message customLog { message customLog {
repeated string info = 1; repeated string info = 1;
} }
......
package rpc package rpc
import (
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/types"
types2 "github.com/33cn/plugin/plugin/dapp/wasm/types"
)
func (c *channelClient) check(in *types2.QueryCheckContract) (*types.Reply, error) {
if in == nil {
return nil, types2.ErrInvalidParam
}
m, err := c.Query(types2.WasmX, "Check", in)
if err != nil {
return nil, err
}
if reply, ok := m.(*types.Reply); ok {
return reply, nil
}
return nil, types2.ErrUnknown
}
func (j *Jrpc) CheckContract(param *types2.QueryCheckContract, result *interface{}) error {
res, err := j.cli.check(param)
if err != nil {
return err
}
if res != nil {
*result = res.IsOk
} else {
*result = false
}
return nil
}
func (j *Jrpc) CreateContract(param *types2.WasmCreate, result *interface{}) error {
if param == nil {
return types2.ErrInvalidParam
}
cfg := types.LoadExecutorType(types2.WasmX).GetConfig()
data, err := types.CallCreateTx(cfg, cfg.ExecName(types2.WasmX), "Create", param)
if err != nil {
return err
}
*result = common.ToHex(data)
return nil
}
func (j *Jrpc) CallContract(param *types2.WasmCall, result *interface{}) error {
if param == nil {
return types2.ErrInvalidParam
}
cfg := types.LoadExecutorType(types2.WasmX).GetConfig()
data, err := types.CallCreateTx(cfg, cfg.ExecName(types2.WasmX), "Call", param)
if err != nil {
return err
}
*result = common.ToHex(data)
return nil
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package rpc
import (
"github.com/33cn/chain33/rpc/types"
)
// Jrpc json rpc struct
type Jrpc struct {
cli *channelClient
}
// Grpc grpc struct
type Grpc struct {
*channelClient
}
type channelClient struct {
types.ChannelClient
}
// Init init grpc param
func Init(name string, s types.RPCServer) {
cli := &channelClient{}
grpc := &Grpc{channelClient: cli}
cli.Init(name, s, &Jrpc{cli: cli}, grpc)
}
...@@ -8,4 +8,6 @@ var ( ...@@ -8,4 +8,6 @@ var (
ErrCodeOversize = errors.New("code oversize") ErrCodeOversize = errors.New("code oversize")
ErrInvalidMethod = errors.New("invalid method") ErrInvalidMethod = errors.New("invalid method")
ErrInvalidContractName = errors.New("invalid contract name") ErrInvalidContractName = errors.New("invalid contract name")
ErrInvalidParam = errors.New("invalid parameters")
ErrUnknown = errors.New("unknown error")
) )
...@@ -210,124 +210,45 @@ func (m *WasmCall) GetParameters() []int64 { ...@@ -210,124 +210,45 @@ func (m *WasmCall) GetParameters() []int64 {
return nil return nil
} }
type QueryCheckConract struct { type QueryCheckContract struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *QueryCheckConract) Reset() { *m = QueryCheckConract{} } func (m *QueryCheckContract) Reset() { *m = QueryCheckContract{} }
func (m *QueryCheckConract) String() string { return proto.CompactTextString(m) } func (m *QueryCheckContract) String() string { return proto.CompactTextString(m) }
func (*QueryCheckConract) ProtoMessage() {} func (*QueryCheckContract) ProtoMessage() {}
func (*QueryCheckConract) Descriptor() ([]byte, []int) { func (*QueryCheckContract) Descriptor() ([]byte, []int) {
return fileDescriptor_7d78909ad64e3bbb, []int{3} return fileDescriptor_7d78909ad64e3bbb, []int{3}
} }
func (m *QueryCheckConract) XXX_Unmarshal(b []byte) error { func (m *QueryCheckContract) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryCheckConract.Unmarshal(m, b) return xxx_messageInfo_QueryCheckContract.Unmarshal(m, b)
} }
func (m *QueryCheckConract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { func (m *QueryCheckContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryCheckConract.Marshal(b, m, deterministic) return xxx_messageInfo_QueryCheckContract.Marshal(b, m, deterministic)
} }
func (m *QueryCheckConract) XXX_Merge(src proto.Message) { func (m *QueryCheckContract) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryCheckConract.Merge(m, src) xxx_messageInfo_QueryCheckContract.Merge(m, src)
} }
func (m *QueryCheckConract) XXX_Size() int { func (m *QueryCheckContract) XXX_Size() int {
return xxx_messageInfo_QueryCheckConract.Size(m) return xxx_messageInfo_QueryCheckContract.Size(m)
} }
func (m *QueryCheckConract) XXX_DiscardUnknown() { func (m *QueryCheckContract) XXX_DiscardUnknown() {
xxx_messageInfo_QueryCheckConract.DiscardUnknown(m) xxx_messageInfo_QueryCheckContract.DiscardUnknown(m)
} }
var xxx_messageInfo_QueryCheckConract proto.InternalMessageInfo var xxx_messageInfo_QueryCheckContract proto.InternalMessageInfo
func (m *QueryCheckConract) GetName() string { func (m *QueryCheckContract) GetName() string {
if m != nil { if m != nil {
return m.Name return m.Name
} }
return "" return ""
} }
type QueryCreateTransaction struct {
Ty int32 `protobuf:"varint,1,opt,name=ty,proto3" json:"ty,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Code []byte `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"`
Method string `protobuf:"bytes,4,opt,name=method,proto3" json:"method,omitempty"`
Parameters []int64 `protobuf:"varint,5,rep,packed,name=parameters,proto3" json:"parameters,omitempty"`
Fee int64 `protobuf:"varint,6,opt,name=fee,proto3" json:"fee,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryCreateTransaction) Reset() { *m = QueryCreateTransaction{} }
func (m *QueryCreateTransaction) String() string { return proto.CompactTextString(m) }
func (*QueryCreateTransaction) ProtoMessage() {}
func (*QueryCreateTransaction) Descriptor() ([]byte, []int) {
return fileDescriptor_7d78909ad64e3bbb, []int{4}
}
func (m *QueryCreateTransaction) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryCreateTransaction.Unmarshal(m, b)
}
func (m *QueryCreateTransaction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryCreateTransaction.Marshal(b, m, deterministic)
}
func (m *QueryCreateTransaction) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryCreateTransaction.Merge(m, src)
}
func (m *QueryCreateTransaction) XXX_Size() int {
return xxx_messageInfo_QueryCreateTransaction.Size(m)
}
func (m *QueryCreateTransaction) XXX_DiscardUnknown() {
xxx_messageInfo_QueryCreateTransaction.DiscardUnknown(m)
}
var xxx_messageInfo_QueryCreateTransaction proto.InternalMessageInfo
func (m *QueryCreateTransaction) GetTy() int32 {
if m != nil {
return m.Ty
}
return 0
}
func (m *QueryCreateTransaction) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *QueryCreateTransaction) GetCode() []byte {
if m != nil {
return m.Code
}
return nil
}
func (m *QueryCreateTransaction) GetMethod() string {
if m != nil {
return m.Method
}
return ""
}
func (m *QueryCreateTransaction) GetParameters() []int64 {
if m != nil {
return m.Parameters
}
return nil
}
func (m *QueryCreateTransaction) GetFee() int64 {
if m != nil {
return m.Fee
}
return 0
}
type CustomLog struct { type CustomLog struct {
Info []string `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"` Info []string `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
...@@ -339,7 +260,7 @@ func (m *CustomLog) Reset() { *m = CustomLog{} } ...@@ -339,7 +260,7 @@ func (m *CustomLog) Reset() { *m = CustomLog{} }
func (m *CustomLog) String() string { return proto.CompactTextString(m) } func (m *CustomLog) String() string { return proto.CompactTextString(m) }
func (*CustomLog) ProtoMessage() {} func (*CustomLog) ProtoMessage() {}
func (*CustomLog) Descriptor() ([]byte, []int) { func (*CustomLog) Descriptor() ([]byte, []int) {
return fileDescriptor_7d78909ad64e3bbb, []int{5} return fileDescriptor_7d78909ad64e3bbb, []int{4}
} }
func (m *CustomLog) XXX_Unmarshal(b []byte) error { func (m *CustomLog) XXX_Unmarshal(b []byte) error {
...@@ -379,7 +300,7 @@ func (m *CreateContractLog) Reset() { *m = CreateContractLog{} } ...@@ -379,7 +300,7 @@ func (m *CreateContractLog) Reset() { *m = CreateContractLog{} }
func (m *CreateContractLog) String() string { return proto.CompactTextString(m) } func (m *CreateContractLog) String() string { return proto.CompactTextString(m) }
func (*CreateContractLog) ProtoMessage() {} func (*CreateContractLog) ProtoMessage() {}
func (*CreateContractLog) Descriptor() ([]byte, []int) { func (*CreateContractLog) Descriptor() ([]byte, []int) {
return fileDescriptor_7d78909ad64e3bbb, []int{6} return fileDescriptor_7d78909ad64e3bbb, []int{5}
} }
func (m *CreateContractLog) XXX_Unmarshal(b []byte) error { func (m *CreateContractLog) XXX_Unmarshal(b []byte) error {
...@@ -427,7 +348,7 @@ func (m *CallContractLog) Reset() { *m = CallContractLog{} } ...@@ -427,7 +348,7 @@ func (m *CallContractLog) Reset() { *m = CallContractLog{} }
func (m *CallContractLog) String() string { return proto.CompactTextString(m) } func (m *CallContractLog) String() string { return proto.CompactTextString(m) }
func (*CallContractLog) ProtoMessage() {} func (*CallContractLog) ProtoMessage() {}
func (*CallContractLog) Descriptor() ([]byte, []int) { func (*CallContractLog) Descriptor() ([]byte, []int) {
return fileDescriptor_7d78909ad64e3bbb, []int{7} return fileDescriptor_7d78909ad64e3bbb, []int{6}
} }
func (m *CallContractLog) XXX_Unmarshal(b []byte) error { func (m *CallContractLog) XXX_Unmarshal(b []byte) error {
...@@ -482,7 +403,7 @@ func (m *LocalDataLog) Reset() { *m = LocalDataLog{} } ...@@ -482,7 +403,7 @@ func (m *LocalDataLog) Reset() { *m = LocalDataLog{} }
func (m *LocalDataLog) String() string { return proto.CompactTextString(m) } func (m *LocalDataLog) String() string { return proto.CompactTextString(m) }
func (*LocalDataLog) ProtoMessage() {} func (*LocalDataLog) ProtoMessage() {}
func (*LocalDataLog) Descriptor() ([]byte, []int) { func (*LocalDataLog) Descriptor() ([]byte, []int) {
return fileDescriptor_7d78909ad64e3bbb, []int{8} return fileDescriptor_7d78909ad64e3bbb, []int{7}
} }
func (m *LocalDataLog) XXX_Unmarshal(b []byte) error { func (m *LocalDataLog) XXX_Unmarshal(b []byte) error {
...@@ -528,8 +449,7 @@ func init() { ...@@ -528,8 +449,7 @@ func init() {
proto.RegisterType((*WasmAction)(nil), "types.wasmAction") proto.RegisterType((*WasmAction)(nil), "types.wasmAction")
proto.RegisterType((*WasmCreate)(nil), "types.wasmCreate") proto.RegisterType((*WasmCreate)(nil), "types.wasmCreate")
proto.RegisterType((*WasmCall)(nil), "types.wasmCall") proto.RegisterType((*WasmCall)(nil), "types.wasmCall")
proto.RegisterType((*QueryCheckConract)(nil), "types.queryCheckConract") proto.RegisterType((*QueryCheckContract)(nil), "types.queryCheckContract")
proto.RegisterType((*QueryCreateTransaction)(nil), "types.queryCreateTransaction")
proto.RegisterType((*CustomLog)(nil), "types.customLog") proto.RegisterType((*CustomLog)(nil), "types.customLog")
proto.RegisterType((*CreateContractLog)(nil), "types.createContractLog") proto.RegisterType((*CreateContractLog)(nil), "types.createContractLog")
proto.RegisterType((*CallContractLog)(nil), "types.callContractLog") proto.RegisterType((*CallContractLog)(nil), "types.callContractLog")
...@@ -539,30 +459,27 @@ func init() { ...@@ -539,30 +459,27 @@ func init() {
func init() { proto.RegisterFile("wasm.proto", fileDescriptor_7d78909ad64e3bbb) } func init() { proto.RegisterFile("wasm.proto", fileDescriptor_7d78909ad64e3bbb) }
var fileDescriptor_7d78909ad64e3bbb = []byte{ var fileDescriptor_7d78909ad64e3bbb = []byte{
// 393 bytes of a gzipped FileDescriptorProto // 342 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0x3d, 0x0f, 0xd3, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0xbf, 0x4f, 0xf3, 0x30,
0x10, 0x6d, 0xe2, 0x26, 0x34, 0x47, 0x45, 0x5b, 0x0f, 0x55, 0xc4, 0x00, 0x91, 0x25, 0x44, 0x24, 0x10, 0x6d, 0xea, 0x36, 0x5f, 0x73, 0x5f, 0x45, 0xa9, 0x87, 0x2a, 0x62, 0x80, 0xc8, 0x12, 0x52,
0xa4, 0x0e, 0xc0, 0xc6, 0x04, 0x61, 0xe8, 0xc0, 0x64, 0x21, 0xc4, 0x02, 0x92, 0x71, 0x5d, 0x5a, 0x24, 0xa4, 0x0e, 0xc0, 0xc6, 0x04, 0x65, 0xe8, 0xc0, 0xe4, 0x01, 0xb1, 0x80, 0x64, 0x5c, 0x43,
0xd5, 0x89, 0x83, 0xe3, 0x80, 0xf2, 0x57, 0xf8, 0xb5, 0xc8, 0x1f, 0x0d, 0x11, 0xaa, 0x3a, 0xb0, 0xab, 0x3a, 0x71, 0x70, 0x1c, 0x50, 0xfe, 0x7b, 0xe4, 0x1f, 0xa9, 0x32, 0x20, 0x06, 0xb6, 0x7b,
0xdd, 0xc7, 0xbb, 0x7b, 0x77, 0xf7, 0x0e, 0xe0, 0x17, 0xeb, 0xea, 0x5d, 0xab, 0x95, 0x51, 0x38, 0x77, 0xef, 0xde, 0xf3, 0xdd, 0x19, 0xe0, 0x8b, 0xd5, 0xc5, 0xb2, 0xd2, 0xca, 0x28, 0x3c, 0x36,
0x31, 0x43, 0x2b, 0x3a, 0x32, 0xf8, 0xe0, 0x5b, 0x6e, 0xce, 0xaa, 0xc1, 0x2f, 0x20, 0xe5, 0x5a, 0x6d, 0x25, 0x6a, 0xd2, 0xfa, 0xe4, 0x2d, 0x37, 0x3b, 0x55, 0xe2, 0x0b, 0x88, 0xb9, 0x16, 0xcc,
0x30, 0x23, 0xf2, 0xa8, 0x88, 0xca, 0x87, 0x2f, 0x37, 0x3b, 0x87, 0xda, 0x59, 0x48, 0xe5, 0x12, 0x88, 0x34, 0xca, 0xa2, 0xfc, 0xff, 0xe5, 0x7c, 0xe9, 0x58, 0x4b, 0x4b, 0x59, 0xb9, 0xc2, 0x7a,
0xfb, 0x19, 0x0d, 0x10, 0xfc, 0x0c, 0xe6, 0x9c, 0x49, 0x99, 0xc7, 0x0e, 0xba, 0x9a, 0x42, 0x99, 0x40, 0x03, 0x05, 0x9f, 0xc3, 0x88, 0x33, 0x29, 0xd3, 0xa1, 0xa3, 0xce, 0xfa, 0x54, 0x26, 0xe5,
0x94, 0xfb, 0x19, 0x75, 0x69, 0xfc, 0x08, 0x62, 0x33, 0xe4, 0xa8, 0x88, 0xca, 0x84, 0xc6, 0x66, 0x7a, 0x40, 0x5d, 0x19, 0x1f, 0xc1, 0xd0, 0xb4, 0x29, 0xca, 0xa2, 0x7c, 0x4c, 0x87, 0xa6, 0xbd,
0x78, 0xf7, 0x00, 0x92, 0x9f, 0x4c, 0xf6, 0x82, 0xbc, 0xf6, 0xd4, 0xbe, 0x2f, 0xc6, 0x30, 0x6f, 0xfb, 0x07, 0xe3, 0x4f, 0x26, 0x1b, 0x41, 0xae, 0xbd, 0xb5, 0xd7, 0xc5, 0x18, 0x46, 0x25, 0x2b,
0x58, 0xed, 0x89, 0x33, 0xea, 0x6c, 0x1b, 0xe3, 0xea, 0x20, 0x1c, 0xc3, 0x92, 0x3a, 0x9b, 0x7c, 0xbc, 0x71, 0x42, 0x5d, 0x6c, 0x73, 0x5c, 0x6d, 0x84, 0x73, 0x98, 0x52, 0x17, 0x93, 0x17, 0x98,
0x85, 0xc5, 0x95, 0x02, 0x3f, 0x86, 0x05, 0x57, 0x8d, 0xd1, 0x8c, 0x9b, 0x50, 0x37, 0xfa, 0x78, 0x74, 0x16, 0xf8, 0x04, 0x26, 0x5c, 0x95, 0x46, 0x33, 0x6e, 0x42, 0xdf, 0x01, 0xe3, 0x05, 0xc4,
0x0b, 0x69, 0x2d, 0xcc, 0x49, 0x1d, 0x5c, 0x75, 0x46, 0x83, 0x87, 0x9f, 0x00, 0xb4, 0x4c, 0xb3, 0x85, 0x30, 0x5b, 0xb5, 0x71, 0xdd, 0x09, 0x0d, 0x08, 0x9f, 0x02, 0x54, 0x4c, 0xb3, 0x42, 0x18,
0x5a, 0x18, 0xa1, 0xbb, 0x1c, 0x15, 0xa8, 0x44, 0x74, 0x12, 0x21, 0xcf, 0x61, 0xf3, 0xa3, 0x17, 0xa1, 0xeb, 0x14, 0x65, 0x28, 0x47, 0xb4, 0x97, 0x21, 0x39, 0xe0, 0x8f, 0x46, 0xe8, 0x76, 0xb5,
0x7a, 0xa8, 0x4e, 0x82, 0x5f, 0x2a, 0xd5, 0xb8, 0x66, 0x37, 0x86, 0x23, 0xbf, 0x23, 0xd8, 0x7a, 0x15, 0x7c, 0xbf, 0xea, 0xd4, 0x7e, 0x78, 0x1d, 0x39, 0x83, 0x84, 0x37, 0xb5, 0x51, 0xc5, 0x83,
0xa4, 0x5b, 0xe0, 0xa3, 0x66, 0x4d, 0xc7, 0xfc, 0x19, 0xfd, 0xca, 0xd1, 0x75, 0xe5, 0xb1, 0x3c, 0x7a, 0xb7, 0x84, 0x5d, 0xf9, 0xa6, 0xd2, 0x28, 0x43, 0x96, 0x60, 0x63, 0x72, 0x03, 0x73, 0xbf,
0xbe, 0xb1, 0x1b, 0xfa, 0xbb, 0xdb, 0x64, 0xe6, 0xf9, 0x9d, 0x99, 0x93, 0x7f, 0x67, 0xc6, 0x6b, 0xaa, 0x4e, 0x26, 0x10, 0x7f, 0x9d, 0x33, 0x09, 0x73, 0x3e, 0xc3, 0xcc, 0xae, 0xaf, 0xdf, 0xfa,
0x40, 0x47, 0x21, 0xf2, 0xb4, 0x88, 0x4a, 0x44, 0xad, 0x49, 0x9e, 0x42, 0xc6, 0xfb, 0xce, 0xa8, 0x97, 0x71, 0x17, 0x10, 0x6b, 0x51, 0x37, 0xd2, 0xb8, 0x0b, 0x20, 0x1a, 0x10, 0x79, 0x82, 0xa9,
0xfa, 0x83, 0xfa, 0x6e, 0xa9, 0xce, 0xcd, 0x51, 0xe5, 0x51, 0x81, 0x2c, 0xbd, 0xb5, 0xc9, 0x1b, 0x54, 0x9c, 0xc9, 0x7b, 0x66, 0x98, 0xd5, 0x3e, 0x06, 0xb4, 0x17, 0xad, 0x93, 0x9d, 0x52, 0x1b,
0xd8, 0x78, 0x19, 0xab, 0x70, 0xb0, 0x00, 0xbc, 0xab, 0x41, 0x16, 0x34, 0xf8, 0x02, 0x2b, 0x2b, 0x5a, 0xb7, 0x4a, 0x8b, 0x47, 0x7b, 0xaa, 0x70, 0x80, 0x03, 0x76, 0x2f, 0x69, 0xb4, 0xaf, 0x21,
0xed, 0xb4, 0xf4, 0x7f, 0xa4, 0xd8, 0x42, 0xaa, 0x45, 0xd7, 0x4b, 0xe3, 0x8e, 0x80, 0x68, 0xf0, 0x5f, 0xeb, 0xf0, 0x6b, 0xec, 0xfe, 0xd7, 0xd5, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xfa,
0xc8, 0x67, 0x58, 0x4a, 0xc5, 0x99, 0x7c, 0xcf, 0x0c, 0xb3, 0xbd, 0xd7, 0x80, 0x2e, 0xc2, 0xdf, 0x9e, 0x4d, 0x6d, 0x02, 0x00, 0x00,
0x73, 0x49, 0xad, 0x69, 0xd9, 0x5a, 0x2d, 0x3e, 0xd9, 0x37, 0x0a, 0xcf, 0x31, 0xfa, 0x6e, 0x92,
0x5e, 0xfb, 0x9c, 0x3f, 0xee, 0xe8, 0x7f, 0x4b, 0xdd, 0xef, 0xbf, 0xfa, 0x13, 0x00, 0x00, 0xff,
0xff, 0xb4, 0xb4, 0xce, 0xf0, 0x09, 0x03, 0x00, 0x00,
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment