Codebase list edid-decode / 66745af
New upstream snapshot. Debian Janitor 2 years ago
12 changed file(s) with 2868 addition(s) and 1786 deletion(s). Raw diff Collapse all Expand all
44
55 SOURCES = edid-decode.cpp parse-base-block.cpp parse-cta-block.cpp \
66 parse-displayid-block.cpp parse-ls-ext-block.cpp \
7 parse-di-ext-block.cpp parse-vtb-ext-block.cpp
7 parse-di-ext-block.cpp parse-vtb-ext-block.cpp calc-gtf-cvt.cpp
88 WARN_FLAGS = -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter
99
1010 all: edid-decode
1111
1212 sha = -DSHA=$(shell if test -d .git ; then git rev-parse --short=12 HEAD ; fi)
13 date = -DDATE=$(shell if test -d .git ; then printf '"'; TZ=UTC git show --quiet --date='format-local:%F %T"' --format="%cd"; fi)
13 date = -DDATE=$(shell if test -d .git ; then TZ=UTC git show --quiet --date='format-local:"%F %T"' --format='%cd'; fi)
1414
1515 edid-decode: $(SOURCES) edid-decode.h Makefile
1616 $(CXX) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(WARN_FLAGS) -g $(sha) $(date) -o $@ $(SOURCES) -lm
0 // SPDX-License-Identifier: MIT
1 /*
2 * Copyright 2006-2012 Red Hat, Inc.
3 * Copyright 2018-2021 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
4 *
5 * Author: Adam Jackson <ajax@nwnk.net>
6 * Maintainer: Hans Verkuil <hverkuil-cisco@xs4all.nl>
7 */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <math.h>
12 #include <time.h>
13
14 #include "edid-decode.h"
15
16 #define CELL_GRAN 8.0
17 #define MARGIN_PERC 1.8
18 #define GTF_MIN_PORCH 1.0
19 #define GTF_V_SYNC_RQD 3.0
20 #define GTF_H_SYNC_PERC 8.0
21 #define GTF_MIN_VSYNC_BP 550.0
22
23 timings edid_state::calc_gtf_mode(unsigned h_pixels, unsigned v_lines,
24 double ip_freq_rqd, bool int_rqd,
25 enum gtf_ip_parm ip_parm, bool margins_rqd,
26 bool secondary, double C, double M, double K, double J)
27 {
28 timings t = {};
29 /* C' and M' are part of the Blanking Duty Cycle computation */
30 double C_PRIME = ((C - J) * K / 256.0) + J;
31 double M_PRIME = K / 256.0 * M;
32
33 double h_pixels_rnd = round(h_pixels / CELL_GRAN) * CELL_GRAN;
34 double v_lines_rnd = int_rqd ? round(v_lines / 2.0) : v_lines;
35 unsigned hor_margin = margins_rqd ?
36 round(h_pixels_rnd * MARGIN_PERC / 100.0 / CELL_GRAN) * CELL_GRAN : 0;
37 unsigned vert_margin = margins_rqd ? round(MARGIN_PERC / 100.0 * v_lines_rnd) : 0;
38 double interlace = int_rqd ? 0.5 : 0;
39 double total_active_pixels = h_pixels_rnd + hor_margin * 2;
40
41 t.hact = h_pixels_rnd;
42 t.vact = v_lines;
43 t.interlaced = int_rqd;
44
45 double pixel_freq;
46 double h_blank_pixels;
47 double total_pixels;
48 double v_sync_bp;
49
50 if (ip_parm == gtf_ip_vert_freq) {
51 // vertical frame frequency (Hz)
52 double v_field_rate_rqd = int_rqd ? ip_freq_rqd * 2 : ip_freq_rqd;
53 double h_period_est = ((1.0 / v_field_rate_rqd) - GTF_MIN_VSYNC_BP / 1000000.0) /
54 (v_lines_rnd + vert_margin * 2 + GTF_MIN_PORCH + interlace) * 1000000.0;
55 v_sync_bp = round(GTF_MIN_VSYNC_BP / h_period_est);
56 double total_v_lines = v_lines_rnd + vert_margin * 2 +
57 v_sync_bp + interlace + GTF_MIN_PORCH;
58 double v_field_rate_est = 1.0 / h_period_est / total_v_lines * 1000000.0;
59 double h_period = h_period_est / (v_field_rate_rqd / v_field_rate_est);
60 double ideal_duty_cycle = C_PRIME - (M_PRIME * h_period / 1000.0);
61 h_blank_pixels = round(total_active_pixels * ideal_duty_cycle /
62 (100.0 - ideal_duty_cycle) /
63 (2 * CELL_GRAN)) * 2 * CELL_GRAN;
64 total_pixels = total_active_pixels + h_blank_pixels;
65 pixel_freq = total_pixels / h_period;
66 } else if (ip_parm == gtf_ip_hor_freq) {
67 // horizontal frequency (kHz)
68 double h_freq = ip_freq_rqd;
69 v_sync_bp = round(GTF_MIN_VSYNC_BP * h_freq / 1000.0);
70 double ideal_duty_cycle = C_PRIME - (M_PRIME / h_freq);
71 h_blank_pixels = round(total_active_pixels * ideal_duty_cycle /
72 (100.0 - ideal_duty_cycle) /
73 (2 * CELL_GRAN)) * 2 * CELL_GRAN;
74 total_pixels = total_active_pixels + h_blank_pixels;
75 pixel_freq = total_pixels * h_freq / 1000.0;
76 } else {
77 // pixel clock rate (MHz)
78 pixel_freq = ip_freq_rqd;
79 double ideal_h_period =
80 ((C_PRIME - 100.0) +
81 sqrt(((100.0 - C_PRIME) * (100.0 - C_PRIME) +
82 (0.4 * M_PRIME * (total_active_pixels + hor_margin * 2) /
83 pixel_freq)))) / 2.0 / M_PRIME * 1000.0;
84 double ideal_duty_cycle = C_PRIME - (M_PRIME * ideal_h_period) / 1000.0;
85 h_blank_pixels = round(total_active_pixels * ideal_duty_cycle /
86 (100.0 - ideal_duty_cycle) /
87 (2 * CELL_GRAN)) * 2 * CELL_GRAN;
88 total_pixels = total_active_pixels + h_blank_pixels;
89 double h_freq = pixel_freq / total_pixels * 1000.0;
90 v_sync_bp = round(GTF_MIN_VSYNC_BP * h_freq / 1000.0);
91 }
92
93 double v_back_porch = v_sync_bp - GTF_V_SYNC_RQD;
94
95 t.vbp = v_back_porch;
96 t.vsync = GTF_V_SYNC_RQD;
97 t.vfp = GTF_MIN_PORCH;
98 t.pixclk_khz = round(1000.0 * pixel_freq);
99 t.hsync = round(GTF_H_SYNC_PERC / 100.0 * total_pixels / CELL_GRAN) * CELL_GRAN;
100 t.hfp = (h_blank_pixels / 2.0) - t.hsync;
101 t.hbp = t.hfp + t.hsync;
102 t.hborder = hor_margin;
103 t.vborder = vert_margin;
104 t.pos_pol_hsync = secondary;
105 t.pos_pol_vsync = !secondary;
106 t.rb = secondary ? RB_GTF : RB_NONE;
107 return t;
108 }
109
110 void edid_state::edid_gtf_mode(unsigned refresh, struct timings &t)
111 {
112 unsigned hratio = t.hratio;
113 unsigned vratio = t.vratio;
114 t = calc_gtf_mode(t.hact, t.vact, refresh, t.interlaced);
115 t.hratio = hratio;
116 t.vratio = vratio;
117 }
118
119 #define CVT_MIN_VSYNC_BP 550.0
120 #define CVT_MIN_V_PORCH 3
121 /* Minimum vertical backporch for CVT and CVT RBv1 */
122 #define CVT_MIN_V_BPORCH 7
123 /* Fixed vertical backporch for CVT RBv2 and RBv3 */
124 #define CVT_FIXED_V_BPORCH 6
125 #define CVT_C_PRIME 30.0
126 #define CVT_M_PRIME 300.0
127 #define CVT_RB_MIN_VBLANK 460.0
128
129 // If rb == RB_CVT_V2, then alt means video-optimized (i.e. 59.94 instead of 60 Hz, etc.).
130 // If rb == RB_CVT_V3, then alt means that rb_h_blank is 160 instead of 80.
131 timings edid_state::calc_cvt_mode(unsigned h_pixels, unsigned v_lines,
132 double ip_freq_rqd, unsigned rb, bool int_rqd,
133 bool margins_rqd, bool alt, unsigned rb_h_blank,
134 double add_vert_time)
135 {
136 timings t = {};
137
138 t.hact = h_pixels;
139 t.vact = v_lines;
140 t.interlaced = int_rqd;
141
142 double cell_gran = rb == RB_CVT_V2 ? 1 : CELL_GRAN;
143 double h_pixels_rnd = floor(h_pixels / cell_gran) * cell_gran;
144 double v_lines_rnd = int_rqd ? floor(v_lines / 2.0) : v_lines;
145 unsigned hor_margin = margins_rqd ?
146 floor((h_pixels_rnd * MARGIN_PERC / 100.0) / cell_gran) * cell_gran : 0;
147 unsigned vert_margin = margins_rqd ? floor(MARGIN_PERC / 100.0 * v_lines_rnd) : 0;
148 double interlace = int_rqd ? 0.5 : 0;
149 double total_active_pixels = h_pixels_rnd + hor_margin * 2;
150 double v_field_rate_rqd = int_rqd ? ip_freq_rqd * 2 : ip_freq_rqd;
151 double clock_step = rb == RB_CVT_V2 ? 0.001 : 0.25;
152 double h_blank = (rb == RB_CVT_V1 || (rb == RB_CVT_V3 && alt)) ? 160 : 80;
153 double rb_v_fporch = rb == RB_CVT_V1 ? 3 : 1;
154 double refresh_multiplier = (rb == RB_CVT_V2 && alt) ? 1000.0 / 1001.0 : 1;
155 double rb_min_vblank = CVT_RB_MIN_VBLANK;
156 double h_sync = 32;
157
158 double v_sync;
159 double pixel_freq;
160 double v_blank;
161 double v_sync_bp;
162
163 if (rb == RB_CVT_V3 && add_vert_time) {
164 if (add_vert_time + rb_min_vblank <= 1000000.0 / ip_freq_rqd / 4.0)
165 rb_min_vblank += add_vert_time;
166 }
167
168 if (rb == RB_CVT_V3 && rb_h_blank) {
169 h_blank = rb_h_blank & ~7;
170 if (h_blank < 80)
171 h_blank = 80;
172 else if (h_blank > 200)
173 h_blank = 200;
174 }
175
176 /* Determine VSync Width from aspect ratio */
177 if ((t.vact * 4 / 3) == t.hact)
178 v_sync = 4;
179 else if ((t.vact * 16 / 9) == t.hact)
180 v_sync = 5;
181 else if ((t.vact * 16 / 10) == t.hact)
182 v_sync = 6;
183 else if (!(t.vact % 4) && ((t.vact * 5 / 4) == t.hact))
184 v_sync = 7;
185 else if ((t.vact * 15 / 9) == t.hact)
186 v_sync = 7;
187 else /* Custom */
188 v_sync = 10;
189
190 if (rb >= RB_CVT_V2)
191 v_sync = 8;
192
193 if (rb == RB_NONE) {
194 double h_period_est = ((1.0 / v_field_rate_rqd) - CVT_MIN_VSYNC_BP / 1000000.0) /
195 (v_lines_rnd + vert_margin * 2 + CVT_MIN_V_PORCH + interlace) * 1000000.0;
196 v_sync_bp = floor(CVT_MIN_VSYNC_BP / h_period_est) + 1;
197 if (v_sync_bp < v_sync + CVT_MIN_V_BPORCH)
198 v_sync_bp = v_sync + CVT_MIN_V_BPORCH;
199 v_blank = v_sync_bp + CVT_MIN_V_PORCH;
200 double ideal_duty_cycle = CVT_C_PRIME - (CVT_M_PRIME * h_period_est / 1000.0);
201 if (ideal_duty_cycle < 20)
202 ideal_duty_cycle = 20;
203 h_blank = floor(total_active_pixels * ideal_duty_cycle /
204 (100.0 - ideal_duty_cycle) /
205 (2 * CELL_GRAN)) * 2 * CELL_GRAN;
206 double total_pixels = total_active_pixels + h_blank;
207 h_sync = floor(total_pixels * 0.08 / CELL_GRAN) * CELL_GRAN;
208 pixel_freq = floor((total_pixels / h_period_est) / clock_step) * clock_step;
209 } else {
210 double h_period_est = ((1000000.0 / v_field_rate_rqd) - rb_min_vblank) /
211 (v_lines_rnd + vert_margin * 2);
212 double vbi_lines = floor(rb_min_vblank / h_period_est) + 1;
213 double rb_min_vbi = rb_v_fporch + v_sync +
214 (rb == RB_CVT_V1 ? CVT_MIN_V_BPORCH : CVT_FIXED_V_BPORCH);
215 v_blank = vbi_lines < rb_min_vbi ? rb_min_vbi : vbi_lines;
216 double total_v_lines = v_blank + v_lines_rnd + vert_margin * 2 + interlace;
217 if (rb == RB_CVT_V1)
218 v_sync_bp = v_blank - rb_v_fporch;
219 else
220 v_sync_bp = v_sync + CVT_FIXED_V_BPORCH;
221 double total_pixels = h_blank + total_active_pixels;
222 double freq = v_field_rate_rqd * total_v_lines * total_pixels * refresh_multiplier;
223 if (rb == RB_CVT_V3)
224 pixel_freq = ceil((freq / 1000000.0) / clock_step) * clock_step;
225 else
226 pixel_freq = floor((freq / 1000000.0) / clock_step) * clock_step;
227 }
228
229 t.vbp = v_sync_bp - v_sync;
230 t.vsync = v_sync;
231 t.vfp = v_blank - t.vbp - t.vsync;
232 t.pixclk_khz = round(1000.0 * pixel_freq);
233 t.hsync = h_sync;
234 if (rb == RB_CVT_V3)
235 t.hfp = 8;
236 else
237 t.hfp = (h_blank / 2.0) - t.hsync;
238 t.hbp = h_blank - t.hfp - t.hsync;
239 t.hborder = hor_margin;
240 t.vborder = vert_margin;
241 t.rb = rb;
242 if (alt && (rb == RB_CVT_V2 || rb == RB_CVT_V3))
243 t.rb |= RB_ALT;
244 t.pos_pol_hsync = t.rb;
245 t.pos_pol_vsync = !t.rb;
246 calc_ratio(&t);
247 return t;
248 }
249
250 void edid_state::edid_cvt_mode(unsigned refresh, struct timings &t, unsigned rb_h_blank,
251 double add_vert_time)
252 {
253 unsigned hratio = t.hratio;
254 unsigned vratio = t.vratio;
255
256 t = calc_cvt_mode(t.hact, t.vact, refresh, t.rb & ~RB_ALT, t.interlaced,
257 false, t.rb & RB_ALT, rb_h_blank, add_vert_time);
258 t.hratio = hratio;
259 t.vratio = vratio;
260 }
0 edid-decode (0.1~git20210811.4fdf6f2-1) UNRELEASED; urgency=low
1
2 * New upstream snapshot.
3
4 -- Debian Janitor <janitor@jelmer.uk> Wed, 18 Aug 2021 01:00:55 -0000
5
06 edid-decode (0.1~git20201230.95d81c9-2) unstable; urgency=medium
17
28 * Bump debhelper from old 11 to 13.
112112 .TP
113113 DisplayID 2.0: VESA DisplayID Standard, Version 2.0
114114 .TP
115 DisplayID 2.0: VESA DisplayID v2.0 Errata E8
116 .TP
115117 DI-EXT: VESA Display Information Extension Block Standard, Release A
116118 .TP
117119 LS-EXT: VESA Enhanced EDID Localized String Extension Standard, Release A
133135 SPWG Notebook Panel Specification, Version 3.5
134136 .TP
135137 EPI Embedded Panel Interface, Revision 1.0
138 .TP
139 Microsoft EDID extension for head-mounted and specialized monitors, Version 3
136140 .RE
137141
138142 .TP
143147 .TP
144148 CVT 1.2: VESA Coordinated Video Timings (CVT) Standard, Version 1.2
145149 .TP
150 CVT 1.2: VESA CVT v1.2 Errata E1
151 .TP
146152 GTF 1.1: VESA Generalized Timing Formula Standard, Version: 1.1
147153 .RE
148154
151157 \fB\-h\fR, \fB\-\-help\fR
152158 Prints the help message.
153159 .TP
154 \fB\-o\fR, \fB\-\-output\-format\fR=\fI<fmt>\fR
160 \fB\-o\fR, \fB\-\-output\-format\fR \fI<fmt>\fR
155161 If [out] is specified, then write the EDID in format \fI<fmt>\fR.
156 .br
162
157163 The output format can be one of:
158164 .br
159165 hex: hex numbers in ascii text (default for stdout)
210216 .TP
211217 \fB\-s\fR, \fB\-\-skip\-hex\-dump\fR
212218 Skip the initial hex dump of the EDID.
219 .TP
220 \fB\-H\fR, \fB\-\-only\-hex\-dump\fR
221 Only show the hex dump of the EDID, then exit.
213222 .TP
214223 \fB\-\-skip\-sha\fR
215224 Don't show the SHA hash. Normally edid-decode will show the SHA, i.e. the
227236 \fB\-\-version\fR
228237 Show the SHA hash and the last commit date.
229238
239 .SH TIMING OPTIONS
240 The following options report the timings for DMT, VIC and HDMI VIC codes and
241 calculate the timings for CVT or GTF timings, based on the given parameters.
242 The EDID will not be shown, although it can be used with the \fB\-\-gtf\fR
243 option in order to read the secondary curve parameters.
244 .TP
245 \fB\-\-std\fR \fI<byte1>\fR,\fI<byte2>\fR
246 Show the standard timing represented by these two bytes.
247 .TP
248 \fB\-\-dmt\fR \fI<dmt>\fR
249 Show the timings for the DMT with the given DMT ID.
250 .TP
251 \fB\-\-vic\fR \fI<vic>\fR
252 Show the timings for this VIC.
253 .TP
254 \fB\-\-hdmi\-vic\fR \fI<hdmivic>\fR
255 Show the timings for this HDMI VIC.
256 .TP
257 \fB\-\-cvt\fR \fBw\fR=\fI<width>\fR,\fBh\fR=\fI<height>\fR,\fBfps\fR=\fI<fps>\fR[,\fBrb\fR=\fI<rb>\fR][,\fBinterlaced\fR][,\fBoverscan\fR]
258 [,\fBalt\fR][,\fBhblank\fR=\fI<hblank>\fR][,\fBadd\-vblank\fR=\fI<add\-vblank>\fR]
259 .br
260 Calculate the CVT timings for the given format.
261
262 \fI<width>\fR is the width in pixels, \fI<height>\fR is the frame (not field!) height in lines.
263 .br
264 \fI<fps>\fR is frames per second for progressive timings and fields per second for interlaced timings.
265 .br
266 \fI<rb>\fR can be 0 (no reduced blanking, default), or 1-3 for the reduced blanking version.
267 .br
268 If \fBinterlaced\fR is given, then this is an interlaced format.
269 .br
270 If \fBoverscan\fR is given, then this is an overscanned format. I.e., margins are required.
271 .br
272 If \fBalt\fR is given and \fI<rb>\fR=2, then report the timings
273 optimized for video: 1000 / 1001 * \fI<fps>\fR.
274 .br
275 If \fBalt\fR is given and \fI<rb>\fR=3, then the horizontal blanking
276 is 160 instead of 80 pixels.
277 .br
278 If \fBhblank\fR is given and \fI<rb>\fR=3, then the horizontal blanking
279 is \fI<hblank>\fR pixels (range of 80-200 and divisible by 8), overriding \fBalt\fR.
280 .br
281 If \fBadd\-vblank\fR is given and \fI<rb>\fR=3, then \fI<add\-vblank>\fR microseconds are
282 added to the minimum vertical blank time of 460 microseconds as long as the total blank
283 time does not exceed 25% of the frame time.
284 .TP
285 \fB\-\-gtf\fR \fBw\fR=\fI<width>\fR,\fBh\fR=\fI<height>\fR[,\fBfps\fR=\fI<fps>\fR][,\fBhorfreq\fR=\fI<horfreq>\fR][,\fBpixclk\fR=\fI<pixclk>\fR]
286 [,\fBinterlaced\fR][,\fBoverscan\fR][,\fBsecondary\fR][,\fBC\fR=\fI<c>\fR][,\fBM\fR=\fI<m>\fR][,\fBK\fR=\fI<k>\fR][,\fBJ\fR=\fI<j>\fR]
287 .br
288 Calculate the GTF timings for the given format.
289
290 \fI<width>\fR is the width in pixels, \fI<height>\fR is the frame (not field!) height in lines.
291 .br
292 \fI<fps>\fR is frames per second for progressive timings and fields per second for interlaced timings.
293 .br
294 \fI<horfreq>\fR is the horizontal frequency in kHz.
295 .br
296 \fI<pixclk>\fR is the pixel clock frequency in MHz.
297 Only one of \fBfps\fR, \fBhorfreq\fR or \fBpixclk\fR must be given.
298 .br
299 If \fBinterlaced\fR is given, then this is an interlaced format.
300 .br
301 If \fBoverscan\fR is given, then this is an overscanned format. I.e., margins are required.
302 .br
303 If \fBsecondary\fR is given, then the secondary GTF is used for
304 reduced blanking, where \fI<c>\fR, \fI<m>\fR, \fI<k>\fR and \fI<j>\fR are parameters
305 for the secondary curve. If none of the secondary curve parameters
306 were set, and an EDID file is passed as command line option, then the
307 secondary curve parameters are read from that EDID.
308 .br
309 The default secondary curve parameters are 40 for \fI<c>\fR, 600 for \fI<m>\fR,
310 128 for \fI<k>\fR and 20 for \fI<j>\fR.
311 These values correspond to the normal curve that GTF uses.
312 .TP
313 \fB\-\-list\-established\-timings\fR
314 List all known Established Timings.
315 .TP
316 \fB\-\-list\-dmts\fR
317 List all known DMTs.
318 .TP
319 \fB\-\-list\-vics\fR
320 List all known VICs.
321 .TP
322 \fB\-\-list\-hdmi\-vics\fR
323 List all known HDMI VICs.
324
230325 .PP
231326 .SH NOTES
232 Not all fields are decoded, or decoded completely. Some fields' decoding
233 may appear to corrupt the output (for example, detailed string sections
234 have their contents printed literally).
327 Not all fields are decoded, or decoded completely.
235328 .B edid-decode
236329 does attempt to validate its input against the relevant standards, but its
237330 opinions have not been double-checked with the relevant standards bodies,
4141 enum Option {
4242 OptCheck = 'c',
4343 OptCheckInline = 'C',
44 OptFBModeTimings = 'F',
4445 OptHelp = 'h',
46 OptOnlyHexDump = 'H',
47 OptLongTimings = 'L',
4548 OptNativeTimings = 'n',
4649 OptOutputFormat = 'o',
4750 OptPreferredTimings = 'p',
4851 OptPhysicalAddress = 'P',
49 OptLongTimings = 'L',
52 OptSkipHexDump = 's',
5053 OptShortTimings = 'S',
51 OptFBModeTimings = 'F',
54 OptV4L2Timings = 'V',
5255 OptXModeLineTimings = 'X',
53 OptV4L2Timings = 'V',
54 OptSkipHexDump = 's',
5556 OptSkipSHA = 128,
5657 OptHideSerialNumbers,
5758 OptVersion,
59 OptSTD,
60 OptDMT,
61 OptVIC,
62 OptHDMIVIC,
63 OptCVT,
64 OptGTF,
65 OptListEstTimings,
66 OptListDMTs,
67 OptListVICs,
68 OptListHDMIVICs,
5869 OptLast = 256
5970 };
6071
6778 { "preferred-timings", no_argument, 0, OptPreferredTimings },
6879 { "physical-address", no_argument, 0, OptPhysicalAddress },
6980 { "skip-hex-dump", no_argument, 0, OptSkipHexDump },
81 { "only-hex-dump", no_argument, 0, OptOnlyHexDump },
7082 { "skip-sha", no_argument, 0, OptSkipSHA },
7183 { "hide-serial-numbers", no_argument, 0, OptHideSerialNumbers },
7284 { "version", no_argument, 0, OptVersion },
7789 { "xmodeline", no_argument, 0, OptXModeLineTimings },
7890 { "fbmode", no_argument, 0, OptFBModeTimings },
7991 { "v4l2-timings", no_argument, 0, OptV4L2Timings },
92 { "std", required_argument, 0, OptSTD },
93 { "dmt", required_argument, 0, OptDMT },
94 { "vic", required_argument, 0, OptVIC },
95 { "hdmi-vic", required_argument, 0, OptHDMIVIC },
96 { "cvt", required_argument, 0, OptCVT },
97 { "gtf", required_argument, 0, OptGTF },
98 { "list-established-timings", no_argument, 0, OptListEstTimings },
99 { "list-dmts", no_argument, 0, OptListDMTs },
100 { "list-vics", no_argument, 0, OptListVICs },
101 { "list-hdmi-vics", no_argument, 0, OptListHDMIVICs },
80102 { 0, 0, 0, 0 }
81103 };
82104
89111 " if the output filename is '-'.\n"
90112 "\nOptions:\n"
91113 " -o, --output-format <fmt>\n"
92 " if [out] is specified, then write the EDID in this format\n"
114 " If [out] is specified, then write the EDID in this format\n"
93115 " <fmt> is one of:\n"
94116 " hex: hex numbers in ascii text (default for stdout)\n"
95117 " raw: binary data (default unless writing to stdout)\n"
96118 " carray: c-program struct\n"
97119 " xml: XML data\n"
98 " -c, --check check if the EDID conforms to the standards, failures and\n"
120 " -c, --check Check if the EDID conforms to the standards, failures and\n"
99121 " warnings are reported at the end.\n"
100 " -C, --check-inline check if the EDID conforms to the standards, failures and\n"
122 " -C, --check-inline Check if the EDID conforms to the standards, failures and\n"
101123 " warnings are reported inline.\n"
102 " -n, --native-timings report the native timings\n"
103 " -p, --preferred-timings report the preferred timings\n"
104 " -P, --physical-address only report the CEC physical address\n"
105 " -S, --short-timings report all video timings in a short format\n"
106 " -L, --long-timings report all video timings in a long format\n"
107 " -X, --xmodeline report all long video timings in Xorg.conf format\n"
108 " -F, --fbmode report all long video timings in fb.modes format\n"
109 " -V, --v4l2-timings report all long video timings in v4l2-dv-timings.h format\n"
110 " -s, --skip-hex-dump skip the initial hex dump of the EDID\n"
111 " --skip-sha skip the SHA report\n"
112 " --hide-serial-numbers replace serial numbers with '...'\n"
124 " -n, --native-timings Report the native timings.\n"
125 " -p, --preferred-timings Report the preferred timings.\n"
126 " -P, --physical-address Only report the CEC physical address.\n"
127 " -S, --short-timings Report all video timings in a short format.\n"
128 " -L, --long-timings Report all video timings in a long format.\n"
129 " -X, --xmodeline Report all long video timings in Xorg.conf format.\n"
130 " -F, --fbmode Report all long video timings in fb.modes format.\n"
131 " -V, --v4l2-timings Report all long video timings in v4l2-dv-timings.h format.\n"
132 " -s, --skip-hex-dump Skip the initial hex dump of the EDID.\n"
133 " -H, --only-hex-dump Only output the hex dump of the EDID.\n"
134 " --skip-sha Skip the SHA report.\n"
135 " --hide-serial-numbers Replace serial numbers with '...'\n"
113136 " --version show the edid-decode version (SHA)\n"
114 " -h, --help display this help message\n");
137 " --std <byte1>,<byte2> Show the standard timing represented by these two bytes.\n"
138 " --dmt <dmt> Show the timings for the DMT with the given DMT ID.\n"
139 " --vic <vic> Show the timings for this VIC.\n"
140 " --hdmi-vic <hdmivic> Show the timings for this HDMI VIC.\n"
141 " --cvt w=<width>,h=<height>,fps=<fps>[,rb=<rb>][,interlaced][,overscan][,alt][,hblank=<hblank][,add-vblank=<add-vblank>\n"
142 " Calculate the CVT timings for the given format.\n"
143 " <fps> is frames per second for progressive timings,\n"
144 " or fields per second for interlaced timings.\n"
145 " <rb> can be 0 (no reduced blanking, default), or\n"
146 " 1-3 for the reduced blanking version.\n"
147 " If 'interlaced' is given, then this is an interlaced format.\n"
148 " If 'overscan' is given, then this is an overscanned format.\n"
149 " If 'alt' is given and <rb>=2, then report the timings\n"
150 " optimized for video: 1000 / 1001 * <fps>.\n"
151 " If 'alt' is given and <rb>=3, then the horizontal blanking\n"
152 " is 160 instead of 80 pixels.\n"
153 " If 'hblank' is given and <rb>=3, then the horizontal blanking\n"
154 " is <hblank> pixels (range of 80-200), overriding 'alt'.\n"
155 " If 'add-vblank' is given and <rb>=3, then <add-vblank> usecs are\n"
156 " added to the minimum vertical blank time of 460 usecs.\n"
157 " --gtf w=<width>,h=<height>[,fps=<fps>][,horfreq=<horfreq>][,pixclk=<pixclk>][,interlaced]\n"
158 " [,overscan][,secondary][,C=<c>][,M=<m>][,K=<k>][,J=<j>]\n"
159 " Calculate the GTF timings for the given format.\n"
160 " <fps> is frames per second for progressive timings,\n"
161 " or fields per second for interlaced timings.\n"
162 " <horfreq> is the horizontal frequency in kHz.\n"
163 " <pixclk> is the pixel clock frequency in MHz.\n"
164 " Only one of fps, horfreq or pixclk must be given.\n"
165 " If 'interlaced' is given, then this is an interlaced format.\n"
166 " If 'overscan' is given, then this is an overscanned format.\n"
167 " If 'secondary' is given, then the secondary GTF is used for\n"
168 " reduced blanking, where <c>, <m>, <k> and <j> are parameters\n"
169 " for the secondary curve.\n"
170 " --list-established-timings List all known Established Timings.\n"
171 " --list-dmts List all known DMTs.\n"
172 " --list-vics List all known VICs.\n"
173 " --list-hdmi-vics List all known HDMI VICs.\n"
174 " -h, --help Display this help message.\n");
115175 }
116176
117177 static std::string s_msgs[EDID_MAX_BLOCKS + 1][2];
200260
201261 std::string edid_state::dtd_type(unsigned cnt)
202262 {
203 unsigned len = std::to_string(cta.preparse_total_dtds).length();
263 unsigned len = std::to_string(cta.preparsed_total_dtds).length();
204264 char buf[16];
205265 sprintf(buf, "DTD %*u", len, cnt);
206266 return buf;
238298 num_flags++;
239299 }
240300
301 /*
302 * Return true if the timings are a close, but not identical,
303 * match. The only differences allowed are polarities and
304 * porches and syncs, provided the total blanking remains the
305 * same.
306 */
307 bool timings_close_match(const timings &t1, const timings &t2)
308 {
309 // We don't want to deal with borders, you're on your own
310 // if you are using those.
311 if (t1.hborder || t1.vborder ||
312 t2.hborder || t2.vborder)
313 return false;
314 if (t1.hact != t2.hact || t1.vact != t2.vact ||
315 t1.interlaced != t2.interlaced ||
316 t1.pixclk_khz != t2.pixclk_khz ||
317 t1.hfp + t1.hsync + t1.hbp != t2.hfp + t2.hsync + t2.hbp ||
318 t1.vfp + t1.vsync + t1.vbp != t2.vfp + t2.vsync + t2.vbp)
319 return false;
320 if (t1.hfp == t2.hfp &&
321 t1.hsync == t2.hsync &&
322 t1.hbp == t2.hbp &&
323 t1.pos_pol_hsync == t2.pos_pol_hsync &&
324 t1.vfp == t2.vfp &&
325 t1.vsync == t2.vsync &&
326 t1.vbp == t2.vbp &&
327 t1.pos_pol_vsync == t2.pos_pol_vsync)
328 return false;
329 return true;
330 }
331
241332 static void print_modeline(unsigned indent, const struct timings *t, double refresh)
242333 {
243334 unsigned offset = (!t->even_vtotal && t->interlaced) ? 1 : 0;
335 unsigned hfp = t->hborder + t->hfp;
336 unsigned hbp = t->hborder + t->hbp;
337 unsigned vfp = t->vborder + t->vfp;
338 unsigned vbp = t->vborder + t->vbp;
244339
245340 printf("%*sModeline \"%ux%u_%.2f%s\" %.3f %u %u %u %u %u %u %u %u %cHSync",
246341 indent, "",
247342 t->hact, t->vact, refresh,
248343 t->interlaced ? "i" : "", t->pixclk_khz / 1000.0,
249 t->hact, t->hact + t->hfp, t->hact + t->hfp + t->hsync,
250 t->hact + t->hfp + t->hsync + t->hbp,
251 t->vact, t->vact + t->vfp, t->vact + t->vfp + t->vsync,
252 t->vact + t->vfp + t->vsync + t->vbp + offset,
344 t->hact, t->hact + hfp, t->hact + hfp + t->hsync,
345 t->hact + hfp + t->hsync + hbp,
346 t->vact, t->vact + vfp, t->vact + vfp + t->vsync,
347 t->vact + vfp + t->vsync + vbp + offset,
253348 t->pos_pol_hsync ? '+' : '-');
254349 if (!t->no_pol_vsync)
255350 printf(" %cVSync", t->pos_pol_vsync ? '+' : '-');
274369 t->hact, t->vact, t->hact, t->vact);
275370 unsigned mult = t->interlaced ? 2 : 1;
276371 unsigned offset = !t->even_vtotal && t->interlaced;
372 unsigned hfp = t->hborder + t->hfp;
373 unsigned hbp = t->hborder + t->hbp;
374 unsigned vfp = t->vborder + t->vfp;
375 unsigned vbp = t->vborder + t->vbp;
277376 printf("%*stimings %llu %d %d %d %u %u %u\n",
278377 indent + 8, "",
279378 (unsigned long long)(1000000000.0 / (double)(t->pixclk_khz) + 0.5),
280 t->hbp, t->hfp, mult * t->vbp, mult * t->vfp + offset, t->hsync, mult * t->vsync);
379 hbp, hfp, mult * vbp, mult * vfp + offset, t->hsync, mult * t->vsync);
281380 if (t->interlaced)
282381 printf("%*slaced true\n", indent + 8, "");
283382 if (t->pos_pol_hsync)
304403 printf("V4L2_DV_HSYNC_POS_POL, \\\n");
305404 else
306405 printf("V4L2_DV_VSYNC_POS_POL, \\\n");
406 unsigned hfp = t->hborder + t->hfp;
407 unsigned hbp = t->hborder + t->hbp;
408 unsigned vfp = t->vborder + t->vfp;
409 unsigned vbp = t->vborder + t->vbp;
307410 printf("\t\t\t%lluULL, %d, %u, %d, %u, %u, %d, %u, %u, %d, \\\n",
308 t->pixclk_khz * 1000ULL, t->hfp, t->hsync, t->hbp,
309 t->vfp, t->vsync, t->vbp,
310 t->interlaced ? t->vfp : 0,
411 t->pixclk_khz * 1000ULL, hfp, t->hsync, hbp,
412 vfp, t->vsync, vbp,
413 t->interlaced ? vfp : 0,
311414 t->interlaced ? t->vsync : 0,
312 t->interlaced ? t->vbp + !t->even_vtotal : 0);
415 t->interlaced ? vbp + !t->even_vtotal : 0);
313416
314417 std::string flags;
315418 unsigned num_flags = 0;
386489
387490 bool edid_state::print_timings(const char *prefix, const struct timings *t,
388491 const char *type, const char *flags,
389 bool detailed)
492 bool detailed, bool do_checks)
390493 {
391494 if (!t) {
392495 // Should not happen
393 fail("Unknown video timings.\n");
496 if (do_checks)
497 fail("Unknown video timings.\n");
394498 return false;
395499 }
396500
400504 detailed = true;
401505
402506 unsigned vact = t->vact;
403 unsigned hbl = t->hfp + t->hsync + t->hbp;
404 unsigned vbl = t->vfp + t->vsync + t->vbp;
507 unsigned hbl = t->hfp + t->hsync + t->hbp + 2 * t->hborder;
508 unsigned vbl = t->vfp + t->vsync + t->vbp + 2 * t->vborder;
405509 unsigned htotal = t->hact + hbl;
406510 double hor_freq_khz = htotal ? (double)t->pixclk_khz / htotal : 0;
407511
417521
418522 if (!t->hact || !hbl || !t->hfp || !t->hsync ||
419523 !vact || !vbl || (!t->vfp && !t->interlaced && !t->even_vtotal) || !t->vsync) {
420 fail("0 values in the video timing:\n"
421 " Horizontal Active/Blanking %u/%u\n"
422 " Horizontal Frontporch/Sync Width %u/%u\n"
423 " Vertical Active/Blanking %u/%u\n"
424 " Vertical Frontporch/Sync Width %u/%u\n",
425 t->hact, hbl, t->hfp, t->hsync, vact, vbl, t->vfp, t->vsync);
524 if (do_checks)
525 fail("0 values in the video timing:\n"
526 " Horizontal Active/Blanking %u/%u\n"
527 " Horizontal Frontporch/Sync Width %u/%u\n"
528 " Vertical Active/Blanking %u/%u\n"
529 " Vertical Frontporch/Sync Width %u/%u\n",
530 t->hact, hbl, t->hfp, t->hsync, vact, vbl, t->vfp, t->vsync);
426531 ok = false;
427532 }
428533
434539 double refresh = (double)t->pixclk_khz * 1000.0 / (htotal * vtotal);
435540
436541 std::string s;
437 if (t->rb) {
542 unsigned rb = t->rb & ~RB_ALT;
543 if (rb) {
544 bool alt = t->rb & RB_ALT;
438545 s = "RB";
439 if (t->rb == 2)
440 s += "v2";
441 else if (t->rb == 3)
442 s += "v3";
546 if (rb == RB_CVT_V2)
547 s += std::string("v2") + (alt ? ",video-optimized" : "");
548 else if (rb == RB_CVT_V3)
549 s += std::string("v3") + (alt ? ",h-blank-160" : "");
443550 }
444551 add_str(s, flags);
445552 if (t->hsize_mm || t->vsize_mm)
446553 add_str(s, std::to_string(t->hsize_mm) + " mm x " + std::to_string(t->vsize_mm) + " mm");
554 if (t->hsize_mm > dtd_max_hsize_mm)
555 dtd_max_hsize_mm = t->hsize_mm;
556 if (t->vsize_mm > dtd_max_vsize_mm)
557 dtd_max_vsize_mm = t->vsize_mm;
447558 if (!s.empty())
448559 s = " (" + s + ")";
449560 unsigned pixclk_khz = t->pixclk_khz / (t->ycbcr420 ? 2 : 1);
451562 char buf[10];
452563
453564 sprintf(buf, "%u%s", t->vact, t->interlaced ? "i" : "");
454 printf("%s%s: %5ux%-5s %7.3f Hz %3u:%-3u %7.3f kHz %7.3f MHz%s\n",
565 printf("%s%s: %5ux%-5s %7.3f Hz %3u:%-3u %7.3f kHz %8.3f MHz%s\n",
455566 prefix, type,
456567 t->hact, buf,
457568 refresh,
471582 else if (detailed)
472583 print_detailed_timing(len + strlen(type) + 6, t);
473584
585 if (!do_checks)
586 return ok;
587
588 if (!memcmp(type, "DTD", 3)) {
589 unsigned vic, dmt;
590 const timings *vic_t = cta_close_match_to_vic(*t, vic);
591
592 if (vic_t)
593 warn("DTD is similar but not identical to VIC %u.\n", vic);
594
595 const timings *dmt_t = close_match_to_dmt(*t, dmt);
596 if (!vic_t && dmt_t)
597 warn("DTD is similar but not identical to DMT 0x%02x.\n", dmt);
598 }
599
600 if (refresh) {
601 min_vert_freq_hz = min(min_vert_freq_hz, refresh);
602 max_vert_freq_hz = max(max_vert_freq_hz, refresh);
603 }
604 if (hor_freq_khz) {
605 min_hor_freq_hz = min(min_hor_freq_hz, hor_freq_khz * 1000.0);
606 max_hor_freq_hz = max(max_hor_freq_hz, hor_freq_khz * 1000.0);
607 max_pixclk_khz = max(max_pixclk_khz, pixclk_khz);
608 if (t->pos_pol_hsync && !t->pos_pol_vsync && t->vsync == 3)
609 base.max_pos_neg_hor_freq_khz = hor_freq_khz;
610 }
611
474612 if (t->ycbcr420 && t->pixclk_khz < 590000)
475613 warn_once("Some YCbCr 4:2:0 timings are invalid for HDMI (which requires an RGB timings pixel rate >= 590 MHz).\n");
476614 if (t->hfp <= 0)
479617 fail("0 or negative horizontal back porch.\n");
480618 if (t->vbp <= 0)
481619 fail("0 or negative vertical back porch.\n");
482 if ((!base.max_display_width_mm && t->hsize_mm) ||
483 (!base.max_display_height_mm && t->vsize_mm)) {
484 fail("Mismatch of image size vs display size: image size is set, but not display size.\n");
620 if (!base.max_display_width_mm && !base.max_display_height_mm) {
621 /* this is valid */
485622 } else if (!t->hsize_mm && !t->vsize_mm) {
486623 /* this is valid */
487624 } else if (t->hsize_mm > base.max_display_width_mm + 9 ||
493630 fail("Mismatch of image size %ux%u mm vs display size %ux%u mm.\n",
494631 t->hsize_mm, t->vsize_mm, base.max_display_width_mm, base.max_display_height_mm);
495632 }
496 if (refresh) {
497 min_vert_freq_hz = min(min_vert_freq_hz, refresh);
498 max_vert_freq_hz = max(max_vert_freq_hz, refresh);
499 }
500 if (pixclk_khz && (t->hact + hbl)) {
501 min_hor_freq_hz = min(min_hor_freq_hz, (pixclk_khz * 1000) / (t->hact + hbl));
502 max_hor_freq_hz = max(max_hor_freq_hz, (pixclk_khz * 1000) / (t->hact + hbl));
503 max_pixclk_khz = max(max_pixclk_khz, pixclk_khz);
504 }
505633 return ok;
634 }
635
636 std::string containerid2s(const unsigned char *x)
637 {
638 char buf[40];
639
640 sprintf(buf, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
641 x[0], x[1], x[2], x[3],
642 x[4], x[5],
643 x[6], x[7],
644 x[8], x[9],
645 x[10], x[11], x[12], x[13], x[14], x[15]);
646 return buf;
506647 }
507648
508649 std::string utohex(unsigned char x)
733874 edid_data.insert(edid_data.end(), buf, buf + i);
734875 }
735876
736 if (edid_data.empty())
877 if (edid_data.empty()) {
878 state.edid_size = 0;
737879 return false;
880 }
738881
739882 const char *data = &edid_data[0];
740883 const char *start;
9261069
9271070 odd_hex_digits = false;
9281071 if (!extract_edid(fd, error)) {
1072 if (!state.edid_size) {
1073 fprintf(error, "EDID of '%s' was empty.\n", from_file);
1074 return -1;
1075 }
9291076 fprintf(error, "EDID extract of '%s' failed: ", from_file);
9301077 if (odd_hex_digits)
9311078 fprintf(error, "odd number of hexadecimal digits.\n");
10921239 printf("edid-decode (hex):\n\n");
10931240 for (unsigned i = 0; i < num_blocks; i++) {
10941241 hex_block("", edid + i * EDID_PAGE_SIZE, EDID_PAGE_SIZE, false);
1242 if (i == num_blocks - 1 && options[OptOnlyHexDump])
1243 return 0;
10951244 printf("\n");
10961245 }
10971246 printf("----------------\n\n");
11161265 if (options[OptPreferredTimings] && base.preferred_timing.is_valid()) {
11171266 printf("\n----------------\n");
11181267 printf("\nPreferred Video Timing if only Block 0 is parsed:\n");
1119 print_timings(" ", base.preferred_timing, true);
1268 print_timings(" ", base.preferred_timing, true, false);
11201269 }
11211270
11221271 if (options[OptNativeTimings] &&
11231272 base.preferred_timing.is_valid() && base.preferred_is_also_native) {
11241273 printf("\n----------------\n");
11251274 printf("\nNative Video Timing if only Block 0 is parsed:\n");
1126 print_timings(" ", base.preferred_timing, true);
1275 print_timings(" ", base.preferred_timing, true, false);
11271276 }
11281277
11291278 if (options[OptPreferredTimings] && !cta.preferred_timings.empty()) {
11321281 cta.preferred_timings.size() > 1 ? "s" : "");
11331282 for (vec_timings_ext::iterator iter = cta.preferred_timings.begin();
11341283 iter != cta.preferred_timings.end(); ++iter)
1135 print_timings(" ", *iter, true);
1284 print_timings(" ", *iter, true, false);
11361285 }
11371286
11381287 if (options[OptNativeTimings] && !cta.native_timings.empty()) {
11411290 cta.native_timings.size() > 1 ? "s" : "");
11421291 for (vec_timings_ext::iterator iter = cta.native_timings.begin();
11431292 iter != cta.native_timings.end(); ++iter)
1144 print_timings(" ", *iter, true);
1293 print_timings(" ", *iter, true, false);
11451294 }
11461295
11471296 if (options[OptPreferredTimings] && !dispid.preferred_timings.empty()) {
11501299 dispid.preferred_timings.size() > 1 ? "s" : "");
11511300 for (vec_timings_ext::iterator iter = dispid.preferred_timings.begin();
11521301 iter != dispid.preferred_timings.end(); ++iter)
1153 print_timings(" ", *iter, true);
1302 print_timings(" ", *iter, true, false);
11541303 }
11551304
11561305 if (!options[OptCheck] && !options[OptCheckInline])
11781327 return failures ? -2 : 0;
11791328 }
11801329
1330 enum cvt_opts {
1331 CVT_WIDTH = 0,
1332 CVT_HEIGHT,
1333 CVT_FPS,
1334 CVT_INTERLACED,
1335 CVT_OVERSCAN,
1336 CVT_RB,
1337 CVT_ALT,
1338 CVT_RB_H_BLANK,
1339 CVT_RB_ADD_V_BLANK,
1340 };
1341
1342 static int parse_cvt_subopt(char **subopt_str, double *value)
1343 {
1344 int opt;
1345 char *opt_str;
1346
1347 static const char * const subopt_list[] = {
1348 "w",
1349 "h",
1350 "fps",
1351 "interlaced",
1352 "overscan",
1353 "rb",
1354 "alt",
1355 "hblank",
1356 "add-vblank",
1357 nullptr
1358 };
1359
1360 opt = getsubopt(subopt_str, (char* const*) subopt_list, &opt_str);
1361
1362 if (opt == -1) {
1363 fprintf(stderr, "Invalid suboptions specified.\n");
1364 usage();
1365 std::exit(EXIT_FAILURE);
1366 }
1367 if (opt_str == nullptr && opt != CVT_INTERLACED && opt != CVT_ALT &&
1368 opt != CVT_OVERSCAN) {
1369 fprintf(stderr, "No value given to suboption <%s>.\n",
1370 subopt_list[opt]);
1371 usage();
1372 std::exit(EXIT_FAILURE);
1373 }
1374
1375 if (opt_str)
1376 *value = strtod(opt_str, nullptr);
1377 return opt;
1378 }
1379
1380 static void parse_cvt(char *optarg)
1381 {
1382 unsigned w = 0, h = 0;
1383 double fps = 0;
1384 unsigned rb = RB_NONE;
1385 unsigned rb_h_blank = 0;
1386 unsigned rb_add_v_blank = 0;
1387 bool interlaced = false;
1388 bool alt = false;
1389 bool overscan = false;
1390
1391 while (*optarg != '\0') {
1392 int opt;
1393 double opt_val;
1394
1395 opt = parse_cvt_subopt(&optarg, &opt_val);
1396
1397 switch (opt) {
1398 case CVT_WIDTH:
1399 w = round(opt_val);
1400 break;
1401 case CVT_HEIGHT:
1402 h = round(opt_val);
1403 break;
1404 case CVT_FPS:
1405 fps = opt_val;
1406 break;
1407 case CVT_RB:
1408 rb = opt_val;
1409 break;
1410 case CVT_OVERSCAN:
1411 overscan = true;
1412 break;
1413 case CVT_INTERLACED:
1414 interlaced = opt_val;
1415 break;
1416 case CVT_ALT:
1417 alt = opt_val;
1418 break;
1419 case CVT_RB_H_BLANK:
1420 rb_h_blank = opt_val;
1421 break;
1422 case CVT_RB_ADD_V_BLANK:
1423 rb_add_v_blank = opt_val;
1424 break;
1425 default:
1426 break;
1427 }
1428 }
1429
1430 if (!w || !h || !fps) {
1431 fprintf(stderr, "Missing width, height and/or fps.\n");
1432 usage();
1433 std::exit(EXIT_FAILURE);
1434 }
1435 if (interlaced)
1436 fps /= 2;
1437 timings t = state.calc_cvt_mode(w, h, fps, rb, interlaced, overscan, alt,
1438 rb_h_blank, rb_add_v_blank);
1439 state.print_timings("", &t, "CVT", "", true, false);
1440 }
1441
1442 struct gtf_parsed_data {
1443 unsigned w, h;
1444 double freq;
1445 double C, M, K, J;
1446 bool overscan;
1447 bool interlaced;
1448 bool secondary;
1449 bool params_from_edid;
1450 enum gtf_ip_parm ip_parm;
1451 };
1452
1453 enum gtf_opts {
1454 GTF_WIDTH = 0,
1455 GTF_HEIGHT,
1456 GTF_FPS,
1457 GTF_HORFREQ,
1458 GTF_PIXCLK,
1459 GTF_INTERLACED,
1460 GTF_OVERSCAN,
1461 GTF_SECONDARY,
1462 GTF_C2,
1463 GTF_M,
1464 GTF_K,
1465 GTF_J2,
1466 };
1467
1468 static int parse_gtf_subopt(char **subopt_str, double *value)
1469 {
1470 int opt;
1471 char *opt_str;
1472
1473 static const char * const subopt_list[] = {
1474 "w",
1475 "h",
1476 "fps",
1477 "horfreq",
1478 "pixclk",
1479 "interlaced",
1480 "overscan",
1481 "secondary",
1482 "C",
1483 "M",
1484 "K",
1485 "J",
1486 nullptr
1487 };
1488
1489 opt = getsubopt(subopt_str, (char * const *)subopt_list, &opt_str);
1490
1491 if (opt == -1) {
1492 fprintf(stderr, "Invalid suboptions specified.\n");
1493 usage();
1494 std::exit(EXIT_FAILURE);
1495 }
1496 if (opt_str == nullptr && opt != GTF_INTERLACED && opt != GTF_OVERSCAN &&
1497 opt != GTF_SECONDARY) {
1498 fprintf(stderr, "No value given to suboption <%s>.\n",
1499 subopt_list[opt]);
1500 usage();
1501 std::exit(EXIT_FAILURE);
1502 }
1503
1504 if (opt == GTF_C2 || opt == GTF_J2)
1505 *value = round(2.0 * strtod(opt_str, nullptr));
1506 else if (opt_str)
1507 *value = strtod(opt_str, nullptr);
1508 return opt;
1509 }
1510
1511 static void parse_gtf(char *optarg, gtf_parsed_data &data)
1512 {
1513 memset(&data, 0, sizeof(data));
1514 data.params_from_edid = true;
1515 data.C = 40;
1516 data.M = 600;
1517 data.K = 128;
1518 data.J = 20;
1519
1520 while (*optarg != '\0') {
1521 int opt;
1522 double opt_val;
1523
1524 opt = parse_gtf_subopt(&optarg, &opt_val);
1525
1526 switch (opt) {
1527 case GTF_WIDTH:
1528 data.w = round(opt_val);
1529 break;
1530 case GTF_HEIGHT:
1531 data.h = round(opt_val);
1532 break;
1533 case GTF_FPS:
1534 data.freq = opt_val;
1535 data.ip_parm = gtf_ip_vert_freq;
1536 break;
1537 case GTF_HORFREQ:
1538 data.freq = opt_val;
1539 data.ip_parm = gtf_ip_hor_freq;
1540 break;
1541 case GTF_PIXCLK:
1542 data.freq = opt_val;
1543 data.ip_parm = gtf_ip_clk_freq;
1544 break;
1545 case GTF_INTERLACED:
1546 data.interlaced = true;
1547 break;
1548 case GTF_OVERSCAN:
1549 data.overscan = true;
1550 break;
1551 case GTF_SECONDARY:
1552 data.secondary = true;
1553 break;
1554 case GTF_C2:
1555 data.C = opt_val / 2.0;
1556 data.params_from_edid = false;
1557 break;
1558 case GTF_M:
1559 data.M = round(opt_val);
1560 data.params_from_edid = false;
1561 break;
1562 case GTF_K:
1563 data.K = round(opt_val);
1564 data.params_from_edid = false;
1565 break;
1566 case GTF_J2:
1567 data.J = opt_val / 2.0;
1568 data.params_from_edid = false;
1569 break;
1570 default:
1571 break;
1572 }
1573 }
1574
1575 if (!data.w || !data.h) {
1576 fprintf(stderr, "Missing width and/or height.\n");
1577 usage();
1578 std::exit(EXIT_FAILURE);
1579 }
1580 if (!data.freq) {
1581 fprintf(stderr, "One of fps, horfreq or pixclk must be given.\n");
1582 usage();
1583 std::exit(EXIT_FAILURE);
1584 }
1585 if (!data.secondary)
1586 data.params_from_edid = false;
1587 if (data.interlaced && data.ip_parm == gtf_ip_vert_freq)
1588 data.freq /= 2;
1589 }
1590
1591 static void show_gtf(gtf_parsed_data &data)
1592 {
1593 timings t;
1594
1595 t = state.calc_gtf_mode(data.w, data.h, data.freq, data.interlaced,
1596 data.ip_parm, data.overscan, data.secondary,
1597 data.C, data.M, data.K, data.J);
1598 calc_ratio(&t);
1599 state.print_timings("", &t, "GTF", "", true, false);
1600 }
1601
11811602 int main(int argc, char **argv)
11821603 {
11831604 char short_options[26 * 2 * 2 + 1];
11841605 enum output_format out_fmt = OUT_FMT_DEFAULT;
1606 gtf_parsed_data gtf_data;
11851607 int ret;
11861608
11871609 while (1) {
11881610 int option_index = 0;
11891611 unsigned idx = 0;
1190 unsigned i;
1612 unsigned i, val;
1613 const timings *t;
1614 char buf[16];
11911615
11921616 for (i = 0; long_options[i].name; i++) {
11931617 if (!isalpha(long_options[i].val))
12211645 exit(1);
12221646 }
12231647 break;
1648 case OptSTD: {
1649 unsigned char byte1, byte2 = 0;
1650 char *endptr;
1651
1652 byte1 = strtoul(optarg, &endptr, 0);
1653 if (*endptr == ',')
1654 byte2 = strtoul(endptr + 1, NULL, 0);
1655 state.print_standard_timing("", byte1, byte2, false, true);
1656 break;
1657 }
1658 case OptDMT:
1659 val = strtoul(optarg, NULL, 0);
1660 t = find_dmt_id(val);
1661 if (t) {
1662 sprintf(buf, "DMT 0x%02x", val);
1663 state.print_timings("", t, buf, "", true, false);
1664 } else {
1665 fprintf(stderr, "Unknown DMT code 0x%02x.\n", val);
1666 }
1667 break;
1668 case OptVIC:
1669 val = strtoul(optarg, NULL, 0);
1670 t = find_vic_id(val);
1671 if (t) {
1672 sprintf(buf, "VIC %3u", val);
1673 state.print_timings("", t, buf, "", true, false);
1674 } else {
1675 fprintf(stderr, "Unknown VIC code %u.\n", val);
1676 }
1677 break;
1678 case OptHDMIVIC:
1679 val = strtoul(optarg, NULL, 0);
1680 t = find_hdmi_vic_id(val);
1681 if (t) {
1682 sprintf(buf, "HDMI VIC %u", val);
1683 state.print_timings("", t, buf, "", true, false);
1684 } else {
1685 fprintf(stderr, "Unknown HDMI VIC code %u.\n", val);
1686 }
1687 break;
1688 case OptCVT:
1689 parse_cvt(optarg);
1690 break;
1691 case OptGTF:
1692 parse_gtf(optarg, gtf_data);
1693 break;
12241694 case ':':
12251695 fprintf(stderr, "Option '%s' requires a value.\n",
12261696 argv[optind]);
12411711 return 0;
12421712 }
12431713
1714 if (options[OptListEstTimings])
1715 state.list_established_timings();
1716 if (options[OptListDMTs])
1717 state.list_dmts();
1718 if (options[OptListVICs])
1719 state.cta_list_vics();
1720 if (options[OptListHDMIVICs])
1721 state.cta_list_hdmi_vics();
1722
1723 if (options[OptListEstTimings] || options[OptListDMTs] ||
1724 options[OptListVICs] || options[OptListHDMIVICs])
1725 return 0;
1726
1727 if (options[OptCVT] || options[OptDMT] || options[OptVIC] ||
1728 options[OptHDMIVIC] || options[OptSTD])
1729 return 0;
1730
1731 if (options[OptGTF] && (!gtf_data.params_from_edid || optind == argc)) {
1732 show_gtf(gtf_data);
1733 return 0;
1734 }
1735
12441736 if (optind == argc)
12451737 ret = edid_from_file("-", stdout);
12461738 else
12521744 }
12531745 if (optind < argc - 1)
12541746 return ret ? ret : edid_to_file(argv[optind + 1], out_fmt);
1747
1748 if (options[OptGTF]) {
1749 timings t;
1750
1751 // Find the Secondary Curve
1752 state.preparse_detailed_block(edid + 0x36);
1753 state.preparse_detailed_block(edid + 0x48);
1754 state.preparse_detailed_block(edid + 0x5a);
1755 state.preparse_detailed_block(edid + 0x6c);
1756
1757 t = state.calc_gtf_mode(gtf_data.w, gtf_data.h, gtf_data.freq,
1758 gtf_data.interlaced, gtf_data.ip_parm,
1759 gtf_data.overscan);
1760 unsigned hbl = t.hfp + t.hsync + t.hbp;
1761 unsigned htotal = t.hact + hbl;
1762 double hor_freq_khz = htotal ? (double)t.pixclk_khz / htotal : 0;
1763
1764 if (state.base.supports_sec_gtf &&
1765 hor_freq_khz >= state.base.sec_gtf_start_freq) {
1766 t = state.calc_gtf_mode(gtf_data.w, gtf_data.h, gtf_data.freq,
1767 gtf_data.interlaced, gtf_data.ip_parm,
1768 gtf_data.overscan, true,
1769 state.base.C, state.base.M,
1770 state.base.K, state.base.J);
1771 }
1772 calc_ratio(&t);
1773 if (t.hfp <= 0)
1774 state.print_timings("", &t, "GTF", "INVALID: Hfront <= 0", true, false);
1775 else
1776 state.print_timings("", &t, "GTF", "", true, false);
1777 return 0;
1778 }
12551779
12561780 return ret ? ret : state.parse_edid();
12571781 }
1111
1212 #include <string>
1313 #include <vector>
14 #include <set>
1415 #include <string.h>
1516
1617 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
2021 #define EDID_PAGE_SIZE 128U
2122 #define EDID_MAX_BLOCKS 256U
2223
23 #define RB_FLAG (1U << 7)
24 #define RB_ALT (1U << 7)
25
26 #define RB_NONE (0U)
27 #define RB_CVT_V1 (1U)
28 #define RB_CVT_V2 (2U)
29 #define RB_CVT_V3 (3U)
30 #define RB_GTF (4U)
2431
2532 // Video Timings
2633 // If interlaced is true, then the vertical blanking
2734 // for each field is (vfp + vsync + vbp + 0.5), except for
2835 // the VIC 39 timings that doesn't have the 0.5 constant.
36 //
37 // The sequence of the various video parameters is as follows:
38 //
39 // border - front porch - sync - back porch - border - active video
40 //
41 // Note: this is slightly different from EDID 1.4 which calls
42 // 'active video' as 'addressable video' and the EDID 1.4 term
43 // 'active video' includes the borders.
44 //
45 // But since borders are rarely used, the term 'active video' will
46 // typically be the same as 'addressable video', and that's how I
47 // use it.
2948 struct timings {
30 // Active horizontal and vertical frame height, including any
49 // Active horizontal and vertical frame height, excluding any
3150 // borders, if present.
3251 // Note: for interlaced formats the active field height is vact / 2
3352 unsigned hact, vact;
3453 unsigned hratio, vratio;
3554 unsigned pixclk_khz;
3655 // 0: no reduced blanking
37 // 1: reduced blanking version 1
38 // 2: reduced blanking version 2
39 // 3: reduced blanking version 3 with a horizontal blank of 80
40 // 3 | RB_FLAG: reduced blanking version 3 with a horizontal blank of 160
56 // 1: CVT reduced blanking version 1
57 // 2: CVT reduced blanking version 2
58 // 2 | RB_ALT: CVT reduced blanking version 2 video-optimized (1000/1001 fps)
59 // 3: CVT reduced blanking version 3
60 // 3 | RB_ALT: v3 with a horizontal blank of 160
61 // 4: GTF Secondary Curve
4162 unsigned rb;
4263 bool interlaced;
4364 // The horizontal frontporch may be negative in GTF calculations,
88109 std::string flags;
89110 };
90111
112 enum gtf_ip_parm {
113 gtf_ip_vert_freq = 1,
114 gtf_ip_hor_freq,
115 gtf_ip_clk_freq,
116 };
117
91118 typedef std::vector<timings_ext> vec_timings_ext;
92119
93120 struct edid_state {
98125 max_hor_freq_hz = max_vert_freq_hz = max_pixclk_khz = 0;
99126 min_hor_freq_hz = 0xffffff;
100127 min_vert_freq_hz = 0xffffffff;
128 dtd_max_vsize_mm = dtd_max_hsize_mm = 0;
101129 warnings = failures = 0;
102130 has_cta = has_dispid = false;
103131 hide_serial_numbers = false;
107135 base.has_name_descriptor = base.has_display_range_descriptor =
108136 base.has_serial_number = base.has_serial_string =
109137 base.supports_continuous_freq = base.supports_gtf =
110 base.supports_cvt = base.uses_gtf = base.uses_cvt =
138 base.supports_cvt = base.seen_non_detailed_descriptor =
111139 base.has_640x480p60_est_timing = base.has_spwg =
112 base.seen_non_detailed_descriptor =
113140 base.preferred_is_also_native = false;
141 base.supports_sec_gtf = false;
142 base.sec_gtf_start_freq = 0;
143 base.C = base.M = base.K = base.J = 0;
144 base.max_pos_neg_hor_freq_khz = 0;
114145 base.detailed_block_cnt = base.dtd_cnt = 0;
115146
116147 base.min_display_hor_freq_hz = base.max_display_hor_freq_hz =
119150 base.max_display_height_mm = 0;
120151
121152 // CTA-861 block state
122 cta.has_vic_1 = cta.first_svd_might_be_preferred =
153 cta.has_vic_1 = cta.first_svd_might_be_preferred = cta.has_sldb =
123154 cta.has_hdmi = cta.has_vcdb = cta.has_vfpdb = false;
124155 cta.last_block_was_hdmi_vsdb = cta.have_hf_vsdb = cta.have_hf_scdb = false;
125156 cta.first_block = cta.first_svd = true;
127158 memset(cta.vics, 0, sizeof(cta.vics));
128159 memset(cta.preparsed_has_vic, 0, sizeof(cta.preparsed_has_vic));
129160 cta.preparsed_phys_addr = 0xffff;
130 cta.preparse_total_dtds = 0;
131 cta.preparse_total_vtdbs = 0;
132 cta.preparse_has_t8vtdb = false;
161 cta.preparsed_speaker_count = 0;
162 cta.preparsed_sld = false;
163 cta.preparsed_sld_has_coord = false;
164 cta.preparsed_total_dtds = 0;
165 cta.preparsed_total_vtdbs = 0;
166 cta.preparsed_has_t8vtdb = false;
133167
134168 // DisplayID block state
135169 dispid.version = 0;
136 dispid.preparse_color_ids = dispid.preparse_xfer_ids = 0;
137 dispid.preparse_displayid_blocks = 0;
170 dispid.native_width = dispid.native_height = 0;
171 dispid.preparsed_color_ids = dispid.preparsed_xfer_ids = 0;
172 dispid.preparsed_displayid_blocks = 0;
138173 dispid.is_base_block = true;
139174 dispid.is_display = dispid.has_product_identification =
140175 dispid.has_display_parameters = dispid.has_type_1_7 =
160195 double min_vert_freq_hz;
161196 double max_vert_freq_hz;
162197 unsigned max_pixclk_khz;
198 unsigned dtd_max_hsize_mm;
199 unsigned dtd_max_vsize_mm;
163200
164201 unsigned warnings;
165202 unsigned failures;
173210 bool has_serial_string;
174211 bool supports_continuous_freq;
175212 bool supports_gtf;
213 bool supports_sec_gtf;
214 unsigned sec_gtf_start_freq;
215 double C, M, K, J;
176216 bool supports_cvt;
177 bool uses_gtf;
178 bool uses_cvt;
179217 bool has_spwg;
180218 unsigned detailed_block_cnt;
181219 unsigned dtd_cnt;
191229 unsigned max_display_pixclk_khz;
192230 unsigned max_display_width_mm;
193231 unsigned max_display_height_mm;
232 unsigned max_pos_neg_hor_freq_khz;
194233 } base;
195234
196235 // CTA-861 block state
197236 struct {
198 unsigned preparse_total_dtds;
237 unsigned preparsed_total_dtds;
199238 vec_timings_ext vec_dtds;
200 unsigned preparse_total_vtdbs;
239 unsigned preparsed_total_vtdbs;
201240 vec_timings_ext vec_vtdbs;
202241 vec_timings_ext preferred_timings;
203 bool preparse_has_t8vtdb;
242 bool preparsed_has_t8vtdb;
243 // Keep track of the found Tag/Extended Tag pairs.
244 // The unsigned value is equal to: (tag << 8) | ext_tag
245 std::set<unsigned> found_tags;
204246 timings_ext t8vtdb;
205247 vec_timings_ext native_timings;
206248 bool has_vic_1;
209251 bool has_hdmi;
210252 bool has_vcdb;
211253 bool has_vfpdb;
254 unsigned preparsed_speaker_count;
255 bool preparsed_sld_has_coord;
256 bool preparsed_sld;
257 bool has_sldb;
212258 unsigned short preparsed_phys_addr;
213259 bool last_block_was_hdmi_vsdb;
214260 bool have_hf_vsdb, have_hf_scdb;
224270 // DisplayID block state
225271 struct {
226272 unsigned char version;
227 unsigned short preparse_color_ids;
228 unsigned short preparse_xfer_ids;
229 unsigned preparse_displayid_blocks;
273 unsigned short preparsed_color_ids;
274 unsigned short preparsed_xfer_ids;
275 unsigned preparsed_displayid_blocks;
230276 bool is_base_block;
231277 bool is_display;
232278 bool has_product_identification;
234280 bool has_type_1_7;
235281 bool has_display_interface_features;
236282 vec_timings_ext preferred_timings;
283 unsigned native_width, native_height;
284 // Keep track of the found CTA-861 Tag/Extended Tag pairs.
285 // The unsigned value is equal to: (tag << 8) | ext_tag
286 std::set<unsigned> found_tags;
237287 } dispid;
238288
239289 // Block Map block state
246296 std::string dtd_type() { return dtd_type(base.dtd_cnt); }
247297 bool print_timings(const char *prefix, const struct timings *t,
248298 const char *type, const char *flags = "",
249 bool detailed = false);
299 bool detailed = false, bool do_checks = true);
250300 bool print_timings(const char *prefix, const struct timings_ext &t,
251 bool detailed = false)
301 bool detailed = false, bool do_checks = true)
252302 {
253 return print_timings(prefix, &t.t, t.type.c_str(), t.flags.c_str(), detailed);
303 return print_timings(prefix, &t.t, t.type.c_str(), t.flags.c_str(),
304 detailed, do_checks);
254305 };
255306 bool match_timings(const timings &t1, const timings &t2);
307 timings calc_gtf_mode(unsigned h_pixels, unsigned v_lines,
308 double ip_freq_rqd, bool int_rqd = false,
309 enum gtf_ip_parm ip_parm = gtf_ip_vert_freq,
310 bool margins_rqd = false, bool secondary = false,
311 double C = 40, double M = 600, double K = 128, double J = 20);
256312 void edid_gtf_mode(unsigned refresh, struct timings &t);
257 void edid_cvt_mode(unsigned refresh, struct timings &t);
258 timings calc_cvt_mode(unsigned refresh, unsigned hact, unsigned vact, unsigned rb);
313 timings calc_cvt_mode(unsigned h_pixels, unsigned v_lines,
314 double ip_freq_rqd, unsigned rb, bool int_rqd = false,
315 bool margins_rqd = false, bool alt = false,
316 unsigned rb_h_blank = 0, double add_vert_time = 0);
317 void edid_cvt_mode(unsigned refresh, struct timings &t, unsigned rb_h_blank = 0,
318 double add_vert_time = 0);
259319 void detailed_cvt_descriptor(const char *prefix, const unsigned char *x, bool first);
260320 void print_standard_timing(const char *prefix, unsigned char b1, unsigned char b2,
261 bool gtf_only = false, unsigned vrefresh_offset = 60);
321 bool gtf_only = false, bool show_both = false);
262322 void detailed_display_range_limits(const unsigned char *x);
263323 void detailed_epi(const unsigned char *x);
264324 void detailed_timings(const char *prefix, const unsigned char *x,
265325 bool base_or_cta = true);
326 void preparse_detailed_block(const unsigned char *x);
266327 void detailed_block(const unsigned char *x);
267328 void parse_base_block(const unsigned char *x);
268329 void check_base_block();
330 void list_dmts();
331 void list_established_timings();
269332
270333 void print_vic_index(const char *prefix, unsigned idx, const char *suffix, bool ycbcr420 = false);
334 void hdmi_latency(unsigned char vid_lat, unsigned char aud_lat, bool is_ilaced);
271335 void cta_vcdb(const unsigned char *x, unsigned length);
272336 void cta_svd(const unsigned char *x, unsigned n, bool for_ycbcr420);
273337 void cta_y420cmdb(const unsigned char *x, unsigned length);
274338 void cta_vfpdb(const unsigned char *x, unsigned length);
339 void cta_rcdb(const unsigned char *x, unsigned length);
340 void cta_sldb(const unsigned char *x, unsigned length);
341 void cta_preparse_sldb(const unsigned char *x, unsigned length);
275342 void cta_hdmi_block(const unsigned char *x, unsigned length);
276343 void cta_displayid_type_7(const unsigned char *x, unsigned length);
277344 void cta_displayid_type_8(const unsigned char *x, unsigned length);
278345 void cta_displayid_type_10(const unsigned char *x, unsigned length);
279 void cta_ext_block(const unsigned char *x, unsigned length);
280 void cta_block(const unsigned char *x);
346 void cta_ext_block(const unsigned char *x, unsigned length, bool duplicate);
347 void cta_block(const unsigned char *x, bool duplicate);
281348 void preparse_cta_block(const unsigned char *x);
282349 void parse_cta_block(const unsigned char *x);
283350 void cta_resolve_svr(vec_timings_ext::iterator iter);
284351 void cta_resolve_svrs();
285352 void check_cta_blocks();
353 void cta_list_vics();
354 void cta_list_hdmi_vics();
286355
287356 void parse_digital_interface(const unsigned char *x);
288357 void parse_display_device(const unsigned char *x);
297366 std::string product_type(unsigned char x, bool heading);
298367 void parse_displayid_interface_features(const unsigned char *x);
299368 void parse_displayid_parameters(const unsigned char *x);
300 void parse_displayid_parameters_v2(const unsigned char *x);
369 void parse_displayid_parameters_v2(const unsigned char *x, unsigned block_rev);
301370 void parse_displayid_display_intf(const unsigned char *x);
302371 void parse_displayid_color_characteristics(const unsigned char *x);
303372 void parse_displayid_transfer_characteristics(const unsigned char *x);
317386 void parse_displayid_type_9_timing(const unsigned char *x);
318387 void parse_displayid_dynamic_video_timings_range_limits(const unsigned char *x);
319388 void parse_displayid_ContainerID(const unsigned char *x);
320 void parse_displayid_type_10_timing(const unsigned char *x, bool is_cta = false);
389 void parse_displayid_type_10_timing(const unsigned char *x, unsigned sz,
390 bool is_cta = false);
321391 void preparse_displayid_block(const unsigned char *x);
322392 void parse_displayid_block(const unsigned char *x);
323393 void parse_displayid_vesa(const unsigned char *x);
377447 void do_checksum(const char *prefix, const unsigned char *x, size_t len);
378448 std::string utohex(unsigned char x);
379449 std::string ouitohex(unsigned oui);
450 std::string containerid2s(const unsigned char *x);
380451 bool memchk(const unsigned char *x, unsigned len, unsigned char v = 0);
381452 void hex_block(const char *prefix, const unsigned char *x, unsigned length,
382453 bool show_ascii = true, unsigned step = 16);
384455 void calc_ratio(struct timings *t);
385456 const char *oui_name(unsigned oui, bool reverse = false);
386457
458 bool timings_close_match(const timings &t1, const timings &t2);
387459 const struct timings *find_dmt_id(unsigned char dmt_id);
460 const struct timings *close_match_to_dmt(const timings &t, unsigned &dmt);
388461 const struct timings *find_vic_id(unsigned char vic);
389462 const struct timings *find_hdmi_vic_id(unsigned char hdmi_vic);
463 const struct timings *cta_close_match_to_vic(const timings &t, unsigned &vic);
390464 unsigned char hdmi_vic_to_vic(unsigned char hdmi_vic);
391465 char *extract_string(const unsigned char *x, unsigned len);
392466
4444 36, 72, 108, false, 1, 3, 42, true } },
4545
4646 { 0x04, 0x3140, 0x000000, { 640, 480, 4, 3, 25175, 0, false,
47 16, 96, 48, false, 10, 2, 33, false, 8, 8 } },
47 8, 96, 40, false, 2, 2, 25, false, 8, 8 } },
4848 { 0x05, 0x314c, 0x000000, { 640, 480, 4, 3, 31500, 0, false,
49 24, 40, 128, false, 9, 3, 28, false, 8, 8 } },
49 16, 40, 120, false, 1, 3, 20, false, 8, 8 } },
5050 { 0x06, 0x314f, 0x000000, { 640, 480, 4, 3, 31500, 0, false,
5151 16, 64, 120, false, 1, 3, 16, false } },
5252 { 0x07, 0x3159, 0x000000, { 640, 480, 4, 3, 36000, 0, false,
353353 return NULL;
354354 }
355355
356 /*
357 * Copied from xserver/hw/xfree86/modes/xf86gtf.c
358 */
359 void edid_state::edid_gtf_mode(unsigned refresh, struct timings &t)
356 void edid_state::list_established_timings()
360357 {
361 #define CELL_GRAN 8.0 /* assumed character cell granularity */
362 #define MIN_PORCH 1 /* minimum front porch */
363 #define V_SYNC_RQD 3 /* width of vsync in lines */
364 #define H_SYNC_PERCENT 8.0 /* width of hsync as % of total line */
365 #define MIN_VSYNC_PLUS_BP 550.0 /* min time of vsync + back porch (microsec) */
366 #define M 600.0 /* blanking formula gradient */
367 #define C 40.0 /* blanking formula offset */
368 #define K 128.0 /* blanking formula scaling factor */
369 #define J 20.0 /* blanking formula scaling factor */
370
371 /* C' and M' are part of the Blanking Duty Cycle computation */
372
373 #define C_PRIME (((C - J) * K/256.0) + J)
374 #define M_PRIME (K/256.0 * M)
375 double h_pixels_rnd;
376 double v_lines_rnd;
377 double v_field_rate_rqd;
378 double h_period_est;
379 double vsync_plus_bp;
380 double total_v_lines;
381 double v_field_rate_est;
382 double h_period;
383 double total_active_pixels;
384 double ideal_duty_cycle;
385 double h_blank;
386 double total_pixels;
387
388 /* 1. In order to give correct results, the number of horizontal
389 * pixels requested is first processed to ensure that it is divisible
390 * by the character size, by rounding it to the nearest character
391 * cell boundary:
392 *
393 * [H PIXELS RND] = ((ROUND([H PIXELS]/[CELL GRAN RND],0))*[CELLGRAN RND])
394 */
395
396 h_pixels_rnd = rint((double)t.hact / CELL_GRAN) * CELL_GRAN;
397
398 /* 2. If interlace is requested, the number of vertical lines assumed
399 * by the calculation must be halved, as the computation calculates
400 * the number of vertical lines per field. In either case, the
401 * number of lines is rounded to the nearest integer.
402 *
403 * [V LINES RND] = IF([INT RQD?]="y", ROUND([V LINES]/2,0),
404 * ROUND([V LINES],0))
405 */
406
407 v_lines_rnd = t.vact;
408
409 /* 3. Find the frame rate required:
410 *
411 * [V FIELD RATE RQD] = IF([INT RQD?]="y", [I/P FREQ RQD]*2,
412 * [I/P FREQ RQD])
413 */
414
415 v_field_rate_rqd = refresh;
416
417 /* 7. Estimate the Horizontal period
418 *
419 * [H PERIOD EST] = ((1/[V FIELD RATE RQD]) - [MIN VSYNC+BP]/1000000) /
420 * ([V LINES RND] +
421 * [MIN PORCH RND]+[INTERLACE]) * 1000000
422 */
423
424 h_period_est = (((1.0/v_field_rate_rqd) - (MIN_VSYNC_PLUS_BP/1000000.0))
425 / (v_lines_rnd + MIN_PORCH)
426 * 1000000.0);
427
428 /* 8. Find the number of lines in V sync + back porch:
429 *
430 * [V SYNC+BP] = ROUND(([MIN VSYNC+BP]/[H PERIOD EST]),0)
431 */
432
433 vsync_plus_bp = rint(MIN_VSYNC_PLUS_BP/h_period_est);
434
435 /* 10. Find the total number of lines in Vertical field period:
436 *
437 * [TOTAL V LINES] = [V LINES RND] +
438 * [V SYNC+BP] + [INTERLACE] +
439 * [MIN PORCH RND]
440 */
441
442 total_v_lines = v_lines_rnd + vsync_plus_bp + MIN_PORCH;
443 t.vbp = vsync_plus_bp - V_SYNC_RQD;
444 t.vsync = V_SYNC_RQD;
445 t.vfp = MIN_PORCH;
446
447 /* 11. Estimate the Vertical field frequency:
448 *
449 * [V FIELD RATE EST] = 1 / [H PERIOD EST] / [TOTAL V LINES] * 1000000
450 */
451
452 v_field_rate_est = 1.0 / h_period_est / total_v_lines * 1000000.0;
453
454 /* 12. Find the actual horizontal period:
455 *
456 * [H PERIOD] = [H PERIOD EST] / ([V FIELD RATE RQD] / [V FIELD RATE EST])
457 */
458
459 h_period = h_period_est / (v_field_rate_rqd / v_field_rate_est);
460
461 /* 17. Find total number of active pixels in image
462 *
463 * [TOTAL ACTIVE PIXELS] = [H PIXELS RND]
464 */
465
466 total_active_pixels = h_pixels_rnd;
467
468 /* 18. Find the ideal blanking duty cycle from the blanking duty cycle
469 * equation:
470 *
471 * [IDEAL DUTY CYCLE] = [C'] - ([M']*[H PERIOD]/1000)
472 */
473
474 ideal_duty_cycle = C_PRIME - (M_PRIME * h_period / 1000.0);
475
476 /* 19. Find the number of pixels in the blanking time to the nearest
477 * double character cell:
478 *
479 * [H BLANK (PIXELS)] = (ROUND(([TOTAL ACTIVE PIXELS] *
480 * [IDEAL DUTY CYCLE] /
481 * (100-[IDEAL DUTY CYCLE]) /
482 * (2*[CELL GRAN RND])), 0))
483 * * (2*[CELL GRAN RND])
484 */
485
486 h_blank = rint(total_active_pixels *
487 ideal_duty_cycle /
488 (100.0 - ideal_duty_cycle) /
489 (2.0 * CELL_GRAN)) * (2.0 * CELL_GRAN);
490
491 /* 20. Find total number of pixels:
492 *
493 * [TOTAL PIXELS] = [TOTAL ACTIVE PIXELS] + [H BLANK (PIXELS)]
494 */
495
496 total_pixels = total_active_pixels + h_blank;
497
498 /* 21. Find pixel clock frequency:
499 *
500 * [PIXEL FREQ] = [TOTAL PIXELS] / [H PERIOD]
501 */
502
503 t.pixclk_khz = (int)(1000.0 * total_pixels / h_period + 0.5);
504
505 /* Stage 1 computations are now complete; I should really pass
506 the results to another function and do the Stage 2
507 computations, but I only need a few more values so I'll just
508 append the computations here for now */
509 /* 17. Find the number of pixels in the horizontal sync period:
510 *
511 * [H SYNC (PIXELS)] =(ROUND(([H SYNC%] / 100 * [TOTAL PIXELS] /
512 * [CELL GRAN RND]),0))*[CELL GRAN RND]
513 */
514 t.hsync = rint(H_SYNC_PERCENT / 100.0 * total_pixels / CELL_GRAN) * CELL_GRAN;
515 /* 18. Find the number of pixels in the horizontal front porch period:
516 *
517 * [H FRONT PORCH (PIXELS)] = ([H BLANK (PIXELS)]/2)-[H SYNC (PIXELS)]
518 */
519 t.hfp = (h_blank / 2.0) - t.hsync;
520 /* 19. Find the number of pixels in the horizontal back porch period:
521 *
522 * [H BACK PORCH (PIXELS)] = [H FRONT PORCH (PIXELS)]+[H SYNC (PIXELS)]
523 */
524 t.hbp = t.hfp + t.hsync;
525 t.pos_pol_hsync = false;
526 t.pos_pol_vsync = true;
527 t.interlaced = false;
528 t.rb = 0;
358 printf("Established Timings I & II, 'Byte' is the EDID address:\n\n");
359 for (unsigned i = 0; i < ARRAY_SIZE(established_timings12); i++) {
360 unsigned char dmt_id = established_timings12[i].dmt_id;
361 const struct timings *t;
362 char type[16];
363
364 if (dmt_id) {
365 sprintf(type, "DMT 0x%02x", dmt_id);
366 t = find_dmt_id(dmt_id);
367 } else {
368 t = &established_timings12[i].t;
369 sprintf(type, "%-8s", established_timings12[i].type);
370 }
371 printf("Byte 0x%02x, Bit %u: ", 0x23 + i / 8, 7 - i % 8);
372 print_timings("", t, type, "", false, false);
373 }
374 printf("\nEstablished timings III, 'Byte' is the offset from the start of the descriptor:\n\n");
375 for (unsigned i = 0; i < ARRAY_SIZE(established_timings3_dmt_ids); i++) {
376 unsigned char dmt_id = established_timings3_dmt_ids[i];
377 char type[16];
378
379 sprintf(type, "DMT 0x%02x", dmt_id);
380 printf("Byte 0x%02x, Bit %u: ", 6 + i / 8, 7 - i % 8);
381 print_timings("", find_dmt_id(dmt_id), type, "", false, false);
382 }
529383 }
530384
531 /*
532 * Copied from xserver/hw/xfree86/modes/xf86cvt.c
533 */
534 void edid_state::edid_cvt_mode(unsigned refresh, struct timings &t)
385 const struct timings *close_match_to_dmt(const timings &t, unsigned &dmt)
535386 {
536 int HDisplay = t.hact;
537 int VDisplay = t.vact;
538
539 /* 2) character cell horizontal granularity (pixels) - default 8 */
540 #define CVT_H_GRANULARITY 8
541
542 /* 4) Minimum vertical porch (lines) - default 3 */
543 #define CVT_MIN_V_PORCH 3
544
545 /* 4) Minimum number of vertical back porch lines - default 6 */
546 #define CVT_MIN_V_BPORCH 6
547
548 /* Pixel Clock step (kHz) */
549 #define CVT_CLOCK_STEP 250
550
551 double HPeriod;
552 int VDisplayRnd, VSync;
553 double VFieldRate = refresh;
554 int HTotal, VTotal, Clock, HSyncStart, HSyncEnd, VSyncStart, VSyncEnd;
555
556 /* 2. Horizontal pixels */
557 HDisplay = HDisplay - (HDisplay % CVT_H_GRANULARITY);
558
559 /* 5. Find number of lines per field */
560 VDisplayRnd = VDisplay;
561
562 /* Determine VSync Width from aspect ratio */
563 if ((VDisplay * 4 / 3) == HDisplay)
564 VSync = 4;
565 else if ((VDisplay * 16 / 9) == HDisplay)
566 VSync = 5;
567 else if ((VDisplay * 16 / 10) == HDisplay)
568 VSync = 6;
569 else if (!(VDisplay % 4) && ((VDisplay * 5 / 4) == HDisplay))
570 VSync = 7;
571 else if ((VDisplay * 15 / 9) == HDisplay)
572 VSync = 7;
573 else /* Custom */
574 VSync = 10;
575
576 if (!t.rb) { /* simplified GTF calculation */
577 /* 4) Minimum time of vertical sync + back porch interval (µs)
578 * default 550.0 */
579 #define CVT_MIN_VSYNC_BP 550.0
580
581 /* 3) Nominal HSync width (% of line period) - default 8 */
582 #define CVT_HSYNC_PERCENTAGE 8
583
584 double HBlankPercentage;
585 int VSyncAndBackPorch;
586 int HBlank;
587
588 /* 8. Estimated Horizontal period */
589 HPeriod = ((double) (1000000.0 / VFieldRate - CVT_MIN_VSYNC_BP)) /
590 (VDisplayRnd + CVT_MIN_V_PORCH);
591
592 /* 9. Find number of lines in sync + backporch */
593 if (((int) (CVT_MIN_VSYNC_BP / HPeriod) + 1) <
594 (VSync + CVT_MIN_V_BPORCH))
595 VSyncAndBackPorch = VSync + CVT_MIN_V_BPORCH;
596 else
597 VSyncAndBackPorch = (int) (CVT_MIN_VSYNC_BP / HPeriod) + 1;
598
599 VTotal = VDisplayRnd + VSyncAndBackPorch + CVT_MIN_V_PORCH;
600
601 /* 5) Definition of Horizontal blanking time limitation */
602 /* Gradient (%/kHz) - default 600 */
603 #define CVT_M_FACTOR 600.0
604
605 /* Offset (%) - default 40 */
606 #define CVT_C_FACTOR 40.0
607
608 /* Blanking time scaling factor - default 128 */
609 #define CVT_K_FACTOR 128.0
610
611 /* Scaling factor weighting - default 20 */
612 #define CVT_J_FACTOR 20.0
613
614 #define CVT_M_PRIME (CVT_M_FACTOR * CVT_K_FACTOR / 256.0)
615 #define CVT_C_PRIME ((CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256.0 + \
616 CVT_J_FACTOR)
617
618 /* 12. Find ideal blanking duty cycle from formula */
619 HBlankPercentage = CVT_C_PRIME - CVT_M_PRIME * HPeriod / 1000.0;
620
621 /* 13. Blanking time */
622 if (HBlankPercentage < 20)
623 HBlankPercentage = 20;
624
625 HBlank = (double)HDisplay * HBlankPercentage / (100.0 - HBlankPercentage) / (2.0 * CVT_H_GRANULARITY);
626 HBlank *= 2 * CVT_H_GRANULARITY;
627
628 /* 14. Find total number of pixels in a line. */
629 HTotal = HDisplay + HBlank;
630
631 int HSync = (HTotal * CVT_HSYNC_PERCENTAGE) / 100.0 + 0.0;
632 //printf("%d %d %d\n", HTotal, HBlank, HSync);
633 HSync -= HSync % CVT_H_GRANULARITY;
634
635 /* Fill in HSync values */
636 HSyncEnd = HTotal - HBlank / 2;
637
638 HSyncStart = HSyncEnd - HSync;
639 VSyncStart = VDisplayRnd + CVT_MIN_V_PORCH;
640 VSyncEnd = VSyncStart + VSync;
641
642 /* 15/13. Find pixel clock frequency (kHz) */
643 Clock = ((double)HTotal / HPeriod) * 1000.0;
644 Clock -= Clock % CVT_CLOCK_STEP;
645 }
646 else { /* Reduced blanking */
647 /* Minimum vertical blanking interval time (µs) - default 460 */
648 #define CVT_RB_MIN_VBLANK 460.0
649
650 /* Fixed number of clocks for horizontal sync */
651 #define CVT_RB_H_SYNC 32.0
652
653 /* Fixed number of clocks for horizontal blanking */
654 #define CVT_RB1_H_BLANK 160.0 // RB1 & RB3 with RB_FLAG set
655 #define CVT_RB2_H_BLANK 80.0 // RB2 & RB3 with RB_FLAG cleared
656
657 /* Fixed number of lines for vertical front porch - default 3 */
658 #define CVT_RB1_V_FPORCH 3
659 #define CVT_RB2_V_FPORCH 1
660 #define CVT_RB3_V_FIELD_RATE_PPM_ADJ 350.0
661 #define CVT_RB2_CLOCK_STEP 1
662
663 int VBILines;
664 double h_blank = (t.rb & ~RB_FLAG) == 1 ? CVT_RB1_H_BLANK : CVT_RB2_H_BLANK;
665 int v_fporch = t.rb == 1 ? CVT_RB1_V_FPORCH : CVT_RB2_V_FPORCH;
666 unsigned clock_step = t.rb == 1 ? CVT_CLOCK_STEP : CVT_RB2_CLOCK_STEP;
667
668 if (t.rb == 3)
669 VFieldRate += VFieldRate * (CVT_RB3_V_FIELD_RATE_PPM_ADJ / 1000000.0);
670
671 /* 8. Estimate Horizontal period. */
672 HPeriod = ((double) (1000000.0 / VFieldRate - CVT_RB_MIN_VBLANK)) / VDisplayRnd;
673
674 /* 9. Find number of lines in vertical blanking */
675 VBILines = ((double) CVT_RB_MIN_VBLANK) / HPeriod;
676 VBILines++;
677
678 /* 10. Check if vertical blanking is sufficient */
679 if (VBILines < (v_fporch + VSync + CVT_MIN_V_BPORCH))
680 VBILines = v_fporch + VSync + CVT_MIN_V_BPORCH;
681
682 /* 11. Find total number of lines in vertical field */
683 VTotal = VDisplayRnd + VBILines;
684
685 /* 12. Find total number of pixels in a line */
686 HTotal = HDisplay + h_blank;
687
688 /* Fill in HSync values */
689 HSyncEnd = HDisplay + h_blank / 2;
690 HSyncStart = HSyncEnd - CVT_RB_H_SYNC;
691
692 /* Fill in VSync values */
693 VSyncStart = VDisplay + v_fporch;
694 VSyncEnd = VSyncStart + VSync;
695
696 /* 15/13. Find pixel clock frequency (kHz) */
697 double clk_khz = ((double)VFieldRate * VTotal * HTotal) / 1000.0;
698 if (t.rb < 3)
699 Clock = clock_step * floor(clk_khz / clock_step);
700 else
701 Clock = clock_step * ceil(clk_khz / clock_step);
702 }
703 t.pixclk_khz = Clock;
704
705 t.pos_pol_hsync = t.rb;
706 t.pos_pol_vsync = !t.rb;
707 t.vfp = VSyncStart - VDisplay;
708 t.vsync = VSyncEnd - VSyncStart;
709 t.vbp = VTotal - VSyncEnd;
710 t.hfp = HSyncStart - HDisplay;
711 t.hsync = HSyncEnd - HSyncStart;
712 t.hbp = HTotal - HSyncEnd;
713 t.interlaced = false;
387 for (unsigned i = 0; i < ARRAY_SIZE(dmt_timings); i++) {
388 if (timings_close_match(t, dmt_timings[i].t)) {
389 dmt = dmt_timings[i].dmt_id;
390 return &dmt_timings[i].t;
391 }
392 }
393 dmt = 0;
394 return NULL;
714395 }
715396
716 timings edid_state::calc_cvt_mode(unsigned refresh, unsigned hact, unsigned vact, unsigned rb)
397 void edid_state::list_dmts()
717398 {
718 timings t = {};
719
720 t.hact = hact;
721 t.vact = vact;
722 t.rb = rb;
723 calc_ratio(&t);
724 edid_cvt_mode(refresh, t);
725 return t;
399 char type[16];
400
401 for (unsigned i = 0; i < ARRAY_SIZE(dmt_timings); i++) {
402 sprintf(type, "DMT 0x%02x", dmt_timings[i].dmt_id);
403 std::string flags;
404 if (dmt_timings[i].std_id)
405 flags += std::string("STD: ") +
406 utohex(dmt_timings[i].std_id >> 8) + " " +
407 utohex(dmt_timings[i].std_id & 0xff);
408 if (dmt_timings[i].cvt_id)
409 add_str(flags, std::string("CVT: ") +
410 utohex(dmt_timings[i].cvt_id >> 16) + " " +
411 utohex((dmt_timings[i].cvt_id >> 8) & 0xff) + " " +
412 utohex(dmt_timings[i].cvt_id & 0xff));
413 print_timings("", &dmt_timings[i].t, type, flags.c_str(), false, false);
414 }
726415 }
727416
728417 void edid_state::detailed_cvt_descriptor(const char *prefix, const unsigned char *x, bool first)
734423 if (!first && !memcmp(x, empty, 3))
735424 return;
736425
737 base.uses_cvt = true;
738426 cvt_t.vact = x[0];
739427 if (!cvt_t.vact)
740428 fail("CVT byte 0 is 0, which is a reserved value.\n");
794482 print_timings(prefix, &cvt_t, "CVT", preferred == 3 ? s_pref : "");
795483 }
796484 if (x[2] & 0x01) {
797 cvt_t.rb = 1;
485 cvt_t.rb = RB_CVT_V1;
798486 edid_cvt_mode(60, cvt_t);
799487 print_timings(prefix, &cvt_t, "CVT", preferred == 4 ? s_pref : "");
800488 }
838526 }
839527
840528 void edid_state::print_standard_timing(const char *prefix, unsigned char b1, unsigned char b2,
841 bool gtf_only, unsigned vrefresh_offset)
529 bool gtf_only, bool show_both)
842530 {
843531 const struct timings *t;
844532 struct timings formula = {};
862550 hact = (b1 + 31) * 8;
863551 switch ((b2 >> 6) & 0x3) {
864552 case 0x00:
865 if (gtf_only || base.edid_minor >= 3) {
553 if (gtf_only || show_both || base.edid_minor >= 3) {
866554 hratio = 16;
867555 vratio = 10;
868556 } else {
885573 }
886574 vact = (double)hact * vratio / hratio;
887575 vact = 8 * ((vact + 7) / 8);
888 refresh = vrefresh_offset + (b2 & 0x3f);
576 refresh = (b2 & 0x3f) + 60;
889577
890578 formula.hact = hact;
891579 formula.vact = vact;
892580 formula.hratio = hratio;
893581 formula.vratio = vratio;
894582
895 if (!gtf_only && base.edid_minor >= 4) {
896 base.uses_cvt = true;
897 edid_cvt_mode(refresh, formula);
898 print_timings(prefix, &formula, "CVT ", "EDID 1.4 source");
583 if (!gtf_only && (show_both || base.edid_minor >= 4)) {
584 if (show_both || base.supports_cvt) {
585 edid_cvt_mode(refresh, formula);
586 print_timings(prefix, &formula, "CVT ",
587 show_both ? "" : "EDID 1.4 source");
588 }
899589 /*
900 * A EDID 1.3 source will assume GTF, so both GTF and CVT
590 * An EDID 1.3 source will assume GTF, so both GTF and CVT
901591 * have to be supported.
902592 */
903 base.uses_gtf = true;
904593 edid_gtf_mode(refresh, formula);
905 print_timings(prefix, &formula, "GTF ", "EDID 1.3 source");
594 if (base.supports_cvt)
595 print_timings(prefix, &formula, "GTF ", "EDID 1.3 source");
596 else
597 print_timings(prefix, &formula, "GTF ");
906598 } else if (gtf_only || base.edid_minor >= 2) {
907 base.uses_gtf = true;
908599 edid_gtf_mode(refresh, formula);
909600 print_timings(prefix, &formula, "GTF ");
910601 } else {
924615 std::string range_class;
925616
926617 data_block = "Display Range Limits";
927 printf(" %s:\n", data_block.c_str());
618 printf(" %s:\n", data_block.c_str());
928619 base.has_display_range_descriptor = 1;
929620
930621 if (base.edid_minor >= 4) {
950641 range_class = "GTF";
951642 if (base.edid_minor >= 4 && !base.supports_continuous_freq)
952643 fail("GTF can't be combined with non-continuous frequencies.\n");
953 base.supports_gtf = true;
644 if (base.edid_minor >= 4)
645 warn("GTF support is deprecated in EDID 1.4.\n");
954646 break;
955647 case 0x01: /* range limits only */
956648 range_class = "Bare Limits";
961653 range_class = "Secondary GTF";
962654 if (base.edid_minor >= 4 && !base.supports_continuous_freq)
963655 fail("GTF can't be combined with non-continuous frequencies.\n");
964 base.supports_gtf = true;
656 if (base.edid_minor >= 4)
657 warn("GTF support is deprecated in EDID 1.4.\n");
965658 has_sec_gtf = true;
966659 break;
967660 case 0x04: /* cvt */
971664 fail("'%s' is not allowed for EDID < 1.4.\n", range_class.c_str());
972665 else if (!base.supports_continuous_freq)
973666 fail("CVT can't be combined with non-continuous frequencies.\n");
974 if (base.edid_minor >= 4) {
975 /* GTF is implied if CVT is signaled */
976 base.supports_gtf = true;
977 base.supports_cvt = true;
978 }
979667 break;
980668 default: /* invalid */
981669 fail("Unknown range class (0x%02x).\n", x[10]);
991679 fail("Min horizontal freq > max horizontal freq.\n");
992680 base.min_display_hor_freq_hz = (x[7] + h_min_offset) * 1000;
993681 base.max_display_hor_freq_hz = (x[8] + h_max_offset) * 1000;
994 printf(" Monitor ranges (%s): %d-%d Hz V, %d-%d kHz H",
682 printf(" Monitor ranges (%s): %d-%d Hz V, %d-%d kHz H",
995683 range_class.c_str(),
996684 x[5] + v_min_offset, x[6] + v_max_offset,
997685 x[7] + h_min_offset, x[8] + h_max_offset);
1020708 if (has_sec_gtf) {
1021709 if (x[11])
1022710 fail("Byte 11 is 0x%02x instead of 0x00.\n", x[11]);
1023 printf(" GTF Secondary Curve Block:\n");
1024 printf(" Start frequency: %u kHz\n", x[12] * 2);
1025 printf(" C: %f\n", x[13] / 2.0);
1026 if (x[13] > 127)
1027 fail("Byte 13 is > 127.\n");
1028 printf(" M: %u\n", (x[15] << 8) | x[14]);
1029 printf(" K: %u\n", x[16]);
1030 printf(" J: %f\n", x[17] / 2.0);
1031 if (x[17] > 127)
1032 fail("Byte 17 is > 127.\n");
711 if (memchk(x + 12, 6)) {
712 fail("Zeroed Secondary Curve Block.\n");
713 } else {
714 printf(" GTF Secondary Curve Block:\n");
715 printf(" Start frequency: %u kHz\n", x[12] * 2);
716 printf(" C: %.1f%%\n", x[13] / 2.0);
717 printf(" M: %u%%/kHz\n", (x[15] << 8) | x[14]);
718 printf(" K: %u\n", x[16]);
719 printf(" J: %.1f%%\n", x[17] / 2.0);
720 }
1033721 } else if (is_cvt) {
1034722 int max_h_pixels = 0;
1035723
1036 printf(" CVT version %d.%d\n", (x[11] & 0xf0) >> 4, x[11] & 0x0f);
724 printf(" CVT version %d.%d\n", (x[11] & 0xf0) >> 4, x[11] & 0x0f);
1037725
1038726 if (x[12] & 0xfc) {
1039727 unsigned raw_offset = (x[12] & 0xfc) >> 2;
1040728
1041 printf(" Real max dotclock: %.2f MHz\n",
729 printf(" Real max dotclock: %.2f MHz\n",
1042730 (x[9] * 10) - (raw_offset * 0.25));
1043731 if (raw_offset >= 40)
1044732 warn("CVT block corrects dotclock by more than 9.75 MHz.\n");
1049737 max_h_pixels |= x[13];
1050738 max_h_pixels *= 8;
1051739 if (max_h_pixels)
1052 printf(" Max active pixels per line: %d\n", max_h_pixels);
1053
1054 printf(" Supported aspect ratios:%s%s%s%s%s\n",
740 printf(" Max active pixels per line: %d\n", max_h_pixels);
741
742 printf(" Supported aspect ratios:%s%s%s%s%s\n",
1055743 x[14] & 0x80 ? " 4:3" : "",
1056744 x[14] & 0x40 ? " 16:9" : "",
1057745 x[14] & 0x20 ? " 16:10" : "",
1060748 if (x[14] & 0x07)
1061749 fail("Reserved bits of byte 14 are non-zero.\n");
1062750
1063 printf(" Preferred aspect ratio: ");
751 printf(" Preferred aspect ratio: ");
1064752 switch ((x[15] & 0xe0) >> 5) {
1065753 case 0x00:
1066754 printf("4:3");
1086774 printf("\n");
1087775
1088776 if (x[15] & 0x08)
1089 printf(" Supports CVT standard blanking\n");
777 printf(" Supports CVT standard blanking\n");
1090778 if (x[15] & 0x10)
1091 printf(" Supports CVT reduced blanking\n");
779 printf(" Supports CVT reduced blanking\n");
1092780
1093781 if (x[15] & 0x07)
1094782 fail("Reserved bits of byte 15 are non-zero.\n");
1095783
1096784 if (x[16] & 0xf0) {
1097 printf(" Supported display scaling:\n");
785 printf(" Supported display scaling:\n");
1098786 if (x[16] & 0x80)
1099 printf(" Horizontal shrink\n");
787 printf(" Horizontal shrink\n");
1100788 if (x[16] & 0x40)
1101 printf(" Horizontal stretch\n");
789 printf(" Horizontal stretch\n");
1102790 if (x[16] & 0x20)
1103 printf(" Vertical shrink\n");
791 printf(" Vertical shrink\n");
1104792 if (x[16] & 0x10)
1105 printf(" Vertical stretch\n");
793 printf(" Vertical stretch\n");
1106794 }
1107795
1108796 if (x[16] & 0x0f)
1109797 fail("Reserved bits of byte 16 are non-zero.\n");
1110798
1111799 if (x[17])
1112 printf(" Preferred vertical refresh: %d Hz\n", x[17]);
800 printf(" Preferred vertical refresh: %d Hz\n", x[17]);
1113801 else
1114802 warn("CVT block does not set preferred refresh rate.\n");
1115803 } else {
1246934 return;
1247935 }
1248936
937 /*
938 * If the borders are non-zero, then it is unclear how to interpret
939 * the DTD blanking parameters.
940 *
941 * According to EDID 1.3 (3.12) the Hor/Vert Blanking includes the
942 * borders, and so does the Hor/Vert Sync Offset.
943 *
944 * According to EDID 1.4 (3.12) the Hor/Vert Blanking excludes the
945 * borders, and they are also excluded from the Hor/Vert Front Porch.
946 *
947 * But looking at what is really done in EDIDs is that the Hor/Vert
948 * Blanking follows EDID 1.3, but the Hor/Vert Front Porch does not
949 * include the border.
950 *
951 * So hbl/vbl includes the borders, so those need to be subtracted,
952 * but hfp/vfp is used as-is.
953 *
954 * In practice you really shouldn't use non-zero borders in DTDs
955 * since clearly nobody knows how to interpret the timing.
956 */
1249957 t.hact = (x[2] + ((x[4] & 0xf0) << 4));
1250 hbl = (x[3] + ((x[4] & 0x0f) << 8));
958 t.hborder = x[15];
959 hbl = (x[3] + ((x[4] & 0x0f) << 8)) - t.hborder * 2;
1251960 t.hfp = (x[8] + ((x[11] & 0xc0) << 2));
1252961 t.hsync = (x[9] + ((x[11] & 0x30) << 4));
1253962 t.hbp = hbl - t.hsync - t.hfp;
1254 t.hborder = x[15];
1255963 t.vact = (x[5] + ((x[7] & 0xf0) << 4));
1256 vbl = (x[6] + ((x[7] & 0x0f) << 8));
964 t.vborder = x[16];
965 vbl = (x[6] + ((x[7] & 0x0f) << 8)) - t.vborder * 2;
1257966 t.vfp = ((x[10] >> 4) + ((x[11] & 0x0c) << 2));
1258967 t.vsync = ((x[10] & 0x0f) + ((x[11] & 0x03) << 4));
1259968 t.vbp = vbl - t.vsync - t.vfp;
1260 t.vborder = x[16];
1261969
1262970 unsigned char flags = x[17];
1263971
13521060 if (block_nr == 0 && base.dtd_cnt == 1) {
13531061 te.type = "DTD 1";
13541062 base.preferred_timing = te;
1355 cta.preferred_timings.push_back(te);
1356 cta.native_timings.push_back(te);
1063 if (has_cta) {
1064 cta.preferred_timings.push_back(te);
1065 cta.native_timings.push_back(te);
1066 }
13571067 }
13581068 if (base_or_cta)
13591069 cta.vec_dtds.push_back(te);
13601070
1071 if (t.hborder || t.vborder)
1072 warn("The use of non-zero borders in a DTD is not recommended.\n");
13611073 if ((base.max_display_width_mm && !t.hsize_mm) ||
13621074 (base.max_display_height_mm && !t.vsize_mm)) {
13631075 fail("Mismatch of image size vs display size: image size is not set, but display size is.\n");
13691081
13701082 s += " ";
13711083 hex_block(s.c_str(), x, 18, true, 18);
1084 }
1085 }
1086
1087 void edid_state::preparse_detailed_block(const unsigned char *x)
1088 {
1089 if (x[0] || x[1])
1090 return;
1091 if (x[3] != 0xfd)
1092 return;
1093
1094 switch (x[10]) {
1095 case 0x00: /* default gtf */
1096 base.supports_gtf = true;
1097 break;
1098 case 0x02: /* secondary gtf curve */
1099 base.supports_gtf = true;
1100 base.supports_sec_gtf = !memchk(x + 12, 6);
1101 base.sec_gtf_start_freq = x[12] * 2;
1102 base.C = x[13] / 2.0;
1103 base.M = (x[15] << 8) | x[14];
1104 base.K = x[16];
1105 base.J = x[17] / 2.0;
1106 break;
1107 case 0x04: /* cvt */
1108 if (base.edid_minor >= 4) {
1109 /* GTF is implied if CVT is signaled */
1110 base.supports_gtf = true;
1111 base.supports_cvt = true;
1112 }
1113 break;
13721114 }
13731115 }
13741116
14251167 case 0xf7:
14261168 data_block = "Established timings III";
14271169 printf(" %s:\n", data_block.c_str());
1428 for (i = 0; i < 44; i++)
1170 for (i = 0; i < ARRAY_SIZE(established_timings3_dmt_ids); i++)
14291171 if (x[6 + i / 8] & (1 << (7 - i % 8))) {
14301172 unsigned char dmt_id = established_timings3_dmt_ids[i];
14311173 char type[16];
14331175 sprintf(type, "DMT 0x%02x", dmt_id);
14341176 print_timings(" ", find_dmt_id(dmt_id), type);
14351177 }
1178 if (base.edid_minor < 4)
1179 fail("Not allowed for EDID < 1.4.\n");
14361180 return;
14371181 case 0xf8:
14381182 data_block = "CVT 3 Byte Timing Codes";
14431187 }
14441188 for (i = 0; i < 4; i++)
14451189 detailed_cvt_descriptor(" ", x + 6 + (i * 3), !i);
1190 if (base.edid_minor < 4)
1191 fail("Not allowed for EDID < 1.4.\n");
14461192 return;
14471193 case 0xf9:
14481194 data_block = "Display Color Management Data";
15541300 }
15551301 }
15561302
1303 /*
1304 * The sRGB chromaticities are (x, y):
1305 * red: 0.640, 0.330
1306 * green: 0.300, 0.600
1307 * blue: 0.150, 0.060
1308 * white: 0.3127, 0.3290
1309 */
1310 static const unsigned char srgb_chromaticity[10] = {
1311 0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26, 0x0f, 0x50, 0x54
1312 };
1313
15571314 void edid_state::parse_base_block(const unsigned char *x)
15581315 {
15591316 time_t the_time;
15601317 struct tm *ptm;
1561 int analog, i;
1318 int analog;
15621319 unsigned col_x, col_y;
15631320 bool has_preferred_timing = false;
15641321
17261483 }
17271484
17281485 if (x[0x18] & 0x04) {
1729 /*
1730 * The sRGB chromaticities are (x, y):
1731 * red: 0.640, 0.330
1732 * green: 0.300, 0.600
1733 * blue: 0.150, 0.060
1734 * white: 0.3127, 0.3290
1735 */
1736 static const unsigned char srgb_chromaticity[10] = {
1737 0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26, 0x0f, 0x50, 0x54
1738 };
17391486 printf(" Default (sRGB) color space is primary color space\n");
17401487 if (memcmp(x + 0x19, srgb_chromaticity, sizeof(srgb_chromaticity)))
17411488 fail("sRGB is signaled, but the chromaticities do not match.\n");
1742 }
1489 } else if (!memcmp(x + 0x19, srgb_chromaticity, sizeof(srgb_chromaticity))) {
1490 fail("The chromaticities match sRGB, but sRGB is not signaled.\n");
1491 }
1492
17431493 if (base.edid_minor >= 4) {
17441494 /* 1.4 always has a preferred timing and this bit means something else. */
17451495 has_preferred_timing = true;
17921542 data_block = "Established Timings I & II";
17931543 if (x[0x23] || x[0x24] || x[0x25]) {
17941544 printf(" %s:\n", data_block.c_str());
1795 for (i = 0; i < 17; i++) {
1545 for (unsigned i = 0; i < ARRAY_SIZE(established_timings12); i++) {
17961546 if (x[0x23 + i / 8] & (1 << (7 - i % 8))) {
17971547 unsigned char dmt_id = established_timings12[i].dmt_id;
17981548 const struct timings *t;
18131563 }
18141564 base.has_640x480p60_est_timing = x[0x23] & 0x20;
18151565
1566 /*
1567 * Need to find the Display Range Limit info before reading
1568 * the standard timings.
1569 */
1570 preparse_detailed_block(x + 0x36);
1571 preparse_detailed_block(x + 0x48);
1572 preparse_detailed_block(x + 0x5a);
1573 preparse_detailed_block(x + 0x6c);
1574
18161575 data_block = "Standard Timings";
18171576 bool found = false;
1818 for (i = 0; i < 8; i++) {
1577 for (unsigned i = 0; i < 8; i++) {
18191578 if (x[0x26 + i * 2] != 0x01 || x[0x26 + i * 2 + 1] != 0x01) {
18201579 found = true;
18211580 break;
18231582 }
18241583 if (found) {
18251584 printf(" %s:\n", data_block.c_str());
1826 for (i = 0; i < 8; i++)
1585 for (unsigned i = 0; i < 8; i++)
18271586 print_standard_timing(" ", x[0x26 + i * 2], x[0x26 + i * 2 + 1]);
18281587 } else {
18291588 printf(" %s: none\n", data_block.c_str());
18431602
18441603 for (unsigned i = 0; i < (base.has_spwg ? 2 : 4); i++)
18451604 if (x[0x36 + i * 18] || x[0x37 + i * 18])
1846 cta.preparse_total_dtds++;
1605 cta.preparsed_total_dtds++;
18471606
18481607 data_block = "Detailed Timing Descriptors";
18491608 printf(" %s:\n", data_block.c_str());
18791638 void edid_state::check_base_block()
18801639 {
18811640 data_block = "Base EDID";
1882 if (base.uses_gtf && !base.supports_gtf)
1883 fail("GTF timings are used, but the EDID does not signal GTF support.\n");
1884 if (base.uses_cvt && !base.supports_cvt)
1885 fail("CVT timings are used, but the EDID does not signal CVT support.\n");
1641
18861642 /*
18871643 * Allow for regular rounding of vertical and horizontal frequencies.
18881644 * The spec says that the pixelclock shall be rounded up, so there is
19391695 */
19401696 msg(!out_of_range || base.edid_minor >= 4, "%s", err.c_str());
19411697 }
1698 // The base block will only go up to 255x255 cm for the display size,
1699 // so don't fail if one or more image sizes exceeds that.
1700 if (!base.max_display_width_mm && !base.max_display_height_mm &&
1701 dtd_max_hsize_mm && dtd_max_vsize_mm &&
1702 dtd_max_hsize_mm <= 2559 && dtd_max_vsize_mm <= 2559) {
1703 fail("The DTD image sizes all fit inside 255x255cm, but no display size was set.\n");
1704 }
1705 // Secondary GTF curves start at a specific frequency. Any legacy timings
1706 // that have a positive hsync and negative vsync must be less than that
1707 // frequency to avoid confusion.
1708 if (base.supports_sec_gtf && base.max_pos_neg_hor_freq_khz >= base.sec_gtf_start_freq)
1709 fail("Second GTF start frequency %u is less than the highest P/N frequency %u.\n",
1710 base.sec_gtf_start_freq, base.max_pos_neg_hor_freq_khz);
19421711 if (base.edid_minor == 3 && num_blocks > 2 && !block_map.saw_block_1)
19431712 fail("EDID 1.3 requires a Block Map Extension in Block 1 if there are more than 2 blocks in the EDID.\n");
19441713 if (base.edid_minor == 3 && num_blocks > 128 && !block_map.saw_block_128)
200200 {
201201 if (vic > 0 && vic <= ARRAY_SIZE(edid_cta_modes1))
202202 return edid_cta_modes1 + vic - 1;
203 if (vic >= 193 && vic <= ARRAY_SIZE(edid_cta_modes2) + 193)
203 if (vic >= 193 && vic < ARRAY_SIZE(edid_cta_modes2) + 193)
204204 return edid_cta_modes2 + vic - 193;
205205 return NULL;
206206 }
210210 if (hdmi_vic > 0 && hdmi_vic <= ARRAY_SIZE(edid_hdmi_mode_map))
211211 return find_vic_id(edid_hdmi_mode_map[hdmi_vic - 1]);
212212 return NULL;
213 }
214
215 const struct timings *cta_close_match_to_vic(const timings &t, unsigned &vic)
216 {
217 for (vic = 1; vic <= ARRAY_SIZE(edid_cta_modes1); vic++) {
218 if (timings_close_match(t, edid_cta_modes1[vic - 1]))
219 return &edid_cta_modes1[vic - 1];
220 }
221 for (vic = 193; vic < ARRAY_SIZE(edid_cta_modes2) + 193; vic++) {
222 if (timings_close_match(t, edid_cta_modes1[vic - 193]))
223 return &edid_cta_modes1[vic - 193];
224 }
225 vic = 0;
226 return NULL;
227 }
228
229 void edid_state::cta_list_vics()
230 {
231 char type[16];
232 for (unsigned vic = 1; vic <= ARRAY_SIZE(edid_cta_modes1); vic++) {
233 sprintf(type, "VIC %3u", vic);
234 print_timings("", &edid_cta_modes1[vic - 1], type, "", false, false);
235 }
236 for (unsigned vic = 193; vic < ARRAY_SIZE(edid_cta_modes2) + 193; vic++) {
237 sprintf(type, "VIC %3u", vic);
238 print_timings("", &edid_cta_modes2[vic - 193], type, "", false, false);
239 }
240 }
241
242 void edid_state::cta_list_hdmi_vics()
243 {
244 for (unsigned i = 0; i < ARRAY_SIZE(edid_hdmi_mode_map); i++) {
245 unsigned vic = edid_hdmi_mode_map[i];
246 char type[16];
247
248 sprintf(type, "HDMI VIC %u", i + 1);
249 print_timings("", find_vic_id(vic), type, "", false, false);
250 }
213251 }
214252
215253 static std::string audio_ext_format(unsigned char x)
410448 print_timings(" ", t, type, flags);
411449 }
412450 if (override_pref) {
451 if (!cta.preferred_timings.empty()) {
452 if (match_timings(cta.preferred_timings[0].t, *t))
453 warn("For improved preferred timing interoperability, set 'Native detailed modes' to 1.\n");
454 else
455 warn("VIC %u is the preferred timing, overriding the first detailed timings. Is this intended?\n", vic);
456 }
413457 cta.preferred_timings.insert(cta.preferred_timings.begin(),
414458 timings_ext(*t, type, flags));
415 warn("VIC %u is the preferred timing, overriding the first detailed timings. Is this intended?\n", vic);
416459 } else if (first_svd) {
417460 cta.preferred_timings.push_back(timings_ext(*t, type, flags));
418461 }
532575
533576 } else if (svr >= 129 && svr <= 144) {
534577 sprintf(suffix, "DTD %3u", svr - 128);
535 if (svr >= cta.preparse_total_dtds + 129) {
578 if (svr >= cta.preparsed_total_dtds + 129) {
536579 printf(" %s: Invalid\n", suffix);
537580 fail("Invalid DTD %u.\n", svr - 128);
538581 } else {
541584 }
542585 } else if (svr >= 145 && svr <= 160) {
543586 sprintf(suffix, "VTDB %3u", svr - 144);
544 if (svr >= cta.preparse_total_vtdbs + 145) {
587 if (svr >= cta.preparsed_total_vtdbs + 145) {
545588 printf(" %s: Invalid\n", suffix);
546589 fail("Invalid VTDB %u.\n", svr - 144);
547590 } else {
550593 }
551594 } else if (svr == 254) {
552595 sprintf(suffix, "T8VTDB");
553 if (!cta.preparse_has_t8vtdb) {
596 if (!cta.preparsed_has_t8vtdb) {
554597 printf(" %s: Invalid\n", suffix);
555598 fail("Invalid T8VTDB.\n");
556599 } else {
561604 }
562605 }
563606
564 static std::string hdmi_latency(unsigned char l, bool is_video)
607 static std::string hdmi_latency2s(unsigned char l, bool is_video)
565608 {
566609 if (!l)
567610 return "Unknown";
570613 return std::to_string(1 + 2 * l) + " ms";
571614 }
572615
616 void edid_state::hdmi_latency(unsigned char vid_lat, unsigned char aud_lat,
617 bool is_ilaced)
618 {
619 const char *vid = is_ilaced ? "Interlaced video" : "Video";
620 const char *aud = is_ilaced ? "Interlaced audio" : "Audio";
621
622 printf(" %s latency: %s\n", vid, hdmi_latency2s(vid_lat, true).c_str());
623 printf(" %s latency: %s\n", aud, hdmi_latency2s(aud_lat, false).c_str());
624
625 if (vid_lat > 251 && vid_lat != 0xff)
626 fail("Invalid %s latency value %u.\n", vid, vid_lat);
627 if (aud_lat > 251 && aud_lat != 0xff)
628 fail("Invalid %s latency value %u.\n", aud, aud_lat);
629
630 if (!vid_lat || vid_lat > 251)
631 return;
632 if (!aud_lat || aud_lat > 251)
633 return;
634
635 unsigned vid_ms = 1 + 2 * vid_lat;
636 unsigned aud_ms = 1 + 2 * aud_lat;
637
638 // HDMI 2.0 latency checks for devices without HDMI output
639 if (aud_ms < vid_ms)
640 warn("%s latency < %s latency (%u ms < %u ms). This is discouraged for devices without HDMI output.\n",
641 aud, vid, aud_ms, vid_ms);
642 else if (vid_ms + 20 < aud_ms)
643 warn("%s latency + 20 < %s latency (%u + 20 ms < %u ms). This is forbidden for devices without HDMI output.\n",
644 vid, aud, vid_ms, aud_ms);
645 else if (vid_ms < aud_ms)
646 warn("%s latency < %s latency (%u ms < %u ms). This is discouraged for devices without HDMI output.\n",
647 vid, aud, vid_ms, aud_ms);
648 }
649
573650 void edid_state::cta_hdmi_block(const unsigned char *x, unsigned length)
574651 {
575652 unsigned len_vic, len_3d;
578655 fail("Empty Data Block with length %u.\n", length);
579656 return;
580657 }
581 printf(" Source physical address: %u.%u.%u.%u\n", x[3] >> 4, x[3] & 0x0f,
658 printf(" Source physical address: %x.%x.%x.%x\n", x[3] >> 4, x[3] & 0x0f,
582659 x[4] >> 4, x[4] & 0x0f);
583660
584661 if (length < 6)
622699
623700 unsigned b = 8;
624701 if (x[7] & 0x80) {
625 printf(" Video latency: %s\n", hdmi_latency(x[b], true).c_str());
626 printf(" Audio latency: %s\n", hdmi_latency(x[b + 1], false).c_str());
702 hdmi_latency(x[b], x[b + 1], false);
703
704 if (x[7] & 0x40) {
705 if (x[b] == x[b + 2] &&
706 x[b + 1] == x[b + 3])
707 warn("Progressive and Interlaced latency values are identical, no need for both.\n");
708 b += 2;
709 hdmi_latency(x[b], x[b + 1], true);
710 }
627711 b += 2;
628
629 if (x[7] & 0x40) {
630 printf(" Interlaced video latency: %s\n", hdmi_latency(x[b], true).c_str());
631 printf(" Interlaced audio latency: %s\n", hdmi_latency(x[b + 1], false).c_str());
632 b += 2;
633 }
634712 }
635713
636714 if (!(x[7] & 0x20))
842920 static void cta_hf_scdb(const unsigned char *x, unsigned length)
843921 {
844922 unsigned rate = x[1] * 5;
923 unsigned v;
845924
846925 printf(" Version: %u\n", x[0]);
847926 if (rate) {
906985 if (length <= 5)
907986 return;
908987
909 printf(" VRRmin: %d Hz\n", x[5] & 0x3f);
910 printf(" VRRmax: %d Hz\n", (x[5] & 0xc0) << 2 | x[6]);
988 v = x[5] & 0x3f;
989 if (v) {
990 printf(" VRRmin: %u Hz\n", v);
991 if (v > 48)
992 fail("VRRmin > 48.\n");
993 }
994 v = (x[5] & 0xc0) << 2 | x[6];
995 if (v) {
996 printf(" VRRmax: %u Hz\n", v);
997 if (!(x[5] & 0x3f))
998 fail("VRRmin == 0, but VRRmax isn't.\n");
999 else if (v < 100)
1000 fail("VRRmax < 100.\n");
1001 }
9111002
9121003 if (length <= 7)
9131004 return;
9491040 if (x[9] & 0x3f)
9501041 printf(" Maximum number of bytes in a line of chunks: %u\n",
9511042 1024 * (1 + (x[9] & 0x3f)));
1043 }
1044
1045 static void cta_amd(const unsigned char *x, unsigned length)
1046 {
1047 // These Freesync values are reversed engineered by looking
1048 // at existing EDIDs.
1049 printf(" Version: %u.%u\n", x[0], x[1]);
1050 printf(" Minimum Refresh Rate: %u Hz\n", x[2]);
1051 printf(" Maximum Refresh Rate: %u Hz\n", x[3]);
1052 // Freesync 1.x flags
1053 // One or more of the 0xe6 bits signal that the VESA MCCS
1054 // protocol is used to switch the Freesync range
1055 printf(" Flags 1.x: 0x%02x%s\n", x[4],
1056 (x[4] & 0xe6) ? " (MCCS)" : "");
1057 if (length >= 10) {
1058 // Freesync 2.x flags
1059 // Bit 2 no doubt indicates if the monitor supports Local Dimming
1060 // There are probably also bits to signal support of the
1061 // FreeSync2_scRGB and FreeSync2_Gamma22 HDR display modes.
1062 // I suspect bits 0 and 1.
1063 printf(" Flags 2.x: 0x%02x\n", x[5]);
1064 // The AMD tone mapping tutorial referred to in the URL below
1065 // mentions that the Freesync HDR info reports max/min
1066 // luminance of the monitor with and without local dimming.
1067 //
1068 // https://gpuopen.com/learn/using-amd-freesync-premium-pro-hdr-code-samples/
1069 //
1070 // So I assume that the first two luminance values are
1071 // the max/min luminance of the display and the next two
1072 // luminance values are the max/min luminance values when
1073 // local dimming is disabled. The values I get seem to
1074 // support that.
1075 printf(" Maximum luminance: %u (%.3f cd/m^2)\n",
1076 x[6], 50.0 * pow(2, x[6] / 32.0));
1077 printf(" Minimum luminance: %u (%.3f cd/m^2)\n",
1078 x[7], (50.0 * pow(2, x[6] / 32.0)) * pow(x[7] / 255.0, 2) / 100.0);
1079 if (x[5] & 4) {
1080 // One or both bytes can be 0. The meaning of that
1081 // is unknown.
1082 printf(" Maximum luminance (without local dimming): %u (%.3f cd/m^2)\n",
1083 x[8], 50.0 * pow(2, x[8] / 32.0));
1084 printf(" Minimum luminance (without local dimming): %u (%.3f cd/m^2)\n",
1085 x[9], (50.0 * pow(2, x[8] / 32.0)) * pow(x[9] / 255.0, 2) / 100.0);
1086 } else {
1087 // These bytes are always 0x08 0x2f. If these values
1088 // represent max/min luminance as well, then these
1089 // would map to 59.460 and 0.020 cd/m^2 respectively.
1090 // I wonder if this somehow relates to SDR.
1091 printf(" Unknown: 0x%02x 0x%02x\n", x[8], x[9]);
1092 }
1093 }
1094 }
1095
1096 static std::string display_use_case(unsigned char x)
1097 {
1098 switch (x) {
1099 case 1: return "Test equipment";
1100 case 2: return "Generic display";
1101 case 3: return "Television display";
1102 case 4: return "Desktop productivity display";
1103 case 5: return "Desktop gaming display";
1104 case 6: return "Presentation display";
1105 case 7: return "Virtual reality headset";
1106 case 8: return "Augmented reality";
1107 case 16: return "Video wall display";
1108 case 17: return "Medical imaging display";
1109 case 18: return "Dedicated gaming display";
1110 case 19: return "Dedicated video monitor display";
1111 case 20: return "Accessory display";
1112 default: break;
1113 }
1114 fail("Unknown Display product primary use case 0x%02x.\n", x);
1115 return std::string("Unknown display use case (") + utohex(x) + ")";
1116 }
1117
1118 static void cta_microsoft(const unsigned char *x, unsigned length)
1119 {
1120 // This VSDB is documented at:
1121 // https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors-edid-extension
1122 printf(" Version: %u\n", x[0]);
1123 if (x[0] > 2) {
1124 // In version 1 and 2 these bits should always be set to 0.
1125 printf(" Desktop Usage: %u\n", (x[1] >> 6) & 1);
1126 printf(" Third-Party Usage: %u\n", (x[1] >> 5) & 1);
1127 }
1128 printf(" Display Product Primary Use Case: %u (%s)\n", x[1] & 0x1f,
1129 display_use_case(x[1] & 0x1f).c_str());
1130 printf(" Container ID: %s\n", containerid2s(x + 2).c_str());
9521131 }
9531132
9541133 static void cta_hdr10plus(const unsigned char *x, unsigned length)
13311510 return s / 64.0;
13321511 }
13331512
1334 static void cta_rcdb(const unsigned char *x, unsigned length)
1513 void edid_state::cta_rcdb(const unsigned char *x, unsigned length)
13351514 {
13361515 unsigned spm = ((x[3] << 16) | (x[2] << 8) | x[1]);
13371516 unsigned i;
13411520 return;
13421521 }
13431522
1344 if (x[0] & 0x40)
1523 if ((x[0] & 0x20) && !cta.has_sldb)
1524 fail("'SLD' flag is 1, but no Speaker Location Data Block is found.\n");
1525 else if (!(x[0] & 0x20) && cta.has_sldb)
1526 fail("'SLD' flag is 0, but a Speaker Location Data Block is present.\n");
1527
1528 if (x[0] & 0x40) {
13451529 printf(" Speaker count: %u\n", (x[0] & 0x1f) + 1);
1530 } else {
1531 if (x[0] & 0x1f)
1532 fail("'Speaker' flag is 0, but 'Speaker Count' is != 0.\n");
1533 if (x[0] & 0x20)
1534 fail("'SLD' flag is 1, but 'Speaker' is 0.\n");
1535 }
13461536
13471537 printf(" Speaker Presence Mask:\n");
13481538 for (i = 0; i < ARRAY_SIZE(speaker_map); i++) {
13491539 if ((spm >> i) & 1)
13501540 printf(" %s\n", speaker_map[i]);
13511541 }
1542
13521543 if ((x[0] & 0xa0) == 0x80)
13531544 fail("'Display' flag set, but not the 'SLD' flag.\n");
1354 if ((x[0] & 0x20) && length >= 7) {
1545
1546 bool valid_max = cta.preparsed_sld_has_coord || (x[0] & 0x80);
1547
1548 if (valid_max && length >= 7) {
13551549 printf(" Xmax: %u dm\n", x[4]);
13561550 printf(" Ymax: %u dm\n", x[5]);
13571551 printf(" Zmax: %u dm\n", x[6]);
1552 } else if (!valid_max && length >= 7) {
1553 // The RCDB should have been truncated.
1554 warn("'Display' flag is 0 and 'Coord' is 0 for all SLDs, but the Max coordinates are still present.\n");
13581555 }
13591556 if ((x[0] & 0x80) && length >= 10) {
13601557 printf(" DisplayX: %.3f * Xmax\n", decode_uchar_as_double(x[7]));
13611558 printf(" DisplayY: %.3f * Ymax\n", decode_uchar_as_double(x[8]));
13621559 printf(" DisplayZ: %.3f * Zmax\n", decode_uchar_as_double(x[9]));
1560 } else if (!(x[0] & 0x80) && length >= 10) {
1561 // The RCDB should have been truncated.
1562 warn("'Display' flag is 0, but the Display coordinates are still present.\n");
13631563 }
13641564 }
13651565
13941594 "RS - Right Surround",
13951595 };
13961596
1397 static void cta_sldb(const unsigned char *x, unsigned length)
1597 void edid_state::cta_sldb(const unsigned char *x, unsigned length)
13981598 {
13991599 if (length < 2) {
14001600 fail("Empty Data Block with length %u.\n", length);
14011601 return;
14021602 }
1603
1604 unsigned active_cnt = 0;
1605 unsigned channel_is_active = 0;
1606
14031607 while (length >= 2) {
14041608 printf(" Channel: %u (%sactive)\n", x[0] & 0x1f,
14051609 (x[0] & 0x20) ? "" : "not ");
1610 if (x[0] & 0x20) {
1611 if (channel_is_active & (1U << (x[0] & 0x1f)))
1612 fail("Channel Index %u was already marked 'Active'.\n",
1613 x[0] & 0x1f);
1614 channel_is_active |= 1U << (x[0] & 0x1f);
1615 active_cnt++;
1616 }
14061617 if ((x[1] & 0x1f) < ARRAY_SIZE(speaker_location))
14071618 printf(" Speaker: %s\n", speaker_location[x[1] & 0x1f]);
14081619 if (length >= 5 && (x[0] & 0x40)) {
14131624 x += 3;
14141625 }
14151626
1627 length -= 2;
1628 x += 2;
1629 }
1630 if (active_cnt != cta.preparsed_speaker_count)
1631 fail("There are %u active speakers, but 'Speaker Count' is %u.\n",
1632 active_cnt, cta.preparsed_speaker_count);
1633 }
1634
1635 void edid_state::cta_preparse_sldb(const unsigned char *x, unsigned length)
1636 {
1637 cta.has_sldb = true;
1638 while (length >= 2) {
1639 if (length >= 5 && (x[0] & 0x40)) {
1640 cta.preparsed_sld_has_coord = true;
1641 return;
1642 }
14161643 length -= 2;
14171644 x += 2;
14181645 }
14371664 * follow the default rules with respect to RGB Quantization Range
14381665 * handling.
14391666 *
1440 * The HDMI 2.0 spec recommends that this is set, but it is a good
1441 * recommendation in general, not just for HDMI.
1667 * Starting with the CTA-861-H spec this bit is now required to be
1668 * 1 for new designs.
14421669 */
14431670 if (!(d & 0x40))
1444 warn("Set Selectable RGB Quantization to avoid interop issues.\n");
1671 fail("Set Selectable RGB Quantization to avoid interop issues.\n");
14451672 /*
1446 * HDMI 2.0 recommends that the Selectable YCbCr Quantization bit is set
1447 * as well, but in practice this is less of an interop issue.
1673 * Since most YCbCr formats use limited range, the interop issues are
1674 * less noticable than for RGB formats.
14481675 *
1449 * I decided to not warn about this (for now).
1450 *
1451 * if (!(d & 0x80))
1452 * warn("Set Selectable YCbCr Quantization to avoid interop issues.\n");
1676 * Starting with the CTA-861-H spec this bit is now required to be
1677 * 1 for new designs, but just warn about it (for now).
14531678 */
1679 if ((cta.byte3 & 0x30) && !(d & 0x80))
1680 warn("Set Selectable YCbCr Quantization to avoid interop issues.\n");
1681
1682 unsigned char s_pt = (d >> 4) & 0x03;
1683 unsigned char s_it = (d >> 2) & 0x03;
1684 unsigned char s_ce = d & 0x03;
1685
14541686 printf(" PT scan behavior: ");
1455 switch ((d >> 4) & 0x03) {
1687 switch (s_pt) {
14561688 case 0: printf("No Data\n"); break;
14571689 case 1: printf("Always Overscanned\n"); break;
14581690 case 2: printf("Always Underscanned\n"); break;
14591691 case 3: printf("Supports both over- and underscan\n"); break;
14601692 }
14611693 printf(" IT scan behavior: ");
1462 switch ((d >> 2) & 0x03) {
1694 switch (s_it) {
14631695 case 0: printf("IT video formats not supported\n"); break;
14641696 case 1:
14651697 printf("Always Overscanned\n");
14751707 break;
14761708 case 3: printf("Supports both over- and underscan\n"); break;
14771709 }
1478 if (((d >> 2) & 0x03) < 2)
1710 if (s_it < 2)
14791711 warn("IT scan behavior is expected to support underscanned.\n");
14801712 printf(" CE scan behavior: ");
1481 switch (d & 0x03) {
1713 switch (s_ce) {
14821714 case 0: printf("CE video formats not supported\n"); break;
14831715 case 1: printf("Always Overscanned\n"); break;
14841716 case 2: printf("Always Underscanned\n"); break;
14851717 case 3: printf("Supports both over- and underscan\n"); break;
14861718 }
1487 if ((d & 0x03) == 0)
1719 if (s_ce == 0)
14881720 warn("'CE video formats not supported' makes no sense.\n");
1721 else if (s_pt == s_it && s_pt == s_ce)
1722 warn("S_PT is equal to S_IT and S_CE, so should be set to 0 instead.\n");
14891723 }
14901724
14911725 static const char *colorimetry_map[] = {
16861920 x++;
16871921 length--;
16881922 for (unsigned i = 0; i < length / sz; i++)
1689 parse_displayid_type_10_timing(x + i * sz, true);
1923 parse_displayid_type_10_timing(x + i * sz, sz, true);
16901924 }
16911925
16921926 static void cta_hdmi_audio_block(const unsigned char *x, unsigned length)
17551989 }
17561990 }
17571991
1758 void edid_state::cta_ext_block(const unsigned char *x, unsigned length)
1992 void edid_state::cta_ext_block(const unsigned char *x, unsigned length,
1993 bool duplicate)
17591994 {
17601995 const char *name;
17611996 unsigned oui;
18052040 return;
18062041 }
18072042
2043 switch (x[0]) {
2044 case 0x00:
2045 case 0x02:
2046 case 0x05:
2047 case 0x06:
2048 case 0x0d:
2049 case 0x0f:
2050 case 0x12:
2051 case 0x13:
2052 case 0x78:
2053 case 0x79:
2054 if (duplicate)
2055 fail("Only one instance of this Data Block is allowed.\n");
2056 break;
2057 }
2058
2059
18082060 // See Table 52 of CTA-861-G for a description of Byte 3
18092061 if (audio_block && !(cta.byte3 & 0x40))
18102062 fail("audio information is present, but bit 6 of Byte 3 of the CTA-861 Extension header indicates no Basic Audio support.\n");
19182170 hex_block(" ", x + 1, length);
19192171 }
19202172
1921 void edid_state::cta_block(const unsigned char *x)
2173 void edid_state::cta_block(const unsigned char *x, bool duplicate)
19222174 {
19232175 unsigned length = x[0] & 0x1f;
19242176 const char *name;
19792231 cta.have_hf_vsdb = 1;
19802232 break;
19812233 }
2234 if (oui == 0x00001a) {
2235 cta_amd(x + 4, length - 3);
2236 break;
2237 }
2238 if (oui == 0xca125c && length == 0x15) {
2239 cta_microsoft(x + 4, length - 3);
2240 break;
2241 }
19822242 hex_block(" ", x + 4, length - 3);
19832243 break;
19842244 case 0x04:
19862246 printf(" %s:\n", data_block.c_str());
19872247 cta_sadb(x + 1, length);
19882248 audio_block = true;
2249 if (duplicate)
2250 fail("Only one instance of this Data Block is allowed.\n");
19892251 break;
19902252 case 0x05:
19912253 data_block = "VESA Display Transfer Characteristics Data Block";
19922254 printf(" %s:\n", data_block.c_str());
19932255 cta_vesa_dtcdb(x + 1, length);
2256 if (duplicate)
2257 fail("Only one instance of this Data Block is allowed.\n");
19942258 break;
19952259 case 0x07:
1996 cta_ext_block(x + 1, length - 1);
2260 cta_ext_block(x + 1, length - 1, duplicate);
19972261 break;
19982262 default: {
19992263 unsigned tag = (*x & 0xe0) >> 5;
20262290 if (memchk(detailed, 18))
20272291 break;
20282292 if (detailed[0] || detailed[1])
2029 cta.preparse_total_dtds++;
2293 cta.preparsed_total_dtds++;
20302294 }
20312295 }
20322296
20482312 case 0x07:
20492313 if (x[i + 1] == 0x0d)
20502314 cta.has_vfpdb = true;
2315 if (x[i + 1] == 0x13 && (x[i + 2] & 0x40)) {
2316 cta.preparsed_speaker_count = 1 + (x[i + 2] & 0x1f);
2317 cta.preparsed_sld = x[i + 2] & 0x20;
2318 }
2319 if (x[i + 1] == 0x14)
2320 cta_preparse_sldb(x + i + 2, (x[i] & 0x1f) - 1);
20512321 if (x[i + 1] == 0x22)
2052 cta.preparse_total_vtdbs++;
2322 cta.preparsed_total_vtdbs++;
20532323 if (x[i + 1] == 0x23)
2054 cta.preparse_has_t8vtdb = true;
2324 cta.preparsed_has_t8vtdb = true;
20552325 if (x[i + 1] == 0x32)
2056 cta.preparse_total_vtdbs +=
2326 cta.preparsed_total_vtdbs +=
20572327 ((x[i] & 0x1f) - 2) / (6 + ((x[i + 2] & 0x70) >> 4));
20582328 if (x[i + 1] != 0x0e)
20592329 continue;
21312401 cta.native_timings.clear();
21322402 if (!native_dtds && !cta.has_vfpdb) {
21332403 cta.first_svd_might_be_preferred = true;
2134 } else if (native_dtds > cta.preparse_total_dtds) {
2404 } else if (native_dtds > cta.preparsed_total_dtds) {
21352405 fail("There are more Native DTDs (%u) than DTDs (%u).\n",
2136 native_dtds, cta.preparse_total_dtds);
2406 native_dtds, cta.preparsed_total_dtds);
21372407 }
2138 if (native_dtds > cta.preparse_total_dtds)
2139 native_dtds = cta.preparse_total_dtds;
2408 if (native_dtds > cta.preparsed_total_dtds)
2409 native_dtds = cta.preparsed_total_dtds;
21402410 for (unsigned i = 0; i < native_dtds; i++) {
21412411 char type[16];
21422412
21502420 if (version >= 3) {
21512421 unsigned i;
21522422
2153 for (i = 4; i < offset; i += (x[i] & 0x1f) + 1)
2154 cta_block(x + i);
2423 for (i = 4; i < offset; i += (x[i] & 0x1f) + 1) {
2424 unsigned tag = (x[i] & 0xe0) << 3;
2425
2426 if (tag == 0x700)
2427 tag |= x[i + 1];
2428 bool duplicate = cta.found_tags.find(tag) != cta.found_tags.end();
2429
2430 cta_block(x + i, duplicate);
2431 if (!duplicate)
2432 cta.found_tags.insert(tag);
2433 }
21552434
21562435 data_block.clear();
21572436 if (i != offset)
21862465 cta.supported_hdmi_vic_codes)
21872466 fail("HDMI VIC Codes must have their CTA-861 VIC equivalents in the VSB.\n");
21882467 if (!cta.has_vcdb)
2189 warn("Missing VCDB, needed for Set Selectable RGB Quantization to avoid interop issues.\n");
2468 fail("Missing VCDB, needed for Set Selectable RGB Quantization to avoid interop issues.\n");
21902469 }
21912470
21922471 void edid_state::cta_resolve_svr(vec_timings_ext::iterator iter)
22972576 warn("Native interlaced resolution of %ux%u is smaller than the max preferred interlaced resolution %ux%u.\n",
22982577 native_ilace_hact, native_ilace_vact,
22992578 max_pref_ilace_hact, max_pref_ilace_vact);
2300 }
2579
2580 if (dispid.native_width && native_prog_hact &&
2581 !native_prog_mixed_resolutions) {
2582 if (dispid.native_width != native_prog_hact ||
2583 dispid.native_height != native_prog_vact)
2584 fail("Mismatch between CTA-861 and DisplayID native progressive resolution.\n");
2585 }
2586 }
192192 printf(" Uses %u CIE (x, y) coordinates\n", cie_year);
193193 if (xfer_id) {
194194 printf(" Associated with Transfer Characteristics Data Block with Identifier %u\n", xfer_id);
195 if (!(dispid.preparse_xfer_ids & (1 << xfer_id)))
195 if (!(dispid.preparsed_xfer_ids & (1 << xfer_id)))
196196 fail("Missing Transfer Characteristics Data Block with Identifier %u.\n", xfer_id);
197197 }
198198 if (!num_primaries) {
204204 for (unsigned i = 0; i < num_primaries; i++) {
205205 unsigned idx = offset + 3 * i;
206206
207 printf(" Primary #%u: (%.6f, %.6f)\n", i,
207 printf(" Primary #%u: (%.4f, %.4f)\n", i,
208208 fp2d(x[idx] | ((x[idx + 1] & 0x0f) << 8)),
209209 fp2d(((x[idx + 1] & 0xf0) >> 4) | (x[idx + 2] << 4)));
210210 }
212212 for (unsigned i = 0; i < num_whitepoints; i++) {
213213 unsigned idx = offset + 3 * i;
214214
215 printf(" White point #%u: (%.6f, %.6f)\n", i,
215 printf(" White point #%u: (%.4f, %.4f)\n", i,
216216 fp2d(x[idx] | ((x[idx + 1] & 0x0f) << 8)),
217217 fp2d(((x[idx + 1] & 0xf0) >> 4) | (x[idx + 2] << 4)));
218218 }
335335 unsigned vtot = t.vact + t.vfp + t.vsync + t.vbp;
336336 unsigned refresh = (t.pixclk_khz * 1000ULL) / (htot * vtot);
337337
338 for (unsigned rb = 0; rb <= 3; rb++) {
339 timings cvt_t = calc_cvt_mode(refresh, t.hact, t.vact, rb);
338 for (unsigned rb = RB_NONE; rb <= RB_CVT_V3; rb++) {
339 timings cvt_t = calc_cvt_mode(t.hact, t.vact, refresh, rb);
340340 if (match_timings(t, cvt_t)) {
341341 fail("This T7VTDB can be represented as a T10VTDB.\n");
342342 return;
343343 }
344344 }
345 timings cvt_t = calc_cvt_mode(refresh, t.hact, t.vact, 3 | RB_FLAG);
345 timings cvt_t = calc_cvt_mode(t.hact, t.vact, refresh, RB_CVT_V3,
346 false, false, true);
346347 if (match_timings(t, cvt_t))
347348 fail("This T7VTDB can be represented as a T10VTDB.\n");
348349 }
460461 break;
461462 }
462463
463 t.rb = ((x[0] & 0x70) >> 4) == 1;
464 t.rb = ((x[0] & 0x70) >> 4) == 1 ? RB_CVT_V1 : RB_NONE;
464465 t.hact = 8 + 8 * x[1];
465466 t.vact = t.hact * t.vratio / t.hratio;
466467
504505 if (!check_displayid_datablock_length(x, 15, 15))
505506 return;
506507 printf(" Pixel Clock: %.3f-%.3f MHz\n",
507 (double)(x[3] | (x[4] << 8) | (x[5] << 16)) / 100.0,
508 (double)(x[6] | (x[7] << 8) | (x[8] << 16)) / 100.0);
508 (double)((x[3] | (x[4] << 8) | (x[5] << 16)) + 1) / 100.0,
509 (double)((x[6] | (x[7] << 8) | (x[8] << 16)) + 1) / 100.0);
509510 printf(" Horizontal Frequency: %u-%u kHz\n", x[9], x[10]);
510511 printf(" Minimum Horizontal Blanking: %u pixels\n", x[11] | (x[12] << 8));
511512 printf(" Vertical Refresh: %u-%u Hz\n", x[13], x[14]);
589590 printf(" The backlight may be switched on and off\n");
590591 if (x[4] & 0x04)
591592 printf(" The backlight's intensity can be controlled\n");
592 printf(" Display native pixel format: %ux%u\n",
593 x[5] | (x[6] << 8), x[7] | (x[8] << 8));
593 unsigned w = x[5] | (x[6] << 8);
594 unsigned h = x[7] | (x[8] << 8);
595 if (w && h) {
596 printf(" Display native pixel format: %ux%u\n", w + 1, h + 1);
597 dispid.native_width = w + 1;
598 dispid.native_height = h + 1;
599 } else if (w || h) {
600 fail("Invalid Native Pixel Format %ux%u.\n", w, h);
601 }
594602 printf(" Aspect ratio and orientation:\n");
595603 printf(" Aspect Ratio: %.2f\n", (100 + x[9]) / 100.0);
596604 unsigned char v = x[0x0a];
658666 if (!check_displayid_datablock_length(x, 6, 6))
659667 return;
660668
661 printf(" Power Sequence T1: %.1f-%u.0 ms\n", (x[3] >> 4) / 10.0, (x[3] & 0xf) * 2);
662 printf(" Power Sequence T2: 0.0-%u.0 ms\n", (x[4] & 0x3f) * 2);
663 printf(" Power Sequence T3: 0.0-%u.0 ms\n", (x[5] & 0x3f) * 2);
664 printf(" Power Sequence T4: 0.0-%u.0 ms\n", (x[6] & 0x7f) * 10);
665 printf(" Power Sequence T5: 0.0-%u.0 ms\n", (x[7] & 0x3f) * 10);
666 printf(" Power Sequence T6: 0.0-%u.0 ms\n", (x[8] & 0x3f) * 10);
669 printf(" Power Sequence T1 Range: %.1f-%u.0 ms\n", (x[3] >> 4) / 10.0, (x[3] & 0xf) * 2);
670 printf(" Power Sequence T2 Range: 0.0-%u.0 ms\n", (x[4] & 0x3f) * 2);
671 printf(" Power Sequence T3 Range: 0.0-%u.0 ms\n", (x[5] & 0x3f) * 2);
672 printf(" Power Sequence T4 Min: %u.0 ms\n", (x[6] & 0x7f) * 10);
673 printf(" Power Sequence T5 Min: %u.0 ms\n", (x[7] & 0x3f) * 10);
674 printf(" Power Sequence T6 Min: %u.0 ms\n", (x[8] & 0x3f) * 10);
667675 }
668676
669677 // tag 0x0e
678686
679687 if (xfer_id) {
680688 printf(" Transfer Characteristics Data Block Identifier: %u\n", xfer_id);
681 if (!(dispid.preparse_color_ids & (1 << xfer_id)))
689 if (!(dispid.preparsed_color_ids & (1 << xfer_id)))
682690 fail("Missing Color Characteristics Data Block using Identifier %u.\n", xfer_id);
683691 }
684692 if (first_is_white)
697705 i - first_is_white);
698706 unsigned samples = x[offset];
699707 if (four_param) {
708 if (samples != 5)
709 fail("Expected 5 samples.\n");
700710 printf(" A0=%u A1=%u A2=%u A3=%u Gamma=%.2f\n",
701711 x[offset + 1], x[offset + 2], x[offset + 3], x[offset + 4],
702712 (double)(x[offset + 5] + 100.0) / 100.0);
703713 samples++;
704714 } else {
705 for (unsigned j = offset + 1; j < offset + samples; j++)
706 printf(" %3u", x[j]);
707 printf(" 255\n");
715 double sum = 0;
716
717 // The spec is not very clear about the number of samples:
718 // should this be interpreted as the actual number of
719 // samples stored in this Data Block, or as the number of
720 // samples in the curve, but where the last sample is not
721 // actually stored since it is always 0x3ff.
722 //
723 // The ATP Manager interprets this as the latter, so that's
724 // what we implement here.
725 for (unsigned j = offset + 1; j < offset + samples; j++) {
726 sum += x[j];
727 printf(" %.2f", sum * 100.0 / 1023.0);
728 }
729 printf(" 100.00\n");
708730 }
709731 offset += samples;
710732 len -= samples;
917939 if (x[0] & 0x10)
918940 s += ", refresh rate * (1000/1001) supported";
919941
920 t.rb = 2;
942 t.rb = RB_CVT_V2;
921943 if ((x[0] & 0x03) == 1)
922944 warn("Unexpected use of 'custom reduced blanking'.\n");
923945 else if ((x[0] & 0x03) > 1)
10831105
10841106 // tag 0x21
10851107
1086 void edid_state::parse_displayid_parameters_v2(const unsigned char *x)
1087 {
1088 check_displayid_datablock_revision(x[1]);
1089
1108 void edid_state::parse_displayid_parameters_v2(const unsigned char *x,
1109 unsigned block_rev)
1110 {
10901111 if (!check_displayid_datablock_length(x, 29, 29))
10911112 return;
10921113
11001121 else
11011122 printf(" Image size: %.1f mm x %.1f mm\n",
11021123 hor_size / 10.0, vert_size / 10.0);
1103 printf(" Pixels: %d x %d\n",
1104 (x[8] << 8) + x[7], (x[10] << 8) + x[9]);
1124 unsigned w = (x[8] << 8) + x[7];
1125 unsigned h = (x[10] << 8) + x[9];
1126 if (w && h) {
1127 printf(" Native Format: %ux%u\n", w, h);
1128 dispid.native_width = w;
1129 dispid.native_height = h;
1130 } else if (w || h) {
1131 fail("Invalid Native Format %ux%u.\n", w, h);
1132 }
11051133 unsigned char v = x[11];
11061134 printf(" Scan Orientation: ");
11071135 switch (v & 0x07) {
11441172 printf(" Native Minimum Luminance: %s\n",
11451173 ieee7542d(x[0x1c] | (x[0x1d] << 8)).c_str());
11461174 printf(" Native Color Depth: ");
1147 if (bpc444[x[0x1e] & 0x07])
1175 if (!(x[0x1e] & 0x07))
1176 printf("Not defined\n");
1177 else if (bpc444[x[0x1e] & 0x07])
11481178 printf("%s bpc\n", bpc444[x[0x1e] & 0x07]);
11491179 else
11501180 printf("Reserved\n");
11551185 case 0x02: printf("Organic LED\n"); break;
11561186 default: printf("Reserved\n"); break;
11571187 }
1188 if (block_rev)
1189 printf(" Display Device Theme Preference: %s\n",
1190 (x[0x1e] & 0x80) ? "Dark Theme Preferred" : "No Preference");
11581191 if (x[0x1f] != 0xff)
11591192 printf(" Native Gamma EOTF: %.2f\n",
11601193 (100 + x[0x1f]) / 100.0);
11901223 s += ", refresh rate * (1000/1001) supported";
11911224
11921225 switch (x[0] & 0x07) {
1193 case 1: t.rb = 1; break;
1194 case 2: t.rb = 2; break;
1226 case 1: t.rb = RB_CVT_V1; break;
1227 case 2: t.rb = RB_CVT_V2; break;
11951228 default: break;
11961229 }
11971230
13261359
13271360 if (check_displayid_datablock_length(x, 16, 16)) {
13281361 x += 3;
1329 printf(" %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
1330 x[0], x[1], x[2], x[3],
1331 x[4], x[5],
1332 x[6], x[7],
1333 x[8], x[9],
1334 x[10], x[11], x[12], x[13], x[14], x[15]);
1362 printf(" Container ID: %s\n", containerid2s(x).c_str());
13351363 }
13361364 }
13371365
13381366 // tag 0x32
13391367
1340 void edid_state::parse_displayid_type_10_timing(const unsigned char *x, bool is_cta)
1368 void edid_state::parse_displayid_type_10_timing(const unsigned char *x,
1369 unsigned sz, bool is_cta)
13411370 {
13421371 struct timings t = {};
13431372 std::string s("aspect ");
13641393 }
13651394
13661395 switch (x[0] & 0x07) {
1367 case 1: t.rb = 1; break;
1368 case 2: t.rb = 2; break;
1369 case 3: t.rb = 3; break;
1396 case 1: t.rb = RB_CVT_V1; break;
1397 case 2: t.rb = RB_CVT_V2; break;
1398 case 3: t.rb = RB_CVT_V3; break;
13701399 default: break;
13711400 }
13721401
1402 unsigned rb = t.rb;
1403 unsigned rb_h_blank = rb == RB_CVT_V3 ? 80 : 0;
1404
13731405 if (x[0] & 0x10) {
1374 if (t.rb == 2) {
1406 if (rb == RB_CVT_V2) {
13751407 s += ", refresh rate * (1000/1001) supported";
1376 } else if (t.rb == 3) {
1408 t.rb |= RB_ALT;
1409 } else if (rb == RB_CVT_V3) {
13771410 s += ", hblank is 160 pixels";
1378 t.rb |= RB_FLAG;
1411 t.rb |= RB_ALT;
1412 rb_h_blank = 160;
13791413 } else {
13801414 fail("VR_HB must be 0.\n");
13811415 }
13831417 if (x[0] & 0x80)
13841418 s += ", YCbCr 4:2:0";
13851419
1386 edid_cvt_mode(1 + x[5], t);
1420 unsigned refresh = 1 + x[5] + (sz == 6 ? 0 : ((x[6] & 3) << 8));
1421 double add_vert_time = 0;
1422
1423 if (sz > 6 && rb == RB_CVT_V3) {
1424 unsigned delta_hblank = (x[6] >> 2) & 7;
1425
1426 if (rb_h_blank == 80)
1427 rb_h_blank = 80 + 8 * delta_hblank;
1428 else if (delta_hblank <= 5)
1429 rb_h_blank = 160 + 8 * delta_hblank;
1430 else
1431 rb_h_blank = 160 - (delta_hblank - 5) * 8;
1432
1433 unsigned vblank_time_perc = (x[6] >> 5) & 7;
1434
1435 add_vert_time = (vblank_time_perc * 10000.0) / refresh;
1436 }
1437
1438 edid_cvt_mode(refresh, t, rb_h_blank, add_vert_time);
13871439
13881440 print_timings(" ", &t, "CVT", s.c_str());
13891441 if (is_cta) {
14411493 }
14421494 x += 3;
14431495
1444 for (i = 0; i < len; i += (x[i] & 0x1f) + 1)
1445 cta_block(x + i);
1496 for (i = 0; i < len; i += (x[i] & 0x1f) + 1) {
1497 unsigned tag = (x[i] & 0xe0) << 3;
1498
1499 if (tag == 0x700)
1500 tag |= x[i + 1];
1501 bool duplicate = dispid.found_tags.find(tag) != dispid.found_tags.end();
1502
1503 cta_block(x + i, duplicate);
1504 if (!duplicate)
1505 dispid.found_tags.insert(tag);
1506 }
14461507
14471508 if (i != len)
14481509 fail("Length is %u instead of %u.\n", len, i);
14981559
14991560 unsigned offset = 5;
15001561
1501 dispid.preparse_displayid_blocks++;
1562 dispid.preparsed_displayid_blocks++;
15021563 while (length > 0) {
15031564 unsigned tag = x[offset];
15041565 unsigned len = x[offset + 2];
15051566
15061567 switch (tag) {
15071568 case 0x02:
1508 dispid.preparse_color_ids |= 1 << ((x[offset + 1] >> 3) & 0x0f);
1569 dispid.preparsed_color_ids |= 1 << ((x[offset + 1] >> 3) & 0x0f);
15091570 break;
15101571 case 0x0e:
1511 dispid.preparse_xfer_ids |= 1 << ((x[offset + 1] >> 4) & 0x0f);
1572 dispid.preparsed_xfer_ids |= 1 << ((x[offset + 1] >> 4) & 0x0f);
15121573 break;
15131574 default:
15141575 break;
15451606 product_type(prod_type, false).c_str());
15461607 if (!prod_type)
15471608 fail("DisplayID Base Block has no product type.\n");
1548 if (ext_count != dispid.preparse_displayid_blocks - 1)
1609 if (ext_count != dispid.preparsed_displayid_blocks - 1)
15491610 fail("Expected %u DisplayID Extension Block%s, but got %u.\n",
15501611 ext_count,
15511612 ext_count > 1 ? "s" : "",
1552 dispid.preparse_displayid_blocks - 1);
1613 dispid.preparsed_displayid_blocks - 1);
15531614 } else {
15541615 if (prod_type)
15551616 fail("Product Type should be 0 in extension block.\n");
17321793 parse_displayid_type_6_timing(&x[offset + 3 + i]);
17331794 break;
17341795 case 0x20: parse_displayid_product_id(x + offset); break;
1735 case 0x21: parse_displayid_parameters_v2(x + offset); break;
1796 case 0x21:
1797 if (block_rev >= 1)
1798 check_displayid_datablock_revision(x[offset + 1], 0x80, 1);
1799 else
1800 check_displayid_datablock_revision(x[offset + 1], 0x80, 0);
1801 parse_displayid_parameters_v2(x + offset, block_rev);
1802 break;
17361803 case 0x22: {
17371804 unsigned sz = 20;
17381805
17781845 case 0x32: {
17791846 unsigned sz = 6 + ((x[offset + 1] & 0x70) >> 4);
17801847
1781 check_displayid_datablock_revision(x[offset + 1], 0x10);
1848 check_displayid_datablock_revision(x[offset + 1], 0x70);
17821849 for (i = 0; i < len / sz; i++)
1783 parse_displayid_type_10_timing(&x[offset + 3 + i * sz]);
1850 parse_displayid_type_10_timing(&x[offset + 3 + i * sz], sz);
17841851 break;
17851852 }
17861853 case 0x81: parse_displayid_cta_data_block(x + offset); break;
2828 detailed_cvt_descriptor(" ", x, false);
2929 }
3030 if (num_st) {
31 // Note: the VTB-EXT standard has a mistake in the example EDID
32 // that it provides: there the refresh rate (bits 5-0 of the
33 // second byte) is set to 60 for 60 Hz, but this should be 0
34 // since the actual refresh rate is the value + 60.
35 //
36 // The documentation itself is correct, though.
3137 printf(" Standard Timings:\n");
32 for (unsigned i = 0; i < num_st; i++, x += 2) {
33 if ((x[1] & 0x3f) >= 60)
34 print_standard_timing(" ", x[0], x[1] - 60, true);
35 else
36 print_standard_timing(" ", x[0], x[1], true, 0);
37 }
38 for (unsigned i = 0; i < num_st; i++, x += 2)
39 print_standard_timing(" ", x[0], x[1], true);
3840 }
3941 }
1717 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70
1818 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 5e
1919
20 02 03 24 f0 51 61 60 5f 5e 5d 10 1f 04 13 22 21
21 20 05 14 02 11 01 23 09 07 07 e2 00 ea e6 0d 61
20 02 03 24 f1 51 61 60 5f 5e 5d 10 1f 04 13 22 21
21 20 05 14 02 11 01 23 09 07 07 e2 00 ca e6 0d 61
2222 81 82 6a 84 4d d0 00 a0 f0 70 3e 80 30 20 35 00
2323 c0 1c 32 00 00 1e 1a 36 80 a0 70 38 1f 40 30 20
2424 35 00 c0 1c 32 00 00 1a 1a 1d 00 80 51 d0 1c 20
2525 40 80 35 00 c0 1c 32 00 00 1c 00 00 00 00 00 00
2626 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b7
28
29 70 20 5f 02 7c 20 00 10 00 00 00 01 00 01 00 00
27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d6
28
29 70 20 5f 02 7c 20 00 10 12 34 56 01 00 01 00 00
3030 00 00 00 04 54 65 73 74 21 00 1d 80 3e 28 23 00
3131 0f 70 08 00 3c 8a 54 cc 84 99 68 42 0f 00 45 54
32 00 00 00 00 00 00 00 ff 22 00 14 4f 10 09 80 ff
33 0e 2f 02 27 81 57 00 6f 08 59 00 47 80 09 00 24
32 00 00 00 00 00 00 00 ff 22 00 14 4f 10 09 84 ff
33 0e 2f 02 af 80 57 00 6f 08 59 00 07 80 09 00 24
3434 00 06 12 7f 07 37 04 3b 26 00 09 02 02 01 01 00
35 e0 07 00 00 bc 00 00 00 00 00 00 00 00 00 00 00
36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
37
38 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
46
47 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
55
56 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
59 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
64
65 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
69 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
71 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
73
74 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
75 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
76 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
81 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
82
83 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
84 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
86 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
87 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
89 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
91
92 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
93 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
94 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
96 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
97 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
99 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
100
101 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
102 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
103 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
104 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
105 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
106 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
107 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
108 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
109
110 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
111 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
112 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
113 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
114 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
115 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
116 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
117 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
118
119 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
121 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
122 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
123 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
124 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
125 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
126 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
127
128 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
129 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
131 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
132 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
133 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
134 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
135 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
136
137 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
138 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
139 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
141 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
142 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
143 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
144 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
145
146 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
147 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
148 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
149 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
151 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
152 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
153 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
154
155 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
156 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
157 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
158 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
159 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
161 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
162 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
163
164 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
165 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
166 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
167 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
168 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
169 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
171 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
172
173 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
174 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
175 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
176 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
177 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
178 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
179 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
181
182 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
183 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
184 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
185 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
186 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
187 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
188 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
189 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
190
191 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
192 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
193 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
194 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
195 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
196 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
197 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
198 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
199
200 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
201 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
202 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
203 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
204 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
205 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
206 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
207 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
208
209 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
211 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
212 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
213 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
214 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
215 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
216 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
217
218 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
219 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
221 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
222 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
223 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
224 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
225 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
226
227 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
228 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
229 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
231 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
232 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
233 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
234 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
235
236 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
237 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
238 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
239 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
241 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
242 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
243 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
244
245 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
246 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
247 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
248 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
249 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
251 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
252 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
253
254 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
255 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
256 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
257 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
258 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
259 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
261 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
262
263 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
264 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
265 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
266 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
267 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
268 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
269 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
271
272 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
273 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
274 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
275 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
276 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
277 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
278 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
279 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
280
281 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
282 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
283 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
284 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
285 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
286 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
287 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
288 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
289
290 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
291 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
292 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
293 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
294 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
295 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
296 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
297 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
298
299 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
301 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
302 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
303 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
304 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
305 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
306 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
307
308 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
309 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
311 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
312 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
313 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
314 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
315 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
316
317 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
318 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
319 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
321 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
322 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
323 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
324 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
325
326 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
327 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
328 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
329 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
331 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
332 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
333 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
334
335 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
336 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
337 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
338 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
339 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
341 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
342 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
343
344 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
345 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
346 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
347 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
348 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
349 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
351 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
352
353 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
354 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
355 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
356 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
357 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
358 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
359 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
361
362 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
363 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
364 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
365 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
366 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
367 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
368 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
369 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
370
371 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
372 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
373 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
374 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
375 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
376 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
377 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
378 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
379
380 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
381 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
382 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
383 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
384 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
385 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
386 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
387 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
388
389 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
391 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
392 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
393 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
394 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
395 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
396 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
397
398 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
399 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
401 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
402 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
403 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
404 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
405 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
406
407 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
408 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
409 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
411 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
412 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
413 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
414 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
415
416 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
417 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
418 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
419 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
421 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
422 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
423 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
424
425 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
426 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
427 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
428 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
429 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
431 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
432 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
433
434 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
435 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
436 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
437 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
438 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
439 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
441 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
442
443 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
444 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
445 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
446 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
447 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
448 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
449 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
451
452 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
453 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
454 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
455 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
456 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
457 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
458 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
459 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
460
461 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
462 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
463 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
464 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
465 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
466 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
467 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
468 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
469
470 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
471 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
472 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
473 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
474 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
475 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
476 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
477 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
478
479 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
481 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
482 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
483 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
484 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
485 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
486 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
487
488 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
489 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
490 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
491 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
492 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
493 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
494 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
495 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
496
497 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
498 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
499 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
501 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
502 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
503 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
504 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
505
506 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
507 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
508 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
509 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
511 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
512 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
513 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
514
515 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
516 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
517 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
518 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
519 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
521 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
522 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
523
524 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
525 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
526 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
527 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
528 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
529 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
530 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
531 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
532
533 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
534 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
535 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
536 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
537 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
538 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
539 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
541
542 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
543 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
544 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
545 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
546 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
547 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
548 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
549 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
550
551 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
552 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
553 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
554 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
555 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
556 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
557 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
558 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
559
560 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
561 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
562 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
563 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
564 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
565 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
566 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
567 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
568
569 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
570 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
571 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
572 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
573 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
574 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
575 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
576 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
577
578 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
579 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
581 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
582 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
583 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
584 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
585 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
586
587 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
588 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
589 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
590 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
591 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
592 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
593 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
594 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
595
596 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
597 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
598 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
599 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
601 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
602 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
603 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
604
605 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
606 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
607 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
608 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
609 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
610 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
611 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
612 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
613
614 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
615 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
616 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
617 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
618 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
619 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
621 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
622
623 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
624 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
625 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
626 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
627 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
628 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
629 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
630 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
631
632 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
633 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
634 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
635 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
636 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
637 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
638 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
639 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
640
641 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
642 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
643 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
644 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
645 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
646 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
647 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
648 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
649
650 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
651 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
652 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
653 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
654 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
655 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
656 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
657 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
658
659 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
660 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
661 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
662 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
663 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
664 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
665 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
666 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
667
668 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
669 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
670 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
671 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
672 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
673 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
674 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
675 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
676
677 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
678 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
679 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
680 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
681 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
682 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
683 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
684 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
685
686 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
687 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
688 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
689 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
690 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
691 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
692 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
693 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
694
695 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
696 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
697 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
698 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
699 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
700 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
701 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
702 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
703
704 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
705 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
706 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
707 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
708 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
709 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
710 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
711 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
712
713 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
714 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
715 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
716 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
717 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
718 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
719 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
720 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
721
722 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
723 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
724 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
725 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
726 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
727 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
728 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
729 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
730
731 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
732 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
733 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
734 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
735 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
736 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
737 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
738 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
739
740 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
741 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
742 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
743 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
744 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
745 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
746 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
747 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
748
749 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
750 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
751 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
752 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
753 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
754 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
755 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
756 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
757
758 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
759 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
760 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
761 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
762 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
763 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
764 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
765 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
766
767 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
768 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
769 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
770 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
771 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
772 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
773 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
774 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
775
776 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
777 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
778 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
779 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
781 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
782 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
783 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
784
785 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
786 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
787 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
788 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
789 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
790 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
791 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
792 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
793
794 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
795 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
796 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
797 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
798 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
799 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
801 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
802
803 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
804 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
805 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
806 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
807 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
808 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
809 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
811
812 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
813 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
814 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
815 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
816 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
817 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
818 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
819 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
820
821 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
822 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
823 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
824 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
825 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
826 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
827 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
828 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
829
830 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
831 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
832 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
833 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
834 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
835 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
836 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
837 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
838
839 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
840 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
841 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
842 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
843 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
844 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
845 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
846 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
847
848 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
849 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
850 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
851 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
852 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
853 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
854 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
855 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
856
857 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
858 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
859 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
860 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
861 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
862 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
863 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
864 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
865
866 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
867 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
868 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
869 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
871 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
872 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
873 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
874
875 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
876 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
877 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
878 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
879 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
880 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
881 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
882 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
883
884 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
885 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
886 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
887 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
888 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
889 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
890 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
891 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
892
893 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
894 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
895 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
896 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
897 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
898 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
899 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
900 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
901
902 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
903 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
904 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
905 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
906 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
907 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
908 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
909 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
910
911 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
912 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
913 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
914 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
915 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
916 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
917 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
918 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
919
920 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
921 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
922 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
923 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
924 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
925 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
926 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
927 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
928
929 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
930 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
931 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
932 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
933 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
934 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
935 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
936 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
937
938 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
939 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
940 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
941 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
942 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
943 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
944 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
945 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
946
947 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
948 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
949 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
950 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
951 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
952 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
953 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
954 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
955
956 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
957 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
958 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
959 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
960 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
961 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
962 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
963 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
964
965 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
966 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
967 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
968 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
969 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
970 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
971 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
972 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
973
974 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
975 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
976 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
977 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
978 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
979 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
980 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
981 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
982
983 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
984 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
985 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
986 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
987 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
988 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
989 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
990 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
991
992 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
993 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
994 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
995 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
996 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
997 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
998 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
999 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1000
1001 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1002 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1003 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1004 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1005 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1006 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1007 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1008 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1009
1010 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1011 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1012 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1013 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1014 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1015 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1016 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1017 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1018
1019 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1021 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1022 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1023 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1024 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1025 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1026 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1027
1028 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1029 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1031 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1032 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1033 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1034 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1035 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1036
1037 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1038 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1039 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1041 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1042 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1043 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1044 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1045
1046 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1047 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1048 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1049 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1051 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1052 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1053 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1054
1055 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1056 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1057 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1058 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1059 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1061 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1062 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1063
1064 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1065 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1066 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1067 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1068 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1069 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1071 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1072
1073 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1074 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1075 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1076 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1077 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1078 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1079 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1081
1082 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1083 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1084 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1085 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1086 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1087 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1088 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1089 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1090
1091 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1092 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1093 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1094 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1095 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1096 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1097 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1098 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1099
1100 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1101 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1102 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1103 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1104 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1105 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1106 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1107 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1108
1109 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1111 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1112 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1113 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1114 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1115 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1116 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1117
1118 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1119 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1121 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1122 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1123 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1124 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1125 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1126
1127 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1128 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1129 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1131 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1132 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1133 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1134 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1135
1136 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1137 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1138 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1139 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1141 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1142 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1143 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1144
1145 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1146 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1147 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1148 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1149 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1151 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1152 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
35 e0 07 00 00 d5 00 00 00 00 00 00 00 00 00 00 00
36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
37
38 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
46
47 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
55
56 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
59 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
64
65 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
69 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
71 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
73
74 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
75 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
76 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
81 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
82
83 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
84 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
86 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
87 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
89 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
91
92 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
93 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
94 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
96 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
97 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
99 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
100
101 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
102 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
103 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
104 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
105 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
106 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
107 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
108 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
109
110 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
111 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
112 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
113 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
114 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
115 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
116 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
117 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
118
119 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
121 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
122 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
123 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
124 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
125 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
126 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
127
128 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
129 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
131 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
132 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
133 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
134 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
135 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
136
137 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
138 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
139 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
141 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
142 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
143 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
144 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
145
146 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
147 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
148 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
149 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
151 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
152 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
153 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
154
155 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
156 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
157 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
158 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
159 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
161 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
162 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
163
164 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
165 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
166 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
167 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
168 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
169 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
171 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
172
173 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
174 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
175 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
176 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
177 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
178 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
179 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
181
182 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
183 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
184 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
185 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
186 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
187 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
188 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
189 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
190
191 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
192 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
193 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
194 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
195 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
196 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
197 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
198 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
199
200 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
201 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
202 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
203 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
204 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
205 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
206 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
207 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
208
209 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
211 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
212 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
213 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
214 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
215 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
216 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
217
218 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
219 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
221 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
222 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
223 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
224 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
225 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
226
227 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
228 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
229 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
231 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
232 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
233 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
234 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
235
236 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
237 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
238 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
239 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
241 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
242 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
243 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
244
245 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
246 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
247 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
248 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
249 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
251 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
252 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
253
254 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
255 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
256 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
257 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
258 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
259 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
261 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
262
263 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
264 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
265 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
266 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
267 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
268 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
269 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
271
272 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
273 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
274 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
275 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
276 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
277 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
278 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
279 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
280
281 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
282 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
283 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
284 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
285 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
286 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
287 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
288 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
289
290 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
291 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
292 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
293 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
294 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
295 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
296 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
297 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
298
299 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
301 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
302 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
303 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
304 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
305 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
306 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
307
308 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
309 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
311 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
312 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
313 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
314 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
315 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
316
317 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
318 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
319 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
321 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
322 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
323 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
324 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
325
326 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
327 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
328 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
329 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
331 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
332 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
333 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
334
335 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
336 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
337 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
338 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
339 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
341 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
342 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
343
344 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
345 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
346 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
347 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
348 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
349 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
351 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
352
353 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
354 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
355 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
356 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
357 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
358 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
359 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
361
362 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
363 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
364 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
365 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
366 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
367 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
368 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
369 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
370
371 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
372 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
373 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
374 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
375 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
376 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
377 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
378 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
379
380 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
381 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
382 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
383 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
384 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
385 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
386 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
387 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
388
389 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
391 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
392 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
393 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
394 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
395 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
396 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
397
398 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
399 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
401 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
402 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
403 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
404 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
405 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
406
407 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
408 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
409 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
411 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
412 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
413 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
414 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
415
416 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
417 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
418 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
419 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
421 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
422 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
423 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
424
425 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
426 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
427 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
428 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
429 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
431 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
432 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
433
434 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
435 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
436 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
437 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
438 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
439 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
441 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
442
443 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
444 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
445 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
446 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
447 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
448 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
449 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
451
452 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
453 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
454 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
455 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
456 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
457 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
458 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
459 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
460
461 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
462 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
463 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
464 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
465 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
466 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
467 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
468 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
469
470 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
471 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
472 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
473 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
474 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
475 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
476 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
477 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
478
479 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
481 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
482 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
483 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
484 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
485 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
486 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
487
488 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
489 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
490 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
491 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
492 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
493 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
494 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
495 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
496
497 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
498 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
499 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
501 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
502 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
503 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
504 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
505
506 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
507 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
508 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
509 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
511 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
512 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
513 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
514
515 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
516 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
517 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
518 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
519 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
521 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
522 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
523
524 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
525 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
526 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
527 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
528 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
529 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
530 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
531 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
532
533 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
534 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
535 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
536 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
537 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
538 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
539 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
541
542 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
543 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
544 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
545 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
546 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
547 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
548 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
549 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
550
551 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
552 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
553 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
554 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
555 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
556 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
557 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
558 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
559
560 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
561 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
562 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
563 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
564 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
565 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
566 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
567 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
568
569 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
570 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
571 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
572 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
573 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
574 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
575 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
576 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
577
578 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
579 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
581 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
582 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
583 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
584 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
585 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
586
587 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
588 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
589 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
590 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
591 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
592 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
593 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
594 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
595
596 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
597 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
598 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
599 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
601 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
602 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
603 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
604
605 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
606 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
607 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
608 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
609 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
610 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
611 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
612 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
613
614 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
615 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
616 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
617 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
618 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
619 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
621 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
622
623 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
624 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
625 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
626 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
627 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
628 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
629 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
630 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
631
632 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
633 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
634 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
635 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
636 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
637 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
638 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
639 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
640
641 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
642 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
643 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
644 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
645 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
646 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
647 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
648 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
649
650 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
651 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
652 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
653 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
654 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
655 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
656 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
657 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
658
659 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
660 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
661 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
662 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
663 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
664 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
665 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
666 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
667
668 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
669 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
670 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
671 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
672 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
673 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
674 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
675 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
676
677 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
678 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
679 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
680 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
681 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
682 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
683 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
684 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
685
686 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
687 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
688 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
689 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
690 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
691 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
692 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
693 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
694
695 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
696 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
697 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
698 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
699 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
700 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
701 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
702 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
703
704 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
705 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
706 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
707 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
708 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
709 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
710 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
711 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
712
713 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
714 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
715 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
716 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
717 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
718 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
719 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
720 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
721
722 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
723 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
724 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
725 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
726 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
727 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
728 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
729 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
730
731 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
732 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
733 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
734 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
735 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
736 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
737 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
738 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
739
740 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
741 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
742 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
743 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
744 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
745 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
746 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
747 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
748
749 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
750 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
751 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
752 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
753 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
754 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
755 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
756 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
757
758 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
759 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
760 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
761 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
762 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
763 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
764 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
765 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
766
767 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
768 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
769 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
770 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
771 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
772 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
773 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
774 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
775
776 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
777 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
778 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
779 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
781 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
782 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
783 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
784
785 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
786 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
787 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
788 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
789 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
790 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
791 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
792 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
793
794 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
795 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
796 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
797 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
798 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
799 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
801 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
802
803 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
804 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
805 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
806 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
807 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
808 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
809 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
811
812 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
813 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
814 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
815 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
816 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
817 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
818 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
819 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
820
821 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
822 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
823 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
824 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
825 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
826 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
827 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
828 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
829
830 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
831 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
832 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
833 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
834 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
835 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
836 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
837 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
838
839 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
840 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
841 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
842 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
843 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
844 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
845 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
846 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
847
848 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
849 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
850 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
851 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
852 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
853 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
854 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
855 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
856
857 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
858 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
859 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
860 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
861 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
862 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
863 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
864 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
865
866 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
867 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
868 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
869 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
871 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
872 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
873 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
874
875 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
876 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
877 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
878 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
879 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
880 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
881 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
882 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
883
884 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
885 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
886 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
887 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
888 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
889 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
890 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
891 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
892
893 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
894 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
895 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
896 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
897 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
898 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
899 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
900 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
901
902 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
903 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
904 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
905 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
906 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
907 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
908 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
909 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
910
911 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
912 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
913 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
914 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
915 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
916 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
917 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
918 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
919
920 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
921 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
922 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
923 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
924 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
925 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
926 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
927 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
928
929 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
930 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
931 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
932 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
933 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
934 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
935 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
936 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
937
938 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
939 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
940 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
941 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
942 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
943 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
944 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
945 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
946
947 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
948 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
949 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
950 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
951 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
952 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
953 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
954 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
955
956 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
957 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
958 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
959 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
960 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
961 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
962 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
963 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
964
965 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
966 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
967 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
968 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
969 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
970 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
971 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
972 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
973
974 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
975 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
976 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
977 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
978 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
979 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
980 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
981 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
982
983 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
984 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
985 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
986 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
987 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
988 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
989 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
990 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
991
992 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
993 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
994 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
995 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
996 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
997 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
998 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
999 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1000
1001 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1002 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1003 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1004 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1005 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1006 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1007 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1008 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1009
1010 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1011 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1012 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1013 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1014 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1015 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1016 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1017 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1018
1019 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1021 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1022 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1023 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1024 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1025 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1026 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1027
1028 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1029 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1031 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1032 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1033 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1034 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1035 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1036
1037 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1038 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1039 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1041 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1042 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1043 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1044 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1045
1046 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1047 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1048 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1049 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1051 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1052 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1053 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1054
1055 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1056 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1057 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1058 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1059 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1061 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1062 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1063
1064 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1065 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1066 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1067 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1068 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1069 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1071 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1072
1073 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1074 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1075 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1076 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1077 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1078 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1079 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1081
1082 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1083 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1084 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1085 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1086 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1087 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1088 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1089 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1090
1091 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1092 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1093 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1094 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1095 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1096 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1097 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1098 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1099
1100 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1101 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1102 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1103 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1104 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1105 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1106 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1107 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1108
1109 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1111 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1112 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1113 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1114 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1115 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1116 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1117
1118 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1119 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1121 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1122 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1123 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1124 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1125 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1126
1127 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1128 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1129 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1131 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1132 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1133 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1134 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1135
1136 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1137 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1138 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1139 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1141 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1142 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1143 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1144
1145 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00
1146 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1147 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1148 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1149 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1151 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1152 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
1717 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70
1818 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 5e
1919
20 02 03 24 f0 51 61 60 5f 5e 5d 10 1f 04 13 22 21
21 20 05 14 02 11 01 23 09 07 07 e2 00 ea e6 0d 61
20 02 03 24 f1 51 61 60 5f 5e 5d 10 1f 04 13 22 21
21 20 05 14 02 11 01 23 09 07 07 e2 00 ca e6 0d 61
2222 81 82 6a 84 4d d0 00 a0 f0 70 3e 80 30 20 35 00
2323 c0 1c 32 00 00 1e 1a 36 80 a0 70 38 1f 40 30 20
2424 35 00 c0 1c 32 00 00 1a 1a 1d 00 80 51 d0 1c 20
2525 40 80 35 00 c0 1c 32 00 00 1c 00 00 00 00 00 00
2626 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b7
28
29 70 20 5f 02 fa 20 00 10 00 00 00 01 00 01 00 00
27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d6
28
29 70 20 5f 02 fa 20 00 10 12 34 56 01 00 01 00 00
3030 00 00 00 04 54 65 73 74 21 00 1d 80 3e 28 23 00
3131 0f 70 08 00 3c 8a 54 cc 84 99 68 42 0f 00 45 54
32 00 00 00 00 00 00 00 ff 22 00 14 4f 10 09 80 ff
33 0e 2f 02 27 81 57 00 6f 08 59 00 47 80 09 00 24
32 00 00 00 00 00 00 00 ff 22 00 14 4f 10 09 84 ff
33 0e 2f 02 af 80 57 00 6f 08 59 00 07 80 09 00 24
3434 00 06 12 7f 07 37 04 3b 26 00 09 02 02 01 01 00
35 e0 07 00 00 3e 00 00 00 00 00 00 00 00 00 00 00
35 e0 07 00 00 57 00 00 00 00 00 00 00 00 00 00 00
3636 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90
3737
3838 70 20 04 00 00 23 00 01 02 b6 00 00 00 00 00 00