forked from lug/matterbridge
		
	Compare commits
	
		
			16 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					8eb5e3cbf8 | ||
| 
						 | 
					ddc2625934 | ||
| 
						 | 
					7f7ca697a0 | ||
| 
						 | 
					900375679b | ||
| 
						 | 
					9440b9e313 | ||
| 
						 | 
					393f9e998b | ||
| 
						 | 
					ba0bfe70a8 | ||
| 
						 | 
					3c4a3e3f75 | ||
| 
						 | 
					274fb09ed4 | ||
| 
						 | 
					d44598a900 | ||
| 
						 | 
					c9cfa59f54 | ||
| 
						 | 
					7062234331 | ||
| 
						 | 
					9754569525 | ||
| 
						 | 
					52a071e34d | ||
| 
						 | 
					2d8f749e36 | ||
| 
						 | 
					a18cb74f03 | 
@@ -10,4 +10,7 @@ RUN apk update && apk add go git gcc musl-dev \
 | 
				
			|||||||
FROM alpine:edge
 | 
					FROM alpine:edge
 | 
				
			||||||
RUN apk --no-cache add ca-certificates mailcap
 | 
					RUN apk --no-cache add ca-certificates mailcap
 | 
				
			||||||
COPY --from=builder /bin/matterbridge /bin/matterbridge
 | 
					COPY --from=builder /bin/matterbridge /bin/matterbridge
 | 
				
			||||||
ENTRYPOINT ["/bin/matterbridge"]
 | 
					RUN mkdir /etc/matterbridge
 | 
				
			||||||
 | 
					RUN touch /etc/matterbridge/matterbridge.toml
 | 
				
			||||||
 | 
					RUN ln -sf /matterbridge.toml /etc/matterbridge/matterbridge.toml
 | 
				
			||||||
 | 
					ENTRYPOINT ["/bin/matterbridge", "-conf", "/etc/matterbridge/matterbridge.toml"]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -151,7 +151,7 @@ See https://github.com/42wim/matterbridge/wiki
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Binaries
 | 
					### Binaries
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Latest stable release [v1.17.4](https://github.com/42wim/matterbridge/releases/latest)
 | 
					- Latest stable release [v1.17.5](https://github.com/42wim/matterbridge/releases/latest)
 | 
				
			||||||
- Development releases (follows master) can be downloaded [here](https://dl.bintray.com/42wim/nightly/)
 | 
					- Development releases (follows master) can be downloaded [here](https://dl.bintray.com/42wim/nightly/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest) and follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
 | 
					To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest) and follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,6 +84,7 @@ type Protocol struct {
 | 
				
			|||||||
	DisableWebPagePreview  bool   // telegram
 | 
						DisableWebPagePreview  bool   // telegram
 | 
				
			||||||
	EditSuffix             string // mattermost, slack, discord, telegram, gitter
 | 
						EditSuffix             string // mattermost, slack, discord, telegram, gitter
 | 
				
			||||||
	EditDisable            bool   // mattermost, slack, discord, telegram, gitter
 | 
						EditDisable            bool   // mattermost, slack, discord, telegram, gitter
 | 
				
			||||||
 | 
						HTMLDisable            bool   // matrix
 | 
				
			||||||
	IconURL                string // mattermost, slack
 | 
						IconURL                string // mattermost, slack
 | 
				
			||||||
	IgnoreFailureOnStart   bool   // general
 | 
						IgnoreFailureOnStart   bool   // general
 | 
				
			||||||
	IgnoreNicks            string // all protocols
 | 
						IgnoreNicks            string // all protocols
 | 
				
			||||||
@@ -135,6 +136,7 @@ type Protocol struct {
 | 
				
			|||||||
	SkipTLSVerify          bool       // IRC, mattermost
 | 
						SkipTLSVerify          bool       // IRC, mattermost
 | 
				
			||||||
	SkipVersionCheck       bool       // mattermost
 | 
						SkipVersionCheck       bool       // mattermost
 | 
				
			||||||
	StripNick              bool       // all protocols
 | 
						StripNick              bool       // all protocols
 | 
				
			||||||
 | 
						StripMarkdown          bool       // irc
 | 
				
			||||||
	SyncTopic              bool       // slack
 | 
						SyncTopic              bool       // slack
 | 
				
			||||||
	TengoModifyMessage     string     // general
 | 
						TengoModifyMessage     string     // general
 | 
				
			||||||
	Team                   string     // mattermost, keybase
 | 
						Team                   string     // mattermost, keybase
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -229,7 +229,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
 | 
				
			|||||||
	// Use webhook to send the message
 | 
						// Use webhook to send the message
 | 
				
			||||||
	if wID != "" && msg.Event != config.EventMsgDelete {
 | 
						if wID != "" && msg.Event != config.EventMsgDelete {
 | 
				
			||||||
		// skip events
 | 
							// skip events
 | 
				
			||||||
		if msg.Event != "" && msg.Event != config.EventJoinLeave && msg.Event != config.EventTopicChange {
 | 
							if msg.Event != "" && msg.Event != config.EventUserAction && msg.Event != config.EventJoinLeave && msg.Event != config.EventTopicChange {
 | 
				
			||||||
			return "", nil
 | 
								return "", nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -217,7 +217,7 @@ func handleEmbed(embed *discordgo.MessageEmbed) string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		i++
 | 
							i++
 | 
				
			||||||
		if i == 1 {
 | 
							if i == 1 {
 | 
				
			||||||
			result += "embed: " + e
 | 
								result += " embed: " + e
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,14 +20,14 @@ func TestHandleEmbed(t *testing.T) {
 | 
				
			|||||||
			embed: &discordgo.MessageEmbed{
 | 
								embed: &discordgo.MessageEmbed{
 | 
				
			||||||
				Title: "blah",
 | 
									Title: "blah",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			result: "embed: blah\n",
 | 
								result: " embed: blah\n",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"two": {
 | 
							"two": {
 | 
				
			||||||
			embed: &discordgo.MessageEmbed{
 | 
								embed: &discordgo.MessageEmbed{
 | 
				
			||||||
				Title:       "blah",
 | 
									Title:       "blah",
 | 
				
			||||||
				Description: "blah2",
 | 
									Description: "blah2",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			result: "embed: blah - blah2\n",
 | 
								result: " embed: blah - blah2\n",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"three": {
 | 
							"three": {
 | 
				
			||||||
			embed: &discordgo.MessageEmbed{
 | 
								embed: &discordgo.MessageEmbed{
 | 
				
			||||||
@@ -35,20 +35,20 @@ func TestHandleEmbed(t *testing.T) {
 | 
				
			|||||||
				Description: "blah2",
 | 
									Description: "blah2",
 | 
				
			||||||
				URL:         "blah3",
 | 
									URL:         "blah3",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			result: "embed: blah - blah2 - blah3\n",
 | 
								result: " embed: blah - blah2 - blah3\n",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"twob": {
 | 
							"twob": {
 | 
				
			||||||
			embed: &discordgo.MessageEmbed{
 | 
								embed: &discordgo.MessageEmbed{
 | 
				
			||||||
				Description: "blah2",
 | 
									Description: "blah2",
 | 
				
			||||||
				URL:         "blah3",
 | 
									URL:         "blah3",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			result: "embed: blah2 - blah3\n",
 | 
								result: " embed: blah2 - blah3\n",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"oneb": {
 | 
							"oneb": {
 | 
				
			||||||
			embed: &discordgo.MessageEmbed{
 | 
								embed: &discordgo.MessageEmbed{
 | 
				
			||||||
				URL: "blah3",
 | 
									URL: "blah3",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			result: "embed: blah3\n",
 | 
								result: " embed: blah3\n",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -188,8 +188,9 @@ func replaceEmotes(text string) string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Bdiscord) replaceAction(text string) (string, bool) {
 | 
					func (b *Bdiscord) replaceAction(text string) (string, bool) {
 | 
				
			||||||
	if strings.HasPrefix(text, "_") && strings.HasSuffix(text, "_") {
 | 
						length := len(text)
 | 
				
			||||||
		return text[1 : len(text)-1], true
 | 
						if length > 1 && text[0] == '_' && text[length-1] == '_' {
 | 
				
			||||||
 | 
							return text[1 : length-1], true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return text, false
 | 
						return text, false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,8 +10,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/42wim/matterbridge/bridge/config"
 | 
						"github.com/42wim/matterbridge/bridge/config"
 | 
				
			||||||
	"github.com/42wim/matterbridge/bridge/helper"
 | 
						"github.com/42wim/matterbridge/bridge/helper"
 | 
				
			||||||
	"github.com/dfordsoft/golib/ic"
 | 
					 | 
				
			||||||
	"github.com/lrstanley/girc"
 | 
						"github.com/lrstanley/girc"
 | 
				
			||||||
 | 
						"github.com/missdeer/golib/ic"
 | 
				
			||||||
	"github.com/paulrosania/go-charset/charset"
 | 
						"github.com/paulrosania/go-charset/charset"
 | 
				
			||||||
	"github.com/saintfish/chardet"
 | 
						"github.com/saintfish/chardet"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,7 @@ import (
 | 
				
			|||||||
	"github.com/42wim/matterbridge/bridge/config"
 | 
						"github.com/42wim/matterbridge/bridge/config"
 | 
				
			||||||
	"github.com/42wim/matterbridge/bridge/helper"
 | 
						"github.com/42wim/matterbridge/bridge/helper"
 | 
				
			||||||
	"github.com/lrstanley/girc"
 | 
						"github.com/lrstanley/girc"
 | 
				
			||||||
 | 
						stripmd "github.com/writeas/go-strip-markdown"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// We need to import the 'data' package as an implicit dependency.
 | 
						// We need to import the 'data' package as an implicit dependency.
 | 
				
			||||||
	// See: https://godoc.org/github.com/paulrosania/go-charset/charset
 | 
						// See: https://godoc.org/github.com/paulrosania/go-charset/charset
 | 
				
			||||||
@@ -156,6 +157,10 @@ func (b *Birc) Send(msg config.Message) (string, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var msgLines []string
 | 
						var msgLines []string
 | 
				
			||||||
 | 
						if b.GetBool("StripMarkdown") {
 | 
				
			||||||
 | 
							msg.Text = stripmd.Strip(msg.Text)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if b.GetBool("MessageSplit") {
 | 
						if b.GetBool("MessageSplit") {
 | 
				
			||||||
		msgLines = helper.GetSubLines(msg.Text, b.MessageLength)
 | 
							msgLines = helper.GetSubLines(msg.Text, b.MessageLength)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -124,6 +124,14 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) {
 | 
				
			|||||||
		return resp.EventID, err
 | 
							return resp.EventID, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if b.GetBool("HTMLDisable") {
 | 
				
			||||||
 | 
							resp, err := b.mc.SendText(channel, msg.Username+msg.Text)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return "", err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return resp.EventID, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	username := html.EscapeString(msg.Username)
 | 
						username := html.EscapeString(msg.Username)
 | 
				
			||||||
	// check if we have a </tag>. if we have, we don't escape HTML. #696
 | 
						// check if we have a </tag>. if we have, we don't escape HTML. #696
 | 
				
			||||||
	if b.htmlTag.MatchString(msg.Username) {
 | 
						if b.htmlTag.MatchString(msg.Username) {
 | 
				
			||||||
@@ -372,6 +380,8 @@ func (b *Bmatrix) getAvatarURL(sender string) string {
 | 
				
			|||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	url := strings.ReplaceAll(mxcURL, "mxc://", b.GetString("Server")+"/_matrix/media/r0/thumbnail/")
 | 
						url := strings.ReplaceAll(mxcURL, "mxc://", b.GetString("Server")+"/_matrix/media/r0/thumbnail/")
 | 
				
			||||||
 | 
						if url != "" {
 | 
				
			||||||
		url += "?width=37&height=37&method=crop"
 | 
							url += "?width=37&height=37&method=crop"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return url
 | 
						return url
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/42wim/matterbridge/bridge"
 | 
						"github.com/42wim/matterbridge/bridge"
 | 
				
			||||||
	"github.com/42wim/matterbridge/bridge/config"
 | 
						"github.com/42wim/matterbridge/bridge/config"
 | 
				
			||||||
 | 
						"github.com/davecgh/go-spew/spew"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/mattn/godown"
 | 
						"github.com/mattn/godown"
 | 
				
			||||||
	msgraph "github.com/yaegashi/msgraph.go/beta"
 | 
						msgraph "github.com/yaegashi/msgraph.go/beta"
 | 
				
			||||||
@@ -158,11 +159,22 @@ func (b *Bmsteams) poll(channelName string) error {
 | 
				
			|||||||
					continue
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if b.GetBool("debug") {
 | 
				
			||||||
 | 
									b.Log.Debug("Msg dump: ", spew.Sdump(msg))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// skip non-user message for now.
 | 
				
			||||||
 | 
								if msg.From.User == nil {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if *msg.From.User.ID == b.botID {
 | 
								if *msg.From.User.ID == b.botID {
 | 
				
			||||||
				b.Log.Debug("skipping own message")
 | 
									b.Log.Debug("skipping own message")
 | 
				
			||||||
				msgmap[*msg.ID] = *msg.CreatedDateTime
 | 
									msgmap[*msg.ID] = *msg.CreatedDateTime
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			msgmap[*msg.ID] = *msg.CreatedDateTime
 | 
								msgmap[*msg.ID] = *msg.CreatedDateTime
 | 
				
			||||||
			if msg.LastModifiedDateTime != nil {
 | 
								if msg.LastModifiedDateTime != nil {
 | 
				
			||||||
				msgmap[*msg.ID] = *msg.LastModifiedDateTime
 | 
									msgmap[*msg.ID] = *msg.LastModifiedDateTime
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ var ErrEventIgnored = errors.New("this event message should ignored")
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (b *Bslack) handleSlack() {
 | 
					func (b *Bslack) handleSlack() {
 | 
				
			||||||
	messages := make(chan *config.Message)
 | 
						messages := make(chan *config.Message)
 | 
				
			||||||
	if b.GetString(incomingWebhookConfig) != "" {
 | 
						if b.GetString(incomingWebhookConfig) != "" && b.GetString(tokenConfig) == "" {
 | 
				
			||||||
		b.Log.Debugf("Choosing webhooks based receiving")
 | 
							b.Log.Debugf("Choosing webhooks based receiving")
 | 
				
			||||||
		go b.handleMatterHook(messages)
 | 
							go b.handleMatterHook(messages)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -204,7 +204,7 @@ func (b *Bslack) Send(msg config.Message) (string, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Use webhook to send the message
 | 
						// Use webhook to send the message
 | 
				
			||||||
	if b.GetString(outgoingWebhookConfig) != "" {
 | 
						if b.GetString(outgoingWebhookConfig) != "" && b.GetString(tokenConfig) == "" {
 | 
				
			||||||
		return "", b.sendWebhook(msg)
 | 
							return "", b.sendWebhook(msg)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return b.sendRTM(msg)
 | 
						return b.sendRTM(msg)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,22 +39,32 @@ func (b *Btelegram) handleGroups(rmsg *config.Message, message *tgbotapi.Message
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// handleForwarded handles forwarded messages
 | 
					// handleForwarded handles forwarded messages
 | 
				
			||||||
func (b *Btelegram) handleForwarded(rmsg *config.Message, message *tgbotapi.Message) {
 | 
					func (b *Btelegram) handleForwarded(rmsg *config.Message, message *tgbotapi.Message) {
 | 
				
			||||||
	if message.ForwardFrom != nil {
 | 
						if message.ForwardDate == 0 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if message.ForwardFrom == nil {
 | 
				
			||||||
 | 
							rmsg.Text = "Forwarded from " + unknownUser + ": " + rmsg.Text
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	usernameForward := ""
 | 
						usernameForward := ""
 | 
				
			||||||
	if b.GetBool("UseFirstName") {
 | 
						if b.GetBool("UseFirstName") {
 | 
				
			||||||
		usernameForward = message.ForwardFrom.FirstName
 | 
							usernameForward = message.ForwardFrom.FirstName
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if usernameForward == "" {
 | 
						if usernameForward == "" {
 | 
				
			||||||
		usernameForward = message.ForwardFrom.UserName
 | 
							usernameForward = message.ForwardFrom.UserName
 | 
				
			||||||
		if usernameForward == "" {
 | 
							if usernameForward == "" {
 | 
				
			||||||
			usernameForward = message.ForwardFrom.FirstName
 | 
								usernameForward = message.ForwardFrom.FirstName
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if usernameForward == "" {
 | 
						if usernameForward == "" {
 | 
				
			||||||
		usernameForward = unknownUser
 | 
							usernameForward = unknownUser
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rmsg.Text = "Forwarded from " + usernameForward + ": " + rmsg.Text
 | 
						rmsg.Text = "Forwarded from " + usernameForward + ": " + rmsg.Text
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// handleQuoting handles quoting of previous messages
 | 
					// handleQuoting handles quoting of previous messages
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ type Bxmpp struct {
 | 
				
			|||||||
	connected bool
 | 
						connected bool
 | 
				
			||||||
	sync.RWMutex
 | 
						sync.RWMutex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						avatarAvailability map[string]bool
 | 
				
			||||||
	avatarMap          map[string]string
 | 
						avatarMap          map[string]string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -31,6 +32,7 @@ func New(cfg *bridge.Config) bridge.Bridger {
 | 
				
			|||||||
	return &Bxmpp{
 | 
						return &Bxmpp{
 | 
				
			||||||
		Config:             cfg,
 | 
							Config:             cfg,
 | 
				
			||||||
		xmppMap:            make(map[string]string),
 | 
							xmppMap:            make(map[string]string),
 | 
				
			||||||
 | 
							avatarAvailability: make(map[string]bool),
 | 
				
			||||||
		avatarMap:          make(map[string]string),
 | 
							avatarMap:          make(map[string]string),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -70,12 +72,19 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
 | 
				
			|||||||
	if msg.Event == config.EventMsgDelete {
 | 
						if msg.Event == config.EventMsgDelete {
 | 
				
			||||||
		return "", nil
 | 
							return "", nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	b.Log.Debugf("=> Receiving %#v", msg)
 | 
						b.Log.Debugf("=> Receiving %#v", msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if msg.Event == config.EventAvatarDownload {
 | 
						if msg.Event == config.EventAvatarDownload {
 | 
				
			||||||
		return b.cacheAvatar(&msg), nil
 | 
							return b.cacheAvatar(&msg), nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Make a action /me of the message, prepend the username with it.
 | 
				
			||||||
 | 
						// https://xmpp.org/extensions/xep-0245.html
 | 
				
			||||||
 | 
						if msg.Event == config.EventUserAction {
 | 
				
			||||||
 | 
							msg.Username = "/me " + msg.Username
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Upload a file (in XMPP case send the upload URL because XMPP has no native upload support).
 | 
						// Upload a file (in XMPP case send the upload URL because XMPP has no native upload support).
 | 
				
			||||||
	if msg.Extra != nil {
 | 
						if msg.Extra != nil {
 | 
				
			||||||
		for _, rmsg := range helper.HandleExtra(&msg, b.General) {
 | 
							for _, rmsg := range helper.HandleExtra(&msg, b.General) {
 | 
				
			||||||
@@ -237,10 +246,14 @@ func (b *Bxmpp) handleXMPP() error {
 | 
				
			|||||||
					event = config.EventTopicChange
 | 
										event = config.EventTopicChange
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				avatar := getAvatar(b.avatarMap, v.Remote, b.General)
 | 
									available, sok := b.avatarAvailability[v.Remote]
 | 
				
			||||||
				if avatar == "" {
 | 
									avatar := ""
 | 
				
			||||||
 | 
									if !sok {
 | 
				
			||||||
					b.Log.Debugf("Requesting avatar data")
 | 
										b.Log.Debugf("Requesting avatar data")
 | 
				
			||||||
 | 
										b.avatarAvailability[v.Remote] = false
 | 
				
			||||||
					b.xc.AvatarRequestData(v.Remote)
 | 
										b.xc.AvatarRequestData(v.Remote)
 | 
				
			||||||
 | 
									} else if available {
 | 
				
			||||||
 | 
										avatar = getAvatar(b.avatarMap, v.Remote, b.General)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				msgID := v.ID
 | 
									msgID := v.ID
 | 
				
			||||||
@@ -271,6 +284,8 @@ func (b *Bxmpp) handleXMPP() error {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		case xmpp.AvatarData:
 | 
							case xmpp.AvatarData:
 | 
				
			||||||
			b.handleDownloadAvatar(v)
 | 
								b.handleDownloadAvatar(v)
 | 
				
			||||||
 | 
								b.avatarAvailability[v.From] = true
 | 
				
			||||||
 | 
								b.Log.Debugf("Avatar for %s is now available", v.From)
 | 
				
			||||||
		case xmpp.Presence:
 | 
							case xmpp.Presence:
 | 
				
			||||||
			// Do nothing.
 | 
								// Do nothing.
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								changelog.md
									
									
									
									
									
								
							@@ -1,3 +1,27 @@
 | 
				
			|||||||
 | 
					# v1.17.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Enhancements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- irc: Add StripMarkdown option (irc). (#1145)
 | 
				
			||||||
 | 
					- general: Increase debug logging with function,file and linenumber (#1147)
 | 
				
			||||||
 | 
					- general: Update Dockerfile so inotify works (#1148)
 | 
				
			||||||
 | 
					- matrix: Add an option to disable sending HTML to matrix. Fixes #1022 (#1135)
 | 
				
			||||||
 | 
					- xmpp: Implement xep-0245 (xmpp). Closes #1137 (#1144)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Bugfix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- discord: Fix #1120: replaceAction "_" crash (discord) (#1121)
 | 
				
			||||||
 | 
					- discord: Fix #1049: missing space before embeds (discord) (#1124)
 | 
				
			||||||
 | 
					- discord: Fix webhook EventUserAction messages being skipped (discord) (#1133)
 | 
				
			||||||
 | 
					- matrix: Avoid creating invalid url when the user doesn't have an avatar (matrix) (#1130)
 | 
				
			||||||
 | 
					- msteams: Ignore non-user messages (msteams). Fixes #1141 (#1149)
 | 
				
			||||||
 | 
					- slack: Do not use webhooks when token is configured (slack) (fixes #1123) (#1134)
 | 
				
			||||||
 | 
					- telegram: Fix forward from hidden users (telegram). Closes #1131 (#1143)
 | 
				
			||||||
 | 
					- xmpp: Prevent re-requesting avatar data (xmpp) (#1117)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This release couldn't exist without the following contributors:
 | 
				
			||||||
 | 
					@qaisjp, @xnaas, @42wim, @Polynomdivision, @tfve
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# v1.17.4
 | 
					# v1.17.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Bugfix
 | 
					## Bugfix
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										33
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								go.mod
									
									
									
									
									
								
							@@ -6,20 +6,20 @@ require (
 | 
				
			|||||||
	github.com/Jeffail/gabs v1.1.1 // indirect
 | 
						github.com/Jeffail/gabs v1.1.1 // indirect
 | 
				
			||||||
	github.com/Philipp15b/go-steam v1.0.1-0.20190816133340-b04c5a83c1c0
 | 
						github.com/Philipp15b/go-steam v1.0.1-0.20190816133340-b04c5a83c1c0
 | 
				
			||||||
	github.com/Rhymen/go-whatsapp v0.1.1-0.20200421062035-31e8111ac334
 | 
						github.com/Rhymen/go-whatsapp v0.1.1-0.20200421062035-31e8111ac334
 | 
				
			||||||
	github.com/d5/tengo/v2 v2.1.2
 | 
						github.com/d5/tengo/v2 v2.4.2
 | 
				
			||||||
	github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec
 | 
						github.com/davecgh/go-spew v1.1.1
 | 
				
			||||||
	github.com/fsnotify/fsnotify v1.4.7
 | 
						github.com/fsnotify/fsnotify v1.4.9
 | 
				
			||||||
	github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible
 | 
						github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible
 | 
				
			||||||
	github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497
 | 
						github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497
 | 
				
			||||||
	github.com/google/gops v0.3.6
 | 
						github.com/google/gops v0.3.6
 | 
				
			||||||
	github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 // indirect
 | 
						github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 // indirect
 | 
				
			||||||
	github.com/gorilla/schema v1.1.0
 | 
						github.com/gorilla/schema v1.1.0
 | 
				
			||||||
	github.com/gorilla/websocket v1.4.1
 | 
						github.com/gorilla/websocket v1.4.2
 | 
				
			||||||
	github.com/hashicorp/golang-lru v0.5.3
 | 
						github.com/hashicorp/golang-lru v0.5.4
 | 
				
			||||||
	github.com/hpcloud/tail v1.0.0 // indirect
 | 
						github.com/hpcloud/tail v1.0.0 // indirect
 | 
				
			||||||
	github.com/jpillora/backoff v1.0.0
 | 
						github.com/jpillora/backoff v1.0.0
 | 
				
			||||||
	github.com/keybase/go-keybase-chat-bot v0.0.0-20200226211841-4e48f3eaef3e
 | 
						github.com/keybase/go-keybase-chat-bot v0.0.0-20200505163032-5cacf52379da
 | 
				
			||||||
	github.com/labstack/echo/v4 v4.1.13
 | 
						github.com/labstack/echo/v4 v4.1.16
 | 
				
			||||||
	github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7
 | 
						github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7
 | 
				
			||||||
	github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20200411204219-d5c18ce75048
 | 
						github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20200411204219-d5c18ce75048
 | 
				
			||||||
	github.com/matterbridge/discordgo v0.18.1-0.20200308151012-aa40f01cbcc3
 | 
						github.com/matterbridge/discordgo v0.18.1-0.20200308151012-aa40f01cbcc3
 | 
				
			||||||
@@ -27,11 +27,11 @@ require (
 | 
				
			|||||||
	github.com/matterbridge/go-xmpp v0.0.0-20200418225040-c8a3a57b4050
 | 
						github.com/matterbridge/go-xmpp v0.0.0-20200418225040-c8a3a57b4050
 | 
				
			||||||
	github.com/matterbridge/gomatrix v0.0.0-20200209224845-c2104d7936a6
 | 
						github.com/matterbridge/gomatrix v0.0.0-20200209224845-c2104d7936a6
 | 
				
			||||||
	github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18
 | 
						github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18
 | 
				
			||||||
	github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61
 | 
						github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba
 | 
				
			||||||
	github.com/mattermost/mattermost-server v5.5.0+incompatible
 | 
						github.com/mattermost/mattermost-server v5.5.0+incompatible
 | 
				
			||||||
	github.com/mattn/go-runewidth v0.0.7 // indirect
 | 
						github.com/mattn/godown v0.0.0-20200217152941-afc959f6a561
 | 
				
			||||||
	github.com/mattn/godown v0.0.0-20180312012330-2e9e17e0ea51
 | 
					 | 
				
			||||||
	github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
 | 
						github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
 | 
				
			||||||
 | 
						github.com/missdeer/golib v1.0.3
 | 
				
			||||||
	github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474 // indirect
 | 
						github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474 // indirect
 | 
				
			||||||
	github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff // indirect
 | 
						github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff // indirect
 | 
				
			||||||
	github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9
 | 
						github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9
 | 
				
			||||||
@@ -44,15 +44,16 @@ require (
 | 
				
			|||||||
	github.com/russross/blackfriday v1.5.2
 | 
						github.com/russross/blackfriday v1.5.2
 | 
				
			||||||
	github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca
 | 
						github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca
 | 
				
			||||||
	github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98
 | 
						github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98
 | 
				
			||||||
	github.com/sirupsen/logrus v1.4.2
 | 
						github.com/sirupsen/logrus v1.6.0
 | 
				
			||||||
	github.com/slack-go/slack v0.6.3
 | 
						github.com/slack-go/slack v0.6.4
 | 
				
			||||||
	github.com/spf13/viper v1.6.1
 | 
						github.com/spf13/viper v1.7.0
 | 
				
			||||||
	github.com/stretchr/testify v1.4.0
 | 
						github.com/stretchr/testify v1.5.1
 | 
				
			||||||
	github.com/technoweenie/multipartstreamer v1.0.1 // indirect
 | 
						github.com/technoweenie/multipartstreamer v1.0.1 // indirect
 | 
				
			||||||
 | 
						github.com/writeas/go-strip-markdown v2.0.1+incompatible
 | 
				
			||||||
	github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
 | 
						github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
 | 
				
			||||||
	github.com/yaegashi/msgraph.go v0.1.2
 | 
						github.com/yaegashi/msgraph.go v0.1.2
 | 
				
			||||||
	github.com/zfjagann/golang-ring v0.0.0-20190106091943-a88bb6aef447
 | 
						github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2
 | 
				
			||||||
	golang.org/x/image v0.0.0-20191214001246-9130b4cfad52
 | 
						golang.org/x/image v0.0.0-20200430140353-33d19683fad8
 | 
				
			||||||
	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
 | 
						golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
 | 
				
			||||||
	gopkg.in/fsnotify.v1 v1.4.7 // indirect
 | 
						gopkg.in/fsnotify.v1 v1.4.7 // indirect
 | 
				
			||||||
	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
 | 
						gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										250
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										250
									
								
								go.sum
									
									
									
									
									
								
							@@ -1,11 +1,23 @@
 | 
				
			|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
				
			||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
				
			||||||
 | 
					cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 | 
				
			||||||
 | 
					cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
 | 
				
			||||||
 | 
					cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
 | 
				
			||||||
 | 
					cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 | 
				
			||||||
 | 
					cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
 | 
				
			||||||
 | 
					cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 | 
				
			||||||
 | 
					cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
 | 
				
			||||||
 | 
					cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 | 
				
			||||||
 | 
					cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 | 
				
			||||||
 | 
					cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 | 
				
			||||||
 | 
					dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
				
			||||||
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557 h1:IZtuWGfzQnKnCSu+vl8WGLhpVQ5Uvy3rlSwqXSg+sQg=
 | 
					github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557 h1:IZtuWGfzQnKnCSu+vl8WGLhpVQ5Uvy3rlSwqXSg+sQg=
 | 
				
			||||||
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557/go.mod h1:jL0YSXMs/txjtGJ4PWrmETOk6KUHMDPMshgQZlTeB3Y=
 | 
					github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557/go.mod h1:jL0YSXMs/txjtGJ4PWrmETOk6KUHMDPMshgQZlTeB3Y=
 | 
				
			||||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
 | 
					github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
 | 
				
			||||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
 | 
					github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
					github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
 | 
					github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
				
			||||||
github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E=
 | 
					github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E=
 | 
				
			||||||
github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
 | 
					github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
 | 
				
			||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
					github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
				
			||||||
@@ -23,29 +35,35 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
 | 
				
			|||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
					github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
				
			||||||
github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58 h1:MkpmYfld/S8kXqTYI68DfL8/hHXjHogL120Dy00TIxc=
 | 
					github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58 h1:MkpmYfld/S8kXqTYI68DfL8/hHXjHogL120Dy00TIxc=
 | 
				
			||||||
github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58/go.mod h1:YNfsMyWSs+h+PaYkxGeMVmVCX75Zj/pqdjbu12ciCYE=
 | 
					github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58/go.mod h1:YNfsMyWSs+h+PaYkxGeMVmVCX75Zj/pqdjbu12ciCYE=
 | 
				
			||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
					github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
				
			||||||
 | 
					github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
				
			||||||
 | 
					github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
				
			||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
					github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
				
			||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
					github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
				
			||||||
 | 
					github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 | 
				
			||||||
 | 
					github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
 | 
				
			||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
					github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
				
			||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
					github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
				
			||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 | 
					github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 | 
				
			||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
					github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
				
			||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
					github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
				
			||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
					github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
				
			||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
					github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
				
			||||||
github.com/d5/tengo/v2 v2.1.2 h1:JR5O6qJW2GW9lpv/MfEqK16a/Wpp2y8I0JZZ5fqNOL0=
 | 
					github.com/d5/tengo/v2 v2.4.2 h1:Sj+v0CS8jtrZrXyJLzWof6QTnE6S5k3tYP0y6YVPGkw=
 | 
				
			||||||
github.com/d5/tengo/v2 v2.1.2/go.mod h1:XRGjEs5I9jYIKTxly6HCF8oiiilk5E/RYXOZ5b0DZC8=
 | 
					github.com/d5/tengo/v2 v2.4.2/go.mod h1:XRGjEs5I9jYIKTxly6HCF8oiiilk5E/RYXOZ5b0DZC8=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec h1:JEUiu7P9smN7zgX87a2zVnnbPPickIM9Gf9OIhsIgWQ=
 | 
					 | 
				
			||||||
github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec/go.mod h1:UGa5M2Sz/Uh13AMse4+RELKCDw7kqgqlTjeGae+7vUY=
 | 
					 | 
				
			||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 | 
					github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 | 
				
			||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
					github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
				
			||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
					github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
				
			||||||
 | 
					github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
					github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
					github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
				
			||||||
 | 
					github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 | 
				
			||||||
 | 
					github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 | 
				
			||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
					github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
				
			||||||
 | 
					github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 | 
				
			||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
					github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
					github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
					github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
				
			||||||
@@ -60,17 +78,29 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV
 | 
				
			|||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
					github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
				
			||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
					github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
				
			||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
					github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
				
			||||||
 | 
					github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
				
			||||||
 | 
					github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
 | 
				
			||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
 | 
					github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
 | 
				
			||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 | 
					github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 | 
				
			||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497 h1:wJkj+x9gPYlDyM34C6r3SXPs270coWeh85wu1CsusDo=
 | 
					github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497 h1:wJkj+x9gPYlDyM34C6r3SXPs270coWeh85wu1CsusDo=
 | 
				
			||||||
github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
 | 
					github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
 | 
				
			||||||
 | 
					github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
				
			||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
					github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
				
			||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
					github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/google/gops v0.3.6 h1:6akvbMlpZrEYOuoebn2kR+ZJekbZqJ28fJXTs84+8to=
 | 
					github.com/google/gops v0.3.6 h1:6akvbMlpZrEYOuoebn2kR+ZJekbZqJ28fJXTs84+8to=
 | 
				
			||||||
github.com/google/gops v0.3.6/go.mod h1:RZ1rH95wsAGX4vMWKmqBOIWynmWisBf4QFdgT/k/xOI=
 | 
					github.com/google/gops v0.3.6/go.mod h1:RZ1rH95wsAGX4vMWKmqBOIWynmWisBf4QFdgT/k/xOI=
 | 
				
			||||||
 | 
					github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 | 
				
			||||||
 | 
					github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 | 
				
			||||||
 | 
					github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 | 
				
			||||||
 | 
					github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 | 
				
			||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
				
			||||||
 | 
					github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
				
			||||||
github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 h1:4EZlYQIiyecYJlUbVkFXCXHz1QPhVXcHnQKAzBTPfQo=
 | 
					github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 h1:4EZlYQIiyecYJlUbVkFXCXHz1QPhVXcHnQKAzBTPfQo=
 | 
				
			||||||
github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4/go.mod h1:lEO7XoHJ/xNRBCxrn4h/CEB67h0kW1B0t4ooP2yrjUA=
 | 
					github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4/go.mod h1:lEO7XoHJ/xNRBCxrn4h/CEB67h0kW1B0t4ooP2yrjUA=
 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 | 
					github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 | 
				
			||||||
@@ -81,13 +111,34 @@ github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA
 | 
				
			|||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
					github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
				
			||||||
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
 | 
					github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
 | 
				
			||||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
					github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
				
			||||||
 | 
					github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
 | 
				
			||||||
 | 
					github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
					github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
					github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
				
			||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
					github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
 | 
					github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
					github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
 | 
				
			||||||
 | 
					github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
				
			||||||
 | 
					github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 | 
				
			||||||
 | 
					github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
				
			||||||
 | 
					github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
				
			||||||
 | 
					github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
 | 
				
			||||||
 | 
					github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
					github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
					github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
				
			||||||
 | 
					github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 | 
				
			||||||
 | 
					github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 | 
				
			||||||
 | 
					github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 | 
				
			||||||
 | 
					github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 | 
				
			||||||
github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
 | 
					github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
 | 
				
			||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
					github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
				
			||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
					github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
				
			||||||
@@ -95,29 +146,31 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS
 | 
				
			|||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
					github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
				
			||||||
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
 | 
					github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
 | 
				
			||||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 | 
					github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 | 
				
			||||||
 | 
					github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
				
			||||||
 | 
					github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 | 
				
			||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 | 
					github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 | 
				
			||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
					github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
				
			||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
					github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
				
			||||||
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro=
 | 
					github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro=
 | 
				
			||||||
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
 | 
					github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
 | 
				
			||||||
github.com/keybase/go-keybase-chat-bot v0.0.0-20200226211841-4e48f3eaef3e h1:KbPTfR/PYuau1IzKoE4lnd8yby5I2pBj+VR6fSVbYU8=
 | 
					github.com/keybase/go-keybase-chat-bot v0.0.0-20200505163032-5cacf52379da h1:LK+8uBG3kNikj664cjFt88RBmuGmonxkXv2rUVfbqz4=
 | 
				
			||||||
github.com/keybase/go-keybase-chat-bot v0.0.0-20200226211841-4e48f3eaef3e/go.mod h1:vNc28YFzigVJod0j5EbuTtRIe7swx8vodh2yA4jZ2s8=
 | 
					github.com/keybase/go-keybase-chat-bot v0.0.0-20200505163032-5cacf52379da/go.mod h1:xJA+X9ZVyT/irGldcb7q1XnJBq5F9s5H9h2L44Y+poY=
 | 
				
			||||||
github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999 h1:2d+FLQbz4xRTi36DO1qYNUwfORax9XcQ0jhbO81Vago=
 | 
					github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999 h1:2d+FLQbz4xRTi36DO1qYNUwfORax9XcQ0jhbO81Vago=
 | 
				
			||||||
github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ=
 | 
					github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ=
 | 
				
			||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
					github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
				
			||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
					github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
					github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
				
			||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
					github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
					github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
				
			||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
					github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
				
			||||||
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
 | 
					github.com/labstack/echo/v4 v4.1.16 h1:8swiwjE5Jkai3RPfZoahp8kjVCRNq+y7Q0hPji2Kz0o=
 | 
				
			||||||
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
 | 
					github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI=
 | 
				
			||||||
github.com/labstack/echo/v4 v4.1.13 h1:JYgKq6NQQSaKbQcsOadAKX1kUVLCUzLGwu8sxN5tC34=
 | 
					 | 
				
			||||||
github.com/labstack/echo/v4 v4.1.13/go.mod h1:3WZNypykZ3tnqpF2Qb4fPg27XDunFqgP3HGDmCMgv7U=
 | 
					 | 
				
			||||||
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
 | 
					github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
 | 
				
			||||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
 | 
					github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
 | 
				
			||||||
github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7 h1:BS9tqL0OCiOGuy/CYYk2gc33fxqaqh5/rhqMKu4tcYA=
 | 
					github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7 h1:BS9tqL0OCiOGuy/CYYk2gc33fxqaqh5/rhqMKu4tcYA=
 | 
				
			||||||
@@ -136,28 +189,41 @@ github.com/matterbridge/gomatrix v0.0.0-20200209224845-c2104d7936a6 h1:Kl65VJv38
 | 
				
			|||||||
github.com/matterbridge/gomatrix v0.0.0-20200209224845-c2104d7936a6/go.mod h1:+jWeaaUtXQbBRdKYWfjW6JDDYiI2XXE+3NnTjW5kg8g=
 | 
					github.com/matterbridge/gomatrix v0.0.0-20200209224845-c2104d7936a6/go.mod h1:+jWeaaUtXQbBRdKYWfjW6JDDYiI2XXE+3NnTjW5kg8g=
 | 
				
			||||||
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18 h1:fLhwXtWGtfTgZVxHG1lcKjv+re7dRwyyuYFNu69xdho=
 | 
					github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18 h1:fLhwXtWGtfTgZVxHG1lcKjv+re7dRwyyuYFNu69xdho=
 | 
				
			||||||
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA=
 | 
					github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA=
 | 
				
			||||||
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61 h1:R/MgM/eUyRBQx2FiH6JVmXck8PaAuKfe2M1tWIzW7nE=
 | 
					github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba h1:XleOY4IjAEIcxAh+IFwT5JT5Ze3RHiYz6m+4ZfZ0rc0=
 | 
				
			||||||
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61/go.mod h1:iXGEotOvwI1R1SjLxRc+BF5rUORTMtE0iMZBT2lxqAU=
 | 
					github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba/go.mod h1:iXGEotOvwI1R1SjLxRc+BF5rUORTMtE0iMZBT2lxqAU=
 | 
				
			||||||
github.com/mattermost/mattermost-server v5.5.0+incompatible h1:0wcLGgYtd+YImtLDPf2AOfpBHxbU4suATx+6XKw1XbU=
 | 
					github.com/mattermost/mattermost-server v5.5.0+incompatible h1:0wcLGgYtd+YImtLDPf2AOfpBHxbU4suATx+6XKw1XbU=
 | 
				
			||||||
github.com/mattermost/mattermost-server v5.5.0+incompatible/go.mod h1:5L6MjAec+XXQwMIt791Ganu45GKsSiM+I0tLR9wUj8Y=
 | 
					github.com/mattermost/mattermost-server v5.5.0+incompatible/go.mod h1:5L6MjAec+XXQwMIt791Ganu45GKsSiM+I0tLR9wUj8Y=
 | 
				
			||||||
 | 
					github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 | 
					github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
					github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
 | 
					github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
					github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
				
			||||||
 | 
					github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
				
			||||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
					github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
				
			||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
					github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
				
			||||||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
 | 
					github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
 | 
				
			||||||
github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM=
 | 
					github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
 | 
				
			||||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
 | 
					github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 | 
				
			||||||
github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54=
 | 
					github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0=
 | 
				
			||||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
					github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
				
			||||||
github.com/mattn/godown v0.0.0-20180312012330-2e9e17e0ea51 h1:MpI7hy3MiCnrggmZI/s8LaPbLVOOWpzDbjA4F+XaXaM=
 | 
					github.com/mattn/godown v0.0.0-20200217152941-afc959f6a561 h1:0YGo77enc6tJpXQxUeQWs9bPIQPTH1lbOmc5tgRuq4o=
 | 
				
			||||||
github.com/mattn/godown v0.0.0-20180312012330-2e9e17e0ea51/go.mod h1:s3KUdOIXJ+jaGM++XHiXA6gikdleaWVATCcQGD4h734=
 | 
					github.com/mattn/godown v0.0.0-20200217152941-afc959f6a561/go.mod h1:/ivCKurgV/bx6yqtP/Jtc2Xmrv3beCYBvlfAUl4X5g4=
 | 
				
			||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
					github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
				
			||||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
 | 
					github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
 | 
				
			||||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 | 
					github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 | 
				
			||||||
 | 
					github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
				
			||||||
 | 
					github.com/missdeer/golib v1.0.3 h1:+kz/tn1lXlPS8i+gjHHVAZC8YcgrmfiMTqELyvOwI4g=
 | 
				
			||||||
 | 
					github.com/missdeer/golib v1.0.3/go.mod h1:Cys1ITPPZxIk2eTcQcKT3jDsBdhICAfrrw+ki/eRXxA=
 | 
				
			||||||
 | 
					github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 | 
				
			||||||
 | 
					github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
				
			||||||
 | 
					github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
 | 
				
			||||||
 | 
					github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
 | 
				
			||||||
 | 
					github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 | 
				
			||||||
 | 
					github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
					github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
 | 
					github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
				
			||||||
 | 
					github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
				
			||||||
github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474 h1:oKIteTqeSpenyTrOVj5zkiyCaflLa8B+CD0324otT+o=
 | 
					github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474 h1:oKIteTqeSpenyTrOVj5zkiyCaflLa8B+CD0324otT+o=
 | 
				
			||||||
github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
 | 
					github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
 | 
				
			||||||
github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff h1:HLGD5/9UxxfEuO9DtP8gnTmNtMxbPyhYltfxsITel8g=
 | 
					github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff h1:HLGD5/9UxxfEuO9DtP8gnTmNtMxbPyhYltfxsITel8g=
 | 
				
			||||||
@@ -167,13 +233,12 @@ github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9 h1:mp6tU1r0xLostUGL
 | 
				
			|||||||
github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9/go.mod h1:A5SRAcpTemjGgIuBq6Kic2yHcoeUFWUinOAlMP/i9xo=
 | 
					github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9/go.mod h1:A5SRAcpTemjGgIuBq6Kic2yHcoeUFWUinOAlMP/i9xo=
 | 
				
			||||||
github.com/nicksnyder/go-i18n v1.4.0 h1:AgLl+Yq7kg5OYlzCgu9cKTZOyI4tD/NgukKqLqC8E+I=
 | 
					github.com/nicksnyder/go-i18n v1.4.0 h1:AgLl+Yq7kg5OYlzCgu9cKTZOyI4tD/NgukKqLqC8E+I=
 | 
				
			||||||
github.com/nicksnyder/go-i18n v1.4.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q=
 | 
					github.com/nicksnyder/go-i18n v1.4.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q=
 | 
				
			||||||
github.com/nlopes/slack v0.6.0 h1:jt0jxVQGhssx1Ib7naAOZEZcGdtIhTzkP0nopK0AsRA=
 | 
					 | 
				
			||||||
github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk=
 | 
					 | 
				
			||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 | 
					github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 | 
				
			||||||
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
 | 
					github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
 | 
				
			||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/gomega v1.4.1 h1:PZSj/UFNaVp3KxrzHOcS7oyuWA7LoOY/77yCTEFu21U=
 | 
					github.com/onsi/gomega v1.4.1 h1:PZSj/UFNaVp3KxrzHOcS7oyuWA7LoOY/77yCTEFu21U=
 | 
				
			||||||
github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 | 
					github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 | 
				
			||||||
 | 
					github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 | 
				
			||||||
github.com/paulrosania/go-charset v0.0.0-20190326053356-55c9d7a5834c h1:P6XGcuPTigoHf4TSu+3D/7QOQ1MbL6alNwrGhcW7sKw=
 | 
					github.com/paulrosania/go-charset v0.0.0-20190326053356-55c9d7a5834c h1:P6XGcuPTigoHf4TSu+3D/7QOQ1MbL6alNwrGhcW7sKw=
 | 
				
			||||||
github.com/paulrosania/go-charset v0.0.0-20190326053356-55c9d7a5834c/go.mod h1:YnNlZP7l4MhyGQ4CBRwv6ohZTPrUJJZtEv4ZgADkbs4=
 | 
					github.com/paulrosania/go-charset v0.0.0-20190326053356-55c9d7a5834c/go.mod h1:YnNlZP7l4MhyGQ4CBRwv6ohZTPrUJJZtEv4ZgADkbs4=
 | 
				
			||||||
github.com/pborman/uuid v0.0.0-20160216163710-c55201b03606 h1:/CPgDYrfeK2LMK6xcUhvI17yO9SlpAdDIJGkhDEgO8A=
 | 
					github.com/pborman/uuid v0.0.0-20160216163710-c55201b03606 h1:/CPgDYrfeK2LMK6xcUhvI17yO9SlpAdDIJGkhDEgO8A=
 | 
				
			||||||
@@ -185,6 +250,7 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 | 
				
			|||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
					github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
 | 
					github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 | 
				
			||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
					github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
				
			||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 | 
					github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
					github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
				
			||||||
@@ -199,12 +265,15 @@ github.com/rickb777/date v1.12.4/go.mod h1:xP0eo/I5qmUt97yRGClHZfyLZ3ikMw6v6SU5M
 | 
				
			|||||||
github.com/rickb777/plural v1.2.0 h1:5tvEc7UBCZ7l8h/2UeybSkt/uu1DQsZFOFdNevmUhlE=
 | 
					github.com/rickb777/plural v1.2.0 h1:5tvEc7UBCZ7l8h/2UeybSkt/uu1DQsZFOFdNevmUhlE=
 | 
				
			||||||
github.com/rickb777/plural v1.2.0/go.mod h1:UdpyWFCGbo3mvK3f/PfZOAOrkjzJlYN/sD46XNWJ+Es=
 | 
					github.com/rickb777/plural v1.2.0/go.mod h1:UdpyWFCGbo3mvK3f/PfZOAOrkjzJlYN/sD46XNWJ+Es=
 | 
				
			||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
					github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
				
			||||||
 | 
					github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
				
			||||||
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
 | 
					github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
 | 
				
			||||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
					github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
				
			||||||
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
 | 
					github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
 | 
				
			||||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
					github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
				
			||||||
 | 
					github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 | 
				
			||||||
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
 | 
					github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
 | 
				
			||||||
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
 | 
					github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
 | 
				
			||||||
 | 
					github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
				
			||||||
github.com/shazow/rateio v0.0.0-20150116013248-e8e00881e5c1 h1:Lx3BlDGFElJt4u/zKc9A3BuGYbQAGlEFyPuUA3jeMD0=
 | 
					github.com/shazow/rateio v0.0.0-20150116013248-e8e00881e5c1 h1:Lx3BlDGFElJt4u/zKc9A3BuGYbQAGlEFyPuUA3jeMD0=
 | 
				
			||||||
github.com/shazow/rateio v0.0.0-20150116013248-e8e00881e5c1/go.mod h1:vt2jWY/3Qw1bIzle5thrJWucsLuuX9iUNnp20CqCciI=
 | 
					github.com/shazow/rateio v0.0.0-20150116013248-e8e00881e5c1/go.mod h1:vt2jWY/3Qw1bIzle5thrJWucsLuuX9iUNnp20CqCciI=
 | 
				
			||||||
github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98 h1:sN07ff+PSRsUNhpSod4uGKAQ+Nc0FXsBPG9FmYMNg4w=
 | 
					github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98 h1:sN07ff+PSRsUNhpSod4uGKAQ+Nc0FXsBPG9FmYMNg4w=
 | 
				
			||||||
@@ -212,12 +281,12 @@ github.com/shazow/ssh-chat v1.8.3-0.20200308224626-80ddf1f43a98/go.mod h1:xkTgfD
 | 
				
			|||||||
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 | 
					github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 | 
				
			||||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 | 
					github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 | 
				
			||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
					github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
 | 
					github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
					github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
				
			||||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 h1:lpEzuenPuO1XNTeikEmvqYFcU37GVLl8SRNblzyvGBE=
 | 
					github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 h1:lpEzuenPuO1XNTeikEmvqYFcU37GVLl8SRNblzyvGBE=
 | 
				
			||||||
github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo=
 | 
					github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo=
 | 
				
			||||||
github.com/slack-go/slack v0.6.3 h1:qU037g8gQ71EuH6S9zYKnvYrEUj0fLFH4HFekFqBoRU=
 | 
					github.com/slack-go/slack v0.6.4 h1:cxOqFgM5RW6mdEyDqAJutFk3qiORK9oHRKi5bPqkY9o=
 | 
				
			||||||
github.com/slack-go/slack v0.6.3/go.mod h1:HE4RwNe7YpOg/F0vqo5PwXH3Hki31TplTvKRW9dGGaw=
 | 
					github.com/slack-go/slack v0.6.4/go.mod h1:sGRjv3w+ERAUMMMbldHObQPBcNSyVB7KLKYfnwUFBfw=
 | 
				
			||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
 | 
					github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
 | 
				
			||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
					github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
				
			||||||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 | 
					github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 | 
				
			||||||
@@ -232,34 +301,39 @@ github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9
 | 
				
			|||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
					github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
				
			||||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 | 
					github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 | 
				
			||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/spf13/viper v1.6.1 h1:VPZzIkznI1YhVMRi6vNFLHSwhnhReBfgTxIPccpfdZk=
 | 
					github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
 | 
				
			||||||
github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
 | 
					github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
					github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
					github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
				
			||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
					github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
				
			||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
					github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
				
			||||||
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
 | 
					github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
 | 
				
			||||||
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
 | 
					github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
 | 
				
			||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
				
			||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
					 | 
				
			||||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 | 
					github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 | 
				
			||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 | 
					github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 | 
				
			||||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 | 
					github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 | 
				
			||||||
github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4=
 | 
					github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4=
 | 
				
			||||||
github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 | 
					github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 | 
				
			||||||
 | 
					github.com/writeas/go-strip-markdown v2.0.1+incompatible h1:IIqxTM5Jr7RzhigcL6FkrCNfXkvbR+Nbu1ls48pXYcw=
 | 
				
			||||||
 | 
					github.com/writeas/go-strip-markdown v2.0.1+incompatible/go.mod h1:Rsyu10ZhbEK9pXdk8V6MVnZmTzRG0alMNLMwa0J01fE=
 | 
				
			||||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
 | 
					github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
 | 
				
			||||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
 | 
					github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
 | 
				
			||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
					github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
				
			||||||
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
 | 
					github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
 | 
				
			||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
					 | 
				
			||||||
github.com/yaegashi/msgraph.go v0.1.2 h1:83uVRQaj8YBsVqOUGj0WRwzxdgGF69jRpg5IQYaTvoY=
 | 
					github.com/yaegashi/msgraph.go v0.1.2 h1:83uVRQaj8YBsVqOUGj0WRwzxdgGF69jRpg5IQYaTvoY=
 | 
				
			||||||
github.com/yaegashi/msgraph.go v0.1.2/go.mod h1:Lp39e9oo596G5FcmMKI0cXR3mg/QikSdabgZdbMqbAM=
 | 
					github.com/yaegashi/msgraph.go v0.1.2/go.mod h1:Lp39e9oo596G5FcmMKI0cXR3mg/QikSdabgZdbMqbAM=
 | 
				
			||||||
github.com/zfjagann/golang-ring v0.0.0-20190106091943-a88bb6aef447 h1:CHgPZh8bFkZmislPrr/0gd7MciDAX+JJB70A2/5Lvmo=
 | 
					github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2 h1:UQwvu7FjUEdVYofx0U6bsc5odNE7wa5TSA0fl559GcA=
 | 
				
			||||||
github.com/zfjagann/golang-ring v0.0.0-20190106091943-a88bb6aef447/go.mod h1:0MsIttMJIF/8Y7x0XjonJP7K99t3sR6bjj4m5S4JmqU=
 | 
					github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2/go.mod h1:0MsIttMJIF/8Y7x0XjonJP7K99t3sR6bjj4m5S4JmqU=
 | 
				
			||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
					go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
				
			||||||
 | 
					go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
				
			||||||
 | 
					go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
				
			||||||
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
 | 
					go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
 | 
				
			||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
					go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
				
			||||||
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
 | 
					go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
 | 
				
			||||||
@@ -268,67 +342,141 @@ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
 | 
				
			|||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
					go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
				
			||||||
golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ=
 | 
					golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 h1:sKJQZMuxjOAR/Uo2LBfU90onWEf1dF4C+0hPJCc9Mpc=
 | 
					golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
					golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/image v0.0.0-20191214001246-9130b4cfad52 h1:2fktqPPvDiVEEVT/vSTeoUPXfmRxRaGy6GU8jypvEn0=
 | 
					golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d h1:1ZiEyfaQIg3Qh0EoqpwAakHVhecoE5wlSg5GjnafJGw=
 | 
				
			||||||
golang.org/x/image v0.0.0-20191214001246-9130b4cfad52/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
					golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
				
			||||||
 | 
					golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
				
			||||||
 | 
					golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
				
			||||||
 | 
					golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 | 
				
			||||||
 | 
					golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
 | 
				
			||||||
 | 
					golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
 | 
				
			||||||
 | 
					golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 | 
				
			||||||
 | 
					golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
				
			||||||
 | 
					golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw=
 | 
				
			||||||
 | 
					golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
					golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
				
			||||||
 | 
					golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
				
			||||||
 | 
					golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
				
			||||||
 | 
					golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
				
			||||||
 | 
					golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
				
			||||||
 | 
					golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
				
			||||||
 | 
					golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 | 
				
			||||||
 | 
					golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 | 
				
			||||||
 | 
					golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 | 
				
			||||||
 | 
					golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 | 
				
			||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
					golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8=
 | 
					golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
				
			||||||
 | 
					golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
 | 
					golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
 | 
					golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20171017063910-8dbc5d05d6ed/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20171017063910-8dbc5d05d6ed/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM=
 | 
					golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
 | 
					golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
				
			||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
					golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
 | 
					golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
 | 
					google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 | 
				
			||||||
 | 
					google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 | 
				
			||||||
 | 
					google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
				
			||||||
 | 
					google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
				
			||||||
 | 
					google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 | 
				
			||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
					google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
				
			||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 | 
					google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 | 
				
			||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
 | 
					google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
 | 
					google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
 | 
				
			||||||
 | 
					google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
				
			||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
				
			||||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
					google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
				
			||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
					gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
				
			||||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 | 
					gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 | 
				
			||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
					gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
				
			||||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
 | 
					gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
 | 
				
			||||||
@@ -343,5 +491,11 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			|||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
					gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
 | 
					honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
 | 
					honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
 | 
					honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 | 
				
			||||||
 | 
					rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 | 
				
			||||||
rsc.io/goversion v1.0.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo=
 | 
					rsc.io/goversion v1.0.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import (
 | 
				
			|||||||
	"flag"
 | 
						"flag"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/42wim/matterbridge/bridge/config"
 | 
						"github.com/42wim/matterbridge/bridge/config"
 | 
				
			||||||
@@ -15,7 +16,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	version = "1.17.4"
 | 
						version = "1.17.5"
 | 
				
			||||||
	githash string
 | 
						githash string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	flagConfig  = flag.String("conf", "matterbridge.toml", "config file")
 | 
						flagConfig  = flag.String("conf", "matterbridge.toml", "config file")
 | 
				
			||||||
@@ -67,17 +68,31 @@ func setupLogger() *logrus.Logger {
 | 
				
			|||||||
		Formatter: &prefixed.TextFormatter{
 | 
							Formatter: &prefixed.TextFormatter{
 | 
				
			||||||
			PrefixPadding: 13,
 | 
								PrefixPadding: 13,
 | 
				
			||||||
			DisableColors: true,
 | 
								DisableColors: true,
 | 
				
			||||||
			FullTimestamp: true,
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Level: logrus.InfoLevel,
 | 
							Level: logrus.InfoLevel,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if *flagDebug || os.Getenv("DEBUG") == "1" {
 | 
						if *flagDebug || os.Getenv("DEBUG") == "1" {
 | 
				
			||||||
 | 
							logger.SetReportCaller(true)
 | 
				
			||||||
		logger.Formatter = &prefixed.TextFormatter{
 | 
							logger.Formatter = &prefixed.TextFormatter{
 | 
				
			||||||
			PrefixPadding: 13,
 | 
								PrefixPadding: 13,
 | 
				
			||||||
			DisableColors: true,
 | 
								DisableColors: true,
 | 
				
			||||||
			FullTimestamp: false,
 | 
								FullTimestamp: false,
 | 
				
			||||||
			ForceFormatting: true,
 | 
					
 | 
				
			||||||
 | 
								CallerFormatter: func(function, file string) string {
 | 
				
			||||||
 | 
									return fmt.Sprintf(" [%s:%s]", function, file)
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								CallerPrettyfier: func(f *runtime.Frame) (string, string) {
 | 
				
			||||||
 | 
									sp := strings.SplitAfter(f.File, "/matterbridge/")
 | 
				
			||||||
 | 
									filename := f.File
 | 
				
			||||||
 | 
									if len(sp) > 1 {
 | 
				
			||||||
 | 
										filename = sp[1]
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									s := strings.Split(f.Function, ".")
 | 
				
			||||||
 | 
									funcName := s[len(s)-1]
 | 
				
			||||||
 | 
									return funcName, fmt.Sprintf("%s:%d", filename, f.Line)
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		logger.Level = logrus.DebugLevel
 | 
							logger.Level = logrus.DebugLevel
 | 
				
			||||||
		logger.WithFields(logrus.Fields{"prefix": "main"}).Info("Enabling debug logging.")
 | 
							logger.WithFields(logrus.Fields{"prefix": "main"}).Info("Enabling debug logging.")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -103,6 +103,10 @@ ColorNicks=false
 | 
				
			|||||||
#OPTIONAL (default empty)
 | 
					#OPTIONAL (default empty)
 | 
				
			||||||
RunCommands=["PRIVMSG user hello","PRIVMSG chanserv something"]
 | 
					RunCommands=["PRIVMSG user hello","PRIVMSG chanserv something"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#StripMarkdown strips markdown from messages
 | 
				
			||||||
 | 
					#OPTIONAL (default false)
 | 
				
			||||||
 | 
					StripMarkdown=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#Nicks you want to ignore.
 | 
					#Nicks you want to ignore.
 | 
				
			||||||
#Regular expressions supported
 | 
					#Regular expressions supported
 | 
				
			||||||
#Messages from those users will not be sent to other bridges.
 | 
					#Messages from those users will not be sent to other bridges.
 | 
				
			||||||
@@ -1209,6 +1213,11 @@ Password="yourpass"
 | 
				
			|||||||
#OPTIONAL (default false)
 | 
					#OPTIONAL (default false)
 | 
				
			||||||
NoHomeServerSuffix=false
 | 
					NoHomeServerSuffix=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Whether to disable sending of HTML content to matrix
 | 
				
			||||||
 | 
					#See https://github.com/42wim/matterbridge/issues/1022
 | 
				
			||||||
 | 
					#OPTIONAL (default false)
 | 
				
			||||||
 | 
					HTMLDisable=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## RELOADABLE SETTINGS
 | 
					## RELOADABLE SETTINGS
 | 
				
			||||||
## Settings below can be reloaded by editing the file
 | 
					## Settings below can be reloaded by editing the file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								vendor/github.com/d5/tengo/v2/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/d5/tengo/v2/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -6,6 +6,7 @@ lint:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
test: generate lint
 | 
					test: generate lint
 | 
				
			||||||
	go test -race -cover ./...
 | 
						go test -race -cover ./...
 | 
				
			||||||
 | 
						go run ./cmd/tengo -resolve ./testdata/cli/test.tengo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fmt:
 | 
					fmt:
 | 
				
			||||||
	go fmt ./...
 | 
						go fmt ./...
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										35
									
								
								vendor/github.com/d5/tengo/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/d5/tengo/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,8 +5,8 @@
 | 
				
			|||||||
# The Tengo Language
 | 
					# The Tengo Language
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://godoc.org/github.com/d5/tengo)
 | 
					[](https://godoc.org/github.com/d5/tengo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://goreportcard.com/report/github.com/d5/tengo)
 | 
					[](https://goreportcard.com/report/github.com/d5/tengo)
 | 
				
			||||||
[](https://circleci.com/gh/d5/tengo)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Tengo is a small, dynamic, fast, secure script language for Go.** 
 | 
					**Tengo is a small, dynamic, fast, secure script language for Go.** 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -51,19 +51,21 @@ fmt.println(sum("", [1, 2, 3]))  // "123"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Benchmark
 | 
					## Benchmark
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| | fib(35) | fibt(35) |  Type  |
 | 
					| | fib(35) | fibt(35) |  Language (Type)  |
 | 
				
			||||||
| :--- |    ---: |     ---: |  :---: |
 | 
					| :--- |    ---: |     ---: |  :---: |
 | 
				
			||||||
| Go | `48ms` | `3ms` | Go (native) |
 | 
					| [**Tengo**](https://github.com/d5/tengo) | `2,931ms` | `4ms` | Tengo (VM) |
 | 
				
			||||||
| [**Tengo**](https://github.com/d5/tengo) | `2,349ms` | `5ms` | VM on Go |
 | 
					| [go-lua](https://github.com/Shopify/go-lua) | `4,824ms` | `4ms` | Lua (VM) |
 | 
				
			||||||
| Lua | `1,416ms` | `3ms` | Lua (native) |
 | 
					| [GopherLua](https://github.com/yuin/gopher-lua) | `5,365ms` | `4ms` | Lua (VM) |
 | 
				
			||||||
| [go-lua](https://github.com/Shopify/go-lua) | `4,402ms` | `5ms` | Lua VM on Go |
 | 
					| [goja](https://github.com/dop251/goja) | `5,533ms` | `5ms` | JavaScript (VM) |
 | 
				
			||||||
| [GopherLua](https://github.com/yuin/gopher-lua) | `4,023ms` | `5ms` | Lua VM on Go |
 | 
					| [starlark-go](https://github.com/google/starlark-go) | `11,495ms` | `5ms` | Starlark (Interpreter) |
 | 
				
			||||||
| Python | `2,588ms` | `26ms` | Python (native) |
 | 
					| [Yaegi](https://github.com/containous/yaegi) | `15,645ms` | `12ms` | Yaegi (Interpreter) |
 | 
				
			||||||
| [starlark-go](https://github.com/google/starlark-go) | `11,126ms` | `6ms` | Python-like Interpreter on Go |
 | 
					| [gpython](https://github.com/go-python/gpython) | `16,322ms` | `5ms` | Python (Interpreter) |
 | 
				
			||||||
| [gpython](https://github.com/go-python/gpython) | `15,035ms` | `4ms` | Python Interpreter on Go |
 | 
					| [otto](https://github.com/robertkrimen/otto) | `73,093ms` | `10ms` | JavaScript (Interpreter) |
 | 
				
			||||||
| [goja](https://github.com/dop251/goja) | `5,089ms` | `5ms` | JS VM on Go |
 | 
					| [Anko](https://github.com/mattn/anko) | `79,809ms` | `8ms` | Anko (Interpreter) |
 | 
				
			||||||
| [otto](https://github.com/robertkrimen/otto) | `68,377ms` | `11ms` | JS Interpreter on Go |
 | 
					| - | - | - | - |
 | 
				
			||||||
| [Anko](https://github.com/mattn/anko) | `92,579ms` | `18ms` | Interpreter on Go |
 | 
					| Go | `53ms` | `3ms` | Go (Native) |
 | 
				
			||||||
 | 
					| Lua | `1,612ms` | `3ms` | Lua (Native) |
 | 
				
			||||||
 | 
					| Python | `2,632ms` | `23ms` | Python 2 (Native) |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_* [fib(35)](https://github.com/d5/tengobench/blob/master/code/fib.tengo):
 | 
					_* [fib(35)](https://github.com/d5/tengobench/blob/master/code/fib.tengo):
 | 
				
			||||||
Fibonacci(35)_  
 | 
					Fibonacci(35)_  
 | 
				
			||||||
@@ -136,3 +138,10 @@ each([a, b, c, d], func(x) {
 | 
				
			|||||||
- [Interoperability](https://github.com/d5/tengo/blob/master/docs/interoperability.md)
 | 
					- [Interoperability](https://github.com/d5/tengo/blob/master/docs/interoperability.md)
 | 
				
			||||||
- [Tengo CLI](https://github.com/d5/tengo/blob/master/docs/tengo-cli.md)
 | 
					- [Tengo CLI](https://github.com/d5/tengo/blob/master/docs/tengo-cli.md)
 | 
				
			||||||
- [Standard Library](https://github.com/d5/tengo/blob/master/docs/stdlib.md)
 | 
					- [Standard Library](https://github.com/d5/tengo/blob/master/docs/stdlib.md)
 | 
				
			||||||
 | 
					- Syntax Highlighters: [VSCode](https://github.com/lissein/vscode-tengo), [Atom](https://github.com/d5/tengo-atom)
 | 
				
			||||||
 | 
					- **Why the name Tengo?** It's from [1Q84](https://en.wikipedia.org/wiki/1Q84).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:hearts: Like writing Go code? Come work at Skool. [We're hiring!](https://jobs.lever.co/skool)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								vendor/github.com/d5/tengo/v2/bytecode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/d5/tengo/v2/bytecode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -97,6 +97,7 @@ func (b *Bytecode) RemoveDuplicates() {
 | 
				
			|||||||
	var deduped []Object
 | 
						var deduped []Object
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	indexMap := make(map[int]int) // mapping from old constant index to new index
 | 
						indexMap := make(map[int]int) // mapping from old constant index to new index
 | 
				
			||||||
 | 
						fns := make(map[*CompiledFunction]int)
 | 
				
			||||||
	ints := make(map[int64]int)
 | 
						ints := make(map[int64]int)
 | 
				
			||||||
	strings := make(map[string]int)
 | 
						strings := make(map[string]int)
 | 
				
			||||||
	floats := make(map[float64]int)
 | 
						floats := make(map[float64]int)
 | 
				
			||||||
@@ -106,9 +107,14 @@ func (b *Bytecode) RemoveDuplicates() {
 | 
				
			|||||||
	for curIdx, c := range b.Constants {
 | 
						for curIdx, c := range b.Constants {
 | 
				
			||||||
		switch c := c.(type) {
 | 
							switch c := c.(type) {
 | 
				
			||||||
		case *CompiledFunction:
 | 
							case *CompiledFunction:
 | 
				
			||||||
			// add to deduped list
 | 
								if newIdx, ok := fns[c]; ok {
 | 
				
			||||||
			indexMap[curIdx] = len(deduped)
 | 
									indexMap[curIdx] = newIdx
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									newIdx = len(deduped)
 | 
				
			||||||
 | 
									fns[c] = newIdx
 | 
				
			||||||
 | 
									indexMap[curIdx] = newIdx
 | 
				
			||||||
				deduped = append(deduped, c)
 | 
									deduped = append(deduped, c)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		case *ImmutableMap:
 | 
							case *ImmutableMap:
 | 
				
			||||||
			modName := inferModuleName(c)
 | 
								modName := inferModuleName(c)
 | 
				
			||||||
			newIdx, ok := immutableMaps[modName]
 | 
								newIdx, ok := immutableMaps[modName]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										42
									
								
								vendor/github.com/d5/tengo/v2/compiler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/d5/tengo/v2/compiler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -44,6 +44,7 @@ type Compiler struct {
 | 
				
			|||||||
	file            *parser.SourceFile
 | 
						file            *parser.SourceFile
 | 
				
			||||||
	parent          *Compiler
 | 
						parent          *Compiler
 | 
				
			||||||
	modulePath      string
 | 
						modulePath      string
 | 
				
			||||||
 | 
						importDir       string
 | 
				
			||||||
	constants       []Object
 | 
						constants       []Object
 | 
				
			||||||
	symbolTable     *SymbolTable
 | 
						symbolTable     *SymbolTable
 | 
				
			||||||
	scopes          []compilationScope
 | 
						scopes          []compilationScope
 | 
				
			||||||
@@ -520,7 +521,7 @@ func (c *Compiler) Compile(node parser.Node) error {
 | 
				
			|||||||
			switch v := v.(type) {
 | 
								switch v := v.(type) {
 | 
				
			||||||
			case []byte: // module written in Tengo
 | 
								case []byte: // module written in Tengo
 | 
				
			||||||
				compiled, err := c.compileModule(node,
 | 
									compiled, err := c.compileModule(node,
 | 
				
			||||||
					node.ModuleName, node.ModuleName, v)
 | 
										node.ModuleName, v, false)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return err
 | 
										return err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -537,24 +538,20 @@ func (c *Compiler) Compile(node parser.Node) error {
 | 
				
			|||||||
				moduleName += ".tengo"
 | 
									moduleName += ".tengo"
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			modulePath, err := filepath.Abs(moduleName)
 | 
								modulePath, err := filepath.Abs(
 | 
				
			||||||
 | 
									filepath.Join(c.importDir, moduleName))
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return c.errorf(node, "module file path error: %s",
 | 
									return c.errorf(node, "module file path error: %s",
 | 
				
			||||||
					err.Error())
 | 
										err.Error())
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if err := c.checkCyclicImports(node, modulePath); err != nil {
 | 
								moduleSrc, err := ioutil.ReadFile(modulePath)
 | 
				
			||||||
				return err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			moduleSrc, err := ioutil.ReadFile(moduleName)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return c.errorf(node, "module file read error: %s",
 | 
									return c.errorf(node, "module file read error: %s",
 | 
				
			||||||
					err.Error())
 | 
										err.Error())
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			compiled, err := c.compileModule(node,
 | 
								compiled, err := c.compileModule(node, modulePath, moduleSrc, true)
 | 
				
			||||||
				moduleName, modulePath, moduleSrc)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -634,6 +631,11 @@ func (c *Compiler) EnableFileImport(enable bool) {
 | 
				
			|||||||
	c.allowFileImport = enable
 | 
						c.allowFileImport = enable
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetImportDir sets the initial import directory path for file imports.
 | 
				
			||||||
 | 
					func (c *Compiler) SetImportDir(dir string) {
 | 
				
			||||||
 | 
						c.importDir = dir
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Compiler) compileAssign(
 | 
					func (c *Compiler) compileAssign(
 | 
				
			||||||
	node parser.Node,
 | 
						node parser.Node,
 | 
				
			||||||
	lhs, rhs []parser.Expr,
 | 
						lhs, rhs []parser.Expr,
 | 
				
			||||||
@@ -847,8 +849,8 @@ func (c *Compiler) compileForInStmt(stmt *parser.ForInStmt) error {
 | 
				
			|||||||
	//     ... body ...
 | 
						//     ... body ...
 | 
				
			||||||
	//   }
 | 
						//   }
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// ":it" is a local variable but will be conflict with other user variables
 | 
						// ":it" is a local variable but it will not conflict with other user variables
 | 
				
			||||||
	// because character ":" is not allowed.
 | 
						// because character ":" is not allowed in the variable names.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// init
 | 
						// init
 | 
				
			||||||
	//   :it = iterator(iterable)
 | 
						//   :it = iterator(iterable)
 | 
				
			||||||
@@ -893,6 +895,7 @@ func (c *Compiler) compileForInStmt(stmt *parser.ForInStmt) error {
 | 
				
			|||||||
		if keySymbol.Scope == ScopeGlobal {
 | 
							if keySymbol.Scope == ScopeGlobal {
 | 
				
			||||||
			c.emit(stmt, parser.OpSetGlobal, keySymbol.Index)
 | 
								c.emit(stmt, parser.OpSetGlobal, keySymbol.Index)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
 | 
								keySymbol.LocalAssigned = true
 | 
				
			||||||
			c.emit(stmt, parser.OpDefineLocal, keySymbol.Index)
 | 
								c.emit(stmt, parser.OpDefineLocal, keySymbol.Index)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -909,6 +912,7 @@ func (c *Compiler) compileForInStmt(stmt *parser.ForInStmt) error {
 | 
				
			|||||||
		if valueSymbol.Scope == ScopeGlobal {
 | 
							if valueSymbol.Scope == ScopeGlobal {
 | 
				
			||||||
			c.emit(stmt, parser.OpSetGlobal, valueSymbol.Index)
 | 
								c.emit(stmt, parser.OpSetGlobal, valueSymbol.Index)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
 | 
								valueSymbol.LocalAssigned = true
 | 
				
			||||||
			c.emit(stmt, parser.OpDefineLocal, valueSymbol.Index)
 | 
								c.emit(stmt, parser.OpDefineLocal, valueSymbol.Index)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -955,8 +959,9 @@ func (c *Compiler) checkCyclicImports(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (c *Compiler) compileModule(
 | 
					func (c *Compiler) compileModule(
 | 
				
			||||||
	node parser.Node,
 | 
						node parser.Node,
 | 
				
			||||||
	moduleName, modulePath string,
 | 
						modulePath string,
 | 
				
			||||||
	src []byte,
 | 
						src []byte,
 | 
				
			||||||
 | 
						isFile bool,
 | 
				
			||||||
) (*CompiledFunction, error) {
 | 
					) (*CompiledFunction, error) {
 | 
				
			||||||
	if err := c.checkCyclicImports(node, modulePath); err != nil {
 | 
						if err := c.checkCyclicImports(node, modulePath); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -967,7 +972,7 @@ func (c *Compiler) compileModule(
 | 
				
			|||||||
		return compiledModule, nil
 | 
							return compiledModule, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	modFile := c.file.Set().AddFile(moduleName, -1, len(src))
 | 
						modFile := c.file.Set().AddFile(modulePath, -1, len(src))
 | 
				
			||||||
	p := parser.NewParser(modFile, src, nil)
 | 
						p := parser.NewParser(modFile, src, nil)
 | 
				
			||||||
	file, err := p.ParseFile()
 | 
						file, err := p.ParseFile()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -984,7 +989,7 @@ func (c *Compiler) compileModule(
 | 
				
			|||||||
	symbolTable = symbolTable.Fork(false)
 | 
						symbolTable = symbolTable.Fork(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// compile module
 | 
						// compile module
 | 
				
			||||||
	moduleCompiler := c.fork(modFile, modulePath, symbolTable)
 | 
						moduleCompiler := c.fork(modFile, modulePath, symbolTable, isFile)
 | 
				
			||||||
	if err := moduleCompiler.Compile(file); err != nil {
 | 
						if err := moduleCompiler.Compile(file); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1082,10 +1087,16 @@ func (c *Compiler) fork(
 | 
				
			|||||||
	file *parser.SourceFile,
 | 
						file *parser.SourceFile,
 | 
				
			||||||
	modulePath string,
 | 
						modulePath string,
 | 
				
			||||||
	symbolTable *SymbolTable,
 | 
						symbolTable *SymbolTable,
 | 
				
			||||||
 | 
						isFile bool,
 | 
				
			||||||
) *Compiler {
 | 
					) *Compiler {
 | 
				
			||||||
	child := NewCompiler(file, symbolTable, nil, c.modules, c.trace)
 | 
						child := NewCompiler(file, symbolTable, nil, c.modules, c.trace)
 | 
				
			||||||
	child.modulePath = modulePath // module file path
 | 
						child.modulePath = modulePath // module file path
 | 
				
			||||||
	child.parent = c              // parent to set to current compiler
 | 
						child.parent = c              // parent to set to current compiler
 | 
				
			||||||
 | 
						child.allowFileImport = c.allowFileImport
 | 
				
			||||||
 | 
						child.importDir = c.importDir
 | 
				
			||||||
 | 
						if isFile && c.importDir != "" {
 | 
				
			||||||
 | 
							child.importDir = filepath.Dir(modulePath)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return child
 | 
						return child
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1192,6 +1203,7 @@ func (c *Compiler) optimizeFunc(node parser.Node) {
 | 
				
			|||||||
	var lastOp parser.Opcode
 | 
						var lastOp parser.Opcode
 | 
				
			||||||
	var appendReturn bool
 | 
						var appendReturn bool
 | 
				
			||||||
	endPos := len(c.scopes[c.scopeIndex].Instructions)
 | 
						endPos := len(c.scopes[c.scopeIndex].Instructions)
 | 
				
			||||||
 | 
						newEndPost := len(newInsts)
 | 
				
			||||||
	iterateInstructions(newInsts,
 | 
						iterateInstructions(newInsts,
 | 
				
			||||||
		func(pos int, opcode parser.Opcode, operands []int) bool {
 | 
							func(pos int, opcode parser.Opcode, operands []int) bool {
 | 
				
			||||||
			switch opcode {
 | 
								switch opcode {
 | 
				
			||||||
@@ -1204,6 +1216,8 @@ func (c *Compiler) optimizeFunc(node parser.Node) {
 | 
				
			|||||||
				} else if endPos == operands[0] {
 | 
									} else if endPos == operands[0] {
 | 
				
			||||||
					// there's a jump instruction that jumps to the end of
 | 
										// there's a jump instruction that jumps to the end of
 | 
				
			||||||
					// function compiler should append "return".
 | 
										// function compiler should append "return".
 | 
				
			||||||
 | 
										copy(newInsts[pos:],
 | 
				
			||||||
 | 
											MakeInstruction(opcode, newEndPost))
 | 
				
			||||||
					appendReturn = true
 | 
										appendReturn = true
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					panic(fmt.Errorf("invalid jump position: %d", newDst))
 | 
										panic(fmt.Errorf("invalid jump position: %d", newDst))
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								vendor/github.com/d5/tengo/v2/script.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/d5/tengo/v2/script.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -3,6 +3,7 @@ package tengo
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/d5/tengo/v2/parser"
 | 
						"github.com/d5/tengo/v2/parser"
 | 
				
			||||||
@@ -16,6 +17,7 @@ type Script struct {
 | 
				
			|||||||
	maxAllocs        int64
 | 
						maxAllocs        int64
 | 
				
			||||||
	maxConstObjects  int
 | 
						maxConstObjects  int
 | 
				
			||||||
	enableFileImport bool
 | 
						enableFileImport bool
 | 
				
			||||||
 | 
						importDir        string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewScript creates a Script instance with an input script.
 | 
					// NewScript creates a Script instance with an input script.
 | 
				
			||||||
@@ -56,6 +58,16 @@ func (s *Script) SetImports(modules *ModuleMap) {
 | 
				
			|||||||
	s.modules = modules
 | 
						s.modules = modules
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetImportDir sets the initial import directory for script files.
 | 
				
			||||||
 | 
					func (s *Script) SetImportDir(dir string) error {
 | 
				
			||||||
 | 
						dir, err := filepath.Abs(dir)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						s.importDir = dir
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetMaxAllocs sets the maximum number of objects allocations during the run
 | 
					// SetMaxAllocs sets the maximum number of objects allocations during the run
 | 
				
			||||||
// time. Compiled script will return ErrObjectAllocLimit error if it
 | 
					// time. Compiled script will return ErrObjectAllocLimit error if it
 | 
				
			||||||
// exceeds this limit.
 | 
					// exceeds this limit.
 | 
				
			||||||
@@ -93,6 +105,7 @@ func (s *Script) Compile() (*Compiled, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	c := NewCompiler(srcFile, symbolTable, nil, s.modules, nil)
 | 
						c := NewCompiler(srcFile, symbolTable, nil, s.modules, nil)
 | 
				
			||||||
	c.EnableFileImport(s.enableFileImport)
 | 
						c.EnableFileImport(s.enableFileImport)
 | 
				
			||||||
 | 
						c.SetImportDir(s.importDir)
 | 
				
			||||||
	if err := c.Compile(file); err != nil {
 | 
						if err := c.Compile(file); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										195
									
								
								vendor/github.com/d5/tengo/v2/stdlib/json/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										195
									
								
								vendor/github.com/d5/tengo/v2/stdlib/json/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,20 +1,129 @@
 | 
				
			|||||||
// A modified version of Go's JSON implementation.
 | 
					// A modified version of Go's JSON implementation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
					// Copyright 2010, 2020 The Go Authors. All rights reserved.
 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					// Use of this source code is governed by a BSD-style
 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package json
 | 
					package json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
	"encoding/base64"
 | 
						"encoding/base64"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"math"
 | 
						"math"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
						"unicode/utf8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/d5/tengo/v2"
 | 
						"github.com/d5/tengo/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// safeSet holds the value true if the ASCII character with the given array
 | 
				
			||||||
 | 
					// position can be represented inside a JSON string without any further
 | 
				
			||||||
 | 
					// escaping.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// All values are true except for the ASCII control characters (0-31), the
 | 
				
			||||||
 | 
					// double quote ("), and the backslash character ("\").
 | 
				
			||||||
 | 
					var safeSet = [utf8.RuneSelf]bool{
 | 
				
			||||||
 | 
						' ':      true,
 | 
				
			||||||
 | 
						'!':      true,
 | 
				
			||||||
 | 
						'"':      false,
 | 
				
			||||||
 | 
						'#':      true,
 | 
				
			||||||
 | 
						'$':      true,
 | 
				
			||||||
 | 
						'%':      true,
 | 
				
			||||||
 | 
						'&':      true,
 | 
				
			||||||
 | 
						'\'':     true,
 | 
				
			||||||
 | 
						'(':      true,
 | 
				
			||||||
 | 
						')':      true,
 | 
				
			||||||
 | 
						'*':      true,
 | 
				
			||||||
 | 
						'+':      true,
 | 
				
			||||||
 | 
						',':      true,
 | 
				
			||||||
 | 
						'-':      true,
 | 
				
			||||||
 | 
						'.':      true,
 | 
				
			||||||
 | 
						'/':      true,
 | 
				
			||||||
 | 
						'0':      true,
 | 
				
			||||||
 | 
						'1':      true,
 | 
				
			||||||
 | 
						'2':      true,
 | 
				
			||||||
 | 
						'3':      true,
 | 
				
			||||||
 | 
						'4':      true,
 | 
				
			||||||
 | 
						'5':      true,
 | 
				
			||||||
 | 
						'6':      true,
 | 
				
			||||||
 | 
						'7':      true,
 | 
				
			||||||
 | 
						'8':      true,
 | 
				
			||||||
 | 
						'9':      true,
 | 
				
			||||||
 | 
						':':      true,
 | 
				
			||||||
 | 
						';':      true,
 | 
				
			||||||
 | 
						'<':      true,
 | 
				
			||||||
 | 
						'=':      true,
 | 
				
			||||||
 | 
						'>':      true,
 | 
				
			||||||
 | 
						'?':      true,
 | 
				
			||||||
 | 
						'@':      true,
 | 
				
			||||||
 | 
						'A':      true,
 | 
				
			||||||
 | 
						'B':      true,
 | 
				
			||||||
 | 
						'C':      true,
 | 
				
			||||||
 | 
						'D':      true,
 | 
				
			||||||
 | 
						'E':      true,
 | 
				
			||||||
 | 
						'F':      true,
 | 
				
			||||||
 | 
						'G':      true,
 | 
				
			||||||
 | 
						'H':      true,
 | 
				
			||||||
 | 
						'I':      true,
 | 
				
			||||||
 | 
						'J':      true,
 | 
				
			||||||
 | 
						'K':      true,
 | 
				
			||||||
 | 
						'L':      true,
 | 
				
			||||||
 | 
						'M':      true,
 | 
				
			||||||
 | 
						'N':      true,
 | 
				
			||||||
 | 
						'O':      true,
 | 
				
			||||||
 | 
						'P':      true,
 | 
				
			||||||
 | 
						'Q':      true,
 | 
				
			||||||
 | 
						'R':      true,
 | 
				
			||||||
 | 
						'S':      true,
 | 
				
			||||||
 | 
						'T':      true,
 | 
				
			||||||
 | 
						'U':      true,
 | 
				
			||||||
 | 
						'V':      true,
 | 
				
			||||||
 | 
						'W':      true,
 | 
				
			||||||
 | 
						'X':      true,
 | 
				
			||||||
 | 
						'Y':      true,
 | 
				
			||||||
 | 
						'Z':      true,
 | 
				
			||||||
 | 
						'[':      true,
 | 
				
			||||||
 | 
						'\\':     false,
 | 
				
			||||||
 | 
						']':      true,
 | 
				
			||||||
 | 
						'^':      true,
 | 
				
			||||||
 | 
						'_':      true,
 | 
				
			||||||
 | 
						'`':      true,
 | 
				
			||||||
 | 
						'a':      true,
 | 
				
			||||||
 | 
						'b':      true,
 | 
				
			||||||
 | 
						'c':      true,
 | 
				
			||||||
 | 
						'd':      true,
 | 
				
			||||||
 | 
						'e':      true,
 | 
				
			||||||
 | 
						'f':      true,
 | 
				
			||||||
 | 
						'g':      true,
 | 
				
			||||||
 | 
						'h':      true,
 | 
				
			||||||
 | 
						'i':      true,
 | 
				
			||||||
 | 
						'j':      true,
 | 
				
			||||||
 | 
						'k':      true,
 | 
				
			||||||
 | 
						'l':      true,
 | 
				
			||||||
 | 
						'm':      true,
 | 
				
			||||||
 | 
						'n':      true,
 | 
				
			||||||
 | 
						'o':      true,
 | 
				
			||||||
 | 
						'p':      true,
 | 
				
			||||||
 | 
						'q':      true,
 | 
				
			||||||
 | 
						'r':      true,
 | 
				
			||||||
 | 
						's':      true,
 | 
				
			||||||
 | 
						't':      true,
 | 
				
			||||||
 | 
						'u':      true,
 | 
				
			||||||
 | 
						'v':      true,
 | 
				
			||||||
 | 
						'w':      true,
 | 
				
			||||||
 | 
						'x':      true,
 | 
				
			||||||
 | 
						'y':      true,
 | 
				
			||||||
 | 
						'z':      true,
 | 
				
			||||||
 | 
						'{':      true,
 | 
				
			||||||
 | 
						'|':      true,
 | 
				
			||||||
 | 
						'}':      true,
 | 
				
			||||||
 | 
						'~':      true,
 | 
				
			||||||
 | 
						'\u007f': true,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var hex = "0123456789abcdef"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Encode returns the JSON encoding of the object.
 | 
					// Encode returns the JSON encoding of the object.
 | 
				
			||||||
func Encode(o tengo.Object) ([]byte, error) {
 | 
					func Encode(o tengo.Object) ([]byte, error) {
 | 
				
			||||||
	var b []byte
 | 
						var b []byte
 | 
				
			||||||
@@ -53,7 +162,7 @@ func Encode(o tengo.Object) ([]byte, error) {
 | 
				
			|||||||
		len1 := len(o.Value) - 1
 | 
							len1 := len(o.Value) - 1
 | 
				
			||||||
		idx := 0
 | 
							idx := 0
 | 
				
			||||||
		for key, value := range o.Value {
 | 
							for key, value := range o.Value {
 | 
				
			||||||
			b = strconv.AppendQuote(b, key)
 | 
								b = encodeString(b, key)
 | 
				
			||||||
			b = append(b, ':')
 | 
								b = append(b, ':')
 | 
				
			||||||
			eb, err := Encode(value)
 | 
								eb, err := Encode(value)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
@@ -71,7 +180,7 @@ func Encode(o tengo.Object) ([]byte, error) {
 | 
				
			|||||||
		len1 := len(o.Value) - 1
 | 
							len1 := len(o.Value) - 1
 | 
				
			||||||
		idx := 0
 | 
							idx := 0
 | 
				
			||||||
		for key, value := range o.Value {
 | 
							for key, value := range o.Value {
 | 
				
			||||||
			b = strconv.AppendQuote(b, key)
 | 
								b = encodeString(b, key)
 | 
				
			||||||
			b = append(b, ':')
 | 
								b = append(b, ':')
 | 
				
			||||||
			eb, err := Encode(value)
 | 
								eb, err := Encode(value)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
@@ -130,7 +239,9 @@ func Encode(o tengo.Object) ([]byte, error) {
 | 
				
			|||||||
	case *tengo.Int:
 | 
						case *tengo.Int:
 | 
				
			||||||
		b = strconv.AppendInt(b, o.Value, 10)
 | 
							b = strconv.AppendInt(b, o.Value, 10)
 | 
				
			||||||
	case *tengo.String:
 | 
						case *tengo.String:
 | 
				
			||||||
		b = strconv.AppendQuote(b, o.Value)
 | 
							// string encoding bug is fixed with newly introduced function
 | 
				
			||||||
 | 
							// encodeString(). See: https://github.com/d5/tengo/issues/268
 | 
				
			||||||
 | 
							b = encodeString(b, o.Value)
 | 
				
			||||||
	case *tengo.Time:
 | 
						case *tengo.Time:
 | 
				
			||||||
		y, err := o.Value.MarshalJSON()
 | 
							y, err := o.Value.MarshalJSON()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -144,3 +255,79 @@ func Encode(o tengo.Object) ([]byte, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return b, nil
 | 
						return b, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// encodeString encodes given string as JSON string according to
 | 
				
			||||||
 | 
					// https://www.json.org/img/string.png
 | 
				
			||||||
 | 
					// Implementation is inspired by https://github.com/json-iterator/go
 | 
				
			||||||
 | 
					// See encodeStringSlowPath() for more information.
 | 
				
			||||||
 | 
					func encodeString(b []byte, val string) []byte {
 | 
				
			||||||
 | 
						valLen := len(val)
 | 
				
			||||||
 | 
						buf := bytes.NewBuffer(b)
 | 
				
			||||||
 | 
						buf.WriteByte('"')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// write string, the fast path, without utf8 and escape support
 | 
				
			||||||
 | 
						i := 0
 | 
				
			||||||
 | 
						for ; i < valLen; i++ {
 | 
				
			||||||
 | 
							c := val[i]
 | 
				
			||||||
 | 
							if c > 31 && c != '"' && c != '\\' {
 | 
				
			||||||
 | 
								buf.WriteByte(c)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if i == valLen {
 | 
				
			||||||
 | 
							buf.WriteByte('"')
 | 
				
			||||||
 | 
							return buf.Bytes()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						encodeStringSlowPath(buf, i, val, valLen)
 | 
				
			||||||
 | 
						buf.WriteByte('"')
 | 
				
			||||||
 | 
						return buf.Bytes()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// encodeStringSlowPath is ported from Go 1.14.2 encoding/json package.
 | 
				
			||||||
 | 
					// U+2028 U+2029 JSONP security holes can be fixed with addition call to
 | 
				
			||||||
 | 
					// json.html_escape() thus it is removed from the implementation below.
 | 
				
			||||||
 | 
					// Note: Invalid runes are not checked as they are checked in original
 | 
				
			||||||
 | 
					// implementation.
 | 
				
			||||||
 | 
					func encodeStringSlowPath(buf *bytes.Buffer, i int, val string, valLen int) {
 | 
				
			||||||
 | 
						start := i
 | 
				
			||||||
 | 
						for i < valLen {
 | 
				
			||||||
 | 
							if b := val[i]; b < utf8.RuneSelf {
 | 
				
			||||||
 | 
								if safeSet[b] {
 | 
				
			||||||
 | 
									i++
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if start < i {
 | 
				
			||||||
 | 
									buf.WriteString(val[start:i])
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								buf.WriteByte('\\')
 | 
				
			||||||
 | 
								switch b {
 | 
				
			||||||
 | 
								case '\\', '"':
 | 
				
			||||||
 | 
									buf.WriteByte(b)
 | 
				
			||||||
 | 
								case '\n':
 | 
				
			||||||
 | 
									buf.WriteByte('n')
 | 
				
			||||||
 | 
								case '\r':
 | 
				
			||||||
 | 
									buf.WriteByte('r')
 | 
				
			||||||
 | 
								case '\t':
 | 
				
			||||||
 | 
									buf.WriteByte('t')
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									// This encodes bytes < 0x20 except for \t, \n and \r.
 | 
				
			||||||
 | 
									// If escapeHTML is set, it also escapes <, >, and &
 | 
				
			||||||
 | 
									// because they can lead to security holes when
 | 
				
			||||||
 | 
									// user-controlled strings are rendered into JSON
 | 
				
			||||||
 | 
									// and served to some browsers.
 | 
				
			||||||
 | 
									buf.WriteString(`u00`)
 | 
				
			||||||
 | 
									buf.WriteByte(hex[b>>4])
 | 
				
			||||||
 | 
									buf.WriteByte(hex[b&0xF])
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								i++
 | 
				
			||||||
 | 
								start = i
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							i++
 | 
				
			||||||
 | 
							continue
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if start < valLen {
 | 
				
			||||||
 | 
							buf.WriteString(val[start:])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								vendor/github.com/fsnotify/fsnotify/.editorconfig
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/fsnotify/fsnotify/.editorconfig
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,12 @@
 | 
				
			|||||||
root = true
 | 
					root = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[*]
 | 
					[*.go]
 | 
				
			||||||
indent_style = tab
 | 
					indent_style = tab
 | 
				
			||||||
indent_size = 4
 | 
					indent_size = 4
 | 
				
			||||||
 | 
					insert_final_newline = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[*.{yml,yaml}]
 | 
				
			||||||
 | 
					indent_style = space
 | 
				
			||||||
 | 
					indent_size = 2
 | 
				
			||||||
 | 
					insert_final_newline = true
 | 
				
			||||||
 | 
					trim_trailing_whitespace = true
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								vendor/github.com/fsnotify/fsnotify/.gitattributes
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/fsnotify/fsnotify/.gitattributes
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					go.sum linguist-generated
 | 
				
			||||||
							
								
								
									
										20
									
								
								vendor/github.com/fsnotify/fsnotify/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/fsnotify/fsnotify/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,29 +2,35 @@ sudo: false
 | 
				
			|||||||
language: go
 | 
					language: go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - 1.8.x
 | 
					  - "stable"
 | 
				
			||||||
  - 1.9.x
 | 
					  - "1.11.x"
 | 
				
			||||||
  - tip
 | 
					  - "1.10.x"
 | 
				
			||||||
 | 
					  - "1.9.x"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
matrix:
 | 
					matrix:
 | 
				
			||||||
 | 
					  include:
 | 
				
			||||||
 | 
					    - go: "stable"
 | 
				
			||||||
 | 
					      env: GOLINT=true
 | 
				
			||||||
  allow_failures:
 | 
					  allow_failures:
 | 
				
			||||||
    - go: tip
 | 
					    - go: tip
 | 
				
			||||||
  fast_finish: true
 | 
					  fast_finish: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
before_script:
 | 
					
 | 
				
			||||||
  - go get -u github.com/golang/lint/golint
 | 
					before_install:
 | 
				
			||||||
 | 
					  - if [ ! -z "${GOLINT}" ]; then go get -u golang.org/x/lint/golint; fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
script:
 | 
					script:
 | 
				
			||||||
  - go test -v --race ./...
 | 
					  - go test --race ./...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
after_script:
 | 
					after_script:
 | 
				
			||||||
  - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
 | 
					  - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
 | 
				
			||||||
  - test -z "$(golint ./...     | tee /dev/stderr)"
 | 
					  - if [ ! -z  "${GOLINT}" ]; then echo running golint; golint --set_exit_status  ./...; else echo skipping golint; fi
 | 
				
			||||||
  - go vet ./...
 | 
					  - go vet ./...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
os:
 | 
					os:
 | 
				
			||||||
  - linux
 | 
					  - linux
 | 
				
			||||||
  - osx
 | 
					  - osx
 | 
				
			||||||
 | 
					  - windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  email: false
 | 
					  email: false
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,5 @@
 | 
				
			|||||||
Copyright (c) 2012 The Go Authors. All rights reserved.
 | 
					Copyright (c) 2012 The Go Authors. All rights reserved.
 | 
				
			||||||
Copyright (c) 2012 fsnotify Authors. All rights reserved.
 | 
					Copyright (c) 2012-2019 fsnotify Authors. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Redistribution and use in source and binary forms, with or without
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
modification, are permitted provided that the following conditions are
 | 
					modification, are permitted provided that the following conditions are
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										71
									
								
								vendor/github.com/fsnotify/fsnotify/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										71
									
								
								vendor/github.com/fsnotify/fsnotify/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,16 +10,16 @@ go get -u golang.org/x/sys/...
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Cross platform: Windows, Linux, BSD and macOS.
 | 
					Cross platform: Windows, Linux, BSD and macOS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
|Adapter   |OS        |Status    |
 | 
					| Adapter               | OS                               | Status                                                                                                                          |
 | 
				
			||||||
|----------|----------|----------|
 | 
					| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
 | 
				
			||||||
|inotify   |Linux 2.6.27 or later, Android\*|Supported [](https://travis-ci.org/fsnotify/fsnotify)|
 | 
					| inotify               | Linux 2.6.27 or later, Android\* | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
 | 
				
			||||||
|kqueue    |BSD, macOS, iOS\*|Supported [](https://travis-ci.org/fsnotify/fsnotify)|
 | 
					| kqueue                | BSD, macOS, iOS\*                | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
 | 
				
			||||||
|ReadDirectoryChangesW|Windows|Supported [](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
 | 
					| ReadDirectoryChangesW | Windows                          | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
 | 
				
			||||||
|FSEvents  |macOS         |[Planned](https://github.com/fsnotify/fsnotify/issues/11)|
 | 
					| FSEvents              | macOS                            | [Planned](https://github.com/fsnotify/fsnotify/issues/11)                                                                       |
 | 
				
			||||||
|FEN       |Solaris 11    |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)|
 | 
					| FEN                   | Solaris 11                       | [In Progress](https://github.com/fsnotify/fsnotify/issues/12)                                                                   |
 | 
				
			||||||
|fanotify  |Linux 2.6.37+ | |
 | 
					| fanotify              | Linux 2.6.37+                    | [Planned](https://github.com/fsnotify/fsnotify/issues/114)                                                                      |
 | 
				
			||||||
|USN Journals |Windows    |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)|
 | 
					| USN Journals          | Windows                          | [Maybe](https://github.com/fsnotify/fsnotify/issues/53)                                                                         |
 | 
				
			||||||
|Polling   |*All*         |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)|
 | 
					| Polling               | *All*                            | [Maybe](https://github.com/fsnotify/fsnotify/issues/9)                                                                          |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\* Android and iOS are untested.
 | 
					\* Android and iOS are untested.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -33,6 +33,53 @@ All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based o
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
 | 
					Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/fsnotify/fsnotify"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						watcher, err := fsnotify.NewWatcher()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer watcher.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						done := make(chan bool)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							for {
 | 
				
			||||||
 | 
								select {
 | 
				
			||||||
 | 
								case event, ok := <-watcher.Events:
 | 
				
			||||||
 | 
									if !ok {
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									log.Println("event:", event)
 | 
				
			||||||
 | 
									if event.Op&fsnotify.Write == fsnotify.Write {
 | 
				
			||||||
 | 
										log.Println("modified file:", event.Name)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								case err, ok := <-watcher.Errors:
 | 
				
			||||||
 | 
									if !ok {
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									log.Println("error:", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = watcher.Add("/tmp/foo")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						<-done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Contributing
 | 
					## Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please refer to [CONTRIBUTING][] before opening an issue or pull request.
 | 
					Please refer to [CONTRIBUTING][] before opening an issue or pull request.
 | 
				
			||||||
@@ -65,6 +112,10 @@ There are OS-specific limits as to how many watches can be created:
 | 
				
			|||||||
* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
 | 
					* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
 | 
				
			||||||
* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
 | 
					* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[#62]: https://github.com/howeyc/fsnotify/issues/62
 | 
					[#62]: https://github.com/howeyc/fsnotify/issues/62
 | 
				
			||||||
[#18]: https://github.com/fsnotify/fsnotify/issues/18
 | 
					[#18]: https://github.com/fsnotify/fsnotify/issues/18
 | 
				
			||||||
[#11]: https://github.com/fsnotify/fsnotify/issues/11
 | 
					[#11]: https://github.com/fsnotify/fsnotify/issues/11
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/fsnotify/fsnotify/fsnotify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/fsnotify/fsnotify/fsnotify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -63,4 +63,6 @@ func (e Event) String() string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Common errors that can be reported by a watcher
 | 
					// Common errors that can be reported by a watcher
 | 
				
			||||||
var ErrEventOverflow = errors.New("fsnotify queue overflow")
 | 
					var (
 | 
				
			||||||
 | 
						ErrEventOverflow = errors.New("fsnotify queue overflow")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/fsnotify/fsnotify/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/fsnotify/fsnotify/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					module github.com/fsnotify/fsnotify
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.13
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
							
								
								
									
										4
									
								
								vendor/github.com/fsnotify/fsnotify/inotify_poller.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/fsnotify/fsnotify/inotify_poller.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -40,12 +40,12 @@ func newFdPoller(fd int) (*fdPoller, error) {
 | 
				
			|||||||
	poller.fd = fd
 | 
						poller.fd = fd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create epoll fd
 | 
						// Create epoll fd
 | 
				
			||||||
	poller.epfd, errno = unix.EpollCreate1(0)
 | 
						poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC)
 | 
				
			||||||
	if poller.epfd == -1 {
 | 
						if poller.epfd == -1 {
 | 
				
			||||||
		return nil, errno
 | 
							return nil, errno
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Create pipe; pipe[0] is the read end, pipe[1] the write end.
 | 
						// Create pipe; pipe[0] is the read end, pipe[1] the write end.
 | 
				
			||||||
	errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK)
 | 
						errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC)
 | 
				
			||||||
	if errno != nil {
 | 
						if errno != nil {
 | 
				
			||||||
		return nil, errno
 | 
							return nil, errno
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,4 +8,4 @@ package fsnotify
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import "golang.org/x/sys/unix"
 | 
					import "golang.org/x/sys/unix"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const openMode = unix.O_NONBLOCK | unix.O_RDONLY
 | 
					const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -9,4 +9,4 @@ package fsnotify
 | 
				
			|||||||
import "golang.org/x/sys/unix"
 | 
					import "golang.org/x/sys/unix"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// note: this constant is not defined on BSD
 | 
					// note: this constant is not defined on BSD
 | 
				
			||||||
const openMode = unix.O_EVTONLY
 | 
					const openMode = unix.O_EVTONLY | unix.O_CLOEXEC
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -38,7 +38,6 @@ package proto
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
	"sort"
 | 
						"sort"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
@@ -194,7 +193,7 @@ func (p *Properties) Parse(s string) {
 | 
				
			|||||||
	// "bytes,49,opt,name=foo,def=hello!"
 | 
						// "bytes,49,opt,name=foo,def=hello!"
 | 
				
			||||||
	fields := strings.Split(s, ",") // breaks def=, but handled below.
 | 
						fields := strings.Split(s, ",") // breaks def=, but handled below.
 | 
				
			||||||
	if len(fields) < 2 {
 | 
						if len(fields) < 2 {
 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s)
 | 
							log.Printf("proto: tag has too few fields: %q", s)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -214,7 +213,7 @@ func (p *Properties) Parse(s string) {
 | 
				
			|||||||
		p.WireType = WireBytes
 | 
							p.WireType = WireBytes
 | 
				
			||||||
		// no numeric converter for non-numeric types
 | 
							// no numeric converter for non-numeric types
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s)
 | 
							log.Printf("proto: tag has unknown wire type: %q", s)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/gorilla/websocket/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/gorilla/websocket/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,7 +8,7 @@ Gorilla WebSocket is a [Go](http://golang.org/) implementation of the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Documentation
 | 
					### Documentation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* [API Reference](http://godoc.org/github.com/gorilla/websocket)
 | 
					* [API Reference](https://pkg.go.dev/github.com/gorilla/websocket?tab=doc)
 | 
				
			||||||
* [Chat example](https://github.com/gorilla/websocket/tree/master/examples/chat)
 | 
					* [Chat example](https://github.com/gorilla/websocket/tree/master/examples/chat)
 | 
				
			||||||
* [Command example](https://github.com/gorilla/websocket/tree/master/examples/command)
 | 
					* [Command example](https://github.com/gorilla/websocket/tree/master/examples/command)
 | 
				
			||||||
* [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo)
 | 
					* [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/gorilla/websocket/conn.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/gorilla/websocket/conn.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -244,7 +244,7 @@ type Conn struct {
 | 
				
			|||||||
	subprotocol string
 | 
						subprotocol string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Write fields
 | 
						// Write fields
 | 
				
			||||||
	mu            chan bool // used as mutex to protect write to conn
 | 
						mu            chan struct{} // used as mutex to protect write to conn
 | 
				
			||||||
	writeBuf      []byte        // frame is constructed in this buffer.
 | 
						writeBuf      []byte        // frame is constructed in this buffer.
 | 
				
			||||||
	writePool     BufferPool
 | 
						writePool     BufferPool
 | 
				
			||||||
	writeBufSize  int
 | 
						writeBufSize  int
 | 
				
			||||||
@@ -302,8 +302,8 @@ func newConn(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int,
 | 
				
			|||||||
		writeBuf = make([]byte, writeBufferSize)
 | 
							writeBuf = make([]byte, writeBufferSize)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mu := make(chan bool, 1)
 | 
						mu := make(chan struct{}, 1)
 | 
				
			||||||
	mu <- true
 | 
						mu <- struct{}{}
 | 
				
			||||||
	c := &Conn{
 | 
						c := &Conn{
 | 
				
			||||||
		isServer:               isServer,
 | 
							isServer:               isServer,
 | 
				
			||||||
		br:                     br,
 | 
							br:                     br,
 | 
				
			||||||
@@ -377,7 +377,7 @@ func (c *Conn) read(n int) ([]byte, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error {
 | 
					func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error {
 | 
				
			||||||
	<-c.mu
 | 
						<-c.mu
 | 
				
			||||||
	defer func() { c.mu <- true }()
 | 
						defer func() { c.mu <- struct{}{} }()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c.writeErrMu.Lock()
 | 
						c.writeErrMu.Lock()
 | 
				
			||||||
	err := c.writeErr
 | 
						err := c.writeErr
 | 
				
			||||||
@@ -429,7 +429,7 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
 | 
				
			|||||||
		maskBytes(key, 0, buf[6:])
 | 
							maskBytes(key, 0, buf[6:])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	d := time.Hour * 1000
 | 
						d := 1000 * time.Hour
 | 
				
			||||||
	if !deadline.IsZero() {
 | 
						if !deadline.IsZero() {
 | 
				
			||||||
		d = deadline.Sub(time.Now())
 | 
							d = deadline.Sub(time.Now())
 | 
				
			||||||
		if d < 0 {
 | 
							if d < 0 {
 | 
				
			||||||
@@ -444,7 +444,7 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
 | 
				
			|||||||
	case <-timer.C:
 | 
						case <-timer.C:
 | 
				
			||||||
		return errWriteTimeout
 | 
							return errWriteTimeout
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer func() { c.mu <- true }()
 | 
						defer func() { c.mu <- struct{}{} }()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c.writeErrMu.Lock()
 | 
						c.writeErrMu.Lock()
 | 
				
			||||||
	err := c.writeErr
 | 
						err := c.writeErr
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/gorilla/websocket/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/gorilla/websocket/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -187,9 +187,9 @@
 | 
				
			|||||||
// than the largest message do not provide any benefit.
 | 
					// than the largest message do not provide any benefit.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Depending on the distribution of message sizes, setting the buffer size to
 | 
					// Depending on the distribution of message sizes, setting the buffer size to
 | 
				
			||||||
// to a value less than the maximum expected message size can greatly reduce
 | 
					// a value less than the maximum expected message size can greatly reduce memory
 | 
				
			||||||
// memory use with a small impact on performance. Here's an example: If 99% of
 | 
					// use with a small impact on performance. Here's an example: If 99% of the
 | 
				
			||||||
// the messages are smaller than 256 bytes and the maximum message size is 512
 | 
					// messages are smaller than 256 bytes and the maximum message size is 512
 | 
				
			||||||
// bytes, then a buffer size of 256 bytes will result in 1.01 more system calls
 | 
					// bytes, then a buffer size of 256 bytes will result in 1.01 more system calls
 | 
				
			||||||
// than a buffer size of 512 bytes. The memory savings is 50%.
 | 
					// than a buffer size of 512 bytes. The memory savings is 50%.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/gorilla/websocket/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/gorilla/websocket/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,2 +0,0 @@
 | 
				
			|||||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
 | 
					 | 
				
			||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/gorilla/websocket/prepared.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/gorilla/websocket/prepared.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -73,8 +73,8 @@ func (pm *PreparedMessage) frame(key prepareKey) (int, []byte, error) {
 | 
				
			|||||||
		// Prepare a frame using a 'fake' connection.
 | 
							// Prepare a frame using a 'fake' connection.
 | 
				
			||||||
		// TODO: Refactor code in conn.go to allow more direct construction of
 | 
							// TODO: Refactor code in conn.go to allow more direct construction of
 | 
				
			||||||
		// the frame.
 | 
							// the frame.
 | 
				
			||||||
		mu := make(chan bool, 1)
 | 
							mu := make(chan struct{}, 1)
 | 
				
			||||||
		mu <- true
 | 
							mu <- struct{}{}
 | 
				
			||||||
		var nc prepareConn
 | 
							var nc prepareConn
 | 
				
			||||||
		c := &Conn{
 | 
							c := &Conn{
 | 
				
			||||||
			conn:                   &nc,
 | 
								conn:                   &nc,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/hashicorp/golang-lru/lru.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/hashicorp/golang-lru/lru.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -85,6 +85,22 @@ func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) {
 | 
				
			|||||||
	return false, evicted
 | 
						return false, evicted
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PeekOrAdd checks if a key is in the cache without updating the
 | 
				
			||||||
 | 
					// recent-ness or deleting it for being stale, and if not, adds the value.
 | 
				
			||||||
 | 
					// Returns whether found and whether an eviction occurred.
 | 
				
			||||||
 | 
					func (c *Cache) PeekOrAdd(key, value interface{}) (previous interface{}, ok, evicted bool) {
 | 
				
			||||||
 | 
						c.lock.Lock()
 | 
				
			||||||
 | 
						defer c.lock.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						previous, ok = c.lru.Peek(key)
 | 
				
			||||||
 | 
						if ok {
 | 
				
			||||||
 | 
							return previous, true, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						evicted = c.lru.Add(key, value)
 | 
				
			||||||
 | 
						return nil, false, evicted
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Remove removes the provided key from the cache.
 | 
					// Remove removes the provided key from the cache.
 | 
				
			||||||
func (c *Cache) Remove(key interface{}) (present bool) {
 | 
					func (c *Cache) Remove(key interface{}) (present bool) {
 | 
				
			||||||
	c.lock.Lock()
 | 
						c.lock.Lock()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										63
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/chat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/chat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -70,7 +70,11 @@ func (a *API) GetConversations(unreadOnly bool) ([]chat1.ConvSummary, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) GetConversation(convID chat1.ConvIDStr) (res chat1.ConvSummary, err error) {
 | 
					func (a *API) GetConversation(convID chat1.ConvIDStr) (res chat1.ConvSummary, err error) {
 | 
				
			||||||
	apiInput := fmt.Sprintf(`{"method":"list", "params": { "options": { "conversation_id": "%s"}}}`, convID)
 | 
						convIDEscaped, err := json.Marshal(convID)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return res, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						apiInput := fmt.Sprintf(`{"method":"list", "params": { "options": { "conversation_id": %s}}}`, convIDEscaped)
 | 
				
			||||||
	output, err := a.doFetch(apiInput)
 | 
						output, err := a.doFetch(apiInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return res, err
 | 
							return res, err
 | 
				
			||||||
@@ -94,7 +98,7 @@ func (a *API) GetTextMessages(channel chat1.ChatChannel, unreadOnly bool) ([]cha
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	apiInput := fmt.Sprintf(`{"method": "read", "params": {"options": {"channel": %s}}}`, string(channelBytes))
 | 
						apiInput := fmt.Sprintf(`{"method": "read", "params": {"options": {"channel": %s}}}`, channelBytes)
 | 
				
			||||||
	output, err := a.doFetch(apiInput)
 | 
						output, err := a.doFetch(apiInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -324,7 +328,11 @@ type LeaveChannel struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) ListChannels(teamName string) ([]string, error) {
 | 
					func (a *API) ListChannels(teamName string) ([]string, error) {
 | 
				
			||||||
	apiInput := fmt.Sprintf(`{"method": "listconvsonname", "params": {"options": {"topic_type": "CHAT", "members_type": "team", "name": "%s"}}}`, teamName)
 | 
						teamNameEscaped, err := json.Marshal(teamName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						apiInput := fmt.Sprintf(`{"method": "listconvsonname", "params": {"options": {"topic_type": "CHAT", "members_type": "team", "name": %s}}}`, teamNameEscaped)
 | 
				
			||||||
	output, err := a.doFetch(apiInput)
 | 
						output, err := a.doFetch(apiInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -347,7 +355,16 @@ func (a *API) ListChannels(teamName string) ([]string, error) {
 | 
				
			|||||||
func (a *API) JoinChannel(teamName string, channelName string) (chat1.EmptyRes, error) {
 | 
					func (a *API) JoinChannel(teamName string, channelName string) (chat1.EmptyRes, error) {
 | 
				
			||||||
	empty := chat1.EmptyRes{}
 | 
						empty := chat1.EmptyRes{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	apiInput := fmt.Sprintf(`{"method": "join", "params": {"options": {"channel": {"name": "%s", "members_type": "team", "topic_name": "%s"}}}}`, teamName, channelName)
 | 
						teamNameEscaped, err := json.Marshal(teamName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return empty, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						channelNameEscaped, err := json.Marshal(channelName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return empty, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						apiInput := fmt.Sprintf(`{"method": "join", "params": {"options": {"channel": {"name": %s, "members_type": "team", "topic_name": %s}}}}`,
 | 
				
			||||||
 | 
							teamNameEscaped, channelNameEscaped)
 | 
				
			||||||
	output, err := a.doFetch(apiInput)
 | 
						output, err := a.doFetch(apiInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return empty, err
 | 
							return empty, err
 | 
				
			||||||
@@ -367,7 +384,16 @@ func (a *API) JoinChannel(teamName string, channelName string) (chat1.EmptyRes,
 | 
				
			|||||||
func (a *API) LeaveChannel(teamName string, channelName string) (chat1.EmptyRes, error) {
 | 
					func (a *API) LeaveChannel(teamName string, channelName string) (chat1.EmptyRes, error) {
 | 
				
			||||||
	empty := chat1.EmptyRes{}
 | 
						empty := chat1.EmptyRes{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	apiInput := fmt.Sprintf(`{"method": "leave", "params": {"options": {"channel": {"name": "%s", "members_type": "team", "topic_name": "%s"}}}}`, teamName, channelName)
 | 
						teamNameEscaped, err := json.Marshal(teamName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return empty, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						channelNameEscaped, err := json.Marshal(channelName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return empty, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						apiInput := fmt.Sprintf(`{"method": "leave", "params": {"options": {"channel": {"name": %s, "members_type": "team", "topic_name": %s}}}}`,
 | 
				
			||||||
 | 
							teamNameEscaped, channelNameEscaped)
 | 
				
			||||||
	output, err := a.doFetch(apiInput)
 | 
						output, err := a.doFetch(apiInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return empty, err
 | 
							return empty, err
 | 
				
			||||||
@@ -461,13 +487,28 @@ func (a *API) AdvertiseCommands(ad Advertisement) (SendResponse, error) {
 | 
				
			|||||||
	return a.doSend(newAdvertiseCmdsMsgArg(ad))
 | 
						return a.doSend(newAdvertiseCmdsMsgArg(ad))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) ClearCommands() error {
 | 
					type clearCmdsOptions struct {
 | 
				
			||||||
	arg := struct {
 | 
						Filter *chat1.ClearCommandAPIParam `json:"filter"`
 | 
				
			||||||
		Method string
 | 
					}
 | 
				
			||||||
	}{
 | 
					
 | 
				
			||||||
 | 
					type clearCmdsParams struct {
 | 
				
			||||||
 | 
						Options clearCmdsOptions `json:"options"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type clearCmdsArg struct {
 | 
				
			||||||
 | 
						Method string          `json:"method"`
 | 
				
			||||||
 | 
						Params clearCmdsParams `json:"params,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (a *API) ClearCommands(filter *chat1.ClearCommandAPIParam) error {
 | 
				
			||||||
 | 
						_, err := a.doSend(clearCmdsArg{
 | 
				
			||||||
		Method: "clearcommands",
 | 
							Method: "clearcommands",
 | 
				
			||||||
	}
 | 
							Params: clearCmdsParams{
 | 
				
			||||||
	_, err := a.doSend(arg)
 | 
								Options: clearCmdsOptions{
 | 
				
			||||||
 | 
									Filter: filter,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,9 +1,14 @@
 | 
				
			|||||||
package kbchat
 | 
					package kbchat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "fmt"
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ErrorCode int
 | 
					type ErrorCode int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var errAPIDisconnected = errors.New("chat API disconnected")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	RevisionErrorCode          ErrorCode = 2760
 | 
						RevisionErrorCode          ErrorCode = 2760
 | 
				
			||||||
	DeleteNonExistentErrorCode ErrorCode = 2762
 | 
						DeleteNonExistentErrorCode ErrorCode = 2762
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										423
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/kbchat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										423
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/kbchat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"log"
 | 
					 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
@@ -18,63 +17,110 @@ import (
 | 
				
			|||||||
	"github.com/keybase/go-keybase-chat-bot/kbchat/types/stellar1"
 | 
						"github.com/keybase/go-keybase-chat-bot/kbchat/types/stellar1"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// API is the main object used for communicating with the Keybase JSON API
 | 
					// SubscriptionMessage contains a message and conversation object
 | 
				
			||||||
type API struct {
 | 
					type SubscriptionMessage struct {
 | 
				
			||||||
	sync.Mutex
 | 
						Message      chat1.MsgSummary
 | 
				
			||||||
	apiInput      io.Writer
 | 
						Conversation chat1.ConvSummary
 | 
				
			||||||
	apiOutput     *bufio.Reader
 | 
					 | 
				
			||||||
	apiCmd        *exec.Cmd
 | 
					 | 
				
			||||||
	username      string
 | 
					 | 
				
			||||||
	runOpts       RunOptions
 | 
					 | 
				
			||||||
	subscriptions []*NewSubscription
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getUsername(runOpts RunOptions) (username string, err error) {
 | 
					type SubscriptionConversation struct {
 | 
				
			||||||
	p := runOpts.Command("whoami", "-json")
 | 
						Conversation chat1.ConvSummary
 | 
				
			||||||
	output, err := p.StdoutPipe()
 | 
					}
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	p.ExtraFiles = []*os.File{output.(*os.File)}
 | 
					 | 
				
			||||||
	if err = p.Start(); err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	doneCh := make(chan error)
 | 
					type SubscriptionWalletEvent struct {
 | 
				
			||||||
	go func() {
 | 
						Payment stellar1.PaymentDetailsLocal
 | 
				
			||||||
		defer func() { close(doneCh) }()
 | 
					}
 | 
				
			||||||
		statusJSON, err := ioutil.ReadAll(output)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			doneCh <- fmt.Errorf("error reading whoami output: %v", err)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		var status keybase1.CurrentStatus
 | 
					 | 
				
			||||||
		if err := json.Unmarshal(statusJSON, &status); err != nil {
 | 
					 | 
				
			||||||
			doneCh <- fmt.Errorf("invalid whoami JSON %q: %v", statusJSON, err)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if status.LoggedIn && status.User != nil {
 | 
					 | 
				
			||||||
			username = status.User.Username
 | 
					 | 
				
			||||||
			doneCh <- nil
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			doneCh <- fmt.Errorf("unable to authenticate to keybase service: logged in: %v user: %+v", status.LoggedIn, status.User)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// Cleanup the command
 | 
					 | 
				
			||||||
		if err := p.Wait(); err != nil {
 | 
					 | 
				
			||||||
			log.Printf("unable to wait for cmd: %v", err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Subscription has methods to control the background message fetcher loop
 | 
				
			||||||
 | 
					type Subscription struct {
 | 
				
			||||||
 | 
						*DebugOutput
 | 
				
			||||||
 | 
						sync.Mutex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						newMsgsCh   chan SubscriptionMessage
 | 
				
			||||||
 | 
						newConvsCh  chan SubscriptionConversation
 | 
				
			||||||
 | 
						newWalletCh chan SubscriptionWalletEvent
 | 
				
			||||||
 | 
						errorCh     chan error
 | 
				
			||||||
 | 
						running     bool
 | 
				
			||||||
 | 
						shutdownCh  chan struct{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewSubscription() *Subscription {
 | 
				
			||||||
 | 
						newMsgsCh := make(chan SubscriptionMessage, 100)
 | 
				
			||||||
 | 
						newConvsCh := make(chan SubscriptionConversation, 100)
 | 
				
			||||||
 | 
						newWalletCh := make(chan SubscriptionWalletEvent, 100)
 | 
				
			||||||
 | 
						errorCh := make(chan error, 100)
 | 
				
			||||||
 | 
						shutdownCh := make(chan struct{})
 | 
				
			||||||
 | 
						return &Subscription{
 | 
				
			||||||
 | 
							DebugOutput: NewDebugOutput("Subscription"),
 | 
				
			||||||
 | 
							newMsgsCh:   newMsgsCh,
 | 
				
			||||||
 | 
							newConvsCh:  newConvsCh,
 | 
				
			||||||
 | 
							newWalletCh: newWalletCh,
 | 
				
			||||||
 | 
							shutdownCh:  shutdownCh,
 | 
				
			||||||
 | 
							errorCh:     errorCh,
 | 
				
			||||||
 | 
							running:     true,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Read blocks until a new message arrives
 | 
				
			||||||
 | 
					func (m *Subscription) Read() (msg SubscriptionMessage, err error) {
 | 
				
			||||||
 | 
						defer m.Trace(&err, "Read")()
 | 
				
			||||||
	select {
 | 
						select {
 | 
				
			||||||
	case err = <-doneCh:
 | 
						case msg = <-m.newMsgsCh:
 | 
				
			||||||
		if err != nil {
 | 
							return msg, nil
 | 
				
			||||||
			return "", err
 | 
						case err = <-m.errorCh:
 | 
				
			||||||
		}
 | 
							return SubscriptionMessage{}, err
 | 
				
			||||||
	case <-time.After(5 * time.Second):
 | 
						case <-m.shutdownCh:
 | 
				
			||||||
		return "", errors.New("unable to run Keybase command")
 | 
							return SubscriptionMessage{}, errors.New("Subscription shutdown")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return username, nil
 | 
					func (m *Subscription) ReadNewConvs() (conv SubscriptionConversation, err error) {
 | 
				
			||||||
 | 
						defer m.Trace(&err, "ReadNewConvs")()
 | 
				
			||||||
 | 
						select {
 | 
				
			||||||
 | 
						case conv = <-m.newConvsCh:
 | 
				
			||||||
 | 
							return conv, nil
 | 
				
			||||||
 | 
						case err = <-m.errorCh:
 | 
				
			||||||
 | 
							return SubscriptionConversation{}, err
 | 
				
			||||||
 | 
						case <-m.shutdownCh:
 | 
				
			||||||
 | 
							return SubscriptionConversation{}, errors.New("Subscription shutdown")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Read blocks until a new message arrives
 | 
				
			||||||
 | 
					func (m *Subscription) ReadWallet() (msg SubscriptionWalletEvent, err error) {
 | 
				
			||||||
 | 
						defer m.Trace(&err, "ReadWallet")()
 | 
				
			||||||
 | 
						select {
 | 
				
			||||||
 | 
						case msg = <-m.newWalletCh:
 | 
				
			||||||
 | 
							return msg, nil
 | 
				
			||||||
 | 
						case err = <-m.errorCh:
 | 
				
			||||||
 | 
							return SubscriptionWalletEvent{}, err
 | 
				
			||||||
 | 
						case <-m.shutdownCh:
 | 
				
			||||||
 | 
							return SubscriptionWalletEvent{}, errors.New("Subscription shutdown")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Shutdown terminates the background process
 | 
				
			||||||
 | 
					func (m *Subscription) Shutdown() {
 | 
				
			||||||
 | 
						defer m.Trace(nil, "Shutdown")()
 | 
				
			||||||
 | 
						m.Lock()
 | 
				
			||||||
 | 
						defer m.Unlock()
 | 
				
			||||||
 | 
						if m.running {
 | 
				
			||||||
 | 
							close(m.shutdownCh)
 | 
				
			||||||
 | 
							m.running = false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ListenOptions struct {
 | 
				
			||||||
 | 
						Wallet bool
 | 
				
			||||||
 | 
						Convs  bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type PaymentHolder struct {
 | 
				
			||||||
 | 
						Payment stellar1.PaymentDetailsLocal `json:"notification"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TypeHolder struct {
 | 
				
			||||||
 | 
						Type string `json:"type"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type OneshotOptions struct {
 | 
					type OneshotOptions struct {
 | 
				
			||||||
@@ -110,22 +156,101 @@ func (r RunOptions) Command(args ...string) *exec.Cmd {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Start fires up the Keybase JSON API in stdin/stdout mode
 | 
					// Start fires up the Keybase JSON API in stdin/stdout mode
 | 
				
			||||||
func Start(runOpts RunOptions) (*API, error) {
 | 
					func Start(runOpts RunOptions, opts ...func(*API)) (*API, error) {
 | 
				
			||||||
	api := &API{
 | 
						api := NewAPI(runOpts, opts...)
 | 
				
			||||||
		runOpts: runOpts,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := api.startPipes(); err != nil {
 | 
						if err := api.startPipes(); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return api, nil
 | 
						return api, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// API is the main object used for communicating with the Keybase JSON API
 | 
				
			||||||
 | 
					type API struct {
 | 
				
			||||||
 | 
						sync.Mutex
 | 
				
			||||||
 | 
						*DebugOutput
 | 
				
			||||||
 | 
						apiInput      io.Writer
 | 
				
			||||||
 | 
						apiOutput     *bufio.Reader
 | 
				
			||||||
 | 
						apiCmd        *exec.Cmd
 | 
				
			||||||
 | 
						username      string
 | 
				
			||||||
 | 
						runOpts       RunOptions
 | 
				
			||||||
 | 
						subscriptions []*Subscription
 | 
				
			||||||
 | 
						Timeout       time.Duration
 | 
				
			||||||
 | 
						LogSendBytes  int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CustomTimeout(timeout time.Duration) func(*API) {
 | 
				
			||||||
 | 
						return func(a *API) {
 | 
				
			||||||
 | 
							a.Timeout = timeout
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewAPI(runOpts RunOptions, opts ...func(*API)) *API {
 | 
				
			||||||
 | 
						api := &API{
 | 
				
			||||||
 | 
							DebugOutput:  NewDebugOutput("API"),
 | 
				
			||||||
 | 
							runOpts:      runOpts,
 | 
				
			||||||
 | 
							Timeout:      5 * time.Second,
 | 
				
			||||||
 | 
							LogSendBytes: 1024 * 1024 * 5, // request 5MB so we don't get killed
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, opt := range opts {
 | 
				
			||||||
 | 
							opt(api)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return api
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) Command(args ...string) *exec.Cmd {
 | 
					func (a *API) Command(args ...string) *exec.Cmd {
 | 
				
			||||||
	return a.runOpts.Command(args...)
 | 
						return a.runOpts.Command(args...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (a *API) getUsername(runOpts RunOptions) (username string, err error) {
 | 
				
			||||||
 | 
						p := runOpts.Command("whoami", "-json")
 | 
				
			||||||
 | 
						output, err := p.StdoutPipe()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						p.ExtraFiles = []*os.File{output.(*os.File)}
 | 
				
			||||||
 | 
						if err = p.Start(); err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						doneCh := make(chan error)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							defer func() { close(doneCh) }()
 | 
				
			||||||
 | 
							statusJSON, err := ioutil.ReadAll(output)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								doneCh <- fmt.Errorf("error reading whoami output: %v", err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var status keybase1.CurrentStatus
 | 
				
			||||||
 | 
							if err := json.Unmarshal(statusJSON, &status); err != nil {
 | 
				
			||||||
 | 
								doneCh <- fmt.Errorf("invalid whoami JSON %q: %v", statusJSON, err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if status.LoggedIn && status.User != nil {
 | 
				
			||||||
 | 
								username = status.User.Username
 | 
				
			||||||
 | 
								doneCh <- nil
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								doneCh <- fmt.Errorf("unable to authenticate to keybase service: logged in: %v user: %+v", status.LoggedIn, status.User)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Cleanup the command
 | 
				
			||||||
 | 
							if err := p.Wait(); err != nil {
 | 
				
			||||||
 | 
								a.Debug("unable to wait for cmd: %v", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						select {
 | 
				
			||||||
 | 
						case err = <-doneCh:
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return "", err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case <-time.After(a.Timeout):
 | 
				
			||||||
 | 
							return "", errors.New("unable to run Keybase command")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return username, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) auth() (string, error) {
 | 
					func (a *API) auth() (string, error) {
 | 
				
			||||||
	username, err := getUsername(a.runOpts)
 | 
						username, err := a.getUsername(a.runOpts)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		return username, nil
 | 
							return username, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -194,8 +319,6 @@ func (a *API) startPipes() (err error) {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var errAPIDisconnected = errors.New("chat API disconnected")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (a *API) getAPIPipesLocked() (io.Writer, *bufio.Reader, error) {
 | 
					func (a *API) getAPIPipesLocked() (io.Writer, *bufio.Reader, error) {
 | 
				
			||||||
	// this should only be called inside a lock
 | 
						// this should only be called inside a lock
 | 
				
			||||||
	if a.apiCmd == nil {
 | 
						if a.apiCmd == nil {
 | 
				
			||||||
@@ -214,7 +337,7 @@ func (a *API) doSend(arg interface{}) (resp SendResponse, err error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	bArg, err := json.Marshal(arg)
 | 
						bArg, err := json.Marshal(arg)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return SendResponse{}, err
 | 
							return SendResponse{}, fmt.Errorf("unable to send arg: %+v: %v", arg, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	input, output, err := a.getAPIPipesLocked()
 | 
						input, output, err := a.getAPIPipesLocked()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -228,7 +351,7 @@ func (a *API) doSend(arg interface{}) (resp SendResponse, err error) {
 | 
				
			|||||||
		return SendResponse{}, err
 | 
							return SendResponse{}, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := json.Unmarshal(responseRaw, &resp); err != nil {
 | 
						if err := json.Unmarshal(responseRaw, &resp); err != nil {
 | 
				
			||||||
		return resp, fmt.Errorf("failed to decode API response: %s", err)
 | 
							return resp, fmt.Errorf("failed to decode API response: %v %v", responseRaw, err)
 | 
				
			||||||
	} else if resp.Error != nil {
 | 
						} else if resp.Error != nil {
 | 
				
			||||||
		return resp, errors.New(resp.Error.Message)
 | 
							return resp, errors.New(resp.Error.Message)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -254,97 +377,13 @@ func (a *API) doFetch(apiInput string) ([]byte, error) {
 | 
				
			|||||||
	return byteOutput, nil
 | 
						return byteOutput, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SubscriptionMessage contains a message and conversation object
 | 
					 | 
				
			||||||
type SubscriptionMessage struct {
 | 
					 | 
				
			||||||
	Message      chat1.MsgSummary
 | 
					 | 
				
			||||||
	Conversation chat1.ConvSummary
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type SubscriptionConversation struct {
 | 
					 | 
				
			||||||
	Conversation chat1.ConvSummary
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type SubscriptionWalletEvent struct {
 | 
					 | 
				
			||||||
	Payment stellar1.PaymentDetailsLocal
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewSubscription has methods to control the background message fetcher loop
 | 
					 | 
				
			||||||
type NewSubscription struct {
 | 
					 | 
				
			||||||
	sync.Mutex
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	newMsgsCh   <-chan SubscriptionMessage
 | 
					 | 
				
			||||||
	newConvsCh  <-chan SubscriptionConversation
 | 
					 | 
				
			||||||
	newWalletCh <-chan SubscriptionWalletEvent
 | 
					 | 
				
			||||||
	errorCh     <-chan error
 | 
					 | 
				
			||||||
	running     bool
 | 
					 | 
				
			||||||
	shutdownCh  chan struct{}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Read blocks until a new message arrives
 | 
					 | 
				
			||||||
func (m *NewSubscription) Read() (SubscriptionMessage, error) {
 | 
					 | 
				
			||||||
	select {
 | 
					 | 
				
			||||||
	case msg := <-m.newMsgsCh:
 | 
					 | 
				
			||||||
		return msg, nil
 | 
					 | 
				
			||||||
	case err := <-m.errorCh:
 | 
					 | 
				
			||||||
		return SubscriptionMessage{}, err
 | 
					 | 
				
			||||||
	case <-m.shutdownCh:
 | 
					 | 
				
			||||||
		return SubscriptionMessage{}, errors.New("Subscription shutdown")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *NewSubscription) ReadNewConvs() (SubscriptionConversation, error) {
 | 
					 | 
				
			||||||
	select {
 | 
					 | 
				
			||||||
	case conv := <-m.newConvsCh:
 | 
					 | 
				
			||||||
		return conv, nil
 | 
					 | 
				
			||||||
	case err := <-m.errorCh:
 | 
					 | 
				
			||||||
		return SubscriptionConversation{}, err
 | 
					 | 
				
			||||||
	case <-m.shutdownCh:
 | 
					 | 
				
			||||||
		return SubscriptionConversation{}, errors.New("Subscription shutdown")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Read blocks until a new message arrives
 | 
					 | 
				
			||||||
func (m *NewSubscription) ReadWallet() (SubscriptionWalletEvent, error) {
 | 
					 | 
				
			||||||
	select {
 | 
					 | 
				
			||||||
	case msg := <-m.newWalletCh:
 | 
					 | 
				
			||||||
		return msg, nil
 | 
					 | 
				
			||||||
	case err := <-m.errorCh:
 | 
					 | 
				
			||||||
		return SubscriptionWalletEvent{}, err
 | 
					 | 
				
			||||||
	case <-m.shutdownCh:
 | 
					 | 
				
			||||||
		return SubscriptionWalletEvent{}, errors.New("Subscription shutdown")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Shutdown terminates the background process
 | 
					 | 
				
			||||||
func (m *NewSubscription) Shutdown() {
 | 
					 | 
				
			||||||
	m.Lock()
 | 
					 | 
				
			||||||
	defer m.Unlock()
 | 
					 | 
				
			||||||
	if m.running {
 | 
					 | 
				
			||||||
		close(m.shutdownCh)
 | 
					 | 
				
			||||||
		m.running = false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type ListenOptions struct {
 | 
					 | 
				
			||||||
	Wallet bool
 | 
					 | 
				
			||||||
	Convs  bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type PaymentHolder struct {
 | 
					 | 
				
			||||||
	Payment stellar1.PaymentDetailsLocal `json:"notification"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type TypeHolder struct {
 | 
					 | 
				
			||||||
	Type string `json:"type"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ListenForNewTextMessages proxies to Listen without wallet events
 | 
					// ListenForNewTextMessages proxies to Listen without wallet events
 | 
				
			||||||
func (a *API) ListenForNewTextMessages() (*NewSubscription, error) {
 | 
					func (a *API) ListenForNewTextMessages() (*Subscription, error) {
 | 
				
			||||||
	opts := ListenOptions{Wallet: false}
 | 
						opts := ListenOptions{Wallet: false}
 | 
				
			||||||
	return a.Listen(opts)
 | 
						return a.Listen(opts)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) registerSubscription(sub *NewSubscription) {
 | 
					func (a *API) registerSubscription(sub *Subscription) {
 | 
				
			||||||
	a.Lock()
 | 
						a.Lock()
 | 
				
			||||||
	defer a.Unlock()
 | 
						defer a.Unlock()
 | 
				
			||||||
	a.subscriptions = append(a.subscriptions, sub)
 | 
						a.subscriptions = append(a.subscriptions, sub)
 | 
				
			||||||
@@ -352,30 +391,17 @@ func (a *API) registerSubscription(sub *NewSubscription) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Listen fires of a background loop and puts chat messages and wallet
 | 
					// Listen fires of a background loop and puts chat messages and wallet
 | 
				
			||||||
// events into channels
 | 
					// events into channels
 | 
				
			||||||
func (a *API) Listen(opts ListenOptions) (*NewSubscription, error) {
 | 
					func (a *API) Listen(opts ListenOptions) (*Subscription, error) {
 | 
				
			||||||
	newMsgsCh := make(chan SubscriptionMessage, 100)
 | 
					 | 
				
			||||||
	newConvsCh := make(chan SubscriptionConversation, 100)
 | 
					 | 
				
			||||||
	newWalletCh := make(chan SubscriptionWalletEvent, 100)
 | 
					 | 
				
			||||||
	errorCh := make(chan error, 100)
 | 
					 | 
				
			||||||
	shutdownCh := make(chan struct{})
 | 
					 | 
				
			||||||
	done := make(chan struct{})
 | 
						done := make(chan struct{})
 | 
				
			||||||
 | 
						sub := NewSubscription()
 | 
				
			||||||
	sub := &NewSubscription{
 | 
					 | 
				
			||||||
		newMsgsCh:   newMsgsCh,
 | 
					 | 
				
			||||||
		newConvsCh:  newConvsCh,
 | 
					 | 
				
			||||||
		newWalletCh: newWalletCh,
 | 
					 | 
				
			||||||
		shutdownCh:  shutdownCh,
 | 
					 | 
				
			||||||
		errorCh:     errorCh,
 | 
					 | 
				
			||||||
		running:     true,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	a.registerSubscription(sub)
 | 
						a.registerSubscription(sub)
 | 
				
			||||||
	pause := 2 * time.Second
 | 
						pause := 2 * time.Second
 | 
				
			||||||
	readScanner := func(boutput *bufio.Scanner) {
 | 
						readScanner := func(boutput *bufio.Scanner) {
 | 
				
			||||||
		defer func() { done <- struct{}{} }()
 | 
							defer func() { done <- struct{}{} }()
 | 
				
			||||||
		for {
 | 
							for {
 | 
				
			||||||
			select {
 | 
								select {
 | 
				
			||||||
			case <-shutdownCh:
 | 
								case <-sub.shutdownCh:
 | 
				
			||||||
				log.Printf("readScanner: received shutdown")
 | 
									a.Debug("readScanner: received shutdown")
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -383,18 +409,18 @@ func (a *API) Listen(opts ListenOptions) (*NewSubscription, error) {
 | 
				
			|||||||
			t := boutput.Text()
 | 
								t := boutput.Text()
 | 
				
			||||||
			var typeHolder TypeHolder
 | 
								var typeHolder TypeHolder
 | 
				
			||||||
			if err := json.Unmarshal([]byte(t), &typeHolder); err != nil {
 | 
								if err := json.Unmarshal([]byte(t), &typeHolder); err != nil {
 | 
				
			||||||
				errorCh <- err
 | 
									sub.errorCh <- fmt.Errorf("err: %v, data: %v", err, t)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			switch typeHolder.Type {
 | 
								switch typeHolder.Type {
 | 
				
			||||||
			case "chat":
 | 
								case "chat":
 | 
				
			||||||
				var notification chat1.MsgNotification
 | 
									var notification chat1.MsgNotification
 | 
				
			||||||
				if err := json.Unmarshal([]byte(t), ¬ification); err != nil {
 | 
									if err := json.Unmarshal([]byte(t), ¬ification); err != nil {
 | 
				
			||||||
					errorCh <- err
 | 
										sub.errorCh <- fmt.Errorf("err: %v, data: %v", err, t)
 | 
				
			||||||
					break
 | 
										break
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if notification.Error != nil {
 | 
									if notification.Error != nil {
 | 
				
			||||||
					log.Printf("error message received: %s", *notification.Error)
 | 
										a.Debug("error message received: %s", *notification.Error)
 | 
				
			||||||
				} else if notification.Msg != nil {
 | 
									} else if notification.Msg != nil {
 | 
				
			||||||
					subscriptionMessage := SubscriptionMessage{
 | 
										subscriptionMessage := SubscriptionMessage{
 | 
				
			||||||
						Message: *notification.Msg,
 | 
											Message: *notification.Msg,
 | 
				
			||||||
@@ -403,30 +429,30 @@ func (a *API) Listen(opts ListenOptions) (*NewSubscription, error) {
 | 
				
			|||||||
							Channel: notification.Msg.Channel,
 | 
												Channel: notification.Msg.Channel,
 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					newMsgsCh <- subscriptionMessage
 | 
										sub.newMsgsCh <- subscriptionMessage
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case "chat_conv":
 | 
								case "chat_conv":
 | 
				
			||||||
				var notification chat1.ConvNotification
 | 
									var notification chat1.ConvNotification
 | 
				
			||||||
				if err := json.Unmarshal([]byte(t), ¬ification); err != nil {
 | 
									if err := json.Unmarshal([]byte(t), ¬ification); err != nil {
 | 
				
			||||||
					errorCh <- err
 | 
										sub.errorCh <- fmt.Errorf("err: %v, data: %v", err, t)
 | 
				
			||||||
					break
 | 
										break
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if notification.Error != nil {
 | 
									if notification.Error != nil {
 | 
				
			||||||
					log.Printf("error message received: %s", *notification.Error)
 | 
										a.Debug("error message received: %s", *notification.Error)
 | 
				
			||||||
				} else if notification.Conv != nil {
 | 
									} else if notification.Conv != nil {
 | 
				
			||||||
					subscriptionConv := SubscriptionConversation{
 | 
										subscriptionConv := SubscriptionConversation{
 | 
				
			||||||
						Conversation: *notification.Conv,
 | 
											Conversation: *notification.Conv,
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					newConvsCh <- subscriptionConv
 | 
										sub.newConvsCh <- subscriptionConv
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case "wallet":
 | 
								case "wallet":
 | 
				
			||||||
				var holder PaymentHolder
 | 
									var holder PaymentHolder
 | 
				
			||||||
				if err := json.Unmarshal([]byte(t), &holder); err != nil {
 | 
									if err := json.Unmarshal([]byte(t), &holder); err != nil {
 | 
				
			||||||
					errorCh <- err
 | 
										sub.errorCh <- fmt.Errorf("err: %v, data: %v", err, t)
 | 
				
			||||||
					break
 | 
										break
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				subscriptionPayment := SubscriptionWalletEvent(holder)
 | 
									subscriptionPayment := SubscriptionWalletEvent(holder)
 | 
				
			||||||
				newWalletCh <- subscriptionPayment
 | 
									sub.newWalletCh <- subscriptionPayment
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -434,31 +460,31 @@ func (a *API) Listen(opts ListenOptions) (*NewSubscription, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	attempts := 0
 | 
						attempts := 0
 | 
				
			||||||
	maxAttempts := 1800
 | 
						maxAttempts := 30
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		defer func() {
 | 
							defer func() {
 | 
				
			||||||
			close(newMsgsCh)
 | 
								close(sub.newMsgsCh)
 | 
				
			||||||
			close(newConvsCh)
 | 
								close(sub.newConvsCh)
 | 
				
			||||||
			close(newWalletCh)
 | 
								close(sub.newWalletCh)
 | 
				
			||||||
			close(errorCh)
 | 
								close(sub.errorCh)
 | 
				
			||||||
		}()
 | 
							}()
 | 
				
			||||||
		for {
 | 
							for {
 | 
				
			||||||
			select {
 | 
								select {
 | 
				
			||||||
			case <-shutdownCh:
 | 
								case <-sub.shutdownCh:
 | 
				
			||||||
				log.Printf("Listen: received shutdown")
 | 
									a.Debug("Listen: received shutdown")
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if attempts >= maxAttempts {
 | 
								if attempts >= maxAttempts {
 | 
				
			||||||
				if err := a.LogSend("Listen: failed to auth, giving up"); err != nil {
 | 
									if err := a.LogSend("Listen: failed to auth, giving up"); err != nil {
 | 
				
			||||||
					log.Printf("Listen: logsend failed to send: %v", err)
 | 
										a.Debug("Listen: logsend failed to send: %v", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				panic("Listen: failed to auth, giving up")
 | 
									panic("Listen: failed to auth, giving up")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			attempts++
 | 
								attempts++
 | 
				
			||||||
			if _, err := a.auth(); err != nil {
 | 
								if _, err := a.auth(); err != nil {
 | 
				
			||||||
				log.Printf("Listen: failed to auth: %s", err)
 | 
									a.Debug("Listen: failed to auth: %s", err)
 | 
				
			||||||
				time.Sleep(pause)
 | 
									time.Sleep(pause)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -472,13 +498,13 @@ func (a *API) Listen(opts ListenOptions) (*NewSubscription, error) {
 | 
				
			|||||||
			p := a.runOpts.Command(cmdElements...)
 | 
								p := a.runOpts.Command(cmdElements...)
 | 
				
			||||||
			output, err := p.StdoutPipe()
 | 
								output, err := p.StdoutPipe()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				log.Printf("Listen: failed to listen: %s", err)
 | 
									a.Debug("Listen: failed to listen: %s", err)
 | 
				
			||||||
				time.Sleep(pause)
 | 
									time.Sleep(pause)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			stderr, err := p.StderrPipe()
 | 
								stderr, err := p.StderrPipe()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				log.Printf("Listen: failed to listen to stderr: %s", err)
 | 
									a.Debug("Listen: failed to listen to stderr: %s", err)
 | 
				
			||||||
				time.Sleep(pause)
 | 
									time.Sleep(pause)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -486,19 +512,27 @@ func (a *API) Listen(opts ListenOptions) (*NewSubscription, error) {
 | 
				
			|||||||
			boutput := bufio.NewScanner(output)
 | 
								boutput := bufio.NewScanner(output)
 | 
				
			||||||
			if err := p.Start(); err != nil {
 | 
								if err := p.Start(); err != nil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				log.Printf("Listen: failed to make listen scanner: %s", err)
 | 
									a.Debug("Listen: failed to make listen scanner: %s", err)
 | 
				
			||||||
				time.Sleep(pause)
 | 
									time.Sleep(pause)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			attempts = 0
 | 
								attempts = 0
 | 
				
			||||||
			go readScanner(boutput)
 | 
								go readScanner(boutput)
 | 
				
			||||||
			<-done
 | 
								select {
 | 
				
			||||||
 | 
								case <-sub.shutdownCh:
 | 
				
			||||||
 | 
									a.Debug("Listen: received shutdown")
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								case <-done:
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			if err := p.Wait(); err != nil {
 | 
								if err := p.Wait(); err != nil {
 | 
				
			||||||
				stderrBytes, rerr := ioutil.ReadAll(stderr)
 | 
									stderrBytes, rerr := ioutil.ReadAll(stderr)
 | 
				
			||||||
				if rerr != nil {
 | 
									if rerr != nil {
 | 
				
			||||||
					stderrBytes = []byte("failed to get stderr")
 | 
										stderrBytes = []byte(fmt.Sprintf("failed to get stderr: %v", rerr))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									a.Debug("Listen: failed to Wait for command, restarting pipes: %s (```%s```)", err, stderrBytes)
 | 
				
			||||||
 | 
									if err := a.startPipes(); err != nil {
 | 
				
			||||||
 | 
										a.Debug("Listen: failed to restart pipes: %v", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				log.Printf("Listen: failed to Wait for command: %s (```%s```)", err, stderrBytes)
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			time.Sleep(pause)
 | 
								time.Sleep(pause)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -515,31 +549,27 @@ func (a *API) LogSend(feedback string) error {
 | 
				
			|||||||
		"log", "send",
 | 
							"log", "send",
 | 
				
			||||||
		"--no-confirm",
 | 
							"--no-confirm",
 | 
				
			||||||
		"--feedback", feedback,
 | 
							"--feedback", feedback,
 | 
				
			||||||
 | 
							"-n", fmt.Sprintf("%d", a.LogSendBytes),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// We're determining whether the service is already running by running status
 | 
					 | 
				
			||||||
	// with autofork disabled.
 | 
					 | 
				
			||||||
	if err := a.runOpts.Command("--no-auto-fork", "status"); err != nil {
 | 
					 | 
				
			||||||
		// Assume that there's no service running, so log send as standalone
 | 
					 | 
				
			||||||
		args = append([]string{"--standalone"}, args...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return a.runOpts.Command(args...).Run()
 | 
						return a.runOpts.Command(args...).Run()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) Shutdown() error {
 | 
					func (a *API) Shutdown() (err error) {
 | 
				
			||||||
 | 
						defer a.Trace(&err, "Shutdown")()
 | 
				
			||||||
	a.Lock()
 | 
						a.Lock()
 | 
				
			||||||
	defer a.Unlock()
 | 
						defer a.Unlock()
 | 
				
			||||||
	for _, sub := range a.subscriptions {
 | 
						for _, sub := range a.subscriptions {
 | 
				
			||||||
		sub.Shutdown()
 | 
							sub.Shutdown()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if a.apiCmd != nil {
 | 
						if a.apiCmd != nil {
 | 
				
			||||||
 | 
							a.Debug("waiting for API command")
 | 
				
			||||||
		if err := a.apiCmd.Wait(); err != nil {
 | 
							if err := a.apiCmd.Wait(); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if a.runOpts.Oneshot != nil {
 | 
						if a.runOpts.Oneshot != nil {
 | 
				
			||||||
 | 
							a.Debug("logging out")
 | 
				
			||||||
		err := a.runOpts.Command("logout", "--force").Run()
 | 
							err := a.runOpts.Command("logout", "--force").Run()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
@@ -547,6 +577,7 @@ func (a *API) Shutdown() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if a.runOpts.StartService {
 | 
						if a.runOpts.StartService {
 | 
				
			||||||
 | 
							a.Debug("stopping service")
 | 
				
			||||||
		err := a.runOpts.Command("ctl", "stop", "--shutdown").Run()
 | 
							err := a.runOpts.Command("ctl", "stop", "--shutdown").Run()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,7 +26,11 @@ type ListUserMemberships struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) ListMembersOfTeam(teamName string) (res keybase1.TeamMembersDetails, err error) {
 | 
					func (a *API) ListMembersOfTeam(teamName string) (res keybase1.TeamMembersDetails, err error) {
 | 
				
			||||||
	apiInput := fmt.Sprintf(`{"method": "list-team-memberships", "params": {"options": {"team": "%s"}}}`, teamName)
 | 
						teamNameEscaped, err := json.Marshal(teamName)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return res, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						apiInput := fmt.Sprintf(`{"method": "list-team-memberships", "params": {"options": {"team": %s}}}`, teamNameEscaped)
 | 
				
			||||||
	cmd := a.runOpts.Command("team", "api")
 | 
						cmd := a.runOpts.Command("team", "api")
 | 
				
			||||||
	cmd.Stdin = strings.NewReader(apiInput)
 | 
						cmd.Stdin = strings.NewReader(apiInput)
 | 
				
			||||||
	var stderr bytes.Buffer
 | 
						var stderr bytes.Buffer
 | 
				
			||||||
@@ -51,7 +55,11 @@ func (a *API) ListMembersOfTeam(teamName string) (res keybase1.TeamMembersDetail
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *API) ListUserMemberships(username string) ([]keybase1.AnnotatedMemberInfo, error) {
 | 
					func (a *API) ListUserMemberships(username string) ([]keybase1.AnnotatedMemberInfo, error) {
 | 
				
			||||||
	apiInput := fmt.Sprintf(`{"method": "list-user-memberships", "params": {"options": {"username": "%s"}}}`, username)
 | 
						usernameEscaped, err := json.Marshal(username)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						apiInput := fmt.Sprintf(`{"method": "list-user-memberships", "params": {"options": {"username": %s}}}`, usernameEscaped)
 | 
				
			||||||
	cmd := a.runOpts.Command("team", "api")
 | 
						cmd := a.runOpts.Command("team", "api")
 | 
				
			||||||
	cmd.Stdin = strings.NewReader(apiInput)
 | 
						cmd.Stdin = strings.NewReader(apiInput)
 | 
				
			||||||
	var stderr bytes.Buffer
 | 
						var stderr bytes.Buffer
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										140
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/api.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										140
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/api.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/api.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/api.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
@@ -139,9 +139,119 @@ func (o MsgFlipContent) DeepCopy() MsgFlipContent {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiContent struct {
 | 
				
			||||||
 | 
						Alias       string     `codec:"alias" json:"alias"`
 | 
				
			||||||
 | 
						IsCrossTeam bool       `codec:"isCrossTeam" json:"isCrossTeam"`
 | 
				
			||||||
 | 
						ConvID      *ConvIDStr `codec:"convID,omitempty" json:"convID,omitempty"`
 | 
				
			||||||
 | 
						MessageID   *MessageID `codec:"messageID,omitempty" json:"messageID,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiContent) DeepCopy() EmojiContent {
 | 
				
			||||||
 | 
						return EmojiContent{
 | 
				
			||||||
 | 
							Alias:       o.Alias,
 | 
				
			||||||
 | 
							IsCrossTeam: o.IsCrossTeam,
 | 
				
			||||||
 | 
							ConvID: (func(x *ConvIDStr) *ConvIDStr {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.ConvID),
 | 
				
			||||||
 | 
							MessageID: (func(x *MessageID) *MessageID {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.MessageID),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type MsgTextContent struct {
 | 
				
			||||||
 | 
						Body         string             `codec:"body" json:"body"`
 | 
				
			||||||
 | 
						Payments     []TextPayment      `codec:"payments" json:"payments"`
 | 
				
			||||||
 | 
						ReplyTo      *MessageID         `codec:"replyTo,omitempty" json:"replyTo,omitempty"`
 | 
				
			||||||
 | 
						ReplyToUID   *string            `codec:"replyToUID,omitempty" json:"replyToUID,omitempty"`
 | 
				
			||||||
 | 
						UserMentions []KnownUserMention `codec:"userMentions" json:"userMentions"`
 | 
				
			||||||
 | 
						TeamMentions []KnownTeamMention `codec:"teamMentions" json:"teamMentions"`
 | 
				
			||||||
 | 
						LiveLocation *LiveLocation      `codec:"liveLocation,omitempty" json:"liveLocation,omitempty"`
 | 
				
			||||||
 | 
						Emojis       []EmojiContent     `codec:"emojis" json:"emojis"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o MsgTextContent) DeepCopy() MsgTextContent {
 | 
				
			||||||
 | 
						return MsgTextContent{
 | 
				
			||||||
 | 
							Body: o.Body,
 | 
				
			||||||
 | 
							Payments: (func(x []TextPayment) []TextPayment {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]TextPayment, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Payments),
 | 
				
			||||||
 | 
							ReplyTo: (func(x *MessageID) *MessageID {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.ReplyTo),
 | 
				
			||||||
 | 
							ReplyToUID: (func(x *string) *string {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x)
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.ReplyToUID),
 | 
				
			||||||
 | 
							UserMentions: (func(x []KnownUserMention) []KnownUserMention {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]KnownUserMention, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.UserMentions),
 | 
				
			||||||
 | 
							TeamMentions: (func(x []KnownTeamMention) []KnownTeamMention {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]KnownTeamMention, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.TeamMentions),
 | 
				
			||||||
 | 
							LiveLocation: (func(x *LiveLocation) *LiveLocation {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.LiveLocation),
 | 
				
			||||||
 | 
							Emojis: (func(x []EmojiContent) []EmojiContent {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]EmojiContent, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Emojis),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type MsgContent struct {
 | 
					type MsgContent struct {
 | 
				
			||||||
	TypeName           string                       `codec:"typeName" json:"type"`
 | 
						TypeName           string                       `codec:"typeName" json:"type"`
 | 
				
			||||||
	Text               *MessageText                 `codec:"text,omitempty" json:"text,omitempty"`
 | 
						Text               *MsgTextContent              `codec:"text,omitempty" json:"text,omitempty"`
 | 
				
			||||||
	Attachment         *MessageAttachment           `codec:"attachment,omitempty" json:"attachment,omitempty"`
 | 
						Attachment         *MessageAttachment           `codec:"attachment,omitempty" json:"attachment,omitempty"`
 | 
				
			||||||
	Edit               *MessageEdit                 `codec:"edit,omitempty" json:"edit,omitempty"`
 | 
						Edit               *MessageEdit                 `codec:"edit,omitempty" json:"edit,omitempty"`
 | 
				
			||||||
	Reaction           *MessageReaction             `codec:"reaction,omitempty" json:"reaction,omitempty"`
 | 
						Reaction           *MessageReaction             `codec:"reaction,omitempty" json:"reaction,omitempty"`
 | 
				
			||||||
@@ -159,7 +269,7 @@ type MsgContent struct {
 | 
				
			|||||||
func (o MsgContent) DeepCopy() MsgContent {
 | 
					func (o MsgContent) DeepCopy() MsgContent {
 | 
				
			||||||
	return MsgContent{
 | 
						return MsgContent{
 | 
				
			||||||
		TypeName: o.TypeName,
 | 
							TypeName: o.TypeName,
 | 
				
			||||||
		Text: (func(x *MessageText) *MessageText {
 | 
							Text: (func(x *MsgTextContent) *MsgTextContent {
 | 
				
			||||||
			if x == nil {
 | 
								if x == nil {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -269,7 +379,7 @@ type MsgSummary struct {
 | 
				
			|||||||
	IsEphemeral         bool                     `codec:"isEphemeral,omitempty" json:"is_ephemeral,omitempty"`
 | 
						IsEphemeral         bool                     `codec:"isEphemeral,omitempty" json:"is_ephemeral,omitempty"`
 | 
				
			||||||
	IsEphemeralExpired  bool                     `codec:"isEphemeralExpired,omitempty" json:"is_ephemeral_expired,omitempty"`
 | 
						IsEphemeralExpired  bool                     `codec:"isEphemeralExpired,omitempty" json:"is_ephemeral_expired,omitempty"`
 | 
				
			||||||
	ETime               gregor1.Time             `codec:"eTime,omitempty" json:"e_time,omitempty"`
 | 
						ETime               gregor1.Time             `codec:"eTime,omitempty" json:"e_time,omitempty"`
 | 
				
			||||||
	Reactions           *ReactionMap             `codec:"reactions,omitempty" json:"reactions,omitempty"`
 | 
						Reactions           *UIReactionMap           `codec:"reactions,omitempty" json:"reactions,omitempty"`
 | 
				
			||||||
	HasPairwiseMacs     bool                     `codec:"hasPairwiseMacs,omitempty" json:"has_pairwise_macs,omitempty"`
 | 
						HasPairwiseMacs     bool                     `codec:"hasPairwiseMacs,omitempty" json:"has_pairwise_macs,omitempty"`
 | 
				
			||||||
	AtMentionUsernames  []string                 `codec:"atMentionUsernames,omitempty" json:"at_mention_usernames,omitempty"`
 | 
						AtMentionUsernames  []string                 `codec:"atMentionUsernames,omitempty" json:"at_mention_usernames,omitempty"`
 | 
				
			||||||
	ChannelMention      string                   `codec:"channelMention,omitempty" json:"channel_mention,omitempty"`
 | 
						ChannelMention      string                   `codec:"channelMention,omitempty" json:"channel_mention,omitempty"`
 | 
				
			||||||
@@ -304,7 +414,7 @@ func (o MsgSummary) DeepCopy() MsgSummary {
 | 
				
			|||||||
		IsEphemeral:        o.IsEphemeral,
 | 
							IsEphemeral:        o.IsEphemeral,
 | 
				
			||||||
		IsEphemeralExpired: o.IsEphemeralExpired,
 | 
							IsEphemeralExpired: o.IsEphemeralExpired,
 | 
				
			||||||
		ETime:              o.ETime.DeepCopy(),
 | 
							ETime:              o.ETime.DeepCopy(),
 | 
				
			||||||
		Reactions: (func(x *ReactionMap) *ReactionMap {
 | 
							Reactions: (func(x *UIReactionMap) *UIReactionMap {
 | 
				
			||||||
			if x == nil {
 | 
								if x == nil {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -832,6 +942,7 @@ type AdvertiseCommandAPIParam struct {
 | 
				
			|||||||
	Typ      string                `codec:"typ" json:"type"`
 | 
						Typ      string                `codec:"typ" json:"type"`
 | 
				
			||||||
	Commands []UserBotCommandInput `codec:"commands" json:"commands"`
 | 
						Commands []UserBotCommandInput `codec:"commands" json:"commands"`
 | 
				
			||||||
	TeamName string                `codec:"teamName,omitempty" json:"team_name,omitempty"`
 | 
						TeamName string                `codec:"teamName,omitempty" json:"team_name,omitempty"`
 | 
				
			||||||
 | 
						ConvID   ConvIDStr             `codec:"convID,omitempty" json:"conv_id,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o AdvertiseCommandAPIParam) DeepCopy() AdvertiseCommandAPIParam {
 | 
					func (o AdvertiseCommandAPIParam) DeepCopy() AdvertiseCommandAPIParam {
 | 
				
			||||||
@@ -849,6 +960,21 @@ func (o AdvertiseCommandAPIParam) DeepCopy() AdvertiseCommandAPIParam {
 | 
				
			|||||||
			return ret
 | 
								return ret
 | 
				
			||||||
		})(o.Commands),
 | 
							})(o.Commands),
 | 
				
			||||||
		TeamName: o.TeamName,
 | 
							TeamName: o.TeamName,
 | 
				
			||||||
 | 
							ConvID:   o.ConvID.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ClearCommandAPIParam struct {
 | 
				
			||||||
 | 
						Typ      string    `codec:"typ" json:"type"`
 | 
				
			||||||
 | 
						TeamName string    `codec:"teamName,omitempty" json:"team_name,omitempty"`
 | 
				
			||||||
 | 
						ConvID   ConvIDStr `codec:"convID,omitempty" json:"conv_id,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o ClearCommandAPIParam) DeepCopy() ClearCommandAPIParam {
 | 
				
			||||||
 | 
						return ClearCommandAPIParam{
 | 
				
			||||||
 | 
							Typ:      o.Typ,
 | 
				
			||||||
 | 
							TeamName: o.TeamName,
 | 
				
			||||||
 | 
							ConvID:   o.ConvID.DeepCopy(),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -899,7 +1025,7 @@ func (o GetResetConvMembersRes) DeepCopy() GetResetConvMembersRes {
 | 
				
			|||||||
type DeviceInfo struct {
 | 
					type DeviceInfo struct {
 | 
				
			||||||
	DeviceID          keybase1.DeviceID     `codec:"deviceID" json:"id"`
 | 
						DeviceID          keybase1.DeviceID     `codec:"deviceID" json:"id"`
 | 
				
			||||||
	DeviceDescription string                `codec:"deviceDescription" json:"description"`
 | 
						DeviceDescription string                `codec:"deviceDescription" json:"description"`
 | 
				
			||||||
	DeviceType        string            `codec:"deviceType" json:"type"`
 | 
						DeviceType        keybase1.DeviceTypeV2 `codec:"deviceType" json:"type"`
 | 
				
			||||||
	DeviceCtime       int64                 `codec:"deviceCtime" json:"ctime"`
 | 
						DeviceCtime       int64                 `codec:"deviceCtime" json:"ctime"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -907,7 +1033,7 @@ func (o DeviceInfo) DeepCopy() DeviceInfo {
 | 
				
			|||||||
	return DeviceInfo{
 | 
						return DeviceInfo{
 | 
				
			||||||
		DeviceID:          o.DeviceID.DeepCopy(),
 | 
							DeviceID:          o.DeviceID.DeepCopy(),
 | 
				
			||||||
		DeviceDescription: o.DeviceDescription,
 | 
							DeviceDescription: o.DeviceDescription,
 | 
				
			||||||
		DeviceType:        o.DeviceType,
 | 
							DeviceType:        o.DeviceType.DeepCopy(),
 | 
				
			||||||
		DeviceCtime:       o.DeviceCtime,
 | 
							DeviceCtime:       o.DeviceCtime,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/blocking.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/blocking.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/blocking.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/blocking.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										133
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/chat_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										133
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/chat_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/chat_ui.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/chat_ui.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
@@ -537,6 +537,7 @@ type InboxUIItem struct {
 | 
				
			|||||||
	IsDefaultConv     bool                          `codec:"isDefaultConv" json:"isDefaultConv"`
 | 
						IsDefaultConv     bool                          `codec:"isDefaultConv" json:"isDefaultConv"`
 | 
				
			||||||
	Name              string                        `codec:"name" json:"name"`
 | 
						Name              string                        `codec:"name" json:"name"`
 | 
				
			||||||
	Snippet           string                        `codec:"snippet" json:"snippet"`
 | 
						Snippet           string                        `codec:"snippet" json:"snippet"`
 | 
				
			||||||
 | 
						SnippetDecorated  string                        `codec:"snippetDecorated" json:"snippetDecorated"`
 | 
				
			||||||
	SnippetDecoration SnippetDecoration             `codec:"snippetDecoration" json:"snippetDecoration"`
 | 
						SnippetDecoration SnippetDecoration             `codec:"snippetDecoration" json:"snippetDecoration"`
 | 
				
			||||||
	Channel           string                        `codec:"channel" json:"channel"`
 | 
						Channel           string                        `codec:"channel" json:"channel"`
 | 
				
			||||||
	Headline          string                        `codec:"headline" json:"headline"`
 | 
						Headline          string                        `codec:"headline" json:"headline"`
 | 
				
			||||||
@@ -579,6 +580,7 @@ func (o InboxUIItem) DeepCopy() InboxUIItem {
 | 
				
			|||||||
		IsDefaultConv:     o.IsDefaultConv,
 | 
							IsDefaultConv:     o.IsDefaultConv,
 | 
				
			||||||
		Name:              o.Name,
 | 
							Name:              o.Name,
 | 
				
			||||||
		Snippet:           o.Snippet,
 | 
							Snippet:           o.Snippet,
 | 
				
			||||||
 | 
							SnippetDecorated:  o.SnippetDecorated,
 | 
				
			||||||
		SnippetDecoration: o.SnippetDecoration.DeepCopy(),
 | 
							SnippetDecoration: o.SnippetDecoration.DeepCopy(),
 | 
				
			||||||
		Channel:           o.Channel,
 | 
							Channel:           o.Channel,
 | 
				
			||||||
		Headline:          o.Headline,
 | 
							Headline:          o.Headline,
 | 
				
			||||||
@@ -889,6 +891,50 @@ func (o UIMessageUnfurlInfo) DeepCopy() UIMessageUnfurlInfo {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UIReactionDesc struct {
 | 
				
			||||||
 | 
						Decorated string              `codec:"decorated" json:"decorated"`
 | 
				
			||||||
 | 
						Users     map[string]Reaction `codec:"users" json:"users"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UIReactionDesc) DeepCopy() UIReactionDesc {
 | 
				
			||||||
 | 
						return UIReactionDesc{
 | 
				
			||||||
 | 
							Decorated: o.Decorated,
 | 
				
			||||||
 | 
							Users: (func(x map[string]Reaction) map[string]Reaction {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make(map[string]Reaction, len(x))
 | 
				
			||||||
 | 
								for k, v := range x {
 | 
				
			||||||
 | 
									kCopy := k
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[kCopy] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Users),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UIReactionMap struct {
 | 
				
			||||||
 | 
						Reactions map[string]UIReactionDesc `codec:"reactions" json:"reactions"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UIReactionMap) DeepCopy() UIReactionMap {
 | 
				
			||||||
 | 
						return UIReactionMap{
 | 
				
			||||||
 | 
							Reactions: (func(x map[string]UIReactionDesc) map[string]UIReactionDesc {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make(map[string]UIReactionDesc, len(x))
 | 
				
			||||||
 | 
								for k, v := range x {
 | 
				
			||||||
 | 
									kCopy := k
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[kCopy] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Reactions),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type UIMessageValid struct {
 | 
					type UIMessageValid struct {
 | 
				
			||||||
	MessageID             MessageID              `codec:"messageID" json:"messageID"`
 | 
						MessageID             MessageID              `codec:"messageID" json:"messageID"`
 | 
				
			||||||
	Ctime                 gregor1.Time           `codec:"ctime" json:"ctime"`
 | 
						Ctime                 gregor1.Time           `codec:"ctime" json:"ctime"`
 | 
				
			||||||
@@ -898,7 +944,7 @@ type UIMessageValid struct {
 | 
				
			|||||||
	BodySummary           string                 `codec:"bodySummary" json:"bodySummary"`
 | 
						BodySummary           string                 `codec:"bodySummary" json:"bodySummary"`
 | 
				
			||||||
	SenderUsername        string                 `codec:"senderUsername" json:"senderUsername"`
 | 
						SenderUsername        string                 `codec:"senderUsername" json:"senderUsername"`
 | 
				
			||||||
	SenderDeviceName      string                 `codec:"senderDeviceName" json:"senderDeviceName"`
 | 
						SenderDeviceName      string                 `codec:"senderDeviceName" json:"senderDeviceName"`
 | 
				
			||||||
	SenderDeviceType      string                 `codec:"senderDeviceType" json:"senderDeviceType"`
 | 
						SenderDeviceType      keybase1.DeviceTypeV2  `codec:"senderDeviceType" json:"senderDeviceType"`
 | 
				
			||||||
	SenderUID             gregor1.UID            `codec:"senderUID" json:"senderUID"`
 | 
						SenderUID             gregor1.UID            `codec:"senderUID" json:"senderUID"`
 | 
				
			||||||
	SenderDeviceID        gregor1.DeviceID       `codec:"senderDeviceID" json:"senderDeviceID"`
 | 
						SenderDeviceID        gregor1.DeviceID       `codec:"senderDeviceID" json:"senderDeviceID"`
 | 
				
			||||||
	Superseded            bool                   `codec:"superseded" json:"superseded"`
 | 
						Superseded            bool                   `codec:"superseded" json:"superseded"`
 | 
				
			||||||
@@ -911,7 +957,7 @@ type UIMessageValid struct {
 | 
				
			|||||||
	IsEphemeralExpired    bool                   `codec:"isEphemeralExpired" json:"isEphemeralExpired"`
 | 
						IsEphemeralExpired    bool                   `codec:"isEphemeralExpired" json:"isEphemeralExpired"`
 | 
				
			||||||
	ExplodedBy            *string                `codec:"explodedBy,omitempty" json:"explodedBy,omitempty"`
 | 
						ExplodedBy            *string                `codec:"explodedBy,omitempty" json:"explodedBy,omitempty"`
 | 
				
			||||||
	Etime                 gregor1.Time           `codec:"etime" json:"etime"`
 | 
						Etime                 gregor1.Time           `codec:"etime" json:"etime"`
 | 
				
			||||||
	Reactions             ReactionMap            `codec:"reactions" json:"reactions"`
 | 
						Reactions             UIReactionMap          `codec:"reactions" json:"reactions"`
 | 
				
			||||||
	HasPairwiseMacs       bool                   `codec:"hasPairwiseMacs" json:"hasPairwiseMacs"`
 | 
						HasPairwiseMacs       bool                   `codec:"hasPairwiseMacs" json:"hasPairwiseMacs"`
 | 
				
			||||||
	PaymentInfos          []UIPaymentInfo        `codec:"paymentInfos" json:"paymentInfos"`
 | 
						PaymentInfos          []UIPaymentInfo        `codec:"paymentInfos" json:"paymentInfos"`
 | 
				
			||||||
	RequestInfo           *UIRequestInfo         `codec:"requestInfo,omitempty" json:"requestInfo,omitempty"`
 | 
						RequestInfo           *UIRequestInfo         `codec:"requestInfo,omitempty" json:"requestInfo,omitempty"`
 | 
				
			||||||
@@ -947,7 +993,7 @@ func (o UIMessageValid) DeepCopy() UIMessageValid {
 | 
				
			|||||||
		BodySummary:      o.BodySummary,
 | 
							BodySummary:      o.BodySummary,
 | 
				
			||||||
		SenderUsername:   o.SenderUsername,
 | 
							SenderUsername:   o.SenderUsername,
 | 
				
			||||||
		SenderDeviceName: o.SenderDeviceName,
 | 
							SenderDeviceName: o.SenderDeviceName,
 | 
				
			||||||
		SenderDeviceType: o.SenderDeviceType,
 | 
							SenderDeviceType: o.SenderDeviceType.DeepCopy(),
 | 
				
			||||||
		SenderUID:        o.SenderUID.DeepCopy(),
 | 
							SenderUID:        o.SenderUID.DeepCopy(),
 | 
				
			||||||
		SenderDeviceID:   o.SenderDeviceID.DeepCopy(),
 | 
							SenderDeviceID:   o.SenderDeviceID.DeepCopy(),
 | 
				
			||||||
		Superseded:       o.Superseded,
 | 
							Superseded:       o.Superseded,
 | 
				
			||||||
@@ -1068,6 +1114,7 @@ type UIMessageOutbox struct {
 | 
				
			|||||||
	IsEphemeral       bool            `codec:"isEphemeral" json:"isEphemeral"`
 | 
						IsEphemeral       bool            `codec:"isEphemeral" json:"isEphemeral"`
 | 
				
			||||||
	FlipGameID        *FlipGameIDStr  `codec:"flipGameID,omitempty" json:"flipGameID,omitempty"`
 | 
						FlipGameID        *FlipGameIDStr  `codec:"flipGameID,omitempty" json:"flipGameID,omitempty"`
 | 
				
			||||||
	ReplyTo           *UIMessage      `codec:"replyTo,omitempty" json:"replyTo,omitempty"`
 | 
						ReplyTo           *UIMessage      `codec:"replyTo,omitempty" json:"replyTo,omitempty"`
 | 
				
			||||||
 | 
						Supersedes        MessageID       `codec:"supersedes" json:"supersedes"`
 | 
				
			||||||
	Filename          string          `codec:"filename" json:"filename"`
 | 
						Filename          string          `codec:"filename" json:"filename"`
 | 
				
			||||||
	Title             string          `codec:"title" json:"title"`
 | 
						Title             string          `codec:"title" json:"title"`
 | 
				
			||||||
	Preview           *MakePreviewRes `codec:"preview,omitempty" json:"preview,omitempty"`
 | 
						Preview           *MakePreviewRes `codec:"preview,omitempty" json:"preview,omitempty"`
 | 
				
			||||||
@@ -1103,6 +1150,7 @@ func (o UIMessageOutbox) DeepCopy() UIMessageOutbox {
 | 
				
			|||||||
			tmp := (*x).DeepCopy()
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
			return &tmp
 | 
								return &tmp
 | 
				
			||||||
		})(o.ReplyTo),
 | 
							})(o.ReplyTo),
 | 
				
			||||||
 | 
							Supersedes: o.Supersedes.DeepCopy(),
 | 
				
			||||||
		Filename:   o.Filename,
 | 
							Filename:   o.Filename,
 | 
				
			||||||
		Title:      o.Title,
 | 
							Title:      o.Title,
 | 
				
			||||||
		Preview: (func(x *MakePreviewRes) *MakePreviewRes {
 | 
							Preview: (func(x *MakePreviewRes) *MakePreviewRes {
 | 
				
			||||||
@@ -1418,6 +1466,7 @@ const (
 | 
				
			|||||||
	UITextDecorationTyp_LINK               UITextDecorationTyp = 4
 | 
						UITextDecorationTyp_LINK               UITextDecorationTyp = 4
 | 
				
			||||||
	UITextDecorationTyp_MAILTO             UITextDecorationTyp = 5
 | 
						UITextDecorationTyp_MAILTO             UITextDecorationTyp = 5
 | 
				
			||||||
	UITextDecorationTyp_KBFSPATH           UITextDecorationTyp = 6
 | 
						UITextDecorationTyp_KBFSPATH           UITextDecorationTyp = 6
 | 
				
			||||||
 | 
						UITextDecorationTyp_EMOJI              UITextDecorationTyp = 7
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o UITextDecorationTyp) DeepCopy() UITextDecorationTyp { return o }
 | 
					func (o UITextDecorationTyp) DeepCopy() UITextDecorationTyp { return o }
 | 
				
			||||||
@@ -1430,6 +1479,7 @@ var UITextDecorationTypMap = map[string]UITextDecorationTyp{
 | 
				
			|||||||
	"LINK":               4,
 | 
						"LINK":               4,
 | 
				
			||||||
	"MAILTO":             5,
 | 
						"MAILTO":             5,
 | 
				
			||||||
	"KBFSPATH":           6,
 | 
						"KBFSPATH":           6,
 | 
				
			||||||
 | 
						"EMOJI":              7,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var UITextDecorationTypRevMap = map[UITextDecorationTyp]string{
 | 
					var UITextDecorationTypRevMap = map[UITextDecorationTyp]string{
 | 
				
			||||||
@@ -1440,6 +1490,7 @@ var UITextDecorationTypRevMap = map[UITextDecorationTyp]string{
 | 
				
			|||||||
	4: "LINK",
 | 
						4: "LINK",
 | 
				
			||||||
	5: "MAILTO",
 | 
						5: "MAILTO",
 | 
				
			||||||
	6: "KBFSPATH",
 | 
						6: "KBFSPATH",
 | 
				
			||||||
 | 
						7: "EMOJI",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e UITextDecorationTyp) String() string {
 | 
					func (e UITextDecorationTyp) String() string {
 | 
				
			||||||
@@ -1566,6 +1617,7 @@ type UITextDecoration struct {
 | 
				
			|||||||
	Link__               *UILinkDecoration     `codec:"link,omitempty" json:"link,omitempty"`
 | 
						Link__               *UILinkDecoration     `codec:"link,omitempty" json:"link,omitempty"`
 | 
				
			||||||
	Mailto__             *UILinkDecoration     `codec:"mailto,omitempty" json:"mailto,omitempty"`
 | 
						Mailto__             *UILinkDecoration     `codec:"mailto,omitempty" json:"mailto,omitempty"`
 | 
				
			||||||
	Kbfspath__           *KBFSPath             `codec:"kbfspath,omitempty" json:"kbfspath,omitempty"`
 | 
						Kbfspath__           *KBFSPath             `codec:"kbfspath,omitempty" json:"kbfspath,omitempty"`
 | 
				
			||||||
 | 
						Emoji__              *Emoji                `codec:"emoji,omitempty" json:"emoji,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *UITextDecoration) Typ() (ret UITextDecorationTyp, err error) {
 | 
					func (o *UITextDecoration) Typ() (ret UITextDecorationTyp, err error) {
 | 
				
			||||||
@@ -1605,6 +1657,11 @@ func (o *UITextDecoration) Typ() (ret UITextDecorationTyp, err error) {
 | 
				
			|||||||
			err = errors.New("unexpected nil value for Kbfspath__")
 | 
								err = errors.New("unexpected nil value for Kbfspath__")
 | 
				
			||||||
			return ret, err
 | 
								return ret, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						case UITextDecorationTyp_EMOJI:
 | 
				
			||||||
 | 
							if o.Emoji__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Emoji__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return o.Typ__, nil
 | 
						return o.Typ__, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1679,6 +1736,16 @@ func (o UITextDecoration) Kbfspath() (res KBFSPath) {
 | 
				
			|||||||
	return *o.Kbfspath__
 | 
						return *o.Kbfspath__
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UITextDecoration) Emoji() (res Emoji) {
 | 
				
			||||||
 | 
						if o.Typ__ != UITextDecorationTyp_EMOJI {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Emoji__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Emoji__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewUITextDecorationWithPayment(v TextPayment) UITextDecoration {
 | 
					func NewUITextDecorationWithPayment(v TextPayment) UITextDecoration {
 | 
				
			||||||
	return UITextDecoration{
 | 
						return UITextDecoration{
 | 
				
			||||||
		Typ__:     UITextDecorationTyp_PAYMENT,
 | 
							Typ__:     UITextDecorationTyp_PAYMENT,
 | 
				
			||||||
@@ -1728,6 +1795,13 @@ func NewUITextDecorationWithKbfspath(v KBFSPath) UITextDecoration {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewUITextDecorationWithEmoji(v Emoji) UITextDecoration {
 | 
				
			||||||
 | 
						return UITextDecoration{
 | 
				
			||||||
 | 
							Typ__:   UITextDecorationTyp_EMOJI,
 | 
				
			||||||
 | 
							Emoji__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o UITextDecoration) DeepCopy() UITextDecoration {
 | 
					func (o UITextDecoration) DeepCopy() UITextDecoration {
 | 
				
			||||||
	return UITextDecoration{
 | 
						return UITextDecoration{
 | 
				
			||||||
		Typ__: o.Typ__.DeepCopy(),
 | 
							Typ__: o.Typ__.DeepCopy(),
 | 
				
			||||||
@@ -1780,6 +1854,13 @@ func (o UITextDecoration) DeepCopy() UITextDecoration {
 | 
				
			|||||||
			tmp := (*x).DeepCopy()
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
			return &tmp
 | 
								return &tmp
 | 
				
			||||||
		})(o.Kbfspath__),
 | 
							})(o.Kbfspath__),
 | 
				
			||||||
 | 
							Emoji__: (func(x *Emoji) *Emoji {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Emoji__),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1917,6 +1998,50 @@ func (o UIChatSearchConvHits) DeepCopy() UIChatSearchConvHits {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UIChatSearchTeamHits struct {
 | 
				
			||||||
 | 
						Hits             []keybase1.TeamSearchItem `codec:"hits" json:"hits"`
 | 
				
			||||||
 | 
						SuggestedMatches bool                      `codec:"suggestedMatches" json:"suggestedMatches"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UIChatSearchTeamHits) DeepCopy() UIChatSearchTeamHits {
 | 
				
			||||||
 | 
						return UIChatSearchTeamHits{
 | 
				
			||||||
 | 
							Hits: (func(x []keybase1.TeamSearchItem) []keybase1.TeamSearchItem {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]keybase1.TeamSearchItem, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Hits),
 | 
				
			||||||
 | 
							SuggestedMatches: o.SuggestedMatches,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UIChatSearchBotHits struct {
 | 
				
			||||||
 | 
						Hits             []keybase1.FeaturedBot `codec:"hits" json:"hits"`
 | 
				
			||||||
 | 
						SuggestedMatches bool                   `codec:"suggestedMatches" json:"suggestedMatches"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UIChatSearchBotHits) DeepCopy() UIChatSearchBotHits {
 | 
				
			||||||
 | 
						return UIChatSearchBotHits{
 | 
				
			||||||
 | 
							Hits: (func(x []keybase1.FeaturedBot) []keybase1.FeaturedBot {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]keybase1.FeaturedBot, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Hits),
 | 
				
			||||||
 | 
							SuggestedMatches: o.SuggestedMatches,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type UIChatPayment struct {
 | 
					type UIChatPayment struct {
 | 
				
			||||||
	Username      string  `codec:"username" json:"username"`
 | 
						Username      string  `codec:"username" json:"username"`
 | 
				
			||||||
	FullName      string  `codec:"fullName" json:"fullName"`
 | 
						FullName      string  `codec:"fullName" json:"fullName"`
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/commands.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/commands.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/commands.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/commands.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										184
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										184
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/common.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/common.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
@@ -9,6 +9,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	gregor1 "github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1"
 | 
						gregor1 "github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1"
 | 
				
			||||||
	keybase1 "github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1"
 | 
						keybase1 "github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1"
 | 
				
			||||||
 | 
						stellar1 "github.com/keybase/go-keybase-chat-bot/kbchat/types/stellar1"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ThreadID []byte
 | 
					type ThreadID []byte
 | 
				
			||||||
@@ -311,6 +312,8 @@ const (
 | 
				
			|||||||
	TopicType_CHAT         TopicType = 1
 | 
						TopicType_CHAT         TopicType = 1
 | 
				
			||||||
	TopicType_DEV          TopicType = 2
 | 
						TopicType_DEV          TopicType = 2
 | 
				
			||||||
	TopicType_KBFSFILEEDIT TopicType = 3
 | 
						TopicType_KBFSFILEEDIT TopicType = 3
 | 
				
			||||||
 | 
						TopicType_EMOJI        TopicType = 4
 | 
				
			||||||
 | 
						TopicType_EMOJICROSS   TopicType = 5
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o TopicType) DeepCopy() TopicType { return o }
 | 
					func (o TopicType) DeepCopy() TopicType { return o }
 | 
				
			||||||
@@ -320,6 +323,8 @@ var TopicTypeMap = map[string]TopicType{
 | 
				
			|||||||
	"CHAT":         1,
 | 
						"CHAT":         1,
 | 
				
			||||||
	"DEV":          2,
 | 
						"DEV":          2,
 | 
				
			||||||
	"KBFSFILEEDIT": 3,
 | 
						"KBFSFILEEDIT": 3,
 | 
				
			||||||
 | 
						"EMOJI":        4,
 | 
				
			||||||
 | 
						"EMOJICROSS":   5,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var TopicTypeRevMap = map[TopicType]string{
 | 
					var TopicTypeRevMap = map[TopicType]string{
 | 
				
			||||||
@@ -327,6 +332,8 @@ var TopicTypeRevMap = map[TopicType]string{
 | 
				
			|||||||
	1: "CHAT",
 | 
						1: "CHAT",
 | 
				
			||||||
	2: "DEV",
 | 
						2: "DEV",
 | 
				
			||||||
	3: "KBFSFILEEDIT",
 | 
						3: "KBFSFILEEDIT",
 | 
				
			||||||
 | 
						4: "EMOJI",
 | 
				
			||||||
 | 
						5: "EMOJICROSS",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TeamType int
 | 
					type TeamType int
 | 
				
			||||||
@@ -627,6 +634,32 @@ func (o RateLimit) DeepCopy() RateLimit {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type InboxParticipantsMode int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						InboxParticipantsMode_ALL        InboxParticipantsMode = 0
 | 
				
			||||||
 | 
						InboxParticipantsMode_SKIP_TEAMS InboxParticipantsMode = 1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o InboxParticipantsMode) DeepCopy() InboxParticipantsMode { return o }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var InboxParticipantsModeMap = map[string]InboxParticipantsMode{
 | 
				
			||||||
 | 
						"ALL":        0,
 | 
				
			||||||
 | 
						"SKIP_TEAMS": 1,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var InboxParticipantsModeRevMap = map[InboxParticipantsMode]string{
 | 
				
			||||||
 | 
						0: "ALL",
 | 
				
			||||||
 | 
						1: "SKIP_TEAMS",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e InboxParticipantsMode) String() string {
 | 
				
			||||||
 | 
						if v, ok := InboxParticipantsModeRevMap[e]; ok {
 | 
				
			||||||
 | 
							return v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type GetInboxQuery struct {
 | 
					type GetInboxQuery struct {
 | 
				
			||||||
	ConvID            *ConversationID            `codec:"convID,omitempty" json:"convID,omitempty"`
 | 
						ConvID            *ConversationID            `codec:"convID,omitempty" json:"convID,omitempty"`
 | 
				
			||||||
	TopicType         *TopicType                 `codec:"topicType,omitempty" json:"topicType,omitempty"`
 | 
						TopicType         *TopicType                 `codec:"topicType,omitempty" json:"topicType,omitempty"`
 | 
				
			||||||
@@ -645,6 +678,7 @@ type GetInboxQuery struct {
 | 
				
			|||||||
	ReadOnly          bool                       `codec:"readOnly" json:"readOnly"`
 | 
						ReadOnly          bool                       `codec:"readOnly" json:"readOnly"`
 | 
				
			||||||
	ComputeActiveList bool                       `codec:"computeActiveList" json:"computeActiveList"`
 | 
						ComputeActiveList bool                       `codec:"computeActiveList" json:"computeActiveList"`
 | 
				
			||||||
	SummarizeMaxMsgs  bool                       `codec:"summarizeMaxMsgs" json:"summarizeMaxMsgs"`
 | 
						SummarizeMaxMsgs  bool                       `codec:"summarizeMaxMsgs" json:"summarizeMaxMsgs"`
 | 
				
			||||||
 | 
						ParticipantsMode  InboxParticipantsMode      `codec:"participantsMode" json:"participantsMode"`
 | 
				
			||||||
	SkipBgLoads       bool                       `codec:"skipBgLoads" json:"skipBgLoads"`
 | 
						SkipBgLoads       bool                       `codec:"skipBgLoads" json:"skipBgLoads"`
 | 
				
			||||||
	AllowUnseenQuery  bool                       `codec:"allowUnseenQuery" json:"allowUnseenQuery"`
 | 
						AllowUnseenQuery  bool                       `codec:"allowUnseenQuery" json:"allowUnseenQuery"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -766,6 +800,7 @@ func (o GetInboxQuery) DeepCopy() GetInboxQuery {
 | 
				
			|||||||
		ReadOnly:          o.ReadOnly,
 | 
							ReadOnly:          o.ReadOnly,
 | 
				
			||||||
		ComputeActiveList: o.ComputeActiveList,
 | 
							ComputeActiveList: o.ComputeActiveList,
 | 
				
			||||||
		SummarizeMaxMsgs:  o.SummarizeMaxMsgs,
 | 
							SummarizeMaxMsgs:  o.SummarizeMaxMsgs,
 | 
				
			||||||
 | 
							ParticipantsMode:  o.ParticipantsMode.DeepCopy(),
 | 
				
			||||||
		SkipBgLoads:       o.SkipBgLoads,
 | 
							SkipBgLoads:       o.SkipBgLoads,
 | 
				
			||||||
		AllowUnseenQuery:  o.AllowUnseenQuery,
 | 
							AllowUnseenQuery:  o.AllowUnseenQuery,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -959,6 +994,7 @@ type ConversationReaderInfo struct {
 | 
				
			|||||||
	MaxMsgid          MessageID                    `codec:"maxMsgid" json:"maxMsgid"`
 | 
						MaxMsgid          MessageID                    `codec:"maxMsgid" json:"maxMsgid"`
 | 
				
			||||||
	Status            ConversationMemberStatus     `codec:"status" json:"status"`
 | 
						Status            ConversationMemberStatus     `codec:"status" json:"status"`
 | 
				
			||||||
	UntrustedTeamRole keybase1.TeamRole            `codec:"untrustedTeamRole" json:"untrustedTeamRole"`
 | 
						UntrustedTeamRole keybase1.TeamRole            `codec:"untrustedTeamRole" json:"untrustedTeamRole"`
 | 
				
			||||||
 | 
						LastSendTime      gregor1.Time                 `codec:"l" json:"l"`
 | 
				
			||||||
	Journeycard       *ConversationJourneycardInfo `codec:"jc,omitempty" json:"jc,omitempty"`
 | 
						Journeycard       *ConversationJourneycardInfo `codec:"jc,omitempty" json:"jc,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -969,6 +1005,7 @@ func (o ConversationReaderInfo) DeepCopy() ConversationReaderInfo {
 | 
				
			|||||||
		MaxMsgid:          o.MaxMsgid.DeepCopy(),
 | 
							MaxMsgid:          o.MaxMsgid.DeepCopy(),
 | 
				
			||||||
		Status:            o.Status.DeepCopy(),
 | 
							Status:            o.Status.DeepCopy(),
 | 
				
			||||||
		UntrustedTeamRole: o.UntrustedTeamRole.DeepCopy(),
 | 
							UntrustedTeamRole: o.UntrustedTeamRole.DeepCopy(),
 | 
				
			||||||
 | 
							LastSendTime:      o.LastSendTime.DeepCopy(),
 | 
				
			||||||
		Journeycard: (func(x *ConversationJourneycardInfo) *ConversationJourneycardInfo {
 | 
							Journeycard: (func(x *ConversationJourneycardInfo) *ConversationJourneycardInfo {
 | 
				
			||||||
			if x == nil {
 | 
								if x == nil {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
@@ -1333,6 +1370,7 @@ type MessageClientHeader struct {
 | 
				
			|||||||
	EphemeralMetadata *MsgEphemeralMetadata    `codec:"em,omitempty" json:"em,omitempty"`
 | 
						EphemeralMetadata *MsgEphemeralMetadata    `codec:"em,omitempty" json:"em,omitempty"`
 | 
				
			||||||
	PairwiseMacs      map[keybase1.KID][]byte  `codec:"pm" json:"pm"`
 | 
						PairwiseMacs      map[keybase1.KID][]byte  `codec:"pm" json:"pm"`
 | 
				
			||||||
	BotUID            *gregor1.UID             `codec:"b,omitempty" json:"b,omitempty"`
 | 
						BotUID            *gregor1.UID             `codec:"b,omitempty" json:"b,omitempty"`
 | 
				
			||||||
 | 
						TxID              *stellar1.TransactionID  `codec:"t,omitempty" json:"t,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o MessageClientHeader) DeepCopy() MessageClientHeader {
 | 
					func (o MessageClientHeader) DeepCopy() MessageClientHeader {
 | 
				
			||||||
@@ -1432,6 +1470,13 @@ func (o MessageClientHeader) DeepCopy() MessageClientHeader {
 | 
				
			|||||||
			tmp := (*x).DeepCopy()
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
			return &tmp
 | 
								return &tmp
 | 
				
			||||||
		})(o.BotUID),
 | 
							})(o.BotUID),
 | 
				
			||||||
 | 
							TxID: (func(x *stellar1.TransactionID) *stellar1.TransactionID {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.TxID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1959,6 +2004,7 @@ const (
 | 
				
			|||||||
	GetThreadReason_KBFSFILEACTIVITY   GetThreadReason = 8
 | 
						GetThreadReason_KBFSFILEACTIVITY   GetThreadReason = 8
 | 
				
			||||||
	GetThreadReason_COINFLIP           GetThreadReason = 9
 | 
						GetThreadReason_COINFLIP           GetThreadReason = 9
 | 
				
			||||||
	GetThreadReason_BOTCOMMANDS        GetThreadReason = 10
 | 
						GetThreadReason_BOTCOMMANDS        GetThreadReason = 10
 | 
				
			||||||
 | 
						GetThreadReason_EMOJISOURCE        GetThreadReason = 11
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o GetThreadReason) DeepCopy() GetThreadReason { return o }
 | 
					func (o GetThreadReason) DeepCopy() GetThreadReason { return o }
 | 
				
			||||||
@@ -1975,6 +2021,7 @@ var GetThreadReasonMap = map[string]GetThreadReason{
 | 
				
			|||||||
	"KBFSFILEACTIVITY":   8,
 | 
						"KBFSFILEACTIVITY":   8,
 | 
				
			||||||
	"COINFLIP":           9,
 | 
						"COINFLIP":           9,
 | 
				
			||||||
	"BOTCOMMANDS":        10,
 | 
						"BOTCOMMANDS":        10,
 | 
				
			||||||
 | 
						"EMOJISOURCE":        11,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var GetThreadReasonRevMap = map[GetThreadReason]string{
 | 
					var GetThreadReasonRevMap = map[GetThreadReason]string{
 | 
				
			||||||
@@ -1989,6 +2036,7 @@ var GetThreadReasonRevMap = map[GetThreadReason]string{
 | 
				
			|||||||
	8:  "KBFSFILEACTIVITY",
 | 
						8:  "KBFSFILEACTIVITY",
 | 
				
			||||||
	9:  "COINFLIP",
 | 
						9:  "COINFLIP",
 | 
				
			||||||
	10: "BOTCOMMANDS",
 | 
						10: "BOTCOMMANDS",
 | 
				
			||||||
 | 
						11: "EMOJISOURCE",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e GetThreadReason) String() string {
 | 
					func (e GetThreadReason) String() string {
 | 
				
			||||||
@@ -2044,6 +2092,9 @@ type SearchOpts struct {
 | 
				
			|||||||
	MaxConvsHit       int             `codec:"maxConvsHit" json:"maxConvsHit"`
 | 
						MaxConvsHit       int             `codec:"maxConvsHit" json:"maxConvsHit"`
 | 
				
			||||||
	ConvID            *ConversationID `codec:"convID,omitempty" json:"convID,omitempty"`
 | 
						ConvID            *ConversationID `codec:"convID,omitempty" json:"convID,omitempty"`
 | 
				
			||||||
	MaxNameConvs      int             `codec:"maxNameConvs" json:"maxNameConvs"`
 | 
						MaxNameConvs      int             `codec:"maxNameConvs" json:"maxNameConvs"`
 | 
				
			||||||
 | 
						MaxTeams          int             `codec:"maxTeams" json:"maxTeams"`
 | 
				
			||||||
 | 
						MaxBots           int             `codec:"maxBots" json:"maxBots"`
 | 
				
			||||||
 | 
						SkipBotCache      bool            `codec:"skipBotCache" json:"skipBotCache"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o SearchOpts) DeepCopy() SearchOpts {
 | 
					func (o SearchOpts) DeepCopy() SearchOpts {
 | 
				
			||||||
@@ -2076,6 +2127,9 @@ func (o SearchOpts) DeepCopy() SearchOpts {
 | 
				
			|||||||
			return &tmp
 | 
								return &tmp
 | 
				
			||||||
		})(o.ConvID),
 | 
							})(o.ConvID),
 | 
				
			||||||
		MaxNameConvs: o.MaxNameConvs,
 | 
							MaxNameConvs: o.MaxNameConvs,
 | 
				
			||||||
 | 
							MaxTeams:     o.MaxTeams,
 | 
				
			||||||
 | 
							MaxBots:      o.MaxBots,
 | 
				
			||||||
 | 
							SkipBotCache: o.SkipBotCache,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2387,6 +2441,7 @@ type Asset struct {
 | 
				
			|||||||
	Size      int64         `codec:"size" json:"size"`
 | 
						Size      int64         `codec:"size" json:"size"`
 | 
				
			||||||
	MimeType  string        `codec:"mimeType" json:"mimeType"`
 | 
						MimeType  string        `codec:"mimeType" json:"mimeType"`
 | 
				
			||||||
	EncHash   Hash          `codec:"encHash" json:"encHash"`
 | 
						EncHash   Hash          `codec:"encHash" json:"encHash"`
 | 
				
			||||||
 | 
						PtHash    Hash          `codec:"ptHash" json:"ptHash"`
 | 
				
			||||||
	Key       []byte        `codec:"key" json:"key"`
 | 
						Key       []byte        `codec:"key" json:"key"`
 | 
				
			||||||
	VerifyKey []byte        `codec:"verifyKey" json:"verifyKey"`
 | 
						VerifyKey []byte        `codec:"verifyKey" json:"verifyKey"`
 | 
				
			||||||
	Title     string        `codec:"title" json:"title"`
 | 
						Title     string        `codec:"title" json:"title"`
 | 
				
			||||||
@@ -2405,6 +2460,7 @@ func (o Asset) DeepCopy() Asset {
 | 
				
			|||||||
		Size:     o.Size,
 | 
							Size:     o.Size,
 | 
				
			||||||
		MimeType: o.MimeType,
 | 
							MimeType: o.MimeType,
 | 
				
			||||||
		EncHash:  o.EncHash.DeepCopy(),
 | 
							EncHash:  o.EncHash.DeepCopy(),
 | 
				
			||||||
 | 
							PtHash:   o.PtHash.DeepCopy(),
 | 
				
			||||||
		Key: (func(x []byte) []byte {
 | 
							Key: (func(x []byte) []byte {
 | 
				
			||||||
			if x == nil {
 | 
								if x == nil {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
@@ -2435,6 +2491,7 @@ const (
 | 
				
			|||||||
	BotCommandsAdvertisementTyp_PUBLIC        BotCommandsAdvertisementTyp = 0
 | 
						BotCommandsAdvertisementTyp_PUBLIC        BotCommandsAdvertisementTyp = 0
 | 
				
			||||||
	BotCommandsAdvertisementTyp_TLFID_MEMBERS BotCommandsAdvertisementTyp = 1
 | 
						BotCommandsAdvertisementTyp_TLFID_MEMBERS BotCommandsAdvertisementTyp = 1
 | 
				
			||||||
	BotCommandsAdvertisementTyp_TLFID_CONVS   BotCommandsAdvertisementTyp = 2
 | 
						BotCommandsAdvertisementTyp_TLFID_CONVS   BotCommandsAdvertisementTyp = 2
 | 
				
			||||||
 | 
						BotCommandsAdvertisementTyp_CONV          BotCommandsAdvertisementTyp = 3
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o BotCommandsAdvertisementTyp) DeepCopy() BotCommandsAdvertisementTyp { return o }
 | 
					func (o BotCommandsAdvertisementTyp) DeepCopy() BotCommandsAdvertisementTyp { return o }
 | 
				
			||||||
@@ -2443,12 +2500,14 @@ var BotCommandsAdvertisementTypMap = map[string]BotCommandsAdvertisementTyp{
 | 
				
			|||||||
	"PUBLIC":        0,
 | 
						"PUBLIC":        0,
 | 
				
			||||||
	"TLFID_MEMBERS": 1,
 | 
						"TLFID_MEMBERS": 1,
 | 
				
			||||||
	"TLFID_CONVS":   2,
 | 
						"TLFID_CONVS":   2,
 | 
				
			||||||
 | 
						"CONV":          3,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var BotCommandsAdvertisementTypRevMap = map[BotCommandsAdvertisementTyp]string{
 | 
					var BotCommandsAdvertisementTypRevMap = map[BotCommandsAdvertisementTyp]string{
 | 
				
			||||||
	0: "PUBLIC",
 | 
						0: "PUBLIC",
 | 
				
			||||||
	1: "TLFID_MEMBERS",
 | 
						1: "TLFID_MEMBERS",
 | 
				
			||||||
	2: "TLFID_CONVS",
 | 
						2: "TLFID_CONVS",
 | 
				
			||||||
 | 
						3: "CONV",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e BotCommandsAdvertisementTyp) String() string {
 | 
					func (e BotCommandsAdvertisementTyp) String() string {
 | 
				
			||||||
@@ -2471,3 +2530,126 @@ func (o TeamMember) DeepCopy() TeamMember {
 | 
				
			|||||||
		Status: o.Status.DeepCopy(),
 | 
							Status: o.Status.DeepCopy(),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type LastActiveStatus int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						LastActiveStatus_NONE            LastActiveStatus = 0
 | 
				
			||||||
 | 
						LastActiveStatus_ACTIVE          LastActiveStatus = 1
 | 
				
			||||||
 | 
						LastActiveStatus_RECENTLY_ACTIVE LastActiveStatus = 2
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o LastActiveStatus) DeepCopy() LastActiveStatus { return o }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var LastActiveStatusMap = map[string]LastActiveStatus{
 | 
				
			||||||
 | 
						"NONE":            0,
 | 
				
			||||||
 | 
						"ACTIVE":          1,
 | 
				
			||||||
 | 
						"RECENTLY_ACTIVE": 2,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var LastActiveStatusRevMap = map[LastActiveStatus]string{
 | 
				
			||||||
 | 
						0: "NONE",
 | 
				
			||||||
 | 
						1: "ACTIVE",
 | 
				
			||||||
 | 
						2: "RECENTLY_ACTIVE",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e LastActiveStatus) String() string {
 | 
				
			||||||
 | 
						if v, ok := LastActiveStatusRevMap[e]; ok {
 | 
				
			||||||
 | 
							return v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ChatMemberDetails struct {
 | 
				
			||||||
 | 
						Uid      keybase1.UID      `codec:"uid" json:"uid"`
 | 
				
			||||||
 | 
						Username string            `codec:"username" json:"username"`
 | 
				
			||||||
 | 
						FullName keybase1.FullName `codec:"fullName" json:"fullName"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o ChatMemberDetails) DeepCopy() ChatMemberDetails {
 | 
				
			||||||
 | 
						return ChatMemberDetails{
 | 
				
			||||||
 | 
							Uid:      o.Uid.DeepCopy(),
 | 
				
			||||||
 | 
							Username: o.Username,
 | 
				
			||||||
 | 
							FullName: o.FullName.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ChatMembersDetails struct {
 | 
				
			||||||
 | 
						Owners         []ChatMemberDetails `codec:"owners" json:"owners"`
 | 
				
			||||||
 | 
						Admins         []ChatMemberDetails `codec:"admins" json:"admins"`
 | 
				
			||||||
 | 
						Writers        []ChatMemberDetails `codec:"writers" json:"writers"`
 | 
				
			||||||
 | 
						Readers        []ChatMemberDetails `codec:"readers" json:"readers"`
 | 
				
			||||||
 | 
						Bots           []ChatMemberDetails `codec:"bots" json:"bots"`
 | 
				
			||||||
 | 
						RestrictedBots []ChatMemberDetails `codec:"restrictedBots" json:"restrictedBots"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o ChatMembersDetails) DeepCopy() ChatMembersDetails {
 | 
				
			||||||
 | 
						return ChatMembersDetails{
 | 
				
			||||||
 | 
							Owners: (func(x []ChatMemberDetails) []ChatMemberDetails {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ChatMemberDetails, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Owners),
 | 
				
			||||||
 | 
							Admins: (func(x []ChatMemberDetails) []ChatMemberDetails {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ChatMemberDetails, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Admins),
 | 
				
			||||||
 | 
							Writers: (func(x []ChatMemberDetails) []ChatMemberDetails {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ChatMemberDetails, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Writers),
 | 
				
			||||||
 | 
							Readers: (func(x []ChatMemberDetails) []ChatMemberDetails {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ChatMemberDetails, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Readers),
 | 
				
			||||||
 | 
							Bots: (func(x []ChatMemberDetails) []ChatMemberDetails {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ChatMemberDetails, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Bots),
 | 
				
			||||||
 | 
							RestrictedBots: (func(x []ChatMemberDetails) []ChatMemberDetails {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ChatMemberDetails, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.RestrictedBots),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										374
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/emoji.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										374
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/emoji.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,374 @@
 | 
				
			|||||||
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
 | 
					//   Input file: ../client/protocol/avdl/chat1/emoji.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package chat1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gregor1 "github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiLoadSourceTyp int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						EmojiLoadSourceTyp_HTTPSRV EmojiLoadSourceTyp = 0
 | 
				
			||||||
 | 
						EmojiLoadSourceTyp_STR     EmojiLoadSourceTyp = 1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiLoadSourceTyp) DeepCopy() EmojiLoadSourceTyp { return o }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var EmojiLoadSourceTypMap = map[string]EmojiLoadSourceTyp{
 | 
				
			||||||
 | 
						"HTTPSRV": 0,
 | 
				
			||||||
 | 
						"STR":     1,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var EmojiLoadSourceTypRevMap = map[EmojiLoadSourceTyp]string{
 | 
				
			||||||
 | 
						0: "HTTPSRV",
 | 
				
			||||||
 | 
						1: "STR",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e EmojiLoadSourceTyp) String() string {
 | 
				
			||||||
 | 
						if v, ok := EmojiLoadSourceTypRevMap[e]; ok {
 | 
				
			||||||
 | 
							return v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiLoadSource struct {
 | 
				
			||||||
 | 
						Typ__     EmojiLoadSourceTyp `codec:"typ" json:"typ"`
 | 
				
			||||||
 | 
						Httpsrv__ *string            `codec:"httpsrv,omitempty" json:"httpsrv,omitempty"`
 | 
				
			||||||
 | 
						Str__     *string            `codec:"str,omitempty" json:"str,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o *EmojiLoadSource) Typ() (ret EmojiLoadSourceTyp, err error) {
 | 
				
			||||||
 | 
						switch o.Typ__ {
 | 
				
			||||||
 | 
						case EmojiLoadSourceTyp_HTTPSRV:
 | 
				
			||||||
 | 
							if o.Httpsrv__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Httpsrv__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case EmojiLoadSourceTyp_STR:
 | 
				
			||||||
 | 
							if o.Str__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Str__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return o.Typ__, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiLoadSource) Httpsrv() (res string) {
 | 
				
			||||||
 | 
						if o.Typ__ != EmojiLoadSourceTyp_HTTPSRV {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Httpsrv__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Httpsrv__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiLoadSource) Str() (res string) {
 | 
				
			||||||
 | 
						if o.Typ__ != EmojiLoadSourceTyp_STR {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Str__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Str__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewEmojiLoadSourceWithHttpsrv(v string) EmojiLoadSource {
 | 
				
			||||||
 | 
						return EmojiLoadSource{
 | 
				
			||||||
 | 
							Typ__:     EmojiLoadSourceTyp_HTTPSRV,
 | 
				
			||||||
 | 
							Httpsrv__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewEmojiLoadSourceWithStr(v string) EmojiLoadSource {
 | 
				
			||||||
 | 
						return EmojiLoadSource{
 | 
				
			||||||
 | 
							Typ__: EmojiLoadSourceTyp_STR,
 | 
				
			||||||
 | 
							Str__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiLoadSource) DeepCopy() EmojiLoadSource {
 | 
				
			||||||
 | 
						return EmojiLoadSource{
 | 
				
			||||||
 | 
							Typ__: o.Typ__.DeepCopy(),
 | 
				
			||||||
 | 
							Httpsrv__: (func(x *string) *string {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x)
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Httpsrv__),
 | 
				
			||||||
 | 
							Str__: (func(x *string) *string {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x)
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Str__),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiRemoteSourceTyp int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						EmojiRemoteSourceTyp_MESSAGE    EmojiRemoteSourceTyp = 0
 | 
				
			||||||
 | 
						EmojiRemoteSourceTyp_STOCKALIAS EmojiRemoteSourceTyp = 1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiRemoteSourceTyp) DeepCopy() EmojiRemoteSourceTyp { return o }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var EmojiRemoteSourceTypMap = map[string]EmojiRemoteSourceTyp{
 | 
				
			||||||
 | 
						"MESSAGE":    0,
 | 
				
			||||||
 | 
						"STOCKALIAS": 1,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var EmojiRemoteSourceTypRevMap = map[EmojiRemoteSourceTyp]string{
 | 
				
			||||||
 | 
						0: "MESSAGE",
 | 
				
			||||||
 | 
						1: "STOCKALIAS",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e EmojiRemoteSourceTyp) String() string {
 | 
				
			||||||
 | 
						if v, ok := EmojiRemoteSourceTypRevMap[e]; ok {
 | 
				
			||||||
 | 
							return v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiMessage struct {
 | 
				
			||||||
 | 
						ConvID  ConversationID `codec:"convID" json:"convID"`
 | 
				
			||||||
 | 
						MsgID   MessageID      `codec:"msgID" json:"msgID"`
 | 
				
			||||||
 | 
						IsAlias bool           `codec:"isAlias" json:"isAlias"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiMessage) DeepCopy() EmojiMessage {
 | 
				
			||||||
 | 
						return EmojiMessage{
 | 
				
			||||||
 | 
							ConvID:  o.ConvID.DeepCopy(),
 | 
				
			||||||
 | 
							MsgID:   o.MsgID.DeepCopy(),
 | 
				
			||||||
 | 
							IsAlias: o.IsAlias,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiStockAlias struct {
 | 
				
			||||||
 | 
						Text     string       `codec:"text" json:"text"`
 | 
				
			||||||
 | 
						Username string       `codec:"username" json:"username"`
 | 
				
			||||||
 | 
						Time     gregor1.Time `codec:"time" json:"time"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiStockAlias) DeepCopy() EmojiStockAlias {
 | 
				
			||||||
 | 
						return EmojiStockAlias{
 | 
				
			||||||
 | 
							Text:     o.Text,
 | 
				
			||||||
 | 
							Username: o.Username,
 | 
				
			||||||
 | 
							Time:     o.Time.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiRemoteSource struct {
 | 
				
			||||||
 | 
						Typ__        EmojiRemoteSourceTyp `codec:"typ" json:"typ"`
 | 
				
			||||||
 | 
						Message__    *EmojiMessage        `codec:"message,omitempty" json:"message,omitempty"`
 | 
				
			||||||
 | 
						Stockalias__ *EmojiStockAlias     `codec:"stockalias,omitempty" json:"stockalias,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o *EmojiRemoteSource) Typ() (ret EmojiRemoteSourceTyp, err error) {
 | 
				
			||||||
 | 
						switch o.Typ__ {
 | 
				
			||||||
 | 
						case EmojiRemoteSourceTyp_MESSAGE:
 | 
				
			||||||
 | 
							if o.Message__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Message__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case EmojiRemoteSourceTyp_STOCKALIAS:
 | 
				
			||||||
 | 
							if o.Stockalias__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Stockalias__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return o.Typ__, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiRemoteSource) Message() (res EmojiMessage) {
 | 
				
			||||||
 | 
						if o.Typ__ != EmojiRemoteSourceTyp_MESSAGE {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Message__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Message__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiRemoteSource) Stockalias() (res EmojiStockAlias) {
 | 
				
			||||||
 | 
						if o.Typ__ != EmojiRemoteSourceTyp_STOCKALIAS {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Stockalias__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Stockalias__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewEmojiRemoteSourceWithMessage(v EmojiMessage) EmojiRemoteSource {
 | 
				
			||||||
 | 
						return EmojiRemoteSource{
 | 
				
			||||||
 | 
							Typ__:     EmojiRemoteSourceTyp_MESSAGE,
 | 
				
			||||||
 | 
							Message__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewEmojiRemoteSourceWithStockalias(v EmojiStockAlias) EmojiRemoteSource {
 | 
				
			||||||
 | 
						return EmojiRemoteSource{
 | 
				
			||||||
 | 
							Typ__:        EmojiRemoteSourceTyp_STOCKALIAS,
 | 
				
			||||||
 | 
							Stockalias__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiRemoteSource) DeepCopy() EmojiRemoteSource {
 | 
				
			||||||
 | 
						return EmojiRemoteSource{
 | 
				
			||||||
 | 
							Typ__: o.Typ__.DeepCopy(),
 | 
				
			||||||
 | 
							Message__: (func(x *EmojiMessage) *EmojiMessage {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Message__),
 | 
				
			||||||
 | 
							Stockalias__: (func(x *EmojiStockAlias) *EmojiStockAlias {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Stockalias__),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type HarvestedEmoji struct {
 | 
				
			||||||
 | 
						Alias       string            `codec:"alias" json:"alias"`
 | 
				
			||||||
 | 
						IsBig       bool              `codec:"isBig" json:"isBig"`
 | 
				
			||||||
 | 
						IsCrossTeam bool              `codec:"isCrossTeam" json:"isCrossTeam"`
 | 
				
			||||||
 | 
						Source      EmojiRemoteSource `codec:"source" json:"source"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o HarvestedEmoji) DeepCopy() HarvestedEmoji {
 | 
				
			||||||
 | 
						return HarvestedEmoji{
 | 
				
			||||||
 | 
							Alias:       o.Alias,
 | 
				
			||||||
 | 
							IsBig:       o.IsBig,
 | 
				
			||||||
 | 
							IsCrossTeam: o.IsCrossTeam,
 | 
				
			||||||
 | 
							Source:      o.Source.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiCreationInfo struct {
 | 
				
			||||||
 | 
						Username string       `codec:"username" json:"username"`
 | 
				
			||||||
 | 
						Time     gregor1.Time `codec:"time" json:"time"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiCreationInfo) DeepCopy() EmojiCreationInfo {
 | 
				
			||||||
 | 
						return EmojiCreationInfo{
 | 
				
			||||||
 | 
							Username: o.Username,
 | 
				
			||||||
 | 
							Time:     o.Time.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Emoji struct {
 | 
				
			||||||
 | 
						Alias        string             `codec:"alias" json:"alias"`
 | 
				
			||||||
 | 
						IsBig        bool               `codec:"isBig" json:"isBig"`
 | 
				
			||||||
 | 
						IsReacji     bool               `codec:"isReacji" json:"isReacji"`
 | 
				
			||||||
 | 
						IsCrossTeam  bool               `codec:"isCrossTeam" json:"isCrossTeam"`
 | 
				
			||||||
 | 
						IsAlias      bool               `codec:"isAlias" json:"isAlias"`
 | 
				
			||||||
 | 
						Source       EmojiLoadSource    `codec:"source" json:"source"`
 | 
				
			||||||
 | 
						NoAnimSource EmojiLoadSource    `codec:"noAnimSource" json:"noAnimSource"`
 | 
				
			||||||
 | 
						RemoteSource EmojiRemoteSource  `codec:"remoteSource" json:"remoteSource"`
 | 
				
			||||||
 | 
						CreationInfo *EmojiCreationInfo `codec:"creationInfo,omitempty" json:"creationInfo,omitempty"`
 | 
				
			||||||
 | 
						Teamname     *string            `codec:"teamname,omitempty" json:"teamname,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o Emoji) DeepCopy() Emoji {
 | 
				
			||||||
 | 
						return Emoji{
 | 
				
			||||||
 | 
							Alias:        o.Alias,
 | 
				
			||||||
 | 
							IsBig:        o.IsBig,
 | 
				
			||||||
 | 
							IsReacji:     o.IsReacji,
 | 
				
			||||||
 | 
							IsCrossTeam:  o.IsCrossTeam,
 | 
				
			||||||
 | 
							IsAlias:      o.IsAlias,
 | 
				
			||||||
 | 
							Source:       o.Source.DeepCopy(),
 | 
				
			||||||
 | 
							NoAnimSource: o.NoAnimSource.DeepCopy(),
 | 
				
			||||||
 | 
							RemoteSource: o.RemoteSource.DeepCopy(),
 | 
				
			||||||
 | 
							CreationInfo: (func(x *EmojiCreationInfo) *EmojiCreationInfo {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.CreationInfo),
 | 
				
			||||||
 | 
							Teamname: (func(x *string) *string {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x)
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Teamname),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiGroup struct {
 | 
				
			||||||
 | 
						Name   string  `codec:"name" json:"name"`
 | 
				
			||||||
 | 
						Emojis []Emoji `codec:"emojis" json:"emojis"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiGroup) DeepCopy() EmojiGroup {
 | 
				
			||||||
 | 
						return EmojiGroup{
 | 
				
			||||||
 | 
							Name: o.Name,
 | 
				
			||||||
 | 
							Emojis: (func(x []Emoji) []Emoji {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]Emoji, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Emojis),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserEmojis struct {
 | 
				
			||||||
 | 
						Emojis []EmojiGroup `codec:"emojis" json:"emojis"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UserEmojis) DeepCopy() UserEmojis {
 | 
				
			||||||
 | 
						return UserEmojis{
 | 
				
			||||||
 | 
							Emojis: (func(x []EmojiGroup) []EmojiGroup {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]EmojiGroup, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Emojis),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type EmojiStorage struct {
 | 
				
			||||||
 | 
						Mapping map[string]EmojiRemoteSource `codec:"mapping" json:"mapping"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o EmojiStorage) DeepCopy() EmojiStorage {
 | 
				
			||||||
 | 
						return EmojiStorage{
 | 
				
			||||||
 | 
							Mapping: (func(x map[string]EmojiRemoteSource) map[string]EmojiRemoteSource {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make(map[string]EmojiRemoteSource, len(x))
 | 
				
			||||||
 | 
								for k, v := range x {
 | 
				
			||||||
 | 
									kCopy := k
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[kCopy] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Mapping),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/gregor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/gregor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/gregor.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/gregor.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
@@ -453,16 +453,6 @@ func (o UpdateConversations) DeepCopy() UpdateConversations {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TeamChannelUpdate struct {
 | 
					 | 
				
			||||||
	TeamID TLFID `codec:"teamID" json:"teamID"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (o TeamChannelUpdate) DeepCopy() TeamChannelUpdate {
 | 
					 | 
				
			||||||
	return TeamChannelUpdate{
 | 
					 | 
				
			||||||
		TeamID: o.TeamID.DeepCopy(),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type SetConvRetentionUpdate struct {
 | 
					type SetConvRetentionUpdate struct {
 | 
				
			||||||
	InboxVers InboxVers       `codec:"inboxVers" json:"inboxVers"`
 | 
						InboxVers InboxVers       `codec:"inboxVers" json:"inboxVers"`
 | 
				
			||||||
	ConvID    ConversationID  `codec:"convID" json:"convID"`
 | 
						ConvID    ConversationID  `codec:"convID" json:"convID"`
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										783
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										783
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										8
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/notify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/notify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/notify.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/notify.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
@@ -324,7 +324,7 @@ func (o EphemeralPurgeNotifInfo) DeepCopy() EphemeralPurgeNotifInfo {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ReactionUpdate struct {
 | 
					type ReactionUpdate struct {
 | 
				
			||||||
	Reactions   ReactionMap `codec:"reactions" json:"reactions"`
 | 
						Reactions   UIReactionMap `codec:"reactions" json:"reactions"`
 | 
				
			||||||
	TargetMsgID MessageID     `codec:"targetMsgID" json:"targetMsgID"`
 | 
						TargetMsgID MessageID     `codec:"targetMsgID" json:"targetMsgID"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -761,8 +761,6 @@ type TyperInfo struct {
 | 
				
			|||||||
	Uid      keybase1.UID      `codec:"uid" json:"uid"`
 | 
						Uid      keybase1.UID      `codec:"uid" json:"uid"`
 | 
				
			||||||
	Username string            `codec:"username" json:"username"`
 | 
						Username string            `codec:"username" json:"username"`
 | 
				
			||||||
	DeviceID keybase1.DeviceID `codec:"deviceID" json:"deviceID"`
 | 
						DeviceID keybase1.DeviceID `codec:"deviceID" json:"deviceID"`
 | 
				
			||||||
	DeviceName string            `codec:"deviceName" json:"deviceName"`
 | 
					 | 
				
			||||||
	DeviceType string            `codec:"deviceType" json:"deviceType"`
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o TyperInfo) DeepCopy() TyperInfo {
 | 
					func (o TyperInfo) DeepCopy() TyperInfo {
 | 
				
			||||||
@@ -770,8 +768,6 @@ func (o TyperInfo) DeepCopy() TyperInfo {
 | 
				
			|||||||
		Uid:      o.Uid.DeepCopy(),
 | 
							Uid:      o.Uid.DeepCopy(),
 | 
				
			||||||
		Username: o.Username,
 | 
							Username: o.Username,
 | 
				
			||||||
		DeviceID: o.DeviceID.DeepCopy(),
 | 
							DeviceID: o.DeviceID.DeepCopy(),
 | 
				
			||||||
		DeviceName: o.DeviceName,
 | 
					 | 
				
			||||||
		DeviceType: o.DeviceType,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										363
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/remote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										363
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/remote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/remote.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/remote.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
@@ -233,6 +233,8 @@ func (o NewConversationRemoteRes) DeepCopy() NewConversationRemoteRes {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type GetMessagesRemoteRes struct {
 | 
					type GetMessagesRemoteRes struct {
 | 
				
			||||||
	Msgs        []MessageBoxed          `codec:"msgs" json:"msgs"`
 | 
						Msgs        []MessageBoxed          `codec:"msgs" json:"msgs"`
 | 
				
			||||||
 | 
						MembersType ConversationMembersType `codec:"membersType" json:"membersType"`
 | 
				
			||||||
 | 
						Visibility  keybase1.TLFVisibility  `codec:"visibility" json:"visibility"`
 | 
				
			||||||
	RateLimit   *RateLimit              `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
						RateLimit   *RateLimit              `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -249,6 +251,8 @@ func (o GetMessagesRemoteRes) DeepCopy() GetMessagesRemoteRes {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			return ret
 | 
								return ret
 | 
				
			||||||
		})(o.Msgs),
 | 
							})(o.Msgs),
 | 
				
			||||||
 | 
							MembersType: o.MembersType.DeepCopy(),
 | 
				
			||||||
 | 
							Visibility:  o.Visibility.DeepCopy(),
 | 
				
			||||||
		RateLimit: (func(x *RateLimit) *RateLimit {
 | 
							RateLimit: (func(x *RateLimit) *RateLimit {
 | 
				
			||||||
			if x == nil {
 | 
								if x == nil {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
@@ -962,11 +966,24 @@ func (o RemoteBotCommandsAdvertisementTLFID) DeepCopy() RemoteBotCommandsAdverti
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RemoteBotCommandsAdvertisementConv struct {
 | 
				
			||||||
 | 
						ConvID          ConversationID `codec:"convID" json:"convID"`
 | 
				
			||||||
 | 
						AdvertiseConvID ConversationID `codec:"advertiseConvID" json:"advertiseConvID"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteBotCommandsAdvertisementConv) DeepCopy() RemoteBotCommandsAdvertisementConv {
 | 
				
			||||||
 | 
						return RemoteBotCommandsAdvertisementConv{
 | 
				
			||||||
 | 
							ConvID:          o.ConvID.DeepCopy(),
 | 
				
			||||||
 | 
							AdvertiseConvID: o.AdvertiseConvID.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RemoteBotCommandsAdvertisement struct {
 | 
					type RemoteBotCommandsAdvertisement struct {
 | 
				
			||||||
	Typ__          BotCommandsAdvertisementTyp           `codec:"typ" json:"typ"`
 | 
						Typ__          BotCommandsAdvertisementTyp           `codec:"typ" json:"typ"`
 | 
				
			||||||
	Public__       *RemoteBotCommandsAdvertisementPublic `codec:"public,omitempty" json:"public,omitempty"`
 | 
						Public__       *RemoteBotCommandsAdvertisementPublic `codec:"public,omitempty" json:"public,omitempty"`
 | 
				
			||||||
	TlfidMembers__ *RemoteBotCommandsAdvertisementTLFID  `codec:"tlfidMembers,omitempty" json:"tlfidMembers,omitempty"`
 | 
						TlfidMembers__ *RemoteBotCommandsAdvertisementTLFID  `codec:"tlfidMembers,omitempty" json:"tlfidMembers,omitempty"`
 | 
				
			||||||
	TlfidConvs__   *RemoteBotCommandsAdvertisementTLFID  `codec:"tlfidConvs,omitempty" json:"tlfidConvs,omitempty"`
 | 
						TlfidConvs__   *RemoteBotCommandsAdvertisementTLFID  `codec:"tlfidConvs,omitempty" json:"tlfidConvs,omitempty"`
 | 
				
			||||||
 | 
						Conv__         *RemoteBotCommandsAdvertisementConv   `codec:"conv,omitempty" json:"conv,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *RemoteBotCommandsAdvertisement) Typ() (ret BotCommandsAdvertisementTyp, err error) {
 | 
					func (o *RemoteBotCommandsAdvertisement) Typ() (ret BotCommandsAdvertisementTyp, err error) {
 | 
				
			||||||
@@ -986,6 +1003,11 @@ func (o *RemoteBotCommandsAdvertisement) Typ() (ret BotCommandsAdvertisementTyp,
 | 
				
			|||||||
			err = errors.New("unexpected nil value for TlfidConvs__")
 | 
								err = errors.New("unexpected nil value for TlfidConvs__")
 | 
				
			||||||
			return ret, err
 | 
								return ret, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						case BotCommandsAdvertisementTyp_CONV:
 | 
				
			||||||
 | 
							if o.Conv__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Conv__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return o.Typ__, nil
 | 
						return o.Typ__, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1020,6 +1042,16 @@ func (o RemoteBotCommandsAdvertisement) TlfidConvs() (res RemoteBotCommandsAdver
 | 
				
			|||||||
	return *o.TlfidConvs__
 | 
						return *o.TlfidConvs__
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteBotCommandsAdvertisement) Conv() (res RemoteBotCommandsAdvertisementConv) {
 | 
				
			||||||
 | 
						if o.Typ__ != BotCommandsAdvertisementTyp_CONV {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Conv__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Conv__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewRemoteBotCommandsAdvertisementWithPublic(v RemoteBotCommandsAdvertisementPublic) RemoteBotCommandsAdvertisement {
 | 
					func NewRemoteBotCommandsAdvertisementWithPublic(v RemoteBotCommandsAdvertisementPublic) RemoteBotCommandsAdvertisement {
 | 
				
			||||||
	return RemoteBotCommandsAdvertisement{
 | 
						return RemoteBotCommandsAdvertisement{
 | 
				
			||||||
		Typ__:    BotCommandsAdvertisementTyp_PUBLIC,
 | 
							Typ__:    BotCommandsAdvertisementTyp_PUBLIC,
 | 
				
			||||||
@@ -1041,6 +1073,13 @@ func NewRemoteBotCommandsAdvertisementWithTlfidConvs(v RemoteBotCommandsAdvertis
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewRemoteBotCommandsAdvertisementWithConv(v RemoteBotCommandsAdvertisementConv) RemoteBotCommandsAdvertisement {
 | 
				
			||||||
 | 
						return RemoteBotCommandsAdvertisement{
 | 
				
			||||||
 | 
							Typ__:  BotCommandsAdvertisementTyp_CONV,
 | 
				
			||||||
 | 
							Conv__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o RemoteBotCommandsAdvertisement) DeepCopy() RemoteBotCommandsAdvertisement {
 | 
					func (o RemoteBotCommandsAdvertisement) DeepCopy() RemoteBotCommandsAdvertisement {
 | 
				
			||||||
	return RemoteBotCommandsAdvertisement{
 | 
						return RemoteBotCommandsAdvertisement{
 | 
				
			||||||
		Typ__: o.Typ__.DeepCopy(),
 | 
							Typ__: o.Typ__.DeepCopy(),
 | 
				
			||||||
@@ -1065,6 +1104,13 @@ func (o RemoteBotCommandsAdvertisement) DeepCopy() RemoteBotCommandsAdvertisemen
 | 
				
			|||||||
			tmp := (*x).DeepCopy()
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
			return &tmp
 | 
								return &tmp
 | 
				
			||||||
		})(o.TlfidConvs__),
 | 
							})(o.TlfidConvs__),
 | 
				
			||||||
 | 
							Conv__: (func(x *RemoteBotCommandsAdvertisementConv) *RemoteBotCommandsAdvertisementConv {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Conv__),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1126,6 +1172,169 @@ func (o AdvertiseBotCommandsRes) DeepCopy() AdvertiseBotCommandsRes {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RemoteClearBotCommandsFilterPublic struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilterPublic) DeepCopy() RemoteClearBotCommandsFilterPublic {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilterPublic{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RemoteClearBotCommandsFilterTLFID struct {
 | 
				
			||||||
 | 
						TlfID TLFID `codec:"tlfID" json:"tlfID"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilterTLFID) DeepCopy() RemoteClearBotCommandsFilterTLFID {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilterTLFID{
 | 
				
			||||||
 | 
							TlfID: o.TlfID.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RemoteClearBotCommandsFilterConv struct {
 | 
				
			||||||
 | 
						ConvID ConversationID `codec:"convID" json:"convID"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilterConv) DeepCopy() RemoteClearBotCommandsFilterConv {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilterConv{
 | 
				
			||||||
 | 
							ConvID: o.ConvID.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RemoteClearBotCommandsFilter struct {
 | 
				
			||||||
 | 
						Typ__          BotCommandsAdvertisementTyp         `codec:"typ" json:"typ"`
 | 
				
			||||||
 | 
						Public__       *RemoteClearBotCommandsFilterPublic `codec:"public,omitempty" json:"public,omitempty"`
 | 
				
			||||||
 | 
						TlfidMembers__ *RemoteClearBotCommandsFilterTLFID  `codec:"tlfidMembers,omitempty" json:"tlfidMembers,omitempty"`
 | 
				
			||||||
 | 
						TlfidConvs__   *RemoteClearBotCommandsFilterTLFID  `codec:"tlfidConvs,omitempty" json:"tlfidConvs,omitempty"`
 | 
				
			||||||
 | 
						Conv__         *RemoteClearBotCommandsFilterConv   `codec:"conv,omitempty" json:"conv,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o *RemoteClearBotCommandsFilter) Typ() (ret BotCommandsAdvertisementTyp, err error) {
 | 
				
			||||||
 | 
						switch o.Typ__ {
 | 
				
			||||||
 | 
						case BotCommandsAdvertisementTyp_PUBLIC:
 | 
				
			||||||
 | 
							if o.Public__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Public__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case BotCommandsAdvertisementTyp_TLFID_MEMBERS:
 | 
				
			||||||
 | 
							if o.TlfidMembers__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for TlfidMembers__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case BotCommandsAdvertisementTyp_TLFID_CONVS:
 | 
				
			||||||
 | 
							if o.TlfidConvs__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for TlfidConvs__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case BotCommandsAdvertisementTyp_CONV:
 | 
				
			||||||
 | 
							if o.Conv__ == nil {
 | 
				
			||||||
 | 
								err = errors.New("unexpected nil value for Conv__")
 | 
				
			||||||
 | 
								return ret, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return o.Typ__, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilter) Public() (res RemoteClearBotCommandsFilterPublic) {
 | 
				
			||||||
 | 
						if o.Typ__ != BotCommandsAdvertisementTyp_PUBLIC {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Public__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Public__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilter) TlfidMembers() (res RemoteClearBotCommandsFilterTLFID) {
 | 
				
			||||||
 | 
						if o.Typ__ != BotCommandsAdvertisementTyp_TLFID_MEMBERS {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.TlfidMembers__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.TlfidMembers__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilter) TlfidConvs() (res RemoteClearBotCommandsFilterTLFID) {
 | 
				
			||||||
 | 
						if o.Typ__ != BotCommandsAdvertisementTyp_TLFID_CONVS {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.TlfidConvs__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.TlfidConvs__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilter) Conv() (res RemoteClearBotCommandsFilterConv) {
 | 
				
			||||||
 | 
						if o.Typ__ != BotCommandsAdvertisementTyp_CONV {
 | 
				
			||||||
 | 
							panic("wrong case accessed")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Conv__ == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *o.Conv__
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewRemoteClearBotCommandsFilterWithPublic(v RemoteClearBotCommandsFilterPublic) RemoteClearBotCommandsFilter {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilter{
 | 
				
			||||||
 | 
							Typ__:    BotCommandsAdvertisementTyp_PUBLIC,
 | 
				
			||||||
 | 
							Public__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewRemoteClearBotCommandsFilterWithTlfidMembers(v RemoteClearBotCommandsFilterTLFID) RemoteClearBotCommandsFilter {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilter{
 | 
				
			||||||
 | 
							Typ__:          BotCommandsAdvertisementTyp_TLFID_MEMBERS,
 | 
				
			||||||
 | 
							TlfidMembers__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewRemoteClearBotCommandsFilterWithTlfidConvs(v RemoteClearBotCommandsFilterTLFID) RemoteClearBotCommandsFilter {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilter{
 | 
				
			||||||
 | 
							Typ__:        BotCommandsAdvertisementTyp_TLFID_CONVS,
 | 
				
			||||||
 | 
							TlfidConvs__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewRemoteClearBotCommandsFilterWithConv(v RemoteClearBotCommandsFilterConv) RemoteClearBotCommandsFilter {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilter{
 | 
				
			||||||
 | 
							Typ__:  BotCommandsAdvertisementTyp_CONV,
 | 
				
			||||||
 | 
							Conv__: &v,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RemoteClearBotCommandsFilter) DeepCopy() RemoteClearBotCommandsFilter {
 | 
				
			||||||
 | 
						return RemoteClearBotCommandsFilter{
 | 
				
			||||||
 | 
							Typ__: o.Typ__.DeepCopy(),
 | 
				
			||||||
 | 
							Public__: (func(x *RemoteClearBotCommandsFilterPublic) *RemoteClearBotCommandsFilterPublic {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Public__),
 | 
				
			||||||
 | 
							TlfidMembers__: (func(x *RemoteClearBotCommandsFilterTLFID) *RemoteClearBotCommandsFilterTLFID {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.TlfidMembers__),
 | 
				
			||||||
 | 
							TlfidConvs__: (func(x *RemoteClearBotCommandsFilterTLFID) *RemoteClearBotCommandsFilterTLFID {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.TlfidConvs__),
 | 
				
			||||||
 | 
							Conv__: (func(x *RemoteClearBotCommandsFilterConv) *RemoteClearBotCommandsFilterConv {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.Conv__),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ClearBotCommandsRes struct {
 | 
					type ClearBotCommandsRes struct {
 | 
				
			||||||
	RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
						RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1248,3 +1457,155 @@ func (o BotInfoHash) DeepCopy() BotInfoHash {
 | 
				
			|||||||
		return append([]byte{}, x...)
 | 
							return append([]byte{}, x...)
 | 
				
			||||||
	})(o)
 | 
						})(o)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetDefaultTeamChannelsRes struct {
 | 
				
			||||||
 | 
						Convs     []ConversationID `codec:"convs" json:"convs"`
 | 
				
			||||||
 | 
						RateLimit *RateLimit       `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o GetDefaultTeamChannelsRes) DeepCopy() GetDefaultTeamChannelsRes {
 | 
				
			||||||
 | 
						return GetDefaultTeamChannelsRes{
 | 
				
			||||||
 | 
							Convs: (func(x []ConversationID) []ConversationID {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ConversationID, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Convs),
 | 
				
			||||||
 | 
							RateLimit: (func(x *RateLimit) *RateLimit {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.RateLimit),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SetDefaultTeamChannelsRes struct {
 | 
				
			||||||
 | 
						RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o SetDefaultTeamChannelsRes) DeepCopy() SetDefaultTeamChannelsRes {
 | 
				
			||||||
 | 
						return SetDefaultTeamChannelsRes{
 | 
				
			||||||
 | 
							RateLimit: (func(x *RateLimit) *RateLimit {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.RateLimit),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetRecentJoinsRes struct {
 | 
				
			||||||
 | 
						NumJoins  int        `codec:"numJoins" json:"numJoins"`
 | 
				
			||||||
 | 
						RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o GetRecentJoinsRes) DeepCopy() GetRecentJoinsRes {
 | 
				
			||||||
 | 
						return GetRecentJoinsRes{
 | 
				
			||||||
 | 
							NumJoins: o.NumJoins,
 | 
				
			||||||
 | 
							RateLimit: (func(x *RateLimit) *RateLimit {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.RateLimit),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RefreshParticipantsRemoteRes struct {
 | 
				
			||||||
 | 
						HashMatch bool          `codec:"hashMatch" json:"hashMatch"`
 | 
				
			||||||
 | 
						Uids      []gregor1.UID `codec:"uids" json:"uids"`
 | 
				
			||||||
 | 
						Hash      string        `codec:"hash" json:"hash"`
 | 
				
			||||||
 | 
						RateLimit *RateLimit    `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o RefreshParticipantsRemoteRes) DeepCopy() RefreshParticipantsRemoteRes {
 | 
				
			||||||
 | 
						return RefreshParticipantsRemoteRes{
 | 
				
			||||||
 | 
							HashMatch: o.HashMatch,
 | 
				
			||||||
 | 
							Uids: (func(x []gregor1.UID) []gregor1.UID {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]gregor1.UID, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Uids),
 | 
				
			||||||
 | 
							Hash: o.Hash,
 | 
				
			||||||
 | 
							RateLimit: (func(x *RateLimit) *RateLimit {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.RateLimit),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetLastActiveAtRes struct {
 | 
				
			||||||
 | 
						LastActiveAt gregor1.Time `codec:"lastActiveAt" json:"lastActiveAt"`
 | 
				
			||||||
 | 
						RateLimit    *RateLimit   `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o GetLastActiveAtRes) DeepCopy() GetLastActiveAtRes {
 | 
				
			||||||
 | 
						return GetLastActiveAtRes{
 | 
				
			||||||
 | 
							LastActiveAt: o.LastActiveAt.DeepCopy(),
 | 
				
			||||||
 | 
							RateLimit: (func(x *RateLimit) *RateLimit {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.RateLimit),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ResetConversationMember struct {
 | 
				
			||||||
 | 
						ConvID ConversationID `codec:"convID" json:"convID"`
 | 
				
			||||||
 | 
						Uid    gregor1.UID    `codec:"uid" json:"uid"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o ResetConversationMember) DeepCopy() ResetConversationMember {
 | 
				
			||||||
 | 
						return ResetConversationMember{
 | 
				
			||||||
 | 
							ConvID: o.ConvID.DeepCopy(),
 | 
				
			||||||
 | 
							Uid:    o.Uid.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetResetConversationsRes struct {
 | 
				
			||||||
 | 
						ResetConvs []ResetConversationMember `codec:"resetConvs" json:"resetConvs"`
 | 
				
			||||||
 | 
						RateLimit  *RateLimit                `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o GetResetConversationsRes) DeepCopy() GetResetConversationsRes {
 | 
				
			||||||
 | 
						return GetResetConversationsRes{
 | 
				
			||||||
 | 
							ResetConvs: (func(x []ResetConversationMember) []ResetConversationMember {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]ResetConversationMember, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.ResetConvs),
 | 
				
			||||||
 | 
							RateLimit: (func(x *RateLimit) *RateLimit {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.RateLimit),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/unfurl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1/unfurl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/chat1/unfurl.avdl
 | 
					//   Input file: ../client/protocol/avdl/chat1/unfurl.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package chat1
 | 
					package chat1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/auth.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/auth.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/gregor1/auth.avdl
 | 
					//   Input file: ../client/protocol/avdl/gregor1/auth.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package gregor1
 | 
					package gregor1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/auth_internal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/auth_internal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/gregor1/auth_internal.avdl
 | 
					//   Input file: ../client/protocol/avdl/gregor1/auth_internal.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package gregor1
 | 
					package gregor1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/auth_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/auth_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/gregor1/auth_update.avdl
 | 
					//   Input file: ../client/protocol/avdl/gregor1/auth_update.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package gregor1
 | 
					package gregor1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/gregor1/common.avdl
 | 
					//   Input file: ../client/protocol/avdl/gregor1/common.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package gregor1
 | 
					package gregor1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/incoming.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/incoming.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/gregor1/incoming.avdl
 | 
					//   Input file: ../client/protocol/avdl/gregor1/incoming.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package gregor1
 | 
					package gregor1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/outgoing.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/outgoing.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/gregor1/outgoing.avdl
 | 
					//   Input file: ../client/protocol/avdl/gregor1/outgoing.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package gregor1
 | 
					package gregor1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/remind.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/gregor1/remind.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/gregor1/remind.avdl
 | 
					//   Input file: ../client/protocol/avdl/gregor1/remind.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package gregor1
 | 
					package gregor1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/account.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/account.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/account.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/account.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/airdrop.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/airdrop.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/airdrop.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/airdrop.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/apiserver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/apiserver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/apiserver.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/apiserver.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/appstate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/appstate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/appstate.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/appstate.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/audit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/audit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/audit.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/audit.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/avatars.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/avatars.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/avatars.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/avatars.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/backend_common.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/backend_common.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/badger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/badger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/badger.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/badger.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										106
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										106
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/block.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/block.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
@@ -57,6 +57,38 @@ func (o GetBlockRes) DeepCopy() GetBlockRes {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetBlockSizesRes struct {
 | 
				
			||||||
 | 
						Sizes    []int         `codec:"sizes" json:"sizes"`
 | 
				
			||||||
 | 
						Statuses []BlockStatus `codec:"statuses" json:"statuses"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o GetBlockSizesRes) DeepCopy() GetBlockSizesRes {
 | 
				
			||||||
 | 
						return GetBlockSizesRes{
 | 
				
			||||||
 | 
							Sizes: (func(x []int) []int {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]int, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Sizes),
 | 
				
			||||||
 | 
							Statuses: (func(x []BlockStatus) []BlockStatus {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]BlockStatus, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Statuses),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type BlockRefNonce [8]byte
 | 
					type BlockRefNonce [8]byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o BlockRefNonce) DeepCopy() BlockRefNonce {
 | 
					func (o BlockRefNonce) DeepCopy() BlockRefNonce {
 | 
				
			||||||
@@ -151,3 +183,75 @@ type BlockPingResponse struct {
 | 
				
			|||||||
func (o BlockPingResponse) DeepCopy() BlockPingResponse {
 | 
					func (o BlockPingResponse) DeepCopy() BlockPingResponse {
 | 
				
			||||||
	return BlockPingResponse{}
 | 
						return BlockPingResponse{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UsageStatRecord struct {
 | 
				
			||||||
 | 
						Write      int64 `codec:"write" json:"write"`
 | 
				
			||||||
 | 
						Archive    int64 `codec:"archive" json:"archive"`
 | 
				
			||||||
 | 
						Read       int64 `codec:"read" json:"read"`
 | 
				
			||||||
 | 
						MdWrite    int64 `codec:"mdWrite" json:"mdWrite"`
 | 
				
			||||||
 | 
						GitWrite   int64 `codec:"gitWrite" json:"gitWrite"`
 | 
				
			||||||
 | 
						GitArchive int64 `codec:"gitArchive" json:"gitArchive"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UsageStatRecord) DeepCopy() UsageStatRecord {
 | 
				
			||||||
 | 
						return UsageStatRecord{
 | 
				
			||||||
 | 
							Write:      o.Write,
 | 
				
			||||||
 | 
							Archive:    o.Archive,
 | 
				
			||||||
 | 
							Read:       o.Read,
 | 
				
			||||||
 | 
							MdWrite:    o.MdWrite,
 | 
				
			||||||
 | 
							GitWrite:   o.GitWrite,
 | 
				
			||||||
 | 
							GitArchive: o.GitArchive,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UsageStat struct {
 | 
				
			||||||
 | 
						Bytes  UsageStatRecord `codec:"bytes" json:"bytes"`
 | 
				
			||||||
 | 
						Blocks UsageStatRecord `codec:"blocks" json:"blocks"`
 | 
				
			||||||
 | 
						Mtime  Time            `codec:"mtime" json:"mtime"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UsageStat) DeepCopy() UsageStat {
 | 
				
			||||||
 | 
						return UsageStat{
 | 
				
			||||||
 | 
							Bytes:  o.Bytes.DeepCopy(),
 | 
				
			||||||
 | 
							Blocks: o.Blocks.DeepCopy(),
 | 
				
			||||||
 | 
							Mtime:  o.Mtime.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FolderUsageStat struct {
 | 
				
			||||||
 | 
						FolderID string    `codec:"folderID" json:"folderID"`
 | 
				
			||||||
 | 
						Stats    UsageStat `codec:"stats" json:"stats"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o FolderUsageStat) DeepCopy() FolderUsageStat {
 | 
				
			||||||
 | 
						return FolderUsageStat{
 | 
				
			||||||
 | 
							FolderID: o.FolderID,
 | 
				
			||||||
 | 
							Stats:    o.Stats.DeepCopy(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BlockQuotaInfo struct {
 | 
				
			||||||
 | 
						Folders  []FolderUsageStat `codec:"folders" json:"folders"`
 | 
				
			||||||
 | 
						Total    UsageStat         `codec:"total" json:"total"`
 | 
				
			||||||
 | 
						Limit    int64             `codec:"limit" json:"limit"`
 | 
				
			||||||
 | 
						GitLimit int64             `codec:"gitLimit" json:"gitLimit"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o BlockQuotaInfo) DeepCopy() BlockQuotaInfo {
 | 
				
			||||||
 | 
						return BlockQuotaInfo{
 | 
				
			||||||
 | 
							Folders: (func(x []FolderUsageStat) []FolderUsageStat {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ret := make([]FolderUsageStat, len(x))
 | 
				
			||||||
 | 
								for i, v := range x {
 | 
				
			||||||
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
 | 
									ret[i] = vCopy
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ret
 | 
				
			||||||
 | 
							})(o.Folders),
 | 
				
			||||||
 | 
							Total:    o.Total.DeepCopy(),
 | 
				
			||||||
 | 
							Limit:    o.Limit,
 | 
				
			||||||
 | 
							GitLimit: o.GitLimit,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/bot.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/bot.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/bot.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/bot.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/btc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/btc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/btc.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/btc.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										127
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										127
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/common.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/common.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
@@ -26,6 +26,12 @@ func (o DurationSec) DeepCopy() DurationSec {
 | 
				
			|||||||
	return o
 | 
						return o
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DurationMsec float64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o DurationMsec) DeepCopy() DurationMsec {
 | 
				
			||||||
 | 
						return o
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type StringKVPair struct {
 | 
					type StringKVPair struct {
 | 
				
			||||||
	Key   string `codec:"key" json:"key"`
 | 
						Key   string `codec:"key" json:"key"`
 | 
				
			||||||
	Value string `codec:"value" json:"value"`
 | 
						Value string `codec:"value" json:"value"`
 | 
				
			||||||
@@ -432,7 +438,7 @@ type PublicKey struct {
 | 
				
			|||||||
	ParentID          string        `codec:"parentID" json:"parentID"`
 | 
						ParentID          string        `codec:"parentID" json:"parentID"`
 | 
				
			||||||
	DeviceID          DeviceID      `codec:"deviceID" json:"deviceID"`
 | 
						DeviceID          DeviceID      `codec:"deviceID" json:"deviceID"`
 | 
				
			||||||
	DeviceDescription string        `codec:"deviceDescription" json:"deviceDescription"`
 | 
						DeviceDescription string        `codec:"deviceDescription" json:"deviceDescription"`
 | 
				
			||||||
	DeviceType        string        `codec:"deviceType" json:"deviceType"`
 | 
						DeviceType        DeviceTypeV2  `codec:"deviceType" json:"deviceType"`
 | 
				
			||||||
	CTime             Time          `codec:"cTime" json:"cTime"`
 | 
						CTime             Time          `codec:"cTime" json:"cTime"`
 | 
				
			||||||
	ETime             Time          `codec:"eTime" json:"eTime"`
 | 
						ETime             Time          `codec:"eTime" json:"eTime"`
 | 
				
			||||||
	IsRevoked         bool          `codec:"isRevoked" json:"isRevoked"`
 | 
						IsRevoked         bool          `codec:"isRevoked" json:"isRevoked"`
 | 
				
			||||||
@@ -458,7 +464,7 @@ func (o PublicKey) DeepCopy() PublicKey {
 | 
				
			|||||||
		ParentID:          o.ParentID,
 | 
							ParentID:          o.ParentID,
 | 
				
			||||||
		DeviceID:          o.DeviceID.DeepCopy(),
 | 
							DeviceID:          o.DeviceID.DeepCopy(),
 | 
				
			||||||
		DeviceDescription: o.DeviceDescription,
 | 
							DeviceDescription: o.DeviceDescription,
 | 
				
			||||||
		DeviceType:        o.DeviceType,
 | 
							DeviceType:        o.DeviceType.DeepCopy(),
 | 
				
			||||||
		CTime:             o.CTime.DeepCopy(),
 | 
							CTime:             o.CTime.DeepCopy(),
 | 
				
			||||||
		ETime:             o.ETime.DeepCopy(),
 | 
							ETime:             o.ETime.DeepCopy(),
 | 
				
			||||||
		IsRevoked:         o.IsRevoked,
 | 
							IsRevoked:         o.IsRevoked,
 | 
				
			||||||
@@ -504,7 +510,7 @@ func (o User) DeepCopy() User {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Device struct {
 | 
					type Device struct {
 | 
				
			||||||
	Type               string   `codec:"type" json:"type"`
 | 
						Type               DeviceTypeV2 `codec:"type" json:"type"`
 | 
				
			||||||
	Name               string       `codec:"name" json:"name"`
 | 
						Name               string       `codec:"name" json:"name"`
 | 
				
			||||||
	DeviceID           DeviceID     `codec:"deviceID" json:"deviceID"`
 | 
						DeviceID           DeviceID     `codec:"deviceID" json:"deviceID"`
 | 
				
			||||||
	DeviceNumberOfType int          `codec:"deviceNumberOfType" json:"deviceNumberOfType"`
 | 
						DeviceNumberOfType int          `codec:"deviceNumberOfType" json:"deviceNumberOfType"`
 | 
				
			||||||
@@ -518,7 +524,7 @@ type Device struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (o Device) DeepCopy() Device {
 | 
					func (o Device) DeepCopy() Device {
 | 
				
			||||||
	return Device{
 | 
						return Device{
 | 
				
			||||||
		Type:               o.Type,
 | 
							Type:               o.Type.DeepCopy(),
 | 
				
			||||||
		Name:               o.Name,
 | 
							Name:               o.Name,
 | 
				
			||||||
		DeviceID:           o.DeviceID.DeepCopy(),
 | 
							DeviceID:           o.DeviceID.DeepCopy(),
 | 
				
			||||||
		DeviceNumberOfType: o.DeviceNumberOfType,
 | 
							DeviceNumberOfType: o.DeviceNumberOfType,
 | 
				
			||||||
@@ -557,6 +563,12 @@ func (e DeviceType) String() string {
 | 
				
			|||||||
	return fmt.Sprintf("%v", int(e))
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DeviceTypeV2 string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o DeviceTypeV2) DeepCopy() DeviceTypeV2 {
 | 
				
			||||||
 | 
						return o
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Stream struct {
 | 
					type Stream struct {
 | 
				
			||||||
	Fd int `codec:"fd" json:"fd"`
 | 
						Fd int `codec:"fd" json:"fd"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1061,26 +1073,84 @@ func (e OfflineAvailability) String() string {
 | 
				
			|||||||
	return fmt.Sprintf("%v", int(e))
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserReacji struct {
 | 
				
			||||||
 | 
						Name             string  `codec:"name" json:"name"`
 | 
				
			||||||
 | 
						CustomAddr       *string `codec:"customAddr,omitempty" json:"customAddr,omitempty"`
 | 
				
			||||||
 | 
						CustomAddrNoAnim *string `codec:"customAddrNoAnim,omitempty" json:"customAddrNoAnim,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o UserReacji) DeepCopy() UserReacji {
 | 
				
			||||||
 | 
						return UserReacji{
 | 
				
			||||||
 | 
							Name: o.Name,
 | 
				
			||||||
 | 
							CustomAddr: (func(x *string) *string {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x)
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.CustomAddr),
 | 
				
			||||||
 | 
							CustomAddrNoAnim: (func(x *string) *string {
 | 
				
			||||||
 | 
								if x == nil {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								tmp := (*x)
 | 
				
			||||||
 | 
								return &tmp
 | 
				
			||||||
 | 
							})(o.CustomAddrNoAnim),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ReacjiSkinTone int
 | 
					type ReacjiSkinTone int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o ReacjiSkinTone) DeepCopy() ReacjiSkinTone {
 | 
					const (
 | 
				
			||||||
	return o
 | 
						ReacjiSkinTone_NONE      ReacjiSkinTone = 0
 | 
				
			||||||
 | 
						ReacjiSkinTone_SKINTONE1 ReacjiSkinTone = 1
 | 
				
			||||||
 | 
						ReacjiSkinTone_SKINTONE2 ReacjiSkinTone = 2
 | 
				
			||||||
 | 
						ReacjiSkinTone_SKINTONE3 ReacjiSkinTone = 3
 | 
				
			||||||
 | 
						ReacjiSkinTone_SKINTONE4 ReacjiSkinTone = 4
 | 
				
			||||||
 | 
						ReacjiSkinTone_SKINTONE5 ReacjiSkinTone = 5
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o ReacjiSkinTone) DeepCopy() ReacjiSkinTone { return o }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var ReacjiSkinToneMap = map[string]ReacjiSkinTone{
 | 
				
			||||||
 | 
						"NONE":      0,
 | 
				
			||||||
 | 
						"SKINTONE1": 1,
 | 
				
			||||||
 | 
						"SKINTONE2": 2,
 | 
				
			||||||
 | 
						"SKINTONE3": 3,
 | 
				
			||||||
 | 
						"SKINTONE4": 4,
 | 
				
			||||||
 | 
						"SKINTONE5": 5,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var ReacjiSkinToneRevMap = map[ReacjiSkinTone]string{
 | 
				
			||||||
 | 
						0: "NONE",
 | 
				
			||||||
 | 
						1: "SKINTONE1",
 | 
				
			||||||
 | 
						2: "SKINTONE2",
 | 
				
			||||||
 | 
						3: "SKINTONE3",
 | 
				
			||||||
 | 
						4: "SKINTONE4",
 | 
				
			||||||
 | 
						5: "SKINTONE5",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e ReacjiSkinTone) String() string {
 | 
				
			||||||
 | 
						if v, ok := ReacjiSkinToneRevMap[e]; ok {
 | 
				
			||||||
 | 
							return v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type UserReacjis struct {
 | 
					type UserReacjis struct {
 | 
				
			||||||
	TopReacjis []string       `codec:"topReacjis" json:"topReacjis"`
 | 
						TopReacjis []UserReacji   `codec:"topReacjis" json:"topReacjis"`
 | 
				
			||||||
	SkinTone   ReacjiSkinTone `codec:"skinTone" json:"skinTone"`
 | 
						SkinTone   ReacjiSkinTone `codec:"skinTone" json:"skinTone"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o UserReacjis) DeepCopy() UserReacjis {
 | 
					func (o UserReacjis) DeepCopy() UserReacjis {
 | 
				
			||||||
	return UserReacjis{
 | 
						return UserReacjis{
 | 
				
			||||||
		TopReacjis: (func(x []string) []string {
 | 
							TopReacjis: (func(x []UserReacji) []UserReacji {
 | 
				
			||||||
			if x == nil {
 | 
								if x == nil {
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			ret := make([]string, len(x))
 | 
								ret := make([]UserReacji, len(x))
 | 
				
			||||||
			for i, v := range x {
 | 
								for i, v := range x {
 | 
				
			||||||
				vCopy := v
 | 
									vCopy := v.DeepCopy()
 | 
				
			||||||
				ret[i] = vCopy
 | 
									ret[i] = vCopy
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return ret
 | 
								return ret
 | 
				
			||||||
@@ -1088,3 +1158,38 @@ func (o UserReacjis) DeepCopy() UserReacjis {
 | 
				
			|||||||
		SkinTone: o.SkinTone.DeepCopy(),
 | 
							SkinTone: o.SkinTone.DeepCopy(),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type WotStatusType int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						WotStatusType_NONE     WotStatusType = 0
 | 
				
			||||||
 | 
						WotStatusType_PROPOSED WotStatusType = 1
 | 
				
			||||||
 | 
						WotStatusType_ACCEPTED WotStatusType = 2
 | 
				
			||||||
 | 
						WotStatusType_REJECTED WotStatusType = 3
 | 
				
			||||||
 | 
						WotStatusType_REVOKED  WotStatusType = 4
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o WotStatusType) DeepCopy() WotStatusType { return o }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var WotStatusTypeMap = map[string]WotStatusType{
 | 
				
			||||||
 | 
						"NONE":     0,
 | 
				
			||||||
 | 
						"PROPOSED": 1,
 | 
				
			||||||
 | 
						"ACCEPTED": 2,
 | 
				
			||||||
 | 
						"REJECTED": 3,
 | 
				
			||||||
 | 
						"REVOKED":  4,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var WotStatusTypeRevMap = map[WotStatusType]string{
 | 
				
			||||||
 | 
						0: "NONE",
 | 
				
			||||||
 | 
						1: "PROPOSED",
 | 
				
			||||||
 | 
						2: "ACCEPTED",
 | 
				
			||||||
 | 
						3: "REJECTED",
 | 
				
			||||||
 | 
						4: "REVOKED",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e WotStatusType) String() string {
 | 
				
			||||||
 | 
						if v, ok := WotStatusTypeRevMap[e]; ok {
 | 
				
			||||||
 | 
							return v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fmt.Sprintf("%v", int(e))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/config.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/config.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
@@ -14,6 +14,7 @@ type CurrentStatus struct {
 | 
				
			|||||||
	LoggedIn       bool   `codec:"loggedIn" json:"loggedIn"`
 | 
						LoggedIn       bool   `codec:"loggedIn" json:"loggedIn"`
 | 
				
			||||||
	SessionIsValid bool   `codec:"sessionIsValid" json:"sessionIsValid"`
 | 
						SessionIsValid bool   `codec:"sessionIsValid" json:"sessionIsValid"`
 | 
				
			||||||
	User           *User  `codec:"user,omitempty" json:"user,omitempty"`
 | 
						User           *User  `codec:"user,omitempty" json:"user,omitempty"`
 | 
				
			||||||
 | 
						DeviceName     string `codec:"deviceName" json:"deviceName"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o CurrentStatus) DeepCopy() CurrentStatus {
 | 
					func (o CurrentStatus) DeepCopy() CurrentStatus {
 | 
				
			||||||
@@ -29,6 +30,7 @@ func (o CurrentStatus) DeepCopy() CurrentStatus {
 | 
				
			|||||||
			tmp := (*x).DeepCopy()
 | 
								tmp := (*x).DeepCopy()
 | 
				
			||||||
			return &tmp
 | 
								return &tmp
 | 
				
			||||||
		})(o.User),
 | 
							})(o.User),
 | 
				
			||||||
 | 
							DeviceName: o.DeviceName,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -331,6 +333,7 @@ type KbServiceStatus struct {
 | 
				
			|||||||
	Pid     string `codec:"pid" json:"pid"`
 | 
						Pid     string `codec:"pid" json:"pid"`
 | 
				
			||||||
	Log     string `codec:"log" json:"log"`
 | 
						Log     string `codec:"log" json:"log"`
 | 
				
			||||||
	EkLog   string `codec:"ekLog" json:"ekLog"`
 | 
						EkLog   string `codec:"ekLog" json:"ekLog"`
 | 
				
			||||||
 | 
						PerfLog string `codec:"perfLog" json:"perfLog"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o KbServiceStatus) DeepCopy() KbServiceStatus {
 | 
					func (o KbServiceStatus) DeepCopy() KbServiceStatus {
 | 
				
			||||||
@@ -340,6 +343,7 @@ func (o KbServiceStatus) DeepCopy() KbServiceStatus {
 | 
				
			|||||||
		Pid:     o.Pid,
 | 
							Pid:     o.Pid,
 | 
				
			||||||
		Log:     o.Log,
 | 
							Log:     o.Log,
 | 
				
			||||||
		EkLog:   o.EkLog,
 | 
							EkLog:   o.EkLog,
 | 
				
			||||||
 | 
							PerfLog: o.PerfLog,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -349,6 +353,7 @@ type KBFSStatus struct {
 | 
				
			|||||||
	Running          bool   `codec:"running" json:"running"`
 | 
						Running          bool   `codec:"running" json:"running"`
 | 
				
			||||||
	Pid              string `codec:"pid" json:"pid"`
 | 
						Pid              string `codec:"pid" json:"pid"`
 | 
				
			||||||
	Log              string `codec:"log" json:"log"`
 | 
						Log              string `codec:"log" json:"log"`
 | 
				
			||||||
 | 
						PerfLog          string `codec:"perfLog" json:"perfLog"`
 | 
				
			||||||
	Mount            string `codec:"mount" json:"mount"`
 | 
						Mount            string `codec:"mount" json:"mount"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -359,6 +364,7 @@ func (o KBFSStatus) DeepCopy() KBFSStatus {
 | 
				
			|||||||
		Running:          o.Running,
 | 
							Running:          o.Running,
 | 
				
			||||||
		Pid:              o.Pid,
 | 
							Pid:              o.Pid,
 | 
				
			||||||
		Log:              o.Log,
 | 
							Log:              o.Log,
 | 
				
			||||||
 | 
							PerfLog:          o.PerfLog,
 | 
				
			||||||
		Mount:            o.Mount,
 | 
							Mount:            o.Mount,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -399,11 +405,13 @@ func (o StartStatus) DeepCopy() StartStatus {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type GitStatus struct {
 | 
					type GitStatus struct {
 | 
				
			||||||
	Log     string `codec:"log" json:"log"`
 | 
						Log     string `codec:"log" json:"log"`
 | 
				
			||||||
 | 
						PerfLog string `codec:"perfLog" json:"perfLog"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o GitStatus) DeepCopy() GitStatus {
 | 
					func (o GitStatus) DeepCopy() GitStatus {
 | 
				
			||||||
	return GitStatus{
 | 
						return GitStatus{
 | 
				
			||||||
		Log:     o.Log,
 | 
							Log:     o.Log,
 | 
				
			||||||
 | 
							PerfLog: o.PerfLog,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/constants.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/constants.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/constants.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/constants.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
@@ -12,6 +12,7 @@ type StatusCode int
 | 
				
			|||||||
const (
 | 
					const (
 | 
				
			||||||
	StatusCode_SCOk                                        StatusCode = 0
 | 
						StatusCode_SCOk                                        StatusCode = 0
 | 
				
			||||||
	StatusCode_SCInputError                                StatusCode = 100
 | 
						StatusCode_SCInputError                                StatusCode = 100
 | 
				
			||||||
 | 
						StatusCode_SCAssertionParseError                       StatusCode = 101
 | 
				
			||||||
	StatusCode_SCLoginRequired                             StatusCode = 201
 | 
						StatusCode_SCLoginRequired                             StatusCode = 201
 | 
				
			||||||
	StatusCode_SCBadSession                                StatusCode = 202
 | 
						StatusCode_SCBadSession                                StatusCode = 202
 | 
				
			||||||
	StatusCode_SCBadLoginUserNotFound                      StatusCode = 203
 | 
						StatusCode_SCBadLoginUserNotFound                      StatusCode = 203
 | 
				
			||||||
@@ -34,11 +35,13 @@ const (
 | 
				
			|||||||
	StatusCode_SCWrongCryptoFormat                         StatusCode = 279
 | 
						StatusCode_SCWrongCryptoFormat                         StatusCode = 279
 | 
				
			||||||
	StatusCode_SCDecryptionError                           StatusCode = 280
 | 
						StatusCode_SCDecryptionError                           StatusCode = 280
 | 
				
			||||||
	StatusCode_SCInvalidAddress                            StatusCode = 281
 | 
						StatusCode_SCInvalidAddress                            StatusCode = 281
 | 
				
			||||||
 | 
						StatusCode_SCWrongCryptoMsgType                        StatusCode = 282
 | 
				
			||||||
	StatusCode_SCNoSession                                 StatusCode = 283
 | 
						StatusCode_SCNoSession                                 StatusCode = 283
 | 
				
			||||||
	StatusCode_SCAccountReset                              StatusCode = 290
 | 
						StatusCode_SCAccountReset                              StatusCode = 290
 | 
				
			||||||
	StatusCode_SCIdentifiesFailed                          StatusCode = 295
 | 
						StatusCode_SCIdentifiesFailed                          StatusCode = 295
 | 
				
			||||||
	StatusCode_SCNoSpaceOnDevice                           StatusCode = 297
 | 
						StatusCode_SCNoSpaceOnDevice                           StatusCode = 297
 | 
				
			||||||
	StatusCode_SCMerkleClientError                         StatusCode = 299
 | 
						StatusCode_SCMerkleClientError                         StatusCode = 299
 | 
				
			||||||
 | 
						StatusCode_SCMerkleUpdateRoot                          StatusCode = 300
 | 
				
			||||||
	StatusCode_SCBadEmail                                  StatusCode = 472
 | 
						StatusCode_SCBadEmail                                  StatusCode = 472
 | 
				
			||||||
	StatusCode_SCRateLimit                                 StatusCode = 602
 | 
						StatusCode_SCRateLimit                                 StatusCode = 602
 | 
				
			||||||
	StatusCode_SCBadSignupUsernameTaken                    StatusCode = 701
 | 
						StatusCode_SCBadSignupUsernameTaken                    StatusCode = 701
 | 
				
			||||||
@@ -69,6 +72,7 @@ const (
 | 
				
			|||||||
	StatusCode_SCKeyDuplicateUpdate                        StatusCode = 921
 | 
						StatusCode_SCKeyDuplicateUpdate                        StatusCode = 921
 | 
				
			||||||
	StatusCode_SCSibkeyAlreadyExists                       StatusCode = 922
 | 
						StatusCode_SCSibkeyAlreadyExists                       StatusCode = 922
 | 
				
			||||||
	StatusCode_SCDecryptionKeyNotFound                     StatusCode = 924
 | 
						StatusCode_SCDecryptionKeyNotFound                     StatusCode = 924
 | 
				
			||||||
 | 
						StatusCode_SCVerificationKeyNotFound                   StatusCode = 925
 | 
				
			||||||
	StatusCode_SCKeyNoPGPEncryption                        StatusCode = 927
 | 
						StatusCode_SCKeyNoPGPEncryption                        StatusCode = 927
 | 
				
			||||||
	StatusCode_SCKeyNoNaClEncryption                       StatusCode = 928
 | 
						StatusCode_SCKeyNoNaClEncryption                       StatusCode = 928
 | 
				
			||||||
	StatusCode_SCKeySyncedPGPNotFound                      StatusCode = 929
 | 
						StatusCode_SCKeySyncedPGPNotFound                      StatusCode = 929
 | 
				
			||||||
@@ -102,6 +106,7 @@ const (
 | 
				
			|||||||
	StatusCode_SCGenericAPIError                           StatusCode = 1600
 | 
						StatusCode_SCGenericAPIError                           StatusCode = 1600
 | 
				
			||||||
	StatusCode_SCAPINetworkError                           StatusCode = 1601
 | 
						StatusCode_SCAPINetworkError                           StatusCode = 1601
 | 
				
			||||||
	StatusCode_SCTimeout                                   StatusCode = 1602
 | 
						StatusCode_SCTimeout                                   StatusCode = 1602
 | 
				
			||||||
 | 
						StatusCode_SCKBFSClientTimeout                         StatusCode = 1603
 | 
				
			||||||
	StatusCode_SCProofError                                StatusCode = 1701
 | 
						StatusCode_SCProofError                                StatusCode = 1701
 | 
				
			||||||
	StatusCode_SCIdentificationExpired                     StatusCode = 1702
 | 
						StatusCode_SCIdentificationExpired                     StatusCode = 1702
 | 
				
			||||||
	StatusCode_SCSelfNotFound                              StatusCode = 1703
 | 
						StatusCode_SCSelfNotFound                              StatusCode = 1703
 | 
				
			||||||
@@ -142,6 +147,8 @@ const (
 | 
				
			|||||||
	StatusCode_SCChatNotInTeam                             StatusCode = 2517
 | 
						StatusCode_SCChatNotInTeam                             StatusCode = 2517
 | 
				
			||||||
	StatusCode_SCChatStalePreviousState                    StatusCode = 2518
 | 
						StatusCode_SCChatStalePreviousState                    StatusCode = 2518
 | 
				
			||||||
	StatusCode_SCChatEphemeralRetentionPolicyViolatedError StatusCode = 2519
 | 
						StatusCode_SCChatEphemeralRetentionPolicyViolatedError StatusCode = 2519
 | 
				
			||||||
 | 
						StatusCode_SCChatUsersAlreadyInConversationError       StatusCode = 2520
 | 
				
			||||||
 | 
						StatusCode_SCChatBadConversationError                  StatusCode = 2521
 | 
				
			||||||
	StatusCode_SCTeamBadMembership                         StatusCode = 2604
 | 
						StatusCode_SCTeamBadMembership                         StatusCode = 2604
 | 
				
			||||||
	StatusCode_SCTeamSelfNotOwner                          StatusCode = 2607
 | 
						StatusCode_SCTeamSelfNotOwner                          StatusCode = 2607
 | 
				
			||||||
	StatusCode_SCTeamNotFound                              StatusCode = 2614
 | 
						StatusCode_SCTeamNotFound                              StatusCode = 2614
 | 
				
			||||||
@@ -152,6 +159,8 @@ const (
 | 
				
			|||||||
	StatusCode_SCNoOp                                      StatusCode = 2638
 | 
						StatusCode_SCNoOp                                      StatusCode = 2638
 | 
				
			||||||
	StatusCode_SCTeamInviteBadCancel                       StatusCode = 2645
 | 
						StatusCode_SCTeamInviteBadCancel                       StatusCode = 2645
 | 
				
			||||||
	StatusCode_SCTeamInviteBadToken                        StatusCode = 2646
 | 
						StatusCode_SCTeamInviteBadToken                        StatusCode = 2646
 | 
				
			||||||
 | 
						StatusCode_SCTeamInviteCompletionMissing               StatusCode = 2648
 | 
				
			||||||
 | 
						StatusCode_SCTeamBadNameReservedDB                     StatusCode = 2650
 | 
				
			||||||
	StatusCode_SCTeamTarDuplicate                          StatusCode = 2663
 | 
						StatusCode_SCTeamTarDuplicate                          StatusCode = 2663
 | 
				
			||||||
	StatusCode_SCTeamTarNotFound                           StatusCode = 2664
 | 
						StatusCode_SCTeamTarNotFound                           StatusCode = 2664
 | 
				
			||||||
	StatusCode_SCTeamMemberExists                          StatusCode = 2665
 | 
						StatusCode_SCTeamMemberExists                          StatusCode = 2665
 | 
				
			||||||
@@ -188,6 +197,7 @@ const (
 | 
				
			|||||||
	StatusCode_SCTeamStorageBadGeneration                  StatusCode = 2761
 | 
						StatusCode_SCTeamStorageBadGeneration                  StatusCode = 2761
 | 
				
			||||||
	StatusCode_SCTeamStorageNotFound                       StatusCode = 2762
 | 
						StatusCode_SCTeamStorageNotFound                       StatusCode = 2762
 | 
				
			||||||
	StatusCode_SCTeamContactSettingsBlock                  StatusCode = 2763
 | 
						StatusCode_SCTeamContactSettingsBlock                  StatusCode = 2763
 | 
				
			||||||
 | 
						StatusCode_SCTeamSeitanInviteNeedPUK                   StatusCode = 2770
 | 
				
			||||||
	StatusCode_SCEphemeralKeyBadGeneration                 StatusCode = 2900
 | 
						StatusCode_SCEphemeralKeyBadGeneration                 StatusCode = 2900
 | 
				
			||||||
	StatusCode_SCEphemeralKeyUnexpectedBox                 StatusCode = 2901
 | 
						StatusCode_SCEphemeralKeyUnexpectedBox                 StatusCode = 2901
 | 
				
			||||||
	StatusCode_SCEphemeralKeyMissingBox                    StatusCode = 2902
 | 
						StatusCode_SCEphemeralKeyMissingBox                    StatusCode = 2902
 | 
				
			||||||
@@ -242,6 +252,10 @@ const (
 | 
				
			|||||||
	StatusCode_SCTeambotKeyOldBoxedGeneration              StatusCode = 3801
 | 
						StatusCode_SCTeambotKeyOldBoxedGeneration              StatusCode = 3801
 | 
				
			||||||
	StatusCode_SCTeambotKeyBadGeneration                   StatusCode = 3802
 | 
						StatusCode_SCTeambotKeyBadGeneration                   StatusCode = 3802
 | 
				
			||||||
	StatusCode_SCAirdropRegisterFailedMisc                 StatusCode = 4207
 | 
						StatusCode_SCAirdropRegisterFailedMisc                 StatusCode = 4207
 | 
				
			||||||
 | 
						StatusCode_SCSimpleFSNameExists                        StatusCode = 5101
 | 
				
			||||||
 | 
						StatusCode_SCSimpleFSDirNotEmpty                       StatusCode = 5102
 | 
				
			||||||
 | 
						StatusCode_SCSimpleFSNotExist                          StatusCode = 5103
 | 
				
			||||||
 | 
						StatusCode_SCSimpleFSNoAccess                          StatusCode = 5104
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o StatusCode) DeepCopy() StatusCode { return o }
 | 
					func (o StatusCode) DeepCopy() StatusCode { return o }
 | 
				
			||||||
@@ -249,6 +263,7 @@ func (o StatusCode) DeepCopy() StatusCode { return o }
 | 
				
			|||||||
var StatusCodeMap = map[string]StatusCode{
 | 
					var StatusCodeMap = map[string]StatusCode{
 | 
				
			||||||
	"SCOk":                                        0,
 | 
						"SCOk":                                        0,
 | 
				
			||||||
	"SCInputError":                                100,
 | 
						"SCInputError":                                100,
 | 
				
			||||||
 | 
						"SCAssertionParseError":                       101,
 | 
				
			||||||
	"SCLoginRequired":                             201,
 | 
						"SCLoginRequired":                             201,
 | 
				
			||||||
	"SCBadSession":                                202,
 | 
						"SCBadSession":                                202,
 | 
				
			||||||
	"SCBadLoginUserNotFound":                      203,
 | 
						"SCBadLoginUserNotFound":                      203,
 | 
				
			||||||
@@ -271,11 +286,13 @@ var StatusCodeMap = map[string]StatusCode{
 | 
				
			|||||||
	"SCWrongCryptoFormat":                         279,
 | 
						"SCWrongCryptoFormat":                         279,
 | 
				
			||||||
	"SCDecryptionError":                           280,
 | 
						"SCDecryptionError":                           280,
 | 
				
			||||||
	"SCInvalidAddress":                            281,
 | 
						"SCInvalidAddress":                            281,
 | 
				
			||||||
 | 
						"SCWrongCryptoMsgType":                        282,
 | 
				
			||||||
	"SCNoSession":                                 283,
 | 
						"SCNoSession":                                 283,
 | 
				
			||||||
	"SCAccountReset":                              290,
 | 
						"SCAccountReset":                              290,
 | 
				
			||||||
	"SCIdentifiesFailed":                          295,
 | 
						"SCIdentifiesFailed":                          295,
 | 
				
			||||||
	"SCNoSpaceOnDevice":                           297,
 | 
						"SCNoSpaceOnDevice":                           297,
 | 
				
			||||||
	"SCMerkleClientError":                         299,
 | 
						"SCMerkleClientError":                         299,
 | 
				
			||||||
 | 
						"SCMerkleUpdateRoot":                          300,
 | 
				
			||||||
	"SCBadEmail":                                  472,
 | 
						"SCBadEmail":                                  472,
 | 
				
			||||||
	"SCRateLimit":                                 602,
 | 
						"SCRateLimit":                                 602,
 | 
				
			||||||
	"SCBadSignupUsernameTaken":                    701,
 | 
						"SCBadSignupUsernameTaken":                    701,
 | 
				
			||||||
@@ -306,6 +323,7 @@ var StatusCodeMap = map[string]StatusCode{
 | 
				
			|||||||
	"SCKeyDuplicateUpdate":                        921,
 | 
						"SCKeyDuplicateUpdate":                        921,
 | 
				
			||||||
	"SCSibkeyAlreadyExists":                       922,
 | 
						"SCSibkeyAlreadyExists":                       922,
 | 
				
			||||||
	"SCDecryptionKeyNotFound":                     924,
 | 
						"SCDecryptionKeyNotFound":                     924,
 | 
				
			||||||
 | 
						"SCVerificationKeyNotFound":                   925,
 | 
				
			||||||
	"SCKeyNoPGPEncryption":                        927,
 | 
						"SCKeyNoPGPEncryption":                        927,
 | 
				
			||||||
	"SCKeyNoNaClEncryption":                       928,
 | 
						"SCKeyNoNaClEncryption":                       928,
 | 
				
			||||||
	"SCKeySyncedPGPNotFound":                      929,
 | 
						"SCKeySyncedPGPNotFound":                      929,
 | 
				
			||||||
@@ -339,6 +357,7 @@ var StatusCodeMap = map[string]StatusCode{
 | 
				
			|||||||
	"SCGenericAPIError":                           1600,
 | 
						"SCGenericAPIError":                           1600,
 | 
				
			||||||
	"SCAPINetworkError":                           1601,
 | 
						"SCAPINetworkError":                           1601,
 | 
				
			||||||
	"SCTimeout":                                   1602,
 | 
						"SCTimeout":                                   1602,
 | 
				
			||||||
 | 
						"SCKBFSClientTimeout":                         1603,
 | 
				
			||||||
	"SCProofError":                                1701,
 | 
						"SCProofError":                                1701,
 | 
				
			||||||
	"SCIdentificationExpired":                     1702,
 | 
						"SCIdentificationExpired":                     1702,
 | 
				
			||||||
	"SCSelfNotFound":                              1703,
 | 
						"SCSelfNotFound":                              1703,
 | 
				
			||||||
@@ -379,6 +398,8 @@ var StatusCodeMap = map[string]StatusCode{
 | 
				
			|||||||
	"SCChatNotInTeam":                             2517,
 | 
						"SCChatNotInTeam":                             2517,
 | 
				
			||||||
	"SCChatStalePreviousState":                    2518,
 | 
						"SCChatStalePreviousState":                    2518,
 | 
				
			||||||
	"SCChatEphemeralRetentionPolicyViolatedError": 2519,
 | 
						"SCChatEphemeralRetentionPolicyViolatedError": 2519,
 | 
				
			||||||
 | 
						"SCChatUsersAlreadyInConversationError":       2520,
 | 
				
			||||||
 | 
						"SCChatBadConversationError":                  2521,
 | 
				
			||||||
	"SCTeamBadMembership":                         2604,
 | 
						"SCTeamBadMembership":                         2604,
 | 
				
			||||||
	"SCTeamSelfNotOwner":                          2607,
 | 
						"SCTeamSelfNotOwner":                          2607,
 | 
				
			||||||
	"SCTeamNotFound":                              2614,
 | 
						"SCTeamNotFound":                              2614,
 | 
				
			||||||
@@ -389,6 +410,8 @@ var StatusCodeMap = map[string]StatusCode{
 | 
				
			|||||||
	"SCNoOp":                                      2638,
 | 
						"SCNoOp":                                      2638,
 | 
				
			||||||
	"SCTeamInviteBadCancel":                       2645,
 | 
						"SCTeamInviteBadCancel":                       2645,
 | 
				
			||||||
	"SCTeamInviteBadToken":                        2646,
 | 
						"SCTeamInviteBadToken":                        2646,
 | 
				
			||||||
 | 
						"SCTeamInviteCompletionMissing":               2648,
 | 
				
			||||||
 | 
						"SCTeamBadNameReservedDB":                     2650,
 | 
				
			||||||
	"SCTeamTarDuplicate":                          2663,
 | 
						"SCTeamTarDuplicate":                          2663,
 | 
				
			||||||
	"SCTeamTarNotFound":                           2664,
 | 
						"SCTeamTarNotFound":                           2664,
 | 
				
			||||||
	"SCTeamMemberExists":                          2665,
 | 
						"SCTeamMemberExists":                          2665,
 | 
				
			||||||
@@ -425,6 +448,7 @@ var StatusCodeMap = map[string]StatusCode{
 | 
				
			|||||||
	"SCTeamStorageBadGeneration":                  2761,
 | 
						"SCTeamStorageBadGeneration":                  2761,
 | 
				
			||||||
	"SCTeamStorageNotFound":                       2762,
 | 
						"SCTeamStorageNotFound":                       2762,
 | 
				
			||||||
	"SCTeamContactSettingsBlock":                  2763,
 | 
						"SCTeamContactSettingsBlock":                  2763,
 | 
				
			||||||
 | 
						"SCTeamSeitanInviteNeedPUK":                   2770,
 | 
				
			||||||
	"SCEphemeralKeyBadGeneration":                 2900,
 | 
						"SCEphemeralKeyBadGeneration":                 2900,
 | 
				
			||||||
	"SCEphemeralKeyUnexpectedBox":                 2901,
 | 
						"SCEphemeralKeyUnexpectedBox":                 2901,
 | 
				
			||||||
	"SCEphemeralKeyMissingBox":                    2902,
 | 
						"SCEphemeralKeyMissingBox":                    2902,
 | 
				
			||||||
@@ -479,11 +503,16 @@ var StatusCodeMap = map[string]StatusCode{
 | 
				
			|||||||
	"SCTeambotKeyOldBoxedGeneration":              3801,
 | 
						"SCTeambotKeyOldBoxedGeneration":              3801,
 | 
				
			||||||
	"SCTeambotKeyBadGeneration":                   3802,
 | 
						"SCTeambotKeyBadGeneration":                   3802,
 | 
				
			||||||
	"SCAirdropRegisterFailedMisc":                 4207,
 | 
						"SCAirdropRegisterFailedMisc":                 4207,
 | 
				
			||||||
 | 
						"SCSimpleFSNameExists":                        5101,
 | 
				
			||||||
 | 
						"SCSimpleFSDirNotEmpty":                       5102,
 | 
				
			||||||
 | 
						"SCSimpleFSNotExist":                          5103,
 | 
				
			||||||
 | 
						"SCSimpleFSNoAccess":                          5104,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var StatusCodeRevMap = map[StatusCode]string{
 | 
					var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			||||||
	0:    "SCOk",
 | 
						0:    "SCOk",
 | 
				
			||||||
	100:  "SCInputError",
 | 
						100:  "SCInputError",
 | 
				
			||||||
 | 
						101:  "SCAssertionParseError",
 | 
				
			||||||
	201:  "SCLoginRequired",
 | 
						201:  "SCLoginRequired",
 | 
				
			||||||
	202:  "SCBadSession",
 | 
						202:  "SCBadSession",
 | 
				
			||||||
	203:  "SCBadLoginUserNotFound",
 | 
						203:  "SCBadLoginUserNotFound",
 | 
				
			||||||
@@ -506,11 +535,13 @@ var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			|||||||
	279:  "SCWrongCryptoFormat",
 | 
						279:  "SCWrongCryptoFormat",
 | 
				
			||||||
	280:  "SCDecryptionError",
 | 
						280:  "SCDecryptionError",
 | 
				
			||||||
	281:  "SCInvalidAddress",
 | 
						281:  "SCInvalidAddress",
 | 
				
			||||||
 | 
						282:  "SCWrongCryptoMsgType",
 | 
				
			||||||
	283:  "SCNoSession",
 | 
						283:  "SCNoSession",
 | 
				
			||||||
	290:  "SCAccountReset",
 | 
						290:  "SCAccountReset",
 | 
				
			||||||
	295:  "SCIdentifiesFailed",
 | 
						295:  "SCIdentifiesFailed",
 | 
				
			||||||
	297:  "SCNoSpaceOnDevice",
 | 
						297:  "SCNoSpaceOnDevice",
 | 
				
			||||||
	299:  "SCMerkleClientError",
 | 
						299:  "SCMerkleClientError",
 | 
				
			||||||
 | 
						300:  "SCMerkleUpdateRoot",
 | 
				
			||||||
	472:  "SCBadEmail",
 | 
						472:  "SCBadEmail",
 | 
				
			||||||
	602:  "SCRateLimit",
 | 
						602:  "SCRateLimit",
 | 
				
			||||||
	701:  "SCBadSignupUsernameTaken",
 | 
						701:  "SCBadSignupUsernameTaken",
 | 
				
			||||||
@@ -541,6 +572,7 @@ var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			|||||||
	921:  "SCKeyDuplicateUpdate",
 | 
						921:  "SCKeyDuplicateUpdate",
 | 
				
			||||||
	922:  "SCSibkeyAlreadyExists",
 | 
						922:  "SCSibkeyAlreadyExists",
 | 
				
			||||||
	924:  "SCDecryptionKeyNotFound",
 | 
						924:  "SCDecryptionKeyNotFound",
 | 
				
			||||||
 | 
						925:  "SCVerificationKeyNotFound",
 | 
				
			||||||
	927:  "SCKeyNoPGPEncryption",
 | 
						927:  "SCKeyNoPGPEncryption",
 | 
				
			||||||
	928:  "SCKeyNoNaClEncryption",
 | 
						928:  "SCKeyNoNaClEncryption",
 | 
				
			||||||
	929:  "SCKeySyncedPGPNotFound",
 | 
						929:  "SCKeySyncedPGPNotFound",
 | 
				
			||||||
@@ -574,6 +606,7 @@ var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			|||||||
	1600: "SCGenericAPIError",
 | 
						1600: "SCGenericAPIError",
 | 
				
			||||||
	1601: "SCAPINetworkError",
 | 
						1601: "SCAPINetworkError",
 | 
				
			||||||
	1602: "SCTimeout",
 | 
						1602: "SCTimeout",
 | 
				
			||||||
 | 
						1603: "SCKBFSClientTimeout",
 | 
				
			||||||
	1701: "SCProofError",
 | 
						1701: "SCProofError",
 | 
				
			||||||
	1702: "SCIdentificationExpired",
 | 
						1702: "SCIdentificationExpired",
 | 
				
			||||||
	1703: "SCSelfNotFound",
 | 
						1703: "SCSelfNotFound",
 | 
				
			||||||
@@ -614,6 +647,8 @@ var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			|||||||
	2517: "SCChatNotInTeam",
 | 
						2517: "SCChatNotInTeam",
 | 
				
			||||||
	2518: "SCChatStalePreviousState",
 | 
						2518: "SCChatStalePreviousState",
 | 
				
			||||||
	2519: "SCChatEphemeralRetentionPolicyViolatedError",
 | 
						2519: "SCChatEphemeralRetentionPolicyViolatedError",
 | 
				
			||||||
 | 
						2520: "SCChatUsersAlreadyInConversationError",
 | 
				
			||||||
 | 
						2521: "SCChatBadConversationError",
 | 
				
			||||||
	2604: "SCTeamBadMembership",
 | 
						2604: "SCTeamBadMembership",
 | 
				
			||||||
	2607: "SCTeamSelfNotOwner",
 | 
						2607: "SCTeamSelfNotOwner",
 | 
				
			||||||
	2614: "SCTeamNotFound",
 | 
						2614: "SCTeamNotFound",
 | 
				
			||||||
@@ -624,6 +659,8 @@ var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			|||||||
	2638: "SCNoOp",
 | 
						2638: "SCNoOp",
 | 
				
			||||||
	2645: "SCTeamInviteBadCancel",
 | 
						2645: "SCTeamInviteBadCancel",
 | 
				
			||||||
	2646: "SCTeamInviteBadToken",
 | 
						2646: "SCTeamInviteBadToken",
 | 
				
			||||||
 | 
						2648: "SCTeamInviteCompletionMissing",
 | 
				
			||||||
 | 
						2650: "SCTeamBadNameReservedDB",
 | 
				
			||||||
	2663: "SCTeamTarDuplicate",
 | 
						2663: "SCTeamTarDuplicate",
 | 
				
			||||||
	2664: "SCTeamTarNotFound",
 | 
						2664: "SCTeamTarNotFound",
 | 
				
			||||||
	2665: "SCTeamMemberExists",
 | 
						2665: "SCTeamMemberExists",
 | 
				
			||||||
@@ -660,6 +697,7 @@ var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			|||||||
	2761: "SCTeamStorageBadGeneration",
 | 
						2761: "SCTeamStorageBadGeneration",
 | 
				
			||||||
	2762: "SCTeamStorageNotFound",
 | 
						2762: "SCTeamStorageNotFound",
 | 
				
			||||||
	2763: "SCTeamContactSettingsBlock",
 | 
						2763: "SCTeamContactSettingsBlock",
 | 
				
			||||||
 | 
						2770: "SCTeamSeitanInviteNeedPUK",
 | 
				
			||||||
	2900: "SCEphemeralKeyBadGeneration",
 | 
						2900: "SCEphemeralKeyBadGeneration",
 | 
				
			||||||
	2901: "SCEphemeralKeyUnexpectedBox",
 | 
						2901: "SCEphemeralKeyUnexpectedBox",
 | 
				
			||||||
	2902: "SCEphemeralKeyMissingBox",
 | 
						2902: "SCEphemeralKeyMissingBox",
 | 
				
			||||||
@@ -714,6 +752,10 @@ var StatusCodeRevMap = map[StatusCode]string{
 | 
				
			|||||||
	3801: "SCTeambotKeyOldBoxedGeneration",
 | 
						3801: "SCTeambotKeyOldBoxedGeneration",
 | 
				
			||||||
	3802: "SCTeambotKeyBadGeneration",
 | 
						3802: "SCTeambotKeyBadGeneration",
 | 
				
			||||||
	4207: "SCAirdropRegisterFailedMisc",
 | 
						4207: "SCAirdropRegisterFailedMisc",
 | 
				
			||||||
 | 
						5101: "SCSimpleFSNameExists",
 | 
				
			||||||
 | 
						5102: "SCSimpleFSDirNotEmpty",
 | 
				
			||||||
 | 
						5103: "SCSimpleFSNotExist",
 | 
				
			||||||
 | 
						5104: "SCSimpleFSNoAccess",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e StatusCode) String() string {
 | 
					func (e StatusCode) String() string {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/contacts.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/contacts.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/contacts.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/contacts.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/crypto.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/crypto.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/crypto.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/crypto.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/cryptocurrency.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/cryptocurrency.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/ctl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/ctl.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/ctl.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/ctl.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/debugging.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/debugging.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/debugging.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/debugging.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/delegate_ui_ctl.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/delegate_ui_ctl.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/device.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/device.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/device.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/device.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/emails.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/emails.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/emails.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/emails.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/ephemeral.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/ephemeral.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/ephemeral.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/ephemeral.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/favorite.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/favorite.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/favorite.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/favorite.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/featured_bot.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/featured_bot.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/featured_bot.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/featured_bot.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
@@ -7,6 +7,7 @@ type FeaturedBot struct {
 | 
				
			|||||||
	BotAlias               string  `codec:"botAlias" json:"botAlias"`
 | 
						BotAlias               string  `codec:"botAlias" json:"botAlias"`
 | 
				
			||||||
	Description            string  `codec:"description" json:"description"`
 | 
						Description            string  `codec:"description" json:"description"`
 | 
				
			||||||
	ExtendedDescription    string  `codec:"extendedDescription" json:"extendedDescription"`
 | 
						ExtendedDescription    string  `codec:"extendedDescription" json:"extendedDescription"`
 | 
				
			||||||
 | 
						ExtendedDescriptionRaw string  `codec:"extendedDescriptionRaw" json:"extendedDescriptionRaw"`
 | 
				
			||||||
	BotUsername            string  `codec:"botUsername" json:"botUsername"`
 | 
						BotUsername            string  `codec:"botUsername" json:"botUsername"`
 | 
				
			||||||
	OwnerTeam              *string `codec:"ownerTeam,omitempty" json:"ownerTeam,omitempty"`
 | 
						OwnerTeam              *string `codec:"ownerTeam,omitempty" json:"ownerTeam,omitempty"`
 | 
				
			||||||
	OwnerUser              *string `codec:"ownerUser,omitempty" json:"ownerUser,omitempty"`
 | 
						OwnerUser              *string `codec:"ownerUser,omitempty" json:"ownerUser,omitempty"`
 | 
				
			||||||
@@ -19,6 +20,7 @@ func (o FeaturedBot) DeepCopy() FeaturedBot {
 | 
				
			|||||||
		BotAlias:               o.BotAlias,
 | 
							BotAlias:               o.BotAlias,
 | 
				
			||||||
		Description:            o.Description,
 | 
							Description:            o.Description,
 | 
				
			||||||
		ExtendedDescription:    o.ExtendedDescription,
 | 
							ExtendedDescription:    o.ExtendedDescription,
 | 
				
			||||||
 | 
							ExtendedDescriptionRaw: o.ExtendedDescriptionRaw,
 | 
				
			||||||
		BotUsername:            o.BotUsername,
 | 
							BotUsername:            o.BotUsername,
 | 
				
			||||||
		OwnerTeam: (func(x *string) *string {
 | 
							OwnerTeam: (func(x *string) *string {
 | 
				
			||||||
			if x == nil {
 | 
								if x == nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/fs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/fs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/fs.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/fs.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/git.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/git.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/git.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/git.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gpg_common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gpg_common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/gpg_common.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/gpg_common.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gpg_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gpg_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/gpg_ui.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/gpg_ui.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gregor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gregor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/gregor.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/gregor.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gregor_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/gregor_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/gregor_ui.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/gregor_ui.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/home.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/home.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/home.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/home.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
@@ -298,19 +298,19 @@ const (
 | 
				
			|||||||
	HomeScreenTodoType_PROOF                   HomeScreenTodoType = 2
 | 
						HomeScreenTodoType_PROOF                   HomeScreenTodoType = 2
 | 
				
			||||||
	HomeScreenTodoType_DEVICE                  HomeScreenTodoType = 3
 | 
						HomeScreenTodoType_DEVICE                  HomeScreenTodoType = 3
 | 
				
			||||||
	HomeScreenTodoType_FOLLOW                  HomeScreenTodoType = 4
 | 
						HomeScreenTodoType_FOLLOW                  HomeScreenTodoType = 4
 | 
				
			||||||
	HomeScreenTodoType_CHAT                    HomeScreenTodoType = 5
 | 
					 | 
				
			||||||
	HomeScreenTodoType_PAPERKEY                HomeScreenTodoType = 6
 | 
						HomeScreenTodoType_PAPERKEY                HomeScreenTodoType = 6
 | 
				
			||||||
	HomeScreenTodoType_TEAM                    HomeScreenTodoType = 7
 | 
						HomeScreenTodoType_TEAM                    HomeScreenTodoType = 7
 | 
				
			||||||
	HomeScreenTodoType_FOLDER                  HomeScreenTodoType = 8
 | 
						HomeScreenTodoType_FOLDER                  HomeScreenTodoType = 8
 | 
				
			||||||
	HomeScreenTodoType_GIT_REPO                HomeScreenTodoType = 9
 | 
						HomeScreenTodoType_GIT_REPO                HomeScreenTodoType = 9
 | 
				
			||||||
	HomeScreenTodoType_TEAM_SHOWCASE           HomeScreenTodoType = 10
 | 
						HomeScreenTodoType_TEAM_SHOWCASE           HomeScreenTodoType = 10
 | 
				
			||||||
	HomeScreenTodoType_AVATAR_USER             HomeScreenTodoType = 11
 | 
					 | 
				
			||||||
	HomeScreenTodoType_AVATAR_TEAM             HomeScreenTodoType = 12
 | 
						HomeScreenTodoType_AVATAR_TEAM             HomeScreenTodoType = 12
 | 
				
			||||||
	HomeScreenTodoType_ADD_PHONE_NUMBER        HomeScreenTodoType = 18
 | 
						HomeScreenTodoType_ADD_PHONE_NUMBER        HomeScreenTodoType = 18
 | 
				
			||||||
	HomeScreenTodoType_VERIFY_ALL_PHONE_NUMBER HomeScreenTodoType = 19
 | 
						HomeScreenTodoType_VERIFY_ALL_PHONE_NUMBER HomeScreenTodoType = 19
 | 
				
			||||||
	HomeScreenTodoType_VERIFY_ALL_EMAIL        HomeScreenTodoType = 20
 | 
						HomeScreenTodoType_VERIFY_ALL_EMAIL        HomeScreenTodoType = 20
 | 
				
			||||||
	HomeScreenTodoType_LEGACY_EMAIL_VISIBILITY HomeScreenTodoType = 21
 | 
						HomeScreenTodoType_LEGACY_EMAIL_VISIBILITY HomeScreenTodoType = 21
 | 
				
			||||||
	HomeScreenTodoType_ADD_EMAIL               HomeScreenTodoType = 22
 | 
						HomeScreenTodoType_ADD_EMAIL               HomeScreenTodoType = 22
 | 
				
			||||||
 | 
						HomeScreenTodoType_AVATAR_USER             HomeScreenTodoType = 23
 | 
				
			||||||
 | 
						HomeScreenTodoType_CHAT                    HomeScreenTodoType = 24
 | 
				
			||||||
	HomeScreenTodoType_ANNONCEMENT_PLACEHOLDER HomeScreenTodoType = 10000
 | 
						HomeScreenTodoType_ANNONCEMENT_PLACEHOLDER HomeScreenTodoType = 10000
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -322,19 +322,19 @@ var HomeScreenTodoTypeMap = map[string]HomeScreenTodoType{
 | 
				
			|||||||
	"PROOF":                   2,
 | 
						"PROOF":                   2,
 | 
				
			||||||
	"DEVICE":                  3,
 | 
						"DEVICE":                  3,
 | 
				
			||||||
	"FOLLOW":                  4,
 | 
						"FOLLOW":                  4,
 | 
				
			||||||
	"CHAT":                    5,
 | 
					 | 
				
			||||||
	"PAPERKEY":                6,
 | 
						"PAPERKEY":                6,
 | 
				
			||||||
	"TEAM":                    7,
 | 
						"TEAM":                    7,
 | 
				
			||||||
	"FOLDER":                  8,
 | 
						"FOLDER":                  8,
 | 
				
			||||||
	"GIT_REPO":                9,
 | 
						"GIT_REPO":                9,
 | 
				
			||||||
	"TEAM_SHOWCASE":           10,
 | 
						"TEAM_SHOWCASE":           10,
 | 
				
			||||||
	"AVATAR_USER":             11,
 | 
					 | 
				
			||||||
	"AVATAR_TEAM":             12,
 | 
						"AVATAR_TEAM":             12,
 | 
				
			||||||
	"ADD_PHONE_NUMBER":        18,
 | 
						"ADD_PHONE_NUMBER":        18,
 | 
				
			||||||
	"VERIFY_ALL_PHONE_NUMBER": 19,
 | 
						"VERIFY_ALL_PHONE_NUMBER": 19,
 | 
				
			||||||
	"VERIFY_ALL_EMAIL":        20,
 | 
						"VERIFY_ALL_EMAIL":        20,
 | 
				
			||||||
	"LEGACY_EMAIL_VISIBILITY": 21,
 | 
						"LEGACY_EMAIL_VISIBILITY": 21,
 | 
				
			||||||
	"ADD_EMAIL":               22,
 | 
						"ADD_EMAIL":               22,
 | 
				
			||||||
 | 
						"AVATAR_USER":             23,
 | 
				
			||||||
 | 
						"CHAT":                    24,
 | 
				
			||||||
	"ANNONCEMENT_PLACEHOLDER": 10000,
 | 
						"ANNONCEMENT_PLACEHOLDER": 10000,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -344,19 +344,19 @@ var HomeScreenTodoTypeRevMap = map[HomeScreenTodoType]string{
 | 
				
			|||||||
	2:     "PROOF",
 | 
						2:     "PROOF",
 | 
				
			||||||
	3:     "DEVICE",
 | 
						3:     "DEVICE",
 | 
				
			||||||
	4:     "FOLLOW",
 | 
						4:     "FOLLOW",
 | 
				
			||||||
	5:     "CHAT",
 | 
					 | 
				
			||||||
	6:     "PAPERKEY",
 | 
						6:     "PAPERKEY",
 | 
				
			||||||
	7:     "TEAM",
 | 
						7:     "TEAM",
 | 
				
			||||||
	8:     "FOLDER",
 | 
						8:     "FOLDER",
 | 
				
			||||||
	9:     "GIT_REPO",
 | 
						9:     "GIT_REPO",
 | 
				
			||||||
	10:    "TEAM_SHOWCASE",
 | 
						10:    "TEAM_SHOWCASE",
 | 
				
			||||||
	11:    "AVATAR_USER",
 | 
					 | 
				
			||||||
	12:    "AVATAR_TEAM",
 | 
						12:    "AVATAR_TEAM",
 | 
				
			||||||
	18:    "ADD_PHONE_NUMBER",
 | 
						18:    "ADD_PHONE_NUMBER",
 | 
				
			||||||
	19:    "VERIFY_ALL_PHONE_NUMBER",
 | 
						19:    "VERIFY_ALL_PHONE_NUMBER",
 | 
				
			||||||
	20:    "VERIFY_ALL_EMAIL",
 | 
						20:    "VERIFY_ALL_EMAIL",
 | 
				
			||||||
	21:    "LEGACY_EMAIL_VISIBILITY",
 | 
						21:    "LEGACY_EMAIL_VISIBILITY",
 | 
				
			||||||
	22:    "ADD_EMAIL",
 | 
						22:    "ADD_EMAIL",
 | 
				
			||||||
 | 
						23:    "AVATAR_USER",
 | 
				
			||||||
 | 
						24:    "CHAT",
 | 
				
			||||||
	10000: "ANNONCEMENT_PLACEHOLDER",
 | 
						10000: "ANNONCEMENT_PLACEHOLDER",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/home_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/home_ui.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/home_ui.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/home_ui.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/identify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1/identify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
 | 
					// Auto-generated to Go types using avdl-compiler v1.4.8 (https://github.com/keybase/node-avdl-compiler)
 | 
				
			||||||
//   Input file: ../client/protocol/avdl/keybase1/identify.avdl
 | 
					//   Input file: ../client/protocol/avdl/keybase1/identify.avdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package keybase1
 | 
					package keybase1
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user