From b0f67aed8c3e2678e0322bcc408b6ce466a401d0 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 14 Aug 2019 11:15:21 +1000 Subject: [PATCH 01/35] Add a flag in Zero to read the enterprise file and read its contents into the state. --- dgraph/cmd/zero/run.go | 2 ++ dgraph/cmd/zero/zero.go | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index 0c6f27a6c25..206cd59829b 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -95,6 +95,7 @@ instances to achieve high-availability. // about the status of supporting annotation logs through the datadog exporter flag.String("datadog.collector", "", "Send opencensus traces to Datadog. As of now, the trace"+ " exporter does not support annotation logs and would discard them.") + flag.String("enterprise_license", "license.json", "Path to the enterprise license file") } func setupListener(addr string, port int, kind string) (listener net.Listener, err error) { @@ -222,6 +223,7 @@ func run() { zpages.Handle(http.DefaultServeMux, "/z") // This must be here. It does not work if placed before Grpc init. + // TODO - Propose the enterprise state to the quorum? x.Check(st.node.initAndStartNode()) if Zero.Conf.GetBool("telemetry") { diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 746c511e04c..c0a70ac7b6f 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -17,6 +17,8 @@ package zero import ( + "encoding/json" + "io/ioutil" "math" "sync" "time" @@ -39,6 +41,14 @@ var ( errServerShutDown = errors.New("Server is being shut down") ) +// TODO - This might belong somewhere else instead for e.g. the state. +// TODO - Add other fields as well. +type enterprise struct { + enabled bool + MaxNodes uint64 `json:"max_nodes"` + Expiry time.Time `json:"expiry"` +} + // Server implements the zero server. type Server struct { x.SafeMutex @@ -61,6 +71,8 @@ type Server struct { moveOngoing chan struct{} blockCommitsOn *sync.Map + + enterprise enterprise } // Init initializes the zero server. @@ -81,6 +93,12 @@ func (s *Server) Init() { s.closer = y.NewCloser(2) // grpc and http s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) + if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { + b, err := ioutil.ReadFile(fpath) + x.CheckfNoTrace(err) + err = json.Unmarshal(b, &s.enterprise) + x.Checkf(err, "while unmarshalling license file") + } go s.rebalanceTablets() } From 706746d7c93ebed6a72f23e25094fc64bda0d668 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 14 Aug 2019 13:47:19 +1000 Subject: [PATCH 02/35] Add a EnterpriseEnabled field to MembershipState and propogate it to alpha servers from Zero. --- dgraph/cmd/alpha/admin_backup.go | 7 +- dgraph/cmd/alpha/run.go | 7 - dgraph/cmd/zero/raft.go | 27 +- dgraph/cmd/zero/run.go | 2 +- dgraph/cmd/zero/zero.go | 21 ++ protos/pb.proto | 1 + protos/pb/pb.pb.go | 508 +++++++++++++++++-------------- worker/groups.go | 12 + 8 files changed, 339 insertions(+), 246 deletions(-) diff --git a/dgraph/cmd/alpha/admin_backup.go b/dgraph/cmd/alpha/admin_backup.go index 63ddfa154ae..d97d4e6bf68 100644 --- a/dgraph/cmd/alpha/admin_backup.go +++ b/dgraph/cmd/alpha/admin_backup.go @@ -42,10 +42,9 @@ func backupHandler(w http.ResponseWriter, r *http.Request) { if !handlerInit(w, r, http.MethodPost) { return } - if !Alpha.Conf.GetBool("enterprise_features") { - x.SetStatus(w, - "You must enable Dgraph enterprise features first. "+ - "Restart Dgraph Alpha with --enterprise_features", + if !worker.EnterpriseEnabled() { + x.SetStatus(w, "You must enable enterprise features first. "+ + "Restart Dgraph Zero with the appropriate license file.", "Backup failed.") return } diff --git a/dgraph/cmd/alpha/run.go b/dgraph/cmd/alpha/run.go index 7fc4a73cb6a..4aa2740c375 100644 --- a/dgraph/cmd/alpha/run.go +++ b/dgraph/cmd/alpha/run.go @@ -93,8 +93,6 @@ they form a Raft group and provide synchronous replication. // with the flag name so that the values are picked up by Cobra/Viper's various config inputs // (e.g, config file, env vars, cli flags, etc.) flag := Alpha.Cmd.Flags() - flag.Bool("enterprise_features", false, "Enable Dgraph enterprise features. "+ - "If you set this to true, you agree to the Dgraph Community License.") flag.StringP("postings", "p", "p", "Directory to store posting lists.") // Options around how to set up Badger. @@ -435,11 +433,6 @@ func run() { secretFile := Alpha.Conf.GetString("acl_secret_file") if secretFile != "" { - if !Alpha.Conf.GetBool("enterprise_features") { - glog.Fatalf("You must enable Dgraph enterprise features with the " + - "--enterprise_features option in order to use ACL.") - } - hmacSecret, err := ioutil.ReadFile(secretFile) if err != nil { glog.Fatalf("Unable to read HMAC secret from file: %v", secretFile) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 299afb4367a..cfa009eea44 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -507,6 +507,30 @@ func (n *node) initAndStartNode() error { return nil } +// periodically checks the validity of the enterprise license and updates the membership state. +func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { + defer closer.Done() + + // Return early if enterprise is not enabled. This would happen when user didn't supply us a + // license file. + if !n.server.enterpriseEnabled() { + return + } + + ticker := time.NewTicker(1 * time.Minute) + defer ticker.Stop() + + n.server.updateEnterpriseState() + for { + select { + case <-ticker.C: + n.server.updateEnterpriseState() + case <-closer.HasBeenClosed(): + return + } + } +} + func (n *node) updateZeroMembershipPeriodically(closer *y.Closer) { defer closer.Done() ticker := time.NewTicker(10 * time.Second) @@ -604,7 +628,7 @@ func (n *node) Run() { // snapshot can cause select loop to block while deleting entries, so run // it in goroutine readStateCh := make(chan raft.ReadState, 100) - closer := y.NewCloser(4) + closer := y.NewCloser(5) defer func() { closer.SignalAndWait() n.closer.Done() @@ -612,6 +636,7 @@ func (n *node) Run() { }() go n.snapshotPeriodically(closer) + go n.updateEnterpriseStatePeriodically(closer) go n.updateZeroMembershipPeriodically(closer) go n.checkQuorum(closer) go n.RunReadIndexLoop(closer, readStateCh) diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index 206cd59829b..54228b39ca6 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -95,7 +95,7 @@ instances to achieve high-availability. // about the status of supporting annotation logs through the datadog exporter flag.String("datadog.collector", "", "Send opencensus traces to Datadog. As of now, the trace"+ " exporter does not support annotation logs and would discard them.") - flag.String("enterprise_license", "license.json", "Path to the enterprise license file") + flag.String("enterprise_license", "", "Path to the enterprise license file") } func setupListener(addr string, port int, kind string) (listener net.Listener, err error) { diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index c0a70ac7b6f..3022c3c0c80 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -98,6 +98,7 @@ func (s *Server) Init() { x.CheckfNoTrace(err) err = json.Unmarshal(b, &s.enterprise) x.Checkf(err, "while unmarshalling license file") + s.enterprise.enabled = true } go s.rebalanceTablets() } @@ -282,6 +283,26 @@ func (s *Server) updateZeroLeader() { } } +func (s *Server) enterpriseEnabled() bool { + s.RLock() + defer s.RUnlock() + return s.enterprise.enabled +} + +// updateEnterpriseState periodically checks the validity of the enterprise license +// based on its expiry. +func (s *Server) updateEnterpriseState() { + s.Lock() + defer s.Unlock() + // TODO - Check timezones won't mess up things here. + // Also check how to get total number of nodes and have logic for that. + if time.Now().Before(s.enterprise.Expiry) { + s.state.EnterpriseEnabled = true + } else { + s.state.EnterpriseEnabled = false + } +} + func (s *Server) removeZero(nodeId uint64) { s.Lock() defer s.Unlock() diff --git a/protos/pb.proto b/protos/pb.proto index 8384015b049..fb9e4304e8f 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -161,6 +161,7 @@ message MembershipState { uint64 maxRaftId = 6; repeated Member removed = 7; string cid = 8; // Used to uniquely identify the Dgraph cluster. + bool enterpriseEnabled = 9; } message ConnectionState { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index d17d4e54fd6..5be14fba30a 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -1282,6 +1282,7 @@ type MembershipState struct { MaxRaftId uint64 `protobuf:"varint,6,opt,name=maxRaftId,proto3" json:"maxRaftId,omitempty"` Removed []*Member `protobuf:"bytes,7,rep,name=removed,proto3" json:"removed,omitempty"` Cid string `protobuf:"bytes,8,opt,name=cid,proto3" json:"cid,omitempty"` + EnterpriseEnabled bool `protobuf:"varint,9,opt,name=enterpriseEnabled,proto3" json:"enterpriseEnabled,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1376,6 +1377,13 @@ func (m *MembershipState) GetCid() string { return "" } +func (m *MembershipState) GetEnterpriseEnabled() bool { + if m != nil { + return m.EnterpriseEnabled + } + return false +} + type ConnectionState struct { Member *Member `protobuf:"bytes,1,opt,name=member,proto3" json:"member,omitempty"` State *MembershipState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` @@ -3999,239 +4007,240 @@ func init() { func init() { proto.RegisterFile("pb.proto", fileDescriptor_f80abaa17e25ccc8) } var fileDescriptor_f80abaa17e25ccc8 = []byte{ - // 3702 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5a, 0xcd, 0x6f, 0xe3, 0x48, - 0x76, 0x6f, 0x52, 0x12, 0x45, 0x3e, 0xc9, 0x6e, 0x4d, 0xcd, 0x4c, 0x8f, 0xc6, 0xb3, 0xdb, 0xed, - 0xe1, 0x7c, 0x79, 0xba, 0xb7, 0xdd, 0x3d, 0x9e, 0x0d, 0xb2, 0xb3, 0x41, 0x0e, 0x6e, 0x5b, 0xdd, - 0xeb, 0x69, 0x5b, 0xf6, 0x96, 0xe4, 0x9e, 0xec, 0x1c, 0x22, 0xd0, 0x64, 0x59, 0xe6, 0x9a, 0x22, - 0x19, 0x16, 0xe5, 0xc8, 0x73, 0xcb, 0x21, 0x01, 0x02, 0x24, 0xa7, 0x5c, 0xf6, 0x10, 0xe4, 0x10, - 0x20, 0x97, 0x5c, 0x72, 0x5d, 0xe4, 0x18, 0x20, 0x40, 0x8e, 0x41, 0xfe, 0x82, 0x60, 0x92, 0x63, - 0xce, 0x01, 0x72, 0x0b, 0xde, 0xab, 0xa2, 0x48, 0xaa, 0xdd, 0x3d, 0x3b, 0x0b, 0xec, 0x49, 0xf5, - 0x3e, 0xea, 0xeb, 0x57, 0xaf, 0xde, 0x7b, 0xf5, 0x28, 0xb0, 0xd3, 0xb3, 0xed, 0x34, 0x4b, 0xf2, - 0x84, 0x99, 0xe9, 0xd9, 0x86, 0xe3, 0xa5, 0xa1, 0x22, 0x37, 0x3e, 0x99, 0x86, 0xf9, 0xc5, 0xfc, - 0x6c, 0xdb, 0x4f, 0x66, 0x8f, 0x82, 0x69, 0xe6, 0xa5, 0x17, 0x0f, 0xc3, 0xe4, 0xd1, 0x99, 0x17, - 0x4c, 0x45, 0xf6, 0x28, 0x3d, 0x7b, 0x54, 0xf4, 0x73, 0x37, 0xa0, 0x79, 0x18, 0xca, 0x9c, 0x31, - 0x68, 0xce, 0xc3, 0x40, 0xf6, 0x8d, 0xcd, 0xc6, 0x96, 0xc5, 0xa9, 0xed, 0x1e, 0x81, 0x33, 0xf6, - 0xe4, 0xe5, 0x0b, 0x2f, 0x9a, 0x0b, 0xd6, 0x83, 0xc6, 0x95, 0x17, 0xf5, 0x8d, 0x4d, 0x63, 0xab, - 0xcb, 0xb1, 0xc9, 0xb6, 0xc1, 0xbe, 0xf2, 0xa2, 0x49, 0x7e, 0x9d, 0x8a, 0xbe, 0xb9, 0x69, 0x6c, - 0xad, 0xef, 0xbc, 0xb9, 0x9d, 0x9e, 0x6d, 0x9f, 0x24, 0x32, 0x0f, 0xe3, 0xe9, 0xf6, 0x0b, 0x2f, - 0x1a, 0x5f, 0xa7, 0x82, 0xb7, 0xaf, 0x54, 0xc3, 0x3d, 0x86, 0xce, 0x28, 0xf3, 0x9f, 0xce, 0x63, - 0x3f, 0x0f, 0x93, 0x18, 0x67, 0x8c, 0xbd, 0x99, 0xa0, 0x11, 0x1d, 0x4e, 0x6d, 0xe4, 0x79, 0xd9, - 0x54, 0xf6, 0x1b, 0x9b, 0x0d, 0xe4, 0x61, 0x9b, 0xf5, 0xa1, 0x1d, 0xca, 0xbd, 0x64, 0x1e, 0xe7, - 0xfd, 0xe6, 0xa6, 0xb1, 0x65, 0xf3, 0x82, 0x74, 0xff, 0xb2, 0x01, 0xad, 0x9f, 0xcf, 0x45, 0x76, - 0x4d, 0xfd, 0xf2, 0x3c, 0x2b, 0xc6, 0xc2, 0x36, 0x7b, 0x0b, 0x5a, 0x91, 0x17, 0x4f, 0x65, 0xdf, - 0xa4, 0xc1, 0x14, 0xc1, 0xde, 0x03, 0xc7, 0x3b, 0xcf, 0x45, 0x36, 0x99, 0x87, 0x41, 0xbf, 0xb1, - 0x69, 0x6c, 0x59, 0xdc, 0x26, 0xc6, 0x69, 0x18, 0xb0, 0x77, 0xc1, 0x0e, 0x92, 0x89, 0x5f, 0x9d, - 0x2b, 0x48, 0x68, 0x2e, 0xf6, 0x01, 0xd8, 0xf3, 0x30, 0x98, 0x44, 0xa1, 0xcc, 0xfb, 0xad, 0x4d, - 0x63, 0xab, 0xb3, 0x63, 0xe3, 0x66, 0x11, 0x3b, 0xde, 0x9e, 0x87, 0x01, 0x81, 0x78, 0x1f, 0x6c, - 0x99, 0xf9, 0x93, 0xf3, 0x79, 0xec, 0xf7, 0x2d, 0x52, 0xba, 0x8d, 0x4a, 0x95, 0x5d, 0xf3, 0xb6, - 0x54, 0x04, 0x6e, 0x2b, 0x13, 0x57, 0x22, 0x93, 0xa2, 0xdf, 0x56, 0x53, 0x69, 0x92, 0x3d, 0x86, - 0xce, 0xb9, 0xe7, 0x8b, 0x7c, 0x92, 0x7a, 0x99, 0x37, 0xeb, 0xdb, 0xe5, 0x40, 0x4f, 0x91, 0x7d, - 0x82, 0x5c, 0xc9, 0xe1, 0x7c, 0x49, 0xb0, 0xcf, 0x61, 0x8d, 0x28, 0x39, 0x39, 0x0f, 0xa3, 0x5c, - 0x64, 0x7d, 0x87, 0xfa, 0xac, 0x53, 0x1f, 0xe2, 0x8c, 0x33, 0x21, 0x78, 0x57, 0x29, 0x29, 0x0e, - 0xfb, 0x21, 0x80, 0x58, 0xa4, 0x5e, 0x1c, 0x4c, 0xbc, 0x28, 0xea, 0x03, 0xad, 0xc1, 0x51, 0x9c, - 0xdd, 0x28, 0x62, 0xef, 0xe0, 0xfa, 0xbc, 0x60, 0x92, 0xcb, 0xfe, 0xda, 0xa6, 0xb1, 0xd5, 0xe4, - 0x16, 0x92, 0x63, 0x89, 0xb8, 0xfa, 0x9e, 0x7f, 0x21, 0xfa, 0xeb, 0x9b, 0xc6, 0x56, 0x8b, 0x2b, - 0xc2, 0xdd, 0x01, 0x87, 0xec, 0x84, 0x70, 0xf8, 0x08, 0xac, 0x2b, 0x24, 0x94, 0x39, 0x75, 0x76, - 0xd6, 0x70, 0x21, 0x4b, 0x53, 0xe2, 0x5a, 0xe8, 0xde, 0x05, 0xfb, 0xd0, 0x8b, 0xa7, 0x85, 0xfd, - 0xe1, 0x01, 0x51, 0x07, 0x87, 0x53, 0xdb, 0xfd, 0x95, 0x09, 0x16, 0x17, 0x72, 0x1e, 0xe5, 0xec, - 0x13, 0x00, 0x84, 0x7f, 0xe6, 0xe5, 0x59, 0xb8, 0xd0, 0xa3, 0x96, 0x07, 0xe0, 0xcc, 0xc3, 0xe0, - 0x88, 0x44, 0xec, 0x31, 0x74, 0x69, 0xf4, 0x42, 0xd5, 0x2c, 0x17, 0xb0, 0x5c, 0x1f, 0xef, 0x90, - 0x8a, 0xee, 0x71, 0x07, 0x2c, 0x3a, 0x71, 0x65, 0x75, 0x6b, 0x5c, 0x53, 0xec, 0x23, 0x58, 0x0f, - 0xe3, 0x1c, 0x4f, 0xc4, 0xcf, 0x27, 0x81, 0x90, 0x85, 0x49, 0xac, 0x2d, 0xb9, 0xfb, 0x42, 0xe6, - 0xec, 0x33, 0x50, 0xb0, 0x16, 0x13, 0xb6, 0x68, 0xc2, 0xf5, 0xe5, 0x71, 0x49, 0x35, 0x23, 0xe9, - 0xe8, 0x19, 0x1f, 0x42, 0x07, 0xf7, 0x57, 0xf4, 0xb0, 0xa8, 0x47, 0x97, 0x76, 0xa3, 0xe1, 0xe0, - 0x80, 0x0a, 0x5a, 0x1d, 0xa1, 0x41, 0xb3, 0x53, 0x66, 0x42, 0x6d, 0x77, 0x00, 0xad, 0xe3, 0x2c, - 0x10, 0xd9, 0x8d, 0x96, 0xcf, 0xa0, 0x19, 0x08, 0xe9, 0xd3, 0xa5, 0xb4, 0x39, 0xb5, 0xcb, 0xdb, - 0xd0, 0xa8, 0xdc, 0x06, 0xf7, 0xef, 0x0c, 0xe8, 0x8c, 0x92, 0x2c, 0x3f, 0x12, 0x52, 0x7a, 0x53, - 0xc1, 0xee, 0x41, 0x2b, 0xc1, 0x61, 0x35, 0xc2, 0x0e, 0xae, 0x89, 0xe6, 0xe1, 0x8a, 0xbf, 0x72, - 0x0e, 0xe6, 0xab, 0xcf, 0x01, 0xad, 0x84, 0xee, 0x51, 0x43, 0x5b, 0x09, 0xdd, 0xa2, 0x3b, 0x60, - 0x25, 0xe7, 0xe7, 0x52, 0x28, 0x2c, 0x5b, 0x5c, 0x53, 0xaf, 0x34, 0x36, 0xf7, 0xf7, 0x00, 0x70, - 0x7d, 0xdf, 0xd3, 0x0a, 0xdc, 0x0b, 0xe8, 0x70, 0xef, 0x3c, 0xdf, 0x4b, 0xe2, 0x5c, 0x2c, 0x72, - 0xb6, 0x0e, 0x66, 0x18, 0x10, 0x44, 0x16, 0x37, 0xc3, 0x00, 0x17, 0x37, 0xcd, 0x92, 0x79, 0x4a, - 0x08, 0xad, 0x71, 0x45, 0x10, 0x94, 0x41, 0x90, 0xd1, 0x8a, 0x11, 0xca, 0x20, 0xc8, 0xd8, 0x3d, - 0xe8, 0xc8, 0xd8, 0x4b, 0xe5, 0x45, 0x92, 0xe3, 0xe2, 0x9a, 0xb4, 0x38, 0x28, 0x58, 0x63, 0xe9, - 0xfe, 0xab, 0x01, 0xd6, 0x91, 0x98, 0x9d, 0x89, 0xec, 0xa5, 0x59, 0xde, 0x05, 0x9b, 0x06, 0x9e, - 0x84, 0x81, 0x9e, 0xa8, 0x4d, 0xf4, 0x41, 0x70, 0xe3, 0x54, 0x77, 0xc0, 0x8a, 0x84, 0x87, 0xe0, - 0x2b, 0x3b, 0xd3, 0x14, 0x62, 0xe3, 0xcd, 0x26, 0x81, 0xf0, 0x02, 0x72, 0x3c, 0x36, 0xb7, 0xbc, - 0xd9, 0xbe, 0xf0, 0x02, 0x5c, 0x5b, 0xe4, 0xc9, 0x7c, 0x32, 0x4f, 0x03, 0x2f, 0x17, 0xe4, 0x70, - 0x9a, 0x68, 0x38, 0x32, 0x3f, 0x25, 0x0e, 0xbb, 0x0f, 0x6f, 0xf8, 0xd1, 0x5c, 0xa2, 0xb7, 0x0b, - 0xe3, 0xf3, 0x64, 0x92, 0xc4, 0xd1, 0x35, 0xe1, 0x6b, 0xf3, 0xdb, 0x5a, 0x70, 0x10, 0x9f, 0x27, - 0xc7, 0x71, 0x74, 0xed, 0xfe, 0xda, 0x84, 0xd6, 0x33, 0x82, 0xe1, 0x31, 0xb4, 0x67, 0xb4, 0xa1, - 0xe2, 0xf6, 0xde, 0x41, 0x84, 0x49, 0xb6, 0xad, 0x76, 0x2a, 0x07, 0x71, 0x9e, 0x5d, 0xf3, 0x42, - 0x0d, 0x7b, 0xe4, 0xde, 0x59, 0x24, 0x72, 0xa9, 0x2d, 0xa2, 0xd2, 0x63, 0xac, 0x04, 0xba, 0x87, - 0x56, 0x5b, 0x85, 0xb5, 0xb1, 0x0a, 0x2b, 0xdb, 0x00, 0xdb, 0xbf, 0x10, 0xfe, 0xa5, 0x9c, 0xcf, - 0x34, 0xe8, 0x4b, 0x7a, 0xe3, 0x29, 0x74, 0xab, 0xeb, 0xc0, 0xc8, 0x74, 0x29, 0xae, 0x09, 0xf8, - 0x26, 0xc7, 0x26, 0xdb, 0x84, 0x16, 0xdd, 0x70, 0x82, 0xbd, 0xb3, 0x03, 0xb8, 0x1c, 0xd5, 0x85, - 0x2b, 0xc1, 0x4f, 0xcd, 0x9f, 0x18, 0x38, 0x4e, 0x75, 0x75, 0xd5, 0x71, 0x9c, 0x57, 0x8f, 0xa3, - 0xba, 0x54, 0xc6, 0x71, 0xff, 0xcf, 0x84, 0xee, 0xd7, 0x22, 0x4b, 0x4e, 0xb2, 0x24, 0x4d, 0xa4, - 0x17, 0xb1, 0xdd, 0xfa, 0xee, 0x14, 0x8a, 0x9b, 0xd8, 0xb9, 0xaa, 0xb6, 0x3d, 0x5a, 0x6e, 0x57, - 0xa1, 0x53, 0xdd, 0xbf, 0x0b, 0x96, 0x42, 0xf7, 0x86, 0x2d, 0x68, 0x09, 0xea, 0x28, 0x3c, 0x09, - 0xbf, 0xfa, 0xf2, 0xb4, 0x84, 0xdd, 0x05, 0x98, 0x79, 0x8b, 0x43, 0xe1, 0x49, 0x71, 0x10, 0x14, - 0xe6, 0x5b, 0x72, 0x10, 0xe7, 0x99, 0xb7, 0x18, 0x2f, 0xe2, 0xb1, 0x24, 0xeb, 0x6a, 0xf2, 0x25, - 0xcd, 0x7e, 0x00, 0xce, 0xcc, 0x5b, 0xe0, 0x3d, 0x3a, 0x08, 0xb4, 0x75, 0x95, 0x0c, 0xf6, 0x3e, - 0x34, 0xf2, 0x45, 0x4c, 0x4e, 0x09, 0xa3, 0x13, 0xa6, 0x1e, 0xe3, 0x45, 0xac, 0x6f, 0x1c, 0x47, - 0x59, 0x01, 0xa8, 0x5d, 0x02, 0xda, 0x83, 0x86, 0x1f, 0x06, 0x14, 0x9e, 0x1c, 0x8e, 0xcd, 0x8d, - 0x3f, 0x84, 0xdb, 0x2b, 0x38, 0x54, 0xcf, 0x61, 0x4d, 0x75, 0x7b, 0xab, 0x7a, 0x0e, 0xcd, 0x2a, - 0xf6, 0xbf, 0x6e, 0xc0, 0x6d, 0x6d, 0x0c, 0x17, 0x61, 0x3a, 0xca, 0xd1, 0xec, 0xfb, 0xd0, 0x26, - 0x6f, 0x23, 0x32, 0x6d, 0x13, 0x05, 0xc9, 0x7e, 0x1f, 0x2c, 0xba, 0x81, 0x85, 0x9d, 0xde, 0x2b, - 0x51, 0x5d, 0x76, 0x57, 0x76, 0xab, 0x8f, 0x44, 0xab, 0xb3, 0x1f, 0x43, 0xeb, 0x1b, 0x91, 0x25, - 0xca, 0x7b, 0x76, 0x76, 0xee, 0xde, 0xd4, 0x0f, 0xcf, 0x56, 0x77, 0x53, 0xca, 0xbf, 0x43, 0xf0, - 0x3f, 0x44, 0x7f, 0x39, 0x4b, 0xae, 0x44, 0xd0, 0x6f, 0xd3, 0x8a, 0xaa, 0xf6, 0x51, 0x88, 0x0a, - 0xb4, 0xed, 0x12, 0xed, 0x7d, 0xe8, 0x54, 0xb6, 0x77, 0x03, 0xd2, 0xf7, 0xea, 0x16, 0xef, 0x2c, - 0x2f, 0x72, 0xf5, 0xe2, 0xec, 0x03, 0x94, 0x9b, 0xfd, 0x6d, 0xaf, 0x9f, 0xfb, 0x67, 0x06, 0xdc, - 0xde, 0x4b, 0xe2, 0x58, 0x50, 0x62, 0xa4, 0x8e, 0xae, 0x34, 0x7b, 0xe3, 0x95, 0x66, 0xff, 0x29, - 0xb4, 0x24, 0x2a, 0xeb, 0xd1, 0xdf, 0xbc, 0xe1, 0x2c, 0xb8, 0xd2, 0x40, 0x37, 0x33, 0xf3, 0x16, - 0x93, 0x54, 0xc4, 0x41, 0x18, 0x4f, 0x0b, 0x37, 0x33, 0xf3, 0x16, 0x27, 0x8a, 0xe3, 0xfe, 0xbd, - 0x01, 0x96, 0xba, 0x31, 0x35, 0x6f, 0x6d, 0xd4, 0xbd, 0xf5, 0x0f, 0xc0, 0x49, 0x33, 0x11, 0x84, - 0x7e, 0x31, 0xab, 0xc3, 0x4b, 0x06, 0x1a, 0xe7, 0x79, 0x92, 0xf9, 0x82, 0x86, 0xb7, 0xb9, 0x22, - 0x90, 0x2b, 0x53, 0xcf, 0x57, 0xc9, 0x5d, 0x83, 0x2b, 0x02, 0x7d, 0xbc, 0x3a, 0x1c, 0x3a, 0x14, - 0x9b, 0x6b, 0x0a, 0xb3, 0x52, 0x8a, 0x7f, 0xe4, 0xa1, 0x1d, 0x12, 0xd9, 0xc8, 0x20, 0xd7, 0xfc, - 0x8f, 0x26, 0x74, 0xf7, 0xc3, 0x4c, 0xf8, 0xb9, 0x08, 0x06, 0xc1, 0x94, 0x46, 0x11, 0x71, 0x1e, - 0xe6, 0xd7, 0x3a, 0xd8, 0x68, 0x6a, 0x99, 0x0b, 0x98, 0xf5, 0x2c, 0x58, 0x9d, 0x45, 0x83, 0x12, - 0x77, 0x45, 0xb0, 0x1d, 0x00, 0x95, 0x25, 0x51, 0xf2, 0xde, 0x7c, 0x75, 0xf2, 0xee, 0x90, 0x1a, - 0x36, 0x11, 0x20, 0xd5, 0x27, 0x54, 0x81, 0xc8, 0xa2, 0xcc, 0x7e, 0x8e, 0x86, 0x4c, 0xc9, 0xc5, - 0x99, 0x88, 0xc8, 0x50, 0x29, 0xb9, 0x38, 0x13, 0xd1, 0x32, 0xa5, 0x6b, 0xab, 0xe5, 0x60, 0x9b, - 0x7d, 0x00, 0x66, 0x92, 0xd2, 0xe6, 0xf5, 0x84, 0xd5, 0x8d, 0x6d, 0x1f, 0xa7, 0xdc, 0x4c, 0x52, - 0xb4, 0x02, 0x95, 0xa9, 0xf6, 0x1d, 0x6d, 0xdc, 0xe8, 0x5d, 0x28, 0x9b, 0xe2, 0x5a, 0xe2, 0xde, - 0x01, 0xf3, 0x38, 0x65, 0x6d, 0x68, 0x8c, 0x06, 0xe3, 0xde, 0x2d, 0x6c, 0xec, 0x0f, 0x0e, 0x7b, - 0x86, 0xfb, 0x3f, 0x26, 0x38, 0x47, 0xf3, 0xdc, 0x43, 0x9b, 0x92, 0xaf, 0x3b, 0xd4, 0x77, 0xc1, - 0x96, 0xb9, 0x97, 0x91, 0x87, 0x56, 0x6e, 0xa5, 0x4d, 0xf4, 0x58, 0xb2, 0x8f, 0xa1, 0x25, 0x82, - 0xa9, 0x28, 0x6e, 0x7b, 0x6f, 0x75, 0x9d, 0x5c, 0x89, 0xd9, 0x16, 0x58, 0xd2, 0xbf, 0x10, 0x33, - 0xaf, 0xdf, 0x2c, 0x15, 0x47, 0xc4, 0x51, 0x11, 0x98, 0x6b, 0x39, 0xdb, 0x81, 0xb7, 0xc3, 0x69, - 0x9c, 0x64, 0x62, 0x12, 0xc6, 0x81, 0x58, 0x4c, 0xfc, 0x24, 0x3e, 0x8f, 0x42, 0x3f, 0xd7, 0x11, - 0xfd, 0x4d, 0x25, 0x3c, 0x40, 0xd9, 0x9e, 0x16, 0xb1, 0x0f, 0xa1, 0x85, 0xa7, 0x23, 0x75, 0x7e, - 0x48, 0x19, 0x25, 0x1e, 0x84, 0x1e, 0x5a, 0x09, 0xd9, 0x43, 0x68, 0x07, 0x59, 0x92, 0x4e, 0x92, - 0x94, 0x70, 0x5e, 0xdf, 0x79, 0x8b, 0xee, 0x43, 0x81, 0xc0, 0xf6, 0x7e, 0x96, 0xa4, 0xc7, 0x29, - 0xb7, 0x02, 0xfa, 0xc5, 0xa4, 0x9f, 0xd4, 0x95, 0x4d, 0x28, 0xcf, 0xe0, 0x20, 0x87, 0x92, 0x63, - 0xf7, 0x11, 0x58, 0xaa, 0x03, 0xb3, 0xa1, 0x39, 0x3c, 0x1e, 0x0e, 0x14, 0xb4, 0xbb, 0x87, 0x87, - 0x3d, 0x03, 0x59, 0xfb, 0xbb, 0xe3, 0xdd, 0x9e, 0x89, 0xad, 0xf1, 0x2f, 0x4e, 0x06, 0xbd, 0x86, - 0xfb, 0x37, 0x06, 0xd8, 0x85, 0xff, 0x66, 0x9f, 0xa2, 0xe3, 0x25, 0xff, 0xaf, 0xaf, 0x2f, 0x3d, - 0x5a, 0x2a, 0x89, 0x18, 0x2f, 0xe4, 0x68, 0x31, 0x84, 0x44, 0xe1, 0xd1, 0x89, 0xa8, 0xa6, 0x81, - 0x8d, 0xda, 0x9b, 0x03, 0x33, 0xda, 0x24, 0x16, 0x3a, 0x33, 0xa2, 0x36, 0x1d, 0x60, 0x18, 0xfb, - 0x02, 0xb5, 0x5b, 0xfa, 0x00, 0x91, 0x1e, 0x4b, 0xf7, 0x6f, 0x4d, 0xb0, 0x97, 0xd1, 0xf8, 0x01, - 0x38, 0xb3, 0x02, 0x0e, 0xed, 0x33, 0xd6, 0x6a, 0x18, 0xf1, 0x52, 0xce, 0xee, 0x80, 0x79, 0x79, - 0xa5, 0x8f, 0xd3, 0x42, 0xad, 0xe7, 0x2f, 0xb8, 0x79, 0x79, 0x55, 0x3a, 0x9d, 0xd6, 0x77, 0x3a, - 0x9d, 0x4f, 0xe0, 0xb6, 0x1f, 0x09, 0x2f, 0x9e, 0x94, 0x3e, 0x43, 0x5d, 0x8b, 0x75, 0x62, 0x9f, - 0x2c, 0x1d, 0x87, 0x76, 0x9c, 0xed, 0x32, 0x3c, 0x7e, 0x04, 0xad, 0x40, 0x44, 0xb9, 0x57, 0x7d, - 0xf3, 0x1d, 0x67, 0x9e, 0x1f, 0x89, 0x7d, 0x64, 0x73, 0x25, 0x65, 0x5b, 0x60, 0x17, 0xa9, 0x82, - 0x7e, 0xe9, 0xd1, 0xe3, 0xa1, 0x38, 0x07, 0xbe, 0x94, 0x96, 0x30, 0x43, 0x05, 0x66, 0xf7, 0x33, - 0x68, 0x3c, 0x7f, 0x31, 0xd2, 0x7b, 0x35, 0x5e, 0xda, 0x6b, 0x01, 0xb6, 0x59, 0x82, 0xed, 0xfe, - 0x6f, 0x03, 0xda, 0xda, 0x37, 0xe0, 0xba, 0xe7, 0xcb, 0x44, 0x17, 0x9b, 0xf5, 0xf8, 0xbc, 0x74, - 0x32, 0xd5, 0xfa, 0x40, 0xe3, 0xbb, 0xeb, 0x03, 0xec, 0xa7, 0xd0, 0x4d, 0x95, 0xac, 0xea, 0x96, - 0xde, 0xa9, 0xf6, 0xd1, 0xbf, 0xd4, 0xaf, 0x93, 0x96, 0x04, 0x1a, 0x03, 0x3d, 0xa9, 0x72, 0x6f, - 0x4a, 0x47, 0xd4, 0xe5, 0x6d, 0xa4, 0xc7, 0xde, 0xf4, 0x15, 0xce, 0xe9, 0x37, 0xf0, 0x31, 0x98, - 0xd0, 0x27, 0x69, 0xbf, 0x4b, 0x7e, 0x03, 0xfd, 0x52, 0xd5, 0x65, 0xac, 0xd5, 0x5d, 0xc6, 0x7b, - 0xe0, 0xf8, 0xc9, 0x6c, 0x16, 0x92, 0x6c, 0x5d, 0x27, 0xac, 0xc4, 0x18, 0x4b, 0xf7, 0x2f, 0x0c, - 0x68, 0xeb, 0xdd, 0xb2, 0x0e, 0xb4, 0xf7, 0x07, 0x4f, 0x77, 0x4f, 0x0f, 0xd1, 0x6b, 0x01, 0x58, - 0x4f, 0x0e, 0x86, 0xbb, 0xfc, 0x17, 0x3d, 0x03, 0xaf, 0xd9, 0xc1, 0x70, 0xdc, 0x33, 0x99, 0x03, - 0xad, 0xa7, 0x87, 0xc7, 0xbb, 0xe3, 0x5e, 0x03, 0xef, 0xd9, 0x93, 0xe3, 0xe3, 0xc3, 0x5e, 0x93, - 0x75, 0xc1, 0xde, 0xdf, 0x1d, 0x0f, 0xc6, 0x07, 0x47, 0x83, 0x5e, 0x0b, 0x75, 0x9f, 0x0d, 0x8e, - 0x7b, 0x16, 0x36, 0x4e, 0x0f, 0xf6, 0x7b, 0x6d, 0x94, 0x9f, 0xec, 0x8e, 0x46, 0x5f, 0x1d, 0xf3, - 0xfd, 0x9e, 0x8d, 0xe3, 0x8e, 0xc6, 0xfc, 0x60, 0xf8, 0xac, 0xe7, 0x60, 0xfb, 0xf8, 0xc9, 0x97, - 0x83, 0xbd, 0x71, 0x0f, 0xdc, 0xcf, 0xa0, 0x53, 0x41, 0x10, 0x7b, 0xf3, 0xc1, 0xd3, 0xde, 0x2d, - 0x9c, 0xf2, 0xc5, 0xee, 0xe1, 0xe9, 0xa0, 0x67, 0xb0, 0x75, 0x00, 0x6a, 0x4e, 0x0e, 0x77, 0x87, - 0xcf, 0x7a, 0xa6, 0xfb, 0x73, 0xb0, 0x4f, 0xc3, 0xe0, 0x49, 0x94, 0xf8, 0x97, 0x68, 0x18, 0x67, - 0x9e, 0x14, 0x3a, 0xd4, 0x53, 0x1b, 0x63, 0x11, 0x19, 0xa5, 0xd4, 0x67, 0xaf, 0x29, 0xc4, 0x2a, - 0x9e, 0xcf, 0x26, 0x54, 0x53, 0x6a, 0x28, 0xcf, 0x1b, 0xcf, 0x67, 0xa7, 0x61, 0x20, 0xdd, 0x21, - 0xb4, 0x4f, 0xc3, 0xe0, 0xc4, 0xf3, 0x2f, 0xd1, 0x1d, 0x9d, 0xe1, 0xd0, 0x13, 0x19, 0x7e, 0x23, - 0xb4, 0x87, 0x76, 0x88, 0x33, 0x0a, 0xbf, 0x11, 0xec, 0x43, 0xb0, 0x88, 0x28, 0xf2, 0x35, 0x32, - 0xf3, 0x62, 0x39, 0x5c, 0xcb, 0xdc, 0xbf, 0x32, 0x96, 0xdb, 0xa2, 0x52, 0xc2, 0x3d, 0x68, 0xa6, - 0x9e, 0x7f, 0xa9, 0x7d, 0x50, 0x47, 0xf7, 0xc1, 0xf9, 0x38, 0x09, 0xd8, 0x27, 0x60, 0x6b, 0xdb, - 0x29, 0x06, 0xee, 0x54, 0x8c, 0x8c, 0x2f, 0x85, 0xf5, 0x53, 0x6d, 0xd4, 0x4f, 0x15, 0x77, 0x2e, - 0xd3, 0x28, 0xa4, 0x57, 0x61, 0x03, 0x7d, 0x95, 0xa2, 0xdc, 0x1f, 0x03, 0x94, 0x75, 0x9a, 0x1b, - 0x1e, 0x15, 0x6f, 0x41, 0xcb, 0x8b, 0x42, 0x0d, 0x98, 0xc3, 0x15, 0xe1, 0x0e, 0xa1, 0x53, 0xa9, - 0xee, 0x20, 0x7c, 0x5e, 0x14, 0x4d, 0x2e, 0xc5, 0xb5, 0xa4, 0xbe, 0x36, 0x6f, 0x7b, 0x51, 0xf4, - 0x5c, 0x5c, 0x4b, 0x8c, 0x0b, 0xaa, 0x30, 0x64, 0xae, 0x54, 0x1a, 0xa8, 0x2b, 0x57, 0x42, 0xf7, - 0x47, 0x60, 0xa9, 0xf2, 0x43, 0xc5, 0xd2, 0x8d, 0x57, 0x46, 0xd3, 0x2f, 0xf4, 0x9a, 0xa9, 0x58, - 0xc1, 0x1e, 0xe8, 0x02, 0x94, 0x54, 0xe5, 0x2e, 0xa3, 0xcc, 0x30, 0x95, 0x92, 0xae, 0x3d, 0x91, - 0xb2, 0xbb, 0x0f, 0xf6, 0x6b, 0x4b, 0x7a, 0x1a, 0x00, 0xb3, 0x04, 0xe0, 0x86, 0x22, 0x9f, 0xfb, - 0x4b, 0x80, 0xb2, 0x50, 0xa5, 0x2f, 0x9e, 0x1a, 0x05, 0x2f, 0xde, 0x7d, 0x7c, 0x0d, 0x86, 0x51, - 0x90, 0x89, 0xb8, 0xb6, 0xeb, 0xb2, 0xb4, 0xb5, 0x94, 0xb3, 0x4d, 0x68, 0x52, 0xfd, 0xad, 0x51, - 0x3a, 0xc6, 0x65, 0xf1, 0x8d, 0x24, 0xee, 0x02, 0xd6, 0x54, 0x90, 0xe6, 0xe2, 0x4f, 0xe6, 0x42, - 0xbe, 0x36, 0xf5, 0xbb, 0x0b, 0xb0, 0x74, 0xe3, 0x45, 0x25, 0xb1, 0xc2, 0x41, 0x23, 0x38, 0x0f, - 0x45, 0x14, 0x14, 0xbb, 0xd1, 0x14, 0x1e, 0xb2, 0x0a, 0xde, 0x4d, 0x55, 0x6e, 0x21, 0xc2, 0xfd, - 0x03, 0xe8, 0x16, 0x33, 0x53, 0x3d, 0xe3, 0xc1, 0x32, 0x81, 0x50, 0x18, 0xab, 0x67, 0x94, 0x52, - 0x19, 0x26, 0x81, 0x78, 0x62, 0xf6, 0x8d, 0x22, 0x87, 0x70, 0xff, 0xa3, 0x51, 0xf4, 0xd6, 0xcf, - 0xfb, 0x5a, 0x5a, 0x6a, 0xac, 0xa6, 0xa5, 0xf5, 0x14, 0xcf, 0xfc, 0x8d, 0x52, 0xbc, 0x9f, 0x80, - 0x13, 0x50, 0x9e, 0x13, 0x5e, 0x15, 0x2e, 0x7b, 0x63, 0x35, 0xa7, 0xd1, 0x99, 0x50, 0x78, 0x25, - 0x78, 0xa9, 0x8c, 0x6b, 0xc9, 0x93, 0x4b, 0x11, 0x87, 0xdf, 0x50, 0xfd, 0x02, 0xf7, 0x5c, 0x32, - 0xca, 0x62, 0x90, 0x4a, 0x77, 0x74, 0x31, 0xa8, 0xa8, 0x6b, 0x59, 0x65, 0x5d, 0x0b, 0xf1, 0x9c, - 0xa7, 0x52, 0x64, 0x79, 0x91, 0x20, 0x2b, 0x6a, 0x99, 0x4b, 0x3a, 0x5a, 0x17, 0x73, 0xc9, 0xf7, - 0xa1, 0x1b, 0x27, 0xf1, 0x24, 0x9e, 0x47, 0x11, 0xa6, 0xf0, 0xba, 0x84, 0xd9, 0x89, 0x93, 0x78, - 0xa8, 0x59, 0xec, 0x3e, 0xbc, 0x51, 0x55, 0x51, 0xf6, 0xdc, 0x51, 0x15, 0x90, 0x8a, 0x1e, 0x59, - 0xfd, 0x16, 0xf4, 0x92, 0xb3, 0x5f, 0x0a, 0x3f, 0x27, 0xc4, 0x26, 0x64, 0xc8, 0x5d, 0x15, 0xb8, - 0x15, 0x1f, 0x21, 0x1a, 0x7a, 0x33, 0xe1, 0x7e, 0x01, 0xce, 0x12, 0x84, 0x4a, 0xa2, 0xe4, 0x40, - 0xeb, 0x60, 0xb8, 0x3f, 0xf8, 0xa3, 0x9e, 0x81, 0x5e, 0x9e, 0x0f, 0x5e, 0x0c, 0xf8, 0x68, 0xd0, - 0x33, 0xd1, 0x03, 0xef, 0x0f, 0x0e, 0x07, 0xe3, 0x41, 0xaf, 0xf1, 0x65, 0xd3, 0x6e, 0xf7, 0x6c, - 0x6e, 0x8b, 0x45, 0x1a, 0x85, 0x7e, 0x98, 0xbb, 0x23, 0x80, 0x32, 0xa7, 0x43, 0x7f, 0x53, 0xce, - 0xad, 0x4e, 0xd4, 0xce, 0xf5, 0xac, 0x98, 0x6d, 0x6a, 0x53, 0x33, 0x5f, 0x95, 0x6d, 0x2a, 0xb9, - 0x7b, 0x0a, 0xf6, 0x91, 0x97, 0xbe, 0xf4, 0x3a, 0xeb, 0x2e, 0xdf, 0xe0, 0x73, 0x5d, 0x91, 0xd2, - 0xe1, 0xfb, 0x23, 0x68, 0x6b, 0x97, 0xa7, 0x6f, 0x4d, 0xcd, 0x1d, 0x16, 0x32, 0xf7, 0xcf, 0x0d, - 0x78, 0xeb, 0x28, 0xb9, 0x12, 0xcb, 0x0c, 0xe6, 0xc4, 0xbb, 0x8e, 0x12, 0x2f, 0xf8, 0x0e, 0x43, - 0xfc, 0x21, 0x80, 0x4c, 0xe6, 0x99, 0x2f, 0x26, 0xd3, 0x65, 0x21, 0xcc, 0x51, 0x9c, 0x67, 0xba, - 0xe6, 0x2e, 0x64, 0x4e, 0x42, 0x1d, 0x28, 0x90, 0x46, 0xd1, 0xdb, 0x60, 0xe5, 0x8b, 0xb8, 0xac, - 0xbb, 0xb5, 0x72, 0x7c, 0x1a, 0xbb, 0x7b, 0xe0, 0x8c, 0x17, 0xf4, 0x60, 0x9c, 0xcb, 0x5a, 0x4c, - 0x36, 0x5e, 0x13, 0x93, 0xcd, 0x95, 0x98, 0xfc, 0xdf, 0x06, 0x74, 0x2a, 0xa9, 0x15, 0x7b, 0x1f, - 0x9a, 0xf9, 0x22, 0xae, 0x17, 0xac, 0x8b, 0x49, 0x38, 0x89, 0xd0, 0xde, 0xf0, 0x35, 0xe9, 0x49, - 0x19, 0x4e, 0x63, 0x11, 0xe8, 0x21, 0xf1, 0x85, 0xb9, 0xab, 0x59, 0xec, 0x10, 0x6e, 0x2b, 0x4f, - 0x52, 0x14, 0xab, 0x8a, 0x37, 0xc4, 0x07, 0x2b, 0xa9, 0x9c, 0x7a, 0x54, 0xef, 0x15, 0x5a, 0xaa, - 0x6c, 0xb0, 0x3e, 0xad, 0x31, 0x37, 0x76, 0xe1, 0xcd, 0x1b, 0xd4, 0xbe, 0x57, 0x7d, 0xe4, 0x1e, - 0xac, 0x8d, 0x17, 0xf1, 0x38, 0x9c, 0x09, 0x99, 0x7b, 0xb3, 0x94, 0x72, 0x1a, 0x1d, 0x09, 0x9a, - 0xdc, 0xcc, 0xa5, 0xfb, 0x31, 0x74, 0x4f, 0x84, 0xc8, 0xb8, 0x90, 0x69, 0x12, 0xab, 0x78, 0x2e, - 0x69, 0xd3, 0x3a, 0xec, 0x68, 0xca, 0xfd, 0x63, 0x70, 0x30, 0x91, 0x7f, 0xe2, 0xe5, 0xfe, 0xc5, - 0xf7, 0x49, 0xf4, 0x3f, 0x86, 0x76, 0xaa, 0xcc, 0x44, 0xe7, 0xde, 0x5d, 0xf2, 0x71, 0xda, 0x74, - 0x78, 0x21, 0x74, 0x39, 0x34, 0x86, 0xf3, 0x59, 0xf5, 0x2b, 0x53, 0x53, 0x7d, 0x65, 0xaa, 0x3d, - 0x8d, 0xcd, 0xfa, 0xd3, 0x18, 0x2d, 0xef, 0x3c, 0xc9, 0xfe, 0xd4, 0xcb, 0x02, 0x11, 0xe8, 0xf7, - 0x77, 0xc9, 0x70, 0xbf, 0x86, 0x4e, 0x71, 0x32, 0x07, 0x01, 0x7d, 0x48, 0x22, 0xd3, 0x38, 0x08, - 0x6a, 0x96, 0xa2, 0xde, 0xaf, 0x22, 0x0e, 0x0e, 0x8a, 0x23, 0x55, 0x44, 0x7d, 0x66, 0x5d, 0x9f, - 0x59, 0x3e, 0xca, 0x9f, 0x42, 0xb7, 0xc8, 0xb7, 0x8f, 0x44, 0xee, 0x91, 0xb1, 0x45, 0xa1, 0x88, - 0x2b, 0x86, 0x68, 0x2b, 0xc6, 0x58, 0xbe, 0xa6, 0x12, 0xec, 0x6e, 0x83, 0xa5, 0x2d, 0x99, 0x41, - 0xd3, 0x4f, 0x02, 0x75, 0x81, 0x5a, 0x9c, 0xda, 0x08, 0xc7, 0x4c, 0x4e, 0x8b, 0xe0, 0x39, 0x93, - 0x53, 0xf7, 0x9f, 0x4d, 0x58, 0x7b, 0xe2, 0xf9, 0x97, 0xf3, 0xb4, 0x88, 0x5e, 0x95, 0x47, 0x93, - 0x51, 0x7b, 0x34, 0x55, 0x1f, 0x48, 0x66, 0xed, 0x81, 0x54, 0x5b, 0x50, 0xa3, 0x1e, 0xf1, 0xde, - 0x81, 0xf6, 0x3c, 0x0e, 0x17, 0xc5, 0xad, 0x73, 0xb8, 0x85, 0xe4, 0x58, 0xb2, 0x4d, 0xe8, 0xe0, - 0xc5, 0x0c, 0x63, 0x7a, 0x2a, 0x11, 0x20, 0x0e, 0xaf, 0xb2, 0xf0, 0xa6, 0x7b, 0xbe, 0x2f, 0xa4, - 0xc4, 0xbc, 0x45, 0xa7, 0xdb, 0x8e, 0xe2, 0x3c, 0x17, 0xd7, 0xe4, 0x08, 0x84, 0x9f, 0x89, 0x7c, - 0x52, 0x3e, 0x7b, 0x1c, 0xc5, 0x41, 0xf1, 0x07, 0xb0, 0x26, 0x85, 0x94, 0x61, 0x12, 0x4f, 0x28, - 0x72, 0xe8, 0xd7, 0x69, 0x57, 0x33, 0xc7, 0xc8, 0xc3, 0x03, 0xf7, 0xe2, 0x24, 0xbe, 0x9e, 0x25, - 0x73, 0xa9, 0x83, 0x41, 0xc9, 0x58, 0x89, 0xd6, 0xb0, 0x1a, 0xad, 0xdd, 0x1c, 0xd6, 0x06, 0x8b, - 0x94, 0xbe, 0x27, 0x7c, 0x67, 0xe4, 0xaf, 0xc0, 0x6a, 0xd6, 0x60, 0xad, 0x00, 0xd4, 0xa0, 0xda, - 0x4e, 0x01, 0x10, 0xe6, 0x02, 0x49, 0x36, 0xf3, 0xf2, 0x02, 0x38, 0x45, 0xb9, 0x7f, 0x6d, 0x82, - 0xa3, 0x8e, 0x0c, 0xb7, 0xf9, 0x29, 0x34, 0x29, 0x22, 0x1b, 0x14, 0x5e, 0xdf, 0xc6, 0x8b, 0xb3, - 0x14, 0x6e, 0x3f, 0x17, 0xd7, 0x14, 0x93, 0x49, 0xe5, 0xc6, 0x7a, 0x8e, 0xf6, 0xde, 0x2a, 0x19, - 0x25, 0xef, 0xfd, 0x1e, 0x38, 0xca, 0x03, 0x22, 0x5f, 0xd7, 0xca, 0x89, 0x71, 0x1a, 0xd2, 0x87, - 0x86, 0x5c, 0x64, 0x33, 0x7d, 0x5a, 0xd4, 0x2e, 0xa3, 0xb1, 0xa5, 0xbe, 0x7e, 0x10, 0xe1, 0x5e, - 0x40, 0x5b, 0xcf, 0x8e, 0xd1, 0xeb, 0x74, 0xf8, 0x7c, 0x78, 0xfc, 0xd5, 0xb0, 0x77, 0x6b, 0xf9, - 0xea, 0x37, 0xca, 0xf8, 0x66, 0x56, 0xe3, 0x5b, 0x03, 0xf9, 0x7b, 0xc7, 0xa7, 0xc3, 0x71, 0xaf, - 0xc9, 0xd6, 0xc0, 0xa1, 0xe6, 0x84, 0x0f, 0x5e, 0xf4, 0x5a, 0xf4, 0x0e, 0xd9, 0xfb, 0xd9, 0xe0, - 0x68, 0xb7, 0x67, 0x2d, 0x6b, 0x06, 0x6d, 0x8c, 0x23, 0x6f, 0xa8, 0x2d, 0x57, 0xb3, 0xf6, 0xea, - 0x07, 0xe8, 0xa6, 0xfa, 0x00, 0xfd, 0xbb, 0x4d, 0xd4, 0x77, 0xfe, 0xc5, 0x80, 0x26, 0xfa, 0x2c, - 0xf6, 0x00, 0x9c, 0x9f, 0x09, 0x2f, 0xcb, 0xcf, 0x84, 0x97, 0xb3, 0x9a, 0x7f, 0xda, 0xa8, 0x51, - 0xee, 0xad, 0xc7, 0x06, 0xdb, 0x56, 0x9f, 0x96, 0x8a, 0x2f, 0x66, 0x6b, 0x85, 0xe7, 0x23, 0xcf, - 0xb8, 0xaa, 0xbf, 0x45, 0xfa, 0x5f, 0x26, 0x61, 0xbc, 0xa7, 0xbe, 0xb7, 0xb0, 0x55, 0x4f, 0xb9, - 0xda, 0x83, 0x3d, 0x04, 0xeb, 0x40, 0xa2, 0x4b, 0x7e, 0x59, 0x95, 0x22, 0x7e, 0xd5, 0x5b, 0xbb, - 0xb7, 0x76, 0xfe, 0xa9, 0x01, 0xcd, 0xaf, 0x45, 0x96, 0xb0, 0x1f, 0x41, 0x5b, 0x57, 0x53, 0x59, - 0xa5, 0x6a, 0xba, 0x41, 0x29, 0xdf, 0x4a, 0x99, 0x95, 0x66, 0xe9, 0xa9, 0xa4, 0xa1, 0x2c, 0x62, - 0xb0, 0xb2, 0xd8, 0xfb, 0xd2, 0xa2, 0xbe, 0x80, 0xde, 0x28, 0xcf, 0x84, 0x37, 0xab, 0xa8, 0xd7, - 0x81, 0xba, 0xa9, 0x22, 0x42, 0x78, 0x3d, 0x00, 0x4b, 0xc5, 0xbd, 0x95, 0x0e, 0xab, 0xc5, 0x0d, - 0x52, 0xfe, 0x04, 0x3a, 0xa3, 0x8b, 0x64, 0x1e, 0x05, 0x23, 0x91, 0x5d, 0x09, 0x56, 0xf9, 0xa2, - 0xb1, 0x51, 0x69, 0xbb, 0xb7, 0xd8, 0x16, 0x80, 0x72, 0xed, 0xf8, 0xa2, 0x64, 0x6d, 0x94, 0x0d, - 0xe7, 0x33, 0x35, 0x68, 0xc5, 0xe7, 0x2b, 0xcd, 0x4a, 0xf8, 0x7b, 0x9d, 0xe6, 0xe7, 0xb0, 0xb6, - 0x47, 0x36, 0x73, 0x9c, 0xed, 0x9e, 0x25, 0x59, 0xce, 0x56, 0xbf, 0x6a, 0x6c, 0xac, 0x32, 0xdc, - 0x5b, 0xec, 0x31, 0xd8, 0xe3, 0xec, 0x5a, 0xe9, 0xbf, 0xa1, 0xb3, 0x86, 0x72, 0xbe, 0x1b, 0x76, - 0xb9, 0xf3, 0x0f, 0x0d, 0xb0, 0xbe, 0x4a, 0xb2, 0x4b, 0x91, 0xb1, 0xfb, 0x60, 0x51, 0x15, 0x4a, - 0x9b, 0xd1, 0xb2, 0x22, 0x75, 0xd3, 0x44, 0x1f, 0x82, 0x43, 0xa0, 0x8c, 0x3d, 0x79, 0xa9, 0x8e, - 0x8a, 0xfe, 0xfa, 0xa0, 0x70, 0x51, 0xef, 0x09, 0x3a, 0xd7, 0x75, 0x75, 0x50, 0xcb, 0xa2, 0x5c, - 0xad, 0x34, 0xb4, 0xd1, 0x56, 0x75, 0x9e, 0x11, 0x9a, 0xe6, 0x63, 0x03, 0x9d, 0xd1, 0x48, 0xed, - 0x14, 0x95, 0xca, 0x0f, 0xc1, 0x1b, 0xeb, 0x05, 0x63, 0x39, 0xf2, 0x23, 0xb0, 0x54, 0xb2, 0xa9, - 0xb6, 0x59, 0x7b, 0x41, 0x6d, 0xf4, 0xaa, 0x2c, 0xdd, 0xe1, 0x53, 0xb0, 0xd4, 0x2d, 0x57, 0x1d, - 0x6a, 0x41, 0x4b, 0xad, 0x5a, 0x05, 0x3e, 0xa5, 0xaa, 0xfc, 0xb2, 0x52, 0xad, 0xf9, 0xe8, 0x15, - 0xd5, 0x87, 0xd0, 0xe3, 0xc2, 0x17, 0x61, 0x25, 0x0d, 0x65, 0xc5, 0xa6, 0x6e, 0xb8, 0x7d, 0x5f, - 0xc0, 0x5a, 0x2d, 0x65, 0x65, 0x7d, 0x02, 0xfa, 0x86, 0x2c, 0x76, 0xb5, 0xf3, 0x93, 0xde, 0xbf, - 0x7d, 0x7b, 0xd7, 0xf8, 0xf7, 0x6f, 0xef, 0x1a, 0xff, 0xf9, 0xed, 0x5d, 0xe3, 0x57, 0xff, 0x75, - 0xf7, 0xd6, 0x99, 0x45, 0x7f, 0x99, 0xf9, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x86, - 0x2f, 0xa5, 0x76, 0x23, 0x00, 0x00, + // 3721 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x8f, 0xdc, 0x46, + 0x76, 0x22, 0xbb, 0x9b, 0x4d, 0xbe, 0xee, 0x19, 0xb5, 0xca, 0xb2, 0xdc, 0x1e, 0xef, 0x4a, 0x63, + 0xfa, 0x43, 0x63, 0xc9, 0x1a, 0xc9, 0xe3, 0x0d, 0xb2, 0xde, 0x20, 0x87, 0xd1, 0x4c, 0x4b, 0x3b, + 0xd6, 0x7c, 0x6d, 0x75, 0x8f, 0x9c, 0xf5, 0x21, 0x0d, 0x0e, 0x59, 0xd3, 0xc3, 0x1d, 0x36, 0xc9, + 0xb0, 0xd8, 0x93, 0x1e, 0xdf, 0x72, 0x48, 0x80, 0x00, 0xc9, 0x29, 0x97, 0x3d, 0x04, 0x39, 0x04, + 0xc8, 0x25, 0x97, 0x5c, 0x83, 0x1c, 0x03, 0x04, 0xc8, 0x31, 0xc8, 0x2f, 0x08, 0x9c, 0x20, 0xa7, + 0x9c, 0x03, 0xe4, 0x16, 0xbc, 0x57, 0xc5, 0x26, 0xd9, 0x1a, 0xc9, 0xeb, 0x05, 0x7c, 0xea, 0x7a, + 0x1f, 0xf5, 0xf5, 0xde, 0xab, 0xf7, 0xc5, 0x06, 0x3b, 0x3d, 0xdd, 0x4c, 0xb3, 0x24, 0x4f, 0x98, + 0x99, 0x9e, 0xae, 0x39, 0x5e, 0x1a, 0x2a, 0x70, 0xed, 0xfe, 0x24, 0xcc, 0xcf, 0x67, 0xa7, 0x9b, + 0x7e, 0x32, 0x7d, 0x1c, 0x4c, 0x32, 0x2f, 0x3d, 0x7f, 0x14, 0x26, 0x8f, 0x4f, 0xbd, 0x60, 0x22, + 0xb2, 0xc7, 0xe9, 0xe9, 0xe3, 0x62, 0x9e, 0xbb, 0x06, 0xcd, 0xfd, 0x50, 0xe6, 0x8c, 0x41, 0x73, + 0x16, 0x06, 0xb2, 0x6f, 0xac, 0x37, 0x36, 0x2c, 0x4e, 0x63, 0xf7, 0x00, 0x9c, 0x91, 0x27, 0x2f, + 0x5e, 0x7a, 0xd1, 0x4c, 0xb0, 0x1e, 0x34, 0x2e, 0xbd, 0xa8, 0x6f, 0xac, 0x1b, 0x1b, 0x5d, 0x8e, + 0x43, 0xb6, 0x09, 0xf6, 0xa5, 0x17, 0x8d, 0xf3, 0xab, 0x54, 0xf4, 0xcd, 0x75, 0x63, 0x63, 0x75, + 0xeb, 0xad, 0xcd, 0xf4, 0x74, 0xf3, 0x38, 0x91, 0x79, 0x18, 0x4f, 0x36, 0x5f, 0x7a, 0xd1, 0xe8, + 0x2a, 0x15, 0xbc, 0x7d, 0xa9, 0x06, 0xee, 0x11, 0x74, 0x86, 0x99, 0xff, 0x6c, 0x16, 0xfb, 0x79, + 0x98, 0xc4, 0xb8, 0x63, 0xec, 0x4d, 0x05, 0xad, 0xe8, 0x70, 0x1a, 0x23, 0xce, 0xcb, 0x26, 0xb2, + 0xdf, 0x58, 0x6f, 0x20, 0x0e, 0xc7, 0xac, 0x0f, 0xed, 0x50, 0xee, 0x24, 0xb3, 0x38, 0xef, 0x37, + 0xd7, 0x8d, 0x0d, 0x9b, 0x17, 0xa0, 0xfb, 0xe7, 0x0d, 0x68, 0xfd, 0x62, 0x26, 0xb2, 0x2b, 0x9a, + 0x97, 0xe7, 0x59, 0xb1, 0x16, 0x8e, 0xd9, 0x6d, 0x68, 0x45, 0x5e, 0x3c, 0x91, 0x7d, 0x93, 0x16, + 0x53, 0x00, 0x7b, 0x0f, 0x1c, 0xef, 0x2c, 0x17, 0xd9, 0x78, 0x16, 0x06, 0xfd, 0xc6, 0xba, 0xb1, + 0x61, 0x71, 0x9b, 0x10, 0x27, 0x61, 0xc0, 0xde, 0x05, 0x3b, 0x48, 0xc6, 0x7e, 0x75, 0xaf, 0x20, + 0xa1, 0xbd, 0xd8, 0x07, 0x60, 0xcf, 0xc2, 0x60, 0x1c, 0x85, 0x32, 0xef, 0xb7, 0xd6, 0x8d, 0x8d, + 0xce, 0x96, 0x8d, 0x97, 0x45, 0xd9, 0xf1, 0xf6, 0x2c, 0x0c, 0x48, 0x88, 0x0f, 0xc0, 0x96, 0x99, + 0x3f, 0x3e, 0x9b, 0xc5, 0x7e, 0xdf, 0x22, 0xa6, 0x9b, 0xc8, 0x54, 0xb9, 0x35, 0x6f, 0x4b, 0x05, + 0xe0, 0xb5, 0x32, 0x71, 0x29, 0x32, 0x29, 0xfa, 0x6d, 0xb5, 0x95, 0x06, 0xd9, 0x13, 0xe8, 0x9c, + 0x79, 0xbe, 0xc8, 0xc7, 0xa9, 0x97, 0x79, 0xd3, 0xbe, 0x5d, 0x2e, 0xf4, 0x0c, 0xd1, 0xc7, 0x88, + 0x95, 0x1c, 0xce, 0x16, 0x00, 0xfb, 0x1c, 0x56, 0x08, 0x92, 0xe3, 0xb3, 0x30, 0xca, 0x45, 0xd6, + 0x77, 0x68, 0xce, 0x2a, 0xcd, 0x21, 0xcc, 0x28, 0x13, 0x82, 0x77, 0x15, 0x93, 0xc2, 0xb0, 0x1f, + 0x03, 0x88, 0x79, 0xea, 0xc5, 0xc1, 0xd8, 0x8b, 0xa2, 0x3e, 0xd0, 0x19, 0x1c, 0x85, 0xd9, 0x8e, + 0x22, 0xf6, 0x0e, 0x9e, 0xcf, 0x0b, 0xc6, 0xb9, 0xec, 0xaf, 0xac, 0x1b, 0x1b, 0x4d, 0x6e, 0x21, + 0x38, 0x92, 0x28, 0x57, 0xdf, 0xf3, 0xcf, 0x45, 0x7f, 0x75, 0xdd, 0xd8, 0x68, 0x71, 0x05, 0xb8, + 0x5b, 0xe0, 0x90, 0x9d, 0x90, 0x1c, 0x3e, 0x02, 0xeb, 0x12, 0x01, 0x65, 0x4e, 0x9d, 0xad, 0x15, + 0x3c, 0xc8, 0xc2, 0x94, 0xb8, 0x26, 0xba, 0x77, 0xc1, 0xde, 0xf7, 0xe2, 0x49, 0x61, 0x7f, 0xa8, + 0x20, 0x9a, 0xe0, 0x70, 0x1a, 0xbb, 0xbf, 0x36, 0xc1, 0xe2, 0x42, 0xce, 0xa2, 0x9c, 0xdd, 0x07, + 0x40, 0xf1, 0x4f, 0xbd, 0x3c, 0x0b, 0xe7, 0x7a, 0xd5, 0x52, 0x01, 0xce, 0x2c, 0x0c, 0x0e, 0x88, + 0xc4, 0x9e, 0x40, 0x97, 0x56, 0x2f, 0x58, 0xcd, 0xf2, 0x00, 0x8b, 0xf3, 0xf1, 0x0e, 0xb1, 0xe8, + 0x19, 0x77, 0xc0, 0x22, 0x8d, 0x2b, 0xab, 0x5b, 0xe1, 0x1a, 0x62, 0x1f, 0xc1, 0x6a, 0x18, 0xe7, + 0xa8, 0x11, 0x3f, 0x1f, 0x07, 0x42, 0x16, 0x26, 0xb1, 0xb2, 0xc0, 0xee, 0x0a, 0x99, 0xb3, 0xcf, + 0x40, 0x89, 0xb5, 0xd8, 0xb0, 0x45, 0x1b, 0xae, 0x2e, 0xd4, 0x25, 0xd5, 0x8e, 0xc4, 0xa3, 0x77, + 0x7c, 0x04, 0x1d, 0xbc, 0x5f, 0x31, 0xc3, 0xa2, 0x19, 0x5d, 0xba, 0x8d, 0x16, 0x07, 0x07, 0x64, + 0xd0, 0xec, 0x28, 0x1a, 0x34, 0x3b, 0x65, 0x26, 0x34, 0x76, 0x07, 0xd0, 0x3a, 0xca, 0x02, 0x91, + 0x5d, 0x6b, 0xf9, 0x0c, 0x9a, 0x81, 0x90, 0x3e, 0x3d, 0x4a, 0x9b, 0xd3, 0xb8, 0x7c, 0x0d, 0x8d, + 0xca, 0x6b, 0x70, 0xff, 0xc6, 0x80, 0xce, 0x30, 0xc9, 0xf2, 0x03, 0x21, 0xa5, 0x37, 0x11, 0xec, + 0x1e, 0xb4, 0x12, 0x5c, 0x56, 0x4b, 0xd8, 0xc1, 0x33, 0xd1, 0x3e, 0x5c, 0xe1, 0x97, 0xf4, 0x60, + 0xbe, 0x5e, 0x0f, 0x68, 0x25, 0xf4, 0x8e, 0x1a, 0xda, 0x4a, 0xe8, 0x15, 0xdd, 0x01, 0x2b, 0x39, + 0x3b, 0x93, 0x42, 0xc9, 0xb2, 0xc5, 0x35, 0xf4, 0x5a, 0x63, 0x73, 0x7f, 0x07, 0x00, 0xcf, 0xf7, + 0x3d, 0xad, 0xc0, 0x3d, 0x87, 0x0e, 0xf7, 0xce, 0xf2, 0x9d, 0x24, 0xce, 0xc5, 0x3c, 0x67, 0xab, + 0x60, 0x86, 0x01, 0x89, 0xc8, 0xe2, 0x66, 0x18, 0xe0, 0xe1, 0x26, 0x59, 0x32, 0x4b, 0x49, 0x42, + 0x2b, 0x5c, 0x01, 0x24, 0xca, 0x20, 0xc8, 0xe8, 0xc4, 0x28, 0xca, 0x20, 0xc8, 0xd8, 0x3d, 0xe8, + 0xc8, 0xd8, 0x4b, 0xe5, 0x79, 0x92, 0xe3, 0xe1, 0x9a, 0x74, 0x38, 0x28, 0x50, 0x23, 0xe9, 0xfe, + 0x8b, 0x01, 0xd6, 0x81, 0x98, 0x9e, 0x8a, 0xec, 0x95, 0x5d, 0xde, 0x05, 0x9b, 0x16, 0x1e, 0x87, + 0x81, 0xde, 0xa8, 0x4d, 0xf0, 0x5e, 0x70, 0xed, 0x56, 0x77, 0xc0, 0x8a, 0x84, 0x87, 0xc2, 0x57, + 0x76, 0xa6, 0x21, 0x94, 0x8d, 0x37, 0x1d, 0x07, 0xc2, 0x0b, 0xc8, 0xf1, 0xd8, 0xdc, 0xf2, 0xa6, + 0xbb, 0xc2, 0x0b, 0xf0, 0x6c, 0x91, 0x27, 0xf3, 0xf1, 0x2c, 0x0d, 0xbc, 0x5c, 0x90, 0xc3, 0x69, + 0xa2, 0xe1, 0xc8, 0xfc, 0x84, 0x30, 0xec, 0x01, 0xdc, 0xf2, 0xa3, 0x99, 0x44, 0x6f, 0x17, 0xc6, + 0x67, 0xc9, 0x38, 0x89, 0xa3, 0x2b, 0x92, 0xaf, 0xcd, 0x6f, 0x6a, 0xc2, 0x5e, 0x7c, 0x96, 0x1c, + 0xc5, 0xd1, 0x95, 0xfb, 0x8f, 0x26, 0xb4, 0x9e, 0x93, 0x18, 0x9e, 0x40, 0x7b, 0x4a, 0x17, 0x2a, + 0x5e, 0xef, 0x1d, 0x94, 0x30, 0xd1, 0x36, 0xd5, 0x4d, 0xe5, 0x20, 0xce, 0xb3, 0x2b, 0x5e, 0xb0, + 0xe1, 0x8c, 0xdc, 0x3b, 0x8d, 0x44, 0x2e, 0xb5, 0x45, 0x54, 0x66, 0x8c, 0x14, 0x41, 0xcf, 0xd0, + 0x6c, 0xcb, 0x62, 0x6d, 0x2c, 0x8b, 0x95, 0xad, 0x81, 0xed, 0x9f, 0x0b, 0xff, 0x42, 0xce, 0xa6, + 0x5a, 0xe8, 0x0b, 0x78, 0xed, 0x19, 0x74, 0xab, 0xe7, 0xc0, 0xc8, 0x74, 0x21, 0xae, 0x48, 0xf0, + 0x4d, 0x8e, 0x43, 0xb6, 0x0e, 0x2d, 0x7a, 0xe1, 0x24, 0xf6, 0xce, 0x16, 0xe0, 0x71, 0xd4, 0x14, + 0xae, 0x08, 0x3f, 0x33, 0x7f, 0x6a, 0xe0, 0x3a, 0xd5, 0xd3, 0x55, 0xd7, 0x71, 0x5e, 0xbf, 0x8e, + 0x9a, 0x52, 0x59, 0xc7, 0xfd, 0x3f, 0x13, 0xba, 0x5f, 0x8b, 0x2c, 0x39, 0xce, 0x92, 0x34, 0x91, + 0x5e, 0xc4, 0xb6, 0xeb, 0xb7, 0x53, 0x52, 0x5c, 0xc7, 0xc9, 0x55, 0xb6, 0xcd, 0xe1, 0xe2, 0xba, + 0x4a, 0x3a, 0xd5, 0xfb, 0xbb, 0x60, 0x29, 0xe9, 0x5e, 0x73, 0x05, 0x4d, 0x41, 0x1e, 0x25, 0x4f, + 0x92, 0x5f, 0xfd, 0x78, 0x9a, 0xc2, 0xee, 0x02, 0x4c, 0xbd, 0xf9, 0xbe, 0xf0, 0xa4, 0xd8, 0x0b, + 0x0a, 0xf3, 0x2d, 0x31, 0x28, 0xe7, 0xa9, 0x37, 0x1f, 0xcd, 0xe3, 0x91, 0x24, 0xeb, 0x6a, 0xf2, + 0x05, 0xcc, 0x7e, 0x04, 0xce, 0xd4, 0x9b, 0xe3, 0x3b, 0xda, 0x0b, 0xb4, 0x75, 0x95, 0x08, 0xf6, + 0x3e, 0x34, 0xf2, 0x79, 0x4c, 0x4e, 0x09, 0xa3, 0x13, 0xa6, 0x1e, 0xa3, 0x79, 0xac, 0x5f, 0x1c, + 0x47, 0x5a, 0x21, 0x50, 0xbb, 0x14, 0x68, 0x0f, 0x1a, 0x7e, 0x18, 0x50, 0x78, 0x72, 0x38, 0x0e, + 0xd7, 0x7e, 0x1f, 0x6e, 0x2e, 0xc9, 0xa1, 0xaa, 0x87, 0x15, 0x35, 0xed, 0x76, 0x55, 0x0f, 0xcd, + 0xaa, 0xec, 0xff, 0xbb, 0x01, 0x37, 0xb5, 0x31, 0x9c, 0x87, 0xe9, 0x30, 0x47, 0xb3, 0xef, 0x43, + 0x9b, 0xbc, 0x8d, 0xc8, 0xb4, 0x4d, 0x14, 0x20, 0xfb, 0x5d, 0xb0, 0xe8, 0x05, 0x16, 0x76, 0x7a, + 0xaf, 0x94, 0xea, 0x62, 0xba, 0xb2, 0x5b, 0xad, 0x12, 0xcd, 0xce, 0x7e, 0x02, 0xad, 0x6f, 0x44, + 0x96, 0x28, 0xef, 0xd9, 0xd9, 0xba, 0x7b, 0xdd, 0x3c, 0xd4, 0xad, 0x9e, 0xa6, 0x98, 0x7f, 0x40, + 0xe1, 0x7f, 0x88, 0xfe, 0x72, 0x9a, 0x5c, 0x8a, 0xa0, 0xdf, 0xa6, 0x13, 0x55, 0xed, 0xa3, 0x20, + 0x15, 0xd2, 0xb6, 0x17, 0xd2, 0x66, 0x9f, 0xc2, 0x2d, 0x81, 0x92, 0x48, 0xb3, 0x50, 0x8a, 0x41, + 0x8c, 0x36, 0xa2, 0xb4, 0x61, 0xf3, 0x57, 0x09, 0x6b, 0xbb, 0xd0, 0xa9, 0x08, 0xe3, 0x1a, 0xbd, + 0xdc, 0xab, 0xbf, 0x0f, 0x67, 0xf1, 0xec, 0xab, 0xcf, 0x6c, 0x17, 0xa0, 0x14, 0xcd, 0x6f, 0xfb, + 0x58, 0xdd, 0x3f, 0x31, 0xe0, 0xe6, 0x4e, 0x12, 0xc7, 0x82, 0xd2, 0x28, 0xa5, 0xe8, 0xf2, 0x91, + 0x18, 0xaf, 0x7d, 0x24, 0x9f, 0x40, 0x4b, 0x22, 0xb3, 0x5e, 0xfd, 0xad, 0x6b, 0x34, 0xc7, 0x15, + 0x07, 0x3a, 0xa5, 0xa9, 0x37, 0x1f, 0xa7, 0x22, 0x0e, 0xc2, 0x78, 0x52, 0x38, 0xa5, 0xa9, 0x37, + 0x3f, 0x56, 0x18, 0xf7, 0x6f, 0x0d, 0xb0, 0xd4, 0xfb, 0xaa, 0xf9, 0x76, 0xa3, 0xee, 0xdb, 0x7f, + 0x04, 0x4e, 0x9a, 0x89, 0x20, 0xf4, 0x8b, 0x5d, 0x1d, 0x5e, 0x22, 0xd0, 0x94, 0xcf, 0x92, 0xcc, + 0x17, 0xb4, 0xbc, 0xcd, 0x15, 0x80, 0x58, 0x99, 0x7a, 0xbe, 0x4a, 0x05, 0x1b, 0x5c, 0x01, 0x18, + 0x11, 0x94, 0x2a, 0x49, 0x85, 0x36, 0xd7, 0x10, 0xe6, 0xb0, 0x14, 0x2d, 0xc9, 0x9f, 0x2b, 0xed, + 0xd9, 0x88, 0x20, 0x47, 0xfe, 0xf7, 0x26, 0x74, 0x77, 0xc3, 0x4c, 0xf8, 0xb9, 0x08, 0x06, 0xc1, + 0x84, 0x56, 0x11, 0x71, 0x1e, 0xe6, 0x57, 0x3a, 0x34, 0x69, 0x68, 0x91, 0x39, 0x98, 0xf5, 0x9c, + 0x59, 0xe9, 0xa2, 0x41, 0x69, 0xbe, 0x02, 0xd8, 0x16, 0x80, 0xca, 0xa9, 0x28, 0xd5, 0x6f, 0xbe, + 0x3e, 0xd5, 0x77, 0x88, 0x0d, 0x87, 0x28, 0x20, 0x35, 0x27, 0x54, 0x61, 0xcb, 0xa2, 0x3a, 0x60, + 0x86, 0x66, 0x4f, 0xa9, 0xc8, 0xa9, 0x88, 0xc8, 0xac, 0x29, 0x15, 0x39, 0x15, 0xd1, 0x22, 0x01, + 0x6c, 0xab, 0xe3, 0xe0, 0x98, 0x7d, 0x00, 0x66, 0x92, 0xd2, 0xe5, 0xf5, 0x86, 0xd5, 0x8b, 0x6d, + 0x1e, 0xa5, 0xdc, 0x4c, 0x52, 0xb4, 0x02, 0x95, 0xd7, 0xf6, 0x1d, 0xfd, 0x14, 0xd0, 0x17, 0x51, + 0xee, 0xc5, 0x35, 0xc5, 0xbd, 0x03, 0xe6, 0x51, 0xca, 0xda, 0xd0, 0x18, 0x0e, 0x46, 0xbd, 0x1b, + 0x38, 0xd8, 0x1d, 0xec, 0xf7, 0x0c, 0xf7, 0x7f, 0x4c, 0x70, 0x0e, 0x66, 0xb9, 0x87, 0x36, 0x25, + 0xdf, 0xa4, 0xd4, 0x77, 0xc1, 0x96, 0xb9, 0x97, 0x91, 0x3f, 0x57, 0x4e, 0xa8, 0x4d, 0xf0, 0x48, + 0xb2, 0x8f, 0xa1, 0x25, 0x82, 0x89, 0x28, 0x7c, 0x43, 0x6f, 0xf9, 0x9c, 0x5c, 0x91, 0xd9, 0x06, + 0x58, 0xd2, 0x3f, 0x17, 0x53, 0xaf, 0xdf, 0x2c, 0x19, 0x87, 0x84, 0x51, 0xf1, 0x9a, 0x6b, 0x3a, + 0xdb, 0x82, 0xb7, 0xc3, 0x49, 0x9c, 0x64, 0x62, 0x1c, 0xc6, 0x81, 0x98, 0x8f, 0xfd, 0x24, 0x3e, + 0x8b, 0x42, 0x3f, 0xd7, 0xf1, 0xff, 0x2d, 0x45, 0xdc, 0x43, 0xda, 0x8e, 0x26, 0xb1, 0x0f, 0xa1, + 0x85, 0xda, 0x91, 0x3a, 0x9b, 0xa4, 0xfc, 0x13, 0x15, 0xa1, 0x97, 0x56, 0x44, 0xf6, 0x08, 0xda, + 0x41, 0x96, 0xa4, 0xe3, 0x24, 0x25, 0x39, 0xaf, 0x6e, 0xdd, 0xa6, 0xf7, 0x50, 0x48, 0x60, 0x73, + 0x37, 0x4b, 0xd2, 0xa3, 0x94, 0x5b, 0x01, 0xfd, 0x62, 0x89, 0x40, 0xec, 0xca, 0x26, 0x94, 0x1f, + 0x71, 0x10, 0x43, 0xa9, 0xb4, 0xfb, 0x18, 0x2c, 0x35, 0x81, 0xd9, 0xd0, 0x3c, 0x3c, 0x3a, 0x1c, + 0x28, 0xd1, 0x6e, 0xef, 0xef, 0xf7, 0x0c, 0x44, 0xed, 0x6e, 0x8f, 0xb6, 0x7b, 0x26, 0x8e, 0x46, + 0xbf, 0x3c, 0x1e, 0xf4, 0x1a, 0xee, 0x5f, 0x19, 0x60, 0x17, 0xde, 0x9e, 0x7d, 0x82, 0x6e, 0x9a, + 0xa2, 0x85, 0x7e, 0xbe, 0x54, 0xe2, 0x54, 0xd2, 0x36, 0x5e, 0xd0, 0xd1, 0x62, 0x48, 0x12, 0x85, + 0xff, 0x27, 0xa0, 0x9a, 0x34, 0x36, 0x6a, 0x15, 0x0a, 0xe6, 0xbf, 0x49, 0x2c, 0x74, 0x1e, 0x45, + 0x63, 0x52, 0x60, 0x18, 0xfb, 0x02, 0xb9, 0x5b, 0x5a, 0x81, 0x08, 0x8f, 0xa4, 0xfb, 0xd7, 0x26, + 0xd8, 0x8b, 0xd8, 0xfd, 0x10, 0x9c, 0x69, 0x21, 0x0e, 0xed, 0x33, 0x56, 0x6a, 0x32, 0xe2, 0x25, + 0x9d, 0xdd, 0x01, 0xf3, 0xe2, 0x52, 0xab, 0xd3, 0x42, 0xae, 0x17, 0x2f, 0xb9, 0x79, 0x71, 0x59, + 0x3a, 0x9d, 0xd6, 0x77, 0x3a, 0x9d, 0xfb, 0x70, 0xd3, 0x8f, 0x84, 0x17, 0x8f, 0x4b, 0x9f, 0xa1, + 0x9e, 0xc5, 0x2a, 0xa1, 0x8f, 0x17, 0x8e, 0x43, 0x3b, 0xce, 0x76, 0x19, 0x4c, 0x3f, 0x82, 0x56, + 0x20, 0xa2, 0xdc, 0xab, 0x56, 0x88, 0x47, 0x99, 0xe7, 0x47, 0x62, 0x17, 0xd1, 0x5c, 0x51, 0xd9, + 0x06, 0xd8, 0x45, 0x62, 0xa1, 0xeb, 0x42, 0x2a, 0x35, 0x0a, 0x3d, 0xf0, 0x05, 0xb5, 0x14, 0x33, + 0x54, 0xc4, 0xec, 0x7e, 0x06, 0x8d, 0x17, 0x2f, 0x87, 0xfa, 0xae, 0xc6, 0x2b, 0x77, 0x2d, 0x84, + 0x6d, 0x96, 0xc2, 0x76, 0xff, 0xb7, 0x01, 0x6d, 0xed, 0x1b, 0xf0, 0xdc, 0xb3, 0x45, 0x5a, 0x8c, + 0xc3, 0x7a, 0x34, 0x5f, 0x38, 0x99, 0x6a, 0x37, 0xa1, 0xf1, 0xdd, 0xdd, 0x04, 0xf6, 0x33, 0xe8, + 0xa6, 0x8a, 0x56, 0x75, 0x4b, 0xef, 0x54, 0xe7, 0xe8, 0x5f, 0x9a, 0xd7, 0x49, 0x4b, 0x00, 0x8d, + 0x81, 0x0a, 0xb0, 0xdc, 0x9b, 0x90, 0x8a, 0xba, 0xbc, 0x8d, 0xf0, 0xc8, 0x9b, 0xbc, 0xc6, 0x39, + 0xfd, 0x06, 0x3e, 0x06, 0xd3, 0xff, 0x24, 0xed, 0x77, 0xc9, 0x6f, 0xa0, 0x5f, 0xaa, 0xba, 0x8c, + 0x95, 0xba, 0xcb, 0x78, 0x0f, 0x1c, 0x3f, 0x99, 0x4e, 0x43, 0xa2, 0xad, 0xea, 0xf4, 0x96, 0x10, + 0x23, 0xe9, 0xfe, 0x99, 0x01, 0x6d, 0x7d, 0x5b, 0xd6, 0x81, 0xf6, 0xee, 0xe0, 0xd9, 0xf6, 0xc9, + 0x3e, 0x7a, 0x2d, 0x00, 0xeb, 0xe9, 0xde, 0xe1, 0x36, 0xff, 0x65, 0xcf, 0xc0, 0x67, 0xb6, 0x77, + 0x38, 0xea, 0x99, 0xcc, 0x81, 0xd6, 0xb3, 0xfd, 0xa3, 0xed, 0x51, 0xaf, 0x81, 0xef, 0xec, 0xe9, + 0xd1, 0xd1, 0x7e, 0xaf, 0xc9, 0xba, 0x60, 0xef, 0x6e, 0x8f, 0x06, 0xa3, 0xbd, 0x83, 0x41, 0xaf, + 0x85, 0xbc, 0xcf, 0x07, 0x47, 0x3d, 0x0b, 0x07, 0x27, 0x7b, 0xbb, 0xbd, 0x36, 0xd2, 0x8f, 0xb7, + 0x87, 0xc3, 0xaf, 0x8e, 0xf8, 0x6e, 0xcf, 0xc6, 0x75, 0x87, 0x23, 0xbe, 0x77, 0xf8, 0xbc, 0xe7, + 0xe0, 0xf8, 0xe8, 0xe9, 0x97, 0x83, 0x9d, 0x51, 0x0f, 0xdc, 0xcf, 0xa0, 0x53, 0x91, 0x20, 0xce, + 0xe6, 0x83, 0x67, 0xbd, 0x1b, 0xb8, 0xe5, 0xcb, 0xed, 0xfd, 0x93, 0x41, 0xcf, 0x60, 0xab, 0x00, + 0x34, 0x1c, 0xef, 0x6f, 0x1f, 0x3e, 0xef, 0x99, 0xee, 0x2f, 0xc0, 0x3e, 0x09, 0x83, 0xa7, 0x51, + 0xe2, 0x5f, 0xa0, 0x61, 0x9c, 0x7a, 0x52, 0xe8, 0x50, 0x4f, 0x63, 0x8c, 0x45, 0x64, 0x94, 0x52, + 0xeb, 0x5e, 0x43, 0x28, 0xab, 0x78, 0x36, 0x1d, 0x53, 0x07, 0xaa, 0xa1, 0x3c, 0x6f, 0x3c, 0x9b, + 0x9e, 0x84, 0x81, 0x74, 0x0f, 0xa1, 0x7d, 0x12, 0x06, 0xc7, 0x9e, 0x7f, 0x81, 0xee, 0xe8, 0x14, + 0x97, 0x1e, 0xcb, 0xf0, 0x1b, 0xa1, 0x3d, 0xb4, 0x43, 0x98, 0x61, 0xf8, 0x8d, 0x60, 0x1f, 0x82, + 0x45, 0x40, 0x91, 0xdd, 0x91, 0x99, 0x17, 0xc7, 0xe1, 0x9a, 0xe6, 0xfe, 0x85, 0xb1, 0xb8, 0x16, + 0x35, 0x1e, 0xee, 0x41, 0x33, 0xf5, 0xfc, 0x0b, 0xed, 0x83, 0x3a, 0x7a, 0x0e, 0xee, 0xc7, 0x89, + 0xc0, 0xee, 0x83, 0xad, 0x6d, 0xa7, 0x58, 0xb8, 0x53, 0x31, 0x32, 0xbe, 0x20, 0xd6, 0xb5, 0xda, + 0xa8, 0x6b, 0x15, 0x6f, 0x2e, 0xd3, 0x28, 0xa4, 0x1a, 0xb2, 0x81, 0xbe, 0x4a, 0x41, 0xee, 0x4f, + 0x00, 0xca, 0xae, 0xce, 0x35, 0x25, 0xc8, 0x6d, 0x68, 0x79, 0x51, 0xa8, 0x05, 0xe6, 0x70, 0x05, + 0xb8, 0x87, 0xd0, 0xa9, 0xf4, 0x82, 0x50, 0x7c, 0x5e, 0x14, 0x8d, 0x2f, 0xc4, 0x95, 0xa4, 0xb9, + 0x36, 0x6f, 0x7b, 0x51, 0xf4, 0x42, 0x5c, 0x49, 0x8c, 0x0b, 0xaa, 0x8d, 0x64, 0x2e, 0xf5, 0x25, + 0x68, 0x2a, 0x57, 0x44, 0xf7, 0x53, 0xb0, 0x54, 0xb3, 0xa2, 0x62, 0xe9, 0xc6, 0x6b, 0xa3, 0xe9, + 0x17, 0xfa, 0xcc, 0xd4, 0xda, 0x60, 0x0f, 0x75, 0xbb, 0x4a, 0xaa, 0xe6, 0x98, 0x51, 0xe6, 0xa3, + 0x8a, 0x49, 0x77, 0xaa, 0x88, 0xd9, 0xdd, 0x05, 0xfb, 0x8d, 0x0d, 0x40, 0x2d, 0x00, 0xb3, 0x14, + 0xc0, 0x35, 0x2d, 0x41, 0xf7, 0x57, 0x00, 0x65, 0x5b, 0x4b, 0x3f, 0x3c, 0xb5, 0x0a, 0x3e, 0xbc, + 0x07, 0x58, 0x3b, 0x86, 0x51, 0x90, 0x89, 0xb8, 0x76, 0xeb, 0xb2, 0x11, 0xb6, 0xa0, 0xb3, 0x75, + 0x68, 0x52, 0xb7, 0xae, 0x51, 0x3a, 0xc6, 0x45, 0xab, 0x8e, 0x28, 0xee, 0x1c, 0x56, 0x54, 0x90, + 0xe6, 0xe2, 0x8f, 0x66, 0x42, 0xbe, 0x31, 0xf5, 0xbb, 0x0b, 0xb0, 0x70, 0xe3, 0x45, 0xdf, 0xb1, + 0x82, 0x41, 0x23, 0x38, 0x0b, 0x45, 0x14, 0x14, 0xb7, 0xd1, 0x10, 0x2a, 0x59, 0x05, 0xef, 0xa6, + 0x6a, 0xce, 0x10, 0xe0, 0xfe, 0x1e, 0x74, 0x8b, 0x9d, 0xa9, 0xfb, 0xf1, 0x70, 0x91, 0x40, 0x28, + 0x19, 0xab, 0xa2, 0x4b, 0xb1, 0x1c, 0x26, 0x81, 0x78, 0x6a, 0xf6, 0x8d, 0x22, 0x87, 0x70, 0xff, + 0xbd, 0x51, 0xcc, 0xd6, 0xcd, 0x80, 0x5a, 0x5a, 0x6a, 0x2c, 0xa7, 0xa5, 0xf5, 0x14, 0xcf, 0xfc, + 0x8d, 0x52, 0xbc, 0x9f, 0x82, 0x13, 0x50, 0x9e, 0x13, 0x5e, 0x16, 0x2e, 0x7b, 0x6d, 0x39, 0xa7, + 0xd1, 0x99, 0x50, 0x78, 0x29, 0x78, 0xc9, 0x8c, 0x67, 0xc9, 0x93, 0x0b, 0x11, 0x87, 0xdf, 0x50, + 0xb7, 0x03, 0xef, 0x5c, 0x22, 0xca, 0xd6, 0x91, 0x4a, 0x77, 0x74, 0xeb, 0xa8, 0xe8, 0x82, 0x59, + 0x65, 0x17, 0x0c, 0xe5, 0x39, 0x4b, 0xa5, 0xc8, 0xf2, 0x22, 0x41, 0x56, 0xd0, 0x22, 0x97, 0x74, + 0x34, 0x2f, 0xe6, 0x92, 0xef, 0x43, 0x37, 0x4e, 0xe2, 0x71, 0x3c, 0x8b, 0x22, 0x4c, 0xe1, 0x75, + 0xc3, 0xb3, 0x13, 0x27, 0xf1, 0xa1, 0x46, 0xb1, 0x07, 0x70, 0xab, 0xca, 0xa2, 0xec, 0xb9, 0xa3, + 0xfa, 0x25, 0x15, 0x3e, 0xb2, 0xfa, 0x0d, 0xe8, 0x25, 0xa7, 0xbf, 0x12, 0x7e, 0x4e, 0x12, 0x1b, + 0x93, 0x21, 0x77, 0x55, 0xe0, 0x56, 0x78, 0x14, 0xd1, 0xa1, 0x37, 0x15, 0xee, 0x17, 0xe0, 0x2c, + 0x84, 0x50, 0x49, 0x94, 0x1c, 0x68, 0xed, 0x1d, 0xee, 0x0e, 0xfe, 0xa0, 0x67, 0xa0, 0x97, 0xe7, + 0x83, 0x97, 0x03, 0x3e, 0x1c, 0xf4, 0x4c, 0xf4, 0xc0, 0xbb, 0x83, 0xfd, 0xc1, 0x68, 0xd0, 0x6b, + 0x7c, 0xd9, 0xb4, 0xdb, 0x3d, 0x9b, 0xdb, 0x62, 0x9e, 0x46, 0xa1, 0x1f, 0xe6, 0xee, 0x10, 0xa0, + 0xcc, 0xe9, 0xd0, 0xdf, 0x94, 0x7b, 0x2b, 0x8d, 0xda, 0xb9, 0xde, 0x15, 0xb3, 0x4d, 0x6d, 0x6a, + 0xe6, 0xeb, 0xb2, 0x4d, 0x45, 0x77, 0x4f, 0xc0, 0x3e, 0xf0, 0xd2, 0x57, 0xaa, 0xb3, 0xee, 0xa2, + 0x62, 0x9f, 0xe9, 0xfe, 0x95, 0x0e, 0xdf, 0x1f, 0x41, 0x5b, 0xbb, 0x3c, 0xfd, 0x6a, 0x6a, 0xee, + 0xb0, 0xa0, 0xb9, 0x7f, 0x6a, 0xc0, 0xed, 0x83, 0xe4, 0x52, 0x2c, 0x32, 0x98, 0x63, 0xef, 0x2a, + 0x4a, 0xbc, 0xe0, 0x3b, 0x0c, 0xf1, 0xc7, 0x00, 0x32, 0x99, 0x65, 0xbe, 0x18, 0x4f, 0x16, 0x6d, + 0x33, 0x47, 0x61, 0x9e, 0xeb, 0x0e, 0xbd, 0x90, 0x39, 0x11, 0x75, 0xa0, 0x40, 0x18, 0x49, 0x6f, + 0x83, 0x95, 0xcf, 0xe3, 0xb2, 0x4b, 0xd7, 0xca, 0xb1, 0x90, 0x76, 0x77, 0xc0, 0x19, 0xcd, 0xa9, + 0x60, 0x9c, 0xc9, 0x5a, 0x4c, 0x36, 0xde, 0x10, 0x93, 0xcd, 0xa5, 0x98, 0xfc, 0x5f, 0x06, 0x74, + 0x2a, 0xa9, 0x15, 0x7b, 0x1f, 0x9a, 0xf9, 0x3c, 0xae, 0xb7, 0xb7, 0x8b, 0x4d, 0x38, 0x91, 0xd0, + 0xde, 0xb0, 0x9a, 0xf4, 0xa4, 0x0c, 0x27, 0xb1, 0x08, 0xf4, 0x92, 0x58, 0x61, 0x6e, 0x6b, 0x14, + 0xdb, 0x87, 0x9b, 0xca, 0x93, 0x14, 0xad, 0xad, 0xa2, 0x86, 0xf8, 0x60, 0x29, 0x95, 0x53, 0x45, + 0xf5, 0x4e, 0xc1, 0xa5, 0x9a, 0x0c, 0xab, 0x93, 0x1a, 0x72, 0x6d, 0x1b, 0xde, 0xba, 0x86, 0xed, + 0x7b, 0x75, 0x53, 0xee, 0xc1, 0xca, 0x68, 0x1e, 0x8f, 0xc2, 0xa9, 0x90, 0xb9, 0x37, 0x4d, 0x29, + 0xa7, 0xd1, 0x91, 0xa0, 0xc9, 0xcd, 0x5c, 0xba, 0x1f, 0x43, 0xf7, 0x58, 0x88, 0x8c, 0x0b, 0x99, + 0x26, 0xb1, 0x8a, 0xe7, 0x92, 0x2e, 0xad, 0xc3, 0x8e, 0x86, 0xdc, 0x3f, 0x04, 0x07, 0x13, 0xf9, + 0xa7, 0x5e, 0xee, 0x9f, 0x7f, 0x9f, 0x44, 0xff, 0x63, 0x68, 0xa7, 0xca, 0x4c, 0x74, 0xee, 0xdd, + 0x25, 0x1f, 0xa7, 0x4d, 0x87, 0x17, 0x44, 0x97, 0x43, 0xe3, 0x70, 0x36, 0xad, 0x7e, 0x93, 0x6a, + 0xaa, 0x6f, 0x52, 0xb5, 0xd2, 0xd8, 0xac, 0x97, 0xc6, 0x68, 0x79, 0x67, 0x49, 0xf6, 0xc7, 0x5e, + 0x16, 0x88, 0x40, 0xd7, 0xdf, 0x25, 0xc2, 0xfd, 0x1a, 0x3a, 0x85, 0x66, 0xf6, 0x02, 0xfa, 0xec, + 0x44, 0xa6, 0xb1, 0x17, 0xd4, 0x2c, 0x45, 0xd5, 0xaf, 0x22, 0x0e, 0xf6, 0x0a, 0x95, 0x2a, 0xa0, + 0xbe, 0xb3, 0xee, 0xe6, 0x2c, 0x8a, 0xf2, 0x67, 0xd0, 0x2d, 0xf2, 0xed, 0x03, 0x91, 0x7b, 0x64, + 0x6c, 0x51, 0x28, 0xe2, 0x8a, 0x21, 0xda, 0x0a, 0x31, 0x92, 0x6f, 0xe8, 0x1b, 0xbb, 0x9b, 0x60, + 0x69, 0x4b, 0x66, 0xd0, 0xf4, 0x93, 0x40, 0x3d, 0xa0, 0x16, 0xa7, 0x31, 0x8a, 0x63, 0x2a, 0x27, + 0x45, 0xf0, 0x9c, 0xca, 0x89, 0xfb, 0x4f, 0x26, 0xac, 0x3c, 0xf5, 0xfc, 0x8b, 0x59, 0x5a, 0x44, + 0xaf, 0x4a, 0xd1, 0x64, 0xd4, 0x8a, 0xa6, 0x6a, 0x81, 0x64, 0xd6, 0x0a, 0xa4, 0xda, 0x81, 0x1a, + 0xf5, 0x88, 0xf7, 0x0e, 0xb4, 0x67, 0x71, 0x38, 0x2f, 0x5e, 0x9d, 0xc3, 0x2d, 0x04, 0x47, 0x92, + 0xad, 0x43, 0x07, 0x1f, 0x66, 0x18, 0x53, 0xa9, 0x44, 0x02, 0x71, 0x78, 0x15, 0x85, 0x2f, 0xdd, + 0xf3, 0x7d, 0x21, 0x25, 0xe6, 0x2d, 0x3a, 0xdd, 0x76, 0x14, 0xe6, 0x85, 0xb8, 0x22, 0x47, 0x20, + 0xfc, 0x4c, 0xe4, 0xe3, 0xb2, 0xec, 0x71, 0x14, 0x06, 0xc9, 0x1f, 0xc0, 0x8a, 0x14, 0x52, 0x86, + 0x49, 0x3c, 0xa6, 0xc8, 0xa1, 0xab, 0xd3, 0xae, 0x46, 0x8e, 0x10, 0x87, 0x0a, 0xf7, 0xe2, 0x24, + 0xbe, 0x9a, 0x26, 0x33, 0xa9, 0x83, 0x41, 0x89, 0x58, 0x8a, 0xd6, 0xb0, 0x1c, 0xad, 0xdd, 0x1c, + 0x56, 0x06, 0xf3, 0x94, 0xbe, 0x3e, 0x7c, 0x67, 0xe4, 0xaf, 0x88, 0xd5, 0xac, 0x89, 0xb5, 0x22, + 0xa0, 0x06, 0xf5, 0x76, 0x0a, 0x01, 0x61, 0x2e, 0x90, 0x64, 0x53, 0x2f, 0x2f, 0x04, 0xa7, 0x20, + 0xf7, 0x2f, 0x4d, 0x70, 0x94, 0xca, 0xf0, 0x9a, 0x9f, 0x40, 0x93, 0x22, 0xb2, 0x41, 0xe1, 0xf5, + 0x6d, 0x7c, 0x38, 0x0b, 0xe2, 0xe6, 0x0b, 0x71, 0x45, 0x31, 0x99, 0x58, 0xae, 0xed, 0xe7, 0x68, + 0xef, 0xad, 0x92, 0x51, 0xf2, 0xde, 0xef, 0x81, 0xa3, 0x3c, 0x20, 0xe2, 0x75, 0x67, 0x9d, 0x10, + 0x27, 0x21, 0x7d, 0x96, 0xc8, 0x45, 0x36, 0xd5, 0xda, 0xa2, 0x71, 0x19, 0x8d, 0x2d, 0xf5, 0xad, + 0x84, 0x00, 0xf7, 0x1c, 0xda, 0x7a, 0x77, 0x8c, 0x5e, 0x27, 0x87, 0x2f, 0x0e, 0x8f, 0xbe, 0x3a, + 0xec, 0xdd, 0x58, 0x54, 0xfd, 0x46, 0x19, 0xdf, 0xcc, 0x6a, 0x7c, 0x6b, 0x20, 0x7e, 0xe7, 0xe8, + 0xe4, 0x70, 0xd4, 0x6b, 0xb2, 0x15, 0x70, 0x68, 0x38, 0xe6, 0x83, 0x97, 0xbd, 0x16, 0xd5, 0x21, + 0x3b, 0x3f, 0x1f, 0x1c, 0x6c, 0xf7, 0xac, 0x45, 0xcf, 0xa0, 0x8d, 0x71, 0xe4, 0x96, 0xba, 0x72, + 0x35, 0x6b, 0xaf, 0x7e, 0xae, 0x6e, 0xaa, 0xcf, 0xd5, 0x3f, 0x6c, 0xa2, 0xbe, 0xf5, 0xcf, 0x06, + 0x34, 0xd1, 0x67, 0xb1, 0x87, 0xe0, 0xfc, 0x5c, 0x78, 0x59, 0x7e, 0x2a, 0xbc, 0x9c, 0xd5, 0xfc, + 0xd3, 0x5a, 0x0d, 0x72, 0x6f, 0x3c, 0x31, 0xd8, 0xa6, 0xfa, 0x10, 0x55, 0x7c, 0x5f, 0x5b, 0x29, + 0x3c, 0x1f, 0x79, 0xc6, 0x65, 0xfe, 0x0d, 0xe2, 0xff, 0x32, 0x09, 0xe3, 0x1d, 0xf5, 0x75, 0x86, + 0x2d, 0x7b, 0xca, 0xe5, 0x19, 0xec, 0x11, 0x58, 0x7b, 0x12, 0x5d, 0xf2, 0xab, 0xac, 0x14, 0xf1, + 0xab, 0xde, 0xda, 0xbd, 0xb1, 0xf5, 0x0f, 0x0d, 0x68, 0x7e, 0x2d, 0xb2, 0x84, 0x7d, 0x0a, 0x6d, + 0xdd, 0x4d, 0x65, 0x95, 0xae, 0xe9, 0x1a, 0xa5, 0x7c, 0x4b, 0x6d, 0x56, 0xda, 0xa5, 0xa7, 0x92, + 0x86, 0xb2, 0x89, 0xc1, 0xca, 0x66, 0xef, 0x2b, 0x87, 0xfa, 0x02, 0x7a, 0xc3, 0x3c, 0x13, 0xde, + 0xb4, 0xc2, 0x5e, 0x17, 0xd4, 0x75, 0x1d, 0x11, 0x92, 0xd7, 0x43, 0xb0, 0x54, 0xdc, 0x5b, 0x9a, + 0xb0, 0xdc, 0xdc, 0x20, 0xe6, 0xfb, 0xd0, 0x19, 0x9e, 0x27, 0xb3, 0x28, 0x18, 0x8a, 0xec, 0x52, + 0xb0, 0xca, 0xf7, 0x8f, 0xb5, 0xca, 0xd8, 0xbd, 0xc1, 0x36, 0x00, 0x94, 0x6b, 0xc7, 0x8a, 0x92, + 0xb5, 0x91, 0x76, 0x38, 0x9b, 0xaa, 0x45, 0x2b, 0x3e, 0x5f, 0x71, 0x56, 0xc2, 0xdf, 0x9b, 0x38, + 0x3f, 0x87, 0x95, 0x1d, 0xb2, 0x99, 0xa3, 0x6c, 0xfb, 0x34, 0xc9, 0x72, 0xb6, 0xfc, 0x0d, 0x64, + 0x6d, 0x19, 0xe1, 0xde, 0x60, 0x4f, 0xc0, 0x1e, 0x65, 0x57, 0x8a, 0xff, 0x96, 0xce, 0x1a, 0xca, + 0xfd, 0xae, 0xb9, 0xe5, 0xd6, 0xdf, 0x35, 0xc0, 0xfa, 0x2a, 0xc9, 0x2e, 0x44, 0xc6, 0x1e, 0x80, + 0x45, 0x5d, 0x28, 0x6d, 0x46, 0x8b, 0x8e, 0xd4, 0x75, 0x1b, 0x7d, 0x08, 0x0e, 0x09, 0x65, 0xe4, + 0xc9, 0x0b, 0xa5, 0x2a, 0xfa, 0xa3, 0x84, 0x92, 0x8b, 0xaa, 0x27, 0x48, 0xaf, 0xab, 0x4a, 0x51, + 0x8b, 0xa6, 0x5c, 0xad, 0x35, 0xb4, 0xd6, 0x56, 0x7d, 0x9e, 0x21, 0x9a, 0xe6, 0x13, 0x03, 0x9d, + 0xd1, 0x50, 0xdd, 0x14, 0x99, 0xca, 0xcf, 0xc6, 0x6b, 0xab, 0x05, 0x62, 0xb1, 0xf2, 0x63, 0xb0, + 0x54, 0xb2, 0xa9, 0xae, 0x59, 0xab, 0xa0, 0xd6, 0x7a, 0x55, 0x94, 0x9e, 0xf0, 0x09, 0x58, 0xea, + 0x95, 0xab, 0x09, 0xb5, 0xa0, 0xa5, 0x4e, 0xad, 0x02, 0x9f, 0x62, 0x55, 0x7e, 0x59, 0xb1, 0xd6, + 0x7c, 0xf4, 0x12, 0xeb, 0x23, 0xe8, 0x71, 0xe1, 0x8b, 0xb0, 0x92, 0x86, 0xb2, 0xe2, 0x52, 0xd7, + 0xbc, 0xbe, 0x2f, 0x60, 0xa5, 0x96, 0xb2, 0xb2, 0x3e, 0x09, 0xfa, 0x9a, 0x2c, 0x76, 0x79, 0xf2, + 0xd3, 0xde, 0xbf, 0x7e, 0x7b, 0xd7, 0xf8, 0xb7, 0x6f, 0xef, 0x1a, 0xff, 0xf1, 0xed, 0x5d, 0xe3, + 0xd7, 0xff, 0x79, 0xf7, 0xc6, 0xa9, 0x45, 0x7f, 0xb0, 0xf9, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xff, + 0xff, 0x99, 0x71, 0x4e, 0xa0, 0xa4, 0x23, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6305,6 +6314,16 @@ func (m *MembershipState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.EnterpriseEnabled { + i-- + if m.EnterpriseEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x48 + } if len(m.Cid) > 0 { i -= len(m.Cid) copy(dAtA[i:], m.Cid) @@ -9036,6 +9055,9 @@ func (m *MembershipState) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } + if m.EnterpriseEnabled { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -13086,6 +13108,26 @@ func (m *MembershipState) Unmarshal(dAtA []byte) error { } m.Cid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnterpriseEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EnterpriseEnabled = bool(v != 0) default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) diff --git a/worker/groups.go b/worker/groups.go index e41f1102ad1..2137b875b42 100644 --- a/worker/groups.go +++ b/worker/groups.go @@ -262,6 +262,7 @@ func UpdateMembershipState(ctx context.Context) error { if err != nil { return err } + // TODO - When is this called, check. g.applyState(state.GetState()) return nil } @@ -953,3 +954,14 @@ func (g *groupi) processOracleDeltaStream() { } } } + +// EnterpriseEnabled returns whether enterprise features can be used or not. +func EnterpriseEnabled() bool { + g := groups() + g.RLock() + defer g.RUnlock() + if g.state == nil { + return false + } + return g.state.EnterpriseEnabled +} From ce2b9316f92b4ba80092672603c5f9b6a747f1f1 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 14 Aug 2019 18:13:48 +1000 Subject: [PATCH 03/35] Dummy commit --- dgraph/cmd/zero/raft.go | 4 +++- dgraph/cmd/zero/zero.go | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index cfa009eea44..924132c25a2 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -326,6 +326,7 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { if p.MaxRaftId <= state.MaxRaftId { return p.Key, errInvalidProposal } + glog.Infof("maxRaftId: %+v\n", state.MaxRaftId) state.MaxRaftId = p.MaxRaftId } if p.SnapshotTs != nil { @@ -517,7 +518,8 @@ func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { return } - ticker := time.NewTicker(1 * time.Minute) + fmt.Println("not here are we?") + ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() n.server.updateEnterpriseState() diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 3022c3c0c80..d452c2c9f43 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -18,6 +18,7 @@ package zero import ( "encoding/json" + "fmt" "io/ioutil" "math" "sync" @@ -94,6 +95,11 @@ func (s *Server) Init() { s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { + fmt.Println("fpath: ", fpath) + // TODO - Change this + // 1. To read a file, break it into data and signed parts. + // 2. Verify signature using public key. + // 3. Load values from the data file after verifying and use those. b, err := ioutil.ReadFile(fpath) x.CheckfNoTrace(err) err = json.Unmarshal(b, &s.enterprise) @@ -294,6 +300,7 @@ func (s *Server) enterpriseEnabled() bool { func (s *Server) updateEnterpriseState() { s.Lock() defer s.Unlock() + fmt.Println("max raft id: ", s.state.MaxRaftId) // TODO - Check timezones won't mess up things here. // Also check how to get total number of nodes and have logic for that. if time.Now().Before(s.enterprise.Expiry) { From 69871db2a0fa94067a9bed31ee9687982dc88f46 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 14 Aug 2019 18:36:42 +1000 Subject: [PATCH 04/35] Remove useless print statements. --- dgraph/cmd/zero/raft.go | 2 -- dgraph/cmd/zero/zero.go | 3 --- 2 files changed, 5 deletions(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 924132c25a2..b410c65dd83 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -326,7 +326,6 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { if p.MaxRaftId <= state.MaxRaftId { return p.Key, errInvalidProposal } - glog.Infof("maxRaftId: %+v\n", state.MaxRaftId) state.MaxRaftId = p.MaxRaftId } if p.SnapshotTs != nil { @@ -518,7 +517,6 @@ func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { return } - fmt.Println("not here are we?") ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index d452c2c9f43..264aa96dc94 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -18,7 +18,6 @@ package zero import ( "encoding/json" - "fmt" "io/ioutil" "math" "sync" @@ -95,7 +94,6 @@ func (s *Server) Init() { s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { - fmt.Println("fpath: ", fpath) // TODO - Change this // 1. To read a file, break it into data and signed parts. // 2. Verify signature using public key. @@ -300,7 +298,6 @@ func (s *Server) enterpriseEnabled() bool { func (s *Server) updateEnterpriseState() { s.Lock() defer s.Unlock() - fmt.Println("max raft id: ", s.state.MaxRaftId) // TODO - Check timezones won't mess up things here. // Also check how to get total number of nodes and have logic for that. if time.Now().Before(s.enterprise.Expiry) { From 5dd9a0281cc1d33a7fde98f330edae6d8c23c349 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 14 Aug 2019 20:55:09 +1000 Subject: [PATCH 05/35] Check for max allowed nodes while calling Connect in Zero --- dgraph/cmd/zero/zero.go | 15 +++++++++++++-- x/x.go | 3 ++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 264aa96dc94..170bf92cd38 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -440,7 +440,7 @@ func (s *Server) removeNode(ctx context.Context, nodeId uint64, groupId uint32) return s.Node.proposeAndWait(ctx, zp) } -// Connect is used to connect the very first time with group zero. +// Connect is used by Alpha nodes to connect the very first time with group zero. func (s *Server) Connect(ctx context.Context, m *pb.Member) (resp *pb.ConnectionState, err error) { // Ensures that connect requests are always serialized @@ -478,10 +478,13 @@ func (s *Server) Connect(ctx context.Context, } } + numberOfNodes := len(ms.Zeros) for _, group := range ms.Groups { for _, member := range group.Members { switch { - case member.Addr == m.Addr && m.Id == 0: + // TODO - Verify if we need the m.Id == 0 condition here and why. + // If we have this member, then we should just connect to it and return. + case member.Addr == m.Addr: glog.Infof("Found a member with the same address. Returning: %+v", member) conn.GetPools().Connect(m.Addr) return &pb.ConnectionState{ @@ -503,9 +506,17 @@ func (s *Server) Connect(ctx context.Context, " with same ID: %+v", member) } } + numberOfNodes++ } } + // TODO - Zero MaxNodes should probably be an error. + if s.enterprise.enabled && s.enterprise.MaxNodes != 0 && + uint64(numberOfNodes) >= s.enterprise.MaxNodes { + return nil, errors.Errorf("ENTERPRISE_LIMIT_REACHED: You are already using the maximum "+ + "number of nodes: [%v] permitted for your enterprise license.", s.enterprise.MaxNodes) + } + // Create a connection and check validity of the address by doing an Echo. conn.GetPools().Connect(m.Addr) diff --git a/x/x.go b/x/x.go index 8fa4e6c1e60..4a29359be68 100644 --- a/x/x.go +++ b/x/x.go @@ -121,7 +121,8 @@ func ShouldCrash(err error) bool { errStr := grpc.ErrorDesc(err) return strings.Contains(errStr, "REUSE_RAFTID") || strings.Contains(errStr, "REUSE_ADDR") || - strings.Contains(errStr, "NO_ADDR") + strings.Contains(errStr, "NO_ADDR") || + strings.Contains(errStr, "ENTERPRISE_LIMIT_REACHED") } // WhiteSpace Replacer removes spaces and tabs from a string. From c7bff37cfabf89af1466581c3cf23be55b73f05b Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 14 Aug 2019 21:16:15 +1000 Subject: [PATCH 06/35] Remove some TODOs which we don't need to worry about. --- dgraph/cmd/zero/raft.go | 2 +- dgraph/cmd/zero/zero.go | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index b410c65dd83..c982044bb70 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -517,7 +517,7 @@ func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { return } - ticker := time.NewTicker(10 * time.Second) + ticker := time.NewTicker(time.Minute) defer ticker.Stop() n.server.updateEnterpriseState() diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 170bf92cd38..e28f3e7d73f 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -41,10 +41,9 @@ var ( errServerShutDown = errors.New("Server is being shut down") ) -// TODO - This might belong somewhere else instead for e.g. the state. -// TODO - Add other fields as well. type enterprise struct { enabled bool + Entity string `json:"entity"` MaxNodes uint64 `json:"max_nodes"` Expiry time.Time `json:"expiry"` } @@ -298,8 +297,6 @@ func (s *Server) enterpriseEnabled() bool { func (s *Server) updateEnterpriseState() { s.Lock() defer s.Unlock() - // TODO - Check timezones won't mess up things here. - // Also check how to get total number of nodes and have logic for that. if time.Now().Before(s.enterprise.Expiry) { s.state.EnterpriseEnabled = true } else { From c880a3b92624337a6c6c34dcb6a06e5c3c2c4c03 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 12:00:06 +1000 Subject: [PATCH 07/35] Verify signature from the file with PGP message containing data and signature. --- dgraph/cmd/zero/pgp.go | 69 +++++++++++++++++++++++++++++++++++++++++ dgraph/cmd/zero/run.go | 3 ++ dgraph/cmd/zero/zero.go | 13 ++------ 3 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 dgraph/cmd/zero/pgp.go diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go new file mode 100644 index 00000000000..0ad7e63a206 --- /dev/null +++ b/dgraph/cmd/zero/pgp.go @@ -0,0 +1,69 @@ +/* + * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package zero + +import ( + "encoding/json" + "io/ioutil" + "os" + + "github.com/pkg/errors" + "golang.org/x/crypto/openpgp" + "golang.org/x/crypto/openpgp/armor" +) + +func enterpriseDetails(signedFile string, e *enterprise) error { + publicKeyFile, err := os.Open(Zero.Conf.GetString("public_key")) + if err != nil { + return errors.Wrapf(err, "while opening public key file") + } + defer publicKeyFile.Close() + + entityList, err := openpgp.ReadArmoredKeyRing(publicKeyFile) + if err != nil { + return errors.Wrapf(err, "while reading public key") + } + + sf, err := os.Open(signedFile) + if err != nil { + return errors.Wrapf(err, "while opening signed license file: %v", signedFile) + } + + // The signed file is expected to be have ASCII encoding, so we have to decode it before + // reading. + b, err := armor.Decode(sf) + if err != nil { + return errors.Wrapf(err, "while decoding license file") + } + + md, err := openpgp.ReadMessage(b.Body, entityList, nil, nil) + if err != nil { + return errors.Wrapf(err, "while reading PGP message from license file") + } + + // We need to read the body for the signature verification check to happen. + buf, err := ioutil.ReadAll(md.UnverifiedBody) + if err != nil { + return errors.Wrapf(err, "while reading body from signed license file") + } + if md.Signature == nil { + return errors.New("invalid signature while trying to verify license file") + } + + err = json.Unmarshal(buf, e) + return errors.Wrapf(err, "while JSON unmarshaling body of license file") +} diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index 54228b39ca6..95251821f37 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -95,7 +95,10 @@ instances to achieve high-availability. // about the status of supporting annotation logs through the datadog exporter flag.String("datadog.collector", "", "Send opencensus traces to Datadog. As of now, the trace"+ " exporter does not support annotation logs and would discard them.") + // TODO - Remove this flag and instead have an HTTP endpoint which accepts the signed license. flag.String("enterprise_license", "", "Path to the enterprise license file") + // TODO - Only for testing, remove before shipping. + flag.String("public_key", "", "Path to public key.") } func setupListener(addr string, port int, kind string) (listener net.Listener, err error) { diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index e28f3e7d73f..f4abb63508f 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -17,8 +17,6 @@ package zero import ( - "encoding/json" - "io/ioutil" "math" "sync" "time" @@ -93,14 +91,9 @@ func (s *Server) Init() { s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { - // TODO - Change this - // 1. To read a file, break it into data and signed parts. - // 2. Verify signature using public key. - // 3. Load values from the data file after verifying and use those. - b, err := ioutil.ReadFile(fpath) - x.CheckfNoTrace(err) - err = json.Unmarshal(b, &s.enterprise) - x.Checkf(err, "while unmarshalling license file") + if err := enterpriseDetails(fpath, &s.enterprise); err != nil { + x.CheckfNoTrace(err) + } s.enterprise.enabled = true } go s.rebalanceTablets() From 9f0fe3ea04ff6bd8ea4f5f065a1bf898767fe488 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 12:02:27 +1000 Subject: [PATCH 08/35] Add another small comment. --- dgraph/cmd/zero/pgp.go | 1 + 1 file changed, 1 insertion(+) diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go index 0ad7e63a206..0eab67d1160 100644 --- a/dgraph/cmd/zero/pgp.go +++ b/dgraph/cmd/zero/pgp.go @@ -56,6 +56,7 @@ func enterpriseDetails(signedFile string, e *enterprise) error { } // We need to read the body for the signature verification check to happen. + // md.Signature would be non-nil after reading the body if the verification is successfull. buf, err := ioutil.ReadAll(md.UnverifiedBody) if err != nil { return errors.Wrapf(err, "while reading body from signed license file") From 6bfb453cbd6a5c4bd8cf3d0f34bc2155dff0a83a Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 13:46:37 +1000 Subject: [PATCH 09/35] Propose enterprise state to the Zero cluster. --- dgraph/cmd/zero/raft.go | 36 +- dgraph/cmd/zero/zero.go | 7 + protos/pb.proto | 8 + protos/pb/pb.pb.go | 999 +++++++++++++++++++++++++++------------- 4 files changed, 733 insertions(+), 317 deletions(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index c982044bb70..c4cda49f987 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -356,6 +356,9 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { return p.Key, err } } + if p.Enterprise != nil { + state.Enterprise = p.Enterprise + } if p.MaxLeaseId > state.MaxLeaseId { state.MaxLeaseId = p.MaxLeaseId @@ -502,6 +505,33 @@ func (n *node) initAndStartNode() error { }() } + if n.server.enterpriseEnabled() { + n.server.RLock() + e := n.server.enterprise + proposal := &pb.ZeroProposal{ + Enterprise: &pb.Enterprise{ + Entity: e.Entity, + MaxNodes: e.MaxNodes, + ExpiryTs: e.Expiry.Unix(), + }, + } + n.server.RUnlock() + go func() { + for { + err := n.proposeAndWait(context.Background(), proposal) + if err == nil { + glog.Infof("Enterprise state proposed to the cluster") + break + } + if err == errInvalidProposal { + break + } + glog.Errorf("While proposing enterprise state: %v. Retrying...", err) + time.Sleep(3 * time.Second) + } + }() + } + go n.Run() go n.BatchAndSendMessages() return nil @@ -511,12 +541,6 @@ func (n *node) initAndStartNode() error { func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { defer closer.Done() - // Return early if enterprise is not enabled. This would happen when user didn't supply us a - // license file. - if !n.server.enterpriseEnabled() { - return - } - ticker := time.NewTicker(time.Minute) defer ticker.Stop() diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index f4abb63508f..fe4d745904a 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -290,6 +290,13 @@ func (s *Server) enterpriseEnabled() bool { func (s *Server) updateEnterpriseState() { s.Lock() defer s.Unlock() + + // Return early if enterprise is not enabled. This would happen when user didn't supply us a + // license file. + if !s.enterprise.enabled { + return + } + if time.Now().Before(s.enterprise.Expiry) { s.state.EnterpriseEnabled = true } else { diff --git a/protos/pb.proto b/protos/pb.proto index fb9e4304e8f..355731229ca 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -137,6 +137,12 @@ message Group { uint64 checksum = 4; // Stores a checksum. } +message Enterprise { + string entity = 1; + uint64 maxNodes = 2; + int64 expiryTs = 3; +} + message ZeroProposal { map snapshot_ts = 1; // Group ID -> Snapshot Ts. Member member = 2; @@ -147,6 +153,7 @@ message ZeroProposal { api.TxnContext txn = 7; string key = 8; // Used as unique identifier for proposal id. string cid = 9; // Used as unique identifier for the cluster. + Enterprise enterprise = 10; } // MembershipState is used to pack together the current membership state of all the nodes @@ -162,6 +169,7 @@ message MembershipState { repeated Member removed = 7; string cid = 8; // Used to uniquely identify the Dgraph cluster. bool enterpriseEnabled = 9; + Enterprise enterprise = 10; } message ConnectionState { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 5be14fba30a..02bb66bd2b4 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -51,7 +51,7 @@ func (x DirectedEdge_Op) String() string { } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{17, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{18, 0} } type Mutations_DropOp int32 @@ -82,7 +82,7 @@ func (x Mutations_DropOp) String() string { } func (Mutations_DropOp) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{18, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{19, 0} } type Posting_ValType int32 @@ -134,7 +134,7 @@ func (x Posting_ValType) String() string { } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{22, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{23, 0} } type Posting_PostingType int32 @@ -162,7 +162,7 @@ func (x Posting_PostingType) String() string { } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{22, 1} + return fileDescriptor_f80abaa17e25ccc8, []int{23, 1} } type SchemaUpdate_Directive int32 @@ -193,7 +193,7 @@ func (x SchemaUpdate_Directive) String() string { } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{34, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{35, 0} } type BackupKey_KeyType int32 @@ -236,7 +236,7 @@ func (x BackupKey_KeyType) String() string { } func (BackupKey_KeyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{49, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{50, 0} } type List struct { @@ -1159,6 +1159,69 @@ func (m *Group) GetChecksum() uint64 { return 0 } +type Enterprise struct { + Entity string `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` + MaxNodes uint64 `protobuf:"varint,2,opt,name=maxNodes,proto3" json:"maxNodes,omitempty"` + ExpiryTs int64 `protobuf:"varint,3,opt,name=expiryTs,proto3" json:"expiryTs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Enterprise) Reset() { *m = Enterprise{} } +func (m *Enterprise) String() string { return proto.CompactTextString(m) } +func (*Enterprise) ProtoMessage() {} +func (*Enterprise) Descriptor() ([]byte, []int) { + return fileDescriptor_f80abaa17e25ccc8, []int{13} +} +func (m *Enterprise) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Enterprise) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Enterprise.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Enterprise) XXX_Merge(src proto.Message) { + xxx_messageInfo_Enterprise.Merge(m, src) +} +func (m *Enterprise) XXX_Size() int { + return m.Size() +} +func (m *Enterprise) XXX_DiscardUnknown() { + xxx_messageInfo_Enterprise.DiscardUnknown(m) +} + +var xxx_messageInfo_Enterprise proto.InternalMessageInfo + +func (m *Enterprise) GetEntity() string { + if m != nil { + return m.Entity + } + return "" +} + +func (m *Enterprise) GetMaxNodes() uint64 { + if m != nil { + return m.MaxNodes + } + return 0 +} + +func (m *Enterprise) GetExpiryTs() int64 { + if m != nil { + return m.ExpiryTs + } + return 0 +} + type ZeroProposal struct { SnapshotTs map[uint32]uint64 `protobuf:"bytes,1,rep,name=snapshot_ts,json=snapshotTs,proto3" json:"snapshot_ts,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` Member *Member `protobuf:"bytes,2,opt,name=member,proto3" json:"member,omitempty"` @@ -1169,6 +1232,7 @@ type ZeroProposal struct { Txn *api.TxnContext `protobuf:"bytes,7,opt,name=txn,proto3" json:"txn,omitempty"` Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` Cid string `protobuf:"bytes,9,opt,name=cid,proto3" json:"cid,omitempty"` + Enterprise *Enterprise `protobuf:"bytes,10,opt,name=enterprise,proto3" json:"enterprise,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1178,7 +1242,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{13} + return fileDescriptor_f80abaa17e25ccc8, []int{14} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1270,6 +1334,13 @@ func (m *ZeroProposal) GetCid() string { return "" } +func (m *ZeroProposal) GetEnterprise() *Enterprise { + if m != nil { + return m.Enterprise + } + return nil +} + // MembershipState is used to pack together the current membership state of all the nodes // in the caller server; and the membership updates recorded by the callee server since // the provided lastUpdate. @@ -1283,6 +1354,7 @@ type MembershipState struct { Removed []*Member `protobuf:"bytes,7,rep,name=removed,proto3" json:"removed,omitempty"` Cid string `protobuf:"bytes,8,opt,name=cid,proto3" json:"cid,omitempty"` EnterpriseEnabled bool `protobuf:"varint,9,opt,name=enterpriseEnabled,proto3" json:"enterpriseEnabled,omitempty"` + Enterprise *Enterprise `protobuf:"bytes,10,opt,name=enterprise,proto3" json:"enterprise,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1292,7 +1364,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{14} + return fileDescriptor_f80abaa17e25ccc8, []int{15} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1384,6 +1456,13 @@ func (m *MembershipState) GetEnterpriseEnabled() bool { return false } +func (m *MembershipState) GetEnterprise() *Enterprise { + if m != nil { + return m.Enterprise + } + return nil +} + type ConnectionState struct { Member *Member `protobuf:"bytes,1,opt,name=member,proto3" json:"member,omitempty"` State *MembershipState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` @@ -1397,7 +1476,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{15} + return fileDescriptor_f80abaa17e25ccc8, []int{16} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1463,7 +1542,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{16} + return fileDescriptor_f80abaa17e25ccc8, []int{17} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1553,7 +1632,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{17} + return fileDescriptor_f80abaa17e25ccc8, []int{18} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1663,7 +1742,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{18} + return fileDescriptor_f80abaa17e25ccc8, []int{19} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1765,7 +1844,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{19} + return fileDescriptor_f80abaa17e25ccc8, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1847,7 +1926,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{20} + return fileDescriptor_f80abaa17e25ccc8, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1945,7 +2024,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{21} + return fileDescriptor_f80abaa17e25ccc8, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2010,7 +2089,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{22} + return fileDescriptor_f80abaa17e25ccc8, []int{23} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2129,7 +2208,7 @@ func (m *UidBlock) Reset() { *m = UidBlock{} } func (m *UidBlock) String() string { return proto.CompactTextString(m) } func (*UidBlock) ProtoMessage() {} func (*UidBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{23} + return fileDescriptor_f80abaa17e25ccc8, []int{24} } func (m *UidBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2191,7 +2270,7 @@ func (m *UidPack) Reset() { *m = UidPack{} } func (m *UidPack) String() string { return proto.CompactTextString(m) } func (*UidPack) ProtoMessage() {} func (*UidPack) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{24} + return fileDescriptor_f80abaa17e25ccc8, []int{25} } func (m *UidPack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2248,7 +2327,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{25} + return fileDescriptor_f80abaa17e25ccc8, []int{26} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2317,7 +2396,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{26} + return fileDescriptor_f80abaa17e25ccc8, []int{27} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2372,7 +2451,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{27} + return fileDescriptor_f80abaa17e25ccc8, []int{28} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2426,7 +2505,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{28} + return fileDescriptor_f80abaa17e25ccc8, []int{29} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2473,7 +2552,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{29} + return fileDescriptor_f80abaa17e25ccc8, []int{30} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2522,7 +2601,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{30} + return fileDescriptor_f80abaa17e25ccc8, []int{31} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2586,7 +2665,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{31} + return fileDescriptor_f80abaa17e25ccc8, []int{32} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2652,7 +2731,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{32} + return fileDescriptor_f80abaa17e25ccc8, []int{33} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2720,7 +2799,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{33} + return fileDescriptor_f80abaa17e25ccc8, []int{34} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2781,7 +2860,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{34} + return fileDescriptor_f80abaa17e25ccc8, []int{35} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2899,7 +2978,7 @@ func (m *TypeUpdate) Reset() { *m = TypeUpdate{} } func (m *TypeUpdate) String() string { return proto.CompactTextString(m) } func (*TypeUpdate) ProtoMessage() {} func (*TypeUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{35} + return fileDescriptor_f80abaa17e25ccc8, []int{36} } func (m *TypeUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2957,7 +3036,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{36} + return fileDescriptor_f80abaa17e25ccc8, []int{37} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3021,7 +3100,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{37} + return fileDescriptor_f80abaa17e25ccc8, []int{38} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3090,7 +3169,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{38} + return fileDescriptor_f80abaa17e25ccc8, []int{39} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3146,7 +3225,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{39} + return fileDescriptor_f80abaa17e25ccc8, []int{40} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3207,7 +3286,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{40} + return fileDescriptor_f80abaa17e25ccc8, []int{41} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3254,7 +3333,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{41} + return fileDescriptor_f80abaa17e25ccc8, []int{42} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3302,7 +3381,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{42} + return fileDescriptor_f80abaa17e25ccc8, []int{43} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3358,7 +3437,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{43} + return fileDescriptor_f80abaa17e25ccc8, []int{44} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3422,7 +3501,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{44} + return fileDescriptor_f80abaa17e25ccc8, []int{45} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3484,7 +3563,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{45} + return fileDescriptor_f80abaa17e25ccc8, []int{46} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3541,7 +3620,7 @@ func (m *Status) Reset() { *m = Status{} } func (m *Status) String() string { return proto.CompactTextString(m) } func (*Status) ProtoMessage() {} func (*Status) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{46} + return fileDescriptor_f80abaa17e25ccc8, []int{47} } func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3608,7 +3687,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{47} + return fileDescriptor_f80abaa17e25ccc8, []int{48} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3721,7 +3800,7 @@ func (m *ExportRequest) Reset() { *m = ExportRequest{} } func (m *ExportRequest) String() string { return proto.CompactTextString(m) } func (*ExportRequest) ProtoMessage() {} func (*ExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{48} + return fileDescriptor_f80abaa17e25ccc8, []int{49} } func (m *ExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3795,7 +3874,7 @@ func (m *BackupKey) Reset() { *m = BackupKey{} } func (m *BackupKey) String() string { return proto.CompactTextString(m) } func (*BackupKey) ProtoMessage() {} func (*BackupKey) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{49} + return fileDescriptor_f80abaa17e25ccc8, []int{50} } func (m *BackupKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3881,7 +3960,7 @@ func (m *BackupPostingList) Reset() { *m = BackupPostingList{} } func (m *BackupPostingList) String() string { return proto.CompactTextString(m) } func (*BackupPostingList) ProtoMessage() {} func (*BackupPostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{50} + return fileDescriptor_f80abaa17e25ccc8, []int{51} } func (m *BackupPostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3960,6 +4039,7 @@ func init() { proto.RegisterType((*Group)(nil), "pb.Group") proto.RegisterMapType((map[uint64]*Member)(nil), "pb.Group.MembersEntry") proto.RegisterMapType((map[string]*Tablet)(nil), "pb.Group.TabletsEntry") + proto.RegisterType((*Enterprise)(nil), "pb.Enterprise") proto.RegisterType((*ZeroProposal)(nil), "pb.ZeroProposal") proto.RegisterMapType((map[uint32]uint64)(nil), "pb.ZeroProposal.SnapshotTsEntry") proto.RegisterType((*MembershipState)(nil), "pb.MembershipState") @@ -4007,240 +4087,243 @@ func init() { func init() { proto.RegisterFile("pb.proto", fileDescriptor_f80abaa17e25ccc8) } var fileDescriptor_f80abaa17e25ccc8 = []byte{ - // 3721 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x8f, 0xdc, 0x46, - 0x76, 0x22, 0xbb, 0x9b, 0x4d, 0xbe, 0xee, 0x19, 0xb5, 0xca, 0xb2, 0xdc, 0x1e, 0xef, 0x4a, 0x63, - 0xfa, 0x43, 0x63, 0xc9, 0x1a, 0xc9, 0xe3, 0x0d, 0xb2, 0xde, 0x20, 0x87, 0xd1, 0x4c, 0x4b, 0x3b, - 0xd6, 0x7c, 0x6d, 0x75, 0x8f, 0x9c, 0xf5, 0x21, 0x0d, 0x0e, 0x59, 0xd3, 0xc3, 0x1d, 0x36, 0xc9, - 0xb0, 0xd8, 0x93, 0x1e, 0xdf, 0x72, 0x48, 0x80, 0x00, 0xc9, 0x29, 0x97, 0x3d, 0x04, 0x39, 0x04, - 0xc8, 0x25, 0x97, 0x5c, 0x83, 0x1c, 0x03, 0x04, 0xc8, 0x31, 0xc8, 0x2f, 0x08, 0x9c, 0x20, 0xa7, - 0x9c, 0x03, 0xe4, 0x16, 0xbc, 0x57, 0xc5, 0x26, 0xd9, 0x1a, 0xc9, 0xeb, 0x05, 0x7c, 0xea, 0x7a, - 0x1f, 0xf5, 0xf5, 0xde, 0xab, 0xf7, 0xc5, 0x06, 0x3b, 0x3d, 0xdd, 0x4c, 0xb3, 0x24, 0x4f, 0x98, - 0x99, 0x9e, 0xae, 0x39, 0x5e, 0x1a, 0x2a, 0x70, 0xed, 0xfe, 0x24, 0xcc, 0xcf, 0x67, 0xa7, 0x9b, - 0x7e, 0x32, 0x7d, 0x1c, 0x4c, 0x32, 0x2f, 0x3d, 0x7f, 0x14, 0x26, 0x8f, 0x4f, 0xbd, 0x60, 0x22, - 0xb2, 0xc7, 0xe9, 0xe9, 0xe3, 0x62, 0x9e, 0xbb, 0x06, 0xcd, 0xfd, 0x50, 0xe6, 0x8c, 0x41, 0x73, - 0x16, 0x06, 0xb2, 0x6f, 0xac, 0x37, 0x36, 0x2c, 0x4e, 0x63, 0xf7, 0x00, 0x9c, 0x91, 0x27, 0x2f, - 0x5e, 0x7a, 0xd1, 0x4c, 0xb0, 0x1e, 0x34, 0x2e, 0xbd, 0xa8, 0x6f, 0xac, 0x1b, 0x1b, 0x5d, 0x8e, - 0x43, 0xb6, 0x09, 0xf6, 0xa5, 0x17, 0x8d, 0xf3, 0xab, 0x54, 0xf4, 0xcd, 0x75, 0x63, 0x63, 0x75, - 0xeb, 0xad, 0xcd, 0xf4, 0x74, 0xf3, 0x38, 0x91, 0x79, 0x18, 0x4f, 0x36, 0x5f, 0x7a, 0xd1, 0xe8, - 0x2a, 0x15, 0xbc, 0x7d, 0xa9, 0x06, 0xee, 0x11, 0x74, 0x86, 0x99, 0xff, 0x6c, 0x16, 0xfb, 0x79, - 0x98, 0xc4, 0xb8, 0x63, 0xec, 0x4d, 0x05, 0xad, 0xe8, 0x70, 0x1a, 0x23, 0xce, 0xcb, 0x26, 0xb2, - 0xdf, 0x58, 0x6f, 0x20, 0x0e, 0xc7, 0xac, 0x0f, 0xed, 0x50, 0xee, 0x24, 0xb3, 0x38, 0xef, 0x37, - 0xd7, 0x8d, 0x0d, 0x9b, 0x17, 0xa0, 0xfb, 0xe7, 0x0d, 0x68, 0xfd, 0x62, 0x26, 0xb2, 0x2b, 0x9a, - 0x97, 0xe7, 0x59, 0xb1, 0x16, 0x8e, 0xd9, 0x6d, 0x68, 0x45, 0x5e, 0x3c, 0x91, 0x7d, 0x93, 0x16, - 0x53, 0x00, 0x7b, 0x0f, 0x1c, 0xef, 0x2c, 0x17, 0xd9, 0x78, 0x16, 0x06, 0xfd, 0xc6, 0xba, 0xb1, - 0x61, 0x71, 0x9b, 0x10, 0x27, 0x61, 0xc0, 0xde, 0x05, 0x3b, 0x48, 0xc6, 0x7e, 0x75, 0xaf, 0x20, - 0xa1, 0xbd, 0xd8, 0x07, 0x60, 0xcf, 0xc2, 0x60, 0x1c, 0x85, 0x32, 0xef, 0xb7, 0xd6, 0x8d, 0x8d, - 0xce, 0x96, 0x8d, 0x97, 0x45, 0xd9, 0xf1, 0xf6, 0x2c, 0x0c, 0x48, 0x88, 0x0f, 0xc0, 0x96, 0x99, - 0x3f, 0x3e, 0x9b, 0xc5, 0x7e, 0xdf, 0x22, 0xa6, 0x9b, 0xc8, 0x54, 0xb9, 0x35, 0x6f, 0x4b, 0x05, - 0xe0, 0xb5, 0x32, 0x71, 0x29, 0x32, 0x29, 0xfa, 0x6d, 0xb5, 0x95, 0x06, 0xd9, 0x13, 0xe8, 0x9c, - 0x79, 0xbe, 0xc8, 0xc7, 0xa9, 0x97, 0x79, 0xd3, 0xbe, 0x5d, 0x2e, 0xf4, 0x0c, 0xd1, 0xc7, 0x88, - 0x95, 0x1c, 0xce, 0x16, 0x00, 0xfb, 0x1c, 0x56, 0x08, 0x92, 0xe3, 0xb3, 0x30, 0xca, 0x45, 0xd6, - 0x77, 0x68, 0xce, 0x2a, 0xcd, 0x21, 0xcc, 0x28, 0x13, 0x82, 0x77, 0x15, 0x93, 0xc2, 0xb0, 0x1f, - 0x03, 0x88, 0x79, 0xea, 0xc5, 0xc1, 0xd8, 0x8b, 0xa2, 0x3e, 0xd0, 0x19, 0x1c, 0x85, 0xd9, 0x8e, - 0x22, 0xf6, 0x0e, 0x9e, 0xcf, 0x0b, 0xc6, 0xb9, 0xec, 0xaf, 0xac, 0x1b, 0x1b, 0x4d, 0x6e, 0x21, - 0x38, 0x92, 0x28, 0x57, 0xdf, 0xf3, 0xcf, 0x45, 0x7f, 0x75, 0xdd, 0xd8, 0x68, 0x71, 0x05, 0xb8, - 0x5b, 0xe0, 0x90, 0x9d, 0x90, 0x1c, 0x3e, 0x02, 0xeb, 0x12, 0x01, 0x65, 0x4e, 0x9d, 0xad, 0x15, - 0x3c, 0xc8, 0xc2, 0x94, 0xb8, 0x26, 0xba, 0x77, 0xc1, 0xde, 0xf7, 0xe2, 0x49, 0x61, 0x7f, 0xa8, - 0x20, 0x9a, 0xe0, 0x70, 0x1a, 0xbb, 0xbf, 0x36, 0xc1, 0xe2, 0x42, 0xce, 0xa2, 0x9c, 0xdd, 0x07, - 0x40, 0xf1, 0x4f, 0xbd, 0x3c, 0x0b, 0xe7, 0x7a, 0xd5, 0x52, 0x01, 0xce, 0x2c, 0x0c, 0x0e, 0x88, - 0xc4, 0x9e, 0x40, 0x97, 0x56, 0x2f, 0x58, 0xcd, 0xf2, 0x00, 0x8b, 0xf3, 0xf1, 0x0e, 0xb1, 0xe8, - 0x19, 0x77, 0xc0, 0x22, 0x8d, 0x2b, 0xab, 0x5b, 0xe1, 0x1a, 0x62, 0x1f, 0xc1, 0x6a, 0x18, 0xe7, - 0xa8, 0x11, 0x3f, 0x1f, 0x07, 0x42, 0x16, 0x26, 0xb1, 0xb2, 0xc0, 0xee, 0x0a, 0x99, 0xb3, 0xcf, - 0x40, 0x89, 0xb5, 0xd8, 0xb0, 0x45, 0x1b, 0xae, 0x2e, 0xd4, 0x25, 0xd5, 0x8e, 0xc4, 0xa3, 0x77, - 0x7c, 0x04, 0x1d, 0xbc, 0x5f, 0x31, 0xc3, 0xa2, 0x19, 0x5d, 0xba, 0x8d, 0x16, 0x07, 0x07, 0x64, - 0xd0, 0xec, 0x28, 0x1a, 0x34, 0x3b, 0x65, 0x26, 0x34, 0x76, 0x07, 0xd0, 0x3a, 0xca, 0x02, 0x91, - 0x5d, 0x6b, 0xf9, 0x0c, 0x9a, 0x81, 0x90, 0x3e, 0x3d, 0x4a, 0x9b, 0xd3, 0xb8, 0x7c, 0x0d, 0x8d, - 0xca, 0x6b, 0x70, 0xff, 0xc6, 0x80, 0xce, 0x30, 0xc9, 0xf2, 0x03, 0x21, 0xa5, 0x37, 0x11, 0xec, - 0x1e, 0xb4, 0x12, 0x5c, 0x56, 0x4b, 0xd8, 0xc1, 0x33, 0xd1, 0x3e, 0x5c, 0xe1, 0x97, 0xf4, 0x60, - 0xbe, 0x5e, 0x0f, 0x68, 0x25, 0xf4, 0x8e, 0x1a, 0xda, 0x4a, 0xe8, 0x15, 0xdd, 0x01, 0x2b, 0x39, - 0x3b, 0x93, 0x42, 0xc9, 0xb2, 0xc5, 0x35, 0xf4, 0x5a, 0x63, 0x73, 0x7f, 0x07, 0x00, 0xcf, 0xf7, - 0x3d, 0xad, 0xc0, 0x3d, 0x87, 0x0e, 0xf7, 0xce, 0xf2, 0x9d, 0x24, 0xce, 0xc5, 0x3c, 0x67, 0xab, - 0x60, 0x86, 0x01, 0x89, 0xc8, 0xe2, 0x66, 0x18, 0xe0, 0xe1, 0x26, 0x59, 0x32, 0x4b, 0x49, 0x42, - 0x2b, 0x5c, 0x01, 0x24, 0xca, 0x20, 0xc8, 0xe8, 0xc4, 0x28, 0xca, 0x20, 0xc8, 0xd8, 0x3d, 0xe8, - 0xc8, 0xd8, 0x4b, 0xe5, 0x79, 0x92, 0xe3, 0xe1, 0x9a, 0x74, 0x38, 0x28, 0x50, 0x23, 0xe9, 0xfe, - 0x8b, 0x01, 0xd6, 0x81, 0x98, 0x9e, 0x8a, 0xec, 0x95, 0x5d, 0xde, 0x05, 0x9b, 0x16, 0x1e, 0x87, - 0x81, 0xde, 0xa8, 0x4d, 0xf0, 0x5e, 0x70, 0xed, 0x56, 0x77, 0xc0, 0x8a, 0x84, 0x87, 0xc2, 0x57, - 0x76, 0xa6, 0x21, 0x94, 0x8d, 0x37, 0x1d, 0x07, 0xc2, 0x0b, 0xc8, 0xf1, 0xd8, 0xdc, 0xf2, 0xa6, - 0xbb, 0xc2, 0x0b, 0xf0, 0x6c, 0x91, 0x27, 0xf3, 0xf1, 0x2c, 0x0d, 0xbc, 0x5c, 0x90, 0xc3, 0x69, - 0xa2, 0xe1, 0xc8, 0xfc, 0x84, 0x30, 0xec, 0x01, 0xdc, 0xf2, 0xa3, 0x99, 0x44, 0x6f, 0x17, 0xc6, - 0x67, 0xc9, 0x38, 0x89, 0xa3, 0x2b, 0x92, 0xaf, 0xcd, 0x6f, 0x6a, 0xc2, 0x5e, 0x7c, 0x96, 0x1c, - 0xc5, 0xd1, 0x95, 0xfb, 0x8f, 0x26, 0xb4, 0x9e, 0x93, 0x18, 0x9e, 0x40, 0x7b, 0x4a, 0x17, 0x2a, - 0x5e, 0xef, 0x1d, 0x94, 0x30, 0xd1, 0x36, 0xd5, 0x4d, 0xe5, 0x20, 0xce, 0xb3, 0x2b, 0x5e, 0xb0, - 0xe1, 0x8c, 0xdc, 0x3b, 0x8d, 0x44, 0x2e, 0xb5, 0x45, 0x54, 0x66, 0x8c, 0x14, 0x41, 0xcf, 0xd0, - 0x6c, 0xcb, 0x62, 0x6d, 0x2c, 0x8b, 0x95, 0xad, 0x81, 0xed, 0x9f, 0x0b, 0xff, 0x42, 0xce, 0xa6, - 0x5a, 0xe8, 0x0b, 0x78, 0xed, 0x19, 0x74, 0xab, 0xe7, 0xc0, 0xc8, 0x74, 0x21, 0xae, 0x48, 0xf0, - 0x4d, 0x8e, 0x43, 0xb6, 0x0e, 0x2d, 0x7a, 0xe1, 0x24, 0xf6, 0xce, 0x16, 0xe0, 0x71, 0xd4, 0x14, - 0xae, 0x08, 0x3f, 0x33, 0x7f, 0x6a, 0xe0, 0x3a, 0xd5, 0xd3, 0x55, 0xd7, 0x71, 0x5e, 0xbf, 0x8e, - 0x9a, 0x52, 0x59, 0xc7, 0xfd, 0x3f, 0x13, 0xba, 0x5f, 0x8b, 0x2c, 0x39, 0xce, 0x92, 0x34, 0x91, - 0x5e, 0xc4, 0xb6, 0xeb, 0xb7, 0x53, 0x52, 0x5c, 0xc7, 0xc9, 0x55, 0xb6, 0xcd, 0xe1, 0xe2, 0xba, - 0x4a, 0x3a, 0xd5, 0xfb, 0xbb, 0x60, 0x29, 0xe9, 0x5e, 0x73, 0x05, 0x4d, 0x41, 0x1e, 0x25, 0x4f, - 0x92, 0x5f, 0xfd, 0x78, 0x9a, 0xc2, 0xee, 0x02, 0x4c, 0xbd, 0xf9, 0xbe, 0xf0, 0xa4, 0xd8, 0x0b, - 0x0a, 0xf3, 0x2d, 0x31, 0x28, 0xe7, 0xa9, 0x37, 0x1f, 0xcd, 0xe3, 0x91, 0x24, 0xeb, 0x6a, 0xf2, - 0x05, 0xcc, 0x7e, 0x04, 0xce, 0xd4, 0x9b, 0xe3, 0x3b, 0xda, 0x0b, 0xb4, 0x75, 0x95, 0x08, 0xf6, - 0x3e, 0x34, 0xf2, 0x79, 0x4c, 0x4e, 0x09, 0xa3, 0x13, 0xa6, 0x1e, 0xa3, 0x79, 0xac, 0x5f, 0x1c, - 0x47, 0x5a, 0x21, 0x50, 0xbb, 0x14, 0x68, 0x0f, 0x1a, 0x7e, 0x18, 0x50, 0x78, 0x72, 0x38, 0x0e, - 0xd7, 0x7e, 0x1f, 0x6e, 0x2e, 0xc9, 0xa1, 0xaa, 0x87, 0x15, 0x35, 0xed, 0x76, 0x55, 0x0f, 0xcd, - 0xaa, 0xec, 0xff, 0xbb, 0x01, 0x37, 0xb5, 0x31, 0x9c, 0x87, 0xe9, 0x30, 0x47, 0xb3, 0xef, 0x43, - 0x9b, 0xbc, 0x8d, 0xc8, 0xb4, 0x4d, 0x14, 0x20, 0xfb, 0x5d, 0xb0, 0xe8, 0x05, 0x16, 0x76, 0x7a, - 0xaf, 0x94, 0xea, 0x62, 0xba, 0xb2, 0x5b, 0xad, 0x12, 0xcd, 0xce, 0x7e, 0x02, 0xad, 0x6f, 0x44, - 0x96, 0x28, 0xef, 0xd9, 0xd9, 0xba, 0x7b, 0xdd, 0x3c, 0xd4, 0xad, 0x9e, 0xa6, 0x98, 0x7f, 0x40, - 0xe1, 0x7f, 0x88, 0xfe, 0x72, 0x9a, 0x5c, 0x8a, 0xa0, 0xdf, 0xa6, 0x13, 0x55, 0xed, 0xa3, 0x20, - 0x15, 0xd2, 0xb6, 0x17, 0xd2, 0x66, 0x9f, 0xc2, 0x2d, 0x81, 0x92, 0x48, 0xb3, 0x50, 0x8a, 0x41, - 0x8c, 0x36, 0xa2, 0xb4, 0x61, 0xf3, 0x57, 0x09, 0x6b, 0xbb, 0xd0, 0xa9, 0x08, 0xe3, 0x1a, 0xbd, - 0xdc, 0xab, 0xbf, 0x0f, 0x67, 0xf1, 0xec, 0xab, 0xcf, 0x6c, 0x17, 0xa0, 0x14, 0xcd, 0x6f, 0xfb, - 0x58, 0xdd, 0x3f, 0x31, 0xe0, 0xe6, 0x4e, 0x12, 0xc7, 0x82, 0xd2, 0x28, 0xa5, 0xe8, 0xf2, 0x91, - 0x18, 0xaf, 0x7d, 0x24, 0x9f, 0x40, 0x4b, 0x22, 0xb3, 0x5e, 0xfd, 0xad, 0x6b, 0x34, 0xc7, 0x15, - 0x07, 0x3a, 0xa5, 0xa9, 0x37, 0x1f, 0xa7, 0x22, 0x0e, 0xc2, 0x78, 0x52, 0x38, 0xa5, 0xa9, 0x37, - 0x3f, 0x56, 0x18, 0xf7, 0x6f, 0x0d, 0xb0, 0xd4, 0xfb, 0xaa, 0xf9, 0x76, 0xa3, 0xee, 0xdb, 0x7f, - 0x04, 0x4e, 0x9a, 0x89, 0x20, 0xf4, 0x8b, 0x5d, 0x1d, 0x5e, 0x22, 0xd0, 0x94, 0xcf, 0x92, 0xcc, - 0x17, 0xb4, 0xbc, 0xcd, 0x15, 0x80, 0x58, 0x99, 0x7a, 0xbe, 0x4a, 0x05, 0x1b, 0x5c, 0x01, 0x18, - 0x11, 0x94, 0x2a, 0x49, 0x85, 0x36, 0xd7, 0x10, 0xe6, 0xb0, 0x14, 0x2d, 0xc9, 0x9f, 0x2b, 0xed, - 0xd9, 0x88, 0x20, 0x47, 0xfe, 0xf7, 0x26, 0x74, 0x77, 0xc3, 0x4c, 0xf8, 0xb9, 0x08, 0x06, 0xc1, - 0x84, 0x56, 0x11, 0x71, 0x1e, 0xe6, 0x57, 0x3a, 0x34, 0x69, 0x68, 0x91, 0x39, 0x98, 0xf5, 0x9c, - 0x59, 0xe9, 0xa2, 0x41, 0x69, 0xbe, 0x02, 0xd8, 0x16, 0x80, 0xca, 0xa9, 0x28, 0xd5, 0x6f, 0xbe, - 0x3e, 0xd5, 0x77, 0x88, 0x0d, 0x87, 0x28, 0x20, 0x35, 0x27, 0x54, 0x61, 0xcb, 0xa2, 0x3a, 0x60, - 0x86, 0x66, 0x4f, 0xa9, 0xc8, 0xa9, 0x88, 0xc8, 0xac, 0x29, 0x15, 0x39, 0x15, 0xd1, 0x22, 0x01, - 0x6c, 0xab, 0xe3, 0xe0, 0x98, 0x7d, 0x00, 0x66, 0x92, 0xd2, 0xe5, 0xf5, 0x86, 0xd5, 0x8b, 0x6d, - 0x1e, 0xa5, 0xdc, 0x4c, 0x52, 0xb4, 0x02, 0x95, 0xd7, 0xf6, 0x1d, 0xfd, 0x14, 0xd0, 0x17, 0x51, - 0xee, 0xc5, 0x35, 0xc5, 0xbd, 0x03, 0xe6, 0x51, 0xca, 0xda, 0xd0, 0x18, 0x0e, 0x46, 0xbd, 0x1b, - 0x38, 0xd8, 0x1d, 0xec, 0xf7, 0x0c, 0xf7, 0x7f, 0x4c, 0x70, 0x0e, 0x66, 0xb9, 0x87, 0x36, 0x25, - 0xdf, 0xa4, 0xd4, 0x77, 0xc1, 0x96, 0xb9, 0x97, 0x91, 0x3f, 0x57, 0x4e, 0xa8, 0x4d, 0xf0, 0x48, - 0xb2, 0x8f, 0xa1, 0x25, 0x82, 0x89, 0x28, 0x7c, 0x43, 0x6f, 0xf9, 0x9c, 0x5c, 0x91, 0xd9, 0x06, - 0x58, 0xd2, 0x3f, 0x17, 0x53, 0xaf, 0xdf, 0x2c, 0x19, 0x87, 0x84, 0x51, 0xf1, 0x9a, 0x6b, 0x3a, - 0xdb, 0x82, 0xb7, 0xc3, 0x49, 0x9c, 0x64, 0x62, 0x1c, 0xc6, 0x81, 0x98, 0x8f, 0xfd, 0x24, 0x3e, - 0x8b, 0x42, 0x3f, 0xd7, 0xf1, 0xff, 0x2d, 0x45, 0xdc, 0x43, 0xda, 0x8e, 0x26, 0xb1, 0x0f, 0xa1, - 0x85, 0xda, 0x91, 0x3a, 0x9b, 0xa4, 0xfc, 0x13, 0x15, 0xa1, 0x97, 0x56, 0x44, 0xf6, 0x08, 0xda, - 0x41, 0x96, 0xa4, 0xe3, 0x24, 0x25, 0x39, 0xaf, 0x6e, 0xdd, 0xa6, 0xf7, 0x50, 0x48, 0x60, 0x73, - 0x37, 0x4b, 0xd2, 0xa3, 0x94, 0x5b, 0x01, 0xfd, 0x62, 0x89, 0x40, 0xec, 0xca, 0x26, 0x94, 0x1f, - 0x71, 0x10, 0x43, 0xa9, 0xb4, 0xfb, 0x18, 0x2c, 0x35, 0x81, 0xd9, 0xd0, 0x3c, 0x3c, 0x3a, 0x1c, - 0x28, 0xd1, 0x6e, 0xef, 0xef, 0xf7, 0x0c, 0x44, 0xed, 0x6e, 0x8f, 0xb6, 0x7b, 0x26, 0x8e, 0x46, - 0xbf, 0x3c, 0x1e, 0xf4, 0x1a, 0xee, 0x5f, 0x19, 0x60, 0x17, 0xde, 0x9e, 0x7d, 0x82, 0x6e, 0x9a, - 0xa2, 0x85, 0x7e, 0xbe, 0x54, 0xe2, 0x54, 0xd2, 0x36, 0x5e, 0xd0, 0xd1, 0x62, 0x48, 0x12, 0x85, - 0xff, 0x27, 0xa0, 0x9a, 0x34, 0x36, 0x6a, 0x15, 0x0a, 0xe6, 0xbf, 0x49, 0x2c, 0x74, 0x1e, 0x45, - 0x63, 0x52, 0x60, 0x18, 0xfb, 0x02, 0xb9, 0x5b, 0x5a, 0x81, 0x08, 0x8f, 0xa4, 0xfb, 0xd7, 0x26, - 0xd8, 0x8b, 0xd8, 0xfd, 0x10, 0x9c, 0x69, 0x21, 0x0e, 0xed, 0x33, 0x56, 0x6a, 0x32, 0xe2, 0x25, - 0x9d, 0xdd, 0x01, 0xf3, 0xe2, 0x52, 0xab, 0xd3, 0x42, 0xae, 0x17, 0x2f, 0xb9, 0x79, 0x71, 0x59, - 0x3a, 0x9d, 0xd6, 0x77, 0x3a, 0x9d, 0xfb, 0x70, 0xd3, 0x8f, 0x84, 0x17, 0x8f, 0x4b, 0x9f, 0xa1, - 0x9e, 0xc5, 0x2a, 0xa1, 0x8f, 0x17, 0x8e, 0x43, 0x3b, 0xce, 0x76, 0x19, 0x4c, 0x3f, 0x82, 0x56, - 0x20, 0xa2, 0xdc, 0xab, 0x56, 0x88, 0x47, 0x99, 0xe7, 0x47, 0x62, 0x17, 0xd1, 0x5c, 0x51, 0xd9, - 0x06, 0xd8, 0x45, 0x62, 0xa1, 0xeb, 0x42, 0x2a, 0x35, 0x0a, 0x3d, 0xf0, 0x05, 0xb5, 0x14, 0x33, - 0x54, 0xc4, 0xec, 0x7e, 0x06, 0x8d, 0x17, 0x2f, 0x87, 0xfa, 0xae, 0xc6, 0x2b, 0x77, 0x2d, 0x84, - 0x6d, 0x96, 0xc2, 0x76, 0xff, 0xb7, 0x01, 0x6d, 0xed, 0x1b, 0xf0, 0xdc, 0xb3, 0x45, 0x5a, 0x8c, - 0xc3, 0x7a, 0x34, 0x5f, 0x38, 0x99, 0x6a, 0x37, 0xa1, 0xf1, 0xdd, 0xdd, 0x04, 0xf6, 0x33, 0xe8, - 0xa6, 0x8a, 0x56, 0x75, 0x4b, 0xef, 0x54, 0xe7, 0xe8, 0x5f, 0x9a, 0xd7, 0x49, 0x4b, 0x00, 0x8d, - 0x81, 0x0a, 0xb0, 0xdc, 0x9b, 0x90, 0x8a, 0xba, 0xbc, 0x8d, 0xf0, 0xc8, 0x9b, 0xbc, 0xc6, 0x39, - 0xfd, 0x06, 0x3e, 0x06, 0xd3, 0xff, 0x24, 0xed, 0x77, 0xc9, 0x6f, 0xa0, 0x5f, 0xaa, 0xba, 0x8c, - 0x95, 0xba, 0xcb, 0x78, 0x0f, 0x1c, 0x3f, 0x99, 0x4e, 0x43, 0xa2, 0xad, 0xea, 0xf4, 0x96, 0x10, - 0x23, 0xe9, 0xfe, 0x99, 0x01, 0x6d, 0x7d, 0x5b, 0xd6, 0x81, 0xf6, 0xee, 0xe0, 0xd9, 0xf6, 0xc9, - 0x3e, 0x7a, 0x2d, 0x00, 0xeb, 0xe9, 0xde, 0xe1, 0x36, 0xff, 0x65, 0xcf, 0xc0, 0x67, 0xb6, 0x77, - 0x38, 0xea, 0x99, 0xcc, 0x81, 0xd6, 0xb3, 0xfd, 0xa3, 0xed, 0x51, 0xaf, 0x81, 0xef, 0xec, 0xe9, - 0xd1, 0xd1, 0x7e, 0xaf, 0xc9, 0xba, 0x60, 0xef, 0x6e, 0x8f, 0x06, 0xa3, 0xbd, 0x83, 0x41, 0xaf, - 0x85, 0xbc, 0xcf, 0x07, 0x47, 0x3d, 0x0b, 0x07, 0x27, 0x7b, 0xbb, 0xbd, 0x36, 0xd2, 0x8f, 0xb7, - 0x87, 0xc3, 0xaf, 0x8e, 0xf8, 0x6e, 0xcf, 0xc6, 0x75, 0x87, 0x23, 0xbe, 0x77, 0xf8, 0xbc, 0xe7, - 0xe0, 0xf8, 0xe8, 0xe9, 0x97, 0x83, 0x9d, 0x51, 0x0f, 0xdc, 0xcf, 0xa0, 0x53, 0x91, 0x20, 0xce, - 0xe6, 0x83, 0x67, 0xbd, 0x1b, 0xb8, 0xe5, 0xcb, 0xed, 0xfd, 0x93, 0x41, 0xcf, 0x60, 0xab, 0x00, - 0x34, 0x1c, 0xef, 0x6f, 0x1f, 0x3e, 0xef, 0x99, 0xee, 0x2f, 0xc0, 0x3e, 0x09, 0x83, 0xa7, 0x51, - 0xe2, 0x5f, 0xa0, 0x61, 0x9c, 0x7a, 0x52, 0xe8, 0x50, 0x4f, 0x63, 0x8c, 0x45, 0x64, 0x94, 0x52, - 0xeb, 0x5e, 0x43, 0x28, 0xab, 0x78, 0x36, 0x1d, 0x53, 0x07, 0xaa, 0xa1, 0x3c, 0x6f, 0x3c, 0x9b, - 0x9e, 0x84, 0x81, 0x74, 0x0f, 0xa1, 0x7d, 0x12, 0x06, 0xc7, 0x9e, 0x7f, 0x81, 0xee, 0xe8, 0x14, - 0x97, 0x1e, 0xcb, 0xf0, 0x1b, 0xa1, 0x3d, 0xb4, 0x43, 0x98, 0x61, 0xf8, 0x8d, 0x60, 0x1f, 0x82, - 0x45, 0x40, 0x91, 0xdd, 0x91, 0x99, 0x17, 0xc7, 0xe1, 0x9a, 0xe6, 0xfe, 0x85, 0xb1, 0xb8, 0x16, - 0x35, 0x1e, 0xee, 0x41, 0x33, 0xf5, 0xfc, 0x0b, 0xed, 0x83, 0x3a, 0x7a, 0x0e, 0xee, 0xc7, 0x89, - 0xc0, 0xee, 0x83, 0xad, 0x6d, 0xa7, 0x58, 0xb8, 0x53, 0x31, 0x32, 0xbe, 0x20, 0xd6, 0xb5, 0xda, - 0xa8, 0x6b, 0x15, 0x6f, 0x2e, 0xd3, 0x28, 0xa4, 0x1a, 0xb2, 0x81, 0xbe, 0x4a, 0x41, 0xee, 0x4f, - 0x00, 0xca, 0xae, 0xce, 0x35, 0x25, 0xc8, 0x6d, 0x68, 0x79, 0x51, 0xa8, 0x05, 0xe6, 0x70, 0x05, - 0xb8, 0x87, 0xd0, 0xa9, 0xf4, 0x82, 0x50, 0x7c, 0x5e, 0x14, 0x8d, 0x2f, 0xc4, 0x95, 0xa4, 0xb9, - 0x36, 0x6f, 0x7b, 0x51, 0xf4, 0x42, 0x5c, 0x49, 0x8c, 0x0b, 0xaa, 0x8d, 0x64, 0x2e, 0xf5, 0x25, - 0x68, 0x2a, 0x57, 0x44, 0xf7, 0x53, 0xb0, 0x54, 0xb3, 0xa2, 0x62, 0xe9, 0xc6, 0x6b, 0xa3, 0xe9, - 0x17, 0xfa, 0xcc, 0xd4, 0xda, 0x60, 0x0f, 0x75, 0xbb, 0x4a, 0xaa, 0xe6, 0x98, 0x51, 0xe6, 0xa3, - 0x8a, 0x49, 0x77, 0xaa, 0x88, 0xd9, 0xdd, 0x05, 0xfb, 0x8d, 0x0d, 0x40, 0x2d, 0x00, 0xb3, 0x14, - 0xc0, 0x35, 0x2d, 0x41, 0xf7, 0x57, 0x00, 0x65, 0x5b, 0x4b, 0x3f, 0x3c, 0xb5, 0x0a, 0x3e, 0xbc, - 0x07, 0x58, 0x3b, 0x86, 0x51, 0x90, 0x89, 0xb8, 0x76, 0xeb, 0xb2, 0x11, 0xb6, 0xa0, 0xb3, 0x75, - 0x68, 0x52, 0xb7, 0xae, 0x51, 0x3a, 0xc6, 0x45, 0xab, 0x8e, 0x28, 0xee, 0x1c, 0x56, 0x54, 0x90, - 0xe6, 0xe2, 0x8f, 0x66, 0x42, 0xbe, 0x31, 0xf5, 0xbb, 0x0b, 0xb0, 0x70, 0xe3, 0x45, 0xdf, 0xb1, - 0x82, 0x41, 0x23, 0x38, 0x0b, 0x45, 0x14, 0x14, 0xb7, 0xd1, 0x10, 0x2a, 0x59, 0x05, 0xef, 0xa6, - 0x6a, 0xce, 0x10, 0xe0, 0xfe, 0x1e, 0x74, 0x8b, 0x9d, 0xa9, 0xfb, 0xf1, 0x70, 0x91, 0x40, 0x28, - 0x19, 0xab, 0xa2, 0x4b, 0xb1, 0x1c, 0x26, 0x81, 0x78, 0x6a, 0xf6, 0x8d, 0x22, 0x87, 0x70, 0xff, - 0xbd, 0x51, 0xcc, 0xd6, 0xcd, 0x80, 0x5a, 0x5a, 0x6a, 0x2c, 0xa7, 0xa5, 0xf5, 0x14, 0xcf, 0xfc, - 0x8d, 0x52, 0xbc, 0x9f, 0x82, 0x13, 0x50, 0x9e, 0x13, 0x5e, 0x16, 0x2e, 0x7b, 0x6d, 0x39, 0xa7, - 0xd1, 0x99, 0x50, 0x78, 0x29, 0x78, 0xc9, 0x8c, 0x67, 0xc9, 0x93, 0x0b, 0x11, 0x87, 0xdf, 0x50, - 0xb7, 0x03, 0xef, 0x5c, 0x22, 0xca, 0xd6, 0x91, 0x4a, 0x77, 0x74, 0xeb, 0xa8, 0xe8, 0x82, 0x59, - 0x65, 0x17, 0x0c, 0xe5, 0x39, 0x4b, 0xa5, 0xc8, 0xf2, 0x22, 0x41, 0x56, 0xd0, 0x22, 0x97, 0x74, + // 3769 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0x1b, 0xd7, + 0x76, 0x9e, 0x21, 0x39, 0x9c, 0x39, 0xa4, 0x64, 0xfa, 0xc6, 0x71, 0x18, 0xe5, 0x3d, 0x5b, 0x99, + 0x7c, 0x58, 0xb1, 0x63, 0xd9, 0x51, 0x5e, 0xd1, 0x97, 0x57, 0x74, 0x21, 0x4b, 0xb4, 0x9f, 0x62, + 0x7d, 0xbd, 0x4b, 0xca, 0xe9, 0x0b, 0x8a, 0x12, 0xa3, 0x99, 0x2b, 0x6a, 0x9e, 0x86, 0x33, 0xd3, + 0xb9, 0x43, 0x95, 0xca, 0xae, 0x8b, 0x16, 0x28, 0xd0, 0xae, 0x0a, 0x14, 0x6f, 0x51, 0x74, 0x51, + 0xa0, 0x8b, 0x76, 0xd3, 0x6d, 0xd1, 0x65, 0x81, 0x02, 0x5d, 0x16, 0xfd, 0x05, 0x45, 0xda, 0x65, + 0xd7, 0x5d, 0x17, 0xe7, 0xdc, 0x3b, 0x1f, 0xa4, 0x65, 0xe7, 0xa5, 0x40, 0x56, 0xbc, 0xe7, 0xe3, + 0x7e, 0x9d, 0x73, 0xee, 0xf9, 0x1a, 0x82, 0x9d, 0x9e, 0x6e, 0xa6, 0x59, 0x92, 0x27, 0xcc, 0x4c, + 0x4f, 0xd7, 0x1c, 0x2f, 0x0d, 0x15, 0xb8, 0x76, 0x7f, 0x12, 0xe6, 0xe7, 0xb3, 0xd3, 0x4d, 0x3f, + 0x99, 0x3e, 0x0e, 0x26, 0x99, 0x97, 0x9e, 0x3f, 0x0a, 0x93, 0xc7, 0xa7, 0x5e, 0x30, 0x11, 0xd9, + 0xe3, 0xf4, 0xf4, 0x71, 0x31, 0xcf, 0x5d, 0x83, 0xe6, 0x7e, 0x28, 0x73, 0xc6, 0xa0, 0x39, 0x0b, + 0x03, 0xd9, 0x37, 0xd6, 0x1b, 0x1b, 0x16, 0xa7, 0xb1, 0x7b, 0x00, 0xce, 0xc8, 0x93, 0x17, 0x2f, + 0xbd, 0x68, 0x26, 0x58, 0x0f, 0x1a, 0x97, 0x5e, 0xd4, 0x37, 0xd6, 0x8d, 0x8d, 0x2e, 0xc7, 0x21, + 0xdb, 0x04, 0xfb, 0xd2, 0x8b, 0xc6, 0xf9, 0x55, 0x2a, 0xfa, 0xe6, 0xba, 0xb1, 0xb1, 0xba, 0xf5, + 0xd6, 0x66, 0x7a, 0xba, 0x79, 0x9c, 0xc8, 0x3c, 0x8c, 0x27, 0x9b, 0x2f, 0xbd, 0x68, 0x74, 0x95, + 0x0a, 0xde, 0xbe, 0x54, 0x03, 0xf7, 0x08, 0x3a, 0xc3, 0xcc, 0x7f, 0x36, 0x8b, 0xfd, 0x3c, 0x4c, + 0x62, 0xdc, 0x31, 0xf6, 0xa6, 0x82, 0x56, 0x74, 0x38, 0x8d, 0x11, 0xe7, 0x65, 0x13, 0xd9, 0x6f, + 0xac, 0x37, 0x10, 0x87, 0x63, 0xd6, 0x87, 0x76, 0x28, 0x77, 0x92, 0x59, 0x9c, 0xf7, 0x9b, 0xeb, + 0xc6, 0x86, 0xcd, 0x0b, 0xd0, 0xfd, 0xb3, 0x06, 0xb4, 0x7e, 0x31, 0x13, 0xd9, 0x15, 0xcd, 0xcb, + 0xf3, 0xac, 0x58, 0x0b, 0xc7, 0xec, 0x36, 0xb4, 0x22, 0x2f, 0x9e, 0xc8, 0xbe, 0x49, 0x8b, 0x29, + 0x80, 0xbd, 0x07, 0x8e, 0x77, 0x96, 0x8b, 0x6c, 0x3c, 0x0b, 0x83, 0x7e, 0x63, 0xdd, 0xd8, 0xb0, + 0xb8, 0x4d, 0x88, 0x93, 0x30, 0x60, 0xef, 0x82, 0x1d, 0x24, 0x63, 0xbf, 0xbe, 0x57, 0x90, 0xd0, + 0x5e, 0xec, 0x03, 0xb0, 0x67, 0x61, 0x30, 0x8e, 0x42, 0x99, 0xf7, 0x5b, 0xeb, 0xc6, 0x46, 0x67, + 0xcb, 0xc6, 0xcb, 0xa2, 0xec, 0x78, 0x7b, 0x16, 0x06, 0x24, 0xc4, 0x07, 0x60, 0xcb, 0xcc, 0x1f, + 0x9f, 0xcd, 0x62, 0xbf, 0x6f, 0x11, 0xd3, 0x4d, 0x64, 0xaa, 0xdd, 0x9a, 0xb7, 0xa5, 0x02, 0xf0, + 0x5a, 0x99, 0xb8, 0x14, 0x99, 0x14, 0xfd, 0xb6, 0xda, 0x4a, 0x83, 0xec, 0x09, 0x74, 0xce, 0x3c, + 0x5f, 0xe4, 0xe3, 0xd4, 0xcb, 0xbc, 0x69, 0xdf, 0xae, 0x16, 0x7a, 0x86, 0xe8, 0x63, 0xc4, 0x4a, + 0x0e, 0x67, 0x25, 0xc0, 0x3e, 0x87, 0x15, 0x82, 0xe4, 0xf8, 0x2c, 0x8c, 0x72, 0x91, 0xf5, 0x1d, + 0x9a, 0xb3, 0x4a, 0x73, 0x08, 0x33, 0xca, 0x84, 0xe0, 0x5d, 0xc5, 0xa4, 0x30, 0xec, 0xc7, 0x00, + 0x62, 0x9e, 0x7a, 0x71, 0x30, 0xf6, 0xa2, 0xa8, 0x0f, 0x74, 0x06, 0x47, 0x61, 0xb6, 0xa3, 0x88, + 0xbd, 0x83, 0xe7, 0xf3, 0x82, 0x71, 0x2e, 0xfb, 0x2b, 0xeb, 0xc6, 0x46, 0x93, 0x5b, 0x08, 0x8e, + 0x24, 0xca, 0xd5, 0xf7, 0xfc, 0x73, 0xd1, 0x5f, 0x5d, 0x37, 0x36, 0x5a, 0x5c, 0x01, 0xee, 0x16, + 0x38, 0x64, 0x27, 0x24, 0x87, 0x8f, 0xc0, 0xba, 0x44, 0x40, 0x99, 0x53, 0x67, 0x6b, 0x05, 0x0f, + 0x52, 0x9a, 0x12, 0xd7, 0x44, 0xf7, 0x2e, 0xd8, 0xfb, 0x5e, 0x3c, 0x29, 0xec, 0x0f, 0x15, 0x44, + 0x13, 0x1c, 0x4e, 0x63, 0xf7, 0xd7, 0x26, 0x58, 0x5c, 0xc8, 0x59, 0x94, 0xb3, 0xfb, 0x00, 0x28, + 0xfe, 0xa9, 0x97, 0x67, 0xe1, 0x5c, 0xaf, 0x5a, 0x29, 0xc0, 0x99, 0x85, 0xc1, 0x01, 0x91, 0xd8, + 0x13, 0xe8, 0xd2, 0xea, 0x05, 0xab, 0x59, 0x1d, 0xa0, 0x3c, 0x1f, 0xef, 0x10, 0x8b, 0x9e, 0x71, + 0x07, 0x2c, 0xd2, 0xb8, 0xb2, 0xba, 0x15, 0xae, 0x21, 0xf6, 0x11, 0xac, 0x86, 0x71, 0x8e, 0x1a, + 0xf1, 0xf3, 0x71, 0x20, 0x64, 0x61, 0x12, 0x2b, 0x25, 0x76, 0x57, 0xc8, 0x9c, 0x7d, 0x06, 0x4a, + 0xac, 0xc5, 0x86, 0x2d, 0xda, 0x70, 0xb5, 0x54, 0x97, 0x54, 0x3b, 0x12, 0x8f, 0xde, 0xf1, 0x11, + 0x74, 0xf0, 0x7e, 0xc5, 0x0c, 0x8b, 0x66, 0x74, 0xe9, 0x36, 0x5a, 0x1c, 0x1c, 0x90, 0x41, 0xb3, + 0xa3, 0x68, 0xd0, 0xec, 0x94, 0x99, 0xd0, 0xd8, 0x1d, 0x40, 0xeb, 0x28, 0x0b, 0x44, 0x76, 0xad, + 0xe5, 0x33, 0x68, 0x06, 0x42, 0xfa, 0xf4, 0x28, 0x6d, 0x4e, 0xe3, 0xea, 0x35, 0x34, 0x6a, 0xaf, + 0xc1, 0xfd, 0x1b, 0x03, 0x3a, 0xc3, 0x24, 0xcb, 0x0f, 0x84, 0x94, 0xde, 0x44, 0xb0, 0x7b, 0xd0, + 0x4a, 0x70, 0x59, 0x2d, 0x61, 0x07, 0xcf, 0x44, 0xfb, 0x70, 0x85, 0x5f, 0xd2, 0x83, 0xf9, 0x7a, + 0x3d, 0xa0, 0x95, 0xd0, 0x3b, 0x6a, 0x68, 0x2b, 0xa1, 0x57, 0x74, 0x07, 0xac, 0xe4, 0xec, 0x4c, + 0x0a, 0x25, 0xcb, 0x16, 0xd7, 0xd0, 0x6b, 0x8d, 0xcd, 0xfd, 0x2d, 0x00, 0x3c, 0xdf, 0xf7, 0xb4, + 0x02, 0xf7, 0x1c, 0x3a, 0xdc, 0x3b, 0xcb, 0x77, 0x92, 0x38, 0x17, 0xf3, 0x9c, 0xad, 0x82, 0x19, + 0x06, 0x24, 0x22, 0x8b, 0x9b, 0x61, 0x80, 0x87, 0x9b, 0x64, 0xc9, 0x2c, 0x25, 0x09, 0xad, 0x70, + 0x05, 0x90, 0x28, 0x83, 0x20, 0xa3, 0x13, 0xa3, 0x28, 0x83, 0x20, 0x63, 0xf7, 0xa0, 0x23, 0x63, + 0x2f, 0x95, 0xe7, 0x49, 0x8e, 0x87, 0x6b, 0xd2, 0xe1, 0xa0, 0x40, 0x8d, 0xa4, 0xfb, 0xaf, 0x06, + 0x58, 0x07, 0x62, 0x7a, 0x2a, 0xb2, 0x57, 0x76, 0x79, 0x17, 0x6c, 0x5a, 0x78, 0x1c, 0x06, 0x7a, + 0xa3, 0x36, 0xc1, 0x7b, 0xc1, 0xb5, 0x5b, 0xdd, 0x01, 0x2b, 0x12, 0x1e, 0x0a, 0x5f, 0xd9, 0x99, + 0x86, 0x50, 0x36, 0xde, 0x74, 0x1c, 0x08, 0x2f, 0x20, 0xc7, 0x63, 0x73, 0xcb, 0x9b, 0xee, 0x0a, + 0x2f, 0xc0, 0xb3, 0x45, 0x9e, 0xcc, 0xc7, 0xb3, 0x34, 0xf0, 0x72, 0x41, 0x0e, 0xa7, 0x89, 0x86, + 0x23, 0xf3, 0x13, 0xc2, 0xb0, 0x07, 0x70, 0xcb, 0x8f, 0x66, 0x12, 0xbd, 0x5d, 0x18, 0x9f, 0x25, + 0xe3, 0x24, 0x8e, 0xae, 0x48, 0xbe, 0x36, 0xbf, 0xa9, 0x09, 0x7b, 0xf1, 0x59, 0x72, 0x14, 0x47, + 0x57, 0xee, 0x3f, 0x99, 0xd0, 0x7a, 0x4e, 0x62, 0x78, 0x02, 0xed, 0x29, 0x5d, 0xa8, 0x78, 0xbd, + 0x77, 0x50, 0xc2, 0x44, 0xdb, 0x54, 0x37, 0x95, 0x83, 0x38, 0xcf, 0xae, 0x78, 0xc1, 0x86, 0x33, + 0x72, 0xef, 0x34, 0x12, 0xb9, 0xd4, 0x16, 0x51, 0x9b, 0x31, 0x52, 0x04, 0x3d, 0x43, 0xb3, 0x2d, + 0x8b, 0xb5, 0xb1, 0x2c, 0x56, 0xb6, 0x06, 0xb6, 0x7f, 0x2e, 0xfc, 0x0b, 0x39, 0x9b, 0x6a, 0xa1, + 0x97, 0xf0, 0xda, 0x33, 0xe8, 0xd6, 0xcf, 0x81, 0x91, 0xe9, 0x42, 0x5c, 0x91, 0xe0, 0x9b, 0x1c, + 0x87, 0x6c, 0x1d, 0x5a, 0xf4, 0xc2, 0x49, 0xec, 0x9d, 0x2d, 0xc0, 0xe3, 0xa8, 0x29, 0x5c, 0x11, + 0x7e, 0x66, 0xfe, 0xd4, 0xc0, 0x75, 0xea, 0xa7, 0xab, 0xaf, 0xe3, 0xbc, 0x7e, 0x1d, 0x35, 0xa5, + 0xb6, 0x8e, 0xfb, 0xfb, 0x00, 0x03, 0x74, 0x09, 0x69, 0x16, 0x4a, 0x81, 0x6a, 0x14, 0x71, 0x1e, + 0xe6, 0xc5, 0x42, 0x1a, 0xc2, 0x1b, 0x4d, 0xbd, 0xf9, 0x61, 0x12, 0x08, 0x49, 0xcb, 0x35, 0x79, + 0x09, 0x23, 0x4d, 0xcc, 0xd3, 0x30, 0xbb, 0x1a, 0x29, 0x59, 0x34, 0x78, 0x09, 0xbb, 0x7f, 0xdf, + 0x80, 0xee, 0xd7, 0x22, 0x4b, 0x8e, 0xb3, 0x24, 0x4d, 0xa4, 0x17, 0xb1, 0xed, 0x45, 0xd9, 0x29, + 0x1d, 0xad, 0xe3, 0xd1, 0xea, 0x6c, 0x9b, 0xc3, 0x52, 0x98, 0x4a, 0xf6, 0x75, 0xe9, 0xba, 0x60, + 0x29, 0xdd, 0x5d, 0x23, 0x20, 0x4d, 0x41, 0x1e, 0xa5, 0x2d, 0x3a, 0xd1, 0xe2, 0xe5, 0x35, 0x85, + 0xdd, 0x05, 0x98, 0x7a, 0xf3, 0x7d, 0xe1, 0x49, 0xb1, 0x17, 0x14, 0x8f, 0xa3, 0xc2, 0xe8, 0x3b, + 0x8f, 0xe6, 0xf1, 0x48, 0x92, 0xed, 0xaa, 0x3b, 0x13, 0xcc, 0x7e, 0x04, 0xce, 0xd4, 0x9b, 0xe3, + 0x2b, 0xdd, 0x0b, 0xb4, 0xed, 0x56, 0x08, 0xf6, 0x3e, 0x34, 0xf2, 0x79, 0x4c, 0x2e, 0x0f, 0x63, + 0x1f, 0x26, 0x36, 0xa3, 0x79, 0xac, 0xdf, 0x33, 0x47, 0x5a, 0xa1, 0x2e, 0xbb, 0x52, 0x57, 0x0f, + 0x1a, 0x7e, 0x18, 0x50, 0xf0, 0x73, 0x38, 0x0e, 0xd9, 0x26, 0x80, 0x28, 0x55, 0x43, 0x31, 0x4e, + 0xbb, 0xe6, 0x4a, 0x61, 0xbc, 0xc6, 0xb1, 0xf6, 0xbb, 0x70, 0x73, 0x49, 0x6e, 0x75, 0xab, 0x58, + 0x51, 0xdb, 0xdc, 0xae, 0x5b, 0x45, 0xb3, 0x6e, 0x09, 0x7f, 0xd5, 0x84, 0x9b, 0xda, 0x34, 0xcf, + 0xc3, 0x74, 0x98, 0xe3, 0x23, 0xec, 0x43, 0x9b, 0x7c, 0x9f, 0xc8, 0xb4, 0x85, 0x16, 0x20, 0xfb, + 0x6d, 0xb0, 0xc8, 0x1f, 0x14, 0xaf, 0xe6, 0x5e, 0xa5, 0x85, 0x72, 0xba, 0x7a, 0x45, 0x5a, 0x85, + 0x9a, 0x9d, 0xfd, 0x04, 0x5a, 0xdf, 0x88, 0x2c, 0x51, 0xbe, 0xbc, 0xb3, 0x75, 0xf7, 0xba, 0x79, + 0x68, 0x0b, 0x7a, 0x9a, 0x62, 0xfe, 0x01, 0x95, 0xf5, 0x21, 0x7a, 0xef, 0x69, 0x72, 0x29, 0x82, + 0x7e, 0x9b, 0x4e, 0x54, 0xb7, 0xa7, 0x82, 0x54, 0x68, 0xc7, 0xae, 0xb4, 0xf3, 0x29, 0xdc, 0xaa, + 0x64, 0x3f, 0x88, 0xd1, 0xa6, 0x94, 0xf6, 0x6c, 0xfe, 0x2a, 0xe1, 0x7b, 0xeb, 0x72, 0x17, 0x3a, + 0x35, 0xe1, 0x5d, 0xa3, 0xc7, 0x7b, 0x8b, 0xaf, 0xdb, 0x29, 0x9d, 0x56, 0xdd, 0x49, 0xec, 0x02, + 0x54, 0xa2, 0xfc, 0xff, 0xba, 0x1a, 0xf7, 0x8f, 0x0d, 0xb8, 0xb9, 0x93, 0xc4, 0xb1, 0xa0, 0x24, + 0x50, 0x19, 0x46, 0xf5, 0x08, 0x8d, 0xd7, 0x3e, 0xc2, 0x4f, 0xa0, 0x25, 0x91, 0x59, 0xaf, 0xfe, + 0xd6, 0x35, 0x9a, 0xe6, 0x8a, 0x03, 0x5d, 0xea, 0xd4, 0x9b, 0x8f, 0x53, 0x11, 0x07, 0x61, 0x3c, + 0x29, 0x5c, 0xea, 0xd4, 0x9b, 0x1f, 0x2b, 0x8c, 0xfb, 0xb7, 0x06, 0x58, 0xea, 0xfd, 0x2e, 0x44, + 0x26, 0x63, 0x31, 0x32, 0xfd, 0x08, 0x9c, 0x34, 0x13, 0x41, 0xe8, 0x17, 0xbb, 0x3a, 0xbc, 0x42, + 0xa0, 0xe9, 0x9f, 0x25, 0x99, 0x2f, 0x68, 0x79, 0x9b, 0x2b, 0x00, 0xb1, 0x32, 0xf5, 0x7c, 0x95, + 0xc8, 0x36, 0xb8, 0x02, 0xd0, 0x11, 0x2a, 0xd5, 0x93, 0xca, 0x6d, 0xae, 0x21, 0xcc, 0xc0, 0x29, + 0xd6, 0x53, 0x34, 0x52, 0xda, 0xb6, 0x11, 0x41, 0x61, 0xe8, 0x1f, 0x4c, 0xe8, 0xee, 0x86, 0x99, + 0xf0, 0x73, 0x11, 0x0c, 0x82, 0xc9, 0xb2, 0x3b, 0xb5, 0x4a, 0x77, 0x5a, 0xe4, 0x3d, 0xe6, 0x62, + 0xc6, 0xaf, 0x74, 0xd1, 0xa0, 0x22, 0x45, 0x01, 0x6c, 0x0b, 0x40, 0x65, 0x84, 0x54, 0xa8, 0x34, + 0x5f, 0x5f, 0xa8, 0x38, 0xc4, 0x86, 0x43, 0x14, 0x90, 0x9a, 0x13, 0xaa, 0xa0, 0x6b, 0x51, 0x15, + 0x33, 0xc3, 0x67, 0x42, 0x89, 0xd4, 0xa9, 0x88, 0xe8, 0x19, 0x50, 0x22, 0x75, 0x2a, 0xa2, 0x32, + 0x7d, 0x6d, 0xab, 0xe3, 0xe0, 0x98, 0x7d, 0x00, 0x66, 0x92, 0xd2, 0xe5, 0xf5, 0x86, 0xf5, 0x8b, + 0x6d, 0x1e, 0xa5, 0xdc, 0x4c, 0x52, 0xb4, 0x02, 0x95, 0x95, 0xf7, 0x1d, 0xfd, 0x74, 0xd0, 0xd7, + 0x51, 0xe6, 0xc8, 0x35, 0xc5, 0xbd, 0x03, 0xe6, 0x51, 0xca, 0xda, 0xd0, 0x18, 0x0e, 0x46, 0xbd, + 0x1b, 0x38, 0xd8, 0x1d, 0xec, 0xf7, 0x0c, 0xf7, 0x7f, 0x4c, 0x70, 0x0e, 0x66, 0xb9, 0x87, 0x36, + 0x25, 0xdf, 0xa4, 0xd4, 0x77, 0xc1, 0x96, 0xb9, 0x97, 0x51, 0xbc, 0x50, 0x4e, 0xab, 0x4d, 0xf0, + 0x48, 0xb2, 0x8f, 0xa1, 0x25, 0x82, 0x89, 0x28, 0x7c, 0x49, 0x6f, 0xf9, 0x9c, 0x5c, 0x91, 0xd9, + 0x06, 0x58, 0xd2, 0x3f, 0x17, 0x53, 0xaf, 0xdf, 0xac, 0x18, 0x87, 0x84, 0x51, 0xd9, 0x06, 0xd7, + 0x74, 0xb6, 0x05, 0x6f, 0x87, 0x93, 0x38, 0xc9, 0xc4, 0x38, 0x8c, 0x03, 0x31, 0x1f, 0xfb, 0x49, + 0x7c, 0x16, 0x85, 0x7e, 0xae, 0xb3, 0x97, 0xb7, 0x14, 0x71, 0x0f, 0x69, 0x3b, 0x9a, 0xc4, 0x3e, + 0x84, 0x16, 0x6a, 0x47, 0xea, 0x5c, 0x98, 0x9e, 0x35, 0x2a, 0x42, 0x2f, 0xad, 0x88, 0xec, 0x11, + 0xb4, 0x83, 0x2c, 0x49, 0xc7, 0x49, 0x4a, 0x72, 0x5e, 0xdd, 0xba, 0x4d, 0xef, 0xa1, 0x90, 0xc0, + 0xe6, 0x6e, 0x96, 0xa4, 0x47, 0x29, 0xb7, 0x02, 0xfa, 0xc5, 0x02, 0x87, 0xd8, 0x95, 0x4d, 0x28, + 0xbf, 0xe3, 0x20, 0x86, 0x0a, 0x01, 0xf7, 0x31, 0x58, 0x6a, 0x02, 0xb3, 0xa1, 0x79, 0x78, 0x74, + 0x38, 0x50, 0xa2, 0xdd, 0xde, 0xdf, 0xef, 0x19, 0x88, 0xda, 0xdd, 0x1e, 0x6d, 0xf7, 0x4c, 0x1c, + 0x8d, 0x7e, 0x79, 0x3c, 0xe8, 0x35, 0xdc, 0xbf, 0x34, 0xc0, 0x2e, 0xa2, 0x03, 0xfb, 0x04, 0xdd, + 0x3a, 0x45, 0x23, 0xfd, 0x7c, 0xa9, 0x40, 0xab, 0x25, 0x9d, 0xbc, 0xa0, 0xa3, 0xc5, 0x90, 0x24, + 0x8a, 0x78, 0x41, 0x40, 0x3d, 0xe5, 0x6d, 0x2c, 0xd4, 0x57, 0x98, 0xbd, 0x27, 0xb1, 0xd0, 0x59, + 0x20, 0x8d, 0x49, 0x81, 0x61, 0xec, 0x0b, 0xe4, 0x6e, 0x69, 0x05, 0x22, 0x3c, 0x92, 0xee, 0x5f, + 0x9b, 0x60, 0x97, 0xb9, 0xc1, 0x43, 0x70, 0xa6, 0x85, 0x38, 0xb4, 0xcf, 0x58, 0x59, 0x90, 0x11, + 0xaf, 0xe8, 0xec, 0x0e, 0x98, 0x17, 0x97, 0x5a, 0x9d, 0x16, 0x72, 0xbd, 0x78, 0xc9, 0xcd, 0x8b, + 0xcb, 0xca, 0xe9, 0xb4, 0xbe, 0xd3, 0xe9, 0xdc, 0x87, 0x9b, 0x7e, 0x24, 0xbc, 0x78, 0x5c, 0xf9, + 0x0c, 0xf5, 0x2c, 0x56, 0x09, 0x7d, 0x5c, 0x3a, 0x0e, 0xed, 0x38, 0xdb, 0x55, 0xb0, 0xfe, 0x08, + 0x5a, 0x81, 0x88, 0x72, 0xaf, 0x5e, 0xdf, 0x1e, 0x65, 0x9e, 0x1f, 0x89, 0x5d, 0x44, 0x73, 0x45, + 0x65, 0x1b, 0x60, 0x17, 0x89, 0x8b, 0xae, 0x6a, 0xa9, 0x50, 0x2a, 0xf4, 0xc0, 0x4b, 0x6a, 0x25, + 0x66, 0xa8, 0x89, 0xd9, 0xfd, 0x0c, 0x1a, 0x2f, 0x5e, 0x0e, 0xf5, 0x5d, 0x8d, 0x57, 0xee, 0x5a, + 0x08, 0xdb, 0xac, 0x84, 0xed, 0xfe, 0x6f, 0x03, 0xda, 0xda, 0x37, 0xe0, 0xb9, 0x67, 0x65, 0x52, + 0x8f, 0xc3, 0xc5, 0xe8, 0x5f, 0x3a, 0x99, 0x7a, 0x2f, 0xa4, 0xf1, 0xdd, 0xbd, 0x10, 0xf6, 0x33, + 0xe8, 0xa6, 0x8a, 0x56, 0x77, 0x4b, 0xef, 0xd4, 0xe7, 0xe8, 0x5f, 0x9a, 0xd7, 0x49, 0x2b, 0x00, + 0x8d, 0x81, 0xca, 0xc7, 0xdc, 0x9b, 0x90, 0x8a, 0xba, 0xbc, 0x8d, 0xf0, 0xc8, 0x9b, 0xbc, 0xc6, + 0x39, 0xfd, 0x06, 0x3e, 0x06, 0x8b, 0x97, 0x24, 0xed, 0x77, 0xc9, 0x6f, 0xa0, 0x5f, 0xaa, 0xbb, + 0x8c, 0x95, 0x45, 0x97, 0xf1, 0x1e, 0x38, 0x7e, 0x32, 0x9d, 0x86, 0x44, 0x5b, 0xd5, 0xc9, 0x39, + 0x21, 0x46, 0xd2, 0xfd, 0x53, 0x03, 0xda, 0xfa, 0xb6, 0xac, 0x03, 0xed, 0xdd, 0xc1, 0xb3, 0xed, + 0x93, 0x7d, 0xf4, 0x5a, 0x00, 0xd6, 0xd3, 0xbd, 0xc3, 0x6d, 0xfe, 0xcb, 0x9e, 0x81, 0xcf, 0x6c, + 0xef, 0x70, 0xd4, 0x33, 0x99, 0x03, 0xad, 0x67, 0xfb, 0x47, 0xdb, 0xa3, 0x5e, 0x03, 0xdf, 0xd9, + 0xd3, 0xa3, 0xa3, 0xfd, 0x5e, 0x93, 0x75, 0xc1, 0xde, 0xdd, 0x1e, 0x0d, 0x46, 0x7b, 0x07, 0x83, + 0x5e, 0x0b, 0x79, 0x9f, 0x0f, 0x8e, 0x7a, 0x16, 0x0e, 0x4e, 0xf6, 0x76, 0x7b, 0x6d, 0xa4, 0x1f, + 0x6f, 0x0f, 0x87, 0x5f, 0x1d, 0xf1, 0xdd, 0x9e, 0x8d, 0xeb, 0x0e, 0x47, 0x7c, 0xef, 0xf0, 0x79, + 0xcf, 0xc1, 0xf1, 0xd1, 0xd3, 0x2f, 0x07, 0x3b, 0xa3, 0x1e, 0xb8, 0x9f, 0x41, 0xa7, 0x26, 0x41, + 0x9c, 0xcd, 0x07, 0xcf, 0x7a, 0x37, 0x70, 0xcb, 0x97, 0xdb, 0xfb, 0x27, 0x83, 0x9e, 0xc1, 0x56, + 0x01, 0x68, 0x38, 0xde, 0xdf, 0x3e, 0x7c, 0xde, 0x33, 0xdd, 0x5f, 0x80, 0x7d, 0x12, 0x06, 0x4f, + 0xa3, 0xc4, 0xbf, 0x40, 0xc3, 0x38, 0xf5, 0xa4, 0xd0, 0xa1, 0x9e, 0xc6, 0x18, 0x8b, 0xc8, 0x28, + 0xa5, 0xd6, 0xbd, 0x86, 0x50, 0x56, 0xf1, 0x6c, 0x3a, 0xa6, 0xfe, 0x59, 0x43, 0x79, 0xde, 0x78, + 0x36, 0x3d, 0x09, 0x03, 0xe9, 0x1e, 0x42, 0xfb, 0x24, 0x0c, 0x8e, 0x3d, 0xff, 0x02, 0xdd, 0xd1, + 0x29, 0x2e, 0x3d, 0x96, 0xe1, 0x37, 0x42, 0x7b, 0x68, 0x87, 0x30, 0xc3, 0xf0, 0x1b, 0xc1, 0x3e, + 0x04, 0x8b, 0x80, 0x22, 0x1b, 0x24, 0x33, 0x2f, 0x8e, 0xc3, 0x35, 0xcd, 0xfd, 0x73, 0xa3, 0xbc, + 0x16, 0xb5, 0x4d, 0xee, 0x41, 0x33, 0xf5, 0xfc, 0x0b, 0xed, 0x83, 0x3a, 0x7a, 0x0e, 0xee, 0xc7, + 0x89, 0xc0, 0xee, 0x83, 0xad, 0x6d, 0xa7, 0x58, 0xb8, 0x53, 0x33, 0x32, 0x5e, 0x12, 0x17, 0xb5, + 0xda, 0x58, 0xd4, 0x2a, 0xde, 0x5c, 0xa6, 0x51, 0x48, 0x15, 0x70, 0x03, 0x7d, 0x95, 0x82, 0xdc, + 0x9f, 0x00, 0x54, 0x3d, 0xa9, 0x6b, 0x0a, 0xa8, 0xdb, 0xd0, 0xf2, 0xa2, 0x50, 0x0b, 0xcc, 0xe1, + 0x0a, 0x70, 0x0f, 0xa1, 0x53, 0xeb, 0x64, 0xa1, 0xf8, 0xbc, 0x28, 0x1a, 0x5f, 0x88, 0x2b, 0x49, + 0x73, 0x6d, 0xde, 0xf6, 0xa2, 0xe8, 0x85, 0xb8, 0x92, 0x18, 0x17, 0x54, 0x13, 0xcc, 0x5c, 0xea, + 0xaa, 0xd0, 0x54, 0xae, 0x88, 0xee, 0xa7, 0x60, 0xa9, 0x56, 0x4b, 0xcd, 0xd2, 0x8d, 0xd7, 0x46, + 0xd3, 0x2f, 0xf4, 0x99, 0xa9, 0x31, 0xc3, 0x1e, 0xea, 0x66, 0x9b, 0x54, 0xad, 0x3d, 0xa3, 0xca, + 0x5f, 0x15, 0x93, 0xee, 0xb3, 0x11, 0xb3, 0xbb, 0x0b, 0xf6, 0x1b, 0xdb, 0x97, 0x5a, 0x00, 0x66, + 0x25, 0x80, 0x6b, 0x1a, 0x9a, 0xee, 0xaf, 0x00, 0xaa, 0xa6, 0x9c, 0x7e, 0x78, 0x6a, 0x15, 0x7c, + 0x78, 0x0f, 0xb0, 0xf2, 0x0d, 0xa3, 0x20, 0x13, 0xf1, 0xc2, 0xad, 0xab, 0x36, 0x5e, 0x49, 0x67, + 0xeb, 0xd0, 0xa4, 0x5e, 0x63, 0xa3, 0x72, 0x8c, 0x65, 0xa3, 0x91, 0x28, 0xee, 0x1c, 0x56, 0x54, + 0x90, 0xe6, 0xe2, 0x0f, 0x67, 0x42, 0xbe, 0x31, 0xf5, 0xbb, 0x0b, 0x50, 0xba, 0xf1, 0xa2, 0x6b, + 0x5a, 0xc3, 0xa0, 0x11, 0x9c, 0x85, 0x22, 0x0a, 0x8a, 0xdb, 0x68, 0x08, 0x95, 0xac, 0x82, 0x77, + 0x53, 0xb5, 0x96, 0x08, 0x70, 0x7f, 0x07, 0xba, 0xc5, 0xce, 0xd4, 0xbb, 0x79, 0x58, 0x26, 0x10, + 0x4a, 0xc6, 0xaa, 0xa8, 0x53, 0x2c, 0x58, 0x05, 0x3f, 0x35, 0xfb, 0x46, 0x91, 0x43, 0xb8, 0xff, + 0xd1, 0x28, 0x66, 0xeb, 0x56, 0xc6, 0x42, 0x5a, 0x6a, 0x2c, 0xa7, 0xa5, 0x8b, 0x29, 0x9e, 0xf9, + 0x1b, 0xa5, 0x78, 0x3f, 0x05, 0x27, 0xa0, 0x3c, 0x27, 0xbc, 0x2c, 0x5c, 0xf6, 0xda, 0x72, 0x4e, + 0xa3, 0x33, 0xa1, 0xf0, 0x52, 0xf0, 0x8a, 0x19, 0xcf, 0x92, 0x27, 0x17, 0x22, 0x0e, 0xbf, 0xa1, + 0x5e, 0x0d, 0xde, 0xb9, 0x42, 0x54, 0x8d, 0x2f, 0x95, 0xee, 0xe8, 0xc6, 0x57, 0xd1, 0xc3, 0xb3, + 0xaa, 0x1e, 0x1e, 0xca, 0x73, 0x96, 0x4a, 0x91, 0xe5, 0x45, 0x82, 0xac, 0xa0, 0x32, 0x97, 0x74, 0x34, 0x2f, 0xe6, 0x92, 0xef, 0x43, 0x37, 0x4e, 0xe2, 0x71, 0x3c, 0x8b, 0x22, 0x4c, 0xe1, 0x75, - 0xc3, 0xb3, 0x13, 0x27, 0xf1, 0xa1, 0x46, 0xb1, 0x07, 0x70, 0xab, 0xca, 0xa2, 0xec, 0xb9, 0xa3, - 0xfa, 0x25, 0x15, 0x3e, 0xb2, 0xfa, 0x0d, 0xe8, 0x25, 0xa7, 0xbf, 0x12, 0x7e, 0x4e, 0x12, 0x1b, - 0x93, 0x21, 0x77, 0x55, 0xe0, 0x56, 0x78, 0x14, 0xd1, 0xa1, 0x37, 0x15, 0xee, 0x17, 0xe0, 0x2c, - 0x84, 0x50, 0x49, 0x94, 0x1c, 0x68, 0xed, 0x1d, 0xee, 0x0e, 0xfe, 0xa0, 0x67, 0xa0, 0x97, 0xe7, - 0x83, 0x97, 0x03, 0x3e, 0x1c, 0xf4, 0x4c, 0xf4, 0xc0, 0xbb, 0x83, 0xfd, 0xc1, 0x68, 0xd0, 0x6b, - 0x7c, 0xd9, 0xb4, 0xdb, 0x3d, 0x9b, 0xdb, 0x62, 0x9e, 0x46, 0xa1, 0x1f, 0xe6, 0xee, 0x10, 0xa0, - 0xcc, 0xe9, 0xd0, 0xdf, 0x94, 0x7b, 0x2b, 0x8d, 0xda, 0xb9, 0xde, 0x15, 0xb3, 0x4d, 0x6d, 0x6a, - 0xe6, 0xeb, 0xb2, 0x4d, 0x45, 0x77, 0x4f, 0xc0, 0x3e, 0xf0, 0xd2, 0x57, 0xaa, 0xb3, 0xee, 0xa2, - 0x62, 0x9f, 0xe9, 0xfe, 0x95, 0x0e, 0xdf, 0x1f, 0x41, 0x5b, 0xbb, 0x3c, 0xfd, 0x6a, 0x6a, 0xee, - 0xb0, 0xa0, 0xb9, 0x7f, 0x6a, 0xc0, 0xed, 0x83, 0xe4, 0x52, 0x2c, 0x32, 0x98, 0x63, 0xef, 0x2a, - 0x4a, 0xbc, 0xe0, 0x3b, 0x0c, 0xf1, 0xc7, 0x00, 0x32, 0x99, 0x65, 0xbe, 0x18, 0x4f, 0x16, 0x6d, - 0x33, 0x47, 0x61, 0x9e, 0xeb, 0x0e, 0xbd, 0x90, 0x39, 0x11, 0x75, 0xa0, 0x40, 0x18, 0x49, 0x6f, - 0x83, 0x95, 0xcf, 0xe3, 0xb2, 0x4b, 0xd7, 0xca, 0xb1, 0x90, 0x76, 0x77, 0xc0, 0x19, 0xcd, 0xa9, - 0x60, 0x9c, 0xc9, 0x5a, 0x4c, 0x36, 0xde, 0x10, 0x93, 0xcd, 0xa5, 0x98, 0xfc, 0x5f, 0x06, 0x74, - 0x2a, 0xa9, 0x15, 0x7b, 0x1f, 0x9a, 0xf9, 0x3c, 0xae, 0xb7, 0xb7, 0x8b, 0x4d, 0x38, 0x91, 0xd0, - 0xde, 0xb0, 0x9a, 0xf4, 0xa4, 0x0c, 0x27, 0xb1, 0x08, 0xf4, 0x92, 0x58, 0x61, 0x6e, 0x6b, 0x14, - 0xdb, 0x87, 0x9b, 0xca, 0x93, 0x14, 0xad, 0xad, 0xa2, 0x86, 0xf8, 0x60, 0x29, 0x95, 0x53, 0x45, - 0xf5, 0x4e, 0xc1, 0xa5, 0x9a, 0x0c, 0xab, 0x93, 0x1a, 0x72, 0x6d, 0x1b, 0xde, 0xba, 0x86, 0xed, - 0x7b, 0x75, 0x53, 0xee, 0xc1, 0xca, 0x68, 0x1e, 0x8f, 0xc2, 0xa9, 0x90, 0xb9, 0x37, 0x4d, 0x29, - 0xa7, 0xd1, 0x91, 0xa0, 0xc9, 0xcd, 0x5c, 0xba, 0x1f, 0x43, 0xf7, 0x58, 0x88, 0x8c, 0x0b, 0x99, - 0x26, 0xb1, 0x8a, 0xe7, 0x92, 0x2e, 0xad, 0xc3, 0x8e, 0x86, 0xdc, 0x3f, 0x04, 0x07, 0x13, 0xf9, - 0xa7, 0x5e, 0xee, 0x9f, 0x7f, 0x9f, 0x44, 0xff, 0x63, 0x68, 0xa7, 0xca, 0x4c, 0x74, 0xee, 0xdd, - 0x25, 0x1f, 0xa7, 0x4d, 0x87, 0x17, 0x44, 0x97, 0x43, 0xe3, 0x70, 0x36, 0xad, 0x7e, 0x93, 0x6a, - 0xaa, 0x6f, 0x52, 0xb5, 0xd2, 0xd8, 0xac, 0x97, 0xc6, 0x68, 0x79, 0x67, 0x49, 0xf6, 0xc7, 0x5e, - 0x16, 0x88, 0x40, 0xd7, 0xdf, 0x25, 0xc2, 0xfd, 0x1a, 0x3a, 0x85, 0x66, 0xf6, 0x02, 0xfa, 0xec, - 0x44, 0xa6, 0xb1, 0x17, 0xd4, 0x2c, 0x45, 0xd5, 0xaf, 0x22, 0x0e, 0xf6, 0x0a, 0x95, 0x2a, 0xa0, - 0xbe, 0xb3, 0xee, 0xe6, 0x2c, 0x8a, 0xf2, 0x67, 0xd0, 0x2d, 0xf2, 0xed, 0x03, 0x91, 0x7b, 0x64, - 0x6c, 0x51, 0x28, 0xe2, 0x8a, 0x21, 0xda, 0x0a, 0x31, 0x92, 0x6f, 0xe8, 0x1b, 0xbb, 0x9b, 0x60, - 0x69, 0x4b, 0x66, 0xd0, 0xf4, 0x93, 0x40, 0x3d, 0xa0, 0x16, 0xa7, 0x31, 0x8a, 0x63, 0x2a, 0x27, - 0x45, 0xf0, 0x9c, 0xca, 0x89, 0xfb, 0x4f, 0x26, 0xac, 0x3c, 0xf5, 0xfc, 0x8b, 0x59, 0x5a, 0x44, - 0xaf, 0x4a, 0xd1, 0x64, 0xd4, 0x8a, 0xa6, 0x6a, 0x81, 0x64, 0xd6, 0x0a, 0xa4, 0xda, 0x81, 0x1a, - 0xf5, 0x88, 0xf7, 0x0e, 0xb4, 0x67, 0x71, 0x38, 0x2f, 0x5e, 0x9d, 0xc3, 0x2d, 0x04, 0x47, 0x92, - 0xad, 0x43, 0x07, 0x1f, 0x66, 0x18, 0x53, 0xa9, 0x44, 0x02, 0x71, 0x78, 0x15, 0x85, 0x2f, 0xdd, + 0xbb, 0xb6, 0x13, 0x27, 0xf1, 0xa1, 0x46, 0xb1, 0x07, 0x70, 0xab, 0xce, 0xa2, 0xec, 0xb9, 0xa3, + 0xba, 0x3d, 0x35, 0x3e, 0xb2, 0xfa, 0x0d, 0xe8, 0x25, 0xa7, 0xbf, 0x12, 0x7e, 0x4e, 0x12, 0x1b, + 0x93, 0x21, 0x77, 0x55, 0xe0, 0x56, 0x78, 0x14, 0xd1, 0xa1, 0x37, 0x15, 0xee, 0x17, 0xe0, 0x94, + 0x42, 0xa8, 0x25, 0x4a, 0x0e, 0xb4, 0xf6, 0x0e, 0x77, 0x07, 0xbf, 0xd7, 0x33, 0xd0, 0xcb, 0xf3, + 0xc1, 0xcb, 0x01, 0x1f, 0x0e, 0x7a, 0x26, 0x7a, 0xe0, 0xdd, 0xc1, 0xfe, 0x60, 0x34, 0xe8, 0x35, + 0xbe, 0x6c, 0xda, 0xed, 0x9e, 0x4d, 0x9d, 0x8c, 0x28, 0xf4, 0xc3, 0xdc, 0x1d, 0x02, 0x54, 0x39, + 0x1d, 0xfa, 0x9b, 0x6a, 0x6f, 0xa5, 0x51, 0x3b, 0xd7, 0xbb, 0x62, 0xb6, 0xa9, 0x4d, 0xcd, 0x7c, + 0x5d, 0xb6, 0xa9, 0xe8, 0xee, 0x09, 0xd8, 0x07, 0x5e, 0xfa, 0x4a, 0x75, 0xd6, 0x2d, 0x3b, 0x02, + 0x33, 0xdd, 0x7d, 0xd3, 0xe1, 0xfb, 0x23, 0x68, 0x6b, 0x97, 0xa7, 0x5f, 0xcd, 0x82, 0x3b, 0x2c, + 0x68, 0xee, 0x9f, 0x18, 0x70, 0xfb, 0x20, 0xb9, 0x14, 0x65, 0x06, 0x73, 0xec, 0x5d, 0x45, 0x89, + 0x17, 0x7c, 0x87, 0x21, 0xfe, 0x18, 0x40, 0x26, 0xb3, 0xcc, 0x17, 0xe3, 0x49, 0xd9, 0xf4, 0x73, + 0x14, 0xe6, 0xb9, 0xfe, 0xbe, 0x20, 0x64, 0x4e, 0x44, 0x1d, 0x28, 0x10, 0x46, 0xd2, 0xdb, 0x60, + 0xe5, 0xf3, 0xb8, 0xea, 0x31, 0xb6, 0x72, 0x2c, 0xbc, 0xdd, 0x1d, 0x70, 0x46, 0x73, 0x2a, 0x18, + 0x67, 0x72, 0x21, 0x26, 0x1b, 0x6f, 0x88, 0xc9, 0xe6, 0x52, 0x4c, 0xfe, 0x6f, 0x03, 0x3a, 0xb5, + 0xd4, 0x8a, 0xbd, 0x0f, 0xcd, 0x7c, 0x1e, 0x2f, 0x36, 0xe7, 0x8b, 0x4d, 0x38, 0x91, 0xd0, 0xde, + 0xb0, 0x9a, 0xf4, 0xa4, 0x0c, 0x27, 0xb1, 0x08, 0xf4, 0x92, 0x58, 0x61, 0x6e, 0x6b, 0x14, 0xdb, + 0x87, 0x9b, 0xca, 0x93, 0x14, 0x8d, 0xb9, 0xa2, 0x86, 0xf8, 0x60, 0x29, 0x95, 0x53, 0x45, 0xf5, + 0x4e, 0xc1, 0xa5, 0x9a, 0x12, 0xab, 0x93, 0x05, 0xe4, 0xda, 0x36, 0xbc, 0x75, 0x0d, 0xdb, 0xf7, + 0xea, 0xbe, 0xdc, 0x83, 0x95, 0xd1, 0x3c, 0x1e, 0x85, 0x53, 0x21, 0x73, 0x6f, 0x9a, 0x52, 0x4e, + 0xa3, 0x23, 0x41, 0x93, 0x9b, 0xb9, 0x74, 0x3f, 0x86, 0xee, 0xb1, 0x10, 0x19, 0x17, 0x32, 0x4d, + 0x62, 0x15, 0xcf, 0x25, 0x5d, 0x5a, 0x87, 0x1d, 0x0d, 0xb9, 0x7f, 0x00, 0x0e, 0x26, 0xf2, 0x4f, + 0xbd, 0xdc, 0x3f, 0xff, 0x3e, 0x89, 0xfe, 0xc7, 0xd0, 0x4e, 0x95, 0x99, 0xe8, 0xdc, 0xbb, 0x4b, + 0x3e, 0x4e, 0x9b, 0x0e, 0x2f, 0x88, 0x2e, 0x87, 0xc6, 0xe1, 0x6c, 0x5a, 0xff, 0xa2, 0xd6, 0x54, + 0x5f, 0xd4, 0x16, 0x4a, 0x63, 0x73, 0xb1, 0x34, 0x46, 0xcb, 0x3b, 0x4b, 0xb2, 0x3f, 0xf2, 0xb2, + 0x40, 0x04, 0xba, 0xfe, 0xae, 0x10, 0xee, 0xd7, 0xd0, 0x29, 0x34, 0xb3, 0x17, 0xd0, 0x47, 0x33, + 0x32, 0x8d, 0xbd, 0x60, 0xc1, 0x52, 0x54, 0xfd, 0x2a, 0xe2, 0x60, 0xaf, 0x50, 0xa9, 0x02, 0x16, + 0x77, 0xd6, 0xdd, 0x9f, 0xb2, 0x28, 0x7f, 0x06, 0xdd, 0x22, 0xdf, 0x3e, 0x10, 0xb9, 0x47, 0xc6, + 0x16, 0x85, 0x22, 0xae, 0x19, 0xa2, 0xad, 0x10, 0x23, 0xf9, 0x86, 0xae, 0xb7, 0xbb, 0x09, 0x96, + 0xb6, 0x64, 0x06, 0x4d, 0x3f, 0x09, 0xd4, 0x03, 0x6a, 0x71, 0x1a, 0xa3, 0x38, 0xa6, 0x72, 0x52, + 0x04, 0xcf, 0xa9, 0x9c, 0xb8, 0xff, 0x6c, 0xc2, 0xca, 0x53, 0xcf, 0xbf, 0x98, 0xa5, 0x45, 0xf4, + 0xaa, 0x15, 0x4d, 0xc6, 0x42, 0xd1, 0x54, 0x2f, 0x90, 0xcc, 0x85, 0x02, 0x69, 0xe1, 0x40, 0x8d, + 0xc5, 0x88, 0xf7, 0x0e, 0xb4, 0x67, 0x71, 0x38, 0x2f, 0x5e, 0x9d, 0xc3, 0x2d, 0x04, 0x47, 0x92, + 0xad, 0x43, 0x07, 0x1f, 0x66, 0x18, 0x53, 0xa9, 0x44, 0x02, 0x71, 0x78, 0x1d, 0x85, 0x2f, 0xdd, 0xf3, 0x7d, 0x21, 0x25, 0xe6, 0x2d, 0x3a, 0xdd, 0x76, 0x14, 0xe6, 0x85, 0xb8, 0x22, 0x47, 0x20, - 0xfc, 0x4c, 0xe4, 0xe3, 0xb2, 0xec, 0x71, 0x14, 0x06, 0xc9, 0x1f, 0xc0, 0x8a, 0x14, 0x52, 0x86, + 0xfc, 0x4c, 0xe4, 0xe3, 0xaa, 0xec, 0x71, 0x14, 0x06, 0xc9, 0x1f, 0xc0, 0x8a, 0x14, 0x52, 0x86, 0x49, 0x3c, 0xa6, 0xc8, 0xa1, 0xab, 0xd3, 0xae, 0x46, 0x8e, 0x10, 0x87, 0x0a, 0xf7, 0xe2, 0x24, - 0xbe, 0x9a, 0x26, 0x33, 0xa9, 0x83, 0x41, 0x89, 0x58, 0x8a, 0xd6, 0xb0, 0x1c, 0xad, 0xdd, 0x1c, - 0x56, 0x06, 0xf3, 0x94, 0xbe, 0x3e, 0x7c, 0x67, 0xe4, 0xaf, 0x88, 0xd5, 0xac, 0x89, 0xb5, 0x22, - 0xa0, 0x06, 0xf5, 0x76, 0x0a, 0x01, 0x61, 0x2e, 0x90, 0x64, 0x53, 0x2f, 0x2f, 0x04, 0xa7, 0x20, - 0xf7, 0x2f, 0x4d, 0x70, 0x94, 0xca, 0xf0, 0x9a, 0x9f, 0x40, 0x93, 0x22, 0xb2, 0x41, 0xe1, 0xf5, - 0x6d, 0x7c, 0x38, 0x0b, 0xe2, 0xe6, 0x0b, 0x71, 0x45, 0x31, 0x99, 0x58, 0xae, 0xed, 0xe7, 0x68, - 0xef, 0xad, 0x92, 0x51, 0xf2, 0xde, 0xef, 0x81, 0xa3, 0x3c, 0x20, 0xe2, 0x75, 0x67, 0x9d, 0x10, - 0x27, 0x21, 0x7d, 0x96, 0xc8, 0x45, 0x36, 0xd5, 0xda, 0xa2, 0x71, 0x19, 0x8d, 0x2d, 0xf5, 0xad, - 0x84, 0x00, 0xf7, 0x1c, 0xda, 0x7a, 0x77, 0x8c, 0x5e, 0x27, 0x87, 0x2f, 0x0e, 0x8f, 0xbe, 0x3a, - 0xec, 0xdd, 0x58, 0x54, 0xfd, 0x46, 0x19, 0xdf, 0xcc, 0x6a, 0x7c, 0x6b, 0x20, 0x7e, 0xe7, 0xe8, - 0xe4, 0x70, 0xd4, 0x6b, 0xb2, 0x15, 0x70, 0x68, 0x38, 0xe6, 0x83, 0x97, 0xbd, 0x16, 0xd5, 0x21, - 0x3b, 0x3f, 0x1f, 0x1c, 0x6c, 0xf7, 0xac, 0x45, 0xcf, 0xa0, 0x8d, 0x71, 0xe4, 0x96, 0xba, 0x72, - 0x35, 0x6b, 0xaf, 0x7e, 0xae, 0x6e, 0xaa, 0xcf, 0xd5, 0x3f, 0x6c, 0xa2, 0xbe, 0xf5, 0xcf, 0x06, - 0x34, 0xd1, 0x67, 0xb1, 0x87, 0xe0, 0xfc, 0x5c, 0x78, 0x59, 0x7e, 0x2a, 0xbc, 0x9c, 0xd5, 0xfc, - 0xd3, 0x5a, 0x0d, 0x72, 0x6f, 0x3c, 0x31, 0xd8, 0xa6, 0xfa, 0x10, 0x55, 0x7c, 0x5f, 0x5b, 0x29, - 0x3c, 0x1f, 0x79, 0xc6, 0x65, 0xfe, 0x0d, 0xe2, 0xff, 0x32, 0x09, 0xe3, 0x1d, 0xf5, 0x75, 0x86, - 0x2d, 0x7b, 0xca, 0xe5, 0x19, 0xec, 0x11, 0x58, 0x7b, 0x12, 0x5d, 0xf2, 0xab, 0xac, 0x14, 0xf1, - 0xab, 0xde, 0xda, 0xbd, 0xb1, 0xf5, 0x0f, 0x0d, 0x68, 0x7e, 0x2d, 0xb2, 0x84, 0x7d, 0x0a, 0x6d, - 0xdd, 0x4d, 0x65, 0x95, 0xae, 0xe9, 0x1a, 0xa5, 0x7c, 0x4b, 0x6d, 0x56, 0xda, 0xa5, 0xa7, 0x92, - 0x86, 0xb2, 0x89, 0xc1, 0xca, 0x66, 0xef, 0x2b, 0x87, 0xfa, 0x02, 0x7a, 0xc3, 0x3c, 0x13, 0xde, - 0xb4, 0xc2, 0x5e, 0x17, 0xd4, 0x75, 0x1d, 0x11, 0x92, 0xd7, 0x43, 0xb0, 0x54, 0xdc, 0x5b, 0x9a, - 0xb0, 0xdc, 0xdc, 0x20, 0xe6, 0xfb, 0xd0, 0x19, 0x9e, 0x27, 0xb3, 0x28, 0x18, 0x8a, 0xec, 0x52, - 0xb0, 0xca, 0xf7, 0x8f, 0xb5, 0xca, 0xd8, 0xbd, 0xc1, 0x36, 0x00, 0x94, 0x6b, 0xc7, 0x8a, 0x92, - 0xb5, 0x91, 0x76, 0x38, 0x9b, 0xaa, 0x45, 0x2b, 0x3e, 0x5f, 0x71, 0x56, 0xc2, 0xdf, 0x9b, 0x38, - 0x3f, 0x87, 0x95, 0x1d, 0xb2, 0x99, 0xa3, 0x6c, 0xfb, 0x34, 0xc9, 0x72, 0xb6, 0xfc, 0x0d, 0x64, - 0x6d, 0x19, 0xe1, 0xde, 0x60, 0x4f, 0xc0, 0x1e, 0x65, 0x57, 0x8a, 0xff, 0x96, 0xce, 0x1a, 0xca, - 0xfd, 0xae, 0xb9, 0xe5, 0xd6, 0xdf, 0x35, 0xc0, 0xfa, 0x2a, 0xc9, 0x2e, 0x44, 0xc6, 0x1e, 0x80, - 0x45, 0x5d, 0x28, 0x6d, 0x46, 0x8b, 0x8e, 0xd4, 0x75, 0x1b, 0x7d, 0x08, 0x0e, 0x09, 0x65, 0xe4, - 0xc9, 0x0b, 0xa5, 0x2a, 0xfa, 0xa3, 0x84, 0x92, 0x8b, 0xaa, 0x27, 0x48, 0xaf, 0xab, 0x4a, 0x51, - 0x8b, 0xa6, 0x5c, 0xad, 0x35, 0xb4, 0xd6, 0x56, 0x7d, 0x9e, 0x21, 0x9a, 0xe6, 0x13, 0x03, 0x9d, - 0xd1, 0x50, 0xdd, 0x14, 0x99, 0xca, 0xcf, 0xc6, 0x6b, 0xab, 0x05, 0x62, 0xb1, 0xf2, 0x63, 0xb0, - 0x54, 0xb2, 0xa9, 0xae, 0x59, 0xab, 0xa0, 0xd6, 0x7a, 0x55, 0x94, 0x9e, 0xf0, 0x09, 0x58, 0xea, - 0x95, 0xab, 0x09, 0xb5, 0xa0, 0xa5, 0x4e, 0xad, 0x02, 0x9f, 0x62, 0x55, 0x7e, 0x59, 0xb1, 0xd6, - 0x7c, 0xf4, 0x12, 0xeb, 0x23, 0xe8, 0x71, 0xe1, 0x8b, 0xb0, 0x92, 0x86, 0xb2, 0xe2, 0x52, 0xd7, - 0xbc, 0xbe, 0x2f, 0x60, 0xa5, 0x96, 0xb2, 0xb2, 0x3e, 0x09, 0xfa, 0x9a, 0x2c, 0x76, 0x79, 0xf2, - 0xd3, 0xde, 0xbf, 0x7e, 0x7b, 0xd7, 0xf8, 0xb7, 0x6f, 0xef, 0x1a, 0xff, 0xf1, 0xed, 0x5d, 0xe3, - 0xd7, 0xff, 0x79, 0xf7, 0xc6, 0xa9, 0x45, 0x7f, 0xb0, 0xf9, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xff, - 0xff, 0x99, 0x71, 0x4e, 0xa0, 0xa4, 0x23, 0x00, 0x00, + 0xbe, 0x9a, 0x26, 0x33, 0xa9, 0x83, 0x41, 0x85, 0x58, 0x8a, 0xd6, 0xb0, 0x1c, 0xad, 0xdd, 0x1c, + 0x56, 0x06, 0xf3, 0x94, 0xbe, 0x9d, 0x7c, 0x67, 0xe4, 0xaf, 0x89, 0xd5, 0x5c, 0x10, 0x6b, 0x4d, + 0x40, 0xaa, 0x2f, 0x5d, 0x08, 0x08, 0x73, 0x81, 0x24, 0x9b, 0x7a, 0x79, 0x21, 0x38, 0x05, 0xb9, + 0x7f, 0x61, 0x82, 0xa3, 0x54, 0x86, 0xd7, 0xfc, 0x04, 0x9a, 0x14, 0x91, 0x0d, 0x0a, 0xaf, 0x6f, + 0xe3, 0xc3, 0x29, 0x89, 0x9b, 0x2f, 0xc4, 0x15, 0xc5, 0x64, 0x62, 0xb9, 0xb6, 0x9f, 0xa3, 0xbd, + 0xb7, 0x4a, 0x46, 0xc9, 0x7b, 0xbf, 0x07, 0x8e, 0xf2, 0x80, 0x88, 0xd7, 0xdf, 0x05, 0x08, 0x71, + 0x12, 0xd2, 0x47, 0x95, 0x5c, 0x64, 0x53, 0xad, 0x2d, 0x1a, 0x57, 0xd1, 0xd8, 0x52, 0x5f, 0x7a, + 0x08, 0x70, 0xcf, 0xa1, 0xad, 0x77, 0xc7, 0xe8, 0x75, 0x72, 0xf8, 0xe2, 0xf0, 0xe8, 0xab, 0xc3, + 0xde, 0x8d, 0xb2, 0xea, 0x37, 0xaa, 0xf8, 0x66, 0xd6, 0xe3, 0x5b, 0x03, 0xf1, 0x3b, 0x47, 0x27, + 0x87, 0xa3, 0x5e, 0x93, 0xad, 0x80, 0x43, 0xc3, 0x31, 0x1f, 0xbc, 0xec, 0xb5, 0xa8, 0x0e, 0xd9, + 0xf9, 0xf9, 0xe0, 0x60, 0xbb, 0x67, 0x95, 0x3d, 0x83, 0x36, 0xc6, 0x91, 0x5b, 0xea, 0xca, 0xf5, + 0xac, 0xbd, 0xfe, 0xb1, 0xbd, 0xa9, 0x3e, 0xb6, 0xff, 0xb0, 0x89, 0xfa, 0xd6, 0xbf, 0x18, 0xd0, + 0x44, 0x9f, 0xc5, 0x1e, 0x82, 0xf3, 0x73, 0xe1, 0x65, 0xf9, 0xa9, 0xf0, 0x72, 0xb6, 0xe0, 0x9f, + 0xd6, 0x16, 0x20, 0xf7, 0xc6, 0x13, 0x83, 0x6d, 0xaa, 0xcf, 0x68, 0xc5, 0xd7, 0xc1, 0x95, 0xc2, + 0xf3, 0x91, 0x67, 0x5c, 0xe6, 0xdf, 0x20, 0xfe, 0x2f, 0x93, 0x30, 0xde, 0x51, 0xdf, 0x96, 0xd8, + 0xb2, 0xa7, 0x5c, 0x9e, 0xc1, 0x1e, 0x81, 0xb5, 0x27, 0xd1, 0x25, 0xbf, 0xca, 0x4a, 0x11, 0xbf, + 0xee, 0xad, 0xdd, 0x1b, 0x5b, 0xff, 0xd8, 0x80, 0xe6, 0xd7, 0x22, 0x4b, 0xd8, 0xa7, 0xd0, 0xd6, + 0xdd, 0x54, 0x56, 0xeb, 0x9a, 0xae, 0x51, 0xca, 0xb7, 0xd4, 0x66, 0xa5, 0x5d, 0x7a, 0x2a, 0x69, + 0xa8, 0x9a, 0x18, 0xac, 0x6a, 0xf6, 0xbe, 0x72, 0xa8, 0x2f, 0xa0, 0x37, 0xcc, 0x33, 0xe1, 0x4d, + 0x6b, 0xec, 0x8b, 0x82, 0xba, 0xae, 0x23, 0x42, 0xf2, 0x7a, 0x08, 0x96, 0x8a, 0x7b, 0x4b, 0x13, + 0x96, 0x9b, 0x1b, 0xc4, 0x7c, 0x1f, 0x3a, 0xc3, 0xf3, 0x64, 0x16, 0x05, 0x43, 0x91, 0x5d, 0x0a, + 0x56, 0xfb, 0xbe, 0xb2, 0x56, 0x1b, 0xbb, 0x37, 0xd8, 0x06, 0x80, 0x72, 0xed, 0x58, 0x51, 0xb2, + 0x36, 0xd2, 0x0e, 0x67, 0x53, 0xb5, 0x68, 0xcd, 0xe7, 0x2b, 0xce, 0x5a, 0xf8, 0x7b, 0x13, 0xe7, + 0xe7, 0xb0, 0xb2, 0x43, 0x36, 0x73, 0x94, 0x6d, 0x9f, 0x26, 0x59, 0xce, 0x96, 0xbf, 0xb1, 0xac, + 0x2d, 0x23, 0xdc, 0x1b, 0xec, 0x09, 0xd8, 0xa3, 0xec, 0x4a, 0xf1, 0xdf, 0xd2, 0x59, 0x43, 0xb5, + 0xdf, 0x35, 0xb7, 0xdc, 0xfa, 0xbb, 0x06, 0x58, 0x5f, 0x25, 0xd9, 0x85, 0xc8, 0xd8, 0x03, 0xb0, + 0xa8, 0x0b, 0xa5, 0xcd, 0xa8, 0xec, 0x48, 0x5d, 0xb7, 0xd1, 0x87, 0xe0, 0x90, 0x50, 0x46, 0x9e, + 0xbc, 0x50, 0xaa, 0xa2, 0xbf, 0x79, 0x28, 0xb9, 0xa8, 0x7a, 0x82, 0xf4, 0xba, 0xaa, 0x14, 0x55, + 0x36, 0xe5, 0x16, 0x5a, 0x43, 0x6b, 0x6d, 0xd5, 0xe7, 0x19, 0xa2, 0x69, 0x3e, 0x31, 0xd0, 0x19, + 0x0d, 0xd5, 0x4d, 0x91, 0xa9, 0xfa, 0xe8, 0xbd, 0xb6, 0x5a, 0x20, 0xca, 0x95, 0x1f, 0x83, 0xa5, + 0x92, 0x4d, 0x75, 0xcd, 0x85, 0x0a, 0x6a, 0xad, 0x57, 0x47, 0xe9, 0x09, 0x9f, 0x80, 0xa5, 0x5e, + 0xb9, 0x9a, 0xb0, 0x10, 0xb4, 0xd4, 0xa9, 0x55, 0xe0, 0x53, 0xac, 0xca, 0x2f, 0x2b, 0xd6, 0x05, + 0x1f, 0xbd, 0xc4, 0xfa, 0x08, 0x7a, 0x5c, 0xf8, 0x22, 0xac, 0xa5, 0xa1, 0xac, 0xb8, 0xd4, 0x35, + 0xaf, 0xef, 0x0b, 0x58, 0x59, 0x48, 0x59, 0x59, 0x9f, 0x04, 0x7d, 0x4d, 0x16, 0xbb, 0x3c, 0xf9, + 0x69, 0xef, 0xdf, 0xbe, 0xbd, 0x6b, 0xfc, 0xfb, 0xb7, 0x77, 0x8d, 0xff, 0xfc, 0xf6, 0xae, 0xf1, + 0xeb, 0xff, 0xba, 0x7b, 0xe3, 0xd4, 0xa2, 0xbf, 0x07, 0x7d, 0xfe, 0x7f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x4d, 0x26, 0x38, 0x05, 0x62, 0x24, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6183,6 +6266,50 @@ func (m *Group) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Enterprise) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Enterprise) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Enterprise) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.ExpiryTs != 0 { + i = encodeVarintPb(dAtA, i, uint64(m.ExpiryTs)) + i-- + dAtA[i] = 0x18 + } + if m.MaxNodes != 0 { + i = encodeVarintPb(dAtA, i, uint64(m.MaxNodes)) + i-- + dAtA[i] = 0x10 + } + if len(m.Entity) > 0 { + i -= len(m.Entity) + copy(dAtA[i:], m.Entity) + i = encodeVarintPb(dAtA, i, uint64(len(m.Entity))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ZeroProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6207,6 +6334,18 @@ func (m *ZeroProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Enterprise != nil { + { + size, err := m.Enterprise.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPb(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if len(m.Cid) > 0 { i -= len(m.Cid) copy(dAtA[i:], m.Cid) @@ -6314,6 +6453,18 @@ func (m *MembershipState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Enterprise != nil { + { + size, err := m.Enterprise.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPb(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if m.EnterpriseEnabled { i-- if m.EnterpriseEnabled { @@ -7169,20 +7320,20 @@ func (m *PostingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Splits) > 0 { - dAtA22 := make([]byte, len(m.Splits)*10) - var j21 int + dAtA24 := make([]byte, len(m.Splits)*10) + var j23 int for _, num := range m.Splits { for num >= 1<<7 { - dAtA22[j21] = uint8(uint64(num)&0x7f | 0x80) + dAtA24[j23] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j21++ + j23++ } - dAtA22[j21] = uint8(num) - j21++ + dAtA24[j23] = uint8(num) + j23++ } - i -= j21 - copy(dAtA[i:], dAtA22[:j21]) - i = encodeVarintPb(dAtA, i, uint64(j21)) + i -= j23 + copy(dAtA[i:], dAtA24[:j23]) + i = encodeVarintPb(dAtA, i, uint64(j23)) i-- dAtA[i] = 0x22 } @@ -7996,20 +8147,20 @@ func (m *TxnTimestamps) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Ts) > 0 { - dAtA27 := make([]byte, len(m.Ts)*10) - var j26 int + dAtA29 := make([]byte, len(m.Ts)*10) + var j28 int for _, num := range m.Ts { for num >= 1<<7 { - dAtA27[j26] = uint8(uint64(num)&0x7f | 0x80) + dAtA29[j28] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j26++ + j28++ } - dAtA27[j26] = uint8(num) - j26++ + dAtA29[j28] = uint8(num) + j28++ } - i -= j26 - copy(dAtA[i:], dAtA27[:j26]) - i = encodeVarintPb(dAtA, i, uint64(j26)) + i -= j28 + copy(dAtA[i:], dAtA29[:j28]) + i = encodeVarintPb(dAtA, i, uint64(j28)) i-- dAtA[i] = 0xa } @@ -8505,20 +8656,20 @@ func (m *BackupPostingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Splits) > 0 { - dAtA31 := make([]byte, len(m.Splits)*10) - var j30 int + dAtA33 := make([]byte, len(m.Splits)*10) + var j32 int for _, num := range m.Splits { for num >= 1<<7 { - dAtA31[j30] = uint8(uint64(num)&0x7f | 0x80) + dAtA33[j32] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j30++ + j32++ } - dAtA31[j30] = uint8(num) - j30++ + dAtA33[j32] = uint8(num) + j32++ } - i -= j30 - copy(dAtA[i:], dAtA31[:j30]) - i = encodeVarintPb(dAtA, i, uint64(j30)) + i -= j32 + copy(dAtA[i:], dAtA33[:j32]) + i = encodeVarintPb(dAtA, i, uint64(j32)) i-- dAtA[i] = 0x22 } @@ -8542,20 +8693,20 @@ func (m *BackupPostingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.Uids) > 0 { - dAtA33 := make([]byte, len(m.Uids)*10) - var j32 int + dAtA35 := make([]byte, len(m.Uids)*10) + var j34 int for _, num := range m.Uids { for num >= 1<<7 { - dAtA33[j32] = uint8(uint64(num)&0x7f | 0x80) + dAtA35[j34] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j32++ + j34++ } - dAtA33[j32] = uint8(num) - j32++ + dAtA35[j34] = uint8(num) + j34++ } - i -= j32 - copy(dAtA[i:], dAtA33[:j32]) - i = encodeVarintPb(dAtA, i, uint64(j32)) + i -= j34 + copy(dAtA[i:], dAtA35[:j34]) + i = encodeVarintPb(dAtA, i, uint64(j34)) i-- dAtA[i] = 0xa } @@ -8952,6 +9103,28 @@ func (m *Group) Size() (n int) { return n } +func (m *Enterprise) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Entity) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + if m.MaxNodes != 0 { + n += 1 + sovPb(uint64(m.MaxNodes)) + } + if m.ExpiryTs != 0 { + n += 1 + sovPb(uint64(m.ExpiryTs)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ZeroProposal) Size() (n int) { if m == nil { return 0 @@ -8995,6 +9168,10 @@ func (m *ZeroProposal) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } + if m.Enterprise != nil { + l = m.Enterprise.Size() + n += 1 + l + sovPb(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9058,6 +9235,10 @@ func (m *MembershipState) Size() (n int) { if m.EnterpriseEnabled { n += 2 } + if m.Enterprise != nil { + l = m.Enterprise.Size() + n += 1 + l + sovPb(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -12325,6 +12506,130 @@ func (m *Group) Unmarshal(dAtA []byte) error { } return nil } +func (m *Enterprise) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Enterprise: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Enterprise: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxNodes", wireType) + } + m.MaxNodes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxNodes |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpiryTs", wireType) + } + m.ExpiryTs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ExpiryTs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ZeroProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -12682,6 +12987,42 @@ func (m *ZeroProposal) Unmarshal(dAtA []byte) error { } m.Cid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Enterprise", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Enterprise == nil { + m.Enterprise = &Enterprise{} + } + if err := m.Enterprise.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) @@ -13128,6 +13469,42 @@ func (m *MembershipState) Unmarshal(dAtA []byte) error { } } m.EnterpriseEnabled = bool(v != 0) + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Enterprise", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Enterprise == nil { + m.Enterprise = &Enterprise{} + } + if err := m.Enterprise.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) From 6eda1a5bcf7738a9a6822c4c3b6ba91ebde75c6f Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 16:16:10 +1000 Subject: [PATCH 10/35] Read expiry from state in Zero --- dgraph/cmd/zero/zero.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index fe4d745904a..200436b1d7a 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -293,11 +293,12 @@ func (s *Server) updateEnterpriseState() { // Return early if enterprise is not enabled. This would happen when user didn't supply us a // license file. - if !s.enterprise.enabled { + if !s.enterprise.enabled || s.state == nil || s.state.Enterprise == nil { return } - if time.Now().Before(s.enterprise.Expiry) { + expiry := time.Unix(s.state.Enterprise.ExpiryTs, 0) + if time.Now().Before(expiry) { s.state.EnterpriseEnabled = true } else { s.state.EnterpriseEnabled = false From 80b9c11460ce643f07ad89a8df781759ce6f8aba Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 18:42:23 +1000 Subject: [PATCH 11/35] Simplify code and consolidate Enterprise struct. --- dgraph/cmd/zero/raft.go | 9 +- dgraph/cmd/zero/zero.go | 28 +- protos/pb.proto | 4 +- protos/pb/pb.pb.go | 558 ++++++++++++++++++++-------------------- worker/groups.go | 5 +- 5 files changed, 296 insertions(+), 308 deletions(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index c4cda49f987..d44f19c97e0 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -505,9 +505,13 @@ func (n *node) initAndStartNode() error { }() } - if n.server.enterpriseEnabled() { + if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { + var e enterprise + if err := enterpriseDetails(fpath, &e); err != nil { + x.CheckfNoTrace(err) + } + n.server.RLock() - e := n.server.enterprise proposal := &pb.ZeroProposal{ Enterprise: &pb.Enterprise{ Entity: e.Entity, @@ -516,6 +520,7 @@ func (n *node) initAndStartNode() error { }, } n.server.RUnlock() + go func() { for { err := n.proposeAndWait(context.Background(), proposal) diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 200436b1d7a..f6982fa8426 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -40,7 +40,6 @@ var ( ) type enterprise struct { - enabled bool Entity string `json:"entity"` MaxNodes uint64 `json:"max_nodes"` Expiry time.Time `json:"expiry"` @@ -68,8 +67,6 @@ type Server struct { moveOngoing chan struct{} blockCommitsOn *sync.Map - - enterprise enterprise } // Init initializes the zero server. @@ -90,12 +87,6 @@ func (s *Server) Init() { s.closer = y.NewCloser(2) // grpc and http s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) - if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { - if err := enterpriseDetails(fpath, &s.enterprise); err != nil { - x.CheckfNoTrace(err) - } - s.enterprise.enabled = true - } go s.rebalanceTablets() } @@ -279,12 +270,6 @@ func (s *Server) updateZeroLeader() { } } -func (s *Server) enterpriseEnabled() bool { - s.RLock() - defer s.RUnlock() - return s.enterprise.enabled -} - // updateEnterpriseState periodically checks the validity of the enterprise license // based on its expiry. func (s *Server) updateEnterpriseState() { @@ -293,15 +278,15 @@ func (s *Server) updateEnterpriseState() { // Return early if enterprise is not enabled. This would happen when user didn't supply us a // license file. - if !s.enterprise.enabled || s.state == nil || s.state.Enterprise == nil { + if s.state.GetEnterprise() == nil { return } expiry := time.Unix(s.state.Enterprise.ExpiryTs, 0) if time.Now().Before(expiry) { - s.state.EnterpriseEnabled = true + s.state.Enterprise.Enabled = true } else { - s.state.EnterpriseEnabled = false + s.state.Enterprise.Enabled = false } } @@ -509,10 +494,11 @@ func (s *Server) Connect(ctx context.Context, } // TODO - Zero MaxNodes should probably be an error. - if s.enterprise.enabled && s.enterprise.MaxNodes != 0 && - uint64(numberOfNodes) >= s.enterprise.MaxNodes { + maxNodes := s.state.GetEnterprise().GetMaxNodes() + if s.state.GetEnterprise().GetEnabled() && maxNodes != 0 && + uint64(numberOfNodes) >= maxNodes { return nil, errors.Errorf("ENTERPRISE_LIMIT_REACHED: You are already using the maximum "+ - "number of nodes: [%v] permitted for your enterprise license.", s.enterprise.MaxNodes) + "number of nodes: [%v] permitted for your enterprise license.", maxNodes) } // Create a connection and check validity of the address by doing an Echo. diff --git a/protos/pb.proto b/protos/pb.proto index 355731229ca..daa6095d91d 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -141,6 +141,7 @@ message Enterprise { string entity = 1; uint64 maxNodes = 2; int64 expiryTs = 3; + bool enabled = 4; } message ZeroProposal { @@ -168,8 +169,7 @@ message MembershipState { uint64 maxRaftId = 6; repeated Member removed = 7; string cid = 8; // Used to uniquely identify the Dgraph cluster. - bool enterpriseEnabled = 9; - Enterprise enterprise = 10; + Enterprise enterprise = 9; } message ConnectionState { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 02bb66bd2b4..7140735fc5f 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -1163,6 +1163,7 @@ type Enterprise struct { Entity string `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` MaxNodes uint64 `protobuf:"varint,2,opt,name=maxNodes,proto3" json:"maxNodes,omitempty"` ExpiryTs int64 `protobuf:"varint,3,opt,name=expiryTs,proto3" json:"expiryTs,omitempty"` + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1222,6 +1223,13 @@ func (m *Enterprise) GetExpiryTs() int64 { return 0 } +func (m *Enterprise) GetEnabled() bool { + if m != nil { + return m.Enabled + } + return false +} + type ZeroProposal struct { SnapshotTs map[uint32]uint64 `protobuf:"bytes,1,rep,name=snapshot_ts,json=snapshotTs,proto3" json:"snapshot_ts,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` Member *Member `protobuf:"bytes,2,opt,name=member,proto3" json:"member,omitempty"` @@ -1353,8 +1361,7 @@ type MembershipState struct { MaxRaftId uint64 `protobuf:"varint,6,opt,name=maxRaftId,proto3" json:"maxRaftId,omitempty"` Removed []*Member `protobuf:"bytes,7,rep,name=removed,proto3" json:"removed,omitempty"` Cid string `protobuf:"bytes,8,opt,name=cid,proto3" json:"cid,omitempty"` - EnterpriseEnabled bool `protobuf:"varint,9,opt,name=enterpriseEnabled,proto3" json:"enterpriseEnabled,omitempty"` - Enterprise *Enterprise `protobuf:"bytes,10,opt,name=enterprise,proto3" json:"enterprise,omitempty"` + Enterprise *Enterprise `protobuf:"bytes,9,opt,name=enterprise,proto3" json:"enterprise,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1449,13 +1456,6 @@ func (m *MembershipState) GetCid() string { return "" } -func (m *MembershipState) GetEnterpriseEnabled() bool { - if m != nil { - return m.EnterpriseEnabled - } - return false -} - func (m *MembershipState) GetEnterprise() *Enterprise { if m != nil { return m.Enterprise @@ -4087,243 +4087,243 @@ func init() { func init() { proto.RegisterFile("pb.proto", fileDescriptor_f80abaa17e25ccc8) } var fileDescriptor_f80abaa17e25ccc8 = []byte{ - // 3769 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0x1b, 0xd7, - 0x76, 0x9e, 0x21, 0x39, 0x9c, 0x39, 0xa4, 0x64, 0xfa, 0xc6, 0x71, 0x18, 0xe5, 0x3d, 0x5b, 0x99, - 0x7c, 0x58, 0xb1, 0x63, 0xd9, 0x51, 0x5e, 0xd1, 0x97, 0x57, 0x74, 0x21, 0x4b, 0xb4, 0x9f, 0x62, - 0x7d, 0xbd, 0x4b, 0xca, 0xe9, 0x0b, 0x8a, 0x12, 0xa3, 0x99, 0x2b, 0x6a, 0x9e, 0x86, 0x33, 0xd3, - 0xb9, 0x43, 0x95, 0xca, 0xae, 0x8b, 0x16, 0x28, 0xd0, 0xae, 0x0a, 0x14, 0x6f, 0x51, 0x74, 0x51, - 0xa0, 0x8b, 0x76, 0xd3, 0x6d, 0xd1, 0x65, 0x81, 0x02, 0x5d, 0x16, 0xfd, 0x05, 0x45, 0xda, 0x65, - 0xd7, 0x5d, 0x17, 0xe7, 0xdc, 0x3b, 0x1f, 0xa4, 0x65, 0xe7, 0xa5, 0x40, 0x56, 0xbc, 0xe7, 0xe3, - 0x7e, 0x9d, 0x73, 0xee, 0xf9, 0x1a, 0x82, 0x9d, 0x9e, 0x6e, 0xa6, 0x59, 0x92, 0x27, 0xcc, 0x4c, - 0x4f, 0xd7, 0x1c, 0x2f, 0x0d, 0x15, 0xb8, 0x76, 0x7f, 0x12, 0xe6, 0xe7, 0xb3, 0xd3, 0x4d, 0x3f, - 0x99, 0x3e, 0x0e, 0x26, 0x99, 0x97, 0x9e, 0x3f, 0x0a, 0x93, 0xc7, 0xa7, 0x5e, 0x30, 0x11, 0xd9, - 0xe3, 0xf4, 0xf4, 0x71, 0x31, 0xcf, 0x5d, 0x83, 0xe6, 0x7e, 0x28, 0x73, 0xc6, 0xa0, 0x39, 0x0b, - 0x03, 0xd9, 0x37, 0xd6, 0x1b, 0x1b, 0x16, 0xa7, 0xb1, 0x7b, 0x00, 0xce, 0xc8, 0x93, 0x17, 0x2f, - 0xbd, 0x68, 0x26, 0x58, 0x0f, 0x1a, 0x97, 0x5e, 0xd4, 0x37, 0xd6, 0x8d, 0x8d, 0x2e, 0xc7, 0x21, - 0xdb, 0x04, 0xfb, 0xd2, 0x8b, 0xc6, 0xf9, 0x55, 0x2a, 0xfa, 0xe6, 0xba, 0xb1, 0xb1, 0xba, 0xf5, - 0xd6, 0x66, 0x7a, 0xba, 0x79, 0x9c, 0xc8, 0x3c, 0x8c, 0x27, 0x9b, 0x2f, 0xbd, 0x68, 0x74, 0x95, - 0x0a, 0xde, 0xbe, 0x54, 0x03, 0xf7, 0x08, 0x3a, 0xc3, 0xcc, 0x7f, 0x36, 0x8b, 0xfd, 0x3c, 0x4c, - 0x62, 0xdc, 0x31, 0xf6, 0xa6, 0x82, 0x56, 0x74, 0x38, 0x8d, 0x11, 0xe7, 0x65, 0x13, 0xd9, 0x6f, - 0xac, 0x37, 0x10, 0x87, 0x63, 0xd6, 0x87, 0x76, 0x28, 0x77, 0x92, 0x59, 0x9c, 0xf7, 0x9b, 0xeb, - 0xc6, 0x86, 0xcd, 0x0b, 0xd0, 0xfd, 0xb3, 0x06, 0xb4, 0x7e, 0x31, 0x13, 0xd9, 0x15, 0xcd, 0xcb, - 0xf3, 0xac, 0x58, 0x0b, 0xc7, 0xec, 0x36, 0xb4, 0x22, 0x2f, 0x9e, 0xc8, 0xbe, 0x49, 0x8b, 0x29, - 0x80, 0xbd, 0x07, 0x8e, 0x77, 0x96, 0x8b, 0x6c, 0x3c, 0x0b, 0x83, 0x7e, 0x63, 0xdd, 0xd8, 0xb0, - 0xb8, 0x4d, 0x88, 0x93, 0x30, 0x60, 0xef, 0x82, 0x1d, 0x24, 0x63, 0xbf, 0xbe, 0x57, 0x90, 0xd0, - 0x5e, 0xec, 0x03, 0xb0, 0x67, 0x61, 0x30, 0x8e, 0x42, 0x99, 0xf7, 0x5b, 0xeb, 0xc6, 0x46, 0x67, - 0xcb, 0xc6, 0xcb, 0xa2, 0xec, 0x78, 0x7b, 0x16, 0x06, 0x24, 0xc4, 0x07, 0x60, 0xcb, 0xcc, 0x1f, - 0x9f, 0xcd, 0x62, 0xbf, 0x6f, 0x11, 0xd3, 0x4d, 0x64, 0xaa, 0xdd, 0x9a, 0xb7, 0xa5, 0x02, 0xf0, - 0x5a, 0x99, 0xb8, 0x14, 0x99, 0x14, 0xfd, 0xb6, 0xda, 0x4a, 0x83, 0xec, 0x09, 0x74, 0xce, 0x3c, - 0x5f, 0xe4, 0xe3, 0xd4, 0xcb, 0xbc, 0x69, 0xdf, 0xae, 0x16, 0x7a, 0x86, 0xe8, 0x63, 0xc4, 0x4a, - 0x0e, 0x67, 0x25, 0xc0, 0x3e, 0x87, 0x15, 0x82, 0xe4, 0xf8, 0x2c, 0x8c, 0x72, 0x91, 0xf5, 0x1d, - 0x9a, 0xb3, 0x4a, 0x73, 0x08, 0x33, 0xca, 0x84, 0xe0, 0x5d, 0xc5, 0xa4, 0x30, 0xec, 0xc7, 0x00, - 0x62, 0x9e, 0x7a, 0x71, 0x30, 0xf6, 0xa2, 0xa8, 0x0f, 0x74, 0x06, 0x47, 0x61, 0xb6, 0xa3, 0x88, - 0xbd, 0x83, 0xe7, 0xf3, 0x82, 0x71, 0x2e, 0xfb, 0x2b, 0xeb, 0xc6, 0x46, 0x93, 0x5b, 0x08, 0x8e, - 0x24, 0xca, 0xd5, 0xf7, 0xfc, 0x73, 0xd1, 0x5f, 0x5d, 0x37, 0x36, 0x5a, 0x5c, 0x01, 0xee, 0x16, - 0x38, 0x64, 0x27, 0x24, 0x87, 0x8f, 0xc0, 0xba, 0x44, 0x40, 0x99, 0x53, 0x67, 0x6b, 0x05, 0x0f, - 0x52, 0x9a, 0x12, 0xd7, 0x44, 0xf7, 0x2e, 0xd8, 0xfb, 0x5e, 0x3c, 0x29, 0xec, 0x0f, 0x15, 0x44, - 0x13, 0x1c, 0x4e, 0x63, 0xf7, 0xd7, 0x26, 0x58, 0x5c, 0xc8, 0x59, 0x94, 0xb3, 0xfb, 0x00, 0x28, - 0xfe, 0xa9, 0x97, 0x67, 0xe1, 0x5c, 0xaf, 0x5a, 0x29, 0xc0, 0x99, 0x85, 0xc1, 0x01, 0x91, 0xd8, - 0x13, 0xe8, 0xd2, 0xea, 0x05, 0xab, 0x59, 0x1d, 0xa0, 0x3c, 0x1f, 0xef, 0x10, 0x8b, 0x9e, 0x71, - 0x07, 0x2c, 0xd2, 0xb8, 0xb2, 0xba, 0x15, 0xae, 0x21, 0xf6, 0x11, 0xac, 0x86, 0x71, 0x8e, 0x1a, - 0xf1, 0xf3, 0x71, 0x20, 0x64, 0x61, 0x12, 0x2b, 0x25, 0x76, 0x57, 0xc8, 0x9c, 0x7d, 0x06, 0x4a, - 0xac, 0xc5, 0x86, 0x2d, 0xda, 0x70, 0xb5, 0x54, 0x97, 0x54, 0x3b, 0x12, 0x8f, 0xde, 0xf1, 0x11, - 0x74, 0xf0, 0x7e, 0xc5, 0x0c, 0x8b, 0x66, 0x74, 0xe9, 0x36, 0x5a, 0x1c, 0x1c, 0x90, 0x41, 0xb3, - 0xa3, 0x68, 0xd0, 0xec, 0x94, 0x99, 0xd0, 0xd8, 0x1d, 0x40, 0xeb, 0x28, 0x0b, 0x44, 0x76, 0xad, - 0xe5, 0x33, 0x68, 0x06, 0x42, 0xfa, 0xf4, 0x28, 0x6d, 0x4e, 0xe3, 0xea, 0x35, 0x34, 0x6a, 0xaf, - 0xc1, 0xfd, 0x1b, 0x03, 0x3a, 0xc3, 0x24, 0xcb, 0x0f, 0x84, 0x94, 0xde, 0x44, 0xb0, 0x7b, 0xd0, - 0x4a, 0x70, 0x59, 0x2d, 0x61, 0x07, 0xcf, 0x44, 0xfb, 0x70, 0x85, 0x5f, 0xd2, 0x83, 0xf9, 0x7a, - 0x3d, 0xa0, 0x95, 0xd0, 0x3b, 0x6a, 0x68, 0x2b, 0xa1, 0x57, 0x74, 0x07, 0xac, 0xe4, 0xec, 0x4c, - 0x0a, 0x25, 0xcb, 0x16, 0xd7, 0xd0, 0x6b, 0x8d, 0xcd, 0xfd, 0x2d, 0x00, 0x3c, 0xdf, 0xf7, 0xb4, - 0x02, 0xf7, 0x1c, 0x3a, 0xdc, 0x3b, 0xcb, 0x77, 0x92, 0x38, 0x17, 0xf3, 0x9c, 0xad, 0x82, 0x19, - 0x06, 0x24, 0x22, 0x8b, 0x9b, 0x61, 0x80, 0x87, 0x9b, 0x64, 0xc9, 0x2c, 0x25, 0x09, 0xad, 0x70, - 0x05, 0x90, 0x28, 0x83, 0x20, 0xa3, 0x13, 0xa3, 0x28, 0x83, 0x20, 0x63, 0xf7, 0xa0, 0x23, 0x63, - 0x2f, 0x95, 0xe7, 0x49, 0x8e, 0x87, 0x6b, 0xd2, 0xe1, 0xa0, 0x40, 0x8d, 0xa4, 0xfb, 0xaf, 0x06, - 0x58, 0x07, 0x62, 0x7a, 0x2a, 0xb2, 0x57, 0x76, 0x79, 0x17, 0x6c, 0x5a, 0x78, 0x1c, 0x06, 0x7a, - 0xa3, 0x36, 0xc1, 0x7b, 0xc1, 0xb5, 0x5b, 0xdd, 0x01, 0x2b, 0x12, 0x1e, 0x0a, 0x5f, 0xd9, 0x99, - 0x86, 0x50, 0x36, 0xde, 0x74, 0x1c, 0x08, 0x2f, 0x20, 0xc7, 0x63, 0x73, 0xcb, 0x9b, 0xee, 0x0a, - 0x2f, 0xc0, 0xb3, 0x45, 0x9e, 0xcc, 0xc7, 0xb3, 0x34, 0xf0, 0x72, 0x41, 0x0e, 0xa7, 0x89, 0x86, - 0x23, 0xf3, 0x13, 0xc2, 0xb0, 0x07, 0x70, 0xcb, 0x8f, 0x66, 0x12, 0xbd, 0x5d, 0x18, 0x9f, 0x25, - 0xe3, 0x24, 0x8e, 0xae, 0x48, 0xbe, 0x36, 0xbf, 0xa9, 0x09, 0x7b, 0xf1, 0x59, 0x72, 0x14, 0x47, - 0x57, 0xee, 0x3f, 0x99, 0xd0, 0x7a, 0x4e, 0x62, 0x78, 0x02, 0xed, 0x29, 0x5d, 0xa8, 0x78, 0xbd, - 0x77, 0x50, 0xc2, 0x44, 0xdb, 0x54, 0x37, 0x95, 0x83, 0x38, 0xcf, 0xae, 0x78, 0xc1, 0x86, 0x33, - 0x72, 0xef, 0x34, 0x12, 0xb9, 0xd4, 0x16, 0x51, 0x9b, 0x31, 0x52, 0x04, 0x3d, 0x43, 0xb3, 0x2d, - 0x8b, 0xb5, 0xb1, 0x2c, 0x56, 0xb6, 0x06, 0xb6, 0x7f, 0x2e, 0xfc, 0x0b, 0x39, 0x9b, 0x6a, 0xa1, - 0x97, 0xf0, 0xda, 0x33, 0xe8, 0xd6, 0xcf, 0x81, 0x91, 0xe9, 0x42, 0x5c, 0x91, 0xe0, 0x9b, 0x1c, - 0x87, 0x6c, 0x1d, 0x5a, 0xf4, 0xc2, 0x49, 0xec, 0x9d, 0x2d, 0xc0, 0xe3, 0xa8, 0x29, 0x5c, 0x11, - 0x7e, 0x66, 0xfe, 0xd4, 0xc0, 0x75, 0xea, 0xa7, 0xab, 0xaf, 0xe3, 0xbc, 0x7e, 0x1d, 0x35, 0xa5, - 0xb6, 0x8e, 0xfb, 0xfb, 0x00, 0x03, 0x74, 0x09, 0x69, 0x16, 0x4a, 0x81, 0x6a, 0x14, 0x71, 0x1e, + // 3765 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0x23, 0x47, + 0x76, 0xd3, 0x4d, 0xb2, 0xd9, 0xfd, 0x48, 0x69, 0xe8, 0xb2, 0x3d, 0xa6, 0xe5, 0xdd, 0x19, 0xb9, + 0xfd, 0x31, 0xf2, 0xcc, 0x8e, 0x66, 0x2c, 0x6f, 0x90, 0xf5, 0x06, 0x39, 0x68, 0x24, 0xce, 0xac, + 0x3c, 0xfa, 0xda, 0x22, 0x35, 0xce, 0xfa, 0x10, 0xa2, 0xd5, 0x5d, 0xa2, 0x7a, 0xd5, 0xec, 0xee, + 0x74, 0x35, 0x15, 0xca, 0xb7, 0x1c, 0x12, 0x20, 0x40, 0x72, 0xca, 0x65, 0x0f, 0x41, 0x0e, 0x01, + 0x72, 0x48, 0x2e, 0xb9, 0x06, 0x39, 0x06, 0x08, 0x90, 0x63, 0x90, 0x5f, 0x10, 0x38, 0x39, 0xe4, + 0x90, 0x73, 0xce, 0xc1, 0x7b, 0x55, 0xfd, 0x41, 0x8e, 0x34, 0xb3, 0x5e, 0x60, 0x4f, 0xac, 0xf7, + 0x51, 0x5f, 0xef, 0xbd, 0x7a, 0x5f, 0x4d, 0xb0, 0xd3, 0xd3, 0xcd, 0x34, 0x4b, 0xf2, 0x84, 0x99, + 0xe9, 0xe9, 0x9a, 0xe3, 0xa5, 0xa1, 0x02, 0xd7, 0xee, 0x4f, 0xc2, 0xfc, 0x7c, 0x76, 0xba, 0xe9, + 0x27, 0xd3, 0xc7, 0xc1, 0x24, 0xf3, 0xd2, 0xf3, 0x47, 0x61, 0xf2, 0xf8, 0xd4, 0x0b, 0x26, 0x22, + 0x7b, 0x9c, 0x9e, 0x3e, 0x2e, 0xe6, 0xb9, 0x6b, 0xd0, 0xdc, 0x0f, 0x65, 0xce, 0x18, 0x34, 0x67, + 0x61, 0x20, 0xfb, 0xc6, 0x7a, 0x63, 0xc3, 0xe2, 0x34, 0x76, 0x0f, 0xc0, 0x19, 0x79, 0xf2, 0xe2, + 0xa5, 0x17, 0xcd, 0x04, 0xeb, 0x41, 0xe3, 0xd2, 0x8b, 0xfa, 0xc6, 0xba, 0xb1, 0xd1, 0xe5, 0x38, + 0x64, 0x9b, 0x60, 0x5f, 0x7a, 0xd1, 0x38, 0xbf, 0x4a, 0x45, 0xdf, 0x5c, 0x37, 0x36, 0x56, 0xb7, + 0xde, 0xde, 0x4c, 0x4f, 0x37, 0x8f, 0x13, 0x99, 0x87, 0xf1, 0x64, 0xf3, 0xa5, 0x17, 0x8d, 0xae, + 0x52, 0xc1, 0xdb, 0x97, 0x6a, 0xe0, 0x1e, 0x41, 0x67, 0x98, 0xf9, 0xcf, 0x66, 0xb1, 0x9f, 0x87, + 0x49, 0x8c, 0x3b, 0xc6, 0xde, 0x54, 0xd0, 0x8a, 0x0e, 0xa7, 0x31, 0xe2, 0xbc, 0x6c, 0x22, 0xfb, + 0x8d, 0xf5, 0x06, 0xe2, 0x70, 0xcc, 0xfa, 0xd0, 0x0e, 0xe5, 0x4e, 0x32, 0x8b, 0xf3, 0x7e, 0x73, + 0xdd, 0xd8, 0xb0, 0x79, 0x01, 0xba, 0x7f, 0xde, 0x80, 0xd6, 0xcf, 0x67, 0x22, 0xbb, 0xa2, 0x79, + 0x79, 0x9e, 0x15, 0x6b, 0xe1, 0x98, 0xbd, 0x03, 0xad, 0xc8, 0x8b, 0x27, 0xb2, 0x6f, 0xd2, 0x62, + 0x0a, 0x60, 0x1f, 0x80, 0xe3, 0x9d, 0xe5, 0x22, 0x1b, 0xcf, 0xc2, 0xa0, 0xdf, 0x58, 0x37, 0x36, + 0x2c, 0x6e, 0x13, 0xe2, 0x24, 0x0c, 0xd8, 0xfb, 0x60, 0x07, 0xc9, 0xd8, 0xaf, 0xef, 0x15, 0x24, + 0xb4, 0x17, 0xfb, 0x08, 0xec, 0x59, 0x18, 0x8c, 0xa3, 0x50, 0xe6, 0xfd, 0xd6, 0xba, 0xb1, 0xd1, + 0xd9, 0xb2, 0xf1, 0xb2, 0x28, 0x3b, 0xde, 0x9e, 0x85, 0x01, 0x09, 0xf1, 0x01, 0xd8, 0x32, 0xf3, + 0xc7, 0x67, 0xb3, 0xd8, 0xef, 0x5b, 0xc4, 0x74, 0x1b, 0x99, 0x6a, 0xb7, 0xe6, 0x6d, 0xa9, 0x00, + 0xbc, 0x56, 0x26, 0x2e, 0x45, 0x26, 0x45, 0xbf, 0xad, 0xb6, 0xd2, 0x20, 0x7b, 0x02, 0x9d, 0x33, + 0xcf, 0x17, 0xf9, 0x38, 0xf5, 0x32, 0x6f, 0xda, 0xb7, 0xab, 0x85, 0x9e, 0x21, 0xfa, 0x18, 0xb1, + 0x92, 0xc3, 0x59, 0x09, 0xb0, 0x2f, 0x60, 0x85, 0x20, 0x39, 0x3e, 0x0b, 0xa3, 0x5c, 0x64, 0x7d, + 0x87, 0xe6, 0xac, 0xd2, 0x1c, 0xc2, 0x8c, 0x32, 0x21, 0x78, 0x57, 0x31, 0x29, 0x0c, 0xfb, 0x21, + 0x80, 0x98, 0xa7, 0x5e, 0x1c, 0x8c, 0xbd, 0x28, 0xea, 0x03, 0x9d, 0xc1, 0x51, 0x98, 0xed, 0x28, + 0x62, 0xef, 0xe1, 0xf9, 0xbc, 0x60, 0x9c, 0xcb, 0xfe, 0xca, 0xba, 0xb1, 0xd1, 0xe4, 0x16, 0x82, + 0x23, 0x89, 0x72, 0xf5, 0x3d, 0xff, 0x5c, 0xf4, 0x57, 0xd7, 0x8d, 0x8d, 0x16, 0x57, 0x80, 0xbb, + 0x05, 0x0e, 0xd9, 0x09, 0xc9, 0xe1, 0x13, 0xb0, 0x2e, 0x11, 0x50, 0xe6, 0xd4, 0xd9, 0x5a, 0xc1, + 0x83, 0x94, 0xa6, 0xc4, 0x35, 0xd1, 0xbd, 0x0b, 0xf6, 0xbe, 0x17, 0x4f, 0x0a, 0xfb, 0x43, 0x05, + 0xd1, 0x04, 0x87, 0xd3, 0xd8, 0xfd, 0x95, 0x09, 0x16, 0x17, 0x72, 0x16, 0xe5, 0xec, 0x3e, 0x00, + 0x8a, 0x7f, 0xea, 0xe5, 0x59, 0x38, 0xd7, 0xab, 0x56, 0x0a, 0x70, 0x66, 0x61, 0x70, 0x40, 0x24, + 0xf6, 0x04, 0xba, 0xb4, 0x7a, 0xc1, 0x6a, 0x56, 0x07, 0x28, 0xcf, 0xc7, 0x3b, 0xc4, 0xa2, 0x67, + 0xdc, 0x01, 0x8b, 0x34, 0xae, 0xac, 0x6e, 0x85, 0x6b, 0x88, 0x7d, 0x02, 0xab, 0x61, 0x9c, 0xa3, + 0x46, 0xfc, 0x7c, 0x1c, 0x08, 0x59, 0x98, 0xc4, 0x4a, 0x89, 0xdd, 0x15, 0x32, 0x67, 0x9f, 0x83, + 0x12, 0x6b, 0xb1, 0x61, 0x8b, 0x36, 0x5c, 0x2d, 0xd5, 0x25, 0xd5, 0x8e, 0xc4, 0xa3, 0x77, 0x7c, + 0x04, 0x1d, 0xbc, 0x5f, 0x31, 0xc3, 0xa2, 0x19, 0x5d, 0xba, 0x8d, 0x16, 0x07, 0x07, 0x64, 0xd0, + 0xec, 0x28, 0x1a, 0x34, 0x3b, 0x65, 0x26, 0x34, 0x76, 0x07, 0xd0, 0x3a, 0xca, 0x02, 0x91, 0x5d, + 0x6b, 0xf9, 0x0c, 0x9a, 0x81, 0x90, 0x3e, 0x3d, 0x4a, 0x9b, 0xd3, 0xb8, 0x7a, 0x0d, 0x8d, 0xda, + 0x6b, 0x70, 0xff, 0xc6, 0x80, 0xce, 0x30, 0xc9, 0xf2, 0x03, 0x21, 0xa5, 0x37, 0x11, 0xec, 0x1e, + 0xb4, 0x12, 0x5c, 0x56, 0x4b, 0xd8, 0xc1, 0x33, 0xd1, 0x3e, 0x5c, 0xe1, 0x97, 0xf4, 0x60, 0xde, + 0xac, 0x07, 0xb4, 0x12, 0x7a, 0x47, 0x0d, 0x6d, 0x25, 0xf4, 0x8a, 0xee, 0x80, 0x95, 0x9c, 0x9d, + 0x49, 0xa1, 0x64, 0xd9, 0xe2, 0x1a, 0xba, 0xd1, 0xd8, 0xdc, 0xdf, 0x01, 0xc0, 0xf3, 0x7d, 0x4f, + 0x2b, 0x70, 0xcf, 0xa1, 0xc3, 0xbd, 0xb3, 0x7c, 0x27, 0x89, 0x73, 0x31, 0xcf, 0xd9, 0x2a, 0x98, + 0x61, 0x40, 0x22, 0xb2, 0xb8, 0x19, 0x06, 0x78, 0xb8, 0x49, 0x96, 0xcc, 0x52, 0x92, 0xd0, 0x0a, + 0x57, 0x00, 0x89, 0x32, 0x08, 0x32, 0x3a, 0x31, 0x8a, 0x32, 0x08, 0x32, 0x76, 0x0f, 0x3a, 0x32, + 0xf6, 0x52, 0x79, 0x9e, 0xe4, 0x78, 0xb8, 0x26, 0x1d, 0x0e, 0x0a, 0xd4, 0x48, 0xba, 0xff, 0x6a, + 0x80, 0x75, 0x20, 0xa6, 0xa7, 0x22, 0x7b, 0x65, 0x97, 0xf7, 0xc1, 0xa6, 0x85, 0xc7, 0x61, 0xa0, + 0x37, 0x6a, 0x13, 0xbc, 0x17, 0x5c, 0xbb, 0xd5, 0x1d, 0xb0, 0x22, 0xe1, 0xa1, 0xf0, 0x95, 0x9d, + 0x69, 0x08, 0x65, 0xe3, 0x4d, 0xc7, 0x81, 0xf0, 0x02, 0x72, 0x3c, 0x36, 0xb7, 0xbc, 0xe9, 0xae, + 0xf0, 0x02, 0x3c, 0x5b, 0xe4, 0xc9, 0x7c, 0x3c, 0x4b, 0x03, 0x2f, 0x17, 0xe4, 0x70, 0x9a, 0x68, + 0x38, 0x32, 0x3f, 0x21, 0x0c, 0x7b, 0x00, 0x6f, 0xf9, 0xd1, 0x4c, 0xa2, 0xb7, 0x0b, 0xe3, 0xb3, + 0x64, 0x9c, 0xc4, 0xd1, 0x15, 0xc9, 0xd7, 0xe6, 0xb7, 0x35, 0x61, 0x2f, 0x3e, 0x4b, 0x8e, 0xe2, + 0xe8, 0xca, 0xfd, 0x27, 0x13, 0x5a, 0xcf, 0x49, 0x0c, 0x4f, 0xa0, 0x3d, 0xa5, 0x0b, 0x15, 0xaf, + 0xf7, 0x0e, 0x4a, 0x98, 0x68, 0x9b, 0xea, 0xa6, 0x72, 0x10, 0xe7, 0xd9, 0x15, 0x2f, 0xd8, 0x70, + 0x46, 0xee, 0x9d, 0x46, 0x22, 0x97, 0xda, 0x22, 0x6a, 0x33, 0x46, 0x8a, 0xa0, 0x67, 0x68, 0xb6, + 0x65, 0xb1, 0x36, 0x96, 0xc5, 0xca, 0xd6, 0xc0, 0xf6, 0xcf, 0x85, 0x7f, 0x21, 0x67, 0x53, 0x2d, + 0xf4, 0x12, 0x5e, 0x7b, 0x06, 0xdd, 0xfa, 0x39, 0x30, 0x32, 0x5d, 0x88, 0x2b, 0x12, 0x7c, 0x93, + 0xe3, 0x90, 0xad, 0x43, 0x8b, 0x5e, 0x38, 0x89, 0xbd, 0xb3, 0x05, 0x78, 0x1c, 0x35, 0x85, 0x2b, + 0xc2, 0x4f, 0xcd, 0x9f, 0x18, 0xb8, 0x4e, 0xfd, 0x74, 0xf5, 0x75, 0x9c, 0x9b, 0xd7, 0x51, 0x53, + 0x6a, 0xeb, 0xb8, 0x97, 0x00, 0x03, 0x74, 0x09, 0x69, 0x16, 0x4a, 0x81, 0x6a, 0x14, 0x71, 0x1e, 0xe6, 0xc5, 0x42, 0x1a, 0xc2, 0x1b, 0x4d, 0xbd, 0xf9, 0x61, 0x12, 0x08, 0x49, 0xcb, 0x35, 0x79, - 0x09, 0x23, 0x4d, 0xcc, 0xd3, 0x30, 0xbb, 0x1a, 0x29, 0x59, 0x34, 0x78, 0x09, 0xbb, 0x7f, 0xdf, - 0x80, 0xee, 0xd7, 0x22, 0x4b, 0x8e, 0xb3, 0x24, 0x4d, 0xa4, 0x17, 0xb1, 0xed, 0x45, 0xd9, 0x29, - 0x1d, 0xad, 0xe3, 0xd1, 0xea, 0x6c, 0x9b, 0xc3, 0x52, 0x98, 0x4a, 0xf6, 0x75, 0xe9, 0xba, 0x60, - 0x29, 0xdd, 0x5d, 0x23, 0x20, 0x4d, 0x41, 0x1e, 0xa5, 0x2d, 0x3a, 0xd1, 0xe2, 0xe5, 0x35, 0x85, - 0xdd, 0x05, 0x98, 0x7a, 0xf3, 0x7d, 0xe1, 0x49, 0xb1, 0x17, 0x14, 0x8f, 0xa3, 0xc2, 0xe8, 0x3b, - 0x8f, 0xe6, 0xf1, 0x48, 0x92, 0xed, 0xaa, 0x3b, 0x13, 0xcc, 0x7e, 0x04, 0xce, 0xd4, 0x9b, 0xe3, - 0x2b, 0xdd, 0x0b, 0xb4, 0xed, 0x56, 0x08, 0xf6, 0x3e, 0x34, 0xf2, 0x79, 0x4c, 0x2e, 0x0f, 0x63, - 0x1f, 0x26, 0x36, 0xa3, 0x79, 0xac, 0xdf, 0x33, 0x47, 0x5a, 0xa1, 0x2e, 0xbb, 0x52, 0x57, 0x0f, - 0x1a, 0x7e, 0x18, 0x50, 0xf0, 0x73, 0x38, 0x0e, 0xd9, 0x26, 0x80, 0x28, 0x55, 0x43, 0x31, 0x4e, - 0xbb, 0xe6, 0x4a, 0x61, 0xbc, 0xc6, 0xb1, 0xf6, 0xbb, 0x70, 0x73, 0x49, 0x6e, 0x75, 0xab, 0x58, - 0x51, 0xdb, 0xdc, 0xae, 0x5b, 0x45, 0xb3, 0x6e, 0x09, 0x7f, 0xd5, 0x84, 0x9b, 0xda, 0x34, 0xcf, - 0xc3, 0x74, 0x98, 0xe3, 0x23, 0xec, 0x43, 0x9b, 0x7c, 0x9f, 0xc8, 0xb4, 0x85, 0x16, 0x20, 0xfb, - 0x6d, 0xb0, 0xc8, 0x1f, 0x14, 0xaf, 0xe6, 0x5e, 0xa5, 0x85, 0x72, 0xba, 0x7a, 0x45, 0x5a, 0x85, - 0x9a, 0x9d, 0xfd, 0x04, 0x5a, 0xdf, 0x88, 0x2c, 0x51, 0xbe, 0xbc, 0xb3, 0x75, 0xf7, 0xba, 0x79, - 0x68, 0x0b, 0x7a, 0x9a, 0x62, 0xfe, 0x01, 0x95, 0xf5, 0x21, 0x7a, 0xef, 0x69, 0x72, 0x29, 0x82, - 0x7e, 0x9b, 0x4e, 0x54, 0xb7, 0xa7, 0x82, 0x54, 0x68, 0xc7, 0xae, 0xb4, 0xf3, 0x29, 0xdc, 0xaa, - 0x64, 0x3f, 0x88, 0xd1, 0xa6, 0x94, 0xf6, 0x6c, 0xfe, 0x2a, 0xe1, 0x7b, 0xeb, 0x72, 0x17, 0x3a, - 0x35, 0xe1, 0x5d, 0xa3, 0xc7, 0x7b, 0x8b, 0xaf, 0xdb, 0x29, 0x9d, 0x56, 0xdd, 0x49, 0xec, 0x02, - 0x54, 0xa2, 0xfc, 0xff, 0xba, 0x1a, 0xf7, 0x8f, 0x0d, 0xb8, 0xb9, 0x93, 0xc4, 0xb1, 0xa0, 0x24, - 0x50, 0x19, 0x46, 0xf5, 0x08, 0x8d, 0xd7, 0x3e, 0xc2, 0x4f, 0xa0, 0x25, 0x91, 0x59, 0xaf, 0xfe, - 0xd6, 0x35, 0x9a, 0xe6, 0x8a, 0x03, 0x5d, 0xea, 0xd4, 0x9b, 0x8f, 0x53, 0x11, 0x07, 0x61, 0x3c, - 0x29, 0x5c, 0xea, 0xd4, 0x9b, 0x1f, 0x2b, 0x8c, 0xfb, 0xb7, 0x06, 0x58, 0xea, 0xfd, 0x2e, 0x44, - 0x26, 0x63, 0x31, 0x32, 0xfd, 0x08, 0x9c, 0x34, 0x13, 0x41, 0xe8, 0x17, 0xbb, 0x3a, 0xbc, 0x42, - 0xa0, 0xe9, 0x9f, 0x25, 0x99, 0x2f, 0x68, 0x79, 0x9b, 0x2b, 0x00, 0xb1, 0x32, 0xf5, 0x7c, 0x95, - 0xc8, 0x36, 0xb8, 0x02, 0xd0, 0x11, 0x2a, 0xd5, 0x93, 0xca, 0x6d, 0xae, 0x21, 0xcc, 0xc0, 0x29, - 0xd6, 0x53, 0x34, 0x52, 0xda, 0xb6, 0x11, 0x41, 0x61, 0xe8, 0x1f, 0x4c, 0xe8, 0xee, 0x86, 0x99, - 0xf0, 0x73, 0x11, 0x0c, 0x82, 0xc9, 0xb2, 0x3b, 0xb5, 0x4a, 0x77, 0x5a, 0xe4, 0x3d, 0xe6, 0x62, - 0xc6, 0xaf, 0x74, 0xd1, 0xa0, 0x22, 0x45, 0x01, 0x6c, 0x0b, 0x40, 0x65, 0x84, 0x54, 0xa8, 0x34, - 0x5f, 0x5f, 0xa8, 0x38, 0xc4, 0x86, 0x43, 0x14, 0x90, 0x9a, 0x13, 0xaa, 0xa0, 0x6b, 0x51, 0x15, - 0x33, 0xc3, 0x67, 0x42, 0x89, 0xd4, 0xa9, 0x88, 0xe8, 0x19, 0x50, 0x22, 0x75, 0x2a, 0xa2, 0x32, - 0x7d, 0x6d, 0xab, 0xe3, 0xe0, 0x98, 0x7d, 0x00, 0x66, 0x92, 0xd2, 0xe5, 0xf5, 0x86, 0xf5, 0x8b, - 0x6d, 0x1e, 0xa5, 0xdc, 0x4c, 0x52, 0xb4, 0x02, 0x95, 0x95, 0xf7, 0x1d, 0xfd, 0x74, 0xd0, 0xd7, - 0x51, 0xe6, 0xc8, 0x35, 0xc5, 0xbd, 0x03, 0xe6, 0x51, 0xca, 0xda, 0xd0, 0x18, 0x0e, 0x46, 0xbd, - 0x1b, 0x38, 0xd8, 0x1d, 0xec, 0xf7, 0x0c, 0xf7, 0x7f, 0x4c, 0x70, 0x0e, 0x66, 0xb9, 0x87, 0x36, - 0x25, 0xdf, 0xa4, 0xd4, 0x77, 0xc1, 0x96, 0xb9, 0x97, 0x51, 0xbc, 0x50, 0x4e, 0xab, 0x4d, 0xf0, - 0x48, 0xb2, 0x8f, 0xa1, 0x25, 0x82, 0x89, 0x28, 0x7c, 0x49, 0x6f, 0xf9, 0x9c, 0x5c, 0x91, 0xd9, - 0x06, 0x58, 0xd2, 0x3f, 0x17, 0x53, 0xaf, 0xdf, 0xac, 0x18, 0x87, 0x84, 0x51, 0xd9, 0x06, 0xd7, - 0x74, 0xb6, 0x05, 0x6f, 0x87, 0x93, 0x38, 0xc9, 0xc4, 0x38, 0x8c, 0x03, 0x31, 0x1f, 0xfb, 0x49, - 0x7c, 0x16, 0x85, 0x7e, 0xae, 0xb3, 0x97, 0xb7, 0x14, 0x71, 0x0f, 0x69, 0x3b, 0x9a, 0xc4, 0x3e, - 0x84, 0x16, 0x6a, 0x47, 0xea, 0x5c, 0x98, 0x9e, 0x35, 0x2a, 0x42, 0x2f, 0xad, 0x88, 0xec, 0x11, - 0xb4, 0x83, 0x2c, 0x49, 0xc7, 0x49, 0x4a, 0x72, 0x5e, 0xdd, 0xba, 0x4d, 0xef, 0xa1, 0x90, 0xc0, - 0xe6, 0x6e, 0x96, 0xa4, 0x47, 0x29, 0xb7, 0x02, 0xfa, 0xc5, 0x02, 0x87, 0xd8, 0x95, 0x4d, 0x28, - 0xbf, 0xe3, 0x20, 0x86, 0x0a, 0x01, 0xf7, 0x31, 0x58, 0x6a, 0x02, 0xb3, 0xa1, 0x79, 0x78, 0x74, - 0x38, 0x50, 0xa2, 0xdd, 0xde, 0xdf, 0xef, 0x19, 0x88, 0xda, 0xdd, 0x1e, 0x6d, 0xf7, 0x4c, 0x1c, - 0x8d, 0x7e, 0x79, 0x3c, 0xe8, 0x35, 0xdc, 0xbf, 0x34, 0xc0, 0x2e, 0xa2, 0x03, 0xfb, 0x04, 0xdd, - 0x3a, 0x45, 0x23, 0xfd, 0x7c, 0xa9, 0x40, 0xab, 0x25, 0x9d, 0xbc, 0xa0, 0xa3, 0xc5, 0x90, 0x24, - 0x8a, 0x78, 0x41, 0x40, 0x3d, 0xe5, 0x6d, 0x2c, 0xd4, 0x57, 0x98, 0xbd, 0x27, 0xb1, 0xd0, 0x59, - 0x20, 0x8d, 0x49, 0x81, 0x61, 0xec, 0x0b, 0xe4, 0x6e, 0x69, 0x05, 0x22, 0x3c, 0x92, 0xee, 0x5f, - 0x9b, 0x60, 0x97, 0xb9, 0xc1, 0x43, 0x70, 0xa6, 0x85, 0x38, 0xb4, 0xcf, 0x58, 0x59, 0x90, 0x11, - 0xaf, 0xe8, 0xec, 0x0e, 0x98, 0x17, 0x97, 0x5a, 0x9d, 0x16, 0x72, 0xbd, 0x78, 0xc9, 0xcd, 0x8b, - 0xcb, 0xca, 0xe9, 0xb4, 0xbe, 0xd3, 0xe9, 0xdc, 0x87, 0x9b, 0x7e, 0x24, 0xbc, 0x78, 0x5c, 0xf9, - 0x0c, 0xf5, 0x2c, 0x56, 0x09, 0x7d, 0x5c, 0x3a, 0x0e, 0xed, 0x38, 0xdb, 0x55, 0xb0, 0xfe, 0x08, - 0x5a, 0x81, 0x88, 0x72, 0xaf, 0x5e, 0xdf, 0x1e, 0x65, 0x9e, 0x1f, 0x89, 0x5d, 0x44, 0x73, 0x45, - 0x65, 0x1b, 0x60, 0x17, 0x89, 0x8b, 0xae, 0x6a, 0xa9, 0x50, 0x2a, 0xf4, 0xc0, 0x4b, 0x6a, 0x25, - 0x66, 0xa8, 0x89, 0xd9, 0xfd, 0x0c, 0x1a, 0x2f, 0x5e, 0x0e, 0xf5, 0x5d, 0x8d, 0x57, 0xee, 0x5a, - 0x08, 0xdb, 0xac, 0x84, 0xed, 0xfe, 0x6f, 0x03, 0xda, 0xda, 0x37, 0xe0, 0xb9, 0x67, 0x65, 0x52, - 0x8f, 0xc3, 0xc5, 0xe8, 0x5f, 0x3a, 0x99, 0x7a, 0x2f, 0xa4, 0xf1, 0xdd, 0xbd, 0x10, 0xf6, 0x33, - 0xe8, 0xa6, 0x8a, 0x56, 0x77, 0x4b, 0xef, 0xd4, 0xe7, 0xe8, 0x5f, 0x9a, 0xd7, 0x49, 0x2b, 0x00, - 0x8d, 0x81, 0xca, 0xc7, 0xdc, 0x9b, 0x90, 0x8a, 0xba, 0xbc, 0x8d, 0xf0, 0xc8, 0x9b, 0xbc, 0xc6, - 0x39, 0xfd, 0x06, 0x3e, 0x06, 0x8b, 0x97, 0x24, 0xed, 0x77, 0xc9, 0x6f, 0xa0, 0x5f, 0xaa, 0xbb, - 0x8c, 0x95, 0x45, 0x97, 0xf1, 0x1e, 0x38, 0x7e, 0x32, 0x9d, 0x86, 0x44, 0x5b, 0xd5, 0xc9, 0x39, - 0x21, 0x46, 0xd2, 0xfd, 0x53, 0x03, 0xda, 0xfa, 0xb6, 0xac, 0x03, 0xed, 0xdd, 0xc1, 0xb3, 0xed, - 0x93, 0x7d, 0xf4, 0x5a, 0x00, 0xd6, 0xd3, 0xbd, 0xc3, 0x6d, 0xfe, 0xcb, 0x9e, 0x81, 0xcf, 0x6c, - 0xef, 0x70, 0xd4, 0x33, 0x99, 0x03, 0xad, 0x67, 0xfb, 0x47, 0xdb, 0xa3, 0x5e, 0x03, 0xdf, 0xd9, - 0xd3, 0xa3, 0xa3, 0xfd, 0x5e, 0x93, 0x75, 0xc1, 0xde, 0xdd, 0x1e, 0x0d, 0x46, 0x7b, 0x07, 0x83, - 0x5e, 0x0b, 0x79, 0x9f, 0x0f, 0x8e, 0x7a, 0x16, 0x0e, 0x4e, 0xf6, 0x76, 0x7b, 0x6d, 0xa4, 0x1f, - 0x6f, 0x0f, 0x87, 0x5f, 0x1d, 0xf1, 0xdd, 0x9e, 0x8d, 0xeb, 0x0e, 0x47, 0x7c, 0xef, 0xf0, 0x79, - 0xcf, 0xc1, 0xf1, 0xd1, 0xd3, 0x2f, 0x07, 0x3b, 0xa3, 0x1e, 0xb8, 0x9f, 0x41, 0xa7, 0x26, 0x41, - 0x9c, 0xcd, 0x07, 0xcf, 0x7a, 0x37, 0x70, 0xcb, 0x97, 0xdb, 0xfb, 0x27, 0x83, 0x9e, 0xc1, 0x56, - 0x01, 0x68, 0x38, 0xde, 0xdf, 0x3e, 0x7c, 0xde, 0x33, 0xdd, 0x5f, 0x80, 0x7d, 0x12, 0x06, 0x4f, - 0xa3, 0xc4, 0xbf, 0x40, 0xc3, 0x38, 0xf5, 0xa4, 0xd0, 0xa1, 0x9e, 0xc6, 0x18, 0x8b, 0xc8, 0x28, - 0xa5, 0xd6, 0xbd, 0x86, 0x50, 0x56, 0xf1, 0x6c, 0x3a, 0xa6, 0xfe, 0x59, 0x43, 0x79, 0xde, 0x78, - 0x36, 0x3d, 0x09, 0x03, 0xe9, 0x1e, 0x42, 0xfb, 0x24, 0x0c, 0x8e, 0x3d, 0xff, 0x02, 0xdd, 0xd1, - 0x29, 0x2e, 0x3d, 0x96, 0xe1, 0x37, 0x42, 0x7b, 0x68, 0x87, 0x30, 0xc3, 0xf0, 0x1b, 0xc1, 0x3e, - 0x04, 0x8b, 0x80, 0x22, 0x1b, 0x24, 0x33, 0x2f, 0x8e, 0xc3, 0x35, 0xcd, 0xfd, 0x73, 0xa3, 0xbc, - 0x16, 0xb5, 0x4d, 0xee, 0x41, 0x33, 0xf5, 0xfc, 0x0b, 0xed, 0x83, 0x3a, 0x7a, 0x0e, 0xee, 0xc7, - 0x89, 0xc0, 0xee, 0x83, 0xad, 0x6d, 0xa7, 0x58, 0xb8, 0x53, 0x33, 0x32, 0x5e, 0x12, 0x17, 0xb5, - 0xda, 0x58, 0xd4, 0x2a, 0xde, 0x5c, 0xa6, 0x51, 0x48, 0x15, 0x70, 0x03, 0x7d, 0x95, 0x82, 0xdc, - 0x9f, 0x00, 0x54, 0x3d, 0xa9, 0x6b, 0x0a, 0xa8, 0xdb, 0xd0, 0xf2, 0xa2, 0x50, 0x0b, 0xcc, 0xe1, - 0x0a, 0x70, 0x0f, 0xa1, 0x53, 0xeb, 0x64, 0xa1, 0xf8, 0xbc, 0x28, 0x1a, 0x5f, 0x88, 0x2b, 0x49, - 0x73, 0x6d, 0xde, 0xf6, 0xa2, 0xe8, 0x85, 0xb8, 0x92, 0x18, 0x17, 0x54, 0x13, 0xcc, 0x5c, 0xea, - 0xaa, 0xd0, 0x54, 0xae, 0x88, 0xee, 0xa7, 0x60, 0xa9, 0x56, 0x4b, 0xcd, 0xd2, 0x8d, 0xd7, 0x46, - 0xd3, 0x2f, 0xf4, 0x99, 0xa9, 0x31, 0xc3, 0x1e, 0xea, 0x66, 0x9b, 0x54, 0xad, 0x3d, 0xa3, 0xca, - 0x5f, 0x15, 0x93, 0xee, 0xb3, 0x11, 0xb3, 0xbb, 0x0b, 0xf6, 0x1b, 0xdb, 0x97, 0x5a, 0x00, 0x66, - 0x25, 0x80, 0x6b, 0x1a, 0x9a, 0xee, 0xaf, 0x00, 0xaa, 0xa6, 0x9c, 0x7e, 0x78, 0x6a, 0x15, 0x7c, - 0x78, 0x0f, 0xb0, 0xf2, 0x0d, 0xa3, 0x20, 0x13, 0xf1, 0xc2, 0xad, 0xab, 0x36, 0x5e, 0x49, 0x67, - 0xeb, 0xd0, 0xa4, 0x5e, 0x63, 0xa3, 0x72, 0x8c, 0x65, 0xa3, 0x91, 0x28, 0xee, 0x1c, 0x56, 0x54, - 0x90, 0xe6, 0xe2, 0x0f, 0x67, 0x42, 0xbe, 0x31, 0xf5, 0xbb, 0x0b, 0x50, 0xba, 0xf1, 0xa2, 0x6b, - 0x5a, 0xc3, 0xa0, 0x11, 0x9c, 0x85, 0x22, 0x0a, 0x8a, 0xdb, 0x68, 0x08, 0x95, 0xac, 0x82, 0x77, - 0x53, 0xb5, 0x96, 0x08, 0x70, 0x7f, 0x07, 0xba, 0xc5, 0xce, 0xd4, 0xbb, 0x79, 0x58, 0x26, 0x10, - 0x4a, 0xc6, 0xaa, 0xa8, 0x53, 0x2c, 0x58, 0x05, 0x3f, 0x35, 0xfb, 0x46, 0x91, 0x43, 0xb8, 0xff, - 0xd1, 0x28, 0x66, 0xeb, 0x56, 0xc6, 0x42, 0x5a, 0x6a, 0x2c, 0xa7, 0xa5, 0x8b, 0x29, 0x9e, 0xf9, - 0x1b, 0xa5, 0x78, 0x3f, 0x05, 0x27, 0xa0, 0x3c, 0x27, 0xbc, 0x2c, 0x5c, 0xf6, 0xda, 0x72, 0x4e, - 0xa3, 0x33, 0xa1, 0xf0, 0x52, 0xf0, 0x8a, 0x19, 0xcf, 0x92, 0x27, 0x17, 0x22, 0x0e, 0xbf, 0xa1, - 0x5e, 0x0d, 0xde, 0xb9, 0x42, 0x54, 0x8d, 0x2f, 0x95, 0xee, 0xe8, 0xc6, 0x57, 0xd1, 0xc3, 0xb3, - 0xaa, 0x1e, 0x1e, 0xca, 0x73, 0x96, 0x4a, 0x91, 0xe5, 0x45, 0x82, 0xac, 0xa0, 0x32, 0x97, 0x74, - 0x34, 0x2f, 0xe6, 0x92, 0xef, 0x43, 0x37, 0x4e, 0xe2, 0x71, 0x3c, 0x8b, 0x22, 0x4c, 0xe1, 0x75, - 0xbb, 0xb6, 0x13, 0x27, 0xf1, 0xa1, 0x46, 0xb1, 0x07, 0x70, 0xab, 0xce, 0xa2, 0xec, 0xb9, 0xa3, - 0xba, 0x3d, 0x35, 0x3e, 0xb2, 0xfa, 0x0d, 0xe8, 0x25, 0xa7, 0xbf, 0x12, 0x7e, 0x4e, 0x12, 0x1b, - 0x93, 0x21, 0x77, 0x55, 0xe0, 0x56, 0x78, 0x14, 0xd1, 0xa1, 0x37, 0x15, 0xee, 0x17, 0xe0, 0x94, - 0x42, 0xa8, 0x25, 0x4a, 0x0e, 0xb4, 0xf6, 0x0e, 0x77, 0x07, 0xbf, 0xd7, 0x33, 0xd0, 0xcb, 0xf3, - 0xc1, 0xcb, 0x01, 0x1f, 0x0e, 0x7a, 0x26, 0x7a, 0xe0, 0xdd, 0xc1, 0xfe, 0x60, 0x34, 0xe8, 0x35, - 0xbe, 0x6c, 0xda, 0xed, 0x9e, 0x4d, 0x9d, 0x8c, 0x28, 0xf4, 0xc3, 0xdc, 0x1d, 0x02, 0x54, 0x39, - 0x1d, 0xfa, 0x9b, 0x6a, 0x6f, 0xa5, 0x51, 0x3b, 0xd7, 0xbb, 0x62, 0xb6, 0xa9, 0x4d, 0xcd, 0x7c, - 0x5d, 0xb6, 0xa9, 0xe8, 0xee, 0x09, 0xd8, 0x07, 0x5e, 0xfa, 0x4a, 0x75, 0xd6, 0x2d, 0x3b, 0x02, - 0x33, 0xdd, 0x7d, 0xd3, 0xe1, 0xfb, 0x23, 0x68, 0x6b, 0x97, 0xa7, 0x5f, 0xcd, 0x82, 0x3b, 0x2c, - 0x68, 0xee, 0x9f, 0x18, 0x70, 0xfb, 0x20, 0xb9, 0x14, 0x65, 0x06, 0x73, 0xec, 0x5d, 0x45, 0x89, - 0x17, 0x7c, 0x87, 0x21, 0xfe, 0x18, 0x40, 0x26, 0xb3, 0xcc, 0x17, 0xe3, 0x49, 0xd9, 0xf4, 0x73, - 0x14, 0xe6, 0xb9, 0xfe, 0xbe, 0x20, 0x64, 0x4e, 0x44, 0x1d, 0x28, 0x10, 0x46, 0xd2, 0xdb, 0x60, - 0xe5, 0xf3, 0xb8, 0xea, 0x31, 0xb6, 0x72, 0x2c, 0xbc, 0xdd, 0x1d, 0x70, 0x46, 0x73, 0x2a, 0x18, - 0x67, 0x72, 0x21, 0x26, 0x1b, 0x6f, 0x88, 0xc9, 0xe6, 0x52, 0x4c, 0xfe, 0x6f, 0x03, 0x3a, 0xb5, - 0xd4, 0x8a, 0xbd, 0x0f, 0xcd, 0x7c, 0x1e, 0x2f, 0x36, 0xe7, 0x8b, 0x4d, 0x38, 0x91, 0xd0, 0xde, - 0xb0, 0x9a, 0xf4, 0xa4, 0x0c, 0x27, 0xb1, 0x08, 0xf4, 0x92, 0x58, 0x61, 0x6e, 0x6b, 0x14, 0xdb, - 0x87, 0x9b, 0xca, 0x93, 0x14, 0x8d, 0xb9, 0xa2, 0x86, 0xf8, 0x60, 0x29, 0x95, 0x53, 0x45, 0xf5, - 0x4e, 0xc1, 0xa5, 0x9a, 0x12, 0xab, 0x93, 0x05, 0xe4, 0xda, 0x36, 0xbc, 0x75, 0x0d, 0xdb, 0xf7, - 0xea, 0xbe, 0xdc, 0x83, 0x95, 0xd1, 0x3c, 0x1e, 0x85, 0x53, 0x21, 0x73, 0x6f, 0x9a, 0x52, 0x4e, - 0xa3, 0x23, 0x41, 0x93, 0x9b, 0xb9, 0x74, 0x3f, 0x86, 0xee, 0xb1, 0x10, 0x19, 0x17, 0x32, 0x4d, - 0x62, 0x15, 0xcf, 0x25, 0x5d, 0x5a, 0x87, 0x1d, 0x0d, 0xb9, 0x7f, 0x00, 0x0e, 0x26, 0xf2, 0x4f, - 0xbd, 0xdc, 0x3f, 0xff, 0x3e, 0x89, 0xfe, 0xc7, 0xd0, 0x4e, 0x95, 0x99, 0xe8, 0xdc, 0xbb, 0x4b, - 0x3e, 0x4e, 0x9b, 0x0e, 0x2f, 0x88, 0x2e, 0x87, 0xc6, 0xe1, 0x6c, 0x5a, 0xff, 0xa2, 0xd6, 0x54, - 0x5f, 0xd4, 0x16, 0x4a, 0x63, 0x73, 0xb1, 0x34, 0x46, 0xcb, 0x3b, 0x4b, 0xb2, 0x3f, 0xf2, 0xb2, - 0x40, 0x04, 0xba, 0xfe, 0xae, 0x10, 0xee, 0xd7, 0xd0, 0x29, 0x34, 0xb3, 0x17, 0xd0, 0x47, 0x33, - 0x32, 0x8d, 0xbd, 0x60, 0xc1, 0x52, 0x54, 0xfd, 0x2a, 0xe2, 0x60, 0xaf, 0x50, 0xa9, 0x02, 0x16, - 0x77, 0xd6, 0xdd, 0x9f, 0xb2, 0x28, 0x7f, 0x06, 0xdd, 0x22, 0xdf, 0x3e, 0x10, 0xb9, 0x47, 0xc6, - 0x16, 0x85, 0x22, 0xae, 0x19, 0xa2, 0xad, 0x10, 0x23, 0xf9, 0x86, 0xae, 0xb7, 0xbb, 0x09, 0x96, - 0xb6, 0x64, 0x06, 0x4d, 0x3f, 0x09, 0xd4, 0x03, 0x6a, 0x71, 0x1a, 0xa3, 0x38, 0xa6, 0x72, 0x52, - 0x04, 0xcf, 0xa9, 0x9c, 0xb8, 0xff, 0x6c, 0xc2, 0xca, 0x53, 0xcf, 0xbf, 0x98, 0xa5, 0x45, 0xf4, - 0xaa, 0x15, 0x4d, 0xc6, 0x42, 0xd1, 0x54, 0x2f, 0x90, 0xcc, 0x85, 0x02, 0x69, 0xe1, 0x40, 0x8d, - 0xc5, 0x88, 0xf7, 0x0e, 0xb4, 0x67, 0x71, 0x38, 0x2f, 0x5e, 0x9d, 0xc3, 0x2d, 0x04, 0x47, 0x92, - 0xad, 0x43, 0x07, 0x1f, 0x66, 0x18, 0x53, 0xa9, 0x44, 0x02, 0x71, 0x78, 0x1d, 0x85, 0x2f, 0xdd, - 0xf3, 0x7d, 0x21, 0x25, 0xe6, 0x2d, 0x3a, 0xdd, 0x76, 0x14, 0xe6, 0x85, 0xb8, 0x22, 0x47, 0x20, - 0xfc, 0x4c, 0xe4, 0xe3, 0xaa, 0xec, 0x71, 0x14, 0x06, 0xc9, 0x1f, 0xc0, 0x8a, 0x14, 0x52, 0x86, - 0x49, 0x3c, 0xa6, 0xc8, 0xa1, 0xab, 0xd3, 0xae, 0x46, 0x8e, 0x10, 0x87, 0x0a, 0xf7, 0xe2, 0x24, - 0xbe, 0x9a, 0x26, 0x33, 0xa9, 0x83, 0x41, 0x85, 0x58, 0x8a, 0xd6, 0xb0, 0x1c, 0xad, 0xdd, 0x1c, - 0x56, 0x06, 0xf3, 0x94, 0xbe, 0x9d, 0x7c, 0x67, 0xe4, 0xaf, 0x89, 0xd5, 0x5c, 0x10, 0x6b, 0x4d, - 0x40, 0xaa, 0x2f, 0x5d, 0x08, 0x08, 0x73, 0x81, 0x24, 0x9b, 0x7a, 0x79, 0x21, 0x38, 0x05, 0xb9, - 0x7f, 0x61, 0x82, 0xa3, 0x54, 0x86, 0xd7, 0xfc, 0x04, 0x9a, 0x14, 0x91, 0x0d, 0x0a, 0xaf, 0x6f, - 0xe3, 0xc3, 0x29, 0x89, 0x9b, 0x2f, 0xc4, 0x15, 0xc5, 0x64, 0x62, 0xb9, 0xb6, 0x9f, 0xa3, 0xbd, - 0xb7, 0x4a, 0x46, 0xc9, 0x7b, 0xbf, 0x07, 0x8e, 0xf2, 0x80, 0x88, 0xd7, 0xdf, 0x05, 0x08, 0x71, - 0x12, 0xd2, 0x47, 0x95, 0x5c, 0x64, 0x53, 0xad, 0x2d, 0x1a, 0x57, 0xd1, 0xd8, 0x52, 0x5f, 0x7a, - 0x08, 0x70, 0xcf, 0xa1, 0xad, 0x77, 0xc7, 0xe8, 0x75, 0x72, 0xf8, 0xe2, 0xf0, 0xe8, 0xab, 0xc3, - 0xde, 0x8d, 0xb2, 0xea, 0x37, 0xaa, 0xf8, 0x66, 0xd6, 0xe3, 0x5b, 0x03, 0xf1, 0x3b, 0x47, 0x27, - 0x87, 0xa3, 0x5e, 0x93, 0xad, 0x80, 0x43, 0xc3, 0x31, 0x1f, 0xbc, 0xec, 0xb5, 0xa8, 0x0e, 0xd9, - 0xf9, 0xf9, 0xe0, 0x60, 0xbb, 0x67, 0x95, 0x3d, 0x83, 0x36, 0xc6, 0x91, 0x5b, 0xea, 0xca, 0xf5, - 0xac, 0xbd, 0xfe, 0xb1, 0xbd, 0xa9, 0x3e, 0xb6, 0xff, 0xb0, 0x89, 0xfa, 0xd6, 0xbf, 0x18, 0xd0, - 0x44, 0x9f, 0xc5, 0x1e, 0x82, 0xf3, 0x73, 0xe1, 0x65, 0xf9, 0xa9, 0xf0, 0x72, 0xb6, 0xe0, 0x9f, - 0xd6, 0x16, 0x20, 0xf7, 0xc6, 0x13, 0x83, 0x6d, 0xaa, 0xcf, 0x68, 0xc5, 0xd7, 0xc1, 0x95, 0xc2, - 0xf3, 0x91, 0x67, 0x5c, 0xe6, 0xdf, 0x20, 0xfe, 0x2f, 0x93, 0x30, 0xde, 0x51, 0xdf, 0x96, 0xd8, - 0xb2, 0xa7, 0x5c, 0x9e, 0xc1, 0x1e, 0x81, 0xb5, 0x27, 0xd1, 0x25, 0xbf, 0xca, 0x4a, 0x11, 0xbf, - 0xee, 0xad, 0xdd, 0x1b, 0x5b, 0xff, 0xd8, 0x80, 0xe6, 0xd7, 0x22, 0x4b, 0xd8, 0xa7, 0xd0, 0xd6, - 0xdd, 0x54, 0x56, 0xeb, 0x9a, 0xae, 0x51, 0xca, 0xb7, 0xd4, 0x66, 0xa5, 0x5d, 0x7a, 0x2a, 0x69, - 0xa8, 0x9a, 0x18, 0xac, 0x6a, 0xf6, 0xbe, 0x72, 0xa8, 0x2f, 0xa0, 0x37, 0xcc, 0x33, 0xe1, 0x4d, - 0x6b, 0xec, 0x8b, 0x82, 0xba, 0xae, 0x23, 0x42, 0xf2, 0x7a, 0x08, 0x96, 0x8a, 0x7b, 0x4b, 0x13, - 0x96, 0x9b, 0x1b, 0xc4, 0x7c, 0x1f, 0x3a, 0xc3, 0xf3, 0x64, 0x16, 0x05, 0x43, 0x91, 0x5d, 0x0a, - 0x56, 0xfb, 0xbe, 0xb2, 0x56, 0x1b, 0xbb, 0x37, 0xd8, 0x06, 0x80, 0x72, 0xed, 0x58, 0x51, 0xb2, - 0x36, 0xd2, 0x0e, 0x67, 0x53, 0xb5, 0x68, 0xcd, 0xe7, 0x2b, 0xce, 0x5a, 0xf8, 0x7b, 0x13, 0xe7, - 0xe7, 0xb0, 0xb2, 0x43, 0x36, 0x73, 0x94, 0x6d, 0x9f, 0x26, 0x59, 0xce, 0x96, 0xbf, 0xb1, 0xac, - 0x2d, 0x23, 0xdc, 0x1b, 0xec, 0x09, 0xd8, 0xa3, 0xec, 0x4a, 0xf1, 0xdf, 0xd2, 0x59, 0x43, 0xb5, - 0xdf, 0x35, 0xb7, 0xdc, 0xfa, 0xbb, 0x06, 0x58, 0x5f, 0x25, 0xd9, 0x85, 0xc8, 0xd8, 0x03, 0xb0, - 0xa8, 0x0b, 0xa5, 0xcd, 0xa8, 0xec, 0x48, 0x5d, 0xb7, 0xd1, 0x87, 0xe0, 0x90, 0x50, 0x46, 0x9e, - 0xbc, 0x50, 0xaa, 0xa2, 0xbf, 0x79, 0x28, 0xb9, 0xa8, 0x7a, 0x82, 0xf4, 0xba, 0xaa, 0x14, 0x55, - 0x36, 0xe5, 0x16, 0x5a, 0x43, 0x6b, 0x6d, 0xd5, 0xe7, 0x19, 0xa2, 0x69, 0x3e, 0x31, 0xd0, 0x19, - 0x0d, 0xd5, 0x4d, 0x91, 0xa9, 0xfa, 0xe8, 0xbd, 0xb6, 0x5a, 0x20, 0xca, 0x95, 0x1f, 0x83, 0xa5, - 0x92, 0x4d, 0x75, 0xcd, 0x85, 0x0a, 0x6a, 0xad, 0x57, 0x47, 0xe9, 0x09, 0x9f, 0x80, 0xa5, 0x5e, - 0xb9, 0x9a, 0xb0, 0x10, 0xb4, 0xd4, 0xa9, 0x55, 0xe0, 0x53, 0xac, 0xca, 0x2f, 0x2b, 0xd6, 0x05, - 0x1f, 0xbd, 0xc4, 0xfa, 0x08, 0x7a, 0x5c, 0xf8, 0x22, 0xac, 0xa5, 0xa1, 0xac, 0xb8, 0xd4, 0x35, - 0xaf, 0xef, 0x0b, 0x58, 0x59, 0x48, 0x59, 0x59, 0x9f, 0x04, 0x7d, 0x4d, 0x16, 0xbb, 0x3c, 0xf9, - 0x69, 0xef, 0xdf, 0xbe, 0xbd, 0x6b, 0xfc, 0xfb, 0xb7, 0x77, 0x8d, 0xff, 0xfc, 0xf6, 0xae, 0xf1, - 0xeb, 0xff, 0xba, 0x7b, 0xe3, 0xd4, 0xa2, 0xbf, 0x07, 0x7d, 0xfe, 0x7f, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x4d, 0x26, 0x38, 0x05, 0x62, 0x24, 0x00, 0x00, + 0x09, 0x23, 0x4d, 0xcc, 0xd3, 0x30, 0xbb, 0x1a, 0x29, 0x59, 0x34, 0x78, 0x09, 0x63, 0x9c, 0x10, + 0x31, 0xee, 0x19, 0x14, 0x21, 0x49, 0x83, 0xee, 0xdf, 0x37, 0xa0, 0xfb, 0x8d, 0xc8, 0x92, 0xe3, + 0x2c, 0x49, 0x13, 0xe9, 0x45, 0x6c, 0x7b, 0x51, 0xaa, 0x4a, 0x7b, 0xeb, 0x78, 0xe8, 0x3a, 0xdb, + 0xe6, 0xb0, 0x14, 0xb3, 0xd2, 0x4a, 0x5d, 0xee, 0x2e, 0x58, 0x4a, 0xab, 0xd7, 0x88, 0x4e, 0x53, + 0x90, 0x47, 0xe9, 0x91, 0xce, 0xba, 0x28, 0x16, 0x4d, 0x61, 0x77, 0x01, 0xa6, 0xde, 0x7c, 0x5f, + 0x78, 0x52, 0xec, 0x05, 0xc5, 0xb3, 0xa9, 0x30, 0x5a, 0x1a, 0xa3, 0x79, 0x3c, 0x92, 0x64, 0xd5, + 0x4a, 0x1a, 0x04, 0xb3, 0x1f, 0x80, 0x33, 0xf5, 0xe6, 0xf8, 0x7e, 0xf7, 0x02, 0x6d, 0xd5, 0x15, + 0x82, 0x7d, 0x08, 0x8d, 0x7c, 0x1e, 0x93, 0x33, 0xc4, 0xa8, 0x88, 0x29, 0xcf, 0x68, 0x1e, 0xeb, + 0x97, 0xce, 0x91, 0x56, 0x28, 0xd2, 0xae, 0x14, 0xd9, 0x83, 0x86, 0x1f, 0x06, 0x14, 0x16, 0x1d, + 0x8e, 0x43, 0xb6, 0x09, 0x20, 0x4a, 0xa5, 0x51, 0xf4, 0xd3, 0x4e, 0xbb, 0x52, 0x25, 0xaf, 0x71, + 0xac, 0xfd, 0x3e, 0xdc, 0x5e, 0x92, 0x5b, 0xdd, 0x5e, 0x56, 0xd4, 0x36, 0xef, 0xd4, 0xed, 0xa5, + 0x59, 0xb7, 0x91, 0xff, 0x69, 0xc0, 0x6d, 0x6d, 0xb4, 0xe7, 0x61, 0x3a, 0xcc, 0xf1, 0x79, 0xf6, + 0xa1, 0x4d, 0x5e, 0x51, 0x64, 0xda, 0x76, 0x0b, 0x90, 0xfd, 0x2e, 0x58, 0xe4, 0x29, 0x8a, 0xf7, + 0x74, 0xaf, 0xd2, 0x42, 0x39, 0x5d, 0xbd, 0x2f, 0xad, 0x42, 0xcd, 0xce, 0x7e, 0x0c, 0xad, 0x6f, + 0x45, 0x96, 0x28, 0x2f, 0xdf, 0xd9, 0xba, 0x7b, 0xdd, 0x3c, 0xb4, 0x05, 0x3d, 0x4d, 0x31, 0xff, + 0x16, 0x95, 0xf5, 0x31, 0xfa, 0xf5, 0x69, 0x72, 0x29, 0x82, 0x7e, 0x9b, 0x4e, 0x54, 0xb7, 0xa7, + 0x82, 0x54, 0x68, 0xc7, 0xbe, 0x49, 0x3b, 0xce, 0x1b, 0xb5, 0xb3, 0x0b, 0x9d, 0x9a, 0x38, 0xae, + 0xd1, 0xcc, 0xbd, 0xc5, 0x97, 0xec, 0x94, 0x0e, 0xaa, 0xee, 0x10, 0x76, 0x01, 0x2a, 0xe1, 0xfc, + 0xa6, 0x6e, 0xc5, 0xfd, 0x13, 0x03, 0x6e, 0xef, 0x24, 0x71, 0x2c, 0x28, 0xe1, 0x53, 0xaa, 0xae, + 0x9e, 0x95, 0x71, 0xe3, 0xb3, 0xfa, 0x0c, 0x5a, 0x12, 0x99, 0xf5, 0xea, 0x6f, 0x5f, 0xa3, 0x3b, + 0xae, 0x38, 0xd0, 0x7d, 0x4e, 0xbd, 0xf9, 0x38, 0x15, 0x71, 0x10, 0xc6, 0x93, 0xc2, 0x7d, 0x4e, + 0xbd, 0xf9, 0xb1, 0xc2, 0xb8, 0x7f, 0x6b, 0x80, 0xa5, 0x5e, 0xe4, 0x42, 0x14, 0x32, 0x16, 0xa3, + 0xd0, 0x0f, 0xc0, 0x49, 0x33, 0x11, 0x84, 0x7e, 0xb1, 0xab, 0xc3, 0x2b, 0x04, 0x1a, 0xf3, 0x59, + 0x92, 0xf9, 0x82, 0x96, 0xb7, 0xb9, 0x02, 0x10, 0x2b, 0x53, 0xcf, 0x57, 0x49, 0x6b, 0x83, 0x2b, + 0x00, 0x9d, 0x9e, 0x52, 0x26, 0x29, 0xd1, 0xe6, 0x1a, 0xc2, 0x6c, 0x9b, 0xe2, 0x3a, 0x45, 0x1e, + 0x87, 0x48, 0x36, 0x22, 0x28, 0xe4, 0xfc, 0x83, 0x09, 0xdd, 0xdd, 0x30, 0x13, 0x7e, 0x2e, 0x82, + 0x41, 0x30, 0x59, 0x76, 0x9d, 0x56, 0xe9, 0x3a, 0x8b, 0x1c, 0xc7, 0x5c, 0xcc, 0xee, 0x95, 0x2e, + 0x1a, 0x54, 0x90, 0x28, 0x80, 0x6d, 0x01, 0xa8, 0xec, 0x8f, 0x8a, 0x92, 0xe6, 0xcd, 0x45, 0x89, + 0x43, 0x6c, 0x38, 0x44, 0x01, 0xa9, 0x39, 0xa1, 0x0a, 0xb0, 0x16, 0x55, 0x2c, 0x33, 0x34, 0x7c, + 0x4a, 0x9a, 0x4e, 0x45, 0x44, 0x86, 0x4d, 0x49, 0xd3, 0xa9, 0x88, 0xca, 0x54, 0xb5, 0xad, 0x8e, + 0x83, 0x63, 0xf6, 0x11, 0x98, 0x49, 0x4a, 0x97, 0xd7, 0x1b, 0xd6, 0x2f, 0xb6, 0x79, 0x94, 0x72, + 0x33, 0x49, 0xd1, 0x0a, 0x54, 0x06, 0xde, 0x77, 0xf4, 0x63, 0x40, 0xef, 0x45, 0x59, 0x22, 0xd7, + 0x14, 0xf7, 0x0e, 0x98, 0x47, 0x29, 0x6b, 0x43, 0x63, 0x38, 0x18, 0xf5, 0x6e, 0xe1, 0x60, 0x77, + 0xb0, 0xdf, 0x33, 0xdc, 0xff, 0x35, 0xc1, 0x39, 0x98, 0xe5, 0x1e, 0xda, 0x94, 0x7c, 0x9d, 0x52, + 0xdf, 0x07, 0x5b, 0xe6, 0x5e, 0x46, 0x11, 0x40, 0xb9, 0xa1, 0x36, 0xc1, 0x23, 0xc9, 0x3e, 0x85, + 0x96, 0x08, 0x26, 0xa2, 0xf0, 0x0e, 0xbd, 0xe5, 0x73, 0x72, 0x45, 0x66, 0x1b, 0x60, 0x49, 0xff, + 0x5c, 0x4c, 0xbd, 0x7e, 0xb3, 0x62, 0x1c, 0x12, 0x46, 0x65, 0x16, 0x5c, 0xd3, 0xd9, 0x16, 0xbc, + 0x1b, 0x4e, 0xe2, 0x24, 0x13, 0xe3, 0x30, 0x0e, 0xc4, 0x7c, 0xec, 0x27, 0xf1, 0x59, 0x14, 0xfa, + 0xb9, 0xce, 0x54, 0xde, 0x56, 0xc4, 0x3d, 0xa4, 0xed, 0x68, 0x12, 0xfb, 0x18, 0x5a, 0xa8, 0x1d, + 0xa9, 0xf3, 0x5e, 0x7a, 0xd6, 0xa8, 0x08, 0xbd, 0xb4, 0x22, 0xb2, 0x47, 0xd0, 0x0e, 0xb2, 0x24, + 0x1d, 0x27, 0x29, 0xc9, 0x79, 0x75, 0xeb, 0x1d, 0x7a, 0x0f, 0x85, 0x04, 0x36, 0x77, 0xb3, 0x24, + 0x3d, 0x4a, 0xb9, 0x15, 0xd0, 0x2f, 0x16, 0x33, 0xc4, 0xae, 0x6c, 0x42, 0x79, 0x12, 0x07, 0x31, + 0x94, 0xf4, 0xbb, 0x8f, 0xc1, 0x52, 0x13, 0x98, 0x0d, 0xcd, 0xc3, 0xa3, 0xc3, 0x81, 0x12, 0xed, + 0xf6, 0xfe, 0x7e, 0xcf, 0x40, 0xd4, 0xee, 0xf6, 0x68, 0xbb, 0x67, 0xe2, 0x68, 0xf4, 0x8b, 0xe3, + 0x41, 0xaf, 0xe1, 0xfe, 0x95, 0x01, 0x76, 0xe1, 0xef, 0xd9, 0x67, 0xe8, 0xa8, 0x29, 0xbe, 0xe8, + 0xe7, 0x4b, 0xc5, 0x58, 0x2d, 0xc1, 0xe4, 0x05, 0x1d, 0x2d, 0x86, 0x24, 0x51, 0x44, 0x00, 0x02, + 0xea, 0xe9, 0x6d, 0x63, 0xa1, 0x96, 0xc2, 0x4c, 0x3d, 0x89, 0x85, 0x8e, 0xec, 0x34, 0x26, 0x05, + 0x86, 0xb1, 0x2f, 0x90, 0xbb, 0xa5, 0x15, 0x88, 0xf0, 0x48, 0xba, 0x7f, 0x6d, 0x82, 0x5d, 0x46, + 0xfb, 0x87, 0xe0, 0x4c, 0x0b, 0x71, 0x68, 0x9f, 0xb1, 0xb2, 0x20, 0x23, 0x5e, 0xd1, 0xd9, 0x1d, + 0x30, 0x2f, 0x2e, 0xb5, 0x3a, 0x2d, 0xe4, 0x7a, 0xf1, 0x92, 0x9b, 0x17, 0x97, 0x95, 0xd3, 0x69, + 0xbd, 0xd1, 0xe9, 0xdc, 0x87, 0xdb, 0x7e, 0x24, 0xbc, 0x78, 0x5c, 0xf9, 0x0c, 0xf5, 0x2c, 0x56, + 0x09, 0x7d, 0x5c, 0x3a, 0x0e, 0xed, 0x38, 0xdb, 0x55, 0xf8, 0xfd, 0x04, 0x5a, 0x81, 0x88, 0x72, + 0xaf, 0x5e, 0xcb, 0x1e, 0x65, 0x9e, 0x1f, 0x89, 0x5d, 0x44, 0x73, 0x45, 0x65, 0x1b, 0x60, 0x17, + 0xa9, 0x88, 0xf6, 0xf9, 0x54, 0x14, 0x15, 0x7a, 0xe0, 0x25, 0xb5, 0x12, 0x33, 0xd4, 0xc4, 0xec, + 0x7e, 0x0e, 0x8d, 0x17, 0x2f, 0x87, 0xfa, 0xae, 0xc6, 0x2b, 0x77, 0x2d, 0x84, 0x6d, 0x56, 0xc2, + 0x76, 0xff, 0xaf, 0x01, 0x6d, 0xed, 0x1b, 0xf0, 0xdc, 0xb3, 0x32, 0x81, 0xc7, 0xe1, 0x62, 0x3c, + 0x2f, 0x9d, 0x4c, 0xbd, 0xef, 0xd1, 0x78, 0x73, 0xdf, 0x83, 0xfd, 0x14, 0xba, 0xa9, 0xa2, 0xd5, + 0xdd, 0xd2, 0x7b, 0xf5, 0x39, 0xfa, 0x97, 0xe6, 0x75, 0xd2, 0x0a, 0x40, 0x63, 0xa0, 0x52, 0x31, + 0xf7, 0x26, 0xa4, 0xa2, 0x2e, 0x6f, 0x23, 0x3c, 0xf2, 0x26, 0x37, 0x38, 0xa7, 0x5f, 0xc3, 0xc7, + 0x60, 0xa1, 0x92, 0xa4, 0xfd, 0x2e, 0xf9, 0x0d, 0xf4, 0x4b, 0x75, 0x97, 0xb1, 0xb2, 0xe8, 0x32, + 0x3e, 0x00, 0xc7, 0x4f, 0xa6, 0xd3, 0x90, 0x68, 0xab, 0x3a, 0x11, 0x27, 0xc4, 0x48, 0xba, 0x7f, + 0x66, 0x40, 0x5b, 0xdf, 0x96, 0x75, 0xa0, 0xbd, 0x3b, 0x78, 0xb6, 0x7d, 0xb2, 0x8f, 0x5e, 0x0b, + 0xc0, 0x7a, 0xba, 0x77, 0xb8, 0xcd, 0x7f, 0xd1, 0x33, 0xf0, 0x99, 0xed, 0x1d, 0x8e, 0x7a, 0x26, + 0x73, 0xa0, 0xf5, 0x6c, 0xff, 0x68, 0x7b, 0xd4, 0x6b, 0xe0, 0x3b, 0x7b, 0x7a, 0x74, 0xb4, 0xdf, + 0x6b, 0xb2, 0x2e, 0xd8, 0xbb, 0xdb, 0xa3, 0xc1, 0x68, 0xef, 0x60, 0xd0, 0x6b, 0x21, 0xef, 0xf3, + 0xc1, 0x51, 0xcf, 0xc2, 0xc1, 0xc9, 0xde, 0x6e, 0xaf, 0x8d, 0xf4, 0xe3, 0xed, 0xe1, 0xf0, 0xeb, + 0x23, 0xbe, 0xdb, 0xb3, 0x71, 0xdd, 0xe1, 0x88, 0xef, 0x1d, 0x3e, 0xef, 0x39, 0x38, 0x3e, 0x7a, + 0xfa, 0xd5, 0x60, 0x67, 0xd4, 0x03, 0xf7, 0x73, 0xe8, 0xd4, 0x24, 0x88, 0xb3, 0xf9, 0xe0, 0x59, + 0xef, 0x16, 0x6e, 0xf9, 0x72, 0x7b, 0xff, 0x64, 0xd0, 0x33, 0xd8, 0x2a, 0x00, 0x0d, 0xc7, 0xfb, + 0xdb, 0x87, 0xcf, 0x7b, 0xa6, 0xfb, 0x73, 0xb0, 0x4f, 0xc2, 0xe0, 0x69, 0x94, 0xf8, 0x17, 0x68, + 0x18, 0xa7, 0x9e, 0x14, 0x3a, 0xd4, 0xd3, 0x18, 0x63, 0x11, 0x19, 0xa5, 0xd4, 0xba, 0xd7, 0x10, + 0xca, 0x2a, 0x9e, 0x4d, 0xc7, 0xd4, 0x2b, 0x6b, 0x28, 0xcf, 0x1b, 0xcf, 0xa6, 0x27, 0x61, 0x20, + 0xdd, 0x43, 0x68, 0x9f, 0x84, 0xc1, 0xb1, 0xe7, 0x5f, 0xa0, 0x3b, 0x3a, 0xc5, 0xa5, 0xc7, 0x32, + 0xfc, 0x56, 0x68, 0x0f, 0xed, 0x10, 0x66, 0x18, 0x7e, 0x2b, 0xd8, 0xc7, 0x60, 0x11, 0x50, 0xe4, + 0x77, 0x64, 0xe6, 0xc5, 0x71, 0xb8, 0xa6, 0xb9, 0x7f, 0x61, 0x94, 0xd7, 0xa2, 0x16, 0xc9, 0x3d, + 0x68, 0xa6, 0x9e, 0x7f, 0xa1, 0x7d, 0x50, 0x47, 0xcf, 0xc1, 0xfd, 0x38, 0x11, 0xd8, 0x7d, 0xb0, + 0xb5, 0xed, 0x14, 0x0b, 0x77, 0x6a, 0x46, 0xc6, 0x4b, 0xe2, 0xa2, 0x56, 0x1b, 0x8b, 0x5a, 0xc5, + 0x9b, 0xcb, 0x34, 0x0a, 0xa9, 0xda, 0x6d, 0xa0, 0xaf, 0x52, 0x90, 0xfb, 0x63, 0x80, 0xaa, 0xff, + 0x74, 0x4d, 0xb1, 0xf4, 0x0e, 0xb4, 0xbc, 0x28, 0xd4, 0x02, 0x73, 0xb8, 0x02, 0xdc, 0x43, 0xe8, + 0xd4, 0xba, 0x56, 0x28, 0x3e, 0x2f, 0x8a, 0xc6, 0x17, 0xe2, 0x4a, 0xd2, 0x5c, 0x9b, 0xb7, 0xbd, + 0x28, 0x7a, 0x21, 0xae, 0x24, 0xc6, 0x05, 0xd5, 0xf0, 0x32, 0x97, 0x3a, 0x28, 0x34, 0x95, 0x2b, + 0xa2, 0xfb, 0x23, 0xb0, 0x54, 0x5b, 0xa5, 0x66, 0xe9, 0xc6, 0x8d, 0xd1, 0xf4, 0x4b, 0x7d, 0x66, + 0x6a, 0xc2, 0xb0, 0x87, 0xba, 0xb1, 0x26, 0x55, 0x1b, 0xcf, 0xa8, 0x32, 0x52, 0xc5, 0xa4, 0x7b, + 0x6a, 0xc4, 0xec, 0xee, 0x82, 0xfd, 0xda, 0x56, 0xa5, 0x16, 0x80, 0x59, 0x09, 0xe0, 0x9a, 0xe6, + 0xa5, 0xfb, 0x4b, 0x80, 0xaa, 0x01, 0xa7, 0x1f, 0x9e, 0x5a, 0x05, 0x1f, 0xde, 0x03, 0xac, 0x72, + 0xc3, 0x28, 0xc8, 0x44, 0xbc, 0x70, 0xeb, 0xaa, 0x65, 0x57, 0xd2, 0xd9, 0x3a, 0x34, 0xa9, 0xaf, + 0xd8, 0xa8, 0x1c, 0x63, 0xd9, 0x54, 0x24, 0x8a, 0x3b, 0x87, 0x15, 0x15, 0xa4, 0xb9, 0xf8, 0xa3, + 0x99, 0x90, 0xaf, 0x4d, 0xfd, 0xee, 0x02, 0x94, 0x6e, 0xbc, 0xe8, 0x90, 0xd6, 0x30, 0x68, 0x04, + 0x67, 0xa1, 0x88, 0x82, 0xe2, 0x36, 0x1a, 0x42, 0x25, 0xab, 0xe0, 0xdd, 0x54, 0x6d, 0x24, 0x02, + 0xdc, 0xdf, 0x83, 0x6e, 0xb1, 0x33, 0xf5, 0x69, 0x1e, 0x96, 0x09, 0x84, 0x92, 0xb1, 0x2a, 0xd3, + 0x14, 0x0b, 0x56, 0xbc, 0x4f, 0xcd, 0xbe, 0x51, 0xe4, 0x10, 0xee, 0x7f, 0x34, 0x8a, 0xd9, 0xba, + 0x6d, 0xb1, 0x90, 0x96, 0x1a, 0xcb, 0x69, 0xe9, 0x62, 0x8a, 0x67, 0xfe, 0x5a, 0x29, 0xde, 0x4f, + 0xc0, 0x09, 0x28, 0xcf, 0x09, 0x2f, 0x0b, 0x97, 0xbd, 0xb6, 0x9c, 0xd3, 0xe8, 0x4c, 0x28, 0xbc, + 0x14, 0xbc, 0x62, 0xc6, 0xb3, 0xe4, 0xc9, 0x85, 0x88, 0xc3, 0x6f, 0xa9, 0x2f, 0x83, 0x77, 0xae, + 0x10, 0x55, 0x93, 0x4b, 0xa5, 0x3b, 0xba, 0xc9, 0x55, 0xf4, 0xeb, 0xac, 0xaa, 0x5f, 0x87, 0xf2, + 0x9c, 0xa5, 0x52, 0x64, 0x79, 0x91, 0x20, 0x2b, 0xa8, 0xcc, 0x25, 0x1d, 0xcd, 0x8b, 0xb9, 0xe4, + 0x87, 0xd0, 0x8d, 0x93, 0x78, 0x1c, 0xcf, 0xa2, 0x08, 0x53, 0x78, 0xdd, 0x9a, 0xed, 0xc4, 0x49, + 0x7c, 0xa8, 0x51, 0xec, 0x01, 0xbc, 0x55, 0x67, 0x51, 0xf6, 0xdc, 0x51, 0x9d, 0x9d, 0x1a, 0x1f, + 0x59, 0xfd, 0x06, 0xf4, 0x92, 0xd3, 0x5f, 0x0a, 0x3f, 0x27, 0x89, 0x8d, 0xc9, 0x90, 0xbb, 0x2a, + 0x70, 0x2b, 0x3c, 0x8a, 0xe8, 0xd0, 0x9b, 0x0a, 0xf7, 0x4b, 0x70, 0x4a, 0x21, 0xd4, 0x12, 0x25, + 0x07, 0x5a, 0x7b, 0x87, 0xbb, 0x83, 0x3f, 0xe8, 0x19, 0xe8, 0xe5, 0xf9, 0xe0, 0xe5, 0x80, 0x0f, + 0x07, 0x3d, 0x13, 0x3d, 0xf0, 0xee, 0x60, 0x7f, 0x30, 0x1a, 0xf4, 0x1a, 0x5f, 0x35, 0xed, 0x76, + 0xcf, 0xa6, 0xae, 0x45, 0x14, 0xfa, 0x61, 0xee, 0x0e, 0x01, 0xaa, 0x9c, 0x0e, 0xfd, 0x4d, 0xb5, + 0xb7, 0xd2, 0xa8, 0x9d, 0xeb, 0x5d, 0x31, 0xdb, 0xd4, 0xa6, 0x66, 0xde, 0x94, 0x6d, 0x2a, 0xba, + 0x7b, 0x02, 0xf6, 0x81, 0x97, 0xbe, 0x52, 0x9d, 0x75, 0xcb, 0x1a, 0x7f, 0xa6, 0x3b, 0x6d, 0x3a, + 0x7c, 0x7f, 0x02, 0x6d, 0xed, 0xf2, 0xf4, 0xab, 0x59, 0x70, 0x87, 0x05, 0xcd, 0xfd, 0x53, 0x03, + 0xde, 0x39, 0x48, 0x2e, 0x45, 0x99, 0xc1, 0x1c, 0x7b, 0x57, 0x51, 0xe2, 0x05, 0x6f, 0x30, 0xc4, + 0x1f, 0x02, 0xc8, 0x64, 0x96, 0xf9, 0x62, 0x3c, 0x29, 0x1b, 0x7c, 0x8e, 0xc2, 0x3c, 0xd7, 0xdf, + 0x12, 0x84, 0xcc, 0x89, 0xa8, 0x03, 0x05, 0xc2, 0x48, 0x7a, 0x17, 0xac, 0x7c, 0x1e, 0x57, 0xfd, + 0xc4, 0x56, 0x8e, 0xa5, 0xb4, 0xbb, 0x03, 0xce, 0x68, 0x4e, 0x05, 0xe3, 0x4c, 0x2e, 0xc4, 0x64, + 0xe3, 0x35, 0x31, 0xd9, 0x5c, 0x8a, 0xc9, 0xff, 0x6d, 0x40, 0xa7, 0x96, 0x5a, 0xb1, 0x0f, 0xa1, + 0x99, 0xcf, 0xe3, 0xc5, 0x46, 0x7c, 0xb1, 0x09, 0x27, 0x12, 0xda, 0x1b, 0x56, 0x93, 0x9e, 0x94, + 0xe1, 0x24, 0x16, 0x81, 0x5e, 0x12, 0x2b, 0xcc, 0x6d, 0x8d, 0x62, 0xfb, 0x70, 0x5b, 0x79, 0x92, + 0xa2, 0x09, 0x57, 0xd4, 0x10, 0x1f, 0x2d, 0xa5, 0x72, 0xaa, 0xa8, 0xde, 0x29, 0xb8, 0x54, 0x9b, + 0x61, 0x75, 0xb2, 0x80, 0x5c, 0xdb, 0x86, 0xb7, 0xaf, 0x61, 0xfb, 0x5e, 0xfd, 0x94, 0x7b, 0xb0, + 0x32, 0x9a, 0xc7, 0xa3, 0x70, 0x2a, 0x64, 0xee, 0x4d, 0x53, 0xca, 0x69, 0x74, 0x24, 0x68, 0x72, + 0x33, 0x97, 0xee, 0xa7, 0xd0, 0x3d, 0x16, 0x22, 0xe3, 0x42, 0xa6, 0x49, 0xac, 0xe2, 0xb9, 0xa4, + 0x4b, 0xeb, 0xb0, 0xa3, 0x21, 0xf7, 0x0f, 0xc1, 0xc1, 0x44, 0xfe, 0xa9, 0x97, 0xfb, 0xe7, 0xdf, + 0x27, 0xd1, 0xff, 0x14, 0xda, 0xa9, 0x32, 0x13, 0x9d, 0x7b, 0x77, 0xc9, 0xc7, 0x69, 0xd3, 0xe1, + 0x05, 0xd1, 0xe5, 0xd0, 0x38, 0x9c, 0x4d, 0xeb, 0x5f, 0xcf, 0x9a, 0xea, 0xeb, 0xd9, 0x42, 0x69, + 0x6c, 0x2e, 0x96, 0xc6, 0x68, 0x79, 0x67, 0x49, 0xf6, 0xc7, 0x5e, 0x16, 0x88, 0x40, 0xd7, 0xdf, + 0x15, 0xc2, 0xfd, 0x06, 0x3a, 0x85, 0x66, 0xf6, 0x02, 0xea, 0x10, 0x92, 0x69, 0xec, 0x05, 0x0b, + 0x96, 0xa2, 0xea, 0x57, 0x11, 0x07, 0x7b, 0x85, 0x4a, 0x15, 0xb0, 0xb8, 0xb3, 0xee, 0xe7, 0x94, + 0x45, 0xf9, 0x33, 0xe8, 0x16, 0xf9, 0xf6, 0x81, 0xc8, 0x3d, 0x32, 0xb6, 0x28, 0x14, 0x71, 0xcd, + 0x10, 0x6d, 0x85, 0x18, 0xc9, 0xd7, 0x74, 0xb8, 0xdd, 0x4d, 0xb0, 0xb4, 0x25, 0x33, 0x68, 0xfa, + 0x49, 0xa0, 0x1e, 0x50, 0x8b, 0xd3, 0x18, 0xc5, 0x31, 0x95, 0x93, 0x22, 0x78, 0x4e, 0xe5, 0xc4, + 0xfd, 0x67, 0x13, 0x56, 0x9e, 0x7a, 0xfe, 0xc5, 0x2c, 0x2d, 0xa2, 0x57, 0xad, 0x68, 0x32, 0x16, + 0x8a, 0xa6, 0x7a, 0x81, 0x64, 0x2e, 0x14, 0x48, 0x0b, 0x07, 0x6a, 0x2c, 0x46, 0xbc, 0xf7, 0xa0, + 0x3d, 0x8b, 0xc3, 0x79, 0xf1, 0xea, 0x1c, 0x6e, 0x21, 0x38, 0x92, 0x6c, 0x1d, 0x3a, 0xf8, 0x30, + 0xc3, 0x98, 0x4a, 0x25, 0x12, 0x88, 0xc3, 0xeb, 0x28, 0x7c, 0xe9, 0x9e, 0xef, 0x0b, 0x29, 0x31, + 0x6f, 0xd1, 0xe9, 0xb6, 0xa3, 0x30, 0x2f, 0xc4, 0x15, 0x39, 0x02, 0xe1, 0x67, 0x22, 0x1f, 0x57, + 0x65, 0x8f, 0xa3, 0x30, 0x48, 0xfe, 0x08, 0x56, 0xa4, 0x90, 0x32, 0x4c, 0xe2, 0x31, 0x45, 0x0e, + 0x5d, 0x9d, 0x76, 0x35, 0x72, 0x84, 0x38, 0x54, 0xb8, 0x17, 0x27, 0xf1, 0xd5, 0x34, 0x99, 0x49, + 0x1d, 0x0c, 0x2a, 0xc4, 0x52, 0xb4, 0x86, 0xe5, 0x68, 0xed, 0xe6, 0xb0, 0x32, 0x98, 0xa7, 0xf4, + 0x9d, 0xe4, 0x8d, 0x91, 0xbf, 0x26, 0x56, 0x73, 0x41, 0xac, 0x35, 0x01, 0xa9, 0x1e, 0x74, 0x21, + 0x20, 0xcc, 0x05, 0x92, 0x6c, 0xea, 0xe5, 0x85, 0xe0, 0x14, 0xe4, 0xfe, 0xa5, 0x09, 0x8e, 0x52, + 0x19, 0x5e, 0xf3, 0x33, 0x68, 0x52, 0x44, 0x36, 0x28, 0xbc, 0xbe, 0x8b, 0x0f, 0xa7, 0x24, 0x6e, + 0xbe, 0x10, 0x57, 0x14, 0x93, 0x89, 0xe5, 0xda, 0x7e, 0x8e, 0xf6, 0xde, 0x2a, 0x19, 0x25, 0xef, + 0xfd, 0x01, 0x38, 0xca, 0x03, 0x22, 0x5e, 0x7f, 0x03, 0x20, 0xc4, 0x49, 0x48, 0x1f, 0x50, 0x72, + 0x91, 0x4d, 0xb5, 0xb6, 0x68, 0x5c, 0x45, 0x63, 0x4b, 0x7d, 0xd5, 0x21, 0xc0, 0x3d, 0x87, 0xb6, + 0xde, 0x1d, 0xa3, 0xd7, 0xc9, 0xe1, 0x8b, 0xc3, 0xa3, 0xaf, 0x0f, 0x7b, 0xb7, 0xca, 0xaa, 0xdf, + 0xa8, 0xe2, 0x9b, 0x59, 0x8f, 0x6f, 0x0d, 0xc4, 0xef, 0x1c, 0x9d, 0x1c, 0x8e, 0x7a, 0x4d, 0xb6, + 0x02, 0x0e, 0x0d, 0xc7, 0x7c, 0xf0, 0xb2, 0xd7, 0xa2, 0x3a, 0x64, 0xe7, 0x67, 0x83, 0x83, 0xed, + 0x9e, 0x55, 0xf6, 0x0c, 0xda, 0x18, 0x47, 0xde, 0x52, 0x57, 0xae, 0x67, 0xed, 0xf5, 0x0f, 0xeb, + 0x4d, 0xf5, 0x61, 0xfd, 0xb7, 0x9b, 0xa8, 0x6f, 0xfd, 0x8b, 0x01, 0x4d, 0xf4, 0x59, 0xec, 0x21, + 0x38, 0x3f, 0x13, 0x5e, 0x96, 0x9f, 0x0a, 0x2f, 0x67, 0x0b, 0xfe, 0x69, 0x6d, 0x01, 0x72, 0x6f, + 0x3d, 0x31, 0xd8, 0xa6, 0xfa, 0x64, 0x56, 0x7c, 0x09, 0x5c, 0x29, 0x3c, 0x1f, 0x79, 0xc6, 0x65, + 0xfe, 0x0d, 0xe2, 0xff, 0x2a, 0x09, 0xe3, 0x1d, 0xf5, 0x1d, 0x89, 0x2d, 0x7b, 0xca, 0xe5, 0x19, + 0xec, 0x11, 0x58, 0x7b, 0x12, 0x5d, 0xf2, 0xab, 0xac, 0x14, 0xf1, 0xeb, 0xde, 0xda, 0xbd, 0xb5, + 0xf5, 0x8f, 0x0d, 0x68, 0x7e, 0x23, 0xb2, 0x84, 0xfd, 0x08, 0xda, 0xba, 0x9b, 0xca, 0x6a, 0x5d, + 0xd3, 0x35, 0x4a, 0xf9, 0x96, 0xda, 0xac, 0xb4, 0x4b, 0x4f, 0x25, 0x0d, 0x55, 0x13, 0x83, 0x55, + 0xcd, 0xde, 0x57, 0x0e, 0xf5, 0x25, 0xf4, 0x86, 0x79, 0x26, 0xbc, 0x69, 0x8d, 0x7d, 0x51, 0x50, + 0xd7, 0x75, 0x44, 0x48, 0x5e, 0x0f, 0xc1, 0x52, 0x71, 0x6f, 0x69, 0xc2, 0x72, 0x73, 0x83, 0x98, + 0xef, 0x43, 0x67, 0x78, 0x9e, 0xcc, 0xa2, 0x60, 0x28, 0xb2, 0x4b, 0xc1, 0x6a, 0x5f, 0x4c, 0xd6, + 0x6a, 0x63, 0xf7, 0x16, 0xdb, 0x00, 0x50, 0xae, 0x1d, 0x2b, 0x4a, 0xd6, 0x46, 0xda, 0xe1, 0x6c, + 0xaa, 0x16, 0xad, 0xf9, 0x7c, 0xc5, 0x59, 0x0b, 0x7f, 0xaf, 0xe3, 0xfc, 0x02, 0x56, 0x76, 0xc8, + 0x66, 0x8e, 0xb2, 0xed, 0xd3, 0x24, 0xcb, 0xd9, 0xf2, 0x57, 0x93, 0xb5, 0x65, 0x84, 0x7b, 0x8b, + 0x3d, 0x01, 0x7b, 0x94, 0x5d, 0x29, 0xfe, 0xb7, 0x74, 0xd6, 0x50, 0xed, 0x77, 0xcd, 0x2d, 0xb7, + 0xfe, 0xae, 0x01, 0xd6, 0xd7, 0x49, 0x76, 0x21, 0x32, 0xf6, 0x00, 0x2c, 0xea, 0x42, 0x69, 0x33, + 0x2a, 0x3b, 0x52, 0xd7, 0x6d, 0xf4, 0x31, 0x38, 0x24, 0x94, 0x91, 0x27, 0x2f, 0x94, 0xaa, 0xe8, + 0x2f, 0x1d, 0x4a, 0x2e, 0xaa, 0x9e, 0x20, 0xbd, 0xae, 0x2a, 0x45, 0x95, 0x4d, 0xb9, 0x85, 0xd6, + 0xd0, 0x5a, 0x5b, 0xf5, 0x79, 0x86, 0x68, 0x9a, 0x4f, 0x0c, 0x74, 0x46, 0x43, 0x75, 0x53, 0x64, + 0xaa, 0x3e, 0x70, 0xaf, 0xad, 0x16, 0x88, 0x72, 0xe5, 0xc7, 0x60, 0xa9, 0x64, 0x53, 0x5d, 0x73, + 0xa1, 0x82, 0x5a, 0xeb, 0xd5, 0x51, 0x7a, 0xc2, 0x67, 0x60, 0xa9, 0x57, 0xae, 0x26, 0x2c, 0x04, + 0x2d, 0x75, 0x6a, 0x15, 0xf8, 0x14, 0xab, 0xf2, 0xcb, 0x8a, 0x75, 0xc1, 0x47, 0x2f, 0xb1, 0x3e, + 0x82, 0x1e, 0x17, 0xbe, 0x08, 0x6b, 0x69, 0x28, 0x2b, 0x2e, 0x75, 0xcd, 0xeb, 0xfb, 0x12, 0x56, + 0x16, 0x52, 0x56, 0xd6, 0x27, 0x41, 0x5f, 0x93, 0xc5, 0x2e, 0x4f, 0x7e, 0xda, 0xfb, 0xb7, 0xef, + 0xee, 0x1a, 0xff, 0xfe, 0xdd, 0x5d, 0xe3, 0x3f, 0xbf, 0xbb, 0x6b, 0xfc, 0xea, 0xbf, 0xee, 0xde, + 0x3a, 0xb5, 0xe8, 0xaf, 0x40, 0x5f, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x58, 0x1f, + 0xab, 0x4e, 0x24, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6290,6 +6290,16 @@ func (m *Enterprise) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } if m.ExpiryTs != 0 { i = encodeVarintPb(dAtA, i, uint64(m.ExpiryTs)) i-- @@ -6463,17 +6473,7 @@ func (m *MembershipState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintPb(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x52 - } - if m.EnterpriseEnabled { - i-- - if m.EnterpriseEnabled { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x48 + dAtA[i] = 0x4a } if len(m.Cid) > 0 { i -= len(m.Cid) @@ -9119,6 +9119,9 @@ func (m *Enterprise) Size() (n int) { if m.ExpiryTs != 0 { n += 1 + sovPb(uint64(m.ExpiryTs)) } + if m.Enabled { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9232,9 +9235,6 @@ func (m *MembershipState) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } - if m.EnterpriseEnabled { - n += 2 - } if m.Enterprise != nil { l = m.Enterprise.Size() n += 1 + l + sovPb(uint64(l)) @@ -12605,6 +12605,26 @@ func (m *Enterprise) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) @@ -13450,26 +13470,6 @@ func (m *MembershipState) Unmarshal(dAtA []byte) error { m.Cid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnterpriseEnabled", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPb - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnterpriseEnabled = bool(v != 0) - case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Enterprise", wireType) } diff --git a/worker/groups.go b/worker/groups.go index 2137b875b42..34322a7e43a 100644 --- a/worker/groups.go +++ b/worker/groups.go @@ -960,8 +960,5 @@ func EnterpriseEnabled() bool { g := groups() g.RLock() defer g.RUnlock() - if g.state == nil { - return false - } - return g.state.EnterpriseEnabled + return g.state.GetEnterprise().GetEnabled() } From bbc98fcf2703c92b211620b724e0796167f2a0d3 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 18:47:07 +1000 Subject: [PATCH 12/35] Remove unnecessary locks. --- dgraph/cmd/zero/raft.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index d44f19c97e0..a657566a302 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -511,7 +511,6 @@ func (n *node) initAndStartNode() error { x.CheckfNoTrace(err) } - n.server.RLock() proposal := &pb.ZeroProposal{ Enterprise: &pb.Enterprise{ Entity: e.Entity, @@ -519,7 +518,6 @@ func (n *node) initAndStartNode() error { ExpiryTs: e.Expiry.Unix(), }, } - n.server.RUnlock() go func() { for { From 41fa1c6420a01591f9915a430c34e3e29d4cb2f2 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 19:00:27 +1000 Subject: [PATCH 13/35] Remove some TODOs --- dgraph/cmd/zero/run.go | 2 -- dgraph/cmd/zero/zero.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index 95251821f37..cce721a9176 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -95,7 +95,6 @@ instances to achieve high-availability. // about the status of supporting annotation logs through the datadog exporter flag.String("datadog.collector", "", "Send opencensus traces to Datadog. As of now, the trace"+ " exporter does not support annotation logs and would discard them.") - // TODO - Remove this flag and instead have an HTTP endpoint which accepts the signed license. flag.String("enterprise_license", "", "Path to the enterprise license file") // TODO - Only for testing, remove before shipping. flag.String("public_key", "", "Path to public key.") @@ -226,7 +225,6 @@ func run() { zpages.Handle(http.DefaultServeMux, "/z") // This must be here. It does not work if placed before Grpc init. - // TODO - Propose the enterprise state to the quorum? x.Check(st.node.initAndStartNode()) if Zero.Conf.GetBool("telemetry") { diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index f6982fa8426..d2f30a6a293 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -277,7 +277,7 @@ func (s *Server) updateEnterpriseState() { defer s.Unlock() // Return early if enterprise is not enabled. This would happen when user didn't supply us a - // license file. + // license file yet. if s.state.GetEnterprise() == nil { return } From 2a4949dceed1bec935e2245b1645e398c129e528 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Fri, 16 Aug 2019 19:07:40 +1000 Subject: [PATCH 14/35] Reduce ticker timer to 5sec. --- dgraph/cmd/zero/raft.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index a657566a302..8babb35dbc2 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -544,7 +544,7 @@ func (n *node) initAndStartNode() error { func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { defer closer.Done() - ticker := time.NewTicker(time.Minute) + ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() n.server.updateEnterpriseState() From 23ca13be046d2312f8f061e5b618b330d9b952b3 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Mon, 19 Aug 2019 09:24:29 +1000 Subject: [PATCH 15/35] Address majority of the comments by pullrequests folks. --- dgraph/cmd/zero/pgp.go | 1 + dgraph/cmd/zero/raft.go | 7 ++++++- dgraph/cmd/zero/run.go | 2 +- dgraph/cmd/zero/zero.go | 6 +----- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go index 0eab67d1160..892a5848464 100644 --- a/dgraph/cmd/zero/pgp.go +++ b/dgraph/cmd/zero/pgp.go @@ -42,6 +42,7 @@ func enterpriseDetails(signedFile string, e *enterprise) error { if err != nil { return errors.Wrapf(err, "while opening signed license file: %v", signedFile) } + defer sf.Close() // The signed file is expected to be have ASCII encoding, so we have to decode it before // reading. diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 8babb35dbc2..4294ee2c10d 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -75,6 +75,8 @@ func (n *node) uniqueKey() string { var errInternalRetry = errors.New("Retry Raft proposal internally") +// proposeAndWait makes a proposal to the quorum for Group Zero and waits for it to be accepted by +// the group before returning. It is safe to call concurrently. func (n *node) proposeAndWait(ctx context.Context, proposal *pb.ZeroProposal) error { switch { case n.Raft() == nil: @@ -497,6 +499,7 @@ func (n *node) initAndStartNode() error { return } if err == errInvalidProposal { + glog.Errorf("invalid proposal error while proposing cluster id") return } glog.Errorf("While proposing CID: %v. Retrying...", err) @@ -520,13 +523,15 @@ func (n *node) initAndStartNode() error { } go func() { - for { + for i := 0; i < 10; i++ { err := n.proposeAndWait(context.Background(), proposal) if err == nil { glog.Infof("Enterprise state proposed to the cluster") break } if err == errInvalidProposal { + glog.Errorf("invalid proposal error while proposing enterprise state for: %+v", + proposal) break } glog.Errorf("While proposing enterprise state: %v. Retrying...", err) diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index cce721a9176..5640fa1c5f9 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -96,7 +96,7 @@ instances to achieve high-availability. flag.String("datadog.collector", "", "Send opencensus traces to Datadog. As of now, the trace"+ " exporter does not support annotation logs and would discard them.") flag.String("enterprise_license", "", "Path to the enterprise license file") - // TODO - Only for testing, remove before shipping. + // FIXME - Only for testing, remove before shipping. flag.String("public_key", "", "Path to public key.") } diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index d2f30a6a293..89670c01abc 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -283,11 +283,7 @@ func (s *Server) updateEnterpriseState() { } expiry := time.Unix(s.state.Enterprise.ExpiryTs, 0) - if time.Now().Before(expiry) { - s.state.Enterprise.Enabled = true - } else { - s.state.Enterprise.Enabled = false - } + s.state.Enterprise.Enabled = time.Now().Before(expiry) } func (s *Server) removeZero(nodeId uint64) { From 08809dd2a4762f49872fc63e39065f31d760cd4c Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Mon, 19 Aug 2019 11:48:28 +1000 Subject: [PATCH 16/35] Add some tests for the enterprise details function. --- dgraph/cmd/zero/pgp.go | 33 +++++----- dgraph/cmd/zero/pgp_test.go | 124 ++++++++++++++++++++++++++++++++++++ dgraph/cmd/zero/raft.go | 12 +++- dgraph/cmd/zero/zero.go | 11 ++++ 4 files changed, 162 insertions(+), 18 deletions(-) create mode 100644 dgraph/cmd/zero/pgp_test.go diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go index 892a5848464..054eddb3516 100644 --- a/dgraph/cmd/zero/pgp.go +++ b/dgraph/cmd/zero/pgp.go @@ -18,35 +18,23 @@ package zero import ( "encoding/json" + "io" "io/ioutil" - "os" "github.com/pkg/errors" "golang.org/x/crypto/openpgp" "golang.org/x/crypto/openpgp/armor" ) -func enterpriseDetails(signedFile string, e *enterprise) error { - publicKeyFile, err := os.Open(Zero.Conf.GetString("public_key")) - if err != nil { - return errors.Wrapf(err, "while opening public key file") - } - defer publicKeyFile.Close() - - entityList, err := openpgp.ReadArmoredKeyRing(publicKeyFile) +func enterpriseDetails(signedFile, publicKey io.Reader, e *enterprise) error { + entityList, err := openpgp.ReadArmoredKeyRing(publicKey) if err != nil { return errors.Wrapf(err, "while reading public key") } - sf, err := os.Open(signedFile) - if err != nil { - return errors.Wrapf(err, "while opening signed license file: %v", signedFile) - } - defer sf.Close() - // The signed file is expected to be have ASCII encoding, so we have to decode it before // reading. - b, err := armor.Decode(sf) + b, err := armor.Decode(signedFile) if err != nil { return errors.Wrapf(err, "while decoding license file") } @@ -62,10 +50,21 @@ func enterpriseDetails(signedFile string, e *enterprise) error { if err != nil { return errors.Wrapf(err, "while reading body from signed license file") } + // This could be nil even if signature verification failed, so we also check Signature == nil + // below. + if md.SignatureError != nil { + return errors.Wrapf(md.SignatureError, "signature error while trying to verify license file") + } if md.Signature == nil { return errors.New("invalid signature while trying to verify license file") } err = json.Unmarshal(buf, e) - return errors.Wrapf(err, "while JSON unmarshaling body of license file") + if err != nil { + return errors.Wrapf(err, "while JSON unmarshaling body of license file") + } + if e.Entity == "" || e.MaxNodes == 0 || e.Expiry.IsZero() { + return errors.Errorf("invalid JSON data, fields shouldn't be zero: %+v\n", e) + } + return nil } diff --git a/dgraph/cmd/zero/pgp_test.go b/dgraph/cmd/zero/pgp_test.go new file mode 100644 index 00000000000..e61eaa6a5d3 --- /dev/null +++ b/dgraph/cmd/zero/pgp_test.go @@ -0,0 +1,124 @@ +package zero + +import ( + "bytes" + "crypto" + "testing" + "time" + + "github.com/stretchr/testify/require" + "golang.org/x/crypto/openpgp" + "golang.org/x/crypto/openpgp/armor" + "golang.org/x/crypto/openpgp/packet" +) + +func encodePublicKey(t *testing.T, e *openpgp.Entity) *bytes.Buffer { + b := new(bytes.Buffer) + encodedKeyBuf, err := armor.Encode(b, openpgp.PublicKeyType, nil) + require.NoError(t, err) + err = e.Serialize(encodedKeyBuf) + require.NoError(t, err) + err = encodedKeyBuf.Close() + require.NoError(t, err) + return b +} + +func signAndWriteMessage(t *testing.T, entity *openpgp.Entity, json string) *bytes.Buffer { + b := new(bytes.Buffer) + w, err := openpgp.Sign(b, entity, nil, &packet.Config{ + RSABits: 4096, + DefaultHash: crypto.SHA512, + }) + require.NoError(t, err) + + _, err = w.Write([]byte(json)) + require.NoError(t, err) + + err = w.Close() + require.NoError(t, err) + + // armor encode the message + abuf := new(bytes.Buffer) + w, err = armor.Encode(abuf, "PGP MESSAGE", nil) + _, err = w.Write(b.Bytes()) + require.NoError(t, err) + + err = w.Close() + require.NoError(t, err) + + return abuf +} + +func TestEnterpriseDetails(t *testing.T) { + correctEntity, err := openpgp.NewEntity("correct", "", "correct@correct.com", &packet.Config{ + RSABits: 4096, + DefaultHash: crypto.SHA512, + }) + + require.NoError(t, err) + incorrectEntity, err := openpgp.NewEntity("incorrect", "", "incorrect@incorrect.com", &packet.Config{ + RSABits: 4096, + DefaultHash: crypto.SHA512, + }) + require.NoError(t, err) + correctJSON := `{"entity": "entity", "max_nodes": 10, "expiry": "2019-08-16T19:09:06+10:00"}` + correctTime, err := time.Parse(time.RFC3339, "2019-08-16T19:09:06+10:00") + require.NoError(t, err) + + var tests = []struct { + name string + signingEntity *openpgp.Entity + json string + verifyingEntity *openpgp.Entity + expectError bool + expectedOutput enterprise + }{ + { + "Signing JSON with empty data should return an error", + correctEntity, + `{}`, + correctEntity, + true, + enterprise{}, + }, + { + "Signing JSON with incorrect private key should return an error", + incorrectEntity, + correctJSON, + correctEntity, + true, + enterprise{}, + }, + { + "Verifying data with incorrect public key should return an error", + correctEntity, + correctJSON, + incorrectEntity, + true, + enterprise{}, + }, + { + "Verifying data with correct public key should return correct data", + correctEntity, + correctJSON, + correctEntity, + false, + enterprise{"entity", 10, correctTime}, + }, + } + + for _, tt := range tests { + t.Logf("Running: %s\n", tt.name) + buf := signAndWriteMessage(t, tt.signingEntity, tt.json) + e := enterprise{} + publicKey := encodePublicKey(t, tt.verifyingEntity) + err = enterpriseDetails(buf, publicKey, &e) + if tt.expectError { + require.Error(t, err) + continue + } + + require.NoError(t, err) + require.Equal(t, tt.expectedOutput, e) + } +} diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 4294ee2c10d..167950fc749 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -17,9 +17,11 @@ package zero import ( + "bytes" "fmt" "log" "math" + "os" "sort" "strings" "sync" @@ -509,8 +511,16 @@ func (n *node) initAndStartNode() error { } if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { + sf, err := os.Open(fpath) + if err != nil { + return errors.Wrapf(err, "while opening signed license file: %v", fpath) + } + defer sf.Close() + var e enterprise - if err := enterpriseDetails(fpath, &e); err != nil { + // Safe to access n.server.publicKey without a lock as this function is called on startup + // and the field is not modified after startup. + if err := enterpriseDetails(sf, bytes.NewReader(n.server.publicKey), &e); err != nil { x.CheckfNoTrace(err) } diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 89670c01abc..fb0f727857e 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -17,6 +17,7 @@ package zero import ( + "io/ioutil" "math" "sync" "time" @@ -67,6 +68,8 @@ type Server struct { moveOngoing chan struct{} blockCommitsOn *sync.Map + + publicKey []byte } // Init initializes the zero server. @@ -87,6 +90,14 @@ func (s *Server) Init() { s.closer = y.NewCloser(2) // grpc and http s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) + + publicKeyFile := Zero.Conf.GetString("public_key") + if publicKeyFile != "" { + var err error + s.publicKey, err = ioutil.ReadFile(publicKeyFile) + x.Check(err) + } + go s.rebalanceTablets() } From 27ca7eeb8e5b81e3326955756502a27b67a0906f Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Mon, 19 Aug 2019 12:23:00 +1000 Subject: [PATCH 17/35] Add a HTTP endpoint which allows proposing enterprise license. --- dgraph/cmd/zero/http.go | 31 +++++++++++++++++++++++++++++++ dgraph/cmd/zero/run.go | 1 + dgraph/cmd/zero/zero.go | 24 ++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/dgraph/cmd/zero/http.go b/dgraph/cmd/zero/http.go index 0c803181ddc..67241e87880 100644 --- a/dgraph/cmd/zero/http.go +++ b/dgraph/cmd/zero/http.go @@ -17,8 +17,10 @@ package zero import ( + "bytes" "context" "fmt" + "io/ioutil" "net" "net/http" "strconv" @@ -232,6 +234,35 @@ func (st *state) getState(w http.ResponseWriter, r *http.Request) { } } +func (st *state) applyEnterpriseLicense(w http.ResponseWriter, r *http.Request) { + x.AddCorsHeaders(w) + if r.Method == "OPTIONS" { + return + } + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusBadRequest) + x.SetStatus(w, x.ErrorInvalidMethod, "Invalid method") + return + } + + w.Header().Set("Content-Type", "application/json") + b, err := ioutil.ReadAll(r.Body) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + x.SetStatus(w, x.ErrorInvalidRequest, err.Error()) + return + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + if err := st.zero.applyEnterpriseLicense(ctx, bytes.NewReader(b)); err != nil { + w.WriteHeader(http.StatusBadRequest) + x.SetStatus(w, x.ErrorInvalidRequest, err.Error()) + return + } + x.SetStatus(w, x.Success, "Done") +} + func (st *state) serveHTTP(l net.Listener) { srv := &http.Server{ ReadTimeout: 10 * time.Second, diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index 5640fa1c5f9..f877fb04fb4 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -222,6 +222,7 @@ func run() { http.HandleFunc("/removeNode", st.removeNode) http.HandleFunc("/moveTablet", st.moveTablet) http.HandleFunc("/assign", st.assign) + http.HandleFunc("/enterpriseLicense", st.applyEnterpriseLicense) zpages.Handle(http.DefaultServeMux, "/z") // This must be here. It does not work if placed before Grpc init. diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index fb0f727857e..e88b0c31405 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -17,6 +17,8 @@ package zero import ( + "bytes" + "io" "io/ioutil" "math" "sync" @@ -768,3 +770,25 @@ func (s *Server) latestMembershipState(ctx context.Context) (*pb.MembershipState } return ms, nil } + +func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reader) error { + var e enterprise + if err := enterpriseDetails(signedData, bytes.NewReader(s.publicKey), &e); err != nil { + return errors.Wrapf(err, "while extracting enterprise details from the license") + } + + proposal := &pb.ZeroProposal{ + Enterprise: &pb.Enterprise{ + Entity: e.Entity, + MaxNodes: e.MaxNodes, + ExpiryTs: e.Expiry.Unix(), + }, + } + + err := s.Node.proposeAndWait(ctx, proposal) + if err != nil { + return errors.Wrapf(err, "while proposing enterprise state to cluster") + } + glog.Infof("Enterprise state proposed to the cluster") + return nil +} From de2beaf5343842e404db53c20e231ff9669334a1 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Mon, 19 Aug 2019 14:46:57 +1000 Subject: [PATCH 18/35] Handle some TODOs --- dgraph/cmd/alpha/admin_backup.go | 2 +- dgraph/cmd/zero/zero.go | 5 +---- worker/groups.go | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dgraph/cmd/alpha/admin_backup.go b/dgraph/cmd/alpha/admin_backup.go index d97d4e6bf68..cad909fdceb 100644 --- a/dgraph/cmd/alpha/admin_backup.go +++ b/dgraph/cmd/alpha/admin_backup.go @@ -44,7 +44,7 @@ func backupHandler(w http.ResponseWriter, r *http.Request) { } if !worker.EnterpriseEnabled() { x.SetStatus(w, "You must enable enterprise features first. "+ - "Restart Dgraph Zero with the appropriate license file.", + "Supply the appropriate license file to Dgraph Zero using a flag or the HTTP endpoint.", "Backup failed.") return } diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index e88b0c31405..81841c2ad3f 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -474,7 +474,6 @@ func (s *Server) Connect(ctx context.Context, for _, group := range ms.Groups { for _, member := range group.Members { switch { - // TODO - Verify if we need the m.Id == 0 condition here and why. // If we have this member, then we should just connect to it and return. case member.Addr == m.Addr: glog.Infof("Found a member with the same address. Returning: %+v", member) @@ -502,10 +501,8 @@ func (s *Server) Connect(ctx context.Context, } } - // TODO - Zero MaxNodes should probably be an error. maxNodes := s.state.GetEnterprise().GetMaxNodes() - if s.state.GetEnterprise().GetEnabled() && maxNodes != 0 && - uint64(numberOfNodes) >= maxNodes { + if s.state.GetEnterprise().GetEnabled() && uint64(numberOfNodes) >= maxNodes { return nil, errors.Errorf("ENTERPRISE_LIMIT_REACHED: You are already using the maximum "+ "number of nodes: [%v] permitted for your enterprise license.", maxNodes) } diff --git a/worker/groups.go b/worker/groups.go index 34322a7e43a..860b8702c61 100644 --- a/worker/groups.go +++ b/worker/groups.go @@ -262,7 +262,6 @@ func UpdateMembershipState(ctx context.Context) error { if err != nil { return err } - // TODO - When is this called, check. g.applyState(state.GetState()) return nil } From 8f06a59a4084ef519eb66bdecb9ccaf5573376b5 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Mon, 19 Aug 2019 15:29:39 +1000 Subject: [PATCH 19/35] Check EnterpriseEnabled flag in login handler. --- edgraph/access_ee.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/edgraph/access_ee.go b/edgraph/access_ee.go index 59a9587774d..0fdae69af18 100644 --- a/edgraph/access_ee.go +++ b/edgraph/access_ee.go @@ -27,6 +27,7 @@ import ( "github.com/dgraph-io/dgraph/ee/acl" "github.com/dgraph-io/dgraph/gql" "github.com/dgraph-io/dgraph/schema" + "github.com/dgraph-io/dgraph/worker" "github.com/dgraph-io/dgraph/x" jwt "github.com/dgrijalva/jwt-go" "github.com/golang/glog" @@ -40,6 +41,12 @@ import ( // Login handles login requests from clients. func (s *Server) Login(ctx context.Context, request *api.LoginRequest) (*api.Response, error) { + if !worker.EnterpriseEnabled() { + return nil, errors.New("Enterprise features are disabled. You can enable them by " + + "supplying the appropriate license file to Dgraph Zero using a flag or the" + + " HTTP endpoint.") + } + ctx, span := otrace.StartSpan(ctx, "server.Login") defer span.End() From 1f7d3f6514b43665854eccc8049084f4205291ff Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 08:53:47 +1000 Subject: [PATCH 20/35] Check MaxNodes before applying enterprise proposal. --- dgraph/cmd/zero/raft.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 167950fc749..916acf38a28 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -361,6 +361,15 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { } } if p.Enterprise != nil { + // Check that the number of nodes in the cluster should be less than MaxNodes, otherwise + // reject the proposal. + numNodes := len(state.GetZeros()) + for _, group := range state.GetGroups() { + numNodes += len(group.GetMembers()) + } + if uint64(numNodes) > p.GetEnterprise().GetMaxNodes() { + return p.Key, errInvalidProposal + } state.Enterprise = p.Enterprise } From a2e5669070d7b8c38f29a266bea128ef9267b62b Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 10:01:12 +1000 Subject: [PATCH 21/35] Remove enterprise_license flag as we have the hhtp endpoint for it. --- dgraph/cmd/zero/raft.go | 42 ----------------------------------------- dgraph/cmd/zero/run.go | 1 - 2 files changed, 43 deletions(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 916acf38a28..eac1addfc30 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -17,11 +17,9 @@ package zero import ( - "bytes" "fmt" "log" "math" - "os" "sort" "strings" "sync" @@ -519,46 +517,6 @@ func (n *node) initAndStartNode() error { }() } - if fpath := Zero.Conf.GetString("enterprise_license"); len(fpath) > 0 { - sf, err := os.Open(fpath) - if err != nil { - return errors.Wrapf(err, "while opening signed license file: %v", fpath) - } - defer sf.Close() - - var e enterprise - // Safe to access n.server.publicKey without a lock as this function is called on startup - // and the field is not modified after startup. - if err := enterpriseDetails(sf, bytes.NewReader(n.server.publicKey), &e); err != nil { - x.CheckfNoTrace(err) - } - - proposal := &pb.ZeroProposal{ - Enterprise: &pb.Enterprise{ - Entity: e.Entity, - MaxNodes: e.MaxNodes, - ExpiryTs: e.Expiry.Unix(), - }, - } - - go func() { - for i := 0; i < 10; i++ { - err := n.proposeAndWait(context.Background(), proposal) - if err == nil { - glog.Infof("Enterprise state proposed to the cluster") - break - } - if err == errInvalidProposal { - glog.Errorf("invalid proposal error while proposing enterprise state for: %+v", - proposal) - break - } - glog.Errorf("While proposing enterprise state: %v. Retrying...", err) - time.Sleep(3 * time.Second) - } - }() - } - go n.Run() go n.BatchAndSendMessages() return nil diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index f877fb04fb4..9e1106a42d0 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -95,7 +95,6 @@ instances to achieve high-availability. // about the status of supporting annotation logs through the datadog exporter flag.String("datadog.collector", "", "Send opencensus traces to Datadog. As of now, the trace"+ " exporter does not support annotation logs and would discard them.") - flag.String("enterprise_license", "", "Path to the enterprise license file") // FIXME - Only for testing, remove before shipping. flag.String("public_key", "", "Path to public key.") } From 2c277d3d50a6dae86cda9119365549cb7a615207 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 11:11:21 +1000 Subject: [PATCH 22/35] Check number of nodes before proposing enterprise license. --- dgraph/cmd/zero/zero.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 81841c2ad3f..36de7010a86 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -475,7 +475,7 @@ func (s *Server) Connect(ctx context.Context, for _, member := range group.Members { switch { // If we have this member, then we should just connect to it and return. - case member.Addr == m.Addr: + case member.Addr == m.Addr && m.Id == 0: glog.Infof("Found a member with the same address. Returning: %+v", member) conn.GetPools().Connect(m.Addr) return &pb.ConnectionState{ @@ -774,6 +774,15 @@ func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reade return errors.Wrapf(err, "while extracting enterprise details from the license") } + numNodes := len(s.state.GetZeros()) + for _, group := range s.state.GetGroups() { + numNodes += len(group.GetMembers()) + } + if uint64(numNodes) > e.MaxNodes { + return errors.Errorf("Your license only allows: %v (Alpha + Zero) nodes. You have: %v.", + e.MaxNodes, numNodes) + } + proposal := &pb.ZeroProposal{ Enterprise: &pb.Enterprise{ Entity: e.Entity, From 277f10b91a1c6bb78ffac2540f4adabfa02e37b8 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 11:31:02 +1000 Subject: [PATCH 23/35] Rename enterprise to license and entity to user --- dgraph/cmd/zero/http.go | 3 + dgraph/cmd/zero/pgp.go | 13 +- dgraph/cmd/zero/pgp_test.go | 14 +- dgraph/cmd/zero/raft.go | 6 +- dgraph/cmd/zero/zero.go | 28 +- protos/pb.proto | 8 +- protos/pb/pb.pb.go | 588 ++++++++++++++++++------------------ worker/groups.go | 2 +- 8 files changed, 334 insertions(+), 328 deletions(-) diff --git a/dgraph/cmd/zero/http.go b/dgraph/cmd/zero/http.go index 67241e87880..5b65966c1b3 100644 --- a/dgraph/cmd/zero/http.go +++ b/dgraph/cmd/zero/http.go @@ -234,6 +234,9 @@ func (st *state) getState(w http.ResponseWriter, r *http.Request) { } } +// applyEnterpriseLicense accepts a PGP message as a POST request body, verifies that it was +// signed using our private key and applies the license which has maxNodes and Expiry to the +// cluster. func (st *state) applyEnterpriseLicense(w http.ResponseWriter, r *http.Request) { x.AddCorsHeaders(w) if r.Method == "OPTIONS" { diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go index 054eddb3516..d6a8024e5ad 100644 --- a/dgraph/cmd/zero/pgp.go +++ b/dgraph/cmd/zero/pgp.go @@ -26,7 +26,9 @@ import ( "golang.org/x/crypto/openpgp/armor" ) -func enterpriseDetails(signedFile, publicKey io.Reader, e *enterprise) error { +// verifySignature verifies the signature given a public key. It also JSON unmarshals the details +// of the license and stores them in l. +func verifySignature(signedFile, publicKey io.Reader, l *license) error { entityList, err := openpgp.ReadArmoredKeyRing(publicKey) if err != nil { return errors.Wrapf(err, "while reading public key") @@ -53,18 +55,19 @@ func enterpriseDetails(signedFile, publicKey io.Reader, e *enterprise) error { // This could be nil even if signature verification failed, so we also check Signature == nil // below. if md.SignatureError != nil { - return errors.Wrapf(md.SignatureError, "signature error while trying to verify license file") + return errors.Wrapf(md.SignatureError, + "signature error while trying to verify license file") } if md.Signature == nil { return errors.New("invalid signature while trying to verify license file") } - err = json.Unmarshal(buf, e) + err = json.Unmarshal(buf, l) if err != nil { return errors.Wrapf(err, "while JSON unmarshaling body of license file") } - if e.Entity == "" || e.MaxNodes == 0 || e.Expiry.IsZero() { - return errors.Errorf("invalid JSON data, fields shouldn't be zero: %+v\n", e) + if l.User == "" || l.MaxNodes == 0 || l.Expiry.IsZero() { + return errors.Errorf("invalid JSON data, fields shouldn't be zero: %+v\n", l) } return nil } diff --git a/dgraph/cmd/zero/pgp_test.go b/dgraph/cmd/zero/pgp_test.go index e61eaa6a5d3..4e2d39ce4a0 100644 --- a/dgraph/cmd/zero/pgp_test.go +++ b/dgraph/cmd/zero/pgp_test.go @@ -71,7 +71,7 @@ func TestEnterpriseDetails(t *testing.T) { json string verifyingEntity *openpgp.Entity expectError bool - expectedOutput enterprise + expectedOutput license }{ { "Signing JSON with empty data should return an error", @@ -79,7 +79,7 @@ func TestEnterpriseDetails(t *testing.T) { `{}`, correctEntity, true, - enterprise{}, + license{}, }, { "Signing JSON with incorrect private key should return an error", @@ -87,7 +87,7 @@ func TestEnterpriseDetails(t *testing.T) { correctJSON, correctEntity, true, - enterprise{}, + license{}, }, { "Verifying data with incorrect public key should return an error", @@ -95,7 +95,7 @@ func TestEnterpriseDetails(t *testing.T) { correctJSON, incorrectEntity, true, - enterprise{}, + license{}, }, { "Verifying data with correct public key should return correct data", @@ -103,16 +103,16 @@ func TestEnterpriseDetails(t *testing.T) { correctJSON, correctEntity, false, - enterprise{"entity", 10, correctTime}, + license{"entity", 10, correctTime}, }, } for _, tt := range tests { t.Logf("Running: %s\n", tt.name) buf := signAndWriteMessage(t, tt.signingEntity, tt.json) - e := enterprise{} + e := license{} publicKey := encodePublicKey(t, tt.verifyingEntity) - err = enterpriseDetails(buf, publicKey, &e) + err = verifySignature(buf, publicKey, &e) if tt.expectError { require.Error(t, err) continue diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index eac1addfc30..e933e6d8de7 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -358,17 +358,17 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { return p.Key, err } } - if p.Enterprise != nil { + if p.License != nil { // Check that the number of nodes in the cluster should be less than MaxNodes, otherwise // reject the proposal. numNodes := len(state.GetZeros()) for _, group := range state.GetGroups() { numNodes += len(group.GetMembers()) } - if uint64(numNodes) > p.GetEnterprise().GetMaxNodes() { + if uint64(numNodes) > p.GetLicense().GetMaxNodes() { return p.Key, errInvalidProposal } - state.Enterprise = p.Enterprise + state.License = p.License } if p.MaxLeaseId > state.MaxLeaseId { diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 36de7010a86..b1c03c8951b 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -42,8 +42,8 @@ var ( errServerShutDown = errors.New("Server is being shut down") ) -type enterprise struct { - Entity string `json:"entity"` +type license struct { + User string `json:"user"` MaxNodes uint64 `json:"max_nodes"` Expiry time.Time `json:"expiry"` } @@ -289,14 +289,14 @@ func (s *Server) updateEnterpriseState() { s.Lock() defer s.Unlock() - // Return early if enterprise is not enabled. This would happen when user didn't supply us a + // Return early if license is not enabled. This would happen when user didn't supply us a // license file yet. - if s.state.GetEnterprise() == nil { + if s.state.GetLicense() == nil { return } - expiry := time.Unix(s.state.Enterprise.ExpiryTs, 0) - s.state.Enterprise.Enabled = time.Now().Before(expiry) + expiry := time.Unix(s.state.License.ExpiryTs, 0) + s.state.License.Enabled = time.Now().Before(expiry) } func (s *Server) removeZero(nodeId uint64) { @@ -501,8 +501,8 @@ func (s *Server) Connect(ctx context.Context, } } - maxNodes := s.state.GetEnterprise().GetMaxNodes() - if s.state.GetEnterprise().GetEnabled() && uint64(numberOfNodes) >= maxNodes { + maxNodes := s.state.GetLicense().GetMaxNodes() + if s.state.GetLicense().GetEnabled() && uint64(numberOfNodes) >= maxNodes { return nil, errors.Errorf("ENTERPRISE_LIMIT_REACHED: You are already using the maximum "+ "number of nodes: [%v] permitted for your enterprise license.", maxNodes) } @@ -769,8 +769,8 @@ func (s *Server) latestMembershipState(ctx context.Context) (*pb.MembershipState } func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reader) error { - var e enterprise - if err := enterpriseDetails(signedData, bytes.NewReader(s.publicKey), &e); err != nil { + var e license + if err := verifySignature(signedData, bytes.NewReader(s.publicKey), &e); err != nil { return errors.Wrapf(err, "while extracting enterprise details from the license") } @@ -784,8 +784,8 @@ func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reade } proposal := &pb.ZeroProposal{ - Enterprise: &pb.Enterprise{ - Entity: e.Entity, + License: &pb.License{ + User: e.User, MaxNodes: e.MaxNodes, ExpiryTs: e.Expiry.Unix(), }, @@ -793,8 +793,8 @@ func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reade err := s.Node.proposeAndWait(ctx, proposal) if err != nil { - return errors.Wrapf(err, "while proposing enterprise state to cluster") + return errors.Wrapf(err, "while proposing enterprise license state to cluster") } - glog.Infof("Enterprise state proposed to the cluster") + glog.Infof("Enterprise license state proposed to the cluster") return nil } diff --git a/protos/pb.proto b/protos/pb.proto index daa6095d91d..f8aca055abe 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -137,8 +137,8 @@ message Group { uint64 checksum = 4; // Stores a checksum. } -message Enterprise { - string entity = 1; +message License { + string user = 1; uint64 maxNodes = 2; int64 expiryTs = 3; bool enabled = 4; @@ -154,7 +154,7 @@ message ZeroProposal { api.TxnContext txn = 7; string key = 8; // Used as unique identifier for proposal id. string cid = 9; // Used as unique identifier for the cluster. - Enterprise enterprise = 10; + License license = 10; } // MembershipState is used to pack together the current membership state of all the nodes @@ -169,7 +169,7 @@ message MembershipState { uint64 maxRaftId = 6; repeated Member removed = 7; string cid = 8; // Used to uniquely identify the Dgraph cluster. - Enterprise enterprise = 9; + License license = 9; } message ConnectionState { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 7140735fc5f..4556cdecd4b 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -1159,8 +1159,8 @@ func (m *Group) GetChecksum() uint64 { return 0 } -type Enterprise struct { - Entity string `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` +type License struct { + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` MaxNodes uint64 `protobuf:"varint,2,opt,name=maxNodes,proto3" json:"maxNodes,omitempty"` ExpiryTs int64 `protobuf:"varint,3,opt,name=expiryTs,proto3" json:"expiryTs,omitempty"` Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` @@ -1169,18 +1169,18 @@ type Enterprise struct { XXX_sizecache int32 `json:"-"` } -func (m *Enterprise) Reset() { *m = Enterprise{} } -func (m *Enterprise) String() string { return proto.CompactTextString(m) } -func (*Enterprise) ProtoMessage() {} -func (*Enterprise) Descriptor() ([]byte, []int) { +func (m *License) Reset() { *m = License{} } +func (m *License) String() string { return proto.CompactTextString(m) } +func (*License) ProtoMessage() {} +func (*License) Descriptor() ([]byte, []int) { return fileDescriptor_f80abaa17e25ccc8, []int{13} } -func (m *Enterprise) XXX_Unmarshal(b []byte) error { +func (m *License) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Enterprise) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *License) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Enterprise.Marshal(b, m, deterministic) + return xxx_messageInfo_License.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1190,40 +1190,40 @@ func (m *Enterprise) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Enterprise) XXX_Merge(src proto.Message) { - xxx_messageInfo_Enterprise.Merge(m, src) +func (m *License) XXX_Merge(src proto.Message) { + xxx_messageInfo_License.Merge(m, src) } -func (m *Enterprise) XXX_Size() int { +func (m *License) XXX_Size() int { return m.Size() } -func (m *Enterprise) XXX_DiscardUnknown() { - xxx_messageInfo_Enterprise.DiscardUnknown(m) +func (m *License) XXX_DiscardUnknown() { + xxx_messageInfo_License.DiscardUnknown(m) } -var xxx_messageInfo_Enterprise proto.InternalMessageInfo +var xxx_messageInfo_License proto.InternalMessageInfo -func (m *Enterprise) GetEntity() string { +func (m *License) GetUser() string { if m != nil { - return m.Entity + return m.User } return "" } -func (m *Enterprise) GetMaxNodes() uint64 { +func (m *License) GetMaxNodes() uint64 { if m != nil { return m.MaxNodes } return 0 } -func (m *Enterprise) GetExpiryTs() int64 { +func (m *License) GetExpiryTs() int64 { if m != nil { return m.ExpiryTs } return 0 } -func (m *Enterprise) GetEnabled() bool { +func (m *License) GetEnabled() bool { if m != nil { return m.Enabled } @@ -1240,7 +1240,7 @@ type ZeroProposal struct { Txn *api.TxnContext `protobuf:"bytes,7,opt,name=txn,proto3" json:"txn,omitempty"` Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` Cid string `protobuf:"bytes,9,opt,name=cid,proto3" json:"cid,omitempty"` - Enterprise *Enterprise `protobuf:"bytes,10,opt,name=enterprise,proto3" json:"enterprise,omitempty"` + License *License `protobuf:"bytes,10,opt,name=license,proto3" json:"license,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1342,9 +1342,9 @@ func (m *ZeroProposal) GetCid() string { return "" } -func (m *ZeroProposal) GetEnterprise() *Enterprise { +func (m *ZeroProposal) GetLicense() *License { if m != nil { - return m.Enterprise + return m.License } return nil } @@ -1361,7 +1361,7 @@ type MembershipState struct { MaxRaftId uint64 `protobuf:"varint,6,opt,name=maxRaftId,proto3" json:"maxRaftId,omitempty"` Removed []*Member `protobuf:"bytes,7,rep,name=removed,proto3" json:"removed,omitempty"` Cid string `protobuf:"bytes,8,opt,name=cid,proto3" json:"cid,omitempty"` - Enterprise *Enterprise `protobuf:"bytes,9,opt,name=enterprise,proto3" json:"enterprise,omitempty"` + License *License `protobuf:"bytes,9,opt,name=license,proto3" json:"license,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1456,9 +1456,9 @@ func (m *MembershipState) GetCid() string { return "" } -func (m *MembershipState) GetEnterprise() *Enterprise { +func (m *MembershipState) GetLicense() *License { if m != nil { - return m.Enterprise + return m.License } return nil } @@ -4039,7 +4039,7 @@ func init() { proto.RegisterType((*Group)(nil), "pb.Group") proto.RegisterMapType((map[uint64]*Member)(nil), "pb.Group.MembersEntry") proto.RegisterMapType((map[string]*Tablet)(nil), "pb.Group.TabletsEntry") - proto.RegisterType((*Enterprise)(nil), "pb.Enterprise") + proto.RegisterType((*License)(nil), "pb.License") proto.RegisterType((*ZeroProposal)(nil), "pb.ZeroProposal") proto.RegisterMapType((map[uint32]uint64)(nil), "pb.ZeroProposal.SnapshotTsEntry") proto.RegisterType((*MembershipState)(nil), "pb.MembershipState") @@ -4087,243 +4087,243 @@ func init() { func init() { proto.RegisterFile("pb.proto", fileDescriptor_f80abaa17e25ccc8) } var fileDescriptor_f80abaa17e25ccc8 = []byte{ - // 3765 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0x23, 0x47, - 0x76, 0xd3, 0x4d, 0xb2, 0xd9, 0xfd, 0x48, 0x69, 0xe8, 0xb2, 0x3d, 0xa6, 0xe5, 0xdd, 0x19, 0xb9, - 0xfd, 0x31, 0xf2, 0xcc, 0x8e, 0x66, 0x2c, 0x6f, 0x90, 0xf5, 0x06, 0x39, 0x68, 0x24, 0xce, 0xac, - 0x3c, 0xfa, 0xda, 0x22, 0x35, 0xce, 0xfa, 0x10, 0xa2, 0xd5, 0x5d, 0xa2, 0x7a, 0xd5, 0xec, 0xee, - 0x74, 0x35, 0x15, 0xca, 0xb7, 0x1c, 0x12, 0x20, 0x40, 0x72, 0xca, 0x65, 0x0f, 0x41, 0x0e, 0x01, - 0x72, 0x48, 0x2e, 0xb9, 0x06, 0x39, 0x06, 0x08, 0x90, 0x63, 0x90, 0x5f, 0x10, 0x38, 0x39, 0xe4, - 0x90, 0x73, 0xce, 0xc1, 0x7b, 0x55, 0xfd, 0x41, 0x8e, 0x34, 0xb3, 0x5e, 0x60, 0x4f, 0xac, 0xf7, - 0x51, 0x5f, 0xef, 0xbd, 0x7a, 0x5f, 0x4d, 0xb0, 0xd3, 0xd3, 0xcd, 0x34, 0x4b, 0xf2, 0x84, 0x99, - 0xe9, 0xe9, 0x9a, 0xe3, 0xa5, 0xa1, 0x02, 0xd7, 0xee, 0x4f, 0xc2, 0xfc, 0x7c, 0x76, 0xba, 0xe9, - 0x27, 0xd3, 0xc7, 0xc1, 0x24, 0xf3, 0xd2, 0xf3, 0x47, 0x61, 0xf2, 0xf8, 0xd4, 0x0b, 0x26, 0x22, - 0x7b, 0x9c, 0x9e, 0x3e, 0x2e, 0xe6, 0xb9, 0x6b, 0xd0, 0xdc, 0x0f, 0x65, 0xce, 0x18, 0x34, 0x67, - 0x61, 0x20, 0xfb, 0xc6, 0x7a, 0x63, 0xc3, 0xe2, 0x34, 0x76, 0x0f, 0xc0, 0x19, 0x79, 0xf2, 0xe2, - 0xa5, 0x17, 0xcd, 0x04, 0xeb, 0x41, 0xe3, 0xd2, 0x8b, 0xfa, 0xc6, 0xba, 0xb1, 0xd1, 0xe5, 0x38, - 0x64, 0x9b, 0x60, 0x5f, 0x7a, 0xd1, 0x38, 0xbf, 0x4a, 0x45, 0xdf, 0x5c, 0x37, 0x36, 0x56, 0xb7, - 0xde, 0xde, 0x4c, 0x4f, 0x37, 0x8f, 0x13, 0x99, 0x87, 0xf1, 0x64, 0xf3, 0xa5, 0x17, 0x8d, 0xae, - 0x52, 0xc1, 0xdb, 0x97, 0x6a, 0xe0, 0x1e, 0x41, 0x67, 0x98, 0xf9, 0xcf, 0x66, 0xb1, 0x9f, 0x87, - 0x49, 0x8c, 0x3b, 0xc6, 0xde, 0x54, 0xd0, 0x8a, 0x0e, 0xa7, 0x31, 0xe2, 0xbc, 0x6c, 0x22, 0xfb, - 0x8d, 0xf5, 0x06, 0xe2, 0x70, 0xcc, 0xfa, 0xd0, 0x0e, 0xe5, 0x4e, 0x32, 0x8b, 0xf3, 0x7e, 0x73, - 0xdd, 0xd8, 0xb0, 0x79, 0x01, 0xba, 0x7f, 0xde, 0x80, 0xd6, 0xcf, 0x67, 0x22, 0xbb, 0xa2, 0x79, - 0x79, 0x9e, 0x15, 0x6b, 0xe1, 0x98, 0xbd, 0x03, 0xad, 0xc8, 0x8b, 0x27, 0xb2, 0x6f, 0xd2, 0x62, - 0x0a, 0x60, 0x1f, 0x80, 0xe3, 0x9d, 0xe5, 0x22, 0x1b, 0xcf, 0xc2, 0xa0, 0xdf, 0x58, 0x37, 0x36, - 0x2c, 0x6e, 0x13, 0xe2, 0x24, 0x0c, 0xd8, 0xfb, 0x60, 0x07, 0xc9, 0xd8, 0xaf, 0xef, 0x15, 0x24, - 0xb4, 0x17, 0xfb, 0x08, 0xec, 0x59, 0x18, 0x8c, 0xa3, 0x50, 0xe6, 0xfd, 0xd6, 0xba, 0xb1, 0xd1, - 0xd9, 0xb2, 0xf1, 0xb2, 0x28, 0x3b, 0xde, 0x9e, 0x85, 0x01, 0x09, 0xf1, 0x01, 0xd8, 0x32, 0xf3, - 0xc7, 0x67, 0xb3, 0xd8, 0xef, 0x5b, 0xc4, 0x74, 0x1b, 0x99, 0x6a, 0xb7, 0xe6, 0x6d, 0xa9, 0x00, - 0xbc, 0x56, 0x26, 0x2e, 0x45, 0x26, 0x45, 0xbf, 0xad, 0xb6, 0xd2, 0x20, 0x7b, 0x02, 0x9d, 0x33, - 0xcf, 0x17, 0xf9, 0x38, 0xf5, 0x32, 0x6f, 0xda, 0xb7, 0xab, 0x85, 0x9e, 0x21, 0xfa, 0x18, 0xb1, - 0x92, 0xc3, 0x59, 0x09, 0xb0, 0x2f, 0x60, 0x85, 0x20, 0x39, 0x3e, 0x0b, 0xa3, 0x5c, 0x64, 0x7d, - 0x87, 0xe6, 0xac, 0xd2, 0x1c, 0xc2, 0x8c, 0x32, 0x21, 0x78, 0x57, 0x31, 0x29, 0x0c, 0xfb, 0x21, - 0x80, 0x98, 0xa7, 0x5e, 0x1c, 0x8c, 0xbd, 0x28, 0xea, 0x03, 0x9d, 0xc1, 0x51, 0x98, 0xed, 0x28, - 0x62, 0xef, 0xe1, 0xf9, 0xbc, 0x60, 0x9c, 0xcb, 0xfe, 0xca, 0xba, 0xb1, 0xd1, 0xe4, 0x16, 0x82, - 0x23, 0x89, 0x72, 0xf5, 0x3d, 0xff, 0x5c, 0xf4, 0x57, 0xd7, 0x8d, 0x8d, 0x16, 0x57, 0x80, 0xbb, - 0x05, 0x0e, 0xd9, 0x09, 0xc9, 0xe1, 0x13, 0xb0, 0x2e, 0x11, 0x50, 0xe6, 0xd4, 0xd9, 0x5a, 0xc1, - 0x83, 0x94, 0xa6, 0xc4, 0x35, 0xd1, 0xbd, 0x0b, 0xf6, 0xbe, 0x17, 0x4f, 0x0a, 0xfb, 0x43, 0x05, - 0xd1, 0x04, 0x87, 0xd3, 0xd8, 0xfd, 0x95, 0x09, 0x16, 0x17, 0x72, 0x16, 0xe5, 0xec, 0x3e, 0x00, - 0x8a, 0x7f, 0xea, 0xe5, 0x59, 0x38, 0xd7, 0xab, 0x56, 0x0a, 0x70, 0x66, 0x61, 0x70, 0x40, 0x24, - 0xf6, 0x04, 0xba, 0xb4, 0x7a, 0xc1, 0x6a, 0x56, 0x07, 0x28, 0xcf, 0xc7, 0x3b, 0xc4, 0xa2, 0x67, - 0xdc, 0x01, 0x8b, 0x34, 0xae, 0xac, 0x6e, 0x85, 0x6b, 0x88, 0x7d, 0x02, 0xab, 0x61, 0x9c, 0xa3, - 0x46, 0xfc, 0x7c, 0x1c, 0x08, 0x59, 0x98, 0xc4, 0x4a, 0x89, 0xdd, 0x15, 0x32, 0x67, 0x9f, 0x83, - 0x12, 0x6b, 0xb1, 0x61, 0x8b, 0x36, 0x5c, 0x2d, 0xd5, 0x25, 0xd5, 0x8e, 0xc4, 0xa3, 0x77, 0x7c, - 0x04, 0x1d, 0xbc, 0x5f, 0x31, 0xc3, 0xa2, 0x19, 0x5d, 0xba, 0x8d, 0x16, 0x07, 0x07, 0x64, 0xd0, - 0xec, 0x28, 0x1a, 0x34, 0x3b, 0x65, 0x26, 0x34, 0x76, 0x07, 0xd0, 0x3a, 0xca, 0x02, 0x91, 0x5d, - 0x6b, 0xf9, 0x0c, 0x9a, 0x81, 0x90, 0x3e, 0x3d, 0x4a, 0x9b, 0xd3, 0xb8, 0x7a, 0x0d, 0x8d, 0xda, - 0x6b, 0x70, 0xff, 0xc6, 0x80, 0xce, 0x30, 0xc9, 0xf2, 0x03, 0x21, 0xa5, 0x37, 0x11, 0xec, 0x1e, - 0xb4, 0x12, 0x5c, 0x56, 0x4b, 0xd8, 0xc1, 0x33, 0xd1, 0x3e, 0x5c, 0xe1, 0x97, 0xf4, 0x60, 0xde, - 0xac, 0x07, 0xb4, 0x12, 0x7a, 0x47, 0x0d, 0x6d, 0x25, 0xf4, 0x8a, 0xee, 0x80, 0x95, 0x9c, 0x9d, - 0x49, 0xa1, 0x64, 0xd9, 0xe2, 0x1a, 0xba, 0xd1, 0xd8, 0xdc, 0xdf, 0x01, 0xc0, 0xf3, 0x7d, 0x4f, - 0x2b, 0x70, 0xcf, 0xa1, 0xc3, 0xbd, 0xb3, 0x7c, 0x27, 0x89, 0x73, 0x31, 0xcf, 0xd9, 0x2a, 0x98, - 0x61, 0x40, 0x22, 0xb2, 0xb8, 0x19, 0x06, 0x78, 0xb8, 0x49, 0x96, 0xcc, 0x52, 0x92, 0xd0, 0x0a, - 0x57, 0x00, 0x89, 0x32, 0x08, 0x32, 0x3a, 0x31, 0x8a, 0x32, 0x08, 0x32, 0x76, 0x0f, 0x3a, 0x32, - 0xf6, 0x52, 0x79, 0x9e, 0xe4, 0x78, 0xb8, 0x26, 0x1d, 0x0e, 0x0a, 0xd4, 0x48, 0xba, 0xff, 0x6a, - 0x80, 0x75, 0x20, 0xa6, 0xa7, 0x22, 0x7b, 0x65, 0x97, 0xf7, 0xc1, 0xa6, 0x85, 0xc7, 0x61, 0xa0, - 0x37, 0x6a, 0x13, 0xbc, 0x17, 0x5c, 0xbb, 0xd5, 0x1d, 0xb0, 0x22, 0xe1, 0xa1, 0xf0, 0x95, 0x9d, - 0x69, 0x08, 0x65, 0xe3, 0x4d, 0xc7, 0x81, 0xf0, 0x02, 0x72, 0x3c, 0x36, 0xb7, 0xbc, 0xe9, 0xae, - 0xf0, 0x02, 0x3c, 0x5b, 0xe4, 0xc9, 0x7c, 0x3c, 0x4b, 0x03, 0x2f, 0x17, 0xe4, 0x70, 0x9a, 0x68, - 0x38, 0x32, 0x3f, 0x21, 0x0c, 0x7b, 0x00, 0x6f, 0xf9, 0xd1, 0x4c, 0xa2, 0xb7, 0x0b, 0xe3, 0xb3, - 0x64, 0x9c, 0xc4, 0xd1, 0x15, 0xc9, 0xd7, 0xe6, 0xb7, 0x35, 0x61, 0x2f, 0x3e, 0x4b, 0x8e, 0xe2, - 0xe8, 0xca, 0xfd, 0x27, 0x13, 0x5a, 0xcf, 0x49, 0x0c, 0x4f, 0xa0, 0x3d, 0xa5, 0x0b, 0x15, 0xaf, - 0xf7, 0x0e, 0x4a, 0x98, 0x68, 0x9b, 0xea, 0xa6, 0x72, 0x10, 0xe7, 0xd9, 0x15, 0x2f, 0xd8, 0x70, - 0x46, 0xee, 0x9d, 0x46, 0x22, 0x97, 0xda, 0x22, 0x6a, 0x33, 0x46, 0x8a, 0xa0, 0x67, 0x68, 0xb6, - 0x65, 0xb1, 0x36, 0x96, 0xc5, 0xca, 0xd6, 0xc0, 0xf6, 0xcf, 0x85, 0x7f, 0x21, 0x67, 0x53, 0x2d, - 0xf4, 0x12, 0x5e, 0x7b, 0x06, 0xdd, 0xfa, 0x39, 0x30, 0x32, 0x5d, 0x88, 0x2b, 0x12, 0x7c, 0x93, - 0xe3, 0x90, 0xad, 0x43, 0x8b, 0x5e, 0x38, 0x89, 0xbd, 0xb3, 0x05, 0x78, 0x1c, 0x35, 0x85, 0x2b, - 0xc2, 0x4f, 0xcd, 0x9f, 0x18, 0xb8, 0x4e, 0xfd, 0x74, 0xf5, 0x75, 0x9c, 0x9b, 0xd7, 0x51, 0x53, - 0x6a, 0xeb, 0xb8, 0x97, 0x00, 0x03, 0x74, 0x09, 0x69, 0x16, 0x4a, 0x81, 0x6a, 0x14, 0x71, 0x1e, - 0xe6, 0xc5, 0x42, 0x1a, 0xc2, 0x1b, 0x4d, 0xbd, 0xf9, 0x61, 0x12, 0x08, 0x49, 0xcb, 0x35, 0x79, - 0x09, 0x23, 0x4d, 0xcc, 0xd3, 0x30, 0xbb, 0x1a, 0x29, 0x59, 0x34, 0x78, 0x09, 0x63, 0x9c, 0x10, - 0x31, 0xee, 0x19, 0x14, 0x21, 0x49, 0x83, 0xee, 0xdf, 0x37, 0xa0, 0xfb, 0x8d, 0xc8, 0x92, 0xe3, - 0x2c, 0x49, 0x13, 0xe9, 0x45, 0x6c, 0x7b, 0x51, 0xaa, 0x4a, 0x7b, 0xeb, 0x78, 0xe8, 0x3a, 0xdb, - 0xe6, 0xb0, 0x14, 0xb3, 0xd2, 0x4a, 0x5d, 0xee, 0x2e, 0x58, 0x4a, 0xab, 0xd7, 0x88, 0x4e, 0x53, - 0x90, 0x47, 0xe9, 0x91, 0xce, 0xba, 0x28, 0x16, 0x4d, 0x61, 0x77, 0x01, 0xa6, 0xde, 0x7c, 0x5f, - 0x78, 0x52, 0xec, 0x05, 0xc5, 0xb3, 0xa9, 0x30, 0x5a, 0x1a, 0xa3, 0x79, 0x3c, 0x92, 0x64, 0xd5, - 0x4a, 0x1a, 0x04, 0xb3, 0x1f, 0x80, 0x33, 0xf5, 0xe6, 0xf8, 0x7e, 0xf7, 0x02, 0x6d, 0xd5, 0x15, - 0x82, 0x7d, 0x08, 0x8d, 0x7c, 0x1e, 0x93, 0x33, 0xc4, 0xa8, 0x88, 0x29, 0xcf, 0x68, 0x1e, 0xeb, - 0x97, 0xce, 0x91, 0x56, 0x28, 0xd2, 0xae, 0x14, 0xd9, 0x83, 0x86, 0x1f, 0x06, 0x14, 0x16, 0x1d, - 0x8e, 0x43, 0xb6, 0x09, 0x20, 0x4a, 0xa5, 0x51, 0xf4, 0xd3, 0x4e, 0xbb, 0x52, 0x25, 0xaf, 0x71, - 0xac, 0xfd, 0x3e, 0xdc, 0x5e, 0x92, 0x5b, 0xdd, 0x5e, 0x56, 0xd4, 0x36, 0xef, 0xd4, 0xed, 0xa5, - 0x59, 0xb7, 0x91, 0xff, 0x69, 0xc0, 0x6d, 0x6d, 0xb4, 0xe7, 0x61, 0x3a, 0xcc, 0xf1, 0x79, 0xf6, - 0xa1, 0x4d, 0x5e, 0x51, 0x64, 0xda, 0x76, 0x0b, 0x90, 0xfd, 0x2e, 0x58, 0xe4, 0x29, 0x8a, 0xf7, - 0x74, 0xaf, 0xd2, 0x42, 0x39, 0x5d, 0xbd, 0x2f, 0xad, 0x42, 0xcd, 0xce, 0x7e, 0x0c, 0xad, 0x6f, - 0x45, 0x96, 0x28, 0x2f, 0xdf, 0xd9, 0xba, 0x7b, 0xdd, 0x3c, 0xb4, 0x05, 0x3d, 0x4d, 0x31, 0xff, - 0x16, 0x95, 0xf5, 0x31, 0xfa, 0xf5, 0x69, 0x72, 0x29, 0x82, 0x7e, 0x9b, 0x4e, 0x54, 0xb7, 0xa7, - 0x82, 0x54, 0x68, 0xc7, 0xbe, 0x49, 0x3b, 0xce, 0x1b, 0xb5, 0xb3, 0x0b, 0x9d, 0x9a, 0x38, 0xae, - 0xd1, 0xcc, 0xbd, 0xc5, 0x97, 0xec, 0x94, 0x0e, 0xaa, 0xee, 0x10, 0x76, 0x01, 0x2a, 0xe1, 0xfc, - 0xa6, 0x6e, 0xc5, 0xfd, 0x13, 0x03, 0x6e, 0xef, 0x24, 0x71, 0x2c, 0x28, 0xe1, 0x53, 0xaa, 0xae, - 0x9e, 0x95, 0x71, 0xe3, 0xb3, 0xfa, 0x0c, 0x5a, 0x12, 0x99, 0xf5, 0xea, 0x6f, 0x5f, 0xa3, 0x3b, - 0xae, 0x38, 0xd0, 0x7d, 0x4e, 0xbd, 0xf9, 0x38, 0x15, 0x71, 0x10, 0xc6, 0x93, 0xc2, 0x7d, 0x4e, - 0xbd, 0xf9, 0xb1, 0xc2, 0xb8, 0x7f, 0x6b, 0x80, 0xa5, 0x5e, 0xe4, 0x42, 0x14, 0x32, 0x16, 0xa3, - 0xd0, 0x0f, 0xc0, 0x49, 0x33, 0x11, 0x84, 0x7e, 0xb1, 0xab, 0xc3, 0x2b, 0x04, 0x1a, 0xf3, 0x59, - 0x92, 0xf9, 0x82, 0x96, 0xb7, 0xb9, 0x02, 0x10, 0x2b, 0x53, 0xcf, 0x57, 0x49, 0x6b, 0x83, 0x2b, - 0x00, 0x9d, 0x9e, 0x52, 0x26, 0x29, 0xd1, 0xe6, 0x1a, 0xc2, 0x6c, 0x9b, 0xe2, 0x3a, 0x45, 0x1e, - 0x87, 0x48, 0x36, 0x22, 0x28, 0xe4, 0xfc, 0x83, 0x09, 0xdd, 0xdd, 0x30, 0x13, 0x7e, 0x2e, 0x82, - 0x41, 0x30, 0x59, 0x76, 0x9d, 0x56, 0xe9, 0x3a, 0x8b, 0x1c, 0xc7, 0x5c, 0xcc, 0xee, 0x95, 0x2e, - 0x1a, 0x54, 0x90, 0x28, 0x80, 0x6d, 0x01, 0xa8, 0xec, 0x8f, 0x8a, 0x92, 0xe6, 0xcd, 0x45, 0x89, - 0x43, 0x6c, 0x38, 0x44, 0x01, 0xa9, 0x39, 0xa1, 0x0a, 0xb0, 0x16, 0x55, 0x2c, 0x33, 0x34, 0x7c, - 0x4a, 0x9a, 0x4e, 0x45, 0x44, 0x86, 0x4d, 0x49, 0xd3, 0xa9, 0x88, 0xca, 0x54, 0xb5, 0xad, 0x8e, - 0x83, 0x63, 0xf6, 0x11, 0x98, 0x49, 0x4a, 0x97, 0xd7, 0x1b, 0xd6, 0x2f, 0xb6, 0x79, 0x94, 0x72, - 0x33, 0x49, 0xd1, 0x0a, 0x54, 0x06, 0xde, 0x77, 0xf4, 0x63, 0x40, 0xef, 0x45, 0x59, 0x22, 0xd7, - 0x14, 0xf7, 0x0e, 0x98, 0x47, 0x29, 0x6b, 0x43, 0x63, 0x38, 0x18, 0xf5, 0x6e, 0xe1, 0x60, 0x77, - 0xb0, 0xdf, 0x33, 0xdc, 0xff, 0x35, 0xc1, 0x39, 0x98, 0xe5, 0x1e, 0xda, 0x94, 0x7c, 0x9d, 0x52, - 0xdf, 0x07, 0x5b, 0xe6, 0x5e, 0x46, 0x11, 0x40, 0xb9, 0xa1, 0x36, 0xc1, 0x23, 0xc9, 0x3e, 0x85, - 0x96, 0x08, 0x26, 0xa2, 0xf0, 0x0e, 0xbd, 0xe5, 0x73, 0x72, 0x45, 0x66, 0x1b, 0x60, 0x49, 0xff, - 0x5c, 0x4c, 0xbd, 0x7e, 0xb3, 0x62, 0x1c, 0x12, 0x46, 0x65, 0x16, 0x5c, 0xd3, 0xd9, 0x16, 0xbc, - 0x1b, 0x4e, 0xe2, 0x24, 0x13, 0xe3, 0x30, 0x0e, 0xc4, 0x7c, 0xec, 0x27, 0xf1, 0x59, 0x14, 0xfa, - 0xb9, 0xce, 0x54, 0xde, 0x56, 0xc4, 0x3d, 0xa4, 0xed, 0x68, 0x12, 0xfb, 0x18, 0x5a, 0xa8, 0x1d, - 0xa9, 0xf3, 0x5e, 0x7a, 0xd6, 0xa8, 0x08, 0xbd, 0xb4, 0x22, 0xb2, 0x47, 0xd0, 0x0e, 0xb2, 0x24, - 0x1d, 0x27, 0x29, 0xc9, 0x79, 0x75, 0xeb, 0x1d, 0x7a, 0x0f, 0x85, 0x04, 0x36, 0x77, 0xb3, 0x24, - 0x3d, 0x4a, 0xb9, 0x15, 0xd0, 0x2f, 0x16, 0x33, 0xc4, 0xae, 0x6c, 0x42, 0x79, 0x12, 0x07, 0x31, - 0x94, 0xf4, 0xbb, 0x8f, 0xc1, 0x52, 0x13, 0x98, 0x0d, 0xcd, 0xc3, 0xa3, 0xc3, 0x81, 0x12, 0xed, - 0xf6, 0xfe, 0x7e, 0xcf, 0x40, 0xd4, 0xee, 0xf6, 0x68, 0xbb, 0x67, 0xe2, 0x68, 0xf4, 0x8b, 0xe3, - 0x41, 0xaf, 0xe1, 0xfe, 0x95, 0x01, 0x76, 0xe1, 0xef, 0xd9, 0x67, 0xe8, 0xa8, 0x29, 0xbe, 0xe8, - 0xe7, 0x4b, 0xc5, 0x58, 0x2d, 0xc1, 0xe4, 0x05, 0x1d, 0x2d, 0x86, 0x24, 0x51, 0x44, 0x00, 0x02, - 0xea, 0xe9, 0x6d, 0x63, 0xa1, 0x96, 0xc2, 0x4c, 0x3d, 0x89, 0x85, 0x8e, 0xec, 0x34, 0x26, 0x05, - 0x86, 0xb1, 0x2f, 0x90, 0xbb, 0xa5, 0x15, 0x88, 0xf0, 0x48, 0xba, 0x7f, 0x6d, 0x82, 0x5d, 0x46, - 0xfb, 0x87, 0xe0, 0x4c, 0x0b, 0x71, 0x68, 0x9f, 0xb1, 0xb2, 0x20, 0x23, 0x5e, 0xd1, 0xd9, 0x1d, - 0x30, 0x2f, 0x2e, 0xb5, 0x3a, 0x2d, 0xe4, 0x7a, 0xf1, 0x92, 0x9b, 0x17, 0x97, 0x95, 0xd3, 0x69, - 0xbd, 0xd1, 0xe9, 0xdc, 0x87, 0xdb, 0x7e, 0x24, 0xbc, 0x78, 0x5c, 0xf9, 0x0c, 0xf5, 0x2c, 0x56, - 0x09, 0x7d, 0x5c, 0x3a, 0x0e, 0xed, 0x38, 0xdb, 0x55, 0xf8, 0xfd, 0x04, 0x5a, 0x81, 0x88, 0x72, - 0xaf, 0x5e, 0xcb, 0x1e, 0x65, 0x9e, 0x1f, 0x89, 0x5d, 0x44, 0x73, 0x45, 0x65, 0x1b, 0x60, 0x17, - 0xa9, 0x88, 0xf6, 0xf9, 0x54, 0x14, 0x15, 0x7a, 0xe0, 0x25, 0xb5, 0x12, 0x33, 0xd4, 0xc4, 0xec, - 0x7e, 0x0e, 0x8d, 0x17, 0x2f, 0x87, 0xfa, 0xae, 0xc6, 0x2b, 0x77, 0x2d, 0x84, 0x6d, 0x56, 0xc2, - 0x76, 0xff, 0xaf, 0x01, 0x6d, 0xed, 0x1b, 0xf0, 0xdc, 0xb3, 0x32, 0x81, 0xc7, 0xe1, 0x62, 0x3c, - 0x2f, 0x9d, 0x4c, 0xbd, 0xef, 0xd1, 0x78, 0x73, 0xdf, 0x83, 0xfd, 0x14, 0xba, 0xa9, 0xa2, 0xd5, - 0xdd, 0xd2, 0x7b, 0xf5, 0x39, 0xfa, 0x97, 0xe6, 0x75, 0xd2, 0x0a, 0x40, 0x63, 0xa0, 0x52, 0x31, - 0xf7, 0x26, 0xa4, 0xa2, 0x2e, 0x6f, 0x23, 0x3c, 0xf2, 0x26, 0x37, 0x38, 0xa7, 0x5f, 0xc3, 0xc7, - 0x60, 0xa1, 0x92, 0xa4, 0xfd, 0x2e, 0xf9, 0x0d, 0xf4, 0x4b, 0x75, 0x97, 0xb1, 0xb2, 0xe8, 0x32, - 0x3e, 0x00, 0xc7, 0x4f, 0xa6, 0xd3, 0x90, 0x68, 0xab, 0x3a, 0x11, 0x27, 0xc4, 0x48, 0xba, 0x7f, - 0x66, 0x40, 0x5b, 0xdf, 0x96, 0x75, 0xa0, 0xbd, 0x3b, 0x78, 0xb6, 0x7d, 0xb2, 0x8f, 0x5e, 0x0b, - 0xc0, 0x7a, 0xba, 0x77, 0xb8, 0xcd, 0x7f, 0xd1, 0x33, 0xf0, 0x99, 0xed, 0x1d, 0x8e, 0x7a, 0x26, - 0x73, 0xa0, 0xf5, 0x6c, 0xff, 0x68, 0x7b, 0xd4, 0x6b, 0xe0, 0x3b, 0x7b, 0x7a, 0x74, 0xb4, 0xdf, - 0x6b, 0xb2, 0x2e, 0xd8, 0xbb, 0xdb, 0xa3, 0xc1, 0x68, 0xef, 0x60, 0xd0, 0x6b, 0x21, 0xef, 0xf3, - 0xc1, 0x51, 0xcf, 0xc2, 0xc1, 0xc9, 0xde, 0x6e, 0xaf, 0x8d, 0xf4, 0xe3, 0xed, 0xe1, 0xf0, 0xeb, - 0x23, 0xbe, 0xdb, 0xb3, 0x71, 0xdd, 0xe1, 0x88, 0xef, 0x1d, 0x3e, 0xef, 0x39, 0x38, 0x3e, 0x7a, - 0xfa, 0xd5, 0x60, 0x67, 0xd4, 0x03, 0xf7, 0x73, 0xe8, 0xd4, 0x24, 0x88, 0xb3, 0xf9, 0xe0, 0x59, - 0xef, 0x16, 0x6e, 0xf9, 0x72, 0x7b, 0xff, 0x64, 0xd0, 0x33, 0xd8, 0x2a, 0x00, 0x0d, 0xc7, 0xfb, - 0xdb, 0x87, 0xcf, 0x7b, 0xa6, 0xfb, 0x73, 0xb0, 0x4f, 0xc2, 0xe0, 0x69, 0x94, 0xf8, 0x17, 0x68, - 0x18, 0xa7, 0x9e, 0x14, 0x3a, 0xd4, 0xd3, 0x18, 0x63, 0x11, 0x19, 0xa5, 0xd4, 0xba, 0xd7, 0x10, - 0xca, 0x2a, 0x9e, 0x4d, 0xc7, 0xd4, 0x2b, 0x6b, 0x28, 0xcf, 0x1b, 0xcf, 0xa6, 0x27, 0x61, 0x20, - 0xdd, 0x43, 0x68, 0x9f, 0x84, 0xc1, 0xb1, 0xe7, 0x5f, 0xa0, 0x3b, 0x3a, 0xc5, 0xa5, 0xc7, 0x32, - 0xfc, 0x56, 0x68, 0x0f, 0xed, 0x10, 0x66, 0x18, 0x7e, 0x2b, 0xd8, 0xc7, 0x60, 0x11, 0x50, 0xe4, - 0x77, 0x64, 0xe6, 0xc5, 0x71, 0xb8, 0xa6, 0xb9, 0x7f, 0x61, 0x94, 0xd7, 0xa2, 0x16, 0xc9, 0x3d, - 0x68, 0xa6, 0x9e, 0x7f, 0xa1, 0x7d, 0x50, 0x47, 0xcf, 0xc1, 0xfd, 0x38, 0x11, 0xd8, 0x7d, 0xb0, - 0xb5, 0xed, 0x14, 0x0b, 0x77, 0x6a, 0x46, 0xc6, 0x4b, 0xe2, 0xa2, 0x56, 0x1b, 0x8b, 0x5a, 0xc5, - 0x9b, 0xcb, 0x34, 0x0a, 0xa9, 0xda, 0x6d, 0xa0, 0xaf, 0x52, 0x90, 0xfb, 0x63, 0x80, 0xaa, 0xff, - 0x74, 0x4d, 0xb1, 0xf4, 0x0e, 0xb4, 0xbc, 0x28, 0xd4, 0x02, 0x73, 0xb8, 0x02, 0xdc, 0x43, 0xe8, - 0xd4, 0xba, 0x56, 0x28, 0x3e, 0x2f, 0x8a, 0xc6, 0x17, 0xe2, 0x4a, 0xd2, 0x5c, 0x9b, 0xb7, 0xbd, - 0x28, 0x7a, 0x21, 0xae, 0x24, 0xc6, 0x05, 0xd5, 0xf0, 0x32, 0x97, 0x3a, 0x28, 0x34, 0x95, 0x2b, - 0xa2, 0xfb, 0x23, 0xb0, 0x54, 0x5b, 0xa5, 0x66, 0xe9, 0xc6, 0x8d, 0xd1, 0xf4, 0x4b, 0x7d, 0x66, - 0x6a, 0xc2, 0xb0, 0x87, 0xba, 0xb1, 0x26, 0x55, 0x1b, 0xcf, 0xa8, 0x32, 0x52, 0xc5, 0xa4, 0x7b, - 0x6a, 0xc4, 0xec, 0xee, 0x82, 0xfd, 0xda, 0x56, 0xa5, 0x16, 0x80, 0x59, 0x09, 0xe0, 0x9a, 0xe6, - 0xa5, 0xfb, 0x4b, 0x80, 0xaa, 0x01, 0xa7, 0x1f, 0x9e, 0x5a, 0x05, 0x1f, 0xde, 0x03, 0xac, 0x72, - 0xc3, 0x28, 0xc8, 0x44, 0xbc, 0x70, 0xeb, 0xaa, 0x65, 0x57, 0xd2, 0xd9, 0x3a, 0x34, 0xa9, 0xaf, - 0xd8, 0xa8, 0x1c, 0x63, 0xd9, 0x54, 0x24, 0x8a, 0x3b, 0x87, 0x15, 0x15, 0xa4, 0xb9, 0xf8, 0xa3, - 0x99, 0x90, 0xaf, 0x4d, 0xfd, 0xee, 0x02, 0x94, 0x6e, 0xbc, 0xe8, 0x90, 0xd6, 0x30, 0x68, 0x04, - 0x67, 0xa1, 0x88, 0x82, 0xe2, 0x36, 0x1a, 0x42, 0x25, 0xab, 0xe0, 0xdd, 0x54, 0x6d, 0x24, 0x02, - 0xdc, 0xdf, 0x83, 0x6e, 0xb1, 0x33, 0xf5, 0x69, 0x1e, 0x96, 0x09, 0x84, 0x92, 0xb1, 0x2a, 0xd3, - 0x14, 0x0b, 0x56, 0xbc, 0x4f, 0xcd, 0xbe, 0x51, 0xe4, 0x10, 0xee, 0x7f, 0x34, 0x8a, 0xd9, 0xba, - 0x6d, 0xb1, 0x90, 0x96, 0x1a, 0xcb, 0x69, 0xe9, 0x62, 0x8a, 0x67, 0xfe, 0x5a, 0x29, 0xde, 0x4f, - 0xc0, 0x09, 0x28, 0xcf, 0x09, 0x2f, 0x0b, 0x97, 0xbd, 0xb6, 0x9c, 0xd3, 0xe8, 0x4c, 0x28, 0xbc, - 0x14, 0xbc, 0x62, 0xc6, 0xb3, 0xe4, 0xc9, 0x85, 0x88, 0xc3, 0x6f, 0xa9, 0x2f, 0x83, 0x77, 0xae, - 0x10, 0x55, 0x93, 0x4b, 0xa5, 0x3b, 0xba, 0xc9, 0x55, 0xf4, 0xeb, 0xac, 0xaa, 0x5f, 0x87, 0xf2, - 0x9c, 0xa5, 0x52, 0x64, 0x79, 0x91, 0x20, 0x2b, 0xa8, 0xcc, 0x25, 0x1d, 0xcd, 0x8b, 0xb9, 0xe4, - 0x87, 0xd0, 0x8d, 0x93, 0x78, 0x1c, 0xcf, 0xa2, 0x08, 0x53, 0x78, 0xdd, 0x9a, 0xed, 0xc4, 0x49, - 0x7c, 0xa8, 0x51, 0xec, 0x01, 0xbc, 0x55, 0x67, 0x51, 0xf6, 0xdc, 0x51, 0x9d, 0x9d, 0x1a, 0x1f, - 0x59, 0xfd, 0x06, 0xf4, 0x92, 0xd3, 0x5f, 0x0a, 0x3f, 0x27, 0x89, 0x8d, 0xc9, 0x90, 0xbb, 0x2a, - 0x70, 0x2b, 0x3c, 0x8a, 0xe8, 0xd0, 0x9b, 0x0a, 0xf7, 0x4b, 0x70, 0x4a, 0x21, 0xd4, 0x12, 0x25, - 0x07, 0x5a, 0x7b, 0x87, 0xbb, 0x83, 0x3f, 0xe8, 0x19, 0xe8, 0xe5, 0xf9, 0xe0, 0xe5, 0x80, 0x0f, - 0x07, 0x3d, 0x13, 0x3d, 0xf0, 0xee, 0x60, 0x7f, 0x30, 0x1a, 0xf4, 0x1a, 0x5f, 0x35, 0xed, 0x76, - 0xcf, 0xa6, 0xae, 0x45, 0x14, 0xfa, 0x61, 0xee, 0x0e, 0x01, 0xaa, 0x9c, 0x0e, 0xfd, 0x4d, 0xb5, - 0xb7, 0xd2, 0xa8, 0x9d, 0xeb, 0x5d, 0x31, 0xdb, 0xd4, 0xa6, 0x66, 0xde, 0x94, 0x6d, 0x2a, 0xba, - 0x7b, 0x02, 0xf6, 0x81, 0x97, 0xbe, 0x52, 0x9d, 0x75, 0xcb, 0x1a, 0x7f, 0xa6, 0x3b, 0x6d, 0x3a, - 0x7c, 0x7f, 0x02, 0x6d, 0xed, 0xf2, 0xf4, 0xab, 0x59, 0x70, 0x87, 0x05, 0xcd, 0xfd, 0x53, 0x03, - 0xde, 0x39, 0x48, 0x2e, 0x45, 0x99, 0xc1, 0x1c, 0x7b, 0x57, 0x51, 0xe2, 0x05, 0x6f, 0x30, 0xc4, - 0x1f, 0x02, 0xc8, 0x64, 0x96, 0xf9, 0x62, 0x3c, 0x29, 0x1b, 0x7c, 0x8e, 0xc2, 0x3c, 0xd7, 0xdf, - 0x12, 0x84, 0xcc, 0x89, 0xa8, 0x03, 0x05, 0xc2, 0x48, 0x7a, 0x17, 0xac, 0x7c, 0x1e, 0x57, 0xfd, - 0xc4, 0x56, 0x8e, 0xa5, 0xb4, 0xbb, 0x03, 0xce, 0x68, 0x4e, 0x05, 0xe3, 0x4c, 0x2e, 0xc4, 0x64, - 0xe3, 0x35, 0x31, 0xd9, 0x5c, 0x8a, 0xc9, 0xff, 0x6d, 0x40, 0xa7, 0x96, 0x5a, 0xb1, 0x0f, 0xa1, - 0x99, 0xcf, 0xe3, 0xc5, 0x46, 0x7c, 0xb1, 0x09, 0x27, 0x12, 0xda, 0x1b, 0x56, 0x93, 0x9e, 0x94, - 0xe1, 0x24, 0x16, 0x81, 0x5e, 0x12, 0x2b, 0xcc, 0x6d, 0x8d, 0x62, 0xfb, 0x70, 0x5b, 0x79, 0x92, - 0xa2, 0x09, 0x57, 0xd4, 0x10, 0x1f, 0x2d, 0xa5, 0x72, 0xaa, 0xa8, 0xde, 0x29, 0xb8, 0x54, 0x9b, - 0x61, 0x75, 0xb2, 0x80, 0x5c, 0xdb, 0x86, 0xb7, 0xaf, 0x61, 0xfb, 0x5e, 0xfd, 0x94, 0x7b, 0xb0, - 0x32, 0x9a, 0xc7, 0xa3, 0x70, 0x2a, 0x64, 0xee, 0x4d, 0x53, 0xca, 0x69, 0x74, 0x24, 0x68, 0x72, - 0x33, 0x97, 0xee, 0xa7, 0xd0, 0x3d, 0x16, 0x22, 0xe3, 0x42, 0xa6, 0x49, 0xac, 0xe2, 0xb9, 0xa4, - 0x4b, 0xeb, 0xb0, 0xa3, 0x21, 0xf7, 0x0f, 0xc1, 0xc1, 0x44, 0xfe, 0xa9, 0x97, 0xfb, 0xe7, 0xdf, - 0x27, 0xd1, 0xff, 0x14, 0xda, 0xa9, 0x32, 0x13, 0x9d, 0x7b, 0x77, 0xc9, 0xc7, 0x69, 0xd3, 0xe1, - 0x05, 0xd1, 0xe5, 0xd0, 0x38, 0x9c, 0x4d, 0xeb, 0x5f, 0xcf, 0x9a, 0xea, 0xeb, 0xd9, 0x42, 0x69, - 0x6c, 0x2e, 0x96, 0xc6, 0x68, 0x79, 0x67, 0x49, 0xf6, 0xc7, 0x5e, 0x16, 0x88, 0x40, 0xd7, 0xdf, - 0x15, 0xc2, 0xfd, 0x06, 0x3a, 0x85, 0x66, 0xf6, 0x02, 0xea, 0x10, 0x92, 0x69, 0xec, 0x05, 0x0b, - 0x96, 0xa2, 0xea, 0x57, 0x11, 0x07, 0x7b, 0x85, 0x4a, 0x15, 0xb0, 0xb8, 0xb3, 0xee, 0xe7, 0x94, - 0x45, 0xf9, 0x33, 0xe8, 0x16, 0xf9, 0xf6, 0x81, 0xc8, 0x3d, 0x32, 0xb6, 0x28, 0x14, 0x71, 0xcd, - 0x10, 0x6d, 0x85, 0x18, 0xc9, 0xd7, 0x74, 0xb8, 0xdd, 0x4d, 0xb0, 0xb4, 0x25, 0x33, 0x68, 0xfa, - 0x49, 0xa0, 0x1e, 0x50, 0x8b, 0xd3, 0x18, 0xc5, 0x31, 0x95, 0x93, 0x22, 0x78, 0x4e, 0xe5, 0xc4, - 0xfd, 0x67, 0x13, 0x56, 0x9e, 0x7a, 0xfe, 0xc5, 0x2c, 0x2d, 0xa2, 0x57, 0xad, 0x68, 0x32, 0x16, - 0x8a, 0xa6, 0x7a, 0x81, 0x64, 0x2e, 0x14, 0x48, 0x0b, 0x07, 0x6a, 0x2c, 0x46, 0xbc, 0xf7, 0xa0, - 0x3d, 0x8b, 0xc3, 0x79, 0xf1, 0xea, 0x1c, 0x6e, 0x21, 0x38, 0x92, 0x6c, 0x1d, 0x3a, 0xf8, 0x30, - 0xc3, 0x98, 0x4a, 0x25, 0x12, 0x88, 0xc3, 0xeb, 0x28, 0x7c, 0xe9, 0x9e, 0xef, 0x0b, 0x29, 0x31, - 0x6f, 0xd1, 0xe9, 0xb6, 0xa3, 0x30, 0x2f, 0xc4, 0x15, 0x39, 0x02, 0xe1, 0x67, 0x22, 0x1f, 0x57, - 0x65, 0x8f, 0xa3, 0x30, 0x48, 0xfe, 0x08, 0x56, 0xa4, 0x90, 0x32, 0x4c, 0xe2, 0x31, 0x45, 0x0e, - 0x5d, 0x9d, 0x76, 0x35, 0x72, 0x84, 0x38, 0x54, 0xb8, 0x17, 0x27, 0xf1, 0xd5, 0x34, 0x99, 0x49, - 0x1d, 0x0c, 0x2a, 0xc4, 0x52, 0xb4, 0x86, 0xe5, 0x68, 0xed, 0xe6, 0xb0, 0x32, 0x98, 0xa7, 0xf4, - 0x9d, 0xe4, 0x8d, 0x91, 0xbf, 0x26, 0x56, 0x73, 0x41, 0xac, 0x35, 0x01, 0xa9, 0x1e, 0x74, 0x21, - 0x20, 0xcc, 0x05, 0x92, 0x6c, 0xea, 0xe5, 0x85, 0xe0, 0x14, 0xe4, 0xfe, 0xa5, 0x09, 0x8e, 0x52, - 0x19, 0x5e, 0xf3, 0x33, 0x68, 0x52, 0x44, 0x36, 0x28, 0xbc, 0xbe, 0x8b, 0x0f, 0xa7, 0x24, 0x6e, - 0xbe, 0x10, 0x57, 0x14, 0x93, 0x89, 0xe5, 0xda, 0x7e, 0x8e, 0xf6, 0xde, 0x2a, 0x19, 0x25, 0xef, - 0xfd, 0x01, 0x38, 0xca, 0x03, 0x22, 0x5e, 0x7f, 0x03, 0x20, 0xc4, 0x49, 0x48, 0x1f, 0x50, 0x72, - 0x91, 0x4d, 0xb5, 0xb6, 0x68, 0x5c, 0x45, 0x63, 0x4b, 0x7d, 0xd5, 0x21, 0xc0, 0x3d, 0x87, 0xb6, - 0xde, 0x1d, 0xa3, 0xd7, 0xc9, 0xe1, 0x8b, 0xc3, 0xa3, 0xaf, 0x0f, 0x7b, 0xb7, 0xca, 0xaa, 0xdf, - 0xa8, 0xe2, 0x9b, 0x59, 0x8f, 0x6f, 0x0d, 0xc4, 0xef, 0x1c, 0x9d, 0x1c, 0x8e, 0x7a, 0x4d, 0xb6, - 0x02, 0x0e, 0x0d, 0xc7, 0x7c, 0xf0, 0xb2, 0xd7, 0xa2, 0x3a, 0x64, 0xe7, 0x67, 0x83, 0x83, 0xed, - 0x9e, 0x55, 0xf6, 0x0c, 0xda, 0x18, 0x47, 0xde, 0x52, 0x57, 0xae, 0x67, 0xed, 0xf5, 0x0f, 0xeb, - 0x4d, 0xf5, 0x61, 0xfd, 0xb7, 0x9b, 0xa8, 0x6f, 0xfd, 0x8b, 0x01, 0x4d, 0xf4, 0x59, 0xec, 0x21, - 0x38, 0x3f, 0x13, 0x5e, 0x96, 0x9f, 0x0a, 0x2f, 0x67, 0x0b, 0xfe, 0x69, 0x6d, 0x01, 0x72, 0x6f, - 0x3d, 0x31, 0xd8, 0xa6, 0xfa, 0x64, 0x56, 0x7c, 0x09, 0x5c, 0x29, 0x3c, 0x1f, 0x79, 0xc6, 0x65, - 0xfe, 0x0d, 0xe2, 0xff, 0x2a, 0x09, 0xe3, 0x1d, 0xf5, 0x1d, 0x89, 0x2d, 0x7b, 0xca, 0xe5, 0x19, - 0xec, 0x11, 0x58, 0x7b, 0x12, 0x5d, 0xf2, 0xab, 0xac, 0x14, 0xf1, 0xeb, 0xde, 0xda, 0xbd, 0xb5, - 0xf5, 0x8f, 0x0d, 0x68, 0x7e, 0x23, 0xb2, 0x84, 0xfd, 0x08, 0xda, 0xba, 0x9b, 0xca, 0x6a, 0x5d, - 0xd3, 0x35, 0x4a, 0xf9, 0x96, 0xda, 0xac, 0xb4, 0x4b, 0x4f, 0x25, 0x0d, 0x55, 0x13, 0x83, 0x55, - 0xcd, 0xde, 0x57, 0x0e, 0xf5, 0x25, 0xf4, 0x86, 0x79, 0x26, 0xbc, 0x69, 0x8d, 0x7d, 0x51, 0x50, - 0xd7, 0x75, 0x44, 0x48, 0x5e, 0x0f, 0xc1, 0x52, 0x71, 0x6f, 0x69, 0xc2, 0x72, 0x73, 0x83, 0x98, - 0xef, 0x43, 0x67, 0x78, 0x9e, 0xcc, 0xa2, 0x60, 0x28, 0xb2, 0x4b, 0xc1, 0x6a, 0x5f, 0x4c, 0xd6, - 0x6a, 0x63, 0xf7, 0x16, 0xdb, 0x00, 0x50, 0xae, 0x1d, 0x2b, 0x4a, 0xd6, 0x46, 0xda, 0xe1, 0x6c, - 0xaa, 0x16, 0xad, 0xf9, 0x7c, 0xc5, 0x59, 0x0b, 0x7f, 0xaf, 0xe3, 0xfc, 0x02, 0x56, 0x76, 0xc8, - 0x66, 0x8e, 0xb2, 0xed, 0xd3, 0x24, 0xcb, 0xd9, 0xf2, 0x57, 0x93, 0xb5, 0x65, 0x84, 0x7b, 0x8b, - 0x3d, 0x01, 0x7b, 0x94, 0x5d, 0x29, 0xfe, 0xb7, 0x74, 0xd6, 0x50, 0xed, 0x77, 0xcd, 0x2d, 0xb7, - 0xfe, 0xae, 0x01, 0xd6, 0xd7, 0x49, 0x76, 0x21, 0x32, 0xf6, 0x00, 0x2c, 0xea, 0x42, 0x69, 0x33, - 0x2a, 0x3b, 0x52, 0xd7, 0x6d, 0xf4, 0x31, 0x38, 0x24, 0x94, 0x91, 0x27, 0x2f, 0x94, 0xaa, 0xe8, - 0x2f, 0x1d, 0x4a, 0x2e, 0xaa, 0x9e, 0x20, 0xbd, 0xae, 0x2a, 0x45, 0x95, 0x4d, 0xb9, 0x85, 0xd6, - 0xd0, 0x5a, 0x5b, 0xf5, 0x79, 0x86, 0x68, 0x9a, 0x4f, 0x0c, 0x74, 0x46, 0x43, 0x75, 0x53, 0x64, - 0xaa, 0x3e, 0x70, 0xaf, 0xad, 0x16, 0x88, 0x72, 0xe5, 0xc7, 0x60, 0xa9, 0x64, 0x53, 0x5d, 0x73, - 0xa1, 0x82, 0x5a, 0xeb, 0xd5, 0x51, 0x7a, 0xc2, 0x67, 0x60, 0xa9, 0x57, 0xae, 0x26, 0x2c, 0x04, - 0x2d, 0x75, 0x6a, 0x15, 0xf8, 0x14, 0xab, 0xf2, 0xcb, 0x8a, 0x75, 0xc1, 0x47, 0x2f, 0xb1, 0x3e, - 0x82, 0x1e, 0x17, 0xbe, 0x08, 0x6b, 0x69, 0x28, 0x2b, 0x2e, 0x75, 0xcd, 0xeb, 0xfb, 0x12, 0x56, - 0x16, 0x52, 0x56, 0xd6, 0x27, 0x41, 0x5f, 0x93, 0xc5, 0x2e, 0x4f, 0x7e, 0xda, 0xfb, 0xb7, 0xef, - 0xee, 0x1a, 0xff, 0xfe, 0xdd, 0x5d, 0xe3, 0x3f, 0xbf, 0xbb, 0x6b, 0xfc, 0xea, 0xbf, 0xee, 0xde, - 0x3a, 0xb5, 0xe8, 0xaf, 0x40, 0x5f, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x58, 0x1f, - 0xab, 0x4e, 0x24, 0x00, 0x00, + // 3767 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0x1c, 0x47, + 0x76, 0xea, 0x9e, 0x99, 0x9e, 0xee, 0x37, 0x43, 0x6a, 0x5c, 0x96, 0xe5, 0x31, 0xbd, 0x2b, 0xd1, + 0x6d, 0xcb, 0xa2, 0xa5, 0x15, 0x25, 0xd3, 0x1b, 0x64, 0xbd, 0x41, 0x0e, 0x14, 0x39, 0xd2, 0xd2, + 0xe2, 0xd7, 0xd6, 0x0c, 0xe5, 0xac, 0x0f, 0x19, 0x34, 0xbb, 0x8b, 0xc3, 0x5e, 0xf6, 0x74, 0x77, + 0xba, 0x7a, 0x98, 0xa1, 0x6f, 0x39, 0x24, 0x40, 0x80, 0xe4, 0x94, 0xcb, 0x1e, 0x82, 0x20, 0x08, + 0x90, 0x4b, 0x2e, 0xb9, 0x06, 0x39, 0x06, 0x08, 0x90, 0x63, 0x90, 0x3f, 0x90, 0xc0, 0xc9, 0x31, + 0xe7, 0x9c, 0x83, 0xf7, 0xaa, 0xfa, 0x63, 0x46, 0x94, 0xb4, 0x5e, 0x60, 0x4f, 0x53, 0xef, 0xa3, + 0xbe, 0xde, 0x7b, 0xf5, 0xbe, 0x7a, 0xc0, 0x4e, 0x4f, 0x37, 0xd3, 0x2c, 0xc9, 0x13, 0x66, 0xa6, + 0xa7, 0x6b, 0x8e, 0x97, 0x86, 0x0a, 0x5c, 0xbb, 0x3f, 0x09, 0xf3, 0xf3, 0xd9, 0xe9, 0xa6, 0x9f, + 0x4c, 0x1f, 0x07, 0x93, 0xcc, 0x4b, 0xcf, 0x1f, 0x85, 0xc9, 0xe3, 0x53, 0x2f, 0x98, 0x88, 0xec, + 0x71, 0x7a, 0xfa, 0xb8, 0x98, 0xe7, 0xae, 0x41, 0x73, 0x3f, 0x94, 0x39, 0x63, 0xd0, 0x9c, 0x85, + 0x81, 0xec, 0x1b, 0xeb, 0x8d, 0x0d, 0x8b, 0xd3, 0xd8, 0x3d, 0x00, 0x67, 0xe4, 0xc9, 0x8b, 0x97, + 0x5e, 0x34, 0x13, 0xac, 0x07, 0x8d, 0x4b, 0x2f, 0xea, 0x1b, 0xeb, 0xc6, 0x46, 0x97, 0xe3, 0x90, + 0x6d, 0x82, 0x7d, 0xe9, 0x45, 0xe3, 0xfc, 0x2a, 0x15, 0x7d, 0x73, 0xdd, 0xd8, 0x58, 0xdd, 0x7a, + 0x77, 0x33, 0x3d, 0xdd, 0x3c, 0x4e, 0x64, 0x1e, 0xc6, 0x93, 0xcd, 0x97, 0x5e, 0x34, 0xba, 0x4a, + 0x05, 0x6f, 0x5f, 0xaa, 0x81, 0x7b, 0x04, 0x9d, 0x61, 0xe6, 0x3f, 0x9b, 0xc5, 0x7e, 0x1e, 0x26, + 0x31, 0xee, 0x18, 0x7b, 0x53, 0x41, 0x2b, 0x3a, 0x9c, 0xc6, 0x88, 0xf3, 0xb2, 0x89, 0xec, 0x37, + 0xd6, 0x1b, 0x88, 0xc3, 0x31, 0xeb, 0x43, 0x3b, 0x94, 0x3b, 0xc9, 0x2c, 0xce, 0xfb, 0xcd, 0x75, + 0x63, 0xc3, 0xe6, 0x05, 0xe8, 0xfe, 0x79, 0x03, 0x5a, 0x3f, 0x9f, 0x89, 0xec, 0x8a, 0xe6, 0xe5, + 0x79, 0x56, 0xac, 0x85, 0x63, 0x76, 0x0b, 0x5a, 0x91, 0x17, 0x4f, 0x64, 0xdf, 0xa4, 0xc5, 0x14, + 0xc0, 0x3e, 0x04, 0xc7, 0x3b, 0xcb, 0x45, 0x36, 0x9e, 0x85, 0x41, 0xbf, 0xb1, 0x6e, 0x6c, 0x58, + 0xdc, 0x26, 0xc4, 0x49, 0x18, 0xb0, 0x0f, 0xc0, 0x0e, 0x92, 0xb1, 0x5f, 0xdf, 0x2b, 0x48, 0x68, + 0x2f, 0xf6, 0x31, 0xd8, 0xb3, 0x30, 0x18, 0x47, 0xa1, 0xcc, 0xfb, 0xad, 0x75, 0x63, 0xa3, 0xb3, + 0x65, 0xe3, 0x65, 0x51, 0x76, 0xbc, 0x3d, 0x0b, 0x03, 0x12, 0xe2, 0x03, 0xb0, 0x65, 0xe6, 0x8f, + 0xcf, 0x66, 0xb1, 0xdf, 0xb7, 0x88, 0xe9, 0x26, 0x32, 0xd5, 0x6e, 0xcd, 0xdb, 0x52, 0x01, 0x78, + 0xad, 0x4c, 0x5c, 0x8a, 0x4c, 0x8a, 0x7e, 0x5b, 0x6d, 0xa5, 0x41, 0xf6, 0x04, 0x3a, 0x67, 0x9e, + 0x2f, 0xf2, 0x71, 0xea, 0x65, 0xde, 0xb4, 0x6f, 0x57, 0x0b, 0x3d, 0x43, 0xf4, 0x31, 0x62, 0x25, + 0x87, 0xb3, 0x12, 0x60, 0x5f, 0xc0, 0x0a, 0x41, 0x72, 0x7c, 0x16, 0x46, 0xb9, 0xc8, 0xfa, 0x0e, + 0xcd, 0x59, 0xa5, 0x39, 0x84, 0x19, 0x65, 0x42, 0xf0, 0xae, 0x62, 0x52, 0x18, 0xf6, 0x43, 0x00, + 0x31, 0x4f, 0xbd, 0x38, 0x18, 0x7b, 0x51, 0xd4, 0x07, 0x3a, 0x83, 0xa3, 0x30, 0xdb, 0x51, 0xc4, + 0xde, 0xc7, 0xf3, 0x79, 0xc1, 0x38, 0x97, 0xfd, 0x95, 0x75, 0x63, 0xa3, 0xc9, 0x2d, 0x04, 0x47, + 0x12, 0xe5, 0xea, 0x7b, 0xfe, 0xb9, 0xe8, 0xaf, 0xae, 0x1b, 0x1b, 0x2d, 0xae, 0x00, 0x77, 0x0b, + 0x1c, 0xb2, 0x13, 0x92, 0xc3, 0x3d, 0xb0, 0x2e, 0x11, 0x50, 0xe6, 0xd4, 0xd9, 0x5a, 0xc1, 0x83, + 0x94, 0xa6, 0xc4, 0x35, 0xd1, 0xbd, 0x03, 0xf6, 0xbe, 0x17, 0x4f, 0x0a, 0xfb, 0x43, 0x05, 0xd1, + 0x04, 0x87, 0xd3, 0xd8, 0xfd, 0x95, 0x09, 0x16, 0x17, 0x72, 0x16, 0xe5, 0xec, 0x3e, 0x00, 0x8a, + 0x7f, 0xea, 0xe5, 0x59, 0x38, 0xd7, 0xab, 0x56, 0x0a, 0x70, 0x66, 0x61, 0x70, 0x40, 0x24, 0xf6, + 0x04, 0xba, 0xb4, 0x7a, 0xc1, 0x6a, 0x56, 0x07, 0x28, 0xcf, 0xc7, 0x3b, 0xc4, 0xa2, 0x67, 0xdc, + 0x06, 0x8b, 0x34, 0xae, 0xac, 0x6e, 0x85, 0x6b, 0x88, 0xdd, 0x83, 0xd5, 0x30, 0xce, 0x51, 0x23, + 0x7e, 0x3e, 0x0e, 0x84, 0x2c, 0x4c, 0x62, 0xa5, 0xc4, 0xee, 0x0a, 0x99, 0xb3, 0xcf, 0x41, 0x89, + 0xb5, 0xd8, 0xb0, 0x45, 0x1b, 0xae, 0x96, 0xea, 0x92, 0x6a, 0x47, 0xe2, 0xd1, 0x3b, 0x3e, 0x82, + 0x0e, 0xde, 0xaf, 0x98, 0x61, 0xd1, 0x8c, 0x2e, 0xdd, 0x46, 0x8b, 0x83, 0x03, 0x32, 0x68, 0x76, + 0x14, 0x0d, 0x9a, 0x9d, 0x32, 0x13, 0x1a, 0xbb, 0x03, 0x68, 0x1d, 0x65, 0x81, 0xc8, 0xae, 0xb5, + 0x7c, 0x06, 0xcd, 0x40, 0x48, 0x9f, 0x1e, 0xa5, 0xcd, 0x69, 0x5c, 0xbd, 0x86, 0x46, 0xed, 0x35, + 0xb8, 0x7f, 0x63, 0x40, 0x67, 0x98, 0x64, 0xf9, 0x81, 0x90, 0xd2, 0x9b, 0x08, 0x76, 0x17, 0x5a, + 0x09, 0x2e, 0xab, 0x25, 0xec, 0xe0, 0x99, 0x68, 0x1f, 0xae, 0xf0, 0x4b, 0x7a, 0x30, 0x5f, 0xaf, + 0x07, 0xb4, 0x12, 0x7a, 0x47, 0x0d, 0x6d, 0x25, 0xf4, 0x8a, 0x6e, 0x83, 0x95, 0x9c, 0x9d, 0x49, + 0xa1, 0x64, 0xd9, 0xe2, 0x1a, 0x7a, 0xad, 0xb1, 0xb9, 0xbf, 0x03, 0x80, 0xe7, 0xfb, 0x9e, 0x56, + 0xe0, 0x9e, 0x43, 0x87, 0x7b, 0x67, 0xf9, 0x4e, 0x12, 0xe7, 0x62, 0x9e, 0xb3, 0x55, 0x30, 0xc3, + 0x80, 0x44, 0x64, 0x71, 0x33, 0x0c, 0xf0, 0x70, 0x93, 0x2c, 0x99, 0xa5, 0x24, 0xa1, 0x15, 0xae, + 0x00, 0x12, 0x65, 0x10, 0x64, 0x74, 0x62, 0x14, 0x65, 0x10, 0x64, 0xec, 0x2e, 0x74, 0x64, 0xec, + 0xa5, 0xf2, 0x3c, 0xc9, 0xf1, 0x70, 0x4d, 0x3a, 0x1c, 0x14, 0xa8, 0x91, 0x74, 0xff, 0xd5, 0x00, + 0xeb, 0x40, 0x4c, 0x4f, 0x45, 0xf6, 0xca, 0x2e, 0x1f, 0x80, 0x4d, 0x0b, 0x8f, 0xc3, 0x40, 0x6f, + 0xd4, 0x26, 0x78, 0x2f, 0xb8, 0x76, 0xab, 0xdb, 0x60, 0x45, 0xc2, 0x43, 0xe1, 0x2b, 0x3b, 0xd3, + 0x10, 0xca, 0xc6, 0x9b, 0x8e, 0x03, 0xe1, 0x05, 0xe4, 0x78, 0x6c, 0x6e, 0x79, 0xd3, 0x5d, 0xe1, + 0x05, 0x78, 0xb6, 0xc8, 0x93, 0xf9, 0x78, 0x96, 0x06, 0x5e, 0x2e, 0xc8, 0xe1, 0x34, 0xd1, 0x70, + 0x64, 0x7e, 0x42, 0x18, 0xf6, 0x00, 0xde, 0xf1, 0xa3, 0x99, 0x44, 0x6f, 0x17, 0xc6, 0x67, 0xc9, + 0x38, 0x89, 0xa3, 0x2b, 0x92, 0xaf, 0xcd, 0x6f, 0x6a, 0xc2, 0x5e, 0x7c, 0x96, 0x1c, 0xc5, 0xd1, + 0x95, 0xfb, 0x4f, 0x26, 0xb4, 0x9e, 0x93, 0x18, 0x9e, 0x40, 0x7b, 0x4a, 0x17, 0x2a, 0x5e, 0xef, + 0x6d, 0x94, 0x30, 0xd1, 0x36, 0xd5, 0x4d, 0xe5, 0x20, 0xce, 0xb3, 0x2b, 0x5e, 0xb0, 0xe1, 0x8c, + 0xdc, 0x3b, 0x8d, 0x44, 0x2e, 0xb5, 0x45, 0xd4, 0x66, 0x8c, 0x14, 0x41, 0xcf, 0xd0, 0x6c, 0xcb, + 0x62, 0x6d, 0x2c, 0x8b, 0x95, 0xad, 0x81, 0xed, 0x9f, 0x0b, 0xff, 0x42, 0xce, 0xa6, 0x5a, 0xe8, + 0x25, 0xbc, 0xf6, 0x0c, 0xba, 0xf5, 0x73, 0x60, 0x64, 0xba, 0x10, 0x57, 0x24, 0xf8, 0x26, 0xc7, + 0x21, 0x5b, 0x87, 0x16, 0xbd, 0x70, 0x12, 0x7b, 0x67, 0x0b, 0xf0, 0x38, 0x6a, 0x0a, 0x57, 0x84, + 0x9f, 0x9a, 0x3f, 0x31, 0x70, 0x9d, 0xfa, 0xe9, 0xea, 0xeb, 0x38, 0xaf, 0x5f, 0x47, 0x4d, 0xa9, + 0xad, 0xe3, 0x26, 0xd0, 0xde, 0x0f, 0x7d, 0x11, 0x4b, 0x8a, 0x5f, 0x33, 0x29, 0xca, 0xd7, 0x88, + 0x63, 0xbc, 0xca, 0xd4, 0x9b, 0x1f, 0x26, 0x81, 0x90, 0xb4, 0x4e, 0x93, 0x97, 0x30, 0xd2, 0xc4, + 0x3c, 0x0d, 0xb3, 0xab, 0x91, 0x12, 0x42, 0x83, 0x97, 0x30, 0x06, 0x08, 0x11, 0xe3, 0x66, 0x41, + 0x11, 0x8b, 0x34, 0xe8, 0xfe, 0x6d, 0x03, 0xba, 0xdf, 0x88, 0x2c, 0x39, 0xce, 0x92, 0x34, 0x91, + 0x5e, 0xc4, 0xb6, 0x17, 0xc5, 0xa9, 0xd4, 0xb6, 0x8e, 0xa7, 0xad, 0xb3, 0x6d, 0x0e, 0x4b, 0xf9, + 0x2a, 0x75, 0xd4, 0x05, 0xee, 0x82, 0xa5, 0xd4, 0x79, 0x8d, 0xcc, 0x34, 0x05, 0x79, 0x94, 0x02, + 0xe9, 0xac, 0x8b, 0xf2, 0xd0, 0x14, 0x76, 0x07, 0x60, 0xea, 0xcd, 0xf7, 0x85, 0x27, 0xc5, 0x5e, + 0x50, 0xbc, 0x97, 0x0a, 0xa3, 0xa5, 0x31, 0x9a, 0xc7, 0x23, 0x49, 0xe6, 0xac, 0xa4, 0x41, 0x30, + 0xfb, 0x01, 0x38, 0x53, 0x6f, 0x8e, 0x0f, 0x77, 0x2f, 0xd0, 0xe6, 0x5c, 0x21, 0xd8, 0x47, 0xd0, + 0xc8, 0xe7, 0x31, 0x79, 0x41, 0x0c, 0x87, 0x98, 0xeb, 0x8c, 0xe6, 0xb1, 0x7e, 0xe2, 0x1c, 0x69, + 0x85, 0x06, 0xed, 0x4a, 0x83, 0x3d, 0x68, 0xf8, 0x61, 0x40, 0xf1, 0xd0, 0xe1, 0x38, 0x64, 0xf7, + 0xa0, 0x1d, 0x29, 0x6d, 0x51, 0xcc, 0xeb, 0x6c, 0x75, 0x94, 0x03, 0x21, 0x14, 0x2f, 0x68, 0x6b, + 0xbf, 0x0f, 0x37, 0x97, 0xc4, 0x55, 0xb7, 0x8f, 0x15, 0xb5, 0xfa, 0xad, 0xba, 0x7d, 0x34, 0xeb, + 0x36, 0xf1, 0x9f, 0x0d, 0xb8, 0xa9, 0x8d, 0xf4, 0x3c, 0x4c, 0x87, 0x39, 0x3e, 0xc7, 0x3e, 0xb4, + 0xc9, 0x0b, 0x6a, 0xfb, 0x68, 0xf2, 0x02, 0x64, 0xbf, 0x0b, 0x16, 0x79, 0x86, 0xe2, 0xfd, 0xdc, + 0xad, 0x84, 0x5f, 0x4e, 0x57, 0xef, 0x49, 0x6b, 0x4e, 0xb3, 0xb3, 0x1f, 0x43, 0xeb, 0x5b, 0x91, + 0x25, 0xca, 0xab, 0x77, 0xb6, 0xee, 0x5c, 0x37, 0x0f, 0x4d, 0x40, 0x4f, 0x53, 0xcc, 0xbf, 0x45, + 0x1d, 0x7d, 0x82, 0x7e, 0x7c, 0x9a, 0x5c, 0x8a, 0xa0, 0xdf, 0xa6, 0x13, 0xd5, 0xcd, 0xa8, 0x20, + 0x15, 0x4a, 0xb1, 0xaf, 0x55, 0x8a, 0xf3, 0x06, 0xa5, 0xec, 0x42, 0xa7, 0x26, 0x85, 0x6b, 0x14, + 0x72, 0x77, 0xf1, 0xc1, 0x3a, 0xa5, 0x1f, 0xaa, 0xbf, 0xfb, 0x5d, 0x80, 0x4a, 0x26, 0xbf, 0xa9, + 0xf7, 0x70, 0xff, 0xc4, 0x80, 0x9b, 0x3b, 0x49, 0x1c, 0x0b, 0xca, 0xeb, 0x94, 0x86, 0xab, 0x47, + 0x64, 0xbc, 0xf6, 0x11, 0x7d, 0x06, 0x2d, 0x89, 0xcc, 0x7a, 0xf5, 0x77, 0xaf, 0x51, 0x19, 0x57, + 0x1c, 0xe8, 0x25, 0xa7, 0xde, 0x7c, 0x9c, 0x8a, 0x38, 0x08, 0xe3, 0x49, 0xe1, 0x25, 0xa7, 0xde, + 0xfc, 0x58, 0x61, 0xdc, 0xbf, 0x33, 0xc0, 0x52, 0xef, 0x6f, 0x21, 0xd8, 0x18, 0x8b, 0xc1, 0xe6, + 0x07, 0xe0, 0xa4, 0x99, 0x08, 0x42, 0xbf, 0xd8, 0xd5, 0xe1, 0x15, 0x02, 0x6d, 0xf8, 0x2c, 0xc9, + 0x7c, 0x41, 0xcb, 0xdb, 0x5c, 0x01, 0x88, 0x95, 0xa9, 0xe7, 0xab, 0xdc, 0xb4, 0xc1, 0x15, 0x80, + 0x21, 0x4a, 0xe9, 0x90, 0x74, 0x67, 0x73, 0x0d, 0x61, 0x52, 0x4d, 0xe1, 0x9b, 0x02, 0x8c, 0x43, + 0x24, 0x1b, 0x11, 0x14, 0x59, 0xfe, 0xc1, 0x84, 0xee, 0x6e, 0x98, 0x09, 0x3f, 0x17, 0xc1, 0x20, + 0x98, 0xd0, 0x2a, 0x22, 0xce, 0xc3, 0xfc, 0x4a, 0xc7, 0x4a, 0x0d, 0x95, 0xa9, 0x8c, 0xb9, 0x98, + 0xc4, 0x2b, 0x5d, 0x34, 0xa8, 0xee, 0x50, 0x00, 0xdb, 0x02, 0x50, 0x49, 0x1e, 0xd5, 0x1e, 0xcd, + 0xd7, 0xd7, 0x1e, 0x0e, 0xb1, 0xe1, 0x10, 0x05, 0xa4, 0xe6, 0x84, 0x2a, 0x8e, 0x5a, 0x54, 0x98, + 0xcc, 0xd0, 0xde, 0x29, 0x37, 0x3a, 0x15, 0x11, 0xd9, 0x33, 0xe5, 0x46, 0xa7, 0x22, 0x2a, 0x33, + 0xd2, 0xb6, 0x3a, 0x0e, 0x8e, 0xd9, 0xc7, 0x60, 0x26, 0x29, 0x5d, 0x5e, 0x6f, 0x58, 0xbf, 0xd8, + 0xe6, 0x51, 0xca, 0xcd, 0x24, 0x45, 0x2b, 0x50, 0x89, 0x76, 0xdf, 0xd1, 0x6f, 0x00, 0x7d, 0x15, + 0x25, 0x83, 0x5c, 0x53, 0xdc, 0xdb, 0x60, 0x1e, 0xa5, 0xac, 0x0d, 0x8d, 0xe1, 0x60, 0xd4, 0xbb, + 0x81, 0x83, 0xdd, 0xc1, 0x7e, 0xcf, 0x70, 0xff, 0xd7, 0x04, 0xe7, 0x60, 0x96, 0x7b, 0x68, 0x53, + 0xf2, 0x4d, 0x4a, 0xfd, 0x00, 0x6c, 0x99, 0x7b, 0x19, 0xf9, 0x7b, 0xe5, 0x7d, 0xda, 0x04, 0x8f, + 0x24, 0xfb, 0x14, 0x5a, 0x22, 0x98, 0x88, 0xc2, 0x29, 0xf4, 0x96, 0xcf, 0xc9, 0x15, 0x99, 0x6d, + 0x80, 0x25, 0xfd, 0x73, 0x31, 0xf5, 0xfa, 0xcd, 0x8a, 0x71, 0x48, 0x18, 0x95, 0x40, 0x70, 0x4d, + 0x67, 0x5b, 0xf0, 0x5e, 0x38, 0x89, 0x93, 0x4c, 0x8c, 0xc3, 0x38, 0x10, 0xf3, 0xb1, 0x9f, 0xc4, + 0x67, 0x51, 0xe8, 0xe7, 0x3a, 0x21, 0x79, 0x57, 0x11, 0xf7, 0x90, 0xb6, 0xa3, 0x49, 0xec, 0x13, + 0x68, 0xa1, 0x76, 0xa4, 0x4e, 0x6f, 0x29, 0x21, 0x46, 0x45, 0xe8, 0xa5, 0x15, 0x91, 0x3d, 0x82, + 0x76, 0x90, 0x25, 0xe9, 0x38, 0x49, 0x49, 0xce, 0xab, 0x5b, 0xb7, 0xe8, 0x3d, 0x14, 0x12, 0xd8, + 0xdc, 0xcd, 0x92, 0xf4, 0x28, 0xe5, 0x56, 0x40, 0xbf, 0x58, 0xb3, 0x10, 0xbb, 0xb2, 0x09, 0xe5, + 0x40, 0x1c, 0xc4, 0x50, 0x6e, 0xef, 0x3e, 0x06, 0x4b, 0x4d, 0x60, 0x36, 0x34, 0x0f, 0x8f, 0x0e, + 0x07, 0x4a, 0xb4, 0xdb, 0xfb, 0xfb, 0x3d, 0x03, 0x51, 0xbb, 0xdb, 0xa3, 0xed, 0x9e, 0x89, 0xa3, + 0xd1, 0x2f, 0x8e, 0x07, 0xbd, 0x86, 0xfb, 0x57, 0x06, 0xd8, 0x85, 0x9b, 0x67, 0x9f, 0xa1, 0x7f, + 0xa6, 0x68, 0xa2, 0x9f, 0x2f, 0xd5, 0x5c, 0xb5, 0x3c, 0x92, 0x17, 0x74, 0xb4, 0x18, 0x92, 0x44, + 0xe1, 0xf8, 0x09, 0xa8, 0x67, 0xb1, 0x8d, 0x85, 0x92, 0x09, 0x13, 0xf2, 0x24, 0x16, 0x3a, 0x8e, + 0xd3, 0x98, 0x14, 0x18, 0xc6, 0xbe, 0x40, 0xee, 0x96, 0x56, 0x20, 0xc2, 0x23, 0xe9, 0xfe, 0xb5, + 0x09, 0x76, 0x19, 0xdb, 0x1f, 0x82, 0x33, 0x2d, 0xc4, 0xa1, 0x7d, 0xc6, 0xca, 0x82, 0x8c, 0x78, + 0x45, 0x67, 0xb7, 0xc1, 0xbc, 0xb8, 0xd4, 0xea, 0xb4, 0x90, 0xeb, 0xc5, 0x4b, 0x6e, 0x5e, 0x5c, + 0x56, 0x4e, 0xa7, 0xf5, 0x56, 0xa7, 0x73, 0x1f, 0x6e, 0xfa, 0x91, 0xf0, 0xe2, 0x71, 0xe5, 0x33, + 0xd4, 0xb3, 0x58, 0x25, 0xf4, 0x71, 0xe9, 0x38, 0xb4, 0xe3, 0x6c, 0x57, 0xc1, 0xf6, 0x1e, 0xb4, + 0x02, 0x11, 0xe5, 0x5e, 0xbd, 0x64, 0x3d, 0xca, 0x3c, 0x3f, 0x12, 0xbb, 0x88, 0xe6, 0x8a, 0xca, + 0x36, 0xc0, 0x2e, 0x12, 0x0f, 0xed, 0xed, 0xa9, 0xf6, 0x29, 0xf4, 0xc0, 0x4b, 0x6a, 0x25, 0x66, + 0xa8, 0x89, 0xd9, 0xfd, 0x1c, 0x1a, 0x2f, 0x5e, 0x0e, 0xf5, 0x5d, 0x8d, 0x57, 0xee, 0x5a, 0x08, + 0xdb, 0xac, 0x84, 0xed, 0xfe, 0x5f, 0x03, 0xda, 0xda, 0x37, 0xe0, 0xb9, 0x67, 0x65, 0x9e, 0x8e, + 0xc3, 0xc5, 0x30, 0x5e, 0x3a, 0x99, 0x7a, 0x7b, 0xa3, 0xf1, 0xf6, 0xf6, 0x06, 0xfb, 0x29, 0x74, + 0x53, 0x45, 0xab, 0xbb, 0xa5, 0xf7, 0xeb, 0x73, 0xf4, 0x2f, 0xcd, 0xeb, 0xa4, 0x15, 0x80, 0xc6, + 0x40, 0x15, 0x61, 0xee, 0x4d, 0x48, 0x45, 0x5d, 0xde, 0x46, 0x78, 0xe4, 0x4d, 0x5e, 0xe3, 0x9c, + 0x7e, 0x0d, 0x1f, 0x83, 0xf5, 0x48, 0x92, 0xf6, 0xbb, 0xe4, 0x37, 0xd0, 0x2f, 0xd5, 0x5d, 0xc6, + 0xca, 0xa2, 0xcb, 0xf8, 0x10, 0x1c, 0x3f, 0x99, 0x4e, 0x43, 0xa2, 0xad, 0xea, 0x7c, 0x9b, 0x10, + 0x23, 0xe9, 0xfe, 0x99, 0x01, 0x6d, 0x7d, 0x5b, 0xd6, 0x81, 0xf6, 0xee, 0xe0, 0xd9, 0xf6, 0xc9, + 0x3e, 0x7a, 0x2d, 0x00, 0xeb, 0xe9, 0xde, 0xe1, 0x36, 0xff, 0x45, 0xcf, 0xc0, 0x67, 0xb6, 0x77, + 0x38, 0xea, 0x99, 0xcc, 0x81, 0xd6, 0xb3, 0xfd, 0xa3, 0xed, 0x51, 0xaf, 0x81, 0xef, 0xec, 0xe9, + 0xd1, 0xd1, 0x7e, 0xaf, 0xc9, 0xba, 0x60, 0xef, 0x6e, 0x8f, 0x06, 0xa3, 0xbd, 0x83, 0x41, 0xaf, + 0x85, 0xbc, 0xcf, 0x07, 0x47, 0x3d, 0x0b, 0x07, 0x27, 0x7b, 0xbb, 0xbd, 0x36, 0xd2, 0x8f, 0xb7, + 0x87, 0xc3, 0xaf, 0x8f, 0xf8, 0x6e, 0xcf, 0xc6, 0x75, 0x87, 0x23, 0xbe, 0x77, 0xf8, 0xbc, 0xe7, + 0xe0, 0xf8, 0xe8, 0xe9, 0x57, 0x83, 0x9d, 0x51, 0x0f, 0xdc, 0xcf, 0xa1, 0x53, 0x93, 0x20, 0xce, + 0xe6, 0x83, 0x67, 0xbd, 0x1b, 0xb8, 0xe5, 0xcb, 0xed, 0xfd, 0x93, 0x41, 0xcf, 0x60, 0xab, 0x00, + 0x34, 0x1c, 0xef, 0x6f, 0x1f, 0x3e, 0xef, 0x99, 0xee, 0xcf, 0xc1, 0x3e, 0x09, 0x83, 0xa7, 0x51, + 0xe2, 0x5f, 0xa0, 0x61, 0x9c, 0x7a, 0x52, 0xe8, 0x50, 0x4f, 0x63, 0x8c, 0x45, 0x64, 0x94, 0x52, + 0xeb, 0x5e, 0x43, 0x28, 0xab, 0x78, 0x36, 0x1d, 0x53, 0x4b, 0xac, 0xa1, 0x3c, 0x6f, 0x3c, 0x9b, + 0x9e, 0x84, 0x81, 0x74, 0x0f, 0xa1, 0x7d, 0x12, 0x06, 0xc7, 0x9e, 0x7f, 0x81, 0xee, 0xe8, 0x14, + 0x97, 0x1e, 0xcb, 0xf0, 0x5b, 0xa1, 0x3d, 0xb4, 0x43, 0x98, 0x61, 0xf8, 0xad, 0x60, 0x9f, 0x80, + 0x45, 0x40, 0x91, 0xd6, 0x91, 0x99, 0x17, 0xc7, 0xe1, 0x9a, 0xe6, 0xfe, 0x85, 0x51, 0x5e, 0x8b, + 0x3a, 0x21, 0x77, 0xa1, 0x99, 0x7a, 0xfe, 0x85, 0xf6, 0x41, 0x1d, 0x3d, 0x07, 0xf7, 0xe3, 0x44, + 0x60, 0xf7, 0xc1, 0xd6, 0xb6, 0x53, 0x2c, 0xdc, 0xa9, 0x19, 0x19, 0x2f, 0x89, 0x8b, 0x5a, 0x6d, + 0x2c, 0x6a, 0x15, 0x6f, 0x2e, 0xd3, 0x28, 0xa4, 0xa2, 0xb6, 0x81, 0xbe, 0x4a, 0x41, 0xee, 0x8f, + 0x01, 0xaa, 0x36, 0xd3, 0x35, 0x35, 0xd1, 0x2d, 0x68, 0x79, 0x51, 0xa8, 0x05, 0xe6, 0x70, 0x05, + 0xb8, 0x87, 0xd0, 0xa9, 0x35, 0xa7, 0x50, 0x7c, 0x5e, 0x14, 0x8d, 0x2f, 0xc4, 0x95, 0xa4, 0xb9, + 0x36, 0x6f, 0x7b, 0x51, 0xf4, 0x42, 0x5c, 0x49, 0x8c, 0x0b, 0xaa, 0xaf, 0x65, 0x2e, 0x35, 0x4a, + 0x68, 0x2a, 0x57, 0x44, 0xf7, 0x47, 0x60, 0xa9, 0xee, 0x49, 0xcd, 0xd2, 0x8d, 0xd7, 0x46, 0xd3, + 0x2f, 0xf5, 0x99, 0xa9, 0xd7, 0xc2, 0x1e, 0xea, 0xfe, 0x99, 0x54, 0xdd, 0x3a, 0xa3, 0x4a, 0x44, + 0x15, 0x93, 0x6e, 0x9d, 0x11, 0xb3, 0xbb, 0x0b, 0xf6, 0x1b, 0x3b, 0x92, 0x5a, 0x00, 0x66, 0x25, + 0x80, 0x6b, 0x7a, 0x94, 0xee, 0x2f, 0x01, 0xaa, 0x3e, 0x9b, 0x7e, 0x78, 0x6a, 0x15, 0x7c, 0x78, + 0x0f, 0xb0, 0x98, 0x0d, 0xa3, 0x20, 0x13, 0xf1, 0xc2, 0xad, 0xab, 0xce, 0x5c, 0x49, 0x67, 0xeb, + 0xd0, 0xa4, 0xf6, 0x61, 0xa3, 0x72, 0x8c, 0x65, 0xef, 0x90, 0x28, 0xee, 0x1c, 0x56, 0x54, 0x90, + 0xe6, 0xe2, 0x8f, 0x66, 0x42, 0xbe, 0x31, 0xf5, 0xbb, 0x03, 0x50, 0xba, 0xf1, 0xa2, 0x11, 0x5a, + 0xc3, 0xa0, 0x11, 0x9c, 0x85, 0x22, 0x0a, 0x8a, 0xdb, 0x68, 0x08, 0x95, 0xac, 0x82, 0x77, 0x53, + 0x75, 0x8b, 0x08, 0x70, 0x7f, 0x0f, 0xba, 0xc5, 0xce, 0xd4, 0x8e, 0x79, 0x58, 0x26, 0x10, 0x4a, + 0xc6, 0xaa, 0x28, 0x53, 0x2c, 0x58, 0xdf, 0x3e, 0x35, 0xfb, 0x46, 0x91, 0x43, 0xb8, 0xff, 0xd1, + 0x28, 0x66, 0xeb, 0xee, 0xc4, 0x42, 0x5a, 0x6a, 0x2c, 0xa7, 0xa5, 0x8b, 0x29, 0x9e, 0xf9, 0x6b, + 0xa5, 0x78, 0x3f, 0x01, 0x27, 0xa0, 0x3c, 0x27, 0xbc, 0x2c, 0x5c, 0xf6, 0xda, 0x72, 0x4e, 0xa3, + 0x33, 0xa1, 0xf0, 0x52, 0xf0, 0x8a, 0x19, 0xcf, 0x92, 0x27, 0x17, 0x22, 0x0e, 0xbf, 0xa5, 0xf6, + 0x0b, 0xde, 0xb9, 0x42, 0x54, 0xbd, 0x2c, 0x95, 0xee, 0xe8, 0x5e, 0x56, 0xd1, 0x96, 0xb3, 0xaa, + 0xb6, 0x1c, 0xca, 0x73, 0x96, 0x4a, 0x91, 0xe5, 0x45, 0x82, 0xac, 0xa0, 0x32, 0x97, 0x74, 0x34, + 0x2f, 0xe6, 0x92, 0x1f, 0x41, 0x37, 0x4e, 0xe2, 0x71, 0x3c, 0x8b, 0x22, 0x4c, 0xe1, 0x75, 0x07, + 0xb6, 0x13, 0x27, 0xf1, 0xa1, 0x46, 0xb1, 0x07, 0xf0, 0x4e, 0x9d, 0x45, 0xd9, 0x73, 0x47, 0x35, + 0x70, 0x6a, 0x7c, 0x64, 0xf5, 0x1b, 0xd0, 0x4b, 0x4e, 0x7f, 0x29, 0xfc, 0x9c, 0x24, 0x36, 0x26, + 0x43, 0xee, 0xaa, 0xc0, 0xad, 0xf0, 0x28, 0xa2, 0x43, 0x6f, 0x2a, 0xdc, 0x2f, 0xc1, 0x29, 0x85, + 0x50, 0x4b, 0x94, 0x1c, 0x68, 0xed, 0x1d, 0xee, 0x0e, 0xfe, 0xa0, 0x67, 0xa0, 0x97, 0xe7, 0x83, + 0x97, 0x03, 0x3e, 0x1c, 0xf4, 0x4c, 0xf4, 0xc0, 0xbb, 0x83, 0xfd, 0xc1, 0x68, 0xd0, 0x6b, 0x7c, + 0xd5, 0xb4, 0xdb, 0x3d, 0x9b, 0x7a, 0x14, 0x51, 0xe8, 0x87, 0xb9, 0x3b, 0x04, 0xa8, 0x72, 0x3a, + 0xf4, 0x37, 0xd5, 0xde, 0x4a, 0xa3, 0x76, 0xae, 0x77, 0xc5, 0x6c, 0x53, 0x9b, 0x9a, 0xf9, 0xba, + 0x6c, 0x53, 0xd1, 0xdd, 0x13, 0xb0, 0x0f, 0xbc, 0xf4, 0x95, 0xea, 0xac, 0x5b, 0x56, 0xf4, 0x33, + 0xdd, 0x50, 0xd3, 0xe1, 0xfb, 0x1e, 0xb4, 0xb5, 0xcb, 0xd3, 0xaf, 0x66, 0xc1, 0x1d, 0x16, 0x34, + 0xf7, 0x4f, 0x0d, 0xb8, 0x75, 0x90, 0x5c, 0x8a, 0x32, 0x83, 0x39, 0xf6, 0xae, 0xa2, 0xc4, 0x0b, + 0xde, 0x62, 0x88, 0x3f, 0x04, 0x90, 0xc9, 0x2c, 0xf3, 0xc5, 0x78, 0x52, 0xf6, 0xf1, 0x1c, 0x85, + 0x79, 0xae, 0x3f, 0x19, 0x08, 0x99, 0x13, 0x51, 0x07, 0x0a, 0x84, 0x91, 0xf4, 0x1e, 0x58, 0xf9, + 0x3c, 0xae, 0xda, 0x86, 0xad, 0x1c, 0x2b, 0x68, 0x77, 0x07, 0x9c, 0xd1, 0x9c, 0x0a, 0xc6, 0x99, + 0x5c, 0x88, 0xc9, 0xc6, 0x1b, 0x62, 0xb2, 0xb9, 0x14, 0x93, 0xff, 0xc7, 0x80, 0x4e, 0x2d, 0xb5, + 0x62, 0x1f, 0x41, 0x33, 0x9f, 0xc7, 0x8b, 0xfd, 0xf6, 0x62, 0x13, 0x4e, 0x24, 0xb4, 0x37, 0xac, + 0x26, 0x3d, 0x29, 0xc3, 0x49, 0x2c, 0x02, 0xbd, 0x24, 0x56, 0x98, 0xdb, 0x1a, 0xc5, 0xf6, 0xe1, + 0xa6, 0xf2, 0x24, 0x45, 0xaf, 0xad, 0xa8, 0x21, 0x3e, 0x5e, 0x4a, 0xe5, 0x54, 0x51, 0xbd, 0x53, + 0x70, 0xa9, 0xee, 0xc2, 0xea, 0x64, 0x01, 0xb9, 0xb6, 0x0d, 0xef, 0x5e, 0xc3, 0xf6, 0xbd, 0xda, + 0x28, 0x77, 0x61, 0x65, 0x34, 0x8f, 0x47, 0xe1, 0x54, 0xc8, 0xdc, 0x9b, 0xa6, 0x94, 0xd3, 0xe8, + 0x48, 0xd0, 0xe4, 0x66, 0x2e, 0xdd, 0x4f, 0xa1, 0x7b, 0x2c, 0x44, 0xc6, 0x85, 0x4c, 0x93, 0x58, + 0xc5, 0x73, 0x49, 0x97, 0xd6, 0x61, 0x47, 0x43, 0xee, 0x1f, 0x82, 0x83, 0x89, 0xfc, 0x53, 0x2f, + 0xf7, 0xcf, 0xbf, 0x4f, 0xa2, 0xff, 0x29, 0xb4, 0x53, 0x65, 0x26, 0x3a, 0xf7, 0xee, 0x92, 0x8f, + 0xd3, 0xa6, 0xc3, 0x0b, 0xa2, 0xcb, 0xa1, 0x71, 0x38, 0x9b, 0xd6, 0x3f, 0x92, 0x35, 0xd5, 0x47, + 0xb2, 0x85, 0xd2, 0xd8, 0x5c, 0x2c, 0x8d, 0xd1, 0xf2, 0xce, 0x92, 0xec, 0x8f, 0xbd, 0x2c, 0x10, + 0x81, 0xae, 0xbf, 0x2b, 0x84, 0xfb, 0x0d, 0x74, 0x0a, 0xcd, 0xec, 0x05, 0xd4, 0x0f, 0x24, 0xd3, + 0xd8, 0x0b, 0x16, 0x2c, 0x45, 0xd5, 0xaf, 0x22, 0x0e, 0xf6, 0x0a, 0x95, 0x2a, 0x60, 0x71, 0x67, + 0xdd, 0xc6, 0x29, 0x8b, 0xf2, 0x67, 0xd0, 0x2d, 0xf2, 0xed, 0x03, 0x91, 0x7b, 0x64, 0x6c, 0x51, + 0x28, 0xe2, 0x9a, 0x21, 0xda, 0x0a, 0x31, 0x92, 0x6f, 0x68, 0x64, 0xbb, 0x9b, 0x60, 0x69, 0x4b, + 0x66, 0xd0, 0xf4, 0x93, 0x40, 0x3d, 0xa0, 0x16, 0xa7, 0x31, 0x8a, 0x63, 0x2a, 0x27, 0x45, 0xf0, + 0x9c, 0xca, 0x89, 0xfb, 0xcf, 0x26, 0xac, 0x3c, 0xf5, 0xfc, 0x8b, 0x59, 0x5a, 0x44, 0xaf, 0x5a, + 0xd1, 0x64, 0x2c, 0x14, 0x4d, 0xf5, 0x02, 0xc9, 0x5c, 0x28, 0x90, 0x16, 0x0e, 0xd4, 0x58, 0x8c, + 0x78, 0xef, 0x43, 0x7b, 0x16, 0x87, 0xf3, 0xe2, 0xd5, 0x39, 0xdc, 0x42, 0x70, 0x24, 0xd9, 0x3a, + 0x74, 0xf0, 0x61, 0x86, 0x31, 0x95, 0x4a, 0x24, 0x10, 0x87, 0xd7, 0x51, 0xf8, 0xd2, 0x3d, 0xdf, + 0x17, 0x52, 0x62, 0xde, 0xa2, 0xd3, 0x6d, 0x47, 0x61, 0x5e, 0x88, 0x2b, 0x72, 0x04, 0xc2, 0xcf, + 0x44, 0x3e, 0xae, 0xca, 0x1e, 0x47, 0x61, 0x90, 0xfc, 0x31, 0xac, 0x48, 0x21, 0x65, 0x98, 0xc4, + 0x63, 0x8a, 0x1c, 0xba, 0x3a, 0xed, 0x6a, 0xe4, 0x08, 0x71, 0xa8, 0x70, 0x2f, 0x4e, 0xe2, 0xab, + 0x69, 0x32, 0x93, 0x3a, 0x18, 0x54, 0x88, 0xa5, 0x68, 0x0d, 0xcb, 0xd1, 0xda, 0xcd, 0x61, 0x65, + 0x30, 0x4f, 0xe9, 0x73, 0xc8, 0x5b, 0x23, 0x7f, 0x4d, 0xac, 0xe6, 0x82, 0x58, 0x6b, 0x02, 0x52, + 0x1d, 0xe7, 0x42, 0x40, 0x98, 0x0b, 0x24, 0xd9, 0xd4, 0xcb, 0x0b, 0xc1, 0x29, 0xc8, 0xfd, 0x4b, + 0x13, 0x1c, 0xa5, 0x32, 0xbc, 0xe6, 0x67, 0xd0, 0xa4, 0x88, 0x6c, 0x50, 0x78, 0x7d, 0x0f, 0x1f, + 0x4e, 0x49, 0xdc, 0x7c, 0x21, 0xae, 0x28, 0x26, 0x13, 0xcb, 0xb5, 0xfd, 0x1c, 0xed, 0xbd, 0x55, + 0x32, 0x4a, 0xde, 0xfb, 0x43, 0x70, 0x94, 0x07, 0x44, 0xbc, 0x6e, 0xf5, 0x13, 0xe2, 0x24, 0xa4, + 0xef, 0x24, 0xb9, 0xc8, 0xa6, 0x5a, 0x5b, 0x34, 0xae, 0xa2, 0xb1, 0xa5, 0x3e, 0xde, 0x10, 0xe0, + 0x9e, 0x43, 0x5b, 0xef, 0x8e, 0xd1, 0xeb, 0xe4, 0xf0, 0xc5, 0xe1, 0xd1, 0xd7, 0x87, 0xbd, 0x1b, + 0x65, 0xd5, 0x6f, 0x54, 0xf1, 0xcd, 0xac, 0xc7, 0xb7, 0x06, 0xe2, 0x77, 0x8e, 0x4e, 0x0e, 0x47, + 0xbd, 0x26, 0x5b, 0x01, 0x87, 0x86, 0x63, 0x3e, 0x78, 0xd9, 0x6b, 0x51, 0x1d, 0xb2, 0xf3, 0xb3, + 0xc1, 0xc1, 0x76, 0xcf, 0x2a, 0x7b, 0x06, 0x6d, 0x8c, 0x23, 0xef, 0xa8, 0x2b, 0xd7, 0xb3, 0xf6, + 0xfa, 0xf7, 0xf3, 0xa6, 0xfa, 0x7e, 0xfe, 0xdb, 0x4d, 0xd4, 0xb7, 0xfe, 0xc5, 0x80, 0x26, 0xfa, + 0x2c, 0xf6, 0x10, 0x9c, 0x9f, 0x09, 0x2f, 0xcb, 0x4f, 0x85, 0x97, 0xb3, 0x05, 0xff, 0xb4, 0xb6, + 0x00, 0xb9, 0x37, 0x9e, 0x18, 0x6c, 0x53, 0x7d, 0x19, 0x2b, 0x3e, 0xf8, 0xad, 0x14, 0x9e, 0x8f, + 0x3c, 0xe3, 0x32, 0xff, 0x06, 0xf1, 0x7f, 0x95, 0x84, 0xf1, 0x8e, 0xfa, 0x5c, 0xc4, 0x96, 0x3d, + 0xe5, 0xf2, 0x0c, 0xf6, 0x08, 0xac, 0x3d, 0x89, 0x2e, 0xf9, 0x55, 0x56, 0x8a, 0xf8, 0x75, 0x6f, + 0xed, 0xde, 0xd8, 0xfa, 0xc7, 0x06, 0x34, 0xbf, 0x11, 0x59, 0xc2, 0x7e, 0x04, 0x6d, 0xdd, 0x4d, + 0x65, 0xb5, 0xae, 0xe9, 0x1a, 0xa5, 0x7c, 0x4b, 0x6d, 0x56, 0xda, 0xa5, 0xa7, 0x92, 0x86, 0xaa, + 0x89, 0xc1, 0xaa, 0x66, 0xef, 0x2b, 0x87, 0xfa, 0x12, 0x7a, 0xc3, 0x3c, 0x13, 0xde, 0xb4, 0xc6, + 0xbe, 0x28, 0xa8, 0xeb, 0x3a, 0x22, 0x24, 0xaf, 0x87, 0x60, 0xa9, 0xb8, 0xb7, 0x34, 0x61, 0xb9, + 0xb9, 0x41, 0xcc, 0xf7, 0xa1, 0x33, 0x3c, 0x4f, 0x66, 0x51, 0x30, 0x14, 0xd9, 0xa5, 0x60, 0xb5, + 0xef, 0x23, 0x6b, 0xb5, 0xb1, 0x7b, 0x83, 0x6d, 0x00, 0x28, 0xd7, 0x8e, 0x15, 0x25, 0x6b, 0x23, + 0xed, 0x70, 0x36, 0x55, 0x8b, 0xd6, 0x7c, 0xbe, 0xe2, 0xac, 0x85, 0xbf, 0x37, 0x71, 0x7e, 0x01, + 0x2b, 0x3b, 0x64, 0x33, 0x47, 0xd9, 0xf6, 0x69, 0x92, 0xe5, 0x6c, 0xf9, 0x1b, 0xc9, 0xda, 0x32, + 0xc2, 0xbd, 0xc1, 0x9e, 0x80, 0x3d, 0xca, 0xae, 0x14, 0xff, 0x3b, 0x3a, 0x6b, 0xa8, 0xf6, 0xbb, + 0xe6, 0x96, 0x5b, 0x7f, 0xdf, 0x00, 0xeb, 0xeb, 0x24, 0xbb, 0x10, 0x19, 0x7b, 0x00, 0x16, 0x75, + 0xa1, 0xb4, 0x19, 0x95, 0x1d, 0xa9, 0xeb, 0x36, 0xfa, 0x04, 0x1c, 0x12, 0xca, 0xc8, 0x93, 0x17, + 0x4a, 0x55, 0xf4, 0xcf, 0x0d, 0x25, 0x17, 0x55, 0x4f, 0x90, 0x5e, 0x57, 0x95, 0xa2, 0xca, 0xa6, + 0xdc, 0x42, 0x6b, 0x68, 0xad, 0xad, 0xfa, 0x3c, 0x43, 0x34, 0xcd, 0x27, 0x06, 0x3a, 0xa3, 0xa1, + 0xba, 0x29, 0x32, 0x55, 0xdf, 0xb1, 0xd7, 0x56, 0x0b, 0x44, 0xb9, 0xf2, 0x63, 0xb0, 0x54, 0xb2, + 0xa9, 0xae, 0xb9, 0x50, 0x41, 0xad, 0xf5, 0xea, 0x28, 0x3d, 0xe1, 0x33, 0xb0, 0xd4, 0x2b, 0x57, + 0x13, 0x16, 0x82, 0x96, 0x3a, 0xb5, 0x0a, 0x7c, 0x8a, 0x55, 0xf9, 0x65, 0xc5, 0xba, 0xe0, 0xa3, + 0x97, 0x58, 0x1f, 0x41, 0x8f, 0x0b, 0x5f, 0x84, 0xb5, 0x34, 0x94, 0x15, 0x97, 0xba, 0xe6, 0xf5, + 0x7d, 0x09, 0x2b, 0x0b, 0x29, 0x2b, 0xeb, 0x93, 0xa0, 0xaf, 0xc9, 0x62, 0x97, 0x27, 0x3f, 0xed, + 0xfd, 0xdb, 0x77, 0x77, 0x8c, 0x7f, 0xff, 0xee, 0x8e, 0xf1, 0x5f, 0xdf, 0xdd, 0x31, 0x7e, 0xf5, + 0xdf, 0x77, 0x6e, 0x9c, 0x5a, 0xf4, 0x8f, 0x9f, 0x2f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x5a, + 0xd1, 0x07, 0x79, 0x35, 0x24, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6266,7 +6266,7 @@ func (m *Group) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Enterprise) Marshal() (dAtA []byte, err error) { +func (m *License) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6276,12 +6276,12 @@ func (m *Enterprise) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Enterprise) MarshalTo(dAtA []byte) (int, error) { +func (m *License) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Enterprise) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *License) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6310,10 +6310,10 @@ func (m *Enterprise) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - if len(m.Entity) > 0 { - i -= len(m.Entity) - copy(dAtA[i:], m.Entity) - i = encodeVarintPb(dAtA, i, uint64(len(m.Entity))) + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintPb(dAtA, i, uint64(len(m.User))) i-- dAtA[i] = 0xa } @@ -6344,9 +6344,9 @@ func (m *ZeroProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Enterprise != nil { + if m.License != nil { { - size, err := m.Enterprise.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.License.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6463,9 +6463,9 @@ func (m *MembershipState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Enterprise != nil { + if m.License != nil { { - size, err := m.Enterprise.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.License.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -9103,13 +9103,13 @@ func (m *Group) Size() (n int) { return n } -func (m *Enterprise) Size() (n int) { +func (m *License) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Entity) + l = len(m.User) if l > 0 { n += 1 + l + sovPb(uint64(l)) } @@ -9171,8 +9171,8 @@ func (m *ZeroProposal) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } - if m.Enterprise != nil { - l = m.Enterprise.Size() + if m.License != nil { + l = m.License.Size() n += 1 + l + sovPb(uint64(l)) } if m.XXX_unrecognized != nil { @@ -9235,8 +9235,8 @@ func (m *MembershipState) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } - if m.Enterprise != nil { - l = m.Enterprise.Size() + if m.License != nil { + l = m.License.Size() n += 1 + l + sovPb(uint64(l)) } if m.XXX_unrecognized != nil { @@ -12506,7 +12506,7 @@ func (m *Group) Unmarshal(dAtA []byte) error { } return nil } -func (m *Enterprise) Unmarshal(dAtA []byte) error { +func (m *License) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -12529,15 +12529,15 @@ func (m *Enterprise) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Enterprise: wiretype end group for non-group") + return fmt.Errorf("proto: License: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Enterprise: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: License: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Entity", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12565,7 +12565,7 @@ func (m *Enterprise) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Entity = string(dAtA[iNdEx:postIndex]) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 0 { @@ -13009,7 +13009,7 @@ func (m *ZeroProposal) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Enterprise", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field License", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -13036,10 +13036,10 @@ func (m *ZeroProposal) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Enterprise == nil { - m.Enterprise = &Enterprise{} + if m.License == nil { + m.License = &License{} } - if err := m.Enterprise.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.License.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -13471,7 +13471,7 @@ func (m *MembershipState) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Enterprise", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field License", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -13498,10 +13498,10 @@ func (m *MembershipState) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Enterprise == nil { - m.Enterprise = &Enterprise{} + if m.License == nil { + m.License = &License{} } - if err := m.Enterprise.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.License.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/worker/groups.go b/worker/groups.go index 860b8702c61..32cc48a297c 100644 --- a/worker/groups.go +++ b/worker/groups.go @@ -959,5 +959,5 @@ func EnterpriseEnabled() bool { g := groups() g.RLock() defer g.RUnlock() - return g.state.GetEnterprise().GetEnabled() + return g.state.GetLicense().GetEnabled() } From 2fa8fb3956f1e354e64a76f8b30f534295b09979 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 11:32:45 +1000 Subject: [PATCH 24/35] Rename e to l --- dgraph/cmd/zero/zero.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index b1c03c8951b..a950137e1eb 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -769,8 +769,8 @@ func (s *Server) latestMembershipState(ctx context.Context) (*pb.MembershipState } func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reader) error { - var e license - if err := verifySignature(signedData, bytes.NewReader(s.publicKey), &e); err != nil { + var l license + if err := verifySignature(signedData, bytes.NewReader(s.publicKey), &l); err != nil { return errors.Wrapf(err, "while extracting enterprise details from the license") } @@ -778,16 +778,16 @@ func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reade for _, group := range s.state.GetGroups() { numNodes += len(group.GetMembers()) } - if uint64(numNodes) > e.MaxNodes { + if uint64(numNodes) > l.MaxNodes { return errors.Errorf("Your license only allows: %v (Alpha + Zero) nodes. You have: %v.", - e.MaxNodes, numNodes) + l.MaxNodes, numNodes) } proposal := &pb.ZeroProposal{ License: &pb.License{ - User: e.User, - MaxNodes: e.MaxNodes, - ExpiryTs: e.Expiry.Unix(), + User: l.User, + MaxNodes: l.MaxNodes, + ExpiryTs: l.Expiry.Unix(), }, } From a538d6607c311e55dd4252271d8e8148cb4229f5 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 13:37:58 +1000 Subject: [PATCH 25/35] Refactor Connect function and also have public key as part of the code. --- dgraph/cmd/zero/pgp.go | 52 +++++++++++++++++++++++++++++++++++++++++ dgraph/cmd/zero/run.go | 2 -- dgraph/cmd/zero/zero.go | 41 ++++++++++++++------------------ 3 files changed, 69 insertions(+), 26 deletions(-) diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go index d6a8024e5ad..299d0f2f0f0 100644 --- a/dgraph/cmd/zero/pgp.go +++ b/dgraph/cmd/zero/pgp.go @@ -26,6 +26,58 @@ import ( "golang.org/x/crypto/openpgp/armor" ) +const publicKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF1T7lcBEADmxqS4gowV74h92QVehIchRkkZ74uQgFDQUPhs89vf5EvCci8m +LJYrsrBrDBQESjw+jQVQumtSnXqUIcVdumG80Nkgg01JuANOtqRs0vfd2P4piqxp +VCGrBATl0+9PrlQn/e8x6V449HLUeAx8jxML/us08RFzbLYoIFEnBdwbIJDfW6tl +CPS02Nj3ZW83crRCwyNjkSrSNt/TW5hVdYYveBe4urtJJgd/HWoytwHygtDIz5oc +ZjWMQxPXs2e0pYCTSCeqOOUu1LR7K6sHrhgYu1xMq3F8Vr9oqH5ZnwwydYd4GWQg +VfZEb/suXc9raxCcvIU5R32IHrfbFL5NQB9Cv9LxS4/13eoaIQ77eNJb0HYzo2CB +z88pidYGFuRzb6nkvi641XsBux0ox+4jXZJW6n83hsTc2Gjbo1JQZXU+3PbcMj8i +iWTwoDtev9uIFFWsSCGLulQVYH+0cdiBvmR0Jfb5JkE7d69+F7//AVD5Zcs6fnn3 +kKNomPF4v9ujQEBh7SGSZCxDHwGL/wrs1ajRiwbTehjgFi1S3BIvE5LdbNzbVAJP +5p/eXgJfStI8vOTsvtsZDxskz2JbxmNBC3vfQqdmms8Vs764BVrtg77YLqCkhRsZ +g47sBiRnffXBAoM3zR+gTAkl47hUP/GJXc/wXz9RWxa8jb1fHpUHqh4prQARAQAB +tB9EZ3JhcGggTGFicyA8Y29udGFjdEBkZ3JhcGguaW8+iQJOBBMBCgA4FiEElb71 +YXoTIYk1CVfE2dE672U82kUFAl1T7lcCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC +F4AACgkQ2dE672U82kWzLxAArQ50WlEy/8FE7X5I5pG6r1zM00kTHQDTfGP62/fF +H4IisQnaZsCOA6jNqIKx67bqIVCAGg+8xPf2jUhgFc+KlNV9FffLBD8xXB/SiDMM +M045wR9Ob1Zk691T7u+Fsgo+c9d/XFPcAgfP2hpIG/AH39JZaVbS04faa8v2kV9+ +mMZPlop+9dG8rpr4HBm4z054lLc0RIAv9bSmr7YMPv8r61PK1En6PDXszKyobkP2 +LkcM8DHAimZiIHvPhY5/wbCVFEig0oxZv975lP6cczhbESagR06kjZQZAu5Kh3Cb +H+EFfhvSZ9m4pLwId5j1MpNiVJxR4mKsVyTgooiQuBmnCS0c6aOWEBx+heZfnE/O +HKXVtbJnJqnc4kismi7ccBlycoONKy3s1Aewkm4NKnr0eB3ciWCVpqQjieA1u6Kt +bdVMtRj7jTIh47X8khrI6k/asCOz2I4r0ZtoU4SR+/tiSkhRpG2PLpss/Jlv0SrB +mKSto7IStD5xDKCxheOsTxZnP9vzeD9N78JH8tyxHJPld4wwcn5VJlWVDv8SauMW +m/JPuE1BX/h4Zy51HH8g3u8EgKV9EMngWU4oF+kcv7px14Cwkk3wH4ebHPixhMHj +jzNNm6rISGv2CWVVOQcLN2euzbJkWRQ9zWjBnkUL3ILw8JDUIdsTEufzSVGvYMCe +eMe5Ag0EXVPuVwEQAKOtFT53vLqGPAu6XLHWzf+zf8ikzJ4hE0i+zNQ4vBV7jGRY +45GsLWtziIq8dJnVlHJZ5FudcWdiUKNokO83MVV88H8bbgF4MF6/lZQrqV9a/NEI +zEZ5WIKQtFBTXe2HjIgdoJjiRarIVQ3UE7NAoMRoY36btKQKURf3CLcjMpa2a9RK +AWNt+Y0LqFjjJc5/0zlpV/hnBb7ARdHEXOanzmp5c2w75lf1eL8mAMI/gCMJ5IrX +fA7R1uWgZzVOW38bl8WEfT+z2Be6vy06EEz7NS9c9VvnC7FAguOjEU+fSIDut45S +lrSAiQzkNljHRPif6hMsbcUrYeNSH8TLI42j51WkszK0bpB0fpZSH+tcNzx1S0MR +ESsf1FncgMVRdQDJMeXe7yNgxpwp7ir1aOXZvX/sN+1CwGNh3hNLFqMo1yenec/x +27MitsJOfrHJ6g8ibOsDNOBZxRGQbpBikaHSnDcScA88r2+Yia8BXegxLsvZjWZO +Uy5DVOxesNAlWLh/q11djREfrOQOVuPaR4rviaJ4j324Hx8AP0rerRnP0/RUu3Xj +9/kOE0sOcXskolyVUOdN7/6OfGX+XwVtwQfrVZZ1yhRnSJi/M4tPHHRWrfzvElfT +LiOVZIoQNGC9LDYp2kif3zDtOzOwgyFcYnxbO5raL9Wy4+M8Inwjjt/vPnKVABEB +AAGJAjYEGAEKACAWIQSVvvVhehMhiTUJV8TZ0TrvZTzaRQUCXVPuVwIbDAAKCRDZ +0TrvZTzaRa0eD/9d1jb6zcihpD3E5YD6nNtREJF3fvDuTPLRRM1oGQ8nl7Jr3654 +ss5buPOgroFEJzp52fKDHyYpQlHn2PPrL9GGTQcTVof8MkYmgcMn9g+/2IBk9bfB +YVs/N3GVOgD8DpVocdavI41p7CIDkvyiFHRjQyZqd+lmWKdPd0TlPd6UPqAuJDdP +cKCpJIabo8RVVzwI7dRrveewO1sFWyEdE3uhLS35l4aZ5nMHsIpDLoZkf474k6bl +KYDSEe/+qCgTak0Ol1Q9uV0jQcFhWnVq8eObBb/aZ5SkmLAPnlnr5TMJ2a6xMRUS +fXxKSGuBcilhgpRnh6Lq01dYTRVKljxq8BbS9wK7d75ORKJlFAugBSOgujb5whG+ +hEaQQos8sHDOEka0KbCkTurYHt5+0enwFMCCbWQIT5z+j46yyAO9Om9p+M4H9qV7 +INbe2kxJPareejuWnf9Xy2FVzgO+7YGZmxiSrHurRBoZO8KNvjib23mUXVJOKMVB +6gIZciMNVJ3HYTajtExS94eguukL9g+mAMSgRttNM6xlkJRCnzx55ie1VQ4kYhVR +wbAzcSLeovdXC7FaCKtBRgsY/kDmnxJ6qlWzcbOJQ4FlRnHtGQSqFBPUUQVJuuMB +zaY83TVDscYMz42G7eZ2skRZ8R6Rsm1jNIWeBwGKAc2y3o1vMaXJlmui2g== +=9fdK +-----END PGP PUBLIC KEY BLOCK-----` + // verifySignature verifies the signature given a public key. It also JSON unmarshals the details // of the license and stores them in l. func verifySignature(signedFile, publicKey io.Reader, l *license) error { diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index 9e1106a42d0..9ff3da09d50 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -95,8 +95,6 @@ instances to achieve high-availability. // about the status of supporting annotation logs through the datadog exporter flag.String("datadog.collector", "", "Send opencensus traces to Datadog. As of now, the trace"+ " exporter does not support annotation logs and would discard them.") - // FIXME - Only for testing, remove before shipping. - flag.String("public_key", "", "Path to public key.") } func setupListener(addr string, port int, kind string) (listener net.Listener, err error) { diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index a950137e1eb..cbd0a274e39 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -17,10 +17,9 @@ package zero import ( - "bytes" "io" - "io/ioutil" "math" + "strings" "sync" "time" @@ -70,8 +69,6 @@ type Server struct { moveOngoing chan struct{} blockCommitsOn *sync.Map - - publicKey []byte } // Init initializes the zero server. @@ -93,13 +90,6 @@ func (s *Server) Init() { s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) - publicKeyFile := Zero.Conf.GetString("public_key") - if publicKeyFile != "" { - var err error - s.publicKey, err = ioutil.ReadFile(publicKeyFile) - x.Check(err) - } - go s.rebalanceTablets() } @@ -474,7 +464,6 @@ func (s *Server) Connect(ctx context.Context, for _, group := range ms.Groups { for _, member := range group.Members { switch { - // If we have this member, then we should just connect to it and return. case member.Addr == m.Addr && m.Id == 0: glog.Infof("Found a member with the same address. Returning: %+v", member) conn.GetPools().Connect(m.Addr) @@ -501,12 +490,6 @@ func (s *Server) Connect(ctx context.Context, } } - maxNodes := s.state.GetLicense().GetMaxNodes() - if s.state.GetLicense().GetEnabled() && uint64(numberOfNodes) >= maxNodes { - return nil, errors.Errorf("ENTERPRISE_LIMIT_REACHED: You are already using the maximum "+ - "number of nodes: [%v] permitted for your enterprise license.", maxNodes) - } - // Create a connection and check validity of the address by doing an Echo. conn.GetPools().Connect(m.Addr) @@ -565,10 +548,20 @@ func (s *Server) Connect(ctx context.Context, } proposal := createProposal() - if proposal != nil { - if err := s.Node.proposeAndWait(ctx, proposal); err != nil { - return &emptyConnectionState, err - } + if proposal == nil { + return &pb.ConnectionState{ + State: ms, Member: m, + }, nil + } + + maxNodes := s.state.GetLicense().GetMaxNodes() + if s.state.GetLicense().GetEnabled() && uint64(numberOfNodes) >= maxNodes { + return nil, errors.Errorf("ENTERPRISE_LIMIT_REACHED: You are already using the maximum "+ + "number of nodes: [%v] permitted for your enterprise license.", maxNodes) + } + + if err := s.Node.proposeAndWait(ctx, proposal); err != nil { + return &emptyConnectionState, err } resp = &pb.ConnectionState{ State: s.membershipState(), @@ -770,7 +763,7 @@ func (s *Server) latestMembershipState(ctx context.Context) (*pb.MembershipState func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reader) error { var l license - if err := verifySignature(signedData, bytes.NewReader(s.publicKey), &l); err != nil { + if err := verifySignature(signedData, strings.NewReader(publicKey), &l); err != nil { return errors.Wrapf(err, "while extracting enterprise details from the license") } @@ -779,7 +772,7 @@ func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reade numNodes += len(group.GetMembers()) } if uint64(numNodes) > l.MaxNodes { - return errors.Errorf("Your license only allows: %v (Alpha + Zero) nodes. You have: %v.", + return errors.Errorf("Your license only allows [%v] (Alpha + Zero) nodes. You have: [%v].", l.MaxNodes, numNodes) } From 5b223dc858b2e382821ea391efa20892903ae355 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 13:48:02 +1000 Subject: [PATCH 26/35] Modify the error a bit. --- dgraph/cmd/alpha/admin_backup.go | 2 +- edgraph/access_ee.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/dgraph/cmd/alpha/admin_backup.go b/dgraph/cmd/alpha/admin_backup.go index cad909fdceb..e880a00bf45 100644 --- a/dgraph/cmd/alpha/admin_backup.go +++ b/dgraph/cmd/alpha/admin_backup.go @@ -44,7 +44,7 @@ func backupHandler(w http.ResponseWriter, r *http.Request) { } if !worker.EnterpriseEnabled() { x.SetStatus(w, "You must enable enterprise features first. "+ - "Supply the appropriate license file to Dgraph Zero using a flag or the HTTP endpoint.", + "Supply the appropriate license file to Dgraph Zero using the HTTP endpoint.", "Backup failed.") return } diff --git a/edgraph/access_ee.go b/edgraph/access_ee.go index 0fdae69af18..e1f2fdad83f 100644 --- a/edgraph/access_ee.go +++ b/edgraph/access_ee.go @@ -43,8 +43,7 @@ func (s *Server) Login(ctx context.Context, request *api.LoginRequest) (*api.Response, error) { if !worker.EnterpriseEnabled() { return nil, errors.New("Enterprise features are disabled. You can enable them by " + - "supplying the appropriate license file to Dgraph Zero using a flag or the" + - " HTTP endpoint.") + "supplying the appropriate license file to Dgraph Zero uing the HTTP endpoint.") } ctx, span := otrace.StartSpan(ctx, "server.Login") From fd1be0dc07f1a0327c822e38f6e639fd4352dbb7 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 13:54:16 +1000 Subject: [PATCH 27/35] Remove enterprise_features flag from docker_compose files. --- compose/compose.go | 1 - dgraph/docker-compose.yml | 12 ++++++------ ee/backup/tests/filesystem/docker-compose.yml | 6 +++--- ee/backup/tests/minio/docker-compose.yml | 6 +++--- tlstest/acl/docker-compose.yml | 2 +- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/compose/compose.go b/compose/compose.go index 7c714ec97c1..025e2bc940b 100644 --- a/compose/compose.go +++ b/compose/compose.go @@ -214,7 +214,6 @@ func getAlpha(idx int) service { svc.Command += " --whitelist=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" } if opts.Enterprise { - svc.Command += " --enterprise_features" if opts.AclSecret != "" { svc.Command += " --acl_secret_file=/secret/hmac --acl_access_ttl 3s --acl_cache_ttl 5s" svc.Volumes = append(svc.Volumes, volume{ diff --git a/dgraph/docker-compose.yml b/dgraph/docker-compose.yml index dec8465afbe..ea274896c30 100644 --- a/dgraph/docker-compose.yml +++ b/dgraph/docker-compose.yml @@ -74,7 +74,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha2: image: dgraph/dgraph:latest @@ -97,7 +97,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha3: image: dgraph/dgraph:latest @@ -120,7 +120,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha4: image: dgraph/dgraph:latest @@ -143,7 +143,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha4:7184 --lru_mb=1024 --zero=zero1:5180 -o 104 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha4:7184 --lru_mb=1024 --zero=zero1:5180 -o 104 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha5: image: dgraph/dgraph:latest @@ -166,7 +166,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha5:7185 --lru_mb=1024 --zero=zero1:5180 -o 105 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha5:7185 --lru_mb=1024 --zero=zero1:5180 -o 105 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha6: image: dgraph/dgraph:latest @@ -189,7 +189,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha6:7186 --lru_mb=1024 --zero=zero1:5180 -o 106 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha6:7186 --lru_mb=1024 --zero=zero1:5180 -o 106 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s minio1: image: minio/minio:latest diff --git a/ee/backup/tests/filesystem/docker-compose.yml b/ee/backup/tests/filesystem/docker-compose.yml index e818dcb655d..0ae68a242c2 100644 --- a/ee/backup/tests/filesystem/docker-compose.yml +++ b/ee/backup/tests/filesystem/docker-compose.yml @@ -34,7 +34,7 @@ services: ports: - 8180:8180 - 9180:9180 - command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha2: image: dgraph/dgraph:latest @@ -56,7 +56,7 @@ services: ports: - 8182:8182 - 9182:9182 - command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha3: image: dgraph/dgraph:latest @@ -78,4 +78,4 @@ services: ports: - 8183:8183 - 9183:9183 - command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 diff --git a/ee/backup/tests/minio/docker-compose.yml b/ee/backup/tests/minio/docker-compose.yml index 11a044c4d81..16459e49fe8 100644 --- a/ee/backup/tests/minio/docker-compose.yml +++ b/ee/backup/tests/minio/docker-compose.yml @@ -32,7 +32,7 @@ services: ports: - 8180:8180 - 9180:9180 - command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha2: image: dgraph/dgraph:latest @@ -52,7 +52,7 @@ services: ports: - 8182:8182 - 9182:9182 - command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha3: image: dgraph/dgraph:latest @@ -72,7 +72,7 @@ services: ports: - 8183:8183 - 9183:9183 - command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 minio1: image: minio/minio:latest diff --git a/tlstest/acl/docker-compose.yml b/tlstest/acl/docker-compose.yml index 9f5d4976ccd..d007946de78 100644 --- a/tlstest/acl/docker-compose.yml +++ b/tlstest/acl/docker-compose.yml @@ -22,7 +22,7 @@ services: source: $GOPATH/src/github.com/dgraph-io/dgraph/tlstest/tls target: /dgraph-tls read_only: true - command: /gobin/dgraph alpha -o 100 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 --logtostderr -v=2 --tls_dir /dgraph-tls --tls_client_auth VERIFYIFGIVEN --enterprise_features --acl_secret_file /dgraph-acl/hmac-secret + command: /gobin/dgraph alpha -o 100 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 --logtostderr -v=2 --tls_dir /dgraph-tls --tls_client_auth VERIFYIFGIVEN --acl_secret_file /dgraph-acl/hmac-secret zero1: image: dgraph/dgraph:latest container_name: zero1 From b5dcda7d5def8181fd98910d76d6c95ff5cb20a6 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 15:29:51 +1000 Subject: [PATCH 28/35] Apply license in restartCluster --- contrib/scripts/functions.sh | 24 +++++++++++++++++++++++- dgraph/cmd/zero/pgp_test.go | 4 ++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/contrib/scripts/functions.sh b/contrib/scripts/functions.sh index ce3442afe12..7ba10f07ac7 100755 --- a/contrib/scripts/functions.sh +++ b/contrib/scripts/functions.sh @@ -25,7 +25,29 @@ function restartCluster { $basedir/contrib/wait-for-it.sh -t 60 localhost:6180 || exit 1 $basedir/contrib/wait-for-it.sh -t 60 localhost:9180 || exit 1 - sleep 10 || exit 1 + + # Wait for zero server to become the leader before applying enterprise license. + applyLicense + sleep 10 || exit 1 +} + +function applyLicense { + n=0 + until [ $n -ge 5 ] + do + echo "Applying license to Zero" + status_code=$(curl -X POST --write-out "%{http_code}\n" --silent --output /dev/null http://localhost:6180/enterpriseLicense \ + --header 'Content-Type: application/json' \ + --data-binary "$LICENSE_FILE") + + if [[ "$status_code" -ne 200 ]] ; then + echo "Got $status_code while applying license. Sleeping for 5 secs." + sleep 5 + else + break + fi + n=$[$n+1] + done } function stopCluster { diff --git a/dgraph/cmd/zero/pgp_test.go b/dgraph/cmd/zero/pgp_test.go index 4e2d39ce4a0..e1750eaaa88 100644 --- a/dgraph/cmd/zero/pgp_test.go +++ b/dgraph/cmd/zero/pgp_test.go @@ -61,7 +61,7 @@ func TestEnterpriseDetails(t *testing.T) { DefaultHash: crypto.SHA512, }) require.NoError(t, err) - correctJSON := `{"entity": "entity", "max_nodes": 10, "expiry": "2019-08-16T19:09:06+10:00"}` + correctJSON := `{"user": "user", "max_nodes": 10, "expiry": "2019-08-16T19:09:06+10:00"}` correctTime, err := time.Parse(time.RFC3339, "2019-08-16T19:09:06+10:00") require.NoError(t, err) @@ -103,7 +103,7 @@ func TestEnterpriseDetails(t *testing.T) { correctJSON, correctEntity, false, - license{"entity", 10, correctTime}, + license{"user", 10, correctTime}, }, } From 85f85caf3c721ab4cc777d74c6a44bbac0135e5d Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 15:40:09 +1000 Subject: [PATCH 29/35] Add some comments to the function as well. --- contrib/scripts/functions.sh | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/contrib/scripts/functions.sh b/contrib/scripts/functions.sh index 7ba10f07ac7..fe6c89d1beb 100755 --- a/contrib/scripts/functions.sh +++ b/contrib/scripts/functions.sh @@ -4,7 +4,7 @@ # May be called with an argument which is a docker compose file # to use *instead of* the default docker-compose.yml. -function restartCluster { +function restartCluster() { if [[ -z $1 ]]; then compose_file="docker-compose.yml" else @@ -26,36 +26,36 @@ function restartCluster { $basedir/contrib/wait-for-it.sh -t 60 localhost:6180 || exit 1 $basedir/contrib/wait-for-it.sh -t 60 localhost:9180 || exit 1 - # Wait for zero server to become the leader before applying enterprise license. - applyLicense - sleep 10 || exit 1 + [ ! -z "$LICENSE_FILE" ] && applyLicense + sleep 10 || exit 1 } -function applyLicense { +# Reads license from LICENSE_FILE environment variable and applies it to zero. It also retries the +# command 5 times with a 5 sec sleep in between. +function applyLicense() { n=0 - until [ $n -ge 5 ] - do + until [ $n -ge 5 ]; do echo "Applying license to Zero" - status_code=$(curl -X POST --write-out "%{http_code}\n" --silent --output /dev/null http://localhost:6180/enterpriseLicense \ - --header 'Content-Type: application/json' \ - --data-binary "$LICENSE_FILE") + status_code=$(curl -X POST --write-out "%{http_code}\n" --silent --output /dev/null http://localhost:6180/enterpriseLicense \ + --header 'Content-Type: application/json' \ + --data-binary "$LICENSE_FILE") - if [[ "$status_code" -ne 200 ]] ; then - echo "Got $status_code while applying license. Sleeping for 5 secs." - sleep 5 + if [[ "$status_code" -ne 200 ]]; then + echo "Got $status_code while applying license. Sleeping for 5 secs." + sleep 5 else - break - fi - n=$[$n+1] + break + fi + n=$(($n + 1)) done } -function stopCluster { +function stopCluster() { basedir=$GOPATH/src/github.com/dgraph-io/dgraph pushd $basedir/dgraph >/dev/null - docker ps --filter label="cluster=test" --format "{{.Names}}" \ - | xargs -r docker stop | sed 's/^/Stopped /' - docker ps -a --filter label="cluster=test" --format "{{.Names}}" \ - | xargs -r docker rm | sed 's/^/Removed /' + docker ps --filter label="cluster=test" --format "{{.Names}}" | + xargs -r docker stop | sed 's/^/Stopped /' + docker ps -a --filter label="cluster=test" --format "{{.Names}}" | + xargs -r docker rm | sed 's/^/Removed /' popd >/dev/null } From c5bb12447b124478fb49103a2464799532a58576 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 15:44:26 +1000 Subject: [PATCH 30/35] Print out dummy_var --- contrib/scripts/functions.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/scripts/functions.sh b/contrib/scripts/functions.sh index fe6c89d1beb..58626ae8add 100755 --- a/contrib/scripts/functions.sh +++ b/contrib/scripts/functions.sh @@ -35,6 +35,7 @@ function restartCluster() { function applyLicense() { n=0 until [ $n -ge 5 ]; do + echo "$DUMMY_VAR" echo "Applying license to Zero" status_code=$(curl -X POST --write-out "%{http_code}\n" --silent --output /dev/null http://localhost:6180/enterpriseLicense \ --header 'Content-Type: application/json' \ From a053cd8abdd8ecf3b57098a6aa6931124e1a2646 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 16:22:39 +1000 Subject: [PATCH 31/35] Remove DUMMY_VAR --- contrib/scripts/functions.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/scripts/functions.sh b/contrib/scripts/functions.sh index 58626ae8add..fe6c89d1beb 100755 --- a/contrib/scripts/functions.sh +++ b/contrib/scripts/functions.sh @@ -35,7 +35,6 @@ function restartCluster() { function applyLicense() { n=0 until [ $n -ge 5 ]; do - echo "$DUMMY_VAR" echo "Applying license to Zero" status_code=$(curl -X POST --write-out "%{http_code}\n" --silent --output /dev/null http://localhost:6180/enterpriseLicense \ --header 'Content-Type: application/json' \ From 04b4641db72feec3deaface2b2c3f99ceed48664 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Tue, 20 Aug 2019 16:40:49 +1000 Subject: [PATCH 32/35] Add the correct Dgraph public key. Tests would start failing now. --- dgraph/cmd/zero/pgp.go | 97 +++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go index 299d0f2f0f0..ba1f0a2bbab 100644 --- a/dgraph/cmd/zero/pgp.go +++ b/dgraph/cmd/zero/pgp.go @@ -28,54 +28,55 @@ import ( const publicKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBF1T7lcBEADmxqS4gowV74h92QVehIchRkkZ74uQgFDQUPhs89vf5EvCci8m -LJYrsrBrDBQESjw+jQVQumtSnXqUIcVdumG80Nkgg01JuANOtqRs0vfd2P4piqxp -VCGrBATl0+9PrlQn/e8x6V449HLUeAx8jxML/us08RFzbLYoIFEnBdwbIJDfW6tl -CPS02Nj3ZW83crRCwyNjkSrSNt/TW5hVdYYveBe4urtJJgd/HWoytwHygtDIz5oc -ZjWMQxPXs2e0pYCTSCeqOOUu1LR7K6sHrhgYu1xMq3F8Vr9oqH5ZnwwydYd4GWQg -VfZEb/suXc9raxCcvIU5R32IHrfbFL5NQB9Cv9LxS4/13eoaIQ77eNJb0HYzo2CB -z88pidYGFuRzb6nkvi641XsBux0ox+4jXZJW6n83hsTc2Gjbo1JQZXU+3PbcMj8i -iWTwoDtev9uIFFWsSCGLulQVYH+0cdiBvmR0Jfb5JkE7d69+F7//AVD5Zcs6fnn3 -kKNomPF4v9ujQEBh7SGSZCxDHwGL/wrs1ajRiwbTehjgFi1S3BIvE5LdbNzbVAJP -5p/eXgJfStI8vOTsvtsZDxskz2JbxmNBC3vfQqdmms8Vs764BVrtg77YLqCkhRsZ -g47sBiRnffXBAoM3zR+gTAkl47hUP/GJXc/wXz9RWxa8jb1fHpUHqh4prQARAQAB -tB9EZ3JhcGggTGFicyA8Y29udGFjdEBkZ3JhcGguaW8+iQJOBBMBCgA4FiEElb71 -YXoTIYk1CVfE2dE672U82kUFAl1T7lcCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC -F4AACgkQ2dE672U82kWzLxAArQ50WlEy/8FE7X5I5pG6r1zM00kTHQDTfGP62/fF -H4IisQnaZsCOA6jNqIKx67bqIVCAGg+8xPf2jUhgFc+KlNV9FffLBD8xXB/SiDMM -M045wR9Ob1Zk691T7u+Fsgo+c9d/XFPcAgfP2hpIG/AH39JZaVbS04faa8v2kV9+ -mMZPlop+9dG8rpr4HBm4z054lLc0RIAv9bSmr7YMPv8r61PK1En6PDXszKyobkP2 -LkcM8DHAimZiIHvPhY5/wbCVFEig0oxZv975lP6cczhbESagR06kjZQZAu5Kh3Cb -H+EFfhvSZ9m4pLwId5j1MpNiVJxR4mKsVyTgooiQuBmnCS0c6aOWEBx+heZfnE/O -HKXVtbJnJqnc4kismi7ccBlycoONKy3s1Aewkm4NKnr0eB3ciWCVpqQjieA1u6Kt -bdVMtRj7jTIh47X8khrI6k/asCOz2I4r0ZtoU4SR+/tiSkhRpG2PLpss/Jlv0SrB -mKSto7IStD5xDKCxheOsTxZnP9vzeD9N78JH8tyxHJPld4wwcn5VJlWVDv8SauMW -m/JPuE1BX/h4Zy51HH8g3u8EgKV9EMngWU4oF+kcv7px14Cwkk3wH4ebHPixhMHj -jzNNm6rISGv2CWVVOQcLN2euzbJkWRQ9zWjBnkUL3ILw8JDUIdsTEufzSVGvYMCe -eMe5Ag0EXVPuVwEQAKOtFT53vLqGPAu6XLHWzf+zf8ikzJ4hE0i+zNQ4vBV7jGRY -45GsLWtziIq8dJnVlHJZ5FudcWdiUKNokO83MVV88H8bbgF4MF6/lZQrqV9a/NEI -zEZ5WIKQtFBTXe2HjIgdoJjiRarIVQ3UE7NAoMRoY36btKQKURf3CLcjMpa2a9RK -AWNt+Y0LqFjjJc5/0zlpV/hnBb7ARdHEXOanzmp5c2w75lf1eL8mAMI/gCMJ5IrX -fA7R1uWgZzVOW38bl8WEfT+z2Be6vy06EEz7NS9c9VvnC7FAguOjEU+fSIDut45S -lrSAiQzkNljHRPif6hMsbcUrYeNSH8TLI42j51WkszK0bpB0fpZSH+tcNzx1S0MR -ESsf1FncgMVRdQDJMeXe7yNgxpwp7ir1aOXZvX/sN+1CwGNh3hNLFqMo1yenec/x -27MitsJOfrHJ6g8ibOsDNOBZxRGQbpBikaHSnDcScA88r2+Yia8BXegxLsvZjWZO -Uy5DVOxesNAlWLh/q11djREfrOQOVuPaR4rviaJ4j324Hx8AP0rerRnP0/RUu3Xj -9/kOE0sOcXskolyVUOdN7/6OfGX+XwVtwQfrVZZ1yhRnSJi/M4tPHHRWrfzvElfT -LiOVZIoQNGC9LDYp2kif3zDtOzOwgyFcYnxbO5raL9Wy4+M8Inwjjt/vPnKVABEB -AAGJAjYEGAEKACAWIQSVvvVhehMhiTUJV8TZ0TrvZTzaRQUCXVPuVwIbDAAKCRDZ -0TrvZTzaRa0eD/9d1jb6zcihpD3E5YD6nNtREJF3fvDuTPLRRM1oGQ8nl7Jr3654 -ss5buPOgroFEJzp52fKDHyYpQlHn2PPrL9GGTQcTVof8MkYmgcMn9g+/2IBk9bfB -YVs/N3GVOgD8DpVocdavI41p7CIDkvyiFHRjQyZqd+lmWKdPd0TlPd6UPqAuJDdP -cKCpJIabo8RVVzwI7dRrveewO1sFWyEdE3uhLS35l4aZ5nMHsIpDLoZkf474k6bl -KYDSEe/+qCgTak0Ol1Q9uV0jQcFhWnVq8eObBb/aZ5SkmLAPnlnr5TMJ2a6xMRUS -fXxKSGuBcilhgpRnh6Lq01dYTRVKljxq8BbS9wK7d75ORKJlFAugBSOgujb5whG+ -hEaQQos8sHDOEka0KbCkTurYHt5+0enwFMCCbWQIT5z+j46yyAO9Om9p+M4H9qV7 -INbe2kxJPareejuWnf9Xy2FVzgO+7YGZmxiSrHurRBoZO8KNvjib23mUXVJOKMVB -6gIZciMNVJ3HYTajtExS94eguukL9g+mAMSgRttNM6xlkJRCnzx55ie1VQ4kYhVR -wbAzcSLeovdXC7FaCKtBRgsY/kDmnxJ6qlWzcbOJQ4FlRnHtGQSqFBPUUQVJuuMB -zaY83TVDscYMz42G7eZ2skRZ8R6Rsm1jNIWeBwGKAc2y3o1vMaXJlmui2g== -=9fdK +mQINBF1bQAwBEACe+uIPgsfTmgLVDlJhdfzUH+ff774fn/Lqf0kLactHR8I6yI3h +JO6i47IhM45VJLY0ZzXntCaItavm35NGdVuA3yPJv7YkSLTPkg5D2VHyZknb52lD +JQbtyuBQK+OZiRfekbZtAfKOljFyPxr1d9Vdw0H4jYRjNK1k3iGERUf8254Y0Wqx +wz+iMLXxlDcWnq0VBSjs+bQqr61iViIIC1S1vHKsl2Sk0QBMjYrTqyttJbGQOy00 +tCMy7ZFMIIEJz8Fg0XiY4d2cmIJlvRoxVpaTWE+W9wxssR4ZqOhLGUAnermScKDc +2aTERdDhG30oW/c8KLXpCKzcUc8IEETeMcBhWRzxgi1CcQEk9KhwfBQdezvY2PyE +EjhOoFZ8ryWCrOnlNgzSnFPtohbx8VD+HctJZ5foaq5ceH+YvH5zasBG/plQXO5A +hwAc8BhGdP4jvFUIBOUyjGHlj7UcqKSDDm2uIV9XjoRfCKPav62VQKRSJXvlBdZe +2uGxgZJ6TmgI2bHa0uQn5kDdQ7CYT9NYu+qXNVNxRZ8w5eTIeDxRIeAas8G5i7eO +dzEV47wN6CkK/8vVu9vXbfiGkH6Cz32zBr1py2kW+n/D8XR5ZlbsV7P2ne3VXOv9 +WTXSUFpkV1OrGY33j6Lg6OmcVhHTtCDDwCaB4iCHXDTVq9Yh2Er+ADIVtwARAQAB +tDtEZ3JhcGggTGFicyAoRGdyYXBoIExhYnMgTGljZW5zaW5nIEtleSkgPGNvbnRh +Y3RAZGdyYXBoLmlvPokCTgQTAQoAOBYhBA95WEve8LWjE9TFvnomeeH3SyppBQJd +W0AMAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEHomeeH3SyppWkEP/2ob +D9fMOSzHzs9B/sUVOBWZrA8YWb3NiB1o4oINxeAcuJ27VlejnMqA1ePYKzUoqRu+ +DkapdgQzLq9pBLhZoIQ8Q6rIww5cIfh4LaY5VSjH9fDTO3Kck85KjAWI6Q7sfcic +A4k3s6ay2zCfU2c3TX9uiLv0VehzJEDto/bKixvrUEfQdlEKFrgWQjipb1Et3wHW +kUAoDvpCLYVcQdmtNtWv1banGPUeYXhxou30w+vgbi3H+2bG61I8f0kWPz6YOavM +v3XM37Fdh6dg5zUH+Rq4vFBomqmGmdauuQ9HWCstJ8cQZF098s20VpU54bG38fvO +fzCXk5cMaG4U27CprvDskQbqlfB3ZCrbTzkvjWF4yvB2Ih6YzjT7lbZMD8CKMcBC +SN3AtJH8XfF8j2GSNMmlP9oU8lW0PANfqRGCBMM78mmAmBVDTvxvoxMyCKSr/buu +Ydyx56u1dvSdP8Wkkl4dpiIrdb0YzwvdVLxhPfNc2WaFJ6Awq95Y991iMwtU41Xu +uwDZ+GAV8f20NEtaw+qvxAN0eXbjFzvXYAqpevDfzzMTu48dEhfeu2Ykj0GixWQk +bGLJhKKRwcc/HJwDGeoSl8lN9RwdVRGg5v5LzUQswUx6Nk5CC+hU4UNZT6MS+asA +aAbA+Y9Is79grWnNQEuXunJOtwX8bojnWIPJec6/uQINBF1bQAwBEACdgeaYbJS7 +GLyelAvX7/Axj209biX5hT2s97Gv+TwNz0DpJh9ptOd5ThAoZJe7ggeMvEUEfV9+ +/W6STBrpuJzFRhUypCIB1lfYl3E3HyqvVOol7Xxm781QEEq1q9t/OaNQ+uT4IzCG +jR8Kae45pXPPfSba3Ma4NIWBTQyQgqy2FZSvTklA4Dvod7BkHoGsZIap6Pk/1Buc +VyeQ0aR8BIx9ROmPosuYWEwpNkahi+K5iM200Nw+PMaISI2SZN0vAgZHuoTd8pyu +xNidBGEQ4/9nJHPVPxr70j4MjN2U80rKEYO1cyTaR22t0QuIWDSJjuaLY++VHIA6 +cf63HFNgfUaOJhUQenJeZ46yk/C8gO96+0z5gtnIE1gl4h2k4M9MfzvJAotDa6Nx +5/4ehpwLWc+NGtC00DbTxfOhEMn2VbQfxELXUgZbLmq+k0zsE0xcxoA3YnO1KVpN +8TQ7pD5UTqNRCHzNmuvI6BYpf7tAfPuwDnCwYNZ0MYXJK8zg6UUORU61iF5Y6ap7 +3i0XzdXe9lxLJjBVgard5Onns+opBggP5rm7s5hXpF1RWYHpZWsLsZUSzwmAkv05 +dRKWfacVyH8/zeMfKQzF9jL+ibVytvkUHOjAvYRnFtUaFjvKpzEWMNyIIq2wlAA1 +oO+No8rldhjWKXG0ognvf43kBWlMSKcPgQARAQABiQI2BBgBCgAgFiEED3lYS97w +taMT1MW+eiZ54fdLKmkFAl1bQAwCGwwACgkQeiZ54fdLKmmTjhAAmODrhyGRYGs2 +GCEY76iQFCjfgYsssG6RwJvDuFZ7o4UbU6FPZ+ebuPtqCA4tys6tGd4tZVem9nnd +WoiaqMNetYXHNEXtZqw07b4fiAp8aVt1N5sVaRLTvZCOyH/EwlG/wNLA7wNko3I2 +n+js3ogE4dz1Ru9iR2OUKMtUUwytxbZSCPFq+/3IJI9O0EE1yYjLP8wLBGblL6Rf +Qa0VSFKegZD0WUy93JDR9Qnt3DJKh6YvjTJnwLe6Rl2rgMGryzZQa6EBo5D/MoS4 +pEyBEUMc2vB3RLLQsX39Ld3p/Pq2T69Mfytqw+crKImse1UavVQDskCTQDhBH/Jw +5+LfMUQEB5xhF7xHS0tpOlt/k/AjNCddnLZ00A34PhjY+sDftpWaC9uK0sikeN43 +R+lNMJ39xejsFUWSJM3HmnELs4JAg/DwZ0kiS6/ffKFoXi771PuOcJpNxcYG5y3I +k09Ao2v2RwWQayli/ysAENStfiWS/fVl5tlDaYGDqF0G9haMA1XPnptrgg4S3ADx +E4Hf9ymxdCLfuVsJ0dPkqv/nWsEMIVQmFVZvWs8iz8JR7Wh6/L1KJ+HpxekqoZgq +836PkLFlKGgKJw2nP5lDJIpst/qnf8hzyGQUJnjiVh3SWNpIvH8Zhrz2BQtgJhUF +43jJL0ZpKmjIPPYbx+4TjyF8T5cSCvE= +=wx6r -----END PGP PUBLIC KEY BLOCK-----` // verifySignature verifies the signature given a public key. It also JSON unmarshals the details From 101e1c0ff2f548ffd1866e9f8ee0c62a0086e7a0 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 21 Aug 2019 08:58:12 +1000 Subject: [PATCH 33/35] Apply license valid for 30 days after proposing cid --- compose/compose.go | 25 ++++++++----------------- dgraph/cmd/zero/raft.go | 23 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/compose/compose.go b/compose/compose.go index 025e2bc940b..2175e93401e 100644 --- a/compose/compose.go +++ b/compose/compose.go @@ -67,7 +67,6 @@ type options struct { NumAlphas int NumReplicas int LruSizeMB int - Enterprise bool AclSecret string DataDir string DataVol bool @@ -213,16 +212,14 @@ func getAlpha(idx int) service { if opts.WhiteList { svc.Command += " --whitelist=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" } - if opts.Enterprise { - if opts.AclSecret != "" { - svc.Command += " --acl_secret_file=/secret/hmac --acl_access_ttl 3s --acl_cache_ttl 5s" - svc.Volumes = append(svc.Volumes, volume{ - Type: "bind", - Source: opts.AclSecret, - Target: "/secret/hmac", - ReadOnly: true, - }) - } + if opts.AclSecret != "" { + svc.Command += " --acl_secret_file=/secret/hmac --acl_access_ttl 3s --acl_cache_ttl 5s" + svc.Volumes = append(svc.Volumes, volume{ + Type: "bind", + Source: opts.AclSecret, + Target: "/secret/hmac", + ReadOnly: true, + }) } return svc @@ -338,8 +335,6 @@ func main() { "mount a docker volume as /data in containers") cmd.PersistentFlags().StringVarP(&opts.DataDir, "data_dir", "d", "", "mount a host directory as /data in containers") - cmd.PersistentFlags().BoolVarP(&opts.Enterprise, "enterprise", "e", false, - "enable enterprise features in alphas") cmd.PersistentFlags().StringVar(&opts.AclSecret, "acl_secret", "", "enable ACL feature with specified HMAC secret file") cmd.PersistentFlags().BoolVarP(&opts.UserOwnership, "user", "u", false, @@ -385,10 +380,6 @@ func main() { if opts.LruSizeMB < 1024 { fatal(errors.Errorf("LRU cache size must be >= 1024 MB")) } - if opts.AclSecret != "" && !opts.Enterprise { - warning("adding --enterprise because it is required by ACL feature") - opts.Enterprise = true - } if opts.DataVol && opts.DataDir != "" { fatal(errors.Errorf("only one of --data_vol and --data_dir may be used at a time")) } diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index e933e6d8de7..695616203ff 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -505,7 +505,7 @@ func (n *node) initAndStartNode() error { err := n.proposeAndWait(context.Background(), &pb.ZeroProposal{Cid: id}) if err == nil { glog.Infof("CID set for cluster: %v", id) - return + break } if err == errInvalidProposal { glog.Errorf("invalid proposal error while proposing cluster id") @@ -514,6 +514,27 @@ func (n *node) initAndStartNode() error { glog.Errorf("While proposing CID: %v. Retrying...", err) time.Sleep(3 * time.Second) } + + // Apply enterprise license valid for 30 days from now. + proposal := &pb.ZeroProposal{ + License: &pb.License{ + MaxNodes: math.MaxUint64, + ExpiryTs: time.Now().Add(30 * 24 * time.Hour).Unix(), + }, + } + for { + err := n.proposeAndWait(context.Background(), proposal) + if err == nil { + glog.Infof("Enterprise state proposed to the cluster: %v", proposal) + return + } + if err == errInvalidProposal { + glog.Errorf("invalid proposal error while proposing enteprise state") + return + } + glog.Errorf("While proposing enterprise state: %v. Retrying...", err) + time.Sleep(3 * time.Second) + } }() } From 09969a07b6e46250bd6b2cd95ae58e768d9d8234 Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 21 Aug 2019 09:16:39 +1000 Subject: [PATCH 34/35] Revert changes to functions.sh --- contrib/scripts/functions.sh | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/contrib/scripts/functions.sh b/contrib/scripts/functions.sh index fe6c89d1beb..ce3442afe12 100755 --- a/contrib/scripts/functions.sh +++ b/contrib/scripts/functions.sh @@ -4,7 +4,7 @@ # May be called with an argument which is a docker compose file # to use *instead of* the default docker-compose.yml. -function restartCluster() { +function restartCluster { if [[ -z $1 ]]; then compose_file="docker-compose.yml" else @@ -25,37 +25,15 @@ function restartCluster() { $basedir/contrib/wait-for-it.sh -t 60 localhost:6180 || exit 1 $basedir/contrib/wait-for-it.sh -t 60 localhost:9180 || exit 1 - - [ ! -z "$LICENSE_FILE" ] && applyLicense sleep 10 || exit 1 } -# Reads license from LICENSE_FILE environment variable and applies it to zero. It also retries the -# command 5 times with a 5 sec sleep in between. -function applyLicense() { - n=0 - until [ $n -ge 5 ]; do - echo "Applying license to Zero" - status_code=$(curl -X POST --write-out "%{http_code}\n" --silent --output /dev/null http://localhost:6180/enterpriseLicense \ - --header 'Content-Type: application/json' \ - --data-binary "$LICENSE_FILE") - - if [[ "$status_code" -ne 200 ]]; then - echo "Got $status_code while applying license. Sleeping for 5 secs." - sleep 5 - else - break - fi - n=$(($n + 1)) - done -} - -function stopCluster() { +function stopCluster { basedir=$GOPATH/src/github.com/dgraph-io/dgraph pushd $basedir/dgraph >/dev/null - docker ps --filter label="cluster=test" --format "{{.Names}}" | - xargs -r docker stop | sed 's/^/Stopped /' - docker ps -a --filter label="cluster=test" --format "{{.Names}}" | - xargs -r docker rm | sed 's/^/Removed /' + docker ps --filter label="cluster=test" --format "{{.Names}}" \ + | xargs -r docker stop | sed 's/^/Stopped /' + docker ps -a --filter label="cluster=test" --format "{{.Names}}" \ + | xargs -r docker rm | sed 's/^/Removed /' popd >/dev/null } From ba7f3fb64285bde0e51e04d7070e67e4798835ab Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Wed, 21 Aug 2019 10:59:27 +1000 Subject: [PATCH 35/35] Print info logs if license is about to expire in less than a week. --- dgraph/cmd/zero/raft.go | 8 +++++++- dgraph/cmd/zero/zero.go | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 695616203ff..4beb9d81941 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -32,6 +32,7 @@ import ( "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" farm "github.com/dgryski/go-farm" + humanize "github.com/dustin/go-humanize" "github.com/golang/glog" "github.com/google/uuid" "github.com/pkg/errors" @@ -519,7 +520,7 @@ func (n *node) initAndStartNode() error { proposal := &pb.ZeroProposal{ License: &pb.License{ MaxNodes: math.MaxUint64, - ExpiryTs: time.Now().Add(30 * 24 * time.Hour).Unix(), + ExpiryTs: time.Now().Add(humanize.Month).Unix(), }, } for { @@ -550,11 +551,16 @@ func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() + dailyTicker := time.NewTicker(humanize.Day) + defer dailyTicker.Stop() + n.server.updateEnterpriseState() for { select { case <-ticker.C: n.server.updateEnterpriseState() + case <-dailyTicker.C: + n.server.licenseExpiryWarning() case <-closer.HasBeenClosed(): return } diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index cbd0a274e39..436cb5c20b3 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -23,6 +23,8 @@ import ( "sync" "time" + "github.com/dustin/go-humanize" + otrace "go.opencensus.io/trace" "golang.org/x/net/context" @@ -285,8 +287,31 @@ func (s *Server) updateEnterpriseState() { return } + enabled := s.state.GetLicense().GetEnabled() expiry := time.Unix(s.state.License.ExpiryTs, 0) s.state.License.Enabled = time.Now().Before(expiry) + if enabled && !s.state.License.Enabled { + // License was enabled earlier and has just now been disabled. + glog.Infof("Enterprise license has expired and enterprise features would be disabled now. " + + "Talk to us at contact@dgraph.io to get a new license.") + } +} + +// Prints out an info log about the expiry of the license if its about to expire in less than a +// week. +func (s *Server) licenseExpiryWarning() { + s.RLock() + defer s.RUnlock() + + if s.state.GetLicense() == nil { + return + } + enabled := s.state.GetLicense().GetEnabled() + expiry := time.Unix(s.state.License.ExpiryTs, 0) + timeToExpire := expiry.Sub(time.Now()) + if enabled && timeToExpire > 0 && timeToExpire < humanize.Week { + glog.Infof("Enterprise license is going to expire in %s.", humanize.Time(expiry)) + } } func (s *Server) removeZero(nodeId uint64) {