blob: 99163ba5becaaa9fec3e8809aaa2599bcf559df4 [file] [log] [blame]
/*
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_MODULES_VIDEO_CODING_SOURCE_ER_TABLES_XOR_H_
#define WEBRTC_MODULES_VIDEO_CODING_SOURCE_ER_TABLES_XOR_H_
// This is a private header for media_opt_util.cc.
// It should not be included by other files.
namespace webrtc {
// Table for average FEC recovery from packet loss, for XOR code.
// From RPL model of random loss.
// Input is the received packet loss (up to 50%), and FEC code parameters
// (up to 24x24):
// i.e., kAvgFECRecoveryXOR[k] where k = code_i*129 + loss_j;
// code_i=1x1,2x1,2x2,..24x24, loss_j = 0,1,..128.
// Maximum number of source packets in off-line model
static const int kMaxNumPackets = 24;
// Max value of loss rates in off-line model
static const int kPacketLossMax = 129;
// Table size for model is: kPacketLossMax * numberOfFecCodes = 38700
// numberOfFecCodes is determined as:
// {(1,1), (2,1), (2,2),...(n,1),..(n,n-1), (n,n)} = n*(n+1)/2
// for n = kMaxNumPackets.
static const int kSizeAvgFECRecoveryXOR = 38700;
static const unsigned char kAvgFECRecoveryXOR[kSizeAvgFECRecoveryXOR] = {
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
14,
15,
16,
17,
18,
19,
20,
20,
21,
22,
23,
24,
24,
25,
26,
27,
27,
28,
29,
30,
30,
31,
32,
33,
33,
34,
35,
35,
36,
37,
37,
38,
38,
39,
40,
40,
41,
41,
42,
43,
43,
44,
44,
45,
45,
46,
46,
47,
47,
48,
48,
49,
49,
50,
50,
51,
51,
52,
52,
52,
53,
53,
54,
54,
54,
55,
55,
55,
56,
56,
56,
57,
57,
57,
58,
58,
58,
59,
59,
59,
59,
60,
60,
60,
60,
60,
61,
61,
61,
61,
61,
62,
62,
62,
62,
62,
62,
62,
63,
63,
63,
63,
63,
63,
63,
63,
63,
63,
63,
63,
63,
63,
63,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
10,
11,
12,
13,
14,
14,
15,
16,
16,
17,
18,
19,
19,
20,
20,
21,
22,
22,
23,
23,
24,
25,
25,
26,
26,
27,
27,
27,
28,
28,
29,
29,
30,
30,
30,
31,
31,
31,
32,
32,
32,
33,
33,
33,
34,
34,
34,
34,
35,
35,
35,
35,
35,
36,
36,
36,
36,
36,
36,
36,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
36,
36,
36,
36,
36,
36,
36,
36,
35,
35,
35,
35,
35,
35,
34,
34,
34,
34,
34,
33,
33,
33,
33,
32,
32,
32,
32,
31,
31,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
19,
20,
21,
22,
23,
24,
25,
25,
26,
27,
28,
29,
30,
30,
31,
32,
33,
34,
34,
35,
36,
37,
37,
38,
39,
39,
40,
41,
41,
42,
43,
43,
44,
45,
45,
46,
46,
47,
48,
48,
49,
49,
50,
50,
51,
51,
52,
52,
53,
53,
54,
54,
55,
55,
56,
56,
56,
57,
57,
58,
58,
58,
59,
59,
59,
60,
60,
60,
60,
61,
61,
61,
61,
62,
62,
62,
62,
63,
63,
63,
63,
63,
63,
63,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
64,
63,
63,
63,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
8,
9,
10,
11,
11,
12,
13,
13,
14,
15,
15,
16,
16,
17,
17,
18,
18,
19,
19,
20,
20,
21,
21,
21,
22,
22,
22,
23,
23,
23,
23,
24,
24,
24,
24,
25,
25,
25,
25,
25,
25,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
26,
25,
25,
25,
25,
25,
25,
25,
25,
24,
24,
24,
24,
24,
24,
23,
23,
23,
23,
23,
22,
22,
22,
22,
22,
21,
21,
21,
21,
20,
20,
20,
20,
19,
19,
19,
19,
19,
18,
18,
18,
18,
17,
17,
17,
17,
16,
16,
16,
16,
15,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
15,
16,
17,
18,
19,
20,
20,
21,
22,
23,
24,
24,
25,
26,
27,
27,
28,
29,
29,
30,
31,
31,
32,
33,
33,
34,
34,
35,
36,
36,
37,
37,
38,
38,
39,
39,
40,
40,
41,
41,
41,
42,
42,
43,
43,
43,
44,
44,
44,
45,
45,
45,
45,
46,
46,
46,
46,
47,
47,
47,
47,
47,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
48,
47,
47,
47,
47,
47,
47,
46,
46,
46,
46,
46,
45,
45,
45,
45,
44,
44,
44,
44,
43,
43,
43,
42,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
29,
30,
31,
32,
33,
34,
35,
36,
36,
37,
38,
39,
40,
41,
41,
42,
43,
44,
44,
45,
46,
47,
47,
48,
49,
49,
50,
51,
51,
52,
53,
53,
54,
54,
55,
55,
56,
56,
57,
57,
58,
58,
59,
59,
60,
60,
61,
61,
61,
62,
62,
62,
63,
63,
63,
63,
64,
64,
64,
64,
65,
65,
65,
65,
65,
65,
65,
65,
65,
66,
66,
66,
66,
66,
66,
66,
65,
65,
65,
65,
65,
65,
65,
65,
65,
64,
64,
64,
64,
63,
63,
63,
63,
62,
62,
62,
61,
61,
0,
0,
1,
2,
3,
4,
5,
6,
7,
7,
8,
9,
9,
10,
11,
11,
12,
12,
13,
13,
14,
14,
15,
15,
16,
16,
16,
17,
17,
17,
18,
18,
18,
18,
19,
19,
19,
19,
19,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
20,
19,
19,
19,
19,
19,
19,
19,
18,
18,
18,
18,
18,
18,
17,
17,
17,
17,
17,
16,
16,
16,
16,
16,
15,
15,
15,
15,
15,
14,
14,
14,
14,
14,
13,
13,
13,
13,
13,
12,
12,
12,
12,
11,
11,
11,
11,
11,
10,
10,
10,
10,
10,
9,
9,
9,
9,
9,
8,
8,
8,
8,
8,
7,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
13,
14,
15,
16,
17,
17,
18,
19,
20,
20,
21,
22,
23,
23,
24,
24,
25,
26,
26,
27,
27,
28,
29,
29,
30,
30,
30,
31,
31,
32,
32,
33,
33,
33,
34,
34,
34,
35,
35,
35,
35,
36,
36,
36,
36,
36,
37,
37,
37,
37,
37,
37,
37,
37,
38,
38,
38,
38,
38,
38,
38,
38,
38,
37,
37,
37,
37,
37,
37,
37,
37,
37,
37,
36,
36,
36,
36,
36,
35,
35,
35,
35,
35,
34,
34,
34,
34,
33,
33,
33,
32,
32,
32,
32,
31,
31,
31,
30,
30,
30,
29,
29,
29,
28,
28,
27,
27,
27,
26,
26,
26,
25,
25,
25,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
21,
22,
23,
24,
25,
26,
27,
27,
28,
29,
30,
31,
31,
32,
33,
34,
34,
35,
36,
36,
37,
38,
38,
39,
40,
40,
41,
42,
42,
43,
43,
44,
44,
45,
45,
46,
46,
47,
47,
48,
48,
48,
49,
49,
50,
50,
50,
51,
51,
51,
51,
52,
52,
52,
52,
53,
53,
53,
53,
53,
53,
53,
53,
54,
54,
54,
54,
54,
54,
54,
54,
54,
54,
54,
53,
53,
53,
53,
53,
53,
53,
53,
52,
52,
52,
52,
52,
51,
51,
51,
51,
50,
50,
50,
49,
49,
49,
48,
48,
48,
47,
47,
47,
46,
46,
45,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
32,
33,
34,
35,
36,
37,
38,
39,
39,
40,
41,
42,
43,
43,
44,
45,
46,
47,
47,
48,
49,
49,
50,
51,
52,
52,
53,
54,
54,
55,
55,
56,
57,
57,
58,
58,
59,
59,
60,
60,
61,
61,
62,
62,
62,
63,
63,
64,
64,
64,
65,
65,
65,
65,
66,
66,
66,
66,
67,
67,
67,
67,
67,
67,
67,
67,
67,
67,
67,
68,
67,
67,
67,
67,
67,
67,
67,
67,
67,
67,
67,
66,
66,
66,
66,
65,
65,
65,
65,
64,
64,
64,
63,
63,
63,
0,
0,
1,
2,
3,
4,
5,
6,
6,
7,
8,
8,
9,
10,
10,
11,
11,
12,
12,
12,
13,
13,
14,
14,
14,
14,
15,
15,
15,
15,
16,
16,
16,
16,
16,
16,
16,
16,
16,
17,
17,
17,
17,
17,
17,
17,
17,
16,
16,
16,
16,
16,
16,
16,
16,
16,
16,
16,
15,
15,
15,
15,
15,
15,
15,
14,
14,
14,
14,
14,
14,
13,
13,
13,
13,
13,
12,
12,
12,
12,
12,
11,
11,
11,
11,
11,
10,
10,
10,
10,
10,
10,
9,
9,
9,
9,
9,
8,
8,
8,
8,
8,
7,
7,
7,
7,
7,
7,
6,
6,
6,
6,
6,
6,
5,
5,
5,
5,
5,
5,
4,
4,
4,
4,
4,
4,
4,
4,
3,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
10,
11,
12,
13,
14,
14,
15,
16,
17,
17,
18,
19,
19,
20,
20,
21,
22,
22,
23,
23,
24,
24,
25,
25,
26,
26,
26,
27,
27,
28,
28,
28,
28,
29,
29,
29,
30,
30,
30,
30,
30,
31,
31,
31,
31,
31,
31,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
31,
31,
31,
31,
31,
31,
31,
31,
30,
30,
30,
30,
30,
30,
29,
29,
29,
29,
28,
28,
28,
28,
27,
27,
27,
27,
26,
26,
26,
26,
25,
25,
25,
25,
24,
24,
24,
23,
23,
23,
22,
22,
22,
21,
21,
21,
21,
20,
20,
20,
19,
19,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
17,
18,
19,
20,
21,
22,
22,
23,
24,
25,
26,
26,
27,
28,
29,
29,
30,
31,
31,
32,
33,
33,
34,
34,
35,
35,
36,
37,
37,
38,
38,
39,
39,
39,
40,
40,
41,
41,
41,
42,
42,
42,
43,
43,
43,
43,
44,
44,
44,
44,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
46,
46,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
44,
44,
44,
44,
44,
43,
43,
43,
43,
42,
42,
42,
42,
41,
41,
41,
40,
40,
40,
39,
39,
39,
38,
38,
38,
37,
37,
36,
36,
36,
35,
35,
34,
34,
34,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
27,
28,
29,
30,
31,
32,
33,
33,
34,
35,
36,
37,
37,
38,
39,
40,
40,
41,
42,
43,
43,
44,
44,
45,
46,
46,
47,
47,
48,
49,
49,
50,
50,
51,
51,
51,
52,
52,
53,
53,
53,
54,
54,
54,
55,
55,
55,
55,
56,
56,
56,
56,
56,
57,
57,
57,
57,
57,
57,
57,
57,
57,
57,
57,
57,
57,
57,
57,
57,
56,
56,
56,
56,
56,
55,
55,
55,
55,
55,
54,
54,
54,
53,
53,
53,
52,
52,
52,
51,
51,
50,
50,
49,
49,
49,
48,
48,
47,
47,
46,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
32,
33,
34,
35,
36,
37,
38,
39,
39,
40,
41,
42,
43,
44,
44,
45,
46,
47,
47,
48,
49,
50,
50,
51,
52,
52,
53,
54,
54,
55,
56,
56,
57,
57,
58,
58,
59,
60,
60,
61,
61,
61,
62,
62,
63,
63,
64,
64,
64,
65,
65,
65,
66,
66,
66,
66,
67,
67,
67,
67,
67,
67,
68,
68,
68,
68,
68,
68,
68,
68,
68,
68,
68,
68,
68,
68,
68,
67,
67,
67,
67,
67,
67,
66,
66,
66,
66,
65,
65,
65,
64,
64,
64,
63,
63,
0,
0,
1,
2,
3,
4,
5,
5,
6,
7,
7,
8,
8,
9,
9,
10,
10,
11,
11,
11,
12,
12,
12,
13,
13,
13,
13,
13,
13,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
14,
13,
13,
13,
13,
13,
13,
13,
13,
12,
12,
12,
12,
12,
12,
11,
11,
11,
11,
11,
11,
10,
10,
10,
10,
10,
10,
9,
9,
9,
9,
9,
8,
8,
8,
8,
8,
7,
7,
7,
7,
7,
7,
6,
6,
6,
6,
6,
6,
5,
5,
5,
5,
5,
5,
5,
4,
4,
4,
4,
4,
4,
4,
3,
3,
3,
3,
3,
3,
3,
3,
3,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
1,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
10,
11,
12,
13,
13,
14,
15,
15,
16,
17,
17,
18,
19,
19,
20,
20,
21,
21,
22,
22,
22,
23,
23,
24,
24,
24,
25,
25,
25,
25,
26,
26,
26,
26,
26,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
27,
26,
26,
26,
26,
26,
26,
25,
25,
25,
25,
25,
24,
24,
24,
24,
23,
23,
23,
23,
22,
22,
22,
22,
21,
21,
21,
21,
20,
20,
20,
19,
19,
19,
18,
18,
18,
18,
17,
17,
17,
16,
16,
16,
15,
15,
15,
15,
14,
14,
14,
13,
13,
13,
13,
12,
12,
12,
11,
11,
11,
11,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
15,
16,
17,
18,
19,
20,
20,
21,
22,
23,
23,
24,
25,
25,
26,
27,
27,
28,
29,
29,
30,
30,
31,
31,
32,
32,
33,
33,
34,
34,
35,
35,
35,
36,
36,
37,
37,
37,
37,
38,
38,
38,
38,
39,
39,
39,
39,
39,
39,
39,
39,
40,
40,
40,
40,
40,
40,
40,
40,
40,
40,
39,
39,
39,
39,
39,
39,
39,
39,
38,
38,
38,
38,
38,
37,
37,
37,
37,
36,
36,
36,
36,
35,
35,
35,
34,
34,
34,
33,
33,
33,
32,
32,
32,
31,
31,
31,
30,
30,
29,
29,
29,
28,
28,
27,
27,
27,
26,
26,
25,
25,
25,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
25,
26,
27,
28,
29,
30,
30,
31,
32,
33,
34,
34,
35,
36,
36,
37,
38,
38,
39,
40,
40,
41,
42,
42,
43,
43,
44,
44,
45,
45,
46,
46,
46,
47,
47,
47,
48,
48,
48,
49,
49,
49,
49,
49,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
50,
49,
49,
49,
49,
49,
48,
48,
48,
48,
47,
47,
47,
47,
46,
46,
45,
45,
45,
44,
44,
43,
43,
43,
42,
42,
41,
41,
40,
40,
39,
39,
38,
38,
37,
37,
36,
36,
35,
35,
34,
33,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
30,
31,
32,
33,
34,
35,
36,
37,
37,
38,
39,
40,
41,
41,
42,
43,
44,
44,
45,
46,
46,
47,
48,
48,
49,
50,
50,
51,
51,
52,
52,
53,
53,
54,
54,
55,
55,
56,
56,
56,
57,
57,
57,
58,
58,
58,
58,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
59,
58,
58,
58,
58,
57,
57,
57,
56,
56,
56,
55,
55,
55,
54,
54,
53,
53,
52,
52,
51,
51,
50,
50,
49,
49,
48,
48,
47,
46,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
39,
40,
41,
42,
43,
44,
45,
46,
46,
47,
48,
49,
50,
50,
51,
52,
53,
53,
54,
55,
55,
56,
57,
57,
58,
58,
59,
60,
60,
61,
61,
62,
62,
63,
63,
63,
64,
64,
64,
65,
65,
65,
66,
66,
66,
66,
66,
66,
67,
67,
67,
67,
67,
67,
67,
67,
67,
67,
66,
66,
66,
66,
66,
66,
65,
65,
65,
64,
64,
64,
63,
63,
63,
62,
62,
61,
61,
60,
60,
59,
59,
58,
57,
57,
56,
55,
55,
54,
0,
0,
1,
2,
3,
4,
5,
5,
6,
6,
7,
8,
8,
9,
9,
9,
10,
10,
10,
11,
11,
11,
11,
11,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
11,
11,
11,
11,
11,
11,
11,
11,
10,
10,
10,
10,
10,
10,
9,
9,
9,
9,
9,
8,
8,
8,
8,
8,
8,
7,
7,
7,
7,
7,
7,
6,
6,
6,
6,
6,
6,
5,
5,
5,
5,
5,
5,
4,
4,
4,
4,
4,
4,
4,
4,
3,
3,
3,
3,
3,
3,
3,
3,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
0,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
8,
9,
10,
11,
11,
12,
13,
13,
14,
15,
15,
16,
16,
17,
17,
18,
18,
19,
19,
19,
20,
20,
20,
21,
21,
21,
22,
22,
22,
22,
23,
23,
23,
23,
23,
23,
23,
23,
24,
24,
24,
24,
24,
24,
24,
24,
24,
24,
24,
24,
23,
23,
23,
23,
23,
23,
23,
23,
23,
22,
22,
22,
22,
22,
22,
21,
21,
21,
21,
21,
20,
20,
20,
20,
19,
19,
19,
19,
19,
18,
18,
18,
18,
17,
17,
17,
17,
16,
16,
16,
16,
15,
15,
15,
14,
14,
14,
14,
13,
13,
13,
13,
12,
12,
12,
12,
11,
11,
11,
11,
10,
10,
10,
10,
10,
9,
9,
9,
9,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
14,
15,
16,
17,
18,
19,
19,
20,
21,
22,
22,
23,
24,
24,
25,
25,
26,
27,
27,
28,
28,
29,
29,
30,
30,
30,
31,
31,
32,
32,
32,
32,
33,
33,
33,
33,
34,
34,
34,
34,
34,
34,
34,
34,
35,
35,
35,
35,
35,
34,
34,
34,
34,
34,
34,
34,
34,
34,
33,
33,
33,
33,
33,
32,
32,
32,
32,
31,
31,
31,
31,
30,
30,
30,
29,
29,
29,
28,
28,
28,
27,
27,
26,
26,
26,
25,
25,
25,
24,
24,
23,
23,
23,
22,
22,
21,
21,
21,
20,
20,
19,
19,
19,
18,
18,
17,
17,
17,
16,
16,
15,
15,
15,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
17,
18,
19,
20,
21,
22,
23,
23,
24,
25,
26,
27,
27,
28,
29,
30,
30,
31,
32,
32,
33,
34,
34,
35,
35,
36,
36,
37,
38,
38,
39,
39,
39,
40,
40,
41,
41,
41,
42,
42,
42,
43,
43,
43,
44,
44,
44,
44,
44,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
45,
44,
44,
44,
44,
44,
43,
43,
43,
43,
42,
42,
42,
42,
41,
41,
41,
40,
40,
40,
39,
39,
38,
38,
38,
37,
37,
36,
36,
35,
35,
35,
34,
34,
33,
33,
32,
32,
31,
31,
30,
30,
29,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
28,
29,
30,
31,
32,
33,
34,
34,
35,
36,
37,
37,
38,
39,
40,
40,
41,
42,
42,
43,
44,
44,
45,
45,
46,
46,
47,
47,
48,
48,
49,
49,
50,
50,
50,
51,
51,
51,
52,
52,
52,
52,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
53,
52,
52,
52,
52,
52,
51,
51,
51,
50,
50,
50,
49,
49,
49,
48,
48,
47,
47,
46,
46,
45,
45,
44,
44,
43,
43,
42,
42,
41,
41,
40,
39,
39,
38,
38,
37,
36,
36,
35,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
34,
35,
36,
37,
38,
39,
40,
40,
41,
42,
43,
44,
45,
45,
46,
47,
48,
48,
49,
50,
50,
51,
52,
52,
53,
54,
54,
55,
55,
56,
56,
57,
57,
58,
58,
59,
59,
59,
60,
60,
60,
61,
61,
61,
61,
62,
62,
62,
62,
62,
62,
62,
62,
63,
63,
63,
63,
62,
62,
62,
62,
62,
62,
62,
62,
61,
61,
61,
61,
60,
60,
60,
59,
59,
58,
58,
58,
57,
57,
56,
56,
55,
55,
54,
54,
53,
52,
52,
51,
51,
50,
49,
49,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
41,
42,
43,
44,
45,
46,
47,
48,
48,
49,
50,
51,
52,
52,
53,
54,
55,
55,
56,
57,
57,
58,
59,
59,
60,
61,
61,
62,
62,
63,
63,
64,
64,
65,
65,
65,
66,
66,
66,
67,
67,
67,
68,
68,
68,
68,
68,
68,
69,
69,
69,
69,
69,
69,
69,
69,
68,
68,
68,
68,
68,
68,
67,
67,
67,
67,
66,
66,
65,
65,
65,
64,
64,
63,
63,
62,
62,
61,
61,
60,
59,
59,
58,
57,
57,
56,
0,
0,
1,
2,
3,
4,
4,
5,
6,
6,
7,
7,
8,
8,
8,
9,
9,
9,
10,
10,
10,
10,
10,
10,
10,
10,
10,
11,
11,
11,
11,
10,
10,
10,
10,
10,
10,
10,
10,
10,
10,
10,
9,
9,
9,
9,
9,
9,
9,
8,
8,
8,
8,
8,
8,
7,
7,
7,
7,
7,
7,
6,
6,
6,
6,
6,
6,
5,
5,
5,
5,
5,
5,
4,
4,
4,
4,
4,
4,
4,
3,
3,