Commit c4b89c92 authored by liuyuhang's avatar liuyuhang Committed by 33cn

add prob project

parent 644a26e3
......@@ -26,7 +26,7 @@ func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalD
if err != nil {
return nil, err
}
kv := saveHeightIndex(&receipt)
kv := saveBoardHeightIndex(&receipt)
set = append(set, kv...)
}
default:
......@@ -37,7 +37,7 @@ func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalD
return dbSet, nil
}
func saveHeightIndex(res *auty.ReceiptProposalBoard) (kvs []*types.KeyValue) {
func saveBoardHeightIndex(res *auty.ReceiptProposalBoard) (kvs []*types.KeyValue) {
// 先将之前的状态删除掉,再做更新
if res.Current.Status > 1 {
kv := &types.KeyValue{}
......@@ -68,7 +68,7 @@ func (a *Autonomy) execDelLocalBoard(receiptData *types.ReceiptData) (*types.Loc
if err != nil {
return nil, err
}
kv := delHeightIndex(&receipt)
kv := delBoardHeightIndex(&receipt)
set = append(set, kv...)
}
default:
......@@ -79,7 +79,7 @@ func (a *Autonomy) execDelLocalBoard(receiptData *types.ReceiptData) (*types.Loc
return dbSet, nil
}
func delHeightIndex(res *auty.ReceiptProposalBoard) (kvs []*types.KeyValue) {
func delBoardHeightIndex(res *auty.ReceiptProposalBoard) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
kv.Key = calcBoardKey4StatusHeight(res.Current.Status, dapp.HeightIndexStr(res.Current.Height, int64(res.Current.Index)))
kv.Value = nil
......
......@@ -9,6 +9,7 @@ import (
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
)
// 提案董事会相关
// ExecLocal_PropBoard 创建提案
func (a *Autonomy) ExecLocal_PropBoard(payload *auty.ProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return a.execLocalBoard(receiptData)
......@@ -28,3 +29,24 @@ func (a *Autonomy) ExecLocal_VotePropBoard(payload *auty.VoteProposalBoard, tx *
func (a *Autonomy) ExecLocal_TmintPropBoard(payload *auty.TerminateProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return a.execLocalBoard(receiptData)
}
// 提案项目相关
// ExecLocal_PropProject 创建提案项目
func (a *Autonomy) ExecLocal_PropProject(payload *auty.ProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return a.execLocalProject(receiptData)
}
// ExecLocal_RvkPropProject 撤销提案项目
func (a *Autonomy) ExecLocal_RvkPropProject(payload *auty.RevokeProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error){
return a.execLocalProject(receiptData)
}
// ExecLocal_VotePropProject 投票提案项目
func (a *Autonomy) ExecLocal_VotePropProject(payload *auty.VoteProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return a.execLocalProject(receiptData)
}
// ExecLocal_TmintPropProject 终止提案项目
func (a *Autonomy) ExecLocal_TmintPropProject(payload *auty.TerminateProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return a.execLocalProject(receiptData)
}
\ 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 (
"github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
)
func (a *Autonomy) execLocalProject(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
var set []*types.KeyValue
for _, log := range receiptData.Logs {
switch log.Ty {
case auty.TyLogPropProject,
auty.TyLogRvkPropProject,
auty.TyLogVotePropProject,
auty.TyLogPubVotePropProject,
auty.TyLogTmintPropProject:
{
var receipt auty.ReceiptProposalProject
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
kv := saveProjectHeightIndex(&receipt)
set = append(set, kv...)
}
default:
break
}
}
dbSet.KV = append(dbSet.KV, set...)
return dbSet, nil
}
func saveProjectHeightIndex(res *auty.ReceiptProposalProject) (kvs []*types.KeyValue) {
// 先将之前的状态删除掉,再做更新
if res.Current.Status > 1 {
kv := &types.KeyValue{}
kv.Key = calcProjectKey4StatusHeight(res.Prev.Status, dapp.HeightIndexStr(res.Prev.Height, int64(res.Prev.Index)))
kv.Value = nil
kvs = append(kvs, kv)
}
kv := &types.KeyValue{}
kv.Key = calcProjectKey4StatusHeight(res.Current.Status, dapp.HeightIndexStr(res.Current.Height, int64(res.Current.Index)))
kv.Value = types.Encode(res.Current)
kvs = append(kvs, kv)
return kvs
}
func (a *Autonomy) execDelLocalProject(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
var set []*types.KeyValue
for _, log := range receiptData.Logs {
switch log.Ty {
case auty.TyLogPropProject,
auty.TyLogRvkPropProject,
auty.TyLogVotePropProject,
auty.TyLogPubVotePropProject,
auty.TyLogTmintPropProject:
{
var receipt auty.ReceiptProposalProject
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
kv := delProjectHeightIndex(&receipt)
set = append(set, kv...)
}
default:
break
}
}
dbSet.KV = append(dbSet.KV, set...)
return dbSet, nil
}
func delProjectHeightIndex(res *auty.ReceiptProposalProject) (kvs []*types.KeyValue) {
kv := &types.KeyValue{}
kv.Key = calcProjectKey4StatusHeight(res.Current.Status, dapp.HeightIndexStr(res.Current.Height, int64(res.Current.Index)))
kv.Value = nil
kvs = append(kvs, kv)
if res.Current.Status > 1 {
kv := &types.KeyValue{}
kv.Key = calcProjectKey4StatusHeight(res.Prev.Status, dapp.HeightIndexStr(res.Prev.Height, int64(res.Prev.Index)))
kv.Value = types.Encode(res.Prev)
kvs = append(kvs, kv)
}
return kvs
}
// getProposalBoard
func (a *Autonomy) getProposalProject(req *auty.ReqQueryProposalProject) (types.Message, error) {
if req == nil {
return nil, types.ErrInvalidParam
}
var key []byte
var values [][]byte
var err error
localDb := a.GetLocalDB()
if req.GetIndex() == -1 {
key = nil
} else { //翻页查找指定的txhash列表
heightstr := genHeightIndexStr(req.GetIndex())
key = calcProjectKey4StatusHeight(req.Status, heightstr)
}
prefix := calcProjectKey4StatusHeight(req.Status, "")
values, err = localDb.List(prefix, key, req.Count, req.GetDirection())
if err != nil {
return nil, err
}
if len(values) == 0 {
return nil, types.ErrNotFound
}
var rep auty.ReplyQueryProposalProject
for _, value := range values {
prop := &auty.AutonomyProposalProject{}
err = types.Decode(value, prop)
if err != nil {
return nil, err
}
rep.PropProjects = append(rep.PropProjects, prop)
}
return &rep, nil
}
\ No newline at end of file
......@@ -29,6 +29,25 @@ func (a *action) propProject(prob *auty.ProposalProject) (*types.Receipt, error)
return nil, types.ErrInvalidParam
}
// 获取董事会成员
value, err := a.db.Get(activeBoardID())
if err != nil {
err = auty.ErrNoActiveBoard
alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "get activeBoardID failed", err)
return nil, err
}
pboard := &auty.ProposalBoard{}
err = types.Decode(value, pboard)
if err != nil {
alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "decode ProposalBoard failed", err)
return nil, err
}
if len(pboard.Boards) > maxBoards || len(pboard.Boards) < minBoards {
err = auty.ErrNoActiveBoard
alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "illegality boards number", err)
return nil, err
}
receipt, err := a.coinsAccount.ExecFrozen(a.fromaddr, a.execaddr, lockAmount)
if err != nil {
alog.Error("propProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "ExecFrozen amount", lockAmount)
......@@ -47,6 +66,7 @@ func (a *action) propProject(prob *auty.ProposalProject) (*types.Receipt, error)
}
cur := &auty.AutonomyProposalProject{
PropProject:prob,
Boards: pboard.Boards,
BoardVoteRes: &auty.VoteResult{},
PubVote: &auty.PublicVote{Publicity:isPubVote},
Status: auty.AutonomyStatusProposalProject,
......@@ -54,11 +74,7 @@ func (a *action) propProject(prob *auty.ProposalProject) (*types.Receipt, error)
Height: a.height,
Index: a.index,
}
key := propProjectID(common.ToHex(a.txhash))
value := types.Encode(cur)
kv = append(kv, &types.KeyValue{Key: key, Value: value})
kv = append(kv, &types.KeyValue{Key: propProjectID(common.ToHex(a.txhash)), Value: types.Encode(cur)})
receiptLog := getProjectReceiptLog(nil, cur, auty.TyLogPropProject)
logs = append(logs, receiptLog)
......@@ -161,28 +177,8 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
}
// 董事会成员验证
value, err = a.db.Get(activeBoardID())
if err != nil {
err = auty.ErrNoActiveBoard
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "get activeBoardID failed",
voteProb.ProposalID, "err", err)
return nil, err
}
prob := &auty.ProposalBoard{}
err = types.Decode(value, prob)
if err != nil {
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "decode ProposalBoard failed",
voteProb.ProposalID, "err", err)
return nil, err
}
if len(prob.Boards) > maxBoards || len(prob.Boards) < minBoards {
err = auty.ErrNoActiveBoard
alog.Error("votePropProject ", "addr", a.fromaddr, "execaddr", a.execaddr, "illegality boards number",
voteProb.ProposalID, "err", err)
return nil, err
}
var isBoard bool
for _, addr := range prob.Boards {
for _, addr := range cur.Boards {
if addr == a.fromaddr {
isBoard = true
}
......@@ -216,7 +212,7 @@ func (a *action) votePropProject(voteProb *auty.VoteProposalProject) (*types.Rec
// 更新已经投票地址
votes.Address = append(votes.Address, a.fromaddr)
// 更新投票结果
cur.BoardVoteRes.TotalVotes = int32(len(prob.Boards))
cur.BoardVoteRes.TotalVotes = int32(len(cur.Boards))
if voteProb.Approve {
cur.BoardVoteRes.ApproveVotes += 1
} else {
......
......@@ -9,7 +9,12 @@ import (
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
)
// Query_GetUnfreezeWithdraw 查询合约可提币量
// Query_GetProposalBoard 查询提案董事会
func (a *Autonomy) Query_GetProposalBoard(in *auty.ReqQueryProposalBoard) (types.Message, error) {
return a.getProposalBoard(in)
}
// Query_GetProposalProject 查询提案项目
func (a *Autonomy) Query_GetProposalProject(in *auty.ReqQueryProposalProject) (types.Message, error) {
return a.getProposalProject(in)
}
\ No newline at end of file
......@@ -10,15 +10,17 @@ package types;
message AutonomyProposalProject {
ProposalProject propProject = 1;
// 投票该提案的董事会成员
repeated string boards = 2;
// 董事会投票结果
VoteResult boardVoteRes = 2;
VoteResult boardVoteRes = 3;
// 公示投票
PublicVote pubVote = 3;
PublicVote pubVote = 4;
// 状态
int32 status = 4;
string address = 5;
int64 height = 6;
int32 index = 7;
int32 status = 5;
string address = 6;
int64 height = 7;
int32 index = 8;
}
message ProposalProject {
......@@ -76,10 +78,14 @@ message LocalProposalProject {
}
// query
message ReplyQueryProposalProject {
string proposalID = 1;
message ReqQueryProposalProject {
//优先根据status查询
int32 status = 1;
int32 count = 2;
int32 direction = 3;
int64 index = 4;
}
message ReplyProposalProject {
repeated LocalProposalProject propProjects = 1;
message ReplyQueryProposalProject {
repeated AutonomyProposalProject propProjects = 1;
}
\ No newline at end of file
......@@ -71,3 +71,5 @@ func (c *channelClient) terminateProposalBoard(ctx context.Context, head *auty.T
}
return &types.UnsignTx{Data: data}, nil
}
// Proposal Project 相关的接口
......@@ -33,8 +33,8 @@ It has these top-level messages:
TerminateProposalProject
ReceiptProposalProject
LocalProposalProject
ReqQueryProposalProject
ReplyQueryProposalProject
ReplyProposalProject
AutonomyProposalRule
ProposalRule
RevokeProposalRule
......
......@@ -14,15 +14,17 @@ var _ = math.Inf
type AutonomyProposalProject struct {
PropProject *ProposalProject `protobuf:"bytes,1,opt,name=propProject" json:"propProject,omitempty"`
// 投票该提案的董事会成员
Boards []string `protobuf:"bytes,2,rep,name=boards" json:"boards,omitempty"`
// 董事会投票结果
BoardVoteRes *VoteResult `protobuf:"bytes,2,opt,name=boardVoteRes" json:"boardVoteRes,omitempty"`
BoardVoteRes *VoteResult `protobuf:"bytes,3,opt,name=boardVoteRes" json:"boardVoteRes,omitempty"`
// 公示投票
PubVote *PublicVote `protobuf:"bytes,3,opt,name=pubVote" json:"pubVote,omitempty"`
PubVote *PublicVote `protobuf:"bytes,4,opt,name=pubVote" json:"pubVote,omitempty"`
// 状态
Status int32 `protobuf:"varint,4,opt,name=status" json:"status,omitempty"`
Address string `protobuf:"bytes,5,opt,name=address" json:"address,omitempty"`
Height int64 `protobuf:"varint,6,opt,name=height" json:"height,omitempty"`
Index int32 `protobuf:"varint,7,opt,name=index" json:"index,omitempty"`
Status int32 `protobuf:"varint,5,opt,name=status" json:"status,omitempty"`
Address string `protobuf:"bytes,6,opt,name=address" json:"address,omitempty"`
Height int64 `protobuf:"varint,7,opt,name=height" json:"height,omitempty"`
Index int32 `protobuf:"varint,8,opt,name=index" json:"index,omitempty"`
}
func (m *AutonomyProposalProject) Reset() { *m = AutonomyProposalProject{} }
......@@ -37,6 +39,13 @@ func (m *AutonomyProposalProject) GetPropProject() *ProposalProject {
return nil
}
func (m *AutonomyProposalProject) GetBoards() []string {
if m != nil {
return m.Boards
}
return nil
}
func (m *AutonomyProposalProject) GetBoardVoteRes() *VoteResult {
if m != nil {
return m.BoardVoteRes
......@@ -341,32 +350,57 @@ func (m *LocalProposalProject) GetComments() []string {
}
// query
type ReplyQueryProposalProject struct {
ProposalID string `protobuf:"bytes,1,opt,name=proposalID" json:"proposalID,omitempty"`
type ReqQueryProposalProject struct {
// 优先根据status查询
Status int32 `protobuf:"varint,1,opt,name=status" json:"status,omitempty"`
Count int32 `protobuf:"varint,2,opt,name=count" json:"count,omitempty"`
Direction int32 `protobuf:"varint,3,opt,name=direction" json:"direction,omitempty"`
Index int64 `protobuf:"varint,4,opt,name=index" json:"index,omitempty"`
}
func (m *ReplyQueryProposalProject) Reset() { *m = ReplyQueryProposalProject{} }
func (m *ReplyQueryProposalProject) String() string { return proto.CompactTextString(m) }
func (*ReplyQueryProposalProject) ProtoMessage() {}
func (*ReplyQueryProposalProject) Descriptor() ([]byte, []int) { return fileDescriptor3, []int{8} }
func (m *ReqQueryProposalProject) Reset() { *m = ReqQueryProposalProject{} }
func (m *ReqQueryProposalProject) String() string { return proto.CompactTextString(m) }
func (*ReqQueryProposalProject) ProtoMessage() {}
func (*ReqQueryProposalProject) Descriptor() ([]byte, []int) { return fileDescriptor3, []int{8} }
func (m *ReplyQueryProposalProject) GetProposalID() string {
func (m *ReqQueryProposalProject) GetStatus() int32 {
if m != nil {
return m.ProposalID
return m.Status
}
return ""
return 0
}
func (m *ReqQueryProposalProject) GetCount() int32 {
if m != nil {
return m.Count
}
return 0
}
type ReplyProposalProject struct {
PropProjects []*LocalProposalProject `protobuf:"bytes,1,rep,name=propProjects" json:"propProjects,omitempty"`
func (m *ReqQueryProposalProject) GetDirection() int32 {
if m != nil {
return m.Direction
}
return 0
}
func (m *ReplyProposalProject) Reset() { *m = ReplyProposalProject{} }
func (m *ReplyProposalProject) String() string { return proto.CompactTextString(m) }
func (*ReplyProposalProject) ProtoMessage() {}
func (*ReplyProposalProject) Descriptor() ([]byte, []int) { return fileDescriptor3, []int{9} }
func (m *ReqQueryProposalProject) GetIndex() int64 {
if m != nil {
return m.Index
}
return 0
}
type ReplyQueryProposalProject struct {
PropProjects []*AutonomyProposalProject `protobuf:"bytes,1,rep,name=propProjects" json:"propProjects,omitempty"`
}
func (m *ReplyQueryProposalProject) Reset() { *m = ReplyQueryProposalProject{} }
func (m *ReplyQueryProposalProject) String() string { return proto.CompactTextString(m) }
func (*ReplyQueryProposalProject) ProtoMessage() {}
func (*ReplyQueryProposalProject) Descriptor() ([]byte, []int) { return fileDescriptor3, []int{9} }
func (m *ReplyProposalProject) GetPropProjects() []*LocalProposalProject {
func (m *ReplyQueryProposalProject) GetPropProjects() []*AutonomyProposalProject {
if m != nil {
return m.PropProjects
}
......@@ -382,52 +416,54 @@ func init() {
proto.RegisterType((*TerminateProposalProject)(nil), "types.TerminateProposalProject")
proto.RegisterType((*ReceiptProposalProject)(nil), "types.ReceiptProposalProject")
proto.RegisterType((*LocalProposalProject)(nil), "types.LocalProposalProject")
proto.RegisterType((*ReqQueryProposalProject)(nil), "types.ReqQueryProposalProject")
proto.RegisterType((*ReplyQueryProposalProject)(nil), "types.ReplyQueryProposalProject")
proto.RegisterType((*ReplyProposalProject)(nil), "types.ReplyProposalProject")
}
func init() { proto.RegisterFile("project.proto", fileDescriptor3) }
var fileDescriptor3 = []byte{
// 628 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdf, 0x6f, 0xd3, 0x30,
0x10, 0x56, 0xd7, 0xa5, 0x5d, 0xaf, 0xdd, 0x0f, 0xbc, 0x51, 0xcc, 0x40, 0x53, 0x95, 0x07, 0x54,
0x81, 0x54, 0xa1, 0x21, 0xc4, 0x04, 0x0f, 0x68, 0x68, 0x48, 0x20, 0xa1, 0x51, 0x0c, 0x82, 0x67,
0x37, 0x39, 0xb6, 0x6c, 0x49, 0x6c, 0x39, 0xce, 0x44, 0xff, 0x01, 0xfe, 0x05, 0xfe, 0x54, 0x5e,
0x51, 0xce, 0x0e, 0x6b, 0xc3, 0x10, 0xf4, 0xcd, 0xdf, 0x77, 0xdf, 0x77, 0x3a, 0x9f, 0xcf, 0x07,
0x9b, 0xda, 0xa8, 0x0b, 0x8c, 0xec, 0x44, 0x1b, 0x65, 0x15, 0x0b, 0xec, 0x5c, 0x63, 0xb1, 0xbf,
0x99, 0x46, 0x2a, 0xcb, 0x54, 0xee, 0xd8, 0xf0, 0xc7, 0x1a, 0xdc, 0x39, 0x2e, 0xad, 0xca, 0x55,
0x36, 0x9f, 0x1a, 0xa5, 0x55, 0x21, 0xd3, 0xa9, 0xf3, 0xb1, 0x23, 0xe8, 0x6b, 0xa3, 0xb4, 0x87,
0xbc, 0x35, 0x6a, 0x8d, 0xfb, 0x87, 0xc3, 0x09, 0xe5, 0x99, 0x34, 0xc4, 0x62, 0x51, 0xca, 0x9e,
0xc2, 0x60, 0xa6, 0xa4, 0x89, 0x3f, 0x2b, 0x8b, 0x02, 0x0b, 0xbe, 0x46, 0xd6, 0x5b, 0xde, 0xea,
0xd9, 0x32, 0xb5, 0x62, 0x49, 0xc6, 0x1e, 0x41, 0x57, 0x97, 0xb3, 0x0a, 0xf1, 0xf6, 0x92, 0x63,
0x5a, 0xce, 0xd2, 0x24, 0x22, 0x59, 0xad, 0x60, 0x43, 0xe8, 0x14, 0x56, 0xda, 0xb2, 0xe0, 0xeb,
0xa3, 0xd6, 0x38, 0x10, 0x1e, 0x31, 0x0e, 0x5d, 0x19, 0xc7, 0x06, 0x8b, 0x82, 0x07, 0xa3, 0xd6,
0xb8, 0x27, 0x6a, 0x58, 0x39, 0xce, 0x31, 0x39, 0x3b, 0xb7, 0xbc, 0x33, 0x6a, 0x8d, 0xdb, 0xc2,
0x23, 0xb6, 0x07, 0x41, 0x92, 0xc7, 0xf8, 0x8d, 0x77, 0x29, 0x91, 0x03, 0xe1, 0xcf, 0x36, 0x6c,
0x37, 0x3b, 0xc2, 0x60, 0x7d, 0x8e, 0xd2, 0x50, 0x2b, 0x02, 0x41, 0xe7, 0xca, 0x9d, 0xa9, 0xdc,
0x9e, 0xd3, 0x25, 0x03, 0xe1, 0x00, 0xdb, 0x81, 0x76, 0x2c, 0xe7, 0x74, 0x8d, 0x40, 0x54, 0x47,
0x76, 0x00, 0xf0, 0x35, 0x31, 0x85, 0xfd, 0x68, 0xe5, 0x19, 0x52, 0xcd, 0x3d, 0xb1, 0xc0, 0xb0,
0xfb, 0xd0, 0x4b, 0x65, 0x1d, 0x76, 0x95, 0x5f, 0x13, 0x95, 0x5b, 0x1b, 0x15, 0x97, 0x91, 0x4d,
0x54, 0x4e, 0xf5, 0xf7, 0xc4, 0x02, 0xc3, 0x46, 0xd0, 0x8f, 0xb1, 0x88, 0x4c, 0xa2, 0x49, 0xd0,
0x25, 0xc1, 0x22, 0x55, 0x65, 0x88, 0x54, 0x6e, 0x8d, 0x8c, 0xac, 0x32, 0x7c, 0xc3, 0x65, 0xb8,
0x66, 0xaa, 0xee, 0xc8, 0x4c, 0x95, 0xb9, 0xe5, 0x3d, 0xd7, 0x1d, 0x87, 0x58, 0x08, 0x03, 0x77,
0x3a, 0x41, 0x2b, 0x93, 0x94, 0x03, 0x39, 0x97, 0xb8, 0xca, 0x6b, 0xd5, 0x71, 0x1c, 0x1b, 0xde,
0xa7, 0xa8, 0x47, 0xec, 0x21, 0xec, 0x14, 0x56, 0x1a, 0xfb, 0x2a, 0x55, 0xd1, 0xe5, 0x1b, 0xd7,
0xfb, 0x01, 0x65, 0xff, 0x83, 0x67, 0x0f, 0x60, 0x0b, 0xf3, 0x78, 0x51, 0xb9, 0x49, 0xca, 0x06,
0xcb, 0x26, 0xc0, 0x0c, 0xca, 0xf4, 0xf5, 0xb2, 0x76, 0x8b, 0xb4, 0x37, 0x44, 0xd8, 0x63, 0xd8,
0xf5, 0x1f, 0xe1, 0x14, 0xd1, 0x45, 0x4e, 0xcb, 0x8c, 0x6f, 0xd3, 0xcb, 0xdc, 0x14, 0x0a, 0x9f,
0xc1, 0x6d, 0x81, 0x57, 0xea, 0x12, 0x9b, 0xcf, 0xef, 0x1e, 0x81, 0xa8, 0xb7, 0x27, 0x34, 0x04,
0xee, 0x11, 0x3c, 0x13, 0xbe, 0x87, 0xdd, 0x6a, 0x34, 0x57, 0xb4, 0xd1, 0xc4, 0x6a, 0x6d, 0xd4,
0x15, 0xd2, 0x0c, 0x6d, 0x88, 0x1a, 0x86, 0x53, 0x18, 0x4e, 0xdd, 0xb8, 0xaf, 0x9a, 0x73, 0x08,
0x1d, 0xa5, 0xb5, 0x2a, 0xea, 0x94, 0x1e, 0x85, 0xcf, 0x81, 0x7f, 0x42, 0x93, 0x25, 0xb9, 0x5c,
0x39, 0x67, 0xf8, 0xbd, 0x05, 0x43, 0x81, 0x11, 0x26, 0xda, 0x36, 0xad, 0x87, 0xb0, 0xae, 0x0d,
0x5e, 0xf9, 0x1d, 0x71, 0xe0, 0xbf, 0xed, 0x5f, 0x16, 0x8b, 0x20, 0x2d, 0x3b, 0x82, 0x6e, 0x54,
0x1a, 0x83, 0xb9, 0xf5, 0xfb, 0xe1, 0x5f, 0xb6, 0x5a, 0x1e, 0xa6, 0xb0, 0xf7, 0x4e, 0x45, 0x14,
0x68, 0x2c, 0xac, 0xae, 0xdb, 0x42, 0x17, 0xff, 0x59, 0x48, 0x2d, 0x67, 0xfb, 0xb0, 0x51, 0xad,
0x45, 0xcc, 0x6d, 0xb5, 0xac, 0xda, 0xe3, 0x9e, 0xf8, 0x8d, 0xc3, 0x17, 0x70, 0x57, 0xa0, 0x4e,
0xe7, 0x1f, 0x4a, 0x34, 0xf3, 0x55, 0x7b, 0xf6, 0x05, 0xf6, 0xc8, 0xdc, 0xf4, 0xbd, 0x84, 0xc1,
0xc2, 0xc2, 0x2c, 0x78, 0x6b, 0xd4, 0x1e, 0xf7, 0x0f, 0xef, 0xf9, 0x7a, 0x6f, 0xba, 0x9d, 0x58,
0x32, 0xcc, 0x3a, 0xb4, 0xbf, 0x9f, 0xfc, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x4e, 0x93, 0x26,
0xe6, 0x05, 0x00, 0x00,
// 663 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0x5f, 0x6f, 0xd3, 0x3e,
0x14, 0x55, 0xd7, 0xa6, 0x5d, 0x6f, 0xbb, 0x3f, 0x3f, 0x6f, 0xbf, 0xce, 0x4c, 0x68, 0xaa, 0xf2,
0x80, 0x2a, 0x90, 0x2a, 0x34, 0x84, 0x98, 0x78, 0xdb, 0x34, 0x24, 0x90, 0xd0, 0x28, 0x06, 0xf1,
0x8a, 0xdc, 0xe4, 0xb2, 0x65, 0x4b, 0x63, 0xe3, 0x38, 0x13, 0x15, 0xef, 0x7c, 0x1d, 0x3e, 0x1e,
0xaf, 0x28, 0xd7, 0x0e, 0x4d, 0xbb, 0x21, 0xb6, 0x37, 0x9f, 0x73, 0xcf, 0xb9, 0x8d, 0xed, 0xeb,
0x53, 0xd8, 0xd0, 0x46, 0x5d, 0x62, 0x64, 0xc7, 0xda, 0x28, 0xab, 0x58, 0x60, 0xe7, 0x1a, 0xf3,
0xfd, 0x8d, 0x34, 0x52, 0xb3, 0x99, 0xca, 0x1c, 0x1b, 0xfe, 0x5c, 0x83, 0xbd, 0xe3, 0xc2, 0xaa,
0x4c, 0xcd, 0xe6, 0x13, 0xa3, 0xb4, 0xca, 0x65, 0x3a, 0x71, 0x3e, 0x76, 0x04, 0x3d, 0x6d, 0x94,
0xf6, 0x90, 0x37, 0x86, 0x8d, 0x51, 0xef, 0x70, 0x30, 0xa6, 0x3e, 0xe3, 0x15, 0xb1, 0xa8, 0x4b,
0xd9, 0x00, 0xda, 0x53, 0x25, 0x4d, 0x9c, 0xf3, 0xb5, 0x61, 0x73, 0xd4, 0x15, 0x1e, 0xb1, 0xe7,
0xd0, 0xa7, 0xd5, 0x27, 0x65, 0x51, 0x60, 0xce, 0x9b, 0xd4, 0xf2, 0x3f, 0xdf, 0xd2, 0xb3, 0x45,
0x6a, 0xc5, 0x92, 0x8c, 0x3d, 0x81, 0x8e, 0x2e, 0xa6, 0x25, 0xe2, 0xad, 0x25, 0xc7, 0xa4, 0x98,
0xa6, 0x49, 0x44, 0xb2, 0x4a, 0x51, 0xfe, 0x76, 0x6e, 0xa5, 0x2d, 0x72, 0x1e, 0x0c, 0x1b, 0xa3,
0x40, 0x78, 0xc4, 0x38, 0x74, 0x64, 0x1c, 0x1b, 0xcc, 0x73, 0xde, 0x1e, 0x36, 0x46, 0x5d, 0x51,
0xc1, 0xd2, 0x71, 0x81, 0xc9, 0xf9, 0x85, 0xe5, 0x9d, 0x61, 0x63, 0xd4, 0x14, 0x1e, 0xb1, 0x5d,
0x08, 0x92, 0x2c, 0xc6, 0x6f, 0x7c, 0x9d, 0x1a, 0x39, 0x10, 0xfe, 0x6a, 0xc2, 0xd6, 0xea, 0x49,
0x31, 0x68, 0xcd, 0x51, 0x1a, 0x3a, 0xa2, 0x40, 0xd0, 0xba, 0x74, 0xcf, 0x54, 0x66, 0x2f, 0xf8,
0x9a, 0x73, 0x13, 0x60, 0xdb, 0xd0, 0x8c, 0xe5, 0x9c, 0x36, 0x1e, 0x88, 0x72, 0xc9, 0x0e, 0x00,
0xbe, 0x24, 0x26, 0xb7, 0x1f, 0xac, 0x3c, 0x77, 0xfb, 0xeb, 0x8a, 0x1a, 0xc3, 0x1e, 0x42, 0x37,
0x95, 0x55, 0x39, 0xa0, 0xf2, 0x82, 0x28, 0xdd, 0xda, 0xa8, 0xb8, 0x88, 0x6c, 0xa2, 0x32, 0xbf,
0xb1, 0x1a, 0xc3, 0x86, 0xd0, 0x8b, 0x31, 0x8f, 0x4c, 0xa2, 0x49, 0xd0, 0x21, 0x41, 0x9d, 0x2a,
0x3b, 0x44, 0x2a, 0xb3, 0x46, 0x46, 0x56, 0x19, 0xda, 0x6a, 0x57, 0xd4, 0x98, 0xf2, 0x74, 0xe4,
0x4c, 0x15, 0x99, 0xe5, 0x5d, 0x77, 0x3a, 0x0e, 0xb1, 0x10, 0xfa, 0x6e, 0x75, 0x8a, 0x56, 0x26,
0x29, 0x07, 0x72, 0x2e, 0x71, 0xa5, 0xd7, 0xaa, 0xe3, 0x38, 0x36, 0xbc, 0x47, 0x55, 0x8f, 0xd8,
0x63, 0xd8, 0xce, 0xad, 0x34, 0xf6, 0x24, 0x55, 0xd1, 0xd5, 0x6b, 0x77, 0xf6, 0x7d, 0xea, 0x7e,
0x83, 0x67, 0x8f, 0x60, 0x13, 0xb3, 0xb8, 0xae, 0xdc, 0x20, 0xe5, 0x0a, 0xcb, 0xc6, 0xc0, 0x0c,
0xca, 0xf4, 0xd5, 0xb2, 0x76, 0x93, 0xb4, 0xb7, 0x54, 0xd8, 0x53, 0xd8, 0xf1, 0x0f, 0xe4, 0x0c,
0xd1, 0x55, 0xce, 0x8a, 0x19, 0xdf, 0xa2, 0x9b, 0xb9, 0xad, 0x14, 0xbe, 0x80, 0xff, 0x05, 0x5e,
0xab, 0x2b, 0x5c, 0xbd, 0x7e, 0x77, 0x09, 0x44, 0xbd, 0x39, 0xa5, 0x21, 0x70, 0x97, 0xe0, 0x99,
0xf0, 0x1d, 0xec, 0x94, 0xa3, 0x79, 0x4f, 0x1b, 0x4d, 0xac, 0xd6, 0x46, 0x5d, 0x23, 0xcd, 0xd0,
0xba, 0xa8, 0x60, 0x38, 0x81, 0xc1, 0xc4, 0x8d, 0xfb, 0x7d, 0x7b, 0x0e, 0xa0, 0xad, 0xb4, 0x56,
0x79, 0xd5, 0xd2, 0xa3, 0xf0, 0x25, 0xf0, 0x8f, 0x68, 0x66, 0x49, 0x26, 0xef, 0xdd, 0x33, 0xfc,
0xd1, 0x80, 0x81, 0xc0, 0x08, 0x13, 0x6d, 0x57, 0xad, 0x87, 0xd0, 0xd2, 0x06, 0xaf, 0x7d, 0x76,
0x1c, 0xf8, 0x67, 0xfb, 0x97, 0xc0, 0x11, 0xa4, 0x65, 0x47, 0xd0, 0x89, 0x0a, 0x63, 0x30, 0xb3,
0xf4, 0x8d, 0xff, 0xb6, 0x55, 0xf2, 0x30, 0x85, 0xdd, 0xb7, 0x2a, 0xa2, 0xc2, 0x4a, 0x90, 0x75,
0x5c, 0x3a, 0x5d, 0xde, 0xf1, 0x43, 0x2a, 0x39, 0xdb, 0x87, 0xf5, 0x32, 0x2e, 0x31, 0xb3, 0x55,
0x94, 0xfd, 0xc1, 0xe1, 0x77, 0xd8, 0x13, 0xf8, 0xf5, 0x7d, 0x81, 0xe6, 0x46, 0x72, 0x2e, 0x32,
0xa8, 0xb1, 0x94, 0x41, 0xbb, 0x10, 0x44, 0xf4, 0x94, 0x7c, 0x26, 0x10, 0x28, 0x5f, 0x78, 0x9c,
0x18, 0x74, 0x4f, 0xd8, 0x25, 0xc3, 0x82, 0x58, 0xa4, 0x50, 0x8b, 0x46, 0xd9, 0xa7, 0xd0, 0x67,
0x78, 0x20, 0x50, 0xa7, 0xf3, 0x5b, 0x7f, 0xfe, 0x04, 0xfa, 0xb5, 0x34, 0x2e, 0x3f, 0xa2, 0x79,
0x87, 0x4d, 0x2f, 0x79, 0xa6, 0x6d, 0xfa, 0x7f, 0x78, 0xf6, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x5e,
0x6c, 0xb6, 0x4b, 0x46, 0x06, 0x00, 0x00,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment