CRI: move apparmor annotations to container security context

This commit is contained in:
Pengfei Ni 2017-05-01 20:55:16 +08:00
parent 08606b530b
commit ac76766a92
10 changed files with 363 additions and 321 deletions

View File

@ -641,17 +641,7 @@ type PodSandboxConfig struct {
// and the CRI). Whenever possible, however, runtime authors SHOULD // and the CRI). Whenever possible, however, runtime authors SHOULD
// consider proposing new typed fields for any new features instead. // consider proposing new typed fields for any new features instead.
// //
// 1. AppArmor // 1. Seccomp
//
// key: container.apparmor.security.beta.kubernetes.io/<container_name>
// description: apparmor profile for a container in this pod.
// value:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
//
// 2. Seccomp
// //
// key: security.alpha.kubernetes.io/seccomp/pod // key: security.alpha.kubernetes.io/seccomp/pod
// description: the seccomp profile for the containers of an entire pod. // description: the seccomp profile for the containers of an entire pod.
@ -668,7 +658,7 @@ type PodSandboxConfig struct {
// local seccomp profile root. Note that profile root is set in // local seccomp profile root. Note that profile root is set in
// kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997. // kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997.
// //
// 3. Sysctls // 2. Sysctls
// //
// key: security.alpha.kubernetes.io/sysctls // key: security.alpha.kubernetes.io/sysctls
// description: list of safe sysctls which are set for the sandbox. // description: list of safe sysctls which are set for the sandbox.
@ -1350,6 +1340,12 @@ type LinuxContainerSecurityContext struct {
// List of groups applied to the first process run in the container, in // List of groups applied to the first process run in the container, in
// addition to the container's primary GID. // addition to the container's primary GID.
SupplementalGroups []int64 `protobuf:"varint,8,rep,packed,name=supplemental_groups,json=supplementalGroups" json:"supplemental_groups,omitempty"` SupplementalGroups []int64 `protobuf:"varint,8,rep,packed,name=supplemental_groups,json=supplementalGroups" json:"supplemental_groups,omitempty"`
// AppArmor profile for the container, candidate values are:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
ApparmorProfile string `protobuf:"bytes,9,opt,name=apparmor_profile,json=apparmorProfile,proto3" json:"apparmor_profile,omitempty"`
} }
func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} } func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} }
@ -1414,6 +1410,13 @@ func (m *LinuxContainerSecurityContext) GetSupplementalGroups() []int64 {
return nil return nil
} }
func (m *LinuxContainerSecurityContext) GetApparmorProfile() string {
if m != nil {
return m.ApparmorProfile
}
return ""
}
// LinuxContainerConfig contains platform-specific configuration for // LinuxContainerConfig contains platform-specific configuration for
// Linux-based containers. // Linux-based containers.
type LinuxContainerConfig struct { type LinuxContainerConfig struct {
@ -5214,6 +5217,12 @@ func (m *LinuxContainerSecurityContext) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintApi(dAtA, i, uint64(j24)) i = encodeVarintApi(dAtA, i, uint64(j24))
i += copy(dAtA[i:], dAtA25[:j24]) i += copy(dAtA[i:], dAtA25[:j24])
} }
if len(m.ApparmorProfile) > 0 {
dAtA[i] = 0x4a
i++
i = encodeVarintApi(dAtA, i, uint64(len(m.ApparmorProfile)))
i += copy(dAtA[i:], m.ApparmorProfile)
}
return i, nil return i, nil
} }
@ -7657,6 +7666,10 @@ func (m *LinuxContainerSecurityContext) Size() (n int) {
} }
n += 1 + sovApi(uint64(l)) + l n += 1 + sovApi(uint64(l)) + l
} }
l = len(m.ApparmorProfile)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
return n return n
} }
@ -8899,6 +8912,7 @@ func (this *LinuxContainerSecurityContext) String() string {
`RunAsUsername:` + fmt.Sprintf("%v", this.RunAsUsername) + `,`, `RunAsUsername:` + fmt.Sprintf("%v", this.RunAsUsername) + `,`,
`ReadonlyRootfs:` + fmt.Sprintf("%v", this.ReadonlyRootfs) + `,`, `ReadonlyRootfs:` + fmt.Sprintf("%v", this.ReadonlyRootfs) + `,`,
`SupplementalGroups:` + fmt.Sprintf("%v", this.SupplementalGroups) + `,`, `SupplementalGroups:` + fmt.Sprintf("%v", this.SupplementalGroups) + `,`,
`ApparmorProfile:` + fmt.Sprintf("%v", this.ApparmorProfile) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -14394,6 +14408,35 @@ func (m *LinuxContainerSecurityContext) Unmarshal(dAtA []byte) error {
} else { } else {
return fmt.Errorf("proto: wrong wireType = %d for field SupplementalGroups", wireType) return fmt.Errorf("proto: wrong wireType = %d for field SupplementalGroups", wireType)
} }
case 9:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ApparmorProfile", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ApparmorProfile = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:]) skippy, err := skipApi(dAtA[iNdEx:])
@ -20654,226 +20697,227 @@ var (
func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } func init() { proto.RegisterFile("api.proto", fileDescriptorApi) }
var fileDescriptorApi = []byte{ var fileDescriptorApi = []byte{
// 3528 bytes of a gzipped FileDescriptorProto // 3550 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7,
0x95, 0x04, 0x40, 0x82, 0xc0, 0x03, 0x01, 0x82, 0x4d, 0x8a, 0x84, 0x40, 0x89, 0xa2, 0xc6, 0x92, 0x95, 0x04, 0x40, 0x82, 0xc0, 0x03, 0x01, 0x82, 0x4d, 0x8a, 0x84, 0x40, 0x89, 0xa2, 0xc6, 0x92,
0x2c, 0xc9, 0x16, 0x2d, 0xd1, 0x5e, 0x69, 0x2d, 0x5b, 0xb2, 0x61, 0x92, 0x72, 0xd1, 0x92, 0x20, 0x2c, 0xc9, 0x16, 0x2d, 0xd1, 0x5e, 0x69, 0x2d, 0x5b, 0xb2, 0x61, 0x92, 0x72, 0xd1, 0x92, 0x20,
0x7a, 0x20, 0x79, 0xed, 0xf5, 0x61, 0x76, 0x88, 0x69, 0x82, 0x23, 0x01, 0x33, 0xe3, 0x99, 0x86, 0x7a, 0x20, 0x79, 0xed, 0xf5, 0x61, 0x76, 0x88, 0x69, 0x82, 0x23, 0x01, 0x33, 0xe3, 0x99, 0x86,
0x2c, 0xee, 0x69, 0x8f, 0x7b, 0xd9, 0x2a, 0xef, 0x71, 0x6f, 0x7b, 0x48, 0x95, 0x2b, 0x49, 0x55, 0x2c, 0xee, 0x69, 0x8f, 0x7b, 0xd9, 0x2a, 0xef, 0x31, 0xb7, 0x1c, 0x52, 0xe5, 0x4a, 0x52, 0x95,
0x0e, 0xa9, 0x4a, 0x25, 0x3f, 0xc1, 0x55, 0xa9, 0x54, 0xe5, 0x90, 0x43, 0x72, 0x8b, 0x95, 0x7b, 0x43, 0xaa, 0x52, 0x95, 0x9f, 0xe0, 0xaa, 0x54, 0xaa, 0x72, 0xc8, 0x21, 0xb9, 0xc5, 0xca, 0x3d,
0x7e, 0x43, 0xaa, 0xbf, 0x66, 0x7a, 0xbe, 0x28, 0x52, 0x76, 0xc5, 0xba, 0x4d, 0xbf, 0x7e, 0xfd, 0xbf, 0x21, 0xd5, 0x5f, 0x33, 0x3d, 0x5f, 0x14, 0x29, 0xbb, 0x62, 0xdd, 0xa6, 0x5f, 0xbf, 0x7e,
0xfa, 0xf5, 0x7b, 0xaf, 0xdf, 0xd7, 0x34, 0x54, 0x4d, 0xcf, 0x5e, 0xf3, 0x7c, 0x97, 0xb8, 0x68, 0xfd, 0xfa, 0xbd, 0xd7, 0xef, 0x6b, 0x1a, 0xaa, 0xa6, 0x67, 0xaf, 0x79, 0xbe, 0x4b, 0x5c, 0x34,
0xda, 0x1f, 0x3b, 0xc4, 0x1e, 0xe1, 0xf6, 0x95, 0x81, 0x4d, 0xf6, 0xc7, 0xbb, 0x6b, 0x7d, 0x77, 0xed, 0x8f, 0x1d, 0x62, 0x8f, 0x70, 0xfb, 0xca, 0xc0, 0x26, 0xfb, 0xe3, 0xdd, 0xb5, 0xbe, 0x3b,
0xf4, 0xd6, 0xc0, 0x1d, 0xb8, 0x6f, 0xb1, 0xf9, 0xdd, 0xf1, 0x1e, 0x1b, 0xb1, 0x01, 0xfb, 0xe2, 0x7a, 0x6b, 0xe0, 0x0e, 0xdc, 0xb7, 0xd8, 0xfc, 0xee, 0x78, 0x8f, 0x8d, 0xd8, 0x80, 0x7d, 0xf1,
0xeb, 0xb4, 0xcb, 0xd0, 0xf8, 0x0c, 0xfb, 0x81, 0xed, 0x3a, 0x3a, 0xfe, 0x6a, 0x8c, 0x03, 0x82, 0x75, 0xda, 0x65, 0x68, 0x7c, 0x86, 0xfd, 0xc0, 0x76, 0x1d, 0x1d, 0x7f, 0x35, 0xc6, 0x01, 0x41,
0x5a, 0x30, 0xfd, 0x94, 0x43, 0x5a, 0x85, 0xd5, 0xc2, 0xc5, 0xaa, 0x2e, 0x87, 0xda, 0xb7, 0x05, 0x2d, 0x98, 0x7e, 0xca, 0x21, 0xad, 0xc2, 0x6a, 0xe1, 0x62, 0x55, 0x97, 0x43, 0xed, 0xdb, 0x02,
0x98, 0x0d, 0x91, 0x03, 0xcf, 0x75, 0x02, 0x9c, 0x8f, 0x8d, 0xce, 0xc2, 0x8c, 0xe0, 0xc9, 0x70, 0xcc, 0x86, 0xc8, 0x81, 0xe7, 0x3a, 0x01, 0xce, 0xc7, 0x46, 0x67, 0x61, 0x46, 0xf0, 0x64, 0x38,
0xcc, 0x11, 0x6e, 0x15, 0xd9, 0x74, 0x4d, 0xc0, 0xba, 0xe6, 0x08, 0xa3, 0xd7, 0x61, 0x56, 0xa2, 0xe6, 0x08, 0xb7, 0x8a, 0x6c, 0xba, 0x26, 0x60, 0x5d, 0x73, 0x84, 0xd1, 0xeb, 0x30, 0x2b, 0x51,
0x48, 0x22, 0x25, 0x86, 0xd5, 0x10, 0x60, 0xb1, 0x1b, 0x5a, 0x83, 0x79, 0x89, 0x68, 0x7a, 0x76, 0x24, 0x91, 0x12, 0xc3, 0x6a, 0x08, 0xb0, 0xd8, 0x0d, 0xad, 0xc1, 0xbc, 0x44, 0x34, 0x3d, 0x3b,
0x88, 0x3c, 0xc9, 0x90, 0xe7, 0xc4, 0x54, 0xc7, 0xb3, 0x05, 0xbe, 0xf6, 0x25, 0x54, 0x37, 0xbb, 0x44, 0x9e, 0x64, 0xc8, 0x73, 0x62, 0xaa, 0xe3, 0xd9, 0x02, 0x5f, 0xfb, 0x12, 0xaa, 0x9b, 0xdd,
0xbd, 0x0d, 0xd7, 0xd9, 0xb3, 0x07, 0x94, 0xc5, 0x00, 0xfb, 0x74, 0x4d, 0xab, 0xb0, 0x5a, 0xa2, 0xde, 0x86, 0xeb, 0xec, 0xd9, 0x03, 0xca, 0x62, 0x80, 0x7d, 0xba, 0xa6, 0x55, 0x58, 0x2d, 0x51,
0x2c, 0x8a, 0x21, 0x6a, 0x43, 0x25, 0xc0, 0xa6, 0xdf, 0xdf, 0xc7, 0x41, 0xab, 0xc8, 0xa6, 0xc2, 0x16, 0xc5, 0x10, 0xb5, 0xa1, 0x12, 0x60, 0xd3, 0xef, 0xef, 0xe3, 0xa0, 0x55, 0x64, 0x53, 0xe1,
0x31, 0x5d, 0xe5, 0x7a, 0xc4, 0x76, 0x9d, 0xa0, 0x55, 0xe2, 0xab, 0xc4, 0x50, 0xfb, 0xbf, 0x02, 0x98, 0xae, 0x72, 0x3d, 0x62, 0xbb, 0x4e, 0xd0, 0x2a, 0xf1, 0x55, 0x62, 0xa8, 0xfd, 0xac, 0x00,
0xd4, 0x76, 0x5c, 0x9f, 0xdc, 0x37, 0x3d, 0xcf, 0x76, 0x06, 0xe8, 0x0a, 0x54, 0x98, 0x2c, 0xfb, 0xb5, 0x1d, 0xd7, 0x27, 0xf7, 0x4d, 0xcf, 0xb3, 0x9d, 0x01, 0xba, 0x02, 0x15, 0x26, 0xcb, 0xbe,
0xee, 0x90, 0xc9, 0xa0, 0xb1, 0x3e, 0xb7, 0x26, 0x58, 0x5a, 0xdb, 0x11, 0x13, 0x7a, 0x88, 0x82, 0x3b, 0x64, 0x32, 0x68, 0xac, 0xcf, 0xad, 0x09, 0x96, 0xd6, 0x76, 0xc4, 0x84, 0x1e, 0xa2, 0xa0,
0xce, 0x43, 0xa3, 0xef, 0x3a, 0xc4, 0xb4, 0x1d, 0xec, 0x1b, 0x9e, 0xeb, 0x13, 0x26, 0x99, 0x29, 0xf3, 0xd0, 0xe8, 0xbb, 0x0e, 0x31, 0x6d, 0x07, 0xfb, 0x86, 0xe7, 0xfa, 0x84, 0x49, 0x66, 0x4a,
0xbd, 0x1e, 0x42, 0x29, 0x71, 0xb4, 0x0c, 0xd5, 0x7d, 0x37, 0x20, 0x1c, 0xa3, 0xc4, 0x30, 0x2a, 0xaf, 0x87, 0x50, 0x4a, 0x1c, 0x2d, 0x43, 0x75, 0xdf, 0x0d, 0x08, 0xc7, 0x28, 0x31, 0x8c, 0x0a,
0x14, 0xc0, 0x26, 0x97, 0x60, 0x9a, 0x4d, 0xda, 0x9e, 0x90, 0x41, 0x99, 0x0e, 0xb7, 0x3d, 0xed, 0x05, 0xb0, 0xc9, 0x25, 0x98, 0x66, 0x93, 0xb6, 0x27, 0x64, 0x50, 0xa6, 0xc3, 0x6d, 0x4f, 0xfb,
0x9b, 0x02, 0x4c, 0xdd, 0x77, 0xc7, 0x0e, 0x49, 0x6c, 0x63, 0x92, 0x7d, 0xa1, 0x1f, 0x65, 0x1b, 0xa6, 0x00, 0x53, 0xf7, 0xdd, 0xb1, 0x43, 0x12, 0xdb, 0x98, 0x64, 0x5f, 0xe8, 0x47, 0xd9, 0xc6,
0x93, 0xec, 0x47, 0xdb, 0x50, 0x0c, 0xae, 0x22, 0xbe, 0x0d, 0x9d, 0x6c, 0x43, 0xc5, 0xc7, 0xa6, 0x24, 0xfb, 0xd1, 0x36, 0x14, 0x83, 0xab, 0x88, 0x6f, 0x43, 0x27, 0xdb, 0x50, 0xf1, 0xb1, 0x69,
0xe5, 0x3a, 0xc3, 0x03, 0xc6, 0x42, 0x45, 0x0f, 0xc7, 0x54, 0x77, 0x01, 0x1e, 0xda, 0xce, 0xf8, 0xb9, 0xce, 0xf0, 0x80, 0xb1, 0x50, 0xd1, 0xc3, 0x31, 0xd5, 0x5d, 0x80, 0x87, 0xb6, 0x33, 0x7e,
0x99, 0xe1, 0xe3, 0xa1, 0xb9, 0x8b, 0x87, 0x8c, 0x95, 0x8a, 0xde, 0x10, 0x60, 0x9d, 0x43, 0xb5, 0x66, 0xf8, 0x78, 0x68, 0xee, 0xe2, 0x21, 0x63, 0xa5, 0xa2, 0x37, 0x04, 0x58, 0xe7, 0x50, 0xed,
0xc7, 0x30, 0x4b, 0x95, 0x1d, 0x78, 0x66, 0x1f, 0x3f, 0x60, 0x22, 0xa4, 0xa6, 0xc1, 0x36, 0x75, 0x31, 0xcc, 0x52, 0x65, 0x07, 0x9e, 0xd9, 0xc7, 0x0f, 0x98, 0x08, 0xa9, 0x69, 0xb0, 0x4d, 0x1d,
0x30, 0xf9, 0xda, 0xf5, 0x9f, 0x30, 0xce, 0x2a, 0x7a, 0x8d, 0xc2, 0xba, 0x1c, 0x84, 0x4e, 0x42, 0x4c, 0xbe, 0x76, 0xfd, 0x27, 0x8c, 0xb3, 0x8a, 0x5e, 0xa3, 0xb0, 0x2e, 0x07, 0xa1, 0x93, 0x50,
0x85, 0xf3, 0x65, 0x5b, 0x8c, 0xad, 0x8a, 0xce, 0x4e, 0xbc, 0x63, 0x5b, 0xe1, 0x94, 0xed, 0xf5, 0xe1, 0x7c, 0xd9, 0x16, 0x63, 0xab, 0xa2, 0xb3, 0x13, 0xef, 0xd8, 0x56, 0x38, 0x65, 0x7b, 0x7d,
0x05, 0x57, 0xd3, 0xfc, 0xf4, 0x7d, 0x4d, 0x03, 0xd8, 0x76, 0xc8, 0xf5, 0x77, 0x3e, 0x33, 0x87, 0xc1, 0xd5, 0x34, 0x3f, 0x7d, 0x5f, 0xd3, 0x00, 0xb6, 0x1d, 0x72, 0xfd, 0x9d, 0xcf, 0xcc, 0xe1,
0x63, 0x8c, 0x16, 0x60, 0xea, 0x29, 0xfd, 0x60, 0xf4, 0x4b, 0x3a, 0x1f, 0x68, 0x7f, 0x2a, 0xc2, 0x18, 0xa3, 0x05, 0x98, 0x7a, 0x4a, 0x3f, 0x18, 0xfd, 0x92, 0xce, 0x07, 0xda, 0x9f, 0x8b, 0xb0,
0xf2, 0x3d, 0xca, 0x60, 0xcf, 0x74, 0xac, 0x5d, 0xf7, 0x59, 0x0f, 0xf7, 0xc7, 0xbe, 0x4d, 0x0e, 0x7c, 0x8f, 0x32, 0xd8, 0x33, 0x1d, 0x6b, 0xd7, 0x7d, 0xd6, 0xc3, 0xfd, 0xb1, 0x6f, 0x93, 0x83,
0x36, 0x5c, 0x87, 0xe0, 0x67, 0x04, 0x6d, 0xc1, 0x9c, 0x23, 0xf9, 0x35, 0xa4, 0x09, 0x50, 0x0a, 0x0d, 0xd7, 0x21, 0xf8, 0x19, 0x41, 0x5b, 0x30, 0xe7, 0x48, 0x7e, 0x0d, 0x69, 0x02, 0x94, 0x42,
0xb5, 0xf5, 0x56, 0xa8, 0xd7, 0xc4, 0x89, 0xf4, 0xa6, 0x13, 0x07, 0x04, 0xe8, 0x83, 0x48, 0x3e, 0x6d, 0xbd, 0x15, 0xea, 0x35, 0x71, 0x22, 0xbd, 0xe9, 0xc4, 0x01, 0x01, 0xfa, 0x20, 0x92, 0x8f,
0x92, 0x48, 0x91, 0x11, 0x59, 0x0c, 0x89, 0xf4, 0xb6, 0x18, 0x1f, 0x82, 0x84, 0x94, 0x9b, 0x24, 0x24, 0x52, 0x64, 0x44, 0x16, 0x43, 0x22, 0xbd, 0x2d, 0xc6, 0x87, 0x20, 0x21, 0xe5, 0x26, 0x09,
0xf0, 0x36, 0xd0, 0xbb, 0x62, 0x98, 0x81, 0x31, 0x0e, 0xb0, 0xcf, 0x4e, 0x5a, 0x5b, 0x9f, 0x0f, 0xbc, 0x0d, 0xf4, 0xae, 0x18, 0x66, 0x60, 0x8c, 0x03, 0xec, 0xb3, 0x93, 0xd6, 0xd6, 0xe7, 0xc3,
0x17, 0x47, 0xe7, 0xd4, 0xab, 0xfe, 0xd8, 0xe9, 0x04, 0x8f, 0x02, 0xec, 0xb3, 0x1b, 0x25, 0x34, 0xc5, 0xd1, 0x39, 0xf5, 0xaa, 0x3f, 0x76, 0x3a, 0xc1, 0xa3, 0x00, 0xfb, 0xec, 0x46, 0x09, 0x0d,
0x64, 0xf8, 0xae, 0x4b, 0xf6, 0x02, 0xa9, 0x15, 0x09, 0xd6, 0x19, 0x14, 0xbd, 0x05, 0xf3, 0xc1, 0x19, 0xbe, 0xeb, 0x92, 0xbd, 0x40, 0x6a, 0x45, 0x82, 0x75, 0x06, 0x45, 0x6f, 0xc1, 0x7c, 0x30,
0xd8, 0xf3, 0x86, 0x78, 0x84, 0x1d, 0x62, 0x0e, 0x8d, 0x81, 0xef, 0x8e, 0xbd, 0xa0, 0x35, 0xb5, 0xf6, 0xbc, 0x21, 0x1e, 0x61, 0x87, 0x98, 0x43, 0x63, 0xe0, 0xbb, 0x63, 0x2f, 0x68, 0x4d, 0xad,
0x5a, 0xba, 0x58, 0xd2, 0x91, 0x3a, 0xf5, 0x31, 0x9b, 0x41, 0x2b, 0x00, 0x9e, 0x6f, 0x3f, 0xb5, 0x96, 0x2e, 0x96, 0x74, 0xa4, 0x4e, 0x7d, 0xcc, 0x66, 0xd0, 0x0a, 0x80, 0xe7, 0xdb, 0x4f, 0xed,
0x87, 0x78, 0x80, 0xad, 0x56, 0x99, 0x11, 0x55, 0x20, 0xda, 0xff, 0x14, 0xe0, 0x04, 0x3b, 0xce, 0x21, 0x1e, 0x60, 0xab, 0x55, 0x66, 0x44, 0x15, 0x88, 0xf6, 0x7f, 0x05, 0x38, 0xc1, 0x8e, 0xb3,
0x8e, 0x6b, 0x09, 0xc9, 0x8a, 0xfb, 0xf7, 0x1a, 0xd4, 0xfb, 0x8c, 0xbc, 0xe1, 0x99, 0x3e, 0x76, 0xe3, 0x5a, 0x42, 0xb2, 0xe2, 0xfe, 0xbd, 0x06, 0xf5, 0x3e, 0x23, 0x6f, 0x78, 0xa6, 0x8f, 0x1d,
0x88, 0x30, 0xc4, 0x19, 0x0e, 0xdc, 0x61, 0x30, 0xf4, 0x00, 0x9a, 0x81, 0x50, 0x84, 0xd1, 0xe7, 0x22, 0x0c, 0x71, 0x86, 0x03, 0x77, 0x18, 0x0c, 0x3d, 0x80, 0x66, 0x20, 0x14, 0x61, 0xf4, 0xb9,
0x9a, 0x10, 0xf2, 0x3a, 0x17, 0x1e, 0xf9, 0x10, 0xad, 0xe9, 0xb3, 0x41, 0x1c, 0xa0, 0xf9, 0x80, 0x26, 0x84, 0xbc, 0xce, 0x85, 0x47, 0x3e, 0x44, 0x6b, 0xfa, 0x6c, 0x10, 0x07, 0x68, 0x3e, 0xa0,
0x22, 0x4e, 0xee, 0x63, 0x62, 0x5a, 0x26, 0x31, 0x11, 0x82, 0x49, 0xe6, 0x8c, 0x38, 0x0b, 0xec, 0x88, 0x93, 0xfb, 0x98, 0x98, 0x96, 0x49, 0x4c, 0x84, 0x60, 0x92, 0x39, 0x23, 0xce, 0x02, 0xfb,
0x1b, 0x35, 0xa1, 0x34, 0x16, 0x56, 0x56, 0xd5, 0xe9, 0x27, 0x3a, 0x05, 0xd5, 0x50, 0x9f, 0xc2, 0x46, 0x4d, 0x28, 0x8d, 0x85, 0x95, 0x55, 0x75, 0xfa, 0x89, 0x4e, 0x41, 0x35, 0xd4, 0xa7, 0xf0,
0x23, 0x45, 0x00, 0xea, 0x19, 0x4c, 0x42, 0xf0, 0xc8, 0x23, 0x4c, 0xb6, 0x75, 0x5d, 0x0e, 0xb5, 0x48, 0x11, 0x80, 0x7a, 0x06, 0x93, 0x10, 0x3c, 0xf2, 0x08, 0x93, 0x6d, 0x5d, 0x97, 0x43, 0xed,
0xdf, 0x4d, 0x42, 0x33, 0x75, 0xfc, 0x1b, 0x50, 0x19, 0x89, 0xed, 0x85, 0x19, 0x2d, 0x47, 0xee, 0xf7, 0x93, 0xd0, 0x4c, 0x1d, 0xff, 0x06, 0x54, 0x46, 0x62, 0x7b, 0x61, 0x46, 0xcb, 0x91, 0x7b,
0x21, 0xc5, 0xa1, 0x1e, 0x22, 0xd3, 0xdb, 0x47, 0xed, 0x5a, 0x71, 0x9e, 0xe1, 0x98, 0xca, 0x74, 0x48, 0x71, 0xa8, 0x87, 0xc8, 0xf4, 0xf6, 0x51, 0xbb, 0x56, 0x9c, 0x67, 0x38, 0xa6, 0x32, 0x1d,
0xe8, 0x0e, 0x0c, 0xcb, 0xf6, 0x71, 0x9f, 0xb8, 0xfe, 0x81, 0xe0, 0x72, 0x66, 0xe8, 0x0e, 0x36, 0xba, 0x03, 0xc3, 0xb2, 0x7d, 0xdc, 0x27, 0xae, 0x7f, 0x20, 0xb8, 0x9c, 0x19, 0xba, 0x83, 0x4d,
0x25, 0x0c, 0x5d, 0x03, 0xb0, 0x9c, 0x80, 0x8a, 0x73, 0xcf, 0x1e, 0x30, 0x5e, 0x6b, 0xeb, 0x28, 0x09, 0x43, 0xd7, 0x00, 0x2c, 0x27, 0xa0, 0xe2, 0xdc, 0xb3, 0x07, 0x8c, 0xd7, 0xda, 0x3a, 0x0a,
0xdc, 0x3b, 0x74, 0x90, 0x7a, 0xd5, 0x72, 0x02, 0xc1, 0xec, 0xbb, 0x50, 0xa7, 0x0e, 0xc7, 0x18, 0xf7, 0x0e, 0x1d, 0xa4, 0x5e, 0xb5, 0x9c, 0x40, 0x30, 0xfb, 0x2e, 0xd4, 0xa9, 0xc3, 0x31, 0x46,
0x71, 0xdf, 0xc6, 0x0d, 0xa2, 0xb6, 0xbe, 0xa0, 0x70, 0x1c, 0x3a, 0x3e, 0x7d, 0xc6, 0x8b, 0x06, 0xdc, 0xb7, 0x71, 0x83, 0xa8, 0xad, 0x2f, 0x28, 0x1c, 0x87, 0x8e, 0x4f, 0x9f, 0xf1, 0xa2, 0x41,
0x01, 0xba, 0x05, 0x65, 0x76, 0xe1, 0x83, 0x56, 0x99, 0xad, 0x39, 0x9f, 0x71, 0x4a, 0xbe, 0xcb, 0x80, 0x6e, 0x41, 0x99, 0x5d, 0xf8, 0xa0, 0x55, 0x66, 0x6b, 0xce, 0x67, 0x9c, 0x92, 0xef, 0xb2,
0xda, 0x3d, 0x86, 0xb7, 0xe5, 0x10, 0xff, 0x40, 0x17, 0x8b, 0xd0, 0x3d, 0xa8, 0x99, 0x8e, 0xe3, 0x76, 0x8f, 0xe1, 0x6d, 0x39, 0xc4, 0x3f, 0xd0, 0xc5, 0x22, 0x74, 0x0f, 0x6a, 0xa6, 0xe3, 0xb8,
0x12, 0x93, 0xdf, 0x95, 0x69, 0x46, 0xe3, 0x72, 0x3e, 0x8d, 0x4e, 0x84, 0xcc, 0x09, 0xa9, 0xcb, 0xc4, 0xe4, 0x77, 0x65, 0x9a, 0xd1, 0xb8, 0x9c, 0x4f, 0xa3, 0x13, 0x21, 0x73, 0x42, 0xea, 0x72,
0xd1, 0x3b, 0x30, 0xc5, 0x2e, 0x53, 0xab, 0xc2, 0x4e, 0xbd, 0x12, 0xb7, 0xa1, 0x24, 0x31, 0x9d, 0xf4, 0x0e, 0x4c, 0xb1, 0xcb, 0xd4, 0xaa, 0xb0, 0x53, 0xaf, 0xc4, 0x6d, 0x28, 0x49, 0x4c, 0xe7,
0x23, 0xb7, 0xdf, 0x85, 0x9a, 0xc2, 0x1a, 0x35, 0x8c, 0x27, 0xf8, 0x40, 0xd8, 0x0a, 0xfd, 0x8c, 0xc8, 0xed, 0x77, 0xa1, 0xa6, 0xb0, 0x46, 0x0d, 0xe3, 0x09, 0x3e, 0x10, 0xb6, 0x42, 0x3f, 0x23,
0x3c, 0x0a, 0xd7, 0x07, 0x1f, 0xdc, 0x2c, 0xfe, 0x6b, 0xa1, 0x7d, 0x1b, 0x9a, 0x49, 0x8e, 0x8e, 0x8f, 0xc2, 0xf5, 0xc1, 0x07, 0x37, 0x8b, 0xff, 0x5e, 0x68, 0xdf, 0x86, 0x66, 0x92, 0xa3, 0xe3,
0xb3, 0x5e, 0xdb, 0x86, 0x05, 0x7d, 0xec, 0x44, 0x8c, 0xc9, 0x68, 0x7c, 0x0d, 0xca, 0x42, 0x7f, 0xac, 0xd7, 0xb6, 0x61, 0x41, 0x1f, 0x3b, 0x11, 0x63, 0x32, 0x1a, 0x5f, 0x83, 0xb2, 0xd0, 0x1f,
0xdc, 0x76, 0x4e, 0xe6, 0x4a, 0x44, 0x17, 0x88, 0xda, 0x2d, 0x38, 0x91, 0x20, 0x25, 0x62, 0xf5, 0xb7, 0x9d, 0x93, 0xb9, 0x12, 0xd1, 0x05, 0xa2, 0x76, 0x0b, 0x4e, 0x24, 0x48, 0x89, 0x58, 0x7d,
0x39, 0x68, 0x78, 0xae, 0x65, 0x04, 0x1c, 0x6c, 0xd8, 0x96, 0xbc, 0x89, 0x5e, 0x88, 0xbb, 0x6d, 0x0e, 0x1a, 0x9e, 0x6b, 0x19, 0x01, 0x07, 0x1b, 0xb6, 0x25, 0x6f, 0xa2, 0x17, 0xe2, 0x6e, 0x5b,
0xd1, 0xe5, 0x3d, 0xe2, 0x7a, 0x69, 0x56, 0x8e, 0xb6, 0xbc, 0x05, 0x8b, 0xc9, 0xe5, 0x7c, 0x7b, 0x74, 0x79, 0x8f, 0xb8, 0x5e, 0x9a, 0x95, 0xa3, 0x2d, 0x6f, 0xc1, 0x62, 0x72, 0x39, 0xdf, 0x5e,
0xed, 0x03, 0x58, 0xd2, 0xf1, 0xc8, 0x7d, 0x8a, 0x5f, 0x96, 0x74, 0x1b, 0x5a, 0x69, 0x02, 0x11, 0xfb, 0x00, 0x96, 0x74, 0x3c, 0x72, 0x9f, 0xe2, 0x97, 0x25, 0xdd, 0x86, 0x56, 0x9a, 0x40, 0x44,
0xf1, 0x08, 0xda, 0x23, 0x26, 0x19, 0x07, 0xc7, 0x23, 0x7e, 0x49, 0x25, 0x20, 0xa2, 0x10, 0xa7, 0x3c, 0x82, 0xf6, 0x88, 0x49, 0xc6, 0xc1, 0xf1, 0x88, 0x5f, 0x52, 0x09, 0x88, 0x28, 0xc4, 0xe9,
0x83, 0x1a, 0x50, 0xb4, 0x3d, 0xb1, 0xa8, 0x68, 0x7b, 0xda, 0x17, 0x50, 0xed, 0xaa, 0xde, 0x40, 0xa0, 0x06, 0x14, 0x6d, 0x4f, 0x2c, 0x2a, 0xda, 0x9e, 0xf6, 0x05, 0x54, 0xbb, 0xaa, 0x37, 0x50,
0x0d, 0x63, 0x55, 0x5d, 0x0e, 0xd1, 0x7a, 0x94, 0x41, 0x14, 0x5f, 0x10, 0x3e, 0xc2, 0xdc, 0xe2, 0xc3, 0x58, 0x55, 0x97, 0x43, 0xb4, 0x1e, 0x65, 0x10, 0xc5, 0x17, 0x84, 0x8f, 0x30, 0xb7, 0xb8,
0x6e, 0xca, 0x89, 0x0a, 0x1e, 0xd6, 0x01, 0x42, 0x0f, 0x24, 0xc3, 0x11, 0x4a, 0xd3, 0xd3, 0x15, 0x9b, 0x72, 0xa2, 0x82, 0x87, 0x75, 0x80, 0xd0, 0x03, 0xc9, 0x70, 0x84, 0xd2, 0xf4, 0x74, 0x05,
0x2c, 0xed, 0x67, 0x31, 0x77, 0xa4, 0x1c, 0xc6, 0x0a, 0x0f, 0x63, 0xc5, 0xdc, 0x53, 0xf1, 0x38, 0x4b, 0xfb, 0x45, 0xcc, 0x1d, 0x29, 0x87, 0xb1, 0xc2, 0xc3, 0x58, 0x31, 0xf7, 0x54, 0x3c, 0x8e,
0xee, 0x69, 0x0d, 0xa6, 0x02, 0x62, 0x12, 0xee, 0x20, 0x1b, 0xca, 0xe1, 0xe2, 0x5b, 0x62, 0x9d, 0x7b, 0x5a, 0x83, 0xa9, 0x80, 0x98, 0x84, 0x3b, 0xc8, 0x86, 0x72, 0xb8, 0xf8, 0x96, 0x58, 0xe7,
0xa3, 0xa1, 0xd3, 0x00, 0x7d, 0x1f, 0x9b, 0x04, 0x5b, 0x86, 0xc9, 0x3d, 0x67, 0x49, 0xaf, 0x0a, 0x68, 0xe8, 0x34, 0x40, 0xdf, 0xc7, 0x26, 0xc1, 0x96, 0x61, 0x72, 0xcf, 0x59, 0xd2, 0xab, 0x02,
0x48, 0x87, 0xa0, 0x9b, 0x91, 0x1c, 0xa7, 0x18, 0x1b, 0xab, 0x19, 0x04, 0x63, 0x7a, 0x89, 0x24, 0xd2, 0x21, 0xe8, 0x66, 0x24, 0xc7, 0x29, 0xc6, 0xc6, 0x6a, 0x06, 0xc1, 0x98, 0x5e, 0x22, 0x49,
0x1d, 0xde, 0xf6, 0xf2, 0xe1, 0xb7, 0x5d, 0xac, 0xe3, 0xc8, 0x8a, 0xc3, 0x9a, 0xce, 0x75, 0x58, 0x87, 0xb7, 0xbd, 0x7c, 0xf8, 0x6d, 0x17, 0xeb, 0x38, 0xb2, 0xe2, 0xb0, 0xa6, 0x73, 0x1d, 0x16,
0x7c, 0xc5, 0x51, 0x1c, 0x56, 0x25, 0xd7, 0x61, 0x09, 0x1a, 0x87, 0x3a, 0xac, 0x9f, 0xd2, 0xf5, 0x5f, 0x71, 0x14, 0x87, 0x55, 0xc9, 0x75, 0x58, 0x82, 0xc6, 0xa1, 0x0e, 0xeb, 0xa7, 0x74, 0x3d,
0xdc, 0x87, 0x56, 0xfa, 0xea, 0x08, 0x97, 0x71, 0x0d, 0xca, 0x01, 0x83, 0x1c, 0xe2, 0x7e, 0xc4, 0xf7, 0xa1, 0x95, 0xbe, 0x3a, 0xc2, 0x65, 0x5c, 0x83, 0x72, 0xc0, 0x20, 0x87, 0xb8, 0x1f, 0xb1,
0x12, 0x81, 0xa8, 0xdd, 0x81, 0x85, 0x84, 0x05, 0xf0, 0x6c, 0x2c, 0xb4, 0x97, 0xc2, 0x91, 0xec, 0x44, 0x20, 0x6a, 0x77, 0x60, 0x21, 0x61, 0x01, 0x3c, 0x1b, 0x0b, 0xed, 0xa5, 0x70, 0x24, 0x7b,
0x45, 0xfb, 0x7b, 0x41, 0xb5, 0xde, 0x3b, 0xf6, 0x90, 0x60, 0x3f, 0x65, 0xbd, 0x6f, 0x4b, 0xa2, 0xd1, 0xfe, 0x51, 0x50, 0xad, 0xf7, 0x8e, 0x3d, 0x24, 0xd8, 0x4f, 0x59, 0xef, 0xdb, 0x92, 0x28,
0xdc, 0x74, 0x4f, 0xe7, 0x11, 0xe5, 0x89, 0x92, 0xb0, 0xc4, 0x1e, 0x34, 0x98, 0x0e, 0x8d, 0x00, 0x37, 0xdd, 0xd3, 0x79, 0x44, 0x79, 0xa2, 0x24, 0x2c, 0xb1, 0x07, 0x0d, 0xa6, 0x43, 0x23, 0xc0,
0x0f, 0x59, 0xa8, 0x64, 0x19, 0x7e, 0x6d, 0xfd, 0xcd, 0x8c, 0xd5, 0x7c, 0x5f, 0x6e, 0x00, 0x3d, 0x43, 0x16, 0x2a, 0x59, 0x86, 0x5f, 0x5b, 0x7f, 0x33, 0x63, 0x35, 0xdf, 0x97, 0x1b, 0x40, 0x4f,
0x81, 0xce, 0xd5, 0x57, 0x1f, 0xaa, 0xb0, 0xf6, 0x87, 0x80, 0xd2, 0x48, 0xc7, 0xd2, 0xc3, 0x27, 0xa0, 0x73, 0xf5, 0xd5, 0x87, 0x2a, 0xac, 0xfd, 0x21, 0xa0, 0x34, 0xd2, 0xb1, 0xf4, 0xf0, 0x09,
0xf4, 0xee, 0xd3, 0x04, 0x3f, 0x23, 0x06, 0xec, 0x31, 0x36, 0x0e, 0x51, 0x02, 0xe7, 0x53, 0x17, 0xbd, 0xfb, 0x34, 0xc1, 0xcf, 0x88, 0x01, 0x7b, 0x8c, 0x8d, 0x43, 0x94, 0xc0, 0xf9, 0xd4, 0x05,
0x88, 0xda, 0xff, 0x97, 0x00, 0xa2, 0xc9, 0x57, 0xf6, 0xd2, 0xdf, 0x08, 0xaf, 0x20, 0xcf, 0x33, 0xa2, 0xf6, 0xf3, 0x12, 0x40, 0x34, 0xf9, 0xca, 0x5e, 0xfa, 0x1b, 0xe1, 0x15, 0xe4, 0x79, 0xc6,
0xce, 0x64, 0xd0, 0xcb, 0xbc, 0x7c, 0x77, 0xe2, 0x97, 0x8f, 0x67, 0x1c, 0xe7, 0xb2, 0x56, 0xbf, 0x99, 0x0c, 0x7a, 0x99, 0x97, 0xef, 0x4e, 0xfc, 0xf2, 0xf1, 0x8c, 0xe3, 0x5c, 0xd6, 0xea, 0x57,
0xb2, 0xd7, 0x6e, 0x03, 0x16, 0x93, 0xea, 0x16, 0x97, 0xee, 0x12, 0x4c, 0xd9, 0x04, 0x8f, 0x78, 0xf6, 0xda, 0x6d, 0xc0, 0x62, 0x52, 0xdd, 0xe2, 0xd2, 0x5d, 0x82, 0x29, 0x9b, 0xe0, 0x11, 0x2f,
0xb9, 0xaa, 0xe6, 0xfc, 0x0a, 0x2e, 0xc7, 0xd0, 0xce, 0x42, 0x75, 0x7b, 0x64, 0x0e, 0x70, 0xcf, 0x57, 0xd5, 0x9c, 0x5f, 0xc1, 0xe5, 0x18, 0xda, 0x59, 0xa8, 0x6e, 0x8f, 0xcc, 0x01, 0xee, 0x79,
0xc3, 0x7d, 0xba, 0x97, 0x4d, 0x07, 0x62, 0x7f, 0x3e, 0xd0, 0xd6, 0xa1, 0x72, 0x17, 0x1f, 0xf0, 0xb8, 0x4f, 0xf7, 0xb2, 0xe9, 0x40, 0xec, 0xcf, 0x07, 0xda, 0x3a, 0x54, 0xee, 0xe2, 0x03, 0x7e,
0x3b, 0x78, 0x44, 0xfe, 0xb4, 0xdf, 0x17, 0x60, 0x89, 0xf9, 0xce, 0x0d, 0x59, 0x2c, 0xea, 0x38, 0x07, 0x8f, 0xc8, 0x9f, 0xf6, 0x87, 0x02, 0x2c, 0x31, 0xdf, 0xb9, 0x21, 0x8b, 0x45, 0x1d, 0x07,
0x70, 0xc7, 0x7e, 0x1f, 0x07, 0x4c, 0xa5, 0xde, 0xd8, 0xf0, 0xb0, 0x6f, 0xbb, 0x96, 0x28, 0xad, 0xee, 0xd8, 0xef, 0xe3, 0x80, 0xa9, 0xd4, 0x1b, 0x1b, 0x1e, 0xf6, 0x6d, 0xd7, 0x12, 0xa5, 0x55,
0xaa, 0x7d, 0x6f, 0xbc, 0xc3, 0x00, 0xb4, 0xa0, 0xa4, 0xd3, 0x5f, 0x8d, 0x5d, 0x61, 0x5b, 0x25, 0xb5, 0xef, 0x8d, 0x77, 0x18, 0x80, 0x16, 0x94, 0x74, 0xfa, 0xab, 0xb1, 0x2b, 0x6c, 0xab, 0xa4,
0xbd, 0xd2, 0xf7, 0xc6, 0x9f, 0xd2, 0xb1, 0x5c, 0x1b, 0xec, 0x9b, 0x3e, 0x0e, 0x98, 0x0d, 0xf1, 0x57, 0xfa, 0xde, 0xf8, 0x53, 0x3a, 0x96, 0x6b, 0x83, 0x7d, 0xd3, 0xc7, 0x01, 0xb3, 0x21, 0xbe,
0xb5, 0x3d, 0x06, 0x40, 0xd7, 0xe0, 0xc4, 0x08, 0x8f, 0x5c, 0xff, 0xc0, 0x18, 0xda, 0x23, 0x9b, 0xb6, 0xc7, 0x00, 0xe8, 0x1a, 0x9c, 0x18, 0xe1, 0x91, 0xeb, 0x1f, 0x18, 0x43, 0x7b, 0x64, 0x13,
0x18, 0xb6, 0x63, 0xec, 0x1e, 0x10, 0x1c, 0x08, 0xc3, 0x41, 0x7c, 0xf2, 0x1e, 0x9d, 0xdb, 0x76, 0xc3, 0x76, 0x8c, 0xdd, 0x03, 0x82, 0x03, 0x61, 0x38, 0x88, 0x4f, 0xde, 0xa3, 0x73, 0xdb, 0xce,
0x3e, 0xa2, 0x33, 0x48, 0x83, 0xba, 0xeb, 0x8e, 0x8c, 0xa0, 0xef, 0xfa, 0xd8, 0x30, 0xad, 0xc7, 0x47, 0x74, 0x06, 0x69, 0x50, 0x77, 0xdd, 0x91, 0x11, 0xf4, 0x5d, 0x1f, 0x1b, 0xa6, 0xf5, 0x98,
0x2c, 0x78, 0x94, 0xf4, 0x9a, 0xeb, 0x8e, 0x7a, 0x14, 0xd6, 0xb1, 0x1e, 0x6b, 0x26, 0xd4, 0x63, 0x05, 0x8f, 0x92, 0x5e, 0x73, 0xdd, 0x51, 0x8f, 0xc2, 0x3a, 0xd6, 0x63, 0xcd, 0x84, 0x7a, 0xac,
0xa5, 0x16, 0xad, 0x02, 0x58, 0x4d, 0x25, 0xaa, 0x00, 0xfa, 0x4d, 0x61, 0xbe, 0x3b, 0x94, 0x72, 0xd4, 0xa2, 0x55, 0x00, 0xab, 0xa9, 0x44, 0x15, 0x40, 0xbf, 0x29, 0xcc, 0x77, 0x87, 0x52, 0x0e,
0x60, 0xdf, 0x14, 0x46, 0x0e, 0x3c, 0x59, 0x02, 0xb0, 0x6f, 0x2a, 0xb0, 0x21, 0x7e, 0x2a, 0xaa, 0xec, 0x9b, 0xc2, 0xc8, 0x81, 0x27, 0x4b, 0x00, 0xf6, 0x4d, 0x05, 0x36, 0xc4, 0x4f, 0x45, 0xb5,
0xdd, 0xaa, 0xce, 0x07, 0x9a, 0x05, 0xb0, 0x61, 0x7a, 0xe6, 0xae, 0x3d, 0xb4, 0xc9, 0x01, 0xba, 0x5b, 0xd5, 0xf9, 0x40, 0xb3, 0x00, 0x36, 0x4c, 0xcf, 0xdc, 0xb5, 0x87, 0x36, 0x39, 0x40, 0x97,
0x04, 0x4d, 0xd3, 0xb2, 0x8c, 0xbe, 0x84, 0xd8, 0x58, 0xb6, 0x1e, 0x66, 0x4d, 0xcb, 0xda, 0x50, 0xa0, 0x69, 0x5a, 0x96, 0xd1, 0x97, 0x10, 0x1b, 0xcb, 0xd6, 0xc3, 0xac, 0x69, 0x59, 0x1b, 0x0a,
0xc0, 0xe8, 0x0d, 0x98, 0xb3, 0x7c, 0xd7, 0x8b, 0xe3, 0xf2, 0x5e, 0x44, 0x93, 0x4e, 0xa8, 0xc8, 0x18, 0xbd, 0x01, 0x73, 0x96, 0xef, 0x7a, 0x71, 0x5c, 0xde, 0x8b, 0x68, 0xd2, 0x09, 0x15, 0x59,
0xda, 0x6f, 0x4b, 0x70, 0x3a, 0xae, 0x96, 0x64, 0xf1, 0x7a, 0x03, 0x66, 0x12, 0xbb, 0xc6, 0xab, 0x7b, 0x5e, 0x82, 0xd3, 0x71, 0xb5, 0x24, 0x8b, 0xd7, 0x1b, 0x30, 0x93, 0xd8, 0x35, 0x5e, 0x35,
0xc6, 0x88, 0x49, 0x3d, 0x86, 0x98, 0x28, 0xef, 0x8a, 0xc9, 0xf2, 0x2e, 0xbb, 0x2a, 0x2e, 0xfd, 0x46, 0x4c, 0xea, 0x31, 0xc4, 0x44, 0x79, 0x57, 0x4c, 0x96, 0x77, 0xd9, 0x55, 0x71, 0xe9, 0xc7,
0x18, 0x55, 0xf1, 0xe4, 0x0f, 0xa9, 0x8a, 0xa7, 0x8e, 0x54, 0x15, 0x5f, 0x60, 0x7d, 0x26, 0xb9, 0xa8, 0x8a, 0x27, 0x7f, 0x48, 0x55, 0x3c, 0x75, 0xa4, 0xaa, 0xf8, 0x02, 0xeb, 0x33, 0xc9, 0x45,
0x88, 0x15, 0x54, 0x65, 0xde, 0x0c, 0x09, 0x71, 0x1c, 0xd9, 0x8f, 0x4a, 0x54, 0xcf, 0xd3, 0xc7, 0xac, 0xa0, 0x2a, 0xf3, 0x66, 0x48, 0x88, 0xe3, 0xc8, 0x7e, 0x54, 0xa2, 0x7a, 0x9e, 0x3e, 0x4e,
0xa9, 0x9e, 0x2b, 0x79, 0xd5, 0xb3, 0xf6, 0xf3, 0x02, 0x2c, 0xc4, 0x35, 0x27, 0x0a, 0xae, 0xdb, 0xf5, 0x5c, 0xc9, 0xad, 0x9e, 0xa9, 0x45, 0x78, 0x9e, 0xe9, 0x8f, 0x5c, 0xdf, 0xf0, 0x7c, 0x77,
0x50, 0xf5, 0xe5, 0xd5, 0x12, 0xda, 0x5a, 0x8d, 0xa7, 0x2f, 0xe9, 0x2b, 0xa8, 0x47, 0x4b, 0xd0, 0xcf, 0x1e, 0xe2, 0x56, 0x95, 0xb1, 0x30, 0x2b, 0xe1, 0x3b, 0x1c, 0xac, 0xfd, 0xb2, 0x00, 0x0b,
0xa7, 0xb9, 0x75, 0xf3, 0x85, 0x1c, 0x32, 0x2f, 0xac, 0x9c, 0x3b, 0x30, 0x17, 0x22, 0x1f, 0x5a, 0x71, 0x25, 0x8b, 0xda, 0xec, 0x36, 0x54, 0x7d, 0x79, 0x0b, 0x85, 0x62, 0x57, 0xe3, 0x99, 0x4e,
0x38, 0x2b, 0x85, 0x70, 0x31, 0x5e, 0x08, 0x3b, 0x50, 0xde, 0xc4, 0x4f, 0xed, 0x3e, 0xfe, 0x51, 0xfa, 0xb6, 0xea, 0xd1, 0x12, 0xf4, 0x69, 0x6e, 0x89, 0x7d, 0x21, 0x87, 0xcc, 0x0b, 0x8b, 0xec,
0xda, 0x50, 0xab, 0x50, 0xf3, 0xb0, 0x3f, 0xb2, 0x83, 0x20, 0xb4, 0xba, 0xaa, 0xae, 0x82, 0xb4, 0x0e, 0xcc, 0x85, 0xc8, 0x87, 0xd6, 0xd8, 0x4a, 0xcd, 0x5c, 0x8c, 0xd7, 0xcc, 0x0e, 0x94, 0x37,
0xbf, 0x4c, 0xc1, 0x6c, 0x52, 0xb2, 0xd7, 0x53, 0x75, 0x77, 0x3b, 0xba, 0x06, 0xc9, 0xf3, 0x29, 0xf1, 0x53, 0xbb, 0x8f, 0x7f, 0x94, 0x8e, 0xd5, 0x2a, 0xd4, 0x3c, 0xec, 0x8f, 0xec, 0x20, 0x08,
0x21, 0xee, 0xa2, 0xf4, 0xa2, 0xc5, 0x44, 0x92, 0x1d, 0x3a, 0x5a, 0xe1, 0x59, 0xe9, 0xf9, 0xfb, 0x0d, 0xb4, 0xaa, 0xab, 0x20, 0xed, 0xaf, 0x53, 0x30, 0x9b, 0x94, 0xec, 0xf5, 0x54, 0x89, 0xde,
0xee, 0x68, 0x64, 0x3a, 0x96, 0x6c, 0x11, 0x8a, 0x21, 0x95, 0x96, 0xe9, 0x0f, 0xa8, 0x6d, 0x53, 0x8e, 0x6e, 0x4c, 0xf2, 0x7c, 0x4a, 0x34, 0xbc, 0x28, 0x1d, 0x6e, 0x31, 0x91, 0x8f, 0x87, 0x3e,
0x30, 0xfb, 0x46, 0x67, 0xa0, 0x46, 0x93, 0x55, 0xdb, 0x61, 0x65, 0x3b, 0xb3, 0xdc, 0xaa, 0x0e, 0x59, 0x38, 0x61, 0x7a, 0xfe, 0xbe, 0x3b, 0x1a, 0x99, 0x8e, 0x25, 0xbb, 0x89, 0x62, 0x48, 0xa5,
0x02, 0xb4, 0x69, 0xfb, 0xe8, 0x3c, 0x4c, 0x62, 0xe7, 0xa9, 0x0c, 0x66, 0x51, 0x0f, 0x51, 0x7a, 0x65, 0xfa, 0x03, 0x7a, 0x0d, 0x28, 0x98, 0x7d, 0xa3, 0x33, 0x50, 0xa3, 0x79, 0xad, 0xed, 0xb0,
0x6f, 0x9d, 0x4d, 0xa3, 0x0b, 0x50, 0x1e, 0xb9, 0x63, 0x87, 0xc8, 0xb4, 0xb5, 0x11, 0x22, 0xb2, 0x0a, 0x9f, 0x19, 0x79, 0x55, 0x07, 0x01, 0xda, 0xb4, 0x7d, 0x74, 0x1e, 0x26, 0xb1, 0xf3, 0x54,
0xc6, 0x9f, 0x2e, 0x66, 0xd1, 0x25, 0x98, 0xb6, 0x98, 0x0e, 0x64, 0x6e, 0x3a, 0x1b, 0x95, 0xfe, 0xc6, 0xbd, 0xa8, 0xdd, 0x28, 0x1d, 0xbd, 0xce, 0xa6, 0xd1, 0x05, 0x28, 0x8f, 0xdc, 0xb1, 0x43,
0x0c, 0xae, 0xcb, 0x79, 0xf4, 0x7e, 0x18, 0x86, 0xab, 0x89, 0x40, 0x9a, 0x10, 0x6a, 0x66, 0x2c, 0x64, 0x86, 0xdb, 0x08, 0x11, 0x59, 0x8f, 0x50, 0x17, 0xb3, 0xe8, 0x12, 0x4c, 0x5b, 0x4c, 0x07,
0xbe, 0x1b, 0x8f, 0xc5, 0xc0, 0x48, 0x5c, 0xca, 0x25, 0x71, 0x78, 0xe1, 0x7e, 0x12, 0x2a, 0x43, 0x32, 0x8d, 0x9d, 0x8d, 0xba, 0x04, 0x0c, 0xae, 0xcb, 0x79, 0xf4, 0x7e, 0x18, 0xb1, 0xab, 0x89,
0x77, 0xc0, 0xed, 0xa0, 0xc6, 0xeb, 0xa9, 0xa1, 0x3b, 0x60, 0x66, 0xb0, 0x40, 0x73, 0x0f, 0xcb, 0x98, 0x9b, 0x10, 0x6a, 0x66, 0xd8, 0xbe, 0x1b, 0x0f, 0xdb, 0xc0, 0x48, 0x5c, 0xca, 0x25, 0x71,
0x76, 0x5a, 0x33, 0xec, 0x4e, 0xf2, 0x01, 0x0d, 0x29, 0xec, 0xc3, 0x70, 0x9d, 0x3e, 0x6e, 0xd5, 0x78, 0x8d, 0x7f, 0x12, 0x2a, 0x43, 0x77, 0xc0, 0xed, 0xa0, 0xc6, 0x4b, 0xaf, 0xa1, 0x3b, 0x60,
0xd9, 0x54, 0x95, 0x41, 0x1e, 0x38, 0x7d, 0x16, 0xf1, 0x08, 0x39, 0x68, 0x35, 0x18, 0x9c, 0x7e, 0x66, 0xb0, 0x40, 0xd3, 0x14, 0xcb, 0x76, 0x5a, 0x33, 0xec, 0xfa, 0xf2, 0x01, 0x8d, 0x3e, 0xec,
0xd2, 0x94, 0x91, 0x17, 0x0b, 0xb3, 0x89, 0x94, 0x31, 0xeb, 0x7e, 0xbe, 0x02, 0x9d, 0x81, 0x5f, 0xc3, 0x70, 0x9d, 0x3e, 0x6e, 0xd5, 0xd9, 0x54, 0x95, 0x41, 0x1e, 0x38, 0x7d, 0x16, 0x1c, 0x09,
0x17, 0x60, 0x71, 0x83, 0x65, 0x4c, 0x8a, 0x27, 0x38, 0x46, 0x65, 0x8b, 0xae, 0x86, 0x2d, 0x84, 0x39, 0x68, 0x35, 0x18, 0x9c, 0x7e, 0xd2, 0xec, 0x92, 0xd7, 0x15, 0xb3, 0x89, 0xec, 0x32, 0xeb,
0x64, 0x19, 0x9a, 0x3c, 0xac, 0xc0, 0x43, 0x1f, 0x42, 0x43, 0xd2, 0x14, 0x2b, 0x4b, 0x2f, 0x6a, 0x7e, 0xbe, 0x02, 0x4d, 0x84, 0xdf, 0x16, 0x60, 0x71, 0x83, 0x25, 0x57, 0x8a, 0x27, 0x38, 0x46,
0x3e, 0xd4, 0x03, 0x75, 0xa8, 0xbd, 0x0f, 0x4b, 0x29, 0x9e, 0x45, 0x76, 0x73, 0x16, 0x66, 0x22, 0x11, 0x8c, 0xae, 0x86, 0xdd, 0x86, 0x64, 0xc5, 0x9a, 0x3c, 0xac, 0xc0, 0x43, 0x1f, 0x42, 0x43,
0x8f, 0x10, 0xb2, 0x5c, 0x0b, 0x61, 0xdb, 0x96, 0x76, 0x13, 0x4e, 0xf4, 0x88, 0xe9, 0x93, 0xd4, 0xd2, 0x14, 0x2b, 0x4b, 0x2f, 0xea, 0x53, 0xd4, 0x03, 0x75, 0xa8, 0xbd, 0x0f, 0x4b, 0x29, 0x9e,
0x81, 0x8f, 0xb0, 0x96, 0xf5, 0x1f, 0xe2, 0x6b, 0x45, 0x8b, 0xa0, 0x07, 0x0b, 0x3d, 0xe2, 0x7a, 0x45, 0x22, 0x74, 0x16, 0x66, 0x22, 0x8f, 0x10, 0xb2, 0x5c, 0x0b, 0x61, 0xdb, 0x96, 0x76, 0x13,
0x2f, 0x41, 0x94, 0xde, 0x74, 0x7a, 0x6c, 0x77, 0x4c, 0x44, 0x4a, 0x23, 0x87, 0xda, 0x12, 0xef, 0x4e, 0xf4, 0x88, 0xe9, 0x93, 0xd4, 0x81, 0x8f, 0xb0, 0x96, 0xb5, 0x2a, 0xe2, 0x6b, 0x45, 0x37,
0x96, 0xa4, 0x77, 0x7b, 0x0f, 0x16, 0x79, 0xb3, 0xe2, 0x65, 0x0e, 0x71, 0x52, 0xb6, 0x4a, 0xd2, 0xa1, 0x07, 0x0b, 0x3d, 0xe2, 0x7a, 0x2f, 0x41, 0x94, 0xde, 0x74, 0x7a, 0x6c, 0x77, 0x4c, 0x44,
0x74, 0x37, 0x61, 0x3e, 0x72, 0xe5, 0x51, 0x75, 0x75, 0x25, 0x5e, 0x5d, 0x2d, 0xa5, 0x75, 0x1c, 0xf6, 0x23, 0x87, 0xda, 0x12, 0x6f, 0xac, 0xa4, 0x77, 0x7b, 0x0f, 0x16, 0x79, 0x5f, 0xe3, 0x65,
0x2b, 0xae, 0xfe, 0xb7, 0xa8, 0x38, 0xcc, 0x9c, 0xda, 0x6a, 0x3d, 0x5e, 0x5b, 0x9d, 0xca, 0x21, 0x0e, 0x71, 0x52, 0x76, 0x55, 0xd2, 0x74, 0x37, 0x61, 0x3e, 0x72, 0xe5, 0x51, 0x21, 0x76, 0x25,
0x19, 0x2b, 0xad, 0xd2, 0x16, 0x59, 0xca, 0xb0, 0x48, 0x3d, 0x55, 0x80, 0x4d, 0x32, 0xa7, 0xf1, 0x5e, 0x88, 0x2d, 0xa5, 0x75, 0x1c, 0xab, 0xc3, 0xfe, 0xbf, 0xa8, 0x38, 0xcc, 0x9c, 0x32, 0x6c,
0x46, 0x7a, 0x8b, 0x7f, 0x62, 0xfd, 0xb5, 0xcd, 0xeb, 0xaf, 0x70, 0xeb, 0xb0, 0x81, 0x74, 0x35, 0x3d, 0x5e, 0x86, 0x9d, 0xca, 0x21, 0x19, 0xab, 0xc2, 0xd2, 0x16, 0x59, 0xca, 0xb0, 0x48, 0x3d,
0x51, 0x7f, 0xb5, 0xf2, 0xd8, 0x0c, 0xcb, 0xaf, 0xff, 0x9e, 0x84, 0x6a, 0x38, 0x97, 0x12, 0x6c, 0x55, 0xab, 0x4d, 0x32, 0xa7, 0xf1, 0x46, 0x7a, 0x8b, 0x7f, 0x61, 0xa9, 0xb6, 0xcd, 0x4b, 0xb5,
0x5a, 0x48, 0xc5, 0x0c, 0x21, 0xa9, 0xf1, 0xab, 0xf4, 0x32, 0xf1, 0x6b, 0xf2, 0x45, 0xf1, 0x6b, 0x70, 0xeb, 0xb0, 0xd7, 0x74, 0x35, 0x51, 0xaa, 0xb5, 0xf2, 0xd8, 0x0c, 0x2b, 0xb5, 0xff, 0x9d,
0x19, 0xaa, 0xec, 0xc3, 0xf0, 0xf1, 0x9e, 0x88, 0x47, 0x15, 0x06, 0xd0, 0xf1, 0x5e, 0x64, 0x50, 0x84, 0x6a, 0x38, 0x97, 0x12, 0x6c, 0x5a, 0x48, 0xc5, 0x0c, 0x21, 0xa9, 0xf1, 0xab, 0xf4, 0x32,
0xe5, 0xa3, 0x18, 0x54, 0xa2, 0xd0, 0x9b, 0x4e, 0x16, 0x7a, 0xd7, 0xc3, 0x08, 0xc3, 0x63, 0xd1, 0xf1, 0x6b, 0xf2, 0x45, 0xf1, 0x6b, 0x19, 0xaa, 0xec, 0xc3, 0xf0, 0xf1, 0x9e, 0x88, 0x47, 0x15,
0x4a, 0x9a, 0x5c, 0x66, 0x6c, 0xd9, 0x8a, 0xc7, 0x16, 0x1e, 0x9e, 0x5e, 0xcb, 0x58, 0xfc, 0xca, 0x06, 0xd0, 0xf1, 0x5e, 0x64, 0x50, 0xe5, 0xa3, 0x18, 0x54, 0xa2, 0x26, 0x9c, 0x4e, 0xd6, 0x84,
0x96, 0x79, 0xf7, 0x78, 0x99, 0xa7, 0x5a, 0x95, 0x70, 0x84, 0xeb, 0x00, 0xe1, 0x9d, 0x97, 0xb5, 0xd7, 0xc3, 0x08, 0xc3, 0x63, 0xd1, 0x4a, 0x9a, 0x5c, 0x66, 0x6c, 0xd9, 0x8a, 0xc7, 0x16, 0x1e,
0x1e, 0x4a, 0x1f, 0x4d, 0x57, 0xb0, 0xa8, 0x57, 0x89, 0xc9, 0x3f, 0xea, 0x72, 0x1e, 0xc1, 0xab, 0x9e, 0x5e, 0xcb, 0x58, 0xfc, 0xca, 0x56, 0x84, 0xf7, 0x78, 0x45, 0xa8, 0x5a, 0x95, 0x70, 0x84,
0xfc, 0x52, 0xcd, 0x92, 0x72, 0xda, 0x81, 0xd7, 0x53, 0x9d, 0x81, 0xa3, 0x59, 0xdd, 0x95, 0x78, 0xeb, 0x00, 0xe1, 0x9d, 0x97, 0x65, 0x21, 0x4a, 0x1f, 0x4d, 0x57, 0xb0, 0xa8, 0x57, 0x89, 0xc9,
0x63, 0xe0, 0x78, 0xe6, 0x92, 0xea, 0x0b, 0xb0, 0xa0, 0x6e, 0xfa, 0x62, 0x9a, 0x97, 0x74, 0x55, 0x3f, 0x6a, 0x88, 0x1e, 0xc1, 0xab, 0xfc, 0x5a, 0xcd, 0x92, 0x72, 0x3a, 0x87, 0xd7, 0x53, 0x4d,
0x01, 0xe9, 0x10, 0x9a, 0x4a, 0xed, 0xd9, 0x8e, 0x1d, 0xec, 0xf3, 0xf9, 0x32, 0x9b, 0x07, 0x09, 0x84, 0xa3, 0x59, 0xdd, 0x95, 0x78, 0x0f, 0xe1, 0x78, 0xe6, 0x92, 0x6a, 0x21, 0xb0, 0xa0, 0x6e,
0xea, 0xb0, 0x9f, 0xa7, 0xf8, 0x99, 0x4d, 0x8c, 0xbe, 0x6b, 0x61, 0x66, 0x8c, 0x53, 0x7a, 0x85, 0xfa, 0x62, 0x9a, 0x57, 0x7f, 0x55, 0x01, 0xe9, 0x10, 0x9a, 0x4a, 0xed, 0xd9, 0x8e, 0x1d, 0xec,
0x02, 0x36, 0x5c, 0x0b, 0x47, 0x17, 0xa4, 0x72, 0xac, 0x0b, 0x52, 0x4d, 0x5c, 0x90, 0x45, 0x28, 0xf3, 0xf9, 0x32, 0x9b, 0x07, 0x09, 0xea, 0xb0, 0xff, 0xac, 0xf8, 0x99, 0x4d, 0x8c, 0xbe, 0x6b,
0xfb, 0xd8, 0x0c, 0x5c, 0xa7, 0x05, 0xfc, 0x17, 0x2c, 0x1f, 0xd1, 0x58, 0x31, 0xc2, 0x41, 0x40, 0x61, 0x66, 0x8c, 0x53, 0x7a, 0x85, 0x02, 0x36, 0x5c, 0x0b, 0x47, 0x17, 0xa4, 0x72, 0xac, 0x0b,
0x37, 0x10, 0x09, 0x8c, 0x18, 0x2a, 0x69, 0xd6, 0x4c, 0x5e, 0x9a, 0x75, 0x48, 0xbf, 0x31, 0x91, 0x52, 0x4d, 0x5c, 0x90, 0x45, 0x28, 0xfb, 0xd8, 0x0c, 0x5c, 0xa7, 0x05, 0xfc, 0x6f, 0x2d, 0x1f,
0x66, 0xd5, 0xf3, 0xd2, 0xac, 0xa3, 0xb4, 0x1b, 0x95, 0x24, 0xb2, 0x71, 0x58, 0x12, 0xf9, 0x53, 0xd1, 0x58, 0x31, 0xc2, 0x41, 0x40, 0x37, 0x10, 0x09, 0x8c, 0x18, 0x2a, 0x69, 0xd6, 0x4c, 0x5e,
0x5e, 0x9c, 0xbb, 0xb0, 0x94, 0x32, 0x75, 0x71, 0x73, 0xae, 0x26, 0xba, 0x92, 0xad, 0x3c, 0x29, 0x9a, 0x75, 0x48, 0x6b, 0x32, 0x91, 0x66, 0xd5, 0xf3, 0xd2, 0xac, 0xa3, 0x74, 0x26, 0x95, 0x24,
0x84, 0x4d, 0xc9, 0xff, 0x80, 0xd9, 0xad, 0x67, 0xb8, 0xdf, 0x3b, 0x70, 0xfa, 0xc7, 0x08, 0xfb, 0xb2, 0x71, 0x58, 0x12, 0xf9, 0x53, 0x5e, 0x9c, 0xbb, 0xb0, 0x94, 0x32, 0x75, 0x71, 0x73, 0xae,
0x4d, 0x28, 0xf5, 0x47, 0x96, 0x28, 0xc7, 0xe9, 0xa7, 0x9a, 0x08, 0x94, 0xe2, 0x89, 0x80, 0x01, 0x26, 0x1a, 0x98, 0xad, 0x3c, 0x29, 0x84, 0xfd, 0xcb, 0xff, 0x82, 0xd9, 0xad, 0x67, 0xb8, 0xdf,
0xcd, 0x68, 0x07, 0xc1, 0xe7, 0x22, 0xe5, 0xd3, 0xa2, 0xc8, 0x94, 0xf8, 0x8c, 0x2e, 0x46, 0x02, 0x3b, 0x70, 0xfa, 0xc7, 0x08, 0xfb, 0x4d, 0x28, 0xf5, 0x47, 0x96, 0xa8, 0xdc, 0xe9, 0xa7, 0x9a,
0x8e, 0x7d, 0x9f, 0x9d, 0x9a, 0xc3, 0xb1, 0xef, 0xc7, 0xcd, 0xb6, 0x14, 0x37, 0x5b, 0xed, 0x31, 0x08, 0x94, 0xe2, 0x89, 0x80, 0x01, 0xcd, 0x68, 0x07, 0xc1, 0xe7, 0x22, 0xe5, 0xd3, 0xa2, 0xc8,
0xd4, 0xe8, 0x06, 0x3f, 0x88, 0x7d, 0x91, 0x0d, 0x97, 0xa2, 0x6c, 0x38, 0x4c, 0xaa, 0x27, 0x95, 0x94, 0xf8, 0x8c, 0x2e, 0x46, 0x02, 0x8e, 0x7d, 0x9f, 0x9d, 0x9a, 0xc3, 0xb1, 0xef, 0xc7, 0xcd,
0xa4, 0x5a, 0x5b, 0x85, 0x19, 0xbe, 0x97, 0x38, 0x48, 0x13, 0x4a, 0x63, 0x7f, 0x28, 0xf5, 0x36, 0xb6, 0x14, 0x37, 0x5b, 0xed, 0x31, 0xd4, 0xe8, 0x06, 0x3f, 0x88, 0x7d, 0x91, 0x0d, 0x97, 0xa2,
0xf6, 0x87, 0xda, 0xbf, 0x43, 0xbd, 0x43, 0x88, 0xd9, 0xdf, 0x3f, 0x06, 0x3f, 0xe1, 0x5e, 0x45, 0x6c, 0x38, 0x4c, 0xaa, 0x27, 0x95, 0xa4, 0x5a, 0x5b, 0x85, 0x19, 0xbe, 0x97, 0x38, 0x48, 0x13,
0x35, 0x81, 0x4f, 0xf1, 0xa4, 0x69, 0xd0, 0x90, 0xb4, 0x73, 0xf7, 0xef, 0x02, 0xda, 0x71, 0x7d, 0x4a, 0x63, 0x7f, 0x28, 0xf5, 0x36, 0xf6, 0x87, 0xda, 0x7f, 0x42, 0xbd, 0x43, 0x88, 0xd9, 0xdf,
0x72, 0xc7, 0xf5, 0xbf, 0x36, 0x7d, 0xeb, 0x78, 0x09, 0x31, 0x82, 0x49, 0xf1, 0xee, 0xa2, 0x74, 0x3f, 0x06, 0x3f, 0xe1, 0x5e, 0x45, 0x35, 0x81, 0x4f, 0xf1, 0xa4, 0x69, 0xd0, 0x90, 0xb4, 0x73,
0x71, 0x4a, 0x67, 0xdf, 0xda, 0xeb, 0x30, 0x1f, 0xa3, 0x97, 0xbb, 0xf1, 0x0d, 0xa8, 0x31, 0x3f, 0xf7, 0xef, 0x02, 0xda, 0x71, 0x7d, 0x72, 0xc7, 0xf5, 0xbf, 0x36, 0x7d, 0xeb, 0x78, 0x09, 0x31,
0x21, 0x92, 0xa6, 0x8b, 0x6a, 0xcf, 0xed, 0x30, 0x67, 0x42, 0xcb, 0x6a, 0x1a, 0x08, 0x18, 0x3c, 0x82, 0x49, 0xf1, 0x44, 0xa3, 0x74, 0x71, 0x4a, 0x67, 0xdf, 0xda, 0xeb, 0x30, 0x1f, 0xa3, 0x97,
0xf4, 0xda, 0x6f, 0x26, 0x52, 0x8b, 0x85, 0xf8, 0xfa, 0x44, 0x5a, 0xf1, 0xab, 0x02, 0x4c, 0x31, 0xbb, 0xf1, 0x0d, 0xa8, 0x31, 0x3f, 0x21, 0x92, 0xa6, 0x8b, 0x6a, 0x7b, 0xee, 0x30, 0x67, 0x42,
0x78, 0xca, 0x6d, 0x2f, 0x43, 0xd5, 0xc7, 0x9e, 0x6b, 0x10, 0x73, 0x10, 0x3e, 0x65, 0xa1, 0x80, 0xcb, 0x6a, 0x1a, 0x08, 0x18, 0x3c, 0xf4, 0xda, 0x6f, 0x26, 0x52, 0x8b, 0x85, 0xf8, 0xfa, 0x44,
0x87, 0xe6, 0x20, 0x60, 0x2f, 0x71, 0xe8, 0xa4, 0x65, 0x0f, 0x70, 0x40, 0xe4, 0x7b, 0x96, 0x1a, 0x5a, 0xf1, 0x9b, 0x02, 0x4c, 0x31, 0x78, 0xca, 0x6d, 0x2f, 0x43, 0xd5, 0xc7, 0x9e, 0x6b, 0x10,
0x85, 0x6d, 0x72, 0x10, 0x15, 0x49, 0x60, 0xff, 0x27, 0xcf, 0x19, 0x26, 0x75, 0xf6, 0x8d, 0xce, 0x73, 0x10, 0xbe, 0x7a, 0xa1, 0x80, 0x87, 0xe6, 0x20, 0x60, 0x8f, 0x76, 0xe8, 0xa4, 0x65, 0x0f,
0xf3, 0xff, 0xe2, 0x87, 0xb4, 0x58, 0xd8, 0xcf, 0xf2, 0x36, 0x54, 0x12, 0x5d, 0x95, 0x70, 0xac, 0x70, 0x40, 0xe4, 0xd3, 0x97, 0x1a, 0x85, 0x6d, 0x72, 0x10, 0x15, 0x49, 0x60, 0xff, 0x37, 0xcf,
0xbd, 0x0f, 0x48, 0x3d, 0xb3, 0x10, 0xea, 0x05, 0x28, 0x33, 0x91, 0xc8, 0xa0, 0xd7, 0x88, 0x1f, 0x19, 0x26, 0x75, 0xf6, 0x8d, 0xce, 0xf3, 0x5f, 0xe8, 0x87, 0x74, 0x63, 0xd8, 0x7f, 0xf5, 0x36,
0x5a, 0x17, 0xb3, 0xda, 0x6d, 0x40, 0x5c, 0x8a, 0xb1, 0x40, 0x77, 0x74, 0x89, 0xbf, 0x07, 0xf3, 0x54, 0x12, 0x0d, 0x98, 0x70, 0xac, 0xbd, 0x0f, 0x48, 0x3d, 0xb3, 0x10, 0xea, 0x05, 0x28, 0x33,
0xb1, 0xf5, 0xe1, 0x6f, 0xd0, 0x18, 0x81, 0xe4, 0xee, 0x62, 0xf1, 0x1f, 0x0a, 0x00, 0x9d, 0x31, 0x91, 0xc8, 0xa0, 0xd7, 0x88, 0x1f, 0x5a, 0x17, 0xb3, 0xda, 0x6d, 0x40, 0x5c, 0x8a, 0xb1, 0x40,
0xd9, 0x17, 0xdd, 0x04, 0xf5, 0x94, 0x85, 0xf8, 0x29, 0xe9, 0x9c, 0x67, 0x06, 0xc1, 0xd7, 0xae, 0x77, 0x74, 0x89, 0xbf, 0x07, 0xf3, 0xb1, 0xf5, 0xe1, 0x1f, 0xd3, 0x18, 0x81, 0xe4, 0xee, 0x62,
0x2f, 0x33, 0xb9, 0x70, 0xcc, 0x3a, 0x01, 0x63, 0xb2, 0x2f, 0x5b, 0x88, 0xf4, 0x1b, 0x9d, 0x87, 0xf1, 0x1f, 0x0b, 0x00, 0x9d, 0x31, 0xd9, 0x17, 0xdd, 0x04, 0xf5, 0x94, 0x85, 0xf8, 0x29, 0xe9,
0x06, 0x7f, 0x81, 0x64, 0x98, 0x96, 0xe5, 0xe3, 0x20, 0x10, 0xbd, 0xc4, 0x3a, 0x87, 0x76, 0x38, 0x9c, 0x67, 0x06, 0xc1, 0xd7, 0xae, 0x2f, 0x33, 0xb9, 0x70, 0xcc, 0x3a, 0x01, 0x63, 0xb2, 0x2f,
0x90, 0xa2, 0xd9, 0x16, 0x76, 0x88, 0x4d, 0x0e, 0x0c, 0xe2, 0x3e, 0xc1, 0x8e, 0xc8, 0xd1, 0xea, 0xbb, 0x8d, 0xf4, 0x1b, 0x9d, 0x87, 0x06, 0x7f, 0xac, 0x64, 0x98, 0x96, 0xe5, 0xe3, 0x20, 0x10,
0x12, 0xfa, 0x90, 0x02, 0x29, 0x9a, 0x8f, 0x07, 0x76, 0x40, 0x7c, 0x89, 0x26, 0x7b, 0x5b, 0x02, 0x6d, 0xc7, 0x3a, 0x87, 0x76, 0x38, 0x90, 0xa2, 0xd9, 0x16, 0x76, 0x88, 0x4d, 0x0e, 0x0c, 0xe2,
0xca, 0xd0, 0xb4, 0x6f, 0x0b, 0xd0, 0xdc, 0x19, 0x0f, 0x87, 0xfc, 0x90, 0xc7, 0x95, 0x25, 0x7a, 0x3e, 0xc1, 0x8e, 0xc8, 0xd1, 0xea, 0x12, 0xfa, 0x90, 0x02, 0x29, 0x9a, 0x8f, 0x07, 0x76, 0x40,
0x5d, 0x9c, 0xa3, 0x98, 0xb0, 0x86, 0x48, 0x44, 0xe2, 0x70, 0x3f, 0xbc, 0x76, 0xbc, 0x0a, 0x73, 0x7c, 0x89, 0x26, 0xdb, 0x60, 0x02, 0xca, 0xd0, 0xb4, 0x6f, 0x0b, 0xd0, 0xdc, 0x19, 0x0f, 0x87,
0x0a, 0xa3, 0x42, 0x69, 0xb1, 0x50, 0x5c, 0x88, 0x87, 0x62, 0x6a, 0x28, 0xbc, 0x5c, 0x7a, 0xb9, 0xfc, 0x90, 0xc7, 0x95, 0x25, 0x7a, 0x5d, 0x9c, 0xa3, 0x98, 0xb0, 0x86, 0x48, 0x44, 0xe2, 0x70,
0xc3, 0x69, 0x27, 0x60, 0x3e, 0xb6, 0x5e, 0x94, 0x5a, 0x97, 0xa1, 0x2e, 0x7e, 0x38, 0x0a, 0x23, 0x3f, 0xbc, 0x76, 0xbc, 0x0a, 0x73, 0x0a, 0xa3, 0x42, 0x69, 0xb1, 0x50, 0x5c, 0x88, 0x87, 0x62,
0x38, 0x09, 0x15, 0xea, 0x5e, 0xfa, 0xb6, 0x25, 0x7b, 0xc7, 0xd3, 0x9e, 0x6b, 0x6d, 0xd8, 0x96, 0x6a, 0x28, 0xbc, 0x5c, 0x7a, 0xb9, 0xc3, 0x69, 0x27, 0x60, 0x3e, 0xb6, 0x5e, 0x94, 0x5a, 0x97,
0xaf, 0x75, 0xa1, 0xae, 0x73, 0xf2, 0x02, 0xf7, 0x16, 0x34, 0xc4, 0xef, 0x49, 0x23, 0xf6, 0x03, 0xa1, 0x2e, 0xfe, 0x4d, 0x0a, 0x23, 0x38, 0x09, 0x15, 0xea, 0x5e, 0xfa, 0xb6, 0x25, 0xdb, 0xcc,
0x3f, 0x6a, 0x74, 0xc6, 0x68, 0xeb, 0x75, 0x47, 0x1d, 0x6a, 0x5f, 0x42, 0xfb, 0x91, 0x67, 0xd1, 0xd3, 0x9e, 0x6b, 0x6d, 0xd8, 0x96, 0xaf, 0x75, 0xa1, 0xae, 0x73, 0xf2, 0x02, 0xf7, 0x16, 0x34,
0x8c, 0x49, 0xa5, 0x2a, 0x8f, 0x76, 0x0b, 0xe4, 0x0b, 0xb9, 0x3c, 0xe2, 0xf1, 0x65, 0x75, 0x5f, 0xc4, 0x9f, 0x4c, 0x23, 0xf6, 0xaf, 0x3f, 0xea, 0x89, 0xc6, 0x68, 0xeb, 0x75, 0x47, 0x1d, 0x6a,
0x1d, 0x6a, 0xa7, 0x61, 0x39, 0x93, 0xb8, 0x38, 0xb7, 0x07, 0xcd, 0x68, 0xc2, 0xb2, 0x65, 0xcb, 0x5f, 0x42, 0xfb, 0x91, 0x67, 0xd1, 0x8c, 0x49, 0xa5, 0x2a, 0x8f, 0x76, 0x0b, 0xe4, 0x63, 0xba,
0x9c, 0xb5, 0xc2, 0x0b, 0x4a, 0x2b, 0x7c, 0x31, 0x0c, 0xc3, 0xdc, 0xa1, 0x8b, 0x91, 0x92, 0x19, 0x3c, 0xe2, 0xf1, 0x65, 0x75, 0x5f, 0x1d, 0x6a, 0xa7, 0x61, 0x39, 0x93, 0xb8, 0x38, 0xb7, 0x07,
0x95, 0xf2, 0x32, 0xa3, 0xc9, 0x58, 0x66, 0xa4, 0x7d, 0x12, 0x4a, 0x4f, 0xa4, 0xa5, 0xef, 0xb2, 0xcd, 0x68, 0xc2, 0xb2, 0x65, 0x77, 0x9d, 0x75, 0xcd, 0x0b, 0x4a, 0xd7, 0x7c, 0x31, 0x0c, 0xc3,
0xdc, 0x98, 0xef, 0x2d, 0xdd, 0xc4, 0xc9, 0x8c, 0xc3, 0x71, 0x0c, 0x5d, 0x41, 0xd6, 0x66, 0xa1, 0xdc, 0xa1, 0x8b, 0x91, 0x92, 0x19, 0x95, 0xf2, 0x32, 0xa3, 0xc9, 0x58, 0x66, 0xa4, 0x7d, 0x12,
0x1e, 0x73, 0x18, 0xda, 0x87, 0xd0, 0x48, 0x78, 0x80, 0xb5, 0x44, 0xfe, 0x90, 0x12, 0x5b, 0x3c, 0x4a, 0x4f, 0xa4, 0xa5, 0xef, 0xb2, 0xdc, 0x98, 0xef, 0x2d, 0xdd, 0xc4, 0xc9, 0x8c, 0xc3, 0x71,
0x7b, 0xb8, 0x7c, 0x0a, 0x2a, 0xf2, 0x21, 0x1f, 0x9a, 0x86, 0xd2, 0xc3, 0x8d, 0x9d, 0xe6, 0x04, 0x0c, 0x5d, 0x41, 0xd6, 0x66, 0xa1, 0x1e, 0x73, 0x18, 0xda, 0x87, 0xd0, 0x48, 0x78, 0x80, 0xb5,
0xfd, 0x78, 0xb4, 0xb9, 0xd3, 0x2c, 0x5c, 0xbe, 0x09, 0xb3, 0x89, 0xbf, 0x5f, 0x68, 0x0e, 0xea, 0x44, 0xfe, 0x90, 0x12, 0x5b, 0x3c, 0x7b, 0xb8, 0x7c, 0x0a, 0x2a, 0xf2, 0xcd, 0x1f, 0x9a, 0x86,
0xbd, 0x4e, 0x77, 0xf3, 0xa3, 0x07, 0x9f, 0x1b, 0xfa, 0x56, 0x67, 0xf3, 0x8b, 0xe6, 0x04, 0x5a, 0xd2, 0xc3, 0x8d, 0x9d, 0xe6, 0x04, 0xfd, 0x78, 0xb4, 0xb9, 0xd3, 0x2c, 0x5c, 0xbe, 0x09, 0xb3,
0x80, 0xa6, 0x04, 0x75, 0x1f, 0x3c, 0xe4, 0xd0, 0xc2, 0xe5, 0x27, 0xd0, 0x88, 0x27, 0xc8, 0xe8, 0x89, 0x1f, 0x65, 0x68, 0x0e, 0xea, 0xbd, 0x4e, 0x77, 0xf3, 0xa3, 0x07, 0x9f, 0x1b, 0xfa, 0x56,
0x04, 0xcc, 0x6d, 0x3c, 0xe8, 0x3e, 0xec, 0x6c, 0x77, 0xb7, 0x74, 0x63, 0x43, 0xdf, 0xea, 0x3c, 0x67, 0xf3, 0x8b, 0xe6, 0x04, 0x5a, 0x80, 0xa6, 0x04, 0x75, 0x1f, 0x3c, 0xe4, 0xd0, 0xc2, 0xe5,
0xdc, 0xda, 0x6c, 0x4e, 0xc4, 0xc1, 0xfa, 0xa3, 0x6e, 0x77, 0xbb, 0xfb, 0x71, 0xb3, 0x40, 0xa9, 0x27, 0xd0, 0x88, 0x27, 0xc8, 0xe8, 0x04, 0xcc, 0x6d, 0x3c, 0xe8, 0x3e, 0xec, 0x6c, 0x77, 0xb7,
0x46, 0xe0, 0xad, 0xcf, 0xb7, 0x29, 0x72, 0x31, 0x8e, 0xfc, 0xa8, 0x7b, 0xb7, 0xfb, 0xe0, 0xdf, 0x74, 0x63, 0x43, 0xdf, 0xea, 0x3c, 0xdc, 0xda, 0x6c, 0x4e, 0xc4, 0xc1, 0xfa, 0xa3, 0x6e, 0x77,
0xba, 0xcd, 0xd2, 0xfa, 0x2f, 0x6a, 0xd0, 0x90, 0x07, 0xc4, 0x3e, 0x6b, 0xcf, 0xde, 0x86, 0x69, 0xbb, 0xfb, 0x71, 0xb3, 0x40, 0xa9, 0x46, 0xe0, 0xad, 0xcf, 0xb7, 0x29, 0x72, 0x31, 0x8e, 0xfc,
0xf9, 0xc6, 0x32, 0x4a, 0xd9, 0xe3, 0x0f, 0x42, 0xdb, 0xad, 0xf4, 0x84, 0x30, 0x94, 0x09, 0xb4, 0xa8, 0x7b, 0xb7, 0xfb, 0xe0, 0x3f, 0xba, 0xcd, 0xd2, 0xfa, 0xaf, 0x6a, 0xd0, 0x90, 0x07, 0xc4,
0xc3, 0x14, 0xa7, 0xfc, 0x69, 0x3c, 0xad, 0x8a, 0x32, 0xf5, 0x2b, 0xb3, 0xbd, 0x92, 0x37, 0x1d, 0x3e, 0x6b, 0xcf, 0xde, 0x86, 0x69, 0xf9, 0x1c, 0x33, 0x4a, 0xd9, 0xe3, 0x6f, 0x47, 0xdb, 0xad,
0x52, 0xec, 0x51, 0x6d, 0xa9, 0xef, 0x47, 0x50, 0xb4, 0x26, 0xf3, 0x5d, 0x4a, 0xfb, 0x4c, 0xee, 0xf4, 0x84, 0x30, 0x94, 0x09, 0xb4, 0xc3, 0x14, 0xa7, 0xfc, 0x94, 0x3c, 0xad, 0x8a, 0x32, 0xf5,
0x7c, 0x48, 0xf4, 0x0b, 0x68, 0x26, 0x5f, 0x8e, 0xa0, 0xa8, 0xcd, 0x9e, 0xf3, 0x2a, 0xa5, 0x7d, 0xd7, 0xb3, 0xbd, 0x92, 0x37, 0x1d, 0x52, 0xec, 0x51, 0x6d, 0xa9, 0x4f, 0x4d, 0x50, 0xb4, 0x26,
0xf6, 0x10, 0x0c, 0x95, 0x74, 0xea, 0x8d, 0xc5, 0x6a, 0xfe, 0x5f, 0xf2, 0x14, 0xe9, 0xbc, 0x5f, 0xf3, 0x09, 0x4b, 0xfb, 0x4c, 0xee, 0x7c, 0x48, 0xf4, 0x0b, 0x68, 0x26, 0x1f, 0x99, 0xa0, 0xa8,
0xef, 0x5c, 0x14, 0xf1, 0x3f, 0x84, 0x48, 0x7d, 0xd9, 0x90, 0xf1, 0xa7, 0x58, 0x11, 0x45, 0xf6, 0xcd, 0x9e, 0xf3, 0x80, 0xa5, 0x7d, 0xf6, 0x10, 0x0c, 0x95, 0x74, 0xea, 0x39, 0xc6, 0x6a, 0xfe,
0xaf, 0x45, 0x6d, 0x02, 0x7d, 0x06, 0xb3, 0x89, 0xce, 0x1c, 0x8a, 0x56, 0x65, 0xf7, 0x19, 0xdb, 0x0f, 0xf5, 0x14, 0xe9, 0xbc, 0xbf, 0xf4, 0x5c, 0x14, 0xf1, 0x9f, 0x89, 0x48, 0x7d, 0x04, 0x91,
0xab, 0xf9, 0x08, 0x71, 0xbd, 0xa9, 0x7d, 0xb7, 0x98, 0xde, 0x32, 0x9a, 0x79, 0x31, 0xbd, 0x65, 0xf1, 0x53, 0x59, 0x11, 0x45, 0xf6, 0x5f, 0x48, 0x6d, 0x02, 0x7d, 0x06, 0xb3, 0x89, 0xce, 0x1c,
0x36, 0xec, 0x98, 0x79, 0xc5, 0xba, 0x6b, 0x8a, 0x79, 0x65, 0xb5, 0xf2, 0xda, 0x2b, 0x79, 0xd3, 0x8a, 0x56, 0x65, 0xf7, 0x19, 0xdb, 0xab, 0xf9, 0x08, 0x71, 0xbd, 0xa9, 0x7d, 0xb7, 0x98, 0xde,
0xea, 0xf1, 0x13, 0x9d, 0x35, 0xe5, 0xf8, 0xd9, 0x0d, 0xbb, 0xf6, 0x6a, 0x3e, 0x42, 0x52, 0x57, 0x32, 0x9a, 0x79, 0x31, 0xbd, 0x65, 0x36, 0xec, 0x98, 0x79, 0xc5, 0xba, 0x6b, 0x8a, 0x79, 0x65,
0x51, 0x99, 0x9f, 0xd0, 0x55, 0xaa, 0xab, 0x94, 0xd0, 0x55, 0xba, 0x3f, 0x20, 0x74, 0x95, 0xa8, 0xb5, 0xf2, 0xda, 0x2b, 0x79, 0xd3, 0xea, 0xf1, 0x13, 0x9d, 0x35, 0xe5, 0xf8, 0xd9, 0x0d, 0xbb,
0xd7, 0xcf, 0xe4, 0x96, 0x3a, 0x69, 0x5d, 0x65, 0x57, 0x4f, 0xda, 0x04, 0xea, 0x40, 0x45, 0xd6, 0xf6, 0x6a, 0x3e, 0x42, 0x52, 0x57, 0x51, 0x99, 0x9f, 0xd0, 0x55, 0xaa, 0xab, 0x94, 0xd0, 0x55,
0x2a, 0x28, 0xba, 0xdd, 0x89, 0x02, 0xa9, 0x7d, 0x32, 0x63, 0x26, 0x24, 0xf1, 0x2f, 0x30, 0x49, 0xba, 0x3f, 0x20, 0x74, 0x95, 0xa8, 0xd7, 0xcf, 0xe4, 0x96, 0x3a, 0x69, 0x5d, 0x65, 0x57, 0x4f,
0xa1, 0x68, 0x21, 0x86, 0x24, 0x97, 0x9e, 0x48, 0x40, 0xc3, 0x65, 0xef, 0x41, 0x99, 0xa7, 0xf6, 0xda, 0x04, 0xea, 0x40, 0x45, 0xd6, 0x2a, 0x28, 0xba, 0xdd, 0x89, 0x02, 0xa9, 0x7d, 0x32, 0x63,
0x28, 0xf2, 0xb9, 0xb1, 0x3a, 0xa2, 0xbd, 0x94, 0x82, 0x87, 0x8b, 0x3f, 0xe1, 0xef, 0xae, 0x45, 0x26, 0x24, 0xf1, 0x6f, 0x30, 0x49, 0xa1, 0x68, 0x21, 0x86, 0x24, 0x97, 0x9e, 0x48, 0x40, 0xc3,
0x8e, 0x8e, 0x96, 0x63, 0x8f, 0x12, 0xe3, 0x95, 0x40, 0xfb, 0x54, 0xf6, 0x64, 0x48, 0x6b, 0x17, 0x65, 0xef, 0x41, 0x99, 0xa7, 0xf6, 0x28, 0xf2, 0xb9, 0xb1, 0x3a, 0xa2, 0xbd, 0x94, 0x82, 0x87,
0xe6, 0x33, 0x42, 0x20, 0x8a, 0x5a, 0x4b, 0xf9, 0xd1, 0xb7, 0x7d, 0xee, 0x70, 0x24, 0xf5, 0xb0, 0x8b, 0x3f, 0xe1, 0x4f, 0xb4, 0x45, 0x8e, 0x8e, 0x96, 0x63, 0xef, 0x17, 0xe3, 0x95, 0x40, 0xfb,
0x42, 0x6b, 0x8b, 0xaa, 0xa9, 0x2b, 0xca, 0x5a, 0x4a, 0xc1, 0xe5, 0xe2, 0xf5, 0xdf, 0x14, 0x61, 0x54, 0xf6, 0x64, 0x48, 0x6b, 0x17, 0xe6, 0x33, 0x42, 0x20, 0x8a, 0x5a, 0x4b, 0xf9, 0xd1, 0xb7,
0x86, 0x27, 0x2a, 0xc2, 0x55, 0x7f, 0x0c, 0x10, 0xe5, 0xd2, 0xa8, 0x1d, 0xb3, 0x9e, 0x58, 0x51, 0x7d, 0xee, 0x70, 0x24, 0xf5, 0xb0, 0x42, 0x6b, 0x8b, 0xaa, 0xa9, 0x2b, 0xca, 0x5a, 0x4a, 0xc1,
0xd1, 0x5e, 0xce, 0x9c, 0x53, 0xc5, 0xa8, 0xa4, 0xc5, 0x8a, 0x18, 0xd3, 0xc9, 0xb6, 0x22, 0xc6, 0xe5, 0xe2, 0xf5, 0xdf, 0x15, 0x61, 0x86, 0x27, 0x2a, 0xc2, 0x55, 0x7f, 0x0c, 0x10, 0xe5, 0xd2,
0x8c, 0x4c, 0x5a, 0x9b, 0x40, 0x9b, 0x50, 0x0d, 0x73, 0x35, 0xa4, 0xa4, 0x78, 0x89, 0x44, 0xb3, 0xa8, 0x1d, 0xb3, 0x9e, 0x58, 0x51, 0xd1, 0x5e, 0xce, 0x9c, 0x53, 0xc5, 0xa8, 0xa4, 0xc5, 0x8a,
0xdd, 0xce, 0x9a, 0x52, 0x39, 0x52, 0xf2, 0x2f, 0x85, 0xa3, 0x74, 0x56, 0xa7, 0x70, 0x94, 0x95, 0x18, 0xd3, 0xc9, 0xb6, 0x22, 0xc6, 0x8c, 0x4c, 0x5a, 0x9b, 0x40, 0x9b, 0x50, 0x0d, 0x73, 0x35,
0xb2, 0x4d, 0x7c, 0x74, 0xea, 0xbb, 0xef, 0x57, 0x0a, 0x7f, 0xfe, 0x7e, 0x65, 0xe2, 0xbf, 0x9e, 0xa4, 0xa4, 0x78, 0x89, 0x44, 0xb3, 0xdd, 0xce, 0x9a, 0x52, 0x39, 0x52, 0xf2, 0x2f, 0x85, 0xa3,
0xaf, 0x14, 0xbe, 0x7b, 0xbe, 0x52, 0xf8, 0xe3, 0xf3, 0x95, 0xc2, 0x5f, 0x9f, 0xaf, 0x14, 0xbe, 0x74, 0x56, 0xa7, 0x70, 0x94, 0x95, 0xb2, 0x4d, 0x7c, 0x74, 0xea, 0xbb, 0xef, 0x57, 0x0a, 0x7f,
0xf9, 0xdb, 0xca, 0xc4, 0x6e, 0x99, 0x3d, 0xc3, 0x7f, 0xfb, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf9, 0x7e, 0x65, 0xe2, 0x7f, 0x9e, 0xaf, 0x14, 0xbe, 0x7b, 0xbe, 0x52, 0xf8, 0xd3, 0xf3, 0x95,
0x60, 0x93, 0xd6, 0x21, 0x3a, 0x31, 0x00, 0x00, 0xc2, 0xdf, 0x9e, 0xaf, 0x14, 0xbe, 0xf9, 0xfb, 0xca, 0xc4, 0x6e, 0x99, 0xbd, 0xd8, 0x7f, 0xfb,
0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0e, 0x3a, 0x75, 0xdc, 0x65, 0x31, 0x00, 0x00,
} }

View File

@ -269,17 +269,7 @@ message PodSandboxConfig {
// and the CRI). Whenever possible, however, runtime authors SHOULD // and the CRI). Whenever possible, however, runtime authors SHOULD
// consider proposing new typed fields for any new features instead. // consider proposing new typed fields for any new features instead.
// //
// 1. AppArmor // 1. Seccomp
//
// key: container.apparmor.security.beta.kubernetes.io/<container_name>
// description: apparmor profile for a container in this pod.
// value:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
//
// 2. Seccomp
// //
// key: security.alpha.kubernetes.io/seccomp/pod // key: security.alpha.kubernetes.io/seccomp/pod
// description: the seccomp profile for the containers of an entire pod. // description: the seccomp profile for the containers of an entire pod.
@ -296,7 +286,7 @@ message PodSandboxConfig {
// local seccomp profile root. Note that profile root is set in // local seccomp profile root. Note that profile root is set in
// kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997. // kubelet, and it is not passed in CRI yet, see https://issues.k8s.io/36997.
// //
// 3. Sysctls // 2. Sysctls
// //
// key: security.alpha.kubernetes.io/sysctls // key: security.alpha.kubernetes.io/sysctls
// description: list of safe sysctls which are set for the sandbox. // description: list of safe sysctls which are set for the sandbox.
@ -526,6 +516,12 @@ message LinuxContainerSecurityContext {
// List of groups applied to the first process run in the container, in // List of groups applied to the first process run in the container, in
// addition to the container's primary GID. // addition to the container's primary GID.
repeated int64 supplemental_groups = 8; repeated int64 supplemental_groups = 8;
// AppArmor profile for the container, candidate values are:
// * runtime/default: equivalent to not specifying a profile.
// * localhost/<profile_name>: profile loaded on the node
// (localhost) by name. The possible profile names are detailed at
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
string apparmor_profile = 9;
} }
// LinuxContainerConfig contains platform-specific configuration for // LinuxContainerConfig contains platform-specific configuration for

View File

@ -145,7 +145,6 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi
// Apply Linux-specific options if applicable. // Apply Linux-specific options if applicable.
if lc := config.GetLinux(); lc != nil { if lc := config.GetLinux(); lc != nil {
// Apply resource options.
// TODO: Check if the units are correct. // TODO: Check if the units are correct.
// TODO: Can we assume the defaults are sane? // TODO: Can we assume the defaults are sane?
rOpts := lc.GetResources() rOpts := lc.GetResources()
@ -162,7 +161,9 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi
// Note: ShmSize is handled in kube_docker_client.go // Note: ShmSize is handled in kube_docker_client.go
// Apply security context. // Apply security context.
applyContainerSecurityContext(lc, podSandboxID, createConfig.Config, hc, securityOptSep) if err = applyContainerSecurityContext(lc, podSandboxID, createConfig.Config, hc, securityOptSep); err != nil {
return "", fmt.Errorf("failed to apply container security context for container %q: %v", config.Metadata.Name, err)
}
modifyPIDNamespaceOverrides(ds.disableSharedPID, apiVersion, hc) modifyPIDNamespaceOverrides(ds.disableSharedPID, apiVersion, hc)
} }
@ -187,12 +188,12 @@ func (ds *dockerService) CreateContainer(podSandboxID string, config *runtimeapi
} }
hc.Resources.Devices = devices hc.Resources.Devices = devices
// Apply appArmor and seccomp options. // Apply seccomp options.
securityOpts, err := getContainerSecurityOpts(config.Metadata.Name, sandboxConfig, ds.seccompProfileRoot, securityOptSep) seccompSecurityOpts, err := getSeccompSecurityOpts(config.Metadata.Name, sandboxConfig, ds.seccompProfileRoot, securityOptSep)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to generate container security options for container %q: %v", config.Metadata.Name, err) return "", fmt.Errorf("failed to generate seccomp security options for container %q: %v", config.Metadata.Name, err)
} }
hc.SecurityOpt = append(hc.SecurityOpt, securityOpts...) hc.SecurityOpt = append(hc.SecurityOpt, seccompSecurityOpts...)
createConfig.HostConfig = hc createConfig.HostConfig = hc
createResp, err := ds.client.CreateContainer(createConfig) createResp, err := ds.client.CreateContainer(createConfig)

View File

@ -475,7 +475,9 @@ func (ds *dockerService) applySandboxLinuxOptions(hc *dockercontainer.HostConfig
} }
hc.CgroupParent = cgroupParent hc.CgroupParent = cgroupParent
// Apply security context. // Apply security context.
applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator) if err = applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator); err != nil {
return err
}
return nil return nil
} }
@ -541,7 +543,7 @@ func (ds *dockerService) makeSandboxDockerConfig(c *runtimeapi.PodSandboxConfig,
} }
// Set security options. // Set security options.
securityOpts, err := getSandboxSecurityOpts(c, ds.seccompProfileRoot, securityOptSep) securityOpts, err := getSeccompSecurityOpts(sandboxContainerName, c, ds.seccompProfileRoot, securityOptSep)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to generate sandbox security options for sandbox %q: %v", c.Metadata.Name, err) return nil, fmt.Errorf("failed to generate sandbox security options for sandbox %q: %v", c.Metadata.Name, err)
} }

View File

@ -181,26 +181,32 @@ func makePortsAndBindings(pm []*runtimeapi.PortMapping) (map[dockernat.Port]stru
return exposedPorts, portBindings return exposedPorts, portBindings
} }
// getContainerSecurityOpt gets container security options from container and sandbox config, currently from sandbox // getSeccompSecurityOpts gets container seccomp options from container and sandbox
// annotations. // config, currently from sandbox annotations.
// It is an experimental feature and may be promoted to official runtime api in the future. // It is an experimental feature and may be promoted to official runtime api in the future.
func getContainerSecurityOpts(containerName string, sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) { func getSeccompSecurityOpts(containerName string, sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) {
appArmorOpts, err := dockertools.GetAppArmorOpts(sandboxConfig.GetAnnotations(), containerName)
if err != nil {
return nil, err
}
seccompOpts, err := dockertools.GetSeccompOpts(sandboxConfig.GetAnnotations(), containerName, seccompProfileRoot) seccompOpts, err := dockertools.GetSeccompOpts(sandboxConfig.GetAnnotations(), containerName, seccompProfileRoot)
if err != nil { if err != nil {
return nil, err return nil, err
} }
securityOpts := append(appArmorOpts, seccompOpts...)
fmtOpts := dockertools.FmtDockerOpts(securityOpts, separator) fmtOpts := dockertools.FmtDockerOpts(seccompOpts, separator)
return fmtOpts, nil return fmtOpts, nil
} }
func getSandboxSecurityOpts(sandboxConfig *runtimeapi.PodSandboxConfig, seccompProfileRoot string, separator rune) ([]string, error) { // getApparmorSecurityOpts gets apparmor options from container config.
// sandboxContainerName doesn't exist in the pod, so pod security options will be returned by default. func getApparmorSecurityOpts(sc *runtimeapi.LinuxContainerSecurityContext, separator rune) ([]string, error) {
return getContainerSecurityOpts(sandboxContainerName, sandboxConfig, seccompProfileRoot, separator) if sc == nil || sc.ApparmorProfile == "" {
return nil, nil
}
appArmorOpts, err := dockertools.GetAppArmorOpts(sc.ApparmorProfile)
if err != nil {
return nil, err
}
fmtOpts := dockertools.FmtDockerOpts(appArmorOpts, separator)
return fmtOpts, nil
} }
func getNetworkNamespace(c *dockertypes.ContainerJSON) string { func getNetworkNamespace(c *dockertypes.ContainerJSON) string {

View File

@ -43,10 +43,10 @@ func TestLabelsAndAnnotationsRoundTrip(t *testing.T) {
assert.Equal(t, expectedAnnotations, actualAnnotations) assert.Equal(t, expectedAnnotations, actualAnnotations)
} }
// TestGetContainerSecurityOpts tests the logic of generating container security options from sandbox annotations. // TestGetSeccompSecurityOpts tests the logic of generating container seccomp options from sandbox annotations.
// The actual profile loading logic is tested in dockertools. // The actual profile loading logic is tested in dockertools.
// TODO: Migrate the corresponding test to dockershim. // TODO: Migrate the corresponding test to dockershim.
func TestGetContainerSecurityOpts(t *testing.T) { func TestGetSeccompSecurityOpts(t *testing.T) {
containerName := "bar" containerName := "bar"
makeConfig := func(annotations map[string]string) *runtimeapi.PodSandboxConfig { makeConfig := func(annotations map[string]string) *runtimeapi.PodSandboxConfig {
return makeSandboxConfigWithLabelsAndAnnotations("pod", "ns", "1234", 1, nil, annotations) return makeSandboxConfigWithLabelsAndAnnotations("pod", "ns", "1234", 1, nil, annotations)
@ -78,29 +78,10 @@ func TestGetContainerSecurityOpts(t *testing.T) {
v1.SeccompPodAnnotationKey: "docker/default", v1.SeccompPodAnnotationKey: "docker/default",
}), }),
expectedOpts: nil, expectedOpts: nil,
}, {
msg: "AppArmor runtime/default",
config: makeConfig(map[string]string{
apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileRuntimeDefault,
}),
expectedOpts: []string{"seccomp=unconfined"},
}, {
msg: "AppArmor local profile",
config: makeConfig(map[string]string{
apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileNamePrefix + "foo",
}),
expectedOpts: []string{"seccomp=unconfined", "apparmor=foo"},
}, {
msg: "AppArmor and seccomp profile",
config: makeConfig(map[string]string{
v1.SeccompContainerAnnotationKeyPrefix + containerName: "docker/default",
apparmor.ContainerAnnotationKeyPrefix + containerName: apparmor.ProfileNamePrefix + "foo",
}),
expectedOpts: []string{"apparmor=foo"},
}} }}
for i, test := range tests { for i, test := range tests {
opts, err := getContainerSecurityOpts(containerName, test.config, "test/seccomp/profile/root", '=') opts, err := getSeccompSecurityOpts(containerName, test.config, "test/seccomp/profile/root", '=')
assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg) assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg)
assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg) assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg)
for _, opt := range test.expectedOpts { for _, opt := range test.expectedOpts {
@ -109,43 +90,36 @@ func TestGetContainerSecurityOpts(t *testing.T) {
} }
} }
// TestGetSandboxSecurityOpts tests the logic of generating sandbox security options from sandbox annotations. // TestGetApparmorSecurityOpts tests the logic of generating container apparmor options from sandbox annotations.
func TestGetSandboxSecurityOpts(t *testing.T) { // The actual profile loading logic is tested in dockertools.
makeConfig := func(annotations map[string]string) *runtimeapi.PodSandboxConfig { // TODO: Migrate the corresponding test to dockershim.
return makeSandboxConfigWithLabelsAndAnnotations("pod", "ns", "1234", 1, nil, annotations) func TestGetApparmorSecurityOpts(t *testing.T) {
makeConfig := func(profile string) *runtimeapi.LinuxContainerSecurityContext {
return &runtimeapi.LinuxContainerSecurityContext{
ApparmorProfile: profile,
}
} }
tests := []struct { tests := []struct {
msg string msg string
config *runtimeapi.PodSandboxConfig config *runtimeapi.LinuxContainerSecurityContext
expectedOpts []string expectedOpts []string
}{{ }{{
msg: "No security annotations", msg: "No AppArmor options",
config: makeConfig(nil), config: makeConfig(""),
expectedOpts: []string{"seccomp=unconfined"},
}, {
msg: "Seccomp default",
config: makeConfig(map[string]string{
v1.SeccompPodAnnotationKey: "docker/default",
}),
expectedOpts: nil, expectedOpts: nil,
}, { }, {
msg: "Seccomp unconfined", msg: "AppArmor runtime/default",
config: makeConfig(map[string]string{ config: makeConfig("runtime/default"),
v1.SeccompPodAnnotationKey: "unconfined", expectedOpts: []string{},
}),
expectedOpts: []string{"seccomp=unconfined"},
}, { }, {
msg: "Seccomp pod and container profile", msg: "AppArmor local profile",
config: makeConfig(map[string]string{ config: makeConfig(apparmor.ProfileNamePrefix + "foo"),
v1.SeccompContainerAnnotationKeyPrefix + "test-container": "unconfined", expectedOpts: []string{"apparmor=foo"},
v1.SeccompPodAnnotationKey: "docker/default",
}),
expectedOpts: nil,
}} }}
for i, test := range tests { for i, test := range tests {
opts, err := getSandboxSecurityOpts(test.config, "test/seccomp/profile/root", '=') opts, err := getApparmorSecurityOpts(test.config, '=')
assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg) assert.NoError(t, err, "TestCase[%d]: %s", i, test.msg)
assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg) assert.Len(t, opts, len(test.expectedOpts), "TestCase[%d]: %s", i, test.msg)
for _, opt := range test.expectedOpts { for _, opt := range test.expectedOpts {

View File

@ -31,9 +31,9 @@ import (
) )
// applySandboxSecurityContext updates docker sandbox options according to security context. // applySandboxSecurityContext updates docker sandbox options according to security context.
func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *dockercontainer.Config, hc *dockercontainer.HostConfig, network *knetwork.PluginManager, separator rune) { func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *dockercontainer.Config, hc *dockercontainer.HostConfig, network *knetwork.PluginManager, separator rune) error {
if lc == nil { if lc == nil {
return return nil
} }
var sc *runtimeapi.LinuxContainerSecurityContext var sc *runtimeapi.LinuxContainerSecurityContext
@ -48,20 +48,25 @@ func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *d
} }
modifyContainerConfig(sc, config) modifyContainerConfig(sc, config)
modifyHostConfig(sc, hc, separator) if err := modifyHostConfig(sc, hc, separator); err != nil {
return err
}
modifySandboxNamespaceOptions(sc.GetNamespaceOptions(), hc, network) modifySandboxNamespaceOptions(sc.GetNamespaceOptions(), hc, network)
return nil
} }
// applyContainerSecurityContext updates docker container options according to security context. // applyContainerSecurityContext updates docker container options according to security context.
func applyContainerSecurityContext(lc *runtimeapi.LinuxContainerConfig, sandboxID string, config *dockercontainer.Config, hc *dockercontainer.HostConfig, separator rune) { func applyContainerSecurityContext(lc *runtimeapi.LinuxContainerConfig, sandboxID string, config *dockercontainer.Config, hc *dockercontainer.HostConfig, separator rune) error {
if lc == nil { if lc == nil {
return return nil
} }
modifyContainerConfig(lc.SecurityContext, config) modifyContainerConfig(lc.SecurityContext, config)
modifyHostConfig(lc.SecurityContext, hc, separator) if err := modifyHostConfig(lc.SecurityContext, hc, separator); err != nil {
return err
}
modifyContainerNamespaceOptions(lc.SecurityContext.GetNamespaceOptions(), sandboxID, hc) modifyContainerNamespaceOptions(lc.SecurityContext.GetNamespaceOptions(), sandboxID, hc)
return return nil
} }
// modifyContainerConfig applies container security context config to dockercontainer.Config. // modifyContainerConfig applies container security context config to dockercontainer.Config.
@ -78,9 +83,9 @@ func modifyContainerConfig(sc *runtimeapi.LinuxContainerSecurityContext, config
} }
// modifyHostConfig applies security context config to dockercontainer.HostConfig. // modifyHostConfig applies security context config to dockercontainer.HostConfig.
func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *dockercontainer.HostConfig, separator rune) { func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *dockercontainer.HostConfig, separator rune) error {
if sc == nil { if sc == nil {
return return nil
} }
// Apply supplemental groups. // Apply supplemental groups.
@ -107,6 +112,15 @@ func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *
separator, separator,
) )
} }
// Apply apparmor options.
apparmorSecurityOpts, err := getApparmorSecurityOpts(sc, separator)
if err != nil {
return fmt.Errorf("failed to generate apparmor security options: %v", err)
}
hostConfig.SecurityOpt = append(hostConfig.SecurityOpt, apparmorSecurityOpts...)
return nil
} }
// modifySandboxNamespaceOptions apply namespace options for sandbox // modifySandboxNamespaceOptions apply namespace options for sandbox

View File

@ -1260,13 +1260,13 @@ func GetSeccompOpts(annotations map[string]string, ctrName, profileRoot string)
// Get the docker security options for AppArmor. // Get the docker security options for AppArmor.
func (dm *DockerManager) getAppArmorOpts(pod *v1.Pod, ctrName string) ([]dockerOpt, error) { func (dm *DockerManager) getAppArmorOpts(pod *v1.Pod, ctrName string) ([]dockerOpt, error) {
return GetAppArmorOpts(pod.Annotations, ctrName) profile := apparmor.GetProfileNameFromPodAnnotations(pod.Annotations, ctrName)
return GetAppArmorOpts(profile)
} }
// Temporarily export this function to share with dockershim. // Temporarily export this function to share with dockershim.
// TODO: clean this up. // TODO: clean this up.
func GetAppArmorOpts(annotations map[string]string, ctrName string) ([]dockerOpt, error) { func GetAppArmorOpts(profile string) ([]dockerOpt, error) {
profile := apparmor.GetProfileNameFromPodAnnotations(annotations, ctrName)
if profile == "" || profile == apparmor.ProfileRuntimeDefault { if profile == "" || profile == apparmor.ProfileRuntimeDefault {
// The docker applies the default profile by default. // The docker applies the default profile by default.
return nil, nil return nil, nil

View File

@ -45,6 +45,7 @@ go_library(
"//pkg/kubelet/types:go_default_library", "//pkg/kubelet/types:go_default_library",
"//pkg/kubelet/util/cache:go_default_library", "//pkg/kubelet/util/cache:go_default_library",
"//pkg/kubelet/util/format:go_default_library", "//pkg/kubelet/util/format:go_default_library",
"//pkg/security/apparmor:go_default_library",
"//pkg/securitycontext:go_default_library", "//pkg/securitycontext:go_default_library",
"//pkg/util/parsers:go_default_library", "//pkg/util/parsers:go_default_library",
"//pkg/util/selinux:go_default_library", "//pkg/util/selinux:go_default_library",

View File

@ -21,6 +21,7 @@ import (
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
runtimeapi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime" runtimeapi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
"k8s.io/kubernetes/pkg/security/apparmor"
"k8s.io/kubernetes/pkg/securitycontext" "k8s.io/kubernetes/pkg/securitycontext"
) )
@ -32,6 +33,9 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po
synthesized = &runtimeapi.LinuxContainerSecurityContext{} synthesized = &runtimeapi.LinuxContainerSecurityContext{}
} }
// set ApparmorProfile.
synthesized.ApparmorProfile = apparmor.GetProfileNameFromPodAnnotations(pod.Annotations, container.Name)
// set RunAsUser. // set RunAsUser.
if synthesized.RunAsUser == nil { if synthesized.RunAsUser == nil {
if uid != nil { if uid != nil {