diff --git a/.github/ISSUE_TEMPLATE/testplan.md b/.github/ISSUE_TEMPLATE/testplan.md index db9192b9fd858..860eb7bba8501 100644 --- a/.github/ISSUE_TEMPLATE/testplan.md +++ b/.github/ISSUE_TEMPLATE/testplan.md @@ -180,67 +180,114 @@ as well as an upgrade of the previous version of Teleport. - [ ] Interact with a cluster using `tsh` - These commands should ideally be tested for recording and non-recording modes as they are implemented in a different ways. - - - [ ] tsh ssh \ - - [ ] tsh ssh \ - - [ ] tsh ssh \ - - [ ] tsh ssh \ - - [ ] tsh ssh -A \ - - [ ] tsh ssh -A \ - - [ ] tsh ssh -A \ - - [ ] tsh ssh -A \ - - [ ] tsh ssh \ ls - - [ ] tsh ssh \ ls - - [ ] tsh ssh \ ls - - [ ] tsh ssh \ ls - - [ ] tsh join \ - - [ ] tsh join \ - - [ ] tsh play \ - - [ ] tsh play \ - - [ ] tsh play \ - - [ ] tsh play \ - - [ ] tsh scp \ - - [ ] tsh scp \ - - [ ] tsh scp \ - - [ ] tsh scp \ - - [ ] tsh ssh -L \ - - [ ] tsh ssh -L \ - - [ ] tsh ssh -L \ - - [ ] tsh ssh -L \ - - [ ] tsh ssh -R \ - - [ ] tsh ssh -R \ - - [ ] tsh ssh -R \ - - [ ] tsh ssh -R \ - - [ ] tsh ls - - [ ] tsh clusters + These commands should ideally be tested for recording and non-recording modes as they are implemented in a different ways. + Recording can be disabled by adding `session_recording: off` to `auth_service` in your config. A regular node refers to + a [Teleport SSH service](https://goteleport.com/docs/enroll-resources/server-access/getting-started/). An agentless node is an [OpenSSH server](https://goteleport.com/docs/enroll-resources/server-access/openssh/openssh-agentless) that has been enrolled into Teleport. A remote cluster is a leaf cluster that is connected to a root cluster via a [trusted cluster setup](https://goteleport.com/docs/admin-guides/management/admin/trustedclusters/). Here's a recommended setup for testing: + +``` + ┌───────────────┐ + │ │ + ┌►│ Regular Node │ +┌───────────────┐ ┌───────────────┐ │ │ │ +│ │ │ │ │ └───────────────┘ +│ Root Cluster ├───►│ Leaf Cluster ├─┤ +│ │ │ │ │ ┌───────────────┐ +└───────────────┘ └───────────────┘ │ │ │ + └►│ OpenSSH Node │ + │ │ + └───────────────┘ +``` + +When you want to test a non-remote-cluster, use the Leaf Cluster as your proxy target. + + - [ ] `tsh ssh ` + - [ ] `tsh ssh ` + - [ ] `tsh ssh ` + - [ ] `tsh ssh ` + +Test agent had been forwarded by running `ssh-add -L` and check that your teleport keys are listed. Each cluster requires the `permit-agent-forwarding` flag and the role you're assuming in the leaf cluster needs `Agent Forwarding` enabled. Example connection command: +`tsh ssh -A --proxy $PROXY --cluster $REMOTE_CLUSTER $USER@$NODE_NAME` + + - [ ] `tsh ssh -A ` + - [ ] `tsh ssh -A ` + - [ ] `tsh ssh -A ` + - [ ] `tsh ssh -A ` + - [ ] `tsh ssh ls` + - [ ] `tsh ssh ls` + - [ ] `tsh ssh ls` + - [ ] `tsh ssh ls` + - [ ] `tsh join ` + - [ ] `tsh join ` + +For `tsh play`, ensure the role you assume on the leaf cluster has `read` and `list` for the `session` resource. Example allow rule: +```yaml +spec: + allow: + rules: + - resources: + - session + verbs: + - read + - list +``` + + - [ ] `tsh play ` + - [ ] `tsh play ` + - [ ] `tsh play ` + - [ ] `tsh play ` + - [ ] `tsh scp ` + - [ ] `tsh scp ` + - [ ] `tsh scp ` + - [ ] `tsh scp ` + +This forwards the local port to the remote node, test this with a web server running on the remote node, e.g. `python3 -m http.server 8000` on the remote node, setup a tunnel to the node with `tsh ssh -L 9000:localhost:8000 `, then `curl http://localhost:9000` from your local machine. + + - [ ] `tsh ssh -L ` + - [ ] `tsh ssh -L ` + - [ ] `tsh ssh -L ` + - [ ] `tsh ssh -L ` + +`-R` forwards the remote port to the local machine, test this with a web server running on your local machine, e.g. `python3 -m http.server 8000`, setup a tunnel to the node with `tsh ssh -R 9000:localhost:8000 `, then `curl http://localhost:9000` from the remote node. + + - [ ] `tsh ssh -R ` + - [ ] `tsh ssh -R ` + - [ ] `tsh ssh -R ` + - [ ] `tsh ssh -R ` + - [ ] `tsh ls` + - [ ] `tsh clusters` - [ ] Interact with a cluster using `ssh` - Make sure to test both recording and regular proxy modes. - - [ ] ssh \ - - [ ] ssh \ - - [ ] ssh \ - - [ ] ssh \ - - [ ] ssh -A \ - - [ ] ssh -A \ - - [ ] ssh -A \ - - [ ] ssh -A \ - - [ ] ssh \ ls - - [ ] ssh \ ls - - [ ] ssh \ ls - - [ ] ssh \ ls - - [ ] scp \ - - [ ] scp \ - - [ ] scp \ - - [ ] scp \ - - [ ] ssh -L \ - - [ ] ssh -L \ - - [ ] ssh -L \ - - [ ] ssh -L \ - - [ ] ssh -R \ - - [ ] ssh -R \ - - [ ] ssh -R \ - - [ ] ssh -R \ + + Make sure to test both recording and regular proxy modes. Generate an [SSH config](https://goteleport.com/docs/reference/cli/tsh/#tsh-config), one per cluster. An SSH command will look something like this: + + `ssh -p 22 -F /path/to/generated/ssh_config @.` + + To test connecting to a remote cluster, use the root cluster's `ssh_config` and the name of the remote cluster for ``. + + - [ ] `ssh ` + - [ ] `ssh ` + - [ ] `ssh ` + - [ ] `ssh ` + - [ ] `ssh -A ` + - [ ] `ssh -A ` + - [ ] `ssh -A ` + - [ ] `ssh -A ` + - [ ] `ssh ls` + - [ ] `ssh ls` + - [ ] `ssh ls` + - [ ] `ssh ls` + - [ ] `scp ` + - [ ] `scp ` + - [ ] `scp ` + - [ ] `scp ` + - [ ] `ssh -L ` + - [ ] `ssh -L ` + - [ ] `ssh -L ` + - [ ] `ssh -L ` + - [ ] `ssh -R ` + - [ ] `ssh -R ` + - [ ] `ssh -R ` + - [ ] `ssh -R ` - [ ] Verify proxy jump functionality Log into leaf cluster via root, shut down the root proxy and verify proxy jump works. diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 835f117cea2e0..514434b9e45bc 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4823,6 +4823,9 @@ message OneOf { events.MCPSessionEnd MCPSessionEnd = 217; events.MCPSessionRequest MCPSessionRequest = 218; events.MCPSessionNotification MCPSessionNotification = 219; + events.BoundKeypairRecovery BoundKeypairRecovery = 220; + events.BoundKeypairRotation BoundKeypairRotation = 221; + events.BoundKeypairJoinStateVerificationFailed BoundKeypairJoinStateVerificationFailed = 222; } } @@ -8701,3 +8704,97 @@ message MCPSessionNotification { (gogoproto.jsontag) = "message,omitempty" ]; } + +// BoundKeypairRecovery is emitted when a client performs a self recovery using +// a bound_keypair joining token. This event is also emitted upon first join. +message BoundKeypairRecovery { + // Metadata is a common event metadata. + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // Status contains common command or operation status fields. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // TokenName is the name of the provision token used to join. + string TokenName = 4 [(gogoproto.jsontag) = "token_name"]; + // BotName is the name of the bot attempting to join, if any. + string BotName = 5 [(gogoproto.jsontag) = "bot_name,omitempty"]; + // PublicKey is the public key at the completion of the joining process, in + // SSH authorized_keys format. If a keypair rotation occurred, this is the + // keypair trusted at the end of the join process. + string PublicKey = 6 [(gogoproto.jsontag) = "public_key,omitempty"]; + // RecoveryCount is the recovery counter value at the time of this recovery. + uint32 RecoveryCount = 7 [(gogoproto.jsontag) = "recovery_count"]; + // RecoveryMode is the bound keypair token's configured recovery mode. + string RecoveryMode = 8 [(gogoproto.jsontag) = "recovery_mode"]; +} + +// BoundKeypairRotation is emitted when a keypair rotation takes place. +message BoundKeypairRotation { + // Metadata is a common event metadata. + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // Status contains common command or operation status fields. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // TokenName is the name of the provision token used to join. + string TokenName = 4 [(gogoproto.jsontag) = "token_name"]; + // BotName is the name of the bot attempting to join, if any. + string BotName = 5 [(gogoproto.jsontag) = "bot_name,omitempty"]; + // PreviousPublicKey is the previous public key in SSH authorized_keys format. + // On first join using a registration secret, this value will be empty. + string PreviousPublicKey = 6 [(gogoproto.jsontag) = "previous_public_key,omitempty"]; + // NewPublicKey is the new public key after rotation. If rotation fails, this + // value will be empty. + string NewPublicKey = 7 [(gogoproto.jsontag) = "new_public_key,omitempty"]; +} + +// BoundKeypairJoinStateVerificationFailed is emitted when join state +// verification fails, potentially indicating a compromised keypair. +message BoundKeypairJoinStateVerificationFailed { + // Metadata is a common event metadata. + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // Status contains information about the failure. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // TokenName is the name of the provision token used to join. + string TokenName = 4 [(gogoproto.jsontag) = "token_name"]; + // BotName is the name of the bot attempting to join, if any. + string BotName = 5 [(gogoproto.jsontag) = "bot_name,omitempty"]; +} diff --git a/api/types/events/events.go b/api/types/events/events.go index 36ca54eddcc6e..e9320825cfcc1 100644 --- a/api/types/events/events.go +++ b/api/types/events/events.go @@ -2598,3 +2598,69 @@ func (m *MCPSessionNotification) TrimToMaxSize(maxSize int) AuditEvent { out.Message = m.Message.trimToMaxSize(maxSize) return out } + +func (m *BoundKeypairRecovery) TrimToMaxSize(maxSize int) AuditEvent { + size := m.Size() + if size <= maxSize { + return m + } + out := utils.CloneProtoMsg(m) + out.Status = Status{} + out.TokenName = "" + out.BotName = "" + out.PublicKey = "" + + maxSize = adjustedMaxSize(out, maxSize) + customFieldsCount := m.Status.nonEmptyStrs() + nonEmptyStrs(m.TokenName, m.BotName, m.PublicKey) + maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) + + out.Status = m.Status.trimToMaxSize(maxFieldsSize) + out.TokenName = trimStr(m.TokenName, maxFieldsSize) + out.BotName = trimStr(m.BotName, maxFieldsSize) + out.PublicKey = trimStr(m.PublicKey, maxFieldsSize) + return out +} + +func (m *BoundKeypairRotation) TrimToMaxSize(maxSize int) AuditEvent { + size := m.Size() + if size <= maxSize { + return m + } + out := utils.CloneProtoMsg(m) + out.Status = Status{} + out.TokenName = "" + out.BotName = "" + out.PreviousPublicKey = "" + out.NewPublicKey = "" + + maxSize = adjustedMaxSize(out, maxSize) + customFieldsCount := m.Status.nonEmptyStrs() + nonEmptyStrs(m.TokenName, m.BotName, m.PreviousPublicKey, m.NewPublicKey) + maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) + + out.Status = m.Status.trimToMaxSize(maxFieldsSize) + out.TokenName = trimStr(m.TokenName, maxFieldsSize) + out.BotName = trimStr(m.BotName, maxFieldsSize) + out.PreviousPublicKey = trimStr(m.PreviousPublicKey, maxFieldsSize) + out.NewPublicKey = trimStr(m.NewPublicKey, maxFieldsSize) + return out +} + +func (m *BoundKeypairJoinStateVerificationFailed) TrimToMaxSize(maxSize int) AuditEvent { + size := m.Size() + if size <= maxSize { + return m + } + out := utils.CloneProtoMsg(m) + out.Status = Status{} + out.TokenName = "" + out.BotName = "" + + maxSize = adjustedMaxSize(out, maxSize) + customFieldsCount := m.Status.nonEmptyStrs() + nonEmptyStrs(m.TokenName, m.BotName) + maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) + + out.Status = m.Status.trimToMaxSize(maxFieldsSize) + out.TokenName = trimStr(m.TokenName, maxFieldsSize) + out.BotName = trimStr(m.BotName, maxFieldsSize) + return out +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index fb27e4539c3fc..303a130007b1e 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -8145,6 +8145,9 @@ type OneOf struct { // *OneOf_MCPSessionEnd // *OneOf_MCPSessionRequest // *OneOf_MCPSessionNotification + // *OneOf_BoundKeypairRecovery + // *OneOf_BoundKeypairRotation + // *OneOf_BoundKeypairJoinStateVerificationFailed Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8835,6 +8838,15 @@ type OneOf_MCPSessionRequest struct { type OneOf_MCPSessionNotification struct { MCPSessionNotification *MCPSessionNotification `protobuf:"bytes,219,opt,name=MCPSessionNotification,proto3,oneof" json:"MCPSessionNotification,omitempty"` } +type OneOf_BoundKeypairRecovery struct { + BoundKeypairRecovery *BoundKeypairRecovery `protobuf:"bytes,220,opt,name=BoundKeypairRecovery,proto3,oneof" json:"BoundKeypairRecovery,omitempty"` +} +type OneOf_BoundKeypairRotation struct { + BoundKeypairRotation *BoundKeypairRotation `protobuf:"bytes,221,opt,name=BoundKeypairRotation,proto3,oneof" json:"BoundKeypairRotation,omitempty"` +} +type OneOf_BoundKeypairJoinStateVerificationFailed struct { + BoundKeypairJoinStateVerificationFailed *BoundKeypairJoinStateVerificationFailed `protobuf:"bytes,222,opt,name=BoundKeypairJoinStateVerificationFailed,proto3,oneof" json:"BoundKeypairJoinStateVerificationFailed,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -9051,6 +9063,9 @@ func (*OneOf_MCPSessionStart) isOneOf_Event() {} func (*OneOf_MCPSessionEnd) isOneOf_Event() {} func (*OneOf_MCPSessionRequest) isOneOf_Event() {} func (*OneOf_MCPSessionNotification) isOneOf_Event() {} +func (*OneOf_BoundKeypairRecovery) isOneOf_Event() {} +func (*OneOf_BoundKeypairRotation) isOneOf_Event() {} +func (*OneOf_BoundKeypairJoinStateVerificationFailed) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -10564,6 +10579,27 @@ func (m *OneOf) GetMCPSessionNotification() *MCPSessionNotification { return nil } +func (m *OneOf) GetBoundKeypairRecovery() *BoundKeypairRecovery { + if x, ok := m.GetEvent().(*OneOf_BoundKeypairRecovery); ok { + return x.BoundKeypairRecovery + } + return nil +} + +func (m *OneOf) GetBoundKeypairRotation() *BoundKeypairRotation { + if x, ok := m.GetEvent().(*OneOf_BoundKeypairRotation); ok { + return x.BoundKeypairRotation + } + return nil +} + +func (m *OneOf) GetBoundKeypairJoinStateVerificationFailed() *BoundKeypairJoinStateVerificationFailed { + if x, ok := m.GetEvent().(*OneOf_BoundKeypairJoinStateVerificationFailed); ok { + return x.BoundKeypairJoinStateVerificationFailed + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -10782,6 +10818,9 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_MCPSessionEnd)(nil), (*OneOf_MCPSessionRequest)(nil), (*OneOf_MCPSessionNotification)(nil), + (*OneOf_BoundKeypairRecovery)(nil), + (*OneOf_BoundKeypairRotation)(nil), + (*OneOf_BoundKeypairJoinStateVerificationFailed)(nil), } } @@ -17073,6 +17112,174 @@ func (m *MCPSessionNotification) XXX_DiscardUnknown() { var xxx_messageInfo_MCPSessionNotification proto.InternalMessageInfo +// BoundKeypairRecovery is emitted when a client performs a self recovery using +// a bound_keypair joining token. This event is also emitted upon first join. +type BoundKeypairRecovery struct { + // Metadata is a common event metadata. + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // Status contains common command or operation status fields. + Status `protobuf:"bytes,2,opt,name=Status,proto3,embedded=Status" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,3,opt,name=Connection,proto3,embedded=Connection" json:""` + // TokenName is the name of the provision token used to join. + TokenName string `protobuf:"bytes,4,opt,name=TokenName,proto3" json:"token_name"` + // BotName is the name of the bot attempting to join, if any. + BotName string `protobuf:"bytes,5,opt,name=BotName,proto3" json:"bot_name,omitempty"` + // PublicKey is the public key at the completion of the joining process, in + // SSH authorized_keys format. If a keypair rotation occurred, this is the + // keypair trusted at the end of the join process. + PublicKey string `protobuf:"bytes,6,opt,name=PublicKey,proto3" json:"public_key,omitempty"` + // RecoveryCount is the recovery counter value at the time of this recovery. + RecoveryCount uint32 `protobuf:"varint,7,opt,name=RecoveryCount,proto3" json:"recovery_count"` + // RecoveryMode is the bound keypair token's configured recovery mode. + RecoveryMode string `protobuf:"bytes,8,opt,name=RecoveryMode,proto3" json:"recovery_mode"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BoundKeypairRecovery) Reset() { *m = BoundKeypairRecovery{} } +func (m *BoundKeypairRecovery) String() string { return proto.CompactTextString(m) } +func (*BoundKeypairRecovery) ProtoMessage() {} +func (*BoundKeypairRecovery) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{268} +} +func (m *BoundKeypairRecovery) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BoundKeypairRecovery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BoundKeypairRecovery.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BoundKeypairRecovery) XXX_Merge(src proto.Message) { + xxx_messageInfo_BoundKeypairRecovery.Merge(m, src) +} +func (m *BoundKeypairRecovery) XXX_Size() int { + return m.Size() +} +func (m *BoundKeypairRecovery) XXX_DiscardUnknown() { + xxx_messageInfo_BoundKeypairRecovery.DiscardUnknown(m) +} + +var xxx_messageInfo_BoundKeypairRecovery proto.InternalMessageInfo + +// BoundKeypairRotation is emitted when a keypair rotation takes place. +type BoundKeypairRotation struct { + // Metadata is a common event metadata. + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // Status contains common command or operation status fields. + Status `protobuf:"bytes,2,opt,name=Status,proto3,embedded=Status" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,3,opt,name=Connection,proto3,embedded=Connection" json:""` + // TokenName is the name of the provision token used to join. + TokenName string `protobuf:"bytes,4,opt,name=TokenName,proto3" json:"token_name"` + // BotName is the name of the bot attempting to join, if any. + BotName string `protobuf:"bytes,5,opt,name=BotName,proto3" json:"bot_name,omitempty"` + // PreviousPublicKey is the previous public key in SSH authorized_keys format. + // On first join using a registration secret, this value will be empty. + PreviousPublicKey string `protobuf:"bytes,6,opt,name=PreviousPublicKey,proto3" json:"previous_public_key,omitempty"` + // NewPublicKey is the new public key after rotation. If rotation fails, this + // value will be empty. + NewPublicKey string `protobuf:"bytes,7,opt,name=NewPublicKey,proto3" json:"new_public_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BoundKeypairRotation) Reset() { *m = BoundKeypairRotation{} } +func (m *BoundKeypairRotation) String() string { return proto.CompactTextString(m) } +func (*BoundKeypairRotation) ProtoMessage() {} +func (*BoundKeypairRotation) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{269} +} +func (m *BoundKeypairRotation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BoundKeypairRotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BoundKeypairRotation.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BoundKeypairRotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_BoundKeypairRotation.Merge(m, src) +} +func (m *BoundKeypairRotation) XXX_Size() int { + return m.Size() +} +func (m *BoundKeypairRotation) XXX_DiscardUnknown() { + xxx_messageInfo_BoundKeypairRotation.DiscardUnknown(m) +} + +var xxx_messageInfo_BoundKeypairRotation proto.InternalMessageInfo + +// BoundKeypairJoinStateVerificationFailed is emitted when join state +// verification fails, potentially indicating a compromised keypair. +type BoundKeypairJoinStateVerificationFailed struct { + // Metadata is a common event metadata. + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // Status contains information about the failure. + Status `protobuf:"bytes,2,opt,name=Status,proto3,embedded=Status" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,3,opt,name=Connection,proto3,embedded=Connection" json:""` + // TokenName is the name of the provision token used to join. + TokenName string `protobuf:"bytes,4,opt,name=TokenName,proto3" json:"token_name"` + // BotName is the name of the bot attempting to join, if any. + BotName string `protobuf:"bytes,5,opt,name=BotName,proto3" json:"bot_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BoundKeypairJoinStateVerificationFailed) Reset() { + *m = BoundKeypairJoinStateVerificationFailed{} +} +func (m *BoundKeypairJoinStateVerificationFailed) String() string { return proto.CompactTextString(m) } +func (*BoundKeypairJoinStateVerificationFailed) ProtoMessage() {} +func (*BoundKeypairJoinStateVerificationFailed) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{270} +} +func (m *BoundKeypairJoinStateVerificationFailed) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BoundKeypairJoinStateVerificationFailed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BoundKeypairJoinStateVerificationFailed.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BoundKeypairJoinStateVerificationFailed) XXX_Merge(src proto.Message) { + xxx_messageInfo_BoundKeypairJoinStateVerificationFailed.Merge(m, src) +} +func (m *BoundKeypairJoinStateVerificationFailed) XXX_Size() int { + return m.Size() +} +func (m *BoundKeypairJoinStateVerificationFailed) XXX_DiscardUnknown() { + xxx_messageInfo_BoundKeypairJoinStateVerificationFailed.DiscardUnknown(m) +} + +var xxx_messageInfo_BoundKeypairJoinStateVerificationFailed proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.UserOrigin", UserOrigin_name, UserOrigin_value) @@ -17367,6 +17574,9 @@ func init() { proto.RegisterType((*MCPJSONRPCMessage)(nil), "events.MCPJSONRPCMessage") proto.RegisterType((*MCPSessionRequest)(nil), "events.MCPSessionRequest") proto.RegisterType((*MCPSessionNotification)(nil), "events.MCPSessionNotification") + proto.RegisterType((*BoundKeypairRecovery)(nil), "events.BoundKeypairRecovery") + proto.RegisterType((*BoundKeypairRotation)(nil), "events.BoundKeypairRotation") + proto.RegisterType((*BoundKeypairJoinStateVerificationFailed)(nil), "events.BoundKeypairJoinStateVerificationFailed") } func init() { @@ -17374,1208 +17584,1227 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 19204 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x78, 0x64, 0xc9, - 0x75, 0x18, 0x86, 0xa3, 0x1f, 0x68, 0x00, 0x07, 0xaf, 0x46, 0xcd, 0xeb, 0xce, 0xec, 0xec, 0xf6, - 0x6e, 0xef, 0xee, 0x70, 0x66, 0xb9, 0x3b, 0xb3, 0x3b, 0xfb, 0x20, 0xf7, 0x41, 0xee, 0x36, 0xba, - 0x81, 0x41, 0xcf, 0xe0, 0xd1, 0xbc, 0x8d, 0x99, 0xd9, 0x25, 0x45, 0xb6, 0x2e, 0xfa, 0xd6, 0x00, - 0x77, 0xd1, 0xb8, 0xb7, 0x79, 0xef, 0x6d, 0x60, 0xb0, 0xfe, 0xfd, 0x12, 0xd1, 0xa2, 0x25, 0xd1, - 0xa6, 0x28, 0x86, 0x8a, 0x44, 0x59, 0xb2, 0x13, 0xca, 0x8e, 0x13, 0x59, 0xa2, 0xc5, 0xc8, 0x61, - 0xf4, 0xa6, 0x2d, 0x59, 0x7e, 0x50, 0xa2, 0xa4, 0x88, 0xb2, 0xa5, 0x28, 0xb6, 0x03, 0x39, 0x4a, - 0xfc, 0x0f, 0xbe, 0x24, 0x9f, 0xbe, 0x44, 0x5f, 0x4c, 0x39, 0x71, 0xbe, 0x7c, 0x75, 0xaa, 0xee, - 0xbd, 0x75, 0x1f, 0xdd, 0x78, 0xae, 0xb0, 0xd8, 0xc1, 0x3f, 0x33, 0xe8, 0x73, 0x4e, 0x9d, 0xaa, - 0x7b, 0xea, 0x54, 0xd5, 0xa9, 0xaa, 0x53, 0xe7, 0xc0, 0x15, 0x97, 0xb6, 0x68, 0xdb, 0xb2, 0xdd, - 0x6b, 0x2d, 0xba, 0xac, 0x35, 0x37, 0xaf, 0xb9, 0x9b, 0x6d, 0xea, 0x5c, 0xa3, 0xeb, 0xd4, 0x74, - 0xbd, 0xff, 0xae, 0xb6, 0x6d, 0xcb, 0xb5, 0x48, 0x8e, 0xff, 0xba, 0x70, 0x7a, 0xd9, 0x5a, 0xb6, - 0x10, 0x74, 0x8d, 0xfd, 0xc5, 0xb1, 0x17, 0x2e, 0x2e, 0x5b, 0xd6, 0x72, 0x8b, 0x5e, 0xc3, 0x5f, - 0x4b, 0x9d, 0x7b, 0xd7, 0x1c, 0xd7, 0xee, 0x34, 0x5d, 0x81, 0x2d, 0x44, 0xb1, 0xae, 0xb1, 0x46, - 0x1d, 0x57, 0x5b, 0x6b, 0x0b, 0x82, 0x47, 0xa2, 0x04, 0x1b, 0xb6, 0xd6, 0x6e, 0x53, 0x5b, 0x54, - 0x7e, 0xe1, 0x03, 0x7e, 0x3b, 0xb5, 0x66, 0x93, 0x3a, 0x4e, 0xcb, 0x70, 0xdc, 0x6b, 0xeb, 0xcf, - 0x49, 0xbf, 0x04, 0xe1, 0x63, 0xc9, 0x1f, 0x84, 0xff, 0x0a, 0x92, 0x67, 0x92, 0x49, 0xbc, 0x1a, - 0x23, 0x55, 0x17, 0xbf, 0x94, 0x86, 0xc1, 0x39, 0xea, 0x6a, 0xba, 0xe6, 0x6a, 0xe4, 0x22, 0xf4, - 0x57, 0x4d, 0x9d, 0xde, 0x57, 0x52, 0x8f, 0xa6, 0x2e, 0x67, 0x26, 0x73, 0xdb, 0x5b, 0x85, 0x34, - 0x35, 0x54, 0x0e, 0x24, 0x0f, 0x43, 0x76, 0x71, 0xb3, 0x4d, 0x95, 0xf4, 0xa3, 0xa9, 0xcb, 0x43, - 0x93, 0x43, 0xdb, 0x5b, 0x85, 0x7e, 0x14, 0x9a, 0x8a, 0x60, 0xf2, 0x18, 0xa4, 0xab, 0x15, 0x25, - 0x83, 0xc8, 0x89, 0xed, 0xad, 0xc2, 0x68, 0xc7, 0xd0, 0x9f, 0xb6, 0xd6, 0x0c, 0x97, 0xae, 0xb5, - 0xdd, 0x4d, 0x35, 0x5d, 0xad, 0x90, 0x4b, 0x90, 0x2d, 0x5b, 0x3a, 0x55, 0xb2, 0x48, 0x44, 0xb6, - 0xb7, 0x0a, 0x63, 0x4d, 0x4b, 0xa7, 0x12, 0x15, 0xe2, 0xc9, 0x1b, 0x90, 0x5d, 0x34, 0xd6, 0xa8, - 0xd2, 0xff, 0x68, 0xea, 0xf2, 0xf0, 0xf5, 0x0b, 0x57, 0xb9, 0xf8, 0xae, 0x7a, 0xe2, 0xbb, 0xba, - 0xe8, 0xc9, 0x77, 0x32, 0xff, 0xcd, 0xad, 0x42, 0xdf, 0xf6, 0x56, 0x21, 0xcb, 0x44, 0xfe, 0xc5, - 0x3f, 0x2e, 0xa4, 0x54, 0x2c, 0x49, 0x5e, 0x83, 0xe1, 0x72, 0xab, 0xe3, 0xb8, 0xd4, 0x9e, 0xd7, - 0xd6, 0xa8, 0x92, 0xc3, 0x0a, 0x2f, 0x6c, 0x6f, 0x15, 0xce, 0x36, 0x39, 0xb8, 0x61, 0x6a, 0x6b, - 0x72, 0xc5, 0x32, 0x79, 0xf1, 0x17, 0x53, 0x30, 0x5e, 0xa7, 0x8e, 0x63, 0x58, 0xa6, 0x2f, 0x9b, - 0x27, 0x61, 0x48, 0x80, 0xaa, 0x15, 0x94, 0xcf, 0xd0, 0xe4, 0xc0, 0xf6, 0x56, 0x21, 0xe3, 0x18, - 0xba, 0x1a, 0x60, 0xc8, 0xb3, 0x30, 0x70, 0xd7, 0x70, 0x57, 0xe6, 0xa6, 0x4b, 0x42, 0x4e, 0x67, - 0xb7, 0xb7, 0x0a, 0x64, 0xc3, 0x70, 0x57, 0x1a, 0x6b, 0xf7, 0x34, 0xa9, 0x42, 0x8f, 0x8c, 0xcc, - 0x42, 0xbe, 0x66, 0x1b, 0xeb, 0x9a, 0x4b, 0x6f, 0xd1, 0xcd, 0x9a, 0xd5, 0x32, 0x9a, 0x9b, 0x42, - 0x8a, 0x8f, 0x6e, 0x6f, 0x15, 0x2e, 0xb6, 0x39, 0xae, 0xb1, 0x4a, 0x37, 0x1b, 0x6d, 0xc4, 0x4a, - 0x4c, 0x62, 0x25, 0x8b, 0x9f, 0x1b, 0x80, 0x91, 0xdb, 0x0e, 0xb5, 0xfd, 0x76, 0x5f, 0x82, 0x2c, - 0xfb, 0x2d, 0x9a, 0x8c, 0x32, 0xef, 0x38, 0xd4, 0x96, 0x65, 0xce, 0xf0, 0xe4, 0x0a, 0xf4, 0xcf, - 0x5a, 0xcb, 0x86, 0x29, 0x9a, 0x7d, 0x6a, 0x7b, 0xab, 0x30, 0xde, 0x62, 0x00, 0x89, 0x92, 0x53, - 0x90, 0x8f, 0xc2, 0x48, 0x75, 0x8d, 0xe9, 0x90, 0x65, 0x6a, 0xae, 0x65, 0x8b, 0xd6, 0xa2, 0x74, - 0x0d, 0x09, 0x2e, 0x15, 0x0c, 0xd1, 0x93, 0x57, 0x00, 0x4a, 0x77, 0xeb, 0xaa, 0xd5, 0xa2, 0x25, - 0x75, 0x5e, 0x28, 0x03, 0x96, 0xd6, 0x36, 0x9c, 0x86, 0x6d, 0xb5, 0x68, 0x43, 0xb3, 0xe5, 0x6a, - 0x25, 0x6a, 0x32, 0x05, 0x63, 0x25, 0x1c, 0x15, 0x2a, 0xfd, 0x74, 0x87, 0x3a, 0xae, 0xa3, 0xf4, - 0x3f, 0x9a, 0xb9, 0x3c, 0x34, 0xf9, 0xf0, 0xf6, 0x56, 0xe1, 0x3c, 0x1f, 0x2f, 0x0d, 0x5b, 0xa0, - 0x24, 0x16, 0x91, 0x42, 0x64, 0x12, 0x46, 0x4b, 0xef, 0x74, 0x6c, 0x5a, 0xd5, 0xa9, 0xe9, 0x1a, - 0xee, 0xa6, 0xd0, 0x90, 0x8b, 0xdb, 0x5b, 0x05, 0x45, 0x63, 0x88, 0x86, 0x21, 0x30, 0x12, 0x93, - 0x70, 0x11, 0xb2, 0x00, 0x13, 0x37, 0xca, 0xb5, 0x3a, 0xb5, 0xd7, 0x8d, 0x26, 0x2d, 0x35, 0x9b, - 0x56, 0xc7, 0x74, 0x95, 0x01, 0xe4, 0xf3, 0xd8, 0xf6, 0x56, 0xe1, 0xe1, 0xe5, 0x66, 0xbb, 0xe1, - 0x70, 0x6c, 0x43, 0xe3, 0x68, 0x89, 0x59, 0xbc, 0x2c, 0xf9, 0x38, 0x8c, 0x2e, 0xda, 0x4c, 0x0b, - 0xf5, 0x0a, 0x65, 0x70, 0x65, 0x10, 0xf5, 0xff, 0xec, 0x55, 0x31, 0x53, 0x71, 0xa8, 0xd7, 0xb3, - 0xbc, 0xb1, 0x2e, 0x2f, 0xd0, 0xd0, 0x11, 0x27, 0x37, 0x36, 0xc4, 0x8a, 0x50, 0x50, 0xd8, 0xc7, - 0x1b, 0x36, 0xd5, 0x63, 0xda, 0x36, 0x84, 0x6d, 0xbe, 0xb2, 0xbd, 0x55, 0x78, 0xd2, 0x16, 0x34, - 0x8d, 0x9e, 0x6a, 0xd7, 0x95, 0x15, 0x99, 0x82, 0x41, 0xa6, 0x4d, 0xb7, 0x0c, 0x53, 0x57, 0xe0, - 0xd1, 0xd4, 0xe5, 0xb1, 0xeb, 0x79, 0xaf, 0xf5, 0x1e, 0x7c, 0xf2, 0xdc, 0xf6, 0x56, 0xe1, 0x14, - 0xd3, 0xc1, 0xc6, 0xaa, 0x61, 0xca, 0x53, 0x84, 0x5f, 0x94, 0x8d, 0xa2, 0x49, 0xcb, 0xc5, 0xa1, - 0x3b, 0x1c, 0x8c, 0xa2, 0x25, 0xcb, 0x8d, 0x0e, 0x5b, 0x8f, 0x8c, 0x94, 0x61, 0x74, 0xd2, 0x72, - 0xab, 0xa6, 0xe3, 0x6a, 0x66, 0x93, 0x56, 0x2b, 0xca, 0x08, 0x96, 0x43, 0xb5, 0x60, 0xe5, 0x0c, - 0x81, 0x69, 0x84, 0x26, 0xa5, 0x70, 0x19, 0x32, 0x07, 0xc0, 0x9a, 0xb0, 0x60, 0x1b, 0x6c, 0x20, - 0x8c, 0x62, 0xfb, 0x89, 0xdc, 0x7e, 0x8e, 0x99, 0x3c, 0xbf, 0xbd, 0x55, 0x38, 0x83, 0x5f, 0x60, - 0x21, 0x40, 0xd6, 0xd5, 0x80, 0xac, 0xf8, 0xef, 0xb2, 0x30, 0xc6, 0xba, 0x58, 0x1a, 0x8d, 0x25, - 0x36, 0xb1, 0x30, 0x08, 0x6b, 0xb4, 0xd3, 0xd6, 0x9a, 0x54, 0x0c, 0x4c, 0x14, 0x8a, 0xe9, 0x01, - 0x25, 0x86, 0x51, 0x7a, 0x72, 0x05, 0x06, 0x39, 0xa8, 0x5a, 0x11, 0x63, 0x75, 0x74, 0x7b, 0xab, - 0x30, 0xe4, 0x20, 0xac, 0x61, 0xe8, 0xaa, 0x8f, 0x66, 0x83, 0x85, 0xff, 0x3d, 0x63, 0x39, 0x2e, - 0x63, 0x2e, 0x86, 0x2a, 0x4a, 0x45, 0x14, 0x58, 0x11, 0x28, 0x79, 0xb0, 0x84, 0x0b, 0x91, 0x97, - 0x01, 0x38, 0xa4, 0xa4, 0xeb, 0xb6, 0x18, 0xaf, 0x28, 0x02, 0xc1, 0x42, 0xd3, 0x75, 0x79, 0xb0, - 0x4b, 0xc4, 0x64, 0x0d, 0x46, 0xf8, 0xaf, 0x59, 0x6d, 0x89, 0xb6, 0xf8, 0x60, 0x1d, 0xbe, 0x7e, - 0xd9, 0x93, 0x69, 0x58, 0x3a, 0x57, 0x65, 0xd2, 0x29, 0xd3, 0xb5, 0x37, 0x27, 0x0b, 0x62, 0x7e, - 0x3f, 0x27, 0xaa, 0x6a, 0x21, 0x4e, 0x9e, 0x59, 0xe4, 0x32, 0x6c, 0xda, 0x9f, 0xb6, 0xec, 0x0d, - 0xcd, 0xd6, 0xa9, 0x3e, 0xb9, 0x29, 0x4f, 0xfb, 0xf7, 0x3c, 0x70, 0x63, 0x49, 0xd6, 0x64, 0x99, - 0x9c, 0xe9, 0x10, 0xe7, 0x56, 0xef, 0x2c, 0xa1, 0x06, 0x0f, 0xc4, 0xa4, 0xe5, 0x74, 0x96, 0xa2, - 0x5a, 0x1b, 0x2e, 0xc3, 0x66, 0x16, 0x0e, 0xb8, 0x43, 0x6d, 0xb6, 0x26, 0xe0, 0x20, 0x16, 0x33, - 0x8b, 0x60, 0xb2, 0xce, 0x31, 0x71, 0x1e, 0xa2, 0xc8, 0x85, 0xd7, 0x61, 0x22, 0x26, 0x0a, 0x92, - 0x87, 0xcc, 0x2a, 0xdd, 0xe4, 0xea, 0xa2, 0xb2, 0x3f, 0xc9, 0x69, 0xe8, 0x5f, 0xd7, 0x5a, 0x1d, - 0xb1, 0x22, 0xab, 0xfc, 0xc7, 0x2b, 0xe9, 0x0f, 0xa7, 0xd8, 0x02, 0x46, 0xca, 0x96, 0x69, 0xd2, - 0xa6, 0x2b, 0xaf, 0x61, 0x2f, 0xc1, 0xd0, 0xac, 0xd5, 0xd4, 0x5a, 0xd8, 0x8f, 0x5c, 0xef, 0x94, - 0xed, 0xad, 0xc2, 0x69, 0xd6, 0x81, 0x57, 0x5b, 0x0c, 0x23, 0xb5, 0x29, 0x20, 0x65, 0x0a, 0xa0, - 0xd2, 0x35, 0xcb, 0xa5, 0x58, 0x30, 0x1d, 0x28, 0x00, 0x16, 0xb4, 0x11, 0x25, 0x2b, 0x40, 0x40, - 0x4c, 0xae, 0xc1, 0x60, 0x8d, 0x2d, 0xdb, 0x4d, 0xab, 0x25, 0x94, 0x0f, 0x57, 0x16, 0x5c, 0xca, - 0xe5, 0xa1, 0xef, 0x11, 0x15, 0x67, 0x60, 0xac, 0xdc, 0x32, 0xa8, 0xe9, 0xca, 0xad, 0x66, 0x83, - 0xaa, 0xb4, 0x4c, 0x4d, 0x57, 0x6e, 0x35, 0x0e, 0x40, 0x8d, 0x41, 0xe5, 0x56, 0xfb, 0xa4, 0xc5, - 0xdf, 0xcd, 0xc0, 0xf9, 0x5b, 0x9d, 0x25, 0x6a, 0x9b, 0xd4, 0xa5, 0x8e, 0x58, 0xdf, 0x7d, 0xae, - 0xf3, 0x30, 0x11, 0x43, 0x0a, 0xee, 0xb8, 0xee, 0xae, 0xfa, 0xc8, 0x86, 0x30, 0x19, 0xe4, 0xc9, - 0x3b, 0x56, 0x94, 0xcc, 0xc0, 0x78, 0x00, 0x64, 0x8d, 0x70, 0x94, 0x34, 0xae, 0x4c, 0x8f, 0x6c, - 0x6f, 0x15, 0x2e, 0x48, 0xdc, 0x58, 0xb3, 0x65, 0x0d, 0x8e, 0x16, 0x23, 0xb7, 0x20, 0x1f, 0x80, - 0x6e, 0xd8, 0x56, 0xa7, 0xed, 0x28, 0x19, 0x64, 0x55, 0xd8, 0xde, 0x2a, 0x3c, 0x24, 0xb1, 0x5a, - 0x46, 0xa4, 0x6c, 0x0f, 0x44, 0x0b, 0x92, 0xcf, 0xa6, 0x64, 0x6e, 0x62, 0x14, 0x66, 0x71, 0x14, - 0x7e, 0xc8, 0x1b, 0x85, 0x5d, 0x85, 0x74, 0x35, 0x5a, 0x52, 0x0c, 0xca, 0x48, 0x33, 0x62, 0x83, - 0x32, 0x56, 0xe3, 0x85, 0x32, 0x9c, 0x49, 0xe4, 0xb5, 0x27, 0xad, 0xfe, 0xb7, 0x19, 0x99, 0x4b, - 0xcd, 0xd2, 0xfd, 0xce, 0x5c, 0x90, 0x3b, 0xb3, 0x66, 0xe9, 0xb8, 0x72, 0xa4, 0x82, 0xa5, 0x58, - 0x6a, 0x6c, 0xdb, 0xd2, 0xa3, 0x8b, 0x48, 0xbc, 0x2c, 0xf9, 0x14, 0x9c, 0x8d, 0x01, 0xf9, 0x74, - 0xcd, 0xb5, 0xff, 0xd2, 0xf6, 0x56, 0xa1, 0x98, 0xc0, 0x35, 0x3a, 0x7b, 0x77, 0xe1, 0x42, 0x34, - 0x38, 0x27, 0x49, 0xdd, 0x32, 0x5d, 0xcd, 0x30, 0x85, 0xad, 0xca, 0x47, 0xc9, 0x07, 0xb6, 0xb7, - 0x0a, 0x8f, 0xcb, 0x3a, 0xe8, 0xd1, 0x44, 0x1b, 0xdf, 0x8d, 0x0f, 0xd1, 0x41, 0x49, 0x40, 0x55, - 0xd7, 0xb4, 0x65, 0xcf, 0x00, 0xbf, 0xbc, 0xbd, 0x55, 0x78, 0x22, 0xb1, 0x0e, 0x83, 0x51, 0xc9, - 0x0b, 0x7e, 0x37, 0x4e, 0x44, 0x05, 0x12, 0xe0, 0xe6, 0x2d, 0x9d, 0xe2, 0x37, 0xf4, 0x23, 0xff, - 0xe2, 0xf6, 0x56, 0xe1, 0x11, 0x89, 0xbf, 0x69, 0xe9, 0x34, 0xda, 0xfc, 0x84, 0xd2, 0xc5, 0x5f, - 0xcc, 0xc0, 0x23, 0xf5, 0xd2, 0xdc, 0x6c, 0x55, 0xf7, 0x2c, 0xa4, 0x9a, 0x6d, 0xad, 0x1b, 0xba, - 0x34, 0x7a, 0x97, 0xe0, 0x5c, 0x04, 0x35, 0x85, 0x46, 0x99, 0x6f, 0x9b, 0xe3, 0xb7, 0x79, 0xd6, - 0x57, 0x5b, 0xd0, 0x34, 0xb8, 0xe5, 0x16, 0xb6, 0x01, 0xba, 0x31, 0x62, 0x7d, 0x14, 0x41, 0xd5, - 0x57, 0x2c, 0xdb, 0x6d, 0x76, 0x5c, 0xa1, 0x04, 0xd8, 0x47, 0xb1, 0x3a, 0x1c, 0x41, 0xd4, 0xa3, - 0x0a, 0x8f, 0x0f, 0xf9, 0x5c, 0x0a, 0xf2, 0x25, 0xd7, 0xb5, 0x8d, 0xa5, 0x8e, 0x4b, 0xe7, 0xb4, - 0x76, 0xdb, 0x30, 0x97, 0x71, 0xac, 0x0f, 0x5f, 0x7f, 0xcd, 0x5f, 0x23, 0x7b, 0x4a, 0xe2, 0x6a, - 0xb4, 0xb8, 0x34, 0x44, 0x35, 0x0f, 0xd5, 0x58, 0xe3, 0x38, 0x79, 0x88, 0x46, 0xcb, 0xb1, 0x21, - 0x9a, 0xc8, 0x6b, 0x4f, 0x43, 0xf4, 0x4b, 0x19, 0xb8, 0xb8, 0xb0, 0xea, 0x6a, 0x2a, 0x75, 0xac, - 0x8e, 0xdd, 0xa4, 0xce, 0xed, 0xb6, 0xae, 0xb9, 0x34, 0x18, 0xa9, 0x05, 0xe8, 0x2f, 0xe9, 0x3a, - 0xd5, 0x91, 0x5d, 0x3f, 0xdf, 0x45, 0x6a, 0x0c, 0xa0, 0x72, 0x38, 0x79, 0x12, 0x06, 0x44, 0x19, - 0xe4, 0xde, 0x3f, 0x39, 0xbc, 0xbd, 0x55, 0x18, 0xe8, 0x70, 0x90, 0xea, 0xe1, 0x18, 0x59, 0x85, - 0xb6, 0x28, 0x23, 0xcb, 0x04, 0x64, 0x3a, 0x07, 0xa9, 0x1e, 0x8e, 0x7c, 0x0c, 0xc6, 0x90, 0xad, - 0xdf, 0x1e, 0x31, 0xf7, 0x9d, 0xf6, 0xa4, 0x2b, 0x37, 0x96, 0x2f, 0x4d, 0xd8, 0x9a, 0x86, 0xed, - 0x15, 0x50, 0x23, 0x0c, 0xc8, 0x5d, 0xc8, 0x8b, 0x46, 0x04, 0x4c, 0xfb, 0x7b, 0x30, 0x3d, 0xb3, - 0xbd, 0x55, 0x98, 0x10, 0xed, 0x97, 0xd8, 0xc6, 0x98, 0x30, 0xc6, 0xa2, 0xd9, 0x01, 0xe3, 0xdc, - 0x4e, 0x8c, 0xc5, 0x17, 0xcb, 0x8c, 0xa3, 0x4c, 0x8a, 0x6f, 0xc1, 0x88, 0x5c, 0x90, 0x9c, 0xc5, - 0x9d, 0x3a, 0x1f, 0x27, 0xb8, 0xc7, 0x37, 0x74, 0xdc, 0x9e, 0x3f, 0x07, 0xc3, 0x15, 0xea, 0x34, - 0x6d, 0xa3, 0xcd, 0xac, 0x06, 0xa1, 0xe4, 0xe3, 0xdb, 0x5b, 0x85, 0x61, 0x3d, 0x00, 0xab, 0x32, - 0x4d, 0xf1, 0xff, 0x4a, 0xc1, 0x59, 0xc6, 0xbb, 0xe4, 0x38, 0xc6, 0xb2, 0xb9, 0x26, 0x2f, 0xdb, - 0x4f, 0x43, 0xae, 0x8e, 0xf5, 0x89, 0x9a, 0x4e, 0x6f, 0x6f, 0x15, 0xf2, 0xbc, 0x05, 0x92, 0x1e, - 0x0a, 0x1a, 0x7f, 0x9b, 0x9a, 0xde, 0x61, 0x9b, 0xca, 0x4c, 0x5a, 0x57, 0xb3, 0x5d, 0xc3, 0x5c, - 0xae, 0xbb, 0x9a, 0xdb, 0x71, 0x42, 0x26, 0xad, 0xc0, 0x34, 0x1c, 0x44, 0x85, 0x4c, 0xda, 0x50, - 0x21, 0xf2, 0x3a, 0x8c, 0x4c, 0x99, 0x7a, 0xc0, 0x84, 0x4f, 0x88, 0x0f, 0x31, 0x4b, 0x93, 0x22, - 0x3c, 0xce, 0x22, 0x54, 0xa0, 0xf8, 0x9d, 0x14, 0x28, 0x7c, 0x4f, 0x39, 0x6b, 0x38, 0xee, 0x1c, - 0x5d, 0x5b, 0x92, 0x66, 0xa7, 0x69, 0x6f, 0x93, 0xca, 0x70, 0xd2, 0x5a, 0x84, 0xa6, 0x80, 0xd8, - 0xa4, 0xb6, 0x0c, 0x27, 0xb6, 0x9b, 0x89, 0x94, 0x22, 0x55, 0x18, 0xe0, 0x9c, 0xb9, 0x2d, 0x31, - 0x7c, 0x5d, 0xf1, 0x14, 0x21, 0x5a, 0x35, 0x57, 0x86, 0x35, 0x4e, 0x2c, 0xef, 0x8f, 0x44, 0x79, - 0x52, 0x85, 0xf1, 0xa0, 0xcc, 0xa2, 0xe1, 0xb6, 0xbc, 0x45, 0x80, 0xcf, 0x14, 0x52, 0x9b, 0x5c, - 0x86, 0x94, 0xed, 0x93, 0x48, 0xb9, 0xe2, 0x57, 0x32, 0x90, 0x8f, 0xd6, 0x4f, 0xee, 0xc2, 0xe0, - 0x4d, 0xcb, 0x30, 0xa9, 0xbe, 0x60, 0xe2, 0xc7, 0xf6, 0x3e, 0xb6, 0xf1, 0xcc, 0xfa, 0x53, 0x6f, - 0x63, 0x99, 0x86, 0x6c, 0x0c, 0xe3, 0x29, 0x8e, 0xcf, 0x8c, 0x7c, 0x1c, 0x86, 0x98, 0x39, 0xb9, - 0x8e, 0x9c, 0xd3, 0x3b, 0x72, 0x7e, 0x54, 0x70, 0x3e, 0x6d, 0xf3, 0x42, 0x71, 0xd6, 0x01, 0x3b, - 0xa6, 0xa2, 0x2a, 0xd5, 0x1c, 0xcb, 0x14, 0x4a, 0x84, 0x2a, 0x6a, 0x23, 0x44, 0x56, 0x51, 0x4e, - 0xc3, 0xac, 0x60, 0xfe, 0xb1, 0xd8, 0xa3, 0xd2, 0x36, 0x88, 0x8b, 0x3d, 0xda, 0x99, 0x12, 0x31, - 0x31, 0x61, 0x5c, 0xf4, 0xcd, 0x8a, 0xd1, 0xc6, 0x0d, 0x04, 0x2e, 0x91, 0x63, 0xd7, 0x2f, 0x5d, - 0xf5, 0x8e, 0xeb, 0xae, 0x4a, 0x87, 0x7d, 0xeb, 0xcf, 0x5d, 0x9d, 0xf3, 0xc9, 0x71, 0xcf, 0x8c, - 0xea, 0x1d, 0x61, 0x21, 0x2b, 0xce, 0x5a, 0x88, 0xbc, 0xf8, 0x7d, 0x69, 0x78, 0x26, 0xe8, 0x22, - 0x95, 0xae, 0x1b, 0x74, 0x23, 0xe0, 0x28, 0x76, 0xef, 0x6c, 0xb4, 0x3a, 0xe5, 0x15, 0xcd, 0x5c, - 0xa6, 0x3a, 0xb9, 0x02, 0xfd, 0xaa, 0xd5, 0xa2, 0x8e, 0x92, 0x42, 0x4b, 0x13, 0x67, 0x42, 0x9b, - 0x01, 0xe4, 0xe3, 0x1f, 0xa4, 0x20, 0x16, 0xe4, 0x16, 0x6d, 0xcd, 0x70, 0x3d, 0xa5, 0x2c, 0xc5, - 0x95, 0x72, 0x17, 0x35, 0x5e, 0xe5, 0x3c, 0xf8, 0x72, 0x85, 0x82, 0x77, 0x11, 0x20, 0x0b, 0x9e, - 0x93, 0x5c, 0x78, 0x19, 0x86, 0x25, 0xe2, 0x3d, 0xad, 0x47, 0x9f, 0xed, 0x97, 0x87, 0xa9, 0xd7, - 0x2c, 0x31, 0x4c, 0xaf, 0xb1, 0xe1, 0xe5, 0x38, 0xcc, 0x20, 0xe2, 0xe3, 0x53, 0x0c, 0x22, 0x04, - 0x85, 0x07, 0x11, 0x82, 0xc8, 0xf3, 0x30, 0xc8, 0x59, 0xf8, 0x5b, 0x6f, 0xdc, 0xb6, 0xdb, 0x08, - 0x0b, 0x5b, 0x15, 0x3e, 0x21, 0xf9, 0xe9, 0x14, 0x3c, 0xdc, 0x53, 0x12, 0xa8, 0x7c, 0xc3, 0xd7, - 0x5f, 0xdc, 0x97, 0x18, 0x27, 0x9f, 0xd9, 0xde, 0x2a, 0x5c, 0x91, 0x34, 0xc3, 0x96, 0x68, 0x1a, - 0x4d, 0x4e, 0x24, 0xb5, 0xab, 0x77, 0x53, 0x98, 0xdd, 0xcb, 0x2b, 0x9d, 0xc6, 0x43, 0x34, 0xb3, - 0xb9, 0xe9, 0x35, 0x32, 0x1b, 0xd8, 0xbd, 0xe2, 0x7b, 0xef, 0x79, 0x24, 0x09, 0xd5, 0x74, 0xe1, - 0x42, 0x9a, 0x70, 0x8e, 0x63, 0x2a, 0xda, 0xe6, 0xc2, 0xbd, 0x39, 0xcb, 0x74, 0x57, 0xbc, 0x0a, - 0xfa, 0xe5, 0x53, 0x28, 0xac, 0x40, 0xd7, 0x36, 0x1b, 0xd6, 0xbd, 0xc6, 0x1a, 0xa3, 0x4a, 0xa8, - 0xa3, 0x1b, 0x27, 0xb6, 0x46, 0x88, 0x31, 0xee, 0xcd, 0x9e, 0xb9, 0xe0, 0x8c, 0xd0, 0x9b, 0x17, - 0xe2, 0x73, 0x65, 0xa4, 0x50, 0xd2, 0x94, 0x39, 0xb0, 0xcf, 0x29, 0xb3, 0x0a, 0x23, 0xb3, 0x56, - 0x73, 0xd5, 0xd7, 0xbc, 0x97, 0x21, 0xb7, 0xa8, 0xd9, 0xcb, 0xd4, 0x45, 0xb1, 0x0e, 0x5f, 0x9f, - 0xb8, 0xca, 0x8f, 0xf0, 0x19, 0x11, 0x47, 0x4c, 0x8e, 0x89, 0x89, 0x2c, 0xe7, 0xe2, 0x6f, 0x55, - 0x14, 0x28, 0xfe, 0x83, 0x1c, 0x8c, 0x88, 0xe3, 0x66, 0x5c, 0xd3, 0xc8, 0x2b, 0xc1, 0x01, 0xbe, - 0x98, 0x79, 0xfd, 0x23, 0x37, 0xff, 0xa8, 0x70, 0x84, 0x31, 0xfb, 0xbd, 0xad, 0x42, 0x6a, 0x7b, - 0xab, 0xd0, 0xa7, 0x0e, 0x4a, 0x5b, 0xeb, 0x60, 0xd5, 0x95, 0xcc, 0x0c, 0xf9, 0x00, 0x39, 0x52, - 0x96, 0xaf, 0xc2, 0xaf, 0xc3, 0x80, 0x68, 0x83, 0x50, 0xde, 0x73, 0xc1, 0x89, 0x4e, 0xe8, 0xd8, - 0x3c, 0x52, 0xda, 0x2b, 0x45, 0x5e, 0x83, 0x1c, 0x3f, 0xe1, 0x10, 0x02, 0x38, 0x9b, 0x7c, 0x22, - 0x14, 0x29, 0x2e, 0xca, 0x90, 0x19, 0x80, 0xe0, 0x74, 0xc3, 0xbf, 0x25, 0x10, 0x1c, 0xe2, 0xe7, - 0x1e, 0x11, 0x2e, 0x52, 0x59, 0xf2, 0x12, 0x8c, 0x2c, 0x52, 0x7b, 0xcd, 0x30, 0xb5, 0x56, 0xdd, - 0x78, 0xc7, 0xbb, 0x28, 0x40, 0xf3, 0xc3, 0x31, 0xde, 0x91, 0xfb, 0x34, 0x44, 0x47, 0x3e, 0x99, - 0x74, 0x7a, 0x30, 0x80, 0x0d, 0x79, 0x6c, 0xc7, 0x6d, 0x75, 0xa4, 0x3d, 0x09, 0x87, 0x09, 0x1f, - 0x83, 0xd1, 0xd0, 0xc6, 0x51, 0x9c, 0x04, 0x3f, 0x1c, 0x67, 0x2d, 0xed, 0x82, 0x23, 0x6c, 0xc3, - 0x1c, 0xd8, 0xa0, 0xa8, 0x9a, 0x86, 0x6b, 0x68, 0xad, 0xb2, 0xb5, 0xb6, 0xa6, 0x99, 0xba, 0x32, - 0x14, 0x0c, 0x0a, 0x83, 0x63, 0x1a, 0x4d, 0x8e, 0x92, 0x07, 0x45, 0xb8, 0x10, 0xb9, 0x05, 0x79, - 0xd1, 0x87, 0x2a, 0x6d, 0x5a, 0x36, 0xb3, 0x88, 0xf0, 0xa0, 0x57, 0x8c, 0x0a, 0x87, 0xe3, 0x1a, - 0xb6, 0x87, 0x94, 0xb7, 0x1c, 0xd1, 0x82, 0x6c, 0x02, 0xae, 0x9a, 0xeb, 0x06, 0x33, 0xe2, 0x47, - 0xb0, 0x31, 0x38, 0x01, 0x1b, 0x1c, 0x24, 0x4f, 0xc0, 0x82, 0x4a, 0x5a, 0xb0, 0x47, 0x77, 0x5e, - 0xb0, 0x6f, 0x66, 0x07, 0x87, 0xf3, 0x23, 0xd1, 0xa3, 0xff, 0xe2, 0xdf, 0xcd, 0xc0, 0xb0, 0x68, - 0x09, 0x33, 0x32, 0x4e, 0xc6, 0xcf, 0x41, 0xc6, 0x4f, 0xe2, 0x38, 0xc8, 0x1d, 0xd6, 0x38, 0x28, - 0x7e, 0x3e, 0xed, 0x4f, 0x76, 0x35, 0xdb, 0x30, 0x0f, 0x36, 0xd9, 0x5d, 0x02, 0x28, 0xaf, 0x74, - 0xcc, 0x55, 0x7e, 0xc5, 0x99, 0x0e, 0xae, 0x38, 0x9b, 0x86, 0x2a, 0x61, 0xc8, 0xc3, 0x90, 0xad, - 0x30, 0xfe, 0xac, 0x67, 0x46, 0x26, 0x87, 0xbe, 0xc9, 0x39, 0xa5, 0x9e, 0x51, 0x11, 0xcc, 0x76, - 0xb0, 0x93, 0x9b, 0x2e, 0xe5, 0x7b, 0x86, 0x0c, 0xdf, 0xc1, 0x2e, 0x31, 0x80, 0xca, 0xe1, 0xe4, - 0x05, 0x98, 0xa8, 0xd0, 0x96, 0xb6, 0x39, 0x67, 0xb4, 0x5a, 0x86, 0x43, 0x9b, 0x96, 0xa9, 0x3b, - 0x28, 0x64, 0x51, 0xdd, 0x9a, 0xa3, 0xc6, 0x09, 0x48, 0x11, 0x72, 0x0b, 0xf7, 0xee, 0x39, 0xd4, - 0x45, 0xf1, 0x65, 0x26, 0x81, 0xcd, 0xfd, 0x16, 0x42, 0x54, 0x81, 0x29, 0x7e, 0x2d, 0xc5, 0xb6, - 0x88, 0xce, 0xaa, 0x6b, 0xb5, 0x83, 0x41, 0x74, 0x10, 0x91, 0x5c, 0x09, 0x2c, 0xa0, 0x34, 0x7e, - 0xed, 0xb8, 0xf8, 0xda, 0x01, 0x61, 0x05, 0x05, 0xb6, 0x4f, 0xe2, 0x57, 0x65, 0x76, 0xf8, 0xaa, - 0xe2, 0x9f, 0xa6, 0xe1, 0x9c, 0x68, 0x71, 0xb9, 0x65, 0xb4, 0x97, 0x2c, 0xcd, 0xd6, 0x55, 0xda, - 0xa4, 0xc6, 0x3a, 0x3d, 0x9e, 0x03, 0x2f, 0x3c, 0x74, 0xb2, 0x07, 0x18, 0x3a, 0xd7, 0x71, 0xb7, - 0xcd, 0x24, 0x83, 0xa7, 0xea, 0xdc, 0xfc, 0xc9, 0x6f, 0x6f, 0x15, 0x46, 0x74, 0x0e, 0xc6, 0x7b, - 0x15, 0x55, 0x26, 0x62, 0x4a, 0x32, 0x4b, 0xcd, 0x65, 0x77, 0x05, 0x95, 0xa4, 0x9f, 0x2b, 0x49, - 0x0b, 0x21, 0xaa, 0xc0, 0x14, 0xff, 0xb7, 0x34, 0x9c, 0x8e, 0x8a, 0xbc, 0x4e, 0x4d, 0xfd, 0x44, - 0xde, 0xef, 0x8e, 0xbc, 0xff, 0x2c, 0x03, 0x0f, 0x89, 0x32, 0xf5, 0x15, 0xcd, 0xa6, 0x7a, 0xc5, - 0xb0, 0x69, 0xd3, 0xb5, 0xec, 0xcd, 0x63, 0x6c, 0x9f, 0x1d, 0x9e, 0xd8, 0x5f, 0x80, 0x9c, 0x38, - 0x63, 0xe1, 0xeb, 0xcc, 0x98, 0xdf, 0x12, 0x84, 0xc6, 0x56, 0x28, 0x7e, 0x3e, 0x13, 0xe9, 0xac, - 0xdc, 0x6e, 0x3a, 0xeb, 0xc3, 0x30, 0xea, 0x8b, 0x1e, 0xb7, 0xe8, 0x03, 0x81, 0x31, 0xa7, 0x7b, - 0x08, 0xdc, 0xa5, 0xab, 0x61, 0x42, 0xac, 0xcd, 0x03, 0x54, 0x2b, 0x68, 0x6c, 0x8d, 0x8a, 0xda, - 0xfc, 0x72, 0x86, 0xae, 0xca, 0x44, 0xc5, 0xad, 0x2c, 0x5c, 0x48, 0xee, 0x76, 0x95, 0x6a, 0xfa, - 0x49, 0xaf, 0xbf, 0x2f, 0x7b, 0x9d, 0x3c, 0x06, 0xd9, 0x9a, 0xe6, 0xae, 0x08, 0x97, 0x09, 0xbc, - 0x78, 0xbf, 0x67, 0xb4, 0x68, 0xa3, 0xad, 0xb9, 0x2b, 0x2a, 0xa2, 0xa4, 0x39, 0x03, 0x90, 0x63, - 0xc2, 0x9c, 0x21, 0x2d, 0xf6, 0xc3, 0x8f, 0xa6, 0x2e, 0x67, 0x13, 0x17, 0xfb, 0x3f, 0xce, 0x76, - 0x9b, 0x57, 0xee, 0xda, 0x86, 0x4b, 0x4f, 0x34, 0xec, 0x44, 0xc3, 0x0e, 0xa8, 0x61, 0xbf, 0x9f, - 0x86, 0x51, 0x7f, 0x4f, 0xf6, 0x36, 0x6d, 0x1e, 0xcd, 0x5a, 0x15, 0x6c, 0x65, 0x32, 0x07, 0xde, - 0xca, 0x1c, 0x44, 0xa1, 0x8a, 0xfe, 0xde, 0x92, 0x9b, 0x06, 0x28, 0x31, 0xbe, 0xb7, 0xf4, 0x8f, - 0x80, 0x1f, 0x83, 0x81, 0x39, 0xed, 0xbe, 0xb1, 0xd6, 0x59, 0x13, 0x56, 0x3a, 0xba, 0x00, 0xae, - 0x69, 0xf7, 0x55, 0x0f, 0x5e, 0xfc, 0x17, 0x29, 0x18, 0x13, 0x42, 0x15, 0xcc, 0x0f, 0x24, 0xd5, - 0x40, 0x3a, 0xe9, 0x03, 0x4b, 0x27, 0xb3, 0x7f, 0xe9, 0x14, 0xff, 0x46, 0x06, 0x94, 0x69, 0xa3, - 0x45, 0x17, 0x6d, 0xcd, 0x74, 0xee, 0x51, 0x5b, 0x6c, 0xa7, 0xa7, 0x18, 0xab, 0x03, 0x7d, 0xa0, - 0x34, 0xa5, 0xa4, 0xf7, 0x35, 0xa5, 0x7c, 0x10, 0x86, 0x44, 0x63, 0x7c, 0xf7, 0x53, 0x1c, 0x35, - 0xb6, 0x07, 0x54, 0x03, 0x3c, 0x23, 0x2e, 0xb5, 0xdb, 0xb6, 0xb5, 0x4e, 0x6d, 0x7e, 0x15, 0x28, - 0x88, 0x35, 0x0f, 0xa8, 0x06, 0x78, 0x89, 0x33, 0xf5, 0xec, 0x45, 0x99, 0x33, 0xb5, 0xd5, 0x00, - 0x4f, 0x2e, 0xc3, 0xe0, 0xac, 0xd5, 0xd4, 0x50, 0xd0, 0x7c, 0x5a, 0x19, 0xd9, 0xde, 0x2a, 0x0c, - 0xb6, 0x04, 0x4c, 0xf5, 0xb1, 0x8c, 0xb2, 0x62, 0x6d, 0x98, 0x2d, 0x4b, 0xe3, 0x1e, 0x46, 0x83, - 0x9c, 0x52, 0x17, 0x30, 0xd5, 0xc7, 0x32, 0x4a, 0x26, 0x73, 0xf4, 0xdc, 0x1a, 0x0c, 0x78, 0xde, - 0x13, 0x30, 0xd5, 0xc7, 0x16, 0xbf, 0x96, 0x65, 0xda, 0xeb, 0x18, 0xef, 0x3c, 0xf0, 0xeb, 0x42, - 0x30, 0x60, 0xfa, 0xf7, 0x31, 0x60, 0x1e, 0x98, 0xf3, 0xc0, 0xe2, 0xbf, 0x1b, 0x00, 0x10, 0xd2, - 0x9f, 0x3a, 0xd9, 0x1c, 0x1e, 0x4c, 0x6b, 0x2a, 0x30, 0x31, 0x65, 0xae, 0x68, 0x66, 0x93, 0xea, - 0xc1, 0xa9, 0x68, 0x0e, 0x87, 0x36, 0x3a, 0xae, 0x52, 0x81, 0x0c, 0x8e, 0x45, 0xd5, 0x78, 0x01, - 0xf2, 0x1c, 0x0c, 0x57, 0x4d, 0x97, 0xda, 0x5a, 0xd3, 0x35, 0xd6, 0xa9, 0x98, 0x1a, 0xf0, 0xfa, - 0xdd, 0x08, 0xc0, 0xaa, 0x4c, 0x43, 0x5e, 0x80, 0x91, 0x9a, 0x66, 0xbb, 0x46, 0xd3, 0x68, 0x6b, - 0xa6, 0xeb, 0x28, 0x83, 0x38, 0xa3, 0xa1, 0x85, 0xd1, 0x96, 0xe0, 0x6a, 0x88, 0x8a, 0x7c, 0x12, - 0x86, 0x70, 0x6b, 0x8a, 0x3e, 0xf6, 0x43, 0x3b, 0x5e, 0xa9, 0x3e, 0x1e, 0xf8, 0x60, 0xf2, 0xc3, - 0x5d, 0xbc, 0x66, 0x8f, 0xde, 0xaa, 0xfa, 0x1c, 0xc9, 0x9b, 0x30, 0x30, 0x65, 0xea, 0xc8, 0x1c, - 0x76, 0x64, 0x5e, 0x14, 0xcc, 0xcf, 0x06, 0xcc, 0xad, 0x76, 0x84, 0xb7, 0xc7, 0x2e, 0x79, 0x94, - 0x0d, 0xbf, 0x7b, 0xa3, 0x6c, 0xe4, 0x5d, 0x38, 0x75, 0x1f, 0x3d, 0xac, 0x53, 0xf7, 0xb1, 0x7d, - 0x9e, 0xba, 0x17, 0xdf, 0x81, 0xe1, 0xc9, 0xda, 0xb4, 0x3f, 0x7a, 0xcf, 0x43, 0xa6, 0x26, 0xdc, - 0x41, 0xb2, 0xdc, 0x9e, 0x69, 0x1b, 0xba, 0xca, 0x60, 0xe4, 0x0a, 0x0c, 0x96, 0xd1, 0xc7, 0x50, - 0xdc, 0x77, 0x66, 0xf9, 0xfa, 0xd7, 0x44, 0x18, 0xba, 0x1a, 0x7b, 0x68, 0xf2, 0x24, 0x0c, 0xd4, - 0x6c, 0x6b, 0xd9, 0xd6, 0xd6, 0xc4, 0x1a, 0x8c, 0xfe, 0x38, 0x6d, 0x0e, 0x52, 0x3d, 0x5c, 0xf1, - 0x87, 0x53, 0x9e, 0xd9, 0xce, 0x4a, 0xd4, 0x3b, 0x78, 0x34, 0x8f, 0x75, 0x0f, 0xf2, 0x12, 0x0e, - 0x07, 0xa9, 0x1e, 0x8e, 0x5c, 0x81, 0xfe, 0x29, 0xdb, 0xb6, 0x6c, 0xf9, 0x5d, 0x02, 0x65, 0x00, - 0xf9, 0x62, 0x1a, 0x29, 0xc8, 0x87, 0x60, 0x98, 0xcf, 0x39, 0xfc, 0x44, 0x33, 0xd3, 0xeb, 0x4e, - 0x57, 0xa6, 0x2c, 0xfe, 0x46, 0x46, 0xb2, 0xd9, 0xb8, 0xc4, 0x1f, 0xc0, 0x5b, 0x81, 0xe7, 0x21, - 0x33, 0x59, 0x9b, 0x16, 0x13, 0xe0, 0x29, 0xaf, 0xa8, 0xa4, 0x2a, 0x91, 0x72, 0x8c, 0x9a, 0x5c, - 0x84, 0x6c, 0x8d, 0xa9, 0x4f, 0x0e, 0xd5, 0x63, 0x70, 0x7b, 0xab, 0x90, 0x6d, 0x33, 0xfd, 0x41, - 0x28, 0x62, 0xd9, 0x66, 0x86, 0xef, 0x98, 0x38, 0x36, 0xd8, 0xc7, 0x5c, 0x84, 0x6c, 0xc9, 0x5e, - 0x5e, 0x17, 0xb3, 0x16, 0x62, 0x35, 0x7b, 0x79, 0x5d, 0x45, 0x28, 0xb9, 0x06, 0xa0, 0x52, 0xb7, - 0x63, 0x9b, 0xf8, 0x64, 0x68, 0x08, 0xcf, 0xdf, 0x70, 0x36, 0xb4, 0x11, 0xda, 0x68, 0x5a, 0x3a, - 0x55, 0x25, 0x92, 0xe2, 0xdf, 0x09, 0x2e, 0x76, 0x2a, 0x86, 0xb3, 0x7a, 0xd2, 0x85, 0x7b, 0xe8, - 0x42, 0x4d, 0x1c, 0x71, 0xc6, 0x3b, 0xa9, 0x00, 0xfd, 0xd3, 0x2d, 0x6d, 0xd9, 0xc1, 0x3e, 0x14, - 0x0e, 0x7b, 0xf7, 0x18, 0x40, 0xe5, 0xf0, 0x48, 0x3f, 0x0d, 0xee, 0xdc, 0x4f, 0x5f, 0xee, 0xf7, - 0x47, 0xdb, 0x3c, 0x75, 0x37, 0x2c, 0xfb, 0xa4, 0xab, 0x76, 0xdb, 0x55, 0x97, 0x60, 0xa0, 0x6e, - 0x37, 0xa5, 0xa3, 0x0b, 0xdc, 0x0f, 0x38, 0x76, 0x93, 0x1f, 0x5b, 0x78, 0x48, 0x46, 0x57, 0x71, - 0x5c, 0xa4, 0x1b, 0x08, 0xe8, 0x74, 0xc7, 0x15, 0x74, 0x02, 0x29, 0xe8, 0x6a, 0x96, 0xed, 0x8a, - 0x8e, 0xf3, 0xe9, 0xda, 0x96, 0xed, 0xaa, 0x1e, 0x92, 0x7c, 0x10, 0x60, 0xb1, 0x5c, 0xf3, 0x5e, - 0x34, 0x0c, 0x05, 0x0e, 0x97, 0xe2, 0x29, 0x83, 0x2a, 0xa1, 0xc9, 0x22, 0x0c, 0x2d, 0xb4, 0xa9, - 0xcd, 0xb7, 0x42, 0xfc, 0x11, 0xd0, 0x07, 0x22, 0xa2, 0x15, 0xfd, 0x7e, 0x55, 0xfc, 0xef, 0x93, - 0xf3, 0xf5, 0xc5, 0xf2, 0x7e, 0xaa, 0x01, 0x23, 0xf2, 0x21, 0xc8, 0x95, 0xb8, 0x9d, 0x37, 0x8c, - 0x2c, 0x7d, 0x91, 0xe1, 0x16, 0x94, 0xa3, 0xf8, 0x9e, 0x5d, 0xc3, 0xbf, 0x55, 0x41, 0x5e, 0xbc, - 0x02, 0xf9, 0x68, 0x35, 0x64, 0x18, 0x06, 0xca, 0x0b, 0xf3, 0xf3, 0x53, 0xe5, 0xc5, 0x7c, 0x1f, - 0x19, 0x84, 0x6c, 0x7d, 0x6a, 0xbe, 0x92, 0x4f, 0x15, 0xbf, 0x2a, 0xcd, 0x20, 0x4c, 0xb5, 0x4e, - 0xae, 0x86, 0x0f, 0x74, 0xdf, 0x92, 0xc7, 0xfb, 0x50, 0x3c, 0x31, 0x58, 0x33, 0x5c, 0x97, 0xea, - 0x62, 0x95, 0xc0, 0xfb, 0x42, 0xf7, 0xbe, 0x1a, 0xc3, 0x93, 0xa7, 0x61, 0x14, 0x61, 0xe2, 0x8a, - 0x90, 0xef, 0x8f, 0x45, 0x01, 0xfb, 0xbe, 0x1a, 0x46, 0x16, 0xbf, 0x15, 0xdc, 0x0e, 0xcf, 0x52, - 0xed, 0xb8, 0xde, 0x28, 0xbe, 0x47, 0xfa, 0xab, 0xf8, 0xcb, 0xfd, 0xfc, 0x9d, 0x0d, 0x7f, 0xe3, - 0x79, 0x14, 0xa2, 0x0c, 0x8e, 0x74, 0x33, 0x7b, 0x38, 0xd2, 0x7d, 0x1a, 0x72, 0x73, 0xd4, 0x5d, - 0xb1, 0x3c, 0x17, 0x35, 0xf4, 0x09, 0x59, 0x43, 0x88, 0xec, 0x13, 0xc2, 0x69, 0xc8, 0x2a, 0x10, - 0xef, 0x01, 0xa7, 0xef, 0xed, 0xee, 0x1d, 0x21, 0x9f, 0x8b, 0xed, 0x53, 0xea, 0xf8, 0xcc, 0x1b, - 0x1f, 0x32, 0x9c, 0xf6, 0xbd, 0xe9, 0x25, 0x9f, 0xb1, 0x7f, 0xbf, 0x55, 0xc8, 0x71, 0x1a, 0x35, - 0x81, 0x2d, 0xf9, 0x18, 0x0c, 0xcd, 0x4d, 0x97, 0xc4, 0x63, 0x4e, 0xee, 0x15, 0x71, 0xde, 0x97, - 0xa2, 0x87, 0xf0, 0x45, 0x82, 0x8f, 0x9a, 0xd6, 0xee, 0x69, 0xf1, 0xb7, 0x9c, 0x01, 0x17, 0xa6, - 0x2d, 0xfc, 0x79, 0x94, 0x38, 0x5d, 0xf0, 0xb5, 0x25, 0xfc, 0x68, 0x2a, 0x2a, 0x2b, 0x8e, 0x8d, - 0x68, 0xcb, 0xe0, 0x01, 0x46, 0xf7, 0x02, 0x4c, 0x94, 0xda, 0xed, 0x96, 0x41, 0x75, 0xd4, 0x17, - 0xb5, 0xd3, 0xa2, 0x8e, 0xf0, 0x28, 0xc2, 0x17, 0x37, 0x1a, 0x47, 0x36, 0xf0, 0x09, 0x71, 0xc3, - 0xee, 0x84, 0x3d, 0x49, 0xe3, 0x65, 0xf1, 0xc5, 0x36, 0x67, 0x6f, 0xd9, 0xd5, 0x8a, 0xf0, 0x29, - 0xe2, 0x2f, 0xb6, 0x3d, 0x70, 0xd8, 0xc3, 0x52, 0x26, 0x2f, 0xfe, 0x68, 0x1a, 0xce, 0x96, 0x6d, - 0xaa, 0xb9, 0x74, 0x6e, 0xba, 0x54, 0xea, 0xa0, 0x2f, 0x60, 0xab, 0x45, 0xcd, 0xe5, 0xa3, 0x99, - 0x14, 0x5e, 0x85, 0x31, 0xbf, 0x01, 0xf5, 0xa6, 0xd5, 0xa6, 0xf2, 0xdb, 0xb7, 0xa6, 0x87, 0x69, - 0x38, 0x0c, 0xa5, 0x46, 0x48, 0xc9, 0x2d, 0x38, 0xe5, 0x43, 0x4a, 0xad, 0x96, 0xb5, 0xa1, 0xd2, - 0x8e, 0xc3, 0x1d, 0x8e, 0x07, 0xb9, 0xc3, 0x71, 0xc0, 0x41, 0x63, 0xf8, 0x86, 0xcd, 0x08, 0xd4, - 0xa4, 0x52, 0xc5, 0xaf, 0x64, 0xe0, 0xdc, 0x1d, 0xad, 0x65, 0xe8, 0x81, 0x68, 0x54, 0xea, 0xb4, - 0x2d, 0xd3, 0xa1, 0xc7, 0x68, 0x8c, 0x87, 0x06, 0x52, 0xf6, 0x50, 0x06, 0x52, 0xbc, 0x8b, 0xfa, - 0x0f, 0xdc, 0x45, 0xb9, 0x7d, 0x75, 0xd1, 0xff, 0x9a, 0x82, 0xbc, 0xf7, 0x36, 0x43, 0x7e, 0xb6, - 0x2f, 0x3d, 0x1c, 0xc0, 0x03, 0xc8, 0x88, 0x7f, 0x39, 0xe2, 0x49, 0x1d, 0x06, 0xa6, 0xee, 0xb7, - 0x0d, 0x9b, 0x3a, 0xbb, 0x70, 0x8e, 0x7f, 0x58, 0x1c, 0xb6, 0x4c, 0x50, 0x5e, 0x24, 0x76, 0xce, - 0xc2, 0xc1, 0xf8, 0xe2, 0x92, 0xbf, 0x4e, 0x99, 0xf4, 0x62, 0x11, 0xf0, 0x17, 0x97, 0xe2, 0x15, - 0x4b, 0xe8, 0x09, 0x6d, 0x40, 0x4a, 0x1e, 0x87, 0xcc, 0xe2, 0xe2, 0xac, 0x98, 0x87, 0x31, 0x06, - 0x84, 0xeb, 0xca, 0x4f, 0x4a, 0x19, 0xb6, 0xf8, 0xaf, 0xd3, 0xfc, 0x95, 0x35, 0x1f, 0xae, 0x47, - 0xa2, 0x84, 0x93, 0x30, 0xe8, 0x09, 0x5c, 0xa8, 0xa1, 0xff, 0xb0, 0x22, 0xda, 0x11, 0xd1, 0xba, - 0xfd, 0x47, 0x34, 0x05, 0xcf, 0x61, 0x9e, 0xdf, 0x22, 0xe0, 0xbe, 0x08, 0x1d, 0xe6, 0x3d, 0x37, - 0xf9, 0x0f, 0xc2, 0x90, 0x3f, 0x43, 0xc9, 0xb7, 0x07, 0xfe, 0x74, 0xa6, 0x06, 0xf8, 0xc8, 0xc4, - 0x9c, 0x3b, 0xc0, 0x32, 0xee, 0x89, 0x97, 0xf7, 0xca, 0x89, 0x78, 0x0f, 0x59, 0xbc, 0x5f, 0x10, - 0xe2, 0xe5, 0x8f, 0xac, 0x8e, 0xad, 0x78, 0x0f, 0xed, 0xe4, 0xbc, 0xf8, 0xfb, 0x29, 0x20, 0xac, - 0x59, 0x35, 0xcd, 0x71, 0x36, 0x2c, 0x5b, 0xe7, 0x4e, 0xf8, 0x47, 0x22, 0x98, 0xc3, 0xbb, 0xed, - 0xfc, 0xfe, 0x21, 0x38, 0x15, 0x72, 0x1b, 0x3e, 0xe6, 0x93, 0xd5, 0x95, 0xf0, 0x68, 0xea, 0xf5, - 0xba, 0xe7, 0x09, 0xf9, 0x3a, 0xb5, 0x3f, 0xf4, 0x46, 0x50, 0xba, 0x47, 0x7d, 0x06, 0x46, 0xc4, - 0x0f, 0xb6, 0x42, 0x7b, 0xf7, 0x64, 0x38, 0x4a, 0x1d, 0x06, 0x50, 0x43, 0x68, 0xf2, 0x22, 0x0c, - 0xb1, 0x01, 0xb3, 0x8c, 0xe1, 0x62, 0x06, 0x82, 0x97, 0x33, 0xba, 0x07, 0x94, 0xd7, 0x13, 0x9f, - 0x52, 0x72, 0xf7, 0x1e, 0xdc, 0xc5, 0xfb, 0xac, 0x4f, 0xc1, 0x70, 0xc9, 0x34, 0x2d, 0x17, 0xb7, - 0xf8, 0x8e, 0xb8, 0xd8, 0xe8, 0x6a, 0xd3, 0x3f, 0x8e, 0xf1, 0x0b, 0x02, 0xfa, 0x44, 0xa3, 0x5e, - 0x66, 0x48, 0xae, 0x7b, 0xaf, 0x7f, 0xa8, 0x2d, 0xcc, 0x53, 0xbc, 0xdc, 0xb1, 0x05, 0x2c, 0xfe, - 0xf8, 0x07, 0x3b, 0x6f, 0xb4, 0x66, 0x5b, 0x6d, 0xcb, 0xa1, 0x3a, 0x17, 0xd4, 0x70, 0x10, 0x0d, - 0xa2, 0x2d, 0x10, 0xf8, 0xd4, 0x30, 0x14, 0xba, 0x25, 0x54, 0x84, 0xdc, 0x83, 0xd3, 0xde, 0x35, - 0xb3, 0xff, 0xa8, 0xb3, 0x5a, 0x71, 0xd0, 0x65, 0x7e, 0x38, 0x88, 0x4f, 0x12, 0xa0, 0x26, 0x1f, - 0xf1, 0x2e, 0x55, 0xbc, 0x57, 0xa1, 0x0d, 0x43, 0x97, 0xbb, 0x3a, 0x91, 0x1f, 0xf9, 0x6e, 0x18, - 0x9e, 0xd3, 0xee, 0x57, 0x3a, 0xe2, 0xe4, 0x66, 0x74, 0xf7, 0x77, 0x37, 0x6b, 0xda, 0xfd, 0x86, - 0x2e, 0xca, 0x45, 0x6c, 0x0a, 0x99, 0x25, 0x69, 0xc0, 0xd9, 0x9a, 0x6d, 0xad, 0x59, 0x2e, 0xd5, - 0x23, 0xef, 0x23, 0xc7, 0x83, 0x07, 0xd5, 0x6d, 0x41, 0xd1, 0xe8, 0xf1, 0x50, 0xb2, 0x0b, 0x1b, - 0xb2, 0x06, 0xe3, 0x25, 0xc7, 0xe9, 0xac, 0xd1, 0xe0, 0x7e, 0x2b, 0xbf, 0xe3, 0x67, 0x7c, 0x40, - 0xf8, 0x3c, 0x3f, 0xa4, 0x61, 0x51, 0x7e, 0xbd, 0xd5, 0x70, 0x0d, 0xb9, 0x46, 0xfc, 0x96, 0x28, - 0x6f, 0xd6, 0xbb, 0x9e, 0x00, 0xf1, 0x69, 0xbf, 0x32, 0x81, 0xc3, 0x0b, 0x7b, 0xd7, 0x17, 0x3d, - 0x86, 0x05, 0x90, 0x7b, 0x37, 0x54, 0xe4, 0x66, 0x76, 0x70, 0x2c, 0x3f, 0xae, 0x9e, 0x8b, 0x7f, - 0x10, 0x7f, 0x39, 0xf4, 0x37, 0xd3, 0x91, 0x99, 0x88, 0xdb, 0x68, 0x07, 0x9a, 0x89, 0xe4, 0x19, - 0x25, 0xbd, 0xcf, 0x19, 0xe5, 0x89, 0xb8, 0xd7, 0x45, 0xc2, 0x34, 0xf1, 0xdd, 0x30, 0xe6, 0x95, - 0xc0, 0x76, 0x6f, 0xfa, 0x4b, 0x4d, 0xf7, 0xee, 0xb8, 0x28, 0xba, 0x23, 0x8f, 0x46, 0xea, 0x66, - 0xa4, 0x0f, 0x22, 0xfc, 0x8a, 0xdf, 0x48, 0x01, 0x04, 0x4a, 0x4c, 0x9e, 0x09, 0xc7, 0xfd, 0x4a, - 0x05, 0x57, 0x51, 0x22, 0x88, 0x47, 0x28, 0xd0, 0x17, 0xb9, 0x08, 0x59, 0x0c, 0xf4, 0x92, 0x0e, - 0x8e, 0xbe, 0x57, 0x0d, 0x53, 0x57, 0x11, 0xca, 0xb0, 0x52, 0x44, 0x06, 0xc4, 0xa2, 0xdb, 0x05, - 0xb7, 0xbc, 0x2b, 0x30, 0x5e, 0xef, 0x2c, 0xc9, 0x9d, 0x29, 0x87, 0xb2, 0x72, 0x3a, 0x4b, 0xfe, - 0x9b, 0xec, 0x50, 0x34, 0x9f, 0x70, 0x91, 0xe2, 0xd7, 0x52, 0x91, 0xfe, 0x3d, 0x42, 0xc3, 0x62, - 0x57, 0x7d, 0x5a, 0xfc, 0x76, 0x06, 0x86, 0x6b, 0x96, 0xed, 0x8a, 0xc8, 0x39, 0xc7, 0x7b, 0xa5, - 0x97, 0xf6, 0xa3, 0xd9, 0x3d, 0xec, 0x47, 0x2f, 0x42, 0x56, 0x72, 0x22, 0xe7, 0x37, 0x57, 0xba, - 0x6e, 0xab, 0x08, 0x7d, 0x97, 0x1f, 0xc5, 0xc4, 0xaf, 0xa9, 0x07, 0x0e, 0xec, 0x0c, 0xf2, 0x3d, - 0x69, 0x80, 0x37, 0x9f, 0x7b, 0xee, 0x01, 0xee, 0xd2, 0xe2, 0x4f, 0xa4, 0x60, 0x5c, 0x5c, 0xfe, - 0x4a, 0x31, 0xff, 0x06, 0xbc, 0x6b, 0x7b, 0x79, 0x26, 0xe1, 0x20, 0xd5, 0xc3, 0x31, 0xc3, 0x60, - 0xea, 0xbe, 0xe1, 0xe2, 0xfd, 0x97, 0x14, 0xf4, 0x8f, 0x0a, 0x98, 0x6c, 0x18, 0x78, 0x74, 0xe4, - 0x19, 0xef, 0x5a, 0x3b, 0x13, 0x58, 0x43, 0xac, 0xc0, 0x54, 0xe2, 0xd5, 0x76, 0xf1, 0xe7, 0xb3, - 0x90, 0x9d, 0xba, 0x4f, 0x9b, 0xc7, 0xbc, 0x6b, 0xa4, 0xc3, 0xf2, 0xec, 0x01, 0x0f, 0xcb, 0xf7, - 0xe3, 0xa7, 0xf3, 0x7a, 0xd0, 0x9f, 0xb9, 0x70, 0xf5, 0x91, 0x9e, 0x8f, 0x56, 0xef, 0xf5, 0xf4, - 0xf1, 0x73, 0xf3, 0xfa, 0x27, 0x19, 0xc8, 0xd4, 0xcb, 0xb5, 0x13, 0xbd, 0x39, 0x52, 0xbd, 0xe9, - 0xed, 0x07, 0x51, 0xf4, 0xaf, 0x36, 0x07, 0x03, 0xcf, 0xe3, 0xc8, 0x2d, 0xe6, 0x9f, 0x65, 0x60, - 0xac, 0x3e, 0xbd, 0x58, 0x93, 0x6e, 0x17, 0x6e, 0x71, 0xef, 0x50, 0xf4, 0x53, 0xe4, 0x5d, 0x7a, - 0x31, 0x66, 0x56, 0xdd, 0xae, 0x9a, 0xee, 0x4b, 0x2f, 0xdc, 0xd1, 0x5a, 0x1d, 0x8a, 0x07, 0x72, - 0xdc, 0x97, 0xdc, 0x31, 0xde, 0xa1, 0x5f, 0xc1, 0x30, 0x1b, 0x1e, 0x03, 0xf2, 0x2a, 0x64, 0x6e, - 0x0b, 0x2f, 0x9f, 0x6e, 0x7c, 0x9e, 0xbf, 0xce, 0xf9, 0xb0, 0x49, 0x30, 0xd3, 0x31, 0x74, 0xe4, - 0xc0, 0x4a, 0xb1, 0xc2, 0x37, 0x84, 0xc9, 0xb0, 0xab, 0xc2, 0xcb, 0x5e, 0xe1, 0x1b, 0xd5, 0x0a, - 0xa9, 0xc3, 0x70, 0x8d, 0xda, 0x6b, 0x06, 0x76, 0x94, 0x37, 0x67, 0xf7, 0x66, 0xc2, 0xf6, 0xaf, - 0xc3, 0xed, 0xa0, 0x10, 0x32, 0x93, 0xb9, 0x90, 0xb7, 0x00, 0xb8, 0x55, 0xb5, 0xcb, 0x38, 0xb2, - 0x0f, 0xe3, 0x6e, 0x90, 0x6f, 0x38, 0x12, 0x2c, 0x7f, 0x89, 0x19, 0x59, 0x85, 0xfc, 0x9c, 0xa5, - 0x1b, 0xf7, 0x0c, 0xee, 0xce, 0x8b, 0x15, 0xe4, 0x76, 0x76, 0xa2, 0x63, 0x1b, 0x8c, 0x35, 0xa9, - 0x5c, 0x52, 0x35, 0x31, 0xc6, 0xc5, 0x7f, 0xd8, 0x0f, 0x59, 0xd6, 0xed, 0x27, 0xe3, 0xf7, 0x20, - 0xe3, 0xb7, 0x04, 0xf9, 0xbb, 0x96, 0xbd, 0x6a, 0x98, 0xcb, 0xfe, 0x4b, 0x0b, 0x71, 0x62, 0x81, - 0xde, 0x61, 0x1b, 0x1c, 0xd7, 0xf0, 0x1f, 0x65, 0xa8, 0x31, 0xf2, 0x1d, 0x46, 0xf0, 0xcb, 0x00, - 0x3c, 0x3c, 0x03, 0xd2, 0x0c, 0x06, 0xa1, 0x61, 0x78, 0xf0, 0x06, 0x7c, 0xbc, 0x21, 0x87, 0x86, - 0x09, 0x88, 0xc9, 0x15, 0xcf, 0xbf, 0x66, 0x08, 0xdf, 0x72, 0xe0, 0xd1, 0x0c, 0xfa, 0xd7, 0xc8, - 0x46, 0x00, 0xf7, 0xb4, 0xa9, 0x01, 0x48, 0x77, 0x96, 0x10, 0x11, 0x44, 0x68, 0x72, 0x10, 0x71, - 0x1d, 0x13, 0xae, 0x2c, 0x55, 0x89, 0x07, 0x79, 0x29, 0xe2, 0x54, 0x41, 0x42, 0xdc, 0xba, 0xfa, - 0x54, 0x04, 0x4e, 0x79, 0x23, 0x3b, 0x39, 0xe5, 0x15, 0x7f, 0x26, 0x03, 0xc3, 0x8c, 0x5b, 0xbd, - 0xb3, 0xb6, 0xa6, 0xd9, 0x9b, 0x27, 0x8a, 0x7c, 0x10, 0x45, 0x6e, 0xc0, 0x84, 0xfc, 0x08, 0x83, - 0x99, 0xae, 0x5e, 0x8c, 0x30, 0x7f, 0x0b, 0x1f, 0x25, 0xe0, 0xb6, 0x25, 0xce, 0xfb, 0xae, 0x00, - 0xe3, 0x89, 0x93, 0xa3, 0xc6, 0x79, 0x15, 0x7f, 0x24, 0x05, 0xf9, 0x28, 0xd4, 0xd7, 0xfd, 0x54, - 0xa2, 0xee, 0x3f, 0x0d, 0x43, 0xc2, 0x2d, 0x43, 0xd3, 0x85, 0x97, 0xe8, 0xd8, 0xf6, 0x56, 0x01, - 0xf0, 0x4d, 0x7c, 0xc3, 0xa6, 0x9a, 0xae, 0x06, 0x04, 0xe4, 0x45, 0x18, 0xc1, 0x1f, 0x77, 0x6d, - 0xc3, 0x75, 0x29, 0xef, 0x8c, 0x2c, 0xbf, 0x2b, 0xe2, 0x05, 0x36, 0x38, 0x42, 0x0d, 0x91, 0x15, - 0x7f, 0x2b, 0x0d, 0x43, 0xf5, 0xce, 0x92, 0xb3, 0xe9, 0xb8, 0x74, 0xed, 0x98, 0xeb, 0x90, 0x77, - 0xac, 0x90, 0x4d, 0x3c, 0x56, 0x78, 0xdc, 0x1b, 0x5a, 0xd2, 0x9d, 0x86, 0xbf, 0x31, 0xf0, 0x3c, - 0x5d, 0x03, 0x2d, 0xca, 0xed, 0x5d, 0x8b, 0x8a, 0x7f, 0x3f, 0x0d, 0x79, 0xee, 0x10, 0x50, 0x31, - 0x9c, 0xe6, 0x21, 0x3c, 0x52, 0x3a, 0x7a, 0x99, 0x1e, 0xcc, 0x89, 0x66, 0x17, 0x4f, 0xbf, 0x8a, - 0x9f, 0x49, 0xc3, 0x70, 0xa9, 0xe3, 0xae, 0x94, 0x5c, 0x9c, 0xdf, 0x1e, 0xc8, 0x3d, 0xf2, 0x6f, - 0xa6, 0x60, 0x9c, 0x35, 0x64, 0xd1, 0x5a, 0xa5, 0xe6, 0x21, 0x5c, 0x89, 0x1c, 0xc6, 0x41, 0xa4, - 0x27, 0xcb, 0xcc, 0xde, 0x64, 0x89, 0x17, 0x79, 0xaa, 0xd5, 0xa2, 0xc7, 0xfb, 0x33, 0x0e, 0xf1, - 0x22, 0xcf, 0x13, 0xc8, 0x21, 0x5c, 0x1c, 0xbf, 0xbf, 0x04, 0x72, 0x08, 0x27, 0xb2, 0xef, 0x0f, - 0x81, 0xfc, 0x46, 0x0a, 0x86, 0x26, 0x2d, 0xf7, 0x98, 0x0f, 0x7c, 0xf1, 0x15, 0xc7, 0x5b, 0xcd, - 0xbd, 0xaf, 0x38, 0xde, 0xba, 0x59, 0xfc, 0xb1, 0x34, 0x9c, 0x16, 0x79, 0x2a, 0xc4, 0x19, 0xd8, - 0xc9, 0x74, 0x2c, 0x06, 0x5b, 0x5c, 0x34, 0x27, 0xf3, 0x90, 0x10, 0xcd, 0x4f, 0x65, 0xe0, 0x34, - 0xc6, 0xc1, 0x66, 0x3b, 0xaa, 0xf7, 0x81, 0x2d, 0x42, 0x9a, 0x61, 0xf7, 0x8c, 0xb9, 0x04, 0xf7, - 0x8c, 0x7f, 0xbf, 0x55, 0x78, 0x69, 0xd9, 0x70, 0x57, 0x3a, 0x4b, 0x57, 0x9b, 0xd6, 0xda, 0xb5, - 0x65, 0x5b, 0x5b, 0x37, 0xb8, 0x63, 0x82, 0xd6, 0xba, 0x16, 0xa4, 0x8f, 0x6a, 0x1b, 0x22, 0x19, - 0x54, 0x1d, 0x77, 0x4a, 0x8c, 0xab, 0xe7, 0xd8, 0xe1, 0x00, 0xdc, 0xb4, 0x0c, 0x53, 0xf8, 0x4a, - 0x73, 0x43, 0xb7, 0xbe, 0xbd, 0x55, 0x38, 0xf3, 0xb6, 0x65, 0x98, 0x8d, 0xa8, 0xc3, 0xf4, 0x5e, - 0xeb, 0x0b, 0x58, 0xab, 0x52, 0x35, 0xc5, 0x7f, 0x9e, 0x82, 0xf3, 0x61, 0x2d, 0x7e, 0x3f, 0xd8, - 0x8e, 0x7f, 0x3d, 0x0d, 0x67, 0x6e, 0xa0, 0x70, 0x7c, 0x17, 0xb3, 0x93, 0x79, 0x4b, 0x0c, 0xce, - 0x04, 0xd9, 0x9c, 0x58, 0x94, 0xdd, 0x65, 0x73, 0x32, 0xa9, 0x0b, 0xd9, 0xfc, 0x4e, 0x0a, 0x4e, - 0x2d, 0x54, 0x2b, 0xe5, 0xf7, 0xc9, 0x88, 0x8a, 0x7f, 0xcf, 0x31, 0x37, 0x38, 0x63, 0xdf, 0x73, - 0xcc, 0x4d, 0xcf, 0x2f, 0xa5, 0xe1, 0x54, 0xbd, 0x34, 0x37, 0xfb, 0x7e, 0x99, 0xc1, 0xcb, 0xb2, - 0x3f, 0xb4, 0x77, 0x08, 0x26, 0x6c, 0x01, 0xf9, 0x33, 0xef, 0x5c, 0xef, 0xee, 0x27, 0x1d, 0x17, - 0xca, 0x31, 0x9f, 0xba, 0x0f, 0x45, 0x28, 0x4c, 0xf3, 0x43, 0xd4, 0xc7, 0x5c, 0xf3, 0xff, 0x71, - 0x0e, 0x86, 0x6f, 0x75, 0x96, 0xa8, 0x70, 0xe9, 0x7a, 0xa0, 0x4f, 0x7e, 0xaf, 0xc3, 0xb0, 0x10, - 0x03, 0xde, 0x70, 0x48, 0x41, 0x41, 0x45, 0x90, 0x27, 0x1e, 0x77, 0x4d, 0x26, 0x22, 0x17, 0x21, - 0x7b, 0x87, 0xda, 0x4b, 0xf2, 0x7b, 0xf9, 0x75, 0x6a, 0x2f, 0xa9, 0x08, 0x25, 0xb3, 0xc1, 0x63, - 0x9e, 0x52, 0xad, 0x8a, 0x59, 0xb8, 0xc4, 0xa5, 0x21, 0xa6, 0x15, 0xf3, 0xdd, 0x42, 0xb5, 0xb6, - 0xc1, 0xf3, 0x77, 0xc9, 0xb1, 0x3a, 0xa2, 0x25, 0xc9, 0x3c, 0x4c, 0x84, 0xdc, 0x45, 0x31, 0x05, - 0xd5, 0x60, 0x02, 0xbb, 0xa4, 0xe4, 0x53, 0xf1, 0xa2, 0xe4, 0x75, 0x18, 0xf1, 0x80, 0xe8, 0xf8, - 0x38, 0x14, 0xe4, 0x3d, 0xf1, 0x59, 0x45, 0x72, 0x4b, 0x84, 0x0a, 0xc8, 0x0c, 0xf0, 0x12, 0x03, - 0x12, 0x18, 0x44, 0x9c, 0x75, 0x43, 0x05, 0xc8, 0x8b, 0xc8, 0x00, 0x1f, 0xa0, 0xa1, 0xc3, 0xd4, - 0x30, 0x3e, 0x26, 0xc7, 0x0b, 0x20, 0x5b, 0xc0, 0x79, 0xc8, 0x80, 0x10, 0x19, 0x59, 0x00, 0x08, - 0x1c, 0x5b, 0x44, 0x60, 0x96, 0x3d, 0xbb, 0xdc, 0x48, 0x2c, 0xe4, 0x9b, 0xbc, 0xd1, 0xfd, 0xdc, - 0xe4, 0x15, 0x7f, 0x34, 0x03, 0xc3, 0xa5, 0x76, 0xdb, 0x1f, 0x0a, 0xcf, 0x40, 0xae, 0xd4, 0x6e, - 0xdf, 0x56, 0xab, 0x72, 0x32, 0x09, 0xad, 0xdd, 0x6e, 0x74, 0x6c, 0x43, 0xf6, 0x56, 0xe7, 0x44, - 0xa4, 0x0c, 0xa3, 0xa5, 0x76, 0xbb, 0xd6, 0x59, 0x6a, 0x19, 0x4d, 0x29, 0xad, 0x1e, 0xcf, 0x63, - 0xda, 0x6e, 0x37, 0xda, 0x88, 0x89, 0xe6, 0x56, 0x0c, 0x97, 0x21, 0x9f, 0xc2, 0x70, 0x66, 0x22, - 0xab, 0x1b, 0xcf, 0x1b, 0x55, 0xf4, 0xd3, 0x48, 0x04, 0x6d, 0xbb, 0xea, 0x13, 0xf1, 0x74, 0x1b, - 0x17, 0xbd, 0x24, 0x29, 0xac, 0xa2, 0x58, 0xf6, 0xb6, 0x80, 0x25, 0x79, 0x16, 0x06, 0x4a, 0xed, - 0xb6, 0x74, 0x5b, 0x85, 0x8e, 0x6d, 0xac, 0x54, 0x34, 0x0f, 0xa7, 0x20, 0x13, 0x9f, 0x25, 0xee, - 0xb7, 0x2d, 0xdb, 0xc5, 0x21, 0x35, 0x1a, 0x7c, 0x96, 0x77, 0x21, 0x6e, 0xc9, 0x11, 0x84, 0xd4, - 0x70, 0x99, 0x0b, 0xaf, 0xc1, 0x58, 0xb8, 0xc5, 0x7b, 0xca, 0xf9, 0xf1, 0x9d, 0x14, 0x4a, 0xe5, - 0x98, 0x3f, 0xd9, 0x78, 0x1e, 0x32, 0xa5, 0x76, 0x5b, 0x4c, 0x6a, 0xa7, 0x12, 0x3a, 0x35, 0x1a, - 0x1f, 0xa2, 0xd4, 0x6e, 0x7b, 0x9f, 0x7e, 0xcc, 0xdf, 0x7e, 0xed, 0xeb, 0xd3, 0x7f, 0x83, 0x7f, - 0xfa, 0xf1, 0x7e, 0x97, 0x55, 0xfc, 0xf9, 0x0c, 0x8c, 0x97, 0xda, 0xed, 0x93, 0x04, 0x1f, 0x87, - 0x15, 0x85, 0xe2, 0x39, 0x00, 0x69, 0x8e, 0x1d, 0xf0, 0x5f, 0xa6, 0x0e, 0x4b, 0xf3, 0xab, 0x92, - 0x52, 0x25, 0x22, 0x4f, 0xfd, 0x06, 0xf7, 0xa4, 0x7e, 0x9f, 0xc9, 0xe0, 0xc4, 0x77, 0xdc, 0x23, - 0xea, 0xbd, 0x57, 0xba, 0x4d, 0xf4, 0x41, 0x6e, 0x4f, 0x7d, 0xf0, 0xeb, 0xa1, 0xc1, 0x83, 0x19, - 0x1d, 0x4e, 0x7a, 0xa1, 0xff, 0x40, 0xb6, 0xf5, 0x98, 0x2c, 0x4c, 0x11, 0xe6, 0xcb, 0x4b, 0xe5, - 0x27, 0x82, 0xce, 0x35, 0x19, 0xaa, 0x61, 0xe8, 0x6a, 0x84, 0xd6, 0xeb, 0xc3, 0x81, 0x3d, 0xf5, - 0xe1, 0x56, 0x1a, 0x03, 0x4b, 0xf8, 0x41, 0xeb, 0x0e, 0xbe, 0x45, 0xb9, 0x06, 0xc0, 0xdd, 0x17, - 0x7c, 0xff, 0xfc, 0x51, 0x1e, 0x9f, 0x8a, 0x67, 0xf8, 0x13, 0xf1, 0xa9, 0x02, 0x12, 0xdf, 0xdd, - 0x29, 0x93, 0xe8, 0xee, 0x74, 0x05, 0x06, 0x55, 0x6d, 0xe3, 0x63, 0x1d, 0x2a, 0x1e, 0x33, 0x79, - 0x31, 0x61, 0xb5, 0x8d, 0xc6, 0xa7, 0x19, 0x50, 0xf5, 0xd1, 0xa4, 0xe8, 0x47, 0x26, 0x91, 0xdc, - 0x4a, 0xf8, 0x41, 0xbb, 0x1f, 0x8f, 0x64, 0x3f, 0x8a, 0x4e, 0x5e, 0x81, 0x4c, 0xe9, 0x6e, 0x5d, - 0x48, 0xd6, 0xef, 0xda, 0xd2, 0xdd, 0xba, 0x90, 0x57, 0xd7, 0xb2, 0x77, 0xeb, 0xc5, 0xcf, 0xa4, - 0x81, 0xc4, 0x29, 0xc9, 0x4b, 0x30, 0x84, 0xd0, 0x65, 0xa6, 0x33, 0x72, 0x6a, 0xe8, 0x0d, 0xa7, - 0x61, 0x23, 0x34, 0x64, 0x21, 0x7a, 0xa4, 0xe4, 0x65, 0xcc, 0xe5, 0x2f, 0x92, 0x93, 0x86, 0x52, - 0x43, 0x6f, 0x38, 0x5e, 0xf6, 0xfb, 0x48, 0x2a, 0x7f, 0x41, 0x8c, 0xc6, 0xe5, 0xdd, 0xfa, 0x8c, - 0xe5, 0xb8, 0x42, 0xd4, 0xdc, 0xb8, 0xdc, 0x70, 0x30, 0x27, 0x79, 0xc8, 0xb8, 0xe4, 0x64, 0x98, - 0x57, 0xf1, 0x6e, 0x9d, 0xbf, 0xc2, 0xd3, 0x55, 0xcb, 0xcf, 0x61, 0xc8, 0xf3, 0x2a, 0x6e, 0x38, - 0x0d, 0xfe, 0x82, 0x4f, 0x6f, 0xd8, 0x56, 0x2b, 0x9c, 0x57, 0x31, 0x54, 0xaa, 0xf8, 0x83, 0x83, - 0x90, 0xaf, 0x68, 0xae, 0xb6, 0xa4, 0x39, 0x54, 0xda, 0x92, 0x8f, 0x7b, 0x30, 0xef, 0x73, 0x24, - 0x39, 0xe8, 0x4b, 0x09, 0x5f, 0x13, 0x2d, 0x40, 0x5e, 0x0d, 0xf8, 0xfa, 0x59, 0xaf, 0xe5, 0x34, - 0x9a, 0x4b, 0x8d, 0xb6, 0x00, 0xab, 0x31, 0x42, 0xf2, 0x34, 0x0c, 0x7b, 0x30, 0xb6, 0x8b, 0xc8, - 0x04, 0x3a, 0xa3, 0x2f, 0xb1, 0x4d, 0x84, 0x2a, 0xa3, 0xc9, 0xcb, 0x30, 0xe2, 0xfd, 0x94, 0xec, - 0x73, 0x9e, 0x13, 0x74, 0x29, 0xb6, 0x05, 0x93, 0x49, 0xe5, 0xa2, 0x38, 0xbf, 0xf5, 0x87, 0x8a, - 0x46, 0xd2, 0x6e, 0x86, 0x48, 0xc9, 0xa7, 0x61, 0xcc, 0xfb, 0x2d, 0x76, 0x1d, 0xdc, 0xfb, 0xf0, - 0x69, 0x4f, 0x09, 0xa3, 0x62, 0xbd, 0x1a, 0x26, 0xe7, 0xfb, 0x8f, 0x87, 0xbc, 0xf4, 0x8f, 0xfa, - 0x52, 0x7c, 0xfb, 0x11, 0xa9, 0x80, 0x54, 0x61, 0xc2, 0x83, 0x04, 0x1a, 0x3a, 0x10, 0x6c, 0x3b, - 0xf5, 0xa5, 0x46, 0xa2, 0x92, 0xc6, 0x4b, 0x91, 0x16, 0x5c, 0x0c, 0x01, 0x75, 0x67, 0xc5, 0xb8, - 0xe7, 0x8a, 0x3d, 0xa3, 0x08, 0xd0, 0x2e, 0x52, 0x07, 0xfb, 0x5c, 0x39, 0x8d, 0x97, 0x03, 0x3c, - 0x1c, 0x82, 0xa6, 0x27, 0x37, 0x52, 0x87, 0xd3, 0x1e, 0xfe, 0x46, 0xb9, 0x56, 0xb3, 0xad, 0xb7, - 0x69, 0xd3, 0xad, 0x56, 0xc4, 0x9e, 0x1b, 0x03, 0x77, 0xea, 0x4b, 0x8d, 0xe5, 0x66, 0x9b, 0x29, - 0x05, 0xc3, 0x85, 0x99, 0x27, 0x16, 0x26, 0x77, 0xe0, 0x8c, 0x04, 0xaf, 0x9a, 0x8e, 0xab, 0x99, - 0x4d, 0xea, 0x07, 0xcc, 0xc1, 0x43, 0x01, 0xc1, 0xd5, 0x10, 0xc8, 0x30, 0xdb, 0xe4, 0xe2, 0xe4, - 0x35, 0x18, 0xf5, 0x10, 0xfc, 0x2a, 0x72, 0x18, 0xaf, 0x22, 0x71, 0x48, 0xea, 0x4b, 0x8d, 0xe8, - 0x63, 0xf1, 0x30, 0xb1, 0xac, 0x51, 0x8b, 0x9b, 0x6d, 0x2a, 0xdc, 0x82, 0x3d, 0x8d, 0x72, 0x37, - 0xdb, 0x89, 0xca, 0xc8, 0x48, 0xc9, 0xeb, 0x81, 0x46, 0x2d, 0xd8, 0xc6, 0xb2, 0xe1, 0xa5, 0xf6, - 0x3a, 0x27, 0xf4, 0xc3, 0x42, 0x60, 0x92, 0x7e, 0x70, 0xf2, 0x0b, 0x25, 0x38, 0x95, 0xa0, 0x63, - 0x7b, 0xda, 0x31, 0x7e, 0x3e, 0x1d, 0x34, 0xe2, 0x98, 0x6f, 0x1b, 0x27, 0x61, 0xd0, 0xfb, 0x12, - 0x61, 0x3c, 0x28, 0xdd, 0x86, 0x66, 0x94, 0x87, 0x87, 0x0f, 0x89, 0xe3, 0x98, 0x6f, 0x25, 0x0f, - 0x43, 0x1c, 0xdf, 0x4c, 0x05, 0xe2, 0x38, 0xe6, 0xdb, 0xcb, 0xdf, 0xcc, 0x06, 0x73, 0xd2, 0xc9, - 0x1e, 0xf3, 0xb0, 0xcc, 0xe4, 0xc0, 0x99, 0x36, 0xb7, 0x87, 0x37, 0xc4, 0xb2, 0x6a, 0x0e, 0xec, - 0x4f, 0x35, 0xc9, 0x6b, 0x30, 0x5c, 0xb3, 0x1c, 0x77, 0xd9, 0xa6, 0x4e, 0xcd, 0x4f, 0x30, 0x82, - 0xef, 0xcf, 0xdb, 0x02, 0xdc, 0x68, 0x87, 0x83, 0xa6, 0x49, 0xe4, 0x52, 0x2c, 0xb9, 0xa1, 0xbd, - 0xc7, 0x92, 0x2b, 0xfe, 0x61, 0x26, 0xa6, 0x4b, 0xdc, 0xec, 0x3d, 0x96, 0xba, 0x74, 0x08, 0x13, - 0x05, 0xb9, 0x1e, 0xac, 0xa1, 0x7c, 0x7f, 0xd0, 0x2f, 0xc5, 0x5e, 0x5d, 0x12, 0xdb, 0x83, 0x30, - 0x09, 0xf9, 0x04, 0x9c, 0x0b, 0x01, 0x6a, 0x9a, 0xad, 0xad, 0x51, 0x37, 0x48, 0x5a, 0x8b, 0xd1, - 0xf4, 0xbc, 0xd2, 0x8d, 0xb6, 0x8f, 0x96, 0x13, 0xe1, 0x76, 0xe1, 0x20, 0x29, 0xe6, 0xc0, 0x1e, - 0xbc, 0xbc, 0xbf, 0x9c, 0x09, 0xcc, 0xa4, 0x70, 0x54, 0x6c, 0x95, 0x3a, 0x9d, 0x96, 0xfb, 0xe0, - 0x76, 0xf0, 0xfe, 0x72, 0x0e, 0xcd, 0xc0, 0x78, 0xe9, 0xde, 0x3d, 0xda, 0x74, 0xbd, 0x60, 0xff, - 0x8e, 0x88, 0x83, 0xca, 0xb7, 0x2d, 0x02, 0x25, 0x82, 0xb7, 0x3b, 0xa1, 0x34, 0xc2, 0xe1, 0x62, - 0xc5, 0x3f, 0xca, 0x82, 0xe2, 0x6f, 0x1b, 0xfc, 0xd7, 0x8e, 0x47, 0xb8, 0x44, 0xbf, 0x27, 0x7a, - 0xc5, 0x80, 0x89, 0x40, 0x18, 0xe2, 0x99, 0x99, 0xd2, 0x8f, 0xdb, 0x92, 0x42, 0x94, 0x59, 0x40, - 0xc8, 0x77, 0x22, 0x17, 0xc4, 0x4e, 0x84, 0x04, 0xaf, 0x49, 0x1b, 0x0e, 0x67, 0xa1, 0xc6, 0xb9, - 0x92, 0x2f, 0xa4, 0xe0, 0xb4, 0xd7, 0x29, 0x0b, 0x4b, 0xcc, 0x24, 0x2f, 0x5b, 0x1d, 0xd3, 0x7f, - 0x83, 0xf5, 0x4a, 0xf7, 0xea, 0x78, 0x27, 0x5d, 0x4d, 0x2a, 0xcc, 0x5b, 0xe2, 0xc7, 0xec, 0xf1, - 0x15, 0xc2, 0x42, 0x9a, 0x46, 0x13, 0x89, 0xd4, 0xc4, 0x7a, 0x2f, 0xdc, 0x80, 0xf3, 0x5d, 0x59, - 0xee, 0x64, 0x02, 0xf7, 0xcb, 0x26, 0xf0, 0x1f, 0xa4, 0x82, 0x89, 0x28, 0x22, 0x24, 0x72, 0x15, - 0x20, 0x00, 0x89, 0x4d, 0x31, 0x3e, 0xf1, 0x0a, 0x84, 0xa6, 0x4a, 0x14, 0x64, 0x01, 0x72, 0x42, - 0x2c, 0x3c, 0x41, 0xfc, 0x07, 0x77, 0xe8, 0x85, 0xab, 0xb2, 0x1c, 0x70, 0xc3, 0x2b, 0xbe, 0x59, - 0xb0, 0xb9, 0xf0, 0x32, 0x0c, 0xef, 0xf7, 0xbb, 0xbe, 0x90, 0x01, 0x22, 0xef, 0x60, 0x8f, 0xd0, - 0xbc, 0x3f, 0xc6, 0x53, 0xd8, 0x65, 0x18, 0x64, 0x9f, 0x80, 0x89, 0x88, 0xa4, 0xc0, 0xe3, 0x1d, - 0x01, 0x53, 0x7d, 0x6c, 0x10, 0xb7, 0x6f, 0x20, 0x39, 0x6e, 0x5f, 0xf1, 0x47, 0x32, 0x70, 0x56, - 0xee, 0x90, 0x0a, 0xc5, 0x5c, 0x26, 0x27, 0x9d, 0xf2, 0x2e, 0x76, 0x4a, 0x11, 0x72, 0x7c, 0xe3, - 0x22, 0x92, 0xca, 0xf0, 0x43, 0x25, 0x84, 0xa8, 0x02, 0x53, 0xfc, 0x9f, 0xd3, 0x30, 0xea, 0x1b, - 0x87, 0x9a, 0xed, 0x3c, 0xc0, 0xdd, 0xf1, 0x61, 0x18, 0xc5, 0xc8, 0x6b, 0x6b, 0xd4, 0xe4, 0xd1, - 0xc9, 0xfa, 0xa5, 0x2c, 0x50, 0x1e, 0x42, 0x24, 0xfc, 0x0b, 0x11, 0x32, 0xed, 0xe7, 0x96, 0x9f, - 0x14, 0x0f, 0x8f, 0x9b, 0x7d, 0x1c, 0x5e, 0xfc, 0x5b, 0x19, 0x18, 0xf1, 0xa4, 0x3c, 0x69, 0x1c, - 0xd7, 0x5b, 0xa2, 0xa3, 0x15, 0xf2, 0x35, 0x80, 0x9a, 0x65, 0xbb, 0x5a, 0x6b, 0x3e, 0xd0, 0x7c, - 0x3c, 0x5e, 0x6d, 0x23, 0x94, 0x97, 0x91, 0x48, 0x70, 0xfd, 0x0a, 0xcc, 0x6a, 0x3e, 0x31, 0xf1, - 0xf5, 0xcb, 0x87, 0xaa, 0x12, 0x45, 0xf1, 0x57, 0xd2, 0x30, 0xee, 0x75, 0xd2, 0xd4, 0x7d, 0xda, - 0xec, 0x3c, 0xc8, 0x73, 0x53, 0x58, 0xda, 0xfd, 0x3b, 0x4a, 0xbb, 0xf8, 0x7f, 0x4a, 0x13, 0x49, - 0xb9, 0x65, 0x9d, 0x4c, 0x24, 0x7f, 0x11, 0x3a, 0x5e, 0xfc, 0x6c, 0x06, 0x4e, 0x7b, 0x52, 0x9f, - 0xee, 0x98, 0x78, 0x30, 0x51, 0xd6, 0x5a, 0xad, 0x07, 0x79, 0x37, 0x3e, 0xec, 0x09, 0x62, 0x41, - 0x84, 0x32, 0x15, 0xc9, 0x57, 0xef, 0x09, 0x70, 0xc3, 0x32, 0x74, 0x55, 0x26, 0x22, 0xaf, 0xc3, - 0x88, 0xf7, 0xb3, 0x64, 0x2f, 0x7b, 0x5b, 0x70, 0xbc, 0x66, 0xf0, 0x0b, 0x69, 0x76, 0x28, 0x36, - 0x47, 0xa8, 0x40, 0xf1, 0x33, 0x03, 0x70, 0xe1, 0xae, 0x61, 0xea, 0xd6, 0x86, 0xe3, 0xe5, 0xee, - 0x3d, 0xf6, 0xc7, 0x6c, 0x47, 0x9d, 0xb3, 0xf7, 0x63, 0x70, 0x26, 0x2a, 0x52, 0xdb, 0xcf, 0xa8, - 0x20, 0x7a, 0x67, 0x83, 0x13, 0x34, 0xbc, 0x2c, 0xbe, 0xe2, 0xae, 0x4e, 0x4d, 0x2e, 0x19, 0x4d, - 0x03, 0x3c, 0xb0, 0x9b, 0x34, 0xc0, 0x4f, 0x41, 0xae, 0x62, 0xad, 0x69, 0x86, 0x17, 0xa5, 0x09, - 0x47, 0xb1, 0x5f, 0x2f, 0x62, 0x54, 0x41, 0xc1, 0xf8, 0x8b, 0x8a, 0xb1, 0xcb, 0x86, 0x02, 0xfe, - 0x5e, 0x01, 0x66, 0xa5, 0xa9, 0x32, 0x11, 0xb1, 0x60, 0x54, 0x54, 0x27, 0x6e, 0xd6, 0x00, 0x37, - 0x4f, 0x2f, 0x7a, 0x32, 0xea, 0xae, 0x56, 0x57, 0x43, 0xe5, 0xf8, 0x36, 0x8a, 0x67, 0x27, 0x16, - 0x1f, 0xc3, 0xef, 0xd8, 0xd4, 0x30, 0x7f, 0x49, 0x08, 0x38, 0xc9, 0x0c, 0xc7, 0x85, 0x80, 0xb3, - 0x8c, 0x4c, 0x44, 0xa6, 0x60, 0x02, 0x23, 0xd7, 0xfb, 0x5b, 0x29, 0xa6, 0x12, 0x23, 0x68, 0x54, - 0xe2, 0x85, 0x0d, 0x0f, 0x76, 0xcf, 0x3e, 0xae, 0xd1, 0x14, 0x68, 0x35, 0x5e, 0x82, 0x9c, 0x87, - 0xcc, 0xfc, 0x6c, 0x09, 0x6f, 0x7a, 0x06, 0x79, 0xce, 0x39, 0xb3, 0xa5, 0xa9, 0x0c, 0x76, 0xe1, - 0x0d, 0x20, 0xf1, 0xcf, 0xd9, 0xd3, 0x6d, 0xce, 0x3f, 0x95, 0xb6, 0x7c, 0xc7, 0xdd, 0x1f, 0xe7, - 0x30, 0x26, 0xc2, 0x50, 0xba, 0xc7, 0xfe, 0x77, 0x33, 0xdd, 0x63, 0xee, 0x50, 0xd3, 0x3d, 0x16, - 0x7f, 0x36, 0x05, 0x13, 0xb1, 0xec, 0x0e, 0xe4, 0x79, 0x00, 0x0e, 0x91, 0x22, 0xbc, 0x62, 0x00, - 0xa2, 0x20, 0xe3, 0x83, 0x58, 0x1e, 0x03, 0x32, 0x72, 0x0d, 0x06, 0xf9, 0x2f, 0x11, 0xe3, 0x2c, - 0x5e, 0xa4, 0xd3, 0x31, 0x74, 0xd5, 0x27, 0x0a, 0x6a, 0xc1, 0xfb, 0xcc, 0x4c, 0x62, 0x11, 0x77, - 0xb3, 0xed, 0xd7, 0xc2, 0xc8, 0x8a, 0x3f, 0x98, 0x86, 0x11, 0xbf, 0xc1, 0x25, 0xfd, 0xa8, 0x74, - 0x2e, 0x27, 0x12, 0x65, 0x64, 0x76, 0x4a, 0x94, 0x11, 0x99, 0x6f, 0x45, 0x66, 0x8c, 0xc3, 0x7b, - 0xd3, 0xf5, 0xc5, 0x34, 0x8c, 0xfb, 0xb5, 0x1e, 0xe1, 0xd5, 0xd9, 0x7b, 0x48, 0x24, 0x5f, 0x48, - 0x81, 0x32, 0x69, 0xb4, 0x5a, 0x86, 0xb9, 0x5c, 0x35, 0xef, 0x59, 0xf6, 0x1a, 0x4e, 0x88, 0x47, - 0x77, 0x84, 0x5b, 0xfc, 0xfe, 0x14, 0x4c, 0x88, 0x06, 0x95, 0x35, 0x5b, 0x3f, 0xba, 0xf3, 0xb1, - 0x68, 0x4b, 0x8e, 0x4e, 0x5f, 0x8a, 0xbf, 0x94, 0x06, 0x98, 0xb5, 0x9a, 0xab, 0xc7, 0xfc, 0x49, - 0xd8, 0xab, 0x90, 0xe3, 0x4e, 0xf5, 0x42, 0x63, 0x27, 0xc4, 0xd3, 0x27, 0xf6, 0x69, 0x1c, 0x31, - 0x99, 0x17, 0xf3, 0x71, 0x8e, 0xfb, 0xe5, 0x2b, 0x29, 0x55, 0x14, 0x61, 0x95, 0x32, 0x3a, 0xb1, - 0x60, 0xf8, 0x95, 0x32, 0x58, 0xb8, 0xd2, 0xed, 0xad, 0x42, 0xb6, 0x65, 0x35, 0x57, 0x55, 0xa4, - 0x2f, 0xfe, 0x3f, 0x29, 0x2e, 0xbb, 0x63, 0xfe, 0xb0, 0xd5, 0xfb, 0xfc, 0xec, 0x1e, 0x3f, 0xff, - 0xaf, 0xa6, 0xe0, 0xb4, 0x4a, 0x9b, 0xd6, 0x3a, 0xb5, 0x37, 0xcb, 0x96, 0x4e, 0x6f, 0x50, 0x93, - 0xda, 0x47, 0x35, 0xa2, 0x7e, 0x15, 0x33, 0x0b, 0x05, 0x8d, 0xb9, 0xed, 0x50, 0xfd, 0xf8, 0x64, - 0x7d, 0x2a, 0x7e, 0x7d, 0x00, 0x94, 0x44, 0xab, 0xf7, 0xd8, 0x9a, 0x73, 0x5d, 0xb7, 0x32, 0xd9, - 0xc3, 0xda, 0xca, 0xf4, 0xef, 0x6d, 0x2b, 0x93, 0xdb, 0xeb, 0x56, 0x66, 0x60, 0x37, 0x5b, 0x99, - 0xb5, 0xe8, 0x56, 0x66, 0x10, 0xb7, 0x32, 0xcf, 0xf7, 0xdc, 0xca, 0x4c, 0x99, 0xfa, 0x3e, 0x37, - 0x32, 0xc7, 0x36, 0x9f, 0xf9, 0x7e, 0x76, 0x60, 0x97, 0xd9, 0xa4, 0xd8, 0xb4, 0x6c, 0x9d, 0xea, - 0x62, 0xe3, 0x85, 0xa7, 0xfe, 0xb6, 0x80, 0xa9, 0x3e, 0x36, 0x96, 0x1c, 0x7e, 0x74, 0x37, 0xc9, - 0xe1, 0x0f, 0x61, 0xff, 0xf5, 0xe7, 0x69, 0x98, 0x28, 0x53, 0xdb, 0xe5, 0x91, 0x6c, 0x0f, 0xc3, - 0xa1, 0xae, 0x04, 0xe3, 0x12, 0x43, 0xb4, 0xc8, 0xd3, 0x81, 0x93, 0x60, 0x93, 0xda, 0x6e, 0xd4, - 0xc7, 0x30, 0x4a, 0xcf, 0xaa, 0xf7, 0x12, 0x34, 0x8a, 0xb1, 0xeb, 0x57, 0xef, 0xc1, 0xb9, 0x20, - 0x0d, 0xf1, 0x4b, 0xf5, 0xe9, 0x25, 0x3f, 0x99, 0xec, 0x3e, 0x72, 0x2e, 0xae, 0xc2, 0x69, 0xa9, - 0x31, 0xa5, 0x8e, 0xbb, 0x62, 0xd9, 0xac, 0x15, 0xfd, 0x22, 0xd0, 0xb1, 0xc7, 0x2b, 0x81, 0x46, - 0xa4, 0x92, 0x0b, 0x30, 0x0d, 0xcd, 0x43, 0xa9, 0x89, 0x4c, 0xd9, 0x96, 0x29, 0x11, 0x41, 0x2e, - 0x41, 0x16, 0xe5, 0x26, 0xe5, 0x93, 0x8b, 0x88, 0x0c, 0xf1, 0xe4, 0x69, 0x7f, 0x6a, 0x48, 0x07, - 0xae, 0xfe, 0x7c, 0x4a, 0x90, 0x1f, 0x31, 0x8a, 0xc9, 0xe1, 0x0d, 0x18, 0xa9, 0x77, 0xf0, 0xde, - 0xf9, 0x16, 0xdd, 0xf4, 0x93, 0x46, 0x60, 0xfe, 0x13, 0x87, 0xc3, 0x1b, 0xab, 0x74, 0x33, 0xec, - 0x80, 0x1a, 0x2a, 0x51, 0xfc, 0x6a, 0x0a, 0x2e, 0xa9, 0xd4, 0xa4, 0x1b, 0xda, 0x52, 0x8b, 0x4a, - 0x2d, 0x17, 0xeb, 0x26, 0x9b, 0x53, 0x0d, 0x67, 0x4d, 0x73, 0x9b, 0x2b, 0x07, 0xd2, 0xa0, 0x69, - 0x18, 0x91, 0x67, 0xf7, 0x3d, 0xcc, 0xfc, 0xa1, 0x72, 0xc5, 0xaf, 0x67, 0x61, 0x60, 0xd2, 0x72, - 0x6f, 0x5a, 0x07, 0x4c, 0x91, 0x1a, 0x2c, 0x88, 0xe9, 0x3d, 0x9c, 0x84, 0x3d, 0x8b, 0x95, 0x4b, - 0x39, 0x49, 0xd0, 0x3d, 0x77, 0xc9, 0x8a, 0xe5, 0xc7, 0xf1, 0xc8, 0xf6, 0x98, 0x1c, 0xf5, 0x25, - 0x18, 0xc2, 0xf0, 0x3c, 0xd2, 0x59, 0x35, 0x3a, 0xbf, 0xbb, 0x0c, 0x18, 0xad, 0x23, 0x20, 0x25, - 0x9f, 0x08, 0x05, 0x26, 0xce, 0x1d, 0x3c, 0x99, 0xaa, 0x1c, 0xa3, 0xf8, 0x79, 0x7e, 0xcd, 0x89, - 0x6d, 0x92, 0x52, 0x47, 0xe1, 0x19, 0x53, 0xa4, 0x49, 0x3e, 0xe1, 0x21, 0x26, 0x3a, 0x2d, 0xc3, - 0xe8, 0xa4, 0xe5, 0x4a, 0x8e, 0xd6, 0x43, 0xc1, 0x3b, 0x5d, 0x26, 0xf9, 0x64, 0x2f, 0xeb, 0x70, - 0x99, 0xe2, 0x9f, 0x65, 0x61, 0xc4, 0xfb, 0x79, 0x44, 0xba, 0xf3, 0x0c, 0xe4, 0x66, 0x2c, 0x29, - 0xb3, 0x0b, 0x3a, 0x67, 0xaf, 0x58, 0x4e, 0xc4, 0xeb, 0x5c, 0x10, 0x31, 0xa9, 0xcf, 0x5b, 0xba, - 0xfc, 0xb4, 0x00, 0xa5, 0x6e, 0x5a, 0x7a, 0xec, 0x7d, 0xb7, 0x4f, 0xc8, 0x26, 0x19, 0x7c, 0x95, - 0x21, 0x5d, 0x73, 0x44, 0x5e, 0x62, 0x20, 0x5e, 0xd2, 0xca, 0xdc, 0x5e, 0xb5, 0x72, 0x60, 0xbf, - 0x5a, 0x39, 0x78, 0xb8, 0x5a, 0xf9, 0x16, 0x8c, 0x60, 0x4d, 0x5e, 0xf2, 0xcd, 0x9d, 0xcd, 0x8e, - 0xf3, 0xc2, 0x32, 0x18, 0xe5, 0xed, 0x16, 0x29, 0x38, 0xd1, 0x20, 0x08, 0xb1, 0x8a, 0xe8, 0x2e, - 0x1c, 0xe0, 0xb0, 0xe1, 0x0f, 0x53, 0x30, 0x70, 0xdb, 0x5c, 0x35, 0xad, 0x8d, 0x83, 0x69, 0xdc, - 0xf3, 0x30, 0x2c, 0xd8, 0x48, 0x6b, 0x2f, 0x3e, 0xd9, 0xef, 0x70, 0x70, 0x03, 0x39, 0xa9, 0x32, - 0x15, 0x79, 0xcd, 0x2f, 0x84, 0x0f, 0xaf, 0x32, 0x41, 0x6e, 0x24, 0xaf, 0x50, 0x33, 0x9c, 0x1c, - 0x45, 0x26, 0x27, 0x17, 0x21, 0x5b, 0x61, 0x4d, 0x95, 0x82, 0x24, 0xb3, 0xa6, 0xa8, 0x08, 0x2d, - 0x7e, 0x3e, 0x0b, 0x63, 0x91, 0x63, 0xc1, 0xa7, 0x60, 0x48, 0x1c, 0xcb, 0x19, 0x5e, 0xb6, 0x16, - 0x7c, 0x98, 0xe5, 0x03, 0xd5, 0x41, 0xfe, 0x67, 0x55, 0x27, 0x1f, 0x85, 0x01, 0xcb, 0x41, 0x93, - 0x01, 0xbf, 0x65, 0x2c, 0x18, 0x42, 0x0b, 0x75, 0xd6, 0x76, 0x3e, 0x38, 0x04, 0x89, 0xac, 0x91, - 0x96, 0x83, 0x9f, 0xf6, 0x02, 0x0c, 0x69, 0x8e, 0x43, 0xdd, 0x86, 0xab, 0x2d, 0xcb, 0x09, 0x5c, - 0x7c, 0xa0, 0x3c, 0x3a, 0x10, 0xb8, 0xa8, 0x2d, 0x93, 0x37, 0x60, 0xb4, 0x69, 0x53, 0x34, 0x2a, - 0xb4, 0x16, 0x6b, 0xa5, 0x64, 0xf4, 0x87, 0x10, 0xf2, 0x62, 0x19, 0x20, 0xaa, 0x3a, 0xb9, 0x03, - 0xa3, 0xe2, 0x73, 0xf8, 0xab, 0x08, 0x1c, 0x68, 0x63, 0xc1, 0x32, 0xc6, 0x45, 0xc2, 0xdf, 0x45, - 0x88, 0xc7, 0x31, 0x32, 0xb9, 0xcc, 0x57, 0x97, 0x48, 0xc9, 0x02, 0x90, 0x0d, 0xba, 0x84, 0xc6, - 0x05, 0xab, 0x8b, 0xe7, 0x1f, 0x10, 0xd9, 0x6c, 0xf1, 0x45, 0x49, 0x1c, 0x2b, 0x3f, 0xb4, 0xd9, - 0xa0, 0x4b, 0xa5, 0x10, 0x92, 0xdc, 0x85, 0x33, 0xf1, 0x22, 0xec, 0x93, 0xf9, 0xd5, 0xc9, 0xe3, - 0xdb, 0x5b, 0x85, 0x42, 0x22, 0x81, 0xc4, 0xf6, 0x54, 0x8c, 0x6d, 0x55, 0xbf, 0x99, 0x1d, 0x1c, - 0xc8, 0x0f, 0xaa, 0x63, 0xac, 0xac, 0x67, 0x60, 0x1b, 0x7a, 0xf1, 0x5b, 0x29, 0x66, 0x48, 0xb3, - 0x0f, 0x9a, 0x62, 0x82, 0x60, 0xba, 0xbe, 0xb6, 0x47, 0x5d, 0x5f, 0x0b, 0x12, 0xef, 0xe6, 0x9c, - 0x1e, 0xb3, 0xab, 0x2a, 0xb0, 0xe4, 0x2a, 0xe4, 0x74, 0xf9, 0x4c, 0xf1, 0x6c, 0xb8, 0x13, 0xbc, - 0x7a, 0x54, 0x41, 0x45, 0x2e, 0x43, 0x96, 0x2d, 0x59, 0xd1, 0x03, 0x05, 0xd9, 0xba, 0x50, 0x91, - 0xa2, 0xf8, 0x3d, 0x69, 0x18, 0x91, 0xbe, 0xe6, 0xfa, 0x81, 0x3e, 0xe7, 0x95, 0xdd, 0x35, 0xd3, - 0x73, 0x09, 0xc2, 0x9d, 0xa6, 0xd7, 0xe4, 0x17, 0x7c, 0x51, 0xec, 0xea, 0xba, 0x4e, 0x08, 0xe6, - 0x25, 0xf1, 0xa1, 0xb9, 0xdd, 0x6f, 0xae, 0x19, 0xfd, 0xcd, 0xec, 0x60, 0x3a, 0x9f, 0xb9, 0x99, - 0x1d, 0xcc, 0xe6, 0xfb, 0x31, 0x50, 0x1a, 0xc6, 0x26, 0xe7, 0x27, 0x17, 0xe6, 0x3d, 0x63, 0xf9, - 0x98, 0xbf, 0xcb, 0x39, 0xdc, 0x20, 0x72, 0x11, 0xd9, 0x1c, 0xf3, 0x47, 0x3a, 0xef, 0xaa, 0x6c, - 0x4e, 0x12, 0xf5, 0x0a, 0xd9, 0xfc, 0x51, 0x0a, 0x94, 0x44, 0xd9, 0x94, 0x8e, 0xc8, 0x4b, 0xe4, - 0xf0, 0xd2, 0xf5, 0xfe, 0x49, 0x1a, 0x26, 0xaa, 0xa6, 0x4b, 0x97, 0xf9, 0x8e, 0xf1, 0x98, 0x4f, - 0x15, 0xb7, 0x60, 0x58, 0xfa, 0x18, 0xd1, 0xe7, 0x0f, 0xf9, 0xa7, 0x15, 0x01, 0xaa, 0x0b, 0x27, - 0xb9, 0xf4, 0xe1, 0xbd, 0x72, 0x8a, 0x0a, 0xf9, 0x98, 0xcf, 0x39, 0xc7, 0x43, 0xc8, 0xc7, 0x7c, - 0xf2, 0x7a, 0x8f, 0x0a, 0xf9, 0x8b, 0x19, 0x38, 0x95, 0x50, 0x39, 0xb9, 0x04, 0x03, 0xf5, 0xce, - 0x12, 0xc6, 0x45, 0x4b, 0x05, 0xfe, 0xd4, 0x4e, 0x67, 0x09, 0x43, 0xa2, 0xa9, 0x1e, 0x92, 0x2c, - 0x62, 0xe0, 0x82, 0x85, 0x6a, 0xa5, 0x2c, 0xa4, 0x5a, 0x94, 0x42, 0x30, 0x30, 0x70, 0xd2, 0x97, - 0xf9, 0xc1, 0x0d, 0x2c, 0x43, 0x6f, 0x46, 0x82, 0x1b, 0xb0, 0x32, 0xe4, 0xbb, 0x60, 0xa8, 0xf4, - 0x4e, 0xc7, 0xa6, 0xc8, 0x97, 0x4b, 0xfc, 0x09, 0x9f, 0xaf, 0x87, 0x48, 0xe2, 0xcc, 0xe3, 0x34, - 0x30, 0x8a, 0x28, 0xef, 0x80, 0x21, 0x59, 0x80, 0xdc, 0x0d, 0xc3, 0x9d, 0xe9, 0x2c, 0x89, 0x5e, - 0xf0, 0x63, 0xa7, 0x71, 0x68, 0x12, 0x5f, 0xdc, 0x95, 0xf3, 0x18, 0xd0, 0xf2, 0x1e, 0x88, 0x17, - 0x20, 0xb3, 0xd0, 0x5f, 0xba, 0x5b, 0x57, 0x4b, 0xa2, 0x27, 0x1e, 0x95, 0xa3, 0x50, 0x94, 0xba, - 0xb2, 0xc3, 0x37, 0xf5, 0x9a, 0x9c, 0x25, 0x0a, 0xe9, 0x8b, 0x3f, 0x98, 0x82, 0x0b, 0xdd, 0x85, - 0x47, 0x9e, 0x85, 0x01, 0xd5, 0x6a, 0xd1, 0x92, 0x3a, 0x2f, 0x7a, 0x86, 0x67, 0xde, 0xb6, 0x5a, - 0xb4, 0xa1, 0xd9, 0xf2, 0x5e, 0xc4, 0x23, 0x23, 0x1f, 0x81, 0xe1, 0xaa, 0xe3, 0x74, 0xa8, 0x5d, - 0x7f, 0xfe, 0xb6, 0x5a, 0x15, 0x5b, 0x56, 0xdc, 0x12, 0x19, 0x08, 0x6e, 0x38, 0xcf, 0x47, 0x02, - 0xb3, 0xc9, 0xf4, 0xc5, 0x1f, 0x48, 0xc1, 0xc5, 0x5e, 0x42, 0x27, 0xcf, 0xc3, 0xe0, 0x22, 0x35, - 0x35, 0xd3, 0xad, 0x56, 0x44, 0x93, 0x70, 0x07, 0xe8, 0x22, 0x2c, 0xbc, 0x91, 0xf1, 0x09, 0x59, - 0x21, 0x7e, 0x28, 0xec, 0x7b, 0xa1, 0xf0, 0x03, 0x6c, 0x84, 0x45, 0x0a, 0x79, 0x84, 0xc5, 0x4f, - 0xc0, 0xf9, 0xae, 0x7d, 0x44, 0x3e, 0x0a, 0x23, 0x0b, 0xf6, 0xb2, 0x66, 0x1a, 0xef, 0xf0, 0x21, - 0x96, 0x0a, 0x76, 0xd9, 0x96, 0x04, 0x97, 0x77, 0x7e, 0x32, 0x7d, 0x71, 0x09, 0x94, 0x6e, 0x1d, - 0x46, 0xa6, 0x61, 0x0c, 0x43, 0x77, 0x97, 0xcc, 0xe6, 0x8a, 0x65, 0x07, 0xb2, 0xc7, 0x67, 0x6b, - 0x2e, 0xc3, 0x34, 0x34, 0x44, 0x45, 0xfa, 0x20, 0x52, 0xaa, 0xf8, 0xbb, 0x69, 0x18, 0xa9, 0xb5, - 0x3a, 0xcb, 0x86, 0xb4, 0x30, 0xef, 0x7b, 0x3f, 0xe3, 0xed, 0x2e, 0xd2, 0x7b, 0xdb, 0x5d, 0xb0, - 0xe9, 0xcc, 0xde, 0xe7, 0x74, 0xe6, 0x95, 0x23, 0xaf, 0x41, 0xae, 0x8d, 0xdf, 0x11, 0xbd, 0x07, - 0xe0, 0x5f, 0xd7, 0xed, 0x1e, 0x80, 0x97, 0x61, 0xf3, 0x57, 0xf3, 0x00, 0xf3, 0x57, 0x50, 0x56, - 0x12, 0x68, 0xb0, 0x08, 0x9f, 0x08, 0xf4, 0x50, 0x04, 0x1a, 0x2c, 0xb8, 0x27, 0x02, 0x3d, 0x80, - 0x40, 0xbf, 0x9e, 0x86, 0xb1, 0x70, 0x95, 0xe4, 0x59, 0x18, 0xe6, 0xd5, 0xf0, 0x73, 0xb7, 0x94, - 0xe4, 0xd2, 0x1e, 0x80, 0x55, 0xe0, 0x3f, 0xc4, 0x01, 0xe2, 0xf8, 0x8a, 0xe6, 0x34, 0x82, 0x13, - 0x30, 0xee, 0x3d, 0x30, 0xc8, 0xfd, 0xf0, 0x22, 0x28, 0x75, 0x6c, 0x45, 0x73, 0xca, 0xc1, 0x6f, - 0x32, 0x05, 0xc4, 0xa6, 0x1d, 0x87, 0x86, 0x19, 0x64, 0x91, 0x01, 0x5f, 0x3d, 0x62, 0x58, 0x75, - 0x82, 0xc3, 0x64, 0x36, 0x9f, 0xf4, 0x9b, 0x8d, 0xca, 0xd0, 0xdf, 0xfb, 0x14, 0xf9, 0xf1, 0xed, - 0xad, 0xc2, 0x19, 0x89, 0x3e, 0xf9, 0x18, 0x99, 0x13, 0x54, 0x34, 0x57, 0xe3, 0x87, 0x1e, 0x5e, - 0x07, 0x14, 0xff, 0xfc, 0xb3, 0x29, 0xe8, 0x5f, 0x30, 0xe9, 0xc2, 0x3d, 0xf2, 0x1c, 0x0c, 0x31, - 0x8d, 0x99, 0xb5, 0x58, 0x67, 0xa6, 0x84, 0xfb, 0x8e, 0xa4, 0x4a, 0x88, 0x98, 0xe9, 0x53, 0x03, - 0x2a, 0xf2, 0x02, 0x40, 0xf0, 0xc2, 0x51, 0xa8, 0x1f, 0x91, 0xcb, 0x70, 0xcc, 0x4c, 0x9f, 0x2a, - 0xd1, 0x79, 0xa5, 0xc4, 0xfb, 0xb0, 0x4c, 0xbc, 0x14, 0xc7, 0x78, 0xa5, 0xc4, 0x00, 0x99, 0x05, - 0xc2, 0x7e, 0xd5, 0x34, 0xc7, 0xd9, 0xb0, 0x6c, 0xbd, 0xbc, 0xa2, 0x99, 0xcb, 0x34, 0xba, 0x3d, - 0x8d, 0x53, 0xcc, 0xf4, 0xa9, 0x09, 0xe5, 0xc8, 0x2b, 0x30, 0x22, 0xfb, 0x33, 0x47, 0x7d, 0x8e, - 0x64, 0xdc, 0x4c, 0x9f, 0x1a, 0xa2, 0x25, 0x1f, 0x82, 0x61, 0xf1, 0xfb, 0xa6, 0x25, 0x1c, 0x1a, - 0xa4, 0x40, 0x5a, 0x12, 0x6a, 0xa6, 0x4f, 0x95, 0x29, 0xa5, 0x4a, 0x6b, 0xb6, 0x61, 0xba, 0xe2, - 0x89, 0x7c, 0xb4, 0x52, 0xc4, 0x49, 0x95, 0xe2, 0x6f, 0xf2, 0x11, 0x18, 0xf5, 0x23, 0x94, 0xbd, - 0x4d, 0x9b, 0xae, 0xb8, 0x5d, 0x38, 0x13, 0x29, 0xcc, 0x91, 0x33, 0x7d, 0x6a, 0x98, 0x9a, 0x5c, - 0x86, 0x9c, 0x4a, 0x1d, 0xe3, 0x1d, 0xcf, 0x5b, 0x61, 0x4c, 0x1a, 0xe8, 0xc6, 0x3b, 0x4c, 0x4a, - 0x02, 0xcf, 0x7a, 0x27, 0x70, 0x8f, 0x10, 0x77, 0x01, 0x24, 0x52, 0xcb, 0x94, 0xa9, 0xb3, 0xde, - 0x91, 0x7c, 0x63, 0xde, 0x08, 0xe2, 0xb6, 0x89, 0xb4, 0xc5, 0xc3, 0xd1, 0x00, 0x19, 0x32, 0x76, - 0xa6, 0x4f, 0x8d, 0xd0, 0x4b, 0x52, 0xad, 0x18, 0xce, 0xaa, 0x88, 0xb7, 0x1b, 0x95, 0x2a, 0x43, - 0x49, 0x52, 0x65, 0x3f, 0xa5, 0xaa, 0xe7, 0xa9, 0xbb, 0x61, 0xd9, 0xab, 0x22, 0xba, 0x6e, 0xb4, - 0x6a, 0x81, 0x95, 0xaa, 0x16, 0x10, 0xb9, 0x6a, 0x36, 0xe2, 0xc6, 0x92, 0xab, 0xd6, 0x5c, 0x4d, - 0xae, 0x9a, 0x1f, 0x75, 0x7a, 0x9d, 0x34, 0x4b, 0xb5, 0x75, 0xaa, 0x8c, 0x27, 0x76, 0x28, 0xe2, - 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0xd2, 0x9a, 0x65, 0xbb, 0x22, 0x01, 0xbe, 0x92, 0x0f, 0x57, 0x2a, - 0xa1, 0x58, 0xa5, 0xd2, 0x4f, 0xd6, 0x41, 0x41, 0xe2, 0x7c, 0x65, 0x22, 0xdc, 0x41, 0x01, 0x86, - 0x75, 0x90, 0x94, 0x60, 0xbf, 0x80, 0x49, 0xb9, 0x15, 0x82, 0xe4, 0xc3, 0x7e, 0x0b, 0xcb, 0xb5, - 0x99, 0x3e, 0x15, 0xd3, 0x75, 0x17, 0x79, 0xba, 0x77, 0xe5, 0x14, 0x52, 0x8c, 0x78, 0x14, 0x0c, - 0x36, 0xd3, 0xa7, 0xf2, 0x54, 0xf0, 0xcf, 0x49, 0x29, 0x31, 0x95, 0xd3, 0xe1, 0x29, 0xc2, 0x47, - 0xb0, 0x29, 0x22, 0x48, 0x9c, 0x39, 0x1d, 0x4f, 0xfc, 0xa8, 0x9c, 0x09, 0xaf, 0x35, 0x51, 0xfc, - 0x4c, 0x9f, 0x1a, 0x4f, 0x16, 0xf9, 0xa1, 0x50, 0x2e, 0x44, 0xe5, 0x6c, 0x24, 0x7a, 0x5d, 0x80, - 0x62, 0xe2, 0x92, 0xb3, 0x26, 0x2e, 0xc0, 0x29, 0x9e, 0x4a, 0x59, 0xc4, 0x9f, 0x13, 0x93, 0xd5, - 0xb9, 0xf0, 0xce, 0x30, 0x81, 0x64, 0xa6, 0x4f, 0x4d, 0x2a, 0x49, 0xca, 0xb1, 0x8c, 0x84, 0x8a, - 0x12, 0x76, 0xcd, 0x8a, 0xa0, 0x67, 0xfa, 0xd4, 0x58, 0x0e, 0xc3, 0x17, 0xe4, 0x54, 0x80, 0xca, - 0xf9, 0x70, 0x27, 0x06, 0x18, 0xd6, 0x89, 0x52, 0xca, 0xc0, 0x17, 0xe4, 0xf4, 0x70, 0xca, 0x85, - 0x78, 0xa9, 0x60, 0xe6, 0x94, 0xd2, 0xc8, 0xa9, 0xc9, 0x19, 0xaf, 0x94, 0x87, 0xc2, 0xee, 0x20, - 0x49, 0x34, 0x33, 0x7d, 0x6a, 0x72, 0xb6, 0x2c, 0x35, 0x39, 0x55, 0x94, 0x72, 0xb1, 0x17, 0x4f, - 0xbf, 0x75, 0xc9, 0x69, 0xa6, 0xb4, 0x1e, 0x89, 0x7b, 0x94, 0x87, 0xc3, 0x7b, 0xc8, 0xae, 0x84, - 0x33, 0x7d, 0x6a, 0x8f, 0xf4, 0x3f, 0xb7, 0xbb, 0x64, 0xd1, 0x51, 0x1e, 0x09, 0xa7, 0xbd, 0x4f, - 0x24, 0x9a, 0xe9, 0x53, 0xbb, 0xe4, 0xe0, 0xb9, 0xdd, 0x25, 0xc9, 0x8a, 0x52, 0xe8, 0xc9, 0xd6, - 0x97, 0x47, 0x97, 0x14, 0x2d, 0x0b, 0x89, 0xf9, 0x49, 0x94, 0x47, 0xc3, 0xaa, 0x9b, 0x40, 0xc2, - 0x54, 0x37, 0x29, 0xb3, 0xc9, 0x42, 0x62, 0x42, 0x0d, 0xe5, 0xb1, 0x1e, 0x0c, 0xfd, 0x36, 0x26, - 0xa6, 0xe2, 0x58, 0x48, 0xcc, 0x68, 0xa1, 0x14, 0xc3, 0x0c, 0x13, 0x48, 0x18, 0xc3, 0xa4, 0x5c, - 0x18, 0x0b, 0x89, 0x89, 0x0f, 0x94, 0xc7, 0x7b, 0x30, 0x0c, 0x5a, 0x98, 0x94, 0x32, 0xe1, 0x43, - 0xa1, 0xcc, 0x03, 0xca, 0x13, 0xe1, 0x79, 0x43, 0x42, 0xb1, 0x79, 0x43, 0xce, 0x51, 0x50, 0x8e, - 0x85, 0x45, 0x56, 0x9e, 0x0c, 0x0f, 0xf3, 0x08, 0x9a, 0x0d, 0xf3, 0x68, 0x20, 0xe5, 0x72, 0x2c, - 0x3c, 0xac, 0x72, 0xa9, 0x1b, 0x13, 0x44, 0x87, 0x99, 0xf0, 0x80, 0xb2, 0xd5, 0x84, 0xf8, 0xa4, - 0xca, 0x07, 0xc2, 0xcf, 0x0a, 0x62, 0x04, 0x33, 0x7d, 0x6a, 0x42, 0x54, 0x53, 0x35, 0x39, 0x18, - 0x97, 0x72, 0x39, 0x3c, 0x6c, 0x93, 0x68, 0xd8, 0xb0, 0x4d, 0x0c, 0xe4, 0x35, 0x9b, 0xf4, 0xf6, - 0x49, 0xb9, 0x12, 0x36, 0xcc, 0xe2, 0x14, 0xcc, 0x30, 0x4b, 0x78, 0x33, 0xa5, 0x26, 0x87, 0x78, - 0x52, 0x9e, 0xea, 0xd9, 0x42, 0xa4, 0x49, 0x68, 0x21, 0x8f, 0x78, 0x14, 0xd8, 0x4e, 0xb7, 0xdb, - 0x2d, 0x4b, 0xd3, 0x95, 0x0f, 0x26, 0xda, 0x4e, 0x1c, 0x29, 0xd9, 0x4e, 0x1c, 0xc0, 0x56, 0x79, - 0xf9, 0x89, 0x8d, 0xf2, 0x74, 0x78, 0x95, 0x97, 0x71, 0x6c, 0x95, 0x0f, 0x3d, 0xc7, 0x29, 0xc7, - 0x9e, 0xa3, 0x28, 0xcf, 0x84, 0x15, 0x20, 0x82, 0x66, 0x0a, 0x10, 0x7d, 0xc0, 0xf2, 0xa9, 0xee, - 0x0f, 0x38, 0x94, 0xab, 0xe1, 0xb3, 0xb0, 0x6e, 0x74, 0x33, 0x7d, 0x6a, 0xf7, 0x47, 0x20, 0xd5, - 0x84, 0xf7, 0x18, 0xca, 0xb5, 0xb0, 0x82, 0xc5, 0x08, 0x98, 0x82, 0xc5, 0x5f, 0x71, 0x54, 0x13, - 0x1e, 0x54, 0x28, 0xcf, 0x76, 0x65, 0xe5, 0x7f, 0x73, 0xc2, 0x33, 0x8c, 0x17, 0xe4, 0x17, 0x11, - 0xca, 0x73, 0xe1, 0xc5, 0x2e, 0xc0, 0xb0, 0xc5, 0x4e, 0x7a, 0x39, 0xf1, 0x82, 0xfc, 0x16, 0x40, - 0xb9, 0x1e, 0x2f, 0x15, 0x2c, 0x91, 0xd2, 0x9b, 0x01, 0x35, 0xd9, 0x85, 0x5e, 0x79, 0x3e, 0xac, - 0x75, 0x49, 0x34, 0x4c, 0xeb, 0x12, 0xdd, 0xef, 0xa7, 0xe3, 0x9e, 0xf0, 0xca, 0x0b, 0xd1, 0x5d, - 0x76, 0x18, 0xcf, 0x2c, 0x9f, 0x98, 0xf7, 0xfc, 0x1b, 0xd1, 0x48, 0x91, 0xca, 0x8b, 0x91, 0x7b, - 0xf5, 0x10, 0x96, 0xd9, 0xb7, 0x91, 0xc8, 0x92, 0x6f, 0x44, 0x83, 0x2b, 0x2a, 0x2f, 0x25, 0x73, - 0xf0, 0x75, 0x25, 0x1a, 0x8c, 0xf1, 0x8d, 0x68, 0x3c, 0x42, 0xe5, 0x43, 0xc9, 0x1c, 0x7c, 0xe9, - 0x46, 0xe3, 0x17, 0x3e, 0x27, 0x65, 0x48, 0x50, 0x3e, 0x1c, 0x36, 0x1d, 0x7d, 0x04, 0x33, 0x1d, - 0x83, 0x3c, 0x0a, 0xcf, 0x49, 0x99, 0x05, 0x94, 0x97, 0x63, 0x45, 0xfc, 0xc6, 0x4a, 0xf9, 0x07, - 0x9e, 0x93, 0x22, 0xf2, 0x2b, 0xaf, 0xc4, 0x8a, 0xf8, 0xad, 0x93, 0xe2, 0xf6, 0xeb, 0xbd, 0x9e, - 0x4f, 0x2b, 0xaf, 0x86, 0x4f, 0xdb, 0xbb, 0x53, 0xce, 0xf4, 0xa9, 0xbd, 0x9e, 0x61, 0x7f, 0xaa, - 0xfb, 0xbb, 0x02, 0xe5, 0xb5, 0xf0, 0x10, 0xee, 0x46, 0xc7, 0x86, 0x70, 0xd7, 0xb7, 0x09, 0x1f, - 0x89, 0x84, 0x52, 0x51, 0x3e, 0x12, 0x9e, 0xe2, 0x42, 0x48, 0x36, 0xc5, 0x45, 0x03, 0xaf, 0x84, - 0x62, 0x84, 0x28, 0x1f, 0x0d, 0x4f, 0x71, 0x32, 0x8e, 0x4d, 0x71, 0xa1, 0x78, 0x22, 0xe5, 0x58, - 0xe8, 0x0a, 0xe5, 0xf5, 0xf0, 0x14, 0x17, 0x41, 0xb3, 0x29, 0x2e, 0x1a, 0xec, 0xe2, 0x23, 0x91, - 0x08, 0x0e, 0xca, 0x1b, 0xc9, 0xed, 0x47, 0xa4, 0xdc, 0x7e, 0x1e, 0xef, 0x41, 0x4d, 0x0e, 0x45, - 0xa0, 0x94, 0xc2, 0xe3, 0x37, 0x89, 0x86, 0x8d, 0xdf, 0xc4, 0x30, 0x06, 0xd1, 0x8d, 0x83, 0xd0, - 0xaa, 0xc9, 0x1e, 0x1b, 0x87, 0xc0, 0x14, 0x49, 0x00, 0x87, 0xf6, 0xc8, 0x7c, 0x23, 0x54, 0xee, - 0xb2, 0x47, 0xf6, 0xb6, 0x41, 0x11, 0x7a, 0x36, 0xbb, 0xc6, 0xdc, 0xdc, 0x95, 0x4a, 0x78, 0x76, - 0x8d, 0x11, 0xb0, 0xd9, 0x35, 0xee, 0x1c, 0x3f, 0x0d, 0x79, 0xa1, 0x45, 0xdc, 0x7b, 0xdf, 0x30, - 0x97, 0x95, 0xa9, 0xc8, 0x73, 0xdf, 0x08, 0x9e, 0xcd, 0x4e, 0x51, 0x18, 0xae, 0xd7, 0x1c, 0x56, - 0x6e, 0x19, 0xed, 0x25, 0x4b, 0xb3, 0xf5, 0x3a, 0x35, 0x75, 0x65, 0x3a, 0xb2, 0x5e, 0x27, 0xd0, - 0xe0, 0x7a, 0x9d, 0x00, 0xc7, 0x08, 0x85, 0x11, 0xb8, 0x4a, 0x9b, 0xd4, 0x58, 0xa7, 0xca, 0x0d, - 0x64, 0x5b, 0xe8, 0xc6, 0x56, 0x90, 0xcd, 0xf4, 0xa9, 0xdd, 0x38, 0x30, 0x5b, 0x7d, 0x6e, 0xb3, - 0xfe, 0xb1, 0x59, 0x3f, 0xfa, 0x45, 0xcd, 0xa6, 0x6d, 0xcd, 0xa6, 0xca, 0x4c, 0xd8, 0x56, 0x4f, - 0x24, 0x62, 0xb6, 0x7a, 0x22, 0x22, 0xce, 0xd6, 0x1b, 0x0b, 0xd5, 0x5e, 0x6c, 0x83, 0x11, 0x91, - 0x5c, 0x9a, 0xcd, 0x4e, 0x61, 0x04, 0x13, 0xd0, 0xac, 0x65, 0x2e, 0xe3, 0x49, 0xc5, 0xcd, 0xf0, - 0xec, 0xd4, 0x9d, 0x92, 0xcd, 0x4e, 0xdd, 0xb1, 0x4c, 0xd5, 0xc3, 0x58, 0x3e, 0x06, 0x6f, 0x85, - 0x55, 0x3d, 0x81, 0x84, 0xa9, 0x7a, 0x02, 0x38, 0xce, 0x50, 0xa5, 0x0e, 0x75, 0x95, 0xd9, 0x5e, - 0x0c, 0x91, 0x24, 0xce, 0x10, 0xc1, 0x71, 0x86, 0xd3, 0xd4, 0x6d, 0xae, 0x28, 0x73, 0xbd, 0x18, - 0x22, 0x49, 0x9c, 0x21, 0x82, 0xd9, 0x66, 0x33, 0x0c, 0x9e, 0xec, 0xb4, 0x56, 0xbd, 0x3e, 0x9b, - 0x0f, 0x6f, 0x36, 0xbb, 0x12, 0xb2, 0xcd, 0x66, 0x57, 0x24, 0xf9, 0x81, 0x5d, 0x3f, 0x34, 0x50, - 0x16, 0xb0, 0xc2, 0xab, 0x81, 0x5d, 0xb0, 0x9b, 0x52, 0x33, 0x7d, 0xea, 0x6e, 0x1f, 0x32, 0x7c, - 0xd0, 0xf7, 0xca, 0x55, 0x6a, 0x58, 0xd5, 0xb8, 0x7f, 0x56, 0xc1, 0xc1, 0x33, 0x7d, 0xaa, 0xef, - 0xb7, 0xfb, 0x21, 0x18, 0xc6, 0x8f, 0xaa, 0x9a, 0x86, 0x5b, 0x99, 0x54, 0x3e, 0x16, 0xde, 0x32, - 0x49, 0x28, 0xb6, 0x65, 0x92, 0x7e, 0xb2, 0x49, 0x1c, 0x7f, 0xf2, 0x29, 0xa6, 0x32, 0xa9, 0xa8, - 0xe1, 0x49, 0x3c, 0x84, 0x64, 0x93, 0x78, 0x08, 0xe0, 0xd7, 0x5b, 0xb1, 0xad, 0x76, 0x65, 0x52, - 0xa9, 0x27, 0xd4, 0xcb, 0x51, 0x7e, 0xbd, 0xfc, 0xa7, 0x5f, 0x6f, 0x7d, 0xa5, 0xe3, 0x56, 0xd8, - 0x37, 0x2e, 0x26, 0xd4, 0xeb, 0x21, 0xfd, 0x7a, 0x3d, 0x00, 0x9b, 0x0a, 0x11, 0x50, 0xb3, 0x2d, - 0x36, 0x69, 0xdf, 0x32, 0x5a, 0x2d, 0xe5, 0x76, 0x78, 0x2a, 0x8c, 0xe2, 0xd9, 0x54, 0x18, 0x85, - 0x31, 0xd3, 0x93, 0xb7, 0x8a, 0x2e, 0x75, 0x96, 0x95, 0x3b, 0x61, 0xd3, 0x33, 0xc0, 0x30, 0xd3, - 0x33, 0xf8, 0x85, 0xbb, 0x0b, 0xf6, 0x4b, 0xa5, 0xf7, 0x6c, 0xea, 0xac, 0x28, 0x77, 0x23, 0xbb, - 0x0b, 0x09, 0x87, 0xbb, 0x0b, 0xe9, 0x37, 0x59, 0x86, 0x87, 0x42, 0x0b, 0x8d, 0x77, 0x6b, 0x53, - 0xa7, 0x9a, 0xdd, 0x5c, 0x51, 0xde, 0x44, 0x56, 0x8f, 0x27, 0x2e, 0x55, 0x61, 0xd2, 0x99, 0x3e, - 0xb5, 0x17, 0x27, 0xdc, 0x96, 0x7f, 0x6c, 0x96, 0x87, 0x31, 0x56, 0x6b, 0x65, 0x6f, 0x13, 0xfa, - 0x56, 0x64, 0x5b, 0x1e, 0x27, 0xc1, 0x6d, 0x79, 0x1c, 0x4c, 0xda, 0xf0, 0x48, 0x64, 0xab, 0x36, - 0xa7, 0xb5, 0xd8, 0xbe, 0x84, 0xea, 0x35, 0xad, 0xb9, 0x4a, 0x5d, 0xe5, 0xe3, 0xc8, 0xfb, 0x52, - 0x97, 0x0d, 0x5f, 0x84, 0x7a, 0xa6, 0x4f, 0xdd, 0x81, 0x1f, 0x29, 0x42, 0xb6, 0x3e, 0xbd, 0x58, - 0x53, 0x3e, 0x11, 0x3e, 0xdf, 0x64, 0xb0, 0x99, 0x3e, 0x15, 0x71, 0xcc, 0x4a, 0xbb, 0xdd, 0x5e, - 0xb6, 0x35, 0x9d, 0x72, 0x43, 0x0b, 0x6d, 0x37, 0x61, 0x80, 0x7e, 0x57, 0xd8, 0x4a, 0xeb, 0x46, - 0xc7, 0xac, 0xb4, 0x6e, 0x38, 0xa6, 0xa8, 0xa1, 0x8c, 0x3d, 0xca, 0x27, 0xc3, 0x8a, 0x1a, 0x42, - 0x32, 0x45, 0x0d, 0xe7, 0xf7, 0x79, 0x13, 0xce, 0xfa, 0xfb, 0x79, 0xb1, 0xfe, 0xf2, 0x4e, 0x53, - 0x3e, 0x85, 0x7c, 0x1e, 0x89, 0x5d, 0x06, 0x84, 0xa8, 0x66, 0xfa, 0xd4, 0x2e, 0xe5, 0xd9, 0x8a, - 0x1b, 0xcb, 0x68, 0x27, 0xcc, 0x8b, 0xef, 0x0e, 0xaf, 0xb8, 0x5d, 0xc8, 0xd8, 0x8a, 0xdb, 0x05, - 0x95, 0xc8, 0x5c, 0x08, 0x55, 0xdb, 0x81, 0xb9, 0x2f, 0xd3, 0x6e, 0x1c, 0x12, 0x99, 0x0b, 0x4b, - 0x6d, 0x69, 0x07, 0xe6, 0xbe, 0xb5, 0xd6, 0x8d, 0x03, 0xb9, 0x0c, 0xb9, 0x7a, 0x7d, 0x4e, 0xed, - 0x98, 0x4a, 0x33, 0xe2, 0x8e, 0x8c, 0xd0, 0x99, 0x3e, 0x55, 0xe0, 0x99, 0x19, 0x34, 0xd5, 0xd2, - 0x1c, 0xd7, 0x68, 0x3a, 0x38, 0x62, 0xbc, 0x11, 0xa2, 0x87, 0xcd, 0xa0, 0x24, 0x1a, 0x66, 0x06, - 0x25, 0xc1, 0x99, 0xbd, 0x58, 0xd6, 0x1c, 0x47, 0x33, 0x75, 0x5b, 0x9b, 0xc4, 0x65, 0x82, 0x46, - 0x1e, 0x03, 0x86, 0xb0, 0xcc, 0x5e, 0x0c, 0x43, 0xf0, 0xf0, 0xdd, 0x83, 0x78, 0x66, 0xce, 0xbd, - 0xc8, 0xe1, 0x7b, 0x04, 0x8f, 0x87, 0xef, 0x11, 0x18, 0xda, 0x9d, 0x1e, 0x4c, 0xa5, 0xcb, 0x06, - 0x13, 0x91, 0xb2, 0x1c, 0xb1, 0x3b, 0xa3, 0x04, 0x68, 0x77, 0x46, 0x81, 0xa1, 0x26, 0x79, 0xcb, - 0xed, 0x4a, 0x97, 0x26, 0x05, 0xab, 0x6c, 0xac, 0x0c, 0x5b, 0xbf, 0x83, 0xc1, 0x51, 0xd9, 0x34, - 0xb5, 0x35, 0xab, 0x32, 0xe9, 0x49, 0xdd, 0x08, 0xaf, 0xdf, 0x5d, 0x09, 0xd9, 0xfa, 0xdd, 0x15, - 0xc9, 0x66, 0x57, 0x6f, 0xa3, 0xb5, 0xa2, 0xd9, 0x54, 0xaf, 0x18, 0x36, 0x9e, 0x2c, 0x6e, 0xf2, - 0xad, 0xe1, 0xdb, 0xe1, 0xd9, 0xb5, 0x07, 0x29, 0x9b, 0x5d, 0x7b, 0xa0, 0x99, 0x91, 0x97, 0x8c, - 0x56, 0xa9, 0xa6, 0x2b, 0xab, 0x61, 0x23, 0xaf, 0x3b, 0x25, 0x33, 0xf2, 0xba, 0x63, 0xbb, 0x7f, - 0xce, 0x5d, 0xdb, 0x70, 0xa9, 0xd2, 0xda, 0xcd, 0xe7, 0x20, 0x69, 0xf7, 0xcf, 0x41, 0x34, 0xdb, - 0x10, 0x46, 0x3b, 0x64, 0x2d, 0xbc, 0x21, 0x8c, 0x77, 0x43, 0xb4, 0x04, 0xb3, 0x58, 0xc4, 0xab, - 0x47, 0xc5, 0x0c, 0x5b, 0x2c, 0x02, 0xcc, 0x2c, 0x96, 0xe0, 0x5d, 0x64, 0xe8, 0xad, 0x9b, 0x62, - 0x85, 0xd7, 0x50, 0x19, 0xc7, 0xd6, 0xd0, 0xd0, 0xbb, 0xb8, 0x0f, 0x85, 0x1e, 0x72, 0x28, 0xed, - 0xb0, 0xd5, 0x21, 0xa1, 0x98, 0xd5, 0x21, 0x3f, 0xf9, 0x28, 0xc3, 0x38, 0xde, 0x82, 0xab, 0x1d, - 0xff, 0x1e, 0xe7, 0xd3, 0xe1, 0xcf, 0x8c, 0xa0, 0xd9, 0x67, 0x46, 0x40, 0x21, 0x26, 0x62, 0xda, - 0xb2, 0xbb, 0x30, 0x09, 0xce, 0x07, 0x23, 0x20, 0x32, 0x0b, 0xa4, 0x5e, 0x9a, 0x9b, 0xad, 0xea, - 0x35, 0xf9, 0x8a, 0xcc, 0x09, 0x9f, 0xc0, 0xc6, 0x29, 0x66, 0xfa, 0xd4, 0x84, 0x72, 0xe4, 0x6d, - 0xb8, 0x28, 0xa0, 0xe2, 0xc1, 0x7f, 0xcd, 0xb6, 0xd6, 0x0d, 0xdd, 0x5f, 0x10, 0xdc, 0xb0, 0xa3, - 0x60, 0x2f, 0xda, 0x99, 0x3e, 0xb5, 0x27, 0xaf, 0xee, 0x75, 0x89, 0xf5, 0xa1, 0xb3, 0x9b, 0xba, - 0xfc, 0x45, 0xa2, 0x27, 0xaf, 0xee, 0x75, 0x09, 0xb9, 0xaf, 0xef, 0xa6, 0x2e, 0xbf, 0x13, 0x7a, - 0xf2, 0x22, 0x0e, 0x14, 0x7a, 0xe1, 0x4b, 0xad, 0x96, 0xb2, 0x81, 0xd5, 0x7d, 0x60, 0x37, 0xd5, - 0x95, 0xd0, 0xe0, 0xdc, 0x89, 0x23, 0x9b, 0xa5, 0x17, 0xda, 0xd4, 0xac, 0x87, 0x16, 0xa0, 0xfb, - 0xe1, 0x59, 0x3a, 0x46, 0xc0, 0x66, 0xe9, 0x18, 0x90, 0x0d, 0x28, 0xf9, 0x3d, 0x90, 0xb2, 0x19, - 0x1e, 0x50, 0x32, 0x8e, 0x0d, 0xa8, 0xd0, 0xdb, 0xa1, 0x05, 0x38, 0xb5, 0xb0, 0xea, 0x6a, 0x9e, - 0x05, 0xe9, 0x88, 0xae, 0x7c, 0x27, 0x72, 0xc9, 0x14, 0x27, 0xc1, 0x4b, 0xa6, 0x38, 0x98, 0x8d, - 0x11, 0x06, 0xae, 0x6f, 0x9a, 0xcd, 0x69, 0xcd, 0x68, 0x75, 0x6c, 0xaa, 0xfc, 0xa5, 0xf0, 0x18, - 0x89, 0xa0, 0xd9, 0x18, 0x89, 0x80, 0xd8, 0x02, 0xcd, 0x40, 0x25, 0xc7, 0x31, 0x96, 0x4d, 0xb1, - 0xaf, 0xec, 0xb4, 0x5c, 0xe5, 0xff, 0x17, 0x5e, 0xa0, 0x93, 0x68, 0xd8, 0x02, 0x9d, 0x04, 0xc7, - 0x53, 0x27, 0xd6, 0x0b, 0x6c, 0xf1, 0x90, 0xef, 0x2a, 0xff, 0xff, 0x91, 0x53, 0xa7, 0x04, 0x1a, - 0x3c, 0x75, 0x4a, 0x80, 0xb3, 0xf5, 0x91, 0xdb, 0x64, 0xb3, 0x86, 0x7f, 0x57, 0xfd, 0x1f, 0x85, - 0xd7, 0xc7, 0x28, 0x9e, 0xad, 0x8f, 0x51, 0x58, 0x98, 0x8f, 0xe8, 0x82, 0xff, 0xb8, 0x1b, 0x1f, - 0x5f, 0xfe, 0xb1, 0x32, 0xe4, 0x86, 0xcc, 0x47, 0x8c, 0x94, 0xef, 0x49, 0x75, 0x63, 0xe4, 0x0f, - 0x8f, 0x58, 0xa1, 0x30, 0x23, 0x95, 0xae, 0x1b, 0x74, 0x43, 0xf9, 0x4c, 0x57, 0x46, 0x9c, 0x20, - 0xcc, 0x88, 0xc3, 0xc8, 0x5b, 0x70, 0x36, 0x80, 0xcd, 0xd1, 0xb5, 0x25, 0x7f, 0x66, 0xfa, 0xcb, - 0xa9, 0xb0, 0x19, 0x9c, 0x4c, 0xc6, 0xcc, 0xe0, 0x64, 0x4c, 0x12, 0x6b, 0x21, 0xba, 0xef, 0xdd, - 0x81, 0xb5, 0x2f, 0xc1, 0x2e, 0x0c, 0x92, 0x58, 0x0b, 0x69, 0x7e, 0x76, 0x07, 0xd6, 0xbe, 0x4c, - 0xbb, 0x30, 0x20, 0x9f, 0x4b, 0xc1, 0xa5, 0x64, 0x54, 0xa9, 0xd5, 0x9a, 0xb6, 0xec, 0x00, 0xa7, - 0xfc, 0x95, 0x54, 0xf8, 0xa0, 0x61, 0x77, 0xc5, 0x66, 0xfa, 0xd4, 0x5d, 0x56, 0x40, 0x3e, 0x0a, - 0xa3, 0xa5, 0x8e, 0x6e, 0xb8, 0x78, 0xf1, 0xc6, 0x0c, 0xe7, 0xef, 0x4b, 0x45, 0xb6, 0x38, 0x32, - 0x16, 0xb7, 0x38, 0x32, 0x80, 0xdc, 0x84, 0x89, 0x3a, 0x6d, 0x76, 0x30, 0xde, 0x04, 0x6d, 0x5b, - 0xb6, 0xcb, 0x78, 0x7c, 0x7f, 0x2a, 0x3c, 0x89, 0xc5, 0x28, 0xd8, 0x24, 0x16, 0x03, 0x92, 0x3b, - 0xb1, 0x5b, 0x79, 0xd1, 0x99, 0x3f, 0x90, 0xea, 0x79, 0x2d, 0xef, 0xf7, 0x65, 0x72, 0x71, 0x52, - 0x8b, 0xdc, 0xa2, 0x0b, 0xae, 0x9f, 0x4b, 0xf5, 0xb8, 0x46, 0x97, 0x66, 0xb8, 0x38, 0x98, 0x71, - 0x0c, 0xdd, 0x5d, 0x0b, 0x8e, 0x7f, 0x35, 0xd5, 0xe3, 0xda, 0x3b, 0xe0, 0x98, 0x00, 0x26, 0x2f, - 0x72, 0x4f, 0x11, 0xc1, 0xe8, 0xaf, 0xa5, 0xe2, 0xae, 0x22, 0x7e, 0x79, 0x89, 0x90, 0x15, 0xbb, - 0xed, 0xf8, 0x4a, 0xff, 0xf9, 0x54, 0xdc, 0x37, 0x2f, 0x28, 0x16, 0xfc, 0x22, 0x14, 0x2e, 0x4c, - 0xdd, 0x77, 0xa9, 0x6d, 0x6a, 0x2d, 0xec, 0xce, 0xba, 0x6b, 0xd9, 0xda, 0x32, 0x9d, 0x32, 0xb5, - 0xa5, 0x16, 0x55, 0x7e, 0x30, 0x15, 0xb6, 0x60, 0xbb, 0x93, 0x32, 0x0b, 0xb6, 0x3b, 0x96, 0xac, - 0xc0, 0x43, 0x49, 0xd8, 0x8a, 0xe1, 0x60, 0x3d, 0x5f, 0x48, 0x85, 0x4d, 0xd8, 0x1e, 0xb4, 0xcc, - 0x84, 0xed, 0x81, 0x26, 0xd7, 0x61, 0x68, 0xd2, 0xf2, 0xa6, 0xdf, 0x1f, 0x8a, 0x38, 0x43, 0xfa, - 0x98, 0x99, 0x3e, 0x35, 0x20, 0x13, 0x65, 0xc4, 0xa0, 0xfe, 0x62, 0xbc, 0x4c, 0x70, 0xf9, 0xe4, - 0xff, 0x10, 0x65, 0x84, 0xb8, 0xff, 0x93, 0x78, 0x99, 0xe0, 0x8e, 0xcb, 0xff, 0xc1, 0x66, 0x12, - 0x5e, 0xe3, 0xdc, 0x74, 0x89, 0xd9, 0x6d, 0xe5, 0x15, 0xad, 0xd5, 0xa2, 0xe6, 0x32, 0x55, 0xbe, - 0x14, 0x99, 0x49, 0x92, 0xc9, 0xd8, 0x4c, 0x92, 0x8c, 0x21, 0xdf, 0x05, 0xe7, 0xee, 0x68, 0x2d, - 0x43, 0x0f, 0x70, 0x5e, 0x46, 0x7c, 0xe5, 0x87, 0x53, 0xe1, 0xdd, 0x74, 0x17, 0x3a, 0xb6, 0x9b, - 0xee, 0x82, 0x22, 0x73, 0x40, 0x70, 0x19, 0xf5, 0x67, 0x0b, 0xb6, 0x3e, 0x2b, 0xff, 0x69, 0x2a, - 0x6c, 0xa7, 0xc6, 0x49, 0x98, 0x9d, 0x1a, 0x87, 0x92, 0x46, 0xf7, 0xcc, 0x34, 0xca, 0x8f, 0xa4, - 0xc2, 0xa7, 0x35, 0xdd, 0x08, 0x67, 0xfa, 0xd4, 0xee, 0xe9, 0x6d, 0x6e, 0x40, 0xbe, 0x5e, 0xab, - 0x4e, 0x4f, 0x4f, 0xd5, 0xef, 0x54, 0x2b, 0xf8, 0x54, 0x43, 0x57, 0x7e, 0x34, 0xb2, 0x62, 0x45, - 0x09, 0xd8, 0x8a, 0x15, 0x85, 0x91, 0x57, 0x61, 0x84, 0xb5, 0x9f, 0x0d, 0x18, 0xfc, 0xe4, 0x2f, - 0xa7, 0xc2, 0xe6, 0x94, 0x8c, 0x64, 0xe6, 0x94, 0xfc, 0x9b, 0xd4, 0xe1, 0x34, 0x93, 0x62, 0xcd, - 0xa6, 0xf7, 0xa8, 0x4d, 0xcd, 0xa6, 0x37, 0xa6, 0x7f, 0x2c, 0x15, 0xb6, 0x32, 0x92, 0x88, 0x98, - 0x95, 0x91, 0x04, 0x27, 0xab, 0x70, 0x31, 0x7a, 0x12, 0x24, 0xbf, 0xeb, 0x55, 0xfe, 0x7a, 0x2a, - 0x62, 0x0c, 0xf7, 0x20, 0x46, 0x63, 0xb8, 0x07, 0x9e, 0x98, 0xf0, 0xb0, 0x38, 0x56, 0x11, 0x0e, - 0x97, 0xd1, 0xda, 0x7e, 0x9c, 0xd7, 0xf6, 0x64, 0xe0, 0x10, 0xd8, 0x83, 0x7a, 0xa6, 0x4f, 0xed, - 0xcd, 0x8e, 0xe9, 0x59, 0x3c, 0xff, 0x8a, 0xf2, 0x13, 0xa9, 0x64, 0x8f, 0x94, 0x90, 0x9b, 0x72, - 0x52, 0xe2, 0x96, 0xb7, 0xba, 0x65, 0x0f, 0x51, 0xfe, 0x46, 0x64, 0xbc, 0x25, 0x93, 0xb1, 0xf1, - 0xd6, 0x25, 0xfd, 0xc8, 0x4d, 0x98, 0xe0, 0x4a, 0x5d, 0xd3, 0x70, 0x18, 0x9a, 0xcb, 0x54, 0x57, - 0xfe, 0x66, 0x64, 0xb5, 0x8b, 0x51, 0xa0, 0x6b, 0x4f, 0x14, 0xc8, 0xa6, 0xee, 0x7a, 0x5b, 0x33, - 0x4d, 0x3c, 0x66, 0x55, 0xfe, 0xb3, 0xc8, 0xd4, 0x1d, 0xa0, 0xd0, 0x71, 0xd7, 0xff, 0xc5, 0x34, - 0xa1, 0x57, 0xe6, 0x2d, 0xe5, 0x3f, 0x8f, 0x68, 0x42, 0x2f, 0x62, 0xa6, 0x09, 0x3d, 0xd3, 0x78, - 0xdd, 0xe9, 0xf2, 0xc6, 0x5e, 0xf9, 0x4a, 0x64, 0x45, 0x4e, 0xa4, 0x62, 0x2b, 0x72, 0xf2, 0x13, - 0xfd, 0x3b, 0x5d, 0xde, 0xa7, 0x2b, 0x3f, 0xd9, 0x9b, 0x6f, 0xb0, 0xd2, 0x27, 0x3f, 0x6f, 0xbf, - 0xd3, 0xe5, 0x6d, 0xb7, 0xf2, 0xb7, 0x7a, 0xf3, 0x0d, 0x1c, 0xfb, 0x92, 0x9f, 0x86, 0x37, 0xba, - 0xbf, 0x8b, 0x56, 0xfe, 0x76, 0x74, 0xea, 0xea, 0x42, 0x88, 0x53, 0x57, 0xb7, 0xc7, 0xd5, 0x4b, - 0x70, 0x9e, 0x6b, 0xc8, 0x0d, 0x5b, 0x6b, 0xaf, 0xd4, 0xa9, 0xeb, 0x1a, 0xe6, 0xb2, 0xb7, 0x13, - 0xfb, 0x2f, 0x52, 0x91, 0xe3, 0xb1, 0x6e, 0x94, 0x78, 0x3c, 0xd6, 0x0d, 0xc9, 0x94, 0x37, 0xf6, - 0x02, 0x5a, 0xf9, 0x3b, 0x11, 0xe5, 0x8d, 0x51, 0x30, 0xe5, 0x8d, 0x3f, 0x9c, 0xbe, 0x99, 0xf0, - 0xd0, 0x57, 0xf9, 0x2f, 0xbb, 0xf3, 0xf2, 0xdb, 0x97, 0xf0, 0x3e, 0xf8, 0x66, 0xc2, 0x7b, 0x56, - 0xe5, 0xbf, 0xea, 0xce, 0x2b, 0xf0, 0x41, 0x8a, 0x3f, 0x83, 0x7d, 0x0b, 0xce, 0xf2, 0xd9, 0x7c, - 0x9a, 0xea, 0x34, 0xf4, 0xa1, 0x3f, 0x15, 0x19, 0xfb, 0xc9, 0x64, 0x78, 0xe4, 0x9e, 0x88, 0x49, - 0x62, 0x2d, 0xda, 0xfa, 0x77, 0x77, 0x60, 0x1d, 0x6c, 0x08, 0x92, 0x31, 0x6c, 0xbd, 0x91, 0x5f, - 0xbf, 0x29, 0x3f, 0x1d, 0x59, 0x6f, 0x64, 0x24, 0xba, 0x73, 0xc8, 0x4f, 0xe5, 0x5e, 0x0d, 0xbf, - 0xf4, 0x52, 0x7e, 0x26, 0xb1, 0xb0, 0xdf, 0x01, 0xe1, 0x67, 0x61, 0xaf, 0x86, 0x5f, 0x35, 0x29, - 0x5f, 0x4d, 0x2c, 0xec, 0x7f, 0x40, 0xf8, 0x09, 0x14, 0xdb, 0x22, 0x75, 0x5c, 0x8b, 0xb3, 0x0a, - 0x4d, 0x0f, 0x7f, 0x2f, 0xba, 0x45, 0x4a, 0x24, 0xc3, 0x2d, 0x52, 0x22, 0x26, 0x89, 0xb5, 0xf8, - 0xbc, 0x9f, 0xdd, 0x81, 0xb5, 0xb4, 0xb1, 0x4b, 0xc4, 0x24, 0xb1, 0x16, 0x1f, 0xff, 0xb5, 0x1d, - 0x58, 0x4b, 0x1b, 0xbb, 0x44, 0x0c, 0x33, 0xc7, 0x02, 0xcc, 0x1d, 0x6a, 0x3b, 0x81, 0xfa, 0xfd, - 0xd7, 0x11, 0x73, 0xac, 0x0b, 0x1d, 0x33, 0xc7, 0xba, 0xa0, 0x12, 0xb9, 0x0b, 0xa1, 0xfc, 0xdc, - 0x4e, 0xdc, 0x83, 0x7b, 0x99, 0x2e, 0xa8, 0x44, 0xee, 0x42, 0x2e, 0x7f, 0x7f, 0x27, 0xee, 0xc1, - 0xc5, 0x4c, 0x17, 0x14, 0x33, 0x8a, 0xea, 0xae, 0xe6, 0x1a, 0xcd, 0x19, 0xcb, 0x71, 0xa5, 0x45, - 0xfe, 0xbf, 0x89, 0x18, 0x45, 0x49, 0x44, 0xcc, 0x28, 0x4a, 0x82, 0xc7, 0x99, 0x0a, 0x69, 0x7c, - 0xbd, 0x27, 0xd3, 0xc0, 0xd2, 0x4a, 0x82, 0xc7, 0x99, 0x0a, 0x21, 0xfc, 0xb7, 0x3d, 0x99, 0x06, - 0x9e, 0xf2, 0x49, 0x70, 0x66, 0x99, 0x96, 0x6d, 0x6b, 0xc3, 0xbc, 0x49, 0x37, 0x68, 0x4b, 0x7c, - 0xfa, 0xcf, 0x47, 0x2c, 0xd3, 0x28, 0x01, 0xde, 0xa2, 0x44, 0x60, 0x61, 0x46, 0xe2, 0x73, 0x7f, - 0xa1, 0x2b, 0xa3, 0xe0, 0x98, 0x28, 0x0a, 0x0b, 0x33, 0x12, 0x9f, 0xf8, 0x8b, 0x5d, 0x19, 0x05, - 0xc7, 0x44, 0x51, 0x18, 0x29, 0xc1, 0x18, 0xbe, 0x95, 0xd0, 0x1c, 0xcf, 0xf3, 0xf3, 0x57, 0x53, - 0xe1, 0x5b, 0xaf, 0x30, 0x7a, 0xa6, 0x4f, 0x8d, 0x14, 0x90, 0x59, 0x88, 0x4f, 0xfa, 0x46, 0x17, - 0x16, 0x81, 0xbf, 0x63, 0x18, 0x22, 0xb3, 0x10, 0x1f, 0xf3, 0x0f, 0xba, 0xb0, 0x08, 0x1c, 0x1e, - 0xc3, 0x10, 0xf2, 0x61, 0x18, 0xae, 0x4f, 0x2f, 0xd6, 0xbc, 0xec, 0x90, 0xff, 0x30, 0x15, 0x79, - 0x55, 0x14, 0xe0, 0xf0, 0x55, 0x51, 0xf0, 0x93, 0x7c, 0x14, 0x46, 0xcb, 0x96, 0xe9, 0x6a, 0x4d, - 0x6f, 0x03, 0xfa, 0x6b, 0x91, 0x33, 0x94, 0x10, 0x76, 0xa6, 0x4f, 0x0d, 0x93, 0x4b, 0xe5, 0x45, - 0xdb, 0x7f, 0x3d, 0xb9, 0xbc, 0xdf, 0xf4, 0x30, 0x39, 0x9b, 0xd1, 0xee, 0x5a, 0xf6, 0x6a, 0xcb, - 0xd2, 0x74, 0x2f, 0x20, 0xa9, 0x68, 0xc8, 0x3f, 0x8a, 0xcc, 0x68, 0xc9, 0x64, 0x6c, 0x46, 0x4b, - 0xc6, 0x24, 0xb1, 0x16, 0x5d, 0xf4, 0x1b, 0x3b, 0xb0, 0x0e, 0xe6, 0xe1, 0x64, 0x4c, 0x12, 0x6b, - 0xf1, 0xf9, 0xff, 0x78, 0x07, 0xd6, 0xc1, 0x3c, 0x9c, 0x8c, 0x61, 0xa6, 0xf5, 0x0d, 0xc3, 0xf5, - 0x1e, 0xb6, 0xfd, 0x93, 0x88, 0x69, 0x1d, 0xa0, 0x98, 0x69, 0x1d, 0xfc, 0x22, 0x14, 0x2e, 0xf8, - 0x4f, 0x25, 0x83, 0xbd, 0x6b, 0xd5, 0x5c, 0x67, 0xfb, 0x63, 0xe5, 0x9f, 0x46, 0x4e, 0x45, 0xba, - 0x93, 0xce, 0xf4, 0xa9, 0x3d, 0x18, 0x91, 0x5a, 0xc4, 0x4f, 0x91, 0x07, 0xf5, 0x53, 0xfe, 0x59, - 0xaa, 0x87, 0xa3, 0x22, 0xa7, 0x89, 0x39, 0x2a, 0x72, 0xb0, 0x98, 0xb3, 0x96, 0x5a, 0xf4, 0xf6, - 0x7c, 0xf5, 0x4d, 0x69, 0x76, 0xfd, 0x66, 0x7c, 0xce, 0x8a, 0x11, 0x89, 0x39, 0x2b, 0x06, 0x27, - 0xdf, 0x9b, 0x82, 0x27, 0xa2, 0xf2, 0x7d, 0xf3, 0xc5, 0x67, 0x5f, 0x56, 0xe9, 0xba, 0xd5, 0x94, - 0x2d, 0xab, 0xdf, 0xe4, 0xb5, 0x3c, 0xdd, 0xad, 0xbb, 0x92, 0x0a, 0xcd, 0xf4, 0xa9, 0xbb, 0x62, - 0xbe, 0x8b, 0x56, 0x08, 0xa5, 0xf9, 0xad, 0x3d, 0xb5, 0xc2, 0x57, 0xa1, 0x5d, 0x31, 0xdf, 0x45, - 0x2b, 0xc4, 0xa8, 0xf8, 0xd6, 0x9e, 0x5a, 0xe1, 0x8f, 0x91, 0x5d, 0x31, 0xc7, 0xdd, 0xe7, 0xdd, - 0x7a, 0xb5, 0xec, 0xfb, 0xfa, 0x6c, 0x9a, 0x4d, 0xe5, 0xb7, 0xa3, 0xbb, 0xcf, 0x28, 0x05, 0xee, - 0x3e, 0xa3, 0x40, 0xb6, 0xdc, 0xcf, 0x50, 0xad, 0xc5, 0xb6, 0xa3, 0xb4, 0xb9, 0x1a, 0x32, 0xde, - 0x7e, 0x27, 0xb2, 0xdc, 0x77, 0xa1, 0x63, 0xcb, 0x7d, 0x17, 0x54, 0x22, 0x77, 0x21, 0xa1, 0xdf, - 0xdd, 0x89, 0x7b, 0x60, 0xaa, 0x74, 0x41, 0x25, 0x72, 0x17, 0x5a, 0xf0, 0xdf, 0xed, 0xc4, 0x3d, - 0x30, 0x55, 0xba, 0xa0, 0xc8, 0x0f, 0xa5, 0xe0, 0x72, 0x52, 0x77, 0xf0, 0xd8, 0x1f, 0x0b, 0xeb, - 0xd4, 0xb6, 0x0d, 0xdd, 0xbb, 0x40, 0xfe, 0x3d, 0x5e, 0xdf, 0xb3, 0xbd, 0xfa, 0x3b, 0xa9, 0xe0, - 0x4c, 0x9f, 0xba, 0xeb, 0x4a, 0x76, 0xd9, 0x22, 0x21, 0x81, 0x6f, 0xef, 0xb9, 0x45, 0xbe, 0x48, - 0x76, 0x5d, 0x09, 0x4e, 0x38, 0xc6, 0xb2, 0xe3, 0x5a, 0x36, 0xad, 0x59, 0x2d, 0xa3, 0xe9, 0xad, - 0x37, 0xbf, 0x1f, 0x9d, 0x70, 0x12, 0x88, 0x70, 0xc2, 0x49, 0x80, 0xc7, 0x99, 0x0a, 0x8d, 0xf9, - 0xe7, 0x3d, 0x99, 0x4a, 0xe6, 0x5c, 0x02, 0x3c, 0xce, 0x54, 0x88, 0xe9, 0x5f, 0xf4, 0x64, 0x2a, - 0x99, 0x73, 0x09, 0x70, 0x62, 0xc2, 0xc3, 0x81, 0xa1, 0x5b, 0x5a, 0xa6, 0xa6, 0xab, 0x5a, 0xad, - 0x96, 0xd5, 0x71, 0x17, 0x6d, 0x63, 0x79, 0x99, 0xda, 0xca, 0x1f, 0x44, 0x0e, 0xc8, 0x7a, 0x52, - 0xcf, 0xf4, 0xa9, 0xbd, 0xd9, 0x11, 0x17, 0x0a, 0xc9, 0x04, 0xd3, 0x96, 0xdd, 0xa4, 0x15, 0xcb, - 0xa4, 0xca, 0x1f, 0xa6, 0xc2, 0xd7, 0xd3, 0x3b, 0xd0, 0xcf, 0xf4, 0xa9, 0x3b, 0xb1, 0x24, 0x9f, - 0x86, 0x47, 0x92, 0x49, 0xd8, 0x7f, 0x4b, 0x5a, 0x73, 0x55, 0xf9, 0xef, 0x53, 0x61, 0x9f, 0xbf, - 0xde, 0xe4, 0x33, 0x7d, 0xea, 0x0e, 0x0c, 0x49, 0x05, 0xc6, 0xe7, 0xca, 0xb5, 0xd0, 0x83, 0x8e, - 0x3f, 0x4a, 0x45, 0x9e, 0x5f, 0x85, 0xf1, 0xf8, 0xfc, 0x2a, 0x0c, 0x62, 0xf6, 0x54, 0x00, 0x9a, - 0x32, 0x75, 0xe5, 0x7f, 0x88, 0xd8, 0x53, 0x21, 0x2c, 0xfa, 0x97, 0xca, 0x00, 0x36, 0xcf, 0x06, - 0x00, 0xef, 0x5e, 0xfe, 0x5f, 0x46, 0xe6, 0xd9, 0x18, 0x05, 0x9b, 0x67, 0x63, 0x40, 0x66, 0xe5, - 0x04, 0xc0, 0x79, 0x4b, 0xb8, 0xfc, 0x1a, 0x96, 0xa9, 0xfc, 0xab, 0x88, 0x95, 0x93, 0x4c, 0xc6, - 0xac, 0x9c, 0x64, 0xcc, 0xe4, 0x00, 0xf4, 0xe3, 0x0d, 0xfe, 0xcd, 0xdc, 0xe0, 0x2f, 0xa5, 0xf2, - 0xbf, 0x9c, 0xba, 0x99, 0x1b, 0xfc, 0xe5, 0x54, 0xfe, 0x57, 0xd8, 0xff, 0xbf, 0x92, 0xca, 0xff, - 0x6a, 0x4a, 0x3d, 0x1f, 0x91, 0x76, 0xad, 0xa5, 0x89, 0x65, 0x35, 0x11, 0xc5, 0x7f, 0x26, 0xa2, - 0x44, 0x02, 0xe0, 0xaf, 0xa4, 0x60, 0xa4, 0xee, 0xda, 0x54, 0x5b, 0x13, 0x11, 0xa3, 0x2f, 0xc0, - 0x20, 0x7f, 0x73, 0xe7, 0x85, 0x38, 0x52, 0xfd, 0xdf, 0xe4, 0x12, 0x8c, 0xcd, 0x6a, 0x8e, 0x8b, - 0x4d, 0xac, 0x9a, 0x3a, 0xbd, 0x8f, 0xf1, 0x26, 0x32, 0x6a, 0x04, 0x4a, 0x66, 0x39, 0x1d, 0x2f, - 0x87, 0x29, 0x14, 0x32, 0x3b, 0x06, 0x4a, 0x1e, 0xfc, 0xe6, 0x56, 0xa1, 0x0f, 0xe3, 0x22, 0x47, - 0xca, 0x16, 0xbf, 0x95, 0x82, 0xd8, 0x6b, 0xc0, 0xfd, 0x47, 0x46, 0x5b, 0x80, 0xf1, 0x48, 0xda, - 0x0e, 0x11, 0x34, 0x63, 0x97, 0x59, 0x3d, 0xa2, 0xa5, 0xc9, 0x07, 0xfc, 0x60, 0x0d, 0xb7, 0xd5, - 0x59, 0x11, 0x04, 0x1b, 0x93, 0xdb, 0x75, 0xec, 0x96, 0x2a, 0xa1, 0x44, 0x90, 0xd3, 0xef, 0xe4, - 0x83, 0x9c, 0x04, 0xe4, 0x92, 0x08, 0xd3, 0x26, 0xc5, 0xe7, 0xef, 0x38, 0xd4, 0x96, 0x43, 0x67, - 0x63, 0x58, 0xb6, 0x8f, 0xc2, 0x48, 0x75, 0xad, 0x4d, 0x6d, 0xc7, 0x32, 0x35, 0xd7, 0xb2, 0x45, - 0x18, 0x29, 0x0c, 0xf8, 0x64, 0x48, 0x70, 0x39, 0xe0, 0x93, 0x4c, 0x4f, 0xae, 0x78, 0xf9, 0xb9, - 0x33, 0x98, 0x0d, 0x02, 0x43, 0xa9, 0x60, 0x7e, 0x6e, 0x39, 0x26, 0x17, 0x52, 0x30, 0xd2, 0xdb, - 0x8e, 0x86, 0x61, 0x3d, 0x7c, 0xd2, 0x0e, 0x03, 0xc8, 0xa4, 0x48, 0x41, 0x9e, 0x86, 0x1c, 0xda, - 0xc3, 0x0e, 0xe6, 0xdd, 0x17, 0x01, 0xbd, 0x5b, 0x08, 0x91, 0x43, 0x87, 0x71, 0x1a, 0x72, 0x0b, - 0xf2, 0x81, 0x8f, 0xe7, 0x0d, 0xdb, 0xea, 0xb4, 0xbd, 0x4c, 0x9b, 0x85, 0xed, 0xad, 0xc2, 0x43, - 0xab, 0x3e, 0xae, 0xb1, 0x8c, 0x48, 0x89, 0x45, 0xac, 0x20, 0x99, 0x81, 0xf1, 0x00, 0xc6, 0x44, - 0xe4, 0x65, 0xf8, 0xc5, 0x30, 0x55, 0x12, 0x2f, 0x26, 0x4e, 0x99, 0x55, 0xb4, 0x18, 0xa9, 0xc2, - 0x80, 0x17, 0xcd, 0x7b, 0x70, 0x47, 0x25, 0x3d, 0x25, 0xa2, 0x79, 0x0f, 0xc8, 0x71, 0xbc, 0xbd, - 0xf2, 0x64, 0x1a, 0xc6, 0x54, 0xab, 0xe3, 0xd2, 0x45, 0x4b, 0x5c, 0x8e, 0x88, 0xa8, 0xf1, 0xd8, - 0x26, 0x9b, 0x61, 0x1a, 0xae, 0xd5, 0x68, 0x72, 0x9c, 0x1c, 0x3a, 0x2b, 0x5c, 0x8a, 0xcc, 0xc3, - 0x44, 0xcc, 0x1b, 0x16, 0xa3, 0x80, 0x0c, 0xf1, 0xb8, 0xcc, 0xd2, 0xe7, 0xc5, 0x99, 0xc5, 0x8b, - 0x92, 0xef, 0x4b, 0x41, 0x6e, 0xd1, 0xd6, 0x0c, 0xd7, 0x11, 0x11, 0x41, 0xce, 0x5c, 0xdd, 0xb0, - 0xb5, 0x36, 0xd3, 0x8f, 0xab, 0x98, 0xee, 0xe3, 0x8e, 0xd6, 0xea, 0x50, 0x67, 0xf2, 0x2e, 0xfb, - 0xba, 0x7f, 0xb9, 0x55, 0x78, 0x95, 0x87, 0x7f, 0xbb, 0xda, 0xb4, 0xd6, 0xae, 0x2d, 0xdb, 0xda, - 0xba, 0xe1, 0xe2, 0xec, 0xa4, 0xb5, 0xae, 0xb9, 0xb4, 0x85, 0x57, 0xfb, 0xd7, 0xb4, 0xb6, 0x71, - 0x0d, 0xd3, 0x4a, 0x5d, 0xf3, 0x39, 0xf1, 0x1a, 0x98, 0x0a, 0xb8, 0xf8, 0x97, 0xac, 0x02, 0x1c, - 0x47, 0xe6, 0x01, 0xc4, 0xa7, 0x96, 0xda, 0x6d, 0x11, 0x5e, 0x44, 0xba, 0x10, 0xf7, 0x30, 0x5c, - 0xb1, 0x7d, 0x81, 0x69, 0x6d, 0x29, 0x95, 0x8a, 0x2a, 0x71, 0x60, 0x5a, 0xb0, 0x28, 0x5a, 0xe4, - 0x89, 0x69, 0x54, 0x0a, 0x56, 0x26, 0x50, 0x09, 0x42, 0x8a, 0x16, 0x23, 0x4b, 0x30, 0x2e, 0xf8, - 0xfa, 0x89, 0x17, 0xc7, 0xc2, 0xb3, 0x42, 0x04, 0xcd, 0x95, 0xd6, 0x6f, 0xa3, 0x2e, 0xc0, 0x72, - 0x1d, 0x91, 0x12, 0x64, 0x12, 0x46, 0xbd, 0xbf, 0xe7, 0xb5, 0x35, 0xea, 0x28, 0xe3, 0xa8, 0xb1, - 0x98, 0x37, 0xc3, 0x2b, 0x8f, 0x81, 0xed, 0x65, 0xd1, 0x85, 0x8b, 0xc8, 0x3c, 0xb8, 0xd6, 0xe7, - 0x13, 0x78, 0x44, 0x75, 0x3e, 0x5c, 0x84, 0x94, 0x61, 0xd4, 0x7f, 0xdd, 0x7c, 0xfb, 0x76, 0xb5, - 0x82, 0xf1, 0x4b, 0x44, 0x6e, 0x83, 0x48, 0x6a, 0x44, 0x99, 0x49, 0xa8, 0x8c, 0x14, 0xd4, 0x8e, - 0x07, 0x34, 0x89, 0x04, 0xb5, 0x6b, 0x27, 0x04, 0xb5, 0xab, 0x91, 0x8f, 0xc0, 0x70, 0xe9, 0x6e, - 0x5d, 0x04, 0xeb, 0x73, 0x94, 0x53, 0x41, 0x9e, 0x5d, 0x8c, 0x10, 0x28, 0x02, 0xfb, 0xc9, 0x4d, - 0x97, 0xe9, 0xc9, 0x14, 0x8c, 0x85, 0xb6, 0xca, 0x8e, 0x72, 0x1a, 0x39, 0x60, 0xcb, 0x35, 0xc4, - 0x34, 0x6c, 0x81, 0x92, 0x87, 0x57, 0xb8, 0x10, 0xd3, 0x9a, 0x8a, 0xe1, 0x60, 0xce, 0x52, 0x95, - 0x62, 0x5c, 0x40, 0x8c, 0x86, 0x32, 0xc8, 0xb5, 0x46, 0x17, 0xa8, 0x86, 0xcd, 0x71, 0x72, 0x8f, - 0x46, 0x8a, 0x91, 0xb7, 0x81, 0x60, 0x96, 0x53, 0xaa, 0x7b, 0x1b, 0xb1, 0x6a, 0xc5, 0x51, 0xce, - 0x62, 0xda, 0x23, 0x12, 0x0d, 0xe3, 0x55, 0xad, 0x4c, 0x5e, 0x12, 0xd3, 0xc7, 0x23, 0x1a, 0x2f, - 0xd5, 0xf0, 0x42, 0x78, 0x35, 0x0c, 0x5d, 0x6e, 0x71, 0x02, 0x57, 0xb2, 0x01, 0xe7, 0x6a, 0x36, - 0x5d, 0x37, 0xac, 0x8e, 0xe3, 0x2d, 0x1f, 0xde, 0xbc, 0x75, 0x6e, 0xc7, 0x79, 0xeb, 0x31, 0x51, - 0xf1, 0x99, 0xb6, 0x4d, 0xd7, 0x1b, 0x5e, 0xb2, 0x9b, 0x50, 0x36, 0x82, 0x6e, 0xdc, 0x99, 0xb8, - 0x30, 0x26, 0xa2, 0x80, 0x1b, 0xd4, 0x51, 0x94, 0x60, 0xaa, 0xe5, 0x11, 0x28, 0x0d, 0x1f, 0x27, - 0x8b, 0x2b, 0x52, 0x8c, 0xa8, 0x40, 0x6e, 0x94, 0x3d, 0xdf, 0xc9, 0x52, 0xb3, 0x69, 0x75, 0x4c, - 0xd7, 0x51, 0xce, 0x23, 0xb3, 0x22, 0x13, 0xcb, 0x72, 0xd3, 0x4f, 0x7c, 0xd5, 0xd0, 0x04, 0x5e, - 0x16, 0x4b, 0xbc, 0x34, 0x99, 0x85, 0x7c, 0xcd, 0xc6, 0x9b, 0xdc, 0x5b, 0x74, 0x93, 0x5b, 0xf4, - 0x18, 0x94, 0x45, 0x4c, 0x95, 0x6d, 0x8e, 0xc3, 0x7c, 0x34, 0x6d, 0xc4, 0xca, 0xcb, 0x4a, 0xb4, - 0xa4, 0x9c, 0x6a, 0xe5, 0xa1, 0xdd, 0xa5, 0x5a, 0xa1, 0x90, 0x17, 0x9e, 0x97, 0xf7, 0x5d, 0x6a, - 0xb2, 0xa5, 0xde, 0x11, 0x01, 0x58, 0x94, 0x88, 0xa7, 0xa6, 0x8f, 0xe7, 0x53, 0x87, 0x18, 0x65, - 0xd4, 0x07, 0xcb, 0x0d, 0x8b, 0x16, 0x89, 0xe7, 0x23, 0x79, 0x78, 0x1f, 0xf9, 0x48, 0xfe, 0xf7, - 0x8c, 0x3c, 0xff, 0x92, 0x8b, 0x90, 0x95, 0x92, 0xa9, 0x62, 0xb2, 0x05, 0x4c, 0x3c, 0x95, 0x15, - 0x39, 0x64, 0x86, 0x84, 0xed, 0xe2, 0x87, 0xad, 0xc4, 0xec, 0xf9, 0x41, 0x00, 0x7e, 0x35, 0x20, - 0xc0, 0xcc, 0xe5, 0x9d, 0xa5, 0x96, 0xd1, 0xc4, 0x74, 0x64, 0x19, 0x29, 0xcc, 0x1b, 0x42, 0x79, - 0x36, 0x32, 0x89, 0x84, 0x5c, 0x87, 0x61, 0xcf, 0x83, 0x20, 0x48, 0x36, 0x82, 0x59, 0xaa, 0xc4, - 0x6c, 0x2d, 0x92, 0x60, 0x49, 0x44, 0xe4, 0x15, 0x80, 0x60, 0x3a, 0x10, 0x96, 0x16, 0x2e, 0x15, - 0xf2, 0xec, 0x21, 0x2f, 0x15, 0x01, 0x35, 0x9b, 0x38, 0x65, 0x75, 0xdc, 0x14, 0x39, 0x48, 0x70, - 0xe2, 0x0c, 0xe9, 0xb0, 0xac, 0x20, 0xe1, 0x22, 0x64, 0x01, 0x26, 0x62, 0x1a, 0x28, 0x52, 0x93, - 0x3c, 0xb6, 0xbd, 0x55, 0x78, 0x38, 0x41, 0x7d, 0xe5, 0x85, 0x39, 0x56, 0x96, 0x3c, 0x0e, 0x99, - 0xdb, 0x6a, 0x55, 0xa4, 0x47, 0xe0, 0x99, 0x35, 0x42, 0xc1, 0x49, 0x19, 0x96, 0xbc, 0x0c, 0xc0, - 0x93, 0x33, 0xd6, 0x2c, 0xdb, 0x45, 0x8b, 0x62, 0x94, 0x67, 0x88, 0xe2, 0xc9, 0x1b, 0x1b, 0x6c, - 0x19, 0x93, 0x3f, 0x3a, 0x20, 0x2e, 0xfe, 0xe5, 0x74, 0x6c, 0x59, 0x63, 0x82, 0x17, 0xad, 0x90, - 0x3a, 0x1f, 0x05, 0xef, 0x35, 0x9d, 0x0b, 0x5e, 0x22, 0x22, 0x97, 0x61, 0xb0, 0xc6, 0x26, 0x95, - 0xa6, 0xd5, 0x12, 0xaa, 0x80, 0x31, 0x72, 0xdb, 0x02, 0xa6, 0xfa, 0x58, 0x72, 0x9d, 0xa7, 0xed, - 0x31, 0x23, 0xc9, 0x8a, 0x3a, 0x02, 0x16, 0xcd, 0xda, 0xc3, 0x60, 0xac, 0x4c, 0x28, 0xdb, 0xb1, - 0x28, 0x93, 0xb0, 0xa4, 0x06, 0xd9, 0x8d, 0x7d, 0x83, 0xb6, 0x7f, 0x27, 0x83, 0xb6, 0xf8, 0x6b, - 0xa9, 0xf8, 0x10, 0x25, 0x2f, 0xc4, 0xf3, 0x86, 0xe0, 0xfa, 0xe5, 0x03, 0xe5, 0x5a, 0xfd, 0x0c, - 0x22, 0xa1, 0x0c, 0x20, 0xe9, 0x7d, 0x67, 0x00, 0xc9, 0xec, 0x31, 0x03, 0x48, 0xf1, 0xff, 0xce, - 0xf6, 0x7c, 0x64, 0x78, 0x24, 0x91, 0xa2, 0x5f, 0x66, 0x9b, 0x32, 0x56, 0x7b, 0xc9, 0x89, 0x6d, - 0x2d, 0xf8, 0x1b, 0xaa, 0x86, 0xc6, 0x47, 0xa5, 0xa3, 0x86, 0x29, 0xc9, 0xeb, 0x30, 0xe2, 0x7d, - 0x00, 0x66, 0x96, 0x91, 0x32, 0xa2, 0xf8, 0x0b, 0x62, 0x24, 0x07, 0x4b, 0xa8, 0x00, 0x79, 0x11, - 0x86, 0xd0, 0x1c, 0x6a, 0x6b, 0x4d, 0x2f, 0xed, 0x10, 0xcf, 0x53, 0xe4, 0x01, 0xe5, 0x68, 0xc8, - 0x3e, 0x25, 0xf9, 0x24, 0xe4, 0x44, 0x66, 0xc2, 0x1c, 0x2e, 0xd1, 0xd7, 0x76, 0xf1, 0x2a, 0xf3, - 0xaa, 0x9c, 0x95, 0x90, 0x6f, 0x70, 0x10, 0x10, 0xda, 0xe0, 0xf0, 0x84, 0x84, 0x8b, 0x70, 0xaa, - 0x66, 0x53, 0x1d, 0xdf, 0xff, 0x4e, 0xdd, 0x6f, 0xdb, 0x22, 0x67, 0x24, 0x9f, 0x20, 0x70, 0x7d, - 0x6b, 0x7b, 0x68, 0xb6, 0xf2, 0x0a, 0xbc, 0x9c, 0xfb, 0x24, 0xa1, 0x38, 0x33, 0x7a, 0x78, 0x4b, - 0x6e, 0xd1, 0xcd, 0x0d, 0xcb, 0xd6, 0x79, 0x5a, 0x45, 0x31, 0xf5, 0x0b, 0x41, 0xaf, 0x0a, 0x94, - 0x6c, 0xf4, 0x84, 0x0b, 0x5d, 0x78, 0x19, 0x86, 0xf7, 0x9b, 0xd9, 0xef, 0xe7, 0xd2, 0x5d, 0x9e, - 0xeb, 0x3f, 0xb8, 0xc9, 0xd5, 0x0b, 0xd0, 0xcf, 0x43, 0x22, 0x71, 0xe5, 0x1b, 0xda, 0xde, 0x2a, - 0xf4, 0x7f, 0x1a, 0xfd, 0xa7, 0x39, 0xbc, 0xf8, 0x67, 0xe9, 0x2e, 0xb1, 0x08, 0x1e, 0x5c, 0x99, - 0xb1, 0x85, 0xc7, 0x13, 0x46, 0xb5, 0x82, 0x92, 0x1b, 0x15, 0x0b, 0x8f, 0x07, 0x66, 0x46, 0x85, - 0x4c, 0x44, 0xae, 0x02, 0xd4, 0x34, 0x5b, 0x5b, 0xa3, 0x2e, 0xdb, 0xeb, 0xf0, 0xd3, 0x02, 0xb4, - 0x42, 0xda, 0x3e, 0x54, 0x95, 0x28, 0x8a, 0x3f, 0x95, 0xe9, 0x15, 0xab, 0xe1, 0x44, 0xf6, 0x7b, - 0x91, 0xfd, 0x75, 0x18, 0xf6, 0x25, 0x5b, 0xad, 0xa0, 0xbd, 0x34, 0xea, 0xe7, 0x11, 0xe5, 0x60, - 0x2c, 0x23, 0x11, 0x91, 0x2b, 0xbc, 0xad, 0x75, 0xe3, 0x1d, 0x9e, 0xb3, 0x6d, 0x54, 0x64, 0xe3, - 0xd2, 0x5c, 0xad, 0xe1, 0x18, 0xef, 0x50, 0xd5, 0x47, 0x17, 0xff, 0x51, 0x3a, 0x31, 0xe0, 0xc5, - 0x49, 0x1f, 0xed, 0xa1, 0x8f, 0x12, 0x84, 0xc8, 0x43, 0x75, 0x9c, 0x08, 0x71, 0x0f, 0x42, 0xfc, - 0xd3, 0x74, 0x62, 0x60, 0x93, 0x13, 0x21, 0xee, 0x65, 0xb6, 0x78, 0x1a, 0x86, 0x54, 0x6b, 0xc3, - 0x29, 0xe3, 0x9e, 0x88, 0xcf, 0x15, 0x38, 0x51, 0xdb, 0xd6, 0x86, 0xd3, 0xc0, 0xdd, 0x8e, 0x1a, - 0x10, 0x14, 0xbf, 0x93, 0xee, 0x11, 0xfa, 0xe5, 0x44, 0xf0, 0xef, 0xe6, 0x12, 0xf9, 0x0b, 0xe9, - 0x50, 0x68, 0x99, 0x07, 0x57, 0xd8, 0xd7, 0x00, 0xea, 0xcd, 0x15, 0xba, 0xa6, 0x49, 0x79, 0x6f, - 0xf1, 0xc8, 0xc2, 0x41, 0x28, 0xdf, 0x06, 0x4b, 0x24, 0xc5, 0x5f, 0x4a, 0x47, 0x62, 0xeb, 0x9c, - 0xc8, 0x6e, 0xd7, 0xb2, 0xf3, 0xb5, 0x4e, 0x84, 0x0b, 0x3a, 0x91, 0xdc, 0x6e, 0x25, 0xf7, 0x03, - 0xe9, 0x48, 0x64, 0xa5, 0x07, 0x56, 0x76, 0x6c, 0x00, 0xc6, 0x23, 0x3e, 0x3d, 0xb0, 0x9a, 0xf4, - 0x34, 0x0c, 0x09, 0x39, 0xf8, 0x4b, 0x05, 0x9f, 0xf7, 0x39, 0x10, 0x0f, 0x68, 0x7d, 0x82, 0xe2, - 0x5f, 0x49, 0x43, 0x38, 0xe2, 0xd5, 0x03, 0xaa, 0x43, 0xbf, 0x90, 0x0e, 0xc7, 0xfa, 0x7a, 0x70, - 0xf5, 0xe7, 0x2a, 0x40, 0xbd, 0xb3, 0xd4, 0x14, 0x1e, 0xb5, 0xfd, 0xd2, 0x09, 0xbf, 0x0f, 0x55, - 0x25, 0x8a, 0xe2, 0x7f, 0x48, 0x27, 0x06, 0x20, 0x7b, 0x70, 0x05, 0xf8, 0x3c, 0x9e, 0x8a, 0x37, - 0xcd, 0x60, 0x22, 0xc7, 0x43, 0x48, 0x36, 0xfe, 0x62, 0xc9, 0xd2, 0x3d, 0x42, 0xf2, 0xe1, 0x04, - 0x73, 0x0d, 0x53, 0xb9, 0x05, 0xe6, 0x9a, 0x7c, 0x98, 0x2f, 0x19, 0x6e, 0xbf, 0x95, 0xde, 0x29, - 0x5e, 0xdb, 0x83, 0xbc, 0xaa, 0x0e, 0xd4, 0xb4, 0x4d, 0x8c, 0x2b, 0xce, 0x7a, 0x62, 0x84, 0xa7, - 0xf2, 0x6e, 0x73, 0x90, 0x7c, 0x6d, 0x27, 0xa8, 0x8a, 0xff, 0xb6, 0x3f, 0x39, 0x58, 0xd8, 0x83, - 0x2b, 0xc2, 0x8b, 0x90, 0xad, 0x69, 0xee, 0x8a, 0xd0, 0x64, 0xbc, 0x0d, 0x6c, 0x6b, 0xee, 0x8a, - 0x8a, 0x50, 0x72, 0x05, 0x06, 0x55, 0x6d, 0x83, 0x9f, 0x79, 0xe6, 0x82, 0x34, 0xeb, 0xb6, 0xb6, - 0xd1, 0xe0, 0xe7, 0x9e, 0x3e, 0x9a, 0x14, 0xfd, 0x34, 0xff, 0xfc, 0xe4, 0x1b, 0x73, 0x4c, 0xf3, - 0x34, 0xff, 0x7e, 0x72, 0xff, 0x8b, 0x90, 0x9d, 0xb4, 0xf4, 0x4d, 0xbc, 0xf9, 0x1a, 0xe1, 0x95, - 0x2d, 0x59, 0xfa, 0xa6, 0x8a, 0x50, 0xf2, 0xb9, 0x14, 0x0c, 0xcc, 0x50, 0x4d, 0x67, 0x23, 0x64, - 0xa8, 0x97, 0xc3, 0xca, 0x9b, 0x87, 0xe3, 0xb0, 0x32, 0xb1, 0xc2, 0x2b, 0x93, 0x15, 0x45, 0xd4, - 0x4f, 0x6e, 0xc0, 0x60, 0x59, 0x73, 0xe9, 0xb2, 0x65, 0x6f, 0xa2, 0x0b, 0xce, 0x58, 0xf0, 0xe0, - 0x34, 0xa4, 0x3f, 0x1e, 0x11, 0xbf, 0x19, 0x6b, 0x8a, 0x5f, 0xaa, 0x5f, 0x98, 0x89, 0x85, 0xdf, - 0xcc, 0xa1, 0x0f, 0x8e, 0x10, 0x0b, 0xbf, 0xc2, 0x53, 0x05, 0x26, 0x38, 0x56, 0x1e, 0x49, 0x3e, - 0x56, 0x46, 0xeb, 0x11, 0xdd, 0xf4, 0x30, 0xb9, 0xfe, 0x28, 0x2e, 0xfa, 0xdc, 0x7a, 0x44, 0x28, - 0xe6, 0xd6, 0x57, 0x25, 0x92, 0xe2, 0x1f, 0xf7, 0x43, 0x62, 0x68, 0xa1, 0x13, 0x25, 0x3f, 0x51, - 0xf2, 0x40, 0xc9, 0x2b, 0x31, 0x25, 0xbf, 0x10, 0x0f, 0x56, 0xf5, 0x1e, 0xd5, 0xf0, 0x2f, 0x67, - 0x63, 0xa1, 0xee, 0x1e, 0xec, 0xdd, 0x65, 0x20, 0xbd, 0xfe, 0x1d, 0xa5, 0xe7, 0x0f, 0x88, 0xdc, - 0x8e, 0x03, 0x62, 0x60, 0xb7, 0x03, 0x62, 0xb0, 0xeb, 0x80, 0x08, 0x14, 0x64, 0xa8, 0xab, 0x82, - 0x54, 0xc5, 0xa0, 0x81, 0xde, 0x29, 0xf7, 0x2e, 0x6e, 0x6f, 0x15, 0xc6, 0xd8, 0x68, 0x4a, 0xcc, - 0xb5, 0x87, 0x2c, 0x8a, 0xdf, 0xca, 0xf6, 0x88, 0x4f, 0x79, 0x24, 0x3a, 0xf2, 0x3c, 0x64, 0x4a, - 0xed, 0xb6, 0xd0, 0x8f, 0x53, 0x52, 0x68, 0xcc, 0x2e, 0xa5, 0x18, 0x35, 0x79, 0x05, 0x32, 0xa5, - 0xbb, 0xf5, 0x68, 0x96, 0xbd, 0xd2, 0xdd, 0xba, 0xf8, 0x92, 0xae, 0x65, 0xef, 0xd6, 0xc9, 0x6b, - 0x41, 0xb8, 0xfb, 0x95, 0x8e, 0xb9, 0x2a, 0x36, 0x8a, 0xc2, 0x53, 0xd7, 0xf3, 0xe4, 0x69, 0x32, - 0x14, 0xdb, 0x2e, 0x46, 0x68, 0x23, 0xda, 0x94, 0xdb, 0xbd, 0x36, 0x0d, 0xec, 0xa8, 0x4d, 0x83, - 0xbb, 0xd5, 0xa6, 0xa1, 0x5d, 0x68, 0x13, 0xec, 0xa8, 0x4d, 0xc3, 0x07, 0xd7, 0xa6, 0x36, 0x5c, - 0x88, 0xc7, 0x14, 0xf6, 0x35, 0x42, 0x05, 0x12, 0xc7, 0x0a, 0xc7, 0x12, 0xbc, 0xfa, 0xef, 0x70, - 0x6c, 0x63, 0x03, 0xd1, 0x0d, 0x87, 0xe1, 0x65, 0xd7, 0xb6, 0x78, 0xe9, 0xe2, 0xcf, 0xa5, 0xbb, - 0x87, 0x42, 0x3e, 0x9e, 0x53, 0xdc, 0x77, 0x27, 0x4a, 0x29, 0x1b, 0x79, 0x84, 0xd9, 0x55, 0xca, - 0x11, 0xb6, 0x49, 0x32, 0xfb, 0x5a, 0xba, 0x5b, 0x7c, 0xe6, 0x03, 0x49, 0xec, 0xc9, 0xb8, 0x33, - 0x1c, 0xba, 0xf8, 0x3b, 0x61, 0x2f, 0xb8, 0x69, 0x18, 0x91, 0x85, 0x28, 0xa4, 0xb4, 0x1b, 0x01, - 0x87, 0xca, 0x91, 0xd7, 0xfc, 0x64, 0x88, 0x92, 0x7f, 0x0c, 0x7a, 0xba, 0x79, 0x63, 0x36, 0xe2, - 0x1e, 0x23, 0x93, 0x93, 0xa7, 0x21, 0x37, 0x8d, 0xd9, 0x85, 0xe4, 0xc1, 0xce, 0xf3, 0x0d, 0xc9, - 0x5e, 0x2b, 0x9c, 0xa6, 0xf8, 0x6b, 0x29, 0x38, 0x75, 0xab, 0xb3, 0x44, 0x85, 0xa3, 0x9d, 0xdf, - 0x86, 0xb7, 0x01, 0x18, 0x58, 0x38, 0xcc, 0xa4, 0xd0, 0x61, 0xe6, 0x83, 0x72, 0x1c, 0xe7, 0x48, - 0x81, 0xab, 0x01, 0x35, 0x77, 0x96, 0x79, 0xd8, 0xf3, 0x39, 0x5d, 0xed, 0x2c, 0xd1, 0x46, 0xcc, - 0x6b, 0x46, 0xe2, 0x7e, 0xe1, 0x23, 0xdc, 0x9b, 0x7f, 0xbf, 0x0e, 0x2a, 0x3f, 0x9b, 0xee, 0x1a, - 0x3a, 0xfb, 0xd8, 0x26, 0xd1, 0xff, 0x44, 0x62, 0xaf, 0x44, 0x93, 0xe9, 0x27, 0x90, 0x44, 0x38, - 0x26, 0x71, 0x49, 0x16, 0xd8, 0x11, 0x4e, 0x2c, 0xef, 0x79, 0x81, 0x7d, 0x3b, 0xd5, 0x35, 0xc4, - 0xf9, 0x71, 0x15, 0x58, 0xf1, 0x7f, 0xc9, 0x78, 0x91, 0xd5, 0x0f, 0xf4, 0x09, 0x4f, 0xc3, 0x90, - 0x78, 0x6c, 0x1f, 0xf6, 0x13, 0x16, 0xc7, 0x86, 0x78, 0x0c, 0xed, 0x13, 0x30, 0x93, 0x42, 0x72, - 0x62, 0x96, 0xfc, 0x84, 0x25, 0x07, 0x66, 0x55, 0x22, 0x61, 0x46, 0xc3, 0xd4, 0x7d, 0xc3, 0x45, - 0x0b, 0x84, 0xf5, 0x65, 0x86, 0x1b, 0x0d, 0xf4, 0xbe, 0xe1, 0x72, 0xfb, 0xc3, 0x47, 0x33, 0x83, - 0x80, 0xdb, 0x22, 0x62, 0xde, 0x43, 0x83, 0x80, 0x9b, 0x2a, 0xaa, 0xc0, 0xb0, 0xd6, 0x0a, 0xe7, - 0x5b, 0xe1, 0xd2, 0x22, 0x5a, 0x2b, 0xdc, 0x75, 0xb1, 0xb5, 0x3e, 0x01, 0xe3, 0xa8, 0xd2, 0xe5, - 0xc0, 0x89, 0x0f, 0x39, 0xda, 0x08, 0x51, 0x05, 0x86, 0x5c, 0x87, 0xb1, 0xba, 0xab, 0x99, 0xba, - 0x66, 0xeb, 0x0b, 0x1d, 0xb7, 0xdd, 0x71, 0x65, 0x03, 0xd8, 0x71, 0x75, 0xab, 0xe3, 0xaa, 0x11, - 0x0a, 0xf2, 0x2c, 0x8c, 0x7a, 0x90, 0x29, 0xdb, 0xb6, 0x6c, 0xd9, 0xca, 0x71, 0x5c, 0x9d, 0xda, - 0xb6, 0x1a, 0x26, 0x20, 0x1f, 0x86, 0xd1, 0xaa, 0xe9, 0xbf, 0x1d, 0x57, 0x67, 0x85, 0xcd, 0x83, - 0x2f, 0xc6, 0x0c, 0x1f, 0xd1, 0xe8, 0xd8, 0x2d, 0x35, 0x4c, 0x58, 0xdc, 0x4e, 0xc7, 0x03, 0xd0, - 0x3f, 0xb8, 0x1b, 0xa4, 0x2b, 0x61, 0xc7, 0x3d, 0xf4, 0x56, 0x45, 0xe3, 0x53, 0xf6, 0x1b, 0xe6, - 0x36, 0xe8, 0x75, 0x18, 0xbc, 0x45, 0x37, 0xb9, 0x8f, 0x69, 0x2e, 0x70, 0x4b, 0x5e, 0x15, 0x30, - 0xf9, 0x74, 0xd7, 0xa3, 0x2b, 0x7e, 0x23, 0x1d, 0x0f, 0xad, 0xff, 0xe0, 0x0a, 0xfb, 0x59, 0x18, - 0x40, 0x51, 0x56, 0xbd, 0xeb, 0x05, 0x14, 0x20, 0x8a, 0x3b, 0xec, 0xed, 0xec, 0x91, 0x15, 0x7f, - 0x32, 0x17, 0xcd, 0xb7, 0xf0, 0xe0, 0x4a, 0xef, 0x55, 0x18, 0x2e, 0x5b, 0xa6, 0x63, 0x38, 0x2e, - 0x35, 0x9b, 0x9e, 0xc2, 0xa2, 0xe3, 0x7f, 0x33, 0x00, 0xcb, 0x36, 0xa0, 0x44, 0xbd, 0x1f, 0xe5, - 0x25, 0x2f, 0xc1, 0x10, 0x8a, 0x1c, 0x6d, 0x4e, 0x3e, 0xe1, 0xe1, 0xcd, 0xc4, 0x12, 0x03, 0x46, - 0x2d, 0xce, 0x80, 0x94, 0xdc, 0x86, 0xc1, 0xf2, 0x8a, 0xd1, 0xd2, 0x6d, 0x6a, 0xa2, 0x6f, 0xb2, - 0x14, 0xd6, 0x2e, 0xdc, 0x97, 0x57, 0xf1, 0x5f, 0xa4, 0xe5, 0xcd, 0x69, 0x8a, 0x62, 0xa1, 0xc7, - 0x62, 0x02, 0x76, 0xe1, 0x47, 0xd2, 0x00, 0x41, 0x01, 0xf2, 0x28, 0xa4, 0xbd, 0x17, 0xc9, 0xdc, - 0x25, 0x26, 0xa4, 0x41, 0x69, 0x5c, 0x2a, 0xc4, 0xd8, 0x4e, 0xef, 0x38, 0xb6, 0x6f, 0x43, 0x8e, - 0x9f, 0xae, 0xa1, 0xd7, 0xba, 0xf4, 0xc6, 0xbe, 0x6b, 0x83, 0xaf, 0x22, 0x3d, 0xb7, 0xa5, 0xd1, - 0xf2, 0x0c, 0x79, 0x80, 0x73, 0x66, 0x17, 0x9a, 0xd0, 0x8f, 0x7f, 0x91, 0x4b, 0x90, 0x45, 0x29, - 0xa6, 0x70, 0xcf, 0x8c, 0xb3, 0x74, 0x44, 0x7e, 0x88, 0x67, 0xdd, 0x54, 0xb6, 0x4c, 0x97, 0x55, - 0x8d, 0xad, 0x1e, 0x11, 0x72, 0x11, 0xb0, 0x90, 0x5c, 0x04, 0xac, 0xf8, 0xcf, 0xd2, 0x09, 0x99, - 0x40, 0x1e, 0xdc, 0x61, 0xf2, 0x32, 0x00, 0xbe, 0x3c, 0x67, 0xf2, 0xf4, 0x9e, 0x83, 0xe0, 0x28, - 0x41, 0x46, 0xa8, 0xb6, 0xa1, 0x6d, 0x47, 0x40, 0x5c, 0xfc, 0xcd, 0x54, 0x2c, 0x7d, 0xc4, 0x81, - 0xe4, 0x28, 0x5b, 0x65, 0xe9, 0x7d, 0x9a, 0xb1, 0x5e, 0x5f, 0x64, 0xf6, 0xd6, 0x17, 0xe1, 0x6f, - 0x39, 0x04, 0xcb, 0xf4, 0x28, 0xbf, 0xe5, 0x8f, 0xd3, 0x49, 0xc9, 0x34, 0x8e, 0xa7, 0x8a, 0xbf, - 0xe0, 0x1b, 0xa5, 0xd9, 0x48, 0xfa, 0x22, 0x84, 0x46, 0x8a, 0x79, 0x66, 0xea, 0xa7, 0x60, 0x3c, - 0x92, 0x62, 0x02, 0xe7, 0x7f, 0x29, 0x2e, 0x47, 0x72, 0x22, 0x8a, 0xee, 0x31, 0x0b, 0x42, 0x64, - 0xc5, 0xff, 0x37, 0xd5, 0x3b, 0xc1, 0xc8, 0x91, 0xab, 0x4e, 0x82, 0x00, 0x32, 0x7f, 0x31, 0x02, - 0x38, 0x84, 0x6d, 0xf0, 0xf1, 0x16, 0xc0, 0x7b, 0x64, 0xf2, 0x78, 0xb7, 0x05, 0xf0, 0x93, 0xa9, - 0x1d, 0xf3, 0xc3, 0x1c, 0xb5, 0x0c, 0x8a, 0xff, 0x63, 0x2a, 0x31, 0x8f, 0xcb, 0x81, 0xda, 0xf5, - 0x1a, 0xe4, 0xb8, 0x0b, 0x8f, 0x68, 0x95, 0x94, 0xf9, 0x96, 0x41, 0xbb, 0x94, 0x17, 0x65, 0xc8, - 0x2c, 0x0c, 0xf0, 0x36, 0xe8, 0xa2, 0x37, 0x9e, 0xe8, 0x91, 0x4c, 0x46, 0xef, 0x36, 0x39, 0x0a, - 0x74, 0xf1, 0xd7, 0x53, 0xb1, 0xb4, 0x32, 0x47, 0xf8, 0x6d, 0xc1, 0x54, 0x9d, 0xd9, 0xfd, 0x54, - 0x5d, 0xfc, 0x37, 0xe9, 0xe4, 0xac, 0x36, 0x47, 0xf8, 0x21, 0x87, 0x71, 0x9c, 0xb6, 0xbf, 0x75, - 0x6b, 0x11, 0xc6, 0xc2, 0xb2, 0x10, 0xcb, 0xd6, 0x23, 0xc9, 0xb9, 0x7d, 0xba, 0xb4, 0x22, 0xc2, - 0xa3, 0xf8, 0xc3, 0xe9, 0x78, 0x42, 0x9e, 0x23, 0x9f, 0x9f, 0xf6, 0xa5, 0x2d, 0xa4, 0x0a, 0xe3, - 0xc1, 0x97, 0x2c, 0x1a, 0x6e, 0xcb, 0x3b, 0xdd, 0xc7, 0x98, 0x00, 0x22, 0x86, 0x45, 0xcb, 0x70, - 0xdc, 0x86, 0xcb, 0x90, 0xa1, 0x68, 0x0a, 0xe1, 0x72, 0x11, 0xa9, 0xbc, 0x47, 0x96, 0xad, 0xf7, - 0x98, 0x54, 0xde, 0x23, 0x6b, 0xd9, 0x91, 0x4b, 0xe5, 0xa7, 0xd3, 0xdd, 0x12, 0x36, 0x1d, 0xb9, - 0x6c, 0x3e, 0x2e, 0xf7, 0x17, 0x6f, 0x99, 0x90, 0xd2, 0xa3, 0xdd, 0x32, 0x24, 0x75, 0xe1, 0x19, - 0xe3, 0xb3, 0xbf, 0x49, 0x2c, 0x51, 0x58, 0xef, 0x91, 0xe1, 0x75, 0x3c, 0x84, 0xf5, 0x1e, 0x19, - 0x75, 0xef, 0x3d, 0x61, 0xfd, 0x72, 0x7a, 0xb7, 0x59, 0xc2, 0x4e, 0x84, 0x17, 0x13, 0xde, 0x17, - 0xd3, 0xf1, 0xec, 0x75, 0x47, 0x2e, 0xa6, 0x69, 0xc8, 0x89, 0x3c, 0x7a, 0x5d, 0x85, 0xc3, 0xf1, - 0xdd, 0x4c, 0x36, 0xf1, 0x1d, 0x2f, 0x80, 0xb8, 0xa9, 0xda, 0x9d, 0x48, 0x38, 0x6d, 0xf1, 0x3b, - 0xa9, 0x48, 0xaa, 0xb7, 0x23, 0x39, 0x23, 0xd9, 0xdf, 0xea, 0xf6, 0x11, 0xef, 0xb4, 0x36, 0x1b, - 0x09, 0x76, 0xec, 0x7f, 0x4f, 0x85, 0xba, 0x9a, 0xd1, 0x8a, 0x96, 0x17, 0x01, 0x16, 0xbe, 0x91, - 0x86, 0x89, 0x18, 0x29, 0xb9, 0x14, 0x0a, 0x69, 0x84, 0xe7, 0xae, 0x11, 0x4f, 0x7c, 0x1e, 0xdc, - 0x68, 0x0f, 0x47, 0xc5, 0x97, 0x20, 0x5b, 0xd1, 0x36, 0xf9, 0xb7, 0xf5, 0x73, 0x96, 0xba, 0xb6, - 0x29, 0x1f, 0x29, 0x22, 0x9e, 0x2c, 0xc1, 0x19, 0x7e, 0xe1, 0x63, 0x58, 0xe6, 0xa2, 0xb1, 0x46, - 0xab, 0xe6, 0x9c, 0xd1, 0x6a, 0x19, 0x8e, 0xb8, 0xb5, 0x7c, 0x7a, 0x7b, 0xab, 0x70, 0xd9, 0xb5, - 0x5c, 0xad, 0xd5, 0xa0, 0x1e, 0x59, 0xc3, 0x35, 0xd6, 0x68, 0xc3, 0x30, 0x1b, 0x6b, 0x48, 0x29, - 0xb1, 0x4c, 0x66, 0x45, 0xaa, 0x3c, 0xab, 0x52, 0xbd, 0xa9, 0x99, 0x26, 0xd5, 0xab, 0xe6, 0xe4, - 0xa6, 0x4b, 0xf9, 0x6d, 0x67, 0x86, 0x9f, 0x79, 0xf2, 0x87, 0xf6, 0x1c, 0xcd, 0x18, 0x2f, 0x31, - 0x02, 0x35, 0xa1, 0x50, 0xf1, 0x57, 0xb2, 0x09, 0x59, 0xfe, 0x8e, 0x91, 0xfa, 0x78, 0x3d, 0x9d, - 0xdd, 0xa1, 0xa7, 0xaf, 0xc1, 0x80, 0x48, 0x5b, 0x21, 0x6e, 0x50, 0xf0, 0x65, 0xc0, 0x3a, 0x07, - 0xc9, 0x57, 0x50, 0x82, 0x8a, 0xb4, 0xe0, 0xc2, 0x22, 0xeb, 0xa6, 0xe4, 0xce, 0xcc, 0xed, 0xa3, - 0x33, 0x7b, 0xf0, 0x23, 0x6f, 0xc1, 0x39, 0xc4, 0x26, 0x74, 0xeb, 0x00, 0x56, 0x85, 0xb6, 0x1e, - 0xaf, 0x2a, 0xb9, 0x73, 0xbb, 0x95, 0x27, 0x1f, 0x87, 0x11, 0x7f, 0x80, 0x18, 0xd4, 0x11, 0x57, - 0x33, 0x3d, 0xc6, 0x19, 0x0f, 0xc4, 0xc7, 0xc0, 0xe8, 0x8f, 0x17, 0x0e, 0xe6, 0x16, 0xe2, 0x55, - 0xfc, 0x57, 0xa9, 0x5e, 0xd9, 0x06, 0x8f, 0x7c, 0x56, 0xfe, 0x08, 0x0c, 0xe8, 0xfc, 0xa3, 0x84, - 0x4e, 0xf5, 0xce, 0x47, 0xc8, 0x49, 0x55, 0xaf, 0x4c, 0xf1, 0x5f, 0xa7, 0x7a, 0x26, 0x39, 0x3c, - 0xee, 0x9f, 0xf7, 0xc5, 0x4c, 0x97, 0xcf, 0x13, 0x93, 0xe8, 0x15, 0xc8, 0x1b, 0x41, 0x16, 0xa6, - 0x46, 0x10, 0xcb, 0x4b, 0x1d, 0x97, 0xe0, 0x38, 0xba, 0x5e, 0x00, 0xdf, 0x23, 0xcd, 0xf6, 0xdc, - 0xed, 0x9c, 0x46, 0xc7, 0x36, 0xf8, 0xb8, 0x54, 0x4f, 0x3b, 0x11, 0x5f, 0x3c, 0xe7, 0xb6, 0x6d, - 0xb0, 0x0a, 0x34, 0x77, 0x85, 0x9a, 0x5a, 0x63, 0xc3, 0xb2, 0x57, 0x31, 0xda, 0x2b, 0x1f, 0x9c, - 0xea, 0x38, 0x87, 0xdf, 0xf5, 0xc0, 0xe4, 0x71, 0x18, 0x5d, 0x6e, 0x75, 0xa8, 0x1f, 0x5f, 0x93, - 0x5f, 0x66, 0xaa, 0x23, 0x0c, 0xe8, 0x5f, 0x01, 0x3d, 0x0c, 0x80, 0x44, 0x98, 0xf2, 0x80, 0xdf, - 0x5c, 0xaa, 0x43, 0x0c, 0xb2, 0x28, 0xba, 0xeb, 0x02, 0xd7, 0x6a, 0x2e, 0xa4, 0x46, 0xcb, 0x32, - 0x97, 0x1b, 0x2e, 0xb5, 0xd7, 0xb0, 0xa1, 0xe8, 0xad, 0xa1, 0x9e, 0x45, 0x0a, 0xbc, 0x1b, 0x72, - 0x66, 0x2d, 0x73, 0x79, 0x91, 0xda, 0x6b, 0xac, 0xa9, 0x4f, 0x03, 0x11, 0x4d, 0xb5, 0xf1, 0x54, - 0x87, 0x7f, 0x1c, 0xba, 0x6b, 0xa8, 0xe2, 0x23, 0xf8, 0x71, 0x0f, 0x7e, 0x58, 0x01, 0x86, 0x79, - 0x90, 0x41, 0x2e, 0x34, 0xf4, 0xd1, 0x50, 0x81, 0x83, 0x50, 0x5e, 0x67, 0x41, 0xb8, 0x8f, 0x70, - 0x17, 0x79, 0x55, 0xfc, 0x2a, 0x7e, 0x3e, 0x93, 0x94, 0x97, 0xf1, 0x40, 0x8a, 0x16, 0x4c, 0xab, - 0xe9, 0x3d, 0x4d, 0xab, 0xe3, 0x66, 0x67, 0xad, 0xa1, 0xb5, 0xdb, 0x8d, 0x7b, 0x46, 0x0b, 0xdf, - 0xa8, 0xe1, 0xc2, 0xa7, 0x8e, 0x9a, 0x9d, 0xb5, 0x52, 0xbb, 0x3d, 0xcd, 0x81, 0xe4, 0x29, 0x98, - 0x60, 0x74, 0xd8, 0x49, 0x3e, 0x65, 0x16, 0x29, 0x19, 0x03, 0x8c, 0xd2, 0xeb, 0xd1, 0x9e, 0x87, - 0x41, 0xc1, 0x93, 0xaf, 0x55, 0xfd, 0xea, 0x00, 0x67, 0xe6, 0xb0, 0x9e, 0xf3, 0xd9, 0xf0, 0xc9, - 0xb5, 0x5f, 0x1d, 0xf2, 0xca, 0x63, 0x2c, 0x6a, 0xb3, 0xb3, 0xc6, 0xc3, 0x8b, 0x0d, 0x20, 0xd2, - 0xff, 0x4d, 0x2e, 0xc1, 0x18, 0xe3, 0xe2, 0x0b, 0x8c, 0x87, 0xef, 0xed, 0x57, 0x23, 0x50, 0x72, - 0x1d, 0x4e, 0x87, 0x20, 0xdc, 0x06, 0xe5, 0x6f, 0x2e, 0xfa, 0xd5, 0x44, 0x5c, 0xf1, 0x97, 0x32, - 0xe1, 0x6c, 0x91, 0x47, 0xd0, 0x11, 0xe7, 0x60, 0xc0, 0xb2, 0x97, 0x1b, 0x1d, 0xbb, 0x25, 0xc6, - 0x5e, 0xce, 0xb2, 0x97, 0x6f, 0xdb, 0x2d, 0x72, 0x06, 0x72, 0xac, 0x77, 0x0c, 0x5d, 0x0c, 0xb1, - 0x7e, 0xad, 0xdd, 0xae, 0xea, 0xa4, 0xc4, 0x3b, 0x04, 0x43, 0xbf, 0x36, 0x9a, 0xb8, 0xb5, 0xe7, - 0x5e, 0x17, 0xfd, 0x7c, 0xc5, 0x8b, 0x21, 0xb1, 0x9f, 0x30, 0x20, 0x2c, 0x3f, 0x08, 0x88, 0xb0, - 0xd0, 0x71, 0x5b, 0xa2, 0xf3, 0x3e, 0x89, 0xb2, 0x10, 0xc8, 0x80, 0x05, 0xdf, 0xc4, 0xe8, 0xa4, - 0x02, 0x24, 0xa0, 0x5a, 0xb3, 0x74, 0xe3, 0x9e, 0x41, 0xf9, 0x13, 0x99, 0x7e, 0x7e, 0xb3, 0x1d, - 0xc7, 0xaa, 0x79, 0x8f, 0xc9, 0x9c, 0x80, 0x90, 0x57, 0xb9, 0x12, 0x72, 0x3a, 0x5c, 0xfb, 0x78, - 0xdf, 0x72, 0x3b, 0x2d, 0x82, 0x42, 0xcd, 0xc4, 0xf2, 0xb8, 0x10, 0x16, 0xbf, 0x9e, 0x8b, 0xa7, - 0x0c, 0x3d, 0x12, 0xbb, 0x66, 0x06, 0x40, 0x64, 0x04, 0x0e, 0x6e, 0x0f, 0x2f, 0x48, 0xe9, 0x7f, - 0x04, 0xa6, 0x0b, 0x0f, 0xa9, 0x2c, 0xb9, 0x02, 0x83, 0xfc, 0x8b, 0xaa, 0x15, 0x61, 0xef, 0xa0, - 0x0f, 0x9c, 0xd3, 0x36, 0xee, 0xdd, 0x43, 0x87, 0x39, 0x1f, 0x4d, 0x2e, 0xc1, 0x40, 0x65, 0xbe, - 0x5e, 0x2f, 0xcd, 0x7b, 0x57, 0xe1, 0xf8, 0x58, 0x47, 0x37, 0x9d, 0x86, 0xa3, 0x99, 0x8e, 0xea, - 0x21, 0xc9, 0xe3, 0x90, 0xab, 0xd6, 0x90, 0x8c, 0x3f, 0x41, 0x1d, 0xde, 0xde, 0x2a, 0x0c, 0x18, - 0x6d, 0x4e, 0x25, 0x50, 0x58, 0xef, 0x9d, 0x6a, 0x45, 0xf2, 0x07, 0xe1, 0xf5, 0xae, 0x1b, 0x3a, - 0xde, 0xab, 0xab, 0x3e, 0x9a, 0xbc, 0x08, 0x23, 0x75, 0x6a, 0x1b, 0x5a, 0x6b, 0xbe, 0x83, 0x5b, - 0x45, 0x29, 0xa4, 0xa5, 0x83, 0xf0, 0x86, 0x89, 0x08, 0x35, 0x44, 0x46, 0x2e, 0x42, 0x76, 0xc6, - 0x30, 0xbd, 0xf7, 0x20, 0xf8, 0x60, 0x60, 0xc5, 0x30, 0x5d, 0x15, 0xa1, 0xe4, 0x71, 0xc8, 0xdc, - 0x5c, 0xac, 0x0a, 0x57, 0x37, 0xe4, 0xf5, 0xb6, 0x1b, 0x0a, 0x8f, 0x79, 0x73, 0xb1, 0x4a, 0x5e, - 0x84, 0x21, 0xb6, 0x88, 0x51, 0xb3, 0x49, 0x1d, 0x65, 0x18, 0x3f, 0x86, 0xc7, 0x64, 0xf4, 0x80, - 0xb2, 0xd3, 0x8a, 0x4f, 0x49, 0x6e, 0x41, 0x3e, 0x9a, 0x1a, 0x43, 0xbc, 0x49, 0x42, 0x8b, 0x6b, - 0x43, 0xe0, 0x92, 0xa2, 0x82, 0xc6, 0x0a, 0x12, 0x1d, 0x94, 0x28, 0x8c, 0xed, 0xeb, 0xd0, 0xea, - 0xe4, 0x01, 0xa9, 0x2f, 0x6f, 0x6f, 0x15, 0x9e, 0x88, 0x31, 0x6d, 0xd8, 0x82, 0x4a, 0xe2, 0xde, - 0x95, 0x13, 0xf9, 0x04, 0x40, 0xc9, 0x75, 0x6d, 0x63, 0xa9, 0xc3, 0xcc, 0xc3, 0xb1, 0xde, 0x4f, - 0x1a, 0x8a, 0xdb, 0x5b, 0x85, 0xd3, 0x9a, 0x4f, 0x9e, 0xf8, 0xb0, 0x41, 0x62, 0x57, 0xfc, 0x3f, - 0xd2, 0xc9, 0x39, 0x6e, 0x8f, 0x60, 0xea, 0xdb, 0xa7, 0xdb, 0x40, 0x64, 0xc0, 0x65, 0x0f, 0x30, - 0xe0, 0xee, 0xc1, 0x78, 0x49, 0x5f, 0x33, 0xcc, 0x12, 0xfe, 0x74, 0xe6, 0xa6, 0x4b, 0x38, 0x95, - 0x4a, 0x6f, 0x3f, 0x23, 0x68, 0xf1, 0x3d, 0x3c, 0x10, 0x35, 0x43, 0x35, 0x34, 0x8e, 0x6b, 0xac, - 0xdd, 0xd3, 0x1a, 0x4d, 0x9e, 0x1e, 0x56, 0x8d, 0x32, 0x2d, 0xfe, 0x70, 0x7a, 0x87, 0xb4, 0xbc, - 0x0f, 0xa2, 0xf4, 0x8b, 0x5f, 0x4a, 0xf7, 0xce, 0x8c, 0xfc, 0x40, 0x0a, 0xe5, 0x4f, 0xd3, 0x09, - 0x79, 0x8a, 0x0f, 0x24, 0x89, 0x2b, 0x30, 0xc8, 0xd9, 0xf8, 0x7e, 0xdb, 0x38, 0xbb, 0x73, 0x65, - 0xc5, 0x55, 0xc5, 0x43, 0x93, 0x79, 0x38, 0x5d, 0xba, 0x77, 0x8f, 0x36, 0xdd, 0x20, 0x24, 0xf9, - 0x7c, 0x10, 0xe1, 0x97, 0x87, 0x60, 0x16, 0xf8, 0x20, 0xa4, 0x39, 0x46, 0xb2, 0x49, 0x2c, 0x47, - 0x16, 0xe1, 0x6c, 0x14, 0x5e, 0xe7, 0x5b, 0xa2, 0xac, 0x14, 0x95, 0x39, 0xc6, 0x91, 0xff, 0xa7, - 0x76, 0x29, 0x9b, 0xd4, 0x4a, 0x5c, 0xba, 0xfa, 0x7b, 0xb5, 0x12, 0xd7, 0xb1, 0xc4, 0x72, 0xc5, - 0x6f, 0x64, 0xe4, 0x74, 0xce, 0x0f, 0xae, 0x87, 0xdd, 0x0b, 0x21, 0xbf, 0xfa, 0xdd, 0x0e, 0x99, - 0x17, 0x45, 0x78, 0x1a, 0xbd, 0x63, 0x7b, 0x2e, 0xa8, 0x7e, 0x78, 0x0c, 0x04, 0xca, 0xeb, 0xb2, - 0x4f, 0x49, 0xaa, 0x90, 0x2d, 0xd9, 0xcb, 0xdc, 0xdc, 0xdf, 0xe9, 0xc5, 0x9e, 0x66, 0x2f, 0x27, - 0x2f, 0x6c, 0xc8, 0xa2, 0xf8, 0x43, 0xe9, 0x1e, 0x19, 0x98, 0x1f, 0xc8, 0x49, 0xe4, 0xc7, 0xd3, - 0xdd, 0x72, 0x29, 0x1f, 0x57, 0x5f, 0xc1, 0x77, 0x59, 0x38, 0xc7, 0xdb, 0x91, 0xf2, 0x10, 0x85, - 0xf3, 0x7b, 0xe9, 0x6e, 0x89, 0xa1, 0x4f, 0x84, 0xb3, 0xbf, 0x09, 0x32, 0x51, 0xa4, 0x0f, 0xb0, - 0xcd, 0x2d, 0xab, 0x42, 0xff, 0x3e, 0xfd, 0xe5, 0x92, 0x44, 0x7a, 0x32, 0x84, 0x0f, 0xa4, 0xa5, - 0xdf, 0x4e, 0x77, 0x4d, 0x80, 0x7e, 0x22, 0xd3, 0xc3, 0x94, 0xe9, 0xc9, 0xd0, 0x3f, 0xd0, 0xd0, - 0x4f, 0x94, 0xe9, 0xc9, 0xd8, 0x3f, 0x90, 0x9e, 0xfe, 0x4c, 0x7a, 0x87, 0xa4, 0xa8, 0xc7, 0xfc, - 0x5c, 0xf5, 0x2c, 0xe4, 0xc4, 0xcd, 0x03, 0xe6, 0x3a, 0x54, 0xc5, 0xaf, 0x7d, 0x4a, 0xeb, 0xef, - 0xa5, 0x77, 0x4c, 0xe9, 0x7a, 0x22, 0x2f, 0x49, 0x5e, 0x5f, 0x4d, 0xef, 0x94, 0x8c, 0xf6, 0x44, - 0x5c, 0x92, 0xb8, 0x7e, 0x37, 0x8d, 0x19, 0xe1, 0x5d, 0xa3, 0x39, 0x63, 0x39, 0xae, 0x94, 0xd4, - 0xfd, 0x2f, 0x7e, 0xc5, 0x38, 0x0c, 0xff, 0x72, 0xaf, 0x7b, 0xb2, 0x07, 0xea, 0x9e, 0xfe, 0x03, - 0x6c, 0x69, 0xe2, 0x02, 0x3d, 0xb2, 0x25, 0xf8, 0xfd, 0x2a, 0xd0, 0x43, 0x58, 0x7f, 0x1f, 0x64, - 0x81, 0xfe, 0xb5, 0x0c, 0xe4, 0xcb, 0xb6, 0xb5, 0x61, 0xde, 0xa4, 0x1b, 0xb4, 0x75, 0x64, 0xc3, - 0xfd, 0x3d, 0x61, 0x20, 0xda, 0xfb, 0x34, 0x10, 0xbd, 0x72, 0xe4, 0x75, 0x18, 0x0f, 0x64, 0x29, - 0xc7, 0x78, 0xc4, 0xbb, 0xed, 0x26, 0x43, 0x35, 0xde, 0x66, 0x38, 0x11, 0x8c, 0x2c, 0x4a, 0x5d, - 0xfc, 0x4e, 0xa8, 0x37, 0x1e, 0x6c, 0x73, 0xfd, 0xc0, 0xbd, 0x71, 0x1b, 0xce, 0x96, 0x3b, 0xb6, - 0x4d, 0x4d, 0x37, 0xb9, 0x53, 0xf0, 0x26, 0xad, 0xc9, 0x29, 0x1a, 0xf1, 0xce, 0xe9, 0x52, 0x98, - 0xb1, 0x15, 0x6f, 0xcb, 0xa2, 0x6c, 0x07, 0x02, 0xb6, 0x1d, 0x4e, 0x91, 0xc4, 0x36, 0xb9, 0x70, - 0xf1, 0xb7, 0xd2, 0x72, 0xd7, 0x1f, 0xd9, 0xac, 0xf6, 0xbe, 0xe8, 0xfa, 0xe2, 0xe7, 0x33, 0x30, - 0xc6, 0x9a, 0xb5, 0xa8, 0x39, 0xab, 0x27, 0x26, 0xcc, 0x41, 0x16, 0x08, 0xf6, 0x15, 0x9e, 0x24, - 0x71, 0xdc, 0x48, 0x5f, 0xe1, 0xc1, 0xbb, 0x7d, 0x85, 0x87, 0x2f, 0xfe, 0x6c, 0x36, 0xe8, 0x8e, - 0x13, 0x03, 0xe8, 0xa8, 0xbb, 0x83, 0x2c, 0xc0, 0x69, 0x31, 0xb7, 0x79, 0x20, 0x4c, 0xf6, 0x23, - 0xe6, 0x2f, 0x9e, 0x33, 0x54, 0x4c, 0x8b, 0x1d, 0x87, 0xda, 0x0d, 0x57, 0x73, 0x56, 0x1b, 0x98, - 0x1d, 0x48, 0x4d, 0x2c, 0xc8, 0x18, 0x8a, 0x59, 0x2d, 0xcc, 0x70, 0x30, 0x60, 0xe8, 0x4d, 0x88, - 0x31, 0x86, 0x49, 0x05, 0x8b, 0xbf, 0x90, 0x82, 0x7c, 0xf4, 0x73, 0xc8, 0x55, 0x18, 0x64, 0xbf, - 0xfd, 0xa0, 0x27, 0xc2, 0x25, 0x3b, 0xe0, 0xc8, 0xfd, 0x85, 0x3c, 0x1a, 0xf2, 0x12, 0x0c, 0xa1, - 0x6b, 0x16, 0x16, 0x48, 0x07, 0xb1, 0x66, 0x82, 0x02, 0x98, 0x61, 0x9b, 0x17, 0x0b, 0x48, 0xc9, - 0xab, 0x30, 0x5c, 0x0d, 0x7c, 0x50, 0xc5, 0x05, 0x34, 0xba, 0xbe, 0x4b, 0x25, 0x03, 0x02, 0x55, - 0xa6, 0x2e, 0x7e, 0x33, 0x1d, 0xa8, 0xfa, 0x89, 0x69, 0x7a, 0x20, 0xd3, 0xf4, 0xe7, 0x32, 0x30, - 0x5a, 0xb6, 0x4c, 0x57, 0x6b, 0xba, 0x27, 0x87, 0xc1, 0x07, 0x39, 0x64, 0x23, 0x05, 0xe8, 0x9f, - 0x5a, 0xd3, 0x8c, 0x96, 0x30, 0x7c, 0x30, 0x22, 0x36, 0x65, 0x00, 0x95, 0xc3, 0xc9, 0x0d, 0x8c, - 0x03, 0xc5, 0x24, 0xed, 0x3b, 0xe2, 0x8d, 0x05, 0xc1, 0x83, 0x25, 0x94, 0x48, 0x9f, 0xcd, 0x01, - 0x7c, 0xe4, 0xc8, 0x25, 0xe5, 0x3e, 0x3b, 0x39, 0x18, 0x3d, 0x26, 0x7d, 0xf6, 0xe5, 0x0c, 0x9c, - 0x8d, 0x3a, 0x04, 0x9e, 0x0c, 0x38, 0xd1, 0x79, 0x7f, 0x09, 0x4e, 0x47, 0x65, 0x53, 0x61, 0xd2, - 0xe8, 0xef, 0xed, 0x3b, 0x72, 0x75, 0x7b, 0xab, 0xf0, 0x68, 0xdc, 0x17, 0x93, 0x55, 0x96, 0xe8, - 0x4d, 0x92, 0x58, 0x49, 0x62, 0xcf, 0xbc, 0x47, 0x5e, 0x09, 0x3f, 0xe0, 0x3d, 0xf3, 0xe3, 0xe9, - 0x78, 0xcf, 0x9c, 0x4c, 0x78, 0x62, 0xe1, 0xfe, 0xed, 0x34, 0x3c, 0x11, 0x15, 0xce, 0x9b, 0x2f, - 0x3e, 0xfb, 0xb2, 0x4a, 0xbd, 0xa0, 0xa1, 0x27, 0xd3, 0x8b, 0x50, 0x62, 0x8c, 0xfe, 0xaa, 0x39, - 0xfe, 0xcb, 0x41, 0x11, 0xfd, 0x95, 0x41, 0x54, 0x81, 0xd9, 0x85, 0x38, 0x4f, 0xe6, 0x84, 0x3d, - 0x88, 0xf3, 0xa7, 0x76, 0x14, 0xe7, 0xc9, 0x40, 0xf6, 0xdc, 0xd5, 0xb2, 0x00, 0x37, 0x0c, 0x57, - 0x84, 0x56, 0x3e, 0xe6, 0x57, 0x65, 0x92, 0x9f, 0x6b, 0x76, 0x5f, 0x7e, 0xae, 0x41, 0xc0, 0xa4, - 0xfe, 0x7d, 0x04, 0x4c, 0x7a, 0x1d, 0x06, 0x84, 0x1c, 0xc5, 0xbe, 0xfd, 0x5c, 0xf0, 0x15, 0x08, - 0xee, 0x56, 0xbd, 0x27, 0xfd, 0x27, 0x61, 0xc0, 0xe1, 0x41, 0xc4, 0xc4, 0xbe, 0x1a, 0xdf, 0xd3, - 0x08, 0x90, 0xea, 0xfd, 0x41, 0x2e, 0x02, 0xe6, 0xc3, 0x90, 0x9f, 0xbb, 0xf0, 0xfc, 0x18, 0xec, - 0x5f, 0x52, 0x85, 0x01, 0xf1, 0x6a, 0x40, 0x01, 0x7c, 0xab, 0xeb, 0xab, 0x65, 0xd0, 0xcf, 0xfc, - 0xf1, 0x00, 0x3f, 0xb3, 0x16, 0xc4, 0xf2, 0x23, 0x66, 0x01, 0x2a, 0xfe, 0x7a, 0x0a, 0xf2, 0xd1, - 0x42, 0xe4, 0x69, 0xc8, 0xf1, 0xbf, 0xc4, 0x0e, 0x1d, 0x63, 0x99, 0xf2, 0x12, 0x72, 0x2c, 0x53, - 0x41, 0xfd, 0x22, 0x0c, 0xa9, 0xde, 0x53, 0x10, 0xb1, 0x43, 0x47, 0xff, 0x5d, 0xff, 0x7d, 0x88, - 0xec, 0xbf, 0xeb, 0x53, 0x92, 0xc7, 0x21, 0xb3, 0xd0, 0xd2, 0xc5, 0xc6, 0x1c, 0xdf, 0xec, 0x58, - 0x2d, 0x39, 0x50, 0x2b, 0xc3, 0x32, 0xa2, 0x79, 0xba, 0x21, 0x9c, 0xbd, 0x91, 0xc8, 0xa4, 0x1b, - 0x32, 0xd1, 0x3c, 0xdd, 0x28, 0xfe, 0x4e, 0xca, 0x73, 0xdf, 0x9d, 0x35, 0x1c, 0xb7, 0x6a, 0xae, - 0x6b, 0x2d, 0xc3, 0xef, 0x08, 0x72, 0x03, 0xc6, 0x02, 0xa4, 0xf4, 0xe6, 0x3f, 0x16, 0x1b, 0x07, - 0x5f, 0x85, 0x3f, 0x1a, 0xf0, 0x8e, 0x14, 0x23, 0x97, 0x24, 0xe5, 0x97, 0x4e, 0x2d, 0xe4, 0x87, - 0xe4, 0xc2, 0x15, 0x7b, 0x64, 0xce, 0x70, 0x1c, 0xc3, 0x5c, 0xe6, 0xef, 0x11, 0x33, 0xf8, 0xd4, - 0x08, 0xcf, 0x4f, 0xd6, 0x38, 0xbc, 0x61, 0x33, 0x84, 0xfc, 0x66, 0x5a, 0x2e, 0x50, 0xfc, 0x0f, - 0x29, 0xb8, 0xc0, 0x38, 0x61, 0x94, 0xce, 0xd8, 0x87, 0x1d, 0x68, 0x00, 0xaf, 0xf5, 0x90, 0x94, - 0x18, 0xd5, 0x8f, 0xc5, 0x03, 0x53, 0x44, 0x08, 0x23, 0xdc, 0x7b, 0xc8, 0x7e, 0x7f, 0x81, 0xd2, - 0x7e, 0x3b, 0x85, 0xd7, 0x83, 0x4b, 0x2d, 0x7a, 0x7b, 0xbe, 0xfa, 0xe6, 0x21, 0x5d, 0x60, 0xef, - 0x77, 0xea, 0x7a, 0x03, 0xf2, 0x0e, 0xb6, 0xa5, 0xd1, 0x31, 0x8d, 0xfb, 0x78, 0xf2, 0x25, 0x3e, - 0xe6, 0xac, 0xf4, 0x31, 0x52, 0x5b, 0xd5, 0x31, 0x4e, 0x7f, 0xdb, 0x34, 0xee, 0x63, 0x90, 0xd2, - 0x8f, 0x62, 0xdc, 0x77, 0x89, 0x82, 0x5c, 0x80, 0x41, 0xc6, 0xc7, 0xf4, 0x95, 0x51, 0xf5, 0x7f, - 0x93, 0x3c, 0x64, 0x3a, 0x86, 0x8e, 0xcd, 0xec, 0x57, 0xd9, 0x9f, 0xc5, 0x3f, 0xc8, 0xc0, 0x44, - 0xe9, 0x6e, 0xbd, 0x5a, 0xf6, 0x5f, 0x31, 0x88, 0x87, 0xa6, 0x6b, 0x7b, 0x94, 0x85, 0x47, 0x4f, - 0xca, 0x30, 0xc6, 0x03, 0x05, 0x88, 0x60, 0xf6, 0xfc, 0x5c, 0xaa, 0x9f, 0xbf, 0xa6, 0x08, 0x63, - 0x24, 0x25, 0x1d, 0x45, 0x8c, 0x88, 0x79, 0xef, 0x90, 0x26, 0x9c, 0x0f, 0x91, 0x36, 0x34, 0x3f, - 0x0e, 0x9b, 0x17, 0x03, 0xe3, 0x03, 0xdb, 0x5b, 0x85, 0xc7, 0xbb, 0x12, 0x49, 0xac, 0xcf, 0xc9, - 0xac, 0x83, 0x78, 0x6e, 0x0e, 0xb9, 0x05, 0x13, 0xbc, 0x3c, 0x1e, 0xda, 0xf9, 0x4e, 0x12, 0x8c, - 0xb9, 0x14, 0xef, 0x40, 0x42, 0xca, 0xb1, 0xad, 0x10, 0xc9, 0x04, 0x2e, 0x1e, 0x09, 0xdf, 0x85, - 0x33, 0x9c, 0xbe, 0x4d, 0x6d, 0x1c, 0x89, 0x96, 0xd9, 0x70, 0xa8, 0x2b, 0xde, 0x1a, 0x4f, 0x3e, - 0xbe, 0xbd, 0x55, 0x28, 0x24, 0x12, 0x48, 0x4c, 0x4f, 0x21, 0x41, 0xcd, 0xc7, 0xd7, 0xa9, 0x2b, - 0xfb, 0x69, 0xe4, 0xf6, 0xa0, 0xe6, 0x3f, 0x91, 0x86, 0x73, 0x33, 0x54, 0x6b, 0xb9, 0x2b, 0xe5, - 0x15, 0xda, 0x5c, 0x3d, 0x71, 0x95, 0x0e, 0x59, 0x2d, 0x89, 0xd2, 0x39, 0x31, 0x91, 0x7b, 0x49, - 0xe7, 0xc4, 0xe2, 0x15, 0xd2, 0xf9, 0x6a, 0x1a, 0x2e, 0x27, 0x6d, 0x0e, 0xf0, 0x76, 0xc0, 0x5e, - 0x58, 0xa7, 0xb6, 0x6d, 0xe8, 0xf4, 0x08, 0x17, 0x95, 0xc3, 0xb3, 0x87, 0xe5, 0x0e, 0xcb, 0xee, - 0xd3, 0x23, 0x76, 0x77, 0xe2, 0x3a, 0xc2, 0x24, 0x36, 0xef, 0x2d, 0x71, 0xfd, 0x58, 0x1a, 0x4e, - 0xd7, 0x8d, 0x65, 0xc7, 0xb5, 0x6c, 0x5a, 0xc3, 0x88, 0x1d, 0x27, 0x9a, 0xd4, 0x55, 0x34, 0x47, - 0x98, 0x2b, 0xea, 0xbd, 0x2e, 0x9a, 0x93, 0x01, 0x25, 0x44, 0xf3, 0xbd, 0x19, 0x18, 0x9f, 0x2b, - 0xd7, 0xc4, 0x0e, 0x1d, 0xd3, 0xf3, 0x1d, 0xcf, 0x37, 0xb4, 0xc1, 0xd9, 0x42, 0x76, 0x1f, 0x67, - 0x0b, 0x87, 0xe7, 0x5e, 0x20, 0xb2, 0x87, 0xe6, 0xf6, 0x92, 0x3d, 0xb4, 0xf8, 0x99, 0x0c, 0x8c, - 0x06, 0xbd, 0x30, 0x75, 0x44, 0x27, 0x45, 0x0f, 0x76, 0x1f, 0x7c, 0x3b, 0x05, 0x13, 0x73, 0xe5, - 0xda, 0xcd, 0xfa, 0xc2, 0xbc, 0x5a, 0x2b, 0xcf, 0x51, 0xc7, 0xd1, 0x96, 0x29, 0x79, 0x12, 0x06, - 0x04, 0x44, 0x1c, 0x5d, 0xe0, 0x99, 0xd1, 0xdb, 0x8e, 0x65, 0xda, 0xed, 0xa6, 0xea, 0xe1, 0x44, - 0xde, 0x9b, 0x74, 0x8f, 0xbc, 0x37, 0x45, 0x10, 0xa9, 0x51, 0xc5, 0xa9, 0x4b, 0x28, 0x59, 0x2a, - 0xff, 0x9f, 0x2c, 0x40, 0xae, 0xad, 0xd9, 0xda, 0x9a, 0xb3, 0xd3, 0x15, 0xcc, 0x23, 0xdb, 0x5b, - 0x85, 0x3c, 0x27, 0x4d, 0xbc, 0x72, 0x11, 0x6c, 0xd8, 0xe8, 0x9e, 0x08, 0xf4, 0x4a, 0x4a, 0xaa, - 0xbb, 0xef, 0xed, 0xeb, 0x4b, 0x90, 0xed, 0xec, 0x51, 0xb7, 0x3a, 0x42, 0xb7, 0x9c, 0x7d, 0xe9, - 0x96, 0x28, 0xe5, 0xf5, 0x69, 0x76, 0x4f, 0x59, 0x79, 0x83, 0x80, 0x9d, 0xfd, 0xbb, 0x0f, 0xd8, - 0x49, 0xe6, 0x61, 0x60, 0x8d, 0x77, 0xbf, 0x50, 0x21, 0x3f, 0x1c, 0x5f, 0x4c, 0x3f, 0x26, 0xcf, - 0x8b, 0xfc, 0x99, 0x13, 0xa2, 0x84, 0x7c, 0xce, 0x27, 0x40, 0xc5, 0xdf, 0x4f, 0xc3, 0xd9, 0xa0, - 0x17, 0xe6, 0x2d, 0xd7, 0xb8, 0x67, 0xf0, 0x73, 0xf2, 0x07, 0xa8, 0x2b, 0x24, 0xa1, 0xf6, 0x1f, - 0x82, 0x50, 0x9f, 0x9a, 0xe3, 0x6e, 0x5c, 0xb7, 0x0c, 0x53, 0x27, 0xe7, 0xe1, 0xcc, 0xed, 0xfa, - 0x94, 0xda, 0xb8, 0x55, 0x9d, 0xaf, 0x34, 0x6e, 0xcf, 0xd7, 0x6b, 0x53, 0xe5, 0xea, 0x74, 0x75, - 0xaa, 0x92, 0xef, 0x23, 0xa7, 0x60, 0x3c, 0x40, 0xcd, 0xdc, 0x9e, 0x2b, 0xcd, 0xe7, 0x53, 0x64, - 0x02, 0x46, 0x03, 0xe0, 0xe4, 0xc2, 0x62, 0x3e, 0xfd, 0xd4, 0x8f, 0xa7, 0x00, 0x18, 0xbf, 0x05, - 0xdb, 0x58, 0x36, 0x4c, 0xf2, 0x10, 0x9c, 0x43, 0x8a, 0x05, 0xb5, 0x7a, 0xa3, 0x3a, 0x1f, 0xe1, - 0x79, 0x06, 0x26, 0x64, 0xe4, 0xec, 0x42, 0xb9, 0x34, 0x9b, 0x4f, 0xf9, 0x55, 0x09, 0x70, 0xbd, - 0xbe, 0x90, 0x4f, 0x93, 0xd3, 0x90, 0x97, 0x81, 0x0b, 0xb7, 0x16, 0x4b, 0xf9, 0x4c, 0x14, 0x5a, - 0x2f, 0x57, 0xe7, 0xf2, 0x59, 0x72, 0x0e, 0x4e, 0xc9, 0xd0, 0xa9, 0xf9, 0x45, 0xb5, 0x54, 0xad, - 0xe4, 0xfb, 0x9f, 0xfa, 0x00, 0x0c, 0x63, 0xd0, 0x3b, 0x71, 0xe8, 0x3b, 0x02, 0x83, 0x0b, 0x93, - 0xf5, 0x29, 0xf5, 0x0e, 0xb6, 0x06, 0x20, 0x57, 0x99, 0x9a, 0x67, 0x2d, 0x4b, 0x3d, 0xf5, 0xe7, - 0x29, 0x80, 0xfa, 0xf4, 0x62, 0x4d, 0x10, 0x0e, 0xc3, 0x40, 0x75, 0xfe, 0x4e, 0x69, 0xb6, 0xca, - 0xe8, 0x06, 0x21, 0xbb, 0x50, 0x9b, 0x62, 0x9f, 0x3f, 0x04, 0xfd, 0xe5, 0xd9, 0x85, 0xfa, 0x54, - 0x3e, 0xcd, 0x80, 0xea, 0x54, 0xa9, 0x92, 0xcf, 0x30, 0xe0, 0x5d, 0xb5, 0xba, 0x38, 0x95, 0xcf, - 0xb2, 0x3f, 0x67, 0xeb, 0x8b, 0xa5, 0xc5, 0x7c, 0x3f, 0xfb, 0x73, 0x1a, 0xff, 0xcc, 0x31, 0x66, - 0xf5, 0xa9, 0x45, 0xfc, 0x31, 0xc0, 0x9a, 0x30, 0xed, 0xfd, 0x1a, 0x64, 0x28, 0xc6, 0xba, 0x52, - 0x55, 0xf3, 0x43, 0xec, 0x07, 0x63, 0xc9, 0x7e, 0x00, 0x6b, 0x9c, 0x3a, 0x35, 0xb7, 0x70, 0x67, - 0x2a, 0x3f, 0xcc, 0x78, 0xcd, 0xdd, 0x62, 0xe0, 0x11, 0xf6, 0xa7, 0x3a, 0xc7, 0xfe, 0x1c, 0x65, - 0x9c, 0xd4, 0xa9, 0xd2, 0x6c, 0xad, 0xb4, 0x38, 0x93, 0x1f, 0x63, 0xed, 0x41, 0x9e, 0xe3, 0xbc, - 0xe4, 0x7c, 0x69, 0x6e, 0x2a, 0x9f, 0x17, 0x34, 0x95, 0xd9, 0xea, 0xfc, 0xad, 0xfc, 0x04, 0x36, - 0xe4, 0xad, 0x39, 0xfc, 0x41, 0x58, 0x01, 0xfc, 0xeb, 0xd4, 0x53, 0xdf, 0x05, 0xb9, 0x85, 0x3a, - 0xba, 0x9f, 0x9d, 0x83, 0x53, 0x0b, 0xf5, 0xc6, 0xe2, 0x5b, 0xb5, 0xa9, 0x48, 0xc7, 0x4d, 0xc0, - 0xa8, 0x87, 0x98, 0xad, 0xce, 0xdf, 0x7e, 0x93, 0xab, 0x82, 0x07, 0x9a, 0x2b, 0x95, 0x17, 0xea, - 0xf9, 0x34, 0xeb, 0x47, 0x0f, 0x74, 0xb7, 0x3a, 0x5f, 0x59, 0xb8, 0x5b, 0xcf, 0x67, 0x9e, 0x5a, - 0x87, 0x91, 0x0a, 0x5d, 0x37, 0x9a, 0x54, 0x28, 0xc8, 0xc3, 0x70, 0xbe, 0x32, 0x75, 0xa7, 0x5a, - 0x9e, 0xea, 0xaa, 0x22, 0x61, 0x74, 0xa9, 0x56, 0xcd, 0xa7, 0xc8, 0x59, 0x20, 0x61, 0xf0, 0xcd, - 0xd2, 0xdc, 0x74, 0x3e, 0x4d, 0x14, 0x38, 0x1d, 0x86, 0x57, 0xe7, 0x17, 0x6f, 0xcf, 0x4f, 0xe5, - 0x33, 0x4f, 0xfd, 0xed, 0x14, 0x9c, 0x99, 0x6a, 0x69, 0x8e, 0x6b, 0x34, 0x9d, 0x50, 0x82, 0x7f, - 0x52, 0x84, 0x47, 0xa6, 0x66, 0x4b, 0xf5, 0xc5, 0x6a, 0xb9, 0x3e, 0x55, 0x52, 0xcb, 0x33, 0x8d, - 0x72, 0x69, 0x71, 0xea, 0xc6, 0x82, 0xfa, 0x56, 0xe3, 0xc6, 0xd4, 0xfc, 0x94, 0x5a, 0x9a, 0xcd, - 0xf7, 0x91, 0xc7, 0xa1, 0xd0, 0x85, 0xa6, 0x3e, 0x55, 0xbe, 0xad, 0x56, 0x17, 0xdf, 0xca, 0xa7, - 0xc8, 0x63, 0xf0, 0x70, 0x57, 0x22, 0xf6, 0x3b, 0x9f, 0x26, 0x8f, 0xc0, 0x85, 0x6e, 0x24, 0x1f, - 0x9b, 0xcd, 0x67, 0x9e, 0xfa, 0xb1, 0x14, 0x90, 0x85, 0x36, 0x35, 0xeb, 0xe1, 0x26, 0x3e, 0x0a, - 0x17, 0x99, 0x5e, 0x34, 0xba, 0x37, 0xf0, 0x31, 0x78, 0x38, 0x91, 0x42, 0x6a, 0x5e, 0x01, 0x1e, - 0xea, 0x42, 0x22, 0x1a, 0x77, 0x11, 0x94, 0x64, 0x02, 0x6c, 0xda, 0xcf, 0xa7, 0xe0, 0x4c, 0x62, - 0x1c, 0x28, 0x72, 0x19, 0x9e, 0x28, 0x55, 0xe6, 0x58, 0xdf, 0x94, 0x17, 0xab, 0x0b, 0xf3, 0xf5, - 0xc6, 0xdc, 0x74, 0xa9, 0xc1, 0xb4, 0xef, 0x76, 0x3d, 0xd2, 0x9b, 0x97, 0xa0, 0xd8, 0x83, 0xb2, - 0x3c, 0x53, 0x9a, 0xbf, 0xc1, 0x86, 0x1f, 0x79, 0x02, 0x1e, 0xed, 0x4a, 0x37, 0x35, 0x5f, 0x9a, - 0x9c, 0x9d, 0xaa, 0xe4, 0xd3, 0xe4, 0x49, 0x78, 0xac, 0x2b, 0x55, 0xa5, 0x5a, 0xe7, 0x64, 0x99, - 0xa7, 0xb4, 0x90, 0x77, 0x12, 0xfb, 0xca, 0xf2, 0xc2, 0xfc, 0x62, 0xa9, 0xbc, 0x98, 0xa4, 0xd9, - 0xe7, 0xe1, 0x4c, 0x08, 0x3b, 0x79, 0xbb, 0x5e, 0x9d, 0x9f, 0xaa, 0xd7, 0xf3, 0xa9, 0x18, 0xca, - 0x17, 0x6d, 0x7a, 0xb2, 0xf2, 0xcd, 0xff, 0xe9, 0x91, 0xbe, 0x6f, 0xfe, 0xc9, 0x23, 0xa9, 0xdf, - 0xfb, 0x93, 0x47, 0x52, 0xff, 0xe6, 0x4f, 0x1e, 0x49, 0x7d, 0xfc, 0xfa, 0xb2, 0xe1, 0xae, 0x74, - 0x96, 0xae, 0x36, 0xad, 0xb5, 0x6b, 0xcb, 0xb6, 0xb6, 0x6e, 0xb8, 0xb8, 0x4e, 0x69, 0xad, 0x6b, - 0x2e, 0x6d, 0x61, 0x00, 0xe2, 0x6b, 0x5a, 0xdb, 0xb8, 0x86, 0xf9, 0xda, 0xae, 0xf1, 0xf9, 0x7b, - 0x29, 0x87, 0xd6, 0xc9, 0xf3, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xb6, 0x17, 0x48, - 0xd2, 0xbb, 0x01, 0x00, + // 19518 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x78, 0x24, 0x49, + 0x72, 0x18, 0x86, 0x7e, 0xa0, 0x01, 0x04, 0x5e, 0x8d, 0x9c, 0x57, 0xcd, 0xec, 0xec, 0xf6, 0x6e, + 0xef, 0xee, 0xec, 0xcc, 0xde, 0xee, 0xcc, 0xee, 0xec, 0xe3, 0x6e, 0x1f, 0x77, 0xbb, 0x8d, 0x06, + 0x30, 0xe8, 0x19, 0x3c, 0xfa, 0xaa, 0x31, 0x33, 0xbb, 0x77, 0xe4, 0x35, 0x0b, 0x5d, 0x39, 0x40, + 0x2d, 0xba, 0xab, 0xfa, 0xaa, 0xaa, 0x81, 0xc1, 0xca, 0x0f, 0x9e, 0x48, 0xf1, 0x21, 0x1d, 0xc9, + 0xf3, 0xd1, 0xe4, 0x51, 0xa4, 0x64, 0x1f, 0x25, 0xcb, 0xa6, 0xc8, 0x13, 0xcf, 0xa4, 0xcf, 0x7c, + 0x9f, 0x44, 0x8a, 0xa2, 0x74, 0xe4, 0x91, 0x34, 0x8f, 0x12, 0x69, 0x5a, 0xa4, 0x40, 0x99, 0xb6, + 0xfe, 0xe0, 0xb3, 0xfd, 0xf1, 0xb3, 0xf9, 0x59, 0x27, 0xd9, 0xf2, 0xe7, 0x2f, 0x23, 0xb3, 0xaa, + 0xb2, 0x1e, 0xdd, 0x78, 0x2e, 0xb1, 0xd8, 0xc1, 0x9f, 0x19, 0x74, 0x44, 0x64, 0x64, 0x56, 0x64, + 0x64, 0x66, 0x64, 0x66, 0x64, 0x04, 0x5c, 0x71, 0x69, 0x93, 0xb6, 0x2d, 0xdb, 0xbd, 0xd6, 0xa4, + 0x2b, 0x5a, 0x63, 0xf3, 0x9a, 0xbb, 0xd9, 0xa6, 0xce, 0x35, 0xba, 0x4e, 0x4d, 0xd7, 0xfb, 0xef, + 0x6a, 0xdb, 0xb6, 0x5c, 0x8b, 0xe4, 0xf8, 0xaf, 0x0b, 0xa7, 0x57, 0xac, 0x15, 0x0b, 0x41, 0xd7, + 0xd8, 0x5f, 0x1c, 0x7b, 0xe1, 0xe2, 0x8a, 0x65, 0xad, 0x34, 0xe9, 0x35, 0xfc, 0xb5, 0xdc, 0xb9, + 0x77, 0xcd, 0x71, 0xed, 0x4e, 0xc3, 0x15, 0xd8, 0x42, 0x14, 0xeb, 0x1a, 0x2d, 0xea, 0xb8, 0x5a, + 0xab, 0x2d, 0x08, 0x1e, 0x89, 0x12, 0x6c, 0xd8, 0x5a, 0xbb, 0x4d, 0x6d, 0x51, 0xf9, 0x85, 0xa7, + 0xfc, 0x76, 0x6a, 0x8d, 0x06, 0x75, 0x9c, 0xa6, 0xe1, 0xb8, 0xd7, 0xd6, 0x9f, 0x97, 0x7e, 0x09, + 0xc2, 0xc7, 0x92, 0x3f, 0x08, 0xff, 0x15, 0x24, 0xcf, 0x26, 0x93, 0x78, 0x35, 0x46, 0xaa, 0x2e, + 0x7e, 0x3e, 0x0d, 0x83, 0xf3, 0xd4, 0xd5, 0x74, 0xcd, 0xd5, 0xc8, 0x45, 0xe8, 0xaf, 0x98, 0x3a, + 0xbd, 0xaf, 0xa4, 0x1e, 0x4d, 0x5d, 0xce, 0x4c, 0xe6, 0xb6, 0xb7, 0x0a, 0x69, 0x6a, 0xa8, 0x1c, + 0x48, 0x1e, 0x86, 0xec, 0xd2, 0x66, 0x9b, 0x2a, 0xe9, 0x47, 0x53, 0x97, 0x87, 0x26, 0x87, 0xb6, + 0xb7, 0x0a, 0xfd, 0x28, 0x34, 0x15, 0xc1, 0xe4, 0x31, 0x48, 0x57, 0xa6, 0x94, 0x0c, 0x22, 0x27, + 0xb6, 0xb7, 0x0a, 0xa3, 0x1d, 0x43, 0x7f, 0xc6, 0x6a, 0x19, 0x2e, 0x6d, 0xb5, 0xdd, 0x4d, 0x35, + 0x5d, 0x99, 0x22, 0x97, 0x20, 0x5b, 0xb6, 0x74, 0xaa, 0x64, 0x91, 0x88, 0x6c, 0x6f, 0x15, 0xc6, + 0x1a, 0x96, 0x4e, 0x25, 0x2a, 0xc4, 0x93, 0x37, 0x21, 0xbb, 0x64, 0xb4, 0xa8, 0xd2, 0xff, 0x68, + 0xea, 0xf2, 0xf0, 0xf5, 0x0b, 0x57, 0xb9, 0xf8, 0xae, 0x7a, 0xe2, 0xbb, 0xba, 0xe4, 0xc9, 0x77, + 0x32, 0xff, 0xb5, 0xad, 0x42, 0xdf, 0xf6, 0x56, 0x21, 0xcb, 0x44, 0xfe, 0xb9, 0x3f, 0x2d, 0xa4, + 0x54, 0x2c, 0x49, 0x5e, 0x87, 0xe1, 0x72, 0xb3, 0xe3, 0xb8, 0xd4, 0x5e, 0xd0, 0x5a, 0x54, 0xc9, + 0x61, 0x85, 0x17, 0xb6, 0xb7, 0x0a, 0x67, 0x1b, 0x1c, 0x5c, 0x37, 0xb5, 0x96, 0x5c, 0xb1, 0x4c, + 0x5e, 0xfc, 0x85, 0x14, 0x8c, 0xd7, 0xa8, 0xe3, 0x18, 0x96, 0xe9, 0xcb, 0xe6, 0x49, 0x18, 0x12, + 0xa0, 0xca, 0x14, 0xca, 0x67, 0x68, 0x72, 0x60, 0x7b, 0xab, 0x90, 0x71, 0x0c, 0x5d, 0x0d, 0x30, + 0xe4, 0x39, 0x18, 0xb8, 0x6b, 0xb8, 0xab, 0xf3, 0x33, 0x25, 0x21, 0xa7, 0xb3, 0xdb, 0x5b, 0x05, + 0xb2, 0x61, 0xb8, 0xab, 0xf5, 0xd6, 0x3d, 0x4d, 0xaa, 0xd0, 0x23, 0x23, 0x73, 0x90, 0xaf, 0xda, + 0xc6, 0xba, 0xe6, 0xd2, 0x5b, 0x74, 0xb3, 0x6a, 0x35, 0x8d, 0xc6, 0xa6, 0x90, 0xe2, 0xa3, 0xdb, + 0x5b, 0x85, 0x8b, 0x6d, 0x8e, 0xab, 0xaf, 0xd1, 0xcd, 0x7a, 0x1b, 0xb1, 0x12, 0x93, 0x58, 0xc9, + 0xe2, 0xf7, 0x0e, 0xc0, 0xc8, 0x6d, 0x87, 0xda, 0x7e, 0xbb, 0x2f, 0x41, 0x96, 0xfd, 0x16, 0x4d, + 0x46, 0x99, 0x77, 0x1c, 0x6a, 0xcb, 0x32, 0x67, 0x78, 0x72, 0x05, 0xfa, 0xe7, 0xac, 0x15, 0xc3, + 0x14, 0xcd, 0x3e, 0xb5, 0xbd, 0x55, 0x18, 0x6f, 0x32, 0x80, 0x44, 0xc9, 0x29, 0xc8, 0xc7, 0x60, + 0xa4, 0xd2, 0x62, 0x3a, 0x64, 0x99, 0x9a, 0x6b, 0xd9, 0xa2, 0xb5, 0x28, 0x5d, 0x43, 0x82, 0x4b, + 0x05, 0x43, 0xf4, 0xe4, 0x55, 0x80, 0xd2, 0xdd, 0x9a, 0x6a, 0x35, 0x69, 0x49, 0x5d, 0x10, 0xca, + 0x80, 0xa5, 0xb5, 0x0d, 0xa7, 0x6e, 0x5b, 0x4d, 0x5a, 0xd7, 0x6c, 0xb9, 0x5a, 0x89, 0x9a, 0x4c, + 0xc3, 0x58, 0x09, 0x47, 0x85, 0x4a, 0x3f, 0xdd, 0xa1, 0x8e, 0xeb, 0x28, 0xfd, 0x8f, 0x66, 0x2e, + 0x0f, 0x4d, 0x3e, 0xbc, 0xbd, 0x55, 0x38, 0xcf, 0xc7, 0x4b, 0xdd, 0x16, 0x28, 0x89, 0x45, 0xa4, + 0x10, 0x99, 0x84, 0xd1, 0xd2, 0xbb, 0x1d, 0x9b, 0x56, 0x74, 0x6a, 0xba, 0x86, 0xbb, 0x29, 0x34, + 0xe4, 0xe2, 0xf6, 0x56, 0x41, 0xd1, 0x18, 0xa2, 0x6e, 0x08, 0x8c, 0xc4, 0x24, 0x5c, 0x84, 0x2c, + 0xc2, 0xc4, 0x8d, 0x72, 0xb5, 0x46, 0xed, 0x75, 0xa3, 0x41, 0x4b, 0x8d, 0x86, 0xd5, 0x31, 0x5d, + 0x65, 0x00, 0xf9, 0x3c, 0xb6, 0xbd, 0x55, 0x78, 0x78, 0xa5, 0xd1, 0xae, 0x3b, 0x1c, 0x5b, 0xd7, + 0x38, 0x5a, 0x62, 0x16, 0x2f, 0x4b, 0x3e, 0x01, 0xa3, 0x4b, 0x36, 0xd3, 0x42, 0x7d, 0x8a, 0x32, + 0xb8, 0x32, 0x88, 0xfa, 0x7f, 0xf6, 0xaa, 0x98, 0xa9, 0x38, 0xd4, 0xeb, 0x59, 0xde, 0x58, 0x97, + 0x17, 0xa8, 0xeb, 0x88, 0x93, 0x1b, 0x1b, 0x62, 0x45, 0x28, 0x28, 0xec, 0xe3, 0x0d, 0x9b, 0xea, + 0x31, 0x6d, 0x1b, 0xc2, 0x36, 0x5f, 0xd9, 0xde, 0x2a, 0x3c, 0x69, 0x0b, 0x9a, 0x7a, 0x4f, 0xb5, + 0xeb, 0xca, 0x8a, 0x4c, 0xc3, 0x20, 0xd3, 0xa6, 0x5b, 0x86, 0xa9, 0x2b, 0xf0, 0x68, 0xea, 0xf2, + 0xd8, 0xf5, 0xbc, 0xd7, 0x7a, 0x0f, 0x3e, 0x79, 0x6e, 0x7b, 0xab, 0x70, 0x8a, 0xe9, 0x60, 0x7d, + 0xcd, 0x30, 0xe5, 0x29, 0xc2, 0x2f, 0xca, 0x46, 0xd1, 0xa4, 0xe5, 0xe2, 0xd0, 0x1d, 0x0e, 0x46, + 0xd1, 0xb2, 0xe5, 0x46, 0x87, 0xad, 0x47, 0x46, 0xca, 0x30, 0x3a, 0x69, 0xb9, 0x15, 0xd3, 0x71, + 0x35, 0xb3, 0x41, 0x2b, 0x53, 0xca, 0x08, 0x96, 0x43, 0xb5, 0x60, 0xe5, 0x0c, 0x81, 0xa9, 0x87, + 0x26, 0xa5, 0x70, 0x19, 0x32, 0x0f, 0xc0, 0x9a, 0xb0, 0x68, 0x1b, 0x6c, 0x20, 0x8c, 0x62, 0xfb, + 0x89, 0xdc, 0x7e, 0x8e, 0x99, 0x3c, 0xbf, 0xbd, 0x55, 0x38, 0x83, 0x5f, 0x60, 0x21, 0x40, 0xd6, + 0xd5, 0x80, 0xac, 0xf8, 0x6f, 0xb3, 0x30, 0xc6, 0xba, 0x58, 0x1a, 0x8d, 0x25, 0x36, 0xb1, 0x30, + 0x08, 0x6b, 0xb4, 0xd3, 0xd6, 0x1a, 0x54, 0x0c, 0x4c, 0x14, 0x8a, 0xe9, 0x01, 0x25, 0x86, 0x51, + 0x7a, 0x72, 0x05, 0x06, 0x39, 0xa8, 0x32, 0x25, 0xc6, 0xea, 0xe8, 0xf6, 0x56, 0x61, 0xc8, 0x41, + 0x58, 0xdd, 0xd0, 0x55, 0x1f, 0xcd, 0x06, 0x0b, 0xff, 0x7b, 0xd6, 0x72, 0x5c, 0xc6, 0x5c, 0x0c, + 0x55, 0x94, 0x8a, 0x28, 0xb0, 0x2a, 0x50, 0xf2, 0x60, 0x09, 0x17, 0x22, 0xaf, 0x00, 0x70, 0x48, + 0x49, 0xd7, 0x6d, 0x31, 0x5e, 0x51, 0x04, 0x82, 0x85, 0xa6, 0xeb, 0xf2, 0x60, 0x97, 0x88, 0x49, + 0x0b, 0x46, 0xf8, 0xaf, 0x39, 0x6d, 0x99, 0x36, 0xf9, 0x60, 0x1d, 0xbe, 0x7e, 0xd9, 0x93, 0x69, + 0x58, 0x3a, 0x57, 0x65, 0xd2, 0x69, 0xd3, 0xb5, 0x37, 0x27, 0x0b, 0x62, 0x7e, 0x3f, 0x27, 0xaa, + 0x6a, 0x22, 0x4e, 0x9e, 0x59, 0xe4, 0x32, 0x6c, 0xda, 0x9f, 0xb1, 0xec, 0x0d, 0xcd, 0xd6, 0xa9, + 0x3e, 0xb9, 0x29, 0x4f, 0xfb, 0xf7, 0x3c, 0x70, 0x7d, 0x59, 0xd6, 0x64, 0x99, 0x9c, 0xe9, 0x10, + 0xe7, 0x56, 0xeb, 0x2c, 0xa3, 0x06, 0x0f, 0xc4, 0xa4, 0xe5, 0x74, 0x96, 0xa3, 0x5a, 0x1b, 0x2e, + 0xc3, 0x66, 0x16, 0x0e, 0xb8, 0x43, 0x6d, 0xb6, 0x26, 0xe0, 0x20, 0x16, 0x33, 0x8b, 0x60, 0xb2, + 0xce, 0x31, 0x71, 0x1e, 0xa2, 0xc8, 0x85, 0x37, 0x60, 0x22, 0x26, 0x0a, 0x92, 0x87, 0xcc, 0x1a, + 0xdd, 0xe4, 0xea, 0xa2, 0xb2, 0x3f, 0xc9, 0x69, 0xe8, 0x5f, 0xd7, 0x9a, 0x1d, 0xb1, 0x22, 0xab, + 0xfc, 0xc7, 0xab, 0xe9, 0x8f, 0xa4, 0xd8, 0x02, 0x46, 0xca, 0x96, 0x69, 0xd2, 0x86, 0x2b, 0xaf, + 0x61, 0x2f, 0xc3, 0xd0, 0x9c, 0xd5, 0xd0, 0x9a, 0xd8, 0x8f, 0x5c, 0xef, 0x94, 0xed, 0xad, 0xc2, + 0x69, 0xd6, 0x81, 0x57, 0x9b, 0x0c, 0x23, 0xb5, 0x29, 0x20, 0x65, 0x0a, 0xa0, 0xd2, 0x96, 0xe5, + 0x52, 0x2c, 0x98, 0x0e, 0x14, 0x00, 0x0b, 0xda, 0x88, 0x92, 0x15, 0x20, 0x20, 0x26, 0xd7, 0x60, + 0xb0, 0xca, 0x96, 0xed, 0x86, 0xd5, 0x14, 0xca, 0x87, 0x2b, 0x0b, 0x2e, 0xe5, 0xf2, 0xd0, 0xf7, + 0x88, 0x8a, 0xb3, 0x30, 0x56, 0x6e, 0x1a, 0xd4, 0x74, 0xe5, 0x56, 0xb3, 0x41, 0x55, 0x5a, 0xa1, + 0xa6, 0x2b, 0xb7, 0x1a, 0x07, 0xa0, 0xc6, 0xa0, 0x72, 0xab, 0x7d, 0xd2, 0xe2, 0xef, 0x66, 0xe0, + 0xfc, 0xad, 0xce, 0x32, 0xb5, 0x4d, 0xea, 0x52, 0x47, 0xac, 0xef, 0x3e, 0xd7, 0x05, 0x98, 0x88, + 0x21, 0x05, 0x77, 0x5c, 0x77, 0xd7, 0x7c, 0x64, 0x5d, 0x98, 0x0c, 0xf2, 0xe4, 0x1d, 0x2b, 0x4a, + 0x66, 0x61, 0x3c, 0x00, 0xb2, 0x46, 0x38, 0x4a, 0x1a, 0x57, 0xa6, 0x47, 0xb6, 0xb7, 0x0a, 0x17, + 0x24, 0x6e, 0xac, 0xd9, 0xb2, 0x06, 0x47, 0x8b, 0x91, 0x5b, 0x90, 0x0f, 0x40, 0x37, 0x6c, 0xab, + 0xd3, 0x76, 0x94, 0x0c, 0xb2, 0x2a, 0x6c, 0x6f, 0x15, 0x1e, 0x92, 0x58, 0xad, 0x20, 0x52, 0xb6, + 0x07, 0xa2, 0x05, 0xc9, 0x77, 0xa6, 0x64, 0x6e, 0x62, 0x14, 0x66, 0x71, 0x14, 0x7e, 0xd8, 0x1b, + 0x85, 0x5d, 0x85, 0x74, 0x35, 0x5a, 0x52, 0x0c, 0xca, 0x48, 0x33, 0x62, 0x83, 0x32, 0x56, 0xe3, + 0x85, 0x32, 0x9c, 0x49, 0xe4, 0xb5, 0x27, 0xad, 0xfe, 0x37, 0x19, 0x99, 0x4b, 0xd5, 0xd2, 0xfd, + 0xce, 0x5c, 0x94, 0x3b, 0xb3, 0x6a, 0xe9, 0xb8, 0x72, 0xa4, 0x82, 0xa5, 0x58, 0x6a, 0x6c, 0xdb, + 0xd2, 0xa3, 0x8b, 0x48, 0xbc, 0x2c, 0xf9, 0x14, 0x9c, 0x8d, 0x01, 0xf9, 0x74, 0xcd, 0xb5, 0xff, + 0xd2, 0xf6, 0x56, 0xa1, 0x98, 0xc0, 0x35, 0x3a, 0x7b, 0x77, 0xe1, 0x42, 0x34, 0x38, 0x27, 0x49, + 0xdd, 0x32, 0x5d, 0xcd, 0x30, 0x85, 0xad, 0xca, 0x47, 0xc9, 0x53, 0xdb, 0x5b, 0x85, 0xc7, 0x65, + 0x1d, 0xf4, 0x68, 0xa2, 0x8d, 0xef, 0xc6, 0x87, 0xe8, 0xa0, 0x24, 0xa0, 0x2a, 0x2d, 0x6d, 0xc5, + 0x33, 0xc0, 0x2f, 0x6f, 0x6f, 0x15, 0x9e, 0x48, 0xac, 0xc3, 0x60, 0x54, 0xf2, 0x82, 0xdf, 0x8d, + 0x13, 0x51, 0x81, 0x04, 0xb8, 0x05, 0x4b, 0xa7, 0xf8, 0x0d, 0xfd, 0xc8, 0xbf, 0xb8, 0xbd, 0x55, + 0x78, 0x44, 0xe2, 0x6f, 0x5a, 0x3a, 0x8d, 0x36, 0x3f, 0xa1, 0x74, 0xf1, 0x17, 0x32, 0xf0, 0x48, + 0xad, 0x34, 0x3f, 0x57, 0xd1, 0x3d, 0x0b, 0xa9, 0x6a, 0x5b, 0xeb, 0x86, 0x2e, 0x8d, 0xde, 0x65, + 0x38, 0x17, 0x41, 0x4d, 0xa3, 0x51, 0xe6, 0xdb, 0xe6, 0xf8, 0x6d, 0x9e, 0xf5, 0xd5, 0x16, 0x34, + 0x75, 0x6e, 0xb9, 0x85, 0x6d, 0x80, 0x6e, 0x8c, 0x58, 0x1f, 0x45, 0x50, 0xb5, 0x55, 0xcb, 0x76, + 0x1b, 0x1d, 0x57, 0x28, 0x01, 0xf6, 0x51, 0xac, 0x0e, 0x47, 0x10, 0xf5, 0xa8, 0xc2, 0xe3, 0x43, + 0xbe, 0x37, 0x05, 0xf9, 0x92, 0xeb, 0xda, 0xc6, 0x72, 0xc7, 0xa5, 0xf3, 0x5a, 0xbb, 0x6d, 0x98, + 0x2b, 0x38, 0xd6, 0x87, 0xaf, 0xbf, 0xee, 0xaf, 0x91, 0x3d, 0x25, 0x71, 0x35, 0x5a, 0x5c, 0x1a, + 0xa2, 0x9a, 0x87, 0xaa, 0xb7, 0x38, 0x4e, 0x1e, 0xa2, 0xd1, 0x72, 0x6c, 0x88, 0x26, 0xf2, 0xda, + 0xd3, 0x10, 0xfd, 0x7c, 0x06, 0x2e, 0x2e, 0xae, 0xb9, 0x9a, 0x4a, 0x1d, 0xab, 0x63, 0x37, 0xa8, + 0x73, 0xbb, 0xad, 0x6b, 0x2e, 0x0d, 0x46, 0x6a, 0x01, 0xfa, 0x4b, 0xba, 0x4e, 0x75, 0x64, 0xd7, + 0xcf, 0x77, 0x91, 0x1a, 0x03, 0xa8, 0x1c, 0x4e, 0x9e, 0x84, 0x01, 0x51, 0x06, 0xb9, 0xf7, 0x4f, + 0x0e, 0x6f, 0x6f, 0x15, 0x06, 0x3a, 0x1c, 0xa4, 0x7a, 0x38, 0x46, 0x36, 0x45, 0x9b, 0x94, 0x91, + 0x65, 0x02, 0x32, 0x9d, 0x83, 0x54, 0x0f, 0x47, 0x3e, 0x0e, 0x63, 0xc8, 0xd6, 0x6f, 0x8f, 0x98, + 0xfb, 0x4e, 0x7b, 0xd2, 0x95, 0x1b, 0xcb, 0x97, 0x26, 0x6c, 0x4d, 0xdd, 0xf6, 0x0a, 0xa8, 0x11, + 0x06, 0xe4, 0x2e, 0xe4, 0x45, 0x23, 0x02, 0xa6, 0xfd, 0x3d, 0x98, 0x9e, 0xd9, 0xde, 0x2a, 0x4c, + 0x88, 0xf6, 0x4b, 0x6c, 0x63, 0x4c, 0x18, 0x63, 0xd1, 0xec, 0x80, 0x71, 0x6e, 0x27, 0xc6, 0xe2, + 0x8b, 0x65, 0xc6, 0x51, 0x26, 0xc5, 0xb7, 0x61, 0x44, 0x2e, 0x48, 0xce, 0xe2, 0x4e, 0x9d, 0x8f, + 0x13, 0xdc, 0xe3, 0x1b, 0x3a, 0x6e, 0xcf, 0x9f, 0x87, 0xe1, 0x29, 0xea, 0x34, 0x6c, 0xa3, 0xcd, + 0xac, 0x06, 0xa1, 0xe4, 0xe3, 0xdb, 0x5b, 0x85, 0x61, 0x3d, 0x00, 0xab, 0x32, 0x4d, 0xf1, 0xff, + 0x4e, 0xc1, 0x59, 0xc6, 0xbb, 0xe4, 0x38, 0xc6, 0x8a, 0xd9, 0x92, 0x97, 0xed, 0x67, 0x20, 0x57, + 0xc3, 0xfa, 0x44, 0x4d, 0xa7, 0xb7, 0xb7, 0x0a, 0x79, 0xde, 0x02, 0x49, 0x0f, 0x05, 0x8d, 0xbf, + 0x4d, 0x4d, 0xef, 0xb0, 0x4d, 0x65, 0x26, 0xad, 0xab, 0xd9, 0xae, 0x61, 0xae, 0xd4, 0x5c, 0xcd, + 0xed, 0x38, 0x21, 0x93, 0x56, 0x60, 0xea, 0x0e, 0xa2, 0x42, 0x26, 0x6d, 0xa8, 0x10, 0x79, 0x03, + 0x46, 0xa6, 0x4d, 0x3d, 0x60, 0xc2, 0x27, 0xc4, 0x87, 0x98, 0xa5, 0x49, 0x11, 0x1e, 0x67, 0x11, + 0x2a, 0x50, 0xfc, 0x66, 0x0a, 0x14, 0xbe, 0xa7, 0x9c, 0x33, 0x1c, 0x77, 0x9e, 0xb6, 0x96, 0xa5, + 0xd9, 0x69, 0xc6, 0xdb, 0xa4, 0x32, 0x9c, 0xb4, 0x16, 0xa1, 0x29, 0x20, 0x36, 0xa9, 0x4d, 0xc3, + 0x89, 0xed, 0x66, 0x22, 0xa5, 0x48, 0x05, 0x06, 0x38, 0x67, 0x6e, 0x4b, 0x0c, 0x5f, 0x57, 0x3c, + 0x45, 0x88, 0x56, 0xcd, 0x95, 0xa1, 0xc5, 0x89, 0xe5, 0xfd, 0x91, 0x28, 0x4f, 0x2a, 0x30, 0x1e, + 0x94, 0x59, 0x32, 0xdc, 0xa6, 0xb7, 0x08, 0xf0, 0x99, 0x42, 0x6a, 0x93, 0xcb, 0x90, 0xb2, 0x7d, + 0x12, 0x29, 0x57, 0xfc, 0x62, 0x06, 0xf2, 0xd1, 0xfa, 0xc9, 0x5d, 0x18, 0xbc, 0x69, 0x19, 0x26, + 0xd5, 0x17, 0x4d, 0xfc, 0xd8, 0xde, 0xc7, 0x36, 0x9e, 0x59, 0x7f, 0xea, 0x1d, 0x2c, 0x53, 0x97, + 0x8d, 0x61, 0x3c, 0xc5, 0xf1, 0x99, 0x91, 0x4f, 0xc0, 0x10, 0x33, 0x27, 0xd7, 0x91, 0x73, 0x7a, + 0x47, 0xce, 0x8f, 0x0a, 0xce, 0xa7, 0x6d, 0x5e, 0x28, 0xce, 0x3a, 0x60, 0xc7, 0x54, 0x54, 0xa5, + 0x9a, 0x63, 0x99, 0x42, 0x89, 0x50, 0x45, 0x6d, 0x84, 0xc8, 0x2a, 0xca, 0x69, 0x98, 0x15, 0xcc, + 0x3f, 0x16, 0x7b, 0x54, 0xda, 0x06, 0x71, 0xb1, 0x47, 0x3b, 0x53, 0x22, 0x26, 0x26, 0x8c, 0x8b, + 0xbe, 0x59, 0x35, 0xda, 0xb8, 0x81, 0xc0, 0x25, 0x72, 0xec, 0xfa, 0xa5, 0xab, 0xde, 0x71, 0xdd, + 0x55, 0xe9, 0xb0, 0x6f, 0xfd, 0xf9, 0xab, 0xf3, 0x3e, 0x39, 0xee, 0x99, 0x51, 0xbd, 0x23, 0x2c, + 0x64, 0xc5, 0x69, 0x85, 0xc8, 0x8b, 0xdf, 0x95, 0x86, 0x67, 0x83, 0x2e, 0x52, 0xe9, 0xba, 0x41, + 0x37, 0x02, 0x8e, 0x62, 0xf7, 0xce, 0x46, 0xab, 0x53, 0x5e, 0xd5, 0xcc, 0x15, 0xaa, 0x93, 0x2b, + 0xd0, 0xaf, 0x5a, 0x4d, 0xea, 0x28, 0x29, 0xb4, 0x34, 0x71, 0x26, 0xb4, 0x19, 0x40, 0x3e, 0xfe, + 0x41, 0x0a, 0x62, 0x41, 0x6e, 0xc9, 0xd6, 0x0c, 0xd7, 0x53, 0xca, 0x52, 0x5c, 0x29, 0x77, 0x51, + 0xe3, 0x55, 0xce, 0x83, 0x2f, 0x57, 0x28, 0x78, 0x17, 0x01, 0xb2, 0xe0, 0x39, 0xc9, 0x85, 0x57, + 0x60, 0x58, 0x22, 0xde, 0xd3, 0x7a, 0xf4, 0x9d, 0xfd, 0xf2, 0x30, 0xf5, 0x9a, 0x25, 0x86, 0xe9, + 0x35, 0x36, 0xbc, 0x1c, 0x87, 0x19, 0x44, 0x7c, 0x7c, 0x8a, 0x41, 0x84, 0xa0, 0xf0, 0x20, 0x42, + 0x10, 0x79, 0x01, 0x06, 0x39, 0x0b, 0x7f, 0xeb, 0x8d, 0xdb, 0x76, 0x1b, 0x61, 0x61, 0xab, 0xc2, + 0x27, 0x24, 0x3f, 0x99, 0x82, 0x87, 0x7b, 0x4a, 0x02, 0x95, 0x6f, 0xf8, 0xfa, 0x4b, 0xfb, 0x12, + 0xe3, 0xe4, 0xb3, 0xdb, 0x5b, 0x85, 0x2b, 0x92, 0x66, 0xd8, 0x12, 0x4d, 0xbd, 0xc1, 0x89, 0xa4, + 0x76, 0xf5, 0x6e, 0x0a, 0xb3, 0x7b, 0x79, 0xa5, 0x33, 0x78, 0x88, 0x66, 0x36, 0x36, 0xbd, 0x46, + 0x66, 0x03, 0xbb, 0x57, 0x7c, 0xef, 0x3d, 0x8f, 0x24, 0xa1, 0x9a, 0x2e, 0x5c, 0x48, 0x03, 0xce, + 0x71, 0xcc, 0x94, 0xb6, 0xb9, 0x78, 0x6f, 0xde, 0x32, 0xdd, 0x55, 0xaf, 0x82, 0x7e, 0xf9, 0x14, + 0x0a, 0x2b, 0xd0, 0xb5, 0xcd, 0xba, 0x75, 0xaf, 0xde, 0x62, 0x54, 0x09, 0x75, 0x74, 0xe3, 0xc4, + 0xd6, 0x08, 0x31, 0xc6, 0xbd, 0xd9, 0x33, 0x17, 0x9c, 0x11, 0x7a, 0xf3, 0x42, 0x7c, 0xae, 0x8c, + 0x14, 0x4a, 0x9a, 0x32, 0x07, 0xf6, 0x39, 0x65, 0x56, 0x60, 0x64, 0xce, 0x6a, 0xac, 0xf9, 0x9a, + 0xf7, 0x0a, 0xe4, 0x96, 0x34, 0x7b, 0x85, 0xba, 0x28, 0xd6, 0xe1, 0xeb, 0x13, 0x57, 0xf9, 0x11, + 0x3e, 0x23, 0xe2, 0x88, 0xc9, 0x31, 0x31, 0x91, 0xe5, 0x5c, 0xfc, 0xad, 0x8a, 0x02, 0xc5, 0x7f, + 0x98, 0x83, 0x11, 0x71, 0xdc, 0x8c, 0x6b, 0x1a, 0x79, 0x35, 0x38, 0xc0, 0x17, 0x33, 0xaf, 0x7f, + 0xe4, 0xe6, 0x1f, 0x15, 0x8e, 0x30, 0x66, 0xbf, 0xb7, 0x55, 0x48, 0x6d, 0x6f, 0x15, 0xfa, 0xd4, + 0x41, 0x69, 0x6b, 0x1d, 0xac, 0xba, 0x92, 0x99, 0x21, 0x1f, 0x20, 0x47, 0xca, 0xf2, 0x55, 0xf8, + 0x0d, 0x18, 0x10, 0x6d, 0x10, 0xca, 0x7b, 0x2e, 0x38, 0xd1, 0x09, 0x1d, 0x9b, 0x47, 0x4a, 0x7b, + 0xa5, 0xc8, 0xeb, 0x90, 0xe3, 0x27, 0x1c, 0x42, 0x00, 0x67, 0x93, 0x4f, 0x84, 0x22, 0xc5, 0x45, + 0x19, 0x32, 0x0b, 0x10, 0x9c, 0x6e, 0xf8, 0xb7, 0x04, 0x82, 0x43, 0xfc, 0xdc, 0x23, 0xc2, 0x45, + 0x2a, 0x4b, 0x5e, 0x86, 0x91, 0x25, 0x6a, 0xb7, 0x0c, 0x53, 0x6b, 0xd6, 0x8c, 0x77, 0xbd, 0x8b, + 0x02, 0x34, 0x3f, 0x1c, 0xe3, 0x5d, 0xb9, 0x4f, 0x43, 0x74, 0xe4, 0x5b, 0x93, 0x4e, 0x0f, 0x06, + 0xb0, 0x21, 0x8f, 0xed, 0xb8, 0xad, 0x8e, 0xb4, 0x27, 0xe1, 0x30, 0xe1, 0xe3, 0x30, 0x1a, 0xda, + 0x38, 0x8a, 0x93, 0xe0, 0x87, 0xe3, 0xac, 0xa5, 0x5d, 0x70, 0x84, 0x6d, 0x98, 0x03, 0x1b, 0x14, + 0x15, 0xd3, 0x70, 0x0d, 0xad, 0x59, 0xb6, 0x5a, 0x2d, 0xcd, 0xd4, 0x95, 0xa1, 0x60, 0x50, 0x18, + 0x1c, 0x53, 0x6f, 0x70, 0x94, 0x3c, 0x28, 0xc2, 0x85, 0xc8, 0x2d, 0xc8, 0x8b, 0x3e, 0x54, 0x69, + 0xc3, 0xb2, 0x99, 0x45, 0x84, 0x07, 0xbd, 0x62, 0x54, 0x38, 0x1c, 0x57, 0xb7, 0x3d, 0xa4, 0xbc, + 0xe5, 0x88, 0x16, 0x64, 0x13, 0x70, 0xc5, 0x5c, 0x37, 0x98, 0x11, 0x3f, 0x82, 0x8d, 0xc1, 0x09, + 0xd8, 0xe0, 0x20, 0x79, 0x02, 0x16, 0x54, 0xd2, 0x82, 0x3d, 0xba, 0xf3, 0x82, 0x7d, 0x33, 0x3b, + 0x38, 0x9c, 0x1f, 0x89, 0x1e, 0xfd, 0x17, 0xff, 0x7e, 0x06, 0x86, 0x45, 0x4b, 0x98, 0x91, 0x71, + 0x32, 0x7e, 0x0e, 0x32, 0x7e, 0x12, 0xc7, 0x41, 0xee, 0xb0, 0xc6, 0x41, 0xf1, 0xb3, 0x69, 0x7f, + 0xb2, 0xab, 0xda, 0x86, 0x79, 0xb0, 0xc9, 0xee, 0x12, 0x40, 0x79, 0xb5, 0x63, 0xae, 0xf1, 0x2b, + 0xce, 0x74, 0x70, 0xc5, 0xd9, 0x30, 0x54, 0x09, 0x43, 0x1e, 0x86, 0xec, 0x14, 0xe3, 0xcf, 0x7a, + 0x66, 0x64, 0x72, 0xe8, 0x6b, 0x9c, 0x53, 0xea, 0x59, 0x15, 0xc1, 0x6c, 0x07, 0x3b, 0xb9, 0xe9, + 0x52, 0xbe, 0x67, 0xc8, 0xf0, 0x1d, 0xec, 0x32, 0x03, 0xa8, 0x1c, 0x4e, 0x5e, 0x84, 0x89, 0x29, + 0xda, 0xd4, 0x36, 0xe7, 0x8d, 0x66, 0xd3, 0x70, 0x68, 0xc3, 0x32, 0x75, 0x07, 0x85, 0x2c, 0xaa, + 0x6b, 0x39, 0x6a, 0x9c, 0x80, 0x14, 0x21, 0xb7, 0x78, 0xef, 0x9e, 0x43, 0x5d, 0x14, 0x5f, 0x66, + 0x12, 0xd8, 0xdc, 0x6f, 0x21, 0x44, 0x15, 0x98, 0xe2, 0x97, 0x53, 0x6c, 0x8b, 0xe8, 0xac, 0xb9, + 0x56, 0x3b, 0x18, 0x44, 0x07, 0x11, 0xc9, 0x95, 0xc0, 0x02, 0x4a, 0xe3, 0xd7, 0x8e, 0x8b, 0xaf, + 0x1d, 0x10, 0x56, 0x50, 0x60, 0xfb, 0x24, 0x7e, 0x55, 0x66, 0x87, 0xaf, 0x2a, 0xfe, 0x79, 0x1a, + 0xce, 0x89, 0x16, 0x97, 0x9b, 0x46, 0x7b, 0xd9, 0xd2, 0x6c, 0x5d, 0xa5, 0x0d, 0x6a, 0xac, 0xd3, + 0xe3, 0x39, 0xf0, 0xc2, 0x43, 0x27, 0x7b, 0x80, 0xa1, 0x73, 0x1d, 0x77, 0xdb, 0x4c, 0x32, 0x78, + 0xaa, 0xce, 0xcd, 0x9f, 0xfc, 0xf6, 0x56, 0x61, 0x44, 0xe7, 0x60, 0xbc, 0x57, 0x51, 0x65, 0x22, + 0xa6, 0x24, 0x73, 0xd4, 0x5c, 0x71, 0x57, 0x51, 0x49, 0xfa, 0xb9, 0x92, 0x34, 0x11, 0xa2, 0x0a, + 0x4c, 0xf1, 0x7f, 0x4f, 0xc3, 0xe9, 0xa8, 0xc8, 0x6b, 0xd4, 0xd4, 0x4f, 0xe4, 0xfd, 0xde, 0xc8, + 0xfb, 0x2f, 0x32, 0xf0, 0x90, 0x28, 0x53, 0x5b, 0xd5, 0x6c, 0xaa, 0x4f, 0x19, 0x36, 0x6d, 0xb8, + 0x96, 0xbd, 0x79, 0x8c, 0xed, 0xb3, 0xc3, 0x13, 0xfb, 0x8b, 0x90, 0x13, 0x67, 0x2c, 0x7c, 0x9d, + 0x19, 0xf3, 0x5b, 0x82, 0xd0, 0xd8, 0x0a, 0xc5, 0xcf, 0x67, 0x22, 0x9d, 0x95, 0xdb, 0x4d, 0x67, + 0x7d, 0x04, 0x46, 0x7d, 0xd1, 0xe3, 0x16, 0x7d, 0x20, 0x30, 0xe6, 0x74, 0x0f, 0x81, 0xbb, 0x74, + 0x35, 0x4c, 0x88, 0xb5, 0x79, 0x80, 0xca, 0x14, 0x1a, 0x5b, 0xa3, 0xa2, 0x36, 0xbf, 0x9c, 0xa1, + 0xab, 0x32, 0x51, 0x71, 0x2b, 0x0b, 0x17, 0x92, 0xbb, 0x5d, 0xa5, 0x9a, 0x7e, 0xd2, 0xeb, 0x1f, + 0xc8, 0x5e, 0x27, 0x8f, 0x41, 0xb6, 0xaa, 0xb9, 0xab, 0xc2, 0x65, 0x02, 0x2f, 0xde, 0xef, 0x19, + 0x4d, 0x5a, 0x6f, 0x6b, 0xee, 0xaa, 0x8a, 0x28, 0x69, 0xce, 0x00, 0xe4, 0x98, 0x30, 0x67, 0x48, + 0x8b, 0xfd, 0xf0, 0xa3, 0xa9, 0xcb, 0xd9, 0xc4, 0xc5, 0xfe, 0x4f, 0xb3, 0xdd, 0xe6, 0x95, 0xbb, + 0xb6, 0xe1, 0xd2, 0x13, 0x0d, 0x3b, 0xd1, 0xb0, 0x03, 0x6a, 0xd8, 0xef, 0xa7, 0x61, 0xd4, 0xdf, + 0x93, 0xbd, 0x43, 0x1b, 0x47, 0xb3, 0x56, 0x05, 0x5b, 0x99, 0xcc, 0x81, 0xb7, 0x32, 0x07, 0x51, + 0xa8, 0xa2, 0xbf, 0xb7, 0xe4, 0xa6, 0x01, 0x4a, 0x8c, 0xef, 0x2d, 0xfd, 0x23, 0xe0, 0xc7, 0x60, + 0x60, 0x5e, 0xbb, 0x6f, 0xb4, 0x3a, 0x2d, 0x61, 0xa5, 0xa3, 0x0b, 0x60, 0x4b, 0xbb, 0xaf, 0x7a, + 0xf0, 0xe2, 0xbf, 0x48, 0xc1, 0x98, 0x10, 0xaa, 0x60, 0x7e, 0x20, 0xa9, 0x06, 0xd2, 0x49, 0x1f, + 0x58, 0x3a, 0x99, 0xfd, 0x4b, 0xa7, 0xf8, 0xb7, 0x32, 0xa0, 0xcc, 0x18, 0x4d, 0xba, 0x64, 0x6b, + 0xa6, 0x73, 0x8f, 0xda, 0x62, 0x3b, 0x3d, 0xcd, 0x58, 0x1d, 0xe8, 0x03, 0xa5, 0x29, 0x25, 0xbd, + 0xaf, 0x29, 0xe5, 0x43, 0x30, 0x24, 0x1a, 0xe3, 0xbb, 0x9f, 0xe2, 0xa8, 0xb1, 0x3d, 0xa0, 0x1a, + 0xe0, 0x19, 0x71, 0xa9, 0xdd, 0xb6, 0xad, 0x75, 0x6a, 0xf3, 0xab, 0x40, 0x41, 0xac, 0x79, 0x40, + 0x35, 0xc0, 0x4b, 0x9c, 0xa9, 0x67, 0x2f, 0xca, 0x9c, 0xa9, 0xad, 0x06, 0x78, 0x72, 0x19, 0x06, + 0xe7, 0xac, 0x86, 0x86, 0x82, 0xe6, 0xd3, 0xca, 0xc8, 0xf6, 0x56, 0x61, 0xb0, 0x29, 0x60, 0xaa, + 0x8f, 0x65, 0x94, 0x53, 0xd6, 0x86, 0xd9, 0xb4, 0x34, 0xee, 0x61, 0x34, 0xc8, 0x29, 0x75, 0x01, + 0x53, 0x7d, 0x2c, 0xa3, 0x64, 0x32, 0x47, 0xcf, 0xad, 0xc1, 0x80, 0xe7, 0x3d, 0x01, 0x53, 0x7d, + 0x6c, 0xf1, 0xcb, 0x59, 0xa6, 0xbd, 0x8e, 0xf1, 0xee, 0x03, 0xbf, 0x2e, 0x04, 0x03, 0xa6, 0x7f, + 0x1f, 0x03, 0xe6, 0x81, 0x39, 0x0f, 0x2c, 0xfe, 0xdb, 0x01, 0x00, 0x21, 0xfd, 0xe9, 0x93, 0xcd, + 0xe1, 0xc1, 0xb4, 0x66, 0x0a, 0x26, 0xa6, 0xcd, 0x55, 0xcd, 0x6c, 0x50, 0x3d, 0x38, 0x15, 0xcd, + 0xe1, 0xd0, 0x46, 0xc7, 0x55, 0x2a, 0x90, 0xc1, 0xb1, 0xa8, 0x1a, 0x2f, 0x40, 0x9e, 0x87, 0xe1, + 0x8a, 0xe9, 0x52, 0x5b, 0x6b, 0xb8, 0xc6, 0x3a, 0x15, 0x53, 0x03, 0x5e, 0xbf, 0x1b, 0x01, 0x58, + 0x95, 0x69, 0xc8, 0x8b, 0x30, 0x52, 0xd5, 0x6c, 0xd7, 0x68, 0x18, 0x6d, 0xcd, 0x74, 0x1d, 0x65, + 0x10, 0x67, 0x34, 0xb4, 0x30, 0xda, 0x12, 0x5c, 0x0d, 0x51, 0x91, 0x6f, 0x85, 0x21, 0xdc, 0x9a, + 0xa2, 0x8f, 0xfd, 0xd0, 0x8e, 0x57, 0xaa, 0x8f, 0x07, 0x3e, 0x98, 0xfc, 0x70, 0x17, 0xaf, 0xd9, + 0xa3, 0xb7, 0xaa, 0x3e, 0x47, 0xf2, 0x16, 0x0c, 0x4c, 0x9b, 0x3a, 0x32, 0x87, 0x1d, 0x99, 0x17, + 0x05, 0xf3, 0xb3, 0x01, 0x73, 0xab, 0x1d, 0xe1, 0xed, 0xb1, 0x4b, 0x1e, 0x65, 0xc3, 0xef, 0xdd, + 0x28, 0x1b, 0x79, 0x0f, 0x4e, 0xdd, 0x47, 0x0f, 0xeb, 0xd4, 0x7d, 0x6c, 0x9f, 0xa7, 0xee, 0xc5, + 0x77, 0x61, 0x78, 0xb2, 0x3a, 0xe3, 0x8f, 0xde, 0xf3, 0x90, 0xa9, 0x0a, 0x77, 0x90, 0x2c, 0xb7, + 0x67, 0xda, 0x86, 0xae, 0x32, 0x18, 0xb9, 0x02, 0x83, 0x65, 0xf4, 0x31, 0x14, 0xf7, 0x9d, 0x59, + 0xbe, 0xfe, 0x35, 0x10, 0x86, 0xae, 0xc6, 0x1e, 0x9a, 0x3c, 0x09, 0x03, 0x55, 0xdb, 0x5a, 0xb1, + 0xb5, 0x96, 0x58, 0x83, 0xd1, 0x1f, 0xa7, 0xcd, 0x41, 0xaa, 0x87, 0x2b, 0xfe, 0x60, 0xca, 0x33, + 0xdb, 0x59, 0x89, 0x5a, 0x07, 0x8f, 0xe6, 0xb1, 0xee, 0x41, 0x5e, 0xc2, 0xe1, 0x20, 0xd5, 0xc3, + 0x91, 0x2b, 0xd0, 0x3f, 0x6d, 0xdb, 0x96, 0x2d, 0xbf, 0x4b, 0xa0, 0x0c, 0x20, 0x5f, 0x4c, 0x23, + 0x05, 0xf9, 0x30, 0x0c, 0xf3, 0x39, 0x87, 0x9f, 0x68, 0x66, 0x7a, 0xdd, 0xe9, 0xca, 0x94, 0xc5, + 0x5f, 0xcf, 0x48, 0x36, 0x1b, 0x97, 0xf8, 0x03, 0x78, 0x2b, 0xf0, 0x02, 0x64, 0x26, 0xab, 0x33, + 0x62, 0x02, 0x3c, 0xe5, 0x15, 0x95, 0x54, 0x25, 0x52, 0x8e, 0x51, 0x93, 0x8b, 0x90, 0xad, 0x32, + 0xf5, 0xc9, 0xa1, 0x7a, 0x0c, 0x6e, 0x6f, 0x15, 0xb2, 0x6d, 0xa6, 0x3f, 0x08, 0x45, 0x2c, 0xdb, + 0xcc, 0xf0, 0x1d, 0x13, 0xc7, 0x06, 0xfb, 0x98, 0x8b, 0x90, 0x2d, 0xd9, 0x2b, 0xeb, 0x62, 0xd6, + 0x42, 0xac, 0x66, 0xaf, 0xac, 0xab, 0x08, 0x25, 0xd7, 0x00, 0x54, 0xea, 0x76, 0x6c, 0x13, 0x9f, + 0x0c, 0x0d, 0xe1, 0xf9, 0x1b, 0xce, 0x86, 0x36, 0x42, 0xeb, 0x0d, 0x4b, 0xa7, 0xaa, 0x44, 0x52, + 0xfc, 0x7b, 0xc1, 0xc5, 0xce, 0x94, 0xe1, 0xac, 0x9d, 0x74, 0xe1, 0x1e, 0xba, 0x50, 0x13, 0x47, + 0x9c, 0xf1, 0x4e, 0x2a, 0x40, 0xff, 0x4c, 0x53, 0x5b, 0x71, 0xb0, 0x0f, 0x85, 0xc3, 0xde, 0x3d, + 0x06, 0x50, 0x39, 0x3c, 0xd2, 0x4f, 0x83, 0x3b, 0xf7, 0xd3, 0x17, 0xfa, 0xfd, 0xd1, 0xb6, 0x40, + 0xdd, 0x0d, 0xcb, 0x3e, 0xe9, 0xaa, 0xdd, 0x76, 0xd5, 0x25, 0x18, 0xa8, 0xd9, 0x0d, 0xe9, 0xe8, + 0x02, 0xf7, 0x03, 0x8e, 0xdd, 0xe0, 0xc7, 0x16, 0x1e, 0x92, 0xd1, 0x4d, 0x39, 0x2e, 0xd2, 0x0d, + 0x04, 0x74, 0xba, 0xe3, 0x0a, 0x3a, 0x81, 0x14, 0x74, 0x55, 0xcb, 0x76, 0x45, 0xc7, 0xf9, 0x74, + 0x6d, 0xcb, 0x76, 0x55, 0x0f, 0x49, 0x3e, 0x04, 0xb0, 0x54, 0xae, 0x7a, 0x2f, 0x1a, 0x86, 0x02, + 0x87, 0x4b, 0xf1, 0x94, 0x41, 0x95, 0xd0, 0x64, 0x09, 0x86, 0x16, 0xdb, 0xd4, 0xe6, 0x5b, 0x21, + 0xfe, 0x08, 0xe8, 0xa9, 0x88, 0x68, 0x45, 0xbf, 0x5f, 0x15, 0xff, 0xfb, 0xe4, 0x7c, 0x7d, 0xb1, + 0xbc, 0x9f, 0x6a, 0xc0, 0x88, 0x7c, 0x18, 0x72, 0x25, 0x6e, 0xe7, 0x0d, 0x23, 0x4b, 0x5f, 0x64, + 0xb8, 0x05, 0xe5, 0x28, 0xbe, 0x67, 0xd7, 0xf0, 0x6f, 0x55, 0x90, 0x17, 0xaf, 0x40, 0x3e, 0x5a, + 0x0d, 0x19, 0x86, 0x81, 0xf2, 0xe2, 0xc2, 0xc2, 0x74, 0x79, 0x29, 0xdf, 0x47, 0x06, 0x21, 0x5b, + 0x9b, 0x5e, 0x98, 0xca, 0xa7, 0x8a, 0x5f, 0x92, 0x66, 0x10, 0xa6, 0x5a, 0x27, 0x57, 0xc3, 0x07, + 0xba, 0x6f, 0xc9, 0xe3, 0x7d, 0x28, 0x9e, 0x18, 0xb4, 0x0c, 0xd7, 0xa5, 0xba, 0x58, 0x25, 0xf0, + 0xbe, 0xd0, 0xbd, 0xaf, 0xc6, 0xf0, 0xe4, 0x19, 0x18, 0x45, 0x98, 0xb8, 0x22, 0xe4, 0xfb, 0x63, + 0x51, 0xc0, 0xbe, 0xaf, 0x86, 0x91, 0xc5, 0xaf, 0x07, 0xb7, 0xc3, 0x73, 0x54, 0x3b, 0xae, 0x37, + 0x8a, 0xef, 0x93, 0xfe, 0x2a, 0xfe, 0x52, 0x3f, 0x7f, 0x67, 0xc3, 0xdf, 0x78, 0x1e, 0x85, 0x28, + 0x83, 0x23, 0xdd, 0xcc, 0x1e, 0x8e, 0x74, 0x9f, 0x81, 0xdc, 0x3c, 0x75, 0x57, 0x2d, 0xcf, 0x45, + 0x0d, 0x7d, 0x42, 0x5a, 0x08, 0x91, 0x7d, 0x42, 0x38, 0x0d, 0x59, 0x03, 0xe2, 0x3d, 0xe0, 0xf4, + 0xbd, 0xdd, 0xbd, 0x23, 0xe4, 0x73, 0xb1, 0x7d, 0x4a, 0x0d, 0x9f, 0x79, 0xe3, 0x43, 0x86, 0xd3, + 0xbe, 0x37, 0xbd, 0xe4, 0x33, 0xf6, 0xef, 0xb7, 0x0a, 0x39, 0x4e, 0xa3, 0x26, 0xb0, 0x25, 0x1f, + 0x87, 0xa1, 0xf9, 0x99, 0x92, 0x78, 0xcc, 0xc9, 0xbd, 0x22, 0xce, 0xfb, 0x52, 0xf4, 0x10, 0xbe, + 0x48, 0xf0, 0x51, 0x53, 0xeb, 0x9e, 0x16, 0x7f, 0xcb, 0x19, 0x70, 0x61, 0xda, 0xc2, 0x9f, 0x47, + 0x89, 0xd3, 0x05, 0x5f, 0x5b, 0xc2, 0x8f, 0xa6, 0xa2, 0xb2, 0xe2, 0xd8, 0x88, 0xb6, 0x0c, 0x1e, + 0x60, 0x74, 0x2f, 0xc2, 0x44, 0xa9, 0xdd, 0x6e, 0x1a, 0x54, 0x47, 0x7d, 0x51, 0x3b, 0x4d, 0xea, + 0x08, 0x8f, 0x22, 0x7c, 0x71, 0xa3, 0x71, 0x64, 0x1d, 0x9f, 0x10, 0xd7, 0xed, 0x4e, 0xd8, 0x93, + 0x34, 0x5e, 0x16, 0x5f, 0x6c, 0x73, 0xf6, 0x96, 0x5d, 0x99, 0x12, 0x3e, 0x45, 0xfc, 0xc5, 0xb6, + 0x07, 0x0e, 0x7b, 0x58, 0xca, 0xe4, 0xc5, 0x1f, 0x4e, 0xc3, 0xd9, 0xb2, 0x4d, 0x35, 0x97, 0xce, + 0xcf, 0x94, 0x4a, 0x1d, 0xf4, 0x05, 0x6c, 0x36, 0xa9, 0xb9, 0x72, 0x34, 0x93, 0xc2, 0x6b, 0x30, + 0xe6, 0x37, 0xa0, 0xd6, 0xb0, 0xda, 0x54, 0x7e, 0xfb, 0xd6, 0xf0, 0x30, 0x75, 0x87, 0xa1, 0xd4, + 0x08, 0x29, 0xb9, 0x05, 0xa7, 0x7c, 0x48, 0xa9, 0xd9, 0xb4, 0x36, 0x54, 0xda, 0x71, 0xb8, 0xc3, + 0xf1, 0x20, 0x77, 0x38, 0x0e, 0x38, 0x68, 0x0c, 0x5f, 0xb7, 0x19, 0x81, 0x9a, 0x54, 0xaa, 0xf8, + 0xc5, 0x0c, 0x9c, 0xbb, 0xa3, 0x35, 0x0d, 0x3d, 0x10, 0x8d, 0x4a, 0x9d, 0xb6, 0x65, 0x3a, 0xf4, + 0x18, 0x8d, 0xf1, 0xd0, 0x40, 0xca, 0x1e, 0xca, 0x40, 0x8a, 0x77, 0x51, 0xff, 0x81, 0xbb, 0x28, + 0xb7, 0xaf, 0x2e, 0xfa, 0xdf, 0x52, 0x90, 0xf7, 0xde, 0x66, 0xc8, 0xcf, 0xf6, 0xa5, 0x87, 0x03, + 0x78, 0x00, 0x19, 0xf1, 0x2f, 0x47, 0x3c, 0xa9, 0xc1, 0xc0, 0xf4, 0xfd, 0xb6, 0x61, 0x53, 0x67, + 0x17, 0xce, 0xf1, 0x0f, 0x8b, 0xc3, 0x96, 0x09, 0xca, 0x8b, 0xc4, 0xce, 0x59, 0x38, 0x18, 0x5f, + 0x5c, 0xf2, 0xd7, 0x29, 0x93, 0x5e, 0x2c, 0x02, 0xfe, 0xe2, 0x52, 0xbc, 0x62, 0x09, 0x3d, 0xa1, + 0x0d, 0x48, 0xc9, 0xe3, 0x90, 0x59, 0x5a, 0x9a, 0x13, 0xf3, 0x30, 0xc6, 0x80, 0x70, 0x5d, 0xf9, + 0x49, 0x29, 0xc3, 0x16, 0xff, 0x24, 0xcd, 0x5f, 0x59, 0xf3, 0xe1, 0x7a, 0x24, 0x4a, 0x38, 0x09, + 0x83, 0x9e, 0xc0, 0x85, 0x1a, 0xfa, 0x0f, 0x2b, 0xa2, 0x1d, 0x11, 0xad, 0xdb, 0x7f, 0x44, 0x53, + 0xf0, 0x1c, 0xe6, 0xf9, 0x2d, 0x02, 0xee, 0x8b, 0xd0, 0x61, 0xde, 0x73, 0x93, 0xff, 0x10, 0x0c, + 0xf9, 0x33, 0x94, 0x7c, 0x7b, 0xe0, 0x4f, 0x67, 0x6a, 0x80, 0x8f, 0x4c, 0xcc, 0xb9, 0x03, 0x2c, + 0xe3, 0x9e, 0x78, 0x79, 0xaf, 0x9c, 0x88, 0xf7, 0x90, 0xc5, 0xfb, 0xfd, 0x42, 0xbc, 0xfc, 0x91, + 0xd5, 0xb1, 0x15, 0xef, 0xa1, 0x9d, 0x9c, 0x17, 0x7f, 0x3f, 0x05, 0x84, 0x35, 0xab, 0xaa, 0x39, + 0xce, 0x86, 0x65, 0xeb, 0xdc, 0x09, 0xff, 0x48, 0x04, 0x73, 0x78, 0xb7, 0x9d, 0xdf, 0x3d, 0x04, + 0xa7, 0x42, 0x6e, 0xc3, 0xc7, 0x7c, 0xb2, 0xba, 0x12, 0x1e, 0x4d, 0xbd, 0x5e, 0xf7, 0x3c, 0x21, + 0x5f, 0xa7, 0xf6, 0x87, 0xde, 0x08, 0x4a, 0xf7, 0xa8, 0xcf, 0xc2, 0x88, 0xf8, 0xc1, 0x56, 0x68, + 0xef, 0x9e, 0x0c, 0x47, 0xa9, 0xc3, 0x00, 0x6a, 0x08, 0x4d, 0x5e, 0x82, 0x21, 0x36, 0x60, 0x56, + 0x30, 0x5c, 0xcc, 0x40, 0xf0, 0x72, 0x46, 0xf7, 0x80, 0xf2, 0x7a, 0xe2, 0x53, 0x4a, 0xee, 0xde, + 0x83, 0xbb, 0x78, 0x9f, 0xf5, 0x29, 0x18, 0x2e, 0x99, 0xa6, 0xe5, 0xe2, 0x16, 0xdf, 0x11, 0x17, + 0x1b, 0x5d, 0x6d, 0xfa, 0xc7, 0x31, 0x7e, 0x41, 0x40, 0x9f, 0x68, 0xd4, 0xcb, 0x0c, 0xc9, 0x75, + 0xef, 0xf5, 0x0f, 0xb5, 0x85, 0x79, 0x8a, 0x97, 0x3b, 0xb6, 0x80, 0xc5, 0x1f, 0xff, 0x60, 0xe7, + 0x8d, 0x56, 0x6d, 0xab, 0x6d, 0x39, 0x54, 0xe7, 0x82, 0x1a, 0x0e, 0xa2, 0x41, 0xb4, 0x05, 0x02, + 0x9f, 0x1a, 0x86, 0x42, 0xb7, 0x84, 0x8a, 0x90, 0x7b, 0x70, 0xda, 0xbb, 0x66, 0xf6, 0x1f, 0x75, + 0x56, 0xa6, 0x1c, 0x74, 0x99, 0x1f, 0x0e, 0xe2, 0x93, 0x04, 0xa8, 0xc9, 0x47, 0xbc, 0x4b, 0x15, + 0xef, 0x55, 0x68, 0xdd, 0xd0, 0xe5, 0xae, 0x4e, 0xe4, 0x47, 0xbe, 0x0d, 0x86, 0xe7, 0xb5, 0xfb, + 0x53, 0x1d, 0x71, 0x72, 0x33, 0xba, 0xfb, 0xbb, 0x9b, 0x96, 0x76, 0xbf, 0xae, 0x8b, 0x72, 0x11, + 0x9b, 0x42, 0x66, 0x49, 0xea, 0x70, 0xb6, 0x6a, 0x5b, 0x2d, 0xcb, 0xa5, 0x7a, 0xe4, 0x7d, 0xe4, + 0x78, 0xf0, 0xa0, 0xba, 0x2d, 0x28, 0xea, 0x3d, 0x1e, 0x4a, 0x76, 0x61, 0x43, 0x5a, 0x30, 0x5e, + 0x72, 0x9c, 0x4e, 0x8b, 0x06, 0xf7, 0x5b, 0xf9, 0x1d, 0x3f, 0xe3, 0x29, 0xe1, 0xf3, 0xfc, 0x90, + 0x86, 0x45, 0xf9, 0xf5, 0x56, 0xdd, 0x35, 0xe4, 0x1a, 0xf1, 0x5b, 0xa2, 0xbc, 0x59, 0xef, 0x7a, + 0x02, 0xc4, 0xa7, 0xfd, 0xca, 0x04, 0x0e, 0x2f, 0xec, 0x5d, 0x5f, 0xf4, 0x18, 0x16, 0x40, 0xee, + 0xdd, 0x50, 0x91, 0x9b, 0xd9, 0xc1, 0xb1, 0xfc, 0xb8, 0x7a, 0x2e, 0xfe, 0x41, 0xfc, 0xe5, 0xd0, + 0xdf, 0x4e, 0x47, 0x66, 0x22, 0x6e, 0xa3, 0x1d, 0x68, 0x26, 0x92, 0x67, 0x94, 0xf4, 0x3e, 0x67, + 0x94, 0x27, 0xe2, 0x5e, 0x17, 0x09, 0xd3, 0xc4, 0xb7, 0xc1, 0x98, 0x57, 0x02, 0xdb, 0xbd, 0xe9, + 0x2f, 0x35, 0xdd, 0xbb, 0xe3, 0xa2, 0xe8, 0x8e, 0x3c, 0x1a, 0xa9, 0x9b, 0x91, 0x3e, 0x88, 0xf0, + 0x2b, 0x7e, 0x35, 0x05, 0x10, 0x28, 0x31, 0x79, 0x36, 0x1c, 0xf7, 0x2b, 0x15, 0x5c, 0x45, 0x89, + 0x20, 0x1e, 0xa1, 0x40, 0x5f, 0xe4, 0x22, 0x64, 0x31, 0xd0, 0x4b, 0x3a, 0x38, 0xfa, 0x5e, 0x33, + 0x4c, 0x5d, 0x45, 0x28, 0xc3, 0x4a, 0x11, 0x19, 0x10, 0x8b, 0x6e, 0x17, 0xdc, 0xf2, 0x9e, 0x82, + 0xf1, 0x5a, 0x67, 0x59, 0xee, 0x4c, 0x39, 0x94, 0x95, 0xd3, 0x59, 0xf6, 0xdf, 0x64, 0x87, 0xa2, + 0xf9, 0x84, 0x8b, 0x14, 0xbf, 0x9c, 0x8a, 0xf4, 0xef, 0x11, 0x1a, 0x16, 0xbb, 0xea, 0xd3, 0xe2, + 0x37, 0x32, 0x30, 0x5c, 0xb5, 0x6c, 0x57, 0x44, 0xce, 0x39, 0xde, 0x2b, 0xbd, 0xb4, 0x1f, 0xcd, + 0xee, 0x61, 0x3f, 0x7a, 0x11, 0xb2, 0x92, 0x13, 0x39, 0xbf, 0xb9, 0xd2, 0x75, 0x5b, 0x45, 0xe8, + 0x7b, 0xfc, 0x28, 0x26, 0x7e, 0x4d, 0x3d, 0x70, 0x60, 0x67, 0x90, 0x6f, 0x4f, 0x03, 0xbc, 0xf5, + 0xfc, 0xf3, 0x0f, 0x70, 0x97, 0x16, 0x7f, 0x2c, 0x05, 0xe3, 0xe2, 0xf2, 0x57, 0x8a, 0xf9, 0x37, + 0xe0, 0x5d, 0xdb, 0xcb, 0x33, 0x09, 0x07, 0xa9, 0x1e, 0x8e, 0x19, 0x06, 0xd3, 0xf7, 0x0d, 0x17, + 0xef, 0xbf, 0xa4, 0xa0, 0x7f, 0x54, 0xc0, 0x64, 0xc3, 0xc0, 0xa3, 0x23, 0xcf, 0x7a, 0xd7, 0xda, + 0x99, 0xc0, 0x1a, 0x62, 0x05, 0xa6, 0x13, 0xaf, 0xb6, 0x8b, 0x3f, 0x97, 0x85, 0xec, 0xf4, 0x7d, + 0xda, 0x38, 0xe6, 0x5d, 0x23, 0x1d, 0x96, 0x67, 0x0f, 0x78, 0x58, 0xbe, 0x1f, 0x3f, 0x9d, 0x37, + 0x82, 0xfe, 0xcc, 0x85, 0xab, 0x8f, 0xf4, 0x7c, 0xb4, 0x7a, 0xaf, 0xa7, 0x8f, 0x9f, 0x9b, 0xd7, + 0x6f, 0x64, 0x20, 0x53, 0x2b, 0x57, 0x4f, 0xf4, 0xe6, 0x48, 0xf5, 0xa6, 0xb7, 0x1f, 0x44, 0xd1, + 0xbf, 0xda, 0x1c, 0x0c, 0x3c, 0x8f, 0x23, 0xb7, 0x98, 0x7f, 0x91, 0x81, 0xb1, 0xda, 0xcc, 0x52, + 0x55, 0xba, 0x5d, 0xb8, 0xc5, 0xbd, 0x43, 0xd1, 0x4f, 0x91, 0x77, 0xe9, 0xc5, 0x98, 0x59, 0x75, + 0xbb, 0x62, 0xba, 0x2f, 0xbf, 0x78, 0x47, 0x6b, 0x76, 0x28, 0x1e, 0xc8, 0x71, 0x5f, 0x72, 0xc7, + 0x78, 0x97, 0x7e, 0x11, 0xc3, 0x6c, 0x78, 0x0c, 0xc8, 0x6b, 0x90, 0xb9, 0x2d, 0xbc, 0x7c, 0xba, + 0xf1, 0x79, 0xe1, 0x3a, 0xe7, 0xc3, 0x26, 0xc1, 0x4c, 0xc7, 0xd0, 0x91, 0x03, 0x2b, 0xc5, 0x0a, + 0xdf, 0x10, 0x26, 0xc3, 0xae, 0x0a, 0xaf, 0x78, 0x85, 0x6f, 0x54, 0xa6, 0x48, 0x0d, 0x86, 0xab, + 0xd4, 0x6e, 0x19, 0xd8, 0x51, 0xde, 0x9c, 0xdd, 0x9b, 0x09, 0xdb, 0xbf, 0x0e, 0xb7, 0x83, 0x42, + 0xc8, 0x4c, 0xe6, 0x42, 0xde, 0x06, 0xe0, 0x56, 0xd5, 0x2e, 0xe3, 0xc8, 0x3e, 0x8c, 0xbb, 0x41, + 0xbe, 0xe1, 0x48, 0xb0, 0xfc, 0x25, 0x66, 0x64, 0x0d, 0xf2, 0xf3, 0x96, 0x6e, 0xdc, 0x33, 0xb8, + 0x3b, 0x2f, 0x56, 0x90, 0xdb, 0xd9, 0x89, 0x8e, 0x6d, 0x30, 0x5a, 0x52, 0xb9, 0xa4, 0x6a, 0x62, + 0x8c, 0x8b, 0xff, 0xa8, 0x1f, 0xb2, 0xac, 0xdb, 0x4f, 0xc6, 0xef, 0x41, 0xc6, 0x6f, 0x09, 0xf2, + 0x77, 0x2d, 0x7b, 0xcd, 0x30, 0x57, 0xfc, 0x97, 0x16, 0xe2, 0xc4, 0x02, 0xbd, 0xc3, 0x36, 0x38, + 0xae, 0xee, 0x3f, 0xca, 0x50, 0x63, 0xe4, 0x3b, 0x8c, 0xe0, 0x57, 0x00, 0x78, 0x78, 0x06, 0xa4, + 0x19, 0x0c, 0x42, 0xc3, 0xf0, 0xe0, 0x0d, 0xf8, 0x78, 0x43, 0x0e, 0x0d, 0x13, 0x10, 0x93, 0x2b, + 0x9e, 0x7f, 0xcd, 0x10, 0xbe, 0xe5, 0xc0, 0xa3, 0x19, 0xf4, 0xaf, 0x91, 0x8d, 0x00, 0xee, 0x69, + 0x53, 0x05, 0x90, 0xee, 0x2c, 0x21, 0x22, 0x88, 0xd0, 0xe4, 0x20, 0xe2, 0x3a, 0x26, 0x5c, 0x59, + 0xaa, 0x12, 0x0f, 0xf2, 0x72, 0xc4, 0xa9, 0x82, 0x84, 0xb8, 0x75, 0xf5, 0xa9, 0x08, 0x9c, 0xf2, + 0x46, 0x76, 0x72, 0xca, 0x2b, 0xfe, 0x54, 0x06, 0x86, 0x19, 0xb7, 0x5a, 0xa7, 0xd5, 0xd2, 0xec, + 0xcd, 0x13, 0x45, 0x3e, 0x88, 0x22, 0xd7, 0x61, 0x42, 0x7e, 0x84, 0xc1, 0x4c, 0x57, 0x2f, 0x46, + 0x98, 0xbf, 0x85, 0x8f, 0x12, 0x70, 0xdb, 0x12, 0xe7, 0x7d, 0x57, 0x80, 0xf1, 0xc4, 0xc9, 0x51, + 0xe3, 0xbc, 0x8a, 0x3f, 0x94, 0x82, 0x7c, 0x14, 0xea, 0xeb, 0x7e, 0x2a, 0x51, 0xf7, 0x9f, 0x81, + 0x21, 0xe1, 0x96, 0xa1, 0xe9, 0xc2, 0x4b, 0x74, 0x6c, 0x7b, 0xab, 0x00, 0xf8, 0x26, 0xbe, 0x6e, + 0x53, 0x4d, 0x57, 0x03, 0x02, 0xf2, 0x12, 0x8c, 0xe0, 0x8f, 0xbb, 0xb6, 0xe1, 0xba, 0x94, 0x77, + 0x46, 0x96, 0xdf, 0x15, 0xf1, 0x02, 0x1b, 0x1c, 0xa1, 0x86, 0xc8, 0x8a, 0xbf, 0x95, 0x86, 0xa1, + 0x5a, 0x67, 0xd9, 0xd9, 0x74, 0x5c, 0xda, 0x3a, 0xe6, 0x3a, 0xe4, 0x1d, 0x2b, 0x64, 0x13, 0x8f, + 0x15, 0x1e, 0xf7, 0x86, 0x96, 0x74, 0xa7, 0xe1, 0x6f, 0x0c, 0x3c, 0x4f, 0xd7, 0x40, 0x8b, 0x72, + 0x7b, 0xd7, 0xa2, 0xe2, 0xcf, 0xa6, 0x21, 0xcf, 0x1d, 0x02, 0xa6, 0x0c, 0xa7, 0x71, 0x08, 0x8f, + 0x94, 0x8e, 0x5e, 0xa6, 0x07, 0x73, 0xa2, 0xd9, 0xc5, 0xd3, 0xaf, 0xe2, 0x67, 0xd2, 0x30, 0x5c, + 0xea, 0xb8, 0xab, 0x25, 0x17, 0xe7, 0xb7, 0x07, 0x72, 0x8f, 0xfc, 0x9b, 0x29, 0x18, 0x67, 0x0d, + 0x59, 0xb2, 0xd6, 0xa8, 0x79, 0x08, 0x57, 0x22, 0x87, 0x71, 0x10, 0xe9, 0xc9, 0x32, 0xb3, 0x37, + 0x59, 0xe2, 0x45, 0x9e, 0x6a, 0x35, 0xe9, 0xf1, 0xfe, 0x8c, 0x43, 0xbc, 0xc8, 0xf3, 0x04, 0x72, + 0x08, 0x17, 0xc7, 0x1f, 0x2c, 0x81, 0x1c, 0xc2, 0x89, 0xec, 0x07, 0x43, 0x20, 0xbf, 0x9e, 0x82, + 0xa1, 0x49, 0xcb, 0x3d, 0xe6, 0x03, 0x5f, 0x7c, 0xc5, 0xf1, 0x56, 0x73, 0xef, 0x2b, 0x8e, 0xb7, + 0x6e, 0x16, 0x7f, 0x24, 0x0d, 0xa7, 0x45, 0x9e, 0x0a, 0x71, 0x06, 0x76, 0x32, 0x1d, 0x8b, 0xc1, + 0x16, 0x17, 0xcd, 0xc9, 0x3c, 0x24, 0x44, 0xf3, 0x13, 0x19, 0x38, 0x8d, 0x71, 0xb0, 0xd9, 0x8e, + 0xea, 0x03, 0x60, 0x8b, 0x90, 0x46, 0xd8, 0x3d, 0x63, 0x3e, 0xc1, 0x3d, 0xe3, 0xdf, 0x6f, 0x15, + 0x5e, 0x5e, 0x31, 0xdc, 0xd5, 0xce, 0xf2, 0xd5, 0x86, 0xd5, 0xba, 0xb6, 0x62, 0x6b, 0xeb, 0x06, + 0x77, 0x4c, 0xd0, 0x9a, 0xd7, 0x82, 0xf4, 0x51, 0x6d, 0x43, 0x24, 0x83, 0xaa, 0xe1, 0x4e, 0x89, + 0x71, 0xf5, 0x1c, 0x3b, 0x1c, 0x80, 0x9b, 0x96, 0x61, 0x0a, 0x5f, 0x69, 0x6e, 0xe8, 0xd6, 0xb6, + 0xb7, 0x0a, 0x67, 0xde, 0xb1, 0x0c, 0xb3, 0x1e, 0x75, 0x98, 0xde, 0x6b, 0x7d, 0x01, 0x6b, 0x55, + 0xaa, 0xa6, 0xf8, 0xcf, 0x53, 0x70, 0x3e, 0xac, 0xc5, 0x1f, 0x04, 0xdb, 0xf1, 0x6f, 0xa6, 0xe1, + 0xcc, 0x0d, 0x14, 0x8e, 0xef, 0x62, 0x76, 0x32, 0x6f, 0x89, 0xc1, 0x99, 0x20, 0x9b, 0x13, 0x8b, + 0xb2, 0xbb, 0x6c, 0x4e, 0x26, 0x75, 0x21, 0x9b, 0xdf, 0x49, 0xc1, 0xa9, 0xc5, 0xca, 0x54, 0xf9, + 0x03, 0x32, 0xa2, 0xe2, 0xdf, 0x73, 0xcc, 0x0d, 0xce, 0xd8, 0xf7, 0x1c, 0x73, 0xd3, 0xf3, 0xf3, + 0x69, 0x38, 0x55, 0x2b, 0xcd, 0xcf, 0x7d, 0x50, 0x66, 0xf0, 0xb2, 0xec, 0x0f, 0xed, 0x1d, 0x82, + 0x09, 0x5b, 0x40, 0xfe, 0xcc, 0x3b, 0xd7, 0xbb, 0xfb, 0x49, 0xc7, 0x85, 0x72, 0xcc, 0xa7, 0xee, + 0x43, 0x11, 0x0a, 0xd3, 0xfc, 0x10, 0xf5, 0x31, 0xd7, 0xfc, 0x7f, 0x92, 0x83, 0xe1, 0x5b, 0x9d, + 0x65, 0x2a, 0x5c, 0xba, 0x1e, 0xe8, 0x93, 0xdf, 0xeb, 0x30, 0x2c, 0xc4, 0x80, 0x37, 0x1c, 0x52, + 0x50, 0x50, 0x11, 0xe4, 0x89, 0xc7, 0x5d, 0x93, 0x89, 0xc8, 0x45, 0xc8, 0xde, 0xa1, 0xf6, 0xb2, + 0xfc, 0x5e, 0x7e, 0x9d, 0xda, 0xcb, 0x2a, 0x42, 0xc9, 0x5c, 0xf0, 0x98, 0xa7, 0x54, 0xad, 0x60, + 0x16, 0x2e, 0x71, 0x69, 0x88, 0x69, 0xc5, 0x7c, 0xb7, 0x50, 0xad, 0x6d, 0xf0, 0xfc, 0x5d, 0x72, + 0xac, 0x8e, 0x68, 0x49, 0xb2, 0x00, 0x13, 0x21, 0x77, 0x51, 0x4c, 0x41, 0x35, 0x98, 0xc0, 0x2e, + 0x29, 0xf9, 0x54, 0xbc, 0x28, 0x79, 0x03, 0x46, 0x3c, 0x20, 0x3a, 0x3e, 0x0e, 0x05, 0x79, 0x4f, + 0x7c, 0x56, 0x91, 0xdc, 0x12, 0xa1, 0x02, 0x32, 0x03, 0xbc, 0xc4, 0x80, 0x04, 0x06, 0x11, 0x67, + 0xdd, 0x50, 0x01, 0xf2, 0x12, 0x32, 0xc0, 0x07, 0x68, 0xe8, 0x30, 0x35, 0x8c, 0x8f, 0xc9, 0xf1, + 0x02, 0xc8, 0x16, 0x70, 0x1e, 0x32, 0x20, 0x44, 0x46, 0x16, 0x01, 0x02, 0xc7, 0x16, 0x11, 0x98, + 0x65, 0xcf, 0x2e, 0x37, 0x12, 0x0b, 0xf9, 0x26, 0x6f, 0x74, 0x3f, 0x37, 0x79, 0xc5, 0x1f, 0xce, + 0xc0, 0x70, 0xa9, 0xdd, 0xf6, 0x87, 0xc2, 0xb3, 0x90, 0x2b, 0xb5, 0xdb, 0xb7, 0xd5, 0x8a, 0x9c, + 0x4c, 0x42, 0x6b, 0xb7, 0xeb, 0x1d, 0xdb, 0x90, 0xbd, 0xd5, 0x39, 0x11, 0x29, 0xc3, 0x68, 0xa9, + 0xdd, 0xae, 0x76, 0x96, 0x9b, 0x46, 0x43, 0x4a, 0xab, 0xc7, 0xf3, 0x98, 0xb6, 0xdb, 0xf5, 0x36, + 0x62, 0xa2, 0xb9, 0x15, 0xc3, 0x65, 0xc8, 0xa7, 0x30, 0x9c, 0x99, 0xc8, 0xea, 0xc6, 0xf3, 0x46, + 0x15, 0xfd, 0x34, 0x12, 0x41, 0xdb, 0xae, 0xfa, 0x44, 0x3c, 0xdd, 0xc6, 0x45, 0x2f, 0x49, 0x0a, + 0xab, 0x28, 0x96, 0xbd, 0x2d, 0x60, 0x49, 0x9e, 0x83, 0x81, 0x52, 0xbb, 0x2d, 0xdd, 0x56, 0xa1, + 0x63, 0x1b, 0x2b, 0x15, 0xcd, 0xc3, 0x29, 0xc8, 0xc4, 0x67, 0x89, 0xfb, 0x6d, 0xcb, 0x76, 0x71, + 0x48, 0x8d, 0x06, 0x9f, 0xe5, 0x5d, 0x88, 0x5b, 0x72, 0x04, 0x21, 0x35, 0x5c, 0xe6, 0xc2, 0xeb, + 0x30, 0x16, 0x6e, 0xf1, 0x9e, 0x72, 0x7e, 0x7c, 0x33, 0x85, 0x52, 0x39, 0xe6, 0x4f, 0x36, 0x5e, + 0x80, 0x4c, 0xa9, 0xdd, 0x16, 0x93, 0xda, 0xa9, 0x84, 0x4e, 0x8d, 0xc6, 0x87, 0x28, 0xb5, 0xdb, + 0xde, 0xa7, 0x1f, 0xf3, 0xb7, 0x5f, 0xfb, 0xfa, 0xf4, 0x5f, 0xe7, 0x9f, 0x7e, 0xbc, 0xdf, 0x65, + 0x15, 0x7f, 0x2e, 0x03, 0xe3, 0xa5, 0x76, 0xfb, 0x24, 0xc1, 0xc7, 0x61, 0x45, 0xa1, 0x78, 0x1e, + 0x40, 0x9a, 0x63, 0x07, 0xfc, 0x97, 0xa9, 0xc3, 0xd2, 0xfc, 0xaa, 0xa4, 0x54, 0x89, 0xc8, 0x53, + 0xbf, 0xc1, 0x3d, 0xa9, 0xdf, 0x67, 0x32, 0x38, 0xf1, 0x1d, 0xf7, 0x88, 0x7a, 0xef, 0x97, 0x6e, + 0x13, 0x7d, 0x90, 0xdb, 0x53, 0x1f, 0xfc, 0x5a, 0x68, 0xf0, 0x60, 0x46, 0x87, 0x93, 0x5e, 0xe8, + 0x3f, 0x90, 0x6d, 0x3d, 0x26, 0x0b, 0x53, 0x84, 0xf9, 0xf2, 0x52, 0xf9, 0x89, 0xa0, 0x73, 0x0d, + 0x86, 0xaa, 0x1b, 0xba, 0x1a, 0xa1, 0xf5, 0xfa, 0x70, 0x60, 0x4f, 0x7d, 0xb8, 0x95, 0xc6, 0xc0, + 0x12, 0x7e, 0xd0, 0xba, 0x83, 0x6f, 0x51, 0xae, 0x01, 0x70, 0xf7, 0x05, 0xdf, 0x3f, 0x7f, 0x94, + 0xc7, 0xa7, 0xe2, 0x19, 0xfe, 0x44, 0x7c, 0xaa, 0x80, 0xc4, 0x77, 0x77, 0xca, 0x24, 0xba, 0x3b, + 0x5d, 0x81, 0x41, 0x55, 0xdb, 0xf8, 0x78, 0x87, 0x8a, 0xc7, 0x4c, 0x5e, 0x4c, 0x58, 0x6d, 0xa3, + 0xfe, 0x69, 0x06, 0x54, 0x7d, 0x34, 0x29, 0xfa, 0x91, 0x49, 0x24, 0xb7, 0x12, 0x7e, 0xd0, 0xee, + 0xc7, 0x23, 0xd9, 0x8f, 0xa2, 0x93, 0x57, 0x21, 0x53, 0xba, 0x5b, 0x13, 0x92, 0xf5, 0xbb, 0xb6, + 0x74, 0xb7, 0x26, 0xe4, 0xd5, 0xb5, 0xec, 0xdd, 0x5a, 0xf1, 0x33, 0x69, 0x20, 0x71, 0x4a, 0xf2, + 0x32, 0x0c, 0x21, 0x74, 0x85, 0xe9, 0x8c, 0x9c, 0x1a, 0x7a, 0xc3, 0xa9, 0xdb, 0x08, 0x0d, 0x59, + 0x88, 0x1e, 0x29, 0x79, 0x05, 0x73, 0xf9, 0x8b, 0xe4, 0xa4, 0xa1, 0xd4, 0xd0, 0x1b, 0x8e, 0x97, + 0xfd, 0x3e, 0x92, 0xca, 0x5f, 0x10, 0xa3, 0x71, 0x79, 0xb7, 0x36, 0x6b, 0x39, 0xae, 0x10, 0x35, + 0x37, 0x2e, 0x37, 0x1c, 0xcc, 0x49, 0x1e, 0x32, 0x2e, 0x39, 0x19, 0xe6, 0x55, 0xbc, 0x5b, 0xe3, + 0xaf, 0xf0, 0x74, 0xd5, 0xf2, 0x73, 0x18, 0xf2, 0xbc, 0x8a, 0x1b, 0x4e, 0x9d, 0xbf, 0xe0, 0xd3, + 0xeb, 0xb6, 0xd5, 0x0c, 0xe7, 0x55, 0x0c, 0x95, 0x2a, 0x7e, 0xdf, 0x20, 0xe4, 0xa7, 0x34, 0x57, + 0x5b, 0xd6, 0x1c, 0x2a, 0x6d, 0xc9, 0xc7, 0x3d, 0x98, 0xf7, 0x39, 0x92, 0x1c, 0xf4, 0xe5, 0x84, + 0xaf, 0x89, 0x16, 0x20, 0xaf, 0x05, 0x7c, 0xfd, 0xac, 0xd7, 0x72, 0x1a, 0xcd, 0xe5, 0x7a, 0x5b, + 0x80, 0xd5, 0x18, 0x21, 0x79, 0x06, 0x86, 0x3d, 0x18, 0xdb, 0x45, 0x64, 0x02, 0x9d, 0xd1, 0x97, + 0xd9, 0x26, 0x42, 0x95, 0xd1, 0xe4, 0x15, 0x18, 0xf1, 0x7e, 0x4a, 0xf6, 0x39, 0xcf, 0x09, 0xba, + 0x1c, 0xdb, 0x82, 0xc9, 0xa4, 0x72, 0x51, 0x9c, 0xdf, 0xfa, 0x43, 0x45, 0x23, 0x69, 0x37, 0x43, + 0xa4, 0xe4, 0xd3, 0x30, 0xe6, 0xfd, 0x16, 0xbb, 0x0e, 0xee, 0x7d, 0xf8, 0x8c, 0xa7, 0x84, 0x51, + 0xb1, 0x5e, 0x0d, 0x93, 0xf3, 0xfd, 0xc7, 0x43, 0x5e, 0xfa, 0x47, 0x7d, 0x39, 0xbe, 0xfd, 0x88, + 0x54, 0x40, 0x2a, 0x30, 0xe1, 0x41, 0x02, 0x0d, 0x1d, 0x08, 0xb6, 0x9d, 0xfa, 0x72, 0x3d, 0x51, + 0x49, 0xe3, 0xa5, 0x48, 0x13, 0x2e, 0x86, 0x80, 0xba, 0xb3, 0x6a, 0xdc, 0x73, 0xc5, 0x9e, 0x51, + 0x04, 0x68, 0x17, 0xa9, 0x83, 0x7d, 0xae, 0x9c, 0xc6, 0xcb, 0x01, 0x1e, 0x0e, 0x41, 0xd3, 0x93, + 0x1b, 0xa9, 0xc1, 0x69, 0x0f, 0x7f, 0xa3, 0x5c, 0xad, 0xda, 0xd6, 0x3b, 0xb4, 0xe1, 0x56, 0xa6, + 0xc4, 0x9e, 0x1b, 0x03, 0x77, 0xea, 0xcb, 0xf5, 0x95, 0x46, 0x9b, 0x29, 0x05, 0xc3, 0x85, 0x99, + 0x27, 0x16, 0x26, 0x77, 0xe0, 0x8c, 0x04, 0xaf, 0x98, 0x8e, 0xab, 0x99, 0x0d, 0xea, 0x07, 0xcc, + 0xc1, 0x43, 0x01, 0xc1, 0xd5, 0x10, 0xc8, 0x30, 0xdb, 0xe4, 0xe2, 0xe4, 0x75, 0x18, 0xf5, 0x10, + 0xfc, 0x2a, 0x72, 0x18, 0xaf, 0x22, 0x71, 0x48, 0xea, 0xcb, 0xf5, 0xe8, 0x63, 0xf1, 0x30, 0xb1, + 0xac, 0x51, 0x4b, 0x9b, 0x6d, 0x2a, 0xdc, 0x82, 0x3d, 0x8d, 0x72, 0x37, 0xdb, 0x89, 0xca, 0xc8, + 0x48, 0xc9, 0x1b, 0x81, 0x46, 0x2d, 0xda, 0xc6, 0x8a, 0xe1, 0xa5, 0xf6, 0x3a, 0x27, 0xf4, 0xc3, + 0x42, 0x60, 0x92, 0x7e, 0x70, 0xf2, 0x0b, 0x25, 0x38, 0x95, 0xa0, 0x63, 0x7b, 0xda, 0x31, 0x7e, + 0x36, 0x1d, 0x34, 0xe2, 0x98, 0x6f, 0x1b, 0x27, 0x61, 0xd0, 0xfb, 0x12, 0x61, 0x3c, 0x28, 0xdd, + 0x86, 0x66, 0x94, 0x87, 0x87, 0x0f, 0x89, 0xe3, 0x98, 0x6f, 0x25, 0x0f, 0x43, 0x1c, 0x5f, 0x4b, + 0x05, 0xe2, 0x38, 0xe6, 0xdb, 0xcb, 0xdf, 0xcc, 0x06, 0x73, 0xd2, 0xc9, 0x1e, 0xf3, 0xb0, 0xcc, + 0xe4, 0xc0, 0x99, 0x36, 0xb7, 0x87, 0x37, 0xc4, 0xb2, 0x6a, 0x0e, 0xec, 0x4f, 0x35, 0xc9, 0xeb, + 0x30, 0x5c, 0xb5, 0x1c, 0x77, 0xc5, 0xa6, 0x4e, 0xd5, 0x4f, 0x30, 0x82, 0xef, 0xcf, 0xdb, 0x02, + 0x5c, 0x6f, 0x87, 0x83, 0xa6, 0x49, 0xe4, 0x52, 0x2c, 0xb9, 0xa1, 0xbd, 0xc7, 0x92, 0x2b, 0xfe, + 0x61, 0x26, 0xa6, 0x4b, 0xdc, 0xec, 0x3d, 0x96, 0xba, 0x74, 0x08, 0x13, 0x05, 0xb9, 0x1e, 0xac, + 0xa1, 0x7c, 0x7f, 0xd0, 0x2f, 0xc5, 0x5e, 0x5d, 0x16, 0xdb, 0x83, 0x30, 0x09, 0xf9, 0x24, 0x9c, + 0x0b, 0x01, 0xaa, 0x9a, 0xad, 0xb5, 0xa8, 0x1b, 0x24, 0xad, 0xc5, 0x68, 0x7a, 0x5e, 0xe9, 0x7a, + 0xdb, 0x47, 0xcb, 0x89, 0x70, 0xbb, 0x70, 0x90, 0x14, 0x73, 0x60, 0x0f, 0x5e, 0xde, 0x5f, 0xc8, + 0x04, 0x66, 0x52, 0x38, 0x2a, 0xb6, 0x4a, 0x9d, 0x4e, 0xd3, 0x7d, 0x70, 0x3b, 0x78, 0x7f, 0x39, + 0x87, 0x66, 0x61, 0xbc, 0x74, 0xef, 0x1e, 0x6d, 0xb8, 0x5e, 0xb0, 0x7f, 0x47, 0xc4, 0x41, 0xe5, + 0xdb, 0x16, 0x81, 0x12, 0xc1, 0xdb, 0x9d, 0x50, 0x1a, 0xe1, 0x70, 0xb1, 0xe2, 0x1f, 0x65, 0x41, + 0xf1, 0xb7, 0x0d, 0xfe, 0x6b, 0xc7, 0x23, 0x5c, 0xa2, 0xdf, 0x17, 0xbd, 0x62, 0xc0, 0x44, 0x20, + 0x0c, 0xf1, 0xcc, 0x4c, 0xe9, 0xc7, 0x6d, 0x49, 0x21, 0xca, 0x2c, 0x20, 0xe4, 0x3b, 0x91, 0x0b, + 0x62, 0x27, 0x42, 0x82, 0xd7, 0xa4, 0x75, 0x87, 0xb3, 0x50, 0xe3, 0x5c, 0xc9, 0xf7, 0xa7, 0xe0, + 0xb4, 0xd7, 0x29, 0x8b, 0xcb, 0xcc, 0x24, 0x2f, 0x5b, 0x1d, 0xd3, 0x7f, 0x83, 0xf5, 0x6a, 0xf7, + 0xea, 0x78, 0x27, 0x5d, 0x4d, 0x2a, 0xcc, 0x5b, 0xe2, 0xc7, 0xec, 0xf1, 0x15, 0xc2, 0x42, 0x9a, + 0x7a, 0x03, 0x89, 0xd4, 0xc4, 0x7a, 0x2f, 0xdc, 0x80, 0xf3, 0x5d, 0x59, 0xee, 0x64, 0x02, 0xf7, + 0xcb, 0x26, 0xf0, 0x1f, 0xa4, 0x82, 0x89, 0x28, 0x22, 0x24, 0x72, 0x15, 0x20, 0x00, 0x89, 0x4d, + 0x31, 0x3e, 0xf1, 0x0a, 0x84, 0xa6, 0x4a, 0x14, 0x64, 0x11, 0x72, 0x42, 0x2c, 0x3c, 0x41, 0xfc, + 0x87, 0x76, 0xe8, 0x85, 0xab, 0xb2, 0x1c, 0x70, 0xc3, 0x2b, 0xbe, 0x59, 0xb0, 0xb9, 0xf0, 0x0a, + 0x0c, 0xef, 0xf7, 0xbb, 0xbe, 0x3f, 0x03, 0x44, 0xde, 0xc1, 0x1e, 0xa1, 0x79, 0x7f, 0x8c, 0xa7, + 0xb0, 0xcb, 0x30, 0xc8, 0x3e, 0x01, 0x13, 0x11, 0x49, 0x81, 0xc7, 0x3b, 0x02, 0xa6, 0xfa, 0xd8, + 0x20, 0x6e, 0xdf, 0x40, 0x72, 0xdc, 0xbe, 0xe2, 0x0f, 0x65, 0xe0, 0xac, 0xdc, 0x21, 0x53, 0x14, + 0x73, 0x99, 0x9c, 0x74, 0xca, 0x7b, 0xd8, 0x29, 0x45, 0xc8, 0xf1, 0x8d, 0x8b, 0x48, 0x2a, 0xc3, + 0x0f, 0x95, 0x10, 0xa2, 0x0a, 0x4c, 0xf1, 0x7f, 0x49, 0xc3, 0xa8, 0x6f, 0x1c, 0x6a, 0xb6, 0xf3, + 0x00, 0x77, 0xc7, 0x47, 0x60, 0x14, 0x23, 0xaf, 0xb5, 0xa8, 0xc9, 0xa3, 0x93, 0xf5, 0x4b, 0x59, + 0xa0, 0x3c, 0x84, 0x48, 0xf8, 0x17, 0x22, 0x64, 0xda, 0xcf, 0x2d, 0x3f, 0x29, 0x1e, 0x1e, 0x37, + 0xfb, 0x38, 0xbc, 0xf8, 0x77, 0x32, 0x30, 0xe2, 0x49, 0x79, 0xd2, 0x38, 0xae, 0xb7, 0x44, 0x47, + 0x2b, 0xe4, 0x6b, 0x00, 0x55, 0xcb, 0x76, 0xb5, 0xe6, 0x42, 0xa0, 0xf9, 0x78, 0xbc, 0xda, 0x46, + 0x28, 0x2f, 0x23, 0x91, 0xe0, 0xfa, 0x15, 0x98, 0xd5, 0x7c, 0x62, 0xe2, 0xeb, 0x97, 0x0f, 0x55, + 0x25, 0x8a, 0xe2, 0x2f, 0xa7, 0x61, 0xdc, 0xeb, 0xa4, 0xe9, 0xfb, 0xb4, 0xd1, 0x79, 0x90, 0xe7, + 0xa6, 0xb0, 0xb4, 0xfb, 0x77, 0x94, 0x76, 0xf1, 0xff, 0x92, 0x26, 0x92, 0x72, 0xd3, 0x3a, 0x99, + 0x48, 0xfe, 0x32, 0x74, 0xbc, 0xf8, 0x9d, 0x19, 0x38, 0xed, 0x49, 0x7d, 0xa6, 0x63, 0xe2, 0xc1, + 0x44, 0x59, 0x6b, 0x36, 0x1f, 0xe4, 0xdd, 0xf8, 0xb0, 0x27, 0x88, 0x45, 0x11, 0xca, 0x54, 0x24, + 0x5f, 0xbd, 0x27, 0xc0, 0x75, 0xcb, 0xd0, 0x55, 0x99, 0x88, 0xbc, 0x01, 0x23, 0xde, 0xcf, 0x92, + 0xbd, 0xe2, 0x6d, 0xc1, 0xf1, 0x9a, 0xc1, 0x2f, 0xa4, 0xd9, 0xa1, 0xd8, 0x1c, 0xa1, 0x02, 0xc5, + 0xcf, 0x0c, 0xc0, 0x85, 0xbb, 0x86, 0xa9, 0x5b, 0x1b, 0x8e, 0x97, 0xbb, 0xf7, 0xd8, 0x1f, 0xb3, + 0x1d, 0x75, 0xce, 0xde, 0x8f, 0xc3, 0x99, 0xa8, 0x48, 0x6d, 0x3f, 0xa3, 0x82, 0xe8, 0x9d, 0x0d, + 0x4e, 0x50, 0xf7, 0xb2, 0xf8, 0x8a, 0xbb, 0x3a, 0x35, 0xb9, 0x64, 0x34, 0x0d, 0xf0, 0xc0, 0x6e, + 0xd2, 0x00, 0x3f, 0x0d, 0xb9, 0x29, 0xab, 0xa5, 0x19, 0x5e, 0x94, 0x26, 0x1c, 0xc5, 0x7e, 0xbd, + 0x88, 0x51, 0x05, 0x05, 0xe3, 0x2f, 0x2a, 0xc6, 0x2e, 0x1b, 0x0a, 0xf8, 0x7b, 0x05, 0x98, 0x95, + 0xa6, 0xca, 0x44, 0xc4, 0x82, 0x51, 0x51, 0x9d, 0xb8, 0x59, 0x03, 0xdc, 0x3c, 0xbd, 0xe4, 0xc9, + 0xa8, 0xbb, 0x5a, 0x5d, 0x0d, 0x95, 0xe3, 0xdb, 0x28, 0x9e, 0x9d, 0x58, 0x7c, 0x0c, 0xbf, 0x63, + 0x53, 0xc3, 0xfc, 0x25, 0x21, 0xe0, 0x24, 0x33, 0x1c, 0x17, 0x02, 0xce, 0x32, 0x32, 0x11, 0x99, + 0x86, 0x09, 0x8c, 0x5c, 0xef, 0x6f, 0xa5, 0x98, 0x4a, 0x8c, 0xa0, 0x51, 0x89, 0x17, 0x36, 0x3c, + 0xd8, 0x3d, 0xfb, 0xb8, 0x7a, 0x43, 0xa0, 0xd5, 0x78, 0x09, 0x72, 0x1e, 0x32, 0x0b, 0x73, 0x25, + 0xbc, 0xe9, 0x19, 0xe4, 0x39, 0xe7, 0xcc, 0xa6, 0xa6, 0x32, 0xd8, 0x85, 0x37, 0x81, 0xc4, 0x3f, + 0x67, 0x4f, 0xb7, 0x39, 0xff, 0x54, 0xda, 0xf2, 0x1d, 0x77, 0x7f, 0x9c, 0xc3, 0x98, 0x08, 0x43, + 0xe9, 0x1e, 0xfb, 0xdf, 0xcb, 0x74, 0x8f, 0xb9, 0x43, 0x4d, 0xf7, 0x58, 0xfc, 0xe9, 0x14, 0x4c, + 0xc4, 0xb2, 0x3b, 0x90, 0x17, 0x00, 0x38, 0x44, 0x8a, 0xf0, 0x8a, 0x01, 0x88, 0x82, 0x8c, 0x0f, + 0x62, 0x79, 0x0c, 0xc8, 0xc8, 0x35, 0x18, 0xe4, 0xbf, 0x44, 0x8c, 0xb3, 0x78, 0x91, 0x4e, 0xc7, + 0xd0, 0x55, 0x9f, 0x28, 0xa8, 0x05, 0xef, 0x33, 0x33, 0x89, 0x45, 0xdc, 0xcd, 0xb6, 0x5f, 0x0b, + 0x23, 0x2b, 0x7e, 0x5f, 0x1a, 0x46, 0xfc, 0x06, 0x97, 0xf4, 0xa3, 0xd2, 0xb9, 0x9c, 0x48, 0x94, + 0x91, 0xd9, 0x29, 0x51, 0x46, 0x64, 0xbe, 0x15, 0x99, 0x31, 0x0e, 0xef, 0x4d, 0xd7, 0xe7, 0xd2, + 0x30, 0xee, 0xd7, 0x7a, 0x84, 0x57, 0x67, 0xef, 0x23, 0x91, 0x7c, 0x7f, 0x0a, 0x94, 0x49, 0xa3, + 0xd9, 0x34, 0xcc, 0x95, 0x8a, 0x79, 0xcf, 0xb2, 0x5b, 0x38, 0x21, 0x1e, 0xdd, 0x11, 0x6e, 0xf1, + 0xbb, 0x53, 0x30, 0x21, 0x1a, 0x54, 0xd6, 0x6c, 0xfd, 0xe8, 0xce, 0xc7, 0xa2, 0x2d, 0x39, 0x3a, + 0x7d, 0x29, 0xfe, 0x62, 0x1a, 0x60, 0xce, 0x6a, 0xac, 0x1d, 0xf3, 0x27, 0x61, 0xaf, 0x41, 0x8e, + 0x3b, 0xd5, 0x0b, 0x8d, 0x9d, 0x10, 0x4f, 0x9f, 0xd8, 0xa7, 0x71, 0xc4, 0x64, 0x5e, 0xcc, 0xc7, + 0x39, 0xee, 0x97, 0xaf, 0xa4, 0x54, 0x51, 0x84, 0x55, 0xca, 0xe8, 0xc4, 0x82, 0xe1, 0x57, 0xca, + 0x60, 0xe1, 0x4a, 0xb7, 0xb7, 0x0a, 0xd9, 0xa6, 0xd5, 0x58, 0x53, 0x91, 0xbe, 0xf8, 0xff, 0xa6, + 0xb8, 0xec, 0x8e, 0xf9, 0xc3, 0x56, 0xef, 0xf3, 0xb3, 0x7b, 0xfc, 0xfc, 0xbf, 0x9e, 0x82, 0xd3, + 0x2a, 0x6d, 0x58, 0xeb, 0xd4, 0xde, 0x2c, 0x5b, 0x3a, 0xbd, 0x41, 0x4d, 0x6a, 0x1f, 0xd5, 0x88, + 0xfa, 0x15, 0xcc, 0x2c, 0x14, 0x34, 0xe6, 0xb6, 0x43, 0xf5, 0xe3, 0x93, 0xf5, 0xa9, 0xf8, 0x95, + 0x01, 0x50, 0x12, 0xad, 0xde, 0x63, 0x6b, 0xce, 0x75, 0xdd, 0xca, 0x64, 0x0f, 0x6b, 0x2b, 0xd3, + 0xbf, 0xb7, 0xad, 0x4c, 0x6e, 0xaf, 0x5b, 0x99, 0x81, 0xdd, 0x6c, 0x65, 0x5a, 0xd1, 0xad, 0xcc, + 0x20, 0x6e, 0x65, 0x5e, 0xe8, 0xb9, 0x95, 0x99, 0x36, 0xf5, 0x7d, 0x6e, 0x64, 0x8e, 0x6d, 0x3e, + 0xf3, 0xfd, 0xec, 0xc0, 0x2e, 0xb3, 0x49, 0xb1, 0x61, 0xd9, 0x3a, 0xd5, 0xc5, 0xc6, 0x0b, 0x4f, + 0xfd, 0x6d, 0x01, 0x53, 0x7d, 0x6c, 0x2c, 0x39, 0xfc, 0xe8, 0x6e, 0x92, 0xc3, 0x1f, 0xc2, 0xfe, + 0xeb, 0xdf, 0xa5, 0x61, 0xa2, 0x4c, 0x6d, 0x97, 0x47, 0xb2, 0x3d, 0x0c, 0x87, 0xba, 0x12, 0x8c, + 0x4b, 0x0c, 0xd1, 0x22, 0x4f, 0x07, 0x4e, 0x82, 0x0d, 0x6a, 0xbb, 0x51, 0x1f, 0xc3, 0x28, 0x3d, + 0xab, 0xde, 0x4b, 0xd0, 0x28, 0xc6, 0xae, 0x5f, 0xbd, 0x07, 0xe7, 0x82, 0x34, 0xc4, 0x2f, 0xd5, + 0xa7, 0x97, 0xfc, 0x64, 0xb2, 0xfb, 0xc8, 0xb9, 0xb8, 0x06, 0xa7, 0xa5, 0xc6, 0x94, 0x3a, 0xee, + 0xaa, 0x65, 0xb3, 0x56, 0xf4, 0x8b, 0x40, 0xc7, 0x1e, 0xaf, 0x04, 0x1a, 0x91, 0x4a, 0x2e, 0xc0, + 0xd4, 0x35, 0x0f, 0xa5, 0x26, 0x32, 0x65, 0x5b, 0xa6, 0x44, 0x04, 0xb9, 0x04, 0x59, 0x94, 0x9b, + 0x94, 0x4f, 0x2e, 0x22, 0x32, 0xc4, 0x93, 0x67, 0xfc, 0xa9, 0x21, 0x1d, 0xb8, 0xfa, 0xf3, 0x29, + 0x41, 0x7e, 0xc4, 0x28, 0x26, 0x87, 0x37, 0x61, 0xa4, 0xd6, 0xc1, 0x7b, 0xe7, 0x5b, 0x74, 0xd3, + 0x4f, 0x1a, 0x81, 0xf9, 0x4f, 0x1c, 0x0e, 0xaf, 0xaf, 0xd1, 0xcd, 0xb0, 0x03, 0x6a, 0xa8, 0x44, + 0xf1, 0x4b, 0x29, 0xb8, 0xa4, 0x52, 0x93, 0x6e, 0x68, 0xcb, 0x4d, 0x2a, 0xb5, 0x5c, 0xac, 0x9b, + 0x6c, 0x4e, 0x35, 0x9c, 0x96, 0xe6, 0x36, 0x56, 0x0f, 0xa4, 0x41, 0x33, 0x30, 0x22, 0xcf, 0xee, + 0x7b, 0x98, 0xf9, 0x43, 0xe5, 0x8a, 0x5f, 0xc9, 0xc2, 0xc0, 0xa4, 0xe5, 0xde, 0xb4, 0x0e, 0x98, + 0x22, 0x35, 0x58, 0x10, 0xd3, 0x7b, 0x38, 0x09, 0x7b, 0x0e, 0x2b, 0x97, 0x72, 0x92, 0xa0, 0x7b, + 0xee, 0xb2, 0x15, 0xcb, 0x8f, 0xe3, 0x91, 0xed, 0x31, 0x39, 0xea, 0xcb, 0x30, 0x84, 0xe1, 0x79, + 0xa4, 0xb3, 0x6a, 0x74, 0x7e, 0x77, 0x19, 0x30, 0x5a, 0x47, 0x40, 0x4a, 0x3e, 0x19, 0x0a, 0x4c, + 0x9c, 0x3b, 0x78, 0x32, 0x55, 0x39, 0x46, 0xf1, 0x0b, 0xfc, 0x9a, 0x13, 0xdb, 0x24, 0xa5, 0x8e, + 0xc2, 0x33, 0xa6, 0x48, 0x93, 0x7c, 0xc2, 0x43, 0x4c, 0x74, 0x5a, 0x86, 0xd1, 0x49, 0xcb, 0x95, + 0x1c, 0xad, 0x87, 0x82, 0x77, 0xba, 0x4c, 0xf2, 0xc9, 0x5e, 0xd6, 0xe1, 0x32, 0xc5, 0xbf, 0xc8, + 0xc2, 0x88, 0xf7, 0xf3, 0x88, 0x74, 0xe7, 0x59, 0xc8, 0xcd, 0x5a, 0x52, 0x66, 0x17, 0x74, 0xce, + 0x5e, 0xb5, 0x9c, 0x88, 0xd7, 0xb9, 0x20, 0x62, 0x52, 0x5f, 0xb0, 0x74, 0xf9, 0x69, 0x01, 0x4a, + 0xdd, 0xb4, 0xf4, 0xd8, 0xfb, 0x6e, 0x9f, 0x90, 0x4d, 0x32, 0xf8, 0x2a, 0x43, 0xba, 0xe6, 0x88, + 0xbc, 0xc4, 0x40, 0xbc, 0xa4, 0x95, 0xb9, 0xbd, 0x6a, 0xe5, 0xc0, 0x7e, 0xb5, 0x72, 0xf0, 0x70, + 0xb5, 0xf2, 0x6d, 0x18, 0xc1, 0x9a, 0xbc, 0xe4, 0x9b, 0x3b, 0x9b, 0x1d, 0xe7, 0x85, 0x65, 0x30, + 0xca, 0xdb, 0x2d, 0x52, 0x70, 0xa2, 0x41, 0x10, 0x62, 0x15, 0xd1, 0x5d, 0x38, 0xc0, 0x61, 0xc3, + 0x1f, 0xa6, 0x60, 0xe0, 0xb6, 0xb9, 0x66, 0x5a, 0x1b, 0x07, 0xd3, 0xb8, 0x17, 0x60, 0x58, 0xb0, + 0x91, 0xd6, 0x5e, 0x7c, 0xb2, 0xdf, 0xe1, 0xe0, 0x3a, 0x72, 0x52, 0x65, 0x2a, 0xf2, 0xba, 0x5f, + 0x08, 0x1f, 0x5e, 0x65, 0x82, 0xdc, 0x48, 0x5e, 0xa1, 0x46, 0x38, 0x39, 0x8a, 0x4c, 0x4e, 0x2e, + 0x42, 0x76, 0x8a, 0x35, 0x55, 0x0a, 0x92, 0xcc, 0x9a, 0xa2, 0x22, 0xb4, 0xf8, 0xd9, 0x2c, 0x8c, + 0x45, 0x8e, 0x05, 0x9f, 0x86, 0x21, 0x71, 0x2c, 0x67, 0x78, 0xd9, 0x5a, 0xf0, 0x61, 0x96, 0x0f, + 0x54, 0x07, 0xf9, 0x9f, 0x15, 0x9d, 0x7c, 0x0c, 0x06, 0x2c, 0x07, 0x4d, 0x06, 0xfc, 0x96, 0xb1, + 0x60, 0x08, 0x2d, 0xd6, 0x58, 0xdb, 0xf9, 0xe0, 0x10, 0x24, 0xb2, 0x46, 0x5a, 0x0e, 0x7e, 0xda, + 0x8b, 0x30, 0xa4, 0x39, 0x0e, 0x75, 0xeb, 0xae, 0xb6, 0x22, 0x27, 0x70, 0xf1, 0x81, 0xf2, 0xe8, + 0x40, 0xe0, 0x92, 0xb6, 0x42, 0xde, 0x84, 0xd1, 0x86, 0x4d, 0xd1, 0xa8, 0xd0, 0x9a, 0xac, 0x95, + 0x92, 0xd1, 0x1f, 0x42, 0xc8, 0x8b, 0x65, 0x80, 0xa8, 0xe8, 0xe4, 0x0e, 0x8c, 0x8a, 0xcf, 0xe1, + 0xaf, 0x22, 0x70, 0xa0, 0x8d, 0x05, 0xcb, 0x18, 0x17, 0x09, 0x7f, 0x17, 0x21, 0x1e, 0xc7, 0xc8, + 0xe4, 0x32, 0x5f, 0x5d, 0x22, 0x25, 0x8b, 0x40, 0x36, 0xe8, 0x32, 0x1a, 0x17, 0xac, 0x2e, 0x9e, + 0x7f, 0x40, 0x64, 0xb3, 0xc5, 0x17, 0x25, 0x71, 0xac, 0xfc, 0xd0, 0x66, 0x83, 0x2e, 0x97, 0x42, + 0x48, 0x72, 0x17, 0xce, 0xc4, 0x8b, 0xb0, 0x4f, 0xe6, 0x57, 0x27, 0x8f, 0x6f, 0x6f, 0x15, 0x0a, + 0x89, 0x04, 0x12, 0xdb, 0x53, 0x31, 0xb6, 0x15, 0xfd, 0x66, 0x76, 0x70, 0x20, 0x3f, 0xa8, 0x8e, + 0xb1, 0xb2, 0x9e, 0x81, 0x6d, 0xe8, 0xc5, 0xaf, 0xa7, 0x98, 0x21, 0xcd, 0x3e, 0x68, 0x9a, 0x09, + 0x82, 0xe9, 0x7a, 0x6b, 0x8f, 0xba, 0xde, 0x0a, 0x12, 0xef, 0xe6, 0x9c, 0x1e, 0xb3, 0xab, 0x2a, + 0xb0, 0xe4, 0x2a, 0xe4, 0x74, 0xf9, 0x4c, 0xf1, 0x6c, 0xb8, 0x13, 0xbc, 0x7a, 0x54, 0x41, 0x45, + 0x2e, 0x43, 0x96, 0x2d, 0x59, 0xd1, 0x03, 0x05, 0xd9, 0xba, 0x50, 0x91, 0xa2, 0xf8, 0xed, 0x69, + 0x18, 0x91, 0xbe, 0xe6, 0xfa, 0x81, 0x3e, 0xe7, 0xd5, 0xdd, 0x35, 0xd3, 0x73, 0x09, 0xc2, 0x9d, + 0xa6, 0xd7, 0xe4, 0x17, 0x7d, 0x51, 0xec, 0xea, 0xba, 0x4e, 0x08, 0xe6, 0x65, 0xf1, 0xa1, 0xb9, + 0xdd, 0x6f, 0xae, 0x19, 0xfd, 0xcd, 0xec, 0x60, 0x3a, 0x9f, 0xb9, 0x99, 0x1d, 0xcc, 0xe6, 0xfb, + 0x31, 0x50, 0x1a, 0xc6, 0x26, 0xe7, 0x27, 0x17, 0xe6, 0x3d, 0x63, 0xe5, 0x98, 0xbf, 0xcb, 0x39, + 0xdc, 0x20, 0x72, 0x11, 0xd9, 0x1c, 0xf3, 0x47, 0x3a, 0xef, 0xa9, 0x6c, 0x4e, 0x12, 0xf5, 0x0a, + 0xd9, 0xfc, 0x51, 0x0a, 0x94, 0x44, 0xd9, 0x94, 0x8e, 0xc8, 0x4b, 0xe4, 0xf0, 0xd2, 0xf5, 0xfe, + 0x59, 0x1a, 0x26, 0x2a, 0xa6, 0x4b, 0x57, 0xf8, 0x8e, 0xf1, 0x98, 0x4f, 0x15, 0xb7, 0x60, 0x58, + 0xfa, 0x18, 0xd1, 0xe7, 0x0f, 0xf9, 0xa7, 0x15, 0x01, 0xaa, 0x0b, 0x27, 0xb9, 0xf4, 0xe1, 0xbd, + 0x72, 0x8a, 0x0a, 0xf9, 0x98, 0xcf, 0x39, 0xc7, 0x43, 0xc8, 0xc7, 0x7c, 0xf2, 0x7a, 0x9f, 0x0a, + 0xf9, 0x73, 0x19, 0x38, 0x95, 0x50, 0x39, 0xb9, 0x04, 0x03, 0xb5, 0xce, 0x32, 0xc6, 0x45, 0x4b, + 0x05, 0xfe, 0xd4, 0x4e, 0x67, 0x19, 0x43, 0xa2, 0xa9, 0x1e, 0x92, 0x2c, 0x61, 0xe0, 0x82, 0xc5, + 0xca, 0x54, 0x59, 0x48, 0xb5, 0x28, 0x85, 0x60, 0x60, 0xe0, 0xa4, 0x2f, 0xf3, 0x83, 0x1b, 0x58, + 0x86, 0xde, 0x88, 0x04, 0x37, 0x60, 0x65, 0xc8, 0xb7, 0xc0, 0x50, 0xe9, 0xdd, 0x8e, 0x4d, 0x91, + 0x2f, 0x97, 0xf8, 0x13, 0x3e, 0x5f, 0x0f, 0x91, 0xc4, 0x99, 0xc7, 0x69, 0x60, 0x14, 0x51, 0xde, + 0x01, 0x43, 0xb2, 0x08, 0xb9, 0x1b, 0x86, 0x3b, 0xdb, 0x59, 0x16, 0xbd, 0xe0, 0xc7, 0x4e, 0xe3, + 0xd0, 0x24, 0xbe, 0xb8, 0x2b, 0xe7, 0x31, 0xa0, 0xe5, 0x3d, 0x10, 0x2f, 0x40, 0xe6, 0xa0, 0xbf, + 0x74, 0xb7, 0xa6, 0x96, 0x44, 0x4f, 0x3c, 0x2a, 0x47, 0xa1, 0x28, 0x75, 0x65, 0x87, 0x6f, 0xea, + 0x35, 0x39, 0x4b, 0x14, 0xd2, 0x17, 0xbf, 0x2f, 0x05, 0x17, 0xba, 0x0b, 0x8f, 0x3c, 0x07, 0x03, + 0xaa, 0xd5, 0xa4, 0x25, 0x75, 0x41, 0xf4, 0x0c, 0xcf, 0xbc, 0x6d, 0x35, 0x69, 0x5d, 0xb3, 0xe5, + 0xbd, 0x88, 0x47, 0x46, 0x3e, 0x0a, 0xc3, 0x15, 0xc7, 0xe9, 0x50, 0xbb, 0xf6, 0xc2, 0x6d, 0xb5, + 0x22, 0xb6, 0xac, 0xb8, 0x25, 0x32, 0x10, 0x5c, 0x77, 0x5e, 0x88, 0x04, 0x66, 0x93, 0xe9, 0x8b, + 0xdf, 0x93, 0x82, 0x8b, 0xbd, 0x84, 0x4e, 0x5e, 0x80, 0xc1, 0x25, 0x6a, 0x6a, 0xa6, 0x5b, 0x99, + 0x12, 0x4d, 0xc2, 0x1d, 0xa0, 0x8b, 0xb0, 0xf0, 0x46, 0xc6, 0x27, 0x64, 0x85, 0xf8, 0xa1, 0xb0, + 0xef, 0x85, 0xc2, 0x0f, 0xb0, 0x11, 0x16, 0x29, 0xe4, 0x11, 0x16, 0x3f, 0x09, 0xe7, 0xbb, 0xf6, + 0x11, 0xf9, 0x18, 0x8c, 0x2c, 0xda, 0x2b, 0x9a, 0x69, 0xbc, 0xcb, 0x87, 0x58, 0x2a, 0xd8, 0x65, + 0x5b, 0x12, 0x5c, 0xde, 0xf9, 0xc9, 0xf4, 0xc5, 0x65, 0x50, 0xba, 0x75, 0x18, 0x99, 0x81, 0x31, + 0x0c, 0xdd, 0x5d, 0x32, 0x1b, 0xab, 0x96, 0x1d, 0xc8, 0x1e, 0x9f, 0xad, 0xb9, 0x0c, 0x53, 0xd7, + 0x10, 0x15, 0xe9, 0x83, 0x48, 0xa9, 0xe2, 0xef, 0xa6, 0x61, 0xa4, 0xda, 0xec, 0xac, 0x18, 0xd2, + 0xc2, 0xbc, 0xef, 0xfd, 0x8c, 0xb7, 0xbb, 0x48, 0xef, 0x6d, 0x77, 0xc1, 0xa6, 0x33, 0x7b, 0x9f, + 0xd3, 0x99, 0x57, 0x8e, 0xbc, 0x0e, 0xb9, 0x36, 0x7e, 0x47, 0xf4, 0x1e, 0x80, 0x7f, 0x5d, 0xb7, + 0x7b, 0x00, 0x5e, 0x86, 0xcd, 0x5f, 0x8d, 0x03, 0xcc, 0x5f, 0x41, 0x59, 0x49, 0xa0, 0xc1, 0x22, + 0x7c, 0x22, 0xd0, 0x43, 0x11, 0x68, 0xb0, 0xe0, 0x9e, 0x08, 0xf4, 0x00, 0x02, 0xfd, 0x4a, 0x1a, + 0xc6, 0xc2, 0x55, 0x92, 0xe7, 0x60, 0x98, 0x57, 0xc3, 0xcf, 0xdd, 0x52, 0x92, 0x4b, 0x7b, 0x00, + 0x56, 0x81, 0xff, 0x10, 0x07, 0x88, 0xe3, 0xab, 0x9a, 0x53, 0x0f, 0x4e, 0xc0, 0xb8, 0xf7, 0xc0, + 0x20, 0xf7, 0xc3, 0x8b, 0xa0, 0xd4, 0xb1, 0x55, 0xcd, 0x29, 0x07, 0xbf, 0xc9, 0x34, 0x10, 0x9b, + 0x76, 0x1c, 0x1a, 0x66, 0x90, 0x45, 0x06, 0x7c, 0xf5, 0x88, 0x61, 0xd5, 0x09, 0x0e, 0x93, 0xd9, + 0x7c, 0xab, 0xdf, 0x6c, 0x54, 0x86, 0xfe, 0xde, 0xa7, 0xc8, 0x8f, 0x6f, 0x6f, 0x15, 0xce, 0x48, + 0xf4, 0xc9, 0xc7, 0xc8, 0x9c, 0x60, 0x4a, 0x73, 0x35, 0x7e, 0xe8, 0xe1, 0x75, 0x40, 0xf1, 0x67, + 0xbf, 0x3b, 0x05, 0xfd, 0x8b, 0x26, 0x5d, 0xbc, 0x47, 0x9e, 0x87, 0x21, 0xa6, 0x31, 0x73, 0x16, + 0xeb, 0xcc, 0x94, 0x70, 0xdf, 0x91, 0x54, 0x09, 0x11, 0xb3, 0x7d, 0x6a, 0x40, 0x45, 0x5e, 0x04, + 0x08, 0x5e, 0x38, 0x0a, 0xf5, 0x23, 0x72, 0x19, 0x8e, 0x99, 0xed, 0x53, 0x25, 0x3a, 0xaf, 0x94, + 0x78, 0x1f, 0x96, 0x89, 0x97, 0xe2, 0x18, 0xaf, 0x94, 0x18, 0x20, 0x73, 0x40, 0xd8, 0xaf, 0xaa, + 0xe6, 0x38, 0x1b, 0x96, 0xad, 0x97, 0x57, 0x35, 0x73, 0x85, 0x46, 0xb7, 0xa7, 0x71, 0x8a, 0xd9, + 0x3e, 0x35, 0xa1, 0x1c, 0x79, 0x15, 0x46, 0x64, 0x7f, 0xe6, 0xa8, 0xcf, 0x91, 0x8c, 0x9b, 0xed, + 0x53, 0x43, 0xb4, 0xe4, 0xc3, 0x30, 0x2c, 0x7e, 0xdf, 0xb4, 0x84, 0x43, 0x83, 0x14, 0x48, 0x4b, + 0x42, 0xcd, 0xf6, 0xa9, 0x32, 0xa5, 0x54, 0x69, 0xd5, 0x36, 0x4c, 0x57, 0x3c, 0x91, 0x8f, 0x56, + 0x8a, 0x38, 0xa9, 0x52, 0xfc, 0x4d, 0x3e, 0x0a, 0xa3, 0x7e, 0x84, 0xb2, 0x77, 0x68, 0xc3, 0x15, + 0xb7, 0x0b, 0x67, 0x22, 0x85, 0x39, 0x72, 0xb6, 0x4f, 0x0d, 0x53, 0x93, 0xcb, 0x90, 0x53, 0xa9, + 0x63, 0xbc, 0xeb, 0x79, 0x2b, 0x8c, 0x49, 0x03, 0xdd, 0x78, 0x97, 0x49, 0x49, 0xe0, 0x59, 0xef, + 0x04, 0xee, 0x11, 0xe2, 0x2e, 0x80, 0x44, 0x6a, 0x99, 0x36, 0x75, 0xd6, 0x3b, 0x92, 0x6f, 0xcc, + 0x9b, 0x41, 0xdc, 0x36, 0x91, 0xb6, 0x78, 0x38, 0x1a, 0x20, 0x43, 0xc6, 0xce, 0xf6, 0xa9, 0x11, + 0x7a, 0x49, 0xaa, 0x53, 0x86, 0xb3, 0x26, 0xe2, 0xed, 0x46, 0xa5, 0xca, 0x50, 0x92, 0x54, 0xd9, + 0x4f, 0xa9, 0xea, 0x05, 0xea, 0x6e, 0x58, 0xf6, 0x9a, 0x88, 0xae, 0x1b, 0xad, 0x5a, 0x60, 0xa5, + 0xaa, 0x05, 0x44, 0xae, 0x9a, 0x8d, 0xb8, 0xb1, 0xe4, 0xaa, 0x35, 0x57, 0x93, 0xab, 0xe6, 0x47, + 0x9d, 0x5e, 0x27, 0xcd, 0x51, 0x6d, 0x9d, 0x2a, 0xe3, 0x89, 0x1d, 0x8a, 0x38, 0xa9, 0x43, 0xf1, + 0x37, 0xab, 0xb4, 0x6a, 0xd9, 0xae, 0x48, 0x80, 0xaf, 0xe4, 0xc3, 0x95, 0x4a, 0x28, 0x56, 0xa9, + 0xf4, 0x93, 0x75, 0x50, 0x90, 0x38, 0x5f, 0x99, 0x08, 0x77, 0x50, 0x80, 0x61, 0x1d, 0x24, 0x25, + 0xd8, 0x2f, 0x60, 0x52, 0x6e, 0x85, 0x20, 0xf9, 0xb0, 0xdf, 0xc2, 0x72, 0x75, 0xb6, 0x4f, 0xc5, + 0x74, 0xdd, 0x45, 0x9e, 0xee, 0x5d, 0x39, 0x85, 0x14, 0x23, 0x1e, 0x05, 0x83, 0xcd, 0xf6, 0xa9, + 0x3c, 0x15, 0xfc, 0xf3, 0x52, 0x4a, 0x4c, 0xe5, 0x74, 0x78, 0x8a, 0xf0, 0x11, 0x6c, 0x8a, 0x08, + 0x12, 0x67, 0xce, 0xc4, 0x13, 0x3f, 0x2a, 0x67, 0xc2, 0x6b, 0x4d, 0x14, 0x3f, 0xdb, 0xa7, 0xc6, + 0x93, 0x45, 0x7e, 0x38, 0x94, 0x0b, 0x51, 0x39, 0x1b, 0x89, 0x5e, 0x17, 0xa0, 0x98, 0xb8, 0xe4, + 0xac, 0x89, 0x8b, 0x70, 0x8a, 0xa7, 0x52, 0x16, 0xf1, 0xe7, 0xc4, 0x64, 0x75, 0x2e, 0xbc, 0x33, + 0x4c, 0x20, 0x99, 0xed, 0x53, 0x93, 0x4a, 0x92, 0x72, 0x2c, 0x23, 0xa1, 0xa2, 0x84, 0x5d, 0xb3, + 0x22, 0xe8, 0xd9, 0x3e, 0x35, 0x96, 0xc3, 0xf0, 0x45, 0x39, 0x15, 0xa0, 0x72, 0x3e, 0xdc, 0x89, + 0x01, 0x86, 0x75, 0xa2, 0x94, 0x32, 0xf0, 0x45, 0x39, 0x3d, 0x9c, 0x72, 0x21, 0x5e, 0x2a, 0x98, + 0x39, 0xa5, 0x34, 0x72, 0x6a, 0x72, 0xc6, 0x2b, 0xe5, 0xa1, 0xb0, 0x3b, 0x48, 0x12, 0xcd, 0x6c, + 0x9f, 0x9a, 0x9c, 0x2d, 0x4b, 0x4d, 0x4e, 0x15, 0xa5, 0x5c, 0xec, 0xc5, 0xd3, 0x6f, 0x5d, 0x72, + 0x9a, 0x29, 0xad, 0x47, 0xe2, 0x1e, 0xe5, 0xe1, 0xf0, 0x1e, 0xb2, 0x2b, 0xe1, 0x6c, 0x9f, 0xda, + 0x23, 0xfd, 0xcf, 0xed, 0x2e, 0x59, 0x74, 0x94, 0x47, 0xc2, 0x69, 0xef, 0x13, 0x89, 0x66, 0xfb, + 0xd4, 0x2e, 0x39, 0x78, 0x6e, 0x77, 0x49, 0xb2, 0xa2, 0x14, 0x7a, 0xb2, 0xf5, 0xe5, 0xd1, 0x25, + 0x45, 0xcb, 0x62, 0x62, 0x7e, 0x12, 0xe5, 0xd1, 0xb0, 0xea, 0x26, 0x90, 0x30, 0xd5, 0x4d, 0xca, + 0x6c, 0xb2, 0x98, 0x98, 0x50, 0x43, 0x79, 0xac, 0x07, 0x43, 0xbf, 0x8d, 0x89, 0xa9, 0x38, 0x16, + 0x13, 0x33, 0x5a, 0x28, 0xc5, 0x30, 0xc3, 0x04, 0x12, 0xc6, 0x30, 0x29, 0x17, 0xc6, 0x62, 0x62, + 0xe2, 0x03, 0xe5, 0xf1, 0x1e, 0x0c, 0x83, 0x16, 0x26, 0xa5, 0x4c, 0xf8, 0x70, 0x28, 0xf3, 0x80, + 0xf2, 0x44, 0x78, 0xde, 0x90, 0x50, 0x6c, 0xde, 0x90, 0x73, 0x14, 0x94, 0x63, 0x61, 0x91, 0x95, + 0x27, 0xc3, 0xc3, 0x3c, 0x82, 0x66, 0xc3, 0x3c, 0x1a, 0x48, 0xb9, 0x1c, 0x0b, 0x0f, 0xab, 0x5c, + 0xea, 0xc6, 0x04, 0xd1, 0x61, 0x26, 0x3c, 0xa0, 0x6c, 0x25, 0x21, 0x3e, 0xa9, 0xf2, 0x54, 0xf8, + 0x59, 0x41, 0x8c, 0x60, 0xb6, 0x4f, 0x4d, 0x88, 0x6a, 0xaa, 0x26, 0x07, 0xe3, 0x52, 0x2e, 0x87, + 0x87, 0x6d, 0x12, 0x0d, 0x1b, 0xb6, 0x89, 0x81, 0xbc, 0xe6, 0x92, 0xde, 0x3e, 0x29, 0x57, 0xc2, + 0x86, 0x59, 0x9c, 0x82, 0x19, 0x66, 0x09, 0x6f, 0xa6, 0xd4, 0xe4, 0x10, 0x4f, 0xca, 0xd3, 0x3d, + 0x5b, 0x88, 0x34, 0x09, 0x2d, 0xe4, 0x11, 0x8f, 0x02, 0xdb, 0xe9, 0x76, 0xbb, 0x69, 0x69, 0xba, + 0xf2, 0xa1, 0x44, 0xdb, 0x89, 0x23, 0x25, 0xdb, 0x89, 0x03, 0xd8, 0x2a, 0x2f, 0x3f, 0xb1, 0x51, + 0x9e, 0x09, 0xaf, 0xf2, 0x32, 0x8e, 0xad, 0xf2, 0xa1, 0xe7, 0x38, 0xe5, 0xd8, 0x73, 0x14, 0xe5, + 0xd9, 0xb0, 0x02, 0x44, 0xd0, 0x4c, 0x01, 0xa2, 0x0f, 0x58, 0x3e, 0xd5, 0xfd, 0x01, 0x87, 0x72, + 0x35, 0x7c, 0x16, 0xd6, 0x8d, 0x6e, 0xb6, 0x4f, 0xed, 0xfe, 0x08, 0xa4, 0x92, 0xf0, 0x1e, 0x43, + 0xb9, 0x16, 0x56, 0xb0, 0x18, 0x01, 0x53, 0xb0, 0xf8, 0x2b, 0x8e, 0x4a, 0xc2, 0x83, 0x0a, 0xe5, + 0xb9, 0xae, 0xac, 0xfc, 0x6f, 0x4e, 0x78, 0x86, 0xf1, 0xa2, 0xfc, 0x22, 0x42, 0x79, 0x3e, 0xbc, + 0xd8, 0x05, 0x18, 0xb6, 0xd8, 0x49, 0x2f, 0x27, 0x5e, 0x94, 0xdf, 0x02, 0x28, 0xd7, 0xe3, 0xa5, + 0x82, 0x25, 0x52, 0x7a, 0x33, 0xa0, 0x26, 0xbb, 0xd0, 0x2b, 0x2f, 0x84, 0xb5, 0x2e, 0x89, 0x86, + 0x69, 0x5d, 0xa2, 0xfb, 0xfd, 0x4c, 0xdc, 0x13, 0x5e, 0x79, 0x31, 0xba, 0xcb, 0x0e, 0xe3, 0x99, + 0xe5, 0x13, 0xf3, 0x9e, 0x7f, 0x33, 0x1a, 0x29, 0x52, 0x79, 0x29, 0x72, 0xaf, 0x1e, 0xc2, 0x32, + 0xfb, 0x36, 0x12, 0x59, 0xf2, 0xcd, 0x68, 0x70, 0x45, 0xe5, 0xe5, 0x64, 0x0e, 0xbe, 0xae, 0x44, + 0x83, 0x31, 0xbe, 0x19, 0x8d, 0x47, 0xa8, 0x7c, 0x38, 0x99, 0x83, 0x2f, 0xdd, 0x68, 0xfc, 0xc2, + 0xe7, 0xa5, 0x0c, 0x09, 0xca, 0x47, 0xc2, 0xa6, 0xa3, 0x8f, 0x60, 0xa6, 0x63, 0x90, 0x47, 0xe1, + 0x79, 0x29, 0xb3, 0x80, 0xf2, 0x4a, 0xac, 0x88, 0xdf, 0x58, 0x29, 0xff, 0xc0, 0xf3, 0x52, 0x44, + 0x7e, 0xe5, 0xd5, 0x58, 0x11, 0xbf, 0x75, 0x52, 0xdc, 0x7e, 0xbd, 0xd7, 0xf3, 0x69, 0xe5, 0xb5, + 0xf0, 0x69, 0x7b, 0x77, 0xca, 0xd9, 0x3e, 0xb5, 0xd7, 0x33, 0xec, 0x4f, 0x75, 0x7f, 0x57, 0xa0, + 0xbc, 0x1e, 0x1e, 0xc2, 0xdd, 0xe8, 0xd8, 0x10, 0xee, 0xfa, 0x36, 0xe1, 0xa3, 0x91, 0x50, 0x2a, + 0xca, 0x47, 0xc3, 0x53, 0x5c, 0x08, 0xc9, 0xa6, 0xb8, 0x68, 0xe0, 0x95, 0x50, 0x8c, 0x10, 0xe5, + 0x63, 0xe1, 0x29, 0x4e, 0xc6, 0xb1, 0x29, 0x2e, 0x14, 0x4f, 0xa4, 0x1c, 0x0b, 0x5d, 0xa1, 0xbc, + 0x11, 0x9e, 0xe2, 0x22, 0x68, 0x36, 0xc5, 0x45, 0x83, 0x5d, 0x7c, 0x34, 0x12, 0xc1, 0x41, 0x79, + 0x33, 0xb9, 0xfd, 0x88, 0x94, 0xdb, 0xcf, 0xe3, 0x3d, 0xa8, 0xc9, 0xa1, 0x08, 0x94, 0x52, 0x78, + 0xfc, 0x26, 0xd1, 0xb0, 0xf1, 0x9b, 0x18, 0xc6, 0x20, 0xba, 0x71, 0x10, 0x5a, 0x35, 0xd9, 0x63, + 0xe3, 0x10, 0x98, 0x22, 0x09, 0xe0, 0xd0, 0x1e, 0x99, 0x6f, 0x84, 0xca, 0x5d, 0xf6, 0xc8, 0xde, + 0x36, 0x28, 0x42, 0xcf, 0x66, 0xd7, 0x98, 0x9b, 0xbb, 0x32, 0x15, 0x9e, 0x5d, 0x63, 0x04, 0x6c, + 0x76, 0x8d, 0x3b, 0xc7, 0xcf, 0x40, 0x5e, 0x68, 0x11, 0xf7, 0xde, 0x37, 0xcc, 0x15, 0x65, 0x3a, + 0xf2, 0xdc, 0x37, 0x82, 0x67, 0xb3, 0x53, 0x14, 0x86, 0xeb, 0x35, 0x87, 0x95, 0x9b, 0x46, 0x7b, + 0xd9, 0xd2, 0x6c, 0xbd, 0x46, 0x4d, 0x5d, 0x99, 0x89, 0xac, 0xd7, 0x09, 0x34, 0xb8, 0x5e, 0x27, + 0xc0, 0x31, 0x42, 0x61, 0x04, 0xae, 0xd2, 0x06, 0x35, 0xd6, 0xa9, 0x72, 0x03, 0xd9, 0x16, 0xba, + 0xb1, 0x15, 0x64, 0xb3, 0x7d, 0x6a, 0x37, 0x0e, 0xcc, 0x56, 0x9f, 0xdf, 0xac, 0x7d, 0x7c, 0xce, + 0x8f, 0x7e, 0x51, 0xb5, 0x69, 0x5b, 0xb3, 0xa9, 0x32, 0x1b, 0xb6, 0xd5, 0x13, 0x89, 0x98, 0xad, + 0x9e, 0x88, 0x88, 0xb3, 0xf5, 0xc6, 0x42, 0xa5, 0x17, 0xdb, 0x60, 0x44, 0x24, 0x97, 0x66, 0xb3, + 0x53, 0x18, 0xc1, 0x04, 0x34, 0x67, 0x99, 0x2b, 0x78, 0x52, 0x71, 0x33, 0x3c, 0x3b, 0x75, 0xa7, + 0x64, 0xb3, 0x53, 0x77, 0x2c, 0x53, 0xf5, 0x30, 0x96, 0x8f, 0xc1, 0x5b, 0x61, 0x55, 0x4f, 0x20, + 0x61, 0xaa, 0x9e, 0x00, 0x8e, 0x33, 0x54, 0xa9, 0x43, 0x5d, 0x65, 0xae, 0x17, 0x43, 0x24, 0x89, + 0x33, 0x44, 0x70, 0x9c, 0xe1, 0x0c, 0x75, 0x1b, 0xab, 0xca, 0x7c, 0x2f, 0x86, 0x48, 0x12, 0x67, + 0x88, 0x60, 0xb6, 0xd9, 0x0c, 0x83, 0x27, 0x3b, 0xcd, 0x35, 0xaf, 0xcf, 0x16, 0xc2, 0x9b, 0xcd, + 0xae, 0x84, 0x6c, 0xb3, 0xd9, 0x15, 0x49, 0xbe, 0x67, 0xd7, 0x0f, 0x0d, 0x94, 0x45, 0xac, 0xf0, + 0x6a, 0x60, 0x17, 0xec, 0xa6, 0xd4, 0x6c, 0x9f, 0xba, 0xdb, 0x87, 0x0c, 0x1f, 0xf2, 0xbd, 0x72, + 0x95, 0x2a, 0x56, 0x35, 0xee, 0x9f, 0x55, 0x70, 0xf0, 0x6c, 0x9f, 0xea, 0xfb, 0xed, 0x7e, 0x18, + 0x86, 0xf1, 0xa3, 0x2a, 0xa6, 0xe1, 0x4e, 0x4d, 0x2a, 0x1f, 0x0f, 0x6f, 0x99, 0x24, 0x14, 0xdb, + 0x32, 0x49, 0x3f, 0xd9, 0x24, 0x8e, 0x3f, 0xf9, 0x14, 0x33, 0x35, 0xa9, 0xa8, 0xe1, 0x49, 0x3c, + 0x84, 0x64, 0x93, 0x78, 0x08, 0xe0, 0xd7, 0x3b, 0x65, 0x5b, 0xed, 0xa9, 0x49, 0xa5, 0x96, 0x50, + 0x2f, 0x47, 0xf9, 0xf5, 0xf2, 0x9f, 0x7e, 0xbd, 0xb5, 0xd5, 0x8e, 0x3b, 0xc5, 0xbe, 0x71, 0x29, + 0xa1, 0x5e, 0x0f, 0xe9, 0xd7, 0xeb, 0x01, 0xd8, 0x54, 0x88, 0x80, 0xaa, 0x6d, 0xb1, 0x49, 0xfb, + 0x96, 0xd1, 0x6c, 0x2a, 0xb7, 0xc3, 0x53, 0x61, 0x14, 0xcf, 0xa6, 0xc2, 0x28, 0x8c, 0x99, 0x9e, + 0xbc, 0x55, 0x74, 0xb9, 0xb3, 0xa2, 0xdc, 0x09, 0x9b, 0x9e, 0x01, 0x86, 0x99, 0x9e, 0xc1, 0x2f, + 0xdc, 0x5d, 0xb0, 0x5f, 0x2a, 0xbd, 0x67, 0x53, 0x67, 0x55, 0xb9, 0x1b, 0xd9, 0x5d, 0x48, 0x38, + 0xdc, 0x5d, 0x48, 0xbf, 0xc9, 0x0a, 0x3c, 0x14, 0x5a, 0x68, 0xbc, 0x5b, 0x9b, 0x1a, 0xd5, 0xec, + 0xc6, 0xaa, 0xf2, 0x16, 0xb2, 0x7a, 0x3c, 0x71, 0xa9, 0x0a, 0x93, 0xce, 0xf6, 0xa9, 0xbd, 0x38, + 0xe1, 0xb6, 0xfc, 0xe3, 0x73, 0x3c, 0x8c, 0xb1, 0x5a, 0x2d, 0x7b, 0x9b, 0xd0, 0xb7, 0x23, 0xdb, + 0xf2, 0x38, 0x09, 0x6e, 0xcb, 0xe3, 0x60, 0xd2, 0x86, 0x47, 0x22, 0x5b, 0xb5, 0x79, 0xad, 0xc9, + 0xf6, 0x25, 0x54, 0xaf, 0x6a, 0x8d, 0x35, 0xea, 0x2a, 0x9f, 0x40, 0xde, 0x97, 0xba, 0x6c, 0xf8, + 0x22, 0xd4, 0xb3, 0x7d, 0xea, 0x0e, 0xfc, 0x48, 0x11, 0xb2, 0xb5, 0x99, 0xa5, 0xaa, 0xf2, 0xc9, + 0xf0, 0xf9, 0x26, 0x83, 0xcd, 0xf6, 0xa9, 0x88, 0x63, 0x56, 0xda, 0xed, 0xf6, 0x8a, 0xad, 0xe9, + 0x94, 0x1b, 0x5a, 0x68, 0xbb, 0x09, 0x03, 0xf4, 0x5b, 0xc2, 0x56, 0x5a, 0x37, 0x3a, 0x66, 0xa5, + 0x75, 0xc3, 0x31, 0x45, 0x0d, 0x65, 0xec, 0x51, 0xbe, 0x35, 0xac, 0xa8, 0x21, 0x24, 0x53, 0xd4, + 0x70, 0x7e, 0x9f, 0xb7, 0xe0, 0xac, 0xbf, 0x9f, 0x17, 0xeb, 0x2f, 0xef, 0x34, 0xe5, 0x53, 0xc8, + 0xe7, 0x91, 0xd8, 0x65, 0x40, 0x88, 0x6a, 0xb6, 0x4f, 0xed, 0x52, 0x9e, 0xad, 0xb8, 0xb1, 0x8c, + 0x76, 0xc2, 0xbc, 0xf8, 0xb6, 0xf0, 0x8a, 0xdb, 0x85, 0x8c, 0xad, 0xb8, 0x5d, 0x50, 0x89, 0xcc, + 0x85, 0x50, 0xb5, 0x1d, 0x98, 0xfb, 0x32, 0xed, 0xc6, 0x21, 0x91, 0xb9, 0xb0, 0xd4, 0x96, 0x77, + 0x60, 0xee, 0x5b, 0x6b, 0xdd, 0x38, 0x90, 0xcb, 0x90, 0xab, 0xd5, 0xe6, 0xd5, 0x8e, 0xa9, 0x34, + 0x22, 0xee, 0xc8, 0x08, 0x9d, 0xed, 0x53, 0x05, 0x9e, 0x99, 0x41, 0xd3, 0x4d, 0xcd, 0x71, 0x8d, + 0x86, 0x83, 0x23, 0xc6, 0x1b, 0x21, 0x7a, 0xd8, 0x0c, 0x4a, 0xa2, 0x61, 0x66, 0x50, 0x12, 0x9c, + 0xd9, 0x8b, 0x65, 0xcd, 0x71, 0x34, 0x53, 0xb7, 0xb5, 0x49, 0x5c, 0x26, 0x68, 0xe4, 0x31, 0x60, + 0x08, 0xcb, 0xec, 0xc5, 0x30, 0x04, 0x0f, 0xdf, 0x3d, 0x88, 0x67, 0xe6, 0xdc, 0x8b, 0x1c, 0xbe, + 0x47, 0xf0, 0x78, 0xf8, 0x1e, 0x81, 0xa1, 0xdd, 0xe9, 0xc1, 0x54, 0xba, 0x62, 0x30, 0x11, 0x29, + 0x2b, 0x11, 0xbb, 0x33, 0x4a, 0x80, 0x76, 0x67, 0x14, 0x18, 0x6a, 0x92, 0xb7, 0xdc, 0xae, 0x76, + 0x69, 0x52, 0xb0, 0xca, 0xc6, 0xca, 0xb0, 0xf5, 0x3b, 0x18, 0x1c, 0x53, 0x9b, 0xa6, 0xd6, 0xb2, + 0xa6, 0x26, 0x3d, 0xa9, 0x1b, 0xe1, 0xf5, 0xbb, 0x2b, 0x21, 0x5b, 0xbf, 0xbb, 0x22, 0xd9, 0xec, + 0xea, 0x6d, 0xb4, 0x56, 0x35, 0x9b, 0xea, 0x53, 0x86, 0x8d, 0x27, 0x8b, 0x9b, 0x7c, 0x6b, 0xf8, + 0x4e, 0x78, 0x76, 0xed, 0x41, 0xca, 0x66, 0xd7, 0x1e, 0x68, 0x66, 0xe4, 0x25, 0xa3, 0x55, 0xaa, + 0xe9, 0xca, 0x5a, 0xd8, 0xc8, 0xeb, 0x4e, 0xc9, 0x8c, 0xbc, 0xee, 0xd8, 0xee, 0x9f, 0x73, 0xd7, + 0x36, 0x5c, 0xaa, 0x34, 0x77, 0xf3, 0x39, 0x48, 0xda, 0xfd, 0x73, 0x10, 0xcd, 0x36, 0x84, 0xd1, + 0x0e, 0x69, 0x85, 0x37, 0x84, 0xf1, 0x6e, 0x88, 0x96, 0x60, 0x16, 0x8b, 0x78, 0xf5, 0xa8, 0x98, + 0x61, 0x8b, 0x45, 0x80, 0x99, 0xc5, 0x12, 0xbc, 0x8b, 0x0c, 0xbd, 0x75, 0x53, 0xac, 0xf0, 0x1a, + 0x2a, 0xe3, 0xd8, 0x1a, 0x1a, 0x7a, 0x17, 0xf7, 0xe1, 0xd0, 0x43, 0x0e, 0xa5, 0x1d, 0xb6, 0x3a, + 0x24, 0x14, 0xb3, 0x3a, 0xe4, 0x27, 0x1f, 0x65, 0x18, 0xc7, 0x5b, 0x70, 0xb5, 0xe3, 0xdf, 0xe3, + 0x7c, 0x3a, 0xfc, 0x99, 0x11, 0x34, 0xfb, 0xcc, 0x08, 0x28, 0xc4, 0x44, 0x4c, 0x5b, 0x76, 0x17, + 0x26, 0xc1, 0xf9, 0x60, 0x04, 0x44, 0xe6, 0x80, 0xd4, 0x4a, 0xf3, 0x73, 0x15, 0xbd, 0x2a, 0x5f, + 0x91, 0x39, 0xe1, 0x13, 0xd8, 0x38, 0xc5, 0x6c, 0x9f, 0x9a, 0x50, 0x8e, 0xbc, 0x03, 0x17, 0x05, + 0x54, 0x3c, 0xf8, 0xaf, 0xda, 0xd6, 0xba, 0xa1, 0xfb, 0x0b, 0x82, 0x1b, 0x76, 0x14, 0xec, 0x45, + 0x3b, 0xdb, 0xa7, 0xf6, 0xe4, 0xd5, 0xbd, 0x2e, 0xb1, 0x3e, 0x74, 0x76, 0x53, 0x97, 0xbf, 0x48, + 0xf4, 0xe4, 0xd5, 0xbd, 0x2e, 0x21, 0xf7, 0xf5, 0xdd, 0xd4, 0xe5, 0x77, 0x42, 0x4f, 0x5e, 0xc4, + 0x81, 0x42, 0x2f, 0x7c, 0xa9, 0xd9, 0x54, 0x36, 0xb0, 0xba, 0xa7, 0x76, 0x53, 0x5d, 0x09, 0x0d, + 0xce, 0x9d, 0x38, 0xb2, 0x59, 0x7a, 0xb1, 0x4d, 0xcd, 0x5a, 0x68, 0x01, 0xba, 0x1f, 0x9e, 0xa5, + 0x63, 0x04, 0x6c, 0x96, 0x8e, 0x01, 0xd9, 0x80, 0x92, 0xdf, 0x03, 0x29, 0x9b, 0xe1, 0x01, 0x25, + 0xe3, 0xd8, 0x80, 0x0a, 0xbd, 0x1d, 0x5a, 0x84, 0x53, 0x8b, 0x6b, 0xae, 0xe6, 0x59, 0x90, 0x8e, + 0xe8, 0xca, 0x77, 0x23, 0x97, 0x4c, 0x71, 0x12, 0xbc, 0x64, 0x8a, 0x83, 0xd9, 0x18, 0x61, 0xe0, + 0xda, 0xa6, 0xd9, 0x98, 0xd1, 0x8c, 0x66, 0xc7, 0xa6, 0xca, 0x5f, 0x09, 0x8f, 0x91, 0x08, 0x9a, + 0x8d, 0x91, 0x08, 0x88, 0x2d, 0xd0, 0x0c, 0x54, 0x72, 0x1c, 0x63, 0xc5, 0x14, 0xfb, 0xca, 0x4e, + 0xd3, 0x55, 0xfe, 0xa3, 0xf0, 0x02, 0x9d, 0x44, 0xc3, 0x16, 0xe8, 0x24, 0x38, 0x9e, 0x3a, 0xb1, + 0x5e, 0x60, 0x8b, 0x87, 0x7c, 0x57, 0xf9, 0x1f, 0x47, 0x4e, 0x9d, 0x12, 0x68, 0xf0, 0xd4, 0x29, + 0x01, 0xce, 0xd6, 0x47, 0x6e, 0x93, 0xcd, 0x19, 0xfe, 0x5d, 0xf5, 0x7f, 0x12, 0x5e, 0x1f, 0xa3, + 0x78, 0xb6, 0x3e, 0x46, 0x61, 0x61, 0x3e, 0xa2, 0x0b, 0xfe, 0xd3, 0x6e, 0x7c, 0x7c, 0xf9, 0xc7, + 0xca, 0x90, 0x1b, 0x32, 0x1f, 0x31, 0x52, 0xbe, 0x3d, 0xd5, 0x8d, 0x91, 0x3f, 0x3c, 0x62, 0x85, + 0xc2, 0x8c, 0x54, 0xba, 0x6e, 0xd0, 0x0d, 0xe5, 0x33, 0x5d, 0x19, 0x71, 0x82, 0x30, 0x23, 0x0e, + 0x23, 0x6f, 0xc3, 0xd9, 0x00, 0x36, 0x4f, 0x5b, 0xcb, 0xfe, 0xcc, 0xf4, 0x57, 0x53, 0x61, 0x33, + 0x38, 0x99, 0x8c, 0x99, 0xc1, 0xc9, 0x98, 0x24, 0xd6, 0x42, 0x74, 0xdf, 0xb1, 0x03, 0x6b, 0x5f, + 0x82, 0x5d, 0x18, 0x24, 0xb1, 0x16, 0xd2, 0xfc, 0xce, 0x1d, 0x58, 0xfb, 0x32, 0xed, 0xc2, 0x80, + 0x7c, 0x6f, 0x0a, 0x2e, 0x25, 0xa3, 0x4a, 0xcd, 0xe6, 0x8c, 0x65, 0x07, 0x38, 0xe5, 0xaf, 0xa5, + 0xc2, 0x07, 0x0d, 0xbb, 0x2b, 0x36, 0xdb, 0xa7, 0xee, 0xb2, 0x02, 0xf2, 0x31, 0x18, 0x2d, 0x75, + 0x74, 0xc3, 0xc5, 0x8b, 0x37, 0x66, 0x38, 0x7f, 0x57, 0x2a, 0xb2, 0xc5, 0x91, 0xb1, 0xb8, 0xc5, + 0x91, 0x01, 0xe4, 0x26, 0x4c, 0xd4, 0x68, 0xa3, 0x83, 0xf1, 0x26, 0x68, 0xdb, 0xb2, 0x5d, 0xc6, + 0xe3, 0xbb, 0x53, 0xe1, 0x49, 0x2c, 0x46, 0xc1, 0x26, 0xb1, 0x18, 0x90, 0xdc, 0x89, 0xdd, 0xca, + 0x8b, 0xce, 0xfc, 0x9e, 0x54, 0xcf, 0x6b, 0x79, 0xbf, 0x2f, 0x93, 0x8b, 0x93, 0x6a, 0xe4, 0x16, + 0x5d, 0x70, 0xfd, 0xde, 0x54, 0x8f, 0x6b, 0x74, 0x69, 0x86, 0x8b, 0x83, 0x19, 0xc7, 0xd0, 0xdd, + 0xb5, 0xe0, 0xf8, 0xd7, 0x53, 0x3d, 0xae, 0xbd, 0x03, 0x8e, 0x09, 0x60, 0xf2, 0x12, 0xf7, 0x14, + 0x11, 0x8c, 0xfe, 0x46, 0x2a, 0xee, 0x2a, 0xe2, 0x97, 0x97, 0x08, 0x59, 0xb1, 0xdb, 0x8e, 0xaf, + 0xf4, 0x9f, 0x4d, 0xc5, 0x7d, 0xf3, 0x82, 0x62, 0xc1, 0x2f, 0x42, 0xe1, 0xc2, 0xf4, 0x7d, 0x97, + 0xda, 0xa6, 0xd6, 0xc4, 0xee, 0xac, 0xb9, 0x96, 0xad, 0xad, 0xd0, 0x69, 0x53, 0x5b, 0x6e, 0x52, + 0xe5, 0xfb, 0x52, 0x61, 0x0b, 0xb6, 0x3b, 0x29, 0xb3, 0x60, 0xbb, 0x63, 0xc9, 0x2a, 0x3c, 0x94, + 0x84, 0x9d, 0x32, 0x1c, 0xac, 0xe7, 0xfb, 0x53, 0x61, 0x13, 0xb6, 0x07, 0x2d, 0x33, 0x61, 0x7b, + 0xa0, 0xc9, 0x75, 0x18, 0x9a, 0xb4, 0xbc, 0xe9, 0xf7, 0x07, 0x22, 0xce, 0x90, 0x3e, 0x66, 0xb6, + 0x4f, 0x0d, 0xc8, 0x44, 0x19, 0x31, 0xa8, 0x3f, 0x17, 0x2f, 0x13, 0x5c, 0x3e, 0xf9, 0x3f, 0x44, + 0x19, 0x21, 0xee, 0xff, 0x2c, 0x5e, 0x26, 0xb8, 0xe3, 0xf2, 0x7f, 0xb0, 0x99, 0x84, 0xd7, 0x38, + 0x3f, 0x53, 0x62, 0x76, 0x5b, 0x79, 0x55, 0x6b, 0x36, 0xa9, 0xb9, 0x42, 0x95, 0xcf, 0x47, 0x66, + 0x92, 0x64, 0x32, 0x36, 0x93, 0x24, 0x63, 0xc8, 0xb7, 0xc0, 0xb9, 0x3b, 0x5a, 0xd3, 0xd0, 0x03, + 0x9c, 0x97, 0x11, 0x5f, 0xf9, 0xc1, 0x54, 0x78, 0x37, 0xdd, 0x85, 0x8e, 0xed, 0xa6, 0xbb, 0xa0, + 0xc8, 0x3c, 0x10, 0x5c, 0x46, 0xfd, 0xd9, 0x82, 0xad, 0xcf, 0xca, 0x7f, 0x9e, 0x0a, 0xdb, 0xa9, + 0x71, 0x12, 0x66, 0xa7, 0xc6, 0xa1, 0xa4, 0xde, 0x3d, 0x33, 0x8d, 0xf2, 0x43, 0xa9, 0xf0, 0x69, + 0x4d, 0x37, 0xc2, 0xd9, 0x3e, 0xb5, 0x7b, 0x7a, 0x9b, 0x1b, 0x90, 0xaf, 0x55, 0x2b, 0x33, 0x33, + 0xd3, 0xb5, 0x3b, 0x95, 0x29, 0x7c, 0xaa, 0xa1, 0x2b, 0x3f, 0x1c, 0x59, 0xb1, 0xa2, 0x04, 0x6c, + 0xc5, 0x8a, 0xc2, 0xc8, 0x6b, 0x30, 0xc2, 0xda, 0xcf, 0x06, 0x0c, 0x7e, 0xf2, 0x17, 0x52, 0x61, + 0x73, 0x4a, 0x46, 0x32, 0x73, 0x4a, 0xfe, 0x4d, 0x6a, 0x70, 0x9a, 0x49, 0xb1, 0x6a, 0xd3, 0x7b, + 0xd4, 0xa6, 0x66, 0xc3, 0x1b, 0xd3, 0x3f, 0x92, 0x0a, 0x5b, 0x19, 0x49, 0x44, 0xcc, 0xca, 0x48, + 0x82, 0x93, 0x35, 0xb8, 0x18, 0x3d, 0x09, 0x92, 0xdf, 0xf5, 0x2a, 0x7f, 0x33, 0x15, 0x31, 0x86, + 0x7b, 0x10, 0xa3, 0x31, 0xdc, 0x03, 0x4f, 0x4c, 0x78, 0x58, 0x1c, 0xab, 0x08, 0x87, 0xcb, 0x68, + 0x6d, 0x3f, 0xca, 0x6b, 0x7b, 0x32, 0x70, 0x08, 0xec, 0x41, 0x3d, 0xdb, 0xa7, 0xf6, 0x66, 0xc7, + 0xf4, 0x2c, 0x9e, 0x7f, 0x45, 0xf9, 0xb1, 0x54, 0xb2, 0x47, 0x4a, 0xc8, 0x4d, 0x39, 0x29, 0x71, + 0xcb, 0xdb, 0xdd, 0xb2, 0x87, 0x28, 0x7f, 0x2b, 0x32, 0xde, 0x92, 0xc9, 0xd8, 0x78, 0xeb, 0x92, + 0x7e, 0xe4, 0x26, 0x4c, 0x70, 0xa5, 0xae, 0x6a, 0x38, 0x0c, 0xcd, 0x15, 0xaa, 0x2b, 0x7f, 0x3b, + 0xb2, 0xda, 0xc5, 0x28, 0xd0, 0xb5, 0x27, 0x0a, 0x64, 0x53, 0x77, 0xad, 0xad, 0x99, 0x26, 0x1e, + 0xb3, 0x2a, 0xff, 0x45, 0x64, 0xea, 0x0e, 0x50, 0xe8, 0xb8, 0xeb, 0xff, 0x62, 0x9a, 0xd0, 0x2b, + 0xf3, 0x96, 0xf2, 0x5f, 0x46, 0x34, 0xa1, 0x17, 0x31, 0xd3, 0x84, 0x9e, 0x69, 0xbc, 0xee, 0x74, + 0x79, 0x63, 0xaf, 0x7c, 0x31, 0xb2, 0x22, 0x27, 0x52, 0xb1, 0x15, 0x39, 0xf9, 0x89, 0xfe, 0x9d, + 0x2e, 0xef, 0xd3, 0x95, 0x1f, 0xef, 0xcd, 0x37, 0x58, 0xe9, 0x93, 0x9f, 0xb7, 0xdf, 0xe9, 0xf2, + 0xb6, 0x5b, 0xf9, 0x3b, 0xbd, 0xf9, 0x06, 0x8e, 0x7d, 0xc9, 0x4f, 0xc3, 0xeb, 0xdd, 0xdf, 0x45, + 0x2b, 0x7f, 0x37, 0x3a, 0x75, 0x75, 0x21, 0xc4, 0xa9, 0xab, 0xdb, 0xe3, 0xea, 0x65, 0x38, 0xcf, + 0x35, 0xe4, 0x86, 0xad, 0xb5, 0x57, 0x6b, 0xd4, 0x75, 0x0d, 0x73, 0xc5, 0xdb, 0x89, 0xfd, 0x57, + 0xa9, 0xc8, 0xf1, 0x58, 0x37, 0x4a, 0x3c, 0x1e, 0xeb, 0x86, 0x64, 0xca, 0x1b, 0x7b, 0x01, 0xad, + 0xfc, 0xbd, 0x88, 0xf2, 0xc6, 0x28, 0x98, 0xf2, 0xc6, 0x1f, 0x4e, 0xdf, 0x4c, 0x78, 0xe8, 0xab, + 0xfc, 0xd7, 0xdd, 0x79, 0xf9, 0xed, 0x4b, 0x78, 0x1f, 0x7c, 0x33, 0xe1, 0x3d, 0xab, 0xf2, 0xdf, + 0x74, 0xe7, 0x15, 0xf8, 0x20, 0xc5, 0x9f, 0xc1, 0xbe, 0x0d, 0x67, 0xf9, 0x6c, 0x3e, 0x43, 0x75, + 0x1a, 0xfa, 0xd0, 0x9f, 0x88, 0x8c, 0xfd, 0x64, 0x32, 0x3c, 0x72, 0x4f, 0xc4, 0x24, 0xb1, 0x16, + 0x6d, 0xfd, 0xfb, 0x3b, 0xb0, 0x0e, 0x36, 0x04, 0xc9, 0x18, 0xb6, 0xde, 0xc8, 0xaf, 0xdf, 0x94, + 0x9f, 0x8c, 0xac, 0x37, 0x32, 0x12, 0xdd, 0x39, 0xe4, 0xa7, 0x72, 0xaf, 0x85, 0x5f, 0x7a, 0x29, + 0x3f, 0x95, 0x58, 0xd8, 0xef, 0x80, 0xf0, 0xb3, 0xb0, 0xd7, 0xc2, 0xaf, 0x9a, 0x94, 0x2f, 0x25, + 0x16, 0xf6, 0x3f, 0x20, 0xfc, 0x04, 0x8a, 0x6d, 0x91, 0x3a, 0xae, 0xc5, 0x59, 0x85, 0xa6, 0x87, + 0x7f, 0x10, 0xdd, 0x22, 0x25, 0x92, 0xe1, 0x16, 0x29, 0x11, 0x93, 0xc4, 0x5a, 0x7c, 0xde, 0x4f, + 0xef, 0xc0, 0x5a, 0xda, 0xd8, 0x25, 0x62, 0x92, 0x58, 0x8b, 0x8f, 0xff, 0xf2, 0x0e, 0xac, 0xa5, + 0x8d, 0x5d, 0x22, 0x86, 0x99, 0x63, 0x01, 0xe6, 0x0e, 0xb5, 0x9d, 0x40, 0xfd, 0xfe, 0xdb, 0x88, + 0x39, 0xd6, 0x85, 0x8e, 0x99, 0x63, 0x5d, 0x50, 0x89, 0xdc, 0x85, 0x50, 0x7e, 0x66, 0x27, 0xee, + 0xc1, 0xbd, 0x4c, 0x17, 0x54, 0x22, 0x77, 0x21, 0x97, 0x9f, 0xdd, 0x89, 0x7b, 0x70, 0x31, 0xd3, + 0x05, 0xc5, 0x8c, 0xa2, 0x9a, 0xab, 0xb9, 0x46, 0x63, 0xd6, 0x72, 0x5c, 0x69, 0x91, 0xff, 0xef, + 0x22, 0x46, 0x51, 0x12, 0x11, 0x33, 0x8a, 0x92, 0xe0, 0x71, 0xa6, 0x42, 0x1a, 0x5f, 0xe9, 0xc9, + 0x34, 0xb0, 0xb4, 0x92, 0xe0, 0x71, 0xa6, 0x42, 0x08, 0xff, 0x7d, 0x4f, 0xa6, 0x81, 0xa7, 0x7c, + 0x12, 0x9c, 0x59, 0xa6, 0x65, 0xdb, 0xda, 0x30, 0x6f, 0xd2, 0x0d, 0xda, 0x14, 0x9f, 0xfe, 0x73, + 0x11, 0xcb, 0x34, 0x4a, 0x80, 0xb7, 0x28, 0x11, 0x58, 0x98, 0x91, 0xf8, 0xdc, 0x9f, 0xef, 0xca, + 0x28, 0x38, 0x26, 0x8a, 0xc2, 0xc2, 0x8c, 0xc4, 0x27, 0xfe, 0x42, 0x57, 0x46, 0xc1, 0x31, 0x51, + 0x14, 0x46, 0x4a, 0x30, 0x86, 0x6f, 0x25, 0x34, 0xc7, 0xf3, 0xfc, 0xfc, 0x95, 0x54, 0xf8, 0xd6, + 0x2b, 0x8c, 0x9e, 0xed, 0x53, 0x23, 0x05, 0x64, 0x16, 0xe2, 0x93, 0xbe, 0xda, 0x85, 0x45, 0xe0, + 0xef, 0x18, 0x86, 0xc8, 0x2c, 0xc4, 0xc7, 0xfc, 0xc3, 0x2e, 0x2c, 0x02, 0x87, 0xc7, 0x30, 0x84, + 0x7c, 0x04, 0x86, 0x6b, 0x33, 0x4b, 0x55, 0x2f, 0x3b, 0xe4, 0x3f, 0x4a, 0x45, 0x5e, 0x15, 0x05, + 0x38, 0x7c, 0x55, 0x14, 0xfc, 0x24, 0x1f, 0x83, 0xd1, 0xb2, 0x65, 0xba, 0x5a, 0xc3, 0xdb, 0x80, + 0xfe, 0x6a, 0xe4, 0x0c, 0x25, 0x84, 0x9d, 0xed, 0x53, 0xc3, 0xe4, 0x52, 0x79, 0xd1, 0xf6, 0x5f, + 0x4b, 0x2e, 0xef, 0x37, 0x3d, 0x4c, 0xce, 0x66, 0xb4, 0xbb, 0x96, 0xbd, 0xd6, 0xb4, 0x34, 0xdd, + 0x0b, 0x48, 0x2a, 0x1a, 0xf2, 0x8f, 0x23, 0x33, 0x5a, 0x32, 0x19, 0x9b, 0xd1, 0x92, 0x31, 0x49, + 0xac, 0x45, 0x17, 0xfd, 0xfa, 0x0e, 0xac, 0x83, 0x79, 0x38, 0x19, 0x93, 0xc4, 0x5a, 0x7c, 0xfe, + 0x3f, 0xd9, 0x81, 0x75, 0x30, 0x0f, 0x27, 0x63, 0x98, 0x69, 0x7d, 0xc3, 0x70, 0xbd, 0x87, 0x6d, + 0xbf, 0x11, 0x31, 0xad, 0x03, 0x14, 0x33, 0xad, 0x83, 0x5f, 0x84, 0xc2, 0x05, 0xff, 0xa9, 0x64, + 0xb0, 0x77, 0xad, 0x98, 0xeb, 0x6c, 0x7f, 0xac, 0xfc, 0xd3, 0xc8, 0xa9, 0x48, 0x77, 0xd2, 0xd9, + 0x3e, 0xb5, 0x07, 0x23, 0x52, 0x8d, 0xf8, 0x29, 0xf2, 0xa0, 0x7e, 0xca, 0x3f, 0x4b, 0xf5, 0x70, + 0x54, 0xe4, 0x34, 0x31, 0x47, 0x45, 0x0e, 0x16, 0x73, 0xd6, 0x72, 0x93, 0xde, 0x5e, 0xa8, 0xbc, + 0x25, 0xcd, 0xae, 0x5f, 0x8b, 0xcf, 0x59, 0x31, 0x22, 0x31, 0x67, 0xc5, 0xe0, 0xe4, 0x3b, 0x52, + 0xf0, 0x44, 0x54, 0xbe, 0x6f, 0xbd, 0xf4, 0xdc, 0x2b, 0x2a, 0x5d, 0xb7, 0x1a, 0xb2, 0x65, 0xf5, + 0x9b, 0xbc, 0x96, 0x67, 0xba, 0x75, 0x57, 0x52, 0xa1, 0xd9, 0x3e, 0x75, 0x57, 0xcc, 0x77, 0xd1, + 0x0a, 0xa1, 0x34, 0xbf, 0xb5, 0xa7, 0x56, 0xf8, 0x2a, 0xb4, 0x2b, 0xe6, 0xbb, 0x68, 0x85, 0x18, + 0x15, 0x5f, 0xdf, 0x53, 0x2b, 0xfc, 0x31, 0xb2, 0x2b, 0xe6, 0xb8, 0xfb, 0xbc, 0x5b, 0xab, 0x94, + 0x7d, 0x5f, 0x9f, 0x4d, 0xb3, 0xa1, 0xfc, 0x76, 0x74, 0xf7, 0x19, 0xa5, 0xc0, 0xdd, 0x67, 0x14, + 0xc8, 0x96, 0xfb, 0x59, 0xaa, 0x35, 0xd9, 0x76, 0x94, 0x36, 0xd6, 0x42, 0xc6, 0xdb, 0xef, 0x44, + 0x96, 0xfb, 0x2e, 0x74, 0x6c, 0xb9, 0xef, 0x82, 0x4a, 0xe4, 0x2e, 0x24, 0xf4, 0xbb, 0x3b, 0x71, + 0x0f, 0x4c, 0x95, 0x2e, 0xa8, 0x44, 0xee, 0x42, 0x0b, 0xfe, 0x87, 0x9d, 0xb8, 0x07, 0xa6, 0x4a, + 0x17, 0x14, 0xf9, 0x81, 0x14, 0x5c, 0x4e, 0xea, 0x0e, 0x1e, 0xfb, 0x63, 0x71, 0x9d, 0xda, 0xb6, + 0xa1, 0x7b, 0x17, 0xc8, 0xbf, 0xc7, 0xeb, 0x7b, 0xae, 0x57, 0x7f, 0x27, 0x15, 0x9c, 0xed, 0x53, + 0x77, 0x5d, 0xc9, 0x2e, 0x5b, 0x24, 0x24, 0xf0, 0x8d, 0x3d, 0xb7, 0xc8, 0x17, 0xc9, 0xae, 0x2b, + 0xc1, 0x09, 0xc7, 0x58, 0x71, 0x5c, 0xcb, 0xa6, 0x55, 0xab, 0x69, 0x34, 0xbc, 0xf5, 0xe6, 0xf7, + 0xa3, 0x13, 0x4e, 0x02, 0x11, 0x4e, 0x38, 0x09, 0xf0, 0x38, 0x53, 0xa1, 0x31, 0xff, 0xbc, 0x27, + 0x53, 0xc9, 0x9c, 0x4b, 0x80, 0xc7, 0x99, 0x0a, 0x31, 0xfd, 0x8b, 0x9e, 0x4c, 0x25, 0x73, 0x2e, + 0x01, 0x4e, 0x4c, 0x78, 0x38, 0x30, 0x74, 0x4b, 0x2b, 0xd4, 0x74, 0x55, 0xab, 0xd9, 0xb4, 0x3a, + 0xee, 0x92, 0x6d, 0xac, 0xac, 0x50, 0x5b, 0xf9, 0x83, 0xc8, 0x01, 0x59, 0x4f, 0xea, 0xd9, 0x3e, + 0xb5, 0x37, 0x3b, 0xe2, 0x42, 0x21, 0x99, 0x60, 0xc6, 0xb2, 0x1b, 0x74, 0xca, 0x32, 0xa9, 0xf2, + 0x87, 0xa9, 0xf0, 0xf5, 0xf4, 0x0e, 0xf4, 0xb3, 0x7d, 0xea, 0x4e, 0x2c, 0xc9, 0xa7, 0xe1, 0x91, + 0x64, 0x12, 0xf6, 0xdf, 0xb2, 0xd6, 0x58, 0x53, 0xfe, 0xc7, 0x54, 0xd8, 0xe7, 0xaf, 0x37, 0xf9, + 0x6c, 0x9f, 0xba, 0x03, 0x43, 0x32, 0x05, 0xe3, 0xf3, 0xe5, 0x6a, 0xe8, 0x41, 0xc7, 0x1f, 0xa5, + 0x22, 0xcf, 0xaf, 0xc2, 0x78, 0x7c, 0x7e, 0x15, 0x06, 0x31, 0x7b, 0x2a, 0x00, 0x4d, 0x9b, 0xba, + 0xf2, 0x3f, 0x45, 0xec, 0xa9, 0x10, 0x16, 0xfd, 0x4b, 0x65, 0x00, 0x9b, 0x67, 0x03, 0x80, 0x77, + 0x2f, 0xff, 0x2f, 0x23, 0xf3, 0x6c, 0x8c, 0x82, 0xcd, 0xb3, 0x31, 0x20, 0xb3, 0x72, 0x02, 0xe0, + 0x82, 0x25, 0x5c, 0x7e, 0x0d, 0xcb, 0x54, 0xfe, 0x38, 0x62, 0xe5, 0x24, 0x93, 0x31, 0x2b, 0x27, + 0x19, 0xc3, 0x54, 0x7b, 0xd2, 0xea, 0x98, 0xfa, 0x2d, 0xba, 0xd9, 0xd6, 0x0c, 0xdb, 0x7b, 0x87, + 0xa4, 0xfc, 0x49, 0x44, 0xb5, 0x93, 0x88, 0x98, 0x6a, 0x27, 0xc1, 0x63, 0x4c, 0x2d, 0x97, 0xb7, + 0xf6, 0x5f, 0xf5, 0x62, 0x2a, 0x88, 0x62, 0x4c, 0x05, 0x9c, 0x7c, 0x36, 0x05, 0x4f, 0xc9, 0x88, + 0x9b, 0x96, 0x61, 0xa2, 0x07, 0xf6, 0x1d, 0x6a, 0xfb, 0xdf, 0x33, 0xa3, 0x19, 0x4d, 0xaa, 0x2b, + 0x5b, 0xbc, 0xa2, 0x6b, 0x49, 0x15, 0xf5, 0x28, 0x37, 0xdb, 0xa7, 0xee, 0xb6, 0x8a, 0xc9, 0x01, + 0xe8, 0x47, 0xd7, 0x87, 0x9b, 0xb9, 0xc1, 0x5f, 0x4c, 0xe5, 0x7f, 0x29, 0x75, 0x33, 0x37, 0xf8, + 0x4b, 0xa9, 0xfc, 0x2f, 0xb3, 0xff, 0x7f, 0x39, 0x95, 0xff, 0x95, 0x94, 0x7a, 0x3e, 0xa2, 0xa6, + 0xd5, 0xa6, 0x26, 0xec, 0x91, 0x44, 0x14, 0xff, 0x99, 0x88, 0x12, 0x99, 0x93, 0xbf, 0x98, 0x82, + 0x91, 0x9a, 0x6b, 0x53, 0xad, 0x25, 0x42, 0x6d, 0x5f, 0x80, 0x41, 0xfe, 0x58, 0xd1, 0x8b, 0x0d, + 0xa5, 0xfa, 0xbf, 0xc9, 0x25, 0x18, 0x9b, 0xd3, 0x1c, 0x17, 0x9b, 0x58, 0x31, 0x75, 0x7a, 0x1f, + 0x03, 0x75, 0x64, 0xd4, 0x08, 0x94, 0xcc, 0x71, 0x3a, 0x5e, 0x0e, 0x73, 0x4f, 0x64, 0x76, 0x8c, + 0x30, 0x3d, 0xf8, 0xb5, 0xad, 0x42, 0x1f, 0x06, 0x94, 0x8e, 0x94, 0x2d, 0x7e, 0x3d, 0x05, 0xb1, + 0x67, 0x94, 0xfb, 0x0f, 0x29, 0xb7, 0x08, 0xe3, 0x91, 0x7c, 0x27, 0x22, 0xda, 0xc8, 0x2e, 0xd3, + 0xa1, 0x44, 0x4b, 0x93, 0xa7, 0xfc, 0x28, 0x17, 0xb7, 0xd5, 0x39, 0x11, 0x3d, 0x1c, 0xb3, 0x02, + 0x76, 0xec, 0xa6, 0x2a, 0xa1, 0x44, 0x74, 0xd8, 0x6f, 0xe6, 0x83, 0x64, 0x0e, 0xe4, 0x92, 0x88, + 0x6f, 0x27, 0x25, 0x36, 0xe8, 0x38, 0xd4, 0x96, 0x63, 0x8e, 0x63, 0x3c, 0xbb, 0x8f, 0xc1, 0x48, + 0xa5, 0xd5, 0xa6, 0xb6, 0x63, 0x99, 0x9a, 0x6b, 0xd9, 0x22, 0xfe, 0x16, 0x46, 0xca, 0x32, 0x24, + 0xb8, 0x1c, 0x29, 0x4b, 0xa6, 0x27, 0x57, 0xbc, 0xc4, 0xe6, 0x19, 0x4c, 0xa3, 0x81, 0x31, 0x68, + 0x30, 0xb1, 0xb9, 0x1c, 0xcc, 0x0c, 0x29, 0x18, 0xe9, 0x6d, 0x47, 0xc3, 0x78, 0x28, 0x3e, 0x69, + 0x87, 0x01, 0x64, 0x52, 0xa4, 0x20, 0xcf, 0x40, 0x0e, 0x37, 0x12, 0x8e, 0xd2, 0x8f, 0xb4, 0x18, + 0x24, 0xad, 0x89, 0x10, 0x39, 0xe6, 0x1a, 0xa7, 0x21, 0xb7, 0x20, 0x1f, 0x38, 0xc7, 0xde, 0xb0, + 0xad, 0x4e, 0xdb, 0x4b, 0x51, 0x5a, 0xd8, 0xde, 0x2a, 0x3c, 0xb4, 0xe6, 0xe3, 0xea, 0x2b, 0x88, + 0x94, 0x58, 0xc4, 0x0a, 0x92, 0x59, 0x18, 0x0f, 0x60, 0x4c, 0x44, 0x5e, 0x6a, 0x64, 0x8c, 0xef, + 0x25, 0xf1, 0x62, 0xe2, 0x94, 0x59, 0x45, 0x8b, 0x91, 0x0a, 0x0c, 0x78, 0x61, 0xd0, 0x07, 0x77, + 0x54, 0xd2, 0x53, 0x22, 0x0c, 0xfa, 0x80, 0x1c, 0x00, 0xdd, 0x2b, 0x4f, 0x66, 0x60, 0x4c, 0xb5, + 0x3a, 0x2e, 0x5d, 0xb2, 0xc4, 0xad, 0x92, 0x08, 0xb7, 0x8f, 0x6d, 0xb2, 0x19, 0xa6, 0xee, 0x5a, + 0xf5, 0x06, 0xc7, 0xc9, 0x31, 0xc7, 0xc2, 0xa5, 0xc8, 0x02, 0x4c, 0xc4, 0xdc, 0x88, 0x31, 0x7c, + 0xca, 0x10, 0x0f, 0x68, 0x2d, 0x7d, 0x5e, 0x9c, 0x59, 0xbc, 0x28, 0xf9, 0xae, 0x14, 0xe4, 0x96, + 0x6c, 0xcd, 0x70, 0x1d, 0x11, 0x4a, 0xe5, 0xcc, 0xd5, 0x0d, 0x5b, 0x6b, 0x33, 0xfd, 0xb8, 0x8a, + 0x79, 0x52, 0xee, 0x68, 0xcd, 0x0e, 0x75, 0x26, 0xef, 0xb2, 0xaf, 0xfb, 0x97, 0x5b, 0x85, 0xd7, + 0x78, 0xdc, 0xbc, 0xab, 0x0d, 0xab, 0x75, 0x6d, 0xc5, 0xd6, 0xd6, 0x0d, 0x3e, 0x59, 0x6a, 0xcd, + 0x6b, 0x2e, 0x6d, 0xa2, 0x4f, 0xc4, 0x35, 0xad, 0x6d, 0x5c, 0xc3, 0x7c, 0x5c, 0xd7, 0x7c, 0x4e, + 0xbc, 0x06, 0xa6, 0x02, 0x2e, 0xfe, 0x25, 0xab, 0x00, 0xc7, 0x91, 0x05, 0x00, 0xf1, 0xa9, 0xa5, + 0x76, 0x5b, 0xc4, 0x65, 0x91, 0x3c, 0x09, 0x3c, 0x0c, 0x57, 0x6c, 0x5f, 0x60, 0x5a, 0x5b, 0xca, + 0x41, 0xa3, 0x4a, 0x1c, 0x98, 0x16, 0x2c, 0x89, 0x16, 0x79, 0x62, 0x1a, 0x95, 0xa2, 0xbc, 0x09, + 0x54, 0x82, 0x90, 0xa2, 0xc5, 0xc8, 0x32, 0x8c, 0x0b, 0xbe, 0x7e, 0xc6, 0xca, 0xb1, 0xf0, 0xac, + 0x10, 0x41, 0x73, 0xa5, 0xf5, 0xdb, 0xa8, 0x0b, 0xb0, 0x5c, 0x47, 0xa4, 0x04, 0x99, 0x84, 0x51, + 0xef, 0xef, 0x05, 0xad, 0x45, 0x1d, 0x65, 0x1c, 0x35, 0x16, 0x13, 0x8e, 0x78, 0xe5, 0x31, 0x23, + 0x80, 0x2c, 0xba, 0x70, 0x11, 0x99, 0x07, 0xd7, 0xfa, 0x7c, 0x02, 0x8f, 0xa8, 0xce, 0x87, 0x8b, + 0x90, 0x32, 0x8c, 0xfa, 0xcf, 0xc2, 0x6f, 0xdf, 0xae, 0x4c, 0x61, 0xe0, 0x17, 0x91, 0x14, 0x22, + 0x92, 0x53, 0x52, 0x66, 0x12, 0x2a, 0x23, 0x45, 0x03, 0xe4, 0x91, 0x60, 0x22, 0xd1, 0x00, 0xdb, + 0x09, 0xd1, 0x00, 0xab, 0xe4, 0xa3, 0x30, 0x5c, 0xba, 0x5b, 0x13, 0x51, 0x0e, 0x1d, 0xe5, 0x54, + 0x90, 0xa0, 0x18, 0x43, 0x2b, 0x8a, 0x88, 0x88, 0x72, 0xd3, 0x65, 0x7a, 0x32, 0x0d, 0x63, 0xa1, + 0x33, 0x06, 0x47, 0x39, 0x8d, 0x1c, 0xb0, 0xe5, 0x1a, 0x62, 0xea, 0xb6, 0x40, 0xc9, 0xc3, 0x2b, + 0x5c, 0x88, 0x69, 0xcd, 0x94, 0xe1, 0x60, 0xb2, 0x57, 0x95, 0x62, 0x40, 0x45, 0x0c, 0x23, 0x33, + 0xc8, 0xb5, 0x46, 0x17, 0xa8, 0xba, 0xcd, 0x71, 0x72, 0x8f, 0x46, 0x8a, 0x91, 0x77, 0x80, 0x60, + 0x7a, 0x58, 0xaa, 0x7b, 0x3b, 0xd8, 0xca, 0x94, 0xa3, 0x9c, 0xc5, 0x7c, 0x51, 0x24, 0x1a, 0xff, + 0xac, 0x32, 0x35, 0x79, 0x49, 0x4c, 0x1f, 0x8f, 0x68, 0xbc, 0x54, 0xdd, 0x8b, 0x7d, 0x56, 0x37, + 0x74, 0xb9, 0xc5, 0x09, 0x5c, 0xc9, 0x06, 0x9c, 0xab, 0xda, 0x74, 0xdd, 0xb0, 0x3a, 0x8e, 0xb7, + 0x7c, 0x78, 0xf3, 0xd6, 0xb9, 0x1d, 0xe7, 0xad, 0xc7, 0x44, 0xc5, 0x67, 0xda, 0x36, 0x5d, 0xaf, + 0x7b, 0x59, 0x82, 0x42, 0x69, 0x1c, 0xba, 0x71, 0x67, 0xe2, 0xc2, 0x60, 0x92, 0x02, 0x6e, 0x50, + 0x47, 0x51, 0x82, 0xa9, 0x96, 0x87, 0xee, 0x34, 0x7c, 0x9c, 0x2c, 0xae, 0x48, 0x31, 0xa2, 0x02, + 0xb9, 0x51, 0xf6, 0x9c, 0x4e, 0x4b, 0x8d, 0x86, 0xd5, 0x31, 0x5d, 0x47, 0x39, 0x8f, 0xcc, 0x8a, + 0x4c, 0x2c, 0x2b, 0x0d, 0x3f, 0x63, 0x58, 0x5d, 0x13, 0x78, 0x59, 0x2c, 0xf1, 0xd2, 0x64, 0x0e, + 0xf2, 0x55, 0x1b, 0xaf, 0xc0, 0x6f, 0xd1, 0x4d, 0xbe, 0x15, 0xc2, 0x68, 0x36, 0x62, 0xaa, 0x6c, + 0x73, 0x1c, 0x26, 0xf2, 0x69, 0x23, 0x56, 0x5e, 0x56, 0xa2, 0x25, 0xe5, 0x1c, 0x35, 0x0f, 0xed, + 0x2e, 0x47, 0x0d, 0x85, 0xbc, 0x70, 0x59, 0xbd, 0xef, 0x52, 0x93, 0x2d, 0xf5, 0x8e, 0x88, 0x5c, + 0xa3, 0x44, 0x5c, 0x5c, 0x7d, 0x3c, 0x9f, 0x3a, 0xc4, 0x28, 0xa3, 0x3e, 0x58, 0x6e, 0x58, 0xb4, + 0x48, 0x3c, 0x91, 0xcb, 0xc3, 0xfb, 0x48, 0xe4, 0xf2, 0x7f, 0x64, 0xe4, 0xf9, 0x97, 0x5c, 0x84, + 0xac, 0x94, 0x85, 0x16, 0xb3, 0x54, 0x60, 0xc6, 0xae, 0xac, 0x48, 0xbe, 0x33, 0x24, 0x6c, 0x17, + 0x3f, 0xde, 0xe7, 0xd8, 0xf6, 0x56, 0x01, 0x82, 0xcc, 0x05, 0x6a, 0x40, 0x80, 0x29, 0xdf, 0x3b, + 0xcb, 0x4d, 0xa3, 0x81, 0x79, 0xdc, 0x32, 0x52, 0x7c, 0x3c, 0x84, 0xf2, 0x34, 0x6e, 0x12, 0x09, + 0xb9, 0x0e, 0xc3, 0x9e, 0xeb, 0x45, 0x90, 0xa5, 0x05, 0xd3, 0x7b, 0x89, 0xd9, 0x5a, 0x64, 0x0f, + 0x93, 0x88, 0xc8, 0xab, 0x00, 0xc1, 0x74, 0x20, 0x2c, 0x2d, 0x5c, 0x2a, 0xe4, 0xd9, 0x43, 0x5e, + 0x2a, 0x02, 0x6a, 0x36, 0x71, 0xca, 0xea, 0xb8, 0x29, 0x92, 0xb7, 0xe0, 0xc4, 0x19, 0xd2, 0x61, + 0x59, 0x41, 0xc2, 0x45, 0xc8, 0x22, 0x4c, 0xc4, 0x34, 0x50, 0xe4, 0x74, 0x79, 0x6c, 0x7b, 0xab, + 0xf0, 0x70, 0x82, 0xfa, 0xca, 0x0b, 0x73, 0xac, 0x2c, 0x79, 0x1c, 0x32, 0xb7, 0xd5, 0x8a, 0xc8, + 0x2b, 0xc1, 0x53, 0x92, 0x84, 0xa2, 0xba, 0x32, 0x2c, 0x79, 0x05, 0x80, 0x67, 0xb5, 0xac, 0x5a, + 0xb6, 0x8b, 0x16, 0xc5, 0x28, 0x4f, 0xad, 0xc5, 0xb3, 0x5e, 0xd6, 0xd9, 0x32, 0x26, 0x7f, 0x74, + 0x40, 0x5c, 0xfc, 0xab, 0xe9, 0xd8, 0xb2, 0xc6, 0x04, 0x2f, 0x5a, 0x21, 0x75, 0x3e, 0x0a, 0xde, + 0x6b, 0x3a, 0x17, 0xbc, 0x44, 0x44, 0x2e, 0xc3, 0x60, 0x95, 0x4d, 0x2a, 0x0d, 0xab, 0x29, 0x54, + 0x01, 0x83, 0x0b, 0xb7, 0x05, 0x4c, 0xf5, 0xb1, 0xe4, 0x3a, 0xcf, 0x77, 0x64, 0x46, 0xb2, 0x3c, + 0x75, 0x04, 0x2c, 0x9a, 0xee, 0x88, 0xc1, 0x58, 0x99, 0x50, 0x9a, 0x68, 0x51, 0x26, 0x61, 0x49, + 0x0d, 0xd2, 0x42, 0xfb, 0x06, 0x6d, 0xff, 0x4e, 0x06, 0x6d, 0xf1, 0x57, 0x53, 0xf1, 0x21, 0x4a, + 0x5e, 0x8c, 0x27, 0x5c, 0xc1, 0xf5, 0xcb, 0x07, 0xca, 0xb5, 0xfa, 0xa9, 0x57, 0x42, 0xa9, 0x53, + 0xd2, 0xfb, 0x4e, 0x9d, 0x92, 0xd9, 0x63, 0xea, 0x94, 0xe2, 0xff, 0x93, 0xed, 0xf9, 0x3a, 0xf3, + 0x48, 0x42, 0x6c, 0xbf, 0xc2, 0x36, 0x65, 0xac, 0xf6, 0x92, 0x13, 0xdb, 0x5a, 0xf0, 0xc7, 0x67, + 0x75, 0x8d, 0x8f, 0x4a, 0x47, 0x0d, 0x53, 0x92, 0x37, 0x60, 0xc4, 0xfb, 0x00, 0x4c, 0xc9, 0x23, + 0xa5, 0x92, 0xf1, 0x17, 0xc4, 0x48, 0xf2, 0x9a, 0x50, 0x01, 0xf2, 0x12, 0x0c, 0xa1, 0x39, 0xd4, + 0xd6, 0x1a, 0x5e, 0xbe, 0x26, 0x9e, 0xe0, 0xc9, 0x03, 0xca, 0x61, 0xa4, 0x7d, 0x4a, 0xf2, 0xad, + 0x90, 0x13, 0x29, 0x1d, 0x73, 0xb8, 0x44, 0x5f, 0xdb, 0xc5, 0x73, 0xd6, 0xab, 0x72, 0x3a, 0x47, + 0xbe, 0xc1, 0x41, 0x40, 0x68, 0x83, 0xc3, 0x33, 0x39, 0x2e, 0xc1, 0xa9, 0xaa, 0x4d, 0x75, 0x7c, + 0x38, 0x3d, 0x7d, 0xbf, 0x6d, 0x8b, 0x64, 0x9b, 0x7c, 0x82, 0xc0, 0xf5, 0xad, 0xed, 0xa1, 0xd9, + 0xca, 0x2b, 0xf0, 0x72, 0xd2, 0x98, 0x84, 0xe2, 0xcc, 0xe8, 0xe1, 0x2d, 0xb9, 0x45, 0x37, 0x37, + 0x2c, 0x5b, 0xe7, 0xf9, 0x28, 0xc5, 0xd4, 0x2f, 0x04, 0xbd, 0x26, 0x50, 0xb2, 0xd1, 0x13, 0x2e, + 0x74, 0xe1, 0x15, 0x18, 0xde, 0x6f, 0x4a, 0xc4, 0x9f, 0x49, 0x77, 0x89, 0x73, 0xf0, 0xe0, 0x66, + 0xa5, 0x2f, 0x40, 0x3f, 0x8f, 0x25, 0xc5, 0x95, 0x6f, 0x68, 0x7b, 0xab, 0xd0, 0xff, 0x69, 0x74, + 0x3c, 0xe7, 0xf0, 0xe2, 0x5f, 0xa4, 0xbb, 0x04, 0x71, 0x78, 0x70, 0x65, 0xc6, 0x16, 0x1e, 0x4f, + 0x18, 0x95, 0x29, 0x94, 0xdc, 0xa8, 0x58, 0x78, 0x3c, 0x30, 0x33, 0x2a, 0x64, 0x22, 0x72, 0x15, + 0xa0, 0xaa, 0xd9, 0x5a, 0x8b, 0xba, 0x6c, 0xaf, 0xc3, 0x4f, 0x0b, 0xd0, 0x0a, 0x69, 0xfb, 0x50, + 0x55, 0xa2, 0x28, 0xfe, 0x44, 0xa6, 0x57, 0x90, 0x8b, 0x13, 0xd9, 0xef, 0x45, 0xf6, 0xd7, 0x61, + 0xd8, 0x97, 0x6c, 0x65, 0x0a, 0xed, 0xa5, 0x51, 0x3f, 0x01, 0x2b, 0x07, 0x63, 0x19, 0x89, 0x88, + 0x5c, 0xe1, 0x6d, 0xad, 0x19, 0xef, 0xf2, 0x64, 0x77, 0xa3, 0x22, 0x8d, 0x99, 0xe6, 0x6a, 0x75, + 0xc7, 0x78, 0x97, 0xaa, 0x3e, 0xba, 0xf8, 0x8f, 0xd3, 0x89, 0x91, 0x42, 0x4e, 0xfa, 0x68, 0x0f, + 0x7d, 0x94, 0x20, 0x44, 0x1e, 0xe3, 0xe4, 0x44, 0x88, 0x7b, 0x10, 0xe2, 0x9f, 0xa7, 0x13, 0x23, + 0xc2, 0x9c, 0x08, 0x71, 0x2f, 0xb3, 0xc5, 0x33, 0x30, 0xa4, 0x5a, 0x1b, 0x4e, 0x19, 0xf7, 0x44, + 0x7c, 0xae, 0xc0, 0x89, 0xda, 0xb6, 0x36, 0x9c, 0x3a, 0xee, 0x76, 0xd4, 0x80, 0xa0, 0xf8, 0xcd, + 0x74, 0x8f, 0x98, 0x39, 0x27, 0x82, 0x7f, 0x2f, 0x97, 0xc8, 0x9f, 0x4f, 0x87, 0x62, 0xf2, 0x3c, + 0xb8, 0xc2, 0xbe, 0x06, 0x50, 0x6b, 0xac, 0xd2, 0x96, 0x26, 0x25, 0x0c, 0xc6, 0x23, 0x0b, 0x07, + 0xa1, 0x7c, 0x1b, 0x2c, 0x91, 0x14, 0x7f, 0x31, 0x1d, 0x09, 0x4a, 0x74, 0x22, 0xbb, 0x5d, 0xcb, + 0xce, 0xd7, 0x3a, 0x11, 0x67, 0xe9, 0x44, 0x72, 0xbb, 0x95, 0xdc, 0xf7, 0xa4, 0x23, 0x21, 0xa9, + 0x1e, 0x58, 0xd9, 0xb1, 0x01, 0x18, 0x0f, 0x95, 0xf5, 0xc0, 0x6a, 0xd2, 0x33, 0x30, 0x24, 0xe4, + 0xe0, 0x2f, 0x15, 0x7c, 0xde, 0xe7, 0x40, 0x3c, 0xa0, 0xf5, 0x09, 0x8a, 0x7f, 0x2d, 0x0d, 0xe1, + 0x50, 0x61, 0x0f, 0xa8, 0x0e, 0xfd, 0x7c, 0x3a, 0x1c, 0x24, 0xed, 0xc1, 0xd5, 0x9f, 0xab, 0x00, + 0xb5, 0xce, 0x72, 0x43, 0xb8, 0x22, 0xf7, 0x4b, 0x27, 0xfc, 0x3e, 0x54, 0x95, 0x28, 0x8a, 0xff, + 0x21, 0x9d, 0x18, 0xb9, 0xed, 0xc1, 0x15, 0xe0, 0x0b, 0x78, 0x2a, 0xde, 0x30, 0x83, 0x89, 0x1c, + 0x0f, 0x21, 0xd9, 0xf8, 0x8b, 0x65, 0x99, 0xf7, 0x08, 0xc9, 0x47, 0x12, 0xcc, 0x35, 0xcc, 0x81, + 0x17, 0x98, 0x6b, 0xf2, 0x61, 0xbe, 0x64, 0xb8, 0xfd, 0x56, 0x7a, 0xa7, 0x40, 0x77, 0x0f, 0xf2, + 0xaa, 0x3a, 0x50, 0xd5, 0x36, 0x31, 0x20, 0x3b, 0xeb, 0x89, 0x11, 0x9e, 0x03, 0xbd, 0xcd, 0x41, + 0xf2, 0xb5, 0x9d, 0xa0, 0x2a, 0xfe, 0x9b, 0xfe, 0xe4, 0x28, 0x6b, 0x0f, 0xae, 0x08, 0x2f, 0x42, + 0xb6, 0xaa, 0xb9, 0xab, 0x42, 0x93, 0xf1, 0x36, 0xb0, 0xad, 0xb9, 0xab, 0x2a, 0x42, 0xc9, 0x15, + 0x18, 0x54, 0xb5, 0x0d, 0x7e, 0xe6, 0x99, 0x0b, 0xf2, 0xd3, 0xdb, 0xda, 0x46, 0x9d, 0x9f, 0x7b, + 0xfa, 0x68, 0x52, 0x84, 0xdc, 0x3c, 0x75, 0x57, 0x2d, 0x5d, 0x9c, 0x7c, 0x63, 0x72, 0xee, 0x16, + 0x42, 0x54, 0x81, 0x61, 0x95, 0x4d, 0x5a, 0xfa, 0x26, 0xde, 0x7c, 0x8d, 0xf0, 0xca, 0x96, 0x2d, + 0x7d, 0x53, 0x45, 0x28, 0xf9, 0xde, 0x14, 0x0c, 0xcc, 0x52, 0x4d, 0x67, 0x23, 0x64, 0xa8, 0x97, + 0xc3, 0xca, 0x5b, 0x87, 0xe3, 0xb0, 0x32, 0xb1, 0xca, 0x2b, 0x93, 0x15, 0x45, 0xd4, 0x4f, 0x6e, + 0xc0, 0x60, 0x59, 0x73, 0xe9, 0x8a, 0x65, 0x6f, 0xa2, 0x0b, 0xce, 0x58, 0xf0, 0x52, 0x37, 0xa4, + 0x3f, 0x1e, 0x11, 0xbf, 0x19, 0x6b, 0x88, 0x5f, 0xaa, 0x5f, 0x98, 0x89, 0x85, 0xdf, 0xcc, 0xa1, + 0x0f, 0x8e, 0x10, 0x0b, 0xbf, 0xc2, 0x53, 0x05, 0x26, 0x38, 0x56, 0x1e, 0x49, 0x3e, 0x56, 0x46, + 0xeb, 0x11, 0xdd, 0xf4, 0xca, 0x96, 0x4e, 0xd1, 0xd7, 0x65, 0x54, 0x58, 0x8f, 0x08, 0xad, 0x37, + 0x2c, 0x9d, 0x59, 0x8f, 0x3e, 0x49, 0xf1, 0x4f, 0xfb, 0x21, 0x31, 0x26, 0xd3, 0x89, 0x92, 0x9f, + 0x28, 0x79, 0xa0, 0xe4, 0x53, 0x31, 0x25, 0xbf, 0x10, 0x8f, 0xf2, 0xf5, 0x3e, 0xd5, 0xf0, 0x2f, + 0x64, 0x63, 0x31, 0x02, 0x1f, 0xec, 0xdd, 0x65, 0x20, 0xbd, 0xfe, 0x1d, 0xa5, 0xe7, 0x0f, 0x88, + 0xdc, 0x8e, 0x03, 0x62, 0x60, 0xb7, 0x03, 0x62, 0xb0, 0xeb, 0x80, 0x08, 0x14, 0x64, 0xa8, 0xab, + 0x82, 0x54, 0xc4, 0xa0, 0x81, 0xde, 0xb9, 0x0a, 0x2f, 0x6e, 0x6f, 0x15, 0xc6, 0xd8, 0x68, 0x4a, + 0x4c, 0x52, 0x88, 0x2c, 0x8a, 0x5f, 0xcf, 0xf6, 0x08, 0xec, 0x79, 0x24, 0x3a, 0xf2, 0x02, 0x64, + 0x4a, 0xed, 0xb6, 0xd0, 0x8f, 0x53, 0x52, 0x4c, 0xd1, 0x2e, 0xa5, 0x18, 0x35, 0x79, 0x15, 0x32, + 0xa5, 0xbb, 0xb5, 0x68, 0x7a, 0xc2, 0xd2, 0xdd, 0x9a, 0xf8, 0x92, 0xae, 0x65, 0xef, 0xd6, 0xc8, + 0xeb, 0x41, 0x9e, 0x80, 0xd5, 0x8e, 0xb9, 0x26, 0x36, 0x8a, 0xc2, 0x53, 0xd7, 0xf3, 0xe4, 0x69, + 0x30, 0x14, 0xdb, 0x2e, 0x46, 0x68, 0x23, 0xda, 0x94, 0xdb, 0xbd, 0x36, 0x0d, 0xec, 0xa8, 0x4d, + 0x83, 0xbb, 0xd5, 0xa6, 0xa1, 0x5d, 0x68, 0x13, 0xec, 0xa8, 0x4d, 0xc3, 0x07, 0xd7, 0xa6, 0x36, + 0x5c, 0x88, 0x07, 0x63, 0xf6, 0x35, 0x42, 0x05, 0x12, 0xc7, 0x0a, 0xc7, 0x12, 0xbc, 0xfa, 0xef, + 0x70, 0x6c, 0x7d, 0x03, 0xd1, 0x75, 0x87, 0xe1, 0x65, 0xd7, 0xb6, 0x78, 0xe9, 0xe2, 0xcf, 0xa4, + 0xbb, 0xc7, 0x90, 0x3e, 0x9e, 0x53, 0xdc, 0xb7, 0x25, 0x4a, 0x29, 0x1b, 0x79, 0xbd, 0xda, 0x55, + 0xca, 0x11, 0xb6, 0x49, 0x32, 0xfb, 0x72, 0xba, 0x5b, 0x60, 0xeb, 0x03, 0x49, 0xec, 0xc9, 0xb8, + 0x33, 0x1c, 0xba, 0xf8, 0x3b, 0x61, 0x2f, 0xb8, 0x19, 0x18, 0x91, 0x85, 0x28, 0xa4, 0xb4, 0x1b, + 0x01, 0x87, 0xca, 0x91, 0xd7, 0xfd, 0x2c, 0x92, 0x92, 0x7f, 0x0c, 0x7a, 0xba, 0x79, 0x63, 0x36, + 0xe2, 0x1e, 0x23, 0x93, 0x93, 0x67, 0x20, 0x37, 0x83, 0x69, 0x99, 0xe4, 0xc1, 0xce, 0x13, 0x35, + 0xc9, 0x5e, 0x2b, 0x9c, 0xa6, 0xf8, 0xab, 0x29, 0x38, 0x75, 0xab, 0xb3, 0x4c, 0x85, 0xa3, 0x9d, + 0xdf, 0x86, 0x77, 0x00, 0x18, 0x58, 0x38, 0xcc, 0xa4, 0xd0, 0x61, 0xe6, 0x43, 0x72, 0x00, 0xec, + 0x48, 0x81, 0xab, 0x01, 0x35, 0x77, 0x96, 0x79, 0xd8, 0xf3, 0x39, 0x5d, 0xeb, 0x2c, 0xd3, 0x7a, + 0xcc, 0x6b, 0x46, 0xe2, 0x7e, 0xe1, 0xa3, 0xdc, 0x9b, 0x7f, 0xbf, 0x0e, 0x2a, 0x3f, 0x9d, 0xee, + 0x1a, 0x73, 0xfc, 0x48, 0xc6, 0xc9, 0x24, 0x0c, 0xaa, 0xfb, 0x4c, 0x86, 0xec, 0xe1, 0xc9, 0x27, + 0x13, 0x7b, 0x45, 0x8c, 0x95, 0x87, 0x7a, 0xf4, 0x43, 0x84, 0x63, 0x12, 0x97, 0x64, 0x81, 0x1d, + 0xe1, 0xc4, 0xf2, 0xbe, 0x17, 0xd8, 0x37, 0x52, 0x5d, 0x63, 0xc3, 0x1f, 0x57, 0x81, 0x15, 0xff, + 0xd7, 0x8c, 0x17, 0x92, 0xfe, 0x40, 0x9f, 0xf0, 0x0c, 0x0c, 0x89, 0x28, 0x05, 0x61, 0x3f, 0x61, + 0x71, 0x6c, 0x88, 0xc7, 0xd0, 0x3e, 0x01, 0x33, 0x29, 0x24, 0x27, 0x66, 0xc9, 0x4f, 0x58, 0x72, + 0x60, 0x56, 0x25, 0x12, 0x66, 0x34, 0x4c, 0xdf, 0x37, 0x5c, 0xb4, 0x40, 0x58, 0x5f, 0x66, 0xb8, + 0xd1, 0x40, 0xef, 0x1b, 0x2e, 0xb7, 0x3f, 0x7c, 0x34, 0x33, 0x08, 0xb8, 0x2d, 0x22, 0xe6, 0x3d, + 0x34, 0x08, 0xb8, 0xa9, 0xa2, 0x0a, 0x0c, 0x6b, 0xad, 0x70, 0xbe, 0x15, 0x2e, 0x2d, 0xa2, 0xb5, + 0xc2, 0x5d, 0x17, 0x5b, 0xeb, 0x13, 0x30, 0x8e, 0x2a, 0x5d, 0x09, 0x9c, 0xf8, 0x90, 0xa3, 0x8d, + 0x10, 0x55, 0x60, 0xc8, 0x75, 0x18, 0xab, 0xb9, 0x9a, 0xa9, 0x6b, 0xb6, 0xbe, 0xd8, 0x71, 0xdb, + 0x1d, 0x57, 0x36, 0x80, 0x1d, 0x57, 0xb7, 0x3a, 0xae, 0x1a, 0xa1, 0x20, 0xcf, 0xc1, 0xa8, 0x07, + 0x99, 0xb6, 0x6d, 0xcb, 0x96, 0xad, 0x1c, 0xc7, 0xd5, 0xa9, 0x6d, 0xab, 0x61, 0x02, 0xf2, 0x11, + 0x18, 0xad, 0x98, 0xfe, 0xa3, 0x7b, 0x75, 0x4e, 0xd8, 0x3c, 0xf8, 0x62, 0xcc, 0xf0, 0x11, 0xf5, + 0x8e, 0xdd, 0x54, 0xc3, 0x84, 0xc5, 0xed, 0x74, 0x3c, 0x72, 0xff, 0x83, 0xbb, 0x41, 0xba, 0x12, + 0x76, 0xdc, 0x43, 0x6f, 0x55, 0x34, 0x3e, 0x65, 0xbf, 0x61, 0x6e, 0x83, 0x5e, 0x87, 0xc1, 0x5b, + 0x74, 0x93, 0xfb, 0x98, 0xe6, 0x02, 0xb7, 0xe4, 0x35, 0x01, 0x93, 0x4f, 0x77, 0x3d, 0xba, 0xe2, + 0x57, 0xd3, 0xf1, 0x9c, 0x04, 0x0f, 0xae, 0xb0, 0x9f, 0x83, 0x01, 0x14, 0x65, 0xc5, 0xbb, 0x5e, + 0x40, 0x01, 0xa2, 0xb8, 0xc3, 0xde, 0xce, 0x1e, 0x59, 0xf1, 0xc7, 0x73, 0xd1, 0x44, 0x15, 0x0f, + 0xae, 0xf4, 0x5e, 0x83, 0xe1, 0xb2, 0x65, 0x3a, 0x86, 0xe3, 0x52, 0xb3, 0xe1, 0x29, 0x2c, 0x3a, + 0xfe, 0x37, 0x02, 0xb0, 0x6c, 0x03, 0x4a, 0xd4, 0xfb, 0x51, 0x5e, 0xf2, 0x32, 0x0c, 0xa1, 0xc8, + 0xd1, 0xe6, 0xe4, 0x13, 0x1e, 0xde, 0x4c, 0x2c, 0x33, 0x60, 0xd4, 0xe2, 0x0c, 0x48, 0xc9, 0x6d, + 0x18, 0x2c, 0xaf, 0x1a, 0x4d, 0xdd, 0xa6, 0x26, 0xfa, 0x26, 0x4b, 0xf1, 0x00, 0xc3, 0x7d, 0x79, + 0x15, 0xff, 0x45, 0x5a, 0xde, 0x9c, 0x86, 0x28, 0x16, 0x7a, 0x2c, 0x26, 0x60, 0x17, 0x7e, 0x28, + 0x0d, 0x10, 0x14, 0x20, 0x8f, 0x42, 0xda, 0x7b, 0x91, 0xcc, 0x5d, 0x62, 0x42, 0x1a, 0x94, 0xc6, + 0xa5, 0x42, 0x8c, 0xed, 0xf4, 0x8e, 0x63, 0xfb, 0x36, 0xe4, 0xf8, 0xe9, 0x1a, 0x7a, 0xad, 0x4b, + 0xc1, 0x09, 0xba, 0x36, 0xf8, 0x2a, 0xd2, 0x73, 0x5b, 0x1a, 0x2d, 0xcf, 0x90, 0x07, 0x38, 0x67, + 0x76, 0xa1, 0x01, 0xfd, 0xf8, 0x17, 0xb9, 0x04, 0x59, 0x94, 0x62, 0x0a, 0xf7, 0xcc, 0x38, 0x4b, + 0x47, 0xe4, 0x87, 0x78, 0xd6, 0x4d, 0x65, 0xcb, 0x74, 0x59, 0xd5, 0xd8, 0xea, 0x11, 0x21, 0x17, + 0x01, 0x0b, 0xc9, 0x45, 0xc0, 0x8a, 0xff, 0x2c, 0x9d, 0x90, 0x42, 0xe5, 0xc1, 0x1d, 0x26, 0xaf, + 0x00, 0xe0, 0xcb, 0x73, 0x26, 0x4f, 0xef, 0x39, 0x08, 0x8e, 0x12, 0x64, 0x84, 0x6a, 0x1b, 0xda, + 0x76, 0x04, 0xc4, 0xc5, 0xdf, 0x4c, 0xc5, 0xf2, 0x6e, 0x1c, 0x48, 0x8e, 0xb2, 0x55, 0x96, 0xde, + 0xa7, 0x19, 0xeb, 0xf5, 0x45, 0x66, 0x6f, 0x7d, 0x11, 0xfe, 0x96, 0x43, 0xb0, 0x4c, 0x8f, 0xf2, + 0x5b, 0xfe, 0x34, 0x9d, 0x94, 0x85, 0xe4, 0x78, 0xaa, 0xf8, 0x8b, 0xbe, 0x51, 0x9a, 0x8d, 0xe4, + 0x7d, 0x42, 0x68, 0xa4, 0x98, 0x67, 0xa6, 0x7e, 0x0a, 0xc6, 0x23, 0xb9, 0x39, 0x70, 0xfe, 0x97, + 0x02, 0x9a, 0x24, 0x67, 0xf0, 0xe8, 0x1e, 0xb3, 0x20, 0x44, 0x56, 0xfc, 0xff, 0x52, 0xbd, 0x33, + 0xb3, 0x1c, 0xb9, 0xea, 0x24, 0x08, 0x20, 0xf3, 0x97, 0x23, 0x80, 0x43, 0xd8, 0x06, 0x1f, 0x6f, + 0x01, 0xbc, 0x4f, 0x26, 0x8f, 0xf7, 0x5a, 0x00, 0x3f, 0x9e, 0xda, 0x31, 0xb1, 0xce, 0x51, 0xcb, + 0xa0, 0xf8, 0xaf, 0x52, 0x89, 0x09, 0x70, 0x0e, 0xd4, 0xae, 0xd7, 0x21, 0xc7, 0x5d, 0x78, 0x44, + 0xab, 0xa4, 0x94, 0xc1, 0x0c, 0xda, 0xa5, 0xbc, 0x28, 0x43, 0xe6, 0x60, 0x80, 0xb7, 0x41, 0x17, + 0xbd, 0xf1, 0x44, 0x8f, 0x2c, 0x3c, 0x7a, 0xb7, 0xc9, 0x51, 0xa0, 0x8b, 0xbf, 0x96, 0x8a, 0xe5, + 0xe3, 0x39, 0xc2, 0x6f, 0x0b, 0xa6, 0xea, 0xcc, 0xee, 0xa7, 0xea, 0xe2, 0xbf, 0x4e, 0x27, 0xa7, + 0x03, 0x3a, 0xc2, 0x0f, 0x39, 0x8c, 0xe3, 0xb4, 0xfd, 0xad, 0x5b, 0x4b, 0x30, 0x16, 0x96, 0x85, + 0x58, 0xb6, 0x1e, 0x49, 0x4e, 0x8a, 0xd4, 0xa5, 0x15, 0x11, 0x1e, 0xc5, 0x1f, 0x4c, 0xc7, 0x33, + 0x19, 0x1d, 0xf9, 0xfc, 0xb4, 0x2f, 0x6d, 0x21, 0x15, 0x18, 0x0f, 0xbe, 0x64, 0xc9, 0x70, 0x9b, + 0xde, 0xe9, 0x3e, 0xc6, 0x04, 0x10, 0x31, 0x2c, 0x9a, 0x86, 0xe3, 0xd6, 0x5d, 0x86, 0x0c, 0x45, + 0x53, 0x08, 0x97, 0x8b, 0x48, 0xe5, 0x7d, 0xb2, 0x6c, 0xbd, 0xcf, 0xa4, 0xf2, 0x3e, 0x59, 0xcb, + 0x8e, 0x5c, 0x2a, 0x3f, 0x99, 0xee, 0x96, 0xe9, 0xea, 0xc8, 0x65, 0xf3, 0x09, 0xb9, 0xbf, 0x78, + 0xcb, 0x84, 0x94, 0x1e, 0xed, 0x96, 0x5a, 0xaa, 0x0b, 0xcf, 0x18, 0x9f, 0xfd, 0x4d, 0x62, 0x89, + 0xc2, 0x7a, 0x9f, 0x0c, 0xaf, 0xe3, 0x21, 0xac, 0xf7, 0xc9, 0xa8, 0x7b, 0xff, 0x09, 0xeb, 0x97, + 0xd2, 0xbb, 0x4d, 0xaf, 0x76, 0x22, 0xbc, 0x98, 0xf0, 0x3e, 0x97, 0x8e, 0xa7, 0xfd, 0x3b, 0x72, + 0x31, 0xcd, 0x40, 0x4e, 0x24, 0x20, 0xec, 0x2a, 0x1c, 0x8e, 0xef, 0x66, 0xb2, 0x89, 0xef, 0x78, + 0x11, 0xc4, 0x4d, 0xd5, 0xee, 0x44, 0xc2, 0x69, 0x8b, 0xdf, 0x4c, 0x45, 0x72, 0xe4, 0x1d, 0xc9, + 0x19, 0xc9, 0xfe, 0x56, 0xb7, 0x8f, 0x7a, 0xa7, 0xb5, 0xd9, 0x48, 0x94, 0x68, 0xff, 0x7b, 0xa6, + 0xa8, 0xab, 0x19, 0xcd, 0x68, 0x79, 0x11, 0x60, 0xe1, 0xab, 0x69, 0x98, 0x88, 0x91, 0x92, 0x4b, + 0xa1, 0x90, 0x46, 0x78, 0xee, 0x1a, 0xf1, 0xc4, 0xe7, 0xc1, 0x8d, 0xf6, 0x70, 0x54, 0x7c, 0x09, + 0xb2, 0x53, 0xda, 0x26, 0xff, 0xb6, 0x7e, 0xce, 0x52, 0xd7, 0x36, 0xe5, 0x23, 0x45, 0xc4, 0x93, + 0x65, 0x38, 0xc3, 0x2f, 0x7c, 0x0c, 0xcb, 0x5c, 0x32, 0x5a, 0xb4, 0x62, 0xce, 0x1b, 0xcd, 0xa6, + 0xe1, 0x88, 0x5b, 0xcb, 0x67, 0xb6, 0xb7, 0x0a, 0x97, 0x5d, 0xcb, 0xd5, 0x9a, 0x75, 0xea, 0x91, + 0xd5, 0x5d, 0xa3, 0x45, 0xeb, 0x86, 0x59, 0x6f, 0x21, 0xa5, 0xc4, 0x32, 0x99, 0x15, 0xa9, 0xf0, + 0x74, 0x54, 0xb5, 0x86, 0x66, 0x9a, 0x54, 0xaf, 0x98, 0x93, 0x9b, 0x2e, 0xe5, 0xb7, 0x9d, 0x19, + 0x7e, 0xe6, 0xc9, 0x1f, 0xda, 0x73, 0x34, 0x63, 0xbc, 0xcc, 0x08, 0xd4, 0x84, 0x42, 0xc5, 0x5f, + 0xce, 0x26, 0xa4, 0x47, 0x3c, 0x46, 0xea, 0xe3, 0xf5, 0x74, 0x76, 0x87, 0x9e, 0xbe, 0x06, 0x03, + 0x22, 0xdf, 0x87, 0xb8, 0x41, 0xc1, 0x97, 0x01, 0xeb, 0x1c, 0x24, 0x5f, 0x41, 0x09, 0x2a, 0xd2, + 0x84, 0x0b, 0x4b, 0xac, 0x9b, 0x92, 0x3b, 0x33, 0xb7, 0x8f, 0xce, 0xec, 0xc1, 0x8f, 0xbc, 0x0d, + 0xe7, 0x10, 0x9b, 0xd0, 0xad, 0x03, 0x58, 0x15, 0xda, 0x7a, 0xbc, 0xaa, 0xe4, 0xce, 0xed, 0x56, + 0x9e, 0x7c, 0x02, 0x46, 0xfc, 0x01, 0x62, 0x50, 0x47, 0x5c, 0xcd, 0xf4, 0x18, 0x67, 0x3c, 0x10, + 0x1f, 0x03, 0xa3, 0x3f, 0x5e, 0x38, 0x98, 0x5b, 0x88, 0x57, 0xf1, 0x8f, 0x53, 0xbd, 0xd2, 0x34, + 0x1e, 0xf9, 0xac, 0xfc, 0x51, 0x18, 0xd0, 0xf9, 0x47, 0x09, 0x9d, 0xea, 0x9d, 0xc8, 0x91, 0x93, + 0xaa, 0x5e, 0x99, 0xe2, 0x9f, 0xa4, 0x7a, 0x66, 0x87, 0x3c, 0xee, 0x9f, 0xf7, 0xb9, 0x4c, 0x97, + 0xcf, 0x13, 0x93, 0xe8, 0x15, 0xc8, 0x1b, 0x41, 0xfa, 0xaa, 0x7a, 0x10, 0xcb, 0x4b, 0x1d, 0x97, + 0xe0, 0x38, 0xba, 0x5e, 0x04, 0xdf, 0x23, 0xcd, 0xf6, 0xdc, 0xed, 0x9c, 0x7a, 0xc7, 0x36, 0xf8, + 0xb8, 0x54, 0x4f, 0x3b, 0x11, 0x5f, 0x3c, 0xe7, 0xb6, 0x6d, 0xb0, 0x0a, 0x34, 0x77, 0x95, 0x9a, + 0x5a, 0x7d, 0xc3, 0xb2, 0xd7, 0x30, 0xda, 0x2b, 0x1f, 0x9c, 0xea, 0x38, 0x87, 0xdf, 0xf5, 0xc0, + 0xe4, 0x71, 0x18, 0x5d, 0x69, 0x76, 0xa8, 0x1f, 0x5f, 0x93, 0x5f, 0x66, 0xaa, 0x23, 0x0c, 0xe8, + 0x5f, 0x01, 0x3d, 0x0c, 0x80, 0x44, 0x98, 0x2b, 0x82, 0xdf, 0x5c, 0xaa, 0x43, 0x0c, 0xb2, 0x24, + 0xba, 0xeb, 0x02, 0xd7, 0x6a, 0x2e, 0xa4, 0x7a, 0xd3, 0x32, 0x57, 0xea, 0x2e, 0xb5, 0x5b, 0xd8, + 0x50, 0xf4, 0xd6, 0x50, 0xcf, 0x22, 0x05, 0xde, 0x0d, 0x39, 0x73, 0x96, 0xb9, 0xb2, 0x44, 0xed, + 0x16, 0x6b, 0xea, 0x33, 0x40, 0x44, 0x53, 0x6d, 0x3c, 0xd5, 0xe1, 0x1f, 0x87, 0xee, 0x1a, 0xaa, + 0xf8, 0x08, 0x7e, 0xdc, 0x83, 0x1f, 0x56, 0x80, 0x61, 0x1e, 0x64, 0x90, 0x0b, 0x0d, 0x7d, 0x34, + 0x54, 0xe0, 0x20, 0x94, 0xd7, 0x59, 0x10, 0xee, 0x23, 0xdc, 0x45, 0x5e, 0x15, 0xbf, 0x8a, 0x9f, + 0xcd, 0x24, 0x25, 0xb4, 0x3c, 0x90, 0xa2, 0x05, 0xd3, 0x6a, 0x7a, 0x4f, 0xd3, 0xea, 0xb8, 0xd9, + 0x69, 0xd5, 0xb5, 0x76, 0xbb, 0x7e, 0xcf, 0x68, 0xe2, 0x1b, 0x35, 0x5c, 0xf8, 0xd4, 0x51, 0xb3, + 0xd3, 0x2a, 0xb5, 0xdb, 0x33, 0x1c, 0x48, 0x9e, 0x86, 0x09, 0x46, 0x87, 0x9d, 0xe4, 0x53, 0x66, + 0x91, 0x92, 0x31, 0xc0, 0x28, 0xbd, 0x1e, 0xed, 0x79, 0x18, 0x14, 0x3c, 0xf9, 0x5a, 0xd5, 0xaf, + 0x0e, 0x70, 0x66, 0x0e, 0xeb, 0x39, 0x9f, 0x0d, 0x9f, 0x5c, 0xfb, 0xd5, 0x21, 0xaf, 0x3c, 0xc6, + 0xa2, 0x36, 0x3b, 0x2d, 0x1e, 0x5e, 0x6c, 0x00, 0x91, 0xfe, 0x6f, 0x72, 0x09, 0xc6, 0x18, 0x17, + 0x5f, 0x60, 0x3c, 0x7c, 0x6f, 0xbf, 0x1a, 0x81, 0x92, 0xeb, 0x70, 0x3a, 0x04, 0xe1, 0x36, 0x28, + 0x7f, 0x73, 0xd1, 0xaf, 0x26, 0xe2, 0x8a, 0xbf, 0x98, 0x09, 0xa7, 0xd9, 0x3c, 0x82, 0x8e, 0x38, + 0x07, 0x03, 0x96, 0xbd, 0x52, 0xef, 0xd8, 0x4d, 0x31, 0xf6, 0x72, 0x96, 0xbd, 0x72, 0xdb, 0x6e, + 0x92, 0x33, 0x90, 0x63, 0xbd, 0x63, 0xe8, 0x62, 0x88, 0xf5, 0x6b, 0xed, 0x76, 0x45, 0x27, 0x25, + 0xde, 0x21, 0x18, 0xfa, 0xb5, 0xde, 0xc0, 0xad, 0x3d, 0xf7, 0xba, 0xe8, 0xe7, 0x2b, 0x5e, 0x0c, + 0x89, 0xfd, 0x84, 0x01, 0x61, 0xf9, 0x41, 0x40, 0x84, 0x85, 0x8e, 0xdb, 0x12, 0x9d, 0xf7, 0x49, + 0x94, 0x85, 0x40, 0x06, 0x2c, 0xf8, 0x26, 0x46, 0x27, 0x53, 0x40, 0x02, 0xaa, 0x96, 0xa5, 0x1b, + 0xf7, 0x0c, 0xca, 0x9f, 0xc8, 0xf4, 0xf3, 0x9b, 0xed, 0x38, 0x56, 0xcd, 0x7b, 0x4c, 0xe6, 0x05, + 0x84, 0xbc, 0xc6, 0x95, 0x90, 0xd3, 0xe1, 0xda, 0xc7, 0xfb, 0x96, 0xdb, 0x69, 0x11, 0x14, 0x6a, + 0x26, 0x96, 0xc7, 0x85, 0xb0, 0xf8, 0x95, 0x5c, 0x3c, 0xd7, 0xea, 0x91, 0xd8, 0x35, 0xb3, 0x00, + 0x22, 0x95, 0x72, 0x70, 0x7b, 0x78, 0x41, 0xca, 0x9b, 0x24, 0x30, 0x5d, 0x78, 0x48, 0x65, 0xc9, + 0x15, 0x18, 0xe4, 0x5f, 0x54, 0x99, 0x12, 0xf6, 0x0e, 0xfa, 0xc0, 0x39, 0x6d, 0xe3, 0xde, 0x3d, + 0x74, 0x98, 0xf3, 0xd1, 0xe4, 0x12, 0x0c, 0x4c, 0x2d, 0xd4, 0x6a, 0xa5, 0x05, 0xef, 0x2a, 0x1c, + 0x1f, 0xeb, 0xe8, 0xa6, 0x53, 0x77, 0x34, 0xd3, 0x51, 0x3d, 0x24, 0x79, 0x1c, 0x72, 0x95, 0x2a, + 0x92, 0xf1, 0x27, 0xa8, 0xc3, 0xdb, 0x5b, 0x85, 0x01, 0xa3, 0xcd, 0xa9, 0x04, 0x0a, 0xeb, 0xbd, + 0x53, 0x99, 0x92, 0xfc, 0x41, 0x78, 0xbd, 0xeb, 0x86, 0x8e, 0xf7, 0xea, 0xaa, 0x8f, 0x26, 0x2f, + 0xc1, 0x48, 0x8d, 0xda, 0x86, 0xd6, 0x5c, 0xe8, 0xe0, 0x56, 0x51, 0x0a, 0x69, 0xe9, 0x20, 0xbc, + 0x6e, 0x22, 0x42, 0x0d, 0x91, 0x91, 0x8b, 0x90, 0x9d, 0x35, 0x4c, 0xef, 0x3d, 0x08, 0x3e, 0x18, + 0x58, 0x35, 0x4c, 0x57, 0x45, 0x28, 0x79, 0x1c, 0x32, 0x37, 0x97, 0x2a, 0xc2, 0xd5, 0x0d, 0x79, + 0xbd, 0xe3, 0x86, 0xc2, 0x63, 0xde, 0x5c, 0xaa, 0x90, 0x97, 0x60, 0x88, 0x2d, 0x62, 0xd4, 0x6c, + 0x50, 0x47, 0x19, 0xc6, 0x8f, 0xe1, 0x31, 0x19, 0x3d, 0xa0, 0xec, 0xb4, 0xe2, 0x53, 0x92, 0x5b, + 0x90, 0x8f, 0xe6, 0x14, 0x11, 0x6f, 0x92, 0xd0, 0xe2, 0xda, 0x10, 0xb8, 0xa4, 0xa8, 0xa0, 0xb1, + 0x82, 0x44, 0x07, 0x25, 0x0a, 0x63, 0xfb, 0x3a, 0xb4, 0x3a, 0x79, 0x40, 0xea, 0xcb, 0xdb, 0x5b, + 0x85, 0x27, 0x62, 0x4c, 0xeb, 0xb6, 0xa0, 0x92, 0xb8, 0x77, 0xe5, 0x44, 0x3e, 0x09, 0x50, 0x72, + 0x5d, 0xdb, 0x58, 0xee, 0x30, 0xf3, 0x70, 0xac, 0xf7, 0x93, 0x86, 0xe2, 0xf6, 0x56, 0xe1, 0xb4, + 0xe6, 0x93, 0x27, 0x3e, 0x6c, 0x90, 0xd8, 0x15, 0xff, 0xcf, 0x74, 0x72, 0x72, 0xe0, 0x23, 0x98, + 0xfa, 0xf6, 0xe9, 0x36, 0x10, 0x19, 0x70, 0xd9, 0x03, 0x0c, 0xb8, 0x7b, 0x30, 0x5e, 0xd2, 0x5b, + 0x86, 0x59, 0xc2, 0x9f, 0xce, 0xfc, 0x4c, 0x09, 0xa7, 0x52, 0xe9, 0xed, 0x67, 0x04, 0x2d, 0xbe, + 0x87, 0x07, 0xa2, 0x66, 0xa8, 0xba, 0xc6, 0x71, 0xf5, 0xd6, 0x3d, 0xad, 0xde, 0xe0, 0x79, 0x75, + 0xd5, 0x28, 0xd3, 0xe2, 0x0f, 0xa6, 0x77, 0xc8, 0x67, 0xfc, 0x20, 0x4a, 0xbf, 0xf8, 0xf9, 0x74, + 0xef, 0x94, 0xd2, 0x0f, 0xa4, 0x50, 0xfe, 0x3c, 0x9d, 0x90, 0xe0, 0xf9, 0x40, 0x92, 0xb8, 0x02, + 0x83, 0x9c, 0x8d, 0xef, 0xb7, 0x8d, 0xb3, 0x3b, 0x57, 0x56, 0x5c, 0x55, 0x3c, 0x34, 0x59, 0x80, + 0xd3, 0xa5, 0x7b, 0xf7, 0x68, 0xc3, 0x0d, 0x42, 0x92, 0x2f, 0x04, 0x11, 0x7e, 0x79, 0x08, 0x66, + 0x81, 0x0f, 0x42, 0x9a, 0x63, 0x24, 0x9b, 0xc4, 0x72, 0x64, 0x09, 0xce, 0x46, 0xe1, 0x35, 0xbe, + 0x25, 0xca, 0x4a, 0x51, 0x99, 0x63, 0x1c, 0xf9, 0x7f, 0x6a, 0x97, 0xb2, 0x49, 0xad, 0xc4, 0xa5, + 0xab, 0xbf, 0x57, 0x2b, 0x71, 0x1d, 0x4b, 0x2c, 0x57, 0xfc, 0x6a, 0x46, 0xce, 0x83, 0xfd, 0xe0, + 0x7a, 0xd8, 0xbd, 0x18, 0xf2, 0xab, 0xdf, 0xed, 0x90, 0x79, 0x49, 0x84, 0xa7, 0xd1, 0x3b, 0xb6, + 0xe7, 0x82, 0xea, 0x87, 0xc7, 0x40, 0xa0, 0xbc, 0x2e, 0xfb, 0x94, 0xa4, 0x02, 0xd9, 0x92, 0xbd, + 0xc2, 0xcd, 0xfd, 0x9d, 0x5e, 0xec, 0x69, 0xf6, 0x4a, 0xf2, 0xc2, 0x86, 0x2c, 0x8a, 0x3f, 0x90, + 0xee, 0x91, 0xba, 0xfa, 0x81, 0x9c, 0x44, 0x7e, 0x34, 0xdd, 0x2d, 0x09, 0xf5, 0x71, 0xf5, 0x15, + 0x7c, 0x8f, 0x85, 0x73, 0xbc, 0x1d, 0x29, 0x0f, 0x51, 0x38, 0xbf, 0x97, 0xee, 0x96, 0x51, 0xfb, + 0x44, 0x38, 0xfb, 0x9b, 0x20, 0x13, 0x45, 0xfa, 0x00, 0xdb, 0xdc, 0xb2, 0x2a, 0xf4, 0xef, 0xd3, + 0x5f, 0x2e, 0x49, 0xa4, 0x27, 0x43, 0xf8, 0x40, 0x5a, 0xfa, 0x8d, 0x74, 0xd7, 0xcc, 0xf1, 0x27, + 0x32, 0x3d, 0x4c, 0x99, 0x9e, 0x0c, 0xfd, 0x03, 0x0d, 0xfd, 0x44, 0x99, 0x9e, 0x8c, 0xfd, 0x03, + 0xe9, 0xe9, 0x4f, 0xa5, 0x77, 0xc8, 0x26, 0x7b, 0xcc, 0xcf, 0x55, 0xcf, 0x42, 0x4e, 0xdc, 0x3c, + 0x60, 0xae, 0x43, 0x55, 0xfc, 0xda, 0xa7, 0xb4, 0xfe, 0x41, 0x7a, 0xc7, 0x5c, 0xb8, 0x27, 0xf2, + 0x92, 0xe4, 0xf5, 0xa5, 0xf4, 0x4e, 0x59, 0x7c, 0x4f, 0xc4, 0x25, 0x89, 0xeb, 0x77, 0xd3, 0x98, + 0x4a, 0xdf, 0x35, 0x1a, 0xb3, 0x96, 0xe3, 0x4a, 0xd9, 0xf0, 0xff, 0xf2, 0x57, 0x8c, 0xc3, 0xf0, + 0x2f, 0xf7, 0xba, 0x27, 0x7b, 0xa0, 0xee, 0xe9, 0x3f, 0xc0, 0x96, 0x26, 0x2e, 0xd0, 0x23, 0x5b, + 0x82, 0x3f, 0xa8, 0x02, 0x3d, 0x84, 0xf5, 0xf7, 0x41, 0x16, 0xe8, 0xdf, 0xc8, 0x40, 0xbe, 0x6c, + 0x5b, 0x1b, 0xe6, 0x4d, 0xba, 0x41, 0x9b, 0x47, 0x36, 0xdc, 0xdf, 0x17, 0x06, 0xa2, 0xbd, 0x4f, + 0x03, 0xd1, 0x2b, 0x47, 0xde, 0x80, 0xf1, 0x40, 0x96, 0x72, 0x8c, 0x47, 0xbc, 0xdb, 0x6e, 0x30, + 0x54, 0xfd, 0x1d, 0x86, 0x13, 0xc1, 0xc8, 0xa2, 0xd4, 0xc5, 0x6f, 0x86, 0x7a, 0xe3, 0xc1, 0x36, + 0xd7, 0x0f, 0xdc, 0x1b, 0xb7, 0xe1, 0x6c, 0xb9, 0x63, 0xdb, 0xd4, 0x74, 0x93, 0x3b, 0x05, 0x6f, + 0xd2, 0x1a, 0x9c, 0xa2, 0x1e, 0xef, 0x9c, 0x2e, 0x85, 0x19, 0x5b, 0xf1, 0xb6, 0x2c, 0xca, 0x76, + 0x20, 0x60, 0xdb, 0xe1, 0x14, 0x49, 0x6c, 0x93, 0x0b, 0x17, 0x7f, 0x2b, 0x2d, 0x77, 0xfd, 0x91, + 0xcd, 0x6a, 0x1f, 0x88, 0xae, 0x2f, 0x7e, 0x36, 0x03, 0x63, 0xac, 0x59, 0x4b, 0x9a, 0xb3, 0x76, + 0x62, 0xc2, 0x1c, 0x64, 0x81, 0x60, 0x5f, 0xe1, 0x49, 0x12, 0xc7, 0x8d, 0xf4, 0x15, 0x1e, 0xbc, + 0xdb, 0x57, 0x78, 0xf8, 0xe2, 0x4f, 0x67, 0x83, 0xee, 0x38, 0x31, 0x80, 0x8e, 0xba, 0x3b, 0xc8, + 0x22, 0x9c, 0x16, 0x73, 0x9b, 0x07, 0xc2, 0x64, 0x3f, 0x62, 0xfe, 0xe2, 0x39, 0x43, 0xc5, 0xb4, + 0xd8, 0x71, 0xa8, 0x5d, 0x77, 0x35, 0x67, 0xad, 0x8e, 0xd9, 0x81, 0xd4, 0xc4, 0x82, 0x8c, 0xa1, + 0x98, 0xd5, 0xc2, 0x0c, 0x07, 0x03, 0x86, 0xde, 0x84, 0x18, 0x63, 0x98, 0x54, 0xb0, 0xf8, 0xf3, + 0x29, 0xc8, 0x47, 0x3f, 0x87, 0x5c, 0x85, 0x41, 0xf6, 0xdb, 0x0f, 0x7a, 0x22, 0x5c, 0xb2, 0x03, + 0x8e, 0xdc, 0x5f, 0xc8, 0xa3, 0x21, 0x2f, 0xc3, 0x10, 0xba, 0x66, 0x61, 0x81, 0x74, 0x10, 0x6b, + 0x26, 0x28, 0x80, 0x19, 0xb6, 0x79, 0xb1, 0x80, 0x94, 0xbc, 0x06, 0xc3, 0x95, 0xc0, 0x07, 0x55, + 0x5c, 0x40, 0xa3, 0xeb, 0xbb, 0x54, 0x32, 0x20, 0x50, 0x65, 0xea, 0xe2, 0xd7, 0xd2, 0x81, 0xaa, + 0x9f, 0x98, 0xa6, 0x07, 0x32, 0x4d, 0x7f, 0x26, 0x03, 0xa3, 0x65, 0xcb, 0x74, 0xb5, 0x86, 0x7b, + 0x72, 0x18, 0x7c, 0x90, 0x43, 0x36, 0x52, 0x80, 0xfe, 0xe9, 0x96, 0x66, 0x34, 0x85, 0xe1, 0x83, + 0x11, 0xb1, 0x29, 0x03, 0xa8, 0x1c, 0x4e, 0x6e, 0x60, 0x1c, 0x28, 0x26, 0x69, 0xdf, 0x11, 0x6f, + 0x2c, 0x08, 0x1e, 0x2c, 0xa1, 0x44, 0xfa, 0x6c, 0x0e, 0xe0, 0x23, 0x47, 0x2e, 0x29, 0xf7, 0xd9, + 0xc9, 0xc1, 0xe8, 0x31, 0xe9, 0xb3, 0x2f, 0x64, 0xe0, 0x6c, 0xd4, 0x21, 0xf0, 0x64, 0xc0, 0x89, + 0xce, 0xfb, 0x2b, 0x70, 0x3a, 0x2a, 0x9b, 0x29, 0x26, 0x8d, 0xfe, 0xde, 0xbe, 0x23, 0x57, 0xb7, + 0xb7, 0x0a, 0x8f, 0xc6, 0x7d, 0x31, 0x59, 0x65, 0x89, 0xde, 0x24, 0x89, 0x95, 0x24, 0xf6, 0xcc, + 0xfb, 0xe4, 0x95, 0xf0, 0x03, 0xde, 0x33, 0x3f, 0x9a, 0x8e, 0xf7, 0xcc, 0xc9, 0x84, 0x27, 0x16, + 0xee, 0xdf, 0x4e, 0xc3, 0x13, 0x51, 0xe1, 0xbc, 0xf5, 0xd2, 0x73, 0xaf, 0xa8, 0xd4, 0x0b, 0x1a, + 0x7a, 0x32, 0xbd, 0x08, 0x25, 0xc6, 0xe8, 0xaf, 0x9a, 0xe3, 0xbf, 0x1c, 0x14, 0xd1, 0x5f, 0x19, + 0x44, 0x15, 0x98, 0x5d, 0x88, 0xf3, 0x64, 0x4e, 0xd8, 0x83, 0x38, 0x7f, 0x62, 0x47, 0x71, 0x9e, + 0x0c, 0x64, 0xcf, 0x5d, 0x2d, 0x0b, 0x70, 0xc3, 0x70, 0x45, 0x68, 0xe5, 0x63, 0x7e, 0x55, 0x26, + 0xf9, 0xb9, 0x66, 0xf7, 0xe5, 0xe7, 0x1a, 0x04, 0x4c, 0xea, 0xdf, 0x47, 0xc0, 0xa4, 0x37, 0x60, + 0x40, 0xc8, 0x51, 0xec, 0xdb, 0xcf, 0x05, 0x5f, 0x81, 0xe0, 0x6e, 0xd5, 0x7b, 0xd2, 0x7f, 0x12, + 0x06, 0x1c, 0x1e, 0x44, 0x4c, 0xec, 0xab, 0xf1, 0x3d, 0x8d, 0x00, 0xa9, 0xde, 0x1f, 0xe4, 0x22, + 0x60, 0x3e, 0x0c, 0xf9, 0xb9, 0x0b, 0xcf, 0x8f, 0xc1, 0xfe, 0x25, 0x15, 0x18, 0x10, 0xaf, 0x06, + 0x14, 0xc0, 0xb7, 0xba, 0xbe, 0x5a, 0x06, 0xfd, 0xcc, 0x1f, 0x0f, 0xf0, 0x33, 0x6b, 0x41, 0x2c, + 0x3f, 0x62, 0x16, 0xa0, 0xe2, 0xaf, 0xa5, 0x20, 0x1f, 0x2d, 0x44, 0x9e, 0x81, 0x1c, 0xff, 0x4b, + 0xec, 0xd0, 0x31, 0x96, 0x29, 0x2f, 0x21, 0xc7, 0x32, 0x15, 0xd4, 0x2f, 0xc1, 0x90, 0xea, 0x3d, + 0x05, 0x11, 0x3b, 0x74, 0xf4, 0xdf, 0xf5, 0xdf, 0x87, 0xc8, 0xfe, 0xbb, 0x3e, 0x25, 0x79, 0x1c, + 0x32, 0x8b, 0x4d, 0x5d, 0x6c, 0xcc, 0xf1, 0xcd, 0x8e, 0xd5, 0x94, 0x03, 0xb5, 0x32, 0x2c, 0x23, + 0x5a, 0xa0, 0x1b, 0xc2, 0xd9, 0x1b, 0x89, 0x4c, 0xba, 0x21, 0x13, 0x2d, 0xd0, 0x8d, 0xe2, 0xef, + 0xa4, 0x3c, 0xf7, 0xdd, 0x39, 0xc3, 0x71, 0x2b, 0xe6, 0xba, 0xd6, 0x34, 0xfc, 0x8e, 0x20, 0x37, + 0x60, 0x2c, 0x40, 0x4a, 0x6f, 0xfe, 0x63, 0xb1, 0x71, 0xf0, 0x55, 0xf8, 0xa3, 0x01, 0xef, 0x48, + 0x31, 0x72, 0x49, 0x52, 0x7e, 0xe9, 0xd4, 0x42, 0x7e, 0x48, 0x2e, 0x5c, 0xb1, 0x47, 0xe6, 0x0d, + 0xc7, 0x31, 0xcc, 0x15, 0xfe, 0x1e, 0x31, 0x83, 0x4f, 0x8d, 0xf0, 0xfc, 0xa4, 0xc5, 0xe1, 0x75, + 0x9b, 0x21, 0xe4, 0x37, 0xd3, 0x72, 0x81, 0xe2, 0x7f, 0x48, 0xc1, 0x05, 0xc6, 0x09, 0xa3, 0x74, + 0xc6, 0x3e, 0xec, 0x40, 0x03, 0xb8, 0xd5, 0x43, 0x52, 0x62, 0x54, 0x3f, 0x16, 0x0f, 0x4c, 0x11, + 0x21, 0x8c, 0x70, 0xef, 0x21, 0xfb, 0xfd, 0x05, 0x4a, 0xfb, 0xed, 0x14, 0x5e, 0x0f, 0x2e, 0x37, + 0xe9, 0xed, 0x85, 0xca, 0x5b, 0x87, 0x74, 0x81, 0xbd, 0xdf, 0xa9, 0xeb, 0x4d, 0xc8, 0x3b, 0xd8, + 0x96, 0x7a, 0xc7, 0x34, 0xee, 0xe3, 0xc9, 0x97, 0xf8, 0x98, 0xb3, 0xd2, 0xc7, 0x48, 0x6d, 0x55, + 0xc7, 0x38, 0xfd, 0x6d, 0xd3, 0xb8, 0x8f, 0x41, 0x4a, 0x3f, 0x86, 0x71, 0xdf, 0x25, 0x0a, 0x72, + 0x01, 0x06, 0x19, 0x1f, 0xd3, 0x57, 0x46, 0xd5, 0xff, 0x4d, 0xf2, 0x90, 0xe9, 0x18, 0x3a, 0x36, + 0xb3, 0x5f, 0x65, 0x7f, 0x16, 0xff, 0x20, 0x03, 0x13, 0xa5, 0xbb, 0xb5, 0x4a, 0xd9, 0x7f, 0xc5, + 0x20, 0x1e, 0x9a, 0xb6, 0xf6, 0x28, 0x0b, 0x8f, 0x9e, 0x94, 0x61, 0x8c, 0x07, 0x0a, 0x10, 0xc1, + 0xec, 0xf9, 0xb9, 0x54, 0x3f, 0x7f, 0x4d, 0x11, 0xc6, 0x48, 0x4a, 0x3a, 0x8a, 0x18, 0x11, 0xf3, + 0xde, 0x21, 0x0d, 0x38, 0x1f, 0x22, 0xad, 0x6b, 0x7e, 0x1c, 0x36, 0x2f, 0x06, 0xc6, 0x53, 0xdb, + 0x5b, 0x85, 0xc7, 0xbb, 0x12, 0x49, 0xac, 0xcf, 0xc9, 0xac, 0x83, 0x78, 0x6e, 0x0e, 0xb9, 0x05, + 0x13, 0xbc, 0x3c, 0x1e, 0xda, 0xf9, 0x4e, 0x12, 0x8c, 0xb9, 0x14, 0xef, 0x40, 0x42, 0xca, 0xb1, + 0xad, 0x10, 0xc9, 0x04, 0x2e, 0x1e, 0x09, 0xdf, 0x85, 0x33, 0x9c, 0xbe, 0x4d, 0x6d, 0x1c, 0x89, + 0x96, 0x59, 0x77, 0xa8, 0x2b, 0xde, 0x1a, 0x4f, 0x3e, 0xbe, 0xbd, 0x55, 0x28, 0x24, 0x12, 0x48, + 0x4c, 0x4f, 0x21, 0x41, 0xd5, 0xc7, 0xd7, 0xa8, 0x2b, 0xfb, 0x69, 0xe4, 0xf6, 0xa0, 0xe6, 0x3f, + 0x96, 0x86, 0x73, 0xb3, 0x54, 0x6b, 0xba, 0xab, 0xe5, 0x55, 0xda, 0x58, 0x3b, 0x71, 0x95, 0x0e, + 0x59, 0x2d, 0x89, 0xd2, 0x39, 0x31, 0x91, 0x7b, 0x49, 0xe7, 0xc4, 0xe2, 0x15, 0xd2, 0xf9, 0x52, + 0x1a, 0x2e, 0x27, 0x6d, 0x0e, 0xf0, 0x76, 0xc0, 0x5e, 0x5c, 0xa7, 0xb6, 0x6d, 0xe8, 0xf4, 0x08, + 0x17, 0x95, 0xc3, 0xb3, 0x87, 0xe5, 0x0e, 0xcb, 0xee, 0xd3, 0x23, 0x76, 0x77, 0xe2, 0x3a, 0xc2, + 0x24, 0x36, 0xef, 0x2f, 0x71, 0xfd, 0x48, 0x1a, 0x4e, 0xd7, 0x8c, 0x15, 0xc7, 0xb5, 0x6c, 0x5a, + 0xc5, 0x88, 0x1d, 0x27, 0x9a, 0xd4, 0x55, 0x34, 0x47, 0x98, 0x2b, 0xea, 0xfd, 0x2e, 0x9a, 0x93, + 0x01, 0x25, 0x44, 0xf3, 0x1d, 0x19, 0x18, 0x9f, 0x2f, 0x57, 0xc5, 0x0e, 0x1d, 0xd3, 0xf3, 0x1d, + 0xcf, 0x37, 0xb4, 0xc1, 0xd9, 0x42, 0x76, 0x1f, 0x67, 0x0b, 0x87, 0xe7, 0x5e, 0x20, 0xb2, 0x87, + 0xe6, 0xf6, 0x92, 0x3d, 0xb4, 0xf8, 0x99, 0x0c, 0x8c, 0x06, 0xbd, 0x30, 0x7d, 0x44, 0x27, 0x45, + 0x0f, 0x76, 0x1f, 0x7c, 0x23, 0x05, 0x13, 0xf3, 0xe5, 0xea, 0xcd, 0xda, 0xe2, 0x82, 0x5a, 0x2d, + 0xcf, 0x53, 0xc7, 0xd1, 0x56, 0x28, 0x79, 0x12, 0x06, 0x04, 0x44, 0x1c, 0x5d, 0xe0, 0x99, 0xd1, + 0x3b, 0x8e, 0x65, 0xda, 0xed, 0x86, 0xea, 0xe1, 0x44, 0xde, 0x9b, 0x74, 0x8f, 0xbc, 0x37, 0x45, + 0x10, 0xa9, 0x51, 0xc5, 0xa9, 0x4b, 0x28, 0x59, 0x2a, 0xff, 0x9f, 0x2c, 0x42, 0xae, 0xad, 0xd9, + 0x5a, 0xcb, 0xd9, 0xe9, 0x0a, 0xe6, 0x91, 0xed, 0xad, 0x42, 0x9e, 0x93, 0x26, 0x5e, 0xb9, 0x08, + 0x36, 0x6c, 0x74, 0x4f, 0x04, 0x7a, 0x25, 0x25, 0xd5, 0xdd, 0xf7, 0xf6, 0xf5, 0x65, 0xc8, 0x76, + 0xf6, 0xa8, 0x5b, 0x1d, 0xa1, 0x5b, 0xce, 0xbe, 0x74, 0x4b, 0x94, 0xf2, 0xfa, 0x34, 0xbb, 0xa7, + 0xac, 0xbc, 0x41, 0xc0, 0xce, 0xfe, 0xdd, 0x07, 0xec, 0x24, 0x0b, 0x30, 0xd0, 0xe2, 0xdd, 0x2f, + 0x54, 0xc8, 0x0f, 0xc7, 0x17, 0xd3, 0x8f, 0xc9, 0xf3, 0x22, 0x7f, 0xe6, 0x84, 0x28, 0x21, 0x9f, + 0xf3, 0x09, 0x50, 0xf1, 0xf7, 0xd3, 0x70, 0x36, 0xe8, 0x85, 0x05, 0xcb, 0x35, 0xee, 0x19, 0xfc, + 0x9c, 0xfc, 0x01, 0xea, 0x0a, 0x49, 0xa8, 0xfd, 0x87, 0x21, 0xd4, 0x3f, 0xce, 0xc0, 0xe9, 0x49, + 0xab, 0x63, 0xea, 0xb7, 0xe8, 0x66, 0x5b, 0x33, 0x6c, 0x95, 0x36, 0xac, 0x75, 0x6a, 0x6f, 0x1e, + 0x81, 0xb3, 0xd0, 0xe1, 0xad, 0xe8, 0xcf, 0xc0, 0xd0, 0x92, 0xb5, 0x46, 0x4d, 0x29, 0x68, 0x26, + 0x26, 0x3e, 0x74, 0x19, 0x90, 0xc7, 0xea, 0x08, 0x08, 0xc8, 0x73, 0x30, 0x30, 0x69, 0xf1, 0x63, + 0x55, 0x29, 0x73, 0xdb, 0xb2, 0x25, 0x8e, 0x53, 0x25, 0xa1, 0x09, 0x32, 0xf2, 0x32, 0x0c, 0x55, + 0x3b, 0xcb, 0x4d, 0xa3, 0x71, 0x8b, 0x7a, 0x3e, 0xbc, 0xe8, 0xd0, 0xd5, 0x46, 0x60, 0x7d, 0x8d, + 0x6e, 0x86, 0xe2, 0x3d, 0x78, 0xa4, 0xe4, 0x23, 0x30, 0xea, 0xc9, 0xb7, 0x6c, 0x75, 0x4c, 0x17, + 0x7d, 0x25, 0x44, 0xca, 0x2c, 0x5b, 0x20, 0xea, 0x78, 0x80, 0xa4, 0x86, 0x09, 0xc9, 0x4b, 0x30, + 0xe2, 0x01, 0xe6, 0x2d, 0x9d, 0xca, 0x21, 0xa7, 0xfc, 0x82, 0x2d, 0x4b, 0xa7, 0x6a, 0x88, 0xac, + 0xf8, 0x1b, 0xd1, 0xde, 0xb5, 0x5c, 0x7f, 0xc0, 0x9c, 0xf4, 0x6e, 0x97, 0xde, 0x5d, 0x84, 0x89, + 0xaa, 0x4d, 0xd7, 0x0d, 0xab, 0xe3, 0x44, 0x7b, 0xf9, 0xb1, 0xed, 0xad, 0xc2, 0xc3, 0x6d, 0x81, + 0xac, 0x27, 0x76, 0x77, 0xbc, 0x2c, 0x79, 0x13, 0x46, 0x16, 0xe8, 0x46, 0xc0, 0x6b, 0x20, 0x88, + 0xfb, 0x62, 0xd2, 0x8d, 0x64, 0x36, 0xa1, 0x12, 0xc5, 0xdf, 0x48, 0xc3, 0x53, 0x72, 0x3f, 0xde, + 0xb4, 0x0c, 0x13, 0x1d, 0x14, 0xef, 0x50, 0xdb, 0x9f, 0x05, 0x67, 0x34, 0xa3, 0x79, 0xc0, 0x30, + 0x39, 0x1f, 0xf0, 0xae, 0x7d, 0x7a, 0x9e, 0x3b, 0xad, 0xde, 0x32, 0x4c, 0x9d, 0x9c, 0x87, 0x33, + 0xb7, 0x6b, 0xd3, 0x6a, 0xfd, 0x56, 0x65, 0x61, 0xaa, 0x7e, 0x7b, 0xa1, 0x56, 0x9d, 0x2e, 0x57, + 0x66, 0x2a, 0xd3, 0x53, 0xf9, 0x3e, 0x72, 0x0a, 0xc6, 0x03, 0xd4, 0xec, 0xed, 0xf9, 0xd2, 0x42, + 0x3e, 0x45, 0x26, 0x60, 0x34, 0x00, 0x4e, 0x2e, 0x2e, 0xe5, 0xd3, 0x4f, 0xff, 0x68, 0x0a, 0x80, + 0xf1, 0x5b, 0xb4, 0x8d, 0x15, 0xc3, 0x24, 0x0f, 0xc1, 0x39, 0xa4, 0x58, 0x54, 0x2b, 0x37, 0x2a, + 0x0b, 0x11, 0x9e, 0x67, 0x60, 0x42, 0x46, 0xce, 0x2d, 0x96, 0x4b, 0x73, 0xf9, 0x94, 0x5f, 0x95, + 0x00, 0xd7, 0x6a, 0x8b, 0xf9, 0x34, 0x39, 0x0d, 0x79, 0x19, 0xb8, 0x78, 0x6b, 0xa9, 0x94, 0xcf, + 0x44, 0xa1, 0xb5, 0x72, 0x65, 0x3e, 0x9f, 0x25, 0xe7, 0xe0, 0x94, 0x0c, 0x9d, 0x5e, 0x58, 0x52, + 0x4b, 0x95, 0xa9, 0x7c, 0xff, 0xd3, 0x4f, 0xc1, 0x30, 0x86, 0xf8, 0x14, 0x57, 0x5c, 0x23, 0x30, + 0xb8, 0x38, 0x59, 0x9b, 0x56, 0xef, 0x60, 0x6b, 0x00, 0x72, 0x53, 0xd3, 0x0b, 0xac, 0x65, 0xa9, + 0xa7, 0xff, 0x5d, 0x0a, 0xa0, 0x36, 0xb3, 0x54, 0x15, 0x84, 0xc3, 0x30, 0x50, 0x59, 0xb8, 0x53, + 0x9a, 0xab, 0x30, 0xba, 0x41, 0xc8, 0x2e, 0x56, 0xa7, 0xd9, 0xe7, 0x0f, 0x41, 0x7f, 0x79, 0x6e, + 0xb1, 0x36, 0x9d, 0x4f, 0x33, 0xa0, 0x3a, 0x5d, 0x9a, 0xca, 0x67, 0x18, 0xf0, 0xae, 0x5a, 0x59, + 0x9a, 0xce, 0x67, 0xd9, 0x9f, 0x73, 0xb5, 0xa5, 0xd2, 0x52, 0xbe, 0x9f, 0xfd, 0x39, 0x83, 0x7f, + 0xe6, 0x18, 0xb3, 0xda, 0xf4, 0x12, 0xfe, 0x18, 0x60, 0x4d, 0x98, 0xf1, 0x7e, 0x0d, 0x32, 0x14, + 0x63, 0x3d, 0x55, 0x51, 0xf3, 0x43, 0xec, 0x07, 0x63, 0xc9, 0x7e, 0x00, 0x6b, 0x9c, 0x3a, 0x3d, + 0xbf, 0x78, 0x67, 0x3a, 0x3f, 0xcc, 0x78, 0xcd, 0xdf, 0x62, 0xe0, 0x11, 0xf6, 0xa7, 0x3a, 0xcf, + 0xfe, 0x1c, 0x65, 0x9c, 0xd4, 0xe9, 0xd2, 0x5c, 0xb5, 0xb4, 0x34, 0x9b, 0x1f, 0x63, 0xed, 0x41, + 0x9e, 0xe3, 0xbc, 0xe4, 0x42, 0x69, 0x7e, 0x3a, 0x9f, 0x17, 0x34, 0x53, 0x73, 0x95, 0x85, 0x5b, + 0xf9, 0x09, 0x6c, 0xc8, 0xdb, 0xf3, 0xf8, 0x83, 0xb0, 0x02, 0xf8, 0xd7, 0xa9, 0xa7, 0xbf, 0x05, + 0x72, 0x8b, 0x35, 0x74, 0xb6, 0x3d, 0x07, 0xa7, 0x16, 0x6b, 0xf5, 0xa5, 0xb7, 0xab, 0xd3, 0x91, + 0x8e, 0x9b, 0x80, 0x51, 0x0f, 0x31, 0x57, 0x59, 0xb8, 0xfd, 0x16, 0x57, 0x05, 0x0f, 0x34, 0x5f, + 0x2a, 0x2f, 0xd6, 0xf2, 0x69, 0xd6, 0x8f, 0x1e, 0xe8, 0x6e, 0x65, 0x61, 0x6a, 0xf1, 0x6e, 0x2d, + 0x9f, 0x79, 0x7a, 0x1d, 0x46, 0xa6, 0xe8, 0xba, 0xd1, 0xa0, 0x42, 0x41, 0x1e, 0x86, 0xf3, 0x53, + 0xd3, 0x77, 0x2a, 0xe5, 0xe9, 0xae, 0x2a, 0x12, 0x46, 0x97, 0xaa, 0x95, 0x7c, 0x8a, 0x9c, 0x05, + 0x12, 0x06, 0xdf, 0x2c, 0xcd, 0xcf, 0xe4, 0xd3, 0x44, 0x81, 0xd3, 0x61, 0x78, 0x65, 0x61, 0xe9, + 0xf6, 0xc2, 0x74, 0x3e, 0xf3, 0xf4, 0xdf, 0x4d, 0xc1, 0x99, 0xe9, 0xa6, 0xe6, 0xb8, 0x46, 0xc3, + 0xa1, 0x9a, 0xdd, 0x58, 0x2d, 0x6b, 0x2e, 0x5d, 0xb1, 0xec, 0x4d, 0x52, 0x84, 0x47, 0xa6, 0xe7, + 0x4a, 0xb5, 0xa5, 0x4a, 0xb9, 0x36, 0x5d, 0x52, 0xcb, 0xb3, 0xf5, 0x72, 0x69, 0x69, 0xfa, 0xc6, + 0xa2, 0xfa, 0x76, 0xfd, 0xc6, 0xf4, 0xc2, 0xb4, 0x5a, 0x9a, 0xcb, 0xf7, 0x91, 0xc7, 0xa1, 0xd0, + 0x85, 0xa6, 0x36, 0x5d, 0xbe, 0xad, 0x56, 0x96, 0xde, 0xce, 0xa7, 0xc8, 0x63, 0xf0, 0x70, 0x57, + 0x22, 0xf6, 0x3b, 0x9f, 0x26, 0x8f, 0xc0, 0x85, 0x6e, 0x24, 0x1f, 0x9f, 0xcb, 0x67, 0x9e, 0xfe, + 0x91, 0x14, 0x90, 0xc5, 0x36, 0x35, 0x6b, 0xe1, 0x26, 0x3e, 0x0a, 0x17, 0x99, 0x5e, 0xd4, 0xbb, + 0x37, 0xf0, 0x31, 0x78, 0x38, 0x91, 0x42, 0x6a, 0x5e, 0x01, 0x1e, 0xea, 0x42, 0x22, 0x1a, 0x77, + 0x11, 0x94, 0x64, 0x02, 0x6c, 0xda, 0xcf, 0xa5, 0xe0, 0x4c, 0x62, 0xd4, 0x3b, 0x72, 0x19, 0x9e, + 0x28, 0x4d, 0xcd, 0xb3, 0xbe, 0x29, 0x2f, 0x55, 0x16, 0x17, 0x6a, 0xf5, 0xf9, 0x99, 0x52, 0x9d, + 0x69, 0xdf, 0xed, 0x5a, 0xa4, 0x37, 0x2f, 0x41, 0xb1, 0x07, 0x65, 0x79, 0xb6, 0xb4, 0x70, 0x83, + 0x0d, 0x3f, 0xf2, 0x04, 0x3c, 0xda, 0x95, 0x6e, 0x7a, 0xa1, 0x34, 0x39, 0x37, 0x3d, 0x95, 0x4f, + 0x93, 0x27, 0xe1, 0xb1, 0xae, 0x54, 0x53, 0x95, 0x1a, 0x27, 0xcb, 0x3c, 0xad, 0x85, 0x7c, 0x31, + 0xd9, 0x57, 0x96, 0x17, 0x17, 0x96, 0x4a, 0xe5, 0xa5, 0x24, 0xcd, 0x3e, 0x0f, 0x67, 0x42, 0xd8, + 0xc9, 0xdb, 0xb5, 0xca, 0xc2, 0x74, 0xad, 0x96, 0x4f, 0xc5, 0x50, 0xbe, 0x68, 0xd3, 0x93, 0x53, + 0x5f, 0xfb, 0x9f, 0x1f, 0xe9, 0xfb, 0xda, 0x9f, 0x3d, 0x92, 0xfa, 0xbd, 0x3f, 0x7b, 0x24, 0xf5, + 0xaf, 0xff, 0xec, 0x91, 0xd4, 0x27, 0xae, 0xaf, 0x18, 0xee, 0x6a, 0x67, 0xf9, 0x6a, 0xc3, 0x6a, + 0x5d, 0x5b, 0xb1, 0xb5, 0x75, 0x83, 0x1b, 0x19, 0x5a, 0xf3, 0x9a, 0x4b, 0x9b, 0x18, 0x6e, 0xfd, + 0x9a, 0xd6, 0x36, 0xae, 0x61, 0x76, 0xca, 0x6b, 0x7c, 0x59, 0x58, 0xce, 0xe1, 0x5e, 0xec, 0x85, + 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x15, 0xab, 0x79, 0xf9, 0xc1, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -34492,6 +34721,75 @@ func (m *OneOf_MCPSessionNotification) MarshalToSizedBuffer(dAtA []byte) (int, e } return len(dAtA) - i, nil } +func (m *OneOf_BoundKeypairRecovery) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_BoundKeypairRecovery) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.BoundKeypairRecovery != nil { + { + size, err := m.BoundKeypairRecovery.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xd + i-- + dAtA[i] = 0xe2 + } + return len(dAtA) - i, nil +} +func (m *OneOf_BoundKeypairRotation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_BoundKeypairRotation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.BoundKeypairRotation != nil { + { + size, err := m.BoundKeypairRotation.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xd + i-- + dAtA[i] = 0xea + } + return len(dAtA) - i, nil +} +func (m *OneOf_BoundKeypairJoinStateVerificationFailed) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_BoundKeypairJoinStateVerificationFailed) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.BoundKeypairJoinStateVerificationFailed != nil { + { + size, err := m.BoundKeypairJoinStateVerificationFailed.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xd + i-- + dAtA[i] = 0xf2 + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -34516,12 +34814,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n692, err692 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err692 != nil { - return 0, err692 + n695, err695 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err695 != nil { + return 0, err695 } - i -= n692 - i = encodeVarintEvents(dAtA, i, uint64(n692)) + i -= n695 + i = encodeVarintEvents(dAtA, i, uint64(n695)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -34680,12 +34978,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n696, err696 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err696 != nil { - return 0, err696 + n699, err699 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err699 != nil { + return 0, err699 } - i -= n696 - i = encodeVarintEvents(dAtA, i, uint64(n696)) + i -= n699 + i = encodeVarintEvents(dAtA, i, uint64(n699)) i-- dAtA[i] = 0x1 i-- @@ -34833,12 +35131,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n700, err700 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err700 != nil { - return 0, err700 + n703, err703 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err703 != nil { + return 0, err703 } - i -= n700 - i = encodeVarintEvents(dAtA, i, uint64(n700)) + i -= n703 + i = encodeVarintEvents(dAtA, i, uint64(n703)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -43735,6 +44033,252 @@ func (m *MCPSessionNotification) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *BoundKeypairRecovery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BoundKeypairRecovery) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BoundKeypairRecovery) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.RecoveryMode) > 0 { + i -= len(m.RecoveryMode) + copy(dAtA[i:], m.RecoveryMode) + i = encodeVarintEvents(dAtA, i, uint64(len(m.RecoveryMode))) + i-- + dAtA[i] = 0x42 + } + if m.RecoveryCount != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.RecoveryCount)) + i-- + dAtA[i] = 0x38 + } + if len(m.PublicKey) > 0 { + i -= len(m.PublicKey) + copy(dAtA[i:], m.PublicKey) + i = encodeVarintEvents(dAtA, i, uint64(len(m.PublicKey))) + i-- + dAtA[i] = 0x32 + } + if len(m.BotName) > 0 { + i -= len(m.BotName) + copy(dAtA[i:], m.BotName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.BotName))) + i-- + dAtA[i] = 0x2a + } + if len(m.TokenName) > 0 { + i -= len(m.TokenName) + copy(dAtA[i:], m.TokenName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.TokenName))) + i-- + dAtA[i] = 0x22 + } + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *BoundKeypairRotation) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BoundKeypairRotation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BoundKeypairRotation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.NewPublicKey) > 0 { + i -= len(m.NewPublicKey) + copy(dAtA[i:], m.NewPublicKey) + i = encodeVarintEvents(dAtA, i, uint64(len(m.NewPublicKey))) + i-- + dAtA[i] = 0x3a + } + if len(m.PreviousPublicKey) > 0 { + i -= len(m.PreviousPublicKey) + copy(dAtA[i:], m.PreviousPublicKey) + i = encodeVarintEvents(dAtA, i, uint64(len(m.PreviousPublicKey))) + i-- + dAtA[i] = 0x32 + } + if len(m.BotName) > 0 { + i -= len(m.BotName) + copy(dAtA[i:], m.BotName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.BotName))) + i-- + dAtA[i] = 0x2a + } + if len(m.TokenName) > 0 { + i -= len(m.TokenName) + copy(dAtA[i:], m.TokenName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.TokenName))) + i-- + dAtA[i] = 0x22 + } + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *BoundKeypairJoinStateVerificationFailed) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BoundKeypairJoinStateVerificationFailed) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BoundKeypairJoinStateVerificationFailed) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.BotName) > 0 { + i -= len(m.BotName) + copy(dAtA[i:], m.BotName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.BotName))) + i-- + dAtA[i] = 0x2a + } + if len(m.TokenName) > 0 { + i -= len(m.TokenName) + copy(dAtA[i:], m.TokenName) + i = encodeVarintEvents(dAtA, i, uint64(len(m.TokenName))) + i-- + dAtA[i] = 0x22 + } + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -50334,6 +50878,42 @@ func (m *OneOf_MCPSessionNotification) Size() (n int) { } return n } +func (m *OneOf_BoundKeypairRecovery) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BoundKeypairRecovery != nil { + l = m.BoundKeypairRecovery.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_BoundKeypairRotation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BoundKeypairRotation != nil { + l = m.BoundKeypairRotation.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_BoundKeypairJoinStateVerificationFailed) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BoundKeypairJoinStateVerificationFailed != nil { + l = m.BoundKeypairJoinStateVerificationFailed.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -53575,6 +54155,103 @@ func (m *MCPSessionNotification) Size() (n int) { return n } +func (m *BoundKeypairRecovery) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.TokenName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.BotName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.PublicKey) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.RecoveryCount != 0 { + n += 1 + sovEvents(uint64(m.RecoveryCount)) + } + l = len(m.RecoveryMode) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BoundKeypairRotation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.TokenName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.BotName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.PreviousPublicKey) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.NewPublicKey) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BoundKeypairJoinStateVerificationFailed) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.TokenName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.BotName) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -94069,62 +94746,11 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { } m.Event = &OneOf_MCPSessionNotification{v} iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StreamStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StreamStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 220: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BoundKeypairRecovery", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94134,46 +94760,30 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UploadID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) - } - m.LastEventIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastEventIndex |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + v := &BoundKeypairRecovery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - case 3: + m.Event = &OneOf_BoundKeypairRecovery{v} + iNdEx = postIndex + case 221: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BoundKeypairRotation", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -94200,64 +94810,15 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + v := &BoundKeypairRotation{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Event = &OneOf_BoundKeypairRotation{v} iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SessionUpload) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 222: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BoundKeypairJoinStateVerificationFailed", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -94284,15 +94845,68 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &BoundKeypairJoinStateVerificationFailed{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Event = &OneOf_BoundKeypairJoinStateVerificationFailed{v} iNdEx = postIndex - case 2: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StreamStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StreamStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94302,30 +94916,48 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.UploadID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) + } + m.LastEventIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LastEventIndex |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94335,23 +94967,24 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.SessionURL = string(dAtA[iNdEx:postIndex]) + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -94375,7 +95008,7 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } return nil } -func (m *Identity) Unmarshal(dAtA []byte) error { +func (m *SessionUpload) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -94398,17 +95031,17 @@ func (m *Identity) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Identity: wiretype end group for non-group") + return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94418,29 +95051,30 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.User = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94450,27 +95084,28 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Impersonator = string(dAtA[iNdEx:postIndex]) + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94498,11 +95133,62 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.SessionURL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Identity) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Identity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94530,11 +95216,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94562,11 +95248,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) + m.Impersonator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94594,11 +95280,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 7: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94626,13 +95312,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) + m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 8: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94642,28 +95328,27 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 9: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94691,11 +95376,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RouteToCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 10: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94723,11 +95408,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 11: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -94754,15 +95439,15 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 12: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToApp", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94772,31 +95457,27 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.RouteToApp == nil { - m.RouteToApp = &RouteToApp{} - } - if err := m.RouteToApp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.RouteToCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 13: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TeleportCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -94824,11 +95505,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TeleportCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 14: + case 11: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToDatabase", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -94855,18 +95536,15 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.RouteToDatabase == nil { - m.RouteToDatabase = &RouteToDatabase{} - } - if err := m.RouteToDatabase.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 15: + case 12: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseNames", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToApp", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -94876,27 +95554,131 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseNames = append(m.DatabaseNames, string(dAtA[iNdEx:postIndex])) + if m.RouteToApp == nil { + m.RouteToApp = &RouteToApp{} + } + if err := m.RouteToApp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 16: + case 13: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseUsers", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TeleportCluster", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TeleportCluster = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RouteToDatabase", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RouteToDatabase == nil { + m.RouteToDatabase = &RouteToDatabase{} + } + if err := m.RouteToDatabase.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseNames", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DatabaseNames = append(m.DatabaseNames, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -117667,7 +118449,483 @@ func (m *GitCommand) Unmarshal(dAtA []byte) error { } return nil } -func (m *GitCommandAction) Unmarshal(dAtA []byte) error { +func (m *GitCommandAction) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GitCommandAction: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GitCommandAction: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reference", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reference = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Old", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Old = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field New", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.New = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessListInvalidMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessListInvalidMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessListName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccessListName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MissingRoles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MissingRoles = append(m.MissingRoles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UserLoginAccessListInvalid: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserLoginAccessListInvalid: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessListInvalidMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AccessListInvalidMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -117690,17 +118948,17 @@ func (m *GitCommandAction) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GitCommandAction: wiretype end group for non-group") + return fmt.Errorf("proto: StableUNIXUserCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GitCommandAction: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StableUNIXUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -117710,29 +118968,30 @@ func (m *GitCommandAction) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Action = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reference", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -117742,29 +119001,30 @@ func (m *GitCommandAction) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Reference = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Old", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StableUnixUser", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -117774,55 +119034,27 @@ func (m *GitCommandAction) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Old = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field New", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents + if m.StableUnixUser == nil { + m.StableUnixUser = &StableUNIXUser{} } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.StableUnixUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.New = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -117846,7 +119078,7 @@ func (m *GitCommandAction) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { +func (m *StableUNIXUser) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -117869,15 +119101,15 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessListInvalidMetadata: wiretype end group for non-group") + return fmt.Errorf("proto: StableUNIXUser: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessListInvalidMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StableUNIXUser: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessListName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -117905,45 +119137,13 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AccessListName = string(dAtA[iNdEx:postIndex]) + m.Username = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.User = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MissingRoles", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType) } - var stringLen uint64 + m.Uid = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -117953,24 +119153,11 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Uid |= int32(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MissingRoles = append(m.MissingRoles, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -117993,7 +119180,7 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { +func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118016,10 +119203,10 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserLoginAccessListInvalid: wiretype end group for non-group") + return fmt.Errorf("proto: AWSICResourceSync: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserLoginAccessListInvalid: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AWSICResourceSync: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -118056,10 +119243,10 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessListInvalidMetadata", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalAccounts", wireType) } - var msglen int + m.TotalAccounts = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118069,26 +119256,69 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.TotalAccounts |= int32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthEvents + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalAccountAssignments", wireType) } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents + m.TotalAccountAssignments = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalAccountAssignments |= int32(b&0x7F) << shift + if b < 0x80 { + break + } } - if postIndex > l { - return io.ErrUnexpectedEOF + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalUserGroups", wireType) } - if err := m.AccessListInvalidMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.TotalUserGroups = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalUserGroups |= int32(b&0x7F) << shift + if b < 0x80 { + break + } } - iNdEx = postIndex - case 3: + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalPermissionSets", wireType) + } + m.TotalPermissionSets = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalPermissionSets |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } @@ -118143,7 +119373,7 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { } return nil } -func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { +func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118166,10 +119396,10 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StableUNIXUserCreate: wiretype end group for non-group") + return fmt.Errorf("proto: HealthCheckConfigCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StableUNIXUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HealthCheckConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -118207,7 +119437,7 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118234,13 +119464,13 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StableUnixUser", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118267,69 +119497,15 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.StableUnixUser == nil { - m.StableUnixUser = &StableUNIXUser{} - } - if err := m.StableUnixUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StableUNIXUser) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StableUNIXUser: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StableUNIXUser: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118339,43 +119515,25 @@ func (m *StableUNIXUser) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Username = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType) - } - m.Uid = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Uid |= int32(b&0x7F) << shift - if b < 0x80 { - break - } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -118398,7 +119556,7 @@ func (m *StableUNIXUser) Unmarshal(dAtA []byte) error { } return nil } -func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { +func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118421,10 +119579,10 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AWSICResourceSync: wiretype end group for non-group") + return fmt.Errorf("proto: HealthCheckConfigUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AWSICResourceSync: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HealthCheckConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -118461,10 +119619,10 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalAccounts", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } - m.TotalAccounts = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118474,16 +119632,30 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TotalAccounts |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalAccountAssignments", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - m.TotalAccountAssignments = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118493,16 +119665,30 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TotalAccountAssignments |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalUserGroups", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - m.TotalUserGroups = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118512,16 +119698,81 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TotalUserGroups |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalPermissionSets", wireType) + if msglen < 0 { + return ErrInvalidLengthEvents } - m.TotalPermissionSets = 0 + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HealthCheckConfigDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HealthCheckConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118531,14 +119782,28 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TotalPermissionSets |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 6: + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118565,7 +119830,73 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -118591,7 +119922,7 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } return nil } -func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118614,10 +119945,10 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckConfigCreate: wiretype end group for non-group") + return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HealthCheckConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -118655,7 +119986,7 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118682,13 +120013,13 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118715,13 +120046,13 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118748,7 +120079,7 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -118774,7 +120105,7 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118797,10 +120128,10 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HealthCheckConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -118838,7 +120169,7 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118865,13 +120196,13 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118898,13 +120229,13 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118931,7 +120262,7 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -118957,7 +120288,7 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { +func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118980,10 +120311,10 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckConfigDelete: wiretype end group for non-group") + return fmt.Errorf("proto: SigstorePolicyCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HealthCheckConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SigstorePolicyCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -119021,7 +120352,7 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -119048,13 +120379,13 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -119081,13 +120412,13 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -119114,7 +120445,7 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -119140,7 +120471,7 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error { +func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -119163,10 +120494,10 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: wiretype end group for non-group") + return fmt.Errorf("proto: SigstorePolicyUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SigstorePolicyUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -119323,7 +120654,7 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error } return nil } -func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error { +func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -119346,10 +120677,10 @@ func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideDelete: wiretype end group for non-group") + return fmt.Errorf("proto: SigstorePolicyDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SigstorePolicyDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -119506,7 +120837,7 @@ func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error } return nil } -func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { +func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -119529,10 +120860,10 @@ func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SigstorePolicyCreate: wiretype end group for non-group") + return fmt.Errorf("proto: MCPSessionStart: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SigstorePolicyCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPSessionStart: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -119602,6 +120933,72 @@ func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -119630,130 +121027,196 @@ func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MCPSessionEnd: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MCPSessionEnd: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SigstorePolicyUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SigstorePolicyUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -119780,11 +121243,11 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -119817,9 +121280,9 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -119846,7 +121309,7 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -119872,7 +121335,7 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { +func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -119895,17 +121358,17 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SigstorePolicyDelete: wiretype end group for non-group") + return fmt.Errorf("proto: MCPJSONRPCMessage: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SigstorePolicyDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPJSONRPCMessage: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field JSONRPC", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -119915,30 +121378,29 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.JSONRPC = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -119948,30 +121410,29 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Method", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -119981,28 +121442,27 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Method = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120029,7 +121489,10 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Params == nil { + m.Params = &Struct{} + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -120055,7 +121518,7 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { +func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -120078,10 +121541,10 @@ func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MCPSessionStart: wiretype end group for non-group") + return fmt.Errorf("proto: MCPSessionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MCPSessionStart: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPSessionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -120185,7 +121648,7 @@ func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120212,13 +121675,13 @@ func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120245,13 +121708,13 @@ func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120278,7 +121741,7 @@ func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -120304,7 +121767,7 @@ func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { } return nil } -func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { +func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -120327,10 +121790,10 @@ func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MCPSessionEnd: wiretype end group for non-group") + return fmt.Errorf("proto: MCPSessionNotification: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MCPSessionEnd: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPSessionNotification: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -120434,7 +121897,7 @@ func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120461,46 +121924,13 @@ func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120527,7 +121957,7 @@ func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -120553,7 +121983,7 @@ func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { } return nil } -func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { +func (m *BoundKeypairRecovery) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -120576,15 +122006,114 @@ func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MCPJSONRPCMessage: wiretype end group for non-group") + return fmt.Errorf("proto: BoundKeypairRecovery: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MCPJSONRPCMessage: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BoundKeypairRecovery: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field JSONRPC", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -120612,11 +122141,11 @@ func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.JSONRPC = string(dAtA[iNdEx:postIndex]) + m.TokenName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BotName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -120644,11 +122173,11 @@ func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ID = string(dAtA[iNdEx:postIndex]) + m.BotName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Method", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -120676,13 +122205,32 @@ func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Method = string(dAtA[iNdEx:postIndex]) + m.PublicKey = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RecoveryCount", wireType) + } + m.RecoveryCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RecoveryCount |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RecoveryMode", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -120692,27 +122240,23 @@ func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Params == nil { - m.Params = &Struct{} - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.RecoveryMode = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -120736,7 +122280,7 @@ func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { } return nil } -func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { +func (m *BoundKeypairRotation) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -120759,10 +122303,10 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MCPSessionRequest: wiretype end group for non-group") + return fmt.Errorf("proto: BoundKeypairRotation: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MCPSessionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BoundKeypairRotation: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -120800,7 +122344,7 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120827,13 +122371,13 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -120860,15 +122404,15 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TokenName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -120878,30 +122422,29 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.TokenName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BotName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -120911,30 +122454,29 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.BotName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PreviousPublicKey", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -120944,24 +122486,55 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.PreviousPublicKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewPublicKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewPublicKey = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -120985,7 +122558,7 @@ func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { +func (m *BoundKeypairJoinStateVerificationFailed) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -121008,10 +122581,10 @@ func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MCPSessionNotification: wiretype end group for non-group") + return fmt.Errorf("proto: BoundKeypairJoinStateVerificationFailed: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MCPSessionNotification: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BoundKeypairJoinStateVerificationFailed: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -121049,7 +122622,7 @@ func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -121076,13 +122649,13 @@ func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -121109,15 +122682,15 @@ func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TokenName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -121127,30 +122700,29 @@ func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.TokenName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BotName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -121160,24 +122732,23 @@ func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.BotName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index 8cd8ba8c2899e..9aa57597c4060 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -902,6 +902,18 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_MCPSessionNotification{ MCPSessionNotification: e, } + case *BoundKeypairRecovery: + out.Event = &OneOf_BoundKeypairRecovery{ + BoundKeypairRecovery: e, + } + case *BoundKeypairRotation: + out.Event = &OneOf_BoundKeypairRotation{ + BoundKeypairRotation: e, + } + case *BoundKeypairJoinStateVerificationFailed: + out.Event = &OneOf_BoundKeypairJoinStateVerificationFailed{ + BoundKeypairJoinStateVerificationFailed: e, + } default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) unknown := &Unknown{} diff --git a/api/types/sessionrecording.go b/api/types/sessionrecording.go index 832bfcc59a8ec..4a10220505cbc 100644 --- a/api/types/sessionrecording.go +++ b/api/types/sessionrecording.go @@ -17,6 +17,7 @@ limitations under the License. package types import ( + "iter" "slices" "strings" "time" @@ -43,6 +44,16 @@ type SessionRecordingConfig interface { // SetProxyChecksHostKeys sets if the proxy will check host keys. SetProxyChecksHostKeys(bool) + // GetEncrypted gets if session recordings should be encrypted or not. + GetEncrypted() bool + + // GetEncryptionKeys gets the encryption keys for the session recording config. + GetEncryptionKeys() []*AgeEncryptionKey + + // SetEncryptionKeys sets the encryption keys for the session recording config. + // It returns true if there was a change applied and false otherwise. + SetEncryptionKeys(iter.Seq[*AgeEncryptionKey]) bool + // Clone returns a copy of the resource. Clone() SessionRecordingConfig } @@ -163,6 +174,62 @@ func (c *SessionRecordingConfigV2) SetProxyChecksHostKeys(t bool) { c.Spec.ProxyChecksHostKeys = NewBoolOption(t) } +// GetEncrypted gets if session recordings should be encrypted or not. +func (c *SessionRecordingConfigV2) GetEncrypted() bool { + encryption := c.Spec.Encryption + if encryption == nil { + return false + } + + return encryption.Enabled +} + +// GetEncryptionKeys gets the encryption keys for the session recording config. +func (c *SessionRecordingConfigV2) GetEncryptionKeys() []*AgeEncryptionKey { + if c.Status != nil { + return c.Status.EncryptionKeys + } + + return nil +} + +// SetEncryptionKeys sets the encryption keys for the session recording config. +// It returns true if there was a change applied and false otherwise. +func (c *SessionRecordingConfigV2) SetEncryptionKeys(keys iter.Seq[*AgeEncryptionKey]) bool { + existingKeys := make(map[string]struct{}) + for _, key := range c.GetEncryptionKeys() { + existingKeys[string(key.PublicKey)] = struct{}{} + } + + var keysChanged bool + var newKeys []*AgeEncryptionKey + addedKeys := make(map[string]struct{}) + for key := range keys { + if !keysChanged { + if _, exists := existingKeys[string(key.PublicKey)]; !exists { + keysChanged = true + } + } + + if _, added := addedKeys[string(key.PublicKey)]; !added { + addedKeys[string(key.PublicKey)] = struct{}{} + newKeys = append(newKeys, key) + } + + } + + if !keysChanged || len(newKeys) == 0 || len(existingKeys) == len(addedKeys) { + return false + } + + if c.Status == nil { + c.Status = &SessionRecordingConfigStatus{} + } + c.Status.EncryptionKeys = newKeys + + return true +} + // Clone returns a copy of the resource. func (c *SessionRecordingConfigV2) Clone() SessionRecordingConfig { return utils.CloneProtoMsg(c) diff --git a/build.assets/Dockerfile-grpcbox b/build.assets/Dockerfile-grpcbox index 52e77d45bb996..225c218587fc4 100644 --- a/build.assets/Dockerfile-grpcbox +++ b/build.assets/Dockerfile-grpcbox @@ -40,3 +40,8 @@ RUN \ go -C /teleport-module run -exec true google.golang.org/grpc/cmd/protoc-gen-go-grpc && \ go -C /teleport-module run -exec true google.golang.org/protobuf/cmd/protoc-gen-go && \ rm -rf /teleport-module + + ARG UID + ARG GID + RUN mkdir -p /.cache /.npm && \ + chown -R $UID:$GID /.cache /.npm /go/pkg/mod/ diff --git a/build.assets/grpcbox.mk b/build.assets/grpcbox.mk index 6b49e1d580c16..c8d193ff37519 100644 --- a/build.assets/grpcbox.mk +++ b/build.assets/grpcbox.mk @@ -19,14 +19,17 @@ DOCKER ?= docker # GRPCBOX_RUN has the necessary invocation to run a command inside the grpcbox. # Use this variable to run it from other Makefiles. -GRPCBOX_RUN := $(DOCKER) run -it --rm -v "$$(pwd)/../:/workdir" -w /workdir $(GRPCBOX) +UID := $$(id -u) +GID := $$(id -g) +GRPCBOX_RUN := $(DOCKER) run -it --rm -u $(UID):$(GID) -v "$$(pwd)/../:/workdir" -w /workdir $(GRPCBOX) # grpcbox builds a codegen-focused buildbox. # It's leaner, meaner, faster and not supposed to compile code. .PHONY: grpcbox grpcbox: - $(DOCKER) buildx build \ + $(DOCKER) build \ --build-arg BUF_VERSION=$(BUF_VERSION) \ + --build-arg UID=$(UID) --build-arg GID=$(GID) \ -f Dockerfile-grpcbox \ -t "$(GRPCBOX)" \ ../ diff --git a/go.mod b/go.mod index 98a5aaf94d1fa..4c556e40e2c76 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( cloud.google.com/go/storage v1.53.0 code.dny.dev/ssrf v0.2.0 connectrpc.com/connect v1.18.1 + filippo.io/age v1.2.1 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0 @@ -603,7 +604,7 @@ replace ( github.com/microsoft/go-mssqldb => github.com/gravitational/go-mssqldb v1.8.1-teleport.2 github.com/opencontainers/selinux => github.com/gravitational/selinux v1.13.0-teleport github.com/redis/go-redis/v9 => github.com/gravitational/redis/v9 v9.6.1-teleport.1 - github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.2 + github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.4 ) // this package was included in google.golang.org/grpc but because it's still diff --git a/go.sum b/go.sum index 3ee413f1b636b..047a860ac7d17 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +c2sp.org/CCTV/age v0.0.0-20240306222714-3ec4d716e805 h1:u2qwJeEvnypw+OCPUHmoZE3IqwfuN5kgDfo5MLzpNM0= +c2sp.org/CCTV/age v0.0.0-20240306222714-3ec4d716e805/go.mod h1:FomMrUJ2Lxt5jCLmZkG3FHa72zUprnhd3v/Z18Snm4w= cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg= cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -641,6 +643,8 @@ cuelang.org/go v0.12.1/go.mod h1:B4+kjvGGQnbkz+GuAv1dq/R308gTkp0sO28FdMrJ2Kw= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/age v1.2.1 h1:X0TZjehAZylOIj4DubWYU1vWQxv9bJpo+Uu2/LGhi1o= +filippo.io/age v1.2.1/go.mod h1:JL9ew2lTN+Pyft4RiNGguFfOpewKwSHm5ayKD/A4004= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= @@ -1556,8 +1560,8 @@ github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33 h1:VFE github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1 h1:Kt7aT9N7vbZmcMejGXnSAGap8TUwH3fMoHE8cQm14wc= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1/go.mod h1:n4RXV6T3SJ/vrJqmc4vBeHpaBspxWENDD67ssQlXXkg= -github.com/gravitational/predicate v1.3.2 h1:NAdaWihgGVS3nuKDZZHTda4wwNjGlvG4a+UYQ4f3gQc= -github.com/gravitational/predicate v1.3.2/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= +github.com/gravitational/predicate v1.3.4 h1:9N3JhBXNPcUh0w8DdlpnVmfnH9Z3xxbw43sD3E19VBE= +github.com/gravitational/predicate v1.3.4/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= github.com/gravitational/protobuf v1.3.2-teleport.2 h1:MO5eFXfGfDiAbBA7X8tDW2EMLfRWQVJMmK+MA6gV8AI= github.com/gravitational/protobuf v1.3.2-teleport.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gravitational/redis/v9 v9.6.1-teleport.1 h1:gPirfPKArN2nPhTKR3h9fnEg5YuYU933+CjlDJMo4H0= diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index e1b820c18b218..d9818abac63c4 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -386,5 +386,5 @@ replace ( github.com/keys-pub/go-libfido2 => github.com/gravitational/go-libfido2 v1.5.3-teleport.1 github.com/microsoft/go-mssqldb => github.com/gravitational/go-mssqldb v1.8.1-teleport.2 github.com/redis/go-redis/v9 => github.com/gravitational/redis/v9 v9.6.1-teleport.1 - github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.2 + github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.4 ) diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index 2b92e2cc5099a..525d9ac3e790f 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -482,8 +482,8 @@ github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33 h1:VFE github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1 h1:Kt7aT9N7vbZmcMejGXnSAGap8TUwH3fMoHE8cQm14wc= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1/go.mod h1:n4RXV6T3SJ/vrJqmc4vBeHpaBspxWENDD67ssQlXXkg= -github.com/gravitational/predicate v1.3.2 h1:NAdaWihgGVS3nuKDZZHTda4wwNjGlvG4a+UYQ4f3gQc= -github.com/gravitational/predicate v1.3.2/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= +github.com/gravitational/predicate v1.3.4 h1:9N3JhBXNPcUh0w8DdlpnVmfnH9Z3xxbw43sD3E19VBE= +github.com/gravitational/predicate v1.3.4/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= github.com/gravitational/protobuf v1.3.2-teleport.2 h1:MO5eFXfGfDiAbBA7X8tDW2EMLfRWQVJMmK+MA6gV8AI= github.com/gravitational/protobuf v1.3.2-teleport.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gravitational/redis/v9 v9.6.1-teleport.1 h1:gPirfPKArN2nPhTKR3h9fnEg5YuYU933+CjlDJMo4H0= diff --git a/integrations/terraform-mwi/go.mod b/integrations/terraform-mwi/go.mod index fd111c377add9..cc5a63ebb7d88 100644 --- a/integrations/terraform-mwi/go.mod +++ b/integrations/terraform-mwi/go.mod @@ -555,5 +555,5 @@ replace ( github.com/microsoft/go-mssqldb => github.com/gravitational/go-mssqldb v1.8.1-teleport.2 github.com/opencontainers/selinux => github.com/gravitational/selinux v1.13.0-teleport github.com/redis/go-redis/v9 => github.com/gravitational/redis/v9 v9.6.1-teleport.1 - github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.2 + github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.4 ) diff --git a/integrations/terraform-mwi/go.sum b/integrations/terraform-mwi/go.sum index 8453119b831a4..c2fa62bb82848 100644 --- a/integrations/terraform-mwi/go.sum +++ b/integrations/terraform-mwi/go.sum @@ -707,8 +707,8 @@ github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33 h1:VFE github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1 h1:Kt7aT9N7vbZmcMejGXnSAGap8TUwH3fMoHE8cQm14wc= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1/go.mod h1:n4RXV6T3SJ/vrJqmc4vBeHpaBspxWENDD67ssQlXXkg= -github.com/gravitational/predicate v1.3.2 h1:NAdaWihgGVS3nuKDZZHTda4wwNjGlvG4a+UYQ4f3gQc= -github.com/gravitational/predicate v1.3.2/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= +github.com/gravitational/predicate v1.3.4 h1:9N3JhBXNPcUh0w8DdlpnVmfnH9Z3xxbw43sD3E19VBE= +github.com/gravitational/predicate v1.3.4/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= github.com/gravitational/protobuf v1.3.2-teleport.2 h1:MO5eFXfGfDiAbBA7X8tDW2EMLfRWQVJMmK+MA6gV8AI= github.com/gravitational/protobuf v1.3.2-teleport.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gravitational/redis/v9 v9.6.1-teleport.1 h1:gPirfPKArN2nPhTKR3h9fnEg5YuYU933+CjlDJMo4H0= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 585e6b708ec73..14f72ab41ce39 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -471,7 +471,7 @@ replace ( github.com/keys-pub/go-libfido2 => github.com/gravitational/go-libfido2 v1.5.3-teleport.1 github.com/microsoft/go-mssqldb => github.com/gravitational/go-mssqldb v1.8.1-teleport.2 github.com/redis/go-redis/v9 => github.com/gravitational/redis/v9 v9.6.1-teleport.1 - github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.2 + github.com/vulcand/predicate => github.com/gravitational/predicate v1.3.4 ) // Doc generation tooling. diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 64c8044ac2c96..5372190497933 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -718,8 +718,8 @@ github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33 h1:VFE github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1 h1:Kt7aT9N7vbZmcMejGXnSAGap8TUwH3fMoHE8cQm14wc= github.com/gravitational/license v0.0.0-20250329001817-070456fa8ec1/go.mod h1:n4RXV6T3SJ/vrJqmc4vBeHpaBspxWENDD67ssQlXXkg= -github.com/gravitational/predicate v1.3.2 h1:NAdaWihgGVS3nuKDZZHTda4wwNjGlvG4a+UYQ4f3gQc= -github.com/gravitational/predicate v1.3.2/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= +github.com/gravitational/predicate v1.3.4 h1:9N3JhBXNPcUh0w8DdlpnVmfnH9Z3xxbw43sD3E19VBE= +github.com/gravitational/predicate v1.3.4/go.mod h1:cTQkp40X3YejTcWsZGvzAtfa28VXfBxT10H/Grt0Fzs= github.com/gravitational/protobuf v1.3.2-teleport.2 h1:MO5eFXfGfDiAbBA7X8tDW2EMLfRWQVJMmK+MA6gV8AI= github.com/gravitational/protobuf v1.3.2-teleport.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gravitational/redis/v9 v9.6.1-teleport.1 h1:gPirfPKArN2nPhTKR3h9fnEg5YuYU933+CjlDJMo4H0= diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index 4904076472e36..500dd7c15bb9a 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -74,6 +74,7 @@ type Config struct { AccessMonitoringRules services.AccessMonitoringRules AppSession services.AppSession Apps services.Apps + BotInstance services.BotInstance ClusterConfig services.ClusterConfiguration CrownJewels services.CrownJewels DatabaseObjects services.DatabaseObjects @@ -211,6 +212,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { PluginStaticCredentials: cfg.PluginStaticCredentials, GitServers: cfg.GitServers, HealthCheckConfig: cfg.HealthCheckConfig, + BotInstanceService: cfg.BotInstance, } return cache.New(cfg.Setup(cacheCfg)) diff --git a/lib/auth/agent_version_report_test.go b/lib/auth/agent_version_report_test.go index edd85d28b6fa1..40e0d8a57a8a4 100644 --- a/lib/auth/agent_version_report_test.go +++ b/lib/auth/agent_version_report_test.go @@ -257,6 +257,14 @@ func TestServer_generateAgentVersionReport(t *testing.T) { UpdaterInfo: &types.UpdaterV2Info{UpdaterStatus: status, UpdateGroup: fixture.updateGroup}, }) if fixture.goodbye != nil { + // Sending the message twice is a little hack to make sure that the auth received the goodbye at + // least once. Else, the auth might still be in the small frame when it received the message + // over the channel but has not stored it yet. When this happens the test becomes flaky. + // Ideally we would peek into the inventory internals and wait for the goodbye to be stored, + // but we don't have access to inventory's private field. + // Because the channel is not buffered and a single go routine is reading on the other side, we know + // that the routine is done processing the first messages if we can send the second. + stream.fakeMsg(fixture.goodbye) stream.fakeMsg(fixture.goodbye) } t.Cleanup(stream.close) diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index da50bf1b151cd..36246d4987140 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -1237,6 +1237,12 @@ type Cache interface { GetRelayServer(ctx context.Context, name string) (*presencev1.RelayServer, error) // ListRelayServers returns a paginated list of relay server heartbeats. ListRelayServers(ctx context.Context, pageSize int, pageToken string) (_ []*presencev1.RelayServer, nextPageToken string, _ error) + + // GetBotInstance returns the specified BotInstance resource. + GetBotInstance(ctx context.Context, botName, instanceID string) (*machineidv1.BotInstance, error) + + // ListBotInstances returns a page of BotInstance resources. + ListBotInstances(ctx context.Context, botName string, pageSize int, lastToken string, search string) ([]*machineidv1.BotInstance, string, error) } type NodeWrapper struct { diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index c9c341edff62f..1e775ca891a22 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5318,6 +5318,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { botInstanceService, err := machineidv1.NewBotInstanceService(machineidv1.BotInstanceServiceConfig{ Authorizer: cfg.Authorizer, + Cache: cfg.AuthServer.Cache, Backend: cfg.AuthServer.Services.BotInstance, Clock: cfg.AuthServer.GetClock(), }) diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 1dc6e73a0204e..57d5b06fe9e65 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -552,6 +552,7 @@ func InitTestAuthCache(p TestAuthCacheParams) error { PluginStaticCredentials: p.AuthServer.Services.PluginStaticCredentials, GitServers: p.AuthServer.Services.GitServers, HealthCheckConfig: p.AuthServer.Services.HealthCheckConfig, + BotInstance: p.AuthServer.Services.BotInstance, }) if err != nil { return trace.Wrap(err) diff --git a/lib/auth/join_bound_keypair.go b/lib/auth/join_bound_keypair.go index fbba4547c3101..e12503daaf285 100644 --- a/lib/auth/join_bound_keypair.go +++ b/lib/auth/join_bound_keypair.go @@ -30,9 +30,11 @@ import ( "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/boundkeypair" "github.com/gravitational/teleport/lib/boundkeypair/boundkeypairexperiment" "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/jwt" libsshutils "github.com/gravitational/teleport/lib/sshutils" "github.com/gravitational/teleport/lib/utils" @@ -446,6 +448,86 @@ func formatTimePointer(t *time.Time) string { return t.String() } +// emitBoundKeypairRecoveryEvent emits an audit event indicating a bound keypair +// token was used to recover a bot. +func (a *Server) emitBoundKeypairRecoveryEvent( + ctx context.Context, + req *proto.RegisterUsingBoundKeypairInitialRequest, + token *types.ProvisionTokenV2, + boundPublicKey string, + recoveryCount uint32, + err error, +) { + var status apievents.Status + if err == nil { + status = apievents.Status{ + Success: true, + } + } else { + status = apievents.Status{ + Success: false, + Error: err.Error(), + } + } + + if err := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.BoundKeypairRecovery{ + Metadata: apievents.Metadata{ + Type: events.BoundKeypairRecovery, + Code: events.BoundKeypairRecoveryCode, + }, + Status: status, + ConnectionMetadata: apievents.ConnectionMetadata{ + RemoteAddr: req.JoinRequest.RemoteAddr, + }, + TokenName: token.GetName(), + BotName: token.GetBotName(), + PublicKey: boundPublicKey, + RecoveryCount: recoveryCount, + RecoveryMode: token.Spec.BoundKeypair.Recovery.Mode, + }); err != nil { + a.logger.WarnContext(ctx, "Failed to emit failed bound keypair recovery event", "error", err) + } +} + +// emitBoundKeypairRotationEvent emits an audit event indicating a bound keypair +// rotation occurred. +func (a *Server) emitBoundKeypairRotationEvent( + ctx context.Context, + req *proto.RegisterUsingBoundKeypairInitialRequest, + token *types.ProvisionTokenV2, + prevPublicKey, newPublicKey string, + err error, +) { + var status apievents.Status + if err == nil { + status = apievents.Status{ + Success: true, + } + } else { + status = apievents.Status{ + Success: false, + Error: err.Error(), + } + } + + if err := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.BoundKeypairRotation{ + Metadata: apievents.Metadata{ + Type: events.BoundKeypairRotation, + Code: events.BoundKeypairRotationCode, + }, + Status: status, + ConnectionMetadata: apievents.ConnectionMetadata{ + RemoteAddr: req.JoinRequest.RemoteAddr, + }, + TokenName: token.GetName(), + BotName: token.GetBotName(), + PreviousPublicKey: prevPublicKey, + NewPublicKey: newPublicKey, + }); err != nil { + a.logger.WarnContext(ctx, "Failed to emit failed bound keypair rotation event", "error", err) + } +} + // RegisterUsingBoundKeypairMethod handles joining requests for the bound // keypair join method. If successful, returns func (a *Server) RegisterUsingBoundKeypairMethod( @@ -526,6 +608,11 @@ func (a *Server) RegisterUsingBoundKeypairMethod( // inform the returned public key value. boundPublicKey := status.BoundPublicKey + // the recovery count; this is informational and used to generate extended + // claims for audit log purposes. The actual enforced value is incremented + // by `mutateStatusConsumeRecovery`. + recoveryCount := status.RecoveryCount + // Mutators to use during the token resource status patch at the end. var mutators []boundKeypairStatusMutator @@ -556,10 +643,27 @@ func (a *Server) RegisterUsingBoundKeypairMethod( }, ) if err != nil { + log.ErrorContext(ctx, "bound keypair join state verification failed", "error", err) + // TODO: Once we have token-specific locking, generate a lock; this // indicates the keypair may have been compromised. - // TODO: Audit log event for this. - log.ErrorContext(ctx, "bound keypair join state verification failed", "error", err) + if auditErr := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.BoundKeypairJoinStateVerificationFailed{ + Metadata: apievents.Metadata{ + Type: events.BoundKeypairJoinStateVerificationFailed, + Code: events.BoundKeypairJoinStateVerificationFailedCode, + }, + Status: apievents.Status{ + Success: false, + Error: err.Error(), + }, + ConnectionMetadata: apievents.ConnectionMetadata{ + RemoteAddr: req.JoinRequest.RemoteAddr, + }, + TokenName: ptv2.GetName(), + BotName: ptv2.GetBotName(), + }); err != nil { + a.logger.WarnContext(ctx, "Failed to emit failed join state verification event", "error", auditErr) + } return nil, trace.AccessDenied("join state verification failed") } @@ -593,7 +697,9 @@ func (a *Server) RegisterUsingBoundKeypairMethod( spec.Onboarding.InitialPublicKey, challengeResponse, ); err != nil { - return nil, trace.Wrap(err) + log.WarnContext(ctx, "denying initial join attempt, client failed to complete challenge", "error", err) + a.emitBoundKeypairRecoveryEvent(ctx, req, ptv2, spec.Onboarding.InitialPublicKey, 0, err) + return nil, trace.AccessDenied("failed to complete challenge") } // Now that we've confirmed the key, we can consider it bound. @@ -610,6 +716,7 @@ func (a *Server) RegisterUsingBoundKeypairMethod( // A registration secret is expected. if req.InitialJoinSecret == "" { log.WarnContext(ctx, "denying join attempt, client failed to provide required registration secret") + a.emitBoundKeypairRecoveryEvent(ctx, req, ptv2, "", 0, trace.AccessDenied("no registration secret was provided")) return nil, trace.AccessDenied(errMsg) } @@ -628,12 +735,16 @@ func (a *Server) RegisterUsingBoundKeypairMethod( // Verify the secret. if subtle.ConstantTimeCompare([]byte(status.RegistrationSecret), []byte(req.InitialJoinSecret)) != 1 { log.WarnContext(ctx, "denying join attempt, client provided incorrect registration secret") + a.emitBoundKeypairRecoveryEvent(ctx, req, ptv2, "", 0, trace.AccessDenied("registration secret comparison failed")) return nil, trace.AccessDenied(errMsg) } // Ask the client for a new public key. newPubKey, err := a.requestBoundKeypairRotation(ctx, challengeResponse) if err != nil { + // Audit note: `requestBoundKeypairRotation()` will also emit an + // audit event. + a.emitBoundKeypairRecoveryEvent(ctx, req, ptv2, "", 0, err) return nil, trace.Wrap(err, "requesting public key") } @@ -648,6 +759,8 @@ func (a *Server) RegisterUsingBoundKeypairMethod( boundPublicKey = newPubKey } else { + // Audit note: this would be an implementation error, so doesn't + // warrant an audit event. return nil, trace.BadParameter("either an initial public key or registration secret is required") } @@ -658,7 +771,9 @@ func (a *Server) RegisterUsingBoundKeypairMethod( mutateStatusConsumeRecovery(recoveryMode, status.RecoveryCount, spec.Recovery.Limit), ) + recoveryCount += 1 expectNewBotInstance = true + a.emitBoundKeypairRecoveryEvent(ctx, req, ptv2, boundPublicKey, recoveryCount, nil) case !hasBoundPublicKey && hasIncomingBotInstance: // Not allowed, at least at the moment. This would imply e.g. trying to // change auth methods. @@ -682,7 +797,8 @@ func (a *Server) RegisterUsingBoundKeypairMethod( return nil, trace.Wrap(err) } - // Nothing else to do, no key change + // Nothing else to do, no key change, no additional audit event; regular + // bot join event will be emitted later. case hasBoundPublicKey && hasBoundBotInstance && !hasIncomingBotInstance: // Hard rejoin case, the client identity expired and a new bot instance // is required. Consumes a rejoin. @@ -696,6 +812,7 @@ func (a *Server) RegisterUsingBoundKeypairMethod( status.BoundPublicKey, challengeResponse, ); err != nil { + a.emitBoundKeypairRecoveryEvent(ctx, req, ptv2, boundPublicKey, recoveryCount, err) return nil, trace.Wrap(err) } @@ -704,7 +821,9 @@ func (a *Server) RegisterUsingBoundKeypairMethod( mutateStatusConsumeRecovery(recoveryMode, status.RecoveryCount, spec.Recovery.Limit), ) + recoveryCount += 1 expectNewBotInstance = true + a.emitBoundKeypairRecoveryEvent(ctx, req, ptv2, boundPublicKey, recoveryCount, nil) default: log.ErrorContext( ctx, "unexpected state", @@ -727,11 +846,13 @@ func (a *Server) RegisterUsingBoundKeypairMethod( ) newPubKey, err := a.requestBoundKeypairRotation(ctx, challengeResponse) if err != nil { + a.emitBoundKeypairRotationEvent(ctx, req, ptv2, boundPublicKey, "", err) return nil, trace.Wrap(err) } // Don't let clients provide the same key again. if err := ensurePublicKeysNotEqual(boundPublicKey, newPubKey); err != nil { + a.emitBoundKeypairRotationEvent(ctx, req, ptv2, boundPublicKey, newPubKey, err) return nil, trace.Wrap(err) } @@ -740,16 +861,19 @@ func (a *Server) RegisterUsingBoundKeypairMethod( mutateStatusLastRotatedAt(&now, status.LastRotatedAt), ) + a.emitBoundKeypairRotationEvent(ctx, req, ptv2, boundPublicKey, newPubKey, nil) boundPublicKey = newPubKey - - // TODO: Follow up with an audit log event for this. } certs, botInstanceID, err := a.generateCertsBot( ctx, ptv2, req.JoinRequest, - nil, // TODO: extended claims for this type? + &boundkeypair.Claims{ + PublicKey: boundPublicKey, + RecoveryCount: recoveryCount, + RecoveryMode: recoveryMode, + }, nil, // TODO: workload id claims ) if err != nil { diff --git a/lib/auth/join_bound_keypair_test.go b/lib/auth/join_bound_keypair_test.go index 698a7735ae734..fb0e4419e1e84 100644 --- a/lib/auth/join_bound_keypair_test.go +++ b/lib/auth/join_bound_keypair_test.go @@ -346,7 +346,7 @@ func TestServer_RegisterUsingBoundKeypairMethod(t *testing.T) { assertError: func(tt require.TestingT, err error, i ...any) { require.Error(tt, err) - require.ErrorContains(tt, err, "wrong public key") + require.ErrorContains(tt, err, "failed to complete challenge") }, }, { @@ -781,7 +781,7 @@ func TestServer_RegisterUsingBoundKeypairMethod(t *testing.T) { solver: makeSolver(""), assertError: func(tt require.TestingT, err error, i ...any) { - require.ErrorContains(t, err, "a valid registration secret is required") + require.ErrorContains(tt, err, "a valid registration secret is required") }, assertSolverState: func(t *testing.T, s *wrappedSolver) { require.EqualValues(t, 0, s.challengeCount) @@ -807,8 +807,7 @@ func TestServer_RegisterUsingBoundKeypairMethod(t *testing.T) { solver: makeSolver("", withRotatedPubKey(rotatedPublicKey)), assertError: func(tt require.TestingT, err error, i ...any) { - // note: error generated by our mock solver above - require.ErrorContains(t, err, "wrong public key") + require.ErrorContains(tt, err, "failed to complete challenge") }, assertSolverState: func(t *testing.T, s *wrappedSolver) { require.EqualValues(t, 1, s.challengeCount) @@ -833,7 +832,7 @@ func TestServer_RegisterUsingBoundKeypairMethod(t *testing.T) { solver: makeSolver("", withRotatedPubKey(rotatedPublicKey)), assertError: func(tt require.TestingT, err error, i ...any) { - require.ErrorContains(t, err, "a valid registration secret is required") + require.ErrorContains(tt, err, "a valid registration secret is required") }, assertSolverState: func(t *testing.T, s *wrappedSolver) { require.EqualValues(t, 0, s.challengeCount) diff --git a/lib/auth/machineid/machineidv1/bot_instance_service.go b/lib/auth/machineid/machineidv1/bot_instance_service.go index db89348713956..ff1ccf7454e46 100644 --- a/lib/auth/machineid/machineidv1/bot_instance_service.go +++ b/lib/auth/machineid/machineidv1/bot_instance_service.go @@ -48,10 +48,20 @@ const ( ExpiryMargin = time.Minute * 5 ) +// BotInstancesCache is the subset of the cached resources that the Service queries. +type BotInstancesCache interface { + // GetBotInstance returns the specified BotInstance resource. + GetBotInstance(ctx context.Context, botName, instanceID string) (*pb.BotInstance, error) + + // ListBotInstances returns a page of BotInstance resources. + ListBotInstances(ctx context.Context, botName string, pageSize int, lastToken string, search string) ([]*pb.BotInstance, string, error) +} + // BotInstanceServiceConfig holds configuration options for the BotInstance gRPC // service. type BotInstanceServiceConfig struct { Authorizer authz.Authorizer + Cache BotInstancesCache Backend services.BotInstance Logger *slog.Logger Clock clockwork.Clock @@ -64,6 +74,8 @@ func NewBotInstanceService(cfg BotInstanceServiceConfig) (*BotInstanceService, e return nil, trace.BadParameter("backend service is required") case cfg.Authorizer == nil: return nil, trace.BadParameter("authorizer is required") + case cfg.Cache == nil: + return nil, trace.BadParameter("cache service is required") } if cfg.Logger == nil { @@ -76,6 +88,7 @@ func NewBotInstanceService(cfg BotInstanceServiceConfig) (*BotInstanceService, e return &BotInstanceService{ logger: cfg.Logger, authorizer: cfg.Authorizer, + cache: cfg.Cache, backend: cfg.Backend, clock: cfg.Clock, }, nil @@ -87,6 +100,7 @@ type BotInstanceService struct { backend services.BotInstance authorizer authz.Authorizer + cache BotInstancesCache logger *slog.Logger clock clockwork.Clock } @@ -124,7 +138,7 @@ func (b *BotInstanceService) GetBotInstance(ctx context.Context, req *pb.GetBotI return nil, trace.Wrap(err) } - res, err := b.backend.GetBotInstance(ctx, req.BotName, req.InstanceId) + res, err := b.cache.GetBotInstance(ctx, req.BotName, req.InstanceId) if err != nil { return nil, trace.Wrap(err) } @@ -143,7 +157,7 @@ func (b *BotInstanceService) ListBotInstances(ctx context.Context, req *pb.ListB return nil, trace.Wrap(err) } - res, nextToken, err := b.backend.ListBotInstances(ctx, req.FilterBotName, int(req.PageSize), req.PageToken, req.FilterSearchTerm) + res, nextToken, err := b.cache.ListBotInstances(ctx, req.FilterBotName, int(req.PageSize), req.PageToken, req.FilterSearchTerm) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/machineid/machineidv1/bot_instance_service_test.go b/lib/auth/machineid/machineidv1/bot_instance_service_test.go index 39a4afe815404..37a4d0a491d76 100644 --- a/lib/auth/machineid/machineidv1/bot_instance_service_test.go +++ b/lib/auth/machineid/machineidv1/bot_instance_service_test.go @@ -334,6 +334,7 @@ func TestBotInstanceServiceSubmitHeartbeat(t *testing.T) { backend := newBotInstanceBackend(t) service, err := NewBotInstanceService(BotInstanceServiceConfig{ Backend: backend, + Cache: backend, Authorizer: authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { return &authz.Context{ Identity: identityGetterFn(func() tlsca.Identity { @@ -391,6 +392,7 @@ func TestBotInstanceServiceSubmitHeartbeat_HeartbeatLimit(t *testing.T) { backend := newBotInstanceBackend(t) service, err := NewBotInstanceService(BotInstanceServiceConfig{ Backend: backend, + Cache: backend, Authorizer: authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { return &authz.Context{ Identity: identityGetterFn(func() tlsca.Identity { @@ -581,6 +583,7 @@ func newBotInstanceService( service, err := NewBotInstanceService(BotInstanceServiceConfig{ Authorizer: authorizer, Backend: backendService, + Cache: backendService, }) require.NoError(t, err) diff --git a/lib/auth/recordingencryption/manager.go b/lib/auth/recordingencryption/manager.go new file mode 100644 index 0000000000000..889ac9c624ced --- /dev/null +++ b/lib/auth/recordingencryption/manager.go @@ -0,0 +1,533 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package recordingencryption + +import ( + "context" + "crypto" + "crypto/rand" + "crypto/sha256" + "encoding/hex" + "errors" + "iter" + "log/slog" + "slices" + "time" + + "filippo.io/age" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" + recordingencryptionv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/recordingencryption/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/retryutils" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/cryptosuites" + "github.com/gravitational/teleport/lib/services" +) + +// KeyStore provides methods for interacting with encryption keys. +type KeyStore interface { + NewEncryptionKeyPair(ctx context.Context, purpose cryptosuites.KeyPurpose) (*types.EncryptionKeyPair, error) + GetDecrypter(ctx context.Context, keyPair *types.EncryptionKeyPair) (crypto.Decrypter, error) +} + +// ManagerConfig captures all of the dependencies required to instantiate a Manager. +type ManagerConfig struct { + Backend services.RecordingEncryption + ClusterConfig services.ClusterConfigurationInternal + KeyStore KeyStore + Logger *slog.Logger + LockConfig backend.RunWhileLockedConfig +} + +// NewManager returns a new Manager using the given ManagerConfig. +func NewManager(cfg ManagerConfig) (*Manager, error) { + switch { + case cfg.Backend == nil: + return nil, trace.BadParameter("backend is required") + case cfg.ClusterConfig == nil: + return nil, trace.BadParameter("cluster config is required") + case cfg.KeyStore == nil: + return nil, trace.BadParameter("key store is required") + } + + if cfg.Logger == nil { + cfg.Logger = slog.With(teleport.ComponentKey, "recording-encryption-manager") + } + + return &Manager{ + RecordingEncryption: cfg.Backend, + ClusterConfigurationInternal: cfg.ClusterConfig, + + keyStore: cfg.KeyStore, + lockConfig: cfg.LockConfig, + logger: cfg.Logger, + }, nil +} + +// A Manager wraps a services.RecordingEncryption and KeyStore in order to provide more complex operations +// than the CRUD methods exposed by services.RecordingEncryption. It primarily handles resolving RecordingEncryption +// state and searching for accessible decryption keys. +type Manager struct { + services.RecordingEncryption + services.ClusterConfigurationInternal + + logger *slog.Logger + lockConfig backend.RunWhileLockedConfig + keyStore KeyStore +} + +// CreateSessionRecordingConfig creates a new session recording configuration. If encryption is enabled then the +// recording encryption resource will also be resolved. +func (m *Manager) CreateSessionRecordingConfig(ctx context.Context, cfg types.SessionRecordingConfig) (sessionRecordingConfig types.SessionRecordingConfig, err error) { + err = backend.RunWhileLocked(ctx, m.lockConfig, func(ctx context.Context) error { + if cfg.GetEncrypted() { + encryption, err := m.resolveRecordingEncryption(ctx) + if err != nil { + return err + } + + _ = cfg.SetEncryptionKeys(getAgeEncryptionKeys(encryption.GetSpec().ActiveKeys)) + } + + sessionRecordingConfig, err = m.ClusterConfigurationInternal.CreateSessionRecordingConfig(ctx, cfg) + if err != nil { + return trace.Wrap(err) + } + + return nil + }) + + return sessionRecordingConfig, trace.Wrap(err) +} + +// UpdateSessionRecordingConfig updates an existing session recording configuration. If encryption is enabled then +// the recording encryption resource will also be resolved. +func (m *Manager) UpdateSessionRecordingConfig(ctx context.Context, cfg types.SessionRecordingConfig) (sessionRecordingConfig types.SessionRecordingConfig, err error) { + err = backend.RunWhileLocked(ctx, m.lockConfig, func(ctx context.Context) error { + if cfg.GetEncrypted() { + encryption, err := m.resolveRecordingEncryption(ctx) + if err != nil { + return err + } + + _ = cfg.SetEncryptionKeys(getAgeEncryptionKeys(encryption.GetSpec().ActiveKeys)) + } + + sessionRecordingConfig, err = m.ClusterConfigurationInternal.UpdateSessionRecordingConfig(ctx, cfg) + if err != nil { + return trace.Wrap(err) + } + + return nil + }) + + return sessionRecordingConfig, trace.Wrap(err) +} + +// UpsertSessionRecordingConfig creates a new session recording configuration or overwrites an existing one. If +// encryption is enabled then the recording encryption resource will also be resolved. +func (m *Manager) UpsertSessionRecordingConfig(ctx context.Context, cfg types.SessionRecordingConfig) (sessionRecordingConfig types.SessionRecordingConfig, err error) { + err = backend.RunWhileLocked(ctx, m.lockConfig, func(ctx context.Context) error { + if cfg.GetEncrypted() { + encryption, err := m.resolveRecordingEncryption(ctx) + if err != nil { + return err + } + + _ = cfg.SetEncryptionKeys(getAgeEncryptionKeys(encryption.GetSpec().ActiveKeys)) + } + + sessionRecordingConfig, err = m.ClusterConfigurationInternal.UpsertSessionRecordingConfig(ctx, cfg) + if err != nil { + return trace.Wrap(err) + } + + return nil + }) + + return sessionRecordingConfig, trace.Wrap(err) +} + +// ensureActiveRecordingEncryption returns the configured RecordingEncryption resource if it exists with active keys. If it does not, +// then the resource will be created or updated with a new active keypair. The bool return value indicates whether or not +// a new pair was provisioned. +func (m *Manager) ensureActiveRecordingEncryption(ctx context.Context) (*recordingencryptionv1.RecordingEncryption, bool, error) { + persistFn := m.RecordingEncryption.UpdateRecordingEncryption + encryption, err := m.RecordingEncryption.GetRecordingEncryption(ctx) + if err != nil { + if !trace.IsNotFound(err) { + return encryption, false, trace.Wrap(err) + } + encryption = &recordingencryptionv1.RecordingEncryption{ + Spec: &recordingencryptionv1.RecordingEncryptionSpec{}, + } + persistFn = m.RecordingEncryption.CreateRecordingEncryption + } + + activeKeys := encryption.GetSpec().ActiveKeys + + // no keys present, need to generate the initial active keypair + if len(activeKeys) > 0 { + return encryption, false, nil + } + + keyEncryptionPair, err := m.keyStore.NewEncryptionKeyPair(ctx, cryptosuites.RecordingKeyWrapping) + if err != nil { + return encryption, false, trace.Wrap(err, "generating wrapping key") + } + + ident, err := age.GenerateX25519Identity() + if err != nil { + return encryption, false, trace.Wrap(err, "generating age encryption key") + } + + encryptedIdent, err := keyEncryptionPair.EncryptOAEP([]byte(ident.String())) + if err != nil { + return encryption, false, trace.Wrap(err, "wrapping encryption key") + } + + wrappedKey := recordingencryptionv1.WrappedKey{ + KeyEncryptionPair: keyEncryptionPair, + RecordingEncryptionPair: &types.EncryptionKeyPair{ + PrivateKeyType: types.PrivateKeyType_RAW, + PrivateKey: encryptedIdent, + PublicKey: []byte(ident.Recipient().String()), + }, + } + encryption.Spec.ActiveKeys = []*recordingencryptionv1.WrappedKey{&wrappedKey} + encryption, err = persistFn(ctx, encryption) + if err != nil { + return encryption, false, trace.Wrap(err) + } + fp := sha256.Sum256(wrappedKey.RecordingEncryptionPair.PublicKey) + m.logger.InfoContext(ctx, "no active keys, generated initial recording encryption pair", "public_fingerprint", hex.EncodeToString(fp[:])) + return encryption, true, nil +} + +var errWaitingForKey = errors.New("waiting for key to be fulfilled") + +// getRecordingEncryptionKey returns the first active recording encryption key accessible to the configured key store. +func (m *Manager) getRecordingEncryptionKeyPair(ctx context.Context, keys []*recordingencryptionv1.WrappedKey) (*types.EncryptionKeyPair, error) { + var foundUnfulfilledKey bool + for _, key := range keys { + decrypter, err := m.keyStore.GetDecrypter(ctx, key.KeyEncryptionPair) + if err != nil { + continue + } + + // if we make it to this section the key is accessible to the current auth server + if key.RecordingEncryptionPair == nil { + foundUnfulfilledKey = true + continue + } + + decryptionKey, err := decrypter.Decrypt(rand.Reader, key.RecordingEncryptionPair.PrivateKey, nil) + if err != nil { + return nil, trace.Wrap(err, "decrypting known key") + } + + return &types.EncryptionKeyPair{ + PrivateKey: decryptionKey, + PublicKey: key.RecordingEncryptionPair.PublicKey, + }, nil + } + + if foundUnfulfilledKey { + return nil, trace.Wrap(errWaitingForKey) + } + + return nil, trace.NotFound("no accessible recording encryption pair found") +} + +// resolveRecordingEncryption examines the current state of the RescordingEncryption resource and advances it to the +// next state on behalf of the current auth server. +// +// When no active recording encryption key pairs exist, the first pair will be generated and wrapped using a new key +// encryption pair generated by the Manager's keystore. +// +// When at least one active keypair exists but none are accessible to the Manager's keystore, a new key encryption pair +// will be generated and saved without a key encryption pair. This is an unfulfilled key that some other instance of +// Manager on another auth server will need to fulfill asynchronously. +// +// If at least one active key is accessible to the Manager's keystore, then unfulfilled keys (identified by missing +// recording encryption key pairs) will be fulfilled using their public key encryption keys. +// +// If there are no unfulfilled keys present, then nothing should be done. +func (m *Manager) resolveRecordingEncryption(ctx context.Context) (*recordingencryptionv1.RecordingEncryption, error) { + encryption, generatedKey, err := m.ensureActiveRecordingEncryption(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if generatedKey { + m.logger.DebugContext(ctx, "created initial recording encryption key") + return encryption, nil + } + + activeKeys := encryption.GetSpec().ActiveKeys + recordingEncryptionPair, err := m.getRecordingEncryptionKeyPair(ctx, activeKeys) + if err != nil { + if errors.Is(err, errWaitingForKey) { + // do nothing + return encryption, nil + } + + if trace.IsNotFound(err) { + m.logger.InfoContext(ctx, "no accessible recording encryption keys, posting new key to be fulfilled") + keypair, err := m.keyStore.NewEncryptionKeyPair(ctx, cryptosuites.RecordingKeyWrapping) + if err != nil { + return nil, trace.Wrap(err, "generating keypair for new wrapped key") + } + encryption.GetSpec().ActiveKeys = append(activeKeys, &recordingencryptionv1.WrappedKey{ + KeyEncryptionPair: keypair, + }) + + encryption, err = m.RecordingEncryption.UpdateRecordingEncryption(ctx, encryption) + return encryption, trace.Wrap(err, "updating session recording config") + } + + return nil, trace.Wrap(err) + } + + var shouldUpdate bool + for _, key := range activeKeys { + if key.RecordingEncryptionPair != nil { + continue + } + + encryptedKey, err := key.KeyEncryptionPair.EncryptOAEP(recordingEncryptionPair.PrivateKey) + if err != nil { + return encryption, trace.Wrap(err, "reencrypting decryption key") + } + + key.RecordingEncryptionPair = &types.EncryptionKeyPair{ + PrivateKey: encryptedKey, + PublicKey: recordingEncryptionPair.PublicKey, + } + + shouldUpdate = true + } + + if shouldUpdate { + m.logger.DebugContext(ctx, "fulfilling empty keys") + encryption, err = m.RecordingEncryption.UpdateRecordingEncryption(ctx, encryption) + if err != nil { + return encryption, trace.Wrap(err, "updating session recording config") + } + } + + return encryption, nil +} + +func (m *Manager) searchActiveKeys(ctx context.Context, activeKeys []*recordingencryptionv1.WrappedKey, publicKey []byte) (*types.EncryptionKeyPair, error) { + for _, key := range activeKeys { + if key.GetRecordingEncryptionPair() == nil { + continue + } + + if !slices.Equal(key.RecordingEncryptionPair.PublicKey, publicKey) { + continue + } + + decrypter, err := m.keyStore.GetDecrypter(ctx, key.KeyEncryptionPair) + if err != nil { + continue + } + + privateKey, err := decrypter.Decrypt(rand.Reader, key.RecordingEncryptionPair.PrivateKey, nil) + if err != nil { + return nil, trace.Wrap(err) + } + + return &types.EncryptionKeyPair{ + PrivateKey: privateKey, + PublicKey: key.RecordingEncryptionPair.PublicKey, + PrivateKeyType: key.RecordingEncryptionPair.PrivateKeyType, + }, nil + } + + return nil, trace.NotFound("no accessible decryption key found") +} + +// FindDecryptionKey returns the first accessible decryption key that matches one of the given public keys. +func (m *Manager) FindDecryptionKey(ctx context.Context, publicKeys ...[]byte) (*types.EncryptionKeyPair, error) { + encryption, err := m.RecordingEncryption.GetRecordingEncryption(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + // TODO (eriktate): search rotated keys as well once rotation is implemented + activeKeys := encryption.GetSpec().ActiveKeys + if len(publicKeys) == 0 { + return m.searchActiveKeys(ctx, activeKeys, nil) + } + + for _, publicKey := range publicKeys { + found, err := m.searchActiveKeys(ctx, activeKeys, publicKey) + if err != nil { + if trace.IsNotFound(err) { + continue + } + + if !slices.Equal(found.PublicKey, publicKey) { + continue + } + + decrypter, err := m.keyStore.GetDecrypter(ctx, found) + if err != nil { + if !trace.IsNotFound(err) { + m.logger.ErrorContext(ctx, "could not get decrypter from key store", "error", err) + } + continue + } + + privateKey, err := decrypter.Decrypt(rand.Reader, found.PrivateKey, nil) + if err != nil { + return nil, trace.Wrap(err) + } + + return &types.EncryptionKeyPair{ + PrivateKey: privateKey, + PublicKey: found.PublicKey, + PrivateKeyType: found.PrivateKeyType, + }, nil + } + + return found, nil + } + + return nil, trace.NotFound("no accessible decryption key found") +} + +func (m *Manager) Watch(ctx context.Context, events types.Events) (err error) { + // shouldRetryAfterJitterFn waits at most 5 seconds and returns a bool specifying whether or not + // execution should continue + shouldRetryAfterJitterFn := func() bool { + select { + case <-time.After(retryutils.SeventhJitter(time.Second * 5)): + return true + case <-ctx.Done(): + return false + } + } + + defer func() { + m.logger.InfoContext(ctx, "stopping encryption watcher", "error", err) + }() + + for { + watch, err := events.NewWatcher(ctx, types.Watch{ + Name: "recording_encryption_watcher", + Kinds: []types.WatchKind{ + { + Kind: types.KindRecordingEncryption, + }, + }, + }) + if err != nil { + m.logger.ErrorContext(ctx, "failed to create watcher, retrying", "error", err) + if !shouldRetryAfterJitterFn() { + return nil + } + continue + } + defer watch.Close() + + HandleEvents: + for { + select { + case ev := <-watch.Events(): + if err := m.handleEvent(ctx, ev, shouldRetryAfterJitterFn); err != nil { + m.logger.ErrorContext(ctx, "failure handling recording encryption event", "kind", ev.Resource.GetKind(), "error", err) + } + case <-watch.Done(): + if err := watch.Error(); err == nil { + return nil + } + + m.logger.ErrorContext(ctx, "watcher failed, retrying", "error", err) + if !shouldRetryAfterJitterFn() { + return nil + } + break HandleEvents + case <-ctx.Done(): + return nil + } + + } + } +} + +func (m *Manager) handleEvent(ctx context.Context, ev types.Event, shouldRetryFn func() bool) error { + if ev.Type != types.OpPut { + return nil + } + + if ev.Resource.GetKind() != types.KindRecordingEncryption { + return nil + } + + const retries = 3 + for retry := range retries { + err := backend.RunWhileLocked(ctx, m.lockConfig, func(ctx context.Context) error { + sessionRecordingConfig, err := m.GetSessionRecordingConfig(ctx) + if err != nil { + m.logger.ErrorContext(ctx, "failed to retrieve session_recording_config, retrying", "error", err) + return err + } + + if !sessionRecordingConfig.GetEncrypted() { + return nil + } + + if _, err := m.resolveRecordingEncryption(ctx); err != nil { + m.logger.ErrorContext(ctx, "failed to resolve recording encryption keys, retrying", "retry", retry, "retries_left", retries-retry, "error", err) + + return err + } + + return nil + }) + if err != nil && shouldRetryFn() { + continue + } + + return nil + } + + return trace.LimitExceeded("resolving recording encryption exceeded max retries") +} + +// getAgeEncryptionKeys returns an iterator of AgeEncryptionKeys from a list of WrappedKeys. This is for use in +// populating the EncryptionKeys field of SessionRecordingConfigStatus. +func getAgeEncryptionKeys(keys []*recordingencryptionv1.WrappedKey) iter.Seq[*types.AgeEncryptionKey] { + return func(yield func(*types.AgeEncryptionKey) bool) { + for _, key := range keys { + if key.RecordingEncryptionPair == nil { + continue + } + + if !yield(&types.AgeEncryptionKey{ + PublicKey: key.RecordingEncryptionPair.PublicKey, + }) { + return + } + } + } +} diff --git a/lib/auth/recordingencryption/manager_test.go b/lib/auth/recordingencryption/manager_test.go new file mode 100644 index 0000000000000..d803e5218f65d --- /dev/null +++ b/lib/auth/recordingencryption/manager_test.go @@ -0,0 +1,402 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package recordingencryption_test + +import ( + "context" + "crypto" + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "errors" + "io" + "sync" + "testing" + "time" + + "filippo.io/age" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + + recordingencryptionv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/recordingencryption/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/lib/auth/recordingencryption" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/cryptosuites" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local" + "github.com/gravitational/teleport/lib/utils" +) + +type oaepDecrypter struct { + crypto.Decrypter + hash crypto.Hash +} + +func (d oaepDecrypter) Decrypt(rand io.Reader, msg []byte, opts crypto.DecrypterOpts) ([]byte, error) { + return d.Decrypter.Decrypt(rand, msg, &rsa.OAEPOptions{ + Hash: d.hash, + }) +} + +type fakeKeyStore struct { + keyType types.PrivateKeyType // abusing this field as a way to simulate different auth servers +} + +func (f *fakeKeyStore) NewEncryptionKeyPair(ctx context.Context, purpose cryptosuites.KeyPurpose) (*types.EncryptionKeyPair, error) { + decrypter, err := cryptosuites.GenerateDecrypterWithAlgorithm(cryptosuites.RSA2048) + if err != nil { + return nil, err + } + + private, ok := decrypter.(*rsa.PrivateKey) + if !ok { + return nil, errors.New("expected RSA private key") + } + + privatePEM := pem.EncodeToMemory(&pem.Block{ + Type: keys.PKCS1PrivateKeyType, + Bytes: x509.MarshalPKCS1PrivateKey(private), + }) + + publicPEM := pem.EncodeToMemory(&pem.Block{ + Type: keys.PKCS1PublicKeyType, + Bytes: x509.MarshalPKCS1PublicKey(&private.PublicKey), + }) + + return &types.EncryptionKeyPair{ + PrivateKey: privatePEM, + PublicKey: publicPEM, + PrivateKeyType: f.keyType, + Hash: uint32(crypto.SHA256), + }, nil +} + +func (f *fakeKeyStore) GetDecrypter(ctx context.Context, keyPair *types.EncryptionKeyPair) (crypto.Decrypter, error) { + if keyPair.PrivateKeyType != f.keyType { + return nil, errors.New("could not access decrypter") + } + + block, _ := pem.Decode(keyPair.PrivateKey) + + private, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return nil, err + } + + return oaepDecrypter{Decrypter: private, hash: crypto.Hash(keyPair.Hash)}, nil +} + +func newLocalBackend( + t *testing.T, +) (context.Context, backend.Backend) { + t.Parallel() + ctx := t.Context() + clock := clockwork.NewRealClock() + mem, err := memory.New(memory.Config{ + Context: ctx, + Clock: clock, + }) + require.NoError(t, err) + bk := backend.NewSanitizer(mem) + return ctx, bk +} + +func newManagerConfig(t *testing.T, bk backend.Backend, keyType types.PrivateKeyType) recordingencryption.ManagerConfig { + recordingEncryptionService, err := local.NewRecordingEncryptionService(bk) + require.NoError(t, err) + + clusterConfigService, err := local.NewClusterConfigurationService(bk) + require.NoError(t, err) + + src := &types.SessionRecordingConfigV2{} + require.NoError(t, src.CheckAndSetDefaults()) + src.Spec.Encryption = &types.SessionRecordingEncryptionConfig{ + Enabled: true, + } + + return recordingencryption.ManagerConfig{ + Backend: recordingEncryptionService, + ClusterConfig: clusterConfigService, + KeyStore: &fakeKeyStore{keyType: keyType}, + Logger: utils.NewSlogLoggerForTests(), + LockConfig: backend.RunWhileLockedConfig{ + LockConfiguration: backend.LockConfiguration{ + Backend: bk, + LockNameComponents: []string{"recording_encryption"}, + TTL: 5 * time.Second, + RetryInterval: 10 * time.Millisecond, + }, + }, + } +} + +// resolve is a proxy to Manager.resolveRecordingEncryption through calling UpsertSessionRecordingConfig +func resolve(ctx context.Context, service services.RecordingEncryption, manager *recordingencryption.Manager) (*recordingencryptionv1.RecordingEncryption, types.SessionRecordingConfig, error) { + req := types.SessionRecordingConfigV2{ + Spec: types.SessionRecordingConfigSpecV2{ + Encryption: &types.SessionRecordingEncryptionConfig{ + Enabled: true, + }, + }, + } + if err := req.CheckAndSetDefaults(); err != nil { + return nil, nil, trace.Wrap(err) + } + + src, err := manager.UpsertSessionRecordingConfig(ctx, &req) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + encryption, err := service.GetRecordingEncryption(ctx) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + return encryption, src, nil +} + +func TestCreateUpdateSessionRecordingConfig(t *testing.T) { + ctx, bk := newLocalBackend(t) + + config := newManagerConfig(t, bk, types.PrivateKeyType_RAW) + manager, err := recordingencryption.NewManager(config) + require.NoError(t, err) + + req := &types.SessionRecordingConfigV2{} + require.NoError(t, req.CheckAndSetDefaults()) + req.Spec.Encryption = &types.SessionRecordingEncryptionConfig{ + Enabled: true, + } + + // create should provision initial keypair and write public key to SRC + src, err := manager.CreateSessionRecordingConfig(ctx, req) + require.NoError(t, err) + encryptionKeys := src.GetEncryptionKeys() + require.Len(t, encryptionKeys, 1) + + encryption, err := config.Backend.GetRecordingEncryption(ctx) + require.NoError(t, err) + activeKeys := encryption.GetSpec().GetActiveKeys() + require.Len(t, activeKeys, 1) + require.NotNil(t, activeKeys[0].RecordingEncryptionPair) + require.NotEmpty(t, activeKeys[0].RecordingEncryptionPair.PrivateKey) + require.NotEmpty(t, activeKeys[0].RecordingEncryptionPair.PublicKey) + require.NotNil(t, activeKeys[0].KeyEncryptionPair) + require.NotEmpty(t, activeKeys[0].KeyEncryptionPair.PrivateKey) + require.NotEmpty(t, activeKeys[0].KeyEncryptionPair.PublicKey) + + // update should change nothing + src, err = manager.UpdateSessionRecordingConfig(ctx, src) + require.NoError(t, err) + newEncryptionKeys := src.GetEncryptionKeys() + require.ElementsMatch(t, newEncryptionKeys, encryptionKeys) + + encryption, err = config.Backend.GetRecordingEncryption(ctx) + require.NoError(t, err) + newActiveKeys := encryption.GetSpec().GetActiveKeys() + require.ElementsMatch(t, newActiveKeys, activeKeys) +} + +func TestResolveRecordingEncryption(t *testing.T) { + // SETUP + ctx, bk := newLocalBackend(t) + + managerAType := types.PrivateKeyType_RAW + managerBType := types.PrivateKeyType_AWS_KMS + + configA := newManagerConfig(t, bk, managerAType) + configB := configA + configB.KeyStore = &fakeKeyStore{managerBType} + + managerA, err := recordingencryption.NewManager(configA) + require.NoError(t, err) + + managerB, err := recordingencryption.NewManager(configB) + require.NoError(t, err) + + service := configA.Backend + + // TEST + // CASE: service A first evaluation initializes recording encryption resource + encryption, src, err := resolve(ctx, service, managerA) + require.NoError(t, err) + activeKeys := encryption.GetSpec().GetActiveKeys() + + require.Len(t, activeKeys, 1) + require.Len(t, src.GetEncryptionKeys(), 1) + firstKey := activeKeys[0] + + // should generate a wrapped key with the initial recording encryption pair + require.NotNil(t, firstKey.KeyEncryptionPair) + require.NotNil(t, firstKey.RecordingEncryptionPair) + + // CASE: service B should generate an unfulfilled key since there's an existing recording encryption resource + encryption, src, err = resolve(ctx, service, managerB) + require.NoError(t, err) + + activeKeys = encryption.GetSpec().ActiveKeys + require.Len(t, activeKeys, 2) + require.Len(t, src.GetEncryptionKeys(), 1) + for _, key := range activeKeys { + require.NotNil(t, key.KeyEncryptionPair) + if key.KeyEncryptionPair.PrivateKeyType == managerAType { + require.NotNil(t, key.RecordingEncryptionPair) + } else { + require.Nil(t, key.RecordingEncryptionPair) + } + } + + // service B re-evaluting with an unfulfilled key should do nothing + encryption, src, err = resolve(ctx, service, managerB) + require.NoError(t, err) + activeKeys = encryption.GetSpec().ActiveKeys + require.Len(t, activeKeys, 2) + require.Len(t, src.GetEncryptionKeys(), 1) + for _, key := range activeKeys { + require.NotNil(t, key.KeyEncryptionPair) + if key.KeyEncryptionPair.PrivateKeyType == managerAType { + require.NotNil(t, key.RecordingEncryptionPair) + } else { + require.Nil(t, key.RecordingEncryptionPair) + } + } + + // CASE: service A evaluation should fulfill service B's key + encryption, src, err = resolve(ctx, service, managerA) + require.NoError(t, err) + activeKeys = encryption.GetSpec().ActiveKeys + require.Len(t, activeKeys, 2) + require.Len(t, src.GetEncryptionKeys(), 1) + for _, key := range activeKeys { + require.NotNil(t, key.KeyEncryptionPair) + require.NotNil(t, key.RecordingEncryptionPair) + } +} + +func TestResolveRecordingEncryptionConcurrent(t *testing.T) { + // SETUP + ctx, bk := newLocalBackend(t) + + managerAType := types.PrivateKeyType_RAW + managerBType := types.PrivateKeyType_AWS_KMS + serviceCType := types.PrivateKeyType_GCP_KMS + + configA := newManagerConfig(t, bk, managerAType) + configB := configA + configB.KeyStore = &fakeKeyStore{managerBType} + configC := configA + configC.KeyStore = &fakeKeyStore{serviceCType} + recordingEncryptionService := configA.Backend + managerA, err := recordingencryption.NewManager(configA) + require.NoError(t, err) + + managerB, err := recordingencryption.NewManager(configB) + require.NoError(t, err) + + serviceC, err := recordingencryption.NewManager(configC) + require.NoError(t, err) + + service := configA.Backend + resolveFn := func(manager *recordingencryption.Manager, wg *sync.WaitGroup) { + wg.Add(1) + go func() { + defer wg.Done() + resolve(ctx, service, manager) + require.NoError(t, err) + }() + } + + wg := sync.WaitGroup{} + resolveFn(managerA, &wg) + resolveFn(managerB, &wg) + resolveFn(serviceC, &wg) + wg.Wait() + + encryption, err := recordingEncryptionService.GetRecordingEncryption(ctx) + require.NoError(t, err) + + activeKeys := encryption.GetSpec().ActiveKeys + // each service should have an active wrapped key + require.Len(t, activeKeys, 3) + var fulfilledKeys int + for _, key := range activeKeys { + // all wrapped keys should have KeyEncryptionPairs + require.NotNil(t, key.KeyEncryptionPair) + require.NotEmpty(t, key.KeyEncryptionPair.PublicKey) + require.NotEmpty(t, key.KeyEncryptionPair.PrivateKey) + + if key.RecordingEncryptionPair != nil { + fulfilledKeys += 1 + } + } + + // only the first service to run should have a fulfilled wrapped key + require.Equal(t, 1, fulfilledKeys) +} + +func TestFindDecryptionKeyFromActiveKeys(t *testing.T) { + // SETUP + ctx, bk := newLocalBackend(t) + keyTypeA := types.PrivateKeyType_RAW + keyTypeB := types.PrivateKeyType_AWS_KMS + + configA := newManagerConfig(t, bk, keyTypeA) + configB := configA + configB.KeyStore = &fakeKeyStore{keyTypeB} + managerA, err := recordingencryption.NewManager(configA) + require.NoError(t, err) + + managerB, err := recordingencryption.NewManager(configB) + require.NoError(t, err) + + service := configA.Backend + _, _, err = resolve(ctx, service, managerA) + require.NoError(t, err) + + encryption, _, err := resolve(ctx, service, managerB) + require.NoError(t, err) + + activeKeys := encryption.GetSpec().ActiveKeys + require.Len(t, activeKeys, 2) + pubKey := activeKeys[0].RecordingEncryptionPair.PublicKey + + // fail to find private key for manager B because it is waiting for key fulfillment + _, err = managerB.FindDecryptionKey(ctx, pubKey) + require.Error(t, err) + + _, _, err = resolve(ctx, service, managerA) + require.NoError(t, err) + + // find private key for manager A because it provisioned the key + decryptionPair, err := managerA.FindDecryptionKey(ctx, pubKey) + require.NoError(t, err) + ident, err := age.ParseX25519Identity(string(decryptionPair.PrivateKey)) + require.NoError(t, err) + require.Equal(t, ident.Recipient().String(), string(pubKey)) + + // find private key for manager B after fulfillment + decryptionPair, err = managerB.FindDecryptionKey(ctx, pubKey) + require.NoError(t, err) + ident, err = age.ParseX25519Identity(string(decryptionPair.PrivateKey)) + require.NoError(t, err) + require.Equal(t, ident.Recipient().String(), string(pubKey)) +} diff --git a/lib/backend/firestore/firestorebk.go b/lib/backend/firestore/firestorebk.go index 24edbb0f27e01..70a38cf10fed0 100644 --- a/lib/backend/firestore/firestorebk.go +++ b/lib/backend/firestore/firestorebk.go @@ -225,7 +225,6 @@ func newRecordFromDoc(doc *firestore.DocumentSnapshot) (*record, error) { Timestamp: br.Timestamp, Expires: br.Expires, RevisionV2: br.RevisionV2, - snapShot: doc, } default: if err := doc.DataTo(&r); err != nil { @@ -241,11 +240,12 @@ func newRecordFromDoc(doc *firestore.DocumentSnapshot) (*record, error) { Value: []byte(rl.Value), Timestamp: rl.Timestamp, Expires: rl.Expires, - snapShot: doc, } } } + r.snapShot = doc + if r.RevisionV2 == "" { r.RevisionV1 = toRevisionV1(doc.UpdateTime) } diff --git a/lib/boundkeypair/claims.go b/lib/boundkeypair/claims.go new file mode 100644 index 0000000000000..788776dc1e357 --- /dev/null +++ b/lib/boundkeypair/claims.go @@ -0,0 +1,32 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package boundkeypair + +// Claims contains extended claims resulting from bound keypair joining +type Claims struct { + // PublicKey is the verified public key trusted at the end of the joining + // process. + PublicKey string `json:"public_key"` + // RecoveryCount is the recovery counter value at the end of the joining + // process. + RecoveryCount uint32 `json:"recovery_count"` + // RecoveryMode is the recovery mode as configured at the time of the join + // attempt. + RecoveryMode RecoveryMode `json:"recovery_mode"` +} diff --git a/lib/cache/bot_instance.go b/lib/cache/bot_instance.go new file mode 100644 index 0000000000000..1334799e5bada --- /dev/null +++ b/lib/cache/bot_instance.go @@ -0,0 +1,154 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cache + +import ( + "context" + "slices" + "strings" + + "github.com/gravitational/trace" + "google.golang.org/protobuf/proto" + + "github.com/gravitational/teleport/api/defaults" + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/clientutils" + "github.com/gravitational/teleport/lib/services" +) + +type botInstanceIndex string + +const ( + botInstanceNameIndex botInstanceIndex = "name" +) + +func keyForNameIndex(botInstance *machineidv1.BotInstance) string { + return makeNameIndexKey( + botInstance.GetSpec().GetBotName(), + botInstance.GetMetadata().GetName(), + ) +} + +func makeNameIndexKey(botName string, instanceID string) string { + return botName + "/" + instanceID +} + +func newBotInstanceCollection(upstream services.BotInstance, w types.WatchKind) (*collection[*machineidv1.BotInstance, botInstanceIndex], error) { + if upstream == nil { + return nil, trace.BadParameter("missing parameter upstream (BotInstance)") + } + + return &collection[*machineidv1.BotInstance, botInstanceIndex]{ + store: newStore( + proto.CloneOf[*machineidv1.BotInstance], + map[botInstanceIndex]func(*machineidv1.BotInstance) string{ + // Index on a combination of bot name and instance name + botInstanceNameIndex: keyForNameIndex, + }), + fetcher: func(ctx context.Context, loadSecrets bool) ([]*machineidv1.BotInstance, error) { + var out []*machineidv1.BotInstance + clientutils.IterateResources(ctx, + func(ctx context.Context, limit int, start string) ([]*machineidv1.BotInstance, string, error) { + return upstream.ListBotInstances(ctx, "", limit, start, "") + }, + func(hcc *machineidv1.BotInstance) error { + out = append(out, hcc) + return nil + }, + ) + return out, nil + }, + watch: w, + }, nil +} + +// GetBotInstance returns the specified BotInstance resource. +func (c *Cache) GetBotInstance(ctx context.Context, botName, instanceID string) (*machineidv1.BotInstance, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetBotInstance") + defer span.End() + + getter := genericGetter[*machineidv1.BotInstance, botInstanceIndex]{ + cache: c, + collection: c.collections.botInstances, + index: botInstanceNameIndex, + upstreamGet: func(ctx context.Context, _ string) (*machineidv1.BotInstance, error) { + return c.Config.BotInstanceService.GetBotInstance(ctx, botName, instanceID) + }, + } + + out, err := getter.get(ctx, makeNameIndexKey(botName, instanceID)) + return out, trace.Wrap(err) +} + +// ListBotInstances returns a page of BotInstance resources. +func (c *Cache) ListBotInstances(ctx context.Context, botName string, pageSize int, lastToken string, search string) ([]*machineidv1.BotInstance, string, error) { + ctx, span := c.Tracer.Start(ctx, "cache/ListBotInstances") + defer span.End() + + lister := genericLister[*machineidv1.BotInstance, botInstanceIndex]{ + cache: c, + collection: c.collections.botInstances, + index: botInstanceNameIndex, + defaultPageSize: defaults.DefaultChunkSize, + upstreamList: func(ctx context.Context, limit int, start string) ([]*machineidv1.BotInstance, string, error) { + return c.Config.BotInstanceService.ListBotInstances(ctx, botName, limit, start, search) + }, + filter: func(b *machineidv1.BotInstance) bool { + return matchBotInstance(b, botName, search) + }, + nextToken: func(b *machineidv1.BotInstance) string { + return keyForNameIndex(b) + }, + } + out, next, err := lister.list(ctx, + pageSize, + lastToken, + ) + return out, next, trace.Wrap(err) +} + +func matchBotInstance(b *machineidv1.BotInstance, botName string, search string) bool { + // If updating this, ensure it's consistent with the upstream search logic in `lib/services/local/bot_instance.go`. + + if botName != "" && b.Spec.BotName != botName { + return false + } + + if search == "" { + return true + } + + latestHeartbeats := b.GetStatus().GetLatestHeartbeats() + heartbeat := b.Status.InitialHeartbeat // Use initial heartbeat as a fallback + if len(latestHeartbeats) > 0 { + heartbeat = latestHeartbeats[len(latestHeartbeats)-1] + } + + values := []string{ + b.Spec.BotName, + b.Spec.InstanceId, + } + + if heartbeat != nil { + values = append(values, heartbeat.Hostname, heartbeat.JoinMethod, heartbeat.Version, "v"+heartbeat.Version) + } + + return slices.ContainsFunc(values, func(val string) bool { + return strings.Contains(strings.ToLower(val), strings.ToLower(search)) + }) +} diff --git a/lib/cache/bot_instance_test.go b/lib/cache/bot_instance_test.go new file mode 100644 index 0000000000000..6395eed93f104 --- /dev/null +++ b/lib/cache/bot_instance_test.go @@ -0,0 +1,222 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cache + +import ( + "context" + "strconv" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" +) + +// TestBotInstanceCache tests that CRUD operations on bot instances resources are +// replicated from the backend to the cache. +func TestBotInstanceCache(t *testing.T) { + t.Parallel() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + testResources153(t, p, testFuncs153[*machineidv1.BotInstance]{ + newResource: func(key string) (*machineidv1.BotInstance, error) { + return &machineidv1.BotInstance{ + Kind: types.KindBotInstance, + Version: types.V1, + Metadata: &headerv1.Metadata{}, + Spec: &machineidv1.BotInstanceSpec{ + BotName: "bot-1", + InstanceId: key, + }, + Status: &machineidv1.BotInstanceStatus{}, + }, nil + }, + cacheGet: func(ctx context.Context, key string) (*machineidv1.BotInstance, error) { + return p.cache.GetBotInstance(ctx, "bot-1", key) + }, + cacheList: func(ctx context.Context) ([]*machineidv1.BotInstance, error) { + results, _, err := p.cache.ListBotInstances(ctx, "", 0, "", "") + return results, err + }, + create: func(ctx context.Context, resource *machineidv1.BotInstance) error { + _, err := p.botInstanceService.CreateBotInstance(ctx, resource) + return err + }, + list: func(ctx context.Context) ([]*machineidv1.BotInstance, error) { + results, _, err := p.botInstanceService.ListBotInstances(ctx, "", 0, "", "") + return results, err + }, + update: func(ctx context.Context, bi *machineidv1.BotInstance) error { + _, err := p.botInstanceService.PatchBotInstance(ctx, "bot-1", bi.Metadata.GetName(), func(_ *machineidv1.BotInstance) (*machineidv1.BotInstance, error) { + return bi, nil + }) + return err + }, + delete: func(ctx context.Context, key string) error { + return p.botInstanceService.DeleteBotInstance(ctx, "bot-1", key) + }, + deleteAll: func(ctx context.Context) error { + return p.botInstanceService.DeleteAllBotInstances(ctx) + }, + }) +} + +// TestBotInstanceCachePaging tests that items from the cache are paginated. +func TestBotInstanceCachePaging(t *testing.T) { + t.Parallel() + + ctx := context.Background() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + for _, n := range []int{5, 1, 3, 4, 2} { + _, err := p.botInstanceService.CreateBotInstance(ctx, &machineidv1.BotInstance{ + Kind: types.KindBotInstance, + Version: types.V1, + Metadata: &headerv1.Metadata{}, + Spec: &machineidv1.BotInstanceSpec{ + BotName: "bot-1", + InstanceId: "instance-" + strconv.Itoa(n), + }, + Status: &machineidv1.BotInstanceStatus{}, + }) + require.NoError(t, err) + } + + // Let the cache catch up + require.EventuallyWithT(t, func(t *assert.CollectT) { + _, err := p.cache.GetBotInstance(ctx, "bot-1", "instance-2") + require.NoError(t, err) + }, 2*time.Second, 10*time.Millisecond) + + // page size equal to total items + results, nextPageToken, err := p.cache.ListBotInstances(ctx, "", 0, "", "") + require.NoError(t, err) + require.Empty(t, nextPageToken) + require.Len(t, results, 5) + require.Equal(t, "instance-1", results[0].GetMetadata().GetName()) + require.Equal(t, "instance-2", results[1].GetMetadata().GetName()) + require.Equal(t, "instance-3", results[2].GetMetadata().GetName()) + require.Equal(t, "instance-4", results[3].GetMetadata().GetName()) + require.Equal(t, "instance-5", results[4].GetMetadata().GetName()) + + // page size smaller than total items + results, nextPageToken, err = p.cache.ListBotInstances(ctx, "", 3, "", "") + require.NoError(t, err) + require.Equal(t, "bot-1/instance-4", nextPageToken) + require.Len(t, results, 3) + require.Equal(t, "instance-1", results[0].GetMetadata().GetName()) + require.Equal(t, "instance-2", results[1].GetMetadata().GetName()) + require.Equal(t, "instance-3", results[2].GetMetadata().GetName()) + + // next page + results, nextPageToken, err = p.cache.ListBotInstances(ctx, "", 3, nextPageToken, "") + require.NoError(t, err) + require.Empty(t, nextPageToken) + require.Len(t, results, 2) + require.Equal(t, "instance-4", results[0].GetMetadata().GetName()) + require.Equal(t, "instance-5", results[1].GetMetadata().GetName()) +} + +// TestBotInstanceCacheBotFilter tests that cache items are filtered by bot name. +func TestBotInstanceCacheBotFilter(t *testing.T) { + t.Parallel() + + ctx := context.Background() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + for n := range 2 { + for m := range 5 { + _, err := p.botInstanceService.CreateBotInstance(ctx, &machineidv1.BotInstance{ + Kind: types.KindBotInstance, + Version: types.V1, + Metadata: &headerv1.Metadata{}, + Spec: &machineidv1.BotInstanceSpec{ + BotName: "bot-" + strconv.Itoa(n+1), + InstanceId: "instance-" + strconv.Itoa((n+1)*(m+1)), + }, + Status: &machineidv1.BotInstanceStatus{}, + }) + require.NoError(t, err) + } + } + + // Let the cache catch up + require.EventuallyWithT(t, func(t *assert.CollectT) { + _, err := p.cache.GetBotInstance(ctx, "bot-2", "instance-10") + require.NoError(t, err) + }, 2*time.Second, 10*time.Millisecond) + + results, _, err := p.cache.ListBotInstances(ctx, "bot-2", 0, "", "") + require.NoError(t, err) + require.Len(t, results, 5) + + for _, b := range results { + require.Equal(t, "bot-2", b.GetSpec().GetBotName()) + } +} + +// TestBotInstanceCacheSearchFilter tests that cache items are filtered by search query. +func TestBotInstanceCacheSearchFilter(t *testing.T) { + t.Parallel() + + ctx := context.Background() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + for n := range 10 { + instance := &machineidv1.BotInstance{ + Kind: types.KindBotInstance, + Version: types.V1, + Metadata: &headerv1.Metadata{}, + Spec: &machineidv1.BotInstanceSpec{ + BotName: "bot-1", + InstanceId: "instance-" + strconv.Itoa(n+1), + }, + Status: &machineidv1.BotInstanceStatus{ + LatestHeartbeats: []*machineidv1.BotInstanceStatusHeartbeat{ + { + Hostname: "host-" + strconv.Itoa(n%2), + }, + }, + }, + } + + _, err := p.botInstanceService.CreateBotInstance(ctx, instance) + require.NoError(t, err) + } + + // Let the cache catch up + require.EventuallyWithT(t, func(t *assert.CollectT) { + _, err := p.cache.GetBotInstance(ctx, "bot-1", "instance-10") + require.NoError(t, err) + }, 2*time.Second, 10*time.Millisecond) + + results, _, err := p.cache.ListBotInstances(ctx, "", 0, "", "host-1") + require.NoError(t, err) + require.Len(t, results, 5) +} diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 93638a776b376..af618d0af9622 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -210,6 +210,7 @@ func ForAuth(cfg Config) Config { {Kind: types.KindWorkloadIdentity}, {Kind: types.KindHealthCheckConfig}, {Kind: types.KindRelayServer}, + {Kind: types.KindBotInstance}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream @@ -744,6 +745,8 @@ type Config struct { GitServers services.GitServerGetter // HealthCheckConfig is a health check config service. HealthCheckConfig services.HealthCheckConfigReader + // BotInstanceService is the upstream service that we're caching + BotInstanceService services.BotInstance } // CheckAndSetDefaults checks parameters and sets default values diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index f6f1a26e36cc8..6a8a99ab58d9e 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -149,6 +149,7 @@ type testPack struct { gitServers *local.GitServerService workloadIdentity *local.WorkloadIdentityService healthCheckConfig *local.HealthCheckConfigService + botInstanceService *local.BotInstanceService } // testFuncs are functions to support testing an object in a cache. @@ -427,6 +428,11 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) { return nil, trace.Wrap(err) } + p.botInstanceService, err = local.NewBotInstanceService(p.backend, p.backend.Clock()) + if err != nil { + return nil, trace.Wrap(err) + } + return p, nil } @@ -483,6 +489,7 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) GitServers: p.gitServers, HealthCheckConfig: p.healthCheckConfig, WorkloadIdentity: p.workloadIdentity, + BotInstanceService: p.botInstanceService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -758,6 +765,7 @@ func TestCompletenessInit(t *testing.T) { EventsC: p.eventsC, GitServers: p.gitServers, HealthCheckConfig: p.healthCheckConfig, + BotInstanceService: p.botInstanceService, })) require.NoError(t, err) @@ -845,6 +853,7 @@ func TestCompletenessReset(t *testing.T) { EventsC: p.eventsC, GitServers: p.gitServers, HealthCheckConfig: p.healthCheckConfig, + BotInstanceService: p.botInstanceService, })) require.NoError(t, err) @@ -1003,6 +1012,7 @@ func TestListResources_NodesTTLVariant(t *testing.T) { neverOK: true, // ensure reads are never healthy GitServers: p.gitServers, HealthCheckConfig: p.healthCheckConfig, + BotInstanceService: p.botInstanceService, })) require.NoError(t, err) @@ -1100,6 +1110,7 @@ func initStrategy(t *testing.T) { EventsC: p.eventsC, GitServers: p.gitServers, HealthCheckConfig: p.healthCheckConfig, + BotInstanceService: p.botInstanceService, })) require.NoError(t, err) @@ -1860,6 +1871,7 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { scopedrole.KindScopedRole: types.Resource153ToLegacy(&accessv1.ScopedRole{}), scopedrole.KindScopedRoleAssignment: types.Resource153ToLegacy(&accessv1.ScopedRoleAssignment{}), types.KindRelayServer: types.ProtoResource153ToLegacy(new(presencev1.RelayServer)), + types.KindBotInstance: types.ProtoResource153ToLegacy(new(machineidv1.BotInstance)), } for name, cfg := range cases { @@ -1925,6 +1937,8 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { require.Empty(t, cmp.Diff(resource.(types.Resource153UnwrapperT[*accessv1.ScopedRoleAssignment]).UnwrapT(), uw.UnwrapT(), protocmp.Transform())) case types.Resource153UnwrapperT[*presencev1.RelayServer]: require.Empty(t, cmp.Diff(resource.(types.Resource153UnwrapperT[*presencev1.RelayServer]).UnwrapT(), uw.UnwrapT(), protocmp.Transform())) + case types.Resource153UnwrapperT[*machineidv1.BotInstance]: + require.Empty(t, cmp.Diff(resource.(types.Resource153UnwrapperT[*machineidv1.BotInstance]).UnwrapT(), uw.UnwrapT(), protocmp.Transform())) default: require.Empty(t, cmp.Diff(resource, event.Resource)) } diff --git a/lib/cache/collections.go b/lib/cache/collections.go index 3311edbb3b4bc..799e7c907e5f7 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -139,6 +139,7 @@ type collections struct { secReports *collection[*secreports.Report, securityReportIndex] secReportsStates *collection[*secreports.ReportState, securityReportStateIndex] relayServers *collection[*presencev1.RelayServer, relayServerIndex] + botInstances *collection[*machineidv1.BotInstance, botInstanceIndex] } // isKnownUncollectedKind is true if a resource kind is not stored in @@ -731,6 +732,14 @@ func setupCollections(c Config) (*collections, error) { } out.relayServers = collect out.byKind[resourceKind] = out.relayServers + case types.KindBotInstance: + collect, err := newBotInstanceCollection(c.BotInstanceService, watch) + if err != nil { + return nil, trace.Wrap(err) + } + + out.botInstances = collect + out.byKind[resourceKind] = out.botInstances default: if _, ok := out.byKind[resourceKind]; !ok { return nil, trace.BadParameter("resource %q is not supported", watch.Kind) diff --git a/lib/config/configuration.go b/lib/config/configuration.go index 7dda432e5e9f6..24da1fcbeed08 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -2782,7 +2782,7 @@ func ConfigureOpenSSH(clf *CommandLineFlags, cfg *servicecfg.Config) error { cfg.Hostname = hostname cfg.OpenSSH.InstanceAddr = clf.Address cfg.OpenSSH.AdditionalPrincipals = []string{hostname, clf.Address} - for _, principal := range strings.Split(clf.AdditionalPrincipals, ",") { + for principal := range strings.SplitSeq(clf.AdditionalPrincipals, ",") { if principal == "" { continue } diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index 3ea7cab3b1682..722e527b2edc6 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -241,7 +241,7 @@ func TestBooleanParsing(t *testing.T) { } for i, tc := range testCases { msg := fmt.Sprintf("test case %v", i) - conf, err := ReadFromString(base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(` + conf, err := ReadFromString(base64.StdEncoding.EncodeToString(fmt.Appendf(nil, ` teleport: advertise_ip: 10.10.10.1 proxy_service: @@ -250,7 +250,7 @@ proxy_service: auth_service: enabled: yes disconnect_expired_cert: %v -`, tc.s, tc.s)))) +`, tc.s, tc.s))) require.NoError(t, err, msg) require.Equal(t, tc.b, conf.Proxy.TrustXForwardedFor.Value(), msg) require.Equal(t, tc.b, conf.Auth.DisconnectExpiredCert.Value, msg) @@ -270,13 +270,13 @@ func TestDuration(t *testing.T) { } for i, tc := range testCases { comment := fmt.Sprintf("test case %v", i) - conf, err := ReadFromString(base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(` + conf, err := ReadFromString(base64.StdEncoding.EncodeToString(fmt.Appendf(nil, ` teleport: advertise_ip: 10.10.10.1 auth_service: enabled: yes client_idle_timeout: %v -`, tc.s)))) +`, tc.s))) require.NoError(t, err, comment) require.Equal(t, tc.d, conf.Auth.ClientIdleTimeout.Value(), comment) } @@ -1313,7 +1313,7 @@ func TestTunnelStrategy(t *testing.T) { config string readErr require.ErrorAssertionFunc applyErr require.ErrorAssertionFunc - tunnelStrategy interface{} + tunnelStrategy any }{ { desc: "Ensure default is used when no tunnel strategy is given", @@ -1376,7 +1376,7 @@ func TestTunnelStrategy(t *testing.T) { err = ApplyFileConfig(conf, cfg) tc.applyErr(t, err) - var actualStrategy interface{} + var actualStrategy any if cfg.Auth.NetworkingConfig == nil { } else if s := cfg.Auth.NetworkingConfig.GetAgentMeshTunnelStrategy(); s != nil { actualStrategy = s @@ -1947,10 +1947,10 @@ func TestMergingCAPinConfig(t *testing.T) { t.Run(tt.desc, func(t *testing.T) { clf := CommandLineFlags{ CAPins: tt.cliPins, - ConfigString: base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf( + ConfigString: base64.StdEncoding.EncodeToString(fmt.Appendf(nil, configWithCAPins, tt.configPins, - ))), + )), } cfg := servicecfg.MakeDefaultConfig() require.Empty(t, cfg.CAPins) @@ -2597,7 +2597,7 @@ func TestAppsCLF(t *testing.T) { inAppURI: "", inLegacyAppFlags: true, outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "application name (--app-name) and URI (--app-uri) flags are both required to join application proxy to the cluster") }, @@ -2608,7 +2608,7 @@ func TestAppsCLF(t *testing.T) { inAppName: "", inAppURI: "", outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "to join application proxy to the cluster provide application name (--name) and either URI (--uri) or Cloud type (--cloud)") }, @@ -2620,7 +2620,7 @@ func TestAppsCLF(t *testing.T) { inAppURI: "http://localhost:8080", inLegacyAppFlags: true, outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "application name (--app-name) is required to join application proxy to the cluster") }, @@ -2631,7 +2631,7 @@ func TestAppsCLF(t *testing.T) { inAppName: "", inAppURI: "http://localhost:8080", outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "to join application proxy to the cluster provide application name (--name)") }, @@ -2643,7 +2643,7 @@ func TestAppsCLF(t *testing.T) { inAppURI: "", inLegacyAppFlags: true, outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "URI (--app-uri) flag is required to join application proxy to the cluster") }, @@ -2654,7 +2654,7 @@ func TestAppsCLF(t *testing.T) { inAppName: "foo", inAppURI: "", outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "to join application proxy to the cluster provide URI (--uri) or Cloud type (--cloud)") }, @@ -2693,7 +2693,7 @@ func TestAppsCLF(t *testing.T) { inAppName: "-foo", inAppURI: "http://localhost:8080", outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "application name \"-foo\" must be a lower case valid DNS subdomain: https://goteleport.com/docs/enroll-resources/application-access/guides/connecting-apps/#application-name") }, @@ -2702,7 +2702,7 @@ func TestAppsCLF(t *testing.T) { desc: "missing uri", inAppName: "foo", outApps: nil, - requireError: func(t require.TestingT, err error, i ...interface{}) { + requireError: func(t require.TestingT, err error, i ...any) { require.True(t, trace.IsBadParameter(err)) require.ErrorContains(t, err, "missing application \"foo\" URI") }, @@ -3071,7 +3071,6 @@ func TestDatabaseCLIFlags(t *testing.T) { } for _, tt := range tests { - tt := tt t.Run(tt.desc, func(t *testing.T) { t.Parallel() @@ -3670,11 +3669,11 @@ jamf_service: func TestAuthHostedPlugins(t *testing.T) { t.Parallel() - badParameter := func(t require.TestingT, err error, msgAndArgs ...interface{}) { + badParameter := func(t require.TestingT, err error, msgAndArgs ...any) { require.Error(t, err) require.True(t, trace.IsBadParameter(err), `expected "bad parameter", but got %v`, err) } - notExist := func(t require.TestingT, err error, msgAndArgs ...interface{}) { + notExist := func(t require.TestingT, err error, msgAndArgs ...any) { require.Error(t, err) require.ErrorIs(t, err, os.ErrNotExist, `expected "does not exist", but got %v`, err) } @@ -4024,7 +4023,7 @@ func TestApplyOktaConfig(t *testing.T) { EnabledFlag: "yes", }, }, - errAssertionFunc: func(tt require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(tt require.TestingT, err error, i ...any) { require.ErrorIs(t, err, trace.BadParameter("okta_service is enabled but no api_endpoint is specified")) }, }, @@ -4037,7 +4036,7 @@ func TestApplyOktaConfig(t *testing.T) { }, APIEndpoint: `bad%url`, }, - errAssertionFunc: func(tt require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(tt require.TestingT, err error, i ...any) { require.ErrorIs(t, err, trace.BadParameter(`malformed URL bad%%url`)) }, }, @@ -4050,7 +4049,7 @@ func TestApplyOktaConfig(t *testing.T) { }, APIEndpoint: `http://`, }, - errAssertionFunc: func(tt require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(tt require.TestingT, err error, i ...any) { require.ErrorIs(t, err, trace.BadParameter("api_endpoint has no host")) }, }, @@ -4063,7 +4062,7 @@ func TestApplyOktaConfig(t *testing.T) { }, APIEndpoint: `//hostname`, }, - errAssertionFunc: func(tt require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(tt require.TestingT, err error, i ...any) { require.ErrorIs(t, err, trace.BadParameter("api_endpoint has no scheme")) }, }, @@ -4075,7 +4074,7 @@ func TestApplyOktaConfig(t *testing.T) { }, APIEndpoint: "https://test-endpoint", }, - errAssertionFunc: func(tt require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(tt require.TestingT, err error, i ...any) { require.ErrorIs(t, err, trace.BadParameter("okta_service is enabled but no api_token_path is specified")) }, }, @@ -4088,7 +4087,7 @@ func TestApplyOktaConfig(t *testing.T) { APIEndpoint: "https://test-endpoint", APITokenPath: "/non-existent/path", }, - errAssertionFunc: func(tt require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(tt require.TestingT, err error, i ...any) { require.ErrorIs(t, err, trace.BadParameter("error trying to find file %s", i...)) }, }, @@ -4104,7 +4103,7 @@ func TestApplyOktaConfig(t *testing.T) { SyncAccessListsFlag: "yes", }, }, - errAssertionFunc: func(tt require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(tt require.TestingT, err error, i ...any) { require.ErrorIs(t, err, trace.BadParameter("default owners must be set when access list import is enabled")) }, }, @@ -4124,7 +4123,7 @@ func TestApplyOktaConfig(t *testing.T) { }, }, }, - errAssertionFunc: func(t require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(t require.TestingT, err error, i ...any) { require.ErrorContains(t, err, "error parsing group filter: ^admin-.[[[*$") }, }, @@ -4144,7 +4143,7 @@ func TestApplyOktaConfig(t *testing.T) { }, }, }, - errAssertionFunc: func(t require.TestingT, err error, i ...interface{}) { + errAssertionFunc: func(t require.TestingT, err error, i ...any) { require.ErrorContains(t, err, "error parsing app filter: ^admin-.[[[*$") }, }, diff --git a/lib/config/database_test.go b/lib/config/database_test.go index fe5902ed99914..13f30012eb0b3 100644 --- a/lib/config/database_test.go +++ b/lib/config/database_test.go @@ -355,7 +355,6 @@ func TestMakeDatabaseConfig(t *testing.T) { } for name, tt := range tests { - tt := tt t.Run(name, func(t *testing.T) { t.Parallel() configString, err := MakeDatabaseAgentConfigString(tt.flags) diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index 42bb529c57d35..da1997b83bb47 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -552,7 +552,7 @@ type LogFormat struct { ExtraFields []string `yaml:"extra_fields,omitempty"` } -func (l *Log) UnmarshalYAML(unmarshal func(interface{}) error) error { +func (l *Log) UnmarshalYAML(unmarshal func(any) error) error { // the next two lines are needed because of an infinite loop issue // https://github.com/go-yaml/yaml/issues/107 type logYAML Log @@ -1516,11 +1516,7 @@ func (ssh *SSH) X11ServerConfig() (*x11.ServerConfig, error) { cfg.DisplayOffset = x11.DefaultDisplayOffset if ssh.X11.DisplayOffset != nil { - cfg.DisplayOffset = int(*ssh.X11.DisplayOffset) - - if cfg.DisplayOffset > x11.MaxDisplayNumber { - cfg.DisplayOffset = x11.MaxDisplayNumber - } + cfg.DisplayOffset = min(int(*ssh.X11.DisplayOffset), x11.MaxDisplayNumber) } cfg.MaxDisplay = cfg.DisplayOffset + x11.DefaultMaxDisplays diff --git a/lib/config/fileconf_test.go b/lib/config/fileconf_test.go index b6cc274be0aa4..e64003a624002 100644 --- a/lib/config/fileconf_test.go +++ b/lib/config/fileconf_test.go @@ -60,7 +60,7 @@ discovery_service: // cfgMap is a shorthand for a type that can hold the nested key-value // representation of a parsed YAML file. -type cfgMap map[interface{}]interface{} +type cfgMap map[any]any // editConfig takes the minimal YAML configuration file, de-serializes it into a // nested key-value dictionary suitable for manipulation by a test case, @@ -79,8 +79,8 @@ func editConfig(t *testing.T, mutate func(cfg cfgMap)) []byte { // requireEqual creates an assertion function with a bound `expected` value // for use with table-driven tests -func requireEqual(expected interface{}) require.ValueAssertionFunc { - return func(t require.TestingT, actual interface{}, msgAndArgs ...interface{}) { +func requireEqual(expected any) require.ValueAssertionFunc { + return func(t require.TestingT, actual any, msgAndArgs ...any) { require.Equal(t, expected, actual, msgAndArgs...) } } @@ -236,8 +236,8 @@ func TestAuthenticationSection(t *testing.T) { "second_factor": "u2f", "u2f": cfgMap{ "app_id": "https://graviton:3080", - "facets": []interface{}{"https://graviton:3080"}, - "device_attestation_cas": []interface{}{ + "facets": []any{"https://graviton:3080"}, + "device_attestation_cas": []any{ "testdata/u2f_attestation_ca.pam", "-----BEGIN CERTIFICATE-----\nfake certificate\n-----END CERTIFICATE-----", }, @@ -266,11 +266,11 @@ func TestAuthenticationSection(t *testing.T) { "second_factor": "webauthn", "webauthn": cfgMap{ "rp_id": "example.com", - "attestation_allowed_cas": []interface{}{ + "attestation_allowed_cas": []any{ "testdata/u2f_attestation_ca.pam", "-----BEGIN CERTIFICATE-----\nfake certificate1\n-----END CERTIFICATE-----", }, - "attestation_denied_cas": []interface{}{ + "attestation_denied_cas": []any{ "-----BEGIN CERTIFICATE-----\nfake certificate2\n-----END CERTIFICATE-----", "testdata/u2f_attestation_ca.pam", }, @@ -300,7 +300,7 @@ func TestAuthenticationSection(t *testing.T) { "second_factor": "on", "u2f": cfgMap{ "app_id": "https://example.com", - "facets": []interface{}{ + "facets": []any{ "https://example.com", }, }, @@ -457,7 +457,7 @@ func TestAuthenticationSection(t *testing.T) { "signature_algorithm_suite": "balanced-v0", } }, - expectError: func(t require.TestingT, err error, msgAndArgs ...interface{}) { + expectError: func(t require.TestingT, err error, msgAndArgs ...any) { require.ErrorContains(t, err, "invalid value: balanced-v0") }, }, { @@ -1020,7 +1020,7 @@ func TestHardwareKeyConfig(t *testing.T) { }, } }, - expectParseError: func(t require.TestingT, err error, i ...interface{}) { + expectParseError: func(t require.TestingT, err error, i ...any) { require.Error(t, err) require.True(t, trace.IsBadParameter(err), "got err = %v, want BadParameter", err) }, @@ -1197,7 +1197,7 @@ func TestX11Config(t *testing.T) { "max_display": 100, } }, - expectConfigError: func(t require.TestingT, err error, i ...interface{}) { + expectConfigError: func(t require.TestingT, err error, i ...any) { require.Error(t, err) require.True(t, trace.IsBadParameter(err), "got err = %v, want BadParameter", err) }, diff --git a/lib/events/api.go b/lib/events/api.go index 6d6aa67169b69..4bf27ddbec07f 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -924,6 +924,15 @@ const ( // MCPSessionNotificationEvent is emitted when a notification is sent by // client during a MCP session. MCPSessionNotificationEvent = "mcp.session.notification" + + // BoundKeypairRecovery is emitted when a bound keypair token is used to + // perform a recovery. + BoundKeypairRecovery = "join_token.bound_keypair.recovery" + // BoundKeypairRotation is emitted when a keypair rotation is attempted. + BoundKeypairRotation = "join_token.bound_keypair.rotation" + // BoundKeypairJoinStateVerificationFailed is emitted when join state + // document verification fails. + BoundKeypairJoinStateVerificationFailed = "join_token.bound_keypair.join_state_verification_failed" ) // Add an entry to eventsMap in lib/events/events_test.go when you add diff --git a/lib/events/athena/consumer.go b/lib/events/athena/consumer.go index 4c51ec53f0fa8..85cd6b6cf1ade 100644 --- a/lib/events/athena/consumer.go +++ b/lib/events/athena/consumer.go @@ -490,7 +490,7 @@ func (s *sqsMessagesCollector) fromSQS(ctx context.Context) { ) wg.Add(s.cfg.noOfWorkers) - for i := 0; i < s.cfg.noOfWorkers; i++ { + for i := range s.cfg.noOfWorkers { go func(i int) { defer wg.Done() for { @@ -904,7 +904,7 @@ func (c *consumer) deleteMessagesFromQueue(ctx context.Context, handles []string var wg sync.WaitGroup // Start the worker goroutines - for i := 0; i < noOfWorkers; i++ { + for range noOfWorkers { wg.Add(1) go func() { defer wg.Done() @@ -935,10 +935,7 @@ func (c *consumer) deleteMessagesFromQueue(ctx context.Context, handles []string // Batch the receipt handles and send them to the worker pool. for i := 0; i < len(handles); i += maxDeleteBatchSize { - end := i + maxDeleteBatchSize - if end > len(handles) { - end = len(handles) - } + end := min(i+maxDeleteBatchSize, len(handles)) workerCh <- handles[i:end] } close(workerCh) diff --git a/lib/events/athena/consumer_test.go b/lib/events/athena/consumer_test.go index b51b87ae7d6bc..59103ae87b7aa 100644 --- a/lib/events/athena/consumer_test.go +++ b/lib/events/athena/consumer_test.go @@ -91,8 +91,7 @@ func Test_consumer_sqsMessagesCollector(t *testing.T) { c := newSqsMessagesCollector(cfg) eventsChan := c.getEventsChan() - readSQSCtx, readCancel := context.WithCancel(context.Background()) - defer readCancel() + readSQSCtx := t.Context() go c.fromSQS(readSQSCtx) // receiver is used to read messages from eventsChan. @@ -164,8 +163,7 @@ func Test_consumer_sqsMessagesCollector(t *testing.T) { eventsChan := c.getEventsChan() - readSQSCtx, readCancel := context.WithCancel(context.Background()) - defer readCancel() + readSQSCtx := t.Context() go c.fromSQS(readSQSCtx) @@ -210,8 +208,7 @@ func Test_consumer_sqsMessagesCollector(t *testing.T) { eventsChan := c.getEventsChan() - readSQSCtx, readCancel := context.WithCancel(context.Background()) - defer readCancel() + readSQSCtx := t.Context() go c.fromSQS(readSQSCtx) @@ -221,7 +218,7 @@ func Test_consumer_sqsMessagesCollector(t *testing.T) { // When over 100 unique days are sent eventsToSend := make([]apievents.AuditEvent, 0, 101) - for i := 0; i < 101; i++ { + for i := range 101 { day := fclock.Now().Add(time.Duration(i) * 24 * time.Hour) eventsToSend = append(eventsToSend, &apievents.AppCreate{Metadata: apievents.Metadata{Type: events.AppCreateEvent, Time: day}, AppMetadata: apievents.AppMetadata{AppName: "app1"}}) } @@ -666,7 +663,7 @@ func TestDeleteMessagesFromQueue(t *testing.T) { handlesGen := func(n int) []string { out := make([]string, 0, n) - for i := 0; i < n; i++ { + for i := range n { out = append(out, fmt.Sprintf("handle-%d", i)) } return out diff --git a/lib/events/athena/querier_test.go b/lib/events/athena/querier_test.go index 270d6c36110f1..578f05e63328b 100644 --- a/lib/events/athena/querier_test.go +++ b/lib/events/athena/querier_test.go @@ -90,7 +90,7 @@ func TestSearchEvents(t *testing.T) { sliceOfDummyEvents := func(noOfEvents int) []apievents.AuditEvent { out := make([]apievents.AuditEvent, 0, noOfEvents) - for i := 0; i < noOfEvents; i++ { + for range noOfEvents { out = append(out, &apievents.AppCreate{ Metadata: apievents.Metadata{ ID: uuid.NewString(), diff --git a/lib/events/auditlog_test.go b/lib/events/auditlog_test.go index 7b70a2df24bd4..95cc08da4cb03 100644 --- a/lib/events/auditlog_test.go +++ b/lib/events/auditlog_test.go @@ -138,7 +138,7 @@ func TestConcurrentStreaming(t *testing.T) { // on the download that the first one started streams := 2 errors := make(chan error, streams) - for i := 0; i < streams; i++ { + for range streams { go func() { eventsC, errC := alog.StreamSessionEvents(ctx, sid, 0) for { @@ -157,7 +157,7 @@ func TestConcurrentStreaming(t *testing.T) { // This test just verifies that the streamer does not panic when multiple // concurrent streams are waiting on the same download to complete. - for i := 0; i < streams; i++ { + for range streams { <-errors } } diff --git a/lib/events/azsessions/azsessions.go b/lib/events/azsessions/azsessions.go index 1e8e3cffaae96..2c6ad40250f93 100644 --- a/lib/events/azsessions/azsessions.go +++ b/lib/events/azsessions/azsessions.go @@ -411,10 +411,7 @@ func (h *Handler) CompleteUpload(ctx context.Context, upload events.StreamUpload return trace.Wrap(err) } - m := batchSize - if len(parts[i:]) < batchSize { - m = len(parts[i:]) - } + m := min(len(parts[i:]), batchSize) for _, part := range parts[i : i+m] { if err := batch.Delete(partName(upload, part.Number), nil); err != nil { diff --git a/lib/events/codes.go b/lib/events/codes.go index 5e77b4758c017..f9027d855aebb 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -752,6 +752,16 @@ const ( // mcp.session.notification. MCPSessionNotificationCode = "TMCP004I" + // BoundKeypairRecoveryCode is the event code for + // join_token.bound_keypair.recovery. + BoundKeypairRecoveryCode = "TBK001I" + // BoundKeypairRotationCode is the event code for + // join_token.bound_keypair.rotation. + BoundKeypairRotationCode = "TBK002I" + // BoundKeypairJoinStateVerificationFailedCode is the event code for + // join_token.bound_keypair.join_state_verification_failed. + BoundKeypairJoinStateVerificationFailedCode = "TBK003W" + // UnknownCode is used when an event of unknown type is encountered. UnknownCode = apievents.UnknownCode ) diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index 415c0d5b04711..311291bd93978 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -533,6 +533,13 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { case MCPSessionNotificationEvent: e = &events.MCPSessionNotification{} + case BoundKeypairRecovery: + e = &events.BoundKeypairRecovery{} + case BoundKeypairRotation: + e = &events.BoundKeypairRotation{} + case BoundKeypairJoinStateVerificationFailed: + e = &events.BoundKeypairJoinStateVerificationFailed{} + default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", eventType) unknown := &events.Unknown{} diff --git a/lib/events/dynamoevents/dynamoevents.go b/lib/events/dynamoevents/dynamoevents.go index ee2297558f21a..317e5016349e9 100644 --- a/lib/events/dynamoevents/dynamoevents.go +++ b/lib/events/dynamoevents/dynamoevents.go @@ -471,7 +471,7 @@ func (l *Log) configureTable(ctx context.Context, svc *applicationautoscaling.Cl // Define scaling policy. Defines the ratio of {read,write} consumed capacity to // provisioned capacity DynamoDB will try and maintain. - for i := 0; i < 2; i++ { + for i := range 2 { if _, err := svc.PutScalingPolicy(ctx, &applicationautoscaling.PutScalingPolicyInput{ PolicyName: aws.String(p.readPolicy), PolicyType: autoscalingtypes.PolicyTypeTargetTrackingScaling, @@ -807,7 +807,7 @@ func (l *Log) GetEventExportChunks(ctx context.Context, req *auditlogpb.GetEvent // The reason that this doesn't fill in the values as literals within the list is to prevent injection attacks. func eventFilterList(amount int) string { var eventTypes []string - for i := 0; i < amount; i++ { + for i := range amount { eventTypes = append(eventTypes, fmt.Sprintf(":eventType%d", i)) } return "(" + strings.Join(eventTypes, ", ") + ")" @@ -1059,7 +1059,7 @@ func getSubPageCheckpoint(e *event) (string, error) { func (l *Log) SearchSessionEvents(ctx context.Context, req events.SearchSessionEventsRequest) ([]apievents.AuditEvent, string, error) { filter := searchEventsFilter{eventTypes: events.SessionRecordingEvents} if req.Cond != nil { - params := condFilterParams{attrValues: make(map[string]interface{}), attrNames: make(map[string]string)} + params := condFilterParams{attrValues: make(map[string]any), attrNames: make(map[string]string)} expr, err := fromWhereExpr(req.Cond, ¶ms) if err != nil { return nil, "", trace.Wrap(err) @@ -1085,7 +1085,7 @@ type searchEventsFilter struct { } type condFilterParams struct { - attrValues map[string]interface{} + attrValues map[string]any attrNames map[string]string } @@ -1115,7 +1115,7 @@ func fromWhereExpr(cond *types.WhereExpr, params *condFilterParams) (string, err return fmt.Sprintf("NOT (%s)", inner), nil } - addAttrValue := func(in interface{}) string { + addAttrValue := func(in any) string { for k, v := range params.attrValues { if in == v { return k @@ -1280,10 +1280,7 @@ func (l *Log) deleteAllItems(ctx context.Context) error { } for len(requests) > 0 { - top := 25 - if top > len(requests) { - top = len(requests) - } + top := min(25, len(requests)) chunk := requests[:top] requests = requests[top:] @@ -1471,7 +1468,7 @@ dateLoop: for i, date := range l.dates { l.checkpoint.Date = date - attributes := map[string]interface{}{ + attributes := map[string]any{ ":date": date, ":start": l.fromUTC.Unix(), ":end": l.toUTC.Unix(), @@ -1556,7 +1553,7 @@ dateLoop: func (l *eventsFetcher) QueryBySessionIDIndex(ctx context.Context, sessionID string, filterExpr *string) (values []event, err error) { query := "SessionID = :id" - attributes := map[string]interface{}{ + attributes := map[string]any{ ":id": sessionID, } for i, eventType := range l.filter.eventTypes { diff --git a/lib/events/dynamoevents/dynamoevents_test.go b/lib/events/dynamoevents/dynamoevents_test.go index a176cff26a354..783c12e694797 100644 --- a/lib/events/dynamoevents/dynamoevents_test.go +++ b/lib/events/dynamoevents/dynamoevents_test.go @@ -159,7 +159,7 @@ func TestSizeBreak(t *testing.T) { blob := randStringAlpha(eventSize) const eventCount int = 10 - for i := 0; i < eventCount; i++ { + for i := range eventCount { err := tt.suite.Log.EmitAuditEvent(context.Background(), &apievents.UserLogin{ Method: events.LoginMethodSAML, Status: apievents.Status{Success: true}, @@ -168,7 +168,7 @@ func TestSizeBreak(t *testing.T) { Type: events.UserLoginEvent, Time: tt.suite.Clock.Now().UTC().Add(time.Second * time.Duration(i)), }, - IdentityAttributes: apievents.MustEncodeMap(map[string]interface{}{"test.data": blob}), + IdentityAttributes: apievents.MustEncodeMap(map[string]any{"test.data": blob}), }) require.NoError(t, err) } @@ -233,7 +233,7 @@ func TestLargeTableRetrieve(t *testing.T) { tt := setupDynamoContext(t) const eventCount = 4000 - for i := 0; i < eventCount; i++ { + for range eventCount { err := tt.suite.Log.EmitAuditEvent(context.Background(), &apievents.UserLogin{ Method: events.LoginMethodSAML, Status: apievents.Status{Success: true}, @@ -251,7 +251,7 @@ func TestLargeTableRetrieve(t *testing.T) { err error ) ctx := context.Background() - for i := 0; i < dynamoDBLargeQueryRetries; i++ { + for range dynamoDBLargeQueryRetries { time.Sleep(tt.suite.QueryDelay) history, _, err = tt.suite.Log.SearchEvents(ctx, events.SearchEventsRequest{ @@ -282,14 +282,14 @@ func TestFromWhereExpr(t *testing.T) { R: &types.WhereExpr{Contains: types.WhereExpr2{L: &types.WhereExpr{Field: "participants"}, R: &types.WhereExpr{Literal: "test-user"}}}, }} - params := condFilterParams{attrNames: map[string]string{}, attrValues: map[string]interface{}{}} + params := condFilterParams{attrNames: map[string]string{}, attrValues: map[string]any{}} expr, err := fromWhereExpr(cond, ¶ms) require.NoError(t, err) require.Equal(t, "(NOT ((FieldsMap.#condName0 = :condValue0) OR (FieldsMap.#condName0 = :condValue1))) AND (contains(FieldsMap.#condName1, :condValue2))", expr) require.Equal(t, condFilterParams{ attrNames: map[string]string{"#condName0": "login", "#condName1": "participants"}, - attrValues: map[string]interface{}{":condValue0": "root", ":condValue1": "admin", ":condValue2": "test-user"}, + attrValues: map[string]any{":condValue0": "root", ":condValue1": "admin", ":condValue2": "test-user"}, }, params) } @@ -511,8 +511,8 @@ func TestSearchEventsLimitEndOfDay(t *testing.T) { const eventCount int = 10 // create events for two days - for dayDiff := 0; dayDiff < 2; dayDiff++ { - for i := 0; i < eventCount; i++ { + for dayDiff := range 2 { + for i := range eventCount { err := tt.suite.Log.EmitAuditEvent(ctx, &apievents.UserLogin{ Method: events.LoginMethodSAML, Status: apievents.Status{Success: true}, @@ -521,7 +521,7 @@ func TestSearchEventsLimitEndOfDay(t *testing.T) { Type: events.UserLoginEvent, Time: tt.suite.Clock.Now().UTC().Add(time.Hour*24*time.Duration(dayDiff) + time.Second*time.Duration(i)), }, - IdentityAttributes: apievents.MustEncodeMap(map[string]interface{}{"test.data": blob}), + IdentityAttributes: apievents.MustEncodeMap(map[string]any{"test.data": blob}), }) require.NoError(t, err) } diff --git a/lib/events/dynamoevents/legacy_test.go b/lib/events/dynamoevents/legacy_test.go index 0fd63182c04f1..4f109be40ec1b 100644 --- a/lib/events/dynamoevents/legacy_test.go +++ b/lib/events/dynamoevents/legacy_test.go @@ -33,7 +33,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "binary field": { attributeJSON: `{ "B": "dGVzdAo=", "BOOL": null, "BS": null, "L": null, "M": null, "N": null, "NS": null, "NULL": null, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberB{}, i1) attr, _ := i1.(*types.AttributeValueMemberB) // Parsed binaries include line feed character. @@ -43,7 +43,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "bool field": { attributeJSON: `{ "B": null, "BOOL": true, "BS": null, "L": null, "M": null, "N": null, "NS": null, "NULL": null, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberBOOL{}, i1) attr, _ := i1.(*types.AttributeValueMemberBOOL) require.True(t, attr.Value) @@ -52,7 +52,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "binary set field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": ["aGVsbG8K", "d29ybGQK"], "L": null, "M": null, "N": null, "NS": null, "NULL": null, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberBS{}, i1) attr, _ := i1.(*types.AttributeValueMemberBS) // Parsed binaries include line feed character. @@ -62,7 +62,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "list field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": null, "L": [{"S": "hello"}, {"S": "world"}], "M": null, "N": null, "NS": null, "NULL": null, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberL{}, i1) attr, _ := i1.(*types.AttributeValueMemberL) require.Len(t, attr.Value, 2) @@ -73,7 +73,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "map field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": null, "L": null, "M": {"name": { "B": null, "BOOL": null, "BS": null, "L": null, "M": null, "N": null, "NS": null, "NULL": null, "S": "test", "SS": null }}, "N": null, "NS": null, "NULL": null, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberM{}, i1) attr, _ := i1.(*types.AttributeValueMemberM) require.Len(t, attr.Value, 1) @@ -88,7 +88,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "number field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": null, "L": null, "M": null, "N": "123.4", "NS": null, "NULL": null, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberN{}, i1) attr, _ := i1.(*types.AttributeValueMemberN) require.Equal(t, "123.4", attr.Value) @@ -97,7 +97,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "number set field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": null, "L": null, "M": null, "N": null, "NS": ["123", "4.5"], "NULL": null, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberNS{}, i1) attr, _ := i1.(*types.AttributeValueMemberNS) require.ElementsMatch(t, []string{"123", "4.5"}, attr.Value) @@ -106,7 +106,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "null field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": null, "L": null, "M": null, "N": null, "NS": null, "NULL": true, "S": null, "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberNULL{}, i1) attr, _ := i1.(*types.AttributeValueMemberNULL) require.True(t, attr.Value) @@ -115,7 +115,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "string field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": null, "L": null, "M": null, "N": null, "NS": null, "NULL": null, "S": "test", "SS": null }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberS{}, i1) attr, _ := i1.(*types.AttributeValueMemberS) require.Equal(t, "test", attr.Value) @@ -124,7 +124,7 @@ func TestParseLegacyDynamoAttributes(t *testing.T) { "string set field": { attributeJSON: `{ "B": null, "BOOL": null, "BS": null, "L": null, "M": null, "N": null, "NS": null, "NULL": null, "S": null, "SS": ["hello", "world"] }`, expectConvertError: require.NoError, - expectedAttribute: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + expectedAttribute: func(tt require.TestingT, i1 any, i2 ...any) { require.IsType(t, &types.AttributeValueMemberSS{}, i1) attr, _ := i1.(*types.AttributeValueMemberSS) require.ElementsMatch(t, []string{"hello", "world"}, attr.Value) diff --git a/lib/events/emitter_test.go b/lib/events/emitter_test.go index c7b4cc2076d77..f34b07a5dc7c5 100644 --- a/lib/events/emitter_test.go +++ b/lib/events/emitter_test.go @@ -73,8 +73,7 @@ func TestProtoStreamer(t *testing.T) { }, } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() for i, tc := range testCases { t.Run(tc.name, func(t *testing.T) { @@ -175,7 +174,7 @@ func TestAsyncEmitter(t *testing.T) { require.NoError(t, err) } - for i := 0; i < len(evts); i++ { + for i := range evts { select { case event := <-chanEmitter.C(): require.Equal(t, evts[i], event) diff --git a/lib/events/events_test.go b/lib/events/events_test.go index 23fefc643ae4b..031fdae0907e8 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -263,6 +263,9 @@ var eventsMap = map[string]apievents.AuditEvent{ HealthCheckConfigCreateEvent: &apievents.HealthCheckConfigCreate{}, HealthCheckConfigUpdateEvent: &apievents.HealthCheckConfigUpdate{}, HealthCheckConfigDeleteEvent: &apievents.HealthCheckConfigDelete{}, + BoundKeypairRecovery: &apievents.BoundKeypairRecovery{}, + BoundKeypairRotation: &apievents.BoundKeypairRotation{}, + BoundKeypairJoinStateVerificationFailed: &apievents.BoundKeypairJoinStateVerificationFailed{}, } // TestJSON tests JSON marshal events @@ -270,7 +273,7 @@ func TestJSON(t *testing.T) { type testCase struct { name string json string - event interface{} + event any } testCases := []testCase{ { @@ -503,20 +506,20 @@ func TestJSON(t *testing.T) { UserMetadata: apievents.UserMetadata{ User: "bob@example.com", }, - IdentityAttributes: apievents.MustEncodeMap(map[string]interface{}{ + IdentityAttributes: apievents.MustEncodeMap(map[string]any{ "followers_url": "https://api.github.com/users/bob/followers", "err": nil, "public_repos": 20, "site_admin": false, - "app_metadata": map[string]interface{}{"roles": []interface{}{"example/admins", "example/devc"}}, - "emails": []interface{}{ - map[string]interface{}{ + "app_metadata": map[string]any{"roles": []any{"example/admins", "example/devc"}}, + "emails": []any{ + map[string]any{ "email": "bob@example.com", "primary": true, "verified": true, "visibility": "public", }, - map[string]interface{}{ + map[string]any{ "email": "bob@alternative.com", "primary": false, "verified": true, @@ -1000,7 +1003,6 @@ func TestJSON(t *testing.T) { }, } for _, tc := range testCases { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -1081,7 +1083,7 @@ func setProtoFields(msg proto.Message) { m := msg.ProtoReflect() fields := m.Descriptor().Fields() - for i := 0; i < fields.Len(); i++ { + for i := range fields.Len() { fd := fields.Get(i) if m.Has(fd) { continue diff --git a/lib/events/eventstest/generate.go b/lib/events/eventstest/generate.go index 25d2e2070d9ef..48d43bcf20bc6 100644 --- a/lib/events/eventstest/generate.go +++ b/lib/events/eventstest/generate.go @@ -125,8 +125,7 @@ func GenerateTestSession(params SessionParams) []apievents.AuditEvent { } genEvents := []apievents.AuditEvent{&sessionStart} - i := int64(0) - for i = 0; i < params.PrintEvents; i++ { + for i := range params.PrintEvents { event := &apievents.SessionPrint{ Metadata: apievents.Metadata{ Index: i + 1, @@ -144,8 +143,7 @@ func GenerateTestSession(params SessionParams) []apievents.AuditEvent { genEvents = append(genEvents, event) } - i++ - sessionEnd.Metadata.Index = i + sessionEnd.Metadata.Index = int64(len(genEvents)) genEvents = append(genEvents, &sessionEnd) return genEvents diff --git a/lib/events/eventstest/uploader.go b/lib/events/eventstest/uploader.go index 99cee3b1e3f94..21daa3f04b9ad 100644 --- a/lib/events/eventstest/uploader.go +++ b/lib/events/eventstest/uploader.go @@ -22,6 +22,7 @@ import ( "bytes" "context" "io" + "slices" "sort" "sync" "time" @@ -210,9 +211,7 @@ func (m *MemoryUploader) GetParts(uploadID string) ([][]byte, error) { for partNumber := range up.parts { partNumbers = append(partNumbers, partNumber) } - sort.Slice(partNumbers, func(i, j int) bool { - return partNumbers[i] < partNumbers[j] - }) + slices.Sort(partNumbers) for _, partNumber := range partNumbers { sortedParts = append(sortedParts, up.parts[partNumber].data) } @@ -242,9 +241,7 @@ func (m *MemoryUploader) ListParts(ctx context.Context, upload events.StreamUplo for partNumber := range up.parts { partNumbers = append(partNumbers, partNumber) } - sort.Slice(partNumbers, func(i, j int) bool { - return partNumbers[i] < partNumbers[j] - }) + slices.Sort(partNumbers) for _, partNumber := range partNumbers { sortedParts = append(sortedParts, events.StreamPart{Number: partNumber}) } diff --git a/lib/events/export/date_exporter.go b/lib/events/export/date_exporter.go index 2ce6d1413356c..fe288792d9ec0 100644 --- a/lib/events/export/date_exporter.go +++ b/lib/events/export/date_exporter.go @@ -22,6 +22,7 @@ import ( "cmp" "context" "log/slog" + "maps" "sync" "sync/atomic" "time" @@ -138,9 +139,7 @@ func (s *DateExporterState) Clone() DateExporterState { Cursors: make(map[string]string, len(s.Cursors)), } copy(cloned.Completed, s.Completed) - for chunk, cursor := range s.Cursors { - cloned.Cursors[chunk] = cursor - } + maps.Copy(cloned.Cursors, s.Cursors) return cloned } @@ -343,12 +342,12 @@ func (e *DateExporter) run(ctx context.Context) { // to halt. func (e *DateExporter) waitForInflightChunks() { // acquire all semaphore tokens to block until all inflight chunks have been processed - for i := 0; i < e.cfg.Concurrency; i++ { + for range e.cfg.Concurrency { e.sem <- struct{}{} } // release all semaphore tokens - for i := 0; i < e.cfg.Concurrency; i++ { + for range e.cfg.Concurrency { <-e.sem } } diff --git a/lib/events/export/date_exporter_test.go b/lib/events/export/date_exporter_test.go index 44f405ab6d173..738d14307aace 100644 --- a/lib/events/export/date_exporter_test.go +++ b/lib/events/export/date_exporter_test.go @@ -228,7 +228,6 @@ func testDateExporterBasics(t *testing.T, randomFlake bool, batch bool) { // TestDateExporterResume verifies non-trivial exporter resumption behavior, with and without // random flake. - func TestDateExporterResume(t *testing.T) { t.Parallel() for _, randomFlake := range []bool{false, true} { @@ -332,8 +331,6 @@ func testDateExporterResume(t *testing.T, randomFlake bool) { // get the final state of the exporter state := exporter.GetState() - fmt.Printf("cursors=%+v\n", state.Cursors) - // recreate exporter with state from previous run exporter, err = NewDateExporter(DateExporterConfig{ Client: clt, diff --git a/lib/events/export/exporter_test.go b/lib/events/export/exporter_test.go index 715626609159f..fdf4238af6787 100644 --- a/lib/events/export/exporter_test.go +++ b/lib/events/export/exporter_test.go @@ -21,6 +21,7 @@ package export import ( "context" "fmt" + "slices" "sync" "testing" "time" @@ -133,7 +134,7 @@ func testExportAll(t *testing.T, tc exportTestCase) { getExported := func() []*auditlogpb.ExportEventUnstructured { exportedMu.Lock() defer exportedMu.Unlock() - return append([]*auditlogpb.ExportEventUnstructured(nil), exported...) + return slices.Clone(exported) } var idleOnce sync.Once diff --git a/lib/events/filelog.go b/lib/events/filelog.go index 508bfa5d1ceeb..25bb4b259fca6 100644 --- a/lib/events/filelog.go +++ b/lib/events/filelog.go @@ -28,6 +28,7 @@ import ( "log/slog" "os" "path/filepath" + "slices" "sort" "strings" "sync" @@ -589,13 +590,7 @@ func (l *FileLog) findInFile(path string, filter searchEventsFilter) ([]EventFie l.logger.WarnContext(context.Background(), "invalid JSON in line found", "file", path, "line_number", lineNo) continue } - accepted := len(filter.eventTypes) == 0 - for _, eventType := range filter.eventTypes { - if ef.GetString(EventType) == eventType { - accepted = true - break - } - } + accepted := len(filter.eventTypes) == 0 || slices.Contains(filter.eventTypes, ef.GetString(EventType)) if !accepted { continue } @@ -657,7 +652,7 @@ func (f ByTimeAndIndex) Swap(i, j int) { } // getTime converts json time to string -func getTime(v interface{}) time.Time { +func getTime(v any) time.Time { sval, ok := v.(string) if !ok { return time.Time{} @@ -669,7 +664,7 @@ func getTime(v interface{}) time.Time { return t } -func getEventIndex(v interface{}) float64 { +func getEventIndex(v any) float64 { switch val := v.(type) { case float64: return val diff --git a/lib/events/filelog_test.go b/lib/events/filelog_test.go index 7ad6a0b7e2195..bf594d2625f35 100644 --- a/lib/events/filelog_test.go +++ b/lib/events/filelog_test.go @@ -273,7 +273,7 @@ func TestLargeEvent(t *testing.T) { // are many very small string fields that will require quoting. func makeLargeMongoQuery() (string, error) { record := map[string]string{"_id": `{"$oid":"63a0dd6da68baaeb828581fe"}`} - for i := 0; i < 100; i++ { + for i := range 100 { t := fmt.Sprintf("%v", i) record[t] = t } diff --git a/lib/events/filesessions/fileasync_chaos_test.go b/lib/events/filesessions/fileasync_chaos_test.go index 26e7a2b522911..e493c9d4caee0 100644 --- a/lib/events/filesessions/fileasync_chaos_test.go +++ b/lib/events/filesessions/fileasync_chaos_test.go @@ -50,8 +50,7 @@ func TestChaosUpload(t *testing.T) { t.Skip("Skipping chaos test in short mode.") } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() eventsC := make(chan events.UploadEvent, 100) memUploader := eventstest.NewMemoryUploader(eventsC) @@ -132,7 +131,7 @@ func TestChaosUpload(t *testing.T) { err error } streamsCh := make(chan streamState, parallelStreams) - for i := 0; i < parallelStreams; i++ { + for range parallelStreams { go func() { inEvents := eventstest.GenerateTestSession(eventstest.SessionParams{PrintEvents: 4096}) sid := inEvents[0].(events.SessionMetadataGetter).GetSessionID() @@ -162,7 +161,7 @@ func TestChaosUpload(t *testing.T) { // wait for all streams to be completed streams := make(map[string]streamState) - for i := 0; i < parallelStreams; i++ { + for range parallelStreams { select { case status := <-streamsCh: require.NoError(t, status.err) @@ -174,7 +173,7 @@ func TestChaosUpload(t *testing.T) { require.Len(t, streams, parallelStreams) - for i := 0; i < parallelStreams; i++ { + for range parallelStreams { select { case event := <-eventsC: require.NoError(t, event.Error) diff --git a/lib/events/filesessions/fileasync_test.go b/lib/events/filesessions/fileasync_test.go index a015bde8ec15c..15811091accdd 100644 --- a/lib/events/filesessions/fileasync_test.go +++ b/lib/events/filesessions/fileasync_test.go @@ -84,7 +84,7 @@ func TestUploadParallel(t *testing.T) { sessions := make(map[string][]apievents.AuditEvent) - for i := 0; i < 5; i++ { + for range 5 { fileStreamer, err := NewStreamer(p.scanDir) require.NoError(t, err) @@ -406,7 +406,7 @@ func TestUploadBackoff(t *testing.T) { attempts := 10 var prev time.Time var diffs []time.Duration - for i := 0; i < attempts; i++ { + for i := range attempts { // wait for the upload event var event events.UploadEvent select { @@ -611,7 +611,7 @@ func runResume(t *testing.T, testCase resumeTestCase) { t.Fatalf("Timeout waiting for async upload, try `go test -v` to get more logs for details") } - for i := 0; i < testCase.retries; i++ { + for i := range testCase.retries { if testCase.onRetry != nil { testCase.onRetry(t, i, uploader) } diff --git a/lib/events/filesessions/filestream.go b/lib/events/filesessions/filestream.go index d58d60e054d26..2cb5ac941921d 100644 --- a/lib/events/filesessions/filestream.go +++ b/lib/events/filesessions/filestream.go @@ -151,7 +151,7 @@ func (h *Handler) CompleteUpload(ctx context.Context, upload events.StreamUpload } unlock, err := utils.FSTryWriteLock(uploadPath) Loop: - for i := 0; i < 3; i++ { + for range 3 { switch { case err == nil: break Loop diff --git a/lib/events/firestoreevents/firestoreevents.go b/lib/events/firestoreevents/firestoreevents.go index 6c1e5c6eb72dd..6ee9a1ab5ba5d 100644 --- a/lib/events/firestoreevents/firestoreevents.go +++ b/lib/events/firestoreevents/firestoreevents.go @@ -498,7 +498,7 @@ func (l *Log) query( // Iterate over the documents in the query. // The iterator is limited to [limit] documents so in order to know if we // have more pages to read when filtering, we can read only [limit] documents. - for i := 0; i < limit; i++ { + for range limit { docSnap, err := fstoreIterator.Next() if errors.Is(err, iterator.Done) { // iterator.Done is returned when there are no more documents to read. diff --git a/lib/events/firestoreevents/firestoreevents_test.go b/lib/events/firestoreevents/firestoreevents_test.go index 6b34a5cdfc0f3..f5b720f87d7ff 100644 --- a/lib/events/firestoreevents/firestoreevents_test.go +++ b/lib/events/firestoreevents/firestoreevents_test.go @@ -53,7 +53,7 @@ func setupFirestoreContext(t *testing.T) *firestoreContext { fakeClock := clockwork.NewFakeClock() config := EventsConfig{} - config.SetFromParams(map[string]interface{}{ + config.SetFromParams(map[string]any{ "collection_name": "tp-events-test", "project_id": "tp-testproj", "endpoint": "localhost:8618", diff --git a/lib/events/gcssessions/gcsstream.go b/lib/events/gcssessions/gcsstream.go index 8e1d47bbbeb5f..b20c3a834a911 100644 --- a/lib/events/gcssessions/gcsstream.go +++ b/lib/events/gcssessions/gcsstream.go @@ -216,7 +216,7 @@ func (h *Handler) cleanupUpload(ctx context.Context, upload events.StreamUpload) func (h *Handler) partsToObjects(upload events.StreamUpload, parts []events.StreamPart) []*storage.ObjectHandle { objects := make([]*storage.ObjectHandle, len(parts)) bucket := h.gcsClient.Bucket(h.Config.Bucket) - for i := 0; i < len(parts); i++ { + for i := range parts { objects[i] = bucket.Object(h.partPath(upload, parts[i].Number)) } return objects diff --git a/lib/events/pgevents/utils_test.go b/lib/events/pgevents/utils_test.go index 532e75fb40a8d..b2938ea37becb 100644 --- a/lib/events/pgevents/utils_test.go +++ b/lib/events/pgevents/utils_test.go @@ -32,7 +32,7 @@ import ( func TestPaginationKeyRoundtrip(t *testing.T) { t.Parallel() - for i := 0; i < 1000; i++ { + for range 1000 { var b [24]byte _, err := rand.Read(b[:]) require.NoError(t, err) @@ -45,7 +45,7 @@ func TestPaginationKeyRoundtrip(t *testing.T) { require.Equal(t, startKey, toNextKey(eventTime, eventID)) } - for i := 0; i < 1000; i++ { + for range 1000 { var b [8]byte _, err := rand.Read(b[:]) require.NoError(t, err) diff --git a/lib/events/search_limiter_test.go b/lib/events/search_limiter_test.go index d6eede465071a..bbd393954c5c0 100644 --- a/lib/events/search_limiter_test.go +++ b/lib/events/search_limiter_test.go @@ -43,7 +43,7 @@ func TestSearchEventsLimiter(t *testing.T) { }, }) require.NoError(t, err) - for i := 0; i < 20; i++ { + for range 20 { require.NoError(t, s.EmitAuditEvent(context.Background(), &apievents.AccessRequestCreate{})) } }) @@ -63,7 +63,7 @@ func TestSearchEventsLimiter(t *testing.T) { someDate := clockwork.NewFakeClock().Now().UTC() ctx := context.Background() - for i := 0; i < burst; i++ { + for i := range burst { var err error // rate limit is shared between both search endpoints. if i%2 == 0 { diff --git a/lib/events/session_writer.go b/lib/events/session_writer.go index 15dc4fd72adbc..479962dee41dd 100644 --- a/lib/events/session_writer.go +++ b/lib/events/session_writer.go @@ -547,7 +547,7 @@ func (a *SessionWriter) tryResumeStream() (apievents.Stream, error) { } var resumedStream apievents.Stream start := time.Now() - for i := 0; i < FastAttempts; i++ { + for i := range FastAttempts { var streamType string if a.lastStatus == nil { // The stream was either never created or has failed to receive the @@ -605,7 +605,7 @@ func (a *SessionWriter) updateStatus(status apievents.StreamStatus) { return } lastIndex := -1 - for i := 0; i < len(a.buffer); i++ { + for i := range a.buffer { if status.LastEventIndex < a.buffer[i].GetAuditEvent().GetIndex() { break } diff --git a/lib/events/sessionlog.go b/lib/events/sessionlog.go index e0b43a50a1671..c4b032fad3cb8 100644 --- a/lib/events/sessionlog.go +++ b/lib/events/sessionlog.go @@ -53,7 +53,7 @@ func (f *gzipWriter) Close() error { // so it makes sense to reset the writer and reuse the // internal buffers to avoid too many objects on the heap var writerPool = sync.Pool{ - New: func() interface{} { + New: func() any { w, _ := gzip.NewWriterLevel(io.Discard, gzip.BestSpeed) return w }, diff --git a/lib/events/setter_test.go b/lib/events/setter_test.go index 8ad8a396f927f..64801de4ed075 100644 --- a/lib/events/setter_test.go +++ b/lib/events/setter_test.go @@ -37,7 +37,7 @@ func TestPreparerIncrementalIndex(t *testing.T) { }) require.NoError(t, err) - for i := 0; i < 10; i++ { + for i := range 10 { e, err := preparer.PrepareSessionEvent(generateEvent()) require.NoError(t, err) require.Equal(t, int64(i), e.GetAuditEvent().GetIndex(), "unexpected event index") @@ -56,7 +56,7 @@ func TestPreparerTimeBasedIndex(t *testing.T) { require.NoError(t, err) var lastIndex int64 - for i := 0; i < 9; i++ { + for range 9 { clock.Advance(time.Second) e, err := preparer.PrepareSessionEvent(generateEvent()) require.NoError(t, err) @@ -90,7 +90,7 @@ func TestPreparerTimeBasedIndexCollisions(t *testing.T) { }) require.NoError(t, err) - for i := 0; i < 9; i++ { + for range 9 { clock.Advance(time.Second) evtOne, err := preparerOne.PrepareSessionEvent(generateEvent()) require.NoError(t, err) diff --git a/lib/events/stream.go b/lib/events/stream.go index 5792bc5ad9f37..33148b6f406fa 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -571,10 +571,7 @@ func (w *sliceWriter) receiveAndUpload() error { } case <-flushCh: now := clock.Now().UTC() - inactivityPeriod := now.Sub(lastEvent) - if inactivityPeriod < 0 { - inactivityPeriod = 0 - } + inactivityPeriod := max(now.Sub(lastEvent), 0) if inactivityPeriod >= w.proto.cfg.InactivityFlushPeriod { // inactivity period exceeded threshold, // there is no need to schedule a timer until the next @@ -769,7 +766,7 @@ func (w *sliceWriter) startUpload(partNumber int64, slice *slice) (*activeUpload return } - for i := 0; i < defaults.MaxIterationLimit; i++ { + for i := range defaults.MaxIterationLimit { log := log.With("attempt", i) part, err := w.proto.cfg.Uploader.UploadPart(w.proto.cancelCtx, w.proto.cfg.Upload, partNumber, reader) diff --git a/lib/events/stream_test.go b/lib/events/stream_test.go index a9d0ee1c94f60..85ad36ebc8508 100644 --- a/lib/events/stream_test.go +++ b/lib/events/stream_test.go @@ -206,8 +206,7 @@ func TestProtoStreamLargeEvent(t *testing.T) { // TestReadCorruptedRecording tests that the streamer can successfully decode the kind of corrupted // recordings that some older bugged versions of teleport might end up producing when under heavy load/throttling. func TestReadCorruptedRecording(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() f, err := os.Open("testdata/corrupted-session") require.NoError(t, err) diff --git a/lib/events/test/suite.go b/lib/events/test/suite.go index df228c94d44e3..ccd6b1fa9bf93 100644 --- a/lib/events/test/suite.go +++ b/lib/events/test/suite.go @@ -387,7 +387,7 @@ func (s *EventsSuite) EventPagination(t *testing.T) { } Outer: - for i := 0; i < len(names); i++ { + for range names { arr, checkpoint, err = s.Log.SearchEvents(ctx, events.SearchEventsRequest{ From: baseTime2, To: baseTime2.Add(time.Second), diff --git a/lib/kube/grpc/grpc_test.go b/lib/kube/grpc/grpc_test.go index 94a7bd38ac858..5f380f5aef9e7 100644 --- a/lib/kube/grpc/grpc_test.go +++ b/lib/kube/grpc/grpc_test.go @@ -593,7 +593,6 @@ func TestListKubernetesResources(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() _, restCfg := testCtx.GenTestKubeClientTLSCert(t, tt.args.user.GetName(), "") diff --git a/lib/kube/grpc/websocket_client_test.go b/lib/kube/grpc/websocket_client_test.go index 444de6a9eab85..1f9480a064e85 100644 --- a/lib/kube/grpc/websocket_client_test.go +++ b/lib/kube/grpc/websocket_client_test.go @@ -28,6 +28,7 @@ import ( "net" "net/http" "net/url" + "slices" "strings" "sync" "sync/atomic" @@ -188,13 +189,7 @@ func (e *wsStreamClient) Stream(options clientremotecommand.StreamOptions) error defer conn.Close() streamingProto := conn.Subprotocol() - found := false - for _, p := range supportedProtocols { - if p == streamingProto { - found = true - break - } - } + found := slices.Contains(supportedProtocols, streamingProto) if !found { return fmt.Errorf("unsupported streaming protocol: %q", streamingProto) } @@ -218,13 +213,7 @@ func (e *wsStreamClient) ForwardPorts() error { defer conn.Close() streamingProto := conn.Subprotocol() - found := false - for _, p := range supportedProtocols { - if p == streamingProto { - found = true - break - } - } + found := slices.Contains(supportedProtocols, streamingProto) if !found { return fmt.Errorf("unsupported streaming protocol: %q", streamingProto) } diff --git a/lib/kube/kubeconfig/kubeconfig.go b/lib/kube/kubeconfig/kubeconfig.go index c77f9ce39afff..9bbaa36982a0f 100644 --- a/lib/kube/kubeconfig/kubeconfig.go +++ b/lib/kube/kubeconfig/kubeconfig.go @@ -290,7 +290,7 @@ func setContext(contexts map[string]*clientcmdapi.Context, name, cluster, auth, if kubeName != "" { newContext.Extensions[teleportKubeClusterNameExtension] = &runtime.Unknown{ // We need to wrap the kubeName in quotes to make sure it is parsed as a string. - Raw: []byte(fmt.Sprintf("%q", kubeName)), + Raw: fmt.Appendf(nil, "%q", kubeName), } } diff --git a/lib/kube/kubeconfig/kubeconfig_test.go b/lib/kube/kubeconfig/kubeconfig_test.go index 7a100d496f57e..02267919adbd9 100644 --- a/lib/kube/kubeconfig/kubeconfig_test.go +++ b/lib/kube/kubeconfig/kubeconfig_test.go @@ -326,7 +326,7 @@ func TestUpdateWithExec(t *testing.T) { LocationOfOrigin: kubeconfigPath, Extensions: map[string]runtime.Object{ teleportKubeClusterNameExtension: &runtime.Unknown{ - Raw: []byte(fmt.Sprintf("%q", kubeCluster)), + Raw: fmt.Appendf(nil, "%q", kubeCluster), ContentType: "application/json", }, }, @@ -398,7 +398,7 @@ func TestUpdateWithExecAndProxy(t *testing.T) { LocationOfOrigin: kubeconfigPath, Extensions: map[string]runtime.Object{ teleportKubeClusterNameExtension: &runtime.Unknown{ - Raw: []byte(fmt.Sprintf("%q", kubeCluster)), + Raw: fmt.Appendf(nil, "%q", kubeCluster), ContentType: "application/json", }, }, diff --git a/lib/kube/proxy/auth_test.go b/lib/kube/proxy/auth_test.go index 0d7cc19a37bc4..37d8c0f7e460a 100644 --- a/lib/kube/proxy/auth_test.go +++ b/lib/kube/proxy/auth_test.go @@ -25,6 +25,7 @@ import ( "net/http" "os" "path/filepath" + "slices" "testing" "github.com/google/go-cmp/cmp" @@ -97,17 +98,11 @@ func (c *mockSARClient) Create(_ context.Context, sar *authzapi.SelfSubjectAcces } var verbAllowed, resourceAllowed bool - for _, v := range c.allowedVerbs { - if v == sar.Spec.ResourceAttributes.Verb { - verbAllowed = true - break - } + if slices.Contains(c.allowedVerbs, sar.Spec.ResourceAttributes.Verb) { + verbAllowed = true } - for _, r := range c.allowedResources { - if r == sar.Spec.ResourceAttributes.Resource { - resourceAllowed = true - break - } + if slices.Contains(c.allowedResources, sar.Spec.ResourceAttributes.Resource) { + resourceAllowed = true } sar.Status.Allowed = verbAllowed && resourceAllowed diff --git a/lib/kube/proxy/exec_test.go b/lib/kube/proxy/exec_test.go index cc0ed45908870..eaf9bc37bbe59 100644 --- a/lib/kube/proxy/exec_test.go +++ b/lib/kube/proxy/exec_test.go @@ -349,7 +349,6 @@ func TestExecMissingGETPermissionError(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() const errorCode = http.StatusForbidden @@ -544,7 +543,6 @@ func TestExecWebsocketEndToEndErrReturn(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() diff --git a/lib/kube/proxy/forwarder_test.go b/lib/kube/proxy/forwarder_test.go index 8405c6e217d9b..3bcbb81e3e93b 100644 --- a/lib/kube/proxy/forwarder_test.go +++ b/lib/kube/proxy/forwarder_test.go @@ -930,7 +930,6 @@ func TestSetupImpersonationHeaders(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.desc, func(t *testing.T) { var kubeCreds kubeCreds if !tt.isProxy { @@ -1307,8 +1306,7 @@ func (m *mockSemaphoreClient) GetRole(ctx context.Context, name string) (types.R } func TestKubernetesConnectionLimit(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() type testCase struct { name string @@ -1463,7 +1461,7 @@ func TestKubernetesLicenseEnforcement(t *testing.T) { string(entitlements.K8s): {Enabled: false}, }, }, - assertErrFunc: func(tt require.TestingT, err error, i ...interface{}) { + assertErrFunc: func(tt require.TestingT, err error, i ...any) { require.Error(tt, err) var kubeErr *kubeerrors.StatusError require.ErrorAs(tt, err, &kubeErr) @@ -1474,7 +1472,6 @@ func TestKubernetesLicenseEnforcement(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() // creates a Kubernetes service with a configured cluster pointing to mock api server diff --git a/lib/kube/proxy/kube_creds_test.go b/lib/kube/proxy/kube_creds_test.go index ca2f537e6de05..f9ac76e63cef0 100644 --- a/lib/kube/proxy/kube_creds_test.go +++ b/lib/kube/proxy/kube_creds_test.go @@ -377,7 +377,7 @@ func Test_DynamicKubeCreds(t *testing.T) { case <-time.After(5 * time.Second): t.Fatalf("timeout waiting for cluster to be ready") } - for i := 0; i < 10; i++ { + for i := range 10 { require.Equal(t, got.getKubeRestConfig().CAData, []byte(fixtures.TLSCACertPEM)) require.NoError(t, tt.args.validateBearerToken(got.getKubeRestConfig().BearerToken)) require.Equal(t, tt.wantAddr, got.getTargetAddr()) diff --git a/lib/kube/proxy/moderated_sessions_test.go b/lib/kube/proxy/moderated_sessions_test.go index 1b2abc5704ea2..0b0e15b9ff6db 100644 --- a/lib/kube/proxy/moderated_sessions_test.go +++ b/lib/kube/proxy/moderated_sessions_test.go @@ -246,7 +246,6 @@ func TestModeratedSessions(t *testing.T) { }, } for _, tt := range tests { - tt := tt if tt.want.sessionEndEvent { numberOfExpectedSessionEnds++ } @@ -649,7 +648,6 @@ func TestInteractiveSessionsNoAuth(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() diff --git a/lib/kube/proxy/portforward_test.go b/lib/kube/proxy/portforward_test.go index 7dc7a147e22b7..b218aa7f21c7b 100644 --- a/lib/kube/proxy/portforward_test.go +++ b/lib/kube/proxy/portforward_test.go @@ -480,7 +480,6 @@ func TestPortForwardUnderlyingProtocol(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() kubeMock, err := testingkubemock.NewKubeAPIMock( diff --git a/lib/kube/proxy/portforward_websocket.go b/lib/kube/proxy/portforward_websocket.go index 4ca01ea473062..beaec43c43647 100644 --- a/lib/kube/proxy/portforward_websocket.go +++ b/lib/kube/proxy/portforward_websocket.go @@ -73,7 +73,7 @@ func runPortForwardingWebSocket(req portForwardRequest) error { // One pair of (Data,Error) channels per port. channels := make([]wsstream.ChannelType, 2*len(ports)) - for i := 0; i < len(channels); i++ { + for i := range channels { channels[i] = wsstream.ReadWriteChannel } @@ -107,7 +107,7 @@ func runPortForwardingWebSocket(req portForwardRequest) error { // Create the websocket stream pairs. streamPairs := make([]*websocketChannelPair, len(ports)) - for i := 0; i < len(ports); i++ { + for i := range ports { var ( dataStream = streams[2*i+portForwardDataChannel] errorStream = streams[2*i+portForwardErrorChannel] @@ -171,7 +171,7 @@ func extractTargetPortsFromStrings(portsStrings []string) ([]uint16, error) { if len(portString) == 0 { return nil, trace.BadParameter("query parameter %q cannot be empty", PortHeader) } - for _, p := range strings.Split(portString, ",") { + for p := range strings.SplitSeq(portString, ",") { port, err := parsePortString(p) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/kube/proxy/resource_deletecollection.go b/lib/kube/proxy/resource_deletecollection.go index 8bf2e15c57c07..3bb95180b2260 100644 --- a/lib/kube/proxy/resource_deletecollection.go +++ b/lib/kube/proxy/resource_deletecollection.go @@ -277,7 +277,7 @@ func getItemsUsingReflection(obj runtime.Object) (getItemsUsingReflectionOutput, func setItemsUsingReflection(itemsR reflect.Value, underlyingType reflect.Type, items []kubeObjectInterface) { // make a new slice of the same type as the original one. slice := reflect.MakeSlice(itemsR.Type(), len(items), len(items)) - for i := 0; i < len(items); i++ { + for i := range items { item := items[i] // convert the item to the underlying type of the slice. // this is needed because items is a slice of pointers that diff --git a/lib/kube/proxy/resource_filters_test.go b/lib/kube/proxy/resource_filters_test.go index 22bdede072282..156c5311b4544 100644 --- a/lib/kube/proxy/resource_filters_test.go +++ b/lib/kube/proxy/resource_filters_test.go @@ -167,7 +167,7 @@ func Test_filterBuffer(t *testing.T) { require.NoError(t, err) data := &bytes.Buffer{} name := filepath.Base(tt.args.dataFile) - err = temp.ExecuteTemplate(data, name, map[string]interface{}{ + err = temp.ExecuteTemplate(data, name, map[string]any{ "Kind": teleToKubeResource[r].obj, "API": teleToKubeResource[r].api, }, diff --git a/lib/kube/proxy/resource_rbac_test.go b/lib/kube/proxy/resource_rbac_test.go index 9a9dd6d196247..ab999b090abe5 100644 --- a/lib/kube/proxy/resource_rbac_test.go +++ b/lib/kube/proxy/resource_rbac_test.go @@ -996,7 +996,6 @@ func TestDeletePodCollectionRBAC(t *testing.T) { } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() requestID := kubetypes.UID(uuid.NewString()) diff --git a/lib/kube/proxy/response_rewriter_test.go b/lib/kube/proxy/response_rewriter_test.go index 6460eb27e1e28..fe0f8e20df199 100644 --- a/lib/kube/proxy/response_rewriter_test.go +++ b/lib/kube/proxy/response_rewriter_test.go @@ -147,7 +147,6 @@ func TestErrorRewriter(t *testing.T) { } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() // generate a kube client with user certs for auth diff --git a/lib/kube/proxy/server_test.go b/lib/kube/proxy/server_test.go index 31db4978d93f3..684773af44b53 100644 --- a/lib/kube/proxy/server_test.go +++ b/lib/kube/proxy/server_test.go @@ -182,7 +182,7 @@ func TestMTLSClientCAs(t *testing.T) { // 100 additional CAs registered, all CAs should be sent to the client in // the handshake. t.Run("100 CAs", func(t *testing.T) { - for i := 0; i < 100; i++ { + for i := range 100 { addCA(t, fmt.Sprintf("cluster-%d", i)) } testDial(t, 101) diff --git a/lib/kube/proxy/sess_test.go b/lib/kube/proxy/sess_test.go index 34bcd0ec198f2..825d04b6e0257 100644 --- a/lib/kube/proxy/sess_test.go +++ b/lib/kube/proxy/sess_test.go @@ -92,7 +92,6 @@ func TestSessionEndError(t *testing.T) { } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var ( diff --git a/lib/kube/proxy/streamproto/proto.go b/lib/kube/proxy/streamproto/proto.go index 75f12b15e8b22..c333b24091427 100644 --- a/lib/kube/proxy/streamproto/proto.go +++ b/lib/kube/proxy/streamproto/proto.go @@ -177,7 +177,7 @@ func (s *SessionStream) readTask() { // If it's a close error, we want to send a message to the stdout if s.isClient && errors.As(err, &closeErr) && closeErr.Text != "" { select { - case s.in <- []byte(fmt.Sprintf("\r\n---\r\nConnection closed: %v\r\n", closeErr.Text)): + case s.in <- fmt.Appendf(nil, "\r\n---\r\nConnection closed: %v\r\n", closeErr.Text): case <-s.done: return } diff --git a/lib/kube/proxy/websocket_client_test.go b/lib/kube/proxy/websocket_client_test.go index 75fb57b5133ad..47a674ea15406 100644 --- a/lib/kube/proxy/websocket_client_test.go +++ b/lib/kube/proxy/websocket_client_test.go @@ -28,6 +28,7 @@ import ( "net" "net/http" "net/url" + "slices" "strings" "sync" "sync/atomic" @@ -182,13 +183,7 @@ func (e *wsStreamClient) Stream(options clientremotecommand.StreamOptions) error defer conn.Close() streamingProto := conn.Subprotocol() - found := false - for _, p := range supportedProtocols { - if p == streamingProto { - found = true - break - } - } + found := slices.Contains(supportedProtocols, streamingProto) if !found { return fmt.Errorf("unsupported streaming protocol: %q", streamingProto) } @@ -212,13 +207,7 @@ func (e *wsStreamClient) ForwardPorts() error { defer conn.Close() streamingProto := conn.Subprotocol() - found := false - for _, p := range supportedProtocols { - if p == streamingProto { - found = true - break - } - } + found := slices.Contains(supportedProtocols, streamingProto) if !found { return fmt.Errorf("unsupported streaming protocol: %q", streamingProto) } diff --git a/lib/kube/token/source_test.go b/lib/kube/token/source_test.go index 9d3e5fd5a4092..3c5863f1256eb 100644 --- a/lib/kube/token/source_test.go +++ b/lib/kube/token/source_test.go @@ -79,7 +79,7 @@ func TestGetIDToken(t *testing.T) { name: "no-token-no-var", getEnv: fakeGetEnv(""), readFile: fakeReadFile("foobarbizz", "/custom"), - assertError: func(t require.TestingT, err error, i ...interface{}) { + assertError: func(t require.TestingT, err error, i ...any) { require.ErrorContains(t, err, kubernetesDefaultTokenPath+": no such file") }, }, @@ -87,7 +87,7 @@ func TestGetIDToken(t *testing.T) { name: "no-token-with-var", getEnv: fakeGetEnv("/custom"), readFile: fakeReadFile("foobarbizz", kubernetesDefaultTokenPath), - assertError: func(t require.TestingT, err error, i ...interface{}) { + assertError: func(t require.TestingT, err error, i ...any) { require.ErrorContains(t, err, "/custom: no such file") }, }, diff --git a/lib/kube/token/validator_test.go b/lib/kube/token/validator_test.go index 70d68fddb766d..c50455681eecc 100644 --- a/lib/kube/token/validator_test.go +++ b/lib/kube/token/validator_test.go @@ -365,7 +365,6 @@ func TestIDTokenValidator_Validate(t *testing.T) { } for _, tt := range tests { - tt := tt t.Run(tt.token, func(t *testing.T) { // Fill value of raw to avoid duplication in test table if tt.wantResult != nil { diff --git a/lib/service/service.go b/lib/service/service.go index 4a713980fcb50..1cabe0238f1bc 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2724,6 +2724,7 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.PluginStaticCredentials = services.PluginStaticCredentials cfg.GitServers = services.GitServers cfg.HealthCheckConfig = services.HealthCheckConfig + cfg.BotInstance = services.BotInstance return accesspoint.NewCache(cfg) } diff --git a/lib/services/local/bot_instance.go b/lib/services/local/bot_instance.go index 0a31674719838..aec504d0309db 100644 --- a/lib/services/local/bot_instance.go +++ b/lib/services/local/bot_instance.go @@ -110,27 +110,41 @@ func (b *BotInstanceService) ListBotInstances(ctx context.Context, botName strin } r, nextToken, err := service.ListResourcesWithFilter(ctx, pageSize, lastKey, func(item *machineidv1.BotInstance) bool { - latestHeartbeats := item.GetStatus().GetLatestHeartbeats() - heartbeat := item.Status.InitialHeartbeat // Use initial heartbeat as a fallback - if len(latestHeartbeats) > 0 { - heartbeat = latestHeartbeats[len(latestHeartbeats)-1] - } + return matchBotInstance(item, botName, search) + }) - values := []string{ - item.Spec.BotName, - item.Spec.InstanceId, - } + return r, nextToken, trace.Wrap(err) +} - if heartbeat != nil { - values = append(values, heartbeat.Hostname, heartbeat.JoinMethod, heartbeat.Version, "v"+heartbeat.Version) - } +func matchBotInstance(b *machineidv1.BotInstance, botName string, search string) bool { + // If updating this, ensure it's consistent with the cache search logic in `lib/cache/bot_instance.go`. - return slices.ContainsFunc(values, func(val string) bool { - return strings.Contains(strings.ToLower(val), strings.ToLower(search)) - }) - }) + if botName != "" && b.Spec.BotName != botName { + return false + } - return r, nextToken, trace.Wrap(err) + if search == "" { + return true + } + + latestHeartbeats := b.GetStatus().GetLatestHeartbeats() + heartbeat := b.Status.InitialHeartbeat // Use initial heartbeat as a fallback + if len(latestHeartbeats) > 0 { + heartbeat = latestHeartbeats[len(latestHeartbeats)-1] + } + + values := []string{ + b.Spec.BotName, + b.Spec.InstanceId, + } + + if heartbeat != nil { + values = append(values, heartbeat.Hostname, heartbeat.JoinMethod, heartbeat.Version, "v"+heartbeat.Version) + } + + return slices.ContainsFunc(values, func(val string) bool { + return strings.Contains(strings.ToLower(val), strings.ToLower(search)) + }) } // DeleteBotInstance deletes a specific bot instance matching the given bot name @@ -140,6 +154,11 @@ func (b *BotInstanceService) DeleteBotInstance(ctx context.Context, botName, ins return trace.Wrap(serviceWithPrefix.DeleteResource(ctx, instanceID)) } +// DeleteAllBotInstances deletes all bot instances for all bots +func (b *BotInstanceService) DeleteAllBotInstances(ctx context.Context) error { + return trace.Wrap(b.service.DeleteAllResources(ctx)) +} + // PatchBotInstance uses the supplied function to patch the bot instance // matching the given (botName, instanceID) key and persists the patched // resource. It will make multiple attempts if a `CompareFailed` error is diff --git a/lib/srv/desktop/rdp/rdpclient/client.go b/lib/srv/desktop/rdp/rdpclient/client.go index f91d2a27e3dfb..4fc2fb2b0b4bc 100644 --- a/lib/srv/desktop/rdp/rdpclient/client.go +++ b/lib/srv/desktop/rdp/rdpclient/client.go @@ -501,7 +501,19 @@ func (c *Client) startInputStreaming(stopCh chan struct{}) error { continue } - c.UpdateClientActivity() + // If the message was due to user input, then we update client activity + // in order to refresh the client_idle_timeout checks. + // + // Note: we count some of the directory sharing messages as client activity + // because we don't want a session to be closed due to inactivity during a large + // file transfer. + switch msg.(type) { + case tdp.KeyboardButton, tdp.MouseMove, tdp.MouseButton, tdp.MouseWheel, + tdp.SharedDirectoryAnnounce, tdp.SharedDirectoryInfoResponse, + tdp.SharedDirectoryReadResponse, tdp.SharedDirectoryWriteResponse: + + c.UpdateClientActivity() + } if withheldResize != nil { c.cfg.Logger.DebugContext(context.Background(), "Sending withheld screen size to client") diff --git a/lib/vnet/ssh_proxy.go b/lib/vnet/ssh_proxy.go index 9dd2c2a0235e6..df82175c25fd7 100644 --- a/lib/vnet/ssh_proxy.go +++ b/lib/vnet/ssh_proxy.go @@ -19,13 +19,12 @@ package vnet import ( "context" "errors" + "io" "log/slog" "sync" "github.com/gravitational/trace" "golang.org/x/crypto/ssh" - - "github.com/gravitational/teleport/lib/utils" ) // sshConn represents an established SSH client or server connection. @@ -171,60 +170,134 @@ func proxyChannel( return } - // Copy channel requests in both directions concurrently. If either fails or - // exits it will cancel the context so that utils.ProxyConn below will close - // both channels so the other goroutine can also exit. + // Copy channel data and requests from the incoming channel to the target + // channel, and vice-versa. + target := newSSHChan(targetChan, targetChanRequests, slog.With("direction", "client->target")) + incoming := newSSHChan(incomingChan, incomingChanRequests, slog.With("direction", "target->client")) + var wg sync.WaitGroup wg.Add(2) - ctx, cancel := context.WithCancel(ctx) go func() { - proxyChannelRequests(ctx, log, targetChan, incomingChanRequests, cancel) - cancel() + target.writeFrom(ctx, incoming) wg.Done() }() go func() { - proxyChannelRequests(ctx, log, incomingChan, targetChanRequests, cancel) - cancel() + incoming.writeFrom(ctx, target) wg.Done() }() + wg.Wait() +} - // ProxyConn copies channel data bidirectionally. If the context is - // canceled it will terminate, it always closes both channels before - // returning. - if err := utils.ProxyConn(ctx, incomingChan, targetChan); err != nil && - !utils.IsOKNetworkError(err) && !errors.Is(err, context.Canceled) { - log.DebugContext(ctx, "Unexpected error proxying channel data", "error", err) +// sshChan manages all writes to an SSH channel and handles closing the channel +// once no more data or requests will be written to it. +type sshChan struct { + ch ssh.Channel + requests <-chan *ssh.Request + log *slog.Logger +} + +func newSSHChan(ch ssh.Channel, requests <-chan *ssh.Request, log *slog.Logger) *sshChan { + return &sshChan{ + ch: ch, + requests: requests, + log: log, } +} + +// writeFrom writes channel data and requests from the source to this SSH channel. +// +// In the happy path it waits for: +// - channel data reads from source to return EOF +// - the source request channel to be closed +// and then closes this channel. +// +// Channel data reads from source can return EOF at any time if it has sent +// SSH_MSG_CHANNEL_EOF but it is still valid to send more channel requests +// after this. +// +// If an unrecoverable error is encountered it immediately closes both +// channels. +func (c *sshChan) writeFrom(ctx context.Context, source *sshChan) { + // Close the channel after all data and request writes are complete. + defer c.ch.Close() - // Wait for all goroutines to terminate. + var wg sync.WaitGroup + wg.Add(2) + go func() { + c.writeDataFrom(ctx, source) + wg.Done() + }() + go func() { + c.writeRequestsFrom(ctx, source) + wg.Done() + }() wg.Wait() } -func proxyChannelRequests( - ctx context.Context, - log *slog.Logger, - targetChan ssh.Channel, - reqs <-chan *ssh.Request, - closeChannels func(), -) { - log = log.With("request_layer", "channel") +// writeDataFrom writes channel data from source to this SSH channel. +// It handles standard channel data and extended channel data of type stderr. +func (c *sshChan) writeDataFrom(ctx context.Context, source *sshChan) { + // Close the channel for writes only after both the standard and stderr + // streams are finished writing. + defer c.ch.CloseWrite() + + errors := make(chan error, 2) + go func() { + _, err := io.Copy(c.ch, source.ch) + errors <- err + }() + go func() { + _, err := io.Copy(c.ch.Stderr(), source.ch.Stderr()) + errors <- err + }() + + // Read both errors to make sure both goroutines terminate, but only do + // anything on the first non-nil error, the second error is likely either + // the same as the first one or caused by closing the channel. + handledError := false + for range 2 { + err := <-errors + if err != nil && !handledError { + handledError = true + // Failed to write channel data from source to this channel. This was + // not an EOF from source or io.Copy would have returned nil. The + // stream might be missing data so close both channels. + // + // This should also unblock the stderr stream if the regular stream + // returned an error, and vice-versa. + c.log.ErrorContext(ctx, "Fatal error proxying SSH channel data", "error", err) + c.ch.Close() + source.ch.Close() + } + } +} + +// writeRequestsFrom forwards channel requests from source to this SSH channel. +func (c *sshChan) writeRequestsFrom(ctx context.Context, source *sshChan) { + log := c.log.With("request_layer", "channel") sendRequest := func(name string, wantReply bool, payload []byte) (bool, []byte, error) { - ok, err := targetChan.SendRequest(name, wantReply, payload) + ok, err := c.ch.SendRequest(name, wantReply, payload) // Replies to channel requests never have a payload. return ok, nil, err } - proxyRequests(ctx, log, sendRequest, reqs, closeChannels) + // Must forcibly close both channels if there was a fatal error proxying + // channel requests so that we don't continue in a bad state. + onFatalError := func() { + c.ch.Close() + source.ch.Close() + } + proxyRequests(ctx, log, sendRequest, source.requests, onFatalError) } func proxyGlobalRequests( ctx context.Context, targetConn ssh.Conn, reqs <-chan *ssh.Request, - closeConnections func(), + onFatalError func(), ) { log := log.With("request_layer", "global") sendRequest := targetConn.SendRequest - proxyRequests(ctx, log, sendRequest, reqs, closeConnections) + proxyRequests(ctx, log, sendRequest, reqs, onFatalError) } func proxyRequests( @@ -232,7 +305,7 @@ func proxyRequests( log *slog.Logger, sendRequest func(name string, wantReply bool, payload []byte) (bool, []byte, error), reqs <-chan *ssh.Request, - closeRequestSources func(), + onFatalError func(), ) { for req := range reqs { log := log.With("request_type", req.Type) @@ -240,23 +313,20 @@ func proxyRequests( ok, reply, err := sendRequest(req.Type, req.WantReply, req.Payload) if err != nil { // We failed to send the request, the target must be dead. - log.DebugContext(ctx, "Failed to forward SSH request", "request_type", req.Type, "error", err) - // Close both connections or channels to clean up but we must - // continue handling requests on the chan until it is closed by - // crypto/ssh. - closeRequestSources() - _ = req.Reply(false, nil) - continue + log.DebugContext(ctx, "Failed to forward SSH request", "error", err) + onFatalError() + req.Reply(false, nil) + ssh.DiscardRequests(reqs) + return } if err := req.Reply(ok, reply); err != nil { // A reply was expected and returned by the target but we failed to // forward it back, the connection that initiated the request must // be dead. - log.DebugContext(ctx, "Failed to reply to SSH request", "request_type", req.Type, "error", err) - // Close both connections or channels to clean up but we must - // continue handling requests on the chan until it is closed by - // crypto/ssh. - closeRequestSources() + log.DebugContext(ctx, "Failed to reply to SSH request", "error", err) + onFatalError() + ssh.DiscardRequests(reqs) + return } } } diff --git a/lib/vnet/ssh_proxy_test.go b/lib/vnet/ssh_proxy_test.go index 4c9b0e026ab80..d7eb8313c8a11 100644 --- a/lib/vnet/ssh_proxy_test.go +++ b/lib/vnet/ssh_proxy_test.go @@ -21,6 +21,7 @@ import ( "fmt" "io" "net" + "sync" "testing" "github.com/gravitational/trace" @@ -108,11 +109,17 @@ func testSSHConnection(t *testing.T, dial dialer) { } func testConnectionToSshEchoServer(t *testing.T, sshConn ssh.Conn, chans <-chan ssh.NewChannel, reqs <-chan *ssh.Request) { - go ssh.DiscardRequests(reqs) + requestStreamEnded := make(chan struct{}) + go func() { + ssh.DiscardRequests(reqs) + close(requestStreamEnded) + }() + chanStreamEnded := make(chan struct{}) go func() { for newChan := range chans { newChan.Reject(ssh.Prohibited, "test") } + close(chanStreamEnded) }() // Try sending some global requests. @@ -136,6 +143,26 @@ func testConnectionToSshEchoServer(t *testing.T, sshConn ssh.Conn, chans <-chan t.Run("echo channel 2", func(t *testing.T) { testEchoChannel(t, sshConn) }) + + t.Run("closing", func(t *testing.T) { + // Send a request that causes the target server to close the connection + // immediately and make sure channel reads are unblocked, and the global + // request and channel request streams end. + ch, reqs, err := sshConn.OpenChannel("echo", nil) + require.NoError(t, err) + go ssh.DiscardRequests(reqs) + readErr := make(chan error) + go func() { + var b [1]byte + _, err := ch.Read(b[:]) + readErr <- err + }() + _, _, err = sshConn.SendRequest("close", false, nil) + require.NoError(t, err) + require.ErrorIs(t, <-readErr, io.EOF) + <-requestStreamEnded + <-chanStreamEnded + }) } func testGlobalRequests(t *testing.T, conn ssh.Conn) { @@ -156,7 +183,11 @@ func testGlobalRequests(t *testing.T, conn ssh.Conn) { func testEchoChannel(t *testing.T, conn ssh.Conn) { ch, reqs, err := conn.OpenChannel("echo", nil) require.NoError(t, err) - go ssh.DiscardRequests(reqs) + requestStreamEnded := make(chan struct{}) + go func() { + ssh.DiscardRequests(reqs) + close(requestStreamEnded) + }() defer ch.Close() // Try sending a message over the SSH channel and asserting that it is @@ -170,16 +201,43 @@ func testEchoChannel(t *testing.T, conn ssh.Conn) { require.Equal(t, len(msg), n) require.Equal(t, msg, buf[:n]) + // Try sending a message over stderr and asserting that it is echoed back. + _, err = ch.Stderr().Write(msg) + require.NoError(t, err) + n, err = ch.Stderr().Read(buf[:]) + require.NoError(t, err) + require.Equal(t, len(msg), n) + require.Equal(t, msg, buf[:n]) + // Try sending a channel request that expects a reply. reply, err := ch.SendRequest("echo", true, nil) require.NoError(t, err) require.True(t, reply) + // Close the channel for writes of in-band data and send another channel + // request, which should succeed. + require.NoError(t, ch.CloseWrite()) + reply, err = ch.SendRequest("echo", true, nil) + require.NoError(t, err) + require.True(t, reply) + // The test server replies false to channel requests with type other than // "echo". reply, err = ch.SendRequest("unknown", true, nil) require.NoError(t, err) require.False(t, reply) + + // Send a channel request that causes the server to close the channel and + // make sure channel reads get unblocked and the incoming request stream ends. + readErr := make(chan error) + go func() { + _, err := ch.Read(buf[:]) + readErr <- err + }() + _, err = ch.SendRequest("close", false, nil) + require.NoError(t, err) + require.ErrorIs(t, <-readErr, io.EOF) + <-requestStreamEnded } type dialer interface { @@ -282,7 +340,7 @@ func runTestSSHServerInstance(tcpConn net.Conn, cfg *ssh.ServerConfig) error { return trace.Wrap(err) } go func() { - handleEchoRequests(reqs) + handleSSHRequests(reqs, sshConn.Close) sshConn.Close() }() handleEchoChannels(chans) @@ -290,17 +348,6 @@ func runTestSSHServerInstance(tcpConn net.Conn, cfg *ssh.ServerConfig) error { return nil } -func handleEchoRequests(reqs <-chan *ssh.Request) { - for req := range reqs { - switch req.Type { - case "echo": - req.Reply(true, req.Payload) - default: - req.Reply(false, nil) - } - } -} - func handleEchoChannels(chans <-chan ssh.NewChannel) { for newChan := range chans { switch newChan.ChannelType() { @@ -317,8 +364,33 @@ func handleEchoChannel(newChan ssh.NewChannel) { if err != nil { return } - go handleEchoRequests(reqs) - io.Copy(ch, ch) + go handleSSHRequests(reqs, ch.Close) + defer ch.CloseWrite() + var wg sync.WaitGroup + wg.Add(2) + go func() { + io.Copy(ch, ch) + wg.Done() + }() + go func() { + io.Copy(ch.Stderr(), ch.Stderr()) + wg.Done() + }() + wg.Wait() +} + +func handleSSHRequests(reqs <-chan *ssh.Request, closeSource func() error) { + defer closeSource() + for req := range reqs { + switch req.Type { + case "echo": + req.Reply(true, req.Payload) + case "close": + closeSource() + default: + req.Reply(false, nil) + } + } } func sshServerConfig(t *testing.T) *ssh.ServerConfig { diff --git a/lib/web/desktop.go b/lib/web/desktop.go index 31f5be490e29e..e4b0763c2d7af 100644 --- a/lib/web/desktop.go +++ b/lib/web/desktop.go @@ -552,7 +552,6 @@ func proxyWebsocketConn(ctx context.Context, ws *websocket.Conn, wds *tls.Conn, go monitorLatency(ctx, clockwork.NewRealClock(), ws, pinger, latency.ReporterFunc(func(ctx context.Context, stats latency.Statistics) error { - log.DebugContext(ctx, "sending latency stats", "client", stats.Client, "server", stats.Server) return trace.Wrap(tdpConnProxy.SendToClient(tdp.LatencyStats{ ClientLatency: uint32(stats.Client), ServerLatency: uint32(stats.Server), diff --git a/lib/web/scripts/install/install.sh b/lib/web/scripts/install/install.sh index 29892b7c55551..71d9d3f70934d 100755 --- a/lib/web/scripts/install/install.sh +++ b/lib/web/scripts/install/install.sh @@ -328,13 +328,13 @@ install_teleport() { esac # select install method based on distribution - # if ID is debian derivate, run apt-get + # if ID is debian derivative, run apt-get case "$ID" in debian | ubuntu | kali | linuxmint | pop | raspbian | neon | zorin | parrot | elementary) install_via_apt_get ;; # if ID is amazon Linux 2/RHEL/etc, run yum - centos | rhel | amzn) + centos | rhel | rocky | almalinux | amzn) install_via_yum "$ID" ;; sles) diff --git a/web/packages/shared/libs/tdp/client.ts b/web/packages/shared/libs/tdp/client.ts index a7435ef93db30..af169cfb32fe6 100644 --- a/web/packages/shared/libs/tdp/client.ts +++ b/web/packages/shared/libs/tdp/client.ts @@ -342,7 +342,7 @@ export class TdpClient extends EventEmitter { this.handleRdpConnectionActivated(buffer); break; case MessageType.RDP_FASTPATH_PDU: - this.handleRdpFastPathPDU(buffer); + this.handleRdpFastPathPdu(buffer); break; case MessageType.CLIENT_SCREEN_SPEC: this.handleClientScreenSpec(buffer); @@ -484,8 +484,8 @@ export class TdpClient extends EventEmitter { this.emit(TdpClientEvent.TDP_CLIENT_SCREEN_SPEC, spec); } - handleRdpFastPathPDU(buffer: ArrayBufferLike) { - let rdpFastPathPDU = this.codec.decodeRdpFastPathPDU(buffer); + handleRdpFastPathPdu(buffer: ArrayBufferLike) { + let rdpFastPathPdu = this.codec.decodeRdpFastPathPdu(buffer); // This should never happen but let's catch it with an error in case it does. if (!this.fastPathProcessor) { @@ -493,13 +493,13 @@ export class TdpClient extends EventEmitter { } this.fastPathProcessor.process( - rdpFastPathPDU, + rdpFastPathPdu, this, (bmpFrame: BitmapFrame) => { this.emit(TdpClientEvent.TDP_BMP_FRAME, bmpFrame); }, (responseFrame: ArrayBuffer) => { - this.sendRdpResponsePDU(responseFrame); + this.sendRdpResponsePdu(responseFrame); }, (data: ImageData | boolean, hotspot_x?: number, hotspot_y?: number) => { this.emit(TdpClientEvent.POINTER, { data, hotspot_x, hotspot_y }); @@ -821,8 +821,8 @@ export class TdpClient extends EventEmitter { this.sendClientScreenSpec(spec); }; - sendRdpResponsePDU(responseFrame: ArrayBufferLike) { - this.send(this.codec.encodeRdpResponsePDU(responseFrame)); + sendRdpResponsePdu(responseFrame: ArrayBufferLike) { + this.send(this.codec.encodeRdpResponsePdu(responseFrame)); } // Emits a warning event, but keeps the socket open. diff --git a/web/packages/shared/libs/tdp/codec.ts b/web/packages/shared/libs/tdp/codec.ts index 7c38e12541e5d..75eb8061e8b4f 100644 --- a/web/packages/shared/libs/tdp/codec.ts +++ b/web/packages/shared/libs/tdp/codec.ts @@ -745,7 +745,7 @@ export default class Codec { } // | message type (30) | data_length uint32 | data []byte | - encodeRdpResponsePDU(responseFrame: ArrayBufferLike): Message { + encodeRdpResponsePdu(responseFrame: ArrayBufferLike): Message { const bufLen = BYTE_LEN + UINT_32_LEN + responseFrame.byteLength; const buffer = new ArrayBuffer(bufLen); const view = new DataView(buffer); @@ -894,7 +894,7 @@ export default class Codec { } // | message type (29) | data_length uint32 | data []byte | - decodeRdpFastPathPDU(buffer: ArrayBufferLike): RdpFastPathPdu { + decodeRdpFastPathPdu(buffer: ArrayBufferLike): RdpFastPathPdu { const dv = new DataView(buffer); let offset = 0; offset += BYTE_LEN; // eat message type diff --git a/web/packages/teleport/index.html b/web/packages/teleport/index.html index 34d6ce56782c2..917ff53c548cb 100644 --- a/web/packages/teleport/index.html +++ b/web/packages/teleport/index.html @@ -10,8 +10,15 @@ + diff --git a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx index 4118cac3c8efe..cfb4100805859 100644 --- a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx +++ b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx @@ -319,6 +319,9 @@ const EventIconMap: Record = { [eventCodes.MCP_SESSION_REQUEST]: Icons.ModelContextProtocol, [eventCodes.MCP_SESSION_REQUEST_FAILURE]: Icons.Warning, [eventCodes.MCP_SESSION_NOTIFICATION]: Icons.ModelContextProtocol, + [eventCodes.BOUND_KEYPAIR_RECOVERY]: Icons.Info, + [eventCodes.BOUND_KEYPAIR_ROTATION]: Icons.Info, + [eventCodes.BOUND_KEYPAIR_JOIN_STATE_VERIFICATION_FAILED]: Icons.Warning, }; export default function renderTypeCell(event: Event) { diff --git a/web/packages/teleport/src/Discover/SelectResource/resources/resources.tsx b/web/packages/teleport/src/Discover/SelectResource/resources/resources.tsx index 5f2e5c29cb3b5..ed23a0627745d 100644 --- a/web/packages/teleport/src/Discover/SelectResource/resources/resources.tsx +++ b/web/packages/teleport/src/Discover/SelectResource/resources/resources.tsx @@ -68,7 +68,16 @@ export const SERVERS: SelectResourceSpec[] = [ id: DiscoverGuideId.ServerLinuxRhelCentos, name: 'RHEL 8+/CentOS Stream 9+', kind: ResourceKind.Server, - keywords: [...baseServerKeywords, 'rhel', 'redhat', 'centos', 'linux'], + keywords: [ + ...baseServerKeywords, + 'rhel', + 'redhat', + 'centos', + 'linux', + 'rocky', + 'alma', + 'almalinux', + ], icon: 'linux', event: DiscoverEventResource.Server, platform: Platform.Linux, diff --git a/web/packages/teleport/src/LocksV2/NewLock/LockCheckout/LockCheckout.tsx b/web/packages/teleport/src/LocksV2/NewLock/LockCheckout/LockCheckout.tsx index a9e23d51fe86a..709e6c91ff337 100644 --- a/web/packages/teleport/src/LocksV2/NewLock/LockCheckout/LockCheckout.tsx +++ b/web/packages/teleport/src/LocksV2/NewLock/LockCheckout/LockCheckout.tsx @@ -42,6 +42,7 @@ import { pluralize } from 'shared/utils/text'; import shieldCheck from 'teleport/assets/shield-check.png'; import cfg from 'teleport/config'; import { TrashButton } from 'teleport/LocksV2/common'; +import { zIndexMap } from 'teleport/Navigation/zIndexMap'; import { lockService } from 'teleport/services/locks'; import { @@ -200,6 +201,7 @@ export const LockCheckout = forwardRef( top: 0; left: 0; overflow: hidden; + z-index: ${zIndexMap.checkoutSidePanel}; `} > diff --git a/web/packages/teleport/src/Navigation/zIndexMap.ts b/web/packages/teleport/src/Navigation/zIndexMap.ts index aa682cc2133bc..f163c738e21ec 100644 --- a/web/packages/teleport/src/Navigation/zIndexMap.ts +++ b/web/packages/teleport/src/Navigation/zIndexMap.ts @@ -17,6 +17,11 @@ */ export const zIndexMap = { + // "checkoutSidePanel" z-index must be a higher value than "topBar" z-index. + // checkoutSidePanel encompasses entire height of the browser and + // the high z-index prevents navigational bits from rendering over + // the panel. + checkoutSidePanel: 100, topBar: 19, sideNavButtons: 18, sideNavContainer: 17, diff --git a/web/packages/teleport/src/lib/tdp/playerClient.ts b/web/packages/teleport/src/lib/tdp/playerClient.ts index f22b4deb94dae..eed18671ec0c5 100644 --- a/web/packages/teleport/src/lib/tdp/playerClient.ts +++ b/web/packages/teleport/src/lib/tdp/playerClient.ts @@ -208,7 +208,7 @@ export class PlayerClient extends TdpClient { // RDP response PDUs to the server during playback, which is unnecessary // and breaks the playback system. // eslint-disable-next-line unused-imports/no-unused-vars - sendRdpResponsePDU(responseFrame: ArrayBuffer) { + sendRdpResponsePdu(responseFrame: ArrayBuffer) { return; } diff --git a/web/packages/teleport/src/services/audit/makeEvent.ts b/web/packages/teleport/src/services/audit/makeEvent.ts index 4154c506dc7c9..0c1a634024f77 100644 --- a/web/packages/teleport/src/services/audit/makeEvent.ts +++ b/web/packages/teleport/src/services/audit/makeEvent.ts @@ -2233,6 +2233,31 @@ export const formatters: Formatters = { return `User [${user}] sent an MCP notification [${message.method}] to MCP server [${app_name}]`; }, }, + [eventCodes.BOUND_KEYPAIR_RECOVERY]: { + type: 'join_token.bound_keypair.recovery', + desc: 'Bound Keypair Recovery', + format: ({ token_name, success, error, recovery_count }) => { + return success + ? `Bound Keypair token [${token_name}] was successfully used in a recovery attempt. New counter value: ${recovery_count}` + : `Bound Keypair token [${token_name}] was used to attempt a recovery and failed: ${error}`; + }, + }, + [eventCodes.BOUND_KEYPAIR_ROTATION]: { + type: 'join_token.bound_keypair.rotation', + desc: 'Bound Keypair Rotation', + format: ({ token_name, success, error }) => { + return success + ? `Bound Keypair token [${token_name}] successfully rotated its public key during a join attempt` + : `Bound Keypair token [${token_name}] failed to rotate its public key during a join attempt: ${error}`; + }, + }, + [eventCodes.BOUND_KEYPAIR_JOIN_STATE_VERIFICATION_FAILED]: { + type: 'join_token.bound_keypair.join_state_verification_failed', + desc: 'Bound Keypair Join Verification Failed', + format: ({ token_name, error }) => { + return `Bound keypair token [${token_name}] failed to verify a join attempt: ${error}`; + }, + }, }; const unknownFormatter = { diff --git a/web/packages/teleport/src/services/audit/types.ts b/web/packages/teleport/src/services/audit/types.ts index 661ab6d4802e0..8b23f125a7683 100644 --- a/web/packages/teleport/src/services/audit/types.ts +++ b/web/packages/teleport/src/services/audit/types.ts @@ -338,6 +338,9 @@ export const eventCodes = { MCP_SESSION_REQUEST: 'TMCP003I', MCP_SESSION_REQUEST_FAILURE: 'TMCP003E', MCP_SESSION_NOTIFICATION: 'TMCP004I', + BOUND_KEYPAIR_RECOVERY: 'TBK001I', + BOUND_KEYPAIR_ROTATION: 'TBK002I', + BOUND_KEYPAIR_JOIN_STATE_VERIFICATION_FAILED: 'TBK003W', } as const; /** @@ -1978,6 +1981,34 @@ export type RawEvents = { }; } >; + [eventCodes.BOUND_KEYPAIR_RECOVERY]: RawEvent< + typeof eventCodes.BOUND_KEYPAIR_RECOVERY, + { + token_name: string; + bot_name: string; + success: boolean; + error: string; + recovery_count: number; + } + >; + [eventCodes.BOUND_KEYPAIR_ROTATION]: RawEvent< + typeof eventCodes.BOUND_KEYPAIR_ROTATION, + { + token_name: string; + bot_name: string; + success: boolean; + error: string; + } + >; + [eventCodes.BOUND_KEYPAIR_JOIN_STATE_VERIFICATION_FAILED]: RawEvent< + typeof eventCodes.BOUND_KEYPAIR_JOIN_STATE_VERIFICATION_FAILED, + { + token_name: string; + bot_name: string; + success: boolean; + error: string; + } + >; }; /**