IMD 1.16: 1/09/2008 10:47:24 84-93082-01 a000 f08201 qic02 streaming tape diagnostic source disk 18oct83    @0{)vvЀЀsQpk)p " }fA __M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF282090917325100831018094713 831018094713 BF08201 VOLQIC02 STREAMING TAPE DIAG/FORM SOURCE DISK 18/OCT/83   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_M@qGyy GGG`HX@ b G`^Y e GQ @@p@987 85P@ G:پN 8)0. * C'xC# b# }B+2 @0DAJL w+™ЀЀΖQA1"   i  ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G7H@pܾrCHC C GTq` Lg gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYSG @ @G6BDāCGDĀ# BC @E OB TITL NM-4 QIC-2 STREAMING TAPE DIAGNOSTIC 84-93082-10 A000 TITL TITLE PAGE * * * NM-4 QIC-2 STREAMING TAPE * * * DIAGNOSTIC * * * 84-93082-10 A000 * * * * * THE CONTENTS HEREOF ARE PROPRIETARY * TO COMPUTER AUTOMATION, INC. ("CA") * AND SHALL NOT BE REPRODUCED OR USED * WITHOUT CA'S PRIOR WRITTEN CONSENT. * * (C) COMPUTER AUTOMATION, INC. 1983. * * * * TITL REVISION HISTORY ******************************* * * REVISION HISTORY * ******************************* * * REVISION ISSUE DATE COMMENTS * -------- ---------- -------- * * * A0 MARCH 1983 ORIGINAL RELEASE * BY KARMAN TAM * * * AUGUST 1983 ADD TEST F,G AND TECH TEST * WITH IMPLEMENTATION * BY ANDY TONG * ******************************** * REV: EQU 'A0' LATEST REVISION TITL LINKER INFORMATION * EXTR DEBUG4 LINK TO DEBUG NAM G:0 LINK ADDRESS * * * * OPTIONS +:000A OPTIONS -:1000 OBJNOTE ' QIC-2 DIAGNOSTIC - REV. ',REV:%-8,REV:&:FF TITL QIC-2 DIAGNOSTIC: GLOBAL EQUATES ******************************** * * GLOBA L EQUATES * ******************************** * BCKAR: EQU :5F ASCII BACK ARROW BOT EQU :0421 POSITION TO BEGINING OF TAPE BROT EQU :0290 BRANCH TO OTHERS BRRW EQU :0210 BRANCH TO READ/WRITE FOR COMMAND AND DATA BRRWDO EQU :0250 BRANCH TO READ/WRITE FOR DATA ONLY BYKNT EQU 512 BYTE COUNT CR: EQU 13 ASCII CARRIAGE RETURN DLPDA EQU :7F LP DEVICE ADDRESS DTTYDA EQU :7C DIO TTY DEVICE ADDRESS(SHIFTED RIGHT) DIOADCH EQU :FD DIO STANDARD ADDRESS AND CHANNEL # ERASE EQU :0422 ERASE THE ENTIRE TAPE INIT EQU :0424 INITIALIZE CARTRIDGE LF: EQU 10 ASCII LINE FEED PATN EQU :6DB6 PATTERN RDST EQU :04C0 READ STATUS READ EQU :0480 READ RFM EQU :04A0 READ FILE MARK RSOL EQU :0400 RESET ONLINE SELDR1 EQU :0401 SELECT DRIVE 1 RESYS EQU :0100 SYSTEM RESET SELDR2 EQU :0402 SELECT DRIVE 2 SELDR3 EQU :0404 SELECT DRIVE 3 SELDR4 EQU :0408 SELECT DRIVE 4 UPARR: EQU :5E ASCII UP ARROW WFM EQU :0460 WRITE FILE MARK WRITE EQU :0440 WRITE TITL AUTO I/O BLOCK TRAP *********************************** * * AUTO I/O INTERRUPT LOCATIONS * *********************************** * ABS :C0 AIOB0 EQU $ RES 8,0 * ABS :C8 AIOB1 EQU $ RES 8,0 * ABS :D0 AIOB2 EQU $ RES 8,0 * ABS :D8 AIOB3 EQU $ RES 8,0 * ABS :E0 AIOB4 EQU $ RES 8,0 * ABS :E8 AIOB5 EQU $ RES 8,0 * * ******************************** * * AUTO I/O BLOCK * ******************************** ABS :F0 AIOB6 EQU $ WORD 0 AUTO I/O INSTRUCTION CELL WORD 0 NEGATIVE BYTE COUNT CELL WORD 0 BUFFER ADDRESS MINUS 1 CELL WORD 0 NOT USED EOB: EQU $ JST *$+1 JUMP TO END OF BLOCK WORD EOB END OF BLOCK ADDRESS CELL * LPOOL * * ABS :F8 AIOB7 EQU $ RES 8,0 * LPOOL * TITL STANDARD NM-4 TRAP/EXCEPTION LOCATIONS *********************************** * * * STANDARD NM-4 TRAP/EXCEPTION LOCATIONS * * * CONSOLE INTERRUPT AND * REAL-TIME-CLOCK INTERRUPT LOCATIONS * * *********************************** * ABS 0 DEBUG JUMP DEBUG JST *$+1 JUMP TO DEBUG WORD DEBUG4 DEBUG ADDRESS * ABS :80 POWER UP TRAP PWRUP JST *$+1 JUMP TO POWER UP ROUTINE WORD PWRUP: ADDRESS OF ROUTINE * ABS :84 UNIMPLEMENTED INSTRUCTION TRAP UNINT RES 2,0 ADDRESS AND INSTRUCTION JST *$+1 JUMP TO SERVICE ROUTINE WORD UNINT: ADDRESS OF ROUTINE * UNMET RES 2,0 UNINSTALLED MENORY TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UNMET: ADDRESS OF ROUTINE * PWRFL RES 2,0 POWER FAIL JST *$+1 JUMP TO SERVICE ROUTINE WORD PWRFL: ADDRESS OF ROUTINE * ABS :91 REAL-TIME-CLOCK RTCCNT RES 1,0 RTC TICKS  JST *$+1 JUMP TO SERVICE ROUTINE RTCRTN RES 1,0 ADDRESS OF SERVICE ROUTINE * CNINT JST *$+1 CONSOLE INTERRUPT LOCATION WORD CNINT: ADDRESS OF SERVICE ROUTINE * ABS :98 CHAR./NUM. EXCEPTION CHNUE RES 2,0 ADDRESS AND INSTRUCTION JST *$+1 JUMP TO SERVICE ROUTINE WORD CHNUE: ADDRESS OF ROUTINE * STKOV RES 2,0 STACK OVERFLOW JST *$+1 JUMP TO SERVICE ROUTINE WORD STKOV: ADDRESS OF ROUTINE * USETR RES 2,0 USER TRAP JST *$+1 JUMP TO ROUTINE WORD USETR: ADDRESS OF ROUTINE * STSTR RES 2,0 SYSTEM TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD SYSTR: ADDRESS OF ROUTINE * ARIER RES 2,0 ARITHMETIC ERROR JST *$+1 JUMP TO SERVICE ROUTINE WORD ARIER: ADDRESS OF ROUTINE * TITL MACRO QURY ********************************** * * * MACRO QURY - THIS MACRO REPLACE THE * REDUNDANT CODES DURING * QUERIES. * * ********************************** * MACRO QURY QURY# 1 EQU $ JST CHRIN CHECK TERMINATOR JMP QURY#2 CARRIAGE RETURN JMP QURY#3 '#' SIGN JMP QURY#4 BACK ARROW JMP QURY#5 UP ARROW JMP QURY#6 COMMA IFT 6<#7 ANYTHING ELSE ENDC ENDM TITL PROGRAM START UP ********************************** * * * PROGRAM START UP * * * :200 STANDARD ENTRY POINT * * * RESET STATUS REGISTER * RESET SENSE SWITCH * RESET CONSOLE INTERRUPT * RESET CDR DISPLAY * ENABLE INTERRUPTS * * * CALLS: * CRLF * MSGA * * ********************************** * ABS :200 G:0 EQU $ DEBUG LINK PSU EQU $ JST MSGA PRINT TITLE WORD TITLE JST CRLF PRINT A BLANK LINE JST CRLF AGAIN COPY =0,A ZERO A-REG COPY A,S RESET STATUS REGISTER COPY A,EROTOL RESET ACCUMULATE ERR COUNT OUT A,0 RESET SENSE SWITCH OUT A,1 RESET CONSOLE INT SELP A,4 RESET CDR DISPLAY COPY A,INFLAG CLEAR INPUT FLAG COPY A,PASS CLEAR PASS NUMBER COPY =:120,A INITIALIZE L COPY A,L COPY =:180,A INITIALZE K COPY A,K SBIT 4,S ENABLE CONSOLE INT SBIT 8,S ENABLE INTS JMP QURY1 JUMP TO QUERIES * LPOOL TITL QUERIES *********************************** * * QUERIES - THIS SECTION OF THE PROGRAM *  OUTPUT VARIES QUERIES TO THE * CRT/TTY. THE RESPONSES OF THESE * QUERIES DETERMINATE HOW THIS *  PROGRAM IS RUN. * * * DEVICE ADDRESS QUERY - THIS QUERY WILL CAUSE * THE MODIFICATION OF THE * DEVICE ADDRESS IF NON- * STANDARD DEVICE ADDRESS *  IS KEYED IN. * * * STANDARD DEVICE ADDRESS & CHANNEL - :FC * * * RESPONSE RANGE - :C0 TO :FE * * * CALLS: QURY(MACRO) CALLED BY: NONE * * *********************************** * QURY1 EQU $ COPY =0,A ZERO A-REG COPY A,INFLAG CLEAR INPUT FLAG COPY =:FC+1,A GET DEFAULT DEVICE ADDRESS COPY A,DEVAD SAVE IT JST MSGA OUTPUT QUERY WORD DEVADMSG QURY2 JST IHEX GET RESPONSE JNE X,$+3 HEX INPUT, GO CHECK RANGE CLSN A,=:0D IS IT A 'CR'? JMP QURY4 YES, NEXT QUERY CSK X,=:C0 DO RANGE CHECK JMP QURY1 OUT OF RANGE CSK X,=:FE DO UPPER RANGE CHECK JMP $+2 IN RANGE JMP QURY1 OUT OF RANGE COPY X,A GET DEVICE ADRESS AND =:F,A MASK OUT DEVADDR CLSN A,=:0 COMPARE AND SAVE JMP QURYF0 CLSN A,=:2 JMP QURYF2 CLSN A,=:4 JMP QURYF4 CLSN A,=:6 JMP QURYF6 CLSN A,=:8 JMP QURYF8 CLSN A,=:A JMP QURYFA CLSN A,=:C DEFAULT ADDRESS JMP QURYFC CLSN A,=:E JMP QURYFE JMP QURY1 WRONG DEVICE ADDR, TRY AGAIN QURYF0 COPY =AIOB0,Q JMP QURYFF QURYF2 COPY =AIOB1,Q JMP QURYFF QURYF4 COPY =AIOB2,Q JMP QURYFF QURYF6 COPY =AIOB3,Q JMP QURYFF QURYF8 COPY =AIOB4,Q JMP QURYFF QURYFA COPY =AIOB5,Q JMP QURYFF QURYFC COPY =AIOB6,Q JMP QURYFF QURYFE COPY =AIOB7,Q QURYFF COPY Q,AIOBADR SAVE AIOB ADDR (C0-F8) ADD =1,X ADD FC=1 COPY X,DEVAD SAVE NEW DEVICE ADDRESS QURY 3,10,ND,1,1,1,1 CHECK TERMINATOR JMP QURY2 GET TERMINATOR JMP QURY1 ANYTHING ELSE IS BAD QURY4 COPY =:F0,A SAVE DEFUALT DEVICE COPY A,AIOBADR JMP QURY10 TNEN GO NXT QURY * AIOBADR WORD :F0 CHANNEL CELL FOR DEVICE AIOB(C0-F8) * LPOOL TITL FUNCTION SELETION QURY ***************************************************** * * SELECTION FUNCTIONS * THIS QUERY ALLOWS USER TO CHOOSE EITHER * DIAGNOSTIC TESTS OR TECH TEST FUNCTION * D-DIAGNOSTIC * T-TECH TEST *  * QUERY: DIAG OR TECH TEST([D]/T)? * DEFAULT IS D-DIAGNOSTIC. * * NOTE: IF 'T' IS CHOOSEN, THE FOLLOWING QUERIES * WILL BE SKIPPED AND CONTROL WILL BE PASSED * TO TECH TEST SECTION. * ***************************************************** * QURY10 EQU $ COPY =0,A COPY A,INFLAG RESET INPUT FLAG COPY A,MODE CLEAR MODE JST MSGA OUTPUT QUERY WORD FSMSG JST IDEC GET RESPONSE JNE X,QURY10 RESPONSE NO GOOD COPY IDCTM3,A GET INPUT COUNT JNE A,QURY14 A=0 IS CORRECT QURY 11,13,10,10,1,10 CLSN ='D',A DIAGNOSTIC? JMP $+5 YES, SET INPUT FLAG CLSN ='T',A TECH TEST? JMP $+2 JMP QURY10 ANYTHING ESLE IS BAD COPY A,MODE SAVE 'T' IMS INFLAG SET INPUT FLAG JST IKB GET TERMINATOR COPY A,IDCTM2 STORE TERMINATOR JMP QURY11 CHECK TERM QURY13 EQU $ COPY MODE,A GET FUNCTION CLSN ='T',A TECH TEST? JMP QURYND NO, GO QURYND JMP QURY20 YES, GO QURY20 QURY14 JMP QURY1 * LPOOL TITL TEST SELECTION QUERY ********************************** * * TEST SELECTION - THIS QUERY ALLOW THE * USER TO SELECT ALL OR * SOME OF THE TESTS. * * DEFAULT: ALL 5 TESTS * *  TESTA-BASIC CONTROLLER FUNCTION CHECK * TESTB-SYSTEM RESET, TAPE REWIND, RETENSION * TESTC-WRITE DATA FM, DATA FM FM AND READ FILE MARKS * TESTD-WRITE/READ DATA * TESTE-ERASE TAPE * TESTF-RESET ONLINE COMMAND * TESTG-END OF MEDIA * * ********************************** * QURY20 EQU $ COPY =0,A ZERO A-REG COPY A,INFLAG CLEAR INPUT FLAG COPY =-7,A GET DATA LENGTH JST MOVE MOVE IN TEST PARAMETERS WORD TSTBUF2 FROM HERE WORD TSTBUF1 TO THERE COPY =TSTBUF1,Y INDEX TEST TABLE JST MSGA PRINT QUERY WORD TSTMSG COPY =-7,A GET INPUT COUNT COPY A,TEMP1 SAVE IT QURY21 EQU $ JST IDEC GET INPUT JNE X,QURY20 NUMERIC IS NO GOOD QURY 23,25,ND,20,10,21 CSK A,='G' DO RANGE CHECK CSK A,='A' 'A' TO 'G'? JMP QURY20 BAD NOP COPY TEMP1,Q GET INPUT COUNT JEQ Q,QURY25 IF ZERO GOTO QURY25 COPY A,0(Y) SAVE IT COPY =1,A COPY A,INFLAG THERE IS INPUT, SET FLAG ADD =1,Y BUMP TABLE ADDRESS IMS TEMP1 BUMP INPUT COUNT NOP JMP QURY21 CHECK TERMINATOR QURY25 EQU $ COPY INFLAG,Q GET INPUT FLAG JEQ Q,$+3 NOT SET=DEFAULT COPY =-1,A GET TEST TABLE TERMINATOR COPY A,0(Y) STORE TABLE TERMINATOR JMP QURY30 NEXT QURY * LPOOL TITL DATA BLOCK LENGTH QUERY *********************************** * * DATA BLOCK LENGTH QUERY - THIS QUERY * DETERMINATE THE NUMBER OF DATA * BLOCK TO BE TRANSFERED DURING * THE EXECUTION OF TESTD. * * * DEFAULT: 16,384 BLOCKS * DISK CAPACITY > (# OF BLOCKS)*(512)/1,000,000 MB * * * RANGE ALLOW: 1 TO 64K BLOCKS * * ********************************** * QURY30 EQU $ COPY =0,A ZERO A-REG COPY A,INFLAG CLEAR INPUT FLAG COPY =:3FFF,A GET DEFAULT NUMBER OF DATA BLOCKS COPY A,NDBKD SAVE IT JST MSGA PRINT QUERY WORD NDBKMSG QURY31 JST IHEX GET INPUT JNE X,$+2 HEX INPUT, GOOD JMP QURY33 NO, CHECK TERMINATOR SUB =1,X CONVERT TO NUMBER OF DATA BLOCKS MINUS ONE COPY X,NDBKD SAVE IT QURY 33,35,ND,30,20,30 JMP QURY30 ANYTHING ELSE QURY35 EQU $ JMP QURY40 GO TO NEXT QUERY * LPOOL TITL USER DATA PATTERN QUERY *********************************** * * * USER DATA PATTERN QUERY * * * QU ERY - PATTERN [:6DB6]? * * * DEFAULT: :6DB6 * * * RESPONSE: 4 HEX DIGITS EXCEPT ALL ZEROS * * ************************************ * QURY40 EQU $ COPY =:6DB6,A GET DEFAULT DATA PATTERN JST FILLBUF GO FILL UP WRITE BUFFER JST MSGA PRINT QUERY WORD UPMSG QURY41 JST IHEX GET INPUT JNE X,$+2 HEX INPUT, GOOD JMP QURY43 NO, CHECK TERMINATOR COPY X,A SAVE USER DEFINED DATA PATTERN JST FILLBUF FILL WRITE BUFFER WITH NEW DATA PATTERN QURY 43,45,ND,40,30,40 JMP QURY40 ANYTHING ESLE QURY45 EQU $ JMP QURY50 * LPOOL TITL RUN OPTION QUERY ******************************************************* * * RUN OPTION QUERY - THIS QUERY DETERMINATES * HOW THE DIAGNOSTIC PROGRAM * EXECUTES. * * * QUERY: RUN OPTIONS [:00]? * * SELECTION- :00 TO :3F * DEFAULT IS ':00' * * BIT HEX OPTION * --- ---  ------ * 0 :01 ACCUMULATION OF ERRORS OF ALL TESTS * 1 :02 SUPPRESS ERROR REPORTS *  2 :04 OUTPUT ERROR TALLIES @ END OF EA. TEST * 3 :08 RUN CONTINUOUSLY * 4 :10 HALT ON ERROR * 5 :20 LINE PRINTER ON * ****************************************************** * QURY50 EQU $ COPY =0,A COPY A,CAR SET RUN OPTION WD TO DEFAULT COPY A,INFLAG CLEAR INPUT FLAG JST MSGA OUTPUT QUERY WORD RNOPMSG JST IHEX GET RESPONSE JEQ X,QURY53 IF ZERO, SEE WHY QURY51 IMS INFLAG SET INPUT FLAG COPY X,A DO RANE CHECK SHIFT A,RO,6 :00 - 2F? JNE A,QURY50 IF NOT, TRY AGAIN COPY X,CAR ELSE, STORE VALUE QURY 52,ND,50,50,55,50 JMP QURY50 ANYTHING ELSE QURY53 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QURY52 IF ZERO, CHENK TERMINATOR JMP QURY51 ELSE, INPUT=0 QURY55 COPY INFLAG,A GET INPUT FLAG JNE A,QURY50 CAN'T DO JMP QURY40 CAN DO * LPOOL TITL DEVICE ADDRESS MODIFICATION *********************************** * * QUERND - DEVICE ADDRESS MODIFICATION * * * CALLS: CALLED BY: * NONE NONE * * *********************************** * QURYND EQU $ COPY DEVAD,Q GET DEVICE ADDRESS COPY =-8,A GET NUMBER OF I/O ADDRESS COPY A,QTMP SAVE IT AS COUNT COPY =DAFRST,Y GET TABLE ADDRESS DAADO COPY 0(Y),X GET I/O INSTRUCTION ADDRESS COPY =:FF00,A AND OUT THE AND 0(X),A OLD ADDRESS OR Q,A OR IN THE NEW ADDRESS COPY A,0(X) REPLACE THE INSTRUCTION ADD =1,Y BUMP TABLE POINTER IMS QTMP AND TABLE COUNTER JMP $+2 IF NOT 0 YET JMP DAAD1 ELSE OUT COPY QTMP,A GET COUNT CSK A,=-2 JMP DAADO <-8 TO -3>, GO FOR MORE JMP DAADO IF=-1, DONT SUB Q-REG SUB =1,Q FC --> 0 JMP DAADO GO FOR NEXT DAAD1 COPY MODE,A GET FUNCTION (DIAG/TECH TEST)  CLSN ='T',A IS IT TECH TEST? JMP TECH YES, GO TO TECH TEST SECTION. JMP EXEC ELSE, GO TO EXEC * DEVAD WORD :FC+1 DEVICE ADDRESS CELL(F0-FE) QTMP WORD 0 TEMP CELL * LPOOL TITL EXEC-TEST EXECUTIVE ******************************** * * EXEC - TEST EXECUTIVE * EXEC - TEST EXECUTIVE * * TEST EXECUTIVE CONTROLS THE FLOWS OF THE PROGRAM * WHICH INVOKES VARIES SUBROUTINES AT TIMES OF NEED. * ********************************* * EXEC EQU $ PROGRAM STARTUP-TEST CONTROL COPY =0,A CLERA A-REG COPY A,EOBFLAG CLEAR EOB FLAG COPY A,PASS RESET PASS # COPY A,EROTOL CLEAR ACCUM. ERR. CELL EXEC1 EQU $ JST CRLF PRINT A BLANK LINE  JST MSGA PRINT 'PASS' WORD PASSMSG COPY PASS,A GET PASS # JST ODEC PRINT IT COPY =0,A COPY A,S RESET STATUS REGISTER SELP A,4 RESET CDR DISPLAY SBIT 4,S ENABLE CONSOLE INT SBIT 8,S ENABLE INT COPY =:120,A INITIALIZE L COPY A,L COPY =:180,A INITIALIZE K COPY A,K COPY =TSTBUF1,X INDEX TEST SELECTION BUFFER EXEC1L EQU $ COPY X,TEMP1 SAVE TEST POINTER COPY 0(X),A GET TABLE CONTENT SUB =-1,A IS IT END OF TABLE? JEQ A,EXEC2 YES, GO EXEC2 COPY 0(X),A RESTORE A-REG CLSN A,='A' IS IT TEST A? JST TESTA CALL TEST A COPY TEMP1,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='B' IS IT TEST B? JST TESTB CALL TEST B COPY TEMP1,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='C' IS IT TEST C? JST TESTC CALL TEST C COPY TEMP1,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='D' IS IT TEST D? JST TESTD CALL TEST D COPY TEMP1,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='E' IS IT TEST E? JST TESTE CALL TEST E COPY TEMP1,X COPY 0(X),A CLSN A,='F' IS IT TEST F? JST TESTF CALL TEST G COPY TEMP1,X COPY 0(X),A CLSN A,='G' IS IT TEST G? JST TESTG CALL TEST G COPY TEMP1,X RESTORE TABLE POINTER  ADD =1,X BUMP TABLE POINTER JMP EXEC1L LOP BACK EXEC2 EQU $ COPY CAR,A GET RUN OPTION TBIT 0,A IS ACCUM. ERR. BIT ON? JF OV,EXEC2L NEXT, IF NO OPTION * COPY =TSTBUF1,Y INDEX TEST TABLE COPY 0(Y),A GET CONTENT EXEC2A EQU $ COPY =:0F,Q GET MASK WORD  AND Q,A MASK OUT UNWANTED BITS SUB =1,A LESS 1 COPY =EROTAB,X GET ERR TAB ADD A,X OFFSET INTO ERR TAB COPY 0(X),A GET # OF ERROR COPY EROTOL,Q GET TOTAL # OF ERR ADD Q,A ADD TOGETHER COPY A,EROTOL AND UPDATE ADD =1,Y BUMP INDEX TEST TABLE COPY 0(Y),A GET NEXT CONTENT CSK A,=-1 END OF TABLE? HLT (IMPOSSIBLE FOR CONT < 1) JMP EXEC2A NO, GO BACK. ELSE, GO ON JST MSGA WORD EROACC 'ACCUM. ERR., THIS PASS: ' COPY EROTOL,A GET TOTAL # OF PASS JST ODEC AND OUTPUT EXEC2L EQU $ COPY CAR,A GET RUN OPTION TBIT 3,A IS RUN CONT. BIT ON? JT OV,EXEC3 IF SO, PLEASE DON'T...STOP! JST MSGA ELSE, 'END OF TEST' WORD EOT JMP PSU+4 RESTART QUERIES EXEC3 EQU $ IMS PASS BUMP PASS JMP EXEC1 PASS STILL GOOD, LOOP BACK JST *0 PASS EXPIRED * RINST AIB DIOADCH AUTO BYTE INPUT * WINST AOB DIOADCH AUTO BYTE OUTPUT * PASS WORD 0 PASS COUNT CELL LPOOL TITL TESTA-TEST A SUBROUTINE *********************************** * * TESTA - TEST A SUBROUTINE * * THIS TEST CHECK THE BASIC CONTROLLER FUNCTIONS *  BY PERFORMING THE FOLLOWING: * (1) END OF BLOCK TEST (EOB) INTERRUPT ACCEPTANCE * (2) ABILITY TO READ INTERFACE STATUS * (3) ABILITY TO READ FULL STATUS * (4) ABILITY TO DETECT ILLEGAL COMMAND * * * CALLS: CALLED BY: * ERR EXEC * IIS * MSGA * RDSTR * * *********************************** * TESTA ENT TEST A ENTRY POINT JST MSGA PRINT TEST HEADING WORD TSTA COPY =0,A COPY A,ERORA CLEAR ERROR CNT CELL COPY A,EROTT SAVE OFFSET=0 FOR TALLY USE COPY =:110,A ENABLE EOB INTERRUPT COPY A,S SAVE IT IN S-REG TSTA1 EQU $ COPY =:1001,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER COPY =:02F0,A GET SENSE PICO  READY COMMAND JST OTA SEND IT SBIT 8,S ENSBLE INT NOP WAIT FOR EOB INT NOP NOP NOP NOP NOP NOP NOP NOP NOP COPY EOBFLAG,A GET EOB FLAG JNE A,TSTA2 EOB SERVICED, NEXT TEST COPY =0,A NO EOB, GET ERROR NUMBER COPY A,ERNO SAVE IT JST ERR CALL ERROR TSTA2 EQU $ COPY =:1002,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER COPY =0,A CLEAR EOB FLAG COPY A,EOBFLAG COPY =-9,A SET RETRY COUNT COPY A,COUNT SAVE IT COPY =PATN,Q GET WORD PATTERN TSTA2L EQU $ COPY COUNT,A GET RETRY COUNT JEQ A,TSTA2E RETRY EXPIRED, FLAG ERROR COPY Q,A JST ITA INPUT INTERFACE STATUS CSN Q,A Q=A? JMP $+2 READ FAIL, TRY AGAIN JMP TSTA3 GOOD READ, NEXT TEST IMS COUNT BUMP RETRY COUNT NOP JMP TSTA2L LOOP BACK, TRY AGAIN TSTA2E EQU $ COPY =1,A SET ERROR NO COPY A,ERNO SAVE IT JST ERR CALL ERROR TSTA3 EQU $ COPY =:1003,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER SBIT 8,S ENABLE INTERRUPT JST RDSTR READ FULL STATUS JMP $ WAIT HERE FOR EOB INT NOP COPY AIOBADR,X GET DEVICE AIOB ADDR COPY 1(X),A GET IOB BYTE COUNT AND =:7FFF,A MASK OFF MOST SIGNIFICANT BIT JEQ A,TSTA4 WORD COUNT=0, OK COPY =4,A WORD COUNT NOT=0, ERROR=4 COPY A,ERNO SAVE IT JST ERR CALL ERROR TSTA4 EQU $ COPY =:1004,A SELP A,4 COPY INST,A GET AIO INST  COPY A,AIOB6 SAVE IT COPY =6,Q GET STA BYTE CNT NEG Q,Q COPY Q,AIOB6+1 STORE IT COPY =BUFFERS%1-1,X GET SAT BUF ADDR COPY X,AIOB6+2 SAVE JST AIOBMOD SBIT 8,S COPY =:043F,A ILLEGAL COMMAND JST OTA SEND IT COPY =BROT,A GET EXEC ADDR JST OTA * JST RDSTR GO READ STATUS JMP $ WAIT FOR INT NOP COPY BUFFERS,A GET STATUS WORD CSK A,=:00C8 IS IT ILL COMMAND? NOP IF NO, JMP $+1 ERROR #11 JMP TSTAND IF YES, EXIT COPY =11,A ERROR 11 COPY A,ERNO JST ERR GO ERROR ROUTINE TSTAND EQU $ JST EROTAL GO TALLY SUB JMP *TESTA EXIT * LPOOL TITL TESTB-TEST B SUBROUTINE ********************************** * * TESTB - TEST B SUBROUTINE * * THIS ROUTINE PREFORM THE FOLLOWING: * (1) SYSTEM RESET, * (2) REWIND TAPE, AND *  (3) INITIALIZE (RETENSION) TAPE. * * * CALLS: CALLED BY: * ERR  EXEC * IIS * INITZ * MSGA * RDSTR * RESYSR * SOT * TIME *  TIMER * * *********************************** * TESTB ENT TEST B ENTRY POINT JST MSGA OUTPUT TEST HEADING WORD TSTB COPY =0,A COPY A,ERORB CLEAR ERROR CNT CELL COPY =1,A COPY A,EROTT SAVE OFFSET=1 FOR TALLY USE JST IIS GET INTERFACE STATUS JMP TB1 IDLE=0, FLAG ERROR JMP TB2 EXCEPTION=1, FLAG ERROR JMP TSTB1 NO EXCEPTION & IDLE SET. START TEST B TB1 JST ERR CALL ERROR JMP TB2 GO ON TB2 EQU $ JST RDSTR READ STATUS TO CLEAR EXCEPTION JMP $ WAIT EOB INT NOP JMP TSTB1 OK, START TESTING TSTB1 EQU $ COPY =:2001,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER JST RESYSR RESET SYSTEM JST TIMER SET UP TMER JST TIME ALLOW 7 SECOND JMP $-1 LOOP BACK UNTIL TIMED OUT JST ITA INPUT INTERFACE STATUS TBIT 0,A IS EXCEPTION SET? JF OV,TSTB1E NO, RESET FAILED JST RDSTR YES, READ STATUS TO CLEAR EXCEPTION JMP $ WAIT HERE FOR EOB INT NOP JMP TSTB2 OK,GO ON TSTB1E COPY =5,A TIMED OUT, SET ERROR NUMBER COPY A,ERNO SAVE IT JST ERR GO ERROR JST RDSTR READ STATUS TO CLEAR EXCEPTION   JMP $ WAIT FOR EOB INT NOP JMP TSTB2 PROCEED TO NEXT TEST * TSTB2 EQU $ COPY =:2002,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER JST IIS GET INTERFACE STATUS NOP IDLE=0 JMP TSTB21 EXCETP=1 SBIT 8,S OK, ENABLE INT COPY =BOT,A GET BOT COMMAND JST OTA OUTPUT COPY =BROT,A BRANCH ADDRESS JST OTA JMP $ WAIT FOR EOB NOP JST RDSTR READ STATUS JMP $ WAIT FOR EOB NOP COPY BUFFERS,A GET STATUS TBIT 3,A IS BOM SET? JT OV,TSTB3 YES, NEXT TEST COPY =2,A NO, FLAG ERROR COPY A,ERNO SAVE IT TSTB21 JST ERR GO ERROR AND GO ON * TSTB3 EQU $ COPY =:2003,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER JST INITZ DO TAPE RETENSION JMP $ WAIT FOR EOB INT NOP JST RDSTR READ STATUS JMP $ WAIT FOR INT NOP COPY BUFFERS,A GET STATUS WORD TBIT 3,A IS BOM (BIT 3) SET? JT OV,TSTB4 YES, EXIT COPY =6,A NO, FLAG ERROR COPY A,ERNO SAVE IT JST ERR CALL ERROR SBIT 8,S ENABLE EOB INT JMP TSTB4 EXIT * TSTB4 EQU $ JST EROTAL GO TALLY SUB JMP *TESTB EXIT * LPOOL TITL TESTC-TEST C SUBROUTINE ********************************** * * TESTC - TEST C SUBROUTINE * THIS ROUTINE CHECKS THE READ/WRITE * FILE MARK ABILITY. * (1) WRITE 5 DATA BLK 1 FM, AND 5 BLK 2 FM * (2) AND THAN REWIND THE TAPE, FOLLOWED BY * 3 FILE MARKS READ OPERATION. * * * CALLS: CALLED BY: * ERR  EXEC * FMR * FMW * MSGA * RDSTR * SOT * TCSUB * * *********************************** * TESTC ENT TEST C ENTRY POINT JST MSGA PRINT TEST HEADING WORD TSTC COPY =0,A COPY A,ERORC CLEAR ERR CNT CELL COPY =2,A COPY A,EROTT SAVE OFFSET=2 FOR TALLY USE JST TCSUB GET READY FOR TEST TSTC1 EQU $ COPY =:3001,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER COPY =-2,A SET RETRY COUNT COPY A,COUNT SAVE IT TC1L EQU $  COPY =5,A SET DATA BLK=5 COPY A,NDBK SAVE JST DAWRIT AND CALL DATA WRITE SUB JST ERR ERR RET, CALL ERR & GO ON TC1N EQU $ JST FMW WRITE FILE MARK JMP $ WAIT FOR EOB INT NOP JST ITA GET INTERFACE STATUS TBIT 0,A IS EXCEPTION SET? JF OV,$+8 NO, AOK! JST RDSTR YES, READ STATUS TO CLEAR EXCEPTION JMP $ WAIT FOR EOB INT NOP COPY =8,A ERROR=8 COPY A,ERNO SAVE IT JST ERR CALL ERROR JST STATCK CALL CHECK STATUS IMS COUNT BUMP RETRY COUNT JMP $+2 CNT NE 0, SEE IF +/- JMP TC1N CNT=0, GO WRITE FM ONLY COPY COUNT,A CSK A,=0 JMP TC1L CNT < 0 GO WRITE DATA & FM * CNT > 0, GO NXT PART TSTC2 EQU $ COPY =:3002,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER JST TCSUB GET READY FOR TEST COPY =-3,A GET COUNT COPY A,COUNT SAVE IT TC2L COPY COUNT,A GET COUNT JEQ A,TSTC3 COUNT EXPIRED, EXIT JST FMR READ FILE MARK JMP $ WAIT FOR EOB INT NOP JST ITA GET INTERFACE STATUS TBIT 0,A IS EXCEPTION SET? JT OV,$+5 YES, IT IS SET COPY =7,A NO, READ FILE MARK FAIL COPY A,ERNO FLAG ERROR JST ERR CALL ERROR JMP TC2C CONTINUE JST RDSTR READ STATUS TO CLEAR EXCEPTION JMP $ WAIT FOR EOB INT NOP COPY BUFFERS,A GET STATUS WORD TBIT 8,A FILE MARK DETECTED? JT OV,TC2C YES, CARRY ON COPY =7,A NO, FLAG ERROR COPY A,ERNO SAVE IT JST ERR CALL ERROR JMP TC2C CONTINUE * TC2C IMS COUNT BUMP COUNT NOP JMP TC2L LOOP BACK FOR MORE * TSTC3 EQU $ JST EROTAL GO TO TA LLY SUB JMP *TESTC EXIT * LPOOL TITL TCSUB-TEST C SUBROUTINE *********************************** * * TCSUB - TEST C SUBROUTINE * THIS SUBROUTINE CHECK THE READYNESS OF * THE UNIT UNDER TEST AND REWIND THE TAPE * TO THE BEGINING OF MEDIA. * * * CALLING SEQUENCE: JST TCSUB * * * CALLS: CALLED BY: * ERR  TESTC * IIS * RDSTR * SOT * * *********************************** * TCSUB ENT JST IIS CALL IIS JMP TCS1 IDLE=0 JMP TCS2 EXCEPTION SET JMP TCS3 NO EXCEPTION & UNIT READY, BOT TCS1 JST ERR CALL ERROR  JMP TCS2 GO ON TCS2 JST RDSTR READ STATUS TO CLEAR EXCEPTION JMP $ WAIT FOR EOB INT NOP TCS3 EQU $ JST SOT REWIND TAPE JMP $+4 BOM? YES, EXIT COPY =2,A NO, FLAG ERROR COPY A,ERNO SAVE IT JST ERR CALL ERROR JMP *TCSUB EXIT TITL TESTD-TEST D SUBROUTINE ********************************** * * TESTD - TEST D SUBROUTINE * * THIS ROUTINE TEST OUT THE WRITE AND READ * FUNCTIONS OF THE CONTROLLER BY PERFORMING * THE FOLLOWING: * (1) WRITE DATA BLOCKS AND TERMINATE WRITE * WITH A FILE MARK, * (2) READ DATA BLOCKS AND FILE MARK. * DEFAULT: READ/WRITE 16,384 BLOCKS. * * * CALLS: CALLED BY: * ERR EXEC * FMR * FMW * MAIO * MSGA * READR * SOT * WRITER * * *********************************** * TESTD ENT JST MSGA PRINT TEST HEADING WORD TSTD COPY =0,A COPY A,ERORD CLEAR ERROR CNT CELL COPY =3,A COPY A,EROTT SAVE OFFSET=3 FOR TALLY USE COPY =:4001,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER JST TCSUB GET TAPE READY COPY NDBKD,A GET KEYED/DEFAULT VALUE COPY A,NDBK AND SAVE JST DAWRIT CALL WRITE DATA BLKS SUB JST ERR CALL ERR & GO ON JST FMW WRITE A FILE MARK JMP $ WAIT FOR EOB INT NOP * TSTD2 EQU $ COPY =:4002,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER JST TCSUB GET TAPE READY COPY NDBKD,A GET KEYED IN BLK CNT VALUE COPY A,NDBK SAVE FOR SUB JST DAREAD CALL DATA BLKS READ SUB JMP $+2 IF ERROR RETURN JMP TSTD2L NO ERR, CONTINUE COPY =:FE,A GET BUFF LENGTH-1 COPY A,BUFLNG AND SAVE JST CKREAD GO CHECK BUF ROUTINE HLT CANNOT BE GOOD RET, THEREFORE HLT JST ERR CALL ERROR JST MSGA PRINT 'EXPECTED WORD'  WORD EXWD COPY TDQ,A JST OHEX AND PRINT IT JST MSGA PRINT 'ACTUAL WORD' WORD ACTWD COPY TDA,A GET IT JST OHEX AND PRINT TSTD2L JST FMR READ A FILE MARK JMP $ WAIT FOR EOB INT NOP JST RDSTR RESD STATUS JMP $ WAIT FOR EOB INT NOP COPY BUFFERS,A GET STATUS TBIT 8,A IS FILE MARK DETECTED? JT OV,TSTDND YES, OUT! COPY A,ERNO NO, FLAG ERROR JST ERR CALL ERROR * TSTDND EQU $ JST EROTAL GO TALLY SUB JMP *TESTD EXIT * LPOOL TITL TESTE-TEST E SUBROUTINE *********************************** * * TESTE - TEST E SUBROUTINE * (1) THIS ROUTINE ERASE THE ENTIRE TAPE * (2) AND READ DATA AFTER ERASE * * *  CALLING SEQUENCE: JST TESTE * * * CALLS: CALLED BY: * EET EXEC * ERR * MSGA * RDSTR * AIOBMOD * MAIO * OTA,ITA * * ********************  *************** * TESTE ENT JST MSGA PRINT TEST HEADING WORD TSTE COPY =0,A COPY A,ERORE CLEAR ERROR CNT CELL COPY =4,A COPY A,EROTT SAVE OFFSET=4 FOR TALLY USE COPY =:5001,A GET CONTENT OF DATA REGISTER SELP A,4 SEND TO DATA REGISTER JST TCSUB GET TAPE READY JST EET ERASE TAPE JMP $ WAIT FOR EOB INT NOP JST ITA READ INTERFACE STATUS TBIT 0,A IS EXCEPTION SET? JF OV,TSTE1 NO ERROR, EXIT JST RDSTR ERROR! READ STATUS JMP $ WAIT FOR EOB INT NOP COPY BUFFERS,A GET STATUS WORD COPY A,ERNO SAVE IT JST ERR CALL ERROR TSTE1 COPY =:5002,A ESTE PART 2 SELP A,4 JST RDSTR READ STATUS FOR SAFETY SAKE JMP $ WAIT FOR EOB INT NOP COPY RINST,A GET AOB INST COPY A,AIOB6 JST AIOBMOD MOVE TO APPROPIATE LOC COPY =BUFFERR%1-1,A GET READ BUF ADDR JST MAIO SET UP AIOB JST READR READ A BLOCK OF DATA JMP $ WAIT FOR EOB NOP JST ITA GET INTERFACE STATUS WORD TBIT 0,A IS EXCEPTION SET? JT OV,TSTE2 YES, GO CHECK STATUS COPY =10,A ELSE FLAG ERROR COPY A,ERNO AND SAVE IT JST ERR CALL ERROR JMP TSTEND AND EXIT TSTE2 EQU $ CHECK STATUS ROUTINE JST RDSTR GO READ STATUS JMP $ WAIT FOR EOB NOP COPY BUFFERS,A GET STATUS WORD COPY =:EFFF,Q GET MASK WORD FOR :8EA06 AND Q,A MASK OFF UNCARE BIT CSK A,=:86A0 READ ERR, NO DATA? JMP TSTE3 OTHER ERROR JMP TSTE3 SAME JMP TSTEND OK, IT'S EXP ERR, EXIT TSTE3 EQU $ COPY BUFFERS,A GET STATUS WORD COPY A,ERNO SAVE AS ERROR NUMBER  JST ERR CALL ERROR TSTEND EQU $ JST EROTAL GO TALLY SUB JMP *TESTE EXIT * LPOOL TITL TESTF-TEST F SUBROUTINE ****************************************************** * * TESTF-TEST F SUBROUTINE * THIS TEST WILL WRITE 5 BLOCKS OF DATA *  AND THEN ISSUE AN RESET ONLINE COMMAND * AND CHECK WHETHER HARDWARE WILL WRITE * A FILE MARK AUTOMATICALLY TO TERMINATE * THE WRITE OPERATION. * * CALLS: CALLED BY: * DAWRIT * ERR  EXEC * FMR * MSGA * TCSUB * * NOTE: THIS ROUTINE HAS TO BE RAN AFTER TESTE (TAPE ERASE) *  ***************************************************** * TESTF ENT JST MSGA PRINT TEST HEADING WORD TSTF COPY =0,A COPY A,ERORF CLEAR ERROR CNT CELL COPY =5,A COPY A,EROTT SAVE OFFSET=5 FOR TALLY USE COPY =:6001,A GET CONTENT OF DATA REG SELP A,4 SEND OUT JST TCSUB GET TAPE READY COPY =5,A DATA BLK=5 COPY A,NDBK SAVE JST DAWRIT CALL WRITE DATA SUB JST ERR IF ERR RET, CALL ERR & GO ON * COPY =RSOL,A GET ONLINE RESET COMMAND JST OTA OUT THE COMMAND JST ITA GET INTERFACE STATUS TBIT 1,A READY SET? JF OV,$-2 NO, WAIT TILL READY. TBIT 0,A IS EXCEPTION BIT SET? JF OV,TSTF1 NO, GO READ FILE MARK JST RDSTR READ STATUS JMP $ NOP COPY =12,A ERROR=12 COPY A,ERNO SAVE IT JST ERR JMP TSTFND AND EXIT TSTF1 EQU $ COPY =:6002,A SELP A,4 JST TCSUB GET TAPE READY JST FMR READ FILE MARK JMP $ NOP JST ITA GET INTER STATUS TBIT 0,A IS EXC SET? JT OV,TSTF2 YES COPY =7,A NO, READ FM FAIL COPY A,ERNO JST ERR JMP TSTFND AND EXIT TSTF2 EQU $ JST RDSTR READ STATUS JMP $ NOP COPY BUFFERS,A GET STATUS WD TBIT 8,A FILE MARK DETECTED? JT OV,TSTFND YES, DONE COPY =12,A ELSE ERROR COPY A,ERNO JST ERR TSTFND EQU $  JST EROTAL GO TO TALLY SUB JMP *TESTF EXIT * LPOOL TITL TESTG-TEST G END OF MEDIA TEST *************************************  ***************** * * TESTG-TEST G SUBROUTINE * THIS SUBROUTINE WILL DO: * (1) WRITE INFINITE DATA BLOCKS ON TAPE UNIL * PHYSICAL END AND EXPECT EOM INTERRUPT. * * CALLS: CALLED BY: * DAREAD  EXEC * DAWRIT * ERR * MSGA * TCSUB * ***************************************************** * TESTG ENT JST MSGA PRINT TEST HEADING WORD TSTG COPY =0,A COPY A,ERORG CLEAR ERROR CNT CELL COPY =6,A COPY A,EROTT SAVE OFFSET=6 FOR TALLY USE COPY =1,A COPY A,CNTDAB SET BLKCNT DISABLE FLAG * COPY =:7001,A SELP A,4 DISPLAY TO CDR COPY A,NDBK JUST PUT SOME VALUE JST TCSUB GET TAPE READY JST DAWRIT CALL DATA WRITE ROUTINE JMP $+2 BAD RETURN (EXPECTED) JMP $+4 GOOD RETURN (NOT EXPECTED) COPY =:8800,Q END OF MEDIA CSM Q,A IS IT EOM? NOP IF NO, CALL ERR JST ERR & GO ON * TSTGND EQU $ COPY =0,A COPY A,CNTDAB RESET BLK CNT DIS FLAG JST EROTAL GO TALLY SUB JMP *TESTG EXIT * LPOOL * TITL TECH TEST ***************************************************** * * TECH -TECH TEST * * THE TECH TEST WILL REQUEST INPUT FOR *  CORRESPONDING TEST. THEN IT WILL REPEATEDLY * PERFORM THE REQUESTED FUNCTION, WITH NO * STATUS CHECKING OR TIMEOUT LOOPS. AS SOON * AS AN OPERATION COMPLETES, IT IS REPEATED. * * ESCAPE IS VIA EITHER CONSOLE SENSE SWITCH OR * CONSOLE INTERRUPT WHICH RETURNS TO TECH TEST * QUERY OR THE QUERIES RESPECTIVELY. * * CALLS:  CALLED BY: * ****************************************************** * *-------------------------------------------------- * THIS IS THE QURY PART OF TECH TEST *-------------------------------------------------- * TECH EQU $ JST MSGA WORD TTMSG PRINT TECH TEST QURY MSG JST IKB GET INPUT CSK A,='F' DO TEST # RANGE CHECK CSK A,='A' 'A' TO 'F'? JMP TECH BAD NOP COPY A,TTCEL1 SAVE TEST # JST IKB GET TERMINATOR COPY A,IDCTM2 AND SAVE JST CHRIN CHECK TERMINATOR JMP TTQY2 CARRIAGE RET JMP TECH '#' SIGN JMP TECH BACK ARROW JMP QURY10 UP ARROW JMP TECH COMMA JMP TECH ANYTHING ELSE TTQY2 EQU $ COPY =0,A OUT A,0 RESET SENSE SWITCH COPY TTCEL1,A GET TEST # CLSN ='A',A JMP TECHA GO TEST A CLSN ='B',A JMP TECHB GO TEST B CLSN ='C',A JMP TECHC GO TEST C CLSN ='D',A JMP TECHD GO TEST D CLSN ='E',A JMP TECHE GO TEST E CLSN ='F',A JMP TECHF GO TEST F * TTCEL1 WORD 0 TEST # CELL * * TECH TEST A -RESET FUNCTION/RESET, TIMER TEST * ( NEED TO TURN OFF TAPE DRIVE POWER ) * TECHA EQU $ COPY =RESYS,A SYSTEM RESET JST OTA OUT COMMAND COPY =-:80,A COPY A,TC1 TIMER COUNT TECHA1 EQU $ IMS TC1 JMP TECHA1 JUMP BACK IF NOT EXPIRE COPY =:0240,A BRANCH ADDRESS JST OTA OUTPUT COPY =-:80,A COPY A,TC1 TECHA2 EQU $ IMS TC1 JMP TECHA2 JMP BACK IF TIME NOT EXPIRE JT SS,TECH IF SENCE SW ON, GO TECH QUERY JMP TECHA ELSE, REPEAT TEST * * TEST B -SENSE PICO BY CHECKING EOB * TECHB EQU $ SBIT 8,S SET ENABLE INT BIT COPY =:02F0,A GET SENSE PICO READY COMMAND JST OTA OUT COMMAND JMP $ WAIT FOR EOB NOP JT SS,TECH IF SENSE SW ON JMP TECHB+1 ELSE REPEAT TEST * * TEST C -ISSUE :00 & :FF REPEATEDLY * TECHC EQU $ COPY =:0400,A  JST OTA OUTPUT COPY =:04FF,A JST OTA OUTPUT JT SS,TECH IF SENSE SW ON JMP TECHC REPEAT TEST * * TECT D -ISSUE :0000 & :FFFF   AS DATA * TECHD EQU $ COPY =0,A JST OTAD OUTPUT :0000 COPY =-1,A JST OTAD OPTPUT :FFFF JT SS,TTEND IF SS ON JMP TECHD ELSE REPEAT TEST * * TEST E -INPUT ONE WD DATA * TECHE EQU $ JST ITAD INPUT DATA TO A-REG JT SS,TTEND IF SS ON JMP TECHE ELSE REPEAT TEST * * TEST F -INPUT INTERFACE STATUS * TECHF EQU $ JST ITA JT SS,TTEND IF SS ON JMP TECHF ELSE REPEAT TEST * TTEND JMP TECH LPOOL * TITL AIOBMOD SUBROUTINE ****************************** * * AIOBMOD-DEVICE (AIOB) ADDRESS MODIFICATION *  THIS SUBROUTINE WILL COPY AIOB TO * IT'S PROPER LOCATION * * CALLING SEQUENCE: JST AIOBMOD * * CALLS: MOVE CALLED BY: TESTA,TESTD,MAIO,RDSTR * * ****************************** * AIOBMOD ENT COPY AIOBADR,A GET DEVICE AIOB ADDR(C0-F8) COPY A,AIOBM PUT INTO 'TO ADDR' SUB =:F0,A SUBTRACT FORM STANDARD DEVICE ADDR JEQ A,AMOD IF STANDARD DEVICE ADDR THAN EXIT COPY =-8,A LENGTH OF AIOB JST MOVE RELOCATE AIOB TO PROPER CHANNEL WORD AIOB6 FROM HERE AIOBM WORD 0 TO HERE AMOD JMP *AIOBMOD LPOOL TITL 'CHRIN' SUBROUTINE ****************************** * * CHRIN - CHECK TERMINATOR * * THIS SUBROUTINE WILL CHECK THE * TERMINATOR CHARACTER FOR INPUT THROUGH * THE 'IHEX' OR 'IDEC' SUBROUTINE IS ONE *  OF THE FOLLOWING: * * CARRIAGE RETURN - RETURN TO STANDARD RETURN ADDRESS * POUND SIGN (#)  - RETURN TO RETURN ADDRESS + 1 * BACK ARROW - RETURN TO RETURN ADDRESS + 2 * UP ARROW  - RETURN TO RETURN ADDRESS + 3 * COMMA (,) - RETURN TO RETURN ADDRESS + 4 * ANYTHING ELSE  - RETURN TO RETURN ADDRESS + 5 * * CALLING SEQUENCE: * JST CHRIN * JMP ? CARRIAGE RETURN R * JMP ? POUND SIGN R+1 * JMP ? BACK ARROW R+2 * JMP ? UP ARROW  R+3 * JMP ? COMMA R+4 * JMP ? ANYTHING ELSE R+5 * * CALLS:  CALLED BY: * NONE QUERIES * ****************************** * CHRIN ENT TERMINATOR CHECK ROUTINE COPY IDCTM2,A GET TTY INPUT CHAR CLSN =CR:,A IS IT C/R JMP *CHRIN YES IMS CHRIN CLSN ='#',A IS IT '#' JMP *CHRIN YES IMS CHRIN CLSN =BCKAR:,A IS IT BACK ARROW JMP *CHRIN YES IMS CHRIN CLSN =UPARR:,A IS IT UP ARROW JMP *CHRIN YES IMS CHRIN CLSN =',',A IS IT COMMA JMP *CHRIN YES IMS CHRIN ITS SOMETHING ELSE JMP *CHRIN * LPOOL TITL CKREAD- CHECK READ DATA INTEGRITY ****************************************** * * CKREAD - CHECK READ DATA INTEGRITY * * CALLING SEQUENCE: COPY LENGTH OF BUFF-1,A * COPY A,BUFLNG *  JST CKREAD * JMP ? GOOD RETURN * JMP ? ERROR RETURN * * CALLS: NONE CALLED BY: TESTD * ********************************************* * CKREAD EQU $ ENT COPY A,CKA COPY Q,CKQ COPY X,CKX COPY Y,CKY COPY =0,A COPY A,TDA ZERO CELL TDA COPY A,TDQ ZERO CELL TDQ COPY =BUFFERR,X INDEX READ BUFFER COPY =BUFFERW,Y INDEX WRITE BUFFER COPY BUFLNG,A GET BUFFER LENGTH CKREADL EQU $ COPY A,BUFLNG UP DATE BUFFER LENGTH COPY 0(X),A GET A READ B  UFFER WORD COPY 0(Y),Q GET A WRITE BUFFER WORD CSK A,Q AND COMPARE JMP CKRD1 NO CMP, FLAG ERROR JMP CKRD1 SAME ADD =1,X BUMP READ BUF PTR ADD =1,Y BUMP WRITE BUF PTR COPY BUFLNG,A JNED A,CKREADL NOT END, INC BUFLNG & GO FOR MORE COPY CKA,A ELSE, RESTORE REGS & RET COPY CKQ,Q COPY CKX,X COPY CKY,Y JMP *CKREAD CKRD1 EQU $ COPY A,TDA SAVE ACTUAL WORD COPY Q,TDQ SAVE EXPECTED WORD COPY CKA,A RESTORE REGS & RET+1 COPY CKQ,Q COPY CKX,X COPY CKY,Y IMS CKREAD RET+1 JMP *CKREAD AND RET * BUFLNG WORD 0 BUFFER LENGTH-1 CELL CKA WORD 0 A-REG CELL CKQ WORD 0 Q-REG CELL CKX WORD 0 X-REG CELL CKY WORD 0 Y-REG CELL TDA WORD 0 ACTUAL WORD CELL TDQ WORD 0 EXPECTED WORD CELL * LPOOL TITL 'CRLF' SUBROUTINE ****************************** * * CRLF - OUTPUT CR/LF * * THIS SUBROUTINE WILL OUTPUT * AN ASCII CARRIAGE RETURN FOLLOWED * BY AN ASCII LINE FEED TO THE * CRT/TTY. * * CALLING SEQUENCE: * JST CRLF * * CALLS: CALLED BY: * OTTY  DUMP * TSTITL * ****************************** * CRLF ENT COPY =CR:,A OUTPUT CR  JST OTTY COPY =LF:,A OUTPUT LF JST OTTY JMP *CRLF * LPOOL TITL DAREAD-READ DATA BLOCK SUBROUTINE ****************************************************** * * DAREAD - READ DATA BLOCKS SUOROUTINE * THIE SUB WILL READ DATA BLOCKS ACCORDING * TO NDBK (# DATA BLK) SPECIFIED * DATA WILL BE READ INDIFINITELY IF DATA *  BLK CNT IS DISABLE. THEREFORE CAUSING * ERROR RET W/ STATUS READ. * * CALLING SEQUENCE: COPY DATA BLK CNT-1,A *  COPY A,NDBK * JST DAREAD * JMP ? ERROR RET *  JMP ? GOOD RET * * CALLS: MAIO CALLED BY: TESTD * READER TESTG * RDSTR * ****************************************************** * DAREAD ENT COPY NDBK,A SET UP NUMBER OF DATA BLOCK MINUS ONE NEG A,A COPY A,BKCNT SAVE IT COPY RINST,A GET AOB INSTRUCTION COPY A,AIOB6 SAVE IT JST AIOBMOD DEVICE AIOB ADDRESS MODIFICATION COPY =BUFFERR%1-1,A GET WRITE BUFFER ADDRESS COPY A,RWBUFCEL SAVE IT JST MAIO SET UP AIOB JST READR READ A BLOCK OF DATA JMP $ WAIT FOR EOB INT NOP JST ITA GET INTERFACE STATUS WORD TBIT 0,A IS EXCEPTION SET? JF OV,DARD1 NO ERROR, GO ON JST RDSTR ERROR! GO READ STATUS JMP $ WAIT FOR EOB INT NOP COPY BUFFERS,A GET STATUS WORD COPY A,ERNO SAVE AS ERROR NUMBER JMP *DAREAD ERROR RETURN DARD1 EQU $ COPY BKCNT,A GET DATA BLOCK COUNT JEQ A,DARDND GET LOST IF DONE COPY =BUFFERR%1-1,A RESTORE BUFFER ADDRESS COPY A,RWBUFCEL SAVE IT JST MAIO RESTORE AIOB SBIT 8,S ENABLE INT COPY =BRRWDO,A GET DATA ONLY BRANCH COMMAND JST OTA SEND IT JMP $ WAIT FOR INT NOP JST ITA GET INTERFACE STATUS WORD TBIT 0,A IS EXCEPTION SET? JF OV,DARD2 NO ERROR, GO ON JST RDSTR ERROR! GO READ STATUS JMP $ WAIT FOR EOB INT NOP COPY BUFFERS,A GET STATUS WORD COPY A,ERNO SAVE AS ERROR NUMBER JMP *DAREAD ERROR RETURN DARD2 COPY CNTDAB,A IS DATA BLOCK COUNT DISABLE? JNE A,$+3 YES, SKIP BUMP IMS BKCNT BUMP BLOCK COUNT NOP JMP DARD1 LOOP BACK FOR MORE DARDND EQU $ IMS DAREAD BUMP ADDRESS JMP *DAREAD GOOD RET * LPOOL TITL DAWRIT-WRITE DATA BLOCKS R  OUTINE ***************************************************** * * DAWRIT - WRITE DATA BLOCKS (512 BYTES/BLOCK) ONTO *  THE STREAMING TAPE ACCORDING TO NDBK * (IF BLK CNT DISABLED, DATA WILL BE WRITTEN * UNTIL EOM. THEN ERR RET W/ STATUS READ.) * * CALLING SEQUENCE: COPY BLOCKS TO BE XFERR-1,A * COPY A,NDBK *  JST DAWRIT * JMP ? BAD RETURN * JMP ? GOOD RETURN * * CALLS: AIOBMOD  CALLED BY: TESTD * MAIO TESTF * RDSTR TESTG * WRITER * ****************************************************** * DAWRIT ENT WRITE DATA BLOCK ROUTINE COPY NDBK,A SET UP NUMBER OF DATA BLOCK MINUS ONE NEG A,A COPY A,BKCNT SAVE IT COPY WINST,A GET AOB INSTRUCTION COPY A,AIOB6 SAVE IT JST AIOBMOD DEVICE AIOB ADRESS MODIFICATION COPY =BUFFERW%1-1,A GET WRITE BUFFER ADDRESS COPY A,RWBUFCEL SAVE IT JST MAIO SET UP AIOB JST WRITER WRITE A BLOCK OF DATA JMP $ WAIT FOR EOB INT NOP JST ITA GET INTERFACE STATUS WORD TBIT 0,A IS EXCEPTION SET? JF OV,DAWRIT1 NO ERROR, GO ON JST RDSTR ERROR! GO READ STATUS JMP $ WAIT FOR EOB INT NOP COPY BUFFERS,A GET STATUS WORD COPY A,ERNO SAVE AS ERROR NUMBER JMP *DAWRIT ERROR RETURN DAWRIT1 EQU $ COPY BKCNT,A GET DATA BLOCK COUNT JEQ A,DAWRND GET LOST IF DONE COPY =BUFFERW%1-1,A RESTORE BUFFER ADDRESS COPY A,RWBUFCEL SAVE IT JST MAIO RESTORE AIOB SBIT 8,S ENABLE INT COPY =BRRWDO,A GET DATA ONLY BRANCH COMMAND JST OTA SEND IT JMP $ WAIT FOR INT NOP JST ITA GET INTERFACE STATUS WORD TBIT 0,A IS EXCEPTION SET? JF OV,DAWRIT2 NO ERROR, GO ON JST RDSTR ERROR! GO READ STATUS JMP $ WAIT FOR EOB INT NOP COPY BUFFERS,A GET STATUS WORD COPY A,ERNO SAVE AS ERROR NUMBER JMP *DAWRIT ERROR RETURN DAWRIT2 COPY CNTDAB,A IS DATA BLOCK COUNT DISABLE? JNE A,$+3 YES, SKIP BUMP IMS BKCNT BUMP BLOCK COUNT NOP JMP DAWRIT1 LOOP BACK FOR MORE DAWRND EQU $ IMS DAWRIT RET ADDR+1 JMP *DAWRIT GOOD RETURN * * BKCNT WORD 0 DATA BLOCK COUNT CELL * CNTDAB WORD 0 BKCNT DISABLE FLAG CELL * NDBKD WORD :3FFF NUMBER OF DATA BLOCK TO BE TRANSFER CELL * NDBK WORD 0 SAME AS NDBKD, BUT USED BY PROGRAM * LPOOL TITL EET-ERASE ENTIRE TAPE ROUTINE ******************************** * * EET - ERASE ENTIRE TAPE * * THIS ROUTINE ERASE THE ENTIRE CARTRIDGE * * * CALLING SEQUENCE: JST EET * * * CALLS: CALLED BY: * IIS TESTE * SOT * * ******************************** * EET ENT ERASE TAPE ROUTINE JST IIS UNIT READY? JMP EETE IDLE NOT SET JMP EETE EXCEPTION SET JST SOT YES, POSITION TO BEGINING OF TAPE JMP EET1 BOM? YES, GO ON COPY =2,A NO, FLAG ERROR COPY A,ERNO CALL ERROR, THEN GO ON JST ERR EET1 SBIT 8,S ENABLE INTERRUPT COPY =ERASE,A GET ERASE COMMAND JST OTA SEND IT COPY =BROT,A GET EXECUTION ADDRESS JST OTA SEND IT JMP *EET EXIT EETE JST ERR CALL ERROR JMP *EET * LPOOL TITL EOB-END OF BLOCK ROUTINE ******************************** * * EOB - END OF BLOCK * * AS OF NOW, THIS ROUTINE ONLY CHECK THE * QIC-2 FORMATTER STATUS WORD. IF THE * EXCEPTION BIT IS SET, CONTROL IS TRANSFERRED * TO 'EER'. * * * CALLING SEQUENCE: AUTO INVOKED BY AIO B * * * CALL: CALL BY: * EER HARDWARE VECTORED BY AIOB *  IIS * RDSTR * STATCK * * ******************************** * EOB ENT END OF BLOCK ROUTINE IMS EOB BUMP RETURN ADDRESS TO EXIT THE JMP $ INSTRUCTION IMS EOB DITTO COPY =1,A SET EOB FLAG COPY A,EOBFLAG JMP *EOB EXIT EOBFLAG WORD 0 EOB FLAG CELL LPOOL TITL ERR-ERROR SUBROUTINE *********************************** * * ERR - ERROR SUBROUTINE * THIS ROUTINE PRINT OUT ERROR MESSAGES * IN THE FOLLOWING FORMAT * * ERROR XX DRIVE STATUS: XXXX MSEEAGES * * CALLS CALLED BY * MSGA EOB TESTA *  FMR TESTB * FMW TESTC * READR TESTD * SOT WRITER * STATCK * * *********************************** * ERR ENT ERROR ROUTINE ENTRY POINT COPY =EROTAB,X INDEX ERROR TABLE COPY EROTT,A GET OFFSET-ACCORDING TO TESTS ADD A,X INDEX TO RIGHT CELL COPY 0(X),A GET ERROR COUNT ADD =1,A UPDATE COPY A,0(X) AND SAVE ERR0 EQU $  COPY CAR,A GET RUN OPTION TBIT 1,A SUSPRESS ERR BIT ON? JT OV,ERRND IF SO, EXIT; JT SS,ERRND OR IF SS ON,EXIT; ELSE CONTINUE COPY ERNO,X GET ERROR NUMBER COPY =13,Q GET RANGE CSM X,Q CHECK RANGE(0-10)? JMP $+2 IN RANGE JMP $+2 OUT OF RANGE JMP ERROR+1 IN RANGE, GO PRINT IT COPY =ERCVTB,X GET ERROR CONVERSION TABLE ADDRESS ERR1 EQU $ COPY 0(X),Q GET MASK WORD COPY 1(X),Y GET ERROR CODE COPY 2(X),A GET ERROR TABLE OFFSET COPY A,ERTEMP COPY ERNO,A LOAD ERROR NUMBER JEQ Q,ERROR END OF TABLE, GET OUT OF HERE AND Q,A MASK OF DON'T CARE BITS CSM A,Y SAME AS ERROR CODE? JMP $+1 NO, IGNORE IT JMP $+2 NO, IGNORE IT JMP ERROR YES, PRINT ERROR MESSAGE ADD =3,X BUMP POINTER JMP ERR1 LOOP BACK FOR MORE ERROR COPY ERTEMP,X SAVE CURRENT ERROR POINTER ADD =ERTBPT,X CALCULATE MESSAGE ADDRESS COPY 0(X),X GO FETCH IT COPY X,MSGADDR SAVE IT AT MESSAGE ADDRESS CELL JST CRLF PRINT A BLANK LINE JST MSGA PRINT HEADING WORD ERHDG JST MSGA PRINT ERROR MESSAGE MSGADDR WORD 0 JST MSGA PRINT 'IOB ADDRESS: ' WORD IOBADR COPY AIOBADR,A GET IOB ADDRESS JST OHEX PRINT IT JST MSGA PRINT 'STATUS WORD' WORD STWD COPY BUFFERS,A GET 1ST STATUS WORD JST OHEX PRINT IT JST MSGA PRINT 'DATA ERROR COUNTER' WORD DECWD COPY BUFFERS+1,A GET 2ND STATUS WORD JST OHEX PRINT IT JST MSGA PRINT 'UNDRRUN COUNTER' WORD URCWD COPY BUFFERS+2,A GET 3RD STATUS WORD JST OHEX PRINT IT JST CRLF PRINT A BLANK LINE ERRND EQU $ COPY CAR,A GET RUN OPTION TBIT 4,A HALT ON ERR BIT ON? JF OV,$+7 EXIT IF NOT ON JST MSGA PRINT 'HALT ON ERROR; CALLER ADDR: ' WORD HLTADR COPY ERR,A GET ADDRSS SUB =1,A JST OHEX HLT JMP *ERR EXIT * ERNO WORD 0 ERROR NUMBER CELL ERTEMP WORD 0 ERROR TABLE OFFSET CELL * LPOOL TITL EROTAL-ERROR TALLIES SUBROUTINE ****************************************************** * * EROTAL - ERROR TALLY SUBROUTINE * THIS SUBROUTINE WILL PRINT ERROR TALLY * AT THE END OF EACH TEST IF OPTION IS * SELECTED. * * TALLY - ERRORS IN THIS TEST: NNNN * * CALLS: NONE   CALLED BY: TEST A THRU E * ****************************************************** * EROTAL ENT COPY CAR,A GET RUN OPTION  TBIT 2,A IS ERR TALLY BIT ON? JF OV,EROTAN IF NOT ON, EXIT JST MSGA WORD EROTMSG PRINT 'ERRORS IN THIS TEST: ' COPY =EROTAB,X INDEX BEGIN OF TABLE COPY EROTT,A GET OFFSET ADD A,X INDEX TO RIGHT CELL COPY 0(X),A GET # OF ERRORS JST ODEC AND PRINT IT JST CRLF PRINT A LINE EROTAN JMP *EROTAL AND EXIT * EROTT WORD 0 OFFSET CELL EROTAB EQU $ ERROR COUNT TABLE ERORA WORD 0 ERR CNT TEST A ERORB WORD 0 ERR CNT TEST B ERORC WORD 0 ERR CNT TEST C ERORD WORD 0 ERR CNT TEST D ERORE WORD 0 ERR CNT TEST E ERORF WORD 0 ERR CNT TEST F ERORG WORD 0 ERR CNT TEST G EROTOL WORD 0 TOTAL ERR CNT FOR ALL TESTS * LPOOL TITL FILLBUF SUBROUTINE *********************************** * * FILLBUF - THIS SUBROUTINE FILL UP * THE WRITE BUFFER (BUFFERW) *  WITH THE CONTENT OF THE A * REGISTER. * * * CALLING SEQUENCE: COPY =DATA PATTERN,A * JST FILLBUF * * * CALLS: NONE CALLED BY: QURY40 * * ************************************* * FILLBUF ENT COPY X,FIBX SAVE X-REG COPY Q,FIBQ SAVE Q-REG COPY =BUFFERW,X INDEX WRITE BUFFER COPY =256,Q GET BUFFER LENGTH COUNT COPY A,0(X) STORE WORD ADD =1,X BUMP BUFFER POINTER JNED Q,$-2 LOOP BACK FOR MORE COPY FIBX,X RESTORE X-REG COPY FIBQ,Q RESTORE Q-REG JMP *FILLBUF EXIT, RETURN TO CALLER FIBQ WORD 0 Q-SAVE CELL FIBX WORD 0 X-SAVE CELL * LPOOL TITL FMR-READ FILE MARK ROUTINE ******************************** * * FMR - READ FILE MARK * * * CALLING SEQUENCE: JST FMR * * * CALL:  CALL BY: * IIS * RDSTR * SELDR * * ******************************** * FMR ENT READ FILE MARK ROUTINE JST IIS UNIT READY? JMP FMRE IDLE=0 JMP FMRE EXCEPTION=1 SBIT 8,S OK, ENABLE INTERRUPT COPY =RFM,A GET COMMAND JST OTA SEND IT COPY =BROT,A GET EXECUTION ADDRESS JST OTA SEND IT JMP *FMR EXIT FMRE JST ERR CALL ERROR JMP *FMR EXIT * LPOOL TITL FMW-WRITE FILE MARK ROUTINE ******************************** * * FMW - WRITE FILE MARK * * * CALLING SEQUENCE: JST FMW * * * CALL: CALL BY: * EOBS EXEC * IIS * RDSTR *  SELDR * * ******************************** * FMW ENT WRITE FILE MARK ROUTINE JST IIS UNIT READY? JMP FMWE IDLE=0 JMP FMWE EXECPTION=1 SBIT 8,S OK, ENABLE INTERRUPT COPY =WFM,A YES, GET COMMAND JST OTA SEND IT COPY =BROT,A GET EXECUTION ADDRESS JST OTA SEND IT JMP *FMW EXIT FMWE JST ERR CALL ERROR JMP *FMW EXIT * LPOOL TITL IIS-INPUT INTERFACE STATUS WORD ROUTINE ******************************** * * IIS - INPUT INTERFACE STATUS WORD ROUTINE. * READY BIT(1) AND IDLE BIT(2) ARE * CHECKED AFTER READ IN THE STATUS WORD. * * * CALLING SEQUENCE: JST IIS * IDLE=0 RETURN *  EXCEPTION=1 RETURN * ALL OK RETURN * * * CALL: CALL BY: *  NONE EET READR * EOB RESYSR *  FMR SELDR * FMW SOT *   INITZ WRITER * RDSTR * * ******************************** * IIS ENT COPY =-3,A SET UP RETRY KOUNT COPY A,KOUNT SAVE IT IISL COPY KOUNT,A GET KOUNT JEQ A,IIS2 KOUNT EXPIRED, FLAG ERROR JST ITA FETCH INTERFACE STATUS WORD TBIT 2,A IS IDLE BIT (2) SET? JT OV,IIS1 YES, GO CHECK EXCEPTION BIT IMS KOUNT NO, BUMP RETRY NOP JMP IISL LOOP BACK AND TRY AGAIN IIS1 EQU $ TBIT 0,A IS EXCEPTION BIT (0) SET? JF OV,IISE NO, GOOD BYE COPY =9,A SET ERROR COPY A,ERNO SAVE IT IMS IIS YES, BUMP RETURN JMP *IIS EXIT WITH R+1 IISE EQU $ IMS IIS BUMP RETURN IMS IIS AGAIN JMP *IIS EXIT WITH R+2 IIS2 COPY =3,Q SET ERNO 3 (IDLE NOT SET) COPY Q,ERNO SAVE IT JMP *IIS EXIT * COUNT WORD 0 COUNT CELL KOUNT WORD 0 KOUNT CELL * LPOOL TITL INITZ-INITIALIZATION ROUTINE ******************************** * * INITZ - INITIALIZATION * * COMMAND THE QIC-2 CONTROLLER TO PERFORM * AN INITIALIZATION PROCEDURES. * * * CALLING SEQUENCE: JST INITZ * * * CALL:  CALL BY: * IIS * * ******************************** * INITZ ENT INITIALIZATION ROUTINE JST IIS UNIT READY? JMP INITZE IDLE NOT SET JMP INITZE EXCEPTION SET SBIT 8,S OK, ENABLE INT COPY =INIT,A YES, GET COMMAND JST OTA SEND IT COPY =BROT,A GET EXECUTION ADDRESS JST OTA SEND IT JMP *INITZ EXIT INITZE JST ERR CALL ERROR JMP *INITZ EXIT * LPOOL TITL I/O SUBROUTINES *********************************** * * OTA * ITA * * * THESE SUBROUTINES PERFORM THE ACTUAL I/O * TO THE CONTROLLER. * * OTA - OUTPUT A REGISTER * ITA - INPUT TO A REGISTER * * * CALLING SEQUENCE: * OTA - COPY =COMMAND,A * JST OTA * * ITA - JST ITA * * * CALLS: CALLED BY: * NONE  ALL MODULES * * ************************************ * OTA EQU $ ENT SBIT 8,S ENABLE INT DA1 OUT A,DIOADCH OUTPUT A REGISTER JMP *OTA * ITA EQU $ ENT SBIT 8,S ENABLE INT DA2 IN DIOADCH,A INPUT TO A REGISTER JMP *ITA * SEL EQU $ ENT COPY A,SEL1 SAVE A-REG COPY =0,A DA3 SELP A,DIOADCH COPY SEL1,A RESTORE A-REG JMP *SEL EXIT SEL1 WORD 0 * OTAD EQU $ ENT SBIT 8,S DA4 OUT A,DIOADCH-1 OUTPUT A-REG AS DATA (FC=0) JMP *OTAD * ITAD EQU $ ENT SBIT 8,S DA5 IN DIOADCH-1,A INPUT DATA TO A-REG JMP *ITAD * LPOOL TITL 'IDEC' SUBROUTINE ****************************** * * IDEC - INPUT DECIMAL NUMBER * *  THIS SUBROUTINE WILL INPUT, FROM * THE CRT/TTY, AN ASCII-DECIMAL VALUE * WHICH IT WILL CONVERT TO BINARY AND * RETURN IT IN THE X REGISTER. * * THIS SUBROUTINE IS EXITED UPON INPUT OF * THE FIRST NON ASCII-DECIMAL CHARACTER, WHICH * IT WILL RETURN IN THE A REGISTER. * * DURING THIS SUBROUTINE, A QUESTION MARK IS * OUTPUT IF THE INPUT VALUE BECOMES GREATER * THAN 32768 AND RESTARTS THE INPUT. * * CALLING SEQUENCE: * JST IDEC * * CALLS: CALLED BY: * IKB QUERIES * OTTY * ****************************** * IDEC ENT INPUT A DECIMAL VALUE IDEC4 COPY =0,A CLEAR VALUE CELL COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT IDEC3 JST IKB GET A CHAR COPY A,IDCTM2 SAVE IT SUB ='0',A SEE IF ASCII 0-9 JLT A,IDEC1 TERMINATOR SUB  =10,A JGE A,IDEC1 TERMINATOR IMS IDCTM3 BUMP COUNT COPY IDCTM1,A ADD TO VALUE SHIFT A,LO,2 TIMES 4 ADD IDCTM1,A TIMES 5 SHIFT A,LO,1 TIMES 10 ADD IDCTM2,A ADD NEW VALUE SUB ='0',A LESS ASCII PART JLT A,IDEC2 MINUS IS BAD COPY A,IDCTM1 STORE NEW VALUE JMP IDEC3 GET NEXT INPUT IDEC1 COPY IDCTM2,A GET TERMINATOR IN A COPY IDCTM1,X GET VALUE IN X JMP *IDEC EXIT IDEC2 COPY ='?',A ERROR JST OTTY OUTPUT "?" JMP IDEC4 START AGAIN * IDCTM1 WORD 0 VALUE CELL IDCTM2 WORD 0 ASCII CHAR CELL IDCTM3 WORD 0 COUNT * LPOOL TITL 'IHEX' SUBROUTINE ****************************** * * IHEX - INPUT HEXADECIMAL NUMBER * * THIS SUBROUTINE WILL INPUT, THROUGH * THE CRT/TTY, AN ASCII-HEX VALUE WHICH * IT WILL CONVERT TO BINARY AND RETURN IT * IN THE X REGISTER. * * THIS SUBROUTINE IS EXITED UPON INPUT OF THE * FIRST NON ASCII-HEX CHARACTER WHICH IT * RETURNS IN THE A REGISTER & IDCTM2 * * CALLING SEQUENCE: * JST IHEX * * CALLS: CALLED BY: * IKB QUERIES * ****************************** * IHEX ENT INPUT HEX VALUE (4-DIGIT) COPY =0,A CLEAR VALUE AREA COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT IHEX3 JST IKB GET A CHAR COPY A,IDCTM2 SAVE IT SUB ='0',A CHECK FOR HEX JLT A,IHEX4 TERMINATOR SUB =9,A ITS 0-9 JLE A,IHEX1 ITS 0-9 SUB =9,A ADD =1,A JLT A,IHEX4 TERMINATOR  SUB =5,A JGT A,IHEX4 TERMINATOR ADD =:F,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 6 COPY A,IDCTM1 IMS IDCTM3 BUMP COUNT JMP IHEX3 GET NEXT CHAR IHEX1 ADD =9,A HEX 0-9 JMP IHEX2 IHEX4 COPY IDCTM2,A LOAD TERMINATOR IN 4 COPY IDCTM1,X LOAD VALUE IN X JMP *IHEX RETURN TITL 'IKB' SUBROUTINE ****************************** * * IKB - INPUT CHARACTER FROM CRT/TTY * * THIS SUBROUTINE WILL INPUT AN * ASCII CHARACTER FROM THE CRT/TTY * AND RETURN IT IN THE A REGISTER. * * CALLING SEQUENCE: * JST IKB * * CALLS: CALLED BY: * NONE TECH TEST *  QUERIES * IDEC * IHEX * ****************************** * IKB ENT INPUT TTY CHAR ROUTINE COPY X,IKBTMP SAVE XR ROTATE X,LO,16 SAVE OV COPY X,IKBTM2 RBIT 8,S  COPY =:8618,A START ECHO,NO INTERRUPT OUT A,DTTYDA%1;1 OUTPUT START & MODES COPY =:100,X RESET CODE IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,4 WORD READY TO OV JF OV,$-2 IF WORD NOT READY IN DTTYDA%1,A GET WORD OUT X,DTTYDA%1;1 RESET TTY AND =:7F,A INPUT CHAR AS 7-BIT ASCII COPY IKBTM2,X RESTORE XR ROTATE X,LO,1 COPY IKBTMP,X RESTORE XR JMP *IKB * IKBTMP WORD 0 XR SAVE CELL IKBTM2 WORD 0 OV SAVE CELL * LPOOL TITL MAIO-MANIPULATE AIOB ROUTINE ******************************** * * * MAIO - AIO BLOCK MANIPULATION * * SET UP THE NECESSORY CONTENT WITHIN THE * AUTO I/O BLOCK. * * * CALLING SEQUENCE: ENTER WITH READ/WRITE/STATUS * BU FFER ADDRESS STORED IN * RWBUFCEL. * * JST MAIO * * * CALL:  CALL BY: * NONE READR * WRITER * * ******************************** * MAIO ENT MANIPULATE AIO BLOCK ROUTINE COPY =BYKNT,Q GET BYTE COUNT NEG Q,Q Q=NEGATIVE BYTE COUNT COPY Q,AIOB6+1 STORE IT COPY RWBUFCEL,X GET BUFFER ADDRESS COPY X,AIOB6+2 STORE IT JST AIOBMOD DEVICE AIOB ADDRESS MODIFICATION JMP *MAIO EXIT * LPOOL TITL 'MOVE' SUBROUTINE ****************************** * * MOVE - MOVE A BLOCK OF DATA * * THIS SUBROUTINE IS USED * TO MOVE A BLOCK OF DATA FROM * ONE AREA OF MEMORY TO ANOTHER. * * ENTER WITH NEGATIVE DATA LENGTH IN * A REGISTER * * CALLING SEQUENCE: * COPY =-DATA LENGTH,A * JST MOVE * WORD AREA1 ADDRESS OF 'FROM AREA' * WORD AREA2 ADDRESS OF 'TO AREA' * * CALLS: CALLED BY: * NONE QUERIES * TESTB * TESTC *  TECH TEST * FILCON * ****************************** * MOVE ENT MOVE WORD ROUTINE COPY A,MOVECT SAVE LENGTH COPY *MOVE,A GET "FROM" ADRESS COPY A,MOVEFM IMS MOVE COPY *MOVE,A GET "TO" ADRESS COPY A,MOVETO IMS MOVE BUMP FOR RTN MOVE1 COPY *MOVEFM,A GET A WORD COPY A,*MOVETO MOVE IT IMS MOVEFM BUMP FROM IMS MOVETO BUMP TO IMS MOVECT BUMP COUNT JMP MOVE1 MOVE NEXT WORD JMP *MOVE EXIT * MOVECT WORD 0 COUNT MOVEFM WORD 0 FROM AD MOVETO WORD 0 TO AD TITL MSGA-PRINT ASCII CHARACTER ROUTINE ******************************** * * MSGA - PRINT ASCI CHARACTER * * THIS SUBROUTINE WILL PRINT AN ASCII MESSAGE TO *  THE CRT/TTY. THE LAST CHARACTER OF THE MESSAGE * MUST BE :FF. * * * CALLING SEQUENCE: JST MSGA *  WORD MESSAGE ADDRESS * * * CALL: CALL BY: * OTTY EXEC *  ERR * * ******************************** * MSGA ENT PRINT A MESSAGE ROUTINE COPY X,MSGA3 SAVE XR COPY *MSGA,X GET MESSAGE ADDRESS SHIFT X,LO,1 IMS MSGA BUMP FOR RETURN MSGA1 SBIT 2,S COPYB 0(X),A GET A CHAR RBIT 2,S CLSN =:FF,A IS IT END OF MESSAGE? JMP MSGA2 YES, EXIT JST OTTY NO, PRINT A CHAR ADD =1,X BUMP POINTER JMP MSGA1 GET NEXT CHAR MSGA2 COPY MSGA3,X RESTORE XR JMP *MSGA EXIT * MSGA3 WORD 0 XR CELL * LPOOL TITL 'OBIN' SUBROUTINE ****************************** * * OBIN - PRINT BINARY NUMBER * * THIS SUBROUTINE WILL PRINT A * BINARY NUMBER TO THE CRT/TTY. * * ENTER WITH THE NUMBER IN THE A * REGISTER * * CALLING SEQUENCE: * COPY =BINARY NUMBER,A * JST OBIN * * CALLS: CALLED BY: * SPACE ERROR * OTTY * ****************************** * OBIN ENT COPY A,OBINA SAVE VALUE JST SPACE COPY ='(',A JST OTTY PRINT OPEN PAREN COPY =' ',A JST OTTY COPY =-4,A COPY A,OBINB SET NIBBLE COUNT OBIN1 COPY =-4,A COPY A,OBINC SET 4-BIT COUNT  OBIN2 COPY OBINA,A SHIFT A,LO,1 PICK OFF NEXT BIT COPY A,OBINA COPY ='0',A ITS EITHER A ZERO JF OV,$+2  ADD =1,A OR A '1' JST OTTY PRINT IT IMS OBINC BUMP 4-BIT COUNTER JMP OBIN2 PRINT NEXT BIT COPY =' ',A PRINT SPACE EACH 4 BITS JST OTTY IMS OBINB BUMP NIBBLE COUNT JMP OBIN1 GET NEXT NIBBLE COPY =')',A ALL DONE JST OTTY PRINT CLOSE PAREN JMP *OBIN EXIT * OBINA WORD 0 VALUE OBINB WORD 0 NIBBLE COUNT OBINC WORD 0 4-BIT COUNT * LPOOL TITL 'ODEC' SUBROUTINE ****************************** * * ODEC - PRINT DECIMAL NUMBER * * THIS SUBROUTINE WILL CONVERT THE * A REGISTER TO AN EQUIVALENT DECIMAL * NUMBER AND PRINT IT TO THE CRT/TTY IF *  IT IS LESS THAN 10000. IF IT IS GREATER * THAN 10000 IT WILL PRINT '****'. * * ENTER WITH NUMBER IN THE A REGISTER * * CALLING SEQUENCE: * COPY =NUMBER,A * JST ODEC * * CALLS: CALLED BY: * MSGA TEST CONTROL * OTTY FMATTR * ERROR * ****************************** * ODEC ENT OUTPUT A 5-DIGIT DECIMAL NO COPY X,ODECX SAVE X-REG COPY A,IDCTM1 SAVE BINARY VALUE CSK A,ODCTBL+1 IS IT GREATER THAN 10,000? JMP ODEC0 NO, CONTINUE NOP JST MSGA YES, PRINT '****' WORD STARS JMP ODEC2 EXIT ODEC0 COPY ODCTBL,A GET TABLE COPY A,IDCTM2 COPY =-5,A COUNT 5 DIGITS COPY A,IDCTM3 ODEC1 COPY IDCTM1,A GET REMAINDER COPY IDCTM2,Y COPY ='0'-1,X SUB 0(Y),A DIVIDE INDECIMAL ADD =1,X ADD TO OUTPUT VALUE  JGE A,$-2 ADD 0(Y),A ADD BACK IN IF GONE NEG COPY A,IDCTM1 STORE REMAINDER COPY X,A JST OTTY PRINT CALCULATED DIGIT IMS IDCTM2 BUMP TABLE PTR IMS IDCTM3 AND COUNT JMP ODEC1 DO NEXT DIGIT ODEC2 COPY ODECX,X RESTORE X-REG JMP *ODEC EXIT AFTER 5 * ODCTBL WORD $+1,10000,1000,100,10,1 ODECX WORD 0 X-REG SAVE * LPOOL TITL OHEX SUBROUTINE *********************************** * * OHEX - OUTPUT HEX NUMBER SUBROUTINE * * THIS SUBROUTINE WILL CONVERT * THE A REGISTER TO AN EQUIVALENT * ASCII HEX NUMBER AND PRINT IT TO * THE CRT/TTY. * * *  ENTER WITH NUMBER IN THE A REGISTER * * * CALLING SEQUENCE: COPY =NUMBER,A * JST OHEX * * * CALLS: CALLED BY: * OTTY ERR * * *********************************** * OHEX ENT COPY X,ODECX SAVE X-REG COPY A,X SAVE FOR OUTPUT COPY =-4,A COPY A,OHEXC1 SHIFT COUNT=4 OHEX1 COPY =-4,A COPY A,OHEXC SHIFT COUNT=4 COPY =0,A CLEAR OUT A-REG OHEX2 ROTATE X,LO,1 MS. BIT OF X ROTATE A,LO,1 BECOMES LS. BIT OF A IMS OHEXC BUMP SHIFT COUNTER JMP OHEX2 AND CONTINUE SUB =10,A FIX TO ASCII JLT A,$+2 NUMERIC? ADD =7,A ADD ='9'+1,A NO, ITS A-F JST OTTY OUTPUT THE DIGIT IMS OHEXC1 4 DIGITS YET? JMP OHEX1 NO. DO ANOTHER COPY ODECX,X YES, RESTORE X-REG JMP *OHEX EXIT * OHEXC1 WORD 0 4-DIGIT COUNTER OHEXC WORD 0 4-BIT SHIFT COUNT * LPOOL TITL 'OTTY' SUBROUTINE ****************************** * * OTTY - PRINT ASCII CHARACTER * * THIS SUBROUTINE WILL PRINT AN * ASCII CHARACTER IN THE LS. BYTE * OF THE  A REGISTER TO THE CRT/TTY * AND LINE PRINTER. * * ENTER WITH CHARACTER IN LS. BYTE OF * THE A REGISTER * * CALLING SEQUENCE: * COPY =CHARACTER,A * JST OTTY * * CALLS: CALLED BY: * NONE  TESTB * CRLF * DUMP *  ERROR * IDEC * MSGA * OBIN *  ODEC * OHEX * SPACE * ****************************** * OTTY ENT COPY A,OTTMP1 SAVE AR COPY X,OTTMP2 SAVE XR RBIT 8,S COPY =:8612,X START, REQUEST TO SEND, DON'T INTERRUPT OUT X,DTTYDA%1;1 START PICO OUT A,DTTYDA%1 SEND WORD COPY =:100,X RESET CODE IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,5 TREMPTY TO OV JT OV,$-2 IF STILL SET IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,5 TREMPTY TO OV JF OV,$-2 IF STILL FULL OUT X,DTTYDA%1;1 RESET PICO COPY CAR,A GET OPTIONS WORD SHIFT A,RO,6 SEE IF LINE PRINTER ON JF OV,OTTY6 IF NOT SET, EXIT OTTY1 JST TIMER SET TIME COPY OTTMP1,A RESTORE AR OUT A,DLPDA%1 START IT COPY =:8610,A LP START UP COMMAND OUT A,DLPDA%1;1 START IT OUT A,DLPDA%1;1 DITTO OTTY2 IN DLPDA%1;1,A INPUT STATUS SHIFT A,RO,1 SHIFT 'BUSY BIT' TO OV JF OV,OTTY5 IF NOT BUSY, EXIT JST TIME DO DELAY JMP OTTY2 LOOP BACK IF NOT DONE COPY OTTMP1,A GET ORIGINAL AR CONTENTS COPY A,OTTMP3 SAVE IT COPY CAR,A GET OPTIONS WORD SHIFT A,RO,6 SET OR NOT SET? JT OV,$+4 COPY =0,A IF NOT SET COPY A,OTTMP4 SAVE AS 0 JMP $+3 COPY =1,A IF SET COPY A,OTTMP4 SAVE AS 1 COPY OTTMP2,A GET ORIGINAL XR CONTENTS COPY A,OTTMP5 SAVE IT COPY OTTY,A GET RETURN ADDRESS  COPY A,OTTMP6 SAVE IT COPY CAR,A RBIT 5,A RESET LP OPTION COPY A,CAR COPY =LPMSG*2,X GET ERROR MESSAGE ADDRESS-'LP TIMEOUT' OTTY3 SBIT 2,S SET BYTE MODE COPYB 0(X),A GET CHAR RBIT 2,S SET WORD MODE CLSN A,=:FF IF END OF MESSAGE, EXIT JMP OTTY4 JST OTTY DISPLAY ON CRT/TTY ADD =1,X INC. MESSAGE ADDRESS JMP OTTY3 LOOP FOR MORE OTTY4 JST IKB INPUT CHAR FROM KEYBOARD COPY OTTMP6,A GET RETURN ADDR COPY A,OTTY SET IT COPY OTTMP4,A GET ORIGINAL LP FLAG CLSN =0,A IS IT 0 OR 1 JMP $+5 COPY CAR,A IF NOT 0 SBIT 5,A SET LP OPTION BIT COPY A,CAR JMP $+4 COPY CAR,A IF 0 RBIT 5,A RESET LP OPTION BIT COPY A,CAR COPY OTTMP5,A GET ORIGINAL XR COPY A,OTTMP2 SET IT COPY OTTMP3,A GET ORIGINAL AR COPY A,OTTMP1 SET IT JMP OTTY1 OTTY5 COPY =:100,X GET LP RESET COMMAND OUT X,DLPDA%1;1 RESET LP SHIFT X,RO,1 WAST SOME TIME JNE X,$-1 DITTO OTTY6 COPY OTTMP1,A RESTORE AR COPY OTTMP2,X RESTORE XR JMP *OTTY RETURN TO CALLER * OTTMP1 WORD 0 AR SAVE CELL OTTMP2 WORD 0 XR SAVE CELL OTTMP3 WORD 0 SAVE AR OTTMP4 WORD 0 SAVE LP FLAG OTTMP5 WORD 0 SAVE XR OTTMP6 WORD 0 SAVE RETURN ADDRESS * LPOOL TITL RDSTR-READ QIC-2 CONTROLLER STATUS ROUTINE ******************************** * * RDSTR - READ STATUS FROM QIC-2 CONTROLLER * * * CALLING SEQUENCE: JST RDSTR * * * CALL: CALL BY: * EOBS FMR * IIS  FMW * STATCK * * ******************************** * RDSTR ENT READ STATUS ROUTINE COPY INST,A GET AIO INSTRUCTI ON COPY A,AIOB6 SAVE IT COPY =6,Q GET STATUS BYTE COUNT NEG Q,Q Q=NEGATIVE BYTE COUNT COPY Q,AIOB6+1 STORE IT COPY =BUFFERS%1-1,X GET STATUS BUFFER ADDRESS COPY X,AIOB6+2 SAVE IT JST AIOBMOD DEVICE AIOB ADDRESS MODIFICATION SBIT 8,S ENABLE EOB INT  COPY =RDST,A GET COMMAND JST OTA SEND IT COPY =BROT,A GET EXECUTION ADDRESS JST OTA DO IT JMP *RDSTR EXIT * INST AIB DIOADCH AUTO WORD INPUT * LPOOL TITL READR-READ DATA BLOCK ******************************** * * READR - READ ONE DATA BLOCK (512 BYTE) FORM * THE STREAMING TAPE. * * * CALLING SEQUENCE: JST READR * * * CALL: CALL BY: * EOBS EXEC * IIS * MAIO * * ******************************** * READR ENT READ DATA BLOCK ROUTINE JST IIS FETCH INTERFACE STATUS JMP READRE IDLE=0 JMP READRE EXCEPTION=1 COPY =READ,A GET READ INSTRUCTION JST OTA SENT IT SBIT 8,S ENABLE INT COPY =BRRW,A GET EXECUTION ADDRESS JST OTA SENT IT JMP *READR EXIT READRE JST ERR CALL ERROR JMP *READR EXIT * LPOOL TITL RESYSR-RESET SYSTEM ROUTINE ******************************** * * RESYSR - RESET SYSTEM * * * CALLING SEQUENCE: JST RESYSR * * * CALL: CALL BY: * IIS  EXEC * * ******************************** * RESYSR ENT RESET SYSTEM ROUTINE COPY =RESYS,A GET COMMAND JST OTA SENT IT JMP *RESYSR EXIT * LPOOL TITL SELDR-SELECT DRIVE SUBROUTINE ******************************** * * SELDR - AS OF NOW, THIS ROUTINE ONLY SELECT * DRIVE ONE. * * * CALLING SEQUENCE: JST SELDR * * * CALL: CALL BY: * IIS EXEC * * ******************************** * SELDR ENT SELECT A DRIVE SBIT 8,S ENABLE INTS COPY =SELDR1,A SELECT DRIVE 1 JST OTA OUTPUT SELECT COMMAND COPY =BROT,A GET EXECUTION ADDRESS JST OTA DO IT JMP *SELDR EXIT * LPOOL TITL SOT-START OF TAPE ******************************** * * SOT - POSITION THE TAPE TO ITS PHYSICAL *  BEGINING USING ONLINE RESET COMMAND. * * * CALLING SEQUENCE: JST SOT * JMP ? GOOD RET OR BAD IIS * ? ? BAD STATUS RET * * * CALL: CALL BY: * IIS  TESTB * TCSUB * EET * * ******************************** * SOT ENT BEGINING OF TAPE JST IIS FETCH INTERFACE STATUS JMP SOTE IDLE=0 JMP SOTE EXCEPTION=1 COPY =RSOL,A GET COMMAND RESET ONLINE JST OTA SENT IT JST ITA GET INTERFACE STATUS TBIT 1,A READY SET? JF OV,$-2 NO, WAIT TILL READY JST RDSTR READ STATUS JMP $ WAIT FOR INT NOP COPY BUFFERS,A GET STATUS WORD AND =:FFFD,A MASK OUT BIT 1 CSK A,=:88 IS IT BOM? NOP IMS SOT NO, BUMP RET ADDR FOR ERR JMP *SOT YES, GOOD SOTE JST ERR CALL ERROR JMP *SOT EXIT * LPOOL TITL SPACE SUBROUTINE ********************************** * * SPACE - PRINT SPACES * * THIS SUBROUTINE WILL PRINT THREE *  ASCII SPACES TO THE CRT/TTY. * * * CALLING SEQUENCE: JST PACE * * * CALLS: OTTY CALLED BY: OBIN * * ********************************** * SPACE ENT COPY A,SPTEMP SAVE A-REG COPY =' ',A PRINT 3 SPACES JST OTTY DO IT JST  OTTY AGAIN JST OTTY ONE MORE COPY SPTEMP,A RESTORE A-REG JMP *SPACE EXIT * SPTEMP WORD 0 A-REG CELL * LPOOL TITL STATCK-CHECK STATUS ROUTINE ******************************** * * STATCK - CHECK STATUS ROUTINE * * THIS ROUTINE CHECKS THE STATUS WORDS * OF THE QIC-2 CONTROLLER. IN THE CASE * OF AN ERROR, CONTROL IS TRANSFERRED TO *  ERROR SUBROUTINE. * * * CALLING SEQUENCE: JST STATCK * * * CALL: CALL BY: * ERR  EXEC * RDSTR * * ********************************* * STATCK ENT STATUS CHECK ROUTINE COPY BUFFERS,A GET STATUS FROM BUFFER TBIT 7,A STAUS BIT(7) OF BYTE 1 SET? JT OV,STATCKE YES, GO ERROR TBIT 15,A STATUS BIT(15) OF BYTE 0 SET? JT OV,STATCKE YES, GO ERROR JMP *STATCK NO, NONE OF THEM IS SET, EXIT STATCKE COPY A,ERNO SAVE ERROR JST ERR CALL ERROR JMP *STATCK * LPOOL TITL TIME-TIMER SUBROUTINE ********************************** * * TIME - TIME DELAY ROUTINE, TAKES APPROXIMATELY * 7 SECONDS IF TIMING CELLS ARE INITIALIZED * BY 'TIMER'. * * *  CALLING SEQUENCE: JST TIME * JMP ? TIME NOT FULLY EXPIRED R * JMP ? TIME FULLY EXPIRED R+1 * * * CALLS: CALLED BY: * NONE TESTB * * *********************************** * TIME ENT TIMER ROUTINE ENTRY POINT IMS TC1 BUMP LSP TIMING CONSTANT JMP *TIME EXIT IMS TC2 BUMP MSP TIMING CONSTANT JMP *TIME EXIT TO CALL +1 IMS TIME SPECIAL RETURN, TIME EXPIRED JMP *TIME EXIT. * TC1 RES 1,0 TC2 RES 1,0 * LPOOL  TITL TIMER-TIMER INITIALIZATION SUBROUTINE *********************************** * * TIMER - INITIALIZES TIMING CELLS FOR 'TIME'. * * * CALLING SEQUENCE: JST TIMER * * * CALLS: CALLED BY: * NONE  TESTB * * ************************************ * TIMER ENT TIMER ENTRY POINT COPY =0,A SET LOW WORD COPY A,TC1 COPY =-7,A COPY A,TC2 SET HIGH WORD JMP *TIMER EXIT * LPOOL * TITL WRITER-WRITE DATA BLOCK ROUTINE ****************************************************** * * WRITER - WRITE A DATA BLOCK (512 BYTES) * ONTO THE STREAMING TAPE. * * CALLING SEQUENCE: JST WRITER * * CALLS: EOBS CALLED BY: DAWRIT * IIS * MAIO * ***************************************************** * WRITER ENT JST IIS FETCH INTERFACE STATUS JMP WRIERE IDLE=0 JMP WRIERE EXCEPTION=1 COPY =WRITE,A OK, GET WRITE COMMAND JST OTA SENT IT SBIT 8,S ENABLE INT COPY =BRRW,A GET EXECUTION ADDR JST OTA SENT IT JMP *WRITER EXIT WRIERE JST ERR CALL ERROR JMP *WRITER EXIT * LPOOL TITL TRAP/EXCEPTION SERVICE ROUTINES ************************************ * * TRAP/EXCEPTION SERVICE ROUTINES * * CONSOLE INTERRUPT SERVICE ROUTINE * * CALLS: * SEL * MSGA * * *********************************** * * POEWR UP * PWRUP: ENT POWER UP SERVICE ROUTINE SIN 3 STATUS INHIBIT COPY =PFMSG,X GET MESSAGE ADDRESS SERVR EQU $ COPY =0,A CLEAR A-REG COPY A,S SET PSW TO ZERO JST SEL RESET/INITIALIZE CONTROLLER COPY X,$+2 STORE MESSAGE ADDRESS JST MSGA PRINT MESSAGE WORD 0 HLT WAIT HERE JMP EXEC * * UNIMPLEMENTED INSTRUCTION TRAP * UNINT: ENT  UNI. INSTR. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INMSG,X GET ARRESS JMP SERVR PRINT IT * * UNINSTALLED MEMORY TRAP * UNMET: ENT UNI. MEM. TRAP ROUTINE SIN 4 STATUS INHIBIT COPY =MEMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * POWER FAIL * PWRFL: ENT POWER FAIL ROUTINE HLT WAIT FOR POWER * * CHAR./NUM. EXCEPTIONS * CHNUE: ENT SIN 4 STATUS INHIBIT COPY =CHMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * STACK OVERFLOW * STKOV: ENT SIN 4 STATUS INHIBIT COPY =STMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * USER TRAP * USETR: ENT SIN 4 STATUS INHIBIT COPY =USMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * SYSTEM TRAP * SYSTR: ENT SIN 4 STATUS INHIBIT COPY =SYMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * ARITHMETIC ERROR * ARIER: ENT SIN 4 STATUS INHIBIT COPY =ARMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * CONSOLE INTERRUPT * CNINT: ENT SIN 2 STATUS INHIBIT COPY =0,A SET A TO ZERO COPY A,S SET PSW TO ZERO OUT A,1 RESET CONSOLE INT LIGHT JST SEL RESET/INITIALIZE CONTROLLER JMP PSU+4 GO TO QUERRIES * LPOOL TITL SYSTEM BUFFERS ******************************** * * SYSTEM BUFFERS * ******************************** * OPTIONS +:20 * BUFFERR RES 260,0 READ BUFFER * BUFFERS RES 4,:FFFF STATUS BUFFER * BUFFERW RES 260,PATN WRITE BUFFER * RWBUFCEL RES 1,0 READ/WRITE CELL * BUFPTR RES 1,0 BUFFER POINTER CELL * * * * SYSTEM WORDS * * * CAR WORD 0 RUN OPTION CELL * MODE WORD 0 TEST MODE(DIAG/TECH TEST) * INFLAG WORD 0 INPUT FLAG CELL * * TSTBUF1 WORD :41,:42,:43,:44,:45,:46,-1,-1 TEST SELECTION TABLE * TSTBUF2 WORD :41,:42,:43,:44,:45,:46,-1,-1 DEFAULT TEST TABLE * TEMP1 WORD 0 TEMPERORARY STORAGE CELL * * * * I/O INSTRUCTIONS ADDRESS TABLE * * DAFRST EQU $ WORD DA1 OUT INSTRUCTION (FC=1) WORD DA2 IN INSTRUCTION (FC=1) WORD DA3 SELP INSTRUCTION WORD WINST AUTO BYTE OUTPUT WORD INST AUTO INPUT BYTE INSTRUCTION WORD RINST AUTO BYTE IMPUT * WORD DA4 OUT INST (FC=0) WORD DA5 IN INST (FC=0) * TITL TEST HEADING AND ENDING MESSAGES ******************************** * * TEST HEADING AND ENDING MESSAGES * ******************************** * ACTWD BYTE ' ACTUAL WORD: ',:FF * DECWD BYTE CR:,LF:,' DATA ERROR COUNTER: ',:FF * EOT BYTE CR:,LF:,'END OF TEST',:FF * EROACC BYTE CR:,LF:,'ACCUMULATED ERRORS: ',:FF * EROTMSG BYTE CR:,LF:,'ERRORS IN THIS TEST: ',:FF * EXWD BYTE ' EXPECTED WORD: ',:FF * HLTADR BYTE CR:,LF:,'HALT ON ERROR; CALLER ADDR: ',:FF * IOBADR BYTE ' IOB ADDRESS: ',:FF * PASSMSG BYTE ' PASS: ',:FF * STARS BYTE '*****',:FF * STWD BYTE ' STATUS WORD: ',:FF * TITLE BYTE CR:,LF:,'QIC-2 DIAGNOSTIC 84-93082-A000',CR:,LF:,CR:,LF: BYTE 'THE CONTENTS HEREOF ARE PROPRIETARY',CR:,LF: BYTE 'TO COMPUTER AUTOMATION, INC. ("CA")',CR:,LF: BYTE 'AND SHALL NOT BE REPRODUCED OR USED',CR:,LF: BYTE 'WITHOUT CA"S PRIOR WRITTEN CONSENT.',CR:,LF: BYTE CR:,LF:,'(C) COMPUTER AUTOMATION, INC. 1983.',CR:,LF:,:FF * TSTA BYTE CR:,LF:,'TEST A',:FF * TSTB BYTE CR:,LF:,'TEST B',:FF * TSTC BYTE CR:,LF:,'TEST C',:FF * TSTD BYTE CR:,LF:,'TEST D',:FF * TSTE BYTE CR:,LF:,'TEST E',:FF * TSTF BYTE CR:,LF:,'TEST F',:FF * TSTG BYTE CR:,LF:,'TEST G',:FF * URCWD BYTE ' UNDERRUN COUNTER: ',:FF TITL ERROR TABLES - MUST BE KEPT IN ORDER ************************************ * * ERROR TABLES - THESE TABLES MUST  BE KEPT IN ORDER * ************************************ * ERCVTB WORD :EFFF,:C000,14 WORD :FFFF,:F000,15 WORD :FF77,:9000,16  WORD :FFFF,:8800,17 WORD :EFFF,:8488,18 WORD :EFFF,:8400,19 WORD :EFFF,:8600,20 WORD :EFFF,:86A0,21 WORD :EFFF,:8EA0,22 WORD :EFE9,:86A8,23 WORD :EFFF,:8100,24 WORD :0FF7,:00C0,25 WORD :0FF7,:0081,26 WORD :EFFF,:8110,27 WORD :0000,:0000,28 ERHDG BYTE 'ERROR ',:FF ERTBPT WORD ERTBL WORD ERTBL1 WORD ERTBL2 WORD ERTBL3 WORD ERTBL4 WORD ERTBL5 WORD ERTBL6 WORD ERTBL7 WORD ERTBL8 WORD ERTBL9 WORD ERTBL10 WORD ERTBL11 WORD ERTBL12 WORD ERTBL13 WORD ERTBL20 WORD ERTBL21 WORD ERTBL22 WORD ERTBL23 WORD ERTBL24 WORD ERTBL25 WORD ERTBL26 WORD ERTBL27 WORD ERTBL28 WORD ERTBL29 WORD ERTBL30 WORD ERTBL31 WORD ERTBL32 WORD ERTBL33 WORD ERTBL34 * ERTBL BYTE '0 PICO NOT READY AFTER 10 NOP (NO EOB INT)',CR:,LF:,:FF * ERTBL1 BYTE '1 UNABLE TO READ INTERFACE STATUS',CR:,LF:,:FF * ERTBL2 BYTE '2 TAPE FAIL TO REWIND',CR:,LF:,:FF * ERTBL3 BYTE '3 IDLE BIT(2) NOT SET',CR:,LF:,:FF * ERTBL4 BYTE '4 UNABLE TO READ FULL STATUS',CR:,LF:,:FF * ERTBL5 BYTE '5 RESET NOT ACCOMPLISHED WITHIN 7 SECONDS',CR:,LF:,:FF * ERTBL6 BYTE '6 RETENSION FAILED',CR:,LF:,:FF * ERTBL7 BYTE '7 FAIL TO READ A FILE MARK',CR:,LF:,:FF * ERTBL8 BYTE '8 FAIL TO WRITE A FILE MARK',CR:,LF:,:FF * ERTBL9 BYTE '9 EXCEPTION BIT SET',CR:,LF:,:FF * ERTBL10 BYTE '10 DATA READ AFTER ERASE',CR:,LF:,:FF ERTBL11 BYTE '11 FAIL TO DETECT ILLEGAL COMMAND',CR:,LF:,:FF ERTBL12 BYTE '12 FAIL TO RESET ONLINE, NO FM DETECTED',CR:,LF:,:FF ERTBL13 BYTE '13 (NOT IMPLEMENTED YET) ',CR:,LF:,:FF * ERTBL20 BYTE '20 DRIVE STATUS: C000 NO CARTRIDGE',CR:,LF:,:FF * ERTBL21 BYTE '21 DRIVE STATUS: F000 NO DRIVE',CR:,LF:,:FF * ERTBL22 BYTE '22 DRIVE STATUS: 9000 WRITE PROTECT',CR:,LF:,:FF * ERTBL23 BYTE '23 DRIVE STATUS: 8800 END OF MEDIA',CR:,LF:,:FF * ERTBL24 BYTE '24 DRIVE STATUS: 8488 READ/WRITE ABORT',CR:,LF:,:FF * ERTBL25 BYTE '25 DRIVE STATUS: 8400 READ ERROR, BAD BLOCK TRANSFERED' BYTE CR:,LF:,:FF * ERTBL26 BYTE '26  DRIVE STATUS: 8600 READ ERROR, FILLER BLOCK' BYTE ' TRANSFERED',CR:,LF:,:FF * ERTBL27 BYTE '27 DRIVE STATUS: 86A0 READ ERROR, NO DATA',CR:,LF:,:FF * ERTBL28 BYTE '28 DRIVE STATUS: 8EA0 READ ERROR, NO DATA AND EOM' BYTE CR:,LF:,:FF * ERTBL29 BYTE '29 DRIVE STATUS: 86A8 READ ERROR, NO DATA AND BOM' BYTE CR:,LF:,:FF ERTBL30 BYTE '30 DRIVE STATUS: 8100 READ A FILE MARK',CR:,LF:,:FF * ERTBL31 BYTE '31 DRIVE STATUS: 00C0 ILLEGAL COMMAND',CR:,LF:,:FF * ERTBL32 BYTE '32 DRIVE STATUS: 0081 POWER ON/RESET',CR:,LF:,:FF * ERTBL33 BYTE '33 DRIVE STATUS: 8110 MARGINAL BLOCK DETECTED',CR:,LF:,:FF * ERTBL34 BYTE '34 UNIMPLEMENTED ERROR',CR:,LF:,:FF TITL CRT/TTY TRAP MESSAGES *********************************** * * CRT/TTY TRAPS MESSAGES * *********************************** * INMSG BYTE CR:,LF:,LF:,'UNIMPLEMENTED INSTRUTION TRAP',CR:,LF:,:FF * MEMSG BYTE CR:,LF:,LF:,'UNINSTALLED MEMORY TRAP',CR:,LF:,:FF * PFMSG BYTE CR:,LF:,LF:,'POWER FAIL',CR:,LF:,:FF * CHMSG BYTE CR:,LF:,LF:,'CHAR./NUM. EXCEPTION',CR:,LF:,:FF * STMSG BYTE CR:,LF:,LF:,'STACK OVERFLOW',CR:,LF:,:FF * USMSG BYTE CR:,LF:,LF:,'USER TRAP',CR:,LF:,:FF * SYMSG BYTE CR:,LF:,LF:,'SYSTEM TRAP',CR:,LF:,:FF * ARMSG BYTE CR:,LF:,LF:,'ARITHMETIC TRAP',CR:,LF:,:FF * TITL QUERY MESSAGES ************* ********************** * * * QUERY MESSAGES * * *********************************** * DEVADMSG BYTE CR:,LF:,'DEVICE ADDRESS & CHANNEL [:FC]?',:FF * FSMSG BYTE CR:,LF:,'DIAG OR TECH TEST ([D]/T)?',:FF * LPMSG BYTE CR:,LF:,'LINE PRINTER TIMED OUT!!!' BYTE CR:,LF:,'GET LINE PRINTER READY...' BYTE CR:,LF:,'KEY IN ANY CHAR TO RESUME...',CR:,LF:,:FF * NDBKMSG BYTE CR:,LF:,'NUMBER OF DATA BLOCKS TO BE TRANSFERED (MUST' BYTE CR:,LF:,' NOT EXCEED TAPE CAPACITY) [:4000]?',:FF * RNOPMSG BYTE CR:,LF:,'RUN OPTIONS (:00-:3F[:00])?',:FF * TSTMSG BYTE CR:,LF:,'TESTS ([A,B,C,D,E,F],G)?',:FF * TTMSG BYTE CR:,LF:,'TECH TEST (A/B/C/D/E/F)?',:FF * UPMSG BYTE CR:,LF:,'DATA PATTERN [:6DB6]?',:FF * END THAT'S ALL FLOKS //AS UF=DF0 MACRO QIC(E) LINK DF1/OS::.SYS=UF/QIC.OBJ(AB=0)+SF/DEBUGS(UL,AB=2500) IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJG:0 O0SEGMENTBLANK oKDEBUG4 im MACRO (F500) @m QIC-2 DIAGNOSTIC - REV.m A0it [ f j n  p t x | g - 0 PpE15 k   y s1  -t-q       ^IIȞIОI؞II IIƍ+HG FKD   4/1Կst s-q D Tl  p T    ⟿2o 1KoJx G AjÏ QG@ k߉kÇQB@  | '1*#qFon ?{N1 s[qpm7 Pf#1LK Y qpnm7q< S –╠@ GkލtsJ q T  ֆԇտտ) Ͽ 0 EPp ^ AѣÀ B C D E F G+^(6⬀@ID ØBk@ r ߃?6C ؟ބ0 Ee51A   J8u .  | vԂ0ѿ U ĿĂ M¾H @J߷v  C  I@Aǧ   '- m{Z5 ?    _ƞ`d ~X6ĿW KKP =O;@I ?6C 222 ;?6E $$44 /d   H ? ! ~ s ˂  6ǿ  ߯p i W6D  6D  ߎg=00 4wW {0F   " op kf p  f WWWW\M  G  F>A6B 94=M 1-@@8( .i- z n & 6ƿ  6D  ™D G2PPi-    /  # l g66ǿe __ U6D RR QO6C HHLL 3`w`F   nlm Œ@) +h4- py@ F Az ֞srpo  A B C D E F <ߧ~6ߡ~ r- z'' %z GzD} A}7` F@  D vZ g |{ #yx _vu ^sr ,pon  ơ ⠂@ K+k⍟f ƌ†_^  z  냭) !6ƿjV 6ƿ WhQP i-   P nm m6ƿhff jV\\`` 6ƿUSWބ hQP?j= N  ؾ 86qod "  ~} z    6onI F QGDf+ s   # ʃ  O6ƿ A   =.- Z1i  s/6ȿu l ms A ƈ‰+U u   vtd  vvtt`  O/6Cx 6 ponmlIi  dOv Mt$ | |  z |  |   J ޑ ņp i ?g x yv    J ki1hfgm wb` d .96 ".n  †@ADžx   }{zxޅޅ ނzq }.{% ' +xq  (  06 ފw ޅq ) e * J )/@+= @ ߌߌsd^' d  x   .ދ|   :ރrfk Φ "I6=I6" Y6Ƃ 6 {Y6C  V]%'  K+xF \ ]I".  10 H ? I@ANj qE 5 x uvtd O k| ffdy n \6B on`l   x r6C 6AyHv ޅ}ބ{zy  {zz 2  .v,t@ / 0   ?t ? p   ?j ?f  ?b ?^ ?Z   0qPbym ABCDEFA BCDEFj i ACTUAL WORD:  DATA ERROR COUNT ER: END OF TEST AC CUMULATED ERRORS: ER RORS IN THIS TEST: E XPECTED WORD: HALT O N ERROR; CALLER ADDR:  IOB ADDRESS: PA SS: ***** STATUS W ORD: QIC-2 DIAGNOST IC 84-93082-A000 THE  CONTENTS HEREOF ARE PROP RIETARY TO COMPUTER AU TOMATION, INC. ("CA")  AND SHALL NOT BE REPRODU CED OR USED WITHOUT CA "S PRIOR WRITTEN CONSENT . (C) COMPUTER AUTOM ATION, INC. 1983. TE ST A TEST B TEST C TEST D TEST E  TEST F TEST  G UN DERRUN COUNTER:  w  醨 ERROR  3 E Q ] m   4H^| *C0 PICO NOT READY A FTER 10 NOP (NO EOB INT)  1 UNABLE TO READ INT ERFACE STATUS 2 TAPE F AIL TO REWIND 3 IDLE B IT(2) NOT SET 4 UNABLE TO READ FULL STATUS   5 RESET NOT ACCOMPLISHED WITHIN 7 SECONDS 6 RE TENSION FAILED 7 FAIL TO READ A FILE MARK  8 FAIL TO WRITE A FILE M ARK 9 EXCEPTION BIT SE T 10 DATA READ AFTER E RASE 11 FAIL TO DETEC T ILLEGAL COMMAND 12 F AIL TO RESET ONLINE, NO  FM DETECTED 13 (NOT IM PLEMENTED YET) 20 DR IVE STATUS: C000 NO CAR TRIDGE 21 DRIVE STAT US: F000 NO DRIVE 22 DRIVE STATUS: 9000 WR ITE PROTECT 23 DRIVE  STATUS: 8800 END OF MED IA 24 DRIVE STATUS:  8488 READ/WRITE ABORT  25 DRIVE STATUS: 8400 READ ERROR, BAD BLOCK  TRANSFERED 26 DRIVE  STATUS: 8600  READ ERROR , FILLER BLOCK TRANSFERE D 27 DRIVE STATUS: 86 A0 READ ERROR, NO DATA  28 DRIVE STATUS: 8EA0 READ ERROR, NO DATA AN D EOM 29 DRIVE STAT US: 86A8 READ ERROR, NO DATA AND BOM 30 DR IVE STATUS: 8100 READ A FILE MARK 31 DRIVE  STATUS: 00C0 ILLEGAL CO MMAND 32 DRIVE STATUS : 0081 POWER ON/RESET  33 DRIVE STATUS: 8110 MARGINAL BLOCK DETECTED 34 UNIMPLEMENTED ERR OR UNIMPLEMENTED I NSTRUTION TRAP UNI NSTALLED MEMORY TRAP  POWER FAIL CHAR. /NUM. EXCEPTION STA CK OVERFLOW USER TR AP SYSTEM TRAP  ARITHMETIC TRAP  DEVICE ADDRESS & CHANNEL [:FC]? DIAG OR TECH T EST ([D]/T)? LINE PRI NTER TIMED OUT!!! GET  LINE PRINTER READY...  KEY IN ANY CHAR TO RESUM E... NUMBER OF DATA BLOCKS TO BE TRANSFERED (MUST NOT EXCEED TAPE CAPACITY) [:4000]? RU N OPTIONS (:00-:3F[:00]) ? TESTS ([A,B,C,D,E,F] ,G)? TECH TEST (A/B/C /D/E/F)?  DATA PATTERN [:6DB6]?TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe820909173251820909173251831018112346e@820909173251820909173251820909173251" e820909173251820909173251820909173251e820909173251820909173251820909173251820909173251820909173251820909173251e?831018112115831018112151831018112245eR831018095037831018095038831018112246e831018095040831018095044831018112250# $ % & ' ( ) * + . QIC ASMQIC JCLQIC OBJ, IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF282090917325100831018094713 831018094713 BF08201 VOLQIC02 STREAMING TAPE DIAG/FORM SOURCE DISK 18/OCT/83