From 5b834f881d6b3acb70ed68b43cf9950084f476b8 Mon Sep 17 00:00:00 2001 From: joerger Date: Wed, 31 Aug 2022 16:11:58 -0700 Subject: [PATCH 1/3] Replace role/authPref RequireSessionMFA (bool) with RequireMFAType (string). - Add new RequireMFAType constant values with custom boolean marshalling. - Add RequireMFAType to role and auth preference and deprecate RequireSessionMFA. - Add session-mfa override login when hardware_key_touch is enforced. - Add protobuf enum for RequireMFAType. - Add support for proto enums in protoc-gen-crd and update Kubernetes Operator manifests. --- api/client/client.go | 32 +- api/client/client_test.go | 188 ++ api/client/proto/authservice.pb.go | 2 + api/client/proto/joinservice.pb.go | 1 + api/proto/teleport/legacy/types/types.proto | 31 +- api/types/authentication.go | 154 +- api/types/role.go | 13 + api/types/types.pb.go | 1985 +++++++++-------- .../resources.teleport.dev_roles.yaml | 10 +- lib/auth/auth.go | 6 +- lib/auth/auth_with_roles.go | 29 +- lib/auth/auth_with_roles_test.go | 16 +- lib/auth/grpcserver_test.go | 81 +- lib/auth/permissions.go | 11 + lib/config/fileconf.go | 16 +- lib/config/fileconf_test.go | 95 +- lib/kube/proxy/forwarder.go | 7 +- lib/services/access_checker.go | 25 +- lib/services/role.go | 61 +- lib/services/role_test.go | 293 ++- lib/srv/app/server.go | 5 +- lib/srv/authhandlers.go | 7 +- lib/srv/db/common/session.go | 7 + lib/srv/db/elasticsearch/engine.go | 6 +- lib/srv/db/mongodb/engine.go | 22 +- lib/srv/db/mysql/engine.go | 6 +- lib/srv/db/postgres/engine.go | 6 +- lib/srv/db/redis/engine.go | 6 +- lib/srv/db/snowflake/engine.go | 10 +- lib/srv/db/sqlserver/engine.go | 6 +- lib/srv/db/sqlserver/engine_test.go | 9 +- lib/srv/desktop/windows_server.go | 16 +- lib/web/apiserver_test.go | 8 +- .../bases/resources.teleport.dev_roles.yaml | 10 +- operator/crdgen/schemagen.go | 2 +- 35 files changed, 1969 insertions(+), 1213 deletions(-) diff --git a/api/client/client.go b/api/client/client.go index 40226a0bed72d..72996ebca942b 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -662,6 +662,9 @@ func (c *Client) GetCurrentUserRoles(ctx context.Context) ([]types.Role, error) if err != nil { return nil, trail.FromGRPC(err) } + // An old server would send RequireSessionMFA instead of RequireMFAType + // DELETE IN 13.0.0 + role.CheckSetRequireSessionMFA() roles = append(roles, role) } return roles, nil @@ -1595,11 +1598,14 @@ func (c *Client) GetRole(ctx context.Context, name string) (types.Role, error) { if name == "" { return nil, trace.BadParameter("missing name") } - resp, err := c.grpc.GetRole(ctx, &proto.GetRoleRequest{Name: name}, c.callOpts...) + role, err := c.grpc.GetRole(ctx, &proto.GetRoleRequest{Name: name}, c.callOpts...) if err != nil { return nil, trail.FromGRPC(err) } - return resp, nil + // An old server would send RequireSessionMFA instead of RequireMFAType + // DELETE IN 13.0.0 + role.CheckSetRequireSessionMFA() + return role, nil } // GetRoles returns a list of roles @@ -1610,6 +1616,9 @@ func (c *Client) GetRoles(ctx context.Context) ([]types.Role, error) { } roles := make([]types.Role, 0, len(resp.GetRoles())) for _, role := range resp.GetRoles() { + // An old server would send RequireSessionMFA instead of RequireMFAType + // DELETE IN 13.0.0 + role.CheckSetRequireSessionMFA() roles = append(roles, role) } return roles, nil @@ -1617,11 +1626,16 @@ func (c *Client) GetRoles(ctx context.Context) ([]types.Role, error) { // UpsertRole creates or updates role func (c *Client) UpsertRole(ctx context.Context, role types.Role) error { - roleV4, ok := role.(*types.RoleV5) + r, ok := role.(*types.RoleV5) if !ok { return trace.BadParameter("invalid type %T", role) } - _, err := c.grpc.UpsertRole(ctx, roleV4, c.callOpts...) + + // An old server would expect RequireSessionMFA instead of RequireMFAType + // DELETE IN 13.0.0 + r.CheckSetRequireSessionMFA() + + _, err := c.grpc.UpsertRole(ctx, r, c.callOpts...) return trail.FromGRPC(err) } @@ -2241,11 +2255,14 @@ func (c *Client) ResetSessionRecordingConfig(ctx context.Context) error { // GetAuthPreference gets cluster auth preference. func (c *Client) GetAuthPreference(ctx context.Context) (types.AuthPreference, error) { - resp, err := c.grpc.GetAuthPreference(ctx, &empty.Empty{}, c.callOpts...) + pref, err := c.grpc.GetAuthPreference(ctx, &empty.Empty{}, c.callOpts...) if err != nil { return nil, trail.FromGRPC(err) } - return resp, nil + // An old server would send RequireSessionMFA instead of RequireMFAType + // DELETE IN 13.0.0 + pref.CheckSetRequireSessionMFA() + return pref, nil } // SetAuthPreference sets cluster auth preference. @@ -2254,6 +2271,9 @@ func (c *Client) SetAuthPreference(ctx context.Context, authPref types.AuthPrefe if !ok { return trace.BadParameter("invalid type %T", authPref) } + // An old server would send RequireSessionMFA instead of RequireMFAType + // DELETE IN 13.0.0 + authPrefV2.CheckSetRequireSessionMFA() _, err := c.grpc.SetAuthPreference(ctx, authPrefV2, c.callOpts...) return trail.FromGRPC(err) } diff --git a/api/client/client_test.go b/api/client/client_test.go index d124f3658d4e2..99646059bb4eb 100644 --- a/api/client/client_test.go +++ b/api/client/client_test.go @@ -778,3 +778,191 @@ func TestAccessRequestDowngrade(t *testing.T) { m.grpc.Stop() require.NoError(t, <-remoteErr) } + +type mockRoleServer struct { + *mockServer + roles map[string]*types.RoleV5 +} + +func newMockRoleServer() *mockRoleServer { + m := &mockRoleServer{ + &mockServer{ + grpc: grpc.NewServer(), + UnimplementedAuthServiceServer: &proto.UnimplementedAuthServiceServer{}, + }, + make(map[string]*types.RoleV5), + } + proto.RegisterAuthServiceServer(m.grpc, m) + return m +} + +func startMockRoleServer(t *testing.T) string { + l, err := net.Listen("tcp", "") + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, l.Close()) }) + go newMockRoleServer().grpc.Serve(l) + return l.Addr().String() +} + +func (m *mockRoleServer) GetRole(ctx context.Context, req *proto.GetRoleRequest) (*types.RoleV5, error) { + conn, ok := m.roles[req.Name] + if !ok { + return nil, trace.NotFound("not found") + } + return conn, nil +} + +func (m *mockRoleServer) GetRoles(ctx context.Context, _ *empty.Empty) (*proto.GetRolesResponse, error) { + var connectors []*types.RoleV5 + for _, conn := range m.roles { + connectors = append(connectors, conn) + } + return &proto.GetRolesResponse{ + Roles: connectors, + }, nil +} + +func (m *mockRoleServer) UpsertRole(ctx context.Context, role *types.RoleV5) (*empty.Empty, error) { + m.roles[role.Metadata.Name] = role + return &empty.Empty{}, nil +} + +func (m *mockRoleServer) GetCurrentUserRoles(_ *empty.Empty, stream proto.AuthService_GetCurrentUserRolesServer) error { + for _, role := range m.roles { + if err := stream.Send(role); err != nil { + return trace.Wrap(err) + } + } + + return nil +} + +// Test that client will perform properly with an old server +// DELETE IN 13.0.0 +func TestSetRoleRequireSessionMFABackwardsCompatibility(t *testing.T) { + ctx := context.Background() + addr := startMockRoleServer(t) + + // Create client + clt, err := New(ctx, Config{ + Addrs: []string{addr}, + Credentials: []Credentials{ + &mockInsecureTLSCredentials{}, // TODO(Joerger) replace insecure credentials + }, + DialOpts: []grpc.DialOption{ + grpc.WithTransportCredentials(insecure.NewCredentials()), // TODO(Joerger) remove insecure dial option + }, + }) + require.NoError(t, err) + + role := &types.RoleV5{ + Metadata: types.Metadata{ + Name: "one", + }, + } + + // UpsertRole should set "RequireSessionMFA" on the provided role if "RequireMFAType" is set + role.Spec.Options.RequireMFAType = types.RequireMFAType_SESSION + role.Spec.Options.RequireSessionMFA = false + err = clt.UpsertRole(ctx, role) + require.NoError(t, err) + require.True(t, role.GetOptions().RequireSessionMFA) + + // GetRole should set "RequireMFAType" on the received role if empty + role.Spec.Options.RequireMFAType = 0 + role.Spec.Options.RequireSessionMFA = true + roleResp, err := clt.GetRole(ctx, role.GetName()) + require.NoError(t, err) + require.Equal(t, types.RequireMFAType_SESSION, roleResp.GetOptions().RequireMFAType) + + // GetRoles should set "RequireMFAType" on the received roles if empty + role.Spec.Options.RequireMFAType = 0 + role.Spec.Options.RequireSessionMFA = true + rolesResp, err := clt.GetRoles(ctx) + require.NoError(t, err) + require.Equal(t, 1, len(rolesResp)) + require.Equal(t, types.RequireMFAType_SESSION, rolesResp[0].GetOptions().RequireMFAType) + + // GetCurrentUserRoles should set "RequireMFAType" on the received roles if empty + role.Spec.Options.RequireMFAType = 0 + role.Spec.Options.RequireSessionMFA = true + rolesResp, err = clt.GetCurrentUserRoles(ctx) + require.NoError(t, err) + require.Equal(t, 1, len(rolesResp)) + require.Equal(t, types.RequireMFAType_SESSION, rolesResp[0].GetOptions().RequireMFAType) +} + +type mockAuthPreferenceServer struct { + *mockServer + pref *types.AuthPreferenceV2 +} + +func newMockAuthPreferenceServer() *mockAuthPreferenceServer { + m := &mockAuthPreferenceServer{ + mockServer: &mockServer{ + grpc: grpc.NewServer(), + UnimplementedAuthServiceServer: &proto.UnimplementedAuthServiceServer{}, + }, + } + proto.RegisterAuthServiceServer(m.grpc, m) + return m +} + +func startMockAuthPreferenceServer(t *testing.T) string { + l, err := net.Listen("tcp", "") + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, l.Close()) }) + go newMockAuthPreferenceServer().grpc.Serve(l) + return l.Addr().String() +} + +func (m *mockAuthPreferenceServer) GetAuthPreference(ctx context.Context, _ *empty.Empty) (*types.AuthPreferenceV2, error) { + if m.pref == nil { + return nil, trace.NotFound("not found") + } + return m.pref, nil +} + +func (m *mockAuthPreferenceServer) SetAuthPreference(ctx context.Context, pref *types.AuthPreferenceV2) (*empty.Empty, error) { + m.pref = pref + return &empty.Empty{}, nil +} + +// Test that client will perform properly with an old server +// DELETE IN 13.0.0 +func TestSetAuthPreferenceRequireSessionMFABackwardsCompatibility(t *testing.T) { + ctx := context.Background() + addr := startMockAuthPreferenceServer(t) + + // Create client + clt, err := New(ctx, Config{ + Addrs: []string{addr}, + Credentials: []Credentials{ + &mockInsecureTLSCredentials{}, // TODO(Joerger) replace insecure credentials + }, + DialOpts: []grpc.DialOption{ + grpc.WithTransportCredentials(insecure.NewCredentials()), // TODO(Joerger) remove insecure dial option + }, + }) + require.NoError(t, err) + + pref := &types.AuthPreferenceV2{ + Metadata: types.Metadata{ + Name: "one", + }, + } + + // SetAuthPreference should set "RequireSessionMFA" on the provided auth pref if "RequireMFAType" is set + pref.Spec.RequireMFAType = types.RequireMFAType_SESSION + pref.Spec.RequireSessionMFA = false + err = clt.SetAuthPreference(ctx, pref) + require.NoError(t, err) + require.True(t, pref.Spec.RequireSessionMFA) + + // GetAuthPreference should set "RequireMFAType" on the received auth pref if empty + pref.Spec.RequireMFAType = 0 + pref.Spec.RequireSessionMFA = true + prefResp, err := clt.GetAuthPreference(ctx) + require.NoError(t, err) + require.Equal(t, types.RequireMFAType_SESSION, prefResp.GetRequireMFAType()) +} diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 90cfdb1799874..fbe4bcdac773f 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -13718,6 +13718,7 @@ type AuthServiceClient interface { DeleteAllDatabases(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) // GetWindowsDesktopServices returns all registered Windows desktop services. GetWindowsDesktopServices(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetWindowsDesktopServicesResponse, error) + // TODO(zmb3): Document me. GetWindowsDesktopService(ctx context.Context, in *GetWindowsDesktopServiceRequest, opts ...grpc.CallOption) (*GetWindowsDesktopServiceResponse, error) // UpsertWindowsDesktopService registers a new Windows desktop service. UpsertWindowsDesktopService(ctx context.Context, in *types.WindowsDesktopServiceV3, opts ...grpc.CallOption) (*types.KeepAlive, error) @@ -16380,6 +16381,7 @@ type AuthServiceServer interface { DeleteAllDatabases(context.Context, *emptypb.Empty) (*emptypb.Empty, error) // GetWindowsDesktopServices returns all registered Windows desktop services. GetWindowsDesktopServices(context.Context, *emptypb.Empty) (*GetWindowsDesktopServicesResponse, error) + // TODO(zmb3): Document me. GetWindowsDesktopService(context.Context, *GetWindowsDesktopServiceRequest) (*GetWindowsDesktopServiceResponse, error) // UpsertWindowsDesktopService registers a new Windows desktop service. UpsertWindowsDesktopService(context.Context, *types.WindowsDesktopServiceV3) (*types.KeepAlive, error) diff --git a/api/client/proto/joinservice.pb.go b/api/client/proto/joinservice.pb.go index 39649a5b1b8ba..dcf6fed6475d7 100644 --- a/api/client/proto/joinservice.pb.go +++ b/api/client/proto/joinservice.pb.go @@ -27,6 +27,7 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// TODO(nklaassen): Document me. type RegisterUsingIAMMethodRequest struct { // RegisterUsingTokenRequest holds registration parameters common to all // join methods. diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 311bcbcd1b36d..ff1a2f91bd136 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -1330,7 +1330,9 @@ message AuthPreferenceSpecV2 { // RequireSessionMFA causes all sessions in this cluster to require MFA // checks. - bool RequireSessionMFA = 5 [(gogoproto.jsontag) = "require_session_mfa,omitempty"]; + // + // DELETE IN 13.0.0 in favor of RequireMFAType + bool RequireSessionMFA = 5 [(gogoproto.jsontag) = "-"]; // DisconnectExpiredCert provides disconnect expired certificate setting - // if true, connections with expired client certificates will get disconnected @@ -1367,6 +1369,9 @@ message AuthPreferenceSpecV2 { (gogoproto.jsontag) = "allow_passwordless,omitempty", (gogoproto.customtype) = "BoolOption" ]; + + // RequireMFAType is the type of MFA requirement enforced for this cluster. + RequireMFAType RequireMFAType = 12 [(gogoproto.jsontag) = "require_session_mfa,omitempty"]; } // U2F defines settings for U2F device. @@ -1961,7 +1966,9 @@ message RoleOptions { // RequireSessionMFA specifies whether a user is required to do an MFA // check for every session. - bool RequireSessionMFA = 13 [(gogoproto.jsontag) = "require_session_mfa,omitempty"]; + // + // DELETE IN 13.0.0 in favor of RequireMFAType + bool RequireSessionMFA = 13 [(gogoproto.jsontag) = "-"]; // Lock specifies the locking mode (strict|best_effort) to be applied with // the role. @@ -2019,6 +2026,9 @@ message RoleOptions { (gogoproto.jsontag) = "ssh_file_copy", (gogoproto.customtype) = "BoolOption" ]; + + // RequireMFAType is the type of MFA requirement enforced for this user. + RequireMFAType RequireMFAType = 23 [(gogoproto.jsontag) = "require_session_mfa,omitempty"]; } message RecordSession { @@ -4229,3 +4239,20 @@ message GetClusterAlertsRequest { // Labels is an optional label selector. map Labels = 3; } + +// RequireMFAType is a type of MFA requirement enforced outside of login, +// such as per-session MFA or per-request PIV touch. +enum RequireMFAType { + // OFF means additional MFA enforcement is not enabled. + OFF = 0; + // SESSION means MFA is required to begin server sessions. + SESSION = 1; + // SESSION_AND_HARDWARE_KEY means MFA is required to begin server sessions, + // and login sessions must use a private key backed by a hardware key. + SESSION_AND_HARDWARE_KEY = 2; + // HARDWARE_KEY_TOUCH means login sessions must use a hardware private key that + // requires touch to be used. This touch requirement applies to all API requests + // rather than only session requests. This touch is different from MFA, so to prevent + // requiring double touch on session requests, normal Session MFA is disabled. + HARDWARE_KEY_TOUCH = 3; +} diff --git a/api/types/authentication.go b/api/types/authentication.go index f61ed7468a351..a26dddf9d1e27 100644 --- a/api/types/authentication.go +++ b/api/types/authentication.go @@ -18,15 +18,17 @@ package types import ( "bytes" + "encoding/json" "fmt" "net/url" "strings" "time" "github.com/gogo/protobuf/jsonpb" + "github.com/gravitational/trace" + "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/utils/tlsutils" - "github.com/gravitational/trace" log "github.com/sirupsen/logrus" ) @@ -86,9 +88,8 @@ type AuthPreference interface { // SetAllowPasswordless sets the value of the allow passwordless setting. SetAllowPasswordless(b bool) - // GetRequireSessionMFA returns true when all sessions in this cluster - // require an MFA check. - GetRequireSessionMFA() bool + // GetRequireMFAType returns the type of MFA requirement enforced for this cluster. + GetRequireMFAType() RequireMFAType // GetDisconnectExpiredCert returns disconnect expired certificate setting GetDisconnectExpiredCert() bool @@ -337,10 +338,9 @@ func (c *AuthPreferenceV2) SetAllowPasswordless(b bool) { c.Spec.AllowPasswordless = NewBoolOption(b) } -// GetRequireSessionMFA returns true when all sessions in this cluster require -// an MFA check. -func (c *AuthPreferenceV2) GetRequireSessionMFA() bool { - return c.Spec.RequireSessionMFA +// GetRequireMFAType returns the type of MFA requirement enforced for this cluster. +func (c *AuthPreferenceV2) GetRequireMFAType() RequireMFAType { + return c.Spec.RequireMFAType } // GetDisconnectExpiredCert returns disconnect expired certificate setting @@ -397,6 +397,9 @@ func (c *AuthPreferenceV2) CheckAndSetDefaults() error { return trace.Wrap(err) } + // DELETE IN 13.0.0 + c.CheckSetRequireSessionMFA() + if c.Spec.Type == "" { c.Spec.Type = constants.Local } @@ -518,6 +521,16 @@ func (c *AuthPreferenceV2) CheckAndSetDefaults() error { return nil } +// RequireSessionMFA must be checked/set when communicating with an old server or client. +// DELETE IN 13.0.0 +func (c *AuthPreferenceV2) CheckSetRequireSessionMFA() { + if c.Spec.RequireMFAType != RequireMFAType_OFF { + c.Spec.RequireSessionMFA = c.Spec.RequireMFAType.IsSessionMFARequired() + } else if c.Spec.RequireSessionMFA { + c.Spec.RequireMFAType = RequireMFAType_SESSION + } +} + // String represents a human readable version of authentication settings. func (c *AuthPreferenceV2) String() string { return fmt.Sprintf("AuthPreference(Type=%q,SecondFactor=%q)", c.Spec.Type, c.Spec.SecondFactor) @@ -701,3 +714,128 @@ func (d *MFADevice) MarshalJSON() ([]byte, error) { func (d *MFADevice) UnmarshalJSON(buf []byte) error { return jsonpb.Unmarshal(bytes.NewReader(buf), d) } + +// type RequireMFATypeString string + +// const ( +// // RequireMFAOff means MFA is *not* required to begin server sessions. +// RequireMFAOff RequireMFATypeString = "off" +// // RequireMFASession means MFA is required to begin server sessions. +// RequireMFASession RequireMFATypeString = "session_mfa" +// // RequireMFASessionAndHardwareKey means MFA is required to begin server sessions, +// // and login sessions must use a private key backed by a hardware key. +// RequireMFASessionAndHardwareKey RequireMFATypeString = "hardware_key" +// // RequireMFAHardwareKeyTouch means login sessions must use a hardware private key that +// // requires touch to be used. This touch requirement applies to all API requests +// // rather than only session requests. This touch is different from MFA, so to prevent +// // requiring double touch on session requests, normal Session MFA is disabled. +// RequireMFAHardwareKeyTouch RequireMFATypeString = "hardware_key_touch" +// ) + +// IsSessionMFARequired returns whether this RequireMFAType requires per-session MFA. +func (r RequireMFAType) IsSessionMFARequired() bool { + return r == RequireMFAType_SESSION || r == RequireMFAType_SESSION_AND_HARDWARE_KEY +} + +// MarshalJSON marshals RequireMFAType to boolean or string. +func (r *RequireMFAType) MarshalYAML() (interface{}, error) { + val, err := r.encode() + if err != nil { + return nil, trace.Wrap(err) + } + return val, nil +} + +// UnmarshalYAML supports parsing RequireMFAType from boolean or alias. +func (r *RequireMFAType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var val interface{} + err := unmarshal(&val) + if err != nil { + return trace.Wrap(err) + } + + err = r.decode(val) + return trace.Wrap(err) +} + +// MarshalJSON marshals RequireMFAType to boolean or string. +func (r *RequireMFAType) MarshalJSON() ([]byte, error) { + val, err := r.encode() + if err != nil { + return nil, trace.Wrap(err) + } + out, err := json.Marshal(val) + return out, trace.Wrap(err) +} + +// UnmarshalJSON supports parsing RequireMFAType from boolean or alias. +func (r *RequireMFAType) UnmarshalJSON(data []byte) error { + var val interface{} + err := json.Unmarshal(data, &val) + if err != nil { + return trace.Wrap(err) + } + + err = r.decode(val) + return trace.Wrap(err) +} + +const ( + RequireMFATypeHardwareKeyString = "hardware_key" + RequireMFATypeHardwareKeyTouchString = "hardware_key_touch" +) + +// encode RequireMFAType into a string or boolean. This is necessary for +// backwards compatibility with the json/yaml tag "require_session_mfa", +// which used to be a boolean. +func (r *RequireMFAType) encode() (interface{}, error) { + switch *r { + case RequireMFAType_OFF: + return false, nil + case RequireMFAType_SESSION: + return true, nil + case RequireMFAType_SESSION_AND_HARDWARE_KEY: + return RequireMFATypeHardwareKeyString, nil + case RequireMFAType_HARDWARE_KEY_TOUCH: + return RequireMFATypeHardwareKeyTouchString, nil + default: + return nil, trace.BadParameter("RequireMFAType invalid value %v", *r) + } +} + +// decode RequireMFAType from a string or boolean. This is necessary for +// backwards compatibility with the json/yaml tag "require_session_mfa", +// which used to be a boolean. +func (r *RequireMFAType) decode(val interface{}) error { + switch v := val.(type) { + case string: + switch v { + case RequireMFATypeHardwareKeyString: + *r = RequireMFAType_SESSION_AND_HARDWARE_KEY + case RequireMFATypeHardwareKeyTouchString: + *r = RequireMFAType_HARDWARE_KEY_TOUCH + case "": + // default to off + *r = RequireMFAType_OFF + default: + // try parsing as a boolean + switch strings.ToLower(v) { + case "yes", "yeah", "y", "true", "1", "on": + *r = RequireMFAType_SESSION + case "no", "nope", "n", "false", "0", "off": + *r = RequireMFAType_OFF + default: + return trace.BadParameter("RequireMFAType invalid value %v", val) + } + } + case bool: + if v { + *r = RequireMFAType_SESSION + } else { + *r = RequireMFAType_OFF + } + default: + return trace.BadParameter("RequireMFAType invalid type %T", val) + } + return nil +} diff --git a/api/types/role.go b/api/types/role.go index a24dac52f6b11..cac96b29c2587 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -673,6 +673,9 @@ func (r *RoleV5) CheckAndSetDefaults() error { return trace.Wrap(err) } + // DELETE IN 13.0.0 + r.CheckSetRequireSessionMFA() + // Make sure all fields have defaults. if r.Spec.Options.CertificateFormat == "" { r.Spec.Options.CertificateFormat = constants.CertificateFormatStandard @@ -823,6 +826,16 @@ func (r *RoleV5) CheckAndSetDefaults() error { return nil } +// RequireSessionMFA must be checked/set when communicating with an old server or client. +// DELETE IN 13.0.0 +func (r *RoleV5) CheckSetRequireSessionMFA() { + if r.Spec.Options.RequireMFAType != RequireMFAType_OFF { + r.Spec.Options.RequireSessionMFA = r.Spec.Options.RequireMFAType.IsSessionMFARequired() + } else if r.Spec.Options.RequireSessionMFA { + r.Spec.Options.RequireMFAType = RequireMFAType_SESSION + } +} + // String returns the human readable representation of a role. func (r *RoleV5) String() string { return fmt.Sprintf("Role(Name=%v,Options=%v,Allow=%+v,Deny=%+v)", diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 8a9dba28b5a30..5d659c1858950 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -340,6 +340,47 @@ func (AlertSeverity) EnumDescriptor() ([]byte, []int) { return fileDescriptor_9198ee693835762e, []int{9} } +// RequireMFAType is a type of MFA requirement enforced outside of login, +// such as per-session MFA or per-request PIV touch. +type RequireMFAType int32 + +const ( + // OFF means additional MFA enforcement is not enabled. + RequireMFAType_OFF RequireMFAType = 0 + // SESSION means MFA is required to begin server sessions. + RequireMFAType_SESSION RequireMFAType = 1 + // SESSION_AND_HARDWARE_KEY means MFA is required to begin server sessions, + // and login sessions must use a private key backed by a hardware key. + RequireMFAType_SESSION_AND_HARDWARE_KEY RequireMFAType = 2 + // HARDWARE_KEY_TOUCH means login sessions must use a hardware private key that + // requires touch to be used. This touch requirement applies to all API requests + // rather than only session requests. This touch is different from MFA, so to prevent + // requiring double touch on session requests, normal Session MFA is disabled. + RequireMFAType_HARDWARE_KEY_TOUCH RequireMFAType = 3 +) + +var RequireMFAType_name = map[int32]string{ + 0: "OFF", + 1: "SESSION", + 2: "SESSION_AND_HARDWARE_KEY", + 3: "HARDWARE_KEY_TOUCH", +} + +var RequireMFAType_value = map[string]int32{ + "OFF": 0, + "SESSION": 1, + "SESSION_AND_HARDWARE_KEY": 2, + "HARDWARE_KEY_TOUCH": 3, +} + +func (x RequireMFAType) String() string { + return proto.EnumName(RequireMFAType_name, int32(x)) +} + +func (RequireMFAType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{10} +} + // Type is the type of keep alive, used by servers. At the moment only // "node", "app" and "database" are supported. type KeepAlive_KeepAliveType int32 @@ -3632,7 +3673,9 @@ type AuthPreferenceSpecV2 struct { U2F *U2F `protobuf:"bytes,4,opt,name=U2F,proto3" json:"u2f,omitempty"` // RequireSessionMFA causes all sessions in this cluster to require MFA // checks. - RequireSessionMFA bool `protobuf:"varint,5,opt,name=RequireSessionMFA,proto3" json:"require_session_mfa,omitempty"` + // + // DELETE IN 13.0.0 in favor of RequireMFAType + RequireSessionMFA bool `protobuf:"varint,5,opt,name=RequireSessionMFA,proto3" json:"-"` // DisconnectExpiredCert provides disconnect expired certificate setting - // if true, connections with expired client certificates will get disconnected DisconnectExpiredCert *BoolOption `protobuf:"bytes,6,opt,name=DisconnectExpiredCert,proto3,customtype=BoolOption" json:"disconnect_expired_cert,omitempty"` @@ -3647,10 +3690,12 @@ type AuthPreferenceSpecV2 struct { // Passwordless requires Webauthn to work. // Defaults to true if the Webauthn is configured, defaults to false // otherwise. - AllowPasswordless *BoolOption `protobuf:"bytes,11,opt,name=AllowPasswordless,proto3,customtype=BoolOption" json:"allow_passwordless,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AllowPasswordless *BoolOption `protobuf:"bytes,11,opt,name=AllowPasswordless,proto3,customtype=BoolOption" json:"allow_passwordless,omitempty"` + // RequireMFAType is the type of MFA requirement enforced for this cluster. + RequireMFAType RequireMFAType `protobuf:"varint,12,opt,name=RequireMFAType,proto3,enum=types.RequireMFAType" json:"require_session_mfa,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AuthPreferenceSpecV2) Reset() { *m = AuthPreferenceSpecV2{} } @@ -5015,7 +5060,9 @@ type RoleOptions struct { RequestPrompt string `protobuf:"bytes,12,opt,name=RequestPrompt,proto3" json:"request_prompt,omitempty"` // RequireSessionMFA specifies whether a user is required to do an MFA // check for every session. - RequireSessionMFA bool `protobuf:"varint,13,opt,name=RequireSessionMFA,proto3" json:"require_session_mfa,omitempty"` + // + // DELETE IN 13.0.0 in favor of RequireMFAType + RequireSessionMFA bool `protobuf:"varint,13,opt,name=RequireSessionMFA,proto3" json:"-"` // Lock specifies the locking mode (strict|best_effort) to be applied with // the role. Lock github_com_gravitational_teleport_api_constants.LockingMode `protobuf:"bytes,14,opt,name=Lock,proto3,casttype=github.com/gravitational/teleport/api/constants.LockingMode" json:"lock,omitempty"` @@ -5041,10 +5088,12 @@ type RoleOptions struct { PinSourceIP Bool `protobuf:"varint,21,opt,name=PinSourceIP,proto3,casttype=Bool" json:"pin_source_ip"` // SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed // over an SSH session. It defaults to true unless explicitly set to false. - SSHFileCopy *BoolOption `protobuf:"bytes,22,opt,name=SSHFileCopy,proto3,customtype=BoolOption" json:"ssh_file_copy"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + SSHFileCopy *BoolOption `protobuf:"bytes,22,opt,name=SSHFileCopy,proto3,customtype=BoolOption" json:"ssh_file_copy"` + // RequireMFAType is the type of MFA requirement enforced for this user. + RequireMFAType RequireMFAType `protobuf:"varint,23,opt,name=RequireMFAType,proto3,enum=types.RequireMFAType" json:"require_session_mfa,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RoleOptions) Reset() { *m = RoleOptions{} } @@ -10614,6 +10663,7 @@ func init() { proto.RegisterEnum("types.CertExtensionType", CertExtensionType_name, CertExtensionType_value) proto.RegisterEnum("types.SessionState", SessionState_name, SessionState_value) proto.RegisterEnum("types.AlertSeverity", AlertSeverity_name, AlertSeverity_value) + proto.RegisterEnum("types.RequireMFAType", RequireMFAType_name, RequireMFAType_value) proto.RegisterEnum("types.KeepAlive_KeepAliveType", KeepAlive_KeepAliveType_name, KeepAlive_KeepAliveType_value) proto.RegisterEnum("types.CertAuthoritySpecV2_SigningAlgType", CertAuthoritySpecV2_SigningAlgType_name, CertAuthoritySpecV2_SigningAlgType_value) proto.RegisterEnum("types.ClusterAuditConfigSpecV2_FIPSEndpointState", ClusterAuditConfigSpecV2_FIPSEndpointState_name, ClusterAuditConfigSpecV2_FIPSEndpointState_value) @@ -10838,936 +10888,941 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 14851 bytes of a gzipped FileDescriptorProto + // 14935 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x6c, 0x1c, 0x49, 0x76, 0x18, 0xae, 0x9e, 0x19, 0x92, 0xc3, 0xc7, 0x21, 0x39, 0x2c, 0x52, 0x12, 0xa5, 0xd5, 0x2e, 0xb5, 0xbd, 0xbb, 0x5a, 0xad, 0x76, 0x57, 0x3a, 0x51, 0xb7, 0x3a, 0xef, 0xed, 0xd7, 0xcd, 0x70, - 0x28, 0x91, 0x2b, 0x8a, 0xe4, 0xf6, 0xf0, 0xe3, 0xd6, 0xf7, 0xd1, 0xd7, 0x9c, 0x29, 0x92, 0xbd, - 0x9c, 0x99, 0x9e, 0xeb, 0xee, 0x91, 0x44, 0x9f, 0x0d, 0xdb, 0xf0, 0xef, 0x7c, 0xbf, 0x83, 0xe1, - 0x3b, 0xdf, 0x0f, 0xe7, 0xaf, 0x1f, 0xfc, 0x83, 0xfd, 0x33, 0xe2, 0x24, 0x4e, 0x62, 0x23, 0xb1, - 0x03, 0x04, 0x41, 0x80, 0x24, 0x46, 0x02, 0xe7, 0xf2, 0x69, 0x03, 0xf9, 0x2b, 0x97, 0x84, 0x89, - 0xef, 0x8c, 0xfc, 0xa1, 0xc0, 0x40, 0x00, 0x03, 0x01, 0x7c, 0xb6, 0x81, 0xa0, 0x5e, 0x55, 0x75, - 0x57, 0xf5, 0xf4, 0x0c, 0x87, 0x2b, 0x2d, 0x62, 0x2d, 0xf2, 0x8f, 0xc4, 0x79, 0xf5, 0xde, 0xab, - 0x8f, 0x7e, 0xf5, 0xea, 0xd5, 0xab, 0x57, 0xaf, 0xe0, 0xd9, 0x90, 0x36, 0x68, 0xdb, 0xf3, 0xc3, - 0x6b, 0x0d, 0xba, 0xe7, 0xd4, 0x0e, 0xaf, 0x85, 0x87, 0x6d, 0x1a, 0xf0, 0x7f, 0xaf, 0xb6, 0x7d, - 0x2f, 0xf4, 0xc8, 0x10, 0xfe, 0x38, 0x3f, 0xb3, 0xe7, 0xed, 0x79, 0x08, 0xb9, 0xc6, 0xfe, 0xe2, - 0x85, 0xe7, 0xe7, 0xf6, 0x3c, 0x6f, 0xaf, 0x41, 0xaf, 0xe1, 0xaf, 0x9d, 0xce, 0xee, 0xb5, 0xd0, - 0x6d, 0xd2, 0x20, 0x74, 0x9a, 0x6d, 0x81, 0xf0, 0x6a, 0x7a, 0x05, 0xf7, 0x7d, 0xa7, 0xdd, 0xa6, - 0x7e, 0xfc, 0x07, 0x47, 0x37, 0xff, 0xff, 0x2c, 0x8c, 0xde, 0xa1, 0xb4, 0x5d, 0x6a, 0xb8, 0xf7, - 0x28, 0x79, 0x0e, 0x72, 0xab, 0x4e, 0x93, 0xce, 0x1a, 0x17, 0x8d, 0xcb, 0xa3, 0xe5, 0xc9, 0x87, - 0x47, 0x73, 0x63, 0x01, 0xf5, 0xef, 0x51, 0xdf, 0x6e, 0x39, 0x4d, 0x6a, 0x61, 0x21, 0x79, 0x19, - 0x46, 0xd9, 0xff, 0x41, 0xdb, 0xa9, 0xd1, 0xd9, 0x0c, 0x62, 0x8e, 0x3f, 0x3c, 0x9a, 0x1b, 0x6d, - 0x49, 0xa0, 0x15, 0x97, 0x93, 0x4b, 0x30, 0xb2, 0x42, 0x9d, 0x80, 0x2e, 0x57, 0x66, 0xb3, 0x17, - 0x8d, 0xcb, 0xd9, 0x72, 0xe1, 0xe1, 0xd1, 0x5c, 0xbe, 0xc1, 0x40, 0xb6, 0x5b, 0xb7, 0x64, 0x21, - 0x59, 0x86, 0x91, 0xc5, 0x07, 0x6d, 0xd7, 0xa7, 0xc1, 0x6c, 0xee, 0xa2, 0x71, 0x79, 0x6c, 0xfe, - 0xfc, 0x55, 0xde, 0xd3, 0xab, 0xb2, 0xa7, 0x57, 0x37, 0x64, 0x4f, 0xcb, 0xd3, 0xdf, 0x39, 0x9a, - 0x3b, 0xf5, 0xf0, 0x68, 0x6e, 0x84, 0x72, 0x92, 0x9f, 0xfb, 0x2f, 0x73, 0x86, 0x25, 0xe9, 0xc9, - 0x9b, 0x90, 0xdb, 0x38, 0x6c, 0xd3, 0xd9, 0xd1, 0x8b, 0xc6, 0xe5, 0x89, 0xf9, 0x67, 0xae, 0xf2, - 0xb1, 0x8d, 0x3a, 0x19, 0xff, 0xc5, 0xb0, 0xca, 0xf9, 0x87, 0x47, 0x73, 0x39, 0x86, 0x62, 0x21, - 0x15, 0x79, 0x15, 0x86, 0x97, 0xbc, 0x20, 0x5c, 0xae, 0xcc, 0x02, 0x76, 0xed, 0xf4, 0xc3, 0xa3, - 0xb9, 0xa9, 0x7d, 0x2f, 0x08, 0x6d, 0xb7, 0xfe, 0x8a, 0xd7, 0x74, 0x43, 0xda, 0x6c, 0x87, 0x87, - 0x96, 0x40, 0x32, 0x77, 0x60, 0x5c, 0xe3, 0x47, 0xc6, 0x60, 0x64, 0x73, 0xf5, 0xce, 0xea, 0xda, - 0xf6, 0x6a, 0xf1, 0x14, 0xc9, 0x43, 0x6e, 0x75, 0xad, 0xb2, 0x58, 0x34, 0xc8, 0x08, 0x64, 0x4b, - 0xeb, 0xeb, 0xc5, 0x0c, 0x29, 0x40, 0xbe, 0x52, 0xda, 0x28, 0x95, 0x4b, 0xd5, 0xc5, 0x62, 0x96, - 0x4c, 0xc3, 0xe4, 0xf6, 0xf2, 0x6a, 0x65, 0x6d, 0xbb, 0x6a, 0x57, 0x16, 0xab, 0x77, 0x36, 0xd6, - 0xd6, 0x8b, 0x39, 0x32, 0x01, 0x70, 0x67, 0xb3, 0xbc, 0x68, 0xad, 0x2e, 0x6e, 0x2c, 0x56, 0x8b, - 0x43, 0xe6, 0xd7, 0xb2, 0x90, 0xbf, 0x4b, 0x43, 0xa7, 0xee, 0x84, 0x0e, 0xb9, 0xa0, 0x7d, 0x22, - 0x6c, 0xbd, 0xf2, 0x6d, 0x9e, 0xeb, 0xfe, 0x36, 0x43, 0x0f, 0x8f, 0xe6, 0x8c, 0x57, 0xd5, 0x6f, - 0xf2, 0x06, 0x8c, 0x55, 0x68, 0x50, 0xf3, 0xdd, 0x76, 0xe8, 0x7a, 0x2d, 0xfc, 0x2e, 0xa3, 0xe5, - 0x73, 0x0f, 0x8f, 0xe6, 0x4e, 0xd7, 0x63, 0xb0, 0xd2, 0x57, 0x15, 0x9b, 0x2c, 0xc3, 0xf0, 0x8a, - 0xb3, 0x43, 0x1b, 0xc1, 0xec, 0xd0, 0xc5, 0xec, 0xe5, 0xb1, 0xf9, 0xa7, 0xc4, 0xf8, 0xca, 0x06, - 0x5e, 0xe5, 0xa5, 0x8b, 0xad, 0xd0, 0x3f, 0x2c, 0xcf, 0x3c, 0x3c, 0x9a, 0x2b, 0x36, 0x10, 0xa0, - 0x8e, 0x1d, 0x47, 0x21, 0xd5, 0xf8, 0x9b, 0x0f, 0x1f, 0xfb, 0xcd, 0x9f, 0xfe, 0xce, 0xd1, 0x9c, - 0xc1, 0xbe, 0x85, 0xf8, 0xe6, 0x31, 0x3f, 0xfd, 0xeb, 0x5f, 0x84, 0xcc, 0x72, 0x65, 0x76, 0x04, - 0x65, 0xad, 0xf8, 0xf0, 0x68, 0xae, 0xa0, 0x7d, 0xb6, 0xcc, 0x72, 0xe5, 0xfc, 0xeb, 0x30, 0xa6, - 0xb4, 0x91, 0x14, 0x21, 0x7b, 0x40, 0x0f, 0xf9, 0x78, 0x5a, 0xec, 0x4f, 0x32, 0x03, 0x43, 0xf7, - 0x9c, 0x46, 0x47, 0x0c, 0xa0, 0xc5, 0x7f, 0x7c, 0x3a, 0xf3, 0x43, 0x86, 0xf9, 0xff, 0xe4, 0x20, - 0x6f, 0x79, 0xa1, 0x83, 0x23, 0xf1, 0x12, 0x0c, 0x55, 0x43, 0x27, 0x94, 0x9f, 0x62, 0xfa, 0xe1, - 0xd1, 0xdc, 0x64, 0xc0, 0x00, 0x4a, 0x7d, 0x1c, 0x83, 0xa1, 0xae, 0xef, 0x3b, 0x81, 0xfc, 0x24, - 0x88, 0xda, 0x66, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x25, 0xc8, 0xdd, 0xf5, 0xea, 0x54, 0x7c, 0x15, - 0xf2, 0xf0, 0x68, 0x6e, 0xa2, 0xe9, 0xd5, 0x55, 0x44, 0x2c, 0x27, 0xaf, 0xc0, 0xe8, 0x42, 0xc7, - 0xf7, 0x69, 0x8b, 0x89, 0x6a, 0x0e, 0x91, 0x27, 0x1e, 0x1e, 0xcd, 0x41, 0x8d, 0x03, 0xd9, 0xe4, - 0x8a, 0x11, 0xd8, 0x50, 0x57, 0x43, 0xc7, 0x0f, 0x69, 0x7d, 0x76, 0x68, 0xa0, 0xa1, 0x66, 0xd3, - 0x6b, 0x2a, 0xe0, 0x24, 0xc9, 0xa1, 0x16, 0x9c, 0xc8, 0x12, 0x8c, 0xdd, 0xf6, 0x9d, 0x1a, 0x5d, - 0xa7, 0xbe, 0xeb, 0xd5, 0xf1, 0x1b, 0x66, 0xcb, 0x97, 0x1e, 0x1e, 0xcd, 0x9d, 0xd9, 0x63, 0x60, - 0xbb, 0x8d, 0xf0, 0x98, 0xfa, 0x07, 0x47, 0x73, 0xf9, 0x4a, 0xc7, 0xc7, 0xd1, 0xb3, 0x54, 0x52, - 0xf2, 0x25, 0xf6, 0x49, 0x82, 0x10, 0x87, 0x96, 0xd6, 0xf1, 0xeb, 0xf5, 0x6f, 0xa2, 0x29, 0x9a, - 0x78, 0xa6, 0xe1, 0x04, 0xa1, 0xed, 0x73, 0xba, 0x44, 0x3b, 0x55, 0x96, 0x64, 0x0d, 0xf2, 0xd5, - 0xda, 0x3e, 0xad, 0x77, 0x1a, 0x74, 0x36, 0x8f, 0xec, 0xcf, 0x0a, 0xc1, 0x95, 0xdf, 0x53, 0x16, - 0x97, 0xcf, 0x0b, 0xde, 0x24, 0x10, 0x10, 0x65, 0xec, 0x23, 0x26, 0x9f, 0xce, 0xff, 0xd2, 0xaf, - 0xcd, 0x9d, 0xfa, 0x89, 0xff, 0x74, 0xf1, 0x94, 0xf9, 0x0f, 0x32, 0x50, 0x4c, 0x32, 0x21, 0xbb, - 0x30, 0xbe, 0xd9, 0xae, 0x3b, 0x21, 0x5d, 0x68, 0xb8, 0xb4, 0x15, 0x06, 0x28, 0x24, 0xfd, 0xfb, - 0xf4, 0xbc, 0xa8, 0x77, 0xb6, 0x83, 0x84, 0x76, 0x8d, 0x53, 0x26, 0x7a, 0xa5, 0xb3, 0x8d, 0xeb, - 0xa9, 0xa2, 0x9e, 0x0e, 0x50, 0xc2, 0x4e, 0x56, 0x0f, 0xd7, 0xf0, 0x3d, 0xea, 0x11, 0x6c, 0x85, - 0x00, 0xb5, 0xea, 0x3b, 0x87, 0x28, 0x99, 0x83, 0x0b, 0x10, 0x23, 0x49, 0x11, 0x20, 0x06, 0x36, - 0xff, 0xd8, 0x80, 0x09, 0x8b, 0x06, 0x5e, 0xc7, 0xaf, 0xd1, 0x25, 0xea, 0xd4, 0xa9, 0xcf, 0xc4, - 0xff, 0x8e, 0xdb, 0xaa, 0x8b, 0x39, 0x85, 0xe2, 0x7f, 0xe0, 0xb6, 0xd4, 0x29, 0x8c, 0xe5, 0xe4, - 0x13, 0x30, 0x52, 0xed, 0xec, 0x20, 0x2a, 0x9f, 0x53, 0x67, 0xf0, 0x8b, 0x75, 0x76, 0xec, 0x04, - 0xba, 0x44, 0x23, 0xd7, 0x60, 0x64, 0x8b, 0xfa, 0x41, 0xac, 0xf1, 0x50, 0xb3, 0xdf, 0xe3, 0x20, - 0x95, 0x40, 0x60, 0x91, 0xdb, 0xb1, 0xd6, 0x15, 0x6b, 0xd2, 0x64, 0x42, 0xd7, 0xc5, 0xa2, 0xd2, - 0x14, 0x10, 0x55, 0x54, 0x24, 0x96, 0xf9, 0xad, 0x0c, 0x14, 0x2b, 0x4e, 0xe8, 0xec, 0x38, 0x81, - 0x18, 0xcf, 0xad, 0x1b, 0x4c, 0x8f, 0x2b, 0x1d, 0x45, 0x3d, 0xce, 0x5a, 0xfe, 0xa1, 0xbb, 0xf7, - 0x42, 0xb2, 0x7b, 0x63, 0x6c, 0x81, 0x14, 0xdd, 0x8b, 0x3b, 0xf5, 0xd6, 0xf1, 0x9d, 0x2a, 0x8a, - 0x4e, 0xe5, 0x65, 0xa7, 0xe2, 0xae, 0x90, 0xb7, 0x20, 0x57, 0x6d, 0xd3, 0x9a, 0x50, 0x22, 0x52, - 0xf7, 0xeb, 0x9d, 0x63, 0x08, 0x5b, 0x37, 0xca, 0x05, 0xc1, 0x26, 0x17, 0xb4, 0x69, 0xcd, 0x42, - 0x32, 0x65, 0xd2, 0xfc, 0xcb, 0x61, 0x98, 0x49, 0x23, 0x23, 0x6f, 0xe9, 0x8b, 0x13, 0x1f, 0x9e, - 0xa7, 0x7a, 0x2e, 0x4e, 0xb3, 0x86, 0xbe, 0x3c, 0x5d, 0x81, 0xfc, 0x3a, 0x13, 0xc8, 0x9a, 0xd7, - 0x10, 0x23, 0xc7, 0xb4, 0x62, 0xbe, 0x2d, 0x61, 0x86, 0x15, 0x95, 0x93, 0xa7, 0x20, 0xbb, 0x69, - 0x2d, 0x8b, 0xe1, 0x1a, 0x7d, 0x78, 0x34, 0x97, 0xed, 0xf8, 0xee, 0xac, 0x61, 0x31, 0x28, 0xb9, - 0x06, 0xc3, 0x0b, 0xa5, 0x05, 0xea, 0x87, 0x38, 0x4c, 0x85, 0xf2, 0x59, 0x26, 0x2d, 0x35, 0xc7, - 0xae, 0x51, 0x3f, 0xd4, 0xaa, 0x17, 0x68, 0xe4, 0x65, 0xc8, 0x96, 0xb6, 0xab, 0x62, 0x64, 0x40, - 0x8c, 0x4c, 0x69, 0xbb, 0x5a, 0x1e, 0x17, 0x03, 0x91, 0x75, 0xee, 0x07, 0x8c, 0x7b, 0x69, 0xbb, - 0xaa, 0x7e, 0xad, 0xe1, 0x3e, 0x5f, 0xeb, 0x32, 0xe4, 0x99, 0x9d, 0xc1, 0x16, 0x78, 0x54, 0x8a, - 0xa3, 0xdc, 0x7c, 0xda, 0x17, 0x30, 0x2b, 0x2a, 0x25, 0xcf, 0x45, 0x66, 0x4b, 0x3e, 0xe6, 0x27, - 0xcc, 0x16, 0x69, 0xac, 0x90, 0x07, 0x30, 0x5e, 0x39, 0x6c, 0x39, 0x4d, 0xb7, 0x26, 0x96, 0xf0, - 0x51, 0x5c, 0xc2, 0xaf, 0xf6, 0xf9, 0x8c, 0x57, 0x35, 0x02, 0xbe, 0xaa, 0x4b, 0xe5, 0x3b, 0x5b, - 0xe7, 0x65, 0x76, 0x72, 0x85, 0x9f, 0x35, 0x2c, 0xbd, 0x22, 0x36, 0x97, 0xa4, 0x8a, 0x44, 0xbb, - 0x2a, 0x16, 0x3b, 0x09, 0x8e, 0xe7, 0x92, 0x2f, 0x20, 0xea, 0x5c, 0x8a, 0x16, 0xdd, 0xb7, 0x20, - 0x7b, 0x7b, 0x61, 0x7d, 0x76, 0x0c, 0x79, 0x10, 0xc1, 0xe3, 0xf6, 0xc2, 0xfa, 0x42, 0xc3, 0xeb, - 0xd4, 0xab, 0xef, 0xad, 0x94, 0xcf, 0x0a, 0x36, 0xe3, 0x7b, 0xb5, 0xb6, 0xd6, 0x22, 0x46, 0x47, - 0x16, 0x21, 0x2f, 0x7b, 0x39, 0x5b, 0x40, 0x1e, 0x53, 0x89, 0xce, 0x6f, 0xdd, 0xe0, 0x73, 0xad, - 0x2e, 0x7e, 0xab, 0xad, 0x90, 0x38, 0xe4, 0x06, 0x4a, 0xd9, 0x83, 0xc3, 0xe5, 0x4a, 0x30, 0x3b, - 0x7e, 0x31, 0x7b, 0x79, 0x14, 0xc5, 0x63, 0xba, 0xcd, 0x60, 0xb6, 0x5b, 0x57, 0x8d, 0x9d, 0x08, - 0xf1, 0xfc, 0x36, 0x90, 0xee, 0xc1, 0x4c, 0x31, 0x3f, 0x5e, 0x56, 0xcd, 0x8f, 0xb1, 0xf9, 0xd3, - 0xa2, 0x81, 0x0b, 0x5e, 0xb3, 0xe9, 0xb4, 0xea, 0x48, 0xbb, 0x35, 0xaf, 0x5a, 0x25, 0x25, 0x98, - 0x88, 0x5b, 0xbf, 0xe2, 0x06, 0x21, 0xb9, 0x06, 0xa3, 0x12, 0xc2, 0x56, 0x9e, 0x6c, 0x6a, 0x3f, - 0xad, 0x18, 0xc7, 0xfc, 0xfd, 0x0c, 0x40, 0x5c, 0xf2, 0x84, 0x2a, 0xa7, 0x4f, 0x69, 0xca, 0xe9, - 0x74, 0x52, 0xaa, 0x7b, 0xaa, 0x25, 0xf2, 0x0e, 0x0c, 0x33, 0x3b, 0xad, 0x23, 0xed, 0xd0, 0xb3, - 0x49, 0x52, 0x2c, 0xdc, 0xba, 0x51, 0x9e, 0x10, 0xc4, 0xc3, 0x01, 0x42, 0x2c, 0x41, 0xa6, 0xe8, - 0xb5, 0xdf, 0x19, 0x8a, 0x3f, 0x86, 0xd0, 0x68, 0x97, 0x15, 0x95, 0x64, 0xc4, 0x93, 0x58, 0xaa, - 0x24, 0x45, 0x21, 0x9d, 0xe3, 0x0a, 0x89, 0x0f, 0xea, 0x88, 0x50, 0x48, 0x49, 0x75, 0xc4, 0x07, - 0xf0, 0x58, 0x75, 0xd4, 0x4e, 0xce, 0xf5, 0x1c, 0x8a, 0xc1, 0xe5, 0xd4, 0x51, 0x49, 0x9b, 0xe5, - 0x17, 0x8f, 0x9b, 0xe5, 0xc9, 0x39, 0x7e, 0xa3, 0x97, 0x02, 0x3c, 0x2d, 0xa7, 0xa4, 0x73, 0x5f, - 0x25, 0x47, 0x45, 0xf8, 0x06, 0x9f, 0xcf, 0xc3, 0x3d, 0xe7, 0xf3, 0xe9, 0xd4, 0xf9, 0xcc, 0x67, - 0xf3, 0x1b, 0x30, 0x54, 0xfa, 0x91, 0x8e, 0x4f, 0x85, 0xc1, 0x58, 0x90, 0x75, 0x32, 0x58, 0xa4, - 0x08, 0x26, 0x1d, 0xf6, 0x53, 0x35, 0xb4, 0xb1, 0x9c, 0xd5, 0xbc, 0xb1, 0x52, 0x15, 0xc6, 0x20, - 0x49, 0x0c, 0xcb, 0xc6, 0x8a, 0xd2, 0xec, 0x50, 0xeb, 0x35, 0xa3, 0x22, 0xd7, 0x20, 0x53, 0xaa, - 0xe0, 0x0e, 0x73, 0x6c, 0x7e, 0x54, 0x56, 0x5b, 0x29, 0xcf, 0x08, 0x92, 0x82, 0xa3, 0x6d, 0x3a, - 0x4a, 0x15, 0x52, 0x86, 0xa1, 0xbb, 0x87, 0xd5, 0xf7, 0x56, 0x84, 0xf6, 0x9b, 0x96, 0x72, 0xcd, - 0x60, 0x6b, 0xb8, 0x74, 0x05, 0x71, 0x8b, 0x9b, 0x87, 0xc1, 0x97, 0x1b, 0x6a, 0x8b, 0x11, 0xed, - 0xa3, 0x53, 0x20, 0x7f, 0x4d, 0x35, 0x50, 0x84, 0xac, 0xb3, 0x8d, 0xb0, 0x90, 0x38, 0x23, 0x36, - 0x97, 0xba, 0x24, 0x2e, 0x92, 0xb7, 0x97, 0xf8, 0xd7, 0xcf, 0x74, 0x7d, 0xfd, 0x31, 0x65, 0xf9, - 0xe3, 0xdf, 0x3c, 0x1a, 0x8b, 0xec, 0x87, 0x1e, 0x0b, 0xf2, 0x0e, 0x14, 0xee, 0x3a, 0x2d, 0x67, - 0x8f, 0xd6, 0x37, 0x03, 0x66, 0xf6, 0xe6, 0x50, 0x0b, 0x33, 0x3b, 0xe1, 0x6c, 0x93, 0xc3, 0xed, - 0x4e, 0xa0, 0x59, 0xb5, 0x96, 0x46, 0x40, 0xae, 0x4b, 0xd9, 0x19, 0x4a, 0x91, 0x1d, 0xb9, 0x64, - 0x0f, 0xa1, 0xec, 0x08, 0x89, 0x31, 0xff, 0x73, 0x16, 0xfb, 0x48, 0x5e, 0x81, 0x61, 0x8b, 0xee, - 0xc5, 0xd6, 0x09, 0xee, 0x72, 0x7d, 0x84, 0xa8, 0x03, 0xc3, 0x71, 0x70, 0xe9, 0xa3, 0xf5, 0x60, - 0xdf, 0xdd, 0x0d, 0xc5, 0xe8, 0x44, 0x4b, 0x9f, 0x00, 0x2b, 0x4b, 0x9f, 0x80, 0x68, 0x4b, 0x9f, - 0x80, 0xb1, 0xf9, 0x65, 0x55, 0xaa, 0x62, 0xd0, 0xe4, 0x08, 0x5b, 0x15, 0x45, 0x50, 0x7d, 0x6d, - 0xe5, 0x61, 0xd8, 0xe4, 0x26, 0x8c, 0x96, 0x6a, 0x35, 0xaf, 0xa3, 0x6c, 0x13, 0x67, 0x1f, 0x1e, - 0xcd, 0xcd, 0x38, 0x1c, 0xa8, 0x3b, 0x35, 0x62, 0x54, 0x52, 0x85, 0xb1, 0x45, 0xb6, 0xb7, 0x72, - 0x17, 0x9c, 0xda, 0xbe, 0x1c, 0x24, 0x39, 0x4b, 0x94, 0x92, 0xc8, 0xd6, 0x3f, 0x4d, 0x11, 0x58, - 0x63, 0x40, 0xd5, 0x77, 0xa0, 0xe0, 0x92, 0x0d, 0x18, 0xab, 0xd2, 0x9a, 0x4f, 0xc3, 0x6a, 0xe8, - 0xf9, 0x34, 0x31, 0xe9, 0x95, 0x92, 0xf2, 0x33, 0x72, 0x7b, 0x17, 0x20, 0xd0, 0x0e, 0x18, 0x54, - 0xe5, 0xaa, 0x20, 0x73, 0x3b, 0xbd, 0xe9, 0xf9, 0x87, 0x95, 0xb2, 0x50, 0x04, 0xf1, 0xaa, 0xc1, - 0xc1, 0xaa, 0x9d, 0xce, 0x20, 0xf5, 0x1d, 0xdd, 0x4e, 0xe7, 0x58, 0xe6, 0x57, 0xb4, 0xe6, 0xb1, - 0xa1, 0xbb, 0x43, 0x0f, 0xd7, 0x7d, 0xba, 0xeb, 0x3e, 0x10, 0x5f, 0x1a, 0x87, 0xee, 0x80, 0x1e, - 0xda, 0x6d, 0x84, 0xaa, 0x43, 0x17, 0xa1, 0x92, 0x4f, 0x42, 0xfe, 0xce, 0xdd, 0xea, 0x1d, 0x7a, - 0xb8, 0x5c, 0x11, 0xaa, 0x9c, 0x93, 0x35, 0x03, 0x9b, 0x91, 0x6a, 0x23, 0x1e, 0x61, 0x9a, 0xe5, - 0x58, 0x4c, 0x58, 0xcd, 0x0b, 0x8d, 0x4e, 0x10, 0x52, 0x7f, 0xb9, 0xa2, 0xd6, 0x5c, 0xe3, 0xc0, - 0xc4, 0x47, 0x8b, 0x50, 0xcd, 0xff, 0x68, 0xa0, 0x88, 0x90, 0xd7, 0x01, 0x96, 0x5b, 0x6c, 0xef, - 0x55, 0xa3, 0x11, 0x03, 0xf4, 0xef, 0xb8, 0x02, 0xaa, 0x73, 0x50, 0x90, 0xf5, 0xaa, 0x33, 0x03, - 0x57, 0xcd, 0xaa, 0x94, 0x3b, 0x39, 0xe1, 0xea, 0x13, 0x55, 0xfa, 0x02, 0x9a, 0xa8, 0x32, 0x46, - 0x26, 0x97, 0x60, 0x64, 0xb9, 0x74, 0xb7, 0xd4, 0x09, 0xf7, 0x51, 0x40, 0xf3, 0x7c, 0x79, 0x74, - 0x9d, 0xa6, 0xed, 0x74, 0xc2, 0x7d, 0x4b, 0x16, 0x9a, 0xff, 0x2a, 0xa3, 0xc9, 0x24, 0xb1, 0x80, - 0x58, 0xb4, 0xdd, 0x70, 0x6b, 0x68, 0x19, 0xde, 0xf6, 0xbd, 0x4e, 0x3b, 0xea, 0xad, 0xf9, 0xf0, - 0x68, 0xee, 0x19, 0x3f, 0x2e, 0xb5, 0xf7, 0x58, 0xb1, 0xde, 0x86, 0x14, 0x6a, 0xf2, 0x19, 0x28, - 0x30, 0xf5, 0x20, 0x7e, 0xb2, 0xdd, 0x34, 0x53, 0x2b, 0x17, 0x70, 0xb7, 0x1c, 0x50, 0x3f, 0x62, - 0xa3, 0xe9, 0x15, 0x95, 0x82, 0xd4, 0x61, 0x76, 0xc3, 0x77, 0x5a, 0x81, 0x1b, 0x2e, 0xb6, 0x6a, - 0xfe, 0x21, 0xaa, 0xb3, 0xc5, 0x96, 0xb3, 0xd3, 0xa0, 0x75, 0x1c, 0x96, 0x7c, 0xf9, 0xf2, 0xc3, - 0xa3, 0xb9, 0xe7, 0x43, 0x8e, 0x63, 0xd3, 0x08, 0xc9, 0xa6, 0x1c, 0x4b, 0xe1, 0xdc, 0x93, 0x13, - 0x53, 0x7f, 0x8b, 0xad, 0x7a, 0xdb, 0x73, 0x5b, 0x21, 0xfa, 0x3a, 0x73, 0xd1, 0x36, 0xe9, 0x2c, - 0x15, 0x70, 0x9b, 0xcd, 0x01, 0xb5, 0x99, 0x2a, 0x81, 0xf9, 0x3f, 0x8d, 0x78, 0xd6, 0x90, 0x37, - 0x61, 0x4c, 0x7c, 0x49, 0xc5, 0xb5, 0x78, 0x9e, 0xcd, 0x3f, 0xf9, 0xd9, 0xd9, 0x1e, 0x43, 0x9d, - 0x7f, 0x0a, 0x3a, 0x33, 0x07, 0x4b, 0x0b, 0x2b, 0x48, 0xa9, 0x98, 0x83, 0x4e, 0xad, 0x91, 0xa4, - 0x92, 0x68, 0x4c, 0x58, 0x36, 0x56, 0xaa, 0xfa, 0xa8, 0xa0, 0xb0, 0x84, 0x8d, 0x20, 0x65, 0x18, - 0x14, 0xe4, 0x47, 0xef, 0xf8, 0x4f, 0x18, 0x30, 0xa6, 0xd8, 0x17, 0x4c, 0xe0, 0xd7, 0x7d, 0xef, - 0x03, 0x5a, 0x0b, 0xf5, 0xb9, 0xd6, 0xe6, 0xc0, 0x84, 0xc0, 0x47, 0xa8, 0x89, 0x39, 0x96, 0x39, - 0xc1, 0x1c, 0x33, 0x3f, 0x10, 0x4b, 0x0f, 0xb9, 0xa4, 0xf9, 0x72, 0xd1, 0xd9, 0x91, 0x18, 0xb2, - 0x9c, 0x1c, 0x2f, 0x65, 0x72, 0x65, 0x4e, 0x30, 0xb9, 0xcc, 0xdf, 0x34, 0x98, 0xa5, 0x42, 0xae, - 0x01, 0xdc, 0xa1, 0x87, 0xa1, 0xb3, 0x73, 0xcb, 0x6d, 0x68, 0xee, 0xfd, 0x03, 0x84, 0xda, 0xbb, - 0x6e, 0x83, 0x5a, 0x0a, 0x0a, 0xdb, 0xe1, 0xdc, 0xf1, 0x77, 0x5e, 0x43, 0xf4, 0x4c, 0x64, 0x71, - 0x4e, 0x1f, 0xf8, 0x3b, 0xaf, 0x21, 0xb2, 0xa6, 0xc3, 0x04, 0x22, 0x31, 0x61, 0xb8, 0xe2, 0x35, - 0x1d, 0x57, 0x5a, 0xf9, 0xc0, 0x4c, 0xe5, 0x3a, 0x42, 0x2c, 0x51, 0xc2, 0x6c, 0xdc, 0xea, 0xfa, - 0xaa, 0xf8, 0x6e, 0x68, 0xe3, 0x06, 0xed, 0x96, 0xc5, 0x60, 0xe6, 0x6f, 0x19, 0x30, 0xa6, 0x18, - 0x60, 0xe4, 0x93, 0xc2, 0x15, 0x6a, 0xa0, 0x23, 0xff, 0x4c, 0xb7, 0x89, 0xc6, 0x4a, 0xf9, 0xee, - 0xa4, 0xe9, 0xd5, 0xa9, 0x70, 0x8c, 0xc6, 0x76, 0x4b, 0x66, 0x10, 0xbb, 0xe5, 0x75, 0x00, 0xbe, - 0xdf, 0xc5, 0x2f, 0xa1, 0x28, 0x2e, 0xe5, 0xe0, 0x43, 0x1d, 0xdb, 0x18, 0xd9, 0xb4, 0xa0, 0xa0, - 0xda, 0x2c, 0xa4, 0x0c, 0xe3, 0xc2, 0xbd, 0x23, 0xf6, 0x3a, 0x7c, 0x9c, 0x51, 0x7b, 0x08, 0x6e, - 0xdd, 0xee, 0x26, 0x9d, 0xc4, 0xfc, 0xc9, 0x0c, 0xe4, 0x05, 0x64, 0xfe, 0x09, 0xdd, 0x86, 0xbd, - 0xa6, 0x6d, 0xc3, 0xa6, 0xa3, 0xe5, 0x3d, 0x72, 0x2a, 0xcc, 0x1f, 0xe3, 0x1b, 0x7a, 0x1d, 0x0a, - 0x72, 0x08, 0x70, 0x37, 0xfb, 0x12, 0x8c, 0x48, 0xef, 0x26, 0xdf, 0xcb, 0x4e, 0x6a, 0x3c, 0xb7, - 0xe6, 0x2d, 0x59, 0x6e, 0xfe, 0xf9, 0x90, 0xa4, 0xe5, 0x35, 0xb1, 0x21, 0x2c, 0xd5, 0xeb, 0xbe, - 0x3a, 0x84, 0x4e, 0xbd, 0xee, 0x5b, 0x08, 0x65, 0x1f, 0x7f, 0xbd, 0xb3, 0xd3, 0x70, 0x6b, 0x88, - 0xa3, 0x4c, 0xac, 0x36, 0x42, 0x6d, 0x86, 0xaa, 0x7e, 0xfc, 0x18, 0x59, 0x73, 0xcd, 0x64, 0xfb, - 0xba, 0x66, 0xbe, 0x08, 0xa3, 0x0b, 0xcd, 0xba, 0xb6, 0x0b, 0x33, 0x53, 0x06, 0xe5, 0x6a, 0x84, - 0xc4, 0xf7, 0x5f, 0x17, 0xc4, 0x18, 0xcd, 0xd4, 0x9a, 0xf5, 0xee, 0xbd, 0x57, 0xcc, 0x52, 0xf3, - 0xad, 0x0c, 0x3d, 0x8a, 0x6f, 0xe5, 0x26, 0x8c, 0x6e, 0x06, 0x74, 0xa3, 0xd3, 0x6a, 0xd1, 0x06, - 0x1a, 0x67, 0x79, 0xae, 0x0a, 0x3b, 0x01, 0xb5, 0x43, 0x84, 0xaa, 0x0d, 0x88, 0x50, 0x55, 0xb1, - 0x1a, 0xe9, 0x23, 0x56, 0x9f, 0x84, 0x5c, 0xa9, 0xdd, 0x96, 0x4e, 0xa7, 0x68, 0x8b, 0xd0, 0x6e, - 0xa3, 0x01, 0x3d, 0xe1, 0xb4, 0xdb, 0xba, 0x0b, 0x09, 0xb1, 0x09, 0x05, 0x72, 0xa7, 0xb3, 0x43, - 0xfd, 0x16, 0x0d, 0x69, 0x20, 0x96, 0x9d, 0x60, 0x16, 0x90, 0xc7, 0xac, 0x3c, 0xdb, 0x4b, 0x22, - 0xf0, 0x05, 0xe1, 0xa0, 0xb3, 0x43, 0x6d, 0xb1, 0x82, 0xa9, 0x63, 0x97, 0xc2, 0x10, 0x3d, 0x3a, - 0x94, 0xfa, 0x28, 0x07, 0x63, 0xb1, 0xbe, 0x6b, 0x53, 0xea, 0x27, 0xa5, 0x20, 0x42, 0xd4, 0xdc, - 0x40, 0x85, 0x41, 0xdd, 0x40, 0x55, 0x98, 0xd0, 0xbf, 0xf4, 0x63, 0xd8, 0xc1, 0xbd, 0x9b, 0xcb, - 0xe7, 0x8b, 0xa3, 0xe6, 0xd7, 0x32, 0x30, 0x56, 0x6a, 0xb7, 0x9f, 0x70, 0x1f, 0xf3, 0x0f, 0x69, - 0xfa, 0xe3, 0x4c, 0x2c, 0x27, 0x27, 0x70, 0x2f, 0xff, 0x76, 0x06, 0x26, 0x13, 0x14, 0x6a, 0xeb, - 0x8d, 0x01, 0x7d, 0xae, 0x99, 0x01, 0x7d, 0xae, 0xd9, 0xde, 0x3e, 0x57, 0x75, 0x76, 0xe6, 0x1e, - 0x65, 0x76, 0xbe, 0x08, 0xd9, 0x52, 0xbb, 0x9d, 0xdc, 0xae, 0xb6, 0xdb, 0x5b, 0x37, 0xf8, 0x32, - 0xea, 0xb4, 0xdb, 0x16, 0xc3, 0xd0, 0xa4, 0x72, 0x78, 0x40, 0xa9, 0x34, 0x5f, 0x85, 0x51, 0xe4, - 0x85, 0x0a, 0xf7, 0xa2, 0x98, 0xa9, 0x5c, 0xdb, 0x6a, 0x75, 0xf1, 0x59, 0x69, 0xfe, 0xb9, 0x01, - 0x43, 0xf8, 0xfb, 0x09, 0x95, 0xb1, 0x79, 0x4d, 0xc6, 0x8a, 0x8a, 0x8c, 0x0d, 0x22, 0x5d, 0xff, - 0x2d, 0x8b, 0xa3, 0x25, 0xe4, 0x4a, 0x78, 0xed, 0x8c, 0x14, 0xaf, 0xdd, 0x23, 0xac, 0x2f, 0x07, - 0x49, 0xff, 0x5d, 0x16, 0x3f, 0xc6, 0x73, 0xc9, 0xa6, 0x3e, 0x16, 0xd7, 0xdd, 0x12, 0x90, 0xe5, - 0x56, 0x40, 0x6b, 0x1d, 0x9f, 0x56, 0x0f, 0xdc, 0xf6, 0x16, 0xf5, 0xdd, 0xdd, 0x43, 0xb1, 0x1b, - 0xc3, 0x25, 0xc0, 0x15, 0xa5, 0x76, 0x70, 0xe0, 0xb6, 0x99, 0x15, 0xe3, 0xee, 0x1e, 0x5a, 0x29, - 0x34, 0xe4, 0x1d, 0x18, 0xb1, 0xe8, 0x7d, 0xdf, 0x0d, 0xa5, 0xcf, 0x60, 0x22, 0x72, 0x76, 0x20, - 0x94, 0x9b, 0x63, 0x3e, 0xff, 0xa1, 0x7e, 0x7f, 0x51, 0x4e, 0xe6, 0xb9, 0x1f, 0x89, 0xfb, 0x06, - 0xc6, 0xe3, 0xde, 0x96, 0xb6, 0xab, 0xe5, 0xa9, 0x74, 0x27, 0xe2, 0x47, 0xe7, 0x18, 0xfb, 0xf6, - 0x10, 0x4e, 0xba, 0x63, 0x82, 0x2e, 0xfa, 0xb8, 0x6d, 0x75, 0x01, 0xc8, 0x9e, 0x44, 0x00, 0xb6, - 0xa0, 0x50, 0x65, 0x53, 0x5f, 0xf7, 0xdf, 0x5e, 0x88, 0x47, 0xe4, 0xaa, 0x5a, 0xdc, 0x2f, 0xde, - 0x42, 0xe3, 0x43, 0xec, 0xa4, 0x60, 0xf1, 0x38, 0x8e, 0xa7, 0x15, 0xc6, 0x29, 0x22, 0x15, 0xe9, - 0xa8, 0x1a, 0x1f, 0xac, 0x13, 0x0b, 0xd3, 0xf0, 0xa3, 0x09, 0xd3, 0xc8, 0x87, 0x12, 0xa6, 0x44, - 0xa4, 0x4b, 0xfe, 0x24, 0x91, 0x2e, 0xe7, 0xdf, 0x81, 0xa9, 0xae, 0x11, 0x3e, 0x49, 0xb4, 0xc8, - 0x47, 0x27, 0x96, 0x3f, 0x06, 0xca, 0x74, 0xc9, 0x5b, 0xb4, 0xee, 0xfa, 0xb4, 0x16, 0xa2, 0xba, - 0x16, 0x1a, 0xd6, 0x17, 0xb0, 0x84, 0x23, 0x11, 0x61, 0xe4, 0x6d, 0x18, 0xe1, 0xa7, 0xed, 0xdc, - 0xbf, 0x11, 0x4f, 0x33, 0x0e, 0x15, 0x21, 0x4f, 0x1c, 0x43, 0x1d, 0x55, 0x41, 0x64, 0xde, 0x86, - 0x61, 0x71, 0x5a, 0xdf, 0x7f, 0x5e, 0xcc, 0xc1, 0xd0, 0x56, 0x3c, 0x32, 0x78, 0xc2, 0xca, 0x3b, - 0x61, 0x71, 0xb8, 0xf9, 0x33, 0x06, 0x4c, 0xe8, 0xbd, 0x24, 0x57, 0x61, 0x58, 0x84, 0x93, 0x18, - 0x18, 0x4e, 0xc2, 0x7a, 0x33, 0xcc, 0x03, 0x49, 0xb4, 0xf0, 0x11, 0x81, 0xc5, 0x96, 0x0b, 0xc1, - 0x41, 0xf8, 0x6a, 0x70, 0xb9, 0x10, 0x42, 0x6a, 0xc9, 0x32, 0xb6, 0x33, 0xb5, 0x68, 0xd0, 0x69, - 0x84, 0xea, 0xce, 0xd4, 0x47, 0x88, 0x25, 0x4a, 0xcc, 0x05, 0x18, 0xe6, 0x7a, 0x86, 0xcd, 0xda, - 0xc5, 0x07, 0x21, 0xf5, 0x5b, 0x4e, 0x43, 0xf7, 0x9f, 0x51, 0x01, 0x4d, 0xec, 0xb7, 0x63, 0x64, - 0xf3, 0xc8, 0x00, 0xa8, 0x56, 0x97, 0xee, 0xd0, 0xc3, 0x75, 0xc7, 0xf5, 0xd1, 0xbb, 0x80, 0x53, - 0xfa, 0x8e, 0xf8, 0xe4, 0x05, 0xe1, 0x5d, 0xe0, 0xd3, 0xff, 0x80, 0x1e, 0x6a, 0xde, 0x05, 0x89, - 0x8a, 0x7a, 0xc3, 0x77, 0xef, 0x39, 0x21, 0x65, 0x84, 0x19, 0x24, 0xe4, 0x7a, 0x83, 0x43, 0x13, - 0x94, 0x0a, 0x32, 0xf9, 0x02, 0x4c, 0xc4, 0xbf, 0xd0, 0x47, 0x92, 0xc5, 0xfd, 0xb3, 0x14, 0x2b, - 0xbd, 0xb0, 0xfc, 0xcc, 0xc3, 0xa3, 0xb9, 0xf3, 0x0a, 0xd7, 0xa4, 0xf7, 0x24, 0xc1, 0xcc, 0xfc, - 0x75, 0x03, 0x9d, 0x37, 0xb2, 0x83, 0x97, 0x20, 0x17, 0x9d, 0x11, 0x14, 0xb8, 0x0b, 0x23, 0xb1, - 0xd1, 0xc6, 0x72, 0xf2, 0x1c, 0x64, 0xe3, 0x9e, 0xa0, 0x1e, 0xd7, 0x7b, 0xc0, 0x4a, 0xc9, 0x6d, - 0x18, 0x19, 0xa8, 0xcd, 0x28, 0xe2, 0x29, 0x6d, 0x95, 0xd4, 0xf8, 0x15, 0xde, 0xdd, 0xde, 0xf8, - 0xf8, 0x7e, 0x85, 0x6f, 0x66, 0x60, 0x92, 0x8d, 0x6b, 0xa9, 0x13, 0xee, 0x7b, 0xbe, 0x1b, 0x1e, - 0x3e, 0xb1, 0xde, 0x82, 0x37, 0x35, 0x4b, 0xec, 0xbc, 0xd4, 0x7d, 0x6a, 0xdf, 0x06, 0x72, 0x1a, - 0xfc, 0xd1, 0x08, 0x4c, 0xa7, 0x50, 0x91, 0x57, 0x44, 0x34, 0x68, 0xec, 0xda, 0xc3, 0x68, 0xcf, - 0x1f, 0x1c, 0xcd, 0x15, 0x24, 0xfa, 0x46, 0x1c, 0xfd, 0x39, 0xaf, 0x7b, 0x42, 0xf9, 0x48, 0x61, - 0x18, 0xa1, 0xea, 0x09, 0xd5, 0xfd, 0x9f, 0x25, 0x28, 0x2c, 0xec, 0xd3, 0xda, 0x81, 0xdb, 0xda, - 0xbb, 0x43, 0x0f, 0xb9, 0xa1, 0x56, 0x28, 0x3f, 0xcd, 0x76, 0xa0, 0x35, 0x01, 0x67, 0x9f, 0x54, - 0xdf, 0xdc, 0x6a, 0x24, 0xe4, 0x6d, 0x18, 0xab, 0xba, 0x7b, 0x2d, 0xc9, 0x21, 0x87, 0x1c, 0x2e, - 0xe0, 0x01, 0x08, 0x07, 0x77, 0x33, 0x50, 0x09, 0xc8, 0x4b, 0x30, 0x64, 0x79, 0x0d, 0xca, 0xd7, - 0x72, 0x11, 0x5f, 0xe8, 0x33, 0x80, 0x7a, 0x70, 0x86, 0x18, 0x64, 0x09, 0x46, 0xd8, 0x1f, 0x77, - 0x9d, 0x36, 0x6e, 0x0e, 0xe2, 0xf3, 0x17, 0x01, 0x6d, 0xbb, 0xad, 0x3d, 0x75, 0x47, 0xd2, 0xa0, - 0x76, 0xd3, 0x69, 0x6b, 0x8b, 0x2b, 0x47, 0x24, 0x5b, 0x30, 0x16, 0x2b, 0x82, 0x60, 0x76, 0x44, - 0x0b, 0x33, 0x88, 0x4b, 0xca, 0xcf, 0x0a, 0x66, 0x67, 0xc3, 0x06, 0x3f, 0x01, 0x69, 0x33, 0x7c, - 0xbd, 0x33, 0x0a, 0x23, 0x6d, 0xc7, 0x94, 0xef, 0xbd, 0x63, 0x32, 0x8e, 0xdd, 0x31, 0xd5, 0x01, - 0xc4, 0x20, 0x95, 0x1a, 0x7b, 0x22, 0x1c, 0xf8, 0xa5, 0xde, 0x02, 0x76, 0x35, 0x46, 0xc6, 0x39, - 0xc9, 0xbd, 0x80, 0x62, 0xfc, 0x9d, 0xc6, 0x9e, 0xe6, 0x05, 0x8c, 0x50, 0xd9, 0x30, 0xc4, 0xaa, - 0x46, 0x7a, 0x26, 0xe4, 0x30, 0xc4, 0x25, 0xf1, 0x30, 0x7c, 0x70, 0x3f, 0xec, 0x35, 0x0c, 0x0a, - 0x23, 0xb2, 0x0a, 0x50, 0xaa, 0x85, 0xee, 0x3d, 0x8a, 0x22, 0x31, 0xa6, 0x0d, 0xc4, 0x42, 0xe9, - 0x0e, 0x3d, 0xac, 0xd2, 0x30, 0x3e, 0x7d, 0x73, 0x10, 0x35, 0x21, 0x26, 0x96, 0xc2, 0x81, 0xb4, - 0xe1, 0x74, 0xa9, 0x5e, 0x77, 0xd9, 0xc8, 0x38, 0x8d, 0x0d, 0x9f, 0xc9, 0x6f, 0x1d, 0x59, 0x17, - 0xd2, 0x59, 0xbf, 0x24, 0x58, 0x3f, 0xeb, 0x44, 0x54, 0x76, 0xc8, 0xc9, 0x92, 0xd5, 0xa4, 0x33, - 0x36, 0xd7, 0x60, 0x42, 0x1f, 0x52, 0x3d, 0x38, 0xba, 0x00, 0x79, 0xab, 0x5a, 0xb2, 0xab, 0x4b, - 0xa5, 0xeb, 0x45, 0x83, 0x14, 0xa1, 0x20, 0x7e, 0xcd, 0xdb, 0xf3, 0xaf, 0xdd, 0x2c, 0x66, 0x34, - 0xc8, 0x6b, 0xd7, 0xe7, 0x8b, 0x59, 0xf3, 0x77, 0x0c, 0xc8, 0xcb, 0xf6, 0x91, 0x9b, 0x90, 0xad, - 0x56, 0x97, 0x12, 0xd1, 0x2d, 0xf1, 0xd2, 0xcb, 0x17, 0x99, 0x20, 0xd8, 0x57, 0x17, 0x99, 0x6a, - 0x75, 0x89, 0xd1, 0x6d, 0xac, 0x54, 0x85, 0xe5, 0x93, 0x22, 0xae, 0x53, 0x3d, 0x8e, 0xfc, 0x6f, - 0x42, 0xf6, 0xdd, 0xed, 0x0d, 0xb1, 0x0d, 0x4b, 0xf9, 0xbe, 0x48, 0xf7, 0xc1, 0x7d, 0x75, 0xe9, - 0x63, 0x04, 0xa6, 0x05, 0x63, 0xca, 0xd4, 0xe2, 0x96, 0x48, 0xd3, 0x8b, 0xc2, 0x86, 0x85, 0x25, - 0xc2, 0x20, 0x96, 0x28, 0x61, 0x86, 0xd3, 0x8a, 0x57, 0x73, 0x1a, 0xc2, 0xa4, 0x41, 0xc3, 0xa9, - 0xc1, 0x00, 0x16, 0x87, 0x9b, 0xbf, 0x67, 0x40, 0x71, 0xdd, 0xf7, 0xee, 0xb9, 0x4c, 0x03, 0x6f, - 0x78, 0x07, 0xb4, 0xb5, 0x75, 0x9d, 0xbc, 0x2a, 0x95, 0x80, 0x11, 0x6d, 0xfa, 0x87, 0x50, 0x09, - 0xfc, 0xe0, 0x68, 0x0e, 0xaa, 0x87, 0x41, 0x48, 0x9b, 0xac, 0x5c, 0x2a, 0x02, 0x25, 0xfa, 0x3a, - 0x33, 0x78, 0x44, 0xe7, 0x31, 0xd1, 0xd7, 0x73, 0x30, 0x84, 0xcd, 0x51, 0x82, 0xea, 0x86, 0x42, - 0x06, 0xb0, 0x38, 0x5c, 0x51, 0xd8, 0xdf, 0xca, 0x74, 0xf5, 0x61, 0xfe, 0x63, 0x15, 0x15, 0xa9, - 0x77, 0x6e, 0xa0, 0x45, 0xec, 0x7d, 0x98, 0x49, 0x0e, 0x09, 0x3a, 0x64, 0x4a, 0x30, 0xa9, 0xc3, - 0xa5, 0x6f, 0xe6, 0x6c, 0x6a, 0x5d, 0x5b, 0xf3, 0x56, 0x12, 0xdf, 0xfc, 0x9e, 0x01, 0xa3, 0xf8, - 0xa7, 0xd5, 0x69, 0xe0, 0x89, 0x52, 0x69, 0xbb, 0x2a, 0x8e, 0xfb, 0x55, 0x0b, 0xd7, 0xb9, 0x1f, - 0xd8, 0x22, 0x36, 0x40, 0xd3, 0x23, 0x11, 0xb2, 0x20, 0xe5, 0xc1, 0x0d, 0xf2, 0x80, 0x34, 0x22, - 0xe5, 0x51, 0x10, 0x41, 0x82, 0x54, 0x20, 0xe3, 0x49, 0xe1, 0x76, 0x95, 0x89, 0x9f, 0xf8, 0x1a, - 0xfc, 0xa4, 0x90, 0xd1, 0x79, 0x0d, 0xfd, 0xa4, 0x90, 0xa3, 0x91, 0x57, 0x61, 0x98, 0x55, 0x6d, - 0xc9, 0x03, 0x23, 0xdc, 0x9a, 0x60, 0x1b, 0x7d, 0x2d, 0xd6, 0x82, 0x23, 0x99, 0x7f, 0x23, 0x9b, - 0x1c, 0x40, 0x61, 0x05, 0x9c, 0x70, 0x6e, 0xbc, 0x01, 0x43, 0xa5, 0x46, 0xc3, 0xbb, 0x2f, 0xb4, - 0x84, 0xf4, 0x0f, 0x45, 0xe3, 0xc7, 0x57, 0x58, 0x87, 0xa1, 0x68, 0x81, 0x45, 0x0c, 0x40, 0x16, - 0x60, 0xb4, 0xb4, 0x5d, 0x5d, 0x5e, 0xae, 0x6c, 0x6c, 0xac, 0x88, 0x4b, 0x2f, 0x2f, 0xc8, 0xf1, - 0x71, 0xdd, 0xba, 0x1d, 0x86, 0x8d, 0x1e, 0x31, 0xf1, 0x31, 0x1d, 0x79, 0x0b, 0xe0, 0x5d, 0xcf, - 0x6d, 0xdd, 0xa5, 0xe1, 0xbe, 0x57, 0x17, 0x9d, 0x67, 0x26, 0xc5, 0xd8, 0x07, 0x9e, 0xdb, 0xb2, - 0x9b, 0x08, 0x66, 0x6d, 0x8f, 0x91, 0x2c, 0xe5, 0x6f, 0x36, 0xd2, 0x65, 0x2f, 0x44, 0x1b, 0x66, - 0x28, 0x1e, 0xe9, 0x1d, 0x2f, 0xec, 0x3a, 0x93, 0x15, 0x68, 0xa4, 0x09, 0x93, 0xd5, 0xce, 0xde, - 0x1e, 0x65, 0xda, 0x5b, 0x38, 0x06, 0x86, 0xc5, 0x76, 0x34, 0xba, 0x32, 0xc4, 0x37, 0x69, 0x6c, - 0xeb, 0x16, 0x94, 0x5f, 0x61, 0x82, 0xfc, 0xdd, 0xa3, 0x39, 0x71, 0x99, 0x83, 0xd9, 0xaf, 0x81, - 0xa4, 0xef, 0xf6, 0x37, 0x25, 0x79, 0x9b, 0x3f, 0x9b, 0x81, 0x09, 0xbe, 0xbb, 0xe6, 0xf2, 0xf9, - 0xc4, 0xce, 0xfd, 0x37, 0xb4, 0xb9, 0x7f, 0x4e, 0xae, 0x43, 0x4a, 0xd7, 0x06, 0x9a, 0xf9, 0xfb, - 0x40, 0xba, 0x69, 0x88, 0x25, 0x7d, 0x40, 0x83, 0x4c, 0xfa, 0xeb, 0x71, 0x20, 0x50, 0x80, 0x44, - 0x36, 0x6a, 0xde, 0xc0, 0xd2, 0x78, 0x98, 0x3f, 0x93, 0x81, 0x71, 0xc5, 0x7c, 0x7d, 0x62, 0x07, - 0xfe, 0xd3, 0xda, 0xc0, 0xcb, 0xa3, 0x20, 0xa5, 0x67, 0x03, 0x8d, 0x7b, 0x07, 0xa6, 0xba, 0x48, - 0x92, 0xbb, 0x00, 0x63, 0x90, 0x5d, 0xc0, 0x2b, 0xdd, 0x81, 0x33, 0xfc, 0x3e, 0x4e, 0x14, 0x38, - 0xa3, 0x46, 0xea, 0x7c, 0x33, 0x03, 0x33, 0xe2, 0x57, 0xa9, 0x53, 0x77, 0xc3, 0x05, 0xaf, 0xb5, - 0xeb, 0xee, 0x3d, 0xb1, 0xdf, 0xa2, 0xa4, 0x7d, 0x8b, 0x39, 0xfd, 0x5b, 0x28, 0x1d, 0xec, 0xfd, - 0x49, 0xcc, 0xff, 0x0b, 0x60, 0xb6, 0x17, 0x01, 0xb9, 0xa4, 0x6d, 0xe2, 0xd0, 0xcb, 0x90, 0xd8, - 0x20, 0xf3, 0xed, 0x5b, 0x1c, 0x99, 0x97, 0x19, 0x20, 0x32, 0x6f, 0x05, 0x8a, 0x58, 0x55, 0x95, - 0x06, 0x6c, 0x10, 0x82, 0xf8, 0x32, 0xc0, 0xc5, 0x87, 0x47, 0x73, 0x17, 0x1c, 0x56, 0x66, 0x07, - 0xa2, 0xd0, 0xee, 0xf8, 0xae, 0xc2, 0xa3, 0x8b, 0x92, 0xfc, 0xba, 0x01, 0x13, 0x08, 0x5c, 0xbc, - 0x47, 0x5b, 0x21, 0x32, 0xcb, 0x89, 0x13, 0xac, 0x48, 0x81, 0x56, 0x43, 0xdf, 0x6d, 0xed, 0x09, - 0x0d, 0xba, 0x23, 0x34, 0xe8, 0x9b, 0x7b, 0x6e, 0xb8, 0xdf, 0xd9, 0xb9, 0x5a, 0xf3, 0x9a, 0xd7, - 0xf6, 0x7c, 0xe7, 0x9e, 0xcb, 0xb7, 0x2f, 0x4e, 0xe3, 0x5a, 0x74, 0x95, 0xd3, 0x69, 0xbb, 0x89, - 0x7b, 0x9c, 0x82, 0x15, 0xea, 0x5d, 0xde, 0x50, 0x8a, 0xd5, 0x26, 0x9a, 0x99, 0x68, 0x11, 0xf9, - 0x61, 0x38, 0xcb, 0x23, 0x69, 0x16, 0xbc, 0x56, 0xe8, 0xb6, 0x3a, 0x5e, 0x27, 0x28, 0x3b, 0xb5, - 0x83, 0x4e, 0x3b, 0x10, 0x0e, 0x5a, 0xec, 0x79, 0x2d, 0x2a, 0xb4, 0x77, 0x78, 0xa9, 0xc2, 0xb2, - 0x17, 0x03, 0xb2, 0x04, 0x53, 0xbc, 0xa8, 0xd4, 0x09, 0xbd, 0x6a, 0xcd, 0x69, 0xb8, 0xad, 0x3d, - 0xf4, 0xdb, 0xe6, 0x79, 0x2c, 0x91, 0xd3, 0x09, 0x3d, 0x3b, 0xe0, 0x70, 0x85, 0x5f, 0x37, 0x11, - 0x59, 0x86, 0x49, 0x8b, 0x3a, 0xf5, 0xbb, 0xce, 0x83, 0x05, 0xa7, 0xed, 0xd4, 0xdc, 0xf0, 0x10, - 0x37, 0x82, 0xd9, 0xf2, 0xdc, 0xc3, 0xa3, 0xb9, 0xa7, 0x7c, 0xea, 0xd4, 0xed, 0xa6, 0xf3, 0xc0, - 0xae, 0x89, 0x42, 0x75, 0x9d, 0x49, 0xd0, 0x45, 0xac, 0xdc, 0x56, 0xc4, 0x6a, 0x34, 0xc9, 0xca, - 0x6d, 0xf5, 0x66, 0x15, 0xd3, 0x49, 0x56, 0x1b, 0x8e, 0xbf, 0x47, 0x43, 0xee, 0xd8, 0x84, 0x8b, - 0xc6, 0x65, 0x43, 0x61, 0x15, 0x62, 0x99, 0x8d, 0x4e, 0xce, 0x24, 0x2b, 0x85, 0x8e, 0x49, 0xde, - 0xb6, 0xef, 0x86, 0x54, 0xed, 0xe1, 0x18, 0x36, 0x0b, 0xc7, 0x1f, 0x5d, 0xbb, 0xbd, 0xba, 0xd8, - 0x45, 0x19, 0x73, 0x53, 0x3a, 0x59, 0xe8, 0xe2, 0x96, 0xde, 0xcb, 0x2e, 0xca, 0x88, 0x9b, 0xda, - 0xcf, 0x71, 0xec, 0xa7, 0xc2, 0xad, 0x47, 0x47, 0xbb, 0x28, 0xc9, 0x2a, 0x1b, 0xb4, 0x90, 0xb6, - 0x98, 0x44, 0x0b, 0xc7, 0xee, 0x04, 0x36, 0xed, 0x79, 0xb1, 0x85, 0x2f, 0xfa, 0xb2, 0xd8, 0x4e, - 0x71, 0xf3, 0x26, 0x89, 0xc9, 0x8f, 0xc2, 0xe4, 0x66, 0x40, 0x6f, 0x2d, 0xaf, 0x57, 0x65, 0x54, - 0xd7, 0xec, 0x24, 0x6e, 0xec, 0xaf, 0x1f, 0xa3, 0x74, 0xae, 0xaa, 0x34, 0x78, 0x2b, 0x93, 0x7f, - 0xb7, 0x4e, 0x40, 0xed, 0x5d, 0xb7, 0x1d, 0xd8, 0x32, 0x7c, 0x4c, 0xfd, 0x6e, 0x89, 0xaa, 0xcc, - 0x25, 0x98, 0xea, 0x62, 0x43, 0x26, 0x00, 0x18, 0xd0, 0xde, 0x5c, 0xad, 0x2e, 0x6e, 0x14, 0x4f, - 0xb1, 0x7d, 0x2b, 0xfe, 0x5e, 0x5c, 0x2d, 0x95, 0x57, 0x16, 0x2b, 0x45, 0x83, 0x4c, 0xc1, 0x38, - 0x42, 0x2a, 0xcb, 0x55, 0x0e, 0xca, 0xbc, 0x9b, 0xcb, 0x0f, 0x15, 0x87, 0xad, 0x22, 0x9f, 0xba, - 0x21, 0x9b, 0x00, 0xb8, 0xa6, 0x98, 0xbf, 0x9c, 0x81, 0x73, 0x72, 0x59, 0xa1, 0xe1, 0x7d, 0xcf, - 0x3f, 0x70, 0x5b, 0x7b, 0x4f, 0xf8, 0xea, 0x70, 0x4b, 0x5b, 0x1d, 0x9e, 0x4f, 0xac, 0xd4, 0x89, - 0x5e, 0xf6, 0x59, 0x22, 0x7e, 0x61, 0x04, 0x9e, 0xee, 0x4b, 0x45, 0xde, 0x63, 0xab, 0xb9, 0x4b, - 0x5b, 0xe1, 0x72, 0xbd, 0x41, 0xd9, 0xee, 0xd5, 0xeb, 0x84, 0xe2, 0x20, 0xe1, 0xb9, 0x87, 0x47, - 0x73, 0xd3, 0xfc, 0x4a, 0xa5, 0xed, 0xd6, 0x1b, 0xd4, 0x0e, 0x79, 0xb1, 0x26, 0x6e, 0xdd, 0xd4, - 0x8c, 0x65, 0x74, 0xc1, 0x7b, 0xb9, 0x15, 0x52, 0xff, 0x9e, 0xc3, 0x6f, 0x96, 0x09, 0x96, 0x07, - 0x94, 0xb6, 0x6d, 0x87, 0x95, 0xda, 0xae, 0x28, 0xd6, 0x59, 0x76, 0x51, 0x93, 0x5b, 0x0a, 0xcb, - 0x05, 0xb6, 0xa7, 0xba, 0xeb, 0x3c, 0x10, 0x1b, 0x05, 0x11, 0x60, 0x1c, 0xb1, 0xe4, 0x41, 0xda, - 0x4d, 0xe7, 0x81, 0xd5, 0x4d, 0x42, 0xbe, 0x00, 0xa7, 0xc5, 0x02, 0xc4, 0x94, 0xb1, 0xef, 0x35, - 0x64, 0x8f, 0x73, 0xc8, 0xeb, 0xc5, 0x87, 0x47, 0x73, 0x67, 0xc5, 0xf2, 0x65, 0xd7, 0x38, 0x46, - 0x6a, 0xaf, 0xd3, 0xb9, 0x90, 0x0d, 0xb6, 0x20, 0x27, 0x86, 0xe3, 0x2e, 0x0d, 0x02, 0x67, 0x4f, - 0x6e, 0x2a, 0xf8, 0x69, 0x9e, 0x32, 0x98, 0x76, 0x93, 0x97, 0x5b, 0x3d, 0x29, 0xc9, 0x12, 0x4c, - 0x6c, 0xd3, 0x1d, 0xf5, 0xfb, 0x0c, 0x47, 0xaa, 0xaa, 0x78, 0x9f, 0xee, 0xf4, 0xfe, 0x38, 0x09, - 0x3a, 0xe2, 0xc2, 0x14, 0x86, 0x2f, 0xb0, 0x1d, 0x32, 0x6d, 0x51, 0x1f, 0x63, 0x05, 0x47, 0x50, - 0x19, 0xcc, 0xc6, 0x16, 0xb2, 0x5e, 0x5e, 0x7e, 0xf6, 0xe1, 0xd1, 0xdc, 0xd3, 0x3c, 0x14, 0xa2, - 0x21, 0xe0, 0x76, 0xe2, 0x7e, 0x75, 0x37, 0x57, 0xf2, 0x25, 0x98, 0xb4, 0xbc, 0x4e, 0xe8, 0xb6, - 0xf6, 0xaa, 0xa1, 0xef, 0x84, 0x74, 0x8f, 0x2f, 0x48, 0x71, 0x50, 0x62, 0xa2, 0x94, 0xfb, 0xf3, - 0x7d, 0x0e, 0xb4, 0x03, 0x01, 0xd5, 0x56, 0x04, 0x9d, 0x80, 0x7c, 0x11, 0x26, 0x78, 0x34, 0x55, - 0x54, 0xc1, 0xa8, 0x76, 0x15, 0x49, 0x2f, 0xdc, 0xba, 0x8e, 0x9b, 0xc1, 0x73, 0x3c, 0x2a, 0x2b, - 0xad, 0x82, 0x04, 0x37, 0xf2, 0x39, 0x31, 0x58, 0xeb, 0x6e, 0x6b, 0x2f, 0x12, 0x63, 0xc0, 0x91, - 0x7f, 0x35, 0x1e, 0x92, 0x36, 0x6b, 0xae, 0x14, 0xe3, 0x1e, 0x9b, 0xd4, 0x6e, 0x3e, 0xe6, 0x91, - 0x01, 0xc5, 0x64, 0x03, 0xc9, 0x67, 0x61, 0xb4, 0xb4, 0x47, 0x5b, 0xec, 0xc3, 0xef, 0x8b, 0xdb, - 0xcf, 0x32, 0x17, 0x43, 0x04, 0xd7, 0x89, 0xc4, 0xcd, 0x04, 0x56, 0xc8, 0x04, 0x49, 0xf1, 0xdc, - 0x2d, 0x9d, 0xb2, 0x62, 0x66, 0xa4, 0x0e, 0x05, 0xde, 0x06, 0x4a, 0x99, 0x0d, 0x24, 0xdc, 0x57, - 0xcf, 0xaa, 0xdf, 0x5c, 0x14, 0x25, 0xf8, 0x63, 0x54, 0x98, 0xe8, 0x29, 0x47, 0xd0, 0xaa, 0xd0, - 0xb8, 0x96, 0x01, 0xf2, 0x92, 0xd0, 0x3c, 0x07, 0x67, 0x7b, 0xb4, 0xd9, 0xbc, 0x07, 0xe7, 0x7b, - 0xd7, 0x48, 0x3e, 0x0b, 0x33, 0x48, 0xb8, 0xe0, 0xb5, 0x5a, 0xb4, 0x16, 0xe2, 0x24, 0x93, 0x1e, - 0x97, 0x6c, 0xf9, 0xf9, 0x87, 0x47, 0x73, 0x17, 0x79, 0x7f, 0x6b, 0x11, 0x82, 0x9d, 0x74, 0xbe, - 0xa4, 0x72, 0x30, 0x7f, 0x31, 0x03, 0xb3, 0x62, 0xde, 0x5a, 0xb4, 0xe6, 0xf9, 0xf5, 0x27, 0x7f, - 0x9d, 0x58, 0xd4, 0xd6, 0x89, 0xe7, 0xa2, 0x18, 0xc9, 0xb4, 0x4e, 0xf6, 0x59, 0x26, 0x7e, 0xdb, - 0x80, 0x0b, 0xfd, 0x88, 0xd8, 0xe8, 0x44, 0x71, 0xc5, 0xa3, 0x5d, 0xf1, 0xc3, 0x6d, 0x98, 0xc6, - 0x0f, 0x8a, 0x07, 0x34, 0xc1, 0x92, 0x17, 0x84, 0xe8, 0x25, 0xcf, 0x68, 0x91, 0x42, 0x65, 0xcf, - 0xe3, 0x8e, 0x10, 0xf4, 0x83, 0x18, 0xdf, 0x3d, 0x9a, 0x03, 0x06, 0xe2, 0x91, 0xc0, 0xcc, 0xd8, - 0xe5, 0x52, 0x86, 0xe7, 0x3f, 0x81, 0x8d, 0x31, 0x61, 0x07, 0xf4, 0x30, 0xb0, 0xd2, 0x58, 0xa3, - 0x27, 0xb4, 0xd4, 0x09, 0xf7, 0xd7, 0x7d, 0xba, 0x4b, 0x7d, 0xda, 0xaa, 0xd1, 0x8f, 0x99, 0x27, - 0x54, 0xef, 0xdc, 0x40, 0xfb, 0xf2, 0x3f, 0x1d, 0x81, 0x99, 0x34, 0x32, 0x36, 0x2e, 0xca, 0x56, - 0x30, 0x99, 0xbd, 0xe5, 0xa7, 0x0c, 0x28, 0x54, 0x69, 0xcd, 0x6b, 0xd5, 0x6f, 0x39, 0xb5, 0xd0, - 0x93, 0x31, 0x57, 0x36, 0x5f, 0x0a, 0x19, 0xdc, 0xde, 0xc5, 0x02, 0x4d, 0xb9, 0x7d, 0x66, 0xb0, - 0x1d, 0x58, 0xcd, 0xc3, 0x18, 0xfe, 0x10, 0xef, 0x2a, 0x45, 0x55, 0xe0, 0xe9, 0xa1, 0x56, 0x29, - 0x29, 0xc3, 0xb8, 0x98, 0xae, 0x9e, 0x1a, 0x56, 0x8e, 0x81, 0xe0, 0x35, 0x59, 0x90, 0xf4, 0xc4, - 0xe9, 0x24, 0xe4, 0x06, 0x64, 0x37, 0xe7, 0x6f, 0x89, 0x6f, 0x20, 0x83, 0x65, 0x37, 0xe7, 0x6f, - 0xa1, 0x93, 0x87, 0x19, 0xce, 0xe3, 0x9d, 0xf9, 0x5d, 0xf5, 0xac, 0x61, 0x73, 0xfe, 0x16, 0x59, - 0x83, 0x29, 0x8b, 0x7e, 0xb9, 0xe3, 0xfa, 0x54, 0x4c, 0x80, 0xbb, 0xb7, 0x4a, 0xf8, 0x2d, 0xf2, - 0x7c, 0xe1, 0xf3, 0x79, 0xa1, 0xdc, 0xd4, 0xda, 0xcd, 0x5d, 0x35, 0x63, 0x41, 0x37, 0x2d, 0xf9, - 0x71, 0x38, 0x5d, 0x71, 0x03, 0xd1, 0x66, 0xee, 0xe4, 0xaf, 0xe3, 0x79, 0xff, 0x70, 0x8f, 0xe9, - 0xf0, 0xa9, 0xd4, 0xe9, 0xf0, 0x6c, 0x3d, 0x62, 0x62, 0xf3, 0x13, 0x84, 0x7a, 0x32, 0x1e, 0x3f, - 0xbd, 0x1e, 0xf2, 0x01, 0x4c, 0xa0, 0x57, 0x15, 0xcf, 0x3d, 0xf0, 0x8e, 0xd0, 0x48, 0x8f, 0x9a, - 0x3f, 0x91, 0x5a, 0xf3, 0x79, 0x74, 0xd2, 0xda, 0x78, 0x7a, 0x82, 0xf7, 0x89, 0xb4, 0xcd, 0xb1, - 0xc6, 0x99, 0xbc, 0x0b, 0x93, 0xc2, 0x4a, 0x59, 0xdb, 0xdd, 0xd8, 0xa7, 0x15, 0xe7, 0x50, 0x44, - 0x0c, 0xe1, 0xc6, 0x47, 0x98, 0x36, 0xb6, 0xb7, 0x6b, 0x87, 0xfb, 0xd4, 0xae, 0x3b, 0xda, 0x7a, - 0x9e, 0x20, 0x24, 0x5f, 0x81, 0xb1, 0x15, 0x0f, 0x0f, 0x78, 0x51, 0xd5, 0x8c, 0x22, 0x9f, 0xf7, - 0x31, 0x63, 0x09, 0x07, 0x27, 0xac, 0x8e, 0x1f, 0x1c, 0xcd, 0xbd, 0x71, 0x52, 0x29, 0x54, 0x2a, - 0xb0, 0xd4, 0xda, 0xc8, 0x02, 0xe4, 0xb7, 0xe9, 0x0e, 0xeb, 0x6d, 0xf2, 0xb6, 0xbd, 0x04, 0x73, - 0x7d, 0x71, 0x5f, 0xfc, 0x52, 0x4f, 0x4f, 0x25, 0x06, 0xf1, 0x61, 0x0a, 0xc7, 0x67, 0xdd, 0x09, - 0x82, 0xfb, 0x9e, 0x5f, 0x6f, 0xd0, 0x40, 0x1e, 0x43, 0x76, 0x0f, 0xfe, 0x7c, 0xea, 0xe0, 0x5f, - 0xe0, 0x83, 0xdf, 0x56, 0x38, 0xa8, 0xe2, 0xd6, 0xc5, 0xde, 0xfc, 0x87, 0x06, 0x4a, 0x3d, 0xb9, - 0x82, 0xd1, 0xa5, 0x51, 0xec, 0x0d, 0xba, 0x71, 0x9c, 0x76, 0xe2, 0xfe, 0x16, 0x47, 0x21, 0xaf, - 0xc0, 0xf0, 0x2d, 0xa7, 0x46, 0x43, 0x79, 0x16, 0x81, 0xc8, 0xbb, 0x08, 0x51, 0x7d, 0x3e, 0x1c, - 0x87, 0x2d, 0xc8, 0x15, 0x7a, 0xcf, 0xad, 0xd1, 0x52, 0x18, 0xd2, 0x80, 0x8f, 0xf0, 0x42, 0x89, - 0x1f, 0xda, 0x8f, 0xf2, 0x05, 0xb9, 0x8e, 0xe5, 0xb6, 0x13, 0x23, 0xd8, 0x35, 0x47, 0xe5, 0x95, - 0xca, 0xc1, 0xfc, 0x1f, 0x46, 0x3c, 0xea, 0xe4, 0x45, 0xc8, 0x59, 0xeb, 0x51, 0xfb, 0xf9, 0x79, - 0x7c, 0xa2, 0xf9, 0x88, 0x40, 0x3e, 0x07, 0xa7, 0x15, 0x3e, 0x38, 0x22, 0xb4, 0xce, 0x1a, 0xc4, - 0x3b, 0xf3, 0x02, 0x1e, 0xc0, 0x2a, 0x2d, 0x71, 0x38, 0x46, 0xa2, 0x45, 0xe9, 0x3c, 0xd0, 0xfa, - 0x88, 0x0b, 0x2a, 0xb4, 0xe5, 0x72, 0xde, 0x4a, 0x67, 0x55, 0xde, 0x75, 0x44, 0x48, 0x76, 0x36, - 0x8d, 0xc3, 0xbb, 0xb9, 0x7c, 0xae, 0x38, 0x64, 0xfe, 0x99, 0xa1, 0xa4, 0x9b, 0x7a, 0x42, 0x57, - 0xac, 0x9b, 0xda, 0x8a, 0x35, 0x23, 0x48, 0xa3, 0x5e, 0xb1, 0xb2, 0x54, 0x2b, 0x63, 0x12, 0xc6, - 0x35, 0x24, 0x0c, 0xbe, 0xdf, 0x0c, 0xa8, 0xcf, 0x9d, 0xf1, 0x1f, 0xaf, 0xe0, 0xfb, 0xa8, 0x5f, - 0x03, 0x85, 0x47, 0xff, 0x91, 0x81, 0x4e, 0x1a, 0x95, 0x82, 0x8d, 0x06, 0x03, 0xa9, 0xa3, 0xd1, - 0x09, 0xa8, 0x6f, 0x21, 0x94, 0x47, 0xd0, 0xae, 0xe8, 0x11, 0xb4, 0x0d, 0x8b, 0xc1, 0xc8, 0x67, - 0x60, 0x68, 0x13, 0xb7, 0x9c, 0x7a, 0xfc, 0x54, 0xc4, 0x1f, 0x0b, 0xf9, 0x0c, 0xeb, 0xb0, 0x3f, - 0x55, 0x05, 0x81, 0x65, 0xa4, 0x0a, 0x23, 0x0b, 0x3e, 0xc5, 0xc4, 0x52, 0xb9, 0xc1, 0x0f, 0xba, - 0x6b, 0x9c, 0x24, 0x79, 0xd0, 0x2d, 0x38, 0x99, 0x3f, 0x9f, 0x01, 0x12, 0xf7, 0x11, 0x6f, 0x0d, - 0x07, 0x4f, 0xec, 0x47, 0x7f, 0x47, 0xfb, 0xe8, 0x4f, 0x77, 0x7d, 0x74, 0xde, 0xbd, 0x81, 0xbe, - 0xfd, 0xef, 0x19, 0x70, 0x26, 0x9d, 0x90, 0x3c, 0x07, 0xc3, 0x6b, 0x1b, 0xeb, 0x32, 0x04, 0x4f, - 0x74, 0xc5, 0x6b, 0xa3, 0x65, 0x6c, 0x89, 0x22, 0xf2, 0x2a, 0x0c, 0xbf, 0x67, 0x2d, 0xb0, 0x25, - 0x53, 0xb9, 0xbd, 0xf7, 0x65, 0xdf, 0xae, 0xe9, 0x7b, 0x74, 0x81, 0xa4, 0x7e, 0xdb, 0xec, 0x63, - 0xfb, 0xb6, 0xdf, 0xcc, 0xc0, 0x64, 0xa9, 0x56, 0xa3, 0x41, 0xc0, 0x0c, 0x22, 0x1a, 0x84, 0x4f, - 0xec, 0x87, 0x4d, 0x0f, 0xae, 0xd3, 0xfa, 0x36, 0xd0, 0x57, 0xfd, 0x7d, 0x03, 0x4e, 0x4b, 0xaa, - 0x7b, 0x2e, 0xbd, 0xbf, 0xb1, 0xef, 0xd3, 0x60, 0xdf, 0x6b, 0xd4, 0x07, 0xbe, 0xc2, 0xca, 0x56, - 0x69, 0xb7, 0x11, 0x52, 0x5f, 0x3d, 0x99, 0xd9, 0x45, 0x88, 0xb6, 0x4a, 0x23, 0x84, 0x5c, 0x83, - 0x91, 0x52, 0xbb, 0xed, 0x7b, 0xf7, 0xf8, 0xb4, 0x1f, 0x17, 0xe7, 0xfe, 0x1c, 0xa4, 0xc5, 0x09, - 0x70, 0x10, 0x6b, 0x46, 0x85, 0xb6, 0xf8, 0x95, 0x85, 0x71, 0xde, 0x8c, 0x3a, 0x6d, 0xa9, 0x16, - 0x1a, 0x96, 0x9b, 0xdf, 0xc8, 0x41, 0x41, 0xed, 0x08, 0x31, 0x61, 0x98, 0x87, 0x81, 0xa9, 0xe1, - 0x38, 0x0e, 0x42, 0x2c, 0x51, 0x12, 0x47, 0xd7, 0x65, 0x8e, 0x8d, 0xae, 0xdb, 0x86, 0xf1, 0x75, - 0xdf, 0x6b, 0x7b, 0x01, 0xad, 0xf3, 0xdc, 0x80, 0x5c, 0x6b, 0x4d, 0x47, 0x71, 0xeb, 0x7c, 0xcc, - 0xd1, 0xfd, 0x8c, 0xdb, 0x81, 0xb6, 0xc0, 0xb6, 0x93, 0x99, 0x03, 0x75, 0x3e, 0xfc, 0x64, 0xcb, - 0x09, 0xc4, 0x25, 0xa2, 0xe8, 0x64, 0x8b, 0x41, 0xf4, 0x93, 0x2d, 0x06, 0x51, 0xa7, 0xc5, 0xd0, - 0xe3, 0x9a, 0x16, 0xe4, 0xe7, 0x0d, 0x18, 0x2b, 0xb5, 0x5a, 0x22, 0xba, 0xee, 0x98, 0xf0, 0x80, - 0xcf, 0x8b, 0xc3, 0xad, 0x37, 0x3e, 0xd4, 0xe1, 0xd6, 0x86, 0xef, 0xb8, 0x61, 0x80, 0x41, 0x13, - 0x71, 0x85, 0x6a, 0x9c, 0xbe, 0xd2, 0x0e, 0xf2, 0x06, 0x14, 0x23, 0x79, 0x5c, 0x6e, 0xd5, 0xe9, - 0x03, 0xca, 0x83, 0x11, 0xc7, 0xf9, 0x0d, 0x67, 0xed, 0xd4, 0x2e, 0x89, 0x68, 0x7e, 0xd3, 0x80, - 0x33, 0xaa, 0x40, 0x54, 0x3b, 0x3b, 0x4d, 0x17, 0xb7, 0x3f, 0xe4, 0x2a, 0x8c, 0x8a, 0xef, 0x15, - 0x19, 0x72, 0xdd, 0x09, 0x25, 0x63, 0x14, 0xb2, 0xc8, 0x3e, 0x11, 0xe3, 0x21, 0x7c, 0x05, 0xd3, - 0x89, 0xe9, 0xc6, 0x8a, 0xca, 0xb3, 0x62, 0xb0, 0x8b, 0x3e, 0xfe, 0xd6, 0xbf, 0x1d, 0x83, 0x98, - 0x6f, 0xc3, 0x94, 0xde, 0xca, 0x2a, 0xc5, 0x2b, 0xb0, 0xb2, 0x6b, 0x46, 0x7a, 0xd7, 0x64, 0xb9, - 0xb9, 0x0d, 0xa4, 0x8b, 0x3e, 0xc0, 0x13, 0x5a, 0x1a, 0xca, 0x08, 0x02, 0xe9, 0x1f, 0xed, 0x42, - 0x8c, 0x52, 0xab, 0x8e, 0xa9, 0xc3, 0x8d, 0xa4, 0xe6, 0xbf, 0x1e, 0x83, 0xe9, 0x14, 0xd5, 0x71, - 0xcc, 0xd2, 0x3e, 0xa7, 0x4f, 0x9e, 0xd1, 0x28, 0xf2, 0x46, 0x4e, 0x99, 0xb7, 0x65, 0x1a, 0xcd, - 0x3e, 0x53, 0xa5, 0x5f, 0x6e, 0xcd, 0x8f, 0x62, 0x79, 0x57, 0x83, 0xe3, 0x86, 0x1e, 0x5b, 0x70, - 0x5c, 0x19, 0xc6, 0x45, 0xaf, 0xc4, 0x54, 0x1e, 0x8e, 0xdd, 0x02, 0x3e, 0x2f, 0xb0, 0xbb, 0xa6, - 0xb4, 0x4e, 0xc2, 0x79, 0x04, 0x5e, 0xe3, 0x1e, 0x15, 0x3c, 0x46, 0x54, 0x1e, 0x58, 0x90, 0xca, - 0x43, 0x21, 0x21, 0x7f, 0xdb, 0x00, 0x22, 0x20, 0xea, 0x7c, 0xce, 0xf7, 0x9b, 0xcf, 0xf5, 0xc7, - 0x33, 0x9f, 0x9f, 0x96, 0x6d, 0x4c, 0x9f, 0xd7, 0x29, 0xcd, 0x22, 0x7f, 0xd3, 0x80, 0x29, 0x1e, - 0xa1, 0xa5, 0x36, 0x76, 0xb4, 0x5f, 0x63, 0x6b, 0x8f, 0xa7, 0xb1, 0x17, 0x02, 0xac, 0xb6, 0x47, - 0x5b, 0xbb, 0x1b, 0x45, 0x7e, 0x18, 0x20, 0x9a, 0x51, 0x32, 0x12, 0xf8, 0x42, 0x8a, 0x16, 0x88, - 0x90, 0xe2, 0x4b, 0xde, 0x61, 0x44, 0xa7, 0x25, 0xbe, 0x88, 0xa0, 0xe4, 0xc7, 0x61, 0x86, 0xcd, - 0x97, 0x08, 0x22, 0xe2, 0x49, 0x67, 0xc7, 0xb0, 0x96, 0x4f, 0xf6, 0x5e, 0xda, 0xaf, 0xa6, 0x91, - 0xf1, 0x4b, 0x5d, 0x71, 0xe2, 0xa0, 0xb0, 0xa9, 0x6e, 0xf9, 0xd2, 0x28, 0x30, 0x70, 0x1c, 0x5b, - 0xcf, 0xef, 0x3a, 0xf7, 0xd0, 0x6f, 0xe7, 0xe4, 0x5c, 0xe0, 0xfa, 0x2d, 0xd0, 0x6f, 0x65, 0x21, - 0x88, 0xbc, 0x07, 0x24, 0x0a, 0x07, 0xe3, 0x30, 0xea, 0xcb, 0x3c, 0x7a, 0xe8, 0xa6, 0x8a, 0x03, - 0xc9, 0x7c, 0x59, 0xac, 0x0a, 0x49, 0x37, 0x31, 0xa1, 0x30, 0x23, 0x3a, 0xcd, 0xa0, 0x32, 0xfb, - 0x45, 0x30, 0x3b, 0xa1, 0x45, 0xeb, 0xc6, 0x25, 0x71, 0x86, 0x21, 0x25, 0x85, 0x86, 0xb6, 0xed, - 0x4d, 0x63, 0x47, 0x6e, 0xc2, 0xe8, 0x8a, 0xb7, 0xe7, 0xb6, 0x96, 0xe4, 0xb9, 0xb3, 0x38, 0x03, - 0x6b, 0x30, 0xa0, 0xbd, 0xaf, 0x9f, 0x1e, 0xc7, 0xa8, 0xcc, 0xaa, 0xad, 0xf8, 0x87, 0x56, 0xa7, - 0x35, 0x5b, 0x44, 0x67, 0x1c, 0x9a, 0x33, 0x75, 0xff, 0xd0, 0xf6, 0x3b, 0xda, 0xf2, 0xcd, 0x91, - 0xce, 0xef, 0xc0, 0xb9, 0x9e, 0x1f, 0x2d, 0xe5, 0xfe, 0xd8, 0x35, 0xfd, 0xfe, 0xd8, 0xb9, 0x5e, - 0xca, 0x3d, 0x50, 0xef, 0x90, 0xfd, 0xaa, 0x91, 0xd0, 0xe6, 0xc2, 0xf4, 0xe2, 0xf9, 0x93, 0x7b, - 0x2d, 0x77, 0x19, 0xcc, 0xd7, 0xc3, 0xf5, 0x7d, 0x26, 0x36, 0xf9, 0x98, 0xbe, 0x57, 0xd7, 0x0b, - 0xd4, 0xfc, 0x8f, 0xa8, 0xd8, 0xcd, 0xbf, 0x6f, 0x00, 0xe1, 0x2d, 0x5c, 0x70, 0xda, 0xce, 0x8e, - 0xdb, 0x70, 0x43, 0x97, 0x06, 0xe4, 0x0e, 0x14, 0x05, 0x0b, 0x67, 0xa7, 0x41, 0xd5, 0xa8, 0x4e, - 0x11, 0x87, 0x11, 0x95, 0xd9, 0x49, 0x23, 0xad, 0x8b, 0xb0, 0x87, 0x28, 0x66, 0x1e, 0x41, 0x14, - 0xcd, 0xef, 0x1b, 0x70, 0xae, 0xbb, 0xd9, 0xa2, 0xe6, 0x68, 0xf0, 0x8c, 0x63, 0x06, 0x2f, 0xad, - 0x97, 0x19, 0x94, 0x9d, 0xc7, 0xd6, 0xcb, 0x6c, 0xec, 0x17, 0x3e, 0x79, 0x2f, 0xef, 0xab, 0x29, - 0x69, 0xc8, 0xab, 0x69, 0x01, 0x73, 0xfc, 0x26, 0x1e, 0x07, 0xeb, 0xb1, 0x72, 0x72, 0x33, 0x95, - 0x49, 0xdd, 0x4c, 0xc9, 0x4b, 0x85, 0xd9, 0xb4, 0x4b, 0x85, 0xe6, 0xd7, 0x33, 0x50, 0x58, 0x6f, - 0x74, 0xf6, 0xdc, 0x56, 0xc5, 0x09, 0x9d, 0x27, 0x76, 0x67, 0xf6, 0xba, 0xb6, 0x33, 0x8b, 0x22, - 0x3a, 0xa3, 0x8e, 0x0d, 0xb4, 0x2d, 0xfb, 0xb6, 0x01, 0x93, 0x31, 0x09, 0x57, 0x0f, 0x4b, 0x90, - 0x63, 0x3f, 0x84, 0xa1, 0x77, 0xb1, 0x8b, 0x31, 0x62, 0x5d, 0x8d, 0xfe, 0x12, 0x7b, 0x25, 0x3d, - 0x75, 0x31, 0x72, 0x38, 0xff, 0x29, 0x9e, 0x44, 0xf4, 0xe4, 0x59, 0xd2, 0x7f, 0xd7, 0x80, 0x62, - 0xb2, 0x27, 0xe4, 0x0e, 0x8c, 0x30, 0x4e, 0x6e, 0x94, 0x90, 0xf4, 0xf9, 0x1e, 0x7d, 0xbe, 0x2a, - 0xd0, 0x78, 0xf3, 0x70, 0xf0, 0x29, 0x87, 0x58, 0x92, 0xc3, 0x79, 0x0b, 0x0a, 0x2a, 0x56, 0x4a, - 0xeb, 0x5e, 0xd1, 0x75, 0xe2, 0x99, 0xf4, 0x71, 0x50, 0x5b, 0xfd, 0x2b, 0x5a, 0xab, 0x85, 0x36, - 0x1c, 0x34, 0x1d, 0x35, 0x5e, 0xc3, 0xe5, 0xd3, 0x41, 0x95, 0x33, 0xb9, 0xb8, 0xe8, 0xd7, 0x70, - 0x39, 0x8c, 0x6d, 0xe9, 0x78, 0x7d, 0x42, 0xce, 0x70, 0x4b, 0xd7, 0x46, 0x88, 0xba, 0x26, 0x70, - 0x1c, 0xf3, 0xff, 0xcb, 0xc2, 0x99, 0xb8, 0x79, 0x3c, 0x39, 0xf7, 0xba, 0xe3, 0x3b, 0xcd, 0xe0, - 0x98, 0x19, 0x70, 0xb9, 0xab, 0x69, 0x98, 0xcf, 0x42, 0x36, 0x4d, 0x69, 0x90, 0x99, 0x68, 0x10, - 0xee, 0x85, 0x79, 0x83, 0x64, 0x33, 0xc8, 0x1d, 0xc8, 0x56, 0x69, 0x28, 0x2e, 0xa3, 0x5f, 0xea, - 0x1a, 0x55, 0xb5, 0x5d, 0x57, 0xab, 0x34, 0xe4, 0x1f, 0x91, 0x5f, 0xc5, 0xa1, 0xda, 0xd5, 0x18, - 0xb6, 0xab, 0xd9, 0x86, 0xe1, 0xc5, 0x07, 0x6d, 0x5a, 0x0b, 0xc5, 0x1d, 0xf4, 0x97, 0xfa, 0xf3, - 0xe3, 0xb8, 0xca, 0x4d, 0x77, 0x8a, 0x00, 0x75, 0xb0, 0x38, 0xca, 0xf9, 0x9b, 0x90, 0x97, 0x95, - 0x9f, 0xe8, 0xc6, 0xf6, 0xeb, 0x30, 0xa6, 0x54, 0x72, 0x22, 0xa1, 0xff, 0x4b, 0x03, 0x86, 0x99, - 0xb6, 0xdd, 0x7a, 0xed, 0x09, 0xd5, 0x48, 0x37, 0x34, 0x8d, 0x34, 0xa5, 0xdc, 0x0a, 0xc4, 0x79, - 0xf9, 0xda, 0x31, 0xba, 0xe8, 0xc8, 0x00, 0x88, 0x91, 0xc9, 0x6d, 0x18, 0x11, 0x69, 0xb1, 0x44, - 0xec, 0x87, 0x7a, 0xcd, 0x50, 0x26, 0xf9, 0x8c, 0x8c, 0x45, 0xaf, 0x9d, 0xb4, 0xae, 0x25, 0x35, - 0xa9, 0xc4, 0x57, 0x31, 0xd4, 0xcb, 0xf1, 0x8c, 0xcd, 0x82, 0xd7, 0xe2, 0xd7, 0xce, 0x94, 0x74, - 0xa1, 0x3d, 0xee, 0x64, 0x94, 0x84, 0x7f, 0x28, 0xdb, 0x8f, 0xc9, 0x19, 0xc1, 0x24, 0xdd, 0x75, - 0xf4, 0xdf, 0x27, 0xf8, 0x45, 0x2e, 0xd9, 0xb0, 0xb7, 0xa0, 0x70, 0xcb, 0xf3, 0xef, 0x3b, 0x7e, - 0x1d, 0xe3, 0x33, 0xb0, 0x9b, 0x3c, 0x8d, 0xdd, 0xf8, 0x2e, 0x87, 0xdb, 0x18, 0xda, 0xf1, 0x83, - 0xa3, 0xb9, 0x5c, 0xd9, 0xf3, 0x1a, 0x96, 0x86, 0x4e, 0xd6, 0x60, 0xfc, 0xae, 0xf3, 0x40, 0x1c, - 0xb5, 0x6e, 0x6c, 0xac, 0x88, 0x98, 0xb2, 0x97, 0x1e, 0x1e, 0xcd, 0x9d, 0x6b, 0x3a, 0x0f, 0xa2, - 0x23, 0xda, 0xde, 0xb7, 0x45, 0x74, 0x7a, 0xe2, 0xc2, 0xc4, 0xba, 0xe7, 0x87, 0xa2, 0x12, 0xb6, - 0x35, 0xc8, 0xf6, 0x38, 0xac, 0xbb, 0x96, 0x7a, 0x58, 0x77, 0x8e, 0xed, 0x87, 0xec, 0xdd, 0x88, - 0x5c, 0xbb, 0x7d, 0xac, 0x31, 0x26, 0x6f, 0xc1, 0xd4, 0x02, 0xf5, 0x43, 0x77, 0xd7, 0xad, 0x39, - 0x21, 0xbd, 0xe5, 0xf9, 0x4d, 0x27, 0x14, 0x7e, 0x29, 0xf4, 0x4b, 0xd4, 0x28, 0xe7, 0xd4, 0x74, - 0x42, 0xab, 0x1b, 0x93, 0x7c, 0x2e, 0x2d, 0x4a, 0x6f, 0x28, 0x8e, 0x45, 0x4a, 0x89, 0xd2, 0xeb, - 0x15, 0x8b, 0xd4, 0x1d, 0xaf, 0xb7, 0xd7, 0xef, 0xc4, 0x3a, 0x5f, 0xbe, 0x2e, 0x4e, 0xcf, 0x8f, - 0x3f, 0x91, 0x8e, 0xbe, 0x5b, 0x8f, 0x93, 0xe9, 0x79, 0xc8, 0x96, 0xd7, 0x6f, 0xa1, 0xa7, 0x49, - 0x9c, 0x10, 0xd3, 0xd6, 0xbe, 0xd3, 0xaa, 0xa1, 0x11, 0x25, 0xc2, 0x4e, 0x54, 0x85, 0x57, 0x5e, - 0xbf, 0x45, 0x1c, 0x98, 0x5e, 0xa7, 0x7e, 0xd3, 0x0d, 0x3f, 0x7b, 0xfd, 0xba, 0xf2, 0xa1, 0xf2, - 0xd8, 0xb4, 0x6b, 0xa2, 0x69, 0x73, 0x6d, 0x44, 0xb1, 0x1f, 0x5c, 0xbf, 0x9e, 0xfa, 0x39, 0xa2, - 0x86, 0xa5, 0xf1, 0x22, 0x8b, 0x30, 0x71, 0xd7, 0x79, 0x10, 0x47, 0x0b, 0x05, 0x22, 0xde, 0xf9, - 0x69, 0x29, 0x58, 0x71, 0xa4, 0x91, 0x3a, 0xdf, 0x12, 0x44, 0xe4, 0x4d, 0x18, 0x8b, 0xc5, 0x2b, - 0x10, 0x91, 0x62, 0x18, 0xc6, 0xad, 0x08, 0xa7, 0xe6, 0x92, 0x53, 0xd0, 0xc9, 0x66, 0xe4, 0xe9, - 0xe0, 0x96, 0xb0, 0x48, 0xa9, 0x75, 0x4d, 0xf5, 0x74, 0x38, 0x58, 0xa2, 0x75, 0x6b, 0x32, 0xda, - 0x1b, 0xf0, 0xf0, 0x29, 0x4b, 0xe7, 0xa2, 0x38, 0x50, 0xd6, 0x7d, 0xaf, 0xd9, 0x0e, 0x31, 0xca, - 0x39, 0xe1, 0x40, 0x69, 0x63, 0x49, 0x8a, 0x03, 0x85, 0x93, 0xa4, 0x87, 0x48, 0x8c, 0x3f, 0x42, - 0x88, 0x04, 0x85, 0xdc, 0x8a, 0x57, 0x3b, 0xc0, 0xb0, 0xe6, 0xd1, 0xf2, 0x7b, 0x4c, 0x7f, 0x34, - 0xbc, 0xda, 0xc1, 0xe3, 0x3b, 0xda, 0x47, 0xf6, 0x64, 0x95, 0xf5, 0x9d, 0x89, 0x95, 0xa8, 0x1a, - 0xb7, 0x9f, 0xf1, 0x81, 0xa5, 0x56, 0xc6, 0x0d, 0x15, 0x2e, 0x85, 0xb2, 0x23, 0x96, 0x4e, 0x4e, - 0x28, 0x14, 0x2b, 0x34, 0x38, 0x08, 0xbd, 0xf6, 0x42, 0xc3, 0x6d, 0xef, 0x78, 0x8e, 0x5f, 0xc7, - 0xcd, 0x69, 0x9a, 0xc2, 0x78, 0x31, 0x55, 0x61, 0x4c, 0xd5, 0x39, 0xbd, 0x5d, 0x93, 0x0c, 0xac, - 0x2e, 0x96, 0xe4, 0x73, 0x30, 0xc1, 0x66, 0xcb, 0xe2, 0x83, 0x90, 0xb6, 0xb8, 0x28, 0x4d, 0xe1, - 0x52, 0x3f, 0xa3, 0xdc, 0xc3, 0x8e, 0x0a, 0xb9, 0x90, 0xa2, 0xf6, 0xa0, 0x11, 0x81, 0x2a, 0xa4, - 0x3a, 0x2b, 0x52, 0x87, 0xd9, 0xbb, 0xce, 0x03, 0x25, 0x9b, 0x9b, 0x22, 0xf5, 0x04, 0x25, 0x16, - 0x73, 0xad, 0x32, 0x89, 0x3d, 0x88, 0x90, 0x7a, 0x4c, 0x80, 0x9e, 0x9c, 0xc8, 0x57, 0xe0, 0xac, - 0xe8, 0x56, 0x05, 0xf3, 0xa7, 0x78, 0xfe, 0x61, 0x75, 0xdf, 0xc1, 0xc8, 0xc3, 0xe9, 0x93, 0x69, - 0x58, 0x39, 0x60, 0x75, 0xc9, 0xc7, 0x0e, 0x38, 0x23, 0xab, 0x57, 0x0d, 0xe4, 0x4b, 0x30, 0xc1, - 0x7d, 0x92, 0x4b, 0x5e, 0x10, 0xe2, 0xce, 0x71, 0xa6, 0x47, 0x9d, 0x97, 0x52, 0xeb, 0x2c, 0x72, - 0x47, 0x27, 0x0f, 0x41, 0x43, 0xb7, 0x6c, 0x82, 0x1f, 0x79, 0x03, 0xc6, 0xd6, 0xdd, 0x56, 0x95, - 0x6f, 0xe5, 0xd6, 0x67, 0x4f, 0xc7, 0xcb, 0x58, 0xdb, 0x6d, 0xd9, 0xd2, 0x39, 0xd2, 0x8e, 0xb4, - 0x8e, 0x8a, 0x4d, 0xb6, 0x61, 0xac, 0x5a, 0x5d, 0xba, 0xe5, 0xb2, 0x75, 0xb4, 0x7d, 0x38, 0x7b, - 0xa6, 0x47, 0xdb, 0x9e, 0x4b, 0x6d, 0xdb, 0x78, 0x10, 0xec, 0x63, 0x32, 0x51, 0xbb, 0xe6, 0xb5, - 0x0f, 0x2d, 0x95, 0x93, 0xf9, 0x4f, 0x33, 0x09, 0x79, 0x27, 0xcb, 0x30, 0x22, 0x06, 0x49, 0x58, - 0x14, 0xdd, 0xd5, 0x3c, 0x9d, 0x5a, 0xcd, 0x88, 0x18, 0x76, 0x4b, 0xd2, 0x93, 0xfb, 0x8c, 0xd5, - 0xae, 0xd3, 0x69, 0xc8, 0x1c, 0xa1, 0x5f, 0xe0, 0xe2, 0x8c, 0x20, 0x6d, 0xe2, 0x56, 0x4e, 0x1e, - 0x19, 0xa6, 0x07, 0x1e, 0xe2, 0x0c, 0x96, 0xb5, 0x91, 0x03, 0x7e, 0x67, 0x3d, 0x1b, 0x45, 0x03, - 0xe9, 0x17, 0xd4, 0x1f, 0x5b, 0x85, 0xac, 0x16, 0xf3, 0x1f, 0x1b, 0x30, 0xae, 0x4d, 0x18, 0x72, - 0x53, 0x89, 0x9d, 0x8b, 0x83, 0xa4, 0x35, 0x9c, 0xd4, 0x37, 0xd1, 0x6e, 0x8a, 0x80, 0xc9, 0x4c, - 0x6f, 0xba, 0xd4, 0x54, 0xac, 0x7d, 0x77, 0xf2, 0x71, 0x7a, 0xa0, 0x5c, 0x8f, 0xf4, 0x40, 0x5f, - 0x9f, 0x80, 0x09, 0xdd, 0x44, 0x63, 0x7b, 0x26, 0xf4, 0xaa, 0x49, 0x97, 0x0f, 0x4f, 0x78, 0x85, - 0x10, 0xed, 0x81, 0x31, 0x84, 0x90, 0x17, 0x00, 0xa2, 0x18, 0x0d, 0xe9, 0xd5, 0x11, 0xcf, 0xa1, - 0x29, 0x05, 0xe4, 0x8b, 0x00, 0xab, 0x5e, 0x9d, 0x46, 0x79, 0xd6, 0xfa, 0x78, 0x96, 0x5f, 0xec, - 0xba, 0xf5, 0x7a, 0xba, 0xe5, 0xd5, 0x69, 0xf7, 0x85, 0x57, 0x85, 0x23, 0xf9, 0x34, 0x0c, 0x59, - 0x9d, 0x06, 0x95, 0x29, 0xbc, 0xc6, 0xa4, 0xca, 0xee, 0x34, 0x94, 0x57, 0x0a, 0xfc, 0x4e, 0xf2, - 0x40, 0x91, 0x01, 0xc8, 0x3b, 0x00, 0x4c, 0x2b, 0x61, 0x7a, 0x69, 0x99, 0xde, 0x03, 0x3d, 0x40, - 0x8a, 0x42, 0xc3, 0xa4, 0xd4, 0x5a, 0xe5, 0x31, 0x09, 0x59, 0x83, 0x11, 0xb1, 0x00, 0x8a, 0x03, - 0xbb, 0x67, 0xd2, 0x5c, 0xc5, 0x8a, 0x15, 0x2c, 0x72, 0x6a, 0x21, 0x58, 0xf7, 0xde, 0x72, 0x0f, - 0xd6, 0x9b, 0x30, 0xca, 0xd8, 0xf3, 0xb4, 0xfb, 0xdc, 0xfa, 0xc1, 0x68, 0x77, 0xa5, 0x41, 0xc9, - 0xcc, 0xfb, 0x31, 0x01, 0xf9, 0x1c, 0x66, 0xce, 0x13, 0x43, 0xdd, 0xf7, 0xc4, 0xe1, 0x52, 0xd7, - 0x50, 0xcf, 0x38, 0xed, 0x76, 0x4a, 0x26, 0xd4, 0x88, 0x1f, 0xd9, 0x8b, 0x6e, 0xb6, 0x46, 0xef, - 0xdb, 0xf4, 0xa9, 0xe0, 0x4a, 0x57, 0x05, 0xb3, 0xf2, 0xb2, 0x66, 0x77, 0xbe, 0x3c, 0x8d, 0x2f, - 0x69, 0x43, 0x31, 0x5e, 0x2b, 0x44, 0x5d, 0xd0, 0xaf, 0xae, 0x57, 0xbb, 0xea, 0x52, 0x3f, 0x60, - 0x57, 0x75, 0x5d, 0xdc, 0x49, 0x3d, 0x7e, 0x56, 0x44, 0xd4, 0x37, 0xd6, 0xaf, 0xbe, 0x17, 0xba, - 0xea, 0x9b, 0xae, 0xef, 0x74, 0xd7, 0x93, 0xe0, 0x49, 0xde, 0x84, 0x71, 0x09, 0xc1, 0xf9, 0x21, - 0xb2, 0x9a, 0xf2, 0x07, 0x71, 0x76, 0x30, 0x62, 0x55, 0x4f, 0xfc, 0xa6, 0x22, 0xab, 0xd4, 0x5c, - 0x3a, 0xc6, 0x35, 0xea, 0xa4, 0x54, 0xe8, 0xc8, 0xe4, 0x7d, 0x18, 0x5b, 0x6e, 0xb2, 0x8e, 0x78, - 0x2d, 0x27, 0xa4, 0x68, 0x4e, 0xc5, 0xa7, 0x27, 0x4a, 0x89, 0x22, 0xaa, 0x3c, 0xdf, 0x76, 0x5c, - 0xa4, 0x9a, 0xa3, 0x0a, 0x05, 0x1b, 0x3c, 0xee, 0xb9, 0x14, 0x32, 0x1c, 0x08, 0xe3, 0xe9, 0xe9, - 0x94, 0x13, 0x0c, 0x85, 0x3d, 0x5a, 0x23, 0xdc, 0x21, 0x6a, 0x8b, 0x09, 0xa1, 0x0d, 0x9e, 0xce, - 0x93, 0xbc, 0x05, 0x63, 0x22, 0x6d, 0x41, 0xc9, 0x5a, 0x0d, 0x66, 0x8b, 0xf1, 0x8b, 0x14, 0x32, - 0xc3, 0x81, 0xed, 0xf8, 0x89, 0x63, 0xec, 0x18, 0x9f, 0x7c, 0x16, 0x66, 0xb6, 0xdd, 0x56, 0xdd, - 0xbb, 0x1f, 0x88, 0x65, 0x4a, 0x28, 0xba, 0xa9, 0x38, 0x58, 0xef, 0x3e, 0x2f, 0xb7, 0xa5, 0x1d, - 0xd1, 0xa5, 0xf8, 0x52, 0x39, 0x90, 0x1f, 0xeb, 0xe2, 0xcc, 0x25, 0x88, 0xf4, 0x93, 0xa0, 0xf9, - 0x2e, 0x09, 0xea, 0xae, 0x3e, 0x29, 0x4e, 0xa9, 0xd5, 0x10, 0x0f, 0x88, 0x6e, 0x35, 0xbf, 0xeb, - 0xb9, 0xad, 0xd9, 0x69, 0xed, 0xf5, 0xc8, 0x68, 0x15, 0x43, 0xbc, 0x75, 0xaf, 0xe1, 0xd6, 0x0e, - 0x65, 0x12, 0x7f, 0xdd, 0x1e, 0xff, 0xc0, 0xd3, 0xdc, 0x63, 0x29, 0xac, 0xc9, 0xfb, 0x50, 0x60, - 0xff, 0x47, 0x9b, 0x97, 0x19, 0xed, 0xcc, 0x5b, 0xc1, 0x14, 0xf5, 0xe0, 0x37, 0xc2, 0xbc, 0x0a, - 0x29, 0xfb, 0x1a, 0x8d, 0x15, 0x79, 0x1d, 0x80, 0x19, 0x4e, 0x42, 0x1d, 0x9f, 0x8e, 0x93, 0x5f, - 0xa0, 0x7d, 0xd5, 0xad, 0x88, 0x63, 0x64, 0xb6, 0xa3, 0x62, 0xbf, 0xaa, 0x9d, 0xba, 0xc7, 0xe6, - 0xc6, 0x19, 0xa4, 0xc5, 0x1d, 0x15, 0xd2, 0x06, 0x1c, 0xae, 0x4a, 0x87, 0x82, 0x6e, 0x7e, 0xdf, - 0x80, 0x99, 0xb4, 0x41, 0x3a, 0x26, 0x05, 0x9f, 0x99, 0x08, 0xbb, 0x41, 0x97, 0x1e, 0x0f, 0xbb, - 0x89, 0x82, 0x6d, 0xe6, 0x60, 0xe8, 0x8e, 0xdb, 0xaa, 0xcb, 0xb0, 0x50, 0x5c, 0x87, 0x0f, 0x18, - 0xc0, 0xe2, 0x70, 0x86, 0xc0, 0x6f, 0xad, 0xb0, 0x85, 0x7a, 0x88, 0x23, 0xe0, 0x25, 0x15, 0x8b, - 0xc3, 0x19, 0x02, 0x5b, 0xef, 0xe5, 0xfa, 0x84, 0x08, 0xcc, 0x0c, 0x08, 0x2c, 0x0e, 0x27, 0x97, - 0x60, 0x64, 0xad, 0xb5, 0x42, 0x9d, 0x7b, 0x54, 0x9c, 0x79, 0xa3, 0x0b, 0xd2, 0x6b, 0xd9, 0x0d, - 0x06, 0xb3, 0x64, 0xa1, 0xf9, 0x6d, 0x03, 0xa6, 0xba, 0xbe, 0xcf, 0xf1, 0x59, 0x06, 0xfb, 0x07, - 0x18, 0x0c, 0xd2, 0x3f, 0xde, 0xfc, 0x5c, 0x7a, 0xf3, 0xcd, 0xdf, 0xce, 0xc1, 0xd9, 0x1e, 0xcb, - 0x65, 0x1c, 0x1c, 0x64, 0x1c, 0x1b, 0x1c, 0xf4, 0x79, 0xb6, 0x3c, 0x39, 0x6e, 0x33, 0xd8, 0xf0, - 0xe2, 0x16, 0xc7, 0xe7, 0xa8, 0x58, 0x26, 0x33, 0x70, 0xc9, 0x6c, 0x51, 0xe7, 0x6a, 0x48, 0x61, - 0x87, 0x5e, 0xd7, 0x39, 0x8f, 0xce, 0xac, 0x2b, 0x3c, 0x27, 0xfb, 0x57, 0x24, 0x3c, 0x47, 0x3f, - 0x14, 0xcf, 0x3d, 0xd6, 0x43, 0xf1, 0xf4, 0x83, 0xad, 0xa1, 0x47, 0x39, 0x49, 0x5e, 0x80, 0xf1, - 0x2a, 0x75, 0xfc, 0xda, 0x7e, 0x29, 0xe0, 0x1f, 0x89, 0xa7, 0x50, 0xc6, 0xb5, 0x20, 0xc0, 0x02, - 0xdb, 0x09, 0xba, 0xbf, 0x85, 0x46, 0x63, 0xfe, 0x9b, 0x44, 0x54, 0xd1, 0x5f, 0x45, 0x79, 0x79, - 0x09, 0x86, 0xb6, 0xf7, 0xa9, 0x2f, 0xad, 0x73, 0x6c, 0xc8, 0x7d, 0x06, 0x50, 0x1b, 0x82, 0x18, - 0xe6, 0x57, 0xa0, 0xa0, 0x56, 0x86, 0x0a, 0x81, 0xfd, 0x16, 0x33, 0x92, 0x2b, 0x04, 0x06, 0xb0, - 0x38, 0xfc, 0xd8, 0xcc, 0x9f, 0xf1, 0x28, 0x64, 0x8f, 0x1b, 0x05, 0x56, 0x39, 0xca, 0x9b, 0x52, - 0x39, 0xfe, 0x56, 0x2b, 0x0f, 0x19, 0xc0, 0xe2, 0xf0, 0xc7, 0x5a, 0xf9, 0x3f, 0x37, 0x20, 0x87, - 0x09, 0x93, 0x5e, 0x83, 0x51, 0x79, 0x4e, 0xa2, 0x26, 0x11, 0x9a, 0x96, 0xc7, 0x28, 0x81, 0x1e, - 0x13, 0x26, 0x80, 0xac, 0xaa, 0x2d, 0xea, 0xef, 0x68, 0xa1, 0x83, 0xf7, 0x18, 0x40, 0xad, 0x0a, - 0x31, 0x4e, 0xf0, 0x3d, 0x30, 0x3c, 0x52, 0xb8, 0x39, 0xb8, 0xca, 0xe2, 0xe1, 0x91, 0x5d, 0x3e, - 0x0d, 0x89, 0x65, 0xfe, 0x92, 0x01, 0xa7, 0x53, 0x4d, 0x28, 0x56, 0x2b, 0xb7, 0xd5, 0x14, 0x71, - 0x4c, 0x1a, 0x6a, 0x1c, 0xe3, 0x24, 0x61, 0x90, 0x27, 0x90, 0xad, 0x67, 0x61, 0x34, 0xda, 0xc0, - 0x93, 0x19, 0xf9, 0xe9, 0xd0, 0x99, 0x2e, 0xf7, 0x81, 0x7f, 0x69, 0xc0, 0x30, 0x6b, 0xc2, 0x13, - 0x7b, 0x2b, 0x2e, 0xfd, 0x68, 0x85, 0x75, 0x69, 0xa0, 0xbb, 0x70, 0xbf, 0x3e, 0x0c, 0x10, 0x23, - 0x93, 0x1d, 0x98, 0x58, 0x5b, 0xae, 0x2c, 0x2c, 0xd7, 0x69, 0x2b, 0xc4, 0xd8, 0x82, 0x44, 0x5a, - 0xa0, 0x28, 0x1b, 0x2d, 0x47, 0x38, 0x8c, 0x75, 0x83, 0xe7, 0xd6, 0x6b, 0xb6, 0x1b, 0xd1, 0xa9, - 0xb6, 0xac, 0xce, 0x91, 0xd5, 0x51, 0x2d, 0xdd, 0x5d, 0x51, 0xea, 0xc8, 0x0c, 0x58, 0x47, 0xe0, - 0x34, 0x1b, 0x3d, 0xea, 0xd0, 0x39, 0x92, 0x7d, 0x28, 0xde, 0xc6, 0xd5, 0x47, 0xa9, 0x25, 0xdb, - 0xbf, 0x96, 0xe7, 0x44, 0x2d, 0x4f, 0xf1, 0x65, 0x2b, 0xbd, 0x9e, 0x2e, 0xae, 0xb1, 0xe4, 0xe6, - 0x8e, 0x95, 0xdc, 0x9f, 0x36, 0x60, 0x98, 0x2f, 0x6f, 0xd1, 0x33, 0x92, 0xa9, 0x0b, 0xe8, 0xf6, - 0xe3, 0x59, 0x40, 0x8b, 0xa8, 0xb9, 0x34, 0xdf, 0x05, 0x2f, 0x23, 0x95, 0xc4, 0x9b, 0x94, 0xf2, - 0xfc, 0x0c, 0x6d, 0x7a, 0x5e, 0x12, 0x07, 0x93, 0xf2, 0xe7, 0x28, 0x55, 0x2e, 0x1c, 0x43, 0x7d, - 0x56, 0x7f, 0xe4, 0x11, 0x9f, 0xd5, 0x5f, 0x81, 0x51, 0x11, 0x1d, 0x59, 0x3e, 0x14, 0x3b, 0x77, - 0xe9, 0x81, 0x8b, 0xe0, 0xca, 0xa3, 0x25, 0x1c, 0x64, 0xef, 0x68, 0xa9, 0x75, 0x23, 0x44, 0xb2, - 0x06, 0xa3, 0xf1, 0x95, 0x3e, 0xfd, 0xaa, 0x7b, 0x04, 0x17, 0xd7, 0x07, 0x64, 0x88, 0x55, 0xca, - 0x0d, 0xbe, 0x98, 0x87, 0xf9, 0x0d, 0x03, 0x8a, 0x49, 0x79, 0xc1, 0x87, 0xad, 0xe4, 0xad, 0xca, - 0x28, 0xaa, 0x89, 0x3f, 0x6c, 0x15, 0x5d, 0xc3, 0xd4, 0xe2, 0x9b, 0x54, 0x74, 0x32, 0x0f, 0x79, - 0x36, 0xed, 0x5a, 0x89, 0x97, 0xad, 0x3a, 0x02, 0xa6, 0x1e, 0xea, 0x4b, 0x3c, 0x65, 0xd6, 0xfe, - 0x41, 0x16, 0xc6, 0x94, 0x8f, 0x45, 0x5e, 0x82, 0xfc, 0x72, 0xb0, 0xe2, 0xd5, 0x0e, 0x68, 0x5d, - 0x9c, 0x15, 0x8e, 0x3f, 0x3c, 0x9a, 0x1b, 0x75, 0x03, 0xbb, 0x81, 0x40, 0x2b, 0x2a, 0x26, 0x65, - 0x18, 0xe7, 0x7f, 0xc9, 0x74, 0x0b, 0x99, 0xf8, 0x9c, 0x83, 0x23, 0xcb, 0x44, 0x0b, 0xea, 0xf2, - 0xae, 0x91, 0x90, 0x2f, 0x00, 0x70, 0x00, 0xfb, 0xbe, 0x03, 0x5c, 0x8e, 0x90, 0x13, 0xf8, 0xb4, - 0xa8, 0x20, 0x74, 0xd5, 0x1e, 0xa2, 0x28, 0x28, 0x0c, 0xf1, 0xc5, 0x76, 0xaf, 0x76, 0x20, 0x85, - 0x2b, 0x77, 0x82, 0x17, 0xdb, 0xbd, 0xda, 0x81, 0x9d, 0x1e, 0x29, 0xab, 0xb2, 0x24, 0xdf, 0x34, - 0xe0, 0xbc, 0x45, 0x6b, 0xde, 0x3d, 0xea, 0x1f, 0x96, 0x42, 0xc4, 0x52, 0x6b, 0x3c, 0x3e, 0x2c, - 0xf7, 0x86, 0xa8, 0xf1, 0x45, 0x5f, 0x70, 0xc1, 0x2b, 0x7d, 0xcd, 0x76, 0x68, 0xf7, 0x69, 0x42, - 0x9f, 0x2a, 0xcd, 0xff, 0x60, 0x28, 0x53, 0x80, 0xac, 0xc2, 0x68, 0x24, 0x2c, 0xc2, 0x23, 0x1d, - 0x59, 0x66, 0x12, 0x6e, 0xd1, 0xdd, 0xf2, 0x53, 0xe2, 0x58, 0x6f, 0x3a, 0x12, 0x39, 0x6d, 0x46, - 0x48, 0x20, 0xf9, 0x0c, 0xe4, 0xf0, 0x53, 0x1d, 0x9f, 0x8c, 0x53, 0x2e, 0x35, 0x39, 0xf6, 0x8d, - 0xb0, 0xd5, 0x48, 0x49, 0x3e, 0x21, 0x62, 0xcb, 0xb2, 0x5a, 0xae, 0x7c, 0x06, 0x62, 0xed, 0x88, - 0xd6, 0x98, 0x38, 0x38, 0x5b, 0x91, 0xd6, 0x5f, 0xc8, 0x40, 0x31, 0x39, 0xf1, 0xc8, 0x3b, 0x50, - 0x90, 0xd7, 0x33, 0x97, 0x1c, 0x91, 0xc5, 0xa1, 0x20, 0xb2, 0x28, 0x08, 0xb8, 0xbd, 0xef, 0x68, - 0x29, 0x56, 0x35, 0x02, 0xb6, 0x20, 0x6f, 0x88, 0x3b, 0x3f, 0xca, 0x04, 0x0a, 0xbd, 0xb0, 0x9d, - 0x48, 0x9d, 0x2d, 0xd1, 0xc8, 0x6b, 0x90, 0xe5, 0x77, 0x96, 0xd5, 0xbc, 0x8b, 0x77, 0x6f, 0x95, - 0xf8, 0x95, 0x4b, 0x1e, 0x49, 0xa2, 0x1f, 0xc9, 0x31, 0x7c, 0xb2, 0xa2, 0xdc, 0x78, 0x1d, 0xd6, - 0x12, 0xc2, 0x49, 0x70, 0xd4, 0xb9, 0xe3, 0xaf, 0xbe, 0xbe, 0x9b, 0xcb, 0x67, 0x8b, 0x39, 0x71, - 0xc7, 0xf1, 0x37, 0xb3, 0x30, 0x1a, 0xd5, 0x4f, 0x08, 0xa0, 0xbd, 0x21, 0x42, 0x42, 0xf0, 0x6f, - 0x72, 0x0e, 0xf2, 0xd2, 0xc4, 0x10, 0x61, 0x21, 0x23, 0x81, 0x30, 0x2f, 0x66, 0x41, 0xda, 0x12, - 0xdc, 0xbc, 0xb0, 0xe4, 0x4f, 0x72, 0x1d, 0x22, 0x43, 0xa1, 0x97, 0x45, 0x91, 0x63, 0x1f, 0xcc, - 0x8a, 0xd0, 0xc8, 0x04, 0x64, 0x5c, 0x7e, 0x9f, 0x63, 0xd4, 0xca, 0xb8, 0x75, 0xf2, 0x0e, 0xe4, - 0x9d, 0x7a, 0x9d, 0xd6, 0x6d, 0x47, 0xba, 0x76, 0xfb, 0x09, 0x4d, 0x9e, 0x71, 0xe3, 0x1a, 0x1d, - 0xa9, 0x4a, 0x21, 0x29, 0xc1, 0x68, 0xc3, 0xe1, 0xc7, 0x42, 0xf5, 0x01, 0x96, 0x87, 0x98, 0x43, - 0x9e, 0x91, 0x6d, 0x06, 0xb4, 0x4e, 0x5e, 0x84, 0x1c, 0xfb, 0x9a, 0x62, 0x3d, 0x88, 0xb2, 0xe9, - 0xae, 0x6d, 0xac, 0xf3, 0x01, 0x5b, 0x3a, 0x65, 0x21, 0x02, 0x79, 0x1e, 0xb2, 0x9d, 0xf9, 0x5d, - 0xa1, 0xe9, 0x8b, 0xf1, 0x75, 0xf6, 0x08, 0x8d, 0x15, 0x93, 0x1b, 0x90, 0xbf, 0xaf, 0x5f, 0x5c, - 0x3e, 0x9d, 0xf8, 0x8c, 0x11, 0x7e, 0x84, 0x58, 0xce, 0xc3, 0x30, 0xbf, 0xb2, 0x6b, 0x3e, 0x03, - 0x10, 0x57, 0xdd, 0x1d, 0xbd, 0x63, 0x7e, 0x01, 0x46, 0xa3, 0x2a, 0xc9, 0xd3, 0x00, 0x07, 0xf4, - 0xd0, 0xde, 0x77, 0x5a, 0x75, 0xf1, 0x24, 0x5e, 0xc1, 0x1a, 0x3d, 0xa0, 0x87, 0x4b, 0x08, 0x20, - 0x67, 0x61, 0xa4, 0xcd, 0xbe, 0xaa, 0x4c, 0xfc, 0x6e, 0x0d, 0xb7, 0x3b, 0x3b, 0x4c, 0x42, 0x67, - 0x61, 0x04, 0x9d, 0x1f, 0x62, 0xa2, 0x8d, 0x5b, 0xf2, 0xa7, 0xf9, 0xab, 0x19, 0xcc, 0x6d, 0xa3, - 0xb4, 0x93, 0x3c, 0x07, 0xe3, 0x35, 0x9f, 0xe2, 0x72, 0x84, 0xaf, 0x06, 0x88, 0x7a, 0x0a, 0x31, - 0x70, 0xb9, 0x4e, 0x2e, 0xc1, 0x64, 0x9c, 0x89, 0xde, 0xae, 0xed, 0x88, 0xb4, 0x05, 0x05, 0x6b, - 0xbc, 0x2d, 0x53, 0xd1, 0x2f, 0xec, 0xe0, 0x3d, 0xa4, 0xa2, 0x7a, 0x5d, 0x37, 0x94, 0x59, 0xe5, - 0x47, 0xad, 0x49, 0x05, 0x8e, 0x27, 0x36, 0x67, 0x60, 0xd8, 0x71, 0xf6, 0x3a, 0x2e, 0xbf, 0x13, - 0x51, 0xb0, 0xc4, 0x2f, 0xf2, 0x32, 0x4c, 0x05, 0xee, 0x5e, 0xcb, 0x09, 0x3b, 0xbe, 0x48, 0x2e, - 0x44, 0x7d, 0x14, 0xa9, 0x71, 0xab, 0x18, 0x15, 0x2c, 0x70, 0x38, 0x79, 0x15, 0x88, 0x5a, 0x9f, - 0xb7, 0xf3, 0x01, 0xad, 0x71, 0x51, 0x2b, 0x58, 0x53, 0x4a, 0xc9, 0x1a, 0x16, 0x90, 0x67, 0xa1, - 0xe0, 0xd3, 0x00, 0x4d, 0x32, 0x1c, 0x36, 0x4c, 0xfd, 0x66, 0x8d, 0x49, 0xd8, 0x1d, 0x7a, 0x68, - 0x96, 0x61, 0xaa, 0x6b, 0x3e, 0x92, 0x57, 0xb9, 0x75, 0x2f, 0xd6, 0xe7, 0x02, 0xdf, 0xcc, 0xe0, - 0x6b, 0x9b, 0xda, 0xd2, 0x2c, 0x90, 0xcc, 0x16, 0x14, 0x54, 0xfd, 0x7a, 0x4c, 0x42, 0x88, 0x33, - 0x18, 0xce, 0xcc, 0x95, 0xcf, 0xf0, 0xc3, 0xa3, 0xb9, 0x8c, 0x5b, 0xc7, 0x20, 0xe6, 0xcb, 0x90, - 0x97, 0x56, 0x82, 0xfa, 0x7c, 0x9b, 0x30, 0x28, 0x0f, 0xad, 0xa8, 0xd4, 0x7c, 0x11, 0x46, 0x84, - 0x0a, 0xed, 0xef, 0x88, 0x32, 0xbf, 0x9a, 0x81, 0x49, 0x8b, 0xb2, 0x09, 0x2e, 0x1e, 0x46, 0xfb, - 0x98, 0xe5, 0xe4, 0xd7, 0xfa, 0xd6, 0x27, 0xff, 0xca, 0x6f, 0x19, 0x30, 0x9d, 0x82, 0xfb, 0xa1, - 0xb2, 0x6a, 0xde, 0x84, 0xd1, 0x8a, 0xeb, 0x34, 0x4a, 0xf5, 0x7a, 0x14, 0x96, 0x8d, 0xd6, 0x60, - 0x9d, 0x4d, 0x27, 0x87, 0x41, 0xd5, 0xc5, 0x34, 0x42, 0x25, 0x57, 0x84, 0x50, 0xc4, 0x69, 0x86, - 0x65, 0xd6, 0x7f, 0xe0, 0x6d, 0x8a, 0x73, 0xfe, 0xe3, 0x55, 0x5e, 0x0e, 0x8c, 0x4f, 0xfd, 0x9f, - 0xd8, 0x4f, 0x97, 0x7e, 0x95, 0x37, 0xd9, 0xbd, 0x81, 0xb6, 0x9d, 0xdf, 0xc8, 0xc0, 0x99, 0x74, - 0xc2, 0x0f, 0x9b, 0x20, 0x15, 0x93, 0xdf, 0x28, 0x0f, 0x2b, 0x60, 0x82, 0x54, 0x9e, 0x29, 0x07, - 0xf1, 0x63, 0x04, 0xb2, 0x0b, 0xe3, 0x2b, 0x4e, 0x10, 0x2e, 0x51, 0xc7, 0x0f, 0x77, 0xa8, 0x13, - 0x0e, 0x60, 0xc1, 0x3e, 0x2f, 0x5f, 0xbd, 0xc2, 0x45, 0x6d, 0x5f, 0x52, 0x26, 0x0c, 0x3c, 0x9d, - 0x6d, 0x24, 0x28, 0xb9, 0x01, 0x04, 0xe5, 0xcb, 0x30, 0x59, 0xa5, 0x4d, 0xa7, 0xbd, 0xef, 0xf9, - 0x54, 0xf8, 0xce, 0xaf, 0xc2, 0x78, 0x04, 0x4a, 0x95, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x06, 0x22, - 0x56, 0x25, 0x7a, 0xb1, 0xf9, 0xcb, 0x19, 0x38, 0x5b, 0xaa, 0x89, 0x13, 0x0e, 0x51, 0x20, 0x0f, - 0x62, 0x3f, 0xe2, 0xba, 0xc9, 0x35, 0x18, 0xbd, 0xeb, 0x3c, 0x58, 0xa1, 0x4e, 0x40, 0x03, 0x91, - 0x9e, 0x8e, 0x9b, 0x5f, 0xce, 0x03, 0x3b, 0x72, 0x7b, 0x59, 0x31, 0x8e, 0xba, 0xd9, 0xcc, 0x3d, - 0xe2, 0x66, 0xd3, 0x84, 0xe1, 0x25, 0xaf, 0x51, 0x17, 0x8b, 0x93, 0x38, 0xb7, 0xd8, 0x47, 0x88, - 0x25, 0x4a, 0xcc, 0xef, 0x1b, 0x30, 0x11, 0xb5, 0x18, 0x9b, 0xf0, 0x91, 0x0f, 0xc9, 0x25, 0x18, - 0xc1, 0x8a, 0xa2, 0x27, 0xff, 0x70, 0xd1, 0x68, 0x30, 0x90, 0xed, 0xd6, 0x2d, 0x59, 0xa8, 0x8e, - 0xc4, 0xd0, 0xa3, 0x8d, 0x84, 0xf9, 0xb7, 0xf0, 0x48, 0x44, 0xed, 0x25, 0x5b, 0x89, 0x94, 0x86, - 0x18, 0x03, 0x36, 0x24, 0xf3, 0xd8, 0x3e, 0x49, 0xb6, 0xe7, 0x27, 0xf9, 0x5a, 0x06, 0xc6, 0xa2, - 0xc6, 0x7e, 0xcc, 0x72, 0x60, 0x44, 0xfd, 0x1a, 0xe8, 0x6a, 0x46, 0x55, 0xd1, 0x15, 0xe2, 0x06, - 0xc4, 0x67, 0x60, 0x58, 0x4c, 0x26, 0x23, 0x71, 0x20, 0x99, 0xf8, 0xba, 0xe5, 0x09, 0xc1, 0x7a, - 0x18, 0x3f, 0x68, 0x60, 0x09, 0x3a, 0xbc, 0xfb, 0xb2, 0x4d, 0x77, 0xc4, 0x09, 0xd9, 0x13, 0xbb, - 0x46, 0xa5, 0xdf, 0x7d, 0x89, 0x3b, 0x36, 0xd0, 0xea, 0xf4, 0x7f, 0x0f, 0x41, 0x31, 0x49, 0x72, - 0x7c, 0x96, 0x91, 0xf5, 0xce, 0x8e, 0x78, 0xc7, 0x09, 0xb3, 0x8c, 0xb4, 0x3b, 0x3b, 0x16, 0x83, - 0x91, 0x4b, 0x90, 0x5b, 0xf7, 0xdd, 0x7b, 0xd8, 0x6b, 0xf1, 0x8c, 0x55, 0xdb, 0x77, 0xef, 0xa9, - 0x41, 0xe0, 0xac, 0x1c, 0x37, 0xb4, 0x2b, 0x55, 0x8c, 0x27, 0x46, 0xc3, 0x5a, 0x6c, 0x68, 0x1b, - 0x41, 0x32, 0x9d, 0x95, 0x44, 0x63, 0x4b, 0x65, 0x99, 0x3a, 0xbe, 0xc8, 0x88, 0x21, 0xd4, 0x19, - 0x2e, 0x95, 0x3b, 0x08, 0xe6, 0x49, 0xda, 0x2d, 0x15, 0x89, 0x34, 0x80, 0x28, 0x3f, 0xe5, 0x04, - 0x3e, 0x7e, 0x8f, 0x27, 0xdf, 0x7d, 0x9c, 0x51, 0x59, 0xdb, 0xea, 0x6c, 0x4e, 0xe1, 0xfb, 0x38, - 0x7d, 0x84, 0xeb, 0xe2, 0x7e, 0x24, 0x3a, 0x32, 0xf2, 0xc7, 0x32, 0x93, 0x01, 0xf7, 0xc0, 0xef, - 0x4f, 0x46, 0xee, 0x8c, 0x98, 0x09, 0x79, 0x1b, 0xc6, 0xd4, 0x28, 0x71, 0x1e, 0xcb, 0x7c, 0x81, - 0xdf, 0x4b, 0xec, 0x91, 0x27, 0x54, 0x25, 0x20, 0x3b, 0x70, 0x76, 0xc1, 0x6b, 0x05, 0x9d, 0x26, - 0xad, 0x6b, 0x27, 0xb8, 0xcb, 0x15, 0xdc, 0x60, 0x8e, 0xf2, 0x08, 0xd1, 0x9a, 0x40, 0x11, 0x41, - 0xc9, 0x32, 0xda, 0x43, 0xdf, 0x80, 0xf4, 0x62, 0x64, 0x7e, 0x42, 0x95, 0x44, 0x61, 0x18, 0xf4, - 0x95, 0x44, 0xf3, 0x17, 0x71, 0xab, 0xd0, 0xf4, 0x42, 0x2a, 0x2c, 0xa4, 0x27, 0x56, 0x57, 0xc6, - 0x6e, 0xea, 0x21, 0x2d, 0x60, 0x47, 0xeb, 0x1d, 0xc7, 0xd8, 0xba, 0x11, 0x2b, 0x36, 0xee, 0xb0, - 0x96, 0x6e, 0x6a, 0x65, 0x5a, 0xff, 0x86, 0x01, 0xa7, 0x53, 0x69, 0xc9, 0x55, 0x80, 0xd8, 0x0e, - 0x15, 0xa3, 0xc4, 0x33, 0xec, 0x47, 0x50, 0x4b, 0xc1, 0x20, 0x9f, 0x4f, 0x5a, 0x90, 0xc7, 0x2f, - 0x80, 0xf2, 0xd9, 0xab, 0x09, 0xdd, 0x82, 0x4c, 0xb1, 0x1b, 0xcd, 0xdf, 0xca, 0xc2, 0x54, 0xd7, - 0x33, 0xd2, 0xc7, 0x44, 0x2a, 0x1c, 0x24, 0x5e, 0xf4, 0xe4, 0x47, 0x2a, 0x57, 0x7a, 0x3d, 0x62, - 0x9d, 0xf2, 0xbe, 0x27, 0xba, 0xde, 0xc4, 0xe3, 0x0e, 0xc7, 0x3c, 0xf3, 0x19, 0xa4, 0xbf, 0x1f, - 0xfb, 0x72, 0xcf, 0xda, 0x1e, 0xc3, 0x3b, 0xb2, 0x7f, 0x85, 0x9f, 0xcc, 0xfc, 0xc5, 0x0c, 0x4c, - 0x77, 0xf5, 0xf9, 0x89, 0x9d, 0x75, 0x9f, 0xd1, 0x56, 0xd0, 0x67, 0x7a, 0x7d, 0xd3, 0x81, 0x2c, - 0x95, 0x3f, 0x31, 0xe0, 0x6c, 0x0f, 0x4a, 0x72, 0x98, 0x14, 0x22, 0x6e, 0xb9, 0x5c, 0xef, 0x5f, - 0xe1, 0x63, 0x11, 0xa5, 0x8f, 0x4c, 0x12, 0xd8, 0x76, 0x3f, 0x6e, 0xf8, 0x13, 0xfe, 0x56, 0x7a, - 0xfa, 0x76, 0x3f, 0xd9, 0xbd, 0x81, 0xe4, 0xe0, 0x0f, 0x32, 0x70, 0x26, 0x9d, 0xf0, 0x49, 0x7f, - 0x39, 0xbd, 0x04, 0x23, 0x42, 0x3e, 0x13, 0x1e, 0xad, 0x14, 0x85, 0xa0, 0xdf, 0x5a, 0x97, 0x74, - 0x1f, 0xee, 0x4d, 0xf5, 0xaf, 0x66, 0x00, 0xb6, 0xe9, 0xce, 0x93, 0x9d, 0x10, 0xf0, 0x53, 0x9a, - 0x84, 0x29, 0xee, 0xf8, 0xc1, 0xf3, 0x01, 0xae, 0xa1, 0x5b, 0x7c, 0xf0, 0x6c, 0x80, 0xd1, 0x23, - 0x72, 0x99, 0xf4, 0x47, 0xe4, 0xcc, 0x1d, 0x98, 0xb9, 0x4d, 0xc3, 0xd8, 0xe6, 0x92, 0x1e, 0x91, - 0xfe, 0x6c, 0x5f, 0x81, 0x51, 0x81, 0xaf, 0xbf, 0xd0, 0x23, 0x23, 0x4b, 0xdd, 0xba, 0x15, 0x23, - 0x98, 0x14, 0xce, 0x56, 0x68, 0x83, 0x86, 0xf4, 0xa3, 0xad, 0xa6, 0x0a, 0x84, 0x77, 0x85, 0xbf, - 0x2d, 0x36, 0x50, 0x0d, 0xc7, 0x8e, 0xcf, 0x16, 0x9c, 0x8e, 0xda, 0xfe, 0x38, 0xf9, 0x5e, 0x63, - 0x56, 0xab, 0xb8, 0x36, 0x1e, 0x73, 0xec, 0xe3, 0x12, 0x7f, 0x00, 0xe7, 0x25, 0xc1, 0xb6, 0x1b, - 0x9d, 0x2b, 0x0e, 0x44, 0x4b, 0xde, 0x84, 0x31, 0x85, 0x46, 0x24, 0xbf, 0xc0, 0xb3, 0xfb, 0xfb, - 0x6e, 0xb8, 0x6f, 0x07, 0x1c, 0xae, 0x9e, 0xdd, 0x2b, 0xe8, 0xe6, 0xe7, 0xe0, 0xa9, 0x28, 0x0a, - 0x2b, 0xa5, 0xea, 0x04, 0x73, 0xe3, 0x64, 0xcc, 0x57, 0xe3, 0x6e, 0x2d, 0xb7, 0xa2, 0x8b, 0x24, - 0x92, 0x37, 0x51, 0xbb, 0x25, 0x3a, 0x73, 0x41, 0x49, 0x94, 0x2a, 0xac, 0x9e, 0x18, 0x60, 0xbe, - 0xa1, 0x34, 0x36, 0x85, 0xa1, 0x46, 0x6c, 0x24, 0x89, 0xbf, 0x9a, 0x81, 0xc9, 0xb5, 0xe5, 0xca, - 0x42, 0x74, 0x28, 0xf2, 0x31, 0xcb, 0x56, 0xa8, 0xf5, 0xad, 0xb7, 0xbe, 0x31, 0x37, 0x61, 0x3a, - 0x31, 0x0c, 0xf8, 0x74, 0xe2, 0xdb, 0x3c, 0x5a, 0x2a, 0x02, 0x4b, 0x1b, 0xe6, 0x4c, 0x1a, 0xfb, - 0xad, 0x1b, 0x56, 0x02, 0xdb, 0xfc, 0xf7, 0xf9, 0x04, 0x5f, 0xa1, 0xc2, 0x5e, 0x81, 0xd1, 0xe5, - 0x20, 0xe8, 0x50, 0x7f, 0xd3, 0x5a, 0x51, 0x77, 0x23, 0x2e, 0x02, 0xed, 0x8e, 0xdf, 0xb0, 0x62, - 0x04, 0xf2, 0x12, 0xe4, 0xc5, 0x55, 0x65, 0xa9, 0x13, 0x30, 0xf8, 0x23, 0xba, 0xe9, 0x6c, 0x45, - 0xc5, 0xe4, 0x35, 0x28, 0xf0, 0xbf, 0xb9, 0xb4, 0x89, 0x01, 0x47, 0xcf, 0xab, 0x40, 0xe7, 0xd2, - 0x69, 0x69, 0x68, 0xe4, 0x45, 0x18, 0x93, 0x0f, 0xbc, 0xb3, 0x16, 0x71, 0x7f, 0xb6, 0xb8, 0xec, - 0xa4, 0x96, 0x90, 0x2b, 0x90, 0x2d, 0x2d, 0x58, 0xea, 0x0b, 0x1e, 0x4e, 0xcd, 0xe7, 0x2f, 0xf9, - 0x68, 0x6f, 0x9e, 0x96, 0x16, 0x2c, 0x32, 0x8f, 0xcb, 0xde, 0x3d, 0xb7, 0x4e, 0x7d, 0x11, 0xb8, - 0x8d, 0xa2, 0xd2, 0x16, 0xb0, 0xc4, 0xaa, 0x87, 0x30, 0x72, 0x0d, 0x46, 0x2a, 0x6e, 0xd0, 0x6e, - 0x38, 0x87, 0x22, 0x37, 0x19, 0x4f, 0x76, 0xc4, 0x41, 0xaa, 0x70, 0x09, 0x2c, 0xf2, 0x12, 0x0c, - 0x55, 0x6b, 0x5e, 0x9b, 0xce, 0xe6, 0xe3, 0xe8, 0xac, 0x80, 0x01, 0xb4, 0x94, 0x40, 0x0c, 0x80, - 0x29, 0x33, 0xf8, 0xcd, 0xdf, 0x51, 0x25, 0x65, 0x46, 0xf2, 0xc6, 0xaf, 0xc0, 0xe9, 0x8e, 0x9f, - 0x85, 0xc7, 0x19, 0x3f, 0xbb, 0x03, 0x67, 0x6f, 0xe3, 0x4e, 0x92, 0x99, 0x4a, 0x6e, 0x8d, 0x8a, - 0xf7, 0x31, 0x37, 0xad, 0x65, 0x71, 0xdb, 0x19, 0x3d, 0x0b, 0x7c, 0xb3, 0x69, 0x07, 0x1c, 0x47, - 0x3e, 0xad, 0x99, 0x78, 0xa5, 0xab, 0x17, 0x23, 0xf2, 0x59, 0x98, 0x49, 0x2b, 0x12, 0xf7, 0x9e, - 0xf1, 0x4e, 0x48, 0x7a, 0x05, 0xea, 0xa5, 0x8c, 0x34, 0x0e, 0x64, 0x05, 0x8a, 0x1c, 0x5e, 0xaa, - 0x37, 0xdd, 0xd6, 0x62, 0xd3, 0x71, 0x1b, 0x78, 0x0b, 0x5a, 0x5c, 0x65, 0x17, 0x5c, 0x1d, 0x56, - 0x68, 0x53, 0x56, 0xaa, 0x05, 0xd8, 0x25, 0x28, 0xc9, 0xcf, 0x19, 0x50, 0x50, 0x64, 0x2c, 0x10, - 0xb7, 0x77, 0x7a, 0xbd, 0x7c, 0xb6, 0xf1, 0x98, 0x5e, 0x3e, 0x2b, 0xf8, 0xa2, 0x4e, 0x9c, 0x6e, - 0x5a, 0x0b, 0x30, 0xf7, 0x75, 0xa3, 0xe1, 0xdd, 0xdf, 0x6c, 0xdd, 0xa3, 0xbe, 0xbb, 0xeb, 0xd2, - 0x3a, 0xef, 0xe4, 0x24, 0xaa, 0x7a, 0x9e, 0xfb, 0x1a, 0xb3, 0x93, 0x77, 0x22, 0x84, 0xae, 0x8e, - 0xa6, 0x72, 0x20, 0x65, 0x18, 0x97, 0xe1, 0x5e, 0x3c, 0x0a, 0xba, 0x18, 0x47, 0x67, 0xc9, 0xd8, - 0x30, 0x1b, 0xc5, 0x48, 0x15, 0x1e, 0x8d, 0xc4, 0xfc, 0x17, 0x23, 0x5c, 0x69, 0x97, 0x3a, 0xe1, - 0xbe, 0x54, 0xf3, 0xf3, 0x69, 0xc1, 0x6a, 0xfc, 0x50, 0x4d, 0x09, 0x56, 0xd3, 0x43, 0xd4, 0xe4, - 0xe1, 0x77, 0x26, 0xf5, 0xf0, 0xfb, 0x15, 0x18, 0xc5, 0xa7, 0x26, 0xa2, 0xa8, 0xa0, 0xbc, 0xf0, - 0x98, 0x30, 0x20, 0xbf, 0x0d, 0x1c, 0x23, 0x90, 0x6b, 0x00, 0x98, 0x78, 0x8b, 0xdb, 0x00, 0x4a, - 0x3a, 0x07, 0xcc, 0xcf, 0x25, 0xfc, 0x94, 0x0a, 0x0a, 0xb2, 0xaf, 0x5a, 0xb7, 0x54, 0xc7, 0x26, - 0x67, 0x1f, 0xf8, 0xbb, 0x02, 0x3d, 0x46, 0x60, 0xdd, 0x53, 0x15, 0xd4, 0x70, 0xdc, 0x3d, 0xed, - 0x2b, 0x6a, 0xba, 0xea, 0x15, 0xf5, 0xe1, 0xfe, 0x11, 0x74, 0xb8, 0xf2, 0x33, 0xc3, 0x28, 0x5c, - 0x42, 0x7d, 0xae, 0xff, 0x53, 0x30, 0xb2, 0x40, 0xfd, 0x70, 0x63, 0x63, 0x45, 0x3c, 0x17, 0xf7, - 0x34, 0x5b, 0x68, 0xf0, 0x3a, 0x79, 0x18, 0x36, 0x7e, 0x70, 0x34, 0x37, 0x1e, 0xba, 0x4d, 0x7a, - 0x35, 0x72, 0x14, 0x4a, 0x6c, 0x52, 0x86, 0x22, 0x8f, 0xeb, 0x8a, 0x6d, 0x3d, 0x54, 0x30, 0x79, - 0xae, 0xee, 0xc4, 0x15, 0xea, 0xfb, 0x74, 0x27, 0xba, 0x4c, 0xdf, 0x85, 0x4f, 0x16, 0x65, 0x52, - 0x0b, 0xb5, 0x93, 0xdc, 0xc5, 0x78, 0x56, 0x79, 0x7a, 0x4a, 0xeb, 0x6b, 0x37, 0x05, 0x29, 0xc1, - 0xf8, 0x82, 0xd7, 0x6c, 0x3b, 0xa1, 0x8b, 0x99, 0xc3, 0x0e, 0x85, 0x2e, 0x41, 0xc7, 0x4f, 0x4d, - 0x2d, 0xd0, 0x5f, 0x8e, 0x50, 0x0a, 0xc8, 0x2d, 0x98, 0xb0, 0xbc, 0x0e, 0xfb, 0x48, 0x72, 0xd7, - 0xc3, 0xd5, 0x45, 0xf4, 0x26, 0x11, 0xfb, 0x96, 0xb6, 0xd8, 0xe2, 0x68, 0xf7, 0xd9, 0x34, 0x2a, - 0xb2, 0x9a, 0xe2, 0xe1, 0x52, 0x75, 0x84, 0x7a, 0xa5, 0xbe, 0x8b, 0x59, 0x8a, 0x73, 0xec, 0x06, - 0x8c, 0x55, 0xab, 0x6b, 0x1b, 0x34, 0x08, 0x6f, 0x35, 0xbc, 0xfb, 0xa8, 0x22, 0xf2, 0xf2, 0x95, - 0x6e, 0xcf, 0x0e, 0x69, 0x10, 0xda, 0xbb, 0x0d, 0xef, 0xbe, 0xa5, 0x62, 0x91, 0x2f, 0x2a, 0x4f, - 0x69, 0xa0, 0x71, 0x30, 0x79, 0xac, 0x71, 0x90, 0x78, 0x66, 0x83, 0x99, 0x08, 0xa9, 0xcf, 0x6c, - 0x30, 0x74, 0x0c, 0x71, 0x63, 0xfb, 0xb5, 0x52, 0xbd, 0xee, 0xd3, 0x20, 0x10, 0x73, 0x59, 0x79, - 0x28, 0xc8, 0xe1, 0x05, 0x5a, 0x88, 0x9b, 0x42, 0x80, 0xe6, 0x57, 0xb5, 0x74, 0x77, 0x25, 0xb6, - 0x21, 0x3e, 0x5e, 0x51, 0x1f, 0x5a, 0xdf, 0xfa, 0x44, 0x7d, 0x6c, 0xc2, 0x74, 0x62, 0x18, 0xa4, - 0xf9, 0xa5, 0x81, 0x93, 0xe6, 0x57, 0x82, 0xc6, 0x4a, 0x60, 0x9b, 0x7f, 0x67, 0x24, 0xc1, 0x57, - 0x9c, 0xf4, 0x98, 0x30, 0xcc, 0xad, 0x2b, 0x35, 0x6f, 0x33, 0xb7, 0xbd, 0x2c, 0x51, 0x42, 0xce, - 0x41, 0xb6, 0x5a, 0x5d, 0x53, 0xb3, 0xca, 0x07, 0x81, 0x67, 0x31, 0x18, 0xfb, 0x42, 0x78, 0x88, - 0xa3, 0xdc, 0x4c, 0x67, 0x7a, 0xc2, 0x42, 0x28, 0x1b, 0x6f, 0x69, 0xc2, 0xe4, 0xe2, 0xf1, 0x16, - 0x26, 0x4c, 0x6c, 0xb8, 0x2c, 0xc0, 0x6c, 0x29, 0x08, 0xa8, 0xcf, 0x1f, 0x65, 0xc2, 0xb3, 0x01, - 0x5f, 0x2c, 0xb3, 0x42, 0x1d, 0x62, 0xa5, 0x4e, 0x2d, 0xb0, 0x7a, 0x22, 0x92, 0xcb, 0x90, 0x2f, - 0x75, 0xea, 0x2e, 0x6d, 0xd5, 0xb4, 0xbb, 0x71, 0x8e, 0x80, 0x59, 0x51, 0x29, 0x79, 0x0f, 0x4e, - 0x0b, 0x22, 0x69, 0x6b, 0x89, 0x11, 0x18, 0x89, 0x65, 0x56, 0x9a, 0x01, 0xd2, 0x42, 0xb3, 0xc5, - 0x90, 0xa4, 0x53, 0x92, 0x12, 0x14, 0x17, 0x31, 0xca, 0xa9, 0x42, 0x83, 0x9a, 0xef, 0xb6, 0x43, - 0xcf, 0x17, 0x4f, 0x9e, 0xa0, 0xd1, 0xc6, 0x23, 0xa0, 0xec, 0x7a, 0x54, 0x68, 0x75, 0xa1, 0x93, - 0x3b, 0x30, 0x9d, 0x84, 0x31, 0xcd, 0x37, 0x1a, 0x3f, 0x29, 0xde, 0xc5, 0x05, 0x75, 0x5f, 0x1a, - 0x15, 0xd9, 0x81, 0xa9, 0x52, 0x18, 0xfa, 0xee, 0x4e, 0x27, 0xa4, 0x09, 0xab, 0x4d, 0x1e, 0x13, - 0x46, 0xe5, 0xd2, 0x72, 0x7b, 0x4a, 0x08, 0xe3, 0xb4, 0x13, 0x51, 0x46, 0xd6, 0x9b, 0xd5, 0xcd, - 0x8e, 0xd4, 0x61, 0xa2, 0xea, 0xee, 0xb5, 0xdc, 0xd6, 0x9e, 0x78, 0xb9, 0x5f, 0xdc, 0xa4, 0x96, - 0xc7, 0xb1, 0xa5, 0xe0, 0xb0, 0xd9, 0xa4, 0xa1, 0x8f, 0x6b, 0x0a, 0xbe, 0xec, 0x6f, 0x8a, 0x08, - 0xde, 0xf3, 0x01, 0xa7, 0xc3, 0x30, 0xbd, 0xb6, 0xe3, 0x6a, 0xca, 0x53, 0xe7, 0xa9, 0x59, 0xce, - 0x85, 0x01, 0x2d, 0xe7, 0x06, 0x4c, 0x2d, 0xb6, 0x6a, 0xfe, 0x21, 0x26, 0xae, 0x90, 0x8d, 0x1b, - 0x3f, 0xa6, 0x71, 0xf2, 0x1d, 0xcd, 0x0b, 0x8e, 0x94, 0xb0, 0xb4, 0xe6, 0x75, 0x33, 0x26, 0x55, - 0xf1, 0xbe, 0xcb, 0x72, 0x65, 0x7d, 0xb9, 0xe5, 0x86, 0x2e, 0x66, 0x50, 0xe6, 0x4a, 0xf9, 0x05, - 0xc1, 0xf3, 0x69, 0x6e, 0x21, 0xb9, 0xf5, 0xb6, 0xed, 0x4a, 0x94, 0xae, 0x07, 0x5c, 0x54, 0x7a, - 0xf3, 0x4f, 0x86, 0xb9, 0x36, 0x54, 0xed, 0x9a, 0x33, 0x4a, 0x46, 0x51, 0x35, 0x04, 0x2f, 0x61, - 0xef, 0x64, 0x4e, 0x62, 0xef, 0x64, 0x8f, 0xb7, 0x77, 0x72, 0xc7, 0xd9, 0x3b, 0x09, 0x83, 0x64, - 0xe8, 0xc4, 0x06, 0xc9, 0xf0, 0x09, 0x0c, 0x92, 0x91, 0x13, 0x19, 0x24, 0x9a, 0x65, 0x95, 0x3f, - 0xce, 0xb2, 0xfa, 0x3f, 0xe6, 0xcb, 0x93, 0x6a, 0xbe, 0xa4, 0x2d, 0xae, 0x27, 0x31, 0x5f, 0xcc, - 0x1f, 0x85, 0x62, 0x52, 0x21, 0x1e, 0x7f, 0x5d, 0xfa, 0xb1, 0xdd, 0x8e, 0x64, 0xea, 0x3a, 0xa9, - 0x90, 0xd8, 0x36, 0x62, 0xdd, 0x77, 0xef, 0x39, 0x21, 0x8d, 0x9f, 0xfa, 0xc0, 0x6d, 0x44, 0x9b, - 0x43, 0x71, 0x92, 0x28, 0x28, 0xd1, 0x5a, 0x9c, 0x49, 0x5b, 0x8b, 0xcd, 0xaf, 0x67, 0x60, 0x8a, - 0x5f, 0xe8, 0x7a, 0xf2, 0x1d, 0x5c, 0x6f, 0x6b, 0x16, 0x96, 0x3c, 0x2a, 0x4f, 0xf4, 0xae, 0x8f, - 0x8b, 0xeb, 0x0b, 0x70, 0xba, 0x6b, 0x28, 0xd0, 0xca, 0xaa, 0xc8, 0xab, 0x74, 0x5d, 0x76, 0xd6, - 0x6c, 0x7a, 0x25, 0x5b, 0x37, 0xac, 0x2e, 0x0a, 0xf3, 0x2f, 0x32, 0x5d, 0xfc, 0x85, 0xb3, 0x4b, - 0x75, 0x5f, 0x19, 0x27, 0x73, 0x5f, 0x65, 0x06, 0x73, 0x5f, 0x25, 0x94, 0x71, 0x76, 0x10, 0x65, - 0xfc, 0x1e, 0x8c, 0x6f, 0x50, 0xa7, 0x19, 0x6c, 0x78, 0x22, 0x55, 0x06, 0xbf, 0x5c, 0x2e, 0x6f, - 0xca, 0xb1, 0x32, 0x69, 0x24, 0x44, 0x69, 0x76, 0x42, 0x46, 0xc0, 0x14, 0x08, 0xcf, 0x9d, 0x61, - 0xe9, 0x1c, 0x54, 0xcb, 0x6f, 0xa8, 0x8f, 0xe5, 0x57, 0x85, 0x82, 0xa0, 0x8b, 0xef, 0x88, 0x2b, - 0x6f, 0xb5, 0x52, 0xa7, 0x89, 0x70, 0x59, 0x7b, 0x94, 0x58, 0x32, 0xaa, 0x9d, 0x5b, 0x27, 0x1a, - 0x13, 0xf3, 0xef, 0x8d, 0x48, 0x49, 0xff, 0x68, 0xbd, 0x02, 0xfa, 0x3e, 0x3f, 0x7b, 0xc2, 0x7d, - 0x7e, 0xee, 0xb8, 0xd5, 0x48, 0x5b, 0x22, 0x87, 0x4e, 0xb0, 0x44, 0x0e, 0x3f, 0xf2, 0x9e, 0x7d, - 0xe4, 0x84, 0x8b, 0x5e, 0x42, 0xe8, 0xf2, 0x83, 0x08, 0x5d, 0xea, 0x42, 0x39, 0xfa, 0xe8, 0x0b, - 0x25, 0x9c, 0x78, 0xa1, 0x54, 0xde, 0xa8, 0x18, 0x1b, 0xe8, 0x8d, 0x0a, 0x63, 0x80, 0x37, 0x2a, - 0x3e, 0x56, 0xab, 0xef, 0x97, 0xd2, 0x57, 0xdf, 0xfe, 0x8a, 0xf7, 0x44, 0xeb, 0xaf, 0x8f, 0xcd, - 0xda, 0x76, 0x7c, 0x66, 0xfb, 0x07, 0xe4, 0x1a, 0x8c, 0xc8, 0x2b, 0x9b, 0x46, 0xbc, 0x8d, 0xea, - 0xbe, 0xab, 0x29, 0xb1, 0xd8, 0x36, 0x41, 0x12, 0x8b, 0xeb, 0x0d, 0xfc, 0x76, 0x9a, 0x80, 0x69, - 0xb7, 0xd3, 0x04, 0xcc, 0xfc, 0xeb, 0x39, 0x29, 0xfa, 0xcc, 0x8c, 0x15, 0x39, 0xa0, 0xbb, 0x9e, - 0x1c, 0x35, 0x4e, 0xfe, 0xe4, 0xe8, 0x87, 0xb8, 0xef, 0xaa, 0x24, 0x64, 0xcb, 0x0e, 0x90, 0x90, - 0xed, 0x75, 0x2d, 0x9b, 0x59, 0x2e, 0x4e, 0x9f, 0xc3, 0xc4, 0xa1, 0x7f, 0x1e, 0xb3, 0x9b, 0x6a, - 0xda, 0xb1, 0xa1, 0xf8, 0x26, 0x08, 0x52, 0xf6, 0x49, 0x38, 0x16, 0x99, 0x33, 0xc3, 0x27, 0xb9, - 0xfb, 0x3d, 0xf2, 0xbf, 0xf5, 0xee, 0xf7, 0x22, 0x80, 0x92, 0x18, 0x98, 0xfb, 0x32, 0x5f, 0x60, - 0xc3, 0x74, 0x7c, 0x52, 0x60, 0x85, 0xd0, 0xfc, 0xb3, 0x29, 0x98, 0xaa, 0x56, 0xd7, 0x2a, 0xae, - 0xb3, 0xd7, 0xf2, 0x82, 0xd0, 0xad, 0x2d, 0xb7, 0x76, 0x3d, 0xb6, 0x96, 0x47, 0xd3, 0x48, 0xb9, - 0x87, 0x1c, 0x4f, 0xa1, 0xa8, 0x98, 0xd9, 0x8a, 0x8b, 0xbe, 0x1f, 0xbd, 0xa2, 0x8b, 0xb6, 0x22, - 0x65, 0x00, 0x8b, 0xc3, 0xd9, 0x72, 0x59, 0xed, 0xf0, 0x0c, 0xaf, 0xdc, 0xbd, 0x8c, 0xcb, 0x65, - 0xc0, 0x41, 0x96, 0x2c, 0x23, 0xb4, 0x5b, 0x60, 0x85, 0xf9, 0x74, 0x56, 0xbb, 0x41, 0x1e, 0x17, - 0x73, 0x25, 0x21, 0x94, 0x38, 0xde, 0x05, 0x6b, 0x23, 0x5c, 0x3d, 0x85, 0xe8, 0x9a, 0x03, 0x87, - 0x70, 0x1a, 0xf7, 0x9e, 0x27, 0xf5, 0x20, 0x5c, 0x11, 0xcb, 0xb3, 0x89, 0xb9, 0x0b, 0x52, 0xdc, - 0x08, 0xea, 0x4b, 0x9b, 0xa9, 0x35, 0x90, 0xaf, 0x1b, 0xf0, 0x74, 0x6a, 0x49, 0x34, 0xbb, 0xc7, - 0xb4, 0x5b, 0xfc, 0x8a, 0xd2, 0xc0, 0xac, 0xb8, 0x2f, 0xf7, 0xaa, 0xda, 0x4e, 0x51, 0x05, 0xfd, - 0x6b, 0x22, 0xff, 0xc8, 0x80, 0xb3, 0x1a, 0x06, 0x2e, 0xe5, 0x4d, 0xda, 0x0a, 0x03, 0x54, 0xe6, - 0x3d, 0xe5, 0xfa, 0x83, 0xc7, 0x23, 0xd7, 0xcf, 0xe9, 0x7d, 0xe1, 0x2f, 0x9b, 0x61, 0xf5, 0xea, - 0x91, 0x57, 0x8f, 0x16, 0x92, 0x7b, 0x30, 0x85, 0x45, 0xd2, 0x9b, 0xc1, 0x64, 0x56, 0x38, 0x41, - 0x66, 0xe2, 0x66, 0x2f, 0x74, 0x82, 0xd0, 0x6b, 0x62, 0xb2, 0xca, 0xf9, 0xef, 0x1e, 0xcd, 0x8d, - 0x6b, 0xe8, 0x98, 0xf8, 0x07, 0xdb, 0x10, 0xb9, 0x44, 0xdc, 0xd6, 0xae, 0xa7, 0xbd, 0xdd, 0x93, - 0xac, 0x82, 0xfc, 0x13, 0x03, 0x66, 0x19, 0x94, 0x77, 0xe3, 0x96, 0xef, 0x35, 0xa3, 0x72, 0x79, - 0x9c, 0xd5, 0x63, 0xd8, 0x1a, 0x8f, 0x67, 0xd8, 0x5e, 0xc0, 0x26, 0x73, 0x9d, 0x60, 0xef, 0xfa, - 0x5e, 0x33, 0x6e, 0xbe, 0x96, 0xa7, 0xb6, 0x57, 0x23, 0xc9, 0x4f, 0x1a, 0x70, 0x4e, 0xdb, 0x50, - 0xaa, 0x69, 0x73, 0x66, 0x27, 0xb5, 0xb3, 0x4f, 0xb5, 0xa8, 0x7c, 0x55, 0xc8, 0xff, 0x25, 0x6c, - 0x41, 0xbc, 0x5a, 0x60, 0x5b, 0xec, 0x26, 0xc7, 0x52, 0x9a, 0xd0, 0xbb, 0x16, 0xe2, 0xc2, 0x14, - 0xba, 0xe4, 0xb5, 0x63, 0xd7, 0x99, 0xde, 0xc7, 0xae, 0x97, 0x44, 0xd5, 0xcf, 0x60, 0x6a, 0x92, - 0xde, 0x67, 0xaf, 0xdd, 0x5c, 0xc9, 0x8f, 0xc1, 0xb9, 0x2e, 0x60, 0x34, 0xdb, 0x4e, 0xf7, 0x9c, - 0x6d, 0x2f, 0x3f, 0x3c, 0x9a, 0x7b, 0x31, 0xad, 0xb6, 0xb4, 0x99, 0xd6, 0xbb, 0x06, 0xe2, 0x00, - 0xc4, 0x85, 0x22, 0xf1, 0x6d, 0xba, 0x80, 0xbe, 0x2c, 0xe4, 0x43, 0xc1, 0x67, 0xba, 0x5c, 0x69, - 0x83, 0xba, 0xe4, 0xc5, 0x48, 0x84, 0x42, 0x41, 0x49, 0xcb, 0x72, 0x38, 0x7b, 0xb6, 0x5f, 0x25, - 0xdf, 0x3d, 0x9a, 0xd3, 0xb0, 0x99, 0x21, 0xa9, 0xe6, 0x7b, 0x51, 0x0d, 0x49, 0x0d, 0x91, 0xfc, - 0xae, 0x01, 0x33, 0x0c, 0x10, 0x0b, 0x95, 0xe8, 0xd4, 0x6c, 0x3f, 0xa9, 0xdf, 0x7f, 0x3c, 0x52, - 0xff, 0x2c, 0xb6, 0x51, 0x95, 0xfa, 0xae, 0x21, 0x49, 0x6d, 0x1c, 0x4a, 0xbb, 0x76, 0xfa, 0xa3, - 0x49, 0xfb, 0xb9, 0x01, 0xa4, 0x9d, 0x7f, 0x80, 0xe3, 0xa5, 0xbd, 0x67, 0x2d, 0x64, 0x03, 0x0a, - 0xc2, 0x86, 0xe4, 0x03, 0xf6, 0x8c, 0x96, 0x05, 0x42, 0x2d, 0xe2, 0x86, 0xbd, 0xc8, 0x5a, 0xd3, - 0xd5, 0x43, 0x8d, 0x0b, 0x69, 0xc1, 0x34, 0xff, 0xad, 0x6f, 0x6e, 0xe7, 0x7a, 0x6e, 0x6e, 0x2f, - 0x8b, 0x1e, 0x5d, 0x14, 0xfc, 0x13, 0x7b, 0x5c, 0xa5, 0xa2, 0x34, 0xc6, 0xa4, 0x0d, 0x44, 0x03, - 0xf3, 0x49, 0x7b, 0xb1, 0xff, 0x96, 0xf6, 0x45, 0x51, 0xe7, 0x5c, 0xb2, 0xce, 0xe4, 0xcc, 0x4d, - 0xe1, 0x4d, 0x1c, 0x98, 0x14, 0x50, 0xb6, 0x63, 0x44, 0x0d, 0xff, 0xac, 0x76, 0xd7, 0x2a, 0x51, - 0xca, 0x33, 0xde, 0xca, 0x9a, 0xf0, 0x52, 0x4b, 0x42, 0xa1, 0x27, 0xf9, 0x99, 0x5f, 0x33, 0xba, - 0xea, 0x60, 0x3b, 0x53, 0xfc, 0xa1, 0x5c, 0x17, 0xc7, 0x9d, 0x29, 0xe7, 0x88, 0x3b, 0xe4, 0x18, - 0x81, 0xd9, 0x36, 0xea, 0xd5, 0xb9, 0xac, 0x78, 0x8a, 0x86, 0x83, 0xe2, 0x0d, 0xd3, 0x9c, 0x8c, - 0x5e, 0xc9, 0xc6, 0x36, 0x12, 0x46, 0xaf, 0x88, 0x98, 0x15, 0xf3, 0x27, 0x33, 0xba, 0x94, 0x90, - 0xcb, 0x8a, 0x99, 0xad, 0x5c, 0xde, 0x93, 0x66, 0xb6, 0x62, 0x5c, 0xff, 0x86, 0x01, 0xd3, 0x6b, - 0xfe, 0x9e, 0xd3, 0x72, 0x7f, 0x84, 0x5f, 0xed, 0xf7, 0x70, 0x18, 0xa3, 0x50, 0xe7, 0x8f, 0x34, - 0xb5, 0x9f, 0xa7, 0x54, 0xcc, 0x3e, 0x2c, 0x7e, 0x61, 0x2b, 0xad, 0x3d, 0x18, 0x38, 0x88, 0x0d, - 0x53, 0x32, 0x2c, 0x72, 0x74, 0x0e, 0x37, 0xbf, 0x91, 0x81, 0x31, 0x45, 0x62, 0xc9, 0x27, 0xa1, - 0xa0, 0xf2, 0x51, 0xbd, 0x1a, 0x6a, 0xb5, 0x96, 0x86, 0x85, 0x6e, 0x0d, 0xea, 0x34, 0x35, 0xb7, - 0x06, 0x93, 0x4b, 0x84, 0x9e, 0x70, 0x27, 0xf2, 0x4e, 0xca, 0x4e, 0xe4, 0x44, 0x79, 0x95, 0xdf, - 0xec, 0xde, 0x8f, 0x0c, 0x9e, 0x06, 0xd9, 0xfc, 0x96, 0x01, 0xc5, 0xe4, 0x9c, 0xfa, 0x48, 0x46, - 0xe5, 0x04, 0xde, 0xdc, 0x9f, 0xcd, 0x40, 0x71, 0xc3, 0x67, 0xdb, 0xed, 0xba, 0x0c, 0x87, 0x7e, - 0x52, 0x8f, 0xb2, 0xdf, 0xd2, 0x1c, 0xad, 0x4f, 0x45, 0xcb, 0x80, 0xda, 0xb9, 0x3e, 0xb7, 0x0c, - 0x73, 0xbf, 0xf4, 0x6b, 0x73, 0xa7, 0xcc, 0xf7, 0x61, 0x26, 0x39, 0x1c, 0xe8, 0x6c, 0x2d, 0xc1, - 0xa4, 0x0e, 0x4f, 0x26, 0x60, 0x4b, 0x52, 0x59, 0x49, 0x7c, 0xf3, 0x0f, 0x33, 0x49, 0xde, 0xe2, - 0x58, 0x9b, 0x29, 0x9d, 0x96, 0xb3, 0xd3, 0x88, 0x72, 0x44, 0x89, 0xf7, 0xaf, 0x10, 0x64, 0xc9, - 0xb2, 0x93, 0xa4, 0xe2, 0x8b, 0x82, 0x7a, 0xb3, 0xe9, 0x41, 0xbd, 0xe4, 0x66, 0x22, 0x02, 0x22, - 0x17, 0x3f, 0x75, 0x75, 0x9f, 0xee, 0xd8, 0x71, 0x14, 0x84, 0x1e, 0xf8, 0x40, 0x16, 0x60, 0x46, - 0xcb, 0xf2, 0x20, 0xe9, 0x87, 0x62, 0x87, 0x62, 0x88, 0x05, 0x9c, 0x38, 0x15, 0x19, 0x1f, 0x95, - 0xf4, 0x1a, 0x6c, 0x27, 0x26, 0x7c, 0xa8, 0xea, 0x33, 0x41, 0x72, 0xad, 0x51, 0xa2, 0xfc, 0x1b, - 0x94, 0xad, 0xd0, 0x5a, 0x5a, 0x72, 0x8e, 0x68, 0xfe, 0xa9, 0xc1, 0xe6, 0x7f, 0xed, 0xe0, 0x63, - 0x96, 0x24, 0x90, 0x75, 0xa9, 0x4f, 0xd4, 0xc5, 0xbf, 0x35, 0x78, 0x9a, 0x2f, 0x21, 0x3e, 0xaf, - 0xc3, 0xf0, 0x86, 0xe3, 0xef, 0xd1, 0x50, 0x24, 0xa4, 0x52, 0xb9, 0xf0, 0x82, 0xf8, 0x0a, 0x5e, - 0x88, 0xbf, 0x2d, 0x41, 0xa0, 0xba, 0xae, 0x32, 0x03, 0xb9, 0xae, 0x14, 0xf7, 0x63, 0xf6, 0x71, - 0xb9, 0x1f, 0xcd, 0xbf, 0xc8, 0xf0, 0xfe, 0x88, 0x46, 0x0d, 0xfa, 0x5a, 0xe2, 0x25, 0xc8, 0x31, - 0x39, 0x50, 0x9f, 0xa4, 0x64, 0xb2, 0xa2, 0xe2, 0xb1, 0x72, 0x36, 0x6f, 0x50, 0xff, 0xab, 0x79, - 0x29, 0x71, 0x89, 0x50, 0xe7, 0x0d, 0x62, 0xe0, 0xc3, 0xe6, 0x5e, 0x9d, 0xaa, 0xd3, 0xa1, 0xa5, - 0xbf, 0x41, 0x8f, 0xe5, 0xe4, 0xa6, 0x92, 0x1e, 0x4a, 0x0d, 0xaa, 0x6d, 0xee, 0x3a, 0x36, 0x4f, - 0x4b, 0xa4, 0xae, 0x00, 0x71, 0x26, 0xa9, 0x45, 0x98, 0xd0, 0xb3, 0x65, 0x8b, 0xe8, 0x0f, 0x4c, - 0x34, 0x9b, 0xc8, 0xb4, 0xad, 0xfa, 0x59, 0x75, 0x22, 0x52, 0x86, 0x71, 0xed, 0x3a, 0xaa, 0xfa, - 0x1e, 0xb0, 0x7e, 0x99, 0x55, 0xf5, 0xfb, 0x69, 0x24, 0xca, 0x4d, 0x8d, 0x4f, 0x40, 0x51, 0xcc, - 0xcc, 0x28, 0x45, 0x28, 0x1e, 0xcf, 0x2d, 0x57, 0x2c, 0x75, 0x36, 0xd5, 0xdc, 0xba, 0x6f, 0x21, - 0xd4, 0xfc, 0xb6, 0x01, 0xe7, 0x56, 0x69, 0x78, 0xdf, 0xf3, 0x0f, 0x2c, 0x1a, 0x84, 0xbe, 0xcb, - 0x33, 0x8e, 0xa2, 0x3c, 0x7e, 0x92, 0xbc, 0x29, 0x1f, 0xef, 0xd2, 0x15, 0x64, 0xb2, 0x8e, 0xf2, - 0xb8, 0x10, 0xca, 0x21, 0x0c, 0x38, 0x90, 0x8f, 0x76, 0xbd, 0x2e, 0x1e, 0xed, 0xca, 0xf4, 0x27, - 0x8e, 0xe6, 0x45, 0x9d, 0xb6, 0xe4, 0x63, 0x5d, 0xdf, 0xca, 0xc0, 0xe9, 0x94, 0x66, 0x6d, 0x7d, - 0xf2, 0x09, 0x55, 0x0e, 0x65, 0x4d, 0x39, 0xc8, 0x57, 0x1d, 0x7b, 0x0e, 0x7c, 0xaa, 0xae, 0xf8, - 0x15, 0x03, 0xce, 0xea, 0xd2, 0x23, 0x82, 0x82, 0xb6, 0x6e, 0x90, 0x37, 0x60, 0x78, 0x89, 0x3a, - 0x75, 0x2a, 0x33, 0xd9, 0x9d, 0x4e, 0xbc, 0x98, 0xcb, 0x0b, 0x39, 0xdb, 0x3f, 0xe4, 0x53, 0xf9, - 0x94, 0x25, 0x48, 0x48, 0x45, 0x34, 0x8e, 0x9b, 0xa5, 0xa6, 0xbc, 0x22, 0x94, 0x56, 0x55, 0x9f, - 0xc3, 0xcd, 0xef, 0x1a, 0xf0, 0x54, 0x1f, 0x1a, 0xf6, 0xe1, 0xd8, 0xa7, 0x57, 0x3f, 0x1c, 0x2e, - 0x2c, 0x08, 0x25, 0x6f, 0xc3, 0xe4, 0x86, 0x30, 0x6b, 0xe5, 0xe7, 0xc8, 0xc4, 0x21, 0xe2, 0xd2, - 0xe2, 0xb5, 0xe5, 0x77, 0x49, 0x22, 0x6b, 0x77, 0xd7, 0xb2, 0x7d, 0xef, 0xae, 0xa9, 0x57, 0xc1, - 0x72, 0x83, 0x5e, 0x05, 0x7b, 0x3f, 0x99, 0x82, 0x5f, 0x5c, 0x13, 0x8f, 0x2f, 0xc2, 0x19, 0xbd, - 0x2f, 0xc2, 0xc9, 0x03, 0xfd, 0x4c, 0xea, 0x1d, 0x9b, 0x6f, 0x18, 0x50, 0xd4, 0x79, 0x3f, 0xea, - 0xf7, 0x7c, 0x4b, 0xfb, 0x9e, 0x4f, 0xa5, 0x7f, 0xcf, 0xde, 0x1f, 0xb2, 0xeb, 0xb9, 0x81, 0x81, - 0x3e, 0xa0, 0x09, 0xc3, 0x15, 0xaf, 0xe9, 0xb8, 0x2d, 0x35, 0x53, 0x7d, 0x1d, 0x21, 0x96, 0x28, - 0x19, 0xe8, 0xda, 0xa0, 0xf9, 0x73, 0x39, 0x38, 0x67, 0xd1, 0x3d, 0x97, 0x59, 0x55, 0x9b, 0x81, - 0xdb, 0xda, 0xd3, 0x6e, 0x40, 0x99, 0x89, 0x01, 0x17, 0x59, 0x4c, 0x18, 0x24, 0x1a, 0xef, 0x97, - 0x20, 0xcf, 0x54, 0xbb, 0x32, 0xe6, 0xe8, 0x21, 0xc7, 0x87, 0x5e, 0xb8, 0x30, 0xc8, 0x62, 0x72, - 0x45, 0x2c, 0x3c, 0x4a, 0x9e, 0x29, 0xb6, 0xf0, 0xfc, 0xe0, 0x68, 0x0e, 0xf8, 0xf3, 0xe0, 0xac, - 0x54, 0x2c, 0x3e, 0x91, 0x25, 0x96, 0xeb, 0x61, 0x89, 0xdd, 0x85, 0x99, 0x52, 0x9d, 0x2b, 0x35, - 0xa7, 0xb1, 0xee, 0xbb, 0xad, 0x9a, 0xdb, 0x76, 0x1a, 0x72, 0x77, 0x81, 0xe7, 0x24, 0x4e, 0x54, - 0x6e, 0xb7, 0x23, 0x04, 0x2b, 0x95, 0x8c, 0x75, 0xa3, 0xb2, 0x5a, 0xe5, 0xef, 0x78, 0xf0, 0xc3, - 0x0f, 0xec, 0x46, 0xbd, 0x15, 0xf0, 0x87, 0x3c, 0xac, 0xa8, 0x18, 0x6d, 0x40, 0x3c, 0x92, 0xdd, - 0x58, 0xa9, 0xc6, 0xa1, 0xd6, 0x3c, 0x0d, 0x06, 0x3f, 0xb6, 0x0d, 0x1b, 0x01, 0x1e, 0xdd, 0x6a, - 0x78, 0x31, 0x5d, 0xb5, 0xba, 0xc4, 0xe8, 0xf2, 0x5d, 0x74, 0x41, 0xb0, 0xaf, 0xd2, 0x71, 0x3c, - 0x72, 0x0d, 0x80, 0x5f, 0xf2, 0x47, 0x81, 0x18, 0x8d, 0x2d, 0x46, 0x1f, 0xa1, 0xdc, 0x62, 0x54, - 0x50, 0xc8, 0x9b, 0x30, 0xbd, 0xb8, 0x30, 0x2f, 0x5d, 0x56, 0x15, 0xaf, 0xd6, 0x69, 0xd2, 0x56, - 0x88, 0x87, 0xa6, 0x05, 0xfe, 0x0d, 0x69, 0x6d, 0x9e, 0x49, 0x41, 0x1a, 0x9a, 0xc8, 0xcc, 0xc6, - 0xf3, 0x7a, 0x2e, 0x78, 0x75, 0x1a, 0x6c, 0x5d, 0xff, 0x98, 0x65, 0x66, 0x53, 0xfa, 0x86, 0xb3, - 0xed, 0x7a, 0xea, 0xcc, 0xfc, 0x7f, 0x31, 0x33, 0x5b, 0x17, 0x2e, 0xf9, 0x21, 0x18, 0xc2, 0x9f, - 0x62, 0x99, 0x9e, 0x4e, 0x61, 0x1b, 0x2f, 0xd1, 0x35, 0xfe, 0x32, 0x02, 0x12, 0x90, 0x65, 0x18, - 0x11, 0x19, 0x51, 0x4f, 0x92, 0x5f, 0x48, 0x24, 0x07, 0xe6, 0xa6, 0x9f, 0xa0, 0x37, 0xeb, 0x50, - 0x50, 0x2b, 0x64, 0x32, 0xb2, 0xe4, 0x04, 0xfb, 0xb4, 0xce, 0x7e, 0x89, 0xd4, 0x80, 0x28, 0x23, - 0xfb, 0x08, 0xb5, 0x59, 0x3b, 0x2c, 0x05, 0x85, 0x69, 0x87, 0xe5, 0x60, 0x33, 0x10, 0x4d, 0x11, - 0x5b, 0x27, 0x17, 0xb7, 0xe1, 0x75, 0x4b, 0x14, 0xa1, 0xb6, 0x94, 0x47, 0x64, 0xbe, 0x53, 0x3b, - 0xa0, 0xfe, 0xd6, 0xf5, 0x8f, 0x42, 0x5b, 0xea, 0x75, 0xf4, 0xf9, 0x26, 0x5f, 0x85, 0xe8, 0x61, - 0x0f, 0x0d, 0x99, 0x19, 0x96, 0xf1, 0x3d, 0x52, 0x23, 0x36, 0x2c, 0xe3, 0x7b, 0xa4, 0xaa, 0x61, - 0x19, 0xa1, 0x46, 0x4f, 0x16, 0x67, 0x8e, 0x79, 0xb2, 0xb8, 0xc7, 0xf3, 0xec, 0x32, 0xa1, 0xce, - 0x71, 0xcf, 0xb3, 0x33, 0xfb, 0x5f, 0x7e, 0xfa, 0xdc, 0x40, 0xf6, 0x3f, 0xbe, 0xf4, 0x2a, 0x3e, - 0x7d, 0xd2, 0xfe, 0x17, 0x9c, 0xd4, 0x4d, 0xc5, 0xd0, 0xe0, 0x4c, 0x8f, 0x89, 0x69, 0xf8, 0x34, - 0x14, 0x4a, 0x61, 0xe8, 0xd4, 0xf6, 0x69, 0x1d, 0x9f, 0xc6, 0x56, 0x6e, 0xb2, 0x39, 0x02, 0xae, - 0x3a, 0x63, 0x55, 0x5c, 0xf2, 0x0a, 0x0c, 0x5b, 0xd4, 0x09, 0x44, 0x70, 0x89, 0x30, 0x27, 0x7c, - 0x84, 0xa8, 0x5e, 0x25, 0x8e, 0xc3, 0x36, 0x51, 0xcb, 0xad, 0x7b, 0x2e, 0x1b, 0x93, 0x7c, 0x9c, - 0x98, 0xdf, 0xe5, 0x20, 0x55, 0x6b, 0x08, 0x2c, 0xf2, 0xba, 0x62, 0x76, 0x8c, 0xc6, 0xf6, 0x3f, - 0xdf, 0x9b, 0xd9, 0xd2, 0xfa, 0x50, 0x4d, 0x8a, 0xc8, 0x0e, 0xb9, 0x09, 0x23, 0x72, 0xcb, 0x0d, - 0xb1, 0xcd, 0x2f, 0x28, 0xbb, 0x6f, 0x2d, 0x48, 0x64, 0xcc, 0x89, 0xad, 0xe4, 0xee, 0x1b, 0x53, - 0x72, 0x62, 0x2b, 0xb9, 0xfb, 0xb4, 0x9c, 0xd8, 0x4a, 0x16, 0xbf, 0x68, 0x07, 0x55, 0x38, 0x76, - 0x07, 0xb5, 0x05, 0x85, 0x75, 0xc7, 0x0f, 0x5d, 0xb6, 0x1c, 0xb5, 0x42, 0xfe, 0x1a, 0x54, 0xbc, - 0xc1, 0x57, 0x8a, 0xca, 0xcf, 0xc8, 0xdc, 0xd0, 0x6d, 0x05, 0x5f, 0x4f, 0x2a, 0x1c, 0xc3, 0xd3, - 0x43, 0x4b, 0x26, 0x1e, 0x25, 0xb4, 0x24, 0x1f, 0x3d, 0xae, 0x38, 0x19, 0x07, 0xf2, 0x44, 0x2f, - 0x26, 0x26, 0x47, 0x1f, 0x77, 0x9c, 0x9f, 0x87, 0x02, 0xfb, 0x1b, 0x5f, 0xa8, 0x71, 0x29, 0x7f, - 0xed, 0x29, 0xce, 0xc4, 0xa1, 0x4f, 0x68, 0xfe, 0x8c, 0x4d, 0x95, 0x86, 0x7c, 0x02, 0x23, 0xe3, - 0xa4, 0xb7, 0x46, 0xe3, 0x46, 0xde, 0x81, 0x82, 0xfa, 0xb4, 0xd6, 0xec, 0x54, 0x1c, 0x1c, 0x54, - 0x17, 0xf0, 0xe4, 0x57, 0xd2, 0x08, 0xd8, 0xfa, 0x55, 0x6a, 0xb7, 0x91, 0x96, 0x28, 0xd2, 0xde, - 0x6e, 0x27, 0xc9, 0x24, 0x1a, 0xf9, 0x0c, 0x14, 0x4a, 0xed, 0x76, 0xac, 0x71, 0xa6, 0x95, 0x7d, - 0x64, 0xbb, 0x6d, 0xa7, 0x6a, 0x1d, 0x8d, 0x82, 0x09, 0x96, 0x30, 0xf8, 0xb0, 0xde, 0x99, 0x58, - 0xb0, 0xe4, 0x83, 0x51, 0x49, 0xc1, 0x52, 0xd0, 0xcd, 0xef, 0x1b, 0x70, 0xb6, 0xc7, 0xb0, 0xe1, - 0x5e, 0x3c, 0xf6, 0x96, 0xf3, 0xbd, 0xb8, 0xce, 0x2a, 0x27, 0x32, 0x16, 0x8e, 0xe8, 0xc6, 0x3f, - 0x4e, 0x3f, 0xb1, 0x06, 0xab, 0x9d, 0x96, 0xab, 0x71, 0xfa, 0xd3, 0x54, 0xd9, 0x8f, 0xec, 0x69, - 0x2a, 0xf3, 0xc8, 0x80, 0x31, 0x45, 0x98, 0xc9, 0x45, 0x25, 0x36, 0xbe, 0xc8, 0xb3, 0x5a, 0x29, - 0x1c, 0x32, 0x5c, 0x9d, 0xa3, 0x64, 0x66, 0x8e, 0x77, 0x81, 0xe0, 0x1b, 0x8d, 0xd9, 0x18, 0xaf, - 0x99, 0xf0, 0x57, 0xe0, 0x9b, 0x8c, 0x5f, 0x00, 0x58, 0x71, 0x82, 0xb0, 0x54, 0x0b, 0xdd, 0x7b, - 0x74, 0x00, 0xcd, 0x1d, 0xe7, 0x85, 0x77, 0xf0, 0xd1, 0x5e, 0x46, 0xd6, 0x95, 0x17, 0x3e, 0x62, - 0x68, 0xfe, 0xa5, 0x01, 0x63, 0xcb, 0xad, 0x20, 0x74, 0x1a, 0x0d, 0x5c, 0x5a, 0x3f, 0x4e, 0x19, - 0x00, 0xa3, 0x7e, 0xf5, 0x59, 0xce, 0x5f, 0x83, 0xc9, 0x04, 0x1a, 0xdb, 0x72, 0x54, 0xf1, 0x8e, - 0x8b, 0xba, 0xe5, 0xe0, 0xb7, 0x5e, 0x2c, 0x51, 0x62, 0x2e, 0x2a, 0x64, 0x5b, 0xd7, 0xd1, 0xcd, - 0x3c, 0x0f, 0xe0, 0x4a, 0x90, 0xb4, 0xcc, 0x48, 0xb2, 0x25, 0x5b, 0xd7, 0x2d, 0x05, 0xcb, 0x5c, - 0x85, 0xe1, 0xaa, 0xe7, 0x87, 0xe5, 0x43, 0x6e, 0x0c, 0x55, 0x68, 0x50, 0x53, 0xfd, 0xc8, 0x2e, - 0x7a, 0x94, 0x6a, 0x96, 0x28, 0x62, 0x3b, 0x92, 0x5b, 0x2e, 0x6d, 0xd4, 0xd5, 0xf8, 0x9e, 0x5d, - 0x06, 0xb0, 0x38, 0x9c, 0x19, 0x8c, 0x67, 0xe2, 0x94, 0x5a, 0x71, 0x20, 0xd1, 0xa3, 0xda, 0x4c, - 0x0b, 0xda, 0xf8, 0x3e, 0xab, 0xa7, 0xcd, 0xd7, 0x6a, 0xea, 0x33, 0xd4, 0x7f, 0xd7, 0x80, 0xf3, - 0xbd, 0x49, 0xd4, 0xd8, 0x24, 0xa3, 0x4f, 0x6c, 0xd2, 0x0b, 0x49, 0xbf, 0x27, 0xa2, 0x09, 0xbf, - 0x67, 0xec, 0xed, 0xac, 0x60, 0x68, 0x58, 0x2d, 0x7a, 0xa2, 0xe4, 0x62, 0x9f, 0x36, 0x23, 0x22, - 0xff, 0xcc, 0x21, 0xd2, 0x58, 0x82, 0xd6, 0xfc, 0x67, 0x59, 0x38, 0xd7, 0x93, 0x82, 0x2c, 0x69, - 0xcf, 0xb3, 0x5e, 0x39, 0xae, 0x86, 0xab, 0xf8, 0x6f, 0xea, 0x83, 0xad, 0x6b, 0x51, 0x56, 0x36, - 0xfe, 0x64, 0xeb, 0xcb, 0xc7, 0xf2, 0xe2, 0xe8, 0xc8, 0x0c, 0xba, 0x13, 0xb4, 0x61, 0x5c, 0x34, - 0x0d, 0x1d, 0x57, 0xbc, 0x8f, 0x2a, 0xe3, 0xa2, 0x39, 0xc8, 0x92, 0x65, 0x71, 0xc0, 0x58, 0x2e, - 0x3d, 0x60, 0xcc, 0xfc, 0x29, 0x03, 0x46, 0xa3, 0x66, 0x93, 0xf3, 0x70, 0x66, 0xc3, 0x2a, 0x2d, - 0x2c, 0xda, 0x1b, 0xef, 0xaf, 0x2f, 0xda, 0x9b, 0xab, 0xd5, 0xf5, 0xc5, 0x85, 0xe5, 0x5b, 0xcb, - 0x8b, 0x95, 0xe2, 0x29, 0x32, 0x05, 0xe3, 0x9b, 0xab, 0x77, 0x56, 0xd7, 0xb6, 0x57, 0xed, 0x45, - 0xcb, 0x5a, 0xb3, 0x8a, 0x06, 0x19, 0x87, 0x51, 0xab, 0x5c, 0x5a, 0xb0, 0x57, 0xd7, 0x2a, 0x8b, - 0xc5, 0x0c, 0x29, 0x42, 0x61, 0x61, 0x6d, 0x75, 0x75, 0x71, 0x61, 0x63, 0x79, 0x6b, 0x79, 0xe3, - 0xfd, 0x62, 0x96, 0x10, 0x98, 0x40, 0x84, 0x75, 0x6b, 0x79, 0x75, 0x61, 0x79, 0xbd, 0xb4, 0x52, - 0xcc, 0x31, 0x18, 0xc3, 0x57, 0x60, 0x43, 0xe6, 0x5b, 0x3c, 0x02, 0x9a, 0xf7, 0x97, 0x9c, 0x01, - 0x52, 0xdd, 0x28, 0x6d, 0x6c, 0x56, 0x13, 0x2d, 0x18, 0x83, 0x91, 0xea, 0xe6, 0xc2, 0xc2, 0x62, - 0xb5, 0x5a, 0x34, 0x08, 0xc0, 0xf0, 0xad, 0xd2, 0xf2, 0xca, 0x62, 0xa5, 0x98, 0x31, 0x7f, 0xda, - 0x80, 0x82, 0x30, 0x1e, 0x4a, 0x0d, 0xea, 0x87, 0x8f, 0x36, 0x17, 0x5e, 0xd7, 0xf6, 0x0f, 0x51, - 0x40, 0x9c, 0xc2, 0x9f, 0x15, 0xa7, 0xce, 0x80, 0x7f, 0x67, 0x40, 0x31, 0x89, 0x48, 0xde, 0x86, - 0x7c, 0x95, 0xde, 0xa3, 0xbe, 0x1b, 0x1e, 0x0a, 0x49, 0x92, 0x6f, 0x6d, 0x73, 0x1c, 0x51, 0xc6, - 0xfd, 0x5b, 0x81, 0xf8, 0x65, 0x45, 0x34, 0x83, 0x4e, 0x08, 0xc5, 0xfc, 0xcf, 0x3e, 0x2e, 0xf3, - 0xdf, 0xfc, 0x63, 0x03, 0xce, 0xde, 0xa6, 0xa1, 0xda, 0xa7, 0x28, 0x65, 0xcb, 0x27, 0x06, 0xeb, - 0x97, 0xd2, 0x93, 0x59, 0x18, 0xc1, 0x22, 0x79, 0xb9, 0xcc, 0x92, 0x3f, 0x49, 0x19, 0x86, 0xb5, - 0xac, 0x78, 0x72, 0xae, 0xf5, 0xa8, 0xfb, 0xaa, 0x92, 0x82, 0xcc, 0x12, 0x94, 0xe7, 0x5f, 0x87, - 0xb1, 0x0f, 0x99, 0xe5, 0xee, 0xca, 0x3b, 0x30, 0x29, 0xad, 0xb5, 0x8d, 0x95, 0x2a, 0x2e, 0xcb, - 0x93, 0x30, 0xb6, 0xb5, 0x68, 0x2d, 0xdf, 0x7a, 0xdf, 0xbe, 0xb5, 0xb9, 0xb2, 0x52, 0x3c, 0xc5, - 0x84, 0x5d, 0x00, 0x16, 0x4a, 0x45, 0x83, 0x14, 0x20, 0xbf, 0xbc, 0x5a, 0x5d, 0x5c, 0xd8, 0xb4, - 0x16, 0x8b, 0x99, 0x2b, 0x2f, 0xc0, 0x44, 0x7c, 0x81, 0x06, 0x85, 0x78, 0x04, 0xb2, 0x56, 0x69, - 0xbb, 0x78, 0x8a, 0x09, 0xea, 0xfa, 0x9d, 0x85, 0xea, 0xf5, 0xeb, 0x45, 0xe3, 0xca, 0x27, 0x60, - 0x0a, 0x3d, 0x90, 0x6c, 0x3d, 0xa1, 0x2d, 0xea, 0x63, 0x4d, 0x05, 0x36, 0x8e, 0x6d, 0xc7, 0x77, - 0x42, 0xca, 0xab, 0xb9, 0xdb, 0x69, 0x84, 0x6e, 0xbb, 0x41, 0x1f, 0x14, 0x8d, 0x2b, 0xaf, 0xc3, - 0xa4, 0xe5, 0x75, 0x42, 0xb7, 0xb5, 0x27, 0xdf, 0xe0, 0x27, 0xa7, 0x61, 0x6a, 0x73, 0xb5, 0x74, - 0xb7, 0xbc, 0x7c, 0x7b, 0x73, 0x6d, 0xb3, 0x6a, 0xdf, 0x2d, 0x6d, 0x2c, 0x2c, 0x15, 0x4f, 0xb1, - 0x06, 0xdf, 0x5d, 0xab, 0x6e, 0xd8, 0xd6, 0xe2, 0xc2, 0xe2, 0xea, 0x46, 0xd1, 0xb8, 0xf2, 0x33, - 0x06, 0x4c, 0x30, 0x4b, 0x04, 0x7d, 0x59, 0x9b, 0x28, 0x23, 0x17, 0xe1, 0xc2, 0x66, 0x75, 0xd1, - 0xb2, 0x37, 0xd6, 0xee, 0x2c, 0xae, 0xda, 0x9b, 0xd5, 0xd2, 0xed, 0xe4, 0x2c, 0x9f, 0x83, 0xa7, - 0x14, 0x0c, 0x6b, 0x71, 0x61, 0x6d, 0x6b, 0xd1, 0xb2, 0xd7, 0x4b, 0xd5, 0xea, 0xf6, 0x9a, 0x55, - 0x29, 0x1a, 0x4c, 0x45, 0xa4, 0x20, 0xdc, 0xbd, 0x55, 0x2a, 0x66, 0xba, 0xca, 0x56, 0x17, 0xb7, - 0x4b, 0x2b, 0x76, 0x79, 0x6d, 0xa3, 0x98, 0xbd, 0xf2, 0x0e, 0x14, 0xc4, 0xc7, 0xe3, 0xbb, 0xd5, - 0x3c, 0xe4, 0x56, 0xd7, 0x56, 0x17, 0xf9, 0xb4, 0x5e, 0x5f, 0x5c, 0xad, 0x2c, 0xaf, 0xde, 0xe6, - 0xc3, 0x5a, 0x5a, 0x5f, 0xb7, 0xd6, 0xb6, 0xd8, 0xc4, 0x66, 0x63, 0x57, 0x59, 0x5c, 0x65, 0x2d, - 0xcb, 0x5e, 0x31, 0x61, 0xaa, 0xeb, 0x81, 0x6b, 0x36, 0x5a, 0x8b, 0x9f, 0xdd, 0x58, 0x5c, 0xad, - 0x2e, 0xaf, 0xad, 0x16, 0x4f, 0x5d, 0xb9, 0x90, 0xc0, 0x91, 0x5f, 0xa2, 0x5a, 0x5d, 0x2a, 0x9e, - 0xba, 0xf2, 0x79, 0x28, 0xa8, 0x9b, 0x69, 0x72, 0x16, 0xa6, 0xd5, 0xdf, 0xeb, 0xb4, 0x55, 0x77, - 0x5b, 0x7b, 0xc5, 0x53, 0xc9, 0x02, 0xab, 0xd3, 0x6a, 0xb1, 0x02, 0xec, 0xbc, 0x5a, 0xb0, 0x41, - 0xfd, 0xa6, 0xdb, 0x62, 0x13, 0xa5, 0x98, 0xb9, 0x72, 0x15, 0xc6, 0x35, 0xb9, 0x67, 0xf5, 0xae, - 0xac, 0x09, 0x09, 0xb8, 0xbb, 0x58, 0x59, 0xde, 0xbc, 0x5b, 0x1c, 0x62, 0xdd, 0x5e, 0x5a, 0xbe, - 0xbd, 0x54, 0x84, 0xf2, 0x5b, 0xdf, 0xf9, 0xa3, 0x67, 0x4e, 0x7d, 0xe7, 0x7b, 0xcf, 0x18, 0x7f, - 0xf8, 0xbd, 0x67, 0x8c, 0xff, 0xfa, 0xbd, 0x67, 0x8c, 0x1f, 0x7e, 0xf9, 0x04, 0x01, 0x22, 0x3b, - 0xc3, 0x38, 0xab, 0x6f, 0xfc, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xba, 0x4d, 0x77, 0x0f, 0xc0, - 0xea, 0x00, 0x00, + 0x46, 0x22, 0x57, 0x14, 0xc9, 0xed, 0xe1, 0xc7, 0xad, 0xef, 0xa3, 0xaf, 0x39, 0x53, 0x24, 0x7b, + 0x39, 0x33, 0x3d, 0xd7, 0xdd, 0x23, 0x89, 0x3e, 0x1b, 0xb6, 0xe1, 0xdf, 0xf9, 0x7e, 0x07, 0xc3, + 0x77, 0xbe, 0x1f, 0xce, 0x5f, 0x3f, 0xf8, 0x07, 0xfb, 0x67, 0xc4, 0x49, 0x9c, 0xc4, 0x46, 0x6c, + 0x07, 0x08, 0x8c, 0x00, 0x49, 0x8c, 0x04, 0xce, 0xe5, 0xd3, 0x06, 0xf2, 0x57, 0x2e, 0x09, 0x13, + 0xdf, 0x19, 0xf9, 0x43, 0x80, 0x81, 0x00, 0x01, 0x02, 0xf8, 0x6c, 0x03, 0x41, 0xbd, 0xaa, 0xea, + 0xae, 0xea, 0xe9, 0x21, 0x87, 0x2b, 0x2d, 0x62, 0x2d, 0xf2, 0x8f, 0xc4, 0x79, 0xf5, 0xde, 0xab, + 0x8f, 0x7e, 0xf5, 0xea, 0xd5, 0xab, 0x57, 0xaf, 0xe0, 0xd9, 0x90, 0x36, 0x69, 0xc7, 0xf3, 0xc3, + 0x6b, 0x4d, 0xba, 0xeb, 0xd4, 0x0f, 0xae, 0x85, 0x07, 0x1d, 0x1a, 0xf0, 0x7f, 0xaf, 0x76, 0x7c, + 0x2f, 0xf4, 0xc8, 0x10, 0xfe, 0x38, 0x3f, 0xb3, 0xeb, 0xed, 0x7a, 0x08, 0xb9, 0xc6, 0xfe, 0xe2, + 0x85, 0xe7, 0xe7, 0x76, 0x3d, 0x6f, 0xb7, 0x49, 0xaf, 0xe1, 0xaf, 0xed, 0xee, 0xce, 0xb5, 0xd0, + 0x6d, 0xd1, 0x20, 0x74, 0x5a, 0x1d, 0x81, 0xf0, 0x6a, 0x7a, 0x05, 0xf7, 0x7d, 0xa7, 0xd3, 0xa1, + 0x7e, 0xfc, 0x07, 0x47, 0x37, 0xff, 0xff, 0x2c, 0x8c, 0xde, 0xa1, 0xb4, 0x53, 0x6a, 0xba, 0xf7, + 0x28, 0x79, 0x0e, 0x72, 0x2b, 0x4e, 0x8b, 0xce, 0x1a, 0x17, 0x8d, 0xcb, 0xa3, 0xe5, 0xc9, 0x87, + 0x87, 0x73, 0x63, 0x01, 0xf5, 0xef, 0x51, 0xdf, 0x6e, 0x3b, 0x2d, 0x6a, 0x61, 0x21, 0x79, 0x19, + 0x46, 0xd9, 0xff, 0x41, 0xc7, 0xa9, 0xd3, 0xd9, 0x0c, 0x62, 0x8e, 0x3f, 0x3c, 0x9c, 0x1b, 0x6d, + 0x4b, 0xa0, 0x15, 0x97, 0x93, 0x4b, 0x30, 0xb2, 0x4c, 0x9d, 0x80, 0x2e, 0x55, 0x66, 0xb3, 0x17, + 0x8d, 0xcb, 0xd9, 0x72, 0xe1, 0xe1, 0xe1, 0x5c, 0xbe, 0xc9, 0x40, 0xb6, 0xdb, 0xb0, 0x64, 0x21, + 0x59, 0x82, 0x91, 0xea, 0x83, 0x8e, 0xeb, 0xd3, 0x60, 0x36, 0x77, 0xd1, 0xb8, 0x3c, 0x36, 0x7f, + 0xfe, 0x2a, 0xef, 0xe9, 0x55, 0xd9, 0xd3, 0xab, 0xeb, 0xb2, 0xa7, 0xe5, 0xe9, 0xef, 0x1c, 0xce, + 0x9d, 0x7a, 0x78, 0x38, 0x37, 0x42, 0x39, 0xc9, 0xcf, 0xfd, 0x97, 0x39, 0xc3, 0x92, 0xf4, 0xe4, + 0x4d, 0xc8, 0xad, 0x1f, 0x74, 0xe8, 0xec, 0xe8, 0x45, 0xe3, 0xf2, 0xc4, 0xfc, 0x33, 0x57, 0xf9, + 0xd8, 0x46, 0x9d, 0x8c, 0xff, 0x62, 0x58, 0xe5, 0xfc, 0xc3, 0xc3, 0xb9, 0x1c, 0x43, 0xb1, 0x90, + 0x8a, 0xbc, 0x0a, 0xc3, 0x8b, 0x5e, 0x10, 0x2e, 0x55, 0x66, 0x01, 0xbb, 0x76, 0xfa, 0xe1, 0xe1, + 0xdc, 0xd4, 0x9e, 0x17, 0x84, 0xb6, 0xdb, 0x78, 0xc5, 0x6b, 0xb9, 0x21, 0x6d, 0x75, 0xc2, 0x03, + 0x4b, 0x20, 0x99, 0xdb, 0x30, 0xae, 0xf1, 0x23, 0x63, 0x30, 0xb2, 0xb1, 0x72, 0x67, 0x65, 0x75, + 0x6b, 0xa5, 0x78, 0x8a, 0xe4, 0x21, 0xb7, 0xb2, 0x5a, 0xa9, 0x16, 0x0d, 0x32, 0x02, 0xd9, 0xd2, + 0xda, 0x5a, 0x31, 0x43, 0x0a, 0x90, 0xaf, 0x94, 0xd6, 0x4b, 0xe5, 0x52, 0xad, 0x5a, 0xcc, 0x92, + 0x69, 0x98, 0xdc, 0x5a, 0x5a, 0xa9, 0xac, 0x6e, 0xd5, 0xec, 0x4a, 0xb5, 0x76, 0x67, 0x7d, 0x75, + 0xad, 0x98, 0x23, 0x13, 0x00, 0x77, 0x36, 0xca, 0x55, 0x6b, 0xa5, 0xba, 0x5e, 0xad, 0x15, 0x87, + 0xcc, 0xaf, 0x65, 0x21, 0x7f, 0x97, 0x86, 0x4e, 0xc3, 0x09, 0x1d, 0x72, 0x41, 0xfb, 0x44, 0xd8, + 0x7a, 0xe5, 0xdb, 0x3c, 0xd7, 0xfb, 0x6d, 0x86, 0x1e, 0x1e, 0xce, 0x19, 0xaf, 0xaa, 0xdf, 0xe4, + 0x0d, 0x18, 0xab, 0xd0, 0xa0, 0xee, 0xbb, 0x9d, 0xd0, 0xf5, 0xda, 0xf8, 0x5d, 0x46, 0xcb, 0xe7, + 0x1e, 0x1e, 0xce, 0x9d, 0x6e, 0xc4, 0x60, 0xa5, 0xaf, 0x2a, 0x36, 0x59, 0x82, 0xe1, 0x65, 0x67, + 0x9b, 0x36, 0x83, 0xd9, 0xa1, 0x8b, 0xd9, 0xcb, 0x63, 0xf3, 0x4f, 0x89, 0xf1, 0x95, 0x0d, 0xbc, + 0xca, 0x4b, 0xab, 0xed, 0xd0, 0x3f, 0x28, 0xcf, 0x3c, 0x3c, 0x9c, 0x2b, 0x36, 0x11, 0xa0, 0x8e, + 0x1d, 0x47, 0x21, 0xb5, 0xf8, 0x9b, 0x0f, 0x1f, 0xfb, 0xcd, 0x9f, 0xfe, 0xce, 0xe1, 0x9c, 0xc1, + 0xbe, 0x85, 0xf8, 0xe6, 0x31, 0x3f, 0xfd, 0xeb, 0x5f, 0x84, 0xcc, 0x52, 0x65, 0x76, 0x04, 0x65, + 0xad, 0xf8, 0xf0, 0x70, 0xae, 0xa0, 0x7d, 0xb6, 0xcc, 0x52, 0xe5, 0xfc, 0xeb, 0x30, 0xa6, 0xb4, + 0x91, 0x14, 0x21, 0xbb, 0x4f, 0x0f, 0xf8, 0x78, 0x5a, 0xec, 0x4f, 0x32, 0x03, 0x43, 0xf7, 0x9c, + 0x66, 0x57, 0x0c, 0xa0, 0xc5, 0x7f, 0x7c, 0x3a, 0xf3, 0x43, 0x86, 0xf9, 0xff, 0xe4, 0x20, 0x6f, + 0x79, 0xa1, 0x83, 0x23, 0xf1, 0x12, 0x0c, 0xd5, 0x42, 0x27, 0x94, 0x9f, 0x62, 0xfa, 0xe1, 0xe1, + 0xdc, 0x64, 0xc0, 0x00, 0x4a, 0x7d, 0x1c, 0x83, 0xa1, 0xae, 0xed, 0x39, 0x81, 0xfc, 0x24, 0x88, + 0xda, 0x61, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x25, 0xc8, 0xdd, 0xf5, 0x1a, 0x54, 0x7c, 0x15, 0xf2, + 0xf0, 0x70, 0x6e, 0xa2, 0xe5, 0x35, 0x54, 0x44, 0x2c, 0x27, 0xaf, 0xc0, 0xe8, 0x42, 0xd7, 0xf7, + 0x69, 0x9b, 0x89, 0x6a, 0x0e, 0x91, 0x27, 0x1e, 0x1e, 0xce, 0x41, 0x9d, 0x03, 0xd9, 0xe4, 0x8a, + 0x11, 0xd8, 0x50, 0xd7, 0x42, 0xc7, 0x0f, 0x69, 0x63, 0x76, 0x68, 0xa0, 0xa1, 0x66, 0xd3, 0x6b, + 0x2a, 0xe0, 0x24, 0xc9, 0xa1, 0x16, 0x9c, 0xc8, 0x22, 0x8c, 0xdd, 0xf6, 0x9d, 0x3a, 0x5d, 0xa3, + 0xbe, 0xeb, 0x35, 0xf0, 0x1b, 0x66, 0xcb, 0x97, 0x1e, 0x1e, 0xce, 0x9d, 0xd9, 0x65, 0x60, 0xbb, + 0x83, 0xf0, 0x98, 0xfa, 0x07, 0x87, 0x73, 0xf9, 0x4a, 0xd7, 0xc7, 0xd1, 0xb3, 0x54, 0x52, 0xf2, + 0x25, 0xf6, 0x49, 0x82, 0x10, 0x87, 0x96, 0x36, 0xf0, 0xeb, 0x1d, 0xdd, 0x44, 0x53, 0x34, 0xf1, + 0x4c, 0xd3, 0x09, 0x42, 0xdb, 0xe7, 0x74, 0x89, 0x76, 0xaa, 0x2c, 0xc9, 0x2a, 0xe4, 0x6b, 0xf5, + 0x3d, 0xda, 0xe8, 0x36, 0xe9, 0x6c, 0x1e, 0xd9, 0x9f, 0x15, 0x82, 0x2b, 0xbf, 0xa7, 0x2c, 0x2e, + 0x9f, 0x17, 0xbc, 0x49, 0x20, 0x20, 0xca, 0xd8, 0x47, 0x4c, 0x3e, 0x9d, 0xff, 0xa5, 0x5f, 0x9b, + 0x3b, 0xf5, 0x13, 0xff, 0xe9, 0xe2, 0x29, 0xf3, 0x1f, 0x66, 0xa0, 0x98, 0x64, 0x42, 0x76, 0x60, + 0x7c, 0xa3, 0xd3, 0x70, 0x42, 0xba, 0xd0, 0x74, 0x69, 0x3b, 0x0c, 0x50, 0x48, 0x8e, 0xee, 0xd3, + 0xf3, 0xa2, 0xde, 0xd9, 0x2e, 0x12, 0xda, 0x75, 0x4e, 0x99, 0xe8, 0x95, 0xce, 0x36, 0xae, 0xa7, + 0x86, 0x7a, 0x3a, 0x40, 0x09, 0x3b, 0x59, 0x3d, 0x5c, 0xc3, 0xf7, 0xa9, 0x47, 0xb0, 0x15, 0x02, + 0xd4, 0x6e, 0x6c, 0x1f, 0xa0, 0x64, 0x0e, 0x2e, 0x40, 0x8c, 0x24, 0x45, 0x80, 0x18, 0xd8, 0xfc, + 0x53, 0x03, 0x26, 0x2c, 0x1a, 0x78, 0x5d, 0xbf, 0x4e, 0x17, 0xa9, 0xd3, 0xa0, 0x3e, 0x13, 0xff, + 0x3b, 0x6e, 0xbb, 0x21, 0xe6, 0x14, 0x8a, 0xff, 0xbe, 0xdb, 0x56, 0xa7, 0x30, 0x96, 0x93, 0x4f, + 0xc0, 0x48, 0xad, 0xbb, 0x8d, 0xa8, 0x7c, 0x4e, 0x9d, 0xc1, 0x2f, 0xd6, 0xdd, 0xb6, 0x13, 0xe8, + 0x12, 0x8d, 0x5c, 0x83, 0x91, 0x4d, 0xea, 0x07, 0xb1, 0xc6, 0x43, 0xcd, 0x7e, 0x8f, 0x83, 0x54, + 0x02, 0x81, 0x45, 0x6e, 0xc7, 0x5a, 0x57, 0xac, 0x49, 0x93, 0x09, 0x5d, 0x17, 0x8b, 0x4a, 0x4b, + 0x40, 0x54, 0x51, 0x91, 0x58, 0xe6, 0xb7, 0x32, 0x50, 0xac, 0x38, 0xa1, 0xb3, 0xed, 0x04, 0x62, + 0x3c, 0x37, 0x6f, 0x30, 0x3d, 0xae, 0x74, 0x14, 0xf5, 0x38, 0x6b, 0xf9, 0x87, 0xee, 0xde, 0x0b, + 0xc9, 0xee, 0x8d, 0xb1, 0x05, 0x52, 0x74, 0x2f, 0xee, 0xd4, 0x5b, 0xc7, 0x77, 0xaa, 0x28, 0x3a, + 0x95, 0x97, 0x9d, 0x8a, 0xbb, 0x42, 0xde, 0x82, 0x5c, 0xad, 0x43, 0xeb, 0x42, 0x89, 0x48, 0xdd, + 0xaf, 0x77, 0x8e, 0x21, 0x6c, 0xde, 0x28, 0x17, 0x04, 0x9b, 0x5c, 0xd0, 0xa1, 0x75, 0x0b, 0xc9, + 0x94, 0x49, 0xf3, 0x2f, 0x87, 0x61, 0x26, 0x8d, 0x8c, 0xbc, 0xa5, 0x2f, 0x4e, 0x7c, 0x78, 0x9e, + 0xea, 0xbb, 0x38, 0xcd, 0x1a, 0xfa, 0xf2, 0x74, 0x05, 0xf2, 0x6b, 0x4c, 0x20, 0xeb, 0x5e, 0x53, + 0x8c, 0x1c, 0xd3, 0x8a, 0xf9, 0x8e, 0x84, 0x19, 0x56, 0x54, 0x4e, 0x9e, 0x82, 0xec, 0x86, 0xb5, + 0x24, 0x86, 0x6b, 0xf4, 0xe1, 0xe1, 0x5c, 0xb6, 0xeb, 0xbb, 0xb3, 0x86, 0xc5, 0xa0, 0xe4, 0x1a, + 0x0c, 0x2f, 0x94, 0x16, 0xa8, 0x1f, 0xe2, 0x30, 0x15, 0xca, 0x67, 0x99, 0xb4, 0xd4, 0x1d, 0xbb, + 0x4e, 0xfd, 0x50, 0xab, 0x5e, 0xa0, 0x91, 0x97, 0x21, 0x5b, 0xda, 0xaa, 0x89, 0x91, 0x01, 0x31, + 0x32, 0xa5, 0xad, 0x5a, 0x79, 0x5c, 0x0c, 0x44, 0xd6, 0xb9, 0x1f, 0x30, 0xee, 0xa5, 0xad, 0x9a, + 0xfa, 0xb5, 0x86, 0x8f, 0xf8, 0x5a, 0x97, 0x21, 0xcf, 0xec, 0x0c, 0xb6, 0xc0, 0xa3, 0x52, 0x1c, + 0xe5, 0xe6, 0xd3, 0x9e, 0x80, 0x59, 0x51, 0x29, 0x79, 0x2e, 0x32, 0x5b, 0xf2, 0x31, 0x3f, 0x61, + 0xb6, 0x48, 0x63, 0x85, 0x3c, 0x80, 0xf1, 0xca, 0x41, 0xdb, 0x69, 0xb9, 0x75, 0xb1, 0x84, 0x8f, + 0xe2, 0x12, 0x7e, 0xf5, 0x88, 0xcf, 0x78, 0x55, 0x23, 0xe0, 0xab, 0xba, 0x54, 0xbe, 0xb3, 0x0d, + 0x5e, 0x66, 0x27, 0x57, 0xf8, 0x59, 0xc3, 0xd2, 0x2b, 0x62, 0x73, 0x49, 0xaa, 0x48, 0xb4, 0xab, + 0x62, 0xb1, 0x93, 0xe0, 0x78, 0x2e, 0xf9, 0x02, 0xa2, 0xce, 0xa5, 0x68, 0xd1, 0x7d, 0x0b, 0xb2, + 0xb7, 0x17, 0xd6, 0x66, 0xc7, 0x90, 0x07, 0x11, 0x3c, 0x6e, 0x2f, 0xac, 0x2d, 0x34, 0xbd, 0x6e, + 0xa3, 0xf6, 0xde, 0x72, 0xf9, 0xac, 0x60, 0x33, 0xbe, 0x5b, 0xef, 0x68, 0x2d, 0x62, 0x74, 0xa4, + 0x0a, 0x79, 0xd9, 0xcb, 0xd9, 0x02, 0xf2, 0x98, 0x4a, 0x74, 0x7e, 0xf3, 0x06, 0x9f, 0x6b, 0x0d, + 0xf1, 0x5b, 0x6d, 0x85, 0xc4, 0x21, 0x37, 0x50, 0xca, 0x1e, 0x1c, 0x2c, 0x55, 0x82, 0xd9, 0xf1, + 0x8b, 0xd9, 0xcb, 0xa3, 0x28, 0x1e, 0xd3, 0x1d, 0x06, 0xb3, 0xdd, 0x86, 0x6a, 0xec, 0x44, 0x88, + 0xe7, 0xb7, 0x80, 0xf4, 0x0e, 0x66, 0x8a, 0xf9, 0xf1, 0xb2, 0x6a, 0x7e, 0x8c, 0xcd, 0x9f, 0x16, + 0x0d, 0x5c, 0xf0, 0x5a, 0x2d, 0xa7, 0xdd, 0x40, 0xda, 0xcd, 0x79, 0xd5, 0x2a, 0x29, 0xc1, 0x44, + 0xdc, 0xfa, 0x65, 0x37, 0x08, 0xc9, 0x35, 0x18, 0x95, 0x10, 0xb6, 0xf2, 0x64, 0x53, 0xfb, 0x69, + 0xc5, 0x38, 0xe6, 0x1f, 0x66, 0x00, 0xe2, 0x92, 0x27, 0x54, 0x39, 0x7d, 0x4a, 0x53, 0x4e, 0xa7, + 0x93, 0x52, 0xdd, 0x57, 0x2d, 0x91, 0x77, 0x60, 0x98, 0xd9, 0x69, 0x5d, 0x69, 0x87, 0x9e, 0x4d, + 0x92, 0x62, 0xe1, 0xe6, 0x8d, 0xf2, 0x84, 0x20, 0x1e, 0x0e, 0x10, 0x62, 0x09, 0x32, 0x45, 0xaf, + 0xfd, 0xee, 0x50, 0xfc, 0x31, 0x84, 0x46, 0xbb, 0xac, 0xa8, 0x24, 0x23, 0x9e, 0xc4, 0x52, 0x25, + 0x29, 0x0a, 0xe9, 0x1c, 0x57, 0x48, 0x7c, 0x50, 0x47, 0x84, 0x42, 0x4a, 0xaa, 0x23, 0x3e, 0x80, + 0xc7, 0xaa, 0xa3, 0x4e, 0x72, 0xae, 0xe7, 0x50, 0x0c, 0x2e, 0xa7, 0x8e, 0x4a, 0xda, 0x2c, 0xbf, + 0x78, 0xdc, 0x2c, 0x4f, 0xce, 0xf1, 0x1b, 0xfd, 0x14, 0xe0, 0x69, 0x39, 0x25, 0x9d, 0xfb, 0x2a, + 0x39, 0x2a, 0xc2, 0x37, 0xf8, 0x7c, 0x1e, 0xee, 0x3b, 0x9f, 0x4f, 0xa7, 0xce, 0x67, 0x3e, 0x9b, + 0xdf, 0x80, 0xa1, 0xd2, 0x8f, 0x74, 0x7d, 0x2a, 0x0c, 0xc6, 0x82, 0xac, 0x93, 0xc1, 0x22, 0x45, + 0x30, 0xe9, 0xb0, 0x9f, 0xaa, 0xa1, 0x8d, 0xe5, 0xac, 0xe6, 0xf5, 0xe5, 0x9a, 0x30, 0x06, 0x49, + 0x62, 0x58, 0xd6, 0x97, 0x95, 0x66, 0x87, 0x5a, 0xaf, 0x19, 0x15, 0xb9, 0x06, 0x99, 0x52, 0x05, + 0x77, 0x98, 0x63, 0xf3, 0xa3, 0xb2, 0xda, 0x4a, 0x79, 0x46, 0x90, 0x14, 0x1c, 0x6d, 0xd3, 0x51, + 0xaa, 0x90, 0x32, 0x0c, 0xdd, 0x3d, 0xa8, 0xbd, 0xb7, 0x2c, 0xb4, 0xdf, 0xb4, 0x94, 0x6b, 0x06, + 0x5b, 0xc5, 0xa5, 0x2b, 0x88, 0x5b, 0xdc, 0x3a, 0x08, 0xbe, 0xdc, 0x54, 0x5b, 0x8c, 0x68, 0x1f, + 0x9d, 0x02, 0xf9, 0x1b, 0xaa, 0x81, 0x22, 0x64, 0x9d, 0x6d, 0x84, 0x85, 0xc4, 0x19, 0xb1, 0xb9, + 0xd4, 0x23, 0x71, 0x91, 0xbc, 0xbd, 0xc4, 0xbf, 0x7e, 0xa6, 0xe7, 0xeb, 0x8f, 0x29, 0xcb, 0x1f, + 0xff, 0xe6, 0xd1, 0x58, 0x64, 0x3f, 0xf4, 0x58, 0x90, 0x77, 0xa0, 0x70, 0xd7, 0x69, 0x3b, 0xbb, + 0xb4, 0xb1, 0x11, 0x30, 0xb3, 0x37, 0x87, 0x5a, 0x98, 0xd9, 0x09, 0x67, 0x5b, 0x1c, 0x6e, 0x77, + 0x03, 0xcd, 0xaa, 0xb5, 0x34, 0x02, 0x72, 0x5d, 0xca, 0xce, 0x50, 0x8a, 0xec, 0xc8, 0x25, 0x7b, + 0x08, 0x65, 0x47, 0x48, 0x8c, 0xf9, 0x9f, 0xb3, 0xd8, 0x47, 0xf2, 0x0a, 0x0c, 0x5b, 0x74, 0x37, + 0xb6, 0x4e, 0x70, 0x97, 0xeb, 0x23, 0x44, 0x1d, 0x18, 0x8e, 0x83, 0x4b, 0x1f, 0x6d, 0x04, 0x7b, + 0xee, 0x4e, 0x28, 0x46, 0x27, 0x5a, 0xfa, 0x04, 0x58, 0x59, 0xfa, 0x04, 0x44, 0x5b, 0xfa, 0x04, + 0x8c, 0xcd, 0x2f, 0xab, 0x52, 0x13, 0x83, 0x26, 0x47, 0xd8, 0xaa, 0x28, 0x82, 0xea, 0x6b, 0x2b, + 0x0f, 0xc3, 0x26, 0x37, 0x61, 0xb4, 0x54, 0xaf, 0x7b, 0x5d, 0x65, 0x9b, 0x38, 0xfb, 0xf0, 0x70, + 0x6e, 0xc6, 0xe1, 0x40, 0xdd, 0xa9, 0x11, 0xa3, 0x92, 0x1a, 0x8c, 0x55, 0xd9, 0xde, 0xca, 0x5d, + 0x70, 0xea, 0x7b, 0x72, 0x90, 0xe4, 0x2c, 0x51, 0x4a, 0x22, 0x5b, 0xff, 0x34, 0x45, 0x60, 0x9d, + 0x01, 0x55, 0xdf, 0x81, 0x82, 0x4b, 0xd6, 0x61, 0xac, 0x46, 0xeb, 0x3e, 0x0d, 0x6b, 0xa1, 0xe7, + 0xd3, 0xc4, 0xa4, 0x57, 0x4a, 0xca, 0xcf, 0xc8, 0xed, 0x5d, 0x80, 0x40, 0x3b, 0x60, 0x50, 0x95, + 0xab, 0x82, 0xcc, 0xed, 0xf4, 0x96, 0xe7, 0x1f, 0x54, 0xca, 0x42, 0x11, 0xc4, 0xab, 0x06, 0x07, + 0xab, 0x76, 0x3a, 0x83, 0x34, 0xb6, 0x75, 0x3b, 0x9d, 0x63, 0x99, 0x5f, 0xd1, 0x9a, 0xc7, 0x86, + 0xee, 0x0e, 0x3d, 0x58, 0xf3, 0xe9, 0x8e, 0xfb, 0x40, 0x7c, 0x69, 0x1c, 0xba, 0x7d, 0x7a, 0x60, + 0x77, 0x10, 0xaa, 0x0e, 0x5d, 0x84, 0x4a, 0x3e, 0x09, 0xf9, 0x3b, 0x77, 0x6b, 0x77, 0xe8, 0xc1, + 0x52, 0x45, 0xa8, 0x72, 0x4e, 0xd6, 0x0a, 0x6c, 0x46, 0xaa, 0x8d, 0x78, 0x84, 0x69, 0x96, 0x63, + 0x31, 0x61, 0x35, 0x2f, 0x34, 0xbb, 0x41, 0x48, 0xfd, 0xa5, 0x8a, 0x5a, 0x73, 0x9d, 0x03, 0x13, + 0x1f, 0x2d, 0x42, 0x35, 0xff, 0xa3, 0x81, 0x22, 0x42, 0x5e, 0x07, 0x58, 0x6a, 0xb3, 0xbd, 0x57, + 0x9d, 0x46, 0x0c, 0xd0, 0xbf, 0xe3, 0x0a, 0xa8, 0xce, 0x41, 0x41, 0xd6, 0xab, 0xce, 0x0c, 0x5c, + 0x35, 0xab, 0x52, 0xee, 0xe4, 0x84, 0xab, 0x4f, 0x54, 0xe9, 0x0b, 0x68, 0xa2, 0xca, 0x18, 0x99, + 0x5c, 0x82, 0x91, 0xa5, 0xd2, 0xdd, 0x52, 0x37, 0xdc, 0x43, 0x01, 0xcd, 0xf3, 0xe5, 0xd1, 0x75, + 0x5a, 0xb6, 0xd3, 0x0d, 0xf7, 0x2c, 0x59, 0x68, 0xfe, 0xab, 0x8c, 0x26, 0x93, 0xc4, 0x02, 0x62, + 0xd1, 0x4e, 0xd3, 0xad, 0xa3, 0x65, 0x78, 0xdb, 0xf7, 0xba, 0x9d, 0xa8, 0xb7, 0xe6, 0xc3, 0xc3, + 0xb9, 0x67, 0xfc, 0xb8, 0xd4, 0xde, 0x65, 0xc5, 0x7a, 0x1b, 0x52, 0xa8, 0xc9, 0x67, 0xa0, 0xc0, + 0xd4, 0x83, 0xf8, 0xc9, 0x76, 0xd3, 0x4c, 0xad, 0x5c, 0xc0, 0xdd, 0x72, 0x40, 0xfd, 0x88, 0x8d, + 0xa6, 0x57, 0x54, 0x0a, 0xd2, 0x80, 0xd9, 0x75, 0xdf, 0x69, 0x07, 0x6e, 0x58, 0x6d, 0xd7, 0xfd, + 0x03, 0x54, 0x67, 0xd5, 0xb6, 0xb3, 0xdd, 0xa4, 0x0d, 0x1c, 0x96, 0x7c, 0xf9, 0xf2, 0xc3, 0xc3, + 0xb9, 0xe7, 0x43, 0x8e, 0x63, 0xd3, 0x08, 0xc9, 0xa6, 0x1c, 0x4b, 0xe1, 0xdc, 0x97, 0x13, 0x53, + 0x7f, 0xd5, 0x76, 0xa3, 0xe3, 0xb9, 0xed, 0x10, 0x7d, 0x9d, 0xb9, 0x68, 0x9b, 0x74, 0x96, 0x0a, + 0xb8, 0xcd, 0xe6, 0x80, 0xda, 0x4c, 0x95, 0xc0, 0xfc, 0x9f, 0x46, 0x3c, 0x6b, 0xc8, 0x9b, 0x30, + 0x26, 0xbe, 0xa4, 0xe2, 0x5a, 0x3c, 0xcf, 0xe6, 0x9f, 0xfc, 0xec, 0x6c, 0x8f, 0xa1, 0xce, 0x3f, + 0x05, 0x9d, 0x99, 0x83, 0xa5, 0x85, 0x65, 0xa4, 0x54, 0xcc, 0x41, 0xa7, 0xde, 0x4c, 0x52, 0x49, + 0x34, 0x26, 0x2c, 0xeb, 0xcb, 0x35, 0x7d, 0x54, 0x50, 0x58, 0xc2, 0x66, 0x90, 0x32, 0x0c, 0x0a, + 0xf2, 0xa3, 0x77, 0xfc, 0x27, 0x0c, 0x18, 0x53, 0xec, 0x0b, 0x26, 0xf0, 0x6b, 0xbe, 0xf7, 0x01, + 0xad, 0x87, 0xfa, 0x5c, 0xeb, 0x70, 0x60, 0x42, 0xe0, 0x23, 0xd4, 0xc4, 0x1c, 0xcb, 0x9c, 0x60, + 0x8e, 0x99, 0x1f, 0x88, 0xa5, 0x87, 0x5c, 0xd2, 0x7c, 0xb9, 0xe8, 0xec, 0x48, 0x0c, 0x59, 0x4e, + 0x8e, 0x97, 0x32, 0xb9, 0x32, 0x27, 0x98, 0x5c, 0xe6, 0x6f, 0x1a, 0xcc, 0x52, 0x21, 0xd7, 0x00, + 0xee, 0xd0, 0x83, 0xd0, 0xd9, 0xbe, 0xe5, 0x36, 0x35, 0xf7, 0xfe, 0x3e, 0x42, 0xed, 0x1d, 0xb7, + 0x49, 0x2d, 0x05, 0x85, 0xed, 0x70, 0xee, 0xf8, 0xdb, 0xaf, 0x21, 0x7a, 0x26, 0xb2, 0x38, 0xa7, + 0xf7, 0xfd, 0xed, 0xd7, 0x10, 0x59, 0xd3, 0x61, 0x02, 0x91, 0x98, 0x30, 0x5c, 0xf1, 0x5a, 0x8e, + 0x2b, 0xad, 0x7c, 0x60, 0xa6, 0x72, 0x03, 0x21, 0x96, 0x28, 0x61, 0x36, 0x6e, 0x6d, 0x6d, 0x45, + 0x7c, 0x37, 0xb4, 0x71, 0x83, 0x4e, 0xdb, 0x62, 0x30, 0xf3, 0xb7, 0x0c, 0x18, 0x53, 0x0c, 0x30, + 0xf2, 0x49, 0xe1, 0x0a, 0x35, 0xd0, 0x91, 0x7f, 0xa6, 0xd7, 0x44, 0x63, 0xa5, 0x7c, 0x77, 0xd2, + 0xf2, 0x1a, 0x54, 0x38, 0x46, 0x63, 0xbb, 0x25, 0x33, 0x88, 0xdd, 0xf2, 0x3a, 0x00, 0xdf, 0xef, + 0xe2, 0x97, 0x50, 0x14, 0x97, 0x72, 0xf0, 0xa1, 0x8e, 0x6d, 0x8c, 0x6c, 0x5a, 0x50, 0x50, 0x6d, + 0x16, 0x52, 0x86, 0x71, 0xe1, 0xde, 0x11, 0x7b, 0x1d, 0x3e, 0xce, 0xa8, 0x3d, 0x04, 0xb7, 0x5e, + 0x77, 0x93, 0x4e, 0x62, 0xfe, 0x64, 0x06, 0xf2, 0x02, 0x32, 0xff, 0x84, 0x6e, 0xc3, 0x5e, 0xd3, + 0xb6, 0x61, 0xd3, 0xd1, 0xf2, 0x1e, 0x39, 0x15, 0xe6, 0x8f, 0xf1, 0x0d, 0xbd, 0x0e, 0x05, 0x39, + 0x04, 0xb8, 0x9b, 0x7d, 0x09, 0x46, 0xa4, 0x77, 0x93, 0xef, 0x65, 0x27, 0x35, 0x9e, 0x9b, 0xf3, + 0x96, 0x2c, 0x37, 0xff, 0x62, 0x48, 0xd2, 0xf2, 0x9a, 0xd8, 0x10, 0x96, 0x1a, 0x0d, 0x5f, 0x1d, + 0x42, 0xa7, 0xd1, 0xf0, 0x2d, 0x84, 0xb2, 0x8f, 0xbf, 0xd6, 0xdd, 0x6e, 0xba, 0x75, 0xc4, 0x51, + 0x26, 0x56, 0x07, 0xa1, 0x36, 0x43, 0x55, 0x3f, 0x7e, 0x8c, 0xac, 0xb9, 0x66, 0xb2, 0x47, 0xba, + 0x66, 0xbe, 0x08, 0xa3, 0x0b, 0xad, 0x86, 0xb6, 0x0b, 0x33, 0x53, 0x06, 0xe5, 0x6a, 0x84, 0xc4, + 0xf7, 0x5f, 0x17, 0xc4, 0x18, 0xcd, 0xd4, 0x5b, 0x8d, 0xde, 0xbd, 0x57, 0xcc, 0x52, 0xf3, 0xad, + 0x0c, 0x3d, 0x8a, 0x6f, 0xe5, 0x26, 0x8c, 0x6e, 0x04, 0x74, 0xbd, 0xdb, 0x6e, 0xd3, 0x26, 0x1a, + 0x67, 0x79, 0xae, 0x0a, 0xbb, 0x01, 0xb5, 0x43, 0x84, 0xaa, 0x0d, 0x88, 0x50, 0x55, 0xb1, 0x1a, + 0x39, 0x42, 0xac, 0x3e, 0x09, 0xb9, 0x52, 0xa7, 0x23, 0x9d, 0x4e, 0xd1, 0x16, 0xa1, 0xd3, 0x41, + 0x03, 0x7a, 0xc2, 0xe9, 0x74, 0x74, 0x17, 0x12, 0x62, 0x13, 0x0a, 0xe4, 0x4e, 0x77, 0x9b, 0xfa, + 0x6d, 0x1a, 0xd2, 0x40, 0x2c, 0x3b, 0xc1, 0x2c, 0x20, 0x8f, 0x59, 0x79, 0xb6, 0x97, 0x44, 0xe0, + 0x0b, 0xc2, 0x7e, 0x77, 0x9b, 0xda, 0x62, 0x05, 0x53, 0xc7, 0x2e, 0x85, 0x21, 0x7a, 0x74, 0x28, + 0xf5, 0x51, 0x0e, 0xc6, 0x62, 0x7d, 0xd7, 0xa1, 0xd4, 0x4f, 0x4a, 0x41, 0x84, 0xa8, 0xb9, 0x81, + 0x0a, 0x83, 0xba, 0x81, 0x6a, 0x30, 0xa1, 0x7f, 0xe9, 0xc7, 0xb0, 0x83, 0x7b, 0x37, 0x97, 0xcf, + 0x17, 0x47, 0xcd, 0xaf, 0x65, 0x60, 0xac, 0xd4, 0xe9, 0x3c, 0xe1, 0x3e, 0xe6, 0x1f, 0xd2, 0xf4, + 0xc7, 0x99, 0x58, 0x4e, 0x4e, 0xe0, 0x5e, 0xfe, 0xed, 0x0c, 0x4c, 0x26, 0x28, 0xd4, 0xd6, 0x1b, + 0x03, 0xfa, 0x5c, 0x33, 0x03, 0xfa, 0x5c, 0xb3, 0xfd, 0x7d, 0xae, 0xea, 0xec, 0xcc, 0x3d, 0xca, + 0xec, 0x7c, 0x11, 0xb2, 0xa5, 0x4e, 0x27, 0xb9, 0x5d, 0xed, 0x74, 0x36, 0x6f, 0xf0, 0x65, 0xd4, + 0xe9, 0x74, 0x2c, 0x86, 0xa1, 0x49, 0xe5, 0xf0, 0x80, 0x52, 0x69, 0xbe, 0x0a, 0xa3, 0xc8, 0x0b, + 0x15, 0xee, 0x45, 0x31, 0x53, 0xb9, 0xb6, 0xd5, 0xea, 0xe2, 0xb3, 0xd2, 0xfc, 0x0b, 0x03, 0x86, + 0xf0, 0xf7, 0x13, 0x2a, 0x63, 0xf3, 0x9a, 0x8c, 0x15, 0x15, 0x19, 0x1b, 0x44, 0xba, 0xfe, 0x5b, + 0x16, 0x47, 0x4b, 0xc8, 0x95, 0xf0, 0xda, 0x19, 0x29, 0x5e, 0xbb, 0x47, 0x58, 0x5f, 0xf6, 0x93, + 0xfe, 0xbb, 0x2c, 0x7e, 0x8c, 0xe7, 0x92, 0x4d, 0x7d, 0x2c, 0xae, 0xbb, 0x45, 0x20, 0x4b, 0xed, + 0x80, 0xd6, 0xbb, 0x3e, 0xad, 0xed, 0xbb, 0x9d, 0x4d, 0xea, 0xbb, 0x3b, 0x07, 0x62, 0x37, 0x86, + 0x4b, 0x80, 0x2b, 0x4a, 0xed, 0x60, 0xdf, 0xed, 0x30, 0x2b, 0xc6, 0xdd, 0x39, 0xb0, 0x52, 0x68, + 0xc8, 0x3b, 0x30, 0x62, 0xd1, 0xfb, 0xbe, 0x1b, 0x4a, 0x9f, 0xc1, 0x44, 0xe4, 0xec, 0x40, 0x28, + 0x37, 0xc7, 0x7c, 0xfe, 0x43, 0xfd, 0xfe, 0xa2, 0x9c, 0xcc, 0x73, 0x3f, 0x12, 0xf7, 0x0d, 0x8c, + 0xc7, 0xbd, 0x2d, 0x6d, 0xd5, 0xca, 0x53, 0xe9, 0x4e, 0xc4, 0x8f, 0xce, 0x31, 0xf6, 0xed, 0x21, + 0x9c, 0x74, 0xc7, 0x04, 0x5d, 0x1c, 0xe1, 0xb6, 0xd5, 0x05, 0x20, 0x7b, 0x12, 0x01, 0xd8, 0x84, + 0x42, 0x8d, 0x4d, 0x7d, 0xdd, 0x7f, 0x7b, 0x21, 0x1e, 0x91, 0xab, 0x6a, 0xf1, 0x51, 0xf1, 0x16, + 0x1a, 0x1f, 0x62, 0x27, 0x05, 0x8b, 0xc7, 0x71, 0x3c, 0xad, 0x30, 0x4e, 0x11, 0xa9, 0x48, 0x47, + 0xd5, 0xf9, 0x60, 0x9d, 0x58, 0x98, 0x86, 0x1f, 0x4d, 0x98, 0x46, 0x3e, 0x94, 0x30, 0x25, 0x22, + 0x5d, 0xf2, 0x27, 0x89, 0x74, 0x39, 0xff, 0x0e, 0x4c, 0xf5, 0x8c, 0xf0, 0x49, 0xa2, 0x45, 0x3e, + 0x3a, 0xb1, 0xfc, 0x31, 0x50, 0xa6, 0x4b, 0xde, 0xa2, 0x0d, 0xd7, 0xa7, 0xf5, 0x10, 0xd5, 0xb5, + 0xd0, 0xb0, 0xbe, 0x80, 0x25, 0x1c, 0x89, 0x08, 0x23, 0x6f, 0xc3, 0x08, 0x3f, 0x6d, 0xe7, 0xfe, + 0x8d, 0x78, 0x9a, 0x71, 0xa8, 0x08, 0x79, 0xe2, 0x18, 0xea, 0xa8, 0x0a, 0x22, 0xf3, 0x36, 0x0c, + 0x8b, 0xd3, 0xfa, 0xa3, 0xe7, 0xc5, 0x1c, 0x0c, 0x6d, 0xc6, 0x23, 0x83, 0x27, 0xac, 0xbc, 0x13, + 0x16, 0x87, 0x9b, 0x3f, 0x63, 0xc0, 0x84, 0xde, 0x4b, 0x72, 0x15, 0x86, 0x45, 0x38, 0x89, 0x81, + 0xe1, 0x24, 0xac, 0x37, 0xc3, 0x3c, 0x90, 0x44, 0x0b, 0x1f, 0x11, 0x58, 0x6c, 0xb9, 0x10, 0x1c, + 0x84, 0xaf, 0x06, 0x97, 0x0b, 0x21, 0xa4, 0x96, 0x2c, 0x63, 0x3b, 0x53, 0x8b, 0x06, 0xdd, 0x66, + 0xa8, 0xee, 0x4c, 0x7d, 0x84, 0x58, 0xa2, 0xc4, 0x5c, 0x80, 0x61, 0xae, 0x67, 0xd8, 0xac, 0xad, + 0x3e, 0x08, 0xa9, 0xdf, 0x76, 0x9a, 0xba, 0xff, 0x8c, 0x0a, 0x68, 0x62, 0xbf, 0x1d, 0x23, 0x9b, + 0x87, 0x06, 0x40, 0xad, 0xb6, 0x78, 0x87, 0x1e, 0xac, 0x39, 0xae, 0x8f, 0xde, 0x05, 0x9c, 0xd2, + 0x77, 0xc4, 0x27, 0x2f, 0x08, 0xef, 0x02, 0x9f, 0xfe, 0xfb, 0xf4, 0x40, 0xf3, 0x2e, 0x48, 0x54, + 0xd4, 0x1b, 0xbe, 0x7b, 0xcf, 0x09, 0x29, 0x23, 0xcc, 0x20, 0x21, 0xd7, 0x1b, 0x1c, 0x9a, 0xa0, + 0x54, 0x90, 0xc9, 0x17, 0x60, 0x22, 0xfe, 0x85, 0x3e, 0x92, 0x2c, 0xee, 0x9f, 0xa5, 0x58, 0xe9, + 0x85, 0xe5, 0x67, 0x1e, 0x1e, 0xce, 0x9d, 0x57, 0xb8, 0x26, 0xbd, 0x27, 0x09, 0x66, 0xe6, 0xaf, + 0x1b, 0xe8, 0xbc, 0x91, 0x1d, 0xbc, 0x04, 0xb9, 0xe8, 0x8c, 0xa0, 0xc0, 0x5d, 0x18, 0x89, 0x8d, + 0x36, 0x96, 0x93, 0xe7, 0x20, 0x1b, 0xf7, 0x04, 0xf5, 0xb8, 0xde, 0x03, 0x56, 0x4a, 0x6e, 0xc3, + 0xc8, 0x40, 0x6d, 0x46, 0x11, 0x4f, 0x69, 0xab, 0xa4, 0xc6, 0xaf, 0xf0, 0xee, 0xd6, 0xfa, 0xc7, + 0xf7, 0x2b, 0x7c, 0x33, 0x03, 0x93, 0x6c, 0x5c, 0x4b, 0xdd, 0x70, 0xcf, 0xf3, 0xdd, 0xf0, 0xe0, + 0x89, 0xf5, 0x16, 0xbc, 0xa9, 0x59, 0x62, 0xe7, 0xa5, 0xee, 0x53, 0xfb, 0x36, 0x90, 0xd3, 0xe0, + 0x4f, 0x46, 0x60, 0x3a, 0x85, 0x8a, 0xbc, 0x22, 0xa2, 0x41, 0x63, 0xd7, 0x1e, 0x46, 0x7b, 0xfe, + 0xe0, 0x70, 0xae, 0x20, 0xd1, 0xd7, 0xe3, 0xe8, 0xcf, 0x79, 0xdd, 0x13, 0xca, 0x47, 0x0a, 0xc3, + 0x08, 0x55, 0x4f, 0xa8, 0xee, 0xff, 0x2c, 0x41, 0x61, 0x61, 0x8f, 0xd6, 0xf7, 0xdd, 0xf6, 0xee, + 0x1d, 0x7a, 0xc0, 0x0d, 0xb5, 0x42, 0xf9, 0x69, 0xb6, 0x03, 0xad, 0x0b, 0x38, 0xfb, 0xa4, 0xfa, + 0xe6, 0x56, 0x23, 0x21, 0x6f, 0xc3, 0x58, 0xcd, 0xdd, 0x6d, 0x4b, 0x0e, 0x39, 0xe4, 0x70, 0x01, + 0x0f, 0x40, 0x38, 0xb8, 0x97, 0x81, 0x4a, 0x40, 0x5e, 0x82, 0x21, 0xcb, 0x6b, 0x52, 0xbe, 0x96, + 0x8b, 0xf8, 0x42, 0x9f, 0x01, 0xd4, 0x83, 0x33, 0xc4, 0x20, 0x8b, 0x30, 0xc2, 0xfe, 0xb8, 0xeb, + 0x74, 0x70, 0x73, 0x10, 0x9f, 0xbf, 0x08, 0x68, 0xc7, 0x6d, 0xef, 0xaa, 0x3b, 0x92, 0x26, 0xb5, + 0x5b, 0x4e, 0x47, 0x5b, 0x5c, 0x39, 0x22, 0xd9, 0x84, 0xb1, 0x58, 0x11, 0x04, 0xb3, 0x23, 0x5a, + 0x98, 0x41, 0x5c, 0x52, 0x7e, 0x56, 0x30, 0x3b, 0x1b, 0x36, 0xf9, 0x09, 0x48, 0x87, 0xe1, 0xeb, + 0x9d, 0x51, 0x18, 0x69, 0x3b, 0xa6, 0x7c, 0xff, 0x1d, 0x93, 0x71, 0xec, 0x8e, 0xa9, 0x01, 0x20, + 0x06, 0xa9, 0xd4, 0xdc, 0x15, 0xe1, 0xc0, 0x2f, 0xf5, 0x17, 0xb0, 0xab, 0x31, 0x32, 0xce, 0x49, + 0xee, 0x05, 0x14, 0xe3, 0xef, 0x34, 0x77, 0x35, 0x2f, 0x60, 0x84, 0xca, 0x86, 0x21, 0x56, 0x35, + 0xd2, 0x33, 0x21, 0x87, 0x21, 0x2e, 0x89, 0x87, 0xe1, 0x83, 0xfb, 0x61, 0xbf, 0x61, 0x50, 0x18, + 0x91, 0x15, 0x80, 0x52, 0x3d, 0x74, 0xef, 0x51, 0x14, 0x89, 0x31, 0x6d, 0x20, 0x16, 0x4a, 0x77, + 0xe8, 0x41, 0x8d, 0x86, 0xf1, 0xe9, 0x9b, 0x83, 0xa8, 0x09, 0x31, 0xb1, 0x14, 0x0e, 0xa4, 0x03, + 0xa7, 0x4b, 0x8d, 0x86, 0xcb, 0x46, 0xc6, 0x69, 0xae, 0xfb, 0x4c, 0x7e, 0x1b, 0xc8, 0xba, 0x90, + 0xce, 0xfa, 0x25, 0xc1, 0xfa, 0x59, 0x27, 0xa2, 0xb2, 0x43, 0x4e, 0x96, 0xac, 0x26, 0x9d, 0xb1, + 0xb9, 0x0a, 0x13, 0xfa, 0x90, 0xea, 0xc1, 0xd1, 0x05, 0xc8, 0x5b, 0xb5, 0x92, 0x5d, 0x5b, 0x2c, + 0x5d, 0x2f, 0x1a, 0xa4, 0x08, 0x05, 0xf1, 0x6b, 0xde, 0x9e, 0x7f, 0xed, 0x66, 0x31, 0xa3, 0x41, + 0x5e, 0xbb, 0x3e, 0x5f, 0xcc, 0x9a, 0xbf, 0x6b, 0x40, 0x5e, 0xb6, 0x8f, 0xdc, 0x84, 0x6c, 0xad, + 0xb6, 0x98, 0x88, 0x6e, 0x89, 0x97, 0x5e, 0xbe, 0xc8, 0x04, 0xc1, 0x9e, 0xba, 0xc8, 0xd4, 0x6a, + 0x8b, 0x8c, 0x6e, 0x7d, 0xb9, 0x26, 0x2c, 0x9f, 0x14, 0x71, 0x9d, 0xea, 0x73, 0xe4, 0x7f, 0x13, + 0xb2, 0xef, 0x6e, 0xad, 0x8b, 0x6d, 0x58, 0xca, 0xf7, 0x45, 0xba, 0x0f, 0xee, 0xab, 0x4b, 0x1f, + 0x23, 0x30, 0x2d, 0x18, 0x53, 0xa6, 0x16, 0xb7, 0x44, 0x5a, 0x5e, 0x14, 0x36, 0x2c, 0x2c, 0x11, + 0x06, 0xb1, 0x44, 0x09, 0x33, 0x9c, 0x96, 0xbd, 0xba, 0xd3, 0x14, 0x26, 0x0d, 0x1a, 0x4e, 0x4d, + 0x06, 0xb0, 0x38, 0xdc, 0xfc, 0x03, 0x03, 0x8a, 0x6b, 0xbe, 0x77, 0xcf, 0x65, 0x1a, 0x78, 0xdd, + 0xdb, 0xa7, 0xed, 0xcd, 0xeb, 0xe4, 0x55, 0xa9, 0x04, 0x8c, 0x68, 0xd3, 0x3f, 0x84, 0x4a, 0xe0, + 0x07, 0x87, 0x73, 0x50, 0x3b, 0x08, 0x42, 0xda, 0x62, 0xe5, 0x52, 0x11, 0x28, 0xd1, 0xd7, 0x99, + 0xc1, 0x23, 0x3a, 0x8f, 0x89, 0xbe, 0x9e, 0x83, 0x21, 0x6c, 0x8e, 0x12, 0x54, 0x37, 0x14, 0x32, + 0x80, 0xc5, 0xe1, 0x8a, 0xc2, 0xfe, 0x56, 0xa6, 0xa7, 0x0f, 0xf3, 0x1f, 0xab, 0xa8, 0x48, 0xbd, + 0x73, 0x03, 0x2d, 0x62, 0xef, 0xc3, 0x4c, 0x72, 0x48, 0xd0, 0x21, 0x53, 0x82, 0x49, 0x1d, 0x2e, + 0x7d, 0x33, 0x67, 0x53, 0xeb, 0xda, 0x9c, 0xb7, 0x92, 0xf8, 0xe6, 0xf7, 0x0c, 0x18, 0xc5, 0x3f, + 0xad, 0x6e, 0x13, 0x4f, 0x94, 0x4a, 0x5b, 0x35, 0x71, 0xdc, 0xaf, 0x5a, 0xb8, 0xce, 0xfd, 0xc0, + 0x16, 0xb1, 0x01, 0x9a, 0x1e, 0x89, 0x90, 0x05, 0x29, 0x0f, 0x6e, 0x90, 0x07, 0xa4, 0x11, 0x29, + 0x8f, 0x82, 0x08, 0x12, 0xa4, 0x02, 0x19, 0x4f, 0x0a, 0xb7, 0x6a, 0x4c, 0xfc, 0xc4, 0xd7, 0xe0, + 0x27, 0x85, 0x8c, 0xce, 0x6b, 0xea, 0x27, 0x85, 0x1c, 0x8d, 0xbc, 0x0a, 0xc3, 0xac, 0x6a, 0x4b, + 0x1e, 0x18, 0xe1, 0xd6, 0x04, 0xdb, 0xe8, 0x6b, 0xb1, 0x16, 0x1c, 0xc9, 0xfc, 0x5b, 0xd9, 0xe4, + 0x00, 0x0a, 0x2b, 0xe0, 0x84, 0x73, 0xe3, 0x0d, 0x18, 0x2a, 0x35, 0x9b, 0xde, 0x7d, 0xa1, 0x25, + 0xa4, 0x7f, 0x28, 0x1a, 0x3f, 0xbe, 0xc2, 0x3a, 0x0c, 0x45, 0x0b, 0x2c, 0x62, 0x00, 0xb2, 0x00, + 0xa3, 0xa5, 0xad, 0xda, 0xd2, 0x52, 0x65, 0x7d, 0x7d, 0x59, 0x5c, 0x7a, 0x79, 0x41, 0x8e, 0x8f, + 0xeb, 0x36, 0xec, 0x30, 0x6c, 0xf6, 0x89, 0x89, 0x8f, 0xe9, 0xc8, 0x5b, 0x00, 0xef, 0x7a, 0x6e, + 0xfb, 0x2e, 0x0d, 0xf7, 0xbc, 0x86, 0xe8, 0x3c, 0x33, 0x29, 0xc6, 0x3e, 0xf0, 0xdc, 0xb6, 0xdd, + 0x42, 0x30, 0x6b, 0x7b, 0x8c, 0x64, 0x29, 0x7f, 0xb3, 0x91, 0x2e, 0x7b, 0x21, 0xda, 0x30, 0x43, + 0xf1, 0x48, 0x6f, 0x7b, 0x61, 0xcf, 0x99, 0xac, 0x40, 0x23, 0x2d, 0x98, 0xac, 0x75, 0x77, 0x77, + 0x29, 0xd3, 0xde, 0xc2, 0x31, 0x30, 0x2c, 0xb6, 0xa3, 0xd1, 0x95, 0x21, 0xbe, 0x49, 0x63, 0x5b, + 0xb7, 0xa0, 0xfc, 0x0a, 0x13, 0xe4, 0xef, 0x1e, 0xce, 0x89, 0xcb, 0x1c, 0xcc, 0x7e, 0x0d, 0x24, + 0x7d, 0xaf, 0xbf, 0x29, 0xc9, 0xdb, 0xfc, 0xd9, 0x0c, 0x4c, 0xf0, 0xdd, 0x35, 0x97, 0xcf, 0x27, + 0x76, 0xee, 0xbf, 0xa1, 0xcd, 0xfd, 0x73, 0x72, 0x1d, 0x52, 0xba, 0x36, 0xd0, 0xcc, 0xdf, 0x03, + 0xd2, 0x4b, 0x43, 0x2c, 0xe9, 0x03, 0x1a, 0x64, 0xd2, 0x5f, 0x8f, 0x03, 0x81, 0x02, 0x24, 0xb2, + 0x51, 0xf3, 0x06, 0x96, 0xc6, 0xc3, 0xfc, 0x99, 0x0c, 0x8c, 0x2b, 0xe6, 0xeb, 0x13, 0x3b, 0xf0, + 0x9f, 0xd6, 0x06, 0x5e, 0x1e, 0x05, 0x29, 0x3d, 0x1b, 0x68, 0xdc, 0xbb, 0x30, 0xd5, 0x43, 0x92, + 0xdc, 0x05, 0x18, 0x83, 0xec, 0x02, 0x5e, 0xe9, 0x0d, 0x9c, 0xe1, 0xf7, 0x71, 0xa2, 0xc0, 0x19, + 0x35, 0x52, 0xe7, 0x9b, 0x19, 0x98, 0x11, 0xbf, 0x4a, 0xdd, 0x86, 0x1b, 0x2e, 0x78, 0xed, 0x1d, + 0x77, 0xf7, 0x89, 0xfd, 0x16, 0x25, 0xed, 0x5b, 0xcc, 0xe9, 0xdf, 0x42, 0xe9, 0x60, 0xff, 0x4f, + 0x62, 0xfe, 0x5f, 0x00, 0xb3, 0xfd, 0x08, 0xc8, 0x25, 0x6d, 0x13, 0x87, 0x5e, 0x86, 0xc4, 0x06, + 0x99, 0x6f, 0xdf, 0xe2, 0xc8, 0xbc, 0xcc, 0x00, 0x91, 0x79, 0xcb, 0x50, 0xc4, 0xaa, 0x6a, 0x34, + 0x60, 0x83, 0x10, 0xc4, 0x97, 0x01, 0x2e, 0x3e, 0x3c, 0x9c, 0xbb, 0xe0, 0xb0, 0x32, 0x3b, 0x10, + 0x85, 0x76, 0xd7, 0x77, 0x15, 0x1e, 0x3d, 0x94, 0xe4, 0xd7, 0x0d, 0x98, 0x40, 0x60, 0xf5, 0x1e, + 0x6d, 0x87, 0xc8, 0x2c, 0x27, 0x4e, 0xb0, 0x22, 0x05, 0x5a, 0x0b, 0x7d, 0xb7, 0xbd, 0x2b, 0x34, + 0xe8, 0xb6, 0xd0, 0xa0, 0x6f, 0xee, 0xba, 0xe1, 0x5e, 0x77, 0xfb, 0x6a, 0xdd, 0x6b, 0x5d, 0xdb, + 0xf5, 0x9d, 0x7b, 0x2e, 0xdf, 0xbe, 0x38, 0xcd, 0x6b, 0xd1, 0x55, 0x4e, 0xa7, 0xe3, 0x26, 0xee, + 0x71, 0x0a, 0x56, 0xa8, 0x77, 0x79, 0x43, 0x29, 0x56, 0x9b, 0x68, 0x66, 0xa2, 0x45, 0xe4, 0x87, + 0xe1, 0x2c, 0x8f, 0xa4, 0x59, 0xf0, 0xda, 0xa1, 0xdb, 0xee, 0x7a, 0xdd, 0xa0, 0xec, 0xd4, 0xf7, + 0xbb, 0x9d, 0x40, 0x38, 0x68, 0xb1, 0xe7, 0xf5, 0xa8, 0xd0, 0xde, 0xe6, 0xa5, 0x0a, 0xcb, 0x7e, + 0x0c, 0xc8, 0x22, 0x4c, 0xf1, 0xa2, 0x52, 0x37, 0xf4, 0x6a, 0x75, 0xa7, 0xe9, 0xb6, 0x77, 0xd1, + 0x6f, 0x9b, 0xe7, 0xb1, 0x44, 0x4e, 0x37, 0xf4, 0xec, 0x80, 0xc3, 0x15, 0x7e, 0xbd, 0x44, 0x64, + 0x09, 0x26, 0x2d, 0xea, 0x34, 0xee, 0x3a, 0x0f, 0x16, 0x9c, 0x8e, 0x53, 0x77, 0xc3, 0x03, 0xdc, + 0x08, 0x66, 0xcb, 0x73, 0x0f, 0x0f, 0xe7, 0x9e, 0xf2, 0xa9, 0xd3, 0xb0, 0x5b, 0xce, 0x03, 0xbb, + 0x2e, 0x0a, 0xd5, 0x75, 0x26, 0x41, 0x17, 0xb1, 0x72, 0xdb, 0x11, 0xab, 0xd1, 0x24, 0x2b, 0xb7, + 0xdd, 0x9f, 0x55, 0x4c, 0x27, 0x59, 0xad, 0x3b, 0xfe, 0x2e, 0x0d, 0xb9, 0x63, 0x13, 0x2e, 0x1a, + 0x97, 0x0d, 0x85, 0x55, 0x88, 0x65, 0x36, 0x3a, 0x39, 0x93, 0xac, 0x14, 0x3a, 0x26, 0x79, 0x5b, + 0xbe, 0x1b, 0x52, 0xb5, 0x87, 0x63, 0xd8, 0x2c, 0x1c, 0x7f, 0x74, 0xed, 0xf6, 0xeb, 0x62, 0x0f, + 0x65, 0xcc, 0x4d, 0xe9, 0x64, 0xa1, 0x87, 0x5b, 0x7a, 0x2f, 0x7b, 0x28, 0x23, 0x6e, 0x6a, 0x3f, + 0xc7, 0xb1, 0x9f, 0x0a, 0xb7, 0x3e, 0x1d, 0xed, 0xa1, 0x24, 0x2b, 0x6c, 0xd0, 0x42, 0xda, 0x66, + 0x12, 0x2d, 0x1c, 0xbb, 0x13, 0xd8, 0xb4, 0xe7, 0xc5, 0x16, 0xbe, 0xe8, 0xcb, 0x62, 0x3b, 0xc5, + 0xcd, 0x9b, 0x24, 0x26, 0x3f, 0x0a, 0x93, 0x1b, 0x01, 0xbd, 0xb5, 0xb4, 0x56, 0x93, 0x51, 0x5d, + 0xb3, 0x93, 0xb8, 0xb1, 0xbf, 0x7e, 0x8c, 0xd2, 0xb9, 0xaa, 0xd2, 0xe0, 0xad, 0x4c, 0xfe, 0xdd, + 0xba, 0x01, 0xb5, 0x77, 0xdc, 0x4e, 0x60, 0xcb, 0xf0, 0x31, 0xf5, 0xbb, 0x25, 0xaa, 0x32, 0x17, + 0x61, 0xaa, 0x87, 0x0d, 0x99, 0x00, 0x60, 0x40, 0x7b, 0x63, 0xa5, 0x56, 0x5d, 0x2f, 0x9e, 0x62, + 0xfb, 0x56, 0xfc, 0x5d, 0x5d, 0x29, 0x95, 0x97, 0xab, 0x95, 0xa2, 0x41, 0xa6, 0x60, 0x1c, 0x21, + 0x95, 0xa5, 0x1a, 0x07, 0x65, 0xde, 0xcd, 0xe5, 0x87, 0x8a, 0xc3, 0x56, 0x91, 0x4f, 0xdd, 0x90, + 0x4d, 0x00, 0x5c, 0x53, 0xcc, 0x5f, 0xce, 0xc0, 0x39, 0xb9, 0xac, 0xd0, 0xf0, 0xbe, 0xe7, 0xef, + 0xbb, 0xed, 0xdd, 0x27, 0x7c, 0x75, 0xb8, 0xa5, 0xad, 0x0e, 0xcf, 0x27, 0x56, 0xea, 0x44, 0x2f, + 0x8f, 0x58, 0x22, 0x7e, 0x61, 0x04, 0x9e, 0x3e, 0x92, 0x8a, 0xbc, 0xc7, 0x56, 0x73, 0x97, 0xb6, + 0xc3, 0xa5, 0x46, 0x93, 0xb2, 0xdd, 0xab, 0xd7, 0x0d, 0xc5, 0x41, 0xc2, 0x73, 0x0f, 0x0f, 0xe7, + 0xa6, 0xf9, 0x95, 0x4a, 0xdb, 0x6d, 0x34, 0xa9, 0x1d, 0xf2, 0x62, 0x4d, 0xdc, 0x7a, 0xa9, 0x19, + 0xcb, 0xe8, 0x82, 0xf7, 0x52, 0x3b, 0xa4, 0xfe, 0x3d, 0x87, 0xdf, 0x2c, 0x13, 0x2c, 0xf7, 0x29, + 0xed, 0xd8, 0x0e, 0x2b, 0xb5, 0x5d, 0x51, 0xac, 0xb3, 0xec, 0xa1, 0x26, 0xb7, 0x14, 0x96, 0x0b, + 0x6c, 0x4f, 0x75, 0xd7, 0x79, 0x20, 0x36, 0x0a, 0x22, 0xc0, 0x38, 0x62, 0xc9, 0x83, 0xb4, 0x5b, + 0xce, 0x03, 0xab, 0x97, 0x84, 0x7c, 0x01, 0x4e, 0x8b, 0x05, 0x88, 0x29, 0x63, 0xdf, 0x6b, 0xca, + 0x1e, 0xe7, 0x90, 0xd7, 0x8b, 0x0f, 0x0f, 0xe7, 0xce, 0x8a, 0xe5, 0xcb, 0xae, 0x73, 0x8c, 0xd4, + 0x5e, 0xa7, 0x73, 0x21, 0xeb, 0x6c, 0x41, 0x4e, 0x0c, 0xc7, 0x5d, 0x1a, 0x04, 0xce, 0xae, 0xdc, + 0x54, 0xf0, 0xd3, 0x3c, 0x65, 0x30, 0xed, 0x16, 0x2f, 0xb7, 0xfa, 0x52, 0x92, 0x45, 0x98, 0xd8, + 0xa2, 0xdb, 0xea, 0xf7, 0x19, 0x8e, 0x54, 0x55, 0xf1, 0x3e, 0xdd, 0xee, 0xff, 0x71, 0x12, 0x74, + 0xc4, 0x85, 0x29, 0x0c, 0x5f, 0x60, 0x3b, 0x64, 0xda, 0xa6, 0x3e, 0xc6, 0x0a, 0x8e, 0xa0, 0x32, + 0x98, 0x8d, 0x2d, 0x64, 0xbd, 0xbc, 0xfc, 0xec, 0xc3, 0xc3, 0xb9, 0xa7, 0x79, 0x28, 0x44, 0x53, + 0xc0, 0xed, 0xc4, 0xfd, 0xea, 0x5e, 0xae, 0xe4, 0x4b, 0x30, 0x69, 0x79, 0xdd, 0xd0, 0x6d, 0xef, + 0xd6, 0x42, 0xdf, 0x09, 0xe9, 0x2e, 0x5f, 0x90, 0xe2, 0xa0, 0xc4, 0x44, 0x29, 0xf7, 0xe7, 0xfb, + 0x1c, 0x68, 0x07, 0x02, 0xaa, 0xad, 0x08, 0x3a, 0x01, 0xf9, 0x22, 0x4c, 0xf0, 0x68, 0xaa, 0xa8, + 0x82, 0x51, 0xed, 0x2a, 0x92, 0x5e, 0xb8, 0x79, 0x1d, 0x37, 0x83, 0xe7, 0x78, 0x54, 0x56, 0x5a, + 0x05, 0x09, 0x6e, 0xe4, 0x73, 0x62, 0xb0, 0xd6, 0xdc, 0xf6, 0x6e, 0x24, 0xc6, 0x80, 0x23, 0xff, + 0x6a, 0x3c, 0x24, 0x1d, 0xd6, 0x5c, 0x29, 0xc6, 0x7d, 0x36, 0xa9, 0xbd, 0x7c, 0xcc, 0x43, 0x03, + 0x8a, 0xc9, 0x06, 0x92, 0xcf, 0xc2, 0x68, 0x69, 0x97, 0xb6, 0xd9, 0x87, 0xdf, 0x13, 0xb7, 0x9f, + 0x65, 0x2e, 0x86, 0x08, 0xae, 0x13, 0x89, 0x9b, 0x09, 0xac, 0x90, 0x09, 0x92, 0xe2, 0xb9, 0x5b, + 0x3c, 0x65, 0xc5, 0xcc, 0x48, 0x03, 0x0a, 0xbc, 0x0d, 0x94, 0x32, 0x1b, 0x48, 0xb8, 0xaf, 0x9e, + 0x55, 0xbf, 0xb9, 0x28, 0x4a, 0xf0, 0xc7, 0xa8, 0x30, 0xd1, 0x53, 0x8e, 0xa0, 0x55, 0xa1, 0x71, + 0x2d, 0x03, 0xe4, 0x25, 0xa1, 0x79, 0x0e, 0xce, 0xf6, 0x69, 0xb3, 0x79, 0x0f, 0xce, 0xf7, 0xaf, + 0x91, 0x7c, 0x16, 0x66, 0x90, 0x70, 0xc1, 0x6b, 0xb7, 0x69, 0x3d, 0xc4, 0x49, 0x26, 0x3d, 0x2e, + 0xd9, 0xf2, 0xf3, 0x0f, 0x0f, 0xe7, 0x2e, 0xf2, 0xfe, 0xd6, 0x23, 0x04, 0x3b, 0xe9, 0x7c, 0x49, + 0xe5, 0x60, 0xfe, 0x62, 0x06, 0x66, 0xc5, 0xbc, 0xb5, 0x68, 0xdd, 0xf3, 0x1b, 0x4f, 0xfe, 0x3a, + 0x51, 0xd5, 0xd6, 0x89, 0xe7, 0xa2, 0x18, 0xc9, 0xb4, 0x4e, 0x1e, 0xb1, 0x4c, 0xfc, 0xb6, 0x01, + 0x17, 0x8e, 0x22, 0x62, 0xa3, 0x13, 0xc5, 0x15, 0x8f, 0xf6, 0xc4, 0x0f, 0x77, 0x60, 0x1a, 0x3f, + 0x28, 0x1e, 0xd0, 0x04, 0x8b, 0x5e, 0x10, 0xa2, 0x97, 0x3c, 0xa3, 0x45, 0x0a, 0x95, 0x3d, 0x8f, + 0x3b, 0x42, 0xd0, 0x0f, 0x62, 0x7c, 0xf7, 0x70, 0x0e, 0x18, 0x88, 0x47, 0x02, 0x33, 0x63, 0x97, + 0x4b, 0x19, 0x9e, 0xff, 0x04, 0x36, 0xc6, 0x84, 0xed, 0xd3, 0x83, 0xc0, 0x4a, 0x63, 0x8d, 0x9e, + 0xd0, 0x52, 0x37, 0xdc, 0x5b, 0xf3, 0xe9, 0x0e, 0xf5, 0x69, 0xbb, 0x4e, 0x3f, 0x66, 0x9e, 0x50, + 0xbd, 0x73, 0x03, 0xed, 0xcb, 0x7f, 0x3f, 0x0f, 0x33, 0x69, 0x64, 0x6c, 0x5c, 0x94, 0xad, 0x60, + 0x32, 0x7b, 0xcb, 0x4f, 0x19, 0x50, 0xa8, 0xd1, 0xba, 0xd7, 0x6e, 0xdc, 0x72, 0xea, 0xa1, 0x27, + 0x63, 0xae, 0x6c, 0xbe, 0x14, 0x32, 0xb8, 0xbd, 0x83, 0x05, 0x9a, 0x72, 0xfb, 0xcc, 0x60, 0x3b, + 0xb0, 0xba, 0x87, 0x31, 0xfc, 0x21, 0xde, 0x55, 0x8a, 0xaa, 0xc0, 0xd3, 0x43, 0xad, 0x52, 0x52, + 0x86, 0x71, 0x31, 0x5d, 0x3d, 0x35, 0xac, 0x1c, 0x03, 0xc1, 0xeb, 0xb2, 0x20, 0xe9, 0x89, 0xd3, + 0x49, 0xc8, 0x0d, 0xc8, 0x6e, 0xcc, 0xdf, 0x12, 0xdf, 0x40, 0x06, 0xcb, 0x6e, 0xcc, 0xdf, 0x42, + 0x27, 0x0f, 0x33, 0x9c, 0xc7, 0xbb, 0xf3, 0x3b, 0xea, 0x59, 0xc3, 0xc6, 0xfc, 0x2d, 0x72, 0x03, + 0xa6, 0x2c, 0xfa, 0xe5, 0xae, 0xeb, 0x53, 0x31, 0x01, 0xee, 0xde, 0x2a, 0xe1, 0xb7, 0xc8, 0xcb, + 0x34, 0x30, 0xbd, 0xe5, 0xe4, 0xc7, 0xe1, 0x74, 0xc5, 0x0d, 0x44, 0xbb, 0xb8, 0x23, 0xbf, 0x81, + 0x67, 0xfa, 0xc3, 0x7d, 0x44, 0xfe, 0x53, 0xa9, 0x22, 0xff, 0x6c, 0x23, 0x62, 0x62, 0xf3, 0x53, + 0x82, 0x46, 0x32, 0xe6, 0x3e, 0xbd, 0x1e, 0xf2, 0x01, 0x4c, 0xa0, 0xe7, 0x14, 0xcf, 0x36, 0xf0, + 0x1e, 0xd0, 0x48, 0x9f, 0x9a, 0x3f, 0x91, 0x5a, 0xf3, 0x79, 0x74, 0xc4, 0xda, 0x78, 0x42, 0x82, + 0x77, 0x86, 0xb4, 0x0d, 0xb0, 0xc6, 0x99, 0xbc, 0x0b, 0x93, 0xc2, 0x12, 0x59, 0xdd, 0x59, 0xdf, + 0xa3, 0x15, 0xe7, 0x40, 0x44, 0x05, 0xe1, 0xe6, 0x46, 0x98, 0x2f, 0xb6, 0xb7, 0x63, 0x87, 0x7b, + 0xd4, 0x6e, 0x38, 0xda, 0x9a, 0x9d, 0x20, 0x24, 0x5f, 0x81, 0xb1, 0x65, 0x0f, 0x0f, 0x71, 0x51, + 0x9d, 0x8c, 0x22, 0x9f, 0xf7, 0x31, 0x2b, 0x09, 0x07, 0x27, 0x2c, 0x8b, 0x1f, 0x1c, 0xce, 0xbd, + 0x71, 0x52, 0x49, 0x53, 0x2a, 0xb0, 0xd4, 0xda, 0xc8, 0x02, 0xe4, 0xb7, 0xe8, 0x36, 0xeb, 0x6d, + 0xf2, 0x46, 0xbd, 0x04, 0x73, 0x9d, 0x70, 0x5f, 0xfc, 0x52, 0x4f, 0x48, 0x25, 0x06, 0xf1, 0x61, + 0x0a, 0xc7, 0x67, 0xcd, 0x09, 0x82, 0xfb, 0x9e, 0xdf, 0x68, 0xd2, 0x40, 0x1e, 0x35, 0xf6, 0x0e, + 0xfe, 0x7c, 0xea, 0xe0, 0x5f, 0xe0, 0x83, 0xdf, 0x51, 0x38, 0xa8, 0xb6, 0x54, 0x0f, 0x7b, 0xf2, + 0x25, 0x98, 0x10, 0x32, 0x78, 0xf7, 0x56, 0x09, 0xa7, 0x72, 0x41, 0x8b, 0x8c, 0xd0, 0x0b, 0xb9, + 0xc1, 0xe6, 0x73, 0x98, 0x74, 0xc6, 0xd8, 0xad, 0x1d, 0x35, 0xd3, 0x46, 0x82, 0x9f, 0xf9, 0xfb, + 0x06, 0xce, 0x1d, 0x72, 0x05, 0x63, 0x54, 0xa3, 0x08, 0x1e, 0x74, 0x06, 0x39, 0x9d, 0xc4, 0x2d, + 0x30, 0x8e, 0x42, 0x5e, 0x81, 0xe1, 0x5b, 0x4e, 0x9d, 0x86, 0xf2, 0x44, 0x03, 0x91, 0x77, 0x10, + 0xa2, 0x7a, 0x8e, 0x38, 0x0e, 0x5b, 0xd6, 0x2b, 0xf4, 0x9e, 0x5b, 0xa7, 0xa5, 0x30, 0xa4, 0x01, + 0xff, 0x86, 0x0b, 0x25, 0x7e, 0xf4, 0x3f, 0xca, 0x97, 0xf5, 0x06, 0x96, 0xdb, 0x4e, 0x8c, 0x60, + 0xd7, 0x1d, 0x95, 0x57, 0x2a, 0x07, 0xf3, 0xbf, 0x1b, 0xf1, 0x77, 0x25, 0x2f, 0x42, 0xce, 0x5a, + 0x8b, 0xda, 0xcf, 0x4f, 0xf5, 0x13, 0xcd, 0x47, 0x04, 0xf2, 0x39, 0x38, 0xad, 0xf0, 0xc1, 0x31, + 0xa7, 0x0d, 0xd6, 0x20, 0xde, 0x99, 0x17, 0xf0, 0x18, 0x57, 0x69, 0x89, 0xc3, 0x31, 0x12, 0x2d, + 0x4a, 0xe7, 0x81, 0x36, 0x4c, 0x5c, 0x50, 0xa1, 0x6d, 0x97, 0xf3, 0x56, 0x3a, 0xab, 0xf2, 0x6e, + 0x20, 0x42, 0xb2, 0xb3, 0x69, 0x1c, 0xde, 0xcd, 0xe5, 0x73, 0xc5, 0x21, 0xf3, 0xcf, 0x0d, 0x25, + 0x69, 0xd5, 0x13, 0xba, 0xee, 0xdd, 0xd4, 0xd6, 0xbd, 0x19, 0x41, 0x1a, 0xf5, 0x8a, 0x95, 0xa5, + 0xda, 0x2a, 0x93, 0x30, 0xae, 0x21, 0x61, 0x08, 0xff, 0x46, 0x40, 0x7d, 0xee, 0xd2, 0xff, 0x78, + 0x85, 0xf0, 0x47, 0xfd, 0x1a, 0x28, 0xc8, 0xfa, 0x4f, 0x0c, 0x74, 0xf5, 0xa8, 0x14, 0x6c, 0x34, + 0x18, 0x48, 0x1d, 0x8d, 0x6e, 0x40, 0x7d, 0x0b, 0xa1, 0x3c, 0x0e, 0x77, 0x59, 0x8f, 0xc3, 0x6d, + 0x5a, 0x0c, 0x46, 0x3e, 0x03, 0x43, 0x1b, 0xb8, 0x71, 0xd5, 0xa3, 0xb0, 0x22, 0xfe, 0x58, 0xc8, + 0x67, 0x58, 0x97, 0xfd, 0xa9, 0x2a, 0x08, 0x2c, 0x23, 0x35, 0x18, 0x59, 0xf0, 0x29, 0xa6, 0xa7, + 0xca, 0x0d, 0x7e, 0x5c, 0x5e, 0xe7, 0x24, 0xc9, 0xe3, 0x72, 0xc1, 0xc9, 0xfc, 0xf9, 0x0c, 0x90, + 0xb8, 0x8f, 0x78, 0xf7, 0x38, 0x78, 0x62, 0x3f, 0xfa, 0x3b, 0xda, 0x47, 0x7f, 0xba, 0xe7, 0xa3, + 0xf3, 0xee, 0x0d, 0xf4, 0xed, 0xff, 0xc0, 0x80, 0x33, 0xe9, 0x84, 0xe4, 0x39, 0x18, 0x5e, 0x5d, + 0x5f, 0x93, 0x81, 0x7c, 0xa2, 0x2b, 0x5e, 0x07, 0xed, 0x6b, 0x4b, 0x14, 0x91, 0x57, 0x61, 0xf8, + 0x3d, 0x6b, 0x81, 0x2d, 0xca, 0xca, 0x1d, 0xc0, 0x2f, 0xfb, 0x76, 0x5d, 0xdf, 0xe9, 0x0b, 0x24, + 0xf5, 0xdb, 0x66, 0x1f, 0xdb, 0xb7, 0xfd, 0x66, 0x06, 0x26, 0x4b, 0xf5, 0x3a, 0x0d, 0x02, 0xb6, + 0x3c, 0xd1, 0x20, 0x7c, 0x62, 0x3f, 0x6c, 0x7a, 0x88, 0x9e, 0xd6, 0xb7, 0x81, 0xbe, 0xea, 0x1f, + 0x1a, 0x70, 0x5a, 0x52, 0xdd, 0x73, 0xe9, 0xfd, 0xf5, 0x3d, 0x9f, 0x06, 0x7b, 0x5e, 0xb3, 0x31, + 0xf0, 0x45, 0x58, 0xb6, 0x4a, 0xbb, 0xcd, 0x90, 0xfa, 0xea, 0xf9, 0xce, 0x0e, 0x42, 0xb4, 0x55, + 0x1a, 0x21, 0xe4, 0x1a, 0x8c, 0x94, 0x3a, 0x1d, 0xdf, 0xbb, 0xc7, 0xa7, 0xfd, 0xb8, 0x88, 0x1e, + 0xe0, 0x20, 0x2d, 0xda, 0x80, 0x83, 0x58, 0x33, 0x2a, 0xb4, 0xcd, 0x2f, 0x3e, 0x8c, 0xf3, 0x66, + 0x34, 0x68, 0x5b, 0xb5, 0x01, 0xb1, 0xdc, 0xfc, 0x46, 0x0e, 0x0a, 0x6a, 0x47, 0x88, 0x09, 0xc3, + 0x3c, 0x98, 0x4c, 0x0d, 0xea, 0x71, 0x10, 0x62, 0x89, 0x92, 0x38, 0x46, 0x2f, 0x73, 0x6c, 0x8c, + 0xde, 0x16, 0x8c, 0xaf, 0xf9, 0x5e, 0xc7, 0x0b, 0x68, 0x83, 0x67, 0x18, 0xe4, 0x5a, 0x6b, 0x5a, + 0xb1, 0x90, 0xd8, 0x98, 0xa3, 0x13, 0x1b, 0x37, 0x15, 0x1d, 0x81, 0x6d, 0x27, 0xf3, 0x0f, 0xea, + 0x7c, 0xf8, 0xf9, 0x98, 0x13, 0x88, 0xab, 0x48, 0xd1, 0xf9, 0x18, 0x83, 0xe8, 0xe7, 0x63, 0x0c, + 0xa2, 0x4e, 0x8b, 0xa1, 0xc7, 0x35, 0x2d, 0xc8, 0xcf, 0x1b, 0x30, 0x56, 0x6a, 0xb7, 0x45, 0x8c, + 0xde, 0x31, 0x41, 0x06, 0x9f, 0x17, 0x47, 0x64, 0x6f, 0x7c, 0xa8, 0x23, 0xb2, 0x75, 0xdf, 0x71, + 0xc3, 0x00, 0x43, 0x2f, 0xe2, 0x0a, 0xd5, 0x68, 0x7f, 0xa5, 0x1d, 0xe4, 0x0d, 0x28, 0x46, 0xf2, + 0xb8, 0xd4, 0x6e, 0xd0, 0x07, 0x94, 0x87, 0x34, 0x8e, 0xf3, 0x7b, 0xd2, 0xda, 0xd9, 0x5f, 0x12, + 0xd1, 0xfc, 0xa6, 0x01, 0x67, 0x54, 0x81, 0xa8, 0x75, 0xb7, 0x5b, 0x2e, 0x9a, 0xaa, 0xe4, 0x2a, + 0x8c, 0x8a, 0xef, 0x15, 0x19, 0x72, 0xbd, 0x69, 0x29, 0x63, 0x14, 0x52, 0x65, 0x9f, 0x88, 0xf1, + 0x10, 0x1e, 0x87, 0xe9, 0xc4, 0x74, 0x63, 0x45, 0xe5, 0x59, 0x31, 0xd8, 0x45, 0x1f, 0x7f, 0xeb, + 0xdf, 0x8e, 0x41, 0xcc, 0xb7, 0x61, 0x4a, 0x6f, 0x65, 0x8d, 0xe2, 0x45, 0x5a, 0xd9, 0x35, 0x23, + 0xbd, 0x6b, 0xb2, 0xdc, 0xdc, 0x02, 0xd2, 0x43, 0x1f, 0xe0, 0x39, 0x2f, 0x0d, 0x65, 0x1c, 0x82, + 0xf4, 0xb2, 0xf6, 0x20, 0x46, 0x09, 0x5a, 0xc7, 0xd4, 0xe1, 0x46, 0x52, 0xf3, 0x5f, 0x8f, 0xc1, + 0x74, 0x8a, 0xea, 0x38, 0x66, 0x69, 0x9f, 0xd3, 0x27, 0xcf, 0x68, 0x14, 0xbf, 0x23, 0xa7, 0xcc, + 0xdb, 0x32, 0x19, 0xe7, 0x11, 0x53, 0xe5, 0xa8, 0x0c, 0x9d, 0x1f, 0xc5, 0xf2, 0xae, 0x86, 0xd8, + 0x0d, 0x3d, 0xb6, 0x10, 0xbb, 0x32, 0x8c, 0x8b, 0x5e, 0x89, 0xa9, 0x3c, 0x1c, 0x3b, 0x17, 0x7c, + 0x5e, 0x60, 0xf7, 0x4c, 0x69, 0x9d, 0x84, 0xf3, 0x08, 0xbc, 0xe6, 0x3d, 0x2a, 0x78, 0x8c, 0xa8, + 0x3c, 0xb0, 0x20, 0x95, 0x87, 0x42, 0x42, 0xfe, 0xae, 0x01, 0x44, 0x40, 0xd4, 0xf9, 0x9c, 0x3f, + 0x6a, 0x3e, 0x37, 0x1e, 0xcf, 0x7c, 0x7e, 0x5a, 0xb6, 0x31, 0x7d, 0x5e, 0xa7, 0x34, 0x8b, 0xfc, + 0x6d, 0x03, 0xa6, 0x78, 0x9c, 0x97, 0xda, 0xd8, 0xd1, 0xa3, 0x1a, 0x5b, 0x7f, 0x3c, 0x8d, 0xbd, + 0x10, 0x60, 0xb5, 0x7d, 0xda, 0xda, 0xdb, 0x28, 0xf2, 0xc3, 0x00, 0xd1, 0x8c, 0x92, 0xf1, 0xc4, + 0x17, 0x52, 0xb4, 0x40, 0x84, 0x14, 0x5f, 0x15, 0x0f, 0x23, 0x3a, 0x2d, 0x7d, 0x46, 0x04, 0x25, + 0x3f, 0x0e, 0x33, 0x6c, 0xbe, 0x44, 0x10, 0x11, 0x95, 0x3a, 0x3b, 0x86, 0xb5, 0x7c, 0xb2, 0xff, + 0xd2, 0x7e, 0x35, 0x8d, 0x8c, 0x5f, 0x0d, 0x8b, 0xd3, 0x0f, 0x85, 0x2d, 0x75, 0xcb, 0x97, 0x46, + 0x81, 0xe1, 0xe7, 0xd8, 0x7a, 0x7e, 0x63, 0xba, 0x8f, 0x7e, 0x3b, 0x27, 0xe7, 0x02, 0xd7, 0x6f, + 0x81, 0x7e, 0xb7, 0x0b, 0x41, 0xe4, 0x3d, 0x20, 0x51, 0x50, 0x19, 0x87, 0x51, 0x5f, 0x66, 0xe3, + 0x43, 0xa7, 0x41, 0x1c, 0x8e, 0xe6, 0xcb, 0x62, 0x55, 0x48, 0x7a, 0x89, 0x09, 0x85, 0x19, 0xd1, + 0x69, 0x06, 0x95, 0x39, 0x34, 0x82, 0xd9, 0x09, 0x2d, 0xe6, 0x37, 0x2e, 0x89, 0xf3, 0x14, 0x29, + 0x89, 0x38, 0xb4, 0x6d, 0x6f, 0x1a, 0x3b, 0x72, 0x13, 0x46, 0x97, 0xbd, 0x5d, 0xb7, 0xbd, 0x28, + 0x4f, 0xaf, 0xc5, 0x49, 0x5a, 0x93, 0x01, 0xed, 0x3d, 0xfd, 0x0c, 0x3a, 0x46, 0x65, 0x56, 0x6d, + 0xc5, 0x3f, 0xb0, 0xba, 0xed, 0xd9, 0x22, 0xba, 0xf4, 0xd0, 0x9c, 0x69, 0xf8, 0x07, 0xb6, 0xdf, + 0xd5, 0x96, 0x6f, 0x8e, 0x74, 0x7e, 0x1b, 0xce, 0xf5, 0xfd, 0x68, 0x29, 0xb7, 0xd0, 0xae, 0xe9, + 0xb7, 0xd0, 0xce, 0xf5, 0x53, 0xee, 0x81, 0x7a, 0x13, 0xed, 0x57, 0x8d, 0x84, 0x36, 0x17, 0xa6, + 0x17, 0xcf, 0xc2, 0xdc, 0x6f, 0xb9, 0xcb, 0x60, 0xd6, 0x1f, 0xae, 0xef, 0x33, 0xb1, 0xc9, 0xc7, + 0xf4, 0xbd, 0xba, 0x5e, 0xa0, 0xe6, 0x7f, 0x44, 0xc5, 0x6e, 0xfe, 0x03, 0x03, 0x08, 0x6f, 0xe1, + 0x82, 0xd3, 0x71, 0xb6, 0xdd, 0xa6, 0x1b, 0xba, 0x34, 0x20, 0x77, 0xa0, 0x28, 0x58, 0x38, 0xdb, + 0x4d, 0xaa, 0xc6, 0x86, 0x8a, 0x68, 0x8e, 0xa8, 0xcc, 0x4e, 0x1a, 0x69, 0x3d, 0x84, 0x7d, 0x44, + 0x31, 0xf3, 0x08, 0xa2, 0x68, 0x7e, 0xdf, 0x80, 0x73, 0xbd, 0xcd, 0x16, 0x35, 0x47, 0x83, 0x67, + 0x1c, 0x33, 0x78, 0x69, 0xbd, 0xcc, 0xa0, 0xec, 0x3c, 0xb6, 0x5e, 0xf2, 0xec, 0x3d, 0x1f, 0xb2, + 0x97, 0xf7, 0xd5, 0xc4, 0x36, 0xe4, 0xd5, 0xb4, 0xb0, 0x3b, 0x7e, 0x9f, 0x8f, 0x83, 0xf5, 0x88, + 0x3b, 0xb9, 0x99, 0xca, 0xa4, 0x6e, 0xa6, 0xe4, 0xd5, 0xc4, 0x6c, 0xda, 0xd5, 0x44, 0xf3, 0xeb, + 0x19, 0x28, 0xac, 0x35, 0xbb, 0xbb, 0x6e, 0xbb, 0xe2, 0x84, 0xce, 0x13, 0xbb, 0x33, 0x7b, 0x5d, + 0xdb, 0x99, 0x45, 0x71, 0xa1, 0x51, 0xc7, 0x06, 0xda, 0x96, 0x7d, 0xdb, 0x80, 0xc9, 0x98, 0x84, + 0xab, 0x87, 0x45, 0xc8, 0xb1, 0x1f, 0xc2, 0xd0, 0xbb, 0xd8, 0xc3, 0x18, 0xb1, 0xae, 0x46, 0x7f, + 0x89, 0xbd, 0x92, 0x9e, 0x00, 0x19, 0x39, 0x9c, 0xff, 0x14, 0x4f, 0x45, 0x7a, 0xf2, 0x5c, 0xeb, + 0xbf, 0x67, 0x40, 0x31, 0xd9, 0x13, 0x72, 0x07, 0x46, 0x18, 0x27, 0x37, 0x4a, 0x6b, 0xfa, 0x7c, + 0x9f, 0x3e, 0x5f, 0x15, 0x68, 0xbc, 0x79, 0x38, 0xf8, 0x94, 0x43, 0x2c, 0xc9, 0xe1, 0xbc, 0x05, + 0x05, 0x15, 0x2b, 0xa5, 0x75, 0xaf, 0xe8, 0x3a, 0xf1, 0x4c, 0xfa, 0x38, 0xa8, 0xad, 0xfe, 0x15, + 0xad, 0xd5, 0x42, 0x1b, 0x0e, 0x9a, 0xd4, 0x1a, 0x2f, 0xf3, 0xf2, 0xe9, 0xa0, 0xca, 0x99, 0x5c, + 0x5c, 0xf4, 0xcb, 0xbc, 0x1c, 0xc6, 0xb6, 0x74, 0xbc, 0x3e, 0x21, 0x67, 0xb8, 0xa5, 0xeb, 0x20, + 0x44, 0x5d, 0x13, 0x38, 0x8e, 0xf9, 0xff, 0x65, 0xe1, 0x4c, 0xdc, 0x3c, 0x9e, 0xe2, 0x7b, 0xcd, + 0xf1, 0x9d, 0x56, 0x70, 0xcc, 0x0c, 0xb8, 0xdc, 0xd3, 0x34, 0xcc, 0x8a, 0x21, 0x9b, 0xa6, 0x34, + 0xc8, 0x4c, 0x34, 0x08, 0xf7, 0xc2, 0xbc, 0x41, 0xb2, 0x19, 0xe4, 0x0e, 0x64, 0x6b, 0x34, 0x14, + 0x57, 0xda, 0x2f, 0xf5, 0x8c, 0xaa, 0xda, 0xae, 0xab, 0x35, 0x1a, 0xf2, 0x8f, 0xc8, 0x2f, 0xf4, + 0x50, 0xed, 0x82, 0x0d, 0xdb, 0xd5, 0x6c, 0xc1, 0x70, 0xf5, 0x41, 0x87, 0xd6, 0x43, 0x71, 0x93, + 0xfd, 0xa5, 0xa3, 0xf9, 0x71, 0x5c, 0xe5, 0xbe, 0x3c, 0x45, 0x80, 0x3a, 0x58, 0x1c, 0xe5, 0xfc, + 0x4d, 0xc8, 0xcb, 0xca, 0x4f, 0x74, 0xef, 0xfb, 0x75, 0x18, 0x53, 0x2a, 0x39, 0x91, 0xd0, 0xff, + 0x95, 0x01, 0xc3, 0x4c, 0xdb, 0x6e, 0xbe, 0xf6, 0x84, 0x6a, 0xa4, 0x1b, 0x9a, 0x46, 0x9a, 0x52, + 0xee, 0x16, 0xe2, 0xbc, 0x7c, 0xed, 0x18, 0x5d, 0x74, 0x68, 0x00, 0xc4, 0xc8, 0xe4, 0x36, 0x8c, + 0x88, 0xe4, 0x5a, 0x22, 0x82, 0x44, 0xbd, 0xac, 0x28, 0x53, 0x85, 0x46, 0xc6, 0xa2, 0xd7, 0x49, + 0x5a, 0xd7, 0x92, 0x9a, 0x54, 0xe2, 0x0b, 0x1d, 0xea, 0x15, 0x7b, 0xc6, 0x66, 0xc1, 0x6b, 0xf3, + 0xcb, 0x6b, 0x4a, 0xd2, 0xd1, 0x3e, 0x37, 0x3b, 0x4a, 0xc2, 0x3f, 0x94, 0x3d, 0x8a, 0xc9, 0x19, + 0xc1, 0x24, 0xdd, 0x75, 0xf4, 0x3b, 0x93, 0xfc, 0x3a, 0x98, 0x6c, 0xd8, 0x5b, 0x50, 0xb8, 0xe5, + 0xf9, 0xf7, 0x1d, 0xbf, 0x81, 0x51, 0x1e, 0xd8, 0x4d, 0x9e, 0x0c, 0x6f, 0x7c, 0x87, 0xc3, 0x6d, + 0x0c, 0x10, 0xf9, 0xc1, 0xe1, 0x5c, 0xae, 0xec, 0x79, 0x4d, 0x4b, 0x43, 0x27, 0xab, 0x30, 0x7e, + 0xd7, 0x79, 0x20, 0x0e, 0x73, 0xd7, 0xd7, 0x97, 0x45, 0x64, 0xda, 0x4b, 0x0f, 0x0f, 0xe7, 0xce, + 0xb5, 0x9c, 0x07, 0xd1, 0x81, 0x59, 0xff, 0x3b, 0x27, 0x3a, 0x3d, 0x71, 0x61, 0x62, 0xcd, 0xf3, + 0x43, 0x51, 0x09, 0xdb, 0x1a, 0x64, 0xfb, 0x1c, 0x07, 0x5e, 0x4b, 0x3d, 0x0e, 0x3c, 0xc7, 0xf6, + 0x43, 0xf6, 0x4e, 0x44, 0xae, 0xdd, 0x61, 0xd6, 0x18, 0x93, 0xb7, 0x60, 0x6a, 0x81, 0xfa, 0xa1, + 0xbb, 0xe3, 0xd6, 0x9d, 0x90, 0xde, 0xf2, 0xfc, 0x96, 0x13, 0x0a, 0xbf, 0x14, 0xfa, 0x25, 0xea, + 0x94, 0x73, 0x6a, 0x39, 0xa1, 0xd5, 0x8b, 0x49, 0x3e, 0x97, 0x16, 0xeb, 0x37, 0x14, 0x47, 0x34, + 0xa5, 0xc4, 0xfa, 0xf5, 0x8b, 0x68, 0xea, 0x8d, 0xfa, 0xdb, 0x3d, 0xea, 0x4c, 0x3c, 0x5f, 0xbe, + 0x2e, 0xce, 0xe0, 0x8f, 0x3f, 0xf3, 0x8e, 0xbe, 0x5b, 0x9f, 0xb3, 0xef, 0x79, 0xc8, 0x96, 0xd7, + 0x6e, 0xa1, 0xa7, 0x49, 0x9c, 0x41, 0xd3, 0xf6, 0x9e, 0xd3, 0xae, 0xa3, 0x11, 0x25, 0x82, 0x57, + 0x54, 0x85, 0x57, 0x5e, 0xbb, 0x45, 0x1c, 0x98, 0x5e, 0xa3, 0x7e, 0xcb, 0x0d, 0x3f, 0x7b, 0xfd, + 0xba, 0xf2, 0xa1, 0xf2, 0xd8, 0xb4, 0x6b, 0xa2, 0x69, 0x73, 0x1d, 0x44, 0xb1, 0x1f, 0x5c, 0xbf, + 0x9e, 0xfa, 0x39, 0xa2, 0x86, 0xa5, 0xf1, 0x22, 0x55, 0x98, 0xb8, 0xeb, 0x3c, 0x88, 0x63, 0x8e, + 0x02, 0x11, 0x35, 0xfd, 0xb4, 0x14, 0xac, 0x38, 0x5e, 0x49, 0x9d, 0x6f, 0x09, 0x22, 0xf2, 0x26, + 0x8c, 0xc5, 0xe2, 0x15, 0x88, 0x78, 0x33, 0x0c, 0x06, 0x57, 0x84, 0x53, 0x73, 0xc9, 0x29, 0xe8, + 0x64, 0x23, 0xf2, 0x74, 0x70, 0x4b, 0x58, 0x24, 0xe6, 0xba, 0xa6, 0x7a, 0x3a, 0x1c, 0x2c, 0xd1, + 0xba, 0x35, 0x19, 0xed, 0x0d, 0x78, 0x10, 0x96, 0xa5, 0x73, 0x51, 0x1c, 0x28, 0x6b, 0xbe, 0xd7, + 0xea, 0x84, 0x78, 0xfe, 0x9c, 0x70, 0xa0, 0x74, 0xb0, 0x24, 0xc5, 0x81, 0xc2, 0x49, 0xd2, 0x03, + 0x2d, 0xc6, 0x8f, 0x09, 0xb4, 0xa0, 0x90, 0x5b, 0xf6, 0xea, 0xfb, 0x18, 0x00, 0x3d, 0x5a, 0x7e, + 0x8f, 0xe9, 0x88, 0xa6, 0x57, 0xdf, 0x7f, 0x7c, 0x01, 0x02, 0xc8, 0x9e, 0xac, 0xb0, 0xfe, 0x31, + 0xd1, 0x11, 0x55, 0xe3, 0x16, 0x33, 0x3e, 0x94, 0xd4, 0xca, 0xb8, 0x31, 0xc2, 0x25, 0x4d, 0x7e, + 0x0f, 0x4b, 0x27, 0x27, 0x14, 0x8a, 0x15, 0x1a, 0xec, 0x87, 0x5e, 0x67, 0xa1, 0xe9, 0x76, 0xb6, + 0x3d, 0xc7, 0x6f, 0xe0, 0x06, 0x34, 0x4d, 0x29, 0xbc, 0x98, 0xaa, 0x14, 0xa6, 0x1a, 0x9c, 0xde, + 0xae, 0x4b, 0x06, 0x56, 0x0f, 0x4b, 0xf2, 0x39, 0x98, 0x60, 0x33, 0xa2, 0xfa, 0x20, 0xa4, 0x6d, + 0x2e, 0x2e, 0x53, 0xb8, 0x9c, 0xcf, 0x28, 0x37, 0xb6, 0xa3, 0x42, 0x2e, 0x88, 0xa8, 0x21, 0x68, + 0x44, 0xa0, 0x0a, 0xa2, 0xce, 0x8a, 0x34, 0x60, 0xf6, 0xae, 0xf3, 0x40, 0xc9, 0xfb, 0xa6, 0x48, + 0x36, 0x41, 0xa9, 0xc4, 0xac, 0xac, 0x4c, 0x2a, 0xf7, 0x23, 0xa4, 0x3e, 0x42, 0xde, 0x97, 0x13, + 0xf9, 0x0a, 0x9c, 0x15, 0xdd, 0xaa, 0x60, 0xa6, 0x15, 0xcf, 0x3f, 0xa8, 0xed, 0x39, 0x18, 0xa3, + 0x38, 0x7d, 0x32, 0x2d, 0x2a, 0x07, 0xac, 0x21, 0xf9, 0xd8, 0x01, 0x67, 0x64, 0xf5, 0xab, 0x81, + 0x7c, 0x09, 0x26, 0xb8, 0xdf, 0x71, 0xd1, 0x0b, 0x42, 0xdc, 0x1d, 0xce, 0xf4, 0xa9, 0xf3, 0x52, + 0x6a, 0x9d, 0x45, 0xee, 0xcc, 0xe4, 0xc1, 0x6a, 0xe8, 0x7a, 0x4d, 0xf0, 0x23, 0x6f, 0xc0, 0xd8, + 0x9a, 0xdb, 0xae, 0xf1, 0xed, 0xda, 0xda, 0xec, 0xe9, 0x78, 0xa9, 0xea, 0xb8, 0x6d, 0x5b, 0x3a, + 0x40, 0x3a, 0x91, 0x66, 0x51, 0xb1, 0xc9, 0x16, 0x8c, 0xd5, 0x6a, 0x8b, 0xb7, 0x5c, 0xb6, 0x56, + 0x76, 0x0e, 0x66, 0xcf, 0xf4, 0x69, 0xdb, 0x73, 0xa9, 0x6d, 0x1b, 0x0f, 0x82, 0x3d, 0x4c, 0x3b, + 0x6a, 0xd7, 0xbd, 0xce, 0x81, 0xa5, 0x72, 0x4a, 0x89, 0x27, 0x39, 0xfb, 0x98, 0xe3, 0x49, 0xfe, + 0x69, 0x26, 0x31, 0xa3, 0xc8, 0x12, 0x8c, 0x88, 0xcf, 0x20, 0xec, 0x92, 0xde, 0x8e, 0x3c, 0x9d, + 0xda, 0x91, 0x11, 0xf1, 0x61, 0x2d, 0x49, 0x4f, 0xee, 0x33, 0x56, 0x3b, 0x4e, 0xb7, 0x29, 0xf3, + 0x95, 0x7e, 0x81, 0x4f, 0x18, 0x04, 0x69, 0xaa, 0xa1, 0x72, 0xf2, 0x28, 0x35, 0x3d, 0x08, 0x12, + 0x75, 0x84, 0xac, 0x8d, 0xec, 0xf3, 0xfb, 0xf3, 0xd9, 0x28, 0x6a, 0x49, 0xbf, 0x2c, 0xff, 0xd8, + 0x2a, 0x64, 0xb5, 0x98, 0xff, 0xd8, 0x80, 0x71, 0x6d, 0x4a, 0x92, 0x9b, 0x4a, 0x1c, 0x5f, 0x1c, + 0xb0, 0xad, 0xe1, 0xa4, 0xbe, 0xcf, 0x76, 0x53, 0x04, 0x6f, 0x66, 0xfa, 0xd3, 0xa5, 0xa6, 0x85, + 0x3d, 0xd2, 0x1f, 0x10, 0xa7, 0x2a, 0xca, 0xf5, 0x49, 0x55, 0xf4, 0xf5, 0x09, 0x98, 0xd0, 0x0d, + 0x3d, 0xb6, 0xf3, 0x42, 0xdf, 0x9c, 0x74, 0x1c, 0xf1, 0xe4, 0x5b, 0x08, 0xd1, 0x1e, 0x3b, 0x43, + 0x08, 0x79, 0x01, 0x20, 0x8a, 0xf4, 0x90, 0xbe, 0x21, 0xb1, 0x54, 0x28, 0x05, 0xe4, 0x8b, 0x00, + 0x2b, 0x5e, 0x83, 0x46, 0x39, 0xdf, 0x8e, 0xf0, 0x4f, 0xbf, 0xd8, 0x73, 0x03, 0xf7, 0x74, 0xdb, + 0x6b, 0xd0, 0xde, 0xcb, 0xb7, 0x0a, 0x47, 0xf2, 0x69, 0x18, 0xb2, 0xba, 0x4d, 0x2a, 0xd3, 0x89, + 0x8d, 0xc9, 0x49, 0xd2, 0x6d, 0x2a, 0x2f, 0x26, 0xf8, 0xdd, 0xe4, 0xb1, 0x24, 0x03, 0x90, 0x77, + 0x00, 0x98, 0xde, 0xc3, 0x54, 0xd7, 0x32, 0xd5, 0x08, 0xfa, 0x91, 0x14, 0x95, 0x89, 0x09, 0xb2, + 0xb5, 0xca, 0x63, 0x12, 0xb2, 0x0a, 0x23, 0x62, 0x19, 0x15, 0xc7, 0x7e, 0xcf, 0xa4, 0x39, 0x9c, + 0x15, 0x5b, 0x5a, 0xe4, 0xf7, 0x42, 0xb0, 0xee, 0x03, 0xe6, 0x7e, 0xb0, 0x37, 0x61, 0x94, 0xb1, + 0xe7, 0x4f, 0x00, 0x70, 0x1b, 0x0a, 0x23, 0xef, 0x95, 0x06, 0x25, 0x5f, 0x01, 0x88, 0x09, 0xc8, + 0xe7, 0x30, 0x8b, 0x9f, 0x18, 0xea, 0x23, 0xcf, 0x2d, 0x2e, 0xf5, 0x0c, 0xf5, 0x8c, 0xd3, 0xe9, + 0xa4, 0x64, 0x65, 0x8d, 0xf8, 0x91, 0xdd, 0xe8, 0x96, 0x6d, 0xf4, 0xd6, 0xce, 0x11, 0x15, 0x5c, + 0xe9, 0xa9, 0x60, 0x56, 0x5e, 0x1c, 0xed, 0xcd, 0xdd, 0xa7, 0xf1, 0x25, 0x1d, 0x28, 0xc6, 0xab, + 0x91, 0xa8, 0x0b, 0x8e, 0xaa, 0xeb, 0xd5, 0x9e, 0xba, 0xd4, 0x0f, 0xd8, 0x53, 0x5d, 0x0f, 0x77, + 0xd2, 0x88, 0x9f, 0x38, 0x11, 0xf5, 0x8d, 0x1d, 0x55, 0xdf, 0x0b, 0x3d, 0xf5, 0x4d, 0x37, 0xb6, + 0x7b, 0xeb, 0x49, 0xf0, 0x24, 0x6f, 0xc2, 0xb8, 0x84, 0xe0, 0xfc, 0x10, 0x19, 0x56, 0xf9, 0xe3, + 0x3c, 0xdb, 0x18, 0x3d, 0xab, 0x27, 0xa1, 0x53, 0x91, 0x55, 0x6a, 0x2e, 0x1d, 0xe3, 0x1a, 0x75, + 0x52, 0x2a, 0x74, 0x64, 0xf2, 0x3e, 0x8c, 0x2d, 0xb5, 0x58, 0x47, 0xbc, 0xb6, 0x13, 0x52, 0x34, + 0xd8, 0xe2, 0x33, 0x18, 0xa5, 0x44, 0x11, 0x55, 0x9e, 0xfb, 0x3b, 0x2e, 0x52, 0x8d, 0x5a, 0x85, + 0x82, 0x0d, 0x1e, 0xf7, 0x7f, 0x0a, 0x19, 0x0e, 0x84, 0x79, 0xf6, 0x74, 0xca, 0x39, 0x88, 0xc2, + 0x1e, 0xed, 0x1d, 0xee, 0x56, 0xb5, 0xc5, 0x84, 0x08, 0xf4, 0x25, 0x4b, 0xe5, 0x49, 0xde, 0x82, + 0x31, 0x91, 0x42, 0xa1, 0x64, 0xad, 0x04, 0xb3, 0xc5, 0xf8, 0x75, 0x0c, 0x99, 0x6d, 0xc1, 0x76, + 0xfc, 0xc4, 0x61, 0x78, 0x8c, 0x4f, 0x3e, 0x0b, 0x33, 0x5b, 0x6e, 0xbb, 0xe1, 0xdd, 0x0f, 0xc4, + 0x32, 0x25, 0x14, 0xdd, 0x54, 0x1c, 0xf2, 0x77, 0x9f, 0x97, 0xdb, 0xd2, 0x52, 0xe9, 0x51, 0x7c, + 0xa9, 0x1c, 0xc8, 0x8f, 0xf5, 0x70, 0xe6, 0x12, 0x44, 0x8e, 0x92, 0xa0, 0xf9, 0x1e, 0x09, 0xea, + 0xad, 0x3e, 0x29, 0x4e, 0xa9, 0xd5, 0x10, 0x0f, 0x88, 0x6e, 0x97, 0xbf, 0xeb, 0xb9, 0xed, 0xd9, + 0x69, 0xed, 0x25, 0xcb, 0x68, 0x15, 0x43, 0xbc, 0x35, 0xaf, 0xe9, 0xd6, 0x0f, 0xe4, 0x83, 0x02, + 0xba, 0xd9, 0xf0, 0x81, 0xa7, 0x39, 0xd9, 0x52, 0x58, 0x93, 0xf7, 0xa1, 0xc0, 0xfe, 0x8f, 0xb6, + 0x40, 0x33, 0xda, 0xc9, 0xb9, 0x82, 0x29, 0xea, 0xc1, 0x6f, 0x84, 0x39, 0x1e, 0x52, 0x76, 0x47, + 0x1a, 0x2b, 0xf2, 0x3a, 0x00, 0x33, 0xcd, 0x84, 0x3a, 0x3e, 0x1d, 0x27, 0xe2, 0x40, 0x0b, 0xae, + 0x57, 0x11, 0xc7, 0xc8, 0x6c, 0x5f, 0xc6, 0x7e, 0xd5, 0xba, 0x0d, 0x8f, 0xcd, 0x8d, 0x33, 0x48, + 0x8b, 0xfb, 0x32, 0xa4, 0x0d, 0x38, 0x5c, 0x95, 0x0e, 0x05, 0xdd, 0xfc, 0xbe, 0x01, 0x33, 0x69, + 0x83, 0x74, 0x4c, 0x3a, 0x40, 0x33, 0x11, 0xbc, 0x83, 0x8e, 0x41, 0x1e, 0xbc, 0x13, 0x85, 0xec, + 0xcc, 0xc1, 0xd0, 0x1d, 0xb7, 0xdd, 0x90, 0xc1, 0xa5, 0xb8, 0x0e, 0xef, 0x33, 0x80, 0xc5, 0xe1, + 0x0c, 0x81, 0xdf, 0xa0, 0x61, 0x0b, 0xf5, 0x10, 0x47, 0xc0, 0x0b, 0x33, 0x16, 0x87, 0x33, 0x04, + 0xb6, 0xde, 0xcb, 0xf5, 0x09, 0x11, 0x98, 0x19, 0x10, 0x58, 0x1c, 0x4e, 0x2e, 0xc1, 0xc8, 0x6a, + 0x7b, 0x99, 0x3a, 0xf7, 0xa8, 0x38, 0x39, 0x47, 0x47, 0xa6, 0xd7, 0xb6, 0x9b, 0x0c, 0x66, 0xc9, + 0x42, 0xf3, 0xdb, 0x06, 0x4c, 0xf5, 0x7c, 0x9f, 0xe3, 0x33, 0x1e, 0x1e, 0x1d, 0xa6, 0x30, 0x48, + 0xff, 0x78, 0xf3, 0x73, 0xe9, 0xcd, 0x37, 0x7f, 0x3b, 0x07, 0x67, 0xfb, 0x2c, 0x97, 0x71, 0x88, + 0x91, 0x71, 0x6c, 0x88, 0xd1, 0xe7, 0xd9, 0xf2, 0xe4, 0xb8, 0xad, 0x60, 0xdd, 0x8b, 0x5b, 0x1c, + 0x9f, 0xc6, 0x62, 0x99, 0xcc, 0x06, 0x26, 0x33, 0x57, 0x9d, 0xab, 0x23, 0x85, 0x1d, 0x7a, 0x3d, + 0xa7, 0x45, 0x3a, 0xb3, 0x9e, 0x20, 0x9f, 0xec, 0x5f, 0x93, 0x20, 0x1f, 0xfd, 0x68, 0x3d, 0xf7, + 0x58, 0x8f, 0xd6, 0xd3, 0x8f, 0xc7, 0x86, 0x1e, 0xe5, 0x3c, 0x7a, 0x01, 0xc6, 0x6b, 0xd4, 0xf1, + 0xeb, 0x7b, 0xa5, 0x80, 0x7f, 0x24, 0x9e, 0xce, 0x19, 0xd7, 0x82, 0x00, 0x0b, 0x6c, 0x27, 0xe8, + 0xfd, 0x16, 0x1a, 0x8d, 0xf9, 0x6f, 0x12, 0xb1, 0x49, 0x7f, 0x1d, 0xe5, 0xe5, 0x25, 0x18, 0xda, + 0xda, 0xa3, 0xbe, 0xb4, 0xce, 0xb1, 0x21, 0xf7, 0x19, 0x40, 0x6d, 0x08, 0x62, 0x98, 0x5f, 0x81, + 0x82, 0x5a, 0x19, 0x2a, 0x04, 0xf6, 0x5b, 0xcc, 0x48, 0xae, 0x10, 0x18, 0xc0, 0xe2, 0xf0, 0x63, + 0xb3, 0x90, 0xc6, 0xa3, 0x90, 0x3d, 0x6e, 0x14, 0x58, 0xe5, 0x28, 0x6f, 0x4a, 0xe5, 0xf8, 0x5b, + 0xad, 0x3c, 0x64, 0x00, 0x8b, 0xc3, 0x1f, 0x6b, 0xe5, 0xff, 0xdc, 0x80, 0x1c, 0x26, 0x6f, 0x7a, + 0x0d, 0x46, 0xe5, 0x69, 0x8b, 0x9a, 0xd0, 0x68, 0x5a, 0x1e, 0xc6, 0x04, 0x7a, 0x64, 0x99, 0x00, + 0xb2, 0xaa, 0x36, 0xa9, 0xbf, 0xad, 0x05, 0x20, 0xde, 0x63, 0x00, 0xb5, 0x2a, 0xc4, 0x38, 0xc1, + 0xf7, 0xc0, 0x20, 0x4b, 0xe1, 0x48, 0xe1, 0x2a, 0x8b, 0x07, 0x59, 0xf6, 0x78, 0x4d, 0x24, 0x96, + 0xf9, 0x4b, 0x06, 0x9c, 0x4e, 0x35, 0xa1, 0x58, 0xad, 0xdc, 0x56, 0x53, 0xc4, 0x31, 0x69, 0xa8, + 0x71, 0x8c, 0x93, 0x04, 0x53, 0x9e, 0x40, 0xb6, 0x9e, 0x85, 0xd1, 0x68, 0x03, 0x4f, 0x66, 0xe4, + 0xa7, 0x43, 0x97, 0xbc, 0xdc, 0x07, 0xfe, 0x95, 0x01, 0xc3, 0xac, 0x09, 0x4f, 0xec, 0x0d, 0xbd, + 0xf4, 0x03, 0x1a, 0xd6, 0xa5, 0x81, 0xee, 0xe5, 0xfd, 0xfa, 0x30, 0x40, 0x8c, 0x4c, 0xb6, 0x61, + 0x62, 0x75, 0xa9, 0xb2, 0xb0, 0xd4, 0xa0, 0xed, 0x10, 0x23, 0x14, 0x12, 0x29, 0x8a, 0xa2, 0xcc, + 0xb8, 0x1c, 0xe1, 0x20, 0xd6, 0x0d, 0x9e, 0xdb, 0xa8, 0xdb, 0x6e, 0x44, 0xa7, 0xda, 0xb2, 0x3a, + 0x47, 0x56, 0x47, 0xad, 0x74, 0x77, 0x59, 0xa9, 0x23, 0x33, 0x60, 0x1d, 0x81, 0xd3, 0x6a, 0xf6, + 0xa9, 0x43, 0xe7, 0x48, 0xf6, 0xa0, 0x78, 0x1b, 0x57, 0x1f, 0xa5, 0x96, 0xec, 0xd1, 0xb5, 0x3c, + 0x27, 0x6a, 0x79, 0x8a, 0x2f, 0x5b, 0xe9, 0xf5, 0xf4, 0x70, 0x8d, 0x25, 0x37, 0x77, 0xac, 0xe4, + 0xfe, 0xb4, 0x01, 0xc3, 0x7c, 0x79, 0x8b, 0x9e, 0xb4, 0x4c, 0x5d, 0x40, 0xb7, 0x1e, 0xcf, 0x02, + 0x5a, 0x44, 0xcd, 0xa5, 0xf9, 0x2e, 0x78, 0x19, 0xa9, 0x24, 0xde, 0xc7, 0x94, 0xa7, 0x70, 0x68, + 0xd3, 0xf3, 0x92, 0x38, 0x24, 0x95, 0x3f, 0x8d, 0xa9, 0x72, 0xe1, 0x18, 0xea, 0x13, 0xff, 0x23, + 0x8f, 0xf8, 0xc4, 0xff, 0x32, 0x8c, 0x8a, 0x18, 0xcb, 0xf2, 0x81, 0xd8, 0xb9, 0x4b, 0x0f, 0x5c, + 0x04, 0x57, 0x1e, 0x50, 0xe1, 0x20, 0x7b, 0x5b, 0x4b, 0xf3, 0x1b, 0x21, 0x92, 0x55, 0x18, 0x8d, + 0xaf, 0x1e, 0xea, 0xd7, 0xee, 0x23, 0xb8, 0xb8, 0x84, 0x20, 0x03, 0xb5, 0x52, 0x6e, 0x1a, 0xc6, + 0x3c, 0xcc, 0x6f, 0x18, 0x50, 0x4c, 0xca, 0x0b, 0x3e, 0xb2, 0x25, 0x6f, 0x78, 0x46, 0xb1, 0x51, + 0xfc, 0x91, 0xad, 0xe8, 0x4a, 0xa8, 0x16, 0x25, 0xa5, 0xa2, 0x93, 0x79, 0xc8, 0xb3, 0x69, 0xd7, + 0x4e, 0xbc, 0xb2, 0xd5, 0x15, 0x30, 0x35, 0x34, 0x40, 0xe2, 0x29, 0xb3, 0xf6, 0x8f, 0xb2, 0x30, + 0xa6, 0x7c, 0x2c, 0xf2, 0x12, 0xe4, 0x97, 0x82, 0x65, 0xaf, 0xbe, 0x4f, 0x1b, 0xe2, 0xc4, 0x71, + 0xfc, 0xe1, 0xe1, 0xdc, 0xa8, 0x1b, 0xd8, 0x4d, 0x04, 0x5a, 0x51, 0x31, 0x29, 0xc3, 0x38, 0xff, + 0x4b, 0xa6, 0x7e, 0xc8, 0xc4, 0xa7, 0x25, 0x1c, 0x59, 0x26, 0x7d, 0x50, 0x97, 0x77, 0x8d, 0x84, + 0x7c, 0x01, 0x80, 0x03, 0xd8, 0xf7, 0x1d, 0xe0, 0x8a, 0x85, 0x9c, 0xc0, 0xa7, 0x45, 0x05, 0xa1, + 0xab, 0xf6, 0x10, 0x45, 0x41, 0x61, 0x88, 0xaf, 0xc7, 0x7b, 0xf5, 0x7d, 0x29, 0x5c, 0xb9, 0x13, + 0xbc, 0x1e, 0xef, 0xd5, 0xf7, 0xed, 0xf4, 0x78, 0x5b, 0x95, 0x25, 0xf9, 0xa6, 0x01, 0xe7, 0x2d, + 0x5a, 0xf7, 0xee, 0x51, 0xff, 0xa0, 0x14, 0x22, 0x96, 0x5a, 0xe3, 0xf1, 0xc1, 0xbd, 0x37, 0x44, + 0x8d, 0x2f, 0xfa, 0x82, 0x0b, 0x5e, 0x0c, 0x6c, 0x75, 0x42, 0xfb, 0x88, 0x26, 0x1c, 0x51, 0xa5, + 0xf9, 0x1f, 0x0c, 0x65, 0x0a, 0x90, 0x15, 0x18, 0x8d, 0x84, 0x45, 0x78, 0xa4, 0x23, 0xcb, 0x4c, + 0xc2, 0x2d, 0xba, 0x53, 0x7e, 0x4a, 0x1c, 0x0e, 0x4e, 0x47, 0x22, 0xa7, 0xcd, 0x08, 0x09, 0x24, + 0x9f, 0x81, 0x1c, 0x7e, 0xaa, 0xe3, 0x13, 0x83, 0xca, 0xa5, 0x26, 0xc7, 0xbe, 0x11, 0xb6, 0x1a, + 0x29, 0xc9, 0x27, 0x44, 0x84, 0x5a, 0x56, 0xcb, 0xdb, 0xcf, 0x40, 0xac, 0x1d, 0xd1, 0x1a, 0x13, + 0x87, 0x78, 0x2b, 0xd2, 0xfa, 0x0b, 0x19, 0x28, 0x26, 0x27, 0x1e, 0x79, 0x07, 0x0a, 0xf2, 0x1a, + 0xe9, 0xa2, 0x23, 0x32, 0x4a, 0x14, 0x44, 0x46, 0x07, 0x01, 0xb7, 0xf7, 0x1c, 0x2d, 0xdd, 0xab, + 0x46, 0xc0, 0x16, 0xe4, 0x75, 0x71, 0x73, 0x48, 0x99, 0x40, 0xa1, 0x17, 0x76, 0x12, 0x69, 0xbc, + 0x25, 0x1a, 0x79, 0x0d, 0xb2, 0xfc, 0xfe, 0xb4, 0x9a, 0x03, 0xf2, 0xee, 0xad, 0x12, 0xbf, 0xb8, + 0xc9, 0xe3, 0x51, 0xf4, 0x93, 0x03, 0x86, 0x4f, 0x96, 0x95, 0x9b, 0xb9, 0xc3, 0x5a, 0x72, 0x3a, + 0x09, 0x8e, 0x3a, 0x77, 0xfc, 0x15, 0xdd, 0x77, 0x73, 0xf9, 0x6c, 0x31, 0x27, 0x6e, 0x4a, 0xfe, + 0x66, 0x16, 0x46, 0xa3, 0xfa, 0x09, 0x01, 0xb4, 0x37, 0x44, 0x60, 0x09, 0xfe, 0x4d, 0xce, 0x41, + 0x5e, 0x9a, 0x18, 0x22, 0xb8, 0x64, 0x24, 0x10, 0xe6, 0xc5, 0x2c, 0x48, 0x5b, 0x82, 0x9b, 0x17, + 0x96, 0xfc, 0x49, 0xae, 0x43, 0x64, 0x28, 0xf4, 0xb3, 0x28, 0x72, 0xec, 0x83, 0x59, 0x11, 0x1a, + 0x99, 0x80, 0x8c, 0xcb, 0x6f, 0x85, 0x8c, 0x5a, 0x19, 0xb7, 0x41, 0xde, 0x81, 0xbc, 0xd3, 0x68, + 0xd0, 0x86, 0xed, 0x48, 0xd7, 0xee, 0x51, 0x42, 0x93, 0x67, 0xdc, 0xb8, 0x46, 0x47, 0xaa, 0x52, + 0x48, 0x4a, 0x30, 0xda, 0x74, 0xf8, 0xc1, 0x53, 0x63, 0x80, 0xe5, 0x21, 0xe6, 0x90, 0x67, 0x64, + 0x1b, 0x01, 0x6d, 0x90, 0x17, 0x21, 0xc7, 0xbe, 0xa6, 0x58, 0x0f, 0xa2, 0xcc, 0xbe, 0xab, 0xeb, + 0x6b, 0x7c, 0xc0, 0x16, 0x4f, 0x59, 0x88, 0x40, 0x9e, 0x87, 0x6c, 0x77, 0x7e, 0x47, 0x68, 0xfa, + 0x62, 0x7c, 0xb5, 0x3e, 0x42, 0x63, 0xc5, 0xe4, 0x06, 0xe4, 0xef, 0xeb, 0x17, 0xac, 0x4f, 0x27, + 0x3e, 0x63, 0x84, 0x1f, 0x21, 0x96, 0xf3, 0x30, 0xcc, 0x2f, 0xfe, 0x9a, 0xcf, 0x00, 0xc4, 0x55, + 0xf7, 0xc6, 0x00, 0x99, 0x5f, 0x80, 0xd1, 0xa8, 0x4a, 0xf2, 0x34, 0xc0, 0x3e, 0x3d, 0xb0, 0xf7, + 0x9c, 0x76, 0x43, 0x3c, 0xcf, 0x57, 0xb0, 0x46, 0xf7, 0xe9, 0xc1, 0x22, 0x02, 0xc8, 0x59, 0x18, + 0xe9, 0xb0, 0xaf, 0x2a, 0x93, 0xd0, 0x5b, 0xc3, 0x9d, 0xee, 0x36, 0x93, 0xd0, 0x59, 0x18, 0x41, + 0xe7, 0x87, 0x98, 0x68, 0xe3, 0x96, 0xfc, 0x69, 0xfe, 0x6a, 0x06, 0xf3, 0xec, 0x28, 0xed, 0x24, + 0xcf, 0xc1, 0x78, 0xdd, 0xa7, 0xb8, 0x1c, 0xe1, 0x0b, 0x06, 0xa2, 0x9e, 0x42, 0x0c, 0x5c, 0x6a, + 0x90, 0x4b, 0x30, 0x19, 0x67, 0xc5, 0xb7, 0xeb, 0xdb, 0x22, 0x85, 0x42, 0xc1, 0x1a, 0xef, 0xc8, + 0xb4, 0xf8, 0x0b, 0xdb, 0x78, 0x9b, 0xa9, 0xa8, 0x5e, 0xfa, 0x0d, 0x65, 0x86, 0xfb, 0x51, 0x6b, + 0x52, 0x81, 0xe3, 0x89, 0xcd, 0x19, 0x18, 0x76, 0x9c, 0xdd, 0xae, 0xcb, 0x6f, 0x56, 0x14, 0x2c, + 0xf1, 0x8b, 0xbc, 0x0c, 0x53, 0x81, 0xbb, 0xdb, 0x76, 0xc2, 0xae, 0x2f, 0x12, 0x1d, 0x51, 0x1f, + 0x45, 0x6a, 0xdc, 0x2a, 0x46, 0x05, 0x0b, 0x1c, 0x4e, 0x5e, 0x05, 0xa2, 0xd6, 0xe7, 0x6d, 0x7f, + 0x40, 0xeb, 0x5c, 0xd4, 0x0a, 0xd6, 0x94, 0x52, 0xb2, 0x8a, 0x05, 0xe4, 0x59, 0x28, 0xf8, 0x34, + 0x40, 0x93, 0x0c, 0x87, 0x0d, 0xd3, 0xd0, 0x59, 0x63, 0x12, 0x76, 0x87, 0x1e, 0x98, 0x65, 0x98, + 0xea, 0x99, 0x8f, 0xe4, 0x55, 0x6e, 0xdd, 0x8b, 0xf5, 0xb9, 0xc0, 0x37, 0x33, 0xf8, 0xf2, 0xa7, + 0xb6, 0x34, 0x0b, 0x24, 0xb3, 0x0d, 0x05, 0x55, 0xbf, 0x1e, 0x93, 0x9c, 0xe2, 0x0c, 0x06, 0x45, + 0x73, 0xe5, 0x33, 0xfc, 0xf0, 0x70, 0x2e, 0xe3, 0x36, 0x30, 0x14, 0xfa, 0x32, 0xe4, 0xa5, 0x95, + 0xa0, 0x3e, 0x25, 0x27, 0x0c, 0xca, 0x03, 0x2b, 0x2a, 0x35, 0x5f, 0x84, 0x11, 0xa1, 0x42, 0x8f, + 0x76, 0x44, 0x99, 0x5f, 0xcd, 0xc0, 0xa4, 0x45, 0xd9, 0x04, 0x17, 0x8f, 0xb4, 0x7d, 0xcc, 0xde, + 0x07, 0xd0, 0xfa, 0x76, 0x44, 0x2e, 0x98, 0xdf, 0x32, 0x60, 0x3a, 0x05, 0xf7, 0x43, 0x65, 0xf8, + 0xbc, 0x09, 0xa3, 0x15, 0xd7, 0x69, 0x96, 0x1a, 0x8d, 0x28, 0xb8, 0x1b, 0xad, 0xc1, 0x06, 0x9b, + 0x4e, 0x0e, 0x83, 0xaa, 0x8b, 0x69, 0x84, 0x4a, 0xae, 0x08, 0xa1, 0x88, 0x53, 0x1e, 0xcb, 0x17, + 0x08, 0x80, 0xb7, 0x29, 0x7e, 0x7f, 0x00, 0x2f, 0x04, 0x73, 0x60, 0x1c, 0x57, 0xf0, 0xc4, 0x7e, + 0xba, 0xf4, 0x0b, 0xc1, 0xc9, 0xee, 0x0d, 0xb4, 0xed, 0xfc, 0x46, 0x06, 0xce, 0xa4, 0x13, 0x7e, + 0xd8, 0x64, 0xad, 0x98, 0x88, 0x47, 0x79, 0xe4, 0x01, 0x93, 0xb5, 0xf2, 0xac, 0x3d, 0x88, 0x1f, + 0x23, 0x90, 0x1d, 0x18, 0x5f, 0x76, 0x82, 0x70, 0x91, 0x3a, 0x7e, 0xb8, 0x4d, 0x9d, 0x70, 0x00, + 0x0b, 0xf6, 0x79, 0xf9, 0x02, 0x17, 0x2e, 0x6a, 0x7b, 0x92, 0x32, 0x61, 0xe0, 0xe9, 0x6c, 0x23, + 0x41, 0xc9, 0x0d, 0x20, 0x28, 0x5f, 0x86, 0xc9, 0x1a, 0x6d, 0x39, 0x9d, 0x3d, 0xcf, 0xa7, 0xc2, + 0x77, 0x7e, 0x15, 0xc6, 0x23, 0x50, 0xaa, 0xb4, 0xe8, 0xc5, 0x1a, 0xbe, 0x32, 0x10, 0xb1, 0x2a, + 0xd1, 0x8b, 0xcd, 0x5f, 0xce, 0xc0, 0xd9, 0x52, 0x5d, 0x9c, 0x70, 0x88, 0x02, 0x79, 0x10, 0xfb, + 0x11, 0xd7, 0x4d, 0xae, 0xc1, 0xe8, 0x5d, 0xe7, 0xc1, 0x32, 0x75, 0x02, 0x1a, 0x88, 0x54, 0x79, + 0xdc, 0xfc, 0x72, 0x1e, 0xd8, 0x91, 0xdb, 0xcb, 0x8a, 0x71, 0xd4, 0xcd, 0x66, 0xee, 0x11, 0x37, + 0x9b, 0x26, 0x0c, 0x2f, 0x7a, 0xcd, 0x86, 0x58, 0x9c, 0xc4, 0xb9, 0xc5, 0x1e, 0x42, 0x2c, 0x51, + 0x62, 0x7e, 0xdf, 0x80, 0x89, 0xa8, 0xc5, 0xd8, 0x84, 0x8f, 0x7c, 0x48, 0x2e, 0xc1, 0x08, 0x56, + 0x14, 0x3d, 0x3f, 0x88, 0x8b, 0x46, 0x93, 0x81, 0x6c, 0xb7, 0x61, 0xc9, 0x42, 0x75, 0x24, 0x86, + 0x1e, 0x6d, 0x24, 0xcc, 0xbf, 0x83, 0x47, 0x22, 0x6a, 0x2f, 0xd9, 0x4a, 0xa4, 0x34, 0xc4, 0x18, + 0xb0, 0x21, 0x99, 0xc7, 0xf6, 0x49, 0xb2, 0x7d, 0x3f, 0xc9, 0xd7, 0x32, 0x30, 0x16, 0x35, 0xf6, + 0x63, 0x96, 0x49, 0x23, 0xea, 0xd7, 0x40, 0x17, 0x3c, 0x6a, 0x8a, 0xae, 0x10, 0xf7, 0x28, 0x3e, + 0x03, 0xc3, 0x62, 0x32, 0x19, 0x89, 0x03, 0xc9, 0xc4, 0xd7, 0x2d, 0x4f, 0x08, 0xd6, 0xc3, 0xf8, + 0x41, 0x03, 0x4b, 0xd0, 0xe1, 0x0d, 0x9a, 0x2d, 0xba, 0x2d, 0x4e, 0xc8, 0x9e, 0xd8, 0x35, 0x2a, + 0xfd, 0x06, 0x4d, 0xdc, 0xb1, 0x81, 0x56, 0xa7, 0xff, 0x7b, 0x08, 0x8a, 0x49, 0x92, 0xe3, 0x73, + 0x95, 0xac, 0x75, 0xb7, 0xc5, 0x9b, 0x52, 0x98, 0xab, 0xa4, 0xd3, 0xdd, 0xb6, 0x18, 0x8c, 0x5c, + 0x82, 0xdc, 0x9a, 0xef, 0xde, 0xc3, 0x5e, 0x8b, 0x27, 0xb5, 0x3a, 0xbe, 0x7b, 0x4f, 0x0d, 0x25, + 0x67, 0xe5, 0xb8, 0xa1, 0x5d, 0xae, 0x61, 0x54, 0x32, 0x1a, 0xd6, 0x62, 0x43, 0xdb, 0x0c, 0x92, + 0x69, 0xb7, 0x24, 0x1a, 0x5b, 0x2a, 0xcb, 0xd4, 0xf1, 0x45, 0x5e, 0x0d, 0xa1, 0xce, 0x70, 0xa9, + 0xdc, 0x46, 0x30, 0x4f, 0x18, 0x6f, 0xa9, 0x48, 0xa4, 0x09, 0x44, 0xf9, 0x29, 0x27, 0xf0, 0xf1, + 0x7b, 0x3c, 0xf9, 0x06, 0xe5, 0x8c, 0xca, 0xda, 0x56, 0x67, 0x73, 0x0a, 0xdf, 0xc7, 0xe9, 0x23, + 0x5c, 0x13, 0xb7, 0x2c, 0xd1, 0x91, 0x91, 0x3f, 0x96, 0x99, 0x0c, 0xdb, 0x07, 0x7e, 0x0b, 0x33, + 0x72, 0x67, 0xc4, 0x4c, 0xc8, 0xdb, 0x30, 0xa6, 0xc6, 0x9a, 0xf3, 0x88, 0xe8, 0x0b, 0xfc, 0x76, + 0x63, 0x9f, 0x9c, 0xa5, 0x2a, 0x01, 0xd9, 0x86, 0xb3, 0x0b, 0x5e, 0x3b, 0xe8, 0xb6, 0x68, 0x43, + 0x3b, 0xc1, 0x5d, 0xaa, 0xe0, 0x06, 0x73, 0x94, 0xc7, 0xa0, 0xd6, 0x05, 0x8a, 0x08, 0x6d, 0x96, + 0xd1, 0x1e, 0xfa, 0x06, 0xa4, 0x1f, 0x23, 0xf3, 0x13, 0xaa, 0x24, 0x0a, 0xc3, 0xe0, 0x48, 0x49, + 0x34, 0x7f, 0x11, 0xb7, 0x0a, 0x2d, 0x2f, 0xa4, 0xc2, 0x42, 0x7a, 0x62, 0x75, 0x65, 0xec, 0xa6, + 0x1e, 0xd2, 0x02, 0x76, 0xb4, 0xde, 0x71, 0x8c, 0xcd, 0x1b, 0xb1, 0x62, 0xe3, 0x0e, 0x6b, 0xe9, + 0xa6, 0x56, 0xa6, 0xf5, 0x6f, 0x18, 0x70, 0x3a, 0x95, 0x96, 0x5c, 0x05, 0x88, 0xed, 0x50, 0x31, + 0x4a, 0x3c, 0xdb, 0x7f, 0x04, 0xb5, 0x14, 0x0c, 0xf2, 0xf9, 0xa4, 0x05, 0x79, 0xfc, 0x02, 0x28, + 0x9f, 0xe0, 0x9a, 0xd0, 0x2d, 0xc8, 0x14, 0xbb, 0xd1, 0xfc, 0xad, 0x2c, 0x4c, 0xf5, 0x3c, 0x69, + 0x7d, 0x4c, 0xa4, 0xc2, 0x7e, 0xe2, 0x75, 0x51, 0x7e, 0xa4, 0x72, 0xa5, 0xdf, 0x83, 0xda, 0x29, + 0x6f, 0x8d, 0xa2, 0xeb, 0x4d, 0x3c, 0x34, 0x71, 0xcc, 0x93, 0xa3, 0x41, 0xfa, 0x5b, 0xb6, 0x2f, + 0xf7, 0xad, 0xed, 0x31, 0xbc, 0x69, 0xfb, 0xd7, 0xf8, 0xf9, 0xce, 0x5f, 0xcc, 0xc0, 0x74, 0x4f, + 0x9f, 0x9f, 0xd8, 0x59, 0xf7, 0x19, 0x6d, 0x05, 0x7d, 0xa6, 0xdf, 0x37, 0x1d, 0xc8, 0x52, 0xf9, + 0x33, 0x03, 0xce, 0xf6, 0xa1, 0x24, 0x07, 0x49, 0x21, 0xe2, 0x96, 0xcb, 0xf5, 0xa3, 0x2b, 0x7c, + 0x2c, 0xa2, 0xf4, 0x91, 0x49, 0x02, 0xdb, 0xee, 0xc7, 0x0d, 0x7f, 0xc2, 0xdf, 0x6d, 0x4f, 0xdf, + 0xee, 0x27, 0xbb, 0x37, 0x90, 0x1c, 0xfc, 0x51, 0x06, 0xce, 0xa4, 0x13, 0x3e, 0xe9, 0xaf, 0xb8, + 0x97, 0x60, 0x44, 0xc8, 0x67, 0xc2, 0xa3, 0x95, 0xa2, 0x10, 0xf4, 0xbb, 0xef, 0x92, 0xee, 0xc3, + 0xbd, 0xef, 0xfe, 0xd5, 0x0c, 0xc0, 0x16, 0xdd, 0x7e, 0xb2, 0xd3, 0x0a, 0x7e, 0x4a, 0x93, 0x30, + 0xc5, 0x1d, 0x3f, 0x78, 0x56, 0xc1, 0x55, 0x74, 0x8b, 0x0f, 0x9e, 0x53, 0x30, 0x7a, 0xd0, 0x2e, + 0x93, 0xfe, 0xa0, 0x9d, 0xb9, 0x0d, 0x33, 0xb7, 0x69, 0x18, 0xdb, 0x5c, 0xd2, 0x23, 0x72, 0x34, + 0xdb, 0x57, 0x60, 0x54, 0xe0, 0xeb, 0xaf, 0x05, 0xc9, 0xc8, 0x52, 0xb7, 0x61, 0xc5, 0x08, 0x26, + 0x85, 0xb3, 0x15, 0xda, 0xa4, 0x21, 0xfd, 0x68, 0xab, 0xa9, 0x01, 0xe1, 0x5d, 0xe1, 0xef, 0x9c, + 0x0d, 0x54, 0xc3, 0xb1, 0xe3, 0xb3, 0x09, 0xa7, 0xa3, 0xb6, 0x3f, 0x4e, 0xbe, 0xd7, 0x98, 0xd5, + 0x2a, 0x2e, 0x9f, 0xc7, 0x1c, 0x8f, 0x70, 0x89, 0x3f, 0x80, 0xf3, 0x92, 0x60, 0xcb, 0x8d, 0xce, + 0x15, 0x07, 0xa2, 0x25, 0x6f, 0xc2, 0x98, 0x42, 0x23, 0x52, 0x68, 0xe0, 0xd9, 0xfd, 0x7d, 0x37, + 0xdc, 0xb3, 0x03, 0x0e, 0x57, 0xcf, 0xee, 0x15, 0x74, 0xf3, 0x73, 0xf0, 0x54, 0x14, 0x85, 0x95, + 0x52, 0x75, 0x82, 0xb9, 0x71, 0x32, 0xe6, 0x2b, 0x71, 0xb7, 0x96, 0xda, 0xd1, 0x45, 0x12, 0xc9, + 0x9b, 0xa8, 0xdd, 0x12, 0x9d, 0xb9, 0xa0, 0xa4, 0x5b, 0x15, 0x56, 0x4f, 0x0c, 0x30, 0xdf, 0x50, + 0x1a, 0x9b, 0xc2, 0x50, 0x23, 0x36, 0x92, 0xc4, 0x5f, 0xcd, 0xc0, 0xe4, 0xea, 0x52, 0x65, 0x21, + 0x3a, 0x14, 0xf9, 0x98, 0xe5, 0x3c, 0xd4, 0xfa, 0xd6, 0x5f, 0xdf, 0x98, 0x1b, 0x30, 0x9d, 0x18, + 0x06, 0x7c, 0xc6, 0xf1, 0x6d, 0x1e, 0x2d, 0x15, 0x81, 0xa5, 0x0d, 0x73, 0x26, 0x8d, 0xfd, 0xe6, + 0x0d, 0x2b, 0x81, 0x6d, 0xfe, 0xfb, 0x7c, 0x82, 0xaf, 0x50, 0x61, 0xaf, 0xc0, 0xe8, 0x52, 0x10, + 0x74, 0xa9, 0xbf, 0x61, 0x2d, 0xab, 0xbb, 0x11, 0x17, 0x81, 0x76, 0xd7, 0x6f, 0x5a, 0x31, 0x02, + 0x79, 0x09, 0xf2, 0xe2, 0xc2, 0xb3, 0xd4, 0x09, 0x18, 0xfc, 0x11, 0xdd, 0x97, 0xb6, 0xa2, 0x62, + 0xf2, 0x1a, 0x14, 0xf8, 0xdf, 0x5c, 0xda, 0xc4, 0x80, 0xa3, 0xe7, 0x55, 0xa0, 0x73, 0xe9, 0xb4, + 0x34, 0x34, 0xf2, 0x22, 0x8c, 0xc9, 0xc7, 0xe6, 0x59, 0x8b, 0xb8, 0x3f, 0x5b, 0x5c, 0x76, 0x52, + 0x4b, 0xc8, 0x15, 0xc8, 0x96, 0x16, 0x2c, 0xf5, 0x35, 0x11, 0xa7, 0xee, 0xf3, 0x57, 0x85, 0xb4, + 0xf7, 0x57, 0x4b, 0x0b, 0x16, 0x99, 0xc7, 0x65, 0xef, 0x9e, 0xdb, 0xa0, 0xbe, 0x08, 0xdc, 0x46, + 0x51, 0xe9, 0x08, 0x58, 0x62, 0xd5, 0x43, 0x18, 0xb9, 0x06, 0x23, 0x15, 0x37, 0xe8, 0x34, 0x9d, + 0x03, 0x91, 0xe1, 0x8c, 0xa7, 0x4c, 0xe2, 0x20, 0x55, 0xb8, 0x04, 0x16, 0x79, 0x09, 0x86, 0x6a, + 0x75, 0xaf, 0x43, 0x67, 0xf3, 0x71, 0x74, 0x56, 0xc0, 0x00, 0x5a, 0x62, 0x21, 0x06, 0xc0, 0xc4, + 0x1b, 0xfc, 0xfe, 0xf0, 0xa8, 0x92, 0x78, 0x23, 0x79, 0x6f, 0x58, 0xe0, 0xf4, 0xc6, 0xcf, 0xc2, + 0xe3, 0x8c, 0x9f, 0xdd, 0x86, 0xb3, 0xb7, 0x71, 0x27, 0xc9, 0x4c, 0x25, 0xb7, 0x4e, 0xc5, 0x5b, + 0x9d, 0x1b, 0xd6, 0x92, 0xb8, 0x33, 0x8d, 0x9e, 0x05, 0xbe, 0xd9, 0xb4, 0x03, 0x8e, 0x23, 0x9f, + 0xf9, 0x4c, 0xbc, 0x18, 0xd6, 0x8f, 0x11, 0xf9, 0x2c, 0xcc, 0xa4, 0x15, 0x89, 0xdb, 0xd3, 0x78, + 0x27, 0x24, 0xbd, 0x02, 0xf5, 0x52, 0x46, 0x1a, 0x07, 0xb2, 0x0c, 0x45, 0x0e, 0x2f, 0x35, 0x5a, + 0x6e, 0xbb, 0xda, 0x72, 0xdc, 0x26, 0xde, 0xa5, 0x16, 0x17, 0xe2, 0x05, 0x57, 0x87, 0x15, 0xda, + 0x94, 0x95, 0x6a, 0x01, 0x76, 0x09, 0x4a, 0xf2, 0x73, 0x06, 0x14, 0x14, 0x19, 0x0b, 0xc4, 0xed, + 0x9d, 0x7e, 0xaf, 0xb0, 0xad, 0x3f, 0xa6, 0x57, 0xd8, 0x0a, 0xbe, 0xa8, 0x13, 0xa7, 0x9b, 0xd6, + 0x02, 0xcc, 0xa0, 0xdd, 0x6c, 0x7a, 0xf7, 0x37, 0xda, 0xf7, 0xa8, 0xef, 0xee, 0xb8, 0xb4, 0xc1, + 0x3b, 0x39, 0x89, 0xaa, 0x9e, 0x67, 0xd0, 0xc6, 0x2c, 0xea, 0xdd, 0x08, 0xa1, 0xa7, 0xa3, 0xa9, + 0x1c, 0x48, 0x19, 0xc6, 0x65, 0xb8, 0x17, 0x8f, 0x82, 0x2e, 0xc6, 0xd1, 0x59, 0x32, 0x36, 0xcc, + 0x46, 0x31, 0x52, 0x85, 0x47, 0x23, 0x31, 0xff, 0xc5, 0x08, 0x57, 0xda, 0xa5, 0x6e, 0xb8, 0x27, + 0xd5, 0xfc, 0x7c, 0x5a, 0xb0, 0x1a, 0x3f, 0x54, 0x53, 0x82, 0xd5, 0xf4, 0x10, 0x35, 0x79, 0xf8, + 0x9d, 0x49, 0x3d, 0xfc, 0x7e, 0x05, 0x46, 0xf1, 0xd9, 0x8b, 0x28, 0x2a, 0x28, 0x2f, 0x3c, 0x26, + 0x0c, 0xc8, 0xef, 0x1b, 0xc7, 0x08, 0xe4, 0x1a, 0x00, 0xa6, 0xef, 0xe2, 0x36, 0x80, 0x92, 0x14, + 0x02, 0xb3, 0x7c, 0x09, 0x3f, 0xa5, 0x82, 0x82, 0xec, 0x6b, 0xd6, 0x2d, 0xd5, 0xb1, 0xc9, 0xd9, + 0x07, 0xfe, 0x8e, 0x40, 0x8f, 0x11, 0x58, 0xf7, 0x54, 0x05, 0x35, 0x1c, 0x77, 0x4f, 0xfb, 0x8a, + 0x9a, 0xae, 0x7a, 0x05, 0x46, 0xd7, 0x64, 0x08, 0x04, 0x6a, 0x93, 0x82, 0x38, 0x33, 0x8c, 0xc2, + 0x25, 0xac, 0x18, 0x81, 0x7c, 0x0a, 0x46, 0x16, 0xa8, 0x1f, 0xae, 0xaf, 0x2f, 0x8b, 0xa7, 0xeb, + 0x9e, 0x66, 0x0b, 0x0d, 0x5e, 0x58, 0x0f, 0xc3, 0xe6, 0x0f, 0x0e, 0xe7, 0xc6, 0x43, 0xb7, 0x45, + 0xaf, 0x46, 0x8e, 0x42, 0x89, 0x4d, 0xca, 0x50, 0xe4, 0x71, 0x5d, 0xb1, 0xad, 0x87, 0x0a, 0x26, + 0xcf, 0xd5, 0x9d, 0xb8, 0xa4, 0x7d, 0x9f, 0x6e, 0x47, 0xd7, 0xf5, 0x7b, 0xf0, 0x49, 0x55, 0xa6, + 0xc6, 0x50, 0x3b, 0xc9, 0x5d, 0x8c, 0x67, 0x95, 0x67, 0xb0, 0xb4, 0xbe, 0xf6, 0x52, 0x90, 0x12, + 0x8c, 0x2f, 0x78, 0xad, 0x8e, 0x13, 0xba, 0x98, 0x7f, 0xec, 0x40, 0xe8, 0x12, 0x74, 0xfc, 0xd4, + 0xd5, 0x02, 0xfd, 0x15, 0x0b, 0xa5, 0x80, 0xdc, 0x82, 0x09, 0xcb, 0xeb, 0xb2, 0x8f, 0x24, 0x77, + 0x3d, 0x5c, 0x5d, 0x44, 0xef, 0x23, 0xb1, 0x6f, 0x69, 0x8b, 0x2d, 0x8e, 0x76, 0x9f, 0x4d, 0xa3, + 0x22, 0x2b, 0x29, 0x1e, 0x2e, 0x55, 0x47, 0xa8, 0x97, 0xf6, 0x7b, 0x98, 0xa5, 0x38, 0xc7, 0x6e, + 0xc0, 0x58, 0xad, 0xb6, 0xba, 0x4e, 0x83, 0xf0, 0x56, 0xd3, 0xbb, 0x8f, 0x2a, 0x22, 0x2f, 0x5f, + 0x0c, 0xf7, 0xec, 0x90, 0x06, 0xa1, 0xbd, 0xd3, 0xf4, 0xee, 0x5b, 0x2a, 0x16, 0xf9, 0xa2, 0xf2, + 0xac, 0x07, 0x1a, 0x07, 0x93, 0xc7, 0x1a, 0x07, 0x89, 0x27, 0x3f, 0x98, 0x89, 0x90, 0xfa, 0xe4, + 0x07, 0x43, 0xc7, 0x10, 0x37, 0xb6, 0x5f, 0x2b, 0x35, 0x1a, 0x3e, 0x0d, 0x02, 0x31, 0x97, 0x95, + 0x47, 0x8b, 0x1c, 0x5e, 0xa0, 0x85, 0xb8, 0x29, 0x04, 0x68, 0x7e, 0xd5, 0x4a, 0x77, 0x97, 0x63, + 0x1b, 0xe2, 0xe3, 0x15, 0xf5, 0xa1, 0xf5, 0xed, 0x88, 0xa8, 0x8f, 0x0d, 0x98, 0x4e, 0x0c, 0x83, + 0x34, 0xbf, 0x34, 0x70, 0xd2, 0xfc, 0x4a, 0xd0, 0x58, 0x09, 0x6c, 0xf3, 0xef, 0x8d, 0x24, 0xf8, + 0x8a, 0x93, 0x1e, 0x13, 0x86, 0xb9, 0x75, 0xa5, 0x66, 0x7f, 0xe6, 0xb6, 0x97, 0x25, 0x4a, 0xc8, + 0x39, 0xc8, 0xd6, 0x6a, 0xab, 0x6a, 0x6e, 0xfa, 0x20, 0xf0, 0x2c, 0x06, 0x63, 0x5f, 0x08, 0x0f, + 0x71, 0x94, 0x9b, 0xe9, 0x4c, 0x4f, 0x58, 0x08, 0x65, 0xe3, 0x2d, 0x4d, 0x98, 0x5c, 0x3c, 0xde, + 0xc2, 0x84, 0x89, 0x0d, 0x97, 0x05, 0x98, 0x2d, 0x05, 0x01, 0xf5, 0xf9, 0x03, 0x51, 0x78, 0x36, + 0xe0, 0x8b, 0x65, 0x56, 0xa8, 0x43, 0xac, 0xd4, 0xa9, 0x07, 0x56, 0x5f, 0x44, 0x72, 0x19, 0xf2, + 0xa5, 0x6e, 0xc3, 0xa5, 0xed, 0xba, 0x76, 0x37, 0xce, 0x11, 0x30, 0x2b, 0x2a, 0x25, 0xef, 0xc1, + 0x69, 0x41, 0x24, 0x6d, 0x2d, 0x31, 0x02, 0x23, 0xb1, 0xcc, 0x4a, 0x33, 0x40, 0x5a, 0x68, 0xb6, + 0x18, 0x92, 0x74, 0x4a, 0x52, 0x82, 0x62, 0x15, 0xa3, 0x9c, 0x2a, 0x34, 0xa8, 0xfb, 0x6e, 0x27, + 0xf4, 0x7c, 0xf1, 0x34, 0x0b, 0x1a, 0x6d, 0x3c, 0x02, 0xca, 0x6e, 0x44, 0x85, 0x56, 0x0f, 0x3a, + 0xb9, 0x03, 0xd3, 0x49, 0x18, 0xd3, 0x7c, 0xa3, 0xf1, 0xf3, 0xe6, 0x3d, 0x5c, 0x50, 0xf7, 0xa5, + 0x51, 0x91, 0x6d, 0x98, 0x2a, 0x85, 0xa1, 0xef, 0x6e, 0x77, 0x43, 0x9a, 0xb0, 0xda, 0xe4, 0x31, + 0x61, 0x54, 0x2e, 0x2d, 0xb7, 0xa7, 0x84, 0x30, 0x4e, 0x3b, 0x11, 0x65, 0x64, 0xbd, 0x59, 0xbd, + 0xec, 0x48, 0x03, 0x26, 0x6a, 0xee, 0x6e, 0xdb, 0x6d, 0xef, 0xde, 0xa1, 0x07, 0x6b, 0x8e, 0xeb, + 0x8b, 0x9b, 0xd4, 0xf2, 0x38, 0xb6, 0x14, 0x1c, 0xb4, 0x5a, 0x34, 0xf4, 0x71, 0x4d, 0x61, 0xe5, + 0x18, 0xba, 0x6c, 0xe0, 0x63, 0xdb, 0x9c, 0x0e, 0xc3, 0xf4, 0x3a, 0x8e, 0xab, 0x29, 0x4f, 0x9d, + 0xa7, 0x66, 0x39, 0x17, 0x06, 0xb4, 0x9c, 0x9b, 0x30, 0x55, 0x6d, 0xd7, 0xfd, 0x03, 0x4c, 0x5c, + 0x21, 0x1b, 0x37, 0x7e, 0x4c, 0xe3, 0xe4, 0x9b, 0x9e, 0x17, 0x1c, 0x29, 0x61, 0x69, 0xcd, 0xeb, + 0x65, 0x4c, 0x6a, 0xe2, 0x1d, 0x9a, 0xa5, 0xca, 0xda, 0x52, 0xdb, 0x0d, 0x5d, 0xcc, 0xc3, 0xcc, + 0x95, 0xf2, 0x0b, 0x82, 0xe7, 0xd3, 0xdc, 0x42, 0x72, 0x1b, 0x1d, 0xdb, 0x95, 0x28, 0x3d, 0x0f, + 0xcd, 0xa8, 0xf4, 0xe6, 0x9f, 0x0d, 0x73, 0x6d, 0xa8, 0xda, 0x35, 0x67, 0x94, 0xbc, 0xa4, 0x6a, + 0x08, 0x5e, 0xc2, 0xde, 0xc9, 0x9c, 0xc4, 0xde, 0xc9, 0x1e, 0x6f, 0xef, 0xe4, 0x8e, 0xb3, 0x77, + 0x12, 0x06, 0xc9, 0xd0, 0x89, 0x0d, 0x92, 0xe1, 0x13, 0x18, 0x24, 0x23, 0x27, 0x32, 0x48, 0x34, + 0xcb, 0x2a, 0x7f, 0x9c, 0x65, 0xf5, 0x7f, 0xcc, 0x97, 0x27, 0xd5, 0x7c, 0x49, 0x5b, 0x5c, 0x4f, + 0x62, 0xbe, 0x98, 0x3f, 0x0a, 0xc5, 0xa4, 0x42, 0x3c, 0xfe, 0xba, 0xf4, 0x63, 0xbb, 0x1d, 0xc9, + 0xd4, 0x75, 0x52, 0x21, 0xb1, 0x6d, 0xc4, 0x9a, 0xef, 0xde, 0x73, 0x42, 0x1a, 0x3f, 0x18, 0x82, + 0xdb, 0x88, 0x0e, 0x87, 0xe2, 0x24, 0x51, 0x50, 0xa2, 0xb5, 0x38, 0x93, 0xb6, 0x16, 0x9b, 0x5f, + 0xcf, 0xc0, 0x14, 0xbf, 0xd0, 0xf5, 0xe4, 0x3b, 0xb8, 0xde, 0xd6, 0x2c, 0x2c, 0x79, 0x54, 0x9e, + 0xe8, 0xdd, 0x11, 0x2e, 0xae, 0x2f, 0xc0, 0xe9, 0x9e, 0xa1, 0x40, 0x2b, 0xab, 0x22, 0xaf, 0xd2, + 0xf5, 0xd8, 0x59, 0xb3, 0xe9, 0x95, 0x6c, 0xde, 0xb0, 0x7a, 0x28, 0xcc, 0xbf, 0xcc, 0xf4, 0xf0, + 0x17, 0xce, 0x2e, 0xd5, 0x7d, 0x65, 0x9c, 0xcc, 0x7d, 0x95, 0x19, 0xcc, 0x7d, 0x95, 0x50, 0xc6, + 0xd9, 0x41, 0x94, 0xf1, 0x7b, 0x30, 0xbe, 0x4e, 0x9d, 0x56, 0xb0, 0xee, 0x89, 0x54, 0x19, 0xfc, + 0x72, 0xb9, 0xbc, 0x29, 0xc7, 0xca, 0xa4, 0x91, 0x10, 0xa5, 0xd9, 0x09, 0x19, 0x01, 0x53, 0x20, + 0x3c, 0x77, 0x86, 0xa5, 0x73, 0x50, 0x2d, 0xbf, 0xa1, 0x23, 0x2c, 0xbf, 0x1a, 0x14, 0x04, 0x5d, + 0x7c, 0x47, 0x5c, 0x79, 0x37, 0x96, 0x3a, 0x2d, 0x84, 0xcb, 0xda, 0xa3, 0xf4, 0x94, 0x51, 0xed, + 0xdc, 0x3a, 0xd1, 0x98, 0x98, 0xbf, 0x33, 0x22, 0x25, 0xfd, 0xa3, 0xf5, 0x0a, 0xe8, 0xfb, 0xfc, + 0xec, 0x09, 0xf7, 0xf9, 0xb9, 0xe3, 0x56, 0x23, 0x6d, 0x89, 0x1c, 0x3a, 0xc1, 0x12, 0x39, 0xfc, + 0xc8, 0x7b, 0xf6, 0x91, 0x13, 0x2e, 0x7a, 0x09, 0xa1, 0xcb, 0x0f, 0x22, 0x74, 0xa9, 0x0b, 0xe5, + 0xe8, 0xa3, 0x2f, 0x94, 0x70, 0xe2, 0x85, 0x52, 0x79, 0xe9, 0x62, 0x6c, 0xa0, 0x97, 0x2e, 0x8c, + 0x01, 0x5e, 0xba, 0xf8, 0x58, 0xad, 0xbe, 0x5f, 0x4a, 0x5f, 0x7d, 0x8f, 0x56, 0xbc, 0x27, 0x5a, + 0x7f, 0x7d, 0x6c, 0xd6, 0x96, 0xe3, 0x33, 0xdb, 0x3f, 0x20, 0xd7, 0x60, 0x44, 0x5e, 0xd9, 0x34, + 0xe2, 0x6d, 0x54, 0xef, 0x5d, 0x4d, 0x89, 0xc5, 0xb6, 0x09, 0x92, 0x58, 0x5c, 0x6f, 0xe0, 0xb7, + 0xd3, 0x04, 0x4c, 0xbb, 0x9d, 0x26, 0x60, 0xe6, 0xdf, 0xcc, 0x49, 0xd1, 0x67, 0x66, 0xac, 0xc8, + 0x24, 0xdd, 0xf3, 0xfc, 0xa9, 0x71, 0xf2, 0xe7, 0x4f, 0x3f, 0xc4, 0x7d, 0x57, 0x25, 0x21, 0x5b, + 0x76, 0x80, 0x84, 0x6c, 0xaf, 0x6b, 0xd9, 0xcc, 0x72, 0x71, 0xfa, 0x1c, 0x26, 0x0e, 0x47, 0xe7, + 0x31, 0xbb, 0xa9, 0xa6, 0x1d, 0x1b, 0x8a, 0x6f, 0x82, 0x20, 0xe5, 0x11, 0x09, 0xc7, 0x22, 0x73, + 0x66, 0xf8, 0x24, 0x77, 0xbf, 0x47, 0xfe, 0xb7, 0xde, 0xfd, 0xae, 0x02, 0x28, 0xe9, 0x85, 0xb9, + 0x2f, 0xf3, 0x05, 0x36, 0x4c, 0xc7, 0xa7, 0x16, 0x56, 0x08, 0xcd, 0x3f, 0x9f, 0x82, 0xa9, 0x5a, + 0x6d, 0xb5, 0xe2, 0x3a, 0xbb, 0x6d, 0x2f, 0x08, 0xdd, 0xfa, 0x52, 0x7b, 0xc7, 0x63, 0x6b, 0x79, + 0x34, 0x8d, 0x94, 0x7b, 0xc8, 0xf1, 0x14, 0x8a, 0x8a, 0x99, 0xad, 0x58, 0xf5, 0xfd, 0xe8, 0x45, + 0x5f, 0xb4, 0x15, 0x29, 0x03, 0x58, 0x1c, 0xce, 0x96, 0xcb, 0x5a, 0x97, 0xe7, 0x89, 0xe5, 0xee, + 0x65, 0x5c, 0x2e, 0x03, 0x0e, 0xb2, 0x64, 0x19, 0xa1, 0xbd, 0x02, 0x2b, 0xcc, 0xa7, 0xb3, 0xda, + 0x0d, 0xf2, 0xb8, 0x98, 0x2b, 0x09, 0xa1, 0xc4, 0xf1, 0x2e, 0x58, 0x07, 0xe1, 0xea, 0x29, 0x44, + 0xcf, 0x1c, 0x38, 0x80, 0xd3, 0xb8, 0xf7, 0x3c, 0xa9, 0x07, 0xe1, 0x8a, 0x58, 0x9e, 0x4d, 0xcc, + 0x5d, 0x90, 0xe2, 0x46, 0x50, 0xdf, 0xeb, 0x4c, 0xad, 0x81, 0x7c, 0xdd, 0x80, 0xa7, 0x53, 0x4b, + 0xa2, 0xd9, 0x3d, 0xa6, 0xdd, 0xe2, 0x57, 0x94, 0x06, 0xe6, 0xd6, 0x7d, 0xb9, 0x5f, 0xd5, 0x76, + 0x8a, 0x2a, 0x38, 0xba, 0x26, 0xf2, 0x8f, 0x0c, 0x38, 0xab, 0x61, 0xe0, 0x52, 0xde, 0xa2, 0xed, + 0x30, 0x40, 0x65, 0xde, 0x57, 0xae, 0x3f, 0x78, 0x3c, 0x72, 0xfd, 0x9c, 0xde, 0x17, 0xfe, 0x3e, + 0x1a, 0x56, 0xaf, 0x1e, 0x79, 0xf5, 0x69, 0x21, 0xb9, 0x07, 0x53, 0x58, 0x24, 0xbd, 0x19, 0x4c, + 0x66, 0x85, 0x13, 0x64, 0x26, 0x6e, 0xf6, 0x42, 0x37, 0x08, 0xbd, 0x16, 0x26, 0xab, 0x9c, 0xff, + 0xee, 0xe1, 0xdc, 0xb8, 0x86, 0x8e, 0x89, 0x7f, 0xb0, 0x0d, 0x91, 0x4b, 0xc4, 0x6d, 0xef, 0x78, + 0xda, 0x0b, 0x40, 0xc9, 0x2a, 0xc8, 0x3f, 0x31, 0x60, 0x96, 0x41, 0x79, 0x37, 0x6e, 0xf9, 0x5e, + 0x2b, 0x2a, 0x97, 0xc7, 0x59, 0x7d, 0x86, 0xad, 0xf9, 0x78, 0x86, 0xed, 0x05, 0x6c, 0x32, 0xd7, + 0x09, 0xf6, 0x8e, 0xef, 0xb5, 0xe2, 0xe6, 0x6b, 0x99, 0x70, 0xfb, 0x35, 0x92, 0xfc, 0xa4, 0x01, + 0xe7, 0xb4, 0x0d, 0xa5, 0x9a, 0x36, 0x67, 0x76, 0x52, 0x3b, 0xfb, 0x54, 0x8b, 0xca, 0x57, 0x85, + 0xfc, 0x5f, 0xc2, 0x16, 0xc4, 0xab, 0x05, 0xb6, 0xc5, 0x6e, 0x71, 0x2c, 0xa5, 0x09, 0xfd, 0x6b, + 0x21, 0x2e, 0x4c, 0xa1, 0x4b, 0x5e, 0x3b, 0x76, 0x9d, 0xe9, 0x7f, 0xec, 0x7a, 0x49, 0x54, 0xfd, + 0x0c, 0xa6, 0x26, 0xe9, 0x7f, 0xf6, 0xda, 0xcb, 0x95, 0xfc, 0x18, 0x9c, 0xeb, 0x01, 0x46, 0xb3, + 0xed, 0x74, 0xdf, 0xd9, 0xf6, 0xf2, 0xc3, 0xc3, 0xb9, 0x17, 0xd3, 0x6a, 0x4b, 0x9b, 0x69, 0xfd, + 0x6b, 0x20, 0x0e, 0x40, 0x5c, 0x28, 0x52, 0xeb, 0xa6, 0x0b, 0xe8, 0xcb, 0x42, 0x3e, 0x14, 0x7c, + 0xa6, 0xcb, 0x95, 0x36, 0xa8, 0x4b, 0x5e, 0x8c, 0x44, 0x28, 0x14, 0x94, 0xb4, 0x2c, 0x07, 0x98, + 0x63, 0xb7, 0x6f, 0x25, 0xdf, 0x3d, 0x9c, 0xd3, 0xb0, 0x99, 0x21, 0xa9, 0xe6, 0x7b, 0x51, 0x0d, + 0x49, 0x0d, 0x91, 0xfc, 0x9e, 0x01, 0x33, 0x0c, 0x10, 0x0b, 0x95, 0xe8, 0xd4, 0xec, 0x51, 0x52, + 0xbf, 0xf7, 0x78, 0xa4, 0xfe, 0x59, 0x6c, 0xa3, 0x2a, 0xf5, 0x3d, 0x43, 0x92, 0xda, 0x38, 0x94, + 0x76, 0xed, 0xf4, 0x47, 0x93, 0xf6, 0x73, 0x03, 0x48, 0x3b, 0xff, 0x00, 0xc7, 0x4b, 0x7b, 0xdf, + 0x5a, 0xc8, 0x3a, 0x14, 0x84, 0x0d, 0xc9, 0x07, 0xec, 0x19, 0x2d, 0x0b, 0x84, 0x5a, 0xc4, 0x0d, + 0x7b, 0x91, 0xb5, 0xa6, 0xa7, 0x87, 0x1a, 0x17, 0xd2, 0x86, 0x69, 0xfe, 0x5b, 0xdf, 0xdc, 0xce, + 0xf5, 0xdd, 0xdc, 0x5e, 0x16, 0x3d, 0xba, 0x28, 0xf8, 0x27, 0xf6, 0xb8, 0x4a, 0x45, 0x69, 0x8c, + 0x49, 0x07, 0x88, 0x06, 0xe6, 0x93, 0xf6, 0xe2, 0xd1, 0x5b, 0xda, 0x17, 0x45, 0x9d, 0x73, 0xc9, + 0x3a, 0x93, 0x33, 0x37, 0x85, 0x37, 0x71, 0x60, 0x52, 0x40, 0xd9, 0x8e, 0x11, 0x35, 0xfc, 0xb3, + 0xda, 0x5d, 0xab, 0x44, 0x29, 0xcf, 0x78, 0x2b, 0x6b, 0xc2, 0x4b, 0x2d, 0x09, 0x85, 0x9e, 0xe4, + 0x67, 0x7e, 0xcd, 0xe8, 0xa9, 0x83, 0xed, 0x4c, 0xf1, 0x87, 0x72, 0x5d, 0x1c, 0x77, 0xa6, 0x9c, + 0x23, 0xee, 0x90, 0x63, 0x04, 0x66, 0xdb, 0xa8, 0x57, 0xe7, 0xb2, 0xe2, 0x41, 0x1b, 0x0e, 0x8a, + 0x37, 0x4c, 0x73, 0x32, 0x7a, 0x25, 0x1b, 0xdb, 0x48, 0x18, 0xbd, 0x22, 0x62, 0x56, 0xcc, 0x9f, + 0xcc, 0xe8, 0x52, 0x42, 0x2e, 0x2b, 0x66, 0xb6, 0x72, 0x79, 0x4f, 0x9a, 0xd9, 0x8a, 0x71, 0xfd, + 0x1b, 0x06, 0x4c, 0xaf, 0xfa, 0xbb, 0x4e, 0xdb, 0xfd, 0x11, 0x7e, 0xb5, 0xdf, 0xc3, 0x61, 0x8c, + 0x42, 0x9d, 0x3f, 0xd2, 0xd4, 0x7e, 0x9e, 0x52, 0x31, 0xfb, 0xb0, 0xf8, 0x85, 0xad, 0xb4, 0xf6, + 0x60, 0xe0, 0x20, 0x36, 0x4c, 0xc9, 0xb0, 0xc8, 0xd1, 0x39, 0xdc, 0xfc, 0x46, 0x06, 0xc6, 0x14, + 0x89, 0x25, 0x9f, 0x84, 0x82, 0xca, 0x47, 0xf5, 0x6a, 0xa8, 0xd5, 0x5a, 0x1a, 0x16, 0xba, 0x35, + 0xa8, 0xd3, 0xd2, 0xdc, 0x1a, 0x4c, 0x2e, 0x11, 0x7a, 0xc2, 0x9d, 0xc8, 0x3b, 0x29, 0x3b, 0x91, + 0x13, 0xe5, 0x55, 0x7e, 0xb3, 0x77, 0x3f, 0x32, 0x78, 0x1a, 0x64, 0xf3, 0x5b, 0x06, 0x14, 0x93, + 0x73, 0xea, 0x23, 0x19, 0x95, 0x13, 0x78, 0x73, 0x7f, 0x36, 0x03, 0xc5, 0x75, 0x9f, 0x6d, 0xb7, + 0x1b, 0x32, 0x1c, 0xfa, 0x49, 0x3d, 0xca, 0x7e, 0x4b, 0x73, 0xb4, 0x3e, 0x15, 0x2d, 0x03, 0x6a, + 0xe7, 0x8e, 0xb8, 0x65, 0x98, 0xfb, 0xa5, 0x5f, 0x9b, 0x3b, 0x65, 0xbe, 0x0f, 0x33, 0xc9, 0xe1, + 0x40, 0x67, 0x6b, 0x09, 0x26, 0x75, 0x78, 0x32, 0x01, 0x5b, 0x92, 0xca, 0x4a, 0xe2, 0x9b, 0x7f, + 0x9c, 0x49, 0xf2, 0x16, 0xc7, 0xda, 0x4c, 0xe9, 0xb4, 0x9d, 0xed, 0x66, 0x94, 0x23, 0x4a, 0xbc, + 0xa2, 0x85, 0x20, 0x4b, 0x96, 0x9d, 0x24, 0x15, 0x5f, 0x14, 0xd4, 0x9b, 0x4d, 0x0f, 0xea, 0x25, + 0x37, 0x13, 0x11, 0x10, 0xb9, 0xf8, 0xc1, 0xac, 0xfb, 0x74, 0xdb, 0x8e, 0xa3, 0x20, 0xf4, 0xc0, + 0x07, 0xb2, 0x00, 0x33, 0x5a, 0x96, 0x07, 0x49, 0x3f, 0x14, 0x3b, 0x14, 0x43, 0x2c, 0xe0, 0xc4, + 0xa9, 0xc8, 0xf8, 0x34, 0xa5, 0xd7, 0x64, 0x3b, 0x31, 0xe1, 0x43, 0x55, 0x1f, 0x1b, 0x92, 0x6b, + 0x8d, 0x12, 0xe5, 0xdf, 0xa4, 0x6c, 0x85, 0xd6, 0xd2, 0x92, 0x73, 0x44, 0xf3, 0x7f, 0x18, 0x6c, + 0xfe, 0xd7, 0xf7, 0x3f, 0x66, 0x49, 0x02, 0x59, 0x97, 0x8e, 0x88, 0xba, 0xf8, 0xb7, 0x06, 0x4f, + 0xf3, 0x25, 0xc4, 0xe7, 0x75, 0x18, 0x5e, 0x77, 0xfc, 0x5d, 0x1a, 0x8a, 0x84, 0x54, 0x2a, 0x17, + 0x5e, 0x10, 0x5f, 0xc1, 0x0b, 0xf1, 0xb7, 0x25, 0x08, 0x54, 0xd7, 0x55, 0x66, 0x20, 0xd7, 0x95, + 0xe2, 0x7e, 0xcc, 0x3e, 0x2e, 0xf7, 0xa3, 0xf9, 0x97, 0x19, 0xde, 0x1f, 0xd1, 0xa8, 0x41, 0xdf, + 0x5c, 0xbc, 0x04, 0x39, 0x26, 0x07, 0xea, 0xc3, 0x96, 0x4c, 0x56, 0x54, 0x3c, 0x56, 0xce, 0xe6, + 0x0d, 0xea, 0x7f, 0x35, 0x2f, 0x25, 0x2e, 0x11, 0xea, 0xbc, 0x41, 0x0c, 0x7c, 0x1e, 0xdd, 0x6b, + 0x50, 0x75, 0x3a, 0xb4, 0xf5, 0x97, 0xec, 0xb1, 0x9c, 0xdc, 0x54, 0xd2, 0x43, 0xa9, 0x41, 0xb5, + 0xad, 0x1d, 0xc7, 0xe6, 0x69, 0x89, 0xd4, 0x15, 0x20, 0xce, 0x24, 0x55, 0x85, 0x09, 0x3d, 0x5b, + 0xb6, 0x88, 0xfe, 0xc0, 0x44, 0xb3, 0x89, 0x4c, 0xdb, 0xaa, 0x9f, 0x55, 0x27, 0x22, 0x65, 0x18, + 0xd7, 0xae, 0xa3, 0xaa, 0xaf, 0x0a, 0xeb, 0x97, 0x59, 0x55, 0xbf, 0x9f, 0x46, 0xa2, 0xdc, 0xd4, + 0xf8, 0x04, 0x14, 0xc5, 0xcc, 0x8c, 0x52, 0x84, 0xe2, 0xf1, 0xdc, 0x52, 0xc5, 0x52, 0x67, 0x53, + 0xdd, 0x6d, 0xf8, 0x16, 0x42, 0xcd, 0x6f, 0x1b, 0x70, 0x6e, 0x85, 0x86, 0xf7, 0x3d, 0x7f, 0xdf, + 0xa2, 0x41, 0xe8, 0xbb, 0x3c, 0xe3, 0x28, 0xca, 0xe3, 0x27, 0xc9, 0x9b, 0xf2, 0x09, 0x30, 0x5d, + 0x41, 0x26, 0xeb, 0x28, 0x8f, 0x0b, 0xa1, 0x1c, 0xc2, 0x80, 0x03, 0xf9, 0xf4, 0xd7, 0xeb, 0xe2, + 0xe9, 0xaf, 0xcc, 0xd1, 0xc4, 0xd1, 0xbc, 0x68, 0xd0, 0xb6, 0x7c, 0xf2, 0xeb, 0x5b, 0x19, 0x38, + 0x9d, 0xd2, 0xac, 0xcd, 0x4f, 0x3e, 0xa1, 0xca, 0xa1, 0xac, 0x29, 0x07, 0xf9, 0x36, 0x64, 0xdf, + 0x81, 0x4f, 0xd5, 0x15, 0xbf, 0x62, 0xc0, 0x59, 0x5d, 0x7a, 0x44, 0x50, 0xd0, 0xe6, 0x0d, 0xf2, + 0x06, 0x0c, 0x2f, 0x52, 0xa7, 0x41, 0x65, 0x26, 0xbb, 0xd3, 0x89, 0x77, 0x77, 0x79, 0x21, 0x67, + 0xfb, 0xc7, 0x7c, 0x2a, 0x9f, 0xb2, 0x04, 0x09, 0xa9, 0x88, 0xc6, 0x71, 0xb3, 0xd4, 0x94, 0x57, + 0x84, 0xd2, 0xaa, 0x3a, 0xe2, 0x70, 0xf3, 0xbb, 0x06, 0x3c, 0x75, 0x04, 0x0d, 0xfb, 0x70, 0xec, + 0xd3, 0xab, 0x1f, 0x0e, 0x17, 0x16, 0x84, 0x92, 0xb7, 0x61, 0x72, 0x5d, 0x98, 0xb5, 0xf2, 0x73, + 0x64, 0xe2, 0x10, 0x71, 0x69, 0xf1, 0xda, 0xf2, 0xbb, 0x24, 0x91, 0xb5, 0xbb, 0x6b, 0xd9, 0x23, + 0xef, 0xae, 0xa9, 0x57, 0xc1, 0x72, 0x83, 0x5e, 0x05, 0x7b, 0x3f, 0x99, 0x82, 0x5f, 0x5c, 0x13, + 0x8f, 0x2f, 0xc2, 0x19, 0xfd, 0x2f, 0xc2, 0xc9, 0x03, 0xfd, 0x4c, 0xea, 0x1d, 0x9b, 0x6f, 0x18, + 0x50, 0xd4, 0x79, 0x3f, 0xea, 0xf7, 0x7c, 0x4b, 0xfb, 0x9e, 0x4f, 0xa5, 0x7f, 0xcf, 0xfe, 0x1f, + 0xb2, 0xe7, 0xb9, 0x81, 0x81, 0x3e, 0xa0, 0x09, 0xc3, 0x15, 0xaf, 0xe5, 0xb8, 0x6d, 0x35, 0x53, + 0x7d, 0x03, 0x21, 0x96, 0x28, 0x19, 0xe8, 0xda, 0xa0, 0xf9, 0x73, 0x39, 0x38, 0x67, 0xd1, 0x5d, + 0x97, 0x59, 0x55, 0x1b, 0x81, 0xdb, 0xde, 0xd5, 0x6e, 0x40, 0x99, 0x89, 0x01, 0x17, 0x59, 0x4c, + 0x18, 0x24, 0x1a, 0xef, 0x97, 0x20, 0xcf, 0x54, 0xbb, 0x32, 0xe6, 0xe8, 0x21, 0xc7, 0x87, 0x5e, + 0xb8, 0x30, 0xc8, 0x62, 0x72, 0x45, 0x2c, 0x3c, 0x4a, 0x9e, 0x29, 0xb6, 0xf0, 0xfc, 0xe0, 0x70, + 0x0e, 0xf8, 0x23, 0xe3, 0xac, 0x54, 0x2c, 0x3e, 0x91, 0x25, 0x96, 0xeb, 0x63, 0x89, 0xdd, 0x85, + 0x99, 0x52, 0x83, 0x2b, 0x35, 0xa7, 0xb9, 0xe6, 0xbb, 0xed, 0xba, 0xdb, 0x71, 0x9a, 0x72, 0x77, + 0x81, 0xe7, 0x24, 0x4e, 0x54, 0x6e, 0x77, 0x22, 0x04, 0x2b, 0x95, 0x8c, 0x75, 0xa3, 0xb2, 0x52, + 0xe3, 0xef, 0x78, 0xf0, 0xc3, 0x0f, 0xec, 0x46, 0xa3, 0x1d, 0xf0, 0x87, 0x3c, 0xac, 0xa8, 0x18, + 0x6d, 0x40, 0x3c, 0x92, 0x5d, 0x5f, 0xae, 0xc5, 0xa1, 0xd6, 0x3c, 0x0d, 0x06, 0x3f, 0xb6, 0x0d, + 0x9b, 0x01, 0x1e, 0xdd, 0x6a, 0x78, 0x31, 0x5d, 0xad, 0xb6, 0xc8, 0xe8, 0xf2, 0x3d, 0x74, 0x41, + 0xb0, 0xa7, 0xd2, 0x71, 0x3c, 0x72, 0x0d, 0x80, 0x5f, 0xf2, 0x47, 0x81, 0x18, 0x8d, 0x2d, 0x46, + 0x1f, 0xa1, 0xdc, 0x62, 0x54, 0x50, 0xc8, 0x9b, 0x30, 0x5d, 0x5d, 0x98, 0x97, 0x2e, 0xab, 0x8a, + 0x57, 0xef, 0xb6, 0x68, 0x3b, 0xc4, 0x43, 0xd3, 0x02, 0xff, 0x86, 0xb4, 0x3e, 0xcf, 0xa4, 0x20, + 0x0d, 0x4d, 0x64, 0x66, 0xe3, 0x79, 0x3d, 0x17, 0xbc, 0x06, 0x0d, 0x36, 0xaf, 0x7f, 0xcc, 0x32, + 0xb3, 0x29, 0x7d, 0xc3, 0xd9, 0x76, 0x3d, 0x75, 0x66, 0xfe, 0xbf, 0x98, 0x99, 0xad, 0x07, 0x97, + 0xfc, 0x10, 0x0c, 0xe1, 0x4f, 0xb1, 0x4c, 0x4f, 0xa7, 0xb0, 0x8d, 0x97, 0xe8, 0x3a, 0x7f, 0x19, + 0x01, 0x09, 0xc8, 0x12, 0x8c, 0x88, 0x8c, 0xa8, 0x27, 0xc9, 0x2f, 0x24, 0x92, 0x03, 0x73, 0xd3, + 0x4f, 0xd0, 0x9b, 0x0d, 0x28, 0xa8, 0x15, 0x32, 0x19, 0x59, 0x74, 0x82, 0x3d, 0xda, 0x60, 0xbf, + 0x44, 0x6a, 0x40, 0x94, 0x91, 0x3d, 0x84, 0xda, 0xac, 0x1d, 0x96, 0x82, 0xc2, 0xb4, 0xc3, 0x52, + 0xb0, 0x11, 0x88, 0xa6, 0x88, 0xad, 0x93, 0x8b, 0xdb, 0xf0, 0x86, 0x25, 0x8a, 0x50, 0x5b, 0xca, + 0x23, 0x32, 0xdf, 0xa9, 0xef, 0x53, 0x7f, 0xf3, 0xfa, 0x47, 0xa1, 0x2d, 0xf5, 0x3a, 0x8e, 0xf8, + 0x26, 0x5f, 0x85, 0xe8, 0x61, 0x0f, 0x0d, 0x99, 0x19, 0x96, 0xf1, 0x3d, 0x52, 0x23, 0x36, 0x2c, + 0xe3, 0x7b, 0xa4, 0xaa, 0x61, 0x19, 0xa1, 0x46, 0x0f, 0x1f, 0x67, 0x8e, 0x79, 0xf8, 0xb8, 0xcf, + 0x23, 0xef, 0x32, 0xa1, 0xce, 0x71, 0x8f, 0xbc, 0x33, 0xfb, 0x5f, 0x7e, 0xfa, 0xdc, 0x40, 0xf6, + 0x3f, 0xbe, 0x17, 0x2b, 0x3e, 0x7d, 0xd2, 0xfe, 0x17, 0x9c, 0xd4, 0x4d, 0xc5, 0xd0, 0xe0, 0x4c, + 0x8f, 0x89, 0x69, 0xf8, 0x34, 0x14, 0x4a, 0x61, 0xe8, 0xd4, 0xf7, 0x68, 0x03, 0x1f, 0xd8, 0x56, + 0x6e, 0xb2, 0x39, 0x02, 0xae, 0x3a, 0x63, 0x55, 0x5c, 0xf2, 0x0a, 0x0c, 0x5b, 0xd4, 0x09, 0x44, + 0x70, 0x89, 0x30, 0x27, 0x7c, 0x84, 0xa8, 0x5e, 0x25, 0x8e, 0xc3, 0x36, 0x51, 0x4b, 0xed, 0x7b, + 0x2e, 0x1b, 0x93, 0x7c, 0x9c, 0x98, 0xdf, 0xe5, 0x20, 0x55, 0x6b, 0x08, 0x2c, 0xf2, 0xba, 0x62, + 0x76, 0x8c, 0xc6, 0xf6, 0x3f, 0xdf, 0x9b, 0xd9, 0xd2, 0xfa, 0x50, 0x4d, 0x8a, 0xc8, 0x0e, 0xb9, + 0x09, 0x23, 0x72, 0xcb, 0x0d, 0xb1, 0xcd, 0x2f, 0x28, 0x7b, 0x6f, 0x2d, 0x48, 0x64, 0xcc, 0x89, + 0xad, 0xe4, 0xee, 0x1b, 0x53, 0x72, 0x62, 0x2b, 0xb9, 0xfb, 0xb4, 0x9c, 0xd8, 0x4a, 0x16, 0xbf, + 0x68, 0x07, 0x55, 0x38, 0x76, 0x07, 0xb5, 0x09, 0x85, 0x35, 0xc7, 0x0f, 0x5d, 0xb6, 0x1c, 0xb5, + 0x43, 0xfe, 0x1a, 0x54, 0xbc, 0xc1, 0x57, 0x8a, 0xca, 0xcf, 0xc8, 0xdc, 0xd0, 0x1d, 0x05, 0x5f, + 0x4f, 0x2a, 0x1c, 0xc3, 0xd3, 0x43, 0x4b, 0x26, 0x1e, 0x25, 0xb4, 0x24, 0x1f, 0x3d, 0xdf, 0x38, + 0x19, 0x07, 0xf2, 0x44, 0x6f, 0x32, 0x26, 0x47, 0x1f, 0x77, 0x9c, 0x9f, 0x87, 0x02, 0xfb, 0x1b, + 0x5f, 0xa8, 0x71, 0x29, 0x7f, 0xed, 0x29, 0xce, 0xc4, 0xa1, 0x4f, 0x68, 0xfe, 0x8c, 0x4d, 0x8d, + 0x86, 0x7c, 0x02, 0x23, 0xe3, 0xa4, 0xb7, 0x46, 0xe3, 0x46, 0xde, 0x81, 0x82, 0xfa, 0xb4, 0xd6, + 0xec, 0x54, 0x1c, 0x1c, 0xd4, 0x10, 0xf0, 0xe4, 0x57, 0xd2, 0x08, 0xd8, 0xfa, 0x55, 0xea, 0x74, + 0x90, 0x96, 0x28, 0xd2, 0xde, 0xe9, 0x24, 0xc9, 0x24, 0x1a, 0xf9, 0x0c, 0x14, 0x4a, 0x9d, 0x4e, + 0xac, 0x71, 0xa6, 0x95, 0x7d, 0x64, 0xa7, 0x63, 0xa7, 0x6a, 0x1d, 0x8d, 0x82, 0x09, 0x96, 0x30, + 0xf8, 0xb0, 0xde, 0x99, 0x58, 0xb0, 0xe4, 0x83, 0x51, 0x49, 0xc1, 0x52, 0xd0, 0xcd, 0xef, 0x1b, + 0x70, 0xb6, 0xcf, 0xb0, 0xe1, 0x5e, 0x3c, 0xf6, 0x96, 0xf3, 0xbd, 0xb8, 0xce, 0x2a, 0x27, 0x32, + 0x16, 0x8e, 0xe8, 0xc6, 0x3f, 0x4e, 0x3f, 0xb1, 0x06, 0xab, 0x9d, 0x96, 0xab, 0x71, 0xfa, 0xd3, + 0x54, 0xd9, 0x8f, 0xec, 0x69, 0x2a, 0xf3, 0xd0, 0x80, 0x31, 0x45, 0x98, 0xc9, 0x45, 0x25, 0x36, + 0xbe, 0xc8, 0xb3, 0x5a, 0x29, 0x1c, 0x32, 0x5c, 0x9d, 0xa3, 0x64, 0x66, 0x8e, 0x77, 0x81, 0xe0, + 0x1b, 0x8d, 0xd9, 0x18, 0xaf, 0x95, 0xf0, 0x57, 0xe0, 0x9b, 0x8c, 0x5f, 0x00, 0x58, 0x76, 0x82, + 0xb0, 0x54, 0x0f, 0xdd, 0x7b, 0x74, 0x00, 0xcd, 0x1d, 0xe7, 0x85, 0x77, 0xf0, 0xe9, 0x5f, 0x46, + 0xd6, 0x93, 0x17, 0x3e, 0x62, 0x68, 0xfe, 0x95, 0x01, 0x63, 0x4b, 0xed, 0x20, 0x74, 0x9a, 0x4d, + 0x5c, 0x5a, 0x3f, 0x4e, 0x19, 0x00, 0xa3, 0x7e, 0x1d, 0xb1, 0x9c, 0xbf, 0x06, 0x93, 0x09, 0x34, + 0xb6, 0xe5, 0xa8, 0xe1, 0x1d, 0x17, 0x75, 0xcb, 0xc1, 0x6f, 0xbd, 0x58, 0xa2, 0xc4, 0xac, 0x2a, + 0x64, 0x9b, 0xd7, 0xd1, 0xcd, 0x3c, 0x0f, 0xe0, 0x4a, 0x90, 0xb4, 0xcc, 0x48, 0xb2, 0x25, 0x9b, + 0xd7, 0x2d, 0x05, 0xcb, 0x5c, 0x81, 0xe1, 0x9a, 0xe7, 0x87, 0xe5, 0x03, 0x6e, 0x0c, 0x55, 0x68, + 0x50, 0x57, 0xfd, 0xc8, 0x2e, 0x7a, 0x94, 0xea, 0x96, 0x28, 0x62, 0x3b, 0x92, 0x5b, 0x2e, 0x6d, + 0x36, 0xd4, 0xf8, 0x9e, 0x1d, 0x06, 0xb0, 0x38, 0x9c, 0x19, 0x8c, 0x67, 0xe2, 0x94, 0x5a, 0x71, + 0x20, 0xd1, 0xa3, 0xda, 0x4c, 0x0b, 0xda, 0xf8, 0x3e, 0xab, 0xa7, 0xcd, 0xd7, 0x6a, 0x3a, 0x62, + 0xa8, 0xff, 0xbe, 0x01, 0xe7, 0xfb, 0x93, 0xa8, 0xb1, 0x49, 0xc6, 0x11, 0xb1, 0x49, 0x2f, 0x24, + 0xfd, 0x9e, 0x88, 0x26, 0xfc, 0x9e, 0xb1, 0xb7, 0xb3, 0x82, 0xa1, 0x61, 0xf5, 0xe8, 0x89, 0x92, + 0x8b, 0x47, 0xb4, 0x19, 0x11, 0xf9, 0x67, 0x0e, 0x91, 0xc6, 0x12, 0xb4, 0xe6, 0x3f, 0xcb, 0xc2, + 0xb9, 0xbe, 0x14, 0x64, 0x51, 0x7b, 0x9e, 0xf5, 0xca, 0x71, 0x35, 0x5c, 0xc5, 0x7f, 0x53, 0x1f, + 0x6c, 0x5d, 0x8d, 0xb2, 0xb2, 0xf1, 0x27, 0x5b, 0x5f, 0x3e, 0x96, 0x17, 0x47, 0x47, 0x66, 0xd0, + 0x9b, 0xa0, 0x0d, 0xe3, 0xa2, 0x69, 0xe8, 0xb8, 0xe2, 0x7d, 0x54, 0x19, 0x17, 0xcd, 0x41, 0x96, + 0x2c, 0x8b, 0x03, 0xc6, 0x72, 0xe9, 0x01, 0x63, 0xe6, 0x4f, 0x19, 0x30, 0x1a, 0x35, 0x9b, 0x9c, + 0x87, 0x33, 0xeb, 0x56, 0x69, 0xa1, 0x6a, 0xaf, 0xbf, 0xbf, 0x56, 0xb5, 0x37, 0x56, 0x6a, 0x6b, + 0xd5, 0x85, 0xa5, 0x5b, 0x4b, 0xd5, 0x4a, 0xf1, 0x14, 0x99, 0x82, 0xf1, 0x8d, 0x95, 0x3b, 0x2b, + 0xab, 0x5b, 0x2b, 0x76, 0xd5, 0xb2, 0x56, 0xad, 0xa2, 0x41, 0xc6, 0x61, 0xd4, 0x2a, 0x97, 0x16, + 0xec, 0x95, 0xd5, 0x4a, 0xb5, 0x98, 0x21, 0x45, 0x28, 0x2c, 0xac, 0xae, 0xac, 0x54, 0x17, 0xd6, + 0x97, 0x36, 0x97, 0xd6, 0xdf, 0x2f, 0x66, 0x09, 0x81, 0x09, 0x44, 0x58, 0xb3, 0x96, 0x56, 0x16, + 0x96, 0xd6, 0x4a, 0xcb, 0xc5, 0x1c, 0x83, 0x31, 0x7c, 0x05, 0x36, 0x64, 0xbe, 0xc5, 0x23, 0xa0, + 0x79, 0x7f, 0xc9, 0x19, 0x20, 0xb5, 0xf5, 0xd2, 0xfa, 0x46, 0x2d, 0xd1, 0x82, 0x31, 0x18, 0xa9, + 0x6d, 0x2c, 0x2c, 0x54, 0x6b, 0xb5, 0xa2, 0x41, 0x00, 0x86, 0x6f, 0x95, 0x96, 0x96, 0xab, 0x95, + 0x62, 0xc6, 0xfc, 0x69, 0x03, 0x0a, 0xc2, 0x78, 0x28, 0x35, 0xa9, 0x1f, 0x3e, 0xda, 0x5c, 0x78, + 0x5d, 0xdb, 0x3f, 0x44, 0x01, 0x71, 0x0a, 0x7f, 0x56, 0x9c, 0x3a, 0x03, 0xfe, 0x9d, 0x01, 0xc5, + 0x24, 0x22, 0x79, 0x1b, 0xf2, 0x35, 0x7a, 0x8f, 0xfa, 0x6e, 0x78, 0x20, 0x24, 0x49, 0xbe, 0xe6, + 0xcd, 0x71, 0x44, 0x19, 0xf7, 0x6f, 0x05, 0xe2, 0x97, 0x15, 0xd1, 0x0c, 0x3a, 0x21, 0x14, 0xf3, + 0x3f, 0xfb, 0xb8, 0xcc, 0x7f, 0xf3, 0x4f, 0x0d, 0x38, 0x7b, 0x9b, 0x86, 0x6a, 0x9f, 0xa2, 0x94, + 0x2d, 0x9f, 0x18, 0xac, 0x5f, 0x4a, 0x4f, 0x66, 0x61, 0x04, 0x8b, 0xe4, 0xe5, 0x32, 0x4b, 0xfe, + 0x24, 0x65, 0x18, 0xd6, 0xb2, 0xe2, 0xc9, 0xb9, 0xd6, 0xa7, 0xee, 0xab, 0x4a, 0x0a, 0x32, 0x4b, + 0x50, 0x9e, 0x7f, 0x1d, 0xc6, 0x3e, 0x64, 0x96, 0xbb, 0x2b, 0xef, 0xc0, 0xa4, 0xb4, 0xd6, 0xd6, + 0x97, 0x6b, 0xb8, 0x2c, 0x4f, 0xc2, 0xd8, 0x66, 0xd5, 0x5a, 0xba, 0xf5, 0xbe, 0x7d, 0x6b, 0x63, + 0x79, 0xb9, 0x78, 0x8a, 0x09, 0xbb, 0x00, 0x2c, 0x94, 0x8a, 0x06, 0x29, 0x40, 0x7e, 0x69, 0xa5, + 0x56, 0x5d, 0xd8, 0xb0, 0xaa, 0xc5, 0xcc, 0x95, 0x17, 0x60, 0x22, 0xbe, 0x40, 0x83, 0x42, 0x3c, + 0x02, 0x59, 0xab, 0xb4, 0x55, 0x3c, 0xc5, 0x04, 0x75, 0xed, 0xce, 0x42, 0xed, 0xfa, 0xf5, 0xa2, + 0x71, 0xe5, 0x13, 0x30, 0x85, 0x1e, 0x48, 0xb6, 0x9e, 0xd0, 0x36, 0xf5, 0xb1, 0xa6, 0x02, 0x1b, + 0xc7, 0x8e, 0xe3, 0x3b, 0x21, 0xe5, 0xd5, 0xdc, 0xed, 0x36, 0x43, 0xb7, 0xd3, 0xa4, 0x0f, 0x8a, + 0xc6, 0x95, 0xd7, 0x61, 0xd2, 0xf2, 0xba, 0xa1, 0xdb, 0xde, 0x95, 0x2f, 0xf9, 0x93, 0xd3, 0x30, + 0xb5, 0xb1, 0x52, 0xba, 0x5b, 0x5e, 0xba, 0xbd, 0xb1, 0xba, 0x51, 0xb3, 0xef, 0x96, 0xd6, 0x17, + 0x16, 0x8b, 0xa7, 0x58, 0x83, 0xef, 0xae, 0xd6, 0xd6, 0x6d, 0xab, 0xba, 0x50, 0x5d, 0x59, 0x2f, + 0x1a, 0x57, 0x7e, 0xc6, 0x80, 0x09, 0x66, 0x89, 0xa0, 0x2f, 0x6b, 0x03, 0x65, 0xe4, 0x22, 0x5c, + 0xd8, 0xa8, 0x55, 0x2d, 0x7b, 0x7d, 0xf5, 0x4e, 0x75, 0xc5, 0xde, 0xa8, 0x95, 0x6e, 0x27, 0x67, + 0xf9, 0x1c, 0x3c, 0xa5, 0x60, 0x58, 0xd5, 0x85, 0xd5, 0xcd, 0xaa, 0x65, 0xaf, 0x95, 0x6a, 0xb5, + 0xad, 0x55, 0xab, 0x52, 0x34, 0x98, 0x8a, 0x48, 0x41, 0xb8, 0x7b, 0xab, 0x54, 0xcc, 0xf4, 0x94, + 0xad, 0x54, 0xb7, 0x4a, 0xcb, 0x76, 0x79, 0x75, 0xbd, 0x98, 0xbd, 0xf2, 0x0e, 0x14, 0xc4, 0xc7, + 0xe3, 0xbb, 0xd5, 0x3c, 0xe4, 0x56, 0x56, 0x57, 0xaa, 0x7c, 0x5a, 0xaf, 0x55, 0x57, 0x2a, 0x4b, + 0x2b, 0xb7, 0xf9, 0xb0, 0x96, 0xd6, 0xd6, 0xac, 0xd5, 0x4d, 0x36, 0xb1, 0xd9, 0xd8, 0x55, 0xaa, + 0x2b, 0xac, 0x65, 0xd9, 0x2b, 0x26, 0x4c, 0xf5, 0x3c, 0x70, 0xcd, 0x46, 0xab, 0xfa, 0xd9, 0xf5, + 0xea, 0x4a, 0x6d, 0x69, 0x75, 0xa5, 0x78, 0xea, 0xca, 0x85, 0x04, 0x8e, 0xfc, 0x12, 0xb5, 0xda, + 0x62, 0xf1, 0xd4, 0x95, 0xcf, 0x43, 0x41, 0xdd, 0x4c, 0x93, 0xb3, 0x30, 0xad, 0xfe, 0x5e, 0xa3, + 0xed, 0x86, 0xdb, 0xde, 0x2d, 0x9e, 0x4a, 0x16, 0x58, 0xdd, 0x76, 0x9b, 0x15, 0x60, 0xe7, 0xd5, + 0x82, 0x75, 0xea, 0xb7, 0xdc, 0x36, 0x9b, 0x28, 0xc5, 0xcc, 0x95, 0xab, 0x30, 0xae, 0xc9, 0x3d, + 0xab, 0x77, 0x79, 0x55, 0x48, 0xc0, 0xdd, 0x6a, 0x65, 0x69, 0xe3, 0x6e, 0x71, 0x88, 0x75, 0x7b, + 0x71, 0xe9, 0xf6, 0x62, 0x11, 0xae, 0x7c, 0x3e, 0xf9, 0x64, 0x3b, 0x23, 0x58, 0xbd, 0x75, 0x4b, + 0x28, 0xba, 0x6a, 0x0d, 0xfb, 0x64, 0x90, 0x0b, 0x30, 0x2b, 0x7e, 0xd8, 0xa5, 0x95, 0x8a, 0xbd, + 0x58, 0xb2, 0x2a, 0x5b, 0x25, 0xab, 0x6a, 0xdf, 0xa9, 0xbe, 0x5f, 0xcc, 0x30, 0x5d, 0xa9, 0x42, + 0xec, 0xf5, 0xd5, 0x8d, 0x85, 0xc5, 0x62, 0xb6, 0xfc, 0xd6, 0x77, 0xfe, 0xe4, 0x99, 0x53, 0xdf, + 0xf9, 0xde, 0x33, 0xc6, 0x1f, 0x7f, 0xef, 0x19, 0xe3, 0xbf, 0x7e, 0xef, 0x19, 0xe3, 0x87, 0x5f, + 0x3e, 0x41, 0xf8, 0xc9, 0xf6, 0x30, 0xea, 0x8c, 0x1b, 0xff, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x92, + 0xba, 0xc4, 0xea, 0xaa, 0xeb, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -15779,6 +15834,11 @@ func (m *AuthPreferenceSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.RequireMFAType != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.RequireMFAType)) + i-- + dAtA[i] = 0x60 + } if m.AllowPasswordless != nil { { size := m.AllowPasswordless.Size() @@ -17500,6 +17560,13 @@ func (m *RoleOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.RequireMFAType != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.RequireMFAType)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb8 + } if m.SSHFileCopy != nil { { size := m.SSHFileCopy.Size() @@ -26742,6 +26809,9 @@ func (m *AuthPreferenceSpecV2) Size() (n int) { l = m.AllowPasswordless.Size() n += 1 + l + sovTypes(uint64(l)) } + if m.RequireMFAType != 0 { + n += 1 + sovTypes(uint64(m.RequireMFAType)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -27541,6 +27611,9 @@ func (m *RoleOptions) Size() (n int) { l = m.SSHFileCopy.Size() n += 2 + l + sovTypes(uint64(l)) } + if m.RequireMFAType != 0 { + n += 2 + sovTypes(uint64(m.RequireMFAType)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -43266,6 +43339,25 @@ func (m *AuthPreferenceSpecV2) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequireMFAType", wireType) + } + m.RequireMFAType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RequireMFAType |= RequireMFAType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -48869,6 +48961,25 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 23: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequireMFAType", wireType) + } + m.RequireMFAType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RequireMFAType |= RequireMFAType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/templates/resources.teleport.dev_roles.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/templates/resources.teleport.dev_roles.yaml index ca7aac302fb6d..73d54bd1b6c27 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/templates/resources.teleport.dev_roles.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/templates/resources.teleport.dev_roles.yaml @@ -859,8 +859,14 @@ spec: users what they aught to type: string require_session_mfa: - description: RequireSessionMFA specifies whether a user is required - to do an MFA check for every session. + description: RequireMFAType is the type of MFA requirement enforced + for this user. + format: int32 + type: integer + ssh_file_copy: + description: SSHFileCopy indicates whether remote file operations + via SCP or SFTP are allowed over an SSH session. It defaults + to true unless explicitly set to false. type: boolean type: object type: object diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 236a02025fb98..21c731abd65b2 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -3192,10 +3192,12 @@ func (a *Server) isMFARequired(ctx context.Context, checker services.AccessCheck return nil, trace.Wrap(err) } - if pref.GetRequireSessionMFA() { - // Cluster always requires MFA, regardless of roles. + if params := checker.MFAParams(pref.GetRequireMFAType()); params.AlwaysRequired { return &proto.IsMFARequiredResponse{Required: true}, nil + } else if params.NeverRequired { + return &proto.IsMFARequiredResponse{Required: false}, nil } + var noMFAAccessErr, notFoundErr error switch t := req.Target.(type) { case *proto.IsMFARequiredRequest_Node: diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 327f8b4c2d2e2..e6544ee132334 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -3771,15 +3771,15 @@ func (a *ServerWithRoles) SignDatabaseCSR(ctx context.Context, req *proto.Databa // // This certificate can be requested by: // -// - Cluster administrator using "tctl auth sign --format=db" command locally -// on the auth server to produce a certificate for configuring a self-hosted -// database. -// - Remote user using "tctl auth sign --format=db" command with a remote -// proxy (e.g. Teleport Cloud), as long as they can impersonate system -// role Db. -// - Database service when initiating connection to a database instance to -// produce a client certificate. -// - Proxy service when generating mTLS files to a database +// - Cluster administrator using "tctl auth sign --format=db" command locally +// on the auth server to produce a certificate for configuring a self-hosted +// database. +// - Remote user using "tctl auth sign --format=db" command with a remote +// proxy (e.g. Teleport Cloud), as long as they can impersonate system +// role Db. +// - Database service when initiating connection to a database instance to +// produce a client certificate. +// - Proxy service when generating mTLS files to a database func (a *ServerWithRoles) GenerateDatabaseCert(ctx context.Context, req *proto.DatabaseCertRequest) (*proto.DatabaseCertResponse, error) { // Check if the User can `create` DatabaseCertificates err := a.action(apidefaults.Namespace, types.KindDatabaseCertificate, types.VerbCreate) @@ -4172,17 +4172,8 @@ func (a *ServerWithRoles) UpsertKubeService(ctx context.Context, s types.Server) if err != nil { return trace.Wrap(err) } - _, isService := a.context.Identity.(BuiltinRole) - isMFAVerified := a.context.Identity.GetIdentity().MFAVerified != "" - mfaParams := services.AccessMFAParams{ - // MFA requirement only applies to users. - // - // Builtin services (like proxy_service and kube_service) are not gated - // on MFA and only need to pass the RBAC action check above. - Verified: isService || isMFAVerified, - AlwaysRequired: ap.GetRequireSessionMFA(), - } + mfaParams := a.context.MFAParams(ap.GetRequireMFAType()) for _, kube := range s.GetKubernetesClusters() { k8sV3, err := types.NewKubernetesClusterV3FromLegacyCluster(s.GetNamespace(), kube) if err != nil { diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 6af8e0b0fd30a..cd04f2fc5bee8 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -2361,7 +2361,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { req *proto.IsMFARequiredRequest }{ { - name: "RequireSessionMFA enabled MySQL protocol doesn't match database name", + name: "RequireSessionMFA on MySQL protocol doesn't match database name", dbProtocol: libdefaults.ProtocolMySQL, req: &proto.IsMFARequiredRequest{ Target: &proto.IsMFARequiredRequest_Database{ @@ -2375,7 +2375,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { }, modifyRoleFunc: func(role types.Role) { roleOpt := role.GetOptions() - roleOpt.RequireSessionMFA = true + roleOpt.RequireMFAType = types.RequireMFAType_SESSION role.SetOptions(roleOpt) role.SetDatabaseUsers(types.Allow, []string{types.Wildcard}) @@ -2385,7 +2385,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { checkMFA: require.True, }, { - name: "RequireSessionMFA disabled", + name: "RequireSessionMFA off", dbProtocol: libdefaults.ProtocolMySQL, req: &proto.IsMFARequiredRequest{ Target: &proto.IsMFARequiredRequest_Database{ @@ -2399,7 +2399,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { }, modifyRoleFunc: func(role types.Role) { roleOpt := role.GetOptions() - roleOpt.RequireSessionMFA = false + roleOpt.RequireMFAType = types.RequireMFAType_OFF role.SetOptions(roleOpt) role.SetDatabaseUsers(types.Allow, []string{types.Wildcard}) @@ -2409,7 +2409,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { checkMFA: require.False, }, { - name: "RequireSessionMFA enabled Postgres protocol database name doesn't match", + name: "RequireSessionMFA on Postgres protocol database name doesn't match", dbProtocol: libdefaults.ProtocolPostgres, req: &proto.IsMFARequiredRequest{ Target: &proto.IsMFARequiredRequest_Database{ @@ -2423,7 +2423,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { }, modifyRoleFunc: func(role types.Role) { roleOpt := role.GetOptions() - roleOpt.RequireSessionMFA = true + roleOpt.RequireMFAType = types.RequireMFAType_SESSION role.SetOptions(roleOpt) role.SetDatabaseUsers(types.Allow, []string{types.Wildcard}) @@ -2433,7 +2433,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { checkMFA: require.False, }, { - name: "RequireSessionMFA enabled Postgres protocol database name matches", + name: "RequireSessionMFA on Postgres protocol database name matches", dbProtocol: libdefaults.ProtocolPostgres, req: &proto.IsMFARequiredRequest{ Target: &proto.IsMFARequiredRequest_Database{ @@ -2447,7 +2447,7 @@ func TestIsMFARequiredMFADB(t *testing.T) { }, modifyRoleFunc: func(role types.Role) { roleOpt := role.GetOptions() - roleOpt.RequireSessionMFA = true + roleOpt.RequireMFAType = types.RequireMFAType_SESSION role.SetOptions(roleOpt) role.SetDatabaseUsers(types.Allow, []string{types.Wildcard}) diff --git a/lib/auth/grpcserver_test.go b/lib/auth/grpcserver_test.go index 2a484cd8fb4a7..42f2cac3e5a2a 100644 --- a/lib/auth/grpcserver_test.go +++ b/lib/auth/grpcserver_test.go @@ -802,7 +802,7 @@ func TestGenerateUserSingleUseCert(t *testing.T) { require.NoError(t, err) // Make sure MFA is required for this user. roleOpt := role.GetOptions() - roleOpt.RequireSessionMFA = true + roleOpt.RequireMFAType = types.RequireMFAType_SESSION role.SetOptions(roleOpt) err = srv.Auth().UpsertRole(ctx, role) require.NoError(t, err) @@ -1023,18 +1023,6 @@ func TestIsMFARequired(t *testing.T) { ctx := context.Background() srv := newTestTLSServer(t) - // Enable MFA support. - authPref, err := types.NewAuthPreference(types.AuthPreferenceSpecV2{ - Type: constants.Local, - SecondFactor: constants.SecondFactorOptional, - Webauthn: &types.Webauthn{ - RPID: "teleport", - }, - }) - require.NoError(t, err) - err = srv.Auth().SetAuthPreference(ctx, authPref) - require.NoError(t, err) - // Register an SSH node. node := &types.ServerV2{ Kind: types.KindKubeService, @@ -1046,33 +1034,62 @@ func TestIsMFARequired(t *testing.T) { Hostname: "node-a", }, } - _, err = srv.Auth().UpsertNode(ctx, node) + _, err := srv.Auth().UpsertNode(ctx, node) require.NoError(t, err) // Create a fake user. user, role, err := CreateUserAndRole(srv.Auth(), "no-mfa-user", []string{"no-mfa-user"}) require.NoError(t, err) - for _, required := range []bool{true, false} { - t.Run(fmt.Sprintf("required=%v", required), func(t *testing.T) { - roleOpt := role.GetOptions() - roleOpt.RequireSessionMFA = required - role.SetOptions(roleOpt) - err = srv.Auth().UpsertRole(ctx, role) - require.NoError(t, err) + for _, authPrefRequireMFAType := range []types.RequireMFAType{ + types.RequireMFAType_OFF, + types.RequireMFAType_SESSION, + types.RequireMFAType_SESSION_AND_HARDWARE_KEY, + types.RequireMFAType_HARDWARE_KEY_TOUCH, + } { + authPref, err := types.NewAuthPreference(types.AuthPreferenceSpecV2{ + Type: constants.Local, + SecondFactor: constants.SecondFactorOptional, + RequireMFAType: authPrefRequireMFAType, + Webauthn: &types.Webauthn{ + RPID: "teleport", + }, + }) + require.NoError(t, err) + err = srv.Auth().SetAuthPreference(ctx, authPref) + require.NoError(t, err) - cl, err := srv.NewClient(TestUser(user.GetName())) - require.NoError(t, err) + for _, roleRequireMFAType := range []types.RequireMFAType{ + types.RequireMFAType_OFF, + types.RequireMFAType_SESSION, + types.RequireMFAType_SESSION_AND_HARDWARE_KEY, + types.RequireMFAType_HARDWARE_KEY_TOUCH, + } { + // If role or auth pref have "hardware_key_touch", expect not required. + expectRequired := !(roleRequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH || authPrefRequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH) + // Otherwise, if auth pref or role require session MFA, expect required. + expectRequired = expectRequired && (roleRequireMFAType.IsSessionMFARequired() || authPrefRequireMFAType.IsSessionMFARequired()) + + t.Run(fmt.Sprintf("authPref=%v/role=%v/expect=%v", authPrefRequireMFAType, roleRequireMFAType, expectRequired), func(t *testing.T) { + roleOpt := role.GetOptions() + roleOpt.RequireMFAType = roleRequireMFAType + role.SetOptions(roleOpt) + err = srv.Auth().UpsertRole(ctx, role) + require.NoError(t, err) - resp, err := cl.IsMFARequired(ctx, &proto.IsMFARequiredRequest{ - Target: &proto.IsMFARequiredRequest_Node{Node: &proto.NodeLogin{ - Login: user.GetName(), - Node: "node-a", - }}, + cl, err := srv.NewClient(TestUser(user.GetName())) + require.NoError(t, err) + + resp, err := cl.IsMFARequired(ctx, &proto.IsMFARequiredRequest{ + Target: &proto.IsMFARequiredRequest_Node{Node: &proto.NodeLogin{ + Login: user.GetName(), + Node: "node-a", + }}, + }) + require.NoError(t, err) + require.Equal(t, expectRequired, resp.Required) }) - require.NoError(t, err) - require.Equal(t, resp.Required, required) - }) + } } } @@ -1131,7 +1148,7 @@ func TestIsMFARequiredUnauthorized(t *testing.T) { // Require MFA. roleOpt := role.GetOptions() - roleOpt.RequireSessionMFA = true + roleOpt.RequireMFAType = types.RequireMFAType_SESSION role.SetOptions(roleOpt) role.SetNodeLabels(types.Allow, map[string]apiutils.Strings{"a": []string{"c"}}) err = srv.Auth().UpsertRole(ctx, role) diff --git a/lib/auth/permissions.go b/lib/auth/permissions.go index 76e341f44f3d3..ff8d9bdd8c346 100644 --- a/lib/auth/permissions.go +++ b/lib/auth/permissions.go @@ -169,6 +169,17 @@ func (c *Context) UseSearchAsRoles(access services.RoleGetter, clusterName strin return nil } +// MFAParams returns MFA params for the given auth context and auth preference MFA requirement. +func (c *Context) MFAParams(authPrefMFARequirement types.RequireMFAType) services.AccessMFAParams { + params := c.Checker.MFAParams(authPrefMFARequirement) + + // Builtin services (like proxy_service and kube_service) are not gated + // on MFA and only need to pass normal RBAC action checks. + _, isService := c.Identity.(BuiltinRole) + params.Verified = isService || c.Identity.GetIdentity().MFAVerified != "" + return params +} + // Authorize authorizes user based on identity supplied via context func (a *authorizer) Authorize(ctx context.Context) (*Context, error) { if ctx == nil { diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index 20c26df1847a5..88ac3c9aced08 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -866,13 +866,13 @@ func (t StaticToken) Parse() ([]types.ProvisionTokenV1, error) { // AuthenticationConfig describes the auth_service/authentication section of teleport.yaml type AuthenticationConfig struct { - Type string `yaml:"type"` - SecondFactor constants.SecondFactorType `yaml:"second_factor,omitempty"` - ConnectorName string `yaml:"connector_name,omitempty"` - U2F *UniversalSecondFactor `yaml:"u2f,omitempty"` - Webauthn *Webauthn `yaml:"webauthn,omitempty"` - RequireSessionMFA bool `yaml:"require_session_mfa,omitempty"` - LockingMode constants.LockingMode `yaml:"locking_mode,omitempty"` + Type string `yaml:"type"` + SecondFactor constants.SecondFactorType `yaml:"second_factor,omitempty"` + ConnectorName string `yaml:"connector_name,omitempty"` + U2F *UniversalSecondFactor `yaml:"u2f,omitempty"` + Webauthn *Webauthn `yaml:"webauthn,omitempty"` + RequireMFAType types.RequireMFAType `yaml:"require_session_mfa,omitempty"` + LockingMode constants.LockingMode `yaml:"locking_mode,omitempty"` // LocalAuth controls if local authentication is allowed. LocalAuth *types.BoolOption `yaml:"local_auth"` @@ -910,7 +910,7 @@ func (a *AuthenticationConfig) Parse() (types.AuthPreference, error) { ConnectorName: a.ConnectorName, U2F: u, Webauthn: w, - RequireSessionMFA: a.RequireSessionMFA, + RequireMFAType: a.RequireMFAType, LockingMode: a.LockingMode, AllowLocalAuth: a.LocalAuth, AllowPasswordless: a.Passwordless, diff --git a/lib/config/fileconf_test.go b/lib/config/fileconf_test.go index 6dadf8de15186..b53b9a970aa8e 100644 --- a/lib/config/fileconf_test.go +++ b/lib/config/fileconf_test.go @@ -24,15 +24,16 @@ import ( "time" "github.com/google/go-cmp/cmp" + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" + "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/installers" apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/sshutils/x11" - "github.com/gravitational/trace" - "github.com/stretchr/testify/require" - "gopkg.in/yaml.v2" ) // minimalConfigFile is a minimal subset of a teleport config file that can be @@ -478,6 +479,94 @@ func TestAuthenticationConfig_Parse_nilU2F(t *testing.T) { require.NoError(t, webErr, "unexpected webauthn error") } +func TestAuthenticationConfig_RequireSessionMFA(t *testing.T) { + t.Parallel() + + tests := []struct { + desc string + mutate func(cfgMap) + expectError bool + expectRequireMFAType types.RequireMFAType + }{ + { + desc: "RequireSessionMFA invalid", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{ + "require_session_mfa": "unknown", + } + }, + expectError: true, + }, { + desc: "RequireSessionMFA empty", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{} + }, + expectRequireMFAType: types.RequireMFAType_OFF, + }, { + desc: "RequireSessionMFA true", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{ + "require_session_mfa": true, + } + }, + expectRequireMFAType: types.RequireMFAType_SESSION, + }, { + desc: "RequireSessionMFA false", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{ + "require_session_mfa": false, + } + }, + expectRequireMFAType: types.RequireMFAType_OFF, + }, { + desc: "RequireSessionMFA true string", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{ + "require_session_mfa": "yes", + } + }, + expectRequireMFAType: types.RequireMFAType_SESSION, + }, { + desc: "RequireSessionMFA false string", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{ + "require_session_mfa": "off", + } + }, + expectRequireMFAType: types.RequireMFAType_OFF, + }, { + desc: "RequireSessionMFA hardware_key", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{ + "require_session_mfa": types.RequireMFATypeHardwareKeyString, + } + }, + expectRequireMFAType: types.RequireMFAType_SESSION_AND_HARDWARE_KEY, + }, { + desc: "RequireSessionMFA hardware_key", + mutate: func(cfg cfgMap) { + cfg["auth_service"].(cfgMap)["authentication"] = cfgMap{ + "require_session_mfa": types.RequireMFATypeHardwareKeyTouchString, + } + }, + expectRequireMFAType: types.RequireMFAType_HARDWARE_KEY_TOUCH, + }, + } + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + text := bytes.NewBuffer(editConfig(t, tt.mutate)) + cfg, err := ReadConfig(text) + if tt.expectError { + require.Error(t, err) + return + } + + require.NoError(t, err) + require.Empty(t, cmp.Diff(cfg.Auth.Authentication.RequireMFAType, tt.expectRequireMFAType)) + }) + } +} + // TestSSHSection tests the config parser for the SSH config block func TestSSHSection(t *testing.T) { t.Parallel() diff --git a/lib/kube/proxy/forwarder.go b/lib/kube/proxy/forwarder.go index 4c8a7eb27c235..aef5857777d09 100644 --- a/lib/kube/proxy/forwarder.go +++ b/lib/kube/proxy/forwarder.go @@ -766,10 +766,9 @@ func (f *Forwarder) authorize(ctx context.Context, actx *authContext) error { if err != nil { return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: actx.Identity.GetIdentity().MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } + + mfaParams := actx.MFAParams(ap.GetRequireMFAType()) + // Check authz against the first match. // // We assume that users won't register two identically-named clusters with diff --git a/lib/services/access_checker.go b/lib/services/access_checker.go index fc8320e765400..877fe8b080034 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -19,13 +19,14 @@ package services import ( "time" + "github.com/gravitational/trace" + log "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh" + "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/wrappers" "github.com/gravitational/teleport/lib/tlsca" - "github.com/gravitational/trace" - log "github.com/sirupsen/logrus" - "golang.org/x/crypto/ssh" ) // AccessChecker interface checks access to resources based on roles, traits, @@ -177,6 +178,10 @@ type AccessChecker interface { // PinSourceIP forces the same client IP for certificate generation and SSH usage PinSourceIP() bool + + // MFAParams returns MFA params for the given use given their roles, the cluster + // auth preference, and whether mfa has been verified. + MFAParams(authPrefMFARequirement types.RequireMFAType) AccessMFAParams } // AccessInfo hold information about an identity necessary to check whether that @@ -210,13 +215,13 @@ type accessChecker struct { // NewAccessChecker returns a new AccessChecker which can be used to check // access to resources. // Args: -// - `info *AccessInfo` should hold the roles, traits, and allowed resource IDs -// for the identity. -// - `localCluster string` should be the name of the local cluster in which -// access will be checked. You cannot check for access to resources in remote -// clusters. -// - `access RoleGetter` should be a RoleGetter which will be used to fetch the -// full RoleSet +// - `info *AccessInfo` should hold the roles, traits, and allowed resource IDs +// for the identity. +// - `localCluster string` should be the name of the local cluster in which +// access will be checked. You cannot check for access to resources in remote +// clusters. +// - `access RoleGetter` should be a RoleGetter which will be used to fetch the +// full RoleSet func NewAccessChecker(info *AccessInfo, localCluster string, access RoleGetter) (AccessChecker, error) { roleSet, err := FetchRoles(info.Roles, access, info.Traits) if err != nil { diff --git a/lib/services/role.go b/lib/services/role.go index b862b5fa29a31..3d54163dea82f 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -414,15 +414,16 @@ func applyValueTraitsSlice(inputs []string, traits map[string][]string, fieldNam // and traits from identity provider. For example: // // cluster_labels: -// env: ['{{external.groups}}'] +// +// env: ['{{external.groups}}'] // // and groups: ['admins', 'devs'] // // will be interpolated to: // // cluster_labels: -// env: ['admins', 'devs'] // +// env: ['admins', 'devs'] func applyLabelsTraits(inLabels types.Labels, traits map[string][]string) types.Labels { outLabels := make(types.Labels, len(inLabels)) // every key will be mapped to the first value @@ -558,7 +559,6 @@ func MakeRuleSet(rules []types.Rule) RuleSet { // Specifying order solves the problem on having multiple rules, e.g. one wildcard // rule can override more specific rules with 'where' sections that can have // 'actions' lists with side effects that will not be triggered otherwise. -// func (set RuleSet) Match(whereParser predicate.Parser, actionsParser predicate.Parser, resource string, verb string) (bool, error) { // empty set matches nothing if len(set) == 0 { @@ -1095,6 +1095,50 @@ func (set RoleSet) PinSourceIP() bool { return false } +// MFAParams returns MFA params for the given user given their roles, the cluster +// auth preference, and whether mfa has been verified. +func (set RoleSet) MFAParams(authPrefRequirement types.RequireMFAType) (params AccessMFAParams) { + if authPrefRequirement == types.RequireMFAType_HARDWARE_KEY_TOUCH { + // per-session MFA is overridden by hardware key PIV touch requirement. + return AccessMFAParams{ + NeverRequired: true, + } + } + + if authPrefRequirement.IsSessionMFARequired() { + params.AlwaysRequired = true + } else { + params.NeverRequired = true + } + + if len(set) > 0 { + // Assume mfa is always/never required, and then switch + // always/never required to false depending on what we find. + var roleAlwaysRequired, roleNeverRequired = true, true + for _, role := range set { + if role.GetOptions().RequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH { + // per-session MFA is overridden by hardware key PIV touch requirement. + return AccessMFAParams{ + NeverRequired: true, + } + } + + if role.GetOptions().RequireMFAType.IsSessionMFARequired() { + roleNeverRequired = false + } else { + roleAlwaysRequired = false + } + } + + // The cluster auth preference or all roles do require per-session MFA. + params.AlwaysRequired = params.AlwaysRequired || roleAlwaysRequired + // Neither the cluster nor roles ever require per-session MFA. + params.NeverRequired = params.NeverRequired && roleNeverRequired + } + + return params +} + // AdjustSessionTTL will reduce the requested ttl to the lowest max allowed TTL // for this role set, otherwise it returns ttl unchanged func (set RoleSet) AdjustSessionTTL(ttl time.Duration) time.Duration { @@ -2034,12 +2078,12 @@ func (set RoleSet) checkAccess(r AccessCheckable, mfa AccessMFAParams, matchers } // if we've reached this point, namespace, labels, and matchers all match. - // if MFA is verified, we're done. - if mfa.Verified { + // if MFA is verified or never required, we're done. + if mfa.Verified || mfa.NeverRequired { return nil } // if MFA is not verified and we require session MFA, deny access - if role.GetOptions().RequireSessionMFA { + if role.GetOptions().RequireMFAType.IsSessionMFARequired() { debugf("Access to %v %q denied, role %q requires per-session MFA", r.GetKind(), r.GetName(), role.GetName()) return ErrSessionMFARequired @@ -2515,6 +2559,11 @@ type AccessMFAParams struct { // AlwaysRequired is set when MFA is required for all sessions, regardless // of per-role options. AlwaysRequired bool + // NeverRequired is set when MFA is never required for any sessions, regardless + // of per-role options. This means either both the cluster auth preference and + // all roles have per-session MFA off, or at least one of those resources has + // "require_session_mfa: hardware_key_touch", which overrides per-session MFA. + NeverRequired bool // Verified is set when MFA has been verified by the caller. Verified bool } diff --git a/lib/services/role_test.go b/lib/services/role_test.go index 79de5511ac767..03cfc23fce7ba 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -682,8 +682,8 @@ func TestLabelCompatibility(t *testing.T) { require.Equal(t, map[string]string{"key": "val"}, out) } -func newRole(mut func(*types.RoleV5)) types.RoleV5 { - r := types.RoleV5{ +func newRole(mut func(*types.RoleV5)) *types.RoleV5 { + r := &types.RoleV5{ Metadata: types.Metadata{ Name: "name", Namespace: apidefaults.Namespace, @@ -699,7 +699,7 @@ func newRole(mut func(*types.RoleV5)) types.RoleV5 { }, }, } - mut(&r) + mut(r) return r } @@ -741,14 +741,15 @@ func TestCheckAccessToServer(t *testing.T) { }, } testCases := []struct { - name string - roles []types.RoleV5 - checks []check - mfaParams AccessMFAParams + name string + roles []*types.RoleV5 + checks []check + authPrefMFARequireType types.RequireMFAType + mfaVerified bool }{ { name: "empty role set has access to nothing", - roles: []types.RoleV5{}, + roles: []*types.RoleV5{}, checks: []check{ {server: serverNoLabels, login: "root", hasAccess: false}, {server: serverWorker, login: "root", hasAccess: false}, @@ -757,7 +758,7 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "role is limited to default namespace", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"admin"} r.Spec.Allow.Namespaces = []string{apidefaults.Namespace} @@ -774,7 +775,7 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "role is limited to labels in default namespace", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"admin"} r.Spec.Allow.NodeLabels = types.Labels{"role": []string{"worker"}} @@ -791,7 +792,7 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "role matches any label out of multiple labels", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"admin"} r.Spec.Allow.NodeLabels = types.Labels{"role": []string{"worker2", "worker"}} @@ -808,7 +809,7 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "node_labels with empty list value matches nothing", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"admin"} r.Spec.Allow.NodeLabels = types.Labels{"role": []string{}} @@ -825,7 +826,7 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "one role is more permissive than another", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"admin"} r.Spec.Allow.Namespaces = []string{apidefaults.Namespace} @@ -846,7 +847,7 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "one role needs to access servers sharing the partially same label value", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"admin"} r.Spec.Allow.NodeLabels = types.Labels{"role": []string{"^db(.*)$"}, "status": []string{"follow*"}} @@ -866,7 +867,7 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "no logins means no access", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = nil }), @@ -882,18 +883,17 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "one role requires MFA but MFA was not verified", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"root"} r.Spec.Allow.NodeLabels = types.Labels{"role": []string{"worker"}} - r.Spec.Options.RequireSessionMFA = true + r.Spec.Options.RequireMFAType = types.RequireMFAType_SESSION }), newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"root"} - r.Spec.Options.RequireSessionMFA = false + r.Spec.Options.RequireMFAType = types.RequireMFAType_OFF }), }, - mfaParams: AccessMFAParams{Verified: false}, checks: []check{ {server: serverNoLabels, login: "root", hasAccess: true}, {server: serverWorker, login: "root", hasAccess: false}, @@ -902,18 +902,18 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "one role requires MFA and MFA was verified", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"root"} r.Spec.Allow.NodeLabels = types.Labels{"role": []string{"worker"}} - r.Spec.Options.RequireSessionMFA = true + r.Spec.Options.RequireMFAType = types.RequireMFAType_SESSION }), newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"root"} - r.Spec.Options.RequireSessionMFA = false + r.Spec.Options.RequireMFAType = types.RequireMFAType_OFF }), }, - mfaParams: AccessMFAParams{Verified: true}, + mfaVerified: true, checks: []check{ {server: serverNoLabels, login: "root", hasAccess: true}, {server: serverWorker, login: "root", hasAccess: true}, @@ -922,12 +922,12 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "cluster requires MFA but MFA was not verified", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"root"} }), }, - mfaParams: AccessMFAParams{Verified: false, AlwaysRequired: true}, + authPrefMFARequireType: types.RequireMFAType_SESSION, checks: []check{ {server: serverNoLabels, login: "root", hasAccess: false}, {server: serverWorker, login: "root", hasAccess: false}, @@ -936,12 +936,13 @@ func TestCheckAccessToServer(t *testing.T) { }, { name: "cluster requires MFA and MFA was verified", - roles: []types.RoleV5{ + roles: []*types.RoleV5{ newRole(func(r *types.RoleV5) { r.Spec.Allow.Logins = []string{"root"} }), }, - mfaParams: AccessMFAParams{Verified: true, AlwaysRequired: true}, + authPrefMFARequireType: types.RequireMFAType_SESSION, + mfaVerified: true, checks: []check{ {server: serverNoLabels, login: "root", hasAccess: true}, {server: serverWorker, login: "root", hasAccess: true}, @@ -953,13 +954,15 @@ func TestCheckAccessToServer(t *testing.T) { t.Run(tc.name, func(t *testing.T) { var set RoleSet for i := range tc.roles { - set = append(set, &tc.roles[i]) + set = append(set, tc.roles[i]) } for j, check := range tc.checks { comment := fmt.Sprintf("check %v: user: %v, server: %v, should access: %v", j, check.login, check.server.GetName(), check.hasAccess) + mfaParams := set.MFAParams(tc.authPrefMFARequireType) + mfaParams.Verified = tc.mfaVerified err := set.checkAccess( check.server, - tc.mfaParams, + mfaParams, NewLoginMatcher(check.login)) if check.hasAccess { require.NoError(t, err, comment) @@ -2573,7 +2576,7 @@ func TestCheckAccessToDatabase(t *testing.T) { Version: types.V3, Spec: types.RoleSpecV5{ Options: types.RoleOptions{ - RequireSessionMFA: true, + RequireMFAType: types.RequireMFAType_SESSION, }, Allow: types.RoleConditions{ Namespaces: []string{apidefaults.Namespace}, @@ -3543,7 +3546,7 @@ func TestCheckAccessToKubernetes(t *testing.T) { }, Spec: types.RoleSpecV5{ Options: types.RoleOptions{ - RequireSessionMFA: true, + RequireMFAType: types.RequireMFAType_SESSION, }, Allow: types.RoleConditions{ Namespaces: []string{apidefaults.Namespace}, @@ -3687,24 +3690,24 @@ func TestCheckAccessToKubernetes(t *testing.T) { func TestDesktopRecordingEnabled(t *testing.T) { for _, test := range []struct { desc string - roles []types.RoleV5 + roleSet RoleSet shouldRecord bool }{ { desc: "single role recording disabled", - roles: []types.RoleV5{ + roleSet: NewRoleSet( newRole(func(r *types.RoleV5) { r.SetName("no-record") r.SetOptions(types.RoleOptions{ RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(false)}, }) }), - }, + ), shouldRecord: false, }, { desc: "multiple roles, one requires recording", - roles: []types.RoleV5{ + roleSet: NewRoleSet( newRole(func(r *types.RoleV5) { r.SetOptions(types.RoleOptions{ RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(false)}, @@ -3717,17 +3720,12 @@ func TestDesktopRecordingEnabled(t *testing.T) { }), // recording defaults to true, so a default role should force recording newRole(func(r *types.RoleV5) {}), - }, + ), shouldRecord: true, }, } { t.Run(test.desc, func(t *testing.T) { - var roles []types.Role - for _, r := range test.roles { - roles = append(roles, &r) - } - rs := NewRoleSet(roles...) - require.Equal(t, test.shouldRecord, rs.RecordDesktopSession()) + require.Equal(t, test.shouldRecord, test.roleSet.RecordDesktopSession()) }) } } @@ -3735,45 +3733,42 @@ func TestDesktopRecordingEnabled(t *testing.T) { func TestDesktopClipboard(t *testing.T) { for _, test := range []struct { desc string - roles []types.RoleV5 + roleSet RoleSet hasClipboard bool }{ { - desc: "single role, unspecified, defaults true", - roles: []types.RoleV5{newRole(func(r *types.RoleV5) {})}, + desc: "single role, unspecified, defaults true", + roleSet: NewRoleSet( + newRole(func(r *types.RoleV5) {}), + ), hasClipboard: true, }, { desc: "single role, explicitly disabled", - roles: []types.RoleV5{ + roleSet: NewRoleSet( newRole(func(r *types.RoleV5) { r.SetOptions(types.RoleOptions{ DesktopClipboard: types.NewBoolOption(false), }) }), - }, + ), hasClipboard: false, }, { desc: "multiple conflicting roles, disable wins", - roles: []types.RoleV5{ + roleSet: NewRoleSet( newRole(func(r *types.RoleV5) {}), newRole(func(r *types.RoleV5) { r.SetOptions(types.RoleOptions{ DesktopClipboard: types.NewBoolOption(false), }) }), - }, + ), hasClipboard: false, }, } { t.Run(test.desc, func(t *testing.T) { - var roles []types.Role - for i := range test.roles { - roles = append(roles, &test.roles[i]) - } - rs := NewRoleSet(roles...) - require.Equal(t, test.hasClipboard, rs.DesktopClipboard()) + require.Equal(t, test.hasClipboard, test.roleSet.DesktopClipboard()) }) } } @@ -3781,28 +3776,30 @@ func TestDesktopClipboard(t *testing.T) { func TestDesktopDirectorySharing(t *testing.T) { for _, test := range []struct { desc string - roles []types.RoleV5 + roleSet RoleSet hasDirectorySharing bool }{ { - desc: "single role, unspecified, defaults true", - roles: []types.RoleV5{newRole(func(r *types.RoleV5) {})}, + desc: "single role, unspecified, defaults true", + roleSet: NewRoleSet( + newRole(func(r *types.RoleV5) {}), + ), hasDirectorySharing: true, }, { desc: "single role, explicitly disabled", - roles: []types.RoleV5{ + roleSet: NewRoleSet( newRole(func(r *types.RoleV5) { r.SetOptions(types.RoleOptions{ DesktopDirectorySharing: types.NewBoolOption(false), }) }), - }, + ), hasDirectorySharing: false, }, { desc: "multiple conflicting roles, disable wins", - roles: []types.RoleV5{ + roleSet: NewRoleSet( newRole(func(r *types.RoleV5) { r.SetOptions(types.RoleOptions{ DesktopDirectorySharing: types.NewBoolOption(false), @@ -3813,17 +3810,12 @@ func TestDesktopDirectorySharing(t *testing.T) { DesktopDirectorySharing: types.NewBoolOption(true), }) }), - }, + ), hasDirectorySharing: false, }, } { t.Run(test.desc, func(t *testing.T) { - roles := []types.Role{} - for i := range test.roles { - roles = append(roles, &test.roles[i]) - } - rs := NewRoleSet(roles...) - require.Equal(t, test.hasDirectorySharing, rs.DesktopDirectorySharing()) + require.Equal(t, test.hasDirectorySharing, test.roleSet.DesktopDirectorySharing()) }) } } @@ -3853,13 +3845,13 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { for _, test := range []struct { name string - roles []types.RoleV5 + roleSet RoleSet mfaParams AccessMFAParams checks []check }{ { - name: "no roles, no access", - roles: []types.RoleV5{}, + name: "no roles, no access", + roleSet: RoleSet{}, checks: []check{ {desktop: desktopNoLabels, login: "admin", hasAccess: false}, {desktop: desktop2012, login: "admin", hasAccess: false}, @@ -3867,7 +3859,7 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { }, { name: "empty label, no access", - roles: []types.RoleV5{ + roleSet: RoleSet{ newRole(func(r *types.RoleV5) { r.Spec.Allow.WindowsDesktopLogins = []string{"admin"} r.Spec.Allow.WindowsDesktopLabels = types.Labels{"role": []string{}} @@ -3880,7 +3872,7 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { }, { name: "single role allows a single login", - roles: []types.RoleV5{ + roleSet: RoleSet{ newRole(func(r *types.RoleV5) { r.Spec.Allow.WindowsDesktopLogins = []string{"admin"} }), @@ -3894,7 +3886,7 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { }, { name: "single role with allowed labels", - roles: []types.RoleV5{ + roleSet: RoleSet{ newRole(func(r *types.RoleV5) { r.Spec.Allow.WindowsDesktopLogins = []string{"admin"} r.Spec.Allow.WindowsDesktopLabels = types.Labels{"win_version": []string{"2012"}} @@ -3907,7 +3899,7 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { }, { name: "single role with deny labels", - roles: []types.RoleV5{ + roleSet: RoleSet{ newRole(func(r *types.RoleV5) { r.Spec.Allow.WindowsDesktopLogins = []string{"admin"} r.Spec.Deny.Namespaces = []string{apidefaults.Namespace} @@ -3921,7 +3913,7 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { }, { name: "one role more permissive than another", - roles: []types.RoleV5{ + roleSet: RoleSet{ newRole(func(r *types.RoleV5) { r.Spec.Allow.WindowsDesktopLogins = []string{"admin"} r.Spec.Allow.NodeLabels = types.Labels{"win_version": []string{"2012"}} @@ -3939,15 +3931,10 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { }, } { t.Run(test.name, func(t *testing.T) { - var set RoleSet - for _, r := range test.roles { - set = append(set, &r) - } - for i, check := range test.checks { msg := fmt.Sprintf("check=%d, user=%v, server=%v, should_have_access=%v", i, check.login, check.desktop.GetName(), check.hasAccess) - err := set.checkAccess(check.desktop, test.mfaParams, NewWindowsLoginMatcher(check.login)) + err := test.roleSet.checkAccess(check.desktop, test.mfaParams, NewWindowsLoginMatcher(check.login)) if check.hasAccess { require.NoError(t, err, msg) } else { @@ -3964,22 +3951,21 @@ func TestCheckAccessToWindowsDesktop(t *testing.T) { // // To run benchmark: // -// go test -bench=. +// go test -bench=. // // To run benchmark and obtain CPU and memory profiling: // -// go test -bench=. -cpuprofile=cpu.prof -memprofile=mem.prof +// go test -bench=. -cpuprofile=cpu.prof -memprofile=mem.prof // // To use the command line tool to read the profile: // -// go tool pprof cpu.prof -// go tool pprof cpu.prof +// go tool pprof cpu.prof +// go tool pprof cpu.prof // // To generate a graph: // -// go tool pprof --pdf cpu.prof > cpu.pdf -// go tool pprof --pdf mem.prof > mem.pdf -// +// go tool pprof --pdf cpu.prof > cpu.pdf +// go tool pprof --pdf mem.prof > mem.pdf func BenchmarkCheckAccessToServer(b *testing.B) { servers := make([]*types.ServerV2, 0, 4000) @@ -4720,7 +4706,6 @@ func TestHostUsers_HostSudoers(t *testing.T) { test: "test exact match, one sudoer entry, one role", sudoers: []string{"%sudo ALL=(ALL) ALL"}, roles: NewRoleSet(&types.RoleV5{ - Spec: types.RoleSpecV5{ Options: types.RoleOptions{ CreateHostUser: types.NewBoolOption(true), @@ -5031,8 +5016,8 @@ func TestFetchAllClusterRoles_PrefersRolesAndTraitsFromCurrentUser(t *testing.T) currentUserRoleGetter := mockCurrentUserRoleGetter{ nameToRole: map[string]types.Role{ - "dev": &devRole, - "admin": &adminRole, + "dev": devRole, + "admin": adminRole, }, currentUser: user, } @@ -5045,8 +5030,8 @@ func TestFetchAllClusterRoles_PrefersRolesAndTraitsFromCurrentUser(t *testing.T) // After sort: "admin","default-implicit-role","dev" sort.Sort(SortedRoles(roleSet)) require.Len(t, roleSet, 3) - require.Contains(t, roleSet, &devRole, "devRole not found in roleSet") - require.Contains(t, roleSet, &adminRole, "adminRole not found in roleSet") + require.Contains(t, roleSet, devRole, "devRole not found in roleSet") + require.Contains(t, roleSet, adminRole, "adminRole not found in roleSet") require.Equal(t, []string{"currentUserTraitLogin"}, roleSet[2].GetLogins(types.Allow)) } @@ -5067,8 +5052,8 @@ func TestFetchAllClusterRoles_UsesDefaultRolesAndTraitsIfCurrentUserIsUnavailabl currentUserRoleGetter := mockCurrentUserRoleGetter{ getCurrentUserError: trace.NotImplemented("GetCurrentUser not implemented on server"), nameToRole: map[string]types.Role{ - "access": &accessRole, - "editor": &editorRole, + "access": accessRole, + "editor": editorRole, }, } @@ -5080,7 +5065,119 @@ func TestFetchAllClusterRoles_UsesDefaultRolesAndTraitsIfCurrentUserIsUnavailabl // After sort: "access","default-implicit-role","editor" sort.Sort(SortedRoles(roleSet)) require.Len(t, roleSet, 3) - require.Contains(t, roleSet, &accessRole, "accessRole not found in roleSet") - require.Contains(t, roleSet, &editorRole, "editorRole not found in roleSet") + require.Contains(t, roleSet, accessRole, "accessRole not found in roleSet") + require.Contains(t, roleSet, editorRole, "editorRole not found in roleSet") require.Equal(t, []string{"defaultTraitLogin"}, roleSet[0].GetLogins(types.Allow)) } + +func TestMFAParams(t *testing.T) { + testCases := []struct { + name string + roleMFARequireTypes []types.RequireMFAType + authPrefMFARequireType types.RequireMFAType + expectMFAParams AccessMFAParams + }{ + { + name: "empty role set and auth pref requirement", + expectMFAParams: AccessMFAParams{ + NeverRequired: true, + }}, + { + name: "no roles require mfa, auth pref doesn't require mfa", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_OFF, + types.RequireMFAType_OFF, + }, + authPrefMFARequireType: types.RequireMFAType_OFF, + expectMFAParams: AccessMFAParams{ + NeverRequired: true, + }, + }, + { + name: "no roles require mfa, auth pref requires mfa", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_OFF, + types.RequireMFAType_OFF, + }, + authPrefMFARequireType: types.RequireMFAType_SESSION, + expectMFAParams: AccessMFAParams{ + AlwaysRequired: true, + }, + }, + { + name: "some roles require mfa, auth pref doesn't require mfa", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_OFF, + types.RequireMFAType_SESSION, + }, + authPrefMFARequireType: types.RequireMFAType_OFF, + expectMFAParams: AccessMFAParams{}, + }, + { + name: "some roles require mfa, auth pref requires mfa", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_OFF, + types.RequireMFAType_SESSION, + }, + authPrefMFARequireType: types.RequireMFAType_SESSION, + expectMFAParams: AccessMFAParams{ + AlwaysRequired: true, + }, + }, + { + name: "all roles require mfa, auth pref requires mfa", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_SESSION, + types.RequireMFAType_SESSION, + }, + authPrefMFARequireType: types.RequireMFAType_SESSION, + expectMFAParams: AccessMFAParams{ + AlwaysRequired: true, + }, + }, + { + name: "all roles require mfa, auth pref doesn't require mfa", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_SESSION, + types.RequireMFAType_SESSION, + }, + authPrefMFARequireType: types.RequireMFAType_OFF, + expectMFAParams: AccessMFAParams{ + AlwaysRequired: true, + }, + }, + { + name: "auth pref requires hardware key touch", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_SESSION, + types.RequireMFAType_SESSION, + }, + authPrefMFARequireType: types.RequireMFAType_HARDWARE_KEY_TOUCH, + expectMFAParams: AccessMFAParams{ + NeverRequired: true, + }, + }, + { + name: "role requires hardware key touch", + roleMFARequireTypes: []types.RequireMFAType{ + types.RequireMFAType_SESSION, + types.RequireMFAType_HARDWARE_KEY_TOUCH, + }, + authPrefMFARequireType: types.RequireMFAType_SESSION, + expectMFAParams: AccessMFAParams{ + NeverRequired: true, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + var set RoleSet + for _, roleRequirement := range tc.roleMFARequireTypes { + set = append(set, newRole(func(r *types.RoleV5) { + r.Spec.Options.RequireMFAType = roleRequirement + })) + } + require.Equal(t, tc.expectMFAParams, set.MFAParams(tc.authPrefMFARequireType)) + }) + } +} diff --git a/lib/srv/app/server.go b/lib/srv/app/server.go index 037402824b01d..89397e3e67b22 100644 --- a/lib/srv/app/server.go +++ b/lib/srv/app/server.go @@ -768,10 +768,6 @@ func (s *Server) authorizeContext(ctx context.Context) (*tlsca.Identity, types.A if err != nil { return nil, nil, trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } // When accessing AWS management console, check permissions to assume // requested IAM role as well. @@ -782,6 +778,7 @@ func (s *Server) authorizeContext(ctx context.Context) (*tlsca.Identity, types.A }) } + mfaParams := authContext.MFAParams(ap.GetRequireMFAType()) err = authContext.Checker.CheckAccess( app, mfaParams, diff --git a/lib/srv/authhandlers.go b/lib/srv/authhandlers.go index 5da7a1c319485..459e43fa1784d 100644 --- a/lib/srv/authhandlers.go +++ b/lib/srv/authhandlers.go @@ -542,11 +542,8 @@ func (h *AuthHandlers) canLoginWithRBAC(cert *ssh.Certificate, clusterName strin if err != nil { return trace.Wrap(err) } - _, mfaVerified := cert.Extensions[teleport.CertExtensionMFAVerified] - mfaParams := services.AccessMFAParams{ - Verified: mfaVerified, - AlwaysRequired: ap.GetRequireSessionMFA(), - } + mfaParams := accessChecker.MFAParams(ap.GetRequireMFAType()) + _, mfaParams.Verified = cert.Extensions[teleport.CertExtensionMFAVerified] // check if roles allow access to server if err := accessChecker.CheckAccess( diff --git a/lib/srv/db/common/session.go b/lib/srv/db/common/session.go index 8f214471865b7..7e89e424fa2bf 100644 --- a/lib/srv/db/common/session.go +++ b/lib/srv/db/common/session.go @@ -57,3 +57,10 @@ func (c *Session) String() string { return fmt.Sprintf("db[%v] identity[%v] dbUser[%v] dbName[%v]", c.Database.GetName(), c.Identity.Username, c.DatabaseUser, c.DatabaseName) } + +// MFAParams returns MFA params for the given auth context and auth preference MFA requirement. +func (c *Session) MFAParams(authPrefMFARequirement types.RequireMFAType) services.AccessMFAParams { + params := c.Checker.MFAParams(authPrefMFARequirement) + params.Verified = c.Identity.MFAVerified != "" + return params +} diff --git a/lib/srv/db/elasticsearch/engine.go b/lib/srv/db/elasticsearch/engine.go index 7adb4afa187bf..da7778dd1bad9 100644 --- a/lib/srv/db/elasticsearch/engine.go +++ b/lib/srv/db/elasticsearch/engine.go @@ -32,7 +32,6 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/lib/defaults" - "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv/db/common" "github.com/gravitational/teleport/lib/srv/db/common/role" "github.com/gravitational/teleport/lib/utils" @@ -191,11 +190,8 @@ func (e *Engine) authorizeConnection(ctx context.Context) error { if err != nil { return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: e.sessionCtx.Identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } + mfaParams := e.sessionCtx.MFAParams(ap.GetRequireMFAType()) dbRoleMatchers := role.DatabaseRoleMatchers( e.sessionCtx.Database.GetProtocol(), e.sessionCtx.DatabaseUser, diff --git a/lib/srv/db/mongodb/engine.go b/lib/srv/db/mongodb/engine.go index cfeeebde7cf59..d2bcd3994dbd1 100644 --- a/lib/srv/db/mongodb/engine.go +++ b/lib/srv/db/mongodb/engine.go @@ -102,14 +102,14 @@ func (e *Engine) HandleConnection(ctx context.Context, sessionCtx *common.Sessio // handleClientMessage implements the client message's roundtrip which can go // down a few different ways: -// 1. If the client's command is not allowed by user's role, we do not pass it -// to the server and return an error to the client. -// 2. In the most common case, we send client message to the server, read its -// reply and send it back to the client. -// 3. Some client commands do not receive a reply in which case we just return -// after sending message to the server and wait for next client message. -// 4. Server can also send multiple messages in a row in which case we exhaust -// them before returning to listen for next client message. +// 1. If the client's command is not allowed by user's role, we do not pass it +// to the server and return an error to the client. +// 2. In the most common case, we send client message to the server, read its +// reply and send it back to the client. +// 3. Some client commands do not receive a reply in which case we just return +// after sending message to the server and wait for next client message. +// 4. Server can also send multiple messages in a row in which case we exhaust +// them before returning to listen for next client message. func (e *Engine) handleClientMessage(ctx context.Context, sessionCtx *common.Session, clientMessage protocol.Message, clientConn net.Conn, serverConn driver.Connection) error { e.Log.Debugf("===> %v", clientMessage) // First check the client command against user's role and log in the audit. @@ -159,10 +159,8 @@ func (e *Engine) authorizeConnection(ctx context.Context, sessionCtx *common.Ses if err != nil { return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: sessionCtx.Identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } + + mfaParams := sessionCtx.MFAParams(ap.GetRequireMFAType()) // Only the username is checked upon initial connection. MongoDB sends // database name with each protocol message (for query, update, etc.) // so it is checked when we receive a message from client. diff --git a/lib/srv/db/mysql/engine.go b/lib/srv/db/mysql/engine.go index 0ee3f36d01daa..a699d39fd25d8 100644 --- a/lib/srv/db/mysql/engine.go +++ b/lib/srv/db/mysql/engine.go @@ -154,10 +154,8 @@ func (e *Engine) checkAccess(ctx context.Context, sessionCtx *common.Session) er if err != nil { return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: sessionCtx.Identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } + + mfaParams := sessionCtx.MFAParams(ap.GetRequireMFAType()) dbRoleMatchers := role.DatabaseRoleMatchers( defaults.ProtocolMySQL, sessionCtx.DatabaseUser, diff --git a/lib/srv/db/postgres/engine.go b/lib/srv/db/postgres/engine.go index 44d63f644ea0c..2ad9b98576ad7 100644 --- a/lib/srv/db/postgres/engine.go +++ b/lib/srv/db/postgres/engine.go @@ -24,7 +24,6 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/defaults" - "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv/db/cloud" "github.com/gravitational/teleport/lib/srv/db/common" "github.com/gravitational/teleport/lib/srv/db/common/role" @@ -191,11 +190,8 @@ func (e *Engine) checkAccess(ctx context.Context, sessionCtx *common.Session) er if err != nil { return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: sessionCtx.Identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } + mfaParams := sessionCtx.MFAParams(ap.GetRequireMFAType()) dbRoleMatchers := role.DatabaseRoleMatchers( sessionCtx.Database.GetProtocol(), sessionCtx.DatabaseUser, diff --git a/lib/srv/db/redis/engine.go b/lib/srv/db/redis/engine.go index 25f02e352c2ab..51d79d17c4cc3 100644 --- a/lib/srv/db/redis/engine.go +++ b/lib/srv/db/redis/engine.go @@ -29,7 +29,6 @@ import ( apiutils "github.com/gravitational/teleport/api/utils" apiawsutils "github.com/gravitational/teleport/api/utils/aws" "github.com/gravitational/teleport/lib/defaults" - "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv/db/common" "github.com/gravitational/teleport/lib/srv/db/common/role" "github.com/gravitational/teleport/lib/srv/db/redis/protocol" @@ -88,11 +87,8 @@ func (e *Engine) authorizeConnection(ctx context.Context) error { if err != nil { return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: e.sessionCtx.Identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } + mfaParams := e.sessionCtx.MFAParams(ap.GetRequireMFAType()) dbRoleMatchers := role.DatabaseRoleMatchers( e.sessionCtx.Database.GetProtocol(), e.sessionCtx.DatabaseUser, diff --git a/lib/srv/db/snowflake/engine.go b/lib/srv/db/snowflake/engine.go index 1611c0c92216a..2c42f39b568e3 100644 --- a/lib/srv/db/snowflake/engine.go +++ b/lib/srv/db/snowflake/engine.go @@ -34,14 +34,14 @@ import ( "strings" "time" + "github.com/gravitational/trace" + "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/defaults" - "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv/db/common" "github.com/gravitational/teleport/lib/srv/db/common/role" "github.com/gravitational/teleport/lib/utils" - "github.com/gravitational/trace" ) func init() { @@ -349,11 +349,7 @@ func (e *Engine) authorizeConnection(ctx context.Context) error { if err != nil { return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: e.sessionCtx.Identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } - + mfaParams := e.sessionCtx.MFAParams(ap.GetRequireMFAType()) dbRoleMatchers := role.DatabaseRoleMatchers( e.sessionCtx.Database.GetProtocol(), e.sessionCtx.DatabaseUser, diff --git a/lib/srv/db/sqlserver/engine.go b/lib/srv/db/sqlserver/engine.go index 35293fc3f96f1..23332009b570d 100644 --- a/lib/srv/db/sqlserver/engine.go +++ b/lib/srv/db/sqlserver/engine.go @@ -198,11 +198,7 @@ func (e *Engine) checkAccess(ctx context.Context, sessionCtx *common.Session) er return trace.Wrap(err) } - mfaParams := services.AccessMFAParams{ - Verified: sessionCtx.Identity.MFAVerified != "", - AlwaysRequired: ap.GetRequireSessionMFA(), - } - + mfaParams := sessionCtx.MFAParams(ap.GetRequireMFAType()) err = sessionCtx.Checker.CheckAccess(sessionCtx.Database, mfaParams, &services.DatabaseUserMatcher{ User: sessionCtx.DatabaseUser, diff --git a/lib/srv/db/sqlserver/engine_test.go b/lib/srv/db/sqlserver/engine_test.go index cf5e0a9672f7c..90ebb3d5e6559 100644 --- a/lib/srv/db/sqlserver/engine_test.go +++ b/lib/srv/db/sqlserver/engine_test.go @@ -218,7 +218,7 @@ func (m *mockAuth) GetAuthPreference(ctx context.Context) (types.AuthPreference, Webauthn: &types.Webauthn{ RPID: "localhost", }, - RequireSessionMFA: true, + RequireMFAType: types.RequireMFAType_SESSION, }) } @@ -230,6 +230,13 @@ func (m *mockChecker) CheckAccess(r services.AccessCheckable, mfa services.Acces return nil } +func (m *mockChecker) MFAParams(authPrefMFARequirement types.RequireMFAType) services.AccessMFAParams { + return services.AccessMFAParams{ + AlwaysRequired: authPrefMFARequirement.IsSessionMFARequired(), + NeverRequired: !authPrefMFARequirement.IsSessionMFARequired(), + } +} + type mockConnector struct { conn io.ReadWriteCloser } diff --git a/lib/srv/desktop/windows_server.go b/lib/srv/desktop/windows_server.go index 99939d8aab0fe..585bfdca1a6fb 100644 --- a/lib/srv/desktop/windows_server.go +++ b/lib/srv/desktop/windows_server.go @@ -789,10 +789,7 @@ func (s *WindowsService) connectRDP(ctx context.Context, log logrus.FieldLogger, var windowsUser string authorize := func(login string) error { windowsUser = login // capture attempted login user - mfaParams := services.AccessMFAParams{ - Verified: identity.MFAVerified != "", - AlwaysRequired: authPref.GetRequireSessionMFA(), - } + mfaParams := authCtx.MFAParams(authPref.GetRequireMFAType()) return authCtx.Checker.CheckAccess( desktop, mfaParams, @@ -1094,18 +1091,21 @@ func (s *WindowsService) updateCA(ctx context.Context) error { // private key archival. // // This function is equivalent to running: -// certutil –dspublish –f NTAuthCA +// +// certutil –dspublish –f NTAuthCA // // You can confirm the cert is present by running: -// certutil -viewstore "ldap:///CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=example,DC=com>?caCertificate" +// +// certutil -viewstore "ldap:///CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=example,DC=com>?caCertificate" // // Once the CA is published to LDAP, it should eventually sync and be present in the // machine's enterprise NTAuth store. You can check that with: -// certutil -viewstore -enterprise NTAuth +// +// certutil -viewstore -enterprise NTAuth // // You can expedite the synchronization by running: -// certutil -pulse // +// certutil -pulse func (s *WindowsService) updateCAInNTAuthStore(ctx context.Context, caDER []byte) error { // Check if our CA is already in the store. The LDAP entry for NTAuth store // is constant and it should always exist. diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index 0587a489882f2..d78921a82184d 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -1277,7 +1277,7 @@ func TestTerminalRequireSessionMfa(t *testing.T) { Webauthn: &types.Webauthn{ RPID: "localhost", }, - RequireSessionMFA: true, + RequireMFAType: types.RequireMFAType_SESSION, }) require.NoError(t, err) @@ -1427,7 +1427,7 @@ func TestDesktopAccessMFARequiresMfa(t *testing.T) { Webauthn: &types.Webauthn{ RPID: "localhost", }, - RequireSessionMFA: true, + RequireMFAType: types.RequireMFAType_SESSION, }, mfaHandler: handleMFAWebauthnChallenge, registerDevice: func(t *testing.T, ctx context.Context, clt *auth.Client) *auth.TestDevice { @@ -3602,8 +3602,8 @@ func TestWebSessionsRenewAllowsOldBearerTokenToLinger(t *testing.T) { } // TestChangeUserAuthentication_recoveryCodesReturnedForCloud tests for following: -// - Recovery codes are not returned for usernames that are not emails -// - Recovery codes are returned for usernames that are valid emails +// - Recovery codes are not returned for usernames that are not emails +// - Recovery codes are returned for usernames that are valid emails func TestChangeUserAuthentication_recoveryCodesReturnedForCloud(t *testing.T) { env := newWebPack(t, 1) ctx := context.Background() diff --git a/operator/config/crd/bases/resources.teleport.dev_roles.yaml b/operator/config/crd/bases/resources.teleport.dev_roles.yaml index 85eda67533002..03af7c13d015d 100644 --- a/operator/config/crd/bases/resources.teleport.dev_roles.yaml +++ b/operator/config/crd/bases/resources.teleport.dev_roles.yaml @@ -859,8 +859,14 @@ spec: users what they aught to type: string require_session_mfa: - description: RequireSessionMFA specifies whether a user is required - to do an MFA check for every session. + description: RequireMFAType is the type of MFA requirement enforced + for this user. + format: int32 + type: integer + ssh_file_copy: + description: SSHFileCopy indicates whether remote file operations + via SCP or SFTP are allowed over an SSH session. It defaults + to true unless explicitly set to false. type: boolean type: object type: object diff --git a/operator/crdgen/schemagen.go b/operator/crdgen/schemagen.go index 7a2408fd7d98d..c36b7b616e3ab 100644 --- a/operator/crdgen/schemagen.go +++ b/operator/crdgen/schemagen.go @@ -199,7 +199,7 @@ func (generator *SchemaGenerator) singularProp(field *Field, prop *apiextv1.JSON case field.IsTime(): prop.Type = "string" prop.Format = "date-time" - case field.IsInt32() || field.IsUint32(): + case field.IsInt32() || field.IsUint32() || field.desc.IsEnum(): prop.Type = "integer" prop.Format = "int32" case field.IsInt64() || field.IsUint64(): From 7aea43598e193ef872e6811c41613c3c4e93d5cc Mon Sep 17 00:00:00 2001 From: joerger Date: Wed, 21 Sep 2022 11:57:27 -0700 Subject: [PATCH 2/3] Resolve comments. --- api/client/client_test.go | 88 ++++++++++++++----------- api/types/authentication.go | 17 ----- lib/auth/auth.go | 5 +- lib/auth/grpcserver_test.go | 21 +++--- lib/services/role.go | 99 ++++++++++++++++++----------- lib/services/role_test.go | 37 ++++++----- lib/srv/db/sqlserver/engine_test.go | 8 ++- 7 files changed, 149 insertions(+), 126 deletions(-) diff --git a/api/client/client_test.go b/api/client/client_test.go index 99646059bb4eb..e118ff2252a35 100644 --- a/api/client/client_test.go +++ b/api/client/client_test.go @@ -861,35 +861,43 @@ func TestSetRoleRequireSessionMFABackwardsCompatibility(t *testing.T) { }, } - // UpsertRole should set "RequireSessionMFA" on the provided role if "RequireMFAType" is set - role.Spec.Options.RequireMFAType = types.RequireMFAType_SESSION - role.Spec.Options.RequireSessionMFA = false - err = clt.UpsertRole(ctx, role) - require.NoError(t, err) - require.True(t, role.GetOptions().RequireSessionMFA) + t.Run("UpsertRole", func(t *testing.T) { + // UpsertRole should set "RequireSessionMFA" on the provided role if "RequireMFAType" is set + role.Spec.Options.RequireMFAType = types.RequireMFAType_SESSION + role.Spec.Options.RequireSessionMFA = false + err = clt.UpsertRole(ctx, role) + require.NoError(t, err) + require.True(t, role.GetOptions().RequireSessionMFA) + }) - // GetRole should set "RequireMFAType" on the received role if empty - role.Spec.Options.RequireMFAType = 0 - role.Spec.Options.RequireSessionMFA = true - roleResp, err := clt.GetRole(ctx, role.GetName()) - require.NoError(t, err) - require.Equal(t, types.RequireMFAType_SESSION, roleResp.GetOptions().RequireMFAType) + t.Run("GetRole", func(t *testing.T) { + // GetRole should set "RequireMFAType" on the received role if empty + role.Spec.Options.RequireMFAType = 0 + role.Spec.Options.RequireSessionMFA = true + roleResp, err := clt.GetRole(ctx, role.GetName()) + require.NoError(t, err) + require.Equal(t, types.RequireMFAType_SESSION, roleResp.GetOptions().RequireMFAType) + }) - // GetRoles should set "RequireMFAType" on the received roles if empty - role.Spec.Options.RequireMFAType = 0 - role.Spec.Options.RequireSessionMFA = true - rolesResp, err := clt.GetRoles(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(rolesResp)) - require.Equal(t, types.RequireMFAType_SESSION, rolesResp[0].GetOptions().RequireMFAType) + t.Run("GetRoles", func(t *testing.T) { + // GetRoles should set "RequireMFAType" on the received roles if empty + role.Spec.Options.RequireMFAType = 0 + role.Spec.Options.RequireSessionMFA = true + rolesResp, err := clt.GetRoles(ctx) + require.NoError(t, err) + require.Len(t, rolesResp, 1) + require.Equal(t, types.RequireMFAType_SESSION, rolesResp[0].GetOptions().RequireMFAType) + }) - // GetCurrentUserRoles should set "RequireMFAType" on the received roles if empty - role.Spec.Options.RequireMFAType = 0 - role.Spec.Options.RequireSessionMFA = true - rolesResp, err = clt.GetCurrentUserRoles(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(rolesResp)) - require.Equal(t, types.RequireMFAType_SESSION, rolesResp[0].GetOptions().RequireMFAType) + t.Run("GetCurrentUserRoles", func(t *testing.T) { + // GetCurrentUserRoles should set "RequireMFAType" on the received roles if empty + role.Spec.Options.RequireMFAType = 0 + role.Spec.Options.RequireSessionMFA = true + rolesResp, err := clt.GetCurrentUserRoles(ctx) + require.NoError(t, err) + require.Len(t, rolesResp, 1) + require.Equal(t, types.RequireMFAType_SESSION, rolesResp[0].GetOptions().RequireMFAType) + }) } type mockAuthPreferenceServer struct { @@ -952,17 +960,21 @@ func TestSetAuthPreferenceRequireSessionMFABackwardsCompatibility(t *testing.T) }, } - // SetAuthPreference should set "RequireSessionMFA" on the provided auth pref if "RequireMFAType" is set - pref.Spec.RequireMFAType = types.RequireMFAType_SESSION - pref.Spec.RequireSessionMFA = false - err = clt.SetAuthPreference(ctx, pref) - require.NoError(t, err) - require.True(t, pref.Spec.RequireSessionMFA) + t.Run("SetAuthPreference", func(t *testing.T) { + // SetAuthPreference should set "RequireSessionMFA" on the provided auth pref if "RequireMFAType" is set + pref.Spec.RequireMFAType = types.RequireMFAType_SESSION + pref.Spec.RequireSessionMFA = false + err = clt.SetAuthPreference(ctx, pref) + require.NoError(t, err) + require.True(t, pref.Spec.RequireSessionMFA) + }) - // GetAuthPreference should set "RequireMFAType" on the received auth pref if empty - pref.Spec.RequireMFAType = 0 - pref.Spec.RequireSessionMFA = true - prefResp, err := clt.GetAuthPreference(ctx) - require.NoError(t, err) - require.Equal(t, types.RequireMFAType_SESSION, prefResp.GetRequireMFAType()) + t.Run("GetAuthPreference", func(t *testing.T) { + // GetAuthPreference should set "RequireMFAType" on the received auth pref if empty + pref.Spec.RequireMFAType = 0 + pref.Spec.RequireSessionMFA = true + prefResp, err := clt.GetAuthPreference(ctx) + require.NoError(t, err) + require.Equal(t, types.RequireMFAType_SESSION, prefResp.GetRequireMFAType()) + }) } diff --git a/api/types/authentication.go b/api/types/authentication.go index a26dddf9d1e27..a56da72cab6ed 100644 --- a/api/types/authentication.go +++ b/api/types/authentication.go @@ -715,23 +715,6 @@ func (d *MFADevice) UnmarshalJSON(buf []byte) error { return jsonpb.Unmarshal(bytes.NewReader(buf), d) } -// type RequireMFATypeString string - -// const ( -// // RequireMFAOff means MFA is *not* required to begin server sessions. -// RequireMFAOff RequireMFATypeString = "off" -// // RequireMFASession means MFA is required to begin server sessions. -// RequireMFASession RequireMFATypeString = "session_mfa" -// // RequireMFASessionAndHardwareKey means MFA is required to begin server sessions, -// // and login sessions must use a private key backed by a hardware key. -// RequireMFASessionAndHardwareKey RequireMFATypeString = "hardware_key" -// // RequireMFAHardwareKeyTouch means login sessions must use a hardware private key that -// // requires touch to be used. This touch requirement applies to all API requests -// // rather than only session requests. This touch is different from MFA, so to prevent -// // requiring double touch on session requests, normal Session MFA is disabled. -// RequireMFAHardwareKeyTouch RequireMFATypeString = "hardware_key_touch" -// ) - // IsSessionMFARequired returns whether this RequireMFAType requires per-session MFA. func (r RequireMFAType) IsSessionMFARequired() bool { return r == RequireMFAType_SESSION || r == RequireMFAType_SESSION_AND_HARDWARE_KEY diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 21c731abd65b2..96ed8d0f4abee 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -3192,9 +3192,10 @@ func (a *Server) isMFARequired(ctx context.Context, checker services.AccessCheck return nil, trace.Wrap(err) } - if params := checker.MFAParams(pref.GetRequireMFAType()); params.AlwaysRequired { + switch params := checker.MFAParams(pref.GetRequireMFAType()); params.Required { + case services.MFARequiredAlways: return &proto.IsMFARequiredResponse{Required: true}, nil - } else if params.NeverRequired { + case services.MFARequiredNever: return &proto.IsMFARequiredResponse{Required: false}, nil } diff --git a/lib/auth/grpcserver_test.go b/lib/auth/grpcserver_test.go index 42f2cac3e5a2a..0c2f2f4c48221 100644 --- a/lib/auth/grpcserver_test.go +++ b/lib/auth/grpcserver_test.go @@ -1019,6 +1019,13 @@ func testGenerateUserSingleUseCert(ctx context.Context, t *testing.T, cl *Client require.NoError(t, stream.CloseSend()) } +var requireMFATypes = []types.RequireMFAType{ + types.RequireMFAType_OFF, + types.RequireMFAType_SESSION, + types.RequireMFAType_SESSION_AND_HARDWARE_KEY, + types.RequireMFAType_HARDWARE_KEY_TOUCH, +} + func TestIsMFARequired(t *testing.T) { ctx := context.Background() srv := newTestTLSServer(t) @@ -1041,12 +1048,7 @@ func TestIsMFARequired(t *testing.T) { user, role, err := CreateUserAndRole(srv.Auth(), "no-mfa-user", []string{"no-mfa-user"}) require.NoError(t, err) - for _, authPrefRequireMFAType := range []types.RequireMFAType{ - types.RequireMFAType_OFF, - types.RequireMFAType_SESSION, - types.RequireMFAType_SESSION_AND_HARDWARE_KEY, - types.RequireMFAType_HARDWARE_KEY_TOUCH, - } { + for _, authPrefRequireMFAType := range requireMFATypes { authPref, err := types.NewAuthPreference(types.AuthPreferenceSpecV2{ Type: constants.Local, SecondFactor: constants.SecondFactorOptional, @@ -1059,12 +1061,7 @@ func TestIsMFARequired(t *testing.T) { err = srv.Auth().SetAuthPreference(ctx, authPref) require.NoError(t, err) - for _, roleRequireMFAType := range []types.RequireMFAType{ - types.RequireMFAType_OFF, - types.RequireMFAType_SESSION, - types.RequireMFAType_SESSION_AND_HARDWARE_KEY, - types.RequireMFAType_HARDWARE_KEY_TOUCH, - } { + for _, roleRequireMFAType := range requireMFATypes { // If role or auth pref have "hardware_key_touch", expect not required. expectRequired := !(roleRequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH || authPrefRequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH) // Otherwise, if auth pref or role require session MFA, expect required. diff --git a/lib/services/role.go b/lib/services/role.go index 3d54163dea82f..62ebf632ca285 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -1098,45 +1098,56 @@ func (set RoleSet) PinSourceIP() bool { // MFAParams returns MFA params for the given user given their roles, the cluster // auth preference, and whether mfa has been verified. func (set RoleSet) MFAParams(authPrefRequirement types.RequireMFAType) (params AccessMFAParams) { + // per-session MFA is overridden by hardware key PIV touch requirement. + // check if the auth pref or any roles have this option. if authPrefRequirement == types.RequireMFAType_HARDWARE_KEY_TOUCH { - // per-session MFA is overridden by hardware key PIV touch requirement. return AccessMFAParams{ - NeverRequired: true, + Required: MFARequiredNever, + } + } + for _, role := range set { + if role.GetOptions().RequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH { + return AccessMFAParams{ + Required: MFARequiredNever, + } } } + // MFA is always required according to the cluster auth pref. if authPrefRequirement.IsSessionMFARequired() { - params.AlwaysRequired = true - } else { - params.NeverRequired = true - } - - if len(set) > 0 { - // Assume mfa is always/never required, and then switch - // always/never required to false depending on what we find. - var roleAlwaysRequired, roleNeverRequired = true, true - for _, role := range set { - if role.GetOptions().RequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH { - // per-session MFA is overridden by hardware key PIV touch requirement. - return AccessMFAParams{ - NeverRequired: true, - } - } + return AccessMFAParams{ + Required: MFARequiredAlways, + } + } - if role.GetOptions().RequireMFAType.IsSessionMFARequired() { - roleNeverRequired = false - } else { - roleAlwaysRequired = false - } + // Auth pref doesn't require MFA and no roles to check. + if len(set) == 0 { + return AccessMFAParams{ + Required: MFARequiredNever, } + } - // The cluster auth preference or all roles do require per-session MFA. - params.AlwaysRequired = params.AlwaysRequired || roleAlwaysRequired - // Neither the cluster nor roles ever require per-session MFA. - params.NeverRequired = params.NeverRequired && roleNeverRequired + // If MFA requirement is the same across all roles, we can skip the per-role check. + // Set mfaRequired to the first role's requirement, then check if all other roles match. + rolesMFARequired := set[0].GetOptions().RequireMFAType.IsSessionMFARequired() + for _, role := range set[1:] { + if role.GetOptions().RequireMFAType.IsSessionMFARequired() != rolesMFARequired { + // This role differs from the MFA requirement of the other roles, return per-role. + return AccessMFAParams{ + Required: MFARequiredPerRole, + } + } } - return params + if rolesMFARequired { + return AccessMFAParams{ + Required: MFARequiredAlways, + } + } else { + return AccessMFAParams{ + Required: MFARequiredNever, + } + } } // AdjustSessionTTL will reduce the requested ttl to the lowest max allowed TTL @@ -1974,7 +1985,7 @@ func (set RoleSet) checkAccess(r AccessCheckable, mfa AccessMFAParams, matchers // by the backend) can slow down this function by 50x for large clusters! isDebugEnabled, debugf := rbacDebugLogger() - if mfa.AlwaysRequired && !mfa.Verified { + if mfa.Required == MFARequiredAlways && !mfa.Verified { debugf("Access to %v %q denied, cluster requires per-session MFA", r.GetKind(), r.GetName()) return ErrSessionMFARequired } @@ -2079,7 +2090,7 @@ func (set RoleSet) checkAccess(r AccessCheckable, mfa AccessMFAParams, matchers // if we've reached this point, namespace, labels, and matchers all match. // if MFA is verified or never required, we're done. - if mfa.Verified || mfa.NeverRequired { + if mfa.Verified || mfa.Required == MFARequiredNever { return nil } // if MFA is not verified and we require session MFA, deny access @@ -2556,18 +2567,30 @@ func (set RoleSet) GetSearchAsRoles() []string { // AccessMFAParams contains MFA-related parameters for methods that check access. type AccessMFAParams struct { - // AlwaysRequired is set when MFA is required for all sessions, regardless - // of per-role options. - AlwaysRequired bool - // NeverRequired is set when MFA is never required for any sessions, regardless - // of per-role options. This means either both the cluster auth preference and - // all roles have per-session MFA off, or at least one of those resources has - // "require_session_mfa: hardware_key_touch", which overrides per-session MFA. - NeverRequired bool + // Required determines whether a user's MFA requirement dynamically changes based on + // their active role (per-role), or is static across all roles (always/never). + Required MFARequired // Verified is set when MFA has been verified by the caller. Verified bool } +// MFARequired determines when MFA is required for a user to access a resource. +type MFARequired string + +const ( + // MFARequiredNever means that MFA is never required for any sessions started by this user. This either + // means both the cluster auth preference and all roles have per-session MFA off, or at least one of + // those resources has "require_session_mfa: hardware_key_touch", which overrides per-session MFA. + MFARequiredNever MFARequired = "never" + // MFARequiredAlways means that MFA is required for all sessions started by a user. This either + // means that the cluster auth preference requires per-session MFA, or all of the user's roles require + // per-session MFA + MFARequiredAlways MFARequired = "always" + // MFARequiredPerRole means that MFA requirement is based on which of the user's roles + // provides access to the session in question. + MFARequiredPerRole MFARequired = "per-role" +) + // SortedRoles sorts roles by name type SortedRoles []types.Role diff --git a/lib/services/role_test.go b/lib/services/role_test.go index 03cfc23fce7ba..b870f03f4d9cd 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -2667,13 +2667,13 @@ func TestCheckAccessToDatabase(t *testing.T) { { name: "cluster requires MFA, no MFA provided", roles: RoleSet{roleDevStage, roleDevProdWithMFA, roleDevProd}, - mfaParams: AccessMFAParams{Verified: false, AlwaysRequired: true}, + mfaParams: AccessMFAParams{Verified: false, Required: MFARequiredAlways}, access: []access{}, }, { name: "cluster requires MFA, MFA provided", roles: RoleSet{roleDevStage, roleDevProdWithMFA, roleDevProd}, - mfaParams: AccessMFAParams{Verified: true, AlwaysRequired: true}, + mfaParams: AccessMFAParams{Verified: true, Required: MFARequiredAlways}, access: []access{ {server: dbStage, dbName: "test", dbUser: "dev", access: true}, {server: dbProd, dbName: "test", dbUser: "dev", access: true}, @@ -3656,14 +3656,14 @@ func TestCheckAccessToKubernetes(t *testing.T) { name: "cluster requires MFA but MFA not verified", roles: []*types.RoleV5{matchingLabelsRole}, cluster: clusterWithLabels, - mfaParams: AccessMFAParams{Verified: false, AlwaysRequired: true}, + mfaParams: AccessMFAParams{Verified: false, Required: MFARequiredAlways}, hasAccess: false, }, { name: "role requires MFA and MFA verified", roles: []*types.RoleV5{matchingLabelsRole}, cluster: clusterWithLabels, - mfaParams: AccessMFAParams{Verified: true, AlwaysRequired: true}, + mfaParams: AccessMFAParams{Verified: true, Required: MFARequiredAlways}, hasAccess: true, }, } @@ -4703,7 +4703,7 @@ func TestHostUsers_HostSudoers(t *testing.T) { server types.Server }{ { - test: "test exact match, one sudoer entry, one role", + test: "test exact match, one sudoer entry, one role", sudoers: []string{"%sudo ALL=(ALL) ALL"}, roles: NewRoleSet(&types.RoleV5{ Spec: types.RoleSpecV5{ @@ -4711,7 +4711,7 @@ func TestHostUsers_HostSudoers(t *testing.T) { CreateHostUser: types.NewBoolOption(true), }, Allow: types.RoleConditions{ - NodeLabels: types.Labels{"success": []string{"abc"}}, + NodeLabels: types.Labels{"success": []string{"abc"}}, HostSudoers: []string{"%sudo ALL=(ALL) ALL"}, }, }, @@ -4775,7 +4775,7 @@ func TestHostUsers_HostSudoers(t *testing.T) { CreateHostUser: types.NewBoolOption(true), }, Allow: types.RoleConditions{ - NodeLabels: types.Labels{"success": []string{"abc"}}, + NodeLabels: types.Labels{"success": []string{"abc"}}, HostSudoers: []string{"%sudo ALL=(ALL) ALL"}, }, }, @@ -4799,7 +4799,7 @@ func TestHostUsers_HostSudoers(t *testing.T) { }, }, { - test: "line deny", + test: "line deny", sudoers: []string{"%sudo ALL=(ALL) ALL"}, roles: NewRoleSet(&types.RoleV5{ Spec: types.RoleSpecV5{ @@ -5080,7 +5080,7 @@ func TestMFAParams(t *testing.T) { { name: "empty role set and auth pref requirement", expectMFAParams: AccessMFAParams{ - NeverRequired: true, + Required: MFARequiredNever, }}, { name: "no roles require mfa, auth pref doesn't require mfa", @@ -5090,7 +5090,7 @@ func TestMFAParams(t *testing.T) { }, authPrefMFARequireType: types.RequireMFAType_OFF, expectMFAParams: AccessMFAParams{ - NeverRequired: true, + Required: MFARequiredNever, }, }, { @@ -5101,7 +5101,7 @@ func TestMFAParams(t *testing.T) { }, authPrefMFARequireType: types.RequireMFAType_SESSION, expectMFAParams: AccessMFAParams{ - AlwaysRequired: true, + Required: MFARequiredAlways, }, }, { @@ -5111,7 +5111,9 @@ func TestMFAParams(t *testing.T) { types.RequireMFAType_SESSION, }, authPrefMFARequireType: types.RequireMFAType_OFF, - expectMFAParams: AccessMFAParams{}, + expectMFAParams: AccessMFAParams{ + Required: MFARequiredPerRole, + }, }, { name: "some roles require mfa, auth pref requires mfa", @@ -5121,7 +5123,7 @@ func TestMFAParams(t *testing.T) { }, authPrefMFARequireType: types.RequireMFAType_SESSION, expectMFAParams: AccessMFAParams{ - AlwaysRequired: true, + Required: MFARequiredAlways, }, }, { @@ -5132,7 +5134,7 @@ func TestMFAParams(t *testing.T) { }, authPrefMFARequireType: types.RequireMFAType_SESSION, expectMFAParams: AccessMFAParams{ - AlwaysRequired: true, + Required: MFARequiredAlways, }, }, { @@ -5143,7 +5145,7 @@ func TestMFAParams(t *testing.T) { }, authPrefMFARequireType: types.RequireMFAType_OFF, expectMFAParams: AccessMFAParams{ - AlwaysRequired: true, + Required: MFARequiredAlways, }, }, { @@ -5154,7 +5156,7 @@ func TestMFAParams(t *testing.T) { }, authPrefMFARequireType: types.RequireMFAType_HARDWARE_KEY_TOUCH, expectMFAParams: AccessMFAParams{ - NeverRequired: true, + Required: MFARequiredNever, }, }, { @@ -5165,12 +5167,13 @@ func TestMFAParams(t *testing.T) { }, authPrefMFARequireType: types.RequireMFAType_SESSION, expectMFAParams: AccessMFAParams{ - NeverRequired: true, + Required: MFARequiredNever, }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { + t.Parallel() var set RoleSet for _, roleRequirement := range tc.roleMFARequireTypes { set = append(set, newRole(func(r *types.RoleV5) { diff --git a/lib/srv/db/sqlserver/engine_test.go b/lib/srv/db/sqlserver/engine_test.go index 90ebb3d5e6559..9e1329b3a3daa 100644 --- a/lib/srv/db/sqlserver/engine_test.go +++ b/lib/srv/db/sqlserver/engine_test.go @@ -231,9 +231,13 @@ func (m *mockChecker) CheckAccess(r services.AccessCheckable, mfa services.Acces } func (m *mockChecker) MFAParams(authPrefMFARequirement types.RequireMFAType) services.AccessMFAParams { + if authPrefMFARequirement.IsSessionMFARequired() { + return services.AccessMFAParams{ + Required: services.MFARequiredAlways, + } + } return services.AccessMFAParams{ - AlwaysRequired: authPrefMFARequirement.IsSessionMFARequired(), - NeverRequired: !authPrefMFARequirement.IsSessionMFARequired(), + Required: services.MFARequiredNever, } } From 36b02defeb0e663cd935ae99d91bf9446efb3364 Mon Sep 17 00:00:00 2001 From: joerger Date: Wed, 21 Sep 2022 12:18:16 -0700 Subject: [PATCH 3/3] Fix linting error. --- lib/services/role.go | 44 ++++++++++++++------------------------------ 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/lib/services/role.go b/lib/services/role.go index fa24d432f39c0..0ca6377d46ef2 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -1103,53 +1103,37 @@ func (set RoleSet) MFAParams(authPrefRequirement types.RequireMFAType) (params A // per-session MFA is overridden by hardware key PIV touch requirement. // check if the auth pref or any roles have this option. if authPrefRequirement == types.RequireMFAType_HARDWARE_KEY_TOUCH { - return AccessMFAParams{ - Required: MFARequiredNever, - } + return AccessMFAParams{Required: MFARequiredNever} } for _, role := range set { if role.GetOptions().RequireMFAType == types.RequireMFAType_HARDWARE_KEY_TOUCH { - return AccessMFAParams{ - Required: MFARequiredNever, - } + return AccessMFAParams{Required: MFARequiredNever} } } // MFA is always required according to the cluster auth pref. if authPrefRequirement.IsSessionMFARequired() { - return AccessMFAParams{ - Required: MFARequiredAlways, - } - } - - // Auth pref doesn't require MFA and no roles to check. - if len(set) == 0 { - return AccessMFAParams{ - Required: MFARequiredNever, - } + return AccessMFAParams{Required: MFARequiredAlways} } // If MFA requirement is the same across all roles, we can skip the per-role check. // Set mfaRequired to the first role's requirement, then check if all other roles match. - rolesMFARequired := set[0].GetOptions().RequireMFAType.IsSessionMFARequired() - for _, role := range set[1:] { - if role.GetOptions().RequireMFAType.IsSessionMFARequired() != rolesMFARequired { - // This role differs from the MFA requirement of the other roles, return per-role. - return AccessMFAParams{ - Required: MFARequiredPerRole, + if len(set) > 0 { + rolesMFARequired := set[0].GetOptions().RequireMFAType.IsSessionMFARequired() + for _, role := range set[1:] { + if role.GetOptions().RequireMFAType.IsSessionMFARequired() != rolesMFARequired { + // This role differs from the MFA requirement of the other roles, return per-role. + return AccessMFAParams{Required: MFARequiredPerRole} } } - } - if rolesMFARequired { - return AccessMFAParams{ - Required: MFARequiredAlways, - } - } else { - return AccessMFAParams{ - Required: MFARequiredNever, + if rolesMFARequired { + return AccessMFAParams{Required: MFARequiredAlways} } } + + // No roles to check or no roles require MFA. + return AccessMFAParams{Required: MFARequiredNever} } // AdjustSessionTTL will reduce the requested ttl to the lowest max allowed TTL