diff --git a/api/client/client.go b/api/client/client.go index b071ac69268c8..f8f61e53b16ae 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -2431,7 +2431,7 @@ func (c *Client) CreateRegisterChallenge(ctx context.Context, in *proto.CreateRe // GenerateCertAuthorityCRL generates an empty CRL for a CA. func (c *Client) GenerateCertAuthorityCRL(ctx context.Context, req *proto.CertAuthorityRequest) (*proto.CRL, error) { - resp, err := c.grpc.GenerateCertAuthorityCRL(ctx, req) + resp, err := c.grpc.GenerateCertAuthorityCRL(ctx, req, c.callOpts...) return resp, trail.FromGRPC(err) } @@ -2532,21 +2532,48 @@ func GetResourcesWithFilters(ctx context.Context, clt ListResourcesClient, req p } // CreateSessionTracker creates a tracker resource for an active session. -func (c *Client) CreateSessionTracker(ctx context.Context, req *proto.CreateSessionTrackerRequest) (types.SessionTracker, error) { - resp, err := c.grpc.CreateSessionTracker(ctx, req) - return resp, trail.FromGRPC(err) +func (c *Client) CreateSessionTracker(ctx context.Context, st types.SessionTracker) (types.SessionTracker, error) { + v1, ok := st.(*types.SessionTrackerV1) + if !ok { + return nil, trace.BadParameter("invalid type %T, expected *types.SessionTrackerV1", st) + } + + req := &proto.CreateSessionTrackerRequest{SessionTracker: v1} + + // DELETE IN 11.0.0 + // Early v9 versions use a flattened out types.SessionTrackerV1 + req.ID = v1.Spec.SessionID + req.Type = v1.Spec.Kind + req.Reason = v1.Spec.Reason + req.Invited = v1.Spec.Invited + req.Hostname = v1.Spec.Hostname + req.Address = v1.Spec.Address + req.ClusterName = v1.Spec.ClusterName + req.Login = v1.Spec.Login + req.Expires = v1.Spec.Expires + req.KubernetesCluster = v1.Spec.KubernetesCluster + req.HostUser = v1.Spec.HostUser + if len(v1.Spec.Participants) > 0 { + req.Initiator = &v1.Spec.Participants[0] + } + + tracker, err := c.grpc.CreateSessionTracker(ctx, req, c.callOpts...) + if err != nil { + return nil, trail.FromGRPC(err) + } + return tracker, nil } // GetSessionTracker returns the current state of a session tracker for an active session. func (c *Client) GetSessionTracker(ctx context.Context, sessionID string) (types.SessionTracker, error) { req := &proto.GetSessionTrackerRequest{SessionID: sessionID} - resp, err := c.grpc.GetSessionTracker(ctx, req) + resp, err := c.grpc.GetSessionTracker(ctx, req, c.callOpts...) return resp, trail.FromGRPC(err) } // GetActiveSessionTrackers returns a list of active session trackers. func (c *Client) GetActiveSessionTrackers(ctx context.Context) ([]types.SessionTracker, error) { - stream, err := c.grpc.GetActiveSessionTrackers(ctx, &empty.Empty{}) + stream, err := c.grpc.GetActiveSessionTrackers(ctx, &empty.Empty{}, c.callOpts...) if err != nil { return nil, trail.FromGRPC(err) } @@ -2570,18 +2597,18 @@ func (c *Client) GetActiveSessionTrackers(ctx context.Context) ([]types.SessionT // RemoveSessionTracker removes a tracker resource for an active session. func (c *Client) RemoveSessionTracker(ctx context.Context, sessionID string) error { - _, err := c.grpc.RemoveSessionTracker(ctx, &proto.RemoveSessionTrackerRequest{SessionID: sessionID}) + _, err := c.grpc.RemoveSessionTracker(ctx, &proto.RemoveSessionTrackerRequest{SessionID: sessionID}, c.callOpts...) return trail.FromGRPC(err) } // UpdateSessionTracker updates a tracker resource for an active session. func (c *Client) UpdateSessionTracker(ctx context.Context, req *proto.UpdateSessionTrackerRequest) error { - _, err := c.grpc.UpdateSessionTracker(ctx, req) + _, err := c.grpc.UpdateSessionTracker(ctx, req, c.callOpts...) return trail.FromGRPC(err) } // MaintainSessionPresence establishes a channel used to continuously verify the presence for a session. func (c *Client) MaintainSessionPresence(ctx context.Context) (proto.AuthService_MaintainSessionPresenceClient, error) { - stream, err := c.grpc.MaintainSessionPresence(ctx) + stream, err := c.grpc.MaintainSessionPresence(ctx, c.callOpts...) return stream, trail.FromGRPC(err) } diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 5405c81dfe9eb..672325898232f 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -9608,40 +9608,56 @@ func (m *ListResourcesResponse) GetTotalCount() int32 { // This is not specific to any session type. Relevant fields should be set for a given session type. type CreateSessionTrackerRequest struct { // Namespace is a session namespace, separating sessions from each other. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Namespace string `protobuf:"bytes,1,opt,name=Namespace,proto3" json:"namespace,omitempty"` // Type describes what type of session this is. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Type string `protobuf:"bytes,2,opt,name=Type,proto3" json:"type,omitempty"` // Reason is an arbitrary string that may be used to describe the session and/or it's // purpose. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Reason string `protobuf:"bytes,3,opt,name=Reason,proto3" json:"reason,omitempty"` // Invited is a list of invited users, this field is interpreted by different // clients on a best-effort basis and used for delivering notifications to invited users. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Invited []string `protobuf:"bytes,4,rep,name=Invited,proto3" json:"invited,omitempty"` // Hostname is the address of the target this session is connected to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Hostname string `protobuf:"bytes,5,opt,name=Hostname,proto3" json:"target_hostname,omitempty"` // Address is the address of the target this session is connected to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Address string `protobuf:"bytes,6,opt,name=Address,proto3" json:"target_address,omitempty"` // ClusterName is the name of cluster that this session belongs to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. ClusterName string `protobuf:"bytes,7,opt,name=ClusterName,proto3" json:"cluster_name,omitempty"` // Login is the local login/user on the target used by the session. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Login string `protobuf:"bytes,8,opt,name=Login,proto3" json:"login,omitempty"` // Initiator is the participant that initiated the session. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Initiator *types.Participant `protobuf:"bytes,9,opt,name=Initiator,proto3" json:"initiator,omitempty"` // Expires encodes the time at which this session expires and becomes invalid. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. Expires time.Time `protobuf:"bytes,10,opt,name=Expires,proto3,stdtime" json:"expires,omitempty"` // The Kubernetes cluster this session belongs to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. KubernetesCluster string `protobuf:"bytes,11,opt,name=KubernetesCluster,proto3" json:"kubernetes_cluster,omitempty"` // HostUser is the user regarded as the owner of this session, RBAC checks are performed // against the require policies of this user. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. HostUser string `protobuf:"bytes,12,opt,name=HostUser,proto3" json:"host_user,omitempty"` // ID is the ID of the session. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. ID string `protobuf:"bytes,13,opt,name=ID,proto3" json:"id,omitempty"` // HostPolicies is a list of RBAC policy sets held by the host user at the time of session // creation. - HostPolicies []*types.SessionTrackerPolicySet `protobuf:"bytes,14,rep,name=HostPolicies,proto3" json:"host_policies,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. + HostPolicies []*types.SessionTrackerPolicySet `protobuf:"bytes,14,rep,name=HostPolicies,proto3" json:"host_policies,omitempty"` + // SessionTracker is the session tracker to be created. + SessionTracker *types.SessionTrackerV1 `protobuf:"bytes,15,opt,name=SessionTracker,proto3" json:"session_tracker,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CreateSessionTrackerRequest) Reset() { *m = CreateSessionTrackerRequest{} } @@ -9775,6 +9791,13 @@ func (m *CreateSessionTrackerRequest) GetHostPolicies() []*types.SessionTrackerP return nil } +func (m *CreateSessionTrackerRequest) GetSessionTracker() *types.SessionTrackerV1 { + if m != nil { + return m.SessionTracker + } + return nil +} + // GetSessionTrackerRequest is a request to fetch a session resource. type GetSessionTrackerRequest struct { // SessionID is unique identifier of this session. @@ -10492,15 +10515,15 @@ func init() { func init() { proto.RegisterFile("authservice.proto", fileDescriptor_ce8bd90b12161215) } var fileDescriptor_ce8bd90b12161215 = []byte{ - // 9667 bytes of a gzipped FileDescriptorProto + // 9690 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7d, 0x5b, 0x6c, 0x5c, 0xcb, 0x96, 0x50, 0xba, 0xfd, 0xea, 0x5e, 0x7e, 0xa4, 0x5d, 0xb6, 0xe3, 0x4e, 0xc7, 0x71, 0x27, 0x3b, 0xe7, 0xe4, 0xe6, 0x9c, 0x39, 0x93, 0xe4, 0xd8, 0xe7, 0xfd, 0xbc, 0xdd, 0x6d, 0xc7, 0x76, 0xe2, - 0x38, 0x3e, 0xbb, 0x6d, 0xe7, 0x70, 0xee, 0x99, 0xe9, 0xb3, 0xdd, 0x5d, 0xb1, 0x37, 0x6e, 0xf7, - 0xee, 0xbb, 0xf7, 0xee, 0xe4, 0x44, 0x08, 0x04, 0x0c, 0x03, 0x08, 0x09, 0x31, 0x48, 0x8c, 0x00, - 0xf1, 0xc1, 0x48, 0xf0, 0x05, 0x82, 0x0f, 0x84, 0xf8, 0xe5, 0x07, 0xc1, 0x05, 0x09, 0xc1, 0xcf, - 0x08, 0x69, 0x3e, 0x7a, 0x2e, 0xf7, 0x0b, 0xf9, 0x0f, 0x21, 0x90, 0xb8, 0x5f, 0xa8, 0x9e, 0xbb, - 0x6a, 0xef, 0x5d, 0xdd, 0x76, 0x12, 0xee, 0xfc, 0x24, 0xde, 0x55, 0xb5, 0x56, 0xad, 0x5a, 0xb5, + 0x38, 0x3e, 0xbb, 0x6d, 0xe7, 0x70, 0xee, 0x99, 0xdb, 0x67, 0xbb, 0xbb, 0x62, 0x6f, 0xdc, 0xee, + 0xdd, 0x77, 0xef, 0xdd, 0xc9, 0x89, 0x10, 0x08, 0x18, 0x06, 0x10, 0x12, 0x62, 0x90, 0x18, 0x01, + 0xe2, 0x83, 0x91, 0xe0, 0x0b, 0x04, 0x1f, 0x08, 0xf1, 0x3b, 0x3f, 0x08, 0x2e, 0x48, 0x08, 0x7e, + 0x46, 0x48, 0xf3, 0xd1, 0x5c, 0xee, 0x17, 0xf2, 0x1f, 0x42, 0x20, 0x71, 0xbf, 0x50, 0x3d, 0x77, + 0xd5, 0xde, 0xbb, 0xba, 0xed, 0x24, 0xcc, 0xfc, 0x24, 0xde, 0x55, 0xb5, 0x56, 0xad, 0x5a, 0xb5, 0x6a, 0xd5, 0xaa, 0x55, 0xab, 0x56, 0xc3, 0xac, 0xd3, 0x0b, 0x8f, 0x03, 0xec, 0x3f, 0x77, 0x9b, 0xf8, 0x6e, 0xd7, 0xf7, 0x42, 0x0f, 0x8d, 0xd1, 0xff, 0x4a, 0xf3, 0x47, 0xde, 0x91, 0x47, 0xff, 0xbc, 0x47, 0xfe, 0x62, 0x95, 0xa5, 0x6b, 0x47, 0x9e, 0x77, 0xd4, 0xc6, 0xf7, 0xe8, 0xd7, 0x61, @@ -10536,7 +10559,7 @@ var fileDescriptor_ce8bd90b12161215 = []byte{ 0x5a, 0xaa, 0x4b, 0x9b, 0x06, 0x80, 0x8e, 0xa1, 0xc0, 0xfe, 0xaa, 0x79, 0x9d, 0x0e, 0x6e, 0x92, 0x25, 0x55, 0x9c, 0xa6, 0x1d, 0x5c, 0xe5, 0x1d, 0xc4, 0xab, 0x0f, 0x56, 0xaa, 0xe5, 0xb3, 0x7e, 0xf9, 0x1a, 0xc3, 0xdd, 0x68, 0xca, 0x0a, 0xad, 0x9b, 0x04, 0x56, 0x32, 0x8e, 0x4a, 0xb3, 0x89, - 0x83, 0xc0, 0xc6, 0x3f, 0xef, 0xe1, 0x20, 0x2c, 0xce, 0x68, 0xe3, 0xd0, 0xea, 0x0e, 0x56, 0xd9, + 0x83, 0xc0, 0xc6, 0xbf, 0xe8, 0xe1, 0x20, 0x2c, 0xce, 0x68, 0xe3, 0xd0, 0xea, 0x0e, 0x56, 0xd9, 0x38, 0x1c, 0x5a, 0xd8, 0xf0, 0x59, 0xa9, 0x3e, 0x0e, 0x0d, 0x00, 0xed, 0x02, 0x54, 0xba, 0xdd, 0x3a, 0x0e, 0x88, 0x30, 0x16, 0x2f, 0x53, 0xd4, 0x73, 0x1c, 0xf5, 0x53, 0x7c, 0xc8, 0x2b, 0x0e, 0x56, 0xaa, 0x57, 0xcf, 0xfa, 0xe5, 0x05, 0xa7, 0xdb, 0x6d, 0x04, 0xac, 0x48, 0x43, 0xaa, 0xe0, @@ -10545,7 +10568,7 @@ var fileDescriptor_ce8bd90b12161215 = []byte{ 0x00, 0x73, 0xf1, 0x98, 0xd5, 0xd6, 0xa2, 0x5e, 0x79, 0xb0, 0xca, 0xd6, 0x62, 0x8b, 0x97, 0x36, 0x52, 0xe4, 0x25, 0x86, 0x8f, 0x70, 0x24, 0x1a, 0x78, 0x11, 0x0d, 0xe1, 0xc8, 0x0b, 0x7c, 0x98, 0xce, 0x91, 0xa8, 0x29, 0xda, 0x84, 0xdc, 0x53, 0x7c, 0xc8, 0x34, 0xc7, 0x1c, 0xc5, 0x37, 0x1b, - 0xe1, 0x63, 0x3a, 0x63, 0x95, 0xad, 0x0a, 0x82, 0x2d, 0xa9, 0x2d, 0x24, 0x34, 0xfa, 0xfd, 0x0c, + 0xe1, 0x63, 0x3a, 0x63, 0x95, 0xad, 0x0a, 0x82, 0x2d, 0xa9, 0x2d, 0x24, 0x34, 0xfa, 0xbd, 0x0c, 0x2c, 0x8a, 0x15, 0x8e, 0xc3, 0x17, 0x9e, 0x7f, 0xe2, 0x76, 0x8e, 0x6a, 0x5e, 0xe7, 0x99, 0x7b, 0x54, 0x9c, 0xa7, 0x98, 0x6f, 0xc4, 0x94, 0x46, 0xac, 0xd5, 0xc1, 0x4a, 0xf5, 0x27, 0x67, 0xfd, 0xf2, 0x2d, 0xa9, 0x40, 0x64, 0x3d, 0x11, 0xc8, 0x67, 0xee, 0x91, 0xd6, 0xb1, 0xa9, 0x2f, 0xf4, @@ -10553,7 +10576,7 @@ var fileDescriptor_ce8bd90b12161215 = []byte{ 0x72, 0xb5, 0xa6, 0x35, 0x3a, 0x58, 0xa9, 0xde, 0x3e, 0xeb, 0x97, 0x2d, 0xce, 0xb8, 0x86, 0x2f, 0xaa, 0xd3, 0x88, 0x30, 0x74, 0x44, 0x24, 0x81, 0x28, 0xff, 0x5d, 0x1f, 0x3f, 0xc3, 0x3e, 0xee, 0x34, 0x71, 0xf1, 0x8a, 0x26, 0x09, 0x7a, 0xa5, 0xd0, 0xca, 0x64, 0x2b, 0x69, 0x74, 0x65, 0xb1, - 0x2e, 0x09, 0x3a, 0x08, 0xfa, 0x39, 0x20, 0xce, 0x80, 0x4a, 0xaf, 0xe5, 0x86, 0x7c, 0x80, 0x8b, + 0x2e, 0x09, 0x3a, 0x08, 0xfa, 0x05, 0x20, 0xce, 0x80, 0x4a, 0xaf, 0xe5, 0x86, 0x7c, 0x80, 0x8b, 0xb4, 0x97, 0x6b, 0x3a, 0x9f, 0x95, 0x06, 0x07, 0x2b, 0x55, 0xeb, 0xac, 0x5f, 0x5e, 0x16, 0x2c, 0x76, 0x48, 0x55, 0xda, 0xc0, 0x52, 0x90, 0x13, 0xcd, 0xbb, 0xed, 0x35, 0x4f, 0x8a, 0x45, 0x4d, 0xf3, 0x92, 0x22, 0xa1, 0xb2, 0xdb, 0x5e, 0xf3, 0x44, 0xd7, 0xbc, 0xa4, 0x16, 0x85, 0x30, 0xc7, @@ -10570,7 +10593,7 @@ var fileDescriptor_ce8bd90b12161215 = []byte{ 0x2a, 0xc2, 0x73, 0xb0, 0x5a, 0x9d, 0x3d, 0xeb, 0x97, 0xa7, 0x9d, 0xae, 0x3e, 0x2c, 0xd2, 0xba, 0x0a, 0x90, 0x13, 0x06, 0xd9, 0xc3, 0xd1, 0xdc, 0x44, 0x21, 0x67, 0x6d, 0xc2, 0xd8, 0x53, 0x27, 0x6c, 0x1e, 0xa3, 0xaf, 0x61, 0xec, 0x91, 0xdb, 0x69, 0x05, 0xc5, 0xcc, 0x8d, 0x11, 0xba, 0x67, - 0x33, 0x6b, 0x91, 0x56, 0x92, 0x8a, 0xea, 0xe2, 0x2f, 0xfa, 0xe5, 0x4b, 0x67, 0xfd, 0xf2, 0xe5, + 0x33, 0x6b, 0x91, 0x56, 0x92, 0x8a, 0xea, 0xe2, 0x2f, 0xfb, 0xe5, 0x4b, 0x67, 0xfd, 0xf2, 0xe5, 0x13, 0xd2, 0x4c, 0x31, 0x19, 0x19, 0x9c, 0xf5, 0xaf, 0xb3, 0x90, 0x97, 0xad, 0xd1, 0x12, 0x8c, 0x92, 0xff, 0xa9, 0xed, 0x99, 0xaf, 0xe6, 0xce, 0xfa, 0xe5, 0x51, 0x02, 0x67, 0xd3, 0x52, 0xb4, 0x02, 0x93, 0xdb, 0x9e, 0xd3, 0xaa, 0xe3, 0xa6, 0x8f, 0xc3, 0x80, 0x1a, 0x97, 0xb9, 0x6a, 0xe1, @@ -10580,12 +10603,12 @@ var fileDescriptor_ce8bd90b12161215 = []byte{ 0x3c, 0xa3, 0x05, 0xca, 0x40, 0x38, 0x06, 0x74, 0x1f, 0x26, 0xea, 0xbd, 0x43, 0x4a, 0xfe, 0x18, 0xed, 0x8c, 0xce, 0x6e, 0xd0, 0x3b, 0x6c, 0x90, 0x21, 0x28, 0x00, 0xa2, 0x59, 0xe9, 0x53, 0x98, 0x54, 0xd0, 0xa3, 0x02, 0x8c, 0x9c, 0xe0, 0x97, 0x6c, 0xec, 0x36, 0xf9, 0x13, 0xcd, 0xc3, 0xd8, - 0x73, 0xa7, 0xdd, 0xc3, 0x74, 0xa8, 0x79, 0x9b, 0x7d, 0x7c, 0x96, 0xfd, 0x24, 0x63, 0xfd, 0x97, + 0x73, 0xa7, 0xdd, 0xc3, 0x74, 0xa8, 0x79, 0x9b, 0x7d, 0x7c, 0x96, 0xfd, 0x24, 0x63, 0xfd, 0xe7, 0x51, 0x28, 0x6c, 0x7a, 0x41, 0x48, 0x2c, 0x59, 0xb9, 0x25, 0xdf, 0x82, 0x71, 0x52, 0xb6, 0xb5, 0xc6, 0xf9, 0x37, 0x79, 0xd6, 0x2f, 0x4f, 0x1c, 0x7b, 0x41, 0xd8, 0x70, 0x5b, 0x36, 0xaf, 0x42, 0xef, 0x40, 0x6e, 0xc7, 0x6b, 0x61, 0xca, 0x14, 0x8a, 0xb6, 0x3a, 0x7d, 0xd6, 0x2f, 0xe7, 0x3b, 0x5e, 0x0b, 0x53, 0xab, 0xd0, 0x96, 0xd5, 0xe8, 0x80, 0x5b, 0x73, 0x8c, 0x77, 0x55, 0xc2, 0x3b, - 0x62, 0xbe, 0xfd, 0xba, 0x5f, 0xfe, 0xe8, 0x02, 0xc7, 0x8d, 0xbb, 0xf5, 0x97, 0x41, 0x88, 0x4f, + 0x62, 0xbe, 0xfd, 0xa6, 0x5f, 0xfe, 0xe8, 0x02, 0xc7, 0x8d, 0xbb, 0xf5, 0x97, 0x41, 0x88, 0x4f, 0x09, 0x26, 0x6e, 0xec, 0x3d, 0x85, 0xf9, 0x4a, 0xab, 0xe5, 0x32, 0x88, 0x5d, 0xdf, 0xed, 0x34, 0xdd, 0xae, 0xd3, 0x0e, 0xe8, 0x1c, 0xe4, 0xab, 0xb7, 0xce, 0xfa, 0xe5, 0xb2, 0x23, 0xeb, 0x1b, 0x5d, 0xd9, 0x40, 0xe1, 0x61, 0x2a, 0x02, 0xb4, 0x0a, 0xb9, 0xb5, 0x9d, 0x3a, 0x35, 0x05, 0x8b, @@ -10602,502 +10625,503 @@ var fileDescriptor_ce8bd90b12161215 = []byte{ 0x11, 0x0c, 0x9d, 0x48, 0xb4, 0xa6, 0xce, 0xfa, 0xe5, 0x5c, 0x8f, 0x97, 0xd9, 0xb2, 0x16, 0xd5, 0x61, 0x62, 0xfd, 0xc7, 0xae, 0xeb, 0xe3, 0x80, 0x1f, 0xe5, 0x4a, 0x77, 0xd9, 0x89, 0xfd, 0xae, 0x38, 0xb1, 0xdf, 0xdd, 0x13, 0x27, 0xf6, 0xea, 0x75, 0xae, 0x42, 0x66, 0x31, 0x03, 0x89, 0xc6, - 0xf7, 0x07, 0x7f, 0x5a, 0xce, 0xd8, 0x02, 0x13, 0x7a, 0x0f, 0xc6, 0x1f, 0x78, 0xfe, 0xa9, 0x13, - 0xd2, 0x13, 0x5c, 0x9e, 0x2f, 0x57, 0x5a, 0xa2, 0x2d, 0x57, 0x5a, 0x82, 0x1e, 0xc0, 0x8c, 0xed, - 0xf5, 0x42, 0xbc, 0xe7, 0x09, 0x73, 0x93, 0xad, 0xda, 0xe5, 0xb3, 0x7e, 0xb9, 0xe4, 0x93, 0x9a, - 0x46, 0xe8, 0x25, 0x0d, 0x4b, 0x3b, 0x06, 0x85, 0xd6, 0x61, 0x46, 0x33, 0x8c, 0x83, 0xe2, 0x38, - 0x95, 0x3c, 0x66, 0x34, 0x68, 0xe6, 0xb4, 0x2a, 0x7f, 0x31, 0x20, 0xb4, 0x03, 0xb3, 0x8f, 0x7a, - 0x87, 0xd8, 0xef, 0xe0, 0x10, 0x07, 0x82, 0xa2, 0x09, 0x4a, 0xd1, 0x8d, 0xb3, 0x7e, 0x79, 0xe9, - 0x44, 0x56, 0xa6, 0xd0, 0x94, 0x04, 0x45, 0x18, 0x2e, 0x73, 0x42, 0xe5, 0x36, 0x94, 0xe3, 0xe6, - 0x34, 0x53, 0x71, 0xb1, 0xda, 0xea, 0x2d, 0xce, 0xe5, 0x6b, 0x72, 0xec, 0xc9, 0x8d, 0xc9, 0x8e, - 0xe3, 0x24, 0x2b, 0x4e, 0x6a, 0x93, 0x3c, 0xa5, 0x96, 0x1d, 0xd2, 0x84, 0x36, 0x51, 0x65, 0x51, - 0xea, 0x95, 0x6d, 0x18, 0xdb, 0x0f, 0x9c, 0x23, 0x26, 0x89, 0x33, 0x2b, 0x37, 0x39, 0x45, 0x71, - 0xe9, 0xa3, 0xe7, 0x7a, 0xda, 0xb0, 0x3a, 0x47, 0x76, 0x90, 0x1e, 0xf9, 0x53, 0xdd, 0x41, 0x68, - 0x1d, 0xfa, 0x06, 0x80, 0x53, 0x45, 0x76, 0xb6, 0x49, 0xbe, 0xd7, 0x6a, 0x83, 0x24, 0x9b, 0xd8, - 0x32, 0x1f, 0xdf, 0x15, 0x39, 0x3e, 0x6d, 0xaf, 0xb3, 0x15, 0x24, 0xe8, 0x6b, 0x98, 0xa2, 0xea, - 0x4a, 0xcc, 0xe8, 0x14, 0x9d, 0x51, 0x7a, 0xf4, 0x27, 0x0a, 0x30, 0x6d, 0x3e, 0x35, 0x00, 0xf4, - 0x97, 0x60, 0x81, 0xa3, 0x8b, 0x99, 0x19, 0xd3, 0xdc, 0xac, 0xd2, 0xc8, 0xd3, 0xdb, 0x54, 0xdf, - 0xe5, 0x94, 0x5a, 0x92, 0x52, 0xa3, 0xe1, 0x61, 0xa7, 0x77, 0x63, 0x7d, 0x0b, 0x79, 0xc9, 0x3c, - 0x34, 0x01, 0x23, 0x95, 0x76, 0xbb, 0x70, 0x89, 0xfc, 0x51, 0xaf, 0x6f, 0x16, 0x32, 0x68, 0x06, - 0x20, 0x92, 0x98, 0x42, 0x16, 0x4d, 0x45, 0xc6, 0x4a, 0x61, 0x84, 0xb6, 0xef, 0x76, 0x0b, 0xa3, - 0x08, 0xc5, 0xad, 0xa4, 0xc2, 0x98, 0xf5, 0xdf, 0x32, 0x09, 0xc1, 0x22, 0xfb, 0x32, 0x37, 0xac, - 0xa8, 0x1c, 0xb0, 0xcd, 0x87, 0xee, 0xcb, 0xdc, 0x24, 0x63, 0x1b, 0x8b, 0xda, 0x88, 0xe8, 0x8a, - 0x5d, 0xc2, 0x83, 0xa6, 0xd7, 0x56, 0x75, 0x45, 0x97, 0x97, 0xd9, 0xb2, 0x16, 0xad, 0x28, 0x5a, - 0x65, 0x24, 0xda, 0x58, 0x85, 0x56, 0x51, 0x25, 0x4c, 0xea, 0x97, 0x15, 0xc5, 0xfa, 0x1a, 0x8d, - 0x60, 0x52, 0x24, 0x5a, 0xb6, 0xb3, 0x7a, 0x86, 0x39, 0x43, 0x9f, 0x27, 0x8c, 0x45, 0x36, 0x42, - 0x2a, 0x94, 0xb1, 0xa9, 0x49, 0xd8, 0x81, 0x65, 0x18, 0xdb, 0xf6, 0x8e, 0xdc, 0x0e, 0x1f, 0x64, - 0xfe, 0xac, 0x5f, 0x1e, 0x6b, 0x93, 0x02, 0x9b, 0x95, 0x5b, 0xff, 0x37, 0xa3, 0xca, 0xaf, 0xb4, - 0x57, 0x32, 0xa9, 0xf6, 0xca, 0x7b, 0x90, 0xe7, 0x87, 0x9a, 0xad, 0x35, 0x8e, 0x91, 0xea, 0x63, - 0x71, 0x1e, 0x72, 0x5b, 0x76, 0xd4, 0x80, 0xec, 0x34, 0x4c, 0x39, 0xd3, 0x9d, 0x66, 0x24, 0xda, - 0x69, 0xb8, 0xfa, 0x66, 0x3b, 0x4d, 0xd4, 0x84, 0x4c, 0xa4, 0xea, 0x4d, 0x1a, 0x8d, 0x26, 0x52, - 0xf5, 0x1b, 0xe9, 0xbe, 0xa2, 0xcf, 0x00, 0x2a, 0x4f, 0xeb, 0x44, 0xfa, 0x2b, 0xf6, 0x0e, 0xd7, - 0xa1, 0xd4, 0xd5, 0xe4, 0xbc, 0x08, 0x1a, 0x74, 0xb5, 0x38, 0xbe, 0xba, 0x25, 0x29, 0xad, 0xad, - 0x36, 0xcc, 0x6c, 0xe0, 0x90, 0xcc, 0x9a, 0xd8, 0x70, 0x06, 0x0f, 0xff, 0x0b, 0x98, 0x7c, 0xea, - 0x86, 0xc7, 0xba, 0x01, 0x48, 0x3b, 0x7b, 0xe1, 0x86, 0xc7, 0xc2, 0x00, 0x54, 0x3a, 0x53, 0x9b, - 0x5b, 0xeb, 0x70, 0x99, 0xf7, 0x26, 0xf7, 0xb7, 0x15, 0x1d, 0x61, 0x26, 0xb2, 0x28, 0x55, 0x84, - 0x3a, 0x1a, 0x1c, 0x57, 0xf8, 0xa8, 0x9e, 0xd8, 0x02, 0x98, 0x35, 0x6c, 0xf2, 0xb4, 0x50, 0xc1, - 0x89, 0x6d, 0x0d, 0xf1, 0x0d, 0xc1, 0xda, 0x87, 0xe9, 0xdd, 0x76, 0xef, 0xc8, 0xed, 0x10, 0x01, - 0xad, 0xe3, 0x9f, 0xa3, 0x35, 0x80, 0xa8, 0x80, 0xf7, 0x20, 0xdc, 0x0b, 0x51, 0xc5, 0xc1, 0x2a, - 0x9f, 0x62, 0x5a, 0x42, 0x75, 0xb8, 0xad, 0xc0, 0x59, 0x7f, 0x6b, 0x04, 0x10, 0xef, 0xa3, 0x1e, - 0x3a, 0x21, 0xae, 0xe3, 0x90, 0x6c, 0x17, 0x57, 0x20, 0x2b, 0xcd, 0xc6, 0xf1, 0xb3, 0x7e, 0x39, - 0xeb, 0xb6, 0xec, 0xec, 0xd6, 0x1a, 0xfa, 0x00, 0xc6, 0x68, 0x33, 0xca, 0xeb, 0x19, 0xd9, 0x9f, - 0x8a, 0x81, 0xc9, 0x74, 0x40, 0xfe, 0xb4, 0x59, 0x63, 0xf4, 0x21, 0xe4, 0xd7, 0x70, 0x1b, 0x1f, - 0x39, 0xa1, 0x27, 0xe4, 0x8e, 0x19, 0x62, 0xa2, 0x50, 0x99, 0xa2, 0xa8, 0x25, 0xd9, 0xc0, 0x6d, - 0xec, 0x04, 0x5e, 0x47, 0xdd, 0xc0, 0x7d, 0x5a, 0xa2, 0x6e, 0xe0, 0xac, 0x0d, 0xfa, 0xc3, 0x0c, - 0x4c, 0x56, 0x3a, 0x1d, 0x6e, 0xe0, 0x04, 0xdc, 0xb5, 0xba, 0x70, 0x57, 0x7a, 0xc6, 0xb7, 0x9d, - 0x43, 0xdc, 0x3e, 0x20, 0x26, 0x73, 0x50, 0xfd, 0x9e, 0xe8, 0xd4, 0x3f, 0xe9, 0x97, 0x3f, 0x7f, - 0x15, 0x67, 0xfb, 0xdd, 0x3d, 0xdf, 0x71, 0xc3, 0x80, 0xfa, 0xb1, 0xa2, 0x0e, 0x55, 0x31, 0x53, - 0xe8, 0x40, 0xef, 0xc0, 0x18, 0x91, 0x6f, 0x61, 0x07, 0xd0, 0xc9, 0x26, 0xeb, 0x40, 0x3b, 0xfc, - 0xd0, 0x16, 0xd6, 0x2d, 0xc8, 0x73, 0x4e, 0x6e, 0xad, 0x99, 0xa6, 0xc0, 0x5a, 0x83, 0xeb, 0xd4, - 0x8a, 0xc3, 0x44, 0x72, 0xa9, 0x37, 0x87, 0x4b, 0x62, 0x64, 0xf6, 0x4f, 0xd0, 0x62, 0x09, 0x4d, - 0x27, 0x84, 0x7a, 0x83, 0x6c, 0x51, 0x63, 0xd5, 0x60, 0x69, 0x03, 0x87, 0x36, 0x0e, 0x70, 0xb8, - 0xeb, 0x04, 0xc1, 0x0b, 0xcf, 0x6f, 0xd1, 0xaa, 0x0b, 0x21, 0xf9, 0x6b, 0x19, 0x28, 0xd7, 0x7c, - 0x4c, 0x66, 0xda, 0x88, 0x68, 0xf0, 0x0a, 0x5e, 0xe2, 0x97, 0x0b, 0xd9, 0xa8, 0x96, 0xf0, 0x9a, - 0x5f, 0x20, 0xbc, 0x0d, 0x23, 0x7b, 0x7b, 0xdb, 0x54, 0x62, 0x46, 0x28, 0xe3, 0x46, 0xc2, 0xb0, - 0xfd, 0xeb, 0x7e, 0x39, 0xb7, 0xd6, 0x63, 0x97, 0x0f, 0x36, 0xa9, 0xb7, 0x9e, 0xc1, 0x82, 0x8d, - 0x3b, 0xf8, 0x85, 0x73, 0xd8, 0xc6, 0x9a, 0xb9, 0x5a, 0x86, 0x31, 0xe6, 0x2c, 0x4b, 0x0c, 0x81, - 0x95, 0xeb, 0xf6, 0x6c, 0x76, 0x88, 0x3d, 0x6b, 0xfd, 0x51, 0x06, 0x0a, 0x6c, 0xb8, 0x55, 0x2f, - 0x3c, 0xdf, 0xf8, 0xf8, 0x08, 0xb2, 0x83, 0x47, 0x80, 0x6e, 0x47, 0xdc, 0x1e, 0x89, 0x36, 0x3f, - 0x4a, 0x2a, 0xd1, 0xe1, 0xa2, 0x92, 0x0c, 0x88, 0xc9, 0x12, 0x3b, 0x1a, 0xd1, 0x01, 0x51, 0x59, - 0x12, 0x12, 0xf4, 0x2f, 0xb2, 0x30, 0xab, 0x90, 0x18, 0x74, 0xbd, 0x4e, 0x80, 0xc9, 0x19, 0x8f, - 0x08, 0x8b, 0x42, 0x27, 0x3d, 0xe3, 0x91, 0x2d, 0xb3, 0x11, 0x59, 0xe2, 0x94, 0xe0, 0x77, 0xc8, - 0xe1, 0xa2, 0x9d, 0x38, 0x0e, 0x52, 0xc5, 0xcd, 0x9a, 0x8a, 0xea, 0x73, 0x13, 0x7d, 0x0f, 0x72, - 0xf4, 0x4f, 0xc2, 0x88, 0x51, 0x33, 0x23, 0x64, 0x23, 0xe4, 0x02, 0x3c, 0xf4, 0xdc, 0xce, 0x63, - 0x1c, 0x1e, 0x7b, 0xe2, 0xf0, 0xbc, 0x45, 0x94, 0xd8, 0x9f, 0xf7, 0xdc, 0x4e, 0xe3, 0x94, 0x16, - 0x5f, 0xf4, 0xd0, 0x19, 0x21, 0xb4, 0x15, 0xe4, 0xd6, 0x7d, 0x28, 0x10, 0x7d, 0x73, 0xfe, 0x19, - 0xb5, 0xe6, 0x01, 0x6d, 0xe0, 0xb0, 0xea, 0x69, 0x1b, 0x87, 0x35, 0x0d, 0x93, 0xbb, 0x6e, 0xe7, - 0x48, 0x7c, 0xfe, 0x9b, 0x2c, 0x4c, 0xb1, 0x6f, 0x3e, 0x03, 0xb1, 0x9d, 0x34, 0x73, 0x9e, 0x9d, - 0xf4, 0x13, 0x98, 0xe6, 0xee, 0x1c, 0xec, 0x53, 0x17, 0x32, 0x9b, 0x0f, 0x7a, 0xa2, 0x64, 0x5e, - 0x9d, 0xc6, 0x73, 0x56, 0x63, 0xeb, 0x0d, 0xd1, 0x36, 0xcc, 0xb0, 0x82, 0x07, 0xd8, 0x09, 0x7b, - 0xd1, 0xa9, 0xea, 0x32, 0xb7, 0x33, 0x45, 0x31, 0x53, 0x46, 0x1c, 0xd7, 0x33, 0x5e, 0x68, 0xc7, - 0x60, 0xd1, 0xd7, 0x70, 0x79, 0xd7, 0xf7, 0x7e, 0x7c, 0xa9, 0xd8, 0x0e, 0x4c, 0x1f, 0x2f, 0x90, - 0x43, 0x58, 0x97, 0x54, 0x35, 0x54, 0x0b, 0x22, 0xde, 0x9a, 0xc8, 0xd4, 0x56, 0x50, 0xf5, 0x7c, - 0xb7, 0x73, 0x44, 0x67, 0x33, 0xc7, 0x64, 0xca, 0x0d, 0x1a, 0x87, 0xb4, 0xd0, 0x96, 0xd5, 0xd6, - 0xff, 0x18, 0x81, 0x9c, 0xec, 0xf8, 0xae, 0x6a, 0x96, 0xf2, 0xcd, 0x98, 0x2e, 0xcf, 0xe8, 0xf0, - 0x63, 0x2b, 0x2d, 0xd0, 0x55, 0xe6, 0xcc, 0x62, 0x66, 0xc0, 0x04, 0x91, 0x31, 0xa7, 0xdb, 0xa5, - 0x2e, 0x2b, 0xa2, 0x4c, 0xd7, 0xaa, 0x94, 0x0b, 0x39, 0xa6, 0x4c, 0x5b, 0x87, 0x76, 0x76, 0xad, - 0x4a, 0xe6, 0xfa, 0xc9, 0xd6, 0x5a, 0x8d, 0x0e, 0x28, 0xc7, 0xe6, 0xda, 0x73, 0x5b, 0x4d, 0x9b, - 0x96, 0x92, 0xda, 0x7a, 0xe5, 0xf1, 0x36, 0x27, 0x9a, 0xd6, 0x06, 0xce, 0x69, 0xdb, 0xa6, 0xa5, - 0xc4, 0x0e, 0x64, 0x7b, 0x74, 0xcd, 0xeb, 0x84, 0xbe, 0xd7, 0x0e, 0xa8, 0xab, 0x20, 0xa7, 0x6d, - 0xe7, 0x4d, 0x5e, 0x65, 0xc7, 0x9a, 0xa2, 0xa7, 0xb0, 0x58, 0x69, 0x3d, 0x77, 0x3a, 0x4d, 0xdc, - 0x62, 0x35, 0x4f, 0x3d, 0xff, 0xe4, 0x59, 0xdb, 0x7b, 0x11, 0xd0, 0x53, 0x5e, 0x8e, 0x9f, 0x17, - 0x79, 0x93, 0x06, 0x47, 0xf7, 0x42, 0x34, 0xb2, 0x4d, 0xd0, 0x44, 0x45, 0xd4, 0xda, 0x5e, 0xaf, - 0x45, 0x8f, 0x77, 0x39, 0xa6, 0x22, 0x9a, 0xa4, 0xc0, 0x66, 0xe5, 0x84, 0x4b, 0x9b, 0xf5, 0xc7, - 0xf4, 0x74, 0xc6, 0xb9, 0x74, 0x1c, 0x9c, 0xda, 0xa4, 0x0c, 0xbd, 0x0d, 0x13, 0xc2, 0xa4, 0x65, - 0x4e, 0x01, 0xea, 0x31, 0x12, 0xa6, 0xac, 0xa8, 0x43, 0x6b, 0x30, 0xfb, 0xd8, 0x6b, 0x61, 0xdf, - 0x09, 0x71, 0x8b, 0x5b, 0x97, 0x01, 0x3d, 0x68, 0xe5, 0x98, 0x59, 0x7d, 0x2a, 0x2a, 0xc5, 0x85, - 0x46, 0x60, 0x27, 0x01, 0xac, 0xf7, 0x61, 0x96, 0x2d, 0xbd, 0x73, 0xdb, 0x7b, 0xd6, 0x2e, 0x40, - 0x1d, 0x9f, 0x3a, 0xdd, 0x63, 0x8f, 0x88, 0x47, 0x55, 0xfd, 0xe2, 0x06, 0x10, 0x92, 0xd7, 0x05, - 0xbc, 0xe2, 0x60, 0x55, 0x58, 0xc4, 0xa2, 0xa5, 0xad, 0x40, 0x59, 0xff, 0x39, 0x0b, 0x88, 0xba, - 0xcd, 0xeb, 0xa1, 0x8f, 0x9d, 0x53, 0x41, 0xc6, 0xa7, 0x30, 0xc5, 0xb4, 0x28, 0x2b, 0xa6, 0xe4, - 0x10, 0xeb, 0x8a, 0x2d, 0x1f, 0xb5, 0x6a, 0xf3, 0x92, 0xad, 0x35, 0x25, 0xa0, 0x36, 0x0e, 0x7a, - 0xa7, 0x02, 0x34, 0xab, 0x81, 0xaa, 0x55, 0x04, 0x54, 0xfd, 0x46, 0x5f, 0xc3, 0x4c, 0xcd, 0x3b, - 0xed, 0x12, 0x9e, 0x70, 0xe0, 0x11, 0x6e, 0xc3, 0xf0, 0x7e, 0xb5, 0xca, 0xcd, 0x4b, 0x76, 0xac, - 0x39, 0xda, 0x81, 0xb9, 0x07, 0xed, 0x5e, 0x70, 0x5c, 0xe9, 0xb4, 0x6a, 0x6d, 0x2f, 0x10, 0x58, - 0x46, 0xb9, 0x4b, 0x85, 0x2f, 0xfe, 0x64, 0x8b, 0xcd, 0x4b, 0x76, 0x1a, 0x20, 0x7a, 0x9b, 0xc7, - 0x00, 0x70, 0x5b, 0x6a, 0xfa, 0x2e, 0x0f, 0x11, 0x78, 0xd2, 0xc1, 0x4f, 0x9e, 0x6d, 0x5e, 0xb2, - 0x59, 0x6d, 0x35, 0x0f, 0x13, 0x42, 0xf1, 0xdd, 0x83, 0x59, 0x85, 0x9d, 0xc4, 0xfa, 0xeb, 0x05, - 0xa8, 0x04, 0xb9, 0xfd, 0x6e, 0xdb, 0x73, 0x5a, 0xc2, 0x98, 0xb0, 0xe5, 0xb7, 0xf5, 0x9e, 0xce, - 0x69, 0xb4, 0xa4, 0x9e, 0x68, 0x58, 0xe3, 0xa8, 0xc0, 0xda, 0xd4, 0x99, 0x3b, 0xb8, 0xb5, 0xd6, - 0x6f, 0x36, 0xd6, 0x6f, 0x21, 0xce, 0x6b, 0x6b, 0x21, 0x95, 0x79, 0xd6, 0x23, 0x6a, 0x28, 0x55, - 0xba, 0xdd, 0xb6, 0xdb, 0xa4, 0xfb, 0x0b, 0xd3, 0x8e, 0xd2, 0xc6, 0xf8, 0x2d, 0xf5, 0xa6, 0x5a, - 0xd9, 0x5c, 0xe5, 0xbd, 0xb4, 0x72, 0x17, 0x6d, 0x7d, 0x07, 0xd7, 0x0d, 0xc8, 0xf8, 0x3e, 0xf1, - 0x29, 0x4c, 0xf0, 0xa2, 0x98, 0x40, 0xab, 0xbe, 0x7d, 0xba, 0x2a, 0x03, 0x0e, 0x29, 0xda, 0x5b, - 0xdf, 0xc2, 0xf2, 0x7e, 0x37, 0xc0, 0x7e, 0x12, 0xbd, 0x20, 0xf5, 0x23, 0x79, 0x13, 0x9e, 0x31, - 0xde, 0x1b, 0xc0, 0x59, 0xbf, 0x3c, 0xce, 0x70, 0x8b, 0x0b, 0x70, 0xeb, 0x0f, 0x32, 0xb0, 0xcc, - 0x96, 0xaa, 0x11, 0xf5, 0x45, 0xb8, 0xa0, 0xf8, 0xa5, 0xb3, 0x66, 0xbf, 0xf4, 0x40, 0x47, 0xbd, - 0xf5, 0x0d, 0x58, 0x9c, 0xa2, 0x76, 0xfb, 0x0d, 0xcd, 0xcd, 0x5f, 0xcd, 0xc0, 0x3c, 0x9b, 0x9c, - 0xd7, 0xc0, 0x82, 0xbe, 0x84, 0x99, 0xfa, 0x89, 0xdb, 0x3d, 0x70, 0xda, 0x6e, 0x8b, 0xb9, 0x68, - 0xd9, 0x76, 0xb4, 0x40, 0x77, 0xda, 0x13, 0xb7, 0xdb, 0x78, 0x1e, 0x55, 0x65, 0xec, 0x58, 0x63, - 0xeb, 0x09, 0x2c, 0xc4, 0x68, 0xe0, 0x82, 0xf1, 0x51, 0x5c, 0x30, 0x12, 0x61, 0x0c, 0xe9, 0x52, - 0xf1, 0x18, 0xae, 0x48, 0xa9, 0xd0, 0xa7, 0x6c, 0x35, 0x26, 0x0d, 0x09, 0x84, 0x69, 0xa2, 0xd0, - 0x84, 0x2b, 0x52, 0x12, 0x5e, 0x43, 0x02, 0xc4, 0xe4, 0x66, 0x53, 0x27, 0x77, 0x0b, 0x4a, 0xea, - 0xe4, 0xbe, 0xce, 0xa4, 0xfe, 0xa7, 0x0c, 0x2c, 0x6e, 0xe0, 0x0e, 0xdd, 0x7a, 0x2a, 0xdd, 0xae, - 0x76, 0x32, 0x51, 0xdd, 0xd3, 0x99, 0x81, 0xee, 0x69, 0x69, 0x76, 0x67, 0xd3, 0xcd, 0x6e, 0xb2, - 0xa7, 0xee, 0xdb, 0x5b, 0x5c, 0x56, 0xe9, 0x9e, 0xda, 0xf3, 0x5d, 0x9b, 0x94, 0xa1, 0xad, 0xc8, - 0xb5, 0x3d, 0x3a, 0xd4, 0xb5, 0x3d, 0xc7, 0x5d, 0x7d, 0x13, 0xdc, 0xb5, 0xad, 0x39, 0xb4, 0xad, - 0xcf, 0xa1, 0x98, 0x1c, 0x0b, 0x97, 0x8f, 0x61, 0x47, 0x1d, 0x6b, 0x2d, 0x92, 0x6e, 0x7e, 0x0b, - 0x2e, 0x5d, 0xfa, 0x31, 0x15, 0x3a, 0xc0, 0x85, 0x64, 0xd5, 0x23, 0xf9, 0xe4, 0x58, 0x78, 0xff, - 0x9f, 0x11, 0xf9, 0x64, 0x91, 0x0e, 0x19, 0x73, 0xa4, 0x03, 0x97, 0x51, 0x06, 0x2a, 0x00, 0xac, - 0xa7, 0x70, 0x45, 0x43, 0x1a, 0x49, 0xfd, 0x97, 0x90, 0x93, 0x06, 0x86, 0xee, 0xe1, 0xd0, 0xd0, - 0xd2, 0x79, 0x93, 0xb6, 0x86, 0x04, 0xb1, 0x7e, 0x99, 0x81, 0x45, 0xb6, 0xbb, 0x24, 0xc7, 0x7d, - 0xfe, 0xd9, 0xff, 0x8d, 0xb8, 0xcd, 0xee, 0xa7, 0xb8, 0xcd, 0x28, 0x88, 0xea, 0x36, 0x53, 0x9d, - 0x65, 0x0f, 0x47, 0x73, 0xd9, 0xc2, 0x88, 0x75, 0x00, 0xc5, 0xe4, 0x08, 0xdf, 0xc0, 0x9c, 0x6c, - 0xc0, 0xa2, 0xb2, 0xd0, 0x5f, 0x43, 0x62, 0x36, 0x61, 0x29, 0x32, 0xf3, 0xb4, 0x39, 0xbe, 0xe0, - 0x3c, 0x70, 0xd9, 0x8b, 0x68, 0x7f, 0x83, 0xb2, 0x17, 0x35, 0x7c, 0x63, 0xb2, 0xb7, 0x05, 0x73, - 0x0c, 0xb1, 0xbe, 0x4e, 0x57, 0xd4, 0x75, 0x9a, 0x1a, 0xbf, 0x93, 0x5c, 0xba, 0x8f, 0xe9, 0xd2, - 0x15, 0x4d, 0x22, 0x0a, 0x3f, 0x84, 0x71, 0x1e, 0xa2, 0xc8, 0xe8, 0x4b, 0x41, 0x46, 0x75, 0x38, - 0x8b, 0x4b, 0xb4, 0x79, 0x63, 0xab, 0x48, 0x87, 0x4c, 0xce, 0x4d, 0xdc, 0x01, 0x2f, 0x4f, 0xb1, - 0xdf, 0x10, 0x65, 0x19, 0xab, 0x79, 0xcd, 0xfd, 0xe7, 0x09, 0x14, 0xd9, 0xfe, 0xa3, 0x60, 0x7d, - 0xad, 0x1d, 0xe8, 0x13, 0x28, 0x32, 0x79, 0x4a, 0x41, 0x38, 0x78, 0x5b, 0x59, 0x16, 0x92, 0x58, - 0x69, 0xb7, 0xd3, 0x46, 0xff, 0x37, 0x32, 0x70, 0x75, 0x03, 0x87, 0x7a, 0x14, 0xd7, 0x9f, 0x89, - 0x15, 0xf0, 0x3d, 0x94, 0xd2, 0x08, 0xe1, 0x53, 0xf1, 0x55, 0x7c, 0x2a, 0x8c, 0x21, 0x6b, 0xe9, - 0x53, 0xf2, 0x1d, 0x5c, 0x63, 0x53, 0xa2, 0xb7, 0x17, 0x03, 0xfd, 0x3c, 0x36, 0x2b, 0x46, 0xec, - 0x69, 0xb3, 0xf3, 0xb7, 0x33, 0x70, 0x8d, 0x31, 0x39, 0x1d, 0xf9, 0x6f, 0xda, 0x4e, 0xdc, 0x81, - 0xb2, 0x9c, 0xf3, 0x37, 0x30, 0xb1, 0xd6, 0xbf, 0xcc, 0x00, 0x12, 0x78, 0x6a, 0x75, 0x5b, 0xe0, - 0xb8, 0x0a, 0x23, 0xb5, 0xba, 0xcd, 0x6f, 0xc4, 0xe9, 0xfe, 0xdf, 0x0c, 0x7c, 0x9b, 0x94, 0xc5, - 0x37, 0x83, 0xec, 0x79, 0x36, 0x83, 0x2d, 0x40, 0x75, 0xf7, 0xa8, 0xf3, 0xd4, 0x0d, 0x8f, 0x65, - 0x67, 0x15, 0xee, 0xbd, 0xa0, 0xc1, 0x82, 0x81, 0x7b, 0xd4, 0x69, 0xd0, 0x2b, 0x09, 0x19, 0x90, - 0xd8, 0x74, 0xec, 0x14, 0x20, 0xeb, 0x67, 0x30, 0xa7, 0xd1, 0xcb, 0x65, 0x68, 0x09, 0x46, 0x6b, - 0xd8, 0x0f, 0x39, 0xc5, 0x94, 0x6b, 0x4d, 0xec, 0x87, 0x36, 0x2d, 0x45, 0xb7, 0x61, 0xa2, 0x56, - 0xa1, 0x9e, 0x54, 0x6a, 0xf1, 0x4c, 0x31, 0x25, 0xd7, 0x74, 0x1a, 0x34, 0x4a, 0xde, 0x16, 0x95, - 0xd6, 0xbf, 0xcf, 0x2a, 0xd8, 0x09, 0xf8, 0x70, 0x76, 0xbc, 0x4f, 0x0e, 0xed, 0x84, 0xff, 0x0a, - 0x37, 0x66, 0xc9, 0x66, 0xca, 0xbd, 0x50, 0x6c, 0x1f, 0xb0, 0x95, 0x46, 0xe7, 0xf4, 0x02, 0x8b, - 0x5b, 0x47, 0x06, 0x24, 0x3c, 0xa4, 0xf2, 0xd6, 0x91, 0xa3, 0x0e, 0x6c, 0xb5, 0x11, 0xfa, 0x5d, - 0x98, 0xe6, 0x34, 0x73, 0x82, 0xc6, 0xe8, 0xb5, 0xc6, 0x5b, 0xfc, 0xa8, 0x9c, 0x32, 0xb6, 0xbb, - 0xb2, 0x3d, 0x8f, 0x5f, 0x16, 0x9f, 0x6c, 0x1a, 0x75, 0x74, 0xd6, 0x6d, 0xe9, 0xd0, 0xc7, 0x3e, - 0xba, 0x0c, 0x93, 0xfb, 0x3b, 0xf5, 0xdd, 0xf5, 0xda, 0xd6, 0x83, 0xad, 0xf5, 0xb5, 0xc2, 0x25, - 0x94, 0x83, 0xd1, 0xbd, 0xda, 0xde, 0x76, 0x21, 0x63, 0x7d, 0x0f, 0xf3, 0x7a, 0x5f, 0x6f, 0x74, - 0x9a, 0xde, 0xa2, 0xd7, 0x6a, 0xca, 0x85, 0x34, 0x42, 0xaa, 0x9b, 0x85, 0x2f, 0x95, 0x8f, 0xa1, - 0xc0, 0x5b, 0x45, 0xaa, 0xe6, 0x96, 0x30, 0x7c, 0x99, 0xa2, 0xd1, 0x03, 0xb8, 0x85, 0xcf, 0xf9, - 0x27, 0xc2, 0x91, 0x33, 0xac, 0x87, 0xbf, 0x9f, 0x81, 0xe2, 0xe3, 0x07, 0x95, 0x4a, 0x2f, 0x3c, - 0xc6, 0x9d, 0x90, 0x1c, 0xd9, 0x70, 0xed, 0xd8, 0x69, 0xb7, 0x71, 0xe7, 0x08, 0xa3, 0x3b, 0x30, - 0xba, 0xf7, 0x64, 0x6f, 0x97, 0xfb, 0x4b, 0xe6, 0xf9, 0x0c, 0x90, 0x22, 0xd9, 0xc6, 0xa6, 0x2d, - 0xd0, 0x23, 0x98, 0x7d, 0xca, 0x9f, 0x4c, 0xc8, 0x2a, 0xee, 0x29, 0xb9, 0x7e, 0x57, 0x3e, 0xa6, - 0xa8, 0xf9, 0xb8, 0x45, 0x7a, 0x71, 0xda, 0x95, 0x80, 0x28, 0x3b, 0x22, 0x27, 0x49, 0xb8, 0x87, - 0xa3, 0xb9, 0x4c, 0x21, 0x6b, 0xfd, 0x61, 0x06, 0x16, 0x63, 0x94, 0x29, 0xce, 0x73, 0x95, 0xb0, - 0x39, 0x85, 0x30, 0xd1, 0x64, 0xf3, 0x12, 0xa7, 0xac, 0x46, 0xe3, 0x73, 0x69, 0x0f, 0x9c, 0xa0, - 0xb7, 0x07, 0x13, 0x14, 0x21, 0x90, 0x80, 0x3c, 0xba, 0x8e, 0x96, 0x5b, 0x97, 0x61, 0x5a, 0xe3, - 0x80, 0x65, 0xc1, 0x94, 0xda, 0x33, 0x61, 0x73, 0xcd, 0x6b, 0x49, 0x36, 0x93, 0xbf, 0xad, 0xbf, - 0x9b, 0x81, 0xf9, 0xc7, 0x0f, 0x2a, 0x36, 0x3e, 0x72, 0x89, 0xdc, 0x45, 0x2c, 0x5e, 0xd1, 0x46, - 0xb2, 0xa4, 0x8d, 0x24, 0xd6, 0x56, 0x0e, 0xe9, 0xb3, 0xc4, 0x90, 0x96, 0xd2, 0x86, 0x44, 0x6d, - 0x50, 0xd7, 0xeb, 0x68, 0x23, 0x51, 0xfc, 0x42, 0xff, 0x20, 0x03, 0x73, 0x0a, 0x4d, 0x92, 0xfe, - 0xf7, 0x35, 0x92, 0xae, 0xa5, 0x90, 0x94, 0x60, 0x72, 0x35, 0x41, 0xd1, 0x5b, 0x83, 0x28, 0x1a, - 0xca, 0xe3, 0x3f, 0xce, 0xc0, 0x42, 0x2a, 0x0f, 0xd0, 0x15, 0xb2, 0x13, 0x36, 0x7d, 0x1c, 0x72, - 0xf6, 0xf2, 0x2f, 0x52, 0xbe, 0x15, 0x04, 0x3d, 0xfe, 0x9e, 0x25, 0x6f, 0xf3, 0x2f, 0xf4, 0x16, - 0x4c, 0xef, 0x62, 0xdf, 0xf5, 0x5a, 0x75, 0xdc, 0xf4, 0x3a, 0x2d, 0xe6, 0x75, 0x9f, 0xb6, 0xf5, - 0x42, 0xb4, 0x04, 0xf9, 0x4a, 0xfb, 0xc8, 0xf3, 0xdd, 0xf0, 0x98, 0xb9, 0xe6, 0xf2, 0x76, 0x54, - 0x40, 0x70, 0xaf, 0xb9, 0x47, 0x6e, 0xc8, 0xee, 0x2f, 0xa7, 0x6d, 0xfe, 0x85, 0x8a, 0x30, 0x51, - 0x69, 0x36, 0xbd, 0x5e, 0x27, 0xa4, 0x5e, 0xe6, 0xbc, 0x2d, 0x3e, 0x09, 0xc4, 0x37, 0x36, 0x15, - 0x02, 0x1a, 0x71, 0x66, 0xf3, 0x2f, 0xeb, 0x5d, 0x98, 0x4f, 0xe3, 0x63, 0xaa, 0xc8, 0xfc, 0xe5, - 0x2c, 0xcc, 0x55, 0x5a, 0xad, 0xc7, 0x0f, 0x2a, 0x6b, 0x58, 0x35, 0xa8, 0x3e, 0x80, 0xd1, 0xad, - 0x8e, 0x1b, 0x72, 0x4b, 0x60, 0x99, 0x4f, 0x4f, 0x4a, 0x4b, 0xd2, 0x8a, 0xcc, 0x10, 0xf9, 0x1f, - 0xd9, 0x30, 0xb7, 0xfe, 0xa3, 0x1b, 0x84, 0x6e, 0xe7, 0x88, 0xce, 0x39, 0xeb, 0x98, 0xcf, 0xb1, - 0x40, 0x62, 0x58, 0x6e, 0x9b, 0x97, 0xec, 0x34, 0x60, 0xb4, 0x07, 0x57, 0x76, 0xf0, 0x8b, 0x14, - 0x11, 0x92, 0x01, 0x63, 0x12, 0x6d, 0x8a, 0xe4, 0x18, 0x60, 0x55, 0x09, 0xfd, 0xeb, 0x59, 0x1a, - 0x85, 0xa8, 0x0c, 0x8c, 0xf7, 0xbc, 0x0f, 0xf3, 0x0a, 0x41, 0x91, 0xc6, 0xc9, 0xf0, 0xf8, 0xf4, - 0xd4, 0xe1, 0xa8, 0x0b, 0x29, 0x15, 0x1c, 0x3d, 0x85, 0x45, 0x9d, 0xa8, 0x08, 0xb3, 0xbe, 0x18, - 0xd2, 0x9a, 0x6c, 0x5e, 0xb2, 0x4d, 0xd0, 0x68, 0x05, 0x46, 0x2a, 0xcd, 0x13, 0xce, 0x96, 0xf4, - 0x29, 0x63, 0x23, 0xab, 0x34, 0x4f, 0x68, 0x44, 0x6f, 0xf3, 0x44, 0x5b, 0x0f, 0xff, 0x2e, 0x03, - 0x8b, 0x86, 0x19, 0x46, 0xcb, 0x00, 0xac, 0x50, 0xd1, 0xed, 0x4a, 0x09, 0xd9, 0xdd, 0xd9, 0x17, - 0xbd, 0xd4, 0x1d, 0xa1, 0x9b, 0xa9, 0x88, 0xbd, 0x8a, 0x2a, 0x6c, 0xa5, 0x11, 0xda, 0x85, 0x49, - 0xf6, 0xc5, 0x42, 0xc0, 0x46, 0x29, 0x0c, 0xd2, 0x60, 0x58, 0xcc, 0x17, 0x8d, 0xeb, 0x68, 0xd1, - 0x82, 0x46, 0x3c, 0xf4, 0x4b, 0x45, 0xc1, 0x0f, 0xc6, 0xb5, 0xf8, 0x28, 0xe4, 0xa0, 0xd1, 0x1d, - 0x18, 0x67, 0x85, 0x7c, 0x0e, 0xc5, 0xcb, 0xa2, 0xa8, 0x31, 0xaf, 0xb7, 0xfe, 0x28, 0x23, 0xfc, - 0x5d, 0x89, 0xa5, 0xf1, 0xb1, 0xb6, 0x34, 0x6e, 0x4a, 0x82, 0xd3, 0x1a, 0x6b, 0xab, 0xa3, 0x0a, - 0x93, 0xaf, 0xb2, 0x2a, 0x54, 0x20, 0x55, 0x6e, 0xff, 0x49, 0x46, 0x9c, 0xd4, 0x93, 0xa2, 0xbb, - 0x0e, 0x53, 0xaf, 0x26, 0xb2, 0x1a, 0x18, 0xfa, 0x90, 0x49, 0x54, 0x76, 0xf0, 0x48, 0x07, 0x0a, - 0xd5, 0x17, 0xc2, 0xa5, 0xf7, 0x2a, 0x62, 0x65, 0x2d, 0xa5, 0x40, 0xcb, 0xee, 0xac, 0x5e, 0xa2, - 0xb6, 0xfe, 0xb2, 0xd3, 0x14, 0xf3, 0x74, 0x3b, 0x1e, 0xc8, 0x60, 0xbc, 0xa5, 0x56, 0x69, 0xc8, - 0x46, 0x5e, 0x1e, 0x2e, 0x72, 0xd4, 0xbc, 0x53, 0x89, 0x3a, 0x8b, 0xad, 0x93, 0x57, 0xe9, 0xb4, - 0x06, 0xd3, 0x3b, 0xf8, 0x45, 0xa2, 0x5f, 0x7a, 0xf7, 0xd7, 0xc1, 0x2f, 0x1a, 0x4a, 0xdf, 0x8a, - 0xb4, 0xeb, 0x30, 0xe8, 0x10, 0x66, 0x84, 0x2e, 0x38, 0xaf, 0x4a, 0x64, 0x51, 0xad, 0xa4, 0x87, - 0xd3, 0x67, 0x4e, 0xc3, 0xe7, 0xa5, 0x6a, 0x38, 0xaa, 0x8e, 0xd1, 0xda, 0x85, 0x62, 0x72, 0xac, - 0x5c, 0xca, 0x3e, 0x18, 0xb6, 0x9c, 0xd8, 0x49, 0xb1, 0xa5, 0x2f, 0xad, 0x4d, 0xea, 0xd4, 0x90, - 0x6d, 0xe4, 0x71, 0xec, 0x7e, 0x9c, 0x75, 0xf4, 0x4a, 0x51, 0xb0, 0x4e, 0x0d, 0x9b, 0x8f, 0x42, - 0x59, 0x16, 0x62, 0x98, 0x38, 0x61, 0xef, 0xc2, 0x04, 0x2f, 0x92, 0xcf, 0x11, 0xe2, 0x0b, 0x5d, - 0x34, 0xb0, 0xfe, 0x61, 0x06, 0xae, 0xee, 0x07, 0xd8, 0xaf, 0xbb, 0x9d, 0xa3, 0x36, 0xde, 0x0f, - 0xf4, 0x40, 0x92, 0xdf, 0xd6, 0x16, 0xfb, 0xa2, 0x21, 0x40, 0xf5, 0xff, 0xd7, 0x12, 0xff, 0xc7, - 0x19, 0x28, 0xa5, 0xd1, 0xf6, 0x66, 0x57, 0xf9, 0x5d, 0x7e, 0xd6, 0x60, 0xd4, 0x16, 0x39, 0xb8, - 0xec, 0x53, 0x0c, 0x96, 0x0c, 0x92, 0xfc, 0xaf, 0x2d, 0xef, 0xff, 0x93, 0x81, 0xf9, 0xad, 0x80, - 0x92, 0xff, 0xf3, 0x9e, 0xeb, 0xe3, 0x96, 0x60, 0xdc, 0xdd, 0xb4, 0x30, 0x66, 0x3a, 0xaf, 0x9b, - 0x97, 0xd2, 0xc2, 0x94, 0x3f, 0x50, 0x02, 0x35, 0xb3, 0x83, 0xe2, 0x93, 0xb5, 0x37, 0x31, 0xb7, - 0x61, 0x74, 0x87, 0x98, 0x34, 0x23, 0x5c, 0xfe, 0x18, 0x04, 0x29, 0xa2, 0x31, 0x95, 0x84, 0x64, - 0xf2, 0x81, 0x1e, 0x24, 0x22, 0x37, 0x47, 0x87, 0xc7, 0xdf, 0x26, 0x1f, 0xf3, 0x54, 0x73, 0x30, - 0xbe, 0xe7, 0xf8, 0x47, 0x38, 0xb4, 0xbe, 0x83, 0x12, 0xbf, 0xea, 0x64, 0x7e, 0x3f, 0x7a, 0x21, - 0x1a, 0x44, 0xfe, 0xa8, 0x41, 0xd7, 0x93, 0xcb, 0x00, 0xf5, 0xd0, 0xf1, 0xc3, 0xad, 0x4e, 0x0b, - 0xff, 0x48, 0x47, 0x3b, 0x66, 0x2b, 0x25, 0xd6, 0x87, 0x90, 0x97, 0x43, 0xa0, 0xe7, 0x29, 0xc5, - 0x6a, 0xa3, 0xc3, 0x99, 0xd7, 0x62, 0x49, 0x45, 0x00, 0xe9, 0x2a, 0x2c, 0xc4, 0xa6, 0x82, 0xcb, - 0x49, 0x89, 0x4c, 0x18, 0x2b, 0x63, 0xc1, 0x14, 0xb6, 0xfc, 0xb6, 0x6a, 0x30, 0x9b, 0x98, 0x69, - 0x84, 0x68, 0x7c, 0x30, 0x3b, 0x7c, 0x12, 0xa5, 0x5e, 0xaf, 0x6f, 0x92, 0xb2, 0xbd, 0xed, 0x3a, - 0x8b, 0x95, 0x22, 0x65, 0x7b, 0xdb, 0xf5, 0xea, 0x38, 0x93, 0x1c, 0xeb, 0x9f, 0x65, 0xe9, 0x11, - 0x32, 0xc1, 0x83, 0x98, 0x7b, 0x45, 0x75, 0xf1, 0x54, 0x21, 0x4f, 0x47, 0xbc, 0x26, 0x62, 0x0a, - 0x07, 0xdf, 0x8f, 0xe4, 0x7e, 0xd1, 0x2f, 0x5f, 0xa2, 0x97, 0x22, 0x11, 0x18, 0xfa, 0x0a, 0x26, - 0xd6, 0x3b, 0x2d, 0x8a, 0x61, 0xe4, 0x02, 0x18, 0x04, 0x10, 0x99, 0x07, 0x4a, 0x32, 0x31, 0x47, - 0xb8, 0xdf, 0xc0, 0x56, 0x4a, 0x28, 0x9b, 0xdd, 0x53, 0x97, 0xdd, 0x82, 0x8f, 0xd9, 0xec, 0x83, - 0x70, 0x93, 0x92, 0x20, 0x9e, 0x88, 0xe4, 0x6d, 0xf9, 0x8d, 0x2c, 0x18, 0x7b, 0xe2, 0xb7, 0x78, - 0xc0, 0xfe, 0xcc, 0xca, 0x94, 0x78, 0x33, 0x4f, 0xca, 0x6c, 0x56, 0x65, 0xfd, 0x2f, 0x7a, 0x33, - 0x15, 0xa6, 0xca, 0x8d, 0xc6, 0x95, 0xcc, 0x6b, 0x73, 0x25, 0xfb, 0x2a, 0x5c, 0x91, 0xa3, 0x1e, - 0x31, 0x8d, 0x7a, 0xd4, 0x34, 0xea, 0x31, 0xf3, 0xa8, 0x37, 0x60, 0x9c, 0x0d, 0x15, 0xdd, 0x82, - 0xb1, 0xad, 0x10, 0x9f, 0x46, 0xae, 0x05, 0x35, 0xb6, 0xc0, 0x66, 0x75, 0xe4, 0xd4, 0xb3, 0xed, - 0x04, 0xa1, 0x88, 0xce, 0xcb, 0xdb, 0xe2, 0xd3, 0xfa, 0x93, 0x0c, 0x14, 0xb6, 0xdd, 0x20, 0x24, - 0x0b, 0xe1, 0x9c, 0xb2, 0x26, 0x47, 0x94, 0x35, 0x8d, 0x68, 0x24, 0x36, 0xa2, 0xcf, 0x61, 0x9c, - 0x06, 0x8d, 0x06, 0xfc, 0x39, 0xd8, 0x2d, 0x3e, 0xa4, 0x78, 0xc7, 0x2c, 0xb4, 0x34, 0xa0, 0xcf, - 0xb6, 0x6c, 0x0e, 0x52, 0xfa, 0x14, 0x26, 0x95, 0xe2, 0x0b, 0xbd, 0xe6, 0xfa, 0x16, 0x66, 0x95, - 0x2e, 0xa4, 0x1f, 0x62, 0x88, 0x07, 0x5e, 0x7a, 0x78, 0x09, 0xdb, 0x76, 0xf0, 0x8f, 0x2a, 0xdb, - 0xf8, 0xa7, 0xf5, 0x03, 0x8d, 0x79, 0xde, 0xf6, 0x9a, 0x27, 0x8a, 0xff, 0x73, 0x82, 0x29, 0xb3, - 0xf8, 0x35, 0x02, 0x69, 0xc5, 0x6a, 0x6c, 0xd1, 0x02, 0xdd, 0x80, 0xc9, 0xad, 0xce, 0x03, 0xcf, - 0x6f, 0xe2, 0x27, 0x9d, 0x36, 0xc3, 0x9e, 0xb3, 0xd5, 0x22, 0xee, 0x46, 0xe2, 0x3d, 0x44, 0x6e, - 0x24, 0x5a, 0x10, 0x73, 0x23, 0xb1, 0xd7, 0xa8, 0x36, 0xab, 0xe3, 0x5e, 0x2a, 0xf2, 0xf7, 0x20, - 0x1f, 0x92, 0x74, 0x36, 0x0d, 0x6b, 0x78, 0x08, 0x57, 0x6d, 0xdc, 0x6d, 0x3b, 0xc4, 0x56, 0x3c, - 0xf5, 0x58, 0x7b, 0x39, 0xe6, 0x1b, 0x29, 0xe1, 0x78, 0xba, 0x0b, 0x56, 0x92, 0x9c, 0x1d, 0x40, - 0xf2, 0x29, 0xdc, 0xdc, 0xc0, 0x61, 0xea, 0x93, 0xd2, 0x68, 0xf0, 0x9b, 0x90, 0xe3, 0xcf, 0x1e, - 0xc4, 0xf8, 0x87, 0xbd, 0x66, 0xe5, 0x57, 0x4a, 0x1c, 0x8f, 0xfc, 0xcb, 0xfa, 0x1a, 0xca, 0xa6, - 0xee, 0xce, 0x17, 0x3f, 0xe5, 0xc2, 0x0d, 0x33, 0x02, 0x69, 0x4d, 0x4c, 0xf0, 0x0e, 0xe5, 0xa9, - 0x7f, 0x30, 0xb5, 0xf2, 0x92, 0x81, 0xda, 0x53, 0xfc, 0x0f, 0xab, 0x2a, 0x02, 0x34, 0x5e, 0x83, - 0xdc, 0x06, 0xbd, 0x06, 0xd1, 0x11, 0x44, 0x7c, 0xad, 0x40, 0x4e, 0x94, 0xc5, 0xee, 0x41, 0x12, - 0xaf, 0x75, 0x29, 0x43, 0x5b, 0x02, 0x81, 0x04, 0xb3, 0x7e, 0x10, 0x97, 0x15, 0x3a, 0xc4, 0xf9, - 0x42, 0x7b, 0xcf, 0x73, 0x3b, 0x61, 0x79, 0x70, 0x55, 0xc7, 0xad, 0xba, 0xc9, 0x0b, 0x8a, 0x9b, - 0x9c, 0x79, 0xc7, 0x89, 0x5c, 0xda, 0xdb, 0xeb, 0x9d, 0x56, 0xd7, 0x73, 0x3b, 0x21, 0x5f, 0xbc, - 0x6a, 0x11, 0x5a, 0x56, 0x9d, 0xe1, 0x53, 0xc9, 0x58, 0xe8, 0xfb, 0x50, 0x4a, 0xeb, 0x50, 0xf1, - 0xfd, 0x48, 0x7f, 0x32, 0xb3, 0xe3, 0xac, 0x63, 0x98, 0xd7, 0xf2, 0x9f, 0x44, 0x09, 0x1d, 0xa2, - 0xbc, 0x2f, 0xf9, 0xea, 0x17, 0xbf, 0xee, 0x97, 0x3f, 0xb9, 0x48, 0xc0, 0xad, 0xc0, 0xb9, 0x27, - 0xc3, 0xb9, 0xad, 0x45, 0x18, 0xa9, 0xd9, 0xdb, 0x74, 0xd8, 0xf6, 0xb6, 0x1c, 0xb6, 0xbd, 0x6d, - 0xfd, 0xdb, 0x2c, 0x94, 0x6b, 0xc7, 0x4e, 0xe7, 0x88, 0x5d, 0x12, 0x47, 0xe6, 0xaa, 0x72, 0xeb, - 0x7c, 0xde, 0x23, 0xd5, 0x0a, 0x4c, 0xee, 0xe0, 0x17, 0x22, 0x14, 0x9d, 0x07, 0x75, 0xd3, 0x6b, - 0x00, 0x72, 0xdc, 0xe9, 0xf2, 0x72, 0x5b, 0x6d, 0x84, 0xfe, 0xc2, 0xab, 0x3b, 0x97, 0x58, 0x16, - 0x84, 0xe8, 0x24, 0xc5, 0x6a, 0xd3, 0x8e, 0x54, 0x86, 0x2e, 0x92, 0x67, 0xc0, 0xd1, 0x8b, 0x9f, - 0x01, 0xad, 0x7f, 0x95, 0x81, 0x1b, 0x66, 0x0e, 0xf2, 0x9e, 0xd6, 0xb4, 0x84, 0x14, 0x03, 0xae, - 0xca, 0xe9, 0xb9, 0x57, 0x49, 0x48, 0x11, 0x4f, 0x42, 0x61, 0xe3, 0xa6, 0xf7, 0x1c, 0xfb, 0x2f, - 0x63, 0xce, 0x7a, 0x51, 0x5c, 0x23, 0xfb, 0x96, 0x48, 0xe7, 0xc3, 0x8a, 0xb4, 0x37, 0xa8, 0xbc, - 0xcc, 0xfa, 0x8f, 0x19, 0xb8, 0x46, 0xf7, 0x5a, 0xee, 0xca, 0x14, 0x15, 0x17, 0x0f, 0xd1, 0xf8, - 0x10, 0xa6, 0xd4, 0xce, 0xf9, 0xac, 0xd3, 0x17, 0xec, 0x82, 0x82, 0x46, 0xd3, 0x6b, 0x61, 0x5b, - 0x6b, 0x86, 0xb6, 0x60, 0x92, 0x7f, 0x2b, 0xfe, 0xaa, 0x05, 0x25, 0xbd, 0x0d, 0x15, 0x2a, 0xe6, - 0x7e, 0xa2, 0x22, 0xc4, 0x91, 0x35, 0xe8, 0x1b, 0x05, 0x15, 0xd6, 0xfa, 0x55, 0x16, 0x96, 0x0e, - 0xb0, 0xef, 0x3e, 0x7b, 0x69, 0x18, 0xcc, 0x13, 0x98, 0x17, 0x45, 0x74, 0xcc, 0xba, 0x30, 0xb3, - 0xb7, 0x84, 0x82, 0xd4, 0x80, 0x34, 0x68, 0x48, 0xd9, 0x4e, 0x05, 0xbc, 0xc0, 0xeb, 0xda, 0x0f, - 0x20, 0x27, 0xd7, 0xc3, 0x08, 0xe5, 0x0c, 0x9d, 0x1b, 0xb1, 0x16, 0xf4, 0x44, 0x03, 0x72, 0x51, - 0xfc, 0x9e, 0xf9, 0x4e, 0x84, 0x1f, 0x9b, 0x86, 0x9c, 0x68, 0xd9, 0xd2, 0x20, 0xcb, 0xc2, 0x51, - 0x6a, 0x53, 0x96, 0xc6, 0xe6, 0x25, 0xdb, 0xd4, 0x53, 0x75, 0x12, 0xf2, 0x15, 0x7a, 0x63, 0x43, - 0x4e, 0x29, 0xff, 0x3b, 0x0b, 0xcb, 0x22, 0x6a, 0xd3, 0xc0, 0xe6, 0x6f, 0x61, 0x51, 0x14, 0x55, - 0xba, 0x5d, 0xdf, 0x7b, 0x8e, 0x5b, 0x3a, 0xa7, 0xd9, 0x7b, 0x5e, 0xc1, 0x69, 0x87, 0xb7, 0x89, - 0x98, 0x6d, 0x02, 0x7f, 0x33, 0xbe, 0x9a, 0xaf, 0x74, 0xed, 0xc4, 0x66, 0x83, 0x7a, 0x36, 0x55, - 0xed, 0xa4, 0x67, 0x62, 0x52, 0x35, 0x55, 0x2b, 0xe1, 0xeb, 0x19, 0x7d, 0x5d, 0x5f, 0x0f, 0x39, - 0xdf, 0xea, 0x38, 0xab, 0x33, 0x30, 0xb5, 0x83, 0x5f, 0x44, 0x7c, 0xff, 0xfd, 0x0c, 0x4c, 0x6b, - 0x8b, 0x1b, 0xbd, 0x03, 0x63, 0xf4, 0x0f, 0xba, 0xf3, 0xf2, 0x47, 0x4d, 0x64, 0x81, 0x69, 0x8f, - 0x9a, 0x58, 0xd3, 0x2d, 0x98, 0x60, 0x11, 0x4a, 0xad, 0x73, 0x1c, 0x44, 0x64, 0x00, 0x5c, 0x93, - 0x81, 0xb0, 0x33, 0x09, 0x87, 0xb7, 0x1e, 0xc1, 0x4d, 0x1e, 0xec, 0xa4, 0x4f, 0x7e, 0x4d, 0x3d, - 0x04, 0x9c, 0x73, 0xa3, 0xb0, 0x1c, 0x58, 0xde, 0xc0, 0x71, 0xd5, 0xa3, 0x05, 0x08, 0x7e, 0x0d, - 0x97, 0xb5, 0x72, 0x89, 0x91, 0x3e, 0x7c, 0x90, 0x32, 0x24, 0x51, 0xc7, 0x5b, 0x5b, 0x37, 0xd2, - 0xba, 0x50, 0x89, 0xb5, 0x30, 0x5c, 0xa6, 0xc7, 0x6d, 0x79, 0x6d, 0x15, 0x5c, 0x40, 0xeb, 0xdd, - 0x51, 0xd6, 0x35, 0xd3, 0x78, 0xec, 0xcd, 0xac, 0xd8, 0xe3, 0x64, 0xad, 0x35, 0x0d, 0x93, 0x35, - 0xaf, 0x13, 0xe2, 0x1f, 0xe9, 0xab, 0x15, 0x6b, 0x06, 0xa6, 0x44, 0x55, 0x1b, 0x07, 0x81, 0xf5, - 0x8f, 0x46, 0xc0, 0xe2, 0x8c, 0x4d, 0x73, 0x15, 0x09, 0x7e, 0x1c, 0x26, 0x88, 0xe5, 0x9b, 0xc8, - 0x15, 0xd5, 0x21, 0x16, 0xd5, 0x32, 0xc9, 0xa3, 0xaf, 0x8c, 0x9a, 0x51, 0xa9, 0x26, 0x79, 0x89, - 0xd1, 0xff, 0xcc, 0xa0, 0x26, 0xd9, 0x62, 0xa3, 0x79, 0x5e, 0x0c, 0x6a, 0x52, 0xc3, 0x9b, 0xae, - 0x32, 0x6d, 0x8d, 0x0d, 0x7c, 0x73, 0x47, 0x32, 0xba, 0x5e, 0xd6, 0xf0, 0xdc, 0x68, 0xac, 0xa0, - 0x91, 0xc8, 0x6d, 0xa6, 0x22, 0x41, 0xfb, 0x3a, 0x2f, 0xf9, 0x7a, 0x14, 0xd7, 0xc4, 0x6a, 0x15, - 0xc3, 0xda, 0x55, 0x4a, 0xf4, 0x54, 0x71, 0x5a, 0x5b, 0xc5, 0xfd, 0xf7, 0xf7, 0x32, 0x70, 0x8d, - 0xcd, 0xce, 0xae, 0xef, 0x3e, 0x77, 0xdb, 0xf8, 0x08, 0x6b, 0x62, 0xda, 0x4b, 0xbf, 0x6e, 0xcb, - 0x9c, 0x4b, 0x47, 0xd3, 0xec, 0x1a, 0x98, 0x83, 0x9b, 0xbc, 0xc1, 0x69, 0xf8, 0xad, 0x7e, 0x06, - 0x96, 0xc5, 0xe3, 0xbf, 0xd8, 0x1d, 0xd4, 0x45, 0x6d, 0xb6, 0xaa, 0x76, 0x6d, 0x94, 0x35, 0x5c, - 0x1b, 0x69, 0xee, 0xf8, 0x70, 0xc8, 0x3d, 0xd2, 0xc8, 0x6b, 0xdf, 0x23, 0x59, 0xbf, 0x1c, 0x81, - 0xd9, 0x5d, 0xe7, 0xc8, 0xed, 0x10, 0xdd, 0x23, 0x12, 0xde, 0xa0, 0x4a, 0x22, 0x6f, 0xd8, 0xe0, - 0x30, 0xa9, 0x94, 0xc4, 0x60, 0x2b, 0x6a, 0x0a, 0x9f, 0xac, 0x29, 0x14, 0x5f, 0x4f, 0xd4, 0xf3, - 0xa9, 0xe6, 0xe2, 0x4c, 0x44, 0xca, 0xd1, 0x58, 0x94, 0x8e, 0xd7, 0x8a, 0xe5, 0xd2, 0xa3, 0x6e, - 0xc2, 0x27, 0x30, 0xa9, 0x84, 0xbb, 0x71, 0x01, 0x4d, 0x60, 0xa0, 0x6c, 0x39, 0xe9, 0x1d, 0xe2, - 0xd4, 0xbc, 0x49, 0x2a, 0x86, 0x94, 0x6c, 0x49, 0x63, 0x6f, 0x38, 0x5b, 0xd2, 0x77, 0x8c, 0x64, - 0xe1, 0x30, 0x1e, 0xe7, 0xfb, 0x06, 0x43, 0x9f, 0xf0, 0x1a, 0x1f, 0xac, 0x2a, 0xd4, 0xa7, 0xa5, - 0x7e, 0x53, 0x91, 0x55, 0x01, 0x72, 0x22, 0xc9, 0xa4, 0xf5, 0x3f, 0xc7, 0x61, 0x7e, 0xdb, 0x0d, - 0x42, 0x31, 0xbb, 0x41, 0xa4, 0xfa, 0xa7, 0x44, 0x99, 0x72, 0x08, 0xe2, 0x56, 0x1a, 0x2b, 0x6f, - 0xc4, 0x72, 0x5e, 0x6a, 0x00, 0xe8, 0x43, 0xd5, 0x15, 0x95, 0x55, 0x32, 0x61, 0x24, 0xd3, 0x15, - 0xaa, 0x3e, 0xaa, 0x77, 0x34, 0xaf, 0x1b, 0xdb, 0x57, 0xdb, 0xa4, 0x40, 0xdd, 0x57, 0x99, 0xe3, - 0x6a, 0x35, 0xee, 0x8a, 0x63, 0x1d, 0x30, 0xa5, 0x78, 0x82, 0x35, 0x93, 0x5b, 0x7a, 0xb4, 0xf6, - 0xa5, 0x47, 0x6b, 0x8c, 0x1e, 0x99, 0x7f, 0xa2, 0x78, 0xb4, 0xe2, 0x4c, 0x50, 0xbd, 0x5a, 0xec, - 0xed, 0x75, 0x9b, 0x16, 0xa8, 0x6f, 0xaf, 0x59, 0x13, 0xb4, 0x07, 0x73, 0xbb, 0x3e, 0x6e, 0x51, - 0xd5, 0xb2, 0xfe, 0x63, 0xd7, 0xe7, 0x47, 0x0c, 0xea, 0x17, 0x65, 0x69, 0xc1, 0xba, 0xa2, 0xba, - 0x81, 0x65, 0xbd, 0xaa, 0x61, 0x52, 0xc0, 0xd1, 0x3a, 0xcc, 0xd4, 0xb1, 0xe3, 0x37, 0x8f, 0x1f, - 0xe1, 0x97, 0x44, 0x31, 0x06, 0xc5, 0x89, 0x28, 0x95, 0x4a, 0x40, 0x6b, 0xc8, 0x40, 0x69, 0x95, - 0x7a, 0x77, 0xa5, 0x03, 0xa1, 0x9f, 0xc2, 0x78, 0xdd, 0xf3, 0xc3, 0xea, 0xcb, 0x58, 0xfe, 0x4a, - 0x56, 0x58, 0xbd, 0x2a, 0xd2, 0xc9, 0x04, 0x9e, 0x1f, 0x36, 0x0e, 0x55, 0xbe, 0x71, 0x38, 0xf4, - 0x80, 0x58, 0x5d, 0xc4, 0x12, 0x0c, 0x9d, 0x76, 0x8d, 0xc6, 0x60, 0xb0, 0xd7, 0x73, 0xdc, 0xb2, - 0xa2, 0xe6, 0x63, 0xe8, 0xb4, 0x1b, 0x74, 0x9f, 0xd7, 0x6f, 0xd1, 0x54, 0x28, 0xf4, 0x12, 0xe6, - 0x75, 0x41, 0xe7, 0xc9, 0xa6, 0x40, 0xcb, 0x04, 0x97, 0xd6, 0xa4, 0x7a, 0x87, 0x53, 0x79, 0x23, - 0x9e, 0xe5, 0x2c, 0x91, 0x7f, 0x2a, 0xb5, 0x0b, 0xf4, 0x98, 0x66, 0xf3, 0x61, 0x9c, 0xa9, 0x04, - 0x2c, 0xa8, 0x8b, 0x3d, 0xd9, 0xbb, 0x79, 0xd6, 0x2f, 0x5f, 0xef, 0xd1, 0x94, 0x86, 0x94, 0xa3, - 0x0e, 0x8b, 0x37, 0x57, 0x39, 0x9a, 0x00, 0x7d, 0x1d, 0xe7, 0xe6, 0x1f, 0x67, 0x60, 0x21, 0x26, - 0x6e, 0xfc, 0x7c, 0xfa, 0x04, 0xf2, 0xb2, 0x90, 0xbb, 0x74, 0x8a, 0x72, 0x1f, 0x8d, 0xe9, 0x61, - 0x26, 0xec, 0x62, 0x2d, 0xaa, 0xc4, 0x46, 0x38, 0xd0, 0xfd, 0x98, 0x1f, 0x94, 0x9d, 0x7b, 0x3a, - 0x64, 0x53, 0xd7, 0x17, 0x88, 0x68, 0x86, 0x3e, 0x05, 0x50, 0x66, 0x99, 0x2d, 0x42, 0x1a, 0x71, - 0x99, 0x3e, 0xc1, 0x4a, 0x63, 0xeb, 0x4f, 0xc7, 0xc5, 0x36, 0xcd, 0x4f, 0xca, 0x7b, 0xbe, 0xd3, - 0x3c, 0x89, 0x42, 0x5f, 0x3f, 0x4c, 0xc6, 0x99, 0x9e, 0x47, 0x23, 0xdc, 0xd6, 0x5e, 0xc8, 0x9b, - 0x93, 0xed, 0x46, 0xc9, 0x12, 0x46, 0xce, 0x91, 0x2c, 0xe1, 0x1e, 0x4c, 0x6c, 0x75, 0x9e, 0xbb, - 0xc4, 0x28, 0x67, 0x81, 0x92, 0xd4, 0xa4, 0x75, 0x59, 0x91, 0xca, 0x18, 0xde, 0x0a, 0x7d, 0x0a, - 0xb9, 0x4d, 0x2f, 0x08, 0x3b, 0x22, 0x48, 0x92, 0xaf, 0xc2, 0x90, 0xfa, 0x85, 0x1b, 0xc7, 0xbc, - 0x4a, 0xd5, 0x39, 0xa2, 0x39, 0xfa, 0x08, 0x26, 0x2a, 0xad, 0x16, 0x59, 0xd4, 0x5c, 0x21, 0xd0, - 0x4c, 0x9d, 0x1c, 0xd2, 0x61, 0x35, 0x6a, 0x97, 0xbc, 0x31, 0xfa, 0x42, 0x77, 0xd2, 0x4e, 0x44, - 0xa9, 0x44, 0xd2, 0xb3, 0xd6, 0xea, 0x0e, 0xdc, 0x77, 0xc4, 0xe5, 0x58, 0x2e, 0x4a, 0xce, 0x42, - 0x13, 0xad, 0x68, 0x9a, 0x94, 0xde, 0xad, 0x6d, 0x41, 0x7e, 0xab, 0xe3, 0x86, 0x2e, 0x4d, 0x4f, - 0x91, 0xd7, 0xf6, 0xe3, 0x5d, 0xc7, 0x0f, 0xdd, 0xa6, 0xdb, 0x75, 0x3a, 0x21, 0x9b, 0x2d, 0x57, - 0x34, 0x54, 0x67, 0x4b, 0x42, 0xab, 0x89, 0xac, 0xe0, 0x8d, 0x25, 0xb2, 0x4a, 0xcd, 0x05, 0x35, - 0xf9, 0xea, 0xb9, 0xa0, 0x56, 0xd9, 0x5c, 0x52, 0x1b, 0x78, 0x2a, 0x12, 0x44, 0xea, 0xbb, 0xd4, - 0x8d, 0x5d, 0x5b, 0x36, 0x44, 0x37, 0x68, 0x3a, 0x8a, 0xe9, 0x28, 0x7c, 0x59, 0xbb, 0x8c, 0xcf, - 0x6e, 0xad, 0xa1, 0x06, 0x4c, 0x91, 0xd6, 0xbb, 0x5e, 0xdb, 0x6d, 0xba, 0x38, 0x28, 0xce, 0x68, - 0xce, 0x6e, 0x7d, 0x51, 0xd0, 0x46, 0x2f, 0xeb, 0x38, 0x64, 0x7b, 0x2a, 0xed, 0xba, 0xcb, 0x01, - 0xd5, 0x3d, 0x55, 0x45, 0x68, 0xd9, 0x50, 0x8c, 0x6e, 0xcc, 0x62, 0xab, 0xeb, 0xa3, 0xe4, 0xa3, - 0x14, 0x9a, 0x02, 0x31, 0x7a, 0x94, 0xa2, 0x4e, 0x58, 0xf4, 0x3c, 0x65, 0x1f, 0xae, 0xd9, 0xf8, - 0xd4, 0x7b, 0x8e, 0xdf, 0x2c, 0xda, 0x9f, 0xc1, 0x55, 0x1d, 0xe1, 0x7e, 0xb7, 0x45, 0x1f, 0xb9, - 0xb2, 0xab, 0xb9, 0xd4, 0x24, 0x2a, 0x1c, 0x80, 0x25, 0x51, 0x61, 0x2f, 0xf3, 0xc9, 0x9f, 0xaa, - 0xbc, 0xd2, 0x3a, 0xcb, 0x83, 0x25, 0x1d, 0x79, 0xa5, 0xd5, 0x52, 0x04, 0x95, 0x18, 0x7c, 0xca, - 0x67, 0xcc, 0xc2, 0x54, 0x25, 0x9a, 0x6a, 0xb6, 0x6e, 0x54, 0xa0, 0xae, 0x25, 0xa5, 0x9d, 0x85, - 0xa1, 0x1c, 0x67, 0x0f, 0x61, 0x99, 0xda, 0x67, 0x15, 0xa6, 0x95, 0x4f, 0x79, 0x60, 0xa3, 0x4b, - 0x5d, 0xe9, 0x41, 0x67, 0x98, 0x0e, 0x62, 0x35, 0xa1, 0x94, 0xc6, 0x34, 0xba, 0x0c, 0x5e, 0xa2, - 0xf5, 0x68, 0x69, 0x0d, 0xbf, 0x12, 0xbd, 0x6c, 0x7c, 0x44, 0xf7, 0x77, 0x46, 0xe1, 0x1a, 0x9f, - 0x8c, 0x37, 0x39, 0xe3, 0xe8, 0x07, 0x98, 0x54, 0xe6, 0x98, 0x33, 0xfd, 0x86, 0x88, 0xa2, 0x30, - 0xc9, 0x02, 0xd3, 0x67, 0x3d, 0x5a, 0xd0, 0x88, 0x4d, 0x37, 0x31, 0x5c, 0x55, 0xb1, 0x69, 0xc3, - 0x8c, 0x3e, 0xd1, 0xfc, 0x30, 0x70, 0x2b, 0xb5, 0x13, 0xbd, 0xa9, 0x48, 0x27, 0xd0, 0x6a, 0xa4, - 0x4e, 0x37, 0xcd, 0x59, 0xab, 0x0b, 0xd1, 0x8f, 0x30, 0x9b, 0x98, 0x65, 0x7e, 0x76, 0xb8, 0x9d, - 0xda, 0x61, 0xa2, 0x35, 0x53, 0x4e, 0x3e, 0x2d, 0x36, 0x76, 0x9b, 0xec, 0x04, 0xb5, 0x60, 0x4a, - 0x9d, 0x78, 0x7e, 0xb8, 0xb8, 0x39, 0x80, 0x95, 0xac, 0x21, 0x53, 0x25, 0x9c, 0x97, 0x74, 0xee, - 0xf5, 0x34, 0xef, 0x1a, 0xd6, 0x6a, 0x0e, 0xc6, 0xd9, 0x37, 0x51, 0x01, 0xbb, 0x3e, 0x0e, 0x70, - 0xa7, 0x89, 0xd5, 0x80, 0x98, 0xd7, 0x55, 0x01, 0xff, 0x21, 0x03, 0xc5, 0x34, 0xbc, 0x75, 0xdc, - 0x69, 0xa1, 0x5d, 0x28, 0xc4, 0x3b, 0xe2, 0x52, 0x6d, 0x09, 0x8b, 0xc7, 0x4c, 0xd2, 0xe6, 0x25, - 0x3b, 0x01, 0x4d, 0x36, 0x09, 0xa5, 0xec, 0x82, 0x91, 0x47, 0x49, 0x50, 0xc5, 0x01, 0xf1, 0xee, - 0xbb, 0x90, 0x97, 0xe9, 0xfe, 0x51, 0x0e, 0x46, 0xb7, 0x76, 0xb6, 0xf6, 0x58, 0xfa, 0xb8, 0xdd, - 0xfd, 0xbd, 0x42, 0x06, 0x01, 0x8c, 0xaf, 0xad, 0x6f, 0xaf, 0xef, 0xad, 0x17, 0xb2, 0xef, 0x36, - 0xd4, 0xa3, 0x3c, 0xba, 0x06, 0x8b, 0x6b, 0xeb, 0x07, 0x5b, 0xb5, 0xf5, 0xc6, 0xde, 0x9f, 0xdb, - 0x5d, 0x6f, 0xe8, 0xcf, 0x1f, 0xe6, 0xa1, 0xa0, 0x56, 0xee, 0x3d, 0xd9, 0xdb, 0x2d, 0x64, 0x50, - 0x11, 0xe6, 0xd5, 0xd2, 0xa7, 0xeb, 0xd5, 0xca, 0xfe, 0xde, 0xe6, 0x4e, 0x61, 0xc4, 0x1a, 0xcd, - 0x65, 0x0b, 0xd9, 0x77, 0x7f, 0xd0, 0xce, 0xf9, 0x68, 0x09, 0x8a, 0xbc, 0xf9, 0x7e, 0xbd, 0xb2, - 0x61, 0xee, 0x82, 0xd5, 0x3e, 0x7e, 0x50, 0x29, 0x64, 0xd0, 0x75, 0xb8, 0xaa, 0x95, 0xee, 0x56, - 0xea, 0xf5, 0xa7, 0x4f, 0xec, 0xb5, 0xed, 0xf5, 0x7a, 0xbd, 0x90, 0x7d, 0xf7, 0x36, 0x8f, 0x63, - 0x40, 0x33, 0x00, 0x6b, 0xeb, 0xf5, 0xda, 0xfa, 0xce, 0xda, 0xd6, 0xce, 0x46, 0xe1, 0x12, 0x9a, - 0x86, 0x7c, 0x45, 0x7e, 0x66, 0x56, 0x7e, 0xcf, 0x81, 0x49, 0xc2, 0x4f, 0x71, 0x2c, 0x6e, 0xc0, - 0xe2, 0x63, 0xc7, 0xed, 0x84, 0x8e, 0xdb, 0xe1, 0x52, 0x20, 0xe6, 0x10, 0x95, 0x07, 0x4c, 0x2a, - 0x91, 0x87, 0xd2, 0xb0, 0x68, 0xad, 0x3b, 0x99, 0xfb, 0x19, 0x54, 0x87, 0xf9, 0x34, 0x03, 0x13, - 0x59, 0x7a, 0x5e, 0x8a, 0x34, 0xb5, 0x56, 0x5a, 0x4c, 0xdd, 0x86, 0x0f, 0xde, 0x47, 0x8f, 0x61, - 0x36, 0xb1, 0xa9, 0x4a, 0x7a, 0x4d, 0xdb, 0xed, 0x20, 0x74, 0x45, 0xea, 0xf2, 0x0c, 0xdd, 0xf8, - 0x96, 0x1a, 0xa0, 0x2b, 0x09, 0x85, 0xbd, 0x4e, 0x16, 0x8d, 0x11, 0xd9, 0xfd, 0x0c, 0xb2, 0x61, - 0x3e, 0x6d, 0x7b, 0x96, 0x43, 0x1e, 0xb0, 0x77, 0x97, 0x0c, 0xdd, 0x11, 0x9c, 0x69, 0x1b, 0x80, - 0xc4, 0x39, 0x60, 0x77, 0x30, 0xe2, 0xfc, 0x82, 0x1c, 0x55, 0x3b, 0xad, 0x47, 0x18, 0x77, 0x2b, - 0x6d, 0xf7, 0x39, 0x0e, 0x90, 0x88, 0x35, 0x94, 0x45, 0x26, 0xd8, 0x3b, 0x19, 0xf4, 0x5b, 0x30, - 0x49, 0x33, 0x0c, 0xf3, 0xd0, 0x98, 0x29, 0x35, 0xeb, 0x70, 0x49, 0x7c, 0xd1, 0xca, 0xfb, 0x19, - 0xf4, 0x25, 0x4c, 0x6c, 0x60, 0x1a, 0x1b, 0x82, 0x6e, 0xc6, 0x7e, 0x48, 0x63, 0xab, 0x23, 0xcf, - 0x0d, 0x82, 0xe0, 0xb8, 0x9f, 0x07, 0xd5, 0x20, 0xc7, 0xc1, 0x03, 0x64, 0xc5, 0xe0, 0x83, 0x14, - 0x04, 0x73, 0x31, 0x04, 0xe4, 0xe8, 0x86, 0x6a, 0x90, 0x97, 0x01, 0x2a, 0x68, 0xd1, 0x10, 0x15, - 0x53, 0x2a, 0x26, 0x2b, 0xb8, 0xef, 0x70, 0xe4, 0x6f, 0x66, 0x33, 0xe8, 0x1e, 0x00, 0x7b, 0x87, - 0x48, 0xc7, 0x12, 0x27, 0xb4, 0x94, 0x60, 0x20, 0xda, 0x20, 0xba, 0xa5, 0x8d, 0x43, 0x7c, 0xde, - 0xc1, 0x9b, 0x66, 0x6b, 0x1b, 0x66, 0xe4, 0xab, 0xc0, 0xf3, 0x73, 0xc2, 0x84, 0xed, 0x33, 0xb2, - 0x82, 0xd8, 0xb3, 0x7c, 0x19, 0x11, 0x8a, 0x4c, 0x31, 0xa2, 0x72, 0x3a, 0x59, 0x33, 0x05, 0x56, - 0xa6, 0x6f, 0x96, 0xb0, 0xf1, 0x84, 0xce, 0x31, 0x58, 0x0c, 0x25, 0xb5, 0x5f, 0x3d, 0x3a, 0x14, - 0xdd, 0x50, 0x08, 0x48, 0x0d, 0x6a, 0x2d, 0xdd, 0x1c, 0xd0, 0x82, 0xcd, 0x13, 0xd5, 0x3a, 0x0f, - 0x61, 0x5a, 0x8b, 0x27, 0x44, 0xe2, 0x61, 0x42, 0x5a, 0xc0, 0x67, 0x69, 0x29, 0xbd, 0x92, 0x9f, - 0xf0, 0x1f, 0x50, 0x65, 0x13, 0x4b, 0x97, 0x58, 0x4a, 0x4b, 0x8b, 0xc8, 0xdc, 0x16, 0x25, 0x91, - 0xfa, 0x26, 0x06, 0xb2, 0x0e, 0x73, 0xf2, 0x22, 0x48, 0xf9, 0x0d, 0x0a, 0x43, 0x82, 0x45, 0xe3, - 0xcc, 0x7d, 0x0d, 0x73, 0x5c, 0x0e, 0x34, 0x34, 0x05, 0xa9, 0x5c, 0x78, 0x2e, 0x3e, 0x23, 0x82, - 0x87, 0xb0, 0x50, 0x8f, 0x8d, 0x87, 0xd9, 0x6a, 0x57, 0x75, 0x14, 0x4a, 0x6a, 0x45, 0x23, 0xae, - 0x47, 0x80, 0xea, 0xbd, 0xc3, 0x53, 0x57, 0xa2, 0x7b, 0xee, 0xe2, 0x17, 0xe8, 0x7a, 0x6c, 0x48, - 0xa4, 0x90, 0x36, 0xa3, 0xda, 0xa9, 0x64, 0x18, 0x31, 0xda, 0x63, 0x79, 0x1a, 0x58, 0xce, 0x29, - 0xa7, 0xeb, 0x1c, 0xba, 0x6d, 0x37, 0x74, 0x31, 0x11, 0x0b, 0x15, 0x40, 0xad, 0x12, 0x33, 0x78, - 0xd5, 0xd8, 0x02, 0x7d, 0x05, 0xd3, 0x1b, 0x38, 0x8c, 0xb2, 0x47, 0xa2, 0xc5, 0x44, 0xbe, 0x49, - 0x3e, 0x6f, 0x22, 0x24, 0x40, 0x4f, 0x59, 0xb9, 0x05, 0x05, 0xa6, 0x5c, 0x15, 0x14, 0xd7, 0x13, - 0x28, 0x78, 0x13, 0xc7, 0x77, 0x4e, 0x03, 0x23, 0xb7, 0xee, 0xc1, 0xe8, 0xae, 0xdb, 0x39, 0x42, - 0xc2, 0xc3, 0xaf, 0x64, 0x5f, 0x2b, 0xcd, 0x69, 0x65, 0x5c, 0xf4, 0x0e, 0xa1, 0xcc, 0xd2, 0x26, - 0x26, 0x53, 0x15, 0x8a, 0xdc, 0xf0, 0x6f, 0xc9, 0x30, 0xe0, 0x01, 0xe9, 0x15, 0x25, 0x7f, 0xe2, - 0xf5, 0x07, 0xab, 0x68, 0x97, 0x72, 0x3d, 0xd9, 0x01, 0xba, 0x15, 0xed, 0xa7, 0xc6, 0x4c, 0x89, - 0x25, 0x14, 0x47, 0x7c, 0xb0, 0x8a, 0x64, 0x7a, 0x87, 0x14, 0xa4, 0xb7, 0xb5, 0x6d, 0xff, 0x62, - 0x78, 0xbf, 0x82, 0xbc, 0x4c, 0x13, 0x28, 0xf5, 0x4d, 0x3c, 0xb7, 0xa1, 0x54, 0xe0, 0xc9, 0x8c, - 0x82, 0x5f, 0xb0, 0x8c, 0x9e, 0x3a, 0x7c, 0x3c, 0x93, 0x9e, 0x71, 0xf2, 0x3e, 0x85, 0x49, 0x25, - 0x87, 0x9e, 0x5c, 0x2c, 0xc9, 0xbc, 0x7a, 0x25, 0xfd, 0xb7, 0x86, 0xee, 0x93, 0x4d, 0x63, 0x82, - 0x27, 0x6d, 0x45, 0x0b, 0x11, 0x98, 0x92, 0x42, 0x2c, 0x06, 0x82, 0x56, 0xe9, 0x7e, 0xc7, 0x3a, - 0xba, 0xa2, 0x43, 0x98, 0x7b, 0x59, 0x05, 0x60, 0x63, 0xa6, 0x1d, 0xe9, 0xd5, 0xc6, 0x51, 0xad, - 0x92, 0xfd, 0xac, 0x75, 0x41, 0xa0, 0xaf, 0xc4, 0x9e, 0x46, 0x81, 0x8a, 0x1a, 0x27, 0xd5, 0x51, - 0x99, 0xe0, 0xb7, 0xa0, 0x50, 0x69, 0x52, 0x2d, 0x2b, 0xb3, 0x9a, 0xa1, 0x65, 0xb9, 0x82, 0xf5, - 0x0a, 0x81, 0x6b, 0x21, 0x9e, 0x24, 0x6d, 0x1b, 0x3b, 0x34, 0x50, 0x71, 0x51, 0xee, 0xb5, 0xb1, - 0xaa, 0x74, 0x08, 0x23, 0x51, 0xeb, 0x30, 0x5f, 0x73, 0x3a, 0x4d, 0xdc, 0x7e, 0x3d, 0x34, 0x9f, - 0x51, 0x75, 0xa3, 0x64, 0x7c, 0xbb, 0x12, 0x87, 0xe7, 0xda, 0x66, 0x56, 0x9e, 0x0d, 0x65, 0xd3, - 0x0a, 0x5c, 0x66, 0x4c, 0x8c, 0xd8, 0x62, 0x82, 0x36, 0x75, 0xff, 0x31, 0xcc, 0xac, 0x13, 0x75, - 0xdc, 0x6b, 0xb9, 0x2c, 0xa6, 0x1d, 0xe9, 0x41, 0xca, 0x46, 0xc0, 0x4d, 0x91, 0x83, 0x53, 0x49, - 0x85, 0x26, 0x85, 0x3c, 0x99, 0x6d, 0xae, 0x34, 0x2f, 0xd0, 0xaa, 0x59, 0xd3, 0xe8, 0xde, 0x7b, - 0x24, 0xd2, 0xed, 0xc4, 0x12, 0x5c, 0xa9, 0x0a, 0xc5, 0x98, 0xfe, 0xaa, 0xf4, 0xd6, 0xe0, 0x46, - 0xaa, 0x2d, 0x66, 0xc3, 0xa2, 0x21, 0x79, 0x18, 0x7a, 0x5b, 0x9a, 0xc5, 0x83, 0x92, 0x8b, 0xa5, - 0x98, 0x6b, 0xdf, 0x2a, 0x29, 0x64, 0x0c, 0x38, 0x07, 0x67, 0x15, 0x33, 0x32, 0x58, 0xc6, 0x6d, - 0xa6, 0x66, 0xff, 0x42, 0xef, 0xe8, 0xd8, 0x07, 0x64, 0x08, 0x33, 0xf6, 0xf0, 0x84, 0x8a, 0x5e, - 0x94, 0x7c, 0x4a, 0x1a, 0x3d, 0x69, 0x19, 0xc2, 0xa4, 0xd1, 0x93, 0x9a, 0xba, 0x8b, 0x31, 0x78, - 0x03, 0x2e, 0xc7, 0xf2, 0x70, 0xa1, 0xeb, 0x71, 0xc6, 0x0e, 0x61, 0x28, 0x43, 0xf4, 0x58, 0x08, - 0x76, 0x12, 0x51, 0x7a, 0x66, 0x2e, 0xd3, 0x18, 0x19, 0xba, 0x7d, 0x69, 0x02, 0xa9, 0xb9, 0xb6, - 0xd0, 0xcd, 0x14, 0x16, 0x9e, 0x8f, 0x75, 0x0c, 0x6d, 0x1d, 0x0a, 0xf1, 0x54, 0x55, 0x68, 0x59, - 0x72, 0x29, 0x35, 0x1f, 0x57, 0xa9, 0x6c, 0xac, 0xe7, 0x9b, 0xce, 0xc3, 0x68, 0x52, 0xd8, 0x05, - 0x61, 0x7c, 0x52, 0xd4, 0x34, 0x45, 0x89, 0x49, 0xd1, 0x73, 0x06, 0x6d, 0xd0, 0x68, 0x73, 0x25, - 0x1f, 0x91, 0xf1, 0x74, 0x7a, 0x3d, 0x0d, 0x4f, 0x74, 0x69, 0x55, 0x17, 0x39, 0x81, 0x15, 0xba, - 0x96, 0xb5, 0x7d, 0x33, 0x49, 0x5a, 0xd9, 0x58, 0x2f, 0x47, 0x5a, 0x88, 0x67, 0x5f, 0x92, 0x48, - 0x0d, 0x69, 0x99, 0x8c, 0xa2, 0xfc, 0x00, 0xe6, 0xf5, 0x59, 0x1c, 0x32, 0x5e, 0x13, 0x9e, 0x3d, - 0x58, 0x48, 0x4d, 0xe4, 0x24, 0x75, 0xd1, 0xa0, 0x34, 0x4f, 0x03, 0x2c, 0xe8, 0x69, 0x2d, 0xff, - 0x12, 0x12, 0xb7, 0xa0, 0xb1, 0x54, 0x4f, 0x89, 0x39, 0x4d, 0xc9, 0x03, 0xc5, 0xe6, 0x54, 0xc9, - 0xe5, 0x74, 0x9e, 0x39, 0x4d, 0x4b, 0xfd, 0x24, 0xd9, 0xaf, 0xd0, 0x25, 0x36, 0xd5, 0x78, 0xc5, - 0x45, 0xd8, 0x7f, 0x1e, 0xd2, 0x4c, 0x78, 0xd6, 0xa8, 0xcd, 0x24, 0x7f, 0xc0, 0xed, 0xaa, 0xc6, - 0x26, 0x6d, 0x1d, 0x95, 0xb4, 0xc1, 0xe9, 0x4b, 0xa8, 0x06, 0x53, 0x6a, 0x2a, 0x29, 0x23, 0x15, - 0xd7, 0x92, 0x38, 0x02, 0xe5, 0x14, 0x37, 0x23, 0xb9, 0xc0, 0xa8, 0x59, 0x8a, 0x33, 0x47, 0x23, - 0xc8, 0x3c, 0x24, 0xa4, 0xb2, 0x66, 0x08, 0x49, 0x66, 0x63, 0x63, 0x8e, 0x99, 0x5d, 0xfa, 0xef, - 0xfb, 0x19, 0x7e, 0x26, 0xd0, 0x88, 0x66, 0x9f, 0xbe, 0x8c, 0x51, 0xf3, 0x42, 0x21, 0x45, 0x4a, - 0x52, 0xf2, 0x45, 0x95, 0x96, 0x4d, 0xd5, 0xaa, 0xde, 0xff, 0x06, 0x66, 0x13, 0xf9, 0xaf, 0xa4, - 0x7b, 0xcd, 0x94, 0x19, 0x6b, 0xb0, 0x6e, 0xdd, 0x24, 0x03, 0x8e, 0x01, 0x1e, 0xac, 0x0c, 0x47, - 0x9a, 0xdc, 0xa1, 0xb7, 0xc5, 0x63, 0x9a, 0x34, 0xe2, 0x4c, 0x59, 0xb6, 0x86, 0x2b, 0x88, 0x58, - 0x7e, 0xad, 0x98, 0x82, 0x48, 0xcf, 0xbe, 0x65, 0xc4, 0xfa, 0xbb, 0x34, 0xdf, 0x76, 0x2c, 0x77, - 0x93, 0xf4, 0x6e, 0x18, 0xf3, 0x75, 0x49, 0xef, 0x86, 0x39, 0x91, 0x16, 0xe3, 0xe6, 0x36, 0xcc, - 0xa7, 0x65, 0xc3, 0x52, 0xbc, 0x81, 0xc6, 0x54, 0x59, 0x29, 0x1c, 0xb5, 0xc5, 0x6a, 0x37, 0x60, - 0x1b, 0x90, 0x1b, 0xcb, 0xc8, 0x81, 0xef, 0x44, 0xc6, 0xb3, 0x64, 0x0e, 0x2b, 0x79, 0x06, 0x1c, - 0x92, 0xe4, 0x6a, 0x80, 0xa9, 0x7a, 0xb9, 0xee, 0x1e, 0x75, 0x94, 0x14, 0x51, 0xd2, 0x50, 0x4d, - 0xa6, 0xb9, 0x92, 0x9a, 0x25, 0x2d, 0xa3, 0xd4, 0x13, 0x98, 0x17, 0x1b, 0xb7, 0x9a, 0xca, 0x08, - 0x95, 0xcc, 0xb9, 0x94, 0xa4, 0x96, 0x49, 0xcd, 0x7d, 0xc4, 0x4e, 0x7a, 0xf4, 0x07, 0xc2, 0x94, - 0x93, 0x9e, 0x92, 0x63, 0xa8, 0xa4, 0xa7, 0x23, 0x42, 0x9f, 0xd3, 0x93, 0x1e, 0x4b, 0xc8, 0x69, - 0x76, 0x35, 0x6b, 0x98, 0x22, 0x9d, 0xb6, 0x2a, 0x9c, 0x91, 0xb4, 0x43, 0x1d, 0xf3, 0xf0, 0xc3, - 0x1b, 0x05, 0xd2, 0x0f, 0x6f, 0x2a, 0xa1, 0x66, 0x97, 0xcf, 0x94, 0xfa, 0xaa, 0x5e, 0xf2, 0x2a, - 0x25, 0xfd, 0x86, 0xe4, 0x55, 0x5a, 0x52, 0x0b, 0x7a, 0x56, 0xd8, 0x13, 0x86, 0x61, 0x84, 0xef, - 0xfa, 0xc0, 0xac, 0x14, 0xa5, 0xe5, 0xc1, 0xa9, 0x1c, 0xf8, 0x9d, 0x43, 0x21, 0xfe, 0xf0, 0x1f, - 0xa5, 0x25, 0x15, 0x51, 0xb2, 0x1f, 0x48, 0xf3, 0xc6, 0x98, 0x31, 0x60, 0x57, 0x18, 0x9d, 0x3a, - 0x5e, 0x43, 0x6a, 0x09, 0x15, 0xf5, 0x60, 0x33, 0x22, 0xca, 0x01, 0xa0, 0x9a, 0x86, 0x89, 0x1c, - 0x03, 0xaa, 0x19, 0x91, 0x92, 0x36, 0xc0, 0x15, 0x71, 0x3c, 0xe9, 0x89, 0xaa, 0xde, 0xd1, 0x8d, - 0xb7, 0x01, 0x01, 0xd3, 0x43, 0x6f, 0x75, 0xd0, 0xef, 0x88, 0xfc, 0xa4, 0xc9, 0x34, 0x2e, 0x6f, - 0xc7, 0xbc, 0x3b, 0xe9, 0x21, 0xb6, 0xa5, 0x41, 0x59, 0x62, 0xd0, 0x63, 0xfa, 0x16, 0xf3, 0xc9, - 0xd6, 0x5a, 0x8d, 0xff, 0x0c, 0xb0, 0xe7, 0x27, 0xdc, 0xe6, 0xca, 0x4f, 0xd9, 0x44, 0x4c, 0x66, - 0x4d, 0x34, 0xc0, 0x83, 0x55, 0x54, 0xa7, 0xde, 0x5b, 0xad, 0x34, 0xc5, 0x73, 0x9e, 0x82, 0xb0, - 0x94, 0x8e, 0x90, 0x5e, 0x25, 0xac, 0x8b, 0xdd, 0x4c, 0x27, 0xd3, 0x40, 0xc3, 0x20, 0x2b, 0x80, - 0x89, 0x4d, 0x3a, 0x1a, 0x41, 0xdd, 0x30, 0x39, 0x62, 0x1c, 0xab, 0x57, 0x1e, 0x6f, 0xbf, 0x12, - 0xc7, 0x34, 0xc0, 0x83, 0x15, 0xce, 0x31, 0xad, 0xf4, 0x62, 0x1c, 0x8b, 0x21, 0xd4, 0x39, 0xa6, - 0x93, 0x69, 0xa0, 0x61, 0x38, 0xc7, 0xd2, 0xd1, 0x9c, 0x97, 0x63, 0xdf, 0xd0, 0xfd, 0x79, 0x83, - 0xbe, 0x0c, 0xbc, 0x10, 0xcf, 0x8a, 0xc2, 0x82, 0xd5, 0x41, 0x0f, 0x56, 0xd1, 0x53, 0x9a, 0x3a, - 0x35, 0x56, 0x7e, 0x3e, 0xbe, 0x2d, 0x99, 0x90, 0x52, 0xce, 0x6d, 0xc1, 0x02, 0xe3, 0x5c, 0x9c, - 0x5c, 0x23, 0x2d, 0xc6, 0x61, 0x6f, 0x08, 0x63, 0x27, 0x8e, 0xea, 0xa2, 0xfc, 0x5b, 0xa3, 0x22, - 0xb2, 0xe7, 0x13, 0xfb, 0xb4, 0x95, 0x34, 0x5e, 0x75, 0x24, 0xc2, 0xdf, 0xae, 0x37, 0x3f, 0x58, - 0x41, 0x5b, 0x74, 0x16, 0xf4, 0xe2, 0x41, 0xd6, 0x7d, 0x3a, 0x1a, 0xca, 0xa4, 0x4d, 0x61, 0x10, - 0xc5, 0x68, 0x32, 0xf5, 0x6d, 0x26, 0x4a, 0x1e, 0x7d, 0xce, 0x39, 0x3a, 0x13, 0x8b, 0xd8, 0xc6, - 0xce, 0x4e, 0x1a, 0xc3, 0x38, 0x13, 0xff, 0x09, 0x7d, 0xf4, 0x53, 0xc8, 0x0b, 0xe0, 0xe1, 0x0c, - 0x89, 0x43, 0x53, 0x86, 0x7c, 0x05, 0x93, 0x9c, 0x21, 0x94, 0x02, 0x53, 0x4f, 0x46, 0xf2, 0xbf, - 0x84, 0x49, 0xce, 0x86, 0x81, 0x23, 0x30, 0x5f, 0x56, 0x2e, 0x6c, 0xe0, 0x30, 0xe5, 0x27, 0x9e, - 0x87, 0x0d, 0x26, 0xed, 0x17, 0xa5, 0xd1, 0x01, 0x7d, 0x53, 0x6d, 0xfa, 0x39, 0x6e, 0x13, 0xca, - 0xa1, 0x3f, 0x06, 0x4e, 0xf0, 0xd6, 0xcd, 0x78, 0x87, 0xc2, 0x1b, 0x47, 0xbf, 0x03, 0x4b, 0xf4, - 0x66, 0xe3, 0xa2, 0x14, 0x9b, 0x0f, 0x29, 0x57, 0xa3, 0xa0, 0x86, 0xf8, 0x2f, 0x81, 0x9b, 0x90, - 0x0d, 0xfb, 0x11, 0x72, 0x82, 0xb5, 0x6e, 0xc4, 0x3a, 0x0c, 0x7a, 0xc0, 0x66, 0x74, 0x8d, 0x8e, - 0xfd, 0x82, 0xd4, 0x0e, 0xd6, 0x34, 0xb1, 0x9f, 0x26, 0x1f, 0x16, 0x93, 0x11, 0xff, 0xf1, 0x73, - 0x82, 0xa5, 0x9e, 0xc0, 0x62, 0x6a, 0x3d, 0x68, 0xf3, 0xa1, 0x43, 0x3b, 0x27, 0x35, 0xe6, 0x2b, - 0x97, 0xbc, 0x4c, 0x38, 0x83, 0x14, 0xdb, 0x5e, 0x4b, 0xa7, 0x52, 0x9a, 0x56, 0x23, 0x28, 0x02, - 0x54, 0x61, 0x7b, 0xbc, 0x9a, 0x78, 0x45, 0xf1, 0x4d, 0xa6, 0x66, 0x64, 0x89, 0xa3, 0x60, 0x67, - 0x13, 0xfa, 0x7b, 0xe9, 0xca, 0xd9, 0x44, 0x49, 0x49, 0x51, 0xd2, 0x13, 0x46, 0x70, 0x15, 0x46, - 0xb3, 0x46, 0xa8, 0xb7, 0x50, 0x6a, 0x52, 0x0a, 0xf5, 0x6c, 0xa2, 0xa7, 0xcf, 0x90, 0x67, 0x13, - 0xda, 0xa1, 0x8e, 0x79, 0xf8, 0xd9, 0x84, 0x02, 0xe9, 0x67, 0x13, 0x95, 0x50, 0xf3, 0xc2, 0x43, - 0xc9, 0xfc, 0x19, 0xf2, 0xdc, 0x6d, 0x4c, 0xad, 0x31, 0xe0, 0xa2, 0x6a, 0x2e, 0x25, 0x53, 0x92, - 0xb4, 0xf9, 0xcd, 0x59, 0x94, 0x4a, 0xfa, 0xad, 0xcb, 0xfd, 0x0c, 0xda, 0xa1, 0x09, 0xcc, 0xd3, - 0x7e, 0x46, 0xde, 0x24, 0x3f, 0x03, 0x7f, 0xb7, 0x9e, 0xe0, 0xab, 0xa7, 0xe3, 0x1b, 0x08, 0x37, - 0xe0, 0x58, 0x77, 0x95, 0xc7, 0xa9, 0x5c, 0x80, 0x44, 0xb3, 0x88, 0x4f, 0x30, 0xcf, 0xb3, 0x19, - 0xb4, 0xa0, 0xfe, 0x6e, 0x3b, 0xdd, 0xb2, 0xee, 0xc2, 0x38, 0x03, 0x32, 0xee, 0x36, 0xda, 0x6f, - 0xbd, 0xa3, 0xf7, 0xc5, 0x75, 0x30, 0x01, 0xd1, 0xaa, 0x8c, 0x74, 0xbd, 0x0f, 0x79, 0xe6, 0x76, - 0x3b, 0x3f, 0xc8, 0xe7, 0xe2, 0xd2, 0x78, 0x10, 0x61, 0xe6, 0x58, 0x8d, 0x69, 0xd5, 0x8d, 0x7d, - 0x71, 0x46, 0x7e, 0x49, 0x5d, 0x9f, 0xc2, 0xd5, 0x60, 0x86, 0x5f, 0x48, 0xfc, 0x2e, 0x3f, 0x65, - 0xe9, 0x27, 0xd4, 0xff, 0x2a, 0x53, 0x8e, 0x99, 0xc8, 0x4f, 0xfe, 0xaa, 0x3f, 0xfa, 0x1c, 0x66, - 0x18, 0x73, 0x25, 0x70, 0xb2, 0xd1, 0x00, 0x9e, 0xcd, 0x30, 0x36, 0xbf, 0x0a, 0xf0, 0x4f, 0x85, - 0xa3, 0x76, 0x28, 0xd9, 0xe7, 0x71, 0xd1, 0x0e, 0x67, 0x9d, 0x09, 0xcb, 0xef, 0xd0, 0x4d, 0x37, - 0x3d, 0x4f, 0x8e, 0x11, 0xd9, 0x1d, 0xc5, 0x05, 0x3d, 0x38, 0xc3, 0xce, 0x09, 0x8d, 0x39, 0x4c, - 0x6d, 0x24, 0x1d, 0x64, 0x43, 0x12, 0xe7, 0x94, 0x7e, 0x32, 0xb4, 0x9d, 0xf4, 0x73, 0xf1, 0xec, - 0xf9, 0xe9, 0xfd, 0x0d, 0xc9, 0x96, 0x93, 0xe2, 0x32, 0x34, 0x24, 0xa1, 0x11, 0x08, 0xf5, 0xcb, - 0xcc, 0x81, 0x63, 0x30, 0x1f, 0xd1, 0xa2, 0x24, 0xf8, 0x17, 0x9c, 0x04, 0xb3, 0x19, 0x85, 0x92, - 0xa9, 0x79, 0xd0, 0xa0, 0x17, 0x6c, 0xaa, 0x43, 0xd6, 0x94, 0xd2, 0x67, 0x43, 0x04, 0xb8, 0xc6, - 0x9e, 0x83, 0x9a, 0x1e, 0x96, 0x0e, 0x38, 0x9d, 0xf1, 0x10, 0xcf, 0x37, 0x82, 0x28, 0x39, 0xdb, - 0x17, 0x47, 0x24, 0x1d, 0xc3, 0x31, 0x44, 0xd6, 0x80, 0xe9, 0x1d, 0xee, 0xf4, 0x2a, 0x1a, 0xe6, - 0xf5, 0xe2, 0x13, 0xea, 0x44, 0xc1, 0x84, 0xc9, 0xfc, 0x41, 0x72, 0xdb, 0x37, 0xe6, 0x32, 0x92, - 0xb3, 0x3b, 0x20, 0xf9, 0x50, 0x2d, 0xfa, 0xf9, 0x22, 0x2d, 0xe1, 0x50, 0xcd, 0xde, 0x96, 0xee, - 0xba, 0xb4, 0x4c, 0x44, 0x25, 0x10, 0x95, 0xf6, 0x36, 0x59, 0xeb, 0xa6, 0x3c, 0x37, 0x51, 0x40, - 0xd4, 0xe0, 0x54, 0x42, 0x72, 0xad, 0x0f, 0x4d, 0x98, 0xb3, 0x03, 0xf3, 0x69, 0xf9, 0x69, 0xe4, - 0xa4, 0x0d, 0x48, 0x5e, 0x93, 0x1a, 0x75, 0xb5, 0x0b, 0x0b, 0xa9, 0x39, 0x62, 0xe4, 0x0d, 0xc9, - 0xa0, 0x0c, 0x32, 0xa9, 0x18, 0xbf, 0x85, 0x45, 0x43, 0x42, 0x94, 0xc8, 0x81, 0x38, 0x30, 0x61, - 0x8a, 0x51, 0x20, 0xbe, 0x87, 0x92, 0x39, 0xd7, 0x06, 0xba, 0xa3, 0x3b, 0x41, 0xcd, 0x19, 0x2e, - 0x4a, 0xa9, 0xc9, 0x81, 0xd0, 0x1e, 0x4d, 0x7e, 0x98, 0x96, 0x7c, 0x43, 0xd2, 0x3d, 0x38, 0x39, - 0x87, 0x21, 0x5a, 0x6e, 0xd1, 0x90, 0x6f, 0x63, 0x00, 0xd6, 0x73, 0x50, 0xbb, 0x23, 0xf4, 0x92, - 0x9e, 0x80, 0x21, 0x16, 0x78, 0x9f, 0x9a, 0x9d, 0x21, 0x95, 0xce, 0x87, 0x30, 0xad, 0xbd, 0x80, - 0x95, 0xe2, 0x9f, 0xf6, 0x0c, 0x5b, 0x7a, 0xab, 0x53, 0x1f, 0xcd, 0x56, 0x0b, 0xbf, 0xf8, 0xef, - 0xcb, 0x99, 0x5f, 0xfc, 0x6a, 0x39, 0xf3, 0x5f, 0x7f, 0xb5, 0x9c, 0xf9, 0xe5, 0xaf, 0x96, 0x33, - 0x87, 0xe3, 0xb4, 0xf9, 0xea, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x29, 0x94, 0xa0, 0x42, - 0x93, 0x00, 0x00, + 0xf7, 0xfb, 0xff, 0xad, 0x9c, 0xb1, 0x05, 0x26, 0xf4, 0x1e, 0x8c, 0x3f, 0xf0, 0xfc, 0x53, 0x27, + 0xa4, 0x27, 0xb8, 0x3c, 0x5f, 0xae, 0xb4, 0x44, 0x5b, 0xae, 0xb4, 0x04, 0x3d, 0x80, 0x19, 0xdb, + 0xeb, 0x85, 0x78, 0xcf, 0x13, 0xe6, 0x26, 0x5b, 0xb5, 0xcb, 0x67, 0xfd, 0x72, 0xc9, 0x27, 0x35, + 0x8d, 0xd0, 0x4b, 0x1a, 0x96, 0x76, 0x0c, 0x0a, 0xad, 0xc3, 0x8c, 0x66, 0x18, 0x07, 0xc5, 0x71, + 0x2a, 0x79, 0xcc, 0x68, 0xd0, 0xcc, 0x69, 0x55, 0xfe, 0x62, 0x40, 0x68, 0x07, 0x66, 0x1f, 0xf5, + 0x0e, 0xb1, 0xdf, 0xc1, 0x21, 0x0e, 0x04, 0x45, 0x13, 0x94, 0xa2, 0x1b, 0x67, 0xfd, 0xf2, 0xd2, + 0x89, 0xac, 0x4c, 0xa1, 0x29, 0x09, 0x8a, 0x30, 0x5c, 0xe6, 0x84, 0xca, 0x6d, 0x28, 0xc7, 0xcd, + 0x69, 0xa6, 0xe2, 0x62, 0xb5, 0xd5, 0x5b, 0x9c, 0xcb, 0xd7, 0xe4, 0xd8, 0x93, 0x1b, 0x93, 0x1d, + 0xc7, 0x49, 0x56, 0x9c, 0xd4, 0x26, 0x79, 0x4a, 0x2d, 0x3b, 0xa4, 0x09, 0x6d, 0xa2, 0xca, 0xa2, + 0xd4, 0x2b, 0xdb, 0x30, 0xb6, 0x1f, 0x38, 0x47, 0x4c, 0x12, 0x67, 0x56, 0x6e, 0x72, 0x8a, 0xe2, + 0xd2, 0x47, 0xcf, 0xf5, 0xb4, 0x61, 0x75, 0x8e, 0xec, 0x20, 0x3d, 0xf2, 0xa7, 0xba, 0x83, 0xd0, + 0x3a, 0xf4, 0x0d, 0x00, 0xa7, 0x8a, 0xec, 0x6c, 0x93, 0x7c, 0xaf, 0xd5, 0x06, 0x49, 0x36, 0xb1, + 0x65, 0x3e, 0xbe, 0x2b, 0x72, 0x7c, 0xda, 0x5e, 0x67, 0x2b, 0x48, 0xd0, 0xd7, 0x30, 0x45, 0xd5, + 0x95, 0x98, 0xd1, 0x29, 0x3a, 0xa3, 0xf4, 0xe8, 0x4f, 0x14, 0x60, 0xda, 0x7c, 0x6a, 0x00, 0xe8, + 0x2f, 0xc1, 0x02, 0x47, 0x17, 0x33, 0x33, 0xa6, 0xb9, 0x59, 0xa5, 0x91, 0xa7, 0xb7, 0xa9, 0xbe, + 0xcb, 0x29, 0xb5, 0x24, 0xa5, 0x46, 0xc3, 0xc3, 0x4e, 0xef, 0xc6, 0xfa, 0x16, 0xf2, 0x92, 0x79, + 0x68, 0x02, 0x46, 0x2a, 0xed, 0x76, 0xe1, 0x12, 0xf9, 0xa3, 0x5e, 0xdf, 0x2c, 0x64, 0xd0, 0x0c, + 0x40, 0x24, 0x31, 0x85, 0x2c, 0x9a, 0x8a, 0x8c, 0x95, 0xc2, 0x08, 0x6d, 0xdf, 0xed, 0x16, 0x46, + 0x11, 0x8a, 0x5b, 0x49, 0x85, 0x31, 0xeb, 0xbf, 0x66, 0x12, 0x82, 0x45, 0xf6, 0x65, 0x6e, 0x58, + 0x51, 0x39, 0x60, 0x9b, 0x0f, 0xdd, 0x97, 0xb9, 0x49, 0xc6, 0x36, 0x16, 0xb5, 0x11, 0xd1, 0x15, + 0xbb, 0x84, 0x07, 0x4d, 0xaf, 0xad, 0xea, 0x8a, 0x2e, 0x2f, 0xb3, 0x65, 0x2d, 0x5a, 0x51, 0xb4, + 0xca, 0x48, 0xb4, 0xb1, 0x0a, 0xad, 0xa2, 0x4a, 0x98, 0xd4, 0x2f, 0x2b, 0x8a, 0xf5, 0x35, 0x1a, + 0xc1, 0xa4, 0x48, 0xb4, 0x6c, 0x67, 0xf5, 0x0c, 0x73, 0x86, 0x3e, 0x4f, 0x18, 0x8b, 0x6c, 0x84, + 0x54, 0x28, 0x63, 0x53, 0x93, 0xb0, 0x03, 0xcb, 0x30, 0xb6, 0xed, 0x1d, 0xb9, 0x1d, 0x3e, 0xc8, + 0xfc, 0x59, 0xbf, 0x3c, 0xd6, 0x26, 0x05, 0x36, 0x2b, 0xb7, 0xfe, 0x6f, 0x46, 0x95, 0x5f, 0x69, + 0xaf, 0x64, 0x52, 0xed, 0x95, 0xf7, 0x20, 0xcf, 0x0f, 0x35, 0x5b, 0x6b, 0x1c, 0x23, 0xd5, 0xc7, + 0xe2, 0x3c, 0xe4, 0xb6, 0xec, 0xa8, 0x01, 0xd9, 0x69, 0x98, 0x72, 0xa6, 0x3b, 0xcd, 0x48, 0xb4, + 0xd3, 0x70, 0xf5, 0xcd, 0x76, 0x9a, 0xa8, 0x09, 0x99, 0x48, 0xd5, 0x9b, 0x34, 0x1a, 0x4d, 0xa4, + 0xea, 0x37, 0xd2, 0x7d, 0x45, 0x9f, 0x01, 0x54, 0x9e, 0xd6, 0x89, 0xf4, 0x57, 0xec, 0x1d, 0xae, + 0x43, 0xa9, 0xab, 0xc9, 0x79, 0x11, 0x34, 0xe8, 0x6a, 0x71, 0x7c, 0x75, 0x4b, 0x52, 0x5a, 0x5b, + 0x6d, 0x98, 0xd9, 0xc0, 0x21, 0x99, 0x35, 0xb1, 0xe1, 0x0c, 0x1e, 0xfe, 0x17, 0x30, 0xf9, 0xd4, + 0x0d, 0x8f, 0x75, 0x03, 0x90, 0x76, 0xf6, 0xc2, 0x0d, 0x8f, 0x85, 0x01, 0xa8, 0x74, 0xa6, 0x36, + 0xb7, 0xd6, 0xe1, 0x32, 0xef, 0x4d, 0xee, 0x6f, 0x2b, 0x3a, 0xc2, 0x4c, 0x64, 0x51, 0xaa, 0x08, + 0x75, 0x34, 0x38, 0xae, 0xf0, 0x51, 0x3d, 0xb1, 0x05, 0x30, 0x6b, 0xd8, 0xe4, 0x69, 0xa1, 0x82, + 0x13, 0xdb, 0x1a, 0xe2, 0x1b, 0x82, 0xb5, 0x0f, 0xd3, 0xbb, 0xed, 0xde, 0x91, 0xdb, 0x21, 0x02, + 0x5a, 0xc7, 0xbf, 0x40, 0x6b, 0x00, 0x51, 0x01, 0xef, 0x41, 0xb8, 0x17, 0xa2, 0x8a, 0x83, 0x55, + 0x3e, 0xc5, 0xb4, 0x84, 0xea, 0x70, 0x5b, 0x81, 0xb3, 0xfe, 0xd6, 0x08, 0x20, 0xde, 0x47, 0x3d, + 0x74, 0x42, 0x5c, 0xc7, 0x21, 0xd9, 0x2e, 0xae, 0x40, 0x56, 0x9a, 0x8d, 0xe3, 0x67, 0xfd, 0x72, + 0xd6, 0x6d, 0xd9, 0xd9, 0xad, 0x35, 0xf4, 0x01, 0x8c, 0xd1, 0x66, 0x94, 0xd7, 0x33, 0xb2, 0x3f, + 0x15, 0x03, 0x93, 0xe9, 0x80, 0xfc, 0x69, 0xb3, 0xc6, 0xe8, 0x43, 0xc8, 0xaf, 0xe1, 0x36, 0x3e, + 0x72, 0x42, 0x4f, 0xc8, 0x1d, 0x33, 0xc4, 0x44, 0xa1, 0x32, 0x45, 0x51, 0x4b, 0xb2, 0x81, 0xdb, + 0xd8, 0x09, 0xbc, 0x8e, 0xba, 0x81, 0xfb, 0xb4, 0x44, 0xdd, 0xc0, 0x59, 0x1b, 0xf4, 0x07, 0x19, + 0x98, 0xac, 0x74, 0x3a, 0xdc, 0xc0, 0x09, 0xb8, 0x6b, 0x75, 0xe1, 0xae, 0xf4, 0x8c, 0x6f, 0x3b, + 0x87, 0xb8, 0x7d, 0x40, 0x4c, 0xe6, 0xa0, 0xfa, 0x3d, 0xd1, 0xa9, 0x7f, 0xd2, 0x2f, 0x7f, 0xfe, + 0x2a, 0xce, 0xf6, 0xbb, 0x7b, 0xbe, 0xe3, 0x86, 0x01, 0xf5, 0x63, 0x45, 0x1d, 0xaa, 0x62, 0xa6, + 0xd0, 0x81, 0xde, 0x81, 0x31, 0x22, 0xdf, 0xc2, 0x0e, 0xa0, 0x93, 0x4d, 0xd6, 0x81, 0x76, 0xf8, + 0xa1, 0x2d, 0xac, 0x5b, 0x90, 0xe7, 0x9c, 0xdc, 0x5a, 0x33, 0x4d, 0x81, 0xb5, 0x06, 0xd7, 0xa9, + 0x15, 0x87, 0x89, 0xe4, 0x52, 0x6f, 0x0e, 0x97, 0xc4, 0xc8, 0xec, 0x9f, 0xa0, 0xc5, 0x12, 0x9a, + 0x4e, 0x08, 0xf5, 0x06, 0xd9, 0xa2, 0xc6, 0xaa, 0xc1, 0xd2, 0x06, 0x0e, 0x6d, 0x1c, 0xe0, 0x70, + 0xd7, 0x09, 0x82, 0x17, 0x9e, 0xdf, 0xa2, 0x55, 0x17, 0x42, 0xf2, 0xd7, 0x32, 0x50, 0xae, 0xf9, + 0x98, 0xcc, 0xb4, 0x11, 0xd1, 0xe0, 0x15, 0xbc, 0xc4, 0x2f, 0x17, 0xb2, 0x51, 0x2d, 0xe1, 0x35, + 0xbf, 0x40, 0x78, 0x1b, 0x46, 0xf6, 0xf6, 0xb6, 0xa9, 0xc4, 0x8c, 0x50, 0xc6, 0x8d, 0x84, 0x61, + 0xfb, 0x37, 0xfd, 0x72, 0x6e, 0xad, 0xc7, 0x2e, 0x1f, 0x6c, 0x52, 0x6f, 0x3d, 0x83, 0x05, 0x1b, + 0x77, 0xf0, 0x0b, 0xe7, 0xb0, 0x8d, 0x35, 0x73, 0xb5, 0x0c, 0x63, 0xcc, 0x59, 0x96, 0x18, 0x02, + 0x2b, 0xd7, 0xed, 0xd9, 0xec, 0x10, 0x7b, 0xd6, 0xfa, 0xc3, 0x0c, 0x14, 0xd8, 0x70, 0xab, 0x5e, + 0x78, 0xbe, 0xf1, 0xf1, 0x11, 0x64, 0x07, 0x8f, 0x00, 0xdd, 0x8e, 0xb8, 0x3d, 0x12, 0x6d, 0x7e, + 0x94, 0x54, 0xa2, 0xc3, 0x45, 0x25, 0x19, 0x10, 0x93, 0x25, 0x76, 0x34, 0xa2, 0x03, 0xa2, 0xb2, + 0x24, 0x24, 0xe8, 0x5f, 0x64, 0x61, 0x56, 0x21, 0x31, 0xe8, 0x7a, 0x9d, 0x00, 0x93, 0x33, 0x1e, + 0x11, 0x16, 0x85, 0x4e, 0x7a, 0xc6, 0x23, 0x5b, 0x66, 0x23, 0xb2, 0xc4, 0x29, 0xc1, 0xef, 0x90, + 0xc3, 0x45, 0x3b, 0x71, 0x1c, 0xa4, 0x8a, 0x9b, 0x35, 0x15, 0xd5, 0xe7, 0x26, 0xfa, 0x1e, 0xe4, + 0xe8, 0x9f, 0x84, 0x11, 0xa3, 0x66, 0x46, 0xc8, 0x46, 0xc8, 0x05, 0x78, 0xe8, 0xb9, 0x9d, 0xc7, + 0x38, 0x3c, 0xf6, 0xc4, 0xe1, 0x79, 0x8b, 0x28, 0xb1, 0x3f, 0xef, 0xb9, 0x9d, 0xc6, 0x29, 0x2d, + 0xbe, 0xe8, 0xa1, 0x33, 0x42, 0x68, 0x2b, 0xc8, 0xad, 0xfb, 0x50, 0x20, 0xfa, 0xe6, 0xfc, 0x33, + 0x6a, 0xcd, 0x03, 0xda, 0xc0, 0x61, 0xd5, 0xd3, 0x36, 0x0e, 0x6b, 0x1a, 0x26, 0x77, 0xdd, 0xce, + 0x91, 0xf8, 0xfc, 0x37, 0x59, 0x98, 0x62, 0xdf, 0x7c, 0x06, 0x62, 0x3b, 0x69, 0xe6, 0x3c, 0x3b, + 0xe9, 0x27, 0x30, 0xcd, 0xdd, 0x39, 0xd8, 0xa7, 0x2e, 0x64, 0x36, 0x1f, 0xf4, 0x44, 0xc9, 0xbc, + 0x3a, 0x8d, 0xe7, 0xac, 0xc6, 0xd6, 0x1b, 0xa2, 0x6d, 0x98, 0x61, 0x05, 0x0f, 0xb0, 0x13, 0xf6, + 0xa2, 0x53, 0xd5, 0x65, 0x6e, 0x67, 0x8a, 0x62, 0xa6, 0x8c, 0x38, 0xae, 0x67, 0xbc, 0xd0, 0x8e, + 0xc1, 0xa2, 0xaf, 0xe1, 0xf2, 0xae, 0xef, 0xfd, 0xf8, 0x52, 0xb1, 0x1d, 0x98, 0x3e, 0x5e, 0x20, + 0x87, 0xb0, 0x2e, 0xa9, 0x6a, 0xa8, 0x16, 0x44, 0xbc, 0x35, 0x91, 0xa9, 0xad, 0xa0, 0xea, 0xf9, + 0x6e, 0xe7, 0x88, 0xce, 0x66, 0x8e, 0xc9, 0x94, 0x1b, 0x34, 0x0e, 0x69, 0xa1, 0x2d, 0xab, 0xad, + 0xff, 0x31, 0x02, 0x39, 0xd9, 0xf1, 0x5d, 0xd5, 0x2c, 0xe5, 0x9b, 0x31, 0x5d, 0x9e, 0xd1, 0xe1, + 0xc7, 0x56, 0x5a, 0xa0, 0xab, 0xcc, 0x99, 0xc5, 0xcc, 0x80, 0x09, 0x22, 0x63, 0x4e, 0xb7, 0x4b, + 0x5d, 0x56, 0x44, 0x99, 0xae, 0x55, 0x29, 0x17, 0x72, 0x4c, 0x99, 0xb6, 0x0e, 0xed, 0xec, 0x5a, + 0x95, 0xcc, 0xf5, 0x93, 0xad, 0xb5, 0x1a, 0x1d, 0x50, 0x8e, 0xcd, 0xb5, 0xe7, 0xb6, 0x9a, 0x36, + 0x2d, 0x25, 0xb5, 0xf5, 0xca, 0xe3, 0x6d, 0x4e, 0x34, 0xad, 0x0d, 0x9c, 0xd3, 0xb6, 0x4d, 0x4b, + 0x89, 0x1d, 0xc8, 0xf6, 0xe8, 0x9a, 0xd7, 0x09, 0x7d, 0xaf, 0x1d, 0x50, 0x57, 0x41, 0x4e, 0xdb, + 0xce, 0x9b, 0xbc, 0xca, 0x8e, 0x35, 0x45, 0x4f, 0x61, 0xb1, 0xd2, 0x7a, 0xee, 0x74, 0x9a, 0xb8, + 0xc5, 0x6a, 0x9e, 0x7a, 0xfe, 0xc9, 0xb3, 0xb6, 0xf7, 0x22, 0xa0, 0xa7, 0xbc, 0x1c, 0x3f, 0x2f, + 0xf2, 0x26, 0x0d, 0x8e, 0xee, 0x85, 0x68, 0x64, 0x9b, 0xa0, 0x89, 0x8a, 0xa8, 0xb5, 0xbd, 0x5e, + 0x8b, 0x1e, 0xef, 0x72, 0x4c, 0x45, 0x34, 0x49, 0x81, 0xcd, 0xca, 0x09, 0x97, 0x36, 0xeb, 0x8f, + 0xe9, 0xe9, 0x8c, 0x73, 0xe9, 0x38, 0x38, 0xb5, 0x49, 0x19, 0x7a, 0x1b, 0x26, 0x84, 0x49, 0xcb, + 0x9c, 0x02, 0xd4, 0x63, 0x24, 0x4c, 0x59, 0x51, 0x87, 0xd6, 0x60, 0xf6, 0xb1, 0xd7, 0xc2, 0xbe, + 0x13, 0xe2, 0x16, 0xb7, 0x2e, 0x03, 0x7a, 0xd0, 0xca, 0x31, 0xb3, 0xfa, 0x54, 0x54, 0x8a, 0x0b, + 0x8d, 0xc0, 0x4e, 0x02, 0x58, 0xef, 0xc3, 0x2c, 0x5b, 0x7a, 0xe7, 0xb6, 0xf7, 0xac, 0x5d, 0x80, + 0x3a, 0x3e, 0x75, 0xba, 0xc7, 0x1e, 0x11, 0x8f, 0xaa, 0xfa, 0xc5, 0x0d, 0x20, 0x24, 0xaf, 0x0b, + 0x78, 0xc5, 0xc1, 0xaa, 0xb0, 0x88, 0x45, 0x4b, 0x5b, 0x81, 0xb2, 0xfe, 0x53, 0x16, 0x10, 0x75, + 0x9b, 0xd7, 0x43, 0x1f, 0x3b, 0xa7, 0x82, 0x8c, 0x4f, 0x61, 0x8a, 0x69, 0x51, 0x56, 0x4c, 0xc9, + 0x21, 0xd6, 0x15, 0x5b, 0x3e, 0x6a, 0xd5, 0xe6, 0x25, 0x5b, 0x6b, 0x4a, 0x40, 0x6d, 0x1c, 0xf4, + 0x4e, 0x05, 0x68, 0x56, 0x03, 0x55, 0xab, 0x08, 0xa8, 0xfa, 0x8d, 0xbe, 0x86, 0x99, 0x9a, 0x77, + 0xda, 0x25, 0x3c, 0xe1, 0xc0, 0x23, 0xdc, 0x86, 0xe1, 0xfd, 0x6a, 0x95, 0x9b, 0x97, 0xec, 0x58, + 0x73, 0xb4, 0x03, 0x73, 0x0f, 0xda, 0xbd, 0xe0, 0xb8, 0xd2, 0x69, 0xd5, 0xda, 0x5e, 0x20, 0xb0, + 0x8c, 0x72, 0x97, 0x0a, 0x5f, 0xfc, 0xc9, 0x16, 0x9b, 0x97, 0xec, 0x34, 0x40, 0xf4, 0x36, 0x8f, + 0x01, 0xe0, 0xb6, 0xd4, 0xf4, 0x5d, 0x1e, 0x22, 0xf0, 0xa4, 0x83, 0x9f, 0x3c, 0xdb, 0xbc, 0x64, + 0xb3, 0xda, 0x6a, 0x1e, 0x26, 0x84, 0xe2, 0xbb, 0x07, 0xb3, 0x0a, 0x3b, 0x89, 0xf5, 0xd7, 0x0b, + 0x50, 0x09, 0x72, 0xfb, 0xdd, 0xb6, 0xe7, 0xb4, 0x84, 0x31, 0x61, 0xcb, 0x6f, 0xeb, 0x3d, 0x9d, + 0xd3, 0x68, 0x49, 0x3d, 0xd1, 0xb0, 0xc6, 0x51, 0x81, 0xb5, 0xa9, 0x33, 0x77, 0x70, 0x6b, 0xad, + 0xdf, 0x6c, 0xac, 0xdf, 0x42, 0x9c, 0xd7, 0xd6, 0x42, 0x2a, 0xf3, 0xac, 0x47, 0xd4, 0x50, 0xaa, + 0x74, 0xbb, 0x6d, 0xb7, 0x49, 0xf7, 0x17, 0xa6, 0x1d, 0xa5, 0x8d, 0xf1, 0x5b, 0xea, 0x4d, 0xb5, + 0xb2, 0xb9, 0xca, 0x7b, 0x69, 0xe5, 0x2e, 0xda, 0xfa, 0x0e, 0xae, 0x1b, 0x90, 0xf1, 0x7d, 0xe2, + 0x53, 0x98, 0xe0, 0x45, 0x31, 0x81, 0x56, 0x7d, 0xfb, 0x74, 0x55, 0x06, 0x1c, 0x52, 0xb4, 0xb7, + 0xbe, 0x85, 0xe5, 0xfd, 0x6e, 0x80, 0xfd, 0x24, 0x7a, 0x41, 0xea, 0x47, 0xf2, 0x26, 0x3c, 0x63, + 0xbc, 0x37, 0x80, 0xb3, 0x7e, 0x79, 0x9c, 0xe1, 0x16, 0x17, 0xe0, 0xd6, 0xef, 0x67, 0x60, 0x99, + 0x2d, 0x55, 0x23, 0xea, 0x8b, 0x70, 0x41, 0xf1, 0x4b, 0x67, 0xcd, 0x7e, 0xe9, 0x81, 0x8e, 0x7a, + 0xeb, 0x1b, 0xb0, 0x38, 0x45, 0xed, 0xf6, 0x1b, 0x9a, 0x9b, 0xbf, 0x9a, 0x81, 0x79, 0x36, 0x39, + 0xaf, 0x81, 0x05, 0x7d, 0x09, 0x33, 0xf5, 0x13, 0xb7, 0x7b, 0xe0, 0xb4, 0xdd, 0x16, 0x73, 0xd1, + 0xb2, 0xed, 0x68, 0x81, 0xee, 0xb4, 0x27, 0x6e, 0xb7, 0xf1, 0x3c, 0xaa, 0xca, 0xd8, 0xb1, 0xc6, + 0xd6, 0x13, 0x58, 0x88, 0xd1, 0xc0, 0x05, 0xe3, 0xa3, 0xb8, 0x60, 0x24, 0xc2, 0x18, 0xd2, 0xa5, + 0xe2, 0x31, 0x5c, 0x91, 0x52, 0xa1, 0x4f, 0xd9, 0x6a, 0x4c, 0x1a, 0x12, 0x08, 0xd3, 0x44, 0xa1, + 0x09, 0x57, 0xa4, 0x24, 0xbc, 0x86, 0x04, 0x88, 0xc9, 0xcd, 0xa6, 0x4e, 0xee, 0x16, 0x94, 0xd4, + 0xc9, 0x7d, 0x9d, 0x49, 0xfd, 0x8f, 0x19, 0x58, 0xdc, 0xc0, 0x1d, 0xba, 0xf5, 0x54, 0xba, 0x5d, + 0xed, 0x64, 0xa2, 0xba, 0xa7, 0x33, 0x03, 0xdd, 0xd3, 0xd2, 0xec, 0xce, 0xa6, 0x9b, 0xdd, 0x64, + 0x4f, 0xdd, 0xb7, 0xb7, 0xb8, 0xac, 0xd2, 0x3d, 0xb5, 0xe7, 0xbb, 0x36, 0x29, 0x43, 0x5b, 0x91, + 0x6b, 0x7b, 0x74, 0xa8, 0x6b, 0x7b, 0x8e, 0xbb, 0xfa, 0x26, 0xb8, 0x6b, 0x5b, 0x73, 0x68, 0x5b, + 0x9f, 0x43, 0x31, 0x39, 0x16, 0x2e, 0x1f, 0xc3, 0x8e, 0x3a, 0xd6, 0x5a, 0x24, 0xdd, 0xfc, 0x16, + 0x5c, 0xba, 0xf4, 0x63, 0x2a, 0x74, 0x80, 0x0b, 0xc9, 0xaa, 0x47, 0xf2, 0xc9, 0xb1, 0xf0, 0xfe, + 0x3f, 0x23, 0xf2, 0xc9, 0x22, 0x1d, 0x32, 0xe6, 0x48, 0x07, 0x2e, 0xa3, 0x0c, 0x54, 0x00, 0x58, + 0x4f, 0xe1, 0x8a, 0x86, 0x34, 0x92, 0xfa, 0x2f, 0x21, 0x27, 0x0d, 0x0c, 0xdd, 0xc3, 0xa1, 0xa1, + 0xa5, 0xf3, 0x26, 0x6d, 0x0d, 0x09, 0x62, 0xfd, 0x2a, 0x03, 0x8b, 0x6c, 0x77, 0x49, 0x8e, 0xfb, + 0xfc, 0xb3, 0xff, 0xa7, 0xe2, 0x36, 0xbb, 0x9f, 0xe2, 0x36, 0xa3, 0x20, 0xaa, 0xdb, 0x4c, 0x75, + 0x96, 0x3d, 0x1c, 0xcd, 0x65, 0x0b, 0x23, 0xd6, 0x01, 0x14, 0x93, 0x23, 0x7c, 0x03, 0x73, 0xb2, + 0x01, 0x8b, 0xca, 0x42, 0x7f, 0x0d, 0x89, 0xd9, 0x84, 0xa5, 0xc8, 0xcc, 0xd3, 0xe6, 0xf8, 0x82, + 0xf3, 0xc0, 0x65, 0x2f, 0xa2, 0xfd, 0x0d, 0xca, 0x5e, 0xd4, 0xf0, 0x8d, 0xc9, 0xde, 0x16, 0xcc, + 0x31, 0xc4, 0xfa, 0x3a, 0x5d, 0x51, 0xd7, 0x69, 0x6a, 0xfc, 0x4e, 0x72, 0xe9, 0x3e, 0xa6, 0x4b, + 0x57, 0x34, 0x89, 0x28, 0xfc, 0x10, 0xc6, 0x79, 0x88, 0x22, 0xa3, 0x2f, 0x05, 0x19, 0xd5, 0xe1, + 0x2c, 0x2e, 0xd1, 0xe6, 0x8d, 0xad, 0x22, 0x1d, 0x32, 0x39, 0x37, 0x71, 0x07, 0xbc, 0x3c, 0xc5, + 0x7e, 0x43, 0x94, 0x65, 0xac, 0xe6, 0x35, 0xf7, 0x9f, 0x27, 0x50, 0x64, 0xfb, 0x8f, 0x82, 0xf5, + 0xb5, 0x76, 0xa0, 0x4f, 0xa0, 0xc8, 0xe4, 0x29, 0x05, 0xe1, 0xe0, 0x6d, 0x65, 0x59, 0x48, 0x62, + 0xa5, 0xdd, 0x4e, 0x1b, 0xfd, 0xdf, 0xc8, 0xc0, 0xd5, 0x0d, 0x1c, 0xea, 0x51, 0x5c, 0x7f, 0x26, + 0x56, 0xc0, 0xf7, 0x50, 0x4a, 0x23, 0x84, 0x4f, 0xc5, 0x57, 0xf1, 0xa9, 0x30, 0x86, 0xac, 0xa5, + 0x4f, 0xc9, 0x77, 0x70, 0x8d, 0x4d, 0x89, 0xde, 0x5e, 0x0c, 0xf4, 0xf3, 0xd8, 0xac, 0x18, 0xb1, + 0xa7, 0xcd, 0xce, 0xdf, 0xce, 0xc0, 0x35, 0xc6, 0xe4, 0x74, 0xe4, 0x7f, 0xda, 0x76, 0xe2, 0x0e, + 0x94, 0xe5, 0x9c, 0xbf, 0x81, 0x89, 0xb5, 0xfe, 0x65, 0x06, 0x90, 0xc0, 0x53, 0xab, 0xdb, 0x02, + 0xc7, 0x55, 0x18, 0xa9, 0xd5, 0x6d, 0x7e, 0x23, 0x4e, 0xf7, 0xff, 0x66, 0xe0, 0xdb, 0xa4, 0x2c, + 0xbe, 0x19, 0x64, 0xcf, 0xb3, 0x19, 0x6c, 0x01, 0xaa, 0xbb, 0x47, 0x9d, 0xa7, 0x6e, 0x78, 0x2c, + 0x3b, 0xab, 0x70, 0xef, 0x05, 0x0d, 0x16, 0x0c, 0xdc, 0xa3, 0x4e, 0x83, 0x5e, 0x49, 0xc8, 0x80, + 0xc4, 0xa6, 0x63, 0xa7, 0x00, 0x59, 0x3f, 0x83, 0x39, 0x8d, 0x5e, 0x2e, 0x43, 0x4b, 0x30, 0x5a, + 0xc3, 0x7e, 0xc8, 0x29, 0xa6, 0x5c, 0x6b, 0x62, 0x3f, 0xb4, 0x69, 0x29, 0xba, 0x0d, 0x13, 0xb5, + 0x0a, 0xf5, 0xa4, 0x52, 0x8b, 0x67, 0x8a, 0x29, 0xb9, 0xa6, 0xd3, 0xa0, 0x51, 0xf2, 0xb6, 0xa8, + 0xb4, 0xfe, 0x5d, 0x56, 0xc1, 0x4e, 0xc0, 0x87, 0xb3, 0xe3, 0x7d, 0x72, 0x68, 0x27, 0xfc, 0x57, + 0xb8, 0x31, 0x4b, 0x36, 0x53, 0xee, 0x85, 0x62, 0xfb, 0x80, 0xad, 0x34, 0x3a, 0xa7, 0x17, 0x58, + 0xdc, 0x3a, 0x32, 0x20, 0xe1, 0x21, 0x95, 0xb7, 0x8e, 0x1c, 0x75, 0x60, 0xab, 0x8d, 0xd0, 0xcf, + 0x61, 0x9a, 0xd3, 0xcc, 0x09, 0x1a, 0xa3, 0xd7, 0x1a, 0x6f, 0xf1, 0xa3, 0x72, 0xca, 0xd8, 0xee, + 0xca, 0xf6, 0x3c, 0x7e, 0x59, 0x7c, 0xb2, 0x69, 0xd4, 0xd1, 0x59, 0xb7, 0xa5, 0x43, 0x1f, 0xfb, + 0xe8, 0x32, 0x4c, 0xee, 0xef, 0xd4, 0x77, 0xd7, 0x6b, 0x5b, 0x0f, 0xb6, 0xd6, 0xd7, 0x0a, 0x97, + 0x50, 0x0e, 0x46, 0xf7, 0x6a, 0x7b, 0xdb, 0x85, 0x8c, 0xf5, 0x3d, 0xcc, 0xeb, 0x7d, 0xbd, 0xd1, + 0x69, 0x7a, 0x8b, 0x5e, 0xab, 0x29, 0x17, 0xd2, 0x08, 0xa9, 0x6e, 0x16, 0xbe, 0x54, 0x3e, 0x86, + 0x02, 0x6f, 0x15, 0xa9, 0x9a, 0x5b, 0xc2, 0xf0, 0x65, 0x8a, 0x46, 0x0f, 0xe0, 0x16, 0x3e, 0xe7, + 0x9f, 0x08, 0x47, 0xce, 0xb0, 0x1e, 0xfe, 0x7e, 0x06, 0x8a, 0x8f, 0x1f, 0x54, 0x2a, 0xbd, 0xf0, + 0x18, 0x77, 0x42, 0x72, 0x64, 0xc3, 0xb5, 0x63, 0xa7, 0xdd, 0xc6, 0x9d, 0x23, 0x8c, 0xee, 0xc0, + 0xe8, 0xde, 0x93, 0xbd, 0x5d, 0xee, 0x2f, 0x99, 0xe7, 0x33, 0x40, 0x8a, 0x64, 0x1b, 0x9b, 0xb6, + 0x40, 0x8f, 0x60, 0xf6, 0x29, 0x7f, 0x32, 0x21, 0xab, 0xb8, 0xa7, 0xe4, 0xfa, 0x5d, 0xf9, 0x98, + 0xa2, 0xe6, 0xe3, 0x16, 0xe9, 0xc5, 0x69, 0x57, 0x02, 0xa2, 0xec, 0x88, 0x9c, 0x24, 0xe1, 0x1e, + 0x8e, 0xe6, 0x32, 0x85, 0xac, 0xf5, 0x07, 0x19, 0x58, 0x8c, 0x51, 0xa6, 0x38, 0xcf, 0x55, 0xc2, + 0xe6, 0x14, 0xc2, 0x44, 0x93, 0xcd, 0x4b, 0x9c, 0xb2, 0x1a, 0x8d, 0xcf, 0xa5, 0x3d, 0x70, 0x82, + 0xde, 0x1e, 0x4c, 0x50, 0x84, 0x40, 0x02, 0xf2, 0xe8, 0x3a, 0x5a, 0x6e, 0x5d, 0x86, 0x69, 0x8d, + 0x03, 0x96, 0x05, 0x53, 0x6a, 0xcf, 0x84, 0xcd, 0x35, 0xaf, 0x25, 0xd9, 0x4c, 0xfe, 0xb6, 0xfe, + 0x6e, 0x06, 0xe6, 0x1f, 0x3f, 0xa8, 0xd8, 0xf8, 0xc8, 0x25, 0x72, 0x17, 0xb1, 0x78, 0x45, 0x1b, + 0xc9, 0x92, 0x36, 0x92, 0x58, 0x5b, 0x39, 0xa4, 0xcf, 0x12, 0x43, 0x5a, 0x4a, 0x1b, 0x12, 0xb5, + 0x41, 0x5d, 0xaf, 0xa3, 0x8d, 0x44, 0xf1, 0x0b, 0xfd, 0x83, 0x0c, 0xcc, 0x29, 0x34, 0x49, 0xfa, + 0xdf, 0xd7, 0x48, 0xba, 0x96, 0x42, 0x52, 0x82, 0xc9, 0xd5, 0x04, 0x45, 0x6f, 0x0d, 0xa2, 0x68, + 0x28, 0x8f, 0xff, 0x38, 0x03, 0x0b, 0xa9, 0x3c, 0x40, 0x57, 0xc8, 0x4e, 0xd8, 0xf4, 0x71, 0xc8, + 0xd9, 0xcb, 0xbf, 0x48, 0xf9, 0x56, 0x10, 0xf4, 0xf8, 0x7b, 0x96, 0xbc, 0xcd, 0xbf, 0xd0, 0x5b, + 0x30, 0xbd, 0x8b, 0x7d, 0xd7, 0x6b, 0xd5, 0x71, 0xd3, 0xeb, 0xb4, 0x98, 0xd7, 0x7d, 0xda, 0xd6, + 0x0b, 0xd1, 0x12, 0xe4, 0x2b, 0xed, 0x23, 0xcf, 0x77, 0xc3, 0x63, 0xe6, 0x9a, 0xcb, 0xdb, 0x51, + 0x01, 0xc1, 0xbd, 0xe6, 0x1e, 0xb9, 0x21, 0xbb, 0xbf, 0x9c, 0xb6, 0xf9, 0x17, 0x2a, 0xc2, 0x44, + 0xa5, 0xd9, 0xf4, 0x7a, 0x9d, 0x90, 0x7a, 0x99, 0xf3, 0xb6, 0xf8, 0x24, 0x10, 0xdf, 0xd8, 0x54, + 0x08, 0x68, 0xc4, 0x99, 0xcd, 0xbf, 0xac, 0x77, 0x61, 0x3e, 0x8d, 0x8f, 0xa9, 0x22, 0xf3, 0x97, + 0xb3, 0x30, 0x57, 0x69, 0xb5, 0x1e, 0x3f, 0xa8, 0xac, 0x61, 0xd5, 0xa0, 0xfa, 0x00, 0x46, 0xb7, + 0x3a, 0x6e, 0xc8, 0x2d, 0x81, 0x65, 0x3e, 0x3d, 0x29, 0x2d, 0x49, 0x2b, 0x32, 0x43, 0xe4, 0x7f, + 0x64, 0xc3, 0xdc, 0xfa, 0x8f, 0x6e, 0x10, 0xba, 0x9d, 0x23, 0x3a, 0xe7, 0xac, 0x63, 0x3e, 0xc7, + 0x02, 0x89, 0x61, 0xb9, 0x6d, 0x5e, 0xb2, 0xd3, 0x80, 0xd1, 0x1e, 0x5c, 0xd9, 0xc1, 0x2f, 0x52, + 0x44, 0x48, 0x06, 0x8c, 0x49, 0xb4, 0x29, 0x92, 0x63, 0x80, 0x55, 0x25, 0xf4, 0xaf, 0x67, 0x69, + 0x14, 0xa2, 0x32, 0x30, 0xde, 0xf3, 0x3e, 0xcc, 0x2b, 0x04, 0x45, 0x1a, 0x27, 0xc3, 0xe3, 0xd3, + 0x53, 0x87, 0xa3, 0x2e, 0xa4, 0x54, 0x70, 0xf4, 0x14, 0x16, 0x75, 0xa2, 0x22, 0xcc, 0xfa, 0x62, + 0x48, 0x6b, 0xb2, 0x79, 0xc9, 0x36, 0x41, 0xa3, 0x15, 0x18, 0xa9, 0x34, 0x4f, 0x38, 0x5b, 0xd2, + 0xa7, 0x8c, 0x8d, 0xac, 0xd2, 0x3c, 0xa1, 0x11, 0xbd, 0xcd, 0x13, 0x6d, 0x3d, 0xfc, 0xdb, 0x0c, + 0x2c, 0x1a, 0x66, 0x18, 0x2d, 0x03, 0xb0, 0x42, 0x45, 0xb7, 0x2b, 0x25, 0x64, 0x77, 0x67, 0x5f, + 0xf4, 0x52, 0x77, 0x84, 0x6e, 0xa6, 0x22, 0xf6, 0x2a, 0xaa, 0xb0, 0x95, 0x46, 0x68, 0x17, 0x26, + 0xd9, 0x17, 0x0b, 0x01, 0x1b, 0xa5, 0x30, 0x48, 0x83, 0x61, 0x31, 0x5f, 0x34, 0xae, 0xa3, 0x45, + 0x0b, 0x1a, 0xf1, 0xd0, 0x2f, 0x15, 0x05, 0x3f, 0x18, 0xd7, 0xe2, 0xa3, 0x90, 0x83, 0x46, 0x77, + 0x60, 0x9c, 0x15, 0xf2, 0x39, 0x14, 0x2f, 0x8b, 0xa2, 0xc6, 0xbc, 0xde, 0xfa, 0xc3, 0x8c, 0xf0, + 0x77, 0x25, 0x96, 0xc6, 0xc7, 0xda, 0xd2, 0xb8, 0x29, 0x09, 0x4e, 0x6b, 0xac, 0xad, 0x8e, 0x2a, + 0x4c, 0xbe, 0xca, 0xaa, 0x50, 0x81, 0x54, 0xb9, 0xfd, 0x27, 0x19, 0x71, 0x52, 0x4f, 0x8a, 0xee, + 0x3a, 0x4c, 0xbd, 0x9a, 0xc8, 0x6a, 0x60, 0xe8, 0x43, 0x26, 0x51, 0xd9, 0xc1, 0x23, 0x1d, 0x28, + 0x54, 0x5f, 0x08, 0x97, 0xde, 0xab, 0x88, 0x95, 0xb5, 0x94, 0x02, 0x2d, 0xbb, 0xb3, 0x7a, 0x89, + 0xda, 0xfa, 0xcb, 0x4e, 0x53, 0xcc, 0xd3, 0xed, 0x78, 0x20, 0x83, 0xf1, 0x96, 0x5a, 0xa5, 0x21, + 0x1b, 0x79, 0x79, 0xb8, 0xc8, 0x51, 0xf3, 0x4e, 0x25, 0xea, 0x2c, 0xb6, 0x4e, 0x5e, 0xa5, 0xd3, + 0x1a, 0x4c, 0xef, 0xe0, 0x17, 0x89, 0x7e, 0xe9, 0xdd, 0x5f, 0x07, 0xbf, 0x68, 0x28, 0x7d, 0x2b, + 0xd2, 0xae, 0xc3, 0xa0, 0x43, 0x98, 0x11, 0xba, 0xe0, 0xbc, 0x2a, 0x91, 0x45, 0xb5, 0x92, 0x1e, + 0x4e, 0x9f, 0x39, 0x0d, 0x9f, 0x97, 0xaa, 0xe1, 0xa8, 0x3a, 0x46, 0x6b, 0x17, 0x8a, 0xc9, 0xb1, + 0x72, 0x29, 0xfb, 0x60, 0xd8, 0x72, 0x62, 0x27, 0xc5, 0x96, 0xbe, 0xb4, 0x36, 0xa9, 0x53, 0x43, + 0xb6, 0x91, 0xc7, 0xb1, 0xfb, 0x71, 0xd6, 0xd1, 0x2b, 0x45, 0xc1, 0x3a, 0x35, 0x6c, 0x3e, 0x0a, + 0x65, 0x59, 0x88, 0x61, 0xe2, 0x84, 0xbd, 0x0b, 0x13, 0xbc, 0x48, 0x3e, 0x47, 0x88, 0x2f, 0x74, + 0xd1, 0xc0, 0xfa, 0x87, 0x19, 0xb8, 0xba, 0x1f, 0x60, 0xbf, 0xee, 0x76, 0x8e, 0xda, 0x78, 0x3f, + 0xd0, 0x03, 0x49, 0x7e, 0x5b, 0x5b, 0xec, 0x8b, 0x86, 0x00, 0xd5, 0xff, 0x5f, 0x4b, 0xfc, 0x1f, + 0x67, 0xa0, 0x94, 0x46, 0xdb, 0x9b, 0x5d, 0xe5, 0x77, 0xf9, 0x59, 0x83, 0x51, 0x5b, 0xe4, 0xe0, + 0xb2, 0x4f, 0x31, 0x58, 0x32, 0x48, 0xf2, 0xbf, 0xb6, 0xbc, 0xff, 0x4f, 0x06, 0xe6, 0xb7, 0x02, + 0x4a, 0xfe, 0x2f, 0x7a, 0xae, 0x8f, 0x5b, 0x82, 0x71, 0x77, 0xd3, 0xc2, 0x98, 0xe9, 0xbc, 0x6e, + 0x5e, 0x4a, 0x0b, 0x53, 0xfe, 0x40, 0x09, 0xd4, 0xcc, 0x0e, 0x8a, 0x4f, 0xd6, 0xde, 0xc4, 0xdc, + 0x86, 0xd1, 0x1d, 0x62, 0xd2, 0x8c, 0x70, 0xf9, 0x63, 0x10, 0xa4, 0x88, 0xc6, 0x54, 0x12, 0x92, + 0xc9, 0x07, 0x7a, 0x90, 0x88, 0xdc, 0x1c, 0x1d, 0x1e, 0x7f, 0x9b, 0x7c, 0xcc, 0x53, 0xcd, 0xc1, + 0xf8, 0x9e, 0xe3, 0x1f, 0xe1, 0xd0, 0xfa, 0x0e, 0x4a, 0xfc, 0xaa, 0x93, 0xf9, 0xfd, 0xe8, 0x85, + 0x68, 0x10, 0xf9, 0xa3, 0x06, 0x5d, 0x4f, 0x2e, 0x03, 0xd4, 0x43, 0xc7, 0x0f, 0xb7, 0x3a, 0x2d, + 0xfc, 0x23, 0x1d, 0xed, 0x98, 0xad, 0x94, 0x58, 0x1f, 0x42, 0x5e, 0x0e, 0x81, 0x9e, 0xa7, 0x14, + 0xab, 0x8d, 0x0e, 0x67, 0x5e, 0x8b, 0x25, 0x15, 0x01, 0xa4, 0xab, 0xb0, 0x10, 0x9b, 0x0a, 0x2e, + 0x27, 0x25, 0x32, 0x61, 0xac, 0x8c, 0x05, 0x53, 0xd8, 0xf2, 0xdb, 0xaa, 0xc1, 0x6c, 0x62, 0xa6, + 0x11, 0xa2, 0xf1, 0xc1, 0xec, 0xf0, 0x49, 0x94, 0x7a, 0xbd, 0xbe, 0x49, 0xca, 0xf6, 0xb6, 0xeb, + 0x2c, 0x56, 0x8a, 0x94, 0xed, 0x6d, 0xd7, 0xab, 0xe3, 0x4c, 0x72, 0xac, 0x7f, 0x96, 0xa5, 0x47, + 0xc8, 0x04, 0x0f, 0x62, 0xee, 0x15, 0xd5, 0xc5, 0x53, 0x85, 0x3c, 0x1d, 0xf1, 0x9a, 0x88, 0x29, + 0x1c, 0x7c, 0x3f, 0x92, 0xfb, 0x65, 0xbf, 0x7c, 0x89, 0x5e, 0x8a, 0x44, 0x60, 0xe8, 0x2b, 0x98, + 0x58, 0xef, 0xb4, 0x28, 0x86, 0x91, 0x0b, 0x60, 0x10, 0x40, 0x64, 0x1e, 0x28, 0xc9, 0xc4, 0x1c, + 0xe1, 0x7e, 0x03, 0x5b, 0x29, 0xa1, 0x6c, 0x76, 0x4f, 0x5d, 0x76, 0x0b, 0x3e, 0x66, 0xb3, 0x0f, + 0xc2, 0x4d, 0x4a, 0x82, 0x78, 0x22, 0x92, 0xb7, 0xe5, 0x37, 0xb2, 0x60, 0xec, 0x89, 0xdf, 0xe2, + 0x01, 0xfb, 0x33, 0x2b, 0x53, 0xe2, 0xcd, 0x3c, 0x29, 0xb3, 0x59, 0x95, 0xf5, 0xbf, 0xe8, 0xcd, + 0x54, 0x98, 0x2a, 0x37, 0x1a, 0x57, 0x32, 0xaf, 0xcd, 0x95, 0xec, 0xab, 0x70, 0x45, 0x8e, 0x7a, + 0xc4, 0x34, 0xea, 0x51, 0xd3, 0xa8, 0xc7, 0xcc, 0xa3, 0xde, 0x80, 0x71, 0x36, 0x54, 0x74, 0x0b, + 0xc6, 0xb6, 0x42, 0x7c, 0x1a, 0xb9, 0x16, 0xd4, 0xd8, 0x02, 0x9b, 0xd5, 0x91, 0x53, 0xcf, 0xb6, + 0x13, 0x84, 0x22, 0x3a, 0x2f, 0x6f, 0x8b, 0x4f, 0xeb, 0x4f, 0x32, 0x50, 0xd8, 0x76, 0x83, 0x90, + 0x2c, 0x84, 0x73, 0xca, 0x9a, 0x1c, 0x51, 0xd6, 0x34, 0xa2, 0x91, 0xd8, 0x88, 0x3e, 0x87, 0x71, + 0x1a, 0x34, 0x1a, 0xf0, 0xe7, 0x60, 0xb7, 0xf8, 0x90, 0xe2, 0x1d, 0xb3, 0xd0, 0xd2, 0x80, 0x3e, + 0xdb, 0xb2, 0x39, 0x48, 0xe9, 0x53, 0x98, 0x54, 0x8a, 0x2f, 0xf4, 0x9a, 0xeb, 0x5b, 0x98, 0x55, + 0xba, 0x90, 0x7e, 0x88, 0x21, 0x1e, 0x78, 0xe9, 0xe1, 0x25, 0x6c, 0xdb, 0xc1, 0x3f, 0xaa, 0x6c, + 0xe3, 0x9f, 0xd6, 0x0f, 0x34, 0xe6, 0x79, 0xdb, 0x6b, 0x9e, 0x28, 0xfe, 0xcf, 0x09, 0xa6, 0xcc, + 0xe2, 0xd7, 0x08, 0xa4, 0x15, 0xab, 0xb1, 0x45, 0x0b, 0x74, 0x03, 0x26, 0xb7, 0x3a, 0x0f, 0x3c, + 0xbf, 0x89, 0x9f, 0x74, 0xda, 0x0c, 0x7b, 0xce, 0x56, 0x8b, 0xb8, 0x1b, 0x89, 0xf7, 0x10, 0xb9, + 0x91, 0x68, 0x41, 0xcc, 0x8d, 0xc4, 0x5e, 0xa3, 0xda, 0xac, 0x8e, 0x7b, 0xa9, 0xc8, 0xdf, 0x83, + 0x7c, 0x48, 0xd2, 0xd9, 0x34, 0xac, 0xe1, 0x21, 0x5c, 0xb5, 0x71, 0xb7, 0xed, 0x10, 0x5b, 0xf1, + 0xd4, 0x63, 0xed, 0xe5, 0x98, 0x6f, 0xa4, 0x84, 0xe3, 0xe9, 0x2e, 0x58, 0x49, 0x72, 0x76, 0x00, + 0xc9, 0xa7, 0x70, 0x73, 0x03, 0x87, 0xa9, 0x4f, 0x4a, 0xa3, 0xc1, 0x6f, 0x42, 0x8e, 0x3f, 0x7b, + 0x10, 0xe3, 0x1f, 0xf6, 0x9a, 0x95, 0x5f, 0x29, 0x71, 0x3c, 0xf2, 0x2f, 0xeb, 0x6b, 0x28, 0x9b, + 0xba, 0x3b, 0x5f, 0xfc, 0x94, 0x0b, 0x37, 0xcc, 0x08, 0xa4, 0x35, 0x31, 0xc1, 0x3b, 0x94, 0xa7, + 0xfe, 0xc1, 0xd4, 0xca, 0x4b, 0x06, 0x6a, 0x4f, 0xf1, 0x3f, 0xac, 0xaa, 0x08, 0xd0, 0x78, 0x0d, + 0x72, 0x1b, 0xf4, 0x1a, 0x44, 0x47, 0x10, 0xf1, 0xb5, 0x02, 0x39, 0x51, 0x16, 0xbb, 0x07, 0x49, + 0xbc, 0xd6, 0xa5, 0x0c, 0x6d, 0x09, 0x04, 0x12, 0xcc, 0xfa, 0x41, 0x5c, 0x56, 0xe8, 0x10, 0xe7, + 0x0b, 0xed, 0x3d, 0xcf, 0xed, 0x84, 0xe5, 0xc1, 0x55, 0x1d, 0xb7, 0xea, 0x26, 0x2f, 0x28, 0x6e, + 0x72, 0xe6, 0x1d, 0x27, 0x72, 0x69, 0x6f, 0xaf, 0x77, 0x5a, 0x5d, 0xcf, 0xed, 0x84, 0x7c, 0xf1, + 0xaa, 0x45, 0x68, 0x59, 0x75, 0x86, 0x4f, 0x25, 0x63, 0xa1, 0xef, 0x43, 0x29, 0xad, 0x43, 0xc5, + 0xf7, 0x23, 0xfd, 0xc9, 0xcc, 0x8e, 0xb3, 0x8e, 0x61, 0x5e, 0xcb, 0x7f, 0x12, 0x25, 0x74, 0x88, + 0xf2, 0xbe, 0xe4, 0xab, 0x5f, 0xfc, 0xa6, 0x5f, 0xfe, 0xe4, 0x22, 0x01, 0xb7, 0x02, 0xe7, 0x9e, + 0x0c, 0xe7, 0xb6, 0x16, 0x61, 0xa4, 0x66, 0x6f, 0xd3, 0x61, 0xdb, 0xdb, 0x72, 0xd8, 0xf6, 0xb6, + 0xf5, 0x47, 0x59, 0x28, 0xd7, 0x8e, 0x9d, 0xce, 0x11, 0xbb, 0x24, 0x8e, 0xcc, 0x55, 0xe5, 0xd6, + 0xf9, 0xbc, 0x47, 0xaa, 0x15, 0x98, 0xdc, 0xc1, 0x2f, 0x44, 0x28, 0x3a, 0x0f, 0xea, 0xa6, 0xd7, + 0x00, 0xe4, 0xb8, 0xd3, 0xe5, 0xe5, 0xb6, 0xda, 0x08, 0xfd, 0x85, 0x57, 0x77, 0x2e, 0xb1, 0x2c, + 0x08, 0xd1, 0x49, 0x8a, 0xd5, 0xa6, 0x1d, 0xa9, 0x0c, 0x5d, 0x24, 0xcf, 0x80, 0xa3, 0x17, 0x3f, + 0x03, 0x5a, 0xff, 0x2a, 0x03, 0x37, 0xcc, 0x1c, 0xe4, 0x3d, 0xad, 0x69, 0x09, 0x29, 0x06, 0x5c, + 0x95, 0xd3, 0x73, 0xaf, 0x92, 0x90, 0x22, 0x9e, 0x84, 0xc2, 0xc6, 0x4d, 0xef, 0x39, 0xf6, 0x5f, + 0xc6, 0x9c, 0xf5, 0xa2, 0xb8, 0x46, 0xf6, 0x2d, 0x91, 0xce, 0x87, 0x15, 0x69, 0x6f, 0x50, 0x79, + 0x99, 0xf5, 0x1f, 0x32, 0x70, 0x8d, 0xee, 0xb5, 0xdc, 0x95, 0x29, 0x2a, 0x2e, 0x1e, 0xa2, 0xf1, + 0x21, 0x4c, 0xa9, 0x9d, 0xf3, 0x59, 0xa7, 0x2f, 0xd8, 0x05, 0x05, 0x8d, 0xa6, 0xd7, 0xc2, 0xb6, + 0xd6, 0x0c, 0x6d, 0xc1, 0x24, 0xff, 0x56, 0xfc, 0x55, 0x0b, 0x4a, 0x7a, 0x1b, 0x2a, 0x54, 0xcc, + 0xfd, 0x44, 0x45, 0x88, 0x23, 0x6b, 0xd0, 0x37, 0x0a, 0x2a, 0xac, 0xf5, 0xeb, 0x2c, 0x2c, 0x1d, + 0x60, 0xdf, 0x7d, 0xf6, 0xd2, 0x30, 0x98, 0x27, 0x30, 0x2f, 0x8a, 0xe8, 0x98, 0x75, 0x61, 0x66, + 0x6f, 0x09, 0x05, 0xa9, 0x01, 0x69, 0xd0, 0x90, 0xb2, 0x9d, 0x0a, 0x78, 0x81, 0xd7, 0xb5, 0x1f, + 0x40, 0x4e, 0xae, 0x87, 0x11, 0xca, 0x19, 0x3a, 0x37, 0x62, 0x2d, 0xe8, 0x89, 0x06, 0xe4, 0xa2, + 0xf8, 0x5d, 0xf3, 0x9d, 0x08, 0x3f, 0x36, 0x0d, 0x39, 0xd1, 0xb2, 0xa5, 0x41, 0x96, 0x85, 0xa3, + 0xd4, 0xa6, 0x2c, 0x8d, 0xcd, 0x4b, 0xb6, 0xa9, 0xa7, 0xea, 0x24, 0xe4, 0x2b, 0xf4, 0xc6, 0x86, + 0x9c, 0x52, 0xfe, 0x77, 0x16, 0x96, 0x45, 0xd4, 0xa6, 0x81, 0xcd, 0xdf, 0xc2, 0xa2, 0x28, 0xaa, + 0x74, 0xbb, 0xbe, 0xf7, 0x1c, 0xb7, 0x74, 0x4e, 0xb3, 0xf7, 0xbc, 0x82, 0xd3, 0x0e, 0x6f, 0x13, + 0x31, 0xdb, 0x04, 0xfe, 0x66, 0x7c, 0x35, 0x5f, 0xe9, 0xda, 0x89, 0xcd, 0x06, 0xf5, 0x6c, 0xaa, + 0xda, 0x49, 0xcf, 0xc4, 0xa4, 0x6a, 0xaa, 0x56, 0xc2, 0xd7, 0x33, 0xfa, 0xba, 0xbe, 0x1e, 0x72, + 0xbe, 0xd5, 0x71, 0x56, 0x67, 0x60, 0x6a, 0x07, 0xbf, 0x88, 0xf8, 0xfe, 0x7b, 0x19, 0x98, 0xd6, + 0x16, 0x37, 0x7a, 0x07, 0xc6, 0xe8, 0x1f, 0x74, 0xe7, 0xe5, 0x8f, 0x9a, 0xc8, 0x02, 0xd3, 0x1e, + 0x35, 0xb1, 0xa6, 0x5b, 0x30, 0xc1, 0x22, 0x94, 0x5a, 0xe7, 0x38, 0x88, 0xc8, 0x00, 0xb8, 0x26, + 0x03, 0x61, 0x67, 0x12, 0x0e, 0x6f, 0x3d, 0x82, 0x9b, 0x3c, 0xd8, 0x49, 0x9f, 0xfc, 0x9a, 0x7a, + 0x08, 0x38, 0xe7, 0x46, 0x61, 0x39, 0xb0, 0xbc, 0x81, 0xe3, 0xaa, 0x47, 0x0b, 0x10, 0xfc, 0x1a, + 0x2e, 0x6b, 0xe5, 0x12, 0x23, 0x7d, 0xf8, 0x20, 0x65, 0x48, 0xa2, 0x8e, 0xb7, 0xb6, 0x6e, 0xa4, + 0x75, 0xa1, 0x12, 0x6b, 0x61, 0xb8, 0x4c, 0x8f, 0xdb, 0xf2, 0xda, 0x2a, 0xb8, 0x80, 0xd6, 0xbb, + 0xa3, 0xac, 0x6b, 0xa6, 0xf1, 0xd8, 0x9b, 0x59, 0xb1, 0xc7, 0xc9, 0x5a, 0x6b, 0x1a, 0x26, 0x6b, + 0x5e, 0x27, 0xc4, 0x3f, 0xd2, 0x57, 0x2b, 0xd6, 0x0c, 0x4c, 0x89, 0xaa, 0x36, 0x0e, 0x02, 0xeb, + 0x1f, 0x8d, 0x80, 0xc5, 0x19, 0x9b, 0xe6, 0x2a, 0x12, 0xfc, 0x38, 0x4c, 0x10, 0xcb, 0x37, 0x91, + 0x2b, 0xaa, 0x43, 0x2c, 0xaa, 0x65, 0x92, 0x47, 0x5f, 0x19, 0x35, 0xa3, 0x52, 0x4d, 0xf2, 0x12, + 0xa3, 0xff, 0x99, 0x41, 0x4d, 0xb2, 0xc5, 0x46, 0xf3, 0xbc, 0x18, 0xd4, 0xa4, 0x86, 0x37, 0x5d, + 0x65, 0xda, 0x1a, 0x1b, 0xf8, 0xe6, 0x8e, 0x64, 0x74, 0xbd, 0xac, 0xe1, 0xb9, 0xd1, 0x58, 0x41, + 0x23, 0x91, 0xdb, 0x4c, 0x45, 0x82, 0xf6, 0x75, 0x5e, 0xf2, 0xf5, 0x28, 0xae, 0x89, 0xd5, 0x2a, + 0x86, 0xb5, 0xab, 0x94, 0xe8, 0xa9, 0xe2, 0xb4, 0xb6, 0x8a, 0xfb, 0xef, 0xef, 0x65, 0xe0, 0x1a, + 0x9b, 0x9d, 0x5d, 0xdf, 0x7d, 0xee, 0xb6, 0xf1, 0x11, 0xd6, 0xc4, 0xb4, 0x97, 0x7e, 0xdd, 0x96, + 0x39, 0x97, 0x8e, 0xa6, 0xd9, 0x35, 0x30, 0x07, 0x37, 0x79, 0x83, 0xd3, 0xf0, 0x5b, 0xfd, 0x0c, + 0x2c, 0x8b, 0xc7, 0x7f, 0xb1, 0x3b, 0xa8, 0x8b, 0xda, 0x6c, 0x55, 0xed, 0xda, 0x28, 0x6b, 0xb8, + 0x36, 0xd2, 0xdc, 0xf1, 0xe1, 0x90, 0x7b, 0xa4, 0x91, 0xd7, 0xbe, 0x47, 0xb2, 0x7e, 0x35, 0x02, + 0xb3, 0xbb, 0xce, 0x91, 0xdb, 0x21, 0xba, 0x47, 0x24, 0xbc, 0x41, 0x95, 0x44, 0xde, 0xb0, 0xc1, + 0x61, 0x52, 0x29, 0x89, 0xc1, 0x56, 0xd4, 0x14, 0x3e, 0x59, 0x53, 0x28, 0xbe, 0x9e, 0xa8, 0xe7, + 0x53, 0xcd, 0xc5, 0x99, 0x88, 0x94, 0xa3, 0xb1, 0x28, 0x1d, 0xaf, 0x15, 0xcb, 0xa5, 0x47, 0xdd, + 0x84, 0x4f, 0x60, 0x52, 0x09, 0x77, 0xe3, 0x02, 0x9a, 0xc0, 0x40, 0xd9, 0x72, 0xd2, 0x3b, 0xc4, + 0xa9, 0x79, 0x93, 0x54, 0x0c, 0x29, 0xd9, 0x92, 0xc6, 0xde, 0x70, 0xb6, 0xa4, 0xef, 0x18, 0xc9, + 0xc2, 0x61, 0x3c, 0xce, 0xf7, 0x0d, 0x86, 0x3e, 0xe1, 0x35, 0x3e, 0x58, 0x55, 0xa8, 0x4f, 0x4b, + 0xfd, 0xa6, 0x22, 0xab, 0x02, 0xe4, 0x44, 0x92, 0x49, 0xeb, 0x7f, 0x8e, 0xc3, 0xfc, 0xb6, 0x1b, + 0x84, 0x62, 0x76, 0x83, 0x48, 0xf5, 0x4f, 0x89, 0x32, 0xe5, 0x10, 0xc4, 0xad, 0x34, 0x56, 0xde, + 0x88, 0xe5, 0xbc, 0xd4, 0x00, 0xd0, 0x87, 0xaa, 0x2b, 0x2a, 0xab, 0x64, 0xc2, 0x48, 0xa6, 0x2b, + 0x54, 0x7d, 0x54, 0xef, 0x68, 0x5e, 0x37, 0xb6, 0xaf, 0xb6, 0x49, 0x81, 0xba, 0xaf, 0x32, 0xc7, + 0xd5, 0x6a, 0xdc, 0x15, 0xc7, 0x3a, 0x60, 0x4a, 0xf1, 0x04, 0x6b, 0x26, 0xb7, 0xf4, 0x68, 0xed, + 0x4b, 0x8f, 0xd6, 0x18, 0x3d, 0x32, 0xff, 0x44, 0xf1, 0x68, 0xc5, 0x99, 0xa0, 0x7a, 0xb5, 0xd8, + 0xdb, 0xeb, 0x36, 0x2d, 0x50, 0xdf, 0x5e, 0xb3, 0x26, 0x68, 0x0f, 0xe6, 0x76, 0x7d, 0xdc, 0xa2, + 0xaa, 0x65, 0xfd, 0xc7, 0xae, 0xcf, 0x8f, 0x18, 0xd4, 0x2f, 0xca, 0xd2, 0x82, 0x75, 0x45, 0x75, + 0x03, 0xcb, 0x7a, 0x55, 0xc3, 0xa4, 0x80, 0xa3, 0x75, 0x98, 0xa9, 0x63, 0xc7, 0x6f, 0x1e, 0x3f, + 0xc2, 0x2f, 0x89, 0x62, 0x0c, 0x8a, 0x13, 0x51, 0x2a, 0x95, 0x80, 0xd6, 0x90, 0x81, 0xd2, 0x2a, + 0xf5, 0xee, 0x4a, 0x07, 0x42, 0x3f, 0x85, 0xf1, 0xba, 0xe7, 0x87, 0xd5, 0x97, 0xb1, 0xfc, 0x95, + 0xac, 0xb0, 0x7a, 0x55, 0xa4, 0x93, 0x09, 0x3c, 0x3f, 0x6c, 0x1c, 0xaa, 0x7c, 0xe3, 0x70, 0xe8, + 0x01, 0xb1, 0xba, 0x88, 0x25, 0x18, 0x3a, 0xed, 0x1a, 0x8d, 0xc1, 0x60, 0xaf, 0xe7, 0xb8, 0x65, + 0x45, 0xcd, 0xc7, 0xd0, 0x69, 0x37, 0xe8, 0x3e, 0xaf, 0xdf, 0xa2, 0xa9, 0x50, 0xe8, 0x25, 0xcc, + 0xeb, 0x82, 0xce, 0x93, 0x4d, 0x81, 0x96, 0x09, 0x2e, 0xad, 0x49, 0xf5, 0x0e, 0xa7, 0xf2, 0x46, + 0x3c, 0xcb, 0x59, 0x22, 0xff, 0x54, 0x6a, 0x17, 0xe8, 0x31, 0xcd, 0xe6, 0xc3, 0x38, 0x53, 0x09, + 0x58, 0x50, 0x17, 0x7b, 0xb2, 0x77, 0xf3, 0xac, 0x5f, 0xbe, 0xde, 0xa3, 0x29, 0x0d, 0x29, 0x47, + 0x1d, 0x16, 0x6f, 0xae, 0x72, 0x34, 0x01, 0xfa, 0x3a, 0xce, 0xcd, 0x3f, 0xce, 0xc0, 0x42, 0x4c, + 0xdc, 0xf8, 0xf9, 0xf4, 0x09, 0xe4, 0x65, 0x21, 0x77, 0xe9, 0x14, 0xe5, 0x3e, 0x1a, 0xd3, 0xc3, + 0x4c, 0xd8, 0xc5, 0x5a, 0x54, 0x89, 0x8d, 0x70, 0xa0, 0xfb, 0x31, 0x3f, 0x28, 0x3b, 0xf7, 0x74, + 0xc8, 0xa6, 0xae, 0x2f, 0x10, 0xd1, 0x0c, 0x7d, 0x0a, 0xa0, 0xcc, 0x32, 0x5b, 0x84, 0x34, 0xe2, + 0x32, 0x7d, 0x82, 0x95, 0xc6, 0xd6, 0x1f, 0x4d, 0x88, 0x6d, 0x9a, 0x9f, 0x94, 0xf7, 0x7c, 0xa7, + 0x79, 0x12, 0x85, 0xbe, 0x7e, 0x98, 0x8c, 0x33, 0x3d, 0x8f, 0x46, 0xb8, 0xad, 0xbd, 0x90, 0x37, + 0x27, 0xdb, 0x8d, 0x92, 0x25, 0x8c, 0x9c, 0x23, 0x59, 0xc2, 0x3d, 0x98, 0xd8, 0xea, 0x3c, 0x77, + 0x89, 0x51, 0xce, 0x02, 0x25, 0xa9, 0x49, 0xeb, 0xb2, 0x22, 0x95, 0x31, 0xbc, 0x15, 0xfa, 0x14, + 0x72, 0x9b, 0x5e, 0x10, 0x76, 0x44, 0x90, 0x24, 0x5f, 0x85, 0x21, 0xf5, 0x0b, 0x37, 0x8e, 0x79, + 0x95, 0xaa, 0x73, 0x44, 0x73, 0xf4, 0x11, 0x4c, 0x54, 0x5a, 0x2d, 0xb2, 0xa8, 0xb9, 0x42, 0xa0, + 0x99, 0x3a, 0x39, 0xa4, 0xc3, 0x6a, 0xd4, 0x2e, 0x79, 0x63, 0xf4, 0x85, 0xee, 0xa4, 0x9d, 0x88, + 0x52, 0x89, 0xa4, 0x67, 0xad, 0xd5, 0x1d, 0xb8, 0xef, 0x88, 0xcb, 0xb1, 0x5c, 0x94, 0x9c, 0x85, + 0x26, 0x5a, 0xd1, 0x34, 0x29, 0xbd, 0x5b, 0xdb, 0x82, 0xfc, 0x56, 0xc7, 0x0d, 0x5d, 0x9a, 0x9e, + 0x22, 0xaf, 0xed, 0xc7, 0xbb, 0x8e, 0x1f, 0xba, 0x4d, 0xb7, 0xeb, 0x74, 0x42, 0x36, 0x5b, 0xae, + 0x68, 0xa8, 0xce, 0x96, 0x84, 0x56, 0x13, 0x59, 0xc1, 0x1b, 0x4b, 0x64, 0x95, 0x9a, 0x0b, 0x6a, + 0xf2, 0xd5, 0x73, 0x41, 0xad, 0xb2, 0xb9, 0xa4, 0x36, 0xf0, 0x54, 0x24, 0x88, 0xd4, 0x77, 0xa9, + 0x1b, 0xbb, 0xb6, 0x6c, 0x88, 0x6e, 0xd0, 0x74, 0x14, 0xd3, 0x51, 0xf8, 0xb2, 0x76, 0x19, 0x9f, + 0xdd, 0x5a, 0x43, 0x0d, 0x98, 0x22, 0xad, 0x77, 0xbd, 0xb6, 0xdb, 0x74, 0x71, 0x50, 0x9c, 0xd1, + 0x9c, 0xdd, 0xfa, 0xa2, 0xa0, 0x8d, 0x5e, 0xd6, 0x71, 0xc8, 0xf6, 0x54, 0xda, 0x75, 0x97, 0x03, + 0xaa, 0x7b, 0xaa, 0x8a, 0x10, 0xfd, 0x9c, 0xec, 0x07, 0x2a, 0x16, 0x9e, 0x66, 0x76, 0x31, 0xb5, + 0x8b, 0x83, 0xf7, 0xc5, 0x46, 0xc1, 0x9e, 0xa5, 0x84, 0xac, 0x58, 0xdf, 0x28, 0x54, 0x00, 0xcb, + 0x86, 0x62, 0x74, 0x23, 0x17, 0x5b, 0xbd, 0x1f, 0x25, 0x1f, 0xbd, 0xd0, 0x14, 0x8b, 0xd1, 0xa3, + 0x17, 0x55, 0x20, 0xa2, 0xe7, 0x2f, 0xfb, 0x70, 0xcd, 0xc6, 0xa7, 0xde, 0x73, 0xfc, 0x66, 0xd1, + 0xfe, 0x0c, 0xae, 0xea, 0x08, 0xf7, 0xbb, 0x2d, 0xfa, 0x88, 0x96, 0x5d, 0xfd, 0xa5, 0x26, 0x69, + 0xe1, 0x00, 0x2c, 0x49, 0x0b, 0x7b, 0xf9, 0x4f, 0xfe, 0x54, 0xd7, 0x03, 0xad, 0xb3, 0x3c, 0x58, + 0xd2, 0x91, 0x57, 0x5a, 0x2d, 0x65, 0x21, 0x10, 0x83, 0x52, 0xf9, 0x8c, 0x59, 0xb0, 0xea, 0x8a, + 0xa1, 0x9a, 0xb3, 0x1b, 0x15, 0xa8, 0x6b, 0x55, 0x69, 0x67, 0x61, 0x28, 0xc7, 0xd9, 0x43, 0x58, + 0xa6, 0xf6, 0x59, 0x85, 0x69, 0xe5, 0x53, 0x1e, 0x08, 0xa9, 0x2a, 0x51, 0x7a, 0xd0, 0x19, 0xa6, + 0x83, 0x58, 0x4d, 0x28, 0xa5, 0x31, 0x8d, 0x2e, 0xb3, 0x97, 0x68, 0x3d, 0x5a, 0xba, 0xc3, 0xaf, + 0x5c, 0x2f, 0x1b, 0x1f, 0xe9, 0xfd, 0x9d, 0x51, 0xb8, 0xc6, 0x27, 0xe3, 0x4d, 0xce, 0x38, 0xfa, + 0x01, 0x26, 0x95, 0x39, 0xe6, 0x4c, 0xbf, 0x21, 0xa2, 0x34, 0x4c, 0xb2, 0xc0, 0xf4, 0x65, 0x8f, + 0x16, 0x34, 0x62, 0xd3, 0x4d, 0x0c, 0x63, 0x55, 0x6c, 0xda, 0x30, 0xa3, 0x4f, 0x34, 0x3f, 0x6c, + 0xdc, 0x4a, 0xed, 0x44, 0x6f, 0x2a, 0xd2, 0x15, 0xb4, 0x1a, 0xa9, 0xd3, 0x4d, 0x73, 0xe2, 0xea, + 0x42, 0xf4, 0x23, 0xcc, 0x26, 0x66, 0x99, 0x9f, 0x4d, 0x6e, 0xa7, 0x76, 0x98, 0x68, 0xcd, 0x94, + 0x9f, 0x4f, 0x8b, 0x8d, 0xdd, 0x26, 0x3b, 0x41, 0x2d, 0x98, 0x52, 0x27, 0x9e, 0x1f, 0x5e, 0x6e, + 0x0e, 0x60, 0x25, 0x6b, 0xc8, 0x54, 0x15, 0xe7, 0x25, 0x9d, 0x7b, 0x3d, 0x8d, 0xbc, 0x86, 0xb5, + 0x9a, 0x83, 0x71, 0xf6, 0x4d, 0x54, 0xc0, 0xae, 0x8f, 0x03, 0xdc, 0x69, 0x62, 0x35, 0xe0, 0xe6, + 0x75, 0x55, 0xc0, 0xbf, 0xcf, 0x40, 0x31, 0x0d, 0x6f, 0x1d, 0x77, 0x5a, 0x68, 0x17, 0x0a, 0xf1, + 0x8e, 0xb8, 0x54, 0x5b, 0xc2, 0xa2, 0x32, 0x93, 0xb4, 0x79, 0xc9, 0x4e, 0x40, 0x93, 0x4d, 0x48, + 0x29, 0xbb, 0x60, 0x64, 0x53, 0x12, 0x54, 0x71, 0x70, 0xbc, 0xfb, 0x2e, 0xe4, 0xe5, 0xcf, 0x09, + 0xa0, 0x1c, 0x8c, 0x6e, 0xed, 0x6c, 0xed, 0xb1, 0xf4, 0x74, 0xbb, 0xfb, 0x7b, 0x85, 0x0c, 0x02, + 0x18, 0x5f, 0x5b, 0xdf, 0x5e, 0xdf, 0x5b, 0x2f, 0x64, 0xdf, 0x6d, 0xa8, 0xae, 0x02, 0x74, 0x0d, + 0x16, 0xd7, 0xd6, 0x0f, 0xb6, 0x6a, 0xeb, 0x8d, 0xbd, 0x3f, 0xb7, 0xbb, 0xde, 0xd0, 0x9f, 0x57, + 0xcc, 0x43, 0x41, 0xad, 0xdc, 0x7b, 0xb2, 0xb7, 0x5b, 0xc8, 0xa0, 0x22, 0xcc, 0xab, 0xa5, 0x4f, + 0xd7, 0xab, 0x95, 0xfd, 0xbd, 0xcd, 0x9d, 0xc2, 0x88, 0x35, 0x9a, 0xcb, 0x16, 0xb2, 0xef, 0xfe, + 0xa0, 0xf9, 0x11, 0xd0, 0x12, 0x14, 0x79, 0xf3, 0xfd, 0x7a, 0x65, 0xc3, 0xdc, 0x05, 0xab, 0x7d, + 0xfc, 0xa0, 0x52, 0xc8, 0xa0, 0xeb, 0x70, 0x55, 0x2b, 0xdd, 0xad, 0xd4, 0xeb, 0x4f, 0x9f, 0xd8, + 0x6b, 0xdb, 0xeb, 0xf5, 0x7a, 0x21, 0xfb, 0xee, 0x6d, 0x1e, 0x27, 0x81, 0x66, 0x00, 0xd6, 0xd6, + 0xeb, 0xb5, 0xf5, 0x9d, 0xb5, 0xad, 0x9d, 0x8d, 0xc2, 0x25, 0x34, 0x0d, 0xf9, 0x8a, 0xfc, 0xcc, + 0xac, 0xfc, 0xae, 0x03, 0x93, 0x84, 0x9f, 0xe2, 0xd8, 0xdd, 0x80, 0xc5, 0xc7, 0x8e, 0xdb, 0x09, + 0x1d, 0xb7, 0xc3, 0xa5, 0x40, 0xcc, 0x21, 0x2a, 0x0f, 0x98, 0x54, 0x22, 0x0f, 0xa5, 0x61, 0xd1, + 0x60, 0x77, 0x32, 0xf7, 0x33, 0xa8, 0x0e, 0xf3, 0x69, 0x06, 0x2c, 0xb2, 0xf4, 0xbc, 0x17, 0x69, + 0x6a, 0xad, 0x64, 0xda, 0x83, 0xd1, 0x63, 0x98, 0x4d, 0x6c, 0xaa, 0x92, 0x5e, 0xd3, 0x76, 0x3b, + 0x08, 0x5d, 0x91, 0xba, 0x54, 0x43, 0x37, 0xbe, 0xa5, 0x06, 0xe8, 0x4a, 0x42, 0x61, 0xaf, 0x93, + 0x45, 0x63, 0x44, 0x76, 0x3f, 0x83, 0x6c, 0x98, 0x4f, 0xdb, 0x9e, 0xe5, 0x90, 0x07, 0xec, 0xdd, + 0x25, 0x43, 0x77, 0x04, 0x67, 0xda, 0x06, 0x20, 0x71, 0x0e, 0xd8, 0x1d, 0x8c, 0x38, 0xbf, 0x20, + 0xa6, 0x4f, 0xa7, 0xf5, 0x08, 0xe3, 0x6e, 0xa5, 0xed, 0x3e, 0xc7, 0x01, 0x12, 0xb1, 0x8c, 0xb2, + 0xc8, 0x04, 0x7b, 0x27, 0x83, 0x7e, 0x0b, 0x26, 0x69, 0x06, 0x63, 0x1e, 0x7a, 0x33, 0xa5, 0x66, + 0x35, 0x2e, 0x89, 0x2f, 0x5a, 0x79, 0x3f, 0x83, 0xbe, 0x84, 0x89, 0x0d, 0x4c, 0x63, 0x4f, 0xd0, + 0xcd, 0xd8, 0x0f, 0x75, 0x6c, 0x75, 0xe4, 0xb9, 0x44, 0x10, 0x1c, 0xf7, 0x23, 0xa1, 0x1a, 0xe4, + 0x38, 0x78, 0x80, 0xac, 0x18, 0x7c, 0x90, 0x82, 0x60, 0x2e, 0x86, 0x80, 0x1c, 0x0d, 0x51, 0x0d, + 0xf2, 0x32, 0x00, 0x06, 0x2d, 0x1a, 0xa2, 0x6e, 0x4a, 0xc5, 0x64, 0x05, 0xf7, 0x4d, 0x8e, 0xfc, + 0xcd, 0x6c, 0x06, 0xdd, 0x03, 0x60, 0xef, 0x1c, 0xe9, 0x58, 0xe2, 0x84, 0x96, 0x12, 0x0c, 0x44, + 0x1b, 0x44, 0xb7, 0xb4, 0x71, 0x88, 0xcf, 0x3b, 0x78, 0xd3, 0x6c, 0x6d, 0xc3, 0x8c, 0x7c, 0x75, + 0x78, 0x7e, 0x4e, 0x98, 0xb0, 0x7d, 0x46, 0x56, 0x10, 0x7b, 0xf6, 0x2f, 0x23, 0x4e, 0x91, 0x29, + 0x06, 0x55, 0x4e, 0x27, 0x6b, 0xa6, 0xc0, 0xca, 0xf4, 0xd0, 0x12, 0x36, 0x9e, 0x30, 0x3a, 0x06, + 0x8b, 0xa1, 0xa4, 0xf6, 0xab, 0x47, 0x9f, 0xa2, 0x1b, 0x0a, 0x01, 0xa9, 0x41, 0xb3, 0xa5, 0x9b, + 0x03, 0x5a, 0xb0, 0x79, 0xa2, 0x5a, 0xe7, 0x21, 0x4c, 0x6b, 0xf1, 0x8a, 0x48, 0x3c, 0x7c, 0x48, + 0x0b, 0x28, 0x2d, 0x2d, 0xa5, 0x57, 0x72, 0x0f, 0xc2, 0x03, 0xaa, 0x6c, 0x62, 0xe9, 0x18, 0x4b, + 0x69, 0x69, 0x17, 0x99, 0x5b, 0xa4, 0x24, 0x52, 0xeb, 0xc4, 0x40, 0xd6, 0x61, 0x4e, 0x5e, 0x34, + 0x29, 0xbf, 0x71, 0x61, 0x48, 0xe0, 0x68, 0x9c, 0xb9, 0xaf, 0x61, 0x8e, 0xcb, 0x81, 0x86, 0xa6, + 0x20, 0x95, 0x0b, 0xcf, 0xf5, 0x67, 0x44, 0xf0, 0x10, 0x16, 0xea, 0xb1, 0xf1, 0x30, 0x5b, 0xed, + 0xaa, 0x8e, 0x42, 0x49, 0xdd, 0x68, 0xc4, 0xf5, 0x08, 0x50, 0xbd, 0x77, 0x78, 0xea, 0x4a, 0x74, + 0xcf, 0x5d, 0xfc, 0x02, 0x5d, 0x8f, 0x0d, 0x89, 0x14, 0xd2, 0x66, 0x54, 0x3b, 0x95, 0x0c, 0x23, + 0x46, 0x7b, 0x2c, 0x0f, 0x04, 0xcb, 0x69, 0xe5, 0x74, 0x9d, 0x43, 0xb7, 0xed, 0x86, 0xe4, 0x8c, + 0x76, 0x43, 0x03, 0x50, 0xab, 0xc4, 0x0c, 0x5e, 0x35, 0xb6, 0x40, 0x5f, 0xc1, 0xf4, 0x06, 0x0e, + 0xa3, 0xec, 0x94, 0x68, 0x31, 0x91, 0xcf, 0x92, 0xcf, 0x9b, 0x08, 0x39, 0xd0, 0x53, 0x62, 0x6e, + 0x41, 0x81, 0x29, 0x57, 0x05, 0xc5, 0xf5, 0x04, 0x0a, 0xde, 0xc4, 0xf1, 0x9d, 0xd3, 0xc0, 0xc8, + 0xad, 0x7b, 0x30, 0xba, 0xeb, 0x76, 0x8e, 0x90, 0xb8, 0x41, 0x50, 0xb2, 0xbb, 0x95, 0xe6, 0xb4, + 0x32, 0x2e, 0x7a, 0x87, 0x50, 0x66, 0x69, 0x19, 0x93, 0xa9, 0x10, 0x45, 0xee, 0xf9, 0xb7, 0x64, + 0x98, 0xf1, 0x80, 0xf4, 0x8d, 0x92, 0x3f, 0xf1, 0xfa, 0x83, 0x55, 0xb4, 0x4b, 0xb9, 0x9e, 0xec, + 0x00, 0xdd, 0x8a, 0xf6, 0x53, 0x63, 0x26, 0xc6, 0x12, 0x8a, 0x23, 0x3e, 0x58, 0x45, 0x32, 0x7d, + 0x44, 0x0a, 0xd2, 0xdb, 0xda, 0xb6, 0x7f, 0x31, 0xbc, 0x5f, 0x41, 0x5e, 0xa6, 0x21, 0x94, 0xfa, + 0x26, 0x9e, 0x3b, 0x51, 0x2a, 0xf0, 0x64, 0xc6, 0xc2, 0x2f, 0x58, 0xc6, 0x50, 0x1d, 0x3e, 0x9e, + 0xa9, 0xcf, 0x38, 0x79, 0x9f, 0xc2, 0xa4, 0x92, 0xa3, 0x4f, 0x2e, 0x96, 0x64, 0xde, 0xbe, 0x92, + 0xfe, 0x5b, 0x46, 0xf7, 0xc9, 0xa6, 0x31, 0xc1, 0x93, 0xc2, 0xa2, 0x85, 0x08, 0x4c, 0x49, 0x51, + 0x16, 0x03, 0x41, 0xab, 0x74, 0xbf, 0x63, 0x1d, 0x5d, 0xd1, 0x21, 0xcc, 0xbd, 0xac, 0x02, 0xb0, + 0x31, 0xd3, 0x8e, 0xf4, 0x6a, 0xe3, 0xa8, 0x56, 0xc9, 0x7e, 0xd6, 0xba, 0x20, 0xd0, 0x57, 0x62, + 0x4f, 0xa3, 0x40, 0x45, 0x8d, 0x93, 0xea, 0xa8, 0x4c, 0xf0, 0x5b, 0x50, 0xa8, 0x34, 0xa9, 0x96, + 0x95, 0x59, 0xd3, 0xd0, 0xb2, 0x5c, 0xc1, 0x7a, 0x85, 0xc0, 0xb5, 0x10, 0x4f, 0xc2, 0xb6, 0x8d, + 0x1d, 0x1a, 0x08, 0xb9, 0x28, 0xf7, 0xda, 0x58, 0x55, 0x3a, 0x84, 0x91, 0xa8, 0x75, 0x98, 0xaf, + 0x39, 0x9d, 0x26, 0x6e, 0xbf, 0x1e, 0x9a, 0xcf, 0xa8, 0xba, 0x51, 0x32, 0xca, 0x5d, 0x89, 0xc3, + 0x73, 0x6d, 0x33, 0x2b, 0xcf, 0x86, 0xb2, 0x69, 0x05, 0x2e, 0x33, 0x26, 0x46, 0x6c, 0x31, 0x41, + 0x9b, 0xba, 0xff, 0x18, 0x66, 0xd6, 0x89, 0x3a, 0xee, 0xb5, 0x5c, 0x16, 0x33, 0x8f, 0xf4, 0x20, + 0x68, 0x23, 0xe0, 0xa6, 0xc8, 0xf1, 0xa9, 0xa4, 0x5a, 0x93, 0x42, 0x9e, 0xcc, 0x66, 0x57, 0x9a, + 0x17, 0x68, 0xd5, 0xac, 0x6c, 0x74, 0xef, 0x3d, 0x12, 0xe9, 0x7c, 0x62, 0x09, 0xb4, 0x54, 0x85, + 0x62, 0x4c, 0xaf, 0x55, 0x7a, 0x6b, 0x70, 0x23, 0xd5, 0x16, 0xb3, 0x61, 0xd1, 0x90, 0x9c, 0x0c, + 0xbd, 0x2d, 0xcd, 0xe2, 0x41, 0xc9, 0xcb, 0x52, 0xcc, 0xb5, 0x6f, 0x95, 0x14, 0x35, 0x06, 0x9c, + 0x83, 0xb3, 0x96, 0x19, 0x19, 0x2c, 0xe3, 0x42, 0x53, 0xb3, 0x8b, 0xa1, 0x77, 0x74, 0xec, 0x03, + 0x32, 0x90, 0x19, 0x7b, 0x78, 0x42, 0x45, 0x2f, 0x4a, 0x6e, 0x25, 0x8d, 0x9e, 0xb4, 0x0c, 0x64, + 0xd2, 0xe8, 0x49, 0x4d, 0x0d, 0xc6, 0x18, 0xbc, 0x01, 0x97, 0x63, 0x79, 0xbe, 0xd0, 0xf5, 0x38, + 0x63, 0x87, 0x30, 0x94, 0x21, 0x7a, 0x2c, 0x04, 0x3b, 0x89, 0x28, 0x3d, 0xf3, 0x97, 0x69, 0x8c, + 0x0c, 0xdd, 0xbe, 0x34, 0x81, 0xd4, 0x5c, 0x5e, 0xe8, 0x66, 0x0a, 0x0b, 0xcf, 0xc7, 0x3a, 0x86, + 0xb6, 0x0e, 0x85, 0x78, 0x2a, 0x2c, 0xb4, 0x2c, 0xb9, 0x94, 0x9a, 0xef, 0xab, 0x54, 0x36, 0xd6, + 0xf3, 0x4d, 0xe7, 0x61, 0x34, 0x29, 0xec, 0x02, 0x32, 0x3e, 0x29, 0x6a, 0x1a, 0xa4, 0xc4, 0xa4, + 0xe8, 0x39, 0x89, 0x36, 0x68, 0x34, 0xbb, 0x92, 0xef, 0xc8, 0x78, 0x3a, 0xbd, 0x9e, 0x86, 0x27, + 0xba, 0x14, 0xab, 0x8b, 0x9c, 0xc3, 0x0a, 0x5d, 0xcb, 0xda, 0xbe, 0x99, 0x24, 0xad, 0x6c, 0xac, + 0x97, 0x23, 0x2d, 0xc4, 0xb3, 0x3b, 0x49, 0xa4, 0x86, 0xb4, 0x4f, 0x46, 0x51, 0x7e, 0x00, 0xf3, + 0xfa, 0x2c, 0x0e, 0x19, 0xaf, 0x09, 0xcf, 0x1e, 0x2c, 0xa4, 0x26, 0x8a, 0x92, 0xba, 0x68, 0x50, + 0x1a, 0xa9, 0x01, 0x16, 0xf4, 0xb4, 0x96, 0xdf, 0x09, 0x89, 0x5b, 0xd6, 0x58, 0x2a, 0xa9, 0xc4, + 0x9c, 0xa6, 0xe4, 0x99, 0x62, 0x73, 0xaa, 0xe4, 0x8a, 0x3a, 0xcf, 0x9c, 0xa6, 0xa5, 0x96, 0x92, + 0xec, 0x57, 0xe8, 0x12, 0x9b, 0x6a, 0xbc, 0xe2, 0x22, 0xec, 0x3f, 0x0f, 0x69, 0x26, 0x3c, 0x6b, + 0xd4, 0x66, 0x92, 0x3f, 0x10, 0x77, 0x55, 0x63, 0x93, 0xb6, 0x8e, 0x4a, 0xda, 0xe0, 0xf4, 0x25, + 0x54, 0x83, 0x29, 0x35, 0x55, 0x95, 0x91, 0x8a, 0x6b, 0x49, 0x1c, 0x81, 0x72, 0x8a, 0x9b, 0x91, + 0x5c, 0x60, 0xd4, 0x2c, 0xc5, 0x99, 0xa3, 0x11, 0x64, 0x1e, 0x12, 0x52, 0x59, 0x33, 0x84, 0x24, + 0xb3, 0xb1, 0x31, 0xc7, 0xcc, 0x2e, 0xfd, 0xf7, 0x03, 0x0d, 0x3f, 0x43, 0x68, 0x44, 0xb3, 0x4f, + 0x5f, 0xde, 0xa8, 0x79, 0xa7, 0x90, 0x22, 0x25, 0x29, 0xf9, 0xa8, 0x4a, 0xcb, 0xa6, 0x6a, 0x55, + 0xef, 0x7f, 0x03, 0xb3, 0x89, 0xfc, 0x5a, 0xd2, 0xbd, 0x66, 0xca, 0xbc, 0x35, 0x58, 0xb7, 0x6e, + 0x92, 0x01, 0xc7, 0x00, 0x0f, 0x56, 0x86, 0x23, 0x4d, 0xee, 0xd0, 0xdb, 0xe2, 0xb1, 0x4e, 0x1a, + 0x71, 0xa6, 0x2c, 0x5e, 0xc3, 0x15, 0x44, 0x2c, 0x7f, 0x57, 0x4c, 0x41, 0xa4, 0x67, 0xf7, 0x32, + 0x62, 0xfd, 0x39, 0xcd, 0xe7, 0x1d, 0xcb, 0x0d, 0x25, 0xbd, 0x1b, 0xc6, 0x7c, 0x60, 0xd2, 0xbb, + 0x61, 0x4e, 0xd4, 0xc5, 0xb8, 0xb9, 0x0d, 0xf3, 0x69, 0xd9, 0xb6, 0x14, 0x6f, 0xa0, 0x31, 0x15, + 0x57, 0x0a, 0x47, 0x6d, 0xb1, 0xda, 0x0d, 0xd8, 0x06, 0xe4, 0xde, 0x32, 0x72, 0xe0, 0x3b, 0x91, + 0x51, 0x2d, 0x99, 0x23, 0x4b, 0x9e, 0x01, 0x87, 0x24, 0xd1, 0x1a, 0x60, 0xaa, 0x5e, 0xae, 0xbb, + 0x47, 0x1d, 0x25, 0x05, 0x95, 0x34, 0x54, 0x93, 0x69, 0xb4, 0xa4, 0x66, 0x49, 0xcb, 0x58, 0xf5, + 0x04, 0xe6, 0xc5, 0xc6, 0xad, 0xa6, 0x4a, 0x42, 0x25, 0x73, 0xae, 0x26, 0xa9, 0x65, 0x52, 0x73, + 0x2b, 0xb1, 0x93, 0x1e, 0xfd, 0x01, 0x32, 0xe5, 0xa4, 0xa7, 0xe4, 0x30, 0x2a, 0xe9, 0xe9, 0x8e, + 0xd0, 0xe7, 0xf4, 0xa4, 0xc7, 0x12, 0x7e, 0x9a, 0x5d, 0xcd, 0x1a, 0xa6, 0x48, 0xa7, 0xad, 0x0a, + 0x67, 0x24, 0xed, 0x50, 0xc7, 0x3c, 0xfc, 0xf0, 0x46, 0x81, 0xf4, 0xc3, 0x9b, 0x4a, 0xa8, 0xd9, + 0xe5, 0x33, 0xa5, 0xbe, 0xda, 0x97, 0xbc, 0x4a, 0x49, 0xef, 0x21, 0x79, 0x95, 0x96, 0x34, 0x83, + 0x9e, 0x15, 0xf6, 0x84, 0x61, 0x18, 0xe1, 0xbb, 0x3e, 0x30, 0xeb, 0x45, 0x69, 0x79, 0x70, 0xaa, + 0x08, 0x7e, 0xe7, 0x50, 0x88, 0x27, 0x16, 0x40, 0x69, 0x49, 0x4b, 0x94, 0xec, 0x0a, 0xd2, 0xbc, + 0x31, 0x66, 0x24, 0xd8, 0x15, 0x46, 0xa7, 0x8e, 0xd7, 0x90, 0xba, 0x42, 0x45, 0x3d, 0xd8, 0x8c, + 0x88, 0x72, 0x0c, 0xa8, 0xa6, 0x61, 0x22, 0x87, 0x81, 0x6a, 0x46, 0xa4, 0xa4, 0x25, 0x70, 0x45, + 0x9c, 0x50, 0x7a, 0x22, 0xac, 0x77, 0x74, 0xe3, 0x6d, 0x40, 0x40, 0xf6, 0xd0, 0x5b, 0x1d, 0xf4, + 0x3b, 0x22, 0xff, 0x69, 0x32, 0x4d, 0xcc, 0xdb, 0x31, 0xef, 0x4e, 0x7a, 0x08, 0x6f, 0x69, 0x50, + 0x16, 0x1a, 0xf4, 0x98, 0xbe, 0xf5, 0x7c, 0xb2, 0xb5, 0x56, 0xe3, 0x3f, 0x33, 0xec, 0xf9, 0x09, + 0xb7, 0xb9, 0xf2, 0x53, 0x39, 0x11, 0x93, 0x59, 0x13, 0x0d, 0xf0, 0x60, 0x15, 0xd5, 0xa9, 0xf7, + 0x56, 0x2b, 0x4d, 0xf1, 0x9c, 0xa7, 0x20, 0x2c, 0xa5, 0x23, 0xa4, 0x57, 0x09, 0xeb, 0x62, 0x37, + 0xd3, 0xc9, 0x34, 0xd0, 0x30, 0xc8, 0x0a, 0x60, 0x62, 0x93, 0x8e, 0x46, 0x50, 0x37, 0x4c, 0x8e, + 0x18, 0xc7, 0xea, 0x95, 0xc7, 0xdb, 0xaf, 0xc4, 0x31, 0x0d, 0xf0, 0x60, 0x85, 0x73, 0x4c, 0x2b, + 0xbd, 0x18, 0xc7, 0x62, 0x08, 0x75, 0x8e, 0xe9, 0x64, 0x1a, 0x68, 0x18, 0xce, 0xb1, 0x74, 0x34, + 0xe7, 0xe5, 0xd8, 0x37, 0x74, 0x7f, 0xde, 0xa0, 0x2f, 0x0f, 0x2f, 0xc4, 0xb3, 0xa2, 0xb0, 0x60, + 0x75, 0xd0, 0x83, 0x55, 0xf4, 0x94, 0xa6, 0x66, 0x8d, 0x95, 0x9f, 0x8f, 0x6f, 0x4b, 0x26, 0xa4, + 0x94, 0x73, 0x5b, 0xb0, 0xc0, 0x38, 0x17, 0x27, 0xd7, 0x48, 0x8b, 0x71, 0xd8, 0x1b, 0xc2, 0xd8, + 0x89, 0xa3, 0xba, 0x28, 0xff, 0xd6, 0xa8, 0x88, 0xec, 0xf9, 0xc4, 0x3e, 0x6d, 0x25, 0x8d, 0x57, + 0x1d, 0x89, 0xf0, 0xb7, 0xeb, 0xcd, 0x0f, 0x56, 0xd0, 0x16, 0x9d, 0x05, 0xbd, 0x78, 0x90, 0x75, + 0x9f, 0x8e, 0x86, 0x32, 0x69, 0x53, 0x18, 0x44, 0x31, 0x9a, 0x4c, 0x7d, 0x9b, 0x89, 0x92, 0x47, + 0x9f, 0x73, 0x8e, 0xce, 0xc4, 0x22, 0xb6, 0xb1, 0xb3, 0x93, 0xc6, 0x30, 0xce, 0xc4, 0x7f, 0xa2, + 0x1f, 0xfd, 0x14, 0xf2, 0x02, 0x78, 0x38, 0x43, 0xe2, 0xd0, 0x94, 0x21, 0x5f, 0xc1, 0x24, 0x67, + 0x08, 0xa5, 0xc0, 0xd4, 0x93, 0x91, 0xfc, 0x2f, 0x61, 0x92, 0xb3, 0x61, 0xe0, 0x08, 0xcc, 0x97, + 0x95, 0x0b, 0x1b, 0x38, 0x4c, 0xf9, 0x09, 0xe9, 0x61, 0x83, 0x49, 0xfb, 0xc5, 0x6a, 0x74, 0x40, + 0xdf, 0x6c, 0x9b, 0x7e, 0xee, 0xdb, 0x84, 0x72, 0xe8, 0x8f, 0x8d, 0x13, 0xbc, 0x75, 0x33, 0xde, + 0xa1, 0xf0, 0xc6, 0xd1, 0xef, 0xc0, 0x12, 0xbd, 0xd9, 0xb8, 0x28, 0xc5, 0xe6, 0x43, 0xca, 0xd5, + 0x28, 0xa8, 0x21, 0xfe, 0x4b, 0xe3, 0x26, 0x64, 0xc3, 0x7e, 0xe4, 0x9c, 0x60, 0xad, 0x1b, 0xb1, + 0x0e, 0x83, 0x1e, 0xb0, 0x19, 0x5d, 0xa3, 0x63, 0xbf, 0x20, 0xb5, 0x83, 0x35, 0x4d, 0xec, 0xa7, + 0xcf, 0x87, 0xc5, 0x64, 0xc4, 0x7f, 0x5c, 0x9d, 0x60, 0xa9, 0x27, 0xb0, 0x98, 0x5a, 0x0f, 0xda, + 0x7c, 0xe8, 0xd0, 0xce, 0x49, 0x8d, 0xf9, 0xca, 0x25, 0x2f, 0x13, 0xda, 0x20, 0xc5, 0xb6, 0xd7, + 0xd2, 0xb5, 0x94, 0xa6, 0xd5, 0x08, 0x8a, 0x00, 0x55, 0xd8, 0x1e, 0xaf, 0x26, 0x76, 0x51, 0x7c, + 0x93, 0xa9, 0x19, 0x5f, 0xe2, 0x28, 0xd8, 0xd9, 0x84, 0xfe, 0x1e, 0xbb, 0x72, 0x36, 0x51, 0x52, + 0x5e, 0x94, 0xf4, 0x84, 0x14, 0x5c, 0x85, 0xd1, 0xac, 0x14, 0xea, 0x2d, 0x94, 0x9a, 0xf4, 0x42, + 0x3d, 0x9b, 0xe8, 0xe9, 0x39, 0xe4, 0xd9, 0x84, 0x76, 0xa8, 0x63, 0x1e, 0x7e, 0x36, 0xa1, 0x40, + 0xfa, 0xd9, 0x44, 0x25, 0xd4, 0xbc, 0xf0, 0x50, 0x32, 0x3f, 0x87, 0x3c, 0x77, 0x1b, 0x53, 0x77, + 0x0c, 0xb8, 0xa8, 0x9a, 0x4b, 0xc9, 0xc4, 0x24, 0x6d, 0x7e, 0x73, 0x96, 0xa6, 0x92, 0x7e, 0xeb, + 0x72, 0x3f, 0x83, 0x76, 0x68, 0x82, 0xf4, 0xb4, 0x9f, 0xa9, 0x37, 0xc9, 0xcf, 0xc0, 0xdf, 0xc5, + 0x27, 0xf8, 0xea, 0xe9, 0xf8, 0x06, 0xc2, 0x0d, 0x38, 0xd6, 0x5d, 0xe5, 0x71, 0x2a, 0x17, 0x20, + 0xd1, 0x2c, 0xe2, 0x13, 0xcc, 0xf3, 0x6c, 0x06, 0x2d, 0xa8, 0xbf, 0x0b, 0x4f, 0xb7, 0xac, 0xbb, + 0x30, 0xce, 0x80, 0x8c, 0xbb, 0x8d, 0xf6, 0x5b, 0xf2, 0xe8, 0x7d, 0x71, 0x1d, 0x4c, 0x40, 0xb4, + 0x2a, 0x23, 0x5d, 0xef, 0x43, 0x9e, 0xb9, 0xdd, 0xce, 0x0f, 0xf2, 0xb9, 0xb8, 0x34, 0x1e, 0x44, + 0x98, 0x39, 0x56, 0x63, 0x5a, 0x75, 0x63, 0x5f, 0x9c, 0x91, 0x5f, 0x52, 0xd7, 0xa7, 0x70, 0x35, + 0x98, 0xe1, 0x17, 0x12, 0xbf, 0xfb, 0x4f, 0x59, 0xfa, 0x09, 0xf5, 0xbf, 0xca, 0x94, 0x66, 0x26, + 0xf2, 0x67, 0x13, 0xd0, 0xe8, 0x73, 0x98, 0x61, 0xcc, 0x95, 0xc0, 0xc9, 0x46, 0x03, 0x78, 0x36, + 0xc3, 0xd8, 0xfc, 0x2a, 0xc0, 0x3f, 0x15, 0x8e, 0xda, 0xa1, 0x64, 0x9f, 0xc7, 0x45, 0x3b, 0x9c, + 0x75, 0x26, 0x2c, 0xbf, 0x43, 0x37, 0xdd, 0xf4, 0x3c, 0x3c, 0x46, 0x64, 0x77, 0x14, 0x17, 0xf4, + 0xe0, 0x0c, 0x3e, 0x27, 0x34, 0xe6, 0x30, 0xb5, 0x91, 0x74, 0x90, 0x0d, 0x49, 0xcc, 0x53, 0xfa, + 0xc9, 0xd0, 0x76, 0xd2, 0xcf, 0xc5, 0xb3, 0xf3, 0xa7, 0xf7, 0x37, 0x24, 0x1b, 0x4f, 0x8a, 0xcb, + 0xd0, 0x90, 0xe4, 0x46, 0x20, 0xd4, 0x2f, 0x33, 0x07, 0x8e, 0xc1, 0x7c, 0x44, 0x8b, 0x92, 0xec, + 0x5f, 0x70, 0x12, 0xcc, 0x66, 0x14, 0x4a, 0xa6, 0xfe, 0x41, 0x83, 0x5e, 0xc8, 0xa9, 0x0e, 0x59, + 0x53, 0xca, 0xa0, 0x0d, 0x11, 0xe0, 0x1a, 0x7b, 0x6e, 0x6a, 0x7a, 0xb8, 0x3a, 0xe0, 0x74, 0xc6, + 0x43, 0x3c, 0xdf, 0x08, 0xa2, 0xe4, 0x6c, 0x5f, 0x1c, 0x91, 0x74, 0x0c, 0xc7, 0x10, 0x59, 0x03, + 0xa6, 0x77, 0xb8, 0xd3, 0xab, 0x68, 0x98, 0xd7, 0x8b, 0x4f, 0xa8, 0x13, 0x05, 0x13, 0x26, 0xf3, + 0x13, 0xc9, 0x6d, 0xdf, 0x98, 0x2b, 0x49, 0xce, 0xee, 0x80, 0xe4, 0x46, 0xb5, 0xe8, 0xe7, 0x91, + 0xb4, 0x84, 0x46, 0x35, 0x7b, 0x5b, 0xba, 0xeb, 0xd2, 0x32, 0x1d, 0x95, 0x40, 0x54, 0xda, 0xdb, + 0x64, 0xad, 0x9b, 0xf2, 0xe8, 0x44, 0x01, 0x51, 0x83, 0x53, 0x15, 0xc9, 0xb5, 0x3e, 0x34, 0x21, + 0xcf, 0x0e, 0xcc, 0xa7, 0xe5, 0xbf, 0x91, 0x93, 0x36, 0x20, 0x39, 0x4e, 0x6a, 0xd4, 0xd5, 0x2e, + 0x2c, 0xa4, 0xe6, 0xa0, 0x91, 0x37, 0x24, 0x83, 0x32, 0xd4, 0xa4, 0x62, 0xfc, 0x16, 0x16, 0x0d, + 0x09, 0x57, 0x22, 0x07, 0xe2, 0xc0, 0x84, 0x2c, 0x46, 0x81, 0xf8, 0x1e, 0x4a, 0xe6, 0x5c, 0x1e, + 0xe8, 0x8e, 0xee, 0x04, 0x35, 0x67, 0xd0, 0x28, 0xa5, 0x26, 0x1f, 0x42, 0x7b, 0x34, 0xb9, 0x62, + 0x5a, 0x72, 0x0f, 0x49, 0xf7, 0xe0, 0xe4, 0x1f, 0x86, 0x68, 0xb9, 0x45, 0x43, 0x3e, 0x8f, 0x01, + 0x58, 0xcf, 0x41, 0xed, 0x8e, 0xd0, 0x4b, 0x7a, 0x82, 0x87, 0x58, 0xe0, 0x7d, 0x6a, 0xf6, 0x87, + 0x54, 0x3a, 0x1f, 0xc2, 0xb4, 0xf6, 0xc2, 0x56, 0x8a, 0x7f, 0xda, 0x33, 0x6f, 0xe9, 0xad, 0x4e, + 0x7d, 0x94, 0x5b, 0x2d, 0xfc, 0xf2, 0xbf, 0x2f, 0x67, 0x7e, 0xf9, 0xeb, 0xe5, 0xcc, 0x7f, 0xf9, + 0xf5, 0x72, 0xe6, 0x57, 0xbf, 0x5e, 0xce, 0x1c, 0x8e, 0xd3, 0xe6, 0xab, 0xff, 0x2f, 0x00, 0x00, + 0xff, 0xff, 0x21, 0x6d, 0x66, 0x44, 0xa2, 0x93, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -25584,6 +25608,18 @@ func (m *CreateSessionTrackerRequest) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.SessionTracker != nil { + { + size, err := m.SessionTracker.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } if len(m.HostPolicies) > 0 { for iNdEx := len(m.HostPolicies) - 1; iNdEx >= 0; iNdEx-- { { @@ -25619,12 +25655,12 @@ func (m *CreateSessionTrackerRequest) MarshalToSizedBuffer(dAtA []byte) (int, er i-- dAtA[i] = 0x5a } - n101, err101 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err101 != nil { - return 0, err101 + n102, err102 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err102 != nil { + return 0, err102 } - i -= n101 - i = encodeVarintAuthservice(dAtA, i, uint64(n101)) + i -= n102 + i = encodeVarintAuthservice(dAtA, i, uint64(n102)) i-- dAtA[i] = 0x52 if m.Initiator != nil { @@ -25898,12 +25934,12 @@ func (m *SessionTrackerUpdateExpiry) MarshalToSizedBuffer(dAtA []byte) (int, err copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n104, err104 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err104 != nil { - return 0, err104 + n105, err105 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err105 != nil { + return 0, err105 } - i -= n104 - i = encodeVarintAuthservice(dAtA, i, uint64(n104)) + i -= n105 + i = encodeVarintAuthservice(dAtA, i, uint64(n105)) i-- dAtA[i] = 0xa } @@ -29850,6 +29886,10 @@ func (m *CreateSessionTrackerRequest) Size() (n int) { n += 1 + l + sovAuthservice(uint64(l)) } } + if m.SessionTracker != nil { + l = m.SessionTracker.Size() + n += 1 + l + sovAuthservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -48280,6 +48320,42 @@ func (m *CreateSessionTrackerRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionTracker", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SessionTracker == nil { + m.SessionTracker = &types.SessionTrackerV1{} + } + if err := m.SessionTracker.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) diff --git a/api/client/proto/authservice.proto b/api/client/proto/authservice.proto index 17bb10a1233e6..693bbe6e2f2ab 100644 --- a/api/client/proto/authservice.proto +++ b/api/client/proto/authservice.proto @@ -1538,35 +1538,45 @@ message ListResourcesResponse { // This is not specific to any session type. Relevant fields should be set for a given session type. message CreateSessionTrackerRequest { // Namespace is a session namespace, separating sessions from each other. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string Namespace = 1 [ (gogoproto.jsontag) = "namespace,omitempty" ]; // Type describes what type of session this is. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string Type = 2 [ (gogoproto.jsontag) = "type,omitempty" ]; // Reason is an arbitrary string that may be used to describe the session and/or it's // purpose. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string Reason = 3 [ (gogoproto.jsontag) = "reason,omitempty" ]; // Invited is a list of invited users, this field is interpreted by different // clients on a best-effort basis and used for delivering notifications to invited users. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. repeated string Invited = 4 [ (gogoproto.jsontag) = "invited,omitempty" ]; // Hostname is the address of the target this session is connected to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string Hostname = 5 [ (gogoproto.jsontag) = "target_hostname,omitempty" ]; // Address is the address of the target this session is connected to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string Address = 6 [ (gogoproto.jsontag) = "target_address,omitempty" ]; // ClusterName is the name of cluster that this session belongs to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string ClusterName = 7 [ (gogoproto.jsontag) = "cluster_name,omitempty" ]; // Login is the local login/user on the target used by the session. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string Login = 8 [ (gogoproto.jsontag) = "login,omitempty" ]; // Initiator is the participant that initiated the session. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. types.Participant Initiator = 9 [ (gogoproto.jsontag) = "initiator,omitempty" ]; // Expires encodes the time at which this session expires and becomes invalid. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. google.protobuf.Timestamp Expires = 10 [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false, @@ -1574,19 +1584,27 @@ message CreateSessionTrackerRequest { ]; // The Kubernetes cluster this session belongs to. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string KubernetesCluster = 11 [ (gogoproto.jsontag) = "kubernetes_cluster,omitempty" ]; // HostUser is the user regarded as the owner of this session, RBAC checks are performed // against the require policies of this user. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string HostUser = 12 [ (gogoproto.jsontag) = "host_user,omitempty" ]; // ID is the ID of the session. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. string ID = 13 [ (gogoproto.jsontag) = "id,omitempty" ]; // HostPolicies is a list of RBAC policy sets held by the host user at the time of session // creation. + // DELETE IN V11 - deprecated/reserve in favor of SessionTracker field. repeated types.SessionTrackerPolicySet HostPolicies = 14 [ (gogoproto.jsontag) = "host_policies,omitempty" ]; + + // SessionTracker is the session tracker to be created. + types.SessionTrackerV1 SessionTracker = 15 + [ (gogoproto.jsontag) = "session_tracker,omitempty" ]; } // GetSessionTrackerRequest is a request to fetch a session resource. diff --git a/api/defaults/defaults.go b/api/defaults/defaults.go index 796df97b67cb3..3b7d7f3264c76 100644 --- a/api/defaults/defaults.go +++ b/api/defaults/defaults.go @@ -48,6 +48,9 @@ const ( // deviation added to this time to avoid lots of simultaneous // heartbeats coming to auth server ServerAnnounceTTL = 600 * time.Second + + // SessionTrackerTTL defines the default base ttl of a session tracker. + SessionTrackerTTL = time.Hour ) var ( diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index 5d2389993a785..6f2204d53ae49 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -1655,7 +1655,9 @@ func (m *AccessRequestCreate) XXX_DiscardUnknown() { var xxx_messageInfo_AccessRequestCreate proto.InternalMessageInfo -// ResourceID is a unique identifier for a teleport resource. +// ResourceID is a unique identifier for a teleport resource. This is duplicated +// from api/types/types.proto to decouple the api and events types and because +// neither file currently imports the other. type ResourceID struct { // ClusterName is the name of the cluster the resource is in. ClusterName string `protobuf:"bytes,1,opt,name=ClusterName,proto3" json:"cluster"` diff --git a/api/types/session_tracker.go b/api/types/session_tracker.go index 0ca66ebb864cf..37ad0984b2722 100644 --- a/api/types/session_tracker.go +++ b/api/types/session_tracker.go @@ -19,15 +19,20 @@ package types import ( "time" + "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/trace" ) const ( - SSHSessionKind SessionKind = "ssh" - KubernetesSessionKind SessionKind = "k8s" - SessionObserverMode SessionParticipantMode = "observer" - SessionModeratorMode SessionParticipantMode = "moderator" - SessionPeerMode SessionParticipantMode = "peer" + SSHSessionKind SessionKind = "ssh" + KubernetesSessionKind SessionKind = "k8s" + DatabaseSessionKind SessionKind = "db" + AppSessionKind SessionKind = "app" + WindowsDesktopSessionKind SessionKind = "desktop" + SessionObserverMode SessionParticipantMode = "observer" + SessionModeratorMode SessionParticipantMode = "moderator" + SessionPeerMode SessionParticipantMode = "peer" ) // SessionKind is a type of session. @@ -52,6 +57,9 @@ type SessionTracker interface { // SetState sets the state of the session. SetState(SessionState) error + // SetCreated sets the time at which the session was created. + SetCreated(time.Time) + // GetCreated returns the time at which the session was created. GetCreated() time.Time @@ -186,6 +194,19 @@ func (s *SessionTrackerV1) CheckAndSetDefaults() error { return trace.Wrap(err) } + if s.GetCreated().IsZero() { + s.SetCreated(time.Now()) + } + + if s.Expiry().IsZero() { + // By default, resource expiration should match session expiration. + expiry := s.GetExpires() + if expiry.IsZero() { + expiry = s.GetCreated().Add(defaults.SessionTrackerTTL) + } + s.SetExpiry(expiry) + } + return nil } @@ -220,6 +241,11 @@ func (s *SessionTrackerV1) GetCreated() time.Time { return s.Spec.Created } +// SetCreated returns the time at which the session was created. +func (s *SessionTrackerV1) SetCreated(created time.Time) { + s.Spec.Created = created +} + // GetExpires return the time at which the session expires. func (s *SessionTrackerV1) GetExpires() time.Time { return s.Spec.Expires diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 08018f77f8d34..3a4e02b910cdc 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -8942,10 +8942,18 @@ type SessionTrackerSpecV1 struct { HostUser string `protobuf:"bytes,15,opt,name=HostUser,proto3" json:"host_user,omitempty"` // HostPolicies is a list of RBAC policy sets held by the host user at the time of session // creation. - HostPolicies []*SessionTrackerPolicySet `protobuf:"bytes,16,rep,name=HostPolicies,proto3" json:"host_roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + HostPolicies []*SessionTrackerPolicySet `protobuf:"bytes,16,rep,name=HostPolicies,proto3" json:"host_roles,omitempty"` + // DatabaseName is the database server this session belongs to. + DatabaseName string `protobuf:"bytes,17,opt,name=DatabaseName,proto3" json:"database_name,omitempty"` + // AppName is the app server this session belongs to. + AppName string `protobuf:"bytes,18,opt,name=AppName,proto3" json:"app_name,omitempty"` + // AppSessionID is the unique ID of the app access certificate used to start this app session. + AppSessionID string `protobuf:"bytes,19,opt,name=AppSessionID,proto3" json:"app_session_id,omitempty"` + // DesktopName is the windows desktop server this session belongs to. + DesktopName string `protobuf:"bytes,20,opt,name=DesktopName,proto3" json:"desktop_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } @@ -9326,774 +9334,778 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 12261 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x6f, 0x6c, 0x1c, 0x49, - 0x76, 0x18, 0xae, 0x9e, 0x19, 0x92, 0x33, 0x8f, 0x43, 0x72, 0x58, 0xfa, 0x47, 0x69, 0xb5, 0x3b, - 0xba, 0xde, 0x5d, 0xad, 0x56, 0xb7, 0x2b, 0x9e, 0xa8, 0xdb, 0x3d, 0xef, 0xed, 0xbf, 0x9b, 0x21, - 0x29, 0x89, 0x2b, 0x8a, 0xe4, 0xf6, 0xf0, 0xcf, 0x9d, 0xef, 0xce, 0xed, 0xe6, 0x74, 0x91, 0xec, - 0xe5, 0xcc, 0xf4, 0x5c, 0x77, 0x8f, 0x24, 0xda, 0x3f, 0xc3, 0x36, 0x7e, 0x70, 0x0c, 0xc3, 0xf0, - 0x9d, 0xcf, 0x38, 0xc7, 0x76, 0xe0, 0xc0, 0x8e, 0x11, 0x27, 0x71, 0x82, 0x33, 0x02, 0x27, 0x40, - 0x12, 0x24, 0x48, 0x60, 0x20, 0x30, 0xee, 0x43, 0x82, 0xf8, 0x4b, 0x10, 0xd8, 0x09, 0x98, 0xf8, - 0xce, 0x5f, 0x42, 0x20, 0x40, 0x00, 0x03, 0x01, 0x7c, 0x89, 0x81, 0xa0, 0x5e, 0x55, 0x75, 0x57, - 0xf5, 0xf4, 0x90, 0xc3, 0x95, 0x16, 0xb1, 0xf6, 0x13, 0x39, 0xaf, 0xde, 0x7b, 0x5d, 0x7f, 0x5f, - 0xbd, 0x7a, 0xf5, 0xde, 0x2b, 0x18, 0x8f, 0x0e, 0xba, 0x34, 0xbc, 0xd9, 0x0d, 0xfc, 0xc8, 0x27, - 0x23, 0xf8, 0xe3, 0xf2, 0xb9, 0x5d, 0x7f, 0xd7, 0x47, 0xc8, 0x2c, 0xfb, 0x8f, 0x17, 0x5e, 0xae, - 0xee, 0xfa, 0xfe, 0x6e, 0x8b, 0xce, 0xe2, 0xaf, 0xed, 0xde, 0xce, 0x6c, 0xe4, 0xb5, 0x69, 0x18, - 0x39, 0xed, 0xae, 0x40, 0x98, 0xdf, 0xf5, 0xa2, 0xbd, 0xde, 0xf6, 0xcd, 0xa6, 0xdf, 0x9e, 0xdd, - 0x0d, 0x9c, 0x87, 0x5e, 0xe4, 0x44, 0x9e, 0xdf, 0x71, 0x5a, 0xb3, 0x11, 0x6d, 0xd1, 0xae, 0x1f, - 0x44, 0xb3, 0x4e, 0xd7, 0x9b, 0xc5, 0x6f, 0xcc, 0x3e, 0x0a, 0x9c, 0x6e, 0x97, 0x06, 0xc9, 0x3f, - 0x9c, 0x89, 0xf9, 0x77, 0xf2, 0x50, 0xba, 0x4f, 0x69, 0xb7, 0xd6, 0xf2, 0x1e, 0x52, 0xf2, 0x22, - 0x14, 0x56, 0x9c, 0x36, 0x9d, 0x31, 0xae, 0x1a, 0xd7, 0x4b, 0xf5, 0xa9, 0xa3, 0xc3, 0xea, 0x78, - 0x48, 0x83, 0x87, 0x34, 0xb0, 0x3b, 0x4e, 0x9b, 0x5a, 0x58, 0x48, 0x3e, 0x0b, 0x25, 0xf6, 0x37, - 0xec, 0x3a, 0x4d, 0x3a, 0x93, 0x43, 0xcc, 0x89, 0xa3, 0xc3, 0x6a, 0xa9, 0x23, 0x81, 0x56, 0x52, - 0x4e, 0xae, 0xc1, 0xd8, 0x32, 0x75, 0x42, 0xba, 0xb4, 0x30, 0x93, 0xbf, 0x6a, 0x5c, 0xcf, 0xd7, - 0xcb, 0x47, 0x87, 0xd5, 0x62, 0x8b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0x21, 0x59, 0x82, 0xb1, 0xc5, - 0xc7, 0x5d, 0x2f, 0xa0, 0xe1, 0x4c, 0xe1, 0xaa, 0x71, 0x7d, 0x7c, 0xee, 0xf2, 0x4d, 0xde, 0xfe, - 0x9b, 0xb2, 0xfd, 0x37, 0xd7, 0x65, 0xfb, 0xeb, 0x67, 0xbf, 0x77, 0x58, 0x3d, 0x73, 0x74, 0x58, - 0x1d, 0xa3, 0x9c, 0xe4, 0x97, 0xff, 0x6b, 0xd5, 0xb0, 0x24, 0x3d, 0x79, 0x07, 0x0a, 0xeb, 0x07, - 0x5d, 0x3a, 0x53, 0xba, 0x6a, 0x5c, 0x9f, 0x9c, 0x7b, 0xe1, 0x26, 0xef, 0xf1, 0xb8, 0x91, 0xc9, - 0x7f, 0x0c, 0xab, 0x5e, 0x3c, 0x3a, 0xac, 0x16, 0x18, 0x8a, 0x85, 0x54, 0xe4, 0x75, 0x18, 0xbd, - 0xe7, 0x87, 0xd1, 0xd2, 0xc2, 0x0c, 0x60, 0xd3, 0xce, 0x1f, 0x1d, 0x56, 0xa7, 0xf7, 0xfc, 0x30, - 0xb2, 0x3d, 0xf7, 0x35, 0xbf, 0xed, 0x45, 0xb4, 0xdd, 0x8d, 0x0e, 0x2c, 0x81, 0x64, 0x6e, 0xc3, - 0x84, 0xc6, 0x8f, 0x8c, 0xc3, 0xd8, 0xc6, 0xca, 0xfd, 0x95, 0xd5, 0xad, 0x95, 0xca, 0x19, 0x52, - 0x84, 0xc2, 0xca, 0xea, 0xc2, 0x62, 0xc5, 0x20, 0x63, 0x90, 0xaf, 0xad, 0xad, 0x55, 0x72, 0xa4, - 0x0c, 0xc5, 0x85, 0xda, 0x7a, 0xad, 0x5e, 0x6b, 0x2c, 0x56, 0xf2, 0xe4, 0x2c, 0x4c, 0x6d, 0x2d, - 0xad, 0x2c, 0xac, 0x6e, 0x35, 0xec, 0x85, 0xc5, 0xc6, 0xfd, 0xf5, 0xd5, 0xb5, 0x4a, 0x81, 0x4c, - 0x02, 0xdc, 0xdf, 0xa8, 0x2f, 0x5a, 0x2b, 0x8b, 0xeb, 0x8b, 0x8d, 0xca, 0x88, 0xf9, 0xf3, 0x79, - 0x28, 0x3e, 0xa0, 0x91, 0xe3, 0x3a, 0x91, 0x43, 0xae, 0x68, 0x43, 0x84, 0xb5, 0x57, 0xc6, 0xe6, - 0xc5, 0xfe, 0xb1, 0x19, 0x39, 0x3a, 0xac, 0x1a, 0xaf, 0xab, 0x63, 0xf2, 0x36, 0x8c, 0x2f, 0xd0, - 0xb0, 0x19, 0x78, 0x5d, 0x36, 0x5f, 0x70, 0x5c, 0x4a, 0xf5, 0x4b, 0x47, 0x87, 0xd5, 0xf3, 0x6e, - 0x02, 0x56, 0xda, 0xaa, 0x62, 0x93, 0x25, 0x18, 0x5d, 0x76, 0xb6, 0x69, 0x2b, 0x9c, 0x19, 0xb9, - 0x9a, 0xbf, 0x3e, 0x3e, 0xf7, 0x9c, 0xe8, 0x5f, 0x59, 0xc1, 0x9b, 0xbc, 0x74, 0xb1, 0x13, 0x05, - 0x07, 0xf5, 0x73, 0x47, 0x87, 0xd5, 0x4a, 0x0b, 0x01, 0x6a, 0xdf, 0x71, 0x14, 0xd2, 0x48, 0xc6, - 0x7c, 0xf4, 0xc4, 0x31, 0x7f, 0xfe, 0x7b, 0x87, 0x55, 0x83, 0x8d, 0x85, 0x18, 0xf3, 0x84, 0x9f, - 0x3e, 0xfa, 0x57, 0x21, 0xb7, 0xb4, 0x30, 0x33, 0x86, 0x73, 0xad, 0x72, 0x74, 0x58, 0x2d, 0x6b, - 0xc3, 0x96, 0x5b, 0x5a, 0xb8, 0xfc, 0x16, 0x8c, 0x2b, 0x75, 0x24, 0x15, 0xc8, 0xef, 0xd3, 0x03, - 0xde, 0x9f, 0x16, 0xfb, 0x97, 0x9c, 0x83, 0x91, 0x87, 0x4e, 0xab, 0x27, 0x3a, 0xd0, 0xe2, 0x3f, - 0xbe, 0x98, 0xfb, 0x11, 0xc3, 0xfc, 0x95, 0x02, 0x14, 0x2d, 0x9f, 0xaf, 0x33, 0xf2, 0x2a, 0x8c, - 0x34, 0x22, 0x27, 0x92, 0x43, 0x71, 0xf6, 0xe8, 0xb0, 0x3a, 0x15, 0x32, 0x80, 0xf2, 0x3d, 0x8e, - 0xc1, 0x50, 0xd7, 0xf6, 0x9c, 0x50, 0x0e, 0x09, 0xa2, 0x76, 0x19, 0x40, 0x45, 0x45, 0x0c, 0x72, - 0x0d, 0x0a, 0x0f, 0x7c, 0x97, 0x8a, 0x51, 0x21, 0x47, 0x87, 0xd5, 0xc9, 0xb6, 0xef, 0xaa, 0x88, - 0x58, 0x4e, 0x5e, 0x83, 0xd2, 0x7c, 0x2f, 0x08, 0x68, 0x87, 0x4d, 0xd5, 0x02, 0x22, 0x4f, 0x1e, - 0x1d, 0x56, 0xa1, 0xc9, 0x81, 0x6c, 0x71, 0x25, 0x08, 0xac, 0xab, 0x1b, 0x91, 0x13, 0x44, 0xd4, - 0x9d, 0x19, 0x19, 0xaa, 0xab, 0xd9, 0xf2, 0x9a, 0x0e, 0x39, 0x49, 0xba, 0xab, 0x05, 0x27, 0x72, - 0x0f, 0xc6, 0xef, 0x06, 0x4e, 0x93, 0xae, 0xd1, 0xc0, 0xf3, 0x5d, 0x1c, 0xc3, 0x7c, 0xfd, 0xda, - 0xd1, 0x61, 0xf5, 0xc2, 0x2e, 0x03, 0xdb, 0x5d, 0x84, 0x27, 0xd4, 0x3f, 0x3c, 0xac, 0x16, 0x17, - 0x7a, 0x01, 0xf6, 0x9e, 0xa5, 0x92, 0x92, 0x1f, 0x67, 0x43, 0x12, 0x46, 0xd8, 0xb5, 0xd4, 0xc5, - 0xd1, 0x3b, 0xbe, 0x8a, 0xa6, 0xa8, 0xe2, 0x85, 0x96, 0x13, 0x46, 0x76, 0xc0, 0xe9, 0x52, 0xf5, - 0x54, 0x59, 0x92, 0x55, 0x28, 0x36, 0x9a, 0x7b, 0xd4, 0xed, 0xb5, 0xe8, 0x4c, 0x11, 0xd9, 0x5f, - 0x14, 0x13, 0x57, 0x8e, 0xa7, 0x2c, 0xae, 0x5f, 0x16, 0xbc, 0x49, 0x28, 0x20, 0x4a, 0xdf, 0xc7, - 0x4c, 0xbe, 0x58, 0xfc, 0xf5, 0xdf, 0xae, 0x9e, 0xf9, 0x99, 0xff, 0x72, 0xf5, 0x8c, 0xf9, 0xcf, - 0x72, 0x50, 0x49, 0x33, 0x21, 0x3b, 0x30, 0xb1, 0xd1, 0x75, 0x9d, 0x88, 0xce, 0xb7, 0x3c, 0xda, - 0x89, 0x42, 0x9c, 0x24, 0xc7, 0xb7, 0xe9, 0x25, 0xf1, 0xdd, 0x99, 0x1e, 0x12, 0xda, 0x4d, 0x4e, - 0x99, 0x6a, 0x95, 0xce, 0x36, 0xf9, 0x4e, 0x03, 0xe5, 0x74, 0x88, 0x33, 0xec, 0x74, 0xdf, 0xe1, - 0x12, 0x7e, 0xc0, 0x77, 0x04, 0x5b, 0x31, 0x81, 0x3a, 0xee, 0xf6, 0x01, 0xce, 0xcc, 0xe1, 0x27, - 0x10, 0x23, 0xc9, 0x98, 0x40, 0x0c, 0x6c, 0xfe, 0xb9, 0x01, 0x93, 0x16, 0x0d, 0xfd, 0x5e, 0xd0, - 0xa4, 0xf7, 0xa8, 0xe3, 0xd2, 0x80, 0x4d, 0xff, 0xfb, 0x5e, 0xc7, 0x15, 0x6b, 0x0a, 0xa7, 0xff, - 0xbe, 0xd7, 0x51, 0x97, 0x30, 0x96, 0x93, 0xcf, 0xc1, 0x58, 0xa3, 0xb7, 0x8d, 0xa8, 0x7c, 0x4d, - 0x5d, 0xc0, 0x11, 0xeb, 0x6d, 0xdb, 0x29, 0x74, 0x89, 0x46, 0x66, 0x61, 0x6c, 0x93, 0x06, 0x61, - 0x22, 0xf1, 0x50, 0xb2, 0x3f, 0xe4, 0x20, 0x95, 0x40, 0x60, 0x91, 0xbb, 0x89, 0xd4, 0x15, 0x7b, - 0xd2, 0x54, 0x4a, 0xd6, 0x25, 0x53, 0xa5, 0x2d, 0x20, 0xea, 0x54, 0x91, 0x58, 0xe6, 0xb7, 0x73, - 0x50, 0x59, 0x70, 0x22, 0x67, 0xdb, 0x09, 0x45, 0x7f, 0x6e, 0xde, 0x66, 0x72, 0x5c, 0x69, 0x28, - 0xca, 0x71, 0x56, 0xf3, 0x8f, 0xdd, 0xbc, 0x97, 0xd3, 0xcd, 0x1b, 0x67, 0x1b, 0xa4, 0x68, 0x5e, - 0xd2, 0xa8, 0x77, 0x4f, 0x6e, 0x54, 0x45, 0x34, 0xaa, 0x28, 0x1b, 0x95, 0x34, 0x85, 0xbc, 0x0b, - 0x85, 0x46, 0x97, 0x36, 0x85, 0x10, 0x91, 0xb2, 0x5f, 0x6f, 0x1c, 0x43, 0xd8, 0xbc, 0x5d, 0x2f, - 0x0b, 0x36, 0x85, 0xb0, 0x4b, 0x9b, 0x16, 0x92, 0x29, 0x8b, 0xe6, 0x3b, 0xa3, 0x70, 0x2e, 0x8b, - 0x8c, 0xbc, 0xab, 0x6f, 0x4e, 0xbc, 0x7b, 0x9e, 0x1b, 0xb8, 0x39, 0xcd, 0x18, 0xfa, 0xf6, 0x74, - 0x03, 0x8a, 0x6b, 0x6c, 0x42, 0x36, 0xfd, 0x96, 0xe8, 0x39, 0x26, 0x15, 0x8b, 0x5d, 0x09, 0x33, - 0xac, 0xb8, 0x9c, 0x3c, 0x07, 0xf9, 0x0d, 0x6b, 0x49, 0x74, 0x57, 0xe9, 0xe8, 0xb0, 0x9a, 0xef, - 0x05, 0xde, 0x8c, 0x61, 0x31, 0x28, 0x99, 0x85, 0xd1, 0xf9, 0xda, 0x3c, 0x0d, 0x22, 0xec, 0xa6, - 0x72, 0xfd, 0x22, 0x9b, 0x2d, 0x4d, 0xc7, 0x6e, 0xd2, 0x20, 0xd2, 0x3e, 0x2f, 0xd0, 0xc8, 0x67, - 0x21, 0x5f, 0xdb, 0x6a, 0x88, 0x9e, 0x01, 0xd1, 0x33, 0xb5, 0xad, 0x46, 0x7d, 0x42, 0x74, 0x44, - 0xde, 0x79, 0x14, 0x32, 0xee, 0xb5, 0xad, 0x86, 0x3a, 0x5a, 0xa3, 0xc7, 0x8c, 0xd6, 0x75, 0x28, - 0x32, 0x3d, 0x83, 0x6d, 0xf0, 0x28, 0x14, 0x4b, 0x5c, 0x7d, 0xda, 0x13, 0x30, 0x2b, 0x2e, 0x25, - 0x2f, 0xc6, 0x6a, 0x4b, 0x31, 0xe1, 0x27, 0xd4, 0x16, 0xa9, 0xac, 0x90, 0xc7, 0x30, 0xb1, 0x70, - 0xd0, 0x71, 0xda, 0x5e, 0x53, 0x6c, 0xe1, 0x25, 0xdc, 0xc2, 0x6f, 0x1e, 0x33, 0x8c, 0x37, 0x35, - 0x02, 0xbe, 0xab, 0x4b, 0xe1, 0x3b, 0xe3, 0xf2, 0x32, 0x3b, 0xbd, 0xc3, 0xcf, 0x18, 0x96, 0xfe, - 0x21, 0xb6, 0x96, 0xa4, 0x88, 0x44, 0xbd, 0x2a, 0x99, 0x76, 0x12, 0x9c, 0xac, 0xa5, 0x40, 0x40, - 0xd4, 0xb5, 0x14, 0x6f, 0xba, 0xef, 0x42, 0xfe, 0xee, 0xfc, 0xda, 0xcc, 0x38, 0xf2, 0x20, 0x82, - 0xc7, 0xdd, 0xf9, 0xb5, 0xf9, 0x96, 0xdf, 0x73, 0x1b, 0x1f, 0x2e, 0xd7, 0x2f, 0x0a, 0x36, 0x13, - 0xbb, 0xcd, 0xae, 0x56, 0x23, 0x46, 0x47, 0x16, 0xa1, 0x28, 0x5b, 0x39, 0x53, 0x46, 0x1e, 0xd3, - 0xa9, 0xc6, 0x6f, 0xde, 0xe6, 0x6b, 0xcd, 0x15, 0xbf, 0xd5, 0x5a, 0x48, 0x9c, 0xcb, 0x5b, 0x40, - 0xfa, 0xfb, 0x25, 0x43, 0x93, 0xf8, 0xac, 0xaa, 0x49, 0x8c, 0xcf, 0x9d, 0x17, 0xdf, 0x9a, 0xf7, - 0xdb, 0x6d, 0xa7, 0xe3, 0x22, 0xed, 0xe6, 0x9c, 0xaa, 0x60, 0xd4, 0x60, 0x32, 0xa9, 0xc8, 0xb2, - 0x17, 0x46, 0x64, 0x16, 0x4a, 0x12, 0xc2, 0x36, 0x91, 0x7c, 0x66, 0x95, 0xad, 0x04, 0xc7, 0xfc, - 0xa3, 0x1c, 0x40, 0x52, 0xf2, 0x8c, 0xca, 0x99, 0x2f, 0x68, 0x72, 0xe6, 0x7c, 0x7a, 0x82, 0x0e, - 0x94, 0x30, 0xe4, 0x7d, 0x18, 0x65, 0x2a, 0x57, 0x4f, 0xaa, 0x94, 0x17, 0xd3, 0xa4, 0x58, 0xb8, - 0x79, 0xbb, 0x3e, 0x29, 0x88, 0x47, 0x43, 0x84, 0x58, 0x82, 0x4c, 0x11, 0x51, 0x7f, 0x30, 0x92, - 0x0c, 0x86, 0x10, 0x4e, 0xd7, 0x15, 0xe9, 0x62, 0x24, 0xeb, 0x51, 0x4a, 0x17, 0x45, 0xb6, 0x5c, - 0xe2, 0xb2, 0x85, 0x77, 0xea, 0x98, 0x90, 0x2d, 0x69, 0xc9, 0xc2, 0x3b, 0xf0, 0x44, 0xc9, 0xd2, - 0x4d, 0x2f, 0xdb, 0x02, 0x4e, 0x83, 0xeb, 0x99, 0xbd, 0x92, 0xb5, 0x60, 0xaf, 0x9e, 0xb4, 0x60, - 0xd3, 0xcb, 0xf5, 0xf6, 0x20, 0x59, 0x76, 0x5e, 0xae, 0x2e, 0xe7, 0x91, 0x4a, 0x8e, 0x32, 0xed, - 0x6d, 0xbe, 0x34, 0x47, 0x07, 0x2e, 0xcd, 0xf3, 0x99, 0x4b, 0x93, 0x2f, 0xcc, 0xb7, 0x61, 0xa4, - 0xf6, 0x13, 0xbd, 0x80, 0x0a, 0xdd, 0xaf, 0x2c, 0xbf, 0xc9, 0x60, 0xf1, 0x9a, 0x9e, 0x72, 0xd8, - 0x4f, 0x55, 0x67, 0xc6, 0x72, 0xf6, 0xe5, 0xf5, 0xe5, 0x86, 0xd0, 0xeb, 0x48, 0xaa, 0x5b, 0xd6, - 0x97, 0x95, 0x6a, 0x47, 0x5a, 0xab, 0x19, 0x15, 0x99, 0x85, 0x5c, 0x6d, 0x01, 0x0f, 0x8b, 0xe3, - 0x73, 0x25, 0xf9, 0xd9, 0x85, 0xfa, 0x39, 0x41, 0x52, 0x76, 0xb4, 0xf3, 0x43, 0x6d, 0x81, 0xd4, - 0x61, 0xe4, 0xc1, 0x41, 0xe3, 0xc3, 0x65, 0x21, 0xc8, 0xce, 0xca, 0x79, 0xcd, 0x60, 0xab, 0xb8, - 0x0b, 0x85, 0x49, 0x8d, 0xdb, 0x07, 0xe1, 0x37, 0x5a, 0x6a, 0x8d, 0x11, 0xed, 0x93, 0x13, 0x20, - 0xff, 0xd8, 0x50, 0x74, 0x0d, 0x31, 0xd7, 0xd9, 0x99, 0x56, 0xcc, 0x38, 0x23, 0xd1, 0x7c, 0xfa, - 0x66, 0x5c, 0x3c, 0xdf, 0x5e, 0xe5, 0xa3, 0x9f, 0xeb, 0x1b, 0xfd, 0x71, 0x65, 0x27, 0xe3, 0x63, - 0x1e, 0xf7, 0x45, 0xfe, 0x63, 0xf7, 0x85, 0xf9, 0xdf, 0x0d, 0xfc, 0x1e, 0x79, 0x0d, 0x46, 0x2d, - 0xba, 0x9b, 0x6c, 0xfa, 0x78, 0x78, 0x0c, 0x10, 0xa2, 0x56, 0x92, 0xe3, 0xe0, 0x8e, 0x42, 0xdd, - 0x70, 0xcf, 0xdb, 0x89, 0x44, 0x4d, 0xe3, 0x1d, 0x45, 0x80, 0x95, 0x1d, 0x45, 0x40, 0xb4, 0x1d, - 0x45, 0xc0, 0xd8, 0x5c, 0xb7, 0x16, 0x1a, 0xa2, 0x01, 0xb2, 0xb5, 0xd6, 0x82, 0x32, 0x69, 0x02, - 0x57, 0x9b, 0x34, 0xd6, 0x42, 0x83, 0xbc, 0x09, 0xa5, 0x5a, 0xb3, 0xe9, 0xf7, 0x94, 0xd3, 0xd7, - 0xcc, 0xd1, 0x61, 0xf5, 0x9c, 0xc3, 0x81, 0xba, 0xad, 0x20, 0x41, 0x35, 0xeb, 0x49, 0xad, 0x19, - 0x8f, 0xf9, 0x56, 0x2f, 0x8c, 0x68, 0xb0, 0xb4, 0x20, 0x9a, 0x8c, 0x3c, 0x9a, 0x1c, 0x98, 0xe2, - 0x11, 0xa3, 0x9a, 0xff, 0xd9, 0xc0, 0x1a, 0x93, 0xb7, 0x00, 0x96, 0x3a, 0x4c, 0xc3, 0x6e, 0xd2, - 0x98, 0x01, 0x9e, 0xe2, 0x3d, 0x01, 0xd5, 0x39, 0x28, 0xc8, 0xfa, 0xa7, 0x73, 0x43, 0x7f, 0x9a, - 0x7d, 0x52, 0xea, 0xeb, 0xc2, 0xa0, 0x23, 0x3e, 0x19, 0x08, 0x68, 0xea, 0x93, 0x09, 0x32, 0xb9, - 0x06, 0x63, 0x4b, 0xb5, 0x07, 0xb5, 0x5e, 0xb4, 0x87, 0xfd, 0x55, 0xe4, 0x92, 0xd3, 0x73, 0xda, - 0xb6, 0xd3, 0x8b, 0xf6, 0x2c, 0x59, 0x68, 0xfe, 0x8c, 0x01, 0xe3, 0x8a, 0xd0, 0x60, 0x55, 0x5d, - 0x0b, 0xfc, 0x8f, 0x68, 0x33, 0xd2, 0x7b, 0xa9, 0xcb, 0x81, 0xa9, 0xaa, 0xc6, 0xa8, 0xa9, 0xde, - 0xc9, 0x9d, 0xa2, 0x77, 0xcc, 0x59, 0x21, 0x8b, 0xd8, 0x61, 0x44, 0xb1, 0xb5, 0xe0, 0x61, 0x84, - 0x29, 0x5b, 0xea, 0x61, 0x84, 0x95, 0x9b, 0xbf, 0x67, 0x30, 0x19, 0x42, 0x66, 0x01, 0xee, 0xd3, - 0x83, 0xc8, 0xd9, 0xbe, 0xe3, 0xb5, 0x34, 0x1b, 0xda, 0x3e, 0x42, 0xed, 0x1d, 0xaf, 0x45, 0x2d, - 0x05, 0x85, 0xdc, 0x86, 0xe2, 0xfd, 0x60, 0xfb, 0x0d, 0x44, 0xcf, 0xc5, 0x7b, 0xc1, 0xd9, 0xfd, - 0x60, 0xfb, 0x0d, 0x44, 0x56, 0xe7, 0xab, 0x44, 0x24, 0x26, 0x8c, 0x2e, 0xf8, 0x6d, 0xc7, 0x93, - 0xfb, 0x2f, 0xb0, 0x4d, 0xcc, 0x45, 0x88, 0x25, 0x4a, 0xd8, 0xee, 0xd3, 0x58, 0x5b, 0x11, 0x13, - 0x13, 0x77, 0x9f, 0xb0, 0xdb, 0xb1, 0x18, 0xcc, 0xfc, 0xae, 0x01, 0xe3, 0x8a, 0x68, 0x24, 0x9f, - 0x17, 0xf6, 0x06, 0x03, 0xad, 0x65, 0x17, 0xfa, 0x85, 0x27, 0x2b, 0xe5, 0x7a, 0x43, 0xdb, 0x77, - 0xa9, 0xb0, 0x3e, 0x24, 0x12, 0x25, 0x37, 0x8c, 0x44, 0x79, 0x0b, 0x80, 0x2b, 0x95, 0xd8, 0x9d, - 0xca, 0xbc, 0x51, 0xac, 0x8b, 0xea, 0x60, 0x24, 0xc8, 0xa6, 0x05, 0x65, 0x55, 0x9a, 0x90, 0x3a, - 0x4c, 0x88, 0x33, 0x94, 0xd0, 0x42, 0x78, 0x3f, 0x5f, 0x61, 0xdb, 0x9b, 0xe0, 0xd6, 0x7f, 0xa6, - 0xd3, 0x49, 0xcc, 0x9f, 0xcd, 0x41, 0x51, 0x40, 0xe6, 0x9e, 0x51, 0x05, 0xe9, 0x0d, 0x4d, 0x41, - 0x92, 0x72, 0x57, 0xd1, 0xdc, 0xe7, 0x4e, 0x38, 0x80, 0xbd, 0x05, 0x65, 0xd9, 0x05, 0xa8, 0x67, - 0xbe, 0x0a, 0x63, 0xd2, 0x84, 0xc0, 0xb5, 0xcc, 0x29, 0x8d, 0xe7, 0xe6, 0x9c, 0x25, 0xcb, 0xcd, - 0x6f, 0x8f, 0x48, 0x5a, 0xfe, 0x25, 0xd6, 0x85, 0x35, 0xd7, 0x0d, 0xd4, 0x2e, 0x74, 0x5c, 0x37, - 0xb0, 0x10, 0xca, 0x06, 0x7f, 0xad, 0xb7, 0xdd, 0xf2, 0x9a, 0x88, 0xa3, 0xac, 0xc4, 0x2e, 0x42, - 0x6d, 0x86, 0xaa, 0x0e, 0x7e, 0x82, 0xac, 0x9d, 0x7f, 0xf2, 0xc7, 0x9e, 0x7f, 0x7e, 0x0c, 0x4a, - 0xf3, 0x6d, 0x57, 0xd3, 0x8f, 0xcc, 0x8c, 0x4e, 0xb9, 0x19, 0x23, 0x71, 0xcd, 0xe8, 0x8a, 0xe8, - 0xa3, 0x73, 0xcd, 0xb6, 0xdb, 0xaf, 0x15, 0x25, 0x2c, 0xb5, 0x03, 0xcc, 0xc8, 0x93, 0x1c, 0x60, - 0xde, 0x84, 0xd2, 0x46, 0x48, 0xd7, 0x7b, 0x9d, 0x0e, 0x6d, 0xa1, 0xae, 0x54, 0xe4, 0xf2, 0xac, - 0x17, 0x52, 0x3b, 0x42, 0xa8, 0x5a, 0x81, 0x18, 0x55, 0x9d, 0x56, 0x63, 0xc7, 0x4c, 0xab, 0xcf, - 0x43, 0xa1, 0xd6, 0xed, 0xca, 0x93, 0x5d, 0xbc, 0x79, 0x77, 0xbb, 0xb8, 0x9d, 0x4e, 0x3a, 0xdd, - 0xae, 0x7e, 0x4e, 0x43, 0x6c, 0x42, 0x81, 0xdc, 0xef, 0x6d, 0xd3, 0xa0, 0x43, 0x23, 0x1a, 0x0a, - 0x71, 0x1f, 0xce, 0x00, 0xf2, 0x98, 0x91, 0x06, 0xf4, 0x34, 0x02, 0x9e, 0xca, 0x2f, 0xee, 0xf7, - 0xb6, 0xa9, 0x2d, 0xf6, 0x0d, 0xb5, 0xef, 0x32, 0x18, 0x5e, 0x6e, 0xc0, 0xa4, 0xde, 0xff, 0x4f, - 0x41, 0xe3, 0xf9, 0xa0, 0x50, 0x2c, 0x56, 0x4a, 0xe6, 0xcf, 0xe7, 0x60, 0xbc, 0xd6, 0xed, 0x3e, - 0xe3, 0xe6, 0x95, 0x1f, 0xd1, 0x56, 0xf5, 0x85, 0x64, 0xf4, 0x4e, 0x61, 0x59, 0xf9, 0x4b, 0x03, - 0xa6, 0x52, 0x14, 0x6a, 0xed, 0x8d, 0x21, 0xcd, 0x0d, 0xb9, 0x21, 0xcd, 0x0d, 0xf9, 0xc1, 0xe6, - 0x06, 0x75, 0xcd, 0x14, 0x9e, 0x64, 0xcd, 0xbc, 0x02, 0xf9, 0x5a, 0xb7, 0x2b, 0x7a, 0xa5, 0x9c, - 0xf4, 0xca, 0xe6, 0x6d, 0xbe, 0xb9, 0x39, 0xdd, 0xae, 0xc5, 0x30, 0xcc, 0xd7, 0xa1, 0x84, 0x60, - 0x94, 0x68, 0x57, 0xc5, 0x52, 0xe0, 0xe2, 0x4c, 0x23, 0xe3, 0xd3, 0xde, 0xfc, 0xdf, 0x06, 0x8c, - 0xe0, 0xef, 0x67, 0x74, 0xba, 0xcc, 0x69, 0xd3, 0xa5, 0xa2, 0x4c, 0x97, 0x61, 0x26, 0xca, 0x1f, - 0xe4, 0xb1, 0xb7, 0xc4, 0x14, 0x11, 0x07, 0x56, 0x23, 0xe3, 0xc0, 0xfa, 0x04, 0x02, 0x7c, 0x3f, - 0x7d, 0x74, 0xcd, 0xe3, 0x60, 0xbc, 0x98, 0xae, 0xea, 0x53, 0x39, 0xb5, 0xde, 0x03, 0xb2, 0xd4, - 0x09, 0x69, 0xb3, 0x17, 0xd0, 0xc6, 0xbe, 0xd7, 0xdd, 0xa4, 0x81, 0xb7, 0x73, 0x20, 0xb4, 0x4d, - 0x94, 0xb1, 0x9e, 0x28, 0xb5, 0xc3, 0x7d, 0xaf, 0xcb, 0xd4, 0x04, 0x6f, 0xe7, 0xc0, 0xca, 0xa0, - 0x21, 0xef, 0xc3, 0x98, 0x45, 0x1f, 0x05, 0x5e, 0x44, 0x45, 0xdf, 0x4e, 0xc6, 0x67, 0x0b, 0x84, - 0x72, 0x7d, 0x27, 0xe0, 0x3f, 0xd4, 0xf1, 0x17, 0xe5, 0x9f, 0xdc, 0xf9, 0xee, 0x3b, 0x23, 0xb8, - 0x16, 0x4e, 0xb8, 0x06, 0x3c, 0xc6, 0xfa, 0xa0, 0x0f, 0x66, 0xfe, 0x34, 0x83, 0xb9, 0x09, 0x65, - 0x76, 0xa4, 0x4c, 0x99, 0x21, 0xae, 0x24, 0x63, 0x79, 0x53, 0x2d, 0x3e, 0xee, 0x06, 0x50, 0xe3, - 0x43, 0xec, 0xf4, 0x24, 0xe1, 0x37, 0x8b, 0xcf, 0x2b, 0x8c, 0x33, 0xa6, 0x47, 0x2c, 0x3a, 0x9a, - 0xbc, 0xb3, 0x4e, 0x3d, 0x31, 0x46, 0x9f, 0x6c, 0x62, 0x8c, 0x7d, 0x9c, 0x89, 0x91, 0xbe, 0x7b, - 0x2d, 0x9e, 0xe6, 0xee, 0xf5, 0xf2, 0xfb, 0x30, 0xdd, 0xd7, 0xc3, 0xa7, 0xb9, 0xbf, 0xfc, 0xe4, - 0xa6, 0xe5, 0x4f, 0xc5, 0xfd, 0x42, 0xe6, 0xf0, 0x88, 0xeb, 0x05, 0xb4, 0x19, 0xa1, 0xe8, 0x15, - 0xd2, 0x32, 0x10, 0xb0, 0xd4, 0x19, 0x1c, 0x61, 0xe4, 0x3d, 0x18, 0xe3, 0xf7, 0x3f, 0xe1, 0x4c, - 0x0e, 0xc7, 0x7e, 0x42, 0x7c, 0x91, 0x43, 0xc5, 0x25, 0x3c, 0xc7, 0x50, 0x7b, 0x55, 0x10, 0x99, - 0x77, 0x61, 0x54, 0xdc, 0x1f, 0x1d, 0xbf, 0x2e, 0xaa, 0x30, 0xb2, 0x99, 0xf4, 0x0c, 0xda, 0xfc, - 0x79, 0x23, 0x2c, 0x0e, 0x37, 0x7f, 0xd1, 0x80, 0x49, 0xbd, 0x95, 0xe4, 0x26, 0x8c, 0x8a, 0x0b, - 0x4e, 0x03, 0x2f, 0x38, 0x59, 0x6b, 0x46, 0xf9, 0xd5, 0xa6, 0x76, 0xa1, 0x29, 0xb0, 0x98, 0xe8, - 0x17, 0x1c, 0xb0, 0x2d, 0x42, 0xf4, 0x8b, 0x49, 0x6a, 0xc9, 0x32, 0x76, 0x8c, 0xb3, 0x68, 0xd8, - 0x6b, 0x45, 0xea, 0x31, 0x2e, 0x40, 0x88, 0x25, 0x4a, 0xcc, 0x43, 0x03, 0xa0, 0xd1, 0xb8, 0x77, - 0x9f, 0x1e, 0xac, 0x39, 0x5e, 0x80, 0x47, 0x61, 0x5c, 0x8d, 0xf7, 0xc5, 0x68, 0x95, 0xc5, 0x51, - 0x98, 0xaf, 0xdc, 0x7d, 0x7a, 0xa0, 0x1d, 0x85, 0x25, 0x2a, 0x2e, 0xf9, 0xc0, 0x7b, 0xe8, 0x44, - 0x94, 0x11, 0xe6, 0x90, 0x90, 0x2f, 0x79, 0x0e, 0x4d, 0x51, 0x2a, 0xc8, 0xe4, 0xeb, 0x30, 0x99, - 0xfc, 0x42, 0xaf, 0x8a, 0x3c, 0x9e, 0x13, 0xe5, 0x8c, 0xd0, 0x0b, 0xeb, 0x2f, 0x1c, 0x1d, 0x56, - 0x2f, 0x2b, 0x5c, 0x6d, 0x86, 0xa5, 0xb0, 0x4e, 0x31, 0x33, 0x7f, 0xc7, 0x00, 0x58, 0x5f, 0x6e, - 0xc8, 0x06, 0x5e, 0x83, 0x42, 0x6c, 0xa5, 0x2a, 0xf3, 0xf3, 0x76, 0xea, 0x40, 0x89, 0xe5, 0xe4, - 0x45, 0xc8, 0x27, 0x2d, 0x99, 0x3e, 0x3a, 0xac, 0x4e, 0xe8, 0x2d, 0x60, 0xa5, 0xe4, 0x2e, 0x8c, - 0x0d, 0x55, 0x67, 0x9c, 0x9d, 0x19, 0x75, 0x95, 0xd4, 0x38, 0x0a, 0x1f, 0x6c, 0xad, 0x7f, 0x7a, - 0x47, 0xe1, 0x5b, 0x39, 0x98, 0x62, 0xfd, 0x5a, 0xeb, 0x45, 0x7b, 0x7e, 0xe0, 0x45, 0x07, 0xcf, - 0xec, 0xa9, 0xf8, 0x1d, 0x4d, 0x21, 0xba, 0x2c, 0xc5, 0x96, 0xda, 0xb6, 0xa1, 0x0e, 0xc7, 0x7f, - 0x36, 0x06, 0x67, 0x33, 0xa8, 0xc8, 0x6b, 0xc2, 0xb5, 0x28, 0xb1, 0x43, 0xa1, 0xeb, 0xd0, 0x0f, - 0x0f, 0xab, 0x65, 0x89, 0xbe, 0x9e, 0xb8, 0x12, 0xcd, 0xc1, 0xb8, 0x38, 0xfa, 0xac, 0x24, 0x1a, - 0x35, 0xfa, 0xa4, 0x48, 0x3b, 0x1b, 0x8a, 0x26, 0x15, 0x89, 0xd4, 0xa0, 0x3c, 0xbf, 0x47, 0x9b, - 0xfb, 0x5e, 0x67, 0xf7, 0x3e, 0x3d, 0xe0, 0xfa, 0x52, 0xb9, 0xfe, 0x3c, 0x3b, 0x69, 0x35, 0x05, - 0x9c, 0x0d, 0xa9, 0x7e, 0x88, 0xd3, 0x48, 0xc8, 0x7b, 0x30, 0xde, 0xf0, 0x76, 0x3b, 0x92, 0x43, - 0x01, 0x39, 0x5c, 0x39, 0x3a, 0xac, 0x5e, 0x08, 0x39, 0xb8, 0x9f, 0x81, 0x4a, 0x40, 0x5e, 0x85, - 0x11, 0xcb, 0x6f, 0x51, 0xbe, 0x0d, 0x0b, 0x67, 0x95, 0x80, 0x01, 0x54, 0xd3, 0x2d, 0x62, 0x90, - 0x7b, 0x30, 0xc6, 0xfe, 0x79, 0xe0, 0x74, 0x67, 0x46, 0x51, 0x6e, 0x93, 0x58, 0xc1, 0x47, 0x68, - 0xd7, 0xeb, 0xec, 0xaa, 0x3a, 0x7e, 0x8b, 0xda, 0x6d, 0xa7, 0xab, 0xed, 0x8b, 0x1c, 0x91, 0x6c, - 0xc2, 0x78, 0x22, 0x08, 0xc2, 0x99, 0x31, 0xed, 0xa2, 0x2b, 0x29, 0xa9, 0x7f, 0x46, 0x30, 0xbb, - 0x18, 0xb5, 0x42, 0x9c, 0xdb, 0x5d, 0x86, 0xaf, 0x37, 0x46, 0x61, 0xa4, 0x9d, 0x41, 0x8a, 0x83, - 0xcf, 0x20, 0xc6, 0x89, 0x67, 0x10, 0x17, 0x40, 0x74, 0x52, 0xad, 0xb5, 0x2b, 0x7c, 0xcb, 0x5e, - 0x1d, 0x3c, 0xc1, 0x6e, 0x26, 0xc8, 0xb8, 0x26, 0xb9, 0xb5, 0x4b, 0xf4, 0xbf, 0xd3, 0xda, 0xd5, - 0xac, 0x5d, 0x31, 0x2a, 0xeb, 0x86, 0x44, 0xd4, 0xc8, 0x13, 0xb8, 0xec, 0x86, 0xa4, 0x24, 0xe9, - 0x86, 0x8f, 0x1e, 0x45, 0x83, 0xba, 0x41, 0x61, 0x44, 0x56, 0x00, 0x6a, 0xcd, 0xc8, 0x7b, 0x48, - 0x71, 0x4a, 0x8c, 0x6b, 0x1d, 0x31, 0x5f, 0xbb, 0x4f, 0x0f, 0x1a, 0x34, 0x8a, 0xdd, 0x36, 0xce, - 0x3b, 0x88, 0x9a, 0x9a, 0x26, 0x96, 0xc2, 0x81, 0x74, 0xe1, 0x7c, 0xcd, 0x75, 0x3d, 0xee, 0x6f, - 0xb8, 0x1e, 0xb0, 0xf9, 0xeb, 0x22, 0xeb, 0x72, 0x36, 0xeb, 0x57, 0x05, 0xeb, 0xcf, 0x38, 0x31, - 0x95, 0x1d, 0x71, 0xb2, 0xf4, 0x67, 0xb2, 0x19, 0x9b, 0xab, 0x30, 0xa9, 0x77, 0xa9, 0xee, 0x69, - 0x57, 0x86, 0xa2, 0xd5, 0xa8, 0xd9, 0x8d, 0x7b, 0xb5, 0x5b, 0x15, 0x83, 0x54, 0xa0, 0x2c, 0x7e, - 0xcd, 0xd9, 0x73, 0x6f, 0xbc, 0x59, 0xc9, 0x69, 0x90, 0x37, 0x6e, 0xcd, 0x55, 0xf2, 0xe6, 0x1f, - 0x18, 0x50, 0x94, 0xf5, 0x23, 0x6f, 0x42, 0xbe, 0xd1, 0xb8, 0x97, 0xba, 0x5f, 0x4d, 0xb6, 0x5e, - 0xbe, 0xc9, 0x84, 0xe1, 0x9e, 0xba, 0xc9, 0x34, 0x1a, 0xf7, 0x18, 0xdd, 0xfa, 0x72, 0x43, 0x28, - 0x2d, 0x19, 0xd3, 0x75, 0x7a, 0xc0, 0xa5, 0xd3, 0x9b, 0x90, 0xff, 0x60, 0x6b, 0x5d, 0x9c, 0x86, - 0x32, 0xc6, 0x17, 0xe9, 0x3e, 0x7a, 0xa4, 0x6e, 0x7d, 0x8c, 0xc0, 0xb4, 0x60, 0x5c, 0x59, 0x5a, - 0x5c, 0x89, 0x68, 0xfb, 0xb1, 0x0f, 0x9a, 0x50, 0x22, 0x18, 0xc4, 0x12, 0x25, 0x4c, 0xe7, 0x59, - 0xf6, 0x9b, 0x4e, 0x4b, 0x68, 0x23, 0xa8, 0xf3, 0xb4, 0x18, 0xc0, 0xe2, 0x70, 0xf3, 0x0f, 0x0d, - 0xa8, 0xac, 0x05, 0xfe, 0x43, 0x8f, 0x49, 0xe0, 0x75, 0x7f, 0x9f, 0x76, 0x36, 0x6f, 0x91, 0xd7, - 0xa5, 0x10, 0xe0, 0x2a, 0xdc, 0x45, 0x46, 0x85, 0x42, 0xe0, 0x87, 0x87, 0x55, 0x68, 0x1c, 0x84, - 0x11, 0x6d, 0xb3, 0x72, 0x29, 0x08, 0x14, 0x57, 0xbe, 0xdc, 0xf0, 0xee, 0x41, 0x27, 0xb8, 0xf2, - 0x55, 0x61, 0x04, 0xab, 0xa3, 0x78, 0x68, 0x8c, 0x44, 0x0c, 0x60, 0x71, 0xb8, 0x22, 0xb0, 0xbf, - 0x9d, 0xeb, 0x6b, 0xc3, 0xdc, 0xa7, 0xca, 0xc5, 0x46, 0x6f, 0xdc, 0x50, 0x9b, 0xd8, 0x57, 0xe0, - 0x5c, 0xba, 0x4b, 0xd0, 0x2e, 0x52, 0x83, 0x29, 0x1d, 0x2e, 0x4d, 0x24, 0x17, 0x33, 0xbf, 0xb5, - 0x39, 0x67, 0xa5, 0xf1, 0xcd, 0xef, 0x1b, 0x50, 0xc2, 0x7f, 0xad, 0x5e, 0x8b, 0x32, 0xcd, 0xa6, - 0xb6, 0xd5, 0x10, 0x97, 0x5c, 0xea, 0x45, 0x94, 0xf3, 0x28, 0xb4, 0xc5, 0x8d, 0x98, 0x26, 0x47, - 0x62, 0x64, 0x41, 0xca, 0xaf, 0xf4, 0x42, 0x31, 0x43, 0x63, 0x52, 0x7e, 0xf7, 0x17, 0xa6, 0x48, - 0x05, 0x32, 0x1b, 0x3f, 0xf6, 0xcb, 0x6f, 0x49, 0xd3, 0x30, 0x8e, 0x1f, 0xd2, 0xf9, 0xda, 0xd5, - 0x89, 0x44, 0x23, 0xaf, 0xc3, 0x28, 0xfb, 0xb4, 0x25, 0x2f, 0x46, 0xf0, 0x54, 0x81, 0x75, 0x0c, - 0xb4, 0x1b, 0x46, 0x8e, 0x64, 0xfe, 0xf3, 0x5c, 0xba, 0x03, 0x85, 0x16, 0x70, 0xca, 0xb5, 0xf1, - 0x36, 0x8c, 0xd4, 0x5a, 0x2d, 0xff, 0x91, 0x90, 0x12, 0xd2, 0x4c, 0x13, 0xf7, 0x1f, 0xdf, 0x61, - 0x1d, 0x86, 0xa2, 0x5d, 0x6d, 0x33, 0x00, 0x99, 0x87, 0x52, 0x6d, 0xab, 0xb1, 0xb4, 0xb4, 0xb0, - 0xbe, 0xbe, 0x2c, 0x3c, 0xa8, 0x5f, 0x96, 0xfd, 0xe3, 0x79, 0xae, 0x1d, 0x45, 0xad, 0x01, 0x0e, - 0x96, 0x09, 0x1d, 0x79, 0x17, 0xe0, 0x03, 0xdf, 0xeb, 0x3c, 0xa0, 0xd1, 0x9e, 0xef, 0x8a, 0xc6, - 0x33, 0x95, 0x62, 0xfc, 0x23, 0xdf, 0xeb, 0xd8, 0x6d, 0x04, 0xb3, 0xba, 0x27, 0x48, 0x96, 0xf2, - 0x3f, 0xeb, 0xe9, 0xba, 0x1f, 0xa1, 0x0e, 0x33, 0x92, 0xf4, 0xf4, 0xb6, 0x1f, 0xa5, 0xef, 0x6d, - 0x24, 0x9a, 0xf9, 0x4b, 0x39, 0x98, 0xe4, 0x27, 0x55, 0x3e, 0x61, 0x9e, 0xd9, 0xc5, 0xf8, 0xb6, - 0xb6, 0x18, 0x2f, 0xc9, 0x8d, 0x41, 0x69, 0xda, 0x50, 0x4b, 0x71, 0x0f, 0x48, 0x3f, 0x0d, 0xb1, - 0xa4, 0x3d, 0x65, 0x98, 0x55, 0x78, 0x2b, 0xb9, 0x8f, 0x0e, 0x91, 0xc8, 0x46, 0x51, 0x18, 0x5a, - 0x1a, 0x0f, 0xf3, 0x17, 0x73, 0x30, 0xa1, 0xe8, 0x93, 0xcf, 0x6c, 0xc7, 0x7f, 0x51, 0xeb, 0x78, - 0x79, 0x07, 0xa1, 0xb4, 0x6c, 0xa8, 0x7e, 0xef, 0xc1, 0x74, 0x1f, 0x49, 0x5a, 0x2d, 0x37, 0x86, - 0x51, 0xcb, 0x5f, 0xeb, 0xbf, 0x30, 0xe7, 0xde, 0xd6, 0xf1, 0x85, 0xb9, 0x7a, 0x43, 0xff, 0xad, - 0x1c, 0x9c, 0x13, 0xbf, 0x6a, 0x3d, 0xd7, 0x8b, 0xe6, 0xfd, 0xce, 0x8e, 0xb7, 0xfb, 0xcc, 0x8e, - 0x45, 0x4d, 0x1b, 0x8b, 0xaa, 0x3e, 0x16, 0x4a, 0x03, 0x07, 0x0f, 0x89, 0xf9, 0xaf, 0x8a, 0x30, - 0x33, 0x88, 0x80, 0x1d, 0xfb, 0x95, 0x53, 0x15, 0x1e, 0xfb, 0x53, 0x27, 0x56, 0x7e, 0x9e, 0x4a, - 0x1c, 0x44, 0x72, 0x43, 0x38, 0x88, 0x2c, 0x43, 0x05, 0x3f, 0xd5, 0xa0, 0x21, 0xeb, 0x84, 0x30, - 0x71, 0xf5, 0xbc, 0x7a, 0x74, 0x58, 0xbd, 0xe2, 0xb0, 0x32, 0x3b, 0x14, 0x85, 0x76, 0x2f, 0xf0, - 0x14, 0x1e, 0x7d, 0x94, 0xe4, 0x77, 0x0c, 0x98, 0x44, 0xe0, 0xe2, 0x43, 0xda, 0x89, 0x90, 0x59, - 0x41, 0x5c, 0xd2, 0xc4, 0x11, 0x35, 0x8d, 0x28, 0xf0, 0x3a, 0xbb, 0x68, 0x48, 0x0a, 0xeb, 0xdb, - 0xac, 0x17, 0xfe, 0xf4, 0xb0, 0xfa, 0xce, 0xc7, 0x89, 0xd2, 0x11, 0xac, 0x42, 0x76, 0x90, 0xe7, - 0x15, 0xa5, 0xf8, 0xd9, 0x54, 0x35, 0x53, 0x35, 0x22, 0x3f, 0x0a, 0x17, 0x17, 0x3b, 0xce, 0x76, - 0x8b, 0xce, 0xfb, 0x9d, 0xc8, 0xeb, 0xf4, 0xfc, 0x5e, 0x58, 0x77, 0x9a, 0xfb, 0xbd, 0x6e, 0x28, - 0x8c, 0x9d, 0xd8, 0xf2, 0x66, 0x5c, 0x68, 0x6f, 0xf3, 0x52, 0x85, 0xe5, 0x20, 0x06, 0xe4, 0x1e, - 0x4c, 0xf3, 0xa2, 0x5a, 0x2f, 0xf2, 0x1b, 0x4d, 0xa7, 0xe5, 0x75, 0x76, 0xd1, 0x06, 0x5a, 0xac, - 0x5f, 0x66, 0x67, 0x4b, 0xa7, 0x17, 0xf9, 0x76, 0xc8, 0xe1, 0x0a, 0xbf, 0x7e, 0x22, 0xb2, 0x04, - 0x53, 0x16, 0x75, 0xdc, 0x07, 0xce, 0xe3, 0x79, 0xa7, 0xeb, 0x34, 0xbd, 0xe8, 0x00, 0x4f, 0x66, - 0xf9, 0x7a, 0xf5, 0xe8, 0xb0, 0xfa, 0x5c, 0x40, 0x1d, 0xd7, 0x6e, 0x3b, 0x8f, 0xed, 0xa6, 0x28, - 0x54, 0x98, 0xa5, 0xe9, 0x62, 0x56, 0x5e, 0x27, 0x66, 0x55, 0x4a, 0xb3, 0xf2, 0x3a, 0x83, 0x59, - 0x25, 0x74, 0x92, 0xd5, 0xba, 0x13, 0xec, 0xd2, 0x88, 0x1b, 0x09, 0xe1, 0xaa, 0x71, 0xdd, 0x50, - 0x58, 0x45, 0x58, 0x66, 0xa3, 0xc1, 0x30, 0xcd, 0x4a, 0xa1, 0x63, 0x33, 0x6f, 0x2b, 0xf0, 0x22, - 0xaa, 0xb6, 0x70, 0x1c, 0xab, 0x85, 0xfd, 0x8f, 0x66, 0xd2, 0x41, 0x4d, 0xec, 0xa3, 0x4c, 0xb8, - 0x29, 0x8d, 0x2c, 0xf7, 0x71, 0xcb, 0x6e, 0x65, 0x1f, 0x65, 0xcc, 0x4d, 0x6d, 0xe7, 0x04, 0xb6, - 0x53, 0xe1, 0x36, 0xa0, 0xa1, 0x7d, 0x94, 0x64, 0x85, 0x75, 0x5a, 0x44, 0x3b, 0x6c, 0x46, 0x0b, - 0x23, 0xe9, 0x24, 0x56, 0xed, 0x25, 0x71, 0xa6, 0xae, 0x04, 0xb2, 0xd8, 0xce, 0x30, 0x99, 0xa6, - 0x89, 0x3f, 0x28, 0x14, 0x47, 0x2a, 0xa3, 0x56, 0x85, 0x4f, 0xf9, 0x88, 0x4d, 0x1c, 0x94, 0xc5, - 0xe6, 0x6f, 0xe4, 0xe0, 0x92, 0x14, 0xc7, 0x34, 0x7a, 0xe4, 0x07, 0xfb, 0x5e, 0x67, 0xf7, 0x19, - 0x97, 0xaa, 0x77, 0x34, 0xa9, 0xfa, 0x52, 0x6a, 0x87, 0x4b, 0xb5, 0xf2, 0x18, 0xd1, 0xfa, 0x27, - 0x23, 0xf0, 0xfc, 0xb1, 0x54, 0xe4, 0x43, 0xb6, 0x0b, 0x7a, 0xb4, 0x13, 0x2d, 0xb9, 0x2d, 0xca, - 0x8e, 0x61, 0x7e, 0x2f, 0x12, 0xc6, 0xec, 0x17, 0x8f, 0x0e, 0xab, 0x67, 0x79, 0xa0, 0x89, 0xed, - 0xb9, 0x2d, 0x6a, 0x47, 0xbc, 0x58, 0x1b, 0xa6, 0x7e, 0x6a, 0xc6, 0x32, 0x0e, 0x7b, 0x5b, 0xea, - 0x44, 0x34, 0x78, 0xe8, 0x70, 0x7f, 0x7b, 0xc1, 0x72, 0x9f, 0xd2, 0xae, 0xed, 0xb0, 0x52, 0xdb, - 0x13, 0xc5, 0x3a, 0xcb, 0x3e, 0x6a, 0x72, 0x47, 0x61, 0x39, 0xcf, 0x0e, 0x07, 0x0f, 0x9c, 0xc7, - 0x42, 0xe3, 0x45, 0xfb, 0xaa, 0xc2, 0x92, 0xfb, 0xd8, 0xb5, 0x9d, 0xc7, 0x56, 0x3f, 0x09, 0xf9, - 0x3a, 0x9c, 0x17, 0x82, 0x9b, 0x09, 0xb1, 0xc0, 0x6f, 0xc9, 0x16, 0x17, 0x90, 0xd7, 0x2b, 0x47, - 0x87, 0xd5, 0x8b, 0x42, 0xec, 0xdb, 0x4d, 0x8e, 0x91, 0xd9, 0xea, 0x6c, 0x2e, 0x64, 0x9d, 0x6d, - 0x64, 0xa9, 0xee, 0x78, 0x40, 0xc3, 0xd0, 0xd9, 0x95, 0xda, 0x31, 0xbf, 0x51, 0x52, 0x3a, 0xd3, - 0x6e, 0xf3, 0x72, 0x6b, 0x20, 0x25, 0xb9, 0x07, 0x93, 0x5b, 0x74, 0x5b, 0x1d, 0x9f, 0xd1, 0x78, - 0x89, 0x57, 0x1e, 0xd1, 0xed, 0xc1, 0x83, 0x93, 0xa2, 0x23, 0x1e, 0x4c, 0xaf, 0x05, 0xfe, 0xe3, - 0x03, 0x76, 0xd4, 0xa3, 0x1d, 0x1a, 0xa0, 0x73, 0xd7, 0x18, 0x9a, 0xab, 0x66, 0x12, 0xcd, 0x52, - 0x2f, 0xaf, 0x7f, 0xe6, 0xe8, 0xb0, 0xfa, 0x7c, 0x97, 0x81, 0xed, 0x96, 0x80, 0xdb, 0xa9, 0xa8, - 0xb3, 0x7e, 0xae, 0xe4, 0xc7, 0x61, 0xca, 0xf2, 0x7b, 0x91, 0xd7, 0xd9, 0x6d, 0x44, 0x81, 0x13, - 0xd1, 0x5d, 0x2e, 0xc8, 0x13, 0x2f, 0xb2, 0x54, 0x29, 0x37, 0x4c, 0x07, 0x1c, 0x68, 0x87, 0x02, - 0xaa, 0x49, 0x52, 0x9d, 0xc0, 0xfc, 0xb5, 0x1c, 0xcc, 0x88, 0x61, 0xb0, 0x68, 0xd3, 0x0f, 0xdc, - 0x67, 0x7f, 0xd9, 0x2f, 0x6a, 0xcb, 0xfe, 0xc5, 0xd8, 0x47, 0x29, 0xab, 0x91, 0xc7, 0xac, 0xfa, - 0xdf, 0x37, 0xe0, 0xca, 0x71, 0x44, 0xac, 0x77, 0x62, 0xbf, 0xbe, 0x52, 0x9f, 0xff, 0x5e, 0x17, - 0xce, 0xe2, 0x78, 0xa2, 0xe1, 0x38, 0xbc, 0xe7, 0x87, 0x11, 0x5a, 0xef, 0x72, 0x9a, 0x23, 0x41, - 0xdd, 0xf7, 0x5b, 0x28, 0xe7, 0xeb, 0xaf, 0x31, 0x71, 0xfe, 0xa7, 0x87, 0x55, 0x60, 0x20, 0xee, - 0x89, 0xc7, 0xf6, 0x7c, 0x3e, 0x63, 0xd0, 0x2e, 0x1d, 0xda, 0xe8, 0xfd, 0xb1, 0x4f, 0x0f, 0x42, - 0x2b, 0x8b, 0x35, 0x5a, 0x68, 0x6a, 0xbd, 0x68, 0x6f, 0x2d, 0xa0, 0x3b, 0x34, 0xa0, 0x9d, 0x26, - 0xfd, 0x94, 0x59, 0x68, 0xf4, 0xc6, 0x0d, 0x75, 0x3c, 0xf9, 0x8b, 0x31, 0x38, 0x97, 0x45, 0xc6, - 0xfa, 0x45, 0xd1, 0x88, 0xd3, 0x21, 0xca, 0xff, 0xbf, 0x01, 0xe5, 0x06, 0x6d, 0xfa, 0x1d, 0xf7, - 0x8e, 0xd3, 0x8c, 0x7c, 0xe9, 0x92, 0x61, 0x73, 0xc9, 0xc6, 0xe0, 0xf6, 0x0e, 0x16, 0x68, 0x96, - 0x81, 0x2f, 0x0d, 0xa7, 0x88, 0x36, 0x7d, 0x74, 0x84, 0x8d, 0xd8, 0x9c, 0x4c, 0x3e, 0x81, 0xb7, - 0x1a, 0xda, 0x47, 0x49, 0x1d, 0x26, 0xe6, 0xfd, 0x4e, 0x87, 0xb2, 0x1f, 0x8a, 0x5b, 0x27, 0x3a, - 0x62, 0x36, 0x65, 0x41, 0xda, 0x42, 0xa0, 0x93, 0x90, 0xdb, 0x90, 0xdf, 0x98, 0xbb, 0x23, 0xc6, - 0x40, 0x3a, 0xab, 0x6d, 0xcc, 0xdd, 0xc1, 0xb3, 0x2e, 0xd3, 0x1f, 0x26, 0x7a, 0x73, 0x3b, 0xaa, - 0x0d, 0x74, 0x63, 0xee, 0x0e, 0x59, 0x85, 0x69, 0x8b, 0x7e, 0xa3, 0xe7, 0x05, 0x54, 0x2c, 0x80, - 0x07, 0x77, 0x6a, 0x38, 0x16, 0x45, 0x2e, 0xc7, 0x02, 0x5e, 0x28, 0x75, 0x7b, 0xbb, 0xbd, 0xa3, - 0x86, 0xe5, 0xf5, 0xd3, 0x92, 0x9f, 0x86, 0xf3, 0x0b, 0x5e, 0x28, 0xea, 0xcc, 0x8d, 0x8f, 0x2e, - 0xde, 0x43, 0x8e, 0x0e, 0x58, 0x0e, 0x5f, 0xc8, 0x5c, 0x0e, 0x9f, 0x71, 0x63, 0x26, 0x36, 0xb7, - 0x6c, 0xba, 0x69, 0x7f, 0xd8, 0xec, 0xef, 0x90, 0x8f, 0x60, 0x12, 0xad, 0x3d, 0x68, 0x8f, 0x45, - 0x17, 0xe9, 0xb1, 0x01, 0x5f, 0xfe, 0x5c, 0xe6, 0x97, 0x2f, 0xa3, 0xf1, 0xc8, 0x46, 0xab, 0x2e, - 0xba, 0x53, 0x6b, 0x67, 0x04, 0x8d, 0x33, 0xf9, 0x00, 0xa6, 0xc4, 0xa6, 0xb3, 0xba, 0xb3, 0xbe, - 0x47, 0x17, 0x9c, 0x03, 0xe1, 0x84, 0x80, 0xfa, 0x9f, 0xd8, 0xa9, 0x6c, 0x7f, 0xc7, 0x8e, 0xf6, - 0xa8, 0xed, 0x3a, 0x9a, 0x78, 0x4e, 0x11, 0x92, 0x9f, 0x84, 0xf1, 0x65, 0x1f, 0x2f, 0x9e, 0x50, - 0xd4, 0x94, 0x90, 0xcf, 0x57, 0x30, 0x2c, 0x97, 0x83, 0x53, 0x9b, 0xc8, 0x0f, 0x0f, 0xab, 0x6f, - 0x9f, 0x76, 0x16, 0x2a, 0x1f, 0xb0, 0xd4, 0xaf, 0x91, 0x79, 0x28, 0x6e, 0xd1, 0x6d, 0xd6, 0xda, - 0x74, 0x48, 0x99, 0x04, 0x73, 0x79, 0xf1, 0x48, 0xfc, 0x52, 0x6f, 0x75, 0x24, 0x06, 0x09, 0x60, - 0x1a, 0xfb, 0x67, 0xcd, 0x09, 0xc3, 0x47, 0x7e, 0xe0, 0xb6, 0x68, 0x28, 0xaf, 0x47, 0xfa, 0x3b, - 0x7f, 0x2e, 0xb3, 0xf3, 0xaf, 0xf0, 0xce, 0xef, 0x2a, 0x1c, 0xd4, 0xe9, 0xd6, 0xc7, 0xde, 0xfc, - 0x17, 0x06, 0xce, 0x7a, 0x72, 0x03, 0x9d, 0xcf, 0x62, 0xaf, 0x76, 0x3c, 0xcd, 0x3a, 0xdd, 0xae, - 0xee, 0x97, 0xce, 0x51, 0xd8, 0xd1, 0xf7, 0x8e, 0xd3, 0xa4, 0x91, 0xb4, 0x91, 0x22, 0xf2, 0x0e, - 0x42, 0xd4, 0xa3, 0x2f, 0xc7, 0x21, 0x5f, 0x86, 0x73, 0x0b, 0xf4, 0xa1, 0xd7, 0xa4, 0xb5, 0x28, - 0xa2, 0x21, 0xef, 0xe1, 0xf9, 0x1a, 0xbf, 0x4c, 0x2c, 0xd5, 0x5f, 0x3a, 0x3a, 0xac, 0x5e, 0x75, - 0xb1, 0xdc, 0x76, 0x12, 0x04, 0xbb, 0xe9, 0xa8, 0xbc, 0x32, 0x39, 0x98, 0xff, 0xd3, 0x48, 0x7a, - 0x9d, 0xbc, 0x02, 0x05, 0x6b, 0x2d, 0xae, 0x3f, 0xbf, 0x27, 0x4c, 0x55, 0x1f, 0x11, 0xc8, 0x57, - 0xe1, 0xbc, 0xc2, 0x07, 0x7b, 0x84, 0xba, 0xac, 0x42, 0xbc, 0x31, 0x2f, 0xe3, 0xc5, 0x90, 0x52, - 0x13, 0x87, 0x63, 0xa4, 0x6a, 0x94, 0xcd, 0x83, 0x35, 0x56, 0x29, 0x58, 0xa0, 0x1d, 0x8f, 0xf3, - 0x56, 0x1a, 0xab, 0xf2, 0x76, 0x11, 0x21, 0xdd, 0xd8, 0x2c, 0x0e, 0x1f, 0x14, 0x8a, 0x85, 0xca, - 0x88, 0xf9, 0x97, 0x86, 0x92, 0x53, 0xe1, 0x19, 0xdd, 0xb1, 0xde, 0xd4, 0x76, 0xac, 0x73, 0x82, - 0x34, 0x6e, 0x15, 0x2b, 0xcb, 0xd4, 0x32, 0xa6, 0x60, 0x42, 0x43, 0x42, 0x37, 0xdb, 0x8d, 0x90, - 0x06, 0xdc, 0x26, 0xf9, 0xe9, 0x72, 0xb3, 0x8d, 0xdb, 0x35, 0x94, 0xf7, 0xe4, 0x9f, 0x19, 0x30, - 0x95, 0xa2, 0x60, 0xbd, 0xc1, 0x40, 0x6a, 0x6f, 0xf4, 0x42, 0x1a, 0x58, 0x08, 0xe5, 0x4e, 0x79, - 0xcb, 0xba, 0x53, 0x5e, 0xcb, 0x62, 0x30, 0xf2, 0x25, 0x18, 0xd9, 0xc0, 0x13, 0x84, 0xee, 0xd7, - 0x11, 0xf3, 0xc7, 0x42, 0xbe, 0xc2, 0x7a, 0xec, 0x5f, 0x55, 0x40, 0x60, 0x19, 0x69, 0xc0, 0xd8, - 0x7c, 0x40, 0x31, 0x7b, 0x42, 0x61, 0xf8, 0x0b, 0xb8, 0x26, 0x27, 0x49, 0x5f, 0xc0, 0x09, 0x4e, - 0xe6, 0xaf, 0xe6, 0x80, 0x24, 0x6d, 0xa4, 0xcd, 0x80, 0x46, 0xe1, 0x33, 0x3b, 0xe8, 0xef, 0x6b, - 0x83, 0xfe, 0x7c, 0xdf, 0xa0, 0xf3, 0xe6, 0x0d, 0x35, 0xf6, 0x7f, 0x68, 0xc0, 0x85, 0x6c, 0x42, - 0xf2, 0x22, 0x8c, 0xae, 0xae, 0xaf, 0x49, 0xd7, 0x20, 0xd1, 0x14, 0xbf, 0x8b, 0x9a, 0xb1, 0x25, - 0x8a, 0xc8, 0xeb, 0x30, 0xfa, 0xa1, 0x35, 0xcf, 0xb6, 0x4c, 0x25, 0x7a, 0xe6, 0x1b, 0x81, 0xdd, - 0xd4, 0x8f, 0x5c, 0x02, 0x49, 0x1d, 0xdb, 0xfc, 0x53, 0x1b, 0xdb, 0x6f, 0xe5, 0x60, 0xaa, 0xd6, - 0x6c, 0xd2, 0x30, 0x64, 0x0a, 0x11, 0x0d, 0xa3, 0x67, 0x76, 0x60, 0xb3, 0x9d, 0x7e, 0xb4, 0xb6, - 0x0d, 0x35, 0xaa, 0x7f, 0x64, 0xc0, 0x79, 0x49, 0xf5, 0xd0, 0xa3, 0x8f, 0xd6, 0xf7, 0x02, 0x1a, - 0xee, 0xf9, 0x2d, 0x77, 0xd8, 0x38, 0x30, 0xdc, 0xa5, 0xbd, 0x56, 0x44, 0x03, 0xd5, 0x40, 0xbd, - 0x83, 0x10, 0x6d, 0x97, 0x46, 0x08, 0x99, 0x85, 0xb1, 0x5a, 0xb7, 0x1b, 0xf8, 0x0f, 0xf9, 0xb2, - 0x9f, 0x10, 0xf7, 0x91, 0x1c, 0xa4, 0xdd, 0x5f, 0x72, 0x10, 0xab, 0xc6, 0x02, 0xed, 0x70, 0x8f, - 0xe6, 0x09, 0x5e, 0x0d, 0x97, 0x76, 0x54, 0x0d, 0x0d, 0xcb, 0xcd, 0x6f, 0x16, 0xa0, 0xac, 0x36, - 0x84, 0x98, 0x30, 0xca, 0xdd, 0x53, 0x54, 0x37, 0x01, 0x07, 0x21, 0x96, 0x28, 0x49, 0xbc, 0x7e, - 0x72, 0x27, 0x7a, 0xfd, 0x6c, 0xc1, 0xc4, 0x5a, 0xe0, 0x77, 0xfd, 0x90, 0xba, 0x3c, 0x01, 0x0e, - 0x97, 0x5a, 0x67, 0x63, 0x57, 0x58, 0xde, 0xe7, 0xac, 0x88, 0x1f, 0x07, 0xba, 0x02, 0xdb, 0x4e, - 0xa7, 0xc7, 0xd1, 0xf9, 0x70, 0x03, 0xbf, 0x13, 0x8a, 0x70, 0x81, 0xd8, 0xc0, 0xcf, 0x20, 0xba, - 0x81, 0x9f, 0x41, 0xd4, 0x65, 0x31, 0xf2, 0xb4, 0x96, 0x05, 0xf9, 0x55, 0x03, 0xc6, 0x6b, 0x9d, - 0x8e, 0xf0, 0xfa, 0x91, 0x51, 0xe4, 0xe7, 0x13, 0x23, 0x3f, 0x77, 0x0b, 0xe5, 0x36, 0xfe, 0xaf, - 0x09, 0x1b, 0xff, 0xdb, 0x1f, 0xcb, 0xc6, 0xbf, 0x1e, 0x38, 0x5e, 0x14, 0xe2, 0x65, 0x6e, 0xf2, - 0x41, 0xd5, 0xf5, 0x57, 0xa9, 0x07, 0x79, 0x1b, 0x2a, 0xf1, 0x7c, 0x5c, 0xea, 0xb8, 0xf4, 0x31, - 0xe5, 0x4e, 0x52, 0x13, 0x3c, 0xc2, 0x50, 0xbb, 0xbc, 0x48, 0x23, 0x9a, 0xdf, 0x32, 0xe0, 0x82, - 0x3a, 0x21, 0x1a, 0xbd, 0xed, 0xb6, 0x87, 0xc7, 0x1f, 0x72, 0x13, 0x4a, 0x62, 0xbc, 0x62, 0x45, - 0xae, 0x3f, 0x6b, 0x52, 0x82, 0x42, 0x16, 0xd9, 0x10, 0x31, 0x1e, 0xc2, 0x56, 0x70, 0x36, 0xb5, - 0xdc, 0x58, 0x51, 0x7d, 0x46, 0x74, 0x76, 0x25, 0xc0, 0xdf, 0xfa, 0xd8, 0x31, 0x88, 0xf9, 0x1e, - 0x4c, 0xeb, 0xb5, 0x6c, 0x50, 0x0c, 0x41, 0x93, 0x4d, 0x33, 0xb2, 0x9b, 0x26, 0xcb, 0xcd, 0x2d, - 0x20, 0x7d, 0xf4, 0x21, 0x5e, 0x54, 0xd1, 0x48, 0x5e, 0xa4, 0x4a, 0x73, 0x57, 0x1f, 0x62, 0x9c, - 0x3f, 0x6c, 0x5c, 0xed, 0x6e, 0x24, 0x35, 0xff, 0x1c, 0xe0, 0x6c, 0x86, 0xe8, 0x38, 0x61, 0x6b, - 0xaf, 0xea, 0x8b, 0xa7, 0x14, 0x7b, 0x04, 0xc8, 0x25, 0xf3, 0x9e, 0xcc, 0x15, 0x75, 0xcc, 0x52, - 0x39, 0x2e, 0x81, 0xd4, 0x27, 0xb1, 0xbd, 0xab, 0x4e, 0x3b, 0x23, 0x4f, 0xcd, 0x69, 0xa7, 0x0e, - 0x13, 0xa2, 0x55, 0x62, 0x29, 0x8f, 0x26, 0x66, 0x81, 0x80, 0x17, 0xd8, 0x7d, 0x4b, 0x5a, 0x27, - 0xe1, 0x3c, 0x42, 0xbf, 0xf5, 0x90, 0x0a, 0x1e, 0x63, 0x2a, 0x0f, 0x2c, 0xc8, 0xe4, 0xa1, 0x90, - 0x90, 0x7f, 0x64, 0x00, 0x11, 0x10, 0x75, 0x3d, 0x17, 0x8f, 0x5b, 0xcf, 0xee, 0xd3, 0x59, 0xcf, - 0xcf, 0xcb, 0x3a, 0x66, 0xaf, 0xeb, 0x8c, 0x6a, 0x91, 0x7f, 0x60, 0xc0, 0x34, 0xf7, 0x1c, 0x51, - 0x2b, 0x5b, 0x3a, 0xae, 0xb2, 0xcd, 0xa7, 0x53, 0xd9, 0x2b, 0x21, 0x7e, 0x76, 0x40, 0x5d, 0xfb, - 0x2b, 0x45, 0x7e, 0x14, 0x20, 0x5e, 0x51, 0xd2, 0x43, 0xf1, 0x4a, 0x86, 0x14, 0x88, 0x91, 0x92, - 0x20, 0xcb, 0x28, 0xa6, 0x53, 0x7d, 0x7a, 0x12, 0x6e, 0xe4, 0xa7, 0xe1, 0x1c, 0x5b, 0x2f, 0x31, - 0x44, 0xf8, 0xb9, 0xcd, 0x8c, 0xe3, 0x57, 0x3e, 0x3f, 0x78, 0x6b, 0xbf, 0x99, 0x45, 0xc6, 0xe3, - 0x44, 0x92, 0x30, 0xfe, 0xa8, 0xad, 0x1e, 0xf9, 0xb2, 0x28, 0xd0, 0xa1, 0x15, 0x6b, 0x1f, 0xce, - 0x94, 0xf1, 0x9b, 0x99, 0xf2, 0xed, 0x92, 0x5c, 0x0b, 0x5c, 0xbe, 0x85, 0x7a, 0xa0, 0x07, 0x82, - 0xc8, 0x87, 0x40, 0x1a, 0xbd, 0xdd, 0x5d, 0x1a, 0x46, 0xd4, 0xe5, 0x30, 0x1a, 0x84, 0x33, 0x13, - 0x28, 0x1f, 0xd0, 0x4c, 0x15, 0xca, 0x52, 0x3b, 0x90, 0xc5, 0xea, 0x24, 0xe9, 0x27, 0x26, 0x14, - 0xce, 0x89, 0x46, 0x33, 0xa8, 0x8c, 0xac, 0x0f, 0x67, 0x26, 0x35, 0x2f, 0xc2, 0xa4, 0xa4, 0xfe, - 0x82, 0xcc, 0x92, 0xa6, 0x84, 0xe7, 0x6b, 0xc7, 0xde, 0x2c, 0x76, 0x97, 0xb7, 0xe1, 0xd2, 0xc0, - 0xde, 0xcc, 0x88, 0x15, 0x99, 0xd5, 0x63, 0x45, 0x2e, 0x0d, 0x92, 0xba, 0xa1, 0x1a, 0x2f, 0xf2, - 0x5b, 0x46, 0x4a, 0xcc, 0x0a, 0x9d, 0x88, 0x67, 0xef, 0x1b, 0xb4, 0x0f, 0xe5, 0x30, 0x8f, 0x00, - 0x17, 0xc4, 0xb9, 0x44, 0x17, 0x63, 0x82, 0x58, 0x15, 0xe4, 0x28, 0x92, 0x9f, 0x50, 0xe2, 0x9a, - 0xff, 0xd4, 0x00, 0xc2, 0x6b, 0x38, 0xef, 0x74, 0x9d, 0x6d, 0xaf, 0xe5, 0x45, 0x1e, 0x0d, 0xc9, - 0x7d, 0xa8, 0x08, 0x16, 0xce, 0x76, 0x8b, 0xaa, 0x6e, 0x60, 0xe2, 0x9e, 0x38, 0x2e, 0xb3, 0xd3, - 0xda, 0x53, 0x1f, 0xe1, 0x80, 0x39, 0x92, 0x7b, 0x82, 0x39, 0x62, 0xfe, 0xc0, 0x80, 0x4b, 0xfd, - 0xd5, 0x16, 0x5f, 0x8e, 0x3b, 0xcf, 0x38, 0xa1, 0xf3, 0xb2, 0x5a, 0x99, 0x43, 0x0b, 0xeb, 0x53, - 0x6b, 0x65, 0x3e, 0x31, 0xd8, 0x9e, 0xbe, 0x95, 0x8f, 0xd4, 0x3c, 0x14, 0xe4, 0xf5, 0x2c, 0x87, - 0x1e, 0x1e, 0x75, 0xc3, 0xc1, 0xba, 0x2f, 0x8f, 0x3c, 0xe5, 0xe4, 0x32, 0x4f, 0x39, 0x32, 0x80, - 0x28, 0x9f, 0x15, 0x40, 0x64, 0xfe, 0x42, 0x0e, 0xca, 0x6b, 0xad, 0xde, 0xae, 0xd7, 0x59, 0x70, - 0x22, 0xe7, 0x99, 0x3d, 0x32, 0xbd, 0xa5, 0x1d, 0x99, 0x62, 0x8f, 0xb3, 0xb8, 0x61, 0xc3, 0xa5, - 0x70, 0x33, 0x60, 0x2a, 0x21, 0xe1, 0xe2, 0xe1, 0x1e, 0x14, 0xd8, 0x0f, 0xa1, 0x81, 0x5d, 0xed, - 0x63, 0x8c, 0x58, 0x37, 0xe3, 0xff, 0xc4, 0x21, 0x46, 0x4f, 0x9c, 0x87, 0x1c, 0x2e, 0x7f, 0x81, - 0xe7, 0xbd, 0x3a, 0x7d, 0x8e, 0xce, 0x7f, 0x62, 0x40, 0x25, 0xdd, 0x12, 0x72, 0x1f, 0xc6, 0x18, - 0x27, 0x2f, 0xce, 0xa1, 0xf5, 0xd2, 0x80, 0x36, 0xdf, 0x14, 0x68, 0xbc, 0x7a, 0xd8, 0xf9, 0x94, - 0x43, 0x2c, 0xc9, 0xe1, 0xb2, 0x05, 0x65, 0x15, 0x2b, 0xa3, 0x76, 0xaf, 0xe9, 0x32, 0xf1, 0x42, - 0x76, 0x3f, 0xa8, 0xb5, 0xfe, 0x4d, 0xad, 0xd6, 0x42, 0x1a, 0x0e, 0x9b, 0x0c, 0x11, 0x43, 0xee, - 0xf8, 0x72, 0x50, 0xe7, 0x99, 0x94, 0xfa, 0x7a, 0xc8, 0x1d, 0x87, 0xb1, 0xb3, 0x16, 0xff, 0x9e, - 0x98, 0x67, 0x78, 0xd6, 0xea, 0x22, 0x44, 0xd5, 0xd7, 0x39, 0x8e, 0xf9, 0xb7, 0xf3, 0x70, 0x21, - 0xa9, 0x1e, 0x4f, 0x0d, 0xb9, 0xe6, 0x04, 0x4e, 0x3b, 0x3c, 0x61, 0x05, 0x5c, 0xef, 0xab, 0x1a, - 0x86, 0x94, 0xcb, 0xaa, 0x29, 0x15, 0x32, 0x53, 0x15, 0xc2, 0x43, 0x2a, 0xaf, 0x90, 0xac, 0x06, - 0xb9, 0x0f, 0xf9, 0x06, 0x8d, 0x44, 0xe0, 0xe9, 0xb5, 0xbe, 0x5e, 0x55, 0xeb, 0x75, 0xb3, 0x41, - 0x23, 0x3e, 0x88, 0xdc, 0x77, 0x9f, 0x6a, 0xbe, 0xf4, 0xec, 0xb8, 0xb1, 0x05, 0xa3, 0x8b, 0x8f, - 0xbb, 0xb4, 0x19, 0x89, 0x78, 0xd3, 0x57, 0x8f, 0xe7, 0xc7, 0x71, 0x95, 0xa8, 0x56, 0x8a, 0x00, - 0xb5, 0xb3, 0x38, 0xca, 0xe5, 0x37, 0xa1, 0x28, 0x3f, 0x7e, 0xaa, 0xe8, 0xcc, 0xb7, 0x60, 0x5c, - 0xf9, 0xc8, 0xa9, 0x26, 0xfd, 0x5f, 0x19, 0x30, 0xca, 0xa4, 0xed, 0xe6, 0x1b, 0xcf, 0xa8, 0x44, - 0xba, 0xad, 0x49, 0xa4, 0x69, 0x25, 0x8c, 0x08, 0xd7, 0xe5, 0x1b, 0x27, 0xc8, 0xa2, 0x43, 0x03, - 0x20, 0x41, 0x26, 0x77, 0x61, 0x4c, 0xe4, 0x8b, 0x11, 0x79, 0x57, 0xd5, 0xb8, 0x24, 0x99, 0x97, - 0x2a, 0xd6, 0xe2, 0xfc, 0x6e, 0x5a, 0xed, 0x95, 0xd4, 0x64, 0x21, 0xf1, 0xdd, 0x56, 0x03, 0x61, - 0x19, 0x9b, 0x79, 0xbf, 0xc3, 0xe3, 0x54, 0x94, 0x0c, 0x57, 0x03, 0x9c, 0xb8, 0x6b, 0xc2, 0x70, - 0x93, 0x3f, 0x8e, 0xc9, 0x05, 0xc1, 0x24, 0xdb, 0xa6, 0xf3, 0xbf, 0xc6, 0x79, 0xe4, 0x87, 0xac, - 0xd8, 0xbb, 0x50, 0xbe, 0xe3, 0x07, 0x8f, 0x9c, 0xc0, 0xad, 0xed, 0x52, 0xe1, 0x75, 0x5f, 0x44, - 0xd7, 0xf9, 0x89, 0x1d, 0x0e, 0xb7, 0x1d, 0x56, 0xf0, 0xc3, 0xc3, 0x6a, 0xa1, 0xee, 0xfb, 0x2d, - 0x4b, 0x43, 0x27, 0xab, 0x30, 0xf1, 0xc0, 0x79, 0x2c, 0xee, 0x40, 0xd7, 0xd7, 0x97, 0x85, 0xef, - 0xce, 0xab, 0x47, 0x87, 0xd5, 0x4b, 0x6d, 0xe7, 0x71, 0x7c, 0x77, 0x3a, 0xd8, 0xbd, 0x5c, 0xa7, - 0x27, 0x1e, 0x4c, 0xae, 0xf9, 0x41, 0x24, 0x3e, 0xc2, 0x74, 0xf6, 0xfc, 0x80, 0x5b, 0xb4, 0xd9, - 0xcc, 0x5b, 0xb4, 0x4b, 0xec, 0xa0, 0x62, 0xef, 0xc4, 0xe4, 0x5a, 0xb8, 0xa2, 0xc6, 0x98, 0xbc, - 0x0b, 0xd3, 0xf3, 0x34, 0x88, 0xbc, 0x1d, 0xaf, 0xe9, 0x44, 0xf4, 0x8e, 0x1f, 0xb4, 0x9d, 0x48, - 0x18, 0x8c, 0xd0, 0x60, 0xd0, 0xa4, 0x9c, 0x53, 0xdb, 0x89, 0xac, 0x7e, 0x4c, 0xf2, 0xd5, 0x2c, - 0x6f, 0xa8, 0x11, 0x6c, 0xfe, 0xeb, 0x4c, 0x1b, 0xc9, 0xf0, 0x86, 0x1a, 0xd0, 0x05, 0x19, 0x7e, - 0x51, 0xbb, 0xc7, 0x5d, 0x25, 0x17, 0xeb, 0xb7, 0xc4, 0xb5, 0xf6, 0xc9, 0x57, 0xc5, 0xf1, 0xb8, - 0x0d, 0xb8, 0x32, 0x9e, 0x83, 0x7c, 0x7d, 0xed, 0x0e, 0x9a, 0x80, 0xc4, 0xd5, 0x2d, 0xed, 0xec, - 0x39, 0x9d, 0x26, 0x2a, 0x51, 0xc2, 0x1f, 0x44, 0x15, 0x78, 0xf5, 0xb5, 0x3b, 0xc4, 0x81, 0xb3, - 0x6b, 0x34, 0x68, 0x7b, 0xd1, 0x97, 0x6f, 0xdd, 0x52, 0x06, 0xaa, 0x88, 0x55, 0x9b, 0x15, 0x55, - 0xab, 0x76, 0x11, 0xc5, 0x7e, 0x7c, 0xeb, 0x56, 0xe6, 0x70, 0xc4, 0x15, 0xcb, 0xe2, 0x45, 0x16, - 0x61, 0xf2, 0x81, 0xf3, 0x58, 0x5c, 0xf2, 0xc7, 0x67, 0xd8, 0x3c, 0x46, 0x1b, 0xe0, 0xc4, 0x6a, - 0x26, 0x45, 0xea, 0x10, 0xeb, 0x44, 0xe4, 0x1d, 0x18, 0x4f, 0xa6, 0x57, 0x88, 0xd7, 0xbb, 0x79, - 0xee, 0x66, 0xaa, 0x4c, 0x4e, 0xcd, 0x56, 0xa6, 0xa0, 0x93, 0x8d, 0xd8, 0x04, 0xc1, 0x35, 0x61, - 0xbc, 0xd0, 0x2d, 0xd5, 0x67, 0x55, 0x13, 0x84, 0x83, 0x25, 0x5a, 0xb3, 0xa6, 0xe2, 0xb3, 0x01, - 0xf7, 0x3e, 0xb2, 0x74, 0x2e, 0x8a, 0x65, 0x63, 0x2d, 0xf0, 0xdb, 0xdd, 0x08, 0xbd, 0x30, 0x53, - 0x96, 0x8d, 0x2e, 0x96, 0x64, 0x58, 0x36, 0x38, 0x49, 0xb6, 0xef, 0xc2, 0xc4, 0x13, 0xf8, 0x2e, - 0x50, 0x28, 0x2c, 0xfb, 0xcd, 0x7d, 0x74, 0xbb, 0x2c, 0xd5, 0x3f, 0x64, 0xf2, 0xa3, 0xe5, 0x37, - 0xf7, 0x9f, 0xde, 0x9d, 0x3b, 0xb2, 0x27, 0x2b, 0xac, 0xed, 0x6c, 0x5a, 0x89, 0x4f, 0xcf, 0x4c, - 0x69, 0x37, 0x89, 0x5a, 0x19, 0x57, 0x54, 0xf8, 0x2c, 0x94, 0x0d, 0xb1, 0x74, 0x72, 0x42, 0xa1, - 0xb2, 0x40, 0xc3, 0xfd, 0xc8, 0xef, 0xce, 0xb7, 0xbc, 0xee, 0xb6, 0xef, 0x04, 0xee, 0x4c, 0x65, - 0x80, 0xc0, 0x78, 0x25, 0x53, 0x60, 0x4c, 0xbb, 0x9c, 0xde, 0x6e, 0x4a, 0x06, 0x56, 0x1f, 0x4b, - 0xf2, 0x55, 0x98, 0x64, 0xab, 0x65, 0xf1, 0x71, 0x44, 0x3b, 0x7c, 0x2a, 0x4d, 0xe3, 0x56, 0x7f, - 0x4e, 0x09, 0xdc, 0x8c, 0x0b, 0xf9, 0x24, 0x45, 0xe9, 0x41, 0x63, 0x02, 0x75, 0x92, 0xea, 0xac, - 0x88, 0x0b, 0x33, 0x0f, 0x9c, 0xc7, 0x4a, 0x9a, 0x23, 0x65, 0xd6, 0x13, 0x9c, 0xb1, 0xd7, 0x8f, - 0x0e, 0xab, 0x2f, 0xb1, 0x19, 0xbb, 0x1f, 0x23, 0x0d, 0x58, 0x00, 0x03, 0x39, 0x99, 0x3f, 0x9a, - 0xea, 0x79, 0xb2, 0x04, 0x63, 0xa2, 0x9d, 0x62, 0x6f, 0xeb, 0xef, 0xb1, 0xe7, 0x33, 0x7b, 0x6c, - 0x4c, 0xf4, 0x98, 0x25, 0xe9, 0xcd, 0x7f, 0x6d, 0xc0, 0x84, 0xd6, 0x28, 0xf2, 0xa6, 0xe2, 0x78, - 0x94, 0x38, 0x0c, 0x6a, 0x38, 0x99, 0xaf, 0x26, 0xbc, 0x29, 0xbc, 0xcd, 0x72, 0x83, 0xe9, 0x32, - 0xf3, 0xc8, 0x1d, 0x7b, 0xda, 0x4a, 0xd2, 0x35, 0x14, 0x06, 0xa4, 0x6b, 0xf8, 0xe5, 0x09, 0x98, - 0xd4, 0xb7, 0x51, 0xa6, 0xd7, 0x2e, 0xfb, 0xbb, 0x5e, 0x47, 0x1e, 0xcb, 0x79, 0x02, 0x12, 0x84, - 0x68, 0x4f, 0x10, 0x20, 0x84, 0xbc, 0x0c, 0x10, 0x5f, 0x70, 0xcb, 0x93, 0xb7, 0x78, 0x30, 0x41, - 0x29, 0x20, 0x3f, 0x06, 0xb0, 0xe2, 0xbb, 0x34, 0xce, 0x61, 0x73, 0x8c, 0x59, 0xee, 0x15, 0x61, - 0x96, 0x13, 0x8f, 0x1c, 0x1c, 0x1d, 0x56, 0xcf, 0x77, 0x7c, 0x97, 0xf6, 0x27, 0xaf, 0x51, 0x38, - 0x92, 0x2f, 0xc2, 0x88, 0xd5, 0x6b, 0x51, 0x99, 0x52, 0x65, 0x5c, 0x2e, 0xab, 0x5e, 0x4b, 0x49, - 0x7e, 0x1a, 0xf4, 0xd2, 0xb7, 0x31, 0x0c, 0x40, 0xde, 0x07, 0x60, 0x33, 0xe7, 0x6e, 0xe0, 0xf7, - 0xba, 0x32, 0x66, 0x1b, 0x4f, 0xe9, 0xca, 0xa4, 0xdb, 0xc5, 0x42, 0xf5, 0xe3, 0x09, 0x09, 0x59, - 0x85, 0x31, 0x21, 0xa4, 0xc4, 0x6d, 0xc7, 0x0b, 0x59, 0x76, 0x36, 0x45, 0x53, 0x11, 0x39, 0x4e, - 0x10, 0xac, 0x9b, 0xbe, 0xb8, 0x95, 0xe1, 0x1d, 0x28, 0x31, 0xf6, 0x1b, 0x21, 0x15, 0x91, 0xdc, - 0x25, 0xee, 0xf9, 0xa9, 0x54, 0xa8, 0x17, 0xea, 0x87, 0xfc, 0x84, 0x80, 0x7c, 0x15, 0xb3, 0x12, - 0x89, 0xae, 0x3e, 0xd6, 0x5c, 0x7b, 0xad, 0xaf, 0xab, 0xcf, 0x39, 0xdd, 0x6e, 0x46, 0x1a, 0xb7, - 0x98, 0x1f, 0xd9, 0x8d, 0xa3, 0xa3, 0xe2, 0x0c, 0xd8, 0xc7, 0x7c, 0xe0, 0x46, 0xdf, 0x07, 0x66, - 0x64, 0xc0, 0x4f, 0x7f, 0x2e, 0x22, 0x8d, 0x2f, 0xe9, 0x42, 0x25, 0x59, 0xcf, 0xe2, 0x5b, 0x70, - 0xdc, 0xb7, 0x5e, 0xef, 0xfb, 0x96, 0x3a, 0x80, 0x7d, 0x9f, 0xeb, 0xe3, 0x4e, 0xdc, 0x24, 0x5b, - 0xb1, 0xf8, 0xde, 0xf8, 0x71, 0xdf, 0x7b, 0xb9, 0xef, 0x7b, 0x67, 0xdd, 0xed, 0xfe, 0xef, 0xa4, - 0x78, 0x92, 0x77, 0x60, 0x42, 0x42, 0x70, 0x7d, 0xa0, 0x99, 0x54, 0x9c, 0x22, 0xdc, 0x6d, 0x74, - 0xf7, 0xd3, 0x13, 0xf1, 0xa8, 0xc8, 0x2a, 0x35, 0x9f, 0x1d, 0x13, 0x1a, 0x75, 0x7a, 0x56, 0xe8, - 0xc8, 0xe4, 0x2b, 0x30, 0xbe, 0xd4, 0x66, 0x0d, 0xf1, 0x3b, 0x4e, 0x44, 0x71, 0xcb, 0x4b, 0x4c, - 0xcf, 0x4a, 0x89, 0x32, 0x55, 0x79, 0xc6, 0xcf, 0xa4, 0x48, 0x55, 0x19, 0x14, 0x0a, 0xd6, 0x79, - 0xdc, 0xba, 0x24, 0xe6, 0x70, 0x28, 0x36, 0xb8, 0xe7, 0x33, 0xcc, 0xbf, 0x0a, 0x7b, 0xdc, 0x31, - 0xb8, 0xd1, 0xca, 0x16, 0x0b, 0x42, 0xeb, 0x3c, 0x9d, 0x27, 0x79, 0x17, 0xc6, 0x45, 0x2c, 0x6a, - 0xcd, 0x5a, 0x09, 0x67, 0x2a, 0xd8, 0x78, 0xcc, 0xa2, 0x27, 0xc3, 0x56, 0x6d, 0x27, 0x48, 0xdd, - 0x01, 0x26, 0xf8, 0xe4, 0xcb, 0x70, 0x6e, 0xcb, 0xeb, 0xb8, 0xfe, 0xa3, 0x50, 0x08, 0x70, 0x21, - 0xe8, 0xa6, 0x13, 0x4f, 0xa7, 0x47, 0xbc, 0xdc, 0x96, 0x9b, 0x63, 0x9f, 0xe0, 0xcb, 0xe4, 0x40, - 0x7e, 0xaa, 0x8f, 0x33, 0x9f, 0x41, 0xe4, 0xb8, 0x19, 0x34, 0xd7, 0x37, 0x83, 0xfa, 0x3f, 0x9f, - 0x9e, 0x4e, 0x99, 0x9f, 0x21, 0x3e, 0x10, 0x5d, 0xb3, 0xf9, 0xc0, 0xf7, 0x3a, 0x33, 0x67, 0xb5, - 0xf7, 0x65, 0x62, 0x67, 0x67, 0xc4, 0x5b, 0xf3, 0x5b, 0x5e, 0xf3, 0xa0, 0x6e, 0x1e, 0x1d, 0x56, - 0x5f, 0x48, 0xeb, 0x4c, 0x1f, 0xf9, 0x9a, 0x09, 0x23, 0x83, 0x35, 0xf9, 0x0a, 0x94, 0xd9, 0xdf, - 0x58, 0xc1, 0x3c, 0xa7, 0x5d, 0x18, 0x2a, 0x98, 0xe2, 0x3b, 0x38, 0x46, 0x18, 0x2c, 0x9b, 0xa1, - 0x7b, 0x6a, 0xac, 0xcc, 0x1f, 0x18, 0x70, 0x2e, 0xab, 0xae, 0x27, 0x64, 0x26, 0x32, 0x53, 0xae, - 0x03, 0x68, 0xfd, 0xe0, 0xae, 0x03, 0xb1, 0xc3, 0x40, 0x15, 0x46, 0xd8, 0x89, 0x5c, 0xba, 0xb6, - 0xe1, 0x76, 0xc8, 0x4e, 0xed, 0xa1, 0xc5, 0xe1, 0x0c, 0x01, 0xc3, 0x20, 0x70, 0xbf, 0x1c, 0xe1, - 0x08, 0x18, 0x2b, 0x61, 0x71, 0x38, 0x43, 0x60, 0xdb, 0xae, 0xdc, 0x26, 0x10, 0x81, 0xed, 0xc6, - 0xa1, 0xc5, 0xe1, 0xe4, 0x1a, 0x8c, 0xad, 0x76, 0x96, 0xa9, 0xf3, 0x90, 0x8a, 0x7b, 0x3b, 0xb4, - 0xd6, 0xf8, 0x1d, 0xbb, 0xc5, 0x60, 0x96, 0x2c, 0x34, 0xbf, 0x63, 0xc0, 0x74, 0x5f, 0x37, 0x9d, - 0x9c, 0x7c, 0xe9, 0xf8, 0x4b, 0xd2, 0x61, 0xda, 0xc7, 0xab, 0x5f, 0xc8, 0xae, 0xbe, 0xf9, 0xfb, - 0x05, 0xb8, 0x38, 0x60, 0xd7, 0x4a, 0x1c, 0x1c, 0x8c, 0x13, 0x1d, 0x1c, 0xbe, 0xc6, 0x76, 0x09, - 0xc7, 0x6b, 0x87, 0xeb, 0x7e, 0x52, 0xe3, 0xe4, 0x2e, 0x08, 0xcb, 0x64, 0x76, 0x13, 0x99, 0x89, - 0xe3, 0x52, 0x13, 0x29, 0xec, 0xc8, 0xef, 0x33, 0x89, 0xeb, 0xcc, 0xfa, 0x5c, 0x0c, 0xf2, 0x7f, - 0x4d, 0x5c, 0x0c, 0xf4, 0x8b, 0xbd, 0xc2, 0x53, 0xbd, 0xd8, 0xcb, 0xbe, 0x03, 0x18, 0x79, 0x92, - 0xdb, 0xb0, 0x79, 0x98, 0x68, 0x50, 0x27, 0x68, 0xee, 0xd5, 0x42, 0x3e, 0x48, 0xa3, 0xc8, 0x0d, - 0x45, 0x72, 0x88, 0x05, 0xb6, 0x13, 0xf6, 0x8f, 0x85, 0x46, 0x63, 0xfe, 0xbb, 0x94, 0x67, 0xc4, - 0x5f, 0xc7, 0xf9, 0xf2, 0x2a, 0x8c, 0x6c, 0xed, 0xd1, 0x40, 0x2a, 0xc9, 0x58, 0x91, 0x47, 0x0c, - 0xa0, 0x56, 0x04, 0x31, 0xcc, 0x9f, 0x84, 0xb2, 0xfa, 0x31, 0x14, 0x08, 0xec, 0xb7, 0x58, 0x91, - 0x5c, 0x20, 0x30, 0x80, 0xc5, 0xe1, 0x27, 0x26, 0x44, 0x4b, 0x7a, 0x21, 0x7f, 0x52, 0x2f, 0xb0, - 0x8f, 0xe3, 0x7c, 0x53, 0x3e, 0x8e, 0xbf, 0xd5, 0x8f, 0x47, 0x0c, 0x60, 0x71, 0xf8, 0x53, 0xfd, - 0xf8, 0xbf, 0x35, 0xa0, 0x80, 0xc9, 0x28, 0xde, 0x80, 0x92, 0x34, 0x29, 0xab, 0x09, 0x1a, 0xce, - 0x4a, 0x8b, 0x73, 0xa8, 0xfb, 0xb5, 0x08, 0x20, 0xfb, 0xd4, 0x26, 0x0d, 0xb6, 0x35, 0xf7, 0xa7, - 0x87, 0x0c, 0xa0, 0x7e, 0x0a, 0x31, 0x4e, 0x31, 0x1e, 0xe8, 0xe2, 0x25, 0x4e, 0x84, 0x5c, 0x64, - 0x71, 0x17, 0xaf, 0xbe, 0xe3, 0x9f, 0xc4, 0x32, 0x7f, 0xdd, 0x80, 0xf3, 0x99, 0x9a, 0x0c, 0xfb, - 0x2a, 0x57, 0x99, 0x94, 0xe9, 0x98, 0xd6, 0x97, 0x38, 0xc6, 0x69, 0x5c, 0xb9, 0x4e, 0x31, 0xb7, - 0x3e, 0x03, 0xa5, 0xf8, 0x84, 0x49, 0xce, 0xc9, 0xa1, 0x43, 0xbb, 0xa3, 0x3c, 0x8e, 0xfd, 0x95, - 0x01, 0xa3, 0xac, 0x0a, 0xcf, 0x6c, 0x64, 0x4f, 0xb6, 0x15, 0x9a, 0x35, 0x69, 0xa8, 0x78, 0x9e, - 0xdf, 0x19, 0x05, 0x48, 0x90, 0xc9, 0x36, 0x4c, 0xae, 0x2e, 0x2d, 0xcc, 0x2f, 0xb9, 0xb4, 0x13, - 0xe1, 0x35, 0x6c, 0x2a, 0xc3, 0x03, 0x3b, 0x1a, 0x07, 0x1d, 0xa7, 0x25, 0x10, 0x0e, 0x12, 0xd9, - 0xe0, 0x7b, 0x6e, 0xd3, 0xf6, 0x62, 0x3a, 0x55, 0xa5, 0xd4, 0x39, 0xb2, 0x6f, 0x34, 0x6a, 0x0f, - 0x96, 0x95, 0x6f, 0xe4, 0x86, 0xfc, 0x46, 0xe8, 0xb4, 0x5b, 0x03, 0xbe, 0xa1, 0x73, 0x24, 0x7b, - 0x50, 0xb9, 0x8b, 0xbb, 0x8f, 0xf2, 0x95, 0xfc, 0xf1, 0x5f, 0x79, 0x51, 0x7c, 0xe5, 0x39, 0xbe, - 0x6d, 0x65, 0x7f, 0xa7, 0x8f, 0x6b, 0x32, 0x73, 0x0b, 0x27, 0xce, 0xdc, 0xbf, 0x61, 0xc0, 0x28, - 0xdf, 0xde, 0xe2, 0x47, 0x62, 0x32, 0x37, 0xd0, 0xad, 0xa7, 0xb3, 0x81, 0x56, 0x50, 0x72, 0x69, - 0x26, 0x04, 0x5e, 0x46, 0x16, 0x52, 0x2f, 0xce, 0xc8, 0xab, 0x06, 0x54, 0xad, 0x79, 0x49, 0xe2, - 0x10, 0xc7, 0x1f, 0x9b, 0x51, 0xb9, 0x70, 0x0c, 0xf5, 0xfd, 0xcb, 0xb1, 0x27, 0x7c, 0xff, 0x72, - 0x19, 0x4a, 0xc2, 0xc3, 0xab, 0x7e, 0x20, 0x0e, 0xd0, 0xd2, 0x44, 0x14, 0xc3, 0x95, 0xc4, 0xe7, - 0x1c, 0x64, 0x6f, 0x6b, 0x69, 0x0b, 0x63, 0x44, 0xb2, 0x0a, 0xa5, 0x24, 0x2c, 0xa9, 0xa4, 0xdd, - 0x17, 0xc7, 0x70, 0xe1, 0x02, 0xcd, 0x23, 0x5f, 0x33, 0xa3, 0x90, 0x12, 0x1e, 0xe6, 0x37, 0x0d, - 0xa8, 0xa4, 0xe7, 0x0b, 0x79, 0x07, 0xc6, 0xe3, 0xc8, 0xb0, 0xd8, 0x01, 0x04, 0x0d, 0xbe, 0x49, - 0x28, 0x99, 0xe6, 0x0a, 0xa2, 0xa2, 0x93, 0x39, 0x28, 0xb2, 0x65, 0xa7, 0xe4, 0xad, 0x46, 0x79, - 0xd2, 0x13, 0x30, 0xf5, 0xfe, 0x53, 0xe2, 0x29, 0xab, 0xf6, 0x3f, 0xe4, 0x61, 0x5c, 0x19, 0x2c, - 0xf2, 0x2a, 0x14, 0x97, 0xc2, 0x65, 0xbf, 0xb9, 0x4f, 0x5d, 0x71, 0xad, 0x82, 0xcf, 0x9b, 0x7a, - 0xa1, 0xdd, 0x42, 0xa0, 0x15, 0x17, 0x93, 0x3a, 0x4c, 0xf0, 0xff, 0x64, 0x04, 0x70, 0x2e, 0x31, - 0x09, 0x73, 0x64, 0x19, 0xfb, 0xab, 0x6e, 0xef, 0x1a, 0x09, 0xf9, 0x3a, 0x00, 0x07, 0xb0, 0xf1, - 0x1d, 0xc2, 0xc1, 0x5b, 0x2e, 0xe0, 0xf3, 0xe2, 0x03, 0x91, 0xa7, 0xb6, 0x10, 0xa7, 0x82, 0xc2, - 0x10, 0x9f, 0x56, 0xf4, 0x9b, 0xfb, 0xc3, 0x3f, 0xae, 0x9a, 0x3c, 0xad, 0xe8, 0x37, 0xf7, 0xed, - 0x6c, 0x6f, 0x3f, 0x95, 0x25, 0xf9, 0x96, 0x01, 0x97, 0x2d, 0xda, 0xf4, 0x1f, 0xd2, 0xe0, 0xa0, - 0x16, 0x21, 0x96, 0xfa, 0xc5, 0x93, 0x5d, 0x0b, 0x6f, 0x8b, 0x2f, 0xbe, 0x12, 0x08, 0x2e, 0x18, - 0x96, 0xd4, 0xee, 0x46, 0xf6, 0x31, 0x55, 0x38, 0xe6, 0x93, 0xe6, 0x9f, 0x18, 0xca, 0x12, 0x20, - 0x2b, 0x50, 0x8a, 0x27, 0x8b, 0x30, 0x99, 0xc6, 0x9a, 0x99, 0x84, 0x5b, 0x74, 0xa7, 0xfe, 0x9c, - 0xb8, 0x01, 0x39, 0x1b, 0x4f, 0x39, 0x6d, 0x45, 0x48, 0x20, 0xf9, 0x12, 0x14, 0x70, 0xa8, 0x4e, - 0x4e, 0x74, 0x26, 0xb7, 0x9a, 0x02, 0x1b, 0x23, 0xac, 0x35, 0x52, 0x92, 0xcf, 0x09, 0x37, 0x9c, - 0xbc, 0x96, 0x42, 0x98, 0x81, 0x58, 0x3d, 0xe2, 0x3d, 0x26, 0x71, 0x30, 0x55, 0x66, 0xeb, 0xdf, - 0xcc, 0x41, 0x25, 0xbd, 0xf0, 0xc8, 0xfb, 0x50, 0x96, 0x21, 0x66, 0xf7, 0x9c, 0x70, 0x4f, 0xa4, - 0x25, 0xc5, 0x53, 0xab, 0x8c, 0x4b, 0xb3, 0xf7, 0x1c, 0x2d, 0x7d, 0x9d, 0x46, 0xc0, 0x36, 0xe4, - 0x75, 0x11, 0xb7, 0xa0, 0x2c, 0xa0, 0xc8, 0x8f, 0xba, 0xa9, 0xb4, 0xa4, 0x12, 0x8d, 0xbc, 0x01, - 0x79, 0x1e, 0x77, 0xa9, 0xe6, 0xb4, 0x7a, 0x70, 0xa7, 0xc6, 0xc3, 0xc6, 0xf8, 0xa5, 0xbb, 0x7e, - 0x7b, 0xc1, 0xf0, 0xc9, 0xb2, 0x12, 0xb5, 0x37, 0xaa, 0xe5, 0xf6, 0x91, 0xe0, 0xb8, 0x71, 0x27, - 0x87, 0xef, 0x7d, 0x50, 0x28, 0xe6, 0x2b, 0x05, 0x11, 0xa7, 0xf5, 0x7b, 0x79, 0x28, 0xc5, 0xdf, - 0x27, 0x04, 0x50, 0xdf, 0x10, 0xb7, 0xe7, 0xf8, 0x3f, 0xb9, 0x04, 0x45, 0xa9, 0x62, 0x88, 0x1b, - 0xf4, 0xb1, 0x50, 0xa8, 0x17, 0x33, 0x20, 0x75, 0x09, 0xae, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x05, - 0xb1, 0xa2, 0x30, 0x48, 0xa3, 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xfb, - 0xa4, 0x97, 0xac, 0x9c, 0xe7, 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, - 0xa1, 0xdb, 0x22, 0xe3, 0xc6, 0x25, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0xbe, 0x73, 0xda, - 0x0b, 0x87, 0x7a, 0x1c, 0x35, 0xe1, 0x50, 0x64, 0x64, 0x1b, 0x21, 0x75, 0xc9, 0x2b, 0x50, 0x60, - 0xa3, 0x29, 0xf6, 0x83, 0x38, 0x53, 0xe1, 0xea, 0xfa, 0x1a, 0xef, 0xb0, 0x7b, 0x67, 0x2c, 0x44, - 0x20, 0x2f, 0x41, 0xbe, 0x37, 0xb7, 0x23, 0x24, 0x7d, 0x25, 0x09, 0xc9, 0x8d, 0xd1, 0x58, 0x31, - 0xb9, 0x0d, 0xc5, 0x47, 0x7a, 0xf0, 0xe5, 0xf9, 0xd4, 0x30, 0xc6, 0xf8, 0x31, 0x62, 0xbd, 0x08, - 0xa3, 0x3c, 0xec, 0xd0, 0x7c, 0x01, 0x20, 0xf9, 0x74, 0xbf, 0xa3, 0x83, 0xf9, 0x75, 0x28, 0xc5, - 0x9f, 0x24, 0xcf, 0x03, 0xec, 0xd3, 0x03, 0x7b, 0xcf, 0xe9, 0xb8, 0xe2, 0x59, 0x9d, 0xb2, 0x55, - 0xda, 0xa7, 0x07, 0xf7, 0x10, 0x40, 0x2e, 0xc2, 0x58, 0x97, 0x8d, 0xaa, 0x4c, 0xaa, 0x6b, 0x8d, - 0x76, 0x7b, 0xdb, 0x6c, 0x86, 0xce, 0xc0, 0x18, 0x1a, 0x3f, 0xc4, 0x42, 0x9b, 0xb0, 0xe4, 0x4f, - 0xf3, 0xb7, 0x72, 0x98, 0x6e, 0x41, 0xa9, 0x27, 0x79, 0x11, 0x26, 0x9a, 0x01, 0xc5, 0xed, 0xc8, - 0x61, 0x6a, 0x91, 0xf8, 0x4e, 0x39, 0x01, 0x2e, 0xb9, 0xe4, 0x1a, 0x4c, 0x25, 0x59, 0x7e, 0xed, - 0xe6, 0xb6, 0x08, 0xbd, 0x2e, 0x5b, 0x13, 0x5d, 0x99, 0xe6, 0x77, 0x7e, 0x1b, 0x63, 0x29, 0x2a, - 0x6a, 0xc8, 0x61, 0x24, 0x33, 0xf6, 0x96, 0xac, 0x29, 0x05, 0x8e, 0x17, 0x27, 0x17, 0x60, 0xd4, - 0x71, 0x76, 0x7b, 0x1e, 0xf7, 0xeb, 0x2e, 0x5b, 0xe2, 0x17, 0xf9, 0x2c, 0x4c, 0x87, 0xde, 0x6e, - 0xc7, 0x89, 0x7a, 0x81, 0xc8, 0x77, 0x41, 0x03, 0x9c, 0x52, 0x13, 0x56, 0x25, 0x2e, 0x98, 0xe7, - 0x70, 0xf2, 0x3a, 0x10, 0xf5, 0x7b, 0xfe, 0xf6, 0x47, 0xb4, 0xc9, 0xa7, 0x5a, 0xd9, 0x9a, 0x56, - 0x4a, 0x56, 0xb1, 0x80, 0x7c, 0x06, 0xca, 0x01, 0x0d, 0x51, 0x25, 0xc3, 0x6e, 0xc3, 0x2c, 0x3e, - 0xd6, 0xb8, 0x84, 0xdd, 0xa7, 0x07, 0x66, 0x1d, 0xa6, 0xfb, 0xd6, 0x23, 0x79, 0x9d, 0x6b, 0xf7, - 0x62, 0x7f, 0x2e, 0xf3, 0xc3, 0x0c, 0x13, 0x52, 0xa9, 0xa7, 0xb1, 0x39, 0x92, 0xd9, 0x81, 0xb2, - 0x2a, 0x5f, 0x4f, 0x08, 0x6a, 0xbf, 0x80, 0x9e, 0x9f, 0x5c, 0xf8, 0x8c, 0x1e, 0x1d, 0x56, 0x73, - 0x9e, 0x8b, 0xfe, 0x9e, 0xd7, 0xa1, 0x28, 0xb5, 0x04, 0xf5, 0x09, 0x18, 0xa1, 0x50, 0x1e, 0x58, - 0x71, 0xa9, 0xf9, 0x0a, 0x8c, 0x09, 0x11, 0x7a, 0xbc, 0x21, 0xca, 0xfc, 0xb9, 0x1c, 0x4c, 0x59, - 0x94, 0x2d, 0x70, 0xf1, 0xb8, 0xca, 0xa7, 0x2c, 0xdf, 0xb1, 0xd6, 0xb6, 0x63, 0x72, 0x48, 0x7c, - 0xd7, 0x80, 0xb3, 0x19, 0xb8, 0x1f, 0x2b, 0x41, 0xda, 0x9b, 0x50, 0x5a, 0xf0, 0x9c, 0x56, 0xcd, - 0x75, 0x63, 0x0f, 0x56, 0xd4, 0x06, 0x5d, 0xb6, 0x9c, 0x1c, 0x06, 0x55, 0x37, 0xd3, 0x18, 0x95, - 0xdc, 0x10, 0x93, 0x22, 0x49, 0xe1, 0x28, 0x33, 0x2a, 0x03, 0xaf, 0x53, 0x92, 0x4f, 0x19, 0xc3, - 0x11, 0x39, 0x30, 0xb9, 0x20, 0x7d, 0x66, 0x87, 0x2e, 0x3b, 0x1c, 0x31, 0xdd, 0xbc, 0xa1, 0x8e, - 0x9d, 0xdf, 0xcc, 0xc1, 0x85, 0x6c, 0xc2, 0x8f, 0x9b, 0xeb, 0x0e, 0x13, 0x78, 0x28, 0x49, 0xab, - 0x31, 0xd7, 0x1d, 0xcf, 0xf6, 0x81, 0xf8, 0x09, 0x02, 0xd9, 0x81, 0x89, 0x65, 0x27, 0x8c, 0xee, - 0x51, 0x27, 0x88, 0xb6, 0xa9, 0x13, 0x0d, 0xa1, 0xc1, 0xc6, 0x0f, 0x50, 0xe3, 0xa6, 0xb6, 0x27, - 0x29, 0xd3, 0x0f, 0x50, 0x6b, 0x6c, 0xe3, 0x89, 0x52, 0x18, 0x62, 0xa2, 0x7c, 0x03, 0xa6, 0x1a, - 0xb4, 0xed, 0x74, 0xf7, 0xfc, 0x80, 0x0a, 0xdb, 0xf9, 0x4d, 0x98, 0x88, 0x41, 0x99, 0xb3, 0x45, - 0x2f, 0xd6, 0xf0, 0x95, 0x8e, 0x48, 0x44, 0x89, 0x5e, 0x6c, 0xfe, 0x46, 0x0e, 0x2e, 0xd6, 0x9a, - 0xe2, 0xa2, 0x41, 0x14, 0xc8, 0xfb, 0xd0, 0x4f, 0xf8, 0xdb, 0x64, 0x16, 0x4a, 0x0f, 0x9c, 0xc7, - 0xcb, 0x14, 0x9f, 0x88, 0xe5, 0x19, 0x93, 0xb8, 0xfa, 0xe5, 0x3c, 0xb6, 0x63, 0xb3, 0x97, 0x95, - 0xe0, 0xa8, 0x87, 0xcd, 0xc2, 0x13, 0x1e, 0x36, 0x4d, 0x18, 0xbd, 0xe7, 0xb7, 0x5c, 0xb1, 0x39, - 0x89, 0x7b, 0x8b, 0x3d, 0x84, 0x58, 0xa2, 0xc4, 0xfc, 0x81, 0x01, 0x93, 0x71, 0x8d, 0xb1, 0x0a, - 0x9f, 0x78, 0x97, 0x5c, 0x83, 0x31, 0xfc, 0x50, 0xfc, 0x40, 0x11, 0x6e, 0x1a, 0x2d, 0x06, 0xb2, - 0x3d, 0xd7, 0x92, 0x85, 0x6a, 0x4f, 0x8c, 0x3c, 0x59, 0x4f, 0x98, 0xff, 0x10, 0xaf, 0x44, 0xd4, - 0x56, 0xb2, 0x9d, 0x48, 0xa9, 0x88, 0x31, 0x64, 0x45, 0x72, 0x4f, 0x6d, 0x48, 0xf2, 0x03, 0x87, - 0xe4, 0xe7, 0x73, 0x30, 0x1e, 0x57, 0xf6, 0x53, 0x16, 0xc7, 0x1f, 0xb7, 0x6b, 0x28, 0x2f, 0xf6, - 0x86, 0x22, 0x2b, 0x84, 0xb3, 0xf8, 0x97, 0x60, 0x54, 0x2c, 0x26, 0x23, 0x75, 0x2f, 0x98, 0x1a, - 0xdd, 0xe4, 0x11, 0x61, 0x1c, 0xd0, 0xd0, 0x12, 0x74, 0x18, 0x26, 0xb0, 0x45, 0xb7, 0xc5, 0x0d, - 0xd9, 0x33, 0xbb, 0x47, 0x65, 0x87, 0x09, 0x24, 0x0d, 0x1b, 0x6a, 0x77, 0xfa, 0xbb, 0x05, 0xa8, - 0xa4, 0x49, 0x4e, 0xce, 0x94, 0xb0, 0xd6, 0xdb, 0x16, 0x6f, 0x64, 0x60, 0xa6, 0x84, 0x6e, 0x6f, - 0xdb, 0x62, 0x30, 0x72, 0x0d, 0x0a, 0x6b, 0x81, 0xf7, 0x10, 0x5b, 0x2d, 0x9e, 0x08, 0xe9, 0x06, - 0xde, 0x43, 0xd5, 0x5f, 0x96, 0x95, 0xe3, 0x81, 0x76, 0xb9, 0xa1, 0xbc, 0xdf, 0xce, 0x0f, 0xb4, - 0xad, 0x30, 0x9d, 0x92, 0x47, 0xa2, 0xb1, 0xad, 0xb2, 0x4e, 0x9d, 0x40, 0x44, 0xf5, 0x0b, 0x71, - 0x86, 0x5b, 0xe5, 0x36, 0x82, 0x79, 0xbe, 0x5d, 0x4b, 0x45, 0x22, 0x2d, 0x20, 0xca, 0x4f, 0xb9, - 0x80, 0x4f, 0x3e, 0xe3, 0xc9, 0xa7, 0xad, 0xce, 0xa9, 0xac, 0x6d, 0x75, 0x35, 0x67, 0xf0, 0x7d, - 0x9a, 0x36, 0xc2, 0x35, 0x28, 0xa1, 0xc9, 0x0b, 0x0d, 0x19, 0xc5, 0x13, 0x99, 0x49, 0xdf, 0x64, - 0x40, 0x7f, 0x02, 0x3b, 0x36, 0x67, 0x24, 0x4c, 0xc8, 0x7b, 0x30, 0xae, 0x3a, 0xd4, 0x72, 0xb7, - 0xcf, 0x2b, 0x3c, 0x84, 0x6b, 0x40, 0xea, 0x3a, 0x95, 0xc0, 0xfc, 0x9c, 0x3a, 0x4b, 0xc4, 0xa6, - 0x7d, 0xec, 0x2c, 0x31, 0x7f, 0x0d, 0xd5, 0xf8, 0xb6, 0x1f, 0x51, 0xa1, 0xbd, 0x3c, 0xb3, 0x72, - 0x2c, 0x31, 0x21, 0x8f, 0x68, 0x3e, 0x2d, 0x5a, 0xeb, 0x4e, 0xf1, 0x72, 0xf9, 0xef, 0x1a, 0x70, - 0x3e, 0x93, 0x96, 0xdc, 0x04, 0x48, 0x74, 0x44, 0xd1, 0x4b, 0x3c, 0x91, 0x71, 0x0c, 0xb5, 0x14, - 0x0c, 0xf2, 0xb5, 0xb4, 0x76, 0x77, 0xf2, 0xe6, 0x24, 0x9f, 0xfb, 0x98, 0xd4, 0xb5, 0xbb, 0x0c, - 0x9d, 0xce, 0xfc, 0x6e, 0x1e, 0xa6, 0xfb, 0x9e, 0x89, 0x3c, 0xc1, 0x8b, 0x60, 0x3f, 0xf5, 0x08, - 0x19, 0xbf, 0xee, 0xb8, 0x31, 0xe8, 0x91, 0xca, 0x8c, 0x27, 0xc9, 0xd0, 0x2c, 0x26, 0x72, 0x68, - 0x9f, 0xf0, 0x32, 0x59, 0x98, 0xfd, 0x7c, 0xdd, 0x67, 0x07, 0x7e, 0xed, 0x29, 0x3c, 0x63, 0xf7, - 0xd7, 0xf8, 0x95, 0xaf, 0x5f, 0xcb, 0xc1, 0xd9, 0xbe, 0x36, 0x3f, 0xb3, 0xab, 0xee, 0x4b, 0xda, - 0xee, 0xf6, 0xc2, 0xa0, 0x31, 0x1d, 0x4a, 0x8b, 0xf8, 0x1f, 0x06, 0x5c, 0x1c, 0x40, 0x49, 0x0e, - 0xd2, 0x93, 0x88, 0x6b, 0x15, 0xb7, 0x8e, 0xff, 0xe0, 0x53, 0x99, 0x4a, 0x9f, 0xd8, 0x4c, 0xf8, - 0xb9, 0x1c, 0xc0, 0x16, 0xdd, 0x7e, 0xb6, 0xd3, 0x40, 0x7d, 0x41, 0x9b, 0x00, 0x8a, 0x01, 0x73, - 0xf8, 0x2c, 0x50, 0xab, 0x68, 0x48, 0x1c, 0x3e, 0x07, 0x54, 0xfc, 0xa4, 0x49, 0x2e, 0xfb, 0x49, - 0x13, 0x73, 0x1b, 0xce, 0xdd, 0xa5, 0x51, 0xb2, 0x13, 0xca, 0x33, 0xe4, 0xf1, 0x6c, 0x5f, 0x83, - 0x92, 0xc0, 0xd7, 0xd3, 0xd3, 0x4b, 0x97, 0x38, 0xcf, 0xb5, 0x12, 0x04, 0x93, 0xc2, 0xc5, 0x05, - 0xda, 0xa2, 0x11, 0xfd, 0x64, 0x3f, 0xd3, 0x00, 0xc2, 0x9b, 0xc2, 0x5f, 0xba, 0x18, 0xea, 0x0b, - 0x27, 0xf6, 0xcf, 0x26, 0x9c, 0x8f, 0xeb, 0xfe, 0x34, 0xf9, 0xce, 0x32, 0x5d, 0x42, 0xc4, 0x24, - 0x26, 0x1c, 0x8f, 0x31, 0x22, 0x3e, 0x86, 0xcb, 0x92, 0x60, 0xcb, 0x8b, 0x6f, 0x62, 0x86, 0xa2, - 0x25, 0xef, 0xc0, 0xb8, 0x42, 0x23, 0x22, 0xab, 0xf1, 0xb6, 0xf3, 0x91, 0x17, 0xed, 0xd9, 0x21, - 0x87, 0xab, 0xb7, 0x9d, 0x0a, 0xba, 0xf9, 0x55, 0x78, 0x2e, 0xf6, 0x5b, 0xc9, 0xf8, 0x74, 0x8a, - 0xb9, 0x71, 0x3a, 0xe6, 0x2b, 0x49, 0xb3, 0x96, 0x3a, 0xb1, 0x07, 0xbc, 0xe4, 0x4d, 0xd4, 0x66, - 0x89, 0xc6, 0x5c, 0x51, 0xd2, 0xe3, 0x89, 0xbd, 0x28, 0x01, 0x98, 0x6f, 0x2b, 0x95, 0xcd, 0x60, - 0xa8, 0x11, 0x1b, 0x69, 0xe2, 0x9f, 0xcb, 0xc1, 0xd4, 0xea, 0xd2, 0xc2, 0x7c, 0x6c, 0x46, 0xfe, - 0x94, 0xe5, 0xa8, 0xd2, 0xda, 0x36, 0x58, 0xde, 0x98, 0x1b, 0x70, 0x36, 0xd5, 0x0d, 0xf8, 0x90, - 0xcf, 0x7b, 0xdc, 0xbf, 0x24, 0x06, 0xcb, 0x9d, 0xe5, 0x42, 0x16, 0xfb, 0xcd, 0xdb, 0x56, 0x0a, - 0xdb, 0xfc, 0xee, 0x68, 0x8a, 0xaf, 0x10, 0x61, 0xaf, 0x41, 0x69, 0x29, 0x0c, 0x7b, 0x34, 0xd8, - 0xb0, 0x96, 0x55, 0x1d, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, 0x40, 0x5e, 0x85, 0xa2, - 0x88, 0x83, 0x93, 0x32, 0x01, 0xaf, 0xcb, 0xe3, 0x30, 0x3a, 0x2b, 0x2e, 0x26, 0x6f, 0x40, 0x99, - 0xff, 0xcf, 0x67, 0x9b, 0xe8, 0x70, 0xb4, 0x55, 0x09, 0x74, 0x3e, 0x3b, 0x2d, 0x0d, 0x8d, 0x9d, - 0xcc, 0xe4, 0x4b, 0xa1, 0xac, 0x46, 0x85, 0xe4, 0x64, 0x26, 0x1f, 0x15, 0xc5, 0x3a, 0xa9, 0x48, - 0xe4, 0x06, 0xe4, 0x6b, 0xf3, 0x96, 0x9a, 0x91, 0xdb, 0x69, 0x06, 0x3c, 0xa3, 0xbd, 0xf6, 0x18, - 0x57, 0x6d, 0xde, 0x22, 0x73, 0x50, 0xc4, 0xc7, 0x56, 0x5c, 0x1a, 0x08, 0xaf, 0x57, 0x9c, 0x35, - 0x5d, 0x01, 0x53, 0x6f, 0x1e, 0x25, 0x1e, 0x99, 0x85, 0xb1, 0x05, 0x2f, 0xec, 0xb6, 0x9c, 0x03, - 0x91, 0x9c, 0x06, 0x2f, 0x43, 0x5c, 0x0e, 0x52, 0xe7, 0x99, 0xc0, 0x22, 0xaf, 0xc2, 0x48, 0xa3, - 0xe9, 0x77, 0xd9, 0x69, 0x2b, 0x76, 0x6d, 0x09, 0x19, 0x40, 0x4b, 0x3d, 0xc1, 0x00, 0x18, 0x9a, - 0xcd, 0x23, 0xcc, 0x4a, 0x4a, 0x68, 0x76, 0x3a, 0xb2, 0x4c, 0xe0, 0xf4, 0x3b, 0x1f, 0xc2, 0xd3, - 0x74, 0x3e, 0xdc, 0x86, 0x8b, 0x77, 0x51, 0xd5, 0x6f, 0xd0, 0x00, 0xf3, 0x81, 0xf2, 0x87, 0x9b, - 0x36, 0xac, 0x25, 0x11, 0x55, 0x87, 0x31, 0x4e, 0xfc, 0x34, 0x60, 0x87, 0x1c, 0x47, 0xbe, 0xf9, - 0x94, 0x7a, 0xad, 0x62, 0x10, 0x23, 0xf2, 0x65, 0x38, 0x97, 0x55, 0x24, 0xe2, 0xeb, 0xd0, 0xaf, - 0x3d, 0xfb, 0x03, 0xaa, 0x63, 0x79, 0x16, 0x07, 0xb2, 0x0c, 0x15, 0x0e, 0xaf, 0xb9, 0x6d, 0xaf, - 0xb3, 0xd8, 0x76, 0xbc, 0x16, 0x46, 0xdb, 0x89, 0x90, 0x49, 0xc1, 0xd5, 0x61, 0x85, 0x36, 0x65, - 0xa5, 0x9a, 0x77, 0x52, 0x8a, 0x12, 0xc5, 0x51, 0xa3, 0xf6, 0x60, 0x39, 0x59, 0x53, 0x9f, 0xae, - 0x7b, 0x23, 0xad, 0x6d, 0xc7, 0xdc, 0x1b, 0x6d, 0xc0, 0xd9, 0x54, 0x37, 0x48, 0x71, 0xa4, 0x81, - 0xd3, 0xe2, 0x28, 0x45, 0x63, 0xa5, 0xb0, 0xcd, 0xff, 0x34, 0x9a, 0xe2, 0x2b, 0x6c, 0x45, 0x26, - 0x8c, 0x72, 0x69, 0xa3, 0x66, 0xaf, 0xe3, 0xb2, 0xc8, 0x12, 0x25, 0xe4, 0x12, 0xe4, 0x1b, 0x8d, - 0x55, 0x35, 0xb7, 0x66, 0x18, 0xfa, 0x16, 0x83, 0xb1, 0x11, 0x42, 0x33, 0x90, 0x12, 0x62, 0xd6, - 0xa4, 0x41, 0x24, 0x9e, 0x92, 0x7d, 0x39, 0x59, 0xc7, 0x85, 0xa4, 0xbf, 0xc5, 0x3a, 0x4e, 0x56, - 0xef, 0x3c, 0xcc, 0xd4, 0xc2, 0x90, 0x06, 0x11, 0x7f, 0x10, 0x20, 0xec, 0xb5, 0x69, 0x20, 0xe6, - 0x9a, 0x90, 0x31, 0xfc, 0x21, 0xfa, 0x66, 0x68, 0x0d, 0x44, 0x24, 0xd7, 0xa1, 0x58, 0xeb, 0xb9, - 0x1e, 0xed, 0x34, 0x35, 0xef, 0x7a, 0x47, 0xc0, 0xac, 0xb8, 0x94, 0x7c, 0x08, 0xe7, 0x05, 0x91, - 0x14, 0x38, 0xa2, 0x07, 0xb8, 0xac, 0xe1, 0x27, 0x58, 0xb1, 0x16, 0xa4, 0x98, 0xb2, 0x45, 0x97, - 0x64, 0x53, 0x92, 0x1a, 0x54, 0x16, 0xf1, 0x9e, 0x54, 0x3e, 0x28, 0xed, 0x07, 0x22, 0xf1, 0x33, - 0x4a, 0x2e, 0x7e, 0x87, 0x6a, 0xbb, 0x71, 0xa1, 0xd5, 0x87, 0x4e, 0xee, 0xc3, 0xd9, 0x34, 0x8c, - 0xc9, 0xe3, 0x52, 0xf2, 0xe0, 0x5b, 0x1f, 0x17, 0x14, 0xcc, 0x59, 0x54, 0x64, 0x1b, 0xa6, 0x6b, - 0x51, 0x14, 0x78, 0xdb, 0xbd, 0x88, 0xa6, 0x44, 0x97, 0x34, 0x34, 0xc6, 0xe5, 0x52, 0x7c, 0x3d, - 0x27, 0x26, 0xe3, 0x59, 0x27, 0xa6, 0x8c, 0x45, 0x98, 0xd5, 0xcf, 0x8e, 0xb8, 0xf1, 0x9b, 0x91, - 0xe2, 0x5d, 0x45, 0x11, 0x12, 0x25, 0x0d, 0xba, 0xb5, 0xf0, 0xa0, 0xdd, 0xa6, 0x51, 0x80, 0x37, - 0xf7, 0xf8, 0xee, 0xa2, 0x29, 0x7c, 0x80, 0x2e, 0x2b, 0x4f, 0xa5, 0xe2, 0xdb, 0x9a, 0x9a, 0x7b, - 0xa4, 0xc6, 0x53, 0xdb, 0x3e, 0xca, 0x43, 0x6e, 0x1f, 0x2d, 0x98, 0x5e, 0xec, 0x34, 0x83, 0x03, - 0x8c, 0xcd, 0x94, 0x95, 0x9b, 0x38, 0xa1, 0x72, 0xf2, 0x51, 0x95, 0x2b, 0x8e, 0x9c, 0x61, 0x59, - 0xd5, 0xeb, 0x67, 0x6c, 0xfe, 0x7f, 0x50, 0x49, 0xf7, 0xe5, 0x13, 0x3e, 0x94, 0x7d, 0x1a, 0xd7, - 0x6c, 0x36, 0xd2, 0xe9, 0xb6, 0x90, 0x59, 0xed, 0x35, 0x64, 0x23, 0x89, 0xde, 0x57, 0xde, 0x2d, - 0xd6, 0xde, 0x40, 0x96, 0xcb, 0x38, 0x97, 0xb5, 0x8c, 0xcd, 0x5f, 0xc8, 0xc1, 0x34, 0xf7, 0x26, - 0x7d, 0xf6, 0x75, 0xc5, 0xf7, 0x34, 0xe1, 0x2c, 0x6d, 0x81, 0xa9, 0xd6, 0x1d, 0xa3, 0x2d, 0x7e, - 0x1d, 0xce, 0xf7, 0x75, 0x05, 0x0a, 0xe8, 0x05, 0xe9, 0xc7, 0xdb, 0x27, 0xa2, 0x67, 0xb2, 0x3f, - 0xb2, 0x79, 0xdb, 0xea, 0xa3, 0x30, 0xff, 0x7e, 0xae, 0x8f, 0xbf, 0xd0, 0x1b, 0x55, 0x4d, 0xd0, - 0x38, 0x9d, 0x26, 0x98, 0xfb, 0x58, 0x9a, 0x60, 0x7e, 0x18, 0x4d, 0xf0, 0x43, 0x98, 0x58, 0xa7, - 0x0e, 0xd3, 0x68, 0x44, 0xb8, 0x5c, 0x41, 0x7b, 0xa9, 0x98, 0x95, 0x49, 0xf9, 0x12, 0x87, 0xda, - 0x46, 0x8c, 0x80, 0x89, 0x16, 0x1e, 0x3f, 0x67, 0xe9, 0x1c, 0xd4, 0x4d, 0x63, 0x64, 0xf0, 0xa6, - 0x61, 0x06, 0x30, 0xde, 0x68, 0xac, 0x6e, 0x39, 0x01, 0x93, 0x16, 0x21, 0x53, 0x19, 0xa5, 0x9b, - 0xa8, 0x91, 0x08, 0xde, 0x7e, 0xff, 0x50, 0x89, 0xc5, 0x04, 0x8b, 0x24, 0x16, 0x2e, 0x15, 0xdc, - 0x23, 0x4e, 0xc0, 0x34, 0x8f, 0x38, 0x01, 0x33, 0xff, 0x5e, 0x01, 0x2a, 0xdc, 0xf5, 0x91, 0x9d, - 0x7b, 0x45, 0x8a, 0x9e, 0xbe, 0xa7, 0x1a, 0x8c, 0xd3, 0x3f, 0xd5, 0xf0, 0x31, 0x7c, 0x6c, 0x95, - 0x58, 0xec, 0xfc, 0x10, 0xb1, 0xd8, 0x6f, 0x69, 0x81, 0xcc, 0x85, 0xe4, 0x2d, 0xd0, 0xfd, 0xde, - 0x36, 0x3d, 0x3e, 0x84, 0xf9, 0x4d, 0x35, 0xe2, 0x78, 0x24, 0xf1, 0x3e, 0x41, 0xca, 0x63, 0x62, - 0x8d, 0x63, 0x29, 0x36, 0x7a, 0x1a, 0x7f, 0xf3, 0xb1, 0xff, 0xa7, 0xfe, 0xe6, 0x8b, 0x00, 0x4a, - 0xde, 0x96, 0x62, 0xf2, 0x24, 0xe8, 0xc9, 0x39, 0x5b, 0x14, 0x42, 0xf3, 0x3f, 0x16, 0x61, 0xba, - 0xd1, 0x58, 0x5d, 0xf0, 0x9c, 0xdd, 0x8e, 0x1f, 0x46, 0x5e, 0x73, 0xa9, 0xb3, 0xe3, 0xb3, 0x25, - 0xbc, 0x4e, 0xc3, 0xe8, 0x4e, 0xcb, 0x7f, 0xa4, 0xfa, 0x3e, 0x47, 0x34, 0x8c, 0xec, 0x9d, 0x96, - 0xff, 0xc8, 0x8a, 0x8b, 0xd9, 0x16, 0xb1, 0x18, 0x04, 0xf1, 0xeb, 0x23, 0xb8, 0x45, 0x50, 0x06, - 0xb0, 0x38, 0x9c, 0xad, 0x92, 0x46, 0x8f, 0x27, 0xe0, 0xe0, 0xc9, 0xde, 0x70, 0x95, 0x84, 0x1c, - 0x64, 0xc9, 0x32, 0x42, 0xfb, 0x27, 0xac, 0x90, 0x9a, 0x17, 0x35, 0xaf, 0xf5, 0xa4, 0x58, 0x3c, - 0x63, 0x87, 0x50, 0x1c, 0x5d, 0xbb, 0x8b, 0x70, 0x55, 0x79, 0xef, 0x5b, 0x03, 0x11, 0x9c, 0x67, - 0xca, 0x65, 0xbf, 0xce, 0x31, 0x72, 0xbc, 0xce, 0xf1, 0xb2, 0x90, 0x09, 0xcf, 0x67, 0xe8, 0x1c, - 0xea, 0xe3, 0x04, 0x99, 0xcc, 0xc9, 0x2f, 0x18, 0xf0, 0x7c, 0x66, 0x49, 0xbc, 0xb0, 0xf5, 0xa0, - 0x01, 0x45, 0x5e, 0x60, 0xbe, 0x92, 0xcf, 0x62, 0x94, 0x46, 0xc6, 0xa7, 0xed, 0x0c, 0x29, 0x70, - 0xfc, 0x97, 0xc8, 0xbf, 0x34, 0xe0, 0xa2, 0x86, 0x81, 0x89, 0x0e, 0xdb, 0xb4, 0x73, 0xd2, 0x94, - 0xfe, 0xe8, 0xe9, 0x4c, 0xe9, 0x17, 0xf5, 0xb6, 0xf0, 0x64, 0xd0, 0xf8, 0x79, 0xf5, 0x90, 0x38, - 0xa0, 0x86, 0xe4, 0xc7, 0x61, 0x1a, 0x8b, 0xa4, 0xea, 0xc3, 0xa6, 0x2b, 0xce, 0xfe, 0x72, 0x7d, - 0xee, 0x4f, 0x0f, 0xab, 0x13, 0x5a, 0x01, 0x46, 0x14, 0xe2, 0xd7, 0x62, 0x4d, 0xc9, 0xeb, 0xec, - 0xf8, 0x5a, 0x62, 0xd3, 0x34, 0x33, 0xf2, 0x6f, 0x0c, 0x98, 0x61, 0x50, 0x5e, 0xe1, 0x3b, 0x81, - 0xdf, 0x8e, 0xcb, 0x4f, 0xc8, 0x13, 0xd0, 0x7a, 0x3a, 0x1d, 0xf4, 0x32, 0x56, 0x99, 0x2f, 0x7c, - 0x7b, 0x27, 0xf0, 0xdb, 0x49, 0xf5, 0xb5, 0x5c, 0x21, 0x83, 0x2a, 0x49, 0x7e, 0xd6, 0x80, 0x4b, - 0xda, 0x09, 0x4a, 0x8d, 0xc7, 0x4b, 0xd9, 0x05, 0xd4, 0xa2, 0xfa, 0x4d, 0x31, 0xc9, 0xaf, 0x61, - 0x0d, 0x92, 0x2d, 0x01, 0xeb, 0x62, 0xb7, 0x39, 0x96, 0x52, 0x85, 0xc1, 0x5f, 0x31, 0xbf, 0x99, - 0x83, 0x71, 0x65, 0x4f, 0x25, 0x9f, 0x87, 0xf2, 0x6a, 0xb0, 0xeb, 0x74, 0xbc, 0x9f, 0x70, 0x94, - 0x3b, 0x47, 0xdc, 0xb3, 0x7d, 0x05, 0x6e, 0x69, 0x58, 0xe8, 0x2b, 0x4a, 0x9d, 0xb6, 0xaa, 0xed, - 0xb1, 0x3d, 0xd9, 0x42, 0xe8, 0x29, 0xf7, 0x95, 0xf7, 0x33, 0xf6, 0x95, 0x53, 0x25, 0xc8, 0x78, - 0xa7, 0x7f, 0x77, 0x19, 0x3e, 0x9f, 0x85, 0xf9, 0x4b, 0x39, 0xa8, 0x88, 0x87, 0xec, 0xe5, 0x8d, - 0xd9, 0xa7, 0xeb, 0xe1, 0x2b, 0xbd, 0x71, 0xc7, 0xf8, 0x84, 0x14, 0x7e, 0xfd, 0xb7, 0xab, 0xf8, - 0x2c, 0x79, 0xba, 0x3b, 0xe4, 0xb3, 0xe4, 0x3a, 0x3c, 0x1d, 0x2e, 0x97, 0xa6, 0xb2, 0xd2, 0xf8, - 0xe6, 0x1f, 0xe7, 0xd2, 0xbc, 0x85, 0x09, 0xe1, 0x65, 0x18, 0xe3, 0xef, 0x90, 0xca, 0x88, 0x1e, - 0x91, 0xd8, 0x11, 0x41, 0x96, 0x2c, 0x3b, 0x4d, 0xe0, 0xe4, 0x49, 0x6f, 0xd3, 0x93, 0x37, 0xa1, - 0x8c, 0x4e, 0x92, 0x35, 0xd7, 0x0d, 0xd8, 0x16, 0x58, 0x48, 0x72, 0x38, 0x3e, 0xa2, 0xdb, 0x36, - 0x77, 0xa6, 0x74, 0x5c, 0x37, 0xb0, 0x34, 0x3c, 0x32, 0x0f, 0xe7, 0x34, 0x9f, 0x5c, 0x49, 0x3f, - 0x92, 0x1c, 0x91, 0x22, 0x2c, 0xe0, 0xc4, 0x99, 0xc8, 0x98, 0xc6, 0xd8, 0x6f, 0xb1, 0x3d, 0x0c, - 0x35, 0x1b, 0x3d, 0xff, 0x9d, 0x5c, 0xf4, 0xf2, 0xa2, 0x9e, 0x60, 0xe2, 0x89, 0xb6, 0xd3, 0xd5, - 0x72, 0xb9, 0x70, 0x44, 0xf3, 0x2f, 0x0c, 0xb6, 0xd6, 0x9a, 0xfb, 0x9f, 0xb2, 0x90, 0x4e, 0xd6, - 0xa4, 0x63, 0x2c, 0x5c, 0xff, 0xde, 0xe0, 0x41, 0x59, 0x62, 0xfa, 0xbc, 0x05, 0xa3, 0xfc, 0xd5, - 0x53, 0x11, 0x3e, 0xa4, 0x72, 0xe1, 0x05, 0x89, 0x53, 0x06, 0x7f, 0x3b, 0xd5, 0x12, 0x04, 0xaa, - 0xd2, 0x9f, 0x1b, 0x4a, 0xe9, 0x57, 0x92, 0xb2, 0x0f, 0xf7, 0xd8, 0x87, 0x71, 0x72, 0x52, 0x76, - 0xf3, 0xff, 0xe4, 0x78, 0x7b, 0x44, 0xa5, 0x86, 0x4d, 0x03, 0x7c, 0x0d, 0x0a, 0xf8, 0xbe, 0xbe, - 0x92, 0x6b, 0x39, 0xf5, 0xb6, 0x3e, 0x96, 0xb3, 0x75, 0x83, 0xb2, 0x56, 0x8d, 0x22, 0x46, 0x71, - 0xac, 0xae, 0x1b, 0xc4, 0xc0, 0xa7, 0x34, 0x7c, 0x97, 0xaa, 0xcb, 0xa1, 0xa3, 0xbf, 0x7a, 0x82, - 0xe5, 0x4c, 0xa3, 0x8f, 0x83, 0x79, 0x54, 0x2b, 0x7e, 0x7b, 0xc7, 0xb1, 0x79, 0x10, 0x89, 0x2a, - 0x6d, 0x93, 0xb8, 0x9f, 0x45, 0x98, 0xd4, 0x53, 0x8c, 0x08, 0x4b, 0x1b, 0xa6, 0x05, 0x48, 0xa5, - 0x27, 0x51, 0x6d, 0x3a, 0x3a, 0x11, 0x3b, 0x31, 0x69, 0x79, 0x24, 0xd4, 0x0c, 0xf4, 0x3c, 0x75, - 0x9c, 0xdd, 0x9f, 0x00, 0x49, 0x27, 0x51, 0x6e, 0x89, 0x3f, 0x07, 0x15, 0xb1, 0x32, 0xe3, 0x80, - 0x6e, 0xb4, 0x67, 0x2c, 0x2d, 0x58, 0xea, 0x6a, 0x6a, 0x7a, 0x6e, 0x60, 0x21, 0xd4, 0xfc, 0x8e, - 0x01, 0x97, 0xc4, 0x6b, 0xae, 0x16, 0x0d, 0xa3, 0xc0, 0xe3, 0xf1, 0xe1, 0x38, 0x1f, 0x3f, 0x4f, - 0xde, 0x91, 0x59, 0x29, 0x75, 0x01, 0x99, 0xfe, 0x46, 0x7d, 0x42, 0x4c, 0xca, 0x11, 0xcc, 0x4b, - 0x29, 0xb3, 0x51, 0xbe, 0x25, 0xb2, 0x51, 0xe6, 0x8e, 0x27, 0x8e, 0xd7, 0x85, 0x4b, 0x3b, 0x32, - 0x0b, 0xe5, 0xb7, 0x73, 0x70, 0x3e, 0xa3, 0x5a, 0x9b, 0x9f, 0x7f, 0x46, 0x85, 0x43, 0x5d, 0x13, - 0x0e, 0x32, 0x5d, 0xf1, 0xc0, 0x8e, 0xcf, 0x94, 0x15, 0xbf, 0x69, 0xc0, 0x45, 0x7d, 0xf6, 0x08, - 0x03, 0xec, 0xe6, 0x6d, 0xf2, 0x36, 0x8c, 0xde, 0xa3, 0x8e, 0x4b, 0x65, 0xdc, 0xe1, 0xf9, 0x54, - 0x8e, 0x76, 0x5e, 0xc8, 0xd9, 0xfe, 0x31, 0x5f, 0xca, 0x67, 0x2c, 0x41, 0x42, 0x16, 0x44, 0xe5, - 0xb8, 0x4f, 0x86, 0x29, 0xdd, 0x13, 0xb2, 0x3e, 0x75, 0x8c, 0x35, 0xe8, 0x77, 0x0d, 0x78, 0xee, - 0x18, 0x1a, 0x36, 0x70, 0x6c, 0xe8, 0xd5, 0x81, 0xc3, 0x8d, 0x05, 0xa1, 0xe4, 0x3d, 0x98, 0x5a, - 0x17, 0xaa, 0xab, 0x1c, 0x0e, 0xe5, 0x69, 0x1b, 0xa9, 0xd5, 0xda, 0x72, 0x5c, 0xd2, 0xc8, 0xe4, - 0x3a, 0x14, 0xef, 0xf9, 0x61, 0xd4, 0x49, 0x72, 0xbc, 0xa1, 0xc9, 0x7b, 0x4f, 0xc0, 0xac, 0xb8, - 0x94, 0xa9, 0x05, 0x7a, 0x35, 0x85, 0x0f, 0xe0, 0x8b, 0x30, 0xca, 0x70, 0x62, 0x93, 0x12, 0xce, - 0x03, 0x7c, 0x6b, 0xd4, 0x73, 0x2d, 0x51, 0x14, 0x1b, 0x33, 0x73, 0x99, 0x57, 0xf5, 0xdf, 0x34, - 0xa0, 0xa2, 0xf3, 0x7e, 0xd2, 0xa1, 0x79, 0x57, 0x1b, 0x9a, 0xe7, 0xb2, 0x87, 0x66, 0xf0, 0x98, - 0xf4, 0xa5, 0x5b, 0x1a, 0x6a, 0x2c, 0x4c, 0x18, 0x5d, 0xf0, 0xdb, 0x8e, 0xd7, 0x51, 0x53, 0x04, - 0xb9, 0x08, 0xb1, 0x44, 0x89, 0xd2, 0x5b, 0xf9, 0x81, 0xbd, 0x65, 0xfe, 0x72, 0x01, 0x2e, 0x59, - 0x74, 0xd7, 0x63, 0x0a, 0xd2, 0x46, 0xe8, 0x75, 0x76, 0x35, 0x47, 0x0a, 0x33, 0xd5, 0xe1, 0xc2, - 0x7d, 0x9c, 0x41, 0xe2, 0xfe, 0x7e, 0x15, 0x8a, 0x4c, 0x4a, 0x2b, 0x7d, 0x8e, 0x66, 0x02, 0x4c, - 0x74, 0xc7, 0xc7, 0x55, 0x16, 0x93, 0x1b, 0x62, 0x0f, 0x51, 0x02, 0x7c, 0xd8, 0x1e, 0xf2, 0xc3, - 0xc3, 0x2a, 0xf0, 0xb7, 0x25, 0x58, 0xa9, 0xd8, 0x47, 0x62, 0xa5, 0xaa, 0x30, 0x40, 0xa9, 0x7a, - 0x00, 0xe7, 0x6a, 0x2e, 0x97, 0x4f, 0x4e, 0x6b, 0x2d, 0xf0, 0x3a, 0x4d, 0xaf, 0xeb, 0xb4, 0xa4, - 0x52, 0x8e, 0xc6, 0x22, 0x27, 0x2e, 0xb7, 0xbb, 0x31, 0x82, 0x95, 0x49, 0xc6, 0x9a, 0xb1, 0xb0, - 0xd2, 0xe0, 0x79, 0xcc, 0xb8, 0x05, 0x08, 0x9b, 0xe1, 0x76, 0x42, 0x9e, 0xc8, 0xcc, 0x8a, 0x8b, - 0x51, 0x9d, 0xc3, 0x18, 0xbf, 0xf5, 0xe5, 0xc6, 0x7d, 0x11, 0x33, 0x27, 0xfd, 0x8f, 0x79, 0x48, - 0x60, 0xd4, 0x0a, 0xd1, 0x68, 0xad, 0xe1, 0x25, 0x74, 0x8d, 0xc6, 0x3d, 0x46, 0x57, 0xec, 0xa3, - 0x0b, 0xc3, 0x3d, 0x95, 0x8e, 0xe3, 0x91, 0x59, 0x00, 0xee, 0xc1, 0x89, 0x13, 0xa2, 0x94, 0x28, - 0x7f, 0x01, 0x42, 0xb9, 0xf2, 0xa7, 0xa0, 0x90, 0x77, 0xe0, 0xec, 0xe2, 0xfc, 0x9c, 0x0c, 0x86, - 0x5b, 0xf0, 0x9b, 0x3d, 0x76, 0x6e, 0xc6, 0xe0, 0xcc, 0x32, 0x1f, 0x43, 0xda, 0x9c, 0x63, 0xb3, - 0x20, 0x0b, 0x4d, 0x84, 0xc4, 0xf1, 0x80, 0xea, 0x79, 0xdf, 0xa5, 0xe1, 0xe6, 0xad, 0x4f, 0x59, - 0x48, 0x9c, 0xd2, 0x36, 0x5c, 0x6d, 0xb7, 0x32, 0x57, 0xe6, 0xdf, 0xc2, 0x90, 0xb8, 0x3e, 0x5c, - 0xf2, 0x23, 0x30, 0x82, 0x3f, 0xc5, 0x8e, 0x7b, 0x36, 0x83, 0x6d, 0xb2, 0xdb, 0x36, 0x79, 0x4a, - 0x2a, 0x24, 0x20, 0x4b, 0xc9, 0xcb, 0x3d, 0xa7, 0x08, 0xec, 0x10, 0x59, 0x19, 0xf4, 0x27, 0xdb, - 0x5c, 0x28, 0xab, 0x1f, 0x64, 0x73, 0xe4, 0x9e, 0x13, 0xee, 0x51, 0x77, 0x5e, 0x3e, 0xf4, 0x5c, - 0xe6, 0x73, 0x64, 0x0f, 0xa1, 0xf8, 0x9c, 0x9c, 0xa5, 0xa0, 0x30, 0xe9, 0xb0, 0x14, 0x6e, 0x84, - 0xa2, 0x2a, 0xe2, 0x14, 0xe4, 0xe1, 0xe9, 0xd5, 0xb5, 0x44, 0x11, 0x4a, 0x4b, 0x69, 0x27, 0x0c, - 0x9c, 0xe6, 0x3e, 0x0d, 0x36, 0x6f, 0x7d, 0x12, 0xd2, 0x52, 0xff, 0xc6, 0x31, 0x63, 0xf2, 0x2b, - 0xc5, 0x38, 0xa3, 0x9a, 0x86, 0xcc, 0x74, 0xc4, 0xc4, 0x1d, 0xcd, 0x48, 0x74, 0xc4, 0xc4, 0x1d, - 0x4d, 0xd5, 0x11, 0x63, 0xd4, 0x38, 0xad, 0x7e, 0xee, 0x84, 0xb4, 0xfa, 0x03, 0x9e, 0x10, 0x91, - 0x91, 0x0c, 0x9f, 0xa2, 0x47, 0x9b, 0xbe, 0x08, 0xe5, 0x5a, 0x14, 0x39, 0xcd, 0x3d, 0xea, 0xe2, - 0xf3, 0x0d, 0x8a, 0x17, 0x8c, 0x23, 0xe0, 0xaa, 0x8f, 0xb4, 0x8a, 0xab, 0x3c, 0xda, 0x36, 0x36, - 0xc4, 0xa3, 0x6d, 0xb3, 0x30, 0xb6, 0xd4, 0x79, 0xe8, 0xb1, 0x3e, 0x29, 0x26, 0x19, 0x91, 0x3c, - 0x0e, 0xd2, 0x5f, 0xfa, 0x42, 0x10, 0x79, 0x4b, 0xd1, 0x20, 0x4a, 0x89, 0x2a, 0xcf, 0x8f, 0x59, - 0xb6, 0x54, 0x24, 0xd4, 0xeb, 0x07, 0x89, 0x4e, 0xde, 0x84, 0x31, 0x79, 0x7a, 0x86, 0x44, 0x7d, - 0x17, 0x94, 0x0e, 0x2f, 0xd1, 0x92, 0x30, 0x89, 0xd3, 0xf3, 0x3b, 0x7a, 0xd0, 0xe4, 0xb8, 0x92, - 0x8c, 0x44, 0x09, 0x9a, 0xd4, 0x92, 0x91, 0x28, 0xe1, 0x93, 0xf1, 0x61, 0xa8, 0x7c, 0xe2, 0x61, - 0x68, 0x13, 0xca, 0x6b, 0x4e, 0x10, 0x79, 0x6c, 0x3b, 0xea, 0x44, 0x3c, 0x1b, 0x66, 0x72, 0x56, - 0x57, 0x8a, 0x92, 0x97, 0x7c, 0xba, 0x0a, 0xbe, 0x9e, 0xcd, 0x21, 0x81, 0x93, 0x95, 0x0c, 0xb7, - 0x7a, 0x91, 0x21, 0x1a, 0x4d, 0xe7, 0x6a, 0x3a, 0x62, 0x5e, 0xaa, 0x5a, 0x46, 0xfb, 0x3d, 0xf2, - 0x6f, 0xf3, 0x31, 0xc0, 0x33, 0xe3, 0x14, 0xb2, 0xc1, 0x94, 0x5a, 0xa8, 0x57, 0xa4, 0x0e, 0x8e, - 0x31, 0x22, 0xf9, 0x1a, 0x94, 0xd9, 0xff, 0x98, 0x1a, 0xd0, 0xa3, 0x3c, 0xdb, 0x65, 0xe2, 0x66, - 0xad, 0x2f, 0x68, 0x9e, 0x3f, 0xb0, 0x41, 0x23, 0xbe, 0x80, 0x91, 0x71, 0xda, 0xf0, 0xa2, 0x71, - 0x33, 0x7f, 0x60, 0xc0, 0xc5, 0x01, 0x3c, 0x86, 0x7e, 0xae, 0x71, 0x36, 0xd9, 0x90, 0x94, 0xb3, - 0xb9, 0xd8, 0x90, 0xd4, 0x89, 0x21, 0xb7, 0xa6, 0xec, 0x3c, 0x95, 0xf9, 0x4f, 0x2c, 0x4f, 0xa5, - 0x79, 0x68, 0xc0, 0xb8, 0x32, 0xb2, 0x4f, 0xf1, 0x79, 0xa4, 0x6b, 0x22, 0x61, 0x73, 0x3e, 0xc1, - 0x6b, 0xa7, 0xce, 0xe1, 0x98, 0xa0, 0xf9, 0xeb, 0x00, 0xcb, 0x4e, 0x18, 0xd5, 0x9a, 0x91, 0xf7, - 0x90, 0x0e, 0x21, 0xc6, 0x92, 0xec, 0x34, 0x0e, 0x66, 0x59, 0x67, 0x64, 0x7d, 0xd9, 0x69, 0x62, - 0x86, 0xe6, 0x0a, 0x8c, 0x36, 0xfc, 0x20, 0xaa, 0x1f, 0xf0, 0xbd, 0x69, 0x81, 0x86, 0x4d, 0xd5, - 0x42, 0xe7, 0xe1, 0x59, 0xbd, 0x69, 0x89, 0x22, 0xa6, 0x20, 0xde, 0xf1, 0x68, 0xcb, 0x55, 0xef, - 0x9c, 0x76, 0x18, 0xc0, 0xe2, 0xf0, 0x1b, 0xef, 0xc3, 0x94, 0xcc, 0x19, 0xbb, 0xbe, 0xdc, 0xc0, - 0x16, 0x4c, 0xc1, 0xf8, 0xe6, 0xa2, 0xb5, 0x74, 0xe7, 0x2b, 0xf6, 0x9d, 0x8d, 0xe5, 0xe5, 0xca, - 0x19, 0x32, 0x01, 0x25, 0x01, 0x98, 0xaf, 0x55, 0x0c, 0x52, 0x86, 0xe2, 0xd2, 0x4a, 0x63, 0x71, - 0x7e, 0xc3, 0x5a, 0xac, 0xe4, 0x6e, 0xbc, 0x0c, 0x93, 0x89, 0xd3, 0x01, 0x26, 0x26, 0x18, 0x83, - 0xbc, 0x55, 0xdb, 0xaa, 0x9c, 0x21, 0x00, 0xa3, 0x6b, 0xf7, 0xe7, 0x1b, 0xb7, 0x6e, 0x55, 0x8c, - 0x1b, 0x9f, 0x83, 0x69, 0xb4, 0xda, 0x2d, 0x33, 0x25, 0xba, 0x43, 0x03, 0xfc, 0x52, 0x19, 0x8a, - 0x0d, 0xda, 0x75, 0x02, 0x27, 0xa2, 0xfc, 0x33, 0x0f, 0x7a, 0xad, 0xc8, 0xeb, 0xb6, 0xe8, 0xe3, - 0x8a, 0x71, 0xe3, 0x2d, 0x98, 0xb2, 0xfc, 0x5e, 0xe4, 0x75, 0x76, 0x65, 0x7e, 0x79, 0x72, 0x1e, - 0xa6, 0x37, 0x56, 0x6a, 0x0f, 0xea, 0x4b, 0x77, 0x37, 0x56, 0x37, 0x1a, 0xf6, 0x83, 0xda, 0xfa, - 0xfc, 0xbd, 0xca, 0x19, 0x56, 0xe1, 0x07, 0xab, 0x8d, 0x75, 0xdb, 0x5a, 0x9c, 0x5f, 0x5c, 0x59, - 0xaf, 0x18, 0x37, 0x7e, 0xd1, 0x80, 0x49, 0xfd, 0x29, 0x60, 0x72, 0x15, 0xae, 0x6c, 0x34, 0x16, - 0x2d, 0x7b, 0x7d, 0xf5, 0xfe, 0xe2, 0x8a, 0xbd, 0xd1, 0xa8, 0xdd, 0x5d, 0xb4, 0x37, 0x56, 0x1a, - 0x6b, 0x8b, 0xf3, 0x4b, 0x77, 0x96, 0x16, 0x17, 0x2a, 0x67, 0x48, 0x15, 0x9e, 0x53, 0x30, 0xac, - 0xc5, 0xf9, 0xd5, 0xcd, 0x45, 0xcb, 0x5e, 0xab, 0x35, 0x1a, 0x5b, 0xab, 0xd6, 0x42, 0xc5, 0x20, - 0x97, 0xe1, 0x42, 0x06, 0xc2, 0x83, 0x3b, 0xb5, 0x4a, 0xae, 0xaf, 0x6c, 0x65, 0x71, 0xab, 0xb6, - 0x6c, 0xd7, 0x57, 0xd7, 0x2b, 0xf9, 0x1b, 0xef, 0x33, 0x2d, 0x24, 0x79, 0x44, 0x8b, 0x14, 0xa1, - 0xb0, 0xb2, 0xba, 0xb2, 0x58, 0x39, 0x43, 0xc6, 0x61, 0x6c, 0x6d, 0x71, 0x65, 0x61, 0x69, 0xe5, - 0x2e, 0xef, 0xd6, 0xda, 0xda, 0x9a, 0xb5, 0xba, 0xb9, 0xb8, 0x50, 0xc9, 0xb1, 0xbe, 0x5b, 0x58, - 0x5c, 0x61, 0x35, 0xcb, 0xdf, 0x30, 0xf9, 0xfb, 0x0d, 0x5a, 0x62, 0x70, 0xd6, 0x5b, 0x8b, 0x5f, - 0x5e, 0x5f, 0x5c, 0x69, 0x2c, 0xad, 0xae, 0x54, 0xce, 0xdc, 0xb8, 0x92, 0xc2, 0x91, 0x23, 0xd1, - 0x68, 0xdc, 0xab, 0x9c, 0xb9, 0xf1, 0x35, 0x28, 0xab, 0x9b, 0x30, 0xb9, 0x08, 0x67, 0xd5, 0xdf, - 0x6b, 0xb4, 0xe3, 0x7a, 0x9d, 0xdd, 0xca, 0x99, 0x74, 0x81, 0xd5, 0xeb, 0x74, 0x58, 0x01, 0x36, - 0x5e, 0x2d, 0x58, 0xa7, 0x41, 0xdb, 0xeb, 0xb0, 0xfd, 0xb5, 0x92, 0xab, 0x57, 0xbe, 0xf7, 0x67, - 0x2f, 0x9c, 0xf9, 0xde, 0xf7, 0x5f, 0x30, 0xfe, 0xf8, 0xfb, 0x2f, 0x18, 0xff, 0xed, 0xfb, 0x2f, - 0x18, 0xdb, 0xa3, 0x38, 0xd1, 0x6f, 0xff, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x0f, 0xa7, - 0xbf, 0xbd, 0xbf, 0x00, 0x00, + // 12329 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x5d, 0x6c, 0x24, 0x49, + 0x72, 0x18, 0x3c, 0xd5, 0xdd, 0x24, 0xbb, 0x83, 0x4d, 0xb2, 0x99, 0xf3, 0xc7, 0x99, 0x9d, 0xdd, + 0x9e, 0xab, 0xdd, 0x9d, 0x9d, 0x9d, 0xdb, 0x1d, 0xde, 0x70, 0x6e, 0xf7, 0xb4, 0xb7, 0x7f, 0xd7, + 0x4d, 0x72, 0x66, 0xb8, 0xc3, 0x21, 0xb9, 0xd5, 0xfc, 0xb9, 0xd3, 0xdd, 0xa9, 0x54, 0xec, 0x4a, + 0x92, 0xb5, 0xec, 0xee, 0xea, 0xab, 0xaa, 0x9e, 0x19, 0x4a, 0x9f, 0x20, 0x09, 0x1f, 0xee, 0x13, + 0x04, 0x41, 0x77, 0xba, 0x0f, 0x27, 0x4b, 0x32, 0x64, 0x48, 0x16, 0x2c, 0xdb, 0xb2, 0x71, 0x82, + 0x21, 0x1b, 0xb0, 0x0d, 0x1b, 0x36, 0x04, 0x18, 0xc2, 0x3d, 0xd8, 0xb0, 0x5e, 0x0c, 0x43, 0xb2, + 0x41, 0x5b, 0x77, 0x7a, 0x31, 0x01, 0x03, 0x06, 0x04, 0x18, 0xd0, 0xd9, 0x02, 0x8c, 0x8c, 0xcc, + 0xac, 0xca, 0xac, 0xae, 0x26, 0x9b, 0x3b, 0xb3, 0xb0, 0x66, 0x9f, 0xc8, 0x8e, 0x8c, 0x88, 0xca, + 0x9f, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0x48, 0x18, 0x8f, 0x0e, 0xba, 0x34, 0xbc, 0xd9, 0x0d, 0xfc, + 0xc8, 0x27, 0x23, 0xf8, 0xe3, 0xf2, 0xb9, 0x5d, 0x7f, 0xd7, 0x47, 0xc8, 0x2c, 0xfb, 0x8f, 0x17, + 0x5e, 0xae, 0xee, 0xfa, 0xfe, 0x6e, 0x8b, 0xce, 0xe2, 0xaf, 0xed, 0xde, 0xce, 0x6c, 0xe4, 0xb5, + 0x69, 0x18, 0x39, 0xed, 0xae, 0x40, 0x98, 0xdf, 0xf5, 0xa2, 0xbd, 0xde, 0xf6, 0xcd, 0xa6, 0xdf, + 0x9e, 0xdd, 0x0d, 0x9c, 0x87, 0x5e, 0xe4, 0x44, 0x9e, 0xdf, 0x71, 0x5a, 0xb3, 0x11, 0x6d, 0xd1, + 0xae, 0x1f, 0x44, 0xb3, 0x4e, 0xd7, 0x9b, 0xc5, 0x6f, 0xcc, 0x3e, 0x0a, 0x9c, 0x6e, 0x97, 0x06, + 0xc9, 0x3f, 0x9c, 0x89, 0xf9, 0xb7, 0xf3, 0x50, 0xba, 0x4f, 0x69, 0xb7, 0xd6, 0xf2, 0x1e, 0x52, + 0xf2, 0x22, 0x14, 0x56, 0x9c, 0x36, 0x9d, 0x31, 0xae, 0x1a, 0xd7, 0x4b, 0xf5, 0xa9, 0xa3, 0xc3, + 0xea, 0x78, 0x48, 0x83, 0x87, 0x34, 0xb0, 0x3b, 0x4e, 0x9b, 0x5a, 0x58, 0x48, 0x3e, 0x0b, 0x25, + 0xf6, 0x37, 0xec, 0x3a, 0x4d, 0x3a, 0x93, 0x43, 0xcc, 0x89, 0xa3, 0xc3, 0x6a, 0xa9, 0x23, 0x81, + 0x56, 0x52, 0x4e, 0xae, 0xc1, 0xd8, 0x32, 0x75, 0x42, 0xba, 0xb4, 0x30, 0x93, 0xbf, 0x6a, 0x5c, + 0xcf, 0xd7, 0xcb, 0x47, 0x87, 0xd5, 0x62, 0x8b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0x21, 0x59, 0x82, + 0xb1, 0xc5, 0xc7, 0x5d, 0x2f, 0xa0, 0xe1, 0x4c, 0xe1, 0xaa, 0x71, 0x7d, 0x7c, 0xee, 0xf2, 0x4d, + 0xde, 0xfe, 0x9b, 0xb2, 0xfd, 0x37, 0xd7, 0x65, 0xfb, 0xeb, 0x67, 0xbf, 0x7f, 0x58, 0x3d, 0x73, + 0x74, 0x58, 0x1d, 0xa3, 0x9c, 0xe4, 0x57, 0xfe, 0x4b, 0xd5, 0xb0, 0x24, 0x3d, 0x79, 0x07, 0x0a, + 0xeb, 0x07, 0x5d, 0x3a, 0x53, 0xba, 0x6a, 0x5c, 0x9f, 0x9c, 0x7b, 0xe1, 0x26, 0xef, 0xf1, 0xb8, + 0x91, 0xc9, 0x7f, 0x0c, 0xab, 0x5e, 0x3c, 0x3a, 0xac, 0x16, 0x18, 0x8a, 0x85, 0x54, 0xe4, 0x75, + 0x18, 0xbd, 0xe7, 0x87, 0xd1, 0xd2, 0xc2, 0x0c, 0x60, 0xd3, 0xce, 0x1f, 0x1d, 0x56, 0xa7, 0xf7, + 0xfc, 0x30, 0xb2, 0x3d, 0xf7, 0x35, 0xbf, 0xed, 0x45, 0xb4, 0xdd, 0x8d, 0x0e, 0x2c, 0x81, 0x64, + 0x6e, 0xc3, 0x84, 0xc6, 0x8f, 0x8c, 0xc3, 0xd8, 0xc6, 0xca, 0xfd, 0x95, 0xd5, 0xad, 0x95, 0xca, + 0x19, 0x52, 0x84, 0xc2, 0xca, 0xea, 0xc2, 0x62, 0xc5, 0x20, 0x63, 0x90, 0xaf, 0xad, 0xad, 0x55, + 0x72, 0xa4, 0x0c, 0xc5, 0x85, 0xda, 0x7a, 0xad, 0x5e, 0x6b, 0x2c, 0x56, 0xf2, 0xe4, 0x2c, 0x4c, + 0x6d, 0x2d, 0xad, 0x2c, 0xac, 0x6e, 0x35, 0xec, 0x85, 0xc5, 0xc6, 0xfd, 0xf5, 0xd5, 0xb5, 0x4a, + 0x81, 0x4c, 0x02, 0xdc, 0xdf, 0xa8, 0x2f, 0x5a, 0x2b, 0x8b, 0xeb, 0x8b, 0x8d, 0xca, 0x88, 0xf9, + 0x0b, 0x79, 0x28, 0x3e, 0xa0, 0x91, 0xe3, 0x3a, 0x91, 0x43, 0xae, 0x68, 0x43, 0x84, 0xb5, 0x57, + 0xc6, 0xe6, 0xc5, 0xfe, 0xb1, 0x19, 0x39, 0x3a, 0xac, 0x1a, 0xaf, 0xab, 0x63, 0xf2, 0x36, 0x8c, + 0x2f, 0xd0, 0xb0, 0x19, 0x78, 0x5d, 0x26, 0x2f, 0x38, 0x2e, 0xa5, 0xfa, 0xa5, 0xa3, 0xc3, 0xea, + 0x79, 0x37, 0x01, 0x2b, 0x6d, 0x55, 0xb1, 0xc9, 0x12, 0x8c, 0x2e, 0x3b, 0xdb, 0xb4, 0x15, 0xce, + 0x8c, 0x5c, 0xcd, 0x5f, 0x1f, 0x9f, 0x7b, 0x4e, 0xf4, 0xaf, 0xac, 0xe0, 0x4d, 0x5e, 0xba, 0xd8, + 0x89, 0x82, 0x83, 0xfa, 0xb9, 0xa3, 0xc3, 0x6a, 0xa5, 0x85, 0x00, 0xb5, 0xef, 0x38, 0x0a, 0x69, + 0x24, 0x63, 0x3e, 0x7a, 0xe2, 0x98, 0x3f, 0xff, 0xfd, 0xc3, 0xaa, 0xc1, 0xc6, 0x42, 0x8c, 0x79, + 0xc2, 0x4f, 0x1f, 0xfd, 0xab, 0x90, 0x5b, 0x5a, 0x98, 0x19, 0x43, 0x59, 0xab, 0x1c, 0x1d, 0x56, + 0xcb, 0xda, 0xb0, 0xe5, 0x96, 0x16, 0x2e, 0xbf, 0x05, 0xe3, 0x4a, 0x1d, 0x49, 0x05, 0xf2, 0xfb, + 0xf4, 0x80, 0xf7, 0xa7, 0xc5, 0xfe, 0x25, 0xe7, 0x60, 0xe4, 0xa1, 0xd3, 0xea, 0x89, 0x0e, 0xb4, + 0xf8, 0x8f, 0x2f, 0xe6, 0x7e, 0xcc, 0x30, 0xff, 0xff, 0x02, 0x14, 0x2d, 0x9f, 0xcf, 0x33, 0xf2, + 0x2a, 0x8c, 0x34, 0x22, 0x27, 0x92, 0x43, 0x71, 0xf6, 0xe8, 0xb0, 0x3a, 0x15, 0x32, 0x80, 0xf2, + 0x3d, 0x8e, 0xc1, 0x50, 0xd7, 0xf6, 0x9c, 0x50, 0x0e, 0x09, 0xa2, 0x76, 0x19, 0x40, 0x45, 0x45, + 0x0c, 0x72, 0x0d, 0x0a, 0x0f, 0x7c, 0x97, 0x8a, 0x51, 0x21, 0x47, 0x87, 0xd5, 0xc9, 0xb6, 0xef, + 0xaa, 0x88, 0x58, 0x4e, 0x5e, 0x83, 0xd2, 0x7c, 0x2f, 0x08, 0x68, 0x87, 0x89, 0x6a, 0x01, 0x91, + 0x27, 0x8f, 0x0e, 0xab, 0xd0, 0xe4, 0x40, 0x36, 0xb9, 0x12, 0x04, 0xd6, 0xd5, 0x8d, 0xc8, 0x09, + 0x22, 0xea, 0xce, 0x8c, 0x0c, 0xd5, 0xd5, 0x6c, 0x7a, 0x4d, 0x87, 0x9c, 0x24, 0xdd, 0xd5, 0x82, + 0x13, 0xb9, 0x07, 0xe3, 0x77, 0x03, 0xa7, 0x49, 0xd7, 0x68, 0xe0, 0xf9, 0x2e, 0x8e, 0x61, 0xbe, + 0x7e, 0xed, 0xe8, 0xb0, 0x7a, 0x61, 0x97, 0x81, 0xed, 0x2e, 0xc2, 0x13, 0xea, 0x1f, 0x1d, 0x56, + 0x8b, 0x0b, 0xbd, 0x00, 0x7b, 0xcf, 0x52, 0x49, 0xc9, 0x4f, 0xb2, 0x21, 0x09, 0x23, 0xec, 0x5a, + 0xea, 0xe2, 0xe8, 0x1d, 0x5f, 0x45, 0x53, 0x54, 0xf1, 0x42, 0xcb, 0x09, 0x23, 0x3b, 0xe0, 0x74, + 0xa9, 0x7a, 0xaa, 0x2c, 0xc9, 0x2a, 0x14, 0x1b, 0xcd, 0x3d, 0xea, 0xf6, 0x5a, 0x74, 0xa6, 0x88, + 0xec, 0x2f, 0x0a, 0xc1, 0x95, 0xe3, 0x29, 0x8b, 0xeb, 0x97, 0x05, 0x6f, 0x12, 0x0a, 0x88, 0xd2, + 0xf7, 0x31, 0x93, 0x2f, 0x16, 0x7f, 0xfd, 0xb7, 0xab, 0x67, 0x7e, 0xee, 0x3f, 0x5f, 0x3d, 0x63, + 0xfe, 0xd3, 0x1c, 0x54, 0xd2, 0x4c, 0xc8, 0x0e, 0x4c, 0x6c, 0x74, 0x5d, 0x27, 0xa2, 0xf3, 0x2d, + 0x8f, 0x76, 0xa2, 0x10, 0x85, 0xe4, 0xf8, 0x36, 0xbd, 0x24, 0xbe, 0x3b, 0xd3, 0x43, 0x42, 0xbb, + 0xc9, 0x29, 0x53, 0xad, 0xd2, 0xd9, 0x26, 0xdf, 0x69, 0xa0, 0x9e, 0x0e, 0x51, 0xc2, 0x4e, 0xf7, + 0x1d, 0xae, 0xe1, 0x07, 0x7c, 0x47, 0xb0, 0x15, 0x02, 0xd4, 0x71, 0xb7, 0x0f, 0x50, 0x32, 0x87, + 0x17, 0x20, 0x46, 0x92, 0x21, 0x40, 0x0c, 0x6c, 0xfe, 0xb9, 0x01, 0x93, 0x16, 0x0d, 0xfd, 0x5e, + 0xd0, 0xa4, 0xf7, 0xa8, 0xe3, 0xd2, 0x80, 0x89, 0xff, 0x7d, 0xaf, 0xe3, 0x8a, 0x39, 0x85, 0xe2, + 0xbf, 0xef, 0x75, 0xd4, 0x29, 0x8c, 0xe5, 0xe4, 0x73, 0x30, 0xd6, 0xe8, 0x6d, 0x23, 0x2a, 0x9f, + 0x53, 0x17, 0x70, 0xc4, 0x7a, 0xdb, 0x76, 0x0a, 0x5d, 0xa2, 0x91, 0x59, 0x18, 0xdb, 0xa4, 0x41, + 0x98, 0x68, 0x3c, 0xd4, 0xec, 0x0f, 0x39, 0x48, 0x25, 0x10, 0x58, 0xe4, 0x6e, 0xa2, 0x75, 0xc5, + 0x9a, 0x34, 0x95, 0xd2, 0x75, 0x89, 0xa8, 0xb4, 0x05, 0x44, 0x15, 0x15, 0x89, 0x65, 0x7e, 0x27, + 0x07, 0x95, 0x05, 0x27, 0x72, 0xb6, 0x9d, 0x50, 0xf4, 0xe7, 0xe6, 0x6d, 0xa6, 0xc7, 0x95, 0x86, + 0xa2, 0x1e, 0x67, 0x35, 0xff, 0xd8, 0xcd, 0x7b, 0x39, 0xdd, 0xbc, 0x71, 0xb6, 0x40, 0x8a, 0xe6, + 0x25, 0x8d, 0x7a, 0xf7, 0xe4, 0x46, 0x55, 0x44, 0xa3, 0x8a, 0xb2, 0x51, 0x49, 0x53, 0xc8, 0xbb, + 0x50, 0x68, 0x74, 0x69, 0x53, 0x28, 0x11, 0xa9, 0xfb, 0xf5, 0xc6, 0x31, 0x84, 0xcd, 0xdb, 0xf5, + 0xb2, 0x60, 0x53, 0x08, 0xbb, 0xb4, 0x69, 0x21, 0x99, 0x32, 0x69, 0xbe, 0x3b, 0x0a, 0xe7, 0xb2, + 0xc8, 0xc8, 0xbb, 0xfa, 0xe2, 0xc4, 0xbb, 0xe7, 0xb9, 0x81, 0x8b, 0xd3, 0x8c, 0xa1, 0x2f, 0x4f, + 0x37, 0xa0, 0xb8, 0xc6, 0x04, 0xb2, 0xe9, 0xb7, 0x44, 0xcf, 0x31, 0xad, 0x58, 0xec, 0x4a, 0x98, + 0x61, 0xc5, 0xe5, 0xe4, 0x39, 0xc8, 0x6f, 0x58, 0x4b, 0xa2, 0xbb, 0x4a, 0x47, 0x87, 0xd5, 0x7c, + 0x2f, 0xf0, 0x66, 0x0c, 0x8b, 0x41, 0xc9, 0x2c, 0x8c, 0xce, 0xd7, 0xe6, 0x69, 0x10, 0x61, 0x37, + 0x95, 0xeb, 0x17, 0x99, 0xb4, 0x34, 0x1d, 0xbb, 0x49, 0x83, 0x48, 0xfb, 0xbc, 0x40, 0x23, 0x9f, + 0x85, 0x7c, 0x6d, 0xab, 0x21, 0x7a, 0x06, 0x44, 0xcf, 0xd4, 0xb6, 0x1a, 0xf5, 0x09, 0xd1, 0x11, + 0x79, 0xe7, 0x51, 0xc8, 0xb8, 0xd7, 0xb6, 0x1a, 0xea, 0x68, 0x8d, 0x1e, 0x33, 0x5a, 0xd7, 0xa1, + 0xc8, 0xec, 0x0c, 0xb6, 0xc0, 0xa3, 0x52, 0x2c, 0x71, 0xf3, 0x69, 0x4f, 0xc0, 0xac, 0xb8, 0x94, + 0xbc, 0x18, 0x9b, 0x2d, 0xc5, 0x84, 0x9f, 0x30, 0x5b, 0xa4, 0xb1, 0x42, 0x1e, 0xc3, 0xc4, 0xc2, + 0x41, 0xc7, 0x69, 0x7b, 0x4d, 0xb1, 0x84, 0x97, 0x70, 0x09, 0xbf, 0x79, 0xcc, 0x30, 0xde, 0xd4, + 0x08, 0xf8, 0xaa, 0x2e, 0x95, 0xef, 0x8c, 0xcb, 0xcb, 0xec, 0xf4, 0x0a, 0x3f, 0x63, 0x58, 0xfa, + 0x87, 0xd8, 0x5c, 0x92, 0x2a, 0x12, 0xed, 0xaa, 0x44, 0xec, 0x24, 0x38, 0x99, 0x4b, 0x81, 0x80, + 0xa8, 0x73, 0x29, 0x5e, 0x74, 0xdf, 0x85, 0xfc, 0xdd, 0xf9, 0xb5, 0x99, 0x71, 0xe4, 0x41, 0x04, + 0x8f, 0xbb, 0xf3, 0x6b, 0xf3, 0x2d, 0xbf, 0xe7, 0x36, 0x3e, 0x5c, 0xae, 0x5f, 0x14, 0x6c, 0x26, + 0x76, 0x9b, 0x5d, 0xad, 0x46, 0x8c, 0x8e, 0x2c, 0x42, 0x51, 0xb6, 0x72, 0xa6, 0x8c, 0x3c, 0xa6, + 0x53, 0x8d, 0xdf, 0xbc, 0xcd, 0xe7, 0x9a, 0x2b, 0x7e, 0xab, 0xb5, 0x90, 0x38, 0x97, 0xb7, 0x80, + 0xf4, 0xf7, 0x4b, 0x86, 0x25, 0xf1, 0x59, 0xd5, 0x92, 0x18, 0x9f, 0x3b, 0x2f, 0xbe, 0x35, 0xef, + 0xb7, 0xdb, 0x4e, 0xc7, 0x45, 0xda, 0xcd, 0x39, 0xd5, 0xc0, 0xa8, 0xc1, 0x64, 0x52, 0x91, 0x65, + 0x2f, 0x8c, 0xc8, 0x2c, 0x94, 0x24, 0x84, 0x2d, 0x22, 0xf9, 0xcc, 0x2a, 0x5b, 0x09, 0x8e, 0xf9, + 0x47, 0x39, 0x80, 0xa4, 0xe4, 0x19, 0xd5, 0x33, 0x5f, 0xd0, 0xf4, 0xcc, 0xf9, 0xb4, 0x80, 0x0e, + 0xd4, 0x30, 0xe4, 0x7d, 0x18, 0x65, 0x26, 0x57, 0x4f, 0x9a, 0x94, 0x17, 0xd3, 0xa4, 0x58, 0xb8, + 0x79, 0xbb, 0x3e, 0x29, 0x88, 0x47, 0x43, 0x84, 0x58, 0x82, 0x4c, 0x51, 0x51, 0x7f, 0x30, 0x92, + 0x0c, 0x86, 0x50, 0x4e, 0xd7, 0x15, 0xed, 0x62, 0x24, 0xf3, 0x51, 0x6a, 0x17, 0x45, 0xb7, 0x5c, + 0xe2, 0xba, 0x85, 0x77, 0xea, 0x98, 0xd0, 0x2d, 0x69, 0xcd, 0xc2, 0x3b, 0xf0, 0x44, 0xcd, 0xd2, + 0x4d, 0x4f, 0xdb, 0x02, 0x8a, 0xc1, 0xf5, 0xcc, 0x5e, 0xc9, 0x9a, 0xb0, 0x57, 0x4f, 0x9a, 0xb0, + 0xe9, 0xe9, 0x7a, 0x7b, 0x90, 0x2e, 0x3b, 0x2f, 0x67, 0x97, 0xf3, 0x48, 0x25, 0x47, 0x9d, 0xf6, + 0x36, 0x9f, 0x9a, 0xa3, 0x03, 0xa7, 0xe6, 0xf9, 0xcc, 0xa9, 0xc9, 0x27, 0xe6, 0xdb, 0x30, 0x52, + 0xfb, 0xa9, 0x5e, 0x40, 0x85, 0xed, 0x57, 0x96, 0xdf, 0x64, 0xb0, 0x78, 0x4e, 0x4f, 0x39, 0xec, + 0xa7, 0x6a, 0x33, 0x63, 0x39, 0xfb, 0xf2, 0xfa, 0x72, 0x43, 0xd8, 0x75, 0x24, 0xd5, 0x2d, 0xeb, + 0xcb, 0x4a, 0xb5, 0x23, 0xad, 0xd5, 0x8c, 0x8a, 0xcc, 0x42, 0xae, 0xb6, 0x80, 0x9b, 0xc5, 0xf1, + 0xb9, 0x92, 0xfc, 0xec, 0x42, 0xfd, 0x9c, 0x20, 0x29, 0x3b, 0xda, 0xfe, 0xa1, 0xb6, 0x40, 0xea, + 0x30, 0xf2, 0xe0, 0xa0, 0xf1, 0xe1, 0xb2, 0x50, 0x64, 0x67, 0xa5, 0x5c, 0x33, 0xd8, 0x2a, 0xae, + 0x42, 0x61, 0x52, 0xe3, 0xf6, 0x41, 0xf8, 0x8d, 0x96, 0x5a, 0x63, 0x44, 0xfb, 0xe4, 0x14, 0xc8, + 0x3f, 0x32, 0x14, 0x5b, 0x43, 0xc8, 0x3a, 0xdb, 0xd3, 0x0a, 0x89, 0x33, 0x12, 0xcb, 0xa7, 0x4f, + 0xe2, 0x62, 0x79, 0x7b, 0x95, 0x8f, 0x7e, 0xae, 0x6f, 0xf4, 0xc7, 0x95, 0x95, 0x8c, 0x8f, 0x79, + 0xdc, 0x17, 0xf9, 0x8f, 0xdd, 0x17, 0xe6, 0x7f, 0x33, 0xf0, 0x7b, 0xe4, 0x35, 0x18, 0xb5, 0xe8, + 0x6e, 0xb2, 0xe8, 0xe3, 0xe6, 0x31, 0x40, 0x88, 0x5a, 0x49, 0x8e, 0x83, 0x2b, 0x0a, 0x75, 0xc3, + 0x3d, 0x6f, 0x27, 0x12, 0x35, 0x8d, 0x57, 0x14, 0x01, 0x56, 0x56, 0x14, 0x01, 0xd1, 0x56, 0x14, + 0x01, 0x63, 0xb2, 0x6e, 0x2d, 0x34, 0x44, 0x03, 0x64, 0x6b, 0xad, 0x05, 0x45, 0x68, 0x02, 0x57, + 0x13, 0x1a, 0x6b, 0xa1, 0x41, 0xde, 0x84, 0x52, 0xad, 0xd9, 0xf4, 0x7b, 0xca, 0xee, 0x6b, 0xe6, + 0xe8, 0xb0, 0x7a, 0xce, 0xe1, 0x40, 0xdd, 0x57, 0x90, 0xa0, 0x9a, 0xf5, 0xa4, 0xd6, 0x8c, 0xc7, + 0x7c, 0xab, 0x17, 0x46, 0x34, 0x58, 0x5a, 0x10, 0x4d, 0x46, 0x1e, 0x4d, 0x0e, 0x4c, 0xf1, 0x88, + 0x51, 0xcd, 0xff, 0x64, 0x60, 0x8d, 0xc9, 0x5b, 0x00, 0x4b, 0x1d, 0x66, 0x61, 0x37, 0x69, 0xcc, + 0x00, 0x77, 0xf1, 0x9e, 0x80, 0xea, 0x1c, 0x14, 0x64, 0xfd, 0xd3, 0xb9, 0xa1, 0x3f, 0xcd, 0x3e, + 0x29, 0xed, 0x75, 0xe1, 0xd0, 0x11, 0x9f, 0x0c, 0x04, 0x34, 0xf5, 0xc9, 0x04, 0x99, 0x5c, 0x83, + 0xb1, 0xa5, 0xda, 0x83, 0x5a, 0x2f, 0xda, 0xc3, 0xfe, 0x2a, 0x72, 0xcd, 0xe9, 0x39, 0x6d, 0xdb, + 0xe9, 0x45, 0x7b, 0x96, 0x2c, 0x34, 0x7f, 0xce, 0x80, 0x71, 0x45, 0x69, 0xb0, 0xaa, 0xae, 0x05, + 0xfe, 0x47, 0xb4, 0x19, 0xe9, 0xbd, 0xd4, 0xe5, 0xc0, 0x54, 0x55, 0x63, 0xd4, 0x54, 0xef, 0xe4, + 0x4e, 0xd1, 0x3b, 0xe6, 0xac, 0xd0, 0x45, 0x6c, 0x33, 0xa2, 0xf8, 0x5a, 0x70, 0x33, 0xc2, 0x8c, + 0x2d, 0x75, 0x33, 0xc2, 0xca, 0xcd, 0xdf, 0x33, 0x98, 0x0e, 0x21, 0xb3, 0x00, 0xf7, 0xe9, 0x41, + 0xe4, 0x6c, 0xdf, 0xf1, 0x5a, 0x9a, 0x0f, 0x6d, 0x1f, 0xa1, 0xf6, 0x8e, 0xd7, 0xa2, 0x96, 0x82, + 0x42, 0x6e, 0x43, 0xf1, 0x7e, 0xb0, 0xfd, 0x06, 0xa2, 0xe7, 0xe2, 0xb5, 0xe0, 0xec, 0x7e, 0xb0, + 0xfd, 0x06, 0x22, 0xab, 0xf2, 0x2a, 0x11, 0x89, 0x09, 0xa3, 0x0b, 0x7e, 0xdb, 0xf1, 0xe4, 0xfa, + 0x0b, 0x6c, 0x11, 0x73, 0x11, 0x62, 0x89, 0x12, 0xb6, 0xfa, 0x34, 0xd6, 0x56, 0x84, 0x60, 0xe2, + 0xea, 0x13, 0x76, 0x3b, 0x16, 0x83, 0x99, 0xdf, 0x33, 0x60, 0x5c, 0x51, 0x8d, 0xe4, 0xf3, 0xc2, + 0xdf, 0x60, 0xa0, 0xb7, 0xec, 0x42, 0xbf, 0xf2, 0x64, 0xa5, 0xdc, 0x6e, 0x68, 0xfb, 0x2e, 0x15, + 0xde, 0x87, 0x44, 0xa3, 0xe4, 0x86, 0xd1, 0x28, 0x6f, 0x01, 0x70, 0xa3, 0x12, 0xbb, 0x53, 0x91, + 0x1b, 0xc5, 0xbb, 0xa8, 0x0e, 0x46, 0x82, 0x6c, 0x5a, 0x50, 0x56, 0xb5, 0x09, 0xa9, 0xc3, 0x84, + 0xd8, 0x43, 0x09, 0x2b, 0x84, 0xf7, 0xf3, 0x15, 0xb6, 0xbc, 0x09, 0x6e, 0xfd, 0x7b, 0x3a, 0x9d, + 0xc4, 0xfc, 0xf9, 0x1c, 0x14, 0x05, 0x64, 0xee, 0x19, 0x35, 0x90, 0xde, 0xd0, 0x0c, 0x24, 0xa9, + 0x77, 0x15, 0xcb, 0x7d, 0xee, 0x84, 0x0d, 0xd8, 0x5b, 0x50, 0x96, 0x5d, 0x80, 0x76, 0xe6, 0xab, + 0x30, 0x26, 0x5d, 0x08, 0xdc, 0xca, 0x9c, 0xd2, 0x78, 0x6e, 0xce, 0x59, 0xb2, 0xdc, 0xfc, 0xce, + 0x88, 0xa4, 0xe5, 0x5f, 0x62, 0x5d, 0x58, 0x73, 0xdd, 0x40, 0xed, 0x42, 0xc7, 0x75, 0x03, 0x0b, + 0xa1, 0x6c, 0xf0, 0xd7, 0x7a, 0xdb, 0x2d, 0xaf, 0x89, 0x38, 0xca, 0x4c, 0xec, 0x22, 0xd4, 0x66, + 0xa8, 0xea, 0xe0, 0x27, 0xc8, 0xda, 0xfe, 0x27, 0x7f, 0xec, 0xfe, 0xe7, 0x27, 0xa0, 0x34, 0xdf, + 0x76, 0x35, 0xfb, 0xc8, 0xcc, 0xe8, 0x94, 0x9b, 0x31, 0x12, 0xb7, 0x8c, 0xae, 0x88, 0x3e, 0x3a, + 0xd7, 0x6c, 0xbb, 0xfd, 0x56, 0x51, 0xc2, 0x52, 0xdb, 0xc0, 0x8c, 0x3c, 0xc9, 0x06, 0xe6, 0x4d, + 0x28, 0x6d, 0x84, 0x74, 0xbd, 0xd7, 0xe9, 0xd0, 0x16, 0xda, 0x4a, 0x45, 0xae, 0xcf, 0x7a, 0x21, + 0xb5, 0x23, 0x84, 0xaa, 0x15, 0x88, 0x51, 0x55, 0xb1, 0x1a, 0x3b, 0x46, 0xac, 0x3e, 0x0f, 0x85, + 0x5a, 0xb7, 0x2b, 0x77, 0x76, 0xf1, 0xe2, 0xdd, 0xed, 0xe2, 0x72, 0x3a, 0xe9, 0x74, 0xbb, 0xfa, + 0x3e, 0x0d, 0xb1, 0x09, 0x05, 0x72, 0xbf, 0xb7, 0x4d, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0xd4, 0x7d, + 0x38, 0x03, 0xc8, 0x63, 0x46, 0x3a, 0xd0, 0xd3, 0x08, 0xb8, 0x2b, 0xbf, 0xb8, 0xdf, 0xdb, 0xa6, + 0xb6, 0x58, 0x37, 0xd4, 0xbe, 0xcb, 0x60, 0x78, 0xb9, 0x01, 0x93, 0x7a, 0xff, 0x3f, 0x05, 0x8b, + 0xe7, 0x83, 0x42, 0xb1, 0x58, 0x29, 0x99, 0xbf, 0x90, 0x83, 0xf1, 0x5a, 0xb7, 0xfb, 0x8c, 0xbb, + 0x57, 0x7e, 0x4c, 0x9b, 0xd5, 0x17, 0x92, 0xd1, 0x3b, 0x85, 0x67, 0xe5, 0x2f, 0x0d, 0x98, 0x4a, + 0x51, 0xa8, 0xb5, 0x37, 0x86, 0x74, 0x37, 0xe4, 0x86, 0x74, 0x37, 0xe4, 0x07, 0xbb, 0x1b, 0xd4, + 0x39, 0x53, 0x78, 0x92, 0x39, 0xf3, 0x0a, 0xe4, 0x6b, 0xdd, 0xae, 0xe8, 0x95, 0x72, 0xd2, 0x2b, + 0x9b, 0xb7, 0xf9, 0xe2, 0xe6, 0x74, 0xbb, 0x16, 0xc3, 0x30, 0x5f, 0x87, 0x12, 0x82, 0x51, 0xa3, + 0x5d, 0x15, 0x53, 0x81, 0xab, 0x33, 0x8d, 0x8c, 0x8b, 0xbd, 0xf9, 0xbf, 0x0c, 0x18, 0xc1, 0xdf, + 0xcf, 0xa8, 0xb8, 0xcc, 0x69, 0xe2, 0x52, 0x51, 0xc4, 0x65, 0x18, 0x41, 0xf9, 0x83, 0x3c, 0xf6, + 0x96, 0x10, 0x11, 0xb1, 0x61, 0x35, 0x32, 0x36, 0xac, 0x4f, 0xa0, 0xc0, 0xf7, 0xd3, 0x5b, 0xd7, + 0x3c, 0x0e, 0xc6, 0x8b, 0xe9, 0xaa, 0x3e, 0x95, 0x5d, 0xeb, 0x3d, 0x20, 0x4b, 0x9d, 0x90, 0x36, + 0x7b, 0x01, 0x6d, 0xec, 0x7b, 0xdd, 0x4d, 0x1a, 0x78, 0x3b, 0x07, 0xc2, 0xda, 0x44, 0x1d, 0xeb, + 0x89, 0x52, 0x3b, 0xdc, 0xf7, 0xba, 0xcc, 0x4c, 0xf0, 0x76, 0x0e, 0xac, 0x0c, 0x1a, 0xf2, 0x3e, + 0x8c, 0x59, 0xf4, 0x51, 0xe0, 0x45, 0x54, 0xf4, 0xed, 0x64, 0xbc, 0xb7, 0x40, 0x28, 0xb7, 0x77, + 0x02, 0xfe, 0x43, 0x1d, 0x7f, 0x51, 0xfe, 0xc9, 0xed, 0xef, 0xbe, 0x3b, 0x82, 0x73, 0xe1, 0x84, + 0x63, 0xc0, 0x63, 0xbc, 0x0f, 0xfa, 0x60, 0xe6, 0x4f, 0x33, 0x98, 0x9b, 0x50, 0x66, 0x5b, 0xca, + 0x94, 0x1b, 0xe2, 0x4a, 0x32, 0x96, 0x37, 0xd5, 0xe2, 0xe3, 0x4e, 0x00, 0x35, 0x3e, 0xc4, 0x4e, + 0x0b, 0x09, 0x3f, 0x59, 0x7c, 0x5e, 0x61, 0x9c, 0x21, 0x1e, 0xb1, 0xea, 0x68, 0xf2, 0xce, 0x3a, + 0xb5, 0x60, 0x8c, 0x3e, 0x99, 0x60, 0x8c, 0x7d, 0x1c, 0xc1, 0x48, 0x9f, 0xbd, 0x16, 0x4f, 0x73, + 0xf6, 0x7a, 0xf9, 0x7d, 0x98, 0xee, 0xeb, 0xe1, 0xd3, 0x9c, 0x5f, 0x7e, 0x72, 0x62, 0xf9, 0x33, + 0x71, 0xbf, 0x90, 0x39, 0xdc, 0xe2, 0x7a, 0x01, 0x6d, 0x46, 0xa8, 0x7a, 0x85, 0xb6, 0x0c, 0x04, + 0x2c, 0xb5, 0x07, 0x47, 0x18, 0x79, 0x0f, 0xc6, 0xf8, 0xf9, 0x4f, 0x38, 0x93, 0xc3, 0xb1, 0x9f, + 0x10, 0x5f, 0xe4, 0x50, 0x71, 0x08, 0xcf, 0x31, 0xd4, 0x5e, 0x15, 0x44, 0xe6, 0x5d, 0x18, 0x15, + 0xe7, 0x47, 0xc7, 0xcf, 0x8b, 0x2a, 0x8c, 0x6c, 0x26, 0x3d, 0x83, 0x3e, 0x7f, 0xde, 0x08, 0x8b, + 0xc3, 0xcd, 0x5f, 0x32, 0x60, 0x52, 0x6f, 0x25, 0xb9, 0x09, 0xa3, 0xe2, 0x80, 0xd3, 0xc0, 0x03, + 0x4e, 0xd6, 0x9a, 0x51, 0x7e, 0xb4, 0xa9, 0x1d, 0x68, 0x0a, 0x2c, 0xa6, 0xfa, 0x05, 0x07, 0x6c, + 0x8b, 0x50, 0xfd, 0x42, 0x48, 0x2d, 0x59, 0xc6, 0xb6, 0x71, 0x16, 0x0d, 0x7b, 0xad, 0x48, 0xdd, + 0xc6, 0x05, 0x08, 0xb1, 0x44, 0x89, 0x79, 0x68, 0x00, 0x34, 0x1a, 0xf7, 0xee, 0xd3, 0x83, 0x35, + 0xc7, 0x0b, 0x70, 0x2b, 0x8c, 0xb3, 0xf1, 0xbe, 0x18, 0xad, 0xb2, 0xd8, 0x0a, 0xf3, 0x99, 0xbb, + 0x4f, 0x0f, 0xb4, 0xad, 0xb0, 0x44, 0xc5, 0x29, 0x1f, 0x78, 0x0f, 0x9d, 0x88, 0x32, 0xc2, 0x1c, + 0x12, 0xf2, 0x29, 0xcf, 0xa1, 0x29, 0x4a, 0x05, 0x99, 0x7c, 0x1d, 0x26, 0x93, 0x5f, 0x18, 0x55, + 0x91, 0xc7, 0x7d, 0xa2, 0x94, 0x08, 0xbd, 0xb0, 0xfe, 0xc2, 0xd1, 0x61, 0xf5, 0xb2, 0xc2, 0xd5, + 0x66, 0x58, 0x0a, 0xeb, 0x14, 0x33, 0xf3, 0x77, 0x0c, 0x80, 0xf5, 0xe5, 0x86, 0x6c, 0xe0, 0x35, + 0x28, 0xc4, 0x5e, 0xaa, 0x32, 0xdf, 0x6f, 0xa7, 0x36, 0x94, 0x58, 0x4e, 0x5e, 0x84, 0x7c, 0xd2, + 0x92, 0xe9, 0xa3, 0xc3, 0xea, 0x84, 0xde, 0x02, 0x56, 0x4a, 0xee, 0xc2, 0xd8, 0x50, 0x75, 0x46, + 0xe9, 0xcc, 0xa8, 0xab, 0xa4, 0xc6, 0x51, 0xf8, 0x60, 0x6b, 0xfd, 0xd3, 0x3b, 0x0a, 0xdf, 0xce, + 0xc1, 0x14, 0xeb, 0xd7, 0x5a, 0x2f, 0xda, 0xf3, 0x03, 0x2f, 0x3a, 0x78, 0x66, 0x77, 0xc5, 0xef, + 0x68, 0x06, 0xd1, 0x65, 0xa9, 0xb6, 0xd4, 0xb6, 0x0d, 0xb5, 0x39, 0xfe, 0xb3, 0x31, 0x38, 0x9b, + 0x41, 0x45, 0x5e, 0x13, 0xa1, 0x45, 0x89, 0x1f, 0x0a, 0x43, 0x87, 0x7e, 0x74, 0x58, 0x2d, 0x4b, + 0xf4, 0xf5, 0x24, 0x94, 0x68, 0x0e, 0xc6, 0xc5, 0xd6, 0x67, 0x25, 0xb1, 0xa8, 0x31, 0x26, 0x45, + 0xfa, 0xd9, 0x50, 0x35, 0xa9, 0x48, 0xa4, 0x06, 0xe5, 0xf9, 0x3d, 0xda, 0xdc, 0xf7, 0x3a, 0xbb, + 0xf7, 0xe9, 0x01, 0xb7, 0x97, 0xca, 0xf5, 0xe7, 0xd9, 0x4e, 0xab, 0x29, 0xe0, 0x6c, 0x48, 0xf5, + 0x4d, 0x9c, 0x46, 0x42, 0xde, 0x83, 0xf1, 0x86, 0xb7, 0xdb, 0x91, 0x1c, 0x0a, 0xc8, 0xe1, 0xca, + 0xd1, 0x61, 0xf5, 0x42, 0xc8, 0xc1, 0xfd, 0x0c, 0x54, 0x02, 0xf2, 0x2a, 0x8c, 0x58, 0x7e, 0x8b, + 0xf2, 0x65, 0x58, 0x04, 0xab, 0x04, 0x0c, 0xa0, 0xba, 0x6e, 0x11, 0x83, 0xdc, 0x83, 0x31, 0xf6, + 0xcf, 0x03, 0xa7, 0x3b, 0x33, 0x8a, 0x7a, 0x9b, 0xc4, 0x06, 0x3e, 0x42, 0xbb, 0x5e, 0x67, 0x57, + 0xb5, 0xf1, 0x5b, 0xd4, 0x6e, 0x3b, 0x5d, 0x6d, 0x5d, 0xe4, 0x88, 0x64, 0x13, 0xc6, 0x13, 0x45, + 0x10, 0xce, 0x8c, 0x69, 0x07, 0x5d, 0x49, 0x49, 0xfd, 0x33, 0x82, 0xd9, 0xc5, 0xa8, 0x15, 0xa2, + 0x6c, 0x77, 0x19, 0xbe, 0xde, 0x18, 0x85, 0x91, 0xb6, 0x07, 0x29, 0x0e, 0xde, 0x83, 0x18, 0x27, + 0xee, 0x41, 0x5c, 0x00, 0xd1, 0x49, 0xb5, 0xd6, 0xae, 0x88, 0x2d, 0x7b, 0x75, 0xb0, 0x80, 0xdd, + 0x4c, 0x90, 0x71, 0x4e, 0x72, 0x6f, 0x97, 0xe8, 0x7f, 0xa7, 0xb5, 0xab, 0x79, 0xbb, 0x62, 0x54, + 0xd6, 0x0d, 0x89, 0xaa, 0x91, 0x3b, 0x70, 0xd9, 0x0d, 0x49, 0x49, 0xd2, 0x0d, 0x1f, 0x3d, 0x8a, + 0x06, 0x75, 0x83, 0xc2, 0x88, 0xac, 0x00, 0xd4, 0x9a, 0x91, 0xf7, 0x90, 0xa2, 0x48, 0x8c, 0x6b, + 0x1d, 0x31, 0x5f, 0xbb, 0x4f, 0x0f, 0x1a, 0x34, 0x8a, 0xc3, 0x36, 0xce, 0x3b, 0x88, 0x9a, 0x12, + 0x13, 0x4b, 0xe1, 0x40, 0xba, 0x70, 0xbe, 0xe6, 0xba, 0x1e, 0x8f, 0x37, 0x5c, 0x0f, 0x98, 0xfc, + 0xba, 0xc8, 0xba, 0x9c, 0xcd, 0xfa, 0x55, 0xc1, 0xfa, 0x33, 0x4e, 0x4c, 0x65, 0x47, 0x9c, 0x2c, + 0xfd, 0x99, 0x6c, 0xc6, 0xe6, 0x2a, 0x4c, 0xea, 0x5d, 0xaa, 0x47, 0xda, 0x95, 0xa1, 0x68, 0x35, + 0x6a, 0x76, 0xe3, 0x5e, 0xed, 0x56, 0xc5, 0x20, 0x15, 0x28, 0x8b, 0x5f, 0x73, 0xf6, 0xdc, 0x1b, + 0x6f, 0x56, 0x72, 0x1a, 0xe4, 0x8d, 0x5b, 0x73, 0x95, 0xbc, 0xf9, 0x07, 0x06, 0x14, 0x65, 0xfd, + 0xc8, 0x9b, 0x90, 0x6f, 0x34, 0xee, 0xa5, 0xce, 0x57, 0x93, 0xa5, 0x97, 0x2f, 0x32, 0x61, 0xb8, + 0xa7, 0x2e, 0x32, 0x8d, 0xc6, 0x3d, 0x46, 0xb7, 0xbe, 0xdc, 0x10, 0x46, 0x4b, 0x86, 0xb8, 0x4e, + 0x0f, 0x38, 0x74, 0x7a, 0x13, 0xf2, 0x1f, 0x6c, 0xad, 0x8b, 0xdd, 0x50, 0xc6, 0xf8, 0x22, 0xdd, + 0x47, 0x8f, 0xd4, 0xa5, 0x8f, 0x11, 0x98, 0x16, 0x8c, 0x2b, 0x53, 0x8b, 0x1b, 0x11, 0x6d, 0x3f, + 0x8e, 0x41, 0x13, 0x46, 0x04, 0x83, 0x58, 0xa2, 0x84, 0xd9, 0x3c, 0xcb, 0x7e, 0xd3, 0x69, 0x09, + 0x6b, 0x04, 0x6d, 0x9e, 0x16, 0x03, 0x58, 0x1c, 0x6e, 0xfe, 0xa1, 0x01, 0x95, 0xb5, 0xc0, 0x7f, + 0xe8, 0x31, 0x0d, 0xbc, 0xee, 0xef, 0xd3, 0xce, 0xe6, 0x2d, 0xf2, 0xba, 0x54, 0x02, 0xdc, 0x84, + 0xbb, 0xc8, 0xa8, 0x50, 0x09, 0xfc, 0xe8, 0xb0, 0x0a, 0x8d, 0x83, 0x30, 0xa2, 0x6d, 0x56, 0x2e, + 0x15, 0x81, 0x12, 0xca, 0x97, 0x1b, 0x3e, 0x3c, 0xe8, 0x84, 0x50, 0xbe, 0x2a, 0x8c, 0x60, 0x75, + 0x94, 0x08, 0x8d, 0x91, 0x88, 0x01, 0x2c, 0x0e, 0x57, 0x14, 0xf6, 0x77, 0x72, 0x7d, 0x6d, 0x98, + 0xfb, 0x54, 0x85, 0xd8, 0xe8, 0x8d, 0x1b, 0x6a, 0x11, 0xfb, 0x0a, 0x9c, 0x4b, 0x77, 0x09, 0xfa, + 0x45, 0x6a, 0x30, 0xa5, 0xc3, 0xa5, 0x8b, 0xe4, 0x62, 0xe6, 0xb7, 0x36, 0xe7, 0xac, 0x34, 0xbe, + 0xf9, 0x03, 0x03, 0x4a, 0xf8, 0xaf, 0xd5, 0x6b, 0x51, 0x66, 0xd9, 0xd4, 0xb6, 0x1a, 0xe2, 0x90, + 0x4b, 0x3d, 0x88, 0x72, 0x1e, 0x85, 0xb6, 0x38, 0x11, 0xd3, 0xf4, 0x48, 0x8c, 0x2c, 0x48, 0xf9, + 0x91, 0x5e, 0x28, 0x24, 0x34, 0x26, 0xe5, 0x67, 0x7f, 0x61, 0x8a, 0x54, 0x20, 0xb3, 0xf1, 0x63, + 0xbf, 0xfc, 0x96, 0x74, 0x0d, 0xe3, 0xf8, 0x21, 0x9d, 0xaf, 0x1d, 0x9d, 0x48, 0x34, 0xf2, 0x3a, + 0x8c, 0xb2, 0x4f, 0x5b, 0xf2, 0x60, 0x04, 0x77, 0x15, 0x58, 0xc7, 0x40, 0x3b, 0x61, 0xe4, 0x48, + 0xe6, 0x3f, 0xcb, 0xa5, 0x3b, 0x50, 0x58, 0x01, 0xa7, 0x9c, 0x1b, 0x6f, 0xc3, 0x48, 0xad, 0xd5, + 0xf2, 0x1f, 0x09, 0x2d, 0x21, 0xdd, 0x34, 0x71, 0xff, 0xf1, 0x15, 0xd6, 0x61, 0x28, 0xda, 0xd1, + 0x36, 0x03, 0x90, 0x79, 0x28, 0xd5, 0xb6, 0x1a, 0x4b, 0x4b, 0x0b, 0xeb, 0xeb, 0xcb, 0x22, 0x82, + 0xfa, 0x65, 0xd9, 0x3f, 0x9e, 0xe7, 0xda, 0x51, 0xd4, 0x1a, 0x10, 0x60, 0x99, 0xd0, 0x91, 0x77, + 0x01, 0x3e, 0xf0, 0xbd, 0xce, 0x03, 0x1a, 0xed, 0xf9, 0xae, 0x68, 0x3c, 0x33, 0x29, 0xc6, 0x3f, + 0xf2, 0xbd, 0x8e, 0xdd, 0x46, 0x30, 0xab, 0x7b, 0x82, 0x64, 0x29, 0xff, 0xb3, 0x9e, 0xae, 0xfb, + 0x11, 0xda, 0x30, 0x23, 0x49, 0x4f, 0x6f, 0xfb, 0x51, 0xfa, 0xdc, 0x46, 0xa2, 0x99, 0xbf, 0x9c, + 0x83, 0x49, 0xbe, 0x53, 0xe5, 0x02, 0xf3, 0xcc, 0x4e, 0xc6, 0xb7, 0xb5, 0xc9, 0x78, 0x49, 0x2e, + 0x0c, 0x4a, 0xd3, 0x86, 0x9a, 0x8a, 0x7b, 0x40, 0xfa, 0x69, 0x88, 0x25, 0xfd, 0x29, 0xc3, 0xcc, + 0xc2, 0x5b, 0xc9, 0x79, 0x74, 0x88, 0x44, 0x36, 0xaa, 0xc2, 0xd0, 0xd2, 0x78, 0x98, 0xbf, 0x94, + 0x83, 0x09, 0xc5, 0x9e, 0x7c, 0x66, 0x3b, 0xfe, 0x8b, 0x5a, 0xc7, 0xcb, 0x33, 0x08, 0xa5, 0x65, + 0x43, 0xf5, 0x7b, 0x0f, 0xa6, 0xfb, 0x48, 0xd2, 0x66, 0xb9, 0x31, 0x8c, 0x59, 0xfe, 0x5a, 0xff, + 0x81, 0x39, 0x8f, 0xb6, 0x8e, 0x0f, 0xcc, 0xd5, 0x13, 0xfa, 0x6f, 0xe7, 0xe0, 0x9c, 0xf8, 0x55, + 0xeb, 0xb9, 0x5e, 0x34, 0xef, 0x77, 0x76, 0xbc, 0xdd, 0x67, 0x76, 0x2c, 0x6a, 0xda, 0x58, 0x54, + 0xf5, 0xb1, 0x50, 0x1a, 0x38, 0x78, 0x48, 0xcc, 0x7f, 0x59, 0x84, 0x99, 0x41, 0x04, 0x6c, 0xdb, + 0xaf, 0xec, 0xaa, 0x70, 0xdb, 0x9f, 0xda, 0xb1, 0xf2, 0xfd, 0x54, 0x12, 0x20, 0x92, 0x1b, 0x22, + 0x40, 0x64, 0x19, 0x2a, 0xf8, 0xa9, 0x06, 0x0d, 0x59, 0x27, 0x84, 0x49, 0xa8, 0xe7, 0xd5, 0xa3, + 0xc3, 0xea, 0x15, 0x87, 0x95, 0xd9, 0xa1, 0x28, 0xb4, 0x7b, 0x81, 0xa7, 0xf0, 0xe8, 0xa3, 0x24, + 0xbf, 0x63, 0xc0, 0x24, 0x02, 0x17, 0x1f, 0xd2, 0x4e, 0x84, 0xcc, 0x0a, 0xe2, 0x90, 0x26, 0xbe, + 0x51, 0xd3, 0x88, 0x02, 0xaf, 0xb3, 0x8b, 0x8e, 0xa4, 0xb0, 0xbe, 0xcd, 0x7a, 0xe1, 0x4f, 0x0f, + 0xab, 0xef, 0x7c, 0x9c, 0x5b, 0x3a, 0x82, 0x55, 0xc8, 0x36, 0xf2, 0xbc, 0xa2, 0x14, 0x3f, 0x9b, + 0xaa, 0x66, 0xaa, 0x46, 0xe4, 0xc7, 0xe1, 0xe2, 0x62, 0xc7, 0xd9, 0x6e, 0xd1, 0x79, 0xbf, 0x13, + 0x79, 0x9d, 0x9e, 0xdf, 0x0b, 0xeb, 0x4e, 0x73, 0xbf, 0xd7, 0x0d, 0x85, 0xb3, 0x13, 0x5b, 0xde, + 0x8c, 0x0b, 0xed, 0x6d, 0x5e, 0xaa, 0xb0, 0x1c, 0xc4, 0x80, 0xdc, 0x83, 0x69, 0x5e, 0x54, 0xeb, + 0x45, 0x7e, 0xa3, 0xe9, 0xb4, 0xbc, 0xce, 0x2e, 0xfa, 0x40, 0x8b, 0xf5, 0xcb, 0x6c, 0x6f, 0xe9, + 0xf4, 0x22, 0xdf, 0x0e, 0x39, 0x5c, 0xe1, 0xd7, 0x4f, 0x44, 0x96, 0x60, 0xca, 0xa2, 0x8e, 0xfb, + 0xc0, 0x79, 0x3c, 0xef, 0x74, 0x9d, 0xa6, 0x17, 0x1d, 0xe0, 0xce, 0x2c, 0x5f, 0xaf, 0x1e, 0x1d, + 0x56, 0x9f, 0x0b, 0xa8, 0xe3, 0xda, 0x6d, 0xe7, 0xb1, 0xdd, 0x14, 0x85, 0x0a, 0xb3, 0x34, 0x5d, + 0xcc, 0xca, 0xeb, 0xc4, 0xac, 0x4a, 0x69, 0x56, 0x5e, 0x67, 0x30, 0xab, 0x84, 0x4e, 0xb2, 0x5a, + 0x77, 0x82, 0x5d, 0x1a, 0x71, 0x27, 0x21, 0x5c, 0x35, 0xae, 0x1b, 0x0a, 0xab, 0x08, 0xcb, 0x6c, + 0x74, 0x18, 0xa6, 0x59, 0x29, 0x74, 0x4c, 0xf2, 0xb6, 0x02, 0x2f, 0xa2, 0x6a, 0x0b, 0xc7, 0xb1, + 0x5a, 0xd8, 0xff, 0xe8, 0x26, 0x1d, 0xd4, 0xc4, 0x3e, 0xca, 0x84, 0x9b, 0xd2, 0xc8, 0x72, 0x1f, + 0xb7, 0xec, 0x56, 0xf6, 0x51, 0xc6, 0xdc, 0xd4, 0x76, 0x4e, 0x60, 0x3b, 0x15, 0x6e, 0x03, 0x1a, + 0xda, 0x47, 0x49, 0x56, 0x58, 0xa7, 0x45, 0xb4, 0xc3, 0x24, 0x5a, 0x38, 0x49, 0x27, 0xb1, 0x6a, + 0x2f, 0x89, 0x3d, 0x75, 0x25, 0x90, 0xc5, 0x76, 0x86, 0xcb, 0x34, 0x4d, 0xfc, 0x41, 0xa1, 0x38, + 0x52, 0x19, 0xb5, 0x2a, 0x5c, 0xe4, 0x23, 0x26, 0x38, 0xa8, 0x8b, 0xcd, 0xdf, 0xc8, 0xc1, 0x25, + 0xa9, 0x8e, 0x69, 0xf4, 0xc8, 0x0f, 0xf6, 0xbd, 0xce, 0xee, 0x33, 0xae, 0x55, 0xef, 0x68, 0x5a, + 0xf5, 0xa5, 0xd4, 0x0a, 0x97, 0x6a, 0xe5, 0x31, 0xaa, 0xf5, 0x4f, 0x46, 0xe0, 0xf9, 0x63, 0xa9, + 0xc8, 0x87, 0x6c, 0x15, 0xf4, 0x68, 0x27, 0x5a, 0x72, 0x5b, 0x94, 0x6d, 0xc3, 0xfc, 0x5e, 0x24, + 0x9c, 0xd9, 0x2f, 0x1e, 0x1d, 0x56, 0xcf, 0xf2, 0x8b, 0x26, 0xb6, 0xe7, 0xb6, 0xa8, 0x1d, 0xf1, + 0x62, 0x6d, 0x98, 0xfa, 0xa9, 0x19, 0xcb, 0xf8, 0xda, 0xdb, 0x52, 0x27, 0xa2, 0xc1, 0x43, 0x87, + 0xc7, 0xdb, 0x0b, 0x96, 0xfb, 0x94, 0x76, 0x6d, 0x87, 0x95, 0xda, 0x9e, 0x28, 0xd6, 0x59, 0xf6, + 0x51, 0x93, 0x3b, 0x0a, 0xcb, 0x79, 0xb6, 0x39, 0x78, 0xe0, 0x3c, 0x16, 0x16, 0x2f, 0xfa, 0x57, + 0x15, 0x96, 0x3c, 0xc6, 0xae, 0xed, 0x3c, 0xb6, 0xfa, 0x49, 0xc8, 0xd7, 0xe1, 0xbc, 0x50, 0xdc, + 0x4c, 0x89, 0x05, 0x7e, 0x4b, 0xb6, 0xb8, 0x80, 0xbc, 0x5e, 0x39, 0x3a, 0xac, 0x5e, 0x14, 0x6a, + 0xdf, 0x6e, 0x72, 0x8c, 0xcc, 0x56, 0x67, 0x73, 0x21, 0xeb, 0x6c, 0x21, 0x4b, 0x75, 0xc7, 0x03, + 0x1a, 0x86, 0xce, 0xae, 0xb4, 0x8e, 0xf9, 0x89, 0x92, 0xd2, 0x99, 0x76, 0x9b, 0x97, 0x5b, 0x03, + 0x29, 0xc9, 0x3d, 0x98, 0xdc, 0xa2, 0xdb, 0xea, 0xf8, 0x8c, 0xc6, 0x53, 0xbc, 0xf2, 0x88, 0x6e, + 0x0f, 0x1e, 0x9c, 0x14, 0x1d, 0xf1, 0x60, 0x7a, 0x2d, 0xf0, 0x1f, 0x1f, 0xb0, 0xad, 0x1e, 0xed, + 0xd0, 0x00, 0x83, 0xbb, 0xc6, 0xd0, 0x5d, 0x35, 0x93, 0x58, 0x96, 0x7a, 0x79, 0xfd, 0x33, 0x47, + 0x87, 0xd5, 0xe7, 0xbb, 0x0c, 0x6c, 0xb7, 0x04, 0xdc, 0x4e, 0xdd, 0x3a, 0xeb, 0xe7, 0x4a, 0x7e, + 0x12, 0xa6, 0x2c, 0xbf, 0x17, 0x79, 0x9d, 0xdd, 0x46, 0x14, 0x38, 0x11, 0xdd, 0xe5, 0x8a, 0x3c, + 0x89, 0x22, 0x4b, 0x95, 0x72, 0xc7, 0x74, 0xc0, 0x81, 0x76, 0x28, 0xa0, 0x9a, 0x26, 0xd5, 0x09, + 0xcc, 0x5f, 0xcb, 0xc1, 0x8c, 0x18, 0x06, 0x8b, 0x36, 0xfd, 0xc0, 0x7d, 0xf6, 0xa7, 0xfd, 0xa2, + 0x36, 0xed, 0x5f, 0x8c, 0x63, 0x94, 0xb2, 0x1a, 0x79, 0xcc, 0xac, 0xff, 0x7d, 0x03, 0xae, 0x1c, + 0x47, 0xc4, 0x7a, 0x27, 0x8e, 0xeb, 0x2b, 0xf5, 0xc5, 0xef, 0x75, 0xe1, 0x2c, 0x8e, 0x27, 0x3a, + 0x8e, 0xc3, 0x7b, 0x7e, 0x18, 0xa1, 0xf7, 0x2e, 0xa7, 0x05, 0x12, 0xd4, 0x7d, 0xbf, 0x85, 0x7a, + 0xbe, 0xfe, 0x1a, 0x53, 0xe7, 0x7f, 0x7a, 0x58, 0x05, 0x06, 0xe2, 0x91, 0x78, 0x6c, 0xcd, 0xe7, + 0x12, 0x83, 0x7e, 0xe9, 0xd0, 0xc6, 0xe8, 0x8f, 0x7d, 0x7a, 0x10, 0x5a, 0x59, 0xac, 0xd1, 0x43, + 0x53, 0xeb, 0x45, 0x7b, 0x6b, 0x01, 0xdd, 0xa1, 0x01, 0xed, 0x34, 0xe9, 0xa7, 0xcc, 0x43, 0xa3, + 0x37, 0x6e, 0xa8, 0xed, 0xc9, 0x5f, 0x8c, 0xc1, 0xb9, 0x2c, 0x32, 0xd6, 0x2f, 0x8a, 0x45, 0x9c, + 0xbe, 0xa2, 0xfc, 0xff, 0x1a, 0x50, 0x6e, 0xd0, 0xa6, 0xdf, 0x71, 0xef, 0x38, 0xcd, 0xc8, 0x97, + 0x21, 0x19, 0x36, 0xd7, 0x6c, 0x0c, 0x6e, 0xef, 0x60, 0x81, 0xe6, 0x19, 0xf8, 0xd2, 0x70, 0x86, + 0x68, 0xd3, 0xc7, 0x40, 0xd8, 0x88, 0xc9, 0x64, 0xf2, 0x09, 0x3c, 0xd5, 0xd0, 0x3e, 0x4a, 0xea, + 0x30, 0x31, 0xef, 0x77, 0x3a, 0x94, 0xfd, 0x50, 0xc2, 0x3a, 0x31, 0x10, 0xb3, 0x29, 0x0b, 0xd2, + 0x1e, 0x02, 0x9d, 0x84, 0xdc, 0x86, 0xfc, 0xc6, 0xdc, 0x1d, 0x31, 0x06, 0x32, 0x58, 0x6d, 0x63, + 0xee, 0x0e, 0xee, 0x75, 0x99, 0xfd, 0x30, 0xd1, 0x9b, 0xdb, 0x51, 0x7d, 0xa0, 0x1b, 0x73, 0x77, + 0xc8, 0x2a, 0x4c, 0x5b, 0xf4, 0x1b, 0x3d, 0x2f, 0xa0, 0x62, 0x02, 0x3c, 0xb8, 0x53, 0xc3, 0xb1, + 0x28, 0x72, 0x3d, 0x16, 0xf0, 0x42, 0x69, 0xdb, 0xdb, 0xed, 0x1d, 0xf5, 0x5a, 0x5e, 0x3f, 0x2d, + 0xf9, 0x59, 0x38, 0xbf, 0xe0, 0x85, 0xa2, 0xce, 0xdc, 0xf9, 0xe8, 0xe2, 0x39, 0xe4, 0xe8, 0x80, + 0xe9, 0xf0, 0x85, 0xcc, 0xe9, 0xf0, 0x19, 0x37, 0x66, 0x62, 0x73, 0xcf, 0xa6, 0x9b, 0x8e, 0x87, + 0xcd, 0xfe, 0x0e, 0xf9, 0x08, 0x26, 0xd1, 0xdb, 0x83, 0xfe, 0x58, 0x0c, 0x91, 0x1e, 0x1b, 0xf0, + 0xe5, 0xcf, 0x65, 0x7e, 0xf9, 0x32, 0x3a, 0x8f, 0x6c, 0xf4, 0xea, 0x62, 0x38, 0xb5, 0xb6, 0x47, + 0xd0, 0x38, 0x93, 0x0f, 0x60, 0x4a, 0x2c, 0x3a, 0xab, 0x3b, 0xeb, 0x7b, 0x74, 0xc1, 0x39, 0x10, + 0x41, 0x08, 0x68, 0xff, 0x89, 0x95, 0xca, 0xf6, 0x77, 0xec, 0x68, 0x8f, 0xda, 0xae, 0xa3, 0xa9, + 0xe7, 0x14, 0x21, 0xf9, 0x69, 0x18, 0x5f, 0xf6, 0xf1, 0xe0, 0x09, 0x55, 0x4d, 0x09, 0xf9, 0x7c, + 0x05, 0xaf, 0xe5, 0x72, 0x70, 0x6a, 0x11, 0xf9, 0xd1, 0x61, 0xf5, 0xed, 0xd3, 0x4a, 0xa1, 0xf2, + 0x01, 0x4b, 0xfd, 0x1a, 0x99, 0x87, 0xe2, 0x16, 0xdd, 0x66, 0xad, 0x4d, 0x5f, 0x29, 0x93, 0x60, + 0xae, 0x2f, 0x1e, 0x89, 0x5f, 0xea, 0xa9, 0x8e, 0xc4, 0x20, 0x01, 0x4c, 0x63, 0xff, 0xac, 0x39, + 0x61, 0xf8, 0xc8, 0x0f, 0xdc, 0x16, 0x0d, 0xe5, 0xf1, 0x48, 0x7f, 0xe7, 0xcf, 0x65, 0x76, 0xfe, + 0x15, 0xde, 0xf9, 0x5d, 0x85, 0x83, 0x2a, 0x6e, 0x7d, 0xec, 0xcd, 0x7f, 0x6e, 0xa0, 0xd4, 0x93, + 0x1b, 0x18, 0x7c, 0x16, 0x47, 0xb5, 0xe3, 0x6e, 0xd6, 0xe9, 0x76, 0xf5, 0xb8, 0x74, 0x8e, 0xc2, + 0xb6, 0xbe, 0x77, 0x9c, 0x26, 0x8d, 0xa4, 0x8f, 0x14, 0x91, 0x77, 0x10, 0xa2, 0x6e, 0x7d, 0x39, + 0x0e, 0xf9, 0x32, 0x9c, 0x5b, 0xa0, 0x0f, 0xbd, 0x26, 0xad, 0x45, 0x11, 0x0d, 0x79, 0x0f, 0xcf, + 0xd7, 0xf8, 0x61, 0x62, 0xa9, 0xfe, 0xd2, 0xd1, 0x61, 0xf5, 0xaa, 0x8b, 0xe5, 0xb6, 0x93, 0x20, + 0xd8, 0x4d, 0x47, 0xe5, 0x95, 0xc9, 0xc1, 0xfc, 0x1f, 0x46, 0xd2, 0xeb, 0xe4, 0x15, 0x28, 0x58, + 0x6b, 0x71, 0xfd, 0xf9, 0x39, 0x61, 0xaa, 0xfa, 0x88, 0x40, 0xbe, 0x0a, 0xe7, 0x15, 0x3e, 0xd8, + 0x23, 0xd4, 0x65, 0x15, 0xe2, 0x8d, 0x79, 0x19, 0x0f, 0x86, 0x94, 0x9a, 0x38, 0x1c, 0x23, 0x55, + 0xa3, 0x6c, 0x1e, 0xac, 0xb1, 0x4a, 0xc1, 0x02, 0xed, 0x78, 0x9c, 0xb7, 0xd2, 0x58, 0x95, 0xb7, + 0x8b, 0x08, 0xe9, 0xc6, 0x66, 0x71, 0xf8, 0xa0, 0x50, 0x2c, 0x54, 0x46, 0xcc, 0xbf, 0x34, 0x94, + 0x9c, 0x0a, 0xcf, 0xe8, 0x8a, 0xf5, 0xa6, 0xb6, 0x62, 0x9d, 0x13, 0xa4, 0x71, 0xab, 0x58, 0x59, + 0xa6, 0x95, 0x31, 0x05, 0x13, 0x1a, 0x12, 0x86, 0xd9, 0x6e, 0x84, 0x34, 0xe0, 0x3e, 0xc9, 0x4f, + 0x57, 0x98, 0x6d, 0xdc, 0xae, 0xa1, 0xa2, 0x27, 0xff, 0xcc, 0x80, 0xa9, 0x14, 0x05, 0xeb, 0x0d, + 0x06, 0x52, 0x7b, 0xa3, 0x17, 0xd2, 0xc0, 0x42, 0x28, 0x0f, 0xca, 0x5b, 0xd6, 0x83, 0xf2, 0x5a, + 0x16, 0x83, 0x91, 0x2f, 0xc1, 0xc8, 0x06, 0xee, 0x20, 0xf4, 0xb8, 0x8e, 0x98, 0x3f, 0x16, 0xf2, + 0x19, 0xd6, 0x63, 0xff, 0xaa, 0x0a, 0x02, 0xcb, 0x48, 0x03, 0xc6, 0xe6, 0x03, 0x8a, 0xd9, 0x13, + 0x0a, 0xc3, 0x1f, 0xc0, 0x35, 0x39, 0x49, 0xfa, 0x00, 0x4e, 0x70, 0x32, 0x7f, 0x35, 0x07, 0x24, + 0x69, 0x23, 0x6d, 0x06, 0x34, 0x0a, 0x9f, 0xd9, 0x41, 0x7f, 0x5f, 0x1b, 0xf4, 0xe7, 0xfb, 0x06, + 0x9d, 0x37, 0x6f, 0xa8, 0xb1, 0xff, 0x43, 0x03, 0x2e, 0x64, 0x13, 0x92, 0x17, 0x61, 0x74, 0x75, + 0x7d, 0x4d, 0x86, 0x06, 0x89, 0xa6, 0xf8, 0x5d, 0xb4, 0x8c, 0x2d, 0x51, 0x44, 0x5e, 0x87, 0xd1, + 0x0f, 0xad, 0x79, 0xb6, 0x64, 0x2a, 0xb7, 0x67, 0xbe, 0x11, 0xd8, 0x4d, 0x7d, 0xcb, 0x25, 0x90, + 0xd4, 0xb1, 0xcd, 0x3f, 0xb5, 0xb1, 0xfd, 0x76, 0x0e, 0xa6, 0x6a, 0xcd, 0x26, 0x0d, 0x43, 0x66, + 0x10, 0xd1, 0x30, 0x7a, 0x66, 0x07, 0x36, 0x3b, 0xe8, 0x47, 0x6b, 0xdb, 0x50, 0xa3, 0xfa, 0x47, + 0x06, 0x9c, 0x97, 0x54, 0x0f, 0x3d, 0xfa, 0x68, 0x7d, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x72, 0x87, + 0xbd, 0x07, 0x86, 0xab, 0xb4, 0xd7, 0x8a, 0x68, 0xa0, 0x3a, 0xa8, 0x77, 0x10, 0xa2, 0xad, 0xd2, + 0x08, 0x21, 0xb3, 0x30, 0x56, 0xeb, 0x76, 0x03, 0xff, 0x21, 0x9f, 0xf6, 0x13, 0xe2, 0x3c, 0x92, + 0x83, 0xb4, 0xf3, 0x4b, 0x0e, 0x62, 0xd5, 0x58, 0xa0, 0x1d, 0x1e, 0xd1, 0x3c, 0xc1, 0xab, 0xe1, + 0xd2, 0x8e, 0x6a, 0xa1, 0x61, 0xb9, 0xf9, 0xad, 0x02, 0x94, 0xd5, 0x86, 0x10, 0x13, 0x46, 0x79, + 0x78, 0x8a, 0x1a, 0x26, 0xe0, 0x20, 0xc4, 0x12, 0x25, 0x49, 0xd4, 0x4f, 0xee, 0xc4, 0xa8, 0x9f, + 0x2d, 0x98, 0x58, 0x0b, 0xfc, 0xae, 0x1f, 0x52, 0x97, 0x27, 0xc0, 0xe1, 0x5a, 0xeb, 0x6c, 0x1c, + 0x0a, 0xcb, 0xfb, 0x9c, 0x15, 0xf1, 0xed, 0x40, 0x57, 0x60, 0xdb, 0xe9, 0xf4, 0x38, 0x3a, 0x1f, + 0xee, 0xe0, 0x77, 0x42, 0x71, 0x5d, 0x20, 0x76, 0xf0, 0x33, 0x88, 0xee, 0xe0, 0x67, 0x10, 0x75, + 0x5a, 0x8c, 0x3c, 0xad, 0x69, 0x41, 0x7e, 0xd5, 0x80, 0xf1, 0x5a, 0xa7, 0x23, 0xa2, 0x7e, 0xe4, + 0x2d, 0xf2, 0xf3, 0x89, 0x93, 0x9f, 0x87, 0x85, 0x72, 0x1f, 0xff, 0xd7, 0x84, 0x8f, 0xff, 0xed, + 0x8f, 0xe5, 0xe3, 0x5f, 0x0f, 0x1c, 0x2f, 0x0a, 0xf1, 0x30, 0x37, 0xf9, 0xa0, 0x1a, 0xfa, 0xab, + 0xd4, 0x83, 0xbc, 0x0d, 0x95, 0x58, 0x1e, 0x97, 0x3a, 0x2e, 0x7d, 0x4c, 0x79, 0x90, 0xd4, 0x04, + 0xbf, 0x61, 0xa8, 0x1d, 0x5e, 0xa4, 0x11, 0xcd, 0x6f, 0x1b, 0x70, 0x41, 0x15, 0x88, 0x46, 0x6f, + 0xbb, 0xed, 0xe1, 0xf6, 0x87, 0xdc, 0x84, 0x92, 0x18, 0xaf, 0xd8, 0x90, 0xeb, 0xcf, 0x9a, 0x94, + 0xa0, 0x90, 0x45, 0x36, 0x44, 0x8c, 0x87, 0xf0, 0x15, 0x9c, 0x4d, 0x4d, 0x37, 0x56, 0x54, 0x9f, + 0x11, 0x9d, 0x5d, 0x09, 0xf0, 0xb7, 0x3e, 0x76, 0x0c, 0x62, 0xbe, 0x07, 0xd3, 0x7a, 0x2d, 0x1b, + 0x14, 0xaf, 0xa0, 0xc9, 0xa6, 0x19, 0xd9, 0x4d, 0x93, 0xe5, 0xe6, 0x16, 0x90, 0x3e, 0xfa, 0x10, + 0x0f, 0xaa, 0x68, 0x24, 0x0f, 0x52, 0xa5, 0xbb, 0xab, 0x0f, 0x31, 0xce, 0x1f, 0x36, 0xae, 0x76, + 0x37, 0x92, 0x9a, 0x7f, 0x0e, 0x70, 0x36, 0x43, 0x75, 0x9c, 0xb0, 0xb4, 0x57, 0xf5, 0xc9, 0x53, + 0x8a, 0x23, 0x02, 0xe4, 0x94, 0x79, 0x4f, 0xe6, 0x8a, 0x3a, 0x66, 0xaa, 0x1c, 0x97, 0x40, 0xea, + 0x93, 0x58, 0xde, 0xd5, 0xa0, 0x9d, 0x91, 0xa7, 0x16, 0xb4, 0x53, 0x87, 0x09, 0xd1, 0x2a, 0x31, + 0x95, 0x47, 0x13, 0xb7, 0x40, 0xc0, 0x0b, 0xec, 0xbe, 0x29, 0xad, 0x93, 0x70, 0x1e, 0xa1, 0xdf, + 0x7a, 0x48, 0x05, 0x8f, 0x31, 0x95, 0x07, 0x16, 0x64, 0xf2, 0x50, 0x48, 0xc8, 0x3f, 0x34, 0x80, + 0x08, 0x88, 0x3a, 0x9f, 0x8b, 0xc7, 0xcd, 0x67, 0xf7, 0xe9, 0xcc, 0xe7, 0xe7, 0x65, 0x1d, 0xb3, + 0xe7, 0x75, 0x46, 0xb5, 0xc8, 0xdf, 0x37, 0x60, 0x9a, 0x47, 0x8e, 0xa8, 0x95, 0x2d, 0x1d, 0x57, + 0xd9, 0xe6, 0xd3, 0xa9, 0xec, 0x95, 0x10, 0x3f, 0x3b, 0xa0, 0xae, 0xfd, 0x95, 0x22, 0x3f, 0x0e, + 0x10, 0xcf, 0x28, 0x19, 0xa1, 0x78, 0x25, 0x43, 0x0b, 0xc4, 0x48, 0xc9, 0x25, 0xcb, 0x28, 0xa6, + 0x53, 0x63, 0x7a, 0x12, 0x6e, 0xe4, 0x67, 0xe1, 0x1c, 0x9b, 0x2f, 0x31, 0x44, 0xc4, 0xb9, 0xcd, + 0x8c, 0xe3, 0x57, 0x3e, 0x3f, 0x78, 0x69, 0xbf, 0x99, 0x45, 0xc6, 0xef, 0x89, 0x24, 0xd7, 0xf8, + 0xa3, 0xb6, 0xba, 0xe5, 0xcb, 0xa2, 0xc0, 0x80, 0x56, 0xac, 0x7d, 0x38, 0x53, 0xc6, 0x6f, 0x66, + 0xea, 0xb7, 0x4b, 0x72, 0x2e, 0x70, 0xfd, 0x16, 0xea, 0x17, 0x3d, 0x10, 0x44, 0x3e, 0x04, 0xd2, + 0xe8, 0xed, 0xee, 0xd2, 0x30, 0xa2, 0x2e, 0x87, 0xd1, 0x20, 0x9c, 0x99, 0x40, 0xfd, 0x80, 0x6e, + 0xaa, 0x50, 0x96, 0xda, 0x81, 0x2c, 0x56, 0x85, 0xa4, 0x9f, 0x98, 0x50, 0x38, 0x27, 0x1a, 0xcd, + 0xa0, 0xf2, 0x66, 0x7d, 0x38, 0x33, 0xa9, 0x45, 0x11, 0x26, 0x25, 0xf5, 0x17, 0x64, 0x96, 0x34, + 0xe5, 0x7a, 0xbe, 0xb6, 0xed, 0xcd, 0x62, 0x77, 0x79, 0x1b, 0x2e, 0x0d, 0xec, 0xcd, 0x8c, 0xbb, + 0x22, 0xb3, 0xfa, 0x5d, 0x91, 0x4b, 0x83, 0xb4, 0x6e, 0xa8, 0xde, 0x17, 0xf9, 0x2d, 0x23, 0xa5, + 0x66, 0x85, 0x4d, 0xc4, 0xb3, 0xf7, 0x0d, 0x5a, 0x87, 0x72, 0x98, 0x47, 0x80, 0x2b, 0xe2, 0x5c, + 0x62, 0x8b, 0x31, 0x45, 0xac, 0x2a, 0x72, 0x54, 0xc9, 0x4f, 0xa8, 0x71, 0xcd, 0x7f, 0x62, 0x00, + 0xe1, 0x35, 0x9c, 0x77, 0xba, 0xce, 0xb6, 0xd7, 0xf2, 0x22, 0x8f, 0x86, 0xe4, 0x3e, 0x54, 0x04, + 0x0b, 0x67, 0xbb, 0x45, 0xd5, 0x30, 0x30, 0x71, 0x4e, 0x1c, 0x97, 0xd9, 0x69, 0xeb, 0xa9, 0x8f, + 0x70, 0x80, 0x8c, 0xe4, 0x9e, 0x40, 0x46, 0xcc, 0x1f, 0x1a, 0x70, 0xa9, 0xbf, 0xda, 0xe2, 0xcb, + 0x71, 0xe7, 0x19, 0x27, 0x74, 0x5e, 0x56, 0x2b, 0x73, 0xe8, 0x61, 0x7d, 0x6a, 0xad, 0xcc, 0x27, + 0x0e, 0xdb, 0xd3, 0xb7, 0xf2, 0x91, 0x9a, 0x87, 0x82, 0xbc, 0x9e, 0x15, 0xd0, 0xc3, 0x6f, 0xdd, + 0x70, 0xb0, 0x1e, 0xcb, 0x23, 0x77, 0x39, 0xb9, 0xcc, 0x5d, 0x8e, 0xbc, 0x40, 0x94, 0xcf, 0xba, + 0x40, 0x64, 0xfe, 0x62, 0x0e, 0xca, 0x6b, 0xad, 0xde, 0xae, 0xd7, 0x59, 0x70, 0x22, 0xe7, 0x99, + 0xdd, 0x32, 0xbd, 0xa5, 0x6d, 0x99, 0xe2, 0x88, 0xb3, 0xb8, 0x61, 0xc3, 0xa5, 0x70, 0x33, 0x60, + 0x2a, 0x21, 0xe1, 0xea, 0xe1, 0x1e, 0x14, 0xd8, 0x0f, 0x61, 0x81, 0x5d, 0xed, 0x63, 0x8c, 0x58, + 0x37, 0xe3, 0xff, 0xc4, 0x26, 0x46, 0x4f, 0x9c, 0x87, 0x1c, 0x2e, 0x7f, 0x81, 0xe7, 0xbd, 0x3a, + 0x7d, 0x8e, 0xce, 0x7f, 0x6c, 0x40, 0x25, 0xdd, 0x12, 0x72, 0x1f, 0xc6, 0x18, 0x27, 0x2f, 0xce, + 0xa1, 0xf5, 0xd2, 0x80, 0x36, 0xdf, 0x14, 0x68, 0xbc, 0x7a, 0xd8, 0xf9, 0x94, 0x43, 0x2c, 0xc9, + 0xe1, 0xb2, 0x05, 0x65, 0x15, 0x2b, 0xa3, 0x76, 0xaf, 0xe9, 0x3a, 0xf1, 0x42, 0x76, 0x3f, 0xa8, + 0xb5, 0xfe, 0x4d, 0xad, 0xd6, 0x42, 0x1b, 0x0e, 0x9b, 0x0c, 0x11, 0xaf, 0xdc, 0xf1, 0xe9, 0xa0, + 0xca, 0x99, 0xd4, 0xfa, 0xfa, 0x95, 0x3b, 0x0e, 0x63, 0x7b, 0x2d, 0xfe, 0x3d, 0x21, 0x67, 0xb8, + 0xd7, 0xea, 0x22, 0x44, 0xb5, 0xd7, 0x39, 0x8e, 0xf9, 0xb7, 0xf2, 0x70, 0x21, 0xa9, 0x1e, 0x4f, + 0x0d, 0xb9, 0xe6, 0x04, 0x4e, 0x3b, 0x3c, 0x61, 0x06, 0x5c, 0xef, 0xab, 0x1a, 0x5e, 0x29, 0x97, + 0x55, 0x53, 0x2a, 0x64, 0xa6, 0x2a, 0x84, 0x9b, 0x54, 0x5e, 0x21, 0x59, 0x0d, 0x72, 0x1f, 0xf2, + 0x0d, 0x1a, 0x89, 0x8b, 0xa7, 0xd7, 0xfa, 0x7a, 0x55, 0xad, 0xd7, 0xcd, 0x06, 0x8d, 0xf8, 0x20, + 0xf2, 0xd8, 0x7d, 0xaa, 0xc5, 0xd2, 0xb3, 0xed, 0xc6, 0x16, 0x8c, 0x2e, 0x3e, 0xee, 0xd2, 0x66, + 0x24, 0xee, 0x9b, 0xbe, 0x7a, 0x3c, 0x3f, 0x8e, 0xab, 0xdc, 0x6a, 0xa5, 0x08, 0x50, 0x3b, 0x8b, + 0xa3, 0x5c, 0x7e, 0x13, 0x8a, 0xf2, 0xe3, 0xa7, 0xba, 0x9d, 0xf9, 0x16, 0x8c, 0x2b, 0x1f, 0x39, + 0x95, 0xd0, 0xff, 0x95, 0x01, 0xa3, 0x4c, 0xdb, 0x6e, 0xbe, 0xf1, 0x8c, 0x6a, 0xa4, 0xdb, 0x9a, + 0x46, 0x9a, 0x56, 0xae, 0x11, 0xe1, 0xbc, 0x7c, 0xe3, 0x04, 0x5d, 0x74, 0x68, 0x00, 0x24, 0xc8, + 0xe4, 0x2e, 0x8c, 0x89, 0x7c, 0x31, 0x22, 0xef, 0xaa, 0x7a, 0x2f, 0x49, 0xe6, 0xa5, 0x8a, 0xad, + 0x38, 0xbf, 0x9b, 0x36, 0x7b, 0x25, 0x35, 0x59, 0x48, 0x62, 0xb7, 0xd5, 0x8b, 0xb0, 0x8c, 0xcd, + 0xbc, 0xdf, 0xe1, 0xf7, 0x54, 0x94, 0x0c, 0x57, 0x03, 0x82, 0xb8, 0x6b, 0xc2, 0x71, 0x93, 0x3f, + 0x8e, 0xc9, 0x05, 0xc1, 0x24, 0xdb, 0xa7, 0xf3, 0x3f, 0xc7, 0xf9, 0xcd, 0x0f, 0x59, 0xb1, 0x77, + 0xa1, 0x7c, 0xc7, 0x0f, 0x1e, 0x39, 0x81, 0x5b, 0xdb, 0xa5, 0x22, 0xea, 0xbe, 0x88, 0xa1, 0xf3, + 0x13, 0x3b, 0x1c, 0x6e, 0x3b, 0xac, 0xe0, 0x47, 0x87, 0xd5, 0x42, 0xdd, 0xf7, 0x5b, 0x96, 0x86, + 0x4e, 0x56, 0x61, 0xe2, 0x81, 0xf3, 0x58, 0x9c, 0x81, 0xae, 0xaf, 0x2f, 0x8b, 0xd8, 0x9d, 0x57, + 0x8f, 0x0e, 0xab, 0x97, 0xda, 0xce, 0xe3, 0xf8, 0xec, 0x74, 0x70, 0x78, 0xb9, 0x4e, 0x4f, 0x3c, + 0x98, 0x5c, 0xf3, 0x83, 0x48, 0x7c, 0x84, 0xd9, 0xec, 0xf9, 0x01, 0xa7, 0x68, 0xb3, 0x99, 0xa7, + 0x68, 0x97, 0xd8, 0x46, 0xc5, 0xde, 0x89, 0xc9, 0xb5, 0xeb, 0x8a, 0x1a, 0x63, 0xf2, 0x2e, 0x4c, + 0xcf, 0xd3, 0x20, 0xf2, 0x76, 0xbc, 0xa6, 0x13, 0xd1, 0x3b, 0x7e, 0xd0, 0x76, 0x22, 0xe1, 0x30, + 0x42, 0x87, 0x41, 0x93, 0x72, 0x4e, 0x6d, 0x27, 0xb2, 0xfa, 0x31, 0xc9, 0x57, 0xb3, 0xa2, 0xa1, + 0x46, 0xb0, 0xf9, 0xaf, 0x33, 0x6b, 0x24, 0x23, 0x1a, 0x6a, 0x40, 0x17, 0x64, 0xc4, 0x45, 0xed, + 0x1e, 0x77, 0x94, 0x5c, 0xac, 0xdf, 0x12, 0xc7, 0xda, 0x27, 0x1f, 0x15, 0xc7, 0xe3, 0x36, 0xe0, + 0xc8, 0x78, 0x0e, 0xf2, 0xf5, 0xb5, 0x3b, 0xe8, 0x02, 0x12, 0x47, 0xb7, 0xb4, 0xb3, 0xe7, 0x74, + 0x9a, 0x68, 0x44, 0x89, 0x78, 0x10, 0x55, 0xe1, 0xd5, 0xd7, 0xee, 0x10, 0x07, 0xce, 0xae, 0xd1, + 0xa0, 0xed, 0x45, 0x5f, 0xbe, 0x75, 0x4b, 0x19, 0xa8, 0x22, 0x56, 0x6d, 0x56, 0x54, 0xad, 0xda, + 0x45, 0x14, 0xfb, 0xf1, 0xad, 0x5b, 0x99, 0xc3, 0x11, 0x57, 0x2c, 0x8b, 0x17, 0x59, 0x84, 0xc9, + 0x07, 0xce, 0x63, 0x71, 0xc8, 0x1f, 0xef, 0x61, 0xf3, 0x78, 0xdb, 0x00, 0x05, 0xab, 0x99, 0x14, + 0xa9, 0x43, 0xac, 0x13, 0x91, 0x77, 0x60, 0x3c, 0x11, 0xaf, 0x10, 0x8f, 0x77, 0xf3, 0x3c, 0xcc, + 0x54, 0x11, 0x4e, 0xcd, 0x57, 0xa6, 0xa0, 0x93, 0x8d, 0xd8, 0x05, 0xc1, 0x2d, 0x61, 0x3c, 0xd0, + 0x2d, 0xd5, 0x67, 0x55, 0x17, 0x84, 0x83, 0x25, 0x5a, 0xb3, 0xa6, 0xe2, 0xbd, 0x01, 0x8f, 0x3e, + 0xb2, 0x74, 0x2e, 0x8a, 0x67, 0x63, 0x2d, 0xf0, 0xdb, 0xdd, 0x08, 0xa3, 0x30, 0x53, 0x9e, 0x8d, + 0x2e, 0x96, 0x64, 0x78, 0x36, 0x38, 0x49, 0x76, 0xec, 0xc2, 0xc4, 0x13, 0xc4, 0x2e, 0x50, 0x28, + 0x2c, 0xfb, 0xcd, 0x7d, 0x0c, 0xbb, 0x2c, 0xd5, 0x3f, 0x64, 0xfa, 0xa3, 0xe5, 0x37, 0xf7, 0x9f, + 0xde, 0x99, 0x3b, 0xb2, 0x27, 0x2b, 0xac, 0xed, 0x4c, 0xac, 0xc4, 0xa7, 0x67, 0xa6, 0xb4, 0x93, + 0x44, 0xad, 0x8c, 0x1b, 0x2a, 0x5c, 0x0a, 0x65, 0x43, 0x2c, 0x9d, 0x9c, 0x50, 0xa8, 0x2c, 0xd0, + 0x70, 0x3f, 0xf2, 0xbb, 0xf3, 0x2d, 0xaf, 0xbb, 0xed, 0x3b, 0x81, 0x3b, 0x53, 0x19, 0xa0, 0x30, + 0x5e, 0xc9, 0x54, 0x18, 0xd3, 0x2e, 0xa7, 0xb7, 0x9b, 0x92, 0x81, 0xd5, 0xc7, 0x92, 0x7c, 0x15, + 0x26, 0xd9, 0x6c, 0x59, 0x7c, 0x1c, 0xd1, 0x0e, 0x17, 0xa5, 0x69, 0x5c, 0xea, 0xcf, 0x29, 0x17, + 0x37, 0xe3, 0x42, 0x2e, 0xa4, 0xa8, 0x3d, 0x68, 0x4c, 0xa0, 0x0a, 0xa9, 0xce, 0x8a, 0xb8, 0x30, + 0xf3, 0xc0, 0x79, 0xac, 0xa4, 0x39, 0x52, 0xa4, 0x9e, 0xa0, 0xc4, 0x5e, 0x3f, 0x3a, 0xac, 0xbe, + 0xc4, 0x24, 0x76, 0x3f, 0x46, 0x1a, 0x30, 0x01, 0x06, 0x72, 0x32, 0x7f, 0x3c, 0xd5, 0xf3, 0x64, + 0x09, 0xc6, 0x44, 0x3b, 0xc5, 0xda, 0xd6, 0xdf, 0x63, 0xcf, 0x67, 0xf6, 0xd8, 0x98, 0xe8, 0x31, + 0x4b, 0xd2, 0x9b, 0xff, 0xca, 0x80, 0x09, 0xad, 0x51, 0xe4, 0x4d, 0x25, 0xf0, 0x28, 0x09, 0x18, + 0xd4, 0x70, 0x32, 0x5f, 0x4d, 0x78, 0x53, 0x44, 0x9b, 0xe5, 0x06, 0xd3, 0x65, 0xe6, 0x91, 0x3b, + 0x76, 0xb7, 0x95, 0xa4, 0x6b, 0x28, 0x0c, 0x48, 0xd7, 0xf0, 0x2b, 0x13, 0x30, 0xa9, 0x2f, 0xa3, + 0xcc, 0xae, 0x5d, 0xf6, 0x77, 0xbd, 0x8e, 0xdc, 0x96, 0xf3, 0x04, 0x24, 0x08, 0xd1, 0x9e, 0x20, + 0x40, 0x08, 0x79, 0x19, 0x20, 0x3e, 0xe0, 0x96, 0x3b, 0x6f, 0xf1, 0x60, 0x82, 0x52, 0x40, 0x7e, + 0x02, 0x60, 0xc5, 0x77, 0x69, 0x9c, 0xc3, 0xe6, 0x18, 0xb7, 0xdc, 0x2b, 0xc2, 0x2d, 0x27, 0x1e, + 0x39, 0x38, 0x3a, 0xac, 0x9e, 0xef, 0xf8, 0x2e, 0xed, 0x4f, 0x5e, 0xa3, 0x70, 0x24, 0x5f, 0x84, + 0x11, 0xab, 0xd7, 0xa2, 0x32, 0xa5, 0xca, 0xb8, 0x9c, 0x56, 0xbd, 0x96, 0x92, 0xfc, 0x34, 0xe8, + 0xa5, 0x4f, 0x63, 0x18, 0x80, 0xbc, 0x0f, 0xc0, 0x24, 0xe7, 0x6e, 0xe0, 0xf7, 0xba, 0xf2, 0xce, + 0x36, 0xee, 0xd2, 0x15, 0xa1, 0xdb, 0xc5, 0x42, 0xf5, 0xe3, 0x09, 0x09, 0x59, 0x85, 0x31, 0xa1, + 0xa4, 0xc4, 0x69, 0xc7, 0x0b, 0x59, 0x7e, 0x36, 0xc5, 0x52, 0x11, 0x39, 0x4e, 0x10, 0xac, 0xbb, + 0xbe, 0xb8, 0x97, 0xe1, 0x1d, 0x28, 0x31, 0xf6, 0x1b, 0x21, 0x15, 0x37, 0xb9, 0x4b, 0x3c, 0xf2, + 0x53, 0xa9, 0x50, 0x2f, 0xd4, 0x37, 0xf9, 0x09, 0x01, 0xf9, 0x2a, 0x66, 0x25, 0x12, 0x5d, 0x7d, + 0xac, 0xbb, 0xf6, 0x5a, 0x5f, 0x57, 0x9f, 0x73, 0xba, 0xdd, 0x8c, 0x34, 0x6e, 0x31, 0x3f, 0xb2, + 0x1b, 0xdf, 0x8e, 0x8a, 0x33, 0x60, 0x1f, 0xf3, 0x81, 0x1b, 0x7d, 0x1f, 0x98, 0x91, 0x17, 0x7e, + 0xfa, 0x73, 0x11, 0x69, 0x7c, 0x49, 0x17, 0x2a, 0xc9, 0x7c, 0x16, 0xdf, 0x82, 0xe3, 0xbe, 0xf5, + 0x7a, 0xdf, 0xb7, 0xd4, 0x01, 0xec, 0xfb, 0x5c, 0x1f, 0x77, 0xe2, 0x26, 0xd9, 0x8a, 0xc5, 0xf7, + 0xc6, 0x8f, 0xfb, 0xde, 0xcb, 0x7d, 0xdf, 0x3b, 0xeb, 0x6e, 0xf7, 0x7f, 0x27, 0xc5, 0x93, 0xbc, + 0x03, 0x13, 0x12, 0x82, 0xf3, 0x03, 0xdd, 0xa4, 0x62, 0x17, 0xe1, 0x6e, 0x63, 0xb8, 0x9f, 0x9e, + 0x88, 0x47, 0x45, 0x56, 0xa9, 0xb9, 0x74, 0x4c, 0x68, 0xd4, 0x69, 0xa9, 0xd0, 0x91, 0xc9, 0x57, + 0x60, 0x7c, 0xa9, 0xcd, 0x1a, 0xe2, 0x77, 0x9c, 0x88, 0xe2, 0x92, 0x97, 0xb8, 0x9e, 0x95, 0x12, + 0x45, 0x54, 0x79, 0xc6, 0xcf, 0xa4, 0x48, 0x35, 0x19, 0x14, 0x0a, 0xd6, 0x79, 0xdc, 0xbb, 0x24, + 0x64, 0x38, 0x14, 0x0b, 0xdc, 0xf3, 0x19, 0xee, 0x5f, 0x85, 0x3d, 0xae, 0x18, 0xdc, 0x69, 0x65, + 0x8b, 0x09, 0xa1, 0x75, 0x9e, 0xce, 0x93, 0xbc, 0x0b, 0xe3, 0xe2, 0x2e, 0x6a, 0xcd, 0x5a, 0x09, + 0x67, 0x2a, 0xd8, 0x78, 0xcc, 0xa2, 0x27, 0xaf, 0xad, 0xda, 0x4e, 0x90, 0x3a, 0x03, 0x4c, 0xf0, + 0xc9, 0x97, 0xe1, 0xdc, 0x96, 0xd7, 0x71, 0xfd, 0x47, 0xa1, 0x50, 0xe0, 0x42, 0xd1, 0x4d, 0x27, + 0x91, 0x4e, 0x8f, 0x78, 0xb9, 0x2d, 0x17, 0xc7, 0x3e, 0xc5, 0x97, 0xc9, 0x81, 0xfc, 0x4c, 0x1f, + 0x67, 0x2e, 0x41, 0xe4, 0x38, 0x09, 0x9a, 0xeb, 0x93, 0xa0, 0xfe, 0xcf, 0xa7, 0xc5, 0x29, 0xf3, + 0x33, 0xc4, 0x07, 0xa2, 0x5b, 0x36, 0x1f, 0xf8, 0x5e, 0x67, 0xe6, 0xac, 0xf6, 0xbe, 0x4c, 0x1c, + 0xec, 0x8c, 0x78, 0x6b, 0x7e, 0xcb, 0x6b, 0x1e, 0xd4, 0xcd, 0xa3, 0xc3, 0xea, 0x0b, 0x69, 0x9b, + 0xe9, 0x23, 0x5f, 0x73, 0x61, 0x64, 0xb0, 0x26, 0x5f, 0x81, 0x32, 0xfb, 0x1b, 0x1b, 0x98, 0xe7, + 0xb4, 0x03, 0x43, 0x05, 0x53, 0x7c, 0x07, 0xc7, 0x08, 0x2f, 0xcb, 0x66, 0xd8, 0x9e, 0x1a, 0x2b, + 0xf3, 0x87, 0x06, 0x9c, 0xcb, 0xaa, 0xeb, 0x09, 0x99, 0x89, 0xcc, 0x54, 0xe8, 0x00, 0x7a, 0x3f, + 0x78, 0xe8, 0x40, 0x1c, 0x30, 0x50, 0x85, 0x11, 0xb6, 0x23, 0x97, 0xa1, 0x6d, 0xb8, 0x1c, 0xb2, + 0x5d, 0x7b, 0x68, 0x71, 0x38, 0x43, 0xc0, 0x6b, 0x10, 0xb8, 0x5e, 0x8e, 0x70, 0x04, 0xbc, 0x2b, + 0x61, 0x71, 0x38, 0x43, 0x60, 0xcb, 0xae, 0x5c, 0x26, 0x10, 0x81, 0xad, 0xc6, 0xa1, 0xc5, 0xe1, + 0xe4, 0x1a, 0x8c, 0xad, 0x76, 0x96, 0xa9, 0xf3, 0x90, 0x8a, 0x73, 0x3b, 0xf4, 0xd6, 0xf8, 0x1d, + 0xbb, 0xc5, 0x60, 0x96, 0x2c, 0x34, 0xbf, 0x6b, 0xc0, 0x74, 0x5f, 0x37, 0x9d, 0x9c, 0x7c, 0xe9, + 0xf8, 0x43, 0xd2, 0x61, 0xda, 0xc7, 0xab, 0x5f, 0xc8, 0xae, 0xbe, 0xf9, 0xfb, 0x05, 0xb8, 0x38, + 0x60, 0xd5, 0x4a, 0x02, 0x1c, 0x8c, 0x13, 0x03, 0x1c, 0xbe, 0xc6, 0x56, 0x09, 0xc7, 0x6b, 0x87, + 0xeb, 0x7e, 0x52, 0xe3, 0xe4, 0x2c, 0x08, 0xcb, 0x64, 0x76, 0x13, 0x99, 0x89, 0xe3, 0x52, 0x13, + 0x29, 0xec, 0xc8, 0xef, 0x73, 0x89, 0xeb, 0xcc, 0xfa, 0x42, 0x0c, 0xf2, 0x7f, 0x4d, 0x42, 0x0c, + 0xf4, 0x83, 0xbd, 0xc2, 0x53, 0x3d, 0xd8, 0xcb, 0x3e, 0x03, 0x18, 0x79, 0x92, 0xd3, 0xb0, 0x79, + 0x98, 0x68, 0x50, 0x27, 0x68, 0xee, 0xd5, 0x42, 0x3e, 0x48, 0xa3, 0xc8, 0x0d, 0x55, 0x72, 0x88, + 0x05, 0xb6, 0x13, 0xf6, 0x8f, 0x85, 0x46, 0x63, 0xfe, 0xdb, 0x54, 0x64, 0xc4, 0x5f, 0x47, 0x79, + 0x79, 0x15, 0x46, 0xb6, 0xf6, 0x68, 0x20, 0x8d, 0x64, 0xac, 0xc8, 0x23, 0x06, 0x50, 0x2b, 0x82, + 0x18, 0xe6, 0x4f, 0x43, 0x59, 0xfd, 0x18, 0x2a, 0x04, 0xf6, 0x5b, 0xcc, 0x48, 0xae, 0x10, 0x18, + 0xc0, 0xe2, 0xf0, 0x13, 0x13, 0xa2, 0x25, 0xbd, 0x90, 0x3f, 0xa9, 0x17, 0xd8, 0xc7, 0x51, 0xde, + 0x94, 0x8f, 0xe3, 0x6f, 0xf5, 0xe3, 0x11, 0x03, 0x58, 0x1c, 0xfe, 0x54, 0x3f, 0xfe, 0x6f, 0x0c, + 0x28, 0x60, 0x32, 0x8a, 0x37, 0xa0, 0x24, 0x5d, 0xca, 0x6a, 0x82, 0x86, 0xb3, 0xd2, 0xe3, 0x1c, + 0xea, 0x71, 0x2d, 0x02, 0xc8, 0x3e, 0xb5, 0x49, 0x83, 0x6d, 0x2d, 0xfc, 0xe9, 0x21, 0x03, 0xa8, + 0x9f, 0x42, 0x8c, 0x53, 0x8c, 0x07, 0x86, 0x78, 0x89, 0x1d, 0x21, 0x57, 0x59, 0x3c, 0xc4, 0xab, + 0x6f, 0xfb, 0x27, 0xb1, 0xcc, 0x5f, 0x37, 0xe0, 0x7c, 0xa6, 0x25, 0xc3, 0xbe, 0xca, 0x4d, 0x26, + 0x45, 0x1c, 0xd3, 0xf6, 0x12, 0xc7, 0x38, 0x4d, 0x28, 0xd7, 0x29, 0x64, 0xeb, 0x33, 0x50, 0x8a, + 0x77, 0x98, 0xe4, 0x9c, 0x1c, 0x3a, 0xf4, 0x3b, 0xca, 0xed, 0xd8, 0x5f, 0x19, 0x30, 0xca, 0xaa, + 0xf0, 0xcc, 0xde, 0xec, 0xc9, 0xf6, 0x42, 0xb3, 0x26, 0x0d, 0x75, 0x9f, 0xe7, 0x77, 0x46, 0x01, + 0x12, 0x64, 0xb2, 0x0d, 0x93, 0xab, 0x4b, 0x0b, 0xf3, 0x4b, 0x2e, 0xed, 0x44, 0x78, 0x0c, 0x9b, + 0xca, 0xf0, 0xc0, 0xb6, 0xc6, 0x41, 0xc7, 0x69, 0x09, 0x84, 0x83, 0x44, 0x37, 0xf8, 0x9e, 0xdb, + 0xb4, 0xbd, 0x98, 0x4e, 0x35, 0x29, 0x75, 0x8e, 0xec, 0x1b, 0x8d, 0xda, 0x83, 0x65, 0xe5, 0x1b, + 0xb9, 0x21, 0xbf, 0x11, 0x3a, 0xed, 0xd6, 0x80, 0x6f, 0xe8, 0x1c, 0xc9, 0x1e, 0x54, 0xee, 0xe2, + 0xea, 0xa3, 0x7c, 0x25, 0x7f, 0xfc, 0x57, 0x5e, 0x14, 0x5f, 0x79, 0x8e, 0x2f, 0x5b, 0xd9, 0xdf, + 0xe9, 0xe3, 0x9a, 0x48, 0x6e, 0xe1, 0x44, 0xc9, 0xfd, 0xff, 0x0c, 0x18, 0xe5, 0xcb, 0x5b, 0xfc, + 0x48, 0x4c, 0xe6, 0x02, 0xba, 0xf5, 0x74, 0x16, 0xd0, 0x0a, 0x6a, 0x2e, 0xcd, 0x85, 0xc0, 0xcb, + 0xc8, 0x42, 0xea, 0xc5, 0x19, 0x79, 0xd4, 0x80, 0xa6, 0x35, 0x2f, 0x49, 0x02, 0xe2, 0xf8, 0x63, + 0x33, 0x2a, 0x17, 0x8e, 0xa1, 0xbe, 0x7f, 0x39, 0xf6, 0x84, 0xef, 0x5f, 0x2e, 0x43, 0x49, 0x44, + 0x78, 0xd5, 0x0f, 0xc4, 0x06, 0x5a, 0xba, 0x88, 0x62, 0xb8, 0x92, 0xf8, 0x9c, 0x83, 0xec, 0x6d, + 0x2d, 0x6d, 0x61, 0x8c, 0x48, 0x56, 0xa1, 0x94, 0x5c, 0x4b, 0x2a, 0x69, 0xe7, 0xc5, 0x31, 0x5c, + 0x84, 0x40, 0xf3, 0x9b, 0xaf, 0x99, 0xb7, 0x90, 0x12, 0x1e, 0xe6, 0xb7, 0x0c, 0xa8, 0xa4, 0xe5, + 0x85, 0xbc, 0x03, 0xe3, 0xf1, 0xcd, 0xb0, 0x38, 0x00, 0x04, 0x1d, 0xbe, 0xc9, 0x55, 0x32, 0x2d, + 0x14, 0x44, 0x45, 0x27, 0x73, 0x50, 0x64, 0xd3, 0x4e, 0xc9, 0x5b, 0x8d, 0xfa, 0xa4, 0x27, 0x60, + 0xea, 0xf9, 0xa7, 0xc4, 0x53, 0x66, 0xed, 0xbf, 0xcf, 0xc3, 0xb8, 0x32, 0x58, 0xe4, 0x55, 0x28, + 0x2e, 0x85, 0xcb, 0x7e, 0x73, 0x9f, 0xba, 0xe2, 0x58, 0x05, 0x9f, 0x37, 0xf5, 0x42, 0xbb, 0x85, + 0x40, 0x2b, 0x2e, 0x26, 0x75, 0x98, 0xe0, 0xff, 0xc9, 0x1b, 0xc0, 0xb9, 0xc4, 0x25, 0xcc, 0x91, + 0xe5, 0xdd, 0x5f, 0x75, 0x79, 0xd7, 0x48, 0xc8, 0xd7, 0x01, 0x38, 0x80, 0x8d, 0xef, 0x10, 0x01, + 0xde, 0x72, 0x02, 0x9f, 0x17, 0x1f, 0x88, 0x3c, 0xb5, 0x85, 0x28, 0x0a, 0x0a, 0x43, 0x7c, 0x5a, + 0xd1, 0x6f, 0xee, 0x0f, 0xff, 0xb8, 0x6a, 0xf2, 0xb4, 0xa2, 0xdf, 0xdc, 0xb7, 0xb3, 0xa3, 0xfd, + 0x54, 0x96, 0xe4, 0xdb, 0x06, 0x5c, 0xb6, 0x68, 0xd3, 0x7f, 0x48, 0x83, 0x83, 0x5a, 0x84, 0x58, + 0xea, 0x17, 0x4f, 0x0e, 0x2d, 0xbc, 0x2d, 0xbe, 0xf8, 0x4a, 0x20, 0xb8, 0xe0, 0xb5, 0xa4, 0x76, + 0x37, 0xb2, 0x8f, 0xa9, 0xc2, 0x31, 0x9f, 0x34, 0xff, 0xc4, 0x50, 0xa6, 0x00, 0x59, 0x81, 0x52, + 0x2c, 0x2c, 0xc2, 0x65, 0x1a, 0x5b, 0x66, 0x12, 0x6e, 0xd1, 0x9d, 0xfa, 0x73, 0xe2, 0x04, 0xe4, + 0x6c, 0x2c, 0x72, 0xda, 0x8c, 0x90, 0x40, 0xf2, 0x25, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0xe8, 0x4c, + 0x2e, 0x35, 0x05, 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x9f, 0x13, 0x61, 0x38, 0x79, 0x2d, 0x85, + 0x30, 0x03, 0xb1, 0x7a, 0xc4, 0x6b, 0x4c, 0x12, 0x60, 0xaa, 0x48, 0xeb, 0xdf, 0xc8, 0x41, 0x25, + 0x3d, 0xf1, 0xc8, 0xfb, 0x50, 0x96, 0x57, 0xcc, 0xee, 0x39, 0xe1, 0x9e, 0x48, 0x4b, 0x8a, 0xbb, + 0x56, 0x79, 0x2f, 0xcd, 0xde, 0x73, 0xb4, 0xf4, 0x75, 0x1a, 0x01, 0x5b, 0x90, 0xd7, 0xc5, 0xbd, + 0x05, 0x65, 0x02, 0x45, 0x7e, 0xd4, 0x4d, 0xa5, 0x25, 0x95, 0x68, 0xe4, 0x0d, 0xc8, 0xf3, 0x7b, + 0x97, 0x6a, 0x4e, 0xab, 0x07, 0x77, 0x6a, 0xfc, 0xda, 0x18, 0x3f, 0x74, 0xd7, 0x4f, 0x2f, 0x18, + 0x3e, 0x59, 0x56, 0x6e, 0xed, 0x8d, 0x6a, 0xb9, 0x7d, 0x24, 0x38, 0x6e, 0xdc, 0xc9, 0xd7, 0xf7, + 0x3e, 0x28, 0x14, 0xf3, 0x95, 0x82, 0xb8, 0xa7, 0xf5, 0x7b, 0x79, 0x28, 0xc5, 0xdf, 0x27, 0x04, + 0xd0, 0xde, 0x10, 0xa7, 0xe7, 0xf8, 0x3f, 0xb9, 0x04, 0x45, 0x69, 0x62, 0x88, 0x13, 0xf4, 0xb1, + 0x50, 0x98, 0x17, 0x33, 0x20, 0x6d, 0x09, 0x6e, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x05, 0xb1, 0xa1, + 0x30, 0xc8, 0xa2, 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xc7, 0xa4, 0x97, + 0xac, 0x9c, 0xe7, 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, 0xa1, 0xdb, + 0x22, 0xe3, 0xc6, 0x35, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0xbe, 0x73, 0xda, 0x0b, 0x87, + 0x7a, 0x1c, 0x35, 0xe1, 0x50, 0x64, 0x64, 0x1b, 0x21, 0x75, 0xc9, 0x2b, 0x50, 0x60, 0xa3, 0x29, + 0xd6, 0x83, 0x38, 0x53, 0xe1, 0xea, 0xfa, 0x1a, 0xef, 0xb0, 0x7b, 0x67, 0x2c, 0x44, 0x20, 0x2f, + 0x41, 0xbe, 0x37, 0xb7, 0x23, 0x34, 0x7d, 0x25, 0xb9, 0x92, 0x1b, 0xa3, 0xb1, 0x62, 0x72, 0x1b, + 0x8a, 0x8f, 0xf4, 0xcb, 0x97, 0xe7, 0x53, 0xc3, 0x18, 0xe3, 0xc7, 0x88, 0xf5, 0x22, 0x8c, 0xf2, + 0x6b, 0x87, 0xe6, 0x0b, 0x00, 0xc9, 0xa7, 0xfb, 0x03, 0x1d, 0xcc, 0xaf, 0x43, 0x29, 0xfe, 0x24, + 0x79, 0x1e, 0x60, 0x9f, 0x1e, 0xd8, 0x7b, 0x4e, 0xc7, 0x15, 0xcf, 0xea, 0x94, 0xad, 0xd2, 0x3e, + 0x3d, 0xb8, 0x87, 0x00, 0x72, 0x11, 0xc6, 0xba, 0x6c, 0x54, 0x65, 0x52, 0x5d, 0x6b, 0xb4, 0xdb, + 0xdb, 0x66, 0x12, 0x3a, 0x03, 0x63, 0xe8, 0xfc, 0x10, 0x13, 0x6d, 0xc2, 0x92, 0x3f, 0xcd, 0xdf, + 0xca, 0x61, 0xba, 0x05, 0xa5, 0x9e, 0xe4, 0x45, 0x98, 0x68, 0x06, 0x14, 0x97, 0x23, 0x87, 0x99, + 0x45, 0xe2, 0x3b, 0xe5, 0x04, 0xb8, 0xe4, 0x92, 0x6b, 0x30, 0x95, 0x64, 0xf9, 0xb5, 0x9b, 0xdb, + 0xe2, 0xea, 0x75, 0xd9, 0x9a, 0xe8, 0xca, 0x34, 0xbf, 0xf3, 0xdb, 0x78, 0x97, 0xa2, 0xa2, 0x5e, + 0x39, 0x8c, 0x64, 0xc6, 0xde, 0x92, 0x35, 0xa5, 0xc0, 0xf1, 0xe0, 0xe4, 0x02, 0x8c, 0x3a, 0xce, + 0x6e, 0xcf, 0xe3, 0x71, 0xdd, 0x65, 0x4b, 0xfc, 0x22, 0x9f, 0x85, 0xe9, 0xd0, 0xdb, 0xed, 0x38, + 0x51, 0x2f, 0x10, 0xf9, 0x2e, 0x68, 0x80, 0x22, 0x35, 0x61, 0x55, 0xe2, 0x82, 0x79, 0x0e, 0x27, + 0xaf, 0x03, 0x51, 0xbf, 0xe7, 0x6f, 0x7f, 0x44, 0x9b, 0x5c, 0xd4, 0xca, 0xd6, 0xb4, 0x52, 0xb2, + 0x8a, 0x05, 0xe4, 0x33, 0x50, 0x0e, 0x68, 0x88, 0x26, 0x19, 0x76, 0x1b, 0x66, 0xf1, 0xb1, 0xc6, + 0x25, 0xec, 0x3e, 0x3d, 0x30, 0xeb, 0x30, 0xdd, 0x37, 0x1f, 0xc9, 0xeb, 0xdc, 0xba, 0x17, 0xeb, + 0x73, 0x99, 0x6f, 0x66, 0x98, 0x92, 0x4a, 0x3d, 0x8d, 0xcd, 0x91, 0xcc, 0x0e, 0x94, 0x55, 0xfd, + 0x7a, 0xc2, 0xa5, 0xf6, 0x0b, 0x18, 0xf9, 0xc9, 0x95, 0xcf, 0xe8, 0xd1, 0x61, 0x35, 0xe7, 0xb9, + 0x18, 0xef, 0x79, 0x1d, 0x8a, 0xd2, 0x4a, 0x50, 0x9f, 0x80, 0x11, 0x06, 0xe5, 0x81, 0x15, 0x97, + 0x9a, 0xaf, 0xc0, 0x98, 0x50, 0xa1, 0xc7, 0x3b, 0xa2, 0xcc, 0x6f, 0xe6, 0x60, 0xca, 0xa2, 0x6c, + 0x82, 0x8b, 0xc7, 0x55, 0x3e, 0x65, 0xf9, 0x8e, 0xb5, 0xb6, 0x1d, 0x93, 0x43, 0xe2, 0x7b, 0x06, + 0x9c, 0xcd, 0xc0, 0xfd, 0x58, 0x09, 0xd2, 0xde, 0x84, 0xd2, 0x82, 0xe7, 0xb4, 0x6a, 0xae, 0x1b, + 0x47, 0xb0, 0xa2, 0x35, 0xe8, 0xb2, 0xe9, 0xe4, 0x30, 0xa8, 0xba, 0x98, 0xc6, 0xa8, 0xe4, 0x86, + 0x10, 0x8a, 0x24, 0x85, 0xa3, 0xcc, 0xa8, 0x0c, 0xbc, 0x4e, 0x49, 0x3e, 0x65, 0xbc, 0x8e, 0xc8, + 0x81, 0xc9, 0x01, 0xe9, 0x33, 0x3b, 0x74, 0xd9, 0xd7, 0x11, 0xd3, 0xcd, 0x1b, 0x6a, 0xdb, 0xf9, + 0xad, 0x1c, 0x5c, 0xc8, 0x26, 0xfc, 0xb8, 0xb9, 0xee, 0x30, 0x81, 0x87, 0x92, 0xb4, 0x1a, 0x73, + 0xdd, 0xf1, 0x6c, 0x1f, 0x88, 0x9f, 0x20, 0x90, 0x1d, 0x98, 0x58, 0x76, 0xc2, 0xe8, 0x1e, 0x75, + 0x82, 0x68, 0x9b, 0x3a, 0xd1, 0x10, 0x16, 0x6c, 0xfc, 0x00, 0x35, 0x2e, 0x6a, 0x7b, 0x92, 0x32, + 0xfd, 0x00, 0xb5, 0xc6, 0x36, 0x16, 0x94, 0xc2, 0x10, 0x82, 0xf2, 0x0d, 0x98, 0x6a, 0xd0, 0xb6, + 0xd3, 0xdd, 0xf3, 0x03, 0x2a, 0x7c, 0xe7, 0x37, 0x61, 0x22, 0x06, 0x65, 0x4a, 0x8b, 0x5e, 0xac, + 0xe1, 0x2b, 0x1d, 0x91, 0xa8, 0x12, 0xbd, 0xd8, 0xfc, 0x8d, 0x1c, 0x5c, 0xac, 0x35, 0xc5, 0x41, + 0x83, 0x28, 0x90, 0xe7, 0xa1, 0x9f, 0xf0, 0xb7, 0xc9, 0x2c, 0x94, 0x1e, 0x38, 0x8f, 0x97, 0x29, + 0x3e, 0x11, 0xcb, 0x33, 0x26, 0x71, 0xf3, 0xcb, 0x79, 0x6c, 0xc7, 0x6e, 0x2f, 0x2b, 0xc1, 0x51, + 0x37, 0x9b, 0x85, 0x27, 0xdc, 0x6c, 0x9a, 0x30, 0x7a, 0xcf, 0x6f, 0xb9, 0x62, 0x71, 0x12, 0xe7, + 0x16, 0x7b, 0x08, 0xb1, 0x44, 0x89, 0xf9, 0x43, 0x03, 0x26, 0xe3, 0x1a, 0x63, 0x15, 0x3e, 0xf1, + 0x2e, 0xb9, 0x06, 0x63, 0xf8, 0xa1, 0xf8, 0x81, 0x22, 0x5c, 0x34, 0x5a, 0x0c, 0x64, 0x7b, 0xae, + 0x25, 0x0b, 0xd5, 0x9e, 0x18, 0x79, 0xb2, 0x9e, 0x30, 0xff, 0x01, 0x1e, 0x89, 0xa8, 0xad, 0x64, + 0x2b, 0x91, 0x52, 0x11, 0x63, 0xc8, 0x8a, 0xe4, 0x9e, 0xda, 0x90, 0xe4, 0x07, 0x0e, 0xc9, 0x2f, + 0xe4, 0x60, 0x3c, 0xae, 0xec, 0xa7, 0xec, 0x1e, 0x7f, 0xdc, 0xae, 0xa1, 0xa2, 0xd8, 0x1b, 0x8a, + 0xae, 0x10, 0xc1, 0xe2, 0x5f, 0x82, 0x51, 0x31, 0x99, 0x8c, 0xd4, 0xb9, 0x60, 0x6a, 0x74, 0x93, + 0x47, 0x84, 0x71, 0x40, 0x43, 0x4b, 0xd0, 0xe1, 0x35, 0x81, 0x2d, 0xba, 0x2d, 0x4e, 0xc8, 0x9e, + 0xd9, 0x35, 0x2a, 0xfb, 0x9a, 0x40, 0xd2, 0xb0, 0xa1, 0x56, 0xa7, 0xbf, 0x53, 0x80, 0x4a, 0x9a, + 0xe4, 0xe4, 0x4c, 0x09, 0x6b, 0xbd, 0x6d, 0xf1, 0x46, 0x06, 0x66, 0x4a, 0xe8, 0xf6, 0xb6, 0x2d, + 0x06, 0x23, 0xd7, 0xa0, 0xb0, 0x16, 0x78, 0x0f, 0xb1, 0xd5, 0xe2, 0x89, 0x90, 0x6e, 0xe0, 0x3d, + 0x54, 0xe3, 0x65, 0x59, 0x39, 0x6e, 0x68, 0x97, 0x1b, 0xca, 0xfb, 0xed, 0x7c, 0x43, 0xdb, 0x0a, + 0xd3, 0x29, 0x79, 0x24, 0x1a, 0x5b, 0x2a, 0xeb, 0xd4, 0x09, 0xc4, 0xad, 0x7e, 0xa1, 0xce, 0x70, + 0xa9, 0xdc, 0x46, 0x30, 0xcf, 0xb7, 0x6b, 0xa9, 0x48, 0xa4, 0x05, 0x44, 0xf9, 0x29, 0x27, 0xf0, + 0xc9, 0x7b, 0x3c, 0xf9, 0xb4, 0xd5, 0x39, 0x95, 0xb5, 0xad, 0xce, 0xe6, 0x0c, 0xbe, 0x4f, 0xd3, + 0x47, 0xb8, 0x06, 0x25, 0x74, 0x79, 0xa1, 0x23, 0xa3, 0x78, 0x22, 0x33, 0x19, 0x9b, 0x0c, 0x18, + 0x4f, 0x60, 0xc7, 0xee, 0x8c, 0x84, 0x09, 0x79, 0x0f, 0xc6, 0xd5, 0x80, 0x5a, 0x1e, 0xf6, 0x79, + 0x85, 0x5f, 0xe1, 0x1a, 0x90, 0xba, 0x4e, 0x25, 0x30, 0x3f, 0xa7, 0x4a, 0x89, 0x58, 0xb4, 0x8f, + 0x95, 0x12, 0xf3, 0xd7, 0xd0, 0x8c, 0x6f, 0xfb, 0x11, 0x15, 0xd6, 0xcb, 0x33, 0xab, 0xc7, 0x12, + 0x17, 0xf2, 0x88, 0x16, 0xd3, 0xa2, 0xb5, 0xee, 0x14, 0x2f, 0x97, 0xff, 0xae, 0x01, 0xe7, 0x33, + 0x69, 0xc9, 0x4d, 0x80, 0xc4, 0x46, 0x14, 0xbd, 0xc4, 0x13, 0x19, 0xc7, 0x50, 0x4b, 0xc1, 0x20, + 0x5f, 0x4b, 0x5b, 0x77, 0x27, 0x2f, 0x4e, 0xf2, 0xb9, 0x8f, 0x49, 0xdd, 0xba, 0xcb, 0xb0, 0xe9, + 0xcc, 0xef, 0xe5, 0x61, 0xba, 0xef, 0x99, 0xc8, 0x13, 0xa2, 0x08, 0xf6, 0x53, 0x8f, 0x90, 0xf1, + 0xe3, 0x8e, 0x1b, 0x83, 0x1e, 0xa9, 0xcc, 0x78, 0x92, 0x0c, 0xdd, 0x62, 0x22, 0x87, 0xf6, 0x09, + 0x2f, 0x93, 0x85, 0xd9, 0xcf, 0xd7, 0x7d, 0x76, 0xe0, 0xd7, 0x9e, 0xc2, 0x33, 0x76, 0x7f, 0x8d, + 0x5f, 0xf9, 0xfa, 0xb5, 0x1c, 0x9c, 0xed, 0x6b, 0xf3, 0x33, 0x3b, 0xeb, 0xbe, 0xa4, 0xad, 0x6e, + 0x2f, 0x0c, 0x1a, 0xd3, 0xa1, 0xac, 0x88, 0xff, 0x6e, 0xc0, 0xc5, 0x01, 0x94, 0xe4, 0x20, 0x2d, + 0x44, 0xdc, 0xaa, 0xb8, 0x75, 0xfc, 0x07, 0x9f, 0x8a, 0x28, 0x7d, 0x62, 0x92, 0xf0, 0xcd, 0x1c, + 0xc0, 0x16, 0xdd, 0x7e, 0xb6, 0xd3, 0x40, 0x7d, 0x41, 0x13, 0x00, 0xc5, 0x81, 0x39, 0x7c, 0x16, + 0xa8, 0x55, 0x74, 0x24, 0x0e, 0x9f, 0x03, 0x2a, 0x7e, 0xd2, 0x24, 0x97, 0xfd, 0xa4, 0x89, 0xb9, + 0x0d, 0xe7, 0xee, 0xd2, 0x28, 0x59, 0x09, 0xe5, 0x1e, 0xf2, 0x78, 0xb6, 0xaf, 0x41, 0x49, 0xe0, + 0xeb, 0xe9, 0xe9, 0x65, 0x48, 0x9c, 0xe7, 0x5a, 0x09, 0x82, 0x49, 0xe1, 0xe2, 0x02, 0x6d, 0xd1, + 0x88, 0x7e, 0xb2, 0x9f, 0x69, 0x00, 0xe1, 0x4d, 0xe1, 0x2f, 0x5d, 0x0c, 0xf5, 0x85, 0x13, 0xfb, + 0x67, 0x13, 0xce, 0xc7, 0x75, 0x7f, 0x9a, 0x7c, 0x67, 0x99, 0x2d, 0x21, 0xee, 0x24, 0x26, 0x1c, + 0x8f, 0x71, 0x22, 0x3e, 0x86, 0xcb, 0x92, 0x60, 0xcb, 0x8b, 0x4f, 0x62, 0x86, 0xa2, 0x25, 0xef, + 0xc0, 0xb8, 0x42, 0x23, 0x6e, 0x56, 0xe3, 0x69, 0xe7, 0x23, 0x2f, 0xda, 0xb3, 0x43, 0x0e, 0x57, + 0x4f, 0x3b, 0x15, 0x74, 0xf3, 0xab, 0xf0, 0x5c, 0x1c, 0xb7, 0x92, 0xf1, 0xe9, 0x14, 0x73, 0xe3, + 0x74, 0xcc, 0x57, 0x92, 0x66, 0x2d, 0x75, 0xe2, 0x08, 0x78, 0xc9, 0x9b, 0xa8, 0xcd, 0x12, 0x8d, + 0xb9, 0xa2, 0xa4, 0xc7, 0x13, 0x6b, 0x51, 0x02, 0x30, 0xdf, 0x56, 0x2a, 0x9b, 0xc1, 0x50, 0x23, + 0x36, 0xd2, 0xc4, 0xdf, 0xcc, 0xc1, 0xd4, 0xea, 0xd2, 0xc2, 0x7c, 0xec, 0x46, 0xfe, 0x94, 0xe5, + 0xa8, 0xd2, 0xda, 0x36, 0x58, 0xdf, 0x98, 0x1b, 0x70, 0x36, 0xd5, 0x0d, 0xf8, 0x90, 0xcf, 0x7b, + 0x3c, 0xbe, 0x24, 0x06, 0xcb, 0x95, 0xe5, 0x42, 0x16, 0xfb, 0xcd, 0xdb, 0x56, 0x0a, 0xdb, 0xfc, + 0xde, 0x68, 0x8a, 0xaf, 0x50, 0x61, 0xaf, 0x41, 0x69, 0x29, 0x0c, 0x7b, 0x34, 0xd8, 0xb0, 0x96, + 0x55, 0x1b, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, 0x40, 0x5e, 0x85, 0xa2, 0xb8, 0x07, + 0x27, 0x75, 0x02, 0x1e, 0x97, 0xc7, 0xd7, 0xe8, 0xac, 0xb8, 0x98, 0xbc, 0x01, 0x65, 0xfe, 0x3f, + 0x97, 0x36, 0xd1, 0xe1, 0xe8, 0xab, 0x12, 0xe8, 0x5c, 0x3a, 0x2d, 0x0d, 0x8d, 0xed, 0xcc, 0xe4, + 0x4b, 0xa1, 0xac, 0x46, 0x85, 0x64, 0x67, 0x26, 0x1f, 0x15, 0xc5, 0x3a, 0xa9, 0x48, 0xe4, 0x06, + 0xe4, 0x6b, 0xf3, 0x96, 0x9a, 0x91, 0xdb, 0x69, 0x06, 0x3c, 0xa3, 0xbd, 0xf6, 0x18, 0x57, 0x6d, + 0xde, 0x22, 0x73, 0x50, 0xc4, 0xc7, 0x56, 0x5c, 0x1a, 0x88, 0xa8, 0x57, 0x94, 0x9a, 0xae, 0x80, + 0xa9, 0x27, 0x8f, 0x12, 0x8f, 0xcc, 0xc2, 0xd8, 0x82, 0x17, 0x76, 0x5b, 0xce, 0x81, 0x48, 0x4e, + 0x83, 0x87, 0x21, 0x2e, 0x07, 0xa9, 0x72, 0x26, 0xb0, 0xc8, 0xab, 0x30, 0xd2, 0x68, 0xfa, 0x5d, + 0xb6, 0xdb, 0x8a, 0x43, 0x5b, 0x42, 0x06, 0xd0, 0x52, 0x4f, 0x30, 0x00, 0x5e, 0xcd, 0xe6, 0x37, + 0xcc, 0x4a, 0xca, 0xd5, 0xec, 0xf4, 0xcd, 0x32, 0x81, 0xd3, 0x1f, 0x7c, 0x08, 0x4f, 0x33, 0xf8, + 0x70, 0x1b, 0x2e, 0xde, 0x45, 0x53, 0xbf, 0x41, 0x03, 0xcc, 0x07, 0xca, 0x1f, 0x6e, 0xda, 0xb0, + 0x96, 0xc4, 0xad, 0x3a, 0xbc, 0xe3, 0xc4, 0x77, 0x03, 0x76, 0xc8, 0x71, 0xe4, 0x9b, 0x4f, 0xa9, + 0xd7, 0x2a, 0x06, 0x31, 0x22, 0x5f, 0x86, 0x73, 0x59, 0x45, 0xe2, 0x7e, 0x1d, 0xc6, 0xb5, 0x67, + 0x7f, 0x40, 0x0d, 0x2c, 0xcf, 0xe2, 0x40, 0x96, 0xa1, 0xc2, 0xe1, 0x35, 0xb7, 0xed, 0x75, 0x16, + 0xdb, 0x8e, 0xd7, 0xc2, 0xdb, 0x76, 0xe2, 0xca, 0xa4, 0xe0, 0xea, 0xb0, 0x42, 0x9b, 0xb2, 0x52, + 0x2d, 0x3a, 0x29, 0x45, 0x89, 0xea, 0xa8, 0x51, 0x7b, 0xb0, 0x9c, 0xcc, 0xa9, 0x4f, 0xd7, 0xb9, + 0x91, 0xd6, 0xb6, 0x63, 0xce, 0x8d, 0x36, 0xe0, 0x6c, 0xaa, 0x1b, 0xa4, 0x3a, 0xd2, 0xc0, 0x69, + 0x75, 0x94, 0xa2, 0xb1, 0x52, 0xd8, 0xe6, 0x7f, 0x1c, 0x4d, 0xf1, 0x15, 0xbe, 0x22, 0x13, 0x46, + 0xb9, 0xb6, 0x51, 0xb3, 0xd7, 0x71, 0x5d, 0x64, 0x89, 0x12, 0x72, 0x09, 0xf2, 0x8d, 0xc6, 0xaa, + 0x9a, 0x5b, 0x33, 0x0c, 0x7d, 0x8b, 0xc1, 0xd8, 0x08, 0xa1, 0x1b, 0x48, 0xb9, 0x62, 0xd6, 0xa4, + 0x41, 0x24, 0x9e, 0x92, 0x7d, 0x39, 0x99, 0xc7, 0x85, 0xa4, 0xbf, 0xc5, 0x3c, 0x4e, 0x66, 0xef, + 0x3c, 0xcc, 0xd4, 0xc2, 0x90, 0x06, 0x11, 0x7f, 0x10, 0x20, 0xec, 0xb5, 0x69, 0x20, 0x64, 0x4d, + 0xe8, 0x18, 0xfe, 0x10, 0x7d, 0x33, 0xb4, 0x06, 0x22, 0x92, 0xeb, 0x50, 0xac, 0xf5, 0x5c, 0x8f, + 0x76, 0x9a, 0x5a, 0x74, 0xbd, 0x23, 0x60, 0x56, 0x5c, 0x4a, 0x3e, 0x84, 0xf3, 0x82, 0x48, 0x2a, + 0x1c, 0xd1, 0x03, 0x5c, 0xd7, 0xf0, 0x1d, 0xac, 0x98, 0x0b, 0x52, 0x4d, 0xd9, 0xa2, 0x4b, 0xb2, + 0x29, 0x49, 0x0d, 0x2a, 0x8b, 0x78, 0x4e, 0x2a, 0x1f, 0x94, 0xf6, 0x03, 0x91, 0xf8, 0x19, 0x35, + 0x17, 0x3f, 0x43, 0xb5, 0xdd, 0xb8, 0xd0, 0xea, 0x43, 0x27, 0xf7, 0xe1, 0x6c, 0x1a, 0xc6, 0xf4, + 0x71, 0x29, 0x79, 0xf0, 0xad, 0x8f, 0x0b, 0x2a, 0xe6, 0x2c, 0x2a, 0xb2, 0x0d, 0xd3, 0xb5, 0x28, + 0x0a, 0xbc, 0xed, 0x5e, 0x44, 0x53, 0xaa, 0x4b, 0x3a, 0x1a, 0xe3, 0x72, 0xa9, 0xbe, 0x9e, 0x13, + 0xc2, 0x78, 0xd6, 0x89, 0x29, 0x63, 0x15, 0x66, 0xf5, 0xb3, 0x23, 0x6e, 0xfc, 0x66, 0xa4, 0x78, + 0x57, 0x51, 0x5c, 0x89, 0x92, 0x0e, 0xdd, 0x5a, 0x78, 0xd0, 0x6e, 0xd3, 0x28, 0xc0, 0x93, 0x7b, + 0x7c, 0x77, 0xd1, 0x14, 0x31, 0x40, 0x97, 0x95, 0xa7, 0x52, 0xf1, 0x6d, 0x4d, 0x2d, 0x3c, 0x52, + 0xe3, 0xa9, 0x2d, 0x1f, 0xe5, 0x21, 0x97, 0x8f, 0x16, 0x4c, 0x2f, 0x76, 0x9a, 0xc1, 0x01, 0xde, + 0xcd, 0x94, 0x95, 0x9b, 0x38, 0xa1, 0x72, 0xf2, 0x51, 0x95, 0x2b, 0x8e, 0x94, 0xb0, 0xac, 0xea, + 0xf5, 0x33, 0x36, 0xff, 0x1f, 0xa8, 0xa4, 0xfb, 0xf2, 0x09, 0x1f, 0xca, 0x3e, 0x4d, 0x68, 0x36, + 0x1b, 0xe9, 0x74, 0x5b, 0xc8, 0xac, 0xf6, 0x1a, 0xb2, 0x91, 0xdc, 0xde, 0x57, 0xde, 0x2d, 0xd6, + 0xde, 0x40, 0x96, 0xd3, 0x38, 0x97, 0x35, 0x8d, 0xcd, 0x5f, 0xcc, 0xc1, 0x34, 0x8f, 0x26, 0x7d, + 0xf6, 0x6d, 0xc5, 0xf7, 0x34, 0xe5, 0x2c, 0x7d, 0x81, 0xa9, 0xd6, 0x1d, 0x63, 0x2d, 0x7e, 0x1d, + 0xce, 0xf7, 0x75, 0x05, 0x2a, 0xe8, 0x05, 0x19, 0xc7, 0xdb, 0xa7, 0xa2, 0x67, 0xb2, 0x3f, 0xb2, + 0x79, 0xdb, 0xea, 0xa3, 0x30, 0xff, 0x5e, 0xae, 0x8f, 0xbf, 0xb0, 0x1b, 0x55, 0x4b, 0xd0, 0x38, + 0x9d, 0x25, 0x98, 0xfb, 0x58, 0x96, 0x60, 0x7e, 0x18, 0x4b, 0xf0, 0x43, 0x98, 0x58, 0xa7, 0x0e, + 0xb3, 0x68, 0xc4, 0x75, 0xb9, 0x82, 0xf6, 0x52, 0x31, 0x2b, 0x93, 0xfa, 0x25, 0xbe, 0x6a, 0x1b, + 0x31, 0x02, 0xa6, 0x5a, 0xf8, 0xfd, 0x39, 0x4b, 0xe7, 0xa0, 0x2e, 0x1a, 0x23, 0x83, 0x17, 0x0d, + 0x33, 0x80, 0xf1, 0x46, 0x63, 0x75, 0xcb, 0x09, 0x98, 0xb6, 0x08, 0x99, 0xc9, 0x28, 0xc3, 0x44, + 0x8d, 0x44, 0xf1, 0xf6, 0xc7, 0x87, 0x4a, 0x2c, 0xa6, 0x58, 0x24, 0xb1, 0x08, 0xa9, 0xe0, 0x11, + 0x71, 0x02, 0xa6, 0x45, 0xc4, 0x09, 0x98, 0xf9, 0x77, 0x0b, 0x50, 0xe1, 0xa1, 0x8f, 0x6c, 0xdf, + 0x2b, 0x52, 0xf4, 0xf4, 0x3d, 0xd5, 0x60, 0x9c, 0xfe, 0xa9, 0x86, 0x8f, 0x11, 0x63, 0xab, 0xdc, + 0xc5, 0xce, 0x0f, 0x71, 0x17, 0xfb, 0x2d, 0xed, 0x22, 0x73, 0x21, 0x79, 0x0b, 0x74, 0xbf, 0xb7, + 0x4d, 0x8f, 0xbf, 0xc2, 0xfc, 0xa6, 0x7a, 0xe3, 0x78, 0x24, 0x89, 0x3e, 0x41, 0xca, 0x63, 0xee, + 0x1a, 0xc7, 0x5a, 0x6c, 0xf4, 0x34, 0xf1, 0xe6, 0x63, 0xff, 0x57, 0xe3, 0xcd, 0x17, 0x01, 0x94, + 0xbc, 0x2d, 0xc5, 0xe4, 0x49, 0xd0, 0x93, 0x73, 0xb6, 0x28, 0x84, 0xe6, 0x7f, 0x28, 0xc2, 0x74, + 0xa3, 0xb1, 0xba, 0xe0, 0x39, 0xbb, 0x1d, 0x3f, 0x8c, 0xbc, 0xe6, 0x52, 0x67, 0xc7, 0x67, 0x53, + 0x78, 0x9d, 0x86, 0xd1, 0x9d, 0x96, 0xff, 0x48, 0x8d, 0x7d, 0x8e, 0x68, 0x18, 0xd9, 0x3b, 0x2d, + 0xff, 0x91, 0x15, 0x17, 0xb3, 0x25, 0x62, 0x31, 0x08, 0xe2, 0xd7, 0x47, 0x70, 0x89, 0xa0, 0x0c, + 0x60, 0x71, 0x38, 0x9b, 0x25, 0x8d, 0x1e, 0x4f, 0xc0, 0xc1, 0x93, 0xbd, 0xe1, 0x2c, 0x09, 0x39, + 0xc8, 0x92, 0x65, 0x84, 0xf6, 0x0b, 0xac, 0xd0, 0x9a, 0x17, 0xb5, 0xa8, 0xf5, 0xa4, 0x58, 0x3c, + 0x63, 0x87, 0x50, 0x1c, 0x5d, 0xbb, 0x8b, 0x70, 0xd5, 0x78, 0xef, 0x9b, 0x03, 0x11, 0x9c, 0x67, + 0xc6, 0x65, 0xbf, 0xcd, 0x31, 0x72, 0xbc, 0xcd, 0xf1, 0xb2, 0xd0, 0x09, 0xcf, 0x67, 0xd8, 0x1c, + 0xea, 0xe3, 0x04, 0x99, 0xcc, 0xc9, 0x2f, 0x1a, 0xf0, 0x7c, 0x66, 0x49, 0x3c, 0xb1, 0xf5, 0x4b, + 0x03, 0x8a, 0xbe, 0xc0, 0x7c, 0x25, 0x9f, 0xc5, 0x5b, 0x1a, 0x19, 0x9f, 0xb6, 0x33, 0xb4, 0xc0, + 0xf1, 0x5f, 0x22, 0xff, 0xc2, 0x80, 0x8b, 0x1a, 0x06, 0x26, 0x3a, 0x6c, 0xd3, 0xce, 0x49, 0x22, + 0xfd, 0xd1, 0xd3, 0x11, 0xe9, 0x17, 0xf5, 0xb6, 0xf0, 0x64, 0xd0, 0xf8, 0x79, 0x75, 0x93, 0x38, + 0xa0, 0x86, 0xe4, 0x27, 0x61, 0x1a, 0x8b, 0xa4, 0xe9, 0xc3, 0xc4, 0x15, 0xa5, 0xbf, 0x5c, 0x9f, + 0xfb, 0xd3, 0xc3, 0xea, 0x84, 0x56, 0x80, 0x37, 0x0a, 0xf1, 0x6b, 0xb1, 0xa5, 0xe4, 0x75, 0x76, + 0x7c, 0x2d, 0xb1, 0x69, 0x9a, 0x19, 0xf9, 0xd7, 0x06, 0xcc, 0x30, 0x28, 0xaf, 0xf0, 0x9d, 0xc0, + 0x6f, 0xc7, 0xe5, 0x27, 0xe4, 0x09, 0x68, 0x3d, 0x9d, 0x0e, 0x7a, 0x19, 0xab, 0xcc, 0x27, 0xbe, + 0xbd, 0x13, 0xf8, 0xed, 0xa4, 0xfa, 0x5a, 0xae, 0x90, 0x41, 0x95, 0x24, 0x3f, 0x6f, 0xc0, 0x25, + 0x6d, 0x07, 0xa5, 0xde, 0xc7, 0x4b, 0xf9, 0x05, 0xd4, 0xa2, 0xfa, 0x4d, 0x21, 0xe4, 0xd7, 0xb0, + 0x06, 0xc9, 0x92, 0x80, 0x75, 0xb1, 0xdb, 0x1c, 0x4b, 0xa9, 0xc2, 0xe0, 0xaf, 0x98, 0xdf, 0xca, + 0xc1, 0xb8, 0xb2, 0xa6, 0x92, 0xcf, 0x43, 0x79, 0x35, 0xd8, 0x75, 0x3a, 0xde, 0x4f, 0x39, 0xca, + 0x99, 0x23, 0xae, 0xd9, 0xbe, 0x02, 0xb7, 0x34, 0x2c, 0x8c, 0x15, 0xa5, 0x4e, 0x5b, 0xb5, 0xf6, + 0xd8, 0x9a, 0x6c, 0x21, 0xf4, 0x94, 0xeb, 0xca, 0xfb, 0x19, 0xeb, 0xca, 0xa9, 0x12, 0x64, 0xbc, + 0xd3, 0xbf, 0xba, 0x0c, 0x9f, 0xcf, 0xc2, 0xfc, 0xe5, 0x1c, 0x54, 0xc4, 0x43, 0xf6, 0xf2, 0xc4, + 0xec, 0xd3, 0xf5, 0xf0, 0x95, 0xde, 0xb8, 0x63, 0x62, 0x42, 0x0a, 0xbf, 0xfe, 0xdb, 0x55, 0x7c, + 0x96, 0x3c, 0xdd, 0x1d, 0xf2, 0x59, 0x72, 0x1d, 0x9e, 0xbe, 0x2e, 0x97, 0xa6, 0xb2, 0xd2, 0xf8, + 0xe6, 0x1f, 0xe7, 0xd2, 0xbc, 0x85, 0x0b, 0xe1, 0x65, 0x18, 0xe3, 0xef, 0x90, 0xca, 0x1b, 0x3d, + 0x22, 0xb1, 0x23, 0x82, 0x2c, 0x59, 0x76, 0x9a, 0x8b, 0x93, 0x27, 0xbd, 0x4d, 0x4f, 0xde, 0x84, + 0x32, 0x06, 0x49, 0xd6, 0x5c, 0x37, 0x60, 0x4b, 0x60, 0x21, 0xc9, 0xe1, 0xf8, 0x88, 0x6e, 0xdb, + 0x3c, 0x98, 0xd2, 0x71, 0xdd, 0xc0, 0xd2, 0xf0, 0xc8, 0x3c, 0x9c, 0xd3, 0x62, 0x72, 0x25, 0xfd, + 0x48, 0xb2, 0x45, 0x8a, 0xb0, 0x80, 0x13, 0x67, 0x22, 0x63, 0x1a, 0x63, 0xbf, 0xc5, 0xd6, 0x30, + 0xb4, 0x6c, 0xf4, 0xfc, 0x77, 0x72, 0xd2, 0xcb, 0x83, 0x7a, 0x82, 0x89, 0x27, 0xda, 0x4e, 0x57, + 0xcb, 0xe5, 0xc2, 0x11, 0xcd, 0xbf, 0x30, 0xd8, 0x5c, 0x6b, 0xee, 0x7f, 0xca, 0xae, 0x74, 0xb2, + 0x26, 0x1d, 0xe3, 0xe1, 0xfa, 0x77, 0x06, 0xbf, 0x94, 0x25, 0xc4, 0xe7, 0x2d, 0x18, 0xe5, 0xaf, + 0x9e, 0x8a, 0xeb, 0x43, 0x2a, 0x17, 0x5e, 0x90, 0x04, 0x65, 0xf0, 0xb7, 0x53, 0x2d, 0x41, 0xa0, + 0x1a, 0xfd, 0xb9, 0xa1, 0x8c, 0x7e, 0x25, 0x29, 0xfb, 0x70, 0x8f, 0x7d, 0x18, 0x27, 0x27, 0x65, + 0x37, 0xff, 0x77, 0x8e, 0xb7, 0x47, 0x54, 0x6a, 0xd8, 0x34, 0xc0, 0xd7, 0xa0, 0x80, 0xef, 0xeb, + 0x2b, 0xb9, 0x96, 0x53, 0x6f, 0xeb, 0x63, 0x39, 0x9b, 0x37, 0xa8, 0x6b, 0xd5, 0x5b, 0xc4, 0xa8, + 0x8e, 0xd5, 0x79, 0x83, 0x18, 0xf8, 0x94, 0x86, 0xef, 0x52, 0x75, 0x3a, 0x74, 0xf4, 0x57, 0x4f, + 0xb0, 0x9c, 0x59, 0xf4, 0xf1, 0x65, 0x1e, 0xd5, 0x8b, 0xdf, 0xde, 0x71, 0x6c, 0x7e, 0x89, 0x44, + 0xd5, 0xb6, 0xc9, 0xbd, 0x9f, 0x45, 0x98, 0xd4, 0x53, 0x8c, 0x08, 0x4f, 0x1b, 0xa6, 0x05, 0x48, + 0xa5, 0x27, 0x51, 0x7d, 0x3a, 0x3a, 0x11, 0xdb, 0x31, 0x69, 0x79, 0x24, 0xd4, 0x0c, 0xf4, 0x3c, + 0x75, 0x9c, 0xdd, 0x9f, 0x00, 0x49, 0x27, 0x51, 0x4e, 0x89, 0x3f, 0x07, 0x15, 0x31, 0x33, 0xe3, + 0x0b, 0xdd, 0xe8, 0xcf, 0x58, 0x5a, 0xb0, 0xd4, 0xd9, 0xd4, 0xf4, 0xdc, 0xc0, 0x42, 0xa8, 0xf9, + 0x5d, 0x03, 0x2e, 0x89, 0xd7, 0x5c, 0x2d, 0x1a, 0x46, 0x81, 0xc7, 0xef, 0x87, 0xa3, 0x3c, 0x7e, + 0x9e, 0xbc, 0x23, 0xb3, 0x52, 0xea, 0x0a, 0x32, 0xfd, 0x8d, 0xfa, 0x84, 0x10, 0xca, 0x11, 0xcc, + 0x4b, 0x29, 0xb3, 0x51, 0xbe, 0x25, 0xb2, 0x51, 0xe6, 0x8e, 0x27, 0x8e, 0xe7, 0x85, 0x4b, 0x3b, + 0x32, 0x0b, 0xe5, 0x77, 0x72, 0x70, 0x3e, 0xa3, 0x5a, 0x9b, 0x9f, 0x7f, 0x46, 0x95, 0x43, 0x5d, + 0x53, 0x0e, 0x32, 0x5d, 0xf1, 0xc0, 0x8e, 0xcf, 0xd4, 0x15, 0xbf, 0x69, 0xc0, 0x45, 0x5d, 0x7a, + 0x84, 0x03, 0x76, 0xf3, 0x36, 0x79, 0x1b, 0x46, 0xef, 0x51, 0xc7, 0xa5, 0xf2, 0xde, 0xe1, 0xf9, + 0x54, 0x8e, 0x76, 0x5e, 0xc8, 0xd9, 0xfe, 0x31, 0x9f, 0xca, 0x67, 0x2c, 0x41, 0x42, 0x16, 0x44, + 0xe5, 0x78, 0x4c, 0x86, 0x29, 0xc3, 0x13, 0xb2, 0x3e, 0x75, 0x8c, 0x37, 0xe8, 0x77, 0x0d, 0x78, + 0xee, 0x18, 0x1a, 0x36, 0x70, 0x6c, 0xe8, 0xd5, 0x81, 0xc3, 0x85, 0x05, 0xa1, 0xe4, 0x3d, 0x98, + 0x5a, 0x17, 0xa6, 0xab, 0x1c, 0x0e, 0xe5, 0x69, 0x1b, 0x69, 0xd5, 0xda, 0x72, 0x5c, 0xd2, 0xc8, + 0xe4, 0x3a, 0x14, 0xef, 0xf9, 0x61, 0xd4, 0x49, 0x72, 0xbc, 0xa1, 0xcb, 0x7b, 0x4f, 0xc0, 0xac, + 0xb8, 0x94, 0x99, 0x05, 0x7a, 0x35, 0x45, 0x0c, 0xe0, 0x8b, 0x30, 0xca, 0x70, 0x62, 0x97, 0x12, + 0xca, 0x01, 0xbe, 0x35, 0xea, 0xb9, 0x96, 0x28, 0x8a, 0x9d, 0x99, 0xb9, 0xcc, 0xa3, 0xfa, 0x6f, + 0x19, 0x50, 0xd1, 0x79, 0x3f, 0xe9, 0xd0, 0xbc, 0xab, 0x0d, 0xcd, 0x73, 0xd9, 0x43, 0x33, 0x78, + 0x4c, 0xfa, 0xd2, 0x2d, 0x0d, 0x35, 0x16, 0x26, 0x8c, 0x2e, 0xf8, 0x6d, 0xc7, 0xeb, 0xa8, 0x29, + 0x82, 0x5c, 0x84, 0x58, 0xa2, 0x44, 0xe9, 0xad, 0xfc, 0xc0, 0xde, 0x32, 0x7f, 0xa5, 0x00, 0x97, + 0x2c, 0xba, 0xeb, 0x31, 0x03, 0x69, 0x23, 0xf4, 0x3a, 0xbb, 0x5a, 0x20, 0x85, 0x99, 0xea, 0x70, + 0x11, 0x3e, 0xce, 0x20, 0x71, 0x7f, 0xbf, 0x0a, 0x45, 0xa6, 0xa5, 0x95, 0x3e, 0x47, 0x37, 0x01, + 0x26, 0xba, 0xe3, 0xe3, 0x2a, 0x8b, 0xc9, 0x0d, 0xb1, 0x86, 0x28, 0x17, 0x7c, 0xd8, 0x1a, 0xf2, + 0xa3, 0xc3, 0x2a, 0xf0, 0xb7, 0x25, 0x58, 0xa9, 0x58, 0x47, 0x62, 0xa3, 0xaa, 0x30, 0xc0, 0xa8, + 0x7a, 0x00, 0xe7, 0x6a, 0x2e, 0xd7, 0x4f, 0x4e, 0x6b, 0x2d, 0xf0, 0x3a, 0x4d, 0xaf, 0xeb, 0xb4, + 0xa4, 0x51, 0x8e, 0xce, 0x22, 0x27, 0x2e, 0xb7, 0xbb, 0x31, 0x82, 0x95, 0x49, 0xc6, 0x9a, 0xb1, + 0xb0, 0xd2, 0xe0, 0x79, 0xcc, 0xb8, 0x07, 0x08, 0x9b, 0xe1, 0x76, 0x42, 0x9e, 0xc8, 0xcc, 0x8a, + 0x8b, 0xd1, 0x9c, 0xc3, 0x3b, 0x7e, 0xeb, 0xcb, 0x8d, 0xfb, 0xe2, 0xce, 0x9c, 0x8c, 0x3f, 0xe6, + 0x57, 0x02, 0xa3, 0x56, 0x88, 0x4e, 0x6b, 0x0d, 0x2f, 0xa1, 0x6b, 0x34, 0xee, 0x31, 0xba, 0x62, + 0x1f, 0x5d, 0x18, 0xee, 0xa9, 0x74, 0x1c, 0x8f, 0xcc, 0x02, 0xf0, 0x08, 0x4e, 0x14, 0x88, 0x52, + 0x62, 0xfc, 0x05, 0x08, 0xe5, 0xc6, 0x9f, 0x82, 0x42, 0xde, 0x81, 0xb3, 0x8b, 0xf3, 0x73, 0xf2, + 0x32, 0xdc, 0x82, 0xdf, 0xec, 0xb1, 0x7d, 0x33, 0x5e, 0xce, 0x2c, 0xf3, 0x31, 0xa4, 0xcd, 0x39, + 0x26, 0x05, 0x59, 0x68, 0xe2, 0x4a, 0x1c, 0xbf, 0x50, 0x3d, 0xef, 0xbb, 0x34, 0xdc, 0xbc, 0xf5, + 0x29, 0xbb, 0x12, 0xa7, 0xb4, 0x0d, 0x67, 0xdb, 0xad, 0xcc, 0x99, 0xf9, 0x37, 0xf1, 0x4a, 0x5c, + 0x1f, 0x2e, 0xf9, 0x31, 0x18, 0xc1, 0x9f, 0x62, 0xc5, 0x3d, 0x9b, 0xc1, 0x36, 0x59, 0x6d, 0x9b, + 0x3c, 0x25, 0x15, 0x12, 0x90, 0xa5, 0xe4, 0xe5, 0x9e, 0x53, 0x5c, 0xec, 0x10, 0x59, 0x19, 0xf4, + 0x27, 0xdb, 0x5c, 0x28, 0xab, 0x1f, 0x64, 0x32, 0x72, 0xcf, 0x09, 0xf7, 0xa8, 0x3b, 0x2f, 0x1f, + 0x7a, 0x2e, 0x73, 0x19, 0xd9, 0x43, 0x28, 0x3e, 0x27, 0x67, 0x29, 0x28, 0x4c, 0x3b, 0x2c, 0x85, + 0x1b, 0xa1, 0xa8, 0x8a, 0xd8, 0x05, 0x79, 0xb8, 0x7b, 0x75, 0x2d, 0x51, 0x84, 0xda, 0x52, 0xfa, + 0x09, 0x03, 0xa7, 0xb9, 0x4f, 0x83, 0xcd, 0x5b, 0x9f, 0x84, 0xb6, 0xd4, 0xbf, 0x71, 0xcc, 0x98, + 0x7c, 0x13, 0xe2, 0x8c, 0x6a, 0x1a, 0x32, 0xb3, 0x11, 0x93, 0x70, 0x34, 0x23, 0xb1, 0x11, 0x93, + 0x70, 0x34, 0xd5, 0x46, 0x8c, 0x51, 0xe3, 0xb4, 0xfa, 0xb9, 0x13, 0xd2, 0xea, 0x0f, 0x78, 0x42, + 0x44, 0xde, 0x64, 0xf8, 0x14, 0x3d, 0xda, 0xf4, 0x45, 0x28, 0xd7, 0xa2, 0xc8, 0x69, 0xee, 0x51, + 0x17, 0x9f, 0x6f, 0x50, 0xa2, 0x60, 0x1c, 0x01, 0x57, 0x63, 0xa4, 0x55, 0x5c, 0xe5, 0xd1, 0xb6, + 0xb1, 0x21, 0x1e, 0x6d, 0x9b, 0x85, 0xb1, 0xa5, 0xce, 0x43, 0x8f, 0xf5, 0x49, 0x31, 0xc9, 0x88, + 0xe4, 0x71, 0x90, 0xfe, 0xd2, 0x17, 0x82, 0xc8, 0x5b, 0x8a, 0x05, 0x51, 0x4a, 0x4c, 0x79, 0xbe, + 0xcd, 0xb2, 0xa5, 0x21, 0xa1, 0x1e, 0x3f, 0x48, 0x74, 0xf2, 0x26, 0x8c, 0xc9, 0xdd, 0x33, 0x24, + 0xe6, 0xbb, 0xa0, 0x74, 0x78, 0x89, 0x96, 0x84, 0x49, 0xec, 0x9e, 0xdf, 0xd1, 0x2f, 0x4d, 0x8e, + 0x2b, 0xc9, 0x48, 0x94, 0x4b, 0x93, 0x5a, 0x32, 0x12, 0xe5, 0xfa, 0x64, 0xbc, 0x19, 0x2a, 0x9f, + 0xb8, 0x19, 0xda, 0x84, 0xf2, 0x9a, 0x13, 0x44, 0x1e, 0x5b, 0x8e, 0x3a, 0x11, 0xcf, 0x86, 0x99, + 0xec, 0xd5, 0x95, 0xa2, 0xe4, 0x25, 0x9f, 0xae, 0x82, 0xaf, 0x67, 0x73, 0x48, 0xe0, 0x64, 0x25, + 0x23, 0xac, 0x5e, 0x64, 0x88, 0x46, 0xd7, 0xb9, 0x9a, 0x8e, 0x98, 0x97, 0xaa, 0x9e, 0xd1, 0xfe, + 0x88, 0xfc, 0xdb, 0x7c, 0x0c, 0x70, 0xcf, 0x38, 0x85, 0x6c, 0x30, 0xa5, 0x16, 0xda, 0x15, 0xa9, + 0x8d, 0x63, 0x8c, 0x48, 0xbe, 0x06, 0x65, 0xf6, 0x3f, 0xa6, 0x06, 0xf4, 0x28, 0xcf, 0x76, 0x99, + 0x84, 0x59, 0xeb, 0x13, 0x9a, 0xe7, 0x0f, 0x6c, 0xd0, 0x88, 0x4f, 0x60, 0x64, 0x9c, 0x76, 0xbc, + 0x68, 0xdc, 0xc8, 0xfb, 0x50, 0x56, 0x53, 0x8b, 0xce, 0x4c, 0x27, 0x81, 0x11, 0xae, 0x80, 0xa7, + 0x47, 0x49, 0x23, 0x60, 0xeb, 0x57, 0xad, 0xdb, 0x45, 0x5a, 0xa2, 0x48, 0x7b, 0xb7, 0x9b, 0x26, + 0x93, 0x68, 0xe4, 0x4b, 0x50, 0xae, 0x75, 0xbb, 0x89, 0xc6, 0x39, 0xab, 0x6c, 0x09, 0xbb, 0x5d, + 0x3b, 0x53, 0xeb, 0x68, 0x14, 0x4c, 0xb0, 0x84, 0xc1, 0x87, 0xdf, 0x3d, 0x97, 0x08, 0x96, 0x4c, + 0x98, 0x99, 0x16, 0x2c, 0x05, 0xdd, 0xfc, 0xa1, 0x01, 0x17, 0x07, 0x74, 0xdb, 0xd0, 0x2f, 0x54, + 0xce, 0x26, 0x6b, 0xb0, 0xe2, 0x8e, 0x10, 0x6b, 0xb0, 0xda, 0x68, 0xb9, 0x1a, 0x67, 0xa7, 0xe6, + 0xcc, 0x7f, 0x62, 0xa9, 0x39, 0xcd, 0x43, 0x03, 0xc6, 0x15, 0x61, 0x7e, 0x8a, 0x2f, 0x42, 0x5d, + 0x13, 0x39, 0xaa, 0xf3, 0x09, 0x5e, 0x3b, 0xe5, 0x7a, 0xc0, 0x9c, 0xd4, 0x5f, 0x07, 0x58, 0x76, + 0xc2, 0xa8, 0xd6, 0x8c, 0xbc, 0x87, 0x74, 0x08, 0xcd, 0x9d, 0x24, 0xe4, 0x71, 0x30, 0xb1, 0x3c, + 0x23, 0xeb, 0x4b, 0xc8, 0x13, 0x33, 0x34, 0x57, 0x60, 0xb4, 0xe1, 0x07, 0x51, 0xfd, 0x80, 0x2f, + 0xc7, 0x0b, 0x34, 0x6c, 0xaa, 0x4e, 0x49, 0x0f, 0xdd, 0x13, 0x4d, 0x4b, 0x14, 0x31, 0x9b, 0xf8, + 0x8e, 0x47, 0x5b, 0xae, 0x7a, 0xcc, 0xb6, 0xc3, 0x00, 0x16, 0x87, 0xdf, 0x78, 0x1f, 0xa6, 0xa4, + 0x60, 0xaf, 0x2f, 0x37, 0xb0, 0x05, 0x53, 0x30, 0xbe, 0xb9, 0x68, 0x2d, 0xdd, 0xf9, 0x8a, 0x7d, + 0x67, 0x63, 0x79, 0xb9, 0x72, 0x86, 0x4c, 0x40, 0x49, 0x00, 0xe6, 0x6b, 0x15, 0x83, 0x94, 0xa1, + 0xb8, 0xb4, 0xd2, 0x58, 0x9c, 0xdf, 0xb0, 0x16, 0x2b, 0xb9, 0x1b, 0x2f, 0xc3, 0x64, 0x12, 0x67, + 0x81, 0xb9, 0x18, 0xc6, 0x20, 0x6f, 0xd5, 0xb6, 0x2a, 0x67, 0x08, 0xc0, 0xe8, 0xda, 0xfd, 0xf9, + 0xc6, 0xad, 0x5b, 0x15, 0xe3, 0xc6, 0xe7, 0x60, 0x1a, 0x1d, 0x95, 0xcb, 0x6c, 0xdf, 0xd0, 0xa1, + 0x01, 0x7e, 0xa9, 0x0c, 0xc5, 0x06, 0xed, 0x3a, 0x81, 0x13, 0x51, 0xfe, 0x99, 0x07, 0xbd, 0x56, + 0xe4, 0x75, 0x5b, 0xf4, 0x71, 0xc5, 0xb8, 0xf1, 0x16, 0x4c, 0x59, 0x7e, 0x2f, 0xf2, 0x3a, 0xbb, + 0x32, 0xa5, 0x3e, 0x39, 0x0f, 0xd3, 0x1b, 0x2b, 0xb5, 0x07, 0xf5, 0xa5, 0xbb, 0x1b, 0xab, 0x1b, + 0x0d, 0xfb, 0x41, 0x6d, 0x7d, 0xfe, 0x5e, 0xe5, 0x0c, 0xab, 0xf0, 0x83, 0xd5, 0xc6, 0xba, 0x6d, + 0x2d, 0xce, 0x2f, 0xae, 0xac, 0x57, 0x8c, 0x1b, 0xbf, 0x64, 0xc0, 0xa4, 0xfe, 0xfa, 0x31, 0xb9, + 0x0a, 0x57, 0x36, 0x1a, 0x8b, 0x96, 0xbd, 0xbe, 0x7a, 0x7f, 0x71, 0xc5, 0xde, 0x68, 0xd4, 0xee, + 0x2e, 0xda, 0x1b, 0x2b, 0x8d, 0xb5, 0xc5, 0xf9, 0xa5, 0x3b, 0x4b, 0x8b, 0x0b, 0x95, 0x33, 0xa4, + 0x0a, 0xcf, 0x29, 0x18, 0xd6, 0xe2, 0xfc, 0xea, 0xe6, 0xa2, 0x65, 0xaf, 0xd5, 0x1a, 0x8d, 0xad, + 0x55, 0x6b, 0xa1, 0x62, 0x90, 0xcb, 0x70, 0x21, 0x03, 0xe1, 0xc1, 0x9d, 0x5a, 0x25, 0xd7, 0x57, + 0xb6, 0xb2, 0xb8, 0x55, 0x5b, 0xb6, 0xeb, 0xab, 0xeb, 0x95, 0xfc, 0x8d, 0xf7, 0x99, 0xe1, 0x95, + 0xbc, 0x1b, 0x46, 0x8a, 0x50, 0x58, 0x59, 0x5d, 0x59, 0xac, 0x9c, 0x21, 0xe3, 0x30, 0xb6, 0xb6, + 0xb8, 0xb2, 0xb0, 0xb4, 0x72, 0x97, 0x77, 0x6b, 0x6d, 0x6d, 0xcd, 0x5a, 0xdd, 0x5c, 0x5c, 0xa8, + 0xe4, 0x58, 0xdf, 0x2d, 0x2c, 0xae, 0xb0, 0x9a, 0xe5, 0x6f, 0x98, 0xfc, 0xc9, 0x0a, 0x2d, 0x17, + 0x3a, 0xeb, 0xad, 0xc5, 0x2f, 0xaf, 0x2f, 0xae, 0x34, 0x96, 0x56, 0x57, 0x2a, 0x67, 0x6e, 0x5c, + 0x49, 0xe1, 0xc8, 0x91, 0x68, 0x34, 0xee, 0x55, 0xce, 0xdc, 0xf8, 0x1a, 0x94, 0x55, 0xbb, 0x83, + 0x5c, 0x84, 0xb3, 0xea, 0xef, 0x35, 0xda, 0x71, 0xbd, 0xce, 0x6e, 0xe5, 0x4c, 0xba, 0xc0, 0xea, + 0x75, 0x3a, 0xac, 0x00, 0x1b, 0xaf, 0x16, 0xac, 0xd3, 0xa0, 0xed, 0x75, 0x98, 0x49, 0x51, 0xc9, + 0xd5, 0x2b, 0xdf, 0xff, 0xb3, 0x17, 0xce, 0x7c, 0xff, 0x07, 0x2f, 0x18, 0x7f, 0xfc, 0x83, 0x17, + 0x8c, 0xff, 0xfa, 0x83, 0x17, 0x8c, 0xed, 0x51, 0x14, 0xf4, 0xdb, 0xff, 0x27, 0x00, 0x00, 0xff, + 0xff, 0x11, 0x37, 0xc5, 0x3a, 0xb0, 0xc0, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -20946,6 +20958,42 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.DesktopName) > 0 { + i -= len(m.DesktopName) + copy(dAtA[i:], m.DesktopName) + i = encodeVarintTypes(dAtA, i, uint64(len(m.DesktopName))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa2 + } + if len(m.AppSessionID) > 0 { + i -= len(m.AppSessionID) + copy(dAtA[i:], m.AppSessionID) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppSessionID))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x9a + } + if len(m.AppName) > 0 { + i -= len(m.AppName) + copy(dAtA[i:], m.AppName) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AppName))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } + if len(m.DatabaseName) > 0 { + i -= len(m.DatabaseName) + copy(dAtA[i:], m.DatabaseName) + i = encodeVarintTypes(dAtA, i, uint64(len(m.DatabaseName))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } if len(m.HostPolicies) > 0 { for iNdEx := len(m.HostPolicies) - 1; iNdEx >= 0; iNdEx-- { { @@ -26164,6 +26212,22 @@ func (m *SessionTrackerSpecV1) Size() (n int) { n += 2 + l + sovTypes(uint64(l)) } } + l = len(m.DatabaseName) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } + l = len(m.AppName) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } + l = len(m.AppSessionID) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } + l = len(m.DesktopName) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -59376,6 +59440,134 @@ func (m *SessionTrackerSpecV1) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DatabaseName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppSessionID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppSessionID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DesktopName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DesktopName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/api/types/types.proto b/api/types/types.proto index 81a7a3dbe2629..cdf603c6515d1 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -3098,6 +3098,18 @@ message SessionTrackerSpecV1 { // creation. repeated SessionTrackerPolicySet HostPolicies = 16 [ (gogoproto.jsontag) = "host_roles,omitempty" ]; + + // DatabaseName is the database server this session belongs to. + string DatabaseName = 17 [ (gogoproto.jsontag) = "database_name,omitempty" ]; + + // AppName is the app server this session belongs to. + string AppName = 18 [ (gogoproto.jsontag) = "app_name,omitempty" ]; + + // AppSessionID is the unique ID of the app access certificate used to start this app session. + string AppSessionID = 19 [ (gogoproto.jsontag) = "app_session_id,omitempty" ]; + + // DesktopName is the windows desktop server this session belongs to. + string DesktopName = 20 [ (gogoproto.jsontag) = "desktop_name,omitempty" ]; } // SessionTrackerPolicySet is a set of RBAC policies held by the session tracker diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 424747b2b9f07..a1a9cf9d8b7d3 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -67,6 +67,7 @@ import ( "github.com/gravitational/teleport/lib/events" kubeutils "github.com/gravitational/teleport/lib/kube/utils" "github.com/gravitational/teleport/lib/limiter" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/local" "github.com/gravitational/teleport/lib/session" @@ -2930,8 +2931,17 @@ func (a *Server) GetApp(ctx context.Context, name string) (types.Application, er } // CreateSessionTracker creates a tracker resource for an active session. -func (a *Server) CreateSessionTracker(ctx context.Context, req *proto.CreateSessionTrackerRequest) (types.SessionTracker, error) { - return a.SessionTrackerService.CreateSessionTracker(ctx, req) +func (a *Server) CreateSessionTracker(ctx context.Context, tracker types.SessionTracker) (types.SessionTracker, error) { + // Don't allow sessions that require moderation without the enterprise feature enabled. + for _, policySet := range tracker.GetHostPolicySets() { + if len(policySet.RequireSessionJoin) != 0 { + if !modules.GetModules().Features().ModeratedSessions { + return nil, trace.AccessDenied("this Teleport cluster is not licensed for moderated sessions, please contact the cluster administrator") + } + } + } + + return a.SessionTrackerService.CreateSessionTracker(ctx, tracker) } // GetActiveSessionTrackers returns a list of active session trackers. diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 1288797ba8877..13a88266936a9 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -195,10 +195,24 @@ func (a *ServerWithRoles) actionForKindSSHSession(namespace, verb string, sid se return trace.Wrap(a.actionWithExtendedContext(namespace, types.KindSSHSession, verb, extendContext)) } -// hasBuiltinRole checks the type of the role set returned and the name. -// Returns true if role set is builtin and the name matches. -func (a *ServerWithRoles) hasBuiltinRole(name string) bool { - return HasBuiltinRole(a.context.Checker, name) +// serverAction returns an access denied error if the role is not one of the builtin server roles. +func (a *ServerWithRoles) serverAction() error { + role, ok := a.context.Identity.(BuiltinRole) + if !ok || !role.IsServer() { + return trace.AccessDenied("this request can be only executed by a teleport built-in server") + } + return nil +} + +// hasBuiltinRole checks that the attached checker is a BuiltinRoleSet +// and whether any of the given roles match the role set. +func (a *ServerWithRoles) hasBuiltinRole(roles ...types.SystemRole) bool { + for _, role := range roles { + if HasBuiltinRole(a.context.Checker, string(role)) { + return true + } + } + return false } // HasBuiltinRole checks the type of the role set returned and the name. @@ -240,18 +254,23 @@ func hasLocalUserRole(checker services.AccessChecker) bool { } // CreateSessionTracker creates a tracker resource for an active session. -func (a *ServerWithRoles) CreateSessionTracker(ctx context.Context, req *proto.CreateSessionTrackerRequest) (types.SessionTracker, error) { - if !a.hasBuiltinRole(string(types.RoleKube)) && !a.hasBuiltinRole(string(types.RoleNode)) && !a.hasBuiltinRole(string(types.RoleProxy)) { - return nil, trace.AccessDenied("this request can be only executed by a node, proxy or kube service") +func (a *ServerWithRoles) CreateSessionTracker(ctx context.Context, tracker types.SessionTracker) (types.SessionTracker, error) { + if err := a.serverAction(); err != nil { + return nil, trace.Wrap(err) } - return a.authServer.CreateSessionTracker(ctx, req) + tracker, err := a.authServer.CreateSessionTracker(ctx, tracker) + if err != nil { + return nil, trace.Wrap(err) + } + return tracker, nil + } // GetSessionTracker returns the current state of a session tracker for an active session. func (a *ServerWithRoles) GetSessionTracker(ctx context.Context, sessionID string) (types.SessionTracker, error) { - if !a.hasBuiltinRole(string(types.RoleKube)) && !a.hasBuiltinRole(string(types.RoleNode)) && !a.hasBuiltinRole(string(types.RoleProxy)) { - return nil, trace.AccessDenied("this request can be only executed by a node, proxy or kube service") + if err := a.serverAction(); err != nil { + return nil, trace.Wrap(err) } return a.authServer.GetSessionTracker(ctx, sessionID) @@ -316,8 +335,8 @@ func (a *ServerWithRoles) GetActiveSessionTrackers(ctx context.Context) ([]types // RemoveSessionTracker removes a tracker resource for an active session. func (a *ServerWithRoles) RemoveSessionTracker(ctx context.Context, sessionID string) error { - if !a.hasBuiltinRole(string(types.RoleKube)) && !a.hasBuiltinRole(string(types.RoleNode)) && !a.hasBuiltinRole(string(types.RoleProxy)) { - return trace.AccessDenied("this request can be only executed by a node, proxy or kube service") + if err := a.serverAction(); err != nil { + return trace.Wrap(err) } return a.authServer.RemoveSessionTracker(ctx, sessionID) @@ -325,8 +344,8 @@ func (a *ServerWithRoles) RemoveSessionTracker(ctx context.Context, sessionID st // UpdateSessionTracker updates a tracker resource for an active session. func (a *ServerWithRoles) UpdateSessionTracker(ctx context.Context, req *proto.UpdateSessionTrackerRequest) error { - if !a.hasBuiltinRole(string(types.RoleKube)) && !a.hasBuiltinRole(string(types.RoleNode)) && !a.hasBuiltinRole(string(types.RoleProxy)) { - return trace.AccessDenied("this request can be only executed by a node, proxy or kube service") + if err := a.serverAction(); err != nil { + return trace.Wrap(err) } return a.authServer.UpdateSessionTracker(ctx, req) @@ -337,7 +356,7 @@ func (a *ServerWithRoles) UpdateSessionTracker(ctx context.Context, req *proto.U func (a *ServerWithRoles) AuthenticateWebUser(req AuthenticateUserRequest) (types.WebSession, error) { // authentication request has it's own authentication, however this limits the requests // types to proxies to make it harder to break - if !a.hasBuiltinRole(string(types.RoleProxy)) { + if !a.hasBuiltinRole(types.RoleProxy) { return nil, trace.AccessDenied("this request can be only executed by a proxy") } return a.authServer.AuthenticateWebUser(req) @@ -348,7 +367,7 @@ func (a *ServerWithRoles) AuthenticateWebUser(req AuthenticateUserRequest) (type func (a *ServerWithRoles) AuthenticateSSHUser(req AuthenticateSSHRequest) (*SSHLoginResponse, error) { // authentication request has it's own authentication, however this limits the requests // types to proxies to make it harder to break - if !a.hasBuiltinRole(string(types.RoleProxy)) { + if !a.hasBuiltinRole(types.RoleProxy) { return nil, trace.AccessDenied("this request can be only executed by a proxy") } return a.authServer.AuthenticateSSHUser(req) @@ -599,7 +618,7 @@ func (a *ServerWithRoles) UpsertNode(ctx context.Context, s types.Server) (*type // // This logic has moved to KeepAliveServer. func (a *ServerWithRoles) KeepAliveNode(ctx context.Context, handle types.KeepAlive) error { - if !a.hasBuiltinRole(string(types.RoleNode)) { + if !a.hasBuiltinRole(types.RoleNode) { return trace.AccessDenied("[10] access denied") } clusterName, err := a.GetDomainName() @@ -635,7 +654,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if serverName != handle.Name { return trace.AccessDenied("access denied") } - if !a.hasBuiltinRole(string(types.RoleNode)) { + if !a.hasBuiltinRole(types.RoleNode) { return trace.AccessDenied("access denied") } if err := a.action(apidefaults.Namespace, types.KindNode, types.VerbUpdate); err != nil { @@ -651,7 +670,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep return trace.AccessDenied("access denied") } } - if !a.hasBuiltinRole(string(types.RoleApp)) { + if !a.hasBuiltinRole(types.RoleApp) { return trace.AccessDenied("access denied") } if err := a.action(apidefaults.Namespace, types.KindAppServer, types.VerbUpdate); err != nil { @@ -664,7 +683,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if serverName != handle.HostID { return trace.AccessDenied("access denied") } - if !a.hasBuiltinRole(string(types.RoleDatabase)) { + if !a.hasBuiltinRole(types.RoleDatabase) { return trace.AccessDenied("access denied") } if err := a.action(apidefaults.Namespace, types.KindDatabaseServer, types.VerbUpdate); err != nil { @@ -674,14 +693,14 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if serverName != handle.Name { return trace.AccessDenied("access denied") } - if !a.hasBuiltinRole(string(types.RoleWindowsDesktop)) { + if !a.hasBuiltinRole(types.RoleWindowsDesktop) { return trace.AccessDenied("access denied") } if err := a.action(apidefaults.Namespace, types.KindWindowsDesktopService, types.VerbUpdate); err != nil { return trace.Wrap(err) } case constants.KeepAliveKube: - if serverName != handle.Name || !a.hasBuiltinRole(string(types.RoleKube)) { + if serverName != handle.Name || !a.hasBuiltinRole(types.RoleKube) { return trace.AccessDenied("access denied") } if err := a.action(apidefaults.Namespace, types.KindKubeService, types.VerbUpdate); err != nil { @@ -763,9 +782,9 @@ func (a *ServerWithRoles) NewWatcher(ctx context.Context, watch types.Watch) (ty } } switch { - case a.hasBuiltinRole(string(types.RoleProxy)): + case a.hasBuiltinRole(types.RoleProxy): watch.QueueSize = defaults.ProxyQueueSize - case a.hasBuiltinRole(string(types.RoleNode)): + case a.hasBuiltinRole(types.RoleNode): watch.QueueSize = defaults.NodeQueueSize } return a.authServer.NewWatcher(ctx, watch) @@ -798,8 +817,7 @@ func (a *ServerWithRoles) checkAccessToNode(server types.Server) error { // In addition, allow proxy (and remote proxy) to access all nodes for its // smart resolution address resolution. Once the smart resolution logic is // moved to the auth server, this logic can be removed. - if a.hasBuiltinRole(string(types.RoleAdmin)) || - a.hasBuiltinRole(string(types.RoleProxy)) || + if a.hasBuiltinRole(types.RoleAdmin, types.RoleProxy) || a.hasRemoteBuiltinRole(string(types.RoleRemoteProxy)) { return nil } @@ -1585,7 +1603,7 @@ func (a *ServerWithRoles) SubmitAccessReview(ctx context.Context, params types.A // review author must match calling user, except in the case of the builtin admin role. we make this // exception in order to allow for convenient testing with local tctl connections. - if !a.hasBuiltinRole(string(types.RoleAdmin)) { + if !a.hasBuiltinRole(types.RoleAdmin) { if params.Review.Author != a.context.User.GetName() { return nil, trace.AccessDenied("user %q cannot submit reviews on behalf of %q", a.context.User.GetName(), params.Review.Author) } @@ -1711,7 +1729,7 @@ func (a *ServerWithRoles) GetUsers(withSecrets bool) ([]types.User, error) { if withSecrets { // TODO(fspmarshall): replace admin requirement with VerbReadWithSecrets once we've // migrated to that model. - if !a.hasBuiltinRole(string(types.RoleAdmin)) { + if !a.hasBuiltinRole(types.RoleAdmin) { err := trace.AccessDenied("user %q requested access to all users with secrets", a.context.User.GetName()) log.Warning(err) if err := a.authServer.emitter.EmitAuditEvent(a.authServer.closeCtx, &apievents.UserLogin{ @@ -1742,7 +1760,7 @@ func (a *ServerWithRoles) GetUser(name string, withSecrets bool) (types.User, er if withSecrets { // TODO(fspmarshall): replace admin requirement with VerbReadWithSecrets once we've // migrated to that model. - if !a.hasBuiltinRole(string(types.RoleAdmin)) { + if !a.hasBuiltinRole(types.RoleAdmin) { err := trace.AccessDenied("user %q requested access to user %q with secrets", a.context.User.GetName(), name) log.Warning(err) if err := a.authServer.emitter.EmitAuditEvent(a.authServer.closeCtx, &apievents.UserLogin{ @@ -1852,7 +1870,7 @@ func (a *ServerWithRoles) generateUserCerts(ctx context.Context, req proto.UserC // this prevents clients who have no chance at getting a cert and impersonating anyone // from enumerating local users and hitting database - if !a.hasBuiltinRole(string(types.RoleAdmin)) && !a.context.Checker.CanImpersonateSomeone() && req.Username != a.context.User.GetName() { + if !a.hasBuiltinRole(types.RoleAdmin) && !a.context.Checker.CanImpersonateSomeone() && req.Username != a.context.User.GetName() { return nil, trace.AccessDenied("access denied: impersonation is not allowed") } @@ -1973,7 +1991,7 @@ func (a *ServerWithRoles) generateUserCerts(ctx context.Context, req proto.UserC checker := services.NewRoleSet(parsedRoles...) switch { - case a.hasBuiltinRole(string(types.RoleAdmin)): + case a.hasBuiltinRole(types.RoleAdmin): // builtin admins can impersonate anyone // this is required for local tctl commands to work case req.Username == a.context.User.GetName(): @@ -2043,7 +2061,7 @@ func (a *ServerWithRoles) generateUserCerts(ctx context.Context, req proto.UserC ttl: req.Expires.Sub(a.authServer.GetClock().Now()), compatibility: req.Format, publicKey: req.PublicKey, - overrideRoleTTL: a.hasBuiltinRole(string(types.RoleAdmin)), + overrideRoleTTL: a.hasBuiltinRole(types.RoleAdmin), routeToCluster: req.RouteToCluster, kubernetesCluster: req.KubernetesCluster, dbService: req.RouteToDatabase.ServiceName, @@ -3215,7 +3233,7 @@ func (a *ServerWithRoles) DeleteSemaphore(ctx context.Context, filter types.Sema // signed certificate if successful. func (a *ServerWithRoles) ProcessKubeCSR(req KubeCSR) (*KubeCSRResponse, error) { // limits the requests types to proxies to make it harder to break - if !a.hasBuiltinRole(string(types.RoleProxy)) { + if !a.hasBuiltinRole(types.RoleProxy) { return nil, trace.AccessDenied("this request can be only executed by a proxy") } return a.authServer.ProcessKubeCSR(req) @@ -3272,7 +3290,7 @@ func (a *ServerWithRoles) DeleteAllDatabaseServers(ctx context.Context, namespac func (a *ServerWithRoles) SignDatabaseCSR(ctx context.Context, req *proto.DatabaseCSRRequest) (*proto.DatabaseCSRResponse, error) { // Only proxy is allowed to request this certificate when proxying // database client connection to a remote database service. - if !a.hasBuiltinRole(string(types.RoleProxy)) { + if !a.hasBuiltinRole(types.RoleProxy) { return nil, trace.AccessDenied("this request can only be executed by a proxy service") } return a.authServer.SignDatabaseCSR(ctx, req) @@ -3294,7 +3312,7 @@ func (a *ServerWithRoles) SignDatabaseCSR(ctx context.Context, req *proto.Databa func (a *ServerWithRoles) GenerateDatabaseCert(ctx context.Context, req *proto.DatabaseCertRequest) (*proto.DatabaseCertResponse, error) { // Check if this is a local cluster admin, or a datababase service, or a // user that is allowed to impersonate database service. - if !a.hasBuiltinRole(string(types.RoleDatabase)) && !a.hasBuiltinRole(string(types.RoleAdmin)) { + if !a.hasBuiltinRole(types.RoleDatabase, types.RoleAdmin) { if err := a.canImpersonateBuiltinRole(types.RoleDatabase); err != nil { log.WithError(err).Warnf("User %v tried to generate database certificate but is not allowed to impersonate %q system role.", a.context.User.GetName(), types.RoleDatabase) @@ -4259,9 +4277,7 @@ func (a *ServerWithRoles) DeleteAllWindowsDesktops(ctx context.Context) error { func (a *ServerWithRoles) filterWindowsDesktops(desktops []types.WindowsDesktop) ([]types.WindowsDesktop, error) { // For certain built-in roles allow full access - if a.hasBuiltinRole(string(types.RoleAdmin)) || - a.hasBuiltinRole(string(types.RoleProxy)) || - a.hasBuiltinRole(string(types.RoleWindowsDesktop)) { + if a.hasBuiltinRole(types.RoleAdmin, types.RoleProxy, types.RoleWindowsDesktop) { return desktops, nil } @@ -4288,7 +4304,7 @@ func (a *ServerWithRoles) checkAccessToWindowsDesktop(w types.WindowsDesktop) er // authentication. func (a *ServerWithRoles) GenerateWindowsDesktopCert(ctx context.Context, req *proto.WindowsDesktopCertRequest) (*proto.WindowsDesktopCertResponse, error) { // Only windows_desktop_service should be requesting Windows certificates. - if !a.hasBuiltinRole(string(types.RoleWindowsDesktop)) { + if !a.hasBuiltinRole(types.RoleWindowsDesktop) { return nil, trace.AccessDenied("access denied") } return a.authServer.GenerateWindowsDesktopCert(ctx, req) @@ -4350,7 +4366,7 @@ func (a *ServerWithRoles) GetAccountRecoveryCodes(ctx context.Context, req *prot // GenerateCertAuthorityCRL generates an empty CRL for a CA. func (a *ServerWithRoles) GenerateCertAuthorityCRL(ctx context.Context, caType types.CertAuthType) ([]byte, error) { // Only windows_desktop_service should be requesting CRLs - if !a.hasBuiltinRole(string(types.RoleWindowsDesktop)) { + if !a.hasBuiltinRole(types.RoleWindowsDesktop) { return nil, trace.AccessDenied("access denied") } crl, err := a.authServer.GenerateCertAuthorityCRL(ctx, caType) diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 8d70848b5640b..ccf9db9fec2ec 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -3622,17 +3622,43 @@ func (g *GRPCServer) CreateSessionTracker(ctx context.Context, req *proto.Create if err != nil { return nil, trace.Wrap(err) } - session, err := auth.ServerWithRoles.CreateSessionTracker(ctx, req) + + var createTracker types.SessionTracker = req.SessionTracker + // DELETE IN 11.0.0 + // Early v9 versions use a flattened out types.SessionTrackerV1 + if req.SessionTracker == nil { + spec := types.SessionTrackerSpecV1{ + SessionID: req.ID, + Kind: req.Type, + State: types.SessionState_SessionStatePending, + Reason: req.Reason, + Invited: req.Invited, + Hostname: req.Hostname, + Address: req.Address, + ClusterName: req.ClusterName, + Login: req.Login, + Participants: []types.Participant{*req.Initiator}, + Expires: req.Expires, + KubernetesCluster: req.KubernetesCluster, + HostUser: req.HostUser, + } + createTracker, err = types.NewSessionTracker(spec) + if err != nil { + return nil, trace.Wrap(err) + } + } + + tracker, err := auth.ServerWithRoles.CreateSessionTracker(ctx, createTracker) if err != nil { return nil, trace.Wrap(err) } - defined, ok := session.(*types.SessionTrackerV1) + v1, ok := tracker.(*types.SessionTrackerV1) if !ok { - return nil, trace.BadParameter("unexpected session type %T", session) + return nil, trace.BadParameter("unexpected session type %T", tracker) } - return defined, nil + return v1, nil } // GetSessionTracker returns the current state of a session tracker for an active session. diff --git a/lib/auth/moderated_sessions_test.go b/lib/auth/moderated_sessions_test.go index 0eb8fe0c58819..cc4b7e5acbedc 100644 --- a/lib/auth/moderated_sessions_test.go +++ b/lib/auth/moderated_sessions_test.go @@ -20,11 +20,12 @@ import ( "context" "testing" - "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services/local" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" ) @@ -35,17 +36,23 @@ func TestUnmoderatedSessionsAllowed(t *testing.T) { ModeratedSessions: false, // Explicily turn off moderated sessions. }}) + srv := &Server{ + clock: clockwork.NewRealClock(), + } + bk, err := memory.New(memory.Config{}) require.NoError(t, err) - srv, err := local.NewSessionTrackerService(bk) + srv.Services.SessionTrackerService, err = local.NewSessionTrackerService(bk) require.NoError(t, err) - tracker, err := srv.CreateSessionTracker(context.Background(), &proto.CreateSessionTrackerRequest{ - ID: "foo", - Initiator: &types.Participant{}, + tracker, err := types.NewSessionTracker(types.SessionTrackerSpecV1{ + SessionID: "foo", }) + require.NoError(t, err) + tracker.AddParticipant(types.Participant{}) + _, err = srv.CreateSessionTracker(context.Background(), tracker) require.NoError(t, err) require.NotNil(t, tracker) } @@ -57,15 +64,18 @@ func TestModeratedSessionsDisabled(t *testing.T) { ModeratedSessions: false, // Explicily turn off moderated sessions. }}) + srv := &Server{ + clock: clockwork.NewRealClock(), + } + bk, err := memory.New(memory.Config{}) require.NoError(t, err) - srv, err := local.NewSessionTrackerService(bk) + srv.Services.SessionTrackerService, err = local.NewSessionTrackerService(bk) require.NoError(t, err) - tracker, err := srv.CreateSessionTracker(context.Background(), &proto.CreateSessionTrackerRequest{ - ID: "foo", - Initiator: &types.Participant{}, + tracker, err := types.NewSessionTracker(types.SessionTrackerSpecV1{ + SessionID: "foo", HostPolicies: []*types.SessionTrackerPolicySet{ { Name: "foo", @@ -78,8 +88,12 @@ func TestModeratedSessionsDisabled(t *testing.T) { }, }, }) + require.NoError(t, err) + tracker.AddParticipant(types.Participant{}) + tracker, err = srv.CreateSessionTracker(context.Background(), tracker) require.Error(t, err) + require.True(t, trace.IsAccessDenied(err)) require.Nil(t, tracker) require.Contains(t, err.Error(), "this Teleport cluster is not licensed for moderated sessions, please contact the cluster administrator") } @@ -91,15 +105,18 @@ func TestModeratedSesssionsEnabled(t *testing.T) { ModeratedSessions: true, }}) + srv := &Server{ + clock: clockwork.NewRealClock(), + } + bk, err := memory.New(memory.Config{}) require.NoError(t, err) - srv, err := local.NewSessionTrackerService(bk) + srv.Services.SessionTrackerService, err = local.NewSessionTrackerService(bk) require.NoError(t, err) - tracker, err := srv.CreateSessionTracker(context.Background(), &proto.CreateSessionTrackerRequest{ - ID: "foo", - Initiator: &types.Participant{}, + tracker, err := types.NewSessionTracker(types.SessionTrackerSpecV1{ + SessionID: "foo", HostPolicies: []*types.SessionTrackerPolicySet{ { Name: "foo", @@ -112,7 +129,10 @@ func TestModeratedSesssionsEnabled(t *testing.T) { }, }, }) + require.NoError(t, err) + tracker.AddParticipant(types.Participant{}) + _, err = srv.CreateSessionTracker(context.Background(), tracker) require.NoError(t, err) require.NotNil(t, tracker) } diff --git a/lib/defaults/defaults.go b/lib/defaults/defaults.go index 1f63298b4ae3a..1a3367ae52601 100644 --- a/lib/defaults/defaults.go +++ b/lib/defaults/defaults.go @@ -282,16 +282,9 @@ const ( // no name is provided at connection time. DefaultRedisUsername = "default" - // SessionTrackerTTL defines the default base ttl of a session tracker. - SessionTrackerTTL = time.Hour - - // SessionTrackerExpirationUpdateInterval is the default interval on which an active - // session's expiration will be extended. - SessionTrackerExpirationUpdateInterval = SessionTrackerTTL / 6 - // AbandonedUploadPollingRate defines how often to check for // abandoned uploads which need to be completed. - AbandonedUploadPollingRate = SessionTrackerTTL / 6 + AbandonedUploadPollingRate = defaults.SessionTrackerTTL / 6 // UploadGracePeriod is a period after which non-completed // upload is considered abandoned and will be completed by the reconciler diff --git a/lib/events/complete.go b/lib/events/complete.go index 82b6c7129f468..18db3638f7c31 100644 --- a/lib/events/complete.go +++ b/lib/events/complete.go @@ -134,23 +134,13 @@ func (u *UploadCompleter) Serve(ctx context.Context) error { case <-u.closeC: return nil case <-ctx.Done(): - return trace.Wrap(ctx.Err(), "Context canceled") + return nil } } } // checkUploads fetches uploads and completes any abandoned uploads func (u *UploadCompleter) checkUploads(ctx context.Context) error { - trackers, err := u.cfg.SessionTracker.GetActiveSessionTrackers(ctx) - if err != nil { - return trace.Wrap(err) - } - - var activeSessionIDs []string - for _, st := range trackers { - activeSessionIDs = append(activeSessionIDs, st.GetSessionID()) - } - uploads, err := u.cfg.Uploader.ListUploads(ctx) if err != nil { return trace.Wrap(err) @@ -177,8 +167,10 @@ func (u *UploadCompleter) checkUploads(ctx context.Context) error { } } - if apiutils.SliceContainsStr(activeSessionIDs, upload.SessionID.String()) { + if _, err := u.cfg.SessionTracker.GetSessionTracker(ctx, upload.SessionID.String()); err == nil { continue + } else if !trace.IsNotFound(err) { + return trace.Wrap(err) } parts, err := u.cfg.Uploader.ListParts(ctx, upload) diff --git a/lib/events/complete_test.go b/lib/events/complete_test.go index 3aeb8f9c42c9e..01fa836ba9a11 100644 --- a/lib/events/complete_test.go +++ b/lib/events/complete_test.go @@ -233,7 +233,7 @@ func (m *mockSessionTrackerService) GetSessionTracker(ctx context.Context, sessi return nil, trace.NotFound("tracker not found") } -func (m *mockSessionTrackerService) CreateSessionTracker(ctx context.Context, req *proto.CreateSessionTrackerRequest) (types.SessionTracker, error) { +func (m *mockSessionTrackerService) CreateSessionTracker(ctx context.Context, st types.SessionTracker) (types.SessionTracker, error) { return nil, trace.NotImplemented("CreateSessionTracker is not implemented") } diff --git a/lib/kube/proxy/sess.go b/lib/kube/proxy/sess.go index c2238d7b5e1df..51018ce1207af 100644 --- a/lib/kube/proxy/sess.go +++ b/lib/kube/proxy/sess.go @@ -26,10 +26,7 @@ import ( "sync" "time" - "github.com/google/uuid" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/client/proto" - "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/auth" @@ -38,6 +35,8 @@ import ( tsession "github.com/gravitational/teleport/lib/session" "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/utils" + + "github.com/google/uuid" "github.com/gravitational/trace" "github.com/julienschmidt/httprouter" log "github.com/sirupsen/logrus" @@ -272,10 +271,7 @@ type session struct { terminalSizeQueue *multiResizeQueue - state types.SessionState - - // stateUpdate is used to notify listeners about state updates - stateUpdate *sync.Cond + tracker *srv.SessionTracker accessEvaluator auth.SessionAccessEvaluator @@ -336,7 +332,6 @@ func newSession(ctx authContext, forwarder *Forwarder, req *http.Request, params partiesHistorical: make(map[uuid.UUID]*party), log: log, io: io, - state: types.SessionState_SessionStatePending, accessEvaluator: accessEvaluator, emitter: events.NewDiscardEmitter(), terminalSizeQueue: newMultiResizeQueue(), @@ -346,7 +341,6 @@ func newSession(ctx authContext, forwarder *Forwarder, req *http.Request, params initiator: initiator.ID, expires: time.Now().UTC().Add(sessionMaxLifetime), PresenceEnabled: ctx.Identity.GetIdentity().MFAVerified != "", - stateUpdate: sync.NewCond(&sync.Mutex{}), displayParticipantRequirements: utils.AsBool(q.Get("displayParticipantRequirements")), } @@ -362,53 +356,20 @@ func newSession(ctx authContext, forwarder *Forwarder, req *http.Request, params } }() - err = s.trackerCreate(initiator, policySets) - if err != nil { + if err := s.trackSession(initiator, policySets); err != nil { return nil, trace.Wrap(err) } return s, nil } -// waitOnAccess puts the session in pending mode and waits for the session -// to fulfill the access requirements again. -func (s *session) waitOnAccess() { - s.io.Off() - s.BroadcastMessage("Session paused, Waiting for required participants...") - - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() - -outer: - for { - switch s.state { - case types.SessionState_SessionStatePending: - continue - case types.SessionState_SessionStateTerminated: - return - case types.SessionState_SessionStateRunning: - break outer - } - - s.stateUpdate.Wait() - } - - s.BroadcastMessage("Resuming session...") - s.io.On() -} - // checkPresence checks the presence timestamp of involved moderators // and kicks them if they are not active. func (s *session) checkPresence() error { s.mu.Lock() defer s.mu.Unlock() - sess, err := s.trackerGet() - if err != nil { - return trace.Wrap(err) - } - - for _, participant := range sess.GetParticipants() { + for _, participant := range s.tracker.GetParticipants() { if participant.ID == s.initiator.String() { continue } @@ -538,8 +499,7 @@ func (s *session) launch() error { } }() - err = s.trackerUpdateState(types.SessionState_SessionStateRunning) - if err != nil { + if err := s.tracker.UpdateState(s.forwarder.ctx, types.SessionState_SessionStateRunning); err != nil { s.log.Warn("Failed to set tracker state to running") } @@ -788,16 +748,18 @@ func (s *session) join(p *party) error { } } - s.stateUpdate.L.Lock() - state := s.state - s.stateUpdate.L.Unlock() - - if state == types.SessionState_SessionStateTerminated { + if s.tracker.GetState() == types.SessionState_SessionStateTerminated { return trace.AccessDenied("The requested session is not active") } - err := s.trackerAddParticipant(p) - if err != nil { + s.log.Debugf("Tracking participant: %s", p.ID) + participant := &types.Participant{ + ID: p.ID.String(), + User: p.Ctx.User.GetName(), + Mode: string(p.Mode), + LastActive: time.Now().UTC(), + } + if err := s.tracker.AddParticipant(s.forwarder.ctx, participant); err != nil { return trace.Wrap(err) } @@ -830,8 +792,7 @@ func (s *session) join(p *party) error { } recentWrites := s.io.GetRecentHistory() - _, err = p.Client.stdoutStream().Write(recentWrites) - if err != nil { + if _, err := p.Client.stdoutStream().Write(recentWrites); err != nil { s.log.Warnf("Failed to write history to client: %v.", err) } @@ -901,10 +862,7 @@ func (s *session) BroadcastMessage(format string, args ...interface{}) { // leave removes a party from the session. func (s *session) leave(id uuid.UUID) error { - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() - - if s.state == types.SessionState_SessionStateTerminated { + if s.tracker.GetState() == types.SessionState_SessionStateTerminated { return nil } @@ -945,7 +903,8 @@ func (s *session) leave(id uuid.UUID) error { s.forwarder.log.WithError(err).Warn("Failed to emit event.") } - err := s.trackerRemoveParticipant(party.ID.String()) + s.log.Debugf("No longer tracking participant: %v", party.ID) + err := s.tracker.RemoveParticipant(s.forwarder.ctx, party.ID.String()) if err != nil { return trace.Wrap(err) } @@ -975,21 +934,26 @@ func (s *session) leave(id uuid.UUID) error { if !canStart { if options.TerminateOnLeave { go func() { - err := s.Close() - if err != nil { + if err := s.Close(); err != nil { s.log.WithError(err).Errorf("Failed to close session") } }() - } else { - s.state = types.SessionState_SessionStatePending - s.stateUpdate.Broadcast() - err := s.trackerUpdateState(types.SessionState_SessionStateRunning) - if err != nil { - s.log.Warnf("Failed to set tracker state to %v", types.SessionState_SessionStateRunning) - } + return nil + } - go s.waitOnAccess() + // pause session and wait for another party to resume + s.io.Off() + s.BroadcastMessage("Session paused, Waiting for required participants...") + if err := s.tracker.UpdateState(s.forwarder.ctx, types.SessionState_SessionStatePending); err != nil { + s.log.Warnf("Failed to set tracker state to %v", types.SessionState_SessionStatePending) } + + go func() { + if state := s.tracker.WaitForStateUpdate(types.SessionState_SessionStatePending); state == types.SessionState_SessionStateRunning { + s.BroadcastMessage("Resuming session...") + s.io.On() + } + }() } return nil @@ -1037,21 +1001,17 @@ func (s *session) Close() error { s.closeOnce.Do(func() { s.BroadcastMessage("Closing session...") - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() - s.state = types.SessionState_SessionStateTerminated + s.io.Close() - s.stateUpdate.Broadcast() - err := s.trackerUpdateState(types.SessionState_SessionStateTerminated) - if err != nil { - s.log.Warnf("Failed to set tracker state to %v", types.SessionState_SessionStateTerminated) + + if err := s.tracker.Close(s.forwarder.ctx); err != nil { + s.log.WithError(err).Debug("Failed to close session tracker") } s.log.Debugf("Closing session %v.", s.id.String()) close(s.closeC) for id, party := range s.parties { - err = party.Close() - if err != nil { + if err := party.Close(); err != nil { s.log.WithError(err).Errorf("Failed to disconnect party %v", id.String()) } } @@ -1079,85 +1039,40 @@ func getRolesByName(forwarder *Forwarder, roleNames []string) ([]types.Role, err return roles, nil } -func (s *session) trackerGet() (types.SessionTracker, error) { - sess, err := s.forwarder.cfg.AuthClient.GetSessionTracker(s.forwarder.ctx, s.id.String()) - if err != nil { - return nil, trace.Wrap(err) - } - - return sess, nil -} - -func (s *session) trackerCreate(p *party, policySets []*types.SessionTrackerPolicySet) error { - initiator := &types.Participant{ - ID: p.ID.String(), - User: p.Ctx.User.GetName(), - LastActive: time.Now().UTC(), - } - - req := &proto.CreateSessionTrackerRequest{ - ID: s.id.String(), - Namespace: defaults.Namespace, - Type: string(types.KubernetesSessionKind), - Hostname: s.podName, - ClusterName: s.ctx.teleportCluster.name, - Initiator: initiator, - Expires: s.expires, +// trackSession creates a new session tracker for the kube session. +// While ctx is open, the session tracker's expiration will be extended +// on an interval until the session tracker is closed. +func (s *session) trackSession(p *party, policySet []*types.SessionTrackerPolicySet) error { + trackerSpec := types.SessionTrackerSpecV1{ + SessionID: s.id.String(), + Kind: string(types.KubernetesSessionKind), + State: types.SessionState_SessionStatePending, + Hostname: s.podName, + ClusterName: s.ctx.teleportCluster.name, + Participants: []types.Participant{{ + ID: p.ID.String(), + User: p.Ctx.User.GetName(), + LastActive: time.Now().UTC(), + }}, KubernetesCluster: s.ctx.kubeCluster, - HostUser: initiator.User, - HostPolicies: policySets, + HostUser: p.Ctx.User.GetName(), + HostPolicies: policySet, Login: "root", + Created: time.Now(), } - _, err := s.forwarder.cfg.AuthClient.CreateSessionTracker(s.forwarder.ctx, req) - return trace.Wrap(err) -} - -func (s *session) trackerAddParticipant(participant *party) error { - s.log.Debugf("Tracking participant: %v", participant.ID.String()) - req := &proto.UpdateSessionTrackerRequest{ - SessionID: s.id.String(), - Update: &proto.UpdateSessionTrackerRequest_AddParticipant{ - AddParticipant: &proto.SessionTrackerAddParticipant{ - Participant: &types.Participant{ - ID: participant.ID.String(), - User: participant.Ctx.User.GetName(), - Mode: string(participant.Mode), - LastActive: time.Now().UTC(), - }, - }, - }, - } - - err := s.forwarder.cfg.AuthClient.UpdateSessionTracker(s.forwarder.ctx, req) - return trace.Wrap(err) -} - -func (s *session) trackerRemoveParticipant(participantID string) error { - s.log.Debugf("Not tracking participant: %v", participantID) - req := &proto.UpdateSessionTrackerRequest{ - SessionID: s.id.String(), - Update: &proto.UpdateSessionTrackerRequest_RemoveParticipant{ - RemoveParticipant: &proto.SessionTrackerRemoveParticipant{ - ParticipantID: participantID, - }, - }, + s.log.Debug("Creating session tracker") + var err error + s.tracker, err = srv.NewSessionTracker(s.forwarder.ctx, trackerSpec, s.forwarder.cfg.AuthClient) + if err != nil { + return trace.Wrap(err) } - err := s.forwarder.cfg.AuthClient.UpdateSessionTracker(s.forwarder.ctx, req) - return trace.Wrap(err) -} - -func (s *session) trackerUpdateState(state types.SessionState) error { - req := &proto.UpdateSessionTrackerRequest{ - SessionID: s.id.String(), - Update: &proto.UpdateSessionTrackerRequest_UpdateState{ - UpdateState: &proto.SessionTrackerUpdateState{ - State: state, - }, - }, - } + go func() { + if err := s.tracker.UpdateExpirationLoop(s.forwarder.ctx, s.forwarder.cfg.Clock); err != nil { + s.log.WithError(err).Debug("Failed to update session tracker expiration") + } + }() - err := s.forwarder.cfg.AuthClient.UpdateSessionTracker(s.forwarder.ctx, req) - return trace.Wrap(err) + return nil } diff --git a/lib/services/local/sessiontracker.go b/lib/services/local/sessiontracker.go index 4a963620fd08b..a6f800aab8fa3 100644 --- a/lib/services/local/sessiontracker.go +++ b/lib/services/local/sessiontracker.go @@ -23,10 +23,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend" - "github.com/gravitational/teleport/lib/defaults" - "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" - "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/trace" "github.com/sirupsen/logrus" @@ -53,7 +50,7 @@ func (s *sessionTracker) loadSession(ctx context.Context, sessionID string) (typ return nil, trace.Wrap(err) } - session, err := unmarshalSession(sessionJSON.Value) + session, err := services.UnmarshalSessionTracker(sessionJSON.Value) if err != nil { return nil, trace.Wrap(err) } @@ -69,7 +66,7 @@ func (s *sessionTracker) UpdatePresence(ctx context.Context, sessionID, user str return trace.Wrap(err) } - session, err := unmarshalSession(sessionItem.Value) + session, err := services.UnmarshalSessionTracker(sessionItem.Value) if err != nil { return trace.Wrap(err) } @@ -79,7 +76,7 @@ func (s *sessionTracker) UpdatePresence(ctx context.Context, sessionID, user str return trace.Wrap(err) } - sessionJSON, err := marshalSession(session) + sessionJSON, err := services.MarshalSessionTracker(session) if err != nil { return trace.Wrap(err) } @@ -129,7 +126,7 @@ func (s *sessionTracker) GetActiveSessionTrackers(ctx context.Context) ([]types. var noExpiry []backend.Item now := s.bk.Clock().Now() for _, item := range result.Items { - session, err := unmarshalSession(item.Value) + session, err := services.UnmarshalSessionTracker(item.Value) if err != nil { return nil, trace.Wrap(err) } @@ -171,62 +168,23 @@ func (s *sessionTracker) GetActiveSessionTrackers(ctx context.Context) ([]types. } // CreateSessionTracker creates a tracker resource for an active session. -func (s *sessionTracker) CreateSessionTracker(ctx context.Context, req *proto.CreateSessionTrackerRequest) (types.SessionTracker, error) { - // Don't allow sessions that require moderation without the enterprise feature enabled. - for _, policySet := range req.HostPolicies { - if len(policySet.RequireSessionJoin) != 0 { - if !modules.GetModules().Features().ModeratedSessions { - return nil, trace.AccessDenied( - "this Teleport cluster is not licensed for moderated sessions, please contact the cluster administrator") - } - } - } - - now := s.bk.Clock().Now() - spec := types.SessionTrackerSpecV1{ - SessionID: req.ID, - Kind: req.Type, - State: types.SessionState_SessionStatePending, - Created: now, - Reason: req.Reason, - Invited: req.Invited, - Hostname: req.Hostname, - Address: req.Address, - ClusterName: req.ClusterName, - Login: req.Login, - Participants: []types.Participant{*req.Initiator}, - Expires: req.Expires, - KubernetesCluster: req.KubernetesCluster, - HostUser: req.HostUser, - } - - session, err := types.NewSessionTracker(spec) - if err != nil { - return nil, trace.Wrap(err) - } - - // By default, resource expiration should match session expiration. - session.SetExpiry(session.GetExpires()) - if session.Expiry().IsZero() { - session.SetExpiry(now.Add(defaults.SessionTrackerTTL)) - } - - json, err := marshalSession(session) +func (s *sessionTracker) CreateSessionTracker(ctx context.Context, tracker types.SessionTracker) (types.SessionTracker, error) { + json, err := services.MarshalSessionTracker(tracker) if err != nil { return nil, trace.Wrap(err) } item := backend.Item{ - Key: backend.Key(sessionPrefix, session.GetSessionID()), + Key: backend.Key(sessionPrefix, tracker.GetSessionID()), Value: json, - Expires: session.Expiry(), + Expires: tracker.Expiry(), } _, err = s.bk.Put(ctx, item) if err != nil { return nil, trace.Wrap(err) } - return session, nil + return tracker, nil } // UpdateSessionTracker updates a tracker resource for an active session. @@ -237,7 +195,7 @@ func (s *sessionTracker) UpdateSessionTracker(ctx context.Context, req *proto.Up return trace.Wrap(err) } - session, err := unmarshalSession(sessionItem.Value) + session, err := services.UnmarshalSessionTracker(sessionItem.Value) if err != nil { return trace.Wrap(err) } @@ -258,7 +216,7 @@ func (s *sessionTracker) UpdateSessionTracker(ctx context.Context, req *proto.Up return trace.BadParameter("unrecognized session version %T", session) } - sessionJSON, err := marshalSession(session) + sessionJSON, err := services.MarshalSessionTracker(session) if err != nil { return trace.Wrap(err) } @@ -288,59 +246,3 @@ func (s *sessionTracker) UpdateSessionTracker(ctx context.Context, req *proto.Up func (s *sessionTracker) RemoveSessionTracker(ctx context.Context, sessionID string) error { return trace.Wrap(s.bk.Delete(ctx, backend.Key(sessionPrefix, sessionID))) } - -// unmarshalSession unmarshals the Session resource from JSON. -func unmarshalSession(bytes []byte, opts ...services.MarshalOption) (types.SessionTracker, error) { - var session types.SessionTrackerV1 - - if len(bytes) == 0 { - return nil, trace.BadParameter("missing resource data") - } - - cfg, err := services.CollectOptions(opts) - if err != nil { - return nil, trace.Wrap(err) - } - - if err := utils.FastUnmarshal(bytes, &session); err != nil { - return nil, trace.BadParameter(err.Error()) - } - - if err := session.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } - - if cfg.ID != 0 { - session.SetResourceID(cfg.ID) - } - - if !cfg.Expires.IsZero() { - session.SetExpiry(cfg.Expires) - } - - return &session, nil -} - -// marshalSession marshals the Session resource to JSON. -func marshalSession(session types.SessionTracker, opts ...services.MarshalOption) ([]byte, error) { - if err := session.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } - - cfg, err := services.CollectOptions(opts) - if err != nil { - return nil, trace.Wrap(err) - } - - switch session := session.(type) { - case *types.SessionTrackerV1: - if !cfg.PreserveResourceID { - copy := *session - copy.SetResourceID(0) - session = © - } - return utils.FastMarshal(session) - default: - return nil, trace.BadParameter("unrecognized session version %T", session) - } -} diff --git a/lib/services/local/sessiontracker_test.go b/lib/services/local/sessiontracker_test.go index cb0200f97f42e..acc6a180ddc73 100644 --- a/lib/services/local/sessiontracker_test.go +++ b/lib/services/local/sessiontracker_test.go @@ -18,11 +18,12 @@ import ( "testing" "time" - "github.com/google/uuid" "github.com/gravitational/teleport/api/client/proto" - "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend/memory" + + "github.com/google/uuid" + "github.com/gravitational/trace" "github.com/stretchr/testify/require" ) @@ -32,29 +33,34 @@ func TestSessionTrackerStorage(t *testing.T) { bk, err := memory.New(memory.Config{}) require.NoError(t, err) - id := uuid.New().String() + sid := uuid.New().String() srv, err := NewSessionTrackerService(bk) require.NoError(t, err) - session, err := srv.CreateSessionTracker(ctx, &proto.CreateSessionTrackerRequest{ - Namespace: defaults.Namespace, - ID: id, - Type: types.KindSSHSession, + tracker, err := types.NewSessionTracker(types.SessionTrackerSpecV1{ + SessionID: sid, + Kind: types.KindSSHSession, Hostname: "hostname", ClusterName: "cluster", Login: "root", - Initiator: &types.Participant{ - ID: uuid.New().String(), - User: "eve", - Mode: string(types.SessionPeerMode), + Participants: []types.Participant{ + { + ID: uuid.New().String(), + User: "eve", + Mode: string(types.SessionPeerMode), + }, }, Expires: time.Now().UTC().Add(24 * time.Hour), }) require.NoError(t, err) + _, err = srv.CreateSessionTracker(ctx, tracker) + require.NoError(t, err) + bobID := uuid.New().String() - err = srv.UpdateSessionTracker(ctx, &proto.UpdateSessionTrackerRequest{ - SessionID: id, + + req := &proto.UpdateSessionTrackerRequest{ + SessionID: sid, Update: &proto.UpdateSessionTrackerRequest_AddParticipant{ AddParticipant: &proto.SessionTrackerAddParticipant{ Participant: &types.Participant{ @@ -64,30 +70,36 @@ func TestSessionTrackerStorage(t *testing.T) { }, }, }, - }) + } + + err = srv.UpdateSessionTracker(ctx, req) require.NoError(t, err) - err = srv.UpdateSessionTracker(ctx, &proto.UpdateSessionTrackerRequest{ - SessionID: id, + req = &proto.UpdateSessionTrackerRequest{ + SessionID: sid, Update: &proto.UpdateSessionTrackerRequest_RemoveParticipant{ RemoveParticipant: &proto.SessionTrackerRemoveParticipant{ ParticipantID: bobID, }, }, - }) + } + + err = srv.UpdateSessionTracker(ctx, req) require.NoError(t, err) sessions, err := srv.GetActiveSessionTrackers(ctx) require.NoError(t, err) require.Len(t, sessions, 1) - require.Len(t, session.GetParticipants(), 1) + tracker = sessions[0] + require.Len(t, tracker.GetParticipants(), 1) - err = srv.RemoveSessionTracker(ctx, session.GetSessionID()) + err = srv.RemoveSessionTracker(ctx, sid) require.NoError(t, err) - session, err = srv.GetSessionTracker(ctx, session.GetSessionID()) + tracker, err = srv.GetSessionTracker(ctx, sid) require.Error(t, err) - require.Nil(t, session) + require.True(t, trace.IsNotFound(err)) + require.Nil(t, tracker) } func TestSessionTrackerImplicitExpiry(t *testing.T) { @@ -100,29 +112,44 @@ func TestSessionTrackerImplicitExpiry(t *testing.T) { srv, err := NewSessionTrackerService(bk) require.NoError(t, err) - req1 := proto.CreateSessionTrackerRequest{ - Namespace: defaults.Namespace, - ID: id, - Type: types.KindSSHSession, + tracker1, err := types.NewSessionTracker(types.SessionTrackerSpecV1{ + SessionID: id, + Kind: types.KindSSHSession, Hostname: "hostname", ClusterName: "cluster", Login: "foo", - Initiator: &types.Participant{ - ID: uuid.New().String(), - User: "eve", - Mode: string(types.SessionPeerMode), + Participants: []types.Participant{ + { + ID: uuid.New().String(), + User: "eve", + Mode: string(types.SessionPeerMode), + }, }, Expires: time.Now().UTC().Add(time.Second), - } + }) + require.NoError(t, err) - req2 := req1 - req2.ID = id2 - req2.Expires = time.Now().UTC().Add(24 * time.Hour) + _, err = srv.CreateSessionTracker(ctx, tracker1) + require.NoError(t, err) - _, err = srv.CreateSessionTracker(ctx, &req1) + tracker2, err := types.NewSessionTracker(types.SessionTrackerSpecV1{ + SessionID: id2, + Kind: types.KindSSHSession, + Hostname: "hostname", + ClusterName: "cluster", + Login: "foo", + Participants: []types.Participant{ + { + ID: uuid.New().String(), + User: "eve", + Mode: string(types.SessionPeerMode), + }, + }, + Expires: time.Now().UTC().Add(24 * time.Hour), + }) require.NoError(t, err) - _, err = srv.CreateSessionTracker(ctx, &req2) + _, err = srv.CreateSessionTracker(ctx, tracker2) require.NoError(t, err) require.Eventually(t, func() bool { diff --git a/lib/services/sessiontracker.go b/lib/services/sessiontracker.go index b16cd804feacd..1748931193db7 100644 --- a/lib/services/sessiontracker.go +++ b/lib/services/sessiontracker.go @@ -21,6 +21,9 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/utils" + + "github.com/gravitational/trace" ) // SessionTrackerService is a realtime session service that has information about @@ -33,7 +36,7 @@ type SessionTrackerService interface { GetSessionTracker(ctx context.Context, sessionID string) (types.SessionTracker, error) // CreateSessionTracker creates a tracker resource for an active session. - CreateSessionTracker(ctx context.Context, req *proto.CreateSessionTrackerRequest) (types.SessionTracker, error) + CreateSessionTracker(ctx context.Context, st types.SessionTracker) (types.SessionTracker, error) // UpdateSessionTracker updates a tracker resource for an active session. UpdateSessionTracker(ctx context.Context, req *proto.UpdateSessionTrackerRequest) error @@ -44,3 +47,35 @@ type SessionTrackerService interface { // UpdatePresence updates the presence status of a user in a session. UpdatePresence(ctx context.Context, sessionID, user string) error } + +// UnmarshalSessionTracker unmarshals the Session resource from JSON. +func UnmarshalSessionTracker(bytes []byte) (types.SessionTracker, error) { + if len(bytes) == 0 { + return nil, trace.BadParameter("missing resource data") + } + + var session types.SessionTrackerV1 + if err := utils.FastUnmarshal(bytes, &session); err != nil { + return nil, trace.BadParameter(err.Error()) + } + + if err := session.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + return &session, nil +} + +// MarshalSessionTracker marshals the Session resource to JSON. +func MarshalSessionTracker(session types.SessionTracker) ([]byte, error) { + if err := session.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + switch session := session.(type) { + case *types.SessionTrackerV1: + return utils.FastMarshal(session) + default: + return nil, trace.BadParameter("unrecognized session version %T", session) + } +} diff --git a/lib/srv/app/server.go b/lib/srv/app/server.go index 1150d3a09262a..6b90c788c9247 100644 --- a/lib/srv/app/server.go +++ b/lib/srv/app/server.go @@ -175,7 +175,7 @@ type Server struct { proxyPort string - cache *sessionCache + cache *sessionChunkCache awsSigner *appaws.SigningService @@ -253,7 +253,7 @@ func New(ctx context.Context, c *Config) (*Server, error) { // Create a new session cache, this holds sessions that can be used to // forward requests. - s.cache, err = newSessionCache(s.closeContext, s.log) + s.cache, err = s.newSessionChunkCache() if err != nil { return nil, trace.Wrap(err) } @@ -513,6 +513,11 @@ func (s *Server) Close() error { errs = append(errs, err) } + // Close the session cache and its remaining sessions. Sessions + // use server.closeContext to complete cleanup, so we must wait + // for sessions to finish closing before closing the context. + s.cache.closeAllSessions() + // Signal to any blocking go routine that it should exit. s.closeFunc() @@ -682,7 +687,7 @@ func (s *Server) authorize(ctx context.Context, r *http.Request) (*tlsca.Identit // getSession returns a request session used to proxy the request to the // target application. Always checks if the session is valid first and if so, // will return a cached session, otherwise will create one. -func (s *Server) getSession(ctx context.Context, identity *tlsca.Identity, app types.Application) (*session, error) { +func (s *Server) getSession(ctx context.Context, identity *tlsca.Identity, app types.Application) (*sessionChunk, error) { // If a cached forwarder exists, return it right away. session, err := s.cache.get(identity.RouteToApp.SessionID) if err == nil { @@ -690,15 +695,7 @@ func (s *Server) getSession(ctx context.Context, identity *tlsca.Identity, app t } // Create a new session with a recorder and forwarder in it. - session, err = s.newSession(ctx, identity, app) - if err != nil { - return nil, trace.Wrap(err) - } - - // Put the session in the cache so the next request can use it for 5 minutes - // or the time until the certificate expires, whichever comes first. - ttl := utils.MinTTL(identity.Expires.Sub(s.c.Clock.Now()), 5*time.Minute) - err = s.cache.set(identity.RouteToApp.SessionID, session, ttl) + session, err = s.newSessionChunk(ctx, identity, app) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/srv/app/session.go b/lib/srv/app/session.go index 259b9f7d5bbdb..35b2bf80ffb9d 100644 --- a/lib/srv/app/session.go +++ b/lib/srv/app/session.go @@ -31,8 +31,10 @@ import ( "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/events/filesessions" "github.com/gravitational/teleport/lib/services" - session_pkg "github.com/gravitational/teleport/lib/session" + rsession "github.com/gravitational/teleport/lib/session" + "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/oxy/forward" "github.com/gravitational/trace" @@ -42,18 +44,42 @@ import ( "github.com/sirupsen/logrus" ) -// session holds a request forwarder and audit log for this chunk. -type session struct { +// sessionChunk holds an open request forwarder and audit log for an app session. +// +// An app session is only bounded by the lifetime of the certificate in +// the caller's identity, so we create sessionChunks to track and record +// chunks of live app session activity. +// +// Each chunk will emit an "app.session.chunk" event with the chunk ID +// corresponding to the session chunk's uploaded recording. These emitted +// chunk IDs can be used to aggregate all session uploads tied to the +// overarching identity SessionID. +type sessionChunk struct { + closeC chan struct{} + // id is the session chunk's uuid, which is used as the id of its session upload. + id string // fwd can rewrite and forward requests to the target application. fwd *forward.Forwarder // streamWriter can emit events to the audit log. streamWriter events.StreamWriter } -// newSession creates a new session. -func (s *Server) newSession(ctx context.Context, identity *tlsca.Identity, app types.Application) (*session, error) { +// newSessionChunk creates a new chunk session. +func (s *Server) newSessionChunk(ctx context.Context, identity *tlsca.Identity, app types.Application) (*sessionChunk, error) { + sess := &sessionChunk{ + id: uuid.New().String(), + closeC: make(chan struct{}), + } + + // Create a session tracker so that other services, such as the + // session upload completer, can track the session chunk's lifetime. + if err := s.createTracker(sess, identity); err != nil { + return nil, trace.Wrap(err) + } + // Create the stream writer that will write this chunk to the audit log. - streamWriter, err := s.newStreamWriter(identity, app) + var err error + sess.streamWriter, err = s.newStreamWriter(identity, app, sess.id) if err != nil { return nil, trace.Wrap(err) } @@ -79,7 +105,7 @@ func (s *Server) newSession(ctx context.Context, identity *tlsca.Identity, app t // Create a rewriting transport that will be used to forward requests. transport, err := newTransport(s.closeContext, &transportConfig{ - w: streamWriter, + w: sess.streamWriter, app: app, publicPort: s.proxyPort, cipherSuites: s.c.CipherSuites, @@ -91,7 +117,8 @@ func (s *Server) newSession(ctx context.Context, identity *tlsca.Identity, app t if err != nil { return nil, trace.Wrap(err) } - fwd, err := forward.New( + + sess.fwd, err = forward.New( forward.FlushInterval(100*time.Millisecond), forward.RoundTripper(transport), forward.Logger(logrus.StandardLogger()), @@ -102,15 +129,33 @@ func (s *Server) newSession(ctx context.Context, identity *tlsca.Identity, app t return nil, trace.Wrap(err) } - return &session{ - fwd: fwd, - streamWriter: streamWriter, - }, nil + // Put the session chunk in the cache so that upcoming requests can use it for + // 5 minutes or the time until the certificate expires, whichever comes first. + ttl := utils.MinTTL(identity.Expires.Sub(s.c.Clock.Now()), 5*time.Minute) + err = s.cache.set(identity.RouteToApp.SessionID, sess, ttl) + if err != nil { + return nil, trace.Wrap(err) + } + + return sess, nil } -// newStreamWriter creates a streamer that will be used to stream the -// requests that occur within this session to the audit log. -func (s *Server) newStreamWriter(identity *tlsca.Identity, app types.Application) (events.StreamWriter, error) { +func (s *sessionChunk) close(ctx context.Context) error { + close(s.closeC) + err := s.streamWriter.Close(ctx) + return trace.Wrap(err) +} + +func (s *Server) closeSession(sess *sessionChunk) { + if err := sess.close(s.closeContext); err != nil { + s.log.WithError(err).Debugf("Error closing session %v", sess.id) + } +} + +// newStreamWriter creates a session stream that will be used to record +// requests that occur within this session chunk and upload the recording +// to the Auth server. +func (s *Server) newStreamWriter(identity *tlsca.Identity, app types.Application, chunkID string) (events.StreamWriter, error) { recConfig, err := s.c.AccessPoint.GetSessionRecordingConfig(s.closeContext) if err != nil { return nil, trace.Wrap(err) @@ -121,11 +166,6 @@ func (s *Server) newStreamWriter(identity *tlsca.Identity, app types.Application return nil, trace.Wrap(err) } - // Each chunk has its own ID. Create a new UUID for this chunk which will be - // emitted in a new event to the audit log that can be use to aggregate all - // chunks for a particular session. - chunkID := uuid.New().String() - // Create a sync or async streamer depending on configuration of cluster. streamer, err := s.newStreamer(s.closeContext, chunkID, recConfig) if err != nil { @@ -137,7 +177,7 @@ func (s *Server) newStreamWriter(identity *tlsca.Identity, app types.Application Context: s.closeContext, Streamer: streamer, Clock: s.c.Clock, - SessionID: session_pkg.ID(chunkID), + SessionID: rsession.ID(chunkID), Namespace: apidefaults.Namespace, ServerID: s.c.HostID, RecordOutput: recConfig.GetMode() != types.RecordOff, @@ -182,13 +222,13 @@ func (s *Server) newStreamWriter(identity *tlsca.Identity, app types.Application // of the server and the session, sync streamer sends the events // directly to the auth server and blocks if the events can not be received, // async streamer buffers the events to disk and uploads the events later -func (s *Server) newStreamer(ctx context.Context, sessionID string, recConfig types.SessionRecordingConfig) (events.Streamer, error) { +func (s *Server) newStreamer(ctx context.Context, chunkID string, recConfig types.SessionRecordingConfig) (events.Streamer, error) { if services.IsRecordSync(recConfig.GetMode()) { - s.log.Debugf("Using sync streamer for session %v.", sessionID) + s.log.Debugf("Using sync streamer for session chunk %v.", chunkID) return s.c.AuthClient, nil } - s.log.Debugf("Using async streamer for session %v.", sessionID) + s.log.Debugf("Using async streamer for session chunk %v.", chunkID) uploadDir := filepath.Join( s.c.DataDir, teleport.LogsDir, teleport.ComponentUpload, events.StreamingLogsDir, apidefaults.Namespace, @@ -200,43 +240,72 @@ func (s *Server) newStreamer(ctx context.Context, sessionID string, recConfig ty return fileStreamer, nil } -// sessionCache holds a cache of sessions that are used to forward requests. -type sessionCache struct { - mu sync.Mutex - cache *ttlmap.TTLMap +// createTracker creates a new session tracker for the session chunk. +func (s *Server) createTracker(sess *sessionChunk, identity *tlsca.Identity) error { + trackerSpec := types.SessionTrackerSpecV1{ + SessionID: sess.id, + Kind: string(types.AppSessionKind), + State: types.SessionState_SessionStateRunning, + Hostname: s.c.HostID, + AppName: identity.RouteToApp.Name, + ClusterName: identity.RouteToApp.ClusterName, + Login: identity.GetUserMetadata().Login, + Participants: []types.Participant{{ + User: identity.Username, + }}, + HostUser: identity.Username, + Created: s.c.Clock.Now(), + AppSessionID: identity.RouteToApp.SessionID, + } - closeContext context.Context + s.log.Debugf("Creating tracker for session chunk %v", sess.id) + tracker, err := srv.NewSessionTracker(s.closeContext, trackerSpec, s.c.AuthClient) + if err != nil { + return trace.Wrap(err) + } + + go func() { + <-sess.closeC + if err := tracker.Close(s.closeContext); err != nil { + s.log.WithError(err).Debugf("Failed to close session tracker for session chunk %v", sess.id) + } + }() - log *logrus.Entry + return nil } -// newSessionCache creates a new session cache. -func newSessionCache(ctx context.Context, log *logrus.Entry) (*sessionCache, error) { - var err error +// sessionChunkCache holds a cache of session chunks. +type sessionChunkCache struct { + srv *Server - s := &sessionCache{ - closeContext: ctx, - log: log, - } + mu sync.Mutex + cache *ttlmap.TTLMap +} - // Cache of request forwarders. Set an expire function that can be used to - // close and upload the stream of events to the Audit Log. - s.cache, err = ttlmap.New(defaults.ClientCacheSize, ttlmap.CallOnExpire(s.expire)) +// newSessionChunkCache creates a new session chunk cache. +func (s *Server) newSessionChunkCache() (*sessionChunkCache, error) { + sessionCache := &sessionChunkCache{srv: s} + + // Cache of session chunks. Set an expire function that can be used + // to close and upload the stream of events to the Audit Log. + var err error + sessionCache.cache, err = ttlmap.New(defaults.ClientCacheSize, ttlmap.CallOnExpire(sessionCache.expire), ttlmap.Clock(s.c.Clock)) if err != nil { return nil, trace.Wrap(err) } - go s.expireSessions() - return s, nil + go sessionCache.expireSessions() + + return sessionCache, nil } -// get will fetch the session from the cache. -func (s *sessionCache) get(key string) (*session, error) { +// get will fetch the session chunk from the cache. +func (s *sessionChunkCache) get(key string) (*sessionChunk, error) { s.mu.Lock() defer s.mu.Unlock() if f, ok := s.cache.Get(key); ok { - if fwd, fok := f.(*session); fok { + if fwd, fok := f.(*sessionChunk); fok { return fwd, nil } return nil, trace.BadParameter("invalid type stored in cache: %T", f) @@ -244,43 +313,37 @@ func (s *sessionCache) get(key string) (*session, error) { return nil, trace.NotFound("session not found") } -// set will add the session to the cache. -func (s *sessionCache) set(key string, value *session, ttl time.Duration) error { +// set will add the session chunk to the cache. +func (s *sessionChunkCache) set(sessionID string, sess *sessionChunk, ttl time.Duration) error { s.mu.Lock() defer s.mu.Unlock() - if err := s.cache.Set(key, value, ttl); err != nil { + if err := s.cache.Set(sessionID, sess, ttl); err != nil { return trace.Wrap(err) } return nil } // expire will close the stream writer. -func (s *sessionCache) expire(key string, el interface{}) { - session, ok := el.(*session) - if !ok { - s.log.Debugf("Invalid type stored in cache: %T.", el) - return - } - - // Closing the stream writer may trigger a flush operation which could be - // time-consuming. Launch in another goroutine since this occurs under a +func (s *sessionChunkCache) expire(key string, el interface{}) { + // Closing the session stream writer may trigger a flush operation which could + // be time-consuming. Launch in another goroutine since this occurs under a // lock and expire can get called during a "get" operation on the ttlmap. - go s.closeStreamWriter(s.closeContext, session) - - s.log.Debugf("Closing expired stream %v.", key) + go s.closeSession(el) + s.srv.log.Debugf("Closing expired stream %v.", key) } -// closeStreamWriter will close the stream writer. This could be a -// time-consuming operation. -func (s *sessionCache) closeStreamWriter(ctx context.Context, session *session) { - if err := session.streamWriter.Close(ctx); err != nil { - s.log.Debugf("Failed to close stream writer: %v.", err) +func (s *sessionChunkCache) closeSession(el interface{}) { + switch sess := el.(type) { + case *sessionChunk: + s.srv.closeSession(sess) + default: + s.srv.log.Debugf("Invalid type stored in cache: %T.", el) } } // expireSessions ticks every second trying to close expired sessions. -func (s *sessionCache) expireSessions() { +func (s *sessionChunkCache) expireSessions() { ticker := time.NewTicker(time.Second) defer ticker.Stop() @@ -288,16 +351,26 @@ func (s *sessionCache) expireSessions() { select { case <-ticker.C: s.expiredSessions() - case <-s.closeContext.Done(): + case <-s.srv.closeContext.Done(): return } } } // expiredSession tries to expire sessions in the cache. -func (s *sessionCache) expiredSessions() { +func (s *sessionChunkCache) expiredSessions() { s.mu.Lock() defer s.mu.Unlock() s.cache.RemoveExpired(10) } + +// closeAllSessions will remove and close all sessions in the cache. +func (s *sessionChunkCache) closeAllSessions() { + s.mu.Lock() + defer s.mu.Unlock() + + for _, session, ok := s.cache.Pop(); ok; _, session, ok = s.cache.Pop() { + s.closeSession(session) + } +} diff --git a/lib/srv/db/access_test.go b/lib/srv/db/access_test.go index 31e88563dcc72..a08da46e74a55 100644 --- a/lib/srv/db/access_test.go +++ b/lib/srv/db/access_test.go @@ -1694,7 +1694,7 @@ func setupTestContext(ctx context.Context, t *testing.T, withDatabases ...withDa // Create and start test auth server. authServer, err := auth.NewTestAuthServer(auth.TestAuthServerConfig{ - Clock: clockwork.NewFakeClockAt(time.Now()), + Clock: testCtx.clock, ClusterName: testCtx.clusterName, Dir: t.TempDir(), }) @@ -1881,7 +1881,7 @@ func (c *testContext) setupDatabaseServer(ctx context.Context, t *testing.T, p a // Create database server agent itself. server, err := New(ctx, Config{ - Clock: clockwork.NewFakeClockAt(time.Now()), + Clock: c.clock, DataDir: t.TempDir(), AuthClient: c.authClient, AccessPoint: c.authClient, diff --git a/lib/srv/db/server.go b/lib/srv/db/server.go index 550067994afef..04c8f34f055db 100644 --- a/lib/srv/db/server.go +++ b/lib/srv/db/server.go @@ -680,15 +680,24 @@ func (s *Server) handleConnection(ctx context.Context, clientConn net.Conn) erro return trace.Wrap(err) } + // Create a session tracker so that other services, such as + // the session upload completer, can track the session's lifetime. + cancelCtx, cancel := context.WithCancel(ctx) + defer cancel() + + // Create a session tracker so that other services, such as + // the session upload completer, can track the session's lifetime. + if err := s.trackSession(cancelCtx, sessionCtx); err != nil { + return trace.Wrap(err) + } + streamWriter, err := s.newStreamWriter(sessionCtx) if err != nil { return trace.Wrap(err) } defer func() { - // Closing the stream writer is needed to flush all recorded data - // and trigger upload. Do it in a goroutine since depending on - // session size it can take a while, and we don't want to block - // the client. + // Close session stream in a goroutine since depending on session size + // it can take a while, and we don't want to block the client. go func() { // Use the server closing context to make sure that upload // continues beyond the session lifetime. @@ -866,3 +875,45 @@ func fetchMySQLVersion(ctx context.Context, database types.Database) error { return nil } + +// trackSession creates a new session tracker for the database session. +// While ctx is open, the session tracker's expiration will be extended +// on an interval. Once the ctx is closed, the session tracker's state +// will be updated to terminated. +func (s *Server) trackSession(ctx context.Context, sessionCtx *common.Session) error { + trackerSpec := types.SessionTrackerSpecV1{ + SessionID: sessionCtx.ID, + Kind: string(types.DatabaseSessionKind), + State: types.SessionState_SessionStateRunning, + Hostname: sessionCtx.HostID, + DatabaseName: sessionCtx.DatabaseName, + ClusterName: sessionCtx.ClusterName, + Login: sessionCtx.Identity.GetUserMetadata().Login, + Participants: []types.Participant{{ + User: sessionCtx.Identity.Username, + }}, + HostUser: sessionCtx.Identity.Username, + Created: s.cfg.Clock.Now(), + } + + s.log.Debugf("Creating tracker for session %v", sessionCtx.ID) + tracker, err := srv.NewSessionTracker(s.closeContext, trackerSpec, s.cfg.AuthClient) + if err != nil { + return trace.Wrap(err) + } + + go func() { + if err := tracker.UpdateExpirationLoop(ctx, s.cfg.Clock); err != nil { + s.log.WithError(err).Debugf("Failed to update session tracker expiration for session %v", sessionCtx.ID) + } + }() + + go func() { + <-ctx.Done() + if err := tracker.Close(s.closeContext); err != nil { + s.log.WithError(err).Debugf("Failed to close session tracker for session %v", sessionCtx.ID) + } + }() + + return nil +} diff --git a/lib/srv/desktop/windows_server.go b/lib/srv/desktop/windows_server.go index 6c582afc9f419..3dee641a2f166 100644 --- a/lib/srv/desktop/windows_server.go +++ b/lib/srv/desktop/windows_server.go @@ -777,23 +777,6 @@ func (s *WindowsService) connectRDP(ctx context.Context, log logrus.FieldLogger, log.Infof("desktop session %v will not be recorded, user %v's roles disable recording", string(sessionID), authCtx.User.GetName()) } - sw, err := s.newStreamWriter(recordSession, string(sessionID)) - if err != nil { - return trace.Wrap(err) - } - - // Closing the stream writer is needed to flush all recorded data - // and trigger the upload. Do it in a goroutine since depending on - // the session size it can take a while, and we don't want to block - // the client. - defer func() { - go func() { - if err := sw.Close(context.Background()); err != nil { - log.WithError(err).Errorf("closing stream writer for desktop session %v", sessionID.String()) - } - }() - }() - var windowsUser string authorize := func(login string) error { windowsUser = login // capture attempted login user @@ -814,6 +797,29 @@ func (s *WindowsService) connectRDP(ctx context.Context, log logrus.FieldLogger, ctx, cancel := context.WithCancel(ctx) defer cancel() + // Create a session tracker so that other services, such as + // the session upload completer, can track the session's lifetime. + if err := s.trackSession(ctx, &identity, windowsUser, string(sessionID), desktop); err != nil { + return trace.Wrap(err) + } + + sw, err := s.newStreamWriter(recordSession, string(sessionID)) + if err != nil { + return trace.Wrap(err) + } + + // Closing the stream writer is needed to flush all recorded data + // and trigger the upload. Do it in a goroutine since depending on + // the session size it can take a while, and we don't want to block + // the client. + defer func() { + go func() { + if err := sw.Close(context.Background()); err != nil { + log.WithError(err).Errorf("closing stream writer for desktop session %v", sessionID.String()) + } + }() + }() + delay := timer() tdpConn.OnSend = s.makeTDPSendHandler(ctx, sw, delay, &identity, string(sessionID), desktop.GetAddr()) tdpConn.OnRecv = s.makeTDPReceiveHandler(ctx, sw, delay, &identity, string(sessionID), desktop.GetAddr()) @@ -1252,6 +1258,49 @@ func (s *WindowsService) generateCredentials(ctx context.Context, username, doma return certDER, keyDER, nil } +// trackSession creates a session tracker for the given sessionID and +// attributes, and starts a goroutine to continually extend the tracker +// expiration while the session is active. Once the given ctx is closed, +// the tracker will be marked as terminated. +func (s *WindowsService) trackSession(ctx context.Context, id *tlsca.Identity, windowsUser string, sessionID string, desktop types.WindowsDesktop) error { + trackerSpec := types.SessionTrackerSpecV1{ + SessionID: sessionID, + Kind: string(types.WindowsDesktopSessionKind), + State: types.SessionState_SessionStateRunning, + Hostname: s.cfg.Hostname, + Address: desktop.GetAddr(), + DesktopName: desktop.GetName(), + ClusterName: s.clusterName, + Login: windowsUser, + Participants: []types.Participant{{ + User: id.Username, + }}, + HostUser: id.Username, + Created: s.cfg.Clock.Now(), + } + + s.cfg.Log.Debugf("Creating tracker for session %v", sessionID) + tracker, err := srv.NewSessionTracker(ctx, trackerSpec, s.cfg.AuthClient) + if err != nil { + return trace.Wrap(err) + } + + go func() { + if err := tracker.UpdateExpirationLoop(ctx, s.cfg.Clock); err != nil { + s.cfg.Log.WithError(err).Debugf("Failed to update session tracker expiration for session %v", sessionID) + } + }() + + go func() { + <-ctx.Done() + if err := tracker.Close(s.closeCtx); err != nil { + s.cfg.Log.WithError(err).Debugf("Failed to close session tracker for session %v", sessionID) + } + }() + + return nil +} + // The following vars contain the various object identifiers required for smartcard // login certificates. // diff --git a/lib/srv/sess.go b/lib/srv/sess.go index ec747491401b8..b9be02b3aa0ce 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -25,12 +25,7 @@ import ( "sync" "time" - "golang.org/x/crypto/ssh" - - "github.com/google/uuid" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/client/proto" - apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/auth" @@ -42,13 +37,14 @@ import ( rsession "github.com/gravitational/teleport/lib/session" "github.com/gravitational/teleport/lib/sshutils" "github.com/gravitational/teleport/lib/utils" - "github.com/gravitational/trace/trail" - "github.com/jonboulle/clockwork" - "github.com/moby/term" + "github.com/google/uuid" "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/moby/term" "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh" ) const sessionRecorderID = "session-recorder" @@ -419,11 +415,9 @@ type session struct { // serverCtx is used to control clean up of internal resources serverCtx context.Context - state types.SessionState - access auth.SessionAccessEvaluator - stateUpdate *sync.Cond + tracker *SessionTracker initiator string @@ -431,8 +425,6 @@ type session struct { presenceEnabled bool - started bool - doneCh chan struct{} bpfContext *bpf.SessionContext @@ -524,12 +516,10 @@ func newSession(id rsession.ID, r *SessionRegistry, ctx *ServerContext) (*sessio stopC: make(chan struct{}), startTime: startTime, serverCtx: ctx.srv.Context(), - state: types.SessionState_SessionStatePending, access: auth.NewSessionAccessEvaluator(policySets, types.SSHSessionKind), scx: ctx, presenceEnabled: ctx.Identity.Certificate.Extensions[teleport.CertExtensionMFAVerified] != "", io: NewTermManager(), - stateUpdate: sync.NewCond(&sync.Mutex{}), doneCh: make(chan struct{}), initiator: ctx.Identity.TeleportUser, displayParticipantRequirements: utils.AsBool(ctx.env[teleport.EnvSSHSessionDisplayParticipantRequirements]), @@ -552,12 +542,10 @@ func newSession(id rsession.ID, r *SessionRegistry, ctx *ServerContext) (*sessio } }() - err = sess.trackerCreate(ctx.Identity.TeleportUser, policySets) - if err != nil { + if err = sess.trackSession(ctx.Identity.TeleportUser, policySets); err != nil { if trace.IsNotImplemented(err) { return nil, trace.NotImplemented("Attempted to use Moderated Sessions with an Auth Server below the minimum version of 9.0.0.") } - return nil, trace.Wrap(err) } @@ -608,24 +596,16 @@ func (s *session) Stop() { // Close and kill terminal if s.term != nil { if err := s.term.Close(); err != nil { - s.log.Debugf("Failed to close the shell: %v", err) + s.log.WithError(err).Debug("Failed to close the shell") } if err := s.term.Kill(); err != nil { - s.log.Debugf("Failed to kill the shell: %v", err) + s.log.WithError(err).Debug("Failed to kill the shell") } } - // Remove session parties and close client connections. - for _, p := range s.parties { - p.closeUnderSessionLock() - } - - // Set session state to terminated - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() - err := s.trackerUpdateState(types.SessionState_SessionStateTerminated) - if err != nil { - s.log.Warnf("Failed to set tracker state to %v", types.SessionState_SessionStateTerminated) + // Close session tracker and mark it as terminated + if err := s.tracker.Close(s.serverCtx); err != nil { + s.log.WithError(err).Debug("Failed to close session tracker") } } @@ -641,6 +621,11 @@ func (s *session) Close() error { serverSessions.Dec() + // Remove session parties and close client connections. + for _, p := range s.getParties() { + p.Close() + } + // Remove session from registry s.registry.removeSession(s) @@ -664,31 +649,6 @@ func (s *session) Close() error { return nil } -func (s *session) waitOnAccess() error { - s.io.Off() - s.BroadcastMessage("Session paused, Waiting for required participants...") - - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() -outer: - for { - switch s.state { - case types.SessionState_SessionStatePending: - continue - case types.SessionState_SessionStateTerminated: - return nil - case types.SessionState_SessionStateRunning: - break outer - } - - s.stateUpdate.Wait() - } - - s.BroadcastMessage("Resuming session...") - s.io.On() - return nil -} - func (s *session) BroadcastMessage(format string, args ...interface{}) { if s.access.IsModerated() && !services.IsRecordAtProxy(s.scx.SessionRecordingConfig.GetMode()) { s.io.BroadcastMessage(fmt.Sprintf(format, args...)) @@ -826,7 +786,10 @@ func (s *session) emitSessionLeaveEvent(ctx *ServerContext) { } _, _, err = p.sconn.SendRequest(teleport.SessionEvent, false, eventPayload) if err != nil { - s.log.Warnf("Unable to send %v to %v: %v.", events.SessionLeaveEvent, p.sconn.RemoteAddr(), err) + // The party's connection may already be closed, in which case we expect an EOF + if !trace.IsEOF(err) { + s.log.Warnf("Unable to send %v to %v: %v.", events.SessionLeaveEvent, p.sconn.RemoteAddr(), err) + } continue } s.log.Debugf("Sent %v to %v.", events.SessionLeaveEvent, p.sconn.RemoteAddr()) @@ -889,20 +852,15 @@ func (s *session) setEndingContext(ctx *ServerContext) { s.endingContext = ctx } +// launch launches the session. +// Must be called under session Lock. func (s *session) launch(ctx *ServerContext) error { - s.mu.Lock() - defer s.mu.Unlock() - s.log.Debugf("Launching session %v.", s.id) s.BroadcastMessage("Connecting to %v over SSH", ctx.srv.GetInfo().GetHostname()) s.io.On() - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() - - err := s.trackerUpdateState(types.SessionState_SessionStateRunning) - if err != nil { + if err := s.tracker.UpdateState(s.serverCtx, types.SessionState_SessionStateRunning); err != nil { s.log.Warnf("Failed to set tracker state to %v", types.SessionState_SessionStateRunning) } @@ -1246,43 +1204,48 @@ func (s *session) removePartyUnderLock(p *party) error { // Remove participant from in-memory map of party members. delete(s.parties, p.id) + s.BroadcastMessage("User %v left the session.", p.user) + // Update session tracker - if err := s.trackerRemoveParticipant(p.user); err != nil { + s.log.Debugf("No longer tracking participant: %v", p.id) + if err := s.tracker.RemoveParticipant(s.serverCtx, p.id.String()); err != nil { return trace.Wrap(err) } // Remove party for the term writer s.io.DeleteWriter(string(p.id)) + // Emit session leave event to both the Audit Log as well as over the + // "x-teleport-event" channel in the SSH connection. + s.emitSessionLeaveEvent(p.ctx) + canRun, policyOptions, err := s.checkIfStart() if err != nil { return trace.Wrap(err) } - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() - - if !canRun && s.state == types.SessionState_SessionStateRunning { + if !canRun { if policyOptions.TerminateOnLeave { // Force termination in goroutine to avoid deadlock go s.registry.ForceTerminate(s.scx) return nil } - err := s.trackerUpdateState(types.SessionState_SessionStatePending) - if err != nil { + // pause session and wait for another party to resume + s.io.Off() + s.BroadcastMessage("Session paused, Waiting for required participants...") + if err := s.tracker.UpdateState(s.serverCtx, types.SessionState_SessionStatePending); err != nil { s.log.Warnf("Failed to set tracker state to %v", types.SessionState_SessionStatePending) } - go s.waitOnAccess() + go func() { + if state := s.tracker.WaitForStateUpdate(types.SessionState_SessionStatePending); state == types.SessionState_SessionStateRunning { + s.BroadcastMessage("Resuming session...") + s.io.On() + } + }() } - s.BroadcastMessage("User %v left the session.", p.user) - - // Emit session leave event to both the Audit Log as well as over the - // "x-teleport-event" channel in the SSH connection. - s.emitSessionLeaveEvent(p.ctx) - // If the leaving party was the last one in the session, start the lingerAndDie // goroutine. Parties that join during the linger duration will cancel the // goroutine to prevent the session from ending with active parties. @@ -1404,12 +1367,7 @@ func (s *session) checkPresence() error { s.mu.Lock() defer s.mu.Unlock() - sess, err := s.trackerGet() - if err != nil { - return trace.Wrap(err) - } - - for _, participant := range sess.GetParticipants() { + for _, participant := range s.tracker.GetParticipants() { if participant.User == s.initiator { continue } @@ -1454,6 +1412,16 @@ func (s *session) addParty(p *party, mode types.SessionParticipantMode) error { s.mu.Lock() defer s.mu.Unlock() + if s.login != p.login { + return trace.AccessDenied( + "can't switch users from %v to %v for session %v", + s.login, p.login, s.id) + } + + if s.tracker.GetState() == types.SessionState_SessionStateTerminated { + return trace.AccessDenied("The requested session is not active") + } + if len(s.parties) == 0 { canStart, _, err := s.checkIfStart() if err != nil { @@ -1477,8 +1445,14 @@ func (s *session) addParty(p *party, mode types.SessionParticipantMode) error { s.participants[p.id] = p p.ctx.AddCloser(p) - err := s.trackerAddParticipant(p) - if err != nil { + s.log.Debugf("Tracking participant: %s", p.id) + participant := &types.Participant{ + ID: p.id.String(), + User: p.user, + Mode: string(p.mode), + LastActive: time.Now().UTC(), + } + if err := s.tracker.AddParticipant(s.serverCtx, participant); err != nil { return trace.Wrap(err) } @@ -1504,38 +1478,24 @@ func (s *session) addParty(p *party, mode types.SessionParticipantMode) error { }() } - s.stateUpdate.L.Lock() - defer s.stateUpdate.L.Unlock() - if s.state == types.SessionState_SessionStatePending { + if s.tracker.GetState() == types.SessionState_SessionStatePending { canStart, _, err := s.checkIfStart() if err != nil { return trace.Wrap(err) } if canStart { - if !s.started { - s.started = true - - go func() { - err := s.launch(s.scx) - if err != nil { - s.log.Errorf("Failed to launch session %v: %v", s.id, err) - } - }() - } else { - err := s.trackerUpdateState(types.SessionState_SessionStateRunning) - if err != nil { - s.log.Warnf("Failed to set tracker state to %v", types.SessionState_SessionStateRunning) - } + if err := s.launch(s.scx); err != nil { + s.log.Errorf("Failed to launch session %v: %v", s.id, err) } - } else if !s.started { - base := "Waiting for required participants..." + return nil + } - if s.displayParticipantRequirements { - s.BroadcastMessage(base+"\r\n%v", s.access.PrettyRequirementsList()) - } else { - s.BroadcastMessage(base) - } + base := "Waiting for required participants..." + if s.displayParticipantRequirements { + s.BroadcastMessage(base+"\r\n%v", s.access.PrettyRequirementsList()) + } else { + s.BroadcastMessage(base) } } @@ -1669,135 +1629,47 @@ func (p *party) closeUnderSessionLock() { }) } -func (s *session) trackerGet() (types.SessionTracker, error) { - // get the session from the registry - sess, err := s.registry.SessionTrackerService.GetSessionTracker(s.serverCtx, s.id.String()) - if err != nil { - return nil, trace.Wrap(err) - } - - return sess, nil -} - -func (s *session) trackerCreate(teleportUser string, policySet []*types.SessionTrackerPolicySet) error { - s.log.Debug("Creating tracker") - initator := &types.Participant{ - ID: teleportUser, - User: teleportUser, - LastActive: time.Now().UTC(), +// trackSession creates a new session tracker for the ssh session. +// While ctx is open, the session tracker's expiration will be extended +// on an interval until the session tracker is closed. +func (s *session) trackSession(teleportUser string, policySet []*types.SessionTrackerPolicySet) error { + trackerSpec := types.SessionTrackerSpecV1{ + SessionID: s.id.String(), + Kind: string(types.SSHSessionKind), + State: types.SessionState_SessionStatePending, + Hostname: s.registry.Srv.GetInfo().GetHostname(), + Address: s.scx.srv.ID(), + ClusterName: s.scx.ClusterName, + Login: s.login, + Participants: []types.Participant{{ + ID: teleportUser, + User: teleportUser, + LastActive: s.registry.clock.Now(), + }}, + HostUser: teleportUser, + Reason: s.scx.env[teleport.EnvSSHSessionReason], + HostPolicies: policySet, + Created: s.registry.clock.Now(), } - reason := s.scx.env[teleport.EnvSSHSessionReason] - var invited []string - if s.scx.env[teleport.EnvSSHSessionInvited] != "" { - err := json.Unmarshal([]byte(s.scx.env[teleport.EnvSSHSessionInvited]), &invited) - if err != nil { + if err := json.Unmarshal([]byte(s.scx.env[teleport.EnvSSHSessionInvited]), &trackerSpec.Invited); err != nil { return trace.Wrap(err) } } - req := &proto.CreateSessionTrackerRequest{ - ID: s.id.String(), - Namespace: apidefaults.Namespace, - Type: string(types.KubernetesSessionKind), - Hostname: s.registry.Srv.GetInfo().GetHostname(), - Address: s.scx.srv.ID(), - ClusterName: s.scx.ClusterName, - Login: "root", - Initiator: initator, - HostUser: initator.User, - Reason: reason, - Invited: invited, - HostPolicies: policySet, - } - - _, err := s.registry.SessionTrackerService.CreateSessionTracker(s.serverCtx, req) + s.log.Debug("Creating session tracker") + var err error + s.tracker, err = NewSessionTracker(s.serverCtx, trackerSpec, s.registry.SessionTrackerService) if err != nil { - return trail.FromGRPC(err) + return trace.Wrap(err) } - // Start go routine to push back session expiration while session is still active. go func() { - ticker := s.registry.clock.NewTicker(defaults.SessionTrackerExpirationUpdateInterval) - defer ticker.Stop() - for { - select { - case time := <-ticker.Chan(): - if err := s.trackerUpdateExpiry(time.Add(defaults.SessionTrackerTTL)); err != nil { - s.log.WithError(err).Warningf("Failed to update session tracker expiration.") - } - case <-s.stopC: - return - } + if err := s.tracker.UpdateExpirationLoop(s.serverCtx, s.registry.clock); err != nil { + s.log.WithError(err).Debug("Failed to update session tracker expiration") } }() return nil } - -func (s *session) trackerAddParticipant(participant *party) error { - s.log.Debugf("Tracking participant: %v", participant.user) - req := &proto.UpdateSessionTrackerRequest{ - SessionID: s.id.String(), - Update: &proto.UpdateSessionTrackerRequest_AddParticipant{ - AddParticipant: &proto.SessionTrackerAddParticipant{ - Participant: &types.Participant{ - ID: participant.user, - User: participant.user, - Mode: string(participant.mode), - LastActive: time.Now().UTC(), - }, - }, - }, - } - - err := s.registry.SessionTrackerService.UpdateSessionTracker(s.serverCtx, req) - return trace.Wrap(err) -} - -func (s *session) trackerRemoveParticipant(participantID string) error { - s.log.Debugf("Not tracking participant: %v", participantID) - req := &proto.UpdateSessionTrackerRequest{ - SessionID: s.id.String(), - Update: &proto.UpdateSessionTrackerRequest_RemoveParticipant{ - RemoveParticipant: &proto.SessionTrackerRemoveParticipant{ - ParticipantID: participantID, - }, - }, - } - - err := s.registry.SessionTrackerService.UpdateSessionTracker(s.serverCtx, req) - return trace.Wrap(err) -} - -func (s *session) trackerUpdateState(state types.SessionState) error { - s.state = state - s.stateUpdate.Broadcast() - - req := &proto.UpdateSessionTrackerRequest{ - SessionID: s.id.String(), - Update: &proto.UpdateSessionTrackerRequest_UpdateState{ - UpdateState: &proto.SessionTrackerUpdateState{ - State: state, - }, - }, - } - - err := s.registry.SessionTrackerService.UpdateSessionTracker(s.serverCtx, req) - return trace.Wrap(err) -} - -func (s *session) trackerUpdateExpiry(expires time.Time) error { - req := &proto.UpdateSessionTrackerRequest{ - SessionID: s.id.String(), - Update: &proto.UpdateSessionTrackerRequest_UpdateExpiry{ - UpdateExpiry: &proto.SessionTrackerUpdateExpiry{ - Expires: &expires, - }, - }, - } - - err := s.registry.SessionTrackerService.UpdateSessionTracker(s.serverCtx, req) - return trace.Wrap(err) -} diff --git a/lib/srv/sess_test.go b/lib/srv/sess_test.go index 85353f251f5f5..3b01104f31f8d 100644 --- a/lib/srv/sess_test.go +++ b/lib/srv/sess_test.go @@ -368,58 +368,6 @@ func testJoinSession(t *testing.T, reg *SessionRegistry, sess *session) { require.NoError(t, err) } -// TestSessionTracker tests session tracker lifecycle -func TestSessionTracker(t *testing.T) { - ctx := context.Background() - - srv := newMockServer(t) - - // Use a separate clock from srv so we can use BlockUntil. - regClock := clockwork.NewFakeClock() - reg, err := NewSessionRegistry(SessionRegistryConfig{ - Srv: srv, - SessionTrackerService: srv.auth, - clock: regClock, - }) - - require.NoError(t, err) - t.Cleanup(func() { reg.Close() }) - - // Session tracker should be created for a new session - sess := testOpenSession(t, reg) - tracker, err := srv.auth.GetSessionTracker(ctx, sess.ID()) - require.NoError(t, err) - - // Session tracker's expiration should be updated on an interval - // while the session is active. - regClock.BlockUntil(1) - regClock.Advance(defaults.SessionTrackerExpirationUpdateInterval) - srv.clock.Advance(defaults.SessionTrackerExpirationUpdateInterval) - - trackerUpdated := func() bool { - updatedTracker, err := srv.auth.GetSessionTracker(ctx, sess.ID()) - require.NoError(t, err) - return updatedTracker.Expiry().Equal(tracker.Expiry().Add(defaults.SessionTrackerExpirationUpdateInterval)) - } - require.Eventually(t, trackerUpdated, time.Second*5, time.Millisecond*500) - - // Once the sesssion is closed and the last set - // expiration is up, the tracker should be deleted. - sess.Close() - regClock.Advance(defaults.SessionTrackerTTL) - srv.clock.Advance(defaults.SessionTrackerTTL) - - trackerDeleted := func() bool { - _, err := srv.auth.GetSessionTracker(ctx, sess.ID()) - if err == nil { - return false - } - require.True(t, trace.IsNotFound(err)) - return true - } - require.Eventually(t, trackerDeleted, time.Second*5, time.Millisecond*500) -} - func testOpenSession(t *testing.T, reg *SessionRegistry) *session { scx := newTestServerContext(t, reg.Srv) diff --git a/lib/srv/sessiontracker.go b/lib/srv/sessiontracker.go new file mode 100644 index 0000000000000..95dbedbb4aefe --- /dev/null +++ b/lib/srv/sessiontracker.go @@ -0,0 +1,194 @@ +/* +Copyright 2022 Gravitational, Inc. + +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 srv + +import ( + "context" + "sync" + "time" + + "github.com/gravitational/teleport/api/client/proto" + apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/services" + "github.com/jonboulle/clockwork" + + "github.com/gravitational/trace" +) + +// SessionTracker is a session tracker for a specific session. It tracks +// the session in memory and broadcasts updates to the given service (backend). +type SessionTracker struct { + closeC chan struct{} + // tracker is the in memory session tracker + tracker types.SessionTracker + // trackerCond is used to provide synchronized access to tracker + // and to broadcast state changes. + trackerCond *sync.Cond + // service is used to share session tracker updates with the service + service services.SessionTrackerService +} + +// NewSessionTracker returns a new SessionTracker for the given types.SessionTracker +func NewSessionTracker(ctx context.Context, trackerSpec types.SessionTrackerSpecV1, service services.SessionTrackerService) (*SessionTracker, error) { + if service == nil { + return nil, trace.BadParameter("missing parameter service") + } + + t, err := types.NewSessionTracker(trackerSpec) + if err != nil { + return nil, trace.Wrap(err) + } + + if t, err = service.CreateSessionTracker(ctx, t); err != nil { + return nil, trace.Wrap(err) + } + + return &SessionTracker{ + service: service, + tracker: t, + trackerCond: sync.NewCond(&sync.Mutex{}), + closeC: make(chan struct{}), + }, nil +} + +// Close closes the session tracker and sets the tracker state to terminated +func (s *SessionTracker) Close(ctx context.Context) error { + close(s.closeC) + err := s.UpdateState(ctx, types.SessionState_SessionStateTerminated) + return trace.Wrap(err) +} + +const sessionTrackerExpirationUpdateInterval = apidefaults.SessionTrackerTTL / 6 + +// UpdateExpirationLoop extends the session tracker expiration by 1 hour every 10 minutes +// until the SessionTracker or ctx is closed. +func (s *SessionTracker) UpdateExpirationLoop(ctx context.Context, clock clockwork.Clock) error { + ticker := clock.NewTicker(sessionTrackerExpirationUpdateInterval) + defer ticker.Stop() + return s.updateExpirationLoop(ctx, ticker) +} + +// updateExpirationLoop is used in tests +func (s *SessionTracker) updateExpirationLoop(ctx context.Context, ticker clockwork.Ticker) error { + for { + select { + case time := <-ticker.Chan(): + expiry := time.Add(apidefaults.SessionTrackerTTL) + if err := s.UpdateExpiration(ctx, expiry); err != nil { + return trace.Wrap(err) + } + case <-ctx.Done(): + return trace.Wrap(ctx.Err()) + case <-s.closeC: + return nil + } + } +} + +func (s *SessionTracker) UpdateExpiration(ctx context.Context, expiry time.Time) error { + s.trackerCond.L.Lock() + defer s.trackerCond.L.Unlock() + s.tracker.SetExpiry(expiry) + s.trackerCond.Broadcast() + + err := s.service.UpdateSessionTracker(ctx, &proto.UpdateSessionTrackerRequest{ + SessionID: s.tracker.GetSessionID(), + Update: &proto.UpdateSessionTrackerRequest_UpdateExpiry{ + UpdateExpiry: &proto.SessionTrackerUpdateExpiry{ + Expires: &expiry, + }, + }, + }) + return trace.Wrap(err) +} + +func (s *SessionTracker) AddParticipant(ctx context.Context, p *types.Participant) error { + s.trackerCond.L.Lock() + defer s.trackerCond.L.Unlock() + s.tracker.AddParticipant(*p) + s.trackerCond.Broadcast() + + err := s.service.UpdateSessionTracker(ctx, &proto.UpdateSessionTrackerRequest{ + SessionID: s.tracker.GetSessionID(), + Update: &proto.UpdateSessionTrackerRequest_AddParticipant{ + AddParticipant: &proto.SessionTrackerAddParticipant{ + Participant: p, + }, + }, + }) + return trace.Wrap(err) +} + +func (s *SessionTracker) RemoveParticipant(ctx context.Context, participantID string) error { + s.trackerCond.L.Lock() + defer s.trackerCond.L.Unlock() + s.tracker.RemoveParticipant(participantID) + s.trackerCond.Broadcast() + + err := s.service.UpdateSessionTracker(ctx, &proto.UpdateSessionTrackerRequest{ + SessionID: s.tracker.GetSessionID(), + Update: &proto.UpdateSessionTrackerRequest_RemoveParticipant{ + RemoveParticipant: &proto.SessionTrackerRemoveParticipant{ + ParticipantID: participantID, + }, + }, + }) + return trace.Wrap(err) +} + +func (s *SessionTracker) UpdateState(ctx context.Context, state types.SessionState) error { + s.trackerCond.L.Lock() + defer s.trackerCond.L.Unlock() + s.tracker.SetState(state) + s.trackerCond.Broadcast() + + err := s.service.UpdateSessionTracker(ctx, &proto.UpdateSessionTrackerRequest{ + SessionID: s.tracker.GetSessionID(), + Update: &proto.UpdateSessionTrackerRequest_UpdateState{ + UpdateState: &proto.SessionTrackerUpdateState{ + State: state, + }, + }, + }) + return trace.Wrap(err) +} + +// WaitForStateUpdate waits for the tracker's state to be updated and returns the new state. +func (s *SessionTracker) WaitForStateUpdate(initialState types.SessionState) types.SessionState { + s.trackerCond.L.Lock() + defer s.trackerCond.L.Unlock() + + for { + if state := s.tracker.GetState(); state != initialState { + return state + } + s.trackerCond.Wait() + } +} + +func (s *SessionTracker) GetState() types.SessionState { + s.trackerCond.L.Lock() + defer s.trackerCond.L.Unlock() + return s.tracker.GetState() +} + +func (s *SessionTracker) GetParticipants() []types.Participant { + s.trackerCond.L.Lock() + defer s.trackerCond.L.Unlock() + return s.tracker.GetParticipants() +} diff --git a/lib/srv/sessiontracker_test.go b/lib/srv/sessiontracker_test.go new file mode 100644 index 0000000000000..91b520fc622e3 --- /dev/null +++ b/lib/srv/sessiontracker_test.go @@ -0,0 +1,155 @@ +/* +Copyright 2022 Gravitational, Inc. + +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 srv + +import ( + "context" + "testing" + "time" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" +) + +func TestSessionTracker(t *testing.T) { + ctx := context.Background() + clock := clockwork.NewFakeClock() + + mockService := &mockSessiontrackerService{ + trackers: make(map[string]types.SessionTracker), + } + + sessID := "sessionID" + trackerSpec := types.SessionTrackerSpecV1{ + Created: clock.Now(), + SessionID: sessID, + } + + // Create a new session tracker + tracker, err := NewSessionTracker(ctx, trackerSpec, mockService) + require.NoError(t, err) + require.NotNil(t, tracker) + require.Equal(t, tracker.tracker, mockService.trackers[sessID]) + + t.Run("UpdateExpirationLoop", func(t *testing.T) { + cancelCtx, cancel := context.WithCancel(ctx) + done := make(chan struct{}) + + duration := time.Minute + ticker := clock.NewTicker(duration) + defer ticker.Stop() + + // Start update expiration goroutine + go func() { + tracker.updateExpirationLoop(cancelCtx, ticker) + close(done) + }() + + // lock expiry and advance clock + tracker.trackerCond.L.Lock() + clock.Advance(duration) + expectedExpiry := tracker.tracker.Expiry().Add(duration) + + // wait for expiration to get updated + tracker.trackerCond.Wait() + tracker.trackerCond.L.Unlock() + require.Equal(t, expectedExpiry, tracker.tracker.Expiry()) + require.Equal(t, tracker.tracker, mockService.trackers[sessID]) + + // cancelling the goroutine's ctx should halt the update loop + cancel() + _, ok := <-done + require.False(t, ok) + }) + + t.Run("State", func(t *testing.T) { + stateUpdate := make(chan types.SessionState) + go func() { + stateUpdate <- tracker.WaitForStateUpdate(types.SessionState_SessionStatePending) + }() + + err = tracker.UpdateState(ctx, types.SessionState_SessionStatePending) + require.NoError(t, err) + require.Equal(t, types.SessionState_SessionStatePending, tracker.GetState()) + require.Equal(t, tracker.tracker, mockService.trackers[sessID]) + + err = tracker.UpdateState(ctx, types.SessionState_SessionStateRunning) + require.NoError(t, err) + require.Equal(t, types.SessionState_SessionStateRunning, tracker.GetState()) + require.Equal(t, tracker.tracker, mockService.trackers[sessID]) + + // WaitForStateUpdate should ignore the pending update and then catch the running update + require.Equal(t, types.SessionState_SessionStateRunning, <-stateUpdate) + }) + + t.Run("Participants", func(t *testing.T) { + participantID := "userID" + + p := &types.Participant{ID: participantID} + err = tracker.AddParticipant(ctx, p) + require.NoError(t, err) + require.Equal(t, []types.Participant{*p}, tracker.GetParticipants()) + require.Equal(t, tracker.tracker, mockService.trackers[sessID]) + + err = tracker.RemoveParticipant(ctx, participantID) + require.NoError(t, err) + require.Empty(t, tracker.GetParticipants()) + require.Equal(t, tracker.tracker, mockService.trackers[sessID]) + }) + + t.Run("Close", func(t *testing.T) { + // Closing the tracker should update the state to terminated + err = tracker.Close(ctx) + require.NoError(t, err) + require.Equal(t, types.SessionState_SessionStateTerminated, tracker.GetState()) + require.Equal(t, tracker.tracker, mockService.trackers[sessID]) + }) +} + +type mockSessiontrackerService struct { + trackers map[string]types.SessionTracker +} + +func (m *mockSessiontrackerService) GetActiveSessionTrackers(ctx context.Context) ([]types.SessionTracker, error) { + return nil, trace.NotImplemented("") +} + +func (m *mockSessiontrackerService) GetSessionTracker(ctx context.Context, sessionID string) (types.SessionTracker, error) { + return nil, trace.NotImplemented("") +} + +func (m *mockSessiontrackerService) UpdateSessionTracker(ctx context.Context, req *proto.UpdateSessionTrackerRequest) error { + // m.trackers[req.SessionID] will be updated as a pointer reference + return nil +} + +func (m *mockSessiontrackerService) RemoveSessionTracker(ctx context.Context, sessionID string) error { + return trace.NotImplemented("") +} + +func (m *mockSessiontrackerService) UpdatePresence(ctx context.Context, sessionID, user string) error { + return trace.NotImplemented("") +} + +func (m *mockSessiontrackerService) CreateSessionTracker(ctx context.Context, tracker types.SessionTracker) (types.SessionTracker, error) { + m.trackers[tracker.GetSessionID()] = tracker + return tracker, nil +} diff --git a/tool/tsh/tsh_test.go b/tool/tsh/tsh_test.go index 12addd2cc3446..96152d3719cfe 100644 --- a/tool/tsh/tsh_test.go +++ b/tool/tsh/tsh_test.go @@ -1945,7 +1945,8 @@ func TestSerializeKubeSessions(t *testing.T) { "kind": "session_tracker", "version": "v1", "metadata": { - "name": "id" + "name": "id", + "expires": "1970-01-01T00:00:00Z" }, "spec": { "session_id": "id",