Commit 0179fec6 authored by QM's avatar QM

supervisionaccount.go code to simplify

parent 6c82ccb0
...@@ -294,7 +294,7 @@ function query_tx() { ...@@ -294,7 +294,7 @@ function query_tx() {
block_wait "${1}" 1 block_wait "${1}" 1
local times=200 local times=200
# local times=10 # local times=10
while true; do while true; do
ret=$(${1} tx query -s "${2}" | jq -r ".tx.hash") ret=$(${1} tx query -s "${2}" | jq -r ".tx.hash")
echo "query hash is ${2}, return ${ret} " echo "query hash is ${2}, return ${ret} "
...@@ -571,7 +571,6 @@ function para_create_nodegroup_gamechain() { ...@@ -571,7 +571,6 @@ function para_create_nodegroup_gamechain() {
fi fi
${PARA_CLI5} para nodegroup addrs ${PARA_CLI5} para nodegroup addrs
} }
function para_cross_transfer_from_parachain() { function para_cross_transfer_from_parachain() {
...@@ -794,7 +793,7 @@ function para_create_nodegroup() { ...@@ -794,7 +793,7 @@ function para_create_nodegroup() {
} }
# $1 status, $2 hash # $1 status, $2 hash
function check_supervision_node_list() { function check_supervision_node_group_list() {
newid=$(${PARA_CLI} para supervision_node list -s "$1" | jq -r ".ids[0].id") newid=$(${PARA_CLI} para supervision_node list -s "$1" | jq -r ".ids[0].id")
if [ "$newid" != "$2" ]; then if [ "$newid" != "$2" ]; then
${PARA_CLI} para supervision_node list -s "$1" ${PARA_CLI} para supervision_node list -s "$1"
...@@ -804,7 +803,7 @@ function check_supervision_node_list() { ...@@ -804,7 +803,7 @@ function check_supervision_node_list() {
} }
# $1 status # $1 status
function check_supervision_node_status() { function check_supervision_node_group_status() {
status=$(${PARA_CLI} para supervision_node status | jq -r ".status") status=$(${PARA_CLI} para supervision_node status | jq -r ".status")
if [ "$status" != "$1" ]; then if [ "$status" != "$1" ]; then
${PARA_CLI} para supervision_node status ${PARA_CLI} para supervision_node status
...@@ -844,9 +843,6 @@ function para_create_supervision_nodegroup_cancel() { ...@@ -844,9 +843,6 @@ function para_create_supervision_nodegroup_cancel() {
id=$txhash id=$txhash
check_balance_1ka "$balancePre" 6 check_balance_1ka "$balancePre" 6
check_supervision_node_list 1 "$id"
check_supervision_node_status 1
check_supervision_node_addr_status 1 "$ADDR_28"
echo "=========== # supervision node group cancel =============" echo "=========== # supervision node group cancel ============="
balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen") balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
...@@ -856,9 +852,43 @@ function para_create_supervision_nodegroup_cancel() { ...@@ -856,9 +852,43 @@ function para_create_supervision_nodegroup_cancel() {
query_tx "${PARA_CLI}" "${txhash}" query_tx "${PARA_CLI}" "${txhash}"
check_balance_1ka "$balancePre" -6 check_balance_1ka "$balancePre" -6
check_supervision_node_list 4 "$id" echo "=========== # ${FUNCNAME} end ============="
check_supervision_node_status 4 }
check_supervision_node_addr_status 4 "$ADDR_28"
function para_create_supervision_nodegroup_quit() {
echo "=========== # ${FUNCNAME} begin ============="
echo "=========== # para chain apply supervision node group 25 ============="
balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
##apply
txhash=$(${PARA_CLI} send para supervision_node apply -a "$ADDR_25" -c 6 -p "$BLSPUB_25" -k "${ADDR_1KA_KEY}")
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
id=$txhash
check_balance_1ka "$balancePre" 6
echo "=========== # para chain approve supervision node group 25 ============="
##approve
txhash=$(${PARA_CLI} send para supervision_node approve -i "$id" -c 6 -k "${SUPER_KEY}")
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
check_supervision_node_addr_status 2 "$ADDR_25"
check_supervision_node_group_list 2 "$id"
check_supervision_node_group_status 2
check_supervision_node_addrs "$ADDR_25"
echo "=========== # para chain quit supervision node group 25 ============="
balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
txhash=$(${PARA_CLI} send para supervision_node quit -a "$ADDR_25" -k "${SUPER_KEY}")
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
check_balance_1ka "$balancePre" -6
check_supervision_node_group_list 3 "$id"
check_supervision_node_group_status 3
check_supervision_node_addr_status 3 "$ADDR_25"
check_supervision_node_addrs null
echo "=========== # ${FUNCNAME} end =============" echo "=========== # ${FUNCNAME} end ============="
} }
...@@ -873,9 +903,6 @@ function para_create_supervision_nodegroup_approve() { ...@@ -873,9 +903,6 @@ function para_create_supervision_nodegroup_approve() {
id=$txhash id=$txhash
check_balance_1ka "$balancePre" 6 check_balance_1ka "$balancePre" 6
check_supervision_node_list 1 "$id"
check_supervision_node_status 1
check_supervision_node_addr_status 1 "$ADDR_28"
echo "=========== # para chain approve supervision node group 28 =============" echo "=========== # para chain approve supervision node group 28 ============="
##approve ##approve
...@@ -883,8 +910,8 @@ function para_create_supervision_nodegroup_approve() { ...@@ -883,8 +910,8 @@ function para_create_supervision_nodegroup_approve() {
echo "tx=$txhash" echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}" query_tx "${PARA_CLI}" "${txhash}"
check_supervision_node_list 2 "$id" check_supervision_node_group_list 2 "$id"
check_supervision_node_status 2 check_supervision_node_group_status 2
check_supervision_node_addr_status 2 "$ADDR_28" check_supervision_node_addr_status 2 "$ADDR_28"
check_supervision_node_addrs "$ADDR_28" check_supervision_node_addrs "$ADDR_28"
...@@ -897,7 +924,6 @@ function para_create_supervision_nodegroup_approve() { ...@@ -897,7 +924,6 @@ function para_create_supervision_nodegroup_approve() {
id=$txhash id=$txhash
check_balance_1ka "$balancePre" 6 check_balance_1ka "$balancePre" 6
check_supervision_node_addr_status 1 "$ADDR_27"
echo "=========== # para chain approve supervision node group 27 =============" echo "=========== # para chain approve supervision node group 27 ============="
##approve ##approve
...@@ -917,7 +943,6 @@ function para_create_supervision_nodegroup_approve() { ...@@ -917,7 +943,6 @@ function para_create_supervision_nodegroup_approve() {
id=$txhash id=$txhash
check_balance_1ka "$balancePre" 6 check_balance_1ka "$balancePre" 6
check_supervision_node_addr_status 1 "$ADDR_26"
echo "=========== # para chain approve supervision node group 26 =============" echo "=========== # para chain approve supervision node group 26 ============="
##approve ##approve
...@@ -928,40 +953,6 @@ function para_create_supervision_nodegroup_approve() { ...@@ -928,40 +953,6 @@ function para_create_supervision_nodegroup_approve() {
check_supervision_node_addr_status 2 "$ADDR_26" check_supervision_node_addr_status 2 "$ADDR_26"
check_supervision_node_addrs "$ADDR_28,$ADDR_27,$ADDR_26" check_supervision_node_addrs "$ADDR_28,$ADDR_27,$ADDR_26"
echo "=========== # ${FUNCNAME} end ============="
}
function para_create_supervision_nodegroup_quit() {
echo "=========== # ${FUNCNAME} begin ============="
echo "=========== # para chain apply supervision node group 25 ============="
balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
##apply
txhash=$(${PARA_CLI} send para supervision_node apply -a "$ADDR_25" -c 6 -p "$BLSPUB_25" -k "${ADDR_1KA_KEY}")
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
id=$txhash
check_balance_1ka "$balancePre" 6
check_supervision_node_addr_status 1 "$ADDR_25"
echo "=========== # para chain approve supervision node group 25 ============="
##approve
txhash=$(${PARA_CLI} send para supervision_node approve -i "$id" -c 6 -k "${SUPER_KEY}")
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
check_supervision_node_addr_status 2 "$ADDR_25"
check_supervision_node_addrs "$ADDR_28,$ADDR_27,$ADDR_26,$ADDR_25"
echo "=========== # para chain quit supervision node group 25 ============="
balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
txhash=$(${PARA_CLI} send para supervision_node quit -a "$ADDR_25" -k "${SUPER_KEY}")
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
check_balance_1ka "$balancePre" -6
check_supervision_node_addr_status 3 "$ADDR_25"
check_supervision_node_addrs "$ADDR_28,$ADDR_27,$ADDR_26"
echo "=========== # para chain apply supervision node group 25 again =============" echo "=========== # para chain apply supervision node group 25 again ============="
balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen") balancePre=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
...@@ -972,7 +963,6 @@ function para_create_supervision_nodegroup_quit() { ...@@ -972,7 +963,6 @@ function para_create_supervision_nodegroup_quit() {
id=$txhash id=$txhash
check_balance_1ka "$balancePre" 6 check_balance_1ka "$balancePre" 6
check_supervision_node_addr_status 1 "$ADDR_25"
echo "=========== # para chain approve supervision node group 25 again =============" echo "=========== # para chain approve supervision node group 25 again ============="
##approve ##approve
...@@ -989,8 +979,8 @@ function para_create_supervision_nodegroup_quit() { ...@@ -989,8 +979,8 @@ function para_create_supervision_nodegroup_quit() {
function para_create_supervision_nodegroup() { function para_create_supervision_nodegroup() {
echo "=========== # ${FUNCNAME} begin =============" echo "=========== # ${FUNCNAME} begin ============="
para_create_supervision_nodegroup_cancel para_create_supervision_nodegroup_cancel
para_create_supervision_nodegroup_approve
para_create_supervision_nodegroup_quit para_create_supervision_nodegroup_quit
para_create_supervision_nodegroup_approve
docker stop "${NODE9}" docker stop "${NODE9}"
echo "=========== # ${FUNCNAME} end =============" echo "=========== # ${FUNCNAME} end ============="
} }
...@@ -1330,8 +1320,8 @@ function privacy_transfer_test() { ...@@ -1330,8 +1320,8 @@ function privacy_transfer_test() {
function para_test() { function para_test() {
echo "=========== # para chain test =============" echo "=========== # para chain test ============="
para_create_nodegroup para_create_nodegroup
para_create_supervision_nodegroup
para_nodegroup_behalf_quit_test para_nodegroup_behalf_quit_test
para_create_supervision_nodegroup
para_create_nodegroup_gamechain para_create_nodegroup_gamechain
token_create "${PARA_CLI}" token_create "${PARA_CLI}"
token_transfer "${PARA_CLI}" token_transfer "${PARA_CLI}"
......
...@@ -1741,7 +1741,7 @@ func supervisionNodeGroupListCmd() *cobra.Command { ...@@ -1741,7 +1741,7 @@ func supervisionNodeGroupListCmd() *cobra.Command {
} }
func getSupervisionNodeGroupListCmdFlags(cmd *cobra.Command) { func getSupervisionNodeGroupListCmdFlags(cmd *cobra.Command) {
cmd.Flags().Int32P("status", "s", 0, "status:1:apply, 2:approve, 3:quit, 4:cancel") cmd.Flags().Int32P("status", "s", 0, "status:2:approve, 3:quit")
_ = cmd.MarkFlagRequired("status") _ = cmd.MarkFlagRequired("status")
} }
...@@ -1766,7 +1766,7 @@ func supervisionNodeGroupList(cmd *cobra.Command, args []string) { ...@@ -1766,7 +1766,7 @@ func supervisionNodeGroupList(cmd *cobra.Command, args []string) {
func getSupervisionNodeInfoCmd() *cobra.Command { func getSupervisionNodeInfoCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "addr_status", Use: "addr_status",
Short: "Get node current status:1:apply, 2:approve, 3:quit, 4:cancel from supervision group", Short: "Get node current status:2:approve, 3:quit from supervision group",
Run: supervisionNodeInfo, Run: supervisionNodeInfo,
} }
addSupervisionNodeInfoCmdFlags(cmd) addSupervisionNodeInfoCmdFlags(cmd)
......
...@@ -190,7 +190,7 @@ func makeRecordReceipt(addr string, commit *pt.ParacrossNodeStatus) *types.Recei ...@@ -190,7 +190,7 @@ func makeRecordReceipt(addr string, commit *pt.ParacrossNodeStatus) *types.Recei
} }
func makeDoneReceipt(cfg *types.Chain33Config, execMainHeight, execHeight int64, commit *pt.ParacrossNodeStatus, func makeDoneReceipt(cfg *types.Chain33Config, execMainHeight, execHeight int64, commit *pt.ParacrossNodeStatus,
most, commitCount, totalCount int32) *types.Receipt { most, commitCount, totalCount, mostSupervisionCount, totalSupervisionCommit, totalSupervisionNodes int32) *types.Receipt {
log := &pt.ReceiptParacrossDone{ log := &pt.ReceiptParacrossDone{
TotalNodes: totalCount, TotalNodes: totalCount,
...@@ -203,6 +203,9 @@ func makeDoneReceipt(cfg *types.Chain33Config, execMainHeight, execHeight int64, ...@@ -203,6 +203,9 @@ func makeDoneReceipt(cfg *types.Chain33Config, execMainHeight, execHeight int64,
MainBlockHeight: commit.MainBlockHeight, MainBlockHeight: commit.MainBlockHeight,
MainBlockHash: commit.MainBlockHash, MainBlockHash: commit.MainBlockHash,
ChainExecHeight: execHeight, ChainExecHeight: execHeight,
TotalSupervisionNodes: totalSupervisionNodes,
TotalSupervisionCommit: totalSupervisionCommit,
MostSupervisionCommit: mostSupervisionCount,
} }
key := calcTitleKey(commit.Title) key := calcTitleKey(commit.Title)
status := &pt.ParacrossStatus{ status := &pt.ParacrossStatus{
...@@ -567,9 +570,9 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error ...@@ -567,9 +570,9 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
bIsCommitSuperNode = true bIsCommitSuperNode = true
} }
// 获取监督节点的数据 监督节点在高度分叉后 // 获取监督节点的数据
supervisionNodesMap, supervisionNodesArry, err := a.getSupervisionNodesGroup(commit.Status.Title) supervisionNodesMap, supervisionNodesArry, err := a.getSupervisionNodesGroup(commit.Status.Title)
if err != nil && errors.Cause(err) != pt.ErrTitleNotExist && a.exec.GetMainHeight() >= pt.GetDappForkHeight(cfg, pt.ForkCommitTx) { if err != nil && errors.Cause(err) != pt.ErrTitleNotExist {
return nil, errors.Wrap(err, "getSupervisionNodesGroup") return nil, errors.Wrap(err, "getSupervisionNodesGroup")
} }
...@@ -723,6 +726,7 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac ...@@ -723,6 +726,7 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac
clog.Debug("paracross.Commit commit ----pass", "most", mostCount, "mostHash", common.ToHex([]byte(mostHash))) clog.Debug("paracross.Commit commit ----pass", "most", mostCount, "mostHash", common.ToHex([]byte(mostHash)))
// 如果已经有监督节点 // 如果已经有监督节点
mostSupervisionCount := 0
if len(supervisionNodes) > 0 { if len(supervisionNodes) > 0 {
for i, v := range stat.SupervisionDetails.Addrs { for i, v := range stat.SupervisionDetails.Addrs {
clog.Debug("paracross.Commit commit SupervisionDetails", "addr", v, "hash", common.ToHex(stat.SupervisionDetails.BlockHash[i])) clog.Debug("paracross.Commit commit SupervisionDetails", "addr", v, "hash", common.ToHex(stat.SupervisionDetails.BlockHash[i]))
...@@ -733,12 +737,11 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac ...@@ -733,12 +737,11 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac
} }
clog.Debug("paracross.Commit commit SupervisionDetails ----pass", "mostSupervisionCount", mostSupervisionCount, "mostSupervisionHash", common.ToHex([]byte(mostSupervisionHash))) clog.Debug("paracross.Commit commit SupervisionDetails ----pass", "mostSupervisionCount", mostSupervisionCount, "mostSupervisionHash", common.ToHex([]byte(mostSupervisionHash)))
if common.ToHex([]byte(mostHash)) != common.ToHex([]byte(mostSupervisionHash)) { if mostHash != mostSupervisionHash {
clog.Debug("paracross.Commit commit mostSupervisionHash mostHash not equal") clog.Error("paracross.Commit commit mostSupervisionHash mostHash not equal", "mostHash: ", common.ToHex([]byte(mostHash)), "mostSupervisionHash: ", common.ToHex([]byte(mostSupervisionHash)))
return receipt, nil return receipt, nil
} }
} }
clog.Debug("paracross.Commit commit ----pass")
stat.Status = pt.ParacrossStatusCommitDone stat.Status = pt.ParacrossStatusCommitDone
_ = saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat) _ = saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat)
...@@ -751,7 +754,9 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac ...@@ -751,7 +754,9 @@ func (a *action) commitTxDone(nodeStatus *pt.ParacrossNodeStatus, stat *pt.Parac
} }
//add commit done receipt //add commit done receipt
receiptDone := makeDoneReceipt(cfg, a.exec.GetMainHeight(), a.height, nodeStatus, int32(mostCount), int32(len(stat.Details.Addrs)), int32(len(nodes))) receiptDone := makeDoneReceipt(cfg, a.exec.GetMainHeight(), a.height, nodeStatus,
int32(mostCount), int32(len(stat.Details.Addrs)), int32(len(nodes)),
int32(mostSupervisionCount), int32(len(stat.SupervisionDetails.Addrs)), int32(len(supervisionNodes)))
receipt = mergeReceipt(receipt, receiptDone) receipt = mergeReceipt(receipt, receiptDone)
r, err := a.commitTxDoneStep2(nodeStatus, stat, titleStatus) r, err := a.commitTxDoneStep2(nodeStatus, stat, titleStatus)
...@@ -849,6 +854,11 @@ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) { ...@@ -849,6 +854,11 @@ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) {
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getNodes for title:%s", title) return nil, errors.Wrapf(err, "getNodes for title:%s", title)
} }
// 获取监督节点的数据
supervisionNodes, _, err := a.getSupervisionNodesGroup(title)
if err != nil && errors.Cause(err) != pt.ErrTitleNotExist {
return nil, errors.Wrap(err, "getSupervisionNodesGroup")
}
//从当前共识高度开始遍历 //从当前共识高度开始遍历
titleStatus, err := getTitle(a.db, calcTitleKey(title)) titleStatus, err := getTitle(a.db, calcTitleKey(title))
if err != nil { if err != nil {
...@@ -876,7 +886,7 @@ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) { ...@@ -876,7 +886,7 @@ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) {
return receipt, nil return receipt, nil
} }
r, err := a.checkCommitTxDone(title, stat, nodes) r, err := a.checkCommitTxDone(stat, nodes, supervisionNodes)
if err != nil { if err != nil {
clog.Error("paracross.loopCommitTxDone checkExecCommitTxDone", "para title", title, "height", stat.Height, "error", err) clog.Error("paracross.loopCommitTxDone checkExecCommitTxDone", "para title", title, "height", stat.Height, "error", err)
return receipt, nil return receipt, nil
...@@ -888,10 +898,10 @@ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) { ...@@ -888,10 +898,10 @@ func (a *action) loopCommitTxDone(title string) (*types.Receipt, error) {
} }
} }
func (a *action) checkCommitTxDone(title string, stat *pt.ParacrossHeightStatus, nodes map[string]struct{}) (*types.Receipt, error) { func (a *action) checkCommitTxDone(stat *pt.ParacrossHeightStatus, nodes, supervisionNodes map[string]struct{}) (*types.Receipt, error) {
status, err := getTitle(a.db, calcTitleKey(title)) status, err := getTitle(a.db, calcTitleKey(stat.Title))
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getTitle:%s", title) return nil, errors.Wrapf(err, "getTitle:%s", stat.Title)
} }
//待共识的stat的高度大于当前status高度+1,说明共识不连续,退出,如果是平行链自共识首次切换场景,可以在正常流程里面再触发 //待共识的stat的高度大于当前status高度+1,说明共识不连续,退出,如果是平行链自共识首次切换场景,可以在正常流程里面再触发
...@@ -899,28 +909,46 @@ func (a *action) checkCommitTxDone(title string, stat *pt.ParacrossHeightStatus, ...@@ -899,28 +909,46 @@ func (a *action) checkCommitTxDone(title string, stat *pt.ParacrossHeightStatus,
return nil, nil return nil, nil
} }
return a.commitTxDoneByStat(stat, status, nodes) return a.commitTxDoneByStat(stat, status, nodes, supervisionNodes)
} }
//只根据stat的信息在commitDone之后重构一个commitMostStatus做后续处理 //只根据stat的信息在commitDone之后重构一个commitMostStatus做后续处理
func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus, nodes map[string]struct{}) (*types.Receipt, error) { func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus *pt.ParacrossStatus, nodes, supervisionNodes map[string]struct{}) (*types.Receipt, error) {
receipt := &types.Receipt{}
clog.Debug("paracross.commitTxDoneByStat", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes)) clog.Debug("paracross.commitTxDoneByStat", "stat.title", stat.Title, "stat.height", stat.Height, "notes", len(nodes))
for i, v := range stat.Details.Addrs { for i, v := range stat.Details.Addrs {
clog.Debug("paracross.commitTxDoneByStat detail", "addr", v, "hash", common.ToHex(stat.Details.BlockHash[i])) clog.Debug("paracross.commitTxDoneByStat detail", "addr", v, "hash", common.ToHex(stat.Details.BlockHash[i]))
} }
updateCommitAddrs(stat, nodes) updateCommitAddrs(stat, nodes)
commitCount := len(stat.Details.Addrs)
most, mostHash := GetMostCommit(stat.Details.BlockHash) most, mostHash := GetMostCommit(stat.Details.BlockHash)
if !isCommitDone(len(nodes), most) { if !isCommitDone(len(nodes), most) {
return nil, nil return nil, nil
} }
clog.Debug("paracross.commitTxDoneByStat ----pass", "most", most, "mostHash", common.ToHex([]byte(mostHash))) clog.Debug("paracross.commitTxDoneByStat ----pass", "most", most, "mostHash", common.ToHex([]byte(mostHash)))
mostSupervisionCount := 0
if len(supervisionNodes) > 0 {
for i, v := range stat.SupervisionDetails.Addrs {
clog.Debug("paracross.commitTxDoneByStat SupervisionDetails", "addr", v, "hash", common.ToHex(stat.SupervisionDetails.BlockHash[i]))
}
updateSupervisionDetailsCommitAddrs(stat, supervisionNodes)
mostSupervisionCount, mostSupervisionHash := GetMostCommit(stat.SupervisionDetails.BlockHash)
if !isCommitDone(len(supervisionNodes), mostSupervisionCount) {
return nil, nil
}
clog.Debug("paracross.commitTxDoneByStat SupervisionDetails ----pass", "mostSupervisionCount", mostSupervisionCount, "mostSupervisionHash", common.ToHex([]byte(mostSupervisionHash)))
if mostHash != mostSupervisionHash {
clog.Error("paracross.commitTxDoneByStat mostSupervisionHash mostHash not equal", "mostHash: ", common.ToHex([]byte(mostHash)), "mostSupervisionHash: ", common.ToHex([]byte(mostSupervisionHash)))
return nil, nil
}
}
stat.Status = pt.ParacrossStatusCommitDone stat.Status = pt.ParacrossStatusCommitDone
_ = saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat) _ = saveTitleHeight(a.db, calcTitleHeightKey(stat.Title, stat.Height), stat)
r := makeCommitStatReceipt(stat) r := makeCommitStatReceipt(stat)
receipt := &types.Receipt{}
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
txRst := getMostResults([]byte(mostHash), stat) txRst := getMostResults([]byte(mostHash), stat)
...@@ -935,7 +963,9 @@ func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus ...@@ -935,7 +963,9 @@ func (a *action) commitTxDoneByStat(stat *pt.ParacrossHeightStatus, titleStatus
//add commit done receipt //add commit done receipt
cfg := a.api.GetConfig() cfg := a.api.GetConfig()
receiptDone := makeDoneReceipt(cfg, a.exec.GetMainHeight(), a.height, mostStatus, int32(most), int32(commitCount), int32(len(nodes))) receiptDone := makeDoneReceipt(cfg, a.exec.GetMainHeight(), a.height, mostStatus,
int32(most), int32(len(stat.Details.Addrs)), int32(len(nodes)),
int32(mostSupervisionCount), int32(len(stat.SupervisionDetails.Addrs)), int32(len(supervisionNodes)))
receipt = mergeReceipt(receipt, receiptDone) receipt = mergeReceipt(receipt, receiptDone)
r, err := a.commitTxDoneStep2(mostStatus, stat, titleStatus) r, err := a.commitTxDoneStep2(mostStatus, stat, titleStatus)
...@@ -984,7 +1014,6 @@ func (a *action) isAllowConsensJump(commit *pt.ParacrossNodeStatus, titleStatus ...@@ -984,7 +1014,6 @@ func (a *action) isAllowConsensJump(commit *pt.ParacrossNodeStatus, titleStatus
return a.isAllowParaConsensJump(commit, titleStatus) return a.isAllowParaConsensJump(commit, titleStatus)
} }
return a.isAllowMainConsensJump(commit, titleStatus), nil return a.isAllowMainConsensJump(commit, titleStatus), nil
} }
func execCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []byte) (*types.Receipt, error) { func execCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []byte) (*types.Receipt, error) {
...@@ -1028,7 +1057,6 @@ func execCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []byte) ...@@ -1028,7 +1057,6 @@ func execCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []byte)
return receiptWithdraw, nil return receiptWithdraw, nil
} }
return nil, nil return nil, nil
} }
func rollbackCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []byte) (*types.Receipt, error) { func rollbackCrossTx(a *action, cross *types.TransactionDetail, crossTxHash []byte) (*types.Receipt, error) {
......
...@@ -142,7 +142,7 @@ func (e *Paracross) ExecDelLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig ...@@ -142,7 +142,7 @@ func (e *Paracross) ExecDelLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig
func (e *Paracross) ExecDelLocal_SupervisionNodeGroupConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (e *Paracross) ExecDelLocal_SupervisionNodeGroupConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
var set types.LocalDBSet var set types.LocalDBSet
for _, log := range receiptData.Logs { for _, log := range receiptData.Logs {
if log.Ty == pt.TyLogParaSupervisionNodeGroupConfig { if log.Ty == pt.TyLogParaSupervisionNodeGroupStatusUpdate {
var g pt.ReceiptParaNodeGroupConfig var g pt.ReceiptParaNodeGroupConfig
err := types.Decode(log.Log, &g) err := types.Decode(log.Log, &g)
if err != nil { if err != nil {
......
...@@ -143,7 +143,7 @@ func (e *Paracross) ExecLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig, t ...@@ -143,7 +143,7 @@ func (e *Paracross) ExecLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig, t
func (e *Paracross) ExecLocal_SupervisionNodeGroupConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) { func (e *Paracross) ExecLocal_SupervisionNodeGroupConfig(payload *pt.ParaNodeAddrConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
var set types.LocalDBSet var set types.LocalDBSet
for _, log := range receiptData.Logs { for _, log := range receiptData.Logs {
if log.Ty == pt.TyLogParaSupervisionNodeGroupConfig { if log.Ty == pt.TyLogParaSupervisionNodeGroupStatusUpdate {
var g pt.ReceiptParaNodeGroupConfig var g pt.ReceiptParaNodeGroupConfig
err := types.Decode(log.Log, &g) err := types.Decode(log.Log, &g)
if err != nil { if err != nil {
......
...@@ -42,9 +42,7 @@ var ( ...@@ -42,9 +42,7 @@ var (
//监督节点 //监督节点
paraSupervisionNodes string paraSupervisionNodes string
paraSupervisionNodeGroupStatusAddrs string paraSupervisionNodeGroupStatusAddrs string
paraSupervisionNodeGroupIDPrefix string
paraSupervisionNodeIDPrefix string paraSupervisionNodeIDPrefix string
paraSupervisionSelfConsensStages string
localSupervisionNodeGroupStatusTitle string localSupervisionNodeGroupStatusTitle string
localSupervisionNodeStatusTitle string localSupervisionNodeStatusTitle string
...@@ -79,9 +77,7 @@ func setPrefix() { ...@@ -79,9 +77,7 @@ func setPrefix() {
paraSupervisionNodes = "mavl-paracross-supervision-nodes-title-" paraSupervisionNodes = "mavl-paracross-supervision-nodes-title-"
paraSupervisionNodeGroupStatusAddrs = "mavl-paracross-supervision-nodegroup-status-title-" paraSupervisionNodeGroupStatusAddrs = "mavl-paracross-supervision-nodegroup-status-title-"
paraSupervisionNodeGroupIDPrefix = "mavl-paracross-title-nodegroupid-supervision-"
paraSupervisionNodeIDPrefix = "mavl-paracross-title-nodeid-supervision-" paraSupervisionNodeIDPrefix = "mavl-paracross-title-nodeid-supervision-"
paraSupervisionSelfConsensStages = "mavl-paracross-supervision-selfconsens-stages-"
localSupervisionNodeGroupStatusTitle = "LODB-paracross-supervision-nodegroupStatusTitle-" localSupervisionNodeGroupStatusTitle = "LODB-paracross-supervision-nodegroupStatusTitle-"
localSupervisionNodeStatusTitle = "LODB-paracross-supervision-nodeStatusTitle-" localSupervisionNodeStatusTitle = "LODB-paracross-supervision-nodeStatusTitle-"
...@@ -238,10 +234,6 @@ func calcParaSupervisionNodeGroupStatusKey(title string) []byte { ...@@ -238,10 +234,6 @@ func calcParaSupervisionNodeGroupStatusKey(title string) []byte {
return []byte(fmt.Sprintf(paraSupervisionNodeGroupStatusAddrs+"%s", title)) return []byte(fmt.Sprintf(paraSupervisionNodeGroupStatusAddrs+"%s", title))
} }
func calcParaSupervisionNodeGroupIDKey(title, hash string) string {
return fmt.Sprintf(paraSupervisionNodeGroupIDPrefix+"%s-%s", title, hash)
}
func calcParaSupervisionNodeIDKey(title, hash string) string { func calcParaSupervisionNodeIDKey(title, hash string) string {
return fmt.Sprintf(paraSupervisionNodeIDPrefix+"%s-%s", title, hash) return fmt.Sprintf(paraSupervisionNodeIDPrefix+"%s-%s", title, hash)
} }
...@@ -11,26 +11,6 @@ import ( ...@@ -11,26 +11,6 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
func makeSupervisionNodeGroupIDReceipt(addr string, prev, current *pt.ParaNodeGroupStatus) *types.Receipt {
log := &pt.ReceiptParaNodeGroupConfig{
Addr: addr,
Prev: prev,
Current: current,
}
return &types.Receipt{
Ty: types.ExecOk,
KV: []*types.KeyValue{
{Key: []byte(current.Id), Value: types.Encode(current)},
},
Logs: []*types.ReceiptLog{
{
Ty: pt.TyLogParaSupervisionNodeGroupConfig,
Log: types.Encode(log),
},
},
}
}
func makeParaSupervisionNodeGroupReceipt(title string, prev, current *types.ConfigItem) *types.Receipt { func makeParaSupervisionNodeGroupReceipt(title string, prev, current *types.ConfigItem) *types.Receipt {
key := calcParaSupervisionNodeGroupAddrsKey(title) key := calcParaSupervisionNodeGroupAddrsKey(title)
log := &types.ReceiptConfig{Prev: prev, Current: current} log := &types.ReceiptConfig{Prev: prev, Current: current}
...@@ -90,23 +70,6 @@ func makeParaSupervisionNodeStatusReceipt(fromAddr string, prev, current *pt.Par ...@@ -90,23 +70,6 @@ func makeParaSupervisionNodeStatusReceipt(fromAddr string, prev, current *pt.Par
} }
} }
func makeStageSupervisionGroupReceipt(prev, current *pt.SelfConsensStages) *types.Receipt {
key := []byte(fmt.Sprintf(paraSupervisionSelfConsensStages))
log := &pt.ReceiptSelfConsStagesUpdate{Prev: prev, Current: current}
return &types.Receipt{
Ty: types.ExecOk,
KV: []*types.KeyValue{
{Key: key, Value: types.Encode(current)},
},
Logs: []*types.ReceiptLog{
{
Ty: pt.TyLogParaStageSupervisionGroupUpdate,
Log: types.Encode(log),
},
},
}
}
func makeParaSupervisionNodeGroupStatusReceipt(title string, addr string, prev, current *pt.ParaNodeGroupStatus) *types.Receipt { func makeParaSupervisionNodeGroupStatusReceipt(title string, addr string, prev, current *pt.ParaNodeGroupStatus) *types.Receipt {
key := calcParaSupervisionNodeGroupStatusKey(title) key := calcParaSupervisionNodeGroupStatusKey(title)
log := &pt.ReceiptParaNodeGroupConfig{ log := &pt.ReceiptParaNodeGroupConfig{
...@@ -140,40 +103,6 @@ func getSupervisionNodeGroupStatus(db dbm.KV, title string) (*pt.ParaNodeGroupSt ...@@ -140,40 +103,6 @@ func getSupervisionNodeGroupStatus(db dbm.KV, title string) (*pt.ParaNodeGroupSt
return &status, err return &status, err
} }
//func getSupervisionNodeAddr(db dbm.KV, title, addr string) (*pt.ParaNodeAddrIdStatus, error) {
// key := calcParaSupervisionNodeAddrKey(title, addr)
// val, err := db.Get(key)
// if err != nil {
// return nil, err
// }
//
// var status pt.ParaNodeAddrIdStatus
// err = types.Decode(val, &status)
// return &status, err
//}
func supervisionSelfConsentInitStage(cfg *types.Chain33Config) *types.Receipt {
isEnable := cfg.IsEnable(pt.ParaConsSubConf + "." + pt.ParaSelfConsInitConf)
stage := &pt.SelfConsensStage{StartHeight: 0, Enable: pt.ParaConfigYes}
if isEnable {
stage.Enable = pt.ParaConfigNo
}
stages := &pt.SelfConsensStages{Items: []*pt.SelfConsensStage{stage}}
return makeStageSupervisionGroupReceipt(nil, stages)
}
func getSupervisionNodeGroupID(db dbm.KV, title string, id string) (*pt.ParaNodeGroupStatus, error) {
id = calcParaSupervisionNodeGroupIDKey(title, id)
val, err := getDb(db, []byte(id))
if err != nil {
return nil, err
}
var status pt.ParaNodeGroupStatus
err = types.Decode(val, &status)
return &status, err
}
func getSupervisionNodeID(db dbm.KV, title string, id string) (*pt.ParaNodeIdStatus, error) { func getSupervisionNodeID(db dbm.KV, title string, id string) (*pt.ParaNodeIdStatus, error) {
id = calcParaSupervisionNodeIDKey(title, id) id = calcParaSupervisionNodeIDKey(title, id)
val, err := getDb(db, []byte(id)) val, err := getDb(db, []byte(id))
...@@ -230,10 +159,7 @@ func (a *action) updateSupervisionNodeGroup(title, addr string, add bool) (*type ...@@ -230,10 +159,7 @@ func (a *action) updateSupervisionNodeGroup(title, addr string, add bool) (*type
nodeGroupStatus.Status = pt.ParacrossNodeGroupQuit nodeGroupStatus.Status = pt.ParacrossNodeGroupQuit
nodeGroupStatus.Height = a.height nodeGroupStatus.Height = a.height
r := makeSupervisionNodeGroupIDReceipt(a.fromaddr, &copyStat, nodeGroupStatus) r := makeParaSupervisionNodeGroupStatusReceipt(title, a.fromaddr, &copyStat, nodeGroupStatus)
receipt = mergeReceipt(receipt, r)
r = makeParaSupervisionNodeGroupStatusReceipt(title, a.fromaddr, &copyStat, nodeGroupStatus)
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
} }
} }
...@@ -295,25 +221,6 @@ func (a *action) supervisionNodeGroupCreate(status *pt.ParaNodeGroupStatus) (*ty ...@@ -295,25 +221,6 @@ func (a *action) supervisionNodeGroupCreate(status *pt.ParaNodeGroupStatus) (*ty
item.Addr = a.fromaddr item.Addr = a.fromaddr
receipt := makeParaSupervisionNodeGroupReceipt(status.Title, nil, &item) receipt := makeParaSupervisionNodeGroupReceipt(status.Title, nil, &item)
//copyStat := &pt.ParaNodeIdStatus{
// Id: status.Id + "-0",
// Status: pt.ParacrossSupervisionNodeApprove,
// Title: status.Title,
// TargetAddr: status.TargetAddrs,
// Votes: &pt.ParaNodeVoteDetail{},
// CoinsFrozen: status.CoinsFrozen,
// FromAddr: status.FromAddr,
// Height: a.height,
//}
//r := makeSupervisionNodeConfigReceipt(a.fromaddr, nil, nil, copyStat)
//receipt = mergeReceipt(receipt, r)
//
//r, err := a.updateSupervisionNodeAddrStatus(copyStat)
//if err != nil {
// return nil, err
//}
//receipt = mergeReceipt(receipt, r)
return receipt, nil return receipt, nil
} }
...@@ -340,7 +247,7 @@ func (a *action) updateSupervisionNodeAddrStatus(stat *pt.ParaNodeIdStatus) (*ty ...@@ -340,7 +247,7 @@ func (a *action) updateSupervisionNodeAddrStatus(stat *pt.ParaNodeIdStatus) (*ty
addrStat.Title = stat.Title addrStat.Title = stat.Title
addrStat.Addr = stat.TargetAddr addrStat.Addr = stat.TargetAddr
addrStat.BlsPubKey = stat.BlsPubKey addrStat.BlsPubKey = stat.BlsPubKey
addrStat.Status = pt.ParacrossSupervisionNodeApply addrStat.Status = pt.ParacrossSupervisionNodeApprove
addrStat.ProposalId = stat.Id addrStat.ProposalId = stat.Id
addrStat.QuitId = "" addrStat.QuitId = ""
return makeParaSupervisionNodeStatusReceipt(a.fromaddr, nil, addrStat), nil return makeParaSupervisionNodeStatusReceipt(a.fromaddr, nil, addrStat), nil
...@@ -353,7 +260,7 @@ func (a *action) updateSupervisionNodeAddrStatus(stat *pt.ParaNodeIdStatus) (*ty ...@@ -353,7 +260,7 @@ func (a *action) updateSupervisionNodeAddrStatus(stat *pt.ParaNodeIdStatus) (*ty
return nil, errors.Wrapf(err, "nodeAddr:%s quiting wrong proposeid:%s", stat.TargetAddr, addrStat.ProposalId) return nil, errors.Wrapf(err, "nodeAddr:%s quiting wrong proposeid:%s", stat.TargetAddr, addrStat.ProposalId)
} }
addrStat.Status = pt.ParacrossSupervisionNodeQuit addrStat.Status = stat.Status
addrStat.QuitId = stat.Id addrStat.QuitId = stat.Id
receipt := makeParaSupervisionNodeStatusReceipt(a.fromaddr, &preStat, addrStat) receipt := makeParaSupervisionNodeStatusReceipt(a.fromaddr, &preStat, addrStat)
...@@ -419,31 +326,6 @@ func (a *action) supervisionNodeApply(config *pt.ParaNodeAddrConfig) (*types.Rec ...@@ -419,31 +326,6 @@ func (a *action) supervisionNodeApply(config *pt.ParaNodeAddrConfig) (*types.Rec
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
} }
// 判断监督账户组是否已经存在
err, exist := a.checkSupervisionNodeGroupExist(config.Title)
if err != nil {
return nil, err
}
// 监督账户组不存在
if !exist {
statGroup := &pt.ParaNodeGroupStatus{
Id: calcParaSupervisionNodeGroupIDKey(config.Title, common.ToHex(a.txhash)),
Status: pt.ParacrossSupervisionNodeApply,
Title: config.Title,
TargetAddrs: config.Addr,
BlsPubKeys: config.BlsPubKey,
CoinsFrozen: config.CoinsFrozen,
FromAddr: a.fromaddr,
Height: a.height,
}
r := makeSupervisionNodeGroupIDReceipt(a.fromaddr, nil, statGroup)
receipt = mergeReceipt(receipt, r)
r = makeParaSupervisionNodeGroupStatusReceipt(config.Title, a.fromaddr, nil, statGroup)
receipt = mergeReceipt(receipt, r)
}
stat := &pt.ParaNodeIdStatus{ stat := &pt.ParaNodeIdStatus{
Id: calcParaSupervisionNodeIDKey(config.Title, common.ToHex(a.txhash)), Id: calcParaSupervisionNodeIDKey(config.Title, common.ToHex(a.txhash)),
Status: pt.ParacrossSupervisionNodeApply, Status: pt.ParacrossSupervisionNodeApply,
...@@ -457,12 +339,6 @@ func (a *action) supervisionNodeApply(config *pt.ParaNodeAddrConfig) (*types.Rec ...@@ -457,12 +339,6 @@ func (a *action) supervisionNodeApply(config *pt.ParaNodeAddrConfig) (*types.Rec
r := makeSupervisionNodeConfigReceipt(a.fromaddr, config, nil, stat) r := makeSupervisionNodeConfigReceipt(a.fromaddr, config, nil, stat)
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
r, err = a.updateSupervisionNodeAddrStatus(stat)
if err != nil {
return nil, err
}
receipt = mergeReceipt(receipt, r)
return receipt, nil return receipt, nil
} }
...@@ -495,35 +371,25 @@ func (a *action) supervisionNodeApprove(config *pt.ParaNodeAddrConfig) (*types.R ...@@ -495,35 +371,25 @@ func (a *action) supervisionNodeApprove(config *pt.ParaNodeAddrConfig) (*types.R
return nil, errors.Wrapf(pt.ErrParaNodeGroupFrozenCoinsNotEnough, "id not enough coins apply:%d,config:%d", apply.CoinsFrozen, config.CoinsFrozen) return nil, errors.Wrapf(pt.ErrParaNodeGroupFrozenCoinsNotEnough, "id not enough coins apply:%d,config:%d", apply.CoinsFrozen, config.CoinsFrozen)
} }
statGroup, err := getSupervisionNodeGroupID(a.db, config.Title, config.Id) statGroup := &pt.ParaNodeGroupStatus{
if err != nil { Id: apply.Id,
return nil, err Status: pt.ParacrossSupervisionNodeApprove,
Title: apply.Title,
TargetAddrs: apply.TargetAddr,
BlsPubKeys: apply.BlsPubKey,
CoinsFrozen: apply.CoinsFrozen,
FromAddr: a.fromaddr,
Height: a.height,
} }
//create the supervision node group
r, err := a.supervisionNodeGroupCreate(statGroup) r, err := a.supervisionNodeGroupCreate(statGroup)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "nodegroup create:title:%s,addrs:%s", config.Title, apply.TargetAddr) return nil, errors.Wrapf(err, "nodegroup create:title:%s,addrs:%s", config.Title, apply.TargetAddr)
} }
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
copyStat := *statGroup r = makeParaSupervisionNodeGroupStatusReceipt(config.Title, a.fromaddr, nil, statGroup)
statGroup.Status = pt.ParacrossSupervisionNodeApprove
statGroup.Height = a.height
r = makeSupervisionNodeGroupIDReceipt(a.fromaddr, &copyStat, statGroup)
receipt = mergeReceipt(receipt, r)
r = makeParaSupervisionNodeGroupStatusReceipt(config.Title, a.fromaddr, &copyStat, statGroup)
receipt = mergeReceipt(receipt, r)
//不允许主链成功平行链失败导致不一致的情况,这里如果失败则手工设置init stage 默认设置自共识
if cfg.IsPara() {
r = supervisionSelfConsentInitStage(cfg)
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
}
//return receipt, nil
} else { } else {
// 监督账户组已经存在 // 监督账户组已经存在
r, err := a.updateSupervisionNodeGroup(config.Title, apply.TargetAddr, true) r, err := a.updateSupervisionNodeGroup(config.Title, apply.TargetAddr, true)
...@@ -567,7 +433,6 @@ func (a *action) supervisionNodeQuit(config *pt.ParaNodeAddrConfig) (*types.Rece ...@@ -567,7 +433,6 @@ func (a *action) supervisionNodeQuit(config *pt.ParaNodeAddrConfig) (*types.Rece
cfg := a.api.GetConfig() cfg := a.api.GetConfig()
stat := &pt.ParaNodeIdStatus{ stat := &pt.ParaNodeIdStatus{
//Id: calcParaSupervisionNodeGroupIDKey(config.Title, common.ToHex(a.txhash)),
Id: status.ProposalId, Id: status.ProposalId,
Status: pt.ParacrossSupervisionNodeQuit, Status: pt.ParacrossSupervisionNodeQuit,
Title: config.Title, Title: config.Title,
...@@ -587,7 +452,14 @@ func (a *action) supervisionNodeQuit(config *pt.ParaNodeAddrConfig) (*types.Rece ...@@ -587,7 +452,14 @@ func (a *action) supervisionNodeQuit(config *pt.ParaNodeAddrConfig) (*types.Rece
receipt := &types.Receipt{Ty: types.ExecOk} receipt := &types.Receipt{Ty: types.ExecOk}
r, err := a.updateSupervisionNodeGroup(config.Title, stat.TargetAddr, false) // node quit后,如果committx满足2/3目标,自动触发commitDone 后期增加
r, err := a.loopCommitTxDone(config.Title)
if err != nil {
clog.Error("updateSupervisionNodeGroup.loopCommitTxDone", "title", config.Title, "err", err.Error())
}
receipt = mergeReceipt(receipt, r)
r, err = a.updateSupervisionNodeGroup(config.Title, stat.TargetAddr, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -599,13 +471,6 @@ func (a *action) supervisionNodeQuit(config *pt.ParaNodeAddrConfig) (*types.Rece ...@@ -599,13 +471,6 @@ func (a *action) supervisionNodeQuit(config *pt.ParaNodeAddrConfig) (*types.Rece
} }
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
// node quit后,如果committx满足2/3目标,自动触发commitDone 后期增加
//r, err = a.loopCommitTxDone(config.Title)
//if err != nil {
// clog.Error("updateSupervisionNodeGroup.loopCommitTxDone", "title", title, "err", err.Error())
//}
//receipt = mergeReceipt(receipt, r)
r = makeSupervisionNodeConfigReceipt(a.fromaddr, config, nil, stat) r = makeSupervisionNodeConfigReceipt(a.fromaddr, config, nil, stat)
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
...@@ -642,28 +507,6 @@ func (a *action) supervisionNodeCancel(config *pt.ParaNodeAddrConfig) (*types.Re ...@@ -642,28 +507,6 @@ func (a *action) supervisionNodeCancel(config *pt.ParaNodeAddrConfig) (*types.Re
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
} }
// 判断监督账户组是否已经存在
err, exist := a.checkSupervisionNodeGroupExist(config.Title)
if err != nil {
return nil, err
}
// 监督账户组不存在
if !exist {
statusGroup, err := getSupervisionNodeGroupID(a.db, config.Title, config.Id)
if err != nil {
return nil, err
}
copyPrevStat := proto.Clone(statusGroup).(*pt.ParaNodeGroupStatus)
statusGroup.Status = pt.ParacrossSupervisionNodeCancel
statusGroup.Height = a.height
r := makeSupervisionNodeGroupIDReceipt(a.fromaddr, copyPrevStat, statusGroup)
receipt = mergeReceipt(receipt, r)
r = makeParaSupervisionNodeGroupStatusReceipt(config.Title, a.fromaddr, copyPrevStat, statusGroup)
receipt = mergeReceipt(receipt, r)
}
copyStat := proto.Clone(status).(*pt.ParaNodeIdStatus) copyStat := proto.Clone(status).(*pt.ParaNodeIdStatus)
status.Status = pt.ParacrossSupervisionNodeCancel status.Status = pt.ParacrossSupervisionNodeCancel
status.Height = a.height status.Height = a.height
...@@ -671,12 +514,6 @@ func (a *action) supervisionNodeCancel(config *pt.ParaNodeAddrConfig) (*types.Re ...@@ -671,12 +514,6 @@ func (a *action) supervisionNodeCancel(config *pt.ParaNodeAddrConfig) (*types.Re
r := makeSupervisionNodeConfigReceipt(a.fromaddr, config, copyStat, status) r := makeSupervisionNodeConfigReceipt(a.fromaddr, config, copyStat, status)
receipt = mergeReceipt(receipt, r) receipt = mergeReceipt(receipt, r)
r, err = a.updateSupervisionNodeAddrStatus(status)
if err != nil {
return nil, err
}
receipt = mergeReceipt(receipt, r)
return receipt, nil return receipt, nil
} }
......
...@@ -20,7 +20,7 @@ func createRawSupervisionNodeConfigTx(config *pt.ParaNodeAddrConfig) *types.Tran ...@@ -20,7 +20,7 @@ func createRawSupervisionNodeConfigTx(config *pt.ParaNodeAddrConfig) *types.Tran
} }
func (suite *NodeManageTestSuite) testSupervisionExec() { func (suite *NodeManageTestSuite) testSupervisionExec() {
suite.testSupervisionNodeConfigCancel() suite.testSupervisionNodeConfigCancel(Account14K, PrivKey14K)
suite.testSupervisionNodeConfigApprove(Account14K, PrivKey14K) suite.testSupervisionNodeConfigApprove(Account14K, PrivKey14K)
suite.testSupervisionNodeConfigApprove(Account1Ku, PrivKey1Ku) suite.testSupervisionNodeConfigApprove(Account1Ku, PrivKey1Ku)
suite.testSupervisionNodeConfigApprove(Account1M3, PrivKey1M3) suite.testSupervisionNodeConfigApprove(Account1M3, PrivKey1M3)
...@@ -29,15 +29,15 @@ func (suite *NodeManageTestSuite) testSupervisionExec() { ...@@ -29,15 +29,15 @@ func (suite *NodeManageTestSuite) testSupervisionExec() {
suite.testSupervisionNodeQuit() suite.testSupervisionNodeQuit()
} }
func (suite *NodeManageTestSuite) testSupervisionNodeConfigCancel() { func (suite *NodeManageTestSuite) testSupervisionNodeConfigCancel(addr, privKey string) {
// Apply // Apply
config := &pt.ParaNodeAddrConfig{ config := &pt.ParaNodeAddrConfig{
Title: chain33TestCfg.GetTitle(), Title: chain33TestCfg.GetTitle(),
Op: pt.ParacrossSupervisionNodeApply, Op: pt.ParacrossSupervisionNodeApply,
Addr: Account14K, Addr: addr,
} }
tx := createRawSupervisionNodeConfigTx(config) tx := createRawSupervisionNodeConfigTx(config)
receipt := nodeCommit(suite, PrivKey14K, tx) receipt := nodeCommit(suite, privKey, tx)
checkSupervisionGroupApplyReceipt(suite, receipt) checkSupervisionGroupApplyReceipt(suite, receipt)
var g pt.ReceiptParaNodeGroupConfig var g pt.ReceiptParaNodeGroupConfig
...@@ -51,7 +51,7 @@ func (suite *NodeManageTestSuite) testSupervisionNodeConfigCancel() { ...@@ -51,7 +51,7 @@ func (suite *NodeManageTestSuite) testSupervisionNodeConfigCancel() {
Id: getParaNodeIDSuffix(g.Current.Id), Id: getParaNodeIDSuffix(g.Current.Id),
} }
tx = createRawSupervisionNodeConfigTx(config) tx = createRawSupervisionNodeConfigTx(config)
receipt = nodeCommit(suite, PrivKey14K, tx) receipt = nodeCommit(suite, privKey, tx)
assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk)) assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk))
} }
...@@ -123,9 +123,9 @@ func (suite *NodeManageTestSuite) testSupervisionNodeQuit() { ...@@ -123,9 +123,9 @@ func (suite *NodeManageTestSuite) testSupervisionNodeQuit() {
func checkSupervisionGroupApplyReceipt(suite *NodeManageTestSuite, receipt *types.Receipt) { func checkSupervisionGroupApplyReceipt(suite *NodeManageTestSuite, receipt *types.Receipt) {
assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk)) assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk))
//assert.Len(suite.T(), receipt.KV, 1) assert.Len(suite.T(), receipt.KV, 1)
//assert.Len(suite.T(), receipt.Logs, 1) assert.Len(suite.T(), receipt.Logs, 1)
//assert.Equal(suite.T(), int32(pt.TyLogParaSupervisionNodeConfig), receipt.Logs[0].Ty) assert.Equal(suite.T(), int32(pt.TyLogParaSupervisionNodeConfig), receipt.Logs[0].Ty)
} }
func (suite *NodeManageTestSuite) testSupervisionQuery() { func (suite *NodeManageTestSuite) testSupervisionQuery() {
......
...@@ -382,6 +382,9 @@ message ReceiptParacrossDone { ...@@ -382,6 +382,9 @@ message ReceiptParacrossDone {
bytes mainBlockHash = 13; bytes mainBlockHash = 13;
int64 mainBlockHeight = 14; int64 mainBlockHeight = 14;
int64 chainExecHeight = 15; int64 chainExecHeight = 15;
int32 totalSupervisionNodes = 16;
int32 totalSupervisionCommit = 17;
int32 mostSupervisionCommit = 18;
} }
message ReceiptParacrossRecord { message ReceiptParacrossRecord {
......
...@@ -50,12 +50,10 @@ const ( ...@@ -50,12 +50,10 @@ const (
TyLogParaBindMinerAddr = 671 TyLogParaBindMinerAddr = 671
TyLogParaBindMinerNode = 672 TyLogParaBindMinerNode = 672
// Supervision Node // Supervision Node
TyLogParaSupervisionNodeGroupConfig = 680 TyLogParaSupervisionNodeConfig = 680
TyLogParaSupervisionNodeGroupAddrsUpdate = 681 TyLogParaSupervisionNodeGroupAddrsUpdate = 681
TyLogParaSupervisionNodeConfig = 682 TyLogParaSupervisionNodeStatusUpdate = 682
TyLogParaSupervisionNodeStatusUpdate = 683 TyLogParaSupervisionNodeGroupStatusUpdate = 683
TyLogParaStageSupervisionGroupUpdate = 684
TyLogParaSupervisionNodeGroupStatusUpdate = 685
) )
// action type // action type
......
...@@ -6,13 +6,12 @@ package types ...@@ -6,13 +6,12 @@ package types
import ( import (
context "context" context "context"
fmt "fmt" fmt "fmt"
math "math"
types "github.com/33cn/chain33/types" types "github.com/33cn/chain33/types"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc" grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes" codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status" status "google.golang.org/grpc/status"
math "math"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
...@@ -3292,6 +3291,9 @@ type ReceiptParacrossDone struct { ...@@ -3292,6 +3291,9 @@ type ReceiptParacrossDone struct {
MainBlockHash []byte `protobuf:"bytes,13,opt,name=mainBlockHash,proto3" json:"mainBlockHash,omitempty"` MainBlockHash []byte `protobuf:"bytes,13,opt,name=mainBlockHash,proto3" json:"mainBlockHash,omitempty"`
MainBlockHeight int64 `protobuf:"varint,14,opt,name=mainBlockHeight,proto3" json:"mainBlockHeight,omitempty"` MainBlockHeight int64 `protobuf:"varint,14,opt,name=mainBlockHeight,proto3" json:"mainBlockHeight,omitempty"`
ChainExecHeight int64 `protobuf:"varint,15,opt,name=chainExecHeight,proto3" json:"chainExecHeight,omitempty"` ChainExecHeight int64 `protobuf:"varint,15,opt,name=chainExecHeight,proto3" json:"chainExecHeight,omitempty"`
TotalSupervisionNodes int32 `protobuf:"varint,16,opt,name=totalSupervisionNodes,proto3" json:"totalSupervisionNodes,omitempty"`
TotalSupervisionCommit int32 `protobuf:"varint,17,opt,name=totalSupervisionCommit,proto3" json:"totalSupervisionCommit,omitempty"`
MostSupervisionCommit int32 `protobuf:"varint,18,opt,name=mostSupervisionCommit,proto3" json:"mostSupervisionCommit,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:"-"`
...@@ -3427,6 +3429,27 @@ func (m *ReceiptParacrossDone) GetChainExecHeight() int64 { ...@@ -3427,6 +3429,27 @@ func (m *ReceiptParacrossDone) GetChainExecHeight() int64 {
return 0 return 0
} }
func (m *ReceiptParacrossDone) GetTotalSupervisionNodes() int32 {
if m != nil {
return m.TotalSupervisionNodes
}
return 0
}
func (m *ReceiptParacrossDone) GetTotalSupervisionCommit() int32 {
if m != nil {
return m.TotalSupervisionCommit
}
return 0
}
func (m *ReceiptParacrossDone) GetMostSupervisionCommit() int32 {
if m != nil {
return m.MostSupervisionCommit
}
return 0
}
type ReceiptParacrossRecord struct { type ReceiptParacrossRecord struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Status *ParacrossNodeStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` Status *ParacrossNodeStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
...@@ -4506,200 +4529,201 @@ func init() { ...@@ -4506,200 +4529,201 @@ func init() {
proto.RegisterType((*BlsPubKey)(nil), "types.BlsPubKey") proto.RegisterType((*BlsPubKey)(nil), "types.BlsPubKey")
} }
func init() { func init() { proto.RegisterFile("paracross.proto", fileDescriptor_6a397e38c9ea6747) }
proto.RegisterFile("paracross.proto", fileDescriptor_6a397e38c9ea6747)
}
var fileDescriptor_6a397e38c9ea6747 = []byte{ var fileDescriptor_6a397e38c9ea6747 = []byte{
// 3008 bytes of a gzipped FileDescriptorProto // 3047 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4b, 0x6c, 0x24, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4b, 0x6c, 0x24, 0x47,
0xd5, 0x3d, 0x3f, 0xcf, 0x3c, 0x7b, 0xec, 0xdd, 0xce, 0xae, 0x33, 0x71, 0x92, 0x95, 0xd5, 0x0a, 0xd5, 0x3d, 0x3f, 0xcf, 0x3c, 0x7b, 0xfc, 0xe9, 0xec, 0x3a, 0x13, 0x27, 0x59, 0x59, 0xad, 0x10,
0x91, 0x21, 0x9b, 0xdd, 0xac, 0x13, 0x16, 0x45, 0x88, 0x4f, 0xec, 0xdd, 0xc4, 0x56, 0xd6, 0x61, 0x19, 0xb2, 0xd9, 0xcd, 0x3a, 0x61, 0x51, 0x84, 0xf8, 0xc4, 0xde, 0x4d, 0x6c, 0x65, 0x1d, 0x36,
0x53, 0x76, 0x00, 0x29, 0x02, 0xd1, 0x9e, 0x29, 0xdb, 0xad, 0xcc, 0x74, 0xcf, 0x76, 0xf5, 0x64, 0x35, 0x0e, 0x20, 0x45, 0x20, 0xda, 0x33, 0x65, 0xbb, 0x95, 0x99, 0xee, 0xd9, 0xae, 0x9e, 0xac,
0x6d, 0x84, 0x14, 0x0e, 0xc0, 0x0d, 0x89, 0x0b, 0x12, 0x5c, 0xb8, 0xc0, 0x0d, 0x89, 0x13, 0x67, 0x8d, 0x90, 0x72, 0x01, 0x6e, 0x48, 0x5c, 0x90, 0xe0, 0xc2, 0x85, 0xdc, 0x90, 0x38, 0x71, 0xe6,
0x0e, 0x48, 0x5c, 0x22, 0x2e, 0xe1, 0xc8, 0x09, 0x8e, 0x88, 0x23, 0x37, 0x4e, 0xe8, 0xbd, 0xaa, 0x80, 0xc4, 0x25, 0xe2, 0x12, 0x8e, 0x9c, 0xe0, 0x88, 0x38, 0x72, 0xe3, 0x84, 0xde, 0xab, 0xaa,
0xea, 0xae, 0xaa, 0xee, 0x69, 0x3b, 0xd9, 0x5c, 0xb8, 0xcd, 0x7b, 0xf5, 0xaa, 0xea, 0xfd, 0xeb, 0xee, 0xaa, 0xea, 0x9e, 0xb1, 0x93, 0xcd, 0x85, 0xdb, 0xbc, 0x57, 0xaf, 0xaa, 0xde, 0xbf, 0xde,
0xbd, 0x37, 0x0d, 0xab, 0xd3, 0x30, 0x0d, 0x87, 0x69, 0x22, 0xc4, 0xad, 0x69, 0x9a, 0x64, 0x89, 0x7b, 0xd3, 0xb0, 0x3a, 0x09, 0xd3, 0x70, 0x90, 0x26, 0x42, 0xdc, 0x9a, 0xa4, 0x49, 0x96, 0xf8,
0xdf, 0xce, 0xce, 0xa7, 0x5c, 0xac, 0x5f, 0xcd, 0xd2, 0x30, 0x16, 0xe1, 0x30, 0x8b, 0x92, 0x58, 0xcd, 0xec, 0x62, 0xc2, 0xc5, 0xe6, 0x7a, 0x96, 0x86, 0xb1, 0x08, 0x07, 0x59, 0x94, 0xc4, 0x72,
0xae, 0xac, 0x2f, 0x0f, 0x93, 0xc9, 0x24, 0x87, 0xae, 0x1c, 0x8d, 0x93, 0xe1, 0x07, 0xc3, 0xd3, 0x65, 0x73, 0x79, 0x90, 0x8c, 0xc7, 0x39, 0xb4, 0x76, 0x3c, 0x4a, 0x06, 0x1f, 0x0c, 0xce, 0xc2,
0x30, 0x52, 0x98, 0xe0, 0x01, 0xac, 0x3d, 0xd4, 0x87, 0x1d, 0x64, 0x61, 0x36, 0x13, 0xf7, 0x78, 0x48, 0x61, 0x82, 0x07, 0xb0, 0xf1, 0x50, 0x1f, 0xd6, 0xcf, 0xc2, 0x6c, 0x2a, 0xee, 0xf1, 0x2c,
0x16, 0x46, 0x63, 0xe1, 0x5f, 0x83, 0x76, 0x38, 0x1a, 0xa5, 0x62, 0xe0, 0x6d, 0x34, 0x37, 0x7b, 0x8c, 0x46, 0xc2, 0xbf, 0x06, 0xcd, 0x70, 0x38, 0x4c, 0x45, 0xcf, 0xdb, 0xaa, 0x6f, 0x77, 0x98,
0x4c, 0x02, 0xfe, 0x73, 0xd0, 0xa3, 0x33, 0x76, 0x43, 0x71, 0x3a, 0x68, 0x6c, 0x34, 0x37, 0x97, 0x04, 0xfc, 0xe7, 0xa0, 0x43, 0x67, 0xec, 0x87, 0xe2, 0xac, 0x57, 0xdb, 0xaa, 0x6f, 0x2f, 0xb3,
0x59, 0x81, 0x08, 0xde, 0x87, 0x67, 0x9d, 0xd3, 0xb6, 0x71, 0x4d, 0x1f, 0x79, 0x03, 0x20, 0xa7, 0x02, 0x11, 0xbc, 0x0f, 0xcf, 0x3a, 0xa7, 0xed, 0xe2, 0x9a, 0x3e, 0xf2, 0x06, 0x40, 0x4e, 0x2b,
0x95, 0xe7, 0x2e, 0x33, 0x03, 0x83, 0x87, 0x67, 0x67, 0x8c, 0x8b, 0xd9, 0x38, 0x13, 0xfa, 0xf0, 0xcf, 0x5d, 0x66, 0x06, 0x06, 0x0f, 0xcf, 0xce, 0x19, 0x17, 0xd3, 0x51, 0x26, 0xf4, 0xe1, 0x39,
0x1c, 0x11, 0xfc, 0xab, 0x01, 0xd7, 0xf3, 0xd3, 0x77, 0x79, 0x74, 0x72, 0x9a, 0xc9, 0x3b, 0xfc, 0x22, 0xf8, 0x57, 0x0d, 0xae, 0xe7, 0xa7, 0xef, 0xf3, 0xe8, 0xf4, 0x2c, 0x93, 0x77, 0xf8, 0x1b,
0x35, 0xe8, 0x08, 0xfa, 0x35, 0xf0, 0x36, 0xbc, 0xcd, 0x36, 0x53, 0x10, 0x8a, 0x90, 0x45, 0xd9, 0xd0, 0x12, 0xf4, 0xab, 0xe7, 0x6d, 0x79, 0xdb, 0x4d, 0xa6, 0x20, 0x14, 0x21, 0x8b, 0xb2, 0x11,
0x98, 0x0f, 0x1a, 0x1b, 0x1e, 0x8a, 0x40, 0x00, 0x52, 0x9f, 0xd2, 0xee, 0x41, 0x73, 0xc3, 0xdb, 0xef, 0xd5, 0xb6, 0x3c, 0x14, 0x81, 0x00, 0xa4, 0x3e, 0xa3, 0xdd, 0xbd, 0xfa, 0x96, 0xb7, 0x5d,
0x6c, 0x32, 0x05, 0xf9, 0x5f, 0x81, 0xc5, 0x91, 0x64, 0x74, 0xd0, 0xda, 0xf0, 0x36, 0x97, 0xb6, 0x67, 0x0a, 0xf2, 0xbf, 0x06, 0x8b, 0x43, 0xc9, 0x68, 0xaf, 0xb1, 0xe5, 0x6d, 0x2f, 0xed, 0x3c,
0x9e, 0xbf, 0x45, 0x6a, 0xbd, 0x55, 0xad, 0x20, 0xa6, 0xa9, 0x51, 0xac, 0x49, 0x18, 0xc5, 0x92, 0x7f, 0x8b, 0xd4, 0x7a, 0xab, 0x5a, 0x41, 0x4c, 0x53, 0xa3, 0x58, 0xe3, 0x30, 0x8a, 0x25, 0x4b,
0xa5, 0x41, 0x9b, 0x0e, 0x35, 0x30, 0xfe, 0x3a, 0x74, 0x09, 0x42, 0x95, 0x75, 0x36, 0xbc, 0xcd, 0xbd, 0x26, 0x1d, 0x6a, 0x60, 0xfc, 0x4d, 0x68, 0x13, 0x84, 0x2a, 0x6b, 0x6d, 0x79, 0xdb, 0xcb,
0x65, 0x96, 0xc3, 0xfe, 0x9b, 0xb0, 0x7c, 0x64, 0xa8, 0x68, 0xb0, 0x48, 0x37, 0x07, 0xd5, 0x37, 0x2c, 0x87, 0xfd, 0x37, 0x61, 0xf9, 0xd8, 0x50, 0x51, 0x6f, 0x91, 0x6e, 0x0e, 0xaa, 0x6f, 0x36,
0x9b, 0xca, 0x64, 0xd6, 0x3e, 0x7f, 0x1f, 0x7c, 0x31, 0x9b, 0xf2, 0xf4, 0xc3, 0x48, 0x44, 0x49, 0x95, 0xc9, 0xac, 0x7d, 0xfe, 0x21, 0xf8, 0x62, 0x3a, 0xe1, 0xe9, 0x87, 0x91, 0x88, 0x92, 0x58,
0xac, 0x4f, 0xeb, 0x5e, 0x46, 0x8e, 0x8a, 0x8d, 0xc1, 0x3f, 0x1a, 0x30, 0xa8, 0xd4, 0x35, 0x13, 0x9f, 0xd6, 0xbe, 0x8a, 0x1c, 0x15, 0x1b, 0x83, 0x7f, 0xd4, 0xa0, 0x57, 0xa9, 0x6b, 0x26, 0x26,
0xd3, 0xcf, 0x49, 0xdd, 0xb6, 0xd6, 0x5a, 0xb5, 0x5a, 0x6b, 0xd3, 0x81, 0x85, 0xd6, 0x36, 0x60, 0x5f, 0x90, 0xba, 0x6d, 0xad, 0x35, 0xe6, 0x6a, 0xad, 0x49, 0x07, 0x16, 0x5a, 0xdb, 0x82, 0x25,
0x09, 0xfd, 0x3a, 0xca, 0xde, 0x20, 0x0f, 0xed, 0x90, 0x87, 0x9a, 0x28, 0x7f, 0x13, 0x56, 0x25, 0xf4, 0xeb, 0x28, 0x7b, 0x83, 0x3c, 0xb4, 0x45, 0x1e, 0x6a, 0xa2, 0xfc, 0x6d, 0x58, 0x95, 0xe0,
0xb8, 0x9d, 0x7b, 0xeb, 0x22, 0x51, 0xb9, 0x68, 0xff, 0x2e, 0xac, 0x49, 0xd4, 0x41, 0xa1, 0x06, 0x6e, 0xee, 0xad, 0x8b, 0x44, 0xe5, 0xa2, 0xfd, 0xbb, 0xb0, 0x21, 0x51, 0xfd, 0x42, 0x0d, 0xf2,
0x79, 0x6c, 0x97, 0x36, 0xcc, 0x59, 0xf5, 0xbf, 0x0e, 0xeb, 0xa5, 0x95, 0xe2, 0xb2, 0x1e, 0xed, 0xd8, 0x36, 0x6d, 0x98, 0xb1, 0xea, 0x7f, 0x13, 0x36, 0x4b, 0x2b, 0xc5, 0x65, 0x1d, 0xda, 0x3b,
0xad, 0xa1, 0x08, 0x7e, 0xed, 0xc1, 0xaa, 0x63, 0x91, 0x42, 0x83, 0x5e, 0xb5, 0x06, 0x1b, 0x96, 0x87, 0x22, 0xf8, 0x8d, 0x07, 0xab, 0x8e, 0x45, 0x0a, 0x0d, 0x7a, 0xd5, 0x1a, 0xac, 0x59, 0x1a,
0x06, 0xad, 0x58, 0x6c, 0x92, 0x63, 0x15, 0x88, 0x4f, 0xad, 0x5f, 0xc3, 0x2b, 0x83, 0xdf, 0x79, 0xb4, 0x62, 0xb1, 0x4e, 0x8e, 0x55, 0x20, 0x3e, 0xb3, 0x7e, 0x0d, 0xaf, 0x0c, 0x3e, 0xf6, 0x0c,
0x86, 0xf9, 0x77, 0x92, 0x58, 0xf0, 0x58, 0xcc, 0xea, 0x99, 0x44, 0x93, 0x9c, 0x16, 0xf7, 0x49, 0xf3, 0xef, 0x25, 0xb1, 0xe0, 0xb1, 0x98, 0xce, 0x67, 0x12, 0x4d, 0x72, 0x56, 0xdc, 0x27, 0x39,
0x4e, 0x4d, 0x94, 0xff, 0x02, 0xf4, 0x87, 0xf2, 0xa8, 0x5d, 0xd3, 0x1f, 0x6c, 0xa4, 0xff, 0x25, 0x35, 0x51, 0xfe, 0x0b, 0xd0, 0x1d, 0xc8, 0xa3, 0xf6, 0x4d, 0x7f, 0xb0, 0x91, 0xfe, 0x57, 0x60,
0xb8, 0xa2, 0x10, 0x85, 0x32, 0x5b, 0x74, 0x51, 0x09, 0x1f, 0xfc, 0xd1, 0x03, 0x1f, 0xd9, 0x7c, 0x4d, 0x21, 0x0a, 0x65, 0x36, 0xe8, 0xa2, 0x12, 0x3e, 0xf8, 0xa3, 0x07, 0x3e, 0xb2, 0xf9, 0x4e,
0x27, 0x19, 0x71, 0x34, 0xca, 0x4e, 0x12, 0x1f, 0x47, 0x27, 0x73, 0x18, 0x5c, 0x81, 0x46, 0x32, 0x32, 0xe4, 0x68, 0x94, 0xbd, 0x24, 0x3e, 0x89, 0x4e, 0x67, 0x30, 0xb8, 0x02, 0xb5, 0x64, 0x42,
0x25, 0xbe, 0xfa, 0xac, 0x91, 0x4c, 0x11, 0x8e, 0x46, 0xc4, 0x43, 0x8f, 0x35, 0xa2, 0x91, 0xef, 0x7c, 0x75, 0x59, 0x2d, 0x99, 0x20, 0x1c, 0x0d, 0x89, 0x87, 0x0e, 0xab, 0x45, 0x43, 0xdf, 0x87,
0x43, 0x0b, 0x53, 0x9c, 0xba, 0x8c, 0x7e, 0xe3, 0x49, 0x1f, 0x86, 0xe3, 0x19, 0x27, 0x05, 0xf5, 0x06, 0xa6, 0x38, 0x75, 0x19, 0xfd, 0xc6, 0x93, 0x3e, 0x0c, 0x47, 0x53, 0x4e, 0x0a, 0xea, 0x32,
0x99, 0x04, 0xa4, 0xf7, 0x45, 0xb1, 0x78, 0x33, 0x4d, 0x7e, 0xc8, 0x63, 0x0a, 0x69, 0x14, 0xb5, 0x09, 0x48, 0xef, 0x8b, 0x62, 0xf1, 0x66, 0x9a, 0xfc, 0x98, 0xc7, 0x14, 0xd2, 0x28, 0x6a, 0x81,
0x40, 0x49, 0xcb, 0x88, 0x87, 0xb3, 0xa3, 0xb7, 0xf9, 0x39, 0x85, 0x74, 0x8f, 0x15, 0x88, 0xe0, 0x92, 0x96, 0x11, 0x0f, 0xa7, 0xc7, 0x6f, 0xf3, 0x0b, 0x0a, 0xe9, 0x0e, 0x2b, 0x10, 0xc1, 0xb7,
0x9b, 0x05, 0xd7, 0xdf, 0x4e, 0x32, 0x2e, 0x63, 0x6e, 0x4e, 0xbe, 0x45, 0x0e, 0x92, 0x8c, 0xcb, 0x0b, 0xae, 0xbf, 0x9b, 0x64, 0x5c, 0xc6, 0xdc, 0x8c, 0x7c, 0x8b, 0x1c, 0x24, 0x19, 0x97, 0xe9,
0x74, 0xd8, 0x63, 0x12, 0x08, 0xfe, 0xe0, 0xc1, 0x35, 0x53, 0xf0, 0xbd, 0x91, 0xb2, 0x8d, 0x16, 0xb0, 0xc3, 0x24, 0x10, 0xfc, 0xc1, 0x83, 0x6b, 0xa6, 0xe0, 0x07, 0x43, 0x65, 0x1b, 0x2d, 0x84,
0xc2, 0x33, 0x84, 0xb8, 0x01, 0x30, 0x4d, 0x93, 0x69, 0x22, 0xc2, 0xf1, 0xde, 0x48, 0xc5, 0xa6, 0x67, 0x08, 0x71, 0x03, 0x60, 0x92, 0x26, 0x93, 0x44, 0x84, 0xa3, 0x83, 0xa1, 0x8a, 0x4d, 0x03,
0x81, 0x41, 0xf7, 0x7a, 0x34, 0x8b, 0xb2, 0x3d, 0xad, 0x0c, 0x05, 0x19, 0x61, 0xde, 0xaa, 0x0e, 0x83, 0xee, 0xf5, 0x68, 0x1a, 0x65, 0x07, 0x5a, 0x19, 0x0a, 0x32, 0xc2, 0xbc, 0x51, 0x1d, 0xe6,
0xf3, 0xb6, 0xa9, 0x5e, 0x4b, 0xe4, 0x8e, 0x2b, 0xf2, 0x2f, 0x1b, 0x70, 0x45, 0x33, 0x9c, 0x33, 0x4d, 0x53, 0xbd, 0x96, 0xc8, 0x2d, 0x57, 0xe4, 0x5f, 0xd5, 0x60, 0x4d, 0x33, 0x9c, 0x33, 0x2b,
0x2b, 0x2d, 0xe0, 0xe5, 0x16, 0x28, 0x2e, 0x6c, 0x54, 0x5f, 0xd8, 0x34, 0x2f, 0xbc, 0x01, 0x90, 0x2d, 0xe0, 0xe5, 0x16, 0x28, 0x2e, 0xac, 0x55, 0x5f, 0x58, 0x37, 0x2f, 0xbc, 0x01, 0x90, 0x85,
0x85, 0xe9, 0x09, 0xa7, 0x80, 0x57, 0x56, 0x33, 0x30, 0xae, 0x95, 0xda, 0x65, 0x2b, 0xdd, 0xd6, 0xe9, 0x29, 0xa7, 0x80, 0x57, 0x56, 0x33, 0x30, 0xae, 0x95, 0x9a, 0x65, 0x2b, 0xdd, 0xd6, 0xba,
0xba, 0xed, 0x50, 0x9a, 0x7c, 0xc6, 0x48, 0x93, 0xb6, 0x6d, 0x94, 0xda, 0x31, 0x64, 0x8e, 0xd3, 0x6d, 0x51, 0x9a, 0x7c, 0xc6, 0x48, 0x93, 0xb6, 0x6d, 0x94, 0xda, 0x31, 0x64, 0x4e, 0xd2, 0x64,
0x64, 0x42, 0x17, 0x4a, 0xab, 0xe6, 0xb0, 0x11, 0xa4, 0xdd, 0x72, 0x90, 0x6a, 0xbd, 0xf4, 0x5c, 0x4c, 0x17, 0x4a, 0xab, 0xe6, 0xb0, 0x11, 0xa4, 0xed, 0x72, 0x90, 0x6a, 0xbd, 0x74, 0x5c, 0xbd,
0xbd, 0xfc, 0xc9, 0x83, 0xeb, 0x8c, 0x0f, 0x79, 0x34, 0xcd, 0xf4, 0xb5, 0xca, 0x89, 0xab, 0x2c, 0xfc, 0xc9, 0x83, 0xeb, 0x8c, 0x0f, 0x78, 0x34, 0xc9, 0xf4, 0xb5, 0xca, 0x89, 0xab, 0x2c, 0x79,
0x79, 0x07, 0x3a, 0x43, 0x5a, 0x25, 0x05, 0x95, 0x39, 0x2e, 0x62, 0x80, 0x29, 0x42, 0xff, 0x25, 0x07, 0x5a, 0x03, 0x5a, 0x25, 0x05, 0x95, 0x39, 0x2e, 0x62, 0x80, 0x29, 0x42, 0xff, 0x25, 0x68,
0x68, 0x4d, 0x53, 0xfe, 0x21, 0xa9, 0x6e, 0x69, 0xeb, 0x69, 0x67, 0x83, 0x36, 0x05, 0x23, 0x22, 0x4c, 0x52, 0xfe, 0x21, 0xa9, 0x6e, 0x69, 0xe7, 0x69, 0x67, 0x83, 0x36, 0x05, 0x23, 0x22, 0xff,
0xff, 0x0e, 0x2c, 0x0e, 0x67, 0x69, 0xca, 0xe3, 0x4c, 0xbd, 0x80, 0x73, 0xe9, 0x35, 0x5d, 0xf0, 0x0e, 0x2c, 0x0e, 0xa6, 0x69, 0xca, 0xe3, 0x4c, 0xbd, 0x80, 0x33, 0xe9, 0x35, 0x5d, 0xf0, 0x3b,
0x5b, 0x0f, 0x9e, 0x77, 0x04, 0x40, 0x2e, 0x90, 0xec, 0xbd, 0xe9, 0x28, 0xcc, 0xb8, 0xa5, 0x34, 0x0f, 0x9e, 0x77, 0x04, 0x40, 0x2e, 0x90, 0xec, 0xbd, 0xc9, 0x30, 0xcc, 0xb8, 0xa5, 0x34, 0xcf,
0xcf, 0x51, 0xda, 0x6d, 0xc5, 0x9d, 0x14, 0xe7, 0xd9, 0x0a, 0x71, 0x1c, 0x0e, 0xbf, 0x5c, 0x70, 0x51, 0xda, 0x6d, 0xc5, 0x9d, 0x14, 0xe7, 0xd9, 0x0a, 0x71, 0x1c, 0x0e, 0xbf, 0x5a, 0x70, 0x58,
0xd8, 0xbc, 0x78, 0x4f, 0xce, 0xe5, 0x7f, 0x3c, 0x78, 0xda, 0xe1, 0x92, 0xac, 0x9b, 0xc4, 0xbc, 0xbf, 0x7c, 0x4f, 0xce, 0xe5, 0x7f, 0x3c, 0x78, 0xda, 0xe1, 0x92, 0xac, 0x9b, 0xc4, 0xbc, 0xe4,
0xe4, 0x85, 0xd5, 0xaf, 0x98, 0xed, 0x6d, 0xcd, 0x92, 0xb7, 0xe1, 0x7a, 0x92, 0x85, 0x63, 0x3c, 0x85, 0xd5, 0xaf, 0x98, 0xed, 0x6d, 0xf5, 0x92, 0xb7, 0xe1, 0x7a, 0x92, 0x85, 0x23, 0x3c, 0x5a,
0x5a, 0x07, 0x8c, 0x81, 0xa1, 0xd2, 0x06, 0x21, 0xbc, 0x96, 0x7c, 0xb1, 0xcd, 0x0a, 0x04, 0xe5, 0x07, 0x8c, 0x81, 0xa1, 0xd2, 0x06, 0x21, 0xbc, 0x96, 0x7c, 0xb1, 0xc9, 0x0a, 0x04, 0xe5, 0xe2,
0xe2, 0x44, 0x64, 0xb4, 0xd8, 0xa1, 0xc5, 0x1c, 0xf6, 0x07, 0xb0, 0x88, 0xde, 0xc7, 0x44, 0xa6, 0x44, 0x64, 0xb4, 0xd8, 0xa2, 0xc5, 0x1c, 0xf6, 0x7b, 0xb0, 0x88, 0xde, 0xc7, 0x44, 0xa6, 0x7c,
0x7c, 0x4e, 0x83, 0x78, 0xe7, 0x28, 0x89, 0xb9, 0x14, 0x96, 0xdc, 0xae, 0xcd, 0x0c, 0x0c, 0xda, 0x4e, 0x83, 0x78, 0xe7, 0x30, 0x89, 0xb9, 0x14, 0x96, 0xdc, 0xae, 0xc9, 0x0c, 0x0c, 0xda, 0xe6,
0xe6, 0x29, 0x2d, 0xee, 0x5b, 0x69, 0x32, 0x9b, 0x3e, 0x51, 0x7e, 0xcc, 0xf3, 0x93, 0x0c, 0x35, 0x29, 0x2d, 0xee, 0x5b, 0x69, 0x32, 0x9d, 0x3c, 0x51, 0x7e, 0xcc, 0xf3, 0x93, 0x0c, 0x35, 0x95,
0x95, 0x9f, 0x2e, 0x8e, 0x32, 0x2a, 0xfa, 0x94, 0xbf, 0x0b, 0x95, 0x19, 0x0c, 0x4c, 0xf0, 0x6f, 0x9f, 0x2e, 0x8f, 0x32, 0x2a, 0xfa, 0x94, 0xbf, 0x0b, 0x95, 0x19, 0x0c, 0x4c, 0xf0, 0x6f, 0x97,
0x97, 0xcb, 0xcf, 0x25, 0x3b, 0x6c, 0xc0, 0x52, 0x61, 0x1d, 0xcd, 0xb3, 0x89, 0xba, 0x04, 0xe7, 0xcb, 0x2f, 0x24, 0x3b, 0x6c, 0xc1, 0x52, 0x61, 0x1d, 0xcd, 0xb3, 0x89, 0xba, 0x02, 0xe7, 0xa6,
0xa6, 0xe7, 0x76, 0xe6, 0x86, 0xfb, 0xa2, 0x5b, 0xd5, 0x18, 0xd2, 0x76, 0x4b, 0xd2, 0x7e, 0xec, 0xe7, 0xb6, 0x66, 0x86, 0xfb, 0xa2, 0x5b, 0xd5, 0x18, 0xd2, 0xb6, 0x4b, 0xd2, 0x7e, 0xe2, 0xc1,
0xc1, 0xba, 0xe3, 0x89, 0xa6, 0x69, 0xaa, 0xa2, 0x7e, 0xcb, 0x89, 0xfa, 0x75, 0xc7, 0xe5, 0x8d, 0xa6, 0xe3, 0x89, 0xa6, 0x69, 0xaa, 0xa2, 0x7e, 0xc7, 0x89, 0xfa, 0x4d, 0xc7, 0xe5, 0x8d, 0xfd,
0xfd, 0x79, 0xd8, 0xdf, 0xb2, 0xc2, 0xbe, 0x72, 0x87, 0x15, 0x57, 0xaf, 0xb9, 0x91, 0x5f, 0xb7, 0x79, 0xd8, 0xdf, 0xb2, 0xc2, 0xbe, 0x72, 0x87, 0x15, 0x57, 0xaf, 0xb9, 0x91, 0x3f, 0x6f, 0x4b,
0x25, 0x0f, 0xab, 0x9f, 0x79, 0x70, 0x8d, 0xf1, 0x47, 0x79, 0xa5, 0x40, 0x29, 0x22, 0x3e, 0x4e, 0x1e, 0x56, 0x3f, 0xf7, 0xe0, 0x1a, 0xe3, 0x8f, 0xf2, 0x4a, 0x81, 0x52, 0x44, 0x7c, 0x92, 0xcc,
0xe6, 0x7b, 0x58, 0xa4, 0x1f, 0x20, 0xf3, 0xc5, 0x6d, 0x1a, 0xc2, 0xce, 0x7b, 0x74, 0xac, 0x34, 0xf6, 0xb0, 0x48, 0x3f, 0x40, 0xe6, 0x8b, 0x5b, 0x37, 0x84, 0x9d, 0xf5, 0xe8, 0x58, 0x69, 0xb4,
0xda, 0x76, 0xd3, 0xe8, 0x0e, 0xac, 0x31, 0x2e, 0xa6, 0x16, 0x23, 0xd2, 0xca, 0x5f, 0x84, 0x66, 0xe9, 0xa6, 0xd1, 0x3d, 0xd8, 0x60, 0x5c, 0x4c, 0x2c, 0x46, 0xa4, 0x95, 0xbf, 0x0c, 0xf5, 0x68,
0x34, 0x92, 0x6f, 0x6a, 0x4d, 0x3a, 0x43, 0x9a, 0xe0, 0x2d, 0xcc, 0x11, 0xce, 0x21, 0x24, 0xb6, 0x28, 0xdf, 0xd4, 0x39, 0xe9, 0x0c, 0x69, 0x82, 0xb7, 0x30, 0x47, 0x38, 0x87, 0x90, 0xd8, 0xc2,
0xf0, 0x6f, 0x9a, 0xa7, 0xd4, 0xa9, 0x86, 0x0e, 0x9a, 0xca, 0xb7, 0x6e, 0x3b, 0x8a, 0x47, 0xfb, 0xbf, 0x69, 0x9e, 0x32, 0x4f, 0x35, 0x74, 0xd0, 0x44, 0xbe, 0x75, 0xbb, 0x51, 0x3c, 0x3c, 0x8c,
0x51, 0xcc, 0xd3, 0x9d, 0xc9, 0x88, 0xfc, 0x22, 0x8a, 0x47, 0x6f, 0x50, 0x6f, 0xa6, 0xea, 0x66, 0x62, 0x9e, 0xee, 0x8d, 0x87, 0xe4, 0x17, 0x51, 0x3c, 0x7c, 0x83, 0x7a, 0x33, 0x55, 0x37, 0x1b,
0x03, 0x43, 0xf2, 0x45, 0xf1, 0x68, 0x07, 0xdd, 0x4f, 0x15, 0x4f, 0x05, 0xa2, 0xc8, 0x3e, 0x78, 0x18, 0x92, 0x2f, 0x8a, 0x87, 0x7b, 0xe8, 0x7e, 0xaa, 0x78, 0x2a, 0x10, 0x45, 0xf6, 0xc1, 0xfb,
0x9f, 0x9d, 0x7d, 0x10, 0x13, 0xfc, 0xc5, 0x83, 0xab, 0xd6, 0x95, 0x64, 0x85, 0x39, 0xc5, 0x00, 0xec, 0xec, 0x83, 0x98, 0xe0, 0x2f, 0x1e, 0xac, 0x5b, 0x57, 0x92, 0x15, 0x66, 0x14, 0x03, 0x78,
0x1e, 0x7b, 0x60, 0x46, 0x92, 0x81, 0xb1, 0xf9, 0x68, 0xd6, 0xf3, 0xd1, 0x72, 0xf9, 0xc8, 0x2b, 0x6c, 0xdf, 0x8c, 0x24, 0x03, 0x63, 0xf3, 0x51, 0x9f, 0xcf, 0x47, 0xc3, 0xe5, 0x23, 0xaf, 0x48,
0xd2, 0xc3, 0x68, 0xc2, 0x55, 0x44, 0x15, 0x08, 0x8c, 0x38, 0x59, 0x9e, 0xca, 0xc0, 0x51, 0x75, 0x8f, 0xa2, 0x31, 0x57, 0x11, 0x55, 0x20, 0x30, 0xe2, 0x64, 0x79, 0x2a, 0x03, 0x47, 0xd5, 0x4d,
0x93, 0x81, 0x0a, 0x7e, 0xe1, 0xc1, 0xc0, 0x88, 0x8e, 0x8b, 0xc5, 0xb9, 0x69, 0x3d, 0x20, 0x03, 0x06, 0x2a, 0xf8, 0xa5, 0x07, 0x3d, 0x23, 0x3a, 0x2e, 0x17, 0xe7, 0xa6, 0xf5, 0x80, 0xf4, 0x0c,
0xc3, 0x32, 0xd6, 0x5e, 0xe5, 0xe5, 0x5b, 0xee, 0xeb, 0x31, 0x7f, 0x43, 0xee, 0xe3, 0xf7, 0x65, 0xcb, 0x58, 0x7b, 0x95, 0x97, 0xef, 0xb8, 0xaf, 0xc7, 0xec, 0x0d, 0xb9, 0x8f, 0xdf, 0x97, 0x55,
0x95, 0x8e, 0xe2, 0x21, 0xc5, 0xb7, 0x62, 0x92, 0x92, 0x5a, 0x26, 0x52, 0x82, 0xe4, 0xa6, 0x40, 0x3a, 0x8a, 0x87, 0x14, 0xdf, 0x89, 0x49, 0x4a, 0x6a, 0x99, 0x48, 0x09, 0x92, 0x9b, 0x02, 0x81,
0xa0, 0xef, 0x4f, 0xf0, 0x18, 0xfd, 0x7e, 0x10, 0x10, 0x7c, 0xb7, 0xa8, 0x7f, 0xf0, 0x98, 0x07, 0xbe, 0x3f, 0xc6, 0x63, 0xf4, 0xfb, 0x41, 0x40, 0xf0, 0xfd, 0xa2, 0xfe, 0xc1, 0x63, 0x1e, 0x44,
0x91, 0xc8, 0xe6, 0x44, 0xc9, 0x2d, 0xe8, 0xd0, 0x16, 0x59, 0xf2, 0x2d, 0x6d, 0xad, 0x39, 0xee, 0x22, 0x9b, 0x11, 0x25, 0xb7, 0xa0, 0x45, 0x5b, 0x64, 0xc9, 0xb7, 0xb4, 0xb3, 0xe1, 0xb8, 0x9b,
0xa6, 0xb8, 0x60, 0x8a, 0x2a, 0xf8, 0xa8, 0xf4, 0x00, 0xeb, 0x0b, 0xd4, 0x03, 0xac, 0x4b, 0x00, 0xe2, 0x82, 0x29, 0xaa, 0xe0, 0xa3, 0xd2, 0x03, 0xac, 0x2f, 0x50, 0x0f, 0xb0, 0x2e, 0x01, 0xbc,
0xaf, 0xf2, 0x49, 0xd7, 0xc4, 0xe5, 0x12, 0xa0, 0x51, 0x4f, 0x9f, 0x6b, 0xe8, 0x31, 0x26, 0x01, 0xca, 0x27, 0x5d, 0x13, 0x97, 0x4b, 0x80, 0xda, 0x7c, 0xfa, 0x5c, 0x43, 0x8f, 0x31, 0x09, 0xc8,
0x19, 0x37, 0x96, 0x78, 0x2f, 0x41, 0x6b, 0x1c, 0x89, 0xec, 0xc2, 0x7b, 0x91, 0x08, 0x4d, 0xa3, 0xb8, 0xb1, 0xc4, 0x7b, 0x09, 0x1a, 0xa3, 0x48, 0x64, 0x97, 0xde, 0x8b, 0x44, 0x68, 0x1a, 0xdd,
0x9b, 0x6f, 0x29, 0x76, 0x8d, 0x69, 0x14, 0x61, 0xf0, 0x53, 0xed, 0xf5, 0xe8, 0x41, 0x5b, 0xfb, 0x7c, 0x4b, 0xb1, 0xe7, 0x98, 0x46, 0x11, 0x06, 0x3f, 0xd3, 0x5e, 0x8f, 0x1e, 0xb4, 0x73, 0x18,
0x61, 0x14, 0xef, 0x87, 0x53, 0x23, 0x33, 0x7b, 0xf3, 0xbb, 0xa5, 0x86, 0xce, 0x20, 0xd5, 0xdd, 0x46, 0xf1, 0x61, 0x38, 0x31, 0x32, 0xb3, 0x37, 0xbb, 0x5b, 0xaa, 0xe9, 0x0c, 0x52, 0xdd, 0x2d,
0x52, 0xb3, 0xb6, 0x5b, 0x6a, 0xd9, 0xdd, 0x68, 0x70, 0x4f, 0xd6, 0xf3, 0x05, 0x1b, 0xe4, 0xae, 0xd5, 0xe7, 0x76, 0x4b, 0x0d, 0xbb, 0x1b, 0x0d, 0xee, 0xc9, 0x7a, 0xbe, 0x60, 0x83, 0xdc, 0xf5,
0xb7, 0xa0, 0x1d, 0x65, 0x7c, 0xa2, 0xb3, 0x86, 0x25, 0x8f, 0xc9, 0x30, 0x93, 0x64, 0xc1, 0x3f, 0x16, 0x34, 0xa3, 0x8c, 0x8f, 0x75, 0xd6, 0xb0, 0xe4, 0x31, 0x19, 0x66, 0x92, 0x2c, 0xf8, 0x67,
0x9b, 0xf2, 0x1d, 0xcc, 0x73, 0x8f, 0x8a, 0xc8, 0x17, 0xa0, 0x8f, 0x37, 0x15, 0xdd, 0x90, 0x47, 0x5d, 0xbe, 0x83, 0x79, 0xee, 0x51, 0x11, 0xf9, 0x02, 0x74, 0xf1, 0xa6, 0xa2, 0x1b, 0xf2, 0xa8,
0xcd, 0x9a, 0x8d, 0xc4, 0x7e, 0xb7, 0x40, 0x98, 0x2d, 0x98, 0x8b, 0x9e, 0xf3, 0x5e, 0x16, 0x5a, 0x59, 0xb3, 0x91, 0xd8, 0xef, 0x16, 0x08, 0xb3, 0x05, 0x73, 0xd1, 0x33, 0xde, 0xcb, 0x42, 0x6b,
0x6b, 0x59, 0x5a, 0x0b, 0x60, 0x79, 0x9a, 0xf2, 0xe2, 0x72, 0xd9, 0x29, 0x5a, 0x38, 0x5b, 0xb3, 0x0d, 0x4b, 0x6b, 0x01, 0x2c, 0x4f, 0x52, 0x5e, 0x5c, 0x2e, 0x3b, 0x45, 0x0b, 0x67, 0x6b, 0xb6,
0x1d, 0xb7, 0x0f, 0x95, 0x27, 0xa0, 0x30, 0x5c, 0xb5, 0xe1, 0xfa, 0x84, 0x1c, 0x47, 0x11, 0x95, 0xe5, 0xf6, 0xa1, 0xf2, 0x04, 0x14, 0x86, 0xab, 0x36, 0x5c, 0x9f, 0x90, 0xe3, 0x28, 0xa2, 0x72,
0x13, 0x74, 0xe5, 0x09, 0x39, 0x02, 0x75, 0x9f, 0x9d, 0xed, 0x24, 0xb3, 0x38, 0x13, 0x54, 0x41, 0x82, 0xb6, 0x3c, 0x21, 0x47, 0xa0, 0xee, 0xb3, 0xf3, 0xbd, 0x64, 0x1a, 0x67, 0x82, 0x2a, 0xe8,
0xf7, 0x59, 0x0e, 0xcb, 0x35, 0x39, 0x21, 0x1a, 0x80, 0xec, 0x62, 0x35, 0x8c, 0x95, 0x53, 0x76, 0x2e, 0xcb, 0x61, 0xb9, 0x26, 0x27, 0x44, 0x3d, 0x90, 0x5d, 0xac, 0x86, 0xb1, 0x72, 0xca, 0xce,
0x26, 0x67, 0x4d, 0x4b, 0x34, 0x4c, 0xd2, 0x20, 0xb5, 0xa2, 0xa8, 0xe6, 0x43, 0xbd, 0x75, 0x59, 0xe5, 0xac, 0x69, 0x89, 0x86, 0x49, 0x1a, 0xa4, 0x56, 0x14, 0xd5, 0x7c, 0xa4, 0xb7, 0x2e, 0x4b,
0xea, 0xd4, 0x42, 0x22, 0xe7, 0x0a, 0x21, 0x0f, 0xe9, 0xd3, 0x21, 0x16, 0xce, 0xbf, 0x09, 0x57, 0x9d, 0x5a, 0x48, 0xe4, 0x5c, 0x21, 0xe4, 0x21, 0x5d, 0x3a, 0xc4, 0xc2, 0xf9, 0x37, 0x61, 0x3d,
0xe3, 0x24, 0xde, 0xa1, 0x36, 0xff, 0x50, 0x33, 0xb9, 0x42, 0x4c, 0x96, 0x17, 0x82, 0x6d, 0xb8, 0x4e, 0xe2, 0x3d, 0x6a, 0xf3, 0x8f, 0x34, 0x93, 0x2b, 0xc4, 0x64, 0x79, 0x21, 0xd8, 0x85, 0xf5,
0x7a, 0xc0, 0xc7, 0xc7, 0xaa, 0xa3, 0x3e, 0xc8, 0xc2, 0x13, 0x2e, 0xfc, 0x97, 0x6d, 0x47, 0xd1, 0x3e, 0x1f, 0x9d, 0xa8, 0x8e, 0xba, 0x9f, 0x85, 0xa7, 0x5c, 0xf8, 0x2f, 0xdb, 0x8e, 0xa2, 0x03,
0x81, 0xe2, 0x12, 0x6a, 0x3f, 0x79, 0x00, 0x57, 0xdc, 0x25, 0xcc, 0xac, 0x22, 0x0b, 0xd3, 0x6c, 0xc5, 0x25, 0xd4, 0x7e, 0xf2, 0x00, 0xd6, 0xdc, 0x25, 0xcc, 0xac, 0x22, 0x0b, 0xd3, 0x6c, 0xdf,
0xd7, 0x74, 0x7c, 0x13, 0x85, 0xf6, 0xe5, 0x71, 0x78, 0xa4, 0xca, 0xda, 0x3e, 0x53, 0x50, 0xf0, 0x74, 0x7c, 0x13, 0x85, 0xf6, 0xe5, 0x71, 0x78, 0xac, 0xca, 0xda, 0x2e, 0x53, 0x50, 0xf0, 0x77,
0x77, 0x0f, 0xae, 0xb9, 0xc7, 0x91, 0xfb, 0xd6, 0x97, 0x5f, 0xfd, 0xfc, 0x61, 0x7e, 0x19, 0xda, 0x0f, 0xae, 0xb9, 0xc7, 0x91, 0xfb, 0xce, 0x2f, 0xbf, 0xba, 0xf9, 0xc3, 0xfc, 0x32, 0x34, 0x05,
0x02, 0x37, 0x39, 0x1d, 0x46, 0x99, 0x7b, 0xa2, 0xb2, 0x6a, 0xaa, 0x96, 0x53, 0x53, 0xdd, 0x00, 0x6e, 0x72, 0x3a, 0x8c, 0x32, 0xf7, 0x44, 0x65, 0xd5, 0x54, 0x0d, 0xa7, 0xa6, 0xba, 0x01, 0xc0,
0xe0, 0x67, 0x7c, 0x68, 0xcf, 0xd1, 0x0a, 0xcc, 0xa7, 0xee, 0xd7, 0x02, 0x0e, 0x6b, 0x0f, 0x92, 0xcf, 0xf9, 0xc0, 0x9e, 0xa3, 0x15, 0x98, 0xcf, 0xdc, 0xaf, 0x05, 0x1c, 0x36, 0x1e, 0x24, 0x83,
0x61, 0x38, 0xd6, 0xcc, 0x14, 0xd2, 0xdd, 0xd1, 0x5c, 0x7b, 0x56, 0x17, 0x51, 0xa5, 0x09, 0xcd, 0x70, 0xa4, 0x99, 0x29, 0xa4, 0xbb, 0xa3, 0xb9, 0xf6, 0xac, 0x2e, 0xa2, 0x4a, 0x13, 0x9a, 0x73,
0x39, 0x79, 0xd3, 0x5e, 0x3c, 0xe2, 0x67, 0x2a, 0x7b, 0x68, 0x30, 0xb8, 0x0b, 0x2b, 0xb2, 0xfc, 0xf2, 0xa6, 0x83, 0x78, 0xc8, 0xcf, 0x55, 0xf6, 0xd0, 0x60, 0x70, 0x17, 0x56, 0x64, 0xf9, 0x85,
0x42, 0x0e, 0x2a, 0x95, 0x97, 0xcf, 0x11, 0x1a, 0xc6, 0x1c, 0x21, 0x08, 0xe0, 0x8a, 0xdc, 0xb7, 0x1c, 0x54, 0x2a, 0x2f, 0x9f, 0x23, 0xd4, 0x8c, 0x39, 0x42, 0x10, 0xc0, 0x9a, 0xdc, 0xb7, 0x17,
0x13, 0xc6, 0x43, 0x3e, 0xae, 0xda, 0x19, 0x7c, 0xa2, 0xa6, 0x44, 0xc4, 0xce, 0x45, 0xf5, 0x7b, 0xc6, 0x03, 0x3e, 0xaa, 0xda, 0x19, 0x7c, 0xaa, 0xa6, 0x44, 0xc4, 0xce, 0x65, 0xf5, 0x7b, 0x76,
0x76, 0xae, 0xeb, 0xf7, 0xec, 0x1c, 0xb5, 0x25, 0x45, 0x84, 0x5a, 0xc3, 0xec, 0x2e, 0x68, 0x01, 0xa1, 0xeb, 0xf7, 0xec, 0x02, 0xb5, 0x25, 0x45, 0x84, 0xb9, 0x86, 0xd9, 0x5f, 0xd0, 0x02, 0xbe,
0x5f, 0x82, 0x16, 0xaa, 0x6d, 0xb0, 0x44, 0xf4, 0xd7, 0x15, 0xbd, 0x2d, 0xd9, 0xee, 0x02, 0x23, 0x04, 0x0d, 0x54, 0x5b, 0x6f, 0x89, 0xe8, 0xaf, 0x2b, 0x7a, 0x5b, 0xb2, 0xfd, 0x05, 0x46, 0x44,
0x22, 0x6a, 0x45, 0x89, 0x6b, 0x0a, 0x9d, 0xe2, 0x78, 0x57, 0xa0, 0xdd, 0x05, 0xa6, 0x08, 0xb7, 0xd4, 0x8a, 0x12, 0xd7, 0x14, 0x3a, 0xc5, 0xf1, 0xae, 0x40, 0xfb, 0x0b, 0x4c, 0x11, 0xee, 0x2e,
0x17, 0x95, 0x12, 0x82, 0x9f, 0x14, 0x35, 0xb0, 0x65, 0x19, 0x25, 0xde, 0x6d, 0xeb, 0xbd, 0xaa, 0x2a, 0x25, 0x04, 0x3f, 0x2d, 0x6a, 0x60, 0xcb, 0x32, 0x4a, 0xbc, 0xdb, 0xd6, 0x7b, 0x35, 0xd7,
0x35, 0x4d, 0xa9, 0x29, 0x6c, 0x5c, 0xbc, 0x27, 0x7f, 0xb7, 0x3e, 0xf1, 0xe0, 0xb9, 0x2a, 0x36, 0x34, 0xa5, 0xa6, 0xb0, 0x76, 0xf9, 0x9e, 0xfc, 0xdd, 0xfa, 0xd4, 0x83, 0xe7, 0xaa, 0xd8, 0x98,
0xe6, 0x76, 0x86, 0xb9, 0xab, 0x37, 0x2e, 0xe5, 0xea, 0x76, 0x4b, 0xd8, 0xac, 0x6f, 0x09, 0x5b, 0xd9, 0x19, 0xe6, 0xae, 0x5e, 0xbb, 0x92, 0xab, 0xdb, 0x2d, 0x61, 0x7d, 0x7e, 0x4b, 0xd8, 0x98,
0x75, 0x2d, 0x61, 0x7b, 0x7e, 0x4b, 0xd8, 0xb1, 0x5a, 0xc2, 0xe0, 0x23, 0x78, 0xb6, 0x4a, 0x24, 0xd7, 0x12, 0x36, 0x67, 0xb7, 0x84, 0x2d, 0xab, 0x25, 0x0c, 0x3e, 0x82, 0x67, 0xab, 0x44, 0x12,
0xa1, 0x4a, 0x81, 0x9b, 0x96, 0x6a, 0x07, 0x73, 0x04, 0x10, 0xe5, 0x72, 0xa9, 0x71, 0xc1, 0x86, 0xaa, 0x14, 0xb8, 0x69, 0xa9, 0xb6, 0x37, 0x43, 0x00, 0x51, 0x2e, 0x97, 0x6a, 0x97, 0x6c, 0xc8,
0x5c, 0xa9, 0xbf, 0xf1, 0xc0, 0x67, 0xfc, 0xd1, 0xbb, 0x33, 0x9e, 0x9e, 0x23, 0x99, 0xca, 0x71, 0x95, 0xfa, 0x5b, 0x0f, 0x7c, 0xc6, 0x1f, 0xbd, 0x3b, 0xe5, 0xe9, 0x05, 0x92, 0xa9, 0x1c, 0x67,
0xf6, 0xc8, 0xb8, 0xc8, 0x1e, 0x6e, 0x4b, 0x70, 0x0d, 0xda, 0x43, 0x4c, 0x95, 0x4a, 0x5d, 0x12, 0x8f, 0x8c, 0x8b, 0xec, 0xe1, 0xb6, 0x04, 0xd7, 0xa0, 0x39, 0xc0, 0x54, 0xa9, 0xd4, 0x25, 0x01,
0x40, 0x4d, 0x8d, 0xa2, 0x94, 0xcb, 0xda, 0x59, 0x69, 0x2a, 0x47, 0x18, 0x4f, 0x57, 0xdb, 0x7a, 0xd4, 0xd4, 0x30, 0x4a, 0xb9, 0xac, 0x9d, 0x95, 0xa6, 0x72, 0x84, 0xf1, 0x74, 0x35, 0xad, 0xa7,
0xba, 0xae, 0x41, 0x3b, 0xa2, 0x70, 0x95, 0x1d, 0xb5, 0x04, 0x82, 0x77, 0xb1, 0x5a, 0x99, 0x8e, 0xeb, 0x1a, 0x34, 0x23, 0x0a, 0x57, 0xd9, 0x51, 0x4b, 0x20, 0x78, 0x17, 0xab, 0x95, 0xc9, 0xe8,
0xcf, 0x5d, 0x0e, 0x5f, 0xa7, 0x27, 0x48, 0xfa, 0x88, 0xca, 0xc4, 0xb5, 0x6e, 0x54, 0x50, 0x07, 0xc2, 0xe5, 0xf0, 0x75, 0x7a, 0x82, 0xa4, 0x8f, 0xa8, 0x4c, 0x3c, 0xd7, 0x8d, 0x0a, 0xea, 0xe0,
0xdf, 0x37, 0xfe, 0x43, 0xd9, 0x51, 0xd3, 0x65, 0xa1, 0x4b, 0x56, 0x11, 0x9d, 0xc4, 0xea, 0xc9, 0x87, 0xc6, 0x7f, 0x28, 0x7b, 0x6a, 0xba, 0x2c, 0x74, 0xc9, 0x2a, 0xa2, 0xd3, 0x58, 0x3d, 0xd9,
0xa6, 0xdf, 0x68, 0x58, 0x6a, 0x9d, 0xf7, 0x43, 0xd9, 0x6d, 0x2f, 0xb3, 0x1c, 0x2e, 0x7a, 0xec, 0xf4, 0x1b, 0x0d, 0x4b, 0xad, 0xf3, 0x61, 0x28, 0xbb, 0xed, 0x65, 0x96, 0xc3, 0x45, 0x8f, 0x5d,
0xa6, 0x31, 0x03, 0x0c, 0x7e, 0x64, 0xfc, 0xef, 0x21, 0xcf, 0x57, 0x4d, 0xc3, 0x96, 0xa5, 0x55, 0x37, 0x66, 0x80, 0xc1, 0x4f, 0x8c, 0xff, 0x3d, 0xe4, 0xf9, 0xaa, 0x69, 0xd8, 0xb1, 0xb4, 0x6a,
0xbb, 0x33, 0x71, 0xca, 0x88, 0x5c, 0xe3, 0xb7, 0xa1, 0x79, 0x34, 0x16, 0xca, 0xa0, 0xa5, 0x7f, 0x77, 0x26, 0x4e, 0x19, 0x91, 0x6b, 0xfc, 0x36, 0xd4, 0x8f, 0x47, 0x42, 0x19, 0xb4, 0xf4, 0xcf,
0x06, 0x2c, 0xf6, 0x19, 0x52, 0x06, 0x99, 0x1c, 0x35, 0xd2, 0x32, 0x15, 0x61, 0x4f, 0x70, 0xf9, 0x80, 0xc5, 0x3e, 0x43, 0xca, 0x20, 0x93, 0xa3, 0x46, 0x5a, 0xa6, 0x22, 0xec, 0x09, 0x2e, 0xdf,
0x26, 0xac, 0x46, 0xc2, 0x50, 0xa7, 0x7a, 0x4d, 0xba, 0xcc, 0x45, 0x07, 0xbf, 0xf2, 0xc0, 0xdf, 0x86, 0xd5, 0x48, 0x18, 0xea, 0x54, 0xaf, 0x49, 0x9b, 0xb9, 0xe8, 0xe0, 0xd7, 0x1e, 0xf8, 0x7b,
0xc1, 0x53, 0xde, 0x10, 0x82, 0x67, 0x87, 0x69, 0x18, 0x8b, 0x63, 0x9e, 0xa2, 0x27, 0x84, 0x88, 0x78, 0xca, 0x1b, 0x42, 0xf0, 0xec, 0x28, 0x0d, 0x63, 0x71, 0xc2, 0x53, 0xf4, 0x84, 0x10, 0x11,
0xb8, 0x7f, 0xc6, 0x87, 0xba, 0xf4, 0xce, 0x11, 0xf8, 0x0c, 0x12, 0x70, 0x70, 0x3e, 0x39, 0x4a, 0xf7, 0xcf, 0xf9, 0x40, 0x97, 0xde, 0x39, 0x02, 0x9f, 0x41, 0x02, 0xfa, 0x17, 0xe3, 0xe3, 0x64,
0xc6, 0xca, 0xad, 0x4c, 0x14, 0xfa, 0x4a, 0x38, 0xc9, 0x1d, 0xac, 0xc9, 0x14, 0x84, 0xf8, 0x2c, 0xa4, 0xdc, 0xca, 0x44, 0xa1, 0xaf, 0x84, 0xe3, 0xdc, 0xc1, 0xea, 0x4c, 0x41, 0x88, 0xcf, 0x12,
0x31, 0x1e, 0x25, 0x05, 0xa1, 0x01, 0x63, 0x1d, 0x81, 0x3d, 0x46, 0xbf, 0x83, 0xff, 0x76, 0x8c, 0xe3, 0x51, 0x52, 0x10, 0x1a, 0x30, 0xd6, 0x11, 0xd8, 0x61, 0xf4, 0x3b, 0xf8, 0x6f, 0xcb, 0x18,
0xc1, 0xbd, 0x52, 0xc6, 0x5d, 0xec, 0xd1, 0x51, 0x75, 0x4a, 0x19, 0xcf, 0x55, 0x2b, 0x56, 0x52, 0xdc, 0x2b, 0x65, 0xdc, 0xc5, 0x1e, 0x1d, 0x55, 0xa7, 0x94, 0xf1, 0x5c, 0xb5, 0x62, 0x25, 0x35,
0x53, 0x4e, 0x24, 0xd8, 0x7f, 0x55, 0x37, 0x0b, 0xe5, 0x69, 0x96, 0xab, 0x70, 0x4c, 0xd4, 0x44, 0xe5, 0x44, 0x82, 0xfd, 0x57, 0x75, 0xb3, 0x50, 0x9e, 0x66, 0xb9, 0x0a, 0xc7, 0x44, 0x4d, 0xb4,
0xeb, 0x7f, 0x0d, 0xfa, 0xa1, 0xa9, 0x15, 0xd5, 0xb2, 0xeb, 0x8c, 0x4d, 0x1a, 0x13, 0x7a, 0x71, 0xfe, 0x37, 0xa0, 0x1b, 0x9a, 0x5a, 0x51, 0x2d, 0xbb, 0xce, 0xd8, 0xa4, 0x31, 0xa1, 0x17, 0xf7,
0x77, 0x81, 0xd9, 0xd4, 0xf9, 0xf6, 0xef, 0x44, 0xd9, 0xe9, 0x28, 0x0d, 0x1f, 0x93, 0x70, 0xee, 0x17, 0x98, 0x4d, 0x9d, 0x6f, 0xff, 0x5e, 0x94, 0x9d, 0x0d, 0xd3, 0xf0, 0x31, 0x09, 0xe7, 0x6e,
0x76, 0xbd, 0x98, 0x6f, 0xd7, 0x08, 0xff, 0x55, 0xe8, 0x66, 0xfa, 0xe2, 0x4e, 0xfd, 0xc5, 0x39, 0xd7, 0x8b, 0xf9, 0x76, 0x8d, 0xf0, 0x5f, 0x85, 0x76, 0xa6, 0x2f, 0x6e, 0xcd, 0xbf, 0x38, 0x27,
0x21, 0x6e, 0x7a, 0xac, 0xaf, 0x5b, 0xac, 0xbf, 0x2e, 0x27, 0xf4, 0xef, 0xc3, 0x8a, 0x3e, 0xe0, 0xc4, 0x4d, 0x8f, 0xf5, 0x75, 0x8b, 0xf3, 0xaf, 0xcb, 0x09, 0xfd, 0xfb, 0xb0, 0xa2, 0x0f, 0x38,
0x30, 0x21, 0x8b, 0x77, 0x2d, 0x2d, 0xd9, 0xf7, 0x49, 0x92, 0xdd, 0x05, 0xe6, 0x6c, 0xf2, 0xbf, 0x4a, 0xc8, 0xe2, 0x6d, 0x4b, 0x4b, 0xf6, 0x7d, 0x92, 0x64, 0x7f, 0x81, 0x39, 0x9b, 0xfc, 0xaf,
0x0a, 0x10, 0xe7, 0x73, 0x55, 0x2a, 0x20, 0xeb, 0x26, 0xa7, 0xbb, 0x0b, 0xcc, 0x20, 0xf7, 0xdf, 0x03, 0xc4, 0xf9, 0x5c, 0x95, 0x0a, 0xc8, 0x79, 0x93, 0xd3, 0xfd, 0x05, 0x66, 0x90, 0xfb, 0x6f,
0x84, 0xd5, 0xd8, 0x9e, 0xb1, 0xa8, 0xf7, 0xb4, 0x66, 0x0a, 0xb3, 0xbb, 0xc0, 0xdc, 0x4d, 0xfe, 0xc2, 0x6a, 0x6c, 0xcf, 0x58, 0xd4, 0x7b, 0x3a, 0x67, 0x0a, 0xb3, 0xbf, 0xc0, 0xdc, 0x4d, 0xfe,
0x36, 0xac, 0x0a, 0x9d, 0x6c, 0xd4, 0x39, 0xf2, 0x9d, 0x35, 0xdb, 0x3b, 0x63, 0x15, 0xcf, 0x70, 0x2e, 0xac, 0x0a, 0x9d, 0x6c, 0xd4, 0x39, 0xf2, 0x9d, 0x35, 0xdb, 0x3b, 0x63, 0x15, 0xcf, 0x70,
0x36, 0xf8, 0x6f, 0x83, 0x3f, 0x2c, 0x85, 0x84, 0x7a, 0x7f, 0xb5, 0x40, 0xe5, 0x98, 0xd9, 0x5d, 0x36, 0xf8, 0x6f, 0x83, 0x3f, 0x28, 0x85, 0x84, 0x7a, 0x7f, 0xb5, 0x40, 0xe5, 0x98, 0xd9, 0x5f,
0x60, 0x15, 0xdb, 0xfc, 0x6f, 0x40, 0x7f, 0x6a, 0xb6, 0x56, 0x83, 0x7e, 0xa9, 0x4d, 0x33, 0x07, 0x60, 0x15, 0xdb, 0xfc, 0x6f, 0x41, 0x77, 0x62, 0xb6, 0x56, 0xbd, 0x6e, 0xa9, 0x4d, 0x33, 0x07,
0x18, 0xe8, 0x07, 0x16, 0xbd, 0xff, 0x3e, 0xac, 0x1b, 0x7f, 0x1c, 0x3a, 0x2a, 0xa0, 0x12, 0xf8, 0x18, 0xe8, 0x07, 0x16, 0xbd, 0xff, 0x3e, 0x6c, 0x1a, 0x7f, 0x1c, 0x3a, 0x2a, 0xa0, 0x12, 0xf8,
0x02, 0x35, 0xd7, 0x6c, 0x37, 0x8a, 0x99, 0x36, 0x16, 0x33, 0x45, 0xed, 0xf0, 0xb1, 0x07, 0x6b, 0x12, 0x35, 0xcf, 0xd9, 0x6e, 0x14, 0x33, 0x4d, 0x2c, 0x66, 0x8a, 0xda, 0xe1, 0x13, 0x0f, 0x36,
0x46, 0xbb, 0x6b, 0xc4, 0xd6, 0xbc, 0xd9, 0x99, 0x51, 0xb5, 0x5e, 0x2e, 0x49, 0xbd, 0x62, 0xcd, 0x8c, 0x76, 0xd7, 0x88, 0xad, 0x59, 0xb3, 0x33, 0xa3, 0x6a, 0xbd, 0x5a, 0x92, 0x7a, 0xc5, 0x9a,
0xce, 0x4a, 0x91, 0x6c, 0xfd, 0x1b, 0x2a, 0x1f, 0xca, 0xbb, 0xee, 0xf4, 0xac, 0x7e, 0x53, 0xfe, 0x9d, 0x95, 0x22, 0xd9, 0xfa, 0x37, 0x54, 0x3e, 0x94, 0x77, 0xdd, 0xe9, 0xd9, 0xfc, 0x4d, 0xf9,
0x58, 0xbe, 0x6d, 0x0d, 0xff, 0x8b, 0x80, 0xff, 0x2c, 0xb9, 0x35, 0xf8, 0x71, 0x0b, 0x5f, 0x36, 0x63, 0xf9, 0xb6, 0x35, 0xfc, 0x2f, 0x02, 0xfe, 0xf3, 0xe4, 0xd6, 0xe0, 0xe3, 0x26, 0xbe, 0x6c,
0xfb, 0x34, 0x2a, 0x63, 0xec, 0x3a, 0xc4, 0x2b, 0xd5, 0x21, 0x1b, 0xb0, 0x44, 0x90, 0x54, 0xa3, 0xf6, 0x69, 0x54, 0xc6, 0xd8, 0x75, 0x88, 0x57, 0xaa, 0x43, 0xb6, 0x60, 0x89, 0x20, 0xa9, 0x46,
0x52, 0xba, 0x89, 0xf2, 0x5f, 0x84, 0x15, 0xac, 0x3d, 0x0e, 0xc2, 0x09, 0x57, 0x44, 0xf2, 0x79, 0xa5, 0x74, 0x13, 0xe5, 0xbf, 0x08, 0x2b, 0x58, 0x7b, 0xf4, 0xc3, 0x31, 0x57, 0x44, 0xf2, 0x79,
0x76, 0xb0, 0x45, 0x61, 0xda, 0xaa, 0x6e, 0x2d, 0xdb, 0x6e, 0x43, 0x5e, 0x34, 0x7d, 0x9d, 0xba, 0x76, 0xb0, 0x45, 0x61, 0xda, 0xa8, 0x6e, 0x2d, 0x9b, 0x6e, 0x43, 0x5e, 0x34, 0x7d, 0xad, 0x79,
0xa6, 0x6f, 0xb1, 0xa6, 0xe9, 0xeb, 0x3a, 0x4d, 0x9f, 0xd5, 0x8c, 0xf6, 0xdc, 0x66, 0xd4, 0x68, 0x4d, 0xdf, 0xe2, 0x9c, 0xa6, 0xaf, 0xed, 0x34, 0x7d, 0x56, 0x33, 0xda, 0x71, 0x9b, 0x51, 0xa3,
0x09, 0xe1, 0x82, 0x96, 0x70, 0xe9, 0x32, 0x2d, 0xe1, 0x72, 0x45, 0x4b, 0x58, 0x6a, 0xd8, 0xfb, 0x25, 0x84, 0x4b, 0x5a, 0xc2, 0xa5, 0xab, 0xb4, 0x84, 0xcb, 0x15, 0x2d, 0x61, 0xa9, 0x61, 0xef,
0x97, 0x6c, 0xd8, 0x57, 0xaa, 0x1b, 0xf6, 0x4d, 0x58, 0xa5, 0xbf, 0x51, 0xef, 0x17, 0xbd, 0xd1, 0x5e, 0xb1, 0x61, 0x5f, 0xa9, 0x6e, 0xd8, 0xb7, 0x61, 0x95, 0xfe, 0x46, 0xbd, 0x5f, 0xf4, 0x46,
0xaa, 0xa4, 0x74, 0xd0, 0xc1, 0x0f, 0xca, 0xb1, 0xc1, 0xf8, 0x30, 0x49, 0x47, 0x9f, 0x57, 0x6c, 0xab, 0x92, 0xd2, 0x41, 0xfb, 0xaf, 0xc1, 0x75, 0x32, 0x5b, 0xdf, 0x0e, 0x2c, 0xd1, 0x5b, 0x23,
0x04, 0x5f, 0x80, 0xa5, 0x7c, 0xf9, 0xf0, 0x8c, 0x9e, 0xcd, 0xb3, 0x7c, 0x28, 0x81, 0xcf, 0x26, 0x73, 0x55, 0x2f, 0xfa, 0x77, 0x61, 0xc3, 0x5d, 0x50, 0x56, 0x5e, 0xa7, 0x6d, 0x33, 0x56, 0xf1,
0x41, 0x72, 0x94, 0x5a, 0xcc, 0x85, 0x0f, 0xd1, 0x0f, 0xdc, 0xf1, 0xc3, 0x65, 0xfe, 0xe2, 0x0e, 0x36, 0xb2, 0x7f, 0x69, 0x9b, 0x2f, 0x6f, 0xab, 0x5c, 0x0c, 0x7e, 0x54, 0x8e, 0x5f, 0xc6, 0x07,
0x7e, 0xdf, 0x80, 0xab, 0xd6, 0x50, 0xf6, 0xff, 0xcb, 0xa3, 0x7b, 0x9f, 0xd5, 0xa3, 0x7b, 0x86, 0x49, 0x3a, 0xfc, 0xa2, 0xe2, 0x37, 0xf8, 0x12, 0x2c, 0xe5, 0xcb, 0x47, 0xe7, 0xf4, 0xb4, 0x9f,
0x47, 0x57, 0xd8, 0xbf, 0x57, 0x6d, 0xff, 0xb7, 0xe0, 0x29, 0x4b, 0x59, 0xa4, 0x77, 0x4c, 0x68, 0xe7, 0x83, 0x13, 0x7c, 0xda, 0x09, 0x92, 0xe3, 0xde, 0x62, 0x76, 0x7d, 0x84, 0xbe, 0xea, 0x8e,
0x1d, 0xe2, 0xdb, 0x1d, 0x45, 0x95, 0x14, 0xcb, 0x14, 0x9d, 0x4c, 0x4c, 0xae, 0xfd, 0x50, 0x86, 0x48, 0xae, 0xf2, 0x37, 0x7c, 0xf0, 0xfb, 0x1a, 0xac, 0x5b, 0x83, 0xe3, 0xff, 0xaf, 0xa8, 0xeb,
0x6a, 0xeb, 0x95, 0x46, 0x6b, 0xd6, 0x47, 0x41, 0x7f, 0x6d, 0xc0, 0x4a, 0x51, 0x2f, 0xe1, 0x23, 0x7c, 0xde, 0xa8, 0xeb, 0x18, 0x51, 0x57, 0xe1, 0xa3, 0x9d, 0x4a, 0x1f, 0x0d, 0xde, 0x82, 0xa7,
0x84, 0xee, 0x88, 0x5d, 0xbf, 0x76, 0x47, 0xfc, 0x4d, 0x29, 0x3f, 0xd1, 0xad, 0x40, 0x96, 0xa0, 0x2c, 0x65, 0x91, 0xde, 0x31, 0xe9, 0xb6, 0x88, 0x6f, 0x77, 0x5c, 0x56, 0x52, 0x2c, 0x53, 0x74,
0x91, 0xa3, 0xbc, 0x2e, 0x20, 0xf3, 0x74, 0x99, 0x81, 0x31, 0x7c, 0xaf, 0x65, 0xfa, 0x9e, 0x51, 0x32, 0x79, 0xba, 0xf6, 0x43, 0x19, 0xaa, 0xad, 0x57, 0x1a, 0xff, 0x59, 0x1f, 0x2e, 0xfd, 0xb5,
0xe2, 0xb5, 0xad, 0x12, 0xcf, 0x87, 0x16, 0xc7, 0x1a, 0x42, 0xda, 0x85, 0x7e, 0x53, 0x5b, 0x22, 0x06, 0x2b, 0x45, 0x4d, 0x87, 0x0f, 0x25, 0xba, 0xe3, 0x49, 0x9a, 0x8c, 0xb5, 0x3b, 0xe2, 0x6f,
0x6b, 0x45, 0xf9, 0xd7, 0x9a, 0x82, 0x50, 0x20, 0x29, 0xf8, 0xf9, 0x94, 0x93, 0x3d, 0xfa, 0xac, 0x7a, 0x96, 0x12, 0xdd, 0xae, 0x64, 0x09, 0x1a, 0x39, 0xca, 0x6b, 0x17, 0x32, 0x4f, 0x9b, 0x19,
0x40, 0x18, 0xe6, 0x07, 0xcb, 0xfc, 0xf4, 0xe9, 0x02, 0xba, 0x0d, 0xea, 0x52, 0x59, 0xea, 0x3a, 0x18, 0xc3, 0xf7, 0x1a, 0xa6, 0xef, 0x19, 0x65, 0x68, 0xd3, 0x2a, 0x43, 0x7d, 0x68, 0x70, 0xac,
0x51, 0x94, 0xf0, 0xf4, 0xa7, 0x7c, 0x98, 0x86, 0x8a, 0x6a, 0x4d, 0xce, 0x3a, 0x0a, 0x0c, 0x26, 0x73, 0xa4, 0x5d, 0xe8, 0x37, 0xb5, 0x4e, 0xb2, 0x9e, 0x95, 0x7f, 0xff, 0x29, 0x08, 0x05, 0x92,
0x2a, 0x31, 0x1b, 0x0e, 0xb9, 0x10, 0x83, 0xa7, 0x49, 0x74, 0x0d, 0x06, 0x7f, 0xf3, 0xe4, 0x28, 0x82, 0x5f, 0x4c, 0x38, 0xd9, 0xa3, 0xcb, 0x0a, 0x84, 0x61, 0x7e, 0xb0, 0xcc, 0x4f, 0x9f, 0x57,
0x99, 0x26, 0x1b, 0xf7, 0x8e, 0x28, 0x53, 0xcc, 0x1d, 0x7a, 0x9a, 0x63, 0xcb, 0x86, 0xf3, 0xe9, 0xa0, 0xdb, 0xa0, 0x2e, 0x95, 0xa5, 0xae, 0x13, 0x45, 0x09, 0x4f, 0x1f, 0x0e, 0x84, 0x69, 0xa8,
0xd1, 0x45, 0x23, 0xcf, 0x17, 0x61, 0x65, 0x1a, 0xe2, 0x3b, 0xb5, 0x6f, 0x0e, 0x3e, 0x97, 0x99, 0xa8, 0x36, 0xe4, 0x3c, 0xa6, 0xc0, 0x60, 0x32, 0x15, 0xd3, 0xc1, 0x80, 0x0b, 0xd1, 0x7b, 0x9a,
0x83, 0xbd, 0x60, 0xe8, 0xff, 0x02, 0x34, 0xb3, 0x33, 0xf9, 0x89, 0xce, 0xd2, 0x96, 0xaf, 0x3c, 0x44, 0xd7, 0x60, 0xf0, 0x37, 0x4f, 0x8e, 0xbb, 0x69, 0xfa, 0x72, 0xef, 0x98, 0xb2, 0xd9, 0xcc,
0xef, 0xb0, 0xf8, 0x4e, 0x8d, 0xe1, 0x72, 0xf0, 0x67, 0xf5, 0x41, 0x83, 0x29, 0x14, 0x75, 0x50, 0xc1, 0xac, 0x39, 0x5a, 0xad, 0x39, 0x9f, 0x47, 0x5d, 0x36, 0x96, 0x7d, 0x11, 0x56, 0x26, 0x21,
0x97, 0x15, 0xac, 0xf7, 0xc4, 0x82, 0xf5, 0x3e, 0xa5, 0x60, 0x57, 0x0a, 0xc1, 0x7a, 0x52, 0x88, 0xbe, 0xa5, 0x87, 0xe6, 0x70, 0x76, 0x99, 0x39, 0xd8, 0x4b, 0xfe, 0x98, 0x78, 0x01, 0xea, 0xd9,
0x44, 0xf6, 0x69, 0xdb, 0x63, 0x71, 0x10, 0x9d, 0xc4, 0x07, 0xb3, 0x89, 0xfe, 0x38, 0x6b, 0x9e, 0xb9, 0xfc, 0x8c, 0x68, 0x69, 0xc7, 0x57, 0x9e, 0x77, 0x54, 0x7c, 0x4b, 0xc7, 0x70, 0x39, 0xf8,
0x10, 0x79, 0xbb, 0xd7, 0x30, 0x3f, 0xf9, 0xf0, 0xa1, 0x35, 0x11, 0x27, 0xb2, 0x07, 0x5c, 0x66, 0xb3, 0xfa, 0xe8, 0xc2, 0x14, 0x8a, 0xba, 0xbc, 0xab, 0x0a, 0xd6, 0x79, 0x62, 0xc1, 0x3a, 0x9f,
0xf4, 0x1b, 0x29, 0xb1, 0x79, 0x14, 0x83, 0x16, 0x21, 0x25, 0x10, 0x7c, 0x0f, 0x9e, 0xa9, 0xbc, 0x51, 0xb0, 0xb5, 0x42, 0xb0, 0x8e, 0x14, 0x22, 0x91, 0xbd, 0xe4, 0xee, 0x48, 0xf4, 0xa3, 0xd3,
0xf0, 0xe0, 0x34, 0x79, 0xfc, 0x04, 0x97, 0xf6, 0xe4, 0xa5, 0xc1, 0x91, 0x9e, 0x6b, 0xeb, 0xe3, 0xb8, 0x3f, 0x1d, 0xeb, 0x0f, 0xc8, 0x66, 0x09, 0x91, 0xb7, 0xa4, 0x35, 0xf3, 0xb3, 0x14, 0x1f,
0xc9, 0x22, 0xaf, 0x41, 0x2b, 0x2a, 0x7a, 0xe4, 0x0d, 0x6b, 0xac, 0x5d, 0xc1, 0x07, 0x23, 0x6a, 0x1a, 0x63, 0x71, 0x2a, 0xfb, 0xd4, 0x65, 0x46, 0xbf, 0x91, 0x12, 0x1b, 0x5c, 0xd1, 0x6b, 0x10,
0xd9, 0x60, 0x4d, 0xa3, 0xa1, 0xbe, 0x56, 0x41, 0x01, 0x83, 0x95, 0x07, 0x3c, 0x1c, 0xf1, 0xf4, 0x52, 0x02, 0xc1, 0x0f, 0xe0, 0x99, 0xca, 0x0b, 0xfb, 0x67, 0xc9, 0xe3, 0x27, 0xb8, 0xb4, 0x23,
0xe0, 0x3c, 0x1e, 0xea, 0x09, 0xd8, 0xde, 0x3d, 0x3d, 0x75, 0xd9, 0xbb, 0x87, 0x91, 0x70, 0x14, 0x2f, 0x0d, 0x8e, 0xf5, 0xec, 0x5d, 0x1f, 0x4f, 0x16, 0x79, 0x0d, 0x1a, 0x51, 0xd1, 0xc7, 0x6f,
0x0a, 0xbe, 0x37, 0x3a, 0x53, 0x89, 0x5c, 0x83, 0x78, 0x66, 0x72, 0x7c, 0x2c, 0xb8, 0x4e, 0xde, 0x59, 0xa3, 0xf7, 0x0a, 0x3e, 0x18, 0x51, 0xcb, 0x26, 0x70, 0x12, 0x0d, 0xf4, 0xb5, 0x0a, 0x0a,
0x0a, 0x0a, 0x7e, 0xee, 0x41, 0x1f, 0xf9, 0x79, 0xb8, 0xf5, 0xf0, 0x60, 0x76, 0xb4, 0x2f, 0x74, 0x18, 0xac, 0x3c, 0xe0, 0xe1, 0x90, 0xa7, 0xfd, 0x8b, 0x78, 0xa0, 0xa7, 0x74, 0x07, 0xf7, 0xf4,
0x39, 0xe9, 0xe9, 0x72, 0xd2, 0x7f, 0x05, 0xba, 0x43, 0x35, 0x99, 0x55, 0xe5, 0x7c, 0x85, 0x67, 0x64, 0xe8, 0xe0, 0x1e, 0x46, 0xc2, 0x71, 0x28, 0xf8, 0xc1, 0xf0, 0x5c, 0x25, 0x72, 0x0d, 0xe2,
0x62, 0x2f, 0xa2, 0xa9, 0xfc, 0x3b, 0xb0, 0x28, 0xce, 0xe3, 0xe1, 0xbe, 0x38, 0x71, 0xe6, 0x63, 0x99, 0xc9, 0xc9, 0x89, 0xe0, 0x3a, 0x79, 0x2b, 0x28, 0xf8, 0x85, 0x07, 0x5d, 0xe4, 0xe7, 0xe1,
0x36, 0xf7, 0xbb, 0x0b, 0x4c, 0xd3, 0x15, 0x35, 0xeb, 0xfb, 0xb0, 0x72, 0x7f, 0x2c, 0x87, 0x15, 0xce, 0xc3, 0xfe, 0xf4, 0xf8, 0x50, 0xe8, 0x92, 0xd7, 0xd3, 0x25, 0xaf, 0xff, 0x0a, 0xb4, 0x07,
0x6a, 0xa6, 0xbf, 0x0e, 0xdd, 0x48, 0xc8, 0x9d, 0xc4, 0x55, 0x97, 0xe5, 0xb0, 0xff, 0x32, 0x74, 0x6a, 0x7a, 0xac, 0x5a, 0x8e, 0x0a, 0xcf, 0xc4, 0x7e, 0x49, 0x53, 0xf9, 0x77, 0x60, 0x51, 0x5c,
0xc6, 0x72, 0xa5, 0x51, 0x73, 0x11, 0x53, 0x44, 0xc1, 0xf3, 0xd0, 0xdb, 0xd6, 0xff, 0x83, 0xa2, 0xc4, 0x83, 0x43, 0x71, 0xea, 0xcc, 0xf0, 0x6c, 0xee, 0xf7, 0x17, 0x98, 0xa6, 0x2b, 0xea, 0xea,
0x4f, 0x7e, 0xc0, 0xcf, 0x95, 0xf2, 0xf0, 0xe7, 0xd6, 0xeb, 0xd0, 0xcb, 0x3f, 0x16, 0xf5, 0x6f, 0xf7, 0x61, 0xe5, 0xfe, 0x48, 0x0e, 0x54, 0xd4, 0xff, 0x0e, 0x9b, 0xd0, 0x8e, 0x84, 0xdc, 0x49,
0x42, 0x67, 0x4f, 0xe0, 0x09, 0x7e, 0x3f, 0x7f, 0x02, 0x1e, 0xbd, 0x13, 0x8d, 0xd7, 0xaf, 0x2a, 0x5c, 0xb5, 0x59, 0x0e, 0xfb, 0x2f, 0x43, 0x6b, 0x24, 0x57, 0x6a, 0x73, 0x2e, 0x62, 0x8a, 0x28,
0x70, 0x4f, 0xec, 0x84, 0xb3, 0x93, 0xd3, 0xec, 0xbd, 0x69, 0xb0, 0x70, 0xd4, 0xa1, 0x2f, 0x44, 0x78, 0x1e, 0x3a, 0xbb, 0xfa, 0xbf, 0x5a, 0xf4, 0xc9, 0x0f, 0xf8, 0x85, 0x52, 0x1e, 0xfe, 0xdc,
0x5f, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x32, 0x10, 0x4a, 0x73, 0x6e, 0x2a, 0x00, 0x00, 0x79, 0x1d, 0x3a, 0xf9, 0x07, 0xad, 0xfe, 0x4d, 0x68, 0x1d, 0x08, 0x3c, 0xc1, 0xef, 0xe6, 0x4f,
0xc0, 0xa3, 0x77, 0xa2, 0xd1, 0xe6, 0xba, 0x02, 0x0f, 0xc4, 0x5e, 0x38, 0x3d, 0x3d, 0xcb, 0xde,
0x9b, 0x04, 0x0b, 0xc7, 0x2d, 0xfa, 0x8a, 0xf5, 0xd5, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xd1,
0x8e, 0x2e, 0x5e, 0x12, 0x2b, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
...@@ -116,11 +116,9 @@ func (p *ParacrossType) GetLogMap() map[int64]*types.LogInfo { ...@@ -116,11 +116,9 @@ func (p *ParacrossType) GetLogMap() map[int64]*types.LogInfo {
TyLogParaStageGroupUpdate: {Ty: reflect.TypeOf(ReceiptSelfConsStagesUpdate{}), Name: "LogParaSelfConfStagesUpdate"}, TyLogParaStageGroupUpdate: {Ty: reflect.TypeOf(ReceiptSelfConsStagesUpdate{}), Name: "LogParaSelfConfStagesUpdate"},
TyLogParaBindMinerAddr: {Ty: reflect.TypeOf(ReceiptParaBindMinerInfo{}), Name: "TyLogParaBindMinerAddrUpdate"}, TyLogParaBindMinerAddr: {Ty: reflect.TypeOf(ReceiptParaBindMinerInfo{}), Name: "TyLogParaBindMinerAddrUpdate"},
TyLogParaBindMinerNode: {Ty: reflect.TypeOf(ReceiptParaNodeBindListUpdate{}), Name: "TyLogParaBindNodeListUpdate"}, TyLogParaBindMinerNode: {Ty: reflect.TypeOf(ReceiptParaNodeBindListUpdate{}), Name: "TyLogParaBindNodeListUpdate"},
TyLogParaSupervisionNodeGroupConfig: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaSupervisionNodeGroupConfig"},
TyLogParaSupervisionNodeGroupAddrsUpdate: {Ty: reflect.TypeOf(types.ReceiptConfig{}), Name: "LogParaSupervisionNodeGroupAddrsUpdate"},
TyLogParaSupervisionNodeConfig: {Ty: reflect.TypeOf(ReceiptParaNodeConfig{}), Name: "LogParaSupervisionNodeConfig"}, TyLogParaSupervisionNodeConfig: {Ty: reflect.TypeOf(ReceiptParaNodeConfig{}), Name: "LogParaSupervisionNodeConfig"},
TyLogParaSupervisionNodeGroupAddrsUpdate: {Ty: reflect.TypeOf(types.ReceiptConfig{}), Name: "LogParaSupervisionNodeGroupAddrsUpdate"},
TyLogParaSupervisionNodeStatusUpdate: {Ty: reflect.TypeOf(ReceiptParaNodeAddrStatUpdate{}), Name: "LogParaSupervisionNodeStatusUpdate"}, TyLogParaSupervisionNodeStatusUpdate: {Ty: reflect.TypeOf(ReceiptParaNodeAddrStatUpdate{}), Name: "LogParaSupervisionNodeStatusUpdate"},
TyLogParaStageSupervisionGroupUpdate: {Ty: reflect.TypeOf(ReceiptSelfConsStagesUpdate{}), Name: "LogParaStageSupervisionGroupUpdate"},
TyLogParaSupervisionNodeGroupStatusUpdate: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaSupervisionNodeGroupStatusUpdate"}, TyLogParaSupervisionNodeGroupStatusUpdate: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaSupervisionNodeGroupStatusUpdate"},
} }
} }
......
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