maintner: add support for team assignment

GitHub reviews can be assigned to teams.

Change-Id: I675944c40619635e554d083cfa4fd6e332315f9b
Reviewed-on: https://go-review.googlesource.com/101955
Reviewed-by: Chris Broadfoot <cbro@golang.org>
This commit is contained in:
Chris Broadfoot 2018-02-23 11:25:35 -08:00
Родитель c364cc65cb
Коммит b360853c44
3 изменённых файлов: 209 добавлений и 112 удалений

Просмотреть файл

@ -35,7 +35,7 @@ import (
// package for responses fulfilled from cache due to a 304 from the server.
const xFromCache = "X-From-Cache"
// GitHubRepoID is a github org & repo, lowercase.
// GitHubRepoID is a GitHub org & repo, lowercase.
type GitHubRepoID struct {
Owner, Repo string
}
@ -44,7 +44,7 @@ func (id GitHubRepoID) String() string { return id.Owner + "/" + id.Repo }
func (id GitHubRepoID) valid() bool {
if id.Owner == "" || id.Repo == "" {
// TODO: more validation. whatever github requires.
// TODO: more validation. whatever GitHub requires.
return false
}
return true
@ -54,10 +54,11 @@ func (id GitHubRepoID) valid() bool {
type GitHub struct {
c *Corpus
users map[int64]*GitHubUser
teams map[int64]*GitHubTeam
repos map[GitHubRepoID]*GitHubRepo
}
// ForeachRepo calls fn serially for each GithubRepo, stopping if fn
// ForeachRepo calls fn serially for each GitHubRepo, stopping if fn
// returns an error. The function is called with lexically increasing
// repo IDs.
func (g *GitHub) ForeachRepo(fn func(*GitHubRepo) error) error {
@ -195,13 +196,23 @@ func (g *GitHubRepo) getOrCreateLabel(id int64) *GitHubLabel {
return lb
}
// GitHubUser represents a github user.
// GitHubUser represents a GitHub user.
// It is a subset of https://developer.github.com/v3/users/#get-a-single-user
type GitHubUser struct {
ID int64
Login string
}
// GitHubTeam represents a GitHub team.
// It is a subset of https://developer.github.com/v3/orgs/teams/#get-team
type GitHubTeam struct {
ID int64
// Slug is a URL-friendly representation of the team name.
// It is unique across a GitHub organization.
Slug string
}
// GitHubIssueRef is a reference to an issue (or pull request) number
// in a repo. These are parsed from text making references such as
// "golang/go#1234" or just "#1234" (with an implicit Repo).
@ -212,7 +223,7 @@ type GitHubIssueRef struct {
func (r GitHubIssueRef) String() string { return fmt.Sprintf("%s#%d", r.Repo.ID(), r.Number) }
// GitHubIssue represents a github issue.
// GitHubIssue represents a GitHub issue.
// This is maintner's in-memory representation. It differs slightly
// from the API's *github.Issue type, notably in the lack of pointers
// for all fields.
@ -496,7 +507,7 @@ type GitHubIssueEvent struct {
// * review_requested, review_request_removed, review_dismissed
Type string
// OtherJSON optionally contains a JSON object of Github's API
// OtherJSON optionally contains a JSON object of GitHub's API
// response for any fields maintner was unable to extract at
// the time. It is empty if maintner supported all the fields
// when the mutation was created.
@ -513,6 +524,7 @@ type GitHubIssueEvent struct {
CommitID, CommitURL string // for type: "closed", "referenced" ... ?
Reviewer *GitHubUser
TeamReviewer *GitHubTeam
ReviewRequester *GitHubUser
DismissedReview *GitHubDismissedReviewEvent
}
@ -558,6 +570,12 @@ func (e *GitHubIssueEvent) Proto() *maintpb.GithubIssueEvent {
if e.Reviewer != nil {
p.ReviewerId = e.Reviewer.ID
}
if e.TeamReviewer != nil {
p.TeamReviewer = &maintpb.GithubTeam{
Id: e.TeamReviewer.ID,
Slug: e.TeamReviewer.Slug,
}
}
if e.ReviewRequester != nil {
p.ReviewRequesterId = e.ReviewRequester.ID
}
@ -583,6 +601,7 @@ func (r *GitHubRepo) newGithubEvent(p *maintpb.GithubIssueEvent) *GitHubIssueEve
Assignee: g.getOrCreateUserID(p.AssigneeId),
Assigner: g.getOrCreateUserID(p.AssignerId),
Reviewer: g.getOrCreateUserID(p.ReviewerId),
TeamReviewer: g.getTeam(p.TeamReviewer),
ReviewRequester: g.getOrCreateUserID(p.ReviewRequesterId),
From: p.RenameFrom,
To: p.RenameTo,
@ -718,6 +737,28 @@ func (g *GitHub) getOrCreateUserID(id int64) *GitHubUser {
return u
}
// g.c.mu must be held
func (g *GitHub) getTeam(pt *maintpb.GithubTeam) *GitHubTeam {
if pt == nil {
return nil
}
if g.teams == nil {
g.teams = make(map[int64]*GitHubTeam)
}
t := g.teams[pt.Id]
if t == nil {
t = &GitHubTeam{
ID: pt.Id,
}
g.teams[pt.Id] = t
}
if pt.Slug != "" {
t.Slug = pt.Slug
}
return t
}
// newGithubUserProto creates a GithubUser with the minimum diff between
// existing and g. The return value is nil if there were no changes. existing
// may also be nil.
@ -835,8 +876,8 @@ func (g *GitHub) setAssigneesFromProto(existing []*GitHubUser, new []*maintpb.Gi
}
// githubIssueDiffer generates a minimal diff (protobuf mutation) to
// get a Github Issue from its in-memory state 'a' to the current
// github API state 'b'.
// get a GitHub Issue from its in-memory state 'a' to the current
// GitHub API state 'b'.
type githubIssueDiffer struct {
gr *GitHubRepo
a *GitHubIssue // may be nil if no current state
@ -1049,7 +1090,7 @@ func (d githubIssueDiffer) diffLockedState(m *maintpb.GithubIssueMutation) bool
// newMutationFromIssue generates a GithubIssueMutation using the
// smallest possible diff between a (the state we have in memory in
// the corpus) and b (the current github API state).
// the corpus) and b (the current GitHub API state).
//
// If newMutationFromIssue returns nil, the provided github.Issue is no newer
// than the data we have in the corpus. 'a'. may be nil.
@ -1312,7 +1353,7 @@ func (c *githubCache) Set(urlKey string, res []byte) {
}
}
// sync checks for new changes on a single Github repository and
// sync checks for new changes on a single GitHub repository and
// updates the Corpus with any changes. If loop is true, it runs
// forever.
func (gr *GitHubRepo) sync(ctx context.Context, token string, loop bool) error {
@ -1352,7 +1393,7 @@ func (gr *GitHubRepo) sync(ctx context.Context, token string, loop bool) error {
expectChanges = false
}
// If we got woken up by a webhook, sometimes
// immediately polling Github for the data results in
// immediately polling GitHub for the data results in
// a cache hit saying nothing's changed. Don't believe
// it. Polling quickly with exponential backoff until
// we see what we're expecting.
@ -1385,7 +1426,7 @@ func (gr *GitHubRepo) sync(ctx context.Context, token string, loop bool) error {
}
// A githubRepoPoller updates the Corpus (gr.c) to have the latest
// version of the Github repo rp, using the Github client ghc.
// version of the GitHub repo rp, using the GitHub client ghc.
type githubRepoPoller struct {
c *Corpus // shortcut for gr.github.c
gr *GitHubRepo
@ -1938,13 +1979,13 @@ func (p *githubRepoPoller) syncEventsOnIssue(ctx context.Context, issueNum int32
return nil
}
// parseGithubEvents parses the JSON array of github events in r. It
// parseGithubEvents parses the JSON array of GitHub events in r. It
// does this the very manual way (using map[string]interface{})
// instead of using nice types because https://golang.org/issue/15314
// isn't implemented yet and also because even if it were implemented,
// this code still wants to preserve any unknown fields to store in
// the "OtherJSON" field for future updates of the code to parse. (If
// Github adds new Event types in the future, we want to archive them,
// GitHub adds new Event types in the future, we want to archive them,
// even if we don't understand them)
func parseGithubEvents(r io.Reader) ([]*GitHubIssueEvent, error) {
var jevents []map[string]interface{}
@ -2031,6 +2072,18 @@ func parseGithubEvents(r io.Reader) ([]*GitHubIssueEvent, error) {
dro.DismissalMessage, _ = drm["dismissal_message"].(string)
e.DismissedReview = dro
}
if rt, ok := em["requested_team"]; ok {
delete(em, "requested_team")
rtm, ok := rt.(map[string]interface{})
if !ok {
log.Printf("got value %+v for 'requested_team' field, wanted a map with 'id' and 'slug' fields", rt)
} else {
t := &GitHubTeam{}
t.ID = jint64(rtm["id"])
t.Slug, _ = rtm["slug"].(string)
e.TeamReviewer = t
}
}
otherJSON, _ := json.Marshal(em)
e.OtherJSON = string(otherJSON)

Просмотреть файл

@ -20,6 +20,7 @@ It has these top-level messages:
GithubIssueSyncStatus
GithubIssueCommentMutation
GithubUser
GithubTeam
GitMutation
GitRepo
GitCommit
@ -467,10 +468,11 @@ type GithubIssueEvent struct {
// For "referenced", "closed":
Commit *GithubCommit `protobuf:"bytes,9,opt,name=commit" json:"commit,omitempty"`
// For "renamed" events:
RenameFrom string `protobuf:"bytes,11,opt,name=rename_from,json=renameFrom" json:"rename_from,omitempty"`
RenameTo string `protobuf:"bytes,12,opt,name=rename_to,json=renameTo" json:"rename_to,omitempty"`
ReviewerId int64 `protobuf:"varint,13,opt,name=reviewer_id,json=reviewerId" json:"reviewer_id,omitempty"`
ReviewRequesterId int64 `protobuf:"varint,14,opt,name=review_requester_id,json=reviewRequesterId" json:"review_requester_id,omitempty"`
RenameFrom string `protobuf:"bytes,11,opt,name=rename_from,json=renameFrom" json:"rename_from,omitempty"`
RenameTo string `protobuf:"bytes,12,opt,name=rename_to,json=renameTo" json:"rename_to,omitempty"`
ReviewerId int64 `protobuf:"varint,13,opt,name=reviewer_id,json=reviewerId" json:"reviewer_id,omitempty"`
ReviewRequesterId int64 `protobuf:"varint,14,opt,name=review_requester_id,json=reviewRequesterId" json:"review_requester_id,omitempty"`
TeamReviewer *GithubTeam `protobuf:"bytes,16,opt,name=team_reviewer,json=teamReviewer" json:"team_reviewer,omitempty"`
// Contents of a dismissed review event, see dismissed_review in
// https://developer.github.com/v3/issues/events/ for more info
DismissedReview *GithubDismissedReviewEvent `protobuf:"bytes,15,opt,name=dismissed_review,json=dismissedReview" json:"dismissed_review,omitempty"`
@ -576,6 +578,13 @@ func (m *GithubIssueEvent) GetReviewRequesterId() int64 {
return 0
}
func (m *GithubIssueEvent) GetTeamReviewer() *GithubTeam {
if m != nil {
return m.TeamReviewer
}
return nil
}
func (m *GithubIssueEvent) GetDismissedReview() *GithubDismissedReviewEvent {
if m != nil {
return m.DismissedReview
@ -751,6 +760,30 @@ func (m *GithubUser) GetLogin() string {
return ""
}
type GithubTeam struct {
Id int64 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
Slug string `protobuf:"bytes,2,opt,name=slug" json:"slug,omitempty"`
}
func (m *GithubTeam) Reset() { *m = GithubTeam{} }
func (m *GithubTeam) String() string { return proto.CompactTextString(m) }
func (*GithubTeam) ProtoMessage() {}
func (*GithubTeam) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (m *GithubTeam) GetId() int64 {
if m != nil {
return m.Id
}
return 0
}
func (m *GithubTeam) GetSlug() string {
if m != nil {
return m.Slug
}
return ""
}
type GitMutation struct {
Repo *GitRepo `protobuf:"bytes,1,opt,name=repo" json:"repo,omitempty"`
// commit adds a commit, or adds new information to a commit if fields
@ -761,7 +794,7 @@ type GitMutation struct {
func (m *GitMutation) Reset() { *m = GitMutation{} }
func (m *GitMutation) String() string { return proto.CompactTextString(m) }
func (*GitMutation) ProtoMessage() {}
func (*GitMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (*GitMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (m *GitMutation) GetRepo() *GitRepo {
if m != nil {
@ -786,7 +819,7 @@ type GitRepo struct {
func (m *GitRepo) Reset() { *m = GitRepo{} }
func (m *GitRepo) String() string { return proto.CompactTextString(m) }
func (*GitRepo) ProtoMessage() {}
func (*GitRepo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (*GitRepo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *GitRepo) GetGoRepo() string {
if m != nil {
@ -805,7 +838,7 @@ type GitCommit struct {
func (m *GitCommit) Reset() { *m = GitCommit{} }
func (m *GitCommit) String() string { return proto.CompactTextString(m) }
func (*GitCommit) ProtoMessage() {}
func (*GitCommit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*GitCommit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *GitCommit) GetSha1() string {
if m != nil {
@ -836,7 +869,7 @@ type GitDiffTree struct {
func (m *GitDiffTree) Reset() { *m = GitDiffTree{} }
func (m *GitDiffTree) String() string { return proto.CompactTextString(m) }
func (*GitDiffTree) ProtoMessage() {}
func (*GitDiffTree) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (*GitDiffTree) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *GitDiffTree) GetFile() []*GitDiffTreeFile {
if m != nil {
@ -856,7 +889,7 @@ type GitDiffTreeFile struct {
func (m *GitDiffTreeFile) Reset() { *m = GitDiffTreeFile{} }
func (m *GitDiffTreeFile) String() string { return proto.CompactTextString(m) }
func (*GitDiffTreeFile) ProtoMessage() {}
func (*GitDiffTreeFile) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*GitDiffTreeFile) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *GitDiffTreeFile) GetFile() string {
if m != nil {
@ -899,7 +932,7 @@ type GerritMutation struct {
func (m *GerritMutation) Reset() { *m = GerritMutation{} }
func (m *GerritMutation) String() string { return proto.CompactTextString(m) }
func (*GerritMutation) ProtoMessage() {}
func (*GerritMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*GerritMutation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *GerritMutation) GetProject() string {
if m != nil {
@ -937,7 +970,7 @@ type GitRef struct {
func (m *GitRef) Reset() { *m = GitRef{} }
func (m *GitRef) String() string { return proto.CompactTextString(m) }
func (*GitRef) ProtoMessage() {}
func (*GitRef) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*GitRef) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *GitRef) GetRef() string {
if m != nil {
@ -966,6 +999,7 @@ func init() {
proto.RegisterType((*GithubIssueSyncStatus)(nil), "maintpb.GithubIssueSyncStatus")
proto.RegisterType((*GithubIssueCommentMutation)(nil), "maintpb.GithubIssueCommentMutation")
proto.RegisterType((*GithubUser)(nil), "maintpb.GithubUser")
proto.RegisterType((*GithubTeam)(nil), "maintpb.GithubTeam")
proto.RegisterType((*GitMutation)(nil), "maintpb.GitMutation")
proto.RegisterType((*GitRepo)(nil), "maintpb.GitRepo")
proto.RegisterType((*GitCommit)(nil), "maintpb.GitCommit")
@ -978,91 +1012,93 @@ func init() {
func init() { proto.RegisterFile("maintner.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1365 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdb, 0x8e, 0xdb, 0x36,
0x13, 0x86, 0xcf, 0xd2, 0xd8, 0xeb, 0x75, 0xb8, 0x39, 0x30, 0x9b, 0xfc, 0xf9, 0xf7, 0x57, 0x7e,
0x34, 0x8b, 0x24, 0xf5, 0x36, 0x69, 0xd1, 0x16, 0x08, 0x8a, 0x22, 0xc7, 0xc2, 0x41, 0x93, 0x0b,
0x66, 0x73, 0x2d, 0xc8, 0x26, 0xed, 0x55, 0x2a, 0x89, 0xae, 0x48, 0x6f, 0x6a, 0xa0, 0xbd, 0xe9,
0xa3, 0xf4, 0x9d, 0xfa, 0x08, 0xbd, 0xee, 0x2b, 0x14, 0x1c, 0x52, 0x92, 0xed, 0xf5, 0x66, 0x93,
0xde, 0x71, 0x66, 0xbe, 0xa1, 0xe6, 0x3c, 0x14, 0xf4, 0xd3, 0x28, 0xce, 0x74, 0x26, 0xf2, 0xe1,
0x3c, 0x97, 0x5a, 0x92, 0x0e, 0xd2, 0xf3, 0xf1, 0xfe, 0xa3, 0x59, 0xac, 0x4f, 0x16, 0xe3, 0xe1,
0x44, 0xa6, 0x47, 0x33, 0x99, 0x44, 0xd9, 0xec, 0x08, 0x11, 0xe3, 0xc5, 0xf4, 0x68, 0xae, 0x97,
0x73, 0xa1, 0x8e, 0x74, 0x9c, 0x0a, 0xa5, 0xa3, 0x74, 0x5e, 0x9d, 0xec, 0x2d, 0xc1, 0x9f, 0x35,
0xf0, 0x5e, 0x2d, 0x74, 0xa4, 0x63, 0x99, 0x91, 0xef, 0xa1, 0x67, 0xef, 0x0a, 0x63, 0xa5, 0x16,
0x82, 0xd6, 0x0e, 0x6a, 0x87, 0xdd, 0x87, 0x37, 0x87, 0xee, 0x4b, 0xc3, 0x1f, 0x50, 0x38, 0x32,
0xb2, 0x42, 0x87, 0x75, 0x67, 0x15, 0x93, 0x1c, 0x41, 0xdb, 0x92, 0xb4, 0x81, 0xaa, 0xd7, 0x36,
0x54, 0x4b, 0x2d, 0x07, 0x23, 0x9f, 0x41, 0x63, 0x16, 0x6b, 0x5a, 0x47, 0xf4, 0xe5, 0x55, 0x74,
0x09, 0x35, 0x00, 0xbc, 0x58, 0xe4, 0x79, 0xac, 0x69, 0x73, 0xf3, 0x62, 0x64, 0xaf, 0x5c, 0x8c,
0x74, 0xf0, 0x47, 0x0d, 0xfa, 0xeb, 0xdf, 0x24, 0x97, 0xa1, 0x25, 0xdf, 0x67, 0x22, 0x47, 0xb7,
0x7c, 0x66, 0x09, 0x42, 0xa0, 0x99, 0x8b, 0xb9, 0x44, 0x13, 0x7c, 0x86, 0x67, 0x72, 0x1f, 0xda,
0x49, 0x34, 0x16, 0x89, 0xa2, 0x8d, 0x83, 0xc6, 0xa6, 0x61, 0x27, 0x8b, 0xf1, 0x8f, 0x46, 0xc8,
0x1c, 0x86, 0x7c, 0x0b, 0x90, 0xc6, 0x89, 0x50, 0x5a, 0x66, 0x42, 0xd1, 0x26, 0x6a, 0xd0, 0x4d,
0xc7, 0x0b, 0x00, 0x5b, 0xc1, 0x06, 0x7f, 0x7b, 0xb0, 0xb7, 0x25, 0xa6, 0x9f, 0x60, 0xe9, 0x55,
0x68, 0x67, 0x8b, 0x74, 0x2c, 0x72, 0x0c, 0x78, 0x8b, 0x39, 0x8a, 0xdc, 0x00, 0x3f, 0x93, 0x3a,
0x14, 0xbf, 0xc4, 0x4a, 0xd3, 0x9d, 0x83, 0xda, 0xa1, 0xc7, 0xbc, 0x4c, 0xea, 0xe7, 0x86, 0x26,
0x7d, 0xa8, 0xc7, 0x9c, 0xf6, 0x0e, 0x6a, 0x87, 0x0d, 0x56, 0x8f, 0x39, 0xb9, 0x03, 0xcd, 0x85,
0x12, 0xb9, 0x0b, 0xed, 0xde, 0x86, 0xe9, 0x6f, 0x95, 0xc8, 0x19, 0x02, 0xc8, 0x03, 0xf0, 0x23,
0xa5, 0xe2, 0x59, 0x26, 0x84, 0xa2, 0x80, 0x8e, 0x6e, 0x45, 0x57, 0x28, 0x72, 0x0f, 0x2e, 0x71,
0x91, 0x08, 0x2d, 0x78, 0x58, 0xa9, 0x76, 0x0f, 0x1a, 0x87, 0x0d, 0x36, 0x70, 0x82, 0xc7, 0x25,
0xf8, 0x2b, 0xe8, 0x4c, 0x72, 0x11, 0x69, 0xc1, 0x69, 0x0b, 0x6d, 0xd9, 0x1f, 0xce, 0xa4, 0x9c,
0x25, 0x62, 0x58, 0x14, 0xf4, 0xf0, 0xb8, 0xa8, 0x5f, 0x56, 0x40, 0x8d, 0xd6, 0x62, 0xce, 0x51,
0xab, 0x7d, 0xb1, 0x96, 0x83, 0x9a, 0x68, 0x8e, 0x25, 0x5f, 0xd2, 0x8e, 0x8d, 0xa6, 0x39, 0x9b,
0xb8, 0xeb, 0x58, 0x27, 0x82, 0xfa, 0x36, 0xee, 0x48, 0x90, 0xff, 0x41, 0x2f, 0x93, 0x61, 0x99,
0x36, 0xba, 0x8b, 0xe1, 0xec, 0x66, 0xb2, 0x4c, 0xaa, 0x81, 0x94, 0xf2, 0x30, 0xe6, 0x74, 0x80,
0xb1, 0xed, 0x96, 0xbc, 0x11, 0x27, 0xb7, 0x61, 0xa7, 0x82, 0x64, 0x8b, 0x94, 0x5e, 0x42, 0x4c,
0xa5, 0xf7, 0x7a, 0x91, 0x92, 0x3b, 0xb0, 0x5b, 0x81, 0xac, 0x29, 0x04, 0x4d, 0xe9, 0x97, 0xec,
0x63, 0xb4, 0xe9, 0x1e, 0xb4, 0x27, 0x89, 0x54, 0x82, 0xd3, 0xbd, 0x8d, 0xa4, 0x3d, 0x91, 0x32,
0x79, 0x7a, 0x12, 0x65, 0x33, 0xc1, 0x1c, 0xc4, 0x80, 0x13, 0x39, 0xf9, 0x49, 0x70, 0x7a, 0xfd,
0x03, 0x60, 0x0b, 0x31, 0xae, 0xcc, 0x17, 0x49, 0x12, 0xe6, 0xe2, 0xe7, 0x85, 0x50, 0x9a, 0xde,
0xb4, 0xde, 0x1a, 0x1e, 0xb3, 0x2c, 0xf2, 0x0d, 0xf8, 0xf6, 0xe6, 0x30, 0xd2, 0xf4, 0xca, 0x85,
0x21, 0xf7, 0x2c, 0xf8, 0xb1, 0x26, 0x5f, 0x94, 0x8a, 0xe3, 0x25, 0xbd, 0x7a, 0x7e, 0xb5, 0x39,
0x8d, 0x27, 0x4b, 0x63, 0x4d, 0x2e, 0x52, 0x79, 0x2a, 0x42, 0x6c, 0x36, 0x7a, 0x0d, 0x2b, 0xa7,
0x6b, 0x79, 0xd8, 0x86, 0x58, 0x94, 0x9c, 0x3b, 0x39, 0xfd, 0x40, 0xbf, 0x7a, 0x11, 0xe7, 0x56,
0xe5, 0x3b, 0xe8, 0x4c, 0x64, 0x9a, 0x8a, 0x4c, 0x53, 0x0f, 0x15, 0x6e, 0x6f, 0x1b, 0x71, 0x4f,
0x2d, 0xa4, 0x1c, 0x2d, 0x85, 0x0e, 0x79, 0x0e, 0x7d, 0x77, 0x0c, 0x95, 0x8e, 0xf4, 0x42, 0xd1,
0x3e, 0xfa, 0x72, 0x6b, 0xdb, 0x2d, 0x6f, 0x96, 0xd9, 0xe4, 0x0d, 0xa2, 0xd8, 0x8e, 0xd3, 0xb2,
0x24, 0x39, 0x82, 0x96, 0x38, 0x35, 0x36, 0xec, 0xa3, 0x0d, 0xd7, 0xb7, 0x69, 0x3f, 0x37, 0x00,
0x66, 0x71, 0xe4, 0x31, 0xf4, 0xf0, 0x50, 0x7c, 0xf5, 0xc6, 0x47, 0x7d, 0xb5, 0x8b, 0x3a, 0x96,
0x08, 0x6e, 0x01, 0x54, 0x39, 0x27, 0x03, 0x68, 0x9c, 0x46, 0x09, 0x4e, 0x19, 0x8f, 0x99, 0x63,
0xf0, 0x00, 0xba, 0x2b, 0x21, 0x73, 0x93, 0xa2, 0x56, 0x4e, 0x0a, 0x02, 0xcd, 0x2c, 0x4a, 0x45,
0x31, 0x82, 0xcc, 0x39, 0xf8, 0x15, 0x76, 0x37, 0x66, 0xdc, 0x19, 0xb5, 0xb2, 0xaf, 0xea, 0xab,
0x7d, 0x55, 0xd5, 0x70, 0xe3, 0xe2, 0x1a, 0xae, 0x06, 0x5d, 0x13, 0xaf, 0x75, 0x54, 0xf0, 0x57,
0x13, 0x06, 0x9b, 0xf1, 0x3a, 0xf3, 0xfd, 0xff, 0x00, 0xd8, 0xc0, 0x99, 0x6d, 0xe8, 0x8c, 0xf0,
0x91, 0x73, 0xbc, 0x9c, 0x0b, 0x72, 0x1d, 0xbc, 0x68, 0xa2, 0x65, 0x6e, 0x3a, 0xb7, 0x81, 0x4a,
0x1d, 0xa4, 0x47, 0x7c, 0x75, 0x22, 0x35, 0x3f, 0x7e, 0x22, 0xdd, 0x85, 0x96, 0x2d, 0xc7, 0xd6,
0xd9, 0xbd, 0x56, 0x96, 0xa3, 0x85, 0x90, 0xaf, 0xc1, 0xaf, 0x46, 0x8b, 0x9d, 0x5f, 0xe7, 0x2f,
0x8f, 0x0a, 0x4a, 0xfe, 0x0b, 0xdd, 0x62, 0xa0, 0x1a, 0xbb, 0x3b, 0x68, 0x37, 0x14, 0xac, 0x11,
0x5f, 0x01, 0xa0, 0x63, 0xde, 0x1a, 0xc0, 0xf8, 0xf6, 0x39, 0xb4, 0x4d, 0x41, 0xc6, 0x1a, 0xc7,
0x5d, 0xf7, 0xe1, 0x95, 0x8d, 0xcf, 0x3e, 0x45, 0x21, 0x73, 0x20, 0x73, 0x5f, 0x2e, 0x4c, 0xc6,
0xc3, 0x69, 0x2e, 0x53, 0xda, 0xc5, 0x28, 0x82, 0x65, 0xbd, 0xc8, 0x65, 0x6a, 0x76, 0x8e, 0x03,
0x68, 0x89, 0xdb, 0xc5, 0x67, 0x9e, 0x65, 0x1c, 0x4b, 0xab, 0x7d, 0x1a, 0x8b, 0xf7, 0xd6, 0x9a,
0x1d, 0x6b, 0x4d, 0xc1, 0x1a, 0x71, 0x32, 0x84, 0x3d, 0x4b, 0x15, 0x93, 0xc7, 0x02, 0xfb, 0x08,
0xbc, 0x64, 0x45, 0xac, 0x90, 0x8c, 0x38, 0x79, 0x0d, 0x03, 0x1e, 0xab, 0x34, 0x56, 0x66, 0x9c,
0x58, 0x31, 0x4e, 0xe6, 0xb3, 0xcd, 0xfc, 0xac, 0x80, 0x31, 0x44, 0xd9, 0x96, 0xda, 0xe5, 0xeb,
0x5c, 0x53, 0x23, 0x52, 0x9f, 0x88, 0x3c, 0x7c, 0xa7, 0x64, 0x46, 0xe1, 0xa0, 0x76, 0xd8, 0x63,
0x3e, 0x72, 0x5e, 0x2a, 0x99, 0x05, 0xbf, 0xd7, 0x60, 0xff, 0xfc, 0xeb, 0xac, 0xef, 0x68, 0x7d,
0x59, 0x78, 0x9e, 0x65, 0x8c, 0x38, 0xee, 0x40, 0xab, 0x14, 0x25, 0x61, 0x2a, 0x94, 0x8a, 0x66,
0x02, 0x0b, 0xcd, 0x67, 0x83, 0x52, 0xf0, 0xca, 0xf2, 0x4d, 0xaf, 0x98, 0xf6, 0x16, 0x58, 0x6f,
0x3e, 0xb3, 0xc4, 0xcb, 0xa6, 0x57, 0x1f, 0x34, 0x82, 0xb7, 0xd0, 0x5b, 0x4d, 0xcd, 0x27, 0xbc,
0x13, 0x6e, 0x80, 0x6f, 0xd3, 0x58, 0xd4, 0xb8, 0xcf, 0x3c, 0xcb, 0x18, 0xf1, 0xe0, 0x18, 0xae,
0x6c, 0x1d, 0x1d, 0xe4, 0x11, 0x74, 0x95, 0xc8, 0x4f, 0x45, 0x1e, 0x9a, 0x9d, 0xe9, 0x9e, 0x83,
0x1f, 0xea, 0x00, 0xb0, 0xf0, 0x67, 0x91, 0x16, 0xe6, 0x65, 0xb9, 0x7f, 0xfe, 0x34, 0x3d, 0xd3,
0xa3, 0xc5, 0x23, 0xa4, 0x7e, 0xd1, 0x23, 0xa4, 0x58, 0xdc, 0x8d, 0x95, 0xc5, 0xfd, 0xef, 0xda,
0x74, 0xe5, 0xe1, 0xd0, 0xfa, 0xe8, 0x87, 0x43, 0xf0, 0x10, 0xa0, 0xb2, 0x69, 0xdb, 0xa8, 0x4b,
0xe4, 0x2c, 0xce, 0x8a, 0x51, 0x87, 0x44, 0x10, 0xe2, 0x58, 0x2d, 0x7d, 0xff, 0xbf, 0xcb, 0x90,
0x0d, 0xe8, 0x60, 0xd5, 0x57, 0x26, 0xe6, 0xd2, 0xe5, 0xec, 0x6e, 0xd9, 0x9f, 0x36, 0x26, 0x64,
0x15, 0xb7, 0xde, 0x9c, 0x41, 0x00, 0x1d, 0xa7, 0x4c, 0xae, 0x41, 0x67, 0x26, 0xc3, 0xf2, 0x7e,
0x9f, 0xb5, 0x67, 0xd2, 0x08, 0x02, 0x0e, 0x7e, 0xa9, 0x68, 0xa2, 0xa8, 0x4e, 0xa2, 0x07, 0x0e,
0x82, 0x67, 0xb3, 0x0e, 0xf2, 0xe8, 0x3d, 0x7e, 0xad, 0xc7, 0xcc, 0xd1, 0xec, 0x56, 0x1e, 0x4f,
0xa7, 0xa1, 0xce, 0x85, 0x70, 0x53, 0x7a, 0x6d, 0x98, 0x3d, 0x8b, 0xa7, 0xd3, 0xe3, 0x5c, 0x08,
0xe6, 0x71, 0x77, 0x0a, 0x1e, 0xa1, 0xab, 0x85, 0x80, 0xdc, 0x87, 0xe6, 0x34, 0x4e, 0x4c, 0xed,
0x9c, 0x79, 0x16, 0x17, 0x98, 0x17, 0x71, 0x22, 0x18, 0xa2, 0x82, 0x14, 0x77, 0xc9, 0xaa, 0xc0,
0x18, 0xea, 0x2e, 0x40, 0x43, 0xcd, 0xd9, 0x04, 0x39, 0xe2, 0x5c, 0x70, 0x34, 0xb5, 0xc1, 0x2c,
0x41, 0x28, 0x74, 0xdc, 0x8b, 0xb2, 0x98, 0xe2, 0x8e, 0x34, 0xcb, 0x63, 0x1c, 0x67, 0x51, 0xbe,
0xc4, 0xea, 0xf0, 0x98, 0xa3, 0x82, 0xdf, 0xa0, 0xbf, 0xfe, 0xfb, 0x60, 0xee, 0x98, 0xe7, 0xf2,
0x9d, 0x98, 0x68, 0xf7, 0xc1, 0x82, 0x24, 0xf7, 0xed, 0x9b, 0x21, 0xd6, 0x8a, 0xd6, 0xd1, 0x97,
0x6d, 0xe9, 0x28, 0x20, 0xe4, 0xb6, 0xc9, 0xf0, 0xb4, 0xf8, 0x7f, 0xd8, 0x5d, 0xcf, 0xf0, 0x94,
0xa1, 0x30, 0x18, 0x42, 0xdb, 0xd2, 0x18, 0x79, 0x31, 0x75, 0x9f, 0x34, 0xc7, 0x32, 0x3f, 0xf5,
0x2a, 0x3f, 0xe3, 0x36, 0x96, 0xe5, 0x97, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xbb, 0x24, 0x15,
0xd7, 0x0a, 0x0e, 0x00, 0x00,
// 1401 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x6d, 0x6f, 0xdb, 0x36,
0x10, 0x86, 0xdf, 0xa5, 0xb3, 0xe3, 0xb8, 0x4c, 0x5f, 0xd8, 0xb4, 0xeb, 0x32, 0x75, 0x58, 0x83,
0xb6, 0x73, 0xda, 0x6e, 0xd8, 0x0a, 0x14, 0xc3, 0xd0, 0xd7, 0xc1, 0xc5, 0xda, 0x0f, 0x6c, 0xfa,
0x59, 0x90, 0x4d, 0x5a, 0x51, 0x27, 0x89, 0x9e, 0x44, 0xa5, 0x0b, 0xb0, 0x7d, 0xd9, 0x1f, 0x19,
0xb0, 0xff, 0xb4, 0xdf, 0xb1, 0xbf, 0x30, 0xf0, 0x48, 0x49, 0x8e, 0xed, 0x34, 0xed, 0xbe, 0xf1,
0x8e, 0xcf, 0x9d, 0x8e, 0x77, 0xc7, 0xe7, 0x28, 0x18, 0x26, 0x41, 0x94, 0xaa, 0x54, 0x64, 0xe3,
0x45, 0x26, 0x95, 0x24, 0x3d, 0x94, 0x17, 0xd3, 0xdd, 0x47, 0x61, 0xa4, 0x8e, 0x8a, 0xe9, 0x78,
0x26, 0x93, 0x83, 0x50, 0xc6, 0x41, 0x1a, 0x1e, 0x20, 0x62, 0x5a, 0xcc, 0x0f, 0x16, 0xea, 0x64,
0x21, 0xf2, 0x03, 0x15, 0x25, 0x22, 0x57, 0x41, 0xb2, 0xa8, 0x57, 0xc6, 0x8b, 0xf7, 0x4f, 0x03,
0x9c, 0x57, 0x85, 0x0a, 0x54, 0x24, 0x53, 0xf2, 0x23, 0x0c, 0x8c, 0x2f, 0x3f, 0xca, 0xf3, 0x42,
0xd0, 0xc6, 0x5e, 0x63, 0xbf, 0xff, 0xe0, 0xfa, 0xd8, 0x7e, 0x69, 0xfc, 0x13, 0x6e, 0x4e, 0xf4,
0x5e, 0x69, 0xc3, 0xfa, 0x61, 0xad, 0x24, 0x07, 0xd0, 0x35, 0x22, 0x6d, 0xa1, 0xe9, 0x95, 0x15,
0xd3, 0xca, 0xca, 0xc2, 0xc8, 0x57, 0xd0, 0x0a, 0x23, 0x45, 0x9b, 0x88, 0xbe, 0xb8, 0x8c, 0xae,
0xa0, 0x1a, 0x80, 0x8e, 0x45, 0x96, 0x45, 0x8a, 0xb6, 0x57, 0x1d, 0xa3, 0x7a, 0xc9, 0x31, 0xca,
0xde, 0xdf, 0x0d, 0x18, 0x9e, 0xfe, 0x26, 0xb9, 0x08, 0x1d, 0xf9, 0x3e, 0x15, 0x19, 0x1e, 0xcb,
0x65, 0x46, 0x20, 0x04, 0xda, 0x99, 0x58, 0x48, 0x0c, 0xc1, 0x65, 0xb8, 0x26, 0x77, 0xa1, 0x1b,
0x07, 0x53, 0x11, 0xe7, 0xb4, 0xb5, 0xd7, 0x5a, 0x0d, 0xec, 0xa8, 0x98, 0xfe, 0xac, 0x37, 0x99,
0xc5, 0x90, 0x87, 0x00, 0x49, 0x14, 0x8b, 0x5c, 0xc9, 0x54, 0xe4, 0xb4, 0x8d, 0x16, 0x74, 0xf5,
0xe0, 0x25, 0x80, 0x2d, 0x61, 0xbd, 0x7f, 0x1d, 0xd8, 0xd9, 0x90, 0xd3, 0x4f, 0x88, 0xf4, 0x32,
0x74, 0xd3, 0x22, 0x99, 0x8a, 0x0c, 0x13, 0xde, 0x61, 0x56, 0x22, 0xd7, 0xc0, 0x4d, 0xa5, 0xf2,
0xc5, 0x6f, 0x51, 0xae, 0xe8, 0xd6, 0x5e, 0x63, 0xdf, 0x61, 0x4e, 0x2a, 0xd5, 0x73, 0x2d, 0x93,
0x21, 0x34, 0x23, 0x4e, 0x07, 0x7b, 0x8d, 0xfd, 0x16, 0x6b, 0x46, 0x9c, 0xdc, 0x82, 0x76, 0x91,
0x8b, 0xcc, 0xa6, 0x76, 0x67, 0x25, 0xf4, 0xb7, 0xb9, 0xc8, 0x18, 0x02, 0xc8, 0x7d, 0x70, 0x83,
0x3c, 0x8f, 0xc2, 0x54, 0x88, 0x9c, 0x02, 0x1e, 0x74, 0x23, 0xba, 0x46, 0x91, 0x3b, 0x70, 0x81,
0x8b, 0x58, 0x28, 0xc1, 0xfd, 0xda, 0xb4, 0xbf, 0xd7, 0xda, 0x6f, 0xb1, 0x91, 0xdd, 0x78, 0x5c,
0x81, 0xbf, 0x85, 0xde, 0x2c, 0x13, 0x81, 0x12, 0x9c, 0x76, 0x30, 0x96, 0xdd, 0x71, 0x28, 0x65,
0x18, 0x8b, 0x71, 0xd9, 0xd0, 0xe3, 0xc3, 0xb2, 0x7f, 0x59, 0x09, 0xd5, 0x56, 0xc5, 0x82, 0xa3,
0x55, 0xf7, 0x7c, 0x2b, 0x0b, 0xd5, 0xd9, 0x9c, 0x4a, 0x7e, 0x42, 0x7b, 0x26, 0x9b, 0x7a, 0xad,
0xf3, 0xae, 0x22, 0x15, 0x0b, 0xea, 0x9a, 0xbc, 0xa3, 0x40, 0xbe, 0x80, 0x41, 0x2a, 0xfd, 0xaa,
0x6c, 0x74, 0x1b, 0xd3, 0xd9, 0x4f, 0x65, 0x55, 0x54, 0x0d, 0xa9, 0xf6, 0xfd, 0x88, 0xd3, 0x11,
0xe6, 0xb6, 0x5f, 0xe9, 0x26, 0x9c, 0xdc, 0x84, 0xad, 0x1a, 0x92, 0x16, 0x09, 0xbd, 0x80, 0x98,
0xda, 0xee, 0x75, 0x91, 0x90, 0x5b, 0xb0, 0x5d, 0x83, 0x4c, 0x28, 0x04, 0x43, 0x19, 0x56, 0xea,
0x43, 0x8c, 0xe9, 0x0e, 0x74, 0x67, 0xb1, 0xcc, 0x05, 0xa7, 0x3b, 0x2b, 0x45, 0x7b, 0x22, 0x65,
0xfc, 0xf4, 0x28, 0x48, 0x43, 0xc1, 0x2c, 0x44, 0x83, 0x63, 0x39, 0xfb, 0x45, 0x70, 0x7a, 0xf5,
0x03, 0x60, 0x03, 0xd1, 0x47, 0x59, 0x14, 0x71, 0xec, 0x67, 0xe2, 0xd7, 0x42, 0xe4, 0x8a, 0x5e,
0x37, 0xa7, 0xd5, 0x3a, 0x66, 0x54, 0xe4, 0x7b, 0x70, 0x8d, 0x67, 0x3f, 0x50, 0xf4, 0xd2, 0xb9,
0x29, 0x77, 0x0c, 0xf8, 0xb1, 0x22, 0xf7, 0x2a, 0xc3, 0xe9, 0x09, 0xbd, 0x7c, 0x76, 0xb7, 0x59,
0x8b, 0x27, 0x27, 0x3a, 0x9a, 0x4c, 0x24, 0xf2, 0x58, 0xf8, 0x78, 0xd9, 0xe8, 0x15, 0xec, 0x9c,
0xbe, 0xd1, 0xe1, 0x35, 0xc4, 0xa6, 0xe4, 0xdc, 0xee, 0xd3, 0x0f, 0xdc, 0x57, 0x27, 0xe0, 0xdc,
0x98, 0xfc, 0x00, 0xbd, 0x99, 0x4c, 0x12, 0x91, 0x2a, 0xea, 0xa0, 0xc1, 0xcd, 0x4d, 0x14, 0xf7,
0xd4, 0x40, 0x2a, 0x6a, 0x29, 0x6d, 0xc8, 0x73, 0x18, 0xda, 0xa5, 0x9f, 0xab, 0x40, 0x15, 0x39,
0x1d, 0xe2, 0x59, 0x6e, 0x6c, 0xf2, 0xf2, 0xe6, 0x24, 0x9d, 0xbd, 0x41, 0x14, 0xdb, 0xb2, 0x56,
0x46, 0x24, 0x07, 0xd0, 0x11, 0xc7, 0x3a, 0x86, 0x5d, 0x8c, 0xe1, 0xea, 0x26, 0xeb, 0xe7, 0x1a,
0xc0, 0x0c, 0x8e, 0x3c, 0x86, 0x01, 0x2e, 0xca, 0xaf, 0x5e, 0xfb, 0xa8, 0xaf, 0xf6, 0xd1, 0xc6,
0x08, 0xde, 0x0d, 0x80, 0xba, 0xe6, 0x64, 0x04, 0xad, 0xe3, 0x20, 0x46, 0x96, 0x71, 0x98, 0x5e,
0x7a, 0xf7, 0xa1, 0xbf, 0x94, 0x32, 0xcb, 0x14, 0x8d, 0x8a, 0x29, 0x08, 0xb4, 0xd3, 0x20, 0x11,
0x25, 0x05, 0xe9, 0xb5, 0xf7, 0x3b, 0x6c, 0xaf, 0x70, 0xdc, 0x9a, 0x59, 0x75, 0xaf, 0x9a, 0xcb,
0xf7, 0xaa, 0xee, 0xe1, 0xd6, 0xf9, 0x3d, 0x5c, 0x13, 0x5d, 0x1b, 0xdd, 0x5a, 0xc9, 0xfb, 0xab,
0x03, 0xa3, 0xd5, 0x7c, 0xad, 0x7d, 0xff, 0x33, 0x00, 0x93, 0x38, 0x3d, 0x0d, 0x6d, 0x10, 0x2e,
0x6a, 0x0e, 0x4f, 0x16, 0x82, 0x5c, 0x05, 0x27, 0x98, 0x29, 0x99, 0xe9, 0x9b, 0xdb, 0x42, 0xa3,
0x1e, 0xca, 0x13, 0xbe, 0xcc, 0x48, 0xed, 0x8f, 0x67, 0xa4, 0xdb, 0xd0, 0x31, 0xed, 0xd8, 0x59,
0x9f, 0x6b, 0x55, 0x3b, 0x1a, 0x08, 0xf9, 0x0e, 0xdc, 0x9a, 0x5a, 0x0c, 0x7f, 0x9d, 0x3d, 0x3c,
0x6a, 0x28, 0xf9, 0x1c, 0xfa, 0x25, 0xa1, 0xea, 0xb8, 0x7b, 0x18, 0x37, 0x94, 0xaa, 0x09, 0x5f,
0x02, 0xe0, 0xc1, 0x9c, 0x53, 0x00, 0x7d, 0xb6, 0xaf, 0xa1, 0xab, 0x1b, 0x32, 0x52, 0x48, 0x77,
0xfd, 0x07, 0x97, 0x56, 0x3e, 0xfb, 0x14, 0x37, 0x99, 0x05, 0x69, 0x7f, 0x99, 0xd0, 0x15, 0xf7,
0xe7, 0x99, 0x4c, 0x68, 0x1f, 0xb3, 0x08, 0x46, 0xf5, 0x22, 0x93, 0x89, 0x9e, 0x39, 0x16, 0xa0,
0x24, 0x4e, 0x17, 0x97, 0x39, 0x46, 0x71, 0x28, 0x8d, 0xf5, 0x71, 0x24, 0xde, 0x9b, 0x68, 0xb6,
0x4c, 0x34, 0xa5, 0x6a, 0xc2, 0xc9, 0x18, 0x76, 0x8c, 0x54, 0x32, 0x8f, 0x01, 0x0e, 0x11, 0x78,
0xc1, 0x6c, 0xb1, 0x72, 0x67, 0xc2, 0xc9, 0x43, 0xd8, 0x52, 0x22, 0x48, 0xfc, 0xd2, 0x05, 0x72,
0xee, 0x3a, 0x9f, 0x1c, 0x8a, 0x20, 0x61, 0x03, 0x8d, 0x64, 0x16, 0x48, 0x5e, 0xc3, 0x88, 0x47,
0x79, 0x12, 0xe5, 0x9a, 0x88, 0x8c, 0x39, 0x72, 0xfa, 0x3a, 0x0d, 0x3c, 0x2b, 0x61, 0xc6, 0xd6,
0x5c, 0xc6, 0x6d, 0x7e, 0x5a, 0xab, 0xbb, 0x4b, 0xaa, 0x23, 0x91, 0xf9, 0xef, 0x72, 0x99, 0x52,
0xd8, 0x6b, 0xec, 0x0f, 0x98, 0x8b, 0x9a, 0x97, 0xb9, 0x4c, 0xbd, 0x3f, 0x1b, 0xb0, 0x7b, 0xb6,
0x3b, 0x93, 0x35, 0x3c, 0x77, 0xd5, 0xb2, 0x8e, 0x51, 0x4c, 0x38, 0x4e, 0x4f, 0x63, 0x14, 0xc4,
0x7e, 0x22, 0xf2, 0x3c, 0x08, 0x05, 0xb6, 0xa8, 0xcb, 0x46, 0xd5, 0xc6, 0x2b, 0xa3, 0xd7, 0xb7,
0x4c, 0x13, 0x83, 0xc0, 0x4e, 0x75, 0x99, 0x11, 0x5e, 0xb6, 0x9d, 0xe6, 0xa8, 0xe5, 0xbd, 0x85,
0xc1, 0x72, 0x51, 0x3f, 0xe1, 0x85, 0x71, 0x0d, 0x5c, 0xd3, 0x00, 0xe5, 0xed, 0x70, 0x99, 0x63,
0x14, 0x13, 0xee, 0x1d, 0xc2, 0xa5, 0x8d, 0xa4, 0x43, 0x1e, 0x41, 0x3f, 0x17, 0xd9, 0xb1, 0xc8,
0x7c, 0x3d, 0x6d, 0xed, 0x43, 0xf2, 0x43, 0x77, 0x07, 0x0c, 0xfc, 0x59, 0xa0, 0x84, 0x7e, 0x93,
0xee, 0x9e, 0xcd, 0xc3, 0x6b, 0xb7, 0xbb, 0x7c, 0xbe, 0x34, 0xcf, 0x7b, 0xbe, 0x94, 0x23, 0xbf,
0xb5, 0x34, 0xf2, 0xff, 0xdf, 0x05, 0x5f, 0x7a, 0x72, 0x74, 0x3e, 0xfa, 0xc9, 0xe1, 0x3d, 0x00,
0xa8, 0x63, 0xda, 0x44, 0x92, 0xb1, 0x0c, 0xa3, 0xb4, 0x24, 0x49, 0x14, 0xbc, 0x7b, 0xa5, 0x8d,
0x6e, 0xe4, 0x4d, 0x7c, 0x9c, 0xc7, 0x45, 0x58, 0x16, 0x4c, 0xaf, 0x3d, 0x1f, 0x29, 0xbc, 0xca,
0xd6, 0x97, 0xb6, 0xa6, 0xa6, 0x04, 0xa3, 0xe5, 0xec, 0x30, 0xb1, 0x90, 0xb6, 0xca, 0xb7, 0x2b,
0x2e, 0x30, 0x59, 0x24, 0xcb, 0xb8, 0xd3, 0x44, 0xe0, 0x79, 0xd0, 0xb3, 0xc6, 0xe4, 0x0a, 0xf4,
0x42, 0xe9, 0x57, 0xfe, 0x5d, 0xd6, 0x0d, 0xa5, 0xde, 0xf0, 0x38, 0xb8, 0x95, 0x21, 0x46, 0x79,
0x14, 0xdc, 0xb7, 0x10, 0x5c, 0xeb, 0xd1, 0x93, 0x05, 0xef, 0xf1, 0x6b, 0x03, 0xa6, 0x97, 0x7a,
0x8e, 0xf3, 0x68, 0x3e, 0xf7, 0x55, 0x26, 0x84, 0x9d, 0x08, 0xa7, 0x88, 0xf3, 0x59, 0x34, 0x9f,
0x1f, 0x66, 0x42, 0x30, 0x87, 0xdb, 0x95, 0xf7, 0x08, 0x8f, 0x5a, 0x6e, 0x90, 0xbb, 0xd0, 0x9e,
0x47, 0xb1, 0xee, 0xb6, 0xb5, 0x27, 0x78, 0x89, 0x79, 0x11, 0xc5, 0x82, 0x21, 0xca, 0x4b, 0x70,
0x6e, 0x2d, 0x6f, 0xe8, 0x40, 0xad, 0x03, 0x0c, 0x54, 0xaf, 0x75, 0x59, 0x02, 0xce, 0x05, 0xc7,
0x50, 0x5b, 0xcc, 0x08, 0x84, 0x42, 0xcf, 0xbe, 0x5e, 0xcb, 0x89, 0x61, 0x45, 0x3d, 0xa8, 0xa6,
0x51, 0x1a, 0x64, 0x27, 0xd8, 0x4f, 0x0e, 0xb3, 0x92, 0xf7, 0x07, 0x0c, 0x4f, 0xff, 0xaa, 0x68,
0x1f, 0x8b, 0x4c, 0xbe, 0x13, 0x33, 0x65, 0x3f, 0x58, 0x8a, 0xe4, 0xae, 0x79, 0x9f, 0x44, 0x2a,
0xa7, 0x4d, 0x3c, 0xcb, 0xa6, 0x72, 0x94, 0x10, 0x72, 0x53, 0x57, 0x78, 0x5e, 0xfe, 0xab, 0x6c,
0x9f, 0xae, 0xf0, 0x9c, 0xe1, 0xa6, 0x37, 0x86, 0xae, 0x91, 0x31, 0xf3, 0x62, 0x6e, 0x3f, 0xa9,
0x97, 0x55, 0x7d, 0x9a, 0x75, 0x7d, 0xa6, 0x5d, 0x6c, 0xe4, 0x6f, 0xfe, 0x0b, 0x00, 0x00, 0xff,
0xff, 0xec, 0x37, 0x4a, 0xa0, 0x76, 0x0e, 0x00, 0x00,
}

Просмотреть файл

@ -131,6 +131,7 @@ message GithubIssueEvent {
int64 reviewer_id = 13;
int64 review_requester_id = 14;
GithubTeam team_reviewer = 16;
// Contents of a dismissed review event, see dismissed_review in
// https://developer.github.com/v3/issues/events/ for more info
GithubDismissedReviewEvent dismissed_review = 15;
@ -139,6 +140,8 @@ message GithubIssueEvent {
// in the future, this captures those added fields. If non-empty it
// will be a JSON object with the fields that weren't understood.
bytes other_json = 10;
// Next tag: 17.
}
// Contents of a dismissed review event - when someone leaves a
@ -180,6 +183,11 @@ message GithubUser {
string login = 2;
}
message GithubTeam {
int64 id = 1;
string slug = 2;
}
message GitMutation {
GitRepo repo = 1;