From 81c00c064822e37a1bfecb201538dae06fead2a5 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 28 Apr 2022 13:42:48 -0300 Subject: [PATCH 01/22] feat: session recording modes --- api/constants/constants.go | 26 + api/types/role.go | 1 + api/types/types.pb.go | 1687 +++++++++++--------- api/types/types.proto | 14 + lib/events/api.go | 3 + lib/events/auditwriter.go | 36 +- lib/events/auditwriter_test.go | 30 + lib/events/filesessions/filestream.go | 46 +- lib/events/filesessions/filestream_test.go | 63 + lib/events/gcssessions/gcsstream.go | 5 + lib/events/s3sessions/s3stream.go | 5 + lib/events/stream.go | 75 +- lib/events/stream_test.go | 121 ++ lib/services/role.go | 38 + lib/services/role_test.go | 64 + lib/srv/mock.go | 3 +- lib/srv/sess.go | 146 +- lib/srv/sess_test.go | 154 +- 18 files changed, 1658 insertions(+), 859 deletions(-) create mode 100644 lib/events/filesessions/filestream_test.go diff --git a/api/constants/constants.go b/api/constants/constants.go index 1714ed6da3d91..411d892c03d8f 100644 --- a/api/constants/constants.go +++ b/api/constants/constants.go @@ -217,3 +217,29 @@ const ( // when HTTPS_PROXY or HTTP_PROXY is ignored NoProxy = "NO_PROXY" ) + +// SessionRecordingService is used to differentiate session recording services. +type SessionRecordingService int + +const ( + // SessionRecordingServiceSSH represents the SSH service session. + SessionRecordingServiceSSH SessionRecordingService = iota +) + +// SessionRecordingMode determines how session recording will behave in failure +// scenarios. +type SessionRecordingMode string + +const ( + // SessionRecordingModeEmpty is used to identify the absence of recording + // mode. + SessionRecordingModeEmpty = SessionRecordingMode("") + + // SessionRecordingModeStrict causes any failure session recording to + // terminate the session or prevent a new session from starting. + SessionRecordingModeStrict = SessionRecordingMode("strict") + + // SessionRecordingModeBestEffort allows the session to keep going even when + // session recording fails. + SessionRecordingModeBestEffort = SessionRecordingMode("best_effort") +) diff --git a/api/types/role.go b/api/types/role.go index e4e56e25eba0d..b4493a22c553a 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -644,6 +644,7 @@ func (r *RoleV5) CheckAndSetDefaults() error { if r.Spec.Options.RecordSession == nil { r.Spec.Options.RecordSession = &RecordSession{ Desktop: NewBoolOption(true), + Default: constants.SessionRecordingModeBestEffort, } } if r.Spec.Options.DesktopClipboard == nil { diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 69a8442f3aee2..23812506cf5b5 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -4595,10 +4595,14 @@ var xxx_messageInfo_RoleOptions proto.InternalMessageInfo type RecordSession struct { // Desktop indicates whether desktop sessions should be recorded. // It defaults to true unless explicitly set to false. - Desktop *BoolOption `protobuf:"bytes,1,opt,name=Desktop,proto3,customtype=BoolOption" json:"desktop"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Desktop *BoolOption `protobuf:"bytes,1,opt,name=Desktop,proto3,customtype=BoolOption" json:"desktop"` + // Default indicates the default value for the services. + Default github_com_gravitational_teleport_api_constants.SessionRecordingMode `protobuf:"bytes,2,opt,name=Default,proto3,casttype=github.com/gravitational/teleport/api/constants.SessionRecordingMode" json:"default,omitempty"` + // SSH indicates the session mode used on SSH sessions. + SSH github_com_gravitational_teleport_api_constants.SessionRecordingMode `protobuf:"bytes,4,opt,name=SSH,proto3,casttype=github.com/gravitational/teleport/api/constants.SessionRecordingMode" json:"ssh,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RecordSession) Reset() { *m = RecordSession{} } @@ -9402,799 +9406,802 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 12664 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x6d, 0x6c, 0x1c, 0x49, - 0x76, 0x98, 0x7a, 0x66, 0x48, 0x0e, 0x1f, 0x87, 0xe4, 0xb0, 0x48, 0x49, 0x94, 0x56, 0xbb, 0xa3, - 0xed, 0xdd, 0xd5, 0x6a, 0xb5, 0xbb, 0xd2, 0x89, 0xba, 0xdd, 0xf3, 0xde, 0x7e, 0xce, 0x90, 0x94, - 0xc4, 0x15, 0x45, 0x72, 0x7b, 0xf8, 0x71, 0xe7, 0xbb, 0x73, 0xbb, 0x39, 0x5d, 0x24, 0x7b, 0x39, - 0x33, 0x3d, 0xd7, 0xdd, 0x23, 0x89, 0x76, 0x0c, 0xdb, 0x08, 0x2e, 0x86, 0x61, 0xf8, 0xce, 0x17, - 0x9c, 0x63, 0x3b, 0x70, 0x60, 0xc7, 0x88, 0x93, 0x38, 0xc1, 0x19, 0x81, 0x1d, 0x20, 0x09, 0x12, - 0x38, 0x30, 0x10, 0x18, 0x87, 0x20, 0x41, 0xfc, 0x2f, 0xf0, 0x25, 0x60, 0xe2, 0x3b, 0xff, 0x22, - 0x10, 0x20, 0x80, 0x7f, 0xf9, 0x12, 0x03, 0x41, 0xbd, 0xaa, 0xea, 0xae, 0xea, 0xe9, 0x21, 0x87, - 0x2b, 0x2d, 0x62, 0xed, 0x2f, 0x72, 0x5e, 0xbd, 0xf7, 0xaa, 0xba, 0xea, 0xd5, 0xab, 0x57, 0xaf, - 0x5e, 0xbd, 0x82, 0xb1, 0xe8, 0xa0, 0x43, 0xc3, 0xeb, 0x9d, 0xc0, 0x8f, 0x7c, 0x32, 0x84, 0x3f, - 0x2e, 0xce, 0xec, 0xfa, 0xbb, 0x3e, 0x42, 0x6e, 0xb0, 0xff, 0x78, 0xe1, 0xc5, 0xca, 0xae, 0xef, - 0xef, 0x36, 0xe9, 0x0d, 0xfc, 0xb5, 0xdd, 0xdd, 0xb9, 0x11, 0x79, 0x2d, 0x1a, 0x46, 0x4e, 0xab, - 0x23, 0x10, 0xe6, 0x77, 0xbd, 0x68, 0xaf, 0xbb, 0x7d, 0xbd, 0xe1, 0xb7, 0x6e, 0xec, 0x06, 0xce, - 0x03, 0x2f, 0x72, 0x22, 0xcf, 0x6f, 0x3b, 0xcd, 0x1b, 0x11, 0x6d, 0xd2, 0x8e, 0x1f, 0x44, 0x37, - 0x9c, 0x8e, 0x77, 0x03, 0xeb, 0xb8, 0xf1, 0x30, 0x70, 0x3a, 0x1d, 0x1a, 0x24, 0xff, 0x70, 0x26, - 0xe6, 0x3f, 0xcc, 0xc3, 0xe8, 0x3d, 0x4a, 0x3b, 0xd5, 0xa6, 0xf7, 0x80, 0x92, 0x17, 0xa0, 0xb0, - 0xe2, 0xb4, 0xe8, 0xac, 0x71, 0xd9, 0xb8, 0x3a, 0x5a, 0x9b, 0x3c, 0x3a, 0xac, 0x8c, 0x85, 0x34, - 0x78, 0x40, 0x03, 0xbb, 0xed, 0xb4, 0xa8, 0x85, 0x85, 0xe4, 0x55, 0x18, 0x65, 0x7f, 0xc3, 0x8e, - 0xd3, 0xa0, 0xb3, 0x39, 0xc4, 0x1c, 0x3f, 0x3a, 0xac, 0x8c, 0xb6, 0x25, 0xd0, 0x4a, 0xca, 0xc9, - 0x15, 0x18, 0x59, 0xa6, 0x4e, 0x48, 0x97, 0x16, 0x66, 0xf3, 0x97, 0x8d, 0xab, 0xf9, 0x5a, 0xe9, - 0xe8, 0xb0, 0x52, 0x6c, 0x32, 0x90, 0xed, 0xb9, 0x96, 0x2c, 0x24, 0x4b, 0x30, 0xb2, 0xf8, 0xa8, - 0xe3, 0x05, 0x34, 0x9c, 0x2d, 0x5c, 0x36, 0xae, 0x8e, 0xcd, 0x5d, 0xbc, 0xce, 0xbf, 0xff, 0xba, - 0xfc, 0xfe, 0xeb, 0xeb, 0xf2, 0xfb, 0x6b, 0xd3, 0xdf, 0x3b, 0xac, 0x9c, 0x39, 0x3a, 0xac, 0x8c, - 0x50, 0x4e, 0xf2, 0x2b, 0xff, 0xa3, 0x62, 0x58, 0x92, 0x9e, 0xbc, 0x03, 0x85, 0xf5, 0x83, 0x0e, - 0x9d, 0x1d, 0xbd, 0x6c, 0x5c, 0x9d, 0x98, 0x7b, 0xee, 0x3a, 0xef, 0xf1, 0xf8, 0x23, 0x93, 0xff, - 0x18, 0x56, 0xad, 0x78, 0x74, 0x58, 0x29, 0x30, 0x14, 0x0b, 0xa9, 0xc8, 0xeb, 0x30, 0x7c, 0xd7, - 0x0f, 0xa3, 0xa5, 0x85, 0x59, 0xc0, 0x4f, 0x3b, 0x7b, 0x74, 0x58, 0x99, 0xda, 0xf3, 0xc3, 0xc8, - 0xf6, 0xdc, 0xd7, 0xfc, 0x96, 0x17, 0xd1, 0x56, 0x27, 0x3a, 0xb0, 0x04, 0x92, 0xb9, 0x0d, 0xe3, - 0x1a, 0x3f, 0x32, 0x06, 0x23, 0x1b, 0x2b, 0xf7, 0x56, 0x56, 0xb7, 0x56, 0xca, 0x67, 0x48, 0x11, - 0x0a, 0x2b, 0xab, 0x0b, 0x8b, 0x65, 0x83, 0x8c, 0x40, 0xbe, 0xba, 0xb6, 0x56, 0xce, 0x91, 0x12, - 0x14, 0x17, 0xaa, 0xeb, 0xd5, 0x5a, 0xb5, 0xbe, 0x58, 0xce, 0x93, 0x69, 0x98, 0xdc, 0x5a, 0x5a, - 0x59, 0x58, 0xdd, 0xaa, 0xdb, 0x0b, 0x8b, 0xf5, 0x7b, 0xeb, 0xab, 0x6b, 0xe5, 0x02, 0x99, 0x00, - 0xb8, 0xb7, 0x51, 0x5b, 0xb4, 0x56, 0x16, 0xd7, 0x17, 0xeb, 0xe5, 0x21, 0xf3, 0x17, 0xf2, 0x50, - 0xbc, 0x4f, 0x23, 0xc7, 0x75, 0x22, 0x87, 0x5c, 0xd2, 0x86, 0x08, 0x5b, 0xaf, 0x8c, 0xcd, 0x0b, - 0xbd, 0x63, 0x33, 0x74, 0x74, 0x58, 0x31, 0x5e, 0x57, 0xc7, 0xe4, 0x6d, 0x18, 0x5b, 0xa0, 0x61, - 0x23, 0xf0, 0x3a, 0x4c, 0x5e, 0x70, 0x5c, 0x46, 0x6b, 0x17, 0x8e, 0x0e, 0x2b, 0x67, 0xdd, 0x04, - 0xac, 0x7c, 0xab, 0x8a, 0x4d, 0x96, 0x60, 0x78, 0xd9, 0xd9, 0xa6, 0xcd, 0x70, 0x76, 0xe8, 0x72, - 0xfe, 0xea, 0xd8, 0xdc, 0x33, 0xa2, 0x7f, 0x65, 0x03, 0xaf, 0xf3, 0xd2, 0xc5, 0x76, 0x14, 0x1c, - 0xd4, 0x66, 0x8e, 0x0e, 0x2b, 0xe5, 0x26, 0x02, 0xd4, 0xbe, 0xe3, 0x28, 0xa4, 0x9e, 0x8c, 0xf9, - 0xf0, 0x89, 0x63, 0xfe, 0xec, 0xf7, 0x0e, 0x2b, 0x06, 0x1b, 0x0b, 0x31, 0xe6, 0x09, 0x3f, 0x7d, - 0xf4, 0x2f, 0x43, 0x6e, 0x69, 0x61, 0x76, 0x04, 0x65, 0xad, 0x7c, 0x74, 0x58, 0x29, 0x69, 0xc3, - 0x96, 0x5b, 0x5a, 0xb8, 0xf8, 0x16, 0x8c, 0x29, 0x6d, 0x24, 0x65, 0xc8, 0xef, 0xd3, 0x03, 0xde, - 0x9f, 0x16, 0xfb, 0x97, 0xcc, 0xc0, 0xd0, 0x03, 0xa7, 0xd9, 0x15, 0x1d, 0x68, 0xf1, 0x1f, 0x5f, - 0xcc, 0xfd, 0x98, 0x61, 0xfe, 0xdd, 0x02, 0x14, 0x2d, 0x9f, 0xcf, 0x33, 0xf2, 0x0a, 0x0c, 0xd5, - 0x23, 0x27, 0x92, 0x43, 0x31, 0x7d, 0x74, 0x58, 0x99, 0x0c, 0x19, 0x40, 0xa9, 0x8f, 0x63, 0x30, - 0xd4, 0xb5, 0x3d, 0x27, 0x94, 0x43, 0x82, 0xa8, 0x1d, 0x06, 0x50, 0x51, 0x11, 0x83, 0x5c, 0x81, - 0xc2, 0x7d, 0xdf, 0xa5, 0x62, 0x54, 0xc8, 0xd1, 0x61, 0x65, 0xa2, 0xe5, 0xbb, 0x2a, 0x22, 0x96, - 0x93, 0xd7, 0x60, 0x74, 0xbe, 0x1b, 0x04, 0xb4, 0xcd, 0x44, 0xb5, 0x80, 0xc8, 0x13, 0x47, 0x87, - 0x15, 0x68, 0x70, 0x20, 0x9b, 0x5c, 0x09, 0x02, 0xeb, 0xea, 0x7a, 0xe4, 0x04, 0x11, 0x75, 0x67, - 0x87, 0x06, 0xea, 0x6a, 0x36, 0xbd, 0xa6, 0x42, 0x4e, 0x92, 0xee, 0x6a, 0xc1, 0x89, 0xdc, 0x85, - 0xb1, 0x3b, 0x81, 0xd3, 0xa0, 0x6b, 0x34, 0xf0, 0x7c, 0x17, 0xc7, 0x30, 0x5f, 0xbb, 0x72, 0x74, - 0x58, 0x39, 0xb7, 0xcb, 0xc0, 0x76, 0x07, 0xe1, 0x09, 0xf5, 0x8f, 0x0e, 0x2b, 0xc5, 0x85, 0x6e, - 0x80, 0xbd, 0x67, 0xa9, 0xa4, 0xe4, 0x27, 0xd9, 0x90, 0x84, 0x11, 0x76, 0x2d, 0x75, 0x71, 0xf4, - 0x8e, 0x6f, 0xa2, 0x29, 0x9a, 0x78, 0xae, 0xe9, 0x84, 0x91, 0x1d, 0x70, 0xba, 0x54, 0x3b, 0x55, - 0x96, 0x64, 0x15, 0x8a, 0xf5, 0xc6, 0x1e, 0x75, 0xbb, 0x4d, 0x3a, 0x5b, 0x44, 0xf6, 0xe7, 0x85, - 0xe0, 0xca, 0xf1, 0x94, 0xc5, 0xb5, 0x8b, 0x82, 0x37, 0x09, 0x05, 0x44, 0xe9, 0xfb, 0x98, 0xc9, - 0x17, 0x8b, 0xbf, 0xfe, 0xdb, 0x95, 0x33, 0x3f, 0xf7, 0xdf, 0x2f, 0x9f, 0x31, 0xff, 0x55, 0x0e, - 0xca, 0x69, 0x26, 0x64, 0x07, 0xc6, 0x37, 0x3a, 0xae, 0x13, 0xd1, 0xf9, 0xa6, 0x47, 0xdb, 0x51, - 0x88, 0x42, 0x72, 0xfc, 0x37, 0xbd, 0x28, 0xea, 0x9d, 0xed, 0x22, 0xa1, 0xdd, 0xe0, 0x94, 0xa9, - 0xaf, 0xd2, 0xd9, 0x26, 0xf5, 0xd4, 0x51, 0x4f, 0x87, 0x28, 0x61, 0xa7, 0xab, 0x87, 0x6b, 0xf8, - 0x3e, 0xf5, 0x08, 0xb6, 0x42, 0x80, 0xda, 0xee, 0xf6, 0x01, 0x4a, 0xe6, 0xe0, 0x02, 0xc4, 0x48, - 0x32, 0x04, 0x88, 0x81, 0xcd, 0xbf, 0x30, 0x60, 0xc2, 0xa2, 0xa1, 0xdf, 0x0d, 0x1a, 0xf4, 0x2e, - 0x75, 0x5c, 0x1a, 0x30, 0xf1, 0xbf, 0xe7, 0xb5, 0x5d, 0x31, 0xa7, 0x50, 0xfc, 0xf7, 0xbd, 0xb6, - 0x3a, 0x85, 0xb1, 0x9c, 0x7c, 0x0e, 0x46, 0xea, 0xdd, 0x6d, 0x44, 0xe5, 0x73, 0xea, 0x1c, 0x8e, - 0x58, 0x77, 0xdb, 0x4e, 0xa1, 0x4b, 0x34, 0x72, 0x03, 0x46, 0x36, 0x69, 0x10, 0x26, 0x1a, 0x0f, - 0x35, 0xfb, 0x03, 0x0e, 0x52, 0x09, 0x04, 0x16, 0xb9, 0x93, 0x68, 0x5d, 0xb1, 0x26, 0x4d, 0xa6, - 0x74, 0x5d, 0x22, 0x2a, 0x2d, 0x01, 0x51, 0x45, 0x45, 0x62, 0x99, 0xdf, 0xce, 0x41, 0x79, 0xc1, - 0x89, 0x9c, 0x6d, 0x27, 0x14, 0xfd, 0xb9, 0x79, 0x8b, 0xe9, 0x71, 0xe5, 0x43, 0x51, 0x8f, 0xb3, - 0x96, 0x7f, 0xe2, 0xcf, 0x7b, 0x29, 0xfd, 0x79, 0x63, 0x6c, 0x81, 0x14, 0x9f, 0x97, 0x7c, 0xd4, - 0xbb, 0x27, 0x7f, 0x54, 0x59, 0x7c, 0x54, 0x51, 0x7e, 0x54, 0xf2, 0x29, 0xe4, 0x5d, 0x28, 0xd4, - 0x3b, 0xb4, 0x21, 0x94, 0x88, 0xd4, 0xfd, 0xfa, 0xc7, 0x31, 0x84, 0xcd, 0x5b, 0xb5, 0x92, 0x60, - 0x53, 0x08, 0x3b, 0xb4, 0x61, 0x21, 0x99, 0x32, 0x69, 0xbe, 0x33, 0x0c, 0x33, 0x59, 0x64, 0xe4, - 0x5d, 0x7d, 0x71, 0xe2, 0xdd, 0xf3, 0x4c, 0xdf, 0xc5, 0x69, 0xd6, 0xd0, 0x97, 0xa7, 0x6b, 0x50, - 0x5c, 0x63, 0x02, 0xd9, 0xf0, 0x9b, 0xa2, 0xe7, 0x98, 0x56, 0x2c, 0x76, 0x24, 0xcc, 0xb0, 0xe2, - 0x72, 0xf2, 0x0c, 0xe4, 0x37, 0xac, 0x25, 0xd1, 0x5d, 0xa3, 0x47, 0x87, 0x95, 0x7c, 0x37, 0xf0, - 0x66, 0x0d, 0x8b, 0x41, 0xc9, 0x0d, 0x18, 0x9e, 0xaf, 0xce, 0xd3, 0x20, 0xc2, 0x6e, 0x2a, 0xd5, - 0xce, 0x33, 0x69, 0x69, 0x38, 0x76, 0x83, 0x06, 0x91, 0x56, 0xbd, 0x40, 0x23, 0xaf, 0x42, 0xbe, - 0xba, 0x55, 0x17, 0x3d, 0x03, 0xa2, 0x67, 0xaa, 0x5b, 0xf5, 0xda, 0xb8, 0xe8, 0x88, 0xbc, 0xf3, - 0x30, 0x64, 0xdc, 0xab, 0x5b, 0x75, 0x75, 0xb4, 0x86, 0x8f, 0x19, 0xad, 0xab, 0x50, 0x64, 0x76, - 0x06, 0x5b, 0xe0, 0x51, 0x29, 0x8e, 0x72, 0xf3, 0x69, 0x4f, 0xc0, 0xac, 0xb8, 0x94, 0xbc, 0x10, - 0x9b, 0x2d, 0xc5, 0x84, 0x9f, 0x30, 0x5b, 0xa4, 0xb1, 0x42, 0x1e, 0xc1, 0xf8, 0xc2, 0x41, 0xdb, - 0x69, 0x79, 0x0d, 0xb1, 0x84, 0x8f, 0xe2, 0x12, 0x7e, 0xfd, 0x98, 0x61, 0xbc, 0xae, 0x11, 0xf0, - 0x55, 0x5d, 0x2a, 0xdf, 0x59, 0x97, 0x97, 0xd9, 0xe9, 0x15, 0x7e, 0xd6, 0xb0, 0xf4, 0x8a, 0xd8, - 0x5c, 0x92, 0x2a, 0x12, 0xed, 0xaa, 0x44, 0xec, 0x24, 0x38, 0x99, 0x4b, 0x81, 0x80, 0xa8, 0x73, - 0x29, 0x5e, 0x74, 0xdf, 0x85, 0xfc, 0x9d, 0xf9, 0xb5, 0xd9, 0x31, 0xe4, 0x41, 0x04, 0x8f, 0x3b, - 0xf3, 0x6b, 0xf3, 0x4d, 0xbf, 0xeb, 0xd6, 0x3f, 0x5a, 0xae, 0x9d, 0x17, 0x6c, 0xc6, 0x77, 0x1b, - 0x1d, 0xad, 0x45, 0x8c, 0x8e, 0x2c, 0x42, 0x51, 0x7e, 0xe5, 0x6c, 0x09, 0x79, 0x4c, 0xa5, 0x3e, - 0x7e, 0xf3, 0x16, 0x9f, 0x6b, 0xae, 0xf8, 0xad, 0xb6, 0x42, 0xe2, 0x5c, 0xdc, 0x02, 0xd2, 0xdb, - 0x2f, 0x19, 0x96, 0xc4, 0xab, 0xaa, 0x25, 0x31, 0x36, 0x77, 0x56, 0xd4, 0x35, 0xef, 0xb7, 0x5a, - 0x4e, 0xdb, 0x45, 0xda, 0xcd, 0x39, 0xd5, 0xc0, 0xa8, 0xc2, 0x44, 0xd2, 0x90, 0x65, 0x2f, 0x8c, - 0xc8, 0x0d, 0x18, 0x95, 0x10, 0xb6, 0x88, 0xe4, 0x33, 0x9b, 0x6c, 0x25, 0x38, 0xe6, 0x9f, 0xe4, - 0x00, 0x92, 0x92, 0xa7, 0x54, 0xcf, 0x7c, 0x41, 0xd3, 0x33, 0x67, 0xd3, 0x02, 0xda, 0x57, 0xc3, - 0x90, 0xf7, 0x61, 0x98, 0x99, 0x5c, 0x5d, 0x69, 0x52, 0x9e, 0x4f, 0x93, 0x62, 0xe1, 0xe6, 0xad, - 0xda, 0x84, 0x20, 0x1e, 0x0e, 0x11, 0x62, 0x09, 0x32, 0x45, 0x45, 0xfd, 0xc1, 0x50, 0x32, 0x18, - 0x42, 0x39, 0x5d, 0x55, 0xb4, 0x8b, 0x91, 0xcc, 0x47, 0xa9, 0x5d, 0x14, 0xdd, 0x72, 0x81, 0xeb, - 0x16, 0xde, 0xa9, 0x23, 0x42, 0xb7, 0xa4, 0x35, 0x0b, 0xef, 0xc0, 0x13, 0x35, 0x4b, 0x27, 0x3d, - 0x6d, 0x0b, 0x28, 0x06, 0x57, 0x33, 0x7b, 0x25, 0x6b, 0xc2, 0x5e, 0x3e, 0x69, 0xc2, 0xa6, 0xa7, - 0xeb, 0xad, 0x7e, 0xba, 0xec, 0xac, 0x9c, 0x5d, 0xce, 0x43, 0x95, 0x1c, 0x75, 0xda, 0xdb, 0x7c, - 0x6a, 0x0e, 0xf7, 0x9d, 0x9a, 0x67, 0x33, 0xa7, 0x26, 0x9f, 0x98, 0x6f, 0xc3, 0x50, 0xf5, 0xa7, - 0xba, 0x01, 0x15, 0xb6, 0x5f, 0x49, 0xd6, 0xc9, 0x60, 0xf1, 0x9c, 0x9e, 0x74, 0xd8, 0x4f, 0xd5, - 0x66, 0xc6, 0x72, 0x56, 0xf3, 0xfa, 0x72, 0x5d, 0xd8, 0x75, 0x24, 0xd5, 0x2d, 0xeb, 0xcb, 0x4a, - 0xb3, 0x23, 0xed, 0xab, 0x19, 0x15, 0xb9, 0x01, 0xb9, 0xea, 0x02, 0x6e, 0x16, 0xc7, 0xe6, 0x46, - 0x65, 0xb5, 0x0b, 0xb5, 0x19, 0x41, 0x52, 0x72, 0xb4, 0xfd, 0x43, 0x75, 0x81, 0xd4, 0x60, 0xe8, - 0xfe, 0x41, 0xfd, 0xa3, 0x65, 0xa1, 0xc8, 0xa6, 0xa5, 0x5c, 0x33, 0xd8, 0x2a, 0xae, 0x42, 0x61, - 0xd2, 0xe2, 0xd6, 0x41, 0xf8, 0xf5, 0xa6, 0xda, 0x62, 0x44, 0xfb, 0xf4, 0x14, 0xc8, 0xbf, 0x30, - 0x14, 0x5b, 0x43, 0xc8, 0x3a, 0xdb, 0xd3, 0x0a, 0x89, 0x33, 0x12, 0xcb, 0xa7, 0x47, 0xe2, 0x62, - 0x79, 0x7b, 0x85, 0x8f, 0x7e, 0xae, 0x67, 0xf4, 0xc7, 0x94, 0x95, 0x8c, 0x8f, 0x79, 0xdc, 0x17, - 0xf9, 0x4f, 0xdc, 0x17, 0xe6, 0x1f, 0xe5, 0xb0, 0x3e, 0xf2, 0x1a, 0x0c, 0x5b, 0x74, 0x37, 0x59, - 0xf4, 0x71, 0xf3, 0x18, 0x20, 0x44, 0x6d, 0x24, 0xc7, 0xc1, 0x15, 0x85, 0xba, 0xe1, 0x9e, 0xb7, - 0x13, 0x89, 0x96, 0xc6, 0x2b, 0x8a, 0x00, 0x2b, 0x2b, 0x8a, 0x80, 0x68, 0x2b, 0x8a, 0x80, 0x31, - 0x59, 0xb7, 0x16, 0xea, 0xe2, 0x03, 0xe4, 0xd7, 0x5a, 0x0b, 0x8a, 0xd0, 0x04, 0xae, 0x26, 0x34, - 0xd6, 0x42, 0x9d, 0xbc, 0x09, 0xa3, 0xd5, 0x46, 0xc3, 0xef, 0x2a, 0xbb, 0xaf, 0xd9, 0xa3, 0xc3, - 0xca, 0x8c, 0xc3, 0x81, 0xba, 0xaf, 0x20, 0x41, 0x25, 0x75, 0x18, 0x5b, 0x64, 0x5b, 0x16, 0x6f, - 0xde, 0x69, 0xec, 0x51, 0x31, 0xc1, 0xa4, 0xc4, 0x2a, 0x25, 0xb1, 0x09, 0x7d, 0x96, 0x22, 0xb0, - 0xc1, 0x80, 0xea, 0x96, 0x5c, 0xc1, 0x35, 0x6b, 0x49, 0x57, 0xb0, 0x86, 0xcd, 0x37, 0xbb, 0x61, - 0x44, 0x83, 0xa5, 0x05, 0xd1, 0x8f, 0xd8, 0xb0, 0x06, 0x07, 0xa6, 0x1a, 0x16, 0xa3, 0x9a, 0xff, - 0xcd, 0xc0, 0x6e, 0x20, 0x6f, 0x01, 0x2c, 0xb5, 0x99, 0xd9, 0xde, 0xa0, 0x31, 0x03, 0x74, 0x0d, - 0x78, 0x02, 0xaa, 0x73, 0x50, 0x90, 0xf5, 0xaa, 0x73, 0x03, 0x57, 0xcd, 0xaa, 0x94, 0x9b, 0x00, - 0xe1, 0x25, 0x12, 0x55, 0x06, 0x02, 0x9a, 0xaa, 0x32, 0x41, 0x26, 0x57, 0x60, 0x64, 0xa9, 0x7a, - 0xbf, 0xda, 0x8d, 0xf6, 0x70, 0x10, 0x8a, 0x5c, 0x1d, 0x7b, 0x4e, 0xcb, 0x76, 0xba, 0xd1, 0x9e, - 0x25, 0x0b, 0xcd, 0xff, 0x98, 0xd3, 0xfa, 0x9d, 0x58, 0x40, 0x2c, 0xda, 0x69, 0x7a, 0x0d, 0x34, - 0x2a, 0xee, 0x04, 0x7e, 0xb7, 0x13, 0x7f, 0xad, 0x79, 0x74, 0x58, 0x79, 0x2e, 0x48, 0x4a, 0xed, - 0x5d, 0x56, 0xac, 0xb7, 0x21, 0x83, 0x9a, 0x7c, 0x00, 0xa5, 0x8d, 0x90, 0x06, 0xe2, 0x27, 0xdb, - 0x88, 0xe5, 0xaf, 0x8e, 0xd6, 0x2e, 0xe1, 0x46, 0x2b, 0xa4, 0x41, 0xcc, 0x46, 0x95, 0x25, 0x8d, - 0x82, 0xb8, 0x30, 0xbb, 0x1e, 0x38, 0xed, 0xd0, 0x8b, 0x16, 0xdb, 0x8d, 0xe0, 0x00, 0xa7, 0xcf, - 0x62, 0xdb, 0xd9, 0x6e, 0x52, 0x17, 0xbb, 0xa5, 0x58, 0xbb, 0x7a, 0x74, 0x58, 0x79, 0x31, 0xe2, - 0x38, 0x36, 0x8d, 0x91, 0x6c, 0xca, 0xb1, 0x14, 0xce, 0x7d, 0x39, 0x91, 0xf7, 0xa1, 0xb4, 0xd8, - 0x76, 0x3b, 0xbe, 0xd7, 0x8e, 0xd0, 0x4d, 0x56, 0x88, 0x2d, 0xec, 0xf3, 0x54, 0xc0, 0x6d, 0x26, - 0x8f, 0x6a, 0x33, 0x55, 0x02, 0xf3, 0xe7, 0x0c, 0x18, 0x53, 0xd4, 0x3a, 0x1b, 0xf7, 0xb5, 0xc0, - 0xff, 0x98, 0x36, 0x22, 0x5d, 0xe4, 0x3a, 0x1c, 0x98, 0x1a, 0xf7, 0x18, 0x35, 0x25, 0x6a, 0xb9, - 0x53, 0x88, 0x9a, 0x79, 0x43, 0xac, 0x16, 0x6c, 0xbb, 0xa8, 0x78, 0xc3, 0x70, 0xbb, 0xc8, 0xcc, - 0x61, 0x75, 0xbb, 0xc8, 0xca, 0xcd, 0xdf, 0x33, 0x98, 0x96, 0x27, 0x37, 0x00, 0xee, 0xd1, 0x83, - 0xc8, 0xd9, 0xbe, 0xed, 0x35, 0x35, 0x2f, 0xe7, 0x3e, 0x42, 0xed, 0x1d, 0xaf, 0x49, 0x2d, 0x05, - 0x85, 0xdc, 0x82, 0xe2, 0xbd, 0x60, 0xfb, 0x0d, 0x44, 0xcf, 0xc5, 0xab, 0xf5, 0xf4, 0x7e, 0xb0, - 0xfd, 0x06, 0x22, 0xab, 0x1a, 0x45, 0x22, 0x12, 0x13, 0x86, 0x17, 0xfc, 0x96, 0xe3, 0x49, 0x0b, - 0x09, 0x98, 0x99, 0xe1, 0x22, 0xc4, 0x12, 0x25, 0xcc, 0x3e, 0xa8, 0xaf, 0xad, 0x88, 0xce, 0x47, - 0xfb, 0x20, 0xec, 0xb4, 0x2d, 0x06, 0x33, 0xbf, 0x6b, 0xc0, 0x98, 0xb2, 0x78, 0x91, 0xcf, 0x0b, - 0x8f, 0x90, 0x81, 0xfe, 0xcc, 0x73, 0xbd, 0xcb, 0x1b, 0x2b, 0xe5, 0x96, 0x5d, 0xcb, 0x77, 0xa9, - 0xf0, 0x0f, 0x25, 0x3a, 0x3f, 0x37, 0x88, 0xce, 0x7f, 0x0b, 0x80, 0x9b, 0xfd, 0xd8, 0x9d, 0xca, - 0x24, 0x54, 0xfc, 0xbf, 0xea, 0x60, 0x24, 0xc8, 0xa6, 0x05, 0x25, 0x55, 0xdf, 0x93, 0x1a, 0x8c, - 0x8b, 0x5d, 0xae, 0xb0, 0x13, 0x79, 0x3f, 0xe3, 0x4c, 0x10, 0xdc, 0x7a, 0x77, 0xdd, 0x3a, 0x89, - 0xf9, 0xf3, 0x39, 0x28, 0x0a, 0xc8, 0xdc, 0x53, 0x6a, 0xc2, 0xbe, 0xa1, 0x99, 0xb0, 0x72, 0x65, - 0x54, 0xf6, 0x56, 0x73, 0x27, 0x6c, 0x91, 0xdf, 0x82, 0x92, 0xec, 0x02, 0xdc, 0x09, 0xbc, 0x02, - 0x23, 0xd2, 0xc9, 0xc3, 0xf7, 0x01, 0x93, 0x1a, 0xcf, 0xcd, 0x39, 0x4b, 0x96, 0x9b, 0xdf, 0x1e, - 0x92, 0xb4, 0xbc, 0x26, 0xd6, 0x85, 0x55, 0xd7, 0x0d, 0xd4, 0x2e, 0x74, 0x5c, 0x37, 0xb0, 0x10, - 0xca, 0x06, 0x7f, 0xad, 0xbb, 0xdd, 0xf4, 0x1a, 0x88, 0xa3, 0xcc, 0xc4, 0x0e, 0x42, 0x6d, 0x86, - 0xaa, 0x0e, 0x7e, 0x82, 0xac, 0xed, 0x50, 0xf3, 0xc7, 0xee, 0x50, 0x7f, 0x02, 0x46, 0xe7, 0x5b, - 0xae, 0x66, 0xc1, 0x9a, 0x19, 0x9d, 0x72, 0x3d, 0x46, 0xe2, 0xb6, 0xeb, 0x25, 0xd1, 0x47, 0x33, - 0x8d, 0x96, 0xdb, 0x6b, 0xb7, 0x26, 0x2c, 0xb5, 0x2d, 0xe6, 0xd0, 0xe3, 0x6c, 0x31, 0xdf, 0x84, - 0xd1, 0x8d, 0x90, 0xae, 0x77, 0xdb, 0x6d, 0xda, 0x44, 0x6b, 0xb6, 0xc8, 0xf5, 0x59, 0x37, 0xa4, - 0x76, 0x84, 0x50, 0xb5, 0x01, 0x31, 0xaa, 0x2a, 0x56, 0x23, 0xc7, 0x88, 0xd5, 0xe7, 0xa1, 0x50, - 0xed, 0x74, 0xe4, 0xde, 0x3b, 0x36, 0xaf, 0x3a, 0x1d, 0x34, 0x78, 0x26, 0x9c, 0x4e, 0x47, 0xdf, - 0x49, 0x23, 0x36, 0xa1, 0x40, 0xee, 0x75, 0xb7, 0x69, 0xd0, 0xa6, 0x11, 0x0d, 0xc5, 0xda, 0x19, - 0xce, 0x02, 0xf2, 0x98, 0x95, 0x47, 0x1c, 0x69, 0x04, 0xae, 0xd5, 0xf7, 0xbb, 0xdb, 0xd4, 0x16, - 0x8b, 0xb0, 0xda, 0x77, 0x19, 0x0c, 0x2f, 0xd6, 0x61, 0x42, 0xef, 0xff, 0x27, 0x60, 0x93, 0x7e, - 0x58, 0x28, 0x16, 0xcb, 0xa3, 0xe6, 0x2f, 0xe4, 0x60, 0xac, 0xda, 0xe9, 0x3c, 0xe5, 0x0e, 0xb0, - 0x1f, 0xd3, 0x66, 0xf5, 0xb9, 0x64, 0xf4, 0x4e, 0xe1, 0xfb, 0xfa, 0x2b, 0x03, 0x26, 0x53, 0x14, - 0x6a, 0xeb, 0x8d, 0x01, 0x1d, 0x42, 0xb9, 0x01, 0x1d, 0x42, 0xf9, 0xfe, 0x0e, 0x21, 0x75, 0xce, - 0x14, 0x1e, 0x67, 0xce, 0xbc, 0x0c, 0xf9, 0x6a, 0xa7, 0x23, 0x7a, 0xa5, 0x94, 0xf4, 0xca, 0xe6, - 0x2d, 0xbe, 0xb8, 0x39, 0x9d, 0x8e, 0xc5, 0x30, 0xcc, 0xd7, 0x61, 0x14, 0xc1, 0xa8, 0xd1, 0x2e, - 0x8b, 0xa9, 0xc0, 0xd5, 0x99, 0x46, 0xc6, 0xc5, 0xde, 0xfc, 0x3f, 0x06, 0x0c, 0xe1, 0xef, 0xa7, - 0x54, 0x5c, 0xe6, 0x34, 0x71, 0x29, 0x2b, 0xe2, 0x32, 0x88, 0xa0, 0xfc, 0x41, 0x1e, 0x7b, 0x4b, - 0x88, 0x88, 0x70, 0x29, 0x18, 0x19, 0x2e, 0x85, 0xc7, 0x50, 0xe0, 0xfb, 0x69, 0xe7, 0x42, 0x1e, - 0x07, 0xe3, 0x85, 0x74, 0x53, 0x9f, 0x88, 0x5f, 0xe1, 0x2e, 0x90, 0xa5, 0x76, 0x48, 0x1b, 0xdd, - 0x80, 0xd6, 0xf7, 0xbd, 0xce, 0x26, 0x0d, 0xbc, 0x9d, 0x03, 0x61, 0xba, 0xa3, 0x8e, 0xf5, 0x44, - 0xa9, 0x1d, 0xee, 0x7b, 0x1d, 0x66, 0x26, 0x78, 0x3b, 0x07, 0x56, 0x06, 0x0d, 0x79, 0x1f, 0x46, - 0x2c, 0xfa, 0x30, 0xf0, 0x22, 0xb9, 0x89, 0x9a, 0x88, 0x77, 0x7f, 0x08, 0xe5, 0xf6, 0x4e, 0xc0, - 0x7f, 0xa8, 0xe3, 0x2f, 0xca, 0x3f, 0xbd, 0x1d, 0xf8, 0x77, 0x86, 0x70, 0x2e, 0x9c, 0x70, 0x50, - 0x7b, 0x8c, 0x7f, 0x48, 0x1f, 0xcc, 0xfc, 0x69, 0x06, 0x73, 0x13, 0x4a, 0x6c, 0xd3, 0x9f, 0x72, - 0x14, 0x5d, 0x4a, 0xc6, 0xf2, 0xba, 0x5a, 0x7c, 0xdc, 0x19, 0xad, 0xc6, 0x87, 0xd8, 0x69, 0x21, - 0xe1, 0x67, 0xbf, 0xcf, 0x2a, 0x8c, 0x33, 0xc4, 0x23, 0x56, 0x1d, 0x0d, 0xde, 0x59, 0xa7, 0x16, - 0x8c, 0xe1, 0xc7, 0x13, 0x8c, 0x91, 0x4f, 0x22, 0x18, 0xe9, 0xd3, 0xf1, 0xe2, 0x69, 0x4e, 0xc7, - 0x2f, 0xbe, 0x0f, 0x53, 0x3d, 0x3d, 0x7c, 0x9a, 0x13, 0xe6, 0x4f, 0x4f, 0x2c, 0x7f, 0x26, 0xee, - 0x17, 0x32, 0x87, 0xfe, 0x02, 0x2f, 0xa0, 0x8d, 0x08, 0x55, 0xaf, 0xd0, 0x96, 0x81, 0x80, 0xa5, - 0xbc, 0x24, 0x08, 0x23, 0xef, 0xc1, 0x08, 0x3f, 0xa1, 0xe3, 0x1b, 0xdb, 0xb1, 0xb9, 0x71, 0x51, - 0x23, 0x87, 0x8a, 0x30, 0x09, 0x8e, 0xa1, 0xf6, 0xaa, 0x20, 0x32, 0xef, 0xc0, 0xb0, 0x38, 0xe1, - 0x3b, 0x7e, 0x5e, 0x54, 0x60, 0x68, 0x33, 0xe9, 0x19, 0x3c, 0x95, 0xe1, 0x1f, 0x61, 0x71, 0xb8, - 0xf9, 0x4b, 0x06, 0x4c, 0xe8, 0x5f, 0x49, 0xae, 0xc3, 0xb0, 0x38, 0x82, 0x36, 0xf0, 0x08, 0x9a, - 0x7d, 0xcd, 0x30, 0x3f, 0x7c, 0xd6, 0x8e, 0x9c, 0x05, 0x16, 0x53, 0xfd, 0x82, 0x83, 0xd8, 0xa4, - 0xa3, 0xea, 0x17, 0x42, 0x6a, 0xc9, 0x32, 0xb6, 0x8d, 0xb3, 0x68, 0xd8, 0x6d, 0x46, 0xea, 0x36, - 0x2e, 0x40, 0x88, 0x25, 0x4a, 0xcc, 0x43, 0x03, 0xa0, 0x5e, 0xbf, 0x7b, 0x8f, 0x1e, 0xac, 0x39, - 0x5e, 0x80, 0x5b, 0x61, 0x9c, 0x8d, 0xf7, 0xc4, 0x68, 0x95, 0xc4, 0x56, 0x98, 0xcf, 0xdc, 0x7d, - 0x7a, 0xa0, 0x6d, 0x85, 0x25, 0x2a, 0x4e, 0xf9, 0xc0, 0x7b, 0xe0, 0x44, 0x94, 0x11, 0xe6, 0x90, - 0x90, 0x4f, 0x79, 0x0e, 0x4d, 0x51, 0x2a, 0xc8, 0xe4, 0x6b, 0x30, 0x91, 0xfc, 0xc2, 0x0d, 0x7d, - 0x1e, 0xf7, 0x89, 0x52, 0x22, 0xf4, 0xc2, 0xda, 0x73, 0x47, 0x87, 0x95, 0x8b, 0x0a, 0xd7, 0xf4, - 0x56, 0x3f, 0xc5, 0xcc, 0xfc, 0x1d, 0x03, 0x60, 0x7d, 0xb9, 0x2e, 0x3f, 0xf0, 0x0a, 0x14, 0x62, - 0x3f, 0x62, 0x89, 0xef, 0xb7, 0x53, 0x1b, 0x4a, 0x2c, 0x27, 0x2f, 0x40, 0x3e, 0xf9, 0x92, 0xa9, - 0xa3, 0xc3, 0xca, 0xb8, 0xfe, 0x05, 0xac, 0x94, 0xdc, 0x81, 0x91, 0x81, 0xda, 0x8c, 0xd2, 0x99, - 0xd1, 0x56, 0x49, 0x8d, 0xa3, 0xf0, 0xe1, 0xd6, 0xfa, 0x67, 0x77, 0x14, 0xbe, 0x95, 0x83, 0x49, - 0xd6, 0xaf, 0xd5, 0x6e, 0xb4, 0xe7, 0x07, 0x5e, 0x74, 0xf0, 0xd4, 0xee, 0x8a, 0xdf, 0xd1, 0x0c, - 0xa2, 0x8b, 0x52, 0x6d, 0xa9, 0xdf, 0x36, 0xd0, 0xe6, 0xf8, 0xcf, 0x47, 0x60, 0x3a, 0x83, 0x8a, - 0xbc, 0x26, 0x82, 0xbf, 0x12, 0x3f, 0x14, 0x06, 0x77, 0xfd, 0xe8, 0xb0, 0x52, 0x92, 0xe8, 0xeb, - 0x49, 0xb0, 0xd7, 0x1c, 0x8c, 0x89, 0xad, 0xcf, 0x4a, 0x62, 0x51, 0x63, 0xd4, 0x90, 0x74, 0x5a, - 0xa2, 0x6a, 0x52, 0x91, 0x48, 0x15, 0x4a, 0xf3, 0x7b, 0xb4, 0xb1, 0xef, 0xb5, 0x77, 0xef, 0xd1, - 0x03, 0x6e, 0x2f, 0x95, 0x6a, 0xcf, 0xb2, 0x9d, 0x56, 0x43, 0xc0, 0xd9, 0x90, 0xea, 0x9b, 0x38, - 0x8d, 0x84, 0xbc, 0x07, 0x63, 0x75, 0x6f, 0xb7, 0x2d, 0x39, 0x14, 0x90, 0xc3, 0xa5, 0xa3, 0xc3, - 0xca, 0xb9, 0x90, 0x83, 0x7b, 0x19, 0xa8, 0x04, 0xe4, 0x15, 0x18, 0xb2, 0xfc, 0x26, 0xe5, 0xcb, - 0xb0, 0x08, 0x27, 0x0a, 0x18, 0x40, 0x75, 0xae, 0x23, 0x06, 0xb9, 0x0b, 0x23, 0xec, 0x9f, 0xfb, - 0x4e, 0x67, 0x76, 0x18, 0xf5, 0x36, 0x89, 0x0d, 0x7c, 0x84, 0x76, 0xbc, 0xf6, 0xae, 0x6a, 0xe3, - 0x37, 0xa9, 0xdd, 0x72, 0x3a, 0xda, 0xba, 0xc8, 0x11, 0xc9, 0x26, 0x8c, 0x25, 0x8a, 0x20, 0x9c, - 0x1d, 0xd1, 0x8e, 0x22, 0x93, 0x92, 0xda, 0xf3, 0x82, 0xd9, 0xf9, 0xa8, 0x19, 0xa2, 0x6c, 0x77, - 0x18, 0xbe, 0xfe, 0x31, 0x0a, 0x23, 0x6d, 0x0f, 0x52, 0xec, 0xbf, 0x07, 0x31, 0x4e, 0xdc, 0x83, - 0xb8, 0x00, 0xa2, 0x93, 0xaa, 0xcd, 0x5d, 0x11, 0xfd, 0xf7, 0x4a, 0x7f, 0x01, 0xbb, 0x9e, 0x20, - 0xe3, 0x9c, 0xe4, 0xde, 0x2e, 0xd1, 0xff, 0x4e, 0x73, 0x57, 0xf3, 0x76, 0xc5, 0xa8, 0xac, 0x1b, - 0x12, 0x55, 0x23, 0x77, 0xe0, 0xb2, 0x1b, 0x92, 0x92, 0xa4, 0x1b, 0x3e, 0x7e, 0x18, 0xf5, 0xeb, - 0x06, 0x85, 0x11, 0x59, 0x01, 0xa8, 0x36, 0x22, 0xef, 0x01, 0x45, 0x91, 0x18, 0xd3, 0x3a, 0x62, - 0xbe, 0x7a, 0x8f, 0x1e, 0xd4, 0x69, 0x94, 0x9c, 0x0a, 0x38, 0x88, 0x9a, 0x12, 0x13, 0x4b, 0xe1, - 0x40, 0x3a, 0x70, 0xb6, 0xea, 0xba, 0x1e, 0x8f, 0x08, 0x5d, 0x0f, 0x98, 0xfc, 0xba, 0xc8, 0xba, - 0x94, 0xcd, 0xfa, 0x15, 0xc1, 0xfa, 0x79, 0x27, 0xa6, 0xb2, 0x23, 0x4e, 0x96, 0xae, 0x26, 0x9b, - 0xb1, 0xb9, 0x0a, 0x13, 0x7a, 0x97, 0xea, 0xb1, 0x90, 0x25, 0x28, 0x5a, 0xf5, 0xaa, 0x5d, 0xbf, - 0x5b, 0xbd, 0x59, 0x36, 0x48, 0x19, 0x4a, 0xe2, 0xd7, 0x9c, 0x3d, 0xf7, 0xc6, 0x9b, 0xe5, 0x9c, - 0x06, 0x79, 0xe3, 0xe6, 0x5c, 0x39, 0x6f, 0xfe, 0x81, 0x01, 0x45, 0xd9, 0x3e, 0xf2, 0x26, 0xe4, - 0xeb, 0xf5, 0xbb, 0xa9, 0x13, 0xf0, 0x64, 0xe9, 0xe5, 0x8b, 0x4c, 0x18, 0xee, 0xa9, 0x8b, 0x4c, - 0xbd, 0x7e, 0x97, 0xd1, 0xad, 0x2f, 0xd7, 0x85, 0xd1, 0x92, 0x21, 0xae, 0x53, 0x7d, 0x8e, 0x05, - 0xdf, 0x84, 0xfc, 0x87, 0x5b, 0xeb, 0x62, 0x37, 0x94, 0x31, 0xbe, 0x48, 0xf7, 0xf1, 0x43, 0x75, - 0xe9, 0x63, 0x04, 0xa6, 0x05, 0x63, 0xca, 0xd4, 0xe2, 0x46, 0x44, 0xcb, 0x8f, 0xa3, 0x04, 0x85, - 0x11, 0xc1, 0x20, 0x96, 0x28, 0x61, 0x36, 0xcf, 0xb2, 0xdf, 0x70, 0x9a, 0xc2, 0x1a, 0x41, 0x9b, - 0xa7, 0xc9, 0x00, 0x16, 0x87, 0x9b, 0x7f, 0x6c, 0x40, 0x79, 0x2d, 0xf0, 0x1f, 0x78, 0x4c, 0x03, - 0xaf, 0xfb, 0xfb, 0xb4, 0xbd, 0x79, 0x93, 0xbc, 0x2e, 0x95, 0x00, 0x37, 0xe1, 0xce, 0x33, 0x2a, - 0x54, 0x02, 0x3f, 0x3a, 0xac, 0x40, 0xfd, 0x20, 0x8c, 0x68, 0x8b, 0x95, 0x4b, 0x45, 0xa0, 0x04, - 0x5b, 0xe6, 0x06, 0x0f, 0xe0, 0x3a, 0x21, 0xd8, 0xb2, 0x02, 0x43, 0xd8, 0x1c, 0x25, 0x86, 0x66, - 0x28, 0x62, 0x00, 0x8b, 0xc3, 0x15, 0x85, 0xfd, 0xed, 0x5c, 0xcf, 0x37, 0xcc, 0x7d, 0xa6, 0x82, - 0xa0, 0xf4, 0x8f, 0x1b, 0x68, 0x11, 0xfb, 0x32, 0xcc, 0xa4, 0xbb, 0x04, 0xfd, 0x22, 0x55, 0x98, - 0xd4, 0xe1, 0xd2, 0x45, 0x72, 0x3e, 0xb3, 0xae, 0xcd, 0x39, 0x2b, 0x8d, 0x6f, 0xfe, 0xc0, 0x80, - 0x51, 0xfc, 0xd7, 0xea, 0x36, 0x29, 0xb3, 0x6c, 0xaa, 0x5b, 0x75, 0x71, 0x0c, 0xa9, 0x9e, 0xea, - 0x39, 0x0f, 0x43, 0x5b, 0x9c, 0x59, 0x6a, 0x7a, 0x24, 0x46, 0x16, 0xa4, 0xfc, 0xd0, 0x55, 0x1e, - 0x6a, 0xc5, 0xa4, 0xfc, 0x74, 0x36, 0x4c, 0x91, 0x0a, 0x64, 0x36, 0x7e, 0xec, 0x97, 0xdf, 0x94, - 0xae, 0x61, 0x1c, 0x3f, 0xa4, 0xf3, 0xb5, 0xa3, 0x13, 0x89, 0x46, 0x5e, 0x87, 0x61, 0x56, 0xb5, - 0x25, 0x0f, 0x46, 0x70, 0x57, 0x81, 0x6d, 0x0c, 0xb4, 0x33, 0x60, 0x8e, 0x64, 0xfe, 0xeb, 0x5c, - 0xba, 0x03, 0x85, 0x15, 0x70, 0xca, 0xb9, 0xf1, 0x36, 0x0c, 0x55, 0x9b, 0x4d, 0xff, 0xa1, 0xd0, - 0x12, 0xd2, 0x4d, 0x13, 0xf7, 0x1f, 0x5f, 0x61, 0x1d, 0x86, 0xa2, 0x05, 0x1f, 0x30, 0x00, 0x99, - 0x87, 0xd1, 0xea, 0x56, 0x7d, 0x69, 0x69, 0x61, 0x7d, 0x7d, 0x59, 0xc4, 0xb8, 0xbf, 0x24, 0xfb, - 0xc7, 0xf3, 0x5c, 0x3b, 0x8a, 0x9a, 0x7d, 0x42, 0x60, 0x13, 0x3a, 0xf2, 0x2e, 0xc0, 0x87, 0xbe, - 0xd7, 0xbe, 0x4f, 0xa3, 0x3d, 0xdf, 0x15, 0x1f, 0xcf, 0x4c, 0x8a, 0xb1, 0x8f, 0x7d, 0xaf, 0x6d, - 0xb7, 0x10, 0xcc, 0xda, 0x9e, 0x20, 0x59, 0xca, 0xff, 0xac, 0xa7, 0x6b, 0x7e, 0x84, 0x36, 0xcc, - 0x50, 0xd2, 0xd3, 0xdb, 0x7e, 0x94, 0x3e, 0xb7, 0x91, 0x68, 0xe6, 0x2f, 0xe7, 0x60, 0x82, 0xef, - 0x54, 0xb9, 0xc0, 0x3c, 0xb5, 0x93, 0xf1, 0x6d, 0x6d, 0x32, 0x5e, 0x90, 0x0b, 0x83, 0xf2, 0x69, - 0x03, 0x4d, 0xc5, 0x3d, 0x20, 0xbd, 0x34, 0xc4, 0x92, 0xfe, 0x94, 0x41, 0x66, 0xe1, 0xcd, 0x24, - 0x62, 0x20, 0x44, 0x22, 0x1b, 0x55, 0x61, 0x68, 0x69, 0x3c, 0xcc, 0x5f, 0xca, 0xc1, 0xb8, 0x62, - 0x4f, 0x3e, 0xb5, 0x1d, 0xff, 0x45, 0xad, 0xe3, 0xe5, 0x19, 0x84, 0xf2, 0x65, 0x03, 0xf5, 0x7b, - 0x17, 0xa6, 0x7a, 0x48, 0xd2, 0x66, 0xb9, 0x31, 0x88, 0x59, 0xfe, 0x5a, 0x6f, 0xf4, 0x01, 0x8f, - 0x87, 0x8f, 0xa3, 0x0f, 0xd4, 0x70, 0x87, 0x6f, 0xe5, 0x60, 0x46, 0xfc, 0xaa, 0x76, 0x5d, 0x2f, - 0x9a, 0xf7, 0xdb, 0x3b, 0xde, 0xee, 0x53, 0x3b, 0x16, 0x55, 0x6d, 0x2c, 0x2a, 0xfa, 0x58, 0x28, - 0x1f, 0xd8, 0x7f, 0x48, 0xcc, 0x7f, 0x57, 0x84, 0xd9, 0x7e, 0x04, 0x6c, 0xdb, 0xaf, 0xec, 0xaa, - 0x70, 0xdb, 0x9f, 0xda, 0xb1, 0xf2, 0xfd, 0x54, 0x12, 0xc2, 0x93, 0x1b, 0x20, 0x84, 0x67, 0x19, - 0xca, 0x58, 0x55, 0x9d, 0x86, 0xac, 0x13, 0xc2, 0x24, 0x18, 0xf7, 0xf2, 0xd1, 0x61, 0xe5, 0x92, - 0xc3, 0xca, 0xec, 0x50, 0x14, 0xda, 0xdd, 0xc0, 0x53, 0x78, 0xf4, 0x50, 0x92, 0xdf, 0x31, 0x60, - 0x02, 0x81, 0x8b, 0x0f, 0x68, 0x3b, 0x42, 0x66, 0x05, 0x71, 0x48, 0x13, 0xdf, 0x79, 0xaa, 0x47, - 0x81, 0xd7, 0xde, 0x45, 0x47, 0x52, 0x58, 0xdb, 0x66, 0xbd, 0xf0, 0xfd, 0xc3, 0xca, 0x3b, 0x9f, - 0xe4, 0x1e, 0x95, 0x60, 0x15, 0xb2, 0x8d, 0x3c, 0x6f, 0x28, 0xc5, 0x6a, 0x53, 0xcd, 0x4c, 0xb5, - 0x88, 0xfc, 0x38, 0x9c, 0xe7, 0x71, 0x18, 0xf3, 0x7e, 0x3b, 0xf2, 0xda, 0x5d, 0xbf, 0x1b, 0xd6, - 0x9c, 0xc6, 0x7e, 0xb7, 0x13, 0x0a, 0x67, 0x27, 0x7e, 0x79, 0x23, 0x2e, 0xb4, 0xb7, 0x79, 0xa9, - 0xc2, 0xb2, 0x1f, 0x03, 0x72, 0x17, 0xa6, 0x78, 0x51, 0xb5, 0x1b, 0xf9, 0xf5, 0x86, 0xd3, 0xf4, - 0xda, 0xbb, 0xe8, 0x03, 0x2d, 0xd6, 0x2e, 0xb2, 0xbd, 0xa5, 0xd3, 0x8d, 0x7c, 0x3b, 0xe4, 0x70, - 0x85, 0x5f, 0x2f, 0x11, 0x59, 0x82, 0x49, 0x8b, 0x3a, 0xee, 0x7d, 0xe7, 0xd1, 0xbc, 0xd3, 0x71, - 0x1a, 0x5e, 0x74, 0x80, 0x3b, 0xb3, 0x7c, 0xad, 0x72, 0x74, 0x58, 0x79, 0x26, 0xa0, 0x8e, 0x6b, - 0xb7, 0x9c, 0x47, 0x76, 0x43, 0x14, 0x2a, 0xcc, 0xd2, 0x74, 0x31, 0x2b, 0xaf, 0x1d, 0xb3, 0x1a, - 0x4d, 0xb3, 0xf2, 0xda, 0xfd, 0x59, 0x25, 0x74, 0x92, 0xd5, 0xba, 0x13, 0xec, 0xd2, 0x88, 0x3b, - 0x09, 0xe1, 0xb2, 0x71, 0xd5, 0x50, 0x58, 0x45, 0x58, 0x66, 0xa3, 0xc3, 0x30, 0xcd, 0x4a, 0xa1, - 0x63, 0x92, 0xb7, 0x15, 0x78, 0x11, 0x55, 0xbf, 0x70, 0x0c, 0x9b, 0x85, 0xfd, 0x8f, 0x6e, 0xd2, - 0x7e, 0x9f, 0xd8, 0x43, 0x99, 0x70, 0x53, 0x3e, 0xb2, 0xd4, 0xc3, 0x2d, 0xfb, 0x2b, 0x7b, 0x28, - 0x63, 0x6e, 0xea, 0x77, 0x8e, 0xe3, 0x77, 0x2a, 0xdc, 0xfa, 0x7c, 0x68, 0x0f, 0x25, 0x59, 0x61, - 0x9d, 0x16, 0xd1, 0x36, 0x93, 0x68, 0xe1, 0x24, 0x9d, 0xc0, 0xa6, 0xbd, 0x28, 0xf6, 0xd4, 0xe5, - 0x40, 0x16, 0xdb, 0x19, 0x2e, 0xd3, 0x34, 0xf1, 0x87, 0x85, 0xe2, 0x50, 0x79, 0xd8, 0x2a, 0x73, - 0x91, 0x8f, 0x98, 0xe0, 0xa0, 0x2e, 0x36, 0x7f, 0x23, 0x07, 0x17, 0xa4, 0x3a, 0xa6, 0xd1, 0x43, - 0x3f, 0xd8, 0xf7, 0xda, 0xbb, 0x4f, 0xb9, 0x56, 0xbd, 0xad, 0x69, 0xd5, 0x17, 0x53, 0x2b, 0x5c, - 0xea, 0x2b, 0x8f, 0x51, 0xad, 0x7f, 0x36, 0x04, 0xcf, 0x1e, 0x4b, 0x45, 0x3e, 0x62, 0xab, 0xa0, - 0x47, 0xdb, 0xd1, 0x92, 0xdb, 0xa4, 0x6c, 0x1b, 0xe6, 0x77, 0x23, 0xe1, 0xcc, 0x7e, 0xe1, 0xe8, - 0xb0, 0x32, 0xcd, 0xaf, 0x02, 0xd9, 0x9e, 0xdb, 0xa4, 0x76, 0xc4, 0x8b, 0xb5, 0x61, 0xea, 0xa5, - 0x66, 0x2c, 0xe3, 0x8b, 0x89, 0x4b, 0xed, 0x88, 0x06, 0x0f, 0x1c, 0x7e, 0x23, 0x42, 0xb0, 0xdc, - 0xa7, 0xb4, 0x63, 0x3b, 0xac, 0xd4, 0xf6, 0x44, 0xb1, 0xce, 0xb2, 0x87, 0x9a, 0xdc, 0x56, 0x58, - 0xce, 0xb3, 0xcd, 0xc1, 0x7d, 0xe7, 0x91, 0xb0, 0x78, 0xd1, 0xbf, 0xaa, 0xb0, 0xe4, 0x51, 0x90, - 0x2d, 0xe7, 0x91, 0xd5, 0x4b, 0x42, 0xbe, 0x06, 0x67, 0x85, 0xe2, 0x66, 0x4a, 0x2c, 0xf0, 0x9b, - 0xf2, 0x8b, 0x0b, 0xc8, 0xeb, 0xe5, 0xa3, 0xc3, 0xca, 0x79, 0xa1, 0xf6, 0xed, 0x06, 0xc7, 0xc8, - 0xfc, 0xea, 0x6c, 0x2e, 0x64, 0x9d, 0x2d, 0x64, 0xa9, 0xee, 0xb8, 0x4f, 0xc3, 0xd0, 0xd9, 0x95, - 0xd6, 0x31, 0x3f, 0x51, 0x52, 0x3a, 0xd3, 0x6e, 0xf1, 0x72, 0xab, 0x2f, 0x25, 0xb9, 0x0b, 0x13, - 0x5b, 0x74, 0x5b, 0x1d, 0x9f, 0xe1, 0x78, 0x8a, 0x97, 0x1f, 0xd2, 0xed, 0xfe, 0x83, 0x93, 0xa2, - 0x23, 0x1e, 0x4c, 0xad, 0x05, 0xfe, 0xa3, 0x03, 0xb6, 0xd5, 0xa3, 0x6d, 0x1a, 0x60, 0x70, 0xd7, - 0x08, 0xba, 0xab, 0x66, 0x13, 0xcb, 0x52, 0x2f, 0xaf, 0x3d, 0x7f, 0x74, 0x58, 0x79, 0xb6, 0xc3, - 0xc0, 0x76, 0x53, 0xc0, 0xed, 0xd4, 0xbd, 0xc0, 0x5e, 0xae, 0xe4, 0x27, 0x61, 0xd2, 0xf2, 0xbb, - 0x91, 0xd7, 0xde, 0xad, 0x47, 0x81, 0x13, 0xd1, 0x5d, 0xae, 0xc8, 0x93, 0x28, 0xb2, 0x54, 0x29, - 0x77, 0x4c, 0x07, 0x1c, 0x68, 0x87, 0x02, 0xaa, 0x69, 0x52, 0x9d, 0xc0, 0xfc, 0xb5, 0x1c, 0xcc, - 0x8a, 0x61, 0xb0, 0x68, 0xc3, 0x0f, 0xdc, 0xa7, 0x7f, 0xda, 0x2f, 0x6a, 0xd3, 0xfe, 0x85, 0x38, - 0x46, 0x29, 0xeb, 0x23, 0x8f, 0x99, 0xf5, 0xbf, 0x6f, 0xc0, 0xa5, 0xe3, 0x88, 0x58, 0xef, 0xc4, - 0x71, 0x7d, 0xa3, 0x3d, 0xf1, 0x7b, 0x1d, 0x98, 0xc6, 0xf1, 0x44, 0xc7, 0x71, 0x78, 0xd7, 0x0f, - 0x23, 0xf4, 0xde, 0xe5, 0xb4, 0x40, 0x82, 0x9a, 0xef, 0x37, 0x51, 0xcf, 0xd7, 0x5e, 0x63, 0xea, - 0xfc, 0xfb, 0x87, 0x15, 0x60, 0x20, 0x1e, 0x89, 0xc7, 0xd6, 0x7c, 0x2e, 0x31, 0xe8, 0x97, 0x0e, - 0x6d, 0x8c, 0xfe, 0xd8, 0xa7, 0x07, 0xa1, 0x95, 0xc5, 0x1a, 0x3d, 0x34, 0xd5, 0x6e, 0xb4, 0xb7, - 0x16, 0xd0, 0x1d, 0x1a, 0xd0, 0x76, 0x83, 0x7e, 0xc6, 0x3c, 0x34, 0xfa, 0xc7, 0x0d, 0xb4, 0x3d, - 0xf9, 0xcb, 0x11, 0x98, 0xc9, 0x22, 0x63, 0xfd, 0xa2, 0x58, 0xc4, 0xe9, 0x4b, 0xe4, 0x7f, 0xdb, - 0x80, 0x52, 0x9d, 0x36, 0xfc, 0xb6, 0x7b, 0xdb, 0x69, 0x44, 0xbe, 0x0c, 0xc9, 0xb0, 0xb9, 0x66, - 0x63, 0x70, 0x7b, 0x07, 0x0b, 0x34, 0xcf, 0xc0, 0x07, 0x83, 0x19, 0xa2, 0x0d, 0x1f, 0x03, 0x61, - 0x23, 0x26, 0x93, 0x49, 0x15, 0x78, 0xaa, 0xa1, 0x55, 0x4a, 0x6a, 0x30, 0x3e, 0xef, 0xb7, 0xdb, - 0x94, 0xfd, 0x50, 0xc2, 0x3a, 0x31, 0x10, 0xb3, 0x21, 0x0b, 0xd2, 0x1e, 0x02, 0x9d, 0x84, 0xdc, - 0x82, 0xfc, 0xc6, 0xdc, 0x6d, 0x31, 0x06, 0x32, 0x58, 0x6d, 0x63, 0xee, 0x36, 0xee, 0x75, 0x99, - 0xfd, 0x30, 0xde, 0x9d, 0xdb, 0x51, 0x7d, 0xa0, 0x1b, 0x73, 0xb7, 0xc9, 0x2a, 0x4c, 0x59, 0xf4, - 0xeb, 0x5d, 0x2f, 0xa0, 0x62, 0x02, 0xdc, 0xbf, 0x5d, 0xc5, 0xb1, 0x28, 0x72, 0x3d, 0x16, 0xf0, - 0x42, 0x69, 0xdb, 0xdb, 0xad, 0x1d, 0xf5, 0xe2, 0x64, 0x2f, 0x2d, 0xf9, 0x59, 0x38, 0xbb, 0xe0, - 0x85, 0xa2, 0xcd, 0xdc, 0xf9, 0xe8, 0xe2, 0x39, 0xe4, 0x70, 0x9f, 0xe9, 0xf0, 0x85, 0xcc, 0xe9, - 0xf0, 0xbc, 0x1b, 0x33, 0xb1, 0xb9, 0x67, 0xd3, 0x4d, 0xc7, 0xc3, 0x66, 0xd7, 0x43, 0x3e, 0x86, - 0x09, 0xf4, 0xf6, 0xa0, 0x3f, 0x16, 0xe3, 0xcd, 0x47, 0xfa, 0xd4, 0xfc, 0xb9, 0xcc, 0x9a, 0x2f, - 0xa2, 0xf3, 0xc8, 0x46, 0xaf, 0x2e, 0xc6, 0xa6, 0x6b, 0x7b, 0x04, 0x8d, 0x33, 0xf9, 0x10, 0x26, - 0xc5, 0xa2, 0xb3, 0xba, 0xb3, 0xbe, 0x47, 0x17, 0x9c, 0x03, 0x11, 0x84, 0x80, 0xf6, 0x9f, 0x58, - 0xa9, 0x6c, 0x7f, 0xc7, 0x8e, 0xf6, 0xa8, 0xed, 0x3a, 0x9a, 0x7a, 0x4e, 0x11, 0x92, 0x9f, 0x86, - 0xb1, 0x65, 0x1f, 0x0f, 0x9e, 0x50, 0xd5, 0x8c, 0x22, 0x9f, 0x2f, 0xe3, 0xc5, 0x69, 0x0e, 0x4e, - 0x2d, 0x22, 0x3f, 0x3a, 0xac, 0xbc, 0x7d, 0x5a, 0x29, 0x54, 0x2a, 0xb0, 0xd4, 0xda, 0xc8, 0x3c, - 0x14, 0xb7, 0xe8, 0x36, 0xfb, 0xda, 0xf4, 0xa5, 0x3f, 0x09, 0xe6, 0xfa, 0xe2, 0xa1, 0xf8, 0xa5, - 0x9e, 0xea, 0x48, 0x0c, 0x12, 0xc0, 0x14, 0xf6, 0xcf, 0x9a, 0x13, 0x86, 0x0f, 0xfd, 0xc0, 0x6d, - 0xd2, 0x50, 0x1e, 0x8f, 0xf4, 0x76, 0xfe, 0x5c, 0x66, 0xe7, 0x5f, 0xe2, 0x9d, 0xdf, 0x51, 0x38, - 0xa8, 0xe2, 0xd6, 0xc3, 0xde, 0xfc, 0x37, 0x06, 0x4a, 0x3d, 0xb9, 0x86, 0xc1, 0x67, 0x71, 0x54, - 0x3b, 0xee, 0x66, 0x9d, 0x4e, 0xea, 0x2e, 0x00, 0x47, 0x61, 0x5b, 0xdf, 0xdb, 0x4e, 0x83, 0x46, - 0xd2, 0x47, 0x8a, 0xc8, 0x3b, 0x08, 0x51, 0xb7, 0xbe, 0x1c, 0x87, 0x7c, 0x09, 0x66, 0x16, 0xe8, - 0x03, 0xaf, 0x41, 0xab, 0x51, 0x44, 0x43, 0xde, 0xc3, 0xf3, 0x55, 0x7e, 0x98, 0x38, 0x5a, 0x7b, - 0xf1, 0xe8, 0xb0, 0x72, 0xd9, 0xc5, 0x72, 0xdb, 0x49, 0x10, 0xec, 0x86, 0xa3, 0xf2, 0xca, 0xe4, - 0x60, 0xfe, 0x6f, 0x23, 0xe9, 0x75, 0xf2, 0x32, 0x14, 0xac, 0xb5, 0xb8, 0xfd, 0xfc, 0x9c, 0x30, - 0xd5, 0x7c, 0x44, 0x20, 0x5f, 0x81, 0xb3, 0x0a, 0x1f, 0xec, 0x11, 0xea, 0xb2, 0x06, 0xf1, 0x8f, - 0x79, 0x09, 0x0f, 0x86, 0x94, 0x96, 0x38, 0x1c, 0x23, 0xd5, 0xa2, 0x6c, 0x1e, 0xec, 0x63, 0x95, - 0x82, 0x05, 0xda, 0xf6, 0x38, 0x6f, 0xe5, 0x63, 0x55, 0xde, 0x2e, 0x22, 0xa4, 0x3f, 0x36, 0x8b, - 0xc3, 0x87, 0x85, 0x62, 0xa1, 0x3c, 0x64, 0xfe, 0x95, 0xa1, 0x64, 0xbd, 0x78, 0x4a, 0x57, 0xac, - 0x37, 0xb5, 0x15, 0x6b, 0x46, 0x90, 0xc6, 0x5f, 0xc5, 0xca, 0x32, 0xad, 0x8c, 0x49, 0x18, 0xd7, - 0x90, 0x30, 0xcc, 0x76, 0x23, 0xa4, 0x01, 0xf7, 0x49, 0x7e, 0xb6, 0xc2, 0x6c, 0xe3, 0xef, 0x1a, - 0x28, 0x7a, 0xf2, 0xcf, 0x0d, 0x98, 0x4c, 0x51, 0xb0, 0xde, 0x60, 0x20, 0xb5, 0x37, 0xba, 0x21, - 0x0d, 0x2c, 0x84, 0xf2, 0xa0, 0xbc, 0x65, 0x3d, 0x28, 0xaf, 0x69, 0x31, 0x18, 0xf9, 0x00, 0x86, - 0x36, 0x70, 0x07, 0xa1, 0xc7, 0x75, 0xc4, 0xfc, 0xb1, 0x90, 0xcf, 0xb0, 0x2e, 0xfb, 0x57, 0x55, - 0x10, 0x58, 0x46, 0xea, 0x30, 0x32, 0x1f, 0x50, 0xcc, 0x6f, 0x51, 0x18, 0xfc, 0x00, 0xae, 0xc1, - 0x49, 0xd2, 0x07, 0x70, 0x82, 0x93, 0xf9, 0xab, 0x39, 0x20, 0xc9, 0x37, 0xd2, 0x46, 0x40, 0xa3, - 0xf0, 0xa9, 0x1d, 0xf4, 0xf7, 0xb5, 0x41, 0x7f, 0xb6, 0x67, 0xd0, 0xf9, 0xe7, 0x0d, 0x34, 0xf6, - 0x7f, 0x6c, 0xc0, 0xb9, 0x6c, 0x42, 0xf2, 0x02, 0x0c, 0xaf, 0xae, 0xaf, 0xc9, 0xd0, 0x20, 0xf1, - 0x29, 0x7e, 0x07, 0x2d, 0x63, 0x4b, 0x14, 0x91, 0xd7, 0x61, 0xf8, 0x23, 0x6b, 0x9e, 0x2d, 0x99, - 0xca, 0xed, 0x99, 0xaf, 0x07, 0x76, 0x43, 0xdf, 0x72, 0x09, 0x24, 0x75, 0x6c, 0xf3, 0x4f, 0x6c, - 0x6c, 0xbf, 0x95, 0x83, 0xc9, 0x6a, 0xa3, 0x41, 0xc3, 0x90, 0x19, 0x44, 0x34, 0x8c, 0x9e, 0xda, - 0x81, 0xcd, 0x0e, 0xfa, 0xd1, 0xbe, 0x6d, 0xa0, 0x51, 0xfd, 0x13, 0x03, 0xce, 0x4a, 0xaa, 0x07, - 0x1e, 0x7d, 0xb8, 0xbe, 0x17, 0xd0, 0x70, 0xcf, 0x6f, 0xba, 0x83, 0xde, 0x03, 0xc3, 0x55, 0xda, - 0x6b, 0x46, 0x34, 0x50, 0x1d, 0xd4, 0x3b, 0x08, 0xd1, 0x56, 0x69, 0x84, 0x90, 0x1b, 0x30, 0x52, - 0xed, 0x74, 0x02, 0xff, 0x01, 0x9f, 0xf6, 0xe3, 0xe2, 0x3c, 0x92, 0x83, 0xb4, 0xf3, 0x4b, 0x0e, - 0x62, 0xcd, 0x58, 0xa0, 0x6d, 0x1e, 0xd1, 0x3c, 0xce, 0x9b, 0xe1, 0xd2, 0xb6, 0x6a, 0xa1, 0x61, - 0xb9, 0xf9, 0xcd, 0x02, 0x94, 0xd4, 0x0f, 0x21, 0x26, 0x0c, 0xf3, 0xf0, 0x14, 0x35, 0x4c, 0xc0, - 0x41, 0x88, 0x25, 0x4a, 0x92, 0xa8, 0x9f, 0xdc, 0x89, 0x51, 0x3f, 0x5b, 0x30, 0xbe, 0x16, 0xf8, - 0x1d, 0x3f, 0xa4, 0x2e, 0x4f, 0x51, 0xc4, 0xb5, 0xd6, 0x74, 0x1c, 0x0a, 0xcb, 0xfb, 0x9c, 0x15, - 0xf1, 0xed, 0x40, 0x47, 0x60, 0xdb, 0xe9, 0x04, 0x46, 0x3a, 0x1f, 0xee, 0xe0, 0x77, 0x42, 0x71, - 0x5d, 0x20, 0x76, 0xf0, 0x33, 0x88, 0xee, 0xe0, 0x67, 0x10, 0x75, 0x5a, 0x0c, 0x3d, 0xa9, 0x69, - 0x41, 0x7e, 0xd5, 0x80, 0xb1, 0x6a, 0xbb, 0x2d, 0xa2, 0x7e, 0xe4, 0x3d, 0xff, 0xb3, 0x89, 0x93, - 0x9f, 0x87, 0x85, 0x72, 0x1f, 0xff, 0x57, 0x85, 0x8f, 0xff, 0xed, 0x4f, 0xe4, 0xe3, 0x5f, 0x0f, - 0x1c, 0x2f, 0x0a, 0xf1, 0x30, 0x37, 0xa9, 0x50, 0x0d, 0xfd, 0x55, 0xda, 0x41, 0xde, 0x86, 0x72, - 0x2c, 0x8f, 0x4b, 0x6d, 0x97, 0x3e, 0xa2, 0x3c, 0x48, 0x6a, 0x9c, 0xdf, 0x30, 0xd4, 0x0e, 0x2f, - 0xd2, 0x88, 0xe6, 0xb7, 0x0c, 0x38, 0xa7, 0x0a, 0x44, 0xbd, 0xbb, 0xdd, 0xf2, 0x70, 0xfb, 0x43, - 0xae, 0xc3, 0xa8, 0x18, 0xaf, 0xd8, 0x90, 0xeb, 0xcd, 0x6b, 0x95, 0xa0, 0x90, 0x45, 0x36, 0x44, - 0x8c, 0x87, 0xf0, 0x15, 0x4c, 0xa7, 0xa6, 0x1b, 0x2b, 0xaa, 0xcd, 0x8a, 0xce, 0x2e, 0x07, 0xf8, - 0x5b, 0x1f, 0x3b, 0x06, 0x31, 0xdf, 0x83, 0x29, 0xbd, 0x95, 0x75, 0x8a, 0x57, 0xd0, 0xe4, 0xa7, - 0x19, 0xd9, 0x9f, 0x26, 0xcb, 0xcd, 0x2d, 0x20, 0x3d, 0xf4, 0x21, 0x1e, 0x54, 0xd1, 0x48, 0x1e, - 0xa4, 0x4a, 0x77, 0x57, 0x0f, 0x62, 0x9c, 0xe1, 0x6d, 0x4c, 0xed, 0x6e, 0x24, 0x35, 0xff, 0x02, - 0x60, 0x3a, 0x43, 0x75, 0x9c, 0xb0, 0xb4, 0x57, 0xf4, 0xc9, 0x33, 0x1a, 0x47, 0x04, 0xc8, 0x29, - 0xf3, 0x9e, 0xcc, 0xe6, 0x75, 0xcc, 0x54, 0x39, 0x2e, 0xc5, 0xd7, 0xa7, 0xb1, 0xbc, 0xab, 0x41, - 0x3b, 0x43, 0x4f, 0x2c, 0x68, 0xa7, 0x06, 0xe3, 0xe2, 0xab, 0xc4, 0x54, 0x1e, 0x4e, 0xdc, 0x02, - 0x01, 0x2f, 0xb0, 0x7b, 0xa6, 0xb4, 0x4e, 0xc2, 0x79, 0x84, 0x7e, 0xf3, 0x01, 0x15, 0x3c, 0x46, - 0x54, 0x1e, 0x58, 0x90, 0xc9, 0x43, 0x21, 0x21, 0xff, 0xdc, 0x00, 0x22, 0x20, 0xea, 0x7c, 0x2e, - 0x1e, 0x37, 0x9f, 0xdd, 0x27, 0x33, 0x9f, 0x9f, 0x95, 0x6d, 0xcc, 0x9e, 0xd7, 0x19, 0xcd, 0x22, - 0xff, 0xd4, 0x80, 0x29, 0x1e, 0x39, 0xa2, 0x36, 0x76, 0xf4, 0xb8, 0xc6, 0x36, 0x9e, 0x4c, 0x63, - 0x2f, 0x85, 0x58, 0x6d, 0x9f, 0xb6, 0xf6, 0x36, 0x8a, 0xfc, 0x38, 0x40, 0x3c, 0xa3, 0x64, 0x84, - 0xe2, 0xa5, 0x0c, 0x2d, 0x10, 0x23, 0x25, 0x97, 0x2c, 0xa3, 0x98, 0x4e, 0x8d, 0xe9, 0x49, 0xb8, - 0x91, 0x9f, 0x85, 0x19, 0x36, 0x5f, 0x62, 0x88, 0x88, 0x73, 0x9b, 0x1d, 0xc3, 0x5a, 0x3e, 0xdf, - 0x7f, 0x69, 0xbf, 0x9e, 0x45, 0xc6, 0xef, 0x89, 0x24, 0x89, 0x16, 0xa2, 0x96, 0xba, 0xe5, 0xcb, - 0xa2, 0xc0, 0x80, 0x56, 0x6c, 0x7d, 0x38, 0x5b, 0xc2, 0x3a, 0x33, 0xf5, 0xdb, 0x05, 0x39, 0x17, - 0xb8, 0x7e, 0x0b, 0xf5, 0x8b, 0x1e, 0x08, 0x22, 0x1f, 0x01, 0xa9, 0x77, 0x77, 0x77, 0x69, 0x18, - 0x51, 0x97, 0xc3, 0x68, 0x10, 0xce, 0x8e, 0xa3, 0x7e, 0x40, 0x37, 0x55, 0x28, 0x4b, 0xed, 0x40, - 0x16, 0xab, 0x42, 0xd2, 0x4b, 0x4c, 0x28, 0xcc, 0x88, 0x8f, 0x66, 0x50, 0x99, 0xa6, 0x20, 0x9c, - 0x9d, 0xd0, 0xa2, 0x08, 0x93, 0x92, 0xda, 0x73, 0x32, 0x8f, 0x9d, 0x92, 0xeb, 0x40, 0xdb, 0xf6, - 0x66, 0xb1, 0xbb, 0xb8, 0x0d, 0x17, 0xfa, 0xf6, 0x66, 0xc6, 0x5d, 0x91, 0x1b, 0xfa, 0x5d, 0x91, - 0x0b, 0xfd, 0xb4, 0x6e, 0xa8, 0xde, 0x17, 0xf9, 0x2d, 0x23, 0xa5, 0x66, 0x85, 0x4d, 0xc4, 0xf3, - 0x2b, 0xf6, 0x5b, 0x87, 0x72, 0x98, 0x94, 0x81, 0x2b, 0xe2, 0x5c, 0x62, 0x8b, 0x31, 0x45, 0xac, - 0x2a, 0x72, 0x54, 0xc9, 0x8f, 0xa9, 0x71, 0xcd, 0x7f, 0x69, 0x00, 0xe1, 0x2d, 0x9c, 0x77, 0x3a, - 0xce, 0xb6, 0xd7, 0xf4, 0x22, 0x8f, 0x86, 0xe4, 0x1e, 0x94, 0x05, 0x0b, 0x67, 0xbb, 0x49, 0xd5, - 0x30, 0x30, 0x71, 0x4e, 0x1c, 0x97, 0xd9, 0x69, 0xeb, 0xa9, 0x87, 0xb0, 0x8f, 0x8c, 0xe4, 0x1e, - 0x43, 0x46, 0xcc, 0x1f, 0x1a, 0x70, 0xa1, 0xb7, 0xd9, 0xa2, 0xe6, 0xb8, 0xf3, 0x8c, 0x13, 0x3a, - 0x2f, 0xeb, 0x2b, 0x73, 0xe8, 0x61, 0x7d, 0x62, 0x5f, 0x99, 0x4f, 0x1c, 0xb6, 0xa7, 0xff, 0xca, - 0x87, 0x6a, 0x52, 0x0f, 0xf2, 0x7a, 0x56, 0x40, 0x0f, 0xbf, 0x75, 0xc3, 0xc1, 0x7a, 0x2c, 0x8f, - 0xdc, 0xe5, 0xe4, 0x32, 0x77, 0x39, 0xf2, 0x02, 0x51, 0x3e, 0xeb, 0x02, 0x91, 0xf9, 0x8b, 0x39, - 0x28, 0xad, 0x35, 0xbb, 0xbb, 0x5e, 0x7b, 0xc1, 0x89, 0x9c, 0xa7, 0x76, 0xcb, 0xf4, 0x96, 0xb6, - 0x65, 0x8a, 0x23, 0xce, 0xe2, 0x0f, 0x1b, 0x2c, 0xc9, 0x9e, 0x01, 0x93, 0x09, 0x09, 0x57, 0x0f, - 0x77, 0xa1, 0xc0, 0x7e, 0x08, 0x0b, 0xec, 0x72, 0x0f, 0x63, 0xc4, 0xba, 0x1e, 0xff, 0x27, 0x36, - 0x31, 0x7a, 0x6a, 0x43, 0xe4, 0x70, 0xf1, 0x0b, 0x3c, 0x33, 0xd9, 0xe9, 0xb3, 0xa8, 0xfe, 0xa1, - 0x01, 0xe5, 0xf4, 0x97, 0x90, 0x7b, 0x30, 0xc2, 0x38, 0x79, 0x71, 0x96, 0xb3, 0x17, 0xfb, 0x7c, - 0xf3, 0x75, 0x81, 0xc6, 0x9b, 0x87, 0x9d, 0x4f, 0x39, 0xc4, 0x92, 0x1c, 0x2e, 0x5a, 0x50, 0x52, - 0xb1, 0x32, 0x5a, 0xf7, 0x9a, 0xae, 0x13, 0xcf, 0x65, 0xf7, 0x83, 0xda, 0xea, 0xdf, 0xd4, 0x5a, - 0x2d, 0xb4, 0xe1, 0xa0, 0xe9, 0x2a, 0xf1, 0xca, 0x1d, 0x9f, 0x0e, 0xaa, 0x9c, 0x49, 0xad, 0xaf, - 0x5f, 0xb9, 0xe3, 0x30, 0xb6, 0xd7, 0xe2, 0xf5, 0x09, 0x39, 0xc3, 0xbd, 0x56, 0x07, 0x21, 0xaa, - 0xbd, 0xce, 0x71, 0xcc, 0x7f, 0x90, 0x87, 0x73, 0x49, 0xf3, 0x78, 0xf2, 0xce, 0x35, 0x27, 0x70, - 0x5a, 0xe1, 0x09, 0x33, 0xe0, 0x6a, 0x4f, 0xd3, 0xf0, 0x4a, 0xb9, 0x6c, 0x9a, 0xd2, 0x20, 0x33, - 0xd5, 0x20, 0xdc, 0xa4, 0xf2, 0x06, 0xc9, 0x66, 0x90, 0x7b, 0x90, 0xaf, 0xd3, 0x48, 0x5c, 0x3c, - 0xbd, 0xd2, 0xd3, 0xab, 0x6a, 0xbb, 0xae, 0xd7, 0x69, 0xc4, 0x07, 0x91, 0xc7, 0xee, 0x53, 0x2d, - 0x96, 0x9e, 0x6d, 0x37, 0xb6, 0x60, 0x78, 0xf1, 0x51, 0x87, 0x36, 0x22, 0x71, 0xdf, 0xf4, 0x95, - 0xe3, 0xf9, 0x71, 0x5c, 0xe5, 0x56, 0x2b, 0x45, 0x80, 0xda, 0x59, 0x1c, 0xe5, 0xe2, 0x9b, 0x50, - 0x94, 0x95, 0x9f, 0xea, 0x76, 0xe6, 0x5b, 0x30, 0xa6, 0x54, 0x72, 0x2a, 0xa1, 0xff, 0x6b, 0x03, - 0x86, 0x99, 0xb6, 0xdd, 0x7c, 0xe3, 0x29, 0xd5, 0x48, 0xb7, 0x34, 0x8d, 0x34, 0xa5, 0x5c, 0x23, - 0xc2, 0x79, 0xf9, 0xc6, 0x09, 0xba, 0xe8, 0xd0, 0x00, 0x48, 0x90, 0xc9, 0x1d, 0x18, 0x11, 0xf9, - 0x62, 0x44, 0x66, 0x5c, 0xf5, 0x5e, 0x92, 0xcc, 0x1c, 0x16, 0x5b, 0x71, 0x7e, 0x27, 0x6d, 0xf6, - 0x4a, 0x6a, 0xb2, 0x90, 0xc4, 0x6e, 0xab, 0x17, 0x61, 0x19, 0x9b, 0x79, 0xbf, 0xcd, 0xef, 0xa9, - 0x28, 0x39, 0xc8, 0xfa, 0x04, 0x71, 0x57, 0x85, 0xe3, 0x26, 0x7f, 0x1c, 0x93, 0x73, 0x82, 0x49, - 0xb6, 0x4f, 0xe7, 0x2f, 0x4b, 0xfc, 0xe6, 0x87, 0x6c, 0xd8, 0xbb, 0x50, 0xba, 0xed, 0x07, 0x0f, - 0x9d, 0xc0, 0xad, 0xee, 0x52, 0x11, 0x75, 0x5f, 0xc4, 0xd0, 0xf9, 0xf1, 0x1d, 0x0e, 0xb7, 0x1d, - 0x56, 0xf0, 0xa3, 0xc3, 0x4a, 0xa1, 0xe6, 0xfb, 0x4d, 0x4b, 0x43, 0x27, 0xab, 0x30, 0x7e, 0xdf, - 0x79, 0x24, 0xce, 0x40, 0xd7, 0xd7, 0x97, 0x45, 0xec, 0xce, 0x2b, 0x47, 0x87, 0x95, 0x0b, 0x2d, - 0xe7, 0x51, 0x7c, 0x76, 0xda, 0x3f, 0xbc, 0x5c, 0xa7, 0x27, 0x1e, 0x4c, 0xac, 0xf9, 0x41, 0x24, - 0x2a, 0x61, 0x36, 0x7b, 0xbe, 0xcf, 0x29, 0xda, 0x8d, 0xcc, 0x53, 0xb4, 0x0b, 0x6c, 0xa3, 0x62, - 0xef, 0xc4, 0xe4, 0xda, 0x75, 0x45, 0x8d, 0x31, 0x79, 0x17, 0xa6, 0xe6, 0x69, 0x10, 0x79, 0x3b, - 0x5e, 0xc3, 0x89, 0xe8, 0x6d, 0x3f, 0x68, 0x39, 0x91, 0x70, 0x18, 0xa1, 0xc3, 0xa0, 0x41, 0x39, - 0xa7, 0x96, 0x13, 0x59, 0xbd, 0x98, 0xe4, 0x2b, 0x59, 0xd1, 0x50, 0x43, 0xf8, 0xf9, 0xaf, 0x33, - 0x6b, 0x24, 0x23, 0x1a, 0xaa, 0x4f, 0x17, 0x64, 0xc4, 0x45, 0xed, 0x1e, 0x77, 0x94, 0x5c, 0xac, - 0xdd, 0x14, 0xc7, 0xda, 0x27, 0x1f, 0x15, 0xc7, 0xe3, 0xd6, 0xe7, 0xc8, 0x78, 0x0e, 0xf2, 0xb5, - 0xb5, 0xdb, 0xe8, 0x02, 0x12, 0x47, 0xb7, 0xb4, 0xbd, 0xe7, 0xb4, 0x1b, 0x68, 0x44, 0x89, 0x78, - 0x10, 0x55, 0xe1, 0xd5, 0xd6, 0x6e, 0x13, 0x07, 0xa6, 0xd7, 0x68, 0xd0, 0xf2, 0xa2, 0x2f, 0xdd, - 0xbc, 0xa9, 0x0c, 0x54, 0x11, 0x9b, 0x76, 0x43, 0x34, 0xad, 0xd2, 0x41, 0x14, 0xfb, 0xd1, 0xcd, - 0x9b, 0x99, 0xc3, 0x11, 0x37, 0x2c, 0x8b, 0x17, 0x59, 0x84, 0x89, 0xfb, 0xce, 0x23, 0x71, 0xc8, - 0x1f, 0xef, 0x61, 0xf3, 0x78, 0xdb, 0x00, 0x05, 0xab, 0x91, 0x14, 0xa9, 0x43, 0xac, 0x13, 0x91, - 0x77, 0x60, 0x2c, 0x11, 0xaf, 0x10, 0x8f, 0x77, 0xf3, 0x3c, 0xcc, 0x54, 0x11, 0x4e, 0xcd, 0x57, - 0xa6, 0xa0, 0x93, 0x8d, 0xd8, 0x05, 0xc1, 0x2d, 0x61, 0x3c, 0xd0, 0x1d, 0xad, 0xdd, 0x50, 0x5d, - 0x10, 0x0e, 0x96, 0x68, 0x9f, 0x35, 0x19, 0xef, 0x0d, 0x78, 0xf4, 0x91, 0xa5, 0x73, 0x51, 0x3c, - 0x1b, 0x6b, 0x81, 0xdf, 0xea, 0x44, 0x18, 0x85, 0x99, 0xf2, 0x6c, 0x74, 0xb0, 0x24, 0xc3, 0xb3, - 0xc1, 0x49, 0xb2, 0x63, 0x17, 0xc6, 0x1f, 0x23, 0x76, 0x81, 0x42, 0x61, 0xd9, 0x6f, 0xec, 0x63, - 0xd8, 0xe5, 0x68, 0xed, 0x23, 0xa6, 0x3f, 0x9a, 0x7e, 0x63, 0xff, 0xc9, 0x9d, 0xb9, 0x23, 0x7b, - 0xb2, 0xc2, 0xbe, 0x9d, 0x89, 0x95, 0xa8, 0x7a, 0x76, 0x52, 0x3b, 0x49, 0xd4, 0xca, 0xb8, 0xa1, - 0xc2, 0xa5, 0x50, 0x7e, 0x88, 0xa5, 0x93, 0x13, 0x0a, 0xe5, 0x05, 0x1a, 0xee, 0x47, 0x7e, 0x67, - 0xbe, 0xe9, 0x75, 0xb6, 0x7d, 0x27, 0x70, 0x67, 0xcb, 0x7d, 0x14, 0xc6, 0xcb, 0x99, 0x0a, 0x63, - 0xca, 0xe5, 0xf4, 0x76, 0x43, 0x32, 0xb0, 0x7a, 0x58, 0x92, 0xaf, 0xc0, 0x04, 0x9b, 0x2d, 0x8b, - 0x8f, 0x22, 0xda, 0xe6, 0xa2, 0x34, 0x85, 0x4b, 0xfd, 0x8c, 0x72, 0x71, 0x33, 0x2e, 0xe4, 0x42, - 0x8a, 0xda, 0x83, 0xc6, 0x04, 0xaa, 0x90, 0xea, 0xac, 0x88, 0x0b, 0xb3, 0xf7, 0x9d, 0x47, 0x4a, - 0x9a, 0x23, 0x45, 0xea, 0x09, 0x4a, 0x2c, 0x26, 0xd4, 0x63, 0x12, 0xbb, 0x1f, 0x23, 0xf5, 0x99, - 0x00, 0x7d, 0x39, 0x91, 0x9f, 0x86, 0xf3, 0xe2, 0xb3, 0x16, 0x30, 0x57, 0x82, 0x1f, 0x1c, 0xd4, - 0xf7, 0x9c, 0x80, 0x4d, 0xdc, 0xe9, 0xd3, 0x69, 0x58, 0xd9, 0x61, 0xae, 0xe4, 0x63, 0x87, 0x9c, - 0x91, 0xd5, 0xaf, 0x06, 0xf3, 0xc7, 0x53, 0xc3, 0x4e, 0x96, 0x60, 0x44, 0xe0, 0x8a, 0x85, 0xb5, - 0xb7, 0xf6, 0x67, 0x33, 0x6b, 0x1f, 0x11, 0xb5, 0x5b, 0x92, 0xde, 0xfc, 0x23, 0x03, 0xc6, 0xb5, - 0x1e, 0x25, 0x6f, 0x2a, 0x51, 0x4f, 0x49, 0xb4, 0xa2, 0x86, 0x93, 0xf9, 0xa8, 0xc6, 0x9b, 0x22, - 0xd4, 0x2d, 0xd7, 0x9f, 0x2e, 0x33, 0x89, 0xdd, 0xb1, 0x5b, 0xbd, 0x24, 0x57, 0x44, 0xa1, 0x4f, - 0xae, 0x88, 0x5f, 0x19, 0x87, 0x09, 0x7d, 0x0d, 0x67, 0x46, 0xf5, 0xb2, 0xbf, 0xeb, 0xb5, 0xa5, - 0x4f, 0x80, 0x67, 0x3f, 0x41, 0x88, 0xf6, 0x42, 0x05, 0x42, 0xc8, 0x4b, 0x00, 0xf1, 0xe9, 0xba, - 0xdc, 0xf6, 0x8b, 0xf7, 0x34, 0x94, 0x02, 0xf2, 0x13, 0x00, 0x2b, 0xbe, 0x4b, 0xe3, 0x04, 0x3a, - 0xc7, 0xf8, 0x04, 0x5f, 0x16, 0x3e, 0x41, 0xf1, 0x06, 0xc6, 0xd1, 0x61, 0xe5, 0x6c, 0xdb, 0x77, - 0x69, 0x6f, 0xe6, 0x1c, 0x85, 0x23, 0xf9, 0x22, 0x0c, 0x59, 0xdd, 0x26, 0x95, 0xf9, 0x5c, 0xc6, - 0xe4, 0x9c, 0xee, 0x36, 0x95, 0xdc, 0xb8, 0x41, 0x37, 0x7d, 0x14, 0xc4, 0x00, 0xe4, 0x7d, 0x00, - 0x26, 0xb6, 0x98, 0x64, 0x52, 0x5e, 0x18, 0x47, 0x17, 0x81, 0x22, 0xf1, 0x98, 0x9a, 0x52, 0xab, - 0x3c, 0x21, 0x21, 0xab, 0x30, 0x22, 0x34, 0xa4, 0x38, 0x6a, 0x79, 0x2e, 0xcb, 0xc9, 0xa7, 0x98, - 0x49, 0x22, 0xc1, 0x0a, 0x82, 0x75, 0xbf, 0x1b, 0x77, 0x71, 0xbc, 0x03, 0xa3, 0x8c, 0xfd, 0x46, - 0x48, 0xc5, 0x35, 0xf2, 0x51, 0x1e, 0x76, 0xaa, 0x34, 0xa8, 0x1b, 0xea, 0x1e, 0x86, 0x84, 0x80, - 0x7c, 0x05, 0x53, 0x22, 0x89, 0xae, 0x3e, 0xd6, 0x57, 0x7c, 0xa5, 0xa7, 0xab, 0x67, 0x9c, 0x4e, - 0x27, 0x23, 0x87, 0x5c, 0xcc, 0x8f, 0xec, 0xc6, 0x57, 0xb3, 0xe2, 0x04, 0xe9, 0xc7, 0x54, 0x70, - 0xad, 0xa7, 0x82, 0x59, 0x79, 0xdb, 0xa8, 0x37, 0x11, 0x92, 0xc6, 0x97, 0x74, 0xa0, 0x9c, 0x28, - 0x13, 0x51, 0x17, 0x1c, 0x57, 0xd7, 0xeb, 0x3d, 0x75, 0xa9, 0x03, 0xd8, 0x53, 0x5d, 0x0f, 0x77, - 0xe2, 0x26, 0xc9, 0xac, 0x45, 0x7d, 0x63, 0xc7, 0xd5, 0xf7, 0x52, 0x4f, 0x7d, 0xd3, 0xee, 0x76, - 0x6f, 0x3d, 0x29, 0x9e, 0xe4, 0x1d, 0x18, 0x97, 0x10, 0x9c, 0x1f, 0xe8, 0xa3, 0x15, 0x5b, 0x18, - 0x77, 0x1b, 0x63, 0x0d, 0xf5, 0x2c, 0x40, 0x2a, 0xb2, 0x4a, 0xcd, 0xa5, 0x63, 0x5c, 0xa3, 0x4e, - 0x4b, 0x85, 0x8e, 0x4c, 0xbe, 0x0c, 0x63, 0x4b, 0x2d, 0xf6, 0x21, 0x7e, 0xdb, 0x89, 0x28, 0xae, - 0xb7, 0x89, 0xdf, 0x5b, 0x29, 0x51, 0x44, 0x95, 0xa7, 0x1b, 0x4d, 0x8a, 0x54, 0x7b, 0x45, 0xa1, - 0x60, 0x9d, 0xc7, 0x5d, 0x5b, 0x42, 0x86, 0x43, 0xb1, 0xba, 0x3e, 0x9b, 0xe1, 0x7b, 0x56, 0xd8, - 0xe3, 0x72, 0xc5, 0x3d, 0x66, 0xb6, 0x98, 0x10, 0x5a, 0xe7, 0xe9, 0x3c, 0xc9, 0xbb, 0x30, 0x26, - 0x2e, 0xc2, 0x56, 0xad, 0x95, 0x70, 0xb6, 0x8c, 0x1f, 0x8f, 0x29, 0xfc, 0xe4, 0x9d, 0x59, 0xdb, - 0x09, 0x52, 0x07, 0x90, 0x09, 0x3e, 0xf9, 0x12, 0xcc, 0x6c, 0x79, 0x6d, 0xd7, 0x7f, 0x18, 0x0a, - 0x05, 0x2e, 0x14, 0xdd, 0x54, 0x12, 0x66, 0xf5, 0x90, 0x97, 0xdb, 0x72, 0xa1, 0xe9, 0x51, 0x7c, - 0x99, 0x1c, 0xc8, 0xcf, 0xf4, 0x70, 0xe6, 0x12, 0x44, 0x8e, 0x93, 0xa0, 0xb9, 0x1e, 0x09, 0xea, - 0xad, 0x3e, 0x2d, 0x4e, 0x99, 0xd5, 0x10, 0x1f, 0x88, 0x6e, 0x56, 0x7d, 0xe8, 0x7b, 0xed, 0xd9, - 0x69, 0xed, 0xf9, 0xa1, 0x38, 0xd2, 0x1a, 0xf1, 0xd6, 0xfc, 0xa6, 0xd7, 0x38, 0x90, 0xa9, 0x7c, - 0x75, 0x83, 0xed, 0x63, 0x5f, 0xf3, 0x9f, 0x64, 0xb0, 0x26, 0x5f, 0x86, 0x12, 0xfb, 0x1b, 0x5b, - 0xb7, 0x33, 0xda, 0x69, 0xa5, 0x82, 0x29, 0xea, 0xc1, 0x31, 0xc2, 0x9b, 0xba, 0x19, 0x86, 0xaf, - 0xc6, 0xca, 0xfc, 0xa1, 0x01, 0x33, 0x59, 0x6d, 0x3d, 0x21, 0x2d, 0x92, 0x99, 0x8a, 0x5b, 0x40, - 0xd7, 0x0b, 0x8f, 0x5b, 0x88, 0xa3, 0x15, 0x2a, 0x30, 0x74, 0xcf, 0x6b, 0xbb, 0x32, 0xae, 0x0e, - 0x97, 0xc3, 0x7d, 0x06, 0xb0, 0x38, 0x9c, 0x21, 0xe0, 0x1d, 0x0c, 0x5c, 0x2f, 0x87, 0x38, 0x02, - 0x5e, 0xd4, 0xb0, 0x38, 0x9c, 0x21, 0xb0, 0x65, 0x57, 0x2e, 0x13, 0x88, 0xc0, 0x56, 0xe3, 0xd0, - 0xe2, 0x70, 0x72, 0x05, 0x46, 0x56, 0xdb, 0xcb, 0xd4, 0x79, 0x40, 0xc5, 0xa1, 0x21, 0xba, 0x8a, - 0xfc, 0xb6, 0xdd, 0x64, 0x30, 0x4b, 0x16, 0x9a, 0xdf, 0x31, 0x60, 0xaa, 0xa7, 0x9b, 0x4e, 0xce, - 0xfc, 0x74, 0xfc, 0x09, 0xed, 0x20, 0xdf, 0xc7, 0x9b, 0x5f, 0xc8, 0x6e, 0xbe, 0xf9, 0xfb, 0x05, - 0x38, 0xdf, 0x67, 0xd5, 0x4a, 0xa2, 0x2b, 0x8c, 0x13, 0xa3, 0x2b, 0xbe, 0xca, 0x56, 0x09, 0xc7, - 0x6b, 0x85, 0xeb, 0x7e, 0xd2, 0xe2, 0xe4, 0x20, 0x0a, 0xcb, 0x64, 0x6a, 0x15, 0x99, 0x06, 0xe4, - 0x42, 0x03, 0x29, 0xec, 0xc8, 0xef, 0xf1, 0xc7, 0xeb, 0xcc, 0x7a, 0xe2, 0x1b, 0xf2, 0x7f, 0x43, - 0xe2, 0x1b, 0xf4, 0x53, 0xc5, 0xc2, 0x13, 0x3d, 0x55, 0xcc, 0x3e, 0x80, 0x18, 0x7a, 0x9c, 0xa3, - 0xb8, 0x79, 0x18, 0xaf, 0x53, 0x27, 0x68, 0xec, 0x55, 0x43, 0x3e, 0x48, 0xc3, 0xc8, 0x0d, 0x55, - 0x72, 0x88, 0x05, 0xb6, 0x13, 0xf6, 0x8e, 0x85, 0x46, 0x63, 0xfe, 0xa7, 0x54, 0x58, 0xc6, 0xdf, - 0x44, 0x79, 0x79, 0x05, 0x86, 0xb6, 0xf6, 0x68, 0x20, 0x8d, 0x64, 0x6c, 0xc8, 0x43, 0x06, 0x50, - 0x1b, 0x82, 0x18, 0xe6, 0x4f, 0x43, 0x49, 0xad, 0x0c, 0x15, 0x02, 0xfb, 0x2d, 0x66, 0x24, 0x57, - 0x08, 0x0c, 0x60, 0x71, 0xf8, 0x89, 0xd9, 0xd8, 0x92, 0x5e, 0xc8, 0x9f, 0xd4, 0x0b, 0xac, 0x72, - 0x94, 0x37, 0xa5, 0x72, 0xfc, 0xad, 0x56, 0x1e, 0x31, 0x80, 0xc5, 0xe1, 0x4f, 0xb4, 0xf2, 0xff, - 0x60, 0x40, 0x01, 0x33, 0x61, 0xbc, 0x01, 0xa3, 0xd2, 0x9f, 0xad, 0x66, 0x87, 0x98, 0x96, 0xee, - 0xee, 0x50, 0x0f, 0xaa, 0x11, 0x40, 0x56, 0xd5, 0x26, 0x0d, 0xb6, 0xb5, 0xd8, 0xab, 0x07, 0x0c, - 0xa0, 0x56, 0x85, 0x18, 0xa7, 0x18, 0x0f, 0x8c, 0x2f, 0x13, 0xdb, 0x51, 0xae, 0xb2, 0x78, 0x7c, - 0x59, 0xcf, 0xde, 0x53, 0x62, 0x99, 0xbf, 0x6e, 0xc0, 0xd9, 0x4c, 0x4b, 0x86, 0xd5, 0xca, 0x4d, - 0x26, 0x45, 0x1c, 0xd3, 0xf6, 0x12, 0xc7, 0x38, 0x4d, 0x1c, 0xd9, 0x29, 0x64, 0xeb, 0x79, 0x18, - 0x8d, 0x77, 0x98, 0x64, 0x46, 0x0e, 0x1d, 0x3a, 0x3d, 0xe5, 0x76, 0xec, 0xaf, 0x0d, 0x18, 0x66, - 0x4d, 0x78, 0x6a, 0xaf, 0x15, 0x65, 0xbb, 0xc0, 0xd9, 0x27, 0x0d, 0x74, 0x99, 0xe8, 0x77, 0x86, - 0x01, 0x12, 0x64, 0xb2, 0x0d, 0x13, 0xab, 0x4b, 0x0b, 0xf3, 0x4b, 0x2e, 0x6d, 0x47, 0x78, 0x06, - 0x9c, 0x4a, 0x2f, 0xc1, 0xb6, 0xc6, 0x41, 0xdb, 0x69, 0x0a, 0x84, 0x83, 0x44, 0x37, 0xf8, 0x9e, - 0xdb, 0xb0, 0xbd, 0x98, 0x4e, 0x35, 0x29, 0x75, 0x8e, 0xac, 0x8e, 0x7a, 0xf5, 0xfe, 0xb2, 0x52, - 0x47, 0x6e, 0xc0, 0x3a, 0x42, 0xa7, 0xd5, 0xec, 0x53, 0x87, 0xce, 0x91, 0xec, 0x41, 0xf9, 0x0e, - 0xae, 0x3e, 0x4a, 0x2d, 0xf9, 0xe3, 0x6b, 0x79, 0x41, 0xd4, 0xf2, 0x0c, 0x5f, 0xb6, 0xb2, 0xeb, - 0xe9, 0xe1, 0x9a, 0x48, 0x6e, 0xe1, 0x44, 0xc9, 0xfd, 0x3b, 0x06, 0x0c, 0xf3, 0xe5, 0x2d, 0x7e, - 0x43, 0x28, 0x73, 0x01, 0xdd, 0x7a, 0x32, 0x0b, 0x68, 0x19, 0x35, 0x97, 0xe6, 0x42, 0xe0, 0x65, - 0x64, 0x21, 0xf5, 0x20, 0x91, 0x3c, 0xe7, 0x40, 0xd3, 0x9a, 0x97, 0x24, 0xd1, 0x78, 0xfc, 0x2d, - 0x22, 0x95, 0x0b, 0xc7, 0x50, 0x9f, 0x47, 0x1d, 0x79, 0xcc, 0xe7, 0x51, 0x97, 0x61, 0x54, 0x84, - 0x97, 0xd5, 0x0e, 0xc4, 0x06, 0x5a, 0xba, 0x88, 0x62, 0xb8, 0x92, 0x75, 0x9d, 0x83, 0xec, 0x6d, - 0x2d, 0x67, 0x62, 0x8c, 0x48, 0x56, 0x61, 0x34, 0xb9, 0x13, 0x35, 0xaa, 0x1d, 0x56, 0xc7, 0x70, - 0x11, 0x7f, 0xcd, 0xaf, 0xdd, 0x66, 0x5e, 0x81, 0x4a, 0x78, 0x98, 0xdf, 0x34, 0xa0, 0x9c, 0x96, - 0x17, 0xf2, 0x0e, 0x8c, 0xc5, 0xd7, 0xd2, 0xe2, 0xe8, 0x13, 0xf4, 0x36, 0x27, 0xf7, 0xd8, 0xb4, - 0x38, 0x14, 0x15, 0x9d, 0xcc, 0x41, 0x91, 0x4d, 0x3b, 0x25, 0x69, 0x36, 0xea, 0x93, 0xae, 0x80, - 0xa9, 0x87, 0xaf, 0x12, 0x4f, 0x99, 0xb5, 0xff, 0x25, 0x0f, 0x63, 0xca, 0x60, 0x91, 0x57, 0xa0, - 0xb8, 0x14, 0x2e, 0xfb, 0x8d, 0x7d, 0xea, 0x8a, 0x33, 0x1d, 0x7c, 0xfd, 0xd6, 0x0b, 0xed, 0x26, - 0x02, 0xad, 0xb8, 0x98, 0xd4, 0x60, 0x9c, 0xff, 0x27, 0xaf, 0x1f, 0xe7, 0x12, 0x7f, 0x34, 0x47, - 0x96, 0x17, 0x8f, 0xd5, 0xe5, 0x5d, 0x23, 0x21, 0x5f, 0x03, 0xe0, 0x00, 0x36, 0xbe, 0x03, 0x44, - 0x97, 0xcb, 0x09, 0x7c, 0x56, 0x54, 0x10, 0x79, 0xea, 0x17, 0xa2, 0x28, 0x28, 0x0c, 0xf1, 0xe5, - 0x4d, 0xbf, 0xb1, 0x3f, 0xf8, 0xdb, 0xbb, 0xc9, 0xcb, 0x9b, 0x7e, 0x63, 0xdf, 0xce, 0x0e, 0x35, - 0x54, 0x59, 0x92, 0x6f, 0x19, 0x70, 0xd1, 0xa2, 0x0d, 0xff, 0x01, 0x0d, 0x0e, 0xaa, 0x11, 0x62, - 0xa9, 0x35, 0x9e, 0x1c, 0xd7, 0x78, 0x4b, 0xd4, 0xf8, 0x72, 0x20, 0xb8, 0xe0, 0x9d, 0xa8, 0x56, - 0x27, 0xb2, 0x8f, 0x69, 0xc2, 0x31, 0x55, 0x9a, 0x7f, 0x66, 0x28, 0x53, 0x80, 0xac, 0xc0, 0x68, - 0x2c, 0x2c, 0xc2, 0x65, 0x1a, 0x5b, 0x66, 0x12, 0x6e, 0xd1, 0x9d, 0xda, 0x33, 0xe2, 0xf8, 0x65, - 0x3a, 0x16, 0x39, 0x6d, 0x46, 0x48, 0x20, 0xf9, 0x00, 0x0a, 0x38, 0x54, 0x27, 0x67, 0x59, 0x93, - 0x4b, 0x4d, 0x81, 0x8d, 0x11, 0xb6, 0x1a, 0x29, 0xc9, 0xe7, 0x44, 0x0c, 0x50, 0x5e, 0xcb, 0x5f, - 0xcc, 0x40, 0xac, 0x1d, 0xf1, 0x1a, 0x93, 0x44, 0xb7, 0x2a, 0xd2, 0xfa, 0xf7, 0x72, 0x50, 0x4e, - 0x4f, 0x3c, 0xf2, 0x3e, 0x94, 0xe4, 0xfd, 0xb6, 0xbb, 0x4e, 0xb8, 0x27, 0x72, 0xa2, 0xe2, 0xae, - 0x55, 0x5e, 0x8a, 0xb3, 0xf7, 0x1c, 0x2d, 0x77, 0x9e, 0x46, 0xc0, 0x16, 0xe4, 0x75, 0x71, 0x69, - 0x42, 0x99, 0x40, 0x91, 0x1f, 0x75, 0x52, 0x39, 0x51, 0x25, 0x1a, 0x79, 0x03, 0xf2, 0xfc, 0xd2, - 0xa7, 0x9a, 0x50, 0xeb, 0xfe, 0xed, 0x2a, 0xbf, 0xb3, 0xc6, 0x4f, 0xfc, 0xf5, 0xa3, 0x13, 0x86, - 0x4f, 0x96, 0x95, 0x2b, 0x83, 0xc3, 0x5a, 0x62, 0x21, 0x09, 0x8e, 0x3f, 0xee, 0xe4, 0xbb, 0x83, - 0x1f, 0x16, 0x8a, 0xf9, 0x72, 0x41, 0x5c, 0x12, 0xfb, 0xbd, 0x3c, 0x8c, 0xc6, 0xf5, 0x13, 0x02, - 0x68, 0x6f, 0x88, 0xa3, 0x7b, 0xfc, 0x9f, 0x5c, 0x80, 0xa2, 0x34, 0x31, 0xc4, 0xf1, 0xfd, 0x48, - 0x28, 0xcc, 0x8b, 0x59, 0x90, 0xb6, 0x04, 0x37, 0x2f, 0x2c, 0xf9, 0x93, 0xdc, 0x84, 0xd8, 0x50, - 0xe8, 0x67, 0x51, 0x14, 0xd8, 0x80, 0x59, 0x31, 0x1a, 0x99, 0x80, 0x9c, 0xc7, 0x03, 0xe2, 0x47, - 0xad, 0x9c, 0xe7, 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe0, 0x1d, 0xe4, - 0x22, 0xe3, 0xc6, 0x35, 0x3a, 0x52, 0x55, 0x23, 0x52, 0x85, 0x51, 0x7c, 0x06, 0xb7, 0x1b, 0x0e, - 0xf4, 0x76, 0x6e, 0xc2, 0xa1, 0xc8, 0xc8, 0x36, 0x42, 0xea, 0x92, 0x97, 0xa1, 0xc0, 0x46, 0x53, - 0xac, 0x07, 0x71, 0x9a, 0xc4, 0xd5, 0xf5, 0x35, 0xde, 0x61, 0x77, 0xcf, 0x58, 0x88, 0x40, 0x5e, - 0x84, 0x7c, 0x77, 0x6e, 0x47, 0x68, 0xfa, 0x72, 0x72, 0x1f, 0x38, 0x46, 0x63, 0xc5, 0xe4, 0x16, - 0x14, 0x1f, 0xea, 0x37, 0x3f, 0xcf, 0xa6, 0x86, 0x31, 0xc6, 0x8f, 0x11, 0x6b, 0x45, 0x18, 0xe6, - 0x77, 0x1e, 0xcd, 0xe7, 0x00, 0x92, 0xaa, 0x7b, 0xa3, 0x2c, 0xcc, 0xaf, 0xc1, 0x68, 0x5c, 0x25, - 0x79, 0x16, 0x60, 0x9f, 0x1e, 0xd8, 0x7b, 0x4e, 0xdb, 0x15, 0x6f, 0xfa, 0x94, 0xac, 0xd1, 0x7d, - 0x7a, 0x70, 0x17, 0x01, 0xe4, 0x3c, 0x8c, 0x74, 0xd8, 0xa8, 0xca, 0x8c, 0xbe, 0xd6, 0x70, 0xa7, - 0xbb, 0xcd, 0x24, 0x74, 0x16, 0x46, 0xd0, 0xf9, 0x21, 0x26, 0xda, 0xb8, 0x25, 0x7f, 0x9a, 0xbf, - 0x95, 0xc3, 0x5c, 0x0f, 0x4a, 0x3b, 0xc9, 0x0b, 0x30, 0xde, 0x08, 0x28, 0x2e, 0x47, 0x0e, 0x33, - 0x8b, 0x44, 0x3d, 0xa5, 0x04, 0xb8, 0xe4, 0x92, 0x2b, 0x30, 0x99, 0xa4, 0x18, 0xb6, 0x1b, 0xdb, - 0xe2, 0xde, 0x77, 0xc9, 0x1a, 0xef, 0xc8, 0x1c, 0xc3, 0xf3, 0xdb, 0x78, 0x91, 0xa3, 0xac, 0xde, - 0x77, 0x8c, 0x64, 0xba, 0xe0, 0x51, 0x6b, 0x52, 0x81, 0xe3, 0xc1, 0xc9, 0x39, 0x18, 0x76, 0x9c, - 0xdd, 0xae, 0xc7, 0x83, 0xca, 0x4b, 0x96, 0xf8, 0x45, 0x5e, 0x85, 0xa9, 0xd0, 0xdb, 0x6d, 0x3b, - 0x51, 0x37, 0x10, 0xc9, 0x36, 0x68, 0x80, 0x22, 0x35, 0x6e, 0x95, 0xe3, 0x82, 0x79, 0x0e, 0x27, - 0xaf, 0x03, 0x51, 0xeb, 0xf3, 0xb7, 0x3f, 0xa6, 0x0d, 0x2e, 0x6a, 0x25, 0x6b, 0x4a, 0x29, 0x59, - 0xc5, 0x02, 0xf2, 0x3c, 0x94, 0x02, 0x1a, 0xa2, 0x49, 0x86, 0xdd, 0x86, 0x29, 0x84, 0xac, 0x31, - 0x09, 0xbb, 0x47, 0x0f, 0xcc, 0x1a, 0x4c, 0xf5, 0xcc, 0x47, 0xf2, 0x3a, 0xb7, 0xee, 0xc5, 0xfa, - 0x5c, 0xe2, 0x9b, 0x19, 0x7c, 0xfa, 0x4a, 0x7f, 0x39, 0x9d, 0x23, 0x99, 0x6d, 0x28, 0xa9, 0xfa, - 0xf5, 0x84, 0x1b, 0xf5, 0xe7, 0x30, 0xec, 0x94, 0x2b, 0x9f, 0xe1, 0xa3, 0xc3, 0x4a, 0xce, 0x73, - 0x31, 0xd8, 0xf4, 0x2a, 0x14, 0xa5, 0x95, 0xa0, 0xbe, 0x3f, 0x23, 0x0c, 0xca, 0x03, 0x2b, 0x2e, - 0x35, 0x5f, 0x86, 0x11, 0xa1, 0x42, 0x8f, 0x77, 0x44, 0x99, 0xdf, 0xc8, 0xc1, 0xa4, 0x45, 0xd9, - 0x04, 0x17, 0x2f, 0xbb, 0x7c, 0xc6, 0x92, 0x2d, 0x6b, 0xdf, 0x76, 0x4c, 0x02, 0x8b, 0xef, 0x1a, - 0x30, 0x9d, 0x81, 0xfb, 0x89, 0xb2, 0xb3, 0xbd, 0x09, 0xa3, 0x0b, 0x9e, 0xd3, 0xac, 0xba, 0x6e, - 0x1c, 0x3e, 0x8b, 0xd6, 0xa0, 0xcb, 0xa6, 0x93, 0xc3, 0xa0, 0xea, 0x62, 0x1a, 0xa3, 0x92, 0x6b, - 0x42, 0x28, 0x92, 0xfc, 0x91, 0x32, 0x9d, 0x33, 0xf0, 0x36, 0x25, 0xc9, 0x9c, 0xf1, 0x2e, 0x24, - 0x07, 0x26, 0xa7, 0xb3, 0x4f, 0xed, 0xd0, 0x65, 0xdf, 0x85, 0x4c, 0x7f, 0xde, 0x40, 0xdb, 0xce, - 0x6f, 0xe6, 0xe0, 0x5c, 0x36, 0xe1, 0x27, 0x4d, 0xb4, 0x87, 0xd9, 0x43, 0x94, 0x8c, 0xd9, 0x98, - 0x68, 0x8f, 0xa7, 0x1a, 0x41, 0xfc, 0x04, 0x81, 0xec, 0xc0, 0xf8, 0xb2, 0x13, 0x46, 0x77, 0xa9, - 0x13, 0x44, 0xdb, 0xd4, 0x89, 0x06, 0xb0, 0x60, 0xe3, 0xf7, 0xc9, 0x71, 0x51, 0xdb, 0x93, 0x94, - 0xe9, 0xf7, 0xc9, 0x35, 0xb6, 0xb1, 0xa0, 0x14, 0x06, 0x10, 0x94, 0xaf, 0xc3, 0x64, 0x9d, 0xb6, - 0x9c, 0xce, 0x9e, 0x1f, 0x50, 0xe1, 0x3b, 0xbf, 0x0e, 0xe3, 0x31, 0x28, 0x53, 0x5a, 0xf4, 0x62, - 0x0d, 0x5f, 0xe9, 0x88, 0x44, 0x95, 0xe8, 0xc5, 0xe6, 0x6f, 0xe4, 0xe0, 0x7c, 0xb5, 0x21, 0x0e, - 0x1a, 0x44, 0x81, 0x3c, 0x0f, 0xfd, 0x94, 0xeb, 0x26, 0x37, 0x60, 0xf4, 0xbe, 0xf3, 0x68, 0x99, - 0xe2, 0x0b, 0xc2, 0x3c, 0x5d, 0x13, 0x37, 0xbf, 0x9c, 0x47, 0x76, 0xec, 0xf6, 0xb2, 0x12, 0x1c, - 0x75, 0xb3, 0x59, 0x78, 0xcc, 0xcd, 0xa6, 0x09, 0xc3, 0x77, 0xfd, 0xa6, 0x2b, 0x16, 0x27, 0x71, - 0x6e, 0xb1, 0x87, 0x10, 0x4b, 0x94, 0x98, 0x3f, 0x34, 0x60, 0x22, 0x6e, 0x31, 0x36, 0xe1, 0x53, - 0xef, 0x92, 0x2b, 0x30, 0x82, 0x15, 0xc5, 0xaf, 0x23, 0xe1, 0xa2, 0xd1, 0x64, 0x20, 0xdb, 0x73, - 0x2d, 0x59, 0xa8, 0xf6, 0xc4, 0xd0, 0xe3, 0xf5, 0x84, 0xf9, 0xcf, 0xf0, 0x48, 0x44, 0xfd, 0x4a, - 0xb6, 0x12, 0x29, 0x0d, 0x31, 0x06, 0x6c, 0x48, 0xee, 0x89, 0x0d, 0x49, 0xbe, 0xef, 0x90, 0xfc, - 0x42, 0x0e, 0xc6, 0xe2, 0xc6, 0x7e, 0xc6, 0x92, 0x08, 0xc4, 0xdf, 0x35, 0x50, 0x08, 0x7d, 0x5d, - 0xd1, 0x15, 0x22, 0x52, 0xfd, 0x03, 0x18, 0x16, 0x93, 0xc9, 0x48, 0x9d, 0x0b, 0xa6, 0x46, 0x37, - 0x79, 0x63, 0x1a, 0x07, 0x34, 0xb4, 0x04, 0x1d, 0xde, 0x51, 0xd8, 0xa2, 0xdb, 0xe2, 0x84, 0xec, - 0xa9, 0x5d, 0xa3, 0xb2, 0xef, 0x28, 0x24, 0x1f, 0x36, 0xd0, 0xea, 0xf4, 0x8f, 0x0a, 0x50, 0x4e, - 0x93, 0x9c, 0x9c, 0xa6, 0x61, 0xad, 0xbb, 0x2d, 0x1e, 0xe8, 0xc0, 0x34, 0x0d, 0x9d, 0xee, 0xb6, - 0xc5, 0x60, 0xe4, 0x0a, 0x14, 0xd6, 0x02, 0xef, 0x01, 0x7e, 0xb5, 0x78, 0x9f, 0xa4, 0x13, 0x78, - 0x0f, 0xd4, 0x60, 0x5d, 0x56, 0x8e, 0x1b, 0xda, 0xe5, 0xba, 0xf2, 0xbc, 0x3f, 0xdf, 0xd0, 0x36, - 0xc3, 0x74, 0x3e, 0x20, 0x89, 0xc6, 0x96, 0xca, 0x1a, 0x75, 0x02, 0x91, 0x52, 0x40, 0xa8, 0x33, - 0x5c, 0x2a, 0xb7, 0x11, 0xcc, 0x93, 0xfd, 0x5a, 0x2a, 0x12, 0x69, 0x02, 0x51, 0x7e, 0xca, 0x09, - 0x7c, 0xf2, 0x1e, 0x4f, 0xbe, 0xab, 0x35, 0xa3, 0xb2, 0xb6, 0xd5, 0xd9, 0x9c, 0xc1, 0xf7, 0x49, - 0xfa, 0x08, 0xd7, 0x60, 0x14, 0x5d, 0x5e, 0xe8, 0xc8, 0x28, 0x9e, 0xc8, 0x4c, 0x06, 0x46, 0x03, - 0xc6, 0x13, 0xd8, 0xb1, 0x3b, 0x23, 0x61, 0x42, 0xde, 0x83, 0x31, 0x35, 0x9a, 0x97, 0xc7, 0x9c, - 0x5e, 0xe2, 0xf7, 0xc7, 0xfa, 0xe4, 0xcd, 0x53, 0x09, 0xcc, 0xcf, 0xa9, 0x52, 0x22, 0x16, 0xed, - 0x63, 0xa5, 0xc4, 0xfc, 0x35, 0x34, 0xe3, 0x5b, 0x7e, 0x44, 0x85, 0xf5, 0xf2, 0xd4, 0xea, 0xb1, - 0xc4, 0x85, 0x3c, 0xa4, 0xc5, 0xb4, 0x68, 0x5f, 0x77, 0x8a, 0x87, 0xed, 0x7f, 0xd7, 0x80, 0xb3, - 0x99, 0xb4, 0xe4, 0x3a, 0x40, 0x62, 0x23, 0x8a, 0x5e, 0xe2, 0x59, 0x94, 0x63, 0xa8, 0xa5, 0x60, - 0x90, 0xaf, 0xa6, 0xad, 0xbb, 0x93, 0x17, 0x27, 0xf9, 0xd6, 0xc8, 0x84, 0x6e, 0xdd, 0x65, 0xd8, - 0x74, 0xe6, 0x77, 0xf3, 0x30, 0xd5, 0xf3, 0x46, 0xe5, 0x09, 0x51, 0x04, 0xfb, 0xa9, 0x17, 0xd0, - 0xf8, 0x71, 0xc7, 0xb5, 0x7e, 0x2f, 0x64, 0x66, 0xbc, 0x87, 0x86, 0x6e, 0x31, 0x91, 0xc0, 0xfb, - 0x84, 0x67, 0xd1, 0xc2, 0xec, 0xb7, 0xf3, 0x5e, 0xed, 0x5b, 0xdb, 0x13, 0x78, 0x43, 0xef, 0x6f, - 0xf0, 0x13, 0x63, 0xbf, 0x96, 0x83, 0xe9, 0x9e, 0x6f, 0x7e, 0x6a, 0x67, 0xdd, 0x07, 0xda, 0xea, - 0xf6, 0x5c, 0xbf, 0x31, 0x1d, 0xc8, 0x8a, 0xf8, 0x5f, 0x06, 0x9c, 0xef, 0x43, 0x49, 0x0e, 0xd2, - 0x42, 0xc4, 0xad, 0x8a, 0x9b, 0xc7, 0x57, 0xf8, 0x44, 0x44, 0xe9, 0x53, 0x93, 0x84, 0x6f, 0xe4, - 0x00, 0xb6, 0xe8, 0xf6, 0xd3, 0x9d, 0x83, 0xea, 0x0b, 0x9a, 0x00, 0x28, 0x0e, 0xcc, 0xc1, 0x53, - 0x50, 0xad, 0xa2, 0x23, 0x71, 0xf0, 0x04, 0x54, 0xf1, 0x7b, 0x2a, 0xb9, 0xec, 0xf7, 0x54, 0xcc, - 0x6d, 0x98, 0xb9, 0x43, 0xa3, 0x64, 0x25, 0x94, 0x7b, 0xc8, 0xe3, 0xd9, 0xbe, 0x06, 0xa3, 0x02, - 0x5f, 0xcf, 0x8d, 0x2f, 0x43, 0xe2, 0x3c, 0xd7, 0x4a, 0x10, 0x4c, 0x0a, 0xe7, 0x17, 0x68, 0x93, - 0x46, 0xf4, 0xd3, 0xad, 0xa6, 0x0e, 0x84, 0x7f, 0x0a, 0x7f, 0x66, 0x63, 0xa0, 0x1a, 0x4e, 0xec, - 0x9f, 0x4d, 0x38, 0x1b, 0xb7, 0xfd, 0x49, 0xf2, 0xbd, 0xc1, 0x6c, 0x09, 0x71, 0x21, 0x32, 0xe1, - 0x78, 0x8c, 0x13, 0xf1, 0x11, 0x5c, 0x94, 0x04, 0x5b, 0x5e, 0x7c, 0x12, 0x33, 0x10, 0x2d, 0x79, - 0x07, 0xc6, 0x14, 0x1a, 0x71, 0xad, 0x1b, 0x4f, 0x3b, 0x1f, 0x7a, 0xd1, 0x9e, 0x1d, 0x72, 0xb8, - 0x7a, 0xda, 0xa9, 0xa0, 0x9b, 0x5f, 0x81, 0x67, 0xe2, 0xb8, 0x95, 0x8c, 0xaa, 0x53, 0xcc, 0x8d, - 0xd3, 0x31, 0x5f, 0x49, 0x3e, 0x6b, 0xa9, 0x1d, 0x47, 0xc0, 0x4b, 0xde, 0x44, 0xfd, 0x2c, 0xf1, - 0x31, 0x97, 0x94, 0xdc, 0x7c, 0x62, 0x2d, 0x4a, 0x00, 0xe6, 0xdb, 0x4a, 0x63, 0x33, 0x18, 0x6a, - 0xc4, 0x46, 0x9a, 0xf8, 0x1b, 0x39, 0x98, 0x5c, 0x5d, 0x5a, 0x98, 0x8f, 0xdd, 0xc8, 0x9f, 0xb1, - 0x04, 0x59, 0xda, 0xb7, 0xf5, 0xd7, 0x37, 0xe6, 0x06, 0x4c, 0xa7, 0xba, 0x01, 0x5f, 0x11, 0x7a, - 0x8f, 0xc7, 0x97, 0xc4, 0x60, 0xb9, 0xb2, 0x9c, 0xcb, 0x62, 0xbf, 0x79, 0xcb, 0x4a, 0x61, 0x9b, - 0xdf, 0x1d, 0x4e, 0xf1, 0x15, 0x2a, 0xec, 0x35, 0x18, 0x5d, 0x0a, 0xc3, 0x2e, 0x0d, 0x36, 0xac, - 0x65, 0xd5, 0x46, 0xf4, 0x10, 0x68, 0x77, 0x83, 0xa6, 0x95, 0x20, 0x90, 0x57, 0xa0, 0x28, 0x2e, - 0xe1, 0x49, 0x9d, 0x80, 0xc7, 0xe5, 0xf1, 0x1d, 0x3e, 0x2b, 0x2e, 0x26, 0x6f, 0x40, 0x89, 0xff, - 0xcf, 0xa5, 0x4d, 0x74, 0x38, 0xfa, 0xaa, 0x04, 0x3a, 0x97, 0x4e, 0x4b, 0x43, 0x63, 0x3b, 0x33, - 0xf9, 0x4c, 0x29, 0x6b, 0x51, 0x21, 0xd9, 0x99, 0xc9, 0x17, 0x4d, 0xb1, 0x4d, 0x2a, 0x12, 0xb9, - 0x06, 0xf9, 0xea, 0xbc, 0xa5, 0xa6, 0x03, 0x77, 0x1a, 0x01, 0x4f, 0xa7, 0xaf, 0xbd, 0x04, 0x56, - 0x9d, 0xb7, 0xc8, 0x1c, 0x14, 0xf1, 0xa5, 0x17, 0x97, 0x06, 0x22, 0xea, 0x15, 0xa5, 0xa6, 0x23, - 0x60, 0xea, 0xc9, 0xa3, 0xc4, 0x23, 0x37, 0x60, 0x64, 0xc1, 0x0b, 0x3b, 0x4d, 0xe7, 0x40, 0x64, - 0xc6, 0xc1, 0xc3, 0x10, 0x97, 0x83, 0x54, 0x39, 0x13, 0x58, 0xe4, 0x15, 0x18, 0xaa, 0x37, 0xfc, - 0x0e, 0xdb, 0x6d, 0xc5, 0xa1, 0x2d, 0x21, 0x03, 0x68, 0x79, 0x2f, 0x18, 0x00, 0xef, 0x85, 0xf3, - 0xeb, 0x6d, 0xa3, 0xca, 0xbd, 0xf0, 0xf4, 0xb5, 0x36, 0x81, 0xd3, 0x1b, 0x7c, 0x08, 0x4f, 0x32, - 0xf8, 0x70, 0x1b, 0xce, 0xdf, 0x41, 0x53, 0xbf, 0x4e, 0x03, 0x4c, 0x46, 0xca, 0x5f, 0x8d, 0xda, - 0xb0, 0x96, 0xc4, 0x95, 0x3e, 0xbc, 0x60, 0xc5, 0x77, 0x03, 0x76, 0xc8, 0x71, 0xe4, 0x83, 0x53, - 0xa9, 0xa7, 0x32, 0xfa, 0x31, 0x22, 0x5f, 0x82, 0x99, 0xac, 0x22, 0x71, 0xb9, 0x0f, 0xe3, 0xda, - 0xb3, 0x2b, 0x50, 0x03, 0xcb, 0xb3, 0x38, 0x90, 0x65, 0x28, 0x73, 0x78, 0xd5, 0x6d, 0x79, 0xed, - 0xc5, 0x96, 0xe3, 0x35, 0xf1, 0xaa, 0x9f, 0xb8, 0xaf, 0x29, 0xb8, 0x3a, 0xac, 0xd0, 0xa6, 0xac, - 0x54, 0x8b, 0x4e, 0x4a, 0x51, 0xa2, 0x3a, 0xaa, 0x57, 0xef, 0x2f, 0x27, 0x73, 0xea, 0xb3, 0x75, - 0x6e, 0xa4, 0x7d, 0xdb, 0x31, 0xe7, 0x46, 0x1b, 0x30, 0x9d, 0xea, 0x06, 0xa9, 0x8e, 0x34, 0x70, - 0x5a, 0x1d, 0xa5, 0x68, 0xac, 0x14, 0xb6, 0xf9, 0x5f, 0x87, 0x53, 0x7c, 0x85, 0xaf, 0xc8, 0x84, - 0x61, 0xae, 0x6d, 0xd4, 0xd4, 0x79, 0x5c, 0x17, 0x59, 0xa2, 0x84, 0x5c, 0x80, 0x7c, 0xbd, 0xbe, - 0xaa, 0x26, 0xf6, 0x0c, 0x43, 0xdf, 0x62, 0x30, 0x36, 0x42, 0xe8, 0x06, 0x52, 0xae, 0x98, 0x35, - 0x68, 0x10, 0x89, 0x77, 0x6c, 0x5f, 0x4a, 0xe6, 0x71, 0x21, 0xe9, 0x6f, 0x31, 0x8f, 0x93, 0xd9, - 0x3b, 0x0f, 0xb3, 0xd5, 0x30, 0xa4, 0x41, 0xc4, 0x5f, 0x23, 0x08, 0xbb, 0x2d, 0x1a, 0x08, 0x59, - 0x13, 0x3a, 0x86, 0xbf, 0x82, 0xdf, 0x08, 0xad, 0xbe, 0x88, 0xe4, 0x2a, 0x14, 0xab, 0x5d, 0xd7, - 0xa3, 0xed, 0x86, 0x16, 0x5d, 0xef, 0x08, 0x98, 0x15, 0x97, 0x92, 0x8f, 0xe0, 0xac, 0x20, 0x92, - 0x0a, 0x47, 0xf4, 0x00, 0xd7, 0x35, 0x7c, 0x07, 0x2b, 0xe6, 0x82, 0x54, 0x53, 0xb6, 0xe8, 0x92, - 0x6c, 0x4a, 0x52, 0x85, 0xf2, 0x22, 0x9e, 0x93, 0xca, 0xd7, 0xac, 0xfd, 0x40, 0x64, 0x9d, 0x46, - 0xcd, 0xc5, 0xcf, 0x50, 0x6d, 0x37, 0x2e, 0xb4, 0x7a, 0xd0, 0xc9, 0x3d, 0x98, 0x4e, 0xc3, 0x98, - 0x3e, 0x1e, 0x4d, 0x5e, 0x9b, 0xeb, 0xe1, 0x82, 0x8a, 0x39, 0x8b, 0x8a, 0x6c, 0xc3, 0x54, 0x35, - 0x8a, 0x02, 0x6f, 0xbb, 0x1b, 0xd1, 0x94, 0xea, 0x92, 0x8e, 0xc6, 0xb8, 0x5c, 0xaa, 0xaf, 0x67, - 0x84, 0x30, 0x4e, 0x3b, 0x31, 0x65, 0xac, 0xc2, 0xac, 0x5e, 0x76, 0xc4, 0x8d, 0x1f, 0xac, 0x14, - 0x8f, 0x3a, 0x8a, 0x2b, 0x51, 0xd2, 0xa1, 0x5b, 0x0d, 0x0f, 0x5a, 0x2d, 0x1a, 0x05, 0x78, 0x72, - 0x8f, 0x8f, 0x3e, 0x9a, 0x22, 0x06, 0xe8, 0xa2, 0xf2, 0x4e, 0x2b, 0x3e, 0xec, 0xa9, 0x85, 0x47, - 0x6a, 0x3c, 0xb5, 0xe5, 0xa3, 0x34, 0xe0, 0xf2, 0xd1, 0x84, 0xa9, 0xc5, 0x76, 0x23, 0x38, 0xc0, - 0xbb, 0x99, 0xb2, 0x71, 0xe3, 0x27, 0x34, 0x4e, 0xbe, 0xe8, 0x72, 0xc9, 0x91, 0x12, 0x96, 0xd5, - 0xbc, 0x5e, 0xc6, 0xe6, 0xdf, 0x82, 0x72, 0xba, 0x2f, 0x1f, 0xf3, 0x95, 0xee, 0xd3, 0x84, 0x66, - 0xb3, 0x91, 0x4e, 0x7f, 0x0b, 0xb9, 0xa1, 0x3d, 0xc5, 0x6c, 0x24, 0xa9, 0x03, 0x94, 0x47, 0x93, - 0xb5, 0x07, 0x98, 0xe5, 0x34, 0xce, 0x65, 0x4d, 0x63, 0xf3, 0x17, 0x73, 0x30, 0xc5, 0xa3, 0x49, - 0x9f, 0x7e, 0x5b, 0xf1, 0x3d, 0x4d, 0x39, 0x4b, 0x5f, 0x60, 0xea, 0xeb, 0x8e, 0xb1, 0x16, 0xbf, - 0x06, 0x67, 0x7b, 0xba, 0x02, 0x15, 0xf4, 0x82, 0x8c, 0xe3, 0xed, 0x51, 0xd1, 0xb3, 0xd9, 0x95, - 0x6c, 0xde, 0xb2, 0x7a, 0x28, 0xcc, 0x7f, 0x92, 0xeb, 0xe1, 0x2f, 0xec, 0x46, 0xd5, 0x12, 0x34, - 0x4e, 0x67, 0x09, 0xe6, 0x3e, 0x91, 0x25, 0x98, 0x1f, 0xc4, 0x12, 0xfc, 0x08, 0xc6, 0xd7, 0xa9, - 0xc3, 0x2c, 0x1a, 0x71, 0x5d, 0xae, 0xa0, 0x3d, 0x93, 0xcc, 0xca, 0xa4, 0x7e, 0x89, 0xaf, 0xda, - 0x46, 0x8c, 0x80, 0xa9, 0x16, 0x7e, 0x7f, 0xce, 0xd2, 0x39, 0xa8, 0x8b, 0xc6, 0x50, 0xff, 0x45, - 0xc3, 0x0c, 0x60, 0xac, 0x5e, 0x5f, 0xdd, 0x72, 0x02, 0xa6, 0x2d, 0x42, 0x66, 0x32, 0xca, 0x30, - 0x51, 0x23, 0x51, 0xbc, 0xbd, 0xf1, 0xa1, 0x12, 0x8b, 0x29, 0x16, 0x49, 0x2c, 0x42, 0x2a, 0x78, - 0x44, 0x9c, 0x80, 0x69, 0x11, 0x71, 0x02, 0x66, 0xfe, 0xe3, 0x02, 0x94, 0x79, 0xe8, 0x23, 0xdb, - 0xf7, 0x8a, 0xfc, 0x40, 0x3d, 0xef, 0x44, 0x18, 0xa7, 0x7f, 0x27, 0xe2, 0x13, 0xc4, 0xd8, 0x2a, - 0x77, 0xb1, 0xf3, 0x03, 0xdc, 0xc5, 0x7e, 0x4b, 0xbb, 0xc8, 0x5c, 0x48, 0x1e, 0x22, 0xdd, 0xef, - 0x6e, 0xd3, 0xe3, 0xaf, 0x30, 0xbf, 0xa9, 0xde, 0x38, 0x1e, 0x4a, 0xa2, 0x4f, 0x90, 0xf2, 0x98, - 0xbb, 0xc6, 0xb1, 0x16, 0x1b, 0x3e, 0x4d, 0xbc, 0xf9, 0xc8, 0xff, 0xd7, 0x78, 0xf3, 0x45, 0x00, - 0x25, 0x69, 0x4c, 0x31, 0x79, 0x8f, 0xf4, 0xe4, 0x84, 0x31, 0x0a, 0xa1, 0xf9, 0x9b, 0x13, 0x30, - 0x55, 0xaf, 0xaf, 0x2e, 0x78, 0xce, 0x6e, 0xdb, 0x0f, 0x23, 0xaf, 0xb1, 0xd4, 0xde, 0xf1, 0xd9, - 0x14, 0x5e, 0xa7, 0x61, 0x74, 0xbb, 0xe9, 0x3f, 0x54, 0x63, 0x9f, 0x23, 0x1a, 0x46, 0xf6, 0x4e, - 0xd3, 0x7f, 0x68, 0xc5, 0xc5, 0x6c, 0x89, 0x58, 0x0c, 0x82, 0xf8, 0xe9, 0x13, 0x5c, 0x22, 0x28, - 0x03, 0x58, 0x1c, 0xce, 0x66, 0x49, 0xbd, 0xcb, 0xb3, 0x7f, 0xf0, 0x4c, 0x73, 0x38, 0x4b, 0x42, - 0x0e, 0xb2, 0x64, 0x19, 0xa1, 0xbd, 0x02, 0x2b, 0xb4, 0xe6, 0x79, 0x2d, 0x6a, 0x3d, 0x29, 0x16, - 0x6f, 0xe8, 0x21, 0x14, 0x47, 0xd7, 0xee, 0x20, 0x5c, 0x35, 0xde, 0x7b, 0xe6, 0xc0, 0x01, 0x9c, - 0x65, 0xc6, 0xe5, 0xa9, 0x6d, 0x8e, 0x6b, 0x42, 0x27, 0x98, 0x78, 0x5f, 0x22, 0xc3, 0xf0, 0x50, - 0x9f, 0x47, 0xc8, 0xac, 0x81, 0xfc, 0xa2, 0x01, 0xcf, 0x66, 0x96, 0xc4, 0xb3, 0x7b, 0x4c, 0xbb, - 0x39, 0xa0, 0x28, 0x0d, 0xcc, 0x98, 0xf2, 0x6a, 0xbf, 0xaa, 0xed, 0x0c, 0x55, 0x70, 0x7c, 0x4d, - 0xe4, 0xdf, 0x1a, 0x70, 0x5e, 0xc3, 0xc0, 0x54, 0x8b, 0x2d, 0xda, 0x8e, 0xe4, 0xc3, 0xe1, 0x7d, - 0xe4, 0xfa, 0xe3, 0x27, 0x23, 0xd7, 0x2f, 0xe8, 0xdf, 0xc2, 0xd3, 0x51, 0x63, 0xf5, 0xea, 0x4e, - 0xb1, 0x4f, 0x0b, 0xc9, 0x4f, 0xc2, 0x14, 0x16, 0x49, 0xfb, 0x87, 0xc9, 0x2c, 0x9a, 0x4d, 0xa5, - 0xda, 0xdc, 0xf7, 0x0f, 0x2b, 0xe3, 0x5a, 0x01, 0x5e, 0x2b, 0xc4, 0xda, 0x62, 0x73, 0xc9, 0x6b, - 0xef, 0xf8, 0x5a, 0x6a, 0xd5, 0x34, 0x33, 0xf2, 0xef, 0x0d, 0x98, 0x65, 0x50, 0xde, 0xe0, 0xdb, - 0x81, 0xdf, 0x8a, 0xcb, 0x43, 0x71, 0xe3, 0xbc, 0x4f, 0x07, 0x35, 0x9f, 0x4c, 0x07, 0xbd, 0x84, - 0x4d, 0xe6, 0xb3, 0xdf, 0xde, 0x09, 0xfc, 0x56, 0xd2, 0x7c, 0x2d, 0x5b, 0x49, 0xbf, 0x46, 0x92, - 0x9f, 0x37, 0xe0, 0x82, 0xb6, 0x8d, 0x52, 0x2f, 0xe5, 0xcd, 0x4e, 0x6a, 0xce, 0x01, 0xb5, 0xa8, - 0x76, 0x5d, 0x48, 0xfa, 0x15, 0x6c, 0x41, 0xb2, 0x2e, 0x60, 0x5b, 0xec, 0x16, 0xc7, 0x52, 0x9a, - 0xd0, 0xbf, 0x16, 0xe2, 0xc1, 0x14, 0x3a, 0x96, 0x34, 0xbf, 0xc4, 0x4c, 0x7f, 0xbf, 0xc4, 0x15, - 0x51, 0xf5, 0x73, 0x78, 0xf1, 0xa9, 0xbf, 0x73, 0xa2, 0x97, 0x2b, 0xf9, 0x19, 0xb8, 0xd0, 0x03, - 0x8c, 0xe7, 0xd5, 0xd9, 0xbe, 0xf3, 0xea, 0xd5, 0xa3, 0xc3, 0xca, 0xcb, 0x59, 0xb5, 0x65, 0xcd, - 0xa9, 0xfe, 0x35, 0x90, 0x7b, 0x00, 0x49, 0xe1, 0xec, 0x39, 0x14, 0xc5, 0x57, 0x85, 0x24, 0x28, - 0x25, 0x4c, 0x3f, 0x2b, 0xb5, 0xa9, 0xcb, 0x58, 0x82, 0x44, 0x56, 0xa1, 0xa4, 0x5c, 0xef, 0x3a, - 0x98, 0x3d, 0xcf, 0xd9, 0x7d, 0xff, 0xb0, 0xa2, 0xc1, 0xd9, 0xee, 0x4f, 0xbd, 0x21, 0xa6, 0xfa, - 0x9b, 0x34, 0x44, 0xf2, 0x87, 0x06, 0xcc, 0x30, 0x40, 0x22, 0x28, 0xa2, 0xa1, 0xb3, 0xc7, 0x49, - 0xf2, 0xde, 0x93, 0x91, 0xe4, 0xe7, 0xb1, 0x8d, 0xaa, 0x24, 0xf7, 0x7c, 0x7c, 0x66, 0xe3, 0x50, - 0x82, 0x35, 0xbf, 0xa4, 0x26, 0xc1, 0x17, 0x06, 0x90, 0x60, 0xde, 0xd5, 0x27, 0x4b, 0x70, 0xdf, - 0x5a, 0xcc, 0x6f, 0xe6, 0x60, 0x4c, 0x31, 0x0d, 0xc9, 0xe7, 0xa1, 0xb4, 0x1a, 0xec, 0x3a, 0x6d, - 0xef, 0xa7, 0x1c, 0xe5, 0xe8, 0x1c, 0x4d, 0x4f, 0x5f, 0x81, 0x5b, 0x1a, 0x16, 0x86, 0x3c, 0x53, - 0xa7, 0xa5, 0x6e, 0x5a, 0x98, 0x69, 0x69, 0x21, 0xf4, 0x94, 0xe6, 0xd1, 0xfb, 0x19, 0xe6, 0xd1, - 0xa9, 0xf2, 0xbc, 0xbc, 0xd3, 0x6b, 0x24, 0x0d, 0x9e, 0x96, 0xc5, 0xfc, 0xe5, 0x1c, 0x94, 0xd7, - 0x83, 0x6e, 0x18, 0x51, 0x57, 0x1e, 0xfc, 0x7e, 0xb6, 0x1e, 0x8f, 0xd3, 0x3f, 0xee, 0x98, 0xd0, - 0xa6, 0xc2, 0xaf, 0xff, 0x76, 0x05, 0x9f, 0xf6, 0x4f, 0x77, 0x87, 0x7c, 0xda, 0x5f, 0x87, 0xa7, - 0x6f, 0x7d, 0xa6, 0xa9, 0xac, 0x34, 0xbe, 0xf9, 0xa7, 0xb9, 0x34, 0x6f, 0xe1, 0x09, 0x7b, 0x09, - 0x46, 0xf8, 0x5b, 0xbe, 0xf2, 0x62, 0x9a, 0x48, 0x8e, 0x8a, 0x20, 0x4b, 0x96, 0x9d, 0xe6, 0xfe, - 0x6f, 0x7c, 0x2e, 0x96, 0xcf, 0x3e, 0x17, 0x23, 0x6f, 0x42, 0x09, 0x63, 0x7d, 0xab, 0xae, 0x1b, - 0x30, 0x4b, 0xae, 0x90, 0xe4, 0x41, 0x7d, 0x48, 0xb7, 0x6d, 0x1e, 0x13, 0xec, 0xb8, 0x6e, 0x60, - 0x69, 0x78, 0x64, 0x1e, 0x66, 0xb4, 0xd0, 0x72, 0x49, 0x3f, 0x94, 0xec, 0xf4, 0x23, 0x2c, 0xe0, - 0xc4, 0x99, 0xc8, 0x98, 0x0a, 0xdc, 0x6f, 0x32, 0x53, 0x0c, 0x0d, 0x74, 0x3d, 0x87, 0xa4, 0x9c, - 0xf4, 0x32, 0xde, 0x84, 0x60, 0xfe, 0x94, 0x96, 0xd3, 0xd1, 0x52, 0x12, 0x71, 0x44, 0xf3, 0x2f, - 0x0d, 0x36, 0xd7, 0x1a, 0xfb, 0x9f, 0xb1, 0x9b, 0xc9, 0xec, 0x93, 0x8e, 0x71, 0xd4, 0xfe, 0x67, - 0x83, 0xdf, 0x2d, 0x14, 0xe2, 0xf3, 0x16, 0x0c, 0xf3, 0x97, 0x83, 0xc5, 0x2d, 0x38, 0x95, 0x0b, - 0x2f, 0x48, 0x62, 0x8b, 0xf8, 0xfb, 0xc3, 0x96, 0x20, 0x50, 0xf7, 0xae, 0xb9, 0x81, 0xf6, 0xae, - 0xca, 0xc3, 0x06, 0x83, 0x3d, 0x98, 0x63, 0x9c, 0xfc, 0xb0, 0x81, 0xf9, 0x7f, 0x73, 0xfc, 0x7b, - 0x44, 0xa3, 0x06, 0x4d, 0xa5, 0x7d, 0x05, 0x0a, 0x4c, 0x0e, 0xd4, 0x7c, 0xe5, 0x4c, 0x56, 0xb4, - 0x37, 0xd2, 0xfc, 0x26, 0xfa, 0xb4, 0x50, 0xd7, 0xaa, 0x97, 0xe1, 0x51, 0x1d, 0xab, 0xf3, 0x06, - 0x31, 0xf0, 0x39, 0x1a, 0xdf, 0xa5, 0xea, 0x74, 0x68, 0xeb, 0x2f, 0x07, 0x61, 0x39, 0xdb, 0x98, - 0xc6, 0x77, 0xd2, 0xd4, 0xc3, 0xa8, 0xd6, 0x8e, 0x63, 0xf3, 0xbb, 0x50, 0xaa, 0xb6, 0x4d, 0xae, - 0xaf, 0x2d, 0xc2, 0x84, 0x9e, 0x29, 0x47, 0x38, 0x8c, 0x31, 0xbb, 0x45, 0x2a, 0xcb, 0x8e, 0xea, - 0x9a, 0xd4, 0x89, 0xd8, 0xc6, 0x5f, 0x4b, 0x87, 0xa2, 0xbe, 0xe2, 0xc0, 0xd3, 0x2f, 0xda, 0xbd, - 0x79, 0xbc, 0x74, 0x12, 0x25, 0xd8, 0xe1, 0x73, 0x50, 0x16, 0x33, 0x33, 0xce, 0x4b, 0x80, 0x6e, - 0xb9, 0xa5, 0x05, 0x4b, 0x9d, 0x4d, 0x0d, 0xcf, 0x0d, 0x2c, 0x84, 0x9a, 0xdf, 0x31, 0xe0, 0x82, - 0x78, 0x11, 0xd9, 0xa2, 0x61, 0x14, 0x78, 0x3c, 0xcd, 0x01, 0xca, 0xe3, 0xe7, 0xc9, 0x3b, 0x32, - 0xb3, 0xab, 0xae, 0x20, 0xd3, 0x75, 0xd4, 0xc6, 0x85, 0x50, 0x0e, 0x61, 0x6e, 0x57, 0x99, 0xd1, - 0xf5, 0x2d, 0x91, 0xd1, 0x35, 0x77, 0x3c, 0x71, 0x3c, 0x2f, 0x5c, 0xda, 0x96, 0x99, 0x5c, 0xbf, - 0x9d, 0x83, 0xb3, 0x19, 0xcd, 0xda, 0xfc, 0xfc, 0x53, 0xaa, 0x1c, 0x6a, 0x9a, 0x72, 0x90, 0x29, - 0xbf, 0xfb, 0x76, 0x7c, 0xa6, 0xae, 0xf8, 0x4d, 0x03, 0xce, 0xeb, 0xd2, 0x23, 0xce, 0x11, 0x36, - 0x6f, 0x91, 0xb7, 0x61, 0xf8, 0x2e, 0x75, 0x5c, 0x2a, 0xaf, 0xcf, 0x9e, 0x4d, 0xbd, 0x73, 0xc0, - 0x0b, 0x39, 0xdb, 0x3f, 0xe5, 0x53, 0xf9, 0x8c, 0x25, 0x48, 0xc8, 0x82, 0x68, 0x1c, 0x0f, 0x2d, - 0x32, 0x65, 0x94, 0x4d, 0x56, 0x55, 0xc7, 0x38, 0x35, 0x7f, 0xd7, 0x80, 0x67, 0x8e, 0xa1, 0x61, - 0x03, 0xc7, 0x86, 0x5e, 0x1d, 0x38, 0x5c, 0x58, 0x10, 0x4a, 0xde, 0x83, 0xc9, 0x75, 0x61, 0xb2, - 0xca, 0xe1, 0x50, 0x9e, 0x87, 0x92, 0xd6, 0xac, 0x2d, 0xc7, 0x25, 0x8d, 0x4c, 0xae, 0x42, 0xf1, - 0xae, 0x1f, 0x46, 0xed, 0x24, 0x55, 0x21, 0x9e, 0xdc, 0xec, 0x09, 0x98, 0x15, 0x97, 0x32, 0xb3, - 0x40, 0x6f, 0xa6, 0x08, 0x65, 0x7d, 0x01, 0x86, 0x19, 0x4e, 0xec, 0x19, 0x45, 0x39, 0xc0, 0xf7, - 0x7a, 0x3d, 0xd7, 0x12, 0x45, 0xb1, 0x4f, 0x3e, 0x97, 0x19, 0x71, 0xf2, 0x4d, 0x03, 0xca, 0x3a, - 0xef, 0xc7, 0x1d, 0x9a, 0x77, 0xb5, 0xa1, 0x79, 0x26, 0x7b, 0x68, 0xfa, 0x8f, 0x49, 0x4f, 0xd6, - 0xb0, 0x81, 0xc6, 0xc2, 0x84, 0xe1, 0x05, 0xbf, 0xe5, 0x78, 0x6d, 0x35, 0xd3, 0x95, 0x8b, 0x10, - 0x4b, 0x94, 0x28, 0xbd, 0x95, 0xef, 0xdb, 0x5b, 0xe6, 0xaf, 0x14, 0xe0, 0x82, 0x45, 0x77, 0x3d, - 0x66, 0x20, 0x6d, 0x84, 0x5e, 0x7b, 0x57, 0x8b, 0x07, 0x32, 0x53, 0x1d, 0x2e, 0x6e, 0x41, 0x30, - 0x48, 0xdc, 0xdf, 0xaf, 0x40, 0x91, 0x69, 0x69, 0xa5, 0xcf, 0xd1, 0xdb, 0x85, 0xf9, 0x1a, 0xf9, - 0xb8, 0xca, 0x62, 0x72, 0x4d, 0xac, 0x21, 0xca, 0x3d, 0x35, 0xb6, 0x86, 0xfc, 0xe8, 0xb0, 0x02, - 0xfc, 0x7d, 0x16, 0x56, 0x2a, 0xd6, 0x91, 0xd8, 0xa8, 0x2a, 0xf4, 0x31, 0xaa, 0xee, 0xc3, 0x4c, - 0xd5, 0xe5, 0xfa, 0xc9, 0x69, 0xae, 0x05, 0x5e, 0xbb, 0xe1, 0x75, 0x9c, 0xa6, 0x34, 0xca, 0xd1, - 0xe7, 0xe9, 0xc4, 0xe5, 0x76, 0x27, 0x46, 0xb0, 0x32, 0xc9, 0xd8, 0x67, 0x2c, 0xac, 0xd4, 0x79, - 0x3a, 0x3e, 0xee, 0xc8, 0xc4, 0xcf, 0x70, 0xdb, 0x21, 0xcf, 0xc7, 0x67, 0xc5, 0xc5, 0x68, 0xce, - 0xe1, 0x55, 0xd5, 0xf5, 0xe5, 0xfa, 0x3d, 0x71, 0xf5, 0x53, 0x86, 0xd1, 0xf3, 0x9b, 0xad, 0x51, - 0x33, 0xc4, 0xb3, 0x17, 0x0d, 0x2f, 0xa1, 0xab, 0xd7, 0xef, 0x32, 0xba, 0x62, 0x0f, 0x5d, 0x18, - 0xee, 0xa9, 0x74, 0x1c, 0x8f, 0xdc, 0x00, 0xe0, 0x81, 0xc8, 0x28, 0x10, 0xa3, 0x89, 0xf1, 0x17, - 0x20, 0x94, 0x1b, 0x7f, 0x0a, 0x0a, 0x79, 0x07, 0xa6, 0x17, 0xe7, 0xe7, 0xe4, 0x06, 0x76, 0xc1, - 0x6f, 0x74, 0x5b, 0xb4, 0x1d, 0xe1, 0x1d, 0xe3, 0x12, 0x1f, 0x43, 0xda, 0x98, 0x63, 0x52, 0x90, - 0x85, 0x26, 0x6e, 0x76, 0xf2, 0xbc, 0x00, 0xf3, 0xbe, 0x4b, 0xc3, 0xcd, 0x9b, 0x9f, 0xb1, 0x9b, - 0x9d, 0xca, 0xb7, 0xe1, 0x6c, 0xbb, 0x99, 0x39, 0x33, 0xff, 0x3e, 0xde, 0xec, 0xec, 0xc1, 0x25, - 0x3f, 0x06, 0x43, 0xf8, 0x53, 0xac, 0xb8, 0xd3, 0x19, 0x6c, 0x93, 0xd5, 0xb6, 0xc1, 0x33, 0xab, - 0x21, 0x01, 0x59, 0x4a, 0x5e, 0xbf, 0x3a, 0xc5, 0xfd, 0x24, 0x91, 0x5c, 0x44, 0x7f, 0xf6, 0xd0, - 0x85, 0x92, 0x5a, 0x21, 0x93, 0x91, 0xbb, 0x4e, 0xb8, 0x47, 0xdd, 0x79, 0xf9, 0x58, 0x7a, 0x89, - 0xcb, 0xc8, 0x1e, 0x42, 0xf1, 0x49, 0x46, 0x4b, 0x41, 0x61, 0xda, 0x61, 0x29, 0xdc, 0x08, 0x45, - 0x53, 0xc4, 0x2e, 0xc8, 0xc3, 0xdd, 0xab, 0x6b, 0x89, 0x22, 0xd4, 0x96, 0xd2, 0xdd, 0x1d, 0x38, - 0x8d, 0x7d, 0x1a, 0x6c, 0xde, 0xfc, 0x34, 0xb4, 0xa5, 0x5e, 0xc7, 0x31, 0x63, 0xf2, 0x0d, 0x88, - 0x13, 0x03, 0x6a, 0xc8, 0xcc, 0x46, 0x4c, 0xa2, 0x2a, 0x8d, 0xc4, 0x46, 0x4c, 0xa2, 0x2a, 0x55, - 0x1b, 0x31, 0x46, 0x8d, 0x9f, 0xa6, 0xc8, 0x9d, 0xf0, 0x34, 0x45, 0x9f, 0x67, 0x78, 0xe4, 0x85, - 0x9c, 0xcf, 0xd0, 0xc3, 0x67, 0x5f, 0x84, 0x52, 0x35, 0x8a, 0x9c, 0xc6, 0x1e, 0x75, 0xf1, 0x09, - 0x14, 0x25, 0x98, 0xcb, 0x11, 0x70, 0xd5, 0x55, 0xa6, 0xe2, 0x2a, 0x0f, 0x1f, 0x8e, 0x0c, 0xf0, - 0xf0, 0xe1, 0x0d, 0x18, 0x59, 0x6a, 0x3f, 0xf0, 0x58, 0x9f, 0x14, 0x93, 0xc4, 0x5e, 0x1e, 0x07, - 0xe9, 0xaf, 0xe5, 0x21, 0x88, 0xbc, 0xa5, 0x58, 0x10, 0xa3, 0x89, 0x29, 0xcf, 0xb7, 0x59, 0xb6, - 0x34, 0x24, 0xd4, 0x53, 0x34, 0x89, 0x4e, 0xde, 0x84, 0x11, 0xb9, 0x7b, 0x86, 0xc4, 0x7c, 0x17, - 0x94, 0x0e, 0x2f, 0xd1, 0x72, 0x89, 0x89, 0xdd, 0xf3, 0x3b, 0xfa, 0xdd, 0xdf, 0x31, 0x25, 0xa7, - 0x8e, 0x72, 0xf7, 0x57, 0xcb, 0xa9, 0xa3, 0xdc, 0x02, 0x8e, 0x37, 0x43, 0xa5, 0x13, 0x37, 0x43, - 0x9b, 0x50, 0x5a, 0x73, 0x82, 0xc8, 0x63, 0xcb, 0x51, 0x3b, 0xe2, 0x49, 0x5d, 0x93, 0xbd, 0xba, - 0x52, 0x94, 0xbc, 0x86, 0xd5, 0x51, 0xf0, 0xf5, 0xa4, 0x24, 0x09, 0x9c, 0xac, 0x64, 0xdc, 0x0e, - 0x11, 0x59, 0xd6, 0xf1, 0x04, 0x48, 0x4d, 0xe9, 0xcd, 0x4b, 0x55, 0x57, 0x71, 0xef, 0xc5, 0x92, - 0x5b, 0x7c, 0x0c, 0x70, 0xcf, 0x38, 0x89, 0x6c, 0x30, 0x33, 0x1c, 0xda, 0x15, 0xa9, 0x8d, 0x63, - 0x8c, 0x48, 0xbe, 0x0a, 0x25, 0xf6, 0x3f, 0x66, 0xb8, 0xf4, 0x28, 0x4f, 0xda, 0x9a, 0xdc, 0x16, - 0xd0, 0x27, 0x34, 0x4f, 0x83, 0x59, 0xa7, 0x11, 0x9f, 0xc0, 0xc8, 0x38, 0xed, 0x78, 0xd1, 0xb8, - 0x91, 0xf7, 0xa1, 0xa4, 0x66, 0xc8, 0x9d, 0x9d, 0x4a, 0xe2, 0x7b, 0x5c, 0x01, 0x4f, 0x8f, 0x92, - 0x46, 0xc0, 0xd6, 0xaf, 0x6a, 0xa7, 0x83, 0xb4, 0x44, 0x91, 0xf6, 0x4e, 0x27, 0x4d, 0x26, 0xd1, - 0xc8, 0x07, 0x50, 0xaa, 0x76, 0x3a, 0x89, 0xc6, 0x99, 0x56, 0xb6, 0x84, 0x9d, 0x8e, 0x9d, 0xa9, - 0x75, 0x34, 0x0a, 0x26, 0x58, 0xc2, 0xe0, 0xc3, 0x7a, 0x67, 0x12, 0xc1, 0x92, 0x79, 0x5f, 0xd3, - 0x82, 0xa5, 0xa0, 0x9b, 0x3f, 0x34, 0xe0, 0x7c, 0x9f, 0x6e, 0x1b, 0xf8, 0x95, 0xd7, 0x1b, 0xc9, - 0x1a, 0xac, 0xb8, 0x23, 0xc4, 0x1a, 0xac, 0x7e, 0xb4, 0x5c, 0x8d, 0xb3, 0x33, 0xcc, 0xe6, 0x3f, - 0xb5, 0x0c, 0xb3, 0xe6, 0xa1, 0x01, 0x63, 0x8a, 0x30, 0x3f, 0xc1, 0x57, 0xd5, 0xae, 0x88, 0x54, - 0xeb, 0xf9, 0x04, 0xaf, 0x95, 0x72, 0x3d, 0x60, 0x6a, 0xf5, 0xaf, 0x01, 0x2c, 0x3b, 0x61, 0x54, - 0x6d, 0x44, 0xde, 0x03, 0x3a, 0x80, 0xe6, 0x4e, 0xf2, 0x4a, 0x39, 0xf8, 0x38, 0x03, 0x23, 0xeb, - 0xc9, 0x2b, 0x15, 0x33, 0x34, 0x57, 0x60, 0xb8, 0xee, 0x07, 0x51, 0xed, 0x80, 0x2f, 0xc7, 0x0b, - 0x34, 0x6c, 0xa8, 0x4e, 0x49, 0x0f, 0xdd, 0x13, 0x0d, 0x4b, 0x14, 0x31, 0x9b, 0xf8, 0xb6, 0x47, - 0x9b, 0xae, 0x7a, 0x5a, 0xbc, 0xc3, 0x00, 0x16, 0x87, 0x5f, 0x7b, 0x1f, 0x26, 0xa5, 0x60, 0xaf, - 0x2f, 0xd7, 0xf1, 0x0b, 0x26, 0x61, 0x6c, 0x73, 0xd1, 0x5a, 0xba, 0xfd, 0x65, 0xfb, 0xf6, 0xc6, - 0xf2, 0x72, 0xf9, 0x0c, 0x19, 0x87, 0x51, 0x01, 0x98, 0xaf, 0x96, 0x0d, 0x52, 0x82, 0xe2, 0xd2, - 0x4a, 0x7d, 0x71, 0x7e, 0xc3, 0x5a, 0x2c, 0xe7, 0xae, 0xbd, 0x04, 0x13, 0x49, 0xb8, 0x10, 0xa6, - 0x14, 0x19, 0x81, 0xbc, 0x55, 0xdd, 0x2a, 0x9f, 0x21, 0x00, 0xc3, 0x6b, 0xf7, 0xe6, 0xeb, 0x37, - 0x6f, 0x96, 0x8d, 0x6b, 0x9f, 0x83, 0x29, 0x74, 0x54, 0x2e, 0xb3, 0x7d, 0x43, 0x9b, 0x06, 0x58, - 0x53, 0x09, 0x8a, 0x75, 0xda, 0x71, 0x02, 0x27, 0xa2, 0xbc, 0x9a, 0xfb, 0xdd, 0x66, 0xe4, 0x75, - 0x9a, 0xf4, 0x51, 0xd9, 0xb8, 0xf6, 0x16, 0x4c, 0x5a, 0x7e, 0x37, 0xf2, 0xda, 0xbb, 0xf2, 0x59, - 0x0a, 0x72, 0x16, 0xa6, 0x36, 0x56, 0xaa, 0xf7, 0x6b, 0x4b, 0x77, 0x36, 0x56, 0x37, 0xea, 0xf6, - 0xfd, 0xea, 0xfa, 0xfc, 0xdd, 0xf2, 0x19, 0xd6, 0xe0, 0xfb, 0xab, 0xf5, 0x75, 0xdb, 0x5a, 0x9c, - 0x5f, 0x5c, 0x59, 0x2f, 0x1b, 0xd7, 0x7e, 0xc9, 0x80, 0x09, 0xfd, 0x05, 0x71, 0x72, 0x19, 0x2e, - 0x6d, 0xd4, 0x17, 0x2d, 0x7b, 0x7d, 0xf5, 0xde, 0xe2, 0x8a, 0xbd, 0x51, 0xaf, 0xde, 0x59, 0xb4, - 0x37, 0x56, 0xea, 0x6b, 0x8b, 0xf3, 0x4b, 0xb7, 0x97, 0x16, 0x17, 0xca, 0x67, 0x48, 0x05, 0x9e, - 0x51, 0x30, 0xac, 0xc5, 0xf9, 0xd5, 0xcd, 0x45, 0xcb, 0x5e, 0xab, 0xd6, 0xeb, 0x5b, 0xab, 0xd6, - 0x42, 0xd9, 0x20, 0x17, 0xe1, 0x5c, 0x06, 0xc2, 0xfd, 0xdb, 0xd5, 0x72, 0xae, 0xa7, 0x6c, 0x65, - 0x71, 0xab, 0xba, 0x6c, 0xd7, 0x56, 0xd7, 0xcb, 0xf9, 0x6b, 0xef, 0x33, 0xc3, 0x2b, 0x79, 0x7b, - 0x8f, 0x14, 0xa1, 0xb0, 0xb2, 0xba, 0xb2, 0x58, 0x3e, 0x43, 0xc6, 0x60, 0x64, 0x6d, 0x71, 0x65, - 0x61, 0x69, 0xe5, 0x0e, 0xef, 0xd6, 0xea, 0xda, 0x9a, 0xb5, 0xba, 0xb9, 0xb8, 0x50, 0xce, 0xb1, - 0xbe, 0x5b, 0x58, 0x5c, 0x61, 0x2d, 0xcb, 0x5f, 0x33, 0xf9, 0xb3, 0x2f, 0x5a, 0x4a, 0x7f, 0xd6, - 0x5b, 0x8b, 0x5f, 0x5a, 0x5f, 0x5c, 0xa9, 0x2f, 0xad, 0xae, 0x94, 0xcf, 0x5c, 0xbb, 0x94, 0xc2, - 0x91, 0x23, 0x51, 0xaf, 0xdf, 0x2d, 0x9f, 0xb9, 0xf6, 0x55, 0x28, 0xa9, 0x76, 0x07, 0x39, 0x0f, - 0xd3, 0xea, 0xef, 0x35, 0xda, 0x76, 0xbd, 0xf6, 0x6e, 0xf9, 0x4c, 0xba, 0xc0, 0xea, 0xb6, 0xdb, - 0xac, 0x00, 0x3f, 0x5e, 0x2d, 0x58, 0xa7, 0x41, 0xcb, 0x6b, 0x33, 0x93, 0xa2, 0x9c, 0xab, 0x95, - 0xbf, 0xf7, 0xe7, 0xcf, 0x9d, 0xf9, 0xde, 0x0f, 0x9e, 0x33, 0xfe, 0xf4, 0x07, 0xcf, 0x19, 0xff, - 0xf3, 0x07, 0xcf, 0x19, 0xdb, 0xc3, 0x28, 0xe8, 0xb7, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x8c, 0x17, 0x2b, 0x03, 0x96, 0xc5, 0x00, 0x00, + // 12717 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x6f, 0x6c, 0x1c, 0x49, + 0x76, 0x18, 0xae, 0x9e, 0x19, 0x92, 0xc3, 0xc7, 0x21, 0x39, 0x2c, 0x52, 0x12, 0xa5, 0xd5, 0xee, + 0xe8, 0x7a, 0x77, 0xb5, 0x5a, 0xed, 0xae, 0x74, 0xa2, 0x6e, 0xf7, 0xbc, 0xb7, 0x7f, 0x67, 0x48, + 0x4a, 0xe2, 0x8a, 0x22, 0xb9, 0x3d, 0xfc, 0x73, 0xe7, 0xbb, 0x75, 0xbb, 0x39, 0x5d, 0x24, 0x7b, + 0x39, 0x33, 0x3d, 0xd7, 0xdd, 0x23, 0x89, 0xf6, 0xcf, 0xb0, 0x8d, 0x1f, 0x2e, 0x86, 0x61, 0xf8, + 0xce, 0x17, 0x9c, 0x63, 0x3b, 0x70, 0x60, 0xc7, 0x88, 0x93, 0x38, 0xc1, 0x19, 0x81, 0x1d, 0x20, + 0x09, 0x12, 0x38, 0x31, 0x10, 0x18, 0x87, 0x20, 0x41, 0xfc, 0x2d, 0xf0, 0x25, 0x60, 0xe2, 0x3b, + 0x7f, 0x22, 0x10, 0x20, 0x80, 0x3f, 0xf9, 0x12, 0x03, 0x41, 0xbd, 0xaa, 0xea, 0xae, 0xea, 0xe9, + 0x21, 0x87, 0x2b, 0x2d, 0x62, 0xed, 0x27, 0x72, 0x5e, 0xbd, 0xf7, 0xaa, 0xba, 0xea, 0xd5, 0xab, + 0x57, 0xaf, 0x5e, 0xbd, 0x82, 0xb1, 0xe8, 0xa0, 0x43, 0xc3, 0xeb, 0x9d, 0xc0, 0x8f, 0x7c, 0x32, + 0x84, 0x3f, 0x2e, 0xce, 0xec, 0xfa, 0xbb, 0x3e, 0x42, 0x6e, 0xb0, 0xff, 0x78, 0xe1, 0xc5, 0xca, + 0xae, 0xef, 0xef, 0x36, 0xe9, 0x0d, 0xfc, 0xb5, 0xdd, 0xdd, 0xb9, 0x11, 0x79, 0x2d, 0x1a, 0x46, + 0x4e, 0xab, 0x23, 0x10, 0xe6, 0x77, 0xbd, 0x68, 0xaf, 0xbb, 0x7d, 0xbd, 0xe1, 0xb7, 0x6e, 0xec, + 0x06, 0xce, 0x03, 0x2f, 0x72, 0x22, 0xcf, 0x6f, 0x3b, 0xcd, 0x1b, 0x11, 0x6d, 0xd2, 0x8e, 0x1f, + 0x44, 0x37, 0x9c, 0x8e, 0x77, 0x03, 0xeb, 0xb8, 0xf1, 0x30, 0x70, 0x3a, 0x1d, 0x1a, 0x24, 0xff, + 0x70, 0x26, 0xe6, 0xdf, 0xcf, 0xc3, 0xe8, 0x3d, 0x4a, 0x3b, 0xd5, 0xa6, 0xf7, 0x80, 0x92, 0xe7, + 0xa1, 0xb0, 0xe2, 0xb4, 0xe8, 0xac, 0x71, 0xd9, 0xb8, 0x3a, 0x5a, 0x9b, 0x3c, 0x3a, 0xac, 0x8c, + 0x85, 0x34, 0x78, 0x40, 0x03, 0xbb, 0xed, 0xb4, 0xa8, 0x85, 0x85, 0xe4, 0x15, 0x18, 0x65, 0x7f, + 0xc3, 0x8e, 0xd3, 0xa0, 0xb3, 0x39, 0xc4, 0x1c, 0x3f, 0x3a, 0xac, 0x8c, 0xb6, 0x25, 0xd0, 0x4a, + 0xca, 0xc9, 0x15, 0x18, 0x59, 0xa6, 0x4e, 0x48, 0x97, 0x16, 0x66, 0xf3, 0x97, 0x8d, 0xab, 0xf9, + 0x5a, 0xe9, 0xe8, 0xb0, 0x52, 0x6c, 0x32, 0x90, 0xed, 0xb9, 0x96, 0x2c, 0x24, 0x4b, 0x30, 0xb2, + 0xf8, 0xa8, 0xe3, 0x05, 0x34, 0x9c, 0x2d, 0x5c, 0x36, 0xae, 0x8e, 0xcd, 0x5d, 0xbc, 0xce, 0xbf, + 0xff, 0xba, 0xfc, 0xfe, 0xeb, 0xeb, 0xf2, 0xfb, 0x6b, 0xd3, 0xdf, 0x3b, 0xac, 0x9c, 0x39, 0x3a, + 0xac, 0x8c, 0x50, 0x4e, 0xf2, 0x2b, 0xff, 0xbd, 0x62, 0x58, 0x92, 0x9e, 0xbc, 0x0d, 0x85, 0xf5, + 0x83, 0x0e, 0x9d, 0x1d, 0xbd, 0x6c, 0x5c, 0x9d, 0x98, 0x7b, 0xee, 0x3a, 0xef, 0xf1, 0xf8, 0x23, + 0x93, 0xff, 0x18, 0x56, 0xad, 0x78, 0x74, 0x58, 0x29, 0x30, 0x14, 0x0b, 0xa9, 0xc8, 0x6b, 0x30, + 0x7c, 0xd7, 0x0f, 0xa3, 0xa5, 0x85, 0x59, 0xc0, 0x4f, 0x3b, 0x7b, 0x74, 0x58, 0x99, 0xda, 0xf3, + 0xc3, 0xc8, 0xf6, 0xdc, 0x57, 0xfd, 0x96, 0x17, 0xd1, 0x56, 0x27, 0x3a, 0xb0, 0x04, 0x92, 0xb9, + 0x0d, 0xe3, 0x1a, 0x3f, 0x32, 0x06, 0x23, 0x1b, 0x2b, 0xf7, 0x56, 0x56, 0xb7, 0x56, 0xca, 0x67, + 0x48, 0x11, 0x0a, 0x2b, 0xab, 0x0b, 0x8b, 0x65, 0x83, 0x8c, 0x40, 0xbe, 0xba, 0xb6, 0x56, 0xce, + 0x91, 0x12, 0x14, 0x17, 0xaa, 0xeb, 0xd5, 0x5a, 0xb5, 0xbe, 0x58, 0xce, 0x93, 0x69, 0x98, 0xdc, + 0x5a, 0x5a, 0x59, 0x58, 0xdd, 0xaa, 0xdb, 0x0b, 0x8b, 0xf5, 0x7b, 0xeb, 0xab, 0x6b, 0xe5, 0x02, + 0x99, 0x00, 0xb8, 0xb7, 0x51, 0x5b, 0xb4, 0x56, 0x16, 0xd7, 0x17, 0xeb, 0xe5, 0x21, 0xf3, 0x17, + 0xf2, 0x50, 0xbc, 0x4f, 0x23, 0xc7, 0x75, 0x22, 0x87, 0x5c, 0xd2, 0x86, 0x08, 0x5b, 0xaf, 0x8c, + 0xcd, 0xf3, 0xbd, 0x63, 0x33, 0x74, 0x74, 0x58, 0x31, 0x5e, 0x53, 0xc7, 0xe4, 0x2d, 0x18, 0x5b, + 0xa0, 0x61, 0x23, 0xf0, 0x3a, 0x4c, 0x5e, 0x70, 0x5c, 0x46, 0x6b, 0x17, 0x8e, 0x0e, 0x2b, 0x67, + 0xdd, 0x04, 0xac, 0x7c, 0xab, 0x8a, 0x4d, 0x96, 0x60, 0x78, 0xd9, 0xd9, 0xa6, 0xcd, 0x70, 0x76, + 0xe8, 0x72, 0xfe, 0xea, 0xd8, 0xdc, 0x33, 0xa2, 0x7f, 0x65, 0x03, 0xaf, 0xf3, 0xd2, 0xc5, 0x76, + 0x14, 0x1c, 0xd4, 0x66, 0x8e, 0x0e, 0x2b, 0xe5, 0x26, 0x02, 0xd4, 0xbe, 0xe3, 0x28, 0xa4, 0x9e, + 0x8c, 0xf9, 0xf0, 0x89, 0x63, 0xfe, 0xec, 0xf7, 0x0e, 0x2b, 0x06, 0x1b, 0x0b, 0x31, 0xe6, 0x09, + 0x3f, 0x7d, 0xf4, 0x2f, 0x43, 0x6e, 0x69, 0x61, 0x76, 0x04, 0x65, 0xad, 0x7c, 0x74, 0x58, 0x29, + 0x69, 0xc3, 0x96, 0x5b, 0x5a, 0xb8, 0xf8, 0x26, 0x8c, 0x29, 0x6d, 0x24, 0x65, 0xc8, 0xef, 0xd3, + 0x03, 0xde, 0x9f, 0x16, 0xfb, 0x97, 0xcc, 0xc0, 0xd0, 0x03, 0xa7, 0xd9, 0x15, 0x1d, 0x68, 0xf1, + 0x1f, 0x5f, 0xca, 0xfd, 0x98, 0x61, 0xfe, 0xed, 0x02, 0x14, 0x2d, 0x9f, 0xcf, 0x33, 0xf2, 0x32, + 0x0c, 0xd5, 0x23, 0x27, 0x92, 0x43, 0x31, 0x7d, 0x74, 0x58, 0x99, 0x0c, 0x19, 0x40, 0xa9, 0x8f, + 0x63, 0x30, 0xd4, 0xb5, 0x3d, 0x27, 0x94, 0x43, 0x82, 0xa8, 0x1d, 0x06, 0x50, 0x51, 0x11, 0x83, + 0x5c, 0x81, 0xc2, 0x7d, 0xdf, 0xa5, 0x62, 0x54, 0xc8, 0xd1, 0x61, 0x65, 0xa2, 0xe5, 0xbb, 0x2a, + 0x22, 0x96, 0x93, 0x57, 0x61, 0x74, 0xbe, 0x1b, 0x04, 0xb4, 0xcd, 0x44, 0xb5, 0x80, 0xc8, 0x13, + 0x47, 0x87, 0x15, 0x68, 0x70, 0x20, 0x9b, 0x5c, 0x09, 0x02, 0xeb, 0xea, 0x7a, 0xe4, 0x04, 0x11, + 0x75, 0x67, 0x87, 0x06, 0xea, 0x6a, 0x36, 0xbd, 0xa6, 0x42, 0x4e, 0x92, 0xee, 0x6a, 0xc1, 0x89, + 0xdc, 0x85, 0xb1, 0x3b, 0x81, 0xd3, 0xa0, 0x6b, 0x34, 0xf0, 0x7c, 0x17, 0xc7, 0x30, 0x5f, 0xbb, + 0x72, 0x74, 0x58, 0x39, 0xb7, 0xcb, 0xc0, 0x76, 0x07, 0xe1, 0x09, 0xf5, 0x8f, 0x0e, 0x2b, 0xc5, + 0x85, 0x6e, 0x80, 0xbd, 0x67, 0xa9, 0xa4, 0xe4, 0x27, 0xd9, 0x90, 0x84, 0x11, 0x76, 0x2d, 0x75, + 0x71, 0xf4, 0x8e, 0x6f, 0xa2, 0x29, 0x9a, 0x78, 0xae, 0xe9, 0x84, 0x91, 0x1d, 0x70, 0xba, 0x54, + 0x3b, 0x55, 0x96, 0x64, 0x15, 0x8a, 0xf5, 0xc6, 0x1e, 0x75, 0xbb, 0x4d, 0x3a, 0x5b, 0x44, 0xf6, + 0xe7, 0x85, 0xe0, 0xca, 0xf1, 0x94, 0xc5, 0xb5, 0x8b, 0x82, 0x37, 0x09, 0x05, 0x44, 0xe9, 0xfb, + 0x98, 0xc9, 0x97, 0x8a, 0xbf, 0xfe, 0xdb, 0x95, 0x33, 0x3f, 0xf7, 0xdf, 0x2e, 0x9f, 0x31, 0xff, + 0x45, 0x0e, 0xca, 0x69, 0x26, 0x64, 0x07, 0xc6, 0x37, 0x3a, 0xae, 0x13, 0xd1, 0xf9, 0xa6, 0x47, + 0xdb, 0x51, 0x88, 0x42, 0x72, 0xfc, 0x37, 0xbd, 0x20, 0xea, 0x9d, 0xed, 0x22, 0xa1, 0xdd, 0xe0, + 0x94, 0xa9, 0xaf, 0xd2, 0xd9, 0x26, 0xf5, 0xd4, 0x51, 0x4f, 0x87, 0x28, 0x61, 0xa7, 0xab, 0x87, + 0x6b, 0xf8, 0x3e, 0xf5, 0x08, 0xb6, 0x42, 0x80, 0xda, 0xee, 0xf6, 0x01, 0x4a, 0xe6, 0xe0, 0x02, + 0xc4, 0x48, 0x32, 0x04, 0x88, 0x81, 0xcd, 0xbf, 0x30, 0x60, 0xc2, 0xa2, 0xa1, 0xdf, 0x0d, 0x1a, + 0xf4, 0x2e, 0x75, 0x5c, 0x1a, 0x30, 0xf1, 0xbf, 0xe7, 0xb5, 0x5d, 0x31, 0xa7, 0x50, 0xfc, 0xf7, + 0xbd, 0xb6, 0x3a, 0x85, 0xb1, 0x9c, 0x7c, 0x1e, 0x46, 0xea, 0xdd, 0x6d, 0x44, 0xe5, 0x73, 0xea, + 0x1c, 0x8e, 0x58, 0x77, 0xdb, 0x4e, 0xa1, 0x4b, 0x34, 0x72, 0x03, 0x46, 0x36, 0x69, 0x10, 0x26, + 0x1a, 0x0f, 0x35, 0xfb, 0x03, 0x0e, 0x52, 0x09, 0x04, 0x16, 0xb9, 0x93, 0x68, 0x5d, 0xb1, 0x26, + 0x4d, 0xa6, 0x74, 0x5d, 0x22, 0x2a, 0x2d, 0x01, 0x51, 0x45, 0x45, 0x62, 0x99, 0xdf, 0xce, 0x41, + 0x79, 0xc1, 0x89, 0x9c, 0x6d, 0x27, 0x14, 0xfd, 0xb9, 0x79, 0x8b, 0xe9, 0x71, 0xe5, 0x43, 0x51, + 0x8f, 0xb3, 0x96, 0x7f, 0xe2, 0xcf, 0x7b, 0x31, 0xfd, 0x79, 0x63, 0x6c, 0x81, 0x14, 0x9f, 0x97, + 0x7c, 0xd4, 0x3b, 0x27, 0x7f, 0x54, 0x59, 0x7c, 0x54, 0x51, 0x7e, 0x54, 0xf2, 0x29, 0xe4, 0x1d, + 0x28, 0xd4, 0x3b, 0xb4, 0x21, 0x94, 0x88, 0xd4, 0xfd, 0xfa, 0xc7, 0x31, 0x84, 0xcd, 0x5b, 0xb5, + 0x92, 0x60, 0x53, 0x08, 0x3b, 0xb4, 0x61, 0x21, 0x99, 0x32, 0x69, 0xbe, 0x33, 0x0c, 0x33, 0x59, + 0x64, 0xe4, 0x1d, 0x7d, 0x71, 0xe2, 0xdd, 0xf3, 0x4c, 0xdf, 0xc5, 0x69, 0xd6, 0xd0, 0x97, 0xa7, + 0x6b, 0x50, 0x5c, 0x63, 0x02, 0xd9, 0xf0, 0x9b, 0xa2, 0xe7, 0x98, 0x56, 0x2c, 0x76, 0x24, 0xcc, + 0xb0, 0xe2, 0x72, 0xf2, 0x0c, 0xe4, 0x37, 0xac, 0x25, 0xd1, 0x5d, 0xa3, 0x47, 0x87, 0x95, 0x7c, + 0x37, 0xf0, 0x66, 0x0d, 0x8b, 0x41, 0xc9, 0x0d, 0x18, 0x9e, 0xaf, 0xce, 0xd3, 0x20, 0xc2, 0x6e, + 0x2a, 0xd5, 0xce, 0x33, 0x69, 0x69, 0x38, 0x76, 0x83, 0x06, 0x91, 0x56, 0xbd, 0x40, 0x23, 0xaf, + 0x40, 0xbe, 0xba, 0x55, 0x17, 0x3d, 0x03, 0xa2, 0x67, 0xaa, 0x5b, 0xf5, 0xda, 0xb8, 0xe8, 0x88, + 0xbc, 0xf3, 0x30, 0x64, 0xdc, 0xab, 0x5b, 0x75, 0x75, 0xb4, 0x86, 0x8f, 0x19, 0xad, 0xab, 0x50, + 0x64, 0x76, 0x06, 0x5b, 0xe0, 0x51, 0x29, 0x8e, 0x72, 0xf3, 0x69, 0x4f, 0xc0, 0xac, 0xb8, 0x94, + 0x3c, 0x1f, 0x9b, 0x2d, 0xc5, 0x84, 0x9f, 0x30, 0x5b, 0xa4, 0xb1, 0x42, 0x1e, 0xc1, 0xf8, 0xc2, + 0x41, 0xdb, 0x69, 0x79, 0x0d, 0xb1, 0x84, 0x8f, 0xe2, 0x12, 0x7e, 0xfd, 0x98, 0x61, 0xbc, 0xae, + 0x11, 0xf0, 0x55, 0x5d, 0x2a, 0xdf, 0x59, 0x97, 0x97, 0xd9, 0xe9, 0x15, 0x7e, 0xd6, 0xb0, 0xf4, + 0x8a, 0xd8, 0x5c, 0x92, 0x2a, 0x12, 0xed, 0xaa, 0x44, 0xec, 0x24, 0x38, 0x99, 0x4b, 0x81, 0x80, + 0xa8, 0x73, 0x29, 0x5e, 0x74, 0xdf, 0x81, 0xfc, 0x9d, 0xf9, 0xb5, 0xd9, 0x31, 0xe4, 0x41, 0x04, + 0x8f, 0x3b, 0xf3, 0x6b, 0xf3, 0x4d, 0xbf, 0xeb, 0xd6, 0x3f, 0x5c, 0xae, 0x9d, 0x17, 0x6c, 0xc6, + 0x77, 0x1b, 0x1d, 0xad, 0x45, 0x8c, 0x8e, 0x2c, 0x42, 0x51, 0x7e, 0xe5, 0x6c, 0x09, 0x79, 0x4c, + 0xa5, 0x3e, 0x7e, 0xf3, 0x16, 0x9f, 0x6b, 0xae, 0xf8, 0xad, 0xb6, 0x42, 0xe2, 0x5c, 0xdc, 0x02, + 0xd2, 0xdb, 0x2f, 0x19, 0x96, 0xc4, 0x2b, 0xaa, 0x25, 0x31, 0x36, 0x77, 0x56, 0xd4, 0x35, 0xef, + 0xb7, 0x5a, 0x4e, 0xdb, 0x45, 0xda, 0xcd, 0x39, 0xd5, 0xc0, 0xa8, 0xc2, 0x44, 0xd2, 0x90, 0x65, + 0x2f, 0x8c, 0xc8, 0x0d, 0x18, 0x95, 0x10, 0xb6, 0x88, 0xe4, 0x33, 0x9b, 0x6c, 0x25, 0x38, 0xe6, + 0x9f, 0xe4, 0x00, 0x92, 0x92, 0xa7, 0x54, 0xcf, 0x7c, 0x51, 0xd3, 0x33, 0x67, 0xd3, 0x02, 0xda, + 0x57, 0xc3, 0x90, 0xf7, 0x60, 0x98, 0x99, 0x5c, 0x5d, 0x69, 0x52, 0x9e, 0x4f, 0x93, 0x62, 0xe1, + 0xe6, 0xad, 0xda, 0x84, 0x20, 0x1e, 0x0e, 0x11, 0x62, 0x09, 0x32, 0x45, 0x45, 0xfd, 0xc1, 0x50, + 0x32, 0x18, 0x42, 0x39, 0x5d, 0x55, 0xb4, 0x8b, 0x91, 0xcc, 0x47, 0xa9, 0x5d, 0x14, 0xdd, 0x72, + 0x81, 0xeb, 0x16, 0xde, 0xa9, 0x23, 0x42, 0xb7, 0xa4, 0x35, 0x0b, 0xef, 0xc0, 0x13, 0x35, 0x4b, + 0x27, 0x3d, 0x6d, 0x0b, 0x28, 0x06, 0x57, 0x33, 0x7b, 0x25, 0x6b, 0xc2, 0x5e, 0x3e, 0x69, 0xc2, + 0xa6, 0xa7, 0xeb, 0xad, 0x7e, 0xba, 0xec, 0xac, 0x9c, 0x5d, 0xce, 0x43, 0x95, 0x1c, 0x75, 0xda, + 0x5b, 0x7c, 0x6a, 0x0e, 0xf7, 0x9d, 0x9a, 0x67, 0x33, 0xa7, 0x26, 0x9f, 0x98, 0x6f, 0xc1, 0x50, + 0xf5, 0xa7, 0xba, 0x01, 0x15, 0xb6, 0x5f, 0x49, 0xd6, 0xc9, 0x60, 0xf1, 0x9c, 0x9e, 0x74, 0xd8, + 0x4f, 0xd5, 0x66, 0xc6, 0x72, 0x56, 0xf3, 0xfa, 0x72, 0x5d, 0xd8, 0x75, 0x24, 0xd5, 0x2d, 0xeb, + 0xcb, 0x4a, 0xb3, 0x23, 0xed, 0xab, 0x19, 0x15, 0xb9, 0x01, 0xb9, 0xea, 0x02, 0x6e, 0x16, 0xc7, + 0xe6, 0x46, 0x65, 0xb5, 0x0b, 0xb5, 0x19, 0x41, 0x52, 0x72, 0xb4, 0xfd, 0x43, 0x75, 0x81, 0xd4, + 0x60, 0xe8, 0xfe, 0x41, 0xfd, 0xc3, 0x65, 0xa1, 0xc8, 0xa6, 0xa5, 0x5c, 0x33, 0xd8, 0x2a, 0xae, + 0x42, 0x61, 0xd2, 0xe2, 0xd6, 0x41, 0xf8, 0xf5, 0xa6, 0xda, 0x62, 0x44, 0xfb, 0xf4, 0x14, 0xc8, + 0x3f, 0x33, 0x14, 0x5b, 0x43, 0xc8, 0x3a, 0xdb, 0xd3, 0x0a, 0x89, 0x33, 0x12, 0xcb, 0xa7, 0x47, + 0xe2, 0x62, 0x79, 0x7b, 0x99, 0x8f, 0x7e, 0xae, 0x67, 0xf4, 0xc7, 0x94, 0x95, 0x8c, 0x8f, 0x79, + 0xdc, 0x17, 0xf9, 0x4f, 0xdc, 0x17, 0xe6, 0x1f, 0xe5, 0xb0, 0x3e, 0xf2, 0x2a, 0x0c, 0x5b, 0x74, + 0x37, 0x59, 0xf4, 0x71, 0xf3, 0x18, 0x20, 0x44, 0x6d, 0x24, 0xc7, 0xc1, 0x15, 0x85, 0xba, 0xe1, + 0x9e, 0xb7, 0x13, 0x89, 0x96, 0xc6, 0x2b, 0x8a, 0x00, 0x2b, 0x2b, 0x8a, 0x80, 0x68, 0x2b, 0x8a, + 0x80, 0x31, 0x59, 0xb7, 0x16, 0xea, 0xe2, 0x03, 0xe4, 0xd7, 0x5a, 0x0b, 0x8a, 0xd0, 0x04, 0xae, + 0x26, 0x34, 0xd6, 0x42, 0x9d, 0xbc, 0x01, 0xa3, 0xd5, 0x46, 0xc3, 0xef, 0x2a, 0xbb, 0xaf, 0xd9, + 0xa3, 0xc3, 0xca, 0x8c, 0xc3, 0x81, 0xba, 0xaf, 0x20, 0x41, 0x25, 0x75, 0x18, 0x5b, 0x64, 0x5b, + 0x16, 0x6f, 0xde, 0x69, 0xec, 0x51, 0x31, 0xc1, 0xa4, 0xc4, 0x2a, 0x25, 0xb1, 0x09, 0x7d, 0x96, + 0x22, 0xb0, 0xc1, 0x80, 0xea, 0x96, 0x5c, 0xc1, 0x35, 0x6b, 0x49, 0x57, 0xb0, 0x86, 0xcd, 0x37, + 0xbb, 0x61, 0x44, 0x83, 0xa5, 0x05, 0xd1, 0x8f, 0xd8, 0xb0, 0x06, 0x07, 0xa6, 0x1a, 0x16, 0xa3, + 0x9a, 0xff, 0xd5, 0xc0, 0x6e, 0x20, 0x6f, 0x02, 0x2c, 0xb5, 0x99, 0xd9, 0xde, 0xa0, 0x31, 0x03, + 0x74, 0x0d, 0x78, 0x02, 0xaa, 0x73, 0x50, 0x90, 0xf5, 0xaa, 0x73, 0x03, 0x57, 0xcd, 0xaa, 0x94, + 0x9b, 0x00, 0xe1, 0x25, 0x12, 0x55, 0x06, 0x02, 0x9a, 0xaa, 0x32, 0x41, 0x26, 0x57, 0x60, 0x64, + 0xa9, 0x7a, 0xbf, 0xda, 0x8d, 0xf6, 0x70, 0x10, 0x8a, 0x5c, 0x1d, 0x7b, 0x4e, 0xcb, 0x76, 0xba, + 0xd1, 0x9e, 0x25, 0x0b, 0xcd, 0xff, 0x90, 0xd3, 0xfa, 0x9d, 0x58, 0x40, 0x2c, 0xda, 0x69, 0x7a, + 0x0d, 0x34, 0x2a, 0xee, 0x04, 0x7e, 0xb7, 0x13, 0x7f, 0xad, 0x79, 0x74, 0x58, 0x79, 0x2e, 0x48, + 0x4a, 0xed, 0x5d, 0x56, 0xac, 0xb7, 0x21, 0x83, 0x9a, 0xbc, 0x0f, 0xa5, 0x8d, 0x90, 0x06, 0xe2, + 0x27, 0xdb, 0x88, 0xe5, 0xaf, 0x8e, 0xd6, 0x2e, 0xe1, 0x46, 0x2b, 0xa4, 0x41, 0xcc, 0x46, 0x95, + 0x25, 0x8d, 0x82, 0xb8, 0x30, 0xbb, 0x1e, 0x38, 0xed, 0xd0, 0x8b, 0x16, 0xdb, 0x8d, 0xe0, 0x00, + 0xa7, 0xcf, 0x62, 0xdb, 0xd9, 0x6e, 0x52, 0x17, 0xbb, 0xa5, 0x58, 0xbb, 0x7a, 0x74, 0x58, 0x79, + 0x21, 0xe2, 0x38, 0x36, 0x8d, 0x91, 0x6c, 0xca, 0xb1, 0x14, 0xce, 0x7d, 0x39, 0x91, 0xf7, 0xa0, + 0xb4, 0xd8, 0x76, 0x3b, 0xbe, 0xd7, 0x8e, 0xd0, 0x4d, 0x56, 0x88, 0x2d, 0xec, 0xf3, 0x54, 0xc0, + 0x6d, 0x26, 0x8f, 0x6a, 0x33, 0x55, 0x02, 0xf3, 0xe7, 0x0c, 0x18, 0x53, 0xd4, 0x3a, 0x1b, 0xf7, + 0xb5, 0xc0, 0xff, 0x98, 0x36, 0x22, 0x5d, 0xe4, 0x3a, 0x1c, 0x98, 0x1a, 0xf7, 0x18, 0x35, 0x25, + 0x6a, 0xb9, 0x53, 0x88, 0x9a, 0x79, 0x43, 0xac, 0x16, 0x6c, 0xbb, 0xa8, 0x78, 0xc3, 0x70, 0xbb, + 0xc8, 0xcc, 0x61, 0x75, 0xbb, 0xc8, 0xca, 0xcd, 0xdf, 0x33, 0x98, 0x96, 0x27, 0x37, 0x00, 0xee, + 0xd1, 0x83, 0xc8, 0xd9, 0xbe, 0xed, 0x35, 0x35, 0x2f, 0xe7, 0x3e, 0x42, 0xed, 0x1d, 0xaf, 0x49, + 0x2d, 0x05, 0x85, 0xdc, 0x82, 0xe2, 0xbd, 0x60, 0xfb, 0x75, 0x44, 0xcf, 0xc5, 0xab, 0xf5, 0xf4, + 0x7e, 0xb0, 0xfd, 0x3a, 0x22, 0xab, 0x1a, 0x45, 0x22, 0x12, 0x13, 0x86, 0x17, 0xfc, 0x96, 0xe3, + 0x49, 0x0b, 0x09, 0x98, 0x99, 0xe1, 0x22, 0xc4, 0x12, 0x25, 0xcc, 0x3e, 0xa8, 0xaf, 0xad, 0x88, + 0xce, 0x47, 0xfb, 0x20, 0xec, 0xb4, 0x2d, 0x06, 0x33, 0xbf, 0x6b, 0xc0, 0x98, 0xb2, 0x78, 0x91, + 0x2f, 0x08, 0x8f, 0x90, 0x81, 0xfe, 0xcc, 0x73, 0xbd, 0xcb, 0x1b, 0x2b, 0xe5, 0x96, 0x5d, 0xcb, + 0x77, 0xa9, 0xf0, 0x0f, 0x25, 0x3a, 0x3f, 0x37, 0x88, 0xce, 0x7f, 0x13, 0x80, 0x9b, 0xfd, 0xd8, + 0x9d, 0xca, 0x24, 0x54, 0xfc, 0xbf, 0xea, 0x60, 0x24, 0xc8, 0xa6, 0x05, 0x25, 0x55, 0xdf, 0x93, + 0x1a, 0x8c, 0x8b, 0x5d, 0xae, 0xb0, 0x13, 0x79, 0x3f, 0xe3, 0x4c, 0x10, 0xdc, 0x7a, 0x77, 0xdd, + 0x3a, 0x89, 0xf9, 0xf3, 0x39, 0x28, 0x0a, 0xc8, 0xdc, 0x53, 0x6a, 0xc2, 0xbe, 0xae, 0x99, 0xb0, + 0x72, 0x65, 0x54, 0xf6, 0x56, 0x73, 0x27, 0x6c, 0x91, 0xdf, 0x84, 0x92, 0xec, 0x02, 0xdc, 0x09, + 0xbc, 0x0c, 0x23, 0xd2, 0xc9, 0xc3, 0xf7, 0x01, 0x93, 0x1a, 0xcf, 0xcd, 0x39, 0x4b, 0x96, 0x9b, + 0xdf, 0x1e, 0x92, 0xb4, 0xbc, 0x26, 0xd6, 0x85, 0x55, 0xd7, 0x0d, 0xd4, 0x2e, 0x74, 0x5c, 0x37, + 0xb0, 0x10, 0xca, 0x06, 0x7f, 0xad, 0xbb, 0xdd, 0xf4, 0x1a, 0x88, 0xa3, 0xcc, 0xc4, 0x0e, 0x42, + 0x6d, 0x86, 0xaa, 0x0e, 0x7e, 0x82, 0xac, 0xed, 0x50, 0xf3, 0xc7, 0xee, 0x50, 0x7f, 0x02, 0x46, + 0xe7, 0x5b, 0xae, 0x66, 0xc1, 0x9a, 0x19, 0x9d, 0x72, 0x3d, 0x46, 0xe2, 0xb6, 0xeb, 0x25, 0xd1, + 0x47, 0x33, 0x8d, 0x96, 0xdb, 0x6b, 0xb7, 0x26, 0x2c, 0xb5, 0x2d, 0xe6, 0xd0, 0xe3, 0x6c, 0x31, + 0xdf, 0x80, 0xd1, 0x8d, 0x90, 0xae, 0x77, 0xdb, 0x6d, 0xda, 0x44, 0x6b, 0xb6, 0xc8, 0xf5, 0x59, + 0x37, 0xa4, 0x76, 0x84, 0x50, 0xb5, 0x01, 0x31, 0xaa, 0x2a, 0x56, 0x23, 0xc7, 0x88, 0xd5, 0x17, + 0xa0, 0x50, 0xed, 0x74, 0xe4, 0xde, 0x3b, 0x36, 0xaf, 0x3a, 0x1d, 0x34, 0x78, 0x26, 0x9c, 0x4e, + 0x47, 0xdf, 0x49, 0x23, 0x36, 0xa1, 0x40, 0xee, 0x75, 0xb7, 0x69, 0xd0, 0xa6, 0x11, 0x0d, 0xc5, + 0xda, 0x19, 0xce, 0x02, 0xf2, 0x98, 0x95, 0x47, 0x1c, 0x69, 0x04, 0xae, 0xd5, 0xf7, 0xbb, 0xdb, + 0xd4, 0x16, 0x8b, 0xb0, 0xda, 0x77, 0x19, 0x0c, 0x2f, 0xd6, 0x61, 0x42, 0xef, 0xff, 0x27, 0x60, + 0x93, 0x7e, 0x50, 0x28, 0x16, 0xcb, 0xa3, 0xe6, 0x2f, 0xe4, 0x60, 0xac, 0xda, 0xe9, 0x3c, 0xe5, + 0x0e, 0xb0, 0x1f, 0xd3, 0x66, 0xf5, 0xb9, 0x64, 0xf4, 0x4e, 0xe1, 0xfb, 0xfa, 0x2b, 0x03, 0x26, + 0x53, 0x14, 0x6a, 0xeb, 0x8d, 0x01, 0x1d, 0x42, 0xb9, 0x01, 0x1d, 0x42, 0xf9, 0xfe, 0x0e, 0x21, + 0x75, 0xce, 0x14, 0x1e, 0x67, 0xce, 0xbc, 0x04, 0xf9, 0x6a, 0xa7, 0x23, 0x7a, 0xa5, 0x94, 0xf4, + 0xca, 0xe6, 0x2d, 0xbe, 0xb8, 0x39, 0x9d, 0x8e, 0xc5, 0x30, 0xcc, 0xd7, 0x60, 0x14, 0xc1, 0xa8, + 0xd1, 0x2e, 0x8b, 0xa9, 0xc0, 0xd5, 0x99, 0x46, 0xc6, 0xc5, 0xde, 0xfc, 0xdf, 0x06, 0x0c, 0xe1, + 0xef, 0xa7, 0x54, 0x5c, 0xe6, 0x34, 0x71, 0x29, 0x2b, 0xe2, 0x32, 0x88, 0xa0, 0xfc, 0x41, 0x1e, + 0x7b, 0x4b, 0x88, 0x88, 0x70, 0x29, 0x18, 0x19, 0x2e, 0x85, 0xc7, 0x50, 0xe0, 0xfb, 0x69, 0xe7, + 0x42, 0x1e, 0x07, 0xe3, 0xf9, 0x74, 0x53, 0x9f, 0x88, 0x5f, 0xe1, 0x2e, 0x90, 0xa5, 0x76, 0x48, + 0x1b, 0xdd, 0x80, 0xd6, 0xf7, 0xbd, 0xce, 0x26, 0x0d, 0xbc, 0x9d, 0x03, 0x61, 0xba, 0xa3, 0x8e, + 0xf5, 0x44, 0xa9, 0x1d, 0xee, 0x7b, 0x1d, 0x66, 0x26, 0x78, 0x3b, 0x07, 0x56, 0x06, 0x0d, 0x79, + 0x0f, 0x46, 0x2c, 0xfa, 0x30, 0xf0, 0x22, 0xb9, 0x89, 0x9a, 0x88, 0x77, 0x7f, 0x08, 0xe5, 0xf6, + 0x4e, 0xc0, 0x7f, 0xa8, 0xe3, 0x2f, 0xca, 0x3f, 0xbd, 0x1d, 0xf8, 0x77, 0x86, 0x70, 0x2e, 0x9c, + 0x70, 0x50, 0x7b, 0x8c, 0x7f, 0x48, 0x1f, 0xcc, 0xfc, 0x69, 0x06, 0x73, 0x13, 0x4a, 0x6c, 0xd3, + 0x9f, 0x72, 0x14, 0x5d, 0x4a, 0xc6, 0xf2, 0xba, 0x5a, 0x7c, 0xdc, 0x19, 0xad, 0xc6, 0x87, 0xd8, + 0x69, 0x21, 0xe1, 0x67, 0xbf, 0xcf, 0x2a, 0x8c, 0x33, 0xc4, 0x23, 0x56, 0x1d, 0x0d, 0xde, 0x59, + 0xa7, 0x16, 0x8c, 0xe1, 0xc7, 0x13, 0x8c, 0x91, 0x4f, 0x22, 0x18, 0xe9, 0xd3, 0xf1, 0xe2, 0x69, + 0x4e, 0xc7, 0x2f, 0xbe, 0x07, 0x53, 0x3d, 0x3d, 0x7c, 0x9a, 0x13, 0xe6, 0x4f, 0x4f, 0x2c, 0x7f, + 0x26, 0xee, 0x17, 0x32, 0x87, 0xfe, 0x02, 0x2f, 0xa0, 0x8d, 0x08, 0x55, 0xaf, 0xd0, 0x96, 0x81, + 0x80, 0xa5, 0xbc, 0x24, 0x08, 0x23, 0xef, 0xc2, 0x08, 0x3f, 0xa1, 0xe3, 0x1b, 0xdb, 0xb1, 0xb9, + 0x71, 0x51, 0x23, 0x87, 0x8a, 0x30, 0x09, 0x8e, 0xa1, 0xf6, 0xaa, 0x20, 0x32, 0xef, 0xc0, 0xb0, + 0x38, 0xe1, 0x3b, 0x7e, 0x5e, 0x54, 0x60, 0x68, 0x33, 0xe9, 0x19, 0x3c, 0x95, 0xe1, 0x1f, 0x61, + 0x71, 0xb8, 0xf9, 0x4b, 0x06, 0x4c, 0xe8, 0x5f, 0x49, 0xae, 0xc3, 0xb0, 0x38, 0x82, 0x36, 0xf0, + 0x08, 0x9a, 0x7d, 0xcd, 0x30, 0x3f, 0x7c, 0xd6, 0x8e, 0x9c, 0x05, 0x16, 0x53, 0xfd, 0x82, 0x83, + 0xd8, 0xa4, 0xa3, 0xea, 0x17, 0x42, 0x6a, 0xc9, 0x32, 0xb6, 0x8d, 0xb3, 0x68, 0xd8, 0x6d, 0x46, + 0xea, 0x36, 0x2e, 0x40, 0x88, 0x25, 0x4a, 0xcc, 0x43, 0x03, 0xa0, 0x5e, 0xbf, 0x7b, 0x8f, 0x1e, + 0xac, 0x39, 0x5e, 0x80, 0x5b, 0x61, 0x9c, 0x8d, 0xf7, 0xc4, 0x68, 0x95, 0xc4, 0x56, 0x98, 0xcf, + 0xdc, 0x7d, 0x7a, 0xa0, 0x6d, 0x85, 0x25, 0x2a, 0x4e, 0xf9, 0xc0, 0x7b, 0xe0, 0x44, 0x94, 0x11, + 0xe6, 0x90, 0x90, 0x4f, 0x79, 0x0e, 0x4d, 0x51, 0x2a, 0xc8, 0xe4, 0x23, 0x98, 0x48, 0x7e, 0xe1, + 0x86, 0x3e, 0x8f, 0xfb, 0x44, 0x29, 0x11, 0x7a, 0x61, 0xed, 0xb9, 0xa3, 0xc3, 0xca, 0x45, 0x85, + 0x6b, 0x7a, 0xab, 0x9f, 0x62, 0x66, 0xfe, 0x8e, 0x01, 0xb0, 0xbe, 0x5c, 0x97, 0x1f, 0x78, 0x05, + 0x0a, 0xb1, 0x1f, 0xb1, 0xc4, 0xf7, 0xdb, 0xa9, 0x0d, 0x25, 0x96, 0x93, 0xe7, 0x21, 0x9f, 0x7c, + 0xc9, 0xd4, 0xd1, 0x61, 0x65, 0x5c, 0xff, 0x02, 0x56, 0x4a, 0xee, 0xc0, 0xc8, 0x40, 0x6d, 0x46, + 0xe9, 0xcc, 0x68, 0xab, 0xa4, 0xc6, 0x51, 0xf8, 0x60, 0x6b, 0xfd, 0xb3, 0x3b, 0x0a, 0xdf, 0xca, + 0xc1, 0x24, 0xeb, 0xd7, 0x6a, 0x37, 0xda, 0xf3, 0x03, 0x2f, 0x3a, 0x78, 0x6a, 0x77, 0xc5, 0x6f, + 0x6b, 0x06, 0xd1, 0x45, 0xa9, 0xb6, 0xd4, 0x6f, 0x1b, 0x68, 0x73, 0xfc, 0xe7, 0x23, 0x30, 0x9d, + 0x41, 0x45, 0x5e, 0x15, 0xc1, 0x5f, 0x89, 0x1f, 0x0a, 0x83, 0xbb, 0x7e, 0x74, 0x58, 0x29, 0x49, + 0xf4, 0xf5, 0x24, 0xd8, 0x6b, 0x0e, 0xc6, 0xc4, 0xd6, 0x67, 0x25, 0xb1, 0xa8, 0x31, 0x6a, 0x48, + 0x3a, 0x2d, 0x51, 0x35, 0xa9, 0x48, 0xa4, 0x0a, 0xa5, 0xf9, 0x3d, 0xda, 0xd8, 0xf7, 0xda, 0xbb, + 0xf7, 0xe8, 0x01, 0xb7, 0x97, 0x4a, 0xb5, 0x67, 0xd9, 0x4e, 0xab, 0x21, 0xe0, 0x6c, 0x48, 0xf5, + 0x4d, 0x9c, 0x46, 0x42, 0xde, 0x85, 0xb1, 0xba, 0xb7, 0xdb, 0x96, 0x1c, 0x0a, 0xc8, 0xe1, 0xd2, + 0xd1, 0x61, 0xe5, 0x5c, 0xc8, 0xc1, 0xbd, 0x0c, 0x54, 0x02, 0xf2, 0x32, 0x0c, 0x59, 0x7e, 0x93, + 0xf2, 0x65, 0x58, 0x84, 0x13, 0x05, 0x0c, 0xa0, 0x3a, 0xd7, 0x11, 0x83, 0xdc, 0x85, 0x11, 0xf6, + 0xcf, 0x7d, 0xa7, 0x33, 0x3b, 0x8c, 0x7a, 0x9b, 0xc4, 0x06, 0x3e, 0x42, 0x3b, 0x5e, 0x7b, 0x57, + 0xb5, 0xf1, 0x9b, 0xd4, 0x6e, 0x39, 0x1d, 0x6d, 0x5d, 0xe4, 0x88, 0x64, 0x13, 0xc6, 0x12, 0x45, + 0x10, 0xce, 0x8e, 0x68, 0x47, 0x91, 0x49, 0x49, 0xed, 0x73, 0x82, 0xd9, 0xf9, 0xa8, 0x19, 0xa2, + 0x6c, 0x77, 0x18, 0xbe, 0xfe, 0x31, 0x0a, 0x23, 0x6d, 0x0f, 0x52, 0xec, 0xbf, 0x07, 0x31, 0x4e, + 0xdc, 0x83, 0xb8, 0x00, 0xa2, 0x93, 0xaa, 0xcd, 0x5d, 0x11, 0xfd, 0xf7, 0x72, 0x7f, 0x01, 0xbb, + 0x9e, 0x20, 0xe3, 0x9c, 0xe4, 0xde, 0x2e, 0xd1, 0xff, 0x4e, 0x73, 0x57, 0xf3, 0x76, 0xc5, 0xa8, + 0xac, 0x1b, 0x12, 0x55, 0x23, 0x77, 0xe0, 0xb2, 0x1b, 0x92, 0x92, 0xa4, 0x1b, 0x3e, 0x7e, 0x18, + 0xf5, 0xeb, 0x06, 0x85, 0x11, 0x59, 0x01, 0xa8, 0x36, 0x22, 0xef, 0x01, 0x45, 0x91, 0x18, 0xd3, + 0x3a, 0x62, 0xbe, 0x7a, 0x8f, 0x1e, 0xd4, 0x69, 0x94, 0x9c, 0x0a, 0x38, 0x88, 0x9a, 0x12, 0x13, + 0x4b, 0xe1, 0x40, 0x3a, 0x70, 0xb6, 0xea, 0xba, 0x1e, 0x8f, 0x08, 0x5d, 0x0f, 0x98, 0xfc, 0xba, + 0xc8, 0xba, 0x94, 0xcd, 0xfa, 0x65, 0xc1, 0xfa, 0x73, 0x4e, 0x4c, 0x65, 0x47, 0x9c, 0x2c, 0x5d, + 0x4d, 0x36, 0x63, 0x73, 0x15, 0x26, 0xf4, 0x2e, 0xd5, 0x63, 0x21, 0x4b, 0x50, 0xb4, 0xea, 0x55, + 0xbb, 0x7e, 0xb7, 0x7a, 0xb3, 0x6c, 0x90, 0x32, 0x94, 0xc4, 0xaf, 0x39, 0x7b, 0xee, 0xf5, 0x37, + 0xca, 0x39, 0x0d, 0xf2, 0xfa, 0xcd, 0xb9, 0x72, 0xde, 0xfc, 0x03, 0x03, 0x8a, 0xb2, 0x7d, 0xe4, + 0x0d, 0xc8, 0xd7, 0xeb, 0x77, 0x53, 0x27, 0xe0, 0xc9, 0xd2, 0xcb, 0x17, 0x99, 0x30, 0xdc, 0x53, + 0x17, 0x99, 0x7a, 0xfd, 0x2e, 0xa3, 0x5b, 0x5f, 0xae, 0x0b, 0xa3, 0x25, 0x43, 0x5c, 0xa7, 0xfa, + 0x1c, 0x0b, 0xbe, 0x01, 0xf9, 0x0f, 0xb6, 0xd6, 0xc5, 0x6e, 0x28, 0x63, 0x7c, 0x91, 0xee, 0xe3, + 0x87, 0xea, 0xd2, 0xc7, 0x08, 0x4c, 0x0b, 0xc6, 0x94, 0xa9, 0xc5, 0x8d, 0x88, 0x96, 0x1f, 0x47, + 0x09, 0x0a, 0x23, 0x82, 0x41, 0x2c, 0x51, 0xc2, 0x6c, 0x9e, 0x65, 0xbf, 0xe1, 0x34, 0x85, 0x35, + 0x82, 0x36, 0x4f, 0x93, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xd8, 0x80, 0xf2, 0x5a, 0xe0, 0x3f, 0xf0, + 0x98, 0x06, 0x5e, 0xf7, 0xf7, 0x69, 0x7b, 0xf3, 0x26, 0x79, 0x4d, 0x2a, 0x01, 0x6e, 0xc2, 0x9d, + 0x67, 0x54, 0xa8, 0x04, 0x7e, 0x74, 0x58, 0x81, 0xfa, 0x41, 0x18, 0xd1, 0x16, 0x2b, 0x97, 0x8a, + 0x40, 0x09, 0xb6, 0xcc, 0x0d, 0x1e, 0xc0, 0x75, 0x42, 0xb0, 0x65, 0x05, 0x86, 0xb0, 0x39, 0x4a, + 0x0c, 0xcd, 0x50, 0xc4, 0x00, 0x16, 0x87, 0x2b, 0x0a, 0xfb, 0xdb, 0xb9, 0x9e, 0x6f, 0x98, 0xfb, + 0x4c, 0x05, 0x41, 0xe9, 0x1f, 0x37, 0xd0, 0x22, 0xf6, 0x15, 0x98, 0x49, 0x77, 0x09, 0xfa, 0x45, + 0xaa, 0x30, 0xa9, 0xc3, 0xa5, 0x8b, 0xe4, 0x7c, 0x66, 0x5d, 0x9b, 0x73, 0x56, 0x1a, 0xdf, 0xfc, + 0x81, 0x01, 0xa3, 0xf8, 0xaf, 0xd5, 0x6d, 0x52, 0x66, 0xd9, 0x54, 0xb7, 0xea, 0xe2, 0x18, 0x52, + 0x3d, 0xd5, 0x73, 0x1e, 0x86, 0xb6, 0x38, 0xb3, 0xd4, 0xf4, 0x48, 0x8c, 0x2c, 0x48, 0xf9, 0xa1, + 0xab, 0x3c, 0xd4, 0x8a, 0x49, 0xf9, 0xe9, 0x6c, 0x98, 0x22, 0x15, 0xc8, 0x6c, 0xfc, 0xd8, 0x2f, + 0xbf, 0x29, 0x5d, 0xc3, 0x38, 0x7e, 0x48, 0xe7, 0x6b, 0x47, 0x27, 0x12, 0x8d, 0xbc, 0x06, 0xc3, + 0xac, 0x6a, 0x4b, 0x1e, 0x8c, 0xe0, 0xae, 0x02, 0xdb, 0x18, 0x68, 0x67, 0xc0, 0x1c, 0xc9, 0xfc, + 0x97, 0xb9, 0x74, 0x07, 0x0a, 0x2b, 0xe0, 0x94, 0x73, 0xe3, 0x2d, 0x18, 0xaa, 0x36, 0x9b, 0xfe, + 0x43, 0xa1, 0x25, 0xa4, 0x9b, 0x26, 0xee, 0x3f, 0xbe, 0xc2, 0x3a, 0x0c, 0x45, 0x0b, 0x3e, 0x60, + 0x00, 0x32, 0x0f, 0xa3, 0xd5, 0xad, 0xfa, 0xd2, 0xd2, 0xc2, 0xfa, 0xfa, 0xb2, 0x88, 0x71, 0x7f, + 0x51, 0xf6, 0x8f, 0xe7, 0xb9, 0x76, 0x14, 0x35, 0xfb, 0x84, 0xc0, 0x26, 0x74, 0xe4, 0x1d, 0x80, + 0x0f, 0x7c, 0xaf, 0x7d, 0x9f, 0x46, 0x7b, 0xbe, 0x2b, 0x3e, 0x9e, 0x99, 0x14, 0x63, 0x1f, 0xfb, + 0x5e, 0xdb, 0x6e, 0x21, 0x98, 0xb5, 0x3d, 0x41, 0xb2, 0x94, 0xff, 0x59, 0x4f, 0xd7, 0xfc, 0x08, + 0x6d, 0x98, 0xa1, 0xa4, 0xa7, 0xb7, 0xfd, 0x28, 0x7d, 0x6e, 0x23, 0xd1, 0xcc, 0x5f, 0xce, 0xc1, + 0x04, 0xdf, 0xa9, 0x72, 0x81, 0x79, 0x6a, 0x27, 0xe3, 0x5b, 0xda, 0x64, 0xbc, 0x20, 0x17, 0x06, + 0xe5, 0xd3, 0x06, 0x9a, 0x8a, 0x7b, 0x40, 0x7a, 0x69, 0x88, 0x25, 0xfd, 0x29, 0x83, 0xcc, 0xc2, + 0x9b, 0x49, 0xc4, 0x40, 0x88, 0x44, 0x36, 0xaa, 0xc2, 0xd0, 0xd2, 0x78, 0x98, 0xbf, 0x94, 0x83, + 0x71, 0xc5, 0x9e, 0x7c, 0x6a, 0x3b, 0xfe, 0x4b, 0x5a, 0xc7, 0xcb, 0x33, 0x08, 0xe5, 0xcb, 0x06, + 0xea, 0xf7, 0x2e, 0x4c, 0xf5, 0x90, 0xa4, 0xcd, 0x72, 0x63, 0x10, 0xb3, 0xfc, 0xd5, 0xde, 0xe8, + 0x03, 0x1e, 0x0f, 0x1f, 0x47, 0x1f, 0xa8, 0xe1, 0x0e, 0xdf, 0xca, 0xc1, 0x8c, 0xf8, 0x55, 0xed, + 0xba, 0x5e, 0x34, 0xef, 0xb7, 0x77, 0xbc, 0xdd, 0xa7, 0x76, 0x2c, 0xaa, 0xda, 0x58, 0x54, 0xf4, + 0xb1, 0x50, 0x3e, 0xb0, 0xff, 0x90, 0x98, 0xff, 0xa6, 0x08, 0xb3, 0xfd, 0x08, 0xd8, 0xb6, 0x5f, + 0xd9, 0x55, 0xe1, 0xb6, 0x3f, 0xb5, 0x63, 0xe5, 0xfb, 0xa9, 0x24, 0x84, 0x27, 0x37, 0x40, 0x08, + 0xcf, 0x32, 0x94, 0xb1, 0xaa, 0x3a, 0x0d, 0x59, 0x27, 0x84, 0x49, 0x30, 0xee, 0xe5, 0xa3, 0xc3, + 0xca, 0x25, 0x87, 0x95, 0xd9, 0xa1, 0x28, 0xb4, 0xbb, 0x81, 0xa7, 0xf0, 0xe8, 0xa1, 0x24, 0xbf, + 0x63, 0xc0, 0x04, 0x02, 0x17, 0x1f, 0xd0, 0x76, 0x84, 0xcc, 0x0a, 0xe2, 0x90, 0x26, 0xbe, 0xf3, + 0x54, 0x8f, 0x02, 0xaf, 0xbd, 0x8b, 0x8e, 0xa4, 0xb0, 0xb6, 0xcd, 0x7a, 0xe1, 0xfb, 0x87, 0x95, + 0xb7, 0x3f, 0xc9, 0x3d, 0x2a, 0xc1, 0x2a, 0x64, 0x1b, 0x79, 0xde, 0x50, 0x8a, 0xd5, 0xa6, 0x9a, + 0x99, 0x6a, 0x11, 0xf9, 0x71, 0x38, 0xcf, 0xe3, 0x30, 0xe6, 0xfd, 0x76, 0xe4, 0xb5, 0xbb, 0x7e, + 0x37, 0xac, 0x39, 0x8d, 0xfd, 0x6e, 0x27, 0x14, 0xce, 0x4e, 0xfc, 0xf2, 0x46, 0x5c, 0x68, 0x6f, + 0xf3, 0x52, 0x85, 0x65, 0x3f, 0x06, 0xe4, 0x2e, 0x4c, 0xf1, 0xa2, 0x6a, 0x37, 0xf2, 0xeb, 0x0d, + 0xa7, 0xe9, 0xb5, 0x77, 0xd1, 0x07, 0x5a, 0xac, 0x5d, 0x64, 0x7b, 0x4b, 0xa7, 0x1b, 0xf9, 0x76, + 0xc8, 0xe1, 0x0a, 0xbf, 0x5e, 0x22, 0xb2, 0x04, 0x93, 0x16, 0x75, 0xdc, 0xfb, 0xce, 0xa3, 0x79, + 0xa7, 0xe3, 0x34, 0xbc, 0xe8, 0x00, 0x77, 0x66, 0xf9, 0x5a, 0xe5, 0xe8, 0xb0, 0xf2, 0x4c, 0x40, + 0x1d, 0xd7, 0x6e, 0x39, 0x8f, 0xec, 0x86, 0x28, 0x54, 0x98, 0xa5, 0xe9, 0x62, 0x56, 0x5e, 0x3b, + 0x66, 0x35, 0x9a, 0x66, 0xe5, 0xb5, 0xfb, 0xb3, 0x4a, 0xe8, 0x24, 0xab, 0x75, 0x27, 0xd8, 0xa5, + 0x11, 0x77, 0x12, 0xc2, 0x65, 0xe3, 0xaa, 0xa1, 0xb0, 0x8a, 0xb0, 0xcc, 0x46, 0x87, 0x61, 0x9a, + 0x95, 0x42, 0xc7, 0x24, 0x6f, 0x2b, 0xf0, 0x22, 0xaa, 0x7e, 0xe1, 0x18, 0x36, 0x0b, 0xfb, 0x1f, + 0xdd, 0xa4, 0xfd, 0x3e, 0xb1, 0x87, 0x32, 0xe1, 0xa6, 0x7c, 0x64, 0xa9, 0x87, 0x5b, 0xf6, 0x57, + 0xf6, 0x50, 0xc6, 0xdc, 0xd4, 0xef, 0x1c, 0xc7, 0xef, 0x54, 0xb8, 0xf5, 0xf9, 0xd0, 0x1e, 0x4a, + 0xb2, 0xc2, 0x3a, 0x2d, 0xa2, 0x6d, 0x26, 0xd1, 0xc2, 0x49, 0x3a, 0x81, 0x4d, 0x7b, 0x41, 0xec, + 0xa9, 0xcb, 0x81, 0x2c, 0xb6, 0x33, 0x5c, 0xa6, 0x69, 0xe2, 0x0f, 0x0a, 0xc5, 0xa1, 0xf2, 0xb0, + 0x55, 0xe6, 0x22, 0x1f, 0x31, 0xc1, 0x41, 0x5d, 0x6c, 0xfe, 0x46, 0x0e, 0x2e, 0x48, 0x75, 0x4c, + 0xa3, 0x87, 0x7e, 0xb0, 0xef, 0xb5, 0x77, 0x9f, 0x72, 0xad, 0x7a, 0x5b, 0xd3, 0xaa, 0x2f, 0xa4, + 0x56, 0xb8, 0xd4, 0x57, 0x1e, 0xa3, 0x5a, 0xff, 0x6c, 0x08, 0x9e, 0x3d, 0x96, 0x8a, 0x7c, 0xc8, + 0x56, 0x41, 0x8f, 0xb6, 0xa3, 0x25, 0xb7, 0x49, 0xd9, 0x36, 0xcc, 0xef, 0x46, 0xc2, 0x99, 0xfd, + 0xfc, 0xd1, 0x61, 0x65, 0x9a, 0x5f, 0x05, 0xb2, 0x3d, 0xb7, 0x49, 0xed, 0x88, 0x17, 0x6b, 0xc3, + 0xd4, 0x4b, 0xcd, 0x58, 0xc6, 0x17, 0x13, 0x97, 0xda, 0x11, 0x0d, 0x1e, 0x38, 0xfc, 0x46, 0x84, + 0x60, 0xb9, 0x4f, 0x69, 0xc7, 0x76, 0x58, 0xa9, 0xed, 0x89, 0x62, 0x9d, 0x65, 0x0f, 0x35, 0xb9, + 0xad, 0xb0, 0x9c, 0x67, 0x9b, 0x83, 0xfb, 0xce, 0x23, 0x61, 0xf1, 0xa2, 0x7f, 0x55, 0x61, 0xc9, + 0xa3, 0x20, 0x5b, 0xce, 0x23, 0xab, 0x97, 0x84, 0x7c, 0x04, 0x67, 0x85, 0xe2, 0x66, 0x4a, 0x2c, + 0xf0, 0x9b, 0xf2, 0x8b, 0x0b, 0xc8, 0xeb, 0xa5, 0xa3, 0xc3, 0xca, 0x79, 0xa1, 0xf6, 0xed, 0x06, + 0xc7, 0xc8, 0xfc, 0xea, 0x6c, 0x2e, 0x64, 0x9d, 0x2d, 0x64, 0xa9, 0xee, 0xb8, 0x4f, 0xc3, 0xd0, + 0xd9, 0x95, 0xd6, 0x31, 0x3f, 0x51, 0x52, 0x3a, 0xd3, 0x6e, 0xf1, 0x72, 0xab, 0x2f, 0x25, 0xb9, + 0x0b, 0x13, 0x5b, 0x74, 0x5b, 0x1d, 0x9f, 0xe1, 0x78, 0x8a, 0x97, 0x1f, 0xd2, 0xed, 0xfe, 0x83, + 0x93, 0xa2, 0x23, 0x1e, 0x4c, 0xad, 0x05, 0xfe, 0xa3, 0x03, 0xb6, 0xd5, 0xa3, 0x6d, 0x1a, 0x60, + 0x70, 0xd7, 0x08, 0xba, 0xab, 0x66, 0x13, 0xcb, 0x52, 0x2f, 0xaf, 0x7d, 0xee, 0xe8, 0xb0, 0xf2, + 0x6c, 0x87, 0x81, 0xed, 0xa6, 0x80, 0xdb, 0xa9, 0x7b, 0x81, 0xbd, 0x5c, 0xc9, 0x4f, 0xc2, 0xa4, + 0xe5, 0x77, 0x23, 0xaf, 0xbd, 0x5b, 0x8f, 0x02, 0x27, 0xa2, 0xbb, 0x5c, 0x91, 0x27, 0x51, 0x64, + 0xa9, 0x52, 0xee, 0x98, 0x0e, 0x38, 0xd0, 0x0e, 0x05, 0x54, 0xd3, 0xa4, 0x3a, 0x81, 0xf9, 0x6b, + 0x39, 0x98, 0x15, 0xc3, 0x60, 0xd1, 0x86, 0x1f, 0xb8, 0x4f, 0xff, 0xb4, 0x5f, 0xd4, 0xa6, 0xfd, + 0xf3, 0x71, 0x8c, 0x52, 0xd6, 0x47, 0x1e, 0x33, 0xeb, 0x7f, 0xdf, 0x80, 0x4b, 0xc7, 0x11, 0xb1, + 0xde, 0x89, 0xe3, 0xfa, 0x46, 0x7b, 0xe2, 0xf7, 0x3a, 0x30, 0x8d, 0xe3, 0x89, 0x8e, 0xe3, 0xf0, + 0xae, 0x1f, 0x46, 0xe8, 0xbd, 0xcb, 0x69, 0x81, 0x04, 0x35, 0xdf, 0x6f, 0xa2, 0x9e, 0xaf, 0xbd, + 0xca, 0xd4, 0xf9, 0xf7, 0x0f, 0x2b, 0xc0, 0x40, 0x3c, 0x12, 0x8f, 0xad, 0xf9, 0x5c, 0x62, 0xd0, + 0x2f, 0x1d, 0xda, 0x18, 0xfd, 0xb1, 0x4f, 0x0f, 0x42, 0x2b, 0x8b, 0x35, 0x7a, 0x68, 0xaa, 0xdd, + 0x68, 0x6f, 0x2d, 0xa0, 0x3b, 0x34, 0xa0, 0xed, 0x06, 0xfd, 0x8c, 0x79, 0x68, 0xf4, 0x8f, 0x1b, + 0x68, 0x7b, 0xf2, 0x97, 0x23, 0x30, 0x93, 0x45, 0xc6, 0xfa, 0x45, 0xb1, 0x88, 0xd3, 0x97, 0xc8, + 0xff, 0x7f, 0x03, 0x4a, 0x75, 0xda, 0xf0, 0xdb, 0xee, 0x6d, 0xa7, 0x11, 0xf9, 0x32, 0x24, 0xc3, + 0xe6, 0x9a, 0x8d, 0xc1, 0xed, 0x1d, 0x2c, 0xd0, 0x3c, 0x03, 0xef, 0x0f, 0x66, 0x88, 0x36, 0x7c, + 0x0c, 0x84, 0x8d, 0x98, 0x4c, 0x26, 0x55, 0xe0, 0xa9, 0x86, 0x56, 0x29, 0xa9, 0xc1, 0xf8, 0xbc, + 0xdf, 0x6e, 0x53, 0xf6, 0x43, 0x09, 0xeb, 0xc4, 0x40, 0xcc, 0x86, 0x2c, 0x48, 0x7b, 0x08, 0x74, + 0x12, 0x72, 0x0b, 0xf2, 0x1b, 0x73, 0xb7, 0xc5, 0x18, 0xc8, 0x60, 0xb5, 0x8d, 0xb9, 0xdb, 0xb8, + 0xd7, 0x65, 0xf6, 0xc3, 0x78, 0x77, 0x6e, 0x47, 0xf5, 0x81, 0x6e, 0xcc, 0xdd, 0x26, 0xab, 0x30, + 0x65, 0xd1, 0xaf, 0x77, 0xbd, 0x80, 0x8a, 0x09, 0x70, 0xff, 0x76, 0x15, 0xc7, 0xa2, 0xc8, 0xf5, + 0x58, 0xc0, 0x0b, 0xa5, 0x6d, 0x6f, 0xb7, 0x76, 0xd4, 0x8b, 0x93, 0xbd, 0xb4, 0xe4, 0x67, 0xe1, + 0xec, 0x82, 0x17, 0x8a, 0x36, 0x73, 0xe7, 0xa3, 0x8b, 0xe7, 0x90, 0xc3, 0x7d, 0xa6, 0xc3, 0x17, + 0x33, 0xa7, 0xc3, 0xe7, 0xdc, 0x98, 0x89, 0xcd, 0x3d, 0x9b, 0x6e, 0x3a, 0x1e, 0x36, 0xbb, 0x1e, + 0xf2, 0x31, 0x4c, 0xa0, 0xb7, 0x07, 0xfd, 0xb1, 0x18, 0x6f, 0x3e, 0xd2, 0xa7, 0xe6, 0xcf, 0x67, + 0xd6, 0x7c, 0x11, 0x9d, 0x47, 0x36, 0x7a, 0x75, 0x31, 0x36, 0x5d, 0xdb, 0x23, 0x68, 0x9c, 0xc9, + 0x07, 0x30, 0x29, 0x16, 0x9d, 0xd5, 0x9d, 0xf5, 0x3d, 0xba, 0xe0, 0x1c, 0x88, 0x20, 0x04, 0xb4, + 0xff, 0xc4, 0x4a, 0x65, 0xfb, 0x3b, 0x76, 0xb4, 0x47, 0x6d, 0xd7, 0xd1, 0xd4, 0x73, 0x8a, 0x90, + 0xfc, 0x34, 0x8c, 0x2d, 0xfb, 0x78, 0xf0, 0x84, 0xaa, 0x66, 0x14, 0xf9, 0x7c, 0x05, 0x2f, 0x4e, + 0x73, 0x70, 0x6a, 0x11, 0xf9, 0xd1, 0x61, 0xe5, 0xad, 0xd3, 0x4a, 0xa1, 0x52, 0x81, 0xa5, 0xd6, + 0x46, 0xe6, 0xa1, 0xb8, 0x45, 0xb7, 0xd9, 0xd7, 0xa6, 0x2f, 0xfd, 0x49, 0x30, 0xd7, 0x17, 0x0f, + 0xc5, 0x2f, 0xf5, 0x54, 0x47, 0x62, 0x90, 0x00, 0xa6, 0xb0, 0x7f, 0xd6, 0x9c, 0x30, 0x7c, 0xe8, + 0x07, 0x6e, 0x93, 0x86, 0xf2, 0x78, 0xa4, 0xb7, 0xf3, 0xe7, 0x32, 0x3b, 0xff, 0x12, 0xef, 0xfc, + 0x8e, 0xc2, 0x41, 0x15, 0xb7, 0x1e, 0xf6, 0xe6, 0xbf, 0x32, 0x50, 0xea, 0xc9, 0x35, 0x0c, 0x3e, + 0x8b, 0xa3, 0xda, 0x71, 0x37, 0xeb, 0x74, 0x52, 0x77, 0x01, 0x38, 0x0a, 0xdb, 0xfa, 0xde, 0x76, + 0x1a, 0x34, 0x92, 0x3e, 0x52, 0x44, 0xde, 0x41, 0x88, 0xba, 0xf5, 0xe5, 0x38, 0xe4, 0xcb, 0x30, + 0xb3, 0x40, 0x1f, 0x78, 0x0d, 0x5a, 0x8d, 0x22, 0x1a, 0xf2, 0x1e, 0x9e, 0xaf, 0xf2, 0xc3, 0xc4, + 0xd1, 0xda, 0x0b, 0x47, 0x87, 0x95, 0xcb, 0x2e, 0x96, 0xdb, 0x4e, 0x82, 0x60, 0x37, 0x1c, 0x95, + 0x57, 0x26, 0x07, 0xf3, 0x7f, 0x19, 0x49, 0xaf, 0x93, 0x97, 0xa0, 0x60, 0xad, 0xc5, 0xed, 0xe7, + 0xe7, 0x84, 0xa9, 0xe6, 0x23, 0x02, 0xf9, 0x2a, 0x9c, 0x55, 0xf8, 0x60, 0x8f, 0x50, 0x97, 0x35, + 0x88, 0x7f, 0xcc, 0x8b, 0x78, 0x30, 0xa4, 0xb4, 0xc4, 0xe1, 0x18, 0xa9, 0x16, 0x65, 0xf3, 0x60, + 0x1f, 0xab, 0x14, 0x2c, 0xd0, 0xb6, 0xc7, 0x79, 0x2b, 0x1f, 0xab, 0xf2, 0x76, 0x11, 0x21, 0xfd, + 0xb1, 0x59, 0x1c, 0x3e, 0x28, 0x14, 0x0b, 0xe5, 0x21, 0xf3, 0xaf, 0x0c, 0x25, 0xeb, 0xc5, 0x53, + 0xba, 0x62, 0xbd, 0xa1, 0xad, 0x58, 0x33, 0x82, 0x34, 0xfe, 0x2a, 0x56, 0x96, 0x69, 0x65, 0x4c, + 0xc2, 0xb8, 0x86, 0x84, 0x61, 0xb6, 0x1b, 0x21, 0x0d, 0xb8, 0x4f, 0xf2, 0xb3, 0x15, 0x66, 0x1b, + 0x7f, 0xd7, 0x40, 0xd1, 0x93, 0x7f, 0x6e, 0xc0, 0x64, 0x8a, 0x82, 0xf5, 0x06, 0x03, 0xa9, 0xbd, + 0xd1, 0x0d, 0x69, 0x60, 0x21, 0x94, 0x07, 0xe5, 0x2d, 0xeb, 0x41, 0x79, 0x4d, 0x8b, 0xc1, 0xc8, + 0xfb, 0x30, 0xb4, 0x81, 0x3b, 0x08, 0x3d, 0xae, 0x23, 0xe6, 0x8f, 0x85, 0x7c, 0x86, 0x75, 0xd9, + 0xbf, 0xaa, 0x82, 0xc0, 0x32, 0x52, 0x87, 0x91, 0xf9, 0x80, 0x62, 0x7e, 0x8b, 0xc2, 0xe0, 0x07, + 0x70, 0x0d, 0x4e, 0x92, 0x3e, 0x80, 0x13, 0x9c, 0xcc, 0x5f, 0xcd, 0x01, 0x49, 0xbe, 0x91, 0x36, + 0x02, 0x1a, 0x85, 0x4f, 0xed, 0xa0, 0xbf, 0xa7, 0x0d, 0xfa, 0xb3, 0x3d, 0x83, 0xce, 0x3f, 0x6f, + 0xa0, 0xb1, 0xff, 0x63, 0x03, 0xce, 0x65, 0x13, 0x92, 0xe7, 0x61, 0x78, 0x75, 0x7d, 0x4d, 0x86, + 0x06, 0x89, 0x4f, 0xf1, 0x3b, 0x68, 0x19, 0x5b, 0xa2, 0x88, 0xbc, 0x06, 0xc3, 0x1f, 0x5a, 0xf3, + 0x6c, 0xc9, 0x54, 0x6e, 0xcf, 0x7c, 0x3d, 0xb0, 0x1b, 0xfa, 0x96, 0x4b, 0x20, 0xa9, 0x63, 0x9b, + 0x7f, 0x62, 0x63, 0xfb, 0xad, 0x1c, 0x4c, 0x56, 0x1b, 0x0d, 0x1a, 0x86, 0xcc, 0x20, 0xa2, 0x61, + 0xf4, 0xd4, 0x0e, 0x6c, 0x76, 0xd0, 0x8f, 0xf6, 0x6d, 0x03, 0x8d, 0xea, 0x9f, 0x18, 0x70, 0x56, + 0x52, 0x3d, 0xf0, 0xe8, 0xc3, 0xf5, 0xbd, 0x80, 0x86, 0x7b, 0x7e, 0xd3, 0x1d, 0xf4, 0x1e, 0x18, + 0xae, 0xd2, 0x5e, 0x33, 0xa2, 0x81, 0xea, 0xa0, 0xde, 0x41, 0x88, 0xb6, 0x4a, 0x23, 0x84, 0xdc, + 0x80, 0x91, 0x6a, 0xa7, 0x13, 0xf8, 0x0f, 0xf8, 0xb4, 0x1f, 0x17, 0xe7, 0x91, 0x1c, 0xa4, 0x9d, + 0x5f, 0x72, 0x10, 0x6b, 0xc6, 0x02, 0x6d, 0xf3, 0x88, 0xe6, 0x71, 0xde, 0x0c, 0x97, 0xb6, 0x55, + 0x0b, 0x0d, 0xcb, 0xcd, 0x6f, 0x16, 0xa0, 0xa4, 0x7e, 0x08, 0x31, 0x61, 0x98, 0x87, 0xa7, 0xa8, + 0x61, 0x02, 0x0e, 0x42, 0x2c, 0x51, 0x92, 0x44, 0xfd, 0xe4, 0x4e, 0x8c, 0xfa, 0xd9, 0x82, 0xf1, + 0xb5, 0xc0, 0xef, 0xf8, 0x21, 0x75, 0x79, 0x8a, 0x22, 0xae, 0xb5, 0xa6, 0xe3, 0x50, 0x58, 0xde, + 0xe7, 0xac, 0x88, 0x6f, 0x07, 0x3a, 0x02, 0xdb, 0x4e, 0x27, 0x30, 0xd2, 0xf9, 0x70, 0x07, 0xbf, + 0x13, 0x8a, 0xeb, 0x02, 0xb1, 0x83, 0x9f, 0x41, 0x74, 0x07, 0x3f, 0x83, 0xa8, 0xd3, 0x62, 0xe8, + 0x49, 0x4d, 0x0b, 0xf2, 0xab, 0x06, 0x8c, 0x55, 0xdb, 0x6d, 0x11, 0xf5, 0x23, 0xef, 0xf9, 0x9f, + 0x4d, 0x9c, 0xfc, 0x3c, 0x2c, 0x94, 0xfb, 0xf8, 0xbf, 0x26, 0x7c, 0xfc, 0x6f, 0x7d, 0x22, 0x1f, + 0xff, 0x7a, 0xe0, 0x78, 0x51, 0x88, 0x87, 0xb9, 0x49, 0x85, 0x6a, 0xe8, 0xaf, 0xd2, 0x0e, 0xf2, + 0x16, 0x94, 0x63, 0x79, 0x5c, 0x6a, 0xbb, 0xf4, 0x11, 0xe5, 0x41, 0x52, 0xe3, 0xfc, 0x86, 0xa1, + 0x76, 0x78, 0x91, 0x46, 0x34, 0xbf, 0x65, 0xc0, 0x39, 0x55, 0x20, 0xea, 0xdd, 0xed, 0x96, 0x87, + 0xdb, 0x1f, 0x72, 0x1d, 0x46, 0xc5, 0x78, 0xc5, 0x86, 0x5c, 0x6f, 0x5e, 0xab, 0x04, 0x85, 0x2c, + 0xb2, 0x21, 0x62, 0x3c, 0x84, 0xaf, 0x60, 0x3a, 0x35, 0xdd, 0x58, 0x51, 0x6d, 0x56, 0x74, 0x76, + 0x39, 0xc0, 0xdf, 0xfa, 0xd8, 0x31, 0x88, 0xf9, 0x2e, 0x4c, 0xe9, 0xad, 0xac, 0x53, 0xbc, 0x82, + 0x26, 0x3f, 0xcd, 0xc8, 0xfe, 0x34, 0x59, 0x6e, 0x6e, 0x01, 0xe9, 0xa1, 0x0f, 0xf1, 0xa0, 0x8a, + 0x46, 0xf2, 0x20, 0x55, 0xba, 0xbb, 0x7a, 0x10, 0xe3, 0x0c, 0x6f, 0x63, 0x6a, 0x77, 0x23, 0xa9, + 0xf9, 0x17, 0x00, 0xd3, 0x19, 0xaa, 0xe3, 0x84, 0xa5, 0xbd, 0xa2, 0x4f, 0x9e, 0xd1, 0x38, 0x22, + 0x40, 0x4e, 0x99, 0x77, 0x65, 0x36, 0xaf, 0x63, 0xa6, 0xca, 0x71, 0x29, 0xbe, 0x3e, 0x8d, 0xe5, + 0x5d, 0x0d, 0xda, 0x19, 0x7a, 0x62, 0x41, 0x3b, 0x35, 0x18, 0x17, 0x5f, 0x25, 0xa6, 0xf2, 0x70, + 0xe2, 0x16, 0x08, 0x78, 0x81, 0xdd, 0x33, 0xa5, 0x75, 0x12, 0xce, 0x23, 0xf4, 0x9b, 0x0f, 0xa8, + 0xe0, 0x31, 0xa2, 0xf2, 0xc0, 0x82, 0x4c, 0x1e, 0x0a, 0x09, 0xf9, 0xa7, 0x06, 0x10, 0x01, 0x51, + 0xe7, 0x73, 0xf1, 0xb8, 0xf9, 0xec, 0x3e, 0x99, 0xf9, 0xfc, 0xac, 0x6c, 0x63, 0xf6, 0xbc, 0xce, + 0x68, 0x16, 0xf9, 0xc7, 0x06, 0x4c, 0xf1, 0xc8, 0x11, 0xb5, 0xb1, 0xa3, 0xc7, 0x35, 0xb6, 0xf1, + 0x64, 0x1a, 0x7b, 0x29, 0xc4, 0x6a, 0xfb, 0xb4, 0xb5, 0xb7, 0x51, 0xe4, 0xc7, 0x01, 0xe2, 0x19, + 0x25, 0x23, 0x14, 0x2f, 0x65, 0x68, 0x81, 0x18, 0x29, 0xb9, 0x64, 0x19, 0xc5, 0x74, 0x6a, 0x4c, + 0x4f, 0xc2, 0x8d, 0xfc, 0x2c, 0xcc, 0xb0, 0xf9, 0x12, 0x43, 0x44, 0x9c, 0xdb, 0xec, 0x18, 0xd6, + 0xf2, 0x85, 0xfe, 0x4b, 0xfb, 0xf5, 0x2c, 0x32, 0x7e, 0x4f, 0x24, 0x49, 0xb4, 0x10, 0xb5, 0xd4, + 0x2d, 0x5f, 0x16, 0x05, 0x06, 0xb4, 0x62, 0xeb, 0xc3, 0xd9, 0x12, 0xd6, 0x99, 0xa9, 0xdf, 0x2e, + 0xc8, 0xb9, 0xc0, 0xf5, 0x5b, 0xa8, 0x5f, 0xf4, 0x40, 0x10, 0xf9, 0x10, 0x48, 0xbd, 0xbb, 0xbb, + 0x4b, 0xc3, 0x88, 0xba, 0x1c, 0x46, 0x83, 0x70, 0x76, 0x1c, 0xf5, 0x03, 0xba, 0xa9, 0x42, 0x59, + 0x6a, 0x07, 0xb2, 0x58, 0x15, 0x92, 0x5e, 0x62, 0x42, 0x61, 0x46, 0x7c, 0x34, 0x83, 0xca, 0x34, + 0x05, 0xe1, 0xec, 0x84, 0x16, 0x45, 0x98, 0x94, 0xd4, 0x9e, 0x93, 0x79, 0xec, 0x94, 0x5c, 0x07, + 0xda, 0xb6, 0x37, 0x8b, 0xdd, 0xc5, 0x6d, 0xb8, 0xd0, 0xb7, 0x37, 0x33, 0xee, 0x8a, 0xdc, 0xd0, + 0xef, 0x8a, 0x5c, 0xe8, 0xa7, 0x75, 0x43, 0xf5, 0xbe, 0xc8, 0x6f, 0x19, 0x29, 0x35, 0x2b, 0x6c, + 0x22, 0x9e, 0x5f, 0xb1, 0xdf, 0x3a, 0x94, 0xc3, 0xa4, 0x0c, 0x5c, 0x11, 0xe7, 0x12, 0x5b, 0x8c, + 0x29, 0x62, 0x55, 0x91, 0xa3, 0x4a, 0x7e, 0x4c, 0x8d, 0x6b, 0xfe, 0x73, 0x03, 0x08, 0x6f, 0xe1, + 0xbc, 0xd3, 0x71, 0xb6, 0xbd, 0xa6, 0x17, 0x79, 0x34, 0x24, 0xf7, 0xa0, 0x2c, 0x58, 0x38, 0xdb, + 0x4d, 0xaa, 0x86, 0x81, 0x89, 0x73, 0xe2, 0xb8, 0xcc, 0x4e, 0x5b, 0x4f, 0x3d, 0x84, 0x7d, 0x64, + 0x24, 0xf7, 0x18, 0x32, 0x62, 0xfe, 0xd0, 0x80, 0x0b, 0xbd, 0xcd, 0x16, 0x35, 0xc7, 0x9d, 0x67, + 0x9c, 0xd0, 0x79, 0x59, 0x5f, 0x99, 0x43, 0x0f, 0xeb, 0x13, 0xfb, 0xca, 0x7c, 0xe2, 0xb0, 0x3d, + 0xfd, 0x57, 0x3e, 0x54, 0x93, 0x7a, 0x90, 0xd7, 0xb2, 0x02, 0x7a, 0xf8, 0xad, 0x1b, 0x0e, 0xd6, + 0x63, 0x79, 0xe4, 0x2e, 0x27, 0x97, 0xb9, 0xcb, 0x91, 0x17, 0x88, 0xf2, 0x59, 0x17, 0x88, 0xcc, + 0x5f, 0xcc, 0x41, 0x69, 0xad, 0xd9, 0xdd, 0xf5, 0xda, 0x0b, 0x4e, 0xe4, 0x3c, 0xb5, 0x5b, 0xa6, + 0x37, 0xb5, 0x2d, 0x53, 0x1c, 0x71, 0x16, 0x7f, 0xd8, 0x60, 0x49, 0xf6, 0x0c, 0x98, 0x4c, 0x48, + 0xb8, 0x7a, 0xb8, 0x0b, 0x05, 0xf6, 0x43, 0x58, 0x60, 0x97, 0x7b, 0x18, 0x23, 0xd6, 0xf5, 0xf8, + 0x3f, 0xb1, 0x89, 0xd1, 0x53, 0x1b, 0x22, 0x87, 0x8b, 0x5f, 0xe4, 0x99, 0xc9, 0x4e, 0x9f, 0x45, + 0xf5, 0x0f, 0x0d, 0x28, 0xa7, 0xbf, 0x84, 0xdc, 0x83, 0x11, 0xc6, 0xc9, 0x8b, 0xb3, 0x9c, 0xbd, + 0xd0, 0xe7, 0x9b, 0xaf, 0x0b, 0x34, 0xde, 0x3c, 0xec, 0x7c, 0xca, 0x21, 0x96, 0xe4, 0x70, 0xd1, + 0x82, 0x92, 0x8a, 0x95, 0xd1, 0xba, 0x57, 0x75, 0x9d, 0x78, 0x2e, 0xbb, 0x1f, 0xd4, 0x56, 0xff, + 0xa6, 0xd6, 0x6a, 0xa1, 0x0d, 0x07, 0x4d, 0x57, 0x89, 0x57, 0xee, 0xf8, 0x74, 0x50, 0xe5, 0x4c, + 0x6a, 0x7d, 0xfd, 0xca, 0x1d, 0x87, 0xb1, 0xbd, 0x16, 0xaf, 0x4f, 0xc8, 0x19, 0xee, 0xb5, 0x3a, + 0x08, 0x51, 0xed, 0x75, 0x8e, 0x63, 0xfe, 0xbd, 0x3c, 0x9c, 0x4b, 0x9a, 0xc7, 0x93, 0x77, 0xae, + 0x39, 0x81, 0xd3, 0x0a, 0x4f, 0x98, 0x01, 0x57, 0x7b, 0x9a, 0x86, 0x57, 0xca, 0x65, 0xd3, 0x94, + 0x06, 0x99, 0xa9, 0x06, 0xe1, 0x26, 0x95, 0x37, 0x48, 0x36, 0x83, 0xdc, 0x83, 0x7c, 0x9d, 0x46, + 0xe2, 0xe2, 0xe9, 0x95, 0x9e, 0x5e, 0x55, 0xdb, 0x75, 0xbd, 0x4e, 0x23, 0x3e, 0x88, 0x3c, 0x76, + 0x9f, 0x6a, 0xb1, 0xf4, 0x6c, 0xbb, 0xb1, 0x05, 0xc3, 0x8b, 0x8f, 0x3a, 0xb4, 0x11, 0x89, 0xfb, + 0xa6, 0x2f, 0x1f, 0xcf, 0x8f, 0xe3, 0x2a, 0xb7, 0x5a, 0x29, 0x02, 0xd4, 0xce, 0xe2, 0x28, 0x17, + 0xdf, 0x80, 0xa2, 0xac, 0xfc, 0x54, 0xb7, 0x33, 0xdf, 0x84, 0x31, 0xa5, 0x92, 0x53, 0x09, 0xfd, + 0x5f, 0x1b, 0x30, 0xcc, 0xb4, 0xed, 0xe6, 0xeb, 0x4f, 0xa9, 0x46, 0xba, 0xa5, 0x69, 0xa4, 0x29, + 0xe5, 0x1a, 0x11, 0xce, 0xcb, 0xd7, 0x4f, 0xd0, 0x45, 0x87, 0x06, 0x40, 0x82, 0x4c, 0xee, 0xc0, + 0x88, 0xc8, 0x17, 0x23, 0x32, 0xe3, 0xaa, 0xf7, 0x92, 0x64, 0xe6, 0xb0, 0xd8, 0x8a, 0xf3, 0x3b, + 0x69, 0xb3, 0x57, 0x52, 0x93, 0x85, 0x24, 0x76, 0x5b, 0xbd, 0x08, 0xcb, 0xd8, 0xcc, 0xfb, 0x6d, + 0x7e, 0x4f, 0x45, 0xc9, 0x41, 0xd6, 0x27, 0x88, 0xbb, 0x2a, 0x1c, 0x37, 0xf9, 0xe3, 0x98, 0x9c, + 0x13, 0x4c, 0xb2, 0x7d, 0x3a, 0x7f, 0x59, 0xe2, 0x37, 0x3f, 0x64, 0xc3, 0xde, 0x81, 0xd2, 0x6d, + 0x3f, 0x78, 0xe8, 0x04, 0x6e, 0x75, 0x97, 0x8a, 0xa8, 0xfb, 0x22, 0x86, 0xce, 0x8f, 0xef, 0x70, + 0xb8, 0xed, 0xb0, 0x82, 0x1f, 0x1d, 0x56, 0x0a, 0x35, 0xdf, 0x6f, 0x5a, 0x1a, 0x3a, 0x59, 0x85, + 0xf1, 0xfb, 0xce, 0x23, 0x71, 0x06, 0xba, 0xbe, 0xbe, 0x2c, 0x62, 0x77, 0x5e, 0x3e, 0x3a, 0xac, + 0x5c, 0x68, 0x39, 0x8f, 0xe2, 0xb3, 0xd3, 0xfe, 0xe1, 0xe5, 0x3a, 0x3d, 0xf1, 0x60, 0x62, 0xcd, + 0x0f, 0x22, 0x51, 0x09, 0xb3, 0xd9, 0xf3, 0x7d, 0x4e, 0xd1, 0x6e, 0x64, 0x9e, 0xa2, 0x5d, 0x60, + 0x1b, 0x15, 0x7b, 0x27, 0x26, 0xd7, 0xae, 0x2b, 0x6a, 0x8c, 0xc9, 0x3b, 0x30, 0x35, 0x4f, 0x83, + 0xc8, 0xdb, 0xf1, 0x1a, 0x4e, 0x44, 0x6f, 0xfb, 0x41, 0xcb, 0x89, 0x84, 0xc3, 0x08, 0x1d, 0x06, + 0x0d, 0xca, 0x39, 0xb5, 0x9c, 0xc8, 0xea, 0xc5, 0x24, 0x5f, 0xcd, 0x8a, 0x86, 0x1a, 0xc2, 0xcf, + 0x7f, 0x8d, 0x59, 0x23, 0x19, 0xd1, 0x50, 0x7d, 0xba, 0x20, 0x23, 0x2e, 0x6a, 0xf7, 0xb8, 0xa3, + 0xe4, 0x62, 0xed, 0xa6, 0x38, 0xd6, 0x3e, 0xf9, 0xa8, 0x38, 0x1e, 0xb7, 0x3e, 0x47, 0xc6, 0x73, + 0x90, 0xaf, 0xad, 0xdd, 0x46, 0x17, 0x90, 0x38, 0xba, 0xa5, 0xed, 0x3d, 0xa7, 0xdd, 0x40, 0x23, + 0x4a, 0xc4, 0x83, 0xa8, 0x0a, 0xaf, 0xb6, 0x76, 0x9b, 0x38, 0x30, 0xbd, 0x46, 0x83, 0x96, 0x17, + 0x7d, 0xf9, 0xe6, 0x4d, 0x65, 0xa0, 0x8a, 0xd8, 0xb4, 0x1b, 0xa2, 0x69, 0x95, 0x0e, 0xa2, 0xd8, + 0x8f, 0x6e, 0xde, 0xcc, 0x1c, 0x8e, 0xb8, 0x61, 0x59, 0xbc, 0xc8, 0x22, 0x4c, 0xdc, 0x77, 0x1e, + 0x89, 0x43, 0xfe, 0x78, 0x0f, 0x9b, 0xc7, 0xdb, 0x06, 0x28, 0x58, 0x8d, 0xa4, 0x48, 0x1d, 0x62, + 0x9d, 0x88, 0xbc, 0x0d, 0x63, 0x89, 0x78, 0x85, 0x78, 0xbc, 0x9b, 0xe7, 0x61, 0xa6, 0x8a, 0x70, + 0x6a, 0xbe, 0x32, 0x05, 0x9d, 0x6c, 0xc4, 0x2e, 0x08, 0x6e, 0x09, 0xe3, 0x81, 0xee, 0x68, 0xed, + 0x86, 0xea, 0x82, 0x70, 0xb0, 0x44, 0xfb, 0xac, 0xc9, 0x78, 0x6f, 0xc0, 0xa3, 0x8f, 0x2c, 0x9d, + 0x8b, 0xe2, 0xd9, 0x58, 0x0b, 0xfc, 0x56, 0x27, 0xc2, 0x28, 0xcc, 0x94, 0x67, 0xa3, 0x83, 0x25, + 0x19, 0x9e, 0x0d, 0x4e, 0x92, 0x1d, 0xbb, 0x30, 0xfe, 0x18, 0xb1, 0x0b, 0x14, 0x0a, 0xcb, 0x7e, + 0x63, 0x1f, 0xc3, 0x2e, 0x47, 0x6b, 0x1f, 0x32, 0xfd, 0xd1, 0xf4, 0x1b, 0xfb, 0x4f, 0xee, 0xcc, + 0x1d, 0xd9, 0x93, 0x15, 0xf6, 0xed, 0x4c, 0xac, 0x44, 0xd5, 0xb3, 0x93, 0xda, 0x49, 0xa2, 0x56, + 0xc6, 0x0d, 0x15, 0x2e, 0x85, 0xf2, 0x43, 0x2c, 0x9d, 0x9c, 0x50, 0x28, 0x2f, 0xd0, 0x70, 0x3f, + 0xf2, 0x3b, 0xf3, 0x4d, 0xaf, 0xb3, 0xed, 0x3b, 0x81, 0x3b, 0x5b, 0xee, 0xa3, 0x30, 0x5e, 0xca, + 0x54, 0x18, 0x53, 0x2e, 0xa7, 0xb7, 0x1b, 0x92, 0x81, 0xd5, 0xc3, 0x92, 0x7c, 0x15, 0x26, 0xd8, + 0x6c, 0x59, 0x7c, 0x14, 0xd1, 0x36, 0x17, 0xa5, 0x29, 0x5c, 0xea, 0x67, 0x94, 0x8b, 0x9b, 0x71, + 0x21, 0x17, 0x52, 0xd4, 0x1e, 0x34, 0x26, 0x50, 0x85, 0x54, 0x67, 0x45, 0x5c, 0x98, 0xbd, 0xef, + 0x3c, 0x52, 0xd2, 0x1c, 0x29, 0x52, 0x4f, 0x50, 0x62, 0x31, 0xa1, 0x1e, 0x93, 0xd8, 0xfd, 0x18, + 0xa9, 0xcf, 0x04, 0xe8, 0xcb, 0x89, 0xfc, 0x34, 0x9c, 0x17, 0x9f, 0xb5, 0x80, 0xb9, 0x12, 0xfc, + 0xe0, 0xa0, 0xbe, 0xe7, 0x04, 0x6c, 0xe2, 0x4e, 0x9f, 0x4e, 0xc3, 0xca, 0x0e, 0x73, 0x25, 0x1f, + 0x3b, 0xe4, 0x8c, 0xac, 0x7e, 0x35, 0x98, 0xff, 0x2e, 0x97, 0x1a, 0x77, 0xb2, 0x04, 0x23, 0x02, + 0x59, 0xac, 0xac, 0xbd, 0xd5, 0x3f, 0x9b, 0x59, 0xfd, 0x88, 0xa8, 0xde, 0x92, 0xf4, 0xe4, 0x21, + 0x63, 0xb5, 0xe3, 0x74, 0x9b, 0x32, 0x89, 0xdc, 0x47, 0x7c, 0x58, 0x11, 0xa4, 0x09, 0xf0, 0xc2, + 0xe9, 0x43, 0x97, 0xf4, 0xc8, 0x38, 0x94, 0x64, 0x59, 0x1b, 0xd9, 0xe7, 0x97, 0x3d, 0x0b, 0x71, + 0xb8, 0x8a, 0x7e, 0xb3, 0xf3, 0x89, 0x55, 0xc8, 0x6a, 0x31, 0xff, 0xc8, 0x80, 0x71, 0x4d, 0x70, + 0xc8, 0x1b, 0x4a, 0x70, 0x57, 0x12, 0x94, 0xa9, 0xe1, 0x64, 0xbe, 0x1d, 0xf2, 0x86, 0x88, 0xe8, + 0xcb, 0xf5, 0xa7, 0xcb, 0xcc, 0xd5, 0x77, 0xec, 0x8e, 0x36, 0x49, 0x89, 0x51, 0xe8, 0x93, 0x12, + 0xe3, 0x57, 0xc6, 0x61, 0x42, 0x37, 0x55, 0xd8, 0xde, 0x61, 0xd9, 0xdf, 0xf5, 0xda, 0xd2, 0xf5, + 0xc1, 0x93, 0xbc, 0x20, 0x44, 0x7b, 0x88, 0x03, 0x21, 0xe4, 0x45, 0x80, 0x38, 0x88, 0x40, 0x7a, + 0x37, 0xc4, 0xb3, 0x21, 0x4a, 0x01, 0xf9, 0x09, 0x80, 0x15, 0xdf, 0xa5, 0x71, 0x9e, 0xa0, 0x63, + 0x5c, 0x9f, 0x2f, 0x09, 0xd7, 0xa7, 0x78, 0xea, 0xe3, 0xe8, 0xb0, 0x72, 0xb6, 0xed, 0xbb, 0xb4, + 0x37, 0x41, 0x90, 0xc2, 0x91, 0x7c, 0x09, 0x86, 0xac, 0x6e, 0x93, 0xca, 0xb4, 0x35, 0x63, 0x52, + 0x75, 0x75, 0x9b, 0x4a, 0x0a, 0xe0, 0xa0, 0x9b, 0x3e, 0xf1, 0x62, 0x00, 0xf2, 0x1e, 0x00, 0x9b, + 0x9d, 0x98, 0x4b, 0x53, 0xde, 0x8b, 0x47, 0x4f, 0x88, 0x32, 0xb1, 0x31, 0x03, 0xa7, 0x56, 0x79, + 0x42, 0x42, 0x56, 0x61, 0x44, 0x2c, 0x04, 0xe2, 0x44, 0xe9, 0xb9, 0x2c, 0x5f, 0xa6, 0x62, 0x0d, + 0x8a, 0x3c, 0x32, 0x08, 0xd6, 0xdd, 0x8b, 0xdc, 0x93, 0xf3, 0x36, 0x8c, 0x32, 0xf6, 0x1b, 0x21, + 0x15, 0xb7, 0xe5, 0x47, 0x79, 0x74, 0xad, 0xd2, 0xa0, 0x6e, 0xa8, 0x3b, 0x52, 0x12, 0x02, 0xf2, + 0x55, 0xcc, 0xfc, 0x24, 0xba, 0xfa, 0x58, 0x97, 0xf8, 0x95, 0x9e, 0xae, 0x9e, 0x71, 0x3a, 0x9d, + 0x8c, 0x54, 0x79, 0x31, 0x3f, 0xb2, 0x1b, 0xdf, 0x40, 0x8b, 0xf3, 0xc0, 0x1f, 0x53, 0xc1, 0xb5, + 0x9e, 0x0a, 0x66, 0xe5, 0xa5, 0xaa, 0xde, 0x7c, 0x4f, 0x1a, 0x5f, 0xd2, 0x81, 0x72, 0xa2, 0x33, + 0x45, 0x5d, 0x70, 0x5c, 0x5d, 0xaf, 0xf5, 0xd4, 0xa5, 0x0e, 0x60, 0x4f, 0x75, 0x3d, 0xdc, 0x89, + 0x9b, 0xe4, 0xec, 0x16, 0xf5, 0x8d, 0x1d, 0x57, 0xdf, 0x8b, 0x3d, 0xf5, 0x4d, 0xbb, 0xdb, 0xbd, + 0xf5, 0xa4, 0x78, 0x92, 0xb7, 0x61, 0x5c, 0x42, 0x70, 0x7e, 0xa0, 0x2b, 0x5a, 0xec, 0xd4, 0xdc, + 0x6d, 0x0c, 0xa9, 0xd4, 0x93, 0x1d, 0xa9, 0xc8, 0x2a, 0x35, 0x97, 0x8e, 0x71, 0x8d, 0x3a, 0x2d, + 0x15, 0x3a, 0x32, 0xf9, 0x0a, 0x8c, 0x2d, 0xb5, 0xd8, 0x87, 0xf8, 0x6d, 0x27, 0xa2, 0x68, 0x56, + 0x24, 0xee, 0x7d, 0xa5, 0x44, 0x11, 0x55, 0x9e, 0x55, 0x35, 0x29, 0x52, 0xcd, 0x32, 0x85, 0x82, + 0x75, 0x1e, 0xf7, 0xe0, 0x09, 0x19, 0x0e, 0x85, 0x11, 0xf1, 0x6c, 0x86, 0x8b, 0x5d, 0x61, 0x8f, + 0xab, 0x32, 0x77, 0x0c, 0xda, 0x62, 0x42, 0x68, 0x9d, 0xa7, 0xf3, 0x24, 0xef, 0xc0, 0x98, 0xb8, + 0xef, 0x5b, 0xb5, 0x56, 0xc2, 0xd9, 0x32, 0x7e, 0x3c, 0x66, 0x2a, 0x94, 0x57, 0x83, 0x6d, 0x27, + 0x48, 0x9d, 0xb3, 0x26, 0xf8, 0xe4, 0xcb, 0x30, 0xb3, 0xe5, 0xb5, 0x5d, 0xff, 0x61, 0x28, 0x96, + 0x29, 0xa1, 0xe8, 0xa6, 0x92, 0x68, 0xb2, 0x87, 0xbc, 0xdc, 0x96, 0xeb, 0x69, 0x8f, 0xe2, 0xcb, + 0xe4, 0x40, 0x7e, 0xa6, 0x87, 0x33, 0x97, 0x20, 0x72, 0x9c, 0x04, 0xcd, 0xf5, 0x48, 0x50, 0x6f, + 0xf5, 0x69, 0x71, 0xca, 0xac, 0x86, 0xf8, 0x40, 0x74, 0xeb, 0xf1, 0x03, 0xdf, 0x6b, 0xcf, 0x4e, + 0x6b, 0xaf, 0x2c, 0xc5, 0xab, 0x18, 0xe2, 0xad, 0xf9, 0x4d, 0xaf, 0x71, 0x20, 0x33, 0x16, 0xeb, + 0x76, 0xe9, 0xc7, 0xbe, 0xe6, 0x26, 0xca, 0x60, 0x4d, 0xbe, 0x02, 0x25, 0xf6, 0x37, 0x36, 0xe2, + 0x67, 0xb4, 0x43, 0x59, 0x05, 0x53, 0xd4, 0x83, 0x63, 0x84, 0x17, 0x92, 0x33, 0xec, 0x7b, 0x8d, + 0x95, 0xf9, 0x43, 0x03, 0x66, 0xb2, 0xda, 0x7a, 0x42, 0xf6, 0x27, 0x33, 0x15, 0x9e, 0x81, 0x1e, + 0x26, 0x1e, 0x9e, 0x11, 0x07, 0x65, 0x54, 0x60, 0xe8, 0x9e, 0xd7, 0x76, 0x65, 0xf8, 0x20, 0x2e, + 0x87, 0xfb, 0x0c, 0x60, 0x71, 0x38, 0x43, 0xc0, 0xab, 0x26, 0xb8, 0x5e, 0x0e, 0x71, 0x04, 0xbc, + 0x8f, 0x62, 0x71, 0x38, 0x43, 0x60, 0xcb, 0xae, 0x5c, 0x26, 0x10, 0x81, 0xad, 0xc6, 0xa1, 0xc5, + 0xe1, 0xe4, 0x0a, 0x8c, 0xac, 0xb6, 0x97, 0xa9, 0xf3, 0x80, 0x8a, 0xb3, 0x51, 0xf4, 0x88, 0xf9, + 0x6d, 0xbb, 0xc9, 0x60, 0x96, 0x2c, 0x34, 0xbf, 0x63, 0xc0, 0x54, 0x4f, 0x37, 0x9d, 0x9c, 0xe0, + 0xea, 0xf8, 0x83, 0xe8, 0x41, 0xbe, 0x8f, 0x37, 0xbf, 0x90, 0xdd, 0x7c, 0xf3, 0xf7, 0x0b, 0x70, + 0xbe, 0xcf, 0xaa, 0x95, 0x04, 0x91, 0x18, 0x27, 0x06, 0x91, 0x7c, 0x8d, 0xad, 0x12, 0x8e, 0xd7, + 0x0a, 0xd7, 0xfd, 0xa4, 0xc5, 0xc9, 0x79, 0x1b, 0x96, 0xc9, 0x0c, 0x32, 0x32, 0xdb, 0xc9, 0x85, + 0x06, 0x52, 0xd8, 0x91, 0xdf, 0x73, 0xec, 0xa0, 0x33, 0xeb, 0x09, 0xe3, 0xc8, 0xff, 0x0d, 0x09, + 0xe3, 0xd0, 0x0f, 0x4f, 0x0b, 0x4f, 0xf4, 0xf0, 0x34, 0xfb, 0x9c, 0x65, 0xe8, 0x71, 0x4e, 0x1c, + 0xe7, 0x61, 0xbc, 0x4e, 0x9d, 0xa0, 0xb1, 0x57, 0x0d, 0xf9, 0x20, 0x0d, 0x23, 0x37, 0x54, 0xc9, + 0x21, 0x16, 0xd8, 0x4e, 0xd8, 0x3b, 0x16, 0x1a, 0x8d, 0xf9, 0x1f, 0x53, 0xd1, 0x27, 0x7f, 0x13, + 0xe5, 0xe5, 0x65, 0x18, 0xda, 0xda, 0xa3, 0x81, 0x34, 0x92, 0xb1, 0x21, 0x0f, 0x19, 0x40, 0x6d, + 0x08, 0x62, 0x98, 0x3f, 0x0d, 0x25, 0xb5, 0x32, 0x54, 0x08, 0xec, 0xb7, 0x98, 0x91, 0x5c, 0x21, + 0x30, 0x80, 0xc5, 0xe1, 0x27, 0x26, 0x9d, 0x4b, 0x7a, 0x21, 0x7f, 0x52, 0x2f, 0xb0, 0xca, 0x51, + 0xde, 0x94, 0xca, 0xf1, 0xb7, 0x5a, 0x79, 0xc4, 0x00, 0x16, 0x87, 0x3f, 0xd1, 0xca, 0xff, 0xbd, + 0x01, 0x05, 0x4c, 0xf8, 0xf1, 0x3a, 0x8c, 0x4a, 0xb7, 0xbd, 0x9a, 0x04, 0x63, 0x5a, 0x7a, 0xf5, + 0x43, 0x3d, 0x76, 0x48, 0x00, 0x59, 0x55, 0x9b, 0x34, 0xd8, 0xd6, 0x42, 0xcc, 0x1e, 0x30, 0x80, + 0x5a, 0x15, 0x62, 0x9c, 0x62, 0x3c, 0x30, 0x8c, 0x4e, 0xec, 0xba, 0xb9, 0xca, 0xe2, 0x61, 0x74, + 0x3d, 0x5b, 0x6c, 0x89, 0x65, 0xfe, 0xba, 0x01, 0x67, 0x33, 0x2d, 0x19, 0x56, 0x2b, 0x37, 0x99, + 0x14, 0x71, 0x4c, 0xdb, 0x4b, 0x1c, 0xe3, 0x34, 0xe1, 0x72, 0xa7, 0x90, 0xad, 0xcf, 0xc1, 0x68, + 0xbc, 0x8f, 0x26, 0x33, 0x72, 0xe8, 0xd0, 0xb7, 0x2b, 0xb7, 0x63, 0x7f, 0x6d, 0xc0, 0x30, 0x6b, + 0xc2, 0x53, 0x7b, 0x7b, 0x2a, 0xdb, 0xd3, 0xcf, 0x3e, 0x69, 0xa0, 0x3b, 0x53, 0xbf, 0x33, 0x0c, + 0x90, 0x20, 0x93, 0x6d, 0x98, 0x58, 0x5d, 0x5a, 0x98, 0x5f, 0x72, 0x69, 0x3b, 0xc2, 0xa3, 0xee, + 0x54, 0x16, 0x0d, 0xb6, 0x35, 0x0e, 0xda, 0x4e, 0x53, 0x20, 0x1c, 0x24, 0xba, 0xc1, 0xf7, 0xdc, + 0x86, 0xed, 0xc5, 0x74, 0xaa, 0x49, 0xa9, 0x73, 0x64, 0x75, 0xd4, 0xab, 0xf7, 0x97, 0x95, 0x3a, + 0x72, 0x03, 0xd6, 0x11, 0x3a, 0xad, 0x66, 0x9f, 0x3a, 0x74, 0x8e, 0x64, 0x0f, 0xca, 0x77, 0x70, + 0xf5, 0x51, 0x6a, 0xc9, 0x1f, 0x5f, 0xcb, 0xf3, 0xa2, 0x96, 0x67, 0xf8, 0xb2, 0x95, 0x5d, 0x4f, + 0x0f, 0xd7, 0x44, 0x72, 0x0b, 0x27, 0x4a, 0xee, 0xdf, 0x32, 0x60, 0x98, 0x2f, 0x6f, 0xf1, 0x53, + 0x49, 0x99, 0x0b, 0xe8, 0xd6, 0x93, 0x59, 0x40, 0xcb, 0xa8, 0xb9, 0x34, 0x17, 0x02, 0x2f, 0x23, + 0x0b, 0xa9, 0x77, 0x97, 0xe4, 0x71, 0x0e, 0x9a, 0xd6, 0xbc, 0x24, 0x09, 0x3a, 0xe4, 0x4f, 0x2e, + 0xa9, 0x5c, 0x38, 0x86, 0xfa, 0x0a, 0xec, 0xc8, 0x63, 0xbe, 0x02, 0xbb, 0x0c, 0xa3, 0x22, 0x8a, + 0xae, 0x76, 0x20, 0x36, 0xd0, 0xd2, 0x11, 0x16, 0xc3, 0x95, 0xe4, 0xf2, 0x1c, 0x64, 0x6f, 0x6b, + 0xa9, 0x21, 0x63, 0x44, 0xb2, 0x0a, 0xa3, 0xc9, 0xd5, 0xaf, 0x51, 0xed, 0x4c, 0x3e, 0x86, 0x8b, + 0x30, 0x73, 0x7e, 0xbb, 0x38, 0xf3, 0xa6, 0x57, 0xc2, 0xc3, 0xfc, 0xa6, 0x01, 0xe5, 0xb4, 0xbc, + 0x90, 0xb7, 0x61, 0x2c, 0xbe, 0x7d, 0x17, 0x07, 0xd9, 0xa0, 0x53, 0x3d, 0xb9, 0xae, 0xa7, 0x85, + 0xdb, 0xa8, 0xe8, 0x64, 0x0e, 0x8a, 0x6c, 0xda, 0x29, 0xb9, 0xc1, 0x51, 0x9f, 0x74, 0x05, 0x4c, + 0x3d, 0x63, 0x96, 0x78, 0xca, 0xac, 0xfd, 0xcf, 0x79, 0x18, 0x53, 0x06, 0x8b, 0xbc, 0x0c, 0xc5, + 0xa5, 0x70, 0xd9, 0x6f, 0xec, 0x53, 0x57, 0x1c, 0x5d, 0xe1, 0x23, 0xbf, 0x5e, 0x68, 0x37, 0x11, + 0x68, 0xc5, 0xc5, 0xa4, 0x06, 0xe3, 0xfc, 0x3f, 0x79, 0xcb, 0x3a, 0x97, 0xb8, 0xdd, 0x39, 0xb2, + 0xbc, 0x5f, 0xad, 0x2e, 0xef, 0x1a, 0x09, 0xf9, 0x08, 0x80, 0x03, 0xd8, 0xf8, 0x0e, 0x10, 0x44, + 0x2f, 0x27, 0xf0, 0x59, 0x51, 0x41, 0xe4, 0xa9, 0x5f, 0x88, 0xa2, 0xa0, 0x30, 0xc4, 0x07, 0x46, + 0xfd, 0xc6, 0xfe, 0xe0, 0x4f, 0x0c, 0x27, 0x0f, 0x8c, 0xfa, 0x8d, 0x7d, 0x3b, 0x3b, 0xa2, 0x52, + 0x65, 0x49, 0xbe, 0x65, 0xc0, 0x45, 0x8b, 0x36, 0xfc, 0x07, 0x34, 0x38, 0xa8, 0x46, 0x88, 0xa5, + 0xd6, 0x78, 0x72, 0xf8, 0xe6, 0x2d, 0x51, 0xe3, 0x4b, 0x81, 0xe0, 0x82, 0x57, 0xbf, 0x5a, 0x9d, + 0xc8, 0x3e, 0xa6, 0x09, 0xc7, 0x54, 0x69, 0xfe, 0x99, 0xa1, 0x4c, 0x01, 0xb2, 0x02, 0xa3, 0xb1, + 0xb0, 0x08, 0xc7, 0x70, 0x6c, 0x99, 0x49, 0xb8, 0x45, 0x77, 0x6a, 0xcf, 0x88, 0x53, 0xa6, 0xe9, + 0x58, 0xe4, 0xb4, 0x19, 0x21, 0x81, 0xe4, 0x7d, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0x4c, 0x4e, 0x2e, + 0x35, 0x05, 0x36, 0x46, 0xd8, 0x6a, 0xa4, 0x24, 0x9f, 0x17, 0xa1, 0x4e, 0x79, 0x2d, 0x4d, 0x33, + 0x03, 0xb1, 0x76, 0xc4, 0x6b, 0x4c, 0x12, 0xc4, 0xab, 0x48, 0xeb, 0xdf, 0xc9, 0x41, 0x39, 0x3d, + 0xf1, 0xc8, 0x7b, 0x50, 0x92, 0xd7, 0xf8, 0xee, 0x3a, 0xe1, 0x9e, 0x48, 0xfd, 0x8a, 0xbb, 0x56, + 0x79, 0xf7, 0xcf, 0xde, 0x73, 0xb4, 0x14, 0x81, 0x1a, 0x01, 0x5b, 0x90, 0xd7, 0xc5, 0xdd, 0x10, + 0x65, 0x02, 0x45, 0x7e, 0xd4, 0x49, 0xa5, 0x7e, 0x95, 0x68, 0xe4, 0x75, 0xc8, 0xf3, 0xbb, 0xad, + 0x6a, 0xde, 0xb0, 0xfb, 0xb7, 0xab, 0xfc, 0x6a, 0x1e, 0x0f, 0x6c, 0xd0, 0x4f, 0x88, 0x18, 0x3e, + 0x59, 0x56, 0x6e, 0x46, 0x0e, 0x6b, 0xf9, 0x93, 0x24, 0x38, 0xfe, 0xb8, 0x93, 0xaf, 0x48, 0x7e, + 0x50, 0x28, 0xe6, 0xcb, 0x05, 0x71, 0x17, 0xee, 0xf7, 0xf2, 0x30, 0x1a, 0xd7, 0x4f, 0x08, 0xa0, + 0xbd, 0x21, 0x22, 0x14, 0xf0, 0x7f, 0x72, 0x01, 0x8a, 0xd2, 0xc4, 0x10, 0x51, 0x0a, 0x23, 0xa1, + 0x30, 0x2f, 0x66, 0x41, 0xda, 0x12, 0xdc, 0xbc, 0xb0, 0xe4, 0x4f, 0x72, 0x13, 0x62, 0x43, 0xa1, + 0x9f, 0x45, 0x51, 0x60, 0x03, 0x66, 0xc5, 0x68, 0x64, 0x02, 0x72, 0x1e, 0x8f, 0xfb, 0x1f, 0xb5, + 0x72, 0x9e, 0x4b, 0xde, 0x83, 0xa2, 0xe3, 0xba, 0xd4, 0xb5, 0x9d, 0x68, 0x80, 0xe7, 0x9e, 0x8b, + 0x8c, 0x1b, 0xd7, 0xe8, 0x48, 0x55, 0x8d, 0x48, 0x15, 0x46, 0xf1, 0xb5, 0xdf, 0x6e, 0x38, 0xd0, + 0x13, 0xc1, 0x09, 0x87, 0x22, 0x23, 0xdb, 0x08, 0xa9, 0x4b, 0x5e, 0x82, 0x02, 0x1b, 0x4d, 0xb1, + 0x1e, 0xc4, 0xd9, 0x20, 0x57, 0xd7, 0xd7, 0x78, 0x87, 0xdd, 0x3d, 0x63, 0x21, 0x02, 0x79, 0x01, + 0xf2, 0xdd, 0xb9, 0x1d, 0xa1, 0xe9, 0xcb, 0xc9, 0xb5, 0xe7, 0x18, 0x8d, 0x15, 0x93, 0x5b, 0x50, + 0x7c, 0xa8, 0x5f, 0x70, 0x3d, 0x9b, 0x1a, 0xc6, 0x18, 0x3f, 0x46, 0xac, 0x15, 0x61, 0x98, 0x5f, + 0xed, 0x34, 0x9f, 0x03, 0x48, 0xaa, 0xee, 0x0d, 0x26, 0x31, 0x3f, 0x82, 0xd1, 0xb8, 0x4a, 0xf2, + 0x2c, 0xc0, 0x3e, 0x3d, 0xb0, 0xf7, 0x9c, 0xb6, 0x2b, 0x9e, 0x2e, 0x2a, 0x59, 0xa3, 0xfb, 0xf4, + 0xe0, 0x2e, 0x02, 0xc8, 0x79, 0x18, 0xe9, 0xb0, 0x51, 0x95, 0x89, 0x8b, 0xad, 0xe1, 0x4e, 0x77, + 0x9b, 0x49, 0xe8, 0x2c, 0x8c, 0xa0, 0xf3, 0x43, 0x4c, 0xb4, 0x71, 0x4b, 0xfe, 0x34, 0x7f, 0x2b, + 0x87, 0x29, 0x2d, 0x94, 0x76, 0x92, 0xe7, 0x61, 0xbc, 0x11, 0x50, 0x5c, 0x8e, 0x1c, 0x66, 0x16, + 0x89, 0x7a, 0x4a, 0x09, 0x70, 0xc9, 0x25, 0x57, 0x60, 0x32, 0xc9, 0xa4, 0x6c, 0x37, 0xb6, 0xc5, + 0xf5, 0xf6, 0x92, 0x35, 0xde, 0x91, 0xa9, 0x94, 0xe7, 0xb7, 0xf1, 0xbe, 0x4a, 0x59, 0xbd, 0xd6, + 0x19, 0xc9, 0xac, 0xc8, 0xa3, 0xd6, 0xa4, 0x02, 0xc7, 0x83, 0x93, 0x73, 0x30, 0xec, 0x38, 0xbb, + 0x5d, 0x8f, 0xc7, 0xce, 0x97, 0x2c, 0xf1, 0x8b, 0xbc, 0x02, 0x53, 0xa1, 0xb7, 0xdb, 0x76, 0xa2, + 0x6e, 0x20, 0x72, 0x8a, 0xd0, 0x00, 0x45, 0x6a, 0xdc, 0x2a, 0xc7, 0x05, 0xf3, 0x1c, 0x4e, 0x5e, + 0x03, 0xa2, 0xd6, 0xe7, 0x6f, 0x7f, 0x4c, 0x1b, 0x5c, 0xd4, 0x4a, 0xd6, 0x94, 0x52, 0xb2, 0x8a, + 0x05, 0xe4, 0x73, 0x50, 0x0a, 0x68, 0x88, 0x26, 0x19, 0x76, 0x1b, 0x66, 0x4a, 0xb2, 0xc6, 0x24, + 0xec, 0x1e, 0x3d, 0x30, 0x6b, 0x30, 0xd5, 0x33, 0x1f, 0xc9, 0x6b, 0xdc, 0xba, 0x17, 0xeb, 0x73, + 0x89, 0x6f, 0x66, 0xf0, 0x85, 0x2f, 0xfd, 0x81, 0x78, 0x8e, 0x64, 0xb6, 0xa1, 0xa4, 0xea, 0xd7, + 0x13, 0x12, 0x07, 0x9c, 0xc3, 0xe8, 0x5a, 0xae, 0x7c, 0x86, 0x8f, 0x0e, 0x2b, 0x39, 0xcf, 0xc5, + 0x98, 0xda, 0xab, 0x50, 0x94, 0x56, 0x82, 0xfa, 0xcc, 0x8e, 0x30, 0x28, 0x0f, 0xac, 0xb8, 0xd4, + 0x7c, 0x09, 0x46, 0x84, 0x0a, 0x3d, 0xde, 0x11, 0x65, 0x7e, 0x23, 0x07, 0x93, 0x16, 0x65, 0x13, + 0x5c, 0x3c, 0x60, 0xf3, 0x19, 0xcb, 0x29, 0xad, 0x7d, 0xdb, 0x31, 0x79, 0x3a, 0xbe, 0x6b, 0xc0, + 0x74, 0x06, 0xee, 0x27, 0x4a, 0x42, 0xf7, 0x06, 0x8c, 0x2e, 0x78, 0x4e, 0xb3, 0xea, 0xba, 0x71, + 0x94, 0x30, 0x5a, 0x83, 0x2e, 0x9b, 0x4e, 0x0e, 0x83, 0xaa, 0x8b, 0x69, 0x8c, 0x4a, 0xae, 0x09, + 0xa1, 0x48, 0xd2, 0x64, 0xca, 0xac, 0xd5, 0xc0, 0xdb, 0x94, 0xe4, 0xac, 0xc6, 0x2b, 0x9f, 0x1c, + 0x98, 0x1c, 0x42, 0x3f, 0xb5, 0x43, 0x97, 0x7d, 0xe5, 0x33, 0xfd, 0x79, 0x03, 0x6d, 0x3b, 0xbf, + 0x99, 0x83, 0x73, 0xd9, 0x84, 0x9f, 0x34, 0x9f, 0x20, 0x26, 0x49, 0x51, 0x12, 0x83, 0x63, 0x3e, + 0x41, 0x9e, 0x51, 0x05, 0xf1, 0x13, 0x04, 0xb2, 0x03, 0xe3, 0xcb, 0x4e, 0x18, 0xdd, 0xa5, 0x4e, + 0x10, 0x6d, 0x53, 0x27, 0x1a, 0xc0, 0x82, 0x8d, 0x9f, 0x61, 0xc7, 0x45, 0x6d, 0x4f, 0x52, 0xa6, + 0x9f, 0x61, 0xd7, 0xd8, 0xc6, 0x82, 0x52, 0x18, 0x40, 0x50, 0xbe, 0x0e, 0x93, 0x75, 0xda, 0x72, + 0x3a, 0x7b, 0x7e, 0x40, 0x85, 0xef, 0xfc, 0x3a, 0x8c, 0xc7, 0xa0, 0x4c, 0x69, 0xd1, 0x8b, 0x35, + 0x7c, 0xa5, 0x23, 0x12, 0x55, 0xa2, 0x17, 0x9b, 0xbf, 0x91, 0x83, 0xf3, 0xd5, 0x86, 0x38, 0x68, + 0x10, 0x05, 0xf2, 0x3c, 0xf4, 0x53, 0xae, 0x9b, 0xdc, 0x80, 0xd1, 0xfb, 0xce, 0xa3, 0x65, 0x8a, + 0x0f, 0x25, 0xf3, 0xac, 0x54, 0xdc, 0xfc, 0x72, 0x1e, 0xd9, 0xb1, 0xdb, 0xcb, 0x4a, 0x70, 0xd4, + 0xcd, 0x66, 0xe1, 0x31, 0x37, 0x9b, 0x26, 0x0c, 0xdf, 0xf5, 0x9b, 0xae, 0x58, 0x9c, 0xc4, 0xb9, + 0xc5, 0x1e, 0x42, 0x2c, 0x51, 0x62, 0xfe, 0xd0, 0x80, 0x89, 0xb8, 0xc5, 0xd8, 0x84, 0x4f, 0xbd, + 0x4b, 0xae, 0xc0, 0x08, 0x56, 0x14, 0x3f, 0x02, 0x85, 0x8b, 0x46, 0x93, 0x81, 0x6c, 0xcf, 0xb5, + 0x64, 0xa1, 0xda, 0x13, 0x43, 0x8f, 0xd7, 0x13, 0xe6, 0x3f, 0xc1, 0x23, 0x11, 0xf5, 0x2b, 0xd9, + 0x4a, 0xa4, 0x34, 0xc4, 0x18, 0xb0, 0x21, 0xb9, 0x27, 0x36, 0x24, 0xf9, 0xbe, 0x43, 0xf2, 0x0b, + 0x39, 0x18, 0x8b, 0x1b, 0xfb, 0x19, 0xcb, 0x95, 0x10, 0x7f, 0xd7, 0x40, 0x37, 0x05, 0xea, 0x8a, + 0xae, 0x10, 0x01, 0xf9, 0xef, 0xc3, 0xb0, 0x98, 0x4c, 0x46, 0xea, 0x5c, 0x30, 0x35, 0xba, 0xc9, + 0x53, 0xda, 0x38, 0xa0, 0xa1, 0x25, 0xe8, 0xf0, 0x2a, 0xc6, 0x16, 0xdd, 0x16, 0x27, 0x64, 0x4f, + 0xed, 0x1a, 0x95, 0x7d, 0x15, 0x23, 0xf9, 0xb0, 0x81, 0x56, 0xa7, 0x7f, 0x50, 0x80, 0x72, 0x9a, + 0xe4, 0xe4, 0x6c, 0x14, 0x6b, 0xdd, 0x6d, 0xf1, 0x0e, 0x09, 0x66, 0xa3, 0xe8, 0x74, 0xb7, 0x2d, + 0x06, 0x23, 0x57, 0xa0, 0xb0, 0x16, 0x78, 0x0f, 0xf0, 0xab, 0xc5, 0x33, 0x2c, 0x9d, 0xc0, 0x7b, + 0xa0, 0xc6, 0x24, 0xb3, 0x72, 0xdc, 0xd0, 0x2e, 0xd7, 0x31, 0xbc, 0x15, 0x0d, 0x6b, 0xb1, 0xa1, + 0x6d, 0x86, 0xe9, 0xb4, 0x47, 0x12, 0x8d, 0x2d, 0x95, 0x35, 0xea, 0x04, 0x22, 0x73, 0x82, 0x50, + 0x67, 0xb8, 0x54, 0x6e, 0x23, 0x98, 0xe7, 0x34, 0xb6, 0x54, 0x24, 0xd2, 0x04, 0xa2, 0xfc, 0x94, + 0x13, 0xf8, 0xe4, 0x3d, 0x9e, 0x7c, 0x3e, 0x6c, 0x46, 0x65, 0x6d, 0xab, 0xb3, 0x39, 0x83, 0xef, + 0x93, 0xf4, 0x11, 0xae, 0xc1, 0x28, 0xba, 0xbc, 0xd0, 0x91, 0x51, 0x3c, 0x91, 0x99, 0x8c, 0xff, + 0x06, 0x8c, 0x27, 0xb0, 0x63, 0x77, 0x46, 0xc2, 0x84, 0xbc, 0x0b, 0x63, 0x6a, 0xd0, 0x32, 0x0f, + 0xad, 0xbd, 0xc4, 0xaf, 0xc9, 0xf5, 0x49, 0x0f, 0xa8, 0x12, 0x98, 0x9f, 0x57, 0xa5, 0x44, 0x2c, + 0xda, 0xc7, 0x4a, 0x89, 0xf9, 0x6b, 0x68, 0xc6, 0xb7, 0xfc, 0x88, 0x0a, 0xeb, 0xe5, 0xa9, 0xd5, + 0x63, 0x89, 0x0b, 0x79, 0x48, 0x8b, 0x69, 0xd1, 0xbe, 0xee, 0x14, 0xef, 0xf7, 0xff, 0xae, 0x01, + 0x67, 0x33, 0x69, 0xc9, 0x75, 0x80, 0xc4, 0x46, 0x14, 0xbd, 0xc4, 0x93, 0x45, 0xc7, 0x50, 0x4b, + 0xc1, 0x20, 0x5f, 0x4b, 0x5b, 0x77, 0x27, 0x2f, 0x4e, 0xf2, 0x49, 0x95, 0x09, 0xdd, 0xba, 0xcb, + 0xb0, 0xe9, 0xcc, 0xef, 0xe6, 0x61, 0xaa, 0xe7, 0x29, 0xce, 0x13, 0xa2, 0x08, 0xf6, 0x53, 0x0f, + 0xbd, 0xf1, 0xe3, 0x8e, 0x6b, 0xfd, 0x1e, 0x02, 0xcd, 0x78, 0xf6, 0x0d, 0xdd, 0x62, 0x22, 0x4f, + 0xf9, 0x09, 0xaf, 0xbf, 0x85, 0xd9, 0x4f, 0x04, 0xbe, 0xd2, 0xb7, 0xb6, 0x27, 0xf0, 0x54, 0xe0, + 0xdf, 0xe0, 0x97, 0xd4, 0x7e, 0x2d, 0x07, 0xd3, 0x3d, 0xdf, 0xfc, 0xd4, 0xce, 0xba, 0xf7, 0xb5, + 0xd5, 0xed, 0xb9, 0x7e, 0x63, 0x3a, 0x90, 0x15, 0xf1, 0x3f, 0x0d, 0x38, 0xdf, 0x87, 0x92, 0x1c, + 0xa4, 0x85, 0x88, 0x5b, 0x15, 0x37, 0x8f, 0xaf, 0xf0, 0x89, 0x88, 0xd2, 0xa7, 0x26, 0x09, 0xdf, + 0xc8, 0x01, 0x6c, 0xd1, 0xed, 0xa7, 0x3b, 0xd5, 0xd6, 0x17, 0x35, 0x01, 0x50, 0x1c, 0x98, 0x83, + 0x67, 0xda, 0x5a, 0x45, 0x47, 0xe2, 0xe0, 0x79, 0xb6, 0xe2, 0x67, 0x63, 0x72, 0xd9, 0xcf, 0xc6, + 0x98, 0xdb, 0x30, 0x73, 0x87, 0x46, 0xc9, 0x4a, 0x28, 0xf7, 0x90, 0xc7, 0xb3, 0x7d, 0x15, 0x46, + 0x05, 0xbe, 0xfe, 0x04, 0x80, 0x0c, 0x89, 0xf3, 0x5c, 0x2b, 0x41, 0x30, 0x29, 0x9c, 0x5f, 0xa0, + 0x4d, 0x1a, 0xd1, 0x4f, 0xb7, 0x9a, 0x3a, 0x10, 0xfe, 0x29, 0xfc, 0x35, 0x91, 0x81, 0x6a, 0x38, + 0xb1, 0x7f, 0x36, 0xe1, 0x6c, 0xdc, 0xf6, 0x27, 0xc9, 0xf7, 0x06, 0xb3, 0x25, 0xc4, 0xbd, 0xcf, + 0x84, 0xe3, 0x31, 0x4e, 0xc4, 0x47, 0x70, 0x51, 0x12, 0x6c, 0x79, 0xf1, 0x49, 0xcc, 0x40, 0xb4, + 0xe4, 0x6d, 0x18, 0x53, 0x68, 0xc4, 0xed, 0x75, 0x3c, 0xed, 0x7c, 0xe8, 0x45, 0x7b, 0x76, 0xc8, + 0xe1, 0xea, 0x69, 0xa7, 0x82, 0x6e, 0x7e, 0x15, 0x9e, 0x89, 0xe3, 0x56, 0x32, 0xaa, 0x4e, 0x31, + 0x37, 0x4e, 0xc7, 0x7c, 0x25, 0xf9, 0xac, 0xa5, 0x76, 0x1c, 0x01, 0x2f, 0x79, 0x13, 0xf5, 0xb3, + 0xc4, 0xc7, 0x5c, 0x52, 0x52, 0x10, 0x8a, 0xb5, 0x28, 0x01, 0x98, 0x6f, 0x29, 0x8d, 0xcd, 0x60, + 0xa8, 0x11, 0x1b, 0x69, 0xe2, 0x6f, 0xe4, 0x60, 0x72, 0x75, 0x69, 0x61, 0x3e, 0x76, 0x23, 0x7f, + 0xc6, 0xf2, 0x80, 0x69, 0xdf, 0xd6, 0x5f, 0xdf, 0x98, 0x1b, 0x30, 0x9d, 0xea, 0x06, 0x7c, 0x2c, + 0xe9, 0x5d, 0x1e, 0x5f, 0x12, 0x83, 0xe5, 0xca, 0x72, 0x2e, 0x8b, 0xfd, 0xe6, 0x2d, 0x2b, 0x85, + 0x6d, 0x7e, 0x77, 0x38, 0xc5, 0x57, 0xa8, 0xb0, 0x57, 0x61, 0x74, 0x29, 0x0c, 0xbb, 0x34, 0xd8, + 0xb0, 0x96, 0x55, 0x1b, 0xd1, 0x43, 0xa0, 0xdd, 0x0d, 0x9a, 0x56, 0x82, 0x40, 0x5e, 0x86, 0xa2, + 0xb8, 0x6b, 0x28, 0x75, 0x02, 0x1e, 0x97, 0xc7, 0x57, 0x15, 0xad, 0xb8, 0x98, 0xbc, 0x0e, 0x25, + 0xfe, 0x3f, 0x97, 0x36, 0xd1, 0xe1, 0xe8, 0xab, 0x12, 0xe8, 0x5c, 0x3a, 0x2d, 0x0d, 0x8d, 0xed, + 0xcc, 0xe4, 0x6b, 0xac, 0xac, 0x45, 0x85, 0x64, 0x67, 0x26, 0x1f, 0x6e, 0xc5, 0x36, 0xa9, 0x48, + 0xe4, 0x1a, 0xe4, 0xab, 0xf3, 0x96, 0x9a, 0xf5, 0xdc, 0x69, 0x04, 0xfc, 0xd5, 0x00, 0xed, 0xc1, + 0xb3, 0xea, 0xbc, 0x45, 0xe6, 0xa0, 0x88, 0x0f, 0xda, 0xb8, 0x34, 0x10, 0x51, 0xaf, 0x28, 0x35, + 0x1d, 0x01, 0x53, 0x4f, 0x1e, 0x25, 0x1e, 0xb9, 0x01, 0x23, 0x0b, 0x5e, 0xd8, 0x69, 0x3a, 0x07, + 0x22, 0x01, 0x10, 0x1e, 0x86, 0xb8, 0x1c, 0xa4, 0xca, 0x99, 0xc0, 0x22, 0x2f, 0xc3, 0x50, 0xbd, + 0xe1, 0x77, 0xd8, 0x6e, 0x2b, 0x0e, 0x6d, 0x09, 0x19, 0x40, 0x4b, 0xef, 0xc1, 0x00, 0x78, 0xfd, + 0x9d, 0xdf, 0xe2, 0x1b, 0x55, 0xae, 0xbf, 0xa7, 0x6f, 0xef, 0x09, 0x9c, 0xde, 0xe0, 0x43, 0x78, + 0x92, 0xc1, 0x87, 0xdb, 0x70, 0xfe, 0x0e, 0x9a, 0xfa, 0x75, 0x1a, 0x60, 0xce, 0x55, 0xfe, 0x38, + 0xd6, 0x86, 0xb5, 0x24, 0x6e, 0x2e, 0xe2, 0x3d, 0x32, 0xbe, 0x1b, 0xb0, 0x43, 0x8e, 0x23, 0xdf, + 0xd5, 0x4a, 0xbd, 0x08, 0xd2, 0x8f, 0x11, 0xf9, 0x32, 0xcc, 0x64, 0x15, 0x89, 0x3b, 0x8c, 0x18, + 0xd7, 0x9e, 0x5d, 0x81, 0x1a, 0x58, 0x9e, 0xc5, 0x81, 0x2c, 0x43, 0x99, 0xc3, 0xab, 0x6e, 0xcb, + 0x6b, 0x2f, 0xb6, 0x1c, 0xaf, 0x89, 0x37, 0x1a, 0xc5, 0xb5, 0x54, 0xc1, 0xd5, 0x61, 0x85, 0x36, + 0x65, 0xa5, 0x5a, 0x74, 0x52, 0x8a, 0x12, 0xd5, 0x51, 0xbd, 0x7a, 0x7f, 0x39, 0x99, 0x53, 0x9f, + 0xad, 0x73, 0x23, 0xed, 0xdb, 0x8e, 0x39, 0x37, 0xda, 0x80, 0xe9, 0x54, 0x37, 0x48, 0x75, 0xa4, + 0x81, 0xd3, 0xea, 0x28, 0x45, 0x63, 0xa5, 0xb0, 0xcd, 0xff, 0x32, 0x9c, 0xe2, 0x2b, 0x7c, 0x45, + 0x26, 0x0c, 0x73, 0x6d, 0xa3, 0x66, 0x08, 0xe4, 0xba, 0xc8, 0x12, 0x25, 0xe4, 0x02, 0xe4, 0xeb, + 0xf5, 0x55, 0x35, 0x7f, 0x69, 0x18, 0xfa, 0x16, 0x83, 0xb1, 0x11, 0x42, 0x37, 0x90, 0x72, 0xc5, + 0xac, 0x41, 0x83, 0x48, 0x3c, 0xd7, 0xfb, 0x62, 0x32, 0x8f, 0x0b, 0x49, 0x7f, 0x8b, 0x79, 0x9c, + 0xcc, 0xde, 0x79, 0x98, 0xad, 0x86, 0x21, 0x0d, 0x22, 0xfe, 0xe8, 0x42, 0xd8, 0x6d, 0xd1, 0x40, + 0xc8, 0x9a, 0xd0, 0x31, 0xfc, 0xb1, 0xff, 0x46, 0x68, 0xf5, 0x45, 0x24, 0x57, 0xa1, 0x58, 0xed, + 0xba, 0x1e, 0x6d, 0x37, 0xb4, 0xe8, 0x7a, 0x47, 0xc0, 0xac, 0xb8, 0x94, 0x7c, 0x08, 0x67, 0x05, + 0x91, 0x54, 0x38, 0xa2, 0x07, 0xb8, 0xae, 0xe1, 0x3b, 0x58, 0x31, 0x17, 0xa4, 0x9a, 0xb2, 0x45, + 0x97, 0x64, 0x53, 0x92, 0x2a, 0x94, 0x17, 0xf1, 0x9c, 0x54, 0x3e, 0xda, 0xed, 0x07, 0x22, 0xb9, + 0x36, 0x6a, 0x2e, 0x7e, 0x86, 0x6a, 0xbb, 0x71, 0xa1, 0xd5, 0x83, 0x4e, 0xee, 0xc1, 0x74, 0x1a, + 0xc6, 0xf4, 0xf1, 0x68, 0xf2, 0xa8, 0x5e, 0x0f, 0x17, 0x54, 0xcc, 0x59, 0x54, 0x64, 0x1b, 0xa6, + 0xaa, 0x51, 0x14, 0x78, 0xdb, 0xdd, 0x88, 0xa6, 0x54, 0x97, 0x74, 0x34, 0xc6, 0xe5, 0x52, 0x7d, + 0x3d, 0x23, 0x84, 0x71, 0xda, 0x89, 0x29, 0x63, 0x15, 0x66, 0xf5, 0xb2, 0x23, 0x6e, 0xfc, 0x2e, + 0xa7, 0x78, 0xbb, 0x52, 0x5c, 0x89, 0x92, 0x0e, 0xdd, 0x6a, 0x78, 0xd0, 0x6a, 0xd1, 0x28, 0xc0, + 0x93, 0x7b, 0x7c, 0xdb, 0xd2, 0x14, 0x31, 0x40, 0x17, 0x95, 0xe7, 0x68, 0xf1, 0xfd, 0x52, 0x2d, + 0x3c, 0x52, 0xe3, 0xa9, 0x2d, 0x1f, 0xa5, 0x01, 0x97, 0x8f, 0x26, 0x4c, 0x2d, 0xb6, 0x1b, 0xc1, + 0x01, 0xde, 0x40, 0x95, 0x8d, 0x1b, 0x3f, 0xa1, 0x71, 0xf2, 0xe1, 0x9a, 0x4b, 0x8e, 0x94, 0xb0, + 0xac, 0xe6, 0xf5, 0x32, 0x36, 0xff, 0x3f, 0x28, 0xa7, 0xfb, 0xf2, 0x31, 0x1f, 0x23, 0x3f, 0x4d, + 0x68, 0x36, 0x1b, 0xe9, 0xf4, 0xb7, 0x90, 0x1b, 0xda, 0x8b, 0xd3, 0x46, 0x92, 0x21, 0x41, 0x79, + 0x1b, 0x5a, 0x7b, 0x67, 0x5a, 0x4e, 0xe3, 0x5c, 0xd6, 0x34, 0x36, 0x7f, 0x31, 0x07, 0x53, 0x3c, + 0x9a, 0xf4, 0xe9, 0xb7, 0x15, 0xdf, 0xd5, 0x94, 0xb3, 0xf4, 0x05, 0xa6, 0xbe, 0xee, 0x18, 0x6b, + 0xf1, 0x23, 0x38, 0xdb, 0xd3, 0x15, 0xa8, 0xa0, 0x17, 0x64, 0x1c, 0x6f, 0x8f, 0x8a, 0x9e, 0xcd, + 0xae, 0x64, 0xf3, 0x96, 0xd5, 0x43, 0x61, 0xfe, 0xa3, 0x5c, 0x0f, 0x7f, 0x61, 0x37, 0xaa, 0x96, + 0xa0, 0x71, 0x3a, 0x4b, 0x30, 0xf7, 0x89, 0x2c, 0xc1, 0xfc, 0x20, 0x96, 0xe0, 0x87, 0x30, 0xbe, + 0x4e, 0x1d, 0x66, 0xd1, 0x88, 0xeb, 0x72, 0x05, 0xed, 0x35, 0x68, 0x56, 0x26, 0xf5, 0x4b, 0x7c, + 0xd5, 0x36, 0x62, 0x04, 0x4c, 0xb5, 0xf0, 0xfb, 0x73, 0x96, 0xce, 0x41, 0x5d, 0x34, 0x86, 0xfa, + 0x2f, 0x1a, 0x66, 0x00, 0x63, 0xf5, 0xfa, 0xea, 0x96, 0x13, 0x30, 0x6d, 0x11, 0x32, 0x93, 0x51, + 0x86, 0x89, 0x1a, 0x89, 0xe2, 0xed, 0x8d, 0x0f, 0x95, 0x58, 0x4c, 0xb1, 0x48, 0x62, 0x11, 0x52, + 0xc1, 0x23, 0xe2, 0x04, 0x4c, 0x8b, 0x88, 0x13, 0x30, 0xf3, 0x1f, 0x16, 0xa0, 0xcc, 0x43, 0x1f, + 0xd9, 0xbe, 0x57, 0xa4, 0x41, 0xea, 0x79, 0x0e, 0xc3, 0x38, 0xfd, 0x73, 0x18, 0x9f, 0x20, 0xc6, + 0x56, 0xb9, 0x8b, 0x9d, 0x1f, 0xe0, 0x2e, 0xf6, 0x9b, 0xda, 0x45, 0xe6, 0x42, 0xf2, 0xde, 0xea, + 0x7e, 0x77, 0x9b, 0x1e, 0x7f, 0x85, 0xf9, 0x0d, 0xf5, 0xc6, 0xf1, 0x50, 0x12, 0x7d, 0x82, 0x94, + 0xc7, 0xdc, 0x35, 0x8e, 0xb5, 0xd8, 0xf0, 0x69, 0xe2, 0xcd, 0x47, 0xfe, 0x9f, 0xc6, 0x9b, 0x2f, + 0x02, 0x28, 0xb9, 0x71, 0x8a, 0xc9, 0xb3, 0xab, 0x27, 0xe7, 0xc5, 0x51, 0x08, 0xcd, 0xdf, 0x9c, + 0x80, 0xa9, 0x7a, 0x7d, 0x75, 0xc1, 0x73, 0x76, 0xdb, 0x7e, 0x18, 0x79, 0x8d, 0xa5, 0xf6, 0x8e, + 0xcf, 0xa6, 0xf0, 0x3a, 0x0d, 0xa3, 0xdb, 0x4d, 0xff, 0xa1, 0x1a, 0xfb, 0x1c, 0xd1, 0x30, 0xb2, + 0x77, 0x9a, 0xfe, 0x43, 0x2b, 0x2e, 0x66, 0x4b, 0xc4, 0x62, 0x10, 0xc4, 0x2f, 0xbc, 0xe0, 0x12, + 0x41, 0x19, 0xc0, 0xe2, 0x70, 0x36, 0x4b, 0xea, 0x5d, 0x9e, 0xe4, 0x84, 0x27, 0xd4, 0xc3, 0x59, + 0x12, 0x72, 0x90, 0x25, 0xcb, 0x08, 0xed, 0x15, 0x58, 0xa1, 0x35, 0xcf, 0x6b, 0x51, 0xeb, 0x49, + 0xb1, 0x78, 0x2a, 0x10, 0xa1, 0x38, 0xba, 0x76, 0x07, 0xe1, 0xaa, 0xf1, 0xde, 0x33, 0x07, 0x0e, + 0xe0, 0x2c, 0x33, 0x2e, 0x4f, 0x6d, 0x73, 0x5c, 0x13, 0x3a, 0xc1, 0xc4, 0xfb, 0x12, 0x19, 0x86, + 0x87, 0xfa, 0x0a, 0x44, 0x66, 0x0d, 0xe4, 0x17, 0x0d, 0x78, 0x36, 0xb3, 0x24, 0x9e, 0xdd, 0x63, + 0xda, 0xcd, 0x01, 0x45, 0x69, 0x60, 0x62, 0x98, 0x57, 0xfa, 0x55, 0x6d, 0x67, 0xa8, 0x82, 0xe3, + 0x6b, 0x22, 0xff, 0xda, 0x80, 0xf3, 0x1a, 0x06, 0x66, 0x94, 0x6c, 0xd1, 0x76, 0x24, 0xdf, 0x47, + 0xef, 0x23, 0xd7, 0x1f, 0x3f, 0x19, 0xb9, 0x7e, 0x5e, 0xff, 0x16, 0x9e, 0x75, 0x1b, 0xab, 0x57, + 0x77, 0x8a, 0x7d, 0x5a, 0x48, 0x7e, 0x12, 0xa6, 0xb0, 0x48, 0xda, 0x3f, 0x4c, 0x66, 0xd1, 0x6c, + 0x2a, 0xd5, 0xe6, 0xbe, 0x7f, 0x58, 0x19, 0xd7, 0x0a, 0xf0, 0x5a, 0x21, 0xd6, 0x16, 0x9b, 0x4b, + 0x5e, 0x7b, 0xc7, 0xd7, 0x32, 0xc8, 0xa6, 0x99, 0x91, 0x7f, 0x6b, 0xc0, 0x2c, 0x83, 0xf2, 0x06, + 0xdf, 0x0e, 0xfc, 0x56, 0x5c, 0x1e, 0x8a, 0x1b, 0xe7, 0x7d, 0x3a, 0xa8, 0xf9, 0x64, 0x3a, 0xe8, + 0x45, 0x6c, 0x32, 0x9f, 0xfd, 0xf6, 0x4e, 0xe0, 0xb7, 0x92, 0xe6, 0x6b, 0x49, 0x59, 0xfa, 0x35, + 0x92, 0xfc, 0xbc, 0x01, 0x17, 0xb4, 0x6d, 0x94, 0x7a, 0x29, 0x6f, 0x76, 0x52, 0x73, 0x0e, 0xa8, + 0x45, 0xb5, 0xeb, 0x42, 0xd2, 0xaf, 0x60, 0x0b, 0x92, 0x75, 0x01, 0xdb, 0x62, 0xb7, 0x38, 0x96, + 0xd2, 0x84, 0xfe, 0xb5, 0x10, 0x0f, 0xa6, 0xd0, 0xb1, 0xa4, 0xf9, 0x25, 0x66, 0xfa, 0xfb, 0x25, + 0xae, 0x88, 0xaa, 0x9f, 0xc3, 0x8b, 0x4f, 0xfd, 0x9d, 0x13, 0xbd, 0x5c, 0xc9, 0xcf, 0xc0, 0x85, + 0x1e, 0x60, 0x3c, 0xaf, 0xce, 0xf6, 0x9d, 0x57, 0xaf, 0x1c, 0x1d, 0x56, 0x5e, 0xca, 0xaa, 0x2d, + 0x6b, 0x4e, 0xf5, 0xaf, 0x81, 0xdc, 0x03, 0x48, 0x0a, 0x67, 0xcf, 0xa1, 0x28, 0xbe, 0x22, 0x24, + 0x41, 0x29, 0x61, 0xfa, 0x59, 0xa9, 0x4d, 0x5d, 0xc6, 0x12, 0x24, 0xb2, 0x0a, 0x25, 0xe5, 0x7a, + 0xd7, 0xc1, 0xec, 0x79, 0xce, 0xee, 0xfb, 0x87, 0x15, 0x0d, 0xce, 0x76, 0x7f, 0xea, 0x0d, 0x31, + 0xd5, 0xdf, 0xa4, 0x21, 0x92, 0x3f, 0x34, 0x60, 0x86, 0x01, 0x12, 0x41, 0x11, 0x0d, 0x9d, 0x3d, + 0x4e, 0x92, 0xf7, 0x9e, 0x8c, 0x24, 0x7f, 0x0e, 0xdb, 0xa8, 0x4a, 0x72, 0xcf, 0xc7, 0x67, 0x36, + 0x0e, 0x25, 0x58, 0xf3, 0x4b, 0x6a, 0x12, 0x7c, 0x61, 0x00, 0x09, 0xe6, 0x5d, 0x7d, 0xb2, 0x04, + 0xf7, 0xad, 0xc5, 0xfc, 0x66, 0x0e, 0xc6, 0x14, 0xd3, 0x90, 0x7c, 0x01, 0x4a, 0xab, 0xc1, 0xae, + 0xd3, 0xf6, 0x7e, 0xca, 0x51, 0x8e, 0xce, 0xd1, 0xf4, 0xf4, 0x15, 0xb8, 0xa5, 0x61, 0x61, 0xc8, + 0x33, 0x75, 0x5a, 0xea, 0xa6, 0x85, 0x99, 0x96, 0x16, 0x42, 0x4f, 0x69, 0x1e, 0xbd, 0x97, 0x61, + 0x1e, 0x9d, 0x2a, 0xcf, 0xcb, 0xdb, 0xbd, 0x46, 0xd2, 0xe0, 0x69, 0x59, 0xcc, 0x5f, 0xce, 0x41, + 0x79, 0x3d, 0xe8, 0x86, 0x11, 0x75, 0xe5, 0xc1, 0xef, 0x67, 0xeb, 0x8d, 0x3c, 0xfd, 0xe3, 0x8e, + 0x09, 0x6d, 0x2a, 0xfc, 0xfa, 0x6f, 0x57, 0xce, 0x98, 0x5f, 0x81, 0x99, 0x74, 0x77, 0xe0, 0x26, + 0xab, 0x0a, 0x93, 0x3a, 0x3c, 0x7d, 0xeb, 0x33, 0x4d, 0x65, 0xa5, 0xf1, 0xcd, 0x3f, 0xcd, 0xa5, + 0x79, 0x0b, 0x4f, 0xd8, 0x8b, 0x30, 0xc2, 0x9f, 0x2c, 0x96, 0x17, 0xd3, 0x44, 0x0e, 0x58, 0x04, + 0x59, 0xb2, 0xec, 0x34, 0xf7, 0x7f, 0xe3, 0x73, 0xb1, 0x7c, 0xf6, 0xb9, 0x18, 0x79, 0x03, 0x4a, + 0x18, 0xeb, 0x5b, 0x75, 0xdd, 0x80, 0x59, 0x72, 0x85, 0x24, 0xdd, 0xeb, 0x43, 0xba, 0x6d, 0xf3, + 0x98, 0x60, 0xc7, 0x75, 0x03, 0x4b, 0xc3, 0x23, 0xf3, 0x30, 0xa3, 0x85, 0x96, 0x4b, 0xfa, 0xa1, + 0x64, 0xa7, 0x1f, 0x61, 0x01, 0x27, 0xce, 0x44, 0xc6, 0x8c, 0xe7, 0x7e, 0x93, 0x99, 0x62, 0x68, + 0xa0, 0xeb, 0xa9, 0x32, 0xe5, 0xa4, 0x97, 0xf1, 0x26, 0x04, 0xf3, 0xa7, 0xb4, 0x9c, 0x8e, 0x96, + 0x92, 0x88, 0x23, 0x9a, 0x7f, 0x69, 0xb0, 0xb9, 0xd6, 0xd8, 0xff, 0x8c, 0xdd, 0x4c, 0x66, 0x9f, + 0x74, 0x8c, 0xa3, 0xf6, 0x3f, 0x19, 0xfc, 0x6e, 0xa1, 0x10, 0x9f, 0x37, 0x61, 0x98, 0x3f, 0x90, + 0x2c, 0x6e, 0xc1, 0xa9, 0x5c, 0x78, 0x41, 0x12, 0x5b, 0xc4, 0x9f, 0x59, 0xb6, 0x04, 0x81, 0xba, + 0x77, 0xcd, 0x0d, 0xb4, 0x77, 0x55, 0xde, 0x6f, 0x18, 0xec, 0x5d, 0x20, 0xe3, 0xe4, 0xf7, 0x1b, + 0xcc, 0xff, 0x93, 0xe3, 0xdf, 0x23, 0x1a, 0x35, 0x68, 0xc6, 0xf0, 0x2b, 0x50, 0x60, 0x72, 0xa0, + 0xa6, 0x65, 0x67, 0xb2, 0xa2, 0x3d, 0x05, 0xe7, 0x37, 0xd1, 0xa7, 0x85, 0xba, 0x56, 0xbd, 0x0c, + 0x8f, 0xea, 0x58, 0x9d, 0x37, 0x88, 0x81, 0xaf, 0xee, 0xf8, 0x2e, 0x55, 0xa7, 0x43, 0x5b, 0x7f, + 0x20, 0x09, 0xcb, 0xd9, 0xc6, 0x34, 0xbe, 0x93, 0xa6, 0x1e, 0x46, 0xb5, 0x76, 0x1c, 0x9b, 0xdf, + 0x85, 0x52, 0xb5, 0x6d, 0x72, 0x7d, 0x6d, 0x11, 0x26, 0xf4, 0x4c, 0x39, 0xc2, 0x61, 0x8c, 0xd9, + 0x2d, 0x52, 0x59, 0x76, 0x54, 0xd7, 0xa4, 0x4e, 0xc4, 0x36, 0xfe, 0x5a, 0x3a, 0x14, 0xf5, 0xb1, + 0x0a, 0x9e, 0x65, 0xd2, 0xee, 0xcd, 0xe3, 0xa5, 0x93, 0x28, 0xc1, 0x0e, 0x9f, 0x87, 0xb2, 0x98, + 0x99, 0x71, 0x5e, 0x02, 0x74, 0xcb, 0x2d, 0x2d, 0x58, 0xea, 0x6c, 0x6a, 0x78, 0x6e, 0x60, 0x21, + 0xd4, 0xfc, 0x8e, 0x01, 0x17, 0xc4, 0xc3, 0xcf, 0x16, 0x0d, 0xa3, 0xc0, 0xe3, 0x69, 0x0e, 0x50, + 0x1e, 0xbf, 0x40, 0xde, 0x96, 0x09, 0x6c, 0x75, 0x05, 0x99, 0xae, 0xa3, 0x36, 0x2e, 0x84, 0x72, + 0x08, 0x53, 0xd8, 0xca, 0xc4, 0xb5, 0x6f, 0x8a, 0xc4, 0xb5, 0xb9, 0xe3, 0x89, 0xe3, 0x79, 0xe1, + 0xd2, 0xb6, 0x4c, 0x58, 0xfb, 0xed, 0x1c, 0x9c, 0xcd, 0x68, 0xd6, 0xe6, 0x17, 0x9e, 0x52, 0xe5, + 0x50, 0xd3, 0x94, 0x83, 0xcc, 0x6c, 0xde, 0xb7, 0xe3, 0x33, 0x75, 0xc5, 0x6f, 0x1a, 0x70, 0x5e, + 0x97, 0x1e, 0x71, 0x8e, 0xb0, 0x79, 0x8b, 0xbc, 0x05, 0xc3, 0x77, 0xa9, 0xe3, 0x52, 0x79, 0x7d, + 0xf6, 0x6c, 0xea, 0x39, 0x07, 0x5e, 0xc8, 0xd9, 0xfe, 0x29, 0x9f, 0xca, 0x67, 0x2c, 0x41, 0x42, + 0x16, 0x44, 0xe3, 0x78, 0x68, 0x91, 0x29, 0xa3, 0x6c, 0xb2, 0xaa, 0x3a, 0xc6, 0xa9, 0xf9, 0xbb, + 0x06, 0x3c, 0x73, 0x0c, 0x0d, 0x1b, 0x38, 0x36, 0xf4, 0xea, 0xc0, 0xe1, 0xc2, 0x82, 0x50, 0xf2, + 0x2e, 0x4c, 0xae, 0x0b, 0x93, 0x55, 0x0e, 0x87, 0xf2, 0x0a, 0x96, 0xb4, 0x66, 0x6d, 0x39, 0x2e, + 0x69, 0x64, 0x72, 0x15, 0x8a, 0x77, 0xfd, 0x30, 0x6a, 0x27, 0xa9, 0x0a, 0xf1, 0xe4, 0x66, 0x4f, + 0xc0, 0xac, 0xb8, 0x94, 0x99, 0x05, 0x7a, 0x33, 0x45, 0x28, 0xeb, 0xf3, 0x30, 0xcc, 0x70, 0x62, + 0xcf, 0x28, 0xca, 0x01, 0x3e, 0x4b, 0xec, 0xb9, 0x96, 0x28, 0x8a, 0x7d, 0xf2, 0xb9, 0xcc, 0x88, + 0x93, 0x6f, 0x1a, 0x50, 0xd6, 0x79, 0x3f, 0xee, 0xd0, 0xbc, 0xa3, 0x0d, 0xcd, 0x33, 0xd9, 0x43, + 0xd3, 0x7f, 0x4c, 0x7a, 0xb2, 0x86, 0x0d, 0x34, 0x16, 0x26, 0x0c, 0x2f, 0xf8, 0x2d, 0xc7, 0x6b, + 0xab, 0x99, 0xae, 0x5c, 0x84, 0x58, 0xa2, 0x44, 0xe9, 0xad, 0x7c, 0xdf, 0xde, 0x32, 0x7f, 0xa5, + 0x00, 0x17, 0x2c, 0xba, 0xeb, 0x31, 0x03, 0x69, 0x23, 0xf4, 0xda, 0xbb, 0x5a, 0x3c, 0x90, 0x99, + 0xea, 0x70, 0x71, 0x0b, 0x82, 0x41, 0xe2, 0xfe, 0x7e, 0x19, 0x8a, 0x4c, 0x4b, 0x2b, 0x7d, 0x8e, + 0xde, 0x2e, 0xcc, 0xd7, 0xc8, 0xc7, 0x55, 0x16, 0x93, 0x6b, 0x62, 0x0d, 0x51, 0xee, 0xa9, 0xb1, + 0x35, 0xe4, 0x47, 0x87, 0x15, 0xe0, 0xcf, 0xd0, 0xb0, 0x52, 0xb1, 0x8e, 0xc4, 0x46, 0x55, 0xa1, + 0x8f, 0x51, 0x75, 0x1f, 0x66, 0xaa, 0x2e, 0xd7, 0x4f, 0x4e, 0x73, 0x2d, 0xf0, 0xda, 0x0d, 0xaf, + 0xe3, 0x34, 0xa5, 0x51, 0x8e, 0x3e, 0x4f, 0x27, 0x2e, 0xb7, 0x3b, 0x31, 0x82, 0x95, 0x49, 0xc6, + 0x3e, 0x63, 0x61, 0xa5, 0xce, 0xd3, 0xf1, 0x71, 0x47, 0x26, 0x7e, 0x86, 0xdb, 0x0e, 0x79, 0x3e, + 0x3e, 0x2b, 0x2e, 0x46, 0x73, 0x0e, 0xaf, 0xaa, 0xae, 0x2f, 0xd7, 0xef, 0x89, 0xab, 0x9f, 0x32, + 0x8c, 0x9e, 0xdf, 0x6c, 0x8d, 0x9a, 0x21, 0x9e, 0xbd, 0x68, 0x78, 0x09, 0x5d, 0xbd, 0x7e, 0x97, + 0xd1, 0x15, 0x7b, 0xe8, 0xc2, 0x70, 0x4f, 0xa5, 0xe3, 0x78, 0xe4, 0x06, 0x00, 0x0f, 0x44, 0x46, + 0x81, 0x18, 0x4d, 0x8c, 0xbf, 0x00, 0xa1, 0xdc, 0xf8, 0x53, 0x50, 0xc8, 0xdb, 0x30, 0xbd, 0x38, + 0x3f, 0x27, 0x37, 0xb0, 0x0b, 0x7e, 0xa3, 0xdb, 0xa2, 0xed, 0x08, 0xef, 0x18, 0x97, 0xf8, 0x18, + 0xd2, 0xc6, 0x1c, 0x93, 0x82, 0x2c, 0x34, 0x71, 0xb3, 0x93, 0xe7, 0x05, 0x98, 0xf7, 0x5d, 0x1a, + 0x6e, 0xde, 0xfc, 0x8c, 0xdd, 0xec, 0x54, 0xbe, 0x0d, 0x67, 0xdb, 0xcd, 0xcc, 0x99, 0xf9, 0x77, + 0xf1, 0x66, 0x67, 0x0f, 0x2e, 0xf9, 0x31, 0x18, 0xc2, 0x9f, 0x62, 0xc5, 0x9d, 0xce, 0x60, 0x9b, + 0xac, 0xb6, 0x0d, 0x9e, 0x59, 0x0d, 0x09, 0xc8, 0x52, 0xf2, 0xc8, 0xd7, 0x29, 0xee, 0x27, 0x89, + 0xe4, 0x22, 0xfa, 0xeb, 0x8e, 0x2e, 0x94, 0xd4, 0x0a, 0x99, 0x8c, 0xdc, 0x75, 0xc2, 0x3d, 0xea, + 0xce, 0xcb, 0x37, 0xe1, 0x4b, 0x5c, 0x46, 0xf6, 0x10, 0x8a, 0x2f, 0x4f, 0x5a, 0x0a, 0x0a, 0xd3, + 0x0e, 0x4b, 0xe1, 0x46, 0x28, 0x9a, 0x22, 0x76, 0x41, 0x1e, 0xee, 0x5e, 0x5d, 0x4b, 0x14, 0xa1, + 0xb6, 0x94, 0xee, 0xee, 0xc0, 0x69, 0xec, 0xd3, 0x60, 0xf3, 0xe6, 0xa7, 0xa1, 0x2d, 0xf5, 0x3a, + 0x8e, 0x19, 0x93, 0x6f, 0x40, 0x9c, 0x18, 0x50, 0x43, 0x66, 0x36, 0x62, 0x12, 0x55, 0x69, 0x24, + 0x36, 0x62, 0x12, 0x55, 0xa9, 0xda, 0x88, 0x31, 0x6a, 0xfc, 0x02, 0x47, 0xee, 0x84, 0x17, 0x38, + 0xfa, 0xbc, 0x36, 0x24, 0x2f, 0xe4, 0x7c, 0x86, 0xde, 0x77, 0xfb, 0x12, 0x94, 0xaa, 0x51, 0xe4, + 0x34, 0xf6, 0xa8, 0x8b, 0x2f, 0xbd, 0x28, 0xc1, 0x5c, 0x8e, 0x80, 0xab, 0xae, 0x32, 0x15, 0x57, + 0x79, 0xdf, 0x71, 0x64, 0x80, 0xf7, 0x1d, 0x6f, 0xc0, 0xc8, 0x52, 0xfb, 0x81, 0xc7, 0xfa, 0xa4, + 0x98, 0x24, 0xf6, 0xf2, 0x38, 0x48, 0x7f, 0x14, 0x10, 0x41, 0xe4, 0x4d, 0xc5, 0x82, 0x18, 0x4d, + 0x4c, 0x79, 0xbe, 0xcd, 0xb2, 0xa5, 0x21, 0xa1, 0x9e, 0xa2, 0x49, 0x74, 0xf2, 0x06, 0x8c, 0xc8, + 0xdd, 0x33, 0x24, 0xe6, 0xbb, 0xa0, 0x74, 0x78, 0x89, 0x96, 0x4b, 0x4c, 0xec, 0x9e, 0xdf, 0xd6, + 0xef, 0xfe, 0x8e, 0x29, 0x39, 0x75, 0x94, 0xbb, 0xbf, 0x5a, 0x4e, 0x1d, 0xe5, 0x16, 0x70, 0xbc, + 0x19, 0x2a, 0x9d, 0xb8, 0x19, 0xda, 0x84, 0xd2, 0x9a, 0x13, 0x44, 0x1e, 0x5b, 0x8e, 0xda, 0x11, + 0x4f, 0xea, 0x9a, 0xec, 0xd5, 0x95, 0xa2, 0xe4, 0xd1, 0xaf, 0x8e, 0x82, 0xaf, 0x27, 0x25, 0x49, + 0xe0, 0x64, 0x25, 0xe3, 0x76, 0x88, 0x48, 0x26, 0x8f, 0x27, 0x40, 0x6a, 0xe6, 0x72, 0x5e, 0xaa, + 0xba, 0x8a, 0x7b, 0x2f, 0x96, 0xdc, 0xe2, 0x63, 0x80, 0x7b, 0xc6, 0x49, 0x64, 0x83, 0x99, 0xe1, + 0xd0, 0xae, 0x48, 0x6d, 0x1c, 0x63, 0x44, 0xf2, 0x35, 0x28, 0xb1, 0xff, 0x31, 0xc3, 0xa5, 0x47, + 0x79, 0xd2, 0xd6, 0xe4, 0xb6, 0x80, 0x3e, 0xa1, 0x79, 0x1a, 0xcc, 0x3a, 0x8d, 0xf8, 0x04, 0x46, + 0xc6, 0x69, 0xc7, 0x8b, 0xc6, 0x8d, 0xbc, 0x07, 0x25, 0x35, 0x43, 0xee, 0xec, 0x54, 0x12, 0xdf, + 0xe3, 0x0a, 0x78, 0x7a, 0x94, 0x34, 0x02, 0xb6, 0x7e, 0x55, 0x3b, 0x1d, 0xa4, 0x25, 0x8a, 0xb4, + 0x77, 0x3a, 0x69, 0x32, 0x89, 0x46, 0xde, 0x87, 0x52, 0xb5, 0xd3, 0x49, 0x34, 0xce, 0xb4, 0xb2, + 0x25, 0xec, 0x74, 0xec, 0x4c, 0xad, 0xa3, 0x51, 0x30, 0xc1, 0x12, 0x06, 0x1f, 0xd6, 0x3b, 0x93, + 0x08, 0x96, 0xcc, 0xfb, 0x9a, 0x16, 0x2c, 0x05, 0xdd, 0xfc, 0xa1, 0x01, 0xe7, 0xfb, 0x74, 0xdb, + 0xc0, 0x8f, 0xd9, 0xde, 0x48, 0xd6, 0x60, 0xc5, 0x1d, 0x21, 0xd6, 0x60, 0xf5, 0xa3, 0xe5, 0x6a, + 0x9c, 0x9d, 0x61, 0x36, 0xff, 0xa9, 0x65, 0x98, 0x35, 0x0f, 0x0d, 0x18, 0x53, 0x84, 0xf9, 0x09, + 0x3e, 0x1e, 0x77, 0x45, 0xa4, 0x5a, 0xcf, 0x27, 0x78, 0xad, 0x94, 0xeb, 0x01, 0x53, 0xab, 0x7f, + 0x04, 0xb0, 0xec, 0x84, 0x51, 0xb5, 0x11, 0x79, 0x0f, 0xe8, 0x00, 0x9a, 0x3b, 0xc9, 0x2b, 0xe5, + 0xe0, 0x1b, 0x14, 0x8c, 0xac, 0x27, 0xaf, 0x54, 0xcc, 0xd0, 0x5c, 0x81, 0xe1, 0xba, 0x1f, 0x44, + 0xb5, 0x03, 0xbe, 0x1c, 0x2f, 0xd0, 0xb0, 0xa1, 0x3a, 0x25, 0x3d, 0x74, 0x4f, 0x34, 0x2c, 0x51, + 0xc4, 0x6c, 0xe2, 0xdb, 0x1e, 0x6d, 0xba, 0xea, 0x69, 0xf1, 0x0e, 0x03, 0x58, 0x1c, 0x7e, 0xed, + 0x3d, 0x98, 0x94, 0x82, 0xbd, 0xbe, 0x5c, 0xc7, 0x2f, 0x98, 0x84, 0xb1, 0xcd, 0x45, 0x6b, 0xe9, + 0xf6, 0x57, 0xec, 0xdb, 0x1b, 0xcb, 0xcb, 0xe5, 0x33, 0x64, 0x1c, 0x46, 0x05, 0x60, 0xbe, 0x5a, + 0x36, 0x48, 0x09, 0x8a, 0x4b, 0x2b, 0xf5, 0xc5, 0xf9, 0x0d, 0x6b, 0xb1, 0x9c, 0xbb, 0xf6, 0x22, + 0x4c, 0x24, 0xe1, 0x42, 0x98, 0x52, 0x64, 0x04, 0xf2, 0x56, 0x75, 0xab, 0x7c, 0x86, 0x00, 0x0c, + 0xaf, 0xdd, 0x9b, 0xaf, 0xdf, 0xbc, 0x59, 0x36, 0xae, 0x7d, 0x1e, 0xa6, 0xd0, 0x51, 0xb9, 0xcc, + 0xf6, 0x0d, 0x6d, 0x1a, 0x60, 0x4d, 0x25, 0x28, 0xd6, 0x69, 0xc7, 0x09, 0x9c, 0x88, 0xf2, 0x6a, + 0xee, 0x77, 0x9b, 0x91, 0xd7, 0x69, 0xd2, 0x47, 0x65, 0xe3, 0xda, 0x9b, 0x30, 0x69, 0xf9, 0xdd, + 0xc8, 0x6b, 0xef, 0xca, 0xd7, 0x37, 0xc8, 0x59, 0x98, 0xda, 0x58, 0xa9, 0xde, 0xaf, 0x2d, 0xdd, + 0xd9, 0x58, 0xdd, 0xa8, 0xdb, 0xf7, 0xab, 0xeb, 0xf3, 0x77, 0xcb, 0x67, 0x58, 0x83, 0xef, 0xaf, + 0xd6, 0xd7, 0x6d, 0x6b, 0x71, 0x7e, 0x71, 0x65, 0xbd, 0x6c, 0x5c, 0xfb, 0x25, 0x03, 0x26, 0xf4, + 0x87, 0xd2, 0xc9, 0x65, 0xb8, 0xb4, 0x51, 0x5f, 0xb4, 0xec, 0xf5, 0xd5, 0x7b, 0x8b, 0x2b, 0xf6, + 0x46, 0xbd, 0x7a, 0x67, 0xd1, 0xde, 0x58, 0xa9, 0xaf, 0x2d, 0xce, 0x2f, 0xdd, 0x5e, 0x5a, 0x5c, + 0x28, 0x9f, 0x21, 0x15, 0x78, 0x46, 0xc1, 0xb0, 0x16, 0xe7, 0x57, 0x37, 0x17, 0x2d, 0x7b, 0xad, + 0x5a, 0xaf, 0x6f, 0xad, 0x5a, 0x0b, 0x65, 0x83, 0x5c, 0x84, 0x73, 0x19, 0x08, 0xf7, 0x6f, 0x57, + 0xcb, 0xb9, 0x9e, 0xb2, 0x95, 0xc5, 0xad, 0xea, 0xb2, 0x5d, 0x5b, 0x5d, 0x2f, 0xe7, 0xaf, 0xbd, + 0xc7, 0x0c, 0xaf, 0xe4, 0x89, 0x41, 0x52, 0x84, 0xc2, 0xca, 0xea, 0xca, 0x62, 0xf9, 0x0c, 0x19, + 0x83, 0x91, 0xb5, 0xc5, 0x95, 0x85, 0xa5, 0x95, 0x3b, 0xbc, 0x5b, 0xab, 0x6b, 0x6b, 0xd6, 0xea, + 0xe6, 0xe2, 0x42, 0x39, 0xc7, 0xfa, 0x6e, 0x61, 0x71, 0x85, 0xb5, 0x2c, 0x7f, 0xcd, 0xe4, 0xaf, + 0xdb, 0x68, 0x29, 0xfd, 0x59, 0x6f, 0x2d, 0x7e, 0x79, 0x7d, 0x71, 0xa5, 0xbe, 0xb4, 0xba, 0x52, + 0x3e, 0x73, 0xed, 0x52, 0x0a, 0x47, 0x8e, 0x44, 0xbd, 0x7e, 0xb7, 0x7c, 0xe6, 0xda, 0xd7, 0xa0, + 0xa4, 0xda, 0x1d, 0xe4, 0x3c, 0x4c, 0xab, 0xbf, 0xd7, 0x68, 0xdb, 0xf5, 0xda, 0xbb, 0xe5, 0x33, + 0xe9, 0x02, 0xab, 0xdb, 0x6e, 0xb3, 0x02, 0xfc, 0x78, 0xb5, 0x60, 0x9d, 0x06, 0x2d, 0xaf, 0xcd, + 0x4c, 0x8a, 0x72, 0xae, 0x56, 0xfe, 0xde, 0x9f, 0x3f, 0x77, 0xe6, 0x7b, 0x3f, 0x78, 0xce, 0xf8, + 0xd3, 0x1f, 0x3c, 0x67, 0xfc, 0x8f, 0x1f, 0x3c, 0x67, 0x6c, 0x0f, 0xa3, 0xa0, 0xdf, 0xfa, 0xbf, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x88, 0xbd, 0xa1, 0x7d, 0xc6, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -15713,6 +15720,20 @@ func (m *RecordSession) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.SSH) > 0 { + i -= len(m.SSH) + copy(dAtA[i:], m.SSH) + i = encodeVarintTypes(dAtA, i, uint64(len(m.SSH))) + i-- + dAtA[i] = 0x22 + } + if len(m.Default) > 0 { + i -= len(m.Default) + copy(dAtA[i:], m.Default) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Default))) + i-- + dAtA[i] = 0x12 + } if m.Desktop != nil { { size := m.Desktop.Size() @@ -23977,6 +23998,14 @@ func (m *RecordSession) Size() (n int) { l = m.Desktop.Size() n += 1 + l + sovTypes(uint64(l)) } + l = len(m.Default) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.SSH) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -43584,6 +43613,70 @@ func (m *RecordSession) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Default = github_com_gravitational_teleport_api_constants.SessionRecordingMode(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSH", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SSH = github_com_gravitational_teleport_api_constants.SessionRecordingMode(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/api/types/types.proto b/api/types/types.proto index 8ffaf2721fef4..a37547855c8c0 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -1654,6 +1654,20 @@ message RecordSession { (gogoproto.jsontag) = "desktop", (gogoproto.customtype) = "BoolOption" ]; + + // Default indicates the default value for the services. + string Default = 2 [ + (gogoproto.jsontag) = "default,omitempty", + (gogoproto.casttype) = + "github.com/gravitational/teleport/api/constants.SessionRecordingMode" + ]; + + // SSH indicates the session mode used on SSH sessions. + string SSH = 4 [ + (gogoproto.jsontag) = "ssh,omitempty", + (gogoproto.casttype) = + "github.com/gravitational/teleport/api/constants.SessionRecordingMode" + ]; } // CertExtensionMode specifies the type of extension to use in the cert. diff --git a/lib/events/api.go b/lib/events/api.go index bc1637620ca8f..e74bed18a9623 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -641,6 +641,9 @@ type MultipartUploader interface { CreateUpload(ctx context.Context, sessionID session.ID) (*StreamUpload, error) // CompleteUpload completes the upload CompleteUpload(ctx context.Context, upload StreamUpload, parts []StreamPart) error + // ReserveUploadPart reserves an upload part. Reserve is used to identify + // upload errors beforehand. + ReserveUploadPart(ctx context.Context, upload StreamUpload, partNumber int64) error // UploadPart uploads part and returns the part UploadPart(ctx context.Context, upload StreamUpload, partNumber int64, partBody io.ReadSeeker) (*StreamPart, error) // ListParts returns all uploaded parts for the completed upload in sorted order diff --git a/lib/events/auditwriter.go b/lib/events/auditwriter.go index 285098947b862..2a9958d565f21 100644 --- a/lib/events/auditwriter.go +++ b/lib/events/auditwriter.go @@ -18,6 +18,7 @@ package events import ( "context" + "strings" "sync" "time" @@ -439,17 +440,22 @@ func (a *AuditWriter) processEvents() { case event := <-a.eventsCh: a.buffer = append(a.buffer, event) err := a.stream.EmitAuditEvent(a.cfg.Context, event) - if err == nil { - continue - } - a.log.WithError(err).Debug("Failed to emit audit event, attempting to recover stream.") - start := time.Now() - if err := a.recoverStream(); err != nil { - a.log.WithError(err).Warningf("Failed to recover stream.") - a.cancel() - return + if err != nil { + if isUnrecoverableError(err) { + a.log.WithError(err).Debug("Failed to emit audit event.") + a.cancel() + return + } + + a.log.WithError(err).Debug("Failed to emit audit event, attempting to recover stream.") + start := time.Now() + if err := a.recoverStream(); err != nil { + a.log.WithError(err).Warningf("Failed to recover stream.") + a.cancel() + return + } + a.log.Debugf("Recovered stream in %v.", time.Since(start)) } - a.log.Debugf("Recovered stream in %v.", time.Since(start)) case <-a.stream.Done(): a.log.Debugf("Stream was closed by the server, attempting to recover.") if err := a.recoverStream(); err != nil { @@ -546,6 +552,11 @@ func (a *AuditWriter) tryResumeStream() (apievents.Stream, error) { return nil, trace.ConnectionProblem(a.closeCtx.Err(), "operation has been canceled") } } + + if isUnrecoverableError(err) { + return nil, trace.ConnectionProblem(err, "stream cannot be recovered") + } + select { case <-retry.After(): a.log.WithError(err).Debug("Retrying to resume stream after backoff.") @@ -618,3 +629,8 @@ func diff(before, after time.Time) int64 { } return d } + +// isUnrecoverableError returns if the provided stream error is unrecoverable. +func isUnrecoverableError(err error) bool { + return strings.Contains(err.Error(), uploaderReservePartErrorMessage) +} diff --git a/lib/events/auditwriter_test.go b/lib/events/auditwriter_test.go index 44fefce2df468..9d940539c7e02 100644 --- a/lib/events/auditwriter_test.go +++ b/lib/events/auditwriter_test.go @@ -19,6 +19,7 @@ package events import ( "bytes" "context" + "errors" "io" "math/rand" "testing" @@ -286,6 +287,35 @@ func TestAuditWriter(t *testing.T) { require.Equal(t, event.GetClusterName(), "cluster") } }) + + t.Run("NonRecoverable", func(t *testing.T) { + test := newAuditWriterTest(t, func(streamer Streamer) (*CallbackStreamer, error) { + return NewCallbackStreamer(CallbackStreamerConfig{ + Inner: streamer, + OnEmitAuditEvent: func(_ context.Context, _ session.ID, _ apievents.AuditEvent) error { + // Returns an unrecorable error. + return errors.New(uploaderReservePartErrorMessage) + }, + }) + }) + + // First event will not fail since it is processed in the goroutine. + events := GenerateTestSession(SessionParams{SessionID: string(test.sid)}) + require.NoError(t, test.writer.EmitAuditEvent(test.ctx, events[1])) + + // Subsequent events will fail. + err := test.writer.EmitAuditEvent(test.ctx, events[1]) + require.Error(t, err) + + require.Eventually(t, func() bool { + select { + case <-test.writer.Done(): + return true + default: + return false + } + }, 300*time.Millisecond, 100*time.Millisecond) + }) } func TestBytesToSessionPrintEvents(t *testing.T) { diff --git a/lib/events/filesessions/filestream.go b/lib/events/filesessions/filestream.go index 81f19a063d116..7e4290e814afa 100644 --- a/lib/events/filesessions/filestream.go +++ b/lib/events/filesessions/filestream.go @@ -18,6 +18,7 @@ package filesessions import ( "context" + "crypto/rand" "fmt" "io" "os" @@ -35,6 +36,9 @@ import ( "github.com/gravitational/trace" ) +// minUploadBytes is the minimum part file size required to trigger its upload. +const minUploadBytes = events.MaxProtoMessageSizeBytes * 2 + // NewStreamer creates a streamer sending uploads to disk func NewStreamer(dir string) (*events.ProtoStreamer, error) { handler, err := NewHandler(Config{ @@ -45,7 +49,7 @@ func NewStreamer(dir string) (*events.ProtoStreamer, error) { } return events.NewProtoStreamer(events.ProtoStreamerConfig{ Uploader: handler, - MinUploadBytes: events.MaxProtoMessageSizeBytes * 2, + MinUploadBytes: minUploadBytes, }) } @@ -76,8 +80,7 @@ func (h *Handler) UploadPart(ctx context.Context, upload events.StreamUpload, pa return nil, trace.Wrap(err) } - partPath := h.partPath(upload, partNumber) - file, err := os.OpenFile(partPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + file, partPath, err := h.openUploadPart(upload, partNumber) if err != nil { return nil, trace.ConvertSystemError(err) } @@ -264,6 +267,43 @@ func (h *Handler) GetUploadMetadata(s session.ID) events.UploadMetadata { } } +// ReserveUploadPart reserves an upload part. +func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpload, partNumber int64) error { + // Create a buffer with the max size that a part file can have. + buf := make([]byte, minUploadBytes+events.MaxProtoMessageSizeBytes) + _, err := rand.Read(buf) + if err != nil { + return trace.Wrap(err) + } + + file, partPath, err := h.openUploadPart(upload, partNumber) + if err != nil { + return trace.ConvertSystemError(err) + } + + _, err = file.Write(buf) + if err = trace.NewAggregate(err, file.Close()); err != nil { + if rmErr := os.Remove(partPath); rmErr != nil { + h.WithError(rmErr).Warningf("Failed to remove file %q.", partPath) + } + + return trace.ConvertSystemError(err) + } + + return nil +} + +// openUploadPart opens a upload file part. +func (h *Handler) openUploadPart(upload events.StreamUpload, partNumber int64) (*os.File, string, error) { + partPath := h.partPath(upload, partNumber) + file, err := os.OpenFile(partPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + return nil, partPath, trace.ConvertSystemError(err) + } + + return file, partPath, nil +} + func (h *Handler) uploadsPath() string { return filepath.Join(h.Directory, uploadsDir) } diff --git a/lib/events/filesessions/filestream_test.go b/lib/events/filesessions/filestream_test.go new file mode 100644 index 0000000000000..f97c4ed0e5bcd --- /dev/null +++ b/lib/events/filesessions/filestream_test.go @@ -0,0 +1,63 @@ +package filesessions + +import ( + "bytes" + "context" + "io" + "os" + "testing" + + "github.com/gravitational/teleport/lib/session" + + "github.com/stretchr/testify/require" +) + +func TestReserveUploadPart(t *testing.T) { + ctx := context.Background() + partNumber := int64(1) + dir := t.TempDir() + + handler, err := NewHandler(Config{ + Directory: dir, + }) + require.NoError(t, err) + + upload, err := handler.CreateUpload(ctx, session.NewID()) + require.NoError(t, err) + + err = handler.ReserveUploadPart(ctx, *upload, partNumber) + require.NoError(t, err) + + fi, err := os.Stat(handler.partPath(*upload, partNumber)) + require.NoError(t, err) + require.GreaterOrEqual(t, fi.Size(), int64(minUploadBytes)) +} + +func TestUploadPart(t *testing.T) { + ctx := context.Background() + partNumber := int64(1) + dir := t.TempDir() + expectedContent := []byte("upload part contents") + + handler, err := NewHandler(Config{ + Directory: dir, + }) + require.NoError(t, err) + + upload, err := handler.CreateUpload(ctx, session.NewID()) + require.NoError(t, err) + + err = handler.ReserveUploadPart(ctx, *upload, partNumber) + require.NoError(t, err) + + _, err = handler.UploadPart(ctx, *upload, partNumber, bytes.NewReader(expectedContent)) + require.NoError(t, err) + + partFile, err := os.Open(handler.partPath(*upload, partNumber)) + require.NoError(t, err) + defer partFile.Close() + + partFileContent, err := io.ReadAll(partFile) + require.NoError(t, err) + require.True(t, bytes.Equal(expectedContent, partFileContent)) +} diff --git a/lib/events/gcssessions/gcsstream.go b/lib/events/gcssessions/gcsstream.go index b1ef99f57892c..856971e99e2fa 100644 --- a/lib/events/gcssessions/gcsstream.go +++ b/lib/events/gcssessions/gcsstream.go @@ -289,6 +289,11 @@ func (h *Handler) GetUploadMetadata(s session.ID) events.UploadMetadata { } } +// ReserUploadPart reserves an upload part. +func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpload, partNumber int64) error { + return nil +} + const ( // uploadsKey is a key that holds all upload-related objects uploadsKey = "uploads" diff --git a/lib/events/s3sessions/s3stream.go b/lib/events/s3sessions/s3stream.go index 087128367e9e1..169cd6c39c3bf 100644 --- a/lib/events/s3sessions/s3stream.go +++ b/lib/events/s3sessions/s3stream.go @@ -220,3 +220,8 @@ func (h *Handler) GetUploadMetadata(sessionID session.ID) events.UploadMetadata SessionID: sessionID, } } + +// ReserUploadPart reserves an upload part. +func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpload, partNumber int64) error { + return nil +} diff --git a/lib/events/stream.go b/lib/events/stream.go index aad27ef1cff7f..8eb79cc804814 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -23,6 +23,7 @@ import ( "errors" "io" "sort" + "strings" "sync" "time" @@ -72,6 +73,10 @@ const ( // ProtoStreamV1RecordHeaderSize is the size of the header // of the record header, it consists of the record length ProtoStreamV1RecordHeaderSize = Int32Size + + // uploaderReservePartErrorMessage error message present when + // `ReserveUploadPart` fails. + uploaderReservePartErrorMessage = "uploader failed to reserve upload part" ) // ProtoStreamerConfig specifies configuration for the part @@ -255,6 +260,7 @@ func NewProtoStream(cfg ProtoStreamConfig) (*ProtoStream, error) { cancelCtx: cancelCtx, cancel: cancel, + cancelMtx: &sync.RWMutex{}, completeCtx: completeCtx, complete: complete, @@ -293,6 +299,16 @@ func NewProtoStream(cfg ProtoStreamConfig) (*ProtoStream, error) { writer.lastPartNumber = cfg.CompletedParts[len(cfg.CompletedParts)-1].Number + 1 writer.completedParts = cfg.CompletedParts } + + // Generate the first slice. This is done in the initialization process to + // return any critical errors synchronously instead of having to emit the + // first event. + var err error + writer.current, err = writer.newSlice() + if err != nil { + return nil, trace.Wrap(err) + } + go writer.receiveAndUpload() return stream, nil } @@ -307,6 +323,8 @@ type ProtoStream struct { // cancelCtx is used to signal closure cancelCtx context.Context cancel context.CancelFunc + cancelErr error + cancelMtx *sync.RWMutex // completeCtx is used to signal completion of the operation completeCtx context.Context @@ -376,6 +394,11 @@ func (s *ProtoStream) EmitAuditEvent(ctx context.Context, event apievents.AuditE } return nil case <-s.cancelCtx.Done(): + cancelErr := s.getCancelError() + if cancelErr != nil { + return trace.Wrap(cancelErr) + } + return trace.ConnectionProblem(s.cancelCtx.Err(), "emitter has been closed") case <-s.completeCtx.Done(): return trace.ConnectionProblem(nil, "emitter is completed") @@ -415,6 +438,20 @@ func (s *ProtoStream) Close(ctx context.Context) error { } } +// setCancelError sets the cancelErr with lock. +func (s *ProtoStream) setCancelError(err error) { + s.cancelMtx.Lock() + defer s.cancelMtx.Unlock() + s.cancelErr = err +} + +// getCancelError gets the cancelErr with lock. +func (s *ProtoStream) getCancelError() error { + s.cancelMtx.RLock() + defer s.cancelMtx.RUnlock() + return s.cancelErr +} + // sliceWriter is a helper struct that coordinates // writing slices and checkpointing type sliceWriter struct { @@ -529,6 +566,15 @@ func (w *sliceWriter) receiveAndUpload() { } if err := w.submitEvent(event); err != nil { log.WithError(err).Error("Lost event.") + // Failure on `newSlice` indicates that the streamer won't be + // able to process events. Close the streamer and set the + // returned error so that event emitters can proceed. + if isNewSliceError(err) { + w.proto.setCancelError(err) + w.proto.cancel() + return + } + continue } if w.shouldUploadCurrentSlice() { @@ -553,7 +599,6 @@ func (w *sliceWriter) shouldUploadCurrentSlice() bool { // startUploadCurrentSlice starts uploading current slice // and adds it to the waiting list func (w *sliceWriter) startUploadCurrentSlice() error { - w.lastPartNumber++ activeUpload, err := w.startUpload(w.lastPartNumber, w.current) if err != nil { return trace.Wrap(err) @@ -571,22 +616,34 @@ func (b *bufferCloser) Close() error { return nil } -func (w *sliceWriter) newSlice() *slice { +func (w *sliceWriter) newSlice() (*slice, error) { + w.lastPartNumber++ buffer := w.proto.cfg.BufferPool.Get() buffer.Reset() // reserve bytes for version header buffer.Write(w.emptyHeader[:]) + + err := w.proto.cfg.Uploader.ReserveUploadPart(w.proto.cancelCtx, w.proto.cfg.Upload, w.lastPartNumber) + if err != nil { + return nil, trace.ConnectionProblem(err, uploaderReservePartErrorMessage) + } + return &slice{ proto: w.proto, buffer: buffer, writer: newGzipWriter(&bufferCloser{Buffer: buffer}), - } + }, nil } func (w *sliceWriter) submitEvent(event protoEvent) error { if w.current == nil { - w.current = w.newSlice() + var err error + w.current, err = w.newSlice() + if err != nil { + return trace.Wrap(err) + } } + return w.current.emitAuditEvent(event) } @@ -1287,3 +1344,13 @@ func (m *MemoryUploader) GetUploadMetadata(sid session.ID) UploadMetadata { SessionID: sid, } } + +// ReserUploadPart reserves an upload part. +func (h *MemoryUploader) ReserveUploadPart(ctx context.Context, upload StreamUpload, partNumber int64) error { + return nil +} + +// isNewSliceError identifies new slice errors. +func isNewSliceError(err error) bool { + return strings.Contains(err.Error(), uploaderReservePartErrorMessage) +} diff --git a/lib/events/stream_test.go b/lib/events/stream_test.go index 80cfc3a139722..8e15a6f06541c 100644 --- a/lib/events/stream_test.go +++ b/lib/events/stream_test.go @@ -16,9 +16,11 @@ package events import ( "context" + "errors" "testing" "time" + "github.com/google/uuid" "github.com/gravitational/teleport/lib/session" "github.com/stretchr/testify/require" @@ -59,3 +61,122 @@ func TestStreamerCompleteEmpty(t *testing.T) { case <-doneC: } } + +// TestNewSliceErrors guarantees that if an error on the `newSlice` process +// happens, the streamer will be canceled and the error will be returned in +// future `EmitAuditEvent` calls. +func TestNewSliceErrors(t *testing.T) { + ctx := context.Background() + expectedErr := errors.New("test upload error") + streamer, err := NewProtoStreamer(ProtoStreamerConfig{ + Uploader: &mockUploader{reserveUploadPartError: expectedErr}, + }) + require.NoError(t, err) + + events := GenerateTestSession(SessionParams{PrintEvents: 1}) + sid := session.ID(events[0].(SessionMetadataGetter).GetSessionID()) + + _, err = streamer.CreateAuditStream(ctx, sid) + require.Error(t, err) + require.ErrorIs(t, err, expectedErr) +} + +// TestNewStreamErrors when creating a new stream, it will also initialize +// the current sliceWriter. If there is any error on this, it should be +// returned. +func TestNewStreamErrors(t *testing.T) { + ctx := context.Background() + expectedErr := errors.New("test upload error") + + t.Run("CreateAuditStream", func(t *testing.T) { + for _, tt := range []struct { + desc string + uploader *mockUploader + expectedErr error + }{ + { + desc: "CreateUploadError", + uploader: &mockUploader{createUploadError: expectedErr}, + }, + { + desc: "ReserveUploadPartError", + uploader: &mockUploader{reserveUploadPartError: expectedErr}, + }, + } { + t.Run(tt.desc, func(t *testing.T) { + streamer, err := NewProtoStreamer(ProtoStreamerConfig{ + Uploader: tt.uploader, + }) + require.NoError(t, err) + + events := GenerateTestSession(SessionParams{PrintEvents: 1}) + sid := session.ID(events[0].(SessionMetadataGetter).GetSessionID()) + + _, err = streamer.CreateAuditStream(ctx, sid) + require.Error(t, err) + require.ErrorIs(t, err, expectedErr) + }) + } + }) + + t.Run("ResumeAuditStream", func(t *testing.T) { + for _, tt := range []struct { + desc string + uploader *mockUploader + expectedErr error + }{ + { + desc: "ListPartsError", + uploader: &mockUploader{listPartsError: expectedErr}, + }, + { + desc: "ReserveUploadPartError", + uploader: &mockUploader{reserveUploadPartError: expectedErr}, + }, + } { + t.Run(tt.desc, func(t *testing.T) { + streamer, err := NewProtoStreamer(ProtoStreamerConfig{ + Uploader: tt.uploader, + }) + require.NoError(t, err) + + events := GenerateTestSession(SessionParams{PrintEvents: 1}) + sid := session.ID(events[0].(SessionMetadataGetter).GetSessionID()) + + _, err = streamer.ResumeAuditStream(ctx, sid, uuid.New().String()) + require.Error(t, err) + require.ErrorIs(t, err, expectedErr) + }) + } + }) +} + +type mockUploader struct { + MultipartUploader + createUploadError error + reserveUploadPartError error + listPartsError error +} + +func (m *mockUploader) CreateUpload(ctx context.Context, sessionID session.ID) (*StreamUpload, error) { + if m.createUploadError != nil { + return nil, m.createUploadError + } + + return &StreamUpload{ + ID: uuid.New().String(), + SessionID: sessionID, + }, nil +} + +func (m *mockUploader) ReserveUploadPart(_ context.Context, _ StreamUpload, _ int64) error { + return m.reserveUploadPartError +} + +func (m *mockUploader) ListParts(_ context.Context, _ StreamUpload) ([]StreamPart, error) { + if m.listPartsError != nil { + return nil, m.listPartsError + } + + return []StreamPart{}, nil +} diff --git a/lib/services/role.go b/lib/services/role.go index f1e1e789de3e5..836f66781f2a7 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -1532,6 +1532,44 @@ func (set RoleSet) CertificateExtensions() []*types.CertExtension { return exts } +// SessionRecordingMode returns the recording mode for a specific service. +func (set RoleSet) SessionRecordingMode(service constants.SessionRecordingService) constants.SessionRecordingMode { + defaultValue := constants.SessionRecordingModeBestEffort + useDefault := true + + for _, role := range set { + recordSession := role.GetOptions().RecordSession + + // If one of the dafault values is "strict", set it as the value. + if recordSession.Default == constants.SessionRecordingModeStrict { + defaultValue = constants.SessionRecordingModeStrict + } + + var roleMode constants.SessionRecordingMode + switch service { + case constants.SessionRecordingServiceSSH: + roleMode = recordSession.SSH + case constants.SessionRecordingServiceKubernetes: + roleMode = recordSession.Kubernetes + } + + switch roleMode { + case constants.SessionRecordingModeStrict: + // Early return as "strict" since it is the strictest value. + return constants.SessionRecordingModeStrict + case constants.SessionRecordingModeBestEffort: + useDefault = false + } + } + + // Return the strictest default value. + if useDefault { + return defaultValue + } + + return constants.SessionRecordingModeBestEffort +} + func roleNames(roles []types.Role) string { out := make([]string, len(roles)) for i := range roles { diff --git a/lib/services/role_test.go b/lib/services/role_test.go index 03ee0a476b7a7..09a90ec1b6852 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -4182,3 +4182,67 @@ func TestCheckKubeGroupsAndUsers(t *testing.T) { }) } } + +func TestSessionRecordingMode(t *testing.T) { + tests := map[string]struct { + service constants.SessionRecordingService + expectedMode constants.SessionRecordingMode + rolesOptions []types.RoleOptions + }{ + "service-specific option": { + expectedMode: constants.SessionRecordingModeBestEffort, + service: constants.SessionRecordingServiceSSH, + rolesOptions: []types.RoleOptions{ + {RecordSession: &types.RecordSession{SSH: constants.SessionRecordingModeBestEffort}}, + }, + }, + "service-specific multiple roles": { + expectedMode: constants.SessionRecordingModeBestEffort, + service: constants.SessionRecordingServiceSSH, + rolesOptions: []types.RoleOptions{ + {RecordSession: &types.RecordSession{Default: constants.SessionRecordingModeStrict}}, + {RecordSession: &types.RecordSession{SSH: constants.SessionRecordingModeBestEffort}}, + }, + }, + "strict service-specific multiple roles": { + expectedMode: constants.SessionRecordingModeStrict, + service: constants.SessionRecordingServiceSSH, + rolesOptions: []types.RoleOptions{ + {RecordSession: &types.RecordSession{Default: constants.SessionRecordingModeStrict}}, + {RecordSession: &types.RecordSession{SSH: constants.SessionRecordingModeBestEffort}}, + {RecordSession: &types.RecordSession{SSH: constants.SessionRecordingModeStrict}}, + }, + }, + "strict default multiple roles": { + expectedMode: constants.SessionRecordingModeStrict, + service: constants.SessionRecordingServiceSSH, + rolesOptions: []types.RoleOptions{ + {RecordSession: &types.RecordSession{Default: constants.SessionRecordingModeBestEffort}}, + {RecordSession: &types.RecordSession{Default: constants.SessionRecordingModeBestEffort}}, + {RecordSession: &types.RecordSession{Default: constants.SessionRecordingModeStrict}}, + }, + }, + "default multiple roles": { + expectedMode: constants.SessionRecordingModeBestEffort, + service: constants.SessionRecordingServiceSSH, + rolesOptions: []types.RoleOptions{ + {RecordSession: &types.RecordSession{Default: constants.SessionRecordingModeBestEffort}}, + {RecordSession: &types.RecordSession{Default: constants.SessionRecordingModeBestEffort}}, + }, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + roles := make([]types.Role, len(test.rolesOptions)) + for i := range roles { + roles[i] = &types.RoleV5{ + Spec: types.RoleSpecV5{Options: test.rolesOptions[i]}, + } + } + + roleSet := RoleSet(roles) + require.Equal(t, test.expectedMode, roleSet.SessionRecordingMode(test.service)) + }) + } +} diff --git a/lib/srv/mock.go b/lib/srv/mock.go index 5c06c2e43d50e..273b9409c44f3 100644 --- a/lib/srv/mock.go +++ b/lib/srv/mock.go @@ -47,7 +47,7 @@ import ( "golang.org/x/crypto/ssh" ) -func newTestServerContext(t *testing.T, srv Server) *ServerContext { +func newTestServerContext(t *testing.T, srv Server, roleSet services.RoleSet) *ServerContext { usr, err := user.Current() require.NoError(t, err) @@ -73,6 +73,7 @@ func newTestServerContext(t *testing.T, srv Server) *ServerContext { Login: usr.Username, TeleportUser: "teleportUser", Certificate: cert, + RoleSet: roleSet, }, cancelContext: ctx, cancel: cancel, diff --git a/lib/srv/sess.go b/lib/srv/sess.go index a93e548770bea..edae3ce6fac7e 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -26,6 +26,7 @@ import ( "time" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/auth" @@ -56,6 +57,15 @@ const PresenceMaxDifference = time.Minute // to inform any joining users about the session controls. const SessionControlsInfoBroadcast = "Controls\r\n - CTRL-C: Leave the session\r\n - t: Forcefully terminate the session (moderators only)" +const ( + // sessionRecordingWarningMessage is sent when the session recording is + // going to be disabled. + sessionRecordingWarningMessage = "Warning: node error. This might cause some functionalities not to work correctly." + // sessionRecordingErrorMessage is sent when session recording has some + // error and the session is terminated. + sessionRecordingErrorMessage = "Session terminating due to node error." +) + var serverSessions = prometheus.NewGauge( prometheus.GaugeOpts{ Name: teleport.MetricServerInteractiveSessions, @@ -312,7 +322,7 @@ func (s *SessionRegistry) NotifyWinChange(params rsession.TerminalParams, ctx *S // Report the updated window size to the event log (this is so the sessions // can be replayed correctly). - if err := session.recorder.EmitAuditEvent(s.Srv.Context(), resizeEvent); err != nil { + if err := session.emitAuditEvent(s.Srv.Context(), resizeEvent); err != nil { s.log.WithError(err).Warn("Failed to emit resize audit event.") } @@ -406,7 +416,8 @@ type session struct { // login stores the login of the initial session creator login string - recorder events.StreamWriter + recorder events.StreamWriter + recorderMu sync.RWMutex // hasEnhancedRecording returns true if this session has enhanced session // recording events associated. @@ -525,13 +536,7 @@ func newSession(id rsession.ID, r *SessionRegistry, ctx *ServerContext) (*sessio displayParticipantRequirements: utils.AsBool(ctx.env[teleport.EnvSSHSessionDisplayParticipantRequirements]), } - sess.io.OnWriteError = func(idString string, err error) { - if idString == sessionRecorderID { - sess.log.Error("Failed to write to session recorder, stopping session.") - // stop in goroutine to avoid deadlock - go sess.Stop() - } - } + sess.io.OnWriteError = sess.onWriteError go func() { if _, open := <-sess.io.TerminateNotifier(); open { @@ -569,11 +574,17 @@ func (s *session) PID() int { // Recorder returns a StreamWriter which can be used to emit events // to a session as well as the audit log. func (s *session) Recorder() events.StreamWriter { - s.mu.RLock() - defer s.mu.RUnlock() + s.recorderMu.RLock() + defer s.recorderMu.RUnlock() return s.recorder } +func (s *session) setRecorder(rec events.StreamWriter) { + s.recorderMu.Lock() + defer s.recorderMu.Unlock() + s.recorder = rec +} + // Stop ends the active session and forces all clients to disconnect. // This will trigger background goroutines to complete session cleanup. func (s *session) Stop() { @@ -640,8 +651,8 @@ func (s *session) Close() error { } // Complete the session recording - if s.recorder != nil { - if err := s.recorder.Complete(s.serverCtx); err != nil { + if s.Recorder() != nil { + if err := s.Recorder().Complete(s.serverCtx); err != nil { s.log.WithError(err).Warn("Failed to close recorder.") } } @@ -655,6 +666,11 @@ func (s *session) BroadcastMessage(format string, args ...interface{}) { } } +// BroadcastSystemMessage sends a message to all parties. +func (s *session) BroadcastSystemMessage(format string, args ...interface{}) { + s.io.BroadcastMessage(fmt.Sprintf(format, args...)) +} + // emitSessionStartEvent emits a session start event. func (s *session) emitSessionStartEvent(ctx *ServerContext) { sessionStartEvent := &apievents.SessionStart{ @@ -691,7 +707,7 @@ func (s *session) emitSessionStartEvent(ctx *ServerContext) { sessionStartEvent.ConnectionMetadata.LocalAddr = ctx.ServerConn.LocalAddr().String() } - if err := s.recorder.EmitAuditEvent(ctx.srv.Context(), sessionStartEvent); err != nil { + if err := s.emitAuditEvent(ctx.srv.Context(), sessionStartEvent); err != nil { s.log.WithError(err).Warn("Failed to emit session start event.") } } @@ -727,7 +743,7 @@ func (s *session) emitSessionJoinEvent(ctx *ServerContext) { } // Emit session join event to Audit Log. - if err := s.recorder.EmitAuditEvent(ctx.srv.Context(), sessionJoinEvent); err != nil { + if err := s.emitAuditEvent(ctx.srv.Context(), sessionJoinEvent); err != nil { s.log.WithError(err).Warn("Failed to emit session join event.") } @@ -772,7 +788,7 @@ func (s *session) emitSessionLeaveEvent(ctx *ServerContext) { } // Emit session leave event to Audit Log. - if err := s.recorder.EmitAuditEvent(ctx.srv.Context(), sessionLeaveEvent); err != nil { + if err := s.emitAuditEvent(ctx.srv.Context(), sessionLeaveEvent); err != nil { s.log.WithError(err).Warn("Failed to emit session leave event.") } @@ -841,7 +857,7 @@ func (s *session) emitSessionEndEvent() { sessionEndEvent.Participants = []string{s.scx.Identity.TeleportUser} } - if err := s.recorder.EmitAuditEvent(ctx.srv.Context(), sessionEndEvent); err != nil { + if err := s.emitAuditEvent(ctx.srv.Context(), sessionEndEvent); err != nil { s.log.WithError(err).Warn("Failed to emit session end event.") } } @@ -966,7 +982,7 @@ func (s *session) startInteractive(ch ssh.Channel, ctx *ServerContext) error { if err != nil { return trace.Wrap(err) } - s.recorder = rec + s.setRecorder(rec) // allocate a terminal or take the one previously allocated via a // seaprate "allocate TTY" SSH request @@ -986,7 +1002,7 @@ func (s *session) startInteractive(ch ssh.Channel, ctx *ServerContext) error { inReader, inWriter := io.Pipe() s.inWriter = inWriter s.io.AddReader("reader", inReader) - s.io.AddWriter(sessionRecorderID, utils.WriteCloserWithContext(ctx.srv.Context(), s.recorder)) + s.io.AddWriter(sessionRecorderID, utils.WriteCloserWithContext(ctx.srv.Context(), s.Recorder())) s.BroadcastMessage("Creating session with ID: %v...", s.id) s.BroadcastMessage(SessionControlsInfoBroadcast) @@ -995,16 +1011,12 @@ func (s *session) startInteractive(ch ssh.Channel, ctx *ServerContext) error { return trace.ConvertSystemError(err) } - if err := s.addParty(p, types.SessionPeerMode); err != nil { - return trace.Wrap(err) - } - // Open a BPF recording session. If BPF was not configured, not available, // or running in a recording proxy, OpenSession is a NOP. s.bpfContext = &bpf.SessionContext{ Context: ctx.srv.Context(), PID: s.term.PID(), - Emitter: s.recorder, + Emitter: s.Recorder(), Namespace: ctx.srv.GetNamespace(), SessionID: s.id.String(), ServerID: ctx.srv.HostUUID(), @@ -1024,6 +1036,10 @@ func (s *session) startInteractive(ch ssh.Channel, ctx *ServerContext) error { ctx.srv.GetRestrictedSessionManager().OpenSession(s.bpfContext, s.cgroupID) } + if err := s.addParty(p, types.SessionPeerMode); err != nil { + return trace.Wrap(err) + } + ctx.Debug("Waiting for continue signal") // Process has been placed in a cgroup, continue execution. @@ -1063,6 +1079,45 @@ func newRecorder(s *session, ctx *ServerContext) (events.StreamWriter, error) { Component: teleport.Component(teleport.ComponentSession, ctx.srv.Component()), ClusterName: ctx.ClusterName, }) + if err != nil { + switch s.scx.Identity.RoleSet.SessionRecordingMode(constants.SessionRecordingServiceSSH) { + case constants.SessionRecordingModeBestEffort: + s.log.WithError(err).Warning("Failed to initialize session recording, disabling it for this session.") + eventOnlyRec, err := newEventOnlyRecorder(s, ctx) + if err != nil { + return nil, trace.ConnectionProblem(err, sessionRecordingErrorMessage) + } + + s.BroadcastSystemMessage(sessionRecordingWarningMessage) + return eventOnlyRec, nil + } + + return nil, trace.ConnectionProblem(err, sessionRecordingErrorMessage) + } + + return rec, nil +} + +// newEventOnlyRecorder creates a StreamWriter that doesn't record session +// contents. It is used in scenarios where it is not possible to record those +// events. +func newEventOnlyRecorder(s *session, ctx *ServerContext) (events.StreamWriter, error) { + rec, err := events.NewAuditWriter(events.AuditWriterConfig{ + // Audit stream is using server context, not session context, + // to make sure that session is uploaded even after it is closed + Context: ctx.srv.Context(), + // It will use a TeeStreamer where the streamer is a discard, and the + // emitter is the auth server. The TeeStreamer is used to filter events + // that usually are not sent to auth server. + Streamer: events.NewTeeStreamer(events.NewDiscardEmitter(), ctx.srv), + SessionID: s.id, + Clock: s.registry.clock, + Namespace: ctx.srv.GetNamespace(), + ServerID: ctx.srv.HostUUID(), + RecordOutput: ctx.SessionRecordingConfig.GetMode() != types.RecordOff, + Component: teleport.Component(teleport.ComponentSession, ctx.srv.Component()), + ClusterName: ctx.ClusterName, + }) if err != nil { return nil, trace.Wrap(err) } @@ -1075,7 +1130,7 @@ func (s *session) startExec(channel ssh.Channel, ctx *ServerContext) error { if err != nil { return trace.Wrap(err) } - s.recorder = rec + s.setRecorder(rec) // Emit a session.start event for the exec session. s.emitSessionStartEvent(ctx) @@ -1097,7 +1152,7 @@ func (s *session) startExec(channel ssh.Channel, ctx *ServerContext) error { sessionContext := &bpf.SessionContext{ Context: ctx.srv.Context(), PID: ctx.ExecRequest.PID(), - Emitter: s.recorder, + Emitter: s.Recorder(), Namespace: ctx.srv.GetNamespace(), SessionID: string(s.id), ServerID: ctx.srv.HostUUID(), @@ -1160,7 +1215,7 @@ func (s *session) newStreamer(ctx *ServerContext) (events.Streamer, error) { if ctx.IsTestStub { s.log.Debugf("Using discard streamer for test") - return events.NewDiscardEmitter(), nil + return events.NewTeeStreamer(events.NewDiscardEmitter(), ctx.srv), nil } s.log.Debugf("Using async streamer for session %v.", s.id) @@ -1669,3 +1724,40 @@ func (s *session) trackSession(teleportUser string, policySet []*types.SessionTr return nil } + +// emitAuditEvent emits audit events. +func (s *session) emitAuditEvent(ctx context.Context, event apievents.AuditEvent) error { + rec := s.Recorder() + select { + case <-rec.Done(): + newRecorder, err := newEventOnlyRecorder(s, s.scx) + if err != nil { + return trace.ConnectionProblem(err, "failed to recreate audit events recorder") + } + s.setRecorder(newRecorder) + + return newRecorder.EmitAuditEvent(ctx, event) + default: + return rec.EmitAuditEvent(ctx, event) + } +} + +// onWriteError defines the `OnWriteError` `TermManager` callback. +func (s *session) onWriteError(idString string, err error) { + if idString == sessionRecorderID { + switch s.scx.Identity.RoleSet.SessionRecordingMode(constants.SessionRecordingServiceSSH) { + case constants.SessionRecordingModeBestEffort: + s.log.WithError(err).Warning("Failed to write to session recorder, disabling session recording.") + // Send inside a gorountine since the callback is called from inside + // the writer. + go s.BroadcastSystemMessage(sessionRecordingWarningMessage) + default: + s.log.WithError(err).Error("Failed to write to session recorder, stopping session.") + // stop in goroutine to avoid deadlock + go func() { + s.BroadcastSystemMessage(sessionRecordingErrorMessage) + s.Stop() + }() + } + } +} diff --git a/lib/srv/sess_test.go b/lib/srv/sess_test.go index 3b01104f31f8d..66f245d742fc5 100644 --- a/lib/srv/sess_test.go +++ b/lib/srv/sess_test.go @@ -23,14 +23,19 @@ import ( "time" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/constants" + apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/events/eventstest" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" ) func TestParseAccessRequestIDs(t *testing.T) { @@ -236,6 +241,48 @@ func TestSession_newRecorder(t *testing.T) { } } +func TestSession_emitAuditEvent(t *testing.T) { + logger := logrus.WithFields(logrus.Fields{ + trace.Component: teleport.ComponentAuth, + }) + + t.Run("FallbackConcurrency", func(t *testing.T) { + srv := newMockServer(t) + reg, err := NewSessionRegistry(SessionRegistryConfig{ + Srv: srv, + SessionTrackerService: srv.auth, + }) + require.NoError(t, err) + t.Cleanup(func() { reg.Close() }) + + sess := &session{ + id: "test", + log: logger, + recorder: &mockRecorder{done: true}, + registry: reg, + scx: newTestServerContext(t, srv, nil), + } + + controlCh := make(chan struct{}) + emit := func() { + <-controlCh + sess.emitSessionStartEvent(sess.scx) + } + + // Multiple goroutines to emit events. + go emit() + go emit() + + // Trigger events... + close(controlCh) + + // Wait for the events on the new recorder + require.Eventually(t, func() bool { + return len(srv.Events()) == 2 + }, 1000*time.Millisecond, 100*time.Millisecond) + }) +} + // TestInteractiveSession tests interaction session lifecycles. // Multiple sessions are opened in parallel tests to test for // deadlocks between session registry, sessions, and parties. @@ -252,7 +299,7 @@ func TestInteractiveSession(t *testing.T) { t.Run("Stop", func(t *testing.T) { t.Parallel() - sess := testOpenSession(t, reg) + sess, _ := testOpenSession(t, reg, nil) // Stopping the session should trigger the session // to end and cleanup in the background @@ -266,17 +313,6 @@ func TestInteractiveSession(t *testing.T) { } require.Eventually(t, sessionClosed, time.Second*5, time.Millisecond*500) }) - - t.Run("BrokenRecorder", func(t *testing.T) { - t.Parallel() - sess := testOpenSession(t, reg) - - // The recorder might be closed in the case of an error downstream. - // Closing the session recorder should result in the session ending. - err := sess.recorder.Close(context.Background()) - require.NoError(t, err) - require.Eventually(t, sess.isStopped, time.Second*5, time.Millisecond*500) - }) } // TestParties tests the party mechanisms within an interactive session, @@ -296,7 +332,7 @@ func TestParties(t *testing.T) { t.Cleanup(func() { reg.Close() }) // Create a session with 3 parties - sess := testOpenSession(t, reg) + sess, _ := testOpenSession(t, reg, nil) require.Equal(t, 1, len(sess.getParties())) testJoinSession(t, reg, sess) require.Equal(t, 2, len(sess.getParties())) @@ -354,7 +390,7 @@ func TestParties(t *testing.T) { } func testJoinSession(t *testing.T, reg *SessionRegistry, sess *session) { - scx := newTestServerContext(t, reg.Srv) + scx := newTestServerContext(t, reg.Srv, nil) scx.setSession(sess) // Open a new session @@ -368,8 +404,78 @@ func testJoinSession(t *testing.T, reg *SessionRegistry, sess *session) { require.NoError(t, err) } -func testOpenSession(t *testing.T, reg *SessionRegistry) *session { - scx := newTestServerContext(t, reg.Srv) +func TestSessionRecordingModes(t *testing.T) { + for _, tt := range []struct { + desc string + sessionRecordingMode constants.SessionRecordingMode + expectClosedSession bool + }{ + { + desc: "StrictMode", + sessionRecordingMode: constants.SessionRecordingModeStrict, + expectClosedSession: true, + }, + { + desc: "BestEfforMode", + sessionRecordingMode: constants.SessionRecordingModeBestEffort, + expectClosedSession: false, + }, + } { + t.Run(tt.desc, func(t *testing.T) { + srv := newMockServer(t) + srv.component = teleport.ComponentNode + + reg, err := NewSessionRegistry(SessionRegistryConfig{ + Srv: srv, + SessionTrackerService: srv.auth, + }) + require.NoError(t, err) + t.Cleanup(func() { reg.Close() }) + + sess, sessCh := testOpenSession(t, reg, services.RoleSet{ + &types.RoleV5{ + Metadata: types.Metadata{Name: "dev", Namespace: apidefaults.Namespace}, + Spec: types.RoleSpecV5{ + Options: types.RoleOptions{ + RecordSession: &types.RecordSession{ + SSH: tt.sessionRecordingMode, + }, + }, + }, + }, + }) + + // Close the recorder, indicating there is some error. + err = sess.Recorder().Complete(context.Background()) + require.NoError(t, err) + + // Send more writes. + _, err = sessCh.Write([]byte("hello")) + require.NoError(t, err) + + // Ensure the session is stopped. + if !tt.expectClosedSession { + sess.Stop() + } + + // Wait until the session is stopped. + require.Eventually(t, sess.isStopped, time.Second, time.Millisecond*500) + + // Ensure all non-print events were emitted properly. + emittedEvents := srv.Events() + eventsTypes := make([]string, len(emittedEvents)) + for i, e := range emittedEvents { + eventsTypes[i] = e.GetType() + } + + // Guarantee server received non-print events. + require.ElementsMatch(t, eventsTypes, []string{events.SessionStartEvent, events.SessionLeaveEvent, events.SessionEndEvent}) + }) + } +} + +func testOpenSession(t *testing.T, reg *SessionRegistry, roleSet services.RoleSet) (*session, ssh.Channel) { + scx := newTestServerContext(t, reg.Srv, roleSet) // Open a new session sshChanOpen := newMockSSHChannel() @@ -382,5 +488,19 @@ func testOpenSession(t *testing.T, reg *SessionRegistry) *session { require.NoError(t, err) require.NotNil(t, scx.session) - return scx.session + return scx.session, sshChanOpen +} + +type mockRecorder struct { + events.StreamWriter + done bool +} + +func (m *mockRecorder) Done() <-chan struct{} { + ch := make(chan struct{}) + if m.done { + close(ch) + } + + return ch } From 127a5227adfa44d8216bbd2047c91c7443ee54d2 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 26 May 2022 12:07:38 -0300 Subject: [PATCH 02/22] fix(services): remove undefined constant --- lib/services/role.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/services/role.go b/lib/services/role.go index 836f66781f2a7..18abfee541fd1 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -1549,8 +1549,6 @@ func (set RoleSet) SessionRecordingMode(service constants.SessionRecordingServic switch service { case constants.SessionRecordingServiceSSH: roleMode = recordSession.SSH - case constants.SessionRecordingServiceKubernetes: - roleMode = recordSession.Kubernetes } switch roleMode { From 2bf57533fe4721715cb72775497ad3494979fd05 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 26 May 2022 15:57:55 -0300 Subject: [PATCH 03/22] refactor(types): change attribute number --- api/types/types.pb.go | 10 +++++----- api/types/types.proto | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 23812506cf5b5..6583ef574e6d7 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -4599,7 +4599,7 @@ type RecordSession struct { // Default indicates the default value for the services. Default github_com_gravitational_teleport_api_constants.SessionRecordingMode `protobuf:"bytes,2,opt,name=Default,proto3,casttype=github.com/gravitational/teleport/api/constants.SessionRecordingMode" json:"default,omitempty"` // SSH indicates the session mode used on SSH sessions. - SSH github_com_gravitational_teleport_api_constants.SessionRecordingMode `protobuf:"bytes,4,opt,name=SSH,proto3,casttype=github.com/gravitational/teleport/api/constants.SessionRecordingMode" json:"ssh,omitempty"` + SSH github_com_gravitational_teleport_api_constants.SessionRecordingMode `protobuf:"bytes,3,opt,name=SSH,proto3,casttype=github.com/gravitational/teleport/api/constants.SessionRecordingMode" json:"ssh,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -9839,7 +9839,7 @@ var fileDescriptor_d938547f84707355 = []byte{ 0x3b, 0xe4, 0x8c, 0xac, 0x7e, 0x35, 0x98, 0xff, 0x2e, 0x97, 0x1a, 0x77, 0xb2, 0x04, 0x23, 0x02, 0x59, 0xac, 0xac, 0xbd, 0xd5, 0x3f, 0x9b, 0x59, 0xfd, 0x88, 0xa8, 0xde, 0x92, 0xf4, 0xe4, 0x21, 0x63, 0xb5, 0xe3, 0x74, 0x9b, 0x32, 0x89, 0xdc, 0x47, 0x7c, 0x58, 0x11, 0xa4, 0x09, 0xf0, 0xc2, - 0xe9, 0x43, 0x97, 0xf4, 0xc8, 0x38, 0x94, 0x64, 0x59, 0x1b, 0xd9, 0xe7, 0x97, 0x3d, 0x0b, 0x71, + 0xe9, 0x43, 0x97, 0xf4, 0xc8, 0x38, 0x94, 0x64, 0x59, 0x1b, 0xd9, 0xe7, 0x97, 0x3d, 0xf3, 0x71, 0xb8, 0x8a, 0x7e, 0xb3, 0xf3, 0x89, 0x55, 0xc8, 0x6a, 0x31, 0xff, 0xc8, 0x80, 0x71, 0x4d, 0x70, 0xc8, 0x1b, 0x4a, 0x70, 0x57, 0x12, 0x94, 0xa9, 0xe1, 0x64, 0xbe, 0x1d, 0xf2, 0x86, 0x88, 0xe8, 0xcb, 0xf5, 0xa7, 0xcb, 0xcc, 0xd5, 0x77, 0xec, 0x8e, 0x36, 0x49, 0x89, 0x51, 0xe8, 0x93, 0x12, @@ -10201,7 +10201,7 @@ var fileDescriptor_d938547f84707355 = []byte{ 0xe9, 0x02, 0xab, 0xdb, 0x6e, 0xb3, 0x02, 0xfc, 0x78, 0xb5, 0x60, 0x9d, 0x06, 0x2d, 0xaf, 0xcd, 0x4c, 0x8a, 0x72, 0xae, 0x56, 0xfe, 0xde, 0x9f, 0x3f, 0x77, 0xe6, 0x7b, 0x3f, 0x78, 0xce, 0xf8, 0xd3, 0x1f, 0x3c, 0x67, 0xfc, 0x8f, 0x1f, 0x3c, 0x67, 0x6c, 0x0f, 0xa3, 0xa0, 0xdf, 0xfa, 0xbf, - 0x01, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x88, 0xbd, 0xa1, 0x7d, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x64, 0x5e, 0x1b, 0xd3, 0x7d, 0xc6, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -15725,7 +15725,7 @@ func (m *RecordSession) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SSH) i = encodeVarintTypes(dAtA, i, uint64(len(m.SSH))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } if len(m.Default) > 0 { i -= len(m.Default) @@ -43645,7 +43645,7 @@ func (m *RecordSession) Unmarshal(dAtA []byte) error { } m.Default = github_com_gravitational_teleport_api_constants.SessionRecordingMode(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SSH", wireType) } diff --git a/api/types/types.proto b/api/types/types.proto index a37547855c8c0..07d732265f54d 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -1663,7 +1663,7 @@ message RecordSession { ]; // SSH indicates the session mode used on SSH sessions. - string SSH = 4 [ + string SSH = 3 [ (gogoproto.jsontag) = "ssh,omitempty", (gogoproto.casttype) = "github.com/gravitational/teleport/api/constants.SessionRecordingMode" From f04ad7660e5d03204a3031ef4661779db450ffa7 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 26 May 2022 16:00:58 -0300 Subject: [PATCH 04/22] chore: fix typos --- lib/events/auditwriter_test.go | 2 +- lib/events/gcssessions/gcsstream.go | 2 +- lib/events/s3sessions/s3stream.go | 2 +- lib/services/role.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/events/auditwriter_test.go b/lib/events/auditwriter_test.go index 9d940539c7e02..d6f9e0764ab08 100644 --- a/lib/events/auditwriter_test.go +++ b/lib/events/auditwriter_test.go @@ -293,7 +293,7 @@ func TestAuditWriter(t *testing.T) { return NewCallbackStreamer(CallbackStreamerConfig{ Inner: streamer, OnEmitAuditEvent: func(_ context.Context, _ session.ID, _ apievents.AuditEvent) error { - // Returns an unrecorable error. + // Returns an unrecoverable error. return errors.New(uploaderReservePartErrorMessage) }, }) diff --git a/lib/events/gcssessions/gcsstream.go b/lib/events/gcssessions/gcsstream.go index 856971e99e2fa..f80a8429e81bf 100644 --- a/lib/events/gcssessions/gcsstream.go +++ b/lib/events/gcssessions/gcsstream.go @@ -289,7 +289,7 @@ func (h *Handler) GetUploadMetadata(s session.ID) events.UploadMetadata { } } -// ReserUploadPart reserves an upload part. +// ReserveUploadPart reserves an upload part. func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpload, partNumber int64) error { return nil } diff --git a/lib/events/s3sessions/s3stream.go b/lib/events/s3sessions/s3stream.go index 169cd6c39c3bf..c7c69854be0f1 100644 --- a/lib/events/s3sessions/s3stream.go +++ b/lib/events/s3sessions/s3stream.go @@ -221,7 +221,7 @@ func (h *Handler) GetUploadMetadata(sessionID session.ID) events.UploadMetadata } } -// ReserUploadPart reserves an upload part. +// ReserveUploadPart reserves an upload part. func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpload, partNumber int64) error { return nil } diff --git a/lib/services/role.go b/lib/services/role.go index 18abfee541fd1..e6885d0a8fc3d 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -1540,7 +1540,7 @@ func (set RoleSet) SessionRecordingMode(service constants.SessionRecordingServic for _, role := range set { recordSession := role.GetOptions().RecordSession - // If one of the dafault values is "strict", set it as the value. + // If one of the default values is "strict", set it as the value. if recordSession.Default == constants.SessionRecordingModeStrict { defaultValue = constants.SessionRecordingModeStrict } From 80f10ff00f7fcb7abba173b040516f48beafc436 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 30 May 2022 10:37:12 -0300 Subject: [PATCH 05/22] refactor(events): change `receiveAndUpload` to return error --- lib/events/stream.go | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/lib/events/stream.go b/lib/events/stream.go index 8eb79cc804814..f85bdea92a280 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -309,7 +309,17 @@ func NewProtoStream(cfg ProtoStreamConfig) (*ProtoStream, error) { return nil, trace.Wrap(err) } - go writer.receiveAndUpload() + // Start writer events receiver. + go func() { + err := writer.receiveAndUpload() + if err != nil { + log.WithError(err).Debug("slice writer ended with error") + stream.setCancelError(err) + } + + stream.cancel() + }() + return stream, nil } @@ -491,7 +501,7 @@ func (w *sliceWriter) trySendStreamStatusUpdate(lastEventIndex int64) { } // receiveAndUpload receives and uploads serialized events -func (w *sliceWriter) receiveAndUpload() { +func (w *sliceWriter) receiveAndUpload() error { defer close(w.proto.uploadLoopDoneCh) // on the start, send stream status with the upload ID and negative // index so that remote party can get an upload ID @@ -505,7 +515,7 @@ func (w *sliceWriter) receiveAndUpload() { select { case <-w.proto.cancelCtx.Done(): // cancel stops all operations without waiting - return + return nil case <-w.proto.completeCtx.Done(): // if present, send remaining data for upload if w.current != nil { @@ -516,20 +526,18 @@ func (w *sliceWriter) receiveAndUpload() { w.current.isLast = true } if err := w.startUploadCurrentSlice(); err != nil { - w.proto.cancel() - log.WithError(err).Debug("Could not start uploading current slice, aborting.") - return + return trace.Wrap(err) } } + w.completeStream() - return + return nil case upload := <-w.completedUploadsC: part, err := upload.getPart() if err != nil { - log.WithError(err).Error("Could not upload part after retrying, aborting.") - w.proto.cancel() - return + return trace.Wrap(err) } + delete(w.activeUploads, part.Number) w.updateCompletedParts(*part, upload.lastEventIndex) case <-flushCh: @@ -546,9 +554,7 @@ func (w *sliceWriter) receiveAndUpload() { if w.current != nil { log.Debugf("Inactivity timer ticked at %v, inactivity period: %v exceeded threshold and have data. Flushing.", now, inactivityPeriod) if err := w.startUploadCurrentSlice(); err != nil { - w.proto.cancel() - log.WithError(err).Debug("Could not start uploading current slice, aborting.") - return + return trace.Wrap(err) } } else { log.Debugf("Inactivity timer ticked at %v, inactivity period: %v exceeded threshold but have no data. Nothing to do.", now, inactivityPeriod) @@ -570,9 +576,7 @@ func (w *sliceWriter) receiveAndUpload() { // able to process events. Close the streamer and set the // returned error so that event emitters can proceed. if isNewSliceError(err) { - w.proto.setCancelError(err) - w.proto.cancel() - return + return trace.Wrap(err) } continue @@ -581,9 +585,7 @@ func (w *sliceWriter) receiveAndUpload() { // this logic blocks the EmitAuditEvent in case if the // upload has not completed and the current slice is out of capacity if err := w.startUploadCurrentSlice(); err != nil { - w.proto.cancel() - log.WithError(err).Debug("Could not start uploading current slice, aborting.") - return + return trace.Wrap(err) } } } From 0e8fabebdc982ed5e6d929d3be85839ab098b6bc Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 30 May 2022 10:39:43 -0300 Subject: [PATCH 06/22] refactor(srv): change complete session recording call --- lib/srv/sess.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/srv/sess.go b/lib/srv/sess.go index edae3ce6fac7e..3a3a079d6f8a8 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -651,8 +651,8 @@ func (s *session) Close() error { } // Complete the session recording - if s.Recorder() != nil { - if err := s.Recorder().Complete(s.serverCtx); err != nil { + if recorder := s.Recorder(); recorder != nil { + if err := recorder.Complete(s.serverCtx); err != nil { s.log.WithError(err).Warn("Failed to close recorder.") } } From 94b5195fbbd4c737bd5024c7eb47ea7087f09d41 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 30 May 2022 11:08:17 -0300 Subject: [PATCH 07/22] chore(constants): remove unused constant --- api/constants/constants.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/api/constants/constants.go b/api/constants/constants.go index 411d892c03d8f..65ef473e00d73 100644 --- a/api/constants/constants.go +++ b/api/constants/constants.go @@ -231,10 +231,6 @@ const ( type SessionRecordingMode string const ( - // SessionRecordingModeEmpty is used to identify the absence of recording - // mode. - SessionRecordingModeEmpty = SessionRecordingMode("") - // SessionRecordingModeStrict causes any failure session recording to // terminate the session or prevent a new session from starting. SessionRecordingModeStrict = SessionRecordingMode("strict") From 5098f6be619353304e96e7f7e0169a9549ab8a17 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 30 May 2022 11:09:17 -0300 Subject: [PATCH 08/22] feat(srv): wrap errors --- lib/srv/sess.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/srv/sess.go b/lib/srv/sess.go index 3a3a079d6f8a8..9febd83454031 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -1736,9 +1736,9 @@ func (s *session) emitAuditEvent(ctx context.Context, event apievents.AuditEvent } s.setRecorder(newRecorder) - return newRecorder.EmitAuditEvent(ctx, event) + return trace.Wrap(newRecorder.EmitAuditEvent(ctx, event)) default: - return rec.EmitAuditEvent(ctx, event) + return trace.Wrap(rec.EmitAuditEvent(ctx, event)) } } From ee31f65b2c2ca6e44bbb8f11217a3881864a9de9 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 30 May 2022 14:40:42 -0300 Subject: [PATCH 09/22] chore: fix lint and tests --- lib/events/stream.go | 2 +- lib/services/role_test.go | 59 ++++++++++++++++++++++++--------------- lib/web/resources_test.go | 1 + 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/lib/events/stream.go b/lib/events/stream.go index f85bdea92a280..cb08f34c3fad7 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -1348,7 +1348,7 @@ func (m *MemoryUploader) GetUploadMetadata(sid session.ID) UploadMetadata { } // ReserUploadPart reserves an upload part. -func (h *MemoryUploader) ReserveUploadPart(ctx context.Context, upload StreamUpload, partNumber int64) error { +func (m *MemoryUploader) ReserveUploadPart(ctx context.Context, upload StreamUpload, partNumber int64) error { return nil } diff --git a/lib/services/role_test.go b/lib/services/role_test.go index 09a90ec1b6852..12a853b54ac1f 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -188,10 +188,13 @@ func TestRoleParse(t *testing.T) { }, Spec: types.RoleSpecV5{ Options: types.RoleOptions{ - CertificateFormat: constants.CertificateFormatStandard, - MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), - PortForwarding: types.NewBoolOption(true), - RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(true)}, + CertificateFormat: constants.CertificateFormatStandard, + MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), + PortForwarding: types.NewBoolOption(true), + RecordSession: &types.RecordSession{ + Default: constants.SessionRecordingModeBestEffort, + Desktop: types.NewBoolOption(true), + }, BPF: apidefaults.EnhancedEvents(), DesktopClipboard: types.NewBoolOption(true), DesktopDirectorySharing: types.NewBoolOption(true), @@ -222,10 +225,13 @@ func TestRoleParse(t *testing.T) { }, Spec: types.RoleSpecV5{ Options: types.RoleOptions{ - CertificateFormat: constants.CertificateFormatStandard, - MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), - PortForwarding: types.NewBoolOption(true), - RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(true)}, + CertificateFormat: constants.CertificateFormatStandard, + MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), + PortForwarding: types.NewBoolOption(true), + RecordSession: &types.RecordSession{ + Default: constants.SessionRecordingModeBestEffort, + Desktop: types.NewBoolOption(true), + }, BPF: apidefaults.EnhancedEvents(), DesktopClipboard: types.NewBoolOption(true), DesktopDirectorySharing: types.NewBoolOption(true), @@ -291,10 +297,13 @@ func TestRoleParse(t *testing.T) { }, Spec: types.RoleSpecV5{ Options: types.RoleOptions{ - CertificateFormat: constants.CertificateFormatStandard, - MaxSessionTTL: types.NewDuration(20 * time.Hour), - PortForwarding: types.NewBoolOption(true), - RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(true)}, + CertificateFormat: constants.CertificateFormatStandard, + MaxSessionTTL: types.NewDuration(20 * time.Hour), + PortForwarding: types.NewBoolOption(true), + RecordSession: &types.RecordSession{ + Default: constants.SessionRecordingModeBestEffort, + Desktop: types.NewBoolOption(true), + }, ClientIdleTimeout: types.NewDuration(17 * time.Minute), DisconnectExpiredCert: types.NewBool(true), BPF: apidefaults.EnhancedEvents(), @@ -377,11 +386,14 @@ func TestRoleParse(t *testing.T) { }, Spec: types.RoleSpecV5{ Options: types.RoleOptions{ - CertificateFormat: constants.CertificateFormatStandard, - ForwardAgent: types.NewBool(true), - MaxSessionTTL: types.NewDuration(20 * time.Hour), - PortForwarding: types.NewBoolOption(true), - RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(true)}, + CertificateFormat: constants.CertificateFormatStandard, + ForwardAgent: types.NewBool(true), + MaxSessionTTL: types.NewDuration(20 * time.Hour), + PortForwarding: types.NewBoolOption(true), + RecordSession: &types.RecordSession{ + Default: constants.SessionRecordingModeBestEffort, + Desktop: types.NewBoolOption(true), + }, ClientIdleTimeout: types.NewDuration(0), DisconnectExpiredCert: types.NewBool(false), BPF: apidefaults.EnhancedEvents(), @@ -451,11 +463,14 @@ func TestRoleParse(t *testing.T) { }, Spec: types.RoleSpecV5{ Options: types.RoleOptions{ - CertificateFormat: constants.CertificateFormatStandard, - ForwardAgent: types.NewBool(true), - MaxSessionTTL: types.NewDuration(20 * time.Hour), - PortForwarding: types.NewBoolOption(true), - RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(true)}, + CertificateFormat: constants.CertificateFormatStandard, + ForwardAgent: types.NewBool(true), + MaxSessionTTL: types.NewDuration(20 * time.Hour), + PortForwarding: types.NewBoolOption(true), + RecordSession: &types.RecordSession{ + Default: constants.SessionRecordingModeBestEffort, + Desktop: types.NewBoolOption(true), + }, ClientIdleTimeout: types.NewDuration(0), DisconnectExpiredCert: types.NewBool(false), BPF: apidefaults.EnhancedEvents(), diff --git a/lib/web/resources_test.go b/lib/web/resources_test.go index 939722032ba64..17c76c7598e97 100644 --- a/lib/web/resources_test.go +++ b/lib/web/resources_test.go @@ -123,6 +123,7 @@ spec: max_session_ttl: 30h0m0s port_forwarding: true record_session: + default: best_effort desktop: true version: v3 ` From 78a4669e787cf7088616d23b28f4477e869a0c3d Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Tue, 31 May 2022 10:23:39 -0300 Subject: [PATCH 10/22] chore(srv): add missing parameter --- lib/srv/exec_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/srv/exec_test.go b/lib/srv/exec_test.go index 608ec515cf148..c91e6c818ffa9 100644 --- a/lib/srv/exec_test.go +++ b/lib/srv/exec_test.go @@ -235,7 +235,7 @@ func TestContinue(t *testing.T) { } func newExecServerContext(t *testing.T, srv Server) *ServerContext { - scx := newTestServerContext(t, srv) + scx := newTestServerContext(t, srv, nil) term, err := newLocalTerminal(scx) require.NoError(t, err) From 986e4baac8e7e7ecec4ce1dc0b72276b9ef92bae Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Tue, 31 May 2022 10:25:35 -0300 Subject: [PATCH 11/22] refactor(filesessions): remove random data generation --- lib/events/filesessions/filestream.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/events/filesessions/filestream.go b/lib/events/filesessions/filestream.go index 7e4290e814afa..765d47fbc3405 100644 --- a/lib/events/filesessions/filestream.go +++ b/lib/events/filesessions/filestream.go @@ -18,7 +18,6 @@ package filesessions import ( "context" - "crypto/rand" "fmt" "io" "os" @@ -271,10 +270,6 @@ func (h *Handler) GetUploadMetadata(s session.ID) events.UploadMetadata { func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpload, partNumber int64) error { // Create a buffer with the max size that a part file can have. buf := make([]byte, minUploadBytes+events.MaxProtoMessageSizeBytes) - _, err := rand.Read(buf) - if err != nil { - return trace.Wrap(err) - } file, partPath, err := h.openUploadPart(upload, partNumber) if err != nil { From 3eac5322ac7c670302c07e3c9995b678f345b789 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Tue, 31 May 2022 11:36:55 -0300 Subject: [PATCH 12/22] refactor(events): change last number part increment --- lib/events/stream.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/events/stream.go b/lib/events/stream.go index cb08f34c3fad7..368a4f021a1bf 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -601,6 +601,7 @@ func (w *sliceWriter) shouldUploadCurrentSlice() bool { // startUploadCurrentSlice starts uploading current slice // and adds it to the waiting list func (w *sliceWriter) startUploadCurrentSlice() error { + w.lastPartNumber++ activeUpload, err := w.startUpload(w.lastPartNumber, w.current) if err != nil { return trace.Wrap(err) @@ -619,7 +620,6 @@ func (b *bufferCloser) Close() error { } func (w *sliceWriter) newSlice() (*slice, error) { - w.lastPartNumber++ buffer := w.proto.cfg.BufferPool.Get() buffer.Reset() // reserve bytes for version header From 83ad1afe5cb46b6039936479b8d3c360e819a1dd Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Tue, 31 May 2022 11:39:21 -0300 Subject: [PATCH 13/22] chore(filesessions): fix license --- lib/events/filesessions/filestream_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/events/filesessions/filestream_test.go b/lib/events/filesessions/filestream_test.go index f97c4ed0e5bcd..ede83047838bf 100644 --- a/lib/events/filesessions/filestream_test.go +++ b/lib/events/filesessions/filestream_test.go @@ -1,3 +1,17 @@ +// Copyright 2022 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package filesessions import ( From e267454d2370c1592dbc208d776b9961084941e7 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Tue, 31 May 2022 15:39:12 -0300 Subject: [PATCH 14/22] fix(events): increment the last part after upload is complete --- lib/events/stream.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/events/stream.go b/lib/events/stream.go index 368a4f021a1bf..14a5fc75f4f5e 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -601,13 +601,13 @@ func (w *sliceWriter) shouldUploadCurrentSlice() bool { // startUploadCurrentSlice starts uploading current slice // and adds it to the waiting list func (w *sliceWriter) startUploadCurrentSlice() error { - w.lastPartNumber++ activeUpload, err := w.startUpload(w.lastPartNumber, w.current) if err != nil { return trace.Wrap(err) } w.activeUploads[w.lastPartNumber] = activeUpload w.current = nil + w.lastPartNumber++ return nil } From 9c26d2d6d21bdaa036986aac6eedd4f97646670f Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Tue, 31 May 2022 16:40:19 -0300 Subject: [PATCH 15/22] refactor(events): change `cancel` call on auditwriter --- lib/events/auditwriter.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/events/auditwriter.go b/lib/events/auditwriter.go index 2a9958d565f21..d040f02d9e716 100644 --- a/lib/events/auditwriter.go +++ b/lib/events/auditwriter.go @@ -415,6 +415,8 @@ func (a *AuditWriter) Complete(ctx context.Context) error { } func (a *AuditWriter) processEvents() { + defer a.cancel() + for { // From the spec: // @@ -443,7 +445,6 @@ func (a *AuditWriter) processEvents() { if err != nil { if isUnrecoverableError(err) { a.log.WithError(err).Debug("Failed to emit audit event.") - a.cancel() return } @@ -451,7 +452,6 @@ func (a *AuditWriter) processEvents() { start := time.Now() if err := a.recoverStream(); err != nil { a.log.WithError(err).Warningf("Failed to recover stream.") - a.cancel() return } a.log.Debugf("Recovered stream in %v.", time.Since(start)) @@ -460,7 +460,6 @@ func (a *AuditWriter) processEvents() { a.log.Debugf("Stream was closed by the server, attempting to recover.") if err := a.recoverStream(); err != nil { a.log.WithError(err).Warningf("Failed to recover stream.") - a.cancel() return } case <-a.closeCtx.Done(): From bbeed5824f81a8993d77b975594b7c344fee2491 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Wed, 1 Jun 2022 10:42:58 -0300 Subject: [PATCH 16/22] fix(srv): use proper identity when creating session recorder --- lib/srv/sess.go | 2 +- lib/srv/sess_test.go | 66 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/lib/srv/sess.go b/lib/srv/sess.go index 9febd83454031..d3b6716fada9c 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -1080,7 +1080,7 @@ func newRecorder(s *session, ctx *ServerContext) (events.StreamWriter, error) { ClusterName: ctx.ClusterName, }) if err != nil { - switch s.scx.Identity.RoleSet.SessionRecordingMode(constants.SessionRecordingServiceSSH) { + switch ctx.Identity.RoleSet.SessionRecordingMode(constants.SessionRecordingServiceSSH) { case constants.SessionRecordingModeBestEffort: s.log.WithError(err).Warning("Failed to initialize session recording, disabling it for this session.") eventOnlyRec, err := newEventOnlyRecorder(s, ctx) diff --git a/lib/srv/sess_test.go b/lib/srv/sess_test.go index 66f245d742fc5..29a12de723d91 100644 --- a/lib/srv/sess_test.go +++ b/lib/srv/sess_test.go @@ -181,7 +181,7 @@ func TestSession_newRecorder(t *testing.T) { recAssertion: require.Nil, }, { - desc: "err-new-audit-writer-fails", + desc: "strict-err-new-audit-writer-fails", sess: &session{ id: "test", log: logger, @@ -198,10 +198,66 @@ func TestSession_newRecorder(t *testing.T) { srv: &mockServer{ component: teleport.ComponentNode, }, + Identity: IdentityContext{ + RoleSet: services.RoleSet{ + &types.RoleV5{ + Metadata: types.Metadata{Name: "dev", Namespace: apidefaults.Namespace}, + Spec: types.RoleSpecV5{ + Options: types.RoleOptions{ + RecordSession: &types.RecordSession{ + SSH: constants.SessionRecordingModeStrict, + }, + }, + }, + }, + }, + }, }, errAssertion: require.Error, recAssertion: require.Nil, }, + { + desc: "best-effort-err-new-audit-writer-succeeds", + sess: &session{ + id: "test", + log: logger, + registry: &SessionRegistry{ + SessionRegistryConfig: SessionRegistryConfig{ + Srv: &mockServer{ + component: teleport.ComponentNode, + }, + }, + }, + }, + sctx: &ServerContext{ + ClusterName: "test", + SessionRecordingConfig: nodeRecordingSync, + srv: &mockServer{ + component: teleport.ComponentNode, + }, + Identity: IdentityContext{ + RoleSet: services.RoleSet{ + &types.RoleV5{ + Metadata: types.Metadata{Name: "dev", Namespace: apidefaults.Namespace}, + Spec: types.RoleSpecV5{ + Options: types.RoleOptions{ + RecordSession: &types.RecordSession{ + SSH: constants.SessionRecordingModeBestEffort, + }, + }, + }, + }, + }, + }, + }, + errAssertion: require.NoError, + recAssertion: func(t require.TestingT, i interface{}, _ ...interface{}) { + require.NotNil(t, i) + aw, ok := i.(*events.AuditWriter) + require.True(t, ok) + require.NoError(t, aw.Close(context.Background())) + }, + }, { desc: "audit-writer", sess: &session{ @@ -416,7 +472,7 @@ func TestSessionRecordingModes(t *testing.T) { expectClosedSession: true, }, { - desc: "BestEfforMode", + desc: "BestEffortMode", sessionRecordingMode: constants.SessionRecordingModeBestEffort, expectClosedSession: false, }, @@ -445,12 +501,16 @@ func TestSessionRecordingModes(t *testing.T) { }, }) + // Write stuff in the session + _, err = sessCh.Write([]byte("hello")) + require.NoError(t, err) + // Close the recorder, indicating there is some error. err = sess.Recorder().Complete(context.Background()) require.NoError(t, err) // Send more writes. - _, err = sessCh.Write([]byte("hello")) + _, err = sessCh.Write([]byte("world")) require.NoError(t, err) // Ensure the session is stopped. From cddc48c12099fba3a54a9867c37c197d353c16c1 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 2 Jun 2022 14:43:47 -0300 Subject: [PATCH 17/22] Revert "refactor(events): change last number part increment" This reverts commit 3eac5322ac7c670302c07e3c9995b678f345b789. --- lib/events/stream.go | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/events/stream.go b/lib/events/stream.go index 14a5fc75f4f5e..3bba8ee0c6c75 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -620,6 +620,7 @@ func (b *bufferCloser) Close() error { } func (w *sliceWriter) newSlice() (*slice, error) { + w.lastPartNumber++ buffer := w.proto.cfg.BufferPool.Get() buffer.Reset() // reserve bytes for version header From 617530c6047c12877a9120c1052eaf7006f70049 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 2 Jun 2022 23:50:30 -0300 Subject: [PATCH 18/22] tests(integration): add session recording mode --- integration/integration_test.go | 162 ++++++++++++++++++++++++++ lib/events/filesessions/filestream.go | 27 ++++- lib/utils/fs.go | 3 + 3 files changed, 190 insertions(+), 2 deletions(-) diff --git a/integration/integration_test.go b/integration/integration_test.go index a411b7f1f9f14..58eed1355f5a7 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -44,6 +44,7 @@ import ( "golang.org/x/crypto/ssh" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" tracessh "github.com/gravitational/teleport/api/observability/tracing/ssh" "github.com/gravitational/teleport/api/profile" @@ -58,6 +59,7 @@ import ( "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/events/filesessions" "github.com/gravitational/teleport/lib/pam" "github.com/gravitational/teleport/lib/reversetunnel" "github.com/gravitational/teleport/lib/service" @@ -207,6 +209,7 @@ func TestIntegrations(t *testing.T) { t.Run("WindowChange", suite.bind(testWindowChange)) t.Run("SSHTracker", suite.bind(testSSHTracker)) t.Run("TestKubeAgentFiltering", suite.bind(testKubeAgentFiltering)) + t.Run("SessionRecordingModes", suite.bind(testSessionRecordingModes)) } // testAuditOn creates a live session, records a bunch of data through it @@ -852,6 +855,165 @@ func testInteractiveReverseTunnel(t *testing.T, suite *integrationTestSuite) { verifySessionJoin(t, suite.me.Username, teleport) } +func testSessionRecordingModes(t *testing.T, suite *integrationTestSuite) { + tr := utils.NewTracer(utils.ThisFunction()).Start() + defer tr.Stop() + + recConfig, err := types.NewSessionRecordingConfigFromConfigFile(types.SessionRecordingConfigSpecV2{ + Mode: types.RecordAtNode, + }) + require.NoError(t, err) + + // Enable session recording on node. + cfg := suite.defaultServiceConfig() + cfg.Auth.Enabled = true + cfg.Auth.SessionRecordingConfig = recConfig + cfg.Proxy.DisableWebService = true + cfg.Proxy.DisableWebInterface = true + cfg.Proxy.Enabled = true + cfg.SSH.Enabled = true + + teleport := suite.newTeleportWithConfig(t, nil, nil, cfg) + defer teleport.StopAll() + + // startSession starts an interactive session, users must terminate the + // session by typing "exit" in the terminal. + startSession := func(username string) (*Terminal, chan error) { + term := NewTerminal(250) + errCh := make(chan error) + + go func() { + cl, err := teleport.NewClient(ClientConfig{ + Login: username, + Cluster: Site, + Host: Host, + }) + if err != nil { + errCh <- trace.Wrap(err) + return + } + cl.Stdout = term + cl.Stdin = term + + errCh <- cl.SSH(context.TODO(), []string{}, false) + }() + + return term, errCh + } + + waitSessionTermination := func(t *testing.T, errCh chan error, errorAssertion require.ErrorAssertionFunc) { + require.Eventually(t, func() bool { + select { + case err := <-errCh: + errorAssertion(t, err) + return true + default: + return false + } + }, 10*time.Second, 500*time.Millisecond) + } + + // enableDiskFailure changes the OpenFileFunc on filesession package. The + // replace function will always return an error when called. + enableDiskFailure := func() { + filesessions.SetOpenFileFunc(func(path string, _ int, _ os.FileMode) (*os.File, error) { + return nil, fmt.Errorf("failed to open file %q", path) + }) + } + + // disableDiskFailure restore the OpenFileFunc. + disableDiskFailure := func() { + filesessions.SetOpenFileFunc(os.OpenFile) + } + + for name, test := range map[string]struct { + recordingMode constants.SessionRecordingMode + expectSessionFailure bool + }{ + "BestEffortMode": { + recordingMode: constants.SessionRecordingModeBestEffort, + expectSessionFailure: false, + }, + "StrictMode": { + recordingMode: constants.SessionRecordingModeStrict, + expectSessionFailure: true, + }, + } { + t.Run(name, func(t *testing.T) { + // Setup user and session recording mode. + username := suite.me.Username + role, err := types.NewRoleV3("devs", types.RoleSpecV5{ + Allow: types.RoleConditions{ + Logins: []string{username}, + }, + Options: types.RoleOptions{ + RecordSession: &types.RecordSession{ + SSH: test.recordingMode, + }, + }, + }) + require.NoError(t, err) + require.NoError(t, SetupUser(teleport.Process, username, []types.Role{role})) + + t.Run("BeforeStartFailure", func(t *testing.T) { + // Enable disk failure. + enableDiskFailure() + defer disableDiskFailure() + + // Start session. + term, errCh := startSession(username) + if test.expectSessionFailure { + waitSessionTermination(t, errCh, require.Error) + return + } + + // Send stuff to the session. + term.Type("echo Hello\n\r") + + // Guarantee the session hasn't stopped after typing. + select { + case <-errCh: + require.Fail(t, "session was closed before") + default: + } + + // Wait for the session to terminate without error. + term.Type("exit\n\r") + waitSessionTermination(t, errCh, require.NoError) + }) + + t.Run("MidSessionFailure", func(t *testing.T) { + // Start session. + term, errCh := startSession(username) + + // Guarantee the session started properly. + select { + case <-errCh: + require.Fail(t, "session was closed before") + default: + } + + // Enable disk failure + enableDiskFailure() + defer disableDiskFailure() + + // Send stuff to the session. + term.Type("echo Hello\n\r") + + // Expect the session to fail + if test.expectSessionFailure { + waitSessionTermination(t, errCh, require.Error) + return + } + + // Wait for the session to terminate without error. + term.Type("exit\n\r") + waitSessionTermination(t, errCh, require.NoError) + }) + }) + } +} + // TestCustomReverseTunnel tests that the SSH node falls back to configured // proxy address if it cannot connect via the proxy address from the reverse // tunnel discovery query. diff --git a/lib/events/filesessions/filestream.go b/lib/events/filesessions/filestream.go index 765d47fbc3405..5c6584651a09e 100644 --- a/lib/events/filesessions/filestream.go +++ b/lib/events/filesessions/filestream.go @@ -25,6 +25,7 @@ import ( "sort" "strconv" "strings" + "sync" "github.com/gravitational/teleport" "github.com/gravitational/teleport/lib/events" @@ -35,6 +36,28 @@ import ( "github.com/gravitational/trace" ) +var ( + // openFileFunc this is the `OpenFileWithFlagsFunc` used by the handler. + openFileFunc utils.OpenFileWithFlagsFunc = os.OpenFile + + // flagLock protects access to all globals declared in this file + flagLock sync.Mutex +) + +// SetOpenFileFunc sets the OpenFileWithFlagsFunc used by the package. +func SetOpenFileFunc(f utils.OpenFileWithFlagsFunc) { + flagLock.Lock() + defer flagLock.Unlock() + openFileFunc = f +} + +// GetOpenFileFunc gets the OpenFileWithFlagsFunc set in the package. +func GetOpenFileFunc() utils.OpenFileWithFlagsFunc { + flagLock.Lock() + defer flagLock.Unlock() + return openFileFunc +} + // minUploadBytes is the minimum part file size required to trigger its upload. const minUploadBytes = events.MaxProtoMessageSizeBytes * 2 @@ -109,7 +132,7 @@ func (h *Handler) CompleteUpload(ctx context.Context, upload events.StreamUpload uploadPath := h.path(upload.SessionID) // Prevent other processes from accessing this file until the write is completed - f, err := os.OpenFile(uploadPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + f, err := GetOpenFileFunc()(uploadPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return trace.ConvertSystemError(err) } @@ -291,7 +314,7 @@ func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpl // openUploadPart opens a upload file part. func (h *Handler) openUploadPart(upload events.StreamUpload, partNumber int64) (*os.File, string, error) { partPath := h.partPath(upload, partNumber) - file, err := os.OpenFile(partPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + file, err := GetOpenFileFunc()(partPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return nil, partPath, trace.ConvertSystemError(err) } diff --git a/lib/utils/fs.go b/lib/utils/fs.go index bd9565a76d4ed..5c49087ca9e14 100644 --- a/lib/utils/fs.go +++ b/lib/utils/fs.go @@ -24,6 +24,9 @@ import ( "github.com/gravitational/trace" ) +// OpenFileFunc defines a function used to open files providing options. +type OpenFileWithFlagsFunc func(name string, flag int, perm os.FileMode) (*os.File, error) + // EnsureLocalPath makes sure the path exists, or, if omitted results in the subpath in // default gravity config directory, e.g. // From 6745fa063806461262ec9674a7e0813ea920f0d2 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Fri, 3 Jun 2022 10:43:47 -0300 Subject: [PATCH 19/22] chore: apply review suggestions --- lib/events/filesessions/filestream.go | 6 ++++++ lib/events/stream.go | 11 +++++------ lib/utils/fs.go | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/events/filesessions/filestream.go b/lib/events/filesessions/filestream.go index 5c6584651a09e..d7e99eb93e92e 100644 --- a/lib/events/filesessions/filestream.go +++ b/lib/events/filesessions/filestream.go @@ -38,6 +38,8 @@ import ( var ( // openFileFunc this is the `OpenFileWithFlagsFunc` used by the handler. + // + // TODO(gabrielcorado): remove this global variable. openFileFunc utils.OpenFileWithFlagsFunc = os.OpenFile // flagLock protects access to all globals declared in this file @@ -45,6 +47,8 @@ var ( ) // SetOpenFileFunc sets the OpenFileWithFlagsFunc used by the package. +// +// TODO(gabrielcorado): remove this global variable. func SetOpenFileFunc(f utils.OpenFileWithFlagsFunc) { flagLock.Lock() defer flagLock.Unlock() @@ -52,6 +56,8 @@ func SetOpenFileFunc(f utils.OpenFileWithFlagsFunc) { } // GetOpenFileFunc gets the OpenFileWithFlagsFunc set in the package. +// +// TODO(gabrielcorado): remove this global variable. func GetOpenFileFunc() utils.OpenFileWithFlagsFunc { flagLock.Lock() defer flagLock.Unlock() diff --git a/lib/events/stream.go b/lib/events/stream.go index 3bba8ee0c6c75..d9c9a6190cde8 100644 --- a/lib/events/stream.go +++ b/lib/events/stream.go @@ -311,8 +311,7 @@ func NewProtoStream(cfg ProtoStreamConfig) (*ProtoStream, error) { // Start writer events receiver. go func() { - err := writer.receiveAndUpload() - if err != nil { + if err := writer.receiveAndUpload(); err != nil { log.WithError(err).Debug("slice writer ended with error") stream.setCancelError(err) } @@ -575,7 +574,7 @@ func (w *sliceWriter) receiveAndUpload() error { // Failure on `newSlice` indicates that the streamer won't be // able to process events. Close the streamer and set the // returned error so that event emitters can proceed. - if isNewSliceError(err) { + if isReserveUploadPartError(err) { return trace.Wrap(err) } @@ -1348,12 +1347,12 @@ func (m *MemoryUploader) GetUploadMetadata(sid session.ID) UploadMetadata { } } -// ReserUploadPart reserves an upload part. +// ReserveUploadPart reserves an upload part. func (m *MemoryUploader) ReserveUploadPart(ctx context.Context, upload StreamUpload, partNumber int64) error { return nil } -// isNewSliceError identifies new slice errors. -func isNewSliceError(err error) bool { +// isReserveUploadPartError identifies uploader reserve part errors. +func isReserveUploadPartError(err error) bool { return strings.Contains(err.Error(), uploaderReservePartErrorMessage) } diff --git a/lib/utils/fs.go b/lib/utils/fs.go index 5c49087ca9e14..9a00c5cbdf8b8 100644 --- a/lib/utils/fs.go +++ b/lib/utils/fs.go @@ -24,7 +24,7 @@ import ( "github.com/gravitational/trace" ) -// OpenFileFunc defines a function used to open files providing options. +// OpenFileWithFlagsFunc defines a function used to open files providing options. type OpenFileWithFlagsFunc func(name string, flag int, perm os.FileMode) (*os.File, error) // EnsureLocalPath makes sure the path exists, or, if omitted results in the subpath in From 263235397f82ddb19cc0b19acb879879da316682 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Fri, 3 Jun 2022 13:26:28 -0300 Subject: [PATCH 20/22] refactor(filesessions): generate buffer after file is opened --- lib/events/filesessions/filestream.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/events/filesessions/filestream.go b/lib/events/filesessions/filestream.go index d7e99eb93e92e..4c4b682cbf5d9 100644 --- a/lib/events/filesessions/filestream.go +++ b/lib/events/filesessions/filestream.go @@ -297,14 +297,14 @@ func (h *Handler) GetUploadMetadata(s session.ID) events.UploadMetadata { // ReserveUploadPart reserves an upload part. func (h *Handler) ReserveUploadPart(ctx context.Context, upload events.StreamUpload, partNumber int64) error { - // Create a buffer with the max size that a part file can have. - buf := make([]byte, minUploadBytes+events.MaxProtoMessageSizeBytes) - file, partPath, err := h.openUploadPart(upload, partNumber) if err != nil { return trace.ConvertSystemError(err) } + // Create a buffer with the max size that a part file can have. + buf := make([]byte, minUploadBytes+events.MaxProtoMessageSizeBytes) + _, err = file.Write(buf) if err = trace.NewAggregate(err, file.Close()); err != nil { if rmErr := os.Remove(partPath); rmErr != nil { From c289e27c8afa6f26e85bdc4dc0dc25b74bdee7c9 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 6 Jun 2022 14:45:14 -0300 Subject: [PATCH 21/22] chore(events): fix lint --- lib/events/auditwriter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/events/auditwriter.go b/lib/events/auditwriter.go index 6240e80b2e419..522dcc917c161 100644 --- a/lib/events/auditwriter.go +++ b/lib/events/auditwriter.go @@ -445,7 +445,7 @@ func (a *AuditWriter) processEvents() { if err != nil { if IsPermanentEmitError(err) { a.log.WithError(err).WithField("event", event). - Warning("Failed to emit audit event due to permanent emit audit event error. Event will be omitted.") + Warning("Failed to emit audit event due to permanent emit audit event error. Event will be omitted.") continue } From 38b8554f78eed6fb781998d4e4e00767e1a45352 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 6 Jun 2022 15:13:31 -0300 Subject: [PATCH 22/22] chore(events): fix lint --- lib/events/auditwriter.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/events/auditwriter.go b/lib/events/auditwriter.go index 522dcc917c161..89a9ae5ec63c6 100644 --- a/lib/events/auditwriter.go +++ b/lib/events/auditwriter.go @@ -444,8 +444,7 @@ func (a *AuditWriter) processEvents() { err := a.stream.EmitAuditEvent(a.cfg.Context, event) if err != nil { if IsPermanentEmitError(err) { - a.log.WithError(err).WithField("event", event). - Warning("Failed to emit audit event due to permanent emit audit event error. Event will be omitted.") + a.log.WithError(err).WithField("event", event).Warning("Failed to emit audit event due to permanent emit audit event error. Event will be omitted.") continue }