Commit 9fe46fb1 authored by 张振华's avatar 张振华

guess

parent e22ff037
......@@ -242,8 +242,8 @@ func guessQuery(cmd *cobra.Command, args []string) {
gameIDs, _ := cmd.Flags().GetString("gameIDs")
var params types.Query4Cli
params.Execer = pkt.PokerBullX
req := &pkt.QueryPBGameInfo{
params.Execer = pkt.GuessX
req := &pkt.QueryGuessGameInfo{
GameId: gameID,
Addr: address,
Status: int32(status),
......@@ -252,7 +252,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
params.Payload = req
if gameID != "" {
params.FuncName = pkt.FuncName_QueryGameById
var res pkt.ReplyPBGame
var res pkt.ReplyGuessGameInfo
ctx := jsonrpc.NewRpcCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
} else if address != "" {
......@@ -272,7 +272,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
gameIDsS = append(gameIDsS, gameIDs)
req := &pkt.QueryPBGameInfos{gameIDsS}
params.Payload = req
var res pkt.ReplyPBGameList
var res pkt.ReplyGuessGameInfos
ctx := jsonrpc.NewRpcCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
} else {
......
......@@ -41,7 +41,7 @@ func (c *PokerBull) updateIndex(log *pkt.ReceiptPBGame) (kvs []*types.KeyValue)
if !log.IsWaiting {
for _, v := range log.Players {
if v != log.Addr {
kvs = append(kvs, addPBGameAddrIndexKey(log.Status, v, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, v, log.GameId, log.Index))
}
kvs = append(kvs, delPBGameAddrIndexKey(v, log.PrevIndex))
}
......
......@@ -65,25 +65,21 @@ func calcGuessGameStatusKey(status int32, index int64) []byte {
return []byte(key)
}
func calcPBGameStatusAndPlayerKey(status, player int32, value, index int64) []byte {
key := fmt.Sprintf("LODB-guess-status:%d:%d:%d:%018d", status, player, value, index)
func calcGuessGameStatusAndPlayerKey(category string, status, index int64) []byte {
key := fmt.Sprintf("LODB-guess-category-status:%s:%d:%018d", category, status, index)
return []byte(key)
}
func calcPBGameStatusAndPlayerPrefix(status, player int32, value int64) []byte {
func calcGuessGameStatusAndPlayerPrefix(category string, status int32) []byte {
var key string
if value == 0 {
key = fmt.Sprintf("LODB-guess-status:%d:%d:", status, player)
} else {
key = fmt.Sprintf("LODB-guess-status:%d:%d:%d", status, player, value)
}
key = fmt.Sprintf("LODB-guess-category-status:%s:%d", category, status)
return []byte(key)
}
func addPBGameStatusIndexKey(status int32, gameID string, index int64) *types.KeyValue {
func addGuessGameStatusIndexKey(status int32, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcPBGameStatusKey(status, index)
kv.Key = calcGuessGameStatusKey(status, index)
record := &pkt.PBGameIndexRecord{
GameId: gameID,
Index: index,
......@@ -92,16 +88,16 @@ func addPBGameStatusIndexKey(status int32, gameID string, index int64) *types.Ke
return kv
}
func delPBGameStatusIndexKey(status int32, index int64) *types.KeyValue {
func delGuessGameStatusIndexKey(status int32, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcPBGameStatusKey(status, index)
kv.Key = calcGuessGameStatusKey(status, index)
kv.Value = nil
return kv
}
func addPBGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcPBGameAddrKey(addr, index)
kv.Key = calcGuessGameAddrKey(addr, index)
record := &pkt.PBGameRecord{
GameId: gameID,
Status: status,
......@@ -111,16 +107,16 @@ func addPBGameAddrIndexKey(status int32, addr, gameID string, index int64) *type
return kv
}
func delPBGameAddrIndexKey(addr string, index int64) *types.KeyValue {
func delGuessGameAddrIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcPBGameAddrKey(addr, index)
kv.Key = calcGuessGameAddrKey(addr, index)
kv.Value = nil
return kv
}
func addPBGameStatusAndPlayer(status int32, player int32, value, index int64, gameId string) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcPBGameStatusAndPlayerKey(status, player, value, index)
kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index)
record := &pkt.PBGameIndexRecord{
GameId: gameId,
Index: index,
......@@ -131,7 +127,7 @@ func addPBGameStatusAndPlayer(status int32, player int32, value, index int64, ga
func delPBGameStatusAndPlayer(status int32, player int32, value, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcPBGameStatusAndPlayerKey(status, player, value, index)
kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index)
kv.Value = nil
return kv
}
......@@ -26,14 +26,14 @@ const (
ListASC = int32(1)
DefaultCount = int32(20) //默认一次取多少条记录
MaxBets = 10000
MaxBetsNumber = 100000
MaxHeight = 10000000000
MaxBets = 10000 //一次最多下多少注
MaxBetsNumber = 100000 //一局游戏最多接受多少注
MaxHeight = 10000000000 //最大区块高度
MinBetBlockNum = 720
MinBetTimeInterval = "2h" //2h
MinBetTimeoutNum = 8640
MinBetTimeoutInterval = "24h" //24h
MinBetBlockNum = 720 //从创建游戏开始,一局游戏最少的可下注区块数量
MinBetTimeInterval = "2h" //从创建游戏开始,一局游戏最短的可下注时间
MinBetTimeoutNum = 8640 //从游戏结束下注开始,一局游戏最少的超时块数
MinBetTimeoutInterval = "24h" //从游戏结束下注开始,一局游戏最短的超时时间
MIN_PLAY_VALUE = 10 * types.Coin
//DefaultStyle = pkt.PlayStyleDefault
......@@ -72,11 +72,6 @@ func NewAction(guess *Guess, tx *types.Transaction, index int) *Action {
}
func (action *Action) CheckExecAccountBalance(fromAddr string, ToFrozen, ToActive int64) bool {
// 赌注为零,按照最小赌注冻结
if ToFrozen == 0 {
ToFrozen = MIN_PLAY_VALUE
}
acc := action.coinsAccount.LoadExecAccount(fromAddr, action.execaddr)
if acc.GetBalance() >= ToFrozen && acc.GetFrozen() >= ToActive {
return true
......@@ -119,8 +114,8 @@ func GetGameList(db dbm.KV, values []string) []*pkt.GuessGame {
return games
}
func Infos(db dbm.KV, infos *pkt.QueryPBGameInfos) (types.Message, error) {
var games []*pkt.PokerBull
func Infos(db dbm.KV, infos *pkt.QueryGuessGameInfos) (types.Message, error) {
var games []*pkt.GuessGame
for i := 0; i < len(infos.GameIds); i++ {
id := infos.GameIds[i]
game, err := readGame(db, id)
......@@ -129,7 +124,7 @@ func Infos(db dbm.KV, infos *pkt.QueryPBGameInfos) (types.Message, error) {
}
games = append(games, game)
}
return &pkt.ReplyPBGameList{Games: games}, nil
return &pkt.ReplyGuessGameInfos{Games: games}, nil
}
func getGameListByAddr(db dbm.Lister, addr string, index int64) (types.Message, error) {
......@@ -216,17 +211,17 @@ func (action *Action) GetReceiptLog(game *pkt.GuessGame) *types.ReceiptLog {
log := &types.ReceiptLog{}
r := &pkt.ReceiptGuessGame{}
r.Addr = action.fromaddr
if game.Status == pkt.GuessGameActionStart {
if game.Status == pkt.GuessGameStatusStart {
log.Ty = pkt.TyLogGuessGameStart
} else if game.Status == pkt.GuessGameActionBet {
} else if game.Status == pkt.GuessGameStatusBet {
log.Ty = pkt.TyLogGuessGameBet
} else if game.Status == pkt.GuessGameActionStopBet {
} else if game.Status == pkt.GuessGameStatusStopBet {
log.Ty = pkt.TyLogGuessGameStopBet
} else if game.Status == pkt.GuessGameActionAbort {
} else if game.Status == pkt.GuessGameStatusAbort {
log.Ty = pkt.TyLogGuessGameAbort
} else if game.Status == pkt.GuessGameActionPublish {
} else if game.Status == pkt.GuessGameStatusPublish {
log.Ty = pkt.TyLogGuessGamePublish
} else if game.Status == pkt.GuessGameActionTimeOut {
} else if game.Status == pkt.GuessGameStatusTimeOut {
log.Ty = pkt.TyLogGuessGameTimeout
}
......@@ -459,17 +454,6 @@ func (action *Action) genTxRnd(txhash []byte) (int64, error) {
return randint, nil
}
func (action *Action) checkDupPlayerAddress(id string, pbPlayers []*pkt.PBPlayer) error {
for _, player := range pbPlayers {
if action.fromaddr == player.Address {
logger.Error("Poker bull game start", "addr", action.fromaddr, "execaddr", action.execaddr, "Already in a game", id)
return errors.New("Address is already in a game")
}
}
return nil
}
// 新建一局游戏
func (action *Action) newGame(gameId string, start *pkt.GuessGameStart) (*pkt.GuessGame, error) {
var game *pkt.GuessGame
......@@ -500,52 +484,6 @@ func (action *Action) newGame(gameId string, start *pkt.GuessGameStart) (*pkt.Gu
return game, nil
}
// 筛选合适的牌局
func (action *Action) selectGameFromIds(ids []string, value int64) *pkt.PokerBull {
var gameRet *pkt.PokerBull = nil
for _, id := range ids {
game, err := action.readGame(id)
if err != nil {
logger.Error("Poker bull game start", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed", id, "err", err)
continue
}
//不能自己和自己玩
if action.checkDupPlayerAddress(id, game.Players) != nil {
continue
}
//选择合适赌注的游戏
if value == 0 && game.GetValue() != MIN_PLAY_VALUE {
if !action.CheckExecAccountBalance(action.fromaddr, game.GetValue(), 0) {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, "id", id, "err", types.ErrNoBalance)
continue
}
}
gameRet = game
break
}
return gameRet
}
func (action *Action) checkPlayerExistInGame() bool {
values, err := action.localDB.List(calcPBGameAddrPrefix(action.fromaddr), nil, DefaultCount, ListDESC)
if err == types.ErrNotFound {
return false
}
var value pkt.PBGameRecord
lenght := len(values)
if lenght != 0 {
valueBytes := values[lenght-1]
err := types.Decode(valueBytes, &value)
if err == nil && value.Status == pkt.PBGameActionQuit {
return false
}
}
return true
}
func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, error) {
var logs []*types.ReceiptLog
......@@ -606,7 +544,7 @@ func (action *Action) GameStart(start *pkt.GuessGameStart) (*types.Receipt, erro
game.StartTime = action.blocktime
game.AdminAddr = action.fromaddr
game.Index = action.getIndex()
game.Status = pkt.GuessGameActionStart
game.Status = pkt.GuessGameStatusStart
receiptLog := action.GetReceiptLog(game)
logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...)
......@@ -644,13 +582,15 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
return nil, err
}
if game.Status != pkt.GuessGameActionStart && game.Status != pkt.GuessGameActionBet && game.Status != pkt.GuessGameActionStopBet{
if game.Status != pkt.GuessGameStatusStart && game.Status != pkt.GuessGameStatusBet && game.Status != pkt.GuessGameStatusStopBet{
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error",
game.GetStatus())
return nil, errors.New("ErrGameStatus")
}
if action.RefreshStatusByTime(game) {
canBet := action.RefreshStatusByTime(game)
if canBet == false {
receiptLog := action.GetReceiptLog(game)
logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...)
......@@ -658,8 +598,8 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
}
//更新游戏状态
game.Status = pkt.GuessGameActionBet
//如果当前游戏状态可以下注,统一设定游戏状态为GuessGameStatusBet
game.Status = pkt.GuessGameStatusBet
//检查竞猜选项是否合法
options, legal := getOptions(game.GetOptions())
......@@ -687,7 +627,7 @@ func (action *Action) GameBet(pbBet *pkt.GuessGameBet) (*types.Receipt, error) {
}
// 检查余额账户余额
checkValue := int64(game.GetOneBet() * pbBet.BetsNum)
checkValue := int64(game.GetOneBet() * pbBet.BetsNum + game.Fee)
if !action.CheckExecAccountBalance(action.fromaddr, checkValue, 0) {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "id",
pbBet.GetGameId(), "err", types.ErrNoBalance)
......@@ -746,7 +686,7 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
return nil, types.ErrInvalidParam
}
if game.Status != pkt.GuessGameActionStart && game.Status != pkt.GuessGameActionBet && game.Status != pkt.GuessGameActionStopBet{
if game.Status != pkt.GuessGameStatusStart && game.Status != pkt.GuessGameStatusBet && game.Status != pkt.GuessGameStatusStopBet{
logger.Error("GamePublish", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error",
game.GetStatus())
return nil, errors.New("ErrGameStatus")
......@@ -766,24 +706,22 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
return nil, types.ErrInvalidParam
}
game.Status = pkt.GuessGameActionPublish
game.Status = pkt.GuessGameStatusPublish
game.Result = publish.Result
//先遍历所有下注数据,对于输家,转移资金到Admin账户合约地址;
for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i]
//if player.Bet.Option != game.Result {
value := int64(player.Bet.BetsNumber * game.OneBet)
receipt, err := action.coinsAccount.ExecTransfer(player.Addr, game.AdminAddr, action.execaddr, value)
if err != nil {
action.coinsAccount.ExecFrozen(game.AdminAddr, action.execaddr, value) // rollback
logger.Error("GamePublish", "addr", game.AdminAddr, "execaddr", action.execaddr,
"amount", value, "err", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
//}
value := int64(player.Bet.BetsNumber * game.OneBet + game.Fee)
receipt, err := action.coinsAccount.ExecTransfer(player.Addr, game.AdminAddr, action.execaddr, value)
if err != nil {
action.coinsAccount.ExecFrozen(game.AdminAddr, action.execaddr, value) // rollback
logger.Error("GamePublish", "addr", game.AdminAddr, "execaddr", action.execaddr,
"amount", value, "err", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
//计算竞猜正确的筹码总数
totalBetsNumber := uint32(0)
......@@ -812,6 +750,19 @@ func (action *Action) GamePublish(publish *pkt.GuessGamePublish) (*types.Receipt
}
}
//如果设置了手续费专用地址,则将本局游戏收取的手续费转移到专用地址
if game.Fee > 0 && len(game.FeeAddr) != 0 && game.FeeAddr != game.AdminAddr {
value := int64(game.Fee * uint32(len(game.Plays))
receipt, err := action.coinsAccount.ExecTransfer(game.AdminAddr, game.FeeAddr, action.execaddr, value)
if err != nil {
action.coinsAccount.ExecFrozen(game.FeeAddr, action.execaddr, value) // rollback
logger.Error("GamePublish", "addr", game.FeeAddr, "execaddr", action.execaddr, "amount", value, "err", err)
return nil, err
}
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
receiptLog := action.GetReceiptLog(game)
logs = append(logs, receiptLog)
kv = append(kv, action.saveGame(game)...)
......@@ -834,7 +785,7 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro
action.RefreshStatusByTime(game)
//如果游戏超时,则任何地址都可以Abort,否则只有创建游戏的地址可以Abort
if game.Status != pkt.GuessGameActionTimeOut {
if game.Status != pkt.GuessGameStatusTimeOut {
if game.AdminAddr != action.fromaddr {
logger.Error("GameAbort", "addr", action.fromaddr, "execaddr", action.execaddr, "Only admin can abort",
action.fromaddr, "status", game.Status)
......@@ -845,8 +796,8 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro
//激活冻结账户
for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i]
value := int64(player.Bet.BetsNumber * game.OneBet)
receipt, err := action.coinsAccount.ExecActive(player.Addr, action.execaddr, )
value := int64(player.Bet.BetsNumber * game.OneBet + game.Fee)
receipt, err := action.coinsAccount.ExecActive(player.Addr, action.execaddr, value)
if err != nil {
logger.Error("GameAbort", "addr", player.Addr, "execaddr", action.execaddr, "amount", value, "err", err)
continue
......@@ -854,7 +805,7 @@ func (action *Action) GameAbort(pbend *pkt.GuessGameAbort) (*types.Receipt, erro
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
game.Status = pkt.GuessGameActionAbort
game.Status = pkt.GuessGameStatusAbort
game.Index = action.getIndex(game)
receiptLog := action.GetReceiptLog(game)
......@@ -891,18 +842,19 @@ func isLegalOption(options []string, option string) bool {
return false
}
func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) bool {
func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) (canBet bool) {
// 检查区块高度是否超过最大下注高度限制,看是否可以下注
if game.GetMaxHeight() <= action.height {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Height over limit",
action.height, "MaxHeight", game.GetMaxHeight())
if game.GetExpireHeight() > action.height {
game.Status = pkt.GuessGameActionStopBet
game.Status = pkt.GuessGameStatusStopBet
} else {
game.Status = pkt.GuessGameActionTimeOut
game.Status = pkt.GuessGameStatusTimeOut
}
return true
canBet = false
return canBet
}
// 检查区块高度是否超过下注时间限制,看是否可以下注
......@@ -911,14 +863,16 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) bool {
if err != nil {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Parse MaxTime failed",
game.GetMaxTime())
return false
canBet = true
return canBet
}
tExpire, err := time.Parse("2006-01-02 15:04:05", game.GetExpire())
if err != nil {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Parse Expire failed",
game.GetExpire())
return false
canBet = true
return canBet
}
tNow := time.Now()
......@@ -927,16 +881,18 @@ func (action *Action) RefreshStatusByTime(game *pkt.GuessGame) bool {
game.GetMaxTime())
if tNow.After(tExpire) {
game.Status = pkt.GuessGameActionTimeOut
game.Status = pkt.GuessGameStatusTimeOut
} else {
game.Status = pkt.GuessGameActionStopBet
game.Status = pkt.GuessGameStatusStopBet
}
return true
canBet = false
return canBet
}
}
return false
canBet = true
return canBet
}
func (action *Action) CheckTime(start *pkt.GuessGameStart) bool {
......@@ -980,4 +936,4 @@ func (action *Action) CheckTime(start *pkt.GuessGameStart) bool {
}
return false
}
\ No newline at end of file
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import (
"fmt"
"math/rand"
"sort"
"github.com/33cn/plugin/plugin/dapp/pokerbull/types"
)
var POKER_CARD_NUM = 52 //4 * 13 不带大小王
var COLOR_OFFSET uint32 = 8
var COLOR_BIT_MAST = 0xFF
var COLOR_NUM = 4
var CARD_NUM_PER_COLOR = 13
var CARD_NUM_PER_GAME = 5
const (
POKERBULL_RESULT_X1 = 1
POKERBULL_RESULT_X2 = 2
POKERBULL_RESULT_X3 = 3
POKERBULL_RESULT_X4 = 4
POKERBULL_RESULT_X5 = 5
POKERBULL_LEVERAGE_MAX = POKERBULL_RESULT_X1
)
func NewPoker() *types.PBPoker {
poker := new(types.PBPoker)
poker.Cards = make([]int32, POKER_CARD_NUM)
poker.Pointer = int32(POKER_CARD_NUM - 1)
for i := 0; i < POKER_CARD_NUM; i++ {
color := i / CARD_NUM_PER_COLOR
num := i%CARD_NUM_PER_COLOR + 1
poker.Cards[i] = int32(color<<COLOR_OFFSET + num)
}
return poker
}
// 洗牌
func Shuffle(poker *types.PBPoker, rng int64) {
rndn := rand.New(rand.NewSource(rng))
for i := 0; i < POKER_CARD_NUM; i++ {
idx := rndn.Intn(POKER_CARD_NUM - 1)
tmpV := poker.Cards[idx]
poker.Cards[idx] = poker.Cards[POKER_CARD_NUM-i-1]
poker.Cards[POKER_CARD_NUM-i-1] = tmpV
}
poker.Pointer = int32(POKER_CARD_NUM - 1)
}
// 发牌
func Deal(poker *types.PBPoker, rng int64) []int32 {
if poker.Pointer < int32(CARD_NUM_PER_GAME) {
logger.Error(fmt.Sprintf("Wait to be shuffled: deal cards [%d], left [%d]", CARD_NUM_PER_GAME, poker.Pointer+1))
Shuffle(poker, rng+int64(poker.Cards[0]))
}
rndn := rand.New(rand.NewSource(rng))
res := make([]int32, CARD_NUM_PER_GAME)
for i := 0; i < CARD_NUM_PER_GAME; i++ {
idx := rndn.Intn(int(poker.Pointer))
tmpV := poker.Cards[poker.Pointer]
res[i] = poker.Cards[idx]
poker.Cards[idx] = tmpV
poker.Cards[poker.Pointer] = res[i]
poker.Pointer--
}
return res
}
// 计算斗牛结果
func Result(cards []int32) int32 {
temp := 0
r := -1 //是否有牛标志
pk := newcolorCard(cards)
//花牌等于10
cardsC := make([]int, len(cards))
for i := 0; i < len(pk); i++ {
if pk[i].num > 10 {
cardsC[i] = 10
} else {
cardsC[i] = pk[i].num
}
}
//斗牛算法
result := make([]int, 10)
var offset = 0
for x := 0; x < 3; x++ {
for y := x + 1; y < 4; y++ {
for z := y + 1; z < 5; z++ {
if (cardsC[x]+cardsC[y]+cardsC[z])%10 == 0 {
for j := 0; j < len(cardsC); j++ {
if j != x && j != y && j != z {
temp += cardsC[j]
}
}
if temp%10 == 0 {
r = 10 //若有牛,且剩下的两个数也是牛十
} else {
r = temp % 10 //若有牛,剩下的不是牛十
}
result[offset] = r
offset++
}
}
}
}
//没有牛
if r == -1 {
return -1
}
return int32(result[0])
}
// 计算结果倍数
func Leverage(hand *types.PBHand) int32 {
result := hand.Result
// 小牛 [1, 6]
if result < 7 {
return POKERBULL_RESULT_X1
}
// 大牛 [7, 9]
if result >= 7 && result < 10 {
return POKERBULL_RESULT_X2
}
var flowers = 0
if result == 10 {
for _, card := range hand.Cards {
if (int(card) & COLOR_BIT_MAST) > 10 {
flowers++
}
}
// 牛牛
if flowers < 4 {
return POKERBULL_RESULT_X3
}
// 四花
if flowers == 4 {
return POKERBULL_RESULT_X4
}
// 五花
if flowers == 5 {
return POKERBULL_RESULT_X5
}
}
return POKERBULL_RESULT_X1
}
type pokerCard struct {
num int
color int
}
type colorCardSlice []*pokerCard
func (p colorCardSlice) Len() int {
return len(p)
}
func (p colorCardSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
func (p colorCardSlice) Less(i, j int) bool {
if i >= p.Len() || j >= p.Len() {
logger.Error("length error. slice length:", p.Len(), " compare lenth: ", i, " ", j)
}
if p[i] == nil || p[j] == nil {
logger.Error("nil pointer at ", i, " ", j)
}
return p[i].num < p[j].num
}
func newcolorCard(a []int32) colorCardSlice {
var cardS []*pokerCard
for i := 0; i < len(a); i++ {
num := int(a[i]) & COLOR_BIT_MAST
color := int(a[i]) >> COLOR_OFFSET
cardS = append(cardS, &pokerCard{num, color})
}
return cardS
}
func CompareResult(i, j *types.PBHand) bool {
if i.Result < j.Result {
return true
}
if i.Result == j.Result {
return Compare(i.Cards, j.Cards)
}
return false
}
func Compare(a []int32, b []int32) bool {
cardA := newcolorCard(a)
cardB := newcolorCard(b)
if !sort.IsSorted(cardA) {
sort.Sort(cardA)
}
if !sort.IsSorted(cardB) {
sort.Sort(cardB)
}
maxA := cardA[len(a)-1]
maxB := cardB[len(b)-1]
if maxA.num != maxB.num {
return maxA.num < maxB.num
}
return maxA.color < maxB.color
}
......@@ -6,22 +6,22 @@ package executor
import (
"github.com/33cn/chain33/types"
pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
pkt "github.com/33cn/plugin/plugin/dapp/guess/types"
)
func (g *PokerBull) Query_QueryGameListByIds(in *pkt.QueryPBGameInfos) (types.Message, error) {
func (g *Guess) Query_QueryGameListByIds(in *pkt.QueryGuessGameInfos) (types.Message, error) {
return Infos(g.GetStateDB(), in)
}
func (g *PokerBull) Query_QueryGameById(in *pkt.QueryPBGameInfo) (types.Message, error) {
func (g *Guess) Query_QueryGameById(in *pkt.QueryGuessGameInfo) (types.Message, error) {
game, err := readGame(g.GetStateDB(), in.GetGameId())
if err != nil {
return nil, err
}
return &pkt.ReplyPBGame{game}, nil
return &pkt.ReplyGuessGameInfo{game}, nil
}
func (g *PokerBull) Query_QueryGameByAddr(in *pkt.QueryPBGameInfo) (types.Message, error) {
func (g *Guess) Query_QueryGameByAddr(in *pkt.QueryGuessGameInfo) (types.Message, error) {
gameIds, err := getGameListByAddr(g.GetLocalDB(), in.Addr, in.Index)
if err != nil {
return nil, err
......@@ -30,7 +30,7 @@ func (g *PokerBull) Query_QueryGameByAddr(in *pkt.QueryPBGameInfo) (types.Messag
return gameIds, nil
}
func (g *PokerBull) Query_QueryGameByStatus(in *pkt.QueryPBGameInfo) (types.Message, error) {
func (g *Guess) Query_QueryGameByStatus(in *pkt.QueryGuessGameInfo) (types.Message, error) {
gameIds, err := getGameListByStatus(g.GetLocalDB(), in.Status, in.Index)
if err != nil {
return nil, err
......
......@@ -8,28 +8,30 @@ package types;
message GuessGame {
string gameId = 1; //游戏ID
uint32 status = 2; //游戏的状态:创建->投注->截止投注->开奖
int64 startTime = 3; //创建游戏的时间
string startTxHash = 4; //创建游戏的交易hash
string topic = 5; //主题
string category = 6; //分类
string options = 7; //选项
string maxTime = 8; //截止下注时间
int64 maxHeight = 9; //截止下注的块高
string symbol = 10; //bty或者具体token
string exec = 11; //coins或者token
uint32 oneBet = 12; //一注等于多少bty或者token
uint32 maxBets = 13; //单次可以下多少注,默认100
uint32 maxBetsNumber = 14; //最多可以下多少注
uint32 fee = 15; //收取费用,不带则表示不收费
string feeAddr = 16; //收费地址
string expire = 17; //游戏过期时间
int64 expireHeight = 18; //游戏过期区块高度
string adminAddr = 19; //游戏创建者地址,只有该地址可以开奖
uint32 betsNumber = 20; //已下注数,如果数量达到maxBetsNumber,则不允许再下注
repeated GuessPlayer plays = 21; //参与游戏下注的玩家投注信息
string result = 22;
repeated GuessBet bets = 23;
int64 index = 24;
uint32 preStatus = 3;
int64 startTime = 4; //创建游戏的时间
string startTxHash = 5; //创建游戏的交易hash
string topic = 6; //主题
string category = 7; //分类
string options = 8; //选项
string maxTime = 9; //截止下注时间
int64 maxHeight = 10; //截止下注的块高
string symbol = 11; //bty或者具体token
string exec = 12; //coins或者token
uint32 oneBet = 13; //一注等于多少bty或者token
uint32 maxBets = 14; //单次可以下多少注,默认100
uint32 maxBetsNumber = 15; //最多可以下多少注
uint32 fee = 16; //收取费用,不带则表示不收费
string feeAddr = 17; //收费地址
string expire = 18; //游戏过期时间
int64 expireHeight = 19; //游戏过期区块高度
string adminAddr = 20; //游戏创建者地址,只有该地址可以开奖
uint32 betsNumber = 21; //已下注数,如果数量达到maxBetsNumber,则不允许再下注
repeated GuessPlayer plays = 22; //参与游戏下注的玩家投注信息
string result = 23;
repeated GuessBet bets = 24;
int64 index = 25;
int64 preIndex = 26;
}
message GuessPlayer {
......@@ -40,6 +42,10 @@ message GuessPlayer {
message GuessBet {
string option = 1;
uint32 betsNumber = 2;
bool isWinner = 3;
uint32 profit = 4;
int64 index = 5;
int64 preIndex = 6;
}
......@@ -224,6 +230,25 @@ message ReplyPBGameList {
repeated PokerBull games = 1;
}
message QueryGuessGameInfo {
string gameId = 1;
string addr = 2;
int32 status = 3;
int64 index = 4;
}
message ReplyGuessGameInfo {
GuessGame game = 1;
}
message QueryGuessGameInfos {
repeated string gameIds = 1;
}
message ReplyGuessGameInfos {
repeated GuessGame games = 1;
}
message ReceiptPBGame {
string gameId = 1;
int32 status = 2;
......
......@@ -93,11 +93,11 @@ func (c *Jrpc) GuessPublishTx(parm *pb.GuessPublishTxReq, result *interface{}) e
return nil
}
func (c *Jrpc) PokerBullQueryTx(parm *pb.PBQueryReq, result *interface{}) error {
func (c *Jrpc) GuessQueryTx(parm *pb.PBQueryReq, result *interface{}) error {
if parm == nil {
return types.ErrInvalidParam
}
head := &pb.PBGameQuery{
head := &pb.GuessGameQuery{
GameId: parm.GameId,
}
reply, err := c.cli.Show(context.Background(), head)
......
......@@ -6,21 +6,14 @@ package rpc
import (
"context"
"fmt"
"github.com/33cn/chain33/types"
pb "github.com/33cn/plugin/plugin/dapp/guess/types"
"github.com/33cn/plugin/plugin/dapp/guess/executor"
)
func (c *channelClient) GuessStart(ctx context.Context, head *pb.GuessGameStart) (*types.UnsignTx, error) {
if head.MaxBetsNumber > executor.MaxBetsNumber {
return nil, fmt.Errorf("Max Bets Number Should Be Maximum %d", executor.MaxBetsNumber)
}
val := &pb.GuessGameAction{
Ty: pb.GuessGameActionStart,
Value: &pb.GuessGameAction_Start{head},
Value: &pb.GuessGameAction_Start{head},
}
tx, err := types.CreateFormatTx(pb.GuessX, types.Encode(val))
if err != nil {
......@@ -69,12 +62,12 @@ func (c *channelClient) GuessPublish(ctx context.Context, head *pb.GuessGamePubl
return &types.UnsignTx{Data: data}, nil
}
func (c *channelClient) Show(ctx context.Context, head *pb.PBGameQuery) (*types.UnsignTx, error) {
val := &pb.PBGameAction{
Ty: pb.PBGameActionQuery,
Value: &pb.PBGameAction_Query{head},
func (c *channelClient) Show(ctx context.Context, head *pb.GuessGameQuery) (*types.UnsignTx, error) {
val := &pb.GuessGameAction{
Ty: pb.GuessGameActionQuery,
Value: &pb.GuessGameAction_Query{head},
}
tx, err := types.CreateFormatTx(pb.PokerBullX, types.Encode(val))
tx, err := types.CreateFormatTx(pb.GuessX, types.Encode(val))
if err != nil {
return nil, err
}
......
......@@ -13,10 +13,16 @@ const (
GuessGameActionStart = iota + 1
GuessGameActionBet
GuessGameActionStopBet
GuessGameActionAbort
GuessGameActionPublish
GuessGameActionTimeOut
GuessGameActionQuery
GuessGameStatusStart = iota + 1
GuessGameStatusBet
GuessGameStatusStopBet
GuessGameStatusAbort
GuessGameStatusPublish
GuessGameStatusTimeOut
)
const (
......@@ -43,10 +49,6 @@ const (
//建议用github的组织名称,或者用户名字开头, 再加上自己的插件的名字
//如果发生重名,可以通过配置文件修改这些名字
var (
JRPCName = "pokerbull"
PokerBullX = "pokerbull"
ExecerPokerBull = []byte(PokerBullX)
JRPCName = "guess"
GuessX = "guess"
ExecerGuess = []byte(GuessX)
......@@ -58,4 +60,6 @@ const (
FuncName_QueryGameById = "QueryGameById"
FuncName_QueryGameByAddr = "QueryGameByAddr"
FuncName_QueryGameByStatus = "QueryGameByStatus"
//FuncName_QueryGameByAdminAddr = "QueryGameByAdminAddr"
//FuncName_QueryGameByCategory = "QueryGameByCategory"
)
......@@ -27,28 +27,30 @@ const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type GuessGame struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Status uint32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
StartTime int64 `protobuf:"varint,3,opt,name=startTime,proto3" json:"startTime,omitempty"`
StartTxHash string `protobuf:"bytes,4,opt,name=startTxHash,proto3" json:"startTxHash,omitempty"`
Topic string `protobuf:"bytes,5,opt,name=topic,proto3" json:"topic,omitempty"`
Category string `protobuf:"bytes,6,opt,name=category,proto3" json:"category,omitempty"`
Options string `protobuf:"bytes,7,opt,name=options,proto3" json:"options,omitempty"`
MaxTime string `protobuf:"bytes,8,opt,name=maxTime,proto3" json:"maxTime,omitempty"`
MaxHeight int64 `protobuf:"varint,9,opt,name=maxHeight,proto3" json:"maxHeight,omitempty"`
Symbol string `protobuf:"bytes,10,opt,name=symbol,proto3" json:"symbol,omitempty"`
Exec string `protobuf:"bytes,11,opt,name=exec,proto3" json:"exec,omitempty"`
OneBet uint32 `protobuf:"varint,12,opt,name=oneBet,proto3" json:"oneBet,omitempty"`
MaxBets uint32 `protobuf:"varint,13,opt,name=maxBets,proto3" json:"maxBets,omitempty"`
MaxBetsNumber uint32 `protobuf:"varint,14,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"`
Fee uint32 `protobuf:"varint,15,opt,name=fee,proto3" json:"fee,omitempty"`
FeeAddr string `protobuf:"bytes,16,opt,name=feeAddr,proto3" json:"feeAddr,omitempty"`
Expire string `protobuf:"bytes,17,opt,name=expire,proto3" json:"expire,omitempty"`
ExpireHeight int64 `protobuf:"varint,18,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"`
AdminAddr string `protobuf:"bytes,19,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
BetsNumber uint32 `protobuf:"varint,20,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
Plays []*GuessPlayer `protobuf:"bytes,21,rep,name=plays,proto3" json:"plays,omitempty"`
Result string `protobuf:"bytes,22,opt,name=result,proto3" json:"result,omitempty"`
Bets []*GuessBet `protobuf:"bytes,23,rep,name=bets,proto3" json:"bets,omitempty"`
Index int64 `protobuf:"varint,24,opt,name=index,proto3" json:"index,omitempty"`
PreStatus uint32 `protobuf:"varint,3,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
StartTime int64 `protobuf:"varint,4,opt,name=startTime,proto3" json:"startTime,omitempty"`
StartTxHash string `protobuf:"bytes,5,opt,name=startTxHash,proto3" json:"startTxHash,omitempty"`
Topic string `protobuf:"bytes,6,opt,name=topic,proto3" json:"topic,omitempty"`
Category string `protobuf:"bytes,7,opt,name=category,proto3" json:"category,omitempty"`
Options string `protobuf:"bytes,8,opt,name=options,proto3" json:"options,omitempty"`
MaxTime string `protobuf:"bytes,9,opt,name=maxTime,proto3" json:"maxTime,omitempty"`
MaxHeight int64 `protobuf:"varint,10,opt,name=maxHeight,proto3" json:"maxHeight,omitempty"`
Symbol string `protobuf:"bytes,11,opt,name=symbol,proto3" json:"symbol,omitempty"`
Exec string `protobuf:"bytes,12,opt,name=exec,proto3" json:"exec,omitempty"`
OneBet uint32 `protobuf:"varint,13,opt,name=oneBet,proto3" json:"oneBet,omitempty"`
MaxBets uint32 `protobuf:"varint,14,opt,name=maxBets,proto3" json:"maxBets,omitempty"`
MaxBetsNumber uint32 `protobuf:"varint,15,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"`
Fee uint32 `protobuf:"varint,16,opt,name=fee,proto3" json:"fee,omitempty"`
FeeAddr string `protobuf:"bytes,17,opt,name=feeAddr,proto3" json:"feeAddr,omitempty"`
Expire string `protobuf:"bytes,18,opt,name=expire,proto3" json:"expire,omitempty"`
ExpireHeight int64 `protobuf:"varint,19,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"`
AdminAddr string `protobuf:"bytes,20,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
BetsNumber uint32 `protobuf:"varint,21,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
Plays []*GuessPlayer `protobuf:"bytes,22,rep,name=plays,proto3" json:"plays,omitempty"`
Result string `protobuf:"bytes,23,opt,name=result,proto3" json:"result,omitempty"`
Bets []*GuessBet `protobuf:"bytes,24,rep,name=bets,proto3" json:"bets,omitempty"`
Index int64 `protobuf:"varint,25,opt,name=index,proto3" json:"index,omitempty"`
PreIndex int64 `protobuf:"varint,26,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -93,6 +95,13 @@ func (m *GuessGame) GetStatus() uint32 {
return 0
}
func (m *GuessGame) GetPreStatus() uint32 {
if m != nil {
return m.PreStatus
}
return 0
}
func (m *GuessGame) GetStartTime() int64 {
if m != nil {
return m.StartTime
......@@ -247,6 +256,13 @@ func (m *GuessGame) GetIndex() int64 {
return 0
}
func (m *GuessGame) GetPreIndex() int64 {
if m != nil {
return m.PreIndex
}
return 0
}
type GuessPlayer struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Bet *GuessBet `protobuf:"bytes,2,opt,name=bet,proto3" json:"bet,omitempty"`
......@@ -297,6 +313,10 @@ func (m *GuessPlayer) GetBet() *GuessBet {
type GuessBet struct {
Option string `protobuf:"bytes,1,opt,name=option,proto3" json:"option,omitempty"`
BetsNumber uint32 `protobuf:"varint,2,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
IsWinner bool `protobuf:"varint,3,opt,name=isWinner,proto3" json:"isWinner,omitempty"`
Profit uint32 `protobuf:"varint,4,opt,name=profit,proto3" json:"profit,omitempty"`
Index int64 `protobuf:"varint,5,opt,name=index,proto3" json:"index,omitempty"`
PreIndex int64 `protobuf:"varint,6,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -341,6 +361,34 @@ func (m *GuessBet) GetBetsNumber() uint32 {
return 0
}
func (m *GuessBet) GetIsWinner() bool {
if m != nil {
return m.IsWinner
}
return false
}
func (m *GuessBet) GetProfit() uint32 {
if m != nil {
return m.Profit
}
return 0
}
func (m *GuessBet) GetIndex() int64 {
if m != nil {
return m.Index
}
return 0
}
func (m *GuessBet) GetPreIndex() int64 {
if m != nil {
return m.PreIndex
}
return 0
}
//斗牛游戏内容
type PokerBull struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
......@@ -2114,6 +2162,186 @@ func (m *ReplyPBGameList) GetGames() []*PokerBull {
return nil
}
type QueryGuessGameInfo struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
Status int32 `protobuf:"varint,3,opt,name=status,proto3" json:"status,omitempty"`
Index int64 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryGuessGameInfo) Reset() { *m = QueryGuessGameInfo{} }
func (m *QueryGuessGameInfo) String() string { return proto.CompactTextString(m) }
func (*QueryGuessGameInfo) ProtoMessage() {}
func (*QueryGuessGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{27}
}
func (m *QueryGuessGameInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryGuessGameInfo.Unmarshal(m, b)
}
func (m *QueryGuessGameInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryGuessGameInfo.Marshal(b, m, deterministic)
}
func (m *QueryGuessGameInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryGuessGameInfo.Merge(m, src)
}
func (m *QueryGuessGameInfo) XXX_Size() int {
return xxx_messageInfo_QueryGuessGameInfo.Size(m)
}
func (m *QueryGuessGameInfo) XXX_DiscardUnknown() {
xxx_messageInfo_QueryGuessGameInfo.DiscardUnknown(m)
}
var xxx_messageInfo_QueryGuessGameInfo proto.InternalMessageInfo
func (m *QueryGuessGameInfo) GetGameId() string {
if m != nil {
return m.GameId
}
return ""
}
func (m *QueryGuessGameInfo) GetAddr() string {
if m != nil {
return m.Addr
}
return ""
}
func (m *QueryGuessGameInfo) GetStatus() int32 {
if m != nil {
return m.Status
}
return 0
}
func (m *QueryGuessGameInfo) GetIndex() int64 {
if m != nil {
return m.Index
}
return 0
}
type ReplyGuessGameInfo struct {
Game *GuessGame `protobuf:"bytes,1,opt,name=game,proto3" json:"game,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReplyGuessGameInfo) Reset() { *m = ReplyGuessGameInfo{} }
func (m *ReplyGuessGameInfo) String() string { return proto.CompactTextString(m) }
func (*ReplyGuessGameInfo) ProtoMessage() {}
func (*ReplyGuessGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{28}
}
func (m *ReplyGuessGameInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyGuessGameInfo.Unmarshal(m, b)
}
func (m *ReplyGuessGameInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReplyGuessGameInfo.Marshal(b, m, deterministic)
}
func (m *ReplyGuessGameInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReplyGuessGameInfo.Merge(m, src)
}
func (m *ReplyGuessGameInfo) XXX_Size() int {
return xxx_messageInfo_ReplyGuessGameInfo.Size(m)
}
func (m *ReplyGuessGameInfo) XXX_DiscardUnknown() {
xxx_messageInfo_ReplyGuessGameInfo.DiscardUnknown(m)
}
var xxx_messageInfo_ReplyGuessGameInfo proto.InternalMessageInfo
func (m *ReplyGuessGameInfo) GetGame() *GuessGame {
if m != nil {
return m.Game
}
return nil
}
type QueryGuessGameInfos struct {
GameIds []string `protobuf:"bytes,1,rep,name=gameIds,proto3" json:"gameIds,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryGuessGameInfos) Reset() { *m = QueryGuessGameInfos{} }
func (m *QueryGuessGameInfos) String() string { return proto.CompactTextString(m) }
func (*QueryGuessGameInfos) ProtoMessage() {}
func (*QueryGuessGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{29}
}
func (m *QueryGuessGameInfos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryGuessGameInfos.Unmarshal(m, b)
}
func (m *QueryGuessGameInfos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryGuessGameInfos.Marshal(b, m, deterministic)
}
func (m *QueryGuessGameInfos) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryGuessGameInfos.Merge(m, src)
}
func (m *QueryGuessGameInfos) XXX_Size() int {
return xxx_messageInfo_QueryGuessGameInfos.Size(m)
}
func (m *QueryGuessGameInfos) XXX_DiscardUnknown() {
xxx_messageInfo_QueryGuessGameInfos.DiscardUnknown(m)
}
var xxx_messageInfo_QueryGuessGameInfos proto.InternalMessageInfo
func (m *QueryGuessGameInfos) GetGameIds() []string {
if m != nil {
return m.GameIds
}
return nil
}
type ReplyGuessGameInfos struct {
Games []*GuessGame `protobuf:"bytes,1,rep,name=games,proto3" json:"games,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReplyGuessGameInfos) Reset() { *m = ReplyGuessGameInfos{} }
func (m *ReplyGuessGameInfos) String() string { return proto.CompactTextString(m) }
func (*ReplyGuessGameInfos) ProtoMessage() {}
func (*ReplyGuessGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{30}
}
func (m *ReplyGuessGameInfos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyGuessGameInfos.Unmarshal(m, b)
}
func (m *ReplyGuessGameInfos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReplyGuessGameInfos.Marshal(b, m, deterministic)
}
func (m *ReplyGuessGameInfos) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReplyGuessGameInfos.Merge(m, src)
}
func (m *ReplyGuessGameInfos) XXX_Size() int {
return xxx_messageInfo_ReplyGuessGameInfos.Size(m)
}
func (m *ReplyGuessGameInfos) XXX_DiscardUnknown() {
xxx_messageInfo_ReplyGuessGameInfos.DiscardUnknown(m)
}
var xxx_messageInfo_ReplyGuessGameInfos proto.InternalMessageInfo
func (m *ReplyGuessGameInfos) GetGames() []*GuessGame {
if m != nil {
return m.Games
}
return nil
}
type ReceiptPBGame struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
......@@ -2134,7 +2362,7 @@ func (m *ReceiptPBGame) Reset() { *m = ReceiptPBGame{} }
func (m *ReceiptPBGame) String() string { return proto.CompactTextString(m) }
func (*ReceiptPBGame) ProtoMessage() {}
func (*ReceiptPBGame) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{27}
return fileDescriptor_7574406c5d3430e8, []int{31}
}
func (m *ReceiptPBGame) XXX_Unmarshal(b []byte) error {
......@@ -2239,7 +2467,7 @@ func (m *ReceiptGuessGame) Reset() { *m = ReceiptGuessGame{} }
func (m *ReceiptGuessGame) String() string { return proto.CompactTextString(m) }
func (*ReceiptGuessGame) ProtoMessage() {}
func (*ReceiptGuessGame) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{28}
return fileDescriptor_7574406c5d3430e8, []int{32}
}
func (m *ReceiptGuessGame) XXX_Unmarshal(b []byte) error {
......@@ -2312,7 +2540,7 @@ func (m *GuessStartTxReq) Reset() { *m = GuessStartTxReq{} }
func (m *GuessStartTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessStartTxReq) ProtoMessage() {}
func (*GuessStartTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{29}
return fileDescriptor_7574406c5d3430e8, []int{33}
}
func (m *GuessStartTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2444,7 +2672,7 @@ func (m *GuessBetTxReq) Reset() { *m = GuessBetTxReq{} }
func (m *GuessBetTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessBetTxReq) ProtoMessage() {}
func (*GuessBetTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{30}
return fileDescriptor_7574406c5d3430e8, []int{34}
}
func (m *GuessBetTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2497,7 +2725,7 @@ func (m *GuessAbortTxReq) Reset() { *m = GuessAbortTxReq{} }
func (m *GuessAbortTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessAbortTxReq) ProtoMessage() {}
func (*GuessAbortTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{31}
return fileDescriptor_7574406c5d3430e8, []int{35}
}
func (m *GuessAbortTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2537,7 +2765,7 @@ func (m *GuessPublishTxReq) Reset() { *m = GuessPublishTxReq{} }
func (m *GuessPublishTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessPublishTxReq) ProtoMessage() {}
func (*GuessPublishTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{32}
return fileDescriptor_7574406c5d3430e8, []int{36}
}
func (m *GuessPublishTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2584,7 +2812,7 @@ func (m *PBContinueTxReq) Reset() { *m = PBContinueTxReq{} }
func (m *PBContinueTxReq) String() string { return proto.CompactTextString(m) }
func (*PBContinueTxReq) ProtoMessage() {}
func (*PBContinueTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{33}
return fileDescriptor_7574406c5d3430e8, []int{37}
}
func (m *PBContinueTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2631,7 +2859,7 @@ func (m *PBQuitTxReq) Reset() { *m = PBQuitTxReq{} }
func (m *PBQuitTxReq) String() string { return proto.CompactTextString(m) }
func (*PBQuitTxReq) ProtoMessage() {}
func (*PBQuitTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{34}
return fileDescriptor_7574406c5d3430e8, []int{38}
}
func (m *PBQuitTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2678,7 +2906,7 @@ func (m *PBQueryReq) Reset() { *m = PBQueryReq{} }
func (m *PBQueryReq) String() string { return proto.CompactTextString(m) }
func (*PBQueryReq) ProtoMessage() {}
func (*PBQueryReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{35}
return fileDescriptor_7574406c5d3430e8, []int{39}
}
func (m *PBQueryReq) XXX_Unmarshal(b []byte) error {
......@@ -2727,7 +2955,7 @@ func (m *GuessGameRecord) Reset() { *m = GuessGameRecord{} }
func (m *GuessGameRecord) String() string { return proto.CompactTextString(m) }
func (*GuessGameRecord) ProtoMessage() {}
func (*GuessGameRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{36}
return fileDescriptor_7574406c5d3430e8, []int{40}
}
func (m *GuessGameRecord) XXX_Unmarshal(b []byte) error {
......@@ -2781,7 +3009,7 @@ func (m *GuessGameIndexRecord) Reset() { *m = GuessGameIndexRecord{} }
func (m *GuessGameIndexRecord) String() string { return proto.CompactTextString(m) }
func (*GuessGameIndexRecord) ProtoMessage() {}
func (*GuessGameIndexRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{37}
return fileDescriptor_7574406c5d3430e8, []int{41}
}
func (m *GuessGameIndexRecord) XXX_Unmarshal(b []byte) error {
......@@ -2827,7 +3055,7 @@ func (m *GuessGameRecords) Reset() { *m = GuessGameRecords{} }
func (m *GuessGameRecords) String() string { return proto.CompactTextString(m) }
func (*GuessGameRecords) ProtoMessage() {}
func (*GuessGameRecords) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{38}
return fileDescriptor_7574406c5d3430e8, []int{42}
}
func (m *GuessGameRecords) XXX_Unmarshal(b []byte) error {
......@@ -2883,6 +3111,10 @@ func init() {
proto.RegisterType((*ReplyPBGame)(nil), "types.ReplyPBGame")
proto.RegisterType((*QueryPBGameInfos)(nil), "types.QueryPBGameInfos")
proto.RegisterType((*ReplyPBGameList)(nil), "types.ReplyPBGameList")
proto.RegisterType((*QueryGuessGameInfo)(nil), "types.QueryGuessGameInfo")
proto.RegisterType((*ReplyGuessGameInfo)(nil), "types.ReplyGuessGameInfo")
proto.RegisterType((*QueryGuessGameInfos)(nil), "types.QueryGuessGameInfos")
proto.RegisterType((*ReplyGuessGameInfos)(nil), "types.ReplyGuessGameInfos")
proto.RegisterType((*ReceiptPBGame)(nil), "types.ReceiptPBGame")
proto.RegisterType((*ReceiptGuessGame)(nil), "types.ReceiptGuessGame")
proto.RegisterType((*GuessStartTxReq)(nil), "types.GuessStartTxReq")
......@@ -2900,106 +3132,112 @@ func init() {
func init() { proto.RegisterFile("guess.proto", fileDescriptor_7574406c5d3430e8) }
var fileDescriptor_7574406c5d3430e8 = []byte{
// 1573 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x5f, 0x6f, 0x13, 0x47,
0x10, 0x8f, 0x7d, 0x3e, 0xff, 0x19, 0xc7, 0x4e, 0xb2, 0x40, 0x58, 0xa1, 0xaa, 0x4a, 0x8f, 0x14,
0x42, 0x55, 0x50, 0x95, 0x48, 0xb4, 0xb4, 0x52, 0xa5, 0x1c, 0x48, 0x04, 0x09, 0x21, 0xb3, 0xa1,
0xa2, 0xaf, 0x17, 0x7b, 0x09, 0x27, 0xec, 0x3b, 0xe7, 0xee, 0x0c, 0xf1, 0x5b, 0xd5, 0x7e, 0x82,
0x3e, 0xf4, 0x13, 0x54, 0xea, 0xb7, 0xea, 0x73, 0x3f, 0x42, 0x5f, 0xab, 0x9d, 0xd9, 0xf5, 0xed,
0x5d, 0xce, 0x86, 0x20, 0xde, 0xfa, 0xb6, 0xb3, 0x33, 0x3b, 0x3b, 0x7f, 0x77, 0x7e, 0x77, 0xd0,
0x3d, 0x9d, 0xc9, 0x34, 0xbd, 0x37, 0x4d, 0xe2, 0x2c, 0x66, 0x6e, 0x36, 0x9f, 0xca, 0xf4, 0xc6,
0x56, 0x96, 0x04, 0x51, 0x1a, 0x0c, 0xb3, 0x30, 0x8e, 0x88, 0xe3, 0xfd, 0xe5, 0x42, 0xe7, 0xb1,
0x92, 0x7c, 0x1c, 0x4c, 0x24, 0xdb, 0x86, 0xe6, 0x69, 0x30, 0x91, 0x4f, 0x46, 0xbc, 0xb6, 0x53,
0xdb, 0xeb, 0x08, 0x4d, 0xa9, 0xfd, 0x34, 0x0b, 0xb2, 0x59, 0xca, 0xeb, 0x3b, 0xb5, 0xbd, 0x9e,
0xd0, 0x14, 0xfb, 0x0c, 0x3a, 0x69, 0x16, 0x24, 0xd9, 0x8b, 0x70, 0x22, 0xb9, 0xb3, 0x53, 0xdb,
0x73, 0x44, 0xbe, 0xc1, 0x76, 0xa0, 0x4b, 0xc4, 0xf9, 0x51, 0x90, 0xbe, 0xe6, 0x0d, 0x54, 0x69,
0x6f, 0xb1, 0xab, 0xe0, 0x66, 0xf1, 0x34, 0x1c, 0x72, 0x17, 0x79, 0x44, 0xb0, 0x1b, 0xd0, 0x1e,
0x06, 0x99, 0x3c, 0x8d, 0x93, 0x39, 0x6f, 0x22, 0x63, 0x41, 0x33, 0x0e, 0xad, 0x78, 0xaa, 0xec,
0x4f, 0x79, 0x0b, 0x59, 0x86, 0x54, 0x9c, 0x49, 0x70, 0x8e, 0x96, 0xb4, 0x89, 0xa3, 0x49, 0x65,
0xe5, 0x24, 0x38, 0x3f, 0x92, 0xe1, 0xe9, 0xeb, 0x8c, 0x77, 0xc8, 0xca, 0xc5, 0x06, 0xfa, 0x36,
0x9f, 0x9c, 0xc4, 0x63, 0x0e, 0xe4, 0x33, 0x51, 0x8c, 0x41, 0x43, 0x9e, 0xcb, 0x21, 0xef, 0xe2,
0x2e, 0xae, 0x95, 0x6c, 0x1c, 0x49, 0x5f, 0x66, 0x7c, 0x9d, 0xe2, 0x40, 0x94, 0xbe, 0xdb, 0x97,
0x59, 0xca, 0x7b, 0xc8, 0x30, 0x24, 0xdb, 0x85, 0x9e, 0x5e, 0x3e, 0x9b, 0x4d, 0x4e, 0x64, 0xc2,
0xfb, 0xc8, 0x2f, 0x6e, 0xb2, 0x4d, 0x70, 0x5e, 0x49, 0xc9, 0x37, 0x90, 0xa7, 0x96, 0x4a, 0xe3,
0x2b, 0x29, 0x0f, 0x47, 0xa3, 0x84, 0x6f, 0x92, 0x37, 0x9a, 0x54, 0x36, 0xc8, 0xf3, 0x69, 0x98,
0x48, 0xbe, 0x45, 0xf6, 0x12, 0xc5, 0x3c, 0x58, 0xa7, 0x95, 0x76, 0x94, 0xa1, 0xa3, 0x85, 0x3d,
0x15, 0x89, 0x60, 0x34, 0x09, 0x23, 0xd4, 0x7b, 0x05, 0x8f, 0xe7, 0x1b, 0xec, 0x73, 0x80, 0x93,
0xdc, 0xd0, 0xab, 0x68, 0x8c, 0xb5, 0xc3, 0xf6, 0xc0, 0x9d, 0x8e, 0x83, 0x79, 0xca, 0xaf, 0xed,
0x38, 0x7b, 0xdd, 0x7d, 0x76, 0x0f, 0xab, 0xea, 0x1e, 0x96, 0xcf, 0x60, 0x1c, 0xcc, 0x65, 0x22,
0x48, 0x40, 0xd9, 0x98, 0xc8, 0x74, 0x36, 0xce, 0xf8, 0x36, 0xd9, 0x48, 0x14, 0xbb, 0x09, 0x0d,
0xa5, 0x8f, 0x5f, 0x47, 0x05, 0x1b, 0xb6, 0x02, 0x5f, 0x66, 0x02, 0x99, 0xaa, 0x28, 0xc2, 0x68,
0x24, 0xcf, 0x39, 0x47, 0x0f, 0x88, 0xf0, 0x1e, 0x41, 0xd7, 0xba, 0x48, 0x65, 0x27, 0x50, 0x4e,
0x50, 0x9d, 0xe2, 0x9a, 0x7d, 0x01, 0xce, 0x89, 0xcc, 0xb0, 0x44, 0x2b, 0x94, 0x2b, 0x9e, 0xe7,
0x43, 0xdb, 0x6c, 0x60, 0x32, 0xb1, 0x76, 0x4c, 0xb1, 0x13, 0x55, 0x0a, 0x43, 0xbd, 0x1c, 0x06,
0xef, 0x5f, 0x07, 0x3a, 0x83, 0xf8, 0x8d, 0x4c, 0xfc, 0xd9, 0x78, 0xfc, 0x81, 0x2d, 0xe3, 0x7e,
0xca, 0x96, 0x79, 0x1b, 0x8c, 0x67, 0x12, 0x5b, 0xc6, 0x11, 0x44, 0xb0, 0x5d, 0x70, 0xa7, 0xca,
0x24, 0xec, 0x97, 0xee, 0x7e, 0x5f, 0x3b, 0x3f, 0xf0, 0xd1, 0x50, 0x41, 0x4c, 0x76, 0x07, 0x5a,
0x53, 0x0c, 0x9f, 0x6a, 0x1e, 0x3b, 0x03, 0x03, 0x5f, 0xe7, 0xcf, 0xf0, 0x95, 0x99, 0xb4, 0x7c,
0x36, 0x9b, 0x60, 0x3f, 0xb9, 0x22, 0xdf, 0x50, 0x8a, 0x28, 0xa3, 0x29, 0xef, 0x94, 0x14, 0x09,
0xdc, 0x17, 0x86, 0x9f, 0x67, 0x13, 0xac, 0x6c, 0xa2, 0xfa, 0x44, 0xbe, 0x7d, 0x82, 0x9c, 0x2e,
0x45, 0x61, 0xb1, 0xa1, 0x1e, 0x80, 0xb3, 0x59, 0x48, 0x21, 0x5a, 0x47, 0xe6, 0x82, 0x56, 0xd9,
0xc1, 0x35, 0x05, 0xa8, 0x87, 0x01, 0xb2, 0x76, 0x14, 0x7f, 0x24, 0x83, 0xb1, 0x4c, 0xb0, 0xc6,
0xfb, 0xc4, 0xcf, 0x77, 0xd4, 0xcd, 0x61, 0xfa, 0x32, 0x08, 0xb3, 0x30, 0x3a, 0xc5, 0x86, 0x6b,
0x8b, 0x7c, 0x43, 0xdb, 0x75, 0x4c, 0x89, 0xdb, 0xd4, 0x6e, 0x9b, 0x0d, 0xef, 0xd7, 0x1a, 0x34,
0x07, 0xfe, 0x51, 0x10, 0x8d, 0x94, 0x5b, 0xc3, 0x20, 0x19, 0xa5, 0xbc, 0xb6, 0xe3, 0xec, 0xb9,
0x82, 0x08, 0xab, 0xee, 0x75, 0xd2, 0x75, 0xdd, 0x73, 0x68, 0xa9, 0x0a, 0x95, 0x69, 0x8a, 0x29,
0xef, 0x08, 0x43, 0x62, 0x78, 0xd2, 0x97, 0x61, 0x84, 0xa9, 0x6e, 0x0b, 0x22, 0x54, 0x00, 0xc6,
0xf2, 0xad, 0x4c, 0x82, 0x53, 0xca, 0xb3, 0x2b, 0x16, 0xb4, 0xf7, 0x0e, 0xda, 0x26, 0x5d, 0xec,
0x26, 0xb8, 0xaf, 0x83, 0x48, 0x5b, 0xd1, 0xdd, 0xef, 0x2d, 0xb2, 0xa0, 0x6c, 0x14, 0xc4, 0xb3,
0x2f, 0xaf, 0x17, 0x2f, 0xdf, 0x86, 0x66, 0x46, 0x71, 0xa4, 0x42, 0xd4, 0x94, 0x32, 0x2a, 0x91,
0xc1, 0x68, 0x6e, 0x8c, 0x42, 0xc2, 0xfb, 0xb3, 0xa6, 0x6e, 0x16, 0xa6, 0x93, 0x3f, 0xe0, 0xe6,
0x6d, 0x68, 0xbe, 0x0b, 0xa3, 0x48, 0x77, 0x51, 0x47, 0x68, 0xaa, 0xe0, 0x9e, 0x53, 0x74, 0x4f,
0x9d, 0xa1, 0x6c, 0xe9, 0xe2, 0xd7, 0x14, 0xbb, 0x05, 0x7d, 0x5a, 0x3d, 0x2d, 0x06, 0xa6, 0xb4,
0xeb, 0x3d, 0x80, 0x96, 0xae, 0xfa, 0x25, 0x39, 0xe2, 0xd0, 0x9a, 0xc6, 0x61, 0x94, 0x69, 0xab,
0x5c, 0x61, 0x48, 0xef, 0xef, 0x1a, 0xac, 0x0f, 0x7c, 0x35, 0x08, 0x0f, 0x71, 0x44, 0xb2, 0xaf,
0xc0, 0xc5, 0xd6, 0xc3, 0xd6, 0xce, 0x1f, 0x3c, 0x92, 0x39, 0x56, 0x9c, 0xa3, 0x35, 0x41, 0x22,
0xec, 0x00, 0xda, 0xc3, 0x38, 0xca, 0xc2, 0x68, 0x26, 0xf5, 0x0b, 0x74, 0xad, 0x20, 0xfe, 0x50,
0x33, 0x8f, 0xd6, 0xc4, 0x42, 0x90, 0xdd, 0x86, 0x86, 0x2a, 0x5d, 0x0c, 0x42, 0x77, 0x7f, 0xab,
0x70, 0xe0, 0xf9, 0x2c, 0x54, 0xea, 0x51, 0x40, 0x59, 0x72, 0x36, 0x93, 0x09, 0x65, 0xa4, 0x6c,
0xc9, 0x73, 0xc5, 0x51, 0x96, 0xa0, 0x08, 0xeb, 0x43, 0x3d, 0x9b, 0x63, 0xbb, 0xb9, 0xa2, 0x9e,
0xcd, 0xfd, 0x96, 0x7e, 0x31, 0xbc, 0x43, 0xe8, 0x5a, 0xa6, 0xe7, 0x2f, 0x49, 0xcd, 0x7e, 0x49,
0x0a, 0x8d, 0x5f, 0x2f, 0x35, 0xbe, 0xb7, 0x07, 0xfd, 0xa2, 0x3b, 0xcb, 0xde, 0x3f, 0x6f, 0x17,
0x20, 0xf7, 0x63, 0xa9, 0xd4, 0x97, 0xc6, 0x24, 0xf4, 0x61, 0xa9, 0xd8, 0x1f, 0x75, 0xd8, 0x58,
0xa0, 0x14, 0x9d, 0x9c, 0xbb, 0xc5, 0xe4, 0x5c, 0xb3, 0xdf, 0xfb, 0x8a, 0xfc, 0xdc, 0xb6, 0x87,
0xc3, 0x95, 0xb2, 0xb0, 0x2f, 0x95, 0xa8, 0x92, 0x50, 0x7a, 0x83, 0x93, 0x38, 0x31, 0x49, 0xb9,
0xa0, 0xf7, 0x50, 0x31, 0x95, 0x5e, 0x94, 0x62, 0x07, 0xd0, 0x9a, 0xce, 0x4e, 0xc6, 0xa1, 0x7e,
0xad, 0xbb, 0xfb, 0xd7, 0xcb, 0x07, 0x06, 0xc4, 0x3e, 0x5a, 0x13, 0x46, 0x52, 0xdd, 0x41, 0xe9,
0x74, 0xab, 0xef, 0xa8, 0xcc, 0x68, 0x13, 0x27, 0x51, 0x21, 0xa3, 0xbf, 0x38, 0xd0, 0x2f, 0x3a,
0x9c, 0x43, 0xaa, 0x9a, 0x0d, 0xa9, 0x2c, 0xd8, 0x54, 0x2f, 0xc2, 0x26, 0x1b, 0x6c, 0x39, 0x17,
0xc1, 0x96, 0x81, 0x54, 0x8d, 0x15, 0x90, 0xca, 0x5d, 0x0e, 0xa9, 0x9a, 0x95, 0x90, 0xaa, 0x55,
0x09, 0xa9, 0xda, 0xcb, 0x20, 0x55, 0xe7, 0x3d, 0x90, 0x0a, 0x56, 0x40, 0x2a, 0x35, 0x5b, 0x1a,
0x17, 0x20, 0xd5, 0xfa, 0x32, 0x48, 0xd5, 0x5b, 0x09, 0xa9, 0xfa, 0x17, 0x21, 0x95, 0xf7, 0x33,
0xac, 0xdb, 0x55, 0xb4, 0x0a, 0x0f, 0x68, 0xb4, 0x51, 0x2f, 0xa0, 0x0d, 0x0e, 0x2d, 0x8d, 0x2d,
0x30, 0xfc, 0x3d, 0x61, 0x48, 0xd5, 0x6b, 0xc5, 0xa2, 0x5b, 0xda, 0x1e, 0x3e, 0x6c, 0x96, 0xab,
0x6d, 0x95, 0x1d, 0xd6, 0x88, 0x5a, 0x40, 0x33, 0xef, 0x3b, 0xeb, 0xb6, 0x95, 0xcd, 0xa8, 0xab,
0xb1, 0x6e, 0xaa, 0xd1, 0x3b, 0x83, 0x9b, 0x78, 0x80, 0x1a, 0xf9, 0x69, 0x98, 0x66, 0xfe, 0x9c,
0x06, 0xe6, 0x61, 0x34, 0x1a, 0x2c, 0x30, 0x43, 0x0e, 0x88, 0x6a, 0x65, 0x40, 0xb4, 0xfc, 0xc1,
0xc9, 0xe1, 0x83, 0x63, 0x83, 0xc1, 0x17, 0xe6, 0xa1, 0x16, 0x72, 0x18, 0x27, 0xa3, 0x4b, 0x83,
0xb0, 0x6a, 0xad, 0x87, 0xb0, 0x45, 0x5a, 0x11, 0x85, 0xbc, 0x47, 0xf5, 0x42, 0x45, 0xdd, 0x56,
0xf1, 0x23, 0xf4, 0x6c, 0xc3, 0x52, 0x76, 0x57, 0x21, 0x25, 0x5c, 0xea, 0x49, 0x79, 0xa5, 0xf0,
0x74, 0x93, 0x98, 0x30, 0x32, 0xde, 0x1b, 0xd8, 0xb0, 0x62, 0xf9, 0x24, 0x7a, 0x15, 0x2f, 0x35,
0xc0, 0x20, 0xe0, 0xba, 0x85, 0x80, 0x73, 0x7f, 0x9d, 0x6a, 0x7f, 0x1b, 0xb6, 0xb1, 0x07, 0xd0,
0x15, 0x72, 0x3a, 0xd6, 0x97, 0xb1, 0x5d, 0x68, 0x28, 0xd5, 0xfa, 0x3d, 0xdd, 0x34, 0x76, 0x1a,
0xa4, 0x2b, 0x90, 0xeb, 0x7d, 0x0d, 0x9b, 0x25, 0x0b, 0x71, 0xa4, 0x92, 0x51, 0xe4, 0x64, 0x47,
0x18, 0xd2, 0x7b, 0x00, 0x1b, 0xd6, 0x15, 0xaa, 0x36, 0xd8, 0x2d, 0x70, 0x15, 0xd7, 0xc4, 0xe3,
0xe2, 0x3d, 0xc4, 0xf6, 0x7e, 0xaf, 0x43, 0x4f, 0xc8, 0xa1, 0x0c, 0xa7, 0x99, 0x36, 0xf0, 0xb2,
0x59, 0x36, 0x11, 0x72, 0xac, 0x08, 0x55, 0x46, 0xa2, 0x08, 0x47, 0xdd, 0x32, 0x1c, 0x2d, 0x54,
0x68, 0xb3, 0xa2, 0x42, 0x69, 0x8c, 0xb6, 0x4a, 0x63, 0x34, 0x87, 0x99, 0xed, 0x32, 0xcc, 0xe4,
0x39, 0x10, 0xef, 0x50, 0xc0, 0x6c, 0xdc, 0xbd, 0x00, 0xa0, 0x50, 0x06, 0xa0, 0x63, 0xd8, 0xd4,
0x21, 0xf9, 0xf8, 0x6f, 0xf6, 0x0f, 0x8e, 0x8a, 0xf7, 0x9b, 0xa3, 0xa7, 0xee, 0x31, 0x7d, 0x7f,
0x08, 0x79, 0x76, 0xe9, 0xf1, 0xb2, 0xfa, 0x73, 0xe7, 0x12, 0x03, 0xa6, 0xf7, 0x7f, 0x19, 0x30,
0xbd, 0xd2, 0x80, 0x39, 0x86, 0x9e, 0xf9, 0x64, 0xa5, 0x14, 0x5c, 0x76, 0xc2, 0x30, 0xfd, 0xd1,
0x4d, 0xe3, 0x05, 0xd7, 0xde, 0x1d, 0x9d, 0x59, 0x9c, 0x2b, 0x2b, 0xd5, 0x7a, 0x0f, 0x61, 0x8b,
0x3e, 0xbc, 0x69, 0xb0, 0xbc, 0xd7, 0x86, 0xca, 0xe9, 0xf2, 0x03, 0x6c, 0x0c, 0x7c, 0x83, 0x19,
0x57, 0xab, 0xd0, 0x71, 0xa5, 0x67, 0x55, 0x2d, 0xbd, 0x6f, 0x15, 0x48, 0x7c, 0x8e, 0x9f, 0x78,
0x97, 0x3b, 0x78, 0x5f, 0x61, 0x50, 0x7c, 0xad, 0x2e, 0x77, 0xee, 0xa5, 0x85, 0x36, 0x3f, 0xe9,
0x84, 0x79, 0x04, 0x57, 0x17, 0x8a, 0x3f, 0x7e, 0xc8, 0x3c, 0xb2, 0xc6, 0xbd, 0x99, 0x33, 0xdf,
0x94, 0xe7, 0xcc, 0x76, 0x19, 0x53, 0x96, 0x46, 0xcd, 0xfe, 0x3f, 0x35, 0x70, 0xf1, 0x1f, 0x21,
0xbb, 0x0f, 0x90, 0xb7, 0x39, 0xab, 0x06, 0xd2, 0x37, 0xcc, 0x17, 0xfe, 0x4f, 0x51, 0x1a, 0x9e,
0x46, 0x2f, 0xce, 0xbd, 0x35, 0xb6, 0x6f, 0xfd, 0x4c, 0xa9, 0x42, 0xd4, 0x55, 0x67, 0xcc, 0x5d,
0x04, 0x68, 0xaa, 0xc1, 0x75, 0xd5, 0xb9, 0xef, 0x35, 0xcc, 0x32, 0xf0, 0x66, 0x19, 0xca, 0xae,
0x38, 0x7b, 0xd2, 0xc4, 0x5f, 0x9d, 0x07, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x81, 0xc1,
0x51, 0x13, 0x15, 0x00, 0x00,
// 1678 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0xcd, 0x6e, 0xdb, 0xc6,
0x13, 0xb7, 0x3e, 0xa8, 0x8f, 0x91, 0x25, 0xdb, 0xeb, 0xc4, 0xe1, 0xdf, 0xf8, 0xa3, 0x70, 0x19,
0x37, 0x71, 0x8a, 0x26, 0x2d, 0x6c, 0x20, 0x6d, 0x52, 0xb4, 0x80, 0x95, 0x00, 0x71, 0x80, 0x20,
0x50, 0xd6, 0x29, 0xd2, 0x2b, 0x2d, 0xad, 0x1d, 0x22, 0x12, 0x49, 0x93, 0x54, 0x62, 0xdd, 0x8a,
0xf6, 0x09, 0x7a, 0xe8, 0x13, 0xf4, 0xd2, 0x97, 0x2a, 0xd0, 0x5b, 0x1f, 0xa1, 0xd7, 0x62, 0x67,
0x76, 0xc9, 0x25, 0x45, 0xc9, 0x71, 0xd0, 0x9e, 0x7a, 0xdb, 0xd9, 0xd9, 0xdd, 0xf9, 0x9e, 0xf9,
0x91, 0xd0, 0x39, 0x9b, 0x8a, 0x38, 0xbe, 0x17, 0x46, 0x41, 0x12, 0x30, 0x2b, 0x99, 0x85, 0x22,
0xde, 0xde, 0x48, 0x22, 0xd7, 0x8f, 0xdd, 0x61, 0xe2, 0x05, 0x3e, 0x71, 0x9c, 0x3f, 0x2c, 0x68,
0x3f, 0x91, 0x27, 0x9f, 0xb8, 0x13, 0xc1, 0xb6, 0xa0, 0x71, 0xe6, 0x4e, 0xc4, 0xd3, 0x91, 0x5d,
0xd9, 0xa9, 0xec, 0xb5, 0xb9, 0xa2, 0xe4, 0x7e, 0x9c, 0xb8, 0xc9, 0x34, 0xb6, 0xab, 0x3b, 0x95,
0xbd, 0x2e, 0x57, 0x14, 0xfb, 0x3f, 0xb4, 0xc3, 0x48, 0x1c, 0x13, 0xab, 0x86, 0xac, 0x6c, 0x43,
0x72, 0xe3, 0xc4, 0x8d, 0x92, 0x97, 0xde, 0x44, 0xd8, 0xf5, 0x9d, 0xca, 0x5e, 0x8d, 0x67, 0x1b,
0x6c, 0x07, 0x3a, 0x44, 0x5c, 0x1c, 0xb9, 0xf1, 0x6b, 0xdb, 0x42, 0x81, 0xe6, 0x16, 0xbb, 0x06,
0x56, 0x12, 0x84, 0xde, 0xd0, 0x6e, 0x20, 0x8f, 0x08, 0xb6, 0x0d, 0xad, 0xa1, 0x9b, 0x88, 0xb3,
0x20, 0x9a, 0xd9, 0x4d, 0x64, 0xa4, 0x34, 0xb3, 0xa1, 0x19, 0x84, 0xd2, 0xba, 0xd8, 0x6e, 0x21,
0x4b, 0x93, 0x92, 0x33, 0x71, 0x2f, 0x50, 0x93, 0x36, 0x71, 0x14, 0x29, 0xb5, 0x9c, 0xb8, 0x17,
0x47, 0xc2, 0x3b, 0x7b, 0x9d, 0xd8, 0x40, 0x5a, 0xa6, 0x1b, 0x68, 0xf9, 0x6c, 0x72, 0x12, 0x8c,
0xed, 0x0e, 0x79, 0x84, 0x28, 0xc6, 0xa0, 0x2e, 0x2e, 0xc4, 0xd0, 0x5e, 0xc5, 0x5d, 0x5c, 0xcb,
0xb3, 0x81, 0x2f, 0xfa, 0x22, 0xb1, 0xbb, 0xe4, 0x25, 0xa2, 0x94, 0xec, 0xbe, 0x48, 0x62, 0xbb,
0x87, 0x0c, 0x4d, 0xb2, 0x5d, 0xe8, 0xaa, 0xe5, 0xf3, 0xe9, 0xe4, 0x44, 0x44, 0xf6, 0x1a, 0xf2,
0xf3, 0x9b, 0x6c, 0x1d, 0x6a, 0xa7, 0x42, 0xd8, 0xeb, 0xc8, 0x93, 0x4b, 0xf9, 0xe2, 0xa9, 0x10,
0x87, 0xa3, 0x51, 0x64, 0x6f, 0x90, 0x35, 0x8a, 0x94, 0x3a, 0x88, 0x8b, 0xd0, 0x8b, 0x84, 0xcd,
0x48, 0x5f, 0xa2, 0x98, 0x03, 0xab, 0xb4, 0x52, 0x86, 0x6e, 0xa2, 0xa1, 0xb9, 0x3d, 0xe9, 0x09,
0x77, 0x34, 0xf1, 0x7c, 0x7c, 0xf7, 0x1a, 0x5e, 0xcf, 0x36, 0xd8, 0x47, 0x00, 0x27, 0x99, 0xa2,
0xd7, 0x51, 0x19, 0x63, 0x87, 0xed, 0x81, 0x15, 0x8e, 0xdd, 0x59, 0x6c, 0x6f, 0xed, 0xd4, 0xf6,
0x3a, 0xfb, 0xec, 0x1e, 0xe6, 0xdc, 0x3d, 0x4c, 0xae, 0xc1, 0xd8, 0x9d, 0x89, 0x88, 0xd3, 0x01,
0xa9, 0x63, 0x24, 0xe2, 0xe9, 0x38, 0xb1, 0x6f, 0x90, 0x8e, 0x44, 0xb1, 0x9b, 0x50, 0x97, 0xef,
0xd9, 0x36, 0x3e, 0xb0, 0x66, 0x3e, 0xd0, 0x17, 0x09, 0x47, 0xa6, 0x4c, 0x0a, 0xcf, 0x1f, 0x89,
0x0b, 0xfb, 0x7f, 0x68, 0x01, 0x11, 0x32, 0x29, 0xc2, 0x48, 0x3c, 0x45, 0xc6, 0x36, 0x32, 0x52,
0xda, 0x79, 0x0c, 0x1d, 0x43, 0x09, 0x19, 0x39, 0x57, 0x1a, 0x48, 0x19, 0x8e, 0x6b, 0xf6, 0x31,
0xd4, 0x4e, 0x44, 0x82, 0xc9, 0x5d, 0x22, 0x58, 0xf2, 0x9c, 0xdf, 0x2a, 0xd0, 0xd2, 0x3b, 0x18,
0x69, 0x4c, 0x2c, 0x5d, 0x27, 0x44, 0x15, 0x7c, 0x54, 0x9d, 0xf3, 0xd1, 0x36, 0xb4, 0xbc, 0xf8,
0x95, 0xe7, 0xfb, 0x22, 0xc2, 0x72, 0x69, 0xf1, 0x94, 0x96, 0x6f, 0x86, 0x51, 0x70, 0xea, 0x25,
0x58, 0x2a, 0x5d, 0xae, 0xa8, 0xcc, 0x60, 0x6b, 0x91, 0xc1, 0x8d, 0x82, 0xc1, 0x7f, 0xd5, 0xa0,
0x3d, 0x08, 0xde, 0x88, 0xa8, 0x3f, 0x1d, 0x8f, 0xdf, 0xb3, 0xa6, 0x2d, 0xb3, 0xa6, 0xb3, 0xaa,
0xad, 0x5d, 0x52, 0xb5, 0xf5, 0xd2, 0xaa, 0x7d, 0xeb, 0x8e, 0xa7, 0x42, 0xeb, 0x8b, 0x04, 0xdb,
0x05, 0x2b, 0x94, 0x2a, 0xa1, 0xb2, 0x9d, 0xfd, 0x9e, 0xf2, 0xf1, 0xa0, 0x8f, 0x8a, 0x72, 0x62,
0xb2, 0x3b, 0xd0, 0x0c, 0x31, 0x4a, 0xb1, 0xdd, 0xcc, 0x25, 0xc1, 0xa0, 0xaf, 0x52, 0x48, 0xf3,
0xb1, 0xf5, 0xe0, 0xf2, 0xf9, 0x74, 0x82, 0xc5, 0x6e, 0xf1, 0x6c, 0x43, 0x3e, 0x44, 0x49, 0x15,
0xdb, 0xed, 0xc2, 0x43, 0x1c, 0xf7, 0xb9, 0xe6, 0x67, 0xfe, 0x05, 0xd3, 0xbf, 0xd4, 0xd9, 0xde,
0x92, 0x83, 0x3b, 0xe4, 0x85, 0x74, 0x43, 0x7a, 0xff, 0x7c, 0xea, 0x91, 0x8b, 0x56, 0xc9, 0xfb,
0x9a, 0x96, 0x39, 0x80, 0x6b, 0x72, 0x50, 0x17, 0x1d, 0x64, 0xec, 0x48, 0xfe, 0x48, 0xb8, 0x63,
0x11, 0x61, 0x99, 0xf5, 0x88, 0x9f, 0xed, 0x48, 0xc9, 0x5e, 0xfc, 0xca, 0xf5, 0x12, 0xcf, 0x3f,
0xc3, 0x7e, 0xd0, 0xe2, 0xd9, 0x46, 0xbe, 0xe3, 0xae, 0x2b, 0xb3, 0xf5, 0x86, 0xf3, 0x63, 0x05,
0x1a, 0x83, 0xfe, 0x91, 0xeb, 0x8f, 0xa4, 0x59, 0x43, 0x37, 0x1a, 0xc5, 0x76, 0x65, 0xa7, 0xb6,
0x67, 0x71, 0x22, 0x8c, 0xd2, 0x53, 0x41, 0x57, 0xa5, 0x67, 0x43, 0x53, 0x16, 0x82, 0x88, 0xa9,
0x8d, 0xb7, 0xb9, 0x26, 0xd1, 0x3d, 0x32, 0x45, 0x31, 0xd4, 0x2d, 0x4e, 0x84, 0x74, 0xc0, 0x58,
0xbc, 0x15, 0x91, 0x7b, 0x46, 0x71, 0xb6, 0x78, 0x4a, 0x3b, 0xef, 0xa0, 0xa5, 0xc3, 0xc5, 0x6e,
0x82, 0xf5, 0xda, 0xf5, 0x95, 0x16, 0x9d, 0xfd, 0x6e, 0x1a, 0x05, 0xa9, 0x23, 0x27, 0x9e, 0x29,
0xbc, 0x9a, 0x17, 0xbe, 0x05, 0x8d, 0x84, 0xfc, 0x48, 0x89, 0xa8, 0x28, 0xa9, 0x54, 0x24, 0xdc,
0xd1, 0x4c, 0x2b, 0x85, 0x84, 0xf3, 0x6b, 0x45, 0x4a, 0xe6, 0xba, 0x99, 0xbc, 0x87, 0xe4, 0x2d,
0x68, 0xbc, 0xa3, 0x6a, 0x24, 0xc1, 0x8a, 0xca, 0x99, 0x57, 0xcb, 0x9b, 0x27, 0xef, 0x50, 0xb4,
0x54, 0xf2, 0x2b, 0x8a, 0xdd, 0x82, 0x1e, 0xad, 0x9e, 0xe5, 0x1d, 0x53, 0xd8, 0x75, 0x1e, 0x40,
0x53, 0x65, 0xfd, 0x82, 0x18, 0xd9, 0xd0, 0x0c, 0x03, 0xcf, 0x4f, 0x94, 0x56, 0x16, 0xd7, 0xa4,
0xf3, 0x7b, 0x05, 0x56, 0x07, 0x7d, 0x39, 0xa9, 0x0f, 0x71, 0x86, 0xb3, 0x4f, 0xc1, 0xc2, 0xd2,
0xc3, 0xd2, 0xce, 0x7a, 0x2e, 0x9d, 0x39, 0x96, 0x9c, 0xa3, 0x15, 0x4e, 0x47, 0xd8, 0x01, 0xb4,
0x86, 0x81, 0x9f, 0x78, 0xfe, 0x54, 0xa8, 0x46, 0x77, 0x3d, 0x77, 0xfc, 0x91, 0x62, 0x1e, 0xad,
0xf0, 0xf4, 0x20, 0xbb, 0x0d, 0x75, 0x99, 0xba, 0xe8, 0x84, 0xce, 0xfe, 0x46, 0xee, 0xc2, 0x8b,
0xa9, 0x27, 0x9f, 0xc7, 0x03, 0x52, 0x93, 0xf3, 0xa9, 0x88, 0x28, 0x22, 0x45, 0x4d, 0x5e, 0x48,
0x8e, 0xd4, 0x04, 0x8f, 0xb0, 0x1e, 0x54, 0x93, 0x19, 0x96, 0x9b, 0xc5, 0xab, 0xc9, 0xac, 0xdf,
0x54, 0x1d, 0xc3, 0x39, 0x84, 0x8e, 0xa1, 0x7a, 0xd6, 0x49, 0x2a, 0x66, 0x27, 0xc9, 0x15, 0x7e,
0xb5, 0x50, 0xf8, 0xce, 0x1e, 0xf4, 0xf2, 0xe6, 0x2c, 0xea, 0x7f, 0xce, 0x2e, 0x40, 0x66, 0xc7,
0xc2, 0x53, 0x9f, 0x68, 0x95, 0xd0, 0x86, 0x85, 0xc7, 0x7e, 0xa9, 0xc2, 0x5a, 0x0a, 0xa3, 0x54,
0x70, 0xee, 0xe6, 0x83, 0x73, 0xdd, 0x1c, 0x2b, 0x25, 0xf1, 0xb9, 0x6d, 0xce, 0xa0, 0xcd, 0xe2,
0xe1, 0xbe, 0x90, 0x47, 0xe5, 0x09, 0xf9, 0xae, 0x7b, 0x12, 0x44, 0x3a, 0x28, 0x73, 0xef, 0x1e,
0x4a, 0xa6, 0x7c, 0x17, 0x4f, 0xb1, 0x03, 0x68, 0x86, 0xd3, 0x93, 0xb1, 0xa7, 0xba, 0x75, 0x67,
0xff, 0x46, 0xf1, 0xc2, 0x80, 0xd8, 0x47, 0x2b, 0x5c, 0x9f, 0x94, 0x32, 0x28, 0x9c, 0x56, 0xb9,
0x8c, 0xd2, 0x88, 0x36, 0x70, 0x6e, 0xe5, 0x22, 0xfa, 0x43, 0x0d, 0x7a, 0x79, 0x83, 0x33, 0x54,
0x57, 0x31, 0x51, 0x9d, 0x81, 0xdc, 0xaa, 0x79, 0xe4, 0x66, 0xe2, 0xbd, 0xda, 0x3c, 0xde, 0xd3,
0xa8, 0xae, 0xbe, 0x04, 0xd5, 0x59, 0x8b, 0x51, 0x5d, 0xa3, 0x14, 0xd5, 0x35, 0x4b, 0x51, 0x5d,
0x6b, 0x11, 0xaa, 0x6b, 0x5f, 0x82, 0xea, 0x60, 0x09, 0xaa, 0x93, 0xb3, 0xa5, 0x3e, 0x87, 0xea,
0x56, 0x17, 0xa1, 0xba, 0xee, 0x52, 0x54, 0xd7, 0x9b, 0x47, 0x75, 0xce, 0xf7, 0xb0, 0x6a, 0x66,
0xd1, 0x32, 0x3c, 0xa0, 0x30, 0x4d, 0x35, 0x87, 0x69, 0x6c, 0x68, 0x2a, 0x04, 0xa3, 0x10, 0xbe,
0x26, 0x65, 0xad, 0xe5, 0x93, 0x6e, 0x61, 0x79, 0xf4, 0x61, 0xbd, 0x98, 0x6d, 0xcb, 0xf4, 0x30,
0x46, 0x54, 0x8a, 0x0e, 0x9d, 0xaf, 0x0c, 0x69, 0x4b, 0x8b, 0x51, 0x65, 0x63, 0x55, 0x67, 0xa3,
0x73, 0x0e, 0x37, 0xf1, 0x02, 0x15, 0xf2, 0x33, 0x2f, 0x4e, 0xfa, 0x33, 0x1a, 0x98, 0x87, 0xfe,
0x68, 0x90, 0x62, 0x86, 0x0c, 0x10, 0x55, 0x8a, 0x80, 0x68, 0x71, 0xc3, 0xc9, 0xe0, 0x43, 0xcd,
0x80, 0x0f, 0xce, 0x4b, 0xdd, 0xa8, 0xb9, 0x18, 0x06, 0xd1, 0xe8, 0xca, 0x20, 0xac, 0xfc, 0xd5,
0x43, 0xd8, 0xa0, 0x57, 0x11, 0x85, 0x5c, 0xf2, 0x74, 0xfa, 0x44, 0xd5, 0x7c, 0xe2, 0x5b, 0xe8,
0x9a, 0x8a, 0xc5, 0xec, 0xae, 0x44, 0x4a, 0xb8, 0x54, 0x93, 0x72, 0x33, 0xd7, 0xba, 0xe9, 0x18,
0xd7, 0x67, 0x9c, 0x37, 0xb0, 0x66, 0xf8, 0xf2, 0xa9, 0x7f, 0x1a, 0x2c, 0x54, 0x40, 0x03, 0xed,
0xaa, 0x01, 0xb4, 0x33, 0x7b, 0x6b, 0xe5, 0xf6, 0xd6, 0x4d, 0x65, 0x0f, 0xa0, 0xc3, 0x45, 0x38,
0x56, 0xc2, 0xd8, 0x2e, 0xd4, 0xe5, 0xd3, 0xaa, 0x9f, 0xae, 0x6b, 0x3d, 0x35, 0xd2, 0xe5, 0xc8,
0x75, 0x3e, 0x83, 0xf5, 0x82, 0x86, 0x38, 0x52, 0x49, 0x29, 0x32, 0xb2, 0xcd, 0x35, 0xe9, 0x3c,
0x80, 0x35, 0x43, 0x84, 0xcc, 0x0d, 0x76, 0x0b, 0x2c, 0xc9, 0xd5, 0xfe, 0x98, 0x97, 0x43, 0x6c,
0xc7, 0x07, 0x86, 0x82, 0xd2, 0xac, 0xfc, 0x97, 0xbd, 0xf1, 0x10, 0x18, 0xaa, 0x9a, 0x97, 0x57,
0xee, 0x94, 0xf4, 0x8c, 0x72, 0xca, 0xe7, 0xb0, 0x39, 0xaf, 0xeb, 0x32, 0xbf, 0x7c, 0x03, 0x9b,
0xf3, 0xc2, 0xe2, 0x45, 0xbe, 0xc9, 0xc4, 0x29, 0xdf, 0xfc, 0x5c, 0x85, 0x2e, 0x17, 0x43, 0xe1,
0x85, 0x89, 0x0a, 0xde, 0x55, 0x2b, 0x40, 0xfb, 0xab, 0x66, 0xf8, 0xab, 0xd4, 0x2f, 0x79, 0xa8,
0x6e, 0x15, 0xa1, 0x7a, 0xae, 0x7a, 0x1b, 0x25, 0xd5, 0x4b, 0x10, 0xa3, 0x59, 0x80, 0x18, 0x19,
0x04, 0x6f, 0x15, 0x21, 0xb8, 0x9d, 0x7d, 0xa4, 0xb4, 0xc9, 0x69, 0xe6, 0x37, 0x49, 0x0a, 0xce,
0xa1, 0x08, 0xce, 0xc7, 0xb0, 0xae, 0x5c, 0xf2, 0xe1, 0x3f, 0x5c, 0xde, 0xdb, 0x2b, 0xce, 0x4f,
0x35, 0x85, 0x48, 0x8e, 0xe9, 0xdb, 0x8c, 0x8b, 0xf3, 0x2b, 0x8f, 0xde, 0xe5, 0x9f, 0x82, 0x57,
0x18, 0xbe, 0xdd, 0xff, 0xca, 0xf0, 0xed, 0x16, 0x86, 0xef, 0x31, 0x74, 0xf5, 0x4f, 0x03, 0x0a,
0xc1, 0x55, 0xa7, 0x2f, 0x53, 0xff, 0x44, 0x68, 0xf4, 0xe2, 0xda, 0xb9, 0xa3, 0x22, 0x8b, 0x33,
0x77, 0xe9, 0xb3, 0xce, 0x23, 0xd8, 0xa0, 0x7f, 0x1f, 0x34, 0x74, 0x2f, 0xd5, 0xa1, 0x74, 0xf2,
0x7e, 0x0d, 0x6b, 0x83, 0xbe, 0xc6, 0xd3, 0xcb, 0x9f, 0x50, 0x7e, 0xa5, 0x91, 0x23, 0x97, 0xce,
0x97, 0x12, 0x40, 0xbf, 0xc0, 0xcf, 0xdf, 0xab, 0x5d, 0xbc, 0x2f, 0xf1, 0x39, 0x36, 0xad, 0xab,
0xdd, 0x7b, 0x65, 0x20, 0xf1, 0x7f, 0x74, 0xfa, 0x3e, 0x86, 0x6b, 0x46, 0x37, 0xfc, 0xd0, 0x01,
0xfc, 0xd8, 0x80, 0x42, 0x7a, 0x06, 0x7f, 0x51, 0x9c, 0xc1, 0x5b, 0x73, 0x7d, 0x35, 0x3f, 0x86,
0xf7, 0xff, 0xac, 0x80, 0x85, 0x3f, 0x78, 0xd9, 0x7d, 0x80, 0xac, 0xcc, 0x59, 0xf9, 0x47, 0xc6,
0xb6, 0xfe, 0xfb, 0xf1, 0x9d, 0x1f, 0x7b, 0x67, 0xfe, 0xcb, 0x0b, 0x67, 0x85, 0xed, 0x1b, 0xbf,
0xb3, 0xca, 0xbe, 0x36, 0xca, 0xee, 0x68, 0x59, 0x04, 0xf6, 0xca, 0x3f, 0x3c, 0xca, 0xee, 0x3d,
0x54, 0x10, 0x54, 0x43, 0xbf, 0x45, 0x5f, 0x20, 0x25, 0x77, 0x4f, 0x1a, 0xf8, 0x9f, 0xfa, 0xe0,
0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x70, 0xe6, 0x48, 0x7b, 0xd0, 0x16, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -38,6 +38,7 @@ func (t *GuessType) GetTypeMap() map[string]int32 {
"Bet": GuessGameActionBet,
"Abort": GuessGameActionAbort,
"Publish": GuessGameActionPublish,
"Query": GuessGameActionQuery,
}
}
......
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