1 /* ---------------------------------------------------------------------------
2 * Copyright (C) 2009-2015 Equinox Software, Inc.
3 * Mike Rylander <miker@esilibrary.com>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * ---------------------------------------------------------------------------
18 * Copy of file from Open-ILS/web/js/ui/default/staff/marcedit.js
20 * This copy of the the MARC21 library heavily modified by
21 * Bill Erickson <berickxx@gmail.com> 2019 circa Evergreen 3.3.
23 * 1. All jquery dependencies have been replaced with Vanilla JS.
24 * 2. Many features from the original have been removed (for now,
25 * anyway) since they were not needed at the time and would have
26 * required additional jquery porting work.
28 * Code is otherwise unchanged.
32 * As an external dependency, this JS is loaded on every Angular page.
33 * We could migrate it into the Angular app as Typescript so it's only
34 * loaded when needed (e.g. in the marc editor component).
39 Record : function(kwargs) {
40 if (!kwargs) kwargs = {};
42 this.generate008 = function () {
47 var y = now.getUTCFullYear().toString().substr(2,2);
48 var m = now.getUTCMonth() + 1;
49 if (m < 10) m = '0' + m;
50 var d = now.getUTCDate();
51 if (d < 10) d = '0' + d;
54 if (f = this.field('008',true)[0]) {
58 /* lang code from 041a */
59 var lang = orig008.substr(35, 3);
61 if (f = this.field('041',true)[0]) {
62 if (s = f.subfield('a',true)[0]) {
67 /* country code from 044a */
68 var country = orig008.substr(15, 3);
69 if (f = this.field('044',true)[0]) {
70 if (s = f.subfield('a',true)[0]) {
71 if(s[1]) country = s[1];
74 while (country.length < 3) country = country + ' ';
75 if (country.length > 3) country = country.substr(0,3);
78 var date1 = now.getUTCFullYear().toString();
79 if (f = this.field('260',true)[0]) {
80 if (s = f.subfield('c',true)[0]) {
83 tmpd = tmpd.replace(/[^0-9]/g, '');
84 if (tmpd.match(/^\d\d\d\d/)) {
85 date1 = tmpd.substr(0, 4);
91 var date2 = orig008.substr(11, 4);
92 var datetype = orig008.substr(6, 1);
93 var modded = orig008.substr(38, 1);
94 var catsrc = orig008.substr(39, 1);
96 return '' + y + m + d + datetype + date1 + date2 + country + ' ' + lang + modded + catsrc;
100 this.title = function () { return this.subfield('245','a')[1] }
102 this.field = function (spec, wantarray) {
103 var list = this.fields.filter(function (f) {
104 if (f.tag.match(spec)) return true;
108 if (!wantarray && list.length == 1) return list[0];
112 this.subfield = function (spec, code) {
113 var f = this.field(spec, true)[0];
114 if (f) return f.subfield(code)
118 this.appendFields = function () {
120 Array.prototype.slice.call(arguments).forEach( function (f) { f.position = me.fields.length; me.fields.push( f ) } );
123 this.deleteField = function (f) { return this.deleteFields(f) },
125 this.insertOrderedFields = function () {
127 for (var i = 0; i < arguments.length; i++) {
128 var f = arguments[i];
130 for (var j = 0; j < this.fields.length; j++) {
131 if (f.tag < this.fields[j].tag) {
132 this.insertFieldsBefore(this.fields[j], f);
137 if (!done) this.appendFields(f);
141 this.insertFieldsBefore = function (target) {
142 var args = Array.prototype.slice.call(arguments);
145 for (var j = 0; j < this.fields.length; j++) {
146 if (target === this.fields[j]) {
147 args.forEach( function (f) {
149 me.fields.splice(j++,0,f);
154 for (var j = 0; j < this.fields.length; j++) {
155 this.fields[j].position = j;
159 this.insertFieldsAfter = function (target) {
160 var args = Array.prototype.slice.call(arguments);
163 for (var j = 0; j < this.fields.length; j++) {
164 if (target === this.fields[j]) {
165 args.forEach( function (f) {
167 me.fields.splice(++j,0,f);
172 for (var j = 0; j < this.fields.length; j++) {
173 this.fields[j].position = j;
177 this.deleteFields = function () {
180 for ( var i in arguments ) {
181 var f = arguments[i];
182 for (var j = 0; j < me.fields.length; j++) {
183 if (f === me.fields[j]) {
184 me.fields[j].record = null;
185 me.fields.splice(j,1);
191 for (var j = 0; j < this.fields.length; j++) {
192 this.fields[j].position = j;
197 this.fromXmlString = function (mxml) {
198 var xmlDoc = new DOMParser().parseFromString(mxml, "text/xml");
199 this.fromXmlDocument(xmlDoc.getElementsByTagName('record')[0]);
202 this.fromXmlDocument = function (mxml) {
204 var ldr = mxml.getElementsByTagName('leader')[0];
205 me.leader = (ldr ? ldr.textContent : '') || '00000cam a2200205Ka 4500';
207 var cfNodes = mxml.getElementsByTagName('controlfield');
208 for (var idx = 0; idx < cfNodes.length; idx++) {
209 var cf = cfNodes[idx];
213 tag : cf.getAttribute('tag'),
214 data : cf.textContent
219 var dfNodes = mxml.getElementsByTagName('datafield');
220 for (var idx = 0; idx < dfNodes.length; idx++) {
221 var df = dfNodes[idx];
223 var sfNodes = df.getElementsByTagName('subfield');
225 for (var idx2 = 0; idx2 < sfNodes.length; idx2++) {
226 var sf = sfNodes[idx2];
228 [sf.getAttribute('code'), sf.textContent, idx2]);
234 tag : df.getAttribute('tag'),
235 ind1 : df.getAttribute('ind1'),
236 ind2 : df.getAttribute('ind2'),
237 subfields : subfields
242 for (var j = 0; j < this.fields.length; j++) {
243 this.fields[j].position = j;
249 this.toXmlDocument = function () {
251 var doc = new DOMParser().parseFromString(
252 '<record xmlns="http://www.loc.gov/MARC21/slim"/>', 'text/xml');
254 var rec_node = doc.getElementsByTagName('record')[0];
256 var ldr = doc.createElementNS('http://www.loc.gov/MARC21/slim', 'leader');
257 ldr.textContent = this.leader;
258 rec_node.appendChild( ldr );
260 this.fields.forEach(function (f) {
261 var element = f.isControlfield() ? 'controlfield' : 'datafield';
262 var f_node = doc.createElementNS( 'http://www.loc.gov/MARC21/slim', element );
263 f_node.setAttribute('tag', f.tag);
265 if (f.isControlfield()) {
266 if (f.data) f_node.textContent = f.data;
268 f_node.setAttribute('ind1', f.indicator(1));
269 f_node.setAttribute('ind2', f.indicator(2));
270 f.subfields.forEach( function (sf) {
271 var sf_node = doc.createElementNS('http://www.loc.gov/MARC21/slim', 'subfield');
272 sf_node.setAttribute('code', sf[0]);
273 sf_node.textContent = sf[1];
274 f_node.appendChild(sf_node);
278 rec_node.appendChild(f_node);
284 this.toXmlString = function () {
285 return (new XMLSerializer()).serializeToString( this.toXmlDocument() );
288 this.fromBreaker = function (marctxt) {
291 function cf_line_data (l) { return l.substring(4) || '' };
292 function df_line_data (l) { return l.substring(6) || '' };
293 function line_tag (l) { return l.substring(0,3) };
294 function df_ind1 (l) { return l.substring(4,5).replace('\\',' ') };
295 function df_ind2 (l) { return l.substring(5,6).replace('\\',' ') };
296 function isControlField (l) {
298 return (x == 'LDR' || x < '010') ? true : false;
301 var lines = marctxt.replace(/^=/gm,'').split('\n');
302 lines.forEach(function (current_line, ind) {
304 if (current_line.match(/^#/)) {
305 // skip comment lines
306 } else if (isControlField(current_line)) {
307 if (line_tag(current_line) == 'LDR') {
308 me.leader = cf_line_data(current_line) || '00000cam a2200205Ka 4500';
313 tag : line_tag(current_line),
314 data : cf_line_data(current_line).replace('\\',' ','g'),
319 if (current_line.substring(4,5) == me.delimiter) // add indicators if they were left out
320 current_line = current_line.substring(0,3) + ' \\\\' + current_line.substring(4);
322 var data = df_line_data(current_line);
323 if (!(data.substring(0,1) == me.delimiter)) data = me.delimiter + 'a' + data;
325 var local_delimiter = me.delimiter;
326 if (data.indexOf('\u2021') > -1)
327 local_delimiter = '\u2021';
329 var sf_list = data.split(local_delimiter);
335 tag : line_tag(current_line),
336 ind1 : df_ind1(current_line),
337 ind2 : df_ind2(current_line),
338 subfields : sf_list.map( function (sf, i) {
339 var sf_data = sf.substring(1);
340 if (local_delimiter == '$') sf_data = sf_data.replace(/\{dollar\}/g, '$');
341 return [ sf.substring(0,1), sf_data, i ];
348 for (var j = 0; j < this.fields.length; j++) {
349 this.fields[j].position = j;
356 this.pruneEmptyFieldsAndSubfields = function() {
358 var fields_to_remove = [];
359 for (var i = 0; i < this.fields.length; i++) {
360 var f = this.fields[i];
361 if (f.isControlfield()) {
363 fields_to_remove.push(f);
366 f.pruneEmptySubfields();
367 if (f.isEmptyDatafield()) {
368 fields_to_remove.push(f);
372 fields_to_remove.forEach(function(f) {
377 this.toBreaker = function () {
380 var mtxt = '=LDR ' + this.leader + '\n';
382 mtxt += this.fields.map( function (f) {
383 if (f.isControlfield()) {
384 if (f.data) return '=' + f.tag + ' ' + f.data.replace(' ','\\','g');
387 return '=' + f.tag + ' ' +
388 f.indicator(1).replace(' ','\\') +
389 f.indicator(2).replace(' ','\\') +
390 f.subfields.map( function (sf) {
392 if (me.delimiter == '$') sf_data = sf_data.replace(/\$/g, '{dollar}');
393 return me.delimiter + sf[0] + sf_data;
401 this.recordType = function () {
403 var _t = this.leader.substr(MARC21.Record._ff_pos.Type.ldr.BKS.start, MARC21.Record._ff_pos.Type.ldr.BKS.len);
404 var _b = this.leader.substr(MARC21.Record._ff_pos.BLvl.ldr.BKS.start, MARC21.Record._ff_pos.BLvl.ldr.BKS.len);
406 for (var t in MARC21.Record._recType) {
407 if (_t.match(MARC21.Record._recType[t].Type) && _b.match(MARC21.Record._recType[t].BLvl)) {
411 return 'BKS'; // default
414 this.extractFixedField = function (field, dflt) {
415 if (!MARC21.Record._ff_pos[field]) return null;
417 var _l = this.leader;
418 var _8 = this.field('008').data;
419 var _6 = this.field('006').data;
421 var rtype = this.recordType();
425 if (MARC21.Record._ff_pos[field].ldr && _l) {
426 if (MARC21.Record._ff_pos[field].ldr[rtype]) {
428 MARC21.Record._ff_pos[field].ldr[rtype].start,
429 MARC21.Record._ff_pos[field].ldr[rtype].len
432 } else if (MARC21.Record._ff_pos[field]._8 && _8) {
433 if (MARC21.Record._ff_pos[field]._8[rtype]) {
435 MARC21.Record._ff_pos[field]._8[rtype].start,
436 MARC21.Record._ff_pos[field]._8[rtype].len
441 if (!val && MARC21.Record._ff_pos[field]._6 && _6) {
442 if (MARC21.Record._ff_pos[field]._6[rtype]) {
444 MARC21.Record._ff_pos[field]._6[rtype].start,
445 MARC21.Record._ff_pos[field]._6[rtype].len
454 if (MARC21.Record._ff_pos[field].ldr && MARC21.Record._ff_pos[field].ldr[rtype]) {
455 d = MARC21.Record._ff_pos[field].ldr[rtype].def;
459 if (MARC21.Record._ff_pos[field]._8 && MARC21.Record._ff_pos[field]._8[rtype]) {
460 d = MARC21.Record._ff_pos[field]._8[rtype].def;
464 if (!val && MARC21.Record._ff_pos[field]._6 && MARC21.Record._ff_pos[field]._6[rtype]) {
465 d = MARC21.Record._ff_pos[field]._6[rtype].def;
470 for (var j = 0; j < MARC21.Record._ff_pos[field][p][rtype].len; j++) {
481 this.setFixedField = function (field, value) {
482 if (!MARC21.Record._ff_pos[field]) return null;
484 var _l = this.leader;
485 var _8 = this.field('008').data;
486 var _6 = this.field('006').data;
488 var rtype = this.recordType();
491 if (MARC21.Record._ff_pos[field].ldr && _l) {
492 if (MARC21.Record._ff_pos[field].ldr[rtype]) { // It's in the leader
493 if (value.length > MARC21.Record._ff_pos[field].ldr[rtype].len)
494 value = value.substr(0, MARC21.Record._ff_pos[field].ldr[rtype].len);
495 while (value.length < MARC21.Record._ff_pos[field].ldr[rtype].len)
496 value += MARC21.Record._ff_pos[field].ldr[rtype].def;
498 _l.substring(0, MARC21.Record._ff_pos[field].ldr[rtype].start) +
501 MARC21.Record._ff_pos[field].ldr[rtype].start
502 + MARC21.Record._ff_pos[field].ldr[rtype].len
506 } else if (MARC21.Record._ff_pos[field]._8 && _8) {
507 if (MARC21.Record._ff_pos[field]._8[rtype]) { // Nope, it's in the 008
508 if (value.length > MARC21.Record._ff_pos[field]._8[rtype].len)
509 value = value.substr(0, MARC21.Record._ff_pos[field]._8[rtype].len);
510 while (value.length < MARC21.Record._ff_pos[field]._8[rtype].len)
511 value += MARC21.Record._ff_pos[field]._8[rtype].def;
513 // first ensure that 008 is padded to appropriate length
514 var f008_length = (rtype in MARC21.Record._ff_lengths['008']) ?
515 MARC21.Record._ff_lengths['008'][rtype] :
516 MARC21.Record._ff_lengths['008']['default'];
517 if (_8.length < f008_length) {
518 for (var i = _8.length; i < f008_length; i++) {
522 this.field('008').update(
523 _8.substring(0, MARC21.Record._ff_pos[field]._8[rtype].start) +
526 MARC21.Record._ff_pos[field]._8[rtype].start
527 + MARC21.Record._ff_pos[field]._8[rtype].len
534 if (!done && MARC21.Record._ff_pos[field]._6 && _6) {
535 if (MARC21.Record._ff_pos[field]._6[rtype]) { // ok, maybe the 006?
536 if (value.length > MARC21.Record._ff_pos[field]._6[rtype].len)
537 value = value.substr(0, MARC21.Record._ff_pos[field]._6[rtype].len);
538 while (value.length < MARC21.Record._ff_pos[field]._6[rtype].len)
539 value += MARC21.Record._ff_pos[field]._6[rtype].def;
540 this.field('006').update(
541 _6.substring(0, MARC21.Record._ff_pos[field]._6[rtype].start) +
544 MARC21.Record._ff_pos[field]._6[rtype].start
545 + MARC21.Record._ff_pos[field]._6[rtype].len
556 this.delimiter = MARC21.Record.delimiter ? MARC21.Record.delimiter : '\u2021';
557 this.leader = '00000cam a2200205Ka 4500';
559 if (kwargs.delimiter) this.delimiter = kwargs.delimiter;
560 if (kwargs.onLoad) this.onLoad = kwargs.onLoad;
563 //this.fromXmlURL(kwargs.url);
564 } else if (kwargs.marcxml) {
565 this.fromXmlString(kwargs.marcxml);
566 if (this.onLoad) this.onLoad();
567 } else if (kwargs.xml) {
568 this.fromXmlDocument(kwargs.xml);
569 if (this.onLoad) this.onLoad();
570 } else if (kwargs.marcbreaker) {
571 this.fromBreaker(kwargs.marcbreaker);
572 if (this.onLoad) this.onLoad();
575 if (kwargs.rtype == 'AUT') {
576 this.setFixedField('Type','z');
580 Field : function (kwargs) {
581 if (!kwargs) kwargs = {};
583 this.subfield = function (code, wantarray) {
584 var list = this.subfields.filter( function (s) {
585 if (s[0] == code) return true; return false;
587 if (!wantarray && list.length == 1) return list[0];
591 this.addSubfields = function () {
592 for (var i = 0; i < arguments.length; i++) {
593 var code = arguments[i];
594 var value = arguments[++i];
595 this.subfields.push( [ code, value ] );
599 this.deleteExactSubfields = function () {
603 for ( var i in arguments ) {
604 var f = arguments[i];
605 for (var j = 0; j < me.subfields.length; j++) {
606 if (f === me.subfields[j]) {
607 me.subfields.splice(j,1);
612 if (done && me.subfields[j])
613 me.subfields[j][2] -= 1;
620 this.deleteSubfields = function (c) {
621 return this.deleteSubfield( { code : c } );
624 this.deleteSubfield = function (args) {
626 if (!Array.isArray( args.code )) {
627 args.code = [ args.code ];
630 if (args.pos && !Array.isArray( args.pos )) {
631 args.pos = [ args.pos ];
634 for (var i = 0; i < args.code.length; i++) {
636 for (var j = 0; j < me.subfields.length; j++) {
637 if (me.subfields[j][0] == args.code[i]) {
639 if (!sub_pos[args.code[i]]) sub_pos[args.code[j]] = 0;
640 else sub_pos[args.code[i]]++;
643 for (var k = 0; k < args.pos.length; k++) {
644 if (sub_pos[args.code[i]] == args.pos[k]) me.subfields.splice(j,1);
646 } else if (args.match && me.subfields[j][1].match( args.match )) {
647 me.subfields.splice(j,1);
649 me.subfields.splice(j,1);
656 this.update = function ( args ) {
657 if (this.isControlfield()) {
660 if (args.ind1) this.ind1 = args.ind1;
661 if (args.ind2) this.ind2 = args.ind2;
662 if (args.tag) this.tag = args.tag;
664 for (var i in args) {
665 if (i == 'tag' || i == 'ind1' || i == 'ind2') continue;
667 this.subfields.forEach( function (f) {
668 if (!done && f[0] == i) {
677 this.isControlfield = function () {
678 return this.tag < '010' ? true : false;
681 this.pruneEmptySubfields = function () {
682 if (this.isControlfield()) return;
684 var subfields_to_remove = [];
685 this.subfields.forEach( function(f) {
687 subfields_to_remove.push(f);
690 subfields_to_remove.forEach(function(f) {
691 me.deleteExactSubfields(f);
694 this.isEmptyDatafield = function () {
695 if (this.isControlfield()) return false;
697 this.subfields.forEach( function(f) {
698 if (isEmpty && f[1] != '') {
705 this.indicator = function (num, value) {
706 if (value !== undefined) {
707 if (num == 1) this.ind1 = value;
708 else if (num == 2) this.ind2 = value;
709 else { this.error = true; return null; }
711 if (num == 1) return this.ind1;
712 else if (num == 2) return this.ind2;
713 else { this.error = true; return null; }
717 this.record = null; // MARC record pointer
718 this.tag = ''; // MARC tag
719 this.ind1 = ' '; // MARC indicator 1
720 this.ind2 = ' '; // MARC indicator 2
721 this.data = ''; // MARC data for a controlfield element
722 this.subfields = []; // list of MARC subfields for a datafield element
724 this.position = kwargs.position;
725 this.record = kwargs.record;
726 this.tag = kwargs.tag;
727 this.ind1 = kwargs.ind1 || ' ';
728 this.ind2 = kwargs.ind2 || ' ';
729 this.data = kwargs.data;
731 if (kwargs.subfields) this.subfields = kwargs.subfields;
732 else this.subfields = [];
737 MARC21.Record._recType = {
738 BKS : { Type : /[at]{1}/, BLvl : /[acdm]{1}/ },
739 SER : { Type : /[a]{1}/, BLvl : /[bsi]{1}/ },
740 VIS : { Type : /[gkro]{1}/, BLvl : /[abcdmsi]{1}/ },
741 MIX : { Type : /[p]{1}/, BLvl : /[cdi]{1}/ },
742 MAP : { Type : /[ef]{1}/, BLvl : /[abcdmsi]{1}/ },
743 SCO : { Type : /[cd]{1}/, BLvl : /[abcdmsi]{1}/ },
744 REC : { Type : /[ij]{1}/, BLvl : /[abcdmsi]{1}/ },
745 COM : { Type : /[m]{1}/, BLvl : /[abcdmsi]{1}/ },
746 AUT : { Type : /[z]{1}/, BLvl : /.{1}/ },
747 MFHD : { Type : /[uvxy]{1}/, BLvl : /.{1}/ }
750 MARC21.Record._ff_lengths = {
757 MARC21.Record._ff_pos = {
760 SCO : {start: 24, len : 6, def : ' ' },
761 REC : {start: 24, len : 6, def : ' ' }
764 SCO : {start: 7, len : 6, def : ' ' },
765 REC : {start: 7, len : 6, def : ' ' }
770 SER : {start : 33, len : 1, def : ' ' }
773 SER : {start : 16, len : 1, def : ' ' }
778 BKS : {start : 22, len : 1, def : ' ' },
779 SER : {start : 22, len : 1, def : ' ' },
780 VIS : {start : 22, len : 1, def : ' ' },
781 SCO : {start : 22, len : 1, def : ' ' },
782 REC : {start : 22, len : 1, def : ' ' },
783 COM : {start : 22, len : 1, def : ' ' }
786 BKS : {start : 5, len : 1, def : ' ' },
787 SER : {start : 5, len : 1, def : ' ' },
788 VIS : {start : 5, len : 1, def : ' ' },
789 SCO : {start : 5, len : 1, def : ' ' },
790 REC : {start : 5, len : 1, def : ' ' },
791 COM : {start : 5, len : 1, def : ' ' }
796 BKS : {start : 34, len : 1, def : ' ' }
799 BKS : {start : 17, len : 1, def : ' ' }
804 BKS : {start : 7, len : 1, def : 'm' },
805 SER : {start : 7, len : 1, def : 's' },
806 VIS : {start : 7, len : 1, def : 'm' },
807 MIX : {start : 7, len : 1, def : 'c' },
808 MAP : {start : 7, len : 1, def : 'm' },
809 SCO : {start : 7, len : 1, def : 'm' },
810 REC : {start : 7, len : 1, def : 'm' },
811 COM : {start : 7, len : 1, def : 'm' }
816 SCO : {start : 18, len : 2, def : 'uu'},
817 REC : {start : 18, len : 2, def : 'uu'}
820 SCO : {start : 1, len : 2, def : 'uu'},
821 REC : {start : 1, len : 2, def : 'uu'}
826 BKS : {start : 29, len : 1, def : '0' },
827 SER : {start : 29, len : 1, def : '0' }
830 BKS : {start : 11, len : 1, def : '0' },
831 SER : {start : 11, len : 1, def : '0' }
836 BKS : {start : 24, len : 4, def : ' ' },
837 SER : {start : 25, len : 3, def : ' ' }
840 BKS : {start : 7, len : 4, def : ' ' },
841 SER : {start : 8, len : 3, def : ' ' }
846 MAP : {start: 25, len : 1, def : 'a' }
849 MAP : {start : 8, len : 1, def : 'a' }
854 BKS : {start : 8, len : 1, def : ' ' },
855 SER : {start : 8, len : 1, def : ' ' },
856 VIS : {start : 8, len : 1, def : ' ' },
857 MIX : {start : 8, len : 1, def : ' ' },
858 MAP : {start : 8, len : 1, def : ' ' },
859 SCO : {start : 8, len : 1, def : ' ' },
860 REC : {start : 8, len : 1, def : ' ' },
861 COM : {start : 8, len : 1, def : ' ' }
866 BKS : {start : 15, len : 3, def : ' ' },
867 SER : {start : 15, len : 3, def : ' ' },
868 VIS : {start : 15, len : 3, def : ' ' },
869 MIX : {start : 15, len : 3, def : ' ' },
870 MAP : {start : 15, len : 3, def : ' ' },
871 SCO : {start : 15, len : 3, def : ' ' },
872 REC : {start : 15, len : 3, def : ' ' },
873 COM : {start : 15, len : 3, def : ' ' }
878 BKS : {start : 7, len : 4, def : ' ' },
879 SER : {start : 7, len : 4, def : ' ' },
880 VIS : {start : 7, len : 4, def : ' ' },
881 MIX : {start : 7, len : 4, def : ' ' },
882 MAP : {start : 7, len : 4, def : ' ' },
883 SCO : {start : 7, len : 4, def : ' ' },
884 REC : {start : 7, len : 4, def : ' ' },
885 COM : {start : 7, len : 4, def : ' ' }
890 BKS : {start : 11, len : 4, def : ' ' },
891 SER : {start : 11, len : 4, def : '9' },
892 VIS : {start : 11, len : 4, def : ' ' },
893 MIX : {start : 11, len : 4, def : ' ' },
894 MAP : {start : 11, len : 4, def : ' ' },
895 SCO : {start : 11, len : 4, def : ' ' },
896 REC : {start : 11, len : 4, def : ' ' },
897 COM : {start : 11, len : 4, def : ' ' }
902 BKS : {start : 18, len : 1, def : ' ' },
903 SER : {start : 18, len : 1, def : ' ' },
904 VIS : {start : 18, len : 1, def : ' ' },
905 MIX : {start : 18, len : 1, def : ' ' },
906 MAP : {start : 18, len : 1, def : ' ' },
907 SCO : {start : 18, len : 1, def : ' ' },
908 REC : {start : 18, len : 1, def : ' ' },
909 COM : {start : 18, len : 1, def : ' ' }
914 BKS : {start : 6, len : 1, def : ' ' },
915 SER : {start : 6, len : 1, def : 'c' },
916 VIS : {start : 6, len : 1, def : ' ' },
917 MIX : {start : 6, len : 1, def : ' ' },
918 MAP : {start : 6, len : 1, def : ' ' },
919 SCO : {start : 6, len : 1, def : ' ' },
920 REC : {start : 6, len : 1, def : ' ' },
921 COM : {start : 6, len : 1, def : ' ' }
926 BKS : {start : 17, len : 1, def : ' ' },
927 SER : {start : 17, len : 1, def : ' ' },
928 VIS : {start : 17, len : 1, def : ' ' },
929 MIX : {start : 17, len : 1, def : ' ' },
930 MAP : {start : 17, len : 1, def : ' ' },
931 SCO : {start : 17, len : 1, def : ' ' },
932 REC : {start : 17, len : 1, def : ' ' },
933 COM : {start : 17, len : 1, def : ' ' },
934 AUT : {start : 17, len : 1, def : 'n' },
935 MFHD : {start : 17, len : 1, def : 'u' }
940 SER : {start : 24, len : 1, def : ' '}
943 SER : {start : 7, len : 1, def : ' '}
948 BKS : {start : 30, len : 1, def : '0' }
951 BKS : {start : 13, len : 1, def : '0' }
956 COM : {start: 26, len : 1, def : 'u' }
959 COM : {start: 9, len : 1, def : 'u' }
964 SCO : {start : 20, len : 1, def : 'u'},
965 REC : {start : 20, len : 1, def : 'n'}
968 SCO : {start : 3, len : 1, def : 'u'},
969 REC : {start : 3, len : 1, def : 'n'}
974 BKS : {start : 23, len : 1, def : ' ' },
975 SER : {start : 23, len : 1, def : ' ' },
976 VIS : {start : 29, len : 1, def : ' ' },
977 MIX : {start : 23, len : 1, def : ' ' },
978 MAP : {start : 29, len : 1, def : ' ' },
979 SCO : {start : 23, len : 1, def : ' ' },
980 REC : {start : 23, len : 1, def : ' ' }
983 BKS : {start : 6, len : 1, def : ' ' },
984 SER : {start : 6, len : 1, def : ' ' },
985 VIS : {start : 12, len : 1, def : ' ' },
986 MIX : {start : 6, len : 1, def : ' ' },
987 MAP : {start : 12, len : 1, def : ' ' },
988 SCO : {start : 6, len : 1, def : ' ' },
989 REC : {start : 6, len : 1, def : ' ' }
994 SER : {start : 18, len : 1, def : ' '}
997 SER : {start : 1, len : 1, def : ' '}
1002 BKS : {start : 28, len : 1, def : ' ' },
1003 SER : {start : 28, len : 1, def : ' ' },
1004 VIS : {start : 28, len : 1, def : ' ' },
1005 MAP : {start : 28, len : 1, def : ' ' },
1006 COM : {start : 28, len : 1, def : ' ' }
1009 BKS : {start : 11, len : 1, def : ' ' },
1010 SER : {start : 11, len : 1, def : ' ' },
1011 VIS : {start : 11, len : 1, def : ' ' },
1012 MAP : {start : 11, len : 1, def : ' ' },
1013 COM : {start : 11, len : 1, def : ' ' }
1018 BKS : {start : 18, len : 4, def : ' ' }
1021 BKS : {start : 1, len : 4, def : ' ' }
1026 BKS : {start : 31, len : 1, def : '0' },
1027 MAP : {start : 31, len : 1, def : '0' }
1030 BKS : {start : 14, len : 1, def : '0' },
1031 MAP : {start : 14, len : 1, def : '0' }
1036 MFHD : {start : 18, len : 1, def : 'i' }
1041 BKS : {start : 35, len : 3, def : ' ' },
1042 SER : {start : 35, len : 3, def : ' ' },
1043 VIS : {start : 35, len : 3, def : ' ' },
1044 MIX : {start : 35, len : 3, def : ' ' },
1045 MAP : {start : 35, len : 3, def : ' ' },
1046 SCO : {start : 35, len : 3, def : ' ' },
1047 REC : {start : 35, len : 3, def : ' ' },
1048 COM : {start : 35, len : 3, def : ' ' }
1053 BKS : {start : 33, len : 1, def : '0' }
1056 BKS : {start : 16, len : 1, def : '0' }
1061 SCO : {start : 30, len : 2, def : 'n'},
1062 REC : {start : 30, len : 2, def : ' '}
1065 SCO : {start : 13, len : 2, def : 'n'},
1066 REC : {start : 13, len : 2, def : ' '}
1071 BKS : {start : 38, len : 1, def : ' ' },
1072 SER : {start : 38, len : 1, def : ' ' },
1073 VIS : {start : 38, len : 1, def : ' ' },
1074 MIX : {start : 38, len : 1, def : ' ' },
1075 MAP : {start : 38, len : 1, def : ' ' },
1076 SCO : {start : 38, len : 1, def : ' ' },
1077 REC : {start : 38, len : 1, def : ' ' },
1078 COM : {start : 38, len : 1, def : ' ' }
1083 SER : {start : 22, len : 1, def : ' '}
1086 SER : {start: 5, len : 1, def: ' '}
1091 SCO : {start : 21, len : 1, def : ' '},
1092 REC : {start : 21, len : 1, def : 'n'}
1095 SCO : {start : 4, len : 1, def : ' '},
1096 REC : {start : 4, len : 1, def : 'n'}
1101 MAP : {start : 22, len : 2, def : ' ' }
1104 MAP: {start : 5, len : 2, def : ' ' }
1109 BKS : {start : 5, len : 1, def : 'n' },
1110 SER : {start : 5, len : 1, def : 'n' },
1111 VIS : {start : 5, len : 1, def : 'n' },
1112 MIX : {start : 5, len : 1, def : 'n' },
1113 MAP : {start : 5, len : 1, def : 'n' },
1114 SCO : {start : 5, len : 1, def : 'n' },
1115 REC : {start : 5, len : 1, def : 'n' },
1116 COM : {start : 5, len : 1, def : 'n' },
1117 MFHD: {start : 5, len : 1, def : 'n' },
1118 AUT : {start : 5, len : 1, def : 'n' }
1123 SER : {start : 19, len : 1, def : ' '}
1126 SER : {start : 2, len : 1, def : ' '}
1131 MAP : {start: 18, len : 4, def : ' '}
1134 MAP : {start: 1, len : 4, def : ' '}
1139 SER : {start : 34, len : 1, def : '0' }
1142 SER : {start : 17, len : 1, def : '0' }
1147 MAP : {start: 33, len : 2, def : ' ' }
1150 MAP : {start: 16, len : 2, def : ' '}
1155 BKS : {start : 39, len : 1, def : 'd' },
1156 SER : {start : 39, len : 1, def : 'd' },
1157 VIS : {start : 39, len : 1, def : 'd' },
1158 SCO : {start : 39, len : 1, def : 'd' },
1159 REC : {start : 39, len : 1, def : 'd' },
1160 COM : {start : 39, len : 1, def : 'd' },
1161 MFHD : {start : 39, len : 1, def : 'd' },
1162 "AUT" : {"start" : 39, "len" : 1, "def" : 'd' }
1167 SER : {start : 21, len : 1, def : ' '}
1170 SER : {start : 4, len : 1, def : ' '}
1175 VIS : {start : 34, len : 1, def : ' '}
1178 VIS : {start : 17, len : 1, def : ' '}
1183 VIS : {start : 18, len : 3, def : ' '}
1186 VIS : {start : 1, len : 3, def : ' '}
1191 VIS : {start : 33, len : 1, def : ' ' }
1194 VIS : {start : 16, len : 1, def : ' ' }
1199 SCO : {start : 33, len : 1, def : ' ' },
1200 REC : {start : 33, len : 1, def : 'n' }
1203 SCO : {start : 16, len : 1, def : ' ' },
1204 REC : {start : 16, len : 1, def : 'n' }
1209 BKS : {start : 6, len : 1, def : 'a' },
1210 SER : {start : 6, len : 1, def : 'a' },
1211 VIS : {start : 6, len : 1, def : 'g' },
1212 MIX : {start : 6, len : 1, def : 'p' },
1213 MAP : {start : 6, len : 1, def : 'e' },
1214 SCO : {start : 6, len : 1, def : 'c' },
1215 REC : {start : 6, len : 1, def : 'i' },
1216 COM : {start : 6, len : 1, def : 'm' },
1217 AUT : {start : 6, len : 1, def : 'z' },
1218 MFHD : {start : 6, len : 1, def : 'y' }
1223 "AUT" : {"start" : 6, "len" : 1, "def" : ' ' }
1228 "AUT" : {"start" : 7, "len" : 1, "def" : ' ' }
1233 "AUT" : {"start" : 8, "len" : 1, "def" : ' ' }
1238 "AUT" : {"start" : 9, "len" : 1, "def" : ' ' }
1243 "AUT" : {"start" : 10, "len" : 1, "def" : ' ' }
1248 "AUT" : {"start" : 11, "len" : 1, "def" : ' ' }
1253 "AUT" : {"start" : 12, "len" : 1, "def" : ' ' }
1258 "AUT" : {"start" : 13, "len" : 1, "def" : ' ' }
1263 "AUT" : {"start" : 14, "len" : 1, "def" : ' ' }
1268 "AUT" : {"start" : 15, "len" : 1, "def" : ' ' }
1273 "AUT" : {"start" : 16, "len" : 1, "def" : ' ' }
1278 "AUT" : {"start" : 17, "len" : 1, "def" : ' ' }
1283 "AUT" : {"start" : 28, "len" : 1, "def" : ' ' }
1288 "AUT" : {"start" : 29, "len" : 1, "def" : ' ' }
1293 "AUT" : {"start" : 31, "len" : 1, "def" : ' ' }
1298 "AUT" : {"start" : 32, "len" : 1, "def" : ' ' }
1303 "AUT" : {"start" : 33, "len" : 1, "def" : ' ' }
1308 "AUT" : {"start" : 38, "len" : 1, "def" : ' ' }
1313 "AUT" : {"start" : 39, "len" : 1, "def" : ' ' }