IMD 1.16: 1/09/2008 12:57:13 84-93467-03 e700 f46703 cnc cartos interface maintenance diskette 5feb82  ž ªªž @0‚|†ø)®wÂwЀЀÎtQº®q¦l) ˆ " ž}‚gÿA ¢`œžúž¼žöšè,Mˆ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IOS4 €MÁúE481111714574100811117145741 811117145741?F46703 VOLCARTOS CNC MAINTENANCE DISKETTE 84-93467-03 E700   ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’Ižúž¼žöšè,Mˆ@†jæjg€ÿígÿèÂg@ †o G€ÿò`úkžŽ¾ôž¾¢_„C# b# ž}€BŸ€ žuÒ[¾æ žþž]e‡ †JÂR¾­æði¾òÀˆÆCÆCp@€„†<€…†;€††:€ƒ †FÂ8P@ G€ÿÁÆ;à‰¾•NÆêP¾éâ×èCHùC €ˆC ˜GÈTºà€qEžç‚â¢'ŸÉž¦ *¦Ã C¦¦ÏŸxÆžì @0DAJ÷LÆ )®ê‘ЀЀΎQBžxªâ" ¦† i¾¦€„œªª+⟠fžE¾ùžB)3žß `jmBˆB¾ I,Ÿv ¾ °¾€B¾ I,ŸmžÊ ž @¬E°E¨F¤F)¤D¾^ÄE‚‚„Fž% †ÊæjHÿÆÄÆÄ@pÆO¾ÄŸv g€ÿ7gÿ4ò]X¾] P¢hâV+ì„s=è„胾cžÆ_†N‚£ ž‡žôŠGŠF¾Öž†›¾ÁžØ¾ø ¦•“@AúLèSÃ)"$ C ž‰žkžøª1žïŠ/žjŠ-ž žhÿöÿÿ ‚p ž…âv¾R†Ÿw ÞpÞpžwâ‚p¾ Þkâižº† ’ŸÂ¢œ€15 !¦^æ\žd ²X‚ žˆò %€À'+ò²NŸs愾Qâ‚)žs ‡EÞDŸ|Ÿ{ @ž$ ož¶ Ož¯ mž­ Jž« Kž© iž¸ gž¶†. žV tž²žì„sFè„n`" FàEžD)ž ¾E`¾CnrgŸy ¾w"¾NÞž{žR¾q1¾HÞ ž}žL¾2`¾0t¾žG¾- ²B¾c ¾(Þ>Þ=Þ<žy¦:ž;¾!ž9¾ü¾/ž5OS:: SYSž¦ž"ªªiüþŒþ‹Âwþ‹þŠÂvc Bc A@6<# þIc B# ÞgIþjHÀc r‡Ÿc ·œ‡›Þš# @0‚X†ß)P ®VÂVЀЀÎSQº®P¦‹pI þN@615++OPTENTRY OPTENTRY SET #(2)<00++OPTENTRY IFF OPTENTRY WORD #(2)%4 ENDC IFT OPTENTRY WORD #(2) ENDC * ENDC ENDM * SPACE 1 ** * FUNCTION: GENERATE MESSAGE WITH BYTE COUNT IN FRONT ** MSG MACRO SIZE SET !END-$-1*2 WORD SIZE BYTE #1,CR: !END EQU $ ENDM * * ** * FUNCTION: SET BYTEMODE ** BYTEMODE MACRO SBIT BY:,S ENDM * ** * FUNCTION: SET WORD MODE ** WORDMODE MACRO RBIT BY:,S ENDM * * IOBINT MACRO COPY =#(1),X COPY =#(2),A COPY =#(3),Q JSK IOBINT ENDM * TABLINIT MACRO IOBINT #(1)+IOBBLK,#(2),#(3) SUB =IOBBLK,X JSK TABLINIT ENDM * DEFIO MACRO COPY =#(1),X COPY #(2),A JSK DEFIO ENDM * OPENFL MACRO OPENFL CLOSFL MACENT CLOSFL COPY =#(1),X IFT #(0,'OPENFL') COPY =#(2),A ENDC JSK #(0) ENDM * MOVBLK MACRO COPY =#(1),A COPY =#(2),X JSK MOVBLK ENDM * DRES MACRO #(1) EQU OFFSET OFFSET SET OFFSET+#(2) ENDM * R:GATD MACRO R:GTOD R:CTODA #(1) ENDM TITL TEMPORARY MACROS E:ISM  MACRO I:ISM #(1) ENDM * E:GFN MACRO COPY:M DIRLUN(Y),A,GF:DUN+#(1) COPY:M =0,A,GF:DFUN+#(1)   I:GFN #(1) ENDM TITL E Q U A T E S ** INPLUN EQU :1000 STANDARD INPUT FILE LUN ** IOBLEN EQU 8 BLKLEN EQU 22 BUFLEN EQU 40 OUTDEV EQU GF:PROT+1 INPDEV EQU OUTDEV NAMBEG EQU GF:FBUF NAMEXT EQU GF:FBUF+5 MAXREC EQU BUFLEN*2 FIBBLK EQU BLKLEN IOBBLK EQU FIBBLK+FIBLEN FIBLEN EQU 16 INPIDX EQU IOBLEN+2 IOBUF EQU INPIDX+1 * * NEW EQUATES * CR: EQU :D PROMTLEN EQU 6 LAST:P EQU 0 LAST:A EQU 2 LAST:Q EQU 3 LAST:X EQU 4 GFF:FNB EQU 7 GFF:SEB EQU 0 GFF:DIRB EQU 2 GFF:JLUB EQU 8 * * CNC EQUATES * STKSIZ EQU :100 SPACE FOR SYSTEM STACK ( K --> L ) E:DEV EQU 3 DEVICE ERROR CODE E:EOF EQU 1 END OF FILE ERROR CODE DEFPGSZ EQU :4827 DEFAULT PAGE SIZE IS 72 ACROSS AND 39 DOWN * * I:IO OPERATION CODES * CLOSE EQU FU:%4++CL:++ER: COMPLUNS EQU CO:%4++COL: COMPARE 2 LUNS CONNECT EQU CO:%4++CON:++ER: CONNECT LUN (REPLACEMENT) DSCONECT EQU DC:%4 DISCONNECT LUN OPEN EQU FU:%4++OP: READFA EQU RE:%4++FA: READFIB EQU FU:%4++RIB: READ FIB WRITEFA EQU WR:%4++FA: WRITEPR EQU WR:%4++WP: READ:ANY EQU OPSEQ:++OPFIL:++OPRE: OPEN FOR ANY FILE TYPE (READ) WRITEANY EQU OPSEQ:++OPFIL:++OPWR: " " " " " (WRITE) WRITEAPP EQU OPSEQ:++OPFIL:++OPEX: " " " " " (WRITE-APPEND) TITL Y - D A T A R E G I O N OFFSET SET 0 DRES NOFLG,1 DRES CUROPT,1 DRES PGPARMS,1 DRES APPEND,1 DRES LISTFLAG,1 DRES ABORTK,1 DRES DIRLUN,1 DRES BACKUP,1 DRES CLINFLAG,1 DRES TEMPA,1 DRES TEMPB,1 DRES WRKBLK,BLKLEN  DRES ISMBLK,18 DRES INPBLK,BLKLEN DRES INPFIB,FIBLEN DRES INPIOB,IOBLEN DRES INPCFI,2 DRES INPTMP,1 DRES INPBUF,BUFLEN+10 DRES LSTBLK,BLKLEN DRES LSTFIB,FIBLEN DRES LSTIOB,IOBLEN DRES LSTCFI,2 DRES LSTTMP,1 DRES LSTBUF,67 DRES CMDIOB,IOBLEN DRES CMDCFI,2 DRES CMDTMP,1 DRES OPRIOB,IOBLEN DRES OPRCFI,2 DRES OPRTMP,1 DRES OPRBUF,BUFLEN DRES YSIZ,0 * * * * G:Z NAM G:Z START: EQU $ OE:START EQU $ SPACE 1 COPY =0,Q > COPY =OE:CNC,X > COPYE Q,:A0(X) > REMOVE SELP X,0 INSTRUCTION FROM CNC BODY SPACE 1 JMP START * * * * TITL O P E N F L & C L O S F L --- OPEN AND CLOSE FILES ** * FUNCTION: OPEN A FILE * * ENTRY: A = OPEN FUNCTION OPERAND * X = ADDRESS OF IOB * JSK OPENFL * * EXIT: Q = -1 IF ERROR, +VE OTHERWISE * RSK ** OPENFL EQU $ COPY A,IO:FOP(Y,X) SET FUNCTION OPERAND COPY:M =OPEN,Q,IO:FC(Y,X) I:IO 0(Y,X) COPY =-1,Q IF TROUBLE COPY:M =0,A,IO:BCT(Y,X) COPY Y,A ADD X,A ADD =IOBUF,A COPY A,IO:BUF(Y,X) SETUP BUFFER ADDRESS RSK SPACE 3 ** * FUNCTION: CLOSE A FILE * * ENTRY: X = ADDRESS OF IOB * JSK CLOSFL * * EXIT: Q = -1 IF ERROR, +VE OTHERWISE * RSK ** CLOSFL EQU $ COPY:M =CLOSE,Q,IO:FC(Y,X) I:IO 0(Y,X) JMP CLOSERR COPY IO:LUN(Y,X),Q CLSN Q,='O' RSK DON'T TRY TO DISCONNECT 'LO' COPY:M =DSCONECT,Q,IO: FC(Y,X) I:IO 0(Y,X) DISCONNECT LUN CLOSERR EQU $ COPY =-1,Q CLOSRT EQU $ RSK TITL A B O R T ** * FUNCTION: ABORT THE CONCORDANCE AND RETURN TO MDE * * ENTRY: JMP ABORT * * EXIT: NONE (CONTROL IS RETURNED TO MDE VIA E:MONE) ** ABORT EQU $ COPY L,Y SUB =YSIZ+1,Y GET OUR Y BACK, JUST IN CASE COPY:M ABORTK(Y),A,K SET STACK BACK TO LEVEL ONE COPY =OPRIOB,X COPY:M =WRITEFA,A,IO:FC(Y,X) COPY IS:BP+ISMBLK(Y),A LOAD BUFFER POINTER INTO A COPY BACKUP(Y),Q LOAD BACKUP POINTER INTO Q ADD =2,Q COMPUTE BACKUP+2 CSK A,Q COMPARE BP WITH BACKUP+2 JMP ABORT10 IF BP < BACKUP+2, BRANCH AROUND NOP OTHERWISE... COPY IS:TC+ISMBLK(Y),Q CHECK FOR BP AT END OF LINE JNE Q,ABORT11 IF NOT, BRANCH TO CONTINUE JNE A,ABORT11 ELSE, BUMP BP FOR REASONS WHICH BEAR CLOSE SCRUTINY ABORT10 EQU $ COPY Q,A ANOTHER SPECIAL CASE FOR BP < BACKUP+2 ABORT11 EQU $ ADD =PROMTLEN-1,A COPY A,IO:BCT(Y,X) LENGTH IS LAST SCANNED COPY A,X COPY =OPRBUF,A COPY ='?',Q ADD A,Y BYTEMODE COPY Q,0(Y,X) ) FILL BUFFER JNED X,$-1 ) WITH '?' SUB A,Y COPYB 1+BACKUP(Y),X ) ADD =PROMTLEN-1,X ) ADD A,Y ) COPY =' ',Q > FILL UP TO BACKUP WITH ' ' COPYB Q,0(Y,X) ) JNED X,$-1 ) WORDMODE COPY ='+(',Q ASSUME WE'RE GOING TO OVERPRINT NEG A,X SO WE CAN INDEX BACK TO BASE Y-SCRATCH COPY CLINFLAG(Y,X),X LOAD COMMAND FIRST LINE FLAG INTO X JEQ X,$+2 IF FIRST TIME, BRANCH AROUND COPY =' (',Q ELSE, DON'T OVERWRITE COMMAND LINE COPY Q,0(Y) STORE CARRIAGE CONTROL & REV IN FRONT OF BUFFER COPY =REVA,Q " COPY Q,1(Y) " COPY =REVB,Q " COPY Q,2(Y) " COPY =') ',Q " COPY Q,3(Y) " SUB A,Y RESTORE Y-SCRATCH POINTER I:IO OPRIOB(Y) OUTPUT ERROR MESSAGE NOP GOAWAY EQU $ JSK CLEANUP CLOSE ALL FILES E:MONE ABNORMAL EXIT TO MDE SPACE 1 CLEANUP EQU $ CLOSFL INPIOB CLOSFL LSTIOB RSK TITL S E T E X T --- SET EXTENSION ** * FUNCTION: SET EXTENSION INTO FILENAME WORD OF GFN BLOCK * * ENTRY: X = GFNBLOCK * A = FIRST CHAR * Q = SECOND AND THIRD CHARS *  JSK SETEXT * * EXIT: RSK ** SETEXT EQU $ COPY Q,NAMEXT+1(Y,X) PUT IN 2ND & 3RD CHARACTERS ADD  X,X BYTE ADDRESS OFFSET BYTEMODE COPYB A,NAMEXT+1(Y,X) PUT IN 1ST CHARACTER WORDMODE SHIFT X,RO,1 ORIGINAL X RSK R E T U R N LPOOL TITL CHECKTV ** * FUNCTION: CHECK FOR TV INPUT * * ENTRY: JSK CHECKTV * * EXIT: Q = 0 FOR TV DIB * Q<> 0 FOR OTHERS ** CHECKTV EQU $ COPY =INPBLK,X JSK GETCLASS SUB =CLASS:TV,Q RSK LPOOL TITL CHECKLO - GET LINES PER PAGE AND CHARACTERS PER LINE INTO Q REG ** * FUNCTION: CHECK LO DIB FOR LINES PER PAGE AND CHARACTERS PER LINE * * ENTRY : JSK CHECKLO * * EXIT: Q=LINE COUNT (OR ZERO) * ** CHECKLO EQU $ COPY =LSTBLK,X JSK READFIB: GET FIB/DIB FOR 'LO' COPY FI:FRMS+FIBBLK(Y,X),A GET LINES/PAGE ETC. COPY =DEFPGSZ,Q GET DEFAULT VALUE J EQ A,CHECKLOX USE DEFAULTS IF NONE SPECIFIED IN FIB/DIB (?) SHIFT A,RO,8 JNE A,$+2 IF NONE EXISTS, COPY =DEFPGSZ&:FF,A USE THE DEFAULT COPY FI:FRMS+FIBBLK(Y,X),Q GET THE NUMBER OF CHARACTERS/LINE ETC. SHIFT Q,LO,8 PUT INTO LEFT BYTE JNE Q,$+2  JUMP IF ONE IS SPECIFIED FOR THIS DEVICE COPY =DEFPGSZ&:FF00,Q GET THE DEFAULT CHARS PER LINE OR A,Q MERGE BOTH SIZES INTO A SINGLE WORD CHECKLOX RSK RETURN LPOOL TITL M O V B L K ** * FUNCTION: COPY A GFNBLOCK TO ANOTHER * * ENTRY: A = SOURCE BLOCK * X = DESTINATION BLOCK * JSK MOVBLK * * EXIT: RSK ** MOVBLK EQU $ PUSH F:XA: ADD Y,X ADJUST POINTER FOR TO BLOCK ADD =2,X COPY X,TEMPA(Y) ADD Y,A ADJUST POINTER FOR FROM BLOCK ADD =2,A COPY A,TEMPB(Y) COPY =BLKLEN-3,X LOOP COUNTER MOVE1 EQU $  COPY:M *TEMPB(Y,X),A,*TEMPA(Y,X) JNED X,MOVE1 KEEP GOING 'TILL DONE POP RSK R E T U R N  LPOOL TITL G E T C L A S S --- GET DEVICE CLASS FOR LUN GETCLASS EQU $ ENTRY: X=BLK ADDRESS OFFSET; READFIB: EQU $ EXIT: Q=CLASS; OTHER REGS AS ENTRY. SPACE 1 COPY:M =READFIB,Q,IO:FC+IOBBLK(Y,X) FC COPY =FIBBLK,Q ADD Y,Q ADD X,Q EXCH Q,IO:FIB+IOBBLK(Y,X) FIB ADDRESS - SAVE BCT VALUE  I:IO IOBBLK(Y,X) READ FIB FOR CONNECTED LUN NOP COPY Q,IO:BCT+IOBBLK(Y,X) RESTORE BCT VALUE COPY FI:CLAS+FIBBLK(Y,X),Q GET CLASS RSK LPOOL TITL C O N E C T --- CONNECT DEVICE TO UNIT ** * FUNCTION: CONNECT LUN TO DEVICE * * ENTRY: X = GFN BLOCK * A = EXTENSION TABLE (IF 0, TRY NO EXTENSIONS) * JSK CONECT * * EXIT: IF ERROR , Q = -1 * IF NOT, Q = 0 * RSK ** CONECT EQU $ COPY OUTDEV(Y,X),Q GET FILE TYPE FLAG JGE Q,$+2 JMP CONRTN IF ALREADY CONNECTED TBIT 0,Q COPY:M =CONNECT,Q,IO:FC+IOBBLK(Y,X) CONNECT FUNCTION CODE COPY:M GF:NAME(Y,X),Q,FI:NAME+FIBBLK(Y,X) FILENAME ADDRESS JT OV,CON2  IF NOT FILE-TYPE CONNECT COPY:M GF:DUN(Y,X),Q,IO:DUN+IOBBLK(Y,X) DIRECTORY LUN COPY =FIBBLK,Q ADD  Y,Q ADD X,Q COPY Q,IO:FIB+IOBBLK(Y,X) FIB ADDRESS JEQ A,CONERR (NO FILE CREATION ALLOWED)  COPY:M =0,Q,FI:FLG+FIBBLK(Y,X) CLEAR FIB FLAGS COPY GF:FEXTL(Y,X),Q EXTENSION EXISTS FLAG JGE Q,CON1  IF EXTENSION ALREADY GIVEN COPY X,TEMPB(Y) SAVE BLOCK ADDRESS COPY A,X START OF TABLE JMP STRTCN GO START LOOP MORECN EQU $ LOOP FOR FINDING FILE EXTENSION COPY IO:ST+IOBBLK(Y,X),A SUB =X:FMUNKN,A JEQ A,FILENFND ALLOW "FILE NOT FOUND" STATUS JSK UEX  REPORT CONNECT ERROR TO MDE JMP CONECTRY FILENFND EQU $ COPY TEMPA(Y),X CURRENT TABLE POINTER ADD =2,X BUMP TO NEXT TABLE ENTRY STRTCN EQU $ START OF EXTENSION LOOKUP COPY X,TEMPA(Y) PUT BACK CURRENT POINTER COPY 0(X),A 1ST WORD OF EXTENSION COPY 1(X),Q REST OF EXTENSI ON COPY TEMPB(Y),X GET BLOCK ADDRESS JEQ A,CONERR2 IF AT END OF TABLE JSK SETEXT  SET EXTENSION IN TABLE CONECTRY EQU $ I:IO IOBBLK(Y,X) TRY CONNECTION JMP MORECN NO GO  COPY =0,A FILE FOUND AND CONNECTED JMP RTNFND CONERR3 EQU $ COPY IO:ST+IOBBLK(Y,X),A SUB =X:IODNF,A JEQ A,CONERR CONERR2 EQU $ JSK UEX GIVE IO:ST TO MDE CONERR EQU $  WE CAN'T CONNECT FOR SOME REASON COPY =-1,Q ERROR INDICATOR RSK CON1 EQU $ LAST CHANCE TO CONNECT IF EXTENSION GIVEN I:IO IOBBLK(Y,X) TRY CONNECTION JMP CONERR2 COPY =0,A  FILE FOUND AND CONNECTED JMP RTNFND CON2 EQU $ COPY:M =0,Q,IO:FIB+IOBBLK(Y,X) CLEAR FIB ADDRESS IN IOB COPY:M GF:ILUN(Y,X),Q,IO:DUN+IOBBLK(Y,X) I:IO IOBBLK(Y,X) LUN TO LUN CONNECT JMP CONERR3  JSK GETCLASS GET CLASS FOR CONNECTED LUN COPY =1,A SUB =CLASS:FM,Q JNE Q,RTNFND  DEVICE CONNECTED COPY =0,A ASSUME FILE CONNECTED COPY FI:TYPE+FIBBLK(Y,X),Q CLSN Q,=FIV:DIR IF DIRECTORY, COPY =2,A SET FLAG BIT 1 RTNFND EQU $ WE FOUND IT, GO BACK  SBIT 15,A SET CONNECTED FLAG (BIT 15) COPY A,OUTDEV(Y,X) SET UP FILE TYPE CONRTN EQU $  COPY =0,Q OK FLAG RSK LPOOL TITL U E X --- GIVE IO:ST TO MDE UEX EQU $ COPY IO:ST+IOBBLK(Y,X),A R:UEX UEXIT UEXIT EQU $ RSK R E T U R N TITL N E X T C L --- READ NEXT COMMAND LINE NEXTCL EQU $ I:IO CMDIOB(Y) PROMPT FOR NEW COMMAND LINE NOP E:RCI ISMBLK(Y) READ IN NEXT COMMAND LINE COPY:M =0,A,IS:BP+ISMBLK(Y) INITIALISE BUFFER POINTER COPY  A,BACKUP(Y) RESET CURRENT CL INDEX COPY:M =-1,A,CLINFLAG(Y) INDICATE WE'RE PAST THE FIRST LINE RSK TITL N E X T F N --- INPUT NEXT FILE NAME ** * FUNCTION: INPUT THE NEXT FILE NAME * * ENTRY: JSK NEXTFN * * EXIT: Q < 0 IF ERROR * A = 0 IF GOOD RETURN * > 0 IF NO NAME GIVEN (I.E., USING SI) * RSK ** EOLQQ EQU $  COPY =1,A JNE Q,NEXTFNXT JSK NEXTCL GET NEXT COMMAND LINE SPACE 1 NEXTFN EQU $ COPY:M IS:BP+ISMBLK(Y),A,BACKUP(Y) SAVE CURRENT CL INDEX COPY:M =0,A,OUTDEV+WRKBLK(Y) CLEAR RESERVED GFN WORD E:GFN WRKBLK(Y) GET FILE NAME JLT A,NEXTFNER GFN ERROR COPY IS:TC+ISMBLK(Y),Q LOAD TERMINATOR INTO Q TBIT GFF:FNB,A  JT OV,NEXTFN10 IF VALID FILENAME READ TBIT GFF:SEB,A JT OV,EOLQQ IF NOT GOOD FILENAME OR BUFFER EMPTY TBIT GFF:DIRB,A JT OV,NEXTFN20 IF DIRECTORY TBIT GFF:JLUB,A JT OV,NEXTFN30 IF LUN ONLY NEXTFNER EQU $ COPY =-1,Q -1 MEANS INVALID SPECIFICATION RSK NEXTFN10 EQU $  AND =GFF:WC,A JNE A,NEXTFNER IF FILENAME CONTAINS WILD CARD CHARACTER JMP SETDEV NEXTFN20 EQU $   COPY =2,A JMP SETDEV NEXTFN30 EQU $ COPY =1,A SETDEV EQU $ COPY A,INPDEV+WRKBLK(Y) SET FILE/DEVICE FLAG COPY =0,A GOOD RETURN NEXTFNXT EQU $ RSK LPOOL TITL D E F I O  --- SET UP DEFAULT I/O ** * FUNCTION: DEFINE DEFAULT I/O BLOCK INFO * * ENTRY: A = DEFAULT LUN * X = GFN BLOCK *  JSK DEFIO * * EXIT: RSK (REGISTERS RESTORED) ** DEFIO EQU $ COPY A,GF:ILUN(Y,X) STORE DEFAULT LUN FOR CONNECT  COPY:M =1,A,OUTDEV(Y,X) LUN TO LUN CONNECTION REQUIRED JSK CONECT CONNECT WORKING TO DEFAULT LUN  RSK R E T U R N LPOOL TITL G E T S I --- GET USER TO ASSIGN SI LUN GETSI EQU $ PUSH  F:XA: COPY:M IO:DUN+IOBBLK(Y,X),A,LUNINMES COPY ASIGNLUN,A COPY =1,Q UC DEVICE NUMBER COPY =ASIGNLUN+1,X JSK O:MSG ASK USER TO ASSIGN LUN COPY =CR:,A COPY =1,X JSK O:IO POP JSK UEX GIVE IO STATUS TO MDE RSK R E T U R N SPACE 1 ASIGNLUN WORD ASIGNLEN BYTE ' ASSIGN ' LUNINMES WORD 0 BYTE ' LUN: THEN TYPE REENTER ' ASIGNLEN EQU $-ASIGNLUN*2-2 LPOOL TITL A P P R O C --- APPEND LIST FILE PROCESSOR ** * FUNCTION: ANALYSE "APPEND" * ** APPROC EQU $  COPY NOFLG(Y),A GET 'NO' OPTION FLAG JNE A,APP1 BRANCH IF 'NO' DIDN'T PRECEDE THIS COPY =WRITEANY,A OVERWRITE FILE CONTENTS JMP $+2 APP1 EQU $ MUST APPEND TO EXISTING FILE CONTENTS  COPY =WRITEAPP,A COPY A,APPEND(Y) SET APPROPRIATE 'OPEN' FUNCTION OPERAND JMP DPT2A ALL DONE, SO GO ON TITL P A G E P R O --- PAGESIZE PROCESSOR ** * FUNCTION: ANALYZE "PAGESIZE=N[*M]" * ** PAGEPRO EQU $ COPY NOFLG(Y),A GET 'NO' OPTION FLAG JNE A,PAGESIZE BRANCH IF 'NO' DIDN'T PRECEDE THIS COPY:M =DEFPGSZ,A,PGPARMS(Y) USE THE DEFAULT SIZES JMP DPT2A * PAGESIZE EQU $ HANDLE PAGE SIZE PARAMETERS COPY IS:TC+ISMBLK(Y),Q GET CHARACTER WHICH TERMINATED OPTION SUB ='=',Q IF IT IS NOT '=', WE HAVE AN ERROR JNE Q,PAGERR E:ISM ISMBLK(Y) LOOK FOR A NUMERIC ARGUMENT COPY IS:DF+ISMBLK(Y),A SEE IF DECIMAL NUMBER WAS GIVEN JEQ A,$+3 IF SO, USE THE GIVEN ONE COPY =DEFPGSZ&:FF,A OTHERWISE, GET DEFAULT NUMBER OF LINES JMP $+2 COPY IS:DV+ISMBLK(Y),A USE HIS VALUE COPY A,PGPARMS(Y) PUT AWAY LINES/PAGE COPY IS:TC+ISMBLK(Y),Q LOOK FOR PAGE WIDTH (CHARS/LINE) SUB ='*',Q IF NOT, PROBABLY A COMMA JEQ Q,PGWDTH GO GET THE WIDTH COPY =DEFPGSZ&:FF00,A OTHERWISE, USE THE DEFAULT VALUE FOR WIDTH JMP PGJOIN JOIN THE LENGTH AND WIDTH INTO ONE * PGWDTH EQU $ E:ISM ISMBLK(Y) LOOK FOR ANOTHER NUMERIC ARGUMENT COPY IS:DF+ISMBLK(Y),A CHECK FOR DECIMAL VALUE JNE A,PAGERR NOPE COPY IS:DV+ISMBLK(Y),A GET THE VALUE ENTERED SHIFT A,LO,8 PUT INTO THE HIGH BYTE * PGJOIN EQU $ COPY PGPARMS(Y),Q GET THE OTHER VALUE OR A,Q PUT THEM TOGETHER COPY Q,PGPARMS(Y) SAVE FOR LATER JMP DPT2A ALL DONE, SO GO ON * PAGERR EQU $ JMP OPTERR * TITL D O O P T -- DO OPTIONS DOOPT EQU $ COPY:M IS:BP+ISMBLK(Y),A,BACKUP(Y) SAVE CURRENT CL INDEX DOOPT1A EQU $ E:ISM ISMBLK(Y) GET NEXT ITE M COPY IS:NC+ISMBLK(Y),Q LOAD CHARACTER COUNT INTO Q JNE Q,DOOPT1B BRANCH ON GOT SOMETHING JSK NEXTCL GET COMMAND LINE JMP DOOPT1A AND TRY AGAIN DOOPT1B EQU $ COPY IS:SB+ISMBLK(Y),X GET 2 CHARS SUB ='NO',X CHECK FOR 'NO' PREFIX TO OPTION COPY X,NOFLG(Y) SET FLAG IF 'NO' NOT PRESENT JEQ X,DPT5 JUMP IF 'NO' IS PRESENT COPY =-1,X GET INDEX JMP DPT1 JUMP ON DPT5 SUB =2,Q WE HAVE USED TWO CHARS JLE Q,OPTERR IF HE ONLY SAYS 'NO', DO WHAT HE SAYS DPT1 ADD =IS:SB+ISMBLK+1,X PUT PROPER SCRATCH OFFSET INTO X ADD Y,X ABSOLUTIZE X COPY =OPTABLE,A TABLE ADDR INTO A JSK LOOKUP LOOK FOR ENTRY JNE A,OPTERR IF NO FIND, ABORT CSK X,=:FF CHECK FOR ADDR OR BIT NUMBER JGE X,$+2 JUMP IF IN RANGE <0,:FE> JMP 0(X) JUMP TO HANDLER COPY CUROPT(Y),Q GET OPTION WORD XNX X INDEX BY BIT NUMBER%4 RBIT 0,Q RESET THE APPROPRIATE BIT COPY NOFLG(Y),A GET 'NO' FLAG JEQ A,DPT2 JUMP IF 'NO' WAS SPECIFIED XNX X INDEX BY BIT NUMBER%4 SBIT 0,Q SET THE APPROPRIATE BIT DPT2 COPY Q,CUROPT(Y) RESTORE THE BIT WORD DPT2A EQU $ COPY IS:TC+ISMBLK(Y),Q GET TERMINATING CHAR CLSN Q,=',' IS COMMA? JMP DOOPT THERE IS MORE CLSN Q,='+' IS PLUS? JMP DOOPT IF SO, THERE IS MORE TO DO CLSN Q,=')' IS RT PAREN? JMP DPT3 GO FINISH COMMAND LINE PARSE OPTERR JMP ABORT OH-OH DPT3 EQU $ COPY:M IS:BP+ISMBLK(Y),A,BACKUP(Y) E:ISM ISMBLK(Y) NEXT SYMBOL COPY IS:NC+ISMBLK(Y),A JNE A,OPTERR IT SHOULDN'T BE ANYTHING BUT EOL RSK R E T U R N SPACE 1 * * LOOKUP SUBROUTINE * * Q IS CHAR COUNT * A IS TABLE ADDR * X IS ADDR OF CHAR STRING * LOOKUP EQU $ PUSH F:XA: SAVE CONTEXT COPY A,Y TABLE ADDR TO Y REG COPY 0(Y),A LENGTH OF STRING ENTRIES IN WORDS SHIFT A,LO,1 CONVERT TO BYTES CSM Q,A COMPARE TO AVAILABLE LENGTH JMP $+2 STRING SHORT ENOUGH JMP LOOK4 STRING TOO LONG, NOT FOUND JMP LOOK2 GO TO LOOKUP * LOOK1 WORDMODE BACK TO WORD MODE COPY Y,Q CURRENT TABLE ADDR TO Q REG COPY K,Y ADDR OF SAVED REGS TO Y ADD *LAST:A(Y),Q UPDATE CURRENT TABLE ADDR (ALMOST) COPY LAST:Q(Y),Y NUMBER OF CHARS TO Y REG EXCH Q,Y # CHARS TO Q; TABLE ADDR-1 TO Y LOOK2 COPY 1(Y),A FIRST WORD OF NEXT ENTRY (TEXT) JEQ A,LOOK4 IF ALL DONE, NOT FOUND SUB =1,Q TO BE USED AS "INDEX" ADD =1,Y INCR TO FIRST WORD OF TEXT BYTEMODE GO TO BYTE MODE LOOK3 EXCH X,Y STRING TO Y; CURRENT TABLE TO X XNX Q INDEX NEXT INSTR COPYB 0(Y),A PICK UP BYTE FROM STRING EXCH X,Y CURRENT TABLE TO Y; STRING TO X XNX Q INDEX NEXT INSTR SUBB 0(Y),A BYTE FROM TABLE JNE A,LOOK1 IF NO MATCH, GET NEXT TABLE ENTRY JNED Q,LOOK3 KEEP LOOKING UNTIL ALL CHECKED * COPY Y,X CURRENT TABLE TO X COPY K,Y BASE OF SAVED REGS TO Y WORDMODE BACK TO WORD MODE ADD *LAST:A(Y),X COPY 0(X),X RETRIEVE ASSOCIATED VALUE COPY X,LAST:X(Y) PUT INTO CONTEXT COPY A,LAST:A(Y) PUT INTO CONTEXT LOOK4 POP RESTORE CONTEXT RSK RETURN LPOOL * * DEFINITIONS OF BIT NUMBERS FOR OPTION WORD * LISTCNC EQU 0 OPTBA EQU 2 OPTLO EQU 4 OPTLR EQU 3 LSTPRO EQU 1 * OPTABLE WORD 6 OPTENTRY 'CONCORDANCE ',LISTCNC OPTENTRY 'BATCH ',OPTBA OPTENTRY 'OPCODES ',OPTLO OPTENTRY 'REGISTERS ',OPTLR OPTENTRY 'LISTING ',LSTPRO OPTENTRY 'PAGESIZE ',PAGEPRO OPTENTRY 'APPEND ',APPROC WORD 0 END OF TABLE TITL INITIALIZE AND CALL CNC CNC EQU $ JSK CHECKTV TV INPUT? JNE Q,$+2 SKIP IF NOT TV JMP ABORT  TV NOT ALLOWED COPY PGPARMS(Y),Q IF NOT SET BY COMMAND OPTION, GET THE CHARACTERS/LINE JNE Q,$+2 AND LINES/PAGE FROM THE LO DEVICE JSK CHECKLO AND PUT THE RESULT IN THE Q REG * COPY L,X SUB =1,X COPY 0(X),X GET LOW CORE LIMIT * * ENTER CNC MODULE WITH BUFFER LOW LIMIT IN X REG, BUFFER HIGH * LIMIT (+1) IN Y REG, AND BIT MASK FOR OPTIONS IN A REG. * Q REG CONTAINS CHARS/LINE AND LINES/PAGE (OR ZERO) FOR 'LO' DEVICE * * THE BIT MASK FOR THE A REG IS FOUND IN CUROPT(Y) * COPY CUROPT(Y),A FETCH BIT MASK CONTAINING OPTIONS JMP OE:CNC GO TO CNC * * RETURNS COME HERE * OE:IBR EQU $ RETURN IF USER BAD RETURN COPY =-1,A FLAG JMP $+2 OE:IGR EQU $ RETURN FOR NORMAL EXIT COPY =0,A FLAG FOR KEEP GOING COPY L,Y SUB =YSIZ+1,Y GET OUR WORKSPACE ADDRESS BACK RSK EXIT CNC * LPOOL TITL CNC FILENAME EXTENSION TABLE CNCTBL EQU $ BYTE ' ASM' BYTE ' MAC' BYTE ' TXT' WORD 0 END OF TABLE MARKER TITL P R O C E S S I N P U T S P E C I F I C A T I O N INPRO EQU $ COPY =1%LISTCNC,A GET DEFAULT OPTION (LIST CNC) COPY A,CUROPT(Y) SET UP OPTION WORD COPY:M =:1001,A,DIRLUN(Y) USE :1001 FOR INPUT FILE DIR LUN JSK NEXTFN JLT Q,INABRT IF WOOPS JEQ A,INPNAMFS BRANCH ON INPUT FILENAME SPECIFIED INPA EQU $ DEFIO INPBLK,='SI',=INPLUN COPY INPDEV(Y,X),A JLT A,INP00 JSK GETSI ASK USER TO ASSIGN SI JMP INPA TRY AGAIN UPON RETURN FROM MDE SPACE 1 INPNAMFS EQU $  MOVBLK WRKBLK,INPBLK COPY INPDEV(Y,X),A INP00 EQU $ CLSN A,=2 JMP INABRT ABORT IF INPUT IS A DIRECTORY COPY =CNCTBL,A JSK CONECT CONNECT WITH APPROPRIATE EXTENSION JLT Q,INABRT INP3 EQU $ COPY IS:TC+ISMBLK(Y),Q GET TERMINATING CHAR CLSN Q,='(' ANY OPTIONS PRESENT? JSK  DOOPT YUP, DO EM OPENFL INPIOB,READ:ANY OPEN INPUT RSK R E T U R N INABRT JMP ABORT WOOPS, SOMETHING WRONG LPOOL TITL I O B I N T --- INITIALIZE IOB IOBINT EQU $  COPY A,IO:LUN(Y,X) PUT LUN IN IOB COPY Q,INPIDX(Y,X) PUT BUFFER LENGTH IN INDEX COPY Y,A ADD  X,A ADD =INPCFI-INPIOB,A COPY A,IO:CFI(Y,X) ADDRESS OF CFI ADD =INPBUF-INPCFI,A COPY A,IO:BUF(Y,X) ADDRESS OF BUFFER RSK R E T U R N LPOOL TITL T A B L I N I T --- INITIALISE GFN/FIB TABLINIT EQU $ COPY:M =CKW:FI,A,FI:CKW+FIBBLK(Y,X) GFNINIT EQU $ COPY:M =CKW:GF,A,GF:CKW(Y,X) COPY =GF:FBUF,A ADD X,A ADD Y,A COPY A,GF:NAME(Y,X) FILENAME BUFFER ADDRESS  COPY =GF:PBUF,A ADD X,A ADD Y,A COPY A,GF:PASS(Y,X) PASSWORD BUFFER ADDRESS  RSK LPOOL TITL I N I T --- INITIALIZE INIT EQU $ COPY L,Q LOW CORE LIMIT COPY K,Y CURRENT STACK SUB =STKSIZ,Y COPY Y,L SET UP OUR STACK COPY =YSIZ-1,X LENGTH OF SCRATCH -1 SUB =2,Y BACK OFF Y FOR LOW ADDRESS SAVE COPY Q,1(Y) SAVE LOW MEMORY AT L  -1 SUB X,Y SET NEW Y COPY =0,Q ) COPY Q,0(Y,X) > CLEAR SCRATCH AREA  JNED X,$-1 ) TABLINIT INPBLK,INPLUN,BUFLEN*2 IOBINT OPRIOB,'UL',BUFLEN*2 TABLINIT LSTBLK,'LO',133 IOBINT CMDIOB,'CI',PROMTLEN COPY =CMDIOB,X SETUP "CNC.." PROMPT PARAMETERS COPY:M =PROMTLEN,A,IO:BCT(Y,X) COPY:M =PROMTBUF,A,IO:BUF(Y,X) COPY:M =WRITEPR,A,IO:FC(Y,X) COPY K,A ) ADD =1,A  > SET UP ABORT STACK POINTER COPY A,ABORTK(Y) ) SPACE 1 COPY =WRKBLK,X JSK GFNINIT  WRKBLK/GFN INITIALISATION COPY:M =CKW:IS,A,GF:ISM+IS:CKW(Y,X) ISM " " * COPY:M =CIBUF:,A,GF:ISM+IS:UB(Y,X) USER COMMAND BUFFER ADDRESS COPY:M =80,A,GF:ISM+IS:BC(Y,X) USER BUFFER BYTE COUNT SPACE 1 NOPPER EQU $ JMP DONOP COPY:M =0,A,CIBUF: CLEAR FIRST WORD OF COMMAND BUFFER JMP NORCI DON'T COPY COMMAND LINE UPON REENTRY DONOP EQU $ COPY:M =0,A,NOPPER E:RCI ISMBLK(Y) GET COPY OF COMMAND LINE IN OWN BUFFER NORCI EQU $  E:ISM ISMBLK(Y) GET FIRST SYMBOL COPY IS:BP+ISMBLK(Y),A ) SUB IS:NC+ISMBLK(Y),A ) PUT POINTER BACK SUB =1,A ) TO START COPY A,IS:BP+ISMBLK(Y) ) SPACE 1 COPY =OPRIOB,X COPY:M =COMPLUNS,A,IO:FC(Y,X) COPY ='UL',A EXCH A,IO:DUN(Y,X) SAVE BUFFER ADDRESS I:IO 0(Y,X) COMPARE 'UC' & 'UL' LUNS NOP COPY A,IO:BUF(Y,X) RESTORE BUFFER ADDRESS COPY IO:ST(Y,X),A  COPY A,CLINFLAG(Y) <> 0 FOR DO NOT OVERPRINT '?' ERROR LINES SPACE 1 COPY:M =WRITEAPP,A,APPEND(Y) DEFAULT LIST MODE TO APPEND SPACE 1 COPY SIGN:ON,A COPY =1,Q UC DEVICE NUMBER COPY =SIGN:ON+1,X JSK O:MSG COPY =CR:,A COPY =1,X JSK O:IO RSK R E T U R N SIGN:ON WORD 12 BYTE ' CNC (',REVA//-8,REVA**:FF,REVB//-8,REVB**:FF,')' PROMTBUF BYTE ' CNC..' LPOOL TITL C N C M A I N L I N E START EQU $ JSK INIT START1 EQU $ JSK  INPRO PROCESS INPUT FILE SPECIFICATION JSK CNC MAKE CONCORDANCE JEQ A,$+2 IF NO PROBLEMS, CONTINUE JMP GOAWAY ELSE, EXIT FROM CNC CLOSFL INPIOB COPY IS:TC+ISMBLK(Y),A  CLSN A,='+' MORE? JMP START1 YUP, DO IT CLSN A,=',' JMP START1 CLOSFL LSTIOB JEQ A,$+2 JMP ABORT ABORT ON BAD TERMINATOR E:MON GO BACK TO SYSTEM  LPOOL TITL GET CHARACTER--DO AN INPUT GETCHAR EQU $ GET CHAR FROM INPUT BUFFER ADD X,Y  POINT Y TO BLOCK COPY X,A SAVE X IN A COPY INPIDX(Y),X COPY IO:ACT(Y),Q GET MAX IN BUFFER CSK X,Q ANY BYTES IN BUFFER JMP GETBYT GO GET THE NEXT BYTE JMP ENDLIN NO,GO GET ANOTHER LINE COPY =CR:,Q SEND A CR BACK JMP GODRT1 ENDLIN EQU $  COPY Y,Q RESET BUFFER POINTER ADD =IOBUF,Q BUMP Q TO IO BUFFER COPY Q,IO:BUF(Y)  PUT BUFFER BACK COPY:M =MAXREC,Q,IO:BCT(Y) COPY:M =READFA,Q,IO:FC(Y) I:IO 0(Y) JMP ABGET  SOME DAYS!!!!! COPY IO:ACT(Y),Q RECORD READ ACTUALLY NULL? JNE Q,CHKSIZ NO, PROCESS SIZE THEN  COPY IOBUF(Y),X YES, IS BUFFER STARTED WITH A CR? SHIFT X,RO,8 SUB =CR:,X LINE STARTS WITH A CR? JNE X,ENDLIN NO, MUST BE DELETED LINE. CHKSIZ COPY IO:BCT(Y),X CSK X,Q COMPARE WITH ACTUAL COUNT COPY X,IO:ACT(Y) AND SAVE THE SMALLEST NOP COPY:M =0,X,INPIDX(Y) MAKE THE INDEX TO THE BUFFER ZERO GETBYT EQU $ GET NEXT BYTE FROM BUFFER BYTEMODE COPYB IOBUF(Y,X),Q PUT NEXT BYTE IN A WORDMODE GODRT1 EQU $ ADD =1,X BUMP INDEX COPY X,INPIDX(Y) SAVE IT GODRTN EQU $ SUB A,Y EXCH Q,A RBIT 7,A TURN OFF PARITY BIT RSK BYE SPACE 2 LPOOL TITL PUTCHAR--OUTPUT A CHARACTER PUTCHAR EQU $ ADD X,Y POINT TO BLOCK  COPY A,Q SAVE A IN Q RBIT 7,Q RESET THE PARITY BIT FOR ROGER COPY X,A  SAVE X IN A CLSN Q,=CR: ARE WE AT END OF LINE? JMP SNDLIN YES SEND THE LINE COPY  IO:BCT(Y),X GET CURRENT INDEX TO RECORD EXCH INPIDX(Y),A TRADE MAXLEN AND A CSK A,X CAN WE PUT OUT MORE? JMP RSTRA NO,GO AWAY JMP $+2 YUP, GO DOIT TOIT JMP RSTRA  BYTEMODE YES COPYB Q,IOBUF(Y,X) STORE BYTE WORDMODE ADD =1,X BUMP X  COPY X,IO:BCT(Y) SAVE IT RSTRA EQU $ EXCH INPIDX(Y),A RESTORE A AND OUT INDEX COPY =0,Q CLEAR OUTPUT FLAG JMP GODRTN AND RETURN SNDLIN EQU $ COPY:M =WRITEFA,Q,IO:FC(Y) I:IO 0(Y) JMP ABGET COPY:M =0,Q,IO:BCT(Y) JMP GODRTN ABGET EQU $ COPY =-1,Q JMP GODRTN BYE  TITL I/O INTERFACE---O:IO ** * FUNCTION: CHARACTER I/O (SEE OMEGA) * * ENTRY: A = CHAR * X = LUN NO. * JSK O:IO * * EXIT: A = CHAR (FOR GETS) * A SHOULD HAVE BEEN GIVEN TO O:IO FOR PUTS ** O:IO EQU $ PUSH F:XA:  SAVE REGS ETC COPY L,Y GET L SO WE CAN GET OUR Y SUB =YSIZ+1,Y POINT TO OUR Y AREA COPY A,TEMPA(Y) SAVE INCASE WE ARE OUTPUTTING COPY =0,A WE NEED THIS LATER COPY =7,Q  TEST FOR LEGAL LU CSK Q,X IS X IN RIGHT RANGE? JMP NOLUN NO,GO AWAY JLT X,$-1 MAYBE, TEST AGAIN XNX X JMP *LEGLUN LEGLUN EQU $ TABLE OF LEGAL UNITS AND THEIR PROCESSING WORD BADLUN WORD COCHAR WORD SICHAR WORD BADLUN WORD BADLUN WORD BADLUN WORD LOCHAR WORD BADLUN LPOOL COCHAR EQU $ COPY =OPRIOB,X JMP COMCHAR GO DO COMMON OUTPUT LOCHAR EQU  $ COPY =1,Q SET LIST FLAG EXCH Q,LISTFLAG(Y) AND TEST IT COPY =LSTIOB,X POINT   TO LIST IOB JNE Q,COMCHAR COPY:M =OPEN,Q,IO:FC(Y,X) COPY:M APPEND(Y),Q,IO:FOP(Y,X) I:IO 0(Y,X) GOERRR EQU $ JMP IOERRR COULDN'T OPEN?!?!?! COPY:M =0,Q,IO:BCT(Y,X) COMCHAR EQU $  COMMON OUTPUT COPY =:FF,A AND TEMPA(Y),A GET CHARACTER JSK PUTCHAR PUT IT AWAY JLT A,GOERRR IF TROUBLE POP RESTORE REGISTERS COPY =0,X GOOD STATUS RSK R E T U R N SICHAR EQU $ COPY =INPIOB,X JSK GETCHAR GET INPUT CHARACTER JLT A,IOERR GO FIND OUT WHAT WENT WRONG COPY K,Y SAVED REGISTERS  BYTEMODE COPYB A,LAST:A+1(Y) PUT BYTE IN A(0-7) WORDMODE POP RESTORE REGISTERS  COPY =0,X GOOD I/O FLAG RSK R E T U R N LPOOL SII3 EQU $ POP COPY =E:EOF,X RSK IOERR EQU $ COPY Q,X IOB OFFSET COPY IO:ST(Y,X),A STATUS JLT A,IOERRR BIG TROUBLE AND =:7F,A CLSN A,=X:IOEOF JMP SII3 IF EOF, TELL 'EM BADLUN EQU $ NOLUN EQU $ IOERRR EQU $ BIG TROUBLES POP RESTORE REGISTERS COPY =E:DEV,X  RSK R E T U R N TITL I/O INTERFACE---O:MSG ** * FUNCTION: OUTPUT A MESSAGE * * ENTRY: A = BYTE COUNT * Q = LUN * X = MESSAGE ADDR * JSK O:MSG * * EXIT: RSK ** O:MSG EQU $ PUSH F:XA: SAVE REGISTERS COPY =0,Y CLEAR BYTE INDEX MSG010 EQU $ CSN A,Y ARE WE DONE YET ?  JMP MSG020 JUMP IF YES EXCH X,Y SWAP STRING/BYTE INDEX BYTEMODE SET BYTE ADDRESSING MODE COPYB 0(Y,X),A OBTAIN A CHARACTER WORDMODE SET WORD ADDRESSING MODE EXCH X,Y SAVE BYTE INDEX COPY Q,X SET LUN FOR I/O JSK O:IO OUTPUT A CHARACTER  JNE X,MSG030 JUMP IF I/O ERROR COPY K,X OBTAIN STACK ADDRESS COPY LAST:A(X),A GET BYTE COUNT COPY LAST:X(X),X RESET STRING ADDRESS IJNE Y,MSG010 CONTINUE WITH NEXT CHARACTER MSG020 EQU $ COPY =0,X INDICATE GOOD I/O STATUS MSG030 EQU $ COPY K,Y OBTAIN STACK POINTER COPY X,LAST:X(Y) SAVE ERROR CODE POP RESTORE REGISTERS RSK  RETURN LPOOL TITL GET ASCII DATE AND TIME ** * FUNCTION: GET ASCII DATE AND TIME FROM CARTOS * * ENTRY: JSK O:GATD * * EXIT: DATA IS IN 7 WORD BUFFER AT O:DATE ** O:GATD EQU $ R:GATD O:DATE RSK * O:DATE RES 7,0 LATEST READING GOES HERE LPOOL * * CIBUF: RES 64,0 COMMAND INPUT BUFFER SPACE 1 END -O:MSG ** * FUNCTION: OUTPUT A MESSAGE * * ENTRY: A = BYTE COUNT * Q = LUN * X = MESSAGE ADDR * JSK O:MSG * * EXIT: RSK ** O:MSG EQU $ PUSH F:XA: SAVE REGISTERS COPY =0,Y CLEAR BYTE INDEX MSG010 EQU $ CSN A,Y ARE WE DONE YET ?  1PAGE 0001 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:23:46.00 UTILITY BASE PROGRAM  SI = DH01.CARTOSCNCIF.ASM SO = DH01.CARTOSCNCIF.OBJ LO = DH01.CARTOSCNCIF.LST 18C3 18C7 0003 OLDOPS OPTIONS +4 1PAGE 0002 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:23:57.00 E:XXXX (MDE) USER MACROS - E:XXXX.MAC - 84-94142-65 (X004) SI = DH01.CARTOSCNCIF.ASM SO = DH01.CARTOSCNCIF.OBJ LO = DH01.CARTOSCNCIF.LST  0010 SAVE 1PAGE 0003 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:23:57.00 UTILITY IN ITS OWN ENVIRONMENT 0000 0002 0012 UTILITY: REL 0013 SHARABLE UTILITY:  0000 0014 NAM UTILENV 002C 0015 NAM STARTUP 0016  EXTR G:Z 0017 SEXT DEBUGC 0018 EXTR R:HIGH 0019 EXTR CLEANUP 00000000 0020 UTILENV EQU $ 0021 * 0000 0000 0022 EDB  EDB: ERB,,,TDB,0,0 0000 0000 0022+ 0002 0000 0022+ 0003 0010 0022+ 0005 0022+ 0006  0022+ 0007 0022+ 0008 0022+ 0009 0022+ 000C 0000 0022+ 000D 0020 0022+  000E 0000 0022+ 000F AB00 0022+ 0000000A 0023 EPD: 00000000 0024 EMP: 0,0  0010 0000 0025 ERB ERB: 0010 0000 0025+ 0011 0000 0025+ 0012 000A 0025+ 0015 0000 0025+ 0016 0000 0025+ 0017 0000 0025+ 0019 FFFF 0025+ 001A FFFF 0025+ 001B FFFF 0025+ 001F AB01  0025+ 0020 0000 0026 TDB TDB: 0,STARTUP,,,0 0020 0026+ 0021 0000 0026+ 0024 0000  0026+ 0023 0001 0026+ 0025 0000 0026+ 0026 0000 0026+ 0027 002C 0026+ 0029 0000 0026+ 002A 0000 0026+ 002B F01E 0026+ 0000002C 0027 STARTUP EQU $ 002C 08FF 0028 COPY =:FFFF,A 002D 7000 0029 COPY A,K SET STACK TO TOP OF MEMORY 002E 828C 003B 0030 COPY =R:HIGH,A 002F 0B01 0031 ADD =1,A 0030 5000 0032 COPY A,L SET LOWER LIMIT OF STACK 0031 9F80 0032 0033 JMP *$+1 1PAGE 0004 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:24:03.25 UTILITY IN ITS OWN ENVIRONMENT 0032 0002 0034 WORD G:Z GO TO UTILITY PROPER 00000033 0036 CLEANUPP EQU $ 0033 FF88 003C 0037 JSK CLEANUP GOT TO UTILITY'S CLEAN-UP CODE (CLOSES ALL FILES) 00000034 0038 EMONE EQU $ 0034 7A01 0039 E:MONE 0035 0000 0036 FFFF 00000037 0041 DBGENTRY EQU $ 0037 A282 003A 0042 COPY DEBUGP,X 0038 313B 0034 0043 JEQ X,EMONE 0039 9C80 0000 0044 JMP 0(X) GO TO DEBUGC (OR SYMPLEC) ONLY IF LINKED IN 003A 0000 0046 DEBUGP WORD DEBUGC 0002 0047 LPOOL 003B 0001 R:HIGH 003C 0000 CLEANUP  1PAGE 0005 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:24:04.00 BASE PAGE CODE  0010 0049 NAM CLEANUP: 0012 0050 NAM RESTART: 0017 0051 NAM JMPDEBUG 0014 0052 NAM POSTMTEM 0010 0000 0053 ABS :10 00000010  0054 CLEANUP: EQU $ 0010 9D11 0011 0055 JMP *$+1 CLEAN UP AND ABORT 0011 0033 0056  WORD CLEANUPP 00000012 0057 RESTART: EQU $ 0012 9D13 0013 0058 JMP *$+1 RESTART/START POINT 0013 002C 0059 WORD STARTUP 00000014 0060 POSTMTEM EQU $ 0014 9D15 0015 0061  JMP *$+1 POSTMORTEM DUMP & SELF-DIAG (NONE) 0015 0034 0062 WORD EMONE 0016 0000  0063 WORD 0 NO DEBUG TRACE 00000017 0064 JMPDEBUG EQU $ 0017 9D18 0018 0065  JMP *$+1 JMP TO DEBUGC (SYMPLEC) 0018 0037 0066 WORD DBGENTRY 0000 0068  END EDB 0000 ERRORS (0000/0000) 0000 WARNINGS (0000/0000) 1PAGE 0006 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:24:22.00 SI = DH01.CARTOSCNCIF.ASM SO = DH01.CARTOSCNCIF.OBJ LO = DH01.CARTOSCNCIF.LST 0071 *************************************************************** 0072 *** C A R T O S O M E G A 4 C N C I N T E R F A C E *** 0073 *************************************************************** 0075 * THE INTERFACE REQUIRES THE FOLLOWING DEFINITION 0076 *  FILES TO RESIDE ON THE UF DEVICE: 0077 * SYSCOMMON.MAC, FIB.MAC, IOB.MAC, 0078 * GFN.MAC, ISM.MAC, X:COMMON.MAC, 0079 * X:IOERR.MAC 1PAGE 0007 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:24:22.25 INCLUDE DEFINITION FILES 0083 * INCLUDE X1/SYSCOMMON.MAC 0084 * INCLUDE X1/FIB.MAC 0085 * INCLUDE X1/GFN.MAC 0086  * INCLUDE X1/ISM.MAC 0087 * INCLUDE X1/IOB.MAC 0088 * INCLUDE X1/X:COMMON.MAC  0089 * INCLUDE X1/X:IOERR.MAC 18C3 0004 0090 OPT OPTIONS =:0004 ERRORS ONLY 1PAGE 0008 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:24:38.75 EXCEPTION CLASS I/O ERRORS - X:IOERR - 84-94143-61 (A000) SI = DH01.CARTOSCNCIF.ASM SO = DH01.CARTOSCNCIF.OBJ LO = DH01.CARTOSCNCIF.LST 0099 SAVE 0100 END 0000 ERRORS (0000/0000) 0000 WARNINGS (0000/0000) 1PAGE 0009 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:04.25 SI = DH01.CARTOSCNCIF.ASM SO = DH01.CARTOSCNCIF.OBJ LO = DH01.CARTOSCNCIF.LST 0103 ***************************************************************  0104 *** C A R T O S O M E G A 4 C N C I N T E R F A C E *** 0105 *********************** **************************************** 0004 0100 0107 MACHINE =:100 ASSEMBLE FOR 4/95  0108 SHARABLE CNC:CART 0000 0002 0109 CNC:CART REL 0000 0110 NAM OE:START  LOCATION 0 0216 0111 NAM OE:IGR 0214 0112 NAM OE:IBR 033A 0113 NAM O:IO 037F 0114 NAM O:MSG 0395 0115 NAM O:GATD 039C 0116 NAM O:DATE 02BE 0117 NAM SIGN:ON 005A 0118 NAM  CLEANUP 0119 * 0120 EXTR OE:CNC 0121 * 1PAGE 0010 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:04.75 R E V I S I O N H I S T O R Y 0020 0123 OBJNOTE ' *** CARTOS CONCORDANCE INTERFACE -- REVISION E700 *** ' 0020 002A 002A 002A 0020 0020 0043 0041 0052 0054 004F 0053 0020 0043  004F 004E 0043 004F 0052 0044 0041 004E 0043 0045 0020 0049 004E 0054 0045 0052 0046 0041 0043 0045 0020 0020 002D 002D 0020 0020 0052 0045 0056 0049 0053 0049 004F 004E 0020  0045 0037 0030 0030 1PAGE 0011 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:05.00 R E V I S I O N H I S T O R Y 0020 0020 002A 002A 002A 0020 0020 0124 ** 0125 ** 0126 * REVISION HISTORY : 0127 *  0128 * E700 - CONVERTED FROM E600 OS4 VERSION OF OS4CNCINT.ASM 0129 * PRB  0130 * 0131 * 00004537 0132 REVA SET 'E7' 00003030 0133 REVB SET  '00' 1PAGE 0012 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:05.25 M A C R O S  0135 * 0136 * GENERATE ENTRY FOR OPTION TABLE 0137 * 0138 OPTENTRY MACRO 0139 IFT #(1,?) 0140 BYTE #(1)  0141 ENDC 0142 * 0143 IFT #(2,?) 0144 OPTENTRY SYMATT #(2) 0145 OPTENTRY SET OPTENTRY&:7FFF 0146 OPTENTRY SET #(2)>15++OPTENTRY  0147 OPTENTRY SET #(2)<00++OPTENTRY 0148 IFF OPTENTRY 0149 WORD #(2)%4 0150 ENDC 0151 IFT OPTENTRY  0152 WORD #(2) 0153 ENDC 0154 * 0155 ENDC 0156 ENDM 0157 * 0159 ** 0160 * FUNCTION : GENERATE MESSAGE WITH BYTE COUNT IN FRONT 0161 ** 0162 MSG MACRO 0163 SIZE SET !END-$-1*2 0164 WORD SIZE 0165 BYTE #1,CR:  0166 !END EQU $ 0167 ENDM 0168 * 0169 *  0170 ** 0171 * FUNCTION: SET BYTEMODE 0172 ** 0173 BYTEMODE MACRO 0174 SBIT BY:,S 0175 ENDM 0176 *  0177 ** 0178 * FUNCTION: SET WORD MODE 0179 ** 0180 WORDMODE MACRO 0181 RBIT BY:,S 0182 ENDM 0183 * 0184 * 0185 IOBINT MACRO 0186 COPY =#(1),X 0187 COPY =#(2),A 0188 COPY =#(3),Q 1PAGE 0013 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:06.00 M A C R O S 0189 JSK IOBINT 0190  ENDM 0191 * 0192 TABLINIT MACRO 0193 IOBINT #(1)+IOBBLK,#(2),#(3) 0194 SUB =IOBBLK,X 0195 JSK TABLINIT  0196 ENDM 0197 * 0198 DEFIO MACRO 0199 COPY =#(1),X 0200 COPY #(2),A 0201 JSK DEFIO 0202  ENDM 0203 * 0204 OPENFL MACRO OPENFL 0205 CLOSFL MACENT CLOSFL 0206 COPY =#(1),X 0207 IFT #(0,'OPENFL') 0208 COPY =#(2),A 0209 ENDC 0210 JSK #(0)  0211 ENDM 0212 * 0213 MOVBLK MACRO 0214 COPY =#(1),A 0215 COPY =#(2),X 0216 JSK MOVBLK 0217  ENDM 0218 * 0219 DRES MACRO 0220 #(1) EQU OFFSET  0221 OFFSET SET OFFSET+#(2) 0222 ENDM 0223 * 0224 R:GATD MACRO 0225 R:GTOD 0226 R:CTODA #(1) 0227  ENDM 1PAGE 0014 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:06.75 TEMPORARY MACROS 0229 E:ISM MACRO 0230 I:ISM #(1) 0231 ENDM 0232 * 0233 E:GFN MACRO 0234 COPY:M DIRLUN(Y),A,GF:DUN+#(1) 0235 COPY:M =0,A,GF:DFUN+#(1) 0236 I:GFN #(1) 02 37 ENDM 1PAGE 0015 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:07.00 E Q U A T E S 0239 ** 00001000 0240 INPLUN EQU :1000 STANDARD INPUT FILE LUN  0241 ** 00000008 0242 IOBLEN EQU 8 00000016 0243 BLKLEN EQU 22 00000028 0244 BUFLEN EQU 40 00000009 0245 OUTDEV EQU GF:PROT+1 00000009 0246 INPDEV EQU OUTDEV  0000000B 0247 NAMBEG EQU GF:FBUF 00000010 0248 NAMEXT EQU GF:FBUF+5 00000050 0249 MAXREC EQU BUFLEN*2 00000016 0250 FIBBLK EQU BLKLEN 00000026 0251 IOBBLK EQU FIBBLK+FIBLEN 00000010 0252 FIBLEN EQU 16 0000000A 0253 INPIDX EQU IOBLEN+2 0000000B 0254 IOBUF EQU INPIDX+1 0255 * 0256 * NEW EQUATES 0257 * 0000000D 0258 CR:  EQU :D 00000006 0259 PROMTLEN EQU 6 00000000 0260 LAST:P EQU 0 00000002 0261 LAST:A EQU 2 00000003 0262 LAST:Q EQU 3 00000004 0263 LAST:X EQU 4 00000007 0264 GFF:FNB EQU 7 00000000 0265 GFF:SEB EQU 0 00000002 0266 GFF:DIRB EQU 2 00000008 0267 GFF:JLUB EQU 8 0268 * 0269 * CNC EQUATES 0270 * 00000100  0271 STKSIZ EQU :100 SPACE FOR SYSTEM STACK ( K --> L ) 00000003 0272 E:DEV EQU 3  DEVICE ERROR CODE 00000001 0273 E:EOF EQU 1 END OF FILE ERROR CODE 00004827 0274 DEFPGSZ  EQU :4827 DEFAULT PAGE SIZE IS 72 ACROSS AND 39 DOWN 0275 * 0276 * I:IO OPERATION CODES 0277 * 00004031 0278 CLOSE EQU FU:%4++CL:++ER: 00000043 0279 COMPLUNS EQU CO:%4++COL: COMPARE 2 LUNS 00004040 0280 CONNECT EQU CO:%4++CON:++ER: CONNECT LUN (REPLACEMENT)  00000050 0281 DSCONECT EQU DC:%4 DISCONNECT LUN 00000030 0282 OPEN EQU FU:%4++OP: 00000001 0283 READFA EQU RE:%4++FA: 00000033 0284 READFIB EQU FU:%4++RIB: READ FIB 00000011 0285 WRITEFA EQU WR:%4++FA: 00000012 0286 WRITEPR EQU WR:%4++WP: 00000131 0287 READ:ANY EQU OPSEQ:++OPFIL:++OPRE: OPEN FOR ANY FILE TYPE (READ) 00000132 0288 WRITEANY EQU OPSEQ:++OPFIL:++OPWR: " " " " " (WRITE) 00000133 0289 WRITEAPP EQU OPSEQ:++OPFIL:++OPEX: " " " " " (WRITE-APPEND) 1PAGE 0016 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:08.25 Y - D A T A R E G I O N 00000000 0291 OFFSET SET 0 00000001 0292 DRES NOFLG,1 00000002 0293 DRES CUROPT,1 00000003 0294 DRES PGPARMS,1 00000004 0295 DRES APPEND,1 00000005 0296  DRES LISTFLAG,1 00000006 0297 DRES ABORTK,1 00000007 0298 DRES DIRLUN,1  00000008 0299 DRES BACKUP,1 00000009 0300 DRES CLINFLAG,1 0000000A 0301  DRES TEMPA,1 0000000B 0302 DRES TEMPB,1 00000021 0303 DRES WRKBLK,BLKLEN  00000033 0304 DRES ISMBLK,18 00000049 0305 DRES INPBLK,BLKLEN 00000059 0306  DRES INPFIB,FIBLEN 00000061 0307 DRES INPIOB,IOBLEN 00000063 0308 DRES  INPCFI,2 00000064 0309 DRES INPTMP,1 00000096 0310 DRES INPBUF,BUFLEN+10 000000AC 0311 DRES LSTBLK,BLKLEN 000000BC 0312 DRES LSTFIB,FIBLEN 000000C4 0313  DRES LSTIOB,IOBLEN 000000C6 0314 DRES LSTCFI,2 000000C7 0315 DRES LSTTMP,1  0000010A 0316 DRES LSTBUF,67 00000112 0317 DRES CMDIOB,IOBLEN 00000114 0318  DRES CMDCFI,2 00000115 0319 DRES CMDTMP,1 0000011D 0320 DRES OPRIOB,IOBLEN 0000011F 0321 DRES OPRCFI,2 00000120 0322 DRES OPRTMP,1 00000148 0323  DRES OPRBUF,BUFLEN 00000148 0324 DRES YSIZ,0 0325 * 0326 * 0327 * 0328 * 0000 0329 G:Z NAM G:Z 00000000 0330 START: EQU $ 00000000 0331 OE:START EQU $ 0000 4900 0333 COPY =0,Q > 0001 A2E4 0066 0334 COPY =OE:CNC,X > 0002 4729 0335 COPYE Q,:A0(X) > REMOVE SELP X,0 INSTRUCTION FROM CNC BODY 0003 00A0 0004 9FE2 0067 0337 JMP START 0338 * 0339 *  0340 * 0341 * 1PAGE 0017 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:09.75 O P E N F L & C L O S F L --- OPEN AND CLOSE FILES 0343 ** 0344 * FUNCTION: OPEN A FILE 0345 * 0346 * ENTRY: A = OPEN FUNCTION OPERAND  0347 * X = ADDRESS OF IOB 0348 * JSK OPENFL 0349 * 0350 * EXIT: Q = -1 IF ERROR, +VE OTHERWISE 0351 * RSK 0352 ** 00000005 0353 OPENFL EQU $ 0005 84C4 0004 0354 COPY A,IO:FOP(Y,X) SET FUNCTION OPERAND 0006 4930 0355 COPY:M =OPEN,Q,IO:FC(Y,X) 0007 C4C3 0003 0355+ 0008 1A36 0356 I:IO 0(Y,X) 0009 0005 000A 0000 000B 48FF  0357 COPY =-1,Q IF TROUBLE 000C 0900 0358 COPY:M =0,A,IO:BCT(Y,X) 000D 84C4 0004  0358+ 000E 0060 0359 COPY Y,A 000F 0022 0360 ADD X,A 0010 0B0B 0361  ADD =IOBUF,A 0011 84C5 0005 0362 COPY A,IO:BUF(Y,X) SETUP BUFFER ADDRESS 0012 2309 0363 RSK 0365 ** 0366 * FUNCTION: CLOSE A FILE 0367 * 036 8 * ENTRY: X = ADDRESS OF IOB 0369 * JSK CLOSFL 0370 * 0371 * EXIT: Q = -1 IF ERROR, +VE OTHERWISE 0372 * RSK 0373 ** 00000013 0374 CLOSFL EQU $ 0013 C2D4 0068 0375 COPY:M =CLOSE,Q,IO:FC(Y,X) 0014 C4C3 0003 0375+ 0015 1A36 0376 I:IO 0(Y,X) 0016 0005 0017 0000 0018 9E88 0021 0377 JMP CLOSERR 0019 C0C0 0000 0378 COPY IO:LUN(Y,X),Q 001A 4C4F 0379 CLSN Q,='O' 001B 2309 0380 RSK DON'T TRY TO DISCONNECT 'LO' 001C 4950 0381 COPY:M =DSCONECT,Q,IO:FC(Y,X) 001D C4C3 0003 0381+ 001E 1A36 0382  I:IO 0(Y,X) DISCONNECT LUN 001F 0005 0020 0000 00000021 0383 CLOSERR EQU $ 0021 48FF 0384 COPY =-1,Q 1PAGE 0018 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:11.75 O P E N F L & C L O S F L --- OPEN AND CLOSE FILES 00000022 0385 CLOSRT EQU $ 0022 2309 0386 RSK 1PAGE 0019 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:11.75 A B O R T 0388 ** 0389 * FUNCTION: ABORT THE CONCORDANCE AND RETURN TO MDE 0390 * 0391 * ENTRY: JMP ABORT 0392 * 0393 * EXIT: NONE (CONTROL IS RETURNED TO MDE VIA E:MONE) 0394 ** 00000023 0395 ABORT EQU $ 0023 6050 0396 COPY L,Y 0024 EEC4 0069 0397 SUB =YSIZ+1,Y GET OUR Y BACK, JUST IN CASE 0025 8045 0005 0398 COPY:M ABORTK(Y),A,K SET STACK BACK TO LEVEL ONE 0026 7000 0398+ 0027 A2C2 006A 0399 COPY =OPRIOB,X 0028 0911 0400 COPY:M =WRITEFA,A,IO:FC(Y,X) 0029 84C3 0003 0400+ 002A 806E 002E 0401 COPY IS:BP+ISMBLK(Y),A LOAD BUFFER POINTER INTO A 002B C047 0007 0402 COPY BACKUP(Y),Q LOAD BACKUP POINTER INTO Q 002C 4B02 0403 ADD =2,Q COMPUTE BACKUP+2 002D 004B 0404 CSK A,Q COMPARE BP WITH BACKUP+2 002E 9E84 0033 0405 JMP ABORT10 IF BP < BACKUP+2, BRANCH AROUND 002F 0000 0406  NOP OTHERWISE... 0030 C061 0021 0407 COPY IS:TC+ISMBLK(Y),Q CHECK FOR BP AT END OF LINE 0031 51C2 0034 0408 JNE Q,ABORT11 IF NOT, BRANCH TO CONTINUE 0032 11C1 0034 0409 JNE A,ABORT11 ELSE, BUMP BP FOR REASONS WHICH BEAR CLOSE SCRUTINY 00000033 0410 ABORT10 EQU $ 0033 0040 0411  COPY Q,A ANOTHER SPECIAL CASE FOR BP < BACKUP+2 00000034 0412 ABORT11 EQU $ 0034 0B05  0413 ADD =PROMTLEN-1,A 0035 84C4 0004 0414 COPY A,IO:BCT(Y,X) LENGTH IS LAST SCANNED 0036 2000 0415 COPY A,X 0037 82B3 006B 0416 COPY =OPRBUF,A 0038 493F 0417 COPY  ='?',Q 0039 6002 0418 ADD A,Y 003A 0E25 0419 BYTEMODE 003B C4C0 0000 0420 CO PY Q,0(Y,X) ) FILL BUFFER 003C 35BE 003B 0421 JNED X,$-1 ) WITH '?' 003D 6003 0422  SUB A,Y 003E A04F 000F 0423 COPYB 1+BACKUP(Y),X ) 003F 2B05 0424 ADD =PROMTLEN-1,X ) 0040 6002 0425 ADD A,Y ) 0041 4920 0426 COPY =' ',Q > FILL UP TO BACKUP WITH ' ' 0042 C4C0 0000 0427 COPYB Q,0(Y,X) ) 0043 35BE 0042 0428 JNED X,$-1  ) 0044 0E27 0429 WORDMODE 0045 C2A6 006C 0430 COPY ='+(',Q ASSUME WE'RE GOING TO OVERPRINT 0046 2001 0431 NEG A,X SO WE CAN INDEX BACK TO BASE Y-SCRATCH 0047 A0C8 0008 0432  COPY CLINFLAG(Y,X),X LOAD COMMAND FIRST LINE FLAG INTO X 0048 3141 004A 0433 JEQ X,$+2 IF FIRST TIME, BRANCH AROUND 0049 C2A3 006D 0434 COPY =' (',Q ELSE, DON'T OVERWRITE COMMAND LINE 004A C440 0000 0435 COPY Q,0(Y) STORE CARRIAGE CONTROL & REV IN FRONT OF BUFFER 004B C2A2 006E 0436 COPY =REVA,Q " 004C C441 0001 0437 COPY Q,1(Y) " 004D C2A1 006F 0438 COPY =REVB,Q " 004E C442 0002 0439 COPY Q,2(Y) " 1PAGE 0020 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:13.25 A B O R T 004F C2A0 0070 0440 COPY =') ',Q " 0050 C443 0003 0441  COPY Q,3(Y) " 0051 6003 0442 SUB A,Y RESTORE Y-SCRATCH POINTER 0052 1A36  0443 I:IO OPRIOB(Y) OUTPUT ERROR MESSAGE 0053 0004 0054 0115 0055 0000 0444 NOP 00000056 0445 GOAWAY EQU $ 0056 FE83 005A 0446 JSK CLEANUP CLOSE ALL FILES 0057 7A01 0447  E:MONE ABNORMAL EXIT TO MDE 0058 0000 0059 FFFF 0000005A 0449 CLEANUP EQU $ 005A 2959 0450 CLOSFL INPIOB 005B FE37 0013 0450+ 005C 29BC 0451 CLOSFL LSTIOB 005D FE35 0013 0451+ 005E 2309 0452 RSK 1PAGE 0021 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:14.25 S E T E X T --- SET EXTENSION 0454 ** 0455 * FUNCTION: SET EXTENSION INTO FILENAME WORD OF GFN BLOCK 0456 * 0457 * ENTRY: X = GFNBLOCK 0458 * A = FIRST CHAR 0459 * Q = SECOND AND THIRD CHARS 0460 * JSK SETEXT  0461 * 0462 * EXIT: RSK 0463 ** 0000005F 0464 SETEXT EQU $ 005F C4D1 0011 0465 COPY Q,NAMEXT+1(Y,X) PUT IN 2ND & 3RD CHARACTERS 0060 2022 0466 ADD X,X  BYTE ADDRESS OFFSET 0061 0E25 0467 BYTEMODE 0062 84E1 0021 0468 COPYB A,NAMEXT+1(Y,X) PUT IN 1ST CHARACTER 0063 0E27 0469 WORDMODE 0064 2E09 0470 SHIFT X,RO,1 ORIGINAL X  0065 2309 0471 RSK R E T U R N 000B 0472 LPOOL 0066 0000 OE:CNC 0067  02D9 START 0068 4031 CLOSE 0069 0149 006A 0115 OPRIOB 006B 0120 OPRBUF 006C 2B28 006D 2028 006E 4537 006F 3030 0070 2920 1PAGE 0022 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:14.75 CHECKTV  0474 ** 0475 * FUNCTION: CHECK FOR TV INPUT 0476 * 0477 * ENTRY: JSK CHECKTV 0478 * 0479 * EXIT: Q = 0 FOR TV DIB 0480 * Q<> 0 FOR OTHERS 0481 ** 00000071 0482 CHECKTV EQU $ 0071 2933 0483 COPY =INPBLK,X  0072 FEA2 0095 0484 JSK GETCLASS 0073 4AFA 0485 SUB =CLASS:TV,Q 0074 2309 0486  RSK 0001 0487 LPOOL 0075 1PAGE 0023 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:15.00 CHECKLO - GET LINES PER PAGE AND CHARACTERS PER LINE INTO Q REG 0489 **  0490 * FUNCTION: CHECK LO DIB FOR LINES PER PAGE AND CHARACTERS PER LINE 0491 *  0492 * ENTRY : JSK CHECKLO 0493 * 0494 * EXIT: Q=LINE COUNT (OR ZERO) 0495 * 0496 ** 00000076 0497 CHECKLO EQU $ 0076 2996 0498 COPY =LSTBLK,X 0077 FE9D 0095 0499 JSK READFIB: GET FIB/DIB FOR 'LO' 0078 80E3 0023 0500 COPY FI:FRMS+FIBBLK(Y,X),A GET LINES/PAGE ETC. 0079 C28A 0084 0501 COPY =DEFPGSZ,Q GET DEFAULT VALUE 007A 1148 0083 0502  JEQ A,CHECKLOX USE DEFAULTS IF NONE SPECIFIED IN FIB/DIB (?) 007B 0E79 0503 SHIFT A,RO,8 007C 11C1 007E 0504 JNE A,$+2 IF NONE EXISTS, 007D 0927 0505 COPY =DEFPGSZ&:FF,A USE THE DEFAULT 007E C0E3 0023 0506 COPY FI:FRMS+FIBBLK(Y,X),Q GET THE NUMBER OF CHARACTERS/LINE ETC. 007F 4E71  0507 SHIFT Q,LO,8 PUT INTO LEFT BYTE 0080 51C1 0082 0508 JNE Q,$+2 JUMP IF ONE IS SPECIFIED FOR THIS DEVICE 0081 C283 0085 0509 COPY =DEFPGSZ&:FF00,Q GET THE DEFAULT CHARS PER LINE 0082 4007  0510 OR A,Q MERGE BOTH SIZES INTO A SINGLE WORD 0083 2309 0511 CHECKLOX RSK  RETURN 0003 0512 LPOOL 0084 4827 DEFPGSZ 0085 4800 0086 1PAGE 0024 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:15.75 M O V B L K 0514 ** 0515  * FUNCTION: COPY A GFNBLOCK TO ANOTHER 0516 * 0517 * ENTRY: A = SOURCE BLOCK  0518 * X = DESTINATION BLOCK 0519 * JSK MOVBLK 0520 * 0521 * EXIT: RSK 0522 ** 00000087 0523 MOVBLK EQU $ 0087 4309 0524 PUSH F:XA: 0088 0040 0089 2062 0525 ADD Y,X ADJUST POINTER FOR TO BLOCK 008A 2B02 0526  ADD =2,X 008B A449 0009 0527 COPY X,TEMPA(Y) 008C 0062 0528 ADD Y,A ADJUST  POINTER FOR FROM BLOCK 008D 0B02 0529 ADD =2,A 008E 844A 000A 0530 COPY A,TEMPB(Y) 008F 2913 0531 COPY =BLKLEN-3,X LOOP COUNTER 00000090 0532 MOVE1 EQU $ 0090 81CA 000A 0533  COPY:M *TEMPB(Y,X),A,*TEMPA(Y,X) 0091 85C9 0009 0533+ 0092 35BD 0090 0534 JNED X,MOVE1 KEEP GOING 'TILL DONE 0093 6309 0535 POP 0094 2309 0536 RSK R E T U R N 0000 0537 LPOOL 1PAGE 0025 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:16.50 G E T C L A S S --- GET DEVICE CLASS FOR LUN 00000095 0539 GETCLASS EQU $ ENTRY: X=BLK ADDRESS OFFSET; 00000095 0540 READFIB: EQU $ EXIT: Q=CLASS; OTHER REGS AS ENTRY. 0095 4933 0542 COPY:M =READFIB,Q,IO:FC+IOBBLK(Y,X) FC 0096 C4E9 0029 0542+ 0097 4916 0543 COPY =FIBBLK,Q 0098 4062 0544 ADD Y,Q 0099 4022 0545 ADD X,Q 009A D0EA 002A 0546 EXCH  Q,IO:FIB+IOBBLK(Y,X) FIB ADDRESS - SAVE BCT VALUE 009B 1A36 0547 I:IO IOBBLK(Y,X) READ FIB FOR CONNECTED LUN 009C 0005 009D 0026 009E 0000 0548 NOP 009F C4EA 002A 0549 COPY Q,IO:BCT+IOBBLK(Y,X) RESTORE BCT VALUE 00A0 C0D6 0016 0550 COPY FI:CLAS+FIBBLK(Y,X),Q GET CLASS 00A1 2309 0551 RSK  0000 0552 LPOOL 1PAGE 0026 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01  16:25:17.25 C O N E C T --- CONNECT DEVICE TO UNIT 0554 ** 0555 * FUNCTION: CONNECT LUN TO DEVICE 0556 * 0557 * ENTRY: X = GFN BLOCK 0558 * A = EXTENSION TABLE (IF 0, TRY NO EXTENSIONS) 0559 * JSK CONECT 0560 * 0561 * EXIT: IF ERROR , Q = -1 0562 * IF NOT, Q = 0 0563 * RSK 0564 ** 000000A2 0565 CONECT EQU $ 00A2 C0C9 0009 0566 COPY OUTDEV(Y,X),Q GET FILE TYPE FLAG 00A3 5341 00A5 0567 JGE Q,$+2 00A4 9EC5 00EA 0568 JMP CONRTN IF ALREADY CONNECTED 00A5 400F  0569 TBIT 0,Q 00A6 C2C5 00EC 0570 COPY:M =CONNECT,Q,IO:FC+IOBBLK(Y,X) CONNECT FUNCTION CODE 00A7 C4E9 0029 0570+ 00A8 C0C0 0000 0571 COPY:M GF:NAME(Y,X),Q,FI:NAME+FIBBLK(Y,X) FILENAME ADDRESS 00A9 C4DB 001B  0571+ 00AA 366D 00D8 0572 JT OV,CON2 IF NOT FILE-TYPE CONNECT 00AB C0C2 0002 0573 COPY:M GF:DUN(Y,X),Q,IO:DUN+IOBBLK(Y,X) DIRECTORY LUN 00AC C4EB 002B 0573+ 00AD 4916 0574 COPY =FIBBLK,Q 00AE 4062 0575 ADD Y,Q 00AF 4022 0576 ADD X,Q 00B0 C4EA 002A 0577 COPY Q,IO:FIB+IOBBLK(Y,X) FIB ADDRESS 00B1 115E 00D0 0578 JEQ A,CONERR (NO FILE CREATION ALLOWED) 00B2 4900 0579 COPY:M =0,Q,FI:FLG+FIBBLK(Y,X) CLEAR FIB FLAGS 00B3 C4D7 0017 0579+ 00B4 C0C6 0006 0580 COPY  GF:FEXTL(Y,X),Q EXTENSION EXISTS FLAG 00B5 535C 00D2 0581 JGE Q,CON1 IF EXTENSION ALREADY GIVEN 00B6 A44A 000A 0582 COPY X,TEMPB(Y) SAVE BLOCK ADDRESS 00B7 2000 0583 COPY A,X START OF TABLE 00B8 9E87 00C0 0584 JMP STRTCN GO START LOOP 000000B9 0585 MORECN EQU $  LOOP FOR FINDING FILE EXTENSION 00B9 80ED 002D 0586 COPY IO:ST+IOBBLK(Y,X),A 00BA 8EB2 00ED 0587  SUB =X:FMUNKN,A 00BB 1142 00BE 0588 JEQ A,FILENFND ALLOW "FILE NOT FOUND" STATUS 00BC FEB3 00F0 0589 JSK UEX REPORT CONNECT ERROR TO MDE 00BD 9E88 00C6 0590 JMP CONECTRY 000000BE  0591 FILENFND EQU $ 00BE A049 0009 0592 COPY TEMPA(Y),X CURRENT TABLE POINTER 00BF 2B02 0593  ADD =2,X BUMP TO NEXT TABLE ENTRY 000000C0 0594 STRTCN EQU $ START OF EXTENSION LOOKUP 00C0 A449 0009 0595 COPY X,TEMPA(Y) PUT BACK CURRENT POINTER 00C1 8080 0000 0596 COPY  0(X),A 1ST WORD OF EXTENSION 00C2 C081 0001 0597 COPY 1(X),Q REST OF EXTENSION 00C3 A04A 000A 0598 COPY TEMPB(Y),X GET BLOCK ADDRESS 00C4 114A 00CF 0599 JEQ A,CONERR2 IF AT END OF TABLE 00C5 FE19 005F 0600 JSK SETEXT SET EXTENSION IN TABLE 000000C6 0601 CONECTRY EQU $ 00C6 1A36 0602 I:IO IOBBLK(Y,X) TRY CONNECTION 00C7 0005 1PAGE 0027 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:19.00 C O N E C T --- CONNECT DEVICE TO UNIT 00C8 0026 00C9 9E6F 00B9 0603 JMP MORECN NO GO 00CA 0900 0604 COPY =0,A FILE FOUND AND CONNECTED 00CB 9E9C 00E8 0605 JMP RTNFND 000000CC 0606 CONERR3 EQU $ 00CC 80ED 002D 0607 COPY IO:ST+IOBBLK(Y,X),A 00CD 8EA0 00EE 0608 SUB =X:IODNF,A 00CE 1141 00D0 0609 JEQ A,CONERR 000000CF 0610 CONERR2 EQU $ 00CF FEA0 00F0 0611 JSK UEX GIVE IO:ST TO MDE 000000D0 0612 CONERR EQU $ WE CAN'T CONNECT FOR SOME REASON 00D0 48FF 0613 COPY =-1,Q ERROR INDICATOR 00D1 2309 0614 RSK 000000D2 0615 CON1 EQU $ LAST CHANCE TO CONNECT IF EXTENSION GIVEN 00D2 1A36 0616 I:IO IOBBLK(Y,X) TRY CONNECTION 00D3 0005 00D4 0026 00D5 9E79 00CF 0617 JMP CONERR2 00D6 0900 0618 COPY =0,A FILE FOUND AND CONNECTED 00D7 9E90 00E8 0619 JMP RTNFND 000000D8 0620 CON2 EQU $ 00D8 4900 0621 COPY:M =0,Q,IO:FIB+IOBBLK(Y,X) CLEAR FIB ADDRESS IN IOB 00D9 C4EA 002A 0621+ 00DA C0C7 0007 0622 COPY:M GF:ILUN(Y,X),Q,IO:DUN+IOBBLK(Y,X) 00DB C4EB 002B 0622+ 00DC 1A36 0623 I:IO IOBBLK(Y,X) LUN TO LUN CONNECT 00DD 0005 00DE 0026 00DF 9E6C 00CC 0624 JMP CONERR3 00E0 FE34 0095 0625 JSK GETCLASS GET CLASS FOR CONNECTED LUN  00E1 0901 0626 COPY =1,A 00E2 4AFF 0627 SUB =CLASS:FM,Q 00E3 51C4 00E8 0628  JNE Q,RTNFND DEVICE CONNECTED 00E4 0900 0629 COPY =0,A ASSUME FILE CONNECTED 00E5 C0D8 0018 0630 COPY FI:TYPE+FIBBLK(Y,X),Q 00E6 4C01 0631 CLSN Q,=FIV:DIR IF DIRECTORY, 00E7 0902 0632 COPY =2,A SET FLAG BIT 1 000000E8 0633 RTNFND EQU $ WE FOUND IT, GO BACK 00E8 00FC 0634 SBIT 15,A SET CONNECTED FLAG (BIT 15) 00E9 84C9 0009 0635 COPY A,OUTDEV(Y,X) SET UP FILE TYPE 000000EA 0636 CONRTN EQU $ 00EA 4900 0637 COPY =0,Q OK FLAG 00EB 2309 0638 RSK 0004 0639 LPOOL 00EC 4040 CONNECT 00ED 80A7 X:FMUNKN 00EE 801B X:IODNF 00EF 1PAGE 0028 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:20.75 U E X --- GIVE IO:ST TO MDE 000000F0 0641 UEX EQU $ 00F0 80ED 002D 0642 COPY IO:ST+IOBBLK(Y,X),A 00F1 1A3E 0643 R:UEX UEXIT 00F2 0000 00F3 00F4 000000F4 0644 UEXIT EQU $ 00F4 2309 0645 RSK R E T U R N 1PAGE 0029 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:21.25 N E X T C L --- READ NEXT COMMAND LINE 000000F5 0647 NEXTCL EQU  $ 00F5 1A36 0648 I:IO CMDIOB(Y) PROMPT FOR NEW COMMAND LINE 00F6 0004 00F7 010A 00F8 0000 0649 NOP 00F9 7A02 0650 E:RCI ISMBLK(Y) READ IN NEXT COMMAND LINE 00FA 0004 00FB 0021 00FC 0900 0651 COPY:M =0,A,IS:BP+ISMBLK(Y) INITIALISE BUFFER POINTER 00FD 846E 002E 0651+ 00FE 8447 0007 0652  COPY A,BACKUP(Y) RESET CURRENT CL INDEX 00FF 08FF 0653 COPY:M =-1,A,CLINFLAG(Y) INDICATE WE'RE PAST THE FIRST LINE 0100 8448 0008 0653+ 0101 2309 0654 RSK 1PAGE 0030 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:22.25 N E X T F N --- INPUT NEXT FILE NAME 0656 **  0657 * FUNCTION: INPUT THE NEXT FILE NAME 0658 * 0659 * ENTRY: JSK NEXTFN  0660 * 0661 * EXIT: Q < 0 IF ERROR 0662 * A = 0 IF GOOD RETURN  0663 * > 0 IF NO NAME GIVEN (I.E., USING SI) 0664 * RSK 0665 ** 00000102 0666 EOLQQ EQU $ 0102 0901 0667 COPY =1,A 0103 51E0 0124 0668 JNE Q,NEXTFNXT 0104 FE70 00F5 0669 JSK NEXTCL GET NEXT COMMAND LINE 00000105 0671 NEXTFN EQU $ 0105 806E 002E 0672 COPY:M IS:BP+ISMBLK(Y),A,BACKUP(Y) SAVE CURRENT CL INDEX 0106 8447 0007 0672+ 0107 0900  0673 COPY:M =0,A,OUTDEV+WRKBLK(Y) CLEAR RESERVED GFN WORD 0108 8454 0014 0673+ 0109 8046 0006 0674  E:GFN WRKBLK(Y) GET FILE NAME 010A 844D 000D 0674+ 010B 0900 0674+ 010C 8450 0010 0674+ 010D 1A3D 0674 + 010E 0004 010F 000B 0110 13C9 011A 0675 JLT A,NEXTFNER GFN ERROR 0111 C061 0021 0676 COPY  IS:TC+ISMBLK(Y),Q LOAD TERMINATOR INTO Q 0112 007F 0677 TBIT GFF:FNB,A 0113 3648 011C 0678 JT OV,NEXTFN10 IF VALID FILENAME READ 0114 000F 0679 TBIT GFF:SEB,A 0115 362C 0102 0680 JT OV,EOLQQ IF NOT GOOD FILENAME OR BUFFER EMPTY 0116 002F 0681 TBIT GFF:DIRB,A 0117 3647 011F 0682 JT OV,NEXTFN20 IF DIRECTORY 0118 008F 0683 TBIT GFF:JLUB,A 0119 3647 0121 0684  JT OV,NEXTFN30 IF LUN ONLY 0000011A 0685 NEXTFNER EQU $ 011A 48FF 0686 COPY =-1,Q -1 MEANS INVALID SPECIFICATION 011B 2309 0687 RSK 0000011C 0688 NEXTFN10 EQU $ 011C 1820 0689 AND =GFF:WC,A 011D 11BC 011A 0690 JNE A,NEXTFNER IF FILENAME CONTAINS WILD CARD CHARACTER 011E 9E83 0122 0691 JMP SETDEV 0000011F 0692 NEXTFN20 EQU $ 011F 0902 0693  COPY =2,A 0120 9E81 0122 0694 JMP SETDEV 00000121 0695 NEXTFN30 EQU $ 0121 0901  0696 COPY =1,A 00000122 0697 SETDEV EQU $ 0122 8454 0014 0698 COPY A,INPDEV+WRKBLK(Y) SET FILE/DEVICE FLAG 0123 0900 0699 COPY =0,A GOOD RETURN 00000124 0700 NEXTFNXT EQU $ 0124 2309 0701 RSK 1PAGE 0031 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:23.75 N E X T F N --- INPUT NEXT FILE NAME 0000 0702 LPOOL 1PAGE 0032 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:23.75 D E F I O --- SET UP DEFAULT I/O  0704 ** 0705 * FUNCTION: DEFINE DEFAULT I/O BLOCK INFO 0706 * 0707 * ENTRY: A = DEFAULT LUN 0708 * X = GFN BLOCK 0709 * JSK DEFIO  0710 * 0711 * EXIT: RSK (REGISTERS RESTORED) 0712 ** 00000125 0713 DEFIO EQU $ 0125 84C7 0007 0714 COPY A,GF:ILUN(Y,X) STORE DEFAULT LUN FOR CONNECT 0126 0901 0715 COPY:M =1,A,OUTDEV(Y,X) LUN TO LUN CONNECTION REQUIRED 0127 84C9 0009 0715+ 0128 FF81 012A 0716 JSK CONECT  CONNECT WORKING TO DEFAULT LUN 0129 2309 0717 RSK R E T U R N 0001 0718  LPOOL 012A 00A2 CONECT 1PAGE 0033 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:24.25 G E T S I --- GET USER TO ASSIGN SI LUN 0000012B 0720 GETSI EQU $ 012B 4309 0721  PUSH F:XA: 012C 0040 012D 80EB 002B 0722 COPY:M IO:DUN+IOBBLK(Y,X),A,LUNINMES 012E 868F 013E 0722+ 012F 8289 0139 0723 COPY ASIGNLUN,A 0130 4901 0724 COPY =1,Q UC DEVICE NUMBER 0131 A29A 014C 0725 COPY =ASIGNLUN+1,X 0132 FF9A 014D 0726 JSK O:MSG ASK USER TO ASSIGN LUN 0133  090D 0727 COPY =CR:,A 0134 2901 0728 COPY =1,X 0135 FF98 014E 0729 JSK  O:IO 0136 6309 0730 POP 0137 FE38 00F0 0731 JSK UEX GIVE IO STATUS TO MDE 0138 2309 0732 RSK R E T U R N 0139 0024 0734 ASIGNLUN WORD ASIGNLEN 013A 2041 0735 BYTE ' ASSIGN ' 013B 5353 013C 4947 013D 4E20 013E 0000 0736 LUNINMES WORD 0 013F 204C 0737 BYTE ' LUN: THEN TYPE REENTER ' 0140 554E 0141 3A20 0142 2054 0143 4845 0144 4E20 0145 5459 0146 5045 0147 2020 0148 5245 0149 454E 014A 5445 014B 5220 00000024 0738 ASIGNLEN EQU $-ASIGNLUN*2-2 0003  0739 LPOOL 014C 013A 014D 037F O:MSG 014E 033A O:IO 1PAGE 0034 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:25.00 A P P R O C --- APPEND LIST FILE PROCESSOR 0741 **  0742 * FUNCTION: ANALYSE "APPEND" 0743 * 0744 ** 0000014F 0745 APPROC EQU $ 014F 8040 0000 0746 COPY NOFLG(Y),A GET 'NO' OPTION FLAG 0150 11C2 0153 0747 JNE A,APP1 BRANCH IF 'NO' DIDN'T PRECEDE THIS 0151 82FD 01CF 0748 COPY =WRITEANY,A OVERWRITE FILE CONTENTS 0152 9E81 0154 0749 JMP $+2 00000153 0750 APP1 EQU $ MUST APPEND TO EXISTING FILE CONTENTS 0153 82FC 01D0 0751 COPY =WRITEAPP,A 0154 8443 0003 0752 COPY A,APPEND(Y) SET APPROPRIATE 'OPEN' FUNCTION OPERAND 0155 9EC3 0199 0753 JMP DPT2A ALL DONE, SO GO ON 1PAGE 0035 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:25.50 P A G E P R O --- PAGESIZE PROCESSOR  0755 ** 0756 * FUNCTION: ANALYZE "PAGESIZE=N[*M]" 0757 * 0758 ** 00000156 0759 PAGEPRO EQU $ 0156 8040 0000 0760 COPY NOFLG(Y),A GET 'NO' OPTION FLAG 0157 11C3 015B 0761 JNE A,PAGESIZE BRANCH IF 'NO' DIDN'T PRECEDE THIS 0158 82F8 01D1 0762 COPY:M =DEFPGSZ,A,PGPARMS(Y) USE THE DEFAULT SIZES 0159 8442 0002 0762+ 015A 9EBE 0199 0763 JMP DPT2A 0764 * 0000015B 0765 PAGESIZE EQU $ HANDLE PAGE SIZE PARAMETERS 015B C061 0021 0766 COPY  IS:TC+ISMBLK(Y),Q GET CHARACTER WHICH TERMINATED OPTION 015C 4AC3 0767 SUB ='=',Q IF IT IS NOT '=', WE HAVE AN ERROR 015D 51D9 0177 0768 JNE Q,PAGERR 015E 1A44 0769 E:ISM ISMBLK(Y) LOOK FOR A NUMERIC ARGUMENT 015F 0004 0160 0021 0161 8063 0023 0770 COPY IS:DF+ISMBLK(Y),A SEE IF DECIMAL NUMBER WAS GIVEN 0162 1142 0165 0771 JEQ A,$+3 IF SO, USE THE GIVEN ONE 0163 0927 0772 COPY =DEFPGSZ&:FF,A OTHERWISE, GET DEFAULT NUMBER OF LINES 0164 9E81 0166 0773 JMP $+2 0165 8064 0024 0774  COPY IS:DV+ISMBLK(Y),A USE HIS VALUE 0166 8442 0002 0775 COPY A,PGPARMS(Y) PUT AWAY LINES/PAGE 016 7 C061 0021 0776 COPY IS:TC+ISMBLK(Y),Q LOOK FOR PAGE WIDTH (CHARS/LINE) 0168 4AD6 0777 SUB  ='*',Q IF NOT, PROBABLY A COMMA 0169 5142 016C 0778 JEQ Q,PGWDTH GO GET THE WIDTH 016A 82E7 01D2  0779 COPY =DEFPGSZ&:FF00,A OTHERWISE, USE THE DEFAULT VALUE FOR WIDTH 016B 9E87 0173 0780 JMP PGJOIN JOIN THE LENGTH AND WIDTH INTO ONE 0781 * 0000016C 0782 PGWDTH EQU $ 016C 1A44  0783 E:ISM ISMBLK(Y) LOOK FOR ANOTHER NUMERIC ARGUMENT 016D 0004 016E 0021 016F 8063 0023 0784  COPY IS:DF+ISMBLK(Y),A CHECK FOR DECIMAL VALUE 0170 11C6 0177 0785 JNE A,PAGERR NOPE 0171 8064 0024 0786 COPY IS:DV+ISMBLK(Y),A GET THE VALUE ENTERED 0172 0E71 0787 SHIFT A,LO,8 PUT INTO THE HIGH BYTE 0788 * 00000173 0789 PGJOIN EQU $ 0173 C042 0002 0790 COPY PGPARMS(Y),Q GET THE OTHER VALUE 0174 4007 0791 OR A,Q PUT THEM TOGETHER 0175 C442 0002 0792  COPY Q,PGPARMS(Y) SAVE FOR LATER 0176 9EA2 0199 0793 JMP DPT2A ALL DONE, SO GO ON  0794 * 00000177 0795 PAGERR EQU $ 0177 9EA8 01A0 0796 JMP OPTERR 0797 * 1PAGE 0036 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:27.25 D O O P T -- DO OPTIONS 00000178 0799 DOOPT EQU $ 0178 806E 002E 0800 COPY:M IS:BP+ISMBLK(Y),A,BACKUP(Y) SAVE CURRENT CL INDEX 0179 8447 0007 0800+ 0000017A 0801 DOOPT1A EQU $ 017A 1A44 0802 E:ISM ISMBLK(Y) GET NEXT ITEM 017B 0004 017C 0021 017D C062 0022 0803 COPY IS:NC+ISMBLK(Y),Q LOAD CHARACTER COUNT INTO Q 017E 51C2 0181 0804 JNE Q,DOOPT1B BRANCH ON GOT SOMETHING 017F FFD3 01D3 0805 JSK NEXTCL GET COMMAND LINE 0180 9E79 017A 0806 JMP DOOPT1A AND TRY AGAIN 00000181 0807 DOOPT1B EQU $ 0181 A067 0027 0808 COPY IS:SB+ISMBLK(Y),X GET 2 CHARS 0182 AED1 01D4 0809 SUB ='NO',X CHECK FOR 'NO' PREFIX TO OPTION 0183 A440 0000 0810 COPY X,NOFLG(Y) SET FLAG IF 'NO' NOT PRESENT 0184 3142 0187 0811 JEQ X,DPT5 JUMP IF 'NO' IS PRESENT 0185 28FF 0812 COPY =-1,X  GET INDEX 0186 9E82 0189 0813 JMP DPT1 JUMP ON 0187 4AFE 0814 DPT5 SUB =2,Q  WE HAVE USED TWO CHARS 0188 52D7 01A0 0815 JLE Q,OPTERR IF HE ONLY SAYS 'NO', DO WHAT HE SAYS 0189 2B28 0816 DPT1 ADD =IS:SB+ISMBLK+1,X PUT PROPER SCRATCH OFFSET INTO X 018A 2062 0817 ADD Y,X ABSOLUTIZE X 018B 82C9 01D5 0818 COPY =OPTABLE,A TABLE ADDR INTO A 018C FE9C 01A9 0819  JSK LOOKUP LOOK FOR ENTRY 018D 11D2 01A0 0820 JNE A,OPTERR IF NO FIND, ABORT 018E 2DFF  0821 CSK X,=:FF CHECK FOR ADDR OR BIT NUMBER 018F 3341 0191 0822 JGE X,$+2 JUMP  IF IN RANGE <0,:FE> 0190 9C80 0000 0823 JMP 0(X) JUMP TO HANDLER 0191 C041 0001 0824 COPY CUROPT(Y),Q GET OPTION WORD 0192 230A 0825 XNX X INDEX BY BIT NUMBER%4 0193 400D  0826 RBIT 0,Q RESET THE APPROPRIATE BIT 0194 8040 0000 0827 COPY NOFLG(Y),A GET 'NO' FLAG 0195 1142 0198 0828 JEQ A,DPT2 JUMP IF 'NO' WAS SPECIFIED 0196 230A 0829 XNX  X INDEX BY BIT NUMBER%4 0197 400C 0830 SBIT 0,Q SET THE APPROPRIATE BIT 0198 C441 0001 0831 DPT2 COPY Q,CUROPT(Y) RESTORE THE BIT WORD 00000199 0832 DPT2A EQU $ 0199 C061 0021 0833 COPY IS:TC+ISMBLK(Y),Q GET TERMINATING CHAR 019A 4C2C 0834 CLSN Q,=',' IS COMMA? 019B 9E5C 0178 0835 JMP DOOPT THERE IS MORE 019C 4C2B 0836 CLSN Q,='+' IS PLUS? 019D 9E5A 0178 0837 JMP DOOPT IF SO, THERE IS MORE TO DO 019E 4C29 0838 CLSN Q,=')' IS RT PAREN? 019F 9E81 01A1 0839 JMP DPT3 GO FINISH COMMAND LINE PARSE 01A0 9FAD 01CE 0840’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I  ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I! ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I" ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I# ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I$ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I% ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I& ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’Ie 811117145741811117145741820205161458eú 811117145741811117145741820202084914e ' 811117145741811117145741811117145741e811117145741811117145741811117145741811117145741811117145741811117145741eJ’Â8202011554432582020115545150820202084722eNd Yy:8111241657097582020116261125820202084811ee 8111241657092582020116255575820202084826 ek K8202011950542582020119512250820202084840(  e|k8201291957057582012919570825820202084850 e}8201291842250082012918422550820202084901 e~/8111241711517582020119512325820202084911?ÿÿÿÿÿÿÿÿÀ?ÿÿÿÿÿÿÿÿÿÿÿÿÿð) . CARTOSCNCIFASMCARTOSCNCIFLSTCARTOSCNCIFOBJ CNC SYS CCNC:ASM JCL CCNC:LINK JCL CARTOSCNC MAP OPTERR JMP ABORT OH-OH 000001A1 0841 DPT3 EQU $ 01A1 806E 002E 0842 COPY:M IS:BP+ISMBLK(Y),A,BACKUP(Y) 01A2 8447 0007 0842+ 01A3 1A44 0843 E:ISM ISMBLK(Y) NEXT SYMBOL 01A4 0004 01A5 0021 01A6 8062 0022 0844 COPY IS:NC+ISMBLK(Y),A 01A7 11B8 01A0 0845 JNE A,OPTERR IT SHOULDN'T BE ANYTHING BUT EOL 01A8 2309 0846 RSK R E T U R N 1PAGE 0037 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:29.50 D O O P T -- DO OPTIONS 0848 *  0849 * LOOKUP SUBROUTINE 0850 * 0851 * Q IS CHAR COUNT 0852 * A IS TABLE ADDR 0853 * X IS ADDR OF CHAR STRING 0854 * 000001A9 0855 LOOKUP  EQU $ 01A9 4309 0856 PUSH F:XA: SAVE CONTEXT 01AA 0040 01AB 6000 0857 COPY  A,Y TABLE ADDR TO Y REG 01AC 8040 0000 0858 COPY 0(Y),A LENGTH OF STRING ENTRIES IN WORDS 01AD 0E01 0859 SHIFT A,LO,1 CONVERT TO BYTES 01AE 4006 0860 CSM Q,A COMPARE TO AVAILABLE LENGTH 01AF 9E81 01B1 0861 JMP $+2 STRING SHORT ENOUGH 01B0 9E9B 01CC 0862  JMP LOOK4 STRING TOO LONG, NOT FOUND 01B1 9E86 01B8 0863 JMP LOOK2 GO TO LOOKUP  0864 * 01B2 0E27 0865 LOOK1 WORDMODE BACK TO WORD MODE 01B3 4060 0866 COPY  Y,Q CURRENT TABLE ADDR TO Q REG 01B4 6070 0867 COPY K,Y ADDR OF SAVED REGS TO Y 01B5 C942 0002 0868 ADD *LAST:A(Y),Q UPDATE CURRENT TABLE ADDR (ALMOST) 01B6 E043 0003 0869 COPY LAST:Q(Y),Y NUMBER OF CHARS TO Y REG 01B7 6048 0870 EXCH Q,Y # CHARS TO Q; TABLE ADDR-1 TO Y 01B8 8041 0001 0871 LOOK2 COPY 1(Y),A FIRST WORD OF NEXT ENTRY (TEXT) 01B9 1152 01CC 0872 JEQ A,LOOK4 IF ALL DONE, NOT FOUND 01BA 4AFF 0873 SUB =1,Q TO BE USED AS "INDEX" 01BB 6B01 0874 ADD =1,Y INCR TO FIRST WORD OF TEXT 01BC 0E25 0875 BYTEMODE GO TO BYTE MODE 01BD 6028 0876 LOOK3 EXCH X,Y STRING TO Y; CURRENT TABLE TO X 01BE 430A 0877 XNX *  Q INDEX NEXT INSTR 01BF 8040 0000 0878 COPYB 0(Y),A PICK UP BYTE FROM STRING 01C0 6028  0879 EXCH X,Y CURRENT TABLE TO Y; STRING TO X 01C1 430A 0880 XNX Q INDEX NEXT INSTR 01C2 8C40 0000 0881 SUBB 0(Y),A BYTE FROM TABLE 01C3 11AE 01B2 0882 JNE  A,LOOK1 IF NO MATCH, GET NEXT TABLE ENTRY 01C4 55B8 01BD 0883 JNED Q,LOOK3 KEEP LOOKING UNTIL ALL CHECKED 0884 * 01C5 2060 0885 COPY Y,X CURRENT TABLE TO X 01C6 6070 0886  COPY K,Y BASE OF SAVED REGS TO Y 01C7 0E27 0887 WORDMODE BACK TO WORD MODE 01C8 A942 0002 0888 ADD *LAST:A(Y),X 01C9 A080 0000 0889 COPY 0(X),X RETRIEVE ASSOCIATED VALUE 01CA A444 0004 0890 COPY X,LAST:X(Y) PUT INTO CONTEXT 01CB 8442 0002 0891 COPY A,LAST:A(Y) PUT INTO CONTEXT 01CC 6309 0892 LOOK4 POP RESTORE CONTEXT 01CD 2309 0893 RSK  RETURN 0008 0894 LPOOL 01CE 0023 ABORT 01CF 0132 WRITEANY 01D0 0133 WRITEAPP 01D1 4827 DEFPGSZ 01D2 4800 1PAGE 0038 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:30.75  D O O P T -- DO OPTIONS 01D3 00F5 NEXTCL 01D4 4E4F 01D5 01D6 OPTABLE 0895 * 0896 * DEFINITIONS OF BIT NUMBERS FOR OPTION WORD 0897 * 00000000 0898 LISTCNC EQU 0 00000002 0899 OPTBA EQU 2 00000004 0900 OPTLO EQU 4 00000003 0901 OPTLR EQU 3 00000001 0902 LSTPRO EQU 1 0903 * 01D6 0006 0904 OPTABLE WORD 6 01D7 434F 0905 OPTENTRY 'CONCORDANCE ',LISTCNC 01D8 4E43 01D9 4F52 01DA 4441 01DB 4E43 01DC 4520 01DD 0000 0905+ 01DE 4241 0906 OPTENTRY 'BATCH ',OPTBA 01DF 5443 01E0 4820 01E1 2020 01E2 2020 01E3 2020 01E4 0020 0906+ 01E5 4F50 0907 OPTENTRY 'OPCODES ',OPTLO 01E6 434F 01E7 4445 01E8 5320 01E9 2020 01EA 2020 01EB 0040 0907+ 01EC 5245 0908 OPTENTRY 'REGISTERS ',OPTLR 01ED 4749 01EE 5354 01EF 4552 01F0 5320 01F1 2020 01F2 0030 0908+ 01F3 4C49 0909 OPTENTRY 'LISTING ',LSTPRO 01F4 5354 01F5 494E 01F6 4720 01F7 2020 01F8 2020 01F9 0010 0909+ 01FA 5041 0910 OPTENTRY 'PAGESIZE ',PAGEPRO 01FB 4745 01FC 5349 01FD 5A45 01FE 2020 01FF 2020 1PAGE 0039 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:32.00 D O O P T -- DO OPTIONS 0200 0156 0910+ 0201 4150 0911 OPTENTRY 'APPEND ',APPROC 0202 5045 0203 4E44 0204 2020 0205 2020 0206 2020 0207 014F 0911+ 0208 0000 0912 WORD 0 END OF TABLE 1PAGE 0040 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:32.25 INITIALIZE AND CALL CNC 00000209 0914 CNC EQU $ 0209 FF90 021A 0915 JSK CHECKTV TV INPUT? 020A 51C1 0+ 20C 0916 JNE Q,$+2 SKIP IF NOT TV 020B 9F42 01CE 0917 JMP ABORT TV NOT ALLOWED  020C C042 0002 0918 COPY PGPARMS(Y),Q IF NOT SET BY COMMAND OPTION, GET THE CHARACTERS/LI 020D 51C1 020F 0919 JNE Q,$+2 AND LINES/PAGE FROM THE LO DEVICE 020E FF8C 021B 0920 JSK CHECKLO AND PUT THE RESULT IN THE Q REG 0921 * 020F 2050 0922 COPY L,X 0210 2AFF 0923  SUB =1,X 0211 A080 0000 0924 COPY 0(X),X GET LOW CORE LIMIT 0925 *  0926 * ENTER CNC MODULE WITH BUFFER LOW LIMIT IN X REG, BUFFER HIGH 0927 * LIMIT (+1) IN Y REG, AND BIT MASK FOR OPTIONS IN A REG. 0928 * Q REG CONTAINS CHARS/LINE AND LINES/PAGE (OR ZERO) FOR 'LO' DEVICE  0929 * 0930 * THE BIT MASK FOR THE A REG IS FOUND IN CUROPT(Y) 0931 * 0212 8041 0001 0932 COPY CUROPT(Y),A FETCH BIT MASK CONTAINING OPTIONS 0213 9F88 021C 0933 JMP OE:CNC  GO TO CNC 0934 * 0935 * RETURNS COME HERE 0936 * 00000214 0937 OE:IBR EQU $ RETURN IF USER BAD RETURN 0214 08FF 0938 COPY =-1,A FLAG 0215 9E81 0217 0939 JMP $+2 00000216 0940 OE:IGR EQU $ RETURN FOR NORMAL EXIT 0216 0900  0941 COPY =0,A FLAG FOR KEEP GOING 0217 6050 0942 COPY L,Y 0218 EE84 021D 0943  SUB =YSIZ+1,Y GET OUR WORKSPACE ADDRESS BACK 0219 2309 0944 RSK EXIT CNC  0945 * 0004 0946 LPOOL 021A 0071 CHECKTV 021B 0076 CHECKLO 021C 0000 OE:CNC 021D 0149 1PAGE 0041 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:34.00 CNC FILENAME EXTENSION TABLE 0000021E 0948 CNCTBL EQU $ 021E 2041 0949 BYTE ' ASM' 021F 534D 0220 204D  0950 BYTE ' MAC' 0221 4143 0222 2054 0951 BYTE ' TXT' 0223 5854 0224 0000 0952  WORD 0 END OF TABLE MARKER 1PAGE 0042 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:34.25 P R O C E S S I N P U T S P E C I F I C A T I O N 00000225 0954 INPRO EQU $  0225 0901 0955 COPY =1%LISTCNC,A GET DEFAULT OPTION (LIST CNC) 0226 8441 0001 0956 COPY A,CUROPT(Y) SET UP OPTION WORD 0227 829C 0244 0957 COPY:M =:1001,A,DIRLUN(Y) USE :1001 FOR INPUT FILE DIR LUN 0228 8446 0006 0957+ 0229 FF9B 0245 0958 JSK NEXTFN 022A 53D8 0243 0959 JLT Q,INABRT IF WOOPS 022B 1147 0233 0960 JEQ A,INPNAMFS BRANCH ON INPUT FILENAME SPECIFIED 0000022C 0961 INPA EQU $ 022C 2933 0962 DEFIO INPBLK,='SI',=INPLUN 022D 8298 0246 0962+ 022E FF98 0247 0962+ 022F 80C9 0009 0963 COPY INPDEV(Y,X),A 0230 13C6 0237 0964 JLT A,INP00 0231 FF96 0248 0965 JSK ,  GETSI ASK USER TO ASSIGN SI 0232 9E79 022C 0966 JMP INPA TRY AGAIN UPON RETURN FROM MDE  00000233 0968 INPNAMFS EQU $ 0233 090B 0969 MOVBLK WRKBLK,INPBLK 0234 2933 0969+ 0235 FF93 0249 0969+ 0236 80C9 0009 0970 COPY INPDEV(Y,X),A 00000237 0971 INP00 EQU $ 0237 0C02  0972 CLSN A,=2 0238 9E8A 0243 0973 JMP INABRT ABORT IF INPUT IS A DIRECTORY 0239 8290 024A 0974 COPY =CNCTBL,A 023A FF90 024B 0975 JSK CONECT CONNECT WITH APPROPRIATE EXTENSION 023B 53C7 0243 0976 JLT Q,INABRT 0000023C 0977 INP3 EQU $ 023C C061 0021 0978 COPY IS:TC+ISMBLK(Y),Q GET TERMINATING CHAR 023D 4C28 0979 CLSN Q,='(' ANY OPTIONS PRESENT? 023E FF8D 024C 0980 JSK DOOPT YUP, DO EM 023F 2959 0981 OPENFL INPIOB,READ:ANY OPEN INPUT 0240 828C 024D 0981+ 0241 FF8C 024E 0981+ 0242 2309 0982 RSK R E T U R N 0243 9F0A 01CE 0983 INABRT JMP ABORT WOOPS, SOMETHING WRONG 000B 0984 LPOOL 0244 1001 0245 0105 NEXTFN 0246 5349 0247 0125 DEFIO 0248 012B GETSI 0249 0087 MOVBLK 024A 021E CNCTBL 024B 00A2 CONECT 024C 0178 DOOPT 024D 0131 READ:ANY 024E 0005 OPENFL 1PAGE 0043 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:35.50 I O B I N T --- INITIALIZE IOB 0000024F 0986 IOBINT EQU $ 024F 84C0 0000 0987 COPY A,IO:LUN(Y,X) PUT LUN IN IOB 0250 C4CA 000A 0988 COPY Q,INPIDX(Y,X) PUT BUFFER LENGTH IN INDEX 0251 0060 0989 COPY Y,A 0252 0022 0990 ADD X,A 0253 0B08 0991 ADD =INPCFI-INPIOB,A 0254 84C2 0002 0992 COPY A,IO:CFI(Y,X) ADDRESS OF CFI 0255 0B03 0993 ADD =INPBUF-INPCFI,A 0256 84C5 0005 0994 COPY A,IO:BUF(Y,X) ADDRESS OF BUFFER 0257 2309 0995 RSK  R E T U R N 0000 0996 LPOOL 1PAGE 0044 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:36.00 T A B L I N I T --- INITIALISE GFN/FIB 00000258 0998 TABLINIT EQU $ 0258 828C 0265 0999 COPY:M =CKW:FI,A,FI:CKW+FIBBLK(Y,X) 0259 84E5 0025 0999+ 0000025A 1000 GFNINIT EQU $ 025A 828B 0266 1001 COPY:M =CKW:GF,A,GF:CKW(Y,X) 025B 84CA 000A 1001+ 025C 090B 1002 COPY =GF:FBUF,A 025D 0022 1003 ADD X,A 025E 0062 1004 ADD Y,A 025F 84C0 0000 1005  COPY A,GF:NAME(Y,X) FILENAME BUFFER ADDRESS 0260 0912 1006 COPY =GF:PBUF,A 0261 0022 1007  ADD X,A 0262 0062 1008 ADD Y,A 0263 84C1 0001 1009 COPY A,GF:PASS(Y,X) PASSWORD BUFFER ADDRESS 0264 2309 1010 RSK 0002 1011 LPOOL 0265 AB16 CKW:FI 0266 AB14 CKW:GF 1PAGE 0045 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:36.25 I N I T --- INITIALIZ- E 00000267 1013 INIT EQU $ 0267 4050 1014 COPY L,Q LOW CORE LIMIT 0268 6070  1015 COPY K,Y CURRENT STACK 0269 6A00 1016 SUB =STKSIZ,Y 026A 5060 1017 COPY Y,L SET UP OUR STACK 026B A2DC 02C8 1018 COPY =YSIZ-1,X LENGTH OF SCRATCH -1 026C 6AFE 1019 SUB =2,Y BACK OFF Y FOR LOW ADDRESS SAVE 026D C441 0001 1020 COPY  Q,1(Y) SAVE LOW MEMORY AT L-1 026E 6023 1021 SUB X,Y SET NEW Y 026F 4900 1022  COPY =0,Q ) 0270 C4C0 0000 1023 COPY Q,0(Y,X) > CLEAR SCRATCH AREA 0271 35BE 0270 1024 JNED X,$-1 ) 0272 2959 1025 TABLINIT INPBLK,INPLUN,BUFLEN*2 0273 82D5 02C9 1025+ 0274 4950 1025+ 0275 FE59 024F 1025+ 0276 2ADA 1025+ 0277 FE60 0258 1025+ 0278 A2D1 02CA 1026 IOBINT  OPRIOB,'UL',BUFLEN*2 0279 82D1 02CB 1026+ 027A 4950 1026+ 027B FE53 024F 1026+ 027C 29BC 1027 TABLINIT LSTBLK,'LO',133 027D 82CE 02CC 1027+ 027E 4985 1027+ 027F FE4F 024F 1027+ 0280 2ADA 1027+ 0281 FE56 0258  1027+ 0282 A2CA 02CD 1028 IOBINT CMDIOB,'CI',PROMTLEN 0283 82CA 02CE 1028+ 0284 4906 1028+ 0285 FE49 024F 1028+ 0286 A2C6 02CD 1029 COPY =CMDIOB,X SETUP "CNC.." PROMPT PARAMETERS 0287 0906 1030  COPY:M =PROMTLEN,A,IO:BCT(Y,X) 0288 84C4 0004 1030+ 0289 82C5 02CF 1031 COPY:M =PROMTBUF,A,IO:BUF(Y,X) 028A 84C5 0005 1031+ 028B 0912 1032 COPY:M =WRITEPR,A,IO:FC(Y,X) 028C 84C3 0003 1032+ 028D 0070 1033  COPY K,A ) 028E 0B01 1034 ADD =1,A > SET UP ABORT STACK POINTER 028F 8445 0005 1035 COPY A,ABORTK(Y) ) 0290 290B 1037 COPY =WRKBLK,X 0291 FE48 025A 1038  JSK GFNINIT WRKBLK/GFN INITIALISATION 0292 82BD 02D0 1039 COPY:M =CKW:IS,A,GF:ISM+IS:CKW(Y,X) ISM " " 0293 84E7 0027 1039+ 1040 * 0294 82BC 02D1 1041 COPY:M =CIBUF:,A,GF:ISM+IS:UB(Y,X) USER COMMAND BUFFER ADDRESS 0295 84E4 0024 1041+ 0296 0950 1042 COPY:M =80,A,GF:ISM+IS:BC(Y,X) USER BUFFER BYTE COUNT 0297 84E5 0025 1042+ 00000298 1044 NOPPER EQU $ 1PAGE 0046 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:38.00 I N I T --- INITIALIZE 0298 9E83 029C 1045 JMP DONOP 0299 0900 1046 COPY:M =0,A,CIBUF: CLEAR FIRST WORD OF COMMAND BUFFER 029A 87B6 02D1 1046+ 029B 9E85 02A1  1047 JMP NORCI DON'T COPY COMMAND LINE UPON REENTRY 0000029C 1048 DONOP EQU $ 029C 0900 1049 COPY:M =0,A,NOPPER 029D 867A 0298 1049+ 029E 7A02 1050 E:RCI ISMBLK(Y) GET COPY OF COMMAND LINE IN OWN BUFFER 029F 0004 02A0 0021 000002A1 1051 NORCI EQU $ 02A1 1A44 1052  E:ISM ISMBLK(Y) GET FIRST SYMBOL 02A2 0004 02A3 0021 02A4 806E 002E 1053 COPY IS:BP+ISMBLK(Y),A ) 02. A5 8C62 0022 1054 SUB IS:NC+ISMBLK(Y),A ) PUT POINTER BACK 02A6 0AFF 1055 SUB =1,A  ) TO START 02A7 846E 002E 1056 COPY A,IS:BP+ISMBLK(Y) ) 02A8 A2A1 02CA 1058 COPY =OPRIOB,X 02A9 0943 1059 COPY:M =COMPLUNS,A,IO:FC(Y,X) 02AA 84C3 0003 1059+ 02AB 829F 02CB 1060 COPY ='UL',A 02AC 90C5 0005 1061 EXCH A,IO:DUN(Y,X) SAVE BUFFER ADDRESS 02AD 1A36 1062 I:IO 0(Y,X) COMPARE 'UC' & 'UL' LUNS 02AE 0005 02AF 0000 02B0 0000 1063 NOP 02B1 84C5 0005 1064 COPY A,IO:BUF(Y,X) RESTORE BUFFER ADDRESS 02B2 80C7 0007 1065 COPY IO:ST(Y,X),A 02B3 8448 0008 1066  COPY A,CLINFLAG(Y) <> 0 FOR DO NOT OVERPRINT '?' ERROR LINES 02B4 829D 02D2 1068 COPY:M =WRITEAPP,A,APPEND(Y) DEFAULT LIST MODE TO APPEND 02B5 8443 0003 1068+ 02B6 8287 02BE 1070 COPY SIGN:ON,A 02B7 4901 1071 COPY =1,Q UC DEVICE NUMBER 02B8 A29A 02D3 1072 COPY =SIGN:ON+1,X 02B9 FF9A 02D4 1073  JSK O:MSG 02BA 090D 1074 COPY =CR:,A 02BB 2901 1075 COPY =1,X 02BC FEFD 033A 1076 JSK O:IO 02BD 2309 1077 RSK R E T U R N 02BE 000C 1078 SIGN:ON WORD 12 02BF 2043 1079 BYTE ' CNC (',REVA//-8,REVA**:FF,REVB//-8,REVB**:FF,')' 02C0 4E43 02C1 2020 02C2 2845 02C3 3730 02C4 3029 02C5 2043 1080 PROMTBUF BYTE ' CNC..' 02C6 4E43 02C7 2E2E 0011 1081 LPOOL 1PAGE 0047 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:40.25 I N I T --- INITIALIZE 02C8 0147 02C9 1000 INPLUN 02CA 0115 OPRIOB 02CB 554C 02CC 4C4F 02CD 010A CMDIOB 02CE 4349 02CF 02C5 PROMTBUF 02D0 AB15 CKW:IS 02D1 03A3 CIBUF: 02D2 0133 WRITEAPP 02D3 02BF 02D4 037F O:MSG 02D5 02D6 02D7 02D8 1PAGE 0048 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:40.25 C N C M A I N L I N E  000002D9 1083 START EQU $ 02D9 FE0D 0267 1084 JSK INIT 000002DA 1085 START1 EQU  $ 02DA FF91 02EC 1086 JSK INPRO PROCESS INPUT FILE SPECIFICATION 02DB FF91 02ED 1087 JSK CNC MAKE CONCORDANCE 02DC 1141 02DE 1088 JEQ A,$+2 IF NO PROBLEMS, CONTINUE 02DD 9F90 02EE 1089 JMP GOAWAY ELSE, EXIT FROM CNC 02DE 2959 1090 CLOSFL INPIOB 02DF FF8F 02EF 1090+ 02E0 8061 0021 1091 COPY IS:TC+ISMBLK(Y),A 02E1 0C2B 1092 CLSN A,='+' MORE?  02E2 9E77 02DA 1093 JMP START1 YUP, DO IT 02E3 0C2C 1094 CLSN A,=',' 02E4 9E75 02DA 1095 JMP START1 02E5 29BC 1096 CLOSFL LSTIOB 02E6 FF88 02EF 1096+ 02E7 1141 02E9 1097  JEQ A,$+2 02E8 9F87 02F0 1098 JMP ABORT ABORT ON BAD TERMINATOR 02E9 7A01 1099  E:MON GO BACK TO SYSTEM 02EA 0000 02EB 0000 0005 1100 LPOOL 02EC 0225 INPRO 02/ ED 0209 CNC 02EE 0056 GOAWAY 02EF 0013 CLOSFL 02F0 0023 ABORT 1PAGE 0049 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:41.50 GET CHARACTER--DO AN INPUT 000002F1 1102 GETCHAR EQU $ GET CHAR FROM INPUT BUFFER 02F1 6022 1103 ADD X,Y POINT Y TO BLOCK 02F2 0020 1104  COPY X,A SAVE X IN A 02F3 A04A 000A 1105 COPY INPIDX(Y),X 02F4 C046 0006 1106 COPY  IO:ACT(Y),Q GET MAX IN BUFFER 02F5 204B 1107 CSK X,Q ANY BYTES IN BUFFER 02F6 9E9A 0311 1108 JMP GETBYT GO GET THE NEXT BYTE 02F7 9E82 02FA 1109 JMP ENDLIN NO,GO GET ANOTHER LINE 02F8 490D 1110 COPY =CR:,Q SEND A CR BACK 02F9 9E9A 0314 1111 JMP GODRT1  000002FA 1112 ENDLIN EQU $ 02FA 4060 1113 COPY Y,Q RESET BUFFER POINTER 02FB 4B0B 1114 ADD =IOBUF,Q BUMP Q TO IO BUFFER 02FC C445 0005 1115 COPY Q,IO:BUF(Y) PUT BUFFER BACK 02FD 4950 1116 COPY:M =MAXREC,Q,IO:BCT(Y) 02FE C444 0004 1116+ 02FF 4901 1117 COPY:M =READFA,Q,IO:FC(Y) 0300 C443 0003 1117+ 0301 1A36 1118 I:IO 0(Y) 0302 0004 0303 0000 0304 9EB3 0338 1119 JMP ABGET SOME DAYS!!!!! 0305 C046 0006 1120 COPY IO:ACT(Y),Q RECORD READ ACTUALLY NULL? 0306 51C4 030B 1121 JNE Q,CHKSIZ NO, PROCESS SIZE THEN 0307 A04B 000B 1122 COPY  IOBUF(Y),X YES, IS BUFFER STARTED WITH A CR? 0308 2E79 1123 SHIFT X,RO,8 0309 2AF3 1124  SUB =CR:,X LINE STARTS WITH A CR? 030A 31AF 02FA 1125 JNE X,ENDLIN NO, MUST BE DELETED LINE.  030B A044 0004 1126 CHKSIZ COPY IO:BCT(Y),X 030C 204B 1127 CSK X,Q COMPARE WITH ACTUAL COUNT 030D A446 0006 1128 COPY X,IO:ACT(Y) AND SAVE THE SMALLEST 030E 0000 1129 NOP 030F 2900 1130 COPY:M =0,X,INPIDX(Y) MAKE THE INDEX TO THE BUFFER ZERO 0310 A44A 000A 1130+ 00000311 1131 GETBYT EQU $ GET NEXT BYTE FROM BUFFER 0311 0E25 1132 BYTEMODE 0312 C0D6 0016 1133  COPYB IOBUF(Y,X),Q PUT NEXT BYTE IN A 0313 0E27 1134 WORDMODE 00000314 1135 GODRT1 EQU $  0314 2B01 1136 ADD =1,X BUMP INDEX 0315 A44A 000A 1137 COPY X,INPIDX(Y) SAVE IT 00000316 1138 GODRTN EQU $ 0316 6003 1139 SUB A,Y 0317 0048 1140 EXCH  Q,A 0318 007D 1141 RBIT 7,A TURN OFF PARITY BIT 0319 2309 1142 RSK  BYE 0001 1144 LPOOL 031A 0338 ABGET 1PAGE 0050 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:47.75 PUTCHAR--OUTPUT A CHARACTER 0000031B 1146 PUTCHAR EQU $ 031B 6022 1147 ADD X,Y POINT TO BLOCK 031C 4000 1148 COPY A,Q SAVE A I0 N Q 031D 407D 1149 RBIT 7,Q RESET THE PARITY BIT FOR ROGER 031E 0020 1150 COPY  X,A SAVE X IN A 031F 4C0D 1151 CLSN Q,=CR: ARE WE AT END OF LINE? 0320 9E8E 032F 1152 JMP SNDLIN YES SEND THE LINE 0321 A044 0004 1153 COPY IO:BCT(Y),X GET CURRENT INDEX TO RECORD 0322 904A 000A 1154 EXCH INPIDX(Y),A TRADE MAXLEN AND A 0323 002B 1155 CSK A,X  CAN WE PUT OUT MORE? 0324 9E87 032C 1156 JMP RSTRA NO,GO AWAY 0325 9E81 0327 1157 JMP $+2 YUP, GO DOIT TOIT 0326 9E85 032C 1158 JMP RSTRA 0327 0E25 1159 BYTEMODE  YES 0328 C4D6 0016 1160 COPYB Q,IOBUF(Y,X) STORE BYTE 0329 0E27 1161 WORDMODE 032A 2B01 1162 ADD =1,X BUMP X 032B A444 0004 1163 COPY X,IO:BCT(Y) SAVE IT 0000032C 1164 RSTRA EQU $ 032C 904A 000A 1165 EXCH INPIDX(Y),A RESTORE A AND OUT INDEX 032D 4900  1166 COPY =0,Q CLEAR OUTPUT FLAG 032E 9E67 0316 1167 JMP GODRTN AND RETURN  0000032F 1168 SNDLIN EQU $ 032F 4911 1169 COPY:M =WRITEFA,Q,IO:FC(Y) 0330 C443 0003 1169+ 0331 1A36 1170 I:IO 0(Y) 0332 0004 0333 0000 0334 9E83 0338 1171 JMP ABGET 0335 4900  1172 COPY:M =0,Q,IO:BCT(Y) 0336 C444 0004 1172+ 0337 9E5E 0316 1173 JMP GODRTN 00000338  1174 ABGET EQU $ 0338 48FF 1175 COPY =-1,Q 0339 9E5C 0316 1176 JMP GODRTN  BYE 1PAGE 0051 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:49.00 I/O INTERFACE---O:IO 1178 ** 1179 * FUNCTION: CHARACTER I/O (SEE OMEGA) 1180 *  1181 * ENTRY: A = CHAR 1182 * X = LUN NO. 1183 * JSK O:IO  1184 * 1185 * EXIT: A = CHAR (FOR GETS) 1186 * A SHOULD HAVE BEEN GIVEN TO O:IO FOR PUTS 1187 ** 0000033A 1188 O:IO EQU $ 033A 4309 1189 PUSH F:XA:  SAVE REGS ETC 033B 0040 033C 6050 1190 COPY L,Y GET L SO WE CAN GET OUR Y 033D EE90 034E 1191 SUB =YSIZ+1,Y POINT TO OUR Y AREA 033E 8449 0009 1192 COPY A,TEMPA(Y) SAVE INCASE WE ARE OUTPUTTING 033F 0900 1193 COPY =0,A WE NEED THIS LATER 0340 4907 1194 COPY =7,Q TEST FOR LEGAL LU 0341 402B 1195 CSK Q,X IS X IN RIGHT RANGE? 0342 9EB9 037C 1196 JMP NOLUN NO,GO AWAY 0343 33BE 0342 1197 JLT X,$-1 MAYBE, TEST AGAIN 0344 230A 1198 XNX X 0345 9F80 0346 1199 JMP *LEGLUN 00000346 1200 LEGLUN EQU  $ TABLE OF LEGAL UNITS AND THEIR PROCESSING 0346 037C 1201 WORD BADLUN 0347 0350 1202 1  WORD COCHAR 0348 0367 1203 WORD SICHAR 0349 037C 1204 WORD BADLUN 034A 037C 1205 WORD BADLUN 034B 037C 1206 WORD BADLUN 034C 0352 1207 WORD  LOCHAR 034D 037C 1208 WORD BADLUN 0002 1209 LPOOL 034E 0149 034F 00000350  1210 COCHAR EQU $ 0350 A2A0 0371 1211 COPY =OPRIOB,X 0351 9E8E 0360 1212 JMP COMCHAR  GO DO COMMON OUTPUT 00000352 1213 LOCHAR EQU $ 0352 4901 1214 COPY =1,Q SET LIST FLAG 0353 D044 0004 1215 EXCH Q,LISTFLAG(Y) AND TEST IT 0354 29BC 1216 COPY =LSTIOB,X  POINT TO LIST IOB 0355 51CA 0360 1217 JNE Q,COMCHAR 0356 4930 1218 COPY:M =OPEN,Q,IO:FC(Y,X) 0357 C4C3 0003 1218+ 0358 C043 0003 1219 COPY:M APPEND(Y),Q,IO:FOP(Y,X) 0359 C4C4 0004 1219+ 035A 1A36  1220 I:IO 0(Y,X) 035B 0005 035C 0000 0000035D 1221 GOERRR EQU $ 035D 9E9E 037C 1222  JMP IOERRR COULDN'T OPEN?!?!?! 035E 4900 1223 COPY:M =0,Q,IO:BCT(Y,X) 035F C4C4 0004 1223+ 1PAGE 0052 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:50.75 I/O INTERFACE---O:IO  00000360 1224 COMCHAR EQU $ COMMON OUTPUT 0360 09FF 1225 COPY =:FF,A 0361 9449 0009 1226 AND TEMPA(Y),A GET CHARACTER 0362 FE38 031B 1227 JSK PUTCHAR PUT IT AWAY 0363 13B9 035D 1228 JLT A,GOERRR IF TROUBLE 0364 6309 1229 POP RESTORE REGISTERS 0365 2900 1230 COPY =0,X GOOD STATUS 0366 2309 1231 RSK  R E T U R N 00000367 1232 SICHAR EQU $ 0367 2959 1233 COPY =INPIOB,X 0368 FE08 02F1 1234 JSK GETCHAR GET INPUT CHARACTER 0369 13CC 0376 1235 JLT A,IOERR GO FIND OUT WHAT WENT WRONG 036A 6070 1236 COPY K,Y SAVED REGISTERS 036B 0E25 1237 BYTEMODE 036C 8445 0005 1238 COPYB A,LAST:A+1(Y) PUT BYTE IN A(0-7) 036D 0E27 1239 WORDMODE 036E 6309 1240 POP RESTORE REGISTERS 036F 2900 1241 COPY =0,X GOOD I/O FLAG 0370 2309 1242 RSK R E T U R N 0002 1243 LPOOL 0371 0115 OPRIOB 0372 00000373 1244 SII3 EQU $ 0373 6309 1245 POP 0374 2901 1246 COPY  =E:EOF,X 0375 2309 1247 RSK 00000376 1248 IOERR EQU $ 0376 2040 1249 COPY  Q,X IOB OFFSET 0377 80C7 0007 1250 COPY IO:ST(Y,X),A STATUS 0378 13C3 037C 1251 JLT  A,IOERRR BIG TROUBLE 0379 187F 1252 AND =:7F,A 037A 0C01 1253 CLSN A,=X:IOEOF 037B 9E77 0373 1254 JMP SII3 IF EOF, TELL 'EM 0000037C 1255 BADLUN EQU $ 0000032 7C 1256 NOLUN EQU $ 0000037C 1257 IOERRR EQU $ BIG TROUBLES 037C 6309 1258  POP RESTORE REGISTERS 037D 2903 1259 COPY =E:DEV,X 037E 2309 1260 RSK R E T U R N 1PAGE 0053 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:51.75 I/O INTERFACE---O:MSG 1262 ** 1263 * FUNCTION: OUTPUT A MESSAGE  1264 * 1265 * ENTRY: A = BYTE COUNT 1266 * Q = LUN 1267 *  X = MESSAGE ADDR 1268 * JSK O:MSG 1269 * 1270 * EXIT: RSK  1271 ** 0000037F 1272 O:MSG EQU $ 037F 4309 1273 PUSH F:XA: SAVE REGISTERS 0380 0040 0381 6900 1274 COPY =0,Y CLEAR BYTE INDEX 00000382 1275 MSG010 EQU $ 0382 600A 1276 CSN A,Y ARE WE DONE YET ? 0383 9E8C 0390 1277 JMP MSG020  JUMP IF YES 0384 6028 1278 EXCH X,Y SWAP STRING/BYTE INDEX 0385 0E25 1279 BYTEMODE SET BYTE ADDRESSING MODE 0386 80C0 0000 1280 COPYB 0(Y,X),A OBTAIN A CHARACTER 0387 0E27  1281 WORDMODE SET WORD ADDRESSING MODE 0388 6028 1282 EXCH X,Y SAVE BYTE INDEX 0389 2040 1283 COPY Q,X SET LUN FOR I/O 038A FE2F 033A 1284 JSK O:IO  OUTPUT A CHARACTER 038B 31C5 0391 1285 JNE X,MSG030 JUMP IF I/O ERROR 038C 2070 1286 COPY K,X OBTAIN STACK ADDRESS 038D 8082 0002 1287 COPY LAST:A(X),A GET BYTE COUNT 038E A084 0004 1288 COPY LAST:X(X),X RESET STRING ADDRESS 038F 74B2 0382 1289 IJNE Y,MSG010 CONTINUE WITH NEXT CHARACTER 00000390 1290 MSG020 EQU $ 0390 2900 1291 COPY =0,X INDICATE GOOD I/O STATUS 00000391 1292 MSG030 EQU $ 0391 6070 1293 COPY K,Y OBTAIN STACK POINTER 0392 A444 0004 1294 COPY X,LAST:X(Y) SAVE ERROR CODE 0393 6309 1295 POP  RESTORE REGISTERS 0394 2309 1296 RSK RETURN 0000 1297 LPOOL 1PAGE 0054 MACRO (F300) CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) 1982/02/01 16:25:52.75 GET ASCII DATE AND TIME  1299 ** 1300 * FUNCTION: GET ASCII DATE AND TIME FROM CARTOS 1301 *  1302 * ENTRY: JSK O:GATD 1303 * 1304 * EXIT: DATA IS IN 7 WORD BUFFER AT O:DATE  1305 ** 00000395 1306 O:GATD EQU $ 0395 1A2A 1307 R:GATD O:DATE 0396 0000 0397 0000 0398 1A2D 1307+ 0399 0000 039A 039C 039B 2309 1308 RSK 1309 * 039C 0000  1310 O:DATE RES 7,0 LATEST READING GOES HERE 0000 1311 LPOOL 1312 * 3  1313 * 03A3 0000 1314 CIBUF: RES 64,0 COMMAND INPUT BUFFER 1316  END 0000 ERRORS (0000/0000) 0000 WARNINGS (0000/0000) 1PAGE 0055 MACRO (F300) 1982/02/01 16:25:54.00 SI = DH01.CARTOSCNCIF.ASM SO = DH01.CARTOSCNCIF.OBJ LO = DH01.CARTOSCNCIF.LST **** GRAND-TOTALS **** 0000 ERRORS (0000/0000) 0000 WARNINGS (0000/0000) 1PAGE 0001 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) CNC (E600) 82/02/01 16:25:58 X 0000 CLEANUP 0019 0037 N 0054 CLEANUP: 0049 0036 CLEANUPP 0056 0041 DBGENTRY 0066  X 0000 DEBUGC 0017 0046 0046 DEBUGP 0042 U 0000 E:XXXX 0008 0022 EDB 0004 0068  0038 EMONE 0043 0062 0025 ERB 0006 0022 X 0000 G:Z 0016 0034 N 0064 JMPDEBUG 0051 U 0000 MAC 0004 0005 0006 0007 0008 0003 OLDOPS 0009 U 0000 ON 0005 N 0060 POSTMTEM 0052 X 0000 R:HIGH 0018 0030 N 0057 RESTART: 0050 N 0027 STARTUP 0015 0026* 0059 0026 TDB 0007 0022 U 0000 USERCOMM 0005 N 0020 UTILENV 0014 0012 UTILITY: 0013 U 0000 X1 0004 0005 0006 0007 0008 00068 SOURCE LINES 1PAGE 0001 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) CNC (E600) 82/02/01 16:25:59 U 0000 FIB 0092 U 0000 GFN 0093 U 0000 IOB 0095 U 0000 ISM 0094 U 0000 MAC 0091 0092 0093 0094 0095 0096 0097 U 0000 N 0091 0090 OPT 0098 U 0000 SYSCOMMO 0091 U 0000 X1 0091 0092 0093 0094 0095 0096 0097 U 0000 X:COMMON 0096 U 0000 X:IOERR 0097 00032 SOURCE LINES 1PAGE 0001 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) CNC (E600) 82/02/01 16:26:09 1174 ABGET 1119 1171 U 0000 ABNORMAL 0447 0395 ABORT 0840 0917 0983 1098 0410 ABORT10 0405 0412 ABORT11 0408 0409 U 0000 ABORTK 0297 0398 1035* 0750 APP1 0747 U 0000 APPEND 0295 0752* 1068* 1219 0745 APPROC 0911* 0738 ASIGNLEN 0734  0734 ASIGNLUN 0723 0725 0738 U 0000 BACK 0865 0887 U 0000 BACKUP 0299 0402 0423 0652* 0672* 0800* 0842* 1255 BADLUN 1201 1204 1205 1206 1208 0243 BLKLEN 0250 0303* 0305* 0311* 0531 0244 BUFLEN 0249 0310 0323* 1025 1026 U 0000 BY: 0174 0181 0173 BYTEMODE 0497 CHECKLO 0920  0511 CHECKLOX 0502 0482 CHECKTV 0915 1126 CHKSIZ 1121 1314 CIBUF: 1041 1046* U  0000 CKW:FI 0999 U 0000 CKW:GF 1001 U 0000 CKW:IS 1039 U 0000 CL: 0278 U 0000 CLASS:FM 0627 U 0000 CLASS:TV 0485 N 0449 CLEANUP 0118 0446 U 0000 CLINFLAG 0300 0432 0653* 1066*  0278 CLOSE 0375 0383 CLOSERR 0377 0205 CLOSFL 0205 R 0374 CLOSFL 0385 CLOSRT U 0000 CMDCFI 0318 U 0000 CMDIOB 0317 0648 1028 1029 U 0000 CMDTMP 0319 0914 CNC 1087 4  0109 CNC:CART 0108 0948 CNCTBL 0974 U 0000 CO: 0279 0280 1210 COCHAR 1202 U 0000 COL: 0279 1224 COMCHAR 1212 1217 0279 COMPLUNS 1059 0615 CON1 0581 0620 CON2 0572 U 0000 CON: 0280 0565 CONECT 0716 0975 0601 CONECTRY 0590 0612 CONERR  0578 0609 0610 CONERR2 0599 0617 1PAGE 0002 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) CNC (E600) 82/02/01 16:26:09 0606 CONERR3 0624 0280 CONNECT 0570 0636 CONRTN 0568 0258 CR:  0165 0727 1074 1110 1124 1151 U 0000 CUROPT 0293 0824 0831* 0932 0956* U 0000 DC: 0281  0198 DEFIO 0201 R 0713 DEFIO 0274 DEFPGSZ 0501 0505 0509 0762 0772 0779 U 0000 DIRLUN 0234 0298 0957* 1048 DONOP 1045 0799 DOOPT 0835 0837 0980 0801 DOOPT1A 0806 0807 DOOPT1B 0804 0816 DPT1 0813 0831 DPT2 0828 0832 DPT2A 0753 0763 0793 0841 DPT3 0839 0814 DPT5 0811 0219 DRES 0281 DSCONECT 0381 0272 E:DEV 1259 0273 E:EOF 1246 0233 E:GFN 0229 E:ISM 0166 END 0163 1112 ENDLIN 1109 1125 0666 EOLQQ 0680 U 0000 ER: 0278 0280 U 0000 F:XA: 0524 0721 0856 1189 1273 U 0000 FA:  0283 0285 U 0000 FI:CKW 0999 U 0000 FI:CLAS 0550 U 0000 FI:FLG 0579 U 0000 FI:FRMS 0500 0506 U 0000 FI:NAME 0571 U 0000 FI:TYPE 0630 0250 FIBBLK 0251 0500 0506 0543 0550 0571  0574 0579 0630 0999 0252 FIBLEN 0251 0306* 0312* 0591 FILENFND 0588 U 0000 FIV:DIR 0631 U  0000 FU: 0278 0282 0284 N 0329 G:Z 0329 1131 GETBYT 1108 1102 GETCHAR 1234  0539 GETCLASS 0484 0625 0720 GETSI 0965 U 0000 GF:CKW 1001* U 0000 GF:DFUN 0235 U 0000 GF:DUN 0234 0573 U 0000 GF:FBUF 0247 0248 1002 U 0000 GF:FEXTL 0580 U 0000 GF:ILUN 0622 0714* U 0000 GF:ISM 1039 1041 1042 1PAGE 0003 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) CNC (E600) 82/02/01 16:26:09 U 0000 GF:NAME 0571 1005* U 0000 GF:PASS 1009* U 0000 GF:PBUF 1006 U 0000 GF:PROT 0245 0266 GFF:DIRB 0681 0264 GFF:FNB 0677 0267 GFF:JLUB 0683 0265 GFF:SEB 0679 U 0000 GFF:WC 0689 1000 GFNINIT 1038 U 0000 GO 0875 1099 0445 GOAWAY 1089  1135 GODRT1 1111 1138 GODRTN 1167 1173 1176 1221 GOERRR 1228 0983 INABRT 0959 0973 0976 1013 INIT 1084 0971 INP00 0964 0977 INP3 0961 INPA 0966 U 0000 INPBLK 0305 0483 0962 0969* 1025 U 0000 INPBUF 0310 0993 U 0000 INPCFI 0308 0991 0993 0246 INPDEV 0698 0963 0970 U 0000 INPFIB 0306 0253 INPIDX 0254 0988* 1105 1130* 1137* 1154* 1165* U 005 00 INPIOB 0307 0450 0981 0991 1090 1233 0240 INPLUN 0962 1025* 0968 INPNAMFS 0960 0954 INPRO 1086 U 0000 INPTMP 0309 U 0000 IO:ACT 1106 1120 1128* U 0000 IO:BCT 0358* 0414* 0549 1030* 1116* 1126 1153 1163* 1172* 1223* U 0000 IO:BUF 0362* 0994* 1031* 1064* 1115* U 0000 IO:CFI 0992*  U 0000 IO:DUN 0573 0622 0722 1061* U 0000 IO:FC 0355* 0375* 0381* 0400* 0542 0570 1032* 1059* 1117* 1169* 1218* U 0000 IO:FIB 0546 0577 0621 U 0000 IO:FOP 0354* 1219* U 0000 IO:LUN 0378 0987* U  0000 IO:ST 0586 0607 0642 1065 1250 0251 IOBBLK 0193 0194 0542 0546 0547 0549 0570 0573 0577 0586 0602 0607 0616 0621 0622 0623 0642 0722 0185 IOBINT 0189 R 0986 IOBINT 0242 IOBLEN 0253 0307* 0313* 0317* 0320* 0254 IOBUF 0361 1114 1122 1133 1160* 1248 IOERR 1235 1257 IOERRR 1222 1251 U 0000 IS:BC 1042 U 0000 IS:BP 0401 0651 0672 0800 0842 1053 1056 U 0000 IS:CKW 1039 U 0000 IS:DF 0770 0784 U 0000 IS:DV 0774 0786 1PAGE 0004 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) CNC (E600) 82/02/01 16:26:10 U 0000 IS:NC 0803 0844 1054 U 0000 IS:SB 0808 0816 U 0000 IS:TC 0407 0676 0766 0776 0833 0978 1091 U 0000 IS:UB 1041 U 0000  ISMBLK 0304 0401 0407 0650 0651 0672 0676 0766 0769 0770 0774 0776 0783 0784 0786 0800 0802 0803 0808 0816 0833 0842 0843 0844 0978 1050 1052 1053 1054 1056 1091 0261 LAST:A 0868 0888 0891* 1238 1287 0260 LAST:P 0262 LAST:Q 0869 0263 LAST:X 0890* 1288 1294* 1200 LEGLUN 1199 0898 LISTCNC 0905* 0955 U 0000 LISTFLAG 0296 1215* 1213 LOCHAR 1207 0865 LOOK1 0882 0871 LOOK2 0863 0876 LOOK3 0883 0892 LOOK4 0862 0872  0855 LOOKUP 0819 U 0000 LSTBLK 0311 0498 1027 U 0000 LSTBUF 0316 U 0000 LSTCFI 0314 U 0000 LSTFIB 0312 U 0000 LSTIOB 0313 0451 1096 1216 0902 LSTPRO 0909* U 0000 LSTTMP 0315 0736 LUNINMES 0722* 0249 MAXREC 1116 0585 MORECN 0603 0213 MOVBLK 0216 R 0523 MOVBLK 0532 MOVE1 0534 0162 MSG 1275 MSG010 1289 1290 MSG020 1277 1292 MSG030 1285 0247 NAMBEG 0248 NAMEXT 0465 0468 0647 NEXTCL 0669 0805 0671 NEXTFN  0958 0688 NEXTFN10 0678 0692 NEXTFN20 0682 0695 NEXTFN30 0684 0685 NEXTFNER 0675 0690 0700 NEXTFNXT 0668 U 0000 NOFLG 0292 0746 0760 0810* 0827 1256 NOLUN 1196 1044 NOPPER 1049* 1051 NORCI 1047 N 1310 O:DATE 0116 1307 N 1306 O:GATD 0115 N 1188 O:IO  0113 0729 1076 1284 N 1272 O:MSG 0114 0726 1073 1PAGE 0005 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-6 E700) CNC (E600) 82/02/01 16:26:10 X 0000 OE:CNC 0120 0334 0933 N 0937 OE:IBR 0112 N 0940 OE:IGR  0111 N 0331 OE:START 0110 0221 OFFSET 0220 0221 R 0291 OFFSET U 0000 OP: 0282 0282 OPEN 0355 1218 0204 OPENFL 0204 R 0353 OPENFL U 0000 OPEX: 0289 U 0000 OPFIL:  0287 0288 0289 U 0000 OPRBUF 0323 0416 U 0000 OPRCFI 0321 U 0000 OPRE: 0287 U 0000 OPRIOB 0320 0399 0443 1026 1058 1211 U 0000 OPRTMP 0322 U 0000 OPSEQ: 0287 0288 0289 0904 OPTABLE 0818 0899 OPTBA 0906* R 0138 OPTENTRY 0145 0146 0147 0148 0151 R 0144 OPTENTRY R 0145 OPTENTRY R 0146 OPTENTRY R 0147 OPTENTRY 0840 OPTERR 0796 0815 0820 0845 0900 OPTLO 0907* 0901 OPTLR 0908* U 0000 OPWR: 0288 0245 OUTDEV 0246 0566 0635* 0673 0715* 0759 PAGEPRO 0910* 0795 PAGERR 0768 0785 0765 PAGESIZE 0761 0789 PGJOIN 0780 U 0000 PGPARMS 0294 0762* 0775* 0790 0792* 0918 0782 PGWDTH 0778 1080 PROMTBUF 1031 0259 PROMTLEN 0413  0424 1028 1030 1146 PUTCHAR 1227 0224 R:GATD U 0000 RE: 0283 0287 READ:ANY 0981*  0283 READFA 1117 0284 READFIB 0542 0540 READFIB: 0499 0132 REVA 0436 1079 1079  0133 REVB 0438 1079 1079 U 0000 RIB: 0284 1164 RSTRA 1156 1158 0633 RTNFND 0605 0619 0628 U 0000 SET 1279 1281 0697 SETDEV 0691 0694 0464 SETEXT 0600 1232 SICHAR 1203 1PAGE 0006 CARTOS-OMEGA4 CONCORDANCE INTERFACE (84-93467-14-E700) CNC (E600) 82/02/01 16:26:10 N 1078 SIGN:ON 0117 1070 1072 1244 SII3 1254 0163 SIZE 0164 1168 SNDLIN 1152 1083 START 0337 1085 START1 1093 1095 0330 START: 0271 STKSIZ 1016 0594 STRTCN 0584  0192 TABLINIT 0195 R 0998 TABLINIT U 0000 TEMPA 0301 0527* 0533 0592 0595* 1192* 1226 U 0000 TEMPB 0302 0530* 0533 0582* 0598 0641 UEX 0589 0611 0731 0644 UEXIT 0643 0180 WORDMODE U 0000 WP: 0286 U 0000 WR: 0285 0286 0288 WRITEANY 0748 0289 WRITEAPP 0751 1068 0285 WRITEFA 0400 1169 0286 WRITEPR 1032 U 0000 WRKBLK 0303 0673 0674 0698 0969 1037 U 0000 X:FMUNKN 0587 U 0000 X:IODNF 0608 U 0000 X:IOEOF 1253 U 0000 YES 1159 U 0000 YSIZ 0324 0397 0943 1018 1191 01216 SOURCE LINES R:GATD U 0000 RE: 0283 0287 READ:ANY 0981*  0283 READFA 1117 0284 READFIB 0542 0540 READFIB: 0499 0132 REVA 0436 1079 1079 JPOSTMTEMJMPDEBUGRESTART:JCLEANUP:STARTUP UTILENV O0SEGMENTBLANK UTILITY:o =KCLEANUP R:HIGH G:Z MDEBUGC NQDB: SMD: SDB: NMDB: R:TDBL im MACRO (F300) @iglllll  7 « ÿÿÿÿÿÿ«  k$#%,)ðgÿp‚Œ PŸ€tÿˆzÿÿ¢‚1;œ€uttigd3ÿÿgd,ÿÿgd4ÿÿgd7ÿÿiO0SEGMENTBLANK oim MACRO (F300) @ÿÿJG:Z CLEANUP SIGN:ON JO:DATE O:GATD O:MSG JO:IO OE:IBR OE:IGR JOE:STARTO0SEGMENTBLANK  CNC:CARTo ãKOE:CNC im MACRO (F300) @im *** CARTOS CONCORDANCmE INTERFACE -- REVISIOm N E700 *** gg  I¢äG) Ÿâ„ÄI0ÄÃ6Hÿ „Ä`" „Å# ÂÔÄÃ6 žˆÀÀLO# IPÄÃ6Hÿ# `P îÄ€Ep¢Â „ÀnÀGKKž„ ÀaQÂÁ@ „Ä ‚³I?`%ÄÀ 5¾` O+`I ÄÀ5¾'¦  È 1A£Ä@¢ÄA¡ÄB ÄC`6þƒzÿÿg )Yþ7)¼þ5# ÄÑ "%„á'. # tÙ @1I +( (E700) )3þ¢Jú # )–þ€ãŠHyÁ 'ÀãNq QÁƒ@# H'HC @ b+¤I b „J)Ê…É5½c # I3ÄéI @b@"Ðê6&ÄêÀÖ# ÀÉSA žÅ@ÂÅÄéÀÀÄÛ6mÀÂÄëI@b@" Äê^IÄ×ÀÆS\¤J ž‡€í޲B þ³žˆ I+¤I€€À JJþ6 &žo žœ€íŽ Aþ Hÿ# 6 &žy žIÄêÀÇÄë6&žl þ4 JÿQÄ ÀØL ü„ÉI# @@€§€€í>ô # 6 z! „n„Gÿ „H# Qàþp€n„G „T€F„M  „P= ÉÀa6H6,/6G 6GHÿ#  ¼žƒ ž „T # „Ç „Éÿ# ¢ C @€ë†‚‰I¢šÿš )ÿ˜c  þ8# $ ASSIGN LUN: T HEN TYPE REENTER :: €@‚ýž‚ü„CžÃ€@Âø„Bž¾ ÀaJÃQÙD!€cB 'ž€d„B ÀaJÖQB‚瞇D!€cÆ€dq ÀB@ÄBž¢ž¨€n„GD!ÀbQ ÿÓžy g®Ñ¤@1B(ÿž‚JþR×+( b ‚ÉþœÒ-ÿ3Aœ€ÀA# @ €@B#  @ ÄAÀaL,ž\L+žZL)žŸ­€n„G D!€b¸# C @`€@@ žž›ž†'@``pÉBàC`H€ARJÿ k%`(C €@`(C Œ@®U¸ ``p'©B €¤D„Bc # #23H'HõNOÖ CONCORDANCE BATCH  OPCODES @REGI STERS 0LISTING PAGESIZE VAPPEND O ÿQÁŸBÀBQÁÿŒ P*ÿ €€AŸˆgÿžg `Pî„# qvt I ASM MAC TXT „A‚œ„F ÿ›SØG)3‚˜ÿ˜€ÉÆÿ–žy )3 ÿ“€É žŠ‚ÿSÇÀaL(ÿ)Y‚ŒÿŒ# Ÿ SI%+‡¢x1 „ÀÄÊ`" „ „Å# ‚Œ„å‚‹ „Ê "b„À "b„Á# «« @P`pjP`¢ÜjþÄA`#IÄÀ5¾)Y ‚ÕIPþY*Úþ`¢Ñ‚ÑIPþS)¼‚ÎI… þO*ÚþV¢Ê‚ÊIþI¢Æ „ĂńÅ „Ãp „E) þH‚½„炼„ä P „垃 ‡¶ž… †zz!D !€nŒb ÿ„n¢¡ C„ŸÅ6 „ŀDŽH‚„C‚‡I¢šÿš )þý# g CNC (E700) CNC..GULLO CIÅ«£3¿ þ ÿ‘ÿ‘AŸ)Yÿ€a +žw ,žu)¼ÿˆAŸ‡z% V# `"  JÀF Kžšž‚I žš@`K ÄE IPÄDIÄC6ž³ÀFQÄ K.y *ó1¯ D K¤F)¤J%ÀÖ'+¤J`H}# 8 `"@@} L žŽ DJ+ž‡žž… %ÄÖ'+¤DJIžgIÄC6žƒIÄDž^Hÿž\g C @`Pî„I I@+ž¹3¾# Ÿ€|Pg|||R| I¢ žŽIÐD)¼QÊI0ÄÃÀCÄÄ 6žžIÄÄ ÿ”Iþ8¹c ) # )YþÌ`p%„E'c )#  c )# @€Çà žwc )# g C @i` žŒ`(%€À'`( @þ/ 1Å p€‚ „t²)`p¤Dc # g*-œ# g@ÿÿ# „Ç „Éÿ# ¢ C @€ë†‚‰I¢šÿš )ÿ˜c  þ8# $ ASSIGN LUN: T HEN TYPE REENTER :OVicEdDano$ ¥¢¦tjìæs`@nyqÁiHælXÿÆijé gMæh g€ÿàîdîcîbæb IÇ¿Æ_Æ_ÇÀÆ^Æ_Æ] 6ÁÞW 6Áß· 6ÁÞR 6ÁÞR 6ÁÞMž‚ÞLž¿« ‡¥‡©‡¤‡¨¢<§§ÿHüC „„T½ „„+¦4؇¢€€„+ߘž|ã˜jÿn ‚ˆ†ˆ¢”Þ†ƒ…„€+u»žÍ; „ ú 8 @Pk A ÂO F;ð hÜæ|â¦I#‚¥„@kU½â )ÿ q„@1ÔºžŸm)ÿ—1Ì„@ ŸgkÞdžn)ÿŽ1Æ Ÿ_žz–‹ „@ÞZ ŸXƒ · ÿ¢‰ G±.9 6¹$# € ƒ6AŸ¨Ã1þoß0ß.ƒ-Ž£Á‡* ‡– ‡•‡‡”†[†[‡š‡‘‡‘‡‘‚‘‡‘¾+ž«,žÿ‘ƒ ÿAŸŽŸŽ $ " à D ± E + Û} % š G ØA Q X Y L K P S AQAXAYCYOVSSLORO8 RAR L ¸‡ƒ&y‡_ *Ÿ” ž™ #ž‰¿ÿ¿§‘ƒM Ôп‹žs¿‰ ž‹ Ô»¿„žl o ¨ - … & * ‡=¿w‚=‡= ÃîQA¿r ‡4¿êƒ5‡é Ÿi Ÿg žµƒ& Ÿb¿bž†ƒ! Ÿ] Ÿ[¿[Ã"‚å @ÿ @¯Ã6¾Àž@ý‚ÜA@ýÇ ‡ ‡â½€@ÀAú»žžº¸ž‚žž^HíC º ž‚žž‚TºžƒÃ´Qdz ¿3žP‚¹Úƒ¥ ž— à¾öžzÞ°؆°‚¤ †¬â™£™*ÿ%€ÀrˆÁ'‡£+Þ¡Þ¡žv ‡žÉ ƒ‘Â@üž@ýŸy  $ƒ % + ® þ , ° ± F "  o¯ƒ¡E ‡ž‚LI¿œ‚IFƒ9 ‡˜ ‡—¿—ƒ3Ö QAŸ”Ÿ” £*â(%€À'ßž ‡ ß!Ÿt ¯ê C De ­ V G & ‚}CÞ% †$Ÿy ‚vÁ ÿ†sŸz ¢‚HüC „„T½ †÷ø†ô‚ðž¾O ž}žƒ¾K žÇ žÅ :ž‘ 'ž (ÞV )¾\ ,¾S *¾Ð Ažm Zžžiž¨¾3 0žf :žz Až` Fžtž\žr¾% ž¡ 'žUžz ( '  ù¾ 0ž– ;žˆžž‘ Až ZžžŠ¢®%# †Â'Þ©Þ§žj¾žŸ$ ;ž‚ž|ž %žyžž‹ &ž‰ *ž‡ +ž… -žƒ /žžl ‡çži (ÿ¦…Ÿ| a* ÃÒQAý†w£Ï1r£Îž„€„–Á†ÿ hüc ‚ec À„FžÈžtt¸ƒÀW€…óLPLžk@‚\YJþQT‚òì†ðžbLž`‚ROž‹LžŒžZ‚LI€…Ä‚âì†àžRƒ—„…ŸF€„–†ÎŽŽLÜ„¦Ç€„¶Ó„„ªÆ ¾Ð‚Ζ‰·…„€ž­ÿ ± à „ µ Ä€ E š ¬ Â ®¦«‚  ¾¶HüC ‚C „„T»‚  ¶«„„ƒ`Bþžÿ„…ª +‚¡–\·X„…¢‚ žŸ¢Š€†Ä…¢«ž6€…A „…žz Ú »MEMORY FULL:  ¦”’–ó¶’Œ‹îÃðFž‚Þè“è Ž‡ ÿ*ÿÀ€Ä€¼¢Ÿjò¢Z¿Üžè¢b¦X¦X€„–†S€„–Ö „„ú†»ƒN‡LÞKÞKÞ¶žz ŠE Ä«‚B‡Á ÃÂFŸÂŸÁ ¢À€€¿Ë€½È€‚»Å€ƒ‡¹–±†6Ÿp+ Ž–®` )¦¢¦¡ƒªy¾ ÿ—¦¾ƒ¥y¾Šƒ¢ žžŽ ‡ŸŸX %˜À'+qÁŸx¢…+ ŽsŸŸG ©*ÿ€ ¨ø V Ù   +£˜1P¿’£–¦»ÿ†¹¢·¦¸€„–†¶Š´†±ÃbFžŽžåžäê ª ‰ Š ¬ Âÿ‚¢tË‚ŸðHÃï G€ü9ʘR¿h¢”€… ‚垘€… „.‚à†[û†$‚5A‚Øž….6Ây‹LÞKÞžy‡Íú¢Ì¿$¢r€…A ¾åú¿¢kø¿¢¹ü¿ Šd†cÞb‚aŽ^SÞ]ž‹¿µô†Y¢ªþ¾øÞUž{ƒ(†Q¢Q€€¾Æú¾îži¿¤ž ƒ Á¿ 0¿–‚´ÃœQÃÛJÿQA ÿ¾³ü¾Û¢•ó¾Ø¾ï “‘AŸŸŸŸ±G «é mlB ­ ,o 8 ß â“‘ .q+/ã­Œ@+=ˆ@ߨŸvèd  †yý¢ž§œ¾j¾i§˜¾g¾f§–ƒ” y.q :ž„  [ 0%r‡ˆ‚b£@A¢‡§‡‚‚ Ÿ`ª« ü* ¬ †|¦|ƒ{r¾—ÞwžŸwƒu¾’ÞsÞqžuŸq ‚ö¢d„€„„‚„ƒ„„Ÿw þ¢›¾dŸ{ )ÿ—1AŸ– žŸx ½†|¢*ÿ€€„+Þvž{Ÿu߈Ÿj¿Ÿhê Á·¬é ¾Rƒé ž‚ž¾þ ¾Yƒâ¾â/ †¥ø†¢¾«¾PÞŸž|âØ †œ¾¤ *ž(÷¾²(÷¾°£Ï1Ê£Î1F†«(ò ¾Ž‚§ž‚(ò¾¤ žƒ¾5¾Žž{ ¾1ŸN †¦‚‹¾)ÞŠž|Ÿx ¢u%€À'ÞqŸy  ¦t ž’ ž[ 'ž…¾ ¾dÞkžvŸs¾¾_ 'žw žNÞbžxŸj¢_¾N¾U žF ž{Ÿb „ƒ C D ‡q‡Ž€@„€€B„ƒ€Ay·‡„€Aq·‚„‚Ÿoyz ƒà ý†z¿ÝƒÝ‡ÝƒÝ‡ÝƒÝ‡Ý‚3‡Ü‚2‡Û‚1‡ÚÞî‚í¿Ø‚*‡×‚)‡Ö‚÷†%‚ö†$‚õ†#ÿÐâТР/¾G+k :¾CƒÊÕI ¢¹@IÿÅ1AŸÄ ¢ÃIÿ¿1º¢À Iÿº1µ¿§‚»‡§ŸAI ⸢¸+؆9€€y ž‹ ÿ”€ žŽ€€„@+kKÞ+žq @¯¥*ÿ2ÂâKžP ÿq”€ „@Kžr ¥Pv¬w­x®{|}¯°ö Aüïi0 ² F ¦ SOURCE LINES 1PAGE I/O ERROR « ï   þŸ†¢† Iÿ„# Ù~üURMXNIMS €IMSE €DMSE €DMS €JST €JSTE €EXCH „EXCHE „EXCHB „JT €JF JLE JGE COMMENNXTQUE€JEQ JNE JLT JGT TBIT CSK CSKE CSKB CSM CSN CLSN OUT IN €SELP WORD BYTE STRAP UTRAP DOUBLEFLOATIM4D12 RES OBJECTOBJNOTTASK INITY ASMDATLINKDAIJEQ €IJNE €JEQD €JNED €ROTATE€SHIFT €FMT €SIGNAL€WAIT €SEARCHDEQUE €DEQUEN€EXTR SEXT LOAD NAM SNAM END TEXT TITL FLOAT SAL ENTHLTUISRSKPOPFIXNOP @@BPE`L`«P UYÿÿÿÿÿÿ_« `dceliðÿp‚Œ PŸ€}ÿˆzÿÿ¢‚1;œ€`#× sltw}œI¢äG) Ÿâ„ÄI0ÄÃ6Hÿ „Ä`" „Å# ÂÔÄÃ6žˆÀÀLO# IPÄÃ69 Hÿ# `PîÄ€Ep¢Â „ÀnÀGKKž„ÀaQÂÁ@ „Ä ‚³I?`%ÄÀ5¾` O+`I ÄÀ5¾'¦  È1A£Ä@¢ÄA¡ÄB ÄC`6þƒzÿÿ)Yþ7)¼þ5# ÄÑ "%„á'. # ²V@1I +( (E700) )3þ¢Jú# )–þ€ãŠHyÁ 'ÀãNqQÁƒ@# H'HC @ b+¤Ib „J)Ê…É5½c # I3ÄéI@b@"Ðê6&ÄêÀÖ# ÀÉSAžÅ@ÂÅÄéÀÀÄÛ6mÀÂÄëI@b@"Äê^IÄ×ÀÆS\¤J ž‡€í޲Bþ³žˆ I+¤I€€À JJþ6&žo žœ€íŽ Aþ Hÿ# 6&žy žIÄêÀÇÄë6&žlþ4 JÿQÄ ÀØL ü„ÉI# @@€§€€í>q# 6 z! „n„Gÿ„H# Qàþp€n„G „T€F„M „P= ÉÀa6H6,/6G6GHÿ#  ¼žƒ ž „T # „Ç „Éÿ# C @€ë†‚‰I¢šÿš )ÿ˜c þ8# $ ASSIGN LUN: THEN TYPE REENTER ·ü·€@‚ýž‚ü„CžÃ€@Âø„Bž¾ÀaJÃQÙD!€cB 'ž€d„BÀaJÖQB‚瞇D!€cÆ€dqÀB@ÄBž¢ž¨€n„GD!ÀbQÂÿÓžy g®Ñ¤@1B(ÿž‚JþR×+( b‚ÉþœÒ-ÿ3Aœ€ÀA# @ €@B# @ ÄAÀaL,ž\L+žZL)žŸ­€n„GD!€b¸# C @`€@@žž›ž†'@``pÉBàC`H€ARJÿk%`(C €@`(C Œ@®U¸ ``p'©B €¤D„Bc #  23H'HrNOSCONCORDANCE BATCH OPCODES @REGISTERS 0LISTING PAGESIZE ÓAPPEND ÌÿQÁŸBÀBQÁÿŒ P*ÿ €€AŸˆÿž `Pî„# îó ²I ASM MAC TXT „A‚œ„Fÿ›SØG)3‚˜ÿ˜€ÉÆÿ–žy )3ÿ“€É žŠ‚ÿSÇÀaL(ÿ)Y‚ŒÿŒ# Ÿ ‚SI¢¨›õ1‚„ÀÄÊ`" „ „Å# ‚Œ„å‚‹„Ê "b„À "b„Á# ««@P`pjP`¢ÜjþÄA`#IÄÀ5¾)Y‚ÕIPþY*Úþ`¢Ñ‚ÑIPþS)¼‚ÎI…þO*ÚþV¢Ê‚ÊIþI¢Æ „ĂńŠ„Ãp „E) þH‚½„炼„ä P„垃 ‡¶ž… †zz!D!€nŒb ÿ„n¢¡ C„ŸÅ6„ŀDŽH‚„C‚‡I¢šÿš )þý# CNC (E700) CNC..GULLO CIB« 3<üþ ÿ‘ÿ‘AŸ)Yÿ€a +žw ,žu)¼ÿˆAŸ‡z¢†Ó `"  JÀF Kžšž‚I žš@`K ÄEIPÄDIÄC6ž³ÀFQÄ K.y*ó1¯ D K¤F)¤J%ÀÖ'+¤J`H}# µ`"@@} L žŽ DJ+ž‡žž…%ÄÖ'+¤DJIžgIÄC6žƒIÄDž^Hÿž\C @`Pî„I I@+ž¹3¾# Ÿ€ùÍäùùùÏùI¢ žŽIÐD)¼QÊI0ÄÃÀCÄÄ6žžIÄÄ ÿ”Iþ8¹c )# )YþÌ`p%„E'c )# c )# @€Çà žwc )# C @i` žŒ`(%€À'`( @þ/1Å p€‚ „t²)`p¤Dc # *-# G`šžª ¾Ã‚}©àRÙªçHÜL×ó=e¢RV³Ðn¼îRSTm ©}!Q¾š T…ä¾¶ (½Ï :½Ï„ÿ˽Р-½Ï :½Ï„ ÿ½Ð )½Ï ½Ï„ÿ¼…â /†»0†¿e'湦·Æµp†¶P†µ'„ÿ°` Ÿn «¢«â«‚«p‚ªP‚©0/‚ Ÿs ½Í ½Ï½Í D½Ï E½Ï B½Ï U½Ï G½Ï C½Ï ½Ï A½Ï 0½Ï 0½Ï 2½Ï ½ÏŸb} ½Í ½Ï‚z½Ï¾«¾ª P¾£â½Õ A¾Ÿ‚E½Ö Q¾›‚B½Ö X¾—‚?½Ö Y¾“‚<½Ð½Í¾”¾“¾’ K¾‹‚5½Ö L¾‡‚2½Ö S¾ƒ‚/½ÖŸS ½Ï =½ÏŸ{ ½ÏŸ|‚Á"„ †¼½Í *½Ï½Î žz†µ Yž™ Qž— žË Až° Gžž„½νԆ¦žˆ Ržž…½Î žš½ÓÆ½ÒÆšÂ›LBžÑLCÌLFÊLLÉLSËLJž¯LIÆLGÅLRÄLZØÁ …á½ÃžAÿû½Î†}½Î†w½Î žÁ‚v LžÁ‚n Tž‡ Pžƒ BžÁ P…ä‚d…äž#½Î Àž|ÁÙQE‚[…âÝ ,ž‘Ý ,ž‡½Í `ↂ½ÑŸ€ ½Ï ?½Ï½Íž¥žBª¸¦¸ `ã JžŒ Bž†Áâ YK QJÿžˆ‚¨fÁÚž½Ò‚¤ žcÞ¡ @‚²€ÞŸ‡žÞ§œ `Ý@E ;ž‚ž†žÛ½ÒRA@EN@AÞÇŽ QÁÞŠ‡‰Ý ,ž^ž:žIÁ“$½ž& ÿ…â†|‚dÄ D `…ážž†sâ¢]*ü¸‚ž›€ƒQ€„†h À ‚ЀªcЀ Ä„‚Â^@AĄ܃žX B `…á½Ãá DÝâž„*üÞPž_žU‚7 `À¢5*ü¦3€ ‚„€‚- ÿ†+žr½Ç }Áà"B†©Ùƽ̓¥½Ö½Ò½ÇÙOÛG„þ‹úœž‡Ã™E––´6Á'E‡’ÀÜ À /ž† XžÁƒˆž‚ƒ… ½Í½Öž]ýw …žP½ÍÚ†«@½Õƒ¨½Ö½ÒÙB…ßÇ¢Ý ,žœÂžÜ[ +ž‰ -žˆ *žŠ Xž‹ /žŒÁKJÿÆŽÅÚž^ƒ‹…Úž[ƒˆž{ƒ… žxÞ‚žZÀ ,ÁŸ|¾Ö ž†½Ò½ÇL žÁÆÊä Pžž€½Íچ߽Õø†Á†¾ƒÚ½Ö½×Þºž{‚¹ ¾ƒ‚ҽ͞q ‚±†´Ž±k†¬ŠÈ†Ç‚­Gû†©½ÈÞ§ž}Þ¦žyý†¢½ÈÞ ž}ƒ¸y ‚E ~ à ž .½Ïƒ­ÿ ‚E ~ à ž .½ÏÞ¢ÞƒžfŸN ,žÁ½Ò†t@ÁÚFž…C ’lŸqÁãLLžÁ¾ (žwž{žu Â_Þ|JÿQBÆ[Ÿyã Lžˆ Sžžä TžŠ½ÍžˆÞO‚N ¾ †JžsÀ¾‰…ßھˆ_‚”‡]¾]Š’ž| IÆŽ¾> ,žÁ½ÒƇ ,žžƒ†·½ÒÆ‚ŸpIư¾k ,ž“ ’« ,žƒHÿÆtž’‚r žŽH: ÿÆmÜ -žÁ†›ž†½ÒÜ -žÁ†”Ú†(ƒ'š\–\ÂFžƒ‚Š -ž‚¾žt½Í‚½Õƒ½Ðžx Â’@"Fž‚Ÿzž‡@ ÎŒ‰Þ ÿFž„ …ßÁÞ Ÿl;¾#…ßÚ† † ‚.¾b†žÁÞÆƒ™‡šÞ™Þ–JÿQº‚”†’‚!†’Â’ƒŽ»ž…ÞŠÞ‹JÿQ¸À½Í %½Ï‚‚½Ðžu †U ½Ï ½Ï‚PŸx †q½Ð †oÿ†n …"†lIƒjM K ÿ¢b&žž†¢_&žƒ†[Æ[ `ÞZKL$žžk‚T N =½Ï‚MŽM½Ð G½Ï‚J öÁ  :½Ïž€ ½ÏŸL æ°g„m¢ó‚«G¬QR„@«k¾«jÿ PÂ¥¢ç¾¦ %„À'+¦™ †š†•¢”%€À'ÞÂJÿƎ⎠`ŸZ .TV6C«@@@ †pÆn¦jæn'„ÿç6ž„¢hÂd‚dŸq‚eNŽâLÂaÖÞ@ŽÞG@ŽÜD‚Y>Jg„ü ` †U†SÀ ¾ƒ ¾˜Ÿ{ †’¹¾‡y¾…9¾ƒ¾‚Ÿu  öÁ  :¾…‚ŸwTVLP Æ7æ5)²51Á¦0g„ï¢- žˆ-Pžžž%„À'Þ$ž™‚"Â''ˆüí,Lž…,Sžƒ,ZžžŠ¢•,Tž‡,Pž‚¢Y¾¢X¾ž‚¢T¾ † â ` ŸOÿ€€ƒƒ€ IÆyÆyÆyÅÙÆx½Î Rž¾ žÉ Gž³ ,ž˜ ;ž– +ž” -ž’ ž *žŽ /žŒ XžŠ¾í’_1Š]†\ÝÙIÆWž`ÝÙ ž†R’RÂR -@A@ŠK†J@ †J‚H +žO -žM *ž“ /ž‘ XžŸ?½Î¾· ª–€€ `žY½Î¾“ Bª€€ `žR†-½Î†, Ÿ,Á +†&½Î žNÁ…} †›ªI€€º—žž…+KL žƒžv `Ÿp `ÁÆPAQXYKLSDC ZžÁ Až„ ž‡ 9žÁ 0ÁŸn ÆC FÁ ó= » Ÿt ,žžˆ½ÒÆ ,žžƒ½ÒÆ™½Ç½Í•چ’ƒ‘½ÖÞJÿQ»‚ŒŽŒŠŒ €€ `…Ú¯ä Tž½ÍÀ Á ¢mF1EBE5E3--E3E1@Ü[ +ž‰ -žˆ *žŠ Xž‹ /žŒÁKJÿÆŽÅÚž^ƒ‹…Úž[ƒˆž{ƒ… žxÞ‚žZÀ ,ÁŸ|¾Ö ž†½Ò½ÇL žÁÆÊä Pžž€½Íچ߽Õø†Á†¾ƒÚ½Ö½×Þºž{‚¹ ¾ƒ‚ҽ͞q ‚±†´Ž±k†¬ŠÈ†Ç‚­Gû†©½ÈÞ§ž}Þ¦žyý†¢½ÈÞ ž}ƒ¸y ‚E ~ à ž .½Ïƒ­ÿ ‚E ~ à ž .½ÏÞ¢ÞƒžfŸN ,žÁ½Ò†t@ÁÚFž…C ’lŸqÁãLLžÁ¾ (žwž{žu Â_Þ|JÿQBÆ[Ÿyã Lžˆ Sžžä TžŠ½ÍžˆÞO‚N ¾ †JžsÀ¾‰…ßھˆ_‚”‡]¾]Š’ž| IÆŽ¾> ,žÁ½ÒƇ ,žžƒ†·½ÒÆ‚ŸpIư¾k ,ž“ ’« ,žƒHÿÆtž’‚r žŽH/ CARTOS CNC UTILITY ASSEMBLE JCL - 84-93467-72-E700 / / JANUARY 1982 / / /  THIS .JCL ASSUMES ALL FILES, INCLUDING MACRO FILES, / ARE ON UF. / / AS X1=UF X1 IS USED BY THE INCLUDE DIRECTIVES IN THE SOURCE MACRO CARTOSCNCIF(L=,P=57) AS X2=LO,LO=CARTOSCNCIF.LST CNC CARTOSCNCIF(P=57*108) AS LO=X2 k8201291957057582012919570825820202084849/ CARTOS CNC UTILITY LINK JCL - 84-93467-73-E700 / / JANUARY 1982 / / THIS .JCL FILE ASSUMES ALL FILES ARE ON UF / / / AS X1=LO,LO=CARTOSCNC.MAP LINK CNC.SYS=CARTOSCNCIF(AB=40,P=57*108)+ OS4CNC+ DEBUGC(UL) PRINT CARTOSCNC.MAP AS LO=X1 82012918422500820129184225508202020848591PAGE 0001 MULTI-TASKING LINKER (F1) 1982/02/01 19:50:06 FILE USAGE SUMMARY DH1.CNCC.BIN=DH1.CARTOSCNCIF.OBJ(ABSOLUTE=40,PAGESIZE=57*108)+ 1PAGE 0002 MULTI-TASKING LINKER (F1,EB) 1982/02/01 19:50:10 FILE USAGE SUMMARY NOTE: *** CARTOS CONCORDANCE INTERFACE -- REVISION E700 *** DH1.OS4CNC.OBJ+ NOTE: 4 CONCORDANCE BODY - REVISION E600 *** DF1.DEBUGC.OBJ(UNCONDITIONAL) NOTE: DEBUGC - REV. A002 1PAGE 0003 MULTI-TASKING LINKER (F1,EB,E5,E3,--,E3,E1) 1982/02/01 19:51:18 ALL SYMBOLS THE TRANSFER ADDRESS IS 0040(UTILITY:) ABSOLUTE SYMBOLS (0000 - FFFE) 0010-CLEANUP: 0012-RESTART: 0014; -POSTMTEM 0017-JMPDEBUG MEMORY ABSOLUTE (0040 - 003F) 0040-R:LOW 1123-R:HIGH SEGMENT UTILITY: (0040 - 007C) ABSOLUTE - RAM, SHAREABLE (0040 - 007C) 0040-UTILENV 006C-STARTUP SEGMENT CNC:CART (007D - 045F) ABSOLUTE - RAM, SHAREABLE (007D - 045F) 007D-G:Z 00D7-CLEANUP 0293-OE:IGR 03B7-O:IO 03FC-O:MSG 0412-O:GATD 0419-O:DATE 007D-OE:START 0291-OE:IBR 033B-SIGN:ON SEGMENT DEBUG: (0460 - 09A4) ABSOLUTE - RAM, SHAREABLE (0460 - 09A4)  0460-DEBUGC 0880-DBGC:TV 0881-DBGC:LP SEGMENT BLANK (09A5 - 1123) ABSOLUTE - RAM (09A5 - 1123) 09B2-OE:CNC C H A I N S R:TDBL 0060(UTILITY:) MDB: 0000(0SEGMENT) SDB: 0000(0SEGMENT) SMD: 0000(0SEGMENT) QDB: 0000(0SEGMENT) MISSING: SRF:ER NO WARNINGS R (F1) 1982/02/01 19:50:06 FILE USAGE SUMMARY DH1.CNCC.BIN=DH1.CARTOSCNCIF.OBJ(ABSOLUTE=40,PAGESIZE=57*108)+ 1PAGE 0002 MULTI-TASKING LINKER (F1,EB) 1982/02/01 19:50:10 FILE USAGE SUMMARY NOTE: *** CARTOS CONCORDANCE INTERFACE -- REVISION E700 *** DH1.OS4CNC.OBJ+ NOTE: 4 CONCORDANCE BODY - REVISION E600 *** DF1.DEBUGC.OBJ(UNCONDITIONAL) NOTE: DEBUGC - REV. A002’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I< ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I= ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I> ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I? ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I@ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IA ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IB ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IC ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’ID ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IE ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IF ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IG ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IH ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’II ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IJ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IK ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IL ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I