From f918d2397d7d279ca112522569aaa724f342217d Mon Sep 17 00:00:00 2001 From: Matthieu Grieger Date: Mon, 11 Jul 2016 16:03:02 -0700 Subject: [PATCH] Updated vendored dependencies --- CHANGELOG.md | 3 + glide.lock | 10 +- main.go | 2 +- vendor/github.com/hashicorp/hcl/README.md | 17 +- .../github.com/hashicorp/hcl/decoder_test.go | 21 + .../hashicorp/hcl/hcl/parser/parser.go | 34 +- .../hashicorp/hcl/hcl/parser/parser_test.go | 61 +- .../test-fixtures/object_list_comma.hcl | 1 + .../hashicorp/hcl/hcl/printer/printer_test.go | 1 + .../printer/testdata/list_of_objects.golden | 10 + .../printer/testdata/list_of_objects.input | 10 + .../hashicorp/hcl/hcl/scanner/scanner.go | 15 +- .../hashicorp/hcl/hcl/scanner/scanner_test.go | 7 +- .../{hcl => }/test-fixtures/assign_deep.hcl | 0 .../hcl/test-fixtures/list_of_maps.hcl | 4 + .../gumble/gumble/MumbleProto/Mumble.pb.go | 578 +++++++++++++----- .../layeh/gumble/gumble/handlers.go | 25 +- vendor/github.com/layeh/gumble/gumble/ping.go | 11 +- .../layeh/gumble/gumble/varint/read.go | 14 +- .../layeh/gumble/gumble/varint/varint_test.go | 32 + .../layeh/gumble/gumble/varint/write.go | 6 +- .../{gumble_openal.go => stream.go} | 0 .../magiconair/properties/.gitignore | 2 + .../github.com/magiconair/properties/load.go | 139 +++-- .../magiconair/properties/load_test.go | 10 + .../magiconair/properties/properties.go | 20 + .../magiconair/properties/properties_test.go | 14 + 27 files changed, 781 insertions(+), 266 deletions(-) create mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl create mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.golden create mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.input rename vendor/github.com/hashicorp/hcl/{hcl => }/test-fixtures/assign_deep.hcl (100%) create mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/list_of_maps.hcl create mode 100644 vendor/github.com/layeh/gumble/gumble/varint/varint_test.go rename vendor/github.com/layeh/gumble/gumbleopenal/{gumble_openal.go => stream.go} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7abb3f..45aa84b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ MumbleDJ Changelog ================== +### July 11, 2016 -- `v3.1.1` +* Updated vendored dependencies to hopefully address the following issue: https://github.com/matthieugrieger/mumbledj/issues/169. + ### July 10, 2016 -- `v3.1.0` * File path for user `p12` certificate can now be provided for authenticating as a registered user via the `--p12` commandline flag or the `connection.user_p12` configuration value. * Added `!register` command for registering the bot on the server. diff --git a/glide.lock b/glide.lock index 81b4ae9..3e180ba 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 092daa9c068b920c11d1e8d72da8f9e908b15810a75407b8337c1f8154ef0dee -updated: 2016-07-04T10:05:43.753074408-07:00 +hash: b68f7c8a3b59d7dac3e12321ed6a2265b553c2856ae70e0ed5e960ba8412f8d8 +updated: 2016-07-11T16:01:20.19606261-07:00 imports: - name: github.com/antonholmquist/jason version: c23cef7eaa75a6a5b8810120e167bd590d8fd2ab @@ -14,7 +14,7 @@ imports: subpackages: - proto - name: github.com/hashicorp/hcl - version: 61f5143284c041681f76a5b63efcb232aaa94737 + version: 364df430845abef160a0bfb3a59979f746bf4956 subpackages: - hcl/ast - hcl/parser @@ -27,7 +27,7 @@ imports: - name: github.com/layeh/gopus version: 867541549ca5f8b4db2b92fd1dded8711256a27d - name: github.com/layeh/gumble - version: b26208eca4b75d9efdacb068241c68912437bd69 + version: f0a4a2992fa9a969ef90d673374bc63a9b7948ad subpackages: - gumble - gumbleffmpeg @@ -36,7 +36,7 @@ imports: - gumble/MumbleProto - gumble/varint - name: github.com/magiconair/properties - version: c265cfa48dda6474e208715ca93e987829f572f8 + version: e2f061ecfdaca9f35b2e2c12346ffc526f138137 - name: github.com/mitchellh/mapstructure version: d2dd0262208475919e1a362f675cfc0e7c10e905 - name: github.com/Sirupsen/logrus diff --git a/main.go b/main.go index ff55540..9add04a 100644 --- a/main.go +++ b/main.go @@ -32,7 +32,7 @@ func init() { services.DJ = DJ bot.DJ = DJ - DJ.Version = "v3.1.0" + DJ.Version = "v3.1.1" logrus.SetLevel(logrus.WarnLevel) } diff --git a/vendor/github.com/hashicorp/hcl/README.md b/vendor/github.com/hashicorp/hcl/README.md index 3d5b8bd..e292d59 100644 --- a/vendor/github.com/hashicorp/hcl/README.md +++ b/vendor/github.com/hashicorp/hcl/README.md @@ -81,9 +81,20 @@ FOO * Boolean values: `true`, `false` * Arrays can be made by wrapping it in `[]`. Example: - `["foo", "bar", 42]`. Arrays can contain primitives - and other arrays, but cannot contain objects. Objects must - use the block syntax shown below. + `["foo", "bar", 42]`. Arrays can contain primitives, + other arrays, and objects. As an alternative, lists + of objects can be created with repeated blocks, using + this structure: + + ```hcl + service { + key = "value" + } + + service { + key = "value" + } + ``` Objects and nested objects are created using the structure shown below: diff --git a/vendor/github.com/hashicorp/hcl/decoder_test.go b/vendor/github.com/hashicorp/hcl/decoder_test.go index 3d1eee1..a53b15b 100644 --- a/vendor/github.com/hashicorp/hcl/decoder_test.go +++ b/vendor/github.com/hashicorp/hcl/decoder_test.go @@ -194,6 +194,27 @@ func TestDecode_interface(t *testing.T) { }, }, }, + { + "list_of_maps.hcl", + false, + map[string]interface{}{ + "foo": []interface{}{ + map[string]interface{}{"somekey1": "someval1"}, + map[string]interface{}{"somekey2": "someval2", "someextrakey": "someextraval"}, + }, + }, + }, + { + "assign_deep.hcl", + false, + map[string]interface{}{ + "resource": []interface{}{ + map[string]interface{}{ + "foo": []interface{}{ + map[string]interface{}{ + "bar": []map[string]interface{}{ + map[string]interface{}{}}}}}}}, + }, { "structure_list.hcl", false, diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go index 37a72ac..f46ed4c 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go @@ -79,6 +79,13 @@ func (p *Parser) objectList() (*ast.ObjectList, error) { } node.Add(n) + + // object lists can be optionally comma-delimited e.g. when a list of maps + // is being expressed, so a comma is allowed here - it's simply consumed + tok := p.scan() + if tok.Type != token.COMMA { + p.unscan() + } } return node, nil } @@ -311,15 +318,20 @@ func (p *Parser) listType() (*ast.ListType, error) { needComma := false for { tok := p.scan() - switch tok.Type { - case token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: - if needComma { + if needComma { + switch tok.Type { + case token.COMMA, token.RBRACK: + default: return nil, &PosError{ Pos: tok.Pos, - Err: fmt.Errorf("unexpected token: %s. Expecting %s", tok.Type, token.COMMA), + Err: fmt.Errorf( + "error parsing list, expected comma or list end, got: %s", + tok.Type), } } - + } + switch tok.Type { + case token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: node, err := p.literalType() if err != nil { return nil, err @@ -343,6 +355,18 @@ func (p *Parser) listType() (*ast.ListType, error) { needComma = false continue + case token.LBRACE: + // Looks like a nested object, so parse it out + node, err := p.objectType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse object within list: %s", err), + } + } + l.Add(node) + needComma = true case token.BOOL: // TODO(arslan) should we support? not supported by HCL yet case token.LBRACK: diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser_test.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser_test.go index cf8416c..ffbb9e1 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/parser_test.go +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser_test.go @@ -6,6 +6,7 @@ import ( "path/filepath" "reflect" "runtime" + "strings" "testing" "github.com/hashicorp/hcl/hcl/ast" @@ -99,6 +100,58 @@ EOF } } +func TestListOfMaps(t *testing.T) { + src := `foo = [ + {key = "bar"}, + {key = "baz", key2 = "qux"}, + ]` + p := newParser([]byte(src)) + + file, err := p.Parse() + if err != nil { + t.Fatalf("err: %s", err) + } + + // Here we make all sorts of assumptions about the input structure w/ type + // assertions. The intent is only for this to be a "smoke test" ensuring + // parsing actually performed its duty - giving this test something a bit + // more robust than _just_ "no error occurred". + expected := []string{`"bar"`, `"baz"`, `"qux"`} + actual := make([]string, 0, 3) + ol := file.Node.(*ast.ObjectList) + objItem := ol.Items[0] + list := objItem.Val.(*ast.ListType) + for _, node := range list.List { + obj := node.(*ast.ObjectType) + for _, item := range obj.List.Items { + val := item.Val.(*ast.LiteralType) + actual = append(actual, val.Token.Text) + } + + } + if !reflect.DeepEqual(expected, actual) { + t.Fatalf("Expected: %#v, got %#v", expected, actual) + } +} + +func TestListOfMaps_requiresComma(t *testing.T) { + src := `foo = [ + {key = "bar"} + {key = "baz"} + ]` + p := newParser([]byte(src)) + + _, err := p.Parse() + if err == nil { + t.Fatalf("Expected error, got none!") + } + + expected := "error parsing list, expected comma or list end" + if !strings.Contains(err.Error(), expected) { + t.Fatalf("Expected err:\n %s\nTo contain:\n %s\n", err, expected) + } +} + func TestObjectType(t *testing.T) { var literals = []struct { src string @@ -263,6 +316,10 @@ func TestParse(t *testing.T) { "multiple.hcl", false, }, + { + "object_list_comma.hcl", + false, + }, { "structure.hcl", false, @@ -279,10 +336,6 @@ func TestParse(t *testing.T) { "complex.hcl", false, }, - { - "assign_deep.hcl", - true, - }, { "types.hcl", false, diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl new file mode 100644 index 0000000..1921ec8 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl @@ -0,0 +1 @@ +foo = {one = 1, two = 2} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go index 9572f27..abb22a3 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go @@ -35,6 +35,7 @@ var data = []entry{ {"comment_aligned.input", "comment_aligned.golden"}, {"comment_standalone.input", "comment_standalone.golden"}, {"empty_block.input", "empty_block.golden"}, + {"list_of_objects.input", "list_of_objects.golden"}, } func TestFiles(t *testing.T) { diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.golden new file mode 100644 index 0000000..401ded6 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.golden @@ -0,0 +1,10 @@ +list_of_objects = [ + { + key1 = "value1" + key2 = "value2" + }, + { + key3 = "value3" + key4 = "value4" + }, +] diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.input new file mode 100644 index 0000000..f2adcf0 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.input @@ -0,0 +1,10 @@ +list_of_objects = [ + { + key1 = "value1" + key2 = "value2" + }, + { + key3 = "value3" + key4 = "value4" + } +] \ No newline at end of file diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go index a3f34a7..174119a 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go +++ b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go @@ -525,16 +525,27 @@ func (s *Scanner) scanEscape() rune { // scanDigits scans a rune with the given base for n times. For example an // octal notation \184 would yield in scanDigits(ch, 8, 3) func (s *Scanner) scanDigits(ch rune, base, n int) rune { + start := n for n > 0 && digitVal(ch) < base { ch = s.next() + if ch == eof { + // If we see an EOF, we halt any more scanning of digits + // immediately. + break + } + n-- } if n > 0 { s.err("illegal char escape") } - // we scanned all digits, put the last non digit char back - s.unread() + if n != start { + // we scanned all digits, put the last non digit char back, + // only if we read anything at all + s.unread() + } + return ch } diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner_test.go b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner_test.go index 3c6dd32..d787afd 100644 --- a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner_test.go +++ b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner_test.go @@ -283,6 +283,11 @@ func TestPosition(t *testing.T) { } } +func TestNullChar(t *testing.T) { + s := New([]byte("\"\\0")) + s.Scan() // Used to panic +} + func TestComment(t *testing.T) { testTokenList(t, tokenLists["comment"]) } @@ -378,7 +383,7 @@ func TestRealExample(t *testing.T) { Main interface EOF } - + network_interface { device_index = 1 description = <<-EOF diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_deep.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/assign_deep.hcl similarity index 100% rename from vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_deep.hcl rename to vendor/github.com/hashicorp/hcl/test-fixtures/assign_deep.hcl diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/list_of_maps.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/list_of_maps.hcl new file mode 100644 index 0000000..985a33b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/list_of_maps.hcl @@ -0,0 +1,4 @@ +foo = [ + {somekey1 = "someval1"}, + {somekey2 = "someval2", someextrakey = "someextraval"}, +] diff --git a/vendor/github.com/layeh/gumble/gumble/MumbleProto/Mumble.pb.go b/vendor/github.com/layeh/gumble/gumble/MumbleProto/Mumble.pb.go index 9ed3da7..998318a 100644 --- a/vendor/github.com/layeh/gumble/gumble/MumbleProto/Mumble.pb.go +++ b/vendor/github.com/layeh/gumble/gumble/MumbleProto/Mumble.pb.go @@ -47,10 +47,17 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + type Reject_RejectType int32 const ( - // TODO ?? + // The rejection reason is unknown (details should be available + // in Reject.reason). Reject_None Reject_RejectType = 0 // The client attempted to connect with an incompatible version. Reject_WrongVersion Reject_RejectType = 1 @@ -110,6 +117,7 @@ func (x *Reject_RejectType) UnmarshalJSON(data []byte) error { *x = Reject_RejectType(value) return nil } +func (Reject_RejectType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4, 0} } type PermissionDenied_DenyType int32 @@ -180,6 +188,9 @@ func (x *PermissionDenied_DenyType) UnmarshalJSON(data []byte) error { *x = PermissionDenied_DenyType(value) return nil } +func (PermissionDenied_DenyType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{12, 0} +} type ContextActionModify_Context int32 @@ -219,6 +230,9 @@ func (x *ContextActionModify_Context) UnmarshalJSON(data []byte) error { *x = ContextActionModify_Context(value) return nil } +func (ContextActionModify_Context) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{16, 0} +} type ContextActionModify_Operation int32 @@ -252,6 +266,9 @@ func (x *ContextActionModify_Operation) UnmarshalJSON(data []byte) error { *x = ContextActionModify_Operation(value) return nil } +func (ContextActionModify_Operation) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{16, 1} +} type Version struct { // 2-byte Major, 1-byte Minor and 1-byte Patch version number. @@ -261,13 +278,14 @@ type Version struct { // Client OS name. Os *string `protobuf:"bytes,3,opt,name=os" json:"os,omitempty"` // Client OS version. - OsVersion *string `protobuf:"bytes,4,opt,name=os_version" json:"os_version,omitempty"` + OsVersion *string `protobuf:"bytes,4,opt,name=os_version,json=osVersion" json:"os_version,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } func (m *Version) GetVersion() uint32 { if m != nil && m.Version != nil { @@ -304,9 +322,10 @@ type UDPTunnel struct { XXX_unrecognized []byte `json:"-"` } -func (m *UDPTunnel) Reset() { *m = UDPTunnel{} } -func (m *UDPTunnel) String() string { return proto.CompactTextString(m) } -func (*UDPTunnel) ProtoMessage() {} +func (m *UDPTunnel) Reset() { *m = UDPTunnel{} } +func (m *UDPTunnel) String() string { return proto.CompactTextString(m) } +func (*UDPTunnel) ProtoMessage() {} +func (*UDPTunnel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } func (m *UDPTunnel) GetPacket() []byte { if m != nil { @@ -324,14 +343,15 @@ type Authenticate struct { // Additional access tokens for server ACL groups. Tokens []string `protobuf:"bytes,3,rep,name=tokens" json:"tokens,omitempty"` // A list of CELT bitstream version constants supported by the client. - CeltVersions []int32 `protobuf:"varint,4,rep,name=celt_versions" json:"celt_versions,omitempty"` + CeltVersions []int32 `protobuf:"varint,4,rep,name=celt_versions,json=celtVersions" json:"celt_versions,omitempty"` Opus *bool `protobuf:"varint,5,opt,name=opus,def=0" json:"opus,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *Authenticate) Reset() { *m = Authenticate{} } -func (m *Authenticate) String() string { return proto.CompactTextString(m) } -func (*Authenticate) ProtoMessage() {} +func (m *Authenticate) Reset() { *m = Authenticate{} } +func (m *Authenticate) String() string { return proto.CompactTextString(m) } +func (*Authenticate) ProtoMessage() {} +func (*Authenticate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } const Default_Authenticate_Opus bool = false @@ -385,23 +405,24 @@ type Ping struct { // The amount of nonce resyncs. Resync *uint32 `protobuf:"varint,5,opt,name=resync" json:"resync,omitempty"` // The total amount of UDP packets received. - UdpPackets *uint32 `protobuf:"varint,6,opt,name=udp_packets" json:"udp_packets,omitempty"` + UdpPackets *uint32 `protobuf:"varint,6,opt,name=udp_packets,json=udpPackets" json:"udp_packets,omitempty"` // The total amount of TCP packets received. - TcpPackets *uint32 `protobuf:"varint,7,opt,name=tcp_packets" json:"tcp_packets,omitempty"` + TcpPackets *uint32 `protobuf:"varint,7,opt,name=tcp_packets,json=tcpPackets" json:"tcp_packets,omitempty"` // UDP ping average. - UdpPingAvg *float32 `protobuf:"fixed32,8,opt,name=udp_ping_avg" json:"udp_ping_avg,omitempty"` + UdpPingAvg *float32 `protobuf:"fixed32,8,opt,name=udp_ping_avg,json=udpPingAvg" json:"udp_ping_avg,omitempty"` // UDP ping variance. - UdpPingVar *float32 `protobuf:"fixed32,9,opt,name=udp_ping_var" json:"udp_ping_var,omitempty"` + UdpPingVar *float32 `protobuf:"fixed32,9,opt,name=udp_ping_var,json=udpPingVar" json:"udp_ping_var,omitempty"` // TCP ping average. - TcpPingAvg *float32 `protobuf:"fixed32,10,opt,name=tcp_ping_avg" json:"tcp_ping_avg,omitempty"` + TcpPingAvg *float32 `protobuf:"fixed32,10,opt,name=tcp_ping_avg,json=tcpPingAvg" json:"tcp_ping_avg,omitempty"` // TCP ping variance. - TcpPingVar *float32 `protobuf:"fixed32,11,opt,name=tcp_ping_var" json:"tcp_ping_var,omitempty"` + TcpPingVar *float32 `protobuf:"fixed32,11,opt,name=tcp_ping_var,json=tcpPingVar" json:"tcp_ping_var,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *Ping) Reset() { *m = Ping{} } -func (m *Ping) String() string { return proto.CompactTextString(m) } -func (*Ping) ProtoMessage() {} +func (m *Ping) Reset() { *m = Ping{} } +func (m *Ping) String() string { return proto.CompactTextString(m) } +func (*Ping) ProtoMessage() {} +func (*Ping) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } func (m *Ping) GetTimestamp() uint64 { if m != nil && m.Timestamp != nil { @@ -489,9 +510,10 @@ type Reject struct { XXX_unrecognized []byte `json:"-"` } -func (m *Reject) Reset() { *m = Reject{} } -func (m *Reject) String() string { return proto.CompactTextString(m) } -func (*Reject) ProtoMessage() {} +func (m *Reject) Reset() { *m = Reject{} } +func (m *Reject) String() string { return proto.CompactTextString(m) } +func (*Reject) ProtoMessage() {} +func (*Reject) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } func (m *Reject) GetType() Reject_RejectType { if m != nil && m.Type != nil { @@ -513,17 +535,18 @@ type ServerSync struct { // The session of the current user. Session *uint32 `protobuf:"varint,1,opt,name=session" json:"session,omitempty"` // Maximum bandwidth that the user should use. - MaxBandwidth *uint32 `protobuf:"varint,2,opt,name=max_bandwidth" json:"max_bandwidth,omitempty"` + MaxBandwidth *uint32 `protobuf:"varint,2,opt,name=max_bandwidth,json=maxBandwidth" json:"max_bandwidth,omitempty"` // Server welcome text. - WelcomeText *string `protobuf:"bytes,3,opt,name=welcome_text" json:"welcome_text,omitempty"` - // Current user permissions TODO: Confirm?? + WelcomeText *string `protobuf:"bytes,3,opt,name=welcome_text,json=welcomeText" json:"welcome_text,omitempty"` + // Current user permissions in the root channel. Permissions *uint64 `protobuf:"varint,4,opt,name=permissions" json:"permissions,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *ServerSync) Reset() { *m = ServerSync{} } -func (m *ServerSync) String() string { return proto.CompactTextString(m) } -func (*ServerSync) ProtoMessage() {} +func (m *ServerSync) Reset() { *m = ServerSync{} } +func (m *ServerSync) String() string { return proto.CompactTextString(m) } +func (*ServerSync) ProtoMessage() {} +func (*ServerSync) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } func (m *ServerSync) GetSession() uint32 { if m != nil && m.Session != nil { @@ -556,13 +579,14 @@ func (m *ServerSync) GetPermissions() uint64 { // Sent by the client when it wants a channel removed. Sent by the server when // a channel has been removed and clients should be notified. type ChannelRemove struct { - ChannelId *uint32 `protobuf:"varint,1,req,name=channel_id" json:"channel_id,omitempty"` + ChannelId *uint32 `protobuf:"varint,1,req,name=channel_id,json=channelId" json:"channel_id,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *ChannelRemove) Reset() { *m = ChannelRemove{} } -func (m *ChannelRemove) String() string { return proto.CompactTextString(m) } -func (*ChannelRemove) ProtoMessage() {} +func (m *ChannelRemove) Reset() { *m = ChannelRemove{} } +func (m *ChannelRemove) String() string { return proto.CompactTextString(m) } +func (*ChannelRemove) ProtoMessage() {} +func (*ChannelRemove) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } func (m *ChannelRemove) GetChannelId() uint32 { if m != nil && m.ChannelId != nil { @@ -576,7 +600,7 @@ func (m *ChannelRemove) GetChannelId() uint32 { // updated. Client may use this message to update said channel properties. type ChannelState struct { // Unique ID for the channel within the server. - ChannelId *uint32 `protobuf:"varint,1,opt,name=channel_id" json:"channel_id,omitempty"` + ChannelId *uint32 `protobuf:"varint,1,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` // channel_id of the parent channel. Parent *uint32 `protobuf:"varint,2,opt,name=parent" json:"parent,omitempty"` // UTF-8 encoded channel name. @@ -588,25 +612,26 @@ type ChannelState struct { // 128 bytes Description *string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` // A collection of channel_id values that should be added to links. - LinksAdd []uint32 `protobuf:"varint,6,rep,name=links_add" json:"links_add,omitempty"` + LinksAdd []uint32 `protobuf:"varint,6,rep,name=links_add,json=linksAdd" json:"links_add,omitempty"` // A collection of channel_id values that should be removed from links. - LinksRemove []uint32 `protobuf:"varint,7,rep,name=links_remove" json:"links_remove,omitempty"` + LinksRemove []uint32 `protobuf:"varint,7,rep,name=links_remove,json=linksRemove" json:"links_remove,omitempty"` // True if the channel is temporary. Temporary *bool `protobuf:"varint,8,opt,name=temporary,def=0" json:"temporary,omitempty"` // Position weight to tweak the channel position in the channel list. Position *int32 `protobuf:"varint,9,opt,name=position,def=0" json:"position,omitempty"` // SHA1 hash of the description if the description is 128 bytes or more. - DescriptionHash []byte `protobuf:"bytes,10,opt,name=description_hash" json:"description_hash,omitempty"` + DescriptionHash []byte `protobuf:"bytes,10,opt,name=description_hash,json=descriptionHash" json:"description_hash,omitempty"` // Maximum number of users allowed in the channel. If this value is zero, // the maximum number of users allowed in the channel is given by the // server's "usersperchannel" setting. - MaxUsers *uint32 `protobuf:"varint,11,opt,name=max_users" json:"max_users,omitempty"` + MaxUsers *uint32 `protobuf:"varint,11,opt,name=max_users,json=maxUsers" json:"max_users,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *ChannelState) Reset() { *m = ChannelState{} } -func (m *ChannelState) String() string { return proto.CompactTextString(m) } -func (*ChannelState) ProtoMessage() {} +func (m *ChannelState) Reset() { *m = ChannelState{} } +func (m *ChannelState) String() string { return proto.CompactTextString(m) } +func (*ChannelState) ProtoMessage() {} +func (*ChannelState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } const Default_ChannelState_Temporary bool = false const Default_ChannelState_Position int32 = 0 @@ -705,9 +730,10 @@ type UserRemove struct { XXX_unrecognized []byte `json:"-"` } -func (m *UserRemove) Reset() { *m = UserRemove{} } -func (m *UserRemove) String() string { return proto.CompactTextString(m) } -func (*UserRemove) ProtoMessage() {} +func (m *UserRemove) Reset() { *m = UserRemove{} } +func (m *UserRemove) String() string { return proto.CompactTextString(m) } +func (*UserRemove) ProtoMessage() {} +func (*UserRemove) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } func (m *UserRemove) GetSession() uint32 { if m != nil && m.Session != nil { @@ -749,9 +775,9 @@ type UserState struct { // User name, UTF-8 encoded. Name *string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"` // Registered user ID if the user is registered. - UserId *uint32 `protobuf:"varint,4,opt,name=user_id" json:"user_id,omitempty"` + UserId *uint32 `protobuf:"varint,4,opt,name=user_id,json=userId" json:"user_id,omitempty"` // Channel on which the user is. - ChannelId *uint32 `protobuf:"varint,5,opt,name=channel_id" json:"channel_id,omitempty"` + ChannelId *uint32 `protobuf:"varint,5,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` // True if the user is muted by admin. Mute *bool `protobuf:"varint,6,opt,name=mute" json:"mute,omitempty"` // True if the user is deafened by admin. @@ -760,33 +786,39 @@ type UserState struct { // being muted. Suppress *bool `protobuf:"varint,8,opt,name=suppress" json:"suppress,omitempty"` // True if the user has muted self. - SelfMute *bool `protobuf:"varint,9,opt,name=self_mute" json:"self_mute,omitempty"` + SelfMute *bool `protobuf:"varint,9,opt,name=self_mute,json=selfMute" json:"self_mute,omitempty"` // True if the user has deafened self. - SelfDeaf *bool `protobuf:"varint,10,opt,name=self_deaf" json:"self_deaf,omitempty"` + SelfDeaf *bool `protobuf:"varint,10,opt,name=self_deaf,json=selfDeaf" json:"self_deaf,omitempty"` // User image if it is less than 128 bytes. Texture []byte `protobuf:"bytes,11,opt,name=texture" json:"texture,omitempty"` - // TODO ?? - PluginContext []byte `protobuf:"bytes,12,opt,name=plugin_context" json:"plugin_context,omitempty"` - // TODO ?? - PluginIdentity *string `protobuf:"bytes,13,opt,name=plugin_identity" json:"plugin_identity,omitempty"` + // The positional audio plugin identifier. + // Positional audio information is only sent to users who share + // identical plugin contexts. + // + // This value is not trasmitted to clients. + PluginContext []byte `protobuf:"bytes,12,opt,name=plugin_context,json=pluginContext" json:"plugin_context,omitempty"` + // The user's plugin-specific identity. + // This value is not transmitted to clients. + PluginIdentity *string `protobuf:"bytes,13,opt,name=plugin_identity,json=pluginIdentity" json:"plugin_identity,omitempty"` // User comment if it is less than 128 bytes. Comment *string `protobuf:"bytes,14,opt,name=comment" json:"comment,omitempty"` // The hash of the user certificate. Hash *string `protobuf:"bytes,15,opt,name=hash" json:"hash,omitempty"` // SHA1 hash of the user comment if it 128 bytes or more. - CommentHash []byte `protobuf:"bytes,16,opt,name=comment_hash" json:"comment_hash,omitempty"` + CommentHash []byte `protobuf:"bytes,16,opt,name=comment_hash,json=commentHash" json:"comment_hash,omitempty"` // SHA1 hash of the user picture if it 128 bytes or more. - TextureHash []byte `protobuf:"bytes,17,opt,name=texture_hash" json:"texture_hash,omitempty"` + TextureHash []byte `protobuf:"bytes,17,opt,name=texture_hash,json=textureHash" json:"texture_hash,omitempty"` // True if the user is a priority speaker. - PrioritySpeaker *bool `protobuf:"varint,18,opt,name=priority_speaker" json:"priority_speaker,omitempty"` + PrioritySpeaker *bool `protobuf:"varint,18,opt,name=priority_speaker,json=prioritySpeaker" json:"priority_speaker,omitempty"` // True if the user is currently recording. Recording *bool `protobuf:"varint,19,opt,name=recording" json:"recording,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *UserState) Reset() { *m = UserState{} } -func (m *UserState) String() string { return proto.CompactTextString(m) } -func (*UserState) ProtoMessage() {} +func (m *UserState) Reset() { *m = UserState{} } +func (m *UserState) String() string { return proto.CompactTextString(m) } +func (*UserState) ProtoMessage() {} +func (*UserState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } func (m *UserState) GetSession() uint32 { if m != nil && m.Session != nil { @@ -933,9 +965,10 @@ type BanList struct { XXX_unrecognized []byte `json:"-"` } -func (m *BanList) Reset() { *m = BanList{} } -func (m *BanList) String() string { return proto.CompactTextString(m) } -func (*BanList) ProtoMessage() {} +func (m *BanList) Reset() { *m = BanList{} } +func (m *BanList) String() string { return proto.CompactTextString(m) } +func (*BanList) ProtoMessage() {} +func (*BanList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } const Default_BanList_Query bool = false @@ -960,7 +993,7 @@ type BanList_BanEntry struct { Mask *uint32 `protobuf:"varint,2,req,name=mask" json:"mask,omitempty"` // User name for identification purposes (does not affect the ban). Name *string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"` - // TODO ?? + // The certificate hash of the banned user. Hash *string `protobuf:"bytes,4,opt,name=hash" json:"hash,omitempty"` // Reason for the ban (does not affect the ban). Reason *string `protobuf:"bytes,5,opt,name=reason" json:"reason,omitempty"` @@ -971,9 +1004,10 @@ type BanList_BanEntry struct { XXX_unrecognized []byte `json:"-"` } -func (m *BanList_BanEntry) Reset() { *m = BanList_BanEntry{} } -func (m *BanList_BanEntry) String() string { return proto.CompactTextString(m) } -func (*BanList_BanEntry) ProtoMessage() {} +func (m *BanList_BanEntry) Reset() { *m = BanList_BanEntry{} } +func (m *BanList_BanEntry) String() string { return proto.CompactTextString(m) } +func (*BanList_BanEntry) ProtoMessage() {} +func (*BanList_BanEntry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10, 0} } func (m *BanList_BanEntry) GetAddress() []byte { if m != nil { @@ -1032,18 +1066,19 @@ type TextMessage struct { Session []uint32 `protobuf:"varint,2,rep,name=session" json:"session,omitempty"` // The channels to which the message is sent, identified by their // channel_ids. - ChannelId []uint32 `protobuf:"varint,3,rep,name=channel_id" json:"channel_id,omitempty"` + ChannelId []uint32 `protobuf:"varint,3,rep,name=channel_id,json=channelId" json:"channel_id,omitempty"` // The root channels when sending message recursively to several channels, // identified by their channel_ids. - TreeId []uint32 `protobuf:"varint,4,rep,name=tree_id" json:"tree_id,omitempty"` + TreeId []uint32 `protobuf:"varint,4,rep,name=tree_id,json=treeId" json:"tree_id,omitempty"` // The UTF-8 encoded message. May be HTML if the server allows. Message *string `protobuf:"bytes,5,req,name=message" json:"message,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *TextMessage) Reset() { *m = TextMessage{} } -func (m *TextMessage) String() string { return proto.CompactTextString(m) } -func (*TextMessage) ProtoMessage() {} +func (m *TextMessage) Reset() { *m = TextMessage{} } +func (m *TextMessage) String() string { return proto.CompactTextString(m) } +func (*TextMessage) ProtoMessage() {} +func (*TextMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } func (m *TextMessage) GetActor() uint32 { if m != nil && m.Actor != nil { @@ -1085,7 +1120,7 @@ type PermissionDenied struct { Permission *uint32 `protobuf:"varint,1,opt,name=permission" json:"permission,omitempty"` // channel_id for the channel where the permission was denied when type is // Permission. - ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id" json:"channel_id,omitempty"` + ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` // The user who was denied permissions, identified by session. Session *uint32 `protobuf:"varint,3,opt,name=session" json:"session,omitempty"` // Textual reason for the denial. @@ -1097,9 +1132,10 @@ type PermissionDenied struct { XXX_unrecognized []byte `json:"-"` } -func (m *PermissionDenied) Reset() { *m = PermissionDenied{} } -func (m *PermissionDenied) String() string { return proto.CompactTextString(m) } -func (*PermissionDenied) ProtoMessage() {} +func (m *PermissionDenied) Reset() { *m = PermissionDenied{} } +func (m *PermissionDenied) String() string { return proto.CompactTextString(m) } +func (*PermissionDenied) ProtoMessage() {} +func (*PermissionDenied) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } func (m *PermissionDenied) GetPermission() uint32 { if m != nil && m.Permission != nil { @@ -1145,9 +1181,9 @@ func (m *PermissionDenied) GetName() string { type ACL struct { // Channel ID of the channel this message affects. - ChannelId *uint32 `protobuf:"varint,1,req,name=channel_id" json:"channel_id,omitempty"` + ChannelId *uint32 `protobuf:"varint,1,req,name=channel_id,json=channelId" json:"channel_id,omitempty"` // True if the channel inherits its parent's ACLs. - InheritAcls *bool `protobuf:"varint,2,opt,name=inherit_acls,def=1" json:"inherit_acls,omitempty"` + InheritAcls *bool `protobuf:"varint,2,opt,name=inherit_acls,json=inheritAcls,def=1" json:"inherit_acls,omitempty"` // User group specifications. Groups []*ACL_ChanGroup `protobuf:"bytes,3,rep,name=groups" json:"groups,omitempty"` // ACL specifications. @@ -1157,9 +1193,10 @@ type ACL struct { XXX_unrecognized []byte `json:"-"` } -func (m *ACL) Reset() { *m = ACL{} } -func (m *ACL) String() string { return proto.CompactTextString(m) } -func (*ACL) ProtoMessage() {} +func (m *ACL) Reset() { *m = ACL{} } +func (m *ACL) String() string { return proto.CompactTextString(m) } +func (*ACL) ProtoMessage() {} +func (*ACL) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } const Default_ACL_InheritAcls bool = true const Default_ACL_Query bool = false @@ -1214,13 +1251,14 @@ type ACL_ChanGroup struct { // has been inherited, identified by user_id. Remove []uint32 `protobuf:"varint,6,rep,name=remove" json:"remove,omitempty"` // Users inherited, identified by user_id. - InheritedMembers []uint32 `protobuf:"varint,7,rep,name=inherited_members" json:"inherited_members,omitempty"` + InheritedMembers []uint32 `protobuf:"varint,7,rep,name=inherited_members,json=inheritedMembers" json:"inherited_members,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *ACL_ChanGroup) Reset() { *m = ACL_ChanGroup{} } -func (m *ACL_ChanGroup) String() string { return proto.CompactTextString(m) } -func (*ACL_ChanGroup) ProtoMessage() {} +func (m *ACL_ChanGroup) Reset() { *m = ACL_ChanGroup{} } +func (m *ACL_ChanGroup) String() string { return proto.CompactTextString(m) } +func (*ACL_ChanGroup) ProtoMessage() {} +func (*ACL_ChanGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13, 0} } const Default_ACL_ChanGroup_Inherited bool = true const Default_ACL_ChanGroup_Inherit bool = true @@ -1277,13 +1315,13 @@ func (m *ACL_ChanGroup) GetInheritedMembers() []uint32 { type ACL_ChanACL struct { // True if this ACL applies to the current channel. - ApplyHere *bool `protobuf:"varint,1,opt,name=apply_here,def=1" json:"apply_here,omitempty"` + ApplyHere *bool `protobuf:"varint,1,opt,name=apply_here,json=applyHere,def=1" json:"apply_here,omitempty"` // True if this ACL applies to the sub channels. - ApplySubs *bool `protobuf:"varint,2,opt,name=apply_subs,def=1" json:"apply_subs,omitempty"` + ApplySubs *bool `protobuf:"varint,2,opt,name=apply_subs,json=applySubs,def=1" json:"apply_subs,omitempty"` // True if the ACL has been inherited from the parent. Inherited *bool `protobuf:"varint,3,opt,name=inherited,def=1" json:"inherited,omitempty"` // ID of the user that is affected by this ACL. - UserId *uint32 `protobuf:"varint,4,opt,name=user_id" json:"user_id,omitempty"` + UserId *uint32 `protobuf:"varint,4,opt,name=user_id,json=userId" json:"user_id,omitempty"` // ID of the group that is affected by this ACL. Group *string `protobuf:"bytes,5,opt,name=group" json:"group,omitempty"` // Bit flag field of the permissions granted by this ACL. @@ -1293,9 +1331,10 @@ type ACL_ChanACL struct { XXX_unrecognized []byte `json:"-"` } -func (m *ACL_ChanACL) Reset() { *m = ACL_ChanACL{} } -func (m *ACL_ChanACL) String() string { return proto.CompactTextString(m) } -func (*ACL_ChanACL) ProtoMessage() {} +func (m *ACL_ChanACL) Reset() { *m = ACL_ChanACL{} } +func (m *ACL_ChanACL) String() string { return proto.CompactTextString(m) } +func (*ACL_ChanACL) ProtoMessage() {} +func (*ACL_ChanACL) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13, 1} } const Default_ACL_ChanACL_ApplyHere bool = true const Default_ACL_ChanACL_ApplySubs bool = true @@ -1361,9 +1400,10 @@ type QueryUsers struct { XXX_unrecognized []byte `json:"-"` } -func (m *QueryUsers) Reset() { *m = QueryUsers{} } -func (m *QueryUsers) String() string { return proto.CompactTextString(m) } -func (*QueryUsers) ProtoMessage() {} +func (m *QueryUsers) Reset() { *m = QueryUsers{} } +func (m *QueryUsers) String() string { return proto.CompactTextString(m) } +func (*QueryUsers) ProtoMessage() {} +func (*QueryUsers) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } func (m *QueryUsers) GetIds() []uint32 { if m != nil { @@ -1387,15 +1427,16 @@ type CryptSetup struct { // Encryption key. Key []byte `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` // Client nonce. - ClientNonce []byte `protobuf:"bytes,2,opt,name=client_nonce" json:"client_nonce,omitempty"` + ClientNonce []byte `protobuf:"bytes,2,opt,name=client_nonce,json=clientNonce" json:"client_nonce,omitempty"` // Server nonce. - ServerNonce []byte `protobuf:"bytes,3,opt,name=server_nonce" json:"server_nonce,omitempty"` + ServerNonce []byte `protobuf:"bytes,3,opt,name=server_nonce,json=serverNonce" json:"server_nonce,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *CryptSetup) Reset() { *m = CryptSetup{} } -func (m *CryptSetup) String() string { return proto.CompactTextString(m) } -func (*CryptSetup) ProtoMessage() {} +func (m *CryptSetup) Reset() { *m = CryptSetup{} } +func (m *CryptSetup) String() string { return proto.CompactTextString(m) } +func (*CryptSetup) ProtoMessage() {} +func (*CryptSetup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } func (m *CryptSetup) GetKey() []byte { if m != nil { @@ -1429,9 +1470,10 @@ type ContextActionModify struct { XXX_unrecognized []byte `json:"-"` } -func (m *ContextActionModify) Reset() { *m = ContextActionModify{} } -func (m *ContextActionModify) String() string { return proto.CompactTextString(m) } -func (*ContextActionModify) ProtoMessage() {} +func (m *ContextActionModify) Reset() { *m = ContextActionModify{} } +func (m *ContextActionModify) String() string { return proto.CompactTextString(m) } +func (*ContextActionModify) ProtoMessage() {} +func (*ContextActionModify) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } func (m *ContextActionModify) GetAction() string { if m != nil && m.Action != nil { @@ -1466,15 +1508,16 @@ type ContextAction struct { // The target User for the action, identified by session. Session *uint32 `protobuf:"varint,1,opt,name=session" json:"session,omitempty"` // The target Channel for the action, identified by channel_id. - ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id" json:"channel_id,omitempty"` + ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` // The action that should be executed. Action *string `protobuf:"bytes,3,req,name=action" json:"action,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *ContextAction) Reset() { *m = ContextAction{} } -func (m *ContextAction) String() string { return proto.CompactTextString(m) } -func (*ContextAction) ProtoMessage() {} +func (m *ContextAction) Reset() { *m = ContextAction{} } +func (m *ContextAction) String() string { return proto.CompactTextString(m) } +func (*ContextAction) ProtoMessage() {} +func (*ContextAction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } func (m *ContextAction) GetSession() uint32 { if m != nil && m.Session != nil { @@ -1504,9 +1547,10 @@ type UserList struct { XXX_unrecognized []byte `json:"-"` } -func (m *UserList) Reset() { *m = UserList{} } -func (m *UserList) String() string { return proto.CompactTextString(m) } -func (*UserList) ProtoMessage() {} +func (m *UserList) Reset() { *m = UserList{} } +func (m *UserList) String() string { return proto.CompactTextString(m) } +func (*UserList) ProtoMessage() {} +func (*UserList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } func (m *UserList) GetUsers() []*UserList_User { if m != nil { @@ -1517,17 +1561,18 @@ func (m *UserList) GetUsers() []*UserList_User { type UserList_User struct { // Registered user ID. - UserId *uint32 `protobuf:"varint,1,req,name=user_id" json:"user_id,omitempty"` + UserId *uint32 `protobuf:"varint,1,req,name=user_id,json=userId" json:"user_id,omitempty"` // Registered user name. Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - LastSeen *string `protobuf:"bytes,3,opt,name=last_seen" json:"last_seen,omitempty"` - LastChannel *uint32 `protobuf:"varint,4,opt,name=last_channel" json:"last_channel,omitempty"` + LastSeen *string `protobuf:"bytes,3,opt,name=last_seen,json=lastSeen" json:"last_seen,omitempty"` + LastChannel *uint32 `protobuf:"varint,4,opt,name=last_channel,json=lastChannel" json:"last_channel,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *UserList_User) Reset() { *m = UserList_User{} } -func (m *UserList_User) String() string { return proto.CompactTextString(m) } -func (*UserList_User) ProtoMessage() {} +func (m *UserList_User) Reset() { *m = UserList_User{} } +func (m *UserList_User) String() string { return proto.CompactTextString(m) } +func (*UserList_User) ProtoMessage() {} +func (*UserList_User) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18, 0} } func (m *UserList_User) GetUserId() uint32 { if m != nil && m.UserId != nil { @@ -1569,9 +1614,10 @@ type VoiceTarget struct { XXX_unrecognized []byte `json:"-"` } -func (m *VoiceTarget) Reset() { *m = VoiceTarget{} } -func (m *VoiceTarget) String() string { return proto.CompactTextString(m) } -func (*VoiceTarget) ProtoMessage() {} +func (m *VoiceTarget) Reset() { *m = VoiceTarget{} } +func (m *VoiceTarget) String() string { return proto.CompactTextString(m) } +func (*VoiceTarget) ProtoMessage() {} +func (*VoiceTarget) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } func (m *VoiceTarget) GetId() uint32 { if m != nil && m.Id != nil { @@ -1590,9 +1636,9 @@ func (m *VoiceTarget) GetTargets() []*VoiceTarget_Target { type VoiceTarget_Target struct { // Users that are included as targets. Session []uint32 `protobuf:"varint,1,rep,name=session" json:"session,omitempty"` - // Channels that are included as targets. - ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id" json:"channel_id,omitempty"` - // TODO ?? + // Channel that is included as a target. + ChannelId *uint32 `protobuf:"varint,2,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` + // ACL group that is included as a target. Group *string `protobuf:"bytes,3,opt,name=group" json:"group,omitempty"` // True if the voice should follow links from the specified channel. Links *bool `protobuf:"varint,4,opt,name=links,def=0" json:"links,omitempty"` @@ -1602,9 +1648,10 @@ type VoiceTarget_Target struct { XXX_unrecognized []byte `json:"-"` } -func (m *VoiceTarget_Target) Reset() { *m = VoiceTarget_Target{} } -func (m *VoiceTarget_Target) String() string { return proto.CompactTextString(m) } -func (*VoiceTarget_Target) ProtoMessage() {} +func (m *VoiceTarget_Target) Reset() { *m = VoiceTarget_Target{} } +func (m *VoiceTarget_Target) String() string { return proto.CompactTextString(m) } +func (*VoiceTarget_Target) ProtoMessage() {} +func (*VoiceTarget_Target) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19, 0} } const Default_VoiceTarget_Target_Links bool = false const Default_VoiceTarget_Target_Children bool = false @@ -1649,7 +1696,7 @@ func (m *VoiceTarget_Target) GetChildren() bool { // channel permissions. type PermissionQuery struct { // channel_id of the channel for which the permissions are queried. - ChannelId *uint32 `protobuf:"varint,1,opt,name=channel_id" json:"channel_id,omitempty"` + ChannelId *uint32 `protobuf:"varint,1,opt,name=channel_id,json=channelId" json:"channel_id,omitempty"` // Channel permissions. Permissions *uint32 `protobuf:"varint,2,opt,name=permissions" json:"permissions,omitempty"` // True if the client should drop its current permission information for all @@ -1658,9 +1705,10 @@ type PermissionQuery struct { XXX_unrecognized []byte `json:"-"` } -func (m *PermissionQuery) Reset() { *m = PermissionQuery{} } -func (m *PermissionQuery) String() string { return proto.CompactTextString(m) } -func (*PermissionQuery) ProtoMessage() {} +func (m *PermissionQuery) Reset() { *m = PermissionQuery{} } +func (m *PermissionQuery) String() string { return proto.CompactTextString(m) } +func (*PermissionQuery) ProtoMessage() {} +func (*PermissionQuery) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } const Default_PermissionQuery_Flush bool = false @@ -1693,14 +1741,15 @@ type CodecVersion struct { // The version of the CELT Beta codec. Beta *int32 `protobuf:"varint,2,req,name=beta" json:"beta,omitempty"` // True if the user should prefer Alpha over Beta. - PreferAlpha *bool `protobuf:"varint,3,req,name=prefer_alpha,def=1" json:"prefer_alpha,omitempty"` + PreferAlpha *bool `protobuf:"varint,3,req,name=prefer_alpha,json=preferAlpha,def=1" json:"prefer_alpha,omitempty"` Opus *bool `protobuf:"varint,4,opt,name=opus,def=0" json:"opus,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *CodecVersion) Reset() { *m = CodecVersion{} } -func (m *CodecVersion) String() string { return proto.CompactTextString(m) } -func (*CodecVersion) ProtoMessage() {} +func (m *CodecVersion) Reset() { *m = CodecVersion{} } +func (m *CodecVersion) String() string { return proto.CompactTextString(m) } +func (*CodecVersion) ProtoMessage() {} +func (*CodecVersion) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } const Default_CodecVersion_PreferAlpha bool = true const Default_CodecVersion_Opus bool = false @@ -1738,30 +1787,30 @@ type UserStats struct { // User whose stats these are. Session *uint32 `protobuf:"varint,1,opt,name=session" json:"session,omitempty"` // True if the message contains only mutable stats (packets, ping). - StatsOnly *bool `protobuf:"varint,2,opt,name=stats_only,def=0" json:"stats_only,omitempty"` + StatsOnly *bool `protobuf:"varint,2,opt,name=stats_only,json=statsOnly,def=0" json:"stats_only,omitempty"` // Full user certificate chain of the user certificate in DER format. Certificates [][]byte `protobuf:"bytes,3,rep,name=certificates" json:"certificates,omitempty"` // Packet statistics for packets received from the client. - FromClient *UserStats_Stats `protobuf:"bytes,4,opt,name=from_client" json:"from_client,omitempty"` + FromClient *UserStats_Stats `protobuf:"bytes,4,opt,name=from_client,json=fromClient" json:"from_client,omitempty"` // Packet statistics for packets sent by the server. - FromServer *UserStats_Stats `protobuf:"bytes,5,opt,name=from_server" json:"from_server,omitempty"` + FromServer *UserStats_Stats `protobuf:"bytes,5,opt,name=from_server,json=fromServer" json:"from_server,omitempty"` // Amount of UDP packets sent. - UdpPackets *uint32 `protobuf:"varint,6,opt,name=udp_packets" json:"udp_packets,omitempty"` + UdpPackets *uint32 `protobuf:"varint,6,opt,name=udp_packets,json=udpPackets" json:"udp_packets,omitempty"` // Amount of TCP packets sent. - TcpPackets *uint32 `protobuf:"varint,7,opt,name=tcp_packets" json:"tcp_packets,omitempty"` + TcpPackets *uint32 `protobuf:"varint,7,opt,name=tcp_packets,json=tcpPackets" json:"tcp_packets,omitempty"` // UDP ping average. - UdpPingAvg *float32 `protobuf:"fixed32,8,opt,name=udp_ping_avg" json:"udp_ping_avg,omitempty"` + UdpPingAvg *float32 `protobuf:"fixed32,8,opt,name=udp_ping_avg,json=udpPingAvg" json:"udp_ping_avg,omitempty"` // UDP ping variance. - UdpPingVar *float32 `protobuf:"fixed32,9,opt,name=udp_ping_var" json:"udp_ping_var,omitempty"` + UdpPingVar *float32 `protobuf:"fixed32,9,opt,name=udp_ping_var,json=udpPingVar" json:"udp_ping_var,omitempty"` // TCP ping average. - TcpPingAvg *float32 `protobuf:"fixed32,10,opt,name=tcp_ping_avg" json:"tcp_ping_avg,omitempty"` + TcpPingAvg *float32 `protobuf:"fixed32,10,opt,name=tcp_ping_avg,json=tcpPingAvg" json:"tcp_ping_avg,omitempty"` // TCP ping variance. - TcpPingVar *float32 `protobuf:"fixed32,11,opt,name=tcp_ping_var" json:"tcp_ping_var,omitempty"` + TcpPingVar *float32 `protobuf:"fixed32,11,opt,name=tcp_ping_var,json=tcpPingVar" json:"tcp_ping_var,omitempty"` // Client version. Version *Version `protobuf:"bytes,12,opt,name=version" json:"version,omitempty"` // A list of CELT bitstream version constants supported by the client of this // user. - CeltVersions []int32 `protobuf:"varint,13,rep,name=celt_versions" json:"celt_versions,omitempty"` + CeltVersions []int32 `protobuf:"varint,13,rep,name=celt_versions,json=celtVersions" json:"celt_versions,omitempty"` // Client IP address. Address []byte `protobuf:"bytes,14,opt,name=address" json:"address,omitempty"` // Bandwith used by this client. @@ -1771,14 +1820,15 @@ type UserStats struct { // Duration since last activity. Idlesecs *uint32 `protobuf:"varint,17,opt,name=idlesecs" json:"idlesecs,omitempty"` // True if the user has a strong certificate. - StrongCertificate *bool `protobuf:"varint,18,opt,name=strong_certificate,def=0" json:"strong_certificate,omitempty"` + StrongCertificate *bool `protobuf:"varint,18,opt,name=strong_certificate,json=strongCertificate,def=0" json:"strong_certificate,omitempty"` Opus *bool `protobuf:"varint,19,opt,name=opus,def=0" json:"opus,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *UserStats) Reset() { *m = UserStats{} } -func (m *UserStats) String() string { return proto.CompactTextString(m) } -func (*UserStats) ProtoMessage() {} +func (m *UserStats) Reset() { *m = UserStats{} } +func (m *UserStats) String() string { return proto.CompactTextString(m) } +func (*UserStats) ProtoMessage() {} +func (*UserStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } const Default_UserStats_StatsOnly bool = false const Default_UserStats_StrongCertificate bool = false @@ -1929,9 +1979,10 @@ type UserStats_Stats struct { XXX_unrecognized []byte `json:"-"` } -func (m *UserStats_Stats) Reset() { *m = UserStats_Stats{} } -func (m *UserStats_Stats) String() string { return proto.CompactTextString(m) } -func (*UserStats_Stats) ProtoMessage() {} +func (m *UserStats_Stats) Reset() { *m = UserStats_Stats{} } +func (m *UserStats_Stats) String() string { return proto.CompactTextString(m) } +func (*UserStats_Stats) ProtoMessage() {} +func (*UserStats_Stats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22, 0} } func (m *UserStats_Stats) GetGood() uint32 { if m != nil && m.Good != nil { @@ -1971,17 +2022,18 @@ func (m *UserStats_Stats) GetResync() uint32 { // normally be transmitted as hashes. type RequestBlob struct { // sessions of the requested UserState textures. - SessionTexture []uint32 `protobuf:"varint,1,rep,name=session_texture" json:"session_texture,omitempty"` + SessionTexture []uint32 `protobuf:"varint,1,rep,name=session_texture,json=sessionTexture" json:"session_texture,omitempty"` // sessions of the requested UserState comments. - SessionComment []uint32 `protobuf:"varint,2,rep,name=session_comment" json:"session_comment,omitempty"` + SessionComment []uint32 `protobuf:"varint,2,rep,name=session_comment,json=sessionComment" json:"session_comment,omitempty"` // channel_ids of the requested ChannelState descriptions. - ChannelDescription []uint32 `protobuf:"varint,3,rep,name=channel_description" json:"channel_description,omitempty"` + ChannelDescription []uint32 `protobuf:"varint,3,rep,name=channel_description,json=channelDescription" json:"channel_description,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *RequestBlob) Reset() { *m = RequestBlob{} } -func (m *RequestBlob) String() string { return proto.CompactTextString(m) } -func (*RequestBlob) ProtoMessage() {} +func (m *RequestBlob) Reset() { *m = RequestBlob{} } +func (m *RequestBlob) String() string { return proto.CompactTextString(m) } +func (*RequestBlob) ProtoMessage() {} +func (*RequestBlob) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } func (m *RequestBlob) GetSessionTexture() []uint32 { if m != nil { @@ -2008,23 +2060,24 @@ func (m *RequestBlob) GetChannelDescription() []uint32 { // details. type ServerConfig struct { // The maximum bandwidth the clients should use. - MaxBandwidth *uint32 `protobuf:"varint,1,opt,name=max_bandwidth" json:"max_bandwidth,omitempty"` + MaxBandwidth *uint32 `protobuf:"varint,1,opt,name=max_bandwidth,json=maxBandwidth" json:"max_bandwidth,omitempty"` // Server welcome text. - WelcomeText *string `protobuf:"bytes,2,opt,name=welcome_text" json:"welcome_text,omitempty"` + WelcomeText *string `protobuf:"bytes,2,opt,name=welcome_text,json=welcomeText" json:"welcome_text,omitempty"` // True if the server allows HTML. - AllowHtml *bool `protobuf:"varint,3,opt,name=allow_html" json:"allow_html,omitempty"` + AllowHtml *bool `protobuf:"varint,3,opt,name=allow_html,json=allowHtml" json:"allow_html,omitempty"` // Maximum text message length. - MessageLength *uint32 `protobuf:"varint,4,opt,name=message_length" json:"message_length,omitempty"` + MessageLength *uint32 `protobuf:"varint,4,opt,name=message_length,json=messageLength" json:"message_length,omitempty"` // Maximum image message length. - ImageMessageLength *uint32 `protobuf:"varint,5,opt,name=image_message_length" json:"image_message_length,omitempty"` + ImageMessageLength *uint32 `protobuf:"varint,5,opt,name=image_message_length,json=imageMessageLength" json:"image_message_length,omitempty"` // The maximum number of users allowed on the server. - MaxUsers *uint32 `protobuf:"varint,6,opt,name=max_users" json:"max_users,omitempty"` + MaxUsers *uint32 `protobuf:"varint,6,opt,name=max_users,json=maxUsers" json:"max_users,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *ServerConfig) Reset() { *m = ServerConfig{} } -func (m *ServerConfig) String() string { return proto.CompactTextString(m) } -func (*ServerConfig) ProtoMessage() {} +func (m *ServerConfig) Reset() { *m = ServerConfig{} } +func (m *ServerConfig) String() string { return proto.CompactTextString(m) } +func (*ServerConfig) ProtoMessage() {} +func (*ServerConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } func (m *ServerConfig) GetMaxBandwidth() uint32 { if m != nil && m.MaxBandwidth != nil { @@ -2077,13 +2130,14 @@ type SuggestConfig struct { // server. Positional *bool `protobuf:"varint,2,opt,name=positional" json:"positional,omitempty"` // True if the administrator suggests push to talk to be used on this server. - PushToTalk *bool `protobuf:"varint,3,opt,name=push_to_talk" json:"push_to_talk,omitempty"` + PushToTalk *bool `protobuf:"varint,3,opt,name=push_to_talk,json=pushToTalk" json:"push_to_talk,omitempty"` XXX_unrecognized []byte `json:"-"` } -func (m *SuggestConfig) Reset() { *m = SuggestConfig{} } -func (m *SuggestConfig) String() string { return proto.CompactTextString(m) } -func (*SuggestConfig) ProtoMessage() {} +func (m *SuggestConfig) Reset() { *m = SuggestConfig{} } +func (m *SuggestConfig) String() string { return proto.CompactTextString(m) } +func (*SuggestConfig) ProtoMessage() {} +func (*SuggestConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } func (m *SuggestConfig) GetVersion() uint32 { if m != nil && m.Version != nil { @@ -2107,8 +2161,198 @@ func (m *SuggestConfig) GetPushToTalk() bool { } func init() { + proto.RegisterType((*Version)(nil), "MumbleProto.Version") + proto.RegisterType((*UDPTunnel)(nil), "MumbleProto.UDPTunnel") + proto.RegisterType((*Authenticate)(nil), "MumbleProto.Authenticate") + proto.RegisterType((*Ping)(nil), "MumbleProto.Ping") + proto.RegisterType((*Reject)(nil), "MumbleProto.Reject") + proto.RegisterType((*ServerSync)(nil), "MumbleProto.ServerSync") + proto.RegisterType((*ChannelRemove)(nil), "MumbleProto.ChannelRemove") + proto.RegisterType((*ChannelState)(nil), "MumbleProto.ChannelState") + proto.RegisterType((*UserRemove)(nil), "MumbleProto.UserRemove") + proto.RegisterType((*UserState)(nil), "MumbleProto.UserState") + proto.RegisterType((*BanList)(nil), "MumbleProto.BanList") + proto.RegisterType((*BanList_BanEntry)(nil), "MumbleProto.BanList.BanEntry") + proto.RegisterType((*TextMessage)(nil), "MumbleProto.TextMessage") + proto.RegisterType((*PermissionDenied)(nil), "MumbleProto.PermissionDenied") + proto.RegisterType((*ACL)(nil), "MumbleProto.ACL") + proto.RegisterType((*ACL_ChanGroup)(nil), "MumbleProto.ACL.ChanGroup") + proto.RegisterType((*ACL_ChanACL)(nil), "MumbleProto.ACL.ChanACL") + proto.RegisterType((*QueryUsers)(nil), "MumbleProto.QueryUsers") + proto.RegisterType((*CryptSetup)(nil), "MumbleProto.CryptSetup") + proto.RegisterType((*ContextActionModify)(nil), "MumbleProto.ContextActionModify") + proto.RegisterType((*ContextAction)(nil), "MumbleProto.ContextAction") + proto.RegisterType((*UserList)(nil), "MumbleProto.UserList") + proto.RegisterType((*UserList_User)(nil), "MumbleProto.UserList.User") + proto.RegisterType((*VoiceTarget)(nil), "MumbleProto.VoiceTarget") + proto.RegisterType((*VoiceTarget_Target)(nil), "MumbleProto.VoiceTarget.Target") + proto.RegisterType((*PermissionQuery)(nil), "MumbleProto.PermissionQuery") + proto.RegisterType((*CodecVersion)(nil), "MumbleProto.CodecVersion") + proto.RegisterType((*UserStats)(nil), "MumbleProto.UserStats") + proto.RegisterType((*UserStats_Stats)(nil), "MumbleProto.UserStats.Stats") + proto.RegisterType((*RequestBlob)(nil), "MumbleProto.RequestBlob") + proto.RegisterType((*ServerConfig)(nil), "MumbleProto.ServerConfig") + proto.RegisterType((*SuggestConfig)(nil), "MumbleProto.SuggestConfig") proto.RegisterEnum("MumbleProto.Reject_RejectType", Reject_RejectType_name, Reject_RejectType_value) proto.RegisterEnum("MumbleProto.PermissionDenied_DenyType", PermissionDenied_DenyType_name, PermissionDenied_DenyType_value) proto.RegisterEnum("MumbleProto.ContextActionModify_Context", ContextActionModify_Context_name, ContextActionModify_Context_value) proto.RegisterEnum("MumbleProto.ContextActionModify_Operation", ContextActionModify_Operation_name, ContextActionModify_Operation_value) } + +func init() { proto.RegisterFile("Mumble.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 2418 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xdc, 0x58, 0x4b, 0x73, 0x23, 0x49, + 0x11, 0xa6, 0xf5, 0xb2, 0x94, 0x92, 0x6c, 0xb9, 0x67, 0x58, 0x84, 0xf7, 0xdd, 0x0b, 0xcb, 0x00, + 0x1b, 0x66, 0x71, 0xec, 0x65, 0x27, 0x82, 0x83, 0xc7, 0xc3, 0xe2, 0x09, 0xc6, 0x5e, 0xd3, 0xf6, + 0xce, 0x1e, 0x38, 0x34, 0x6d, 0x75, 0x59, 0x6a, 0xdc, 0xea, 0x6e, 0xba, 0x5a, 0x9e, 0x55, 0x04, + 0x47, 0xe0, 0x0a, 0x11, 0x1c, 0xb8, 0xf1, 0x03, 0x08, 0x62, 0x23, 0xf8, 0x01, 0x5c, 0xf8, 0x05, + 0xfc, 0x01, 0x2e, 0x5c, 0xb9, 0x11, 0xc1, 0x9d, 0x7c, 0x54, 0xbf, 0x6c, 0xcd, 0xce, 0x72, 0xe5, + 0x22, 0x55, 0x7e, 0x99, 0x5d, 0x95, 0x95, 0x95, 0xaf, 0x2a, 0x18, 0x9d, 0xac, 0x96, 0x97, 0x91, + 0xda, 0x4f, 0xb3, 0x24, 0x4f, 0xec, 0xa1, 0x50, 0x67, 0x44, 0x38, 0x11, 0x6c, 0x3d, 0x53, 0x99, + 0x0e, 0x93, 0xd8, 0x9e, 0xc2, 0xd6, 0x8d, 0x0c, 0xa7, 0xd6, 0x5b, 0xd6, 0x83, 0xb1, 0x5b, 0x90, + 0xc4, 0xc9, 0x54, 0xa4, 0x7c, 0xad, 0xa6, 0x2d, 0xe4, 0x0c, 0xdc, 0x82, 0xb4, 0xb7, 0xa1, 0x95, + 0xe8, 0x69, 0x9b, 0x41, 0x1c, 0xd9, 0xaf, 0x03, 0x24, 0xda, 0x2b, 0xa6, 0xe9, 0x30, 0x3e, 0x48, + 0xb4, 0x59, 0xc2, 0x79, 0x07, 0x06, 0x9f, 0x3c, 0x3e, 0xbb, 0x58, 0xc5, 0xb1, 0x8a, 0xec, 0x57, + 0xa0, 0x97, 0xfa, 0xb3, 0x6b, 0x95, 0xe3, 0x72, 0xad, 0x07, 0x23, 0xd7, 0x50, 0xce, 0x1f, 0x2d, + 0x18, 0x1d, 0xae, 0xf2, 0x85, 0x8a, 0xf3, 0x70, 0xe6, 0xe7, 0xca, 0xde, 0x83, 0xfe, 0x4a, 0xab, + 0x2c, 0xf6, 0x97, 0x8a, 0x35, 0x1b, 0xb8, 0x25, 0x4d, 0xbc, 0xd4, 0xd7, 0xfa, 0x79, 0x92, 0x05, + 0x46, 0xb7, 0x92, 0xa6, 0x05, 0xf2, 0xe4, 0x5a, 0xc5, 0xa4, 0x60, 0x1b, 0x39, 0x86, 0xb2, 0xdf, + 0x81, 0xf1, 0x4c, 0x45, 0x79, 0xa1, 0xa6, 0x46, 0x3d, 0xdb, 0x0f, 0xba, 0xee, 0x88, 0x40, 0xa3, + 0xa9, 0xb6, 0xbf, 0x0e, 0x9d, 0x24, 0x5d, 0xe9, 0x69, 0x17, 0x27, 0xed, 0x3f, 0xec, 0x5e, 0xf9, + 0x91, 0x56, 0x2e, 0x43, 0xce, 0xdf, 0x5a, 0xd0, 0x39, 0x0b, 0xe3, 0xb9, 0xfd, 0x1a, 0x0c, 0xf2, + 0x70, 0xa9, 0x74, 0xee, 0x2f, 0x53, 0xd6, 0xac, 0xe3, 0x56, 0x80, 0x6d, 0x43, 0x67, 0x9e, 0x24, + 0xa2, 0xd6, 0xd8, 0xe5, 0x31, 0x61, 0x11, 0x6e, 0x89, 0x2d, 0x86, 0x18, 0x8d, 0x19, 0x4b, 0x74, + 0xce, 0xd6, 0x22, 0x0c, 0xc7, 0xa4, 0x7a, 0xa6, 0xf4, 0x3a, 0x9e, 0xf1, 0xfa, 0x63, 0xd7, 0x50, + 0xf6, 0x9b, 0x30, 0x5c, 0x05, 0xa9, 0x27, 0x96, 0xd2, 0xd3, 0x1e, 0x33, 0x01, 0xa1, 0x33, 0x41, + 0x48, 0x20, 0x9f, 0x55, 0x02, 0x5b, 0x22, 0x80, 0x50, 0x21, 0xf0, 0x16, 0x8c, 0x78, 0x06, 0xd4, + 0xdf, 0xf3, 0x6f, 0xe6, 0xd3, 0x3e, 0x4a, 0xb4, 0x64, 0x0a, 0x84, 0x0e, 0x6f, 0xe6, 0x0d, 0x89, + 0x1b, 0x3f, 0x9b, 0x0e, 0x1a, 0x12, 0xcf, 0xfc, 0x8c, 0x24, 0x78, 0x91, 0x62, 0x0e, 0x10, 0x09, + 0x5a, 0xa5, 0x9a, 0xa3, 0x94, 0xa0, 0x39, 0x86, 0x0d, 0x09, 0x9c, 0xc3, 0xf9, 0x75, 0x0b, 0x7a, + 0xae, 0xfa, 0xb9, 0x9a, 0xe5, 0xf6, 0x01, 0x74, 0xf2, 0x75, 0x2a, 0x67, 0xbb, 0x7d, 0xf0, 0xc6, + 0x7e, 0xcd, 0x3f, 0xf7, 0x45, 0xc4, 0xfc, 0x5d, 0xa0, 0x94, 0xcb, 0xb2, 0x62, 0x20, 0x5f, 0xa3, + 0x93, 0xc9, 0xa9, 0x1b, 0xca, 0xf9, 0xdc, 0x02, 0xa8, 0x84, 0xed, 0x3e, 0x74, 0x4e, 0x93, 0x58, + 0x4d, 0xbe, 0x62, 0x4f, 0x60, 0xf4, 0x69, 0x96, 0xe0, 0xda, 0x72, 0xc0, 0x13, 0xcb, 0xbe, 0x07, + 0x3b, 0x4f, 0xe2, 0x1b, 0x3f, 0x0a, 0x83, 0x4f, 0x8c, 0x37, 0x4d, 0x5a, 0xf6, 0x0e, 0x0c, 0x59, + 0x8c, 0xa0, 0xb3, 0x4f, 0x27, 0x6d, 0x7b, 0x17, 0xc6, 0x0c, 0x9c, 0xab, 0xec, 0x86, 0xa1, 0x0e, + 0x41, 0xc5, 0x17, 0x4f, 0x62, 0x1c, 0x4d, 0xba, 0x18, 0x07, 0x20, 0x02, 0x1f, 0xad, 0xa2, 0x68, + 0xd2, 0x23, 0x91, 0xd3, 0xe4, 0x48, 0x65, 0x79, 0x78, 0xc5, 0x3e, 0x3c, 0xd9, 0xb2, 0xbf, 0x0a, + 0xbb, 0x35, 0xaf, 0x4e, 0xb2, 0x8f, 0xfc, 0x30, 0x9a, 0xf4, 0x9d, 0xdf, 0x59, 0xc5, 0xa7, 0xe7, + 0x74, 0xc0, 0x18, 0x6a, 0x5a, 0xe9, 0x7a, 0x10, 0x1a, 0x92, 0xbc, 0x76, 0xe9, 0x7f, 0xe6, 0x5d, + 0xfa, 0x71, 0xf0, 0x3c, 0x0c, 0xf2, 0x85, 0xf1, 0xab, 0x11, 0x82, 0x8f, 0x0a, 0xcc, 0x7e, 0x1b, + 0x46, 0xcf, 0x55, 0x34, 0x4b, 0x96, 0xca, 0xcb, 0xd5, 0x67, 0xb9, 0x89, 0xcc, 0xa1, 0xc1, 0x2e, + 0x10, 0xc2, 0xa3, 0x19, 0xa6, 0x2a, 0x5b, 0x86, 0xba, 0xf0, 0x7d, 0x72, 0xdb, 0x3a, 0xe4, 0xec, + 0xc3, 0xf8, 0x68, 0xe1, 0x53, 0x8c, 0xba, 0x6a, 0x99, 0xdc, 0x28, 0x8a, 0xea, 0x99, 0x00, 0x5e, + 0x18, 0x70, 0xb4, 0x8e, 0xdd, 0x81, 0x41, 0x9e, 0x04, 0xce, 0x3f, 0x5a, 0x30, 0x32, 0x1f, 0x9c, + 0xe7, 0xe4, 0xd1, 0xb7, 0xe5, 0xad, 0x86, 0xbc, 0x04, 0x7e, 0x86, 0x86, 0x30, 0x5b, 0x30, 0x14, + 0x05, 0x02, 0xc7, 0xb8, 0x28, 0xcd, 0x63, 0xfb, 0x3e, 0x74, 0xa3, 0x30, 0xbe, 0x96, 0x18, 0x1d, + 0xbb, 0x42, 0xd0, 0x1e, 0x02, 0xa5, 0x67, 0x59, 0x98, 0xe6, 0x64, 0xa9, 0xae, 0xec, 0xb2, 0x06, + 0xd9, 0xaf, 0xc2, 0x80, 0x45, 0x3d, 0x3f, 0x08, 0x30, 0x4c, 0xe8, 0xdb, 0x3e, 0x03, 0x87, 0x41, + 0x40, 0x56, 0x12, 0x66, 0xc6, 0xfb, 0xc3, 0x28, 0x21, 0xfe, 0x90, 0x31, 0xb3, 0x65, 0xcc, 0x54, + 0xb9, 0x5a, 0xa6, 0x49, 0xe6, 0x67, 0x6b, 0x8e, 0x91, 0x32, 0x07, 0x54, 0x38, 0xee, 0xb3, 0x9f, + 0x26, 0x3a, 0x64, 0x1d, 0x28, 0x4a, 0xba, 0x0f, 0xad, 0xf7, 0xdd, 0x12, 0xb2, 0xbf, 0x0d, 0x93, + 0x9a, 0x4a, 0xde, 0xc2, 0xd7, 0x0b, 0x0e, 0x95, 0x91, 0xbb, 0x53, 0xc3, 0x8f, 0x11, 0x26, 0x75, + 0xe9, 0x70, 0x29, 0xad, 0x69, 0x0e, 0x16, 0x54, 0x17, 0x01, 0x72, 0x33, 0xed, 0x5c, 0x01, 0xd0, + 0xc0, 0x68, 0xd6, 0xf0, 0x90, 0x56, 0xdd, 0x43, 0xd0, 0x56, 0xfe, 0x0c, 0x3d, 0xcb, 0x98, 0x55, + 0x88, 0x5a, 0xa4, 0xb4, 0xeb, 0x91, 0x82, 0x01, 0xd1, 0x46, 0x5f, 0xe2, 0xf3, 0xef, 0xbb, 0x34, + 0x74, 0xfe, 0xdc, 0xc1, 0xf4, 0x8c, 0x0b, 0xc9, 0x21, 0xbe, 0xd8, 0x13, 0x37, 0xaf, 0xb3, 0xe9, + 0xf4, 0xbe, 0x06, 0x5b, 0xb4, 0x25, 0xf2, 0x02, 0xc9, 0x6e, 0x3d, 0x22, 0xd1, 0x05, 0x9a, 0x1e, + 0xd2, 0xbd, 0xed, 0x21, 0x38, 0xd7, 0x72, 0x85, 0x69, 0xb2, 0xc7, 0xca, 0xf1, 0x98, 0xb0, 0x40, + 0xf9, 0x57, 0x9c, 0xd2, 0x10, 0xa3, 0x31, 0x65, 0x7f, 0xbd, 0x4a, 0x53, 0x4c, 0x8e, 0x5a, 0x0e, + 0xc9, 0x2d, 0x69, 0x32, 0xa9, 0x56, 0xd1, 0x95, 0xc7, 0x13, 0x0d, 0x0c, 0x13, 0x81, 0x13, 0x9a, + 0xac, 0x60, 0xf2, 0x8c, 0x50, 0x31, 0x1f, 0xd3, 0xac, 0xb8, 0x73, 0x0a, 0x9e, 0x55, 0xa6, 0xf8, + 0x28, 0x46, 0x6e, 0x41, 0xda, 0xdf, 0x84, 0xed, 0x34, 0x5a, 0xcd, 0xc3, 0xd8, 0x9b, 0x25, 0x31, + 0x07, 0xd8, 0x88, 0x05, 0xc6, 0x82, 0x1e, 0x09, 0x68, 0x7f, 0x0b, 0x76, 0x8c, 0x58, 0x18, 0x50, + 0xbc, 0xe7, 0xeb, 0xe9, 0x98, 0xad, 0x62, 0xbe, 0x7e, 0x62, 0x50, 0x5a, 0x09, 0xe3, 0x72, 0x49, + 0xa1, 0xb0, 0x2d, 0x85, 0xd5, 0x90, 0xb4, 0x5b, 0xf6, 0x97, 0x1d, 0xb1, 0x26, 0x8d, 0xc9, 0x6d, + 0x0d, 0x5b, 0x7c, 0x69, 0xc2, 0x6b, 0x0f, 0x0d, 0x76, 0x6c, 0x44, 0x8c, 0xae, 0x22, 0xb2, 0x2b, + 0x22, 0x06, 0x63, 0x11, 0xf4, 0xca, 0x34, 0x0b, 0x93, 0x0c, 0xd7, 0xf7, 0x74, 0xaa, 0xfc, 0x6b, + 0x95, 0x4d, 0x6d, 0xb6, 0xc0, 0x4e, 0x81, 0x9f, 0x0b, 0x4c, 0xf5, 0x2d, 0x53, 0x33, 0x2c, 0xa5, + 0x98, 0xb3, 0xa7, 0xf7, 0x58, 0xa6, 0x02, 0x9c, 0xdf, 0xb4, 0x60, 0x0b, 0x33, 0xcf, 0xd3, 0x10, + 0xeb, 0xd5, 0xf7, 0xa1, 0x83, 0x1e, 0xa4, 0xd1, 0x53, 0xda, 0x0f, 0x86, 0x07, 0xaf, 0x37, 0x52, + 0xb8, 0x91, 0xa1, 0xff, 0x1f, 0xc6, 0x79, 0xb6, 0x76, 0x59, 0x14, 0x8f, 0xa0, 0xfb, 0x8b, 0x95, + 0xc2, 0xe8, 0x6a, 0xd5, 0xa3, 0x4b, 0xb0, 0xbd, 0x3f, 0x59, 0xd0, 0x2f, 0xe4, 0xc9, 0x4a, 0x18, + 0xc5, 0x7c, 0xc8, 0xd2, 0x29, 0x14, 0x24, 0xfb, 0x89, 0xaf, 0xaf, 0x71, 0x0a, 0x0a, 0x04, 0x1e, + 0x6f, 0xf4, 0xc3, 0xc2, 0x9a, 0x9d, 0x9a, 0x35, 0xab, 0xb8, 0xe8, 0x36, 0xe2, 0x02, 0xbd, 0x1b, + 0xeb, 0x77, 0x96, 0xb3, 0xf3, 0x0d, 0x5c, 0x21, 0xc8, 0xd3, 0x82, 0x55, 0xe6, 0x73, 0xa8, 0x4b, + 0x51, 0x2d, 0x69, 0xe7, 0xb7, 0x16, 0x0c, 0x29, 0xb5, 0x9e, 0xa0, 0x4a, 0xfe, 0x5c, 0x55, 0xf1, + 0x61, 0xd5, 0xe3, 0xa3, 0x16, 0x4f, 0x2d, 0xce, 0x37, 0x65, 0x3c, 0x35, 0x83, 0xa1, 0xcd, 0xcc, + 0x5a, 0x30, 0x60, 0x10, 0xe5, 0x99, 0x52, 0x12, 0x44, 0xc4, 0xeb, 0x11, 0x89, 0x0c, 0x9c, 0x71, + 0x29, 0x4b, 0xe2, 0x16, 0x5a, 0xe4, 0x3d, 0x86, 0x74, 0x7e, 0xdf, 0x86, 0xc9, 0x59, 0x99, 0xd1, + 0x1f, 0xab, 0x38, 0x54, 0x81, 0xfd, 0x06, 0x40, 0x95, 0xe5, 0x8d, 0x6e, 0x35, 0xe4, 0x96, 0x1a, + 0xad, 0xdb, 0x31, 0x59, 0xd3, 0xbf, 0xdd, 0xcc, 0x07, 0x95, 0x25, 0x3b, 0x0d, 0x4b, 0x3e, 0x34, + 0x75, 0xbd, 0xcb, 0x75, 0xfd, 0xdd, 0x86, 0x53, 0xdc, 0xd6, 0x6e, 0x1f, 0xff, 0xd6, 0xb5, 0xfa, + 0x5e, 0x9c, 0x62, 0xaf, 0x3a, 0x45, 0xe7, 0xaf, 0xe8, 0x14, 0x85, 0x18, 0x55, 0x76, 0xb2, 0x39, + 0x56, 0x76, 0xac, 0xbd, 0xd5, 0x6c, 0x58, 0xd7, 0xc7, 0x30, 0x38, 0x5f, 0xe1, 0xbe, 0x28, 0x95, + 0x49, 0x45, 0x37, 0xc5, 0xe9, 0x94, 0x4a, 0x7c, 0x9b, 0x00, 0xfa, 0xf2, 0x22, 0x49, 0x9e, 0x62, + 0x5d, 0xc7, 0x7a, 0xbe, 0x05, 0xed, 0xe3, 0x0f, 0x7f, 0x8c, 0x55, 0xfc, 0x3e, 0x4c, 0x2e, 0x8a, + 0xe4, 0x6e, 0xbe, 0xc1, 0x5a, 0xfe, 0x0a, 0xd8, 0x27, 0x34, 0x79, 0x3c, 0x6f, 0x16, 0xf4, 0x11, + 0xf4, 0x69, 0x09, 0x9e, 0xb5, 0x5f, 0x5b, 0x86, 0x5b, 0x80, 0x01, 0x35, 0x1c, 0xa7, 0xd8, 0x09, + 0xe2, 0x67, 0x4f, 0xc3, 0x65, 0x98, 0x4f, 0xc0, 0xf9, 0x55, 0x17, 0xda, 0x87, 0x47, 0x4f, 0x5f, + 0x52, 0x4e, 0x31, 0x7b, 0x8c, 0xc2, 0x78, 0xa1, 0x30, 0x10, 0x3d, 0x7f, 0x16, 0x69, 0x13, 0x1f, + 0x9d, 0x3c, 0x5b, 0x29, 0x77, 0x68, 0x38, 0x87, 0xc8, 0xc0, 0xbe, 0xa9, 0x37, 0xcf, 0x92, 0x55, + 0x2a, 0xfd, 0xed, 0xf0, 0x60, 0xaf, 0x61, 0x61, 0x5c, 0x69, 0x9f, 0x34, 0xfa, 0x11, 0x89, 0xb8, + 0x46, 0xd2, 0x7e, 0x0f, 0x3a, 0x3c, 0x69, 0x87, 0xbf, 0x98, 0x6e, 0xfc, 0x02, 0xff, 0x5d, 0x96, + 0xaa, 0x62, 0xb4, 0xbb, 0x21, 0x46, 0xff, 0x69, 0xc1, 0xa0, 0x5c, 0xa0, 0x3c, 0x30, 0x8b, 0x3d, + 0x51, 0xc2, 0xce, 0x81, 0x81, 0xd1, 0x57, 0x05, 0x8d, 0x6d, 0x54, 0x30, 0x7a, 0xe5, 0x96, 0x21, + 0xd8, 0xad, 0x0a, 0x89, 0x02, 0xb4, 0xdf, 0x85, 0x62, 0xcf, 0x3e, 0x2a, 0x2a, 0xe5, 0xea, 0x96, + 0x31, 0x88, 0x41, 0xe5, 0x8c, 0x4a, 0x7d, 0x97, 0x23, 0x84, 0x86, 0xe2, 0x96, 0x5c, 0xdf, 0xa5, + 0xfe, 0x1b, 0xca, 0xfe, 0x2e, 0xec, 0x96, 0xcb, 0x7b, 0x4b, 0xb5, 0xbc, 0xa4, 0x9a, 0x2b, 0x2d, + 0xc0, 0xa4, 0x64, 0x9c, 0x08, 0xbe, 0xf7, 0x77, 0x0b, 0xb6, 0x8c, 0x4d, 0xb0, 0x27, 0x00, 0x3f, + 0x4d, 0xa3, 0xb5, 0x87, 0x32, 0xd2, 0xad, 0x96, 0xfb, 0x61, 0xfc, 0x18, 0xe1, 0x4a, 0x48, 0xaf, + 0x2e, 0x9b, 0x67, 0x27, 0x42, 0xe7, 0x08, 0x37, 0x0d, 0xd3, 0xde, 0x6c, 0x98, 0x17, 0xd6, 0x4e, + 0x4c, 0x2f, 0x7c, 0x98, 0x26, 0x6f, 0x09, 0x21, 0xa8, 0x1f, 0xe7, 0xe6, 0x4e, 0x20, 0x84, 0x14, + 0xcd, 0x78, 0x6d, 0x52, 0x16, 0x8f, 0x9d, 0x0f, 0x00, 0x7e, 0x42, 0x07, 0xc8, 0xcd, 0x05, 0xd9, + 0x2d, 0x0c, 0x24, 0x71, 0xa3, 0xdd, 0x70, 0x48, 0x33, 0xd1, 0xe9, 0x69, 0x4e, 0x53, 0x38, 0x3f, + 0x13, 0x4e, 0x00, 0x70, 0x94, 0xad, 0xd3, 0xfc, 0x5c, 0xe5, 0xb8, 0x1a, 0x7e, 0x75, 0xad, 0xd6, + 0x6c, 0x83, 0x91, 0x4b, 0x43, 0x2e, 0x4e, 0x51, 0x48, 0xb5, 0x29, 0x4e, 0xe2, 0x99, 0x5c, 0x14, + 0xa9, 0x38, 0x31, 0x76, 0x4a, 0x10, 0x89, 0x68, 0xee, 0x74, 0x8d, 0x48, 0x5b, 0x44, 0x04, 0x63, + 0x11, 0xe7, 0x3f, 0x16, 0xdc, 0x33, 0x55, 0xf4, 0x70, 0x46, 0xc9, 0xf5, 0x24, 0x09, 0xc2, 0xab, + 0x35, 0x9d, 0xa5, 0xcf, 0xb4, 0xf1, 0x2f, 0x43, 0xd1, 0xfe, 0xb8, 0x0c, 0xcb, 0x25, 0x80, 0xc7, + 0x52, 0x54, 0xe3, 0xb2, 0xfd, 0x1d, 0xbb, 0x05, 0x69, 0x1f, 0xc3, 0x20, 0xc1, 0xc4, 0x20, 0x59, + 0xbc, 0xc3, 0x59, 0xe9, 0x3b, 0x8d, 0x08, 0xd8, 0xb0, 0xf4, 0xfe, 0xc7, 0xc5, 0x17, 0x6e, 0xf5, + 0xb1, 0xf3, 0x1e, 0x7a, 0x85, 0x99, 0x14, 0xa0, 0x27, 0xfd, 0x3b, 0xa6, 0x9e, 0xa1, 0x38, 0x0b, + 0xe5, 0x8d, 0x16, 0x65, 0x28, 0x4e, 0x41, 0x1d, 0xe7, 0x2d, 0x18, 0x94, 0xb3, 0x50, 0xb6, 0xc1, + 0x1e, 0x14, 0xf3, 0x16, 0xd0, 0x05, 0x88, 0x3c, 0x72, 0x62, 0x39, 0x3f, 0xc3, 0x96, 0xbb, 0xbe, + 0xf6, 0x17, 0x74, 0x5f, 0x2f, 0x49, 0xd3, 0x95, 0xa5, 0xda, 0x75, 0x4b, 0x39, 0x7f, 0xb1, 0x24, + 0x5d, 0x71, 0xb9, 0x7e, 0x1f, 0xba, 0xd2, 0x6a, 0x5a, 0x1b, 0x12, 0x47, 0x21, 0xc5, 0x03, 0x57, + 0x04, 0xf7, 0xb4, 0x6c, 0xa6, 0xee, 0x95, 0x92, 0xb8, 0x0a, 0xaf, 0x2c, 0xe2, 0xbf, 0x55, 0x2b, + 0xbb, 0xd4, 0x84, 0xfb, 0x3a, 0xf7, 0xb4, 0x52, 0x45, 0xf7, 0xd9, 0x27, 0xe0, 0x1c, 0x69, 0x6e, + 0xc2, 0x89, 0x69, 0x54, 0x37, 0x4e, 0x3e, 0x24, 0xcc, 0xd8, 0xd0, 0xf9, 0x37, 0x16, 0xd6, 0x67, + 0x49, 0x38, 0x53, 0x17, 0x7e, 0x36, 0x57, 0x39, 0xbd, 0x36, 0x94, 0xf7, 0x09, 0x1c, 0xd9, 0x1f, + 0x62, 0x65, 0x64, 0x8e, 0xf8, 0xea, 0xf0, 0xe0, 0xcd, 0xc6, 0x46, 0x6a, 0x9f, 0xee, 0xcb, 0x9f, + 0x5b, 0xc8, 0xef, 0xfd, 0xc1, 0x82, 0x9e, 0x99, 0xb5, 0x61, 0xea, 0xf6, 0xff, 0x60, 0xea, 0x32, + 0x10, 0xdb, 0xf5, 0x40, 0x7c, 0xb5, 0xba, 0xb1, 0xd4, 0x73, 0xa6, 0x5c, 0x5c, 0xde, 0x86, 0xfe, + 0x6c, 0x11, 0x46, 0xd8, 0xbd, 0xc4, 0xcd, 0x9c, 0x5a, 0xc2, 0x4e, 0x02, 0x3b, 0x55, 0x39, 0xe3, + 0x40, 0x7d, 0xd9, 0x7d, 0xea, 0xd6, 0x8d, 0x4e, 0xf4, 0xac, 0x43, 0xa4, 0xd3, 0x55, 0xb4, 0xc2, + 0x06, 0xa8, 0xdd, 0xd0, 0x89, 0x31, 0xe7, 0x97, 0x78, 0x7b, 0x4b, 0x02, 0x35, 0x2b, 0xde, 0x81, + 0xa8, 0x7d, 0x89, 0xd2, 0x85, 0xcf, 0x07, 0xdc, 0x75, 0x85, 0xa0, 0xf3, 0xbd, 0x54, 0xb9, 0xcf, + 0xad, 0x56, 0xd7, 0xe5, 0x31, 0x55, 0x2a, 0xec, 0xb5, 0xaf, 0xd0, 0x1d, 0xe4, 0x03, 0xf2, 0xb8, + 0x32, 0x39, 0x0b, 0xe7, 0x90, 0x3f, 0x2e, 0x1e, 0x53, 0x3a, 0x77, 0x1f, 0x53, 0x3e, 0xef, 0x55, + 0x97, 0x0e, 0xfd, 0x05, 0x6e, 0xff, 0x0d, 0x00, 0x4d, 0x22, 0x5e, 0x12, 0x47, 0xb7, 0x7a, 0xc6, + 0x01, 0x33, 0x3e, 0x46, 0x1c, 0x13, 0xeb, 0x68, 0x56, 0x15, 0x69, 0x29, 0x8c, 0x23, 0xb7, 0x81, + 0xd9, 0x3f, 0x80, 0xe1, 0x55, 0x96, 0x2c, 0x3d, 0x49, 0x4d, 0xac, 0xd3, 0xf0, 0xe0, 0xb5, 0x3b, + 0x21, 0xc0, 0x0a, 0xed, 0xf3, 0xaf, 0x0b, 0xf4, 0xc1, 0x11, 0xcb, 0x97, 0x9f, 0x4b, 0xda, 0xe2, + 0x53, 0xfc, 0x52, 0x9f, 0x4b, 0x92, 0xf8, 0xff, 0x79, 0xc1, 0xb1, 0xf7, 0xab, 0xf7, 0xc2, 0x11, + 0x1b, 0xe1, 0x7e, 0x33, 0xfa, 0x84, 0x57, 0xbd, 0x22, 0xde, 0x79, 0x76, 0x1b, 0x6f, 0x78, 0x76, + 0xab, 0xf5, 0xfa, 0xdb, 0x72, 0xf7, 0x2a, 0x7a, 0x7d, 0xbc, 0x8c, 0x54, 0x6f, 0x1f, 0x3b, 0x12, + 0x03, 0x25, 0x40, 0xcd, 0x2d, 0x3a, 0x46, 0x18, 0x2b, 0xad, 0x66, 0x9a, 0x6f, 0x46, 0x68, 0xb4, + 0x0a, 0xa1, 0xfe, 0x3d, 0x0c, 0x22, 0xe1, 0xee, 0x4a, 0xff, 0x5e, 0xd0, 0xf6, 0x07, 0x60, 0xeb, + 0x9c, 0xde, 0x78, 0xbc, 0x9a, 0x9f, 0xc8, 0x9d, 0xa8, 0x70, 0xb1, 0x5d, 0x11, 0xa8, 0x35, 0x80, + 0xa5, 0x4f, 0xdf, 0xbb, 0xe3, 0xd3, 0x7b, 0x3f, 0x85, 0xae, 0xb8, 0x73, 0xf1, 0x04, 0x68, 0x6d, + 0x78, 0x02, 0x6c, 0x6d, 0x78, 0x02, 0x6c, 0x6f, 0x7c, 0x02, 0xec, 0xd4, 0x9f, 0x00, 0xe9, 0xc1, + 0x68, 0xe8, 0x2a, 0x6c, 0xc1, 0x74, 0xfe, 0x28, 0x4a, 0x2e, 0xe9, 0xb2, 0x69, 0x62, 0xc4, 0x2b, + 0x6e, 0xad, 0x92, 0xc6, 0xb6, 0x0d, 0x7c, 0x61, 0x2e, 0xaf, 0x35, 0xc1, 0xe2, 0xd2, 0xd9, 0x6a, + 0x08, 0x1e, 0x99, 0xbb, 0xe7, 0xf7, 0xe0, 0x5e, 0x91, 0x6e, 0xea, 0xaf, 0x2c, 0x72, 0x31, 0xb1, + 0x0d, 0xeb, 0x71, 0xc5, 0x71, 0xfe, 0x65, 0xc1, 0x48, 0xdc, 0x1b, 0x8b, 0xd8, 0x55, 0x38, 0xbf, + 0xfb, 0x56, 0x65, 0x7d, 0x89, 0xb7, 0xaa, 0xd6, 0xdd, 0xb7, 0x2a, 0x4c, 0x7c, 0x7e, 0x14, 0x25, + 0xcf, 0xbd, 0x45, 0xbe, 0x8c, 0x24, 0x79, 0x61, 0x1b, 0x45, 0xc8, 0x31, 0x02, 0x74, 0x1d, 0x37, + 0x37, 0x1e, 0x2f, 0x52, 0xf1, 0x3c, 0x5f, 0x18, 0x53, 0x8d, 0x0d, 0xfa, 0x94, 0x41, 0xac, 0x76, + 0xf7, 0xc3, 0x25, 0x09, 0xdd, 0x12, 0x96, 0x67, 0x07, 0x9b, 0x79, 0x27, 0x8d, 0x2f, 0x1a, 0xcf, + 0x31, 0xbd, 0x5b, 0xcf, 0x31, 0xd7, 0x30, 0x3e, 0x5f, 0xcd, 0xe7, 0x68, 0x7f, 0xb3, 0xdb, 0x17, + 0x3f, 0x9c, 0xd3, 0x95, 0xcb, 0xbc, 0x06, 0xf9, 0x91, 0x24, 0x2d, 0xb7, 0x86, 0x50, 0x90, 0xa1, + 0xbf, 0x2c, 0xbc, 0x3c, 0xf1, 0x72, 0x3f, 0xba, 0x36, 0x3b, 0x04, 0xc2, 0x2e, 0x92, 0x0b, 0x44, + 0x1e, 0xb5, 0x8e, 0xad, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x85, 0xe0, 0xf0, 0x3c, 0xbf, 0x17, + 0x00, 0x00, +} diff --git a/vendor/github.com/layeh/gumble/gumble/handlers.go b/vendor/github.com/layeh/gumble/gumble/handlers.go index e66e1ae..46e5c70 100644 --- a/vendor/github.com/layeh/gumble/gumble/handlers.go +++ b/vendor/github.com/layeh/gumble/gumble/handlers.go @@ -94,11 +94,12 @@ func (c *Client) handleUDPTunnel(buffer []byte) error { } // Session + buffer = buffer[1:] session, n := varint.Decode(buffer) if n <= 0 { return errInvalidProtobuf } - buff := buffer[n:] + buffer = buffer[n:] user := c.Users[uint32(session)] if user == nil { return errInvalidProtobuf @@ -117,25 +118,25 @@ func (c *Client) handleUDPTunnel(buffer []byte) error { // Sequence // TODO: use in jitter buffer - _, n = varint.Decode(buff) + _, n = varint.Decode(buffer) if n <= 0 { return errInvalidProtobuf } - buff = buff[n:] + buffer = buffer[n:] // Length - length, n := varint.Decode(buff) + length, n := varint.Decode(buffer) if n <= 0 { return errInvalidProtobuf } - buff = buff[n:] + buffer = buffer[n:] // Opus audio packets set the 13th bit in the size field as the terminator. audioLength := int(length) &^ 0x2000 - if audioLength > len(buff) { + if audioLength > len(buffer) { return errInvalidProtobuf } - pcm, err := decoder.Decode(buff[:audioLength], AudioMaximumFrameSize) + pcm, err := decoder.Decode(buffer[:audioLength], AudioMaximumFrameSize) if err != nil { return err } @@ -149,13 +150,13 @@ func (c *Client) handleUDPTunnel(buffer []byte) error { AudioBuffer: AudioBuffer(pcm), } - if len(buff)-audioLength == 3*4 { + if len(buffer)-audioLength == 3*4 { // the packet has positional audio data; 3x float32 - buff = buff[audioLength:] + buffer = buffer[audioLength:] - event.X = math.Float32frombits(binary.LittleEndian.Uint32(buff)) - event.Y = math.Float32frombits(binary.LittleEndian.Uint32(buff[4:])) - event.Z = math.Float32frombits(binary.LittleEndian.Uint32(buff[8:])) + event.X = math.Float32frombits(binary.LittleEndian.Uint32(buffer)) + event.Y = math.Float32frombits(binary.LittleEndian.Uint32(buffer[4:])) + event.Z = math.Float32frombits(binary.LittleEndian.Uint32(buffer[8:])) event.HasPosition = true } diff --git a/vendor/github.com/layeh/gumble/gumble/ping.go b/vendor/github.com/layeh/gumble/gumble/ping.go index b8374ea..ad9c804 100644 --- a/vendor/github.com/layeh/gumble/gumble/ping.go +++ b/vendor/github.com/layeh/gumble/gumble/ping.go @@ -37,15 +37,13 @@ func Ping(address string, interval, timeout time.Duration) (*PingResponse, error if timeout < 0 { return nil, errors.New("gumble: timeout must be positive") } - addr, err := net.ResolveUDPAddr("udp", address) - if err != nil { - return nil, err - } - conn, err := net.DialUDP("udp", nil, addr) + deadline := time.Now().Add(timeout) + conn, err := net.DialTimeout("udp", address, timeout) if err != nil { return nil, err } defer conn.Close() + conn.SetReadDeadline(deadline) var ( idsLock sync.Mutex @@ -83,7 +81,6 @@ func Ping(address string, interval, timeout time.Duration) (*PingResponse, error buildSendPacket() - conn.SetReadDeadline(time.Now().Add(timeout)) for { var incoming [24]byte if _, err := io.ReadFull(conn, incoming[:]); err != nil { @@ -98,7 +95,7 @@ func Ping(address string, interval, timeout time.Duration) (*PingResponse, error } return &PingResponse{ - Address: addr, + Address: conn.RemoteAddr().(*net.UDPAddr), Ping: time.Since(sendTime), Version: Version{ Version: binary.BigEndian.Uint32(incoming[0:]), diff --git a/vendor/github.com/layeh/gumble/gumble/varint/read.go b/vendor/github.com/layeh/gumble/gumble/varint/read.go index 765ea76..6b5820d 100644 --- a/vendor/github.com/layeh/gumble/gumble/varint/read.go +++ b/vendor/github.com/layeh/gumble/gumble/varint/read.go @@ -36,7 +36,17 @@ func Decode(b []byte) (int64, int) { if (b[0]&0xFC) == 0xF4 && len(b) >= 9 { return int64(binary.BigEndian.Uint64(b[1:])), 9 } - // TODO: 111110__ + varint Negative recursive varint - // TODO: 111111xx Byte-inverted negative two bit number (~xx) + // 111110__ + varint Negative recursive varint + if b[0]&0xFC == 0xF8 { + if v, n := Decode(b[1:]); n > 0 { + return -v, n + 1 + } + return 0, 0 + } + // 111111xx Byte-inverted negative two bit number (~xx) + if b[0]&0xFC == 0xFC { + return ^int64(b[0] & 0x03), 1 + } + return 0, 0 } diff --git a/vendor/github.com/layeh/gumble/gumble/varint/varint_test.go b/vendor/github.com/layeh/gumble/gumble/varint/varint_test.go new file mode 100644 index 0000000..3d89fd2 --- /dev/null +++ b/vendor/github.com/layeh/gumble/gumble/varint/varint_test.go @@ -0,0 +1,32 @@ +package varint + +import "testing" + +func TestRange(t *testing.T) { + + fn := func(i int64) { + var b [MaxVarintLen]byte + size := Encode(b[:], i) + if size == 0 { + t.Errorf("Encode returned size 0\n") + } + s := b[:size] + + val, size := Decode(s) + if size == 0 { + t.Errorf("Decode return size 0\n") + } + + if i != val { + t.Errorf("Encoded %d (%v) equals decoded %d\n", i, s, val) + } + } + + for i := int64(-10000); i <= 10000; i++ { + fn(i) + } + + fn(134342525) + fn(10282934828342) + fn(1028293482834200000) +} diff --git a/vendor/github.com/layeh/gumble/gumble/varint/write.go b/vendor/github.com/layeh/gumble/gumble/varint/write.go index 2270ce5..29d931b 100644 --- a/vendor/github.com/layeh/gumble/gumble/varint/write.go +++ b/vendor/github.com/layeh/gumble/gumble/varint/write.go @@ -11,7 +11,11 @@ const MaxVarintLen = 10 // Encode encodes the given value to varint format. func Encode(b []byte, value int64) int { - // TODO: 111111xx Byte-inverted negative two bit number (~xx) + // 111111xx Byte-inverted negative two bit number (~xx) + if value <= -1 && value >= -4 { + b[0] = 0xFC | byte(^value&0xFF) + return 1 + } // 111110__ + varint Negative recursive varint if value < 0 { b[0] = 0xF8 diff --git a/vendor/github.com/layeh/gumble/gumbleopenal/gumble_openal.go b/vendor/github.com/layeh/gumble/gumbleopenal/stream.go similarity index 100% rename from vendor/github.com/layeh/gumble/gumbleopenal/gumble_openal.go rename to vendor/github.com/layeh/gumble/gumbleopenal/stream.go diff --git a/vendor/github.com/magiconair/properties/.gitignore b/vendor/github.com/magiconair/properties/.gitignore index 7054822..e7081ff 100644 --- a/vendor/github.com/magiconair/properties/.gitignore +++ b/vendor/github.com/magiconair/properties/.gitignore @@ -2,3 +2,5 @@ *.sublime-workspace *.un~ *.swp +.idea/ +*.iml diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go index 3915c73..4300fec 100644 --- a/vendor/github.com/magiconair/properties/load.go +++ b/vendor/github.com/magiconair/properties/load.go @@ -5,7 +5,6 @@ package properties import ( - "bytes" "fmt" "io/ioutil" "net/http" @@ -36,14 +35,14 @@ func LoadString(s string) (*Properties, error) { // LoadFile reads a file into a Properties struct. func LoadFile(filename string, enc Encoding) (*Properties, error) { - return loadFiles([]string{filename}, enc, false) + return loadAll([]string{filename}, enc, false) } // LoadFiles reads multiple files in the given order into // a Properties struct. If 'ignoreMissing' is true then // non-existent files will not be reported as error. func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { - return loadFiles(filenames, enc, ignoreMissing) + return loadAll(filenames, enc, ignoreMissing) } // LoadURL reads the content of the URL into a Properties struct. @@ -55,7 +54,7 @@ func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Propertie // encoding is set to UTF-8. A missing content type header is // interpreted as 'text/plain; charset=utf-8'. func LoadURL(url string) (*Properties, error) { - return loadURLs([]string{url}, false) + return loadAll([]string{url}, UTF8, false) } // LoadURLs reads the content of multiple URLs in the given order into a @@ -63,7 +62,15 @@ func LoadURL(url string) (*Properties, error) { // not be reported as error. See LoadURL for the Content-Type header // and the encoding. func LoadURLs(urls []string, ignoreMissing bool) (*Properties, error) { - return loadURLs(urls, ignoreMissing) + return loadAll(urls, UTF8, ignoreMissing) +} + +// LoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. +func LoadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + return loadAll(names, enc, ignoreMissing) } // MustLoadString reads an UTF8 string into a Properties struct and @@ -98,6 +105,14 @@ func MustLoadURLs(urls []string, ignoreMissing bool) *Properties { return must(LoadURLs(urls, ignoreMissing)) } +// MustLoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. It panics on error. +func MustLoadAll(names []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadAll(names, enc, ignoreMissing)) +} + func loadBuf(buf []byte, enc Encoding) (*Properties, error) { p, err := parse(convert(buf, enc)) if err != nil { @@ -106,66 +121,78 @@ func loadBuf(buf []byte, enc Encoding) (*Properties, error) { return p, p.check() } -func loadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { - var buf bytes.Buffer - for _, filename := range filenames { - f, err := expandFilename(filename) +func loadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + result := NewProperties() + for _, name := range names { + n, err := expandName(name) if err != nil { return nil, err } - - data, err := ioutil.ReadFile(f) + var p *Properties + if strings.HasPrefix(n, "http://") || strings.HasPrefix(n, "https://") { + p, err = loadURL(n, ignoreMissing) + } else { + p, err = loadFile(n, enc, ignoreMissing) + } if err != nil { - if ignoreMissing && os.IsNotExist(err) { - LogPrintf("properties: %s not found. skipping", filename) - continue - } return nil, err } + result.Merge(p) - // concatenate the buffers and add a new line in case - // the previous file didn't end with a new line - buf.Write(data) - buf.WriteRune('\n') } - return loadBuf(buf.Bytes(), enc) + return result, result.check() } -func loadURLs(urls []string, ignoreMissing bool) (*Properties, error) { - var buf bytes.Buffer - for _, u := range urls { - resp, err := http.Get(u) - if err != nil { - return nil, fmt.Errorf("properties: error fetching %q. %s", u, err) +func loadFile(filename string, enc Encoding, ignoreMissing bool) (*Properties, error) { + data, err := ioutil.ReadFile(filename) + if err != nil { + if ignoreMissing && os.IsNotExist(err) { + LogPrintf("properties: %s not found. skipping", filename) + return NewProperties(), nil } - if resp.StatusCode == 404 && ignoreMissing { - LogPrintf("properties: %s returned %d. skipping", u, resp.StatusCode) - continue - } - if resp.StatusCode != 200 { - return nil, fmt.Errorf("properties: %s returned %d", u, resp.StatusCode) - } - body, err := ioutil.ReadAll(resp.Body) - resp.Body.Close() - if err != nil { - return nil, fmt.Errorf("properties: %s error reading response. %s", u, err) - } - - ct := resp.Header.Get("Content-Type") - var enc Encoding - switch strings.ToLower(ct) { - case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1": - enc = ISO_8859_1 - case "", "text/plain; charset=utf-8": - enc = UTF8 - default: - return nil, fmt.Errorf("properties: invalid content type %s", ct) - } - - buf.WriteString(convert(body, enc)) - buf.WriteRune('\n') + return nil, err } - return loadBuf(buf.Bytes(), UTF8) + p, err := parse(convert(data, enc)) + if err != nil { + return nil, err + } + return p, nil +} + +func loadURL(url string, ignoreMissing bool) (*Properties, error) { + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("properties: error fetching %q. %s", url, err) + } + if resp.StatusCode == 404 && ignoreMissing { + LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode) + return NewProperties(), nil + } + if resp.StatusCode != 200 { + return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode) + } + body, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + return nil, fmt.Errorf("properties: %s error reading response. %s", url, err) + } + + ct := resp.Header.Get("Content-Type") + var enc Encoding + switch strings.ToLower(ct) { + case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1": + enc = ISO_8859_1 + case "", "text/plain; charset=utf-8": + enc = UTF8 + default: + return nil, fmt.Errorf("properties: invalid content type %s", ct) + } + + p, err := parse(convert(body, enc)) + if err != nil { + return nil, err + } + return p, nil } func must(p *Properties, err error) *Properties { @@ -175,12 +202,12 @@ func must(p *Properties, err error) *Properties { return p } -// expandFilename expands ${ENV_VAR} expressions in a filename. +// expandName expands ${ENV_VAR} expressions in a name. // If the environment variable does not exist then it will be replaced // with an empty string. Malformed expressions like "${ENV_VAR" will // be reported as error. -func expandFilename(filename string) (string, error) { - return expand(filename, make(map[string]bool), "${", "}", make(map[string]string)) +func expandName(name string) (string, error) { + return expand(name, make(map[string]bool), "${", "}", make(map[string]string)) } // Interprets a byte buffer either as an ISO-8859-1 or UTF-8 encoded string. diff --git a/vendor/github.com/magiconair/properties/load_test.go b/vendor/github.com/magiconair/properties/load_test.go index f95b948..f56adb2 100644 --- a/vendor/github.com/magiconair/properties/load_test.go +++ b/vendor/github.com/magiconair/properties/load_test.go @@ -124,6 +124,16 @@ func (s *LoadSuite) TestLoadURLFailInvalidEncoding(c *C) { c.Assert(err, ErrorMatches, ".*invalid content type.*") } +func (s *LoadSuite) TestLoadAll(c *C) { + filename := s.makeFile(c, "key=value") + filename2 := s.makeFile(c, "key2=value3") + filename3 := s.makeFile(c, "key=value4") + srv := testServer() + defer srv.Close() + p := MustLoadAll([]string{filename, filename2, srv.URL + "/a", srv.URL + "/b", filename3}, UTF8, false) + assertKeyValues(c, "", p, "key", "value4", "key2", "value2") +} + func (s *LoadSuite) SetUpSuite(c *C) { s.tempFiles = make([]string, 0) } diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go index 884ef4e..e7e0104 100644 --- a/vendor/github.com/magiconair/properties/properties.go +++ b/vendor/github.com/magiconair/properties/properties.go @@ -630,6 +630,26 @@ func (p *Properties) Delete(key string) { p.k = newKeys } +// Merge merges properties, comments and keys from other *Properties into p +func (p *Properties) Merge(other *Properties) { + for k,v := range other.m { + p.m[k] = v + } + for k,v := range other.c { + p.c[k] = v + } + + outer: + for _, otherKey := range other.k { + for _, key := range p.k { + if otherKey == key { + continue outer + } + } + p.k = append(p.k, otherKey) + } +} + // ---------------------------------------------------------------------------- // check expands all values and returns an error if a circular reference or diff --git a/vendor/github.com/magiconair/properties/properties_test.go b/vendor/github.com/magiconair/properties/properties_test.go index c0af16e..0d61be0 100644 --- a/vendor/github.com/magiconair/properties/properties_test.go +++ b/vendor/github.com/magiconair/properties/properties_test.go @@ -842,6 +842,20 @@ func (s *TestSuite) TestDeleteUnknownKey(c *C) { c.Check(len(p.k), Equals, 1) } +func (s *TestSuite) TestMerge(c *C) { + input1 := "#comment\nkey=value\nkey2=value2" + input2 := "#another comment\nkey=another value\nkey3=value3" + p1, err := parse(input1) + c.Assert(err, IsNil) + p2, err := parse(input2) + p1.Merge(p2) + c.Check(len(p1.m), Equals, 3) + c.Check(len(p1.c), Equals, 1) + c.Check(len(p1.k), Equals, 3) + c.Check(p1.MustGet("key"), Equals, "another value") + c.Check(p1.GetComment("key"), Equals, "another comment") +} + // ---------------------------------------------------------------------------- // tests all combinations of delimiters, leading and/or trailing whitespace and newlines.