Merge pull request #75993 from caesarxuchao/add-count

Adding RemainingItemCount to ListMeta
This commit is contained in:
Kubernetes Prow Robot 2019-05-06 22:53:40 -07:00 committed by GitHub
commit 1fb8ed12a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 321 additions and 223 deletions

View File

@ -17442,6 +17442,11 @@
"description": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.",
"type": "string"
},
"remainingItemCount": {
"description": "RemainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and this field will be unset. If the list is complete (either because it is unpaginated or because this is the last page), then there are no more remaining items and this field will also be unset. Servers older than v1.15 do not set this field.",
"format": "int64",
"type": "integer"
},
"resourceVersion": {
"description": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency",
"type": "string"

View File

@ -1851,6 +1851,13 @@ func schema_pkg_apis_meta_v1_ListMeta(ref common.ReferenceCallback) common.OpenA
Format: "",
},
},
"remainingItemCount": {
SchemaProps: spec.SchemaProps{
Description: "RemainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and this field will be unset. If the list is complete (either because it is unpaginated or because this is the last page), then there are no more remaining items and this field will also be unset. Servers older than v1.15 do not set this field.",
Type: []string{"integer"},
Format: "int64",
},
},
},
},
},

View File

@ -1199,6 +1199,9 @@ func (m *ListMeta) MarshalTo(dAtA []byte) (int, error) {
i++
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Continue)))
i += copy(dAtA[i:], m.Continue)
dAtA[i] = 0x20
i++
i = encodeVarintGenerated(dAtA, i, uint64(m.RemainingItemCount))
return i, nil
}
@ -2388,6 +2391,7 @@ func (m *ListMeta) Size() (n int) {
n += 1 + l + sovGenerated(uint64(l))
l = len(m.Continue)
n += 1 + l + sovGenerated(uint64(l))
n += 1 + sovGenerated(uint64(m.RemainingItemCount))
return n
}
@ -2940,6 +2944,7 @@ func (this *ListMeta) String() string {
`SelfLink:` + fmt.Sprintf("%v", this.SelfLink) + `,`,
`ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`,
`Continue:` + fmt.Sprintf("%v", this.Continue) + `,`,
`RemainingItemCount:` + fmt.Sprintf("%v", this.RemainingItemCount) + `,`,
`}`,
}, "")
return s
@ -6185,6 +6190,25 @@ func (m *ListMeta) Unmarshal(dAtA []byte) error {
}
m.Continue = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field RemainingItemCount", wireType)
}
m.RemainingItemCount = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.RemainingItemCount |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
@ -9497,180 +9521,182 @@ func init() {
}
var fileDescriptorGenerated = []byte{
// 2796 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0x4d, 0x6c, 0x23, 0x57,
// 2825 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0xcf, 0x6f, 0x23, 0x57,
0x39, 0x63, 0xc7, 0x8e, 0xfd, 0x39, 0xde, 0x4d, 0xde, 0xee, 0x82, 0x1b, 0x44, 0x9c, 0x4e, 0x51,
0xb5, 0x85, 0xad, 0xd3, 0xdd, 0xd2, 0x6a, 0xd9, 0xd2, 0x42, 0x9c, 0x9f, 0x6d, 0xe8, 0xa6, 0x89,
0x5e, 0x76, 0x17, 0xb1, 0xac, 0x50, 0x27, 0x9e, 0x17, 0x67, 0xc8, 0x78, 0xc6, 0x7d, 0x6f, 0x9c,
0x5d, 0xc3, 0x81, 0x1e, 0x40, 0x80, 0x04, 0x55, 0x8f, 0x9c, 0x50, 0x2b, 0xb8, 0x70, 0xe5, 0xc4,
0x89, 0x53, 0x25, 0x7a, 0x41, 0xaa, 0xc4, 0x81, 0x1e, 0x90, 0xd5, 0x06, 0x24, 0xb8, 0x71, 0xcf,
0x09, 0xbd, 0xbf, 0x99, 0x37, 0x76, 0xbc, 0x19, 0xb3, 0xa5, 0xe2, 0xe4, 0x99, 0xef, 0xff, 0xbd,
0xf7, 0xbd, 0xef, 0x6f, 0x0c, 0x5b, 0x87, 0xd7, 0x59, 0xc3, 0x0b, 0x97, 0x0f, 0x7b, 0x7b, 0x84,
0x06, 0x24, 0x22, 0x6c, 0xf9, 0x88, 0x04, 0x6e, 0x48, 0x97, 0x15, 0xc2, 0xe9, 0x7a, 0x1d, 0xa7,
0x75, 0xe0, 0x05, 0x84, 0xf6, 0x97, 0xbb, 0x87, 0x6d, 0x0e, 0x60, 0xcb, 0x1d, 0x12, 0x39, 0xcb,
0x47, 0x57, 0x97, 0xdb, 0x24, 0x20, 0xd4, 0x89, 0x88, 0xdb, 0xe8, 0xd2, 0x30, 0x0a, 0xd1, 0x97,
0x24, 0x57, 0xc3, 0xe4, 0x6a, 0x74, 0x0f, 0xdb, 0x1c, 0xc0, 0x1a, 0x9c, 0xab, 0x71, 0x74, 0x75,
0xe1, 0xd9, 0xb6, 0x17, 0x1d, 0xf4, 0xf6, 0x1a, 0xad, 0xb0, 0xb3, 0xdc, 0x0e, 0xdb, 0xe1, 0xb2,
0x60, 0xde, 0xeb, 0xed, 0x8b, 0x37, 0xf1, 0x22, 0x9e, 0xa4, 0xd0, 0x85, 0xb1, 0xa6, 0xd0, 0x5e,
0x10, 0x79, 0x1d, 0x32, 0x6c, 0xc5, 0xc2, 0x8b, 0x67, 0x31, 0xb0, 0xd6, 0x01, 0xe9, 0x38, 0xc3,
0x7c, 0xf6, 0x9f, 0xf2, 0x50, 0x5a, 0xd9, 0xd9, 0xbc, 0x49, 0xc3, 0x5e, 0x17, 0x2d, 0xc1, 0x74,
0xe0, 0x74, 0x48, 0xcd, 0x5a, 0xb2, 0x2e, 0x97, 0x9b, 0xb3, 0x1f, 0x0c, 0xea, 0x53, 0xc7, 0x83,
0xfa, 0xf4, 0xeb, 0x4e, 0x87, 0x60, 0x81, 0x41, 0x3e, 0x94, 0x8e, 0x08, 0x65, 0x5e, 0x18, 0xb0,
0x5a, 0x6e, 0x29, 0x7f, 0xb9, 0x72, 0xed, 0x95, 0x46, 0x96, 0xf5, 0x37, 0x84, 0x82, 0xbb, 0x92,
0x75, 0x23, 0xa4, 0x6b, 0x1e, 0x6b, 0x85, 0x47, 0x84, 0xf6, 0x9b, 0x73, 0x4a, 0x4b, 0x49, 0x21,
0x19, 0x8e, 0x35, 0xa0, 0x1f, 0x5b, 0x30, 0xd7, 0xa5, 0x64, 0x9f, 0x50, 0x4a, 0x5c, 0x85, 0xaf,
0xe5, 0x97, 0xac, 0x4f, 0x41, 0x6d, 0x4d, 0xa9, 0x9d, 0xdb, 0x19, 0x92, 0x8f, 0x47, 0x34, 0xa2,
0xdf, 0x58, 0xb0, 0xc0, 0x08, 0x3d, 0x22, 0x74, 0xc5, 0x75, 0x29, 0x61, 0xac, 0xd9, 0x5f, 0xf5,
0x3d, 0x12, 0x44, 0xab, 0x9b, 0x6b, 0x98, 0xd5, 0xa6, 0xc5, 0x3e, 0x7c, 0x23, 0x9b, 0x41, 0xbb,
0xe3, 0xe4, 0x34, 0x6d, 0x65, 0xd1, 0xc2, 0x58, 0x12, 0x86, 0x1f, 0x61, 0x86, 0xbd, 0x0f, 0xb3,
0xfa, 0x20, 0x6f, 0x79, 0x2c, 0x42, 0x77, 0xa1, 0xd8, 0xe6, 0x2f, 0xac, 0x66, 0x09, 0x03, 0x1b,
0xd9, 0x0c, 0xd4, 0x32, 0x9a, 0xe7, 0x94, 0x3d, 0x45, 0xf1, 0xca, 0xb0, 0x92, 0x66, 0xff, 0x7c,
0x1a, 0x2a, 0x2b, 0x3b, 0x9b, 0x98, 0xb0, 0xb0, 0x47, 0x5b, 0x24, 0x83, 0xd3, 0x5c, 0x03, 0xe0,
0xbf, 0xac, 0xeb, 0xb4, 0x88, 0x5b, 0xcb, 0x2d, 0x59, 0x97, 0x4b, 0x4d, 0xa4, 0xe8, 0xe0, 0xf5,
0x18, 0x83, 0x0d, 0x2a, 0x2e, 0xf5, 0xd0, 0x0b, 0x5c, 0x71, 0xda, 0x86, 0xd4, 0xd7, 0xbc, 0xc0,
0xc5, 0x02, 0x83, 0x6e, 0x41, 0xe1, 0x88, 0xd0, 0x3d, 0xbe, 0xff, 0xdc, 0x21, 0xbe, 0x92, 0x6d,
0x79, 0x77, 0x39, 0x4b, 0xb3, 0x7c, 0x3c, 0xa8, 0x17, 0xc4, 0x23, 0x96, 0x42, 0x50, 0x03, 0x80,
0x1d, 0x84, 0x34, 0x12, 0xe6, 0xd4, 0x0a, 0x4b, 0xf9, 0xcb, 0xe5, 0xe6, 0x39, 0x6e, 0xdf, 0x6e,
0x0c, 0xc5, 0x06, 0x05, 0xba, 0x0e, 0xb3, 0xcc, 0x0b, 0xda, 0x3d, 0xdf, 0xa1, 0x1c, 0x50, 0x2b,
0x0a, 0x3b, 0x2f, 0x2a, 0x3b, 0x67, 0x77, 0x0d, 0x1c, 0x4e, 0x51, 0x72, 0x4d, 0x2d, 0x27, 0x22,
0xed, 0x90, 0x7a, 0x84, 0xd5, 0x66, 0x12, 0x4d, 0xab, 0x31, 0x14, 0x1b, 0x14, 0xe8, 0x29, 0x28,
0x88, 0x9d, 0xaf, 0x95, 0x84, 0x8a, 0xaa, 0x52, 0x51, 0x10, 0xc7, 0x82, 0x25, 0x0e, 0x3d, 0x03,
0x33, 0xea, 0xd6, 0xd4, 0xca, 0x82, 0xec, 0xbc, 0x22, 0x9b, 0xd1, 0x6e, 0xad, 0xf1, 0xe8, 0x5b,
0x80, 0x58, 0x14, 0x52, 0xa7, 0x4d, 0x14, 0xea, 0x55, 0x87, 0x1d, 0xd4, 0x40, 0x70, 0x2d, 0x28,
0x2e, 0xb4, 0x3b, 0x42, 0x81, 0x4f, 0xe1, 0xb2, 0x7f, 0x6f, 0xc1, 0x79, 0xc3, 0x17, 0x84, 0xdf,
0x5d, 0x87, 0xd9, 0xb6, 0x71, 0xeb, 0x94, 0x5f, 0xc4, 0x3b, 0x63, 0xde, 0x48, 0x9c, 0xa2, 0x44,
0x04, 0xca, 0x54, 0x49, 0xd2, 0xd1, 0xe5, 0x6a, 0x66, 0xa7, 0xd5, 0x36, 0x24, 0x9a, 0x0c, 0x20,
0xc3, 0x89, 0x64, 0xfb, 0x9f, 0x96, 0x70, 0x60, 0x1d, 0x6f, 0xd0, 0x65, 0x23, 0xa6, 0x59, 0xe2,
0x38, 0x66, 0xc7, 0xc4, 0xa3, 0x33, 0x02, 0x41, 0xee, 0xff, 0x22, 0x10, 0xdc, 0x28, 0xfd, 0xea,
0xdd, 0xfa, 0xd4, 0x5b, 0x7f, 0x5b, 0x9a, 0xb2, 0x3b, 0x50, 0x5d, 0xa5, 0xc4, 0x89, 0xc8, 0x76,
0x37, 0x12, 0x0b, 0xb0, 0xa1, 0xe8, 0xd2, 0x3e, 0xee, 0x05, 0x6a, 0xa1, 0xc0, 0xef, 0xf7, 0x9a,
0x80, 0x60, 0x85, 0xe1, 0xe7, 0xb7, 0xef, 0x11, 0xdf, 0xdd, 0x72, 0x02, 0xa7, 0x4d, 0xa8, 0xba,
0x81, 0xf1, 0xae, 0x6e, 0x18, 0x38, 0x9c, 0xa2, 0xb4, 0x7f, 0x9a, 0x87, 0xea, 0x1a, 0xf1, 0x49,
0xa2, 0x6f, 0x03, 0x50, 0x9b, 0x3a, 0x2d, 0xb2, 0x43, 0xa8, 0x17, 0xba, 0xbb, 0xa4, 0x15, 0x06,
0x2e, 0x13, 0x1e, 0x91, 0x6f, 0x7e, 0x8e, 0xfb, 0xd9, 0xcd, 0x11, 0x2c, 0x3e, 0x85, 0x03, 0xf9,
0x50, 0xed, 0x52, 0xf1, 0xec, 0x45, 0x2a, 0xf7, 0xf0, 0x3b, 0xff, 0x7c, 0xb6, 0xad, 0xde, 0x31,
0x59, 0x9b, 0xf3, 0xc7, 0x83, 0x7a, 0x35, 0x05, 0xc2, 0x69, 0xe1, 0xe8, 0x9b, 0x30, 0x17, 0xd2,
0xee, 0x81, 0x13, 0xac, 0x91, 0x2e, 0x09, 0x5c, 0x12, 0x44, 0x4c, 0xec, 0x42, 0xa9, 0x79, 0x91,
0x67, 0x8c, 0xed, 0x21, 0x1c, 0x1e, 0xa1, 0x46, 0xf7, 0x60, 0xbe, 0x4b, 0xc3, 0xae, 0xd3, 0x76,
0xb8, 0xc4, 0x9d, 0xd0, 0xf7, 0x5a, 0x7d, 0x11, 0xa7, 0xca, 0xcd, 0x2b, 0xc7, 0x83, 0xfa, 0xfc,
0xce, 0x30, 0xf2, 0x64, 0x50, 0xbf, 0x20, 0xb6, 0x8e, 0x43, 0x12, 0x24, 0x1e, 0x15, 0x63, 0x9c,
0x61, 0x61, 0xdc, 0x19, 0xda, 0x9b, 0x50, 0x5a, 0xeb, 0x51, 0xc1, 0x85, 0x5e, 0x86, 0x92, 0xab,
0x9e, 0xd5, 0xce, 0x3f, 0xa9, 0x53, 0xae, 0xa6, 0x39, 0x19, 0xd4, 0xab, 0xbc, 0x48, 0x68, 0x68,
0x00, 0x8e, 0x59, 0xec, 0xfb, 0x50, 0x5d, 0x7f, 0xd8, 0x0d, 0x69, 0xa4, 0xcf, 0xf4, 0x69, 0x28,
0x12, 0x01, 0x10, 0xd2, 0x4a, 0x49, 0x9e, 0x90, 0x64, 0x58, 0x61, 0x79, 0xdc, 0x22, 0x0f, 0x9d,
0x56, 0xa4, 0x02, 0x7e, 0x1c, 0xb7, 0xd6, 0x39, 0x10, 0x4b, 0x9c, 0xfd, 0xbe, 0x05, 0x45, 0xe1,
0x51, 0x0c, 0xdd, 0x86, 0x7c, 0xc7, 0xe9, 0xaa, 0x64, 0xf5, 0x42, 0xb6, 0x93, 0x95, 0xac, 0x8d,
0x2d, 0xa7, 0xbb, 0x1e, 0x44, 0xb4, 0xdf, 0xac, 0x28, 0x25, 0xf9, 0x2d, 0xa7, 0x8b, 0xb9, 0xb8,
0x05, 0x17, 0x4a, 0x1a, 0x8b, 0xe6, 0x20, 0x7f, 0x48, 0xfa, 0x32, 0x20, 0x61, 0xfe, 0x88, 0x9a,
0x50, 0x38, 0x72, 0xfc, 0x1e, 0x51, 0xfe, 0x74, 0x65, 0x12, 0xad, 0x58, 0xb2, 0xde, 0xc8, 0x5d,
0xb7, 0xec, 0x6d, 0x80, 0x9b, 0x24, 0xde, 0xa1, 0x15, 0x38, 0xaf, 0xa3, 0x4d, 0x3a, 0x08, 0x7e,
0x5e, 0x99, 0x77, 0x1e, 0xa7, 0xd1, 0x78, 0x98, 0xde, 0xbe, 0x0f, 0x65, 0x11, 0x28, 0x79, 0xbe,
0x4b, 0x32, 0x80, 0xf5, 0x88, 0x0c, 0xa0, 0x13, 0x66, 0x6e, 0x5c, 0xc2, 0x34, 0xe2, 0x82, 0x0f,
0x55, 0xc9, 0xab, 0x73, 0x78, 0x26, 0x0d, 0x57, 0xa0, 0xa4, 0xcd, 0x54, 0x5a, 0xe2, 0xda, 0x4d,
0x0b, 0xc2, 0x31, 0x85, 0xa1, 0xed, 0x00, 0x52, 0x41, 0x3f, 0x9b, 0x32, 0x23, 0xa1, 0xe5, 0x1e,
0x9d, 0xd0, 0x0c, 0x4d, 0x3f, 0x82, 0xda, 0xb8, 0x82, 0xef, 0x31, 0xd2, 0x52, 0x76, 0x53, 0xec,
0xb7, 0x2d, 0x98, 0x33, 0x25, 0x65, 0x3f, 0xbe, 0xec, 0x4a, 0xce, 0x2e, 0x8d, 0x8c, 0x1d, 0xf9,
0xb5, 0x05, 0x17, 0x53, 0x4b, 0x9b, 0xe8, 0xc4, 0x27, 0x30, 0xca, 0x74, 0x8e, 0xfc, 0x04, 0xce,
0xb1, 0x0c, 0x95, 0xcd, 0xc0, 0x8b, 0x3c, 0xc7, 0xf7, 0x7e, 0x40, 0xe8, 0xd9, 0xc5, 0xa4, 0xfd,
0x47, 0x0b, 0x66, 0x0d, 0x0e, 0x86, 0xee, 0xc3, 0x0c, 0x8f, 0xbb, 0x5e, 0xd0, 0x56, 0xb1, 0x23,
0x63, 0xcd, 0x60, 0x08, 0x49, 0xd6, 0xb5, 0x23, 0x25, 0x61, 0x2d, 0x12, 0xed, 0x40, 0x91, 0x12,
0xd6, 0xf3, 0xa3, 0xc9, 0x42, 0xc4, 0x6e, 0xe4, 0x44, 0x3d, 0x26, 0x63, 0x33, 0x16, 0xfc, 0x58,
0xc9, 0xb1, 0xff, 0x92, 0x83, 0xea, 0x2d, 0x67, 0x8f, 0xf8, 0xbb, 0xc4, 0x27, 0xad, 0x28, 0xa4,
0xe8, 0x87, 0x50, 0xe9, 0x38, 0x51, 0xeb, 0x40, 0x40, 0x75, 0xb9, 0xbe, 0x96, 0x4d, 0x51, 0x4a,
0x52, 0x63, 0x2b, 0x11, 0x23, 0x03, 0xe2, 0x05, 0xb5, 0xb0, 0x8a, 0x81, 0xc1, 0xa6, 0x36, 0xd1,
0x63, 0x89, 0xf7, 0xf5, 0x87, 0x5d, 0x5e, 0x4b, 0x4c, 0xde, 0xda, 0xa5, 0x4c, 0xc0, 0xe4, 0xcd,
0x9e, 0x47, 0x49, 0x87, 0x04, 0x51, 0xd2, 0x63, 0x6d, 0x0d, 0xc9, 0xc7, 0x23, 0x1a, 0x17, 0x5e,
0x81, 0xb9, 0x61, 0xe3, 0x4f, 0x89, 0xd7, 0x17, 0xcd, 0x78, 0x5d, 0x36, 0x23, 0xf0, 0x6f, 0x2d,
0xa8, 0x8d, 0x33, 0x04, 0x7d, 0xd1, 0x10, 0x94, 0xe4, 0x88, 0xd7, 0x48, 0x5f, 0x4a, 0x5d, 0x87,
0x52, 0xd8, 0xe5, 0x5d, 0x71, 0x48, 0x95, 0x9f, 0x3f, 0xa3, 0x7d, 0x77, 0x5b, 0xc1, 0x4f, 0x06,
0xf5, 0x4b, 0x29, 0xf1, 0x1a, 0x81, 0x63, 0x56, 0x9e, 0x98, 0x85, 0x3d, 0xbc, 0x58, 0x88, 0x13,
0xf3, 0x5d, 0x01, 0xc1, 0x0a, 0x63, 0xff, 0xc1, 0x82, 0x69, 0x51, 0x25, 0xdf, 0x87, 0x12, 0xdf,
0x3f, 0xd7, 0x89, 0x1c, 0x61, 0x57, 0xe6, 0xfe, 0x8c, 0x73, 0x6f, 0x91, 0xc8, 0x49, 0xee, 0x97,
0x86, 0xe0, 0x58, 0x22, 0xc2, 0x50, 0xf0, 0x22, 0xd2, 0xd1, 0x07, 0xf9, 0xec, 0x58, 0xd1, 0x6a,
0x3a, 0xd0, 0xc0, 0xce, 0x83, 0xf5, 0x87, 0x11, 0x09, 0xf8, 0x61, 0x24, 0xc1, 0x60, 0x93, 0xcb,
0xc0, 0x52, 0x94, 0xfd, 0x3b, 0x0b, 0x62, 0x55, 0xfc, 0xba, 0x33, 0xe2, 0xef, 0xdf, 0xf2, 0x82,
0x43, 0xb5, 0xad, 0xb1, 0x39, 0xbb, 0x0a, 0x8e, 0x63, 0x8a, 0xd3, 0x12, 0x62, 0x6e, 0xb2, 0x84,
0xc8, 0x15, 0xb6, 0xc2, 0x20, 0xf2, 0x82, 0xde, 0x48, 0x7c, 0x59, 0x55, 0x70, 0x1c, 0x53, 0xd8,
0x7f, 0xce, 0x43, 0x85, 0xdb, 0xaa, 0x33, 0xf2, 0x4b, 0x50, 0xf5, 0xcd, 0xd3, 0x53, 0x36, 0x5f,
0x52, 0x22, 0xd2, 0xf7, 0x11, 0xa7, 0x69, 0x39, 0xb3, 0x28, 0x73, 0x63, 0xe6, 0x5c, 0x9a, 0x79,
0xc3, 0x44, 0xe2, 0x34, 0x2d, 0x8f, 0xb3, 0x0f, 0xb8, 0x5f, 0xab, 0x02, 0x32, 0xde, 0xda, 0x6f,
0x73, 0x20, 0x96, 0xb8, 0xd3, 0xf6, 0x67, 0x7a, 0xc2, 0xfd, 0xb9, 0x01, 0xe7, 0xf8, 0x41, 0x86,
0xbd, 0x48, 0x57, 0xd9, 0x05, 0x51, 0xeb, 0xa1, 0xe3, 0x41, 0xfd, 0xdc, 0xed, 0x14, 0x06, 0x0f,
0x51, 0x72, 0x1b, 0x7d, 0xaf, 0xe3, 0x45, 0xb5, 0x19, 0xc1, 0x12, 0xdb, 0x78, 0x8b, 0x03, 0xb1,
0xc4, 0xa5, 0x0e, 0xa0, 0x74, 0xd6, 0x01, 0xa0, 0x2d, 0xb8, 0xe0, 0xf8, 0x7e, 0xf8, 0x40, 0x2c,
0xb3, 0x19, 0x86, 0x87, 0x1d, 0x87, 0x1e, 0x32, 0xd1, 0x9b, 0x96, 0x9a, 0x5f, 0x50, 0x8c, 0x17,
0x56, 0x46, 0x49, 0xf0, 0x69, 0x7c, 0xf6, 0xbf, 0x72, 0x80, 0x64, 0x97, 0xe1, 0xca, 0xe2, 0x4b,
0x06, 0x88, 0x67, 0x60, 0xa6, 0xa3, 0xba, 0x14, 0x2b, 0x9d, 0x9f, 0x74, 0x83, 0xa2, 0xf1, 0x68,
0x0b, 0xca, 0xf2, 0xa2, 0x26, 0xce, 0xb7, 0xac, 0x88, 0xcb, 0xdb, 0x1a, 0x71, 0x32, 0xa8, 0x2f,
0xa4, 0xd4, 0xc4, 0x98, 0xdb, 0xfd, 0x2e, 0xc1, 0x89, 0x04, 0x74, 0x0d, 0xc0, 0xe9, 0x7a, 0xe6,
0x48, 0xaa, 0x9c, 0x8c, 0x34, 0x92, 0xe6, 0x12, 0x1b, 0x54, 0xe8, 0x55, 0x98, 0xe6, 0x1b, 0xaf,
0xe6, 0x15, 0x5f, 0xce, 0x76, 0xdd, 0xf9, 0xd1, 0x35, 0x4b, 0x3c, 0x07, 0xf2, 0x27, 0x2c, 0x24,
0xa0, 0x7b, 0x50, 0x14, 0x5e, 0x26, 0x0f, 0x79, 0xc2, 0xba, 0x55, 0x34, 0x31, 0xaa, 0xe8, 0x3e,
0x89, 0x9f, 0xb0, 0x92, 0x68, 0xbf, 0x09, 0xe5, 0x2d, 0xaf, 0x45, 0x43, 0xae, 0x8e, 0x6f, 0x30,
0x4b, 0x35, 0x6d, 0xf1, 0x06, 0x6b, 0x5f, 0xd2, 0x78, 0xee, 0x44, 0x81, 0x13, 0x84, 0xb2, 0x35,
0x2b, 0x24, 0x4e, 0xf4, 0x3a, 0x07, 0x62, 0x89, 0xbb, 0x71, 0x91, 0xe7, 0xfd, 0x9f, 0xbd, 0x57,
0x9f, 0x7a, 0xe7, 0xbd, 0xfa, 0xd4, 0xbb, 0xef, 0xa9, 0x1a, 0xe0, 0x1f, 0x15, 0x80, 0xed, 0xbd,
0xef, 0x93, 0x96, 0x8c, 0x2d, 0x67, 0x0f, 0x94, 0x78, 0x2d, 0xa7, 0xe6, 0x98, 0x62, 0xf8, 0x92,
0x1b, 0xaa, 0xe5, 0x0c, 0x1c, 0x4e, 0x51, 0xa2, 0x65, 0x28, 0xc7, 0x43, 0x26, 0x75, 0x6c, 0xf3,
0xda, 0x0d, 0xe2, 0x49, 0x14, 0x4e, 0x68, 0x52, 0x81, 0x6e, 0xfa, 0xcc, 0x40, 0xd7, 0x84, 0x7c,
0xcf, 0x73, 0xc5, 0xa9, 0x94, 0x9b, 0xcf, 0xe9, 0x44, 0x73, 0x67, 0x73, 0xed, 0x64, 0x50, 0x7f,
0x72, 0xdc, 0x84, 0x36, 0xea, 0x77, 0x09, 0x6b, 0xdc, 0xd9, 0x5c, 0xc3, 0x9c, 0xf9, 0xb4, 0x60,
0x50, 0x9c, 0x30, 0x18, 0x5c, 0x03, 0x50, 0xab, 0xe6, 0xdc, 0xf2, 0x56, 0xc7, 0xde, 0x79, 0x33,
0xc6, 0x60, 0x83, 0x0a, 0x31, 0x98, 0x6f, 0x51, 0x22, 0x9d, 0xdd, 0xeb, 0x10, 0x16, 0x39, 0x1d,
0x39, 0x72, 0x9a, 0xcc, 0x55, 0x9f, 0x50, 0x6a, 0xe6, 0x57, 0x87, 0x85, 0xe1, 0x51, 0xf9, 0x28,
0x84, 0x79, 0x57, 0x75, 0xbd, 0x89, 0xd2, 0xf2, 0xc4, 0x4a, 0x2f, 0x71, 0x85, 0x6b, 0xc3, 0x82,
0xf0, 0xa8, 0x6c, 0xf4, 0x3d, 0x58, 0xd0, 0xc0, 0xd1, 0xd1, 0x83, 0x18, 0x82, 0xe5, 0x9b, 0x8b,
0xc7, 0x83, 0xfa, 0xc2, 0xda, 0x58, 0x2a, 0xfc, 0x08, 0x09, 0xc8, 0x85, 0xa2, 0x2f, 0xab, 0xb8,
0x8a, 0xc8, 0xbc, 0x5f, 0xcf, 0xb6, 0x8a, 0xc4, 0xfb, 0x1b, 0x66, 0xf5, 0x16, 0xb7, 0xd6, 0xaa,
0x70, 0x53, 0xb2, 0xd1, 0x43, 0xa8, 0x38, 0x41, 0x10, 0x46, 0x8e, 0x1c, 0x86, 0xcc, 0x0a, 0x55,
0x2b, 0x13, 0xab, 0x5a, 0x49, 0x64, 0x0c, 0x55, 0x8b, 0x06, 0x06, 0x9b, 0xaa, 0xd0, 0x03, 0x38,
0x1f, 0x3e, 0x08, 0x08, 0xc5, 0x64, 0x9f, 0x50, 0x12, 0xb4, 0x08, 0xab, 0x55, 0x85, 0xf6, 0xaf,
0x66, 0xd4, 0x9e, 0x62, 0x4e, 0x5c, 0x3a, 0x0d, 0x67, 0x78, 0x58, 0x0b, 0x6a, 0x00, 0xec, 0x7b,
0x81, 0xaa, 0xf9, 0x6b, 0xe7, 0x92, 0xa9, 0xe9, 0x46, 0x0c, 0xc5, 0x06, 0x05, 0x7a, 0x01, 0x2a,
0x2d, 0xbf, 0xc7, 0x22, 0x22, 0xc7, 0xb3, 0xe7, 0xc5, 0x0d, 0x8a, 0xd7, 0xb7, 0x9a, 0xa0, 0xb0,
0x49, 0x87, 0x0e, 0x60, 0xd6, 0x33, 0x9a, 0x8b, 0xda, 0x9c, 0xf0, 0xc5, 0x6b, 0x13, 0x77, 0x14,
0xac, 0x39, 0xc7, 0x23, 0x91, 0x09, 0xc1, 0x29, 0xc9, 0xa8, 0x07, 0xd5, 0x8e, 0x99, 0x6a, 0x6a,
0xf3, 0x62, 0x1f, 0xaf, 0x67, 0x53, 0x35, 0x9a, 0x0c, 0x93, 0x7a, 0x24, 0x85, 0xc3, 0x69, 0x2d,
0x0b, 0x5f, 0x83, 0xca, 0x7f, 0x59, 0x62, 0xf3, 0x12, 0x7d, 0xd8, 0x63, 0x26, 0x2a, 0xd1, 0xdf,
0xcf, 0xc1, 0xb9, 0xf4, 0x39, 0xc7, 0xad, 0xac, 0x35, 0x76, 0xca, 0xaf, 0x93, 0x41, 0x7e, 0x6c,
0x32, 0x50, 0x31, 0x77, 0xfa, 0x71, 0x62, 0x6e, 0x3a, 0x9d, 0x17, 0x32, 0xa5, 0xf3, 0x06, 0x00,
0x2f, 0x77, 0x68, 0xe8, 0xfb, 0x84, 0x8a, 0x10, 0x5d, 0x52, 0x73, 0xfc, 0x18, 0x8a, 0x0d, 0x0a,
0xb4, 0x01, 0x68, 0xcf, 0x0f, 0x5b, 0x87, 0x62, 0x0b, 0x74, 0x78, 0x11, 0xc1, 0xb9, 0x24, 0x67,
0xa1, 0xcd, 0x11, 0x2c, 0x3e, 0x85, 0xc3, 0xee, 0xc3, 0xa5, 0x1d, 0x87, 0x72, 0x47, 0x4a, 0xae,
0xb2, 0x28, 0xfa, 0xdf, 0x18, 0x69, 0x29, 0x9e, 0x9b, 0x34, 0x24, 0x24, 0x8b, 0x4e, 0x60, 0x49,
0x5b, 0x61, 0xff, 0xd5, 0x82, 0x27, 0x4e, 0xd5, 0xfd, 0x19, 0xb4, 0x34, 0xf7, 0xd3, 0x2d, 0xcd,
0x4b, 0x19, 0x47, 0xbf, 0xa7, 0x59, 0x2b, 0x3f, 0xff, 0xa4, 0x9a, 0x9b, 0x19, 0x28, 0xec, 0xf0,
0x92, 0xd3, 0xfe, 0xa5, 0x05, 0xb3, 0xe2, 0x69, 0x92, 0x91, 0x79, 0x1d, 0x0a, 0xfb, 0xa1, 0x1e,
0x8b, 0x95, 0xa4, 0xf8, 0x0d, 0x0e, 0xc0, 0x12, 0xfe, 0x18, 0x33, 0xf5, 0xb7, 0x2d, 0x48, 0x0f,
0xab, 0xd1, 0x2b, 0xd2, 0xdf, 0xad, 0x78, 0x9a, 0x3c, 0xa1, 0xaf, 0xbf, 0x3c, 0xae, 0x19, 0xbb,
0x90, 0x69, 0x32, 0x79, 0x05, 0xca, 0x38, 0x0c, 0xa3, 0x1d, 0x27, 0x3a, 0x60, 0x7c, 0xe1, 0x5d,
0xfe, 0xa0, 0xf6, 0x46, 0x2c, 0x5c, 0x60, 0xb0, 0x84, 0xdb, 0xbf, 0xb0, 0xe0, 0x89, 0xb1, 0x9f,
0x31, 0xf8, 0xb5, 0x6b, 0xc5, 0x6f, 0x6a, 0x45, 0xb1, 0x07, 0x26, 0x74, 0xd8, 0xa0, 0xe2, 0xdd,
0x58, 0xea, 0xdb, 0xc7, 0x70, 0x37, 0x96, 0xd2, 0x86, 0xd3, 0xb4, 0xf6, 0xbf, 0x73, 0x50, 0x94,
0xa3, 0x99, 0xff, 0xb1, 0xb7, 0x3e, 0x0d, 0x45, 0x26, 0xf4, 0x28, 0xf3, 0xe2, 0x4c, 0x2e, 0xb5,
0x63, 0x85, 0x15, 0x1d, 0x0c, 0x61, 0xcc, 0x69, 0xeb, 0x08, 0x97, 0x74, 0x30, 0x12, 0x8c, 0x35,
0x1e, 0xbd, 0x08, 0x45, 0x4a, 0x1c, 0x16, 0xf7, 0x86, 0x8b, 0x5a, 0x24, 0x16, 0xd0, 0x93, 0x41,
0x7d, 0x56, 0x09, 0x17, 0xef, 0x58, 0x51, 0xa3, 0x7b, 0x30, 0xe3, 0x92, 0xc8, 0xf1, 0x7c, 0xdd,
0x2d, 0x3c, 0x3f, 0xc9, 0x08, 0x6b, 0x4d, 0xb2, 0x36, 0x2b, 0xdc, 0x26, 0xf5, 0x82, 0xb5, 0x40,
0x1e, 0x9d, 0x5b, 0xa1, 0x2b, 0xbf, 0x7e, 0x16, 0x92, 0xe8, 0xbc, 0x1a, 0xba, 0x04, 0x0b, 0x8c,
0xfd, 0x8e, 0x05, 0x15, 0x29, 0x69, 0xd5, 0xe9, 0x31, 0x82, 0xae, 0xc6, 0xab, 0x90, 0xc7, 0xad,
0xeb, 0xc5, 0x69, 0xde, 0x61, 0x9d, 0x0c, 0xea, 0x65, 0x41, 0x26, 0xda, 0x2d, 0xbd, 0x00, 0x63,
0x8f, 0x72, 0x67, 0xec, 0xd1, 0x53, 0x50, 0x10, 0xb7, 0x47, 0x6d, 0x66, 0xdc, 0x84, 0x88, 0x0b,
0x86, 0x25, 0xce, 0xfe, 0x38, 0x07, 0xd5, 0xd4, 0xe2, 0x32, 0x74, 0x1c, 0xf1, 0xb8, 0x34, 0x97,
0x61, 0x04, 0x3f, 0xfe, 0x9b, 0xf5, 0x77, 0xa0, 0xd8, 0xe2, 0xeb, 0xd3, 0x7f, 0x1a, 0xb8, 0x3a,
0xc9, 0x51, 0x88, 0x9d, 0x49, 0x3c, 0x49, 0xbc, 0x32, 0xac, 0x04, 0xa2, 0x9b, 0x30, 0x4f, 0x49,
0x44, 0xfb, 0x2b, 0xfb, 0x11, 0xa1, 0xe6, 0x0c, 0xa0, 0x90, 0xd4, 0xe4, 0x78, 0x98, 0x00, 0x8f,
0xf2, 0xe8, 0x7c, 0x5a, 0x7c, 0x8c, 0x7c, 0x6a, 0xef, 0xc1, 0xec, 0x6d, 0x67, 0xcf, 0x8f, 0xbf,
0x03, 0x62, 0xa8, 0x7a, 0x41, 0xcb, 0xef, 0xb9, 0x44, 0x46, 0x62, 0x1d, 0xbd, 0xf4, 0xa5, 0xdd,
0x34, 0x91, 0x27, 0x83, 0xfa, 0x85, 0x14, 0x40, 0x7e, 0xf8, 0xc2, 0x69, 0x11, 0xb6, 0x0f, 0xd3,
0x9f, 0x61, 0x8f, 0xfa, 0x5d, 0x28, 0x27, 0x5d, 0xc4, 0xa7, 0xac, 0xd2, 0x7e, 0x03, 0x4a, 0xdc,
0xe3, 0x75, 0xf7, 0x7b, 0x46, 0x49, 0x94, 0x2e, 0x56, 0x72, 0x59, 0x8a, 0x15, 0xbb, 0x03, 0xd5,
0x3b, 0x5d, 0xf7, 0x31, 0xbf, 0x04, 0xe7, 0x32, 0x67, 0xad, 0x6b, 0x20, 0xff, 0x5d, 0xc1, 0x13,
0x84, 0xcc, 0xda, 0x46, 0x82, 0x30, 0x13, 0xaf, 0xf1, 0x25, 0xe0, 0x27, 0x16, 0x80, 0x18, 0xfb,
0xac, 0x1f, 0x91, 0x20, 0xe2, 0xfb, 0xc0, 0x9d, 0x6a, 0x78, 0x1f, 0x44, 0x64, 0x10, 0x18, 0x74,
0x07, 0x8a, 0xa1, 0xf4, 0x26, 0x39, 0x9a, 0x9f, 0x70, 0xca, 0x19, 0x5f, 0x24, 0xe9, 0x4f, 0x58,
0x09, 0x6b, 0x5e, 0xfe, 0xe0, 0x93, 0xc5, 0xa9, 0x0f, 0x3f, 0x59, 0x9c, 0xfa, 0xe8, 0x93, 0xc5,
0xa9, 0xb7, 0x8e, 0x17, 0xad, 0x0f, 0x8e, 0x17, 0xad, 0x0f, 0x8f, 0x17, 0xad, 0x8f, 0x8e, 0x17,
0xad, 0x8f, 0x8f, 0x17, 0xad, 0x77, 0xfe, 0xbe, 0x38, 0x75, 0x2f, 0x77, 0x74, 0xf5, 0x3f, 0x01,
0x00, 0x00, 0xff, 0xff, 0xbe, 0xb0, 0xbe, 0x20, 0x49, 0x26, 0x00, 0x00,
0xb5, 0x85, 0xad, 0xd3, 0xdd, 0xd2, 0x6a, 0xd9, 0xd2, 0x42, 0x9c, 0x1f, 0xdb, 0xd0, 0x4d, 0x13,
0xbd, 0xec, 0x2e, 0x62, 0x59, 0xa1, 0x4e, 0x3c, 0x2f, 0xce, 0x90, 0xf1, 0x8c, 0xfb, 0xde, 0x38,
0xbb, 0x86, 0x03, 0x3d, 0x80, 0x00, 0x09, 0xaa, 0x1e, 0x39, 0xa1, 0x56, 0xf0, 0x17, 0x70, 0xe2,
0xc4, 0xa9, 0x12, 0xbd, 0x20, 0x55, 0xe2, 0x40, 0x0f, 0xc8, 0x6a, 0x03, 0x12, 0xdc, 0x38, 0x71,
0xc9, 0x09, 0xbd, 0x5f, 0x33, 0x6f, 0xec, 0x78, 0x33, 0x66, 0x4b, 0xc5, 0xc9, 0x33, 0xdf, 0xcf,
0xf7, 0xbe, 0xf7, 0xbd, 0xef, 0xd7, 0x18, 0xb6, 0x0e, 0xaf, 0xb3, 0x86, 0x17, 0x2e, 0x1f, 0xf6,
0xf6, 0x08, 0x0d, 0x48, 0x44, 0xd8, 0xf2, 0x11, 0x09, 0xdc, 0x90, 0x2e, 0x2b, 0x84, 0xd3, 0xf5,
0x3a, 0x4e, 0xeb, 0xc0, 0x0b, 0x08, 0xed, 0x2f, 0x77, 0x0f, 0xdb, 0x1c, 0xc0, 0x96, 0x3b, 0x24,
0x72, 0x96, 0x8f, 0xae, 0x2e, 0xb7, 0x49, 0x40, 0xa8, 0x13, 0x11, 0xb7, 0xd1, 0xa5, 0x61, 0x14,
0xa2, 0x2f, 0x49, 0xae, 0x86, 0xc9, 0xd5, 0xe8, 0x1e, 0xb6, 0x39, 0x80, 0x35, 0x38, 0x57, 0xe3,
0xe8, 0xea, 0xc2, 0xb3, 0x6d, 0x2f, 0x3a, 0xe8, 0xed, 0x35, 0x5a, 0x61, 0x67, 0xb9, 0x1d, 0xb6,
0xc3, 0x65, 0xc1, 0xbc, 0xd7, 0xdb, 0x17, 0x6f, 0xe2, 0x45, 0x3c, 0x49, 0xa1, 0x0b, 0x63, 0x97,
0x42, 0x7b, 0x41, 0xe4, 0x75, 0xc8, 0xf0, 0x2a, 0x16, 0x5e, 0x3c, 0x8b, 0x81, 0xb5, 0x0e, 0x48,
0xc7, 0x19, 0xe6, 0xb3, 0xff, 0x98, 0x87, 0xd2, 0xca, 0xce, 0xe6, 0x4d, 0x1a, 0xf6, 0xba, 0x68,
0x09, 0xa6, 0x03, 0xa7, 0x43, 0x6a, 0xd6, 0x92, 0x75, 0xb9, 0xdc, 0x9c, 0xfd, 0x60, 0x50, 0x9f,
0x3a, 0x1e, 0xd4, 0xa7, 0x5f, 0x77, 0x3a, 0x04, 0x0b, 0x0c, 0xf2, 0xa1, 0x74, 0x44, 0x28, 0xf3,
0xc2, 0x80, 0xd5, 0x72, 0x4b, 0xf9, 0xcb, 0x95, 0x6b, 0xaf, 0x34, 0xb2, 0xec, 0xbf, 0x21, 0x14,
0xdc, 0x95, 0xac, 0x1b, 0x21, 0x5d, 0xf3, 0x58, 0x2b, 0x3c, 0x22, 0xb4, 0xdf, 0x9c, 0x53, 0x5a,
0x4a, 0x0a, 0xc9, 0x70, 0xac, 0x01, 0xfd, 0xd8, 0x82, 0xb9, 0x2e, 0x25, 0xfb, 0x84, 0x52, 0xe2,
0x2a, 0x7c, 0x2d, 0xbf, 0x64, 0x7d, 0x0a, 0x6a, 0x6b, 0x4a, 0xed, 0xdc, 0xce, 0x90, 0x7c, 0x3c,
0xa2, 0x11, 0xfd, 0xc6, 0x82, 0x05, 0x46, 0xe8, 0x11, 0xa1, 0x2b, 0xae, 0x4b, 0x09, 0x63, 0xcd,
0xfe, 0xaa, 0xef, 0x91, 0x20, 0x5a, 0xdd, 0x5c, 0xc3, 0xac, 0x36, 0x2d, 0xec, 0xf0, 0x8d, 0x6c,
0x0b, 0xda, 0x1d, 0x27, 0xa7, 0x69, 0xab, 0x15, 0x2d, 0x8c, 0x25, 0x61, 0xf8, 0x11, 0xcb, 0xb0,
0xf7, 0x61, 0x56, 0x1f, 0xe4, 0x2d, 0x8f, 0x45, 0xe8, 0x2e, 0x14, 0xdb, 0xfc, 0x85, 0xd5, 0x2c,
0xb1, 0xc0, 0x46, 0xb6, 0x05, 0x6a, 0x19, 0xcd, 0x73, 0x6a, 0x3d, 0x45, 0xf1, 0xca, 0xb0, 0x92,
0x66, 0xff, 0x7c, 0x1a, 0x2a, 0x2b, 0x3b, 0x9b, 0x98, 0xb0, 0xb0, 0x47, 0x5b, 0x24, 0x83, 0xd3,
0x5c, 0x03, 0xe0, 0xbf, 0xac, 0xeb, 0xb4, 0x88, 0x5b, 0xcb, 0x2d, 0x59, 0x97, 0x4b, 0x4d, 0xa4,
0xe8, 0xe0, 0xf5, 0x18, 0x83, 0x0d, 0x2a, 0x2e, 0xf5, 0xd0, 0x0b, 0x5c, 0x71, 0xda, 0x86, 0xd4,
0xd7, 0xbc, 0xc0, 0xc5, 0x02, 0x83, 0x6e, 0x41, 0xe1, 0x88, 0xd0, 0x3d, 0x6e, 0x7f, 0xee, 0x10,
0x5f, 0xc9, 0xb6, 0xbd, 0xbb, 0x9c, 0xa5, 0x59, 0x3e, 0x1e, 0xd4, 0x0b, 0xe2, 0x11, 0x4b, 0x21,
0xa8, 0x01, 0xc0, 0x0e, 0x42, 0x1a, 0x89, 0xe5, 0xd4, 0x0a, 0x4b, 0xf9, 0xcb, 0xe5, 0xe6, 0x39,
0xbe, 0xbe, 0xdd, 0x18, 0x8a, 0x0d, 0x0a, 0x74, 0x1d, 0x66, 0x99, 0x17, 0xb4, 0x7b, 0xbe, 0x43,
0x39, 0xa0, 0x56, 0x14, 0xeb, 0xbc, 0xa8, 0xd6, 0x39, 0xbb, 0x6b, 0xe0, 0x70, 0x8a, 0x92, 0x6b,
0x6a, 0x39, 0x11, 0x69, 0x87, 0xd4, 0x23, 0xac, 0x36, 0x93, 0x68, 0x5a, 0x8d, 0xa1, 0xd8, 0xa0,
0x40, 0x4f, 0x41, 0x41, 0x58, 0xbe, 0x56, 0x12, 0x2a, 0xaa, 0x4a, 0x45, 0x41, 0x1c, 0x0b, 0x96,
0x38, 0xf4, 0x0c, 0xcc, 0xa8, 0x5b, 0x53, 0x2b, 0x0b, 0xb2, 0xf3, 0x8a, 0x6c, 0x46, 0xbb, 0xb5,
0xc6, 0xa3, 0x6f, 0x01, 0x62, 0x51, 0x48, 0x9d, 0x36, 0x51, 0xa8, 0x57, 0x1d, 0x76, 0x50, 0x03,
0xc1, 0xb5, 0xa0, 0xb8, 0xd0, 0xee, 0x08, 0x05, 0x3e, 0x85, 0xcb, 0xfe, 0x9d, 0x05, 0xe7, 0x0d,
0x5f, 0x10, 0x7e, 0x77, 0x1d, 0x66, 0xdb, 0xc6, 0xad, 0x53, 0x7e, 0x11, 0x5b, 0xc6, 0xbc, 0x91,
0x38, 0x45, 0x89, 0x08, 0x94, 0xa9, 0x92, 0xa4, 0xa3, 0xcb, 0xd5, 0xcc, 0x4e, 0xab, 0xd7, 0x90,
0x68, 0x32, 0x80, 0x0c, 0x27, 0x92, 0xed, 0x7f, 0x58, 0xc2, 0x81, 0x75, 0xbc, 0x41, 0x97, 0x8d,
0x98, 0x66, 0x89, 0xe3, 0x98, 0x1d, 0x13, 0x8f, 0xce, 0x08, 0x04, 0xb9, 0xff, 0x8b, 0x40, 0x70,
0xa3, 0xf4, 0xab, 0x77, 0xeb, 0x53, 0x6f, 0xfd, 0x75, 0x69, 0xca, 0xee, 0x40, 0x75, 0x95, 0x12,
0x27, 0x22, 0xdb, 0xdd, 0x48, 0x6c, 0xc0, 0x86, 0xa2, 0x4b, 0xfb, 0xb8, 0x17, 0xa8, 0x8d, 0x02,
0xbf, 0xdf, 0x6b, 0x02, 0x82, 0x15, 0x86, 0x9f, 0xdf, 0xbe, 0x47, 0x7c, 0x77, 0xcb, 0x09, 0x9c,
0x36, 0xa1, 0xea, 0x06, 0xc6, 0x56, 0xdd, 0x30, 0x70, 0x38, 0x45, 0x69, 0xff, 0x34, 0x0f, 0xd5,
0x35, 0xe2, 0x93, 0x44, 0xdf, 0x06, 0xa0, 0x36, 0x75, 0x5a, 0x64, 0x87, 0x50, 0x2f, 0x74, 0x77,
0x49, 0x2b, 0x0c, 0x5c, 0x26, 0x3c, 0x22, 0xdf, 0xfc, 0x1c, 0xf7, 0xb3, 0x9b, 0x23, 0x58, 0x7c,
0x0a, 0x07, 0xf2, 0xa1, 0xda, 0xa5, 0xe2, 0xd9, 0x8b, 0x54, 0xee, 0xe1, 0x77, 0xfe, 0xf9, 0x6c,
0xa6, 0xde, 0x31, 0x59, 0x9b, 0xf3, 0xc7, 0x83, 0x7a, 0x35, 0x05, 0xc2, 0x69, 0xe1, 0xe8, 0x9b,
0x30, 0x17, 0xd2, 0xee, 0x81, 0x13, 0xac, 0x91, 0x2e, 0x09, 0x5c, 0x12, 0x44, 0x4c, 0x58, 0xa1,
0xd4, 0xbc, 0xc8, 0x33, 0xc6, 0xf6, 0x10, 0x0e, 0x8f, 0x50, 0xa3, 0x7b, 0x30, 0xdf, 0xa5, 0x61,
0xd7, 0x69, 0x3b, 0x5c, 0xe2, 0x4e, 0xe8, 0x7b, 0xad, 0xbe, 0x88, 0x53, 0xe5, 0xe6, 0x95, 0xe3,
0x41, 0x7d, 0x7e, 0x67, 0x18, 0x79, 0x32, 0xa8, 0x5f, 0x10, 0xa6, 0xe3, 0x90, 0x04, 0x89, 0x47,
0xc5, 0x18, 0x67, 0x58, 0x18, 0x77, 0x86, 0xf6, 0x26, 0x94, 0xd6, 0x7a, 0x54, 0x70, 0xa1, 0x97,
0xa1, 0xe4, 0xaa, 0x67, 0x65, 0xf9, 0x27, 0x75, 0xca, 0xd5, 0x34, 0x27, 0x83, 0x7a, 0x95, 0x17,
0x09, 0x0d, 0x0d, 0xc0, 0x31, 0x8b, 0x7d, 0x1f, 0xaa, 0xeb, 0x0f, 0xbb, 0x21, 0x8d, 0xf4, 0x99,
0x3e, 0x0d, 0x45, 0x22, 0x00, 0x42, 0x5a, 0x29, 0xc9, 0x13, 0x92, 0x0c, 0x2b, 0x2c, 0x8f, 0x5b,
0xe4, 0xa1, 0xd3, 0x8a, 0x54, 0xc0, 0x8f, 0xe3, 0xd6, 0x3a, 0x07, 0x62, 0x89, 0xb3, 0xdf, 0xb7,
0xa0, 0x28, 0x3c, 0x8a, 0xa1, 0xdb, 0x90, 0xef, 0x38, 0x5d, 0x95, 0xac, 0x5e, 0xc8, 0x76, 0xb2,
0x92, 0xb5, 0xb1, 0xe5, 0x74, 0xd7, 0x83, 0x88, 0xf6, 0x9b, 0x15, 0xa5, 0x24, 0xbf, 0xe5, 0x74,
0x31, 0x17, 0xb7, 0xe0, 0x42, 0x49, 0x63, 0xd1, 0x1c, 0xe4, 0x0f, 0x49, 0x5f, 0x06, 0x24, 0xcc,
0x1f, 0x51, 0x13, 0x0a, 0x47, 0x8e, 0xdf, 0x23, 0xca, 0x9f, 0xae, 0x4c, 0xa2, 0x15, 0x4b, 0xd6,
0x1b, 0xb9, 0xeb, 0x96, 0xbd, 0x0d, 0x70, 0x93, 0xc4, 0x16, 0x5a, 0x81, 0xf3, 0x3a, 0xda, 0xa4,
0x83, 0xe0, 0xe7, 0xd5, 0xf2, 0xce, 0xe3, 0x34, 0x1a, 0x0f, 0xd3, 0xdb, 0xf7, 0xa1, 0x2c, 0x02,
0x25, 0xcf, 0x77, 0x49, 0x06, 0xb0, 0x1e, 0x91, 0x01, 0x74, 0xc2, 0xcc, 0x8d, 0x4b, 0x98, 0x46,
0x5c, 0xf0, 0xa1, 0x2a, 0x79, 0x75, 0x0e, 0xcf, 0xa4, 0xe1, 0x0a, 0x94, 0xf4, 0x32, 0x95, 0x96,
0xb8, 0x76, 0xd3, 0x82, 0x70, 0x4c, 0x61, 0x68, 0x3b, 0x80, 0x54, 0xd0, 0xcf, 0xa6, 0xcc, 0x48,
0x68, 0xb9, 0x47, 0x27, 0x34, 0x43, 0xd3, 0x8f, 0xa0, 0x36, 0xae, 0xe0, 0x7b, 0x8c, 0xb4, 0x94,
0x7d, 0x29, 0xf6, 0xdb, 0x16, 0xcc, 0x99, 0x92, 0xb2, 0x1f, 0x5f, 0x76, 0x25, 0x67, 0x97, 0x46,
0x86, 0x45, 0x7e, 0x6d, 0xc1, 0xc5, 0xd4, 0xd6, 0x26, 0x3a, 0xf1, 0x09, 0x16, 0x65, 0x3a, 0x47,
0x7e, 0x02, 0xe7, 0x58, 0x86, 0xca, 0x66, 0xe0, 0x45, 0x9e, 0xe3, 0x7b, 0x3f, 0x20, 0xf4, 0xec,
0x62, 0xd2, 0xfe, 0x83, 0x05, 0xb3, 0x06, 0x07, 0x43, 0xf7, 0x61, 0x86, 0xc7, 0x5d, 0x2f, 0x68,
0xab, 0xd8, 0x91, 0xb1, 0x66, 0x30, 0x84, 0x24, 0xfb, 0xda, 0x91, 0x92, 0xb0, 0x16, 0x89, 0x76,
0xa0, 0x48, 0x09, 0xeb, 0xf9, 0xd1, 0x64, 0x21, 0x62, 0x37, 0x72, 0xa2, 0x1e, 0x93, 0xb1, 0x19,
0x0b, 0x7e, 0xac, 0xe4, 0xd8, 0x7f, 0xce, 0x41, 0xf5, 0x96, 0xb3, 0x47, 0xfc, 0x5d, 0xe2, 0x93,
0x56, 0x14, 0x52, 0xf4, 0x43, 0xa8, 0x74, 0x9c, 0xa8, 0x75, 0x20, 0xa0, 0xba, 0x5c, 0x5f, 0xcb,
0xa6, 0x28, 0x25, 0xa9, 0xb1, 0x95, 0x88, 0x91, 0x01, 0xf1, 0x82, 0xda, 0x58, 0xc5, 0xc0, 0x60,
0x53, 0x9b, 0xe8, 0xb1, 0xc4, 0xfb, 0xfa, 0xc3, 0x2e, 0xaf, 0x25, 0x26, 0x6f, 0xed, 0x52, 0x4b,
0xc0, 0xe4, 0xcd, 0x9e, 0x47, 0x49, 0x87, 0x04, 0x51, 0xd2, 0x63, 0x6d, 0x0d, 0xc9, 0xc7, 0x23,
0x1a, 0x17, 0x5e, 0x81, 0xb9, 0xe1, 0xc5, 0x9f, 0x12, 0xaf, 0x2f, 0x9a, 0xf1, 0xba, 0x6c, 0x46,
0xe0, 0xdf, 0x5a, 0x50, 0x1b, 0xb7, 0x10, 0xf4, 0x45, 0x43, 0x50, 0x92, 0x23, 0x5e, 0x23, 0x7d,
0x29, 0x75, 0x1d, 0x4a, 0x61, 0x97, 0x77, 0xc5, 0x21, 0x55, 0x7e, 0xfe, 0x8c, 0xf6, 0xdd, 0x6d,
0x05, 0x3f, 0x19, 0xd4, 0x2f, 0xa5, 0xc4, 0x6b, 0x04, 0x8e, 0x59, 0x79, 0x62, 0x16, 0xeb, 0xe1,
0xc5, 0x42, 0x9c, 0x98, 0xef, 0x0a, 0x08, 0x56, 0x18, 0xfb, 0xf7, 0x16, 0x4c, 0x8b, 0x2a, 0xf9,
0x3e, 0x94, 0xb8, 0xfd, 0x5c, 0x27, 0x72, 0xc4, 0xba, 0x32, 0xf7, 0x67, 0x9c, 0x7b, 0x8b, 0x44,
0x4e, 0x72, 0xbf, 0x34, 0x04, 0xc7, 0x12, 0x11, 0x86, 0x82, 0x17, 0x91, 0x8e, 0x3e, 0xc8, 0x67,
0xc7, 0x8a, 0x56, 0xd3, 0x81, 0x06, 0x76, 0x1e, 0xac, 0x3f, 0x8c, 0x48, 0xc0, 0x0f, 0x23, 0x09,
0x06, 0x9b, 0x5c, 0x06, 0x96, 0xa2, 0xec, 0x7f, 0x5b, 0x10, 0xab, 0xe2, 0xd7, 0x9d, 0x11, 0x7f,
0xff, 0x96, 0x17, 0x1c, 0x2a, 0xb3, 0xc6, 0xcb, 0xd9, 0x55, 0x70, 0x1c, 0x53, 0x9c, 0x96, 0x10,
0x73, 0x93, 0x25, 0x44, 0xae, 0xb0, 0x15, 0x06, 0x91, 0x17, 0xf4, 0x46, 0xe2, 0xcb, 0xaa, 0x82,
0xe3, 0x98, 0x82, 0xf7, 0x38, 0x94, 0x74, 0x1c, 0x2f, 0xf0, 0x82, 0x36, 0xdf, 0xc4, 0x6a, 0xd8,
0x0b, 0x22, 0x51, 0x80, 0xe5, 0x93, 0x1e, 0x07, 0x8f, 0x50, 0xe0, 0x53, 0xb8, 0xec, 0x3f, 0xe5,
0xa1, 0xc2, 0xf7, 0xad, 0xb3, 0xfb, 0x4b, 0x50, 0xf5, 0x4d, 0x4f, 0x50, 0xfb, 0xbf, 0xa4, 0xc4,
0xa6, 0xef, 0x36, 0x4e, 0xd3, 0x72, 0x66, 0x51, 0x32, 0xc7, 0xcc, 0xb9, 0x34, 0xf3, 0x86, 0x89,
0xc4, 0x69, 0x5a, 0x1e, 0xb3, 0x1f, 0xf0, 0x3b, 0xa2, 0x8a, 0xd1, 0xf8, 0x98, 0xbe, 0xcd, 0x81,
0x58, 0xe2, 0x4e, 0xb3, 0xf5, 0xf4, 0x84, 0xb6, 0xbe, 0x01, 0xe7, 0xb8, 0x53, 0x84, 0xbd, 0x48,
0x57, 0xec, 0x05, 0x61, 0x39, 0x74, 0x3c, 0xa8, 0x9f, 0xbb, 0x9d, 0xc2, 0xe0, 0x21, 0x4a, 0xbe,
0x46, 0xdf, 0xeb, 0x78, 0x51, 0x6d, 0x46, 0xb0, 0xc4, 0x6b, 0xbc, 0xc5, 0x81, 0x58, 0xe2, 0x52,
0x87, 0x59, 0x3a, 0xf3, 0x30, 0xb7, 0xe0, 0x82, 0xe3, 0xfb, 0xe1, 0x03, 0xb1, 0xcd, 0x66, 0x18,
0x1e, 0x76, 0x1c, 0x7a, 0xc8, 0x44, 0x9f, 0x5b, 0x6a, 0x7e, 0x41, 0x31, 0x5e, 0x58, 0x19, 0x25,
0xc1, 0xa7, 0xf1, 0xd9, 0xff, 0xcc, 0x01, 0x92, 0x1d, 0x8b, 0x2b, 0x0b, 0x39, 0x19, 0x6c, 0x9e,
0x81, 0x99, 0x8e, 0xea, 0x78, 0xac, 0x74, 0xae, 0xd3, 0xcd, 0x8e, 0xc6, 0xa3, 0x2d, 0x28, 0xcb,
0x4b, 0x9f, 0x38, 0xf2, 0xb2, 0x22, 0x2e, 0x6f, 0x6b, 0xc4, 0xc9, 0xa0, 0xbe, 0x90, 0x52, 0x13,
0x63, 0x6e, 0xf7, 0xbb, 0x04, 0x27, 0x12, 0xd0, 0x35, 0x00, 0xa7, 0xeb, 0x99, 0xe3, 0xad, 0x72,
0x32, 0x1e, 0x49, 0x1a, 0x55, 0x6c, 0x50, 0xa1, 0x57, 0x61, 0x9a, 0x1b, 0x5e, 0xcd, 0x3e, 0xbe,
0x9c, 0x2d, 0x74, 0xf0, 0xa3, 0x6b, 0x96, 0x78, 0x3e, 0xe5, 0x4f, 0x58, 0x48, 0x40, 0xf7, 0xa0,
0x28, 0xbc, 0x4c, 0x1e, 0xf2, 0x84, 0x35, 0xb0, 0x68, 0x88, 0x54, 0x01, 0x7f, 0x12, 0x3f, 0x61,
0x25, 0xd1, 0x7e, 0x13, 0xca, 0x5b, 0x5e, 0x8b, 0x86, 0x5c, 0x1d, 0x37, 0x30, 0x4b, 0x35, 0x80,
0xb1, 0x81, 0xb5, 0x2f, 0x69, 0x3c, 0x77, 0xa2, 0xc0, 0x09, 0x42, 0xd9, 0xe6, 0x15, 0x12, 0x27,
0x7a, 0x9d, 0x03, 0xb1, 0xc4, 0xdd, 0xb8, 0xc8, 0x6b, 0x88, 0x9f, 0xbd, 0x57, 0x9f, 0x7a, 0xe7,
0xbd, 0xfa, 0xd4, 0xbb, 0xef, 0xa9, 0x7a, 0xe2, 0xef, 0x15, 0x80, 0xed, 0xbd, 0xef, 0x93, 0x96,
0x8c, 0x53, 0x67, 0x0f, 0xa7, 0x78, 0x5d, 0xa8, 0x66, 0xa2, 0x62, 0x90, 0x93, 0x1b, 0xaa, 0x0b,
0x0d, 0x1c, 0x4e, 0x51, 0xa2, 0x65, 0x28, 0xc7, 0x03, 0x2b, 0x75, 0x6c, 0xf3, 0xda, 0x0d, 0xe2,
0xa9, 0x16, 0x4e, 0x68, 0x52, 0x41, 0x73, 0xfa, 0xcc, 0xa0, 0xd9, 0x84, 0x7c, 0xcf, 0x73, 0xc5,
0xa9, 0x94, 0x9b, 0xcf, 0xe9, 0xa4, 0x75, 0x67, 0x73, 0xed, 0x64, 0x50, 0x7f, 0x72, 0xdc, 0xb4,
0x37, 0xea, 0x77, 0x09, 0x6b, 0xdc, 0xd9, 0x5c, 0xc3, 0x9c, 0xf9, 0xb4, 0x60, 0x50, 0x9c, 0x30,
0x18, 0x5c, 0x03, 0x50, 0xbb, 0xe6, 0xdc, 0xf2, 0x56, 0xc7, 0xde, 0x79, 0x33, 0xc6, 0x60, 0x83,
0x0a, 0x31, 0x98, 0x6f, 0x51, 0x22, 0x9d, 0xdd, 0xeb, 0x10, 0x16, 0x39, 0x1d, 0x39, 0xbe, 0x9a,
0xcc, 0x55, 0x9f, 0x50, 0x6a, 0xe6, 0x57, 0x87, 0x85, 0xe1, 0x51, 0xf9, 0x28, 0x84, 0x79, 0x57,
0x75, 0xd0, 0x89, 0xd2, 0xf2, 0xc4, 0x4a, 0x2f, 0x71, 0x85, 0x6b, 0xc3, 0x82, 0xf0, 0xa8, 0x6c,
0xf4, 0x3d, 0x58, 0xd0, 0xc0, 0xd1, 0x31, 0x86, 0x18, 0xa8, 0xe5, 0x9b, 0x8b, 0xc7, 0x83, 0xfa,
0xc2, 0xda, 0x58, 0x2a, 0xfc, 0x08, 0x09, 0xc8, 0x85, 0xa2, 0x2f, 0x2b, 0xc2, 0x8a, 0xc8, 0xe2,
0x5f, 0xcf, 0xb6, 0x8b, 0xc4, 0xfb, 0x1b, 0x66, 0x25, 0x18, 0xb7, 0xe9, 0xaa, 0x08, 0x54, 0xb2,
0xd1, 0x43, 0xa8, 0x38, 0x41, 0x10, 0x46, 0x8e, 0x1c, 0xac, 0xcc, 0x0a, 0x55, 0x2b, 0x13, 0xab,
0x5a, 0x49, 0x64, 0x0c, 0x55, 0x9e, 0x06, 0x06, 0x9b, 0xaa, 0xd0, 0x03, 0x38, 0x1f, 0x3e, 0x08,
0x08, 0xc5, 0x64, 0x9f, 0x50, 0x12, 0xb4, 0x08, 0xab, 0x55, 0x85, 0xf6, 0xaf, 0x66, 0xd4, 0x9e,
0x62, 0x4e, 0x5c, 0x3a, 0x0d, 0x67, 0x78, 0x58, 0x0b, 0x6a, 0x00, 0xec, 0x7b, 0x81, 0xea, 0x1f,
0x6a, 0xe7, 0x92, 0x09, 0xec, 0x46, 0x0c, 0xc5, 0x06, 0x05, 0x7a, 0x01, 0x2a, 0x2d, 0xbf, 0xc7,
0x22, 0x22, 0x47, 0xbd, 0xe7, 0xc5, 0x0d, 0x8a, 0xf7, 0xb7, 0x9a, 0xa0, 0xb0, 0x49, 0x87, 0x0e,
0x60, 0xd6, 0x33, 0x1a, 0x95, 0xda, 0x9c, 0xf0, 0xc5, 0x6b, 0x13, 0x77, 0x27, 0xac, 0x39, 0xc7,
0x23, 0x91, 0x09, 0xc1, 0x29, 0xc9, 0xa8, 0x07, 0xd5, 0x8e, 0x99, 0x6a, 0x6a, 0xf3, 0xc2, 0x8e,
0xd7, 0xb3, 0xa9, 0x1a, 0x4d, 0x86, 0x49, 0x3d, 0x92, 0xc2, 0xe1, 0xb4, 0x96, 0x85, 0xaf, 0x41,
0xe5, 0xbf, 0x2c, 0xd7, 0x79, 0xb9, 0x3f, 0xec, 0x31, 0x13, 0x95, 0xfb, 0xef, 0xe7, 0xe0, 0x5c,
0xfa, 0x9c, 0xe3, 0xb6, 0xd8, 0x1a, 0xfb, 0xc5, 0x40, 0x27, 0x83, 0xfc, 0xd8, 0x64, 0xa0, 0x62,
0xee, 0xf4, 0xe3, 0xc4, 0xdc, 0x74, 0x3a, 0x2f, 0x64, 0x4a, 0xe7, 0x0d, 0x00, 0x5e, 0xee, 0xd0,
0xd0, 0xf7, 0x09, 0x15, 0x21, 0xba, 0xa4, 0xbe, 0x09, 0xc4, 0x50, 0x6c, 0x50, 0xa0, 0x0d, 0x40,
0x7b, 0x7e, 0xd8, 0x3a, 0x14, 0x26, 0xd0, 0xe1, 0x45, 0x04, 0xe7, 0x92, 0x9c, 0xab, 0x36, 0x47,
0xb0, 0xf8, 0x14, 0x0e, 0xbb, 0x0f, 0x97, 0x76, 0x1c, 0xca, 0x1d, 0x29, 0xb9, 0xca, 0xa2, 0x81,
0x78, 0x63, 0xa4, 0x3d, 0x79, 0x6e, 0xd2, 0x90, 0x90, 0x6c, 0x3a, 0x81, 0x25, 0x2d, 0x8a, 0xfd,
0x17, 0x0b, 0x9e, 0x38, 0x55, 0xf7, 0x67, 0xd0, 0x1e, 0xdd, 0x4f, 0xb7, 0x47, 0x2f, 0x65, 0x1c,
0x23, 0x9f, 0xb6, 0x5a, 0xf9, 0x29, 0x29, 0xd5, 0x28, 0xcd, 0x40, 0x61, 0x87, 0x97, 0x9c, 0xf6,
0x2f, 0x2d, 0x98, 0x15, 0x4f, 0x93, 0x8c, 0xdf, 0xeb, 0x50, 0xd8, 0x0f, 0xf5, 0x88, 0xad, 0x24,
0xc5, 0x6f, 0x70, 0x00, 0x96, 0xf0, 0xc7, 0x98, 0xcf, 0xbf, 0x6d, 0x41, 0x7a, 0xf0, 0x8d, 0x5e,
0x91, 0xfe, 0x6e, 0xc5, 0x93, 0xe9, 0x09, 0x7d, 0xfd, 0xe5, 0x71, 0x8d, 0xdd, 0x85, 0x4c, 0x53,
0xce, 0x2b, 0x50, 0xc6, 0x61, 0x18, 0xed, 0x38, 0xd1, 0x01, 0xe3, 0x1b, 0xef, 0xf2, 0x07, 0x65,
0x1b, 0xb1, 0x71, 0x81, 0xc1, 0x12, 0x6e, 0xff, 0xc2, 0x82, 0x27, 0xc6, 0x7e, 0x12, 0xe1, 0xd7,
0xae, 0x15, 0xbf, 0xa9, 0x1d, 0xc5, 0x1e, 0x98, 0xd0, 0x61, 0x83, 0x8a, 0x77, 0x63, 0xa9, 0xef,
0x28, 0xc3, 0xdd, 0x58, 0x4a, 0x1b, 0x4e, 0xd3, 0xda, 0xff, 0xca, 0x41, 0x51, 0x8e, 0x79, 0xfe,
0xc7, 0xde, 0xfa, 0x34, 0x14, 0x99, 0xd0, 0xa3, 0x96, 0x17, 0x67, 0x72, 0xa9, 0x1d, 0x2b, 0xac,
0xe8, 0x60, 0x08, 0x63, 0x4e, 0x5b, 0x47, 0xb8, 0xa4, 0x83, 0x91, 0x60, 0xac, 0xf1, 0xe8, 0x45,
0x28, 0x52, 0xe2, 0xb0, 0xb8, 0x37, 0x5c, 0xd4, 0x22, 0xb1, 0x80, 0x9e, 0x0c, 0xea, 0xb3, 0x4a,
0xb8, 0x78, 0xc7, 0x8a, 0x1a, 0xdd, 0x83, 0x19, 0x97, 0x44, 0x8e, 0xe7, 0xeb, 0x6e, 0xe1, 0xf9,
0x49, 0xc6, 0x61, 0x6b, 0x92, 0xb5, 0x59, 0xe1, 0x6b, 0x52, 0x2f, 0x58, 0x0b, 0xe4, 0xd1, 0xb9,
0x15, 0xba, 0xf2, 0x4b, 0x6a, 0x21, 0x89, 0xce, 0xab, 0xa1, 0x4b, 0xb0, 0xc0, 0xd8, 0xef, 0x58,
0x50, 0x91, 0x92, 0x56, 0x9d, 0x1e, 0x23, 0xe8, 0x6a, 0xbc, 0x0b, 0x79, 0xdc, 0xba, 0x5e, 0x9c,
0xe6, 0x1d, 0xd6, 0xc9, 0xa0, 0x5e, 0x16, 0x64, 0xa2, 0xdd, 0xd2, 0x1b, 0x30, 0x6c, 0x94, 0x3b,
0xc3, 0x46, 0x4f, 0x41, 0x41, 0xdc, 0x1e, 0x65, 0xcc, 0xb8, 0x09, 0x11, 0x17, 0x0c, 0x4b, 0x9c,
0xfd, 0x71, 0x0e, 0xaa, 0xa9, 0xcd, 0x65, 0xe8, 0x38, 0xe2, 0xd1, 0x6b, 0x2e, 0xc3, 0x38, 0x7f,
0xfc, 0xf7, 0xef, 0xef, 0x40, 0xb1, 0xc5, 0xf7, 0xa7, 0xff, 0x80, 0x70, 0x75, 0x92, 0xa3, 0x10,
0x96, 0x49, 0x3c, 0x49, 0xbc, 0x32, 0xac, 0x04, 0xa2, 0x9b, 0x30, 0x4f, 0x49, 0x44, 0xfb, 0x2b,
0xfb, 0x11, 0xa1, 0xe6, 0x0c, 0xa0, 0x90, 0xd4, 0xe4, 0x78, 0x98, 0x00, 0x8f, 0xf2, 0xe8, 0x7c,
0x5a, 0x7c, 0x8c, 0x7c, 0x6a, 0xef, 0xc1, 0xec, 0x6d, 0x67, 0xcf, 0x8f, 0xbf, 0x29, 0x62, 0xa8,
0x7a, 0x41, 0xcb, 0xef, 0xb9, 0x44, 0x46, 0x62, 0x1d, 0xbd, 0xf4, 0xa5, 0xdd, 0x34, 0x91, 0x27,
0x83, 0xfa, 0x85, 0x14, 0x40, 0x7e, 0x44, 0xc3, 0x69, 0x11, 0xb6, 0x0f, 0xd3, 0x9f, 0x61, 0x8f,
0xfa, 0x5d, 0x28, 0x27, 0x5d, 0xc4, 0xa7, 0xac, 0xd2, 0x7e, 0x03, 0x4a, 0xdc, 0xe3, 0x75, 0xf7,
0x7b, 0x46, 0x49, 0x94, 0x2e, 0x56, 0x72, 0x59, 0x8a, 0x15, 0xbb, 0x03, 0xd5, 0x3b, 0x5d, 0xf7,
0x31, 0xbf, 0x2a, 0xe7, 0x32, 0x67, 0xad, 0x6b, 0x20, 0xff, 0xa9, 0xc1, 0x13, 0x84, 0xcc, 0xda,
0x46, 0x82, 0x30, 0x13, 0xaf, 0xf1, 0x55, 0xe1, 0x27, 0x16, 0x80, 0x18, 0xfb, 0xac, 0x1f, 0x91,
0x20, 0xe2, 0x76, 0xe0, 0x4e, 0x35, 0x6c, 0x07, 0x11, 0x19, 0x04, 0x06, 0xdd, 0x81, 0x62, 0x28,
0xbd, 0x49, 0x8e, 0xf9, 0x27, 0x9c, 0x98, 0xc6, 0x17, 0x49, 0xfa, 0x13, 0x56, 0xc2, 0x9a, 0x97,
0x3f, 0xf8, 0x64, 0x71, 0xea, 0xc3, 0x4f, 0x16, 0xa7, 0x3e, 0xfa, 0x64, 0x71, 0xea, 0xad, 0xe3,
0x45, 0xeb, 0x83, 0xe3, 0x45, 0xeb, 0xc3, 0xe3, 0x45, 0xeb, 0xa3, 0xe3, 0x45, 0xeb, 0xe3, 0xe3,
0x45, 0xeb, 0x9d, 0xbf, 0x2d, 0x4e, 0xdd, 0xcb, 0x1d, 0x5d, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff,
0xff, 0x83, 0xb7, 0x3e, 0x8b, 0x95, 0x26, 0x00, 0x00,
}

View File

@ -395,6 +395,14 @@ message ListMeta {
// identical to the value in the first response, unless you have received this token from an error
// message.
optional string continue = 3;
// RemainingItemCount is the number of subsequent items in the list which are not included in this
// list response. If the list request contained label or field selectors, then the number of
// remaining items is unknown and this field will be unset. If the list is complete (either
// because it is unpaginated or because this is the last page), then there are no more remaining
// items and this field will also be unset. Servers older than v1.15 do not set this field.
// +optional
optional int64 remainingItemCount = 4;
}
// ListOptions is the query options to a standard REST list call.

View File

@ -94,6 +94,8 @@ type ListInterface interface {
SetSelfLink(selfLink string)
GetContinue() string
SetContinue(c string)
GetRemainingItemCount() int64
SetRemainingItemCount(c int64)
}
// Type exposes the type and APIVersion of versioned or internal API objects.
@ -111,6 +113,8 @@ func (meta *ListMeta) GetSelfLink() string { return meta.SelfLink
func (meta *ListMeta) SetSelfLink(selfLink string) { meta.SelfLink = selfLink }
func (meta *ListMeta) GetContinue() string { return meta.Continue }
func (meta *ListMeta) SetContinue(c string) { meta.Continue = c }
func (meta *ListMeta) GetRemainingItemCount() int64 { return meta.RemainingItemCount }
func (meta *ListMeta) SetRemainingItemCount(c int64) { meta.RemainingItemCount = c }
func (obj *TypeMeta) GetObjectKind() schema.ObjectKind { return obj }

View File

@ -81,6 +81,14 @@ type ListMeta struct {
// identical to the value in the first response, unless you have received this token from an error
// message.
Continue string `json:"continue,omitempty" protobuf:"bytes,3,opt,name=continue"`
// RemainingItemCount is the number of subsequent items in the list which are not included in this
// list response. If the list request contained label or field selectors, then the number of
// remaining items is unknown and this field will be unset. If the list is complete (either
// because it is unpaginated or because this is the last page), then there are no more remaining
// items and this field will also be unset. Servers older than v1.15 do not set this field.
// +optional
RemainingItemCount int64 `json:"remainingItemCount,omitempty" protobuf:"bytes,4,opt,name=remainingItemCount"`
}
// These are internal finalizer values for Kubernetes-like APIs, must be qualified name unless defined here

View File

@ -197,10 +197,11 @@ func (List) SwaggerDoc() map[string]string {
}
var map_ListMeta = map[string]string{
"": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.",
"selfLink": "selfLink is a URL representing this object. Populated by the system. Read-only.",
"resourceVersion": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency",
"continue": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.",
"": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.",
"selfLink": "selfLink is a URL representing this object. Populated by the system. Read-only.",
"resourceVersion": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency",
"continue": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.",
"remainingItemCount": "RemainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and this field will be unset. If the list is complete (either because it is unpaginated or because this is the last page), then there are no more remaining items and this field will also be unset. Servers older than v1.15 do not set this field.",
}
func (ListMeta) SwaggerDoc() map[string]string {

View File

@ -275,6 +275,14 @@ func getNestedString(obj map[string]interface{}, fields ...string) string {
return val
}
func getNestedInt64(obj map[string]interface{}, fields ...string) int64 {
val, found, err := NestedInt64(obj, fields...)
if !found || err != nil {
return 0
}
return val
}
func jsonPath(fields []string) string {
return "." + strings.Join(fields, ".")
}

View File

@ -166,6 +166,14 @@ func (u *UnstructuredList) SetContinue(c string) {
u.setNestedField(c, "metadata", "continue")
}
func (u *UnstructuredList) GetRemainingItemCount() int64 {
return getNestedInt64(u.Object, "metadata", "remainingItemCount")
}
func (u *UnstructuredList) SetRemainingItemCount(c int64) {
u.setNestedField(c, "metadata", "remainingItemCount")
}
func (u *UnstructuredList) SetGroupVersionKind(gvk schema.GroupVersionKind) {
u.SetAPIVersion(gvk.GroupVersion().String())
u.SetKind(gvk.Kind)

View File

@ -193,28 +193,31 @@ func TestGenericTypeMeta(t *testing.T) {
}
type InternalTypeMeta struct {
Kind string `json:"kind,omitempty"`
Namespace string `json:"namespace,omitempty"`
Name string `json:"name,omitempty"`
GenerateName string `json:"generateName,omitempty"`
UID string `json:"uid,omitempty"`
CreationTimestamp metav1.Time `json:"creationTimestamp,omitempty"`
SelfLink string `json:"selfLink,omitempty"`
ResourceVersion string `json:"resourceVersion,omitempty"`
Continue string `json:"next,omitempty"`
APIVersion string `json:"apiVersion,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
Annotations map[string]string `json:"annotations,omitempty"`
Finalizers []string `json:"finalizers,omitempty"`
OwnerReferences []metav1.OwnerReference `json:"ownerReferences,omitempty"`
Kind string `json:"kind,omitempty"`
Namespace string `json:"namespace,omitempty"`
Name string `json:"name,omitempty"`
GenerateName string `json:"generateName,omitempty"`
UID string `json:"uid,omitempty"`
CreationTimestamp metav1.Time `json:"creationTimestamp,omitempty"`
SelfLink string `json:"selfLink,omitempty"`
ResourceVersion string `json:"resourceVersion,omitempty"`
Continue string `json:"next,omitempty"`
RemainingItemCount int64 `json:"remainingItemCount,omitempty"`
APIVersion string `json:"apiVersion,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
Annotations map[string]string `json:"annotations,omitempty"`
Finalizers []string `json:"finalizers,omitempty"`
OwnerReferences []metav1.OwnerReference `json:"ownerReferences,omitempty"`
}
func (m *InternalTypeMeta) GetResourceVersion() string { return m.ResourceVersion }
func (m *InternalTypeMeta) SetResourceVersion(rv string) { m.ResourceVersion = rv }
func (m *InternalTypeMeta) GetSelfLink() string { return m.SelfLink }
func (m *InternalTypeMeta) SetSelfLink(link string) { m.SelfLink = link }
func (m *InternalTypeMeta) GetContinue() string { return m.Continue }
func (m *InternalTypeMeta) SetContinue(c string) { m.Continue = c }
func (m *InternalTypeMeta) GetResourceVersion() string { return m.ResourceVersion }
func (m *InternalTypeMeta) SetResourceVersion(rv string) { m.ResourceVersion = rv }
func (m *InternalTypeMeta) GetSelfLink() string { return m.SelfLink }
func (m *InternalTypeMeta) SetSelfLink(link string) { m.SelfLink = link }
func (m *InternalTypeMeta) GetContinue() string { return m.Continue }
func (m *InternalTypeMeta) SetContinue(c string) { m.Continue = c }
func (m *InternalTypeMeta) GetRemainingItemCount() int64 { return m.RemainingItemCount }
func (m *InternalTypeMeta) SetRemainingItemCount(c int64) { m.RemainingItemCount = c }
type MyAPIObject struct {
TypeMeta InternalTypeMeta `json:",inline"`

View File

@ -604,7 +604,7 @@ func (c *Cacher) GetToList(ctx context.Context, key string, resourceVersion stri
}
}
if c.versioner != nil {
if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil {
if err := c.versioner.UpdateList(listObj, readResourceVersion, "", 0); err != nil {
return err
}
}
@ -679,7 +679,7 @@ func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, p
}
trace.Step(fmt.Sprintf("Filtered %d items", listVal.Len()))
if c.versioner != nil {
if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil {
if err := c.versioner.UpdateList(listObj, readResourceVersion, "", 0); err != nil {
return err
}
}

View File

@ -217,13 +217,14 @@ type testVersioner struct{}
func (testVersioner) UpdateObject(obj runtime.Object, resourceVersion uint64) error {
return meta.NewAccessor().SetResourceVersion(obj, strconv.FormatUint(resourceVersion, 10))
}
func (testVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string) error {
func (testVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string, count int64) error {
listAccessor, err := meta.ListAccessor(obj)
if err != nil || listAccessor == nil {
return err
}
listAccessor.SetResourceVersion(strconv.FormatUint(resourceVersion, 10))
listAccessor.SetContinue(continueValue)
listAccessor.SetRemainingItemCount(count)
return nil
}
func (testVersioner) PrepareObjectForStorage(obj runtime.Object) error {

View File

@ -44,7 +44,7 @@ func (a APIObjectVersioner) UpdateObject(obj runtime.Object, resourceVersion uin
}
// UpdateList implements Versioner
func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, nextKey string) error {
func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, nextKey string, count int64) error {
listAccessor, err := meta.ListAccessor(obj)
if err != nil || listAccessor == nil {
return err
@ -55,6 +55,7 @@ func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint6
}
listAccessor.SetResourceVersion(versionString)
listAccessor.SetContinue(nextKey)
listAccessor.SetRemainingItemCount(count)
return nil
}

View File

@ -413,7 +413,7 @@ func (s *store) GetToList(ctx context.Context, key string, resourceVersion strin
}
}
// update version with cluster level revision
return s.versioner.UpdateList(listObj, uint64(getResp.Header.Revision), "")
return s.versioner.UpdateList(listObj, uint64(getResp.Header.Revision), "", 0)
}
func (s *store) Count(key string) (int64, error) {
@ -576,9 +576,10 @@ func (s *store) List(ctx context.Context, key, resourceVersion string, pred stor
// loop until we have filled the requested limit from etcd or there are no more results
var lastKey []byte
var hasMore bool
var getResp *clientv3.GetResponse
for {
startTime := time.Now()
getResp, err := s.client.KV.Get(ctx, key, options...)
getResp, err = s.client.KV.Get(ctx, key, options...)
metrics.RecordEtcdRequestLatency("list", getTypeName(listPtr), startTime)
if err != nil {
return interpretListError(err, len(pred.Continue) > 0, continueKey, keyPrefix)
@ -639,11 +640,17 @@ func (s *store) List(ctx context.Context, key, resourceVersion string, pred stor
if err != nil {
return err
}
return s.versioner.UpdateList(listObj, uint64(returnedRV), next)
remainingItemCount := getResp.Count - pred.Limit
// getResp.Count counts in objects that do not match the pred.
// Instead of returning inaccurate count, return 0.
if !pred.Empty() {
remainingItemCount = 0
}
return s.versioner.UpdateList(listObj, uint64(returnedRV), next, remainingItemCount)
}
// no continuation
return s.versioner.UpdateList(listObj, uint64(returnedRV), "")
return s.versioner.UpdateList(listObj, uint64(returnedRV), "", 0)
}
// growSlice takes a slice value and grows its capacity up

View File

@ -825,14 +825,15 @@ func TestList(t *testing.T) {
}
tests := []struct {
name string
disablePaging bool
rv string
prefix string
pred storage.SelectionPredicate
expectedOut []*example.Pod
expectContinue bool
expectError bool
name string
disablePaging bool
rv string
prefix string
pred storage.SelectionPredicate
expectedOut []*example.Pod
expectContinue bool
expectedRemainingItemCount int64
expectError bool
}{
{
name: "rejects invalid resource version",
@ -882,8 +883,9 @@ func TestList(t *testing.T) {
Field: fields.Everything(),
Limit: 1,
},
expectedOut: []*example.Pod{preset[1].storedObj},
expectContinue: true,
expectedOut: []*example.Pod{preset[1].storedObj},
expectContinue: true,
expectedRemainingItemCount: 1,
},
{
name: "test List with limit when paging disabled",
@ -1061,6 +1063,9 @@ func TestList(t *testing.T) {
t.Errorf("(%s): length of list want=%d, got=%d", tt.name, len(tt.expectedOut), len(out.Items))
continue
}
if e, a := tt.expectedRemainingItemCount, out.ListMeta.RemainingItemCount; e != a {
t.Errorf("(%s): remainingItemCount want=%d, got=%d", tt.name, e, a)
}
for j, wantPod := range tt.expectedOut {
getPod := &out.Items[j]
if !reflect.DeepEqual(wantPod, getPod) {

View File

@ -40,10 +40,12 @@ type Versioner interface {
// from database.
UpdateObject(obj runtime.Object, resourceVersion uint64) error
// UpdateList sets the resource version into an API list object. Returns an error if the object
// cannot be updated correctly. May return nil if the requested object does not need metadata
// from database. continueValue is optional and indicates that more results are available if
// the client passes that value to the server in a subsequent call.
UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string) error
// cannot be updated correctly. May return nil if the requested object does not need metadata from
// database. continueValue is optional and indicates that more results are available if the client
// passes that value to the server in a subsequent call. remainingItemCount indicates the number
// of remaining objects if the list is partial. The remainingItemCount field is omitted during
// serialization if it is set to 0.
UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string, remainingItemCount int64) error
// PrepareObjectForStorage should set SelfLink and ResourceVersion to the empty value. Should
// return an error if the specified object cannot be updated.
PrepareObjectForStorage(obj runtime.Object) error

View File

@ -26,7 +26,7 @@ import (
"github.com/onsi/ginkgo"
"github.com/onsi/gomega"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
@ -88,6 +88,7 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
lastRV = list.ResourceVersion
}
gomega.Expect(list.ResourceVersion).To(gomega.Equal(lastRV))
gomega.Expect(int(list.RemainingItemCount) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
for _, item := range list.Items {
gomega.Expect(item.Name).To(gomega.Equal(fmt.Sprintf("template-%04d", found)))
found++
@ -120,6 +121,7 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit)
firstToken := list.Continue
firstRV := list.ResourceVersion
gomega.Expect(int(list.RemainingItemCount) + len(list.Items)).To(gomega.BeNumerically("==", numberOfTotalResources))
framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, firstToken)
ginkgo.By("retrieving the second page until the token expires")
@ -153,7 +155,8 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given inconsistent continue token %s and limit: %d", ns, opts.Continue, opts.Limit)
gomega.Expect(list.ResourceVersion).ToNot(gomega.Equal(firstRV))
gomega.Expect(len(list.Items)).To(gomega.BeNumerically("==", opts.Limit))
found := oneTenth
found := int(oneTenth)
gomega.Expect(int(list.RemainingItemCount) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
for _, item := range list.Items {
gomega.Expect(item.Name).To(gomega.Equal(fmt.Sprintf("template-%04d", found)))
found++
@ -165,6 +168,7 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
for {
list, err := client.List(opts)
gomega.Expect(err).ToNot(gomega.HaveOccurred(), "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit)
gomega.Expect(int(list.RemainingItemCount) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, list.Continue)
gomega.Expect(len(list.Items)).To(gomega.BeNumerically("<=", opts.Limit))
gomega.Expect(list.ResourceVersion).To(gomega.Equal(lastRV))