master dc6ec6bc6518 cached
96 files
1.2 MB
857.1k tokens
1142 symbols
1 requests
Download .txt
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
================================================
<!-- [![CircleCI](https://circleci.com/gh/broderickhyman/albiondata-client/tree/master.svg?style=svg)](https://circleci.com/gh/broderickhyman/albiondata-client/tree/master) [![Go Report Card](https://goreportcard.com/badge/github.com/broderickhyman/albiondata-client)](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) [![NuGet](https://img.shields.io/nuget/v/AlbionData.Models.svg)](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
Download .txt
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
Download .txt
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": "<!-- [![CircleCI](https://circleci.com/gh/broderickhyman/albiondata-client/tree/master.svg?style=svg)](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.

Copied to clipboard!