-
Notifications
You must be signed in to change notification settings - Fork 0
/
stats.p8
316 lines (284 loc) · 20.3 KB
/
stats.p8
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
pico-8 cartridge // http://www.pico-8.com
version 16
__lua__
-- cpu mem profiler
-- droune2001
--[[
todo
* measure the memory consumption of the profiler.
render it a different color.
]]
function _init()
profiler = create_profiler()
profiler:init()
end
function _update60()
local dt=1.0/60.0
fill_mem(dt)
profiler:log_update_time()
end
function _draw()
cls(12)
burn_cpu_with_useless_draw()
profiler:draw()
end
-->8
function print_outline(t,x,y,c,bc)
color(bc or 0)
print(t,x-1,y)print(t,x-1,y-1)print(t,x,y-1)print(t,x+1,y-1)
print(t,x+1,y)print(t,x+1,y+1)print(t,x,y+1)print(t,x-1,y+1)
print(t,x,y,c)
end
-- uses 42k of memory
-- uses 15% cpu to draw. 13% without outlines.
function create_profiler()
return {
curr_frame=1,
cpu_hist={},
mem_hist={},
cpu_update_mean=0,
cpu_draw_mean=0,
cpu_mean=0,
mem_mean=0,
init = function(this)
for i=1,60 do
-- upd,dra, pix norms
this.cpu_hist[i]={0,0,0,0}
-- real val, pix norm
this.mem_hist[i]={0,0}
end
end,
log_update_time = function(this)
this.cpu_hist[this.curr_frame+1][1]=stat(1)
end,
log_draw_time = function(this)
this.mem_hist[this.curr_frame+1][1]=stat(0)
this.cpu_hist[this.curr_frame+1][2]=stat(1)
end,
-- normalize stats and compute means
compute_frame_stats = function(this)
this.curr_frame = (this.curr_frame+1)%60
this.cpu_update_mean=0
this.cpu_draw_mean=0
this.cpu_mean=0
this.mem_mean=0
for i=1,60 do
local c1=31*this.cpu_hist[i][1]
local c2=31*this.cpu_hist[i][2]
this.cpu_hist[i][3]=c1
this.cpu_hist[i][4]=c2
this.cpu_mean+=c2
this.cpu_update_mean+=c1
this.cpu_draw_mean+=c2-c1
local m=62*(this.mem_hist[i][1]/2048.0)
this.mem_mean+=m
this.mem_hist[i][2]=m
end
this.cpu_mean = this.cpu_mean/60
this.cpu_update_mean = this.cpu_update_mean/60
this.cpu_draw_mean = this.cpu_draw_mean/60
this.mem_mean = this.mem_mean / 60
end,
update = function(this)
this:log_update_time()
end,
draw = function(this)
this:log_draw_time()
this:compute_frame_stats()
local chox=1 -- cpu hist offset x
local mhox=chox+66
for i=1,60 do
local c1=this.cpu_hist[i][3]
local c2=this.cpu_hist[i][4]
-- update time
line(chox+i,126,chox+i,126-c1,6)
-- draw time
line(chox+i,126-c1-1,chox+i,126-c2,13)
-- outline
local mx=c2
if i>1 then mx=max(mx,this.cpu_hist[i-1][4]) end
if i<60 then mx=max(mx,this.cpu_hist[i+1][4]) end
line(chox+i,126-mx,chox+i,126-c2,1)
local m=this.mem_hist[i][2]
if m > 0 then
line(mhox+i,126,mhox+i,126-m,9)
mx=m
if i>1 then mx=max(mx,this.mem_hist[i-1][2]) end
if i<60 then mx=max(mx,this.mem_hist[i+1][2]) end
line(mhox+i,126-mx,mhox+i,126-m,1)
end
end
line(chox+1,126-this.cpu_mean,chox+60,126-this.cpu_mean,8)
print_outline("total",chox+13,126-this.cpu_mean-6,8)
line(chox+1,126-this.cpu_update_mean,chox+60,126-this.cpu_update_mean,9)
print_outline("upd",chox+34,126-this.cpu_update_mean-6,9)
line(chox+1,126-this.cpu_draw_mean,chox+60,126-this.cpu_draw_mean,10)
print_outline("drw",chox+47,126-this.cpu_draw_mean-6,10)
line(mhox+1,126-this.mem_mean,126,126-this.mem_mean,5)
-- containers
line(chox, 127, chox+61,127, 0) -- bottom
line(chox, 127-32,chox+2, 127-32,0) -- 60 tick
line(chox, 127-64,chox+2, 127-64,0) -- 30 tick
line(chox, 127-64,chox, 127, 0) -- v left
line(chox+61,127-64,chox+61,127, 0) -- v right
line(mhox,127, 127, 127, 0) -- bottom
line(mhox,127-32,mhox+2,127-32,0) -- 1M tick
line(mhox,127-64,mhox+2,127-64,0) -- 2M tick
line(mhox,127-64,mhox, 127, 0) -- v left
line(127, 127-64,127, 127, 0) -- v right
print_outline("30",chox+4,127-66,8)
print_outline("60",chox+4,127-34,11)
print_outline("2m",mhox+4,127-66,8)
print_outline("1m",mhox+4,127-34,11)
print_outline(stat(0).." k",mhox+3,127-7,7)
print_outline(flr(stat(1)*100).."%",chox+3,127-7,7)
end
}
end -- create_profiler
-->8
fake_list={}
elapsed=0.0
function fill_mem(dt)
fake_list={}
elapsed+=dt
local r = 2048+cos(0.1*elapsed)*1024+rnd(64)
for i=1,r do
local one_octet={a=1,b=2}
add(fake_list,one_octet)
end
end
function burn_cpu_with_useless_draw()
local r = 256+rnd(64)
for i=1,r do
spr(0,0,0)
end
end
__label__
777c777c777ccccccccc777c777ccccc777c777c777c777ccccccc7ccccc777c777c7c7c777ccccc7c7c777ccccccccccccccccccccccccccccccccccccccccc
777c7ccc777cc7cccccc7c7ccc7ccccc7ccc7c7c7c7c7c7cccccc7cccccccc7c7c7c7c7c7c7ccccc7c7c7c7ccccccccccccccccccccccccccccccccccccccccc
7c7c77cc7c7ccccccccc777cc77ccccc777c777c7c7c777cccccc7cccccc777c7c7c777c777ccccc77cc77cccccccccccccccccccccccccccccccccccccccccc
7c777ccc7c7cc7cccccccc7ccc7ccccccc7ccc7c7c7c7c7cccccc7cccccc7ccc7c7ccc7c7c7ccccc7c7c7c7ccccccccccccccccccccccccccccccccccccccccc
7c77777c7c7ccccccccccc7c777cc7cc777ccc7c777c777ccccc7ccccccc777c777ccc7c777ccccc7c7c777ccccccccccccccccccccccccccccccccccccccccc
cc7cc7cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c77c777c7c7ccccccccc777c777c77cc7c7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
7ccc7c7c7c7cc7cccccccc7ccc7cc7cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
7ccc777c7c7ccccccccc777c777cc7ccc7cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
7ccc7ccc7c7cc7cccccc7ccc7cccc7cc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c77c7cccc77ccccccccc777c777c777c7c7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccc111cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc111ccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1ccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1ccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1ccc1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1c111d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1c1d1d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1c1ddd1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1c1ddd1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1c1ddd1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1d1c1ddd1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc1000000000111cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc10888088801d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccc10008080801d1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c000d088080801d1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c10008080801d1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c10888088801d1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1000000000dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1dd11d6611dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1dd11d6611dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1ddd1d6611dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1ddd1d6611dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1dd61d66d1dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c16d61d66d1dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c16661666d1dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c16666666d1dd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c16666666dddd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c16666666dddd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c16666666dddd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c16666666dddd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c166666666ddd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c166666666ddd1cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666d61cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666d61cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666d61cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666d61cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1666666666661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c1000600000661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0c10b060bbb0661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0110b000b0b0661cccccccccccccccccccccccccccccccccccccccccccccc0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c0000bbb0b0b0661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d0b0b0b0b0661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d0bbb0bbb0661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d000000000661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d6666666660000000000000000000cccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d6666666660888008808880888080cccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d6666666660080080800800808080cccccccccccccccccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d6666666666080080800800888080cc000000000000cccccccccccccccc0cccc7ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01d6666666666080080800800808080000909099909900ccccccccccccccc0cccc7cccc9cccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c0166666666666080088000800808088800909090909090ccccccccccccccc0cccc7cccc9cccccccccccccccccccccccccccccccccccccccccccccccccccccc7
c01666666666660000000c0000000000000909099909090ccccccccccccccc0cccc7cccc9cccccc9ccccccccccccccccccccccccccccccccccccccccccccccc7
c08888888888888888888888888888888809090900090908888888888888880cccc7cccc9ccccc99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661cccccccccccccccccc0099090c09990ccccccccccccccc0cccc7cccc9ccccc99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661ccccccccccccccccccc000000c00000ccccccccccccccc0cccc7cccc9ccccc99ccccccccccccccccccccccccccccccccccccccccccccccc7
c09999999999999999999999999999999999999999999990000000000000990cccc7cccc9ccccc99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661ccccccccccccccccccccccccccccccc0aa00aaa0a0a0cc0cccc7cccc9ccccc99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661ccccccccccccccccccccccccccccccc0a0a0a0a0a0a0cc0cccc7cccc9ccccc99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661ccccccccccccccccccccccccccccccc0a0a0aa00a0a0cc0cccc7cccc9ccc9c99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661ccccccccccccccccccccccccccccccc0a0a0a0a0aaa0cc0cccc7cc9c9ccc9c99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661ccccccccccccccccccccccccccccccc0aaa0a0a0aaa0cc0cccc7cc9c9c9c9c99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661ccccccccccccccccccccccccccccccc0000000000000cc0cccc7cc9c9c9c9c99ccccccccccccccccccccccccccccccccccccccccccccccc7
c0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0cccc7cc9c9c9c9c99ccccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661cccccccccccccccccccccccccccccccccccccccccccccc0cccc7cc9c9c9c9c999cccccccccccccccccccccccccccccccccccccccccccccc7
c016666666666661dddddddddddddddddddddddddddddddddddddddddddddd0cccc7555555555555555555555555555555555555555555555555555555555557
c01666666666666111111111111111111111111111111111111111111111110cccc7cc9c9c999c999cccccccccccccccccccccccccccccccccccccccccccccc7
c00000000000000000000000000000000000000000000000000000000000000cccc7777777777777777777777777777777777777777777777777777777777777