Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
chain33-sdk-go
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
chain33-sdk-go
Commits
bd668bac
Commit
bd668bac
authored
Nov 09, 2021
by
harrylee
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add data swap method
parent
44887f8c
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
114 additions
and
117 deletions
+114
-117
jsonclient.go
client/jsonclient.go
+40
-33
broker.go
dapp/broker/broker.go
+2
-25
broker.proto
proto/broker.proto
+7
-4
broker.pb.go
types/broker.pb.go
+65
-55
No files found.
client/jsonclient.go
View file @
bd668bac
...
@@ -301,77 +301,84 @@ func (client *JSONClient) QueryBlockInfo(start, end int64, isDetail bool) (*Bloc
...
@@ -301,77 +301,84 @@ func (client *JSONClient) QueryBlockInfo(start, end int64, isDetail bool) (*Bloc
return
&
res
,
nil
return
&
res
,
nil
}
}
// 调用chaincode
// 发布跨链事件
func
(
client
*
JSONClient
)
Invoke
(
requst
*
Request
,
privateKey
string
)
(
*
Response
,
error
)
{
func
(
client
*
JSONClient
)
EmitDataSwapInterchainEvent
(
dstServiceID
,
args
,
argscb
,
argsrb
string
,
privateKey
string
)
(
*
Response
,
error
)
{
// FIXME 这里需完善
// FIXME 这里需完善 funcName="interchainGet,interchainSet," txType=0 表示是存在类数据交换
if
requst
.
Exec
==
storage
.
StorageX
{
tx
,
err
:=
broker
.
EmitInterchainEvent
(
""
,
dstServiceID
,
"interchainGet,interchainSet,"
,
args
,
argsrb
,
argsrb
,
0
)
switch
requst
.
Fcn
{
case
"set"
,
"ContentStorage"
:
tx
,
err
:=
storage
.
CreateContentStorageTx
(
client
.
prefix
,
0
,
string
(
requst
.
Args
[
0
]),
nil
,
string
(
requst
.
Args
[
1
]))
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
return
client
.
SendTransactionSync
(
privateKey
,
tx
)
return
client
.
SendTransactionSync
(
privateKey
,
tx
)
}
}
return
nil
,
fmt
.
Errorf
(
"not matching execution or method!"
)
}
}
// TODO 执行请求
// TODO 执行请求
func
(
client
*
JSONClient
)
Execute
(
requst
*
Request
,
privateKey
string
)
(
*
Response
,
error
)
{
func
(
client
*
JSONClient
)
Execute
(
requst
*
Request
,
privateKey
string
)
(
*
Response
,
error
)
{
if
requst
.
Exec
==
broker
.
BrokerX
{
if
requst
.
Exec
==
broker
.
BrokerX
{
switch
requst
.
Fcn
{
switch
requst
.
Fcn
{
case
"invokeInterchain"
:
case
"invokeInterchain"
:
srcChainServiceID
:=
string
(
requst
.
Args
[
0
])
srcChainServiceID
:=
string
(
requst
.
Args
[
0
])
sequenceNum
,
err
:=
strconv
.
ParseUint
(
string
(
requst
.
Args
[
1
]),
10
,
64
)
sequenceNum
,
err
:=
strconv
.
ParseUint
(
string
(
requst
.
Args
[
1
]),
10
,
64
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"cannot parse %s to uint64"
,
string
(
requst
.
Args
[
1
]))
return
nil
,
fmt
.
Errorf
(
"cannot parse %s to uint64"
,
string
(
requst
.
Args
[
1
]))
}
}
targetCID
:=
string
(
requst
.
Args
[
2
])
targetCID
:=
string
(
requst
.
Args
[
2
])
reqType
,
err
:=
strconv
.
ParseUint
(
string
(
requst
.
Args
[
3
]),
10
,
64
)
reqType
,
err
:=
strconv
.
ParseUint
(
string
(
requst
.
Args
[
3
]),
10
,
64
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"cannot parse %s to uint64"
,
string
(
requst
.
Args
[
3
]))
return
nil
,
fmt
.
Errorf
(
"cannot parse %s to uint64"
,
string
(
requst
.
Args
[
3
]))
}
}
if
tx
,
err
:=
broker
.
UpdateIndex
(
""
,
srcChainServiceID
,
targetCID
,
sequenceNum
,
reqType
,
nil
);
err
==
nil
{
if
tx
,
err
:=
broker
.
UpdateIndex
(
""
,
srcChainServiceID
,
targetCID
,
sequenceNum
,
reqType
,
nil
);
err
==
nil
{
resp
,
err
:=
client
.
SendTransactionSync
(
privateKey
,
tx
)
resp
,
err
:=
client
.
SendTransactionSync
(
privateKey
,
tx
)
if
err
!=
nil
{
if
err
!=
nil
{
return
resp
,
err
return
resp
,
err
}
}
//splitedCID[1]就是合约名称
//splitedCID[1]就是合约名称
splitedCID
:=
strings
.
Split
(
targetCID
,
"&"
)
splitedCID
:=
strings
.
Split
(
targetCID
,
"&"
)
if
len
(
splitedCID
)
!=
2
{
if
len
(
splitedCID
)
!=
2
{
return
nil
,
fmt
.
Errorf
(
"Target chaincode id %s is not valid"
,
targetCID
)
return
nil
,
fmt
.
Errorf
(
"Target chaincode id %s is not valid"
,
targetCID
)
}
}
callFunc
:=
&
CallFunc
{}
callFunc
:=
&
CallFunc
{}
if
err
:=
json
.
Unmarshal
(
requst
.
Args
[
4
],
callFunc
);
err
!=
nil
{
if
err
:=
json
.
Unmarshal
(
requst
.
Args
[
4
],
callFunc
);
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"unmarshal call func failed for %s"
,
requst
.
Args
[
4
])
return
nil
,
fmt
.
Errorf
(
"unmarshal call func failed for %s"
,
requst
.
Args
[
4
])
}
}
// 调用相应链码, (链码名称,参数,通道名称)
// 调用相应链码, (链码名称,参数,通道名称)
if
splitedCID
[
1
]
==
storage
.
StorageX
{
if
splitedCID
[
1
]
==
storage
.
StorageX
{
//interchainGet方法是在sdk封装的,用于支持跨链之前数据的查询
//interchainGet方法是在sdk封装的,用于支持跨链之前数据的查询
switch
callFunc
.
Func
{
switch
callFunc
.
Func
{
case
"interchainGet"
:
case
"interchainGet"
:
return
client
.
InterChainGet
(
string
(
callFunc
.
Args
[
0
]))
response
,
err
:=
client
.
InterChainGet
(
string
(
callFunc
.
Args
[
0
]))
if
err
!=
nil
{
return
resp
,
err
}
//携带TXhash
response
.
Message
=
resp
.
Message
return
response
,
err
case
"interchainSet"
:
//跨链set kv
return
client
.
InterChainSet
(
string
(
callFunc
.
Args
[
0
]),
string
(
callFunc
.
Args
[
1
]),
privateKey
)
}
}
}
else
{
}
else
{
return
nil
,
fmt
.
Errorf
(
"can't support exec %s"
,
splitedCID
[
1
])
return
nil
,
fmt
.
Errorf
(
"can't support exec %s"
,
splitedCID
[
1
])
}
}
}
}
}
}
}
}
return
nil
,
nil
return
nil
,
fmt
.
Errorf
(
"not matching execution or method!"
)
}
}
//包装适配跨链插件调用
func
(
client
*
JSONClient
)
InterChainSet
(
key
,
value
string
)
(
*
Response
,
error
)
{
//包装适配跨链插件调用
return
nil
,
nil
func
(
client
*
JSONClient
)
InterChainSet
(
key
,
value
,
privateKey
string
)
(
*
Response
,
error
)
{
tx
,
err
:=
storage
.
CreateContentStorageTx
(
""
,
0
,
key
,
nil
,
value
)
if
err
!=
nil
{
return
nil
,
err
}
resp
,
err
:=
client
.
SendTransactionSync
(
privateKey
,
tx
)
return
resp
,
err
}
}
//包装适配跨链插件调用
//包装适配跨链插件调用
func
(
client
*
JSONClient
)
InterChainGet
(
key
string
)
(
*
Response
,
error
)
{
func
(
client
*
JSONClient
)
InterChainGet
(
key
string
)
(
*
Response
,
error
)
{
jsonraw
,
err
:=
json
.
Marshal
(
&
types
.
QueryStorage
{
TxHash
:
key
})
jsonraw
,
err
:=
json
.
Marshal
(
&
types
.
QueryStorage
{
TxHash
:
key
})
...
@@ -388,9 +395,9 @@ func (client *JSONClient) InterChainGet(key string) (*Response, error) {
...
@@ -388,9 +395,9 @@ func (client *JSONClient) InterChainGet(key string) (*Response, error) {
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
storage
:=
data
.
(
*
types
.
Storage
)
storage
:=
data
.
(
*
types
.
Storage
)
//这里暂时就去明文存证内容
//这里暂时就去明文存证内容
resp
:=
&
Response
{
OK
:
true
,
Message
:
key
,
Data
:
storage
.
GetContentStorage
()
.
GetContent
(
)}
resp
:=
&
Response
{
OK
:
true
,
Message
:
key
,
Data
:
[]
byte
(
storage
.
GetContentStorage
()
.
GetValue
()
)}
return
resp
,
nil
return
resp
,
nil
}
}
...
...
dapp/broker/broker.go
View file @
bd668bac
...
@@ -9,18 +9,8 @@ import (
...
@@ -9,18 +9,8 @@ import (
)
)
// 构造发布跨链交易事件交易
// 构造发布跨链交易事件交易
func
EmitInterchainEvent
(
paraName
,
dstServiceID
,
funcName
string
,
args
[]
string
,
txType
uint64
)
(
*
types
.
Transaction
,
error
)
{
func
EmitInterchainEvent
(
paraName
,
dstServiceID
,
funcName
string
,
args
,
argscb
,
argsrb
string
,
txType
uint64
)
(
*
types
.
Transaction
,
error
)
{
//目的链ID,固定格式0x000001
payload
:=
&
types
.
BrokerAction
{
Ty
:
TyEmitInterchainEventAction
,
Value
:
&
types
.
BrokerAction_EmitInterchainEvent
{
EmitInterchainEvent
:
&
types
.
InterchainEvent
{
DstServiceID
:
dstServiceID
,
Type
:
txType
,
Func
:
funcName
,
Args
:
args
,
Argscb
:
argscb
,
Argsrb
:
argsrb
}}}
//string dstServiceID = 2;
////源链ID,固定格式0x000002
//string srcServiceID = 3;
////跨链交易类型 0表示storage,1表示coins,2表示token......
//uint64 type =4;
////调用方法
//string func = 5;
////参数列表
//repeated string args = 6;
payload
:=
&
types
.
BrokerAction
{
Ty
:
TyEmitInterchainEventAction
,
Value
:
&
types
.
BrokerAction_EmitInterchainEvent
{
EmitInterchainEvent
:
&
types
.
InterchainEvent
{
DstServiceID
:
dstServiceID
,
Type
:
txType
,
Func
:
funcName
,
Args
:
args
}}}
if
paraName
==
""
{
if
paraName
==
""
{
tx
:=
&
types
.
Transaction
{
Execer
:
[]
byte
(
BrokerX
),
Payload
:
types
.
Encode
(
payload
),
Fee
:
1e5
,
Nonce
:
rand
.
Int63n
(
time
.
Now
()
.
UnixNano
()),
To
:
Addr
}
tx
:=
&
types
.
Transaction
{
Execer
:
[]
byte
(
BrokerX
),
Payload
:
types
.
Encode
(
payload
),
Fee
:
1e5
,
Nonce
:
rand
.
Int63n
(
time
.
Now
()
.
UnixNano
()),
To
:
Addr
}
return
tx
,
nil
return
tx
,
nil
...
@@ -32,16 +22,6 @@ func EmitInterchainEvent(paraName, dstServiceID, funcName string, args []string,
...
@@ -32,16 +22,6 @@ func EmitInterchainEvent(paraName, dstServiceID, funcName string, args []string,
// 构造更新Index交易
// 构造更新Index交易
func
UpdateIndex
(
paraName
,
srcServiceID
,
dstServiceID
string
,
sequenceNum
,
reqType
uint64
,
response
*
types
.
Response
)
(
*
types
.
Transaction
,
error
)
{
func
UpdateIndex
(
paraName
,
srcServiceID
,
dstServiceID
string
,
sequenceNum
,
reqType
uint64
,
response
*
types
.
Response
)
(
*
types
.
Transaction
,
error
)
{
////当前链已经处理到的位置
//uint64 sequenceNum = 1;
////目的链服务ID,固定格式0x000001
//string dstServiceID = 2;
////源链ID,固定格式0x000002
//string srcServiceID = 3;
////请求类型 0表示信息流入 1表示信息流出 2表示回滚
//uint64 reqType =4;
////响应信息
//Response response = 5;
payload
:=
&
types
.
BrokerAction
{
Ty
:
TyUpdateIndexAction
,
Value
:
&
types
.
BrokerAction_UpdateIndex
{
UpdateIndex
:
&
types
.
UpdateIndex
{
DstServiceID
:
dstServiceID
,
SrcServiceID
:
srcServiceID
,
ReqType
:
reqType
,
SequenceNum
:
sequenceNum
,
Response
:
response
}}}
payload
:=
&
types
.
BrokerAction
{
Ty
:
TyUpdateIndexAction
,
Value
:
&
types
.
BrokerAction_UpdateIndex
{
UpdateIndex
:
&
types
.
UpdateIndex
{
DstServiceID
:
dstServiceID
,
SrcServiceID
:
srcServiceID
,
ReqType
:
reqType
,
SequenceNum
:
sequenceNum
,
Response
:
response
}}}
if
paraName
==
""
{
if
paraName
==
""
{
tx
:=
&
types
.
Transaction
{
Execer
:
[]
byte
(
BrokerX
),
Payload
:
types
.
Encode
(
payload
),
Fee
:
1e5
,
Nonce
:
rand
.
Int63n
(
time
.
Now
()
.
UnixNano
()),
To
:
Addr
}
tx
:=
&
types
.
Transaction
{
Execer
:
[]
byte
(
BrokerX
),
Payload
:
types
.
Encode
(
payload
),
Fee
:
1e5
,
Nonce
:
rand
.
Int63n
(
time
.
Now
()
.
UnixNano
()),
To
:
Addr
}
...
@@ -52,6 +32,3 @@ func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqTy
...
@@ -52,6 +32,3 @@ func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqTy
}
}
}
}
func
EmitInterchainSetEvent
(){
}
proto/broker.proto
View file @
bd668bac
...
@@ -52,7 +52,6 @@ message UpdateIndex {
...
@@ -52,7 +52,6 @@ message UpdateIndex {
//响应信息
//响应信息
Response
response
=
5
;
Response
response
=
5
;
}
}
// 跨链事件
// 跨链事件
message
InterchainEvent
{
message
InterchainEvent
{
//索引值,这个有系统自动生成
//索引值,这个有系统自动生成
...
@@ -63,12 +62,16 @@ message InterchainEvent {
...
@@ -63,12 +62,16 @@ message InterchainEvent {
string
srcServiceID
=
3
;
string
srcServiceID
=
3
;
//跨链交易类型 0表示storage,1表示coins,2表示token......
//跨链交易类型 0表示storage,1表示coins,2表示token......
uint64
type
=
4
;
uint64
type
=
4
;
//调用方法
//方法集合分别表示 当前,回调,回滚方法 用,号分割 比如: "interchainGet,interchainSet,interchainRollback"
string
func
=
5
;
string
func
=
5
;
//参数列表
//参数列表
repeated
string
args
=
6
;
string
args
=
6
;
//回调参数
string
argscb
=
7
;
//回滚参数
string
argsrb
=
8
;
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败
int32
status
=
7
;
//
int32 status = 7;
}
}
//ReceiptBrokerLog
//ReceiptBrokerLog
message
ReceiptBrokerLog
{
message
ReceiptBrokerLog
{
...
...
types/broker.pb.go
View file @
bd668bac
...
@@ -422,12 +422,14 @@ type InterchainEvent struct {
...
@@ -422,12 +422,14 @@ type InterchainEvent struct {
SrcServiceID
string
`protobuf:"bytes,3,opt,name=srcServiceID,proto3" json:"srcServiceID,omitempty"`
SrcServiceID
string
`protobuf:"bytes,3,opt,name=srcServiceID,proto3" json:"srcServiceID,omitempty"`
//跨链交易类型 0表示storage,1表示coins,2表示token......
//跨链交易类型 0表示storage,1表示coins,2表示token......
Type
uint64
`protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"`
Type
uint64
`protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"`
//
调用方法
//
方法集合分别表示 当前,回调,回滚方法 用,号分割 比如: "interchainGet,interchainSet,interchainRollback"
Func
string
`protobuf:"bytes,5,opt,name=func,proto3" json:"func,omitempty"`
Func
string
`protobuf:"bytes,5,opt,name=func,proto3" json:"func,omitempty"`
//参数列表
//参数列表
Args
[]
string
`protobuf:"bytes,6,rep,name=args,proto3" json:"args,omitempty"`
Args
string
`protobuf:"bytes,6,opt,name=args,proto3" json:"args,omitempty"`
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败
//回调参数
Status
int32
`protobuf:"varint,7,opt,name=status,proto3" json:"status,omitempty"`
Argscb
string
`protobuf:"bytes,7,opt,name=argscb,proto3" json:"argscb,omitempty"`
//回滚参数
Argsrb
string
`protobuf:"bytes,8,opt,name=argsrb,proto3" json:"argsrb,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:"-"`
...
@@ -493,18 +495,25 @@ func (m *InterchainEvent) GetFunc() string {
...
@@ -493,18 +495,25 @@ func (m *InterchainEvent) GetFunc() string {
return
""
return
""
}
}
func
(
m
*
InterchainEvent
)
GetArgs
()
[]
string
{
func
(
m
*
InterchainEvent
)
GetArgs
()
string
{
if
m
!=
nil
{
if
m
!=
nil
{
return
m
.
Args
return
m
.
Args
}
}
return
nil
return
""
}
}
func
(
m
*
InterchainEvent
)
Get
Status
()
int32
{
func
(
m
*
InterchainEvent
)
Get
Argscb
()
string
{
if
m
!=
nil
{
if
m
!=
nil
{
return
m
.
Status
return
m
.
Argscb
}
}
return
0
return
""
}
func
(
m
*
InterchainEvent
)
GetArgsrb
()
string
{
if
m
!=
nil
{
return
m
.
Argsrb
}
return
""
}
}
//ReceiptBrokerLog
//ReceiptBrokerLog
...
@@ -1084,52 +1093,53 @@ func init() {
...
@@ -1084,52 +1093,53 @@ func init() {
}
}
var
fileDescriptor_f209535e190f2bed
=
[]
byte
{
var
fileDescriptor_f209535e190f2bed
=
[]
byte
{
// 711 bytes of a gzipped FileDescriptorProto
// 724 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xbc
,
0x55
,
0x4f
,
0x4f
,
0xdb
,
0x4a
,
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xbc
,
0x55
,
0x5f
,
0x4f
,
0xdb
,
0x48
,
0x10
,
0x8f
,
0x1d
,
0x3b
,
0x90
,
0x49
,
0x20
,
0xbc
,
0x85
,
0x87
,
0xac
,
0x77
,
0x78
,
0x2f
,
0xcf
,
0xe2
,
0x10
,
0x8f
,
0x1d
,
0x3b
,
0x24
,
0x93
,
0x40
,
0xb8
,
0x85
,
0x43
,
0xd6
,
0x3d
,
0xdc
,
0x71
,
0x16
,
0x0f
,
0x40
,
0x5b
,
0x89
,
0x4a
,
0x20
,
0xb5
,
0x55
,
0xd5
,
0x4b
,
0x42
,
0x91
,
0x92
,
0x0a
,
0x28
,
0xdd
,
0xfe
,
0xdc
,
0x9d
,
0xc4
,
0x49
,
0x20
,
0xb5
,
0x55
,
0xd5
,
0x97
,
0x84
,
0x22
,
0x25
,
0x15
,
0x50
,
0xba
,
0xfd
,
0x51
,
0x7b
,
0x5c
,
0x9c
,
0x21
,
0x6c
,
0x49
,
0xd6
,
0x66
,
0xbd
,
0x46
,
0xf8
,
0xa3
,
0xf4
,
0x9b
,
0xf4
,
0xa3
,
0xf6
,
0x71
,
0xe3
,
0x0c
,
0x61
,
0x4b
,
0x62
,
0x9b
,
0xf5
,
0x1a
,
0xe1
,
0x8f
,
0xd2
,
0x6f
,
0xd2
,
0xd4
,
0x4b
,
0xbf
,
0x58
,
0xb5
,
0xeb
,
0x4d
,
0xe2
,
0x04
,
0xaa
,
0xaa
,
0x08
,
0xf5
,
0x12
,
0xed
,
0xfc
,
0xa7
,
0x7e
,
0x91
,
0x7e
,
0x99
,
0x6a
,
0xff
,
0x24
,
0x71
,
0x02
,
0x55
,
0x55
,
0x84
,
0xfa
,
0x02
,
0x3b
,
0x66
,
0x76
,
0x67
,
0xf2
,
0x9b
,
0xf9
,
0x8d
,
0xa1
,
0x79
,
0x2a
,
0xe3
,
0x0b
,
0x94
,
0x3b
,
0x89
,
0x8c
,
0xbf
,
0x99
,
0xdd
,
0x99
,
0xfc
,
0x66
,
0x7e
,
0x63
,
0x68
,
0x0d
,
0x44
,
0x72
,
0x89
,
0x62
,
0x2f
,
0x15
,
0x55
,
0x4c
,
0x7c
,
0x95
,
0x27
,
0x98
,
0x86
,
0x5f
,
0x5d
,
0x68
,
0x76
,
0x0d
,
0xde
,
0x89
,
0x14
,
0x8f
,
0x89
,
0x4c
,
0x88
,
0x2f
,
0x8b
,
0x14
,
0xb3
,
0xf0
,
0xb3
,
0x0b
,
0xad
,
0xae
,
0xc6
,
0x3b
,
0x91
,
0xe4
,
0x05
,
0xf9
,
0x1f
,
0x3c
,
0x2e
,
0xb8
,
0x0a
,
0x9c
,
0xb6
,
0xb3
,
0xdd
,
0xd8
,
0x6d
,
0xec
,
0x98
,
0xb0
,
0x49
,
0x4c
,
0xfe
,
0x06
,
0x8f
,
0xc7
,
0x5c
,
0x06
,
0xce
,
0xb6
,
0xb3
,
0xdb
,
0xdc
,
0x6f
,
0xee
,
0xe9
,
0x9d
,
0xbe
,
0xe0
,
0xaa
,
0x57
,
0xa1
,
0xc6
,
0x45
,
0xba
,
0xd0
,
0x92
,
0x38
,
0xe4
,
0xa9
,
0x42
,
0x79
,
0xb0
,
0xbd
,
0x7e
,
0xcc
,
0x65
,
0xaf
,
0x42
,
0xb5
,
0x8b
,
0x74
,
0xa1
,
0x2d
,
0x70
,
0xc4
,
0x33
,
0x89
,
0x70
,
0x8d
,
0x91
,
0x8a
,
0x65
,
0xe0
,
0x9a
,
0xe8
,
0x4d
,
0x1b
,
0x4d
,
0xe7
,
0xbd
,
0xbd
,
0x0a
,
0x5d
,
0xe2
,
0xe8
,
0x06
,
0x23
,
0x99
,
0x88
,
0xc0
,
0xd5
,
0xd1
,
0x5b
,
0x36
,
0x9a
,
0x2e
,
0x7a
,
0x7b
,
0x15
,
0xbc
,
0x40
,
0xb6
,
0xc0
,
0x67
,
0xd9
,
0x80
,
0xab
,
0xa0
,
0x6a
,
0x6e
,
0x36
,
0xed
,
0xcd
,
0x8e
,
0xc6
,
0xba
,
0x7c
,
0x81
,
0xec
,
0x80
,
0xcf
,
0xf2
,
0x21
,
0x97
,
0x41
,
0x55
,
0xdf
,
0x6c
,
0xd9
,
0x9b
,
0x1d
,
0x7a
,
0x15
,
0x5a
,
0x38
,
0xc9
,
0x2b
,
0x58
,
0xc7
,
0x31
,
0x57
,
0x7d
,
0xa1
,
0x50
,
0x46
,
0xe7
,
0x8c
,
0x85
,
0xf5
,
0x2a
,
0xd4
,
0x38
,
0xc9
,
0x0b
,
0xd8
,
0xc0
,
0x09
,
0x97
,
0xfd
,
0x58
,
0xa2
,
0x88
,
0x2e
,
0x8b
,
0x83
,
0x2b
,
0x14
,
0x2a
,
0xf0
,
0xe6
,
0xb2
,
0x2d
,
0x78
,
0x7b
,
0x15
,
0x7a
,
0xdb
,
0x25
,
0xf2
,
0x18
,
0x8f
,
0x8f
,
0xae
,
0x31
,
0x96
,
0x81
,
0xb7
,
0x90
,
0x6d
,
0xc9
,
0xdb
,
0xab
,
0xd0
,
0xbb
,
0x2e
,
0x04
,
0x1a
,
0x59
,
0x32
,
0x60
,
0x0a
,
0xfb
,
0x62
,
0x80
,
0xd7
,
0x81
,
0x6f
,
0xde
,
0x20
,
0xf6
,
0x8d
,
0x91
,
0x47
,
0xd0
,
0xcc
,
0xd3
,
0x21
,
0x93
,
0xd8
,
0x8f
,
0x87
,
0x78
,
0x13
,
0xf8
,
0xfa
,
0x0d
,
0x62
,
0xf7
,
0x33
,
0x4f
,
0xaf
,
0x42
,
0xcb
,
0x81
,
0x64
,
0x15
,
0x5c
,
0x95
,
0x07
,
0xb5
,
0xb6
,
0xb3
,
0xed
,
0xdf
,
0x78
,
0x3b
,
0xf7
,
0xf4
,
0x2a
,
0xb4
,
0x1c
,
0x48
,
0xd6
,
0xc0
,
0x95
,
0x45
,
0x50
,
0xdb
,
0x76
,
0x53
,
0x57
,
0xe5
,
0xdd
,
0x25
,
0xf0
,
0xaf
,
0xd8
,
0x28
,
0xc3
,
0xf0
,
0x05
,
0x78
,
0x9a
,
0x16
,
0xb2
,
0x76
,
0x7d
,
0xea
,
0xca
,
0xa2
,
0xbb
,
0x02
,
0xfe
,
0x35
,
0x1b
,
0xe7
,
0x18
,
0x3e
,
0x03
,
0x4f
,
0xd1
,
0x01
,
0xfe
,
0xe9
,
0xf5
,
0x79
,
0x7f
,
0x60
,
0x28
,
0xab
,
0xd3
,
0xc2
,
0x20
,
0xff
,
0x02
,
0xb0
,
0x24
,
0x42
,
0x36
,
0xc1
,
0x1f
,
0xdc
,
0x5c
,
0xf4
,
0x87
,
0x9a
,
0xb2
,
0x06
,
0x35
,
0x06
,
0xf9
,
0x13
,
0x80
,
0xd9
,
0xd7
,
0xf9
,
0xfb
,
0x03
,
0xc3
,
0x4f
,
0x9d
,
0x96
,
0x90
,
0x70
,
0x0f
,
0x5a
,
0x0b
,
0x34
,
0x91
,
0xa5
,
0xe9
,
0xa1
,
0xca
,
0xdf
,
0x1f
,
0x6a
,
0x7e
,
0x1a
,
0xb4
,
0x84
,
0x84
,
0x07
,
0xd0
,
0x5e
,
0xa2
,
0x36
,
0x34
,
0xb0
,
0x38
,
0x1e
,
0xb3
,
0x31
,
0xda
,
0xe7
,
0xca
,
0x50
,
0xd8
,
0x01
,
0xdf
,
0x30
,
0xf4
,
0x89
,
0x6c
,
0x43
,
0x13
,
0xcd
,
0xf1
,
0x94
,
0x4d
,
0xd0
,
0x3e
,
0x57
,
0x86
,
0xc2
,
0x0e
,
0xf8
,
0x9a
,
0xeb
,
0x50
,
0xb2
,
0x09
,
0xb5
,
0x54
,
0x31
,
0x95
,
0xa5
,
0x36
,
0xb7
,
0xb5
,
0xc2
,
0xc7
,
0xd0
,
0x3c
,
0xa1
,
0x1f
,
0x87
,
0x92
,
0x2d
,
0xa8
,
0x65
,
0x92
,
0xc9
,
0x3c
,
0xb3
,
0xb9
,
0xad
,
0x15
,
0xfe
,
0x0f
,
0x89
,
0x47
,
0x23
,
0x2e
,
0x86
,
0x05
,
0x2d
,
0xff
,
0x81
,
0x37
,
0x46
,
0xc5
,
0x16
,
0xfa
,
0x7d
,
0x84
,
0xad
,
0xb3
,
0x64
,
0x3c
,
0xe6
,
0xf1
,
0xc8
,
0xd0
,
0xf2
,
0x17
,
0x78
,
0x13
,
0x94
,
0x6c
,
0xa9
,
0xdf
,
0x8a
,
0x51
,
0xe3
,
0x08
,
0xbf
,
0x39
,
0xd0
,
0x28
,
0xd1
,
0xa3
,
0x53
,
0xa7
,
0x78
,
0x99
,
0xa1
,
0x88
,
0x27
,
0x28
,
0x19
,
0xd5
,
0x8e
,
0xf0
,
0x8b
,
0x03
,
0xcd
,
0x12
,
0x3d
,
0x2a
,
0x75
,
0x86
,
0x57
,
0x39
,
0xf0
,
0x38
,
0x1b
,
0x9b
,
0x7b
,
0x1e
,
0x2d
,
0x43
,
0x24
,
0x84
,
0xe6
,
0x20
,
0x55
,
0x6f
,
0x51
,
0x5e
,
0xc6
,
0x11
,
0x9e
,
0xe6
,
0x13
,
0x7d
,
0xcf
,
0xa3
,
0x65
,
0x88
,
0x84
,
0xd0
,
0x1a
,
0x66
,
0xf2
,
0x35
,
0xf1
,
0x08
,
0xfb
,
0x2f
,
0x6d
,
0x01
,
0x73
,
0x98
,
0x8e
,
0x49
,
0x65
,
0x34
,
0x8b
,
0xa9
,
0x16
,
0x31
,
0x8a
,
0x6b
,
0x1e
,
0x61
,
0xff
,
0xb9
,
0x2d
,
0x60
,
0x01
,
0x53
,
0x31
,
0x99
,
0x88
,
0xe6
,
0x31
,
0x55
,
0x65
,
0x8c
,
0x04
,
0xb0
,
0x24
,
0xf1
,
0xf2
,
0x5d
,
0x9e
,
0xa0
,
0xe9
,
0xb8
,
0x47
,
0x27
,
0x26
,
0x79
,
0x13
,
0x53
,
0xc6
,
0x48
,
0x00
,
0x2b
,
0x02
,
0xaf
,
0xde
,
0x14
,
0x29
,
0xea
,
0x8e
,
0x7b
,
0x74
,
0x6a
,
0x04
,
0xcb
,
0x12
,
0xd3
,
0x24
,
0x16
,
0x29
,
0xda
,
0x46
,
0xb6
,
0xa6
,
0xa3
,
0x57
,
0xc0
,
0x74
,
0x1a
,
0x92
,
0xff
,
0xa0
,
0x2e
,
0x30
,
0x4b
,
0x93
,
0x38
,
0x43
,
0xdb
,
0xc8
,
0xf6
,
0x6c
,
0xf4
,
0x0c
,
0x4c
,
0x10
,
0x7e
,
0x77
,
0xa0
,
0xb5
,
0x38
,
0x0c
,
0x1b
,
0xe0
,
0x73
,
0x33
,
0x06
,
0x45
,
0xf9
,
0x85
,
0x71
,
0x67
,
0x01
,
0xe1
,
0x57
,
0x07
,
0xda
,
0xcb
,
0xc3
,
0xb0
,
0x09
,
0x3e
,
0xd7
,
0x63
,
0x60
,
0xca
,
0x37
,
0x6f
,
0x85
,
0x13
,
0xf0
,
0xd4
,
0xac
,
0x6a
,
0x73
,
0xd6
,
0xd8
,
0x59
,
0x26
,
0x22
,
0x53
,
0x6e
,
0x9d
,
0xc6
,
0x83
,
0x15
,
0x4e
,
0xc0
,
0x93
,
0xf3
,
0xaa
,
0xf5
,
0x59
,
0x61
,
0xe7
,
0x79
,
0x1c
,
0xe9
,
0x72
,
0x9a
,
0xb3
,
0xc6
,
0x98
,
0x1c
,
0xa6
,
0x41
,
0xad
,
0x5d
,
0xd5
,
0x98
,
0x3e
,
0x97
,
0xfa
,
0xb6
,
0x64
,
0x1b
,
0x54
,
0x9f
,
0x15
,
0xc6
,
0xc4
,
0x28
,
0xd3
,
0xc3
,
0xd5
,
0xa0
,
0xfa
,
0xac
,
0xfa
,
0xa6
,
0xfe
,
0x46
,
0x6e
,
0xd2
,
0xb7
,
0x2f
,
0x2e
,
0xac
,
0x51
,
0x8c
,
0x90
,
0x27
,
0xaa
,
0xd0
,
0xeb
,
0x61
,
0x3c
,
0x47
,
0x83
,
0x60
,
0xc5
,
0xf4
,
0xcd
,
0x58
,
0x53
,
0x5c
,
0x0c
,
0x82
,
0xfa
,
0x1c
,
0x17
,
0x83
,
0xf0
,
0xbc
,
0x4d
,
0x89
,
0xce
,
0x9d
,
0x95
,
0xe8
,
0xde
,
0x41
,
0x89
,
0xd5
,
0x7b
,
0x50
,
0xa2
,
0xf7
,
0x7b
,
0x93
,
0x0b
,
0xeb
,
0x14
,
0x23
,
0xe4
,
0xa9
,
0x34
,
0x3a
,
0x3e
,
0x4e
,
0x46
,
0x77
,
0x29
,
0xd4
,
0xb9
,
0x4a
,
0xf4
,
0x6f
,
0x2a
,
0x51
,
0xc1
,
0xc6
,
0x9b
,
0x0c
,
0x65
,
0xfe
,
0x47
,
0xbb
,
0x1c
,
0x76
,
0x60
,
0xb7
,
0x42
,
0xdd
,
0x7b
,
0x28
,
0xb4
,
0xfa
,
0x00
,
0x0a
,
0xf5
,
0x7e
,
0x4e
,
0xa1
,
0xfe
,
0x6d
,
0x85
,
0xdd
,
0x24
,
0xdc
,
0x9f
,
0x26
,
0x3c
,
0xe4
,
0xa9
,
0x22
,
0x0f
,
0xc1
,
0x1b
,
0xf1
,
0x54
,
0x2f
,
0xd0
,
0x4a
,
0xd8
,
0x7c
,
0x95
,
0xa3
,
0x28
,
0x7e
,
0x69
,
0xf7
,
0xc3
,
0x0e
,
0x6c
,
0xe8
,
0x84
,
0x87
,
0xb3
,
0xea
,
0xcf
,
0xa9
,
0xa1
,
0x26
,
0x26
,
0x6c
,
0xc1
,
0x8a
,
0x29
,
0xfc
,
0x98
,
0x8f
,
0x4e
,
0x98
,
0x64
,
0x84
,
0xc7
,
0x3c
,
0x93
,
0xe4
,
0x5f
,
0xf0
,
0xc6
,
0x3c
,
0x53
,
0x8b
,
0xb5
,
0xfa
,
0x7d
,
0x6a
,
0xa8
,
0xe3
,
0xf0
,
0x2f
,
0x68
,
0x19
,
0xe0
,
0x75
,
0xa6
,
0x14
,
0x4a
,
0xad
,
0xc2
,
0x70
,
0x0d
,
0x56
,
0xed
,
0x8e
,
0x09
,
0xdb
,
0xb0
,
0xaa
,
0x0b
,
0x3f
,
0xe5
,
0xe3
,
0x33
,
0x26
,
0xd8
,
0x24
,
0xfc
,
0x0d
,
0xda
,
0x9f
,
0x13
,
0x16
,
0xf9
,
0x38
,
0x45
,
0x8e
,
0x30
,
0x4d
,
0xd9
,
0x10
,
0xc9
,
0x16
,
0xac
,
0x70
,
0x61
,
0x1a
,
0x78
,
0x99
,
0x4b
,
0x89
,
0x42
,
0xa9
,
0x33
,
0x5c
,
0x87
,
0x35
,
0xfb
,
0xe3
,
0x62
,
0x8b
,
0xbc
,
0x2b
,
0x3b
,
0x61
,
0x5c
,
0xda
,
0x85
,
0x30
,
0x0f
,
0x2e
,
0x2a
,
0xd7
,
0xbd
,
0xa1
,
0xdc
,
0xf0
,
0xd3
,
0x9f
,
0x21
,
0x27
,
0x98
,
0x65
,
0x6c
,
0x84
,
0x64
,
0x07
,
0x56
,
0x79
,
0x6c
,
0x2b
,
0x3b
,
0x63
,
0x5c
,
0x2c
,
0xfd
,
0x7d
,
0x3f
,
0xdd
,
0x05
,
0x28
,
0xe6
,
0xb6
,
0x2f
,
0xce
,
0xe2
,
0x3b
,
0xee
,
0xcc
,
0xcf
,
0xd8
,
0x45
,
0xb1
,
0x08
,
0x2e
,
0x2b
,
0xda
,
0xbd
,
0xa5
,
0xe8
,
0xf0
,
0xc3
,
0x3c
,
0xfd
,
0x43
,
0x3f
,
0xe0
,
0x69
,
0x02
,
0xc8
,
0x83
,
0xe9
,
0xce
,
0xd2
,
0x14
,
0xff
,
0x5d
,
0xda
,
0x59
,
0xe6
,
0xe7
,
0x40
,
0xdd
,
0x05
,
0x30
,
0x73
,
0xdb
,
0x8f
,
0xcf
,
0x93
,
0x7b
,
0xee
,
0xd2
,
0x8f
,
0xe0
,
0x29
,
0x02
,
0xc8
,
0x28
,
0x99
,
0x17
,
0xdb
,
0xeb
,
0x9f
,
0xa7
,
0x50
,
0x9f
,
0x42
,
0x64
,
0x0d
,
0xaa
,
0x17
,
0x98
,
0xdb
,
0x3f
,
0xb3
,
0x5d
,
0xa6
,
0x28
,
0xfe
,
0xbd
,
0xb4
,
0xcb
,
0xf4
,
0x9f
,
0xa3
,
0x58
,
0x8a
,
0xc2
,
0x6c
,
0x9c
,
0xfa
,
0xa8
,
0xeb
,
0x30
,
0x23
,
0x64
,
0x2b
,
0x2e
,
0x8c
,
0xe7
,
0xee
,
0x33
,
0x27
,
0xfc
,
0x00
,
0xb5
,
0x3f
,
0x1e
,
0x43
,
0x63
,
0x06
,
0x91
,
0x75
,
0xa8
,
0x5e
,
0x62
,
0x61
,
0x73
,
0xaa
,
0xa3
,
0xaa
,
0xcb
,
0x93
,
0x5d
,
0x52
,
0xd2
,
0xa4
,
0x53
,
0xd6
,
0xa4
,
0x5e
,
0x50
,
0xe3
,
0x82
,
0x26
,
0x5b
,
0xec
,
0x43
,
0x8f
,
0x90
,
0xad
,
0xd8
,
0x18
,
0x4f
,
0xdd
,
0x27
,
0x4e
,
0xf8
,
0x0e
,
0xea
,
0xd3
,
0x1d
,
0x53
,
0xc4
,
0xd4
,
0x9e
,
0x84
,
0xe5
,
0xa3
,
0x98
,
0x0d
,
0xcc
,
0xe8
,
0x34
,
0xe9
,
0xc4
,
0xdc
,
0x5d
,
0x86
,
0xda
,
0xb1
,
0x8e
,
0x1e
,
0x3e
,
0x6b
,
0xa9
,
0xc5
,
0x35
,
0x31
,
0x34
,
0xd9
,
0x62
,
0xa7
,
0xa6
,
0xf2
,
0x5a
,
0xf1
,
0x1d
,
0x3e
,
0xad
,
0x99
,
0x0f
,
0xf1
,
0xde
,
0x8f
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0x7a
,
0xa4
,
0xac
,
0x18
,
0x27
,
0x6c
,
0xa8
,
0x47
,
0xa7
,
0x45
,
0xa7
,
0xe6
,
0x7e
,
0x1d
,
0x6a
,
0xe6
,
0xfb
,
0x16
,
0xb7
,
0x18
,
0x98
,
0x07
,
0x00
,
0x00
,
0x3c
,
0xa8
,
0xe9
,
0x0f
,
0xf4
,
0xc1
,
0xb7
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0xc1
,
0x11
,
0xe4
,
0xb4
,
0xb0
,
0x07
,
0x00
,
0x00
,
}
}
// Reference imports to suppress errors if they are not otherwise used.
// Reference imports to suppress errors if they are not otherwise used.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment