Showing preview only (1,271K chars total). Download the full file or copy to clipboard to get everything.
Repository: broderickhyman/albiondata-client
Branch: master
Commit: dc6ec6bc6518
Files: 96
Total size: 1.2 MB
Directory structure:
gitextract_g_2gvmm3/
├── .circleci/
│ └── config.yml
├── .editorconfig
├── .github/
│ └── FUNDING.yml
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── _config.yml
├── albiondata-client.go
├── client/
│ ├── albion_state.go
│ ├── albion_watcher.go
│ ├── client.go
│ ├── config.go
│ ├── decode.go
│ ├── dispatcher.go
│ ├── event_player_online_status.go
│ ├── event_skill_data.go
│ ├── events.go
│ ├── eventtype_string.go
│ ├── listener.go
│ ├── net_interface_filter.go
│ ├── net_interface_filter_nix_darw.go
│ ├── net_interface_filter_win.go
│ ├── offline.go
│ ├── operation_auction_get_item_average_stats.go
│ ├── operation_auction_get_offers.go
│ ├── operation_auction_get_requests.go
│ ├── operation_get_cluster_map_info.go
│ ├── operation_get_game_server_by_cluster.go
│ ├── operation_get_mail_infos.go
│ ├── operation_gold_market_get_average_info.go
│ ├── operation_join.go
│ ├── operation_read_mail.go
│ ├── operation_real_estate_bid_on_auction.go
│ ├── operation_real_estate_get_auction_data.go
│ ├── operations.go
│ ├── operationtype_string.go
│ ├── router.go
│ ├── uploader.go
│ ├── uploader_http.go
│ ├── uploader_http_pow.go
│ ├── uploader_nats.go
│ ├── ws_client.go
│ └── ws_hub.go
├── config.yaml.example
├── go.mod
├── go.sum
├── icon/
│ ├── albiondata-client.psd
│ ├── iconwin.go
│ ├── make_icon.bat
│ └── make_icon.sh
├── lib/
│ ├── README.md
│ ├── common.go
│ ├── gold.go
│ ├── map.go
│ ├── market.go
│ ├── marketHistory.go
│ ├── nats.go
│ └── skills.go
├── log/
│ └── logger.go
├── notification/
│ ├── notification_nix_darw.go
│ └── notification_win.go
├── pkg/
│ └── nsis/
│ ├── Makefile
│ └── albiondata-client.nsi
├── scripts/
│ ├── build-darwin.sh
│ ├── build-linux.sh
│ ├── build-windows.sh
│ ├── fmt.sh
│ ├── run.command
│ ├── run.sh
│ └── validate-fmt.sh
├── systray/
│ ├── systray_others.go
│ └── systray_win.go
└── thirdparty/
├── WpdPack/
│ ├── Include/
│ │ ├── Packet32.h
│ │ ├── Win32-Extensions.h
│ │ ├── bittypes.h
│ │ ├── ip6_misc.h
│ │ ├── pcap/
│ │ │ ├── bluetooth.h
│ │ │ ├── bpf.h
│ │ │ ├── namedb.h
│ │ │ ├── pcap.h
│ │ │ ├── sll.h
│ │ │ ├── usb.h
│ │ │ └── vlan.h
│ │ ├── pcap-bpf.h
│ │ ├── pcap-namedb.h
│ │ ├── pcap-stdinc.h
│ │ ├── pcap.h
│ │ └── remote-ext.h
│ └── Lib/
│ ├── Packet.lib
│ ├── libpacket.a
│ ├── libwpcap.a
│ ├── wpcap.lib
│ └── x64/
│ ├── Packet.lib
│ └── wpcap.lib
└── rcedit/
└── LICENSE
================================================
FILE CONTENTS
================================================
================================================
FILE: .circleci/config.yml
================================================
version: 2
jobs:
test:
working_directory: /go/src/github.com/broderickhyman/albiondata-client
docker:
- image: circleci/golang:1.16
steps:
- checkout
- run: go get golang.org/x/tools/cmd/goimports
- run: make validate-fmt
build_windows:
working_directory: /go/src/github.com/broderickhyman/albiondata-client
docker:
- image: broderickhyman/mingw-golang
steps:
- checkout
- run: make build-windows
- store_artifacts:
path: /go/src/github.com/broderickhyman/albiondata-client/update-windows-amd64.exe.gz
destination: update-windows-amd64.exe.gz
- store_artifacts:
path: /go/src/github.com/broderickhyman/albiondata-client/albiondata-client-amd64-installer.exe
destination: albiondata-client-amd64-installer.exe
- persist_to_workspace:
root: /go/src/github.com/broderickhyman/albiondata-client
paths:
- update-windows-amd64.exe.gz
- albiondata-client-amd64-installer.exe
build_linux:
working_directory: /go/src/github.com/broderickhyman/albiondata-client
docker:
- image: circleci/golang:1.16
steps:
- checkout
- run: make build-linux
- store_artifacts:
path: /go/src/github.com/broderickhyman/albiondata-client/update-linux-amd64.gz
destination: update-linux-amd64.gz
- persist_to_workspace:
root: /go/src/github.com/broderickhyman/albiondata-client
paths:
- update-linux-amd64.gz
build_darwin:
working_directory: /go/src/github.com/broderickhyman/albiondata-client
docker:
- image: broderickhyman/crossbuild-golang
steps:
- checkout
- run: make build-darwin
- store_artifacts:
path: /go/src/github.com/broderickhyman/albiondata-client/update-darwin-amd64.gz
destination: update-darwin-amd64.gz
- store_artifacts:
path: /go/src/github.com/broderickhyman/albiondata-client/albiondata-client-amd64-mac.zip
destination: albiondata-client-amd64-mac.zip
- persist_to_workspace:
root: /go/src/github.com/broderickhyman/albiondata-client
paths:
- update-darwin-amd64.gz
- albiondata-client-amd64-mac.zip
deploy:
working_directory: /tmp/workspace
docker:
- image: circleci/golang:1.17
steps:
- attach_workspace:
at: /tmp/workspace
- run: go get github.com/tcnksm/ghr
- run: ghr -t $GITHUB_TOKEN -u broderickhyman -r albiondata-client $CIRCLE_TAG /tmp/workspace
workflows:
version: 2
test_build_release:
jobs:
- test:
filters:
tags:
only: /.*/
- build_windows:
requires:
- test
filters:
tags:
only: /.*/
- build_linux:
requires:
- test
filters:
tags:
only: /.*/
- build_darwin:
requires:
- test
filters:
tags:
only: /.*/
- deploy:
requires:
- build_windows
- build_linux
- build_darwin
filters:
tags:
only: /^\d+\.\d+\.\d+$/
branches:
ignore: /.*/
================================================
FILE: .editorconfig
================================================
root = true
###########################################################
; common
###########################################################
[*]
charset = utf-8
end_of_line = LF
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
###########################################################
; make
###########################################################
[Makefile]
indent_style = tab
###########################################################
; markdown
###########################################################
[*.md]
trim_trailing_whitespace = false
###########################################################
; golang
###########################################################
[*.go]
indent_style = tab
insert_final_newline = false
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: broderickhyman
open_collective: # Replace with a single Open Collective username
ko_fi: broderickhyman
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # Replace with a single custom sponsorship URL
================================================
FILE: .gitignore
================================================
.idea/
vendor/
_vendor-[0-9]*
.vscode/
*.exe
*.gz
*.zip
*.pcap
*.gob
scripts/albiondata-client
albiondata-client-output.txt
config.yaml
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2017 The Albion Data Project
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Makefile
================================================
run:
scripts/run.sh
fmt:
scripts/fmt.sh
validate-fmt:
scripts/validate-fmt.sh
build-windows:
scripts/build-windows.sh
build-linux:
scripts/build-linux.sh
build-darwin:
scripts/build-darwin.sh
================================================
FILE: README.md
================================================
<!-- [](https://circleci.com/gh/broderickhyman/albiondata-client/tree/master) [](https://goreportcard.com/report/github.com/broderickhyman/albiondata-client)
-->
# THIS REPO IS ARCHIVED! THE ACTIVE REPO CAN BE FOUND [HERE](https://github.com/ao-data/albiondata-client)! (ao-data/albiondata-client)
<br/><br/><br/><br/><br/><br/><br/><br/>
# Albion Data - Client
Distributed client for the [Albion Online Data](https://www.albion-online-data.com/)
project.
A quick note on the legality of this application and if it
violates the Terms and Conditions for Albion Online. Here is
the response from SBI when asked if we are allowed to do
monitor network packets relating to Albion Online:
> Our position is quite simple. As long as you just look and
analyze we are ok with it. The moment you modify or manipulate
something or somehow interfere with our services we will react
(e.g. perma-ban, take legal action, whatever).
~ MadDave - Technical Lead for Albion Online
Source: https://forum.albiononline.com/index.php/Thread/51604-Is-it-allowed-to-scan-your-internet-trafic-and-pick-up-logs/?postID=512670#post512670
This client monitors local network traffic, identifies UDP packets
that contain relevant data for Albion Online, and ships the information
off to a central NATS server that anyone can subscribe to.
<!--
[Client download stats](https://www.somsubhra.com/github-release-stats/?username=broderickhyman&repository=albiondata-client)
-->
<!--
### Contributing
This process is run on a [DigitalOcean Droplet](https://www.digitalocean.com) in order to ensure almost perfect uptime and high performance for the users. If you find this project beneficial to you then please consider a donation, thanks!!
-->
# Contributions
Many thanks to the original developers:
- [Regner](https://github.com/Regner)
- [pcdummy](https://github.com/pcdummy)
- [Ultraporing](https://github.com/Ultraporing)
Many thanks also to [broderickhyman](https://github.com/broderickhyman) for picking up development and funding for the the last few years of the project!
# Downloads
Downloads can be found here: https://github.com/ao-data/albiondata-client/releases
## Running on Mac
### Running from the Finder
1. Download the latest `albiondata-client-amd64-mac.zip` file from [the Releases page](https://github.com/ao-data/albiondata-client/releases)
2. Unzip that file from the Finder
3. Enter the `albiondata-client` folder.
4. Double click the `run.command` file. It will ask for your password for permissions reasons.
### Running from the Terminal
1. Download the latest `update-darwin-amd64.gz` file from [the Releases page](https://github.com/ao-data/albiondata-client/releases)
2. Unzip that file from the Finder or with `gunzip update-darwin-amd64.gz`
3. The unzipped `albiondata-client` file is a Golang binary file. You'll need to make this file executable so it can be run directly. You can do this from your Terminal with: `chmod +x albiondata-client`
4. Run the client from your Terminal with `./albiondata-client`
# Related Projects
- [albiondata-deduper-dotNet](https://github.com/ao-data/albiondata-deduper-dotNet)
- [albiondata-sql-dotNet](https://github.com/ao-data/albiondata-sql-dotNet)
- [albiondata-api-dotNet](https://github.com/ao-data/albiondata-api-dotNet)
- [AlbionData.Models](https://github.com/ao-data/albiondata-models-dotNet) [](https://www.nuget.org/packages/AlbionData.Models/)
- [albion-data-website](https://github.com/ao-data/albion-data-website)
# Contact Us
The best way to get in touch with us is on the Albion Online Fansites Discord server in either the #proj-albiondata or the #developers channel. A permanent invite link can be found here: [https://discord.gg/TjWdq24](https://discord.gg/TjWdq24)
# Developer Setup
### Mac/Linux Setup
- Install go
- Build the project (Go modules will download automatically)
### Windows Setup
[Windows Setup Guide](https://github.com/ao-data/albiondata-client/wiki/Building-in-Windows)
# License
This project, and all contributed code, are licensed under the MIT
License. A copy of the MIT License may be found in the repository.
================================================
FILE: _config.yml
================================================
theme: jekyll-theme-merlot
================================================
FILE: albiondata-client.go
================================================
package main
import (
"os"
"strings"
"time"
"github.com/broderickhyman/albiondata-client/client"
"github.com/broderickhyman/albiondata-client/log"
"github.com/broderickhyman/albiondata-client/systray"
"github.com/broderickhyman/go-githubupdate/updater"
)
var version string
func init() {
client.ConfigGlobal.SetupFlags()
}
func main() {
startUpdater()
go systray.Run()
c := client.NewClient(version)
err := c.Run()
if err != nil {
log.Error(err)
log.Error("The program encountered an error. Press any key to close this window.")
var b = make([]byte, 1)
_, _ = os.Stdin.Read(b)
}
}
func startUpdater() {
if version != "" && !strings.Contains(version, "dev") {
u := updater.NewUpdater(
version,
"ao-data",
"albiondata-client",
"update-",
)
go func() {
maxTries := 2
for i := 0; i < maxTries; i++ {
err := u.BackgroundUpdater()
if err != nil {
log.Error(err.Error())
log.Info("Will try again in 60 seconds. You may need to run the client as Administrator.")
// Sleep and hope the network connects
time.Sleep(time.Second * 60)
} else {
break
}
}
}()
}
}
================================================
FILE: client/albion_state.go
================================================
package client
import (
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
"github.com/broderickhyman/albiondata-client/notification"
)
//CacheSize limit size of messages in cache
const CacheSize = 256
type marketHistoryInfo struct {
albionId uint32
timescale lib.Timescale
quality uint8
}
type albionState struct {
LocationId int
LocationString string
CharacterId lib.CharacterID
CharacterName string
// A lot of information is sent out but not contained in the response when requesting marketHistory (e.g. ID)
// This information is stored in marketHistoryInfo
// This array acts as a type of cache for that info
// The index is the message number (param255) % CacheSize
marketHistoryIDLookup [CacheSize]marketHistoryInfo
// TODO could this be improved?!
}
func (state albionState) IsValidLocation() bool {
if state.LocationId < 0 {
if state.LocationId == -1 {
log.Error("The players location has not yet been set. Please transition zones so the location can be identified.")
if !ConfigGlobal.Debug {
notification.Push("The players location has not yet been set. Please transition zones so the location can be identified.")
}
} else {
log.Error("The players location is not valid. Please transition zones so the location can be fixed.")
if !ConfigGlobal.Debug {
notification.Push("The players location is not valid. Please transition zones so the location can be fixed.")
}
}
return false
}
return true
}
================================================
FILE: client/albion_watcher.go
================================================
package client
import (
"time"
"github.com/broderickhyman/albiondata-client/log"
)
type albionProcessWatcher struct {
known []int
devices []string
listeners map[int][]*listener
quit chan bool
r *Router
}
func newAlbionProcessWatcher() *albionProcessWatcher {
return &albionProcessWatcher{
listeners: make(map[int][]*listener),
quit: make(chan bool),
r: newRouter(),
}
}
func (apw *albionProcessWatcher) run() error {
log.Print("Watching Albion")
physicalInterfaces, err := getAllPhysicalInterface()
if err != nil {
return err
}
apw.devices = physicalInterfaces
log.Debugf("Will listen to these devices: %v", apw.devices)
go apw.r.run()
for {
select {
case <-apw.quit:
apw.closeWatcher()
return nil
default:
if len(apw.listeners) == 0 {
apw.createListeners()
}
time.Sleep(time.Second)
}
}
}
func (apw *albionProcessWatcher) closeWatcher() {
log.Print("Albion watcher closed")
for port := range apw.listeners {
for _, l := range apw.listeners[port] {
l.stop()
}
delete(apw.listeners, port)
}
apw.r.quit <- true
}
func (apw *albionProcessWatcher) createListeners() {
filtered := [1]int{5056} // keep overdesign to listen on many ports
for _, port := range filtered {
for _, device := range apw.devices {
l := newListener(apw.r)
go l.startOnline(device, port)
apw.listeners[port] = append(apw.listeners[port], l)
}
}
}
================================================
FILE: client/client.go
================================================
package client
import (
"github.com/broderickhyman/albiondata-client/log"
)
var version string
//Client struct base
type Client struct {
}
//NewClient return a new Client instance
func NewClient(_version string) *Client {
version = _version
return &Client{}
}
//Run starts client settings and run
func (client *Client) Run() error {
log.Infof("Starting Albion Data Client, version: %s", version)
log.Info("This is a third-party application and is in no way affiliated with Sandbox Interactive or Albion Online.")
log.Info("Additional parameters can listed by calling this file with the -h parameter.")
ConfigGlobal.setupDebugEvents()
ConfigGlobal.setupDebugOperations()
createDispatcher()
if ConfigGlobal.Offline {
processOffline(ConfigGlobal.OfflinePath)
} else {
apw := newAlbionProcessWatcher()
return apw.run()
}
return nil
}
================================================
FILE: client/config.go
================================================
package client
import (
"flag"
"io"
"os"
"strconv"
"strings"
"github.com/broderickhyman/albiondata-client/log"
"github.com/mattn/go-colorable"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
)
type config struct {
AllowedWSHosts []string
Debug bool
DebugEvents map[int]bool
DebugEventsString string
DebugEventsBlacklistString string
DebugOperations map[int]bool
DebugOperationsString string
DebugOperationsBlacklistString string
DebugIgnoreDecodingErrors bool
DisableUpload bool
EnableWebsockets bool
ListenDevices string
LogLevel string
LogToFile bool
Minimize bool
Offline bool
OfflinePath string
RecordPath string
PrivateIngestBaseUrls string
PublicIngestBaseUrls string
NoCPULimit bool
}
//config global config data
var ConfigGlobal = &config{
LogLevel: "INFO",
}
func (config *config) SetupFlags() {
config.setupWebsocketFlags()
config.setupDebugFlags()
config.setupCommonFlags()
flag.Parse()
if config.OfflinePath != "" {
config.Offline = true
config.DisableUpload = true
}
if config.DisableUpload {
log.Info("Upload is disabled.")
}
config.setupLogs()
}
func (config *config) setupWebsocketFlags() {
// Setup the config file and parse values
viper.SetConfigName("config")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
// if we cannot find the configuration file, set Websockets to false
if err != nil {
viper.Set("EnableWebsockets", false)
}
config.EnableWebsockets = viper.GetBool("EnableWebsockets")
config.AllowedWSHosts = viper.GetStringSlice("AllowedWebsocketHosts")
}
func (config *config) setupDebugFlags() {
flag.BoolVar(
&config.Debug,
"debug",
false,
"Enable debug logging.",
)
flag.StringVar(
&config.DebugEventsString,
"events",
"",
"Whitelist of event IDs to output messages when debugging. Comma separated.",
)
flag.StringVar(
&config.DebugEventsBlacklistString,
"events-ignore",
"",
"Blacklist of event IDs to hide messages when debugging. Comma separated.",
)
flag.StringVar(
&config.DebugOperationsString,
"operations",
"",
"Whitelist of operation IDs to output messages when debugging. Comma separated.",
)
flag.StringVar(
&config.DebugOperationsBlacklistString,
"operations-ignore",
"",
"Blacklist of operation IDs to hide messages when debugging. Comma separated.",
)
flag.BoolVar(
&config.DebugIgnoreDecodingErrors,
"ignore-decode-errors",
false,
"Ignore the decoding errors when debugging",
)
flag.BoolVar(
&config.NoCPULimit,
"no-limit",
false,
"Use all available CPU cores",
)
}
func (config *config) setupCommonFlags() {
flag.BoolVar(
&config.DisableUpload,
"d",
false,
"If specified no attempts will be made to upload data to remote server.",
)
flag.StringVar(
&config.ListenDevices,
"l",
"",
"Listen on this comma separated devices instead of all available",
)
flag.BoolVar(
&config.LogToFile,
"output-file",
false,
"Enable logging to file.",
)
flag.StringVar(
&config.OfflinePath,
"o",
"",
"Parses a local file instead of checking albion ports.",
)
flag.BoolVar(
&config.Minimize,
"minimize",
false,
"Automatically minimize the window.",
)
flag.StringVar(
&config.PublicIngestBaseUrls,
"i",
"http+pow://www.albion-online-data.com:4223",
"Base URL to send PUBLIC data to, can be 'nats://', 'http://' or 'noop' and can have multiple uploaders. Comma separated.",
)
flag.StringVar(
&config.PrivateIngestBaseUrls,
"p",
"",
"Base URL to send PRIVATE data to, can be 'nats://', 'http://' or 'noop' and can have multiple uploaders. Comma separated.",
)
flag.StringVar(
&config.RecordPath,
"record",
"",
"Enable recording commands to a file for debugging later.",
)
}
func (config *config) setupLogs() {
if config.Debug {
config.LogLevel = "DEBUG"
}
level, err := logrus.ParseLevel(strings.ToLower(config.LogLevel))
if err != nil {
log.Errorf("Error getting level: %v", err)
}
log.SetLevel(level)
if config.LogToFile {
log.SetFormatter(&logrus.TextFormatter{DisableTimestamp: true, DisableSorting: true, ForceColors: false})
f, err := os.OpenFile("albiondata-client-output.txt", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0755)
if err == nil {
multiWriter := io.MultiWriter(os.Stdout, f)
log.SetOutput(multiWriter)
} else {
log.SetOutput(os.Stdout)
}
} else {
log.SetFormatter(&logrus.TextFormatter{FullTimestamp: true, DisableSorting: true, ForceColors: true})
log.SetOutput(colorable.NewColorableStdout())
}
}
func (config *config) setupDebugEvents() {
config.DebugEvents = make(map[int]bool)
if config.DebugEventsString != "" {
for _, event := range strings.Split(config.DebugEventsString, ",") {
number, err := strconv.Atoi(event)
if err == nil {
config.DebugEvents[number] = true
}
}
}
if config.DebugEventsBlacklistString != "" {
for _, event := range strings.Split(config.DebugEventsBlacklistString, ",") {
number, err := strconv.Atoi(event)
if err == nil {
config.DebugEvents[number] = false
}
}
}
// Looping through map keys is purposefully random by design in Go
for number, shouldDebug := range config.DebugEvents {
verb := "Ignoring"
if shouldDebug {
verb = "Showing"
}
log.Debugf("[%v] event: [%v]%v", verb, number, EventType(number))
}
}
func (config *config) setupDebugOperations() {
config.DebugOperations = make(map[int]bool)
if config.DebugOperationsString != "" {
for _, operation := range strings.Split(config.DebugOperationsString, ",") {
number, err := strconv.Atoi(operation)
if err == nil {
config.DebugOperations[number] = true
}
}
}
if config.DebugOperationsBlacklistString != "" {
for _, operation := range strings.Split(config.DebugOperationsBlacklistString, ",") {
number, err := strconv.Atoi(operation)
if err == nil {
config.DebugOperations[number] = false
}
}
}
// Looping through map keys is purposefully random by design in Go
for number, shouldDebug := range config.DebugOperations {
verb := "Ignoring"
if shouldDebug {
verb = "Showing"
}
log.Debugf("[%v] operation: [%v]%v", verb, number, OperationType(number))
}
}
================================================
FILE: client/decode.go
================================================
package client
import (
"encoding/hex"
"reflect"
"strconv"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
"github.com/mitchellh/mapstructure"
)
func decodeRequest(params map[uint8]interface{}) (operation operation, err error) {
if _, ok := params[253]; !ok {
return nil, nil
}
code := params[253].(int16)
switch OperationType(code) {
case opGetGameServerByCluster:
operation = &operationGetGameServerByCluster{}
case opAuctionGetOffers:
operation = &operationAuctionGetOffers{}
case opAuctionGetItemAverageStats:
operation = &operationAuctionGetItemAverageStats{}
case opGetClusterMapInfo:
operation = &operationGetClusterMapInfo{}
case opGoldMarketGetAverageInfo:
operation = &operationGoldMarketGetAverageInfo{}
case opRealEstateGetAuctionData:
operation = &operationRealEstateGetAuctionData{}
case opRealEstateBidOnAuction:
operation = &operationRealEstateBidOnAuction{}
default:
return nil, nil
}
err = decodeParams(params, operation)
return operation, err
}
func decodeResponse(params map[uint8]interface{}) (operation operation, err error) {
if _, ok := params[253]; !ok {
return nil, nil
}
code := params[253].(int16)
switch OperationType(code) {
case opJoin:
operation = &operationJoinResponse{}
case opAuctionGetOffers:
operation = &operationAuctionGetOffersResponse{}
case opAuctionGetRequests:
operation = &operationAuctionGetRequestsResponse{}
case opAuctionBuyOffer:
operation = &operationAuctionGetRequestsResponse{}
case opAuctionGetItemAverageStats:
operation = &operationAuctionGetItemAverageStatsResponse{}
case opGetMailInfos:
operation = &operationGetMailInfosResponse{}
case opReadMail:
operation = &operationReadMail{}
case opGetClusterMapInfo:
operation = &operationGetClusterMapInfoResponse{}
case opGoldMarketGetAverageInfo:
operation = &operationGoldMarketGetAverageInfoResponse{}
case opRealEstateGetAuctionData:
operation = &operationRealEstateGetAuctionDataResponse{}
case opRealEstateBidOnAuction:
operation = &operationRealEstateBidOnAuctionResponse{}
default:
return nil, nil
}
err = decodeParams(params, operation)
return operation, err
}
func decodeEvent(params map[uint8]interface{}) (event operation, err error) {
if _, ok := params[252]; !ok {
return nil, nil
}
eventType := params[252].(int16)
switch eventType {
// case evRespawn: //TODO: confirm this eventCode (old 77)
// event = &eventPlayerOnlineStatus{}
// case evCharacterStats: //TODO: confirm this eventCode (old 114)
// event = &eventSkillData{}
default:
return nil, nil
}
err = decodeParams(params, event)
return event, err
}
func decodeParams(params map[uint8]interface{}, operation operation) error {
convertGameObjects := func(from reflect.Type, to reflect.Type, v interface{}) (interface{}, error) {
if from == reflect.TypeOf([]int8{}) && to == reflect.TypeOf(lib.CharacterID("")) {
log.Debug("Parsing character ID from mixed-endian UUID")
return decodeCharacterID(v.([]int8)), nil
}
return v, nil
}
config := mapstructure.DecoderConfig{
DecodeHook: convertGameObjects,
Result: operation,
}
decoder, err := mapstructure.NewDecoder(&config)
if err != nil {
return err
}
// Decided that the maps were easier to work with in most places with uint8 keys
// Therefore we have to convert to a string map in order for the decode to work here
// Should be negligible performance loss
stringMap := make(map[string]interface{})
for k, v := range params {
stringMap[strconv.Itoa(int(k))] = v
}
err = decoder.Decode(stringMap)
return err
}
func decodeCharacterID(array []int8) lib.CharacterID {
/* So this is a UUID, which is stored in a 'mixed-endian' format.
The first three components are stored in little-endian, the rest in big-endian.
See https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding.
By default, our int array is read as big-endian, so we need to swap the first
three components of the UUID
*/
b := make([]byte, len(array))
// First, convert to byte
for k, v := range array {
b[k] = byte(v)
}
// swap first component
b[0], b[1], b[2], b[3] = b[3], b[2], b[1], b[0]
// swap second component
b[4], b[5] = b[5], b[4]
// swap third component
b[6], b[7] = b[7], b[6]
// format it UUID-style
var buf [36]byte
hex.Encode(buf[:], b[:4])
buf[8] = '-'
hex.Encode(buf[9:13], b[4:6])
buf[13] = '-'
hex.Encode(buf[14:18], b[6:8])
buf[18] = '-'
hex.Encode(buf[19:23], b[8:10])
buf[23] = '-'
hex.Encode(buf[24:], b[10:])
return lib.CharacterID(buf[:])
}
================================================
FILE: client/dispatcher.go
================================================
package client
import (
"encoding/json"
"net/http"
"strings"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type dispatcher struct {
publicUploaders []uploader
privateUploaders []uploader
}
var (
wsHub *WSHub
dis *dispatcher
)
func createDispatcher() {
dis = &dispatcher{
publicUploaders: createUploaders(strings.Split(ConfigGlobal.PublicIngestBaseUrls, ",")),
privateUploaders: createUploaders(strings.Split(ConfigGlobal.PrivateIngestBaseUrls, ",")),
}
if ConfigGlobal.EnableWebsockets {
wsHub = newHub()
go wsHub.run()
go runHTTPServer()
}
}
func createUploaders(targets []string) []uploader {
var uploaders []uploader
for _, target := range targets {
if target == "" {
continue
}
if len(target) < 4 {
log.Infof("Got an ingest target that was less than 4 characters, not a valid ingest target: %v", target)
continue
}
if target[0:8] == "http+pow" {
uploaders = append(uploaders, newHTTPUploaderPow(target))
} else if target[0:4] == "http" {
uploaders = append(uploaders, newHTTPUploader(target))
} else if target[0:4] == "nats" {
uploaders = append(uploaders, newNATSUploader(target))
} else {
log.Infof("An invalid ingest target was specified: %v", target)
}
}
return uploaders
}
func sendMsgToPublicUploaders(upload interface{}, topic string, state *albionState) {
data, err := json.Marshal(upload)
if err != nil {
log.Errorf("Error while marshalling payload for %v: %v", err, topic)
return
}
sendMsgToUploaders(data, topic, dis.publicUploaders)
sendMsgToUploaders(data, topic, dis.privateUploaders)
// If websockets are enabled, send the data there too
if ConfigGlobal.EnableWebsockets {
sendMsgToWebSockets(data, topic)
}
}
func sendMsgToPrivateUploaders(upload lib.PersonalizedUpload, topic string, state *albionState) {
if ConfigGlobal.DisableUpload {
log.Info("Upload is disabled.")
return
}
// TODO: Re-enable this when issue #14 is fixed
// Will personalize with blanks for now in order to allow people to see the format
// if state.CharacterName == "" || state.CharacterId == "" {
// log.Error("The player name or id has not been set. Please restart the game and make sure the client is running.")
// notification.Push("The player name or id has not been set. Please restart the game and make sure the client is running.")
// return
// }
upload.Personalize(state.CharacterId, state.CharacterName)
data, err := json.Marshal(upload)
if err != nil {
log.Errorf("Error while marshalling payload for %v: %v", err, topic)
return
}
if len(dis.privateUploaders) > 0 {
sendMsgToUploaders(data, topic, dis.privateUploaders)
}
// If websockets are enabled, send the data there too
if ConfigGlobal.EnableWebsockets {
sendMsgToWebSockets(data, topic)
}
}
func sendMsgToUploaders(msg []byte, topic string, uploaders []uploader) {
if ConfigGlobal.DisableUpload {
log.Info("Upload is disabled.")
return
}
for _, u := range uploaders {
u.sendToIngest(msg, topic)
}
}
func runHTTPServer() {
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
serveWs(wsHub, w, r)
})
err := http.ListenAndServe(":8099", nil)
if err != nil {
log.Panic("ListenAndServe: ", err)
}
}
func sendMsgToWebSockets(msg []byte, topic string) {
// TODO (gradius): send JSON data with topic string
// TODO (gradius): this seems super hacky, and I'm sure there's a better way.
var result string
result = "{\"topic\": \"" + topic + "\", \"data\": " + string(msg) + "}"
wsHub.broadcast <- []byte(result)
}
================================================
FILE: client/event_player_online_status.go
================================================
package client
import (
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type eventPlayerOnlineStatus struct {
CharacterID lib.CharacterID `mapstructure:"0"`
CharacterName string `mapstructure:"1"`
IsOnline bool `mapstructure:"2"`
}
func (event eventPlayerOnlineStatus) Process(state *albionState) {
log.Debug("Got player online status event...")
}
================================================
FILE: client/event_skill_data.go
================================================
package client
import (
"strconv"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type eventSkillData struct {
SkillIds []int `mapstructure:"1"`
Levels []int `mapstructure:"2"`
Percentages []float64 `mapstructure:"3"`
Fame []string `mapstructure:"4"`
}
func (event eventSkillData) Process(state *albionState) {
log.Debug("Got skill data event...")
skills := []*lib.Skill{}
for k := range event.SkillIds {
skill := &lib.Skill{}
skill.ID = event.SkillIds[k]
skill.Level = event.Levels[k]
skill.PercentNextLevel = event.Percentages[k]
// for some reason, the value is enclosed in [[]]. trying to get rid of them
fame, err := strconv.Atoi(event.Fame[k][2 : len(event.Fame[k])-2])
if err != nil {
log.Error("Could not parse fame value. ", err)
continue
}
skill.Fame = fame
skills = append(skills, skill)
}
if len(skills) < 1 {
return
}
upload := lib.SkillsUpload{
Skills: skills,
}
log.Infof("Sending %d skills of %v to ingest", len(skills), state.CharacterName)
sendMsgToPrivateUploaders(&upload, lib.NatsSkillData, state)
}
================================================
FILE: client/events.go
================================================
package client
//EventType used to identify event types
//go:generate stringer -type=EventType
type EventType uint16
const (
evUnused EventType = iota
evLeave
evJoinFinished
evMove
evTeleport
evChangeEquipment
evHealthUpdate
evEnergyUpdate
evDamageShieldUpdate
evCraftingFocusUpdate
evActiveSpellEffectsUpdate
evResetCooldowns
evAttack
evCastStart
evChannelingUpdate
evCastCancel
evCastTimeUpdate
evCastFinished
evCastSpell
evCastHit
evCastHits
evChannelingEnded
evAttackBuilding
evInventoryPutItem
evInventoryDeleteItem
evNewCharacter
evNewEquipmentItem
evNewSimpleItem
evNewFurnitureItem
evNewJournalItem
evNewLaborerItem
evNewSimpleHarvestableObject
evNewSimpleHarvestableObjectList
evNewHarvestableObject
evNewSilverObject
evNewBuilding
evHarvestableChangeState
evMobChangeState
evFactionBuildingInfo
evCraftBuildingInfo
evRepairBuildingInfo
evMeldBuildingInfo
evConstructionSiteInfo
evPlayerBuildingInfo
evFarmBuildingInfo
evTutorialBuildingInfo
evLaborerObjectInfo
evLaborerObjectJobInfo
evMarketPlaceBuildingInfo
evHarvestStart
evHarvestCancel
evHarvestFinished
evTakeSilver
evActionOnBuildingStart
evActionOnBuildingCancel
evActionOnBuildingFinished
evItemRerollQualityStart
evItemRerollQualityCancel
evItemRerollQualityFinished
evInstallResourceStart
evInstallResourceCancel
evInstallResourceFinished
evCraftItemFinished
evLogoutCancel
evChatMessage
evChatSay
evChatWhisper
evChatMuted
evPlayEmote
evStopEmote
evSystemMessage
evUtilityTextMessage
evUpdateMoney
evUpdateFame
evUpdateLearningPoints
evUpdateReSpecPoints
evUpdateCurrency
evUpdateFactionStanding
evRespawn
evServerDebugLog
evCharacterEquipmentChanged
evRegenerationHealthChanged
evRegenerationEnergyChanged
evRegenerationMountHealthChanged
evRegenerationCraftingChanged
evRegenerationHealthEnergyComboChanged
evRegenerationPlayerComboChanged
evDurabilityChanged
evNewLoot
evAttachItemContainer
evDetachItemContainer
evInvalidateItemContainer
evLockItemContainer
evGuildUpdate
evGuildPlayerUpdated
evInvitedToGuild
evGuildMemberWorldUpdate
evUpdateMatchDetails
evObjectEvent
evNewMonolithObject
evNewSiegeCampObject
evNewOrbObject
evNewCastleObject
evNewSpellEffectArea
evUpdateSpellEffectArea
evNewChainSpell
evUpdateChainSpell
evNewTreasureChest
evStartMatch
evStartTerritoryMatchInfos
evStartArenaMatchInfos
evEndTerritoryMatch
evEndArenaMatch
evMatchUpdate
evActiveMatchUpdate
evNewMob
evDebugAggroInfo
evDebugVariablesInfo
evDebugReputationInfo
evDebugDiminishingReturnInfo
evDebugSmartClusterQueueInfo
evClaimOrbStart
evClaimOrbFinished
evClaimOrbCancel
evOrbUpdate
evOrbClaimed
evNewWarCampObject
evNewMatchLootChestObject
evNewArenaExit
evGuildMemberTerritoryUpdate
evInvitedMercenaryToMatch
evClusterInfoUpdate
evForcedMovement
evForcedMovementCancel
evCharacterStats
evCharacterStatsKillHistory
evCharacterStatsDeathHistory
evGuildStats
evKillHistoryDetails
evFullAchievementInfo
evFinishedAchievement
evAchievementProgressInfo
evFullAchievementProgressInfo
evFullTrackedAchievementInfo
evFullAutoLearnAchievementInfo
evQuestGiverQuestOffered
evQuestGiverDebugInfo
evConsoleEvent
evTimeSync
evChangeAvatar
evChangeMountSkin
evGameEvent
evKilledPlayer
evDied
evKnockedDown
evMatchPlayerJoinedEvent
evMatchPlayerStatsEvent
evMatchPlayerStatsCompleteEvent
evMatchTimeLineEventEvent
evMatchPlayerMainGearStatsEvent
evMatchPlayerChangedAvatarEvent
evInvitationPlayerTrade
evPlayerTradeStart
evPlayerTradeCancel
evPlayerTradeUpdate
evPlayerTradeFinished
evPlayerTradeAcceptChange
evMiniMapPing
evMarketPlaceNotification
evDuellingChallengePlayer
evNewDuellingPost
evDuelStarted
evDuelEnded
evDuelDenied
evDuelLeftArea
evDuelReEnteredArea
evNewRealEstate
evMiniMapOwnedBuildingsPositions
evRealEstateListUpdate
evGuildLogoUpdate
evGuildLogoChanged
evPlaceableObjectPlace
evPlaceableObjectPlaceCancel
evFurnitureObjectBuffProviderInfo
evFurnitureObjectCheatProviderInfo
evFarmableObjectInfo
evNewUnreadMails
evUnknown187
evGuildLogoObjectUpdate
evStartLogout
evNewChatChannels
evJoinedChatChannel
evLeftChatChannel
evRemovedChatChannel
evAccessStatus
evMounted
evMountStart
evMountCancel
evNewTravelpoint
evNewIslandAccessPoint
evNewExit
evUpdateHome
evUpdateChatSettings
evResurrectionOffer
evResurrectionReply
evLootEquipmentChanged
evUpdateUnlockedGuildLogos
evUpdateUnlockedAvatars
evUpdateUnlockedAvatarRings
evUpdateUnlockedBuildings
evNewIslandManagement
evNewTeleportStone
evCloak
evPartyInvitation
evPartyJoined
evPartyDisbanded
evPartyPlayerJoined
evPartyChangedOrder
evPartyPlayerLeft
evPartyLeaderChanged
evPartyLootSettingChangedPlayer
evPartySilverGained
evPartyPlayerUpdated
evPartyInvitationPlayerBusy
evPartyMarkedObjectsUpdated
evPartyOnClusterPartyJoined
evPartySetRoleFlag
evSpellCooldownUpdate
evNewHellgate
evNewHellgateExit
evNewExpeditionExit
evNewExpeditionNarrator
evExitEnterStart
evExitEnterCancel
evExitEnterFinished
evHellClusterTimeUpdate
evNewQuestGiverObject
evFullQuestInfo
evQuestProgressInfo
evQuestGiverInfoForPlayer
evFullExpeditionInfo
evExpeditionQuestProgressInfo
evInvitedToExpedition
evExpeditionRegistrationInfo
evEnteringExpeditionStart
evEnteringExpeditionCancel
evRewardGranted
evArenaRegistrationInfo
evEnteringArenaStart
evEnteringArenaCancel
evEnteringArenaLockStart
evEnteringArenaLockCancel
evInvitedToArenaMatch
evPlayerCounts
evInCombatStateUpdate
evOtherGrabbedLoot
evSiegeCampClaimStart
evSiegeCampClaimCancel
evSiegeCampClaimFinished
evSiegeCampScheduleResult
evTreasureChestUsingStart
evTreasureChestUsingFinished
evTreasureChestUsingCancel
evTreasureChestUsingOpeningComplete
evTreasureChestForceCloseInventory
evPremiumChanged
evPremiumExtended
evPremiumLifeTimeRewardGained
evLaborerGotUpgraded
evJournalGotFull
evJournalFillError
evFriendRequest
evFriendRequestInfos
evFriendInfos
evFriendRequestAnswered
evFriendOnlineStatus
evFriendRequestCanceled
evFriendRemoved
evFriendUpdated
evPartyLootItems
evPartyLootItemsRemoved
evReputationUpdate
evDefenseUnitAttackBegin
evDefenseUnitAttackEnd
evDefenseUnitAttackDamage
evUnrestrictedPvpZoneUpdate
evReputationImplicationUpdate
evNewMountObject
evMountHealthUpdate
evMountCooldownUpdate
evNewExpeditionAgent
evNewExpeditionCheckPoint
evExpeditionStartEvent
evVoteEvent
evRatingEvent
evNewArenaAgent
evBoostFarmable
evUseFunction
evNewPortalEntrance
evNewPortalExit
evNewRandomDungeonExit
evWaitingQueueUpdate
evPlayerMovementRateUpdate
evObserveStart
evMinimapZergs
evMinimapSmartClusterZergs
evPaymentTransactions
evPerformanceStatsUpdate
evOverloadModeUpdate
evDebugDrawEvent
evRecordCameraMove
evRecordStart
evTerritoryClaimStart
evTerritoryClaimCancel
evTerritoryClaimFinished
evTerritoryScheduleResult
evUpdateAccountState
evStartDeterministicRoam
evGuildFullAccessTagsUpdated
evGuildAccessTagUpdated
evGvgSeasonUpdate
evGvgSeasonCheatCommand
evSeasonPointsByKillingBooster
evFishingStart
evFishingCast
evFishingCatch
evFishingFinished
evFishingCancel
evNewFloatObject
evNewFishingZoneObject
evFishingMiniGame
evSteamAchievementCompleted
evUpdatePuppet
evChangeFlaggingFinished
evNewOutpostObject
evOutpostUpdate
evOutpostClaimed
evOutpostReward
evOverChargeEnd
evOverChargeStatus
evPartyFinderFullUpdate
evPartyFinderUpdate
evPartyFinderApplicantsUpdate
evPartyFinderEquipmentSnapshot
evPartyFinderJoinRequestDeclined
evNewUnlockedPersonalSeasonRewards
evPersonalSeasonPointsGained
evEasyAntiCheatMessageToClient
evMatchLootChestOpeningStart
evMatchLootChestOpeningFinished
evMatchLootChestOpeningCancel
evNotifyCrystalMatchReward
evCrystalRealmFeedback
evNewLocationMarker
evNewTutorialBlocker
evNewTileSwitch
evNewInformationProvider
evNewDynamicGuildLogo
evTutorialUpdate
evTriggerHintBox
evRandomDungeonPositionInfo
evNewLootChest
evUpdateLootChest
evLootChestOpened
evNewShrine
evUpdateShrine
evMutePlayerUpdate
evShopTileUpdate
evShopUpdate
evEasyAntiCheatKick
evUnlockVanityUnlock
evAvatarUnlocked
evCustomizationChanged
evBaseVaultInfo
evGuildVaultInfo
evBankVaultInfo
evRecoveryVaultPlayerInfo
evRecoveryVaultGuildInfo
evUpdateWardrobe
evCastlePhaseChanged
evGuildAccountLogEvent
evNewHideoutObject
evNewHideoutManagement
evNewHideoutExit
evInitHideoutAttackStart
evInitHideoutAttackCancel
evInitHideoutAttackFinished
evHideoutManagementUpdate
evIpChanged
evSmartClusterQueueUpdateInfo
evSmartClusterQueueActiveInfo
evSmartClusterQueueKickWarning
evSmartClusterQueueInvite
evReceivedGvgSeasonPoints
evTerritoryBonusLevelUpdate
evOpenWorldAttackScheduleStart
evOpenWorldAttackScheduleFinished
evOpenWorldAttackScheduleCancel
evOpenWorldAttackConquerStart
evOpenWorldAttackConquerFinished
evOpenWorldAttackConquerCancel
evOpenWorldAttackConquerStatus
evOpenWorldAttackStart
evOpenWorldAttackEnd
evNewRandomResourceBlocker
evNewHomeObject
evHideoutObjectUpdate
evUpdateInfamy
evUnknown408
evUnknown409
evUnknown410
evUnknown411
evUnknown412
evUnknown413
evUnknown414
evUnknown415
evUnknown416
evUnknown417
evUnknown418
evUnknown419
evUnknown420
evUnknown421
evUnknown422
)
================================================
FILE: client/eventtype_string.go
================================================
// Code generated by "stringer -type=EventType"; DO NOT EDIT.
package client
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[evUnused-0]
_ = x[evLeave-1]
_ = x[evJoinFinished-2]
_ = x[evMove-3]
_ = x[evTeleport-4]
_ = x[evChangeEquipment-5]
_ = x[evHealthUpdate-6]
_ = x[evEnergyUpdate-7]
_ = x[evDamageShieldUpdate-8]
_ = x[evCraftingFocusUpdate-9]
_ = x[evActiveSpellEffectsUpdate-10]
_ = x[evResetCooldowns-11]
_ = x[evAttack-12]
_ = x[evCastStart-13]
_ = x[evChannelingUpdate-14]
_ = x[evCastCancel-15]
_ = x[evCastTimeUpdate-16]
_ = x[evCastFinished-17]
_ = x[evCastSpell-18]
_ = x[evCastHit-19]
_ = x[evCastHits-20]
_ = x[evChannelingEnded-21]
_ = x[evAttackBuilding-22]
_ = x[evInventoryPutItem-23]
_ = x[evInventoryDeleteItem-24]
_ = x[evNewCharacter-25]
_ = x[evNewEquipmentItem-26]
_ = x[evNewSimpleItem-27]
_ = x[evNewFurnitureItem-28]
_ = x[evNewJournalItem-29]
_ = x[evNewLaborerItem-30]
_ = x[evNewSimpleHarvestableObject-31]
_ = x[evNewSimpleHarvestableObjectList-32]
_ = x[evNewHarvestableObject-33]
_ = x[evNewSilverObject-34]
_ = x[evNewBuilding-35]
_ = x[evHarvestableChangeState-36]
_ = x[evMobChangeState-37]
_ = x[evFactionBuildingInfo-38]
_ = x[evCraftBuildingInfo-39]
_ = x[evRepairBuildingInfo-40]
_ = x[evMeldBuildingInfo-41]
_ = x[evConstructionSiteInfo-42]
_ = x[evPlayerBuildingInfo-43]
_ = x[evFarmBuildingInfo-44]
_ = x[evTutorialBuildingInfo-45]
_ = x[evLaborerObjectInfo-46]
_ = x[evLaborerObjectJobInfo-47]
_ = x[evMarketPlaceBuildingInfo-48]
_ = x[evHarvestStart-49]
_ = x[evHarvestCancel-50]
_ = x[evHarvestFinished-51]
_ = x[evTakeSilver-52]
_ = x[evActionOnBuildingStart-53]
_ = x[evActionOnBuildingCancel-54]
_ = x[evActionOnBuildingFinished-55]
_ = x[evItemRerollQualityStart-56]
_ = x[evItemRerollQualityCancel-57]
_ = x[evItemRerollQualityFinished-58]
_ = x[evInstallResourceStart-59]
_ = x[evInstallResourceCancel-60]
_ = x[evInstallResourceFinished-61]
_ = x[evCraftItemFinished-62]
_ = x[evLogoutCancel-63]
_ = x[evChatMessage-64]
_ = x[evChatSay-65]
_ = x[evChatWhisper-66]
_ = x[evChatMuted-67]
_ = x[evPlayEmote-68]
_ = x[evStopEmote-69]
_ = x[evSystemMessage-70]
_ = x[evUtilityTextMessage-71]
_ = x[evUpdateMoney-72]
_ = x[evUpdateFame-73]
_ = x[evUpdateLearningPoints-74]
_ = x[evUpdateReSpecPoints-75]
_ = x[evUpdateCurrency-76]
_ = x[evUpdateFactionStanding-77]
_ = x[evRespawn-78]
_ = x[evServerDebugLog-79]
_ = x[evCharacterEquipmentChanged-80]
_ = x[evRegenerationHealthChanged-81]
_ = x[evRegenerationEnergyChanged-82]
_ = x[evRegenerationMountHealthChanged-83]
_ = x[evRegenerationCraftingChanged-84]
_ = x[evRegenerationHealthEnergyComboChanged-85]
_ = x[evRegenerationPlayerComboChanged-86]
_ = x[evDurabilityChanged-87]
_ = x[evNewLoot-88]
_ = x[evAttachItemContainer-89]
_ = x[evDetachItemContainer-90]
_ = x[evInvalidateItemContainer-91]
_ = x[evLockItemContainer-92]
_ = x[evGuildUpdate-93]
_ = x[evGuildPlayerUpdated-94]
_ = x[evInvitedToGuild-95]
_ = x[evGuildMemberWorldUpdate-96]
_ = x[evUpdateMatchDetails-97]
_ = x[evObjectEvent-98]
_ = x[evNewMonolithObject-99]
_ = x[evNewSiegeCampObject-100]
_ = x[evNewOrbObject-101]
_ = x[evNewCastleObject-102]
_ = x[evNewSpellEffectArea-103]
_ = x[evUpdateSpellEffectArea-104]
_ = x[evNewChainSpell-105]
_ = x[evUpdateChainSpell-106]
_ = x[evNewTreasureChest-107]
_ = x[evStartMatch-108]
_ = x[evStartTerritoryMatchInfos-109]
_ = x[evStartArenaMatchInfos-110]
_ = x[evEndTerritoryMatch-111]
_ = x[evEndArenaMatch-112]
_ = x[evMatchUpdate-113]
_ = x[evActiveMatchUpdate-114]
_ = x[evNewMob-115]
_ = x[evDebugAggroInfo-116]
_ = x[evDebugVariablesInfo-117]
_ = x[evDebugReputationInfo-118]
_ = x[evDebugDiminishingReturnInfo-119]
_ = x[evDebugSmartClusterQueueInfo-120]
_ = x[evClaimOrbStart-121]
_ = x[evClaimOrbFinished-122]
_ = x[evClaimOrbCancel-123]
_ = x[evOrbUpdate-124]
_ = x[evOrbClaimed-125]
_ = x[evNewWarCampObject-126]
_ = x[evNewMatchLootChestObject-127]
_ = x[evNewArenaExit-128]
_ = x[evGuildMemberTerritoryUpdate-129]
_ = x[evInvitedMercenaryToMatch-130]
_ = x[evClusterInfoUpdate-131]
_ = x[evForcedMovement-132]
_ = x[evForcedMovementCancel-133]
_ = x[evCharacterStats-134]
_ = x[evCharacterStatsKillHistory-135]
_ = x[evCharacterStatsDeathHistory-136]
_ = x[evGuildStats-137]
_ = x[evKillHistoryDetails-138]
_ = x[evFullAchievementInfo-139]
_ = x[evFinishedAchievement-140]
_ = x[evAchievementProgressInfo-141]
_ = x[evFullAchievementProgressInfo-142]
_ = x[evFullTrackedAchievementInfo-143]
_ = x[evFullAutoLearnAchievementInfo-144]
_ = x[evQuestGiverQuestOffered-145]
_ = x[evQuestGiverDebugInfo-146]
_ = x[evConsoleEvent-147]
_ = x[evTimeSync-148]
_ = x[evChangeAvatar-149]
_ = x[evChangeMountSkin-150]
_ = x[evGameEvent-151]
_ = x[evKilledPlayer-152]
_ = x[evDied-153]
_ = x[evKnockedDown-154]
_ = x[evMatchPlayerJoinedEvent-155]
_ = x[evMatchPlayerStatsEvent-156]
_ = x[evMatchPlayerStatsCompleteEvent-157]
_ = x[evMatchTimeLineEventEvent-158]
_ = x[evMatchPlayerMainGearStatsEvent-159]
_ = x[evMatchPlayerChangedAvatarEvent-160]
_ = x[evInvitationPlayerTrade-161]
_ = x[evPlayerTradeStart-162]
_ = x[evPlayerTradeCancel-163]
_ = x[evPlayerTradeUpdate-164]
_ = x[evPlayerTradeFinished-165]
_ = x[evPlayerTradeAcceptChange-166]
_ = x[evMiniMapPing-167]
_ = x[evMarketPlaceNotification-168]
_ = x[evDuellingChallengePlayer-169]
_ = x[evNewDuellingPost-170]
_ = x[evDuelStarted-171]
_ = x[evDuelEnded-172]
_ = x[evDuelDenied-173]
_ = x[evDuelLeftArea-174]
_ = x[evDuelReEnteredArea-175]
_ = x[evNewRealEstate-176]
_ = x[evMiniMapOwnedBuildingsPositions-177]
_ = x[evRealEstateListUpdate-178]
_ = x[evGuildLogoUpdate-179]
_ = x[evGuildLogoChanged-180]
_ = x[evPlaceableObjectPlace-181]
_ = x[evPlaceableObjectPlaceCancel-182]
_ = x[evFurnitureObjectBuffProviderInfo-183]
_ = x[evFurnitureObjectCheatProviderInfo-184]
_ = x[evFarmableObjectInfo-185]
_ = x[evNewUnreadMails-186]
_ = x[evUnknown187-187]
_ = x[evGuildLogoObjectUpdate-188]
_ = x[evStartLogout-189]
_ = x[evNewChatChannels-190]
_ = x[evJoinedChatChannel-191]
_ = x[evLeftChatChannel-192]
_ = x[evRemovedChatChannel-193]
_ = x[evAccessStatus-194]
_ = x[evMounted-195]
_ = x[evMountStart-196]
_ = x[evMountCancel-197]
_ = x[evNewTravelpoint-198]
_ = x[evNewIslandAccessPoint-199]
_ = x[evNewExit-200]
_ = x[evUpdateHome-201]
_ = x[evUpdateChatSettings-202]
_ = x[evResurrectionOffer-203]
_ = x[evResurrectionReply-204]
_ = x[evLootEquipmentChanged-205]
_ = x[evUpdateUnlockedGuildLogos-206]
_ = x[evUpdateUnlockedAvatars-207]
_ = x[evUpdateUnlockedAvatarRings-208]
_ = x[evUpdateUnlockedBuildings-209]
_ = x[evNewIslandManagement-210]
_ = x[evNewTeleportStone-211]
_ = x[evCloak-212]
_ = x[evPartyInvitation-213]
_ = x[evPartyJoined-214]
_ = x[evPartyDisbanded-215]
_ = x[evPartyPlayerJoined-216]
_ = x[evPartyChangedOrder-217]
_ = x[evPartyPlayerLeft-218]
_ = x[evPartyLeaderChanged-219]
_ = x[evPartyLootSettingChangedPlayer-220]
_ = x[evPartySilverGained-221]
_ = x[evPartyPlayerUpdated-222]
_ = x[evPartyInvitationPlayerBusy-223]
_ = x[evPartyMarkedObjectsUpdated-224]
_ = x[evPartyOnClusterPartyJoined-225]
_ = x[evPartySetRoleFlag-226]
_ = x[evSpellCooldownUpdate-227]
_ = x[evNewHellgate-228]
_ = x[evNewHellgateExit-229]
_ = x[evNewExpeditionExit-230]
_ = x[evNewExpeditionNarrator-231]
_ = x[evExitEnterStart-232]
_ = x[evExitEnterCancel-233]
_ = x[evExitEnterFinished-234]
_ = x[evHellClusterTimeUpdate-235]
_ = x[evNewQuestGiverObject-236]
_ = x[evFullQuestInfo-237]
_ = x[evQuestProgressInfo-238]
_ = x[evQuestGiverInfoForPlayer-239]
_ = x[evFullExpeditionInfo-240]
_ = x[evExpeditionQuestProgressInfo-241]
_ = x[evInvitedToExpedition-242]
_ = x[evExpeditionRegistrationInfo-243]
_ = x[evEnteringExpeditionStart-244]
_ = x[evEnteringExpeditionCancel-245]
_ = x[evRewardGranted-246]
_ = x[evArenaRegistrationInfo-247]
_ = x[evEnteringArenaStart-248]
_ = x[evEnteringArenaCancel-249]
_ = x[evEnteringArenaLockStart-250]
_ = x[evEnteringArenaLockCancel-251]
_ = x[evInvitedToArenaMatch-252]
_ = x[evPlayerCounts-253]
_ = x[evInCombatStateUpdate-254]
_ = x[evOtherGrabbedLoot-255]
_ = x[evSiegeCampClaimStart-256]
_ = x[evSiegeCampClaimCancel-257]
_ = x[evSiegeCampClaimFinished-258]
_ = x[evSiegeCampScheduleResult-259]
_ = x[evTreasureChestUsingStart-260]
_ = x[evTreasureChestUsingFinished-261]
_ = x[evTreasureChestUsingCancel-262]
_ = x[evTreasureChestUsingOpeningComplete-263]
_ = x[evTreasureChestForceCloseInventory-264]
_ = x[evPremiumChanged-265]
_ = x[evPremiumExtended-266]
_ = x[evPremiumLifeTimeRewardGained-267]
_ = x[evLaborerGotUpgraded-268]
_ = x[evJournalGotFull-269]
_ = x[evJournalFillError-270]
_ = x[evFriendRequest-271]
_ = x[evFriendRequestInfos-272]
_ = x[evFriendInfos-273]
_ = x[evFriendRequestAnswered-274]
_ = x[evFriendOnlineStatus-275]
_ = x[evFriendRequestCanceled-276]
_ = x[evFriendRemoved-277]
_ = x[evFriendUpdated-278]
_ = x[evPartyLootItems-279]
_ = x[evPartyLootItemsRemoved-280]
_ = x[evReputationUpdate-281]
_ = x[evDefenseUnitAttackBegin-282]
_ = x[evDefenseUnitAttackEnd-283]
_ = x[evDefenseUnitAttackDamage-284]
_ = x[evUnrestrictedPvpZoneUpdate-285]
_ = x[evReputationImplicationUpdate-286]
_ = x[evNewMountObject-287]
_ = x[evMountHealthUpdate-288]
_ = x[evMountCooldownUpdate-289]
_ = x[evNewExpeditionAgent-290]
_ = x[evNewExpeditionCheckPoint-291]
_ = x[evExpeditionStartEvent-292]
_ = x[evVoteEvent-293]
_ = x[evRatingEvent-294]
_ = x[evNewArenaAgent-295]
_ = x[evBoostFarmable-296]
_ = x[evUseFunction-297]
_ = x[evNewPortalEntrance-298]
_ = x[evNewPortalExit-299]
_ = x[evNewRandomDungeonExit-300]
_ = x[evWaitingQueueUpdate-301]
_ = x[evPlayerMovementRateUpdate-302]
_ = x[evObserveStart-303]
_ = x[evMinimapZergs-304]
_ = x[evMinimapSmartClusterZergs-305]
_ = x[evPaymentTransactions-306]
_ = x[evPerformanceStatsUpdate-307]
_ = x[evOverloadModeUpdate-308]
_ = x[evDebugDrawEvent-309]
_ = x[evRecordCameraMove-310]
_ = x[evRecordStart-311]
_ = x[evTerritoryClaimStart-312]
_ = x[evTerritoryClaimCancel-313]
_ = x[evTerritoryClaimFinished-314]
_ = x[evTerritoryScheduleResult-315]
_ = x[evUpdateAccountState-316]
_ = x[evStartDeterministicRoam-317]
_ = x[evGuildFullAccessTagsUpdated-318]
_ = x[evGuildAccessTagUpdated-319]
_ = x[evGvgSeasonUpdate-320]
_ = x[evGvgSeasonCheatCommand-321]
_ = x[evSeasonPointsByKillingBooster-322]
_ = x[evFishingStart-323]
_ = x[evFishingCast-324]
_ = x[evFishingCatch-325]
_ = x[evFishingFinished-326]
_ = x[evFishingCancel-327]
_ = x[evNewFloatObject-328]
_ = x[evNewFishingZoneObject-329]
_ = x[evFishingMiniGame-330]
_ = x[evSteamAchievementCompleted-331]
_ = x[evUpdatePuppet-332]
_ = x[evChangeFlaggingFinished-333]
_ = x[evNewOutpostObject-334]
_ = x[evOutpostUpdate-335]
_ = x[evOutpostClaimed-336]
_ = x[evOutpostReward-337]
_ = x[evOverChargeEnd-338]
_ = x[evOverChargeStatus-339]
_ = x[evPartyFinderFullUpdate-340]
_ = x[evPartyFinderUpdate-341]
_ = x[evPartyFinderApplicantsUpdate-342]
_ = x[evPartyFinderEquipmentSnapshot-343]
_ = x[evPartyFinderJoinRequestDeclined-344]
_ = x[evNewUnlockedPersonalSeasonRewards-345]
_ = x[evPersonalSeasonPointsGained-346]
_ = x[evEasyAntiCheatMessageToClient-347]
_ = x[evMatchLootChestOpeningStart-348]
_ = x[evMatchLootChestOpeningFinished-349]
_ = x[evMatchLootChestOpeningCancel-350]
_ = x[evNotifyCrystalMatchReward-351]
_ = x[evCrystalRealmFeedback-352]
_ = x[evNewLocationMarker-353]
_ = x[evNewTutorialBlocker-354]
_ = x[evNewTileSwitch-355]
_ = x[evNewInformationProvider-356]
_ = x[evNewDynamicGuildLogo-357]
_ = x[evTutorialUpdate-358]
_ = x[evTriggerHintBox-359]
_ = x[evRandomDungeonPositionInfo-360]
_ = x[evNewLootChest-361]
_ = x[evUpdateLootChest-362]
_ = x[evLootChestOpened-363]
_ = x[evNewShrine-364]
_ = x[evUpdateShrine-365]
_ = x[evMutePlayerUpdate-366]
_ = x[evShopTileUpdate-367]
_ = x[evShopUpdate-368]
_ = x[evEasyAntiCheatKick-369]
_ = x[evUnlockVanityUnlock-370]
_ = x[evAvatarUnlocked-371]
_ = x[evCustomizationChanged-372]
_ = x[evBaseVaultInfo-373]
_ = x[evGuildVaultInfo-374]
_ = x[evBankVaultInfo-375]
_ = x[evRecoveryVaultPlayerInfo-376]
_ = x[evRecoveryVaultGuildInfo-377]
_ = x[evUpdateWardrobe-378]
_ = x[evCastlePhaseChanged-379]
_ = x[evGuildAccountLogEvent-380]
_ = x[evNewHideoutObject-381]
_ = x[evNewHideoutManagement-382]
_ = x[evNewHideoutExit-383]
_ = x[evInitHideoutAttackStart-384]
_ = x[evInitHideoutAttackCancel-385]
_ = x[evInitHideoutAttackFinished-386]
_ = x[evHideoutManagementUpdate-387]
_ = x[evIpChanged-388]
_ = x[evSmartClusterQueueUpdateInfo-389]
_ = x[evSmartClusterQueueActiveInfo-390]
_ = x[evSmartClusterQueueKickWarning-391]
_ = x[evSmartClusterQueueInvite-392]
_ = x[evReceivedGvgSeasonPoints-393]
_ = x[evTerritoryBonusLevelUpdate-394]
_ = x[evOpenWorldAttackScheduleStart-395]
_ = x[evOpenWorldAttackScheduleFinished-396]
_ = x[evOpenWorldAttackScheduleCancel-397]
_ = x[evOpenWorldAttackConquerStart-398]
_ = x[evOpenWorldAttackConquerFinished-399]
_ = x[evOpenWorldAttackConquerCancel-400]
_ = x[evOpenWorldAttackConquerStatus-401]
_ = x[evOpenWorldAttackStart-402]
_ = x[evOpenWorldAttackEnd-403]
_ = x[evNewRandomResourceBlocker-404]
_ = x[evNewHomeObject-405]
_ = x[evHideoutObjectUpdate-406]
_ = x[evUpdateInfamy-407]
_ = x[evUnknown408-408]
_ = x[evUnknown409-409]
_ = x[evUnknown410-410]
_ = x[evUnknown411-411]
_ = x[evUnknown412-412]
_ = x[evUnknown413-413]
_ = x[evUnknown414-414]
_ = x[evUnknown415-415]
_ = x[evUnknown416-416]
_ = x[evUnknown417-417]
_ = x[evUnknown418-418]
_ = x[evUnknown419-419]
_ = x[evUnknown420-420]
_ = x[evUnknown421-421]
_ = x[evUnknown422-422]
}
const _EventType_name = "evUnusedevLeaveevJoinFinishedevMoveevTeleportevChangeEquipmentevHealthUpdateevEnergyUpdateevDamageShieldUpdateevCraftingFocusUpdateevActiveSpellEffectsUpdateevResetCooldownsevAttackevCastStartevChannelingUpdateevCastCancelevCastTimeUpdateevCastFinishedevCastSpellevCastHitevCastHitsevChannelingEndedevAttackBuildingevInventoryPutItemevInventoryDeleteItemevNewCharacterevNewEquipmentItemevNewSimpleItemevNewFurnitureItemevNewJournalItemevNewLaborerItemevNewSimpleHarvestableObjectevNewSimpleHarvestableObjectListevNewHarvestableObjectevNewSilverObjectevNewBuildingevHarvestableChangeStateevMobChangeStateevFactionBuildingInfoevCraftBuildingInfoevRepairBuildingInfoevMeldBuildingInfoevConstructionSiteInfoevPlayerBuildingInfoevFarmBuildingInfoevTutorialBuildingInfoevLaborerObjectInfoevLaborerObjectJobInfoevMarketPlaceBuildingInfoevHarvestStartevHarvestCancelevHarvestFinishedevTakeSilverevActionOnBuildingStartevActionOnBuildingCancelevActionOnBuildingFinishedevItemRerollQualityStartevItemRerollQualityCancelevItemRerollQualityFinishedevInstallResourceStartevInstallResourceCancelevInstallResourceFinishedevCraftItemFinishedevLogoutCancelevChatMessageevChatSayevChatWhisperevChatMutedevPlayEmoteevStopEmoteevSystemMessageevUtilityTextMessageevUpdateMoneyevUpdateFameevUpdateLearningPointsevUpdateReSpecPointsevUpdateCurrencyevUpdateFactionStandingevRespawnevServerDebugLogevCharacterEquipmentChangedevRegenerationHealthChangedevRegenerationEnergyChangedevRegenerationMountHealthChangedevRegenerationCraftingChangedevRegenerationHealthEnergyComboChangedevRegenerationPlayerComboChangedevDurabilityChangedevNewLootevAttachItemContainerevDetachItemContainerevInvalidateItemContainerevLockItemContainerevGuildUpdateevGuildPlayerUpdatedevInvitedToGuildevGuildMemberWorldUpdateevUpdateMatchDetailsevObjectEventevNewMonolithObjectevNewSiegeCampObjectevNewOrbObjectevNewCastleObjectevNewSpellEffectAreaevUpdateSpellEffectAreaevNewChainSpellevUpdateChainSpellevNewTreasureChestevStartMatchevStartTerritoryMatchInfosevStartArenaMatchInfosevEndTerritoryMatchevEndArenaMatchevMatchUpdateevActiveMatchUpdateevNewMobevDebugAggroInfoevDebugVariablesInfoevDebugReputationInfoevDebugDiminishingReturnInfoevDebugSmartClusterQueueInfoevClaimOrbStartevClaimOrbFinishedevClaimOrbCancelevOrbUpdateevOrbClaimedevNewWarCampObjectevNewMatchLootChestObjectevNewArenaExitevGuildMemberTerritoryUpdateevInvitedMercenaryToMatchevClusterInfoUpdateevForcedMovementevForcedMovementCancelevCharacterStatsevCharacterStatsKillHistoryevCharacterStatsDeathHistoryevGuildStatsevKillHistoryDetailsevFullAchievementInfoevFinishedAchievementevAchievementProgressInfoevFullAchievementProgressInfoevFullTrackedAchievementInfoevFullAutoLearnAchievementInfoevQuestGiverQuestOfferedevQuestGiverDebugInfoevConsoleEventevTimeSyncevChangeAvatarevChangeMountSkinevGameEventevKilledPlayerevDiedevKnockedDownevMatchPlayerJoinedEventevMatchPlayerStatsEventevMatchPlayerStatsCompleteEventevMatchTimeLineEventEventevMatchPlayerMainGearStatsEventevMatchPlayerChangedAvatarEventevInvitationPlayerTradeevPlayerTradeStartevPlayerTradeCancelevPlayerTradeUpdateevPlayerTradeFinishedevPlayerTradeAcceptChangeevMiniMapPingevMarketPlaceNotificationevDuellingChallengePlayerevNewDuellingPostevDuelStartedevDuelEndedevDuelDeniedevDuelLeftAreaevDuelReEnteredAreaevNewRealEstateevMiniMapOwnedBuildingsPositionsevRealEstateListUpdateevGuildLogoUpdateevGuildLogoChangedevPlaceableObjectPlaceevPlaceableObjectPlaceCancelevFurnitureObjectBuffProviderInfoevFurnitureObjectCheatProviderInfoevFarmableObjectInfoevNewUnreadMailsevUnknown187evGuildLogoObjectUpdateevStartLogoutevNewChatChannelsevJoinedChatChannelevLeftChatChannelevRemovedChatChannelevAccessStatusevMountedevMountStartevMountCancelevNewTravelpointevNewIslandAccessPointevNewExitevUpdateHomeevUpdateChatSettingsevResurrectionOfferevResurrectionReplyevLootEquipmentChangedevUpdateUnlockedGuildLogosevUpdateUnlockedAvatarsevUpdateUnlockedAvatarRingsevUpdateUnlockedBuildingsevNewIslandManagementevNewTeleportStoneevCloakevPartyInvitationevPartyJoinedevPartyDisbandedevPartyPlayerJoinedevPartyChangedOrderevPartyPlayerLeftevPartyLeaderChangedevPartyLootSettingChangedPlayerevPartySilverGainedevPartyPlayerUpdatedevPartyInvitationPlayerBusyevPartyMarkedObjectsUpdatedevPartyOnClusterPartyJoinedevPartySetRoleFlagevSpellCooldownUpdateevNewHellgateevNewHellgateExitevNewExpeditionExitevNewExpeditionNarratorevExitEnterStartevExitEnterCancelevExitEnterFinishedevHellClusterTimeUpdateevNewQuestGiverObjectevFullQuestInfoevQuestProgressInfoevQuestGiverInfoForPlayerevFullExpeditionInfoevExpeditionQuestProgressInfoevInvitedToExpeditionevExpeditionRegistrationInfoevEnteringExpeditionStartevEnteringExpeditionCancelevRewardGrantedevArenaRegistrationInfoevEnteringArenaStartevEnteringArenaCancelevEnteringArenaLockStartevEnteringArenaLockCancelevInvitedToArenaMatchevPlayerCountsevInCombatStateUpdateevOtherGrabbedLootevSiegeCampClaimStartevSiegeCampClaimCancelevSiegeCampClaimFinishedevSiegeCampScheduleResultevTreasureChestUsingStartevTreasureChestUsingFinishedevTreasureChestUsingCancelevTreasureChestUsingOpeningCompleteevTreasureChestForceCloseInventoryevPremiumChangedevPremiumExtendedevPremiumLifeTimeRewardGainedevLaborerGotUpgradedevJournalGotFullevJournalFillErrorevFriendRequestevFriendRequestInfosevFriendInfosevFriendRequestAnsweredevFriendOnlineStatusevFriendRequestCanceledevFriendRemovedevFriendUpdatedevPartyLootItemsevPartyLootItemsRemovedevReputationUpdateevDefenseUnitAttackBeginevDefenseUnitAttackEndevDefenseUnitAttackDamageevUnrestrictedPvpZoneUpdateevReputationImplicationUpdateevNewMountObjectevMountHealthUpdateevMountCooldownUpdateevNewExpeditionAgentevNewExpeditionCheckPointevExpeditionStartEventevVoteEventevRatingEventevNewArenaAgentevBoostFarmableevUseFunctionevNewPortalEntranceevNewPortalExitevNewRandomDungeonExitevWaitingQueueUpdateevPlayerMovementRateUpdateevObserveStartevMinimapZergsevMinimapSmartClusterZergsevPaymentTransactionsevPerformanceStatsUpdateevOverloadModeUpdateevDebugDrawEventevRecordCameraMoveevRecordStartevTerritoryClaimStartevTerritoryClaimCancelevTerritoryClaimFinishedevTerritoryScheduleResultevUpdateAccountStateevStartDeterministicRoamevGuildFullAccessTagsUpdatedevGuildAccessTagUpdatedevGvgSeasonUpdateevGvgSeasonCheatCommandevSeasonPointsByKillingBoosterevFishingStartevFishingCastevFishingCatchevFishingFinishedevFishingCancelevNewFloatObjectevNewFishingZoneObjectevFishingMiniGameevSteamAchievementCompletedevUpdatePuppetevChangeFlaggingFinishedevNewOutpostObjectevOutpostUpdateevOutpostClaimedevOutpostRewardevOverChargeEndevOverChargeStatusevPartyFinderFullUpdateevPartyFinderUpdateevPartyFinderApplicantsUpdateevPartyFinderEquipmentSnapshotevPartyFinderJoinRequestDeclinedevNewUnlockedPersonalSeasonRewardsevPersonalSeasonPointsGainedevEasyAntiCheatMessageToClientevMatchLootChestOpeningStartevMatchLootChestOpeningFinishedevMatchLootChestOpeningCancelevNotifyCrystalMatchRewardevCrystalRealmFeedbackevNewLocationMarkerevNewTutorialBlockerevNewTileSwitchevNewInformationProviderevNewDynamicGuildLogoevTutorialUpdateevTriggerHintBoxevRandomDungeonPositionInfoevNewLootChestevUpdateLootChestevLootChestOpenedevNewShrineevUpdateShrineevMutePlayerUpdateevShopTileUpdateevShopUpdateevEasyAntiCheatKickevUnlockVanityUnlockevAvatarUnlockedevCustomizationChangedevBaseVaultInfoevGuildVaultInfoevBankVaultInfoevRecoveryVaultPlayerInfoevRecoveryVaultGuildInfoevUpdateWardrobeevCastlePhaseChangedevGuildAccountLogEventevNewHideoutObjectevNewHideoutManagementevNewHideoutExitevInitHideoutAttackStartevInitHideoutAttackCancelevInitHideoutAttackFinishedevHideoutManagementUpdateevIpChangedevSmartClusterQueueUpdateInfoevSmartClusterQueueActiveInfoevSmartClusterQueueKickWarningevSmartClusterQueueInviteevReceivedGvgSeasonPointsevTerritoryBonusLevelUpdateevOpenWorldAttackScheduleStartevOpenWorldAttackScheduleFinishedevOpenWorldAttackScheduleCancelevOpenWorldAttackConquerStartevOpenWorldAttackConquerFinishedevOpenWorldAttackConquerCancelevOpenWorldAttackConquerStatusevOpenWorldAttackStartevOpenWorldAttackEndevNewRandomResourceBlockerevNewHomeObjectevHideoutObjectUpdateevUpdateInfamyevUnknown408evUnknown409evUnknown410evUnknown411evUnknown412evUnknown413evUnknown414evUnknown415evUnknown416evUnknown417evUnknown418evUnknown419evUnknown420evUnknown421evUnknown422"
var _EventType_index = [...]uint16{0, 8, 15, 29, 35, 45, 62, 76, 90, 110, 131, 157, 173, 181, 192, 210, 222, 238, 252, 263, 272, 282, 299, 315, 333, 354, 368, 386, 401, 419, 435, 451, 479, 511, 533, 550, 563, 587, 603, 624, 643, 663, 681, 703, 723, 741, 763, 782, 804, 829, 843, 858, 875, 887, 910, 934, 960, 984, 1009, 1036, 1058, 1081, 1106, 1125, 1139, 1152, 1161, 1174, 1185, 1196, 1207, 1222, 1242, 1255, 1267, 1289, 1309, 1325, 1348, 1357, 1373, 1400, 1427, 1454, 1486, 1515, 1553, 1585, 1604, 1613, 1634, 1655, 1680, 1699, 1712, 1732, 1748, 1772, 1792, 1805, 1824, 1844, 1858, 1875, 1895, 1918, 1933, 1951, 1969, 1981, 2007, 2029, 2048, 2063, 2076, 2095, 2103, 2119, 2139, 2160, 2188, 2216, 2231, 2249, 2265, 2276, 2288, 2306, 2331, 2345, 2373, 2398, 2417, 2433, 2455, 2471, 2498, 2526, 2538, 2558, 2579, 2600, 2625, 2654, 2682, 2712, 2736, 2757, 2771, 2781, 2795, 2812, 2823, 2837, 2843, 2856, 2880, 2903, 2934, 2959, 2990, 3021, 3044, 3062, 3081, 3100, 3121, 3146, 3159, 3184, 3209, 3226, 3239, 3250, 3262, 3276, 3295, 3310, 3342, 3364, 3381, 3399, 3421, 3449, 3482, 3516, 3536, 3552, 3564, 3587, 3600, 3617, 3636, 3653, 3673, 3687, 3696, 3708, 3721, 3737, 3759, 3768, 3780, 3800, 3819, 3838, 3860, 3886, 3909, 3936, 3961, 3982, 4000, 4007, 4024, 4037, 4053, 4072, 4091, 4108, 4128, 4159, 4178, 4198, 4225, 4252, 4279, 4297, 4318, 4331, 4348, 4367, 4390, 4406, 4423, 4442, 4465, 4486, 4501, 4520, 4545, 4565, 4594, 4615, 4643, 4668, 4694, 4709, 4732, 4752, 4773, 4797, 4822, 4843, 4857, 4878, 4896, 4917, 4939, 4963, 4988, 5013, 5041, 5067, 5102, 5136, 5152, 5169, 5198, 5218, 5234, 5252, 5267, 5287, 5300, 5323, 5343, 5366, 5381, 5396, 5412, 5435, 5453, 5477, 5499, 5524, 5551, 5580, 5596, 5615, 5636, 5656, 5681, 5703, 5714, 5727, 5742, 5757, 5770, 5789, 5804, 5826, 5846, 5872, 5886, 5900, 5926, 5947, 5971, 5991, 6007, 6025, 6038, 6059, 6081, 6105, 6130, 6150, 6174, 6202, 6225, 6242, 6265, 6295, 6309, 6322, 6336, 6353, 6368, 6384, 6406, 6423, 6450, 6464, 6488, 6506, 6521, 6537, 6552, 6567, 6585, 6608, 6627, 6656, 6686, 6718, 6752, 6780, 6810, 6838, 6869, 6898, 6924, 6946, 6965, 6985, 7000, 7024, 7045, 7061, 7077, 7104, 7118, 7135, 7152, 7163, 7177, 7195, 7211, 7223, 7242, 7262, 7278, 7300, 7315, 7331, 7346, 7371, 7395, 7411, 7431, 7453, 7471, 7493, 7509, 7533, 7558, 7585, 7610, 7621, 7650, 7679, 7709, 7734, 7759, 7786, 7816, 7849, 7880, 7909, 7941, 7971, 8001, 8023, 8043, 8069, 8084, 8105, 8119, 8131, 8143, 8155, 8167, 8179, 8191, 8203, 8215, 8227, 8239, 8251, 8263, 8275, 8287, 8299}
func (i EventType) String() string {
if i >= EventType(len(_EventType_index)-1) {
return "EventType(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _EventType_name[_EventType_index[i]:_EventType_index[i+1]]
}
================================================
FILE: client/listener.go
================================================
package client
import (
"encoding/base64"
"encoding/gob"
"fmt"
"io"
"os"
"github.com/broderickhyman/albiondata-client/log"
photon "github.com/broderickhyman/photon_spectator"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
type listener struct {
handle *pcap.Handle
sourcePackets chan gopacket.Packet
commands chan photon.PhotonCommand
displayName string
fragments *photon.FragmentBuffer
quit chan bool
router *Router
}
func newListener(router *Router) *listener {
return &listener{
fragments: photon.NewFragmentBuffer(),
commands: make(chan photon.PhotonCommand, 1),
quit: make(chan bool, 1),
router: router,
}
}
func (l *listener) startOnline(device string, port int) {
handle, err := pcap.OpenLive(device, 2048, false, pcap.BlockForever)
if err != nil {
log.Panic(err)
}
l.handle = handle
err = l.handle.SetBPFFilter(fmt.Sprintf("tcp port %d || udp port %d", port, port))
if err != nil {
log.Panic(err)
}
layers.RegisterUDPPortLayerType(layers.UDPPort(port), photon.PhotonLayerType)
layers.RegisterTCPPortLayerType(layers.TCPPort(port), photon.PhotonLayerType)
source := gopacket.NewPacketSource(l.handle, l.handle.LinkType())
l.sourcePackets = source.Packets()
l.displayName = fmt.Sprintf("online: %s:%d", device, port)
l.run()
}
func (l *listener) startOfflinePcap(path string) {
handle, err := pcap.OpenOffline(path)
if err != nil {
log.Panicf("Problem creating offline source. Error: %v", err)
}
l.handle = handle
for _, port := range []int{5055, 5056} {
layers.RegisterUDPPortLayerType(layers.UDPPort(port), photon.PhotonLayerType)
layers.RegisterTCPPortLayerType(layers.TCPPort(port), photon.PhotonLayerType)
}
source := gopacket.NewPacketSource(handle, handle.LinkType())
l.sourcePackets = source.Packets()
l.displayName = fmt.Sprintf("Offline Pcap: %s", path)
l.run()
}
func (l *listener) startOfflineCommandGob(path string) {
// Set up packets with an empty channel
l.sourcePackets = make(chan gopacket.Packet, 1)
var decoder *gob.Decoder
file, err := os.Open(path)
if err != nil {
log.Panic("Could not open commands input file ", err)
} else {
decoder = gob.NewDecoder(file)
}
go func() {
for {
command := &photon.PhotonCommand{}
if decoder == nil {
break
}
err = decoder.Decode(command)
if err != nil {
if err == io.EOF {
break
}
log.Error("Could not decode command ", err)
continue
}
l.commands <- *command
}
err = file.Close()
if err != nil {
log.Error("Could not close commands input file ", err)
}
log.Info("All offline commands should processed now.")
}()
for _, port := range []int{5055, 5056} {
layers.RegisterUDPPortLayerType(layers.UDPPort(port), photon.PhotonLayerType)
layers.RegisterTCPPortLayerType(layers.TCPPort(port), photon.PhotonLayerType)
}
l.displayName = fmt.Sprintf("Offline Commands: %s", path)
l.run()
}
func (l *listener) run() {
log.Debugf("Starting listener (%s)...", l.displayName)
for {
select {
case <-l.quit:
log.Debugf("Listener shutting down (%s)...", l.displayName)
l.handle.Close()
return
case packet := <-l.sourcePackets:
if packet != nil {
l.processPacket(packet)
} else {
// MUST only happen with the offline processor.
l.handle.Close()
return
}
case command := <-l.commands:
l.onReliableCommand(&command)
}
}
}
func (l *listener) stop() {
l.quit <- true
l.handle.Close()
}
func (l *listener) processPacket(packet gopacket.Packet) {
layer := packet.Layer(photon.PhotonLayerType)
if layer == nil {
return
}
content, _ := layer.(photon.PhotonLayer)
for _, command := range content.Commands {
switch command.Type {
case photon.SendReliableType:
l.onReliableCommand(&command)
case photon.SendUnreliableType:
var s = make([]byte, len(command.Data)-4)
copy(s, command.Data[4:])
command.Data = s
command.Length -= 4
command.Type = 6
l.onReliableCommand(&command)
case photon.SendReliableFragmentType:
msg, _ := command.ReliableFragment()
result := l.fragments.Offer(msg)
if result != nil {
l.onReliableCommand(result)
}
}
}
}
func (l *listener) onReliableCommand(command *photon.PhotonCommand) {
// Record all photon commands even if the params did not parse correctly
if ConfigGlobal.RecordPath != "" {
l.router.recordPhotonCommand <- *command
}
msg, err := command.ReliableMessage()
if err != nil {
if !ConfigGlobal.DebugIgnoreDecodingErrors {
log.Debugf("Could not decode reliable message: %v - %v", err, base64.StdEncoding.EncodeToString(command.Data))
}
return
}
params := photon.DecodeReliableMessage(msg)
if params == nil {
if !ConfigGlobal.DebugIgnoreDecodingErrors {
log.Debugf("ERROR: Could not decode params: [%d] (%d) (%d) %v", msg.Type, msg.ParamaterCount, len(msg.Data), base64.StdEncoding.EncodeToString(msg.Data))
}
return
}
var operation operation
switch msg.Type {
case photon.OperationRequest:
operation, err = decodeRequest(params)
if params[253] != nil {
number := params[253].(int16)
shouldDebug, exists := ConfigGlobal.DebugOperations[int(number)]
if (exists && shouldDebug) || (!exists && ConfigGlobal.DebugOperationsString == "") {
log.Debugf("OperationRequest: [%v]%v - %v", number, OperationType(number), params)
}
} else if !ConfigGlobal.DebugIgnoreDecodingErrors {
log.Debugf("OperationRequest: ERROR - %v", params)
}
case photon.OperationResponse:
operation, err = decodeResponse(params)
if params[253] != nil {
number := params[253].(int16)
shouldDebug, exists := ConfigGlobal.DebugOperations[int(number)]
if (exists && shouldDebug) || (!exists && ConfigGlobal.DebugOperationsString == "") {
log.Debugf("OperationResponse: [%v]%v - %v", number, OperationType(number), params)
}
} else if !ConfigGlobal.DebugIgnoreDecodingErrors {
log.Debugf("OperationResponse: ERROR - %v", params)
}
case photon.EventDataType:
operation, err = decodeEvent(params)
if params[252] != nil {
number := params[252].(int16)
shouldDebug, exists := ConfigGlobal.DebugEvents[int(number)]
if (exists && shouldDebug) || (!exists && ConfigGlobal.DebugEventsString == "") {
log.Debugf("EventDataType: [%v]%v - %v", number, EventType(number), params)
}
} else if !ConfigGlobal.DebugIgnoreDecodingErrors {
log.Debugf("EventDataType: ERROR - %v", params)
}
default:
err = fmt.Errorf("unsupported message type: %v, data: %v", msg.Type, base64.StdEncoding.EncodeToString(msg.Data))
}
if err != nil && !ConfigGlobal.DebugIgnoreDecodingErrors {
log.Debugf("Error while decoding an event or operation: %v - params: %v", err, params)
operation = nil
}
if operation != nil {
l.router.newOperation <- operation
}
}
================================================
FILE: client/net_interface_filter.go
================================================
package client
import (
"strings"
)
// Mac Address parts to look for, and identify non physical devices. There may be more, update me!
var macAddrPartsToFilter = []string{
"ac:de:48:00:11:22", // Mac OS touchbar (en5)
"00:03:FF", // Microsoft Hyper-V, Virtual Server, Virtual PC
"0A:00:27", // VirtualBox
"00:00:00:00:00", // Teredo Tunneling Pseudo-Interface
"00:50:56", // VMware ESX 3, Server, Workstation, Player
"00:1C:14", // VMware ESX 3, Server, Workstation, Player
"00:0C:29", // VMware ESX 3, Server, Workstation, Player
"00:05:69", // VMware ESX 3, Server, Workstation, Player
"00:1C:42", // Microsoft Hyper-V, Virtual Server, Virtual PC
"00:0F:4B", // Virtual Iron 4
"00:16:3E", // Red Hat Xen, Oracle VM, XenSource, Novell Xen
"08:00:27", // Sun xVM VirtualBox
}
// Filters the possible physical interface address by comparing it to known popular VM Software adresses
// and Teredo Tunneling Pseudo-Interface.
func isPhysicalInterface(addr string) bool {
for _, macPart := range macAddrPartsToFilter {
if strings.HasPrefix(strings.ToLower(addr), strings.ToLower(macPart)) {
return false
}
}
return true
}
================================================
FILE: client/net_interface_filter_nix_darw.go
================================================
// +build linux darwin
package client
import (
"net"
)
// Gets all physical interfaces based on filter results, ignoring all VM, Loopback and Tunnel interfaces.
func getAllPhysicalInterface() ([]string, error) {
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
var outInterfaces []string
for _, _interface := range interfaces {
if _interface.Flags&net.FlagLoopback == 0 && _interface.Flags&net.FlagUp == 1 && isPhysicalInterface(_interface.HardwareAddr.String()) {
outInterfaces = append(outInterfaces, _interface.Name)
}
}
return outInterfaces, nil
}
================================================
FILE: client/net_interface_filter_win.go
================================================
// +build windows
package client
import (
"errors"
"os"
"strings"
"syscall"
"unicode/utf16"
"unsafe"
"golang.org/x/sys/windows"
)
const (
IfOperStatusUp = 1
IF_TYPE_SOFTWARE_LOOPBACK = 24
IF_TYPE_TUNNEL = 131
)
const hexDigit = "0123456789abcdef"
func adapterAddresses() ([]*windows.IpAdapterAddresses, error) {
var b []byte
l := uint32(15000) // recommended initial size
for {
b = make([]byte, l)
err := windows.GetAdaptersAddresses(syscall.AF_UNSPEC, windows.GAA_FLAG_INCLUDE_PREFIX, 0, (*windows.IpAdapterAddresses)(unsafe.Pointer(&b[0])), &l)
if err == nil {
if l == 0 {
return nil, nil
}
break
}
if err.(syscall.Errno) != syscall.ERROR_BUFFER_OVERFLOW {
return nil, os.NewSyscallError("getadaptersaddresses", err)
}
if l <= uint32(len(b)) {
return nil, os.NewSyscallError("getadaptersaddresses", err)
}
}
var aas []*windows.IpAdapterAddresses
for aa := (*windows.IpAdapterAddresses)(unsafe.Pointer(&b[0])); aa != nil; aa = aa.Next {
aas = append(aas, aa)
}
return aas, nil
}
func bytePtrToString(p *uint8) string {
a := (*[10000]uint8)(unsafe.Pointer(p))
i := 0
for a[i] != 0 {
i++
}
return string(a[:i])
}
func physicalAddrToString(physAddr [8]byte) string {
buf := make([]byte, 0, len(physAddr)*3-1)
for i, b := range physAddr {
if i > 0 {
buf = append(buf, ':')
}
buf = append(buf, hexDigit[b>>4])
buf = append(buf, hexDigit[b&0xF])
}
return string(buf)
}
func cStringToString(cs *uint16) (s string) {
if cs != nil {
us := make([]uint16, 0, 256)
for p := uintptr(unsafe.Pointer(cs)); ; p += 2 {
u := *(*uint16)(unsafe.Pointer(p))
if u == 0 {
return string(utf16.Decode(us))
}
us = append(us, u)
}
}
return ""
}
// Gets all physical interfaces based on filter results, ignoring all VM, Loopback and Tunnel interfaces.
func getAllPhysicalInterface() ([]string, error) {
aa, err := adapterAddresses()
if err != nil {
return nil, err
}
var outInterfaces []string
devices := strings.Split(strings.ReplaceAll(strings.ToLower(ConfigGlobal.ListenDevices), "-", ":"), ",")
for _, pa := range aa {
mac := physicalAddrToString(pa.PhysicalAddress)
deviceFound := false
if len(devices) > 0 {
for _, device := range devices {
if strings.HasPrefix(strings.ToLower(mac), device) {
deviceFound = true
break
}
}
if !deviceFound {
continue
}
}
name := "\\Device\\NPF_" + bytePtrToString(pa.AdapterName)
if pa.IfType != uint32(IF_TYPE_SOFTWARE_LOOPBACK) && pa.IfType != uint32(IF_TYPE_TUNNEL) &&
pa.OperStatus == uint32(IfOperStatusUp) && isPhysicalInterface(mac) {
outInterfaces = append(outInterfaces, name)
}
}
if len(outInterfaces) == 0 {
if len(devices) > 0 {
return nil, errors.New("mac address was not found")
} else {
return nil, errors.New("could not find a network interface")
}
}
return outInterfaces, nil
}
================================================
FILE: client/offline.go
================================================
package client
import (
"os"
"path/filepath"
"github.com/broderickhyman/albiondata-client/log"
)
func processOffline(path string) {
log.Infof("Beginning offline process with %v", path)
r := newRouter()
go r.run()
_, err := os.Stat(path)
if err != nil {
log.Error("Could not find {}: ", path, err)
return
}
l := newListener(r)
fileExtension := filepath.Ext(path)
if fileExtension == ".pcap" {
l.startOfflinePcap(path)
} else if fileExtension == ".gob" {
l.startOfflineCommandGob(path)
} else {
log.Error("Only .pcap and .gob files supported at this time.")
}
}
================================================
FILE: client/operation_auction_get_item_average_stats.go
================================================
package client
import (
"sort"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type operationAuctionGetItemAverageStats struct {
ItemID uint32 `mapstructure:"1"`
Quality uint8 `mapstructure:"2"`
Timescale lib.Timescale `mapstructure:"3"`
Enchantment uint32 `mapstructure:"4"`
MessageID uint64 `mapstructure:"255"`
}
func (op operationAuctionGetItemAverageStats) Process(state *albionState) {
var index = op.MessageID % CacheSize
mhInfo := marketHistoryInfo{
albionId: op.ItemID,
timescale: op.Timescale,
quality: op.Quality,
}
state.marketHistoryIDLookup[index] = mhInfo
log.Debugf("Market History - Caching %d at %d.", mhInfo.albionId, index)
}
type operationAuctionGetItemAverageStatsResponse struct {
ItemAmounts []int64 `mapstructure:"0"`
SilverAmounts []uint64 `mapstructure:"1"`
Timestamps []uint64 `mapstructure:"2"`
MessageID int `mapstructure:"255"`
}
func (op operationAuctionGetItemAverageStatsResponse) Process(state *albionState) {
var index = op.MessageID % CacheSize
var mhInfo = state.marketHistoryIDLookup[index]
log.Debugf("Market History - Loaded itemID %d from cache at index %d", mhInfo.albionId, index)
log.Debug("Got response to GetItemAverageStats operation for the itemID[", mhInfo.albionId, "] of quality: ", mhInfo.quality, " and on the timescale: ", mhInfo.timescale)
if !state.IsValidLocation() {
return
}
var histories []*lib.MarketHistory
// TODO can we make this safer? Right now we just assume all the arrays are the same length as the number of item amounts
for i := range op.ItemAmounts {
// sometimes opAuctionGetItemAverageStats receives negative item amounts
if op.ItemAmounts[i] < 0 {
if op.ItemAmounts[i] < -124 {
// still don't know what to do with these
log.Debugf("Market History - Ignoring negative item amount %d for %d silver on %d", op.ItemAmounts[i], op.SilverAmounts[i], op.Timestamps[i])
continue
}
// however these can be interpreted by adding them to 256
// TODO: make more sense of this, (perhaps there is a better way)
log.Debugf("Market History - Interpreting negative item amount %d as %d for %d silver on %d", op.ItemAmounts[i], 256+op.ItemAmounts[i], op.SilverAmounts[i], op.Timestamps[i])
op.ItemAmounts[i] = 256 + op.ItemAmounts[i]
}
history := &lib.MarketHistory{}
history.ItemAmount = op.ItemAmounts[i]
history.SilverAmount = op.SilverAmounts[i]
history.Timestamp = op.Timestamps[i]
histories = append(histories, history)
}
if len(histories) < 1 {
log.Info("Auction Stats Response - no history\n\n")
return
}
// Sort history by descending time so the newest is always first in the list
sort.SliceStable(histories, func(i, j int) bool {
return histories[i].Timestamp > histories[j].Timestamp
})
upload := lib.MarketHistoriesUpload{
AlbionId: mhInfo.albionId,
LocationId: state.LocationId,
QualityLevel: mhInfo.quality,
Timescale: mhInfo.timescale,
Histories: histories,
}
log.Infof("Sending %d item average stats to ingest for albionID %d", len(histories), mhInfo.albionId)
sendMsgToPublicUploaders(upload, lib.NatsMarketHistoriesIngest, state)
}
================================================
FILE: client/operation_auction_get_offers.go
================================================
package client
import (
"encoding/json"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type operationAuctionGetOffers struct {
Category string `mapstructure:"1"`
SubCategory string `mapstructure:"2"`
Quality string `mapstructure:"3"`
Enchantment uint32 `mapstructure:"4"`
EnchantmentLevel string `mapstructure:"8"`
ItemIds []uint16 `mapstructure:"6"`
MaxResults uint32 `mapstructure:"9"`
IsAscendingOrder bool `mapstructure:"12"`
}
func (op operationAuctionGetOffers) Process(state *albionState) {
log.Debug("Got AuctionGetOffers operation...")
}
type operationAuctionGetOffersResponse struct {
MarketOrders []string `mapstructure:"0"`
}
func (op operationAuctionGetOffersResponse) Process(state *albionState) {
log.Debug("Got response to AuctionGetOffers operation...")
if !state.IsValidLocation() {
return
}
var orders []*lib.MarketOrder
for _, v := range op.MarketOrders {
order := &lib.MarketOrder{}
err := json.Unmarshal([]byte(v), order)
if err != nil {
log.Errorf("Problem converting market order to internal struct: %v", err)
}
order.LocationID = state.LocationId
orders = append(orders, order)
}
if len(orders) < 1 {
return
}
upload := lib.MarketUpload{
Orders: orders,
}
log.Infof("Sending %d market offers to ingest", len(orders))
sendMsgToPublicUploaders(upload, lib.NatsMarketOrdersIngest, state)
}
================================================
FILE: client/operation_auction_get_requests.go
================================================
package client
import (
"encoding/json"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type operationAuctionGetRequestsResponse struct {
MarketOrders []string `mapstructure:"0"`
}
func (op operationAuctionGetRequestsResponse) Process(state *albionState) {
log.Debug("Got response to AuctionGetOffers operation...")
if !state.IsValidLocation() {
return
}
var orders []*lib.MarketOrder
for _, v := range op.MarketOrders {
order := &lib.MarketOrder{}
err := json.Unmarshal([]byte(v), order)
if err != nil {
log.Errorf("Problem converting market order to internal struct: %v", err)
}
order.LocationID = state.LocationId
orders = append(orders, order)
}
if len(orders) < 1 {
return
}
upload := lib.MarketUpload{
Orders: orders,
}
log.Infof("Sending %d market requests to ingest", len(orders))
sendMsgToPublicUploaders(upload, lib.NatsMarketOrdersIngest, state)
}
================================================
FILE: client/operation_get_cluster_map_info.go
================================================
package client
import (
"strconv"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type operationGetClusterMapInfo struct {
}
func (op operationGetClusterMapInfo) Process(state *albionState) {
log.Debug("Got GetClusterMapInfo operation...")
}
type operationGetClusterMapInfoResponse struct {
ZoneID string `mapstructure:"0"`
BuildingType []int `mapstructure:"5"`
AvailableFood []int `mapstructure:"10"`
Reward []int `mapstructure:"12"`
AvailableSilver []int `mapstructure:"13"`
Owners []string `mapstructure:"14"`
Buildable []bool `mapstructure:"19"`
IsForSale []bool `mapstructure:"27"`
BuyPrice []int `mapstructure:"28"`
}
func (op operationGetClusterMapInfoResponse) Process(state *albionState) {
log.Debug("Got response to GetClusterMapInfo operation...")
zoneInt, err := strconv.Atoi(op.ZoneID)
if err != nil {
log.Debugf("Unable to convert zoneID to int. Probably an instance.. ZoneID: %v", op.ZoneID)
return
}
upload := lib.MapDataUpload{
ZoneID: zoneInt,
BuildingType: op.BuildingType,
AvailableFood: op.AvailableFood,
Reward: op.Reward,
AvailableSilver: op.AvailableSilver,
Owners: op.Owners,
Buildable: op.Buildable,
IsForSale: op.IsForSale,
BuyPrice: op.BuyPrice,
}
log.Info("Sending map data to ingest")
sendMsgToPublicUploaders(upload, lib.NatsMapDataIngest, state)
}
================================================
FILE: client/operation_get_game_server_by_cluster.go
================================================
package client
import (
"strconv"
"strings"
"github.com/broderickhyman/albiondata-client/log"
)
type operationGetGameServerByCluster struct {
ZoneID string `mapstructure:"0"`
}
func (op operationGetGameServerByCluster) Process(state *albionState) {
log.Debug("Got GetGameServerByCluster operation...")
state.LocationString = op.ZoneID
// TODO: Fix hack for second caerleon marketplace
// Most likely will need to only use strings for player location in client
zoneInt, err := strconv.Atoi(strings.Replace(op.ZoneID, "-Auction2", "", -1))
if err != nil {
log.Debugf("Unable to convert zoneID to int. Probably an instance.. ZoneID: %v", op.ZoneID)
state.LocationId = -2 // hack
return
}
log.Infof("Updating player location to %v.", zoneInt)
state.LocationId = zoneInt
}
================================================
FILE: client/operation_get_mail_infos.go
================================================
package client
import (
"fmt"
"time"
"github.com/broderickhyman/albiondata-client/log"
)
var MailInfos MailInfosLookup
type MailInfosLookup []MailInfo
func (mi MailInfosLookup) getMailInfo(id int) *MailInfo {
for i := range mi {
if mi[i].ID == id {
return &mi[i]
}
}
return nil
}
type MailInfo struct {
ID int `json:"MailId"` // mapstructure:"3"
LocationID string `json:"LocationId"` // mapstructure:"6"
OrderType string `json:"OrderType"` // mapstructure:"10"
Expires int64 `json:"Expires"` // mapstructure:"11"
}
func (m *MailInfo) StringArray() []string {
return []string{
fmt.Sprintf("%d", m.ID),
m.LocationID,
m.OrderType,
m.StringExpires(),
}
}
func (m *MailInfo) StringExpires() string {
return time.Unix(m.Expires, 0).Format(time.RFC3339)
}
type operationGetMailInfosResponse struct {
MailIDs []int `mapstructure:"3"` // mapstructure:"3"
Locations []string `mapstructure:"6"` // mapstructure:"6"
OrderTypes []string `mapstructure:"10"` // mapstructure:"10"
Expires []int64 `mapstructure:"11"` // mapstructure:"11"
}
func (op operationGetMailInfosResponse) Process(state *albionState) {
log.Debugf("Got response to GetMailInfos operation")
for i := range op.MailIDs {
mail := &MailInfo{}
mail.ID = op.MailIDs[i]
mail.LocationID = op.Locations[i]
mail.OrderType = op.OrderTypes[i]
mail.Expires = op.Expires[i]
MailInfos = append(MailInfos, *mail)
}
if len(MailInfos) < 1 {
log.Info("Mail Infos Response - no mails\n\n")
return
}
log.Infof("Mail Infos - Cached %#d mail infos", len(MailInfos))
}
================================================
FILE: client/operation_gold_market_get_average_info.go
================================================
package client
import (
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type operationGoldMarketGetAverageInfo struct {
}
func (op operationGoldMarketGetAverageInfo) Process(state *albionState) {
log.Debug("Got GoldMarketGetAverageInfo operation...")
}
type operationGoldMarketGetAverageInfoResponse struct {
GoldPrices []int `mapstructure:"0"`
TimeStamps []int64 `mapstructure:"1"`
}
func (op operationGoldMarketGetAverageInfoResponse) Process(state *albionState) {
log.Debug("Got response to GoldMarketGetAverageInfo operation...")
upload := lib.GoldPricesUpload{
Prices: op.GoldPrices,
TimeStamps: op.TimeStamps,
}
log.Info("Sending gold prices to ingest")
sendMsgToPublicUploaders(upload, lib.NatsGoldPricesIngest, state)
}
================================================
FILE: client/operation_join.go
================================================
package client
import (
"strconv"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type operationJoinResponse struct {
CharacterID lib.CharacterID `mapstructure:"1"`
CharacterName string `mapstructure:"2"`
Location string `mapstructure:"8"`
GuildID lib.CharacterID `mapstructure:"47"`
GuildName string `mapstructure:"51"`
}
//CharacterPartsJSON string `mapstructure:"6"`
//Edition string `mapstructure:"38"`
func (op operationJoinResponse) Process(state *albionState) {
log.Debugf("Got JoinResponse operation...")
loc, err := strconv.Atoi(op.Location)
if err != nil {
log.Debugf("Unable to convert zoneID to int. Probably an instance.")
state.LocationId = -2
} else {
state.LocationId = loc
}
log.Infof("Updating player location to %v.", op.Location)
if state.CharacterId != op.CharacterID {
log.Infof("Updating player ID to %v.", op.CharacterID)
}
state.CharacterId = op.CharacterID
if state.CharacterName != op.CharacterName {
log.Infof("Updating player to %v.", op.CharacterName)
}
state.CharacterName = op.CharacterName
}
================================================
FILE: client/operation_read_mail.go
================================================
package client
import (
"strconv"
"strings"
"github.com/broderickhyman/albiondata-client/lib"
"github.com/broderickhyman/albiondata-client/log"
)
type operationReadMail struct {
ID int `mapstructure:"0"`
Body string `mapstructure:"1"`
}
func (op operationReadMail) Process(state *albionState) {
log.Debug("Got ReadMail operation...")
var notification lib.MarketNotification
// split the mail body
body := strings.Split(op.Body, "|")
mailInfo := MailInfos.getMailInfo(op.ID)
if mailInfo == nil {
log.Info("Mail Info is not valid. Please transition zones or click at notification, so the mails can be loaded.")
return
}
if mailInfo.OrderType == "MARKETPLACE_SELLORDER_FINISHED_SUMMARY" {
log.Debug("Read finished sell order.")
notification = decodeSellNotification(op, body)
} else if mailInfo.OrderType == "MARKETPLACE_SELLORDER_EXPIRED_SUMMARY" {
log.Debug("Read expired sell order.")
notification = decodeExpiryNotification(op, body)
}
if notification == nil {
return
}
upload := lib.MarketNotificationUpload{
Type: notification.Type(),
Notification: notification,
}
sendMsgToPrivateUploaders(&upload, lib.NatsMarketNotifications, state)
}
func decodeSellNotification(op operationReadMail, body []string) lib.MarketNotification {
notification := &lib.MarketSellNotification{}
notification.MailID = op.ID
amount, err := strconv.Atoi(body[0])
if err != nil {
log.Error("Could not parse amount in market sell notification ", err)
return nil
}
price, err := strconv.Atoi(body[3])
if err != nil {
log.Error("Could not parse price in market sell notification ", err)
return nil
}
notification.Amount = amount
notification.ItemID = body[1]
notification.Price = price / 10000
notification.TotalAfterTaxes = float32(float32(notification.Price) * float32(notification.Amount) * (1.0 - lib.SalesTax))
mailInfo := MailInfos.getMailInfo(op.ID)
notification.LocationID = mailInfo.LocationID
notification.Expires = mailInfo.StringExpires()
return notification
}
func decodeExpiryNotification(op operationReadMail, body []string) lib.MarketNotification {
notification := &lib.MarketExpiryNotification{}
notification.MailID = op.ID
sold, err := strconv.Atoi(body[0])
if err != nil {
log.Error("Could not parse amount in market sell notification ", err)
return nil
}
amount, err := strconv.Atoi(body[1])
if err != nil {
log.Error("Could not parse amount in market sell notification ", err)
return nil
}
price, err := strconv.Atoi(body[2])
if err != nil {
log.Error("Could not parse price in market sell notification ", err)
return nil
}
notification.Amount = amount
notification.ItemID = body[1]
notification.Price = price / 10000
notification.Sold = sold
mailInfo := MailInfos.getMailInfo(op.ID)
notification.LocationID = mailInfo.LocationID
notification.Expires = mailInfo.StringExpires()
return notification
}
================================================
FILE: client/operation_real_estate_bid_on_auction.go
================================================
package client
import (
"github.com/broderickhyman/albiondata-client/log"
)
type operationRealEstateBidOnAuction struct {
}
func (op operationRealEstateBidOnAuction) Process(state *albionState) {
log.Debug("Got RealEstateBidOnAuction operation...")
}
type operationRealEstateBidOnAuctionResponse struct {
}
func (op operationRealEstateBidOnAuctionResponse) Process(state *albionState) {
log.Debug("Got response to RealEstateBidOnAuction operation...")
}
================================================
FILE: client/operation_real_estate_get_auction_data.go
================================================
package client
import (
"github.com/broderickhyman/albiondata-client/log"
)
type operationRealEstateGetAuctionData struct {
PlotID int `mapstructure:"0"`
}
func (op operationRealEstateGetAuctionData) Process(state *albionState) {
log.Debug("Got RealEstateGetAuctionData operation...")
}
type operationRealEstateGetAuctionDataResponse struct {
Unknown int `mapstructure:"0"`
HighestBidderName string `mapstructure:"1"`
CurrentWinningBid int `mapstructure:"2"`
AuctionStartTime int `mapstructure:"3"`
AuctionEndTime int `mapstructure:"4"`
}
func (op operationRealEstateGetAuctionDataResponse) Process(state *albionState) {
log.Debug("Got response to RealEstateGetAuctionData operation...")
}
================================================
FILE: client/operations.go
================================================
package client
type operation interface {
Process(state *albionState)
}
// Notes:
// 2020-08-31 (@phendryx): opAuctionGetItemsAverage removed from op codes
// based on public suggested changes and
// @marleythemongolianmoose's findings:
// "MarleyTheMongolianMoose: AuctionGetItemsAverage == 92 == kind
// of looks like it disappears in the new one"
//OperationType used to identify operation types
//go:generate stringer -type=OperationType
type OperationType uint16
const (
opUnused OperationType = iota
opPing
opJoin
opCreateAccount
opLogin
opSendCrashLog
opSendTraceRoute
opSendVfxStats
opSendGamePingInfo
opCreateCharacter
opDeleteCharacter
opSelectCharacter
opGetGameServerByCluster
opGetActiveSubscription
opGetShopPurchaseUrl
opGetBuyTrialDetails
opGetReferralSeasonDetails
opGetReferralLink
opGetAvailableTrialKeys
opGetShopTilesForCategory
opMove
opCastStart
opCastCancel
opTerminateToggleSpell
opChannelingCancel
opAttackBuildingStart
opInventoryDestroyItem
opInventoryMoveItem
opInventoryRecoverItem
opInventoryRecoverAllItems
opInventorySplitStack
opInventorySplitStackInto
opGetClusterData
opChangeCluster
opConsoleCommand
opChatMessage
opReportClientError
opRegisterToObject
opUnRegisterFromObject
opCraftBuildingChangeSettings
opCraftBuildingTakeMoney
opRepairBuildingChangeSettings
opRepairBuildingTakeMoney
opActionBuildingChangeSettings
opHarvestStart
opHarvestCancel
opTakeSilver
opActionOnBuildingStart
opActionOnBuildingCancel
opItemRerollQualityStart
opItemRerollQualityCancel
opInstallResourceStart
opInstallResourceCancel
opInstallSilver
opBuildingFillNutrition
opBuildingChangeRenovationState
opBuildingBuySkin
opBuildingClaim
opBuildingGiveup
opBuildingNutritionSilverStorageDeposit
opBuildingNutritionSilverStorageWithdraw
opBuildingNutritionSilverRewardSet
opConstructionSiteCreate
opPlaceableObjectPlace
opPlaceableObjectPlaceCancel
opPlaceableObjectPickup
opFurnitureObjectUse
opFarmableHarvest
opFarmableFinishGrownItem
opFarmableDestroy
opFarmableGetProduct
opTearDownConstructionSite
opCastleGateUse
opAuctionCreateRequest
opAuctionCreateOffer
opAuctionGetOffers
opAuctionGetRequests
opAuctionBuyOffer
opAuctionAbortAuction
opAuctionModifyAuction
opAuctionAbortOffer
opAuctionAbortRequest
opAuctionSellRequest
opAuctionGetFinishedAuctions
opAuctionGetFinishedAuctionsCount
opAuctionFetchAuction
opAuctionGetMyOpenOffers
opAuctionGetMyOpenRequests
opAuctionGetMyOpenAuctions
opAuctionGetItemAverageStats
opAuctionGetItemAverageValue
opContainerOpen
opContainerClose
opContainerManageSubContainer
opRespawn
opSuicide
opJoinGuild
opLeaveGuild
opCreateGuild
opInviteToGuild
opDeclineGuildInvitation
opKickFromGuild
opDuellingChallengePlayer
opDuellingAcceptChallenge
opDuellingDenyChallenge
opChangeClusterTax
opClaimTerritory
opGiveUpTerritory
opChangeTerritoryAccessRights
opGetMonolithInfo
opGetClaimInfo
opGetAttackInfo
opGetTerritorySeasonPoints
opGetAttackSchedule
opScheduleAttack
opGetMatches
opGetMatchDetails
opJoinMatch
opLeaveMatch
opChangeChatSettings
opLogoutStart
opLogoutCancel
opClaimOrbStart
opClaimOrbCancel
opMatchLootChestOpeningStart
opMatchLootChestOpeningCancel
opDepositToGuildAccount
opWithdrawalFromAccount
opChangeGuildPayUpkeepFlag
opChangeGuildTax
opGetMyTerritories
opMorganaCommand
opGetServerInfo
opInviteMercenaryToMatch
opSubscribeToCluster
opAnswerMercenaryInvitation
opGetCharacterEquipment
opGetCharacterSteamAchievements
opGetCharacterStats
opGetKillHistoryDetails
opLearnMasteryLevel
opReSpecAchievement
opChangeAvatar
opGetRankings
opGetRank
opGetGvgSeasonRankings
opGetGvgSeasonRank
opGetGvgSeasonHistoryRankings
opGetGvgSeasonGuildMemberHistory
opKickFromGvGMatch
opGetChestLogs
opGetAccessRightLogs
opGetGuildAccountLogs
opGetGuildAccountLogsLargeAmount
opInviteToPlayerTrade
opPlayerTradeCancel
opPlayerTradeInvitationAccept
opPlayerTradeAddItem
opPlayerTradeRemoveItem
opPlayerTradeAcceptTrade
opPlayerTradeSetSilverOrGold
opSendMiniMapPing
opStuck
opBuyRealEstate
opClaimRealEstate
opGiveUpRealEstate
opChangeRealEstateOutline
opGetMailInfos
opGetMailCount
opReadMail
opSendNewMail
opDeleteMail
opMarkMailUnread
opClaimAttachmentFromMail
opUpdateLfgInfo
opGetLfgInfos
opGetMyGuildLfgInfo
opGetLfgDescriptionText
opLfgApplyToGuild
opAnswerLfgGuildApplication
opRegisterChatPeer
opSendChatMessage
opJoinChatChannel
opLeaveChatChannel
opSendWhisperMessage
opSay
opPlayEmote
opStopEmote
opGetClusterMapInfo
opAccessRightsChangeSettings
opMount
opMountCancel
opBuyJourney
opSetSaleStatusForEstate
opResolveGuildOrPlayerName
opGetRespawnInfos
opMakeHome
opLeaveHome
opResurrectionReply
opAllianceCreate
opAllianceDisband
opAllianceGetMemberInfos
opAllianceInvite
opAllianceAnswerInvitation
opAllianceCancelInvitation
opAllianceKickGuild
opAllianceLeave
opAllianceChangeGoldPaymentFlag
opAllianceGetDetailInfo
opGetIslandInfos
opAbandonMyIsland
opBuyMyIsland
opBuyGuildIsland
opAbandonGuildIsland
opUpgradeMyIsland
opUpgradeGuildIsland
opMoveMyIsland
opMoveGuildIsland
opTerritoryFillNutrition
opTeleportBack
opPartyInvitePlayer
opPartyAnswerInvitation
opPartyLeave
opPartyKickPlayer
opPartyMakeLeader
opPartyChangeLootSetting
opPartyMarkObject
opPartySetRole
opGetGuildMOTD
opSetGuildMOTD
opExitEnterStart
opExitEnterCancel
opQuestGiverRequest
opUnknown233
opGoldMarketGetBuyOffer
opGoldMarketGetBuyOfferFromSilver
opGoldMarketGetSellOffer
opGoldMarketGetSellOfferFromSilver
opGoldMarketBuyGold
opGoldMarketSellGold
opGoldMarketCreateSellOrder
opGoldMarketCreateBuyOrder
opGoldMarketGetInfos
opGoldMarketCancelOrder
opUnknown244
opUnknown245
opGoldMarketGetAverageInfo
opSiegeCampClaimStart
opSiegeCampClaimCancel
opTreasureChestUsingStart
opTreasureChestUsingCancel
opUseLootChest
opUseShrine
opLaborerStartJob
opLaborerTakeJobLoot
opLaborerDismiss
opLaborerMove
opLaborerBuyItem
opLaborerUpgrade
opBuyPremium
opBuyTrial
opRealEstateGetAuctionData
opRealEstateBidOnAuction
opGetSiegeCampCooldown
opFriendInvite
opFriendAnswerInvitation
opFriendCancelnvitation
opFriendRemove
opInventoryStack
opInventorySort
opEquipmentItemChangeSpell
opExpeditionRegister
opExpeditionRegisterCancel
opJoinExpedition
opDeclineExpeditionInvitation
opVoteStart
opVoteDoVote
opRatingDoRate
opEnteringExpeditionStart
opEnteringExpeditionCancel
opActivateExpeditionCheckPoint
opArenaRegister
opArenaRegisterCancel
opArenaLeave
opJoinArenaMatch
opDeclineArenaInvitation
opEnteringArenaStart
opEnteringArenaCancel
opArenaCustomMatch
opArenaCustomMatchCreate
opUpdateCharacterStatement
opBoostFarmable
opGetStrikeHistory
opUseFunction
opUsePortalEntrance
opResetPortalBinding
opQueryPortalBinding
opClaimPaymentTransaction
opChangeUseFlag
opClientPerformanceStats
opExtendedHardwareStats
opClientLowMemoryWarning
opTerritoryClaimStart
opTerritoryClaimCancel
opRequestAppStoreProducts
opVerifyProductPurchase
opQueryGuildPlayerStats
opQueryAllianceGuildStats
opTrackAchievements
opSetAchievementsAutoLearn
opDepositItemToGuildCurrency
opWithdrawalItemFromGuildCurrency
opAuctionSellSpecificItemRequest
opFishingStart
opFishingCasting
opFishingCast
opFishingCatch
opFishingPull
opFishingGiveLine
opFishingFinish
opFishingCancel
opCreateGuildAccessTag
opDeleteGuildAccessTag
opRenameGuildAccessTag
opFlagGuildAccessTagGuildPermission
opAssignGuildAccessTag
opRemoveGuildAccessTagFromPlayer
opModifyGuildAccessTagEditors
opRequestPublicAccessTags
opChangeAccessTagPublicFlag
opUpdateGuildAccessTag
opSteamStartMicrotransaction
opSteamFinishMicrotransaction
opSteamIdHasActiveAccount
opCheckEmailAccountState
opLinkAccountToSteamId
opBuyGvgSeasonBooster
opChangeFlaggingPrepare
opOverCharge
opOverChargeEnd
opRequestTrusted
opChangeGuildLogo
opPartyFinderRegisterForUpdates
opPartyFinderUnregisterForUpdates
opPartyFinderEnlistNewPartySearch
opPartyFinderDeletePartySearch
opPartyFinderChangePartySearch
opPartyFinderChangeRole
opPartyFinderApplyForGroup
opPartyFinderAcceptOrDeclineApplyForGroup
opPartyFinderGetEquipmentSnapshot
opPartyFinderRegisterApplicants
opPartyFinderUnregisterApplicants
opPartyFinderFulltextSearch
opPartyFinderRequestEquipmentSnapshot
opGetPersonalSeasonTrackerData
opUseConsumableFromInventory
opClaimPersonalSeasonReward
opEasyAntiCheatMessageToServer
opSetNextTutorialState
opAddPlayerToMuteList
opRemovePlayerFromMuteList
opProductShopUserEvent
opGetVanityUnlocks
opBuyVanityUnlocks
opGetMountSkins
opSetMountSkin
opSetWardrobe
opChangeCustomization
opSetFavoriteIsland
opGetGuildChallengePoints
opTravelToHideout
opSmartQueueJoin
opSmartQueueLeave
opSmartQueueSelectSpawnCluster
opUpgradeHideout
opInitHideoutAttackStart
opInitHideoutAttackCancel
opHideoutFillNutrition
opHideoutGetInfo
opHideoutGetOwnerInfo
opHideoutSetTribute
opOpenWorldAttackScheduleStart
opOpenWorldAttackScheduleCancel
opOpenWorldAttackConquerStart
opOpenWorldAttackConquerCancel
opGetOpenWorldAttackDetails
opGetNextOpenWorldAttackScheduleTime
opRecoverVaultFromHideout
opGetGuildEnergyDrainInfo
opChannelingUpdate
)
================================================
FILE: client/operationtype_string.go
================================================
// Code generated by "stringer -type=OperationType"; DO NOT EDIT.
package client
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[opUnused-0]
_ = x[opPing-1]
_ = x[opJoin-2]
_ = x[opCreateAccount-3]
_ = x[opLogin-4]
_ = x[opSendCrashLog-5]
_ = x[opSendTraceRoute-6]
_ = x[opSendVfxStats-7]
_ = x[opSendGamePingInfo-8]
_ = x[opCreateCharacter-9]
_ = x[opDeleteCharacter-10]
_ = x[opSelectCharacter-11]
_ = x[opGetGameServerByCluster-12]
_ = x[opGetActiveSubscription-13]
_ = x[opGetShopPurchaseUrl-14]
_ = x[opGetBuyTrialDetails-15]
_ = x[opGetReferralSeasonDetails-16]
_ = x[opGetReferralLink-17]
_ = x[opGetAvailableTrialKeys-18]
_ = x[opGetShopTilesForCategory-19]
_ = x[opMove-20]
_ = x[opCastStart-21]
_ = x[opCastCancel-22]
_ = x[opTerminateToggleSpell-23]
_ = x[opChannelingCancel-24]
_ = x[opAttackBuildingStart-25]
_ = x[opInventoryDestroyItem-26]
_ = x[opInventoryMoveItem-27]
_ = x[opInventoryRecoverItem-28]
_ = x[opInventoryRecoverAllItems-29]
_ = x[opInventorySplitStack-30]
_ = x[opInventorySplitStackInto-31]
_ = x[opGetClusterData-32]
_ = x[opChangeCluster-33]
_ = x[opConsoleCommand-34]
_ = x[opChatMessage-35]
_ = x[opReportClientError-36]
_ = x[opRegisterToObject-37]
_ = x[opUnRegisterFromObject-38]
_ = x[opCraftBuildingChangeSettings-39]
_ = x[opCraftBuildingTakeMoney-40]
_ = x[opRepairBuildingChangeSettings-41]
_ = x[opRepairBuildingTakeMoney-42]
_ = x[opActionBuildingChangeSettings-43]
_ = x[opHarvestStart-44]
_ = x[opHarvestCancel-45]
_ = x[opTakeSilver-46]
_ = x[opActionOnBuildingStart-47]
_ = x[opActionOnBuildingCancel-48]
_ = x[opItemRerollQualityStart-49]
_ = x[opItemRerollQualityCancel-50]
_ = x[opInstallResourceStart-51]
_ = x[opInstallResourceCancel-52]
_ = x[opInstallSilver-53]
_ = x[opBuildingFillNutrition-54]
_ = x[opBuildingChangeRenovationState-55]
_ = x[opBuildingBuySkin-56]
_ = x[opBuildingClaim-57]
_ = x[opBuildingGiveup-58]
_ = x[opBuildingNutritionSilverStorageDeposit-59]
_ = x[opBuildingNutritionSilverStorageWithdraw-60]
_ = x[opBuildingNutritionSilverRewardSet-61]
_ = x[opConstructionSiteCreate-62]
_ = x[opPlaceableObjectPlace-63]
_ = x[opPlaceableObjectPlaceCancel-64]
_ = x[opPlaceableObjectPickup-65]
_ = x[opFurnitureObjectUse-66]
_ = x[opFarmableHarvest-67]
_ = x[opFarmableFinishGrownItem-68]
_ = x[opFarmableDestroy-69]
_ = x[opFarmableGetProduct-70]
_ = x[opTearDownConstructionSite-71]
_ = x[opCastleGateUse-72]
_ = x[opAuctionCreateRequest-73]
_ = x[opAuctionCreateOffer-74]
_ = x[opAuctionGetOffers-75]
_ = x[opAuctionGetRequests-76]
_ = x[opAuctionBuyOffer-77]
_ = x[opAuctionAbortAuction-78]
_ = x[opAuctionModifyAuction-79]
_ = x[opAuctionAbortOffer-80]
_ = x[opAuctionAbortRequest-81]
_ = x[opAuctionSellRequest-82]
_ = x[opAuctionGetFinishedAuctions-83]
_ = x[opAuctionGetFinishedAuctionsCount-84]
_ = x[opAuctionFetchAuction-85]
_ = x[opAuctionGetMyOpenOffers-86]
_ = x[opAuctionGetMyOpenRequests-87]
_ = x[opAuctionGetMyOpenAuctions-88]
_ = x[opAuctionGetItemAverageStats-89]
_ = x[opAuctionGetItemAverageValue-90]
_ = x[opContainerOpen-91]
_ = x[opContainerClose-92]
_ = x[opContainerManageSubContainer-93]
_ = x[opRespawn-94]
_ = x[opSuicide-95]
_ = x[opJoinGuild-96]
_ = x[opLeaveGuild-97]
_ = x[opCreateGuild-98]
_ = x[opInviteToGuild-99]
_ = x[opDeclineGuildInvitation-100]
_ = x[opKickFromGuild-101]
_ = x[opDuellingChallengePlayer-102]
_ = x[opDuellingAcceptChallenge-103]
_ = x[opDuellingDenyChallenge-104]
_ = x[opChangeClusterTax-105]
_ = x[opClaimTerritory-106]
_ = x[opGiveUpTerritory-107]
_ = x[opChangeTerritoryAccessRights-108]
_ = x[opGetMonolithInfo-109]
_ = x[opGetClaimInfo-110]
_ = x[opGetAttackInfo-111]
_ = x[opGetTerritorySeasonPoints-112]
_ = x[opGetAttackSchedule-113]
_ = x[opScheduleAttack-114]
_ = x[opGetMatches-115]
_ = x[opGetMatchDetails-116]
_ = x[opJoinMatch-117]
_ = x[opLeaveMatch-118]
_ = x[opChangeChatSettings-119]
_ = x[opLogoutStart-120]
_ = x[opLogoutCancel-121]
_ = x[opClaimOrbStart-122]
_ = x[opClaimOrbCancel-123]
_ = x[opMatchLootChestOpeningStart-124]
_ = x[opMatchLootChestOpeningCancel-125]
_ = x[opDepositToGuildAccount-126]
_ = x[opWithdrawalFromAccount-127]
_ = x[opChangeGuildPayUpkeepFlag-128]
_ = x[opChangeGuildTax-129]
_ = x[opGetMyTerritories-130]
_ = x[opMorganaCommand-131]
_ = x[opGetServerInfo-132]
_ = x[opInviteMercenaryToMatch-133]
_ = x[opSubscribeToCluster-134]
_ = x[opAnswerMercenaryInvitation-135]
_ = x[opGetCharacterEquipment-136]
_ = x[opGetCharacterSteamAchievements-137]
_ = x[opGetCharacterStats-138]
_ = x[opGetKillHistoryDetails-139]
_ = x[opLearnMasteryLevel-140]
_ = x[opReSpecAchievement-141]
_ = x[opChangeAvatar-142]
_ = x[opGetRankings-143]
_ = x[opGetRank-144]
_ = x[opGetGvgSeasonRankings-145]
_ = x[opGetGvgSeasonRank-146]
_ = x[opGetGvgSeasonHistoryRankings-147]
_ = x[opGetGvgSeasonGuildMemberHistory-148]
_ = x[opKickFromGvGMatch-149]
_ = x[opGetChestLogs-150]
_ = x[opGetAccessRightLogs-151]
_ = x[opGetGuildAccountLogs-152]
_ = x[opGetGuildAccountLogsLargeAmount-153]
_ = x[opInviteToPlayerTrade-154]
_ = x[opPlayerTradeCancel-155]
_ = x[opPlayerTradeInvitationAccept-156]
_ = x[opPlayerTradeAddItem-157]
_ = x[opPlayerTradeRemoveItem-158]
_ = x[opPlayerTradeAcceptTrade-159]
_ = x[opPlayerTradeSetSilverOrGold-160]
_ = x[opSendMiniMapPing-161]
_ = x[opStuck-162]
_ = x[opBuyRealEstate-163]
_ = x[opClaimRealEstate-164]
_ = x[opGiveUpRealEstate-165]
_ = x[opChangeRealEstateOutline-166]
_ = x[opGetMailInfos-167]
_ = x[opGetMailCount-168]
_ = x[opReadMail-169]
_ = x[opSendNewMail-170]
_ = x[opDeleteMail-171]
_ = x[opMarkMailUnread-172]
_ = x[opClaimAttachmentFromMail-173]
_ = x[opUpdateLfgInfo-174]
_ = x[opGetLfgInfos-175]
_ = x[opGetMyGuildLfgInfo-176]
_ = x[opGetLfgDescriptionText-177]
_ = x[opLfgApplyToGuild-178]
_ = x[opAnswerLfgGuildApplication-179]
_ = x[opRegisterChatPeer-180]
_ = x[opSendChatMessage-181]
_ = x[opJoinChatChannel-182]
_ = x[opLeaveChatChannel-183]
_ = x[opSendWhisperMessage-184]
_ = x[opSay-185]
_ = x[opPlayEmote-186]
_ = x[opStopEmote-187]
_ = x[opGetClusterMapInfo-188]
_ = x[opAccessRightsChangeSettings-189]
_ = x[opMount-190]
_ = x[opMountCancel-191]
_ = x[opBuyJourney-192]
_ = x[opSetSaleStatusForEstate-193]
_ = x[opResolveGuildOrPlayerName-194]
_ = x[opGetRespawnInfos-195]
_ = x[opMakeHome-196]
_ = x[opLeaveHome-197]
_ = x[opResurrectionReply-198]
_ = x[opAllianceCreate-199]
_ = x[opAllianceDisband-200]
_ = x[opAllianceGetMemberInfos-201]
_ = x[opAllianceInvite-202]
_ = x[opAllianceAnswerInvitation-203]
_ = x[opAllianceCancelInvitation-204]
_ = x[opAllianceKickGuild-205]
_ = x[opAllianceLeave-206]
_ = x[opAllianceChangeGoldPaymentFlag-207]
_ = x[opAllianceGetDetailInfo-208]
_ = x[opGetIslandInfos-209]
_ = x[opAbandonMyIsland-210]
_ = x[opBuyMyIsland-211]
_ = x[opBuyGuildIsland-212]
_ = x[opAbandonGuildIsland-213]
_ = x[opUpgradeMyIsland-214]
_ = x[opUpgradeGuildIsland-215]
_ = x[opMoveMyIsland-216]
_ = x[opMoveGuildIsland-217]
_ = x[opTerritoryFillNutrition-218]
_ = x[opTeleportBack-219]
_ = x[opPartyInvitePlayer-220]
_ = x[opPartyAnswerInvitation-221]
_ = x[opPartyLeave-222]
_ = x[opPartyKickPlayer-223]
_ = x[opPartyMakeLeader-224]
_ = x[opPartyChangeLootSetting-225]
_ = x[opPartyMarkObject-226]
_ = x[opPartySetRole-227]
_ = x[opGetGuildMOTD-228]
_ = x[opSetGuildMOTD-229]
_ = x[opExitEnterStart-230]
_ = x[opExitEnterCancel-231]
_ = x[opQuestGiverRequest-232]
_ = x[opUnknown233-233]
_ = x[opGoldMarketGetBuyOffer-234]
_ = x[opGoldMarketGetBuyOfferFromSilver-235]
_ = x[opGoldMarketGetSellOffer-236]
_ = x[opGoldMarketGetSellOfferFromSilver-237]
_ = x[opGoldMarketBuyGold-238]
_ = x[opGoldMarketSellGold-239]
_ = x[opGoldMarketCreateSellOrder-240]
_ = x[opGoldMarketCreateBuyOrder-241]
_ = x[opGoldMarketGetInfos-242]
_ = x[opGoldMarketCancelOrder-243]
_ = x[opUnknown244-244]
_ = x[opUnknown245-245]
_ = x[opGoldMarketGetAverageInfo-246]
_ = x[opSiegeCampClaimStart-247]
_ = x[opSiegeCampClaimCancel-248]
_ = x[opTreasureChestUsingStart-249]
_ = x[opTreasureChestUsingCancel-250]
_ = x[opUseLootChest-251]
_ = x[opUseShrine-252]
_ = x[opLaborerStartJob-253]
_ = x[opLaborerTakeJobLoot-254]
_ = x[opLaborerDismiss-255]
_ = x[opLaborerMove-256]
_ = x[opLaborerBuyItem-257]
_ = x[opLaborerUpgrade-258]
_ = x[opBuyPremium-259]
_ = x[opBuyTrial-260]
_ = x[opRealEstateGetAuctionData-261]
_ = x[opRealEstateBidOnAuction-262]
_ = x[opGetSiegeCampCooldown-263]
_ = x[opFriendInvite-264]
_ = x[opFriendAnswerInvitation-265]
_ = x[opFriendCancelnvitation-266]
_ = x[opFriendRemove-267]
_ = x[opInventoryStack-268]
_ = x[opInventorySort-269]
_ = x[opEquipmentItemChangeSpell-270]
_ = x[opExpeditionRegister-271]
_ = x[opExpeditionRegisterCancel-272]
_ = x[opJoinExpedition-273]
_ = x[opDeclineExpeditionInvitation-274]
_ = x[opVoteStart-275]
_ = x[opVoteDoVote-276]
_ = x[opRatingDoRate-277]
_ = x[opEnteringExpeditionStart-278]
_ = x[opEnteringExpeditionCancel-279]
_ = x[opActivateExpeditionCheckPoint-280]
_ = x[opArenaRegister-281]
_ = x[opArenaRegisterCancel-282]
_ = x[opArenaLeave-283]
_ = x[opJoinArenaMatch-284]
_ = x[opDeclineArenaInvitation-285]
_ = x[opEnteringArenaStart-286]
_ = x[opEnteringArenaCancel-287]
_ = x[opArenaCustomMatch-288]
_ = x[opArenaCustomMatchCreate-289]
_ = x[opUpdateCharacterStatement-290]
_ = x[opBoostFarmable-291]
_ = x[opGetStrikeHistory-292]
_ = x[opUseFunction-293]
_ = x[opUsePortalEntrance-294]
_ = x[opResetPortalBinding-295]
_ = x[opQueryPortalBinding-296]
_ = x[opClaimPaymentTransaction-297]
_ = x[opChangeUseFlag-298]
_ = x[opClientPerformanceStats-299]
_ = x[opExtendedHardwareStats-300]
_ = x[opClientLowMemoryWarning-301]
_ = x[opTerritoryClaimStart-302]
_ = x[opTerritoryClaimCancel-303]
_ = x[opRequestAppStoreProducts-304]
_ = x[opVerifyProductPurchase-305]
_ = x[opQueryGuildPlayerStats-306]
_ = x[opQueryAllianceGuildStats-307]
_ = x[opTrackAchievements-308]
_ = x[opSetAchievementsAutoLearn-309]
_ = x[opDepositItemToGuildCurrency-310]
_ = x[opWithdrawalItemFromGuildCurrency-311]
_ = x[opAuctionSellSpecificItemRequest-312]
_ = x[opFishingStart-313]
_ = x[opFishingCasting-314]
_ = x[opFishingCast-315]
_ = x[opFishingCatch-316]
_ = x[opFishingPull-317]
_ = x[opFishingGiveLine-318]
_ = x[opFishingFinish-319]
_ = x[opFishingCancel-320]
_ = x[opCreateGuildAccessTag-321]
_ = x[opDeleteGuildAccessTag-322]
_ = x[opRenameGuildAccessTag-323]
_ = x[opFlagGuildAccessTagGuildPermission-324]
_ = x[opAssignGuildAccessTag-325]
_ = x[opRemoveGuildAccessTagFromPlayer-326]
_ = x[opModifyGuildAccessTagEditors-327]
_ = x[opRequestPublicAccessTags-328]
_ = x[opChangeAccessTagPublicFlag-329]
_ = x[opUpdateGuildAccessTag-330]
_ = x[opSteamStartMicrotransaction-331]
_ = x[opSteamFinishMicrotransaction-332]
_ = x[opSteamIdHasActiveAccount-333]
_ = x[opCheckEmailAccountState-334]
_ = x[opLinkAccountToSteamId-335]
_ = x[opBuyGvgSeasonBooster-336]
_ = x[opChangeFlaggingPrepare-337]
_ = x[opOverCharge-338]
_ = x[opOverChargeEnd-339]
_ = x[opRequestTrusted-340]
_ = x[opChangeGuildLogo-341]
_ = x[opPartyFinderRegisterForUpdates-342]
_ = x[opPartyFinderUnregisterForUpdates-343]
_ = x[opPartyFinderEnlistNewPartySearch-344]
_ = x[opPartyFinderDeletePartySearch-345]
_ = x[opPartyFinderChangePartySearch-346]
_ = x[opPartyFinderChangeRole-347]
_ = x[opPartyFinderApplyForGroup-348]
_ = x[opPartyFinderAcceptOrDeclineApplyForGroup-349]
_ = x[opPartyFinderGetEquipmentSnapshot-350]
_ = x[opPartyFinderRegisterApplicants-351]
_ = x[opPartyFinderUnregisterApplicants-352]
_ = x[opPartyFinderFulltextSearch-353]
_ = x[opPartyFinderRequestEquipmentSnapshot-354]
_ = x[opGetPersonalSeasonTrackerData-355]
_ = x[opUseConsumableFromInventory-356]
_ = x[opClaimPersonalSeasonReward-357]
_ = x[opEasyAntiCheatMessageToServer-358]
_ = x[opSetNextTutorialState-359]
_ = x[opAddPlayerToMuteList-360]
_ = x[opRemovePlayerFromMuteList-361]
_ = x[opProductShopUserEvent-362]
_ = x[opGetVanityUnlocks-363]
_ = x[opBuyVanityUnlocks-364]
_ = x[opGetMountSkins-365]
_ = x[opSetMountSkin-366]
_ = x[opSetWardrobe-367]
_ = x[opChangeCustomization-368]
_ = x[opSetFavoriteIsland-369]
_ = x[opGetGuildChallengePoints-370]
_ = x[opTravelToHideout-371]
_ = x[opSmartQueueJoin-372]
_ = x[opSmartQueueLeave-373]
_ = x[opSmartQueueSelectSpawnCluster-374]
_ = x[opUpgradeHideout-375]
_ = x[opInitHideoutAttackStart-376]
_ = x[opInitHideoutAttackCancel-377]
_ = x[opHideoutFillNutrition-378]
_ = x[opHideoutGetInfo-379]
_ = x[opHideoutGetOwnerInfo-380]
_ = x[opHideoutSetTribute-381]
_ = x[opOpenWorldAttackScheduleStart-382]
_ = x[opOpenWorldAttackScheduleCancel-383]
_ = x[opOpenWorldAttackConquerStart-384]
_ = x[opOpenWorldAttackConquerCancel-385]
_ = x[opGetOpenWorldAttackDetails-386]
_ = x[opGetNextOpenWorldAttackScheduleTime-387]
_ = x[opRecoverVaultFromHideout-388]
_ = x[opGetGuildEnergyDrainInfo-389]
_ = x[opChannelingUpdate-390]
}
const _OperationType_name = "opUnusedopPingopJoinopCreateAccountopLoginopSendCrashLogopSendTraceRouteopSendVfxStatsopSendGamePingInfoopCreateCharacteropDeleteCharacteropSelectCharacteropGetGameServerByClusteropGetActiveSubscriptionopGetShopPurchaseUrlopGetBuyTrialDetailsopGetReferralSeasonDetailsopGetReferralLinkopGetAvailableTrialKeysopGetShopTilesForCategoryopMoveopCastStartopCastCancelopTerminateToggleSpellopChannelingCancelopAttackBuildingStartopInventoryDestroyItemopInventoryMoveItemopInventoryRecoverItemopInventoryRecoverAllItemsopInventorySplitStackopInventorySplitStackIntoopGetClusterDataopChangeClusteropConsoleCommandopChatMessageopReportClientErroropRegisterToObjectopUnRegisterFromObjectopCraftBuildingChangeSettingsopCraftBuildingTakeMoneyopRepairBuildingChangeSettingsopRepairBuildingTakeMoneyopActionBuildingChangeSettingsopHarvestStartopHarvestCancelopTakeSilveropActionOnBuildingStartopActionOnBuildingCancelopItemRerollQualityStartopItemRerollQualityCancelopInstallResourceStartopInstallResourceCancelopInstallSilveropBuildingFillNutritionopBuildingChangeRenovationStateopBuildingBuySkinopBuildingClaimopBuildingGiveupopBuildingNutritionSilverStorageDepositopBuildingNutritionSilverStorageWithdrawopBuildingNutritionSilverRewardSetopConstructionSiteCreateopPlaceableObjectPlaceopPlaceableObjectPlaceCancelopPlaceableObjectPickupopFurnitureObjectUseopFarmableHarvestopFarmableFinishGrownItemopFarmableDestroyopFarmableGetProductopTearDownConstructionSiteopCastleGateUseopAuctionCreateRequestopAuctionCreateOfferopAuctionGetOffersopAuctionGetRequestsopAuctionBuyOfferopAuctionAbortAuctionopAuctionModifyAuctionopAuctionAbortOfferopAuctionAbortRequestopAuctionSellRequestopAuctionGetFinishedAuctionsopAuctionGetFinishedAuctionsCountopAuctionFetchAuctionopAuctionGetMyOpenOffersopAuctionGetMyOpenRequestsopAuctionGetMyOpenAuctionsopAuctionGetItemAverageStatsopAuctionGetItemAverageValueopContainerOpenopContainerCloseopContainerManageSubContaineropRespawnopSuicideopJoinGuildopLeaveGuildopCreateGuildopInviteToGuildopDeclineGuildInvitationopKickFromGuildopDuellingChallengePlayeropDuellingAcceptChallengeopDuellingDenyChallengeopChangeClusterTaxopClaimTerritoryopGiveUpTerritoryopChangeTerritoryAccessRightsopGetMonolithInfoopGetClaimInfoopGetAttackInfoopGetTerritorySeasonPointsopGetAttackScheduleopScheduleAttackopGetMatchesopGetMatchDetailsopJoinMatchopLeaveMatchopChangeChatSettingsopLogoutStartopLogoutCancelopClaimOrbStartopClaimOrbCancelopMatchLootChestOpeningStartopMatchLootChestOpeningCancelopDepositToGuildAccountopWithdrawalFromAccountopChangeGuildPayUpkeepFlagopChangeGuildTaxopGetMyTerritoriesopMorganaCommandopGetServerInfoopInviteMercenaryToMatchopSubscribeToClusteropAnswerMercenaryInvitationopGetCharacterEquipmentopGetCharacterSteamAchievementsopGetCharacterStatsopGetKillHistoryDetailsopLearnMasteryLevelopReSpecAchievementopChangeAvataropGetRankingsopGetRankopGetGvgSeasonRankingsopGetGvgSeasonRankopGetGvgSeasonHistoryRankingsopGetGvgSeasonGuildMemberHistoryopKickFromGvGMatchopGetChestLogsopGetAccessRightLogsopGetGuildAccountLogsopGetGuildAccountLogsLargeAmountopInviteToPlayerTradeopPlayerTradeCancelopPlayerTradeInvitationAcceptopPlayerTradeAddItemopPlayerTradeRemoveItemopPlayerTradeAcceptTradeopPlayerTradeSetSilverOrGoldopSendMiniMapPingopStuckopBuyRealEstateopClaimRealEstateopGiveUpRealEstateopChangeRealEstateOutlineopGetMailInfosopGetMailCountopReadMailopSendNewMailopDeleteMailopMarkMailUnreadopClaimAttachmentFromMailopUpdateLfgInfoopGetLfgInfosopGetMyGuildLfgInfoopGetLfgDescriptionTextopLfgApplyToGuildopAnswerLfgGuildApplicationopRegisterChatPeeropSendChatMessageopJoinChatChannelopLeaveChatChannelopSendWhisperMessageopSayopPlayEmoteopStopEmoteopGetClusterMapInfoopAccessRightsChangeSettingsopMountopMountCancelopBuyJourneyopSetSaleStatusForEstateopResolveGuildOrPlayerNameopGetRespawnInfosopMakeHomeopLeaveHomeopResurrectionReplyopAllianceCreateopAllianceDisbandopAllianceGetMemberInfosopAllianceInviteopAllianceAnswerInvitationopAllianceCancelInvitationopAllianceKickGuildopAllianceLeaveopAllianceChangeGoldPaymentFlagopAllianceGetDetailInfoopGetIslandInfosopAbandonMyIslandopBuyMyIslandopBuyGuildIslandopAbandonGuildIslandopUpgradeMyIslandopUpgradeGuildIslandopMoveMyIslandopMoveGuildIslandopTerritoryFillNutritionopTeleportBackopPartyInvitePlayeropPartyAnswerInvitationopPartyLeaveopPartyKickPlayeropPartyMakeLeaderopPartyChangeLootSettingopPartyMarkObjectopPartySetRoleopGetGuildMOTDopSetGuildMOTDopExitEnterStartopExitEnterCancelopQuestGiverRequestopUnknown233opGoldMarketGetBuyOfferopGoldMarketGetBuyOfferFromSilveropGoldMarketGetSellOfferopGoldMarketGetSellOfferFromSilveropGoldMarketBuyGoldopGoldMarketSellGoldopGoldMarketCreateSellOrderopGoldMarketCreateBuyOrderopGoldMarketGetInfosopGoldMarketCancelOrderopUnknown244opUnknown245opGoldMarketGetAverageInfoopSiegeCampClaimStartopSiegeCampClaimCancelopTreasureChestUsingStartopTreasureChestUsingCancelopUseLootChestopUseShrineopLaborerStartJobopLaborerTakeJobLootopLaborerDismissopLaborerMoveopLaborerBuyItemopLaborerUpgradeopBuyPremiumopBuyTrialopRealEstateGetAuctionDataopRealEstateBidOnAuctionopGetSiegeCampCooldownopFriendInviteopFriendAnswerInvitationopFriendCancelnvitationopFriendRemoveopInventoryStackopInventorySortopEquipmentItemChangeSpellopExpeditionRegisteropExpeditionRegisterCancelopJoinExpeditionopDeclineExpeditionInvitationopVoteStartopVoteDoVoteopRatingDoRateopEnteringExpeditionStartopEnteringExpeditionCancelopActivateExpeditionCheckPointopArenaRegisteropArenaRegisterCancelopArenaLeaveopJoinArenaMatchopDeclineArenaInvitationopEnteringArenaStartopEnteringArenaCancelopArenaCustomMatchopArenaCustomMatchCreateopUpdateCharacterStatementopBoostFarmableopGetStrikeHistoryopUseFunctionopUsePortalEntranceopResetPortalBindingopQueryPortalBindingopClaimPaymentTransactionopChangeUseFlagopClientPerformanceStatsopExtendedHardwareStatsopClientLowMemoryWarningopTerritoryClaimStartopTerritoryClaimCancelopRequestAppStoreProductsopVerifyProductPurchaseopQueryGuildPlayerStatsopQueryAllianceGuildStatsopTrackAchievementsopSetAchievementsAutoLearnopDepositItemToGuildCurrencyopWithdrawalItemFromGuildCurrencyopAuctionSellSpecificItemRequestopFishingStartopFishingCastingopFishingCastopFishingCatchopFishingPullopFishingGiveLineopFishingFinishopFishingCancelopCreateGuildAccessTagopDeleteGuildAccessTagopRenameGuildAccessTagopFlagGuildAccessTagGuildPermissionopAssignGuildAccessTagopRemoveGuildAccessTagFromPlayeropModifyGuildAccessTagEditorsopRequestPublicAccessTagsopChangeAccessTagPublicFlagopUpdateGuildAccessTagopSteamStartMicrotransactionopSteamFinishMicrotransactionopSteamIdHasActiveAccountopCheckEmailAccountStateopLinkAccountToSteamIdopBuyGvgSeasonBoosteropChangeFlaggingPrepareopOverChargeopOverChargeEndopRequestTrustedopChangeGuildLogoopPartyFinderRegisterForUpdatesopPartyFinderUnregisterForUpdatesopPartyFinderEnlistNewPartySearchopPartyFinderDeletePartySearchopPartyFinderChangePartySearchopPartyFinderChangeRoleopPartyFinderApplyForGroupopPartyFinderAcceptOrDeclineApplyForGroupopPartyFinderGetEquipmentSnapshotopPartyFinderRegisterApplicantsopPartyFinderUnregisterApplicantsopPartyFinderFulltextSearchopPartyFinderRequestEquipmentSnapshotopGetPersonalSeasonTrackerDataopUseConsumableFromInventoryopClaimPersonalSeasonRewardopEasyAntiCheatMessageToServeropSetNextTutorialStateopAddPlayerToMuteListopRemovePlayerFromMuteListopProductShopUserEventopGetVanityUnlocksopBuyVanityUnlocksopGetMountSkinsopSetMountSkinopSetWardrobeopChangeCustomizationopSetFavoriteIslandopGetGuildChallengePointsopTravelToHideoutopSmartQueueJoinopSmartQueueLeaveopSmartQueueSelectSpawnClusteropUpgradeHideoutopInitHideoutAttackStartopInitHideoutAttackCancelopHideoutFillNutritionopHideoutGetInfoopHideoutGetOwnerInfoopHideoutSetTributeopOpenWorldAttackScheduleStartopOpenWorldAttackScheduleCancelopOpenWorldAttackConquerStartopOpenWorldAttackConquerCancelopGetOpenWorldAttackDetailsopGetNextOpenWorldAttackScheduleTimeopRecoverVaultFromHideoutopGetGuildEnergyDrainInfoopChannelingUpdate"
var _OperationType_index = [...]uint16{0, 8, 14, 20, 35, 42, 56, 72, 86, 104, 121, 138, 155, 179, 202, 222, 242, 268, 285, 308, 333, 339, 350, 362, 384, 402, 423, 445, 464, 486, 512, 533, 558, 574, 589, 605, 618, 637, 655, 677, 706, 730, 760, 785, 815, 829, 844, 856, 879, 903, 927, 952, 974, 997, 1012, 1035, 1066, 1083, 1098, 1114, 1153, 1193, 1227, 1251, 1273, 1301, 1324, 1344, 1361, 1386, 1403, 1423, 1449, 1464, 1486, 1506, 1524, 1544, 1561, 1582, 1604, 1623, 1644, 1664, 1692, 1725, 1746, 1770, 1796, 1822, 1850, 1878, 1893, 1909, 1938, 1947, 1956, 1967, 1979, 1992, 2007, 2031, 2046, 2071, 2096, 2119, 2137, 2153, 2170, 2199, 2216, 2230, 2245, 2271, 2290, 2306, 2318, 2335, 2346, 2358, 2378, 2391, 2405, 2420, 2436, 2464, 2493, 2516, 2539, 2565, 2581, 2599, 2615, 2630, 2654, 2674, 2701, 2724, 2755, 2774, 2797, 2816, 2835, 2849, 2862, 2871, 2893, 2911, 2940, 2972, 2990, 3004, 3024, 3045, 3077, 3098, 3117, 3146, 3166, 3189, 3213, 3241, 3258, 3265, 3280, 3297, 3315, 3340, 3354, 3368, 3378, 3391, 3403, 3419, 3444, 3459, 3472, 3491, 3514, 3531, 3558, 3576, 3593, 3610, 3628, 3648, 3653, 3664, 3675, 3694, 3722, 3729, 3742, 3754, 3778, 3804, 3821, 3831, 3842, 3861, 3877, 3894, 3918, 3934, 3960, 3986, 4005, 4020, 4051, 4074, 4090, 4107, 4120, 4136, 4156, 4173, 4193, 4207, 4224, 4248, 4262, 4281, 4304, 4316, 4333, 4350, 4374, 4391, 4405, 4419, 4433, 4449, 4466, 4485, 4497, 4520, 4553, 4577, 4611, 4630, 4650, 4677, 4703, 4723, 4746, 4758, 4770, 4796, 4817, 4839, 4864, 4890, 4904, 4915, 4932, 4952, 4968, 4981, 4997, 5013, 5025, 5035, 5061, 5085, 5107, 5121, 5145, 5168, 5182, 5198, 5213, 5239, 5259, 5285, 5301, 5330, 5341, 5353, 5367, 5392, 5418, 5448, 5463, 5484, 5496, 5512, 5536, 5556, 5577, 5595, 5619, 5645, 5660, 5678, 5691, 5710, 5730, 5750, 5775, 5790, 5814, 5837, 5861, 5882, 5904, 5929, 5952, 5975, 6000, 6019, 6045, 6073, 6106, 6138, 6152, 6168, 6181, 6195, 6208, 6225, 6240, 6255, 6277, 6299, 6321, 6356, 6378, 6410, 6439, 6464, 6491, 6513, 6541, 6570, 6595, 6619, 6641, 6662, 6685, 6697, 6712, 6728, 6745, 6776, 6809, 6842, 6872, 6902, 6925, 6951, 6992, 7025, 7056, 7089, 7116, 7153, 7183, 7211, 7238, 7268, 7290, 7311, 7337, 7359, 7377, 7395, 7410, 7424, 7437, 7458, 7477, 7502, 7519, 7535, 7552, 7582, 7598, 7622, 7647, 7669, 7685, 7706, 7725, 7755, 7786, 7815, 7845, 7872, 7908, 7933, 7958, 7976}
func (i OperationType) String() string {
if i >= OperationType(len(_OperationType_index)-1) {
return "OperationType(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _OperationType_name[_OperationType_index[i]:_OperationType_index[i+1]]
}
================================================
FILE: client/router.go
================================================
package client
import (
"encoding/gob"
"os"
"github.com/broderickhyman/albiondata-client/log"
photon "github.com/broderickhyman/photon_spectator"
)
//Router struct definitions
type Router struct {
albionstate *albionState
newOperation chan operation
recordPhotonCommand chan photon.PhotonCommand
quit chan bool
}
func newRouter() *Router {
return &Router{
albionstate: &albionState{LocationId: -1},
newOperation: make(chan operation, 1000),
recordPhotonCommand: make(chan photon.PhotonCommand, 1000),
quit: make(chan bool, 1),
}
}
func (r *Router) run() {
var encoder *gob.Encoder
var file *os.File
if ConfigGlobal.RecordPath != "" {
file, err := os.Create(ConfigGlobal.RecordPath)
if err != nil {
log.Error("Could not open commands output file ", err)
} else {
encoder = gob.NewEncoder(file)
}
}
for {
select {
case <-r.quit:
log.Debug("Closing router...")
if file != nil {
err := file.Close()
if err != nil {
log.Error("Could not close commands output file ", err)
}
}
return
case op := <-r.newOperation:
go op.Process(r.albionstate)
case command := <-r.recordPhotonCommand:
if encoder != nil {
err := encoder.Encode(command)
if err != nil {
log.Error("Could not encode command ", err)
}
}
}
}
}
================================================
FILE: client/uploader.go
================================================
package client
type uploader interface {
sendToIngest(body []byte, topic string)
}
================================================
FILE: client/uploader_http.go
================================================
package client
import (
"bytes"
"io"
"io/ioutil"
"net/http"
"github.com/broderickhyman/albiondata-client/log"
)
type httpUploader struct {
baseURL string
transport *http.Transport
}
// newHTTPUploader creates a new HTTP uploader
func newHTTPUploader(url string) uploader {
return &httpUploader{
baseURL: url,
transport: &http.Transport{},
}
}
func (u *httpUploader) sendToIngest(body []byte, topic string) {
client := &http.Client{Transport: u.transport}
fullURL := u.baseURL + "/" + topic
req, err := http.NewRequest("POST", fullURL, bytes.NewBuffer([]byte(body)))
if err != nil {
log.Errorf("Error while create new request: %v", err)
return
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Errorf("Error while sending ingest with data: %v", err)
return
}
if resp.StatusCode != 200 {
log.Errorf("Got bad response code: %v", resp.StatusCode)
return
}
// See: https://stackoverflow.com/questions/17948827/reusing-http-connections-in-golang
io.Copy(ioutil.Discard, resp.Body)
log.Infof("Successfully sent ingest request to %v", u.baseURL)
defer resp.Body.Close()
}
================================================
FILE: client/uploader_http_pow.go
================================================
package client
import (
"bytes"
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
"net/http"
"net/url"
"runtime"
"strings"
"github.com/broderickhyman/albiondata-client/log"
)
type httpUploaderPow struct {
baseURL string
transport *http.Transport
}
type Pow struct {
Key string `json:"key"`
Wanted string `json:"wanted"`
}
// newHTTPUploaderPow creates a new HTTP uploader
func newHTTPUploaderPow(url string) uploader {
if !ConfigGlobal.NoCPULimit {
// Limit to 25% of available cpu cores
procs := runtime.NumCPU() / 4
if procs < 1 {
procs = 1
}
runtime.GOMAXPROCS(procs)
}
return &httpUploaderPow{
baseURL: strings.Replace(url, "http+pow", "http", -1),
transport: &http.Transport{},
}
}
func (u *httpUploaderPow) getPow(target interface{}) {
log.Debugf("GETTING POW")
fullURL := u.baseURL + "/pow"
resp, err := http.Get(fullURL)
if err != nil {
log.Errorf("Error in Pow Get request: %v", err)
return
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
log.Errorf("Got bad response code: %v", resp.StatusCode)
return
}
json.NewDecoder(resp.Body).Decode(target)
if err != nil {
log.Errorf("Error in parsing Pow Get request: %v", err)
return
}
}
// Prooves to the server that a pow was solved by submitting
// the pow's key, the solution and a nats msg as a POST request
// the topic becomes part of the URL
func (u *httpUploaderPow) uploadWithPow(pow Pow, solution string, natsmsg []byte, topic string) {
fullURL := u.baseURL + "/pow/" + topic
resp, err := http.PostForm(fullURL, url.Values{
"key": {pow.Key},
"solution": {solution},
"natsmsg": {string(natsmsg)},
})
defer resp.Body.Close()
if err != nil {
log.Errorf("Error while prooving pow: %v", err)
return
}
if resp.StatusCode != 200 {
log.Errorf("HTTP Error while prooving pow. returned: %v", resp.StatusCode)
return
}
log.Infof("Successfully sent ingest request to %v", u.baseURL)
}
// Generates a random hex string e.g.: faa2743d9181dca5
func randomHex(n int) (string, error) {
bytes := make([]byte, n)
if _, err := rand.Read(bytes); err != nil {
return "", err
}
return hex.EncodeToString(bytes), nil
}
// Converts a string to bits e.g.: 0110011...
func toBinaryBytes(s string) string {
var buffer bytes.Buffer
for i := 0; i < len(s); i++ {
fmt.Fprintf(&buffer, "%08b", s[i])
}
return fmt.Sprintf("%s", buffer.Bytes())
}
// Solves a pow looping through possible solutions
// until a correct one is found
// returns the solution
func solvePow(pow Pow) string {
solution := ""
for {
randhex, _ := randomHex(8)
if strings.HasPrefix(toBinaryBytes(fmt.Sprintf("%x", sha256.Sum256([]byte("aod^"+randhex+"^"+pow.Key)))), pow.Wanted) {
log.Debugf("SOLVED!")
solution = randhex
break
}
}
return solution
}
func (u *httpUploaderPow) sendToIngest(body []byte, topic string) {
pow := Pow{}
u.getPow(&pow)
solution := solvePow(pow)
u.uploadWithPow(pow, solution, body, topic)
}
================================================
FILE: client/uploader_nats.go
================================================
package client
import (
"github.com/broderickhyman/albiondata-client/log"
nats "github.com/nats-io/go-nats"
)
type natsUploader struct {
isPrivate bool
url string
nc *nats.Conn
}
// newNATSUploader creates a new NATS uploader
func newNATSUploader(url string) uploader {
nc, _ := nats.Connect(url)
return &natsUploader{
url: url,
nc: nc,
}
}
func (u *natsUploader) sendToIngest(body []byte, topic string) {
if err := u.nc.Publish(topic, body); err != nil {
log.Errorf("Error while sending ingest to nats with data: %v", err)
}
}
================================================
FILE: client/ws_client.go
================================================
// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package client
import (
"log"
"net/http"
"strings"
"time"
"github.com/gorilla/websocket"
)
const (
// Time allowed to write a message to the peer.
writeWait = 10 * time.Second
// Time allowed to read the next pong message from the peer.
pongWait = 60 * time.Second
// Send pings to peer with this period. Must be less than pongWait.
pingPeriod = (pongWait * 9) / 10
// Maximum message size allowed from peer.
maxMessageSize = 512
)
var (
newline = []byte{'\n'}
space = []byte{' '}
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
var originHost string
var originHostname string
originHost = r.Header.Get("Origin")
if originHost != "null" {
originHostname = (strings.Split((strings.Split(originHost, "//")[1]), ":")[0])
for _, v := range ConfigGlobal.AllowedWSHosts {
if v == originHostname {
return true
}
}
}
return false
},
}
// WSClient is a middleman between the websocket connection and the hub.
type WSClient struct {
hub *WSHub
// The websocket connection.
conn *websocket.Conn
// Buffered channel of outbound messages.
send chan []byte
}
// readPump pumps messages from the websocket connection to the hub.
//
// The application runs readPump in a per-connection goroutine. The application
// ensures that there is at most one reader on a connection by executing all
// reads from this goroutine.
func (c *WSClient) readPump() {
defer func() {
c.hub.unregister <- c
c.conn.Close()
}()
c.conn.SetReadLimit(maxMessageSize)
c.conn.SetReadDeadline(time.Now().Add(pongWait))
c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil })
for {
_, _, err := c.conn.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
log.Printf("error: %v", err)
}
break
}
}
}
// writePump pumps messages from the hub to the websocket connection.
//
// A goroutine running writePump is started for each connection. The
// application ensures that there is at most one writer to a connection by
// executing all writes from this goroutine.
func (c *WSClient) writePump() {
ticker := time.NewTicker(pingPeriod)
defer func() {
ticker.Stop()
c.conn.Close()
}()
for {
select {
case message, ok := <-c.send:
c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if !ok {
// The hub closed the channel.
c.conn.WriteMessage(websocket.CloseMessage, []byte{})
return
}
w, err := c.conn.NextWriter(websocket.TextMessage)
if err != nil {
return
}
w.Write(message)
// Add queued chat messages to the current websocket message.
n := len(c.send)
for i := 0; i < n; i++ {
w.Write(newline)
w.Write(<-c.send)
}
if err := w.Close(); err != nil {
return
}
case <-ticker.C:
c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if err := c.conn.WriteMessage(websocket.PingMessage, []byte{}); err != nil {
return
}
}
}
}
// serveWs handles websocket requests from the peer.
func serveWs(hub *WSHub, w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
client := &WSClient{hub: hub, conn: conn, send: make(chan []byte, 256)}
client.hub.register <- client
// Allow collection of memory referenced by the caller by doing all work in
// new goroutines.
go client.writePump()
go client.readPump()
}
================================================
FILE: client/ws_hub.go
================================================
// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package client
// WSHub maintains the set of active clients and broadcasts messages to the
// clients.
type WSHub struct {
// Registered clients.
clients map[*WSClient]bool
// Inbound messages from the clients.
broadcast chan []byte
// Register requests from the clients.
register chan *WSClient
// Unregister requests from clients.
unregister chan *WSClient
}
func newHub() *WSHub {
return &WSHub{
broadcast: make(chan []byte),
register: make(chan *WSClient),
unregister: make(chan *WSClient),
clients: make(map[*WSClient]bool),
}
}
func (h *WSHub) run() {
for {
select {
case client := <-h.register:
h.clients[client] = true
case client := <-h.unregister:
if _, ok := h.clients[client]; ok {
delete(h.clients, client)
close(client.send)
}
case message := <-h.broadcast:
for client := range h.clients {
select {
case client.send <- message:
default:
close(client.send)
delete(h.clients, client)
}
}
}
}
}
================================================
FILE: config.yaml.example
================================================
EnableWebsockets: False
AllowedWebsocketHosts:
- www.example.com
================================================
FILE: go.mod
================================================
module github.com/broderickhyman/albiondata-client
go 1.16
require (
github.com/broderickhyman/go-githubupdate v0.0.0-20210616044731-0a6ee555c7dd
github.com/broderickhyman/photon_spectator v0.0.0-20201019232055-713aea094aa8
github.com/ctcpip/notifize v1.0.0
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/getlantern/golog v0.0.0-20201022140317-a8d13dc71777 // indirect
github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6 // indirect
github.com/getlantern/systray v0.0.0-20190130014807-0daad7b8e5bd
github.com/gonutz/w32 v1.0.0
github.com/google/gopacket v1.1.17-0.20190408073642-1a2aa715ae41
github.com/gorilla/websocket v1.4.2
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/magiconair/properties v1.8.4 // indirect
github.com/mattn/go-colorable v0.1.8
github.com/mitchellh/mapstructure v1.1.2
github.com/nats-io/gnatsd v1.4.1 // indirect
github.com/nats-io/go-nats v1.7.2
github.com/nats-io/nkeys v0.2.0 // indirect
github.com/nats-io/nuid v1.0.1 // indirect
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect
github.com/pelletier/go-toml v1.8.1 // indirect
github.com/sirupsen/logrus v1.7.0
github.com/spf13/afero v1.4.1 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.7.1
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 // indirect
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1
golang.org/x/text v0.3.4 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2
gopkg.in/yaml.v2 v2.3.0 // indirect
)
================================================
FILE: go.sum
================================================
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.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/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
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 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/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/broderickhyman/go-githubupdate v0.0.0-20210616044731-0a6ee555c7dd h1:524TgVkQ/45BwVq5TBEK93rXL8iYOTByCm3Q0Z7Nz/Q=
github.com/broderickhyman/go-githubupdate v0.0.0-20210616044731-0a6ee555c7dd/go.mod h1:1lB7TDteSwAagH6ymKeBmY3+GCv6XWdqG+WsGSGc/oI=
github.com/broderickhyman/photon_spectator v0.0.0-20201019232055-713aea094aa8 h1:BeS4MGsEebX9dV4Ujd2WNuhFw5hvK+31UmdwsMrZwTw=
github.com/broderickhyman/photon_spectator v0.0.0-20201019232055-713aea094aa8/go.mod h1:TAk3d2f92vDWcUt8ptoQHfGDrbfaogdolag1Ma2F7eY=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
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/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
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/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/ctcpip/notifize v1.0.0 h1:pC1fq9jaQN4/h5RV7n/Rum4hUNLzMhDl40kfR/NuGzA=
github.com/ctcpip/notifize v1.0.0/go.mod h1:s22nV/32b1qZqd69j+JTo9d8rZUKjNTBNmmvZ9nEOJ4=
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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
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/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4=
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY=
github.com/getlantern/errors v1.0.1 h1:XukU2whlh7OdpxnkXhNH9VTLVz0EVPGKDV5K0oWhvzw=
github.com/getlantern/errors v1.0.1/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A=
github.com/getlantern/golog v0.0.0-20201022140317-a8d13dc71777 h1:eOIlF+ZnlZS5bnhYLZUCLH9jS++e2JEbih1kgMLUCDc=
github.com/getlantern/golog v0.0.0-20201022140317-a8d13dc71777/go.mod h1:ZyIjgH/1wTCl+B+7yH1DqrWp6MPJqESmwmEQ89ZfhvA=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1FiH8SWKID8ultN44Z+yzd2y/Vyb0=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA=
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6 h1:QthAQCekS1YOeYWSvoHI6ZatlG4B+GBDLxV/2ZkBsTA=
github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
github.com/getlantern/systray v0.0.0-20190130014807-0daad7b8e5bd h1:2vu8p1PKAdvvFuHXvfwA1QcH11vkD/XNZZS+3tH0rL0=
github.com/getlantern/systray v0.0.0-20190130014807-0daad7b8e5bd/go.mod h1:7Splj4WBQSps8jODnMgrIV6goKL0N1HR+mhCAEVWlA0=
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-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-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
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/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.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/gonutz/w32 v1.0.0 h1:3t1z6ZfkFvirjFYBx9pHeHBuKoN/VBVk9yHb/m2Ll/k=
github.com/gonutz/w32 v1.0.0/go.mod h1:Rc/YP5K9gv0FW4p6X9qL3E7Y56lfMflEol1fLElfMW4=
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/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/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gopacket v1.1.17-0.20190408073642-1a2aa715ae41 h1:F0FG4Rw2acLIDyHd7U5Wg/PKT/R+79oIwmtAECyDeIc=
github.com/google/gopacket v1.1.17-0.20190408073642-1a2aa715ae41/go.mod h1:UCLx9mCmAwsVbn6qQl1WIEt2SO7Nd2fD0th1TBAsqBw=
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/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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
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-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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
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/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/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
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/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/binarydist v0.1.0 h1:6kAoLA9FMMnNGSehX0s1PdjbEaACznAv/W219j2uvyo=
github.com/kr/binarydist v0.1.0/go.mod h1:DY7S//GCoz1BCd0B0EVrinCKAZN3pXe+MDaIZbXQVgM=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY=
github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/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.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
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/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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nats-io/gnatsd v1.4.1 h1:RconcfDeWpKCD6QIIwiVFcvForlXpWeJP7i5/lDLy44=
github.com/nats-io/gnatsd v1.4.1/go.mod h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ=
github.com/nats-io/go-nats v1.7.2 h1:cJujlwCYR8iMz5ofZSD/p2WLW8FabhkQ2lIEVbSvNSA=
github.com/nats-io/go-nats v1.7.2/go.mod h1:+t7RHT5ApZebkrQdnn6AhQJmhJJiKAvJUio1PiiCtj0=
github.com/nats-io/nkeys v0.2.0 h1:WXKF7diOaPU9cJdLD7nuzwasQy9vT1tBqzXZZf3AMJM=
github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s=
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
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/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.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-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
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/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.4.1 h1:asw9sl74539yqavKaglDM5hFpdJVK0Y5Dr/JOgQ89nQ=
github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
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/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/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
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/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
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/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/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/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-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-20180826012351-8a410e7b638d/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-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-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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
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/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-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/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-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-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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1 h1:a/mKvvZr9Jcc8oKfcmgzyp7OwF73JPWsQLvH1z2Kxck=
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
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/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
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/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-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-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-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=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/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.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/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-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.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/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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa h1:drvf2JoUL1fz3ttkGNkw+rf3kZa2//7XkYGpSO4NHNA=
gopkg.in/inconshreveable/go-update.v0 v0.0.0-20150814200126-d8b0b1d421aa/go.mod h1:tuNm0ntQ7IH9VSA39XxzLMpee5c2DwgIbjD4x3ydo8Y=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2 h1:MZF6J7CV6s/h0HBkfqebrYfKCVEo5iN+wzE4QhV3Evo=
gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2/go.mod h1:s1Sn2yZos05Qfs7NKt867Xe18emOmtsO3eAKbDaon0o=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
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.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/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-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=
================================================
FILE: icon/iconwin.go
================================================
//+build windows
// File generated by 2goarray v0.1.0 (http://github.com/cratonica/2goarray)
package icon
var Data []byte = []byte{
0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00,
0x20, 0x00, 0x68, 0x04, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x20, 0x20,
0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xa8, 0x10, 0x00, 0x00, 0xce, 0x04,
0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xa8, 0x25,
0x00, 0x00, 0x76, 0x15, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x01, 0x00,
0x20, 0x00, 0x28, 0x42, 0x00, 0x00, 0x1e, 0x3b, 0x00, 0x00, 0x80, 0x80,
0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x28, 0x08, 0x01, 0x00, 0x46, 0x7d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x47, 0xd2,
0x00, 0x00, 0x6e, 0x85, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00,
0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x13, 0x0b,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x52,
0x50, 0xff, 0x6f, 0x65, 0x5e, 0xff, 0x4b, 0x4c, 0x4a, 0xff, 0x55, 0x54,
0x51, 0xff, 0x6a, 0x61, 0x5a, 0xff, 0x3f, 0x41, 0x3f, 0xff, 0x50, 0x4c,
0x48, 0xff, 0x56, 0x4e, 0x48, 0xff, 0x38, 0x3a, 0x39, 0xff, 0x94, 0x93,
0x91, 0xff, 0xc7, 0xc6, 0xc5, 0xff, 0xc6, 0xc7, 0xc7, 0xff, 0xbf, 0xbd,
0xbb, 0xff, 0x84, 0x83, 0x81, 0xff, 0x4d, 0x4e, 0x4d, 0xff, 0x66, 0x60,
0x5b, 0xff, 0x7f, 0x71, 0x67, 0xff, 0x9a, 0x83, 0x75, 0xff, 0x76, 0x69,
0x5f, 0xff, 0x82, 0x73, 0x69, 0xff, 0x94, 0x7f, 0x71, 0xff, 0x6b, 0x5e,
0x55, 0xff, 0x7f, 0x6f, 0x65, 0xff, 0x84, 0x70, 0x63, 0xff, 0x66, 0x59,
0x51, 0xff, 0xca, 0xc5, 0xc2, 0xff, 0xfa, 0xf9, 0xf8, 0xff, 0xdc, 0xd2,
0xcc, 0xff, 0xeb, 0xe4, 0xdf, 0xff, 0xf1, 0xf0, 0xf0, 0xff, 0xa6, 0xa2,
0x9f, 0xff, 0x96, 0x86, 0x7c, 0xff, 0xaf, 0x94, 0x83, 0xff, 0xa2, 0x88,
0x79, 0xff, 0x6a, 0x61, 0x5b, 0xff, 0x6e, 0x65, 0x5f, 0xff, 0x81, 0x71,
0x67, 0xff, 0x54, 0x4f, 0x4a, 0xff, 0x6b, 0x60, 0x59, 0xff, 0x6e, 0x60,
0x57, 0xff, 0x4d, 0x48, 0x44, 0xff, 0xbe, 0xbd, 0xbb, 0xff, 0xe0, 0xdf,
0xde, 0xff, 0x67, 0x63, 0x5f, 0xff, 0x8c, 0x80, 0x77, 0xff, 0xb7, 0xb4,
0xb1, 0xff, 0xf1, 0xf1, 0xf0, 0xff, 0xb1, 0xa8, 0xa1, 0xff, 0xe0, 0xca,
0xbd, 0xff, 0xde, 0xc1, 0xb0, 0xff, 0xae, 0x94, 0x85, 0xff, 0x7b, 0x69,
0x5e, 0xff, 0x50, 0x49, 0x43, 0xff, 0x2b, 0x2c, 0x2b, 0xff, 0x2f, 0x2e,
0x2c, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x22, 0x23, 0x22, 0xff, 0xad, 0xad,
0xad, 0xff, 0xd6, 0xd6, 0xd6, 0xff, 0x43, 0x44, 0x43, 0xff, 0x4b, 0x4a,
0x47, 0xff, 0x69, 0x68, 0x67, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xb6, 0xb4,
0xb2, 0xff, 0x6c, 0x69, 0x65, 0xff, 0xaf, 0xa1, 0x99, 0xff, 0xea, 0xd1,
0xc3, 0xff, 0xe8, 0xca, 0xb8, 0xff, 0xb9, 0x9b, 0x8a, 0xff, 0x6e, 0x5c,
0x50, 0xff, 0x2d, 0x29, 0x26, 0xff, 0x17, 0x18, 0x17, 0xff, 0x1c, 0x1c,
0x1c, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xd4, 0xd4, 0xd4, 0xff, 0x3d, 0x3e,
0x3d, 0xff, 0x37, 0x38, 0x37, 0xff, 0x5b, 0x5c, 0x5b, 0xff, 0xee, 0xee,
0xee, 0xff, 0xb9, 0xb9, 0xb8, 0xff, 0x41, 0x43, 0x41, 0xff, 0x41, 0x41,
0x3f, 0xff, 0x6e, 0x66, 0x60, 0xff, 0xc8, 0xb0, 0xa1, 0xff, 0xf3, 0xd2,
0xbf, 0xff, 0xe4, 0xc0, 0xac, 0xff, 0xa8, 0x89, 0x76, 0xff, 0x4c, 0x3d,
0x34, 0xff, 0x19, 0x18, 0x17, 0xff, 0xa7, 0xa8, 0xa8, 0xff, 0xcf, 0xcf,
0xce, 0xff, 0x31, 0x31, 0x30, 0xff, 0x2f, 0x30, 0x2e, 0xff, 0x85, 0x86,
0x85, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0x9a, 0x9b, 0x99, 0xff, 0x3e, 0x3e,
0x3d, 0xff, 0x37, 0x38, 0x36, 0xff, 0x2d, 0x2e, 0x2d, 0xff, 0x3d, 0x39,
0x37, 0xff, 0x99, 0x83, 0x75, 0xff, 0xea, 0xc2, 0xab, 0xff, 0xf0, 0xc7,
0xaf, 0xff, 0xd2, 0xa9, 0x92, 0xff, 0x7a, 0x60, 0x51, 0xff, 0xb7, 0xb3,
0xb1, 0xff, 0xdd, 0xdd, 0xdd, 0xff, 0x72, 0x73, 0x72, 0xff, 0x94, 0x95,
0x94, 0xff, 0xeb, 0xeb, 0xeb, 0xff, 0xd2, 0xd2, 0xd2, 0xff, 0x57, 0x57,
0x56, 0xff, 0x3a, 0x3b, 0x3a, 0xff, 0x34, 0x35, 0x34, 0xff, 0x29, 0x29,
0x28, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x1e, 0x1d, 0x1c, 0xff, 0x71, 0x5d,
0x51, 0xff, 0xde, 0xb0, 0x96, 0xff, 0xee, 0xbd, 0xa2, 0xff, 0xe1, 0xb1,
0x96, 0xff, 0xe3, 0xcc, 0xbf, 0xff, 0xdb, 0xd8, 0xd6, 0xff, 0xcd, 0xcd,
0xcd, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xa3, 0xa3, 0xa3, 0xff, 0x52, 0x52,
0x51, 0xff, 0x38, 0x38, 0x37, 0xff, 0x7c, 0x7d, 0x7c, 0xff, 0xbd, 0xbd,
0xbd, 0xff, 0x4c, 0x4c, 0x4c, 0xff, 0x18, 0x18, 0x17, 0xff, 0x0f, 0x10,
0x0f, 0xff, 0x42, 0x42, 0x42, 0xff, 0xe4, 0xd9, 0xd3, 0xff, 0xf1, 0xcb,
0xb6, 0xff, 0xe9, 0xad, 0x8a, 0xff, 0xe4, 0xad, 0x8d, 0xff, 0xa3, 0x7e,
0x68, 0xff, 0x3c, 0x36, 0x32, 0xff, 0x25, 0x27, 0x26, 0xff, 0x25, 0x26,
0x25, 0xff, 0x2c, 0x2d, 0x2b, 0xff, 0x35, 0x35, 0x34, 0xff, 0x6a, 0x6b,
0x6a, 0xff, 0xf2, 0xf2, 0xf2, 0xff, 0x86, 0x86, 0x85, 0xff, 0x1b, 0x1b,
0x1b, 0xff, 0x14, 0x14, 0x13, 0xff, 0x82, 0x82, 0x82, 0xff, 0xf9, 0xfa,
0xfa, 0xff, 0x97, 0x83, 0x78, 0xff, 0xce, 0x8c, 0x66, 0xff, 0xe5, 0x9d,
0x75, 0xff, 0xde, 0x9b, 0x74, 0xff, 0x95, 0x6d, 0x56, 0xff, 0x4a, 0x3d,
0x35, 0xff, 0x55, 0x47, 0x3d, 0xff, 0x32, 0x33, 0x32, 0xff, 0x3a, 0x3a,
0x39, 0xff, 0x44, 0x45, 0x43, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0xe1, 0xe1,
0xe1, 0xff, 0xad, 0xad, 0xad, 0xff, 0xab, 0xab, 0xab, 0xff, 0xe0, 0xe0,
0xe0, 0xff, 0xd8, 0xd9, 0xd9, 0xff, 0x22, 0x23, 0x23, 0xff, 0x5e, 0x40,
0x2e, 0xff, 0xd5, 0x87, 0x59, 0xff, 0xe0, 0x8e, 0x5f, 0xff, 0xd7, 0x8c,
0x61, 0xff, 0xc9, 0x86, 0x5f, 0xff, 0x98, 0x6f, 0x56, 0xff, 0x3b, 0x3b,
0x3a, 0xff, 0x40, 0x41, 0x3f, 0xff, 0x3e, 0x3f, 0x3d, 0xff, 0x8c, 0x8d,
0x8c, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0xa3, 0xa4, 0xa3, 0xff, 0xa4, 0xa4,
0xa4, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0x9c, 0x9d, 0x9c, 0xff, 0x10, 0x11,
0x10, 0xff, 0x16, 0x15, 0x14, 0xff, 0x7d, 0x50, 0x36, 0xff, 0xd8, 0x7d,
0x49, 0xff, 0xdb, 0x80, 0x4c, 0xff, 0xde, 0x84, 0x50, 0xff, 0xb0, 0x75,
0x53, 0xff, 0x48, 0x46, 0x43, 0xff, 0x45, 0x46, 0x44, 0xff, 0x45, 0x46,
0x44, 0xff, 0x5c, 0x5d, 0x5b, 0xff, 0xe2, 0xe2, 0xe2, 0xff, 0x74, 0x74,
0x73, 0xff, 0x76, 0x76, 0x75, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0x5e, 0x5e,
0x5d, 0xff, 0x15, 0x15, 0x14, 0xff, 0x18, 0x1a, 0x1a, 0xff, 0x55, 0x3b,
0x2c, 0xff, 0xcd, 0x6f, 0x39, 0xff, 0xd7, 0x72, 0x39, 0xff, 0xd8, 0x74,
0x3b, 0xff, 0xc1, 0x74, 0x47, 0xff, 0x58, 0x51, 0x4b, 0xff, 0x49, 0x4a,
0x48, 0xff, 0x4b, 0x4c, 0x4a, 0xff, 0x48, 0x49, 0x47, 0xff, 0xb8, 0xb8,
0xb8, 0xff, 0xb8, 0xb8, 0xb8, 0xff, 0xba, 0xbb, 0xba, 0xff, 0xd8, 0xd9,
0xd8, 0xff, 0x37, 0x37, 0x36, 0xff, 0x1f, 0x1f, 0x1e, 0xff, 0x22, 0x23,
0x22, 0xff, 0x70, 0x48, 0x31, 0xff, 0xc6, 0x69, 0x32, 0xff, 0xd6, 0x6c,
0x2f, 0xff, 0xd6, 0x6c, 0x2f, 0xff, 0xcb, 0x6f, 0x3a, 0xff, 0x6b, 0x5b,
0x50, 0xff, 0x4a, 0x4c, 0x4b, 0xff, 0x4c, 0x4d, 0x4b, 0xff, 0x48, 0x49,
0x47, 0xff, 0x80, 0x81, 0x7f, 0xff, 0xea, 0xea, 0xea, 0xff, 0xf3, 0xf3,
0xf3, 0xff, 0xa3, 0xa4, 0xa3, 0xff, 0x2d, 0x2e, 0x2d, 0xff, 0x28, 0x28,
0x27, 0xff, 0x2a, 0x2a, 0x29, 0xff, 0x34, 0x33, 0x32, 0xff, 0x57, 0x46,
0x3a, 0xff, 0x93, 0x5c, 0x3b, 0xff, 0xc3, 0x69, 0x34, 0xff, 0xd1, 0x6d,
0x33, 0xff, 0x7f, 0x62, 0x50, 0xff, 0x4a, 0x4c, 0x4b, 0xff, 0x4c, 0x4d,
0x4b, 0xff, 0x4b, 0x4c, 0x4a, 0xff, 0x5b, 0x5c, 0x5a, 0xff, 0xba, 0xba,
0xba, 0xff, 0xc7, 0xc7, 0xc7, 0xff, 0x6b, 0x6c, 0x6a, 0xff, 0x33, 0x34,
0x32, 0xff, 0x2f, 0x2f, 0x2e, 0xff, 0x31, 0x31, 0x30, 0xff, 0x38, 0x39,
0x37, 0xff, 0x3d, 0x3f, 0x3e, 0xff, 0x45, 0x46, 0x45, 0xff, 0x62, 0x53,
0x48, 0xff, 0x99, 0x62, 0x42, 0xff, 0x79, 0x5d, 0x4b, 0xff, 0x4a, 0x4d,
0x4b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x13, 0x0b,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4d,
0x4b, 0xff, 0x4b, 0x4d, 0x4b, 0xff, 0x6e, 0x63, 0x5b, 0xff, 0x61, 0x5a,
0x54, 0xff, 0x4b, 0x4c, 0x4a, 0xff, 0x4c, 0x4d, 0x4b, 0xff, 0x4c, 0x4d,
0x4b, 0xff, 0x4d, 0x4e, 0x4c, 0xff, 0x75, 0x67, 0x5d, 0xff, 0x54, 0x51,
0x4d, 0xff, 0x45, 0x46, 0x44, 0xff, 0x43, 0x44, 0x42, 0xff, 0x3f, 0x40,
0x3f, 0xff, 0x48, 0x46, 0x42, 0xff, 0x6a, 0x5b, 0x51, 0xff, 0x3a, 0x3a,
0x38, 0xff, 0x3b, 0x3c, 0x3b, 0xff, 0x3e, 0x3f, 0x3d, 0xff, 0x50, 0x51,
0x50, 0xff, 0x85, 0x7e, 0x78, 0xff, 0x85, 0x80, 0x7c, 0xff, 0x7c, 0x7d,
0x7c, 0xff, 0x81, 0x82, 0x80, 0xff, 0x81, 0x82, 0x80, 0xff, 0x78, 0x78,
0x77, 0xff, 0x84, 0x79, 0x70, 0xff, 0x55, 0x54, 0x50, 0xff, 0x49, 0x4a,
0x48, 0xff, 0x4c, 0x4d, 0x4b, 0xff, 0x4c, 0x4d, 0x4b, 0xff, 0x4c, 0x4d,
0x4b, 0xff, 0x68, 0x5f, 0x58, 0xff, 0x4b, 0x4c, 0x4b, 0xff, 0x4f, 0x50,
0x4f, 0xff, 0x9f, 0x8a, 0x7d, 0xff, 0x67, 0x5e, 0x56, 0xff, 0x4a, 0x4c,
0x4a, 0xff, 0x4b, 0x4d, 0x4b, 0xff, 0x4a, 0x4c, 0x4a, 0xff, 0x57, 0x57,
0x55, 0xff, 0xa3, 0x8b, 0x7d, 0xff, 0x53, 0x4f, 0x4a, 0xff, 0x42, 0x43,
0x42, 0xff, 0x3f, 0x40, 0x3f, 0xff, 0x3a, 0x3b, 0x3a, 0xff, 0x67, 0x61,
0x5c, 0xff, 0x8b, 0x74, 0x67, 0xff, 0x34, 0x35, 0x33, 0xff, 0x37, 0x38,
0x37, 0xff, 0x38, 0x39, 0x37, 0xff, 0x7f, 0x80, 0x7f, 0xff, 0xf4, 0xf3,
0xf3, 0xff, 0xf6, 0xf6, 0xf5, 0xff, 0xf7, 0xf7, 0xf7, 0xff, 0xf8, 0xf8,
0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0xec, 0xe9,
0xe7, 0xff, 0xbc, 0xbb, 0xba, 0xff, 0x74, 0x75, 0x73, 0xff, 0x4c, 0x4d,
0x4b, 0xff, 0x4b, 0x4c, 0x4a, 0xff, 0x4e, 0x50, 0x4e, 0xff, 0x9e, 0x8e,
0x84, 0xff, 0x57, 0x54, 0x50, 0xff, 0x5c, 0x59, 0x54, 0xff, 0xae, 0x95,
0x86, 0xff, 0x70, 0x64, 0x5a, 0xff, 0x56, 0x53, 0x4f, 0xff, 0x57, 0x54,
0x50, 0xff, 0x55, 0x52, 0x4e, 0xff, 0x63, 0x5f, 0x5a, 0xff, 0xaf, 0x94,
0x84, 0xff, 0x5b, 0x53, 0x4d, 0xff, 0x4c, 0x49, 0x45, 0xff, 0x49, 0x46,
0x42, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x76, 0x6c, 0x66, 0xff, 0x95, 0x7c,
0x6c, 0xff, 0x3e, 0x3a, 0x36, 0xff, 0x41, 0x3e, 0x3a, 0xff, 0x42, 0x3e,
0x3a, 0xff, 0x87, 0x85, 0x82, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfd, 0xfb, 0xfa, 0xff, 0xfc, 0xfa,
0xf8, 0xff, 0xfe, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xef, 0xef, 0xef, 0xff, 0x96, 0x97, 0x95, 0xff, 0x58, 0x55,
0x51, 0xff, 0x5b, 0x58, 0x53, 0xff, 0xaf, 0x9c, 0x91, 0xff, 0x98, 0x7e,
0x6e, 0xff, 0x9c, 0x82, 0x72, 0xff, 0xc6, 0xa5, 0x91, 0xff, 0xa5, 0x87,
0x74, 0xff, 0x9a, 0x80, 0x6f, 0xff, 0x9a, 0x80, 0x6f, 0xff, 0x98, 0x7e,
0x6e, 0xff, 0xa1, 0x87, 0x77, 0xff, 0xc6, 0xa4, 0x90, 0xff, 0x9a, 0x7e,
0x6d, 0xff, 0x93, 0x79, 0x6a, 0xff, 0x92, 0x78, 0x68, 0xff, 0x8f, 0x75,
0x65, 0xff, 0xaa, 0x91, 0x81, 0xff, 0xb7, 0x95, 0x81, 0xff, 0x8c, 0x72,
0x62, 0xff, 0x8e, 0x74, 0x65, 0xff, 0x8e, 0x74, 0x64, 0xff, 0xb5, 0xa4,
0x99, 0xff, 0xfe, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xe6,
0xe3, 0xff, 0xbb, 0xa6, 0x99, 0xff, 0xb8, 0xa1, 0x94, 0xff, 0xc5, 0xb4,
0xa9, 0xff, 0xf0, 0xe5, 0xde, 0xff, 0xfe, 0xfc, 0xfb, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf7, 0xf6, 0xf6, 0xff, 0xb8, 0xa9, 0x9f, 0xff, 0x9a, 0x84,
0x76, 0xff, 0xc9, 0xb0, 0xa1, 0xff, 0x9a, 0x86, 0x79, 0xff, 0x8b, 0x7e,
0x75, 0xff, 0xbf, 0xa4, 0x94, 0xff, 0x91, 0x81, 0x76, 0xff, 0x7d, 0x75,
0x6e, 0xff, 0x7d, 0x74, 0x6d, 0xff, 0x7b, 0x72, 0x6b, 0xff, 0x86, 0x7b,
0x74, 0xff, 0xc0, 0xa4, 0x94, 0xff, 0x80, 0x73, 0x6b, 0xff, 0x73, 0x6b,
0x65, 0xff, 0x71, 0x69, 0x63, 0xff, 0x6d, 0x65, 0x5f, 0xff, 0x93, 0x86,
0x7d, 0xff, 0xad, 0x94, 0x85, 0xff, 0x69, 0x60, 0x5b, 0xff, 0x6b, 0x64,
0x5e, 0xff, 0x6c, 0x64, 0x5e, 0xff, 0x9b, 0x96, 0x92, 0xff, 0xfc, 0xfc,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xd2, 0xd1, 0xff, 0x7a, 0x73,
0x6d, 0xff, 0x79, 0x72, 0x6c, 0xff, 0x8c, 0x84, 0x7e, 0xff, 0xc4, 0xae,
0xa0, 0xff, 0xab, 0xa7, 0xa4, 0xff, 0xf5, 0xf6, 0xf6, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0xee, 0xed, 0xff, 0x99, 0x95, 0x91, 0xff, 0xc1, 0xb0,
0xa6, 0xff, 0xbf, 0x9a, 0x85, 0xff, 0xaa, 0x89, 0x75, 0xff, 0xc0, 0x98,
0x81, 0xff, 0x77, 0x67, 0x5c, 0xff, 0x4b, 0x4b, 0x49, 0xff, 0x42, 0x44,
0x43, 0xff, 0x3f, 0x41, 0x40, 0xff, 0x50, 0x4e, 0x4b, 0xff, 0x9e, 0x84,
0x74, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x33, 0x35, 0x34, 0xff, 0x30, 0x31,
0x30, 0xff, 0x29, 0x2b, 0x2a, 0xff, 0x62, 0x59, 0x53, 0xff, 0x7f, 0x68,
0x5a, 0xff, 0x22, 0x23, 0x22, 0xff, 0x26, 0x27, 0x26, 0xff, 0x27, 0x28,
0x27, 0xff, 0x6a, 0x6a, 0x6a, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff,
0xff, 0xff, 0xbe, 0xbe, 0xbe, 0xff, 0x3e, 0x3f, 0x3e, 0xff, 0x3d, 0x3f,
0x3d, 0xff, 0x5a, 0x59, 0x56, 0xff, 0xa2, 0x8b, 0x7c, 0xff, 0x52, 0x50,
0x4c, 0xff, 0xbc, 0xbc, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xa3, 0xa4, 0xa3, 0xff, 0xa3, 0x92, 0x87, 0xff, 0xf4, 0xdf,
0xd3, 0xff, 0xe9, 0xce, 0xbf, 0xff, 0xdd, 0xb9, 0xa4, 0xff, 0xc1, 0x9b,
0x85, 0xff, 0xa1, 0x81, 0x6e, 0xff, 0x79, 0x66, 0x5b, 0xff, 0x52, 0x4d,
0x48, 0xff, 0x4a, 0x48, 0x46, 0xff, 0x65, 0x5b, 0x54, 0xff, 0x37, 0x37,
0x36, 0xff, 0x33, 0x33, 0x32, 0xff, 0x2f, 0x30, 0x2e, 0xff, 0x29, 0x2a,
0x29, 0xff, 0x4a, 0x45, 0x41, 0xff, 0x46, 0x3f, 0x3a, 0xff, 0x20, 0x21,
0x20, 0xff, 0x25, 0x25, 0x24, 0xff, 0x25, 0x26, 0x25, 0xff, 0x68, 0x68,
0x68, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xba,
0xba, 0xff, 0x3c, 0x3d, 0x3b, 0xff, 0x3d, 0x3e, 0x3c, 0xff, 0x51, 0x50,
0x4e, 0xff, 0x6f, 0x67, 0x61, 0xff, 0x43, 0x44, 0x42, 0xff, 0x80, 0x80,
0x7f, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xd5,
0xd4, 0xff, 0x87, 0x80, 0x7b, 0xff, 0xd9, 0xc8, 0xbf, 0xff, 0xf6, 0xe2,
0xd6, 0xff, 0xf8, 0xe4, 0xd8, 0xff, 0xf1, 0xda, 0xcd, 0xff, 0xe3, 0xc5,
0xb3, 0xff, 0xce, 0xa8, 0x93, 0xff, 0xb0, 0x8c, 0x76, 0xff, 0x87, 0x6e,
0x5e, 0xff, 0x57, 0x4d, 0x46, 0xff, 0x36, 0x35, 0x34, 0xff, 0x2d, 0x2e,
0x2d, 0xff, 0x2b, 0x2c, 0x2b, 0xff, 0x27, 0x28, 0x27, 0xff, 0x24, 0x24,
0x23, 0xff, 0x20, 0x20, 0x1f, 0xff, 0x1e, 0x1e, 0x1d, 0xff, 0x21, 0x21,
0x21, 0xff, 0x22, 0x22, 0x21, 0xff, 0x63, 0x64, 0x63, 0xff, 0xf9, 0xf9,
0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xb8, 0xb7, 0xff, 0x38, 0x39,
0x38, 0xff, 0x3b, 0x3b, 0x3a, 0xff, 0x3e, 0x3f, 0x3e, 0xff, 0x42, 0x43,
0x41, 0xff, 0x42, 0x43, 0x41, 0xff, 0x64, 0x65, 0x63, 0xff, 0xef, 0xef,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xe9, 0xe9, 0xff, 0x67, 0x68,
0x66, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x92, 0x8a, 0x83, 0xff, 0xd9, 0xc5,
0xba, 0xff, 0xf7, 0xdf, 0xd1, 0xff, 0xf8, 0xe0, 0xd3, 0xff, 0xf4, 0xdd,
0xd0, 0xff, 0xea, 0xcd, 0xbd, 0xff, 0xd6, 0xb2, 0x9d, 0xff, 0xb8, 0x91,
0x7b, 0xff, 0x88, 0x6d, 0x5c, 0xff, 0x4d, 0x44, 0x3d, 0xff, 0x2a, 0x29,
0x28, 0xff, 0x22, 0x23, 0x22, 0xff, 0x1f, 0x20, 0x1f, 0xff, 0x1b, 0x1c,
0x1b, 0xff, 0x1a, 0x1a, 0x1a, 0xff, 0x1d, 0x1e, 0x1d, 0xff, 0x1e, 0x1e,
0x1d, 0xff, 0x5f, 0x5f, 0x5f, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xff, 0xff,
0xff, 0xff, 0xb6, 0xb6, 0xb6, 0xff, 0x35, 0x35, 0x34, 0xff, 0x37, 0x38,
0x36, 0xff, 0x3b, 0x3b, 0x3a, 0xff, 0x3e, 0x3f, 0x3d, 0xff, 0x3f, 0x40,
0x3f, 0xff, 0x5d, 0x5e, 0x5c, 0xff, 0xeb, 0xeb, 0xeb, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0x70, 0x71, 0x6f, 0xff, 0x48, 0x49,
0x47, 0xff, 0x45, 0x46, 0x44, 0xff, 0x5a, 0x58, 0x55, 0xff, 0xa0, 0x93,
0x8a, 0xff, 0xe4, 0xcb, 0xbd, 0xff, 0xf6, 0xda, 0xca, 0xff, 0xf5, 0xdb,
0xcc, 0xff, 0xf5, 0xdb, 0xcc, 0xff, 0xec, 0xce, 0xbe, 0xff, 0xd5, 0xb0,
0x9b, 0xff, 0xb4, 0x8d, 0x76, 0xff, 0x7d, 0x63, 0x54, 0xff, 0x3d, 0x35,
0x30, 0xff, 0x1c, 0x1c, 0x1b, 0xff, 0x17, 0x17, 0x17, 0xff, 0x16, 0x17,
0x16, 0xff, 0x19, 0x1a, 0x19, 0xff, 0x1a, 0x1a, 0x19, 0xff, 0x5d, 0x5d,
0x5d, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0xb3,
0xb3, 0xff, 0x31, 0x31, 0x30, 0xff, 0x34, 0x34, 0x33, 0xff, 0x37, 0x38,
0x36, 0x
gitextract_g_2gvmm3/
├── .circleci/
│ └── config.yml
├── .editorconfig
├── .github/
│ └── FUNDING.yml
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── _config.yml
├── albiondata-client.go
├── client/
│ ├── albion_state.go
│ ├── albion_watcher.go
│ ├── client.go
│ ├── config.go
│ ├── decode.go
│ ├── dispatcher.go
│ ├── event_player_online_status.go
│ ├── event_skill_data.go
│ ├── events.go
│ ├── eventtype_string.go
│ ├── listener.go
│ ├── net_interface_filter.go
│ ├── net_interface_filter_nix_darw.go
│ ├── net_interface_filter_win.go
│ ├── offline.go
│ ├── operation_auction_get_item_average_stats.go
│ ├── operation_auction_get_offers.go
│ ├── operation_auction_get_requests.go
│ ├── operation_get_cluster_map_info.go
│ ├── operation_get_game_server_by_cluster.go
│ ├── operation_get_mail_infos.go
│ ├── operation_gold_market_get_average_info.go
│ ├── operation_join.go
│ ├── operation_read_mail.go
│ ├── operation_real_estate_bid_on_auction.go
│ ├── operation_real_estate_get_auction_data.go
│ ├── operations.go
│ ├── operationtype_string.go
│ ├── router.go
│ ├── uploader.go
│ ├── uploader_http.go
│ ├── uploader_http_pow.go
│ ├── uploader_nats.go
│ ├── ws_client.go
│ └── ws_hub.go
├── config.yaml.example
├── go.mod
├── go.sum
├── icon/
│ ├── albiondata-client.psd
│ ├── iconwin.go
│ ├── make_icon.bat
│ └── make_icon.sh
├── lib/
│ ├── README.md
│ ├── common.go
│ ├── gold.go
│ ├── map.go
│ ├── market.go
│ ├── marketHistory.go
│ ├── nats.go
│ └── skills.go
├── log/
│ └── logger.go
├── notification/
│ ├── notification_nix_darw.go
│ └── notification_win.go
├── pkg/
│ └── nsis/
│ ├── Makefile
│ └── albiondata-client.nsi
├── scripts/
│ ├── build-darwin.sh
│ ├── build-linux.sh
│ ├── build-windows.sh
│ ├── fmt.sh
│ ├── run.command
│ ├── run.sh
│ └── validate-fmt.sh
├── systray/
│ ├── systray_others.go
│ └── systray_win.go
└── thirdparty/
├── WpdPack/
│ ├── Include/
│ │ ├── Packet32.h
│ │ ├── Win32-Extensions.h
│ │ ├── bittypes.h
│ │ ├── ip6_misc.h
│ │ ├── pcap/
│ │ │ ├── bluetooth.h
│ │ │ ├── bpf.h
│ │ │ ├── namedb.h
│ │ │ ├── pcap.h
│ │ │ ├── sll.h
│ │ │ ├── usb.h
│ │ │ └── vlan.h
│ │ ├── pcap-bpf.h
│ │ ├── pcap-namedb.h
│ │ ├── pcap-stdinc.h
│ │ ├── pcap.h
│ │ └── remote-ext.h
│ └── Lib/
│ ├── Packet.lib
│ ├── libpacket.a
│ ├── libwpcap.a
│ ├── wpcap.lib
│ └── x64/
│ ├── Packet.lib
│ └── wpcap.lib
└── rcedit/
└── LICENSE
SYMBOL INDEX (1142 symbols across 61 files)
FILE: albiondata-client.go
function init (line 17) | func init() {
function main (line 21) | func main() {
function startUpdater (line 37) | func startUpdater() {
FILE: client/albion_state.go
constant CacheSize (line 10) | CacheSize = 256
type marketHistoryInfo (line 12) | type marketHistoryInfo struct
type albionState (line 18) | type albionState struct
method IsValidLocation (line 32) | func (state albionState) IsValidLocation() bool {
FILE: client/albion_watcher.go
type albionProcessWatcher (line 9) | type albionProcessWatcher struct
method run (line 25) | func (apw *albionProcessWatcher) run() error {
method closeWatcher (line 49) | func (apw *albionProcessWatcher) closeWatcher() {
method createListeners (line 63) | func (apw *albionProcessWatcher) createListeners() {
function newAlbionProcessWatcher (line 17) | func newAlbionProcessWatcher() *albionProcessWatcher {
FILE: client/client.go
type Client (line 10) | type Client struct
method Run (line 20) | func (client *Client) Run() error {
function NewClient (line 14) | func NewClient(_version string) *Client {
FILE: client/config.go
type config (line 17) | type config struct
method SetupFlags (line 46) | func (config *config) SetupFlags() {
method setupWebsocketFlags (line 64) | func (config *config) setupWebsocketFlags() {
method setupDebugFlags (line 79) | func (config *config) setupDebugFlags() {
method setupCommonFlags (line 131) | func (config *config) setupCommonFlags() {
method setupLogs (line 189) | func (config *config) setupLogs() {
method setupDebugEvents (line 216) | func (config *config) setupDebugEvents() {
method setupDebugOperations (line 246) | func (config *config) setupDebugOperations() {
FILE: client/decode.go
function decodeRequest (line 13) | func decodeRequest(params map[uint8]interface{}) (operation operation, e...
function decodeResponse (line 44) | func decodeResponse(params map[uint8]interface{}) (operation operation, ...
function decodeEvent (line 83) | func decodeEvent(params map[uint8]interface{}) (event operation, err err...
function decodeParams (line 104) | func decodeParams(params map[uint8]interface{}, operation operation) err...
function decodeCharacterID (line 138) | func decodeCharacterID(array []int8) lib.CharacterID {
FILE: client/dispatcher.go
type dispatcher (line 13) | type dispatcher struct
function createDispatcher (line 23) | func createDispatcher() {
function createUploaders (line 36) | func createUploaders(targets []string) []uploader {
function sendMsgToPublicUploaders (line 61) | func sendMsgToPublicUploaders(upload interface{}, topic string, state *a...
function sendMsgToPrivateUploaders (line 77) | func sendMsgToPrivateUploaders(upload lib.PersonalizedUpload, topic stri...
function sendMsgToUploaders (line 109) | func sendMsgToUploaders(msg []byte, topic string, uploaders []uploader) {
function runHTTPServer (line 120) | func runHTTPServer() {
function sendMsgToWebSockets (line 132) | func sendMsgToWebSockets(msg []byte, topic string) {
FILE: client/event_player_online_status.go
type eventPlayerOnlineStatus (line 8) | type eventPlayerOnlineStatus struct
method Process (line 14) | func (event eventPlayerOnlineStatus) Process(state *albionState) {
FILE: client/event_skill_data.go
type eventSkillData (line 10) | type eventSkillData struct
method Process (line 17) | func (event eventSkillData) Process(state *albionState) {
FILE: client/events.go
type EventType (line 5) | type EventType
constant evUnused (line 8) | evUnused EventType = iota
constant evLeave (line 9) | evLeave
constant evJoinFinished (line 10) | evJoinFinished
constant evMove (line 11) | evMove
constant evTeleport (line 12) | evTeleport
constant evChangeEquipment (line 13) | evChangeEquipment
constant evHealthUpdate (line 14) | evHealthUpdate
constant evEnergyUpdate (line 15) | evEnergyUpdate
constant evDamageShieldUpdate (line 16) | evDamageShieldUpdate
constant evCraftingFocusUpdate (line 17) | evCraftingFocusUpdate
constant evActiveSpellEffectsUpdate (line 18) | evActiveSpellEffectsUpdate
constant evResetCooldowns (line 19) | evResetCooldowns
constant evAttack (line 20) | evAttack
constant evCastStart (line 21) | evCastStart
constant evChannelingUpdate (line 22) | evChannelingUpdate
constant evCastCancel (line 23) | evCastCancel
constant evCastTimeUpdate (line 24) | evCastTimeUpdate
constant evCastFinished (line 25) | evCastFinished
constant evCastSpell (line 26) | evCastSpell
constant evCastHit (line 27) | evCastHit
constant evCastHits (line 28) | evCastHits
constant evChannelingEnded (line 29) | evChannelingEnded
constant evAttackBuilding (line 30) | evAttackBuilding
constant evInventoryPutItem (line 31) | evInventoryPutItem
constant evInventoryDeleteItem (line 32) | evInventoryDeleteItem
constant evNewCharacter (line 33) | evNewCharacter
constant evNewEquipmentItem (line 34) | evNewEquipmentItem
constant evNewSimpleItem (line 35) | evNewSimpleItem
constant evNewFurnitureItem (line 36) | evNewFurnitureItem
constant evNewJournalItem (line 37) | evNewJournalItem
constant evNewLaborerItem (line 38) | evNewLaborerItem
constant evNewSimpleHarvestableObject (line 39) | evNewSimpleHarvestableObject
constant evNewSimpleHarvestableObjectList (line 40) | evNewSimpleHarvestableObjectList
constant evNewHarvestableObject (line 41) | evNewHarvestableObject
constant evNewSilverObject (line 42) | evNewSilverObject
constant evNewBuilding (line 43) | evNewBuilding
constant evHarvestableChangeState (line 44) | evHarvestableChangeState
constant evMobChangeState (line 45) | evMobChangeState
constant evFactionBuildingInfo (line 46) | evFactionBuildingInfo
constant evCraftBuildingInfo (line 47) | evCraftBuildingInfo
constant evRepairBuildingInfo (line 48) | evRepairBuildingInfo
constant evMeldBuildingInfo (line 49) | evMeldBuildingInfo
constant evConstructionSiteInfo (line 50) | evConstructionSiteInfo
constant evPlayerBuildingInfo (line 51) | evPlayerBuildingInfo
constant evFarmBuildingInfo (line 52) | evFarmBuildingInfo
constant evTutorialBuildingInfo (line 53) | evTutorialBuildingInfo
constant evLaborerObjectInfo (line 54) | evLaborerObjectInfo
constant evLaborerObjectJobInfo (line 55) | evLaborerObjectJobInfo
constant evMarketPlaceBuildingInfo (line 56) | evMarketPlaceBuildingInfo
constant evHarvestStart (line 57) | evHarvestStart
constant evHarvestCancel (line 58) | evHarvestCancel
constant evHarvestFinished (line 59) | evHarvestFinished
constant evTakeSilver (line 60) | evTakeSilver
constant evActionOnBuildingStart (line 61) | evActionOnBuildingStart
constant evActionOnBuildingCancel (line 62) | evActionOnBuildingCancel
constant evActionOnBuildingFinished (line 63) | evActionOnBuildingFinished
constant evItemRerollQualityStart (line 64) | evItemRerollQualityStart
constant evItemRerollQualityCancel (line 65) | evItemRerollQualityCancel
constant evItemRerollQualityFinished (line 66) | evItemRerollQualityFinished
constant evInstallResourceStart (line 67) | evInstallResourceStart
constant evInstallResourceCancel (line 68) | evInstallResourceCancel
constant evInstallResourceFinished (line 69) | evInstallResourceFinished
constant evCraftItemFinished (line 70) | evCraftItemFinished
constant evLogoutCancel (line 71) | evLogoutCancel
constant evChatMessage (line 72) | evChatMessage
constant evChatSay (line 73) | evChatSay
constant evChatWhisper (line 74) | evChatWhisper
constant evChatMuted (line 75) | evChatMuted
constant evPlayEmote (line 76) | evPlayEmote
constant evStopEmote (line 77) | evStopEmote
constant evSystemMessage (line 78) | evSystemMessage
constant evUtilityTextMessage (line 79) | evUtilityTextMessage
constant evUpdateMoney (line 80) | evUpdateMoney
constant evUpdateFame (line 81) | evUpdateFame
constant evUpdateLearningPoints (line 82) | evUpdateLearningPoints
constant evUpdateReSpecPoints (line 83) | evUpdateReSpecPoints
constant evUpdateCurrency (line 84) | evUpdateCurrency
constant evUpdateFactionStanding (line 85) | evUpdateFactionStanding
constant evRespawn (line 86) | evRespawn
constant evServerDebugLog (line 87) | evServerDebugLog
constant evCharacterEquipmentChanged (line 88) | evCharacterEquipmentChanged
constant evRegenerationHealthChanged (line 89) | evRegenerationHealthChanged
constant evRegenerationEnergyChanged (line 90) | evRegenerationEnergyChanged
constant evRegenerationMountHealthChanged (line 91) | evRegenerationMountHealthChanged
constant evRegenerationCraftingChanged (line 92) | evRegenerationCraftingChanged
constant evRegenerationHealthEnergyComboChanged (line 93) | evRegenerationHealthEnergyComboChanged
constant evRegenerationPlayerComboChanged (line 94) | evRegenerationPlayerComboChanged
constant evDurabilityChanged (line 95) | evDurabilityChanged
constant evNewLoot (line 96) | evNewLoot
constant evAttachItemContainer (line 97) | evAttachItemContainer
constant evDetachItemContainer (line 98) | evDetachItemContainer
constant evInvalidateItemContainer (line 99) | evInvalidateItemContainer
constant evLockItemContainer (line 100) | evLockItemContainer
constant evGuildUpdate (line 101) | evGuildUpdate
constant evGuildPlayerUpdated (line 102) | evGuildPlayerUpdated
constant evInvitedToGuild (line 103) | evInvitedToGuild
constant evGuildMemberWorldUpdate (line 104) | evGuildMemberWorldUpdate
constant evUpdateMatchDetails (line 105) | evUpdateMatchDetails
constant evObjectEvent (line 106) | evObjectEvent
constant evNewMonolithObject (line 107) | evNewMonolithObject
constant evNewSiegeCampObject (line 108) | evNewSiegeCampObject
constant evNewOrbObject (line 109) | evNewOrbObject
constant evNewCastleObject (line 110) | evNewCastleObject
constant evNewSpellEffectArea (line 111) | evNewSpellEffectArea
constant evUpdateSpellEffectArea (line 112) | evUpdateSpellEffectArea
constant evNewChainSpell (line 113) | evNewChainSpell
constant evUpdateChainSpell (line 114) | evUpdateChainSpell
constant evNewTreasureChest (line 115) | evNewTreasureChest
constant evStartMatch (line 116) | evStartMatch
constant evStartTerritoryMatchInfos (line 117) | evStartTerritoryMatchInfos
constant evStartArenaMatchInfos (line 118) | evStartArenaMatchInfos
constant evEndTerritoryMatch (line 119) | evEndTerritoryMatch
constant evEndArenaMatch (line 120) | evEndArenaMatch
constant evMatchUpdate (line 121) | evMatchUpdate
constant evActiveMatchUpdate (line 122) | evActiveMatchUpdate
constant evNewMob (line 123) | evNewMob
constant evDebugAggroInfo (line 124) | evDebugAggroInfo
constant evDebugVariablesInfo (line 125) | evDebugVariablesInfo
constant evDebugReputationInfo (line 126) | evDebugReputationInfo
constant evDebugDiminishingReturnInfo (line 127) | evDebugDiminishingReturnInfo
constant evDebugSmartClusterQueueInfo (line 128) | evDebugSmartClusterQueueInfo
constant evClaimOrbStart (line 129) | evClaimOrbStart
constant evClaimOrbFinished (line 130) | evClaimOrbFinished
constant evClaimOrbCancel (line 131) | evClaimOrbCancel
constant evOrbUpdate (line 132) | evOrbUpdate
constant evOrbClaimed (line 133) | evOrbClaimed
constant evNewWarCampObject (line 134) | evNewWarCampObject
constant evNewMatchLootChestObject (line 135) | evNewMatchLootChestObject
constant evNewArenaExit (line 136) | evNewArenaExit
constant evGuildMemberTerritoryUpdate (line 137) | evGuildMemberTerritoryUpdate
constant evInvitedMercenaryToMatch (line 138) | evInvitedMercenaryToMatch
constant evClusterInfoUpdate (line 139) | evClusterInfoUpdate
constant evForcedMovement (line 140) | evForcedMovement
constant evForcedMovementCancel (line 141) | evForcedMovementCancel
constant evCharacterStats (line 142) | evCharacterStats
constant evCharacterStatsKillHistory (line 143) | evCharacterStatsKillHistory
constant evCharacterStatsDeathHistory (line 144) | evCharacterStatsDeathHistory
constant evGuildStats (line 145) | evGuildStats
constant evKillHistoryDetails (line 146) | evKillHistoryDetails
constant evFullAchievementInfo (line 147) | evFullAchievementInfo
constant evFinishedAchievement (line 148) | evFinishedAchievement
constant evAchievementProgressInfo (line 149) | evAchievementProgressInfo
constant evFullAchievementProgressInfo (line 150) | evFullAchievementProgressInfo
constant evFullTrackedAchievementInfo (line 151) | evFullTrackedAchievementInfo
constant evFullAutoLearnAchievementInfo (line 152) | evFullAutoLearnAchievementInfo
constant evQuestGiverQuestOffered (line 153) | evQuestGiverQuestOffered
constant evQuestGiverDebugInfo (line 154) | evQuestGiverDebugInfo
constant evConsoleEvent (line 155) | evConsoleEvent
constant evTimeSync (line 156) | evTimeSync
constant evChangeAvatar (line 157) | evChangeAvatar
constant evChangeMountSkin (line 158) | evChangeMountSkin
constant evGameEvent (line 159) | evGameEvent
constant evKilledPlayer (line 160) | evKilledPlayer
constant evDied (line 161) | evDied
constant evKnockedDown (line 162) | evKnockedDown
constant evMatchPlayerJoinedEvent (line 163) | evMatchPlayerJoinedEvent
constant evMatchPlayerStatsEvent (line 164) | evMatchPlayerStatsEvent
constant evMatchPlayerStatsCompleteEvent (line 165) | evMatchPlayerStatsCompleteEvent
constant evMatchTimeLineEventEvent (line 166) | evMatchTimeLineEventEvent
constant evMatchPlayerMainGearStatsEvent (line 167) | evMatchPlayerMainGearStatsEvent
constant evMatchPlayerChangedAvatarEvent (line 168) | evMatchPlayerChangedAvatarEvent
constant evInvitationPlayerTrade (line 169) | evInvitationPlayerTrade
constant evPlayerTradeStart (line 170) | evPlayerTradeStart
constant evPlayerTradeCancel (line 171) | evPlayerTradeCancel
constant evPlayerTradeUpdate (line 172) | evPlayerTradeUpdate
constant evPlayerTradeFinished (line 173) | evPlayerTradeFinished
constant evPlayerTradeAcceptChange (line 174) | evPlayerTradeAcceptChange
constant evMiniMapPing (line 175) | evMiniMapPing
constant evMarketPlaceNotification (line 176) | evMarketPlaceNotification
constant evDuellingChallengePlayer (line 177) | evDuellingChallengePlayer
constant evNewDuellingPost (line 178) | evNewDuellingPost
constant evDuelStarted (line 179) | evDuelStarted
constant evDuelEnded (line 180) | evDuelEnded
constant evDuelDenied (line 181) | evDuelDenied
constant evDuelLeftArea (line 182) | evDuelLeftArea
constant evDuelReEnteredArea (line 183) | evDuelReEnteredArea
constant evNewRealEstate (line 184) | evNewRealEstate
constant evMiniMapOwnedBuildingsPositions (line 185) | evMiniMapOwnedBuildingsPositions
constant evRealEstateListUpdate (line 186) | evRealEstateListUpdate
constant evGuildLogoUpdate (line 187) | evGuildLogoUpdate
constant evGuildLogoChanged (line 188) | evGuildLogoChanged
constant evPlaceableObjectPlace (line 189) | evPlaceableObjectPlace
constant evPlaceableObjectPlaceCancel (line 190) | evPlaceableObjectPlaceCancel
constant evFurnitureObjectBuffProviderInfo (line 191) | evFurnitureObjectBuffProviderInfo
constant evFurnitureObjectCheatProviderInfo (line 192) | evFurnitureObjectCheatProviderInfo
constant evFarmableObjectInfo (line 193) | evFarmableObjectInfo
constant evNewUnreadMails (line 194) | evNewUnreadMails
constant evUnknown187 (line 195) | evUnknown187
constant evGuildLogoObjectUpdate (line 196) | evGuildLogoObjectUpdate
constant evStartLogout (line 197) | evStartLogout
constant evNewChatChannels (line 198) | evNewChatChannels
constant evJoinedChatChannel (line 199) | evJoinedChatChannel
constant evLeftChatChannel (line 200) | evLeftChatChannel
constant evRemovedChatChannel (line 201) | evRemovedChatChannel
constant evAccessStatus (line 202) | evAccessStatus
constant evMounted (line 203) | evMounted
constant evMountStart (line 204) | evMountStart
constant evMountCancel (line 205) | evMountCancel
constant evNewTravelpoint (line 206) | evNewTravelpoint
constant evNewIslandAccessPoint (line 207) | evNewIslandAccessPoint
constant evNewExit (line 208) | evNewExit
constant evUpdateHome (line 209) | evUpdateHome
constant evUpdateChatSettings (line 210) | evUpdateChatSettings
constant evResurrectionOffer (line 211) | evResurrectionOffer
constant evResurrectionReply (line 212) | evResurrectionReply
constant evLootEquipmentChanged (line 213) | evLootEquipmentChanged
constant evUpdateUnlockedGuildLogos (line 214) | evUpdateUnlockedGuildLogos
constant evUpdateUnlockedAvatars (line 215) | evUpdateUnlockedAvatars
constant evUpdateUnlockedAvatarRings (line 216) | evUpdateUnlockedAvatarRings
constant evUpdateUnlockedBuildings (line 217) | evUpdateUnlockedBuildings
constant evNewIslandManagement (line 218) | evNewIslandManagement
constant evNewTeleportStone (line 219) | evNewTeleportStone
constant evCloak (line 220) | evCloak
constant evPartyInvitation (line 221) | evPartyInvitation
constant evPartyJoined (line 222) | evPartyJoined
constant evPartyDisbanded (line 223) | evPartyDisbanded
constant evPartyPlayerJoined (line 224) | evPartyPlayerJoined
constant evPartyChangedOrder (line 225) | evPartyChangedOrder
constant evPartyPlayerLeft (line 226) | evPartyPlayerLeft
constant evPartyLeaderChanged (line 227) | evPartyLeaderChanged
constant evPartyLootSettingChangedPlayer (line 228) | evPartyLootSettingChangedPlayer
constant evPartySilverGained (line 229) | evPartySilverGained
constant evPartyPlayerUpdated (line 230) | evPartyPlayerUpdated
constant evPartyInvitationPlayerBusy (line 231) | evPartyInvitationPlayerBusy
constant evPartyMarkedObjectsUpdated (line 232) | evPartyMarkedObjectsUpdated
constant evPartyOnClusterPartyJoined (line 233) | evPartyOnClusterPartyJoined
constant evPartySetRoleFlag (line 234) | evPartySetRoleFlag
constant evSpellCooldownUpdate (line 235) | evSpellCooldownUpdate
constant evNewHellgate (line 236) | evNewHellgate
constant evNewHellgateExit (line 237) | evNewHellgateExit
constant evNewExpeditionExit (line 238) | evNewExpeditionExit
constant evNewExpeditionNarrator (line 239) | evNewExpeditionNarrator
constant evExitEnterStart (line 240) | evExitEnterStart
constant evExitEnterCancel (line 241) | evExitEnterCancel
constant evExitEnterFinished (line 242) | evExitEnterFinished
constant evHellClusterTimeUpdate (line 243) | evHellClusterTimeUpdate
constant evNewQuestGiverObject (line 244) | evNewQuestGiverObject
constant evFullQuestInfo (line 245) | evFullQuestInfo
constant evQuestProgressInfo (line 246) | evQuestProgressInfo
constant evQuestGiverInfoForPlayer (line 247) | evQuestGiverInfoForPlayer
constant evFullExpeditionInfo (line 248) | evFullExpeditionInfo
constant evExpeditionQuestProgressInfo (line 249) | evExpeditionQuestProgressInfo
constant evInvitedToExpedition (line 250) | evInvitedToExpedition
constant evExpeditionRegistrationInfo (line 251) | evExpeditionRegistrationInfo
constant evEnteringExpeditionStart (line 252) | evEnteringExpeditionStart
constant evEnteringExpeditionCancel (line 253) | evEnteringExpeditionCancel
constant evRewardGranted (line 254) | evRewardGranted
constant evArenaRegistrationInfo (line 255) | evArenaRegistrationInfo
constant evEnteringArenaStart (line 256) | evEnteringArenaStart
constant evEnteringArenaCancel (line 257) | evEnteringArenaCancel
constant evEnteringArenaLockStart (line 258) | evEnteringArenaLockStart
constant evEnteringArenaLockCancel (line 259) | evEnteringArenaLockCancel
constant evInvitedToArenaMatch (line 260) | evInvitedToArenaMatch
constant evPlayerCounts (line 261) | evPlayerCounts
constant evInCombatStateUpdate (line 262) | evInCombatStateUpdate
constant evOtherGrabbedLoot (line 263) | evOtherGrabbedLoot
constant evSiegeCampClaimStart (line 264) | evSiegeCampClaimStart
constant evSiegeCampClaimCancel (line 265) | evSiegeCampClaimCancel
constant evSiegeCampClaimFinished (line 266) | evSiegeCampClaimFinished
constant evSiegeCampScheduleResult (line 267) | evSiegeCampScheduleResult
constant evTreasureChestUsingStart (line 268) | evTreasureChestUsingStart
constant evTreasureChestUsingFinished (line 269) | evTreasureChestUsingFinished
constant evTreasureChestUsingCancel (line 270) | evTreasureChestUsingCancel
constant evTreasureChestUsingOpeningComplete (line 271) | evTreasureChestUsingOpeningComplete
constant evTreasureChestForceCloseInventory (line 272) | evTreasureChestForceCloseInventory
constant evPremiumChanged (line 273) | evPremiumChanged
constant evPremiumExtended (line 274) | evPremiumExtended
constant evPremiumLifeTimeRewardGained (line 275) | evPremiumLifeTimeRewardGained
constant evLaborerGotUpgraded (line 276) | evLaborerGotUpgraded
constant evJournalGotFull (line 277) | evJournalGotFull
constant evJournalFillError (line 278) | evJournalFillError
constant evFriendRequest (line 279) | evFriendRequest
constant evFriendRequestInfos (line 280) | evFriendRequestInfos
constant evFriendInfos (line 281) | evFriendInfos
constant evFriendRequestAnswered (line 282) | evFriendRequestAnswered
constant evFriendOnlineStatus (line 283) | evFriendOnlineStatus
constant evFriendRequestCanceled (line 284) | evFriendRequestCanceled
constant evFriendRemoved (line 285) | evFriendRemoved
constant evFriendUpdated (line 286) | evFriendUpdated
constant evPartyLootItems (line 287) | evPartyLootItems
constant evPartyLootItemsRemoved (line 288) | evPartyLootItemsRemoved
constant evReputationUpdate (line 289) | evReputationUpdate
constant evDefenseUnitAttackBegin (line 290) | evDefenseUnitAttackBegin
constant evDefenseUnitAttackEnd (line 291) | evDefenseUnitAttackEnd
constant evDefenseUnitAttackDamage (line 292) | evDefenseUnitAttackDamage
constant evUnrestrictedPvpZoneUpdate (line 293) | evUnrestrictedPvpZoneUpdate
constant evReputationImplicationUpdate (line 294) | evReputationImplicationUpdate
constant evNewMountObject (line 295) | evNewMountObject
constant evMountHealthUpdate (line 296) | evMountHealthUpdate
constant evMountCooldownUpdate (line 297) | evMountCooldownUpdate
constant evNewExpeditionAgent (line 298) | evNewExpeditionAgent
constant evNewExpeditionCheckPoint (line 299) | evNewExpeditionCheckPoint
constant evExpeditionStartEvent (line 300) | evExpeditionStartEvent
constant evVoteEvent (line 301) | evVoteEvent
constant evRatingEvent (line 302) | evRatingEvent
constant evNewArenaAgent (line 303) | evNewArenaAgent
constant evBoostFarmable (line 304) | evBoostFarmable
constant evUseFunction (line 305) | evUseFunction
constant evNewPortalEntrance (line 306) | evNewPortalEntrance
constant evNewPortalExit (line 307) | evNewPortalExit
constant evNewRandomDungeonExit (line 308) | evNewRandomDungeonExit
constant evWaitingQueueUpdate (line 309) | evWaitingQueueUpdate
constant evPlayerMovementRateUpdate (line 310) | evPlayerMovementRateUpdate
constant evObserveStart (line 311) | evObserveStart
constant evMinimapZergs (line 312) | evMinimapZergs
constant evMinimapSmartClusterZergs (line 313) | evMinimapSmartClusterZergs
constant evPaymentTransactions (line 314) | evPaymentTransactions
constant evPerformanceStatsUpdate (line 315) | evPerformanceStatsUpdate
constant evOverloadModeUpdate (line 316) | evOverloadModeUpdate
constant evDebugDrawEvent (line 317) | evDebugDrawEvent
constant evRecordCameraMove (line 318) | evRecordCameraMove
constant evRecordStart (line 319) | evRecordStart
constant evTerritoryClaimStart (line 320) | evTerritoryClaimStart
constant evTerritoryClaimCancel (line 321) | evTerritoryClaimCancel
constant evTerritoryClaimFinished (line 322) | evTerritoryClaimFinished
constant evTerritoryScheduleResult (line 323) | evTerritoryScheduleResult
constant evUpdateAccountState (line 324) | evUpdateAccountState
constant evStartDeterministicRoam (line 325) | evStartDeterministicRoam
constant evGuildFullAccessTagsUpdated (line 326) | evGuildFullAccessTagsUpdated
constant evGuildAccessTagUpdated (line 327) | evGuildAccessTagUpdated
constant evGvgSeasonUpdate (line 328) | evGvgSeasonUpdate
constant evGvgSeasonCheatCommand (line 329) | evGvgSeasonCheatCommand
constant evSeasonPointsByKillingBooster (line 330) | evSeasonPointsByKillingBooster
constant evFishingStart (line 331) | evFishingStart
constant evFishingCast (line 332) | evFishingCast
constant evFishingCatch (line 333) | evFishingCatch
constant evFishingFinished (line 334) | evFishingFinished
constant evFishingCancel (line 335) | evFishingCancel
constant evNewFloatObject (line 336) | evNewFloatObject
constant evNewFishingZoneObject (line 337) | evNewFishingZoneObject
constant evFishingMiniGame (line 338) | evFishingMiniGame
constant evSteamAchievementCompleted (line 339) | evSteamAchievementCompleted
constant evUpdatePuppet (line 340) | evUpdatePuppet
constant evChangeFlaggingFinished (line 341) | evChangeFlaggingFinished
constant evNewOutpostObject (line 342) | evNewOutpostObject
constant evOutpostUpdate (line 343) | evOutpostUpdate
constant evOutpostClaimed (line 344) | evOutpostClaimed
constant evOutpostReward (line 345) | evOutpostReward
constant evOverChargeEnd (line 346) | evOverChargeEnd
constant evOverChargeStatus (line 347) | evOverChargeStatus
constant evPartyFinderFullUpdate (line 348) | evPartyFinderFullUpdate
constant evPartyFinderUpdate (line 349) | evPartyFinderUpdate
constant evPartyFinderApplicantsUpdate (line 350) | evPartyFinderApplicantsUpdate
constant evPartyFinderEquipmentSnapshot (line 351) | evPartyFinderEquipmentSnapshot
constant evPartyFinderJoinRequestDeclined (line 352) | evPartyFinderJoinRequestDeclined
constant evNewUnlockedPersonalSeasonRewards (line 353) | evNewUnlockedPersonalSeasonRewards
constant evPersonalSeasonPointsGained (line 354) | evPersonalSeasonPointsGained
constant evEasyAntiCheatMessageToClient (line 355) | evEasyAntiCheatMessageToClient
constant evMatchLootChestOpeningStart (line 356) | evMatchLootChestOpeningStart
constant evMatchLootChestOpeningFinished (line 357) | evMatchLootChestOpeningFinished
constant evMatchLootChestOpeningCancel (line 358) | evMatchLootChestOpeningCancel
constant evNotifyCrystalMatchReward (line 359) | evNotifyCrystalMatchReward
constant evCrystalRealmFeedback (line 360) | evCrystalRealmFeedback
constant evNewLocationMarker (line 361) | evNewLocationMarker
constant evNewTutorialBlocker (line 362) | evNewTutorialBlocker
constant evNewTileSwitch (line 363) | evNewTileSwitch
constant evNewInformationProvider (line 364) | evNewInformationProvider
constant evNewDynamicGuildLogo (line 365) | evNewDynamicGuildLogo
constant evTutorialUpdate (line 366) | evTutorialUpdate
constant evTriggerHintBox (line 367) | evTriggerHintBox
constant evRandomDungeonPositionInfo (line 368) | evRandomDungeonPositionInfo
constant evNewLootChest (line 369) | evNewLootChest
constant evUpdateLootChest (line 370) | evUpdateLootChest
constant evLootChestOpened (line 371) | evLootChestOpened
constant evNewShrine (line 372) | evNewShrine
constant evUpdateShrine (line 373) | evUpdateShrine
constant evMutePlayerUpdate (line 374) | evMutePlayerUpdate
constant evShopTileUpdate (line 375) | evShopTileUpdate
constant evShopUpdate (line 376) | evShopUpdate
constant evEasyAntiCheatKick (line 377) | evEasyAntiCheatKick
constant evUnlockVanityUnlock (line 378) | evUnlockVanityUnlock
constant evAvatarUnlocked (line 379) | evAvatarUnlocked
constant evCustomizationChanged (line 380) | evCustomizationChanged
constant evBaseVaultInfo (line 381) | evBaseVaultInfo
constant evGuildVaultInfo (line 382) | evGuildVaultInfo
constant evBankVaultInfo (line 383) | evBankVaultInfo
constant evRecoveryVaultPlayerInfo (line 384) | evRecoveryVaultPlayerInfo
constant evRecoveryVaultGuildInfo (line 385) | evRecoveryVaultGuildInfo
constant evUpdateWardrobe (line 386) | evUpdateWardrobe
constant evCastlePhaseChanged (line 387) | evCastlePhaseChanged
constant evGuildAccountLogEvent (line 388) | evGuildAccountLogEvent
constant evNewHideoutObject (line 389) | evNewHideoutObject
constant evNewHideoutManagement (line 390) | evNewHideoutManagement
constant evNewHideoutExit (line 391) | evNewHideoutExit
constant evInitHideoutAttackStart (line 392) | evInitHideoutAttackStart
constant evInitHideoutAttackCancel (line 393) | evInitHideoutAttackCancel
constant evInitHideoutAttackFinished (line 394) | evInitHideoutAttackFinished
constant evHideoutManagementUpdate (line 395) | evHideoutManagementUpdate
constant evIpChanged (line 396) | evIpChanged
constant evSmartClusterQueueUpdateInfo (line 397) | evSmartClusterQueueUpdateInfo
constant evSmartClusterQueueActiveInfo (line 398) | evSmartClusterQueueActiveInfo
constant evSmartClusterQueueKickWarning (line 399) | evSmartClusterQueueKickWarning
constant evSmartClusterQueueInvite (line 400) | evSmartClusterQueueInvite
constant evReceivedGvgSeasonPoints (line 401) | evReceivedGvgSeasonPoints
constant evTerritoryBonusLevelUpdate (line 402) | evTerritoryBonusLevelUpdate
constant evOpenWorldAttackScheduleStart (line 403) | evOpenWorldAttackScheduleStart
constant evOpenWorldAttackScheduleFinished (line 404) | evOpenWorldAttackScheduleFinished
constant evOpenWorldAttackScheduleCancel (line 405) | evOpenWorldAttackScheduleCancel
constant evOpenWorldAttackConquerStart (line 406) | evOpenWorldAttackConquerStart
constant evOpenWorldAttackConquerFinished (line 407) | evOpenWorldAttackConquerFinished
constant evOpenWorldAttackConquerCancel (line 408) | evOpenWorldAttackConquerCancel
constant evOpenWorldAttackConquerStatus (line 409) | evOpenWorldAttackConquerStatus
constant evOpenWorldAttackStart (line 410) | evOpenWorldAttackStart
constant evOpenWorldAttackEnd (line 411) | evOpenWorldAttackEnd
constant evNewRandomResourceBlocker (line 412) | evNewRandomResourceBlocker
constant evNewHomeObject (line 413) | evNewHomeObject
constant evHideoutObjectUpdate (line 414) | evHideoutObjectUpdate
constant evUpdateInfamy (line 415) | evUpdateInfamy
constant evUnknown408 (line 416) | evUnknown408
constant evUnknown409 (line 417) | evUnknown409
constant evUnknown410 (line 418) | evUnknown410
constant evUnknown411 (line 419) | evUnknown411
constant evUnknown412 (line 420) | evUnknown412
constant evUnknown413 (line 421) | evUnknown413
constant evUnknown414 (line 422) | evUnknown414
constant evUnknown415 (line 423) | evUnknown415
constant evUnknown416 (line 424) | evUnknown416
constant evUnknown417 (line 425) | evUnknown417
constant evUnknown418 (line 426) | evUnknown418
constant evUnknown419 (line 427) | evUnknown419
constant evUnknown420 (line 428) | evUnknown420
constant evUnknown421 (line 429) | evUnknown421
constant evUnknown422 (line 430) | evUnknown422
FILE: client/eventtype_string.go
function _ (line 7) | func _() {
constant _EventType_name (line 436) | _EventType_name = "evUnusedevLeaveevJoinFinishedevMoveevTeleportevChange...
method String (line 440) | func (i EventType) String() string {
FILE: client/listener.go
type listener (line 17) | type listener struct
method startOnline (line 36) | func (l *listener) startOnline(device string, port int) {
method startOfflinePcap (line 57) | func (l *listener) startOfflinePcap(path string) {
method startOfflineCommandGob (line 75) | func (l *listener) startOfflineCommandGob(path string) {
method run (line 120) | func (l *listener) run() {
method stop (line 143) | func (l *listener) stop() {
method processPacket (line 148) | func (l *listener) processPacket(packet gopacket.Packet) {
method onReliableCommand (line 178) | func (l *listener) onReliableCommand(command *photon.PhotonCommand) {
function newListener (line 27) | func newListener(router *Router) *listener {
FILE: client/net_interface_filter.go
function isPhysicalInterface (line 25) | func isPhysicalInterface(addr string) bool {
FILE: client/net_interface_filter_nix_darw.go
function getAllPhysicalInterface (line 10) | func getAllPhysicalInterface() ([]string, error) {
FILE: client/net_interface_filter_win.go
constant IfOperStatusUp (line 17) | IfOperStatusUp = 1
constant IF_TYPE_SOFTWARE_LOOPBACK (line 18) | IF_TYPE_SOFTWARE_LOOPBACK = 24
constant IF_TYPE_TUNNEL (line 19) | IF_TYPE_TUNNEL = 131
constant hexDigit (line 22) | hexDigit = "0123456789abcdef"
function adapterAddresses (line 24) | func adapterAddresses() ([]*windows.IpAdapterAddresses, error) {
function bytePtrToString (line 50) | func bytePtrToString(p *uint8) string {
function physicalAddrToString (line 59) | func physicalAddrToString(physAddr [8]byte) string {
function cStringToString (line 71) | func cStringToString(cs *uint16) (s string) {
function getAllPhysicalInterface (line 86) | func getAllPhysicalInterface() ([]string, error) {
FILE: client/offline.go
function processOffline (line 10) | func processOffline(path string) {
FILE: client/operation_auction_get_item_average_stats.go
type operationAuctionGetItemAverageStats (line 10) | type operationAuctionGetItemAverageStats struct
method Process (line 18) | func (op operationAuctionGetItemAverageStats) Process(state *albionSta...
type operationAuctionGetItemAverageStatsResponse (line 29) | type operationAuctionGetItemAverageStatsResponse struct
method Process (line 36) | func (op operationAuctionGetItemAverageStatsResponse) Process(state *a...
FILE: client/operation_auction_get_offers.go
type operationAuctionGetOffers (line 10) | type operationAuctionGetOffers struct
method Process (line 21) | func (op operationAuctionGetOffers) Process(state *albionState) {
type operationAuctionGetOffersResponse (line 25) | type operationAuctionGetOffersResponse struct
method Process (line 29) | func (op operationAuctionGetOffersResponse) Process(state *albionState) {
FILE: client/operation_auction_get_requests.go
type operationAuctionGetRequestsResponse (line 10) | type operationAuctionGetRequestsResponse struct
method Process (line 14) | func (op operationAuctionGetRequestsResponse) Process(state *albionSta...
FILE: client/operation_get_cluster_map_info.go
type operationGetClusterMapInfo (line 10) | type operationGetClusterMapInfo struct
method Process (line 13) | func (op operationGetClusterMapInfo) Process(state *albionState) {
type operationGetClusterMapInfoResponse (line 17) | type operationGetClusterMapInfoResponse struct
method Process (line 29) | func (op operationGetClusterMapInfoResponse) Process(state *albionStat...
FILE: client/operation_get_game_server_by_cluster.go
type operationGetGameServerByCluster (line 10) | type operationGetGameServerByCluster struct
method Process (line 14) | func (op operationGetGameServerByCluster) Process(state *albionState) {
FILE: client/operation_get_mail_infos.go
type MailInfosLookup (line 12) | type MailInfosLookup
method getMailInfo (line 14) | func (mi MailInfosLookup) getMailInfo(id int) *MailInfo {
type MailInfo (line 23) | type MailInfo struct
method StringArray (line 30) | func (m *MailInfo) StringArray() []string {
method StringExpires (line 39) | func (m *MailInfo) StringExpires() string {
type operationGetMailInfosResponse (line 43) | type operationGetMailInfosResponse struct
method Process (line 50) | func (op operationGetMailInfosResponse) Process(state *albionState) {
FILE: client/operation_gold_market_get_average_info.go
type operationGoldMarketGetAverageInfo (line 8) | type operationGoldMarketGetAverageInfo struct
method Process (line 11) | func (op operationGoldMarketGetAverageInfo) Process(state *albionState) {
type operationGoldMarketGetAverageInfoResponse (line 15) | type operationGoldMarketGetAverageInfoResponse struct
method Process (line 20) | func (op operationGoldMarketGetAverageInfoResponse) Process(state *alb...
FILE: client/operation_join.go
type operationJoinResponse (line 10) | type operationJoinResponse struct
method Process (line 21) | func (op operationJoinResponse) Process(state *albionState) {
FILE: client/operation_read_mail.go
type operationReadMail (line 11) | type operationReadMail struct
method Process (line 16) | func (op operationReadMail) Process(state *albionState) {
function decodeSellNotification (line 50) | func decodeSellNotification(op operationReadMail, body []string) lib.Mar...
function decodeExpiryNotification (line 78) | func decodeExpiryNotification(op operationReadMail, body []string) lib.M...
FILE: client/operation_real_estate_bid_on_auction.go
type operationRealEstateBidOnAuction (line 7) | type operationRealEstateBidOnAuction struct
method Process (line 10) | func (op operationRealEstateBidOnAuction) Process(state *albionState) {
type operationRealEstateBidOnAuctionResponse (line 14) | type operationRealEstateBidOnAuctionResponse struct
method Process (line 17) | func (op operationRealEstateBidOnAuctionResponse) Process(state *albio...
FILE: client/operation_real_estate_get_auction_data.go
type operationRealEstateGetAuctionData (line 7) | type operationRealEstateGetAuctionData struct
method Process (line 11) | func (op operationRealEstateGetAuctionData) Process(state *albionState) {
type operationRealEstateGetAuctionDataResponse (line 15) | type operationRealEstateGetAuctionDataResponse struct
method Process (line 23) | func (op operationRealEstateGetAuctionDataResponse) Process(state *alb...
FILE: client/operations.go
type operation (line 3) | type operation interface
type OperationType (line 16) | type OperationType
constant opUnused (line 19) | opUnused OperationType = iota
constant opPing (line 20) | opPing
constant opJoin (line 21) | opJoin
constant opCreateAccount (line 22) | opCreateAccount
constant opLogin (line 23) | opLogin
constant opSendCrashLog (line 24) | opSendCrashLog
constant opSendTraceRoute (line 25) | opSendTraceRoute
constant opSendVfxStats (line 26) | opSendVfxStats
constant opSendGamePingInfo (line 27) | opSendGamePingInfo
constant opCreateCharacter (line 28) | opCreateCharacter
constant opDeleteCharacter (line 29) | opDeleteCharacter
constant opSelectCharacter (line 30) | opSelectCharacter
constant opGetGameServerByCluster (line 31) | opGetGameServerByCluster
constant opGetActiveSubscription (line 32) | opGetActiveSubscription
constant opGetShopPurchaseUrl (line 33) | opGetShopPurchaseUrl
constant opGetBuyTrialDetails (line 34) | opGetBuyTrialDetails
constant opGetReferralSeasonDetails (line 35) | opGetReferralSeasonDetails
constant opGetReferralLink (line 36) | opGetReferralLink
constant opGetAvailableTrialKeys (line 37) | opGetAvailableTrialKeys
constant opGetShopTilesForCategory (line 38) | opGetShopTilesForCategory
constant opMove (line 39) | opMove
constant opCastStart (line 40) | opCastStart
constant opCastCancel (line 41) | opCastCancel
constant opTerminateToggleSpell (line 42) | opTerminateToggleSpell
constant opChannelingCancel (line 43) | opChannelingCancel
constant opAttackBuildingStart (line 44) | opAttackBuildingStart
constant opInventoryDestroyItem (line 45) | opInventoryDestroyItem
constant opInventoryMoveItem (line 46) | opInventoryMoveItem
constant opInventoryRecoverItem (line 47) | opInventoryRecoverItem
constant opInventoryRecoverAllItems (line 48) | opInventoryRecoverAllItems
constant opInventorySplitStack (line 49) | opInventorySplitStack
constant opInventorySplitStackInto (line 50) | opInventorySplitStackInto
constant opGetClusterData (line 51) | opGetClusterData
constant opChangeCluster (line 52) | opChangeCluster
constant opConsoleCommand (line 53) | opConsoleCommand
constant opChatMessage (line 54) | opChatMessage
constant opReportClientError (line 55) | opReportClientError
constant opRegisterToObject (line 56) | opRegisterToObject
constant opUnRegisterFromObject (line 57) | opUnRegisterFromObject
constant opCraftBuildingChangeSettings (line 58) | opCraftBuildingChangeSettings
constant opCraftBuildingTakeMoney (line 59) | opCraftBuildingTakeMoney
constant opRepairBuildingChangeSettings (line 60) | opRepairBuildingChangeSettings
constant opRepairBuildingTakeMoney (line 61) | opRepairBuildingTakeMoney
constant opActionBuildingChangeSettings (line 62) | opActionBuildingChangeSettings
constant opHarvestStart (line 63) | opHarvestStart
constant opHarvestCancel (line 64) | opHarvestCancel
constant opTakeSilver (line 65) | opTakeSilver
constant opActionOnBuildingStart (line 66) | opActionOnBuildingStart
constant opActionOnBuildingCancel (line 67) | opActionOnBuildingCancel
constant opItemRerollQualityStart (line 68) | opItemRerollQualityStart
constant opItemRerollQualityCancel (line 69) | opItemRerollQualityCancel
constant opInstallResourceStart (line 70) | opInstallResourceStart
constant opInstallResourceCancel (line 71) | opInstallResourceCancel
constant opInstallSilver (line 72) | opInstallSilver
constant opBuildingFillNutrition (line 73) | opBuildingFillNutrition
constant opBuildingChangeRenovationState (line 74) | opBuildingChangeRenovationState
constant opBuildingBuySkin (line 75) | opBuildingBuySkin
constant opBuildingClaim (line 76) | opBuildingClaim
constant opBuildingGiveup (line 77) | opBuildingGiveup
constant opBuildingNutritionSilverStorageDeposit (line 78) | opBuildingNutritionSilverStorageDeposit
constant opBuildingNutritionSilverStorageWithdraw (line 79) | opBuildingNutritionSilverStorageWithdraw
constant opBuildingNutritionSilverRewardSet (line 80) | opBuildingNutritionSilverRewardSet
constant opConstructionSiteCreate (line 81) | opConstructionSiteCreate
constant opPlaceableObjectPlace (line 82) | opPlaceableObjectPlace
constant opPlaceableObjectPlaceCancel (line 83) | opPlaceableObjectPlaceCancel
constant opPlaceableObjectPickup (line 84) | opPlaceableObjectPickup
constant opFurnitureObjectUse (line 85) | opFurnitureObjectUse
constant opFarmableHarvest (line 86) | opFarmableHarvest
constant opFarmableFinishGrownItem (line 87) | opFarmableFinishGrownItem
constant opFarmableDestroy (line 88) | opFarmableDestroy
constant opFarmableGetProduct (line 89) | opFarmableGetProduct
constant opTearDownConstructionSite (line 90) | opTearDownConstructionSite
constant opCastleGateUse (line 91) | opCastleGateUse
constant opAuctionCreateRequest (line 92) | opAuctionCreateRequest
constant opAuctionCreateOffer (line 93) | opAuctionCreateOffer
constant opAuctionGetOffers (line 94) | opAuctionGetOffers
constant opAuctionGetRequests (line 95) | opAuctionGetRequests
constant opAuctionBuyOffer (line 96) | opAuctionBuyOffer
constant opAuctionAbortAuction (line 97) | opAuctionAbortAuction
constant opAuctionModifyAuction (line 98) | opAuctionModifyAuction
constant opAuctionAbortOffer (line 99) | opAuctionAbortOffer
constant opAuctionAbortRequest (line 100) | opAuctionAbortRequest
constant opAuctionSellRequest (line 101) | opAuctionSellRequest
constant opAuctionGetFinishedAuctions (line 102) | opAuctionGetFinishedAuctions
constant opAuctionGetFinishedAuctionsCount (line 103) | opAuctionGetFinishedAuctionsCount
constant opAuctionFetchAuction (line 104) | opAuctionFetchAuction
constant opAuctionGetMyOpenOffers (line 105) | opAuctionGetMyOpenOffers
constant opAuctionGetMyOpenRequests (line 106) | opAuctionGetMyOpenRequests
constant opAuctionGetMyOpenAuctions (line 107) | opAuctionGetMyOpenAuctions
constant opAuctionGetItemAverageStats (line 108) | opAuctionGetItemAverageStats
constant opAuctionGetItemAverageValue (line 109) | opAuctionGetItemAverageValue
constant opContainerOpen (line 110) | opContainerOpen
constant opContainerClose (line 111) | opContainerClose
constant opContainerManageSubContainer (line 112) | opContainerManageSubContainer
constant opRespawn (line 113) | opRespawn
constant opSuicide (line 114) | opSuicide
constant opJoinGuild (line 115) | opJoinGuild
constant opLeaveGuild (line 116) | opLeaveGuild
constant opCreateGuild (line 117) | opCreateGuild
constant opInviteToGuild (line 118) | opInviteToGuild
constant opDeclineGuildInvitation (line 119) | opDeclineGuildInvitation
constant opKickFromGuild (line 120) | opKickFromGuild
constant opDuellingChallengePlayer (line 121) | opDuellingChallengePlayer
constant opDuellingAcceptChallenge (line 122) | opDuellingAcceptChallenge
constant opDuellingDenyChallenge (line 123) | opDuellingDenyChallenge
constant opChangeClusterTax (line 124) | opChangeClusterTax
constant opClaimTerritory (line 125) | opClaimTerritory
constant opGiveUpTerritory (line 126) | opGiveUpTerritory
constant opChangeTerritoryAccessRights (line 127) | opChangeTerritoryAccessRights
constant opGetMonolithInfo (line 128) | opGetMonolithInfo
constant opGetClaimInfo (line 129) | opGetClaimInfo
constant opGetAttackInfo (line 130) | opGetAttackInfo
constant opGetTerritorySeasonPoints (line 131) | opGetTerritorySeasonPoints
constant opGetAttackSchedule (line 132) | opGetAttackSchedule
constant opScheduleAttack (line 133) | opScheduleAttack
constant opGetMatches (line 134) | opGetMatches
constant opGetMatchDetails (line 135) | opGetMatchDetails
constant opJoinMatch (line 136) | opJoinMatch
constant opLeaveMatch (line 137) | opLeaveMatch
constant opChangeChatSettings (line 138) | opChangeChatSettings
constant opLogoutStart (line 139) | opLogoutStart
constant opLogoutCancel (line 140) | opLogoutCancel
constant opClaimOrbStart (line 141) | opClaimOrbStart
constant opClaimOrbCancel (line 142) | opClaimOrbCancel
constant opMatchLootChestOpeningStart (line 143) | opMatchLootChestOpeningStart
constant opMatchLootChestOpeningCancel (line 144) | opMatchLootChestOpeningCancel
constant opDepositToGuildAccount (line 145) | opDepositToGuildAccount
constant opWithdrawalFromAccount (line 146) | opWithdrawalFromAccount
constant opChangeGuildPayUpkeepFlag (line 147) | opChangeGuildPayUpkeepFlag
constant opChangeGuildTax (line 148) | opChangeGuildTax
constant opGetMyTerritories (line 149) | opGetMyTerritories
constant opMorganaCommand (line 150) | opMorganaCommand
constant opGetServerInfo (line 151) | opGetServerInfo
constant opInviteMercenaryToMatch (line 152) | opInviteMercenaryToMatch
constant opSubscribeToCluster (line 153) | opSubscribeToCluster
constant opAnswerMercenaryInvitation (line 154) | opAnswerMercenaryInvitation
constant opGetCharacterEquipment (line 155) | opGetCharacterEquipment
constant opGetCharacterSteamAchievements (line 156) | opGetCharacterSteamAchievements
constant opGetCharacterStats (line 157) | opGetCharacterStats
constant opGetKillHistoryDetails (line 158) | opGetKillHistoryDetails
constant opLearnMasteryLevel (line 159) | opLearnMasteryLevel
constant opReSpecAchievement (line 160) | opReSpecAchievement
constant opChangeAvatar (line 161) | opChangeAvatar
constant opGetRankings (line 162) | opGetRankings
constant opGetRank (line 163) | opGetRank
constant opGetGvgSeasonRankings (line 164) | opGetGvgSeasonRankings
constant opGetGvgSeasonRank (line 165) | opGetGvgSeasonRank
constant opGetGvgSeasonHistoryRankings (line 166) | opGetGvgSeasonHistoryRankings
constant opGetGvgSeasonGuildMemberHistory (line 167) | opGetGvgSeasonGuildMemberHistory
constant opKickFromGvGMatch (line 168) | opKickFromGvGMatch
constant opGetChestLogs (line 169) | opGetChestLogs
constant opGetAccessRightLogs (line 170) | opGetAccessRightLogs
constant opGetGuildAccountLogs (line 171) | opGetGuildAccountLogs
constant opGetGuildAccountLogsLargeAmount (line 172) | opGetGuildAccountLogsLargeAmount
constant opInviteToPlayerTrade (line 173) | opInviteToPlayerTrade
constant opPlayerTradeCancel (line 174) | opPlayerTradeCancel
constant opPlayerTradeInvitationAccept (line 175) | opPlayerTradeInvitationAccept
constant opPlayerTradeAddItem (line 176) | opPlayerTradeAddItem
constant opPlayerTradeRemoveItem (line 177) | opPlayerTradeRemoveItem
constant opPlayerTradeAcceptTrade (line 178) | opPlayerTradeAcceptTrade
constant opPlayerTradeSetSilverOrGold (line 179) | opPlayerTradeSetSilverOrGold
constant opSendMiniMapPing (line 180) | opSendMiniMapPing
constant opStuck (line 181) | opStuck
constant opBuyRealEstate (line 182) | opBuyRealEstate
constant opClaimRealEstate (line 183) | opClaimRealEstate
constant opGiveUpRealEstate (line 184) | opGiveUpRealEstate
constant opChangeRealEstateOutline (line 185) | opChangeRealEstateOutline
constant opGetMailInfos (line 186) | opGetMailInfos
constant opGetMailCount (line 187) | opGetMailCount
constant opReadMail (line 188) | opReadMail
constant opSendNewMail (line 189) | opSendNewMail
constant opDeleteMail (line 190) | opDeleteMail
constant opMarkMailUnread (line 191) | opMarkMailUnread
constant opClaimAttachmentFromMail (line 192) | opClaimAttachmentFromMail
constant opUpdateLfgInfo (line 193) | opUpdateLfgInfo
constant opGetLfgInfos (line 194) | opGetLfgInfos
constant opGetMyGuildLfgInfo (line 195) | opGetMyGuildLfgInfo
constant opGetLfgDescriptionText (line 196) | opGetLfgDescriptionText
constant opLfgApplyToGuild (line 197) | opLfgApplyToGuild
constant opAnswerLfgGuildApplication (line 198) | opAnswerLfgGuildApplication
constant opRegisterChatPeer (line 199) | opRegisterChatPeer
constant opSendChatMessage (line 200) | opSendChatMessage
constant opJoinChatChannel (line 201) | opJoinChatChannel
constant opLeaveChatChannel (line 202) | opLeaveChatChannel
constant opSendWhisperMessage (line 203) | opSendWhisperMessage
constant opSay (line 204) | opSay
constant opPlayEmote (line 205) | opPlayEmote
constant opStopEmote (line 206) | opStopEmote
constant opGetClusterMapInfo (line 207) | opGetClusterMapInfo
constant opAccessRightsChangeSettings (line 208) | opAccessRightsChangeSettings
constant opMount (line 209) | opMount
constant opMountCancel (line 210) | opMountCancel
constant opBuyJourney (line 211) | opBuyJourney
constant opSetSaleStatusForEstate (line 212) | opSetSaleStatusForEstate
constant opResolveGuildOrPlayerName (line 213) | opResolveGuildOrPlayerName
constant opGetRespawnInfos (line 214) | opGetRespawnInfos
constant opMakeHome (line 215) | opMakeHome
constant opLeaveHome (line 216) | opLeaveHome
constant opResurrectionReply (line 217) | opResurrectionReply
constant opAllianceCreate (line 218) | opAllianceCreate
constant opAllianceDisband (line 219) | opAllianceDisband
constant opAllianceGetMemberInfos (line 220) | opAllianceGetMemberInfos
constant opAllianceInvite (line 221) | opAllianceInvite
constant opAllianceAnswerInvitation (line 222) | opAllianceAnswerInvitation
constant opAllianceCancelInvitation (line 223) | opAllianceCancelInvitation
constant opAllianceKickGuild (line 224) | opAllianceKickGuild
constant opAllianceLeave (line 225) | opAllianceLeave
constant opAllianceChangeGoldPaymentFlag (line 226) | opAllianceChangeGoldPaymentFlag
constant opAllianceGetDetailInfo (line 227) | opAllianceGetDetailInfo
constant opGetIslandInfos (line 228) | opGetIslandInfos
constant opAbandonMyIsland (line 229) | opAbandonMyIsland
constant opBuyMyIsland (line 230) | opBuyMyIsland
constant opBuyGuildIsland (line 231) | opBuyGuildIsland
constant opAbandonGuildIsland (line 232) | opAbandonGuildIsland
constant opUpgradeMyIsland (line 233) | opUpgradeMyIsland
constant opUpgradeGuildIsland (line 234) | opUpgradeGuildIsland
constant opMoveMyIsland (line 235) | opMoveMyIsland
constant opMoveGuildIsland (line 236) | opMoveGuildIsland
constant opTerritoryFillNutrition (line 237) | opTerritoryFillNutrition
constant opTeleportBack (line 238) | opTeleportBack
constant opPartyInvitePlayer (line 239) | opPartyInvitePlayer
constant opPartyAnswerInvitation (line 240) | opPartyAnswerInvitation
constant opPartyLeave (line 241) | opPartyLeave
constant opPartyKickPlayer (line 242) | opPartyKickPlayer
constant opPartyMakeLeader (line 243) | opPartyMakeLeader
constant opPartyChangeLootSetting (line 244) | opPartyChangeLootSetting
constant opPartyMarkObject (line 245) | opPartyMarkObject
constant opPartySetRole (line 246) | opPartySetRole
constant opGetGuildMOTD (line 247) | opGetGuildMOTD
constant opSetGuildMOTD (line 248) | opSetGuildMOTD
constant opExitEnterStart (line 249) | opExitEnterStart
constant opExitEnterCancel (line 250) | opExitEnterCancel
constant opQuestGiverRequest (line 251) | opQuestGiverRequest
constant opUnknown233 (line 252) | opUnknown233
constant opGoldMarketGetBuyOffer (line 253) | opGoldMarketGetBuyOffer
constant opGoldMarketGetBuyOfferFromSilver (line 254) | opGoldMarketGetBuyOfferFromSilver
constant opGoldMarketGetSellOffer (line 255) | opGoldMarketGetSellOffer
constant opGoldMarketGetSellOfferFromSilver (line 256) | opGoldMarketGetSellOfferFromSilver
constant opGoldMarketBuyGold (line 257) | opGoldMarketBuyGold
constant opGoldMarketSellGold (line 258) | opGoldMarketSellGold
constant opGoldMarketCreateSellOrder (line 259) | opGoldMarketCreateSellOrder
constant opGoldMarketCreateBuyOrder (line 260) | opGoldMarketCreateBuyOrder
constant opGoldMarketGetInfos (line 261) | opGoldMarketGetInfos
constant opGoldMarketCancelOrder (line 262) | opGoldMarketCancelOrder
constant opUnknown244 (line 263) | opUnknown244
constant opUnknown245 (line 264) | opUnknown245
constant opGoldMarketGetAverageInfo (line 265) | opGoldMarketGetAverageInfo
constant opSiegeCampClaimStart (line 266) | opSiegeCampClaimStart
constant opSiegeCampClaimCancel (line 267) | opSiegeCampClaimCancel
constant opTreasureChestUsingStart (line 268) | opTreasureChestUsingStart
constant opTreasureChestUsingCancel (line 269) | opTreasureChestUsingCancel
constant opUseLootChest (line 270) | opUseLootChest
constant opUseShrine (line 271) | opUseShrine
constant opLaborerStartJob (line 272) | opLaborerStartJob
constant opLaborerTakeJobLoot (line 273) | opLaborerTakeJobLoot
constant opLaborerDismiss (line 274) | opLaborerDismiss
constant opLaborerMove (line 275) | opLaborerMove
constant opLaborerBuyItem (line 276) | opLaborerBuyItem
constant opLaborerUpgrade (line 277) | opLaborerUpgrade
constant opBuyPremium (line 278) | opBuyPremium
constant opBuyTrial (line 279) | opBuyTrial
constant opRealEstateGetAuctionData (line 280) | opRealEstateGetAuctionData
constant opRealEstateBidOnAuction (line 281) | opRealEstateBidOnAuction
constant opGetSiegeCampCooldown (line 282) | opGetSiegeCampCooldown
constant opFriendInvite (line 283) | opFriendInvite
constant opFriendAnswerInvitation (line 284) | opFriendAnswerInvitation
constant opFriendCancelnvitation (line 285) | opFriendCancelnvitation
constant opFriendRemove (line 286) | opFriendRemove
constant opInventoryStack (line 287) | opInventoryStack
constant opInventorySort (line 288) | opInventorySort
constant opEquipmentItemChangeSpell (line 289) | opEquipmentItemChangeSpell
constant opExpeditionRegister (line 290) | opExpeditionRegister
constant opExpeditionRegisterCancel (line 291) | opExpeditionRegisterCancel
constant opJoinExpedition (line 292) | opJoinExpedition
constant opDeclineExpeditionInvitation (line 293) | opDeclineExpeditionInvitation
constant opVoteStart (line 294) | opVoteStart
constant opVoteDoVote (line 295) | opVoteDoVote
constant opRatingDoRate (line 296) | opRatingDoRate
constant opEnteringExpeditionStart (line 297) | opEnteringExpeditionStart
constant opEnteringExpeditionCancel (line 298) | opEnteringExpeditionCancel
constant opActivateExpeditionCheckPoint (line 299) | opActivateExpeditionCheckPoint
constant opArenaRegister (line 300) | opArenaRegister
constant opArenaRegisterCancel (line 301) | opArenaRegisterCancel
constant opArenaLeave (line 302) | opArenaLeave
constant opJoinArenaMatch (line 303) | opJoinArenaMatch
constant opDeclineArenaInvitation (line 304) | opDeclineArenaInvitation
constant opEnteringArenaStart (line 305) | opEnteringArenaStart
constant opEnteringArenaCancel (line 306) | opEnteringArenaCancel
constant opArenaCustomMatch (line 307) | opArenaCustomMatch
constant opArenaCustomMatchCreate (line 308) | opArenaCustomMatchCreate
constant opUpdateCharacterStatement (line 309) | opUpdateCharacterStatement
constant opBoostFarmable (line 310) | opBoostFarmable
constant opGetStrikeHistory (line 311) | opGetStrikeHistory
constant opUseFunction (line 312) | opUseFunction
constant opUsePortalEntrance (line 313) | opUsePortalEntrance
constant opResetPortalBinding (line 314) | opResetPortalBinding
constant opQueryPortalBinding (line 315) | opQueryPortalBinding
constant opClaimPaymentTransaction (line 316) | opClaimPaymentTransaction
constant opChangeUseFlag (line 317) | opChangeUseFlag
constant opClientPerformanceStats (line 318) | opClientPerformanceStats
constant opExtendedHardwareStats (line 319) | opExtendedHardwareStats
constant opClientLowMemoryWarning (line 320) | opClientLowMemoryWarning
constant opTerritoryClaimStart (line 321) | opTerritoryClaimStart
constant opTerritoryClaimCancel (line 322) | opTerritoryClaimCancel
constant opRequestAppStoreProducts (line 323) | opRequestAppStoreProducts
constant opVerifyProductPurchase (line 324) | opVerifyProductPurchase
constant opQueryGuildPlayerStats (line 325) | opQueryGuildPlayerStats
constant opQueryAllianceGuildStats (line 326) | opQueryAllianceGuildStats
constant opTrackAchievements (line 327) | opTrackAchievements
constant opSetAchievementsAutoLearn (line 328) | opSetAchievementsAutoLearn
constant opDepositItemToGuildCurrency (line 329) | opDepositItemToGuildCurrency
constant opWithdrawalItemFromGuildCurrency (line 330) | opWithdrawalItemFromGuildCurrency
constant opAuctionSellSpecificItemRequest (line 331) | opAuctionSellSpecificItemRequest
constant opFishingStart (line 332) | opFishingStart
constant opFishingCasting (line 333) | opFishingCasting
constant opFishingCast (line 334) | opFishingCast
constant opFishingCatch (line 335) | opFishingCatch
constant opFishingPull (line 336) | opFishingPull
constant opFishingGiveLine (line 337) | opFishingGiveLine
constant opFishingFinish (line 338) | opFishingFinish
constant opFishingCancel (line 339) | opFishingCancel
constant opCreateGuildAccessTag (line 340) | opCreateGuildAccessTag
constant opDeleteGuildAccessTag (line 341) | opDeleteGuildAccessTag
constant opRenameGuildAccessTag (line 342) | opRenameGuildAccessTag
constant opFlagGuildAccessTagGuildPermission (line 343) | opFlagGuildAccessTagGuildPermission
constant opAssignGuildAccessTag (line 344) | opAssignGuildAccessTag
constant opRemoveGuildAccessTagFromPlayer (line 345) | opRemoveGuildAccessTagFromPlayer
constant opModifyGuildAccessTagEditors (line 346) | opModifyGuildAccessTagEditors
constant opRequestPublicAccessTags (line 347) | opRequestPublicAccessTags
constant opChangeAccessTagPublicFlag (line 348) | opChangeAccessTagPublicFlag
constant opUpdateGuildAccessTag (line 349) | opUpdateGuildAccessTag
constant opSteamStartMicrotransaction (line 350) | opSteamStartMicrotransaction
constant opSteamFinishMicrotransaction (line 351) | opSteamFinishMicrotransaction
constant opSteamIdHasActiveAccount (line 352) | opSteamIdHasActiveAccount
constant opCheckEmailAccountState (line 353) | opCheckEmailAccountState
constant opLinkAccountToSteamId (line 354) | opLinkAccountToSteamId
constant opBuyGvgSeasonBooster (line 355) | opBuyGvgSeasonBooster
constant opChangeFlaggingPrepare (line 356) | opChangeFlaggingPrepare
constant opOverCharge (line 357) | opOverCharge
constant opOverChargeEnd (line 358) | opOverChargeEnd
constant opRequestTrusted (line 359) | opRequestTrusted
constant opChangeGuildLogo (line 360) | opChangeGuildLogo
constant opPartyFinderRegisterForUpdates (line 361) | opPartyFinderRegisterForUpdates
constant opPartyFinderUnregisterForUpdates (line 362) | opPartyFinderUnregisterForUpdates
constant opPartyFinderEnlistNewPartySearch (line 363) | opPartyFinderEnlistNewPartySearch
constant opPartyFinderDeletePartySearch (line 364) | opPartyFinderDeletePartySearch
constant opPartyFinderChangePartySearch (line 365) | opPartyFinderChangePartySearch
constant opPartyFinderChangeRole (line 366) | opPartyFinderChangeRole
constant opPartyFinderApplyForGroup (line 367) | opPartyFinderApplyForGroup
constant opPartyFinderAcceptOrDeclineApplyForGroup (line 368) | opPartyFinderAcceptOrDeclineApplyForGroup
constant opPartyFinderGetEquipmentSnapshot (line 369) | opPartyFinderGetEquipmentSnapshot
constant opPartyFinderRegisterApplicants (line 370) | opPartyFinderRegisterApplicants
constant opPartyFinderUnregisterApplicants (line 371) | opPartyFinderUnregisterApplicants
constant opPartyFinderFulltextSearch (line 372) | opPartyFinderFulltextSearch
constant opPartyFinderRequestEquipmentSnapshot (line 373) | opPartyFinderRequestEquipmentSnapshot
constant opGetPersonalSeasonTrackerData (line 374) | opGetPersonalSeasonTrackerData
constant opUseConsumableFromInventory (line 375) | opUseConsumableFromInventory
constant opClaimPersonalSeasonReward (line 376) | opClaimPersonalSeasonReward
constant opEasyAntiCheatMessageToServer (line 377) | opEasyAntiCheatMessageToServer
constant opSetNextTutorialState (line 378) | opSetNextTutorialState
constant opAddPlayerToMuteList (line 379) | opAddPlayerToMuteList
constant opRemovePlayerFromMuteList (line 380) | opRemovePlayerFromMuteList
constant opProductShopUserEvent (line 381) | opProductShopUserEvent
constant opGetVanityUnlocks (line 382) | opGetVanityUnlocks
constant opBuyVanityUnlocks (line 383) | opBuyVanityUnlocks
constant opGetMountSkins (line 384) | opGetMountSkins
constant opSetMountSkin (line 385) | opSetMountSkin
constant opSetWardrobe (line 386) | opSetWardrobe
constant opChangeCustomization (line 387) | opChangeCustomization
constant opSetFavoriteIsland (line 388) | opSetFavoriteIsland
constant opGetGuildChallengePoints (line 389) | opGetGuildChallengePoints
constant opTravelToHideout (line 390) | opTravelToHideout
constant opSmartQueueJoin (line 391) | opSmartQueueJoin
constant opSmartQueueLeave (line 392) | opSmartQueueLeave
constant opSmartQueueSelectSpawnCluster (line 393) | opSmartQueueSelectSpawnCluster
constant opUpgradeHideout (line 394) | opUpgradeHideout
constant opInitHideoutAttackStart (line 395) | opInitHideoutAttackStart
constant opInitHideoutAttackCancel (line 396) | opInitHideoutAttackCancel
constant opHideoutFillNutrition (line 397) | opHideoutFillNutrition
constant opHideoutGetInfo (line 398) | opHideoutGetInfo
constant opHideoutGetOwnerInfo (line 399) | opHideoutGetOwnerInfo
constant opHideoutSetTribute (line 400) | opHideoutSetTribute
constant opOpenWorldAttackScheduleStart (line 401) | opOpenWorldAttackScheduleStart
constant opOpenWorldAttackScheduleCancel (line 402) | opOpenWorldAttackScheduleCancel
constant opOpenWorldAttackConquerStart (line 403) | opOpenWorldAttackConquerStart
constant opOpenWorldAttackConquerCancel (line 404) | opOpenWorldAttackConquerCancel
constant opGetOpenWorldAttackDetails (line 405) | opGetOpenWorldAttackDetails
constant opGetNextOpenWorldAttackScheduleTime (line 406) | opGetNextOpenWorldAttackScheduleTime
constant opRecoverVaultFromHideout (line 407) | opRecoverVaultFromHideout
constant opGetGuildEnergyDrainInfo (line 408) | opGetGuildEnergyDrainInfo
constant opChannelingUpdate (line 409) | opChannelingUpdate
FILE: client/operationtype_string.go
function _ (line 7) | func _() {
constant _OperationType_name (line 404) | _OperationType_name = "opUnusedopPingopJoinopCreateAccountopLoginopSendC...
method String (line 408) | func (i OperationType) String() string {
FILE: client/router.go
type Router (line 12) | type Router struct
method run (line 28) | func (r *Router) run() {
function newRouter (line 19) | func newRouter() *Router {
FILE: client/uploader.go
type uploader (line 3) | type uploader interface
FILE: client/uploader_http.go
type httpUploader (line 12) | type httpUploader struct
method sendToIngest (line 25) | func (u *httpUploader) sendToIngest(body []byte, topic string) {
function newHTTPUploader (line 18) | func newHTTPUploader(url string) uploader {
FILE: client/uploader_http_pow.go
type httpUploaderPow (line 18) | type httpUploaderPow struct
method getPow (line 46) | func (u *httpUploaderPow) getPow(target interface{}) {
method uploadWithPow (line 72) | func (u *httpUploaderPow) uploadWithPow(pow Pow, solution string, nats...
method sendToIngest (line 130) | func (u *httpUploaderPow) sendToIngest(body []byte, topic string) {
type Pow (line 23) | type Pow struct
function newHTTPUploaderPow (line 29) | func newHTTPUploaderPow(url string) uploader {
function randomHex (line 97) | func randomHex(n int) (string, error) {
function toBinaryBytes (line 106) | func toBinaryBytes(s string) string {
function solvePow (line 117) | func solvePow(pow Pow) string {
FILE: client/uploader_nats.go
type natsUploader (line 8) | type natsUploader struct
method sendToIngest (line 24) | func (u *natsUploader) sendToIngest(body []byte, topic string) {
function newNATSUploader (line 15) | func newNATSUploader(url string) uploader {
FILE: client/ws_client.go
constant writeWait (line 18) | writeWait = 10 * time.Second
constant pongWait (line 21) | pongWait = 60 * time.Second
constant pingPeriod (line 24) | pingPeriod = (pongWait * 9) / 10
constant maxMessageSize (line 27) | maxMessageSize = 512
type WSClient (line 57) | type WSClient struct
method readPump (line 72) | func (c *WSClient) readPump() {
method writePump (line 98) | func (c *WSClient) writePump() {
function serveWs (line 140) | func serveWs(hub *WSHub, w http.ResponseWriter, r *http.Request) {
FILE: client/ws_hub.go
type WSHub (line 9) | type WSHub struct
method run (line 32) | func (h *WSHub) run() {
function newHub (line 23) | func newHub() *WSHub {
FILE: lib/common.go
type PrivateUpload (line 3) | type PrivateUpload struct
method Personalize (line 8) | func (p *PrivateUpload) Personalize(id CharacterID, name string) {
type PersonalizedUpload (line 13) | type PersonalizedUpload interface
type CharacterID (line 18) | type CharacterID
FILE: lib/gold.go
type GoldPricesUpload (line 9) | type GoldPricesUpload struct
method StringArrays (line 14) | func (g *GoldPricesUpload) StringArrays() [][]string {
FILE: lib/map.go
type MapDataUpload (line 6) | type MapDataUpload struct
method StringArrays (line 18) | func (m *MapDataUpload) StringArrays() [][]string {
FILE: lib/market.go
type MarketOrder (line 6) | type MarketOrder struct
method StringArray (line 19) | func (m *MarketOrder) StringArray() []string {
constant SalesTax (line 34) | SalesTax = 0.03
type MarketNotificationType (line 37) | type MarketNotificationType
constant SalesNotification (line 40) | SalesNotification MarketNotificationType = "SalesNotification"
constant ExpiryNotification (line 41) | ExpiryNotification = "ExpiryNotification"
type MarketNotification (line 44) | type MarketNotification interface
type MarketSellNotification (line 48) | type MarketSellNotification struct
method Type (line 68) | func (m *MarketSellNotification) Type() MarketNotificationType {
type MarketExpiryNotification (line 58) | type MarketExpiryNotification struct
method Type (line 72) | func (m *MarketExpiryNotification) Type() MarketNotificationType {
type MarketNotificationUpload (line 76) | type MarketNotificationUpload struct
type MarketUpload (line 83) | type MarketUpload struct
FILE: lib/marketHistory.go
type Timescale (line 6) | type Timescale
method String (line 17) | func (scale Timescale) String() string {
constant Hours (line 10) | Hours Timescale = 0
constant Days (line 12) | Days Timescale = 1
constant Weeks (line 14) | Weeks Timescale = 2
type MarketHistory (line 33) | type MarketHistory struct
method StringArray (line 42) | func (m *MarketHistory) StringArray() []string {
type MarketHistoriesUpload (line 50) | type MarketHistoriesUpload struct
FILE: lib/nats.go
constant NatsGoldPricesIngest (line 5) | NatsGoldPricesIngest = "goldprices.ingest"
constant NatsGoldPricesDeduped (line 6) | NatsGoldPricesDeduped = "goldprices.deduped"
constant NatsMarketOrdersIngest (line 7) | NatsMarketOrdersIngest = "marketorders.ingest"
constant NatsMarketOrdersDeduped (line 8) | NatsMarketOrdersDeduped = "marketorders.deduped"
constant NatsMarketHistoriesIngest (line 9) | NatsMarketHistoriesIngest = "markethistories.ingest"
constant NatsMarketHistoriesDeduped (line 10) | NatsMarketHistoriesDeduped = "markethistories.deduped"
constant NatsValidMarketOrders (line 11) | NatsValidMarketOrders = "validmarketorders"
constant NatsMapDataIngest (line 12) | NatsMapDataIngest = "mapdata.ingest"
constant NatsMapDataDeduped (line 13) | NatsMapDataDeduped = "mapdata.deduped"
constant NatsSkillData (line 16) | NatsSkillData = "skills"
constant NatsMarketNotifications (line 17) | NatsMarketNotifications = "marketnotifications"
FILE: lib/skills.go
type Skill (line 4) | type Skill struct
type SkillsUpload (line 12) | type SkillsUpload struct
FILE: log/logger.go
function init (line 13) | func init() {
function Context (line 18) | func Context(context interface{}) *logrus.Entry {
function SetOutput (line 23) | func SetOutput(out io.Writer) {
function SetFormatter (line 28) | func SetFormatter(formatter logrus.Formatter) {
function SetLevel (line 33) | func SetLevel(level logrus.Level) {
function GetLevel (line 38) | func GetLevel() logrus.Level {
function AddHook (line 43) | func AddHook(hook logrus.Hook) {
function WithError (line 48) | func WithError(err error) *logrus.Entry {
function WithField (line 57) | func WithField(key string, value interface{}) *logrus.Entry {
function WithFields (line 67) | func WithFields(fields logrus.Fields) *logrus.Entry {
function Debug (line 72) | func Debug(args ...interface{}) {
function Print (line 77) | func Print(args ...interface{}) {
function Info (line 82) | func Info(args ...interface{}) {
function Warn (line 87) | func Warn(args ...interface{}) {
function Warning (line 92) | func Warning(args ...interface{}) {
function Error (line 97) | func Error(args ...interface{}) {
function Panic (line 102) | func Panic(args ...interface{}) {
function Fatal (line 107) | func Fatal(args ...interface{}) {
function Debugf (line 112) | func Debugf(format string, args ...interface{}) {
function Printf (line 117) | func Printf(format string, args ...interface{}) {
function Infof (line 122) | func Infof(format string, args ...interface{}) {
function Warnf (line 127) | func Warnf(format string, args ...interface{}) {
function Warningf (line 132) | func Warningf(format string, args ...interface{}) {
function Errorf (line 137) | func Errorf(format string, args ...interface{}) {
function Panicf (line 142) | func Panicf(format string, args ...interface{}) {
function Fatalf (line 147) | func Fatalf(format string, args ...interface{}) {
function Debugln (line 152) | func Debugln(args ...interface{}) {
function Println (line 157) | func Println(args ...interface{}) {
function Infoln (line 162) | func Infoln(args ...interface{}) {
function Warnln (line 167) | func Warnln(args ...interface{}) {
function Warningln (line 172) | func Warningln(args ...interface{}) {
function Errorln (line 177) | func Errorln(args ...interface{}) {
function Panicln (line 182) | func Panicln(args ...interface{}) {
function Fatalln (line 187) | func Fatalln(args ...interface{}) {
function Writer (line 192) | func Writer() *io.PipeWriter {
function WriterLevel (line 197) | func WriterLevel(level logrus.Level) *io.PipeWriter {
FILE: notification/notification_nix_darw.go
function Push (line 7) | func Push(msg string) {
FILE: notification/notification_win.go
function Push (line 10) | func Push(msg string) {
FILE: systray/systray_others.go
constant CanHideConsole (line 7) | CanHideConsole = false
function HideConsole (line 9) | func HideConsole() {
function ShowConsole (line 13) | func ShowConsole() {
function Run (line 17) | func Run() {
FILE: systray/systray_win.go
function hideConsole (line 18) | func hideConsole() {
function showConsole (line 30) | func showConsole() {
function GetActionTitle (line 42) | func GetActionTitle() string {
function Run (line 50) | func Run() {
function onExit (line 54) | func onExit() {
function onReady (line 58) | func onReady() {
FILE: thirdparty/WpdPack/Include/Packet32.h
type _AirpcapHandle (line 55) | struct _AirpcapHandle
type NetType (line 92) | typedef struct NetType
type bpf_program (line 108) | struct bpf_program
type bpf_insn (line 119) | struct bpf_insn
type bpf_stat (line 132) | struct bpf_stat
type bpf_hdr (line 150) | struct bpf_hdr
type dump_bpf_hdr (line 171) | struct dump_bpf_hdr{
type bpf_stat (line 182) | struct bpf_stat
type npf_if_addr (line 194) | typedef struct npf_if_addr {
type WAN_ADAPTER (line 207) | typedef struct WAN_ADAPTER_INT WAN_ADAPTER;
type WAN_ADAPTER (line 208) | typedef WAN_ADAPTER *PWAN_ADAPTER;
type ADAPTER (line 224) | typedef struct _ADAPTER {
type PACKET (line 265) | typedef struct _PACKET {
type _PACKET_OID_DATA (line 283) | struct _PACKET_OID_DATA {
type PACKET_OID_DATA (line 290) | typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA;
type bpf_program (line 322) | struct bpf_program
type bpf_stat (line 325) | struct bpf_stat
type bpf_stat (line 326) | struct bpf_stat
FILE: thirdparty/WpdPack/Include/Win32-Extensions.h
type pcap_send_queue (line 46) | struct pcap_send_queue
type pcap_send_queue (line 53) | typedef struct pcap_send_queue pcap_send_queue;
type _AirpcapHandle (line 60) | struct _AirpcapHandle
type pcap_pkthdr (line 89) | struct pcap_pkthdr
type pcap_stat (line 95) | struct pcap_stat
type bpf_program (line 103) | struct bpf_program
type pcap_pkthdr (line 103) | struct pcap_pkthdr
FILE: thirdparty/WpdPack/Include/bittypes.h
type u_int8_t (line 35) | typedef unsigned char u_int8_t;
type u_int8_t (line 38) | typedef unsigned int u_int8_t;
type u_int16_t (line 51) | typedef unsigned short u_int16_t;
type u_int16_t (line 54) | typedef unsigned int u_int16_t;
type u_int16_t (line 57) | typedef unsigned char u_int16_t;
type u_int32_t (line 70) | typedef unsigned int u_int32_t;
type u_int32_t (line 73) | typedef unsigned long u_int32_t;
type u_int32_t (line 76) | typedef unsigned short u_int32_t;
type u_int64_t (line 88) | typedef unsigned long long u_int64_t;
type u_int64_t (line 91) | typedef unsigned _int64 u_int64_t;
type _int64 (line 92) | typedef _int64 int64_t;
type u_int64_t (line 94) | typedef unsigned int u_int64_t;
type u_int64_t (line 96) | typedef unsigned long u_int64_t;
type u_int64_t (line 98) | typedef unsigned short u_int64_t;
FILE: thirdparty/WpdPack/Include/ip6_misc.h
type in6_addr (line 42) | struct in6_addr
type sa_family_t (line 62) | typedef unsigned short sa_family_t;
type sockaddr_in6 (line 72) | struct sockaddr_in6
type addrinfo (line 152) | struct addrinfo {
FILE: thirdparty/WpdPack/Include/pcap-stdinc.h
type __int64 (line 86) | typedef __int64 intptr_t;
type _W64 (line 88) | typedef _W64 int intptr_t;
FILE: thirdparty/WpdPack/Include/pcap/bluetooth.h
type pcap_bluetooth_h4_header (line 43) | typedef struct _pcap_bluetooth_h4_header {
FILE: thirdparty/WpdPack/Include/pcap/bpf.h
type bpf_int32 (line 64) | typedef long bpf_int32;
type bpf_u_int32 (line 65) | typedef unsigned long bpf_u_int32;
type bpf_int32 (line 67) | typedef int bpf_int32;
type u_int (line 68) | typedef u_int bpf_u_int32;
type bpf_program (line 88) | struct bpf_program {
type bpf_version (line 104) | struct bpf_version {
type bpf_insn (line 904) | struct bpf_insn {
type bpf_insn (line 918) | struct bpf_insn
type bpf_insn (line 919) | struct bpf_insn
FILE: thirdparty/WpdPack/Include/pcap/namedb.h
type pcap_etherent (line 50) | struct pcap_etherent {
type pcap_etherent (line 57) | struct pcap_etherent
type addrinfo (line 63) | struct addrinfo
FILE: thirdparty/WpdPack/Include/pcap/pcap.h
type bpf_int32 (line 83) | typedef int bpf_int32;
type u_int (line 84) | typedef u_int bpf_u_int32;
type pcap_t (line 87) | typedef struct pcap pcap_t;
type pcap_dumper_t (line 88) | typedef struct pcap_dumper pcap_dumper_t;
type pcap_if_t (line 89) | typedef struct pcap_if pcap_if_t;
type pcap_addr_t (line 90) | typedef struct pcap_addr pcap_addr_t;
type pcap_file_header (line 129) | struct pcap_file_header {
type pcap_direction_t (line 149) | typedef enum {
type pcap_pkthdr (line 167) | struct pcap_pkthdr {
type pcap_stat (line 176) | struct pcap_stat {
type pcap_stat_ex (line 191) | struct pcap_stat_ex {
type pcap_if (line 223) | struct pcap_if {
type pcap_addr (line 236) | struct pcap_addr {
type pcap_pkthdr (line 244) | struct pcap_pkthdr
type pcap_pkthdr (line 302) | struct pcap_pkthdr
type pcap_pkthdr (line 303) | struct pcap_pkthdr
type pcap_stat (line 305) | struct pcap_stat
type bpf_program (line 306) | struct bpf_program
type bpf_program (line 316) | struct bpf_program
type bpf_program (line 318) | struct bpf_program
type bpf_program (line 320) | struct bpf_program
type bpf_program (line 321) | struct bpf_program
type pcap_pkthdr (line 321) | struct pcap_pkthdr
type pcap_pkthdr (line 346) | struct pcap_pkthdr
type bpf_insn (line 354) | struct bpf_insn
type bpf_insn (line 355) | struct bpf_insn
type bpf_insn (line 356) | struct bpf_insn
type bpf_program (line 357) | struct bpf_program
type pcap_stat_ex (line 384) | struct pcap_stat_ex
FILE: thirdparty/WpdPack/Include/pcap/sll.h
type sll_header (line 85) | struct sll_header {
FILE: thirdparty/WpdPack/Include/pcap/usb.h
type pcap_usb_setup (line 59) | typedef struct _usb_setup {
type pcap_usb_header (line 72) | typedef struct _usb_header {
FILE: thirdparty/WpdPack/Include/pcap/vlan.h
type vlan_tag (line 39) | struct vlan_tag {
FILE: thirdparty/WpdPack/Include/remote-ext.h
type pcap_rmtauth (line 338) | struct pcap_rmtauth
type pcap_samp (line 380) | struct pcap_samp
type pcap_rmtauth (line 417) | struct pcap_rmtauth
type pcap_rmtauth (line 420) | struct pcap_rmtauth
type pcap_samp (line 421) | struct pcap_samp
type pcap_rmtauth (line 431) | struct pcap_rmtauth
Condensed preview — 96 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,303K chars).
[
{
"path": ".circleci/config.yml",
"chars": 3343,
"preview": "version: 2\njobs:\n test:\n working_directory: /go/src/github.com/broderickhyman/albiondata-client\n docker:\n - "
},
{
"path": ".editorconfig",
"chars": 797,
"preview": "root = true\n\n###########################################################\n; common\n######################################"
},
{
"path": ".github/FUNDING.yml",
"chars": 386,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".gitignore",
"chars": 136,
"preview": ".idea/\nvendor/\n_vendor-[0-9]*\n.vscode/\n*.exe\n*.gz\n*.zip\n*.pcap\n*.gob\nscripts/albiondata-client\nalbiondata-client-output."
},
{
"path": "LICENSE",
"chars": 1079,
"preview": "MIT License\n\nCopyright (c) 2017 The Albion Data Project\n\nPermission is hereby granted, free of charge, to any person obt"
},
{
"path": "Makefile",
"chars": 203,
"preview": "run:\n\tscripts/run.sh\n\nfmt:\n\tscripts/fmt.sh\n\nvalidate-fmt:\n\tscripts/validate-fmt.sh\n\nbuild-windows:\n\tscripts/build-window"
},
{
"path": "README.md",
"chars": 4358,
"preview": "<!-- [](https://circleci."
},
{
"path": "_config.yml",
"chars": 26,
"preview": "theme: jekyll-theme-merlot"
},
{
"path": "albiondata-client.go",
"chars": 1155,
"preview": "package main\n\nimport (\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/broderickhyman/albiondata-client/client\"\n\t\"github.com/brod"
},
{
"path": "client/albion_state.go",
"chars": 1526,
"preview": "package client\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyman/albiondata-clien"
},
{
"path": "client/albion_watcher.go",
"chars": 1442,
"preview": "package client\n\nimport (\n\t\"time\"\n\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\ntype albionProcessWatcher struct"
},
{
"path": "client/client.go",
"chars": 857,
"preview": "package client\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\nvar version string\n\n//Client struct base\n"
},
{
"path": "client/config.go",
"chars": 6493,
"preview": "package client\n\nimport (\n\t\"flag\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/broderickhyman/albiondata-client/log\"\n\n"
},
{
"path": "client/decode.go",
"chars": 4617,
"preview": "package client\n\nimport (\n\t\"encoding/hex\"\n\t\"reflect\"\n\t\"strconv\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"git"
},
{
"path": "client/dispatcher.go",
"chars": 3606,
"preview": "package client\n\nimport (\n\t\"encoding/json\"\n\t\"net/http\"\n\n\t\"strings\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\""
},
{
"path": "client/event_player_online_status.go",
"chars": 438,
"preview": "package client\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyman/albiondata-clien"
},
{
"path": "client/event_skill_data.go",
"chars": 1156,
"preview": "package client\n\nimport (\n\t\"strconv\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyman/albi"
},
{
"path": "client/events.go",
"chars": 9291,
"preview": "package client\n\n//EventType used to identify event types\n//go:generate stringer -type=EventType\ntype EventType uint16\n\nc"
},
{
"path": "client/eventtype_string.go",
"chars": 25022,
"preview": "// Code generated by \"stringer -type=EventType\"; DO NOT EDIT.\n\npackage client\n\nimport \"strconv\"\n\nfunc _() {\n\t// An \"inva"
},
{
"path": "client/listener.go",
"chars": 6855,
"preview": "package client\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/gob\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/broderickhyman/albiondata-c"
},
{
"path": "client/net_interface_filter.go",
"chars": 1238,
"preview": "package client\n\nimport (\n\t\"strings\"\n)\n\n// Mac Address parts to look for, and identify non physical devices. There may be"
},
{
"path": "client/net_interface_filter_nix_darw.go",
"chars": 596,
"preview": "// +build linux darwin\n\npackage client\n\nimport (\n\t\"net\"\n)\n\n// Gets all physical interfaces based on filter results, igno"
},
{
"path": "client/net_interface_filter_win.go",
"chars": 2923,
"preview": "// +build windows\n\npackage client\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"strings\"\n\t\"syscall\"\n\t\"unicode/utf16\"\n\t\"unsafe\"\n\n\t\"golang.o"
},
{
"path": "client/offline.go",
"chars": 594,
"preview": "package client\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\nfunc processOffli"
},
{
"path": "client/operation_auction_get_item_average_stats.go",
"chars": 3253,
"preview": "package client\n\nimport (\n\t\"sort\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyman/albiond"
},
{
"path": "client/operation_auction_get_offers.go",
"chars": 1484,
"preview": "package client\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyma"
},
{
"path": "client/operation_auction_get_requests.go",
"chars": 962,
"preview": "package client\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyma"
},
{
"path": "client/operation_get_cluster_map_info.go",
"chars": 1509,
"preview": "package client\n\nimport (\n\t\"strconv\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyman/albi"
},
{
"path": "client/operation_get_game_server_by_cluster.go",
"chars": 793,
"preview": "package client\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\ntype operationGetG"
},
{
"path": "client/operation_get_mail_infos.go",
"chars": 1605,
"preview": "package client\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\nvar MailInfos MailInfosLo"
},
{
"path": "client/operation_gold_market_get_average_info.go",
"chars": 809,
"preview": "package client\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyman/albiondata-clien"
},
{
"path": "client/operation_join.go",
"chars": 1190,
"preview": "package client\n\nimport (\n\t\"strconv\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderickhyman/albi"
},
{
"path": "client/operation_read_mail.go",
"chars": 2927,
"preview": "package client\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/broderickhyman/albiondata-client/lib\"\n\t\"github.com/broderic"
},
{
"path": "client/operation_real_estate_bid_on_auction.go",
"chars": 462,
"preview": "package client\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\ntype operationRealEstateBidOnAuction stru"
},
{
"path": "client/operation_real_estate_get_auction_data.go",
"chars": 730,
"preview": "package client\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\ntype operationRealEstateGetAuctionData st"
},
{
"path": "client/operations.go",
"chars": 9313,
"preview": "package client\n\ntype operation interface {\n\tProcess(state *albionState)\n}\n\n// Notes:\n// 2020-08-31 (@phendryx): opAuct"
},
{
"path": "client/operationtype_string.go",
"chars": 23812,
"preview": "// Code generated by \"stringer -type=OperationType\"; DO NOT EDIT.\n\npackage client\n\nimport \"strconv\"\n\nfunc _() {\n\t// An \""
},
{
"path": "client/router.go",
"chars": 1367,
"preview": "package client\n\nimport (\n\t\"encoding/gob\"\n\t\"os\"\n\n\t\"github.com/broderickhyman/albiondata-client/log\"\n\tphoton \"github.com/b"
},
{
"path": "client/uploader.go",
"chars": 85,
"preview": "package client\n\ntype uploader interface {\n\tsendToIngest(body []byte, topic string)\n}\n"
},
{
"path": "client/uploader_http.go",
"chars": 1172,
"preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\n\t\"github.com/broderickhyman/albiondata-client/log\"\n)\n\n"
},
{
"path": "client/uploader_http_pow.go",
"chars": 2993,
"preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\""
},
{
"path": "client/uploader_nats.go",
"chars": 563,
"preview": "package client\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/log\"\n\tnats \"github.com/nats-io/go-nats\"\n)\n\ntype n"
},
{
"path": "client/ws_client.go",
"chars": 3687,
"preview": "// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.\n// Use of this source code is governed by a BSD-st"
},
{
"path": "client/ws_hub.go",
"chars": 1172,
"preview": "// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.\n// Use of this source code is governed by a BSD-st"
},
{
"path": "config.yaml.example",
"chars": 66,
"preview": "EnableWebsockets: False\nAllowedWebsocketHosts:\n - www.example.com"
},
{
"path": "go.mod",
"chars": 1678,
"preview": "module github.com/broderickhyman/albiondata-client\n\ngo 1.16\n\nrequire (\n\tgithub.com/broderickhyman/go-githubupdate v0.0.0"
},
{
"path": "go.sum",
"chars": 38469,
"preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
},
{
"path": "icon/iconwin.go",
"chars": 934081,
"preview": "//+build windows\n\n// File generated by 2goarray v0.1.0 (http://github.com/cratonica/2goarray)\n\npackage icon\n\nvar Data []"
},
{
"path": "icon/make_icon.bat",
"chars": 759,
"preview": "@ECHO OFF\n\nIF \"%GOPATH%\"==\"\" GOTO NOGO\nIF NOT EXIST %GOPATH%\\bin\\2goarray.exe GOTO INSTALL\n:POSTINSTALL\nIF \"%1\"==\"\" GOTO"
},
{
"path": "icon/make_icon.sh",
"chars": 704,
"preview": "#/bin/sh\n\nif [ -z \"$GOPATH\" ]; then\n echo GOPATH environment variable not set\n exit\nfi\n\nif [ ! -e \"$GOPATH/bin/2go"
},
{
"path": "lib/README.md",
"chars": 116,
"preview": "albiondata-client/lib\n=====================\n\nThis package contains the structs needed to work with our json uploads."
},
{
"path": "lib/common.go",
"chars": 422,
"preview": "package lib\n\ntype PrivateUpload struct {\n\tCharacterId CharacterID `json:\"CharacterId\"`\n\tCharacterName string `jso"
},
{
"path": "lib/gold.go",
"chars": 462,
"preview": "package lib\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// GoldPricesUpload contains the current gold prices\ntype GoldPricesUpload struc"
},
{
"path": "lib/map.go",
"chars": 1161,
"preview": "package lib\n\nimport \"fmt\"\n\n// MapDataUpload contains information on zone maps\ntype MapDataUpload struct {\n\tZoneID "
},
{
"path": "lib/market.go",
"chars": 2281,
"preview": "package lib\n\nimport \"fmt\"\n\n// MarketOrder contains an order (offer or request)\ntype MarketOrder struct {\n\tID "
},
{
"path": "lib/marketHistory.go",
"chars": 1731,
"preview": "package lib\n\nimport \"fmt\"\n\n// Timescale represents the three different timescale views available for market history\ntype"
},
{
"path": "lib/nats.go",
"chars": 608,
"preview": "package lib\n\nconst (\n\t// Public Topics\n\tNatsGoldPricesIngest = \"goldprices.ingest\"\n\tNatsGoldPricesDeduped = \""
},
{
"path": "lib/skills.go",
"chars": 352,
"preview": "package lib\n\n// Skill contains a skill\ntype Skill struct {\n\tID int `json:\"Id\"`\n\tLevel int "
},
{
"path": "log/logger.go",
"chars": 5237,
"preview": "package log\n\nimport (\n\t\"io\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\nvar (\n\tlogger *logrus.Entry\n)\n\nfunc init() {\n\tlogger = log"
},
{
"path": "notification/notification_nix_darw.go",
"chars": 165,
"preview": "// +build linux darwin\n\npackage notification\n\nimport \"github.com/ctcpip/notifize\"\n\nfunc Push(msg string) {\n\tnotifize.Dis"
},
{
"path": "notification/notification_win.go",
"chars": 315,
"preview": "// +build windows\n\npackage notification\n\nimport (\n\t\"github.com/broderickhyman/albiondata-client/log\"\n\ttoast \"gopkg.in/to"
},
{
"path": "pkg/nsis/Makefile",
"chars": 690,
"preview": "TOP_SRCDIR = ../..\nPACKAGE = albiondata-client\nPACKAGE_NAME = Albion Data Client\nPACKAGE_BUGREPORT = https://github.com/"
},
{
"path": "pkg/nsis/albiondata-client.nsi",
"chars": 8003,
"preview": "; This file is part of Albion Data Client\n; Copyright (c) 2017 The Albion Data Project\n;\n; See the LICENSE file in th"
},
{
"path": "scripts/build-darwin.sh",
"chars": 1454,
"preview": "#!/usr/bin/env bash\n\nset -eo pipefail\n\napt-get update && apt-get install -y libpcap-dev zip\n\nexport OSXCROSS_NO_INCLUDE_"
},
{
"path": "scripts/build-linux.sh",
"chars": 224,
"preview": "#!/usr/bin/env bash\n\nset -eo pipefail\n\nsudo apt-get install -y libpcap-dev\n\ngo build -ldflags \"-s -w -X main.version=$CI"
},
{
"path": "scripts/build-windows.sh",
"chars": 753,
"preview": "#!/usr/bin/env bash\n\nset -eo pipefail\n\nexport CGO_CPPFLAGS=\"-I $GOPATH/src/github.com/broderickhyman/albiondata-client/t"
},
{
"path": "scripts/fmt.sh",
"chars": 129,
"preview": "#!/usr/bin/env bash\n\necho \"Running goimports to format go files...\"\ngoimports -w $(go list -f {{.Dir}} ./... | grep -v /"
},
{
"path": "scripts/run.command",
"chars": 81,
"preview": "#!/bin/bash\ncd -- \"$(dirname \"$BASH_SOURCE\")\"\nsudo ./albiondata-client-executable"
},
{
"path": "scripts/run.sh",
"chars": 94,
"preview": "#!/usr/bin/env bash\n\nset -e\n\ngo run -ldflags=\"-w -s -X main.version=dev\" albiondata-client.go\n"
},
{
"path": "scripts/validate-fmt.sh",
"chars": 573,
"preview": "#!/usr/bin/env bash\n\nset -e\necho $CIRCLE_TAG\n\nIFS=$'\\n'\nbadFiles=($(goimports -l $(go list -f {{.Dir}} ./... | grep -v /"
},
{
"path": "systray/systray_others.go",
"chars": 186,
"preview": "// +build linux darwin\n\npackage systray\n\nvar ConsoleHidden bool = true\n\nconst CanHideConsole = false\n\nfunc HideConsole()"
},
{
"path": "systray/systray_win.go",
"chars": 1817,
"preview": "// +build windows\n\npackage systray\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/broderickhyman/albiondata-client/client\"\n\n\t\"gith"
},
{
"path": "thirdparty/WpdPack/Include/Packet32.h",
"chars": 16599,
"preview": "/*\n * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)\n * Copyright (c) 2005 - 2007 CACE Technologies, "
},
{
"path": "thirdparty/WpdPack/Include/Win32-Extensions.h",
"chars": 3920,
"preview": "/*\n * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)\n * Copyright (c) 2005 - 2006 CACE Technologies, "
},
{
"path": "thirdparty/WpdPack/Include/bittypes.h",
"chars": 3928,
"preview": "/*\n * Copyright (C) 1999 WIDE Project.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms,"
},
{
"path": "thirdparty/WpdPack/Include/ip6_misc.h",
"chars": 5756,
"preview": "/*\n * Copyright (c) 1993, 1994, 1997\n *\tThe Regents of the University of California. All rights reserved.\n *\n * Redistr"
},
{
"path": "thirdparty/WpdPack/Include/pcap/bluetooth.h",
"chars": 2016,
"preview": "/*\n * Copyright (c) 2006 Paolo Abeni (Italy)\n * All rights reserved.\n *\n * Redistribution and use in source and binary f"
},
{
"path": "thirdparty/WpdPack/Include/pcap/bpf.h",
"chars": 29111,
"preview": "/*-\n * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997\n *\tThe Regents of the University of California. All"
},
{
"path": "thirdparty/WpdPack/Include/pcap/namedb.h",
"chars": 3421,
"preview": "/*\n * Copyright (c) 1994, 1996\n *\tThe Regents of the University of California. All rights reserved.\n *\n * Redistributio"
},
{
"path": "thirdparty/WpdPack/Include/pcap/pcap.h",
"chars": 14058,
"preview": "/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */\n/*\n * Copyright (c) 1993, 1994, 1995, 1996,"
},
{
"path": "thirdparty/WpdPack/Include/pcap/sll.h",
"chars": 5567,
"preview": "/*-\n * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997\n *\tThe Regents of the University of California. All"
},
{
"path": "thirdparty/WpdPack/Include/pcap/usb.h",
"chars": 2925,
"preview": "/*\n * Copyright (c) 2006 Paolo Abeni (Italy)\n * All rights reserved.\n *\n * Redistribution and use in source and binary f"
},
{
"path": "thirdparty/WpdPack/Include/pcap/vlan.h",
"chars": 2155,
"preview": "/*-\n * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997\n *\tThe Regents of the University of California. All"
},
{
"path": "thirdparty/WpdPack/Include/pcap-bpf.h",
"chars": 2393,
"preview": "/*-\n * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997\n *\tThe Regents of the University of California. All"
},
{
"path": "thirdparty/WpdPack/Include/pcap-namedb.h",
"chars": 2125,
"preview": "/*\n * Copyright (c) 1994, 1996\n *\tThe Regents of the University of California. All rights reserved.\n *\n * Redistributio"
},
{
"path": "thirdparty/WpdPack/Include/pcap-stdinc.h",
"chars": 2873,
"preview": "/*\n * Copyright (c) 2002 - 2005 NetGroup, Politecnico di Torino (Italy)\n * Copyright (c) 2005 - 2009 CACE Technologies, "
},
{
"path": "thirdparty/WpdPack/Include/pcap.h",
"chars": 2320,
"preview": "/*\n * Copyright (c) 1993, 1994, 1995, 1996, 1997\n *\tThe Regents of the University of California. All rights reserved.\n "
},
{
"path": "thirdparty/WpdPack/Include/remote-ext.h",
"chars": 14501,
"preview": "/*\n * Copyright (c) 2002 - 2003\n * NetGroup, Politecnico di Torino (Italy)\n * All rights reserved.\n * \n * Redistribution"
},
{
"path": "thirdparty/rcedit/LICENSE",
"chars": 1055,
"preview": "Copyright (c) 2013 GitHub Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this sof"
}
]
// ... and 7 more files (download for full content)
About this extraction
This page contains the full source code of the broderickhyman/albiondata-client GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 96 files (1.2 MB), approximately 857.1k tokens, and a symbol index with 1142 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.