IMD 1.16: 1/09/2008 10:39:59 84-93078-01a000 f07801 nm4 full card ram test prog ecc 819 ram  ž ªªž @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ÁúF081092414020000810924140200 810924140200MEM64K VOLECC MEMDIAG   ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’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@6M PRTP10 EQU $ A=M JST  ASCOUT PRINT PASS WORD 8 WORD HEAD1 PASS COPY PASSNO,A JST DECOUT JMP *PRTPAS RETURN TO CALLER PRTP20 EQU $ COPY NUM9,A SET PASS NUMBER  COPY A,PASSNO TO 1 JST ASCOUT WORD :B WORD HEAD1A PRINT PASS **** JMP *PRTPAS RETURN TO CALLER LPOOL * * MESSAGES TO PRINT ON TTY/CRT * OPTIONS +:20 SIGNON WORD CRLF WORD CRLF BYTE '64-K MEMORY DIAGNOSTIC - REV: A0 84-93074-XX' WORD   CRLF SIGNOL EQU $-SIGNON * QUERYA WORD CRLF BYTE 'MEMORY ADDRESS START (:0000)?:' WORD -1 * QUERYB WORD CRLF BYTE ' END (:FFFF)?:' WORD -1 * QUERYBA WORD CRLF WORD CRLF BYTE 'MEMORY TOO SMALL' WORD -1 * QUERYBB WORD CRLF WORD CRLF BYTE 'START ADDRESS WITHIN INTERRUPT VECTORS :80-:95' WORD -1 * QUERYBC WORD CRLF WORD CRLF BYTE 'ENDING ADDRESS WITHIN INTERRUPT VECTORS :80-:95' WORD -1 * QUERYBD WORD CRLF WORD CRLF BYTE 'RELOCATION ERROR - HALT ' WORD -1 * QUERYC WORD CRLF WORD CRLF WORD CRLF BYTE 'TESTS (A,B,C,D,E)= ' WORD -1 * QUERYD WORD CRLF WORD CRLF BYTE 'CONTROL WORD (:00)?:' WORD -1 * HEAD1 WORD CRLF BYTE 'PASS ' HEAD1A WORD CRLF BYTE 'PASS ****' HEAD11 BYTE 'PASS ' HEAD11A BYTE 'PASS ****' OPTIONS -:20 LPOOL TITL 'TABLE PARAMATERS' * * * GENERAL DATA STATEMENTS * TABPTR WORD TESTS-1 TPTR WORD 0 CHRINP WORD CHRIN PTR TO CHARACTER IDECP WORD IDEC PTR TO IDEC NUM9 WORD 9999 DECIMAL 9999 DAST EQU $ LOLIMX RES 1,0 LOW MEMORY-TESTING LIMIT HILIMX RES 1,0 HIGH MEMORY-TESTING LIMIT BEGN WORD 0 STARTING ADDRESS END WORD 0 ENDING ADDRESS RELFLG WORD 0 RELOCATION FLAG 0-NOT RELOCATED 1-RELOCATED ENTFLG WORD 0 ENTRY FLAG 0-TTY 1-NO-TTY UPFLAG WORD 0 RELOCATION ONLY FLAG FSTFLG WORD 0 FRIST TIME FLAG PASSNO WORD 0  PASS NUMBER TESTNO WORD 0 TEST NUMBER ERRNO WORD 0 ERROR NUMBER ADDR WORD 0 ADDRESS EXPT WORD 0 EXPECTED VALUE ACT WORD 0 ACTUAL VALUE ECC WORD 0 ECC CODE CONWRD WORD 0 CONTROL WORD DAEN EQU $ TITL *************************************************** * * * TEST ADDRESS TABLE * * TEMP WORKING TABLE * * **************************************************** WORD -1 PRAMS  EQU $ TESTS WORD TESTA WORD TESTB WORD TESTC WORD TESTD WORD TESTE WORD -1 END * **************************************************** * * * TEST ( RESET PARAM TABLE ) * * ****************************************************** * PRAMSX EQU $ TESTSX WORD TESTA WORD TESTB  WORD TESTC WORD TESTD WORD TESTE WORD -1 END PRAMND EQU $ TITL 'INITIALIZE ROUTINE - INTL -' ******************************************************** * * INTL - INITIALIZE ALL PARAMATERS * ******************************************************** INTL ENT COPY =TESTSX,A GET DEFAULT TABLE COPY  A,TMPADR SAVE AS POINTER COPY =TESTS,X GET WORK TABLE INTL5 COPY *TMPADR,A COPY A,0(X) STORE DEFAULT TABLE INTO WORKING TABLE IMS TMPADR INCREMENT ADDRESS ADD =1,X JGE A,INTL 5 SET DEFAULTS COPY DSTART,A VALUE FOR ALL COPY A,BEGN PARAMATERS COPY DEND,A COPY A,END COPY DCNTRL,A COPY A,CONWRD COPY =1,A COPY A,PASSNO JMP *INTL * DSTART WORD 0 DEFAULT FOR START ADDRESS DEND WORD :FFFF DEFAULT FOR END ADDRESS DCNTRL WORD 0 DEFAULT FOR CONTROL WORD TMPADR WORD 0 TITL 'QUERY SECTION' ******************************************************* * * QUERY - ASK QUESTIONS * * START,ENDING,TESTS,CONTROL WORD * * ********************************************************** * * ASK FOR START ADDRESS * QUERY EQU $ JST MSGA OUTPUT QUERY WORD QUERYA 'MEMORY ADDRESS START' JST IHEX INPUT VALUE COPY X,BEGN SAVE VALUE QURYA5 JST *CHRINP CHECK TERMINATOR JMP QURYB1 C/R JMP QURYND1 # MAJOR DEFAULT JMP QUERY BACK ARROW - START OVER JMP QUERY UP ARROW - START QUERY OVER JMP QUERY COMMA JMP QUERY ANYTHING ELSE LPOOL * * ASK FOR ENDING ADDRESS * QURYB1 EQU $ JST MSGA OUTPUT QUERY  WORD QUERYB 'END (:FFFF) JST IHEX INPUT VALUE JEQ X,QURYB7 IF ZERO WHY? COPY X,END SAVE VALUE QURYB5 JST *CHRINP CHECK TERMINATOR JMP QURYB9 C/R JMP QURYND1 # MAJOR DEFAULT JMP QURYB1 BACK ARROW JMP QUERY UP ARROW JMP QURYB1 COMMA JMP QURYB1 ANYTHING ELSE * QURYB7 COPY IDCTM3,X - JEQ X,QURYB5 - IS ACTUAL INPUT COPY =0,X - COUNT ZERO COPY X,END - JMP QURYB5 - * QURYB9 EQU $ COPY BEGN,A - COPY END,Q CSM A,Q STARTING ADDRESS LESS THAN END ADDRESS JMP QURYB11 JMP QURYBR  JMP QURYB11 QURYBR EQU $ COPY ENTFLG,A TEST ENTRY FLAG JNE A,$+2 JMP QURYB1 COPY =:AA55,A PLACE ERROR IN CDR AND START OVER SELP A,4 JMP MEM90 * QURYB11 EQU $  JST SIZEM MEMORY SIZE CALCULATION COPY ENTFLG,A JEQ A,QURYC1 JMP QURYND * * ASK FOR TESTS * QURYC1 EQU $ JST MSGA OUTPUT QUERY 'TESTS' WORD QUERYC COPY =0,A SAVE TEMP CELL COPY A,TEMP1 QURYC5 EQU $ JST *IDECP INPUT LETTER JNE X,QURYC1 JST *CHRINP CHECK TERMINATOR JMP QURYD1 C/R JMP QURYND # MAJOR DEFAULT JMP QURYC1 BACK ARROW JMP QURYB1 UP ARROW JMP QURYC1 COMMA NOP  ANYTHING ELSE SUB ='A',A JLT A,QURYC1 CHECK IF NEGATIVE CLSN =:13,A  JMP TESTT GO TO TEST TECH SUB =4,A CHECK FOR ILLEGAL JGT A,QURYC1 INPUT  ADD =4,A COPY A,X COPY TEMP1,A CHECK IF INPUT CLSN =5,A IS GREATER THAN   JMP QURYC1 (A,B,C,D,E) * * THE FOLLOWING CODE BUILDS A JST TABLE * FOR ALL TESTS THAT WERE INSERTED BY THE OPERATOR * COPY X,QRYZ1 SAVE TEST # COPY QRYX1,A GET ADDRESS OF TABLE ADD QRYZ1,A ADD OFFSET COPY A,QRYZ2 COPY *QRYZ2,A COPY A,QRYZ1 SAVE TEST ADDRESS  COPY QRYX2,A ADD TEMP1,A COPY A,QRYZ2 COPY QRYZ1,A GET TEST ADDRESS  COPY A,*QRYZ2 SAVE IN WORKING TABLE COPY QRYZ2,A GET WORK TABLE ADDRESS ADD QRYX3,A INCREMENT ADDRESS COPY A,QRYZ2 COPY =-1,A GET DELIMITER COPY A,*QRYZ2  IMS TEMP1 BUMP COUNT JMP QURYC5 GET NEXT INPUT * QRYX1 WORD PRAMSX QRYZ1 WORD 0 QRYZ2 WORD 0 QRYX2 WORD PRAMS QRYX3 WORD 1 TEMP1 WORD 0 LPOOL * * ASK FOR CONTROL WORD * QURYD1 EQU $ JST MSGA OUTPUT QUERY WORD QUERYD CONTROL WORD JST IHEX COPY X,CONWRD SAVE VALUE QURYD5 JST *CHRINP CHECK TERMINATOR JMP QURYND C/R JMP QURYND # MAJOR DEFAULT JMP QURYD1 BACK ARROW JMP QURYC1 UP ARROW JMP QURYD1 COMMA JMP QURYD1 ANYTHING ELSE LPOOL * * QUERY END PROCESSING * QURYND1 EQU $ JST SIZEM QURYND EQU $ JST MOVT SET UP TEST TABLE IN PART 2 COPY END,A IS THE ENDING  TBIT 15,A MEMORY ADDRESS JT OV,MEM301 ABOVE 8-K (:2000) COPY =MEMM,A CSK A,END  JMP MEM30 YES - TEST UPPER MEMORY JMP PASEND NO - RELOCATE PROGRAM TO UPPER MEMORY MEM301 JMP MEM30 YES - TEST UPPER MEMORY * TITL 'TEST CHECK CONDITIONS' ************************************************** * * TSTCHK - TSTCHK IS USED TO DETERMINE * * THE FOLLOWING CONDITIONS * * 1. SET BIT 15 ON FOR ERROR * 2. CHECK IF TTY/LINE PRINTER * 3. CHECK IF NO TTY * 4. CHECK IF HALT * * THIS ROUTINE IS CALLED IF AN ERROR OCCURED * **************************************************** * TSTCHK ENT IN 4,A GET CONSOLE DATA REG SBIT :F,A TURN ON MSB SELP A,4 OUTPUT MSB ON COPY ENTFLG,A IF NO TTY JNE A,TCHK90 JUMP JT SS,TCHK5 CHECK IF SENSE SWITCH ON COPY CONWRD,A CHECK BIT ZERO FOR TBIT 0,A DETAIL PRINT = 0 JT OV,TCHK3 JST ERR PRINT ERROR MESSAGE TCHK3 EQU $  COPY CONWRD,A TBIT 3,A CHECK IF LINE PRINTER JF OV,TCHK5 COPY =1,A SET LINE PRINTER ON COPY A,LPFLG JST ERR COPY =0,A TURN OFF LINE PRINTER  COPY A,LPFLG TCHK5 EQU $ COPY CONWRD,A CHECK IF HALT TBIT 2,A AFTER ERROR  JF OV,TCHK7 HLT TCHK7 EQU $ JMP *TSTCHK RETURN TO CALLER * IF NO TTY TCHK90  EQU $ JT SS,$+2 JMP *TSTCHK COPY ERRNO,A TBIT 2,A JT OV,TCHK91  COPY ADDR,X SET X TO ADDRESS COPY ACT,Q SET K TO ACTUAL VALUE COPY ECC,Y  COPY EXPT,A SET A TO EXPECTED VALUE HLT HALT JMP *TSTCHK RETURN TO CALLER * TCHK91 EQU $ IN 4,A OR =:A600,A SELP A,4 SET CDR FOR DOUBLE BIT ERROR CODE  COPY =0,A COPY A,Q COPY A,Y HLT IN 4,A AND =:70FF,A  SELP A,4 JMP *TSTCHK * LPOOL TITL ' ERROR REPORTING ' *********************************************************** * * * ERR - ERROR REPORT * * ************************************************************ * ERR ENT  RBIT 8,S DISABLE INTERRUPTS JST ERRPT WORD PASSNO PASS NUMBER WORD ERRNO ERROR NUMBER WORD TESTNO TEST NUMBER WORD ADDR ADDRESS WORD EXPT EXPECTED VALUE WORD ACT ACTUAL VALUE WORD ECC ECC CODE SBIT 8,S SET INTERRUPTS ON JMP *ERR RETURN TO CALLER * TITL ' ERROR REPORT PRINTING ' ************************************************************ * * * ERRPT - PRINTS DETAIL ERROR REPORT * * * FORMAT * *PASS XXXX ERROR XX TEST X ADDR XXXX EXPT XXXX ACT XXXX ECC XXXX * * **************************************************************** * ERRPT ENT JST ASCOUT OUTPUT ERROR WORD 8 'PASS' WORD ERRH1 COPY *ERRPT,X IMS  ERRPT INCREMENT PARAMATER COPY 0(X),A GET VALUE JST DECOUT PRINT DECIMAL VALUE  JST ASCOUT OUTPUT 'ERROR ' WORD 7 WORD ERRH2 COPY *ERRPT,X GET ERROR NUMBER  IMS ERRPT INCREMENT PARAMATER COPY 0(X),A JST DCMLOT JST ASCOUT OUTPUT TEST WORD 6 WORD ERRH3 COPY *ERRPT,X GET TEST NUMBER (ASCII) IMS ERRPT INCREMENT PARAMTER COPY 0(X),A JST OTT JST ASCOUT OUTPUT ADDRESS WORD 7  WORD ERRH4 COPY *ERRPT,X GET ADDRESS (HEX) IMS ERRPT INCREMENT PARAMETER COPY 0(X),A OUTPUT VALUE JST HEXOUT COPY ERRNO,A IS THERE A DOUBLE BIT ERROR TBIT 2,A JF OV,ERRPT1 COPY ERRPT,A ADD =3,A COPY A,ERRPT JMP *ERRPT ERRPT1 JST ASCOUT OUTPUT 'EXPECTED' WORD 7 WORD ERRH5 COPY *ERRPT,X IMS ERRPT INCREMENT PARAMETER COPY 0(X),A JST HEXOUT OUTPUT VALUE JST ASCOUT  OUTPUT 'ACT' WORD 6 WORD ERRH6 COPY *ERRPT,X IMS ERRPT INCREMENT PARAMETER COPY 0(X),A OUTPUT VALUE JST HEXOUT JST ASCOUT OUTPUT 'ECC' WORD 6   WORD ERRH7 COPY *ERRPT,X IMS ERRPT INCREMENT PARAMETER COPY 0(X),A OUTPUT VALUE JST HEXOUT JMP *ERRPT RETURN TO CALLER SPACE 2 * LPOOL * ICRPT ENT  COPY ENTFLG,A JNE A,ICRPT1 JT SS,ICRPT1 COPY CONWRD,A TBIT 4,A JT  OV,$+2 TEST TO PRINT OUT IC ERROR ICRPT1 JMP *ICRPT NO JST DICER JST ASCOUT OUTPUT IC ERROR WORD 16 WORD ICH1 COPY ICERR,A JST DCMLOT JST ASCOUT  WORD 22 WORD ICH2 JMP *ICRPT * ICERR WORD 0 * LPOOL * TITL DICER ENT  COPY ECC,A JNE A,DICER1 COPY ACT,A IC TABLE :8000 - :FFFF COPY EXPT,Q JEQ Q,$+2 XOR =:FFFF,A COPY =0,Q SET TABLE POINTER TO ZERO RBIT 1,S TURN OF OV  COPY ADDR,X DETERMINE WHAT IC TABLE COPY =:8000,Y TO USE CSM X,Y JMP ROTA  NOP ROT EQU $ ROTATE A,RO,1 DETERMINE IC NEMBER JT OV,ROT1 ADD =1,Q JMP ROT ROT1 EQU $ XNX Q COPY DATAB2,A COPY ADDR,X COPY =:C000,Y  CSM X,Y IS IC IN ADDRESS :8000 - :BFFF JMP $+3 NOP ADD =7,A COPY A,ICERR JMP *DICER * ROTA EQU $ ROTATE A,RO,1 DETERMINE IC NUMBER JT OV,ROTA1  ADD =1,Q JMP ROTA ROTA1 EQU $ XNX Q COPY DATAB1,A COPY ADDR,X  COPY =:4000,Y CSK X,Y JMP $+3 NOP ADD =7,A COPY A,ICERR  JMP *DICER * DICER1 EQU $ COPY =0,Q RBIT 1,S SET OV AND TABLE POINTER COPY ADDR,X DETERMINE WHAT IC TABLE TO USE COPY =:8000,Y CSM X,Y JMP ROTB NOP ROTC EQU $ ROTATE A,RO,1 JT OV,ROTC1 ADD =1,Q JMP ROTC ROTC1 EQU $ XNX Q COPY ECCB2,A COPY ADDR,X COPY =:C000,Y CSM X,Y JMP $+3  NOP ADD =7,A COPY A,ICERR JMP *DICER * ROTB EQU $ ROTATE A,RO,1  JT OV,ROTB1 ADD =1,Q JMP ROTB ROTB1 EQU $ XNX Q COPY ECCB1,A  COPY ADDR,X COPY =:4000,Y CSK X,Y JMP $+3 NOP ADD =7,A  COPY A,ICERR JMP *DICER * LPOOL TITL * * IC TABLE FOR ADDRESS :8000 - :FFFF * DATAB2 EQU $  WORD 48 WORD 75 WORD 61 WORD 47 WORD 74 WORD 60 WORD 46 WORD 73 WORD 59 WORD 45 WORD 72 WORD 58 WORD 44 WORD 71 WORD 57 WORD 43 ECCB2 EQU $ WORD 77 WORD 63 WORD 49   WORD 76 WORD 62 * TITL * * IC TABLE FOR ADDRESS 0 - :7FFF * DATAB1 EQU $ WORD 34  WORD 5 WORD 19 WORD 33 WORD 4 WORD 18 WORD 32 WORD 3 WORD 17 WORD 31 WORD 2 WORD 16 WORD 30 WORD  1 WORD 15 WORD 29 ECCB1 EQU $ WORD 7 WORD 21 WORD 35  WORD 6 WORD 20 TITL OPTIONS +:20 * ERROR DETAIL HEADINGS ERRH1 WORD CRLF BYTE '*PASS ' * ERRH2 BYTE ' ERROR ' * ERRH3 BYTE ' TEST ' * ERRH4 BYTE ' ADDR :' * ERRH5 BYTE ' EXPT :' * ERRH6 BYTE ' ACT :' * ERRH7 BYTE ' ECC :' * ICH1 WORD CRLF BYTE '*** SUSPECTED ERROR IC- ' * ICH2 BYTE ' / INTERFACE LOGIC ***' * TT1 WORD CRLF WORD CRLF BYTE ' *** TECH TEST ***'  WORD CRLF WORD CRLF WORD -1 * TT2 WORD CRLF WORD CRLF BYTE 'PATTERN (:0000):?' WORD -1 * CON1 WORD CRLF WORD CRLF BYTE '**** CONSOLE INTERRUPT **** ' WORD -1 OPTIONS -:20 * * LPOOL TITL **** TECH TEST **** TESTT EQU $  COPY ='T',A COPY A,TESTNO SELP A,4 PERCENT TECH TEST TO CONSOLE COPY =0,A COPY A,BEGN SET DEFAULT STARTING ADDRESS COPY =:FFFF,A COPY A,END SET DEFAULT ENDING ADDRESS  JST MSGA OUTPUT QUERY WORD TT1 TECH TEST TSTT1 JST MSGA OUTPUT QUERY WORD QUERYA STARTING ADDRESS JST IHEX INPUT HEX VALUE COPY X,BEGN STORE STARTING ADDRESS TSTT2 JST *CHRINP CHECK TERMINATOR JMP TSTT3 C R JMP TSTT12 #MAJOR DEFAULT JMP TSTT1 BACK ARROW JMP TSTT1 UP ARROW JMP TSTT1 COMMA JMP TSTT1 ANYTHING ELSE * TSTT3 EQU $ JST MSGA OUTPUT QUERY WORD QUERYB END (:FFFF) JST IHEX JEQ X,TSTT7  IF ZERO WHY ? COPY X,END TSTT4 JST *CHRINP JMP TSTT9 C/R JMP TSTT12 #MAJOR DEFAULT  JMP TSTT2 BACK ARROW JMP TSTT1 UP ARROW JMP TSTT2 COMMA JMP TSTT2 ANYTHING ELSE * TSTT7 EQU $ COPY IDCTM3,X - JEQ X,TSTT4 - IS ACTUAL INPUT COPY =0,X  - COUNT ZERO COPY X,END - YES - JMP TSTT4 - * TSTT9 EQU $ COPY BEGN,A - COPY END,Q CSM A,Q ENDING ADDRESS LESS THAN STARTING ADDRESS JMP TSTT11  JMP TSTT1 JMP TSTT11 * TSTT11 EQU $ JST SIZEM DO MEMORY SIZE CALCULATION TSTA1 JST MSGA OUTPUT QUERY WORD TT2 PATTERN (:0000) JST IHEX INPUT HEX VALUE COPY X,PATT SAVE VALUE JST *CHRINP CHECK TERMINATOR JMP TSTT12 C/R JMP TSTT12 # MAJOR DEFF  AULT JMP TSTA1 BACK ARROW JMP TSTT2 UP ARROW JMP TSTA1 COMMA JMP TSTA1 ANYTHING ELSE * TSTT12 EQU $ COPY END,A IS THE ENDING ADDRESS ABOVE 8-K TBIT 15,A JT OV,TSTT121 COPY MEMM,A CSK A,END JMP TSTT121 JST TSTT122 TSTT121 COPY RELFLG,A JNE A,$+2 JST INIT COPY LOLIMX,X COPY HILIMX,A ADD =1,A  COPY A,L TSTT14 COPY PATT,A GET PATTERN COPY A,0(X) WRITE PATTERN COPY 0(X),Q READ PATTERN CSK A,Q COMPARE READ AND WRITE NOP JMP TSTT13 IN 4,A AND =:7FFF,A SELP A,4 TSTT15 ADD =1,X CSK X,L REACH ENDING ADDRESS LIMIT ? NOP  JMP TSTT14 NO CONTINUE TESTING TSTT122 JST RELOCA RELOCATE DIAGNOSTIC TBIT 15,A JF OV,TSTT123 COPY =:1,A YES SET RELOCATION FLAG COPY A,RELFLG JMP TSTT121 TSTT123 EQU $ COPY =:0,A NO RESET RELOCATION FLAG COPY A,RELFLG JMP TSTT121 * TSTT13 EQU $ IN 4,A  OR =:8000,A BLINK INDICTOR IF CONTINUOUS ERROR SELP A,4 JMP TSTT15 * PATT WORD 0 * *  LPOOL * * ROUTINE TO INDICATE UNEXPECTED TRAP ON CONSOLE DATA REGISTER * LIGHTS ENT IN 4,A GET CONSOLE DATA REGISTER AND =:FF,A PRESERVE THE TEST NUMBER OR PTAA00,A SET UPPER BYTE TO FLAG UNEXPECTED TRAP SELP A,4 OUTPUT TO CONSOLE DISPLAY JMP *LIGHTS * * * UNIMPLEMENTED INSTRUCTION TRAP ROUTINE * UIT1 EQU $ JST LIGHTS ERROR: UNEXPECTED,UNIMPLEMENTED,INSTRUCTION JMP *STARTP * * MEMORY EXCEPTION TRAP ROUTINE * UMT1 ENT RBIT 2,S SET WORD MODE IN 4,A OR =:8100,A SELP A,4 COPY X,ADDR COPY =4,A COPY A,ERRNO JST TSTCHK COPY =:88,Y LAST LOCATION OF TRAP COPY 0(Y),A ADD =3,A INCREMENT RETURN ADDRESS COPY A,Y COPY ADDR,X JMP 0(Y) * RELTV ENT COPY =:88,X COPY =RELTR,A COPY A,3(X) JMP *RELTV * RELTR ENT RBIT 2,S SET WORD MODE COPY =:88,X COPY 0(X),A ADD =1,A  COPY A,X JMP 0(X) * DUMT ENT RBIT 2,S SET WORD MODE COPY Y,X COPY X,ADDR SET ADDRESS COPY ENTFLG,A JNE A,ERRD1 COPY =4,A COPY A,ERRNO JST TSTCHK ERRD1 EQU $ COPY =:88,X COPY ADDR,Y RESTORE ADDRESS COPY 0(X),A  COPY A,X SBIT 2,S JMP 0(X) * LPOOL * TITL MEMORY SIZE CALCULATION (TEST A) * * DETERMINE MEMORY SIZE * SIZEM ENT COPY =:88,X SET MEMORY EXCEPTION COPY =R01007,A TRAP SERVICE  EXCH A,3(X) ROUTINE COPY A,TEMPME SAVE PREVIOUS SERVICE ROUTINE COPY =MEMEND,A COMPUTE NEXT 1K BOUNDRY AFTER END OF MEM SUB =1,A OR =:3FF,A ADD =1,A COPY A,X SAVE IN X * *   COPY =0,Q R01004 COPY Q,0(X) ATTEMPT MEMORY ACCESS ADD =:400,X INCREMENT MEMORY COUNTER BY 1K JNE X,R01004 REACHED 64K MEM LIMIT? NO, LOOP TO CONTINUE SBIT 0,S SET THE CY BIT IF 64K MEMORY INSTALLED JMP $+2 * R01007 ENT TRAP SERVICE ROUTINE COPY X,A SUB =1,A DECREMENT TO LAST ADDR.  COPY A,MEMLST SAVE LAST MEMORY ADDR. COPY END,Q CSM Q,A JMP SIZEM3 IS ENDING ADDRESS GREATER THAN MEMORY SIZE JMP SIZEM1 SIZEM3 COPY END,A COPY A,MEMSIZ SET UPPER MEMORY TESTING LIMITS  COPY BEGN,A TBIT 15,A JT OV,SIZEM4 COPY =:95,Q CSK A,Q IS STARTING ADDRESS JMP $+3 WITHIN INTERRUPT VECTORS JMP SIZEM4 :80 - :95 JMP $+3 SUB =:80,A JLT A,SIZEM4 COPY ENTFLG,A JEQ A,$+2 JMP QURYBR JST  MSGA OUTPUT MESSAGE WORD QUERYBB 'START ADDRESS WITHIN INTERRUPT VECTORS' COPY =0,A COPY A,BEGN JST TPV RESET TRAP SERVICE ROUTINES JMP QUERY * SIZEM4 EQU $ COPY END,A TBIT 15,A JT OV,SIZEM5 COPY =:95,Q CSK A,Q IS ENDING ADDRESS JMP $+3 WITHIN INTERRUPT VECTORS JMP SIZEM5 :80 - :95 JMP $+3 SUB =:80,A  JLT A,SIZEM5 COPY ENTFLG,A JEQ A,$+2 JMP QURYBR JST MSGA OUTPUT MESSAGE WORD QUERYBC 'ENDING ADDRESS WITHIN INTERRUPT VECTORS' COPY =:FFFF,A COPY A,END  JST TPV RESET TRAP SERVICE ROUTINES JMP QURYB1 * SIZEM5 EQU $ JST TPV RESET TRAP SERVICE ROUTINES JMP *SIZEM * SIZEM1 EQU $ COPY ENTFLG,A JEQ A,$+2 JMP QURYBR JST MSGA OUTPUT MESSAGE WORD QUERYBA 'MEMORY TO SMALL' JMP QURYB1 MEMLST RES 1,0 MEMSIZ RES 1,0 TEMPME RES 1,0 * * LPOOL TITL CONSOLE INTERRUPT SERVICE ROUTINE CONINT1 ENT RBIT 2,S SET WORD MODE COPY =0,A OUT A,1 RESET CONSOLE INTERRUPT COPY ENTFLG,A TEST FOR CRT/TTY JNE A,CONINT7 JST MSGA OUTPUT MESSAGE WORD CON1 CONSOLE INTERRUPT COPY PASSNO,A CSK A,NUM9 JMP $+2 JMP CONINT6 JST ASCOUT WORD :6  WORD HEAD11 PASS COPY PASSNO,A JST DECOUT JMP CONINT3 RETURN TO START OF PROGRAM * CONINT6 EQU $ COPY NUM9,A SET PASS NUMBER COPY A,PASSNO TO 1 JST ASCOUT  WORD :9 WORD HEAD11A PRINT PASS **** * CONINT3 EQU $ COPY RELFLG,A TEST FOR RELOCATION JNE A,$+2 JMP MEM11 JST RESTOR COPY =0,A COPY =RELFLG,Q  SUB =MEMH,Q COPY Q,X COPY A,0(X) COPY =MEM11,A SUB =MEMH,A COP  Y A,CONINT4 JMP *CONINT4 * CONINT7 EQU $ COPY RELFLG,A TEST FOR RELOCATION JNE A,$+2 JMP MEM90 JST RESTOR COPY =MEM90,A SUB =MEMH,A COPY A,CONINT4  JMP *CONINT4 CONINT4 WORD 0 SPACE 1 LPOOL * * POWER FAIL TRAP ROUTINE * PDWN ENT SIN 15 COPY A,ATEMP COPY Q,QTEMP COPY X,XTEMP COPY Y,YTEMP COPY K,A COPY A,KTEMP COPY L,A COPY A,LTEMP COPY S,A COPY A,STEMP JF SS,$+2 JUMP IF SENSE SWITCH OFF COPY =1,A SET 'A' =1 SIN 5 COPY A,SENSW SAVE SENSE SW. SETTING IN :04,A  READ DATA REGISTER COPY A,DATSAV SAVE DATA REG. IMS PDNCT BUMP DOWN COUNTER NOP HLT * * POWER UP TRAP ROUTINE * PUPRTN EQU $ SIN 15 COPY *PWRVC2,A TEST FOR COLD START (PWRVC2 ALTERED ON POWER FAIL) JEQ A,START JUMP IF COLD START PRTN00 IMS PUPCT BUMP POWER UP COUNT NOP PRTN01 EQU $ COPY XTEMP,X COPY QTEMP,Q COPY YTEMP,Y COPY KTEMP,A COPY A,K COPY LTEMP,A COPY A,L COPY SENSW,A OUT A,0 SIN 13 PRTN02 COPY DATSAV,A SELP A,4 RESTORE CONSOLE DATA REGISTER COPY PUPCT,A FETCH POWER UP COUNT  XOR PDNCT,A COMPARE TO POWER DOWN COUNT JNE A,PRTN03 JUMP IF MISCOMPARE IN 4,A AND =:F,A XOR =:E,A JEQ A,JTSTE COPY STEMP,A COPY A,S COPY ATEMP,A JMP *PWNVEC PRTN03 EQU $ HERE IF PF & RESUMMABLE & MISCOMPARE IMS PFERRS BUMP POWER UP/DOWN MISCOMPARE COUNTER NOP SIN 13 COPY DMAND2,A AND =:02,A JNE A,PRTN04 IF BIT 1 SET, DO NOT HALT ERROR: POWER,UP/DOWN,COUNTS,NOT,EQUAL PRTN04 COPY PDNCT,A COPY A,PUPCT SET UP/DOWN COUNTS EQUAL START EQU $ SBIT 8,S COPY ATEMP,A JMP *STARTPTR * JTSTE EQU $ COPY STEMP,A COPY A,S COPY ATEMP,A JMP *NTESTE NTESTE WORD 0  RETURN ADDRESS FOR TEST E ATEMP RES 1,0 QTEMP RES 1,0 XTEMP RES 1,0 YTEMP RES 1,0 KTEMP RES 1,0 LTEMP RES 1,0 STEMP RES 1,0 SENSW RES 1,0 LPOOL TITL 64K TESTING ITILIALIZATION ******** * * * 64K,32K,16K TESTING * * THIS SECTION TEST A MINIMUM OF 16K OF MEMORY. * * FIRST THE SECOND HALF OF MEMORY IS TESTED, THEN THE * CONTENTS OF THE FIRST HALF OF MEMORY IS COPIED TO THE * SECOND HALF AND VERIFIED, THEN CONTROL IS TRANSFERED * TO THE COPIED PROGRAM IN THE SECOND HALF. THE FIRST * HALF OF MEMORY IS THEN TESTED, THE CONTENTS OF THE * SECOND HALF OF MEMORY IS COPIED BACK TO THE FIRST HALF * AND VERIFIED, AND FINALLY CONTROL IS TRANSFERED BACK *  TO THE COPIED PROGRAM IN THE FIRST HALF. * * TESTING OF EACH OF THE SECTIONS OF MEMORY IS PER- * FORMED IN FIVE PARTS: A) ADDRESSABILITY TEST * B) LOW ORDER UNIQUE ADDRESS TEST, C) DATA TEST, D) BYTE TEST, * AND E) DOUBLE AND SINGLE BIT ERROR TEST. * * THE SAME CODE IS EXECUTED FOR TESTING BOTH THE FIRST * AND THE SECOND HALF OF MEMORY, AND THUS MUST BE EXE- * CUTABLE WHEN THE PROGRAM HAS RELOCATED ITSELF. * * TESTING EXCLUDES LOCATIONS :80-:96   (UNIMPLEMENTED * INSTRUCTION TRAP , MEMORY EXCEPTION TRAP , AND * CONSOLE INTERRUPT VECTORS). * DURING PROGRAM RELOCATION, THE THREE TRAPS CONTAIN * JUMPS TO SPECIAL SERVICE ROUTINES IN THE RELOCATED * PROGRAM. OCCURRENCE OF ANY OTHER INTERRUPTS OR TRAPS * DURING PROGRAM RELOCATION WILL HAVE UNDEFINED RESULTS. * ******** TITL * *  INITIALIZATION * INIT ENT COPY BEGN,A IS STARTING ADDRESS TBIT 15,A ABOVE 8-K (:2000) JT  OV,INIT1 COPY =MEMM,A CSK A,BEGN JMP $+2 JMP INIT2 INIT1 COPY BEGN,A YES - STORE STARTING ADDRESS JMP $+2 IN LOWER ADDRESS LIMIT INIT2 COPY =MEMM,A SET LOWER LIMIT AT 8-K (:2000) COPY A,LOLIMX SET LOW COPY MEMSIZ,A SET HIGH MEMORY ADDRESS LIMIT - COPY A,HILIMX TESTING WITH END ADDRESS  JMP *INIT TITL 64K ADDRESSABILITY TEST (TEST A) * * TEST A * * 64K ADDRESSABILITY TEST * * THIS IS A PRELIMINARY TEST OF ADDRESS BIT 15, AND * A TEST OF INDIRECT ADDRESSING TO THE UPPER 32K * OF LOGICAL ADDRESS SPACE. * TESTA ENT COPY MEMLST,A TBIT 15,A JT OV,TSTA COPY =:88,X COPY =UMTA,A COPY A,3(X) TSTA COPY ='A',A COPY A,TESTNO SELECT ASCR CODE INTO COPY =:A,A TEST NUMBER AND OUTPUT TEST- SELP A,4 NUMBER TO CONSOLE COPY =:0E0D,A DATA COPY A,1 INITIALIZE LOCATION 1 COPY 1,A CHECK IT CSK A,=:0E0D COMPARE TO EXPECTED DATA NOP JST HALT1 COPY =:8001,X TEST ADDRESS COPY =:6666,A TEST DATA COPY A,0(X) ATTEMPT WRITE TO LOCATION :8001 (INDEXED) NOP NOP NOP COPY 1,A GET LOCATION 1 CONTENTS CSK A,=:0E0D COMPARE TO EXPECTED DATA NOP JST HALT1 SBIT 6,S SET XA COPY *P8001,A ATTEMPT READ FROM LOCATION :8001 (INDIRECT) CSK A,=:6666 COMPARE TO EXPECTED DATA NOP JST HALT2 COPY =:0E0D,A DATA  COPY A,1 WRITE TO LOCATION 1 COPY 0(X),A GET CONTENTS OF LOCATION :8001 CSK A,=:6666 COMPARE TO EXPECTED DATA NOP JST HALT2 RBIT 6,S TURN OFF EXTENDED ADDRESSING * M10290 EQU $ JMP TESTA+1 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JST TPV JMP *TESTA * HALT1 ENT COPY A,ACT ACTUAL VALUE COPY =1,X COPY X,ADDR ADDRESS COPY  =:0E0D,A COPY A,EXPT EXPECTED VALUE COPY =0,A COPY A,ECC NO ECC COPY =1,A COPY A,ERRNO ERROR CODE NUMBER JST TSTCHK COPY ADDR,X JMP *HALT1 * HALT2  ENT COPY A,ACT ACTUAL VALUE COPY P8001,X COPY X,ADDR ADDRESS COPY =:6666,A COPY A,EXPT EXPECTED VALUE COPY 0,A COPY A,ECC NO ECC COPY =1,A  COPY A,ERRNO ERROR CODE NUMBER JST TSTCHK COPY ADDR,X JMP *HALT2 P8001 WORD :8001  * UMTA ENT COPY =:88,Y COPY 0(Y),A ADD =3,A COPY A,Y JMP 0(Y) *  LPOOL TITL ADDRESS TEST -- 64K TESTING (TEST B) ******** * * TEST B * * LOW ORDER UNIQUE ADDRESS TEST * * THIS TEST EXERCISES THE LOWER 16 OF THE 22 MEMORY * ADDRESS BITS AS FOLLOWS: * EVERY WORD IS WRITTEN WITH BITS 0-15 OF ITS ADDRESS * AS DATA, AND THEN VERIFIED. THIS IS DONE IN FORWARD * ORDER AND REVERSE ORDER. * THIS TEST IS RELOCATED IN EVERY SEGMENT OF MEMORY AND RUN * THIS IS DONE TO ENSURE THAT ALL MEMORY LOCATIONS CAN BE * EXCUTED FROM. * ******** SPACE 2 * * FORWARD ORDER WRITE * TESTB ENT COPY ='B',A SELECT ASCR CODE COPY A,TESTNO INTO TEST NUMBER COPY =:B,A OUTPUT TEST NUMBER SELP A,4 TO CONSOLE COPY =TESTB2,A DETERMINE THE SIZE OF TEST B SUB =TESTB1,A COPY A,TBDIF STORE THE SIZE OF TEST B COPY RELFLG,A IS DIAGNOSTIC RELOCATED JEQ A,$+2 JMP TSTB4 YES - TEST LOW MEMORY COPY MEMLST,Q GET END OF MEMORY SUB TBDIF,Q DETERMINE END LOCATION TSTB2 EQU $ COPY Q,TBST STORE START LOCATION ADD TBDIF,Q DETERMINE END LOCATION COPY Q,TBEND STORE END LOCATION COPY TBST,A SUB TBDIF,A DETERMINE TEST START LOCATION TBIT 15,A JT OV,TSTB1  COPY =MEMM,Q CSK A,Q JMP TSTB3 DO NOT RELOCATE TEST B NOP TSTB1 EQU $ COPY A,LOLIMB SET LOWER TESTING LIMIT COPY TBDIF,Q SUB =1,Q ADD Q,A COPY A,HILIMB  SET HIGH TESTING LIMIT JST TBREL RELOCATE TEST B COPY TBST,X JST 0(X) RUN TEST B IN RELOCATED MEMORY COPY LOLIMB,Q SET Q FOR NEXT START LOCATION RBIT 1,S BLINK OV LIGHT JMP TSTB2 * TSTB3 EQU $ COPY =MEMM+1,Q COPY Q,TBST SET START LOCATION AT 8K + 1 ADD TBDIF,Q COPY Q,TBEND SET END LOCATION ADD =1,Q COPY Q,LOLIMB SET LOWER TESTING LIMIT ADD TBDIF,Q  COPY Q,HILIMB SET HIGH TESTING LIMIT JST TBREL RELOCATE TEST B COPY TBST,X JST 0(X) RUN TEST B IN RELOCATED MEMORY RBIT 1,S BLINK OV LIGHT JMP *TESTB RETURN TO MAIN LINE * TSTB4 EQU  $ COPY =MEMLL,A TSTB6 COPY A,TBST SET START LOCATION ADD TBDIF,A COPY A,TBEND SET END LOCATION ADD TBDIF,A COPY =MEMM,Q CSK A,Q JMP TSTB5 NOP COPY =MEMM-1,A COPY A,TBEND SUB TBDIF,A COPY A,TBST SET START LOCATION SUB TBDIF,A COPY A,LOLIMB SET LOWER TESTING LIMIT COPY TBDIF,Q SUB =1,Q ADD Q,A COPY A,HILIMB SET HIGH TESTING LIMIT JST TBREL RELOCATE TEST B COPY TBST,X JST 0(X) RBIT 1,S BLINK OV LIGHT JMP *TESTB * LPOOL * TSTB5 EQU $ COPY TBEND,A ADD =1,A COPY A,LOLIM B SET LOWER TESTING LIMIT ADD TBDIF,A COPY A,HILIMB SET HIGH TESTING LIMIT JST TBREL RELOCATE TEST B COPY TBST,X JST 0(X) RUN TEST B IN RELOCATED MEMORY COPY LOLIMB,A RBIT 1,S BLINK OV LIGHT JMP TSTB6 * TESTB1 EQU $ TSTBA ENT SBIT 1,S SET OV LIGHT COPY LOLIMB,X INITIALIZE MEMORY ADDRESS COPY HILIMB,Q ADD =1,Q COPY Q,L SET HIGH MEMORY-TESTING LIMIT * M31010 COPY X,0(X) WRITE DATA TO TEST MEMORY ADD =1,X INCREMENT ADDRESS CSK X,=:80 NOP JMP $+2 COPY =:96,X CSK X,L END OF MEMORY ? JMP M31010  NO, CONTINUE JMP M31010 NO, CONTINUE TITL * * FORWARD ORDER VERIFY * M31100 EQU $  COPY LOLIMB,X INITIALIZE MEMORY ADDRESS M31110 COPY 0(X),Q READ DATA FROM TEST MEMORY CSK  Q,X COMPARE TO EXPECTED NOP JMP $+2 ERROR JMP M31120 OK * JST *$+1 WORD BERR * M31120 ADD =1,X INCREMENT ADDRESS CSK X,=:80 NOP JMP  $+2 COPY =:96,X CSK X,L END OF MEMORY ? JMP M31110 NO, CONTINUE JMP M31110 NO, CONTINUE JMP M31200 * LOLIMB WORD 0 HILIMB WORD 0 * TITL * * REVERSE ORDER WRITE * M31200 EQU $ COPY HILIMB,X INITIALIZE MEMORY ADDRESS COPY LOLIMB,Q SUB =1,Q COPY Q,L SET LOW MEMORY-TESTING LIMIT * M31210 COPY X,0(X) WRITE DATA TO MEMORY SUB  =1,X DECREMENT ADDRESS CSK X,=:95 NOP JMP $+2 COPY =:7F,X CSK X,L  END OF MEMORY ? JMP M31210 NO, CONTINUE JMP M31210 NO, CONTINUE TITL * *  REVERSE ORDER VERIFY * M31300 EQU $ COPY HILIMB,X INITIALIZE MEMORY ADDRESS M31310 COPY 0(X),Q  READ DATA FROM TEST MEMORY CSK Q,X COMPARE TO EXPECTED NOP JMP $+2 ERROR JMP M31320 OK * JST *$+1 WORD BERR * M31320 SUB =1,X DECREMENT ADDRESS CSK X,=:95 NOP JMP $+2 COPY =:7F,X CSK X,L END OF MEMORY ?  JMP M31310 NO, CONTINUE JMP M31310 NO, CONTINUE JMP *TSTBA TESTB2 EQU $ * BERR  ENT IMS BERR COPY Q,ACT ACTUAL VALUE COPY X,EXPT EXPECTED VALUE COPY X,ADDR  ADDRESS COPY =1,A COPY A,ERRNO ERROR CODE NUMBER COPY =0,A COPY A,ECC NO ECC  JST TSTCHK COPY ADDR,X JMP *BERR * TBDIF WORD 0 SIZE OF TEST B TBST WORD 0 START LOCATION TBEND WORD 0 END LOCATION LPOOL TITL DATA TEST -- 64K TESTING (TEST C) ******** * * TEST C * * SURROUND - DISTURB TEST * * THIS IS A SURROUND-DISTURB TEST OF THE RAMS, AND * A TEST OF THE RAM AN D BOARD DATA PATHS. * * THE PATTERNS WRITTEN BY THIS TEST ARE OPTIMAL FOR * SURROUND-DISTURB TESTING OF FOUR VENDOR'S 16K RAMS * (AS OF 3-79): MOSTEK, TEXAS INSTRUMENTS, FAIRCHILD, * AND NATIONAL . * * THE TEST CONSISTS OF FOUR SECTIONS: 1) TEST DATA * RAMS WITH MOSTEK AND TI PATTERNS, 2) TEST ECC RAMS * WITH MOSTEK AND TI PATTERNS, 3) TEST DATA RAMS WITH * FAIRCHILD AND NATIONAL PATTERNS, AND 4) TEST ECC * RAMS WITH FAIRCHILD AND NATIONAL PATTERNS. THE RAMS * ARE TESTED WITH THE TWO COMPLEMENTARY PATTERNS FOR * EACH OF THE VENDORS. * * THE ECC RAM TESTING IS PERFORMED BY WRITING THE DATA * RAMS WITH A PARTICULAR PATTERN WHICH RESULTS IN THE * DESIRED TEST PATTERN BEING GENERATED BY THE MEMORY * LOGIC TO FILL THE ECC RAMS. THIS DATA IS THEN READ * FROM THE ECC RAMS DURING VERIFICATION. * ******** TITL * * MOSTEK AND TI PATTERN TESTING * * WRITE DATA RAMS * SPACE 1 TSTC1 EQU :FFF8 TSTC2 EQU :FFE0 TSTC4 EQU :FFFC LOLIMX1 WORD 0 SPACE 1 TESTC ENT COPY ='C',A SELECT ASCK CODE COPY A,TESTNO INTO TEST NUMBER COPY =:C,A OUTPUT TEST NUMBER SELP  A,4 TO CONSOLE COPY RELFLG,A JEQ A,TSTCA COPY =MEMM,A COPY A,L SET LIMIT TO :1FFF (8K-1) COPY =0,X COPY X,LOLIMX1 SET STARTING LIMIT AT ZERO JMP M32000 TSTCA COPY MEMLST,A ADD =1,A COPY A,L SET LIMIT TO END OF MEMORY COPY =MEMM,X COPY X,LOLIMX1 SET STARTING LIMIT AT :2000 8-K M32000 COPY =0,A COPY A,INDXV0 SET VENDOR INDEX FOR MOSTEK DATA M32010 COPY  =0,A COPY A,INDXP0 SET PASS INDEX FOR 1ST PASS DATA M32020 COPY LOLIMX1,X INITIALIZE MEMORY ADDRESS M32025 COPY =0,Q COPY Q,COUNT03 INITIALIZE LOOP COUNT M32030 COPY COUNT03,Q GET LOOP COUNT XNX Q USE AS INDEX INTO TABLE COPY INDTB0,Q GET INDEX VALUE FROM TABLE ADD INDXP0,Q  ADD PASS INDEX ADD INDXV0,Q ADD VENDOR INDEX ADD =DATTB0,Q ADD BASE ADDRESS OF DATA TABLE  COPY Q,POINT01 STORE SUB-TABLE ADDRESS COPY =TSTC1,Q COPY Q,COUNT04 INITIALIZE LOOP COUNT M32040 COPY POINT01,Q GET SUB-TABLE ADDRESS COPY Q,POINT02 INITIALIZE TABLE POINTER COPY =TSTC1,Q COPY Q,COUNT05 INITIALIZE LOOP COUNT M32050 COPY =TSTC2,Q COPY Q,COUNT06 INITIALIZE LOOP COUNT COPY *POINT02,Q GET DATA FROM TABLE M32060 COPY Q,0(X) WRITE DATA TO TEST MEMORY ADD =1,X INCREMENT ADDRESS JST ADCHK0 CHECK FOR TRAP LOCATIONS IMS COUNT06 INCREMENT LOOP COUNT JMP M32060 CONTINUE IMS POINT02 INCREMENT DATA TABLE POINTER IMS COUNT05 INCREMENT LOOP COUNT JMP M32050 CONTINUE IMS COUNT04 INCREMENT LOOP COUNT JMP M32040 CONTINUE IMS COUNT03 INCREMENT LOOP COUNT CSK X,L END OF MEMORY ?   NOP JMP $+2 JMP M32120 COPY COUNT03,Q CSK Q,=8 NOP JMP M32030  JMP M32025 J3TESTC JMP *TESTC INDTB0 EQU $ WORD 0 WORD 8 WORD 8 WORD 0  WORD 8 WORD 0 WORD 0 WORD 8 LPOOL SPACE 8 * * VERIFY DATA RAMS * M32120 COPY LOLIMX1,X INITIALIZE MEMORY ADDRESS M32125 COPY =0,Q COPY Q,COUNT03 INITIALIZE LOOP COUNT M32130 COPY COUNT03,Q GET LOOP COUNT XNX Q USE AS INDEX INTO TABLE COPY INDTB0,Q  GET INDEX VALUE FROM TABLE ADD INDXP0,Q ADD PASS INDEX ADD INDXV0,Q ADD VENDOR INDEX  ADD =DATTB0,Q ADD BASE ADDRESS OF DATA TABLE COPY Q,POINT01 STORE SUB-TABLE ADDRESS COPY =TSTC1,Q COPY Q,COUNT04 INITIALIZE LOOP COUNT M32140 COPY POINT01,Q GET SUB-TABLE ADDRESS COPY Q,POINT02 INITIALIZE TABLE POINTER COPY =TSTC1,Q COPY Q,COUNT05 INITIALIZE LOOP COUNT M32150 COPY =TSTC2,Q COPY Q,COUNT06 INITIALIZE LOOP COUNT COPY *POINT02,Q GET DATA FROM TABLE COPY  Q,K STORE AS EXPECTED DATA M32160 COPY 0(X),Q READ DATA FROM TEST MEMORY CSK Q,K COMPARE TO EXPECTED NOP JST ERR1 M32163 ADD =1,X INCREMENT ADDRESS JST ADCHK0 CHECK FOR TRAP LOCATIONS IMS COUNT06 INCREMENT LOOP COUNT JMP M32160 CONTINUE IMS  POINT02 INCREMENT DATA TABLE POINTER IMS COUNT05 INCREMENT LOOP COUNT JMP M32150 CONTINUE IMS COUNT04 INCREMENT LOOP COUNT JMP M32140 CONTINUE IMS COUNT03 INCREMENT LOOP COUNT CSK X,L END OF MEMORY ? NOP JMP $+2 JMP M32169  COPY COUNT03,Q CSK Q,=8 NOP JMP M32130 JMP M32125 M32169 COPY INDXP0,Q  GET PASS INDEX JNE Q,M32170 JUMP IF COMPLETED 2ND PASS COPY =:10,Q INDEX VALUE FOR 2ND PASS DATA COPY Q,INDXP0 STORE 2ND PASS DATA INDEX RBIT 1,S BLINK OV FOR DISPLAY JMP M32020  CONTINUE * M32170 EQU $ JMP M32010 PATCH FOR LOOPING THROUGH MOSTEK DATA ORG $-1  NOP OVERLAY WITH NOP * COPY INDXV0,Q GET VENDOR INDEX JNE Q,M32180 JUMP IF COMPLETED TI DATA PASSES COPY =:20,Q INDEX VALUE FOR TI DATA COPY Q,INDXV0 STORE TI DATA INDEX JMP M32010 CONTINUE * M32180 EQU $ JMP M32010 PATCH FOR LOOPING THROUGH TI DATA  ORG $-1 JMP M32000 PATCH FOR LOOPING THROUGH BOTH VENDORS ORG $-1 NOP  OVERLAY WITH NOP JMP M32200 ERR1 ENT COPY K,A COPY A,EXPT EXPECTED VALUE  COPY Q,ACT ACTUAL VALUE COPY X,ADDR ADDRESS COPY =1,A COPY A,ERRNO ERROR CODE   COPY =0,A COPY A,ECC NO ECC ERROR JST TSTCHK COPY ADDR,X JMP *ERR1 LPOOL TITL ******** * * SUBROUTINES AND DATA STORAGE * ******** SPACE 1 * * SUBROUTINE ADCHK0 * * THIS SUBROUTINE DETERMINES WHEN THE MEMORY ADDRESS * REACHES THE POWER UP TRAP (:80). * WHEN THIS OCCURS, IT ADVANCES THE ADDRESS PAST * THE END OF THE MEMORY EXCEPTION TRAP (:8B), AND * ADVANCES THE LOOP COUNT. THE Q REGISTER IS ALTERED. * ADCHK0 ENT CSK X,=:80 REACHED PU LOCATION ? JMP *ADCHK0 NO, RETURN  JMP *ADCHK0 NO, RETURN ADD =:20,X ADVANCE ADDRESS PAST TRAP LOCATIONS IMS COUNT05 JMP *ADCHK0 RETURN * * DATA STORAGE * INDXV0 RES 1,0 VENDOR INDEX INDXP0 RES 1,0  PASS INDEX COUNT03 RES 1,0 LOOP COUNT COUNT04 RES 1,0 LOOP COUNT COUNT05 RES 1,0  LOOP COUNT COUNT06 RES 1,0 LOOP COUNT POINT01 RES 1,0 DATA SUB-TABLE ADDRESS POINT02 RES 1,0 DATA TABLE POINTER TEDAT RES 1,0 J2TESTC JMP J3TESTC TITL * * WRITE ECC RAMS * M32200 EQU  $ COPY =0,A COPY A,INDXV0 SET VENDOR INDEX FOR MOSTEK DATA M32210 COPY =0,A COPY A,INDXP0 SET PASS INDEX FOR 1ST PASS DATA M32220 COPY LOLIMX1,X INITIALIZE MEMORY ADDRESS M32225 COPY =0,Q  COPY Q,COUNT03 INITIALIZE LOOP COUNT M32230 COPY COUNT03,Q GET LOOP COUNT XNX Q USE AS INDEX INTO TABLE COPY INDTB1,Q GET INDEX VALUE FROM TABLE ADD INDXP0,Q ADD PASS INDEX  ADD INDXV0,Q ADD VENDOR INDEX ADD =ECCTB0,Q ADD BASE ADDRESS OF DATA TABLE COPY Q,POINT01  STORE SUB-TABLE ADDRESS COPY =TSTC1,Q COPY Q,COUNT04 INITIALIZE LOOP COUNT M32240 COPY POINT01,Q  GET SUB-TABLE ADDRESS COPY Q,POINT02 INITIALIZE TABLE POINTER COPY =TSTC1,Q COPY Q,COUNT05 INITIALIZE LOOP COUNT M32250 COPY =TSTC2,Q COPY Q,COUNT06 INITIALIZE LOOP COUNT COPY *POINT02,Q GET DATA FROM TABLE M32260 COPY Q,0(X) WRITE DATA TO TEST MEMORY ADD =1,X INCREMENT ADDRESS JST ADCHK0 CHECK FOR TRAP LOCATIONS IMS COUNT06 INCREMENT LOOP COUNT JMP M32260 CONTINUE IMS POINT02 INCREMENT DATA TABLE POINTER IMS COUNT05 INCREMENT LOOP COUNT JMP M32250 CONTINUE IMS COUNT04 INCREMENT LOOP COUNT JMP M32240 CONTINUE IMS COUNT03 INCREMENT LOOP COUNT CSK X,L END OF MEMORY ? NOP JMP  $+2 JMP M32320 COPY COUNT03,Q CSK Q,=8 NOP JMP M32230 JMP M32225 SPACE 10 * * VERIFY ECC RAMS * M32320 COPY LOLIMX1,X INITIALIZE MEMORY ADDRESS M32325 COPY =0,Q  COPY Q,COUNT03 INITIALIZE LOOP COUNT M32330 COPY COUNT03,Q GET LOOP COUNT XNX Q U SE AS INDEX INTO TABLE COPY INDTB1,Q GET INDEX VALUE FROM TABLE ADD INDXP0,Q ADD PASS INDEX  ADD INDXV0,Q ADD VENDOR INDEX ADD =DATTB0,Q ADD BASE ADDRESS OF DATA TABLE COPY Q,POINT01 STORE SUB-TABLE ADDRESS COPY =TSTC1,Q COPY Q,COUNT04 INITIALIZE LOOP COUNT M32340 COPY POINT01,Q GET SUB-TABLE ADDRESS COPY Q,POINT02 INITIALIZE TABLE POINTER COPY =TSTC1,Q COPY Q,COUNT05 INITIALIZE LOOP COUNT M32350 COPY =TSTC2,Q COPY Q,COUNT06 INITIALIZE LOOP COUNT COPY *POINT02,Q GET DATA FROM TABLE AND =:1F,Q WANT ONLY BITS 0-4 COPY 0(X),A M32360 COPY A,TEDAT  SAVE CONTENTS OF MEMORY COPY Q,K STORE AS EXPECTED DATA COPY Q,0(X) WRITE EXPECTED DATA  COPY 0(X),A READ BACK DATA COPY A,Q STORE IN CORRECT REGISTER COPY TEDAT,A GET MEMORY CONTENTS COPY A,0(X) RELOAD CONTENTS CSK Q,K COMPARE TO EXPECTED NOP  JST ERR1 M32363 ADD =1,X INCREMENT ADDRESS JST ADCHK0 CHECK FOR TRAP LOCATIONS IMS COUNT06 INCREMENT LOOP COUNT JMP M32360 CONTINUE IMS POINT02 INCREMENT DATA TABLE POINTER IMS COUNT05 INCREMENT LOOP COUNT JMP M32350 CONTINUE IMS COUNT04  INCREMENT LOOP COUNT JMP M32340 CONTINUE IMS COUNT03 INCREMENT LOOP COUNT CSK  X,L END OF MEMORY ? NOP JMP $+2 JMP M32369 COPY COUNT03,Q CSK  Q,=8 NOP JMP M32330 JMP M32325 M32369 COPY INDXP0,Q GET PASS INDEX JNE Q,M32370 JUMP IF COMPLETED 2ND PASS COPY =:10,Q INDEX VALUE FOR 2ND PASS DATA COPY Q,INDXP0  STORE 2ND PASS DATA INDEX RBIT 1,S BLINK OV FOR DISPLAY JMP M32220 CONTINUE * M32370 EQU $ JMP M32210 PATCH FOR LOOPING THROUGH MOSTEK DATA ORG $-1 NOP OVERLAY WITH NOP * COPY INDXV0,Q GET VENDOR INDEX JNE Q,M32380 JUMP IF COMPLETED TI DATA PASSES  COPY =:20,Q INDEX VALUE FOR TI DATA COPY Q,INDXV0 STORE TI DATA INDEX JMP M32210 CONTINUE * M32380 EQU $ JMP M32210 PATCH FOR LOOPING THROUGH TI DATA ORG $-1 JMP M32200 PATCH FOR LOOPING THROUGH BOTH VENDORS ORG $-1 NOP OVERLAY WITH NOP  JMP M32400 * INDTB1 EQU $ WORD 0 WORD 8 WORD 8 WORD 0 WORD 8 WORD 0 WORD 0 WORD 8 LPOOL TITL * * FAIRCHILD AND NATIONAL PATTERN TESTING * *  WRITE DATA RAMS * M32400 EQU $ COPY =0,A COPY A,INDXV1 SET VENDOR INDEX FOR FAIRCHILD DATA M32410 COPY =0,A COPY A,INDXP1 SET PASS INDEX FOR 1ST PASS DATA M32420 COPY LOLIMX1,X INITIALIZE MEMO RY ADDRESS COPY =0,Q COPY Q,COUNT13 INITIALIZE LOOP COUNT M32430 COPY COUNT13,Q GET LOOP COUNT TBIT 0,Q COPY Q REG BIT 0 TO OV COPY =0,Q CLEAR Q JF OV,$+2 TEST Q REG BIT 0 COPY =4,Q LOAD Q WITH INDEX IF COUNT13 IS ODD ADD INDXP1,Q ADD PASS INDEX  ADD INDXV1,Q ADD VENDOR INDEX ADD =DATTB1,Q ADD BASE ADDRESS OF DATA TABLE COPY Q,POINT11  STORE SUB-TABLE ADDRESS COPY =TSTC2,Q COPY Q,COUNT14 INITIALIZE LOOP COUNT M32440 COPY POINT11,Q GET SUB-TABLE ADDRESS COPY Q,POINT12 INITIALIZE TABLE POINTER M32450 COPY *POINT12,Q GET DATA FROM TABLE COPY Q,0(X) WRITE DATA TO MEMORY ADD =1,X INCREMENT ADDRESS JST ADCHK1  CHECK FOR TRAP LOCATIONS IMS POINT12 INCREMENT DATA TABLE POINTER IMS COUNT14 INCREMENT LOOP COUNT JMP M32440 CONTINUE IMS COUNT13 INCREMENT LOOP COUNT CSK X,L  END OF MEMORY ? JMP M32430 NO, CONTINUE JMP M32430 NO, CONTINUE SPACE 4 * * VERIFY DATA RAMS * M32520 COPY LOLIMX1,X INITIALIZE MEMORY ADDRESS COPY =0,Q COPY Q,COUNT13 INITIALIZE LOOP COUNT M32530 COPY COUNT13,Q GET LOOP COUNT TBIT 0,Q COPY Q REG BIT 0 TO OV  COPY =0,Q CLEAR Q JF OV,$+2 TEST Q REG BIT 0 COPY =4,Q LOAD Q WITH INDEX IF COUNT13 IS ODD ADD INDXP1,Q ADD PASS INDEX ADD INDXV1,Q ADD VENDOR INDEX ADD  =DATTB1,Q ADD BASE ADDRESS OF DATA TABLE COPY Q,POINT11 STORE SUB-TABLE ADDRESS COPY =TSTC2,Q  COPY Q,COUNT14 INITIALIZE LOOP COUNT * M32540 COPY POINT11,Q GET SUB-TABLE ADDRESS COPY Q,POINT12 INITIALIZE TABLE POINTER M32550 COPY *POINT12,Q GET DATA FROM TABLE COPY Q,K STORE AS EXPECTED DATA M32560 COPY 0(X),Q READ DATA FROM TEST MEMORY CSK Q,K COMPARE TO EXPECTED NOP  JST ERR1 M32563 ADD =1,X INCREMENT ADDRESS JST ADCHK1 CHECK FOR TRAP LOCATIONS  IMS POINT12 INCREMENT DATA TABLE POINTER IMS COUNT14 INCREMENT LOOP COUNT JMP M32540  CONTINUE IMS COUNT13 INCREMENT LOOP COUNT CSK X,L END OF MEMORY ? JMP M32530 NO, CONTINUE JMP M32530 NO, CONTINUE NOP YES, EXIT COPY INDXP1,Q GET PASS INDEX JNE Q,M32570 JUMP IF COMPLETED 2ND PASS COPY =8,Q INDEX VALUE FOR 2ND PASS DATA COPY Q,INDXP1 STORE 2ND PASS DATA INDEX JMP M32420 CONTINUE * M32570 EQU $ JMP M32410 PATCH FOR LOOPING THROUGH FAIRCHILD DATA ORG $-1 NOP OVERLAY WITH NOP * COPY INDXV1,Q GET VENDOR INDEX JNE Q,M32580 JUMP IF COMPLETED NATIONAL DATA PASSE S COPY =:10,Q INDEX VALUE FOR NATIONAL DATA COPY Q,INDXV1 STORE NATIONAL DATA INDEX JMP M32410 CONTINUE * M32580 EQU $ JMP M32410 PATCH FOR LOOPING THROUGH NATIONAL DATA ORG $-1 JMP M32400 PATCH FOR LOOPING THROUGH BOTH VENDORS ORG $-1 NOP  OVERLAY WITH NOP JMP M32600 LPOOL TITL ******** * * SUBROUTINES AND DATA STORAGE * ******** SPACE 1 * * SUBROUTINE ADCHK1 * * THIS SUBROUTINE DETERMINES WHEN THE MEMORY ADDRESS * REACHES THE POWER UP TRAP (:80). * WHEN THIS OCCURS, IT ADVANCES THE ADDRESS PAST * THE END OF THE MEMORY EXCEPTION TRAP (:8B), AND * ADVANCES THE LOOP COUNT AND DATA TABLE POINTER. * ADCHK1 ENT CSK X,=:80 REACHED POWER UP TRAP LOCATION ? JMP *ADCHK1 NO, RETURN JMP *ADCHK1 NO, RETURN ADD =:20,X  ADVANCE ADDRESS PAST TRAP LOCATIONS COPY POINT12,A SET POINTERS AND COUNTERS ADD =:20,A COPY A,POINT12 IMS COUNT13 JMP *ADCHK1 RETURN * * DATA STORAGE * INDXV1 RES 1,0 VENDOR INDEX INDXP1 RES 1,0 PASS INDEX COUNT13 RES 1,0 LOOP COUNT COUNT14 RES 1,0 LOOP COUNT POINT11 RES 1,0 DATA SUB-TABLE ADDRESS POINT12 RES 1,0 DATA TABLE POINTER TEDAT2 RES 1,0 J1TESTC JMP J2TESTC SECOND JUMP OF TWO TITL * * WRITE ECC RAMS * M32600 EQU $ COPY =0,A  COPY A,INDXV1 SET VENDOR INDEX FOR FAIRCHILD DATA M32610 COPY =0,A COPY A,INDXP1 SET PASS INDEX FOR 1ST PASS DATA M32620 COPY LOLIMX1,X INITIALIZE MEMORY ADDRESS COPY =0,Q COPY Q,COUNT13 INITIALIZE LOOP COUNT M32630 COPY COUNT13,Q GET LOOP COUNT TBIT 0,Q COPY Q REG BIT 0 TO OV COPY =0,Q CLEAR Q JF OV,$+2 TEST Q REG BIT 0 COPY =4,Q LOAD Q WITH INDEX IF COUNT13 IS ODD ADD INDXP1,Q ADD PASS INDEX ADD INDXV1,Q ADD VENDOR INDEX ADD =ECCTB1,Q ADD BASE ADDRESS OF DATA TABLE COPY Q,POINT11 STORE SUB-TABLE ADDRESS COPY =TSTC2,Q COPY Q,COUNT14 INITIALIZE LOOP COUNT M32640 COPY POINT11,Q GET SUB-TABLE ADDRESS COPY Q,POINT12 INITIALIZE TABLE POINTER M32650 COPY *POINT12,Q GET DATA FROM TABLE COPY Q,0(X) WRITE DATA TO MEMORY  ADD =1,X INCREMENT ADDRESS JST ADCHK1 CHECK FOR TRAP LOCATIONS IMS POINT12 INCREMENT DATA TABLE POINTER IMS COUNT14 INCREMENT LOOP COUNT JMP M32640 CONTINUE IMS COUNT13 INCREMENT LOOP COUNT CSK X,L END OF MEMORY ? JMP M32630 NO, CONTINUE JMP M32630 NO, CONTINUE SPACE 12 * * VERIFY ECC RAMS * M32720 COPY LOLIMX1,X INITIALIZE MEMORY ADDRESS COPY =0,Q COPY Q,COUNT13 INITIALIZE LOOP COUNT M32730 COPY COUNT13,Q GET  LOOP COUNT TBIT 0,Q COPY Q REG BIT 0 TO OV COPY =0,Q CLEAR Q JF OV,$+2  TEST Q REG BIT 0 COPY =4,Q LOAD Q WITH INDEX IF COUNT13 IS ODD ADD INDXP1,Q ADD PASS INDEX ADD INDXV1,Q ADD VENDOR INDEX ADD =DATTB1,Q ADD BASE ADDRESS OF DATA TABLE COPY Q,POINT11 STORE SUB-TABLE ADDRESS COPY =TSTC2,Q COPY Q,COUNT14 INITIALIZE LOOP COUNT * M32740 COPY POINT11,Q GET SUB-TABLE ADDRESS COPY Q,POINT12 INITIALIZE TABLE POINTER M32750 COPY *POINT12,Q GET DATA FROM TABLE AND =:1F,Q WANT ONLY BITS 0-4 COPY Q,K STORE AS EXPECTED DATA M32760 COPY 0(X),A COPY A,TEDAT2 STORE MEMORY CONTENTS COPY Q,0(X) WRITE DATA COPY 0(X),A READ DATA COPY A,Q COPY TEDAT2,A COPY A,0(X) RESTORE MEMORY CONTENTS CSK Q,K COMPARE TO EXPECTED NOP JST ERR1 M32763 ADD =1,X INCREMENT ADDRESS  JST ADCHK1 CHECK FOR TRAP LOCATIONS IMS POINT12 INCREMENT DATA TABLE POINTER IMS COUNT14 INCREMENT LOOP COUNT JMP M32740 CONTINUE IMS COUNT13 INCREMENT LOOP COUNT  CSK X,L END OF MEMORY ? JMP M32730 NO, CONTINUE JMP M32730 NO, CONTINUE  NOP YES, EXIT COPY INDXP1,Q GET PASS INDEX JNE Q,M32770 JUMP IF COMPLETED 2ND PASS COPY =8,Q INDEX VALUE FOR 2ND PASS DATA COPY Q,INDXP1 STORE 2ND PASS DATA INDEX  JMP M32620 CONTINUE * M32770 EQU $ JMP M32610 PATCH FOR LOOPING THROUGH FAIRCHILD DATA ORG $-1 NOP OVERLAY WITH NOP * COPY INDXV1,Q GET VENDOR INDEX JNE Q,M32780 JUMP IF COMPLETED NATIONAL DATA PASSES COPY =:10,Q INDEX VALUE FOR NATIONAL DATA COPY Q,INDXV1 STORE NATIONAL DATA INDEX JMP M32610 CONTINUE * M32780 EQU $ JMP M32610  PATCH FOR LOOPING THROUGH NATIONAL DATA ORG $-1 JMP M32600 PATCH FOR LOOPING THROUGH BOTH VENDORS ORG $-1 NOP OVERLAY WITH NOP JMP J1TESTC FIRST JUMP OF TWO *  LPOOL TITL BYTE TEST -- 64K TESTING (TEST D) ******** * * TEST D * * BYTE TEST * * THIS TEST WRITES MEMORY WITH DATA PATTERNS IN BYTE * MODE, ALTERNATING UPPER BYTE AND LOWER BYTE * , WORD BY WORD. IT THEN VERIFIES THE MEMORY * WRITTEN, READING IN BYTE MODE. * ******** * * WRITE MEMORY * SPACE 1 TSTD1 EQU :55 TSTD2 EQU :AA SPACE 1 TESTD ENT COPY =:88,X COPY =DUMT,A COPY A,3(X)  COPY ='D',A SELECT ASCK CODE COPY A,TESTNO INTO TEST NUMBER COPY =:D,A OUTPUT TEST NUMBER SELP A,4 TO CONSOLE COPY LOLIMX,Y INITIALIZE MEMORY ADDRESS COPY HILIMX,A ADD =1,A   COPY A,L COPY =TSTD1,A LOAD A WITH UPPER BYTE DATA COPY =TSTD2,Q LOAD Q WITH LOWER BYTE DATA M33010 SBIT 2,S SET BYTE MODE COPY A,0(Y) WRITE DATA TO TEST MEMORY (UPPER BYTE) COPY Q,1(Y) WRITE DATA TO TEST MEMORY (LOWER BYTE) RBIT 2,S RESET BYTE MODE ADD =1,Y INCREMENT ADDRESS * CSK Y,=:80 REACHED TRAP VECTOR LOCATIONS ? JMP $+3 NO JMP $+2 NO COPY =:96,Y YES, MOVE ADDRESS PAST TRAP LOCATIONS CSK Y,L END OF MEMORY ? JMP M33010 NO, CONTINUE JMP M33010 NO, CONTINUE RBIT 2,S SET WORD MODE TITL * * VERIFY MEMORY * COPY =0,A LOAD A WITH HIGH ORDER PHYSICAL ADDRESS COPY LOLIMX,Y INITIALIZE MEMORY ADDRESS SBIT 2,S SET BYTE MODE * M33020 COPY =TSTD1,Q UPPER BYTE EXPECTED DATA COPY Q,K LOAD K WITH EXPECTED DATA COPY 0(Y),Q READ DATA FROM TEST MEMORY (UPPER BYTE) CSK Q,K COMPARE TO EXPECTED NOP JMP $+2 ERROR JMP M33030 OK COPY Y,X LOAD X WITH LOW ORDER PHYSICAL ADDRESS RBIT 2,S SET WORD MODE JST ERR1 COPY X,Y SBIT 2,S SET BYTE MODE * M33030 COPY =TSTD2,Q LOWER BYTE EXPECTED DATA COPY Q,K LOAD K WITH EXPECTED DATA COPY 1(Y),Q READ DATA FROM TEST MEMORY (LOWER BYTE) CSK Q,K COMPARE TO EXPECTED NOP JMP $+2 ERROR JMP M33040 OK RBIT 2,S SET WORD MODE COPY Y,X LOAD X WITH LOW ORDER PHYSICAL ADDRESS JST ERR1 COPY X,Y * M33040 ADD =1,Y INCREMENT ADDRESS * CSK Y,=:80  REACHED TRAP VECTOR LOCATIONS ? JMP $+3 NO JMP $+2 NO COPY =:96,Y  YES, MOVE ADDRESS PAST TRAP LOCATIONS CSK Y,L END OF MEMORY ? JMP M33020 NO, CONTINUE JMP M33020 NO, CONTINUE RBIT 2,S SET WORD MODE * JMP TESTD+1 PATCH FOR LOOPING THROUGH BYTE TEST ORG $-1 NOP OVERLAY WITH NOP JST TPV JMP *TESTD * LPOOL TITL DOUBLE & SINGLE BIT ERROR TEST (TEST E) *********** * * DOUBLE BIT ERROR TEST AND SINGLE BIT ERROR TEST * * THIS TEST WILL ONLY TEST FOR HARD ERRORS ! * * THE DOUBLE BIT ERROR TEST WILL ONLY DISPLAY ERRORS WHEN TWO BITS * ARE FOUND BAD, GIVING THE MEMORY LOCATION OF THE ERROR. * * THE SINGLE BIT ERROR TEST WILL ONLY DISPLAY ERRORS WHEN ONE BIT * IS FOUND TO BE BAD, GIVING BOTH THE BAD BIT AND THE * MEMORY LOCATION OF THE ERROR. * * * IN ORDER TO GET AN ERROR MESSAGE PRINTED OUT, THE SENSE SWITCH MUST * MUST BE TURNED OFF. * ********** * * TEST FOR DOUBLE BIT ERRORS * TSTE1 EQU :FFFE TSTE2 EQU :7FFF TSTE3 EQU :FFFF TS TE4 EQU :8000 TESTE ENT COPY =TESTE+1,A COPY A,NTESTE COPY ='E',A SELECT ASCK CODE  COPY A,TESTNO INTO TEST NUMBER COPY =:E,A OUTPUT TEST NUMBER SELP A,4 TO CONSOLE COPY =:88,X SAVE CONTENTS OF COPY 3(X),A MEMORY EXCEPTION TRAP COPY A,TEMPME VECTOR  COPY =:0,A COPY LOLIMX,X INITIALIZE MEMORY ADDRESS COPY HILIMX,Q ADD =1,Q  COPY Q,MEMLIM SET HIGH MEMORY TESTING LIMIT JST F64020 DO DOUBLE AND SINGLE BIT ERROR TEST  COPY =:88,X SET MEMORY EXCEPTION COPY TEMPME,A TRAP VECTOR COPY A,3(X) BACK AS BEFORE  JMP *TESTE F64020 ENT DOUBLE AND SINGLE BIT ERROR TEST F64100 COPY =1,Y F64001 EQU $  COPY =:80,A SET UP TO TEST FOR TRAP LOCATIONS CSK A,X TEST FOR TRAP LOCATIONS JMP NTRAP JMP NTRAP COPY =:96,X NTRAP COPY X,Q SAVE MEMORY LOCATION COPY =:88,X -- SET UP MEMORY COPY ADD1B,A -- TRAP SERVICE ROUTINE COPY A,3(X) --  COPY Q,X RESTORE MEMORY LOCATION XNX Y COPY F64VAL,Q DETERMINE DATA WORD COPY Q,0(X) WRITE MEMORY TEST WORD COPY Q,K SAVE TEST WORD COPY 0(X),Q READ TEST WORD, DOUBLE BIT ERRORS TRAP CSK Q,K COMPARE TO EXPECTED TEST WORD NOP JMP BERROR1+1  ERROR IN DATA OR ECC CODE TITL * * TEST FOR SINGLE BIT ERRORS * COPY X,Q SAVE MEMORY LOCATION COPY =:88,X -- SET UP MEMORY TRAP COPY ADD2B,A -- SERVICE ROUTINE SINGLE COPY A,3(X) -- BIT ERRORS COPY Q,X RESTORE MEMORY LOCATION COPY K,A SAVE EXPECTECD DATA  JNE A,F64010 IS EXPECTED DATA EQUAL TO ZERO COPY =TSTE4,Q YES CHANGE TEST WORD TO 8000  JMP $+2 F64010 COPY =TSTE2,Q NO, CHANGE TEST WORD TO 7FFF COPY Q,0(X) WRITE TEST WORD INTO MEMORY COPY =TSTE4,A SET UP TO ENABLE ECC CODE CHANGE SELP A,8 SET ECC CODE COPY K,A  COPY A,0(X) CHANGE ECC CODE WITHOUT CHANGING DATA COPY =:0,A SET A TO TURN OFF ECC CODE SELP A,8 COPY 0(X),Q READ DATA FROM MEMORY, DOUBLE BIT ERRORS TRAP CSK Q,K COMPARE TO EXPECTED TEST WORD NOP JMP BERROR2+1 ERROR IN DATA OR IN ECC CODE COPY K,A SAVE EXPECTED DATA JNE A,F64012 IS EXPECTED DATA EQUAL TO ZERO COPY =1,Q YES, CHANGE TEST WORD TO 0001  JMP $+2 TITL SPACE 2 F64012 EQU $ COPY =TSTE1,Q NO, CHANGE TEST WORD TO FFFE COPY Q,0(X) WRITE DATA INTO MEMORY COPY =TSTE4,A SET UP TO TURN ON ECC CODE SELP A,8 TURN ON ECC CODE COPY K,A COPY A,0(X) CHANGE ECC CODE WITHOUT CHANGING THE DATA   COPY =:0,A SET UP TO TURN OFF ECC CODE SELP A,8 TURN OFF ECC CODE COPY 0(X),Q  READ TEST WORD FROM MEM.DOUBLE BIT ERROR TRAP CSK Q,K COMPARE TO EXPECTED TEST WORD NOP  JMP BERROR2+1 ERROR IN DATA OR IN ECC CODE RTEST EQU $ JEQ Y,NTEST TEST FOR NEXT TEST WORD COPY =0,Y SET UP FOR NEXT TEST WORD JMP F64001 CONTINUE TESTING MEMORY LOCATION NTEST  EQU $ ADD =:1,X GET NEXT MEMORY LOCATION COPY MEMLIM,A GET MEMORY LIMIT CSK X,A COMPARE TO UPPER MEMORY LIMIT JMP F64100 CONTINUE TESTING JMP F64100  JMP *F64020 ADD1B WORD UMT1 ADD2B WORD BERROR2 ADD3B WORD TRAP2 ADD4B WORD TRAP3 F64VAL EQU $ WORD :FFFF WORD :0000 MEMLIM RES 1,0 MEMORY LIMIT LPOOL TITL * * MEMORY EXCEPTION TRAP SERVICE ROUTNE * BERROR1, BERROR2 * BERROR1 ENT JST ERR1  *** JMP RTEST RESUME TESTING TRAP2 ENT COPY K,A SAVE EXPECTED TEST WORD JEQ  A,$+2 IS TEST WORD 0'S OR F'S JMP R0015 F'S, CONTINUE TESTING JMP R0016 0'S, CONTINUE TESTING ** TSTE ENT COPY TSTEFLG,A IS BIT ERROR A CONSTANT ERROR JNE A,TSTE12 COPY Q,TSTED  COPY =1,A COPY A,TSTEFLG COPY K,A JEQ A,$+2 JMP R0015+2 JMP  R0016+2 TSTE12 EQU $ CSK Q,TSTED NOP JMP $+2 JMP FERROR COPY  =0,A COPY A,TSTEFLG COPY K,A JEQ A,$+2 JMP R0015 JMP R0016 * TSTEFLG WORD 0 TSTED WORD 0 *** BERROR2 ENT COPY X,Q SAVE MEMORY LOCATION COPY =:88,X  -- SET 2ND TRAP COPY ADD3B,A -- SERVICE ROUTINE COPY A,3(X) -- COPY Q,X RESTORE MEMORY LOCATION COPY K,A JEQ A,ZERO IS THE SECOND BIT ERROR FROM 0'S OR F'S COPY =TSTE3,Q SET TEST WORD RBIT 1,S RESET OV TITL R0015 EQU $ ROTATE Q,LO,1 RIPPLE 0 THROUGH TEST WORD JF OV,NERROR NO ERROR FOUND IN TEST WORD TRY ECC CODE COPY Q,0(X) WRITE TEST WORD TO MEMORY COPY =TSTE4,A SET UP TO TURN ON ECC CODE SELP A,8 TURN ON ECC CODE COPY K,A COPY A,0(X) CHANGE ECC CODE WITHOUT CHANGING THE DATA COPY =:0,A SELP A,8 TURN OFF ECC CODE COPY 0(X),A READ TEST WORD CSK A,K COMPARE TO EXPECTED DATA NOP  JMP R0015 CONTINUE LOOKING FOR ERROR JST TSTE DOES ERROR HAPPEN TWICE TITL SPACE 2 ZERO EQU $ COPY =0,Q SET TEST WORD SBIT 1,S SET OV R0016 ROTATE Q,LO,1 RIPPLE 1 THROUGH TEST WORD JT OV,NERROR NO ERROR FOUND IN TEST WORD TRY ECC CODE COPY Q,0(X)   WRITE TEST WORD COPY =TSTE4,A SET UP TO ENABLE EC CODE SELP A,8 ENABLE EC CODE COPY  K,A GET DATA WORD COPY A,0(X) CHANGE EC CODE COPY =:0,A SET UP TO DISABLE EC CODE  SELP A,8 DISABLE EC CODE COPY 0(X),A READ TEST WORD CSK A,K COMPARE TO EXPECTED DATA NOP JMP R0016 CONTINUE LOOKING FOR ERROR JST TSTE LPOOL TITL  SPACE 2 TRAP3 ENT COPY ECOD1,A COPY K,Q SAVE EXPECTED TEST WORD JEQ Q,$+2 IS TEST WORD 0'S OR F'S JMP NERROR2 F'S, CONTINUE TESTING JMP NERROR3 0'S, CONTINUE TESTING * *  NO ERROR IN TEST WORD * TEST ECC CODE * SPACE 1 NERROR EQU $ COPY Y,SAVE  COPY X,Q SAVE MEMORY LOCATION COPY =:88,X -- SET THIRD TRAP COPY ADD4B,A -- SERVICE ROUTINE  COPY A,3(X) -- COPY Q,X RESTORE MEMORY LOCATION COPY K,A JEQ A,NERROR1  IS TEST WORD EQUAL TO 0'S OR F'S COPY =TSTE3,A COPY =0,Y RBIT 1,S RESET OV NERROR2 EQU $ ROTATE A,LO,1 ROTATE LEFT ECC CODE COPY A,ECOD1 SAVE ECC CODE COPY Y,A  IS COUNTER SUB =:5,A EQUAL TO 5 JNE A,NERROR4 RESUME TESTING IF ZERO, ERROR NOT FOUND  TITL SPACE 2 COPY SAVE,A COPY A,Y RTEST1 JMP RTEST CONTINUE TESTING NERROR4 EQU  $ COPY =TSTE3,Q SET TEST WORD COPY Q,0(X) WRITE TO TEST MEMORY XNX Y  COPY FCNT,Q GET EC CODE WORD TO CHANGE EC CODE COPY =TSTE4,A SET UP TO ENABLE EC CODE SELP A,8 ENABLE EC CODE COPY Q,0(X) CHANGE EC CODE COPY =:0,A SET UP TO DISABLE EC CODE  SELP A,8 DISABLE EC CODE ADD =1,Y COPY 0(X),Q READ TEST WORD COPY ECOD1,A CSK Q,K COMPARE TO EXPECTED TEST WORD NOP JMP NERROR2 ERROR NOT FOUND TRY AGAIN JMP FERROR1 **** ECOD1 WORD :0 SAVE RES 1,0 FCNT EQU $ DATA TABLE TO GENERATE ZERO IN ECC BIT WORD :9082 WORD :1082 WORD :B74C WORD :B809 WORD :8F45 TITL SPACE 2 NERROR1 EQU $ SBIT 1,S SET OV COPY =0,Y NERROR3 EQU $ ROTATE A,LO,1 ROTATE LEFT ECC CODE COPY A,ECOD1 SAVE ECC CODE COPY Y,A  SUB =5,A JNE A,NERROR5 RESUME TESTING IF ZERO, ERROR NOT FOUND COPY SAVE,Q  COPY Q,Y JMP RTEST1 CONTINUE TESTING NERROR5 EQU $ COPY =0,Q SET TEST WORD  COPY Q,0(X) WRITE TO TEST MEMORY XNX Y COPY ZCNT,Q COPY =TSTE4,A  SELP A,8 COPY Q,0(X) COPY =:0,A SELP A,8 ADD =1,Y COPY 0(X),Q  READ TEST WORD COPY ECOD1,A CSK Q,K COMPARE TO EXPECTED TEST WORD NOP  JMP NERROR3 ERROR NOT FOUND TRY AGAIN JMP FERROR1 ZCNT EQU $ TABLE TO GENERATE ONE'S IN ECC BIT WORD :07F0 WORD :87F0 WORD :203E WORD :2F7B WORD :1837 * TSTECC ENT COPY TSTEFLG,Q TEST FLAG FOR FIRST RUN JNE Q,TSTECC1 COPY A,TSTED COPY =1,Q COPY Q,TSTEFLG SET FLAG FOR SECOND RUN COPY K,Q JEQ Q,$+2 DETERMINE ZERO OR F'S JMP NERROR4 JMP NERROR5 TSTECC1 EQU $ CSK A,TSTED IS IT A CONSTANT ERROR  NOP JMP $+2 JMP FERROR1 YES COPY K,Q JEQ Q,$+2 JMP NERROR2 JMP NERROR3 TITL * * FOUND ERROR IN ECC CODE * FERROR1 EQU $ COPY ECOD1,Q  COPY K,A JEQ A,FERR1 SET ECC CODE FOR READING XOR =:FFFF,Q FERR1 JST ERR3  JMP RTEST1 SPACE 2 * * FOUND ERROR IN DATA WORD * FERROR EQU $ COPY K,A JST ERR2 **** JMP RTEST1 RESUME TESTING SPACE 2 ERR2 ENT COPY Y,YSAVE COPY A,EXPT EXPECTED VALUE COPY Q,ACT ACTUAL VALUE COPY X,ADDR ADDRESS COPY =1,A COPY A,ERRNO ERROR CODE NUMBER COPY =0,A COPY A,ECC NO ECC ERROR JST ICRPT  JST TSTCHK COPY ADDR,X COPY YSAVE,Y JMP *ERR2 * YSAVE WORD 0 * ERR3 ENT  COPY Y,YSAVE COPY =0,A COPY A,EXPT EXPECTED VALUE COPY A,ACT ACTUAL VALUE COPY Q,ECC ECC BIT ERROR COPY A,Q COPY X,ADDR ADDRESS COPY =2,A COPY A,ERRNO ERROR IN ECC CODE JST ICRPT JST TSTCHK COPY ADDR,X COPY YSAVE,Y JMP *ERR3 LPOOL TITL RELOCATION ROUTINES ******** * * RELOCATION ROUTINES * ******** RELOCA ENT COPY END,A  IS THE ENDING MEMORY ADDRESS TBIT 15,A ABOVE 8-K (:2000) JT OV,RELOCA1 COPY =MEMM,A  CSK A,END JMP RELOCA1 JMP RELOCA2 RELOCA1 COPY BEGN,A YES - IS THE STARTING ADDRESS  TBIT 15,A ABOVE 8-K (:2000) JT OV,RELOCA3 COPY =MEMM,A CSK A,BEGN JMP RELOCA3 JMP RELOCA4 RELOCA3 RBIT 15,A YES - DO NOT RELOCATE MEM64K JMP *RELOCA * RELOCA2 EQU $ COPY RELFLG,A JEQ A,RELOCA5 SBIT 15,A MEM64K IS ALREADY RELOCATED JMP  *RELOCA CONTINUE TESTING RELOCA5 COPY BEGN,A COPY A,LOLIMX SET LOWER LIMIT WITH STARTING ADDRESS COPY END,A COPY A,HILIMX SET UPPER LIMIT WITH ENDING ADDRESS JMP M34100 * RELOCA4 EQU $ COPY RELFLG,A IS DIAGNOSTIC RELOCATED JEQ A,$+2 JMP M34200 COPY BEGN,A COPY A,LOL IMX SET LOWER LIMIT WITH STARTING ADDRESS COPY END,A TBIT 15,A JT OV,RELOCA6 COPY =MEMM,A CSK A,END JMP RELOCA6 JMP RELOCA7 RELOCA6 COPY =MEMM-1,A COPY A,HILIMX SET UPPER LIMIT WITH (:1FFFF) JMP M34100 * RELOCA7 EQU $ COPY END,A SET UPPER LIMIT WITH  COPY A,HILIMX ENDING ADDRESS * TITL * * RELOCATE MEM64K TO HIGH MEMORY * M34100 EQU $ JST  RELTV COPY =0,X INITIALIZE SOURCE ADDRESS COPY =MEMM,Y INITIALIZE DESTINATION ADDRESS  COPY Y,L SET SOURCE ADDRESS LIMIT M34110 COPY 0(X),A READ FROM SOURCE AREA COPY A,0(Y)  WRITE TO DESTINATION AREA ADD =1,X INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS CSK X,L SOURCE ADDRESS AT LIMIT ? JMP M34110 NO, CONTINUE JMP M34110 * VERIFY M34120 COPY =0,X INITIALIZE SOURCE ADDRESS COPY =MEMM,Y INITIALIZE DESTINATION ADDRESS M34130 COPY 0(X),A READ FROM SOURCE AREA COPY A,K SAVE IN K COPY 0(Y),Q READ FROM DESTINATION AREA CSK Q,K COMPARE SOURCE DATA WITH DESTINATION DATA NOP  JMP REL8 ERROR ADD =1,X DATA OK -- INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS CSK X,L SOURCE ADDRESS AT LIMIT ? JMP M34130 NO, CONTINUE  JMP M34130 JST MOVE WORD MEMH JST TPV JMP M34150 YES, EXIT *  TITL * * PREPARE TO JUMP TO RELOCATED PROGRAM * M34150 EQU $ COPY RELOCA,A PREPARE MEMORY DIAGNOSTIC ADD =MEMH,A TO JUMP TO HIGH COPY A,RELOCA MEMORY SBIT 15,A SET MEM64K RELOCATION INDICATOR RBIT 8,S DISABLE INTERREUPTS COPY =:94,X COPY =CONINT1,Q ADD =MEMH,Q COPY Q,1(X) COPY =:88,X COPY =UMT1,Q ADD =MEMH,Q COPY Q,3(X) COPY =:84,X COPY =UIT1,Q ADD =MEMH,Q COPY Q,3(X) COPY =:80,X COPY =PUPRTN,Q ADD =MEMH,Q COPY Q,1(X) COPY =:8C,X COPY =PDWN,Q  ADD =MEMH,Q COPY Q,3(X) JMP *RELOCA JUMP TO HIGH MEMORY * LPOOL TITL * * LOCATE MEM64K BACK TO LOW MEMORY * M34200 JST RESTOR MOVE MEM64K BACK TO LOW MEMORY IN 4,A  INPUT CONSOLE DISPLAY RBIT 15,A RESET MEM64K RELOCATION INDICATOR SIN 1 INHIBIT INTERRUPTS SBIT 8,S ENABLE INTERRUPTS COPY RELOCA,A SET RELOCATED PROGRAM TO TRANSFER  SUB =MEMH,A BACK TO P-1. COPY A,RELOCA JMP *RELOCA JUMP TO P-1. TITL * *  ROUTINE TO MOVE MEM64K FROM HIGH MEMORY BACK TO LOW MEMORY * RESTOR ENT JST RELTV COPY =MEMM,X IN ITIALIZE SOURCE ADDRESS COPY =0,Y COPY =:4000,A COPY A,L RESTOR1 COPY 0(X),A READ FROM SOURCE AREA COPY A,0(Y) WRITE TO DESTINATION AREA ADD =1,X INCREMENT SOURCE ADDRESS  ADD =1,Y INCREMENT DESTINATION ADDRESS CSK X,L SOURCE ADDRESS AT LIMIT ? JMP RESTOR1 NO, CONTINUE JMP RESTOR1 * VERIFY COPY =MEMM,X INITIALIZE SOURCE ADDRESS  COPY =0,Y INITIALIZE DESTINATION ADDRESS RESTOR2 COPY 0(X),A READ FROM SOURCE AREA COPY A,K SAVE IN K COPY 0(Y),Q READ FROM DESTINATION AREA CSK Q,K COMPARE SOURCE DATA WITH DESTINATION DATA NOP JMP REL8 ERROR ADD =1,X DATA OK -- INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS CSK X,L SOURCE ADDRESS AT LIMIT ?  JMP RESTOR2 NO, CONTINUE JMP RESTOR2 JST MOVE WORD MEML JST TPV  JMP *RESTOR YES, RETURN * LPOOL SPACE 2 * * TRANSFER DATA TABLES * * JST MOVE * WORD :3000 MOVE FROM LOW TO HIGH * :D000 MOVE FROM HIGH TO LOW * * MOVE ENT COPY *MOVE,A COPY A,MEMLH IMS MOVE MOVE1 COPY =DAST,X SET DATA TABLE ADDRESS SOURCE COPY =DAST,Y SET DATA TABLE ADDRESS DESTINATION ADD MEMLH,Y COPY =DAEN,A SET DATA TABLE END COPY A,L REL5 COPY 0(X),A READ FROM SOURCE AREA COPY A,0(Y) WRITE TO DESTINATION ADD =1,X INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS CSK X,L IS SOURCE AT DATA TABLE END ADDRESS JMP REL5 JMP REL5 * VERIFY REL6 COPY =DAST,X COPY =DAST,Y ADD MEMLH,Y REL7 COPY 0(X),A COPY A,K READ FROM SOURCE COPY 0(Y),Q READ FROM DESTINATION CSK Q,K VERIFY DATA NOP JMP REL8 DATA DOES NOT MATCH ERROR ADD =1,X INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS CSK X,L IS SOURCE AT DATA TABLE END ADDRESS JMP REL7 JMP REL7 JMP *MOVE SPACE 1 REL8  EQU $ COPY ENTFLG,A JEQ A,$+2 JMP HALT12 COPY RELFLG,A JEQ A,NREL JST RESTOR COPY =0,A COPY =RELFLG,Q SUB =MEMH,Q COPY Q,X COPY A,0(X) JST MSGA OUTPUT MESSAGE WORD QUERYBD 'RELOCATION ERROR - HALT' COPY Y,ADDR SET ADDRESS JST ERRD HLT COPY =MEM64D,A SUB =MEMH,A COPY A,X JMP 0(X) NREL EQU $ JST MSGA OUTPUT MESSAGE WORD QUERYBD 'RELOCATION ERROR - HALT' COPY Y,ADDR SET ADDRESS JST ERRD HLT JMP MEM64D * HALT12 EQU $ IN 4,A AND =:FF,A  OR =:A500,A SELP A,4 COPY K,A COPY Y,X COPY =0,Y HLT JMP  CONINT1+1 * ERRD ENT COPY =3,A COPY A,ERRNO JST TSTCHK JMP *ERRD * MEMLH WORD 0 * LPOOL * TITL * * RELOCATE PROGRAM 2 TO MEMORY SPACE ABOVE PROGRAM 1 4-K (:1000) * * JST REL * SPACE 1 REL ENT JST RELTV COPY =MEMH,X INITIALIZE SOURCE ADDRESS COPY =MEMLL,Y INITIALIZE DESTINATION ADDRESS COPY =MEMM,A SET SOURCE ADDRESS LIMIT COPY A,L REL1 COPY 0(X),A READ FORM SOURCE AREA COPY A,0(Y) WRITE TO DESTINATION ADD =1,X INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS CSK Y,L DESTINATION ADDRESS AT LIMIT ? JMP REL1 NO - CONTINUE JMP REL1 * VERIFY REL2 COPY =MEMH,X INIT. SOURCE ADDRESS COPY =MEMLL,Y INIT. DESTINATION ADDRESS REL3 COPY 0(X),A READ FROM SOURCE AREA COPY A,K COPY 0(Y),Q READ FROM DESTINATION AREA CSK Q,K DO DATA MATCH NOP JMP REL8 NO - ERROR ADD =1,X INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS  CSK Y,L DESTINATION ADDRESS AT LIMIT ? JMP REL3 NO - CONTINUE JMP REL3 JST TPV  JMP *REL YES - EXIT SPACE 3 * * SET WORKING TABLE IN PART 2 OF MEM64K * DIAGNOSTIC * MOVT  ENT JST RELTV COPY =PRAMS,X SET WORKING TABLE FOR COPY =PRAMS,Y UPPER MEMORY ADD =MEMLL,Y COPY =PRAMSX,A COPY A,L MO1 COPY 0(X),A GET TEST ADDRESS JLT A,$+2 IF END OF TABLE DO NOT ADD :3000 ADD =MEMH,A ADD :3000 TO ADDRESS COPY A,0(Y) PLACE IN UPPER MEMORY ADD =1,X ADD =1,Y CSK X,L COMPARE TO LIMIT NOP JMP MO1 * VERIFY COPY  =PRAMS,X COPY =PRAMS,Y ADD =MEMLL,Y MO2 COPY 0(X),A JLT A,$+2 IF END OF TABLE DO NOT ADD :3000 ADD =MEMH,A GET WORKING TABLE ADDRESS COPY A,K COPY 0(Y),Q AND COMPARE IT TO UPPER MEMORY CSK K,Q NOP JMP REL8 ADD =1,X ADD =1,Y CSK X,L NOP JMP MO2 JST TPV JMP *MOVT * * RELOCATE TEST B --- JST TBREL * TBREL ENT JST  RELTV COPY =TESTB1,X SET TEST B STARTING ADDRESS COPY TBST,Y SET DESTINATION ADDRESS COPY  =TESTB2,A SET TEST B ENDING ADDRESS COPY A,L TBREL1 COPY 0(X),A READ FROM SOURCE COPY A,0(Y) WRITE TO DESTINATION ADD =1,X INCREMENT SOURCE ADDRESS ADD =1,Y INCREMENT DESTINATION ADDRESS CSK  X,L END OF TEST B ? JMP TBREL1 JMP TBREL1 NO * VERIFY * TBREL2 EQU $ COPY =TESTB1,X SET TEST B STARTING ADDRESS COPY TBST,Y SET DESTINATION ADDRESS TBREL3 COPY 0(X),A READ FROM SOURCE ADDRESS COPY A,K COPY 0(Y),Q READ FROM DESTINATION ADDRESS CSK Q,K DOES SOURCE DATA EQUAL DESTINATION DATA NOP NO JMP REL8 NO ADD =1,X YES - INCREMENT SOURCE ADDRESS ADD   =1,Y AND DESTINATION ADDRESS CSK X,L END OF TEST B ? JMP TBREL3 NO JMP TBREL3 NO  JST TPV JMP *TBREL YES LPOOL TITL TEST DATA TABLES * * MOSTEK DATA RAM TEST DATA * * PASS 1 * DATTB0 EQU $ WORD :AAAA WORD :5555 WORD :5555 WORD :AAAA  WORD :5555 WORD :AAAA WORD :AAAA WORD :5555 * WORD :5555 WORD :AAAA WORD :AAAA WORD :5555 WORD :AAAA WORD :5555 WORD :5555 WORD :AAAA TITL * * PASS 2 * WORD :5555 WORD :AAAA WORD :AAAA WORD :5555 WORD :AAAA WORD :5555 WORD :5555 WORD :AAAA * WORD :AAAA WORD :5555 WORD :5555 WORD :AAAA WORD :5555 WORD :AAAA WORD :AAAA WORD :5555 TITL * * TEXAS INSTRUMENTS DATA RAM TEST DATA * * PASS 1 * WORD :AAAA WORD :AAAA WORD :5555 WORD :5555 WORD :5555 WORD :5555 WORD :AAAA  WORD :AAAA * WORD :5555 WORD :5555 WORD :AAAA WORD :AAAA WORD :AAAA  WORD :AAAA WORD :5555 WORD :5555 TITL * * PASS 2 * WORD :5555  WORD :5555 WORD :AAAA WORD :AAAA WORD :AAAA WORD :AAAA WORD :5555  WORD :5555 * WORD :AAAA WORD :AAAA WORD :5555 WORD :5555 WORD :5555 WORD :5555 WORD :AAAA WORD :AAAA TITL * * MOSTEK ECC RAM TEST DATA * *  PASS 1 * ECCTB0 EQU $ WORD :2000 WORD :0020 WORD :0020 WORD :2000 WORD :0020 WORD :2000 WORD :2000 WORD :0020 * WORD :0020 WORD :2000  WORD :2000 WORD :0020 WORD :2000 WORD :0020 WORD :0020 WORD :2000  TITL * * PASS 2 * WORD :0020 WORD :2000 WORD :2000 WORD :0020  WORD :2000 WORD :0020 WORD :0020 WORD :2000 * WORD :2000 WORD :0020  WORD :0020 WORD :2000 WORD :0020 WORD :2000 WORD :2000 WORD :0020 TITL * * TEXAS INSTRUMENTS ECC RAM TEST DATA * * PASS 1 * WORD :2000 WORD :2000  WORD :0020 WORD :0020 WORD :0020 WORD :0020 WORD :2000 WORD :2000 * WORD :0020 WORD :0020 WORD :2000 WORD :2000 WORD :2000 WORD :2000 WORD :0020 WORD :0020 TITL * * PASS 2 * WORD :0020 WORD :0020 WORD :2000 WORD :2000 WORD :2000 WORD :2000 WORD :0020 WORD  ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I! ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I" ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I# ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I$ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I% ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I& ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’Iÿÿÿÿÿÿe;810924140200810924140200810924140200eú@€810924140200810924140200810924140810e:' 810924140200810924140200810924140200e810924140200810924140200810924140200810924140200810924140200810924140200ec8108270905232581082709052450810827101654eq8108270907462581082709074750810827101812eÈ>Ê8108270841042581082708415100810827102252 e\ 98106301214102581063012141300810630121531(  ef Ð8108270906195081082709062225810827102606 erœ8002251330090080022513301250810827102831d esŸ8002251330185080022513302175810630144110d etñ8002251330275081082710012875810827102911deu#E8106301247332581063012483325810827103037e˜8108270923447581082709561500810827103226) * + , - . / 0 ÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿð. MEM64K HLPMEM64K JCLMEM64K3 ASM MEM64K NUC MEM64K MAC MEM64K2 MAC MEM64K3 MAC MEM64K MAPMEM64K BINMEM64K CNC :0020 * WORD :2000 WORD :2000 WORD :0020 WORD :0020 WORD :0020  WORD :0020 WORD :2000 WORD :2000 TITL * * FAIRCHILD DATA RAM TEST DATA * * PASS 1 1 * DATTB1 EQU $ WORD :AAAA WORD :5555 WORD :5555 WORD :AAAA * WORD :5555 WORD :AAAA WORD :AAAA WORD :5555 * * PASS 2 * WORD :5555 WORD  :AAAA WORD :AAAA WORD :5555 * WORD :AAAA WORD :5555 WORD :5555  WORD :AAAA TITL * * NATIONAL DATA RAM TEST DATA * * PASS 1 * WORD :AAAA WORD :AAAA WORD :AAAA WORD :AAAA * WORD :5555 WORD :5555 WORD :5555 WORD :5555 * * PASS 2 * WORD :5555 WORD :5555 WORD :5555 WORD :5555 * WORD :AAAA WORD :AAAA WORD :AAAA WORD :AAAA TITL * * FAIRCHILD ECC RAM TEST DATA * * PASS 1 * ECCTB1 EQU $ WORD :2000 WORD :0020 WORD :0020 WORD :2000 * WORD :0020 WORD :2000 WORD :2000 WORD :0020 * * PASS 2 * WORD :0020 WORD :2000 WORD :2000 WORD :0020 * WORD :2000 WORD :0020 WORD :0020 WORD :2000 TITL * * NATIONAL ECC RAM TEST DATA * * PASS 1 * WORD :2000  WORD :2000 WORD :2000 WORD :2000 * WORD :0020 WORD :0020 WORD :0020 WORD :0020 * * PASS 2 * WORD :0020 WORD :0020 WORD :0020 WORD  :0020 * WORD :2000 WORD :2000 WORD :2000 WORD :2000 TITL ' OUTPUT MESSAGE ' **************************** * * MSGA - OUTPUT AN ASCII MESSAGE TO * THE TELETYPE CALLING SEQUENCE * * JST MSGA (CALL ROUTINE) * DATA (ADDRESS OF ACSII MESSAGE) * * NOTE: LAST CHARACTER OF ASCII MESSAGE MUST BE =:FF * ************************************* SPACE 1 MSGA ENT COPY A,MSGA4 SAVE A REG COPY X,MSGA3 SAVE X REG COPY *MSGA,X GET MESSAGE ADDRESS SHIFT X,LO,1 IMS MSGA MSGA1 SBIT 2,S COPYB 0(X),A GET BYTE RBIT 2,S CLSN =:FF,A IS IT END (FF) JMP MSGA2 YES- EXIT JST  OTT **-OUTPUT CAR** ADD =1,X BUMP PTR JMP MSGA1 GET NEXT CHAR MSGA2 COPY MSGA3,X  RESTORE X COPY MSGA4,A RESTORE A JMP *MSGA RETURN TO CALLER MSGA3 WORD 0 SAVE X REG MSGA4 WORD 0 SAVE A REG LPOOL TITL 'OUTPUT ASCII CHARACTER' ********************************* * *  ASCOUT - PRINTS ASCII CHARACTERS * * JST ASCOUT * DATA LENGTH # OF BYTE TO PRINT * DATA ADDRESS WORD ADDRESS OF ASCII STRING * ********************************** SPACE 1 ASCOUT ENT COPY *ASCOUT,A GET THE BYTE COUNT NEG A,A COPY A,TEMPAS SAVE NEGATIVE BYTE COUNT IMS ASCOUT INCREMENT RETURN ADDRESS COPY *ASCOUT,X GET WORD ADDRESS IMS ASCOUT SHIFT X,LO,1 MAKE BYTE ASCOT1 SBIT 2 2,S COPYB 0(X),A GET BYTE RBIT 2,S JST OTT *OUTPUT* ADD =1,X  MOVE TO NEXT BYTE IMS TEMPAS JMP ASCOT1 JMP *ASCOUT RETURN TO CALLER TEMPAS WORD 0 LPOOL TITL 'OUTPUT MESSAGE' *********************************** * * OUT SHT - PRINTS A CARRIAGE RETURN, * LINE FEED, FOLLOWED BY A MESSAGE * * A - BYTE LENGTH OF MESSAGE * * - WORD ADDRESS OF MESSAGE * ********************************** SPACE 2 OUTSHT ENT COPY A,OUTSH1 SAVE A COPY X,OUTSH2 SAVE X  COPY =CR,A OUTPUT CARRIAGE RETURN JST OTT **OUTPUT** COPY =LF,A OUTPUT LINE FEED JST OTT **OUTPUT** JST ASCOUT OUTSH1 WORD 0 PARAMETER BIT FOR ASCOUNT OUTSH2 WORD 0 JMP *OUTSHT RETURN TO CALLER TITL 'CHARACTER INPUT' ************************************** * *  CHRIN - CHECKS TO SEE THAT THE * TERMINATOR CHARACTER FOR INPUT * THROUGH IHEX OR IDEC ROUTINE IS * ONE OF THE FOLLOWING * * C/R - RETURN TO STD RTN ADDRESS * # - RETURN TO R+1 * BACKARROW - RETURN TO R+2 *  UP ARROW - RETURN TO R+3 * COMMA - RETURN TO R+4 * (ANYTHING ELSE) - RETURN TO R+5 * **************************************** SPACE 2 CHRIN ENT COPY IDCTM2,A GET TTY INPUT CHAR CLSN =CR,A IS IT CARRIAGE RETURN JMP *CHRIN YES IMS CHRIN CLSN ='#',A IS IT # JMP *CHRIN YES IMS CHRIN CLSN =BACKA,A IS IT BACKARROW JMP *CHRIN YES IMS CHRIN CLSN =UPA,A IS IT UP ARROW JMP *CHRIN YES IMS CHRIN CLSN =',',A IS IT COMMA JMP *CHRIN YES  IMS CHRIN JMP *CHRIN ANYTHING ELSE TITL 'PRINT INTEGER 2 PLACES ROUTINE' ****************************** * * DCMLOT - PRINTS A 16 BIT INTEGER * AS A 2 CHARACTER UNSIGNED DECIMAL * FIELD (0-99 ONLY) * * LDA VALUE * JST DCMLOT * ****************************** SPACE 2 DCMLOT ENT COPY A,DECVAL SAVE DECIMAL VALUE COPY =DCMTBL,A GET TABLE ADDRESS COPY A,DCMPTR SAVE A POINTER COPY =-2,A  COPY A,DCMCNT DCMOT1 COPY DECVAL,A GET VALUE COPY ='0'-1,X DCMOT2 SUB *DCMPTR,A ADD =1,X FORM ASCII JGE A,DCMOT2 ADD *DCMPTR,A COPY A,DECVAL GET READY TO COPY  X,A OUTPUT FIRST VALUE JST OTT IMS DCMPTR IMS DCMCNT IF DONE SKIP NEXT INST.  JMP DCMOT1 JMP *DCMLOT DCMCNT WORD 0 DCMPTR WORD 0 DCMTBL WORD 10,1 SPACE 1 LPOOL TITL 'INPUT DECIMAL ROUTINE' *************************************** * * IDEC - ACCEPTS INPUT FROM THE TTY OF *  AN ASCII - DECIMAL VALUE, WHICH IT CONVERTS * TO BINARY AND RETURNS IT IN THE X - REG. * THE ROUTINE IS EXITED UPON INPUT * OF FIRST NON-ASCII-DECIMAL CHARACTER, * WHICH IT RETURN IN THE A - REG. * *************3 ************************** SPACE 2 IDEC ENT INPUT A DECIMAL VALUE IDEC4 COPY =0,A CLEAR COPY A,IDCTM1 SAVECSALLER COPY A,IDCTM3 IDEC3 JST IKB GET CHARACTER COPY A,IDCTM2 SAVE IT SUB  HB0,A SEE IF ASCII 0-9 JLT A,IDEC1 TERMINATOR SUB HA,A JGE A,IDEC1 IMS IDCTM3 BINARY COUNT COPY IDCTM1,A ADDRESS TO VALUE SHIFT A,LO,2 ADD IDCTM1,A SHIFT A,LO,1 ADD IDCTM2,A ADDRESS NEW VALUE SUB HB0,A LESS ASCII JLT A,IDEC2 MINUS IS ERROR COPY A,IDCTM1 STORE NEW VALUE JMP IDEC3 IDEC1 COPY IDCTM2,A GET VALUE COPY IDCTM1,X GET TERMINATOR IN X  JMP *IDEC EXIT IDEC2 COPY =BELL,A ERROR JST OTT JMP IDEC4 START OVER TITL SPACE 2 IDCTM1 WORD 0 IDCTM2 WORD 0 IDCTM3 WORD 0 BELL EQU :3F HB0 WORD :30 HA WORD :A LPOOL TITL 'DECIMAL OUT ROUTINE' *********************************** * * DECOUT - PRINTS A 16 BIT INTEGER AS A * 4 CHARACTER UNSIGNED DECIMAL FIELD * (0-9999) ONLY * * LDA VALUE * JST DECOUT * ********************************** SPACE 2 DECOUT ENT COPY A,DECVAL SAVE DECIMAL VALUE COPY =DECTBL,A GET TABLE ADDRESS COPY A,DECPTR COPY =-4,A SET DECIMAL COUNT COPY A,DECCNT DECOT1 COPY DECVAL,A PERFORM SUCCESSIVE SUBTRACTING COPY ='0'-1,X DECOT2 SUB *DECPTR,A ADD =1,X JGE A,DECOT2 ADD *DECPTR,A  COPY A,DECVAL COPY X,A JST OTT **OUTPUT** IMS DECPTR IMS DECCNT INCREMENT LOOP COUNT JMP DECOT1 JMP *DECOUT RETURN TO CALLER DECVAL RES 1 DECIMAL VALUE DECCNT RES 1 COUNT DECPTR RES 1 POINTER DECTBL WORD 1000,100,10,1 TITL 'HEX OUT ROUTINE' ******************************** * * HEXOUT - PRINTS A 16 BIT INTEGER * AS A 4 CHARACTER HEXADECIMAL FIELD * * LDA HEXNUM * JST HEXOUT * ********************************* SPACE 2 HEXOUT ENT COPY =4,X SET UP FOR FOUR CHARACTER HEXOT1 COPY A,TEMPHE SAVE HEX SHIFT A,RO,8 SET UP TO SHIFT A,RO,4 FORM NIBBLE SUB =:A,A AND MAKE INTEGER JGE A,$+3 HEX ADD =:3A,A CHARACTER JMP $+2 ADD =:41,A JST OTT **OUTPUT**  COPY TEMPHE,A SHIFT A,LO,4 CHECK IIF ALL FOUR SUB =1,X CHARACTER DONE JNE X,HEXOT1  JMP *HEXOUT RETURN TO CALLER TEMPHE WORD 0 LPOOL TITL 'INPUT HEX ROUTINE' ******************************** * * IHEX - ACCEPTS INPUT VIA TTY OF A HEX VALUE, WHICH * IS RETURNED IN THE X - REG. THE ROUTINE IS * EXITED UPON INPUT OF THE FIRST NON-HEX ASCII * CHARACTER, WHICH IT RETURNS IN THE A - REG. * (CHECK FOR 4 DEGITS) * ********************************* SPACE 2 IHEX ENT INPUT HEX VALUE (4 - DIGIT) COPY =0,A CLEAR  COPY A,IDCTM1 VALUE COPY A,IDCTM3 AREA+COUNT IHEX3 JST IKB GET CHARACTER COPY A,IDCTM2 4  SAVE IT SUB HB0,A CHECK FOR HEX JLT A,IHEX4 TERMINATER SUB H9,A JLE A,IHEX1 ITS 0-9 SUB H9,A ADD =1,A JLT A,IHEX4 TERMINATE SUB H5,A JGT A,IHEX4 TERMINATE ADD HF,A ITS A-F IHEX2 COPY A,IDCTM2 SAVE HEX CHAR. COPY IDCTM1,A INCLUDE IT IN VALUE SHIFT A,LO,4 OR IDCTM2,A COPY A,IDCTM1 IMS IDCTM3 BUMP COUNT JMP IHEX3 GET NEXT CHAR. IHEX1 ADD H9,A HEX /-9 JMP IHEX2 IHEX4 COPY IDCTM2,A LOAD TERMINATED INTO A SPACE 2 COPY  IDCTM1,X LOAD VALUE INTO X JMP *IHEX RETURN TO CALLER H2 WORD 2 H5 WORD 5 H9 WORD 9 HF WORD :F CONSTANTS LPOOL TITL 'CHAR IN/OUT DISABLE ROUTINE' ************************************* * * CHARIN - ROUTINE DISABLES INTERRUPTS * ************************************** SPACE 2 CHARIN ENT SIN 6 DISABLE FOR 6 WORDS COPY A,ASAVE COPY A,QSTATR SAVE A REG COPY S,A GET STATUS EXCH QSTATR,A SAVE STATUS RBIT 8,S DISABLE INTERRUPTS COPY X,SAVEXR SAVE X JMP *CHARIN RETURN TO CALLER QSTATR RES 1 SAVEXR RES 1 ASAVE WORD 0 * ************************************* * * CHAROT - ROUTINE RESET STATUS * ************************************* SPACE 2 CHAROT ENT SIN 6 DISABLE FOR 6 WORDS EXCH QSTATR,A GET STATUS SHIFT A,RO,STSHFT-1 SHIFT INTERRUPT FLAG TO OV SHIFT A,RO,1 JF OV,$+2 WERE INTERRUPT ENABLED SBIT 8,S EXCH QSTATR,A COPY SAVEXR,X RESTORE X JMP *CHAROT RETURN TO CALLER * STSHFT EQU 9 SHIFT INTERRUPT STATUS+OV TYLACH RES 1,0 DTTYDA EQU :7C DIO DIOLP EQU :7F DIOTY EQU :F8 D100 EQU :100 D8610 EQU :8610 D8612 EQU :8612 LPOOL TITL 'OUTPUT CHARACTER' *********************************** * * OTT - OUTPUT A CHARACTER TO TTY. ENTER WITH * ASCII CHARACTER IN THE A REGISTER. * * 0 = TTY 1 = LP -1 = LP & TTY IN LPFLG * ************************************ SPACE 2 OTT ENT JST CHARIN DISABLE INTS & SAVE COPY LPFLG,A  JEQ A,OTT6 OUTPUT TO LINE PRINTER? COPY *OTTA,A YES GET CHAR COPY A,Q SAVE A OUT A,DIOLP%1 TELL PICO COPY =D8610,A START DONT INTERRUPT OUT A,DIOLP%1;1 TELL PICO OUT A,DIOLP%1;1 COPY =D100,X RESET INSTRUCTION IN DIOLP%1;1,A GET STATUS FROM LP SHIFT A,RO,1 BUSY BIT TO OV JT OV,$-2 IF BUSY WAIT FOR IT OUT X,DIOLP%1;1 RESET LP PICO SHIFT X,RO,1 WASTE SOME TIME JNE X,$-1 COPY Q,A RESTORE A * OTT6 COPY LPFLG,A OUTPUT TO TTY? JGT A,$+3  COPY *OTTA,A YES, GET CHAR JMP $+3 JMP *OTT1 OTT1 WORD OTT10 COPY =DIOTY,Q GET DIO ADDRESS & CHANNEL COPY A,AREG SAVE VALUE TO BE PRINTED COPY =D8612,X START, REQUST TO SEND, NO INTERRUPT XNX Q OUT X,1 INITIALIZE XNX Q OUT A,0 SEND A CHARACTER COPY =D105 0,X RESET CODE XNX Q IN 1,A INPUT TTY STATUS WORD SHIFT A,RO,5 SHIFT TRANSMITTER BIT IN OV JT OV,$-3 LOOP TILL CHARACTER IS TRANSMITTED XNX Q IN 1,A INPUT STATUS AGAIN SHIFT A,RO,5 JF OV,$-3 LOOP TILL TTY/CRT IS READY TO RECEIVER XNX Q OUT X,1 RESET PICO  COPY AREG,A RESTORE A * OTT10 JST CHAROT RESTORE & ENABLE INTS * JMP *OTT * * OTTA WORD ASAVE ADR REG A SAVE LOC * * LPFLG WORD 0 LINE PRINTER SWITCH AREG WORD 0 LPOOL TITL 'INPUT CHARACTER - IKB' ************************************** * * IKB - GETS ONE CHARACTER FROM TTY * * JST IKB * A-REG - CONTAIN CHARACTER *  X-REG - UNCHANGED * * INTERRUPT DISABLED FOR ENTER OPERATION * ************************************** SPACE 2 IKB ENT JST CHARIN DISABLE INTERRUPT COPY =:8618,A START , ECHO NO INTERRUPT OUT A,DTTYDA%1;1  COPY =:100,X IN DTTYDA%1;1,A SHIFT A,RO,4 DATA READY JF OV,$-2 IN DTTYDA%1,A  OUT X,DTTYDA%1;1 AND =:7F,A JST CHAROT RESTORE ENTERN JMP *IKB LPOOL DIAGEND EQU $ END ECCL INTERRUPT DISABLED FOR ENTER OPERATION * ************************************** SPACE 2 IKB ENT JST CHARIN DISABLE INTERRUPT COPY =:8618,A START , ECHO NO INTERRUPT OUT A,DTTYDA%1;1  COPY =:100,X IN DTTYDA%1;1,A SHIFT A,RO,4 DATA READY JF OV,$-2 IN DTTYDA%1,A  OUT X,DTTYDA%1;1 AND =:7F,A JST CHAROT RESTORE ENTERN JMP *IKB LPOOL DIAGEND  TITL NM-4 MEM64K - NUCLEUS 84-93078-21A0 NAM COUNT1 NAM COUNT2 NAM PUPCT NAM  PDNCT NAM PFERRS NAM MEMEND NAM DEFAULT * * MOVE ROUTINE * * MOVES MEM64K FROM ANY START LOCATION TO START LOCATION 0 * ABS 0 NOP FILLER NOP COPY P,X COPY P TO X (:XXXQ+)  SUB =3,X SOURCE START ADDRESS COPY =0,Y START-OF-DESTINATION ADDRESS SBIT 6,S  SET XA BIT WORD :C287 COPY $+9,Q -- PROGRAM LENGTH SELP Y,4 0 TO CONSOLE HLT * WORD :8285 COPY $+6,A -- MOVE ROUTINE ADDR. ADD X,A ADD DISPLACEMENT OF MEM64K IN MEMORY WORD :8681 COPY A,$+2 WORD :9F80 JMP *$+1 -- JUMP TO MANUAL MOVE ROUTINE RES 1,0 LENGTH RES 1 ADDR. OF END OF MEM64K (PATEND) MOVADR RES 1 ADDR. OF MOVE ROUTINE (MOVE) TITL * * WORD AND TEMP. LOCATIONS USED BY MEM64K * ABS :10 TEMP01 RES 1,0 TEMP02 RES 1,0 TEMP RES 1,0 P55AA WORD :55AA NAA55 WORD :AA55 PTFFFF WORD :FFFF PTF0F0 WORD :F0F0 PT00FF WORD :00FF PT0000 WORD 0 PT7FFF WORD :7FFF PT5555 WORD :5555 PT6666 WORD :6666 PTAAAA WORD :AAAA PTFFFE WORD :FFFE PT8000 WORD :8000 PTAA00 WORD :AA00 PT55AA EQU P55AA PTAA55 EQU NAA55 * * I/O TEST MODULE INTERRUPT VECTOR (:20) * ABS  :20 WORD 0 WORD 0 WORD 0 WORD 0 TITL * * EQUATES USED BY MEM64K * STATUS EQU :150 STACKP EQU :0100 DATSAV EQU DTEMP M6 EMEND EQU :3800 * * (PSW)--STATUS REGISTER EQUATES CY EQU 0 CARRY BIT OV EQU 1 OVERFLOW BIT BY EQU 2 BYTE MODE BIT BM EQU BY ALTERNATE NAME CI EQU 4 CONSOLE INTERRUPT ENABLE BIT RI EQU 5 REAL-TIME CLOCK INTERRUPT ENABLE BIT XA EQU 6 EXTENDED ADDRESSING BIT INT EQU 8 INTERRUPTS ENABLE BIT UM EQU 10 USER MODE BIT UP EQU 11 USER PROTECT BIT TITL * * OTHER WORD AND TEMP LOCATIONS * COUNT1 RES 1,0 PASS COUNTER COUNT2 RES 1,0 PASS COUNTER STATSV WORD :0150 JMP1 WORD :9F80 JMP *$+1 RELATIVE JST1 WORD :BF80 JST *$+1 RELATIVE HLT1 HLT HLT INSTRUCTION * * STARTP WORD START1 TITL * * I/O TEST MODULE ECHO INTERRUPT VECTOR (:40) * ABS :40 JST *$+1 WORD 0 * * ROUTINE TO INDICATE UNEXPECTED TRAP ON CONSOLE DATA REGISTER * LIGHT1 ENT IN 4,A GET CONSOLE DATA REGISTER AND =:FF,A PRESERVE THE TEST NUMBER OR PTAA00,A SET UPPER BYTE TO FLAG UNEXPECTED TRAP SELP A,4 OUTPUT TO CONSOLE DISPLAY JMP *LIGHT1 * * SYSTEM/USER TRAP ROUTINE * SUTRAP JST LIGHT1 HLT JMP *STARTP * * STACK EXCEPTION TRAP ROUTINE * USET1 EQU $ JST LIGHT1 ERROR: UNEXPECTED,USER,STACK,EXCEPTION JMP *STARTP TITL * * I/O TEST MODULE REAL-TIME CLOCK INTERRUPT VECTOR (:60) * ABS :60  IMS $+1 WORD 0 * * I/O TEST MODULE DMA COMPLETE INTERRUPT VECTOR (:62) * JST *$+1 WORD 0 DTEMP RES 1,0 TEMPORARY DATA REGISTER STORAGE * * POWER UP TRAP VECTOR * ABS :80 POWUP JMP *$+1 PUPPTR WORD 0 * * UNIMPLEMENTED INSTRUCTION TRAP VECTOR (:84) * ABS :84 LOC84 RES 2,0 INTERRUPT LOC + 1 LOC85 EQU $-1 INTERRUPT INSTRUCTION JMP *$+1 UNIMPT WORD 0 * * MEMORY EXCEPTION TRAP VECTOR (:88) * UNMEM0 RES 2,0 P+1 UNMEM1 EQU $-1 I JST *$+1 WORD 0 UNMEM3 EQU $-1 * * POWER FAIL TRAP VECTOR (:8C) * PWNVEC RES 2,0 P+1  JST *$+1 WORD 0 PDNPTR EQU $-1 * * RES 1,:0E0D TITL * * REAL TIME CLOCK INTERRUPT CELLS (:91) * ABS :91 RTCTIM WORD 0 RTC TIMING CELL * JST *$+1 RTC TIMING CELL OVERFLOW VECTOR RTCPTR WORD 0 * * CONSOLE INTERRUPT VECTOR (:94) * JST *$+1 WORD 0 * * DIVIDE/FLOATING POINT TRAP ROUTINE * (ARITHMETIC EXCEPTION TRAP ROUTINE) * AET1 EQU $ JST LIGHT1 ERROR: UNEXPECTED,ARITHMETIC,EXCEPTION JMP START1 * * STACK EXCEPTION TRAP VECTOR (:9C) * ABS :9C RES 2,0 JMP *$+1 WORD USET1 TITL * USER TRAP VECTOR (:A0) * ABS :A0 UTRAP1 RES 2,0 UTRAP2 EQU $-1 UTRAP3 JST *$+1 UTRAP4 WORD SUTRAP * * SYSTEM TRAP VECTOR (:A4) * STRAP1 RES 2,0 STRAP2 EQU $-1 STRAP3 JST *$+1 STRAP4 WORD SUTRAP * * DIVIDE FAULT/FLOATING POINT EXPONENT OVERFLOW TRAP VECTOR (:A8) * (ARITHMETIC EXCEPTION TRAP VECTOR) * ABS :A8 ARERR EQU $ ARERR0 RES 2,0 JMP *$+1 WORD AET1 * START1 EQU $ SBIT 8,S JMP *STARTPTR * STARTPTR WORD :FF POINTER TO START OF PROGRAM PUPCT WORD 0 POWER-UP COUNT PDNCT WORD 0 POWER-DOWN COUNT PFERRS WORD 0 POWER UP/DOWN MISCOMPARE COUNTER PWRVEC WORD POWUP PWRVC2 WORD PWNVEC POINTER TO PROGRAM RETURN POINTER DEMAND RES 1,0  MODE SEL WORD 1 DMAND2 RES 1,0 MODE SEL WORD 2 MEMFLAG RES 1,0 PARTIAL-MEMORY TESTING FLAG DEFA7 ULT WORD :E DEFAULT TEST SELECTION SAVE END AET1 * START1 EQU $ SBIT 8,S JMP *STARTPTR * STARTPTR WORD :FF POINTER TO START OF PROGRAM PUPCT WORD 0 POWER-UP COUNT PDNCT WORD 0 POWER-DOWN COUNT PFERRS WORD 0 POWE TITL MEM64K DIAGNOSTIC MACROS (MEM64K.MAC) TITL MACRO TABLE OF CONTENTS *  PAGE * **** ERROR: --ERROR INDICATION TO USER...........2 * **** PATCHX --LOOP PATCHING MACRO (SHORT FORM)...2 * **** TRLD: --LOAD AND TEST REGISTERS...........3 * **** GLPOL: --GENERATE LPOOL MACRO..............4 * **** CKSTD: --TEST REGS FOR STANDARD VALUES.....5 * **** LDSTD: --LOAD REGS WITH STANDARD VALUES....5 * **** LDREG: --LOAD REGISTERS....................6 * **** LODREG --LOAD SINGLE REGISTER..............7 * TITL TEST MACRO DEFINITIONS * BREAK EQU 1 ****** * E R R O R M A C R O * * THIS MACRO IS USED TO INDICATE AN ERROR ****** XMACRO ERROR: HLT #(1) #(2) #(3) #(4) #(5) #(6) #(7) #(8) #(9) #(10) #(11) #(12) ENDM SPACE 10 ****** * * P A T C H X M A C R O * ****** XMACRO PATCHX  JMP #(1) PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP IMS PCOUNT ENDM TITL ****** * T E S T L O A D R E G M A C R O * * THIS MACRO COPIES THE REGISTER SPECIFIED * BY PARAMETER #(1) TO THE REGISTER SPECIFIED * BY PARAMETER #(3). IT THEN CHECKS THAT * THE VALUE MOVED TO THE REGISTER SPECIFIED * BY PARAMETER #(3) CONTAINS THE EXPECTED * VALUE BY MOVING THAT VALUE TO EITHER A OR Q * THEN COMPARING IT TO THE VALUE SPECIFIED * BY PARAMETER #(4) (MUST BE LABEL-CANNOT BE * A VALUE). * * A SAMPLE CALL FORMAT FOLLOWS: * * TRLD: REG,A OR Q,REG,LABEL NAME OF VALUE * * PARAMETER #(2) MUST BE EITHER A OR Q * PARAMETERS #(1) AND #(3) CAN BE ANY * REGISTER. VALUE MUST BE A BINARY * NUMBER (0-:FFFF) ****** XMACRO TRLD: SPACE BREAK * TRLD: #(1),#(2),#(3),#(4) COPY #(1),#(3) COPY #(3),#(2) CSK #(2),#(4) TEST THAT #(3) = EXPECTED VALUE NOP ERROR: COPY,-#(1)-,TO,-#(3)-,FAILED COPY =0,#(2) CLEAR -#(2)- ENDM TITL ****** * G E N E R A T E L P O O L M A C R O * * THIS MACRO EXECUTES A JUMP AROUND AN LPOOL. * * SAMPLE CALL: * * GLPOL: ****** XMACRO GLPOL: LP::L SET $ SET UP LABEL TO REPLACE NOP WITH JMP INST. NOP RESERVE SPACE FOR JMP INSTRUCTION LPOOL LP::L1 SET $ SET UP LABEL AT END OF LPOOL ORG LP::L GO BACK TO OVERLAY NOP WITH JMP INST. JMP LP::L1 JUMP TO LABEL AT END OF LPOOL ORG LP::L1 CONTINUE AT END OF LPOOL ENDM TITL ****** * CKSTD: -- CHECK REGISTERS FOR STANDARD VALUES ****** * THIS MACRO TESTS 'A', 'Q', 'X', 'Y', 'K', AND 'L' WITH * :FFFF, :F0F0, 00FF, :5555, :6666 AND 0 RESPECTIVELY. * ****** XMACRO CKSTD: TREGS: A,:FFFF,Q,:F0F0,X,:00FF,Y,:5555  TREGS: K,:6666,L,0 ENDM SPACE 10 ****** * LDSTD: -- LOAD REGISTERS WITH STANDARD VALUES * * THIS MACRO LOADS 'A', 'Q', 'X', 'Y', 'K', AND 'L' BY * :FFFF, :F0F0, :00FF, :5555, :6666, AND 0 RESPECTIVELY. * ****** XMACRO LDSTD: 8  LDREG: A,:FFFF,Q,:F0F0,X,:00FF,Y,:5555,K,:6666,L,0 ENDM TITL ****** * L O A D R E G I S T E R M A C R O * *  THIS MACRO IS USED TO SET VALUES INTO * ANY OF 7 REGISTERS. THE MACRO WILL * LOAD THE REGISTER SPECIFIED BY PARAMETER #(1) * WITH THE VALUE SPECIFIED BY PARAMETER #(2) * REGISTER (PARAMETER #(3)) LOADED WITH VALUE * (PARAMETER #(4)) AND SO ON. SEVEN OF THE * EIGHT REGISTERS MAY BE LOADED. THE P REG * IS NOT ALLOWED TO BE LOADED. * * A SAMPLE CALL FOLLOWS: * * LDREG: A,AVAL,X,XVAL,Y,YVAL,Q,QVAL,ETC * * IF THE -A- REGISTER IS USED IN THE CALL IT * MUST BE THE FIRST PARAMETER, THERE IS NOT * ANY RESTRICTIONS ON THE OTHER REGISTERS * ****** LDREG: XMACRO IFT #?>=2 IFF #(1)=A LODREG #(1),#(2) ENDC ENDC IFT #?>=4 LODREG #(3),#(4) ENDC  IFT #?>=6 LODREG #(5),#(6) ENDC IFT #?>=8 LODREG #(7),#(8) ENDC IFT #?>=10  LODREG #(9),#(10) ENDC IFT #?>=12 LODREG #(11),#(12) ENDC IFT #?>=14 LODREG #(13),#(14) ENDC IFT #(1)=A COPY =#(2),A ENDC IFT #?>=10 ENDC ENDM LODREG  XMACRO IFF #(1)=S IFF #(1)=K IFF #(1)=L COPY =#(2),#(1) ENDC ENDC ENDC IFF #(1)=Q  IFF #(1)=X IFF #(1)=Y COPY =#(2),A COPY A,#(1) ENDC ENDC ENDC ENDM TITL ****** * T E S T R E G I S T E R S M A C R O * * THE PURPOSE FOR THIS MACRO IS TO ALLOW * THE ABILITY TO TEST SPECIFIED REGISTERS * FOR SPECIFIED VALUES. UP TO 4 REGISTERS * MAY BE SPECIFIED, ALONG WITH THE VALUES THE * REGISTERS ARE EXPECTED TO CONTAIN, IN ANY * ONE MACRO CALL. IF THE REGISTER DOES NOT * CONTAIN THE EXPECTED VALUE, THE ERROR * MACRO WILL BE INVOKED. ALL REGISTERS WILL * REMAIN UNCHANGED. * * A SAMPLE FORMAT OF A MACRO CALL FOLLOWS: * * TREGS: REG,VALUE,REG,VALUE,(ETC UP TO 4) * * WHERE: REG=REGISTER DESIGNATION * (A,Q,X,Y,P,L,S,K) * VALUE= LITERAL VALUE (0-:FFFF) ****** XMACRO TREGS: COPY A,ATEMP SAVE A DURING THE NEXT REGISTER TESTS. IFT #?>=2  TSTREG #(1),#(2) ENDC IFT #?>=4 TSTREG #(3),#(4) ENDC IFT #?>=6 TSTREG #(5),#(6) ENDC IFT #?>=8 TSTREG #(7),#(8) ENDC COPY ATEMP,A RESTORE A REGISTER TO ORIGINAL VALUE. GLPOL: ENDM TSTREG XMACRO IFF #(1)=A COPY #(1),A ENDC CSK A,=#(2) NOP  ERROR: -#(1)-,SHOULD,BE,=#(2) ENDM FLAG1:: SET 1 SAVE END THE NEXT REGISTER TESTS. IFT #?>=2  TSTREG #(1),#(2) ENDC IFT #?>=4 TSTREG #(3),#(4) ENDC IFT #?>=6 TSTREG #(5),#(6) ENDC IFT #?>=8 TSTREG #(7),#(8) ENDC COPY ATEMP,A RESTORE A REGISTER TO ORIGINAL V TITLE 64K MEMORY DIAGNOSTIC MACRO FILE # 2 * * THIS MACRO FILE ALLOWS THE MEMORY DIAGNOSTIC TO ASSEMBLE AT * :0100 * FLAG:: SET 0 END 9 810924140200810924140200810924140200 TITLE 64K MEMORY DIAGNOSTIC MACRO FILE # 3 * * THIS MACRO FILE ALLOWS THE MEMORY DIAGNOSTIC TO ASSEMBLE AT * :3100 * FLAG:: SET 1 END 8109241402008109241402008109241402001PAGE 0001 MULTI-TASKING LINKER (F0) 1981/08/27 10:00:36 FILE USAGE SUMMARY DM1.MEM64K.BIN=DM1.MEM64K.OBJ(RELOCATABLE=2100,EXECUTION=100)+ DM1.MEM64K3.OBJ(UNCONDITIONAL)+ DM1.DEBUGS.OBJ BAD FILE NAME ABORT 810924140200810924140200810924140200OVicEdDano(K *ýie‡d ‚…"†Ÿ€ UªªUÿÿððÿÿUUffªªÿþ€ª PŸ€¿€ ¬@¿€ ÿ´Ÿz¾y *¾v *`Þ€¿€€Ÿ€„Ÿ€¿€¿€ ‘¿€¿€¾+ ž“œŸ€K ¿€H¿€H¨ Ÿ€–…Ÿ€ÿ€Œ›žžûg¾Ÿ ƒ‘Á¿ ‡ ‡‡Œ‡Œ¿Ž4Þ ‡ˆE…¿ˆŸˆ¢ ÍŸ¡  ¸Î )€‚Ç„)Œ‚Å„ƒ)”‚Ä)ˆ‚Á„ƒ)„‚¿„ƒŸoƒe¾l¿ºƒº‡ºß¹ƒ¹Æ< ¼€E…žw¿²ÿ6Ç ‡RƒRÆ ‡Ožg ‡K‡KƒK؃¤ 6A¾îß•ƒž6™ƒ>K¿š Â:Θ @„€‚–Ž” œ€žŸ£þÈC@P–—‚— ᪠]0EE…g¾"ƒÁ¿ ‡Ihÿ‚Ì †¶‚³†±‚³)$ ÷ß û]  ¦¤‚¢Š¢†¢ƒ¡†Ÿ‚ †ž‚œ‡œ‚›Š†š‚œ8†šAžgÿ‡’@fžžLǤ礞†¿£@fžžEÇç ‡Ÿ±¬ ƒ&»”žž†¿’„ƒ¿Ÿuƒ‹‡¿Š ˆŸož¸ ðš  o 64-K MEMORY DIAGNOSTIC - REV: A0 84-93074-XX MEMORY ADDRESS START (:0000)?:ÿÿ END (:FFFF)?:ÿÿ MEMORY TOO SMALLÿÿ START ADDRESS WITHIN INTERRUPT VECTORS :80-:95ÿÿ ENDING ADDRESS WITHIN INTERRUPT VECTORS :80-:95 ÿÿ RELOCATION ERROR - HALT ÿÿ TESTS (A,B,C,D,E)= ÿÿ CONTROL WORD (:00)?:ÿÿ PASS PASS **** PASS PASS **** « " N'ÿÿ_¼r Y  ÿÿ_¼r Y  ÿÿ ‚¢†’¢¡ƒ„€ÞŽ+;‚ˆ†Z‚‡†Y‚††c †ZŸnÿÿ¿Šø¿‰¦K¿Ež‹žïžxžwžvžu ò œD²¬¿y ¿x1H¦:¿3žŠžÝžwžežužt£Æ17)¦/žt‚,Â,Fžˆžž†‚)Ážf‚¹Ÿ¸¿³‚"AžÅ¿Xi †«¿1º¿ž¯ž¼žvžTžt ¿± Ÿ¤ ü-  ‚™ žh¦’‚Іƒ†‚ŽŠ†‹‚‰‡‰‚ˆŠ‰††ÿ‡„Þ†žZ²¬sE jªU}Ê¿!w¿ §‡¿‡žˆž‡žxž@žvžuª‚˜¿k¿¼ƒ¼ÿ6D‚º»¸Ÿ¹Ÿ¹Ÿ· üƒ©ÒLƒl6A¾²ƒh?6Å ‡©¾¬ ‡¦ƒ`/6Á ŸhAŸfƒ”/6F£’Ã’ã’ƒ’ Ÿ]¶• @` –ŸR ¥¦¨©§ éž 4C¦pÿ ‡¾‰£¥¤¦§¨©…Ÿt ¿¸k£{Þz€€¿´¿±o£tÞs€€¿¬¿ªs£mÞl€€¿§¿£v£fÞe€€¿¡ƒH/6Ä‚_ †]Ÿ\¿•z£XÞW€€¿“¿Ž~£QÞP€€¿Œ¿‡£JÞI€€¿…ŸF  4 o Ó ‰ ƒ$ÄCƒŽO6AŸx¾Œ¿q„‚…¿n¿l‘Ÿnª ƒçƒÃQAšÆI£ âà fž 6BKž|C ‚£ºâº fž‚ †bŸd 6BKž|C ‚É£¬â­ kž‚ †TŸVI£¢â  fž 6BKž|C ‚¯£—â— fž‚ †?ŸA 6BKž|C ‚¶£‰âŠ kž‚ †1Ÿ3ÿÿ€¦À@0K=/J<.I;-H:,G9+M?: 1L>"! # *PASS ERROR TEST ADDR : EXPT : ACT : ECC : *** SUSPECTED ERROR IC- / INTERFACE LOGIC *** *** TECH TEST *** ÿÿ PATTERN (:0000):? ÿÿ **** CONSOLE INTERRUPT **** ÿÿ T‡á ‡Ûÿ‡Ú¿Úœ¿Øø¿Ø§Ó¿×ž…ž§žxžwžvžu¿Í ¿Í1H§È¿ËžŠž›žpžkžnžm£Å17)§½žtƒºÃºFž‚ž_ž€¾ý¿µ¬¿µ¦¯¿´ž…ž„žxžXžvžuƒ©ÿ6Dƒ¬»¥ž¾”ƒ©Á¿¨£¨ƒ¨ P‚™„€À€Kž–Ÿ+ [žs¿šÿ6à ‡‘žf ‡Žžc¶‘žož ò¤ œ‚˜ j ŸP›œÿ ဠÿ´Ÿz¾y * '¶§§¦ ‡¥¿¥iˆ€@ `£žœ@ )ˆ‚„ƒŸ{ ')ˆ€€  œ€ ' `§ƒŠà ‡Š¿Š)ˆã†€€ %œ€ ¦¥NW )ˆ‚Ƀ†Å‚Ç ÿ¶Æ  IÄ€ªÂ1½ž ÿ†´Ã#@žžªƒ†¯ƒÿ6PI•Kž‚žŒž‚ €ɃUAŸ©¿% ‡ ¿¥Ÿ¥ƒ ÿ6PI•Kž‚žŒž‚ €ɃBAŸ–¿?ÿ‡•¿’Ÿ”¿Ÿ>ƒ7AŸ‹¿…ŸŒ‚ òƒ8ÿö#Îžß ' ƒ Þ¿o¸ƒ¤»¤žž†¿¢Žƒ¿Ÿž…ƒ›‡™¿š ‘ƒ™ÁŸ˜¿˜ ”Ζ @„€‚‘Ž’†‰ŸˆƒŒÁŸŽ¿‹‚ŒŽŠ†Ÿ€£š  oŸ ]0} ƿ¦¿æ¿p†¾P†½0†¼Á O†¹‡¸ß¸ bß´¢©Â§â¨‚¨p‚§P‚§σ¥ƒ¦›£ÈP‚š0‚’Ÿßσ›Á ƒ’‡“…‚†Ÿ”‚Š0‚‚Ÿ€?d°€³¯€Œ±µ€® ƒÛÿ6D‚ջמž‚ƒÔž‚χ҃҇ҟq ƒÊÿ6C)ˆ‚Ì„ƒ A‡Ä ‚Ç„€ºÄ¾™¢Â‚„€€ºº¾eƒ§º·¾—‚²„€€º±¾‘gžY†r¿­ŸV ‡«)§ª‚¤‡© ‡¨ ‡§¿§£¢Ÿs ‡ž¢Š§‚™‡œ€‡› ‡š¿š£•Ÿs€ iˆ€@ `œ@ »¤›¼œ¤ €ff#¨¦§©¥N B‡m ‚ɎɇÀƒÀAž¥ÃcϻǼ˹ǻƒ¹¶ÿ6DÂYKžŒ†çîJÿB†ä¿°£«¼€Âßžj­ǥˢǤKÆ×ËžÆÖ¿¢£¼€ŸP‚¡†ûŠù†úŠ÷Â8Kž‚™†óŽð†ðŽî†ÁÂìJÿB†¾¿Š¢è¼€Ÿ8hŸij<= \ ÿ‚Ø †¨ŠÓ†§¿s¢Ñ¼€‚¢žQ ¢ÂKP@¤€+-€ž)– [žxžw¢À€@+žž‚¿€\+-€ž)– [žržqž‚¢~Â|JÿP@¤€*ÿ-•ž) [žxžw¢qÀ€@+žž‚¿€\*ÿ-•ž) [žržqŸ@ Þ~ÇŒ§Œ§Œ ‡‹ ‡Š¿Š£†Ÿt¨§¦¥©N C‡Í ƒ E‚ÉP)¦tž…ƒÅ P¢Á¦n ‡² ‡±¢iIǯîC ¢˪˨ʪǪHøǩçǨHøÇ§HàǦæĀ+¾õß¡ž{ßÞüžuÞùžoÞö [žžÂñMž]žZŸC 2 ˆ ¤ »¢*IÆÒÂÑC ÂcÊÍÊËÊkÆÏHøÆÊÂÌÆÌHøÆÇHàÆÆÃÇp@À€@{¾¡+¾²Þ½žxÞ½Þ¹žqÞ¶žkÞ³ [žž…®MžYžV¨QÄIÆ¥žž ÷ QÃI Æžžýžýž¤ p‡‰Ç‰§‰ ‡ˆ ‡‡¿‡£ƒŸt§¨¦¥©N -€Ÿ}Ÿ|+ Þ…Ÿy ež †t †s£îIÆqÂpC ÂáÊlÊjÊçÆnHøÆiÂkÆkHøÆfHàÆeÃfÄ€+¾UÞ`ž{Þ`Þ\žuÞYžoÞV [žž…ÂQMž]žZ£ÇIÆJÂIC ºÊEÊCÊÁÆGHøÆBÂDÆDHøÆ?HàÆ>Ã?X€€†=p@Ä€€€@‚8„€@{¾+¾#Þ.žrÞ.Þ*žjÞ'ždÞ$ [žž…ÂMžRžOÂQÄIÆž!ž†ÂQÃI ÆžžŒžŒSžŒq r 2 †ß †Þ£wIÆÜÂÛ@I6ÁIÊÕÊÓʾÆÕHàÆÒÂÒÆÒÃÑÄ€+¾¿ÞÍÞÊžwÞÇ [žižh£\IÆÁÂÀ@I6ÁIʺʸʣƺHàÆ·Â·Æ·Ã¶p@À€@{¿š+¾ Þ®Þ«žsÞ¨ [žežd¢QÃIÆŸž@ž=Þ›QÃIƘž8ž7äž5äžý ² ÿ -€Ÿ}Ÿ|+ ‚‰ †‡ÞƒŸvMŸÓ †v †u£IÆsÂr@I6ÁIÊlÊjÊÅÆlHàÆiÂiÆiÃhÄ€+¾VÞdÞažwÞ^ [žižh£µIÆXÂW@I6ÁIÊQÊOÊ:ÆQHàÆNÂNÆNÃMXp@€€†JÄ€€€@‚F„€@{¿*+¾0Þ>Þ;žlÞ8 [ž^ž]Â2QÃIÆ/ž9ž6 NÂ+QÃIÆ(ž1ž0 Tž. TDž," Òq )ˆ‚„ƒ D‡» 㹃¹ P UIª%„@ÄA'km€ž‚ži–`[žužt' ã¥%IUp@À@@{žž… `'¿œ` %Iªp@ÀA@{žž„' `¿` km€ž‚ži–`[žbža'žB —e¿†Ÿ?¤›œÿ^# ‚Ü‡Ü E‡u )ˆ€ƒ‡Ö £oÃoKÆÍ¾„)ˆƒÎ„ƒŸl i €+ž‚ž)–@ )ˆ‚¸„ƒ @c ¸Āp@À€@{ž¾@ )ˆ‚¬„ƒ @p­žÂ¯Ä€‚©p„€ À€@{žÇpÂIžHþÄ€‚™p„€ À€@{ž·qBižF+‚Š žAž@Ÿ>C #  Nÿÿ{€ ¡?½ÿ ¿že pAž¡ž° ‚’ÇÆ‘ †ŽpAž™ž¨úŠžŸ° †„pAžžœ @ )ˆ‚Q„ƒ @pPHÿN6åÄ€‚Lp„€ €€{žs¾RIN6UÄ€‚<p„€ €€{žs¾B µ ‚§@pQAžŒž¬æ£@ )ˆ‚!„ƒ @pbÿi†–` û“`žHÿÄ€c ÂŽ‚Ä€ kÀ€‚„@{žiž¸ ‚‚·L¸ Ei†u` ûÃÂr`@ž^IÄ€c ÂŒ‚ÉÄ€ kÀ€‚c@{žiž—ð‡ð >/{7 ÂQÇ; †IÇ´@pQAžAža»°žž„@pQAž1žQÂGpAÚ¦¾“ž1p¾ž. 指ŸÇŸ§Ÿ ‡ž ‡¿¿£˜âŸr æ} ‡‡Ç‘@§ ‡Œ¿¿£ˆâqŸq€ ! "ÿÿ§¨¦¥©ÖN ƒçÿ6D‚ܻ㞞‰ƒáÿ6D‚ջݞž‹ýŸoƒÐBüŸkƒÔ‡ÌƒÑ‡Òž‘ƒÇAžÖƒÌ‡ÄƒÉÿ6D‚¾»Åžžƒ‚ŇÞ‚ƒ¿‡À¿¸)â³P`€€„@+k [žzžy)â©€€pÀ@@{žü+k [žvžu¾×0¿¡ž€‚8ŠŸ†6ü‡)”ŸʙÄ)ˆÂœÊ•ă)„™ʑă)€Â–ÊÄ)ŒÂ“ʉăŸ Ÿ›R › |#0žœÿÈC@þ¾ˆý…‚Žn†Ÿ ¿f¢bi‚™P€€„@+k [žzžy¢Wi€€pÀ@@{ž©+k [žvžu¾„пNŸb@ ƒ~†ÄÞ|¢CâBêÀ‚ÀP€€„@+k [žzžy¢7â6ê´€€pÀ@@{ž†+k [žvžuŸaƒ©Až—ƒ$O¾<  Î% @„€¿ŸZçž¾” ‚œŽ œ€¿–Z畾‹ Ÿ“ÿ¶‘p `i ŸŒ ‡Š¿ŠŸ{«  ò¦¥É¥N ¿Ø¢ØâØ‚ØP€€„@+k`[žzžy¢ÍâÍ€€pÀ@@{ž9+k`[žvžu¿ÃŸd ¿¼¢Àâ¿ê»‚¾P€€Áе„@+k [žw¢²â±ê­€€ÁŠ©pÀ@pKž+k [žs¿¡Ÿ^ ¿š¢ ã ‚ P€€„@+k [žzžy¢•ã•€€pÀ@@{Ÿ‘+k [žvžu¿…ŸdR0 #¬²i\ ›ªªUUUUªªUUªªªªUUUUªªªªUUªªUUUUªªUUªªªªUUªªUUUUªªªªUUUUªªUUªªªªUUªªªªUUUUUUUUªªªªUUUUªªªªªªªªUUUUUUUUªªªªªªªªUUUUªªªªUUUUUUUUªªªª  ªªUUUUªªUUªªªªUUUUªªªªUUªªUUUUªªªªªªªªªªUUUUUUUUUUUUUUUUªªªªªªªª   †¦Ž£|.Þz%€€' ÿžƒ¿‡+žx¢‚‚‚Ÿo Ó ƒ~†ŒÞ{£zÞy.%€€'¿s+Þ‚žyŸp ††¦† ¿i ¿g¾gŸu ‚Å Ÿ|Þ{ #ŸyÞx _ŸvÞu ^ŸsÞr ,ŸpÞoŸn †Ì‚–†þ†‚Ç)/‹+=‹ˆ†Á ¿BÞ„Þ‚žtŸm  i ‚ I †—†˜¿š†•Ž–ÌŽ•JÞ‘‚ŽŠŒŠ‹ŽŒÅ†‡žp‚†¢„Ÿi ?¾ìžg0  †‘‚¨†‘ü†Ž‚Œ)/Œ+=‹‰†† ¾ÕÞ…ÞƒžtŸm …@èd  )†y9 öB :ž A¾¿‚„1*ÿ1³Ÿp … †I†J¾å†GŽHÑŽ•ÍŽ“ ÌŽJІ<‚:1¶9†7Þ8žmІžw‚3¢1Ÿd  _†ˆ†…0’ƒ‡¦‚Ÿw Ç  _’zy 6Á…’u¢uŸvA ¾g‚«Nƒ¨@þ‚©ÿÿ¢¥ÿ 6="ÿ. 1¾@‚›Bƒ˜ž‚Ÿ€ þIø†•¢—C "C ¢C I6=2¸2Î )€‚Ç„)Œ‚Å„ƒ)”‚Ä)ˆ‚Á„ƒ)„‚¿„ƒŸoƒe¾l¿ºƒº‡ºß¹ƒ¹Æ< ¼€E…žw¿²ÿ6Ç ‡RƒRÆ ‡Ožg ‡K‡KƒK؃¤ 6A¾îß•ƒž6™ƒ>K¿š Â:Θ @„€‚–Ž” œ€žŸ2£65þ5È5C5@6P2–2—²—:á2ª;]013EE…g¾"ƒÁ¿ ‡Ihÿ‚Ì †¶‚³†±‚³)$ ÷ß û]  ¦¤‚¢Š¢†¢ƒ¡†Ÿ‚ †ž‚œ‡œ‚›Š†š‚œ8†šAžgÿ‡’@fžžLǤ礞†¿£@fžžEÇç ‡Ÿ2±2¬ ƒ&»”žž†¿’2„ƒ¿Ÿuƒ‹‡¿Š 2ˆŸo22ž2¸2 2ð2š==o 64-K MEMORY DIAGNOSTIC - REV: A0 84-93074-XX MEMORY ADDRESS START (:0000)?:ÿÿ END (:FFFF)?:ÿÿ MEMORY TOO SMALLÿÿ START ADDRESS WITHIN INTERRUPT VECTORS :80-:95ÿÿ ENDING ADDRESS WITHIN INTERRUPT VECTORS :80-:95 ÿÿ RELOCATION ERROR - HALT ÿÿ TESTS (A,B,C,D,E)= ÿÿ CONTROL WORD (:00)?:ÿÿ PASS PASS **** PASS PASS **** 2«="=N'ÿÿ6_6¼7r9Y9 ÿÿ6_6¼7r9Y9 ÿÿ ‚¢†’¢¡ƒ„€ÞŽ+;‚ˆ†Z‚‡†Y‚††c †ZŸnÿÿ¿Š1ø¿‰¦K¿Ež‹žïžxžwžvžu<ò=œ3D2²2¬¿y2 ¿x1H¦:¿3žŠžÝžwžežužt£Æ17)¦/žt‚,Â,Fžˆžž†‚)Ážf‚¹Ÿ¸¿³‚"AžÅ¿X2i †«¿1º¿ž¯ž¼žvžTžt ¿± Ÿ¤ ü-  ‚™ žh¦’‚Іƒ†‚ŽŠ†‹‚‰‡‰‚ˆŠ‰††ÿ‡„Þ†žZ2²2¬5s3E=jªU1}4Ê¿!2w¿ §‡¿‡žˆž‡žxž@žvžu2ª²˜¿k¿¼ƒ¼ÿ6D‚º»¸Ÿ¹Ÿ¹Ÿ· üƒ©ÒLƒl6A¾²ƒh?6Å ‡©¾¬ ‡¦ƒ`/6Á ŸhAŸfƒ”/6F£’Ã’ã’ƒ’ Ÿ]¶• @` –ŸR2 2¥2¦2¨2©2§;é2ž 141C>¦pÿ ‡¾‰2£2¥2¤2¦2§2¨2©…Ÿt ¿¸4k£{Þz€€¿´¿±4o£tÞs€€¿¬¿ª4s£mÞl€€¿§¿£4v£fÞe€€¿¡ƒH/6Ä‚_ †]Ÿ\¿•4z£XÞW€€¿“¿Ž4~£QÞP€€¿Œ¿‡4£JÞI€€¿…ŸF==4=o=Ó=‰ ƒ$ÄCƒŽO6AŸx¾Œ¿q4„‚…¿n¿l4‘Ÿn2ª ƒçƒÃQAšÆI£ âà fž 6BKž|C ‚£ºâº fž‚<  †bŸd 6BKž|C ‚É£¬â­ kž‚ †TŸVI£¢â  fž 6BKž|C ‚¯£—â— fž‚ †?ŸA 6BKž|C ‚¶£‰âŠ kž‚ †1Ÿ3ÿÿ€2¦À@0K=/J<.I;-H:,G9+M?1L>"! # *PASS ERROR TEST ADDR : EXPT : ACT : ECC : *** SUSPECTED ERROR IC- / INTERFACE LOGIC *** *** TECH TEST *** ÿÿ PATTERN (:0000):? ÿÿ **** CONSOLE INTERRUPT **** ÿÿ T‡á ‡Ûÿ‡Ú¿Ú4œ¿Ø1ø¿Ø§Ó¿×ž…ž§žxžwžvžu¿Í2 ¿Í1H§È¿ËžŠž›žpžkžnžm£Å17)§½žtƒºÃºFž‚ž_ž€¾ý¿µ4¬¿µ¦¯¿´ž…ž„žxžXžvžuƒ©ÿ6Dƒ¬»¥ž¾”ƒ©Á¿¨£¨ƒ¨ P‚™„€À€Kž–Ÿ+ [žs¿šÿ6à ‡‘žf ‡Žžc¶‘žo22ž<ò2¤=œ²˜=j 2Ÿ6P2›2œÿ:ဠÿ´Ÿz¾y * '¶§§¦ ‡¥¿¥iˆ€@ `£žœ@ )ˆ‚„ƒŸ{ ')ˆ€€  œ€ ' `§ƒŠà ‡Š¿Š)ˆã†€€ %œ€2 2¦2¥3N5W )ˆ‚Ƀ†Å‚Ç ÿ¶Æ  IÄ€ªÂ1½ž ÿ†´Ã#@žžªƒ†¯ƒÿ6PI•Kž‚žŒž‚ €ɃUAŸ©¿2% ‡ ¿¥Ÿ¥ƒ ÿ6PI•Kž‚žŒž‚ €ɃBAŸ–¿2?ÿ‡•¿’Ÿ”¿Ÿ>ƒ7AŸ‹¿…2ŸŒ‚<ò5ƒ8ÿ2ö1#2Î2ž2ß ' ƒ Þ¿o4¸ƒ¤»¤žž†¿¢2Žƒ¿Ÿž…ƒ›‡™¿š 2‘ƒ™ÁŸ˜¿˜ ”Ζ @„€‚‘Ž’†‰ŸˆƒŒÁŸŽ¿‹‚ŒŽŠ†Ÿ€2£2š==o2Ÿ1 ;]01} ƿ¦¿æ¿p†¾P†½0†¼Á O†¹‡¸ß¸ bß´¢©Â§â¨‚¨p‚§P‚§σ¥ƒ¦›£ÈP‚š0‚’Ÿßσ›Á ƒ’‡“…‚†Ÿ”‚Š0‚‚Ÿ€?d°€³¯€Œ±µ€® ƒÛÿ6D‚ջמž‚ƒÔž‚χ҃҇ҟq ƒÊÿ6C)ˆ‚Ì„ƒ A‡Ä ‚Ç„€ºÄ¾™¢Â‚„€€ºº¾eƒ§º·¾—‚²„€€º±¾‘gžY6†r¿­ŸV ‡«)§ª‚¤‡© ‡¨ ‡§¿§£¢Ÿs ‡ž¢Š§‚™‡œ€‡› ‡š¿š£•Ÿs€ iˆ€@ `œ@ 5»2¤22›5¼2œ6¤ €ff1#2¨2¦2§2©2¥3N B‡m ‚ɎɇÀƒÀAž¥ÃcϻǼ˹ǻƒ¹¶ÿ6DÂYKžŒ†çîJÿB†ä¿°£«¼€Âßžj­ǥˢǤKÆ×ËžÆÖ¿¢£¼€ŸP‚¡†ûŠù†úŠ÷Â8Kž‚™†óŽð†ðŽî†ÁÂìJÿB†¾¿Š¢è¼€Ÿ87h2Ÿ7i7j7<7=< 7\7 ÿ‚Ø †¨ŠÓ†§¿s¢Ñ¼€‚¢žQ ¢ÂKP@¤€+-€ž)– [žxžw¢À€@+žž‚¿€7\+-€ž)– [žržqž‚¢~Â|JÿP@¤€*ÿ-•ž) [žxžw¢qÀ€@+žž‚¿€7\*ÿ-•ž) [žržqŸ@ Þ~ÇŒ§Œ§Œ ‡‹ ‡Š¿Š£†Ÿt2¨2§2¦2¥2©3N C‡Í ƒ E‚ÉP)¦tž…ƒÅ P¢Á¦n ‡² ‡±¢iIǯîC ¢˪˨ʪǪHøÇ©Ã§Ç¨HøÇ§HàǦæĀ+¾õß¡ž{ßÞüžuÞùžoÞö [žžÂñMž]žZŸC888<2888 88¸ 82¤ 5»¢*IÆÒÂÑC ÂcÊÍÊËÊkÆÏHøÆÊÂÌÆÌHøÆÇHàÆÆÃÇp@À€@{¾¡+¾²Þ½žxÞ½Þ¹žqÞ¶žkÞ³ [žž…®MžYžV¨QÄIÆ¥žž 7÷ QÃI Æžž7ýž7ýž¤ p‡‰Ç‰§‰ ‡ˆ ‡‡¿‡£ƒŸt2§2¨2¦2¥2©3N -€Ÿ}Ÿ|+ Þ…Ÿy ež †t †s£îIÆqÂpC ÂáÊlÊjÊçÆnHøÆiÂkÆkHøÆfHàÆeÃfÄ€+¾UÞ`ž{Þ`Þ\žuÞYžoÞV [žž…ÂQMž]žZ£ÇIÆJÂIC ºÊEÊCÊÁÆGHøÆBÂDÆDHøÆ?HàÆ>Ã?X€€†=p@Ä€€€@‚8„€@{¾+¾#Þ.žrÞ.Þ*žjÞ'ždÞ$ [žž…ÂMžRžOÂQÄIÆž!ž8†ÂQÃI Æžž8Œž8ŒSžŒ7qÞ;žlÞ8 [ž^ž]Â2QÃIÆ/ž9ž69NÂ+QÃIÆ(ž1ž09Tž.9TDž,8"<Ò7q )ˆ‚„ƒ D‡» 㹃¹ P UIª%„@ÄA'km€ž‚ži–`[žužt' ã¥%IUp@À@@{žž… `'¿œ` %Iªp@ÀA@{žž„' `¿` km€ž‚ži–`[žbža'žB9—e¿†Ÿ?2¤2›2œ7ÿ5^1# ‚Ü‡Ü E‡u )ˆ€ƒ‡Ö £oÃoKÆÍ¾„)ˆƒÎ„ƒŸl i €+ž‚ž)–@ )ˆ‚¸„ƒ @c ¸Āp@À€@{ž¾@ )ˆ‚¬„ƒ @p­žÂ¯Ä€‚©p„€ À€@{žÇpÂIžHþÄ€‚™p„€ À€@{ž·qBižF+‚Š žAž@Ÿ>5C:#::Nÿÿ{€9¡6?5½ÿ ¿že pAž¡ž° ‚’ÇÆ‘ †ŽpAž™ž¨úŠžŸ° †„pAžžœ @ )ˆ‚Q„ƒ @pPHÿN6åÄ€‚Lp„€ €€{žs¾RIN6UÄ€‚<p„€ €€{žs¾B:µ ‚§@pQAžŒ= ž¬æ£@ )ˆ‚!„ƒ @pbÿi†–` û“`žHÿÄ€c ÂŽ‚Ä€ kÀ€‚„@{žiž¸ ‚‚·L¸ Ei†u` ûÃÂr`@ž^IÄ€c ÂŒ‚ÉÄ€ kÀ€‚c@{žiž—ð‡ð >/{7 ÂQdžIÇ´@pQAžAža»°žž„@pQAž1žQÂGpAÚ¦¾“ž1p¾ž. 指ŸÇŸ§Ÿ ‡ž ‡¿¿£˜âŸr æ} ‡‡Ç‘@§ ‡Œ¿¿£ˆâqŸq€:!:"ÿÿ2§2¨2¦2¥2©3Ö3N ƒçÿ6D‚ܻ㞞‰ƒáÿ6D‚ջݞž‹ýŸoƒÐBüŸkƒÔ‡ÌƒÑ‡Òž‘ƒÇAžÖƒÌ‡ÄƒÉÿ6D‚¾»Åžžƒ‚ŇÞ‚ƒ¿‡À¿¸)â³P`€€„@+k [žzžy)â©€€pÀ@@{žü+k [žvžu¾×0¿¡ž€‚8ŠŸ†6ü‡)”ŸʙÄ)ˆÂœÊ•ă)„™ʑă)€Â–ÊÄ)ŒÂ“ʉăŸ 2Ÿ2›5R;›;|1#02ž22œÿ5È5C5@65þ¾ˆý…‚Žn†Ÿ ¿f¢bi‚™P€€„@+k [žzžy¢Wi€€pÀ@@{ž©+k [žvžu¾„пNŸb@ ƒ~†ÄÞ|¢CâBêÀ‚ÀP€€„@+k [žzžy¢7â6ê´€€pÀ@@{ž†+k [žvžuŸaƒ©Až—ƒ$O¾<  Î% @„€¿Ÿ2Zçž¾” ‚œŽ œ€¿–2Z畾‹ Ÿ“ÿ¶‘p `i ŸŒ ‡Š¿ŠŸ{2«2 <ò2¦1¥5É2¥3N ¿Ø¢ØâØ‚ØP€€„@+k`[žzžy¢ÍâÍ€€pÀ@@{ž9+k`[žvžu¿ÃŸd ¿¼¢Àâ¿ê»‚¾P€€Áе„@+k [žw¢²â±ê­€€ÁŠ©pÀ@pKž+k [žs¿¡Ÿ^ ¿š¢ ã ‚ P€€„@+k [žzžy¢•ã•€€pÀ@@{Ÿ‘+k [žvžu¿…Ÿd5R0 1#2¬2²77i7\;›ªªUUUUªªUUªªªªUUUUªªªªUUªªUUUUªªUUªªªªUUªªUUUUªªªªUUUUªªUUªªªªUUªªªªUUUUUUUUªªªªUUUUªªªªªªªªUUUUUUUUªªªªªªªªUUUUªªªªUUUUUUUUªªªª  ªªUUUUªªUUªªªªUUUUªªªªUUªªUUUUªªªªªªªªªªUUUUUUUUUUUUUUUUªªªªªªªª  †¦Ž£|.Þz%€€' ÿžƒ¿‡+žx¢‚‚‚Ÿo=Ó ƒ~†ŒÞ{£zÞy.%€€'¿s+Þ‚žyŸp ††¦† ¿i ¿g¾gŸu ‚Å Ÿ|Þ{ #ŸyÞx _ŸvÞu ^ŸsÞr ,ŸpÞoŸn †Ì‚–†þ†‚Ç)/‹+=‹ˆ†Á ¿BÞ„Þ‚žtŸm =i=‚=I †—†˜¿š†•Ž–ÌŽ•JÞ‘‚ŽŠŒŠ‹ŽŒņ‡žp‚†¢„Ÿi ?¾ìžg0 > †‘‚¨†‘ü†Ž‚Œ)/Œ+=‹‰†† ¾ÕÞ…ÞƒžtŸm=…@èd  )†y9 öB :ž A¾¿‚„1*ÿ1³Ÿp=… †I†J¾å†GŽHÑŽ•ÍŽ“ ÌŽJІ<‚:1¶9†7Þ8žmІžw‚3¢1Ÿd  _†ˆ†…0’ƒ‡¦‚Ÿw=Ç  _’zy 6Á…’u¢uŸvA ¾g‚«Nƒ¨@þ‚©ÿÿ¢¥ÿ 6="ÿ. 1¾@‚›Bƒ˜ž‚Ÿ€=þIø†•¢—C "C ¢C I6 ½ÌÞ ž}ƒ¹y ‚E ~ à ž .½Óƒ®ÿ ‚E ~ à ž .½ÓÞ£ÞƒžfŸN ,žÅ½Ö†s@ÁäFž…C ’kŸqÁîLLžÅ¾ (žwž{žu Â^Þ|JÿQBÆZŸyî Lžˆ Sžžð TžŠ½ÑžˆÞN‚M ¾ †Ižsľ‰…éä¾Ë†_‚”‡]¾]Š’ž| IÆŽ¾> ,žÅ½ÖƇ ,žžƒ†·½ÖÆ‚ŸpIư¾k ,ž“ ’« ,žƒHÿÆtž’‚r žŽHÿÆmæ -žÅ†›ž†½Öæ -žÅ†”ä†(ƒ'š\–\ÂFžƒ‚Š -ž‚¾žt½Ñ‚½Úƒ½Ôžx Â’@"Fž‚Ÿzž‡@ ÎŒ‰è ÿFž„ …éÅè ŸlG¾#…é䆠† ‚.¾b†žÁèÆƒ™‡šÞ™Þ–JÿQº‚”†’‚!†’Â’ƒŽ»ž…ÞŠÞ‹JÿQ¸Ä½Ñ %½Ó‚‚½Ôžu †U ½Ó ½Ó ’‰B *ž ½Ó ½Ó‚GŸo †h½Ô †fÿ†e ¨"†cIƒaM K ÿ¢Y&žž†¢V&žƒ†RÆR `ÞQKL$žžk‚K N =½Ó‚DŽD½Ô G½Ó‚A öÁ  :½Óž€ ½ÓŸL ¾ƒ ¾ÌŸ{ †’¹¾‡y¾…9¾ƒ¾‚Ÿu  öÁ  :¾¹‚Ÿw ³ 0¦™‡¢•‚•C C 96¼C C " z až‚ ࢅ0 `Ÿe† •…墒C "C ¢tC I60@—ŸT¾žz @þ‚Œÿÿ¢0ÿ 6="ÿ. 1¾ `@Ÿp† 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ž½ÑÄ Å½Öp@ †ü¾¶ʽтõ½Û‚ð½ÛÂóTB‚ñ½Ûľ§@L@ž|LOžÛLmžÙLož×¾š ¦á `LžpJñRbC žŽžŸžßžÝž žžž¦ž¥ž¤ž™ž–ž•ž”žž“¾ë¾êž[ ¾çŸ} ¾ÞŸ} ¾Ñÿ½†»¾Æ@ƹŸwžûžõžïr·Q†²†´†­žBLùžƒ¾ÍLøre¾ˆ‡¤Þ£žžîÞ¤žsgž3 P@™‚—b@ ž‚ž†`@ žƒ `žÚ @P `Ÿl¾¦†„¾£Þ‚ž}žHž.r†yž  ¾…q†v¾‚¶tŸy ¾½’j 6Á €šfÿ’dŸv ¾–¾sÞ`Ÿz ¾¾fÞZÞYŸy¾aŽ[ľÁ⟄½Ñ C½ÓÄ ‚I†O‚H0Ÿzr(ÿ¦E `žÿ¾ ‡<Þ;žC½Ñ T½ÓK@½ÔÄ½Ñ M½Óƒ/½ÔÄ ¾½¢·‚·ûùû6I6;û6D6Âúž†ù666´ø"û"ù¾¨Ÿd ¾¡ü¢œ"ý¢˜ý96=ý96½"ý¾™Ÿq ¾’¢"ùø¢‰ùI6=ùI6½"ù¾ŠŸq†‚p† 0¦|Ÿ| ¢y0 `Ÿ{ ¾6Ÿ} †ö†÷†õªû¦ù `½Ö ž’ÞôÇóÅä½ÜÁèÞïÇîÞçÂæLžƒ ž‰žo ,žž…½ÖÆÛÆÜ ,Åªß¦Ý `‚ÕAņæ†Ðî Vž †ÍIP¾÷Þ΃͆àÞ˃ʅè ÿÂÃQÁ¾Ú°‰èJ ‘è@žˆ ¾Ÿ} ¾ Ÿ}…èIPNÆÃ‚ÁAKèÁ¾¡K †»¾Õ‚·F ¾ý¾ºIƱ¾Í ¾÷¾´Â²¾È ¾ò¾¯Â¨N ¾Â‚¥†‘çަ¾¼ž| ¾ Ÿ} ‚… ÁKŸzÔ hžž# †hÆ¿ÂcQH¾UÂbQÃŽaA¾Í¶ŸsÂnQB¾žz¾žx ¾¶Ÿ} @y¾§¾dÞK@ÿ¾¢¾_ÞFŸsèÕÞ?ž“ ¾™¾V‚;Â8ÁHÿ¾gÂK¾eI ¾˜Â3QÄ ÿ¾IIZ¾’ÄÂ@¾ZI ¾èAž=ž; ’7 6Á €š3ÿ’1Ÿw ‚BÆK ¾. ÿIJÿQ¶ÆŸs ½Ñ %½Ó‚" ÿ½ÔŸxmF0EBE5E3--E2E1|Ÿ| ¢y0 `Ÿ{ ¾6Ÿ} †ö†÷†õªû¦ù `½Ö ž’ÞôÇóÅä½ÜÁèÞïÇîÞçÂæLžƒ ž‰žo ,žž…½ÖÆÛÆÜ ,Åªß¦Ý `‚ÕAņæ†Ðî Vž †ÍIP¾÷Þ΃͆àÞ˃ʅè ÿÂÃQÁ¾Ú°‰èJ ‘è@žˆ ¾Ÿ} ¾ Ÿ}…èIPNÆÃ‚ÁAKèÁ¾¡K †»¾Õ‚·F ¾ý¾ºIƱ¾Í ¾÷¾´Â²¾È ¾ò¾¯Â¨N ¾Â‚¥†‘’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I? ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I@ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’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