Commit 0179fec6 authored by QM's avatar QM

supervisionaccount.go code to simplify

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