1 | package MARC::Lint;
|
---|
2 |
|
---|
3 | use strict;
|
---|
4 | use integer;
|
---|
5 | eval 'use warnings' if $] >= 5.006;
|
---|
6 |
|
---|
7 | =head1 NAME
|
---|
8 |
|
---|
9 | MARC::Lint - Perl extension for checking validity of MARC records
|
---|
10 |
|
---|
11 | =head1 VERSION
|
---|
12 |
|
---|
13 | Version 1.10
|
---|
14 |
|
---|
15 | $Id: Lint.pm 3430 2002-09-24 05:17:39Z jrm21 $
|
---|
16 |
|
---|
17 | =cut
|
---|
18 |
|
---|
19 | use vars '$VERSION'; $VERSION = '1.10';
|
---|
20 |
|
---|
21 | use MARC::Record;
|
---|
22 | use MARC::Field;
|
---|
23 |
|
---|
24 | =head1 SYNOPSIS
|
---|
25 |
|
---|
26 | use MARC::Record;
|
---|
27 | use MARC::Lint;
|
---|
28 |
|
---|
29 | my $linter = new MARC::Lint;
|
---|
30 | my $filename = shift;
|
---|
31 |
|
---|
32 | open( IN, "<", $filename ) or die "Couldn't open $filename: $!\n";
|
---|
33 | binmode( IN ); # for the Windows folks
|
---|
34 | while ( !eof(IN) ) {
|
---|
35 | my $marc = MARC::Record::next_from_file( *IN );
|
---|
36 | die $MARC::Record::ERROR unless $marc;
|
---|
37 |
|
---|
38 | $linter->check_record( $marc );
|
---|
39 |
|
---|
40 |
|
---|
41 | # Print the title tag
|
---|
42 | print $marc->subfield(245,"a"), "\n";
|
---|
43 |
|
---|
44 | # Print the errors that were found
|
---|
45 | print join( "\n", $linter->warnings ), "\n";
|
---|
46 | } # while
|
---|
47 |
|
---|
48 | close IN or die "Error closing $filename: $!\n";
|
---|
49 |
|
---|
50 | Given the following MARC record:
|
---|
51 |
|
---|
52 | LDR 00000nam 22002538a 4500
|
---|
53 | 100 14 _aWall, Larry.
|
---|
54 | 110 1 _aO'Reilly & Associates.
|
---|
55 | 245 90 _aProgramming Perl /
|
---|
56 | _aBig Book of Perl /
|
---|
57 | _cLarry Wall, Tom Christiansen & Jon Orwant.
|
---|
58 | 250 _a3rd ed.
|
---|
59 | 250 _a3rd ed.
|
---|
60 | 260 _aCambridge, Mass. :
|
---|
61 | _bO'Reilly,
|
---|
62 | _r2000.
|
---|
63 | 590 4 _aPersonally signed by Larry.
|
---|
64 | 856 43 _uhttp://www.perl.com/
|
---|
65 |
|
---|
66 | the following errors are generated:
|
---|
67 |
|
---|
68 | 1XX: Only one 1XX tag is allowed, but I found 2 of them.
|
---|
69 | 100: Indicator 2 must be blank
|
---|
70 | 245: Indicator 1 must be 0 or 1
|
---|
71 | 245: Subfield _a is not repeatable.
|
---|
72 | 250: Field is not repeatable.
|
---|
73 | 260: Subfield _r is not valid.
|
---|
74 | 260: Must have a subfield _c.
|
---|
75 | 590: Indicator 1 must be blank
|
---|
76 | 856: Indicator 2 must be blank, 0, 1, 2 or 8
|
---|
77 |
|
---|
78 | =head1 DESCRIPTION
|
---|
79 |
|
---|
80 | Module for checking validity of MARC records. 99% of the users will want to do
|
---|
81 | something like is shown in the synopsis. The other intrepid 1% will overload the
|
---|
82 | C<MARC::Lint> module's methods and provide their own special field-level checking.
|
---|
83 |
|
---|
84 | What this means is that if you have certain requirements, such as making sure that
|
---|
85 | all 952 tags have a certain call number in them, you can write a function that
|
---|
86 | checks for that, and still get all the benefits of the MARC::Lint framework.
|
---|
87 |
|
---|
88 | =head1 EXPORT
|
---|
89 |
|
---|
90 | None. Everything is done through objects.
|
---|
91 |
|
---|
92 | =head1 METHODS
|
---|
93 |
|
---|
94 | =head2 C<new()>
|
---|
95 |
|
---|
96 | No parms needed. The C<MARC::Lint> object is little more than a list of warnings
|
---|
97 | and a bunch of rules.
|
---|
98 |
|
---|
99 | =cut
|
---|
100 |
|
---|
101 | sub new() {
|
---|
102 | my $class = shift;
|
---|
103 | $class = ref($class) || $class;
|
---|
104 |
|
---|
105 | my $self = {
|
---|
106 | _warnings => [],
|
---|
107 | };
|
---|
108 | bless $self, $class;
|
---|
109 |
|
---|
110 | $self->_read_rules();
|
---|
111 |
|
---|
112 | return $self;
|
---|
113 | }
|
---|
114 |
|
---|
115 | =head2 C<warnings()>
|
---|
116 |
|
---|
117 | Returns a list of warnings found by C<check_record()> and its brethren.
|
---|
118 |
|
---|
119 | =cut
|
---|
120 |
|
---|
121 | sub warnings {
|
---|
122 | my $self = shift;
|
---|
123 |
|
---|
124 | return wantarray ? @{$self->{_warnings}} : scalar @{$self->{_warnings}};
|
---|
125 | }
|
---|
126 |
|
---|
127 | =head2 C<clear_warnings()>
|
---|
128 |
|
---|
129 | Clear the list of warnings for this linter object. It's automatically called
|
---|
130 | when you call C<check_record()>.
|
---|
131 |
|
---|
132 | =cut
|
---|
133 |
|
---|
134 | sub clear_warnings {
|
---|
135 | my $self = shift;
|
---|
136 |
|
---|
137 | $self->{_warnings} = [];
|
---|
138 | }
|
---|
139 |
|
---|
140 | =head2 C<warn(str[,str...])>
|
---|
141 |
|
---|
142 | Create a warning message, built from strings passed, like a C<print> statement.
|
---|
143 |
|
---|
144 | Typically, you'll leave this to C<check_record()>, but industrious programmers
|
---|
145 | may want to do their own checking as well.
|
---|
146 |
|
---|
147 | =cut
|
---|
148 |
|
---|
149 | sub warn {
|
---|
150 | my $self = shift;
|
---|
151 |
|
---|
152 | push( @{$self->{_warnings}}, join( "", @_ ) );
|
---|
153 |
|
---|
154 | return undef;
|
---|
155 | }
|
---|
156 |
|
---|
157 | =head2 C<check_record(marc)>
|
---|
158 |
|
---|
159 | Does all sorts of lint-like checks on the MARC record I<marc>, both on the record as a whole,
|
---|
160 | and on the individual fields & subfields.
|
---|
161 |
|
---|
162 | =cut
|
---|
163 |
|
---|
164 | sub check_record {
|
---|
165 | my $self = shift;
|
---|
166 | my $marc = shift;
|
---|
167 |
|
---|
168 | $self->clear_warnings();
|
---|
169 |
|
---|
170 | (ref($marc) eq "MARC::Record")
|
---|
171 | or return $self->warn( "Must pass a MARC::Record object to check_record" );
|
---|
172 |
|
---|
173 | if ( (my @_1xx = $marc->field( "1XX" )) > 1 ) {
|
---|
174 | $self->warn( "1XX: Only one 1XX tag is allowed, but I found ", scalar @_1xx, " of them." );
|
---|
175 | }
|
---|
176 |
|
---|
177 | if ( not $marc->field( 245 ) ) {
|
---|
178 | $self->warn( "245: No 245 tag." );
|
---|
179 | }
|
---|
180 |
|
---|
181 |
|
---|
182 | my %field_seen;
|
---|
183 | my $rules = $self->{_rules};
|
---|
184 | for my $field ( $marc->fields ) {
|
---|
185 | my $tagno = $field->tag;
|
---|
186 | my $tagrules = $rules->{$tagno} or next;
|
---|
187 |
|
---|
188 | if ( $tagrules->{NR} && $field_seen{$tagno} ) {
|
---|
189 | $self->warn( "$tagno: Field is not repeatable." );
|
---|
190 | }
|
---|
191 |
|
---|
192 | if ( $tagno >= 10 ) {
|
---|
193 | for my $ind ( 1..2 ) {
|
---|
194 | my $indvalue = $field->indicator($ind);
|
---|
195 | if ( not ($indvalue =~ $tagrules->{"ind$ind" . "_regex"}) ) {
|
---|
196 | $self->warn(
|
---|
197 | "$tagno: Indicator $ind must be ",
|
---|
198 | $tagrules->{"ind$ind" . "_desc"},
|
---|
199 | " but it's \"$indvalue\""
|
---|
200 | );
|
---|
201 | }
|
---|
202 | }
|
---|
203 |
|
---|
204 | my %sub_seen;
|
---|
205 | for my $subfield ( $field->subfields ) {
|
---|
206 | my ($code,$data) = @$subfield;
|
---|
207 |
|
---|
208 | my $rule = $tagrules->{$code};
|
---|
209 | if ( not defined $rule ) {
|
---|
210 | $self->warn( "$tagno: Subfield _$code is not allowed." );
|
---|
211 | } elsif ( ($rule eq "NR") && $sub_seen{$code} ) {
|
---|
212 | $self->warn( "$tagno: Subfield _$code is not repeatable." );
|
---|
213 | }
|
---|
214 |
|
---|
215 | if ( $data =~ /[\t\r\n]/ ) {
|
---|
216 | $self->warn( "$tagno: Subfield _$code has an invalid control character" );
|
---|
217 | }
|
---|
218 |
|
---|
219 | ++$sub_seen{$code};
|
---|
220 | }
|
---|
221 | }
|
---|
222 |
|
---|
223 | # Check to see if a check_xxx() function exists, and call it on the field if it does
|
---|
224 | my $checker = "check_$tagno";
|
---|
225 | if ( $self->can( $checker ) ) {
|
---|
226 | $self->$checker( $field );
|
---|
227 | }
|
---|
228 |
|
---|
229 | ++$field_seen{$tagno};
|
---|
230 | } # for
|
---|
231 |
|
---|
232 | return;
|
---|
233 | }
|
---|
234 |
|
---|
235 | =head2 C<check_I<xxx>(field)>
|
---|
236 |
|
---|
237 | Various functions to check the different fields. If the function doesn't exist,
|
---|
238 | then it doesn't get checked.
|
---|
239 |
|
---|
240 | =cut
|
---|
241 |
|
---|
242 | sub check_245 {
|
---|
243 | my $self = shift;
|
---|
244 | my $field = shift;
|
---|
245 |
|
---|
246 | if ( not $field->subfield( "a" ) ) {
|
---|
247 | $self->warn( "245: Must have a subfield _a." );
|
---|
248 | }
|
---|
249 | }
|
---|
250 |
|
---|
251 | sub check_260 {
|
---|
252 | my $self = shift;
|
---|
253 | my $field = shift;
|
---|
254 |
|
---|
255 | if ( not $field->subfield( "c" ) ) {
|
---|
256 | $self->warn( "260: Must have a subfield _c." );
|
---|
257 | }
|
---|
258 | }
|
---|
259 |
|
---|
260 |
|
---|
261 | =head1 SEE ALSO
|
---|
262 |
|
---|
263 | Check the docs for L<MARC::Record>. All software links are there.
|
---|
264 |
|
---|
265 | =head1 TODO
|
---|
266 |
|
---|
267 | =over 4
|
---|
268 |
|
---|
269 | =item * ISBN and ISSN checking
|
---|
270 |
|
---|
271 | We can check the 020 and 022 fields with the C<Business::ISBN> and
|
---|
272 | C<Business::ISSN> modules, respectively.
|
---|
273 |
|
---|
274 | =back
|
---|
275 |
|
---|
276 | =head1 LICENSE
|
---|
277 |
|
---|
278 | This code may be distributed under the same terms as Perl itself.
|
---|
279 |
|
---|
280 | Please note that these modules are not products of or supported by the
|
---|
281 | employers of the various contributors to the code.
|
---|
282 |
|
---|
283 | =head1 AUTHOR
|
---|
284 |
|
---|
285 | Andy Lester, E<lt>[email protected]<gt> or E<lt>[email protected]<gt>
|
---|
286 |
|
---|
287 | =cut
|
---|
288 |
|
---|
289 | # Used only to read the stuff from __DATA__
|
---|
290 | sub _read_rules() {
|
---|
291 | my $self = shift;
|
---|
292 |
|
---|
293 | my $tell = tell(DATA); # Stash the position so we can reset it for next time
|
---|
294 |
|
---|
295 | local $/ = "";
|
---|
296 | while ( my $lines = <DATA> ) {
|
---|
297 | $lines =~ s/\s+$//;
|
---|
298 | my @keyvals = split( /\s+/, $lines );
|
---|
299 |
|
---|
300 | my $tagno = shift @keyvals;
|
---|
301 | my $repeatable = shift @keyvals;
|
---|
302 |
|
---|
303 | my @tag_range = ($tagno);
|
---|
304 | if ( $tagno =~ /^(\d\d)X/ ) {
|
---|
305 | my $base = $1;
|
---|
306 | @tag_range = ( "${base}0" .. "${base}9" );
|
---|
307 | }
|
---|
308 |
|
---|
309 | # Handle the ranges of tags.
|
---|
310 | for my $currtag ( @tag_range ) {
|
---|
311 | $self->_parse_tag_rules( $currtag, $repeatable, @keyvals );
|
---|
312 | } # for
|
---|
313 | # I guess I could just have multiple references to the same tag, but I'm not that worried about memory
|
---|
314 | } # while
|
---|
315 |
|
---|
316 | seek( DATA, $tell, 0 );
|
---|
317 | }
|
---|
318 |
|
---|
319 | sub _parse_tag_rules {
|
---|
320 | my $self = shift;
|
---|
321 | my $tagno = shift;
|
---|
322 | my $repeatable = shift;
|
---|
323 | my @keyvals = @_;
|
---|
324 |
|
---|
325 | my $rules = ($self->{_rules}->{$tagno} ||= {});
|
---|
326 | $rules->{$repeatable} = $repeatable;
|
---|
327 |
|
---|
328 | while ( @keyvals ) {
|
---|
329 | my $key = shift @keyvals;
|
---|
330 | my $val = shift @keyvals;
|
---|
331 |
|
---|
332 | $rules->{$key} = $val;
|
---|
333 |
|
---|
334 | # Do magic for indicators
|
---|
335 | if ( $key =~ /^ind/ ) {
|
---|
336 | my $desc;
|
---|
337 | my $regex;
|
---|
338 |
|
---|
339 | if ( $val eq "blank" ) {
|
---|
340 | $desc = "blank";
|
---|
341 | $regex = qr/^ $/;
|
---|
342 | } else {
|
---|
343 | $desc = _nice_list($val);
|
---|
344 | $val =~ s/^b/ /;
|
---|
345 | $regex = qr/^[$val]$/;
|
---|
346 | }
|
---|
347 |
|
---|
348 | $rules->{$key."_desc"} = $desc;
|
---|
349 | $rules->{$key."_regex"} = $regex;
|
---|
350 | } # if indicator
|
---|
351 | } # while
|
---|
352 | }
|
---|
353 |
|
---|
354 |
|
---|
355 | sub _nice_list($) {
|
---|
356 | my $str = shift;
|
---|
357 |
|
---|
358 | if ( $str =~ s/(\d)-(\d)/$1 thru $2/ ) {
|
---|
359 | return $str;
|
---|
360 | }
|
---|
361 |
|
---|
362 | my @digits = split( //, $str );
|
---|
363 | $digits[0] = "blank" if $digits[0] eq "b";
|
---|
364 | my $last = pop @digits;
|
---|
365 | return join( ", ", @digits ) . " or $last";
|
---|
366 | }
|
---|
367 |
|
---|
368 | sub _ind_regex($) {
|
---|
369 | my $str = shift;
|
---|
370 |
|
---|
371 | return qr/^ $/ if $str eq "blank";
|
---|
372 |
|
---|
373 | return qr/^[$str]$/;
|
---|
374 | }
|
---|
375 |
|
---|
376 |
|
---|
377 | 1;
|
---|
378 |
|
---|
379 | __DATA__
|
---|
380 | 010 NR
|
---|
381 | ind1 blank
|
---|
382 | ind2 blank
|
---|
383 | a NR
|
---|
384 | z NR
|
---|
385 |
|
---|
386 | 016 R
|
---|
387 | ind1 b7
|
---|
388 | ind2 blank
|
---|
389 | a NR
|
---|
390 | z R
|
---|
391 | 2 NR
|
---|
392 |
|
---|
393 | 020 R
|
---|
394 | ind1 blank
|
---|
395 | ind2 blank
|
---|
396 | a R
|
---|
397 | c R
|
---|
398 |
|
---|
399 | 022 R
|
---|
400 | ind1 blank
|
---|
401 | ind2 blank
|
---|
402 | a NR
|
---|
403 |
|
---|
404 | 040 NR
|
---|
405 | ind1 blank
|
---|
406 | ind2 blank
|
---|
407 | a NR
|
---|
408 | c NR
|
---|
409 | d R
|
---|
410 |
|
---|
411 | 100 NR
|
---|
412 | ind1 013
|
---|
413 | ind2 blank
|
---|
414 | a NR
|
---|
415 | q NR
|
---|
416 | b R
|
---|
417 | c R
|
---|
418 | d NR
|
---|
419 | e R
|
---|
420 |
|
---|
421 | 110 NR
|
---|
422 | ind1 012
|
---|
423 | ind2 blank
|
---|
424 | a NR
|
---|
425 | b R
|
---|
426 |
|
---|
427 | 111 NR
|
---|
428 | ind1 012
|
---|
429 | ind2 blank
|
---|
430 | a NR
|
---|
431 | n R
|
---|
432 | d NR
|
---|
433 | c NR
|
---|
434 | e R
|
---|
435 |
|
---|
436 | 130 NR
|
---|
437 | ind1 0-9
|
---|
438 | ind2 blank
|
---|
439 | a NR
|
---|
440 | n R
|
---|
441 | p R
|
---|
442 | h NR
|
---|
443 | l NR
|
---|
444 | k R
|
---|
445 | s NR
|
---|
446 | f NR
|
---|
447 |
|
---|
448 | 240 NR
|
---|
449 | ind1 01
|
---|
450 | ind2 0-9
|
---|
451 |
|
---|
452 | 245 NR
|
---|
453 | ind1 01
|
---|
454 | ind2 0-9
|
---|
455 | a NR
|
---|
456 | n R
|
---|
457 | p R
|
---|
458 | h NR
|
---|
459 | b NR
|
---|
460 | s NR
|
---|
461 | c NR
|
---|
462 |
|
---|
463 | 246 NR
|
---|
464 | ind1 0123
|
---|
465 | ind2 012345678
|
---|
466 | a NR
|
---|
467 | h NR
|
---|
468 | b NR
|
---|
469 | n R
|
---|
470 | p R
|
---|
471 | i NR
|
---|
472 | f NR
|
---|
473 |
|
---|
474 | 250 NR
|
---|
475 | ind1 blank
|
---|
476 | ind2 blank
|
---|
477 | a NR
|
---|
478 | b NR
|
---|
479 |
|
---|
480 | 260 NR
|
---|
481 | ind1 blank
|
---|
482 | ind2 blank
|
---|
483 | a R
|
---|
484 | b R
|
---|
485 | c R
|
---|
486 |
|
---|
487 | 300 NR
|
---|
488 | ind1 blank
|
---|
489 | ind2 blank
|
---|
490 | a R
|
---|
491 | b NR
|
---|
492 | c R
|
---|
493 | e NR
|
---|
494 |
|
---|
495 | 440 R
|
---|
496 | ind1 blank
|
---|
497 | ind2 0-9
|
---|
498 | a NR
|
---|
499 | n R
|
---|
500 | p R
|
---|
501 | v NR
|
---|
502 |
|
---|
503 | 490 R
|
---|
504 | ind1 01
|
---|
505 | ind2 blank
|
---|
506 | a R
|
---|
507 | v R
|
---|
508 |
|
---|
509 | 500 R
|
---|
510 | ind1 blank
|
---|
511 | ind2 blank
|
---|
512 | a NR
|
---|
513 |
|
---|
514 | 504 R
|
---|
515 | ind1 blank
|
---|
516 | ind2 blank
|
---|
517 | a NR
|
---|
518 |
|
---|
519 | 505 R
|
---|
520 | ind1 0128
|
---|
521 | ind2 b0
|
---|
522 | a NR
|
---|
523 | g R
|
---|
524 | r R
|
---|
525 | t R
|
---|
526 |
|
---|
527 | 520 R
|
---|
528 | ind1 b018
|
---|
529 | ind2 blank
|
---|
530 | a R
|
---|
531 | b R
|
---|
532 |
|
---|
533 | 521 R
|
---|
534 | ind1 b012348
|
---|
535 | ind2 blank
|
---|
536 | a R
|
---|
537 | b NR
|
---|
538 |
|
---|
539 | 526 R
|
---|
540 | ind1 08
|
---|
541 | ind2 blank
|
---|
542 | a NR
|
---|
543 | b NR
|
---|
544 | c NR
|
---|
545 | d NR
|
---|
546 | i NR
|
---|
547 | x R
|
---|
548 | z R
|
---|
549 |
|
---|
550 | 538 R
|
---|
551 | ind1 blank
|
---|
552 | ind2 blank
|
---|
553 | a NR
|
---|
554 |
|
---|
555 | 546 R
|
---|
556 | ind1 blank
|
---|
557 | ind2 blank
|
---|
558 | a NR
|
---|
559 |
|
---|
560 | 586 R
|
---|
561 | ind1 b8
|
---|
562 | ind2 blank
|
---|
563 | a NR
|
---|
564 |
|
---|
565 | 59X R
|
---|
566 | ind1 blank
|
---|
567 | ind2 blank
|
---|
568 | a NR
|
---|
569 |
|
---|
570 | 600 R
|
---|
571 | ind1 013
|
---|
572 | ind2 012567
|
---|
573 | a NR
|
---|
574 | q NR
|
---|
575 | b R
|
---|
576 | c R
|
---|
577 | d NR
|
---|
578 | t NR
|
---|
579 | v R
|
---|
580 | x R
|
---|
581 | y R
|
---|
582 | z R
|
---|
583 | 2 NR
|
---|
584 |
|
---|
585 | 610 R
|
---|
586 | ind1 012
|
---|
587 | ind2 012567
|
---|
588 | a NR
|
---|
589 | b R
|
---|
590 | t NR
|
---|
591 | v R
|
---|
592 | x R
|
---|
593 | y R
|
---|
594 | z R
|
---|
595 | 2 NR
|
---|
596 |
|
---|
597 | 611 R
|
---|
598 | ind1 012
|
---|
599 | ind2 012567
|
---|
600 | a NR
|
---|
601 | n R
|
---|
602 | d NR
|
---|
603 | c NR
|
---|
604 | v R
|
---|
605 | x R
|
---|
606 | y R
|
---|
607 | z R
|
---|
608 | 2 NR
|
---|
609 |
|
---|
610 | 630 R
|
---|
611 | ind1 0-9
|
---|
612 | ind2 012567
|
---|
613 | a NR
|
---|
614 | n R
|
---|
615 | p R
|
---|
616 | l NR
|
---|
617 | k R
|
---|
618 | s NR
|
---|
619 | f NR
|
---|
620 | v R
|
---|
621 | x R
|
---|
622 | y R
|
---|
623 | z R
|
---|
624 | 2 NR
|
---|
625 |
|
---|
626 | 650 R
|
---|
627 | ind1 blank
|
---|
628 | ind2 012567
|
---|
629 | a NR
|
---|
630 | v R
|
---|
631 | x R
|
---|
632 | y R
|
---|
633 | z R
|
---|
634 | 2 NR
|
---|
635 |
|
---|
636 | 651 R
|
---|
637 | ind1 blank
|
---|
638 | ind2 012567
|
---|
639 | a NR
|
---|
640 | v R
|
---|
641 | x R
|
---|
642 | y R
|
---|
643 | z R
|
---|
644 | 2 NR
|
---|
645 |
|
---|
646 | 655 R
|
---|
647 | ind1 blank
|
---|
648 | ind2 7
|
---|
649 | a NR
|
---|
650 | v R
|
---|
651 | x R
|
---|
652 | y R
|
---|
653 | z R
|
---|
654 | 2 NR
|
---|
655 |
|
---|
656 | 658 R
|
---|
657 | ind1 blank
|
---|
658 | ind2 blank
|
---|
659 | a NR
|
---|
660 | b R
|
---|
661 | c NR
|
---|
662 | d NR
|
---|
663 | 2 NR
|
---|
664 |
|
---|
665 | 69X R
|
---|
666 | ind1 blank
|
---|
667 | ind2 blank
|
---|
668 | a NR
|
---|
669 | v R
|
---|
670 | x R
|
---|
671 | y R
|
---|
672 | z R
|
---|
673 |
|
---|
674 | 700 R
|
---|
675 | ind1 013
|
---|
676 | ind2 b2
|
---|
677 | a NR
|
---|
678 | q NR
|
---|
679 | b R
|
---|
680 | c R
|
---|
681 | d NR
|
---|
682 | k R
|
---|
683 | t NR
|
---|
684 | e R
|
---|
685 | f NR
|
---|
686 |
|
---|
687 | 710 R
|
---|
688 | ind1 012
|
---|
689 | ind2 b2
|
---|
690 | a NR
|
---|
691 | b R
|
---|
692 | e R
|
---|
693 | t NR
|
---|
694 |
|
---|
695 | 711 R
|
---|
696 | ind1 012
|
---|
697 | ind2 b2
|
---|
698 | a NR
|
---|
699 | n R
|
---|
700 | d NR
|
---|
701 | c NR
|
---|
702 | t NR
|
---|
703 | e R
|
---|
704 |
|
---|
705 | 730 R
|
---|
706 | ind1 0-9
|
---|
707 | ind2 b2
|
---|
708 | a NR
|
---|
709 | n R
|
---|
710 | p R
|
---|
711 | h NR
|
---|
712 | l NR
|
---|
713 | k R
|
---|
714 | s NR
|
---|
715 | f NR
|
---|
716 |
|
---|
717 | 740 R
|
---|
718 | ind1 0-9
|
---|
719 | ind2 b2
|
---|
720 | a NR
|
---|
721 | h NR
|
---|
722 | n R
|
---|
723 | p R
|
---|
724 |
|
---|
725 |
|
---|
726 | 800 R
|
---|
727 | ind1 013
|
---|
728 | ind2 blank
|
---|
729 | a NR
|
---|
730 | q NR
|
---|
731 | b NR
|
---|
732 | c R
|
---|
733 | d NR
|
---|
734 | t NR
|
---|
735 | e R
|
---|
736 | v NR
|
---|
737 |
|
---|
738 | 852 R
|
---|
739 | ind1 b01234568
|
---|
740 | ind2 b012
|
---|
741 | a NR
|
---|
742 | b R
|
---|
743 | h NR
|
---|
744 | i R
|
---|
745 | k NR
|
---|
746 | m NR
|
---|
747 | t NR
|
---|
748 | p NR
|
---|
749 | 9 NR
|
---|
750 |
|
---|
751 | 856 R
|
---|
752 | ind1 b012347
|
---|
753 | ind2 b0128
|
---|
754 | a R
|
---|
755 | b NR
|
---|
756 | d R
|
---|
757 | f R
|
---|
758 | h NR
|
---|
759 | i R
|
---|
760 | u R
|
---|
761 | x R
|
---|
762 | z R
|
---|
763 | 2 NR
|
---|
764 | 3 NR
|
---|