[xiph-cvs] cvs commit: theora/win32/experimental/splayer splayer.dsp splayer.c SDL.dll ReadMe.txt pastreamio.h pastreamio.c .cvsignore

Mauricio Piacentini mauricio at xiph.org
Fri May 23 07:10:18 PDT 2003



mauricio    03/05/23 10:10:18

  Added:       win32/experimental/splayer splayer.dsp splayer.c SDL.dll
                        ReadMe.txt pastreamio.h pastreamio.c .cvsignore
  Log:
  no message

Revision  Changes    Path
1.1                  theora/win32/experimental/splayer/splayer.dsp

Index: splayer.dsp
===================================================================
# Microsoft Developer Studio Project File - Name="splayer" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **

# TARGTYPE "Win32 (x86) Console Application" 0x0103

CFG=splayer - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE 
!MESSAGE NMAKE /f "splayer.mak".
!MESSAGE 
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE 
!MESSAGE NMAKE /f "splayer.mak" CFG="splayer - Win32 Debug"
!MESSAGE 
!MESSAGE Possible choices for configuration are:
!MESSAGE 
!MESSAGE "splayer - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "splayer - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE 

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe

!IF  "$(CFG)" == "splayer - Win32 Release"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir ""
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\include" /I "..\..\..\..\vorbis\include" /I "..\..\..\..\ogg\include" /I "SDL-1.2.5\include" /I "portaudio\pa_common" /I "portaudio\pablio" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 MSVCRT.LIB theora_static.lib ogg_static.lib vorbis_static.lib SDL.lib SDLmain.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /machine:I386 /nodefaultlib /libpath:"..\..\Static_Release" /libpath:"..\..\..\..\ogg\win32\Static_Release" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Release" /libpath:"SDL-1.2.5\lib"

!ELSEIF  "$(CFG)" == "splayer - Win32 Debug"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir ""
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
# ADD CPP /nologo /ML /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\..\..\vorbis\include" /I "..\..\..\..\ogg\include" /I "SDL-1.2.5\include" /I "portaudio\pa_common" /I "portaudio\pablio" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 MSVCRT.lib theora_static_d.lib ogg_static_d.lib vorbis_static_d.lib SDL.lib SDLmain.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib /pdbtype:sept /libpath:"..\..\Static_Debug" /libpath:"..\..\..\..\ogg\win32\Static_Debug" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Debug" /libpath:"SDL-1.2.5\lib"

!ENDIF 

# Begin Target

# Name "splayer - Win32 Release"
# Name "splayer - Win32 Debug"
# Begin Group "Source Files"

# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File

SOURCE=..\..\..\..\..\portaudio\pa_common\pa_lib.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\..\portaudio\pa_win_wmme\pa_win_wmme.c
# End Source File
# Begin Source File

SOURCE=.\pastreamio.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\..\portaudio\pablio\ringbuffer.c
# End Source File
# Begin Source File

SOURCE=.\splayer.c
# End Source File
# End Group
# Begin Group "Header Files"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=.\pastreamio.h
# End Source File
# End Group
# Begin Group "Resource Files"

# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# Begin Source File

SOURCE=.\ReadMe.txt
# End Source File
# End Target
# End Project

<p><p>1.1                  theora/win32/experimental/splayer/splayer.c

Index: splayer.c
===================================================================
/********************************************************************
 *                                                                  *
 * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE.   *
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
 *                                                                  *
 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *
 * by the Xiph.Org Foundation http://www.xiph.org/                  *
 *                                                                  *
 ********************************************************************

  function: example SDL player application; plays Ogg Theora files (with
            optional Vorbis audio second stream)
 * Modified by M. Piacentini http://www.tabuleiro.com
 * from the original Theora Alpha player_sample files 
 *
 * Modified to build on Windows and use PortAudio as the audio
 * and synchronization layer, calculating license.
 *
 * With SDL PortAudio it should be easy to compile on other platforms and
 * sound providers like DirectSound
 * just include the corresponding .c file (see PortAudio main documentation
 * for additional information)

 ********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
#include <math.h>
#include <signal.h>
#include "theora/theora.h"
#include "vorbis/codec.h"
#include <SDL.h>
#include <windows.h>

#include "portaudio.h"
#include "pastreamio.h"

/* Ogg and codec state for demux/decode */
ogg_sync_state   oy; 
ogg_page         og;
ogg_stream_state vo;
ogg_stream_state to;
theora_info      ti;
theora_state     td;
vorbis_info      vi;
vorbis_dsp_state vd;
vorbis_block     vb;
vorbis_comment   vc;

int              theora_p=0;
int              vorbis_p=0;
int              stateflag=0;

FILE * infile = NULL;

/* SDL Video playback structures */
SDL_Surface *screen;
SDL_Overlay *yuv_overlay;
SDL_Rect rect;

/* single frame video buffering */
int          videobuf_ready=0;
ogg_int64_t  videobuf_granulepos=-1;
double       videobuf_time=0;

ogg_int64_t  audiobuf_granulepos=0; /* time position of last sample */

/*for portaudio  */
#define FRAMES_PER_BUFFER (256)
#define PA_SAMPLE_TYPE  paInt16
typedef short SAMPLE;
#define SAMPLE_SILENCE  (0)

PASTREAMIO_Stream  *aOutStream; /* our modified stream buffer*/
SAMPLE      *samples; /*local buffer for samples*/
double latency_sec = 0;

/*initial state of the audio stream*/
int isPlaying = 0;
PaError err;

DWORD initialticks, endticks;

/* Helper; just grab some more compressed bitstream and sync it for
   page extraction */
int buffer_data(ogg_sync_state *oy){
  char *buffer=ogg_sync_buffer(oy,4096);
  int bytes=fread(buffer,1,4096,infile);
  ogg_sync_wrote(oy,bytes);
  return(bytes);
}

tatic void usage(void){
  printf("Usage: splayer ogg_file\n\n"
          "or drag and drop an ogg file over the .exe\n\n");
  exit(1);
}

tatic int open_audio(){
        /* this will open one circular audio stream*/
        /*build on top of portaudio routines*/
        /*implementation on fille pastreamio.c*/

        int        numSamples;
    int        numBytes;

        int minNumBuffers;
        int numFrames;

        minNumBuffers = 2 * Pa_GetMinNumBuffers( FRAMES_PER_BUFFER, vi.rate );
    numFrames = minNumBuffers * FRAMES_PER_BUFFER;
    numFrames = RoundUpToNextPowerOf2( numFrames );

    numSamples = numFrames * vi.channels;
    numBytes = numSamples * sizeof(SAMPLE);

    samples = (SAMPLE *) malloc( numBytes );

        /*store our latency calculation here*/
        latency_sec =  (double) numFrames / vi.rate / vi.channels;
        printf( "Latency: %.04f\n", latency_sec );

        err = OpenAudioStream( &aOutStream, vi.rate, PA_SAMPLE_TYPE,
                           (PASTREAMIO_WRITE | PASTREAMIO_STEREO) );
    if( err != paNoError ) goto error;
    return err;
error:
        CloseAudioStream( aOutStream );
    printf( "An error occured while opening the portaudio stream\n" );
    printf( "Error number: %d\n", err );
    printf( "Error message: %s\n", Pa_GetErrorText( err ) );
    return err;
        
}

tatic int start_audio(){
        err = StartAudioStream(aOutStream);
    if( err != paNoError ) goto error;
        
    return err;
error:
        CloseAudioStream( aOutStream );
    printf( "An error occured while opening the portaudio stream\n" );
    printf( "Error number: %d\n", err );
    printf( "Error message: %s\n", Pa_GetErrorText( err ) );
    return err;
}

tatic int audio_close(void){
        err = CloseAudioStream( aOutStream );
        if( err != paNoError ) goto error;
        
        free(samples);
    return err;

error:
    Pa_Terminate();
    printf( "An error occured while closing the portaudio stream\n" );
    printf( "Error number: %d\n", err );
    printf( "Error message: %s\n", Pa_GetErrorText( err ) );
    return err;
}

<p>double get_time(){
  /*not entirely accurate with the WAVE OUT device, but good enough
  at this stage. Needs to be reworked to account for blank audio
  data written to the stream...*/
  double curtime = (double) (GetAudioStreamTime( aOutStream ) / vi.rate) -  latency_sec;
  if (curtime<0) curtime = 0;
  return  curtime  ;
}

<p>static void open_video(void){
        /*taken from player_sample.c test file for theora alpha*/

  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    printf("Unable to init SDL: %s\n", SDL_GetError());
    exit(1);
  }
  
  screen = SDL_SetVideoMode(ti.width, ti.height, 0, SDL_SWSURFACE);
  if ( screen == NULL ) {
    printf("Unable to set %dx%d video: %s\n", 
            ti.width,ti.height,SDL_GetError());
    exit(1);
  }
  
  yuv_overlay = SDL_CreateYUVOverlay(ti.width, ti.height,
                                     SDL_YV12_OVERLAY,
                                     screen);
  if ( yuv_overlay == NULL ) {
    printf("SDL: Couldn't create SDL_yuv_overlay: %s\n", 
            SDL_GetError());
    exit(1);
  }
  rect.x = 0;
  rect.y = 0;
  rect.w = ti.width;
  rect.h = ti.height;

  SDL_DisplayYUVOverlay(yuv_overlay, &rect);
}

tatic void video_write(void){
        /*taken from player_sample.c test file for theora alpha*/
  int i;
  yuv_buffer yuv;
  theora_decode_YUVout(&td,&yuv);

  /* Lock SDL_yuv_overlay */
  if ( SDL_MUSTLOCK(screen) ) {
    if ( SDL_LockSurface(screen) < 0 ) return;
  }
  if (SDL_LockYUVOverlay(yuv_overlay) < 0) return;
  
  /* let's draw the data (*yuv[3]) on a SDL screen (*screen) */
  /* deal with border stride */
  /* reverse u and v for SDL */
  for(i=0;i<yuv.y_height;i++)
    memcpy(yuv_overlay->pixels[0]+yuv.y_width*i, 
           yuv.y+yuv.y_stride*i, 
           yuv.y_width);
  for(i=0;i<yuv.uv_height;i++){
    memcpy(yuv_overlay->pixels[1]+yuv.uv_width*i, 
           yuv.v+yuv.uv_stride*i, 
           yuv.uv_width);
    memcpy(yuv_overlay->pixels[2]+yuv.uv_width*i, 
           yuv.u+yuv.uv_stride*i, 
           yuv.uv_width);
  }

  /* Unlock SDL_yuv_overlay */
  if ( SDL_MUSTLOCK(screen) ) {
    SDL_UnlockSurface(screen);
  }
  SDL_UnlockYUVOverlay(yuv_overlay);

<p>  /* Show, baby, show! */
  SDL_DisplayYUVOverlay(yuv_overlay, &rect);
  
}

void parseHeaders(){
        /*extracted from player_sample.c test file for theora alpha*/
        ogg_packet op;
  /* Parse the headers */
  /* Only interested in Vorbis/Theora streams */
  while(!stateflag){
    int ret=buffer_data(&oy);
    if(ret==0)break;
    while(ogg_sync_pageout(&oy,&og)>0){
      ogg_stream_state test;
      
      /* is this a mandated initial header? If not, stop parsing */
      if(!ogg_page_bos(&og)){
        /* don't leak the page; get it into the appropriate stream */
        /* this can be done blindly; a stream won't accept a page
             that doesn't bewlong to it */
        if(theora_p)ogg_stream_pagein(&to,&og);
        if(vorbis_p)ogg_stream_pagein(&vo,&og);
        stateflag=1;
        break;
      }
      
      ogg_stream_init(&test,ogg_page_serialno(&og));
      ogg_stream_pagein(&test,&og);
      ogg_stream_packetout(&test,&op);
      
      /* identify the codec: try theora */
      if(!theora_p && theora_decode_header(&ti,&op)>=0){
        /* it is theora */
        memcpy(&to,&test,sizeof(test));
        theora_p=1;
      }else if(!vorbis_p && vorbis_synthesis_headerin(&vi,&vc,&op)>=0){
        /* it is vorbis */
        memcpy(&vo,&test,sizeof(test));
        /* there will be more vorbis headers later... */
        vorbis_p=1;
      }else{
        /* whatever it is, we don't care about it */
        ogg_stream_clear(&test);
      }
    }
  }
  
  /* we're expecting more vorbis header packets. */
  while(vorbis_p && vorbis_p<3){
    int ret;
    while((ret=ogg_stream_packetout(&vo,&op))){
      if(ret<0){
        printf("Error parsing Vorbis stream headers; corrupt stream?\n");
        exit(1);
      }
      
      if(vorbis_synthesis_headerin(&vi,&vc,&op)){
        printf("Error parsing Vorbis stream headers; corrupt stream?\n");
        exit(1);
      }
      vorbis_p++;
      if(vorbis_p==3)break;
      
    }
    
    /* The header pages/packets will arrive before anything else we
       care about, or the stream is not obeying spec */
    
    if(ogg_sync_pageout(&oy,&og)>0){
      ogg_stream_pagein(&vo,&og); /* the vorbis stream will accept
                                     only its own */
    }else{
      int ret=buffer_data(&oy);
      if(ret==0){
        fprintf(stderr,"End of file while searching for Vorbis headers.\n");
        exit(1);
      }
    }
  }

}

int main( int argc, char* argv[] ){
  
  int i,j, smresult;
  ogg_packet op;
  SDL_Event event;
  int hasdatatobuffer = 1;
  int playbackdone = 0;

  int frameNum=0;

  /*takes first argument as file to play*/
  /*this works better on Windows and is more convenient
  for drag and drop ogg files over the .exe*/

  if( argc != 2 )
  {
        usage();
        exit(0);
  }

  infile  = fopen( argv[1], "r" );

#ifdef _WIN32 /* We need to set the file to binary mode. */
   smresult = _setmode( _fileno(infile), _O_BINARY );
   if( smresult == -1 )
      printf( "Cannot set mode" );
   else
      printf( "Input file successfully changed to binary mode\n" );
#endif

  /* start up Ogg stream synchronization layer */
  ogg_sync_init(&oy);

  /* init supporting Vorbis structures needed in header parsing */
  vorbis_info_init(&vi);
  vorbis_comment_init(&vc);

  /*parseHeaders*/
  parseHeaders();

  /* initialize decoders */
  if(theora_p){
    theora_decode_init(&td,&ti);
    printf("Ogg logical stream %x is Theora %dx%d %.02f fps video.\n",
            to.serialno,ti.width,ti.height,
            (double)ti.fps_numerator/ti.fps_denominator);
  }
  if(vorbis_p){
    vorbis_synthesis_init(&vd,&vi);
    vorbis_block_init(&vd,&vb);  
    printf("Ogg logical stream %x is Vorbis %d channel %d Hz audio.\n",
            vo.serialno,vi.channels,vi.rate);
  }else{
    /* tear down the partial vorbis setup */
    vorbis_info_clear(&vi);
    vorbis_comment_clear(&vc);
  }
  /* open audio */
  if(vorbis_p)open_audio();
  /* open video */
  if(theora_p)open_video();

  initialticks = GetTickCount();
  /*our main loop*/
  while(1){

        SDL_Delay(5);

        if (playbackdone == 1 ) break;

        /*break out on SDL quit event*/
    if ( SDL_PollEvent ( &event ) )
    {
      if ( event.type == SDL_QUIT ) break ;
          
    }

        /*get some audio data*/
    while(vorbis_p){
      int ret;
      float **pcm;
          int count = 0;
          int maxBytesToWrite;

          /* is there pending audio? does it fit our circular buffer without blocking?*/
          ret=vorbis_synthesis_pcmout(&vd,&pcm);
          maxBytesToWrite = GetAudioStreamWriteable(aOutStream);

          if (maxBytesToWrite<=FRAMES_PER_BUFFER)
          {
                  /*break out until there is a significant amount of
                  data to avoid a series of small write operations*/
                  break;
      }
      /* if there's pending, decoded audio, grab it */
      if((ret>0)&&(maxBytesToWrite>0)){
        
          for(i=0;i<ret && i<(maxBytesToWrite/vi.channels);i++)
           for(j=0;j<vi.channels;j++){
                int val=(int)(pcm[j][i]*32767.f);
            if(val>32767)val=32767;
            if(val<-32768)val=-32768;
                samples[count]=val;
                count++;
           }
          WriteAudioStream( aOutStream, samples, i );
      vorbis_synthesis_read(&vd,i);

          if(vd.granulepos>=0)
           audiobuf_granulepos=vd.granulepos-ret+i;
          else
           audiobuf_granulepos+=i;

      }else{
        
         /* no pending audio; is there a pending packet to decode? */
          if(ogg_stream_packetout(&vo,&op)>0){
            if(vorbis_synthesis(&vb,&op)==0) /* test for success! */
             vorbis_synthesis_blockin(&vd,&vb);
          }else	/* we need more data; break out to suck in another page */
           break;
      }
    }/*end audio cycle*/
      
    while(theora_p && !videobuf_ready){
      /* get one video packet... */
      if(ogg_stream_packetout(&to,&op)>0){
          theora_decode_packetin(&td,&op);

          videobuf_granulepos=td.granulepos;
          videobuf_time=theora_granule_time(&td,videobuf_granulepos);
          /*update the frame counter*/
          //printf("Frame\n");
          frameNum++;

          /*check if this frame time has not passed yet.
          If the frame is late we need to decode additonal
          ones and keep looping, since theora at
          this stage needs to decode all frames*/

           if(videobuf_time>= get_time())
                /*got a good frame, not late, ready to break out*/
                videobuf_ready=1;

      }else
          /*already have a good frame in the buffer*/
          {
                if (isPlaying == 1)
                {
            printf("end\n");
                  endticks = GetTickCount();
                isPlaying = 0;
                playbackdone = 1;
                }
        break;
          }
    }
 
    if(stateflag && videobuf_ready && (videobuf_time<= get_time())){
                /*time to write our cached frame*/
            video_write();
                videobuf_ready=0;

                /*if audio has not started (first frame) then start it*/
                if ((!isPlaying)&&(vorbis_p)){
                        start_audio();
                        isPlaying = 1;
                }
    }

        /*buffer compressed data every loop */
        //buffer_data(&oy);
        if (hasdatatobuffer)
        {
          hasdatatobuffer=buffer_data(&oy);
      if(hasdatatobuffer==0){
                printf("Ogg buffering stopped, end of file reached.\n");

      }
        }

<p>        if (ogg_sync_pageout(&oy,&og)>0){
                if(theora_p)ogg_stream_pagein(&to,&og);
              if(vorbis_p)ogg_stream_pagein(&vo,&og);
        }

  }

  /*show number of video frames decoded*/
  printf( "Frames decoded: %d\n", frameNum );
  printf( "Milliseconds: %d\n", endticks-initialticks);
  printf("Average fps (%.02f)\n", ((float) frameNum)/((endticks-initialticks)/1000.0f));

  /* tear it all down */
  fclose( infile );

  SDL_Quit();

  if(vorbis_p){
        audio_close();

    ogg_stream_clear(&vo);
    vorbis_block_clear(&vb);
    vorbis_dsp_clear(&vd);
    vorbis_comment_clear(&vc);
    vorbis_info_clear(&vi); 
  }
  if(theora_p){
    ogg_stream_clear(&to);
    theora_clear(&td);
  }
  ogg_sync_clear(&oy);

  printf("\r                                                              "
          "\nDone.\n");
  return(0);

}

<p><p><p><p>1.1                  theora/win32/experimental/splayer/SDL.dll

Index: SDL.dll
===================================================================
MZ
$
ÃëŠÃöÐ"Á:Áu3À[ƒÄâ(+ |V3ö<uL3À‰D$ÆD$‰D$ˆT$	‰D$ˆ\$
‰D$‰D$¡ÈY…ÀtL$QÿЃÄ…ÀtT$¾

‹L$‰ˆœ
ƒà…ÀtW÷Ç

‹N0ÇA0Û‹v0‹F…ÀuÇF@%
ÇD$
3ÒŠV‰L$Óè‹Ê‰T$,‹V3Û#T$Š^Óà3ɉ\$0ŠNÓê‰L$4‹Ë‹^+øÓâ3ÉŠN‰L$$3ÉŠN+ê‰L$ ‹L$#Ù‹L$$Óë‹L$ Óã‹L$L¯ù¯éÁïÇ‹|$P+û¯ùÁíÕ‹l$(Áï‹Í߃ét`It7I……
ÇD$
‹^3À#\$ŠF‰L$$Óê‹È‰D$83ÀŠFÓâ3ɉD$0ŠNÓë‰L$4‹È3À+úŠFÓã3ɉD$ ŠN‹F‰L$‹L$#Á‹L$ Óè‹L$+ëÓà‹L$P¯ù¯éÁÿ׋|$T+ø¯ù‹L$(ÁýÁÿÝǃét`It7I……
ÇD$8
‹^3Ò#\$8ŠV‰L$Óè‹Ê‰T$(3ÒŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$XŠN‹V‰L$‹L$8#Ñ‹L$Óê‹L$XÓâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$XÓú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$XÓú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹D$‹\$@û‰D$‹D$@H…À‰D$@Žà
ÇD$8
‹^3Ò#\$8ŠV‰L$Óè‹Ê‰T$(3ÒŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$XŠN‹V‰L$‹L$8#Ñ‹L$Óê‹L$XÓâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$XÓú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$XÓú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$Aø‰L$‹D$‹L$<3ÒŠ‘3Ò3ÉŠŠH‰T$,3ÒŠP‹D$ƒè‰L$0‰T$4t.HtHt
ÇD$8
‹^3Ò#\$8ŠV‰L$Óè‹Ê‰T$(3ÒŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$XŠN‹V‰L$‹L$8#Ñ‹L$Óê‹L$XÓâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$XÓú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$XÓú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$Aø‰L$‹D$‹L$<3ÒŠ‘3Ò3ÉŠŠH‰T$,3ÒŠP‹D$ƒè‰L$0‰T$4t.HtHt
ÇD$8
‹^3Ò#\$8ŠV‰L$Óè‹Ê‰T$(3ÒŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$XŠN‹V‰L$‹L$8#Ñ‹L$Óê‹L$XÓâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒét|ItEI…
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹D$‹\$@û‹\$8‰D$‹D$DH…À‰D$DŽl
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$‹\$8A‰L$ø‹T$‹L$<3ÀŠ;Á„z
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$‹\$8A‰L$ø‹T$‹L$<3ÀŠ;Á„z
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$‹\$8A‰L$ø‹T$‹L$<3ÀŠ;Á„z
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$‹\$8A‰L$ø‹T$‹L$<3ÀŠ;Á„z
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$‹\$8A‰L$ø‹T$‹L$<3ÀŠ;Á„z
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$‹\$8A‰L$ø‹T$‹L$<3ÀŠ;Á„z
ÇD$@
3ÛŠ^‰L$Óè‹Ë‰\$(‹^3Ò#\$@ŠVÓà3ɉT$ ŠNÓë‰L$$‹Ê3ÒŠVÓã3ɉT$\ŠN‹V‰L$‹L$@#Ñ‹L$Óê‹L$\Óâ‹L$,+ȯÍÁùÁ‹L$0+˯ÍÁùÙ‹L$4+ʯÍÁùÑ‹L$ƒétTIt/Iuy‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàЉëM‹L$Áéˆ93ÀŠF3ÉÁèˆ8ŠNÁéˆ9ë+‹L$\Óú‹L$Óâ‹L$ Óû‹L$$Óã‹L$(Óø‹L$ÓÓàÐf‰‹L$‹D$‹\$8A‰L$øéæòÿÿ‹T$L‹L$‹D$PÊ‹T$T‰L$øé‘òÿÿ_^][ƒÄHÍI
9Pu’9qu‹Iùà
‹T$#Ø‹‹RŠ3ÒŠ‹ú3ÒŠQ‰T$$3ÒŠQŠN
ÓëŠN‰T$(‹V#ÐÓãŠNÓêŠN+߯ÝÓâ‹L$$Áëß‹~+Ñ#ø¯ÕÁêÑŠNÓïŠN‹D$(ãÿ
Ó‹Ç€âüÁè
ЈëƒâçƒãàÁï×ÁêÓŠ‹D$@ˆ‹\$@‹L$‹|$‹D$ CùH‰\$@…À‰|$‰D$ ‹ÏŽV
‹T$#Ø‹‹RŠ3ÒŠ‹ú3ÒŠQ‰T$(3ÒŠQŠN
ÓëŠN‰T$$‹V#ÐÓãŠNÓêŠN+߯ÝÓâ‹L$(Áëß‹~+Ñ#ø¯ÕÁêÑŠNÓïŠN‹D$$ãÿ
Ó‹Ç€âüÁè
ЈëƒâçƒãàÁï×ÁêÓŠ‹D$@ˆ‹L$@‹D$A‰L$@‹L$Á‰D$‹È‹D$ƒèt(HtHt3Àë#‹ë3À3ÒŠAŠQÁàÂ3ÒŠÁàÂë3Àf‹‹T$@3É‹^Š
‹T$#Ø‹‹RŠ3ÒŠ‹ú3ÒŠQ‰T$(3ÒŠQŠN
ÓëŠN‰T$$‹V#ÐÓãŠNÓêŠN+߯ÝÓâ‹L$(Áëß‹~+Ñ#ø¯ÕÁêÑŠNÓïŠN‹D$$ãÿ
Ó‹Ç€âüÁè
ЈëƒâçƒãàÁï×ÁêÓŠ‹D$@ˆ‹L$@‹D$A‰L$@‹L$Á‰D$‹È‹D$ƒèt(HtHt3Àë#‹ë3À3ÒŠAŠQÁàÂ3ÒŠÁàÂë3Àf‹‹T$@3É‹^Š
‹T$#Ø‹‹RŠ3ÒŠ‹ú3ÒŠQ‰T$(3ÒŠQŠN
ÓëŠN‰T$$‹V#ÐÓãŠNÓêŠN+߯ÝÓâ‹L$(Áëß‹~+Ñ#ø¯ÕÁêÑŠNÓïŠN‹D$$ãÿ
Ó‹Ç€âüÁè
ЈëƒâçƒãàÁï×ÁêÓŠ‹D$@ˆ‹L$@‹D$A‰L$@‹L$Á‰D$‹Èé~ûÿÿ‹|$,‹\$0‹T$4‹D$@Ê‹T$8‰D$@é%ûÿÿ_^][ƒÄ,ÃY
ÇD$
‰\$(‹^#Ú‹VÓëŠNÓã‹L$#ÑŠNÓêŠN+߯ØÓâ‹L$$Áëß‹~+сãÿ
Ó€âüÁè
ЈU
ÇD$
‰\$$‹^#Ú‹VÓëŠNÓã‹L$#ÑŠNÓêŠN+߯ØÓâ‹L$(Áëß‹~+сãÿ
Ó€âüÁè
ЈU
ÇD$
‰\$$‹^#Ú‹VÓëŠNÓã‹L$#ÑŠNÓêŠN+߯ØÓâ‹L$(Áëß‹~+сãÿ
Ó€âüÁè
ЈU
ÇD$
‰\$$‹^#Ú‹VÓëŠNÓã‹L$#ÑŠNÓêŠN+߯ØÓâ‹L$(Áëß‹~+сãÿ
Ó€âüÁè
ЈU
]
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
ÇD$ 
ÓëŠNÓã‹L$ +Ú¯ßÁëÚ‹V#ÑŠNÓêŠNãÿ
Ó€âüÁè
ÐëƒâçƒãàÁèÐÁêÓŠ
ˆU
Ý‹ï÷Õ#é‹L$,Ñû#îƒÀ݃Âf‰Xþiÿ‹ZþƒÂƒý~v‹Ïáÿÿ
þéó
Ý‹ï÷Õ#é‹L$,Ñû#îƒÂݍqÿf‰ƒÀƒþ~d‹Ïáÿÿ
#îƒÂÑî#é#óÑéî#Ëé‹L$‰(ƒÀI‰L$uÕ‹t$$…öt:f‹0f‹‹Ï‹îáÿÿ
Ý‹ï÷Õ#éƒÂÑû#îÝf‰ƒÀT$‹L$Á‹L$ I‰L$ …Ðýÿÿ[_^]ƒÄА‹D$ƒì3Ò‹H$SUVŠQ$W‹êý€
ÁêȃâÊ+ϯËÁéρá|à‹ÑÁêÑf‰‹D$$ƒÅƒÆH…À‰D$$Ž
ÁêȃâÊ+ϯËÁéρá|à‹ÑÁêÑf‰ƒÅƒÆ‹U
ÁêȃâÊ+ϯËÁéρá|à‹ÑÁêÑf‰ƒÅƒÆ‹U
ÁêȃâÊ+ϯËÁéρá|à‹ÑÁêÑf‰ƒÆéÍýÿÿ‹|$‹L$‹\$‹T$l
‹k#øÓïŠK‹S#è#ЋD$,ÓçŠKÓíŠKÓåŠKÓêŠKÓâƒè‰T$Ht:HtHt
ÇD$8
3ÒŠV‰L$Óè‹Ê‰T$(‹V3Û#T$8Š^Óà3ɉ\$ ŠNÓê‰L$$‹Ë‹^+øÓâ3ÉŠN‰L$3ÉŠN+ê‰L$‹L$8#Ù‹L$Óë‹L$Óã‹L$@¯ù¯éÁïÇ‹|$H+û¯ùÁíÕ‹l$,Áï‹Í߃éttItKI…¯
‹k#øÓïŠK‹S#è#ЋD$,ÓçŠKÓíŠKÓåŠKÓêŠKÓâƒè‰T$Ht:HtHt
ÇD$8
3ÒŠV‰L$Óè‹Ê‰T$(‹V3Û#T$8Š^Óà3ɉ\$ ŠNÓê‰L$$‹Ë‹^+øÓâ3ÉŠN‰L$3ÉŠN+ê‰L$‹L$8#Ù‹L$Óë‹L$Óã‹L$@¯ù¯éÁïÇ‹|$H+û¯ùÁíÕ‹l$,Áï‹Í߃éttItKI…¯
‹k#øÓïŠK‹S#è#ЋD$,ÓçŠKÓíŠKÓåŠKÓêŠKÓâƒè‰T$Ht:HtHt
ÇD$8
3ÒŠV‰L$Óè‹Ê‰T$(‹V3Û#T$8Š^Óà3ɉ\$ ŠNÓê‰L$$‹Ë‹^+øÓâ3ÉŠN‰L$3ÉŠN+ê‰L$‹L$8#Ù‹L$Óë‹L$Óã‹L$@¯ù¯éÁïÇ‹|$H+û¯ùÁíÕ‹l$,Áï‹Í߃éttItKI…¯
‹k#øÓïŠK‹S#è#ЋD$,ÓçŠKÓíŠKÓåŠKÓêŠKÓâƒè‰T$Ht:HtHt
ÇD$8
3ÀŠF‰L$Óê‹È‰D$(‹F3Û#D$8Š^Óâ3ɉ\$ ŠNÓè‰L$$‹Ë‹^+úÓà3ÉŠN‰L$3ÉŠN+è‰L$‹L$8#Ù‹L$Óë‹L$Óã‹L$@¯ù¯éÁï׋|$H+û¯ùÁíÅ‹l$,Áï‹Í߃étpItGI…¥
#ÐÓêŠOÓâŠO‰T$H‹W#ÐÓêŠOÓâŠO‰T$L‹W#ЋD$ÓêŠOÓâƒè‰T$Pt*HtHt3íë,‹E
#Å3Ò‰L$ŠV3ÛÓèŠ^‹Ê‰T$,‹V#Õ‰\$$Óà3ÉŠN‰L$(Óê‹Ë3ÛŠ^‰\$‹^Óâ3É#ÝŠN‹l$8Óë‰L$ ‹L$Óã‹L$H+ȯÍÁéÁ‹L$L+ʯÍÁéÑ‹L$P+˯ÍÁéÙ‹L$ƒétuItLI…±
#ÐÓêŠOÓâŠO‰T$P‹W#ÐÓêŠOÓâŠO‰T$L‹W#ЋD$ÓêŠOÓâƒè‰T$Ht*HtHt3íë,‹E
#Å3Ò‰L$ŠV3ÛÓèŠ^‹Ê‰T$,‹V#Õ‰\$$Óà3ÉŠN‰L$(Óê‹Ë3ÛŠ^‰\$‹^Óâ3É#ÝŠN‹l$8Óë‰L$ ‹L$Óã‹L$P+ȯÍÁéÁ‹L$L+ʯÍÁéÑ‹L$H+˯ÍÁéÙ‹L$ƒétuItLI…±
#ÐÓêŠOÓâŠO‰T$P‹W#ÐÓêŠOÓâŠO‰T$L‹W#ЋD$ÓêŠOÓâƒè‰T$Ht*HtHt3íë,‹E
#Å3Ò‰L$ŠV3ÛÓèŠ^‹Ê‰T$,‹V#Õ‰\$$Óà3ÉŠN‰L$(Óê‹Ë3ÛŠ^‰\$‹^Óâ3É#ÝŠN‹l$8Óë‰L$ ‹L$Óã‹L$P+ȯÍÁéÁ‹L$L+ʯÍÁéÑ‹L$H+˯ÍÁéÙ‹L$ƒétuItLI…±
#ÐÓêŠOÓâŠO‰T$P‹W#ÐÓêŠOÓâŠO‰T$L‹W#ЋD$ÓêŠOÓâƒè‰T$Ht*HtHt3íë,‹E
#Õ3À‰L$ŠF3ÛÓêŠ^‹È‰D$,‹F#ʼn\$$Óâ3ÉŠN‰L$(Óè‹Ë3ÛŠ^‰\$‹^Óà3É#ÝŠN‹l$8Óë‰L$ ‹L$Óã‹L$P+ʯÍÁéÑ‹L$L+ȯÍÁéÁ‹L$H+˯ÍÁéÙ‹L$ƒétuItLI…±
#ÐÓêŠOÓâŠO‰T$H‹W#ÐÓêŠOÓâŠO‰T$P‹W#ÐÓêŠOÓâŠO
‰T$T‹W#ЋD$ ÓêŠO	Óâƒè‰T$Lt0HtHt
ÇD$8
‹^3Ò‰L$ŠV#ÝÓè‹Ê‰T$03ÒŠVÓà3ɉT$(ŠNÓë‰L$,‹Ê3ÒŠVÓã3ɉT$ŠN‹V‹é‹L$8#Ñ‹ÍÓê‹L$‰l$$‹nÓâ3ÉŠN
‰L$3ÉŠN	‰L$‹L$8#é‹L$Óí‹L$Óå‹L$H+ȉl$8‹l$L¯ÍÁéÁ‹L$P+˯ÍÁéÙ‹L$T+ʯÍÁéÑ‹L$ ƒét{ItRI…µ
#ÐÓêŠOÓâŠO‰T$T‹W#ÐÓêŠOÓâŠO‰T$L‹W#ÐÓêŠOÓâŠO
‰T$H‹W#ЋD$ ÓêŠO	Óâƒè‰T$Pt0HtHt
ÇD$8
‹^3Ò‰L$ŠV#ÝÓè‹Ê‰T$03ÒŠVÓà3ɉT$(ŠNÓë‰L$,‹Ê3ÒŠVÓã3ɉT$ŠN‹V‹é‹L$8#Ñ‹ÍÓê‹L$‰l$$‹nÓâ3ÉŠN
‰L$3ÉŠN	‰L$‹L$8#é‹L$Óí‹L$Óå‹L$T+ȉl$8‹l$P¯ÍÁéÁ‹L$L+˯ÍÁéÙ‹L$H+ʯÍÁéÑ‹L$ ƒét{ItRI…µ
#ÐÓêŠOÓâŠO‰T$T‹W#ÐÓêŠOÓâŠO‰T$L‹W#ÐÓêŠOÓâŠO
‰T$H‹W#ЋD$ ÓêŠO	Óâƒè‰T$Pt0HtHt
ÇD$8
‹^3Ò‰L$ŠV#ÝÓè‹Ê‰T$03ÒŠVÓà3ɉT$(ŠNÓë‰L$,‹Ê3ÒŠVÓã3ɉT$ŠN‹V‹é‹L$8#Ñ‹ÍÓê‹L$‰l$$‹nÓâ3ÉŠN
‰L$3ÉŠN	‰L$‹L$8#é‹L$Óí‹L$Óå‹L$T+ȉl$8‹l$P¯ÍÁéÁ‹L$L+˯ÍÁéÙ‹L$H+ʯÍÁéÑ‹L$ ƒét{ItRI…µ
#ÐÓêŠOÓâŠO‰T$T‹W#ÐÓêŠOÓâŠO‰T$L‹W#ÐÓêŠOÓâŠO
‰T$H‹W#ЋD$ ÓêŠO	Óâƒè‰T$Pt0HtHt
ÇD$8
‹^3Ò‰L$ŠV#ÝÓè‹Ê‰T$03ÒŠVÓà3ɉT$(ŠNÓë‰L$,‹Ê3ÒŠVÓã3ɉT$ŠN‹V‹é‹L$8#Ñ‹ÍÓê‹L$‰l$$‹nÓâ3ÉŠN
‰L$3ÉŠN	‰L$‹L$8#é‹L$Óí‹L$Óå‹L$T+ȉl$8‹l$P¯ÍÁéÁ‹L$L+˯ÍÁéÙ‹L$H+ʯÍÁéÑ‹L$ ƒét{ItRI…µ

<p>‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹D$‹l$<Ø‹D$è‹D$ H‰l$<…À‰D$ Ž·
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$<ÚȉL$<‹D$ƒèt2HtHt3íë1‹L$<‹)ë)‹D$<3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$<3íf‹(‹GŠO
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$<ÚȉL$<‹D$ƒèt2HtHt3íë1‹L$<‹)ë)‹D$<3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$<3íf‹(‹GŠO
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$<ÚȉL$<‹D$ƒèt2HtHt3íë1‹L$<‹)ë)‹D$<3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$<3íf‹(‹GŠO
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$<ÚȉL$<‹D$ƒèt2HtHt3íë1‹L$<‹)ë)‹D$<3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$<3íf‹(‹GŠO
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$<ÚȉL$<‹D$ƒèt2HtHt3íë1‹L$<‹)ë)‹D$<3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$<3íf‹(‹GŠO
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$<ÚȉL$<‹D$ƒèt2HtHt3íë1‹L$<‹)ë)‹D$<3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$<3íf‹(‹GŠO
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$$ŠN
ŠD$Áéˆ3ÉŠN‹D$$Áéˆ3ÒŠVÁêˆë9ŠN‹l$ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$<ÚȉL$<éöÿÿ‹L$(‹T$<‹D$,‹l$4Ñ‹L$0‰T$<Øé­õÿÿ_^][ƒÄ(ÍI
ŠQ€âà
ˆFM…íŽ×
ŠQ€âà
ˆF‹9‹Ç‹×ÁèÁê$€â
ŠQ€âà
ˆF‹9‹Ç‹×ÁèÁê$€â
ŠQ€âà
ˆF‹9‹Ç‹×ÁèÁê$€â
ŠQ€âà
ˆF‹9‹Ç‹×ÁèÁê$€â
ŠQ€âà
ˆF‹9‹Ç‹×ÁèÁê$€â
ŠQ€âà
ˆF‹9‹Ç‹×ÁèÁê$€â
ŠQ€âà
ˆFéÿÿÿ‹D$‹l$™ðé¸þÿÿ‹D$‹ÐH…Ò‰D$„©
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЋD$ˆU
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЈU
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЈU
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЈU
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЈU
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЈU
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЈU
ÓèŠNÁúÒà‹L$0$ã
ЋF#ÁŠNÓèŠN€âüÓàÁø
ЈU
ÓèŠNÁúÓà‹L$$àЋD$EHŠ
‰D$ˆUÿ…ÀŽ¶
ÓèŠNÁúÓà‹L$$àÐEûŠ
ˆUÿ‹Ãƒèt(HtHt3Àë#‹ë3À3ÉŠGŠOÁàÁ3ÒŠÁàÂë3Àf‹‹VŠN#ЉD$0ÓêŠNÓâ‹N#È‹ÁŠNƒâçÓèŠNÓà‹L$0ÁøЋF#ÁŠN
ÓèŠNÁúÓà‹L$$àÐEûŠ
ˆUÿ‹Ãƒèt(HtHt3Àë#‹ë3À3ÉŠGŠOÁàÁ3ÒŠÁàÂë3Àf‹‹VŠN#ЉD$0ÓêŠNÓâ‹N#È‹ÁŠNƒâçÓèŠNÓà‹L$0ÁøЋF#ÁŠN
ÓèŠNÁúÓà‹L$$àÐEûŠ
ˆUÿ‹Ãƒèt(HtHt3Àë#‹ë3À3ÉŠGŠOÁàÁ3ÒŠÁàÂë3Àf‹‹VŠN#ЉD$0ÓêŠNÓâ‹N#È‹ÁŠNƒâçÓèŠNÓà‹L$0ÁøЋF#ÁŠN
ÓèŠNÁúÓà‹L$$àÐEûŠ
ˆUÿ‹Ãƒèt(HtHt3Àë#‹ë3À3ÉŠGŠOÁàÁ3ÒŠÁàÂë3Àf‹‹VŠN#ЉD$0ÓêŠNÓâ‹N#È‹ÁŠNƒâçÓèŠNÓà‹L$0ÁøЋF#ÁŠN
ÓèŠNÁúÓà‹L$$àÐEûŠ
ˆUÿ‹Ãƒèt(HtHt3Àë#‹ë3À3ÉŠGŠOÁàÁ3ÒŠÁàÂë3Àf‹‹VŠN#ЉD$0ÓêŠNÓâ‹N#È‹ÁŠNƒâçÓèŠNÓà‹L$0ÁøЋF#ÁŠN
ÓèŠNÁúÓà‹L$$àÐEûŠ
ˆUÿ‹Ãƒèt(HtHt3Àë#‹ë3À3ÉŠGŠOÁàÁ3ÒŠÁàÂë3Àf‹‹VŠN#ЉD$0ÓêŠNÓâ‹N#È‹ÁŠNƒâçÓèŠNÓà‹L$0ÁøЋF#ÁŠN
ÓèŠNÁúÓà‹L$$àÐEûŠ
ˆUÿé²ûÿÿ‹L$‹D$ ù‹L$$èégûÿÿ_^][ƒÄÐlµ
#ß‹×ÓëŠM‹E#ÇÓã‹M#ÑŠMÓêŠMÓâŠMÓèŠMÓà‹M#ùŠM
ÓïŠM	Óç‹L$ƒétgIt=I…’
úÓãû‰8ë\‹|$43ÉŠN
Áéˆ93ÉŠNÁéˆ93ÒŠVÁêˆ:ë5ŠNÓèŠNÓàŠNÓêŠNÓâŠNÓëŠN
ÂÓãŠN	ÓçŠN
ÃÓç‹L$4Çf‰‹D$‹L$‹T$‹|$4È‹D$úH‰|$4‰L$‰D$…ºþÿÿ‹T$$‹D$,‹|$4‹\$(ø‹D$ ËH‰L$‰|$4‰D$ …ƒþÿÿ_^][ƒÄ Аƒì ‹D$$SUV‹H‹P‹p$‹X‰L$‹H‹n‰T$‹PW‹8‹@(‰L$(‰T$,‹V 3ÉŠN‰D$÷Õ#Õ‰l$4…À‰L$‰T$…»

Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆ‹D$CùH…À‰D$ŽÒ
Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆCù‹Áƒèt*HtHt3íë%‹/ë!3À3ÒŠGŠW‹è3ÀŠÁåêÁåèë3íf‹/‹D$4‹Õ#ЋD$;ÐtB‹FŠN‹V#ÅÓèŠN#ÕÒàŠNÓêŠN$çÒâŠN
Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆCù‹Áƒèt*HtHt3íë%‹/ë!3À3ÒŠGŠW‹è3ÀŠÁåêÁåèë3íf‹/‹D$4‹Õ#ЋD$;ÐtB‹FŠN‹V#ÅÓèŠN#ÕÒàŠNÓêŠN$çÒâŠN
Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆCù‹Áƒèt*HtHt3íë%‹/ë!3À3ÒŠGŠW‹è3ÀŠÁåêÁåèë3íf‹/‹D$4‹Õ#ЋD$;ÐtB‹FŠN‹V#ÅÓèŠN#ÕÒàŠNÓêŠN$çÒâŠN
Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆCù‹Áƒèt*HtHt3íë%‹/ë!3À3ÒŠGŠW‹è3ÀŠÁåêÁåèë3íf‹/‹D$4‹Õ#ЋD$;ÐtB‹FŠN‹V#ÅÓèŠN#ÕÒàŠNÓêŠN$çÒâŠN
Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆCù‹Áƒèt*HtHt3íë%‹/ë!3À3ÒŠGŠW‹è3ÀŠÁåêÁåèë3íf‹/‹D$4‹Õ#ЋD$;ÐtB‹FŠN‹V#ÅÓèŠN#ÕÒàŠNÓêŠN$çÒâŠN
Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆCù‹Áƒèt*HtHt3íë%‹/ë!3À3ÒŠGŠW‹è3ÀŠÁåêÁåèë3íf‹/‹D$4‹Õ#ЋD$;ÐtB‹FŠN‹V#ÅÓèŠN#ÕÒàŠNÓêŠN$çÒâŠN
Àê
‹V#ÕÓêŠNÀèÒâ‹L$€âà
ˆCùé’ûÿÿ‹T$(‹D$,úØéEûÿÿ‹D$‹ÐH…Ò‰D$„P
$üâÿ
$üâÿ
$üâÿ
$üâÿ
$üâÿ
$üâÿ
$üâÿ
$üâÿ

<p>‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹D$‹l$@Ø‹D$è‹D$$H‰l$@…À‰D$$Žý
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$@ÚȉL$@‹D$ƒèt2HtHt3íë1‹L$@‹)ë)‹D$@3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$@3íf‹(;l$„æ
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$@ÚȉL$@‹D$ƒèt2HtHt3íë1‹L$@‹)ë)‹D$@3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$@3íf‹(;l$„æ
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$@ÚȉL$@‹D$ƒèt2HtHt3íë1‹L$@‹)ë)‹D$@3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$@3íf‹(;l$„æ
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$@ÚȉL$@‹D$ƒèt2HtHt3íë1‹L$@‹)ë)‹D$@3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$@3íf‹(;l$„æ
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$@ÚȉL$@‹D$ƒèt2HtHt3íë1‹L$@‹)ë)‹D$@3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$@3íf‹(;l$„æ
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$@ÚȉL$@‹D$ƒèt2HtHt3íë1‹L$@‹)ë)‹D$@3Ò3ÉŠPŠH‹ê3ÒŠÁåéÁåêë	‹D$@3íf‹(;l$„æ
‹W#ÅÓèŠO#ÕÓàŠOÓêŠO‰D$ ‹G#ÅÓâŠOÓèŠOÓà‹L$ƒétsItAI…¢
‹T$ÓåŠN	ÓâŠN
ÅÓâ‰ëh3ɉD$(ŠN
ŠD$ Áéˆ3ÉŠN‹D$(Áéˆ3ÒŠVÁêˆë9ŠN‹l$ ÓèŠNÓàŠNÓêŠNÓâŠNÓíŠN
‹T$ÓåŠN	ÓâŠN
ÅÓâÂf‰‹T$‹D$‹L$@ÚȉL$@é²õÿÿ‹L$,‹T$@‹D$0‹l$4Ñ‹L$8‰T$@Øé]õÿÿ_^][ƒÄ,ÃÎ
‹F#ÕÓêŠN#ÅÒâŠNÓèŠNˆT$$ÒàŠNˆD$‹F#ÅÓèŠNÒàŠN
ˆD$‹F‰D$#ÅÓèŠN	Òà‹L$÷Ñ#Í‹l$0#Í‹l$4;͈D$ „ê
Óâ‰ët3À3ÉŠG
Á舊OŠT$3ÀÁ鈊GŠL$ÁèˆëIŠO	f¶èŠD$ÓåŠO
ÓåŠOÒèŠOf¶ÀÓàŠOèŠD$ÒèŠOf¶ÀÓàŠOÒêŠO
èf¶ÒÓâêf‰+‹D$‹L$(‹l$P%ÿ
‹V#ÅÓèŠN#ÕÒàŠNÓêŠNˆD$$ÒâŠNˆT$‹V#ÕÓêŠNÒâŠN
ˆT$‹V‰T$#ÕÓêŠN	Òâ‹L$÷Ñ#Í‹l$0#Í‹l$4;͈T$ „ê
Óâ‰ët3É3ÒŠO
Á鈊WŠD$3ÉÁꈊOŠT$ÁéˆëIŠO	f¶êŠT$ÓåŠO
ÓåŠOÒêŠOf¶ÒÓâŠOêŠT$ÒêŠOf¶ÒÓâŠOÒèŠO
êf¶ÀÓàèf‰+‹L$‹T$(‹D$Páÿ
‹V#ÅÓèŠN#ÕÒàŠNÓêŠNˆD$$ÒâŠNˆT$‹V#ÕÓêŠNÒâŠN
ˆT$‹V‰T$#ÕÓêŠN	Òâ‹L$÷Ñ#Í‹l$0#Í‹l$4;͈T$ „ê
Óâ‰ët3É3ÒŠO
Á鈊WŠD$3ÉÁꈊOŠT$ÁéˆëIŠO	f¶êŠT$ÓåŠO
ÓåŠOÒêŠOf¶ÒÓâŠOêŠT$ÒêŠOf¶ÒÓâŠOÒèŠO
êf¶ÀÓàèf‰+‹L$‹T$(‹D$Páÿ
‹V#ÅÓèŠN#ÕÒàŠNÓêŠNˆD$$ÒâŠNˆT$‹V#ÕÓêŠNÒâŠN
ˆT$‹V‰T$#ÕÓêŠN	Òâ‹L$÷Ñ#Í‹l$0#Í‹l$4;͈T$ „ê
Óâ‰ët3É3ÒŠO
Á鈊WŠD$3ÉÁꈊOŠT$ÁéˆëIŠO	f¶êŠT$ÓåŠO
ÓåŠOÒêŠOf¶ÒÓâŠOêŠT$ÒêŠOf¶ÒÓâŠOÒèŠO
êf¶ÀÓàèf‰+‹L$‹T$(‹D$Páÿ
‹V#ÅÓèŠN#ÕÒàŠNÓêŠNˆD$$ÒâŠNˆT$‹V#ÕÓêŠNÒâŠN
ˆT$‹V‰T$#ÕÓêŠN	Òâ‹L$÷Ñ#Í‹l$0#Í‹l$4;͈T$ „ê
Óâ‰ët3É3ÒŠO
Á鈊WŠD$3ÉÁꈊOŠT$ÁéˆëIŠO	f¶êŠT$ÓåŠO
ÓåŠOÒêŠOf¶ÒÓâŠOêŠT$ÒêŠOf¶ÒÓâŠOÒèŠO
êf¶ÀÓàèf‰+‹L$‹T$(‹D$Páÿ
‹V#ÅÓèŠN#ÕÒàŠNÓêŠNˆD$$ÒâŠNˆT$‹V#ÕÓêŠNÒâŠN
ˆT$‹V‰T$#ÕÓêŠN	Òâ‹L$÷Ñ#Í‹l$0#Í‹l$4;͈T$ „ê
Óâ‰ët3É3ÒŠO
Á鈊WŠD$3ÉÁꈊOŠT$ÁéˆëIŠO	f¶êŠT$ÓåŠO
ÓåŠOÒêŠOf¶ÒÓâŠOêŠT$ÒêŠOf¶ÒÓâŠOÒèŠO
êf¶ÀÓàèf‰+‹L$‹T$(‹D$Páÿ
‹V#ÅÓèŠN#ÕÒàŠNÓêŠNˆD$$ÒâŠNˆT$‹V#ÕÓêŠNÒâŠN
ˆT$‹V‰T$#ÕÓêŠN	Òâ‹L$÷Ñ#Í‹l$0#Í‹l$4;͈T$ „ê
Óâ‰ët3É3ÒŠO
Á鈊WŠD$3ÉÁꈊOŠT$ÁéˆëIŠO	f¶êŠT$ÓåŠO
ÓåŠOÒêŠOf¶ÒÓâŠOêŠT$ÒêŠOf¶ÒÓâŠOÒèŠO
êf¶ÀÓàèf‰+‹L$‹T$(‹D$Páÿ
‹F#ÕÓêŠN#ÅÒâŠNÓèŠNˆT$$ÒàŠNˆD$‹F#ÅÓèŠNÒàŠN
ˆD$‹F‰D$#ÅÓèŠN	Òà‹L$÷Ñ#Í‹l$0#Í‹l$4;͈D$ „ê
Óâ‰ët3À3ÉŠG
Á舊OŠT$3ÀÁ鈊GŠL$ÁèˆëIŠO	f¶èŠD$ÓåŠO
ÓåŠOÒèŠOf¶ÀÓàŠOèŠD$ÒèŠOf¶ÀÓàŠOÒêŠO
èf¶ÒÓâêf‰+‹D$‹L$(%ÿ
‹L$ AÁø%
+ëRVÿƒÄ…À}
jègŒ
jèGŒ
j軋
jè’‹
jèr‹
Ç@+
ƒËÿ_‹Ã^[YÃûtƒûu,¸
…Òu‹Ç3ÛëÁ*;Át‹Ú;Ç~hXóè‚
Vÿ\+ƒÄ3À^АD$Pjè4üÿÿƒÄ…ÀuƒÈÿÃV‹t$j
Vÿ`+ƒÄ3À^ÍD$PjèôûÿÿƒÄ…ÀuƒÈÿÃÿ%d+D$PjèÔûÿÿƒÄ…Àt!V‹t$Vÿh+Vÿ
è‹5
‹Åf‰V‹Ý™¯ßƒâf‰~ÂfÇ
Ó‹^ˆHI…À}å‹T$‹L$ ‹~‹Ù3ÀÁéó«‹Ëƒáóª‹L$‹
f‰H‹„z‹‚,

f‰P¡„z‹ˆ,
fHfÇ@
‹@‹N;Át‹
t+‹yë	‹t+‹zf‹t$3À¿L$f‹C‰|$$¿Ö¯Á¯Õ‹L$‹S‹T$âÿÿ
‹@‹V;Ât‹t+‹rë¡t+‹p¿T$3Àáÿÿ
Vÿ
_^]3À[ƒÄËD$4‹Ðƒêt(JtJu'‹Á%
Ê
11Q
Ê
ƒìD$


džœ

j
j
j
Vÿ
èW

‰L$¯D$
f‰D$‹D$%ÿÿ
€ûuÆD$‹L$‹T$ VVQRèXv
€ûuÆD$‹L$‹T$ VVQRè’t
_^]3À[ƒÄÊ

|°:Èu9‹T$8ˆD$D$ÆD$PÆD$‰l$‰\$‰|$ ‰T$$èL
Ç 4
Ç 4

f‰N^[Ä

QSUV‹t$3íW‹†”
‰F,_3À^Ät
ƒ;
À‹$õƒÀP¡àvPQÿRP…ÀtPh¤èÿñÿÿƒÄ3À_^][Ä(
|ϸ(
hlé
‹V0ÇB0`_^Аƒì‹T$S‹\$UV‹t$$‹CW‹l$0‹H‹B3Ò‰L$$‹xf‹V¿FЉD$¿‰T$3Òf‹V‰D$Ћ‰T$%
‹–”
‹L$ I‰L$ uÈ_^][á„z‹T$ì
‹@QP‹ÿR|АU‹ìì
‰F‹Æ_^][ÃÇF
f‰ƒÆƒÁOfƒ9
Pÿ(
Pÿ(
萭
‹{X¹€
‹uX¹€
…ÉtŠ\$8t‹JƒÂ…Éuò[ø
ÃPh¸è.éÿÿƒÄ2ÀАD$PèÆþÿÿƒÄ…ÀuƒÈÿËL$‹T$V3À‹q;Ö}2‹t$W;ðt‹y‹<׉>‹t$;ðt	‹y‹|׉>‹q_‰Ö‹I^‰DÑÃVhÔè¼èÿÿƒÄƒÈÿ^АD$PèVþÿÿƒÄ…Àt$‹L$‹T$‹A ;Ð}‹I$Š
ÃPhðè~èÿÿƒÄ2ÀАD$SPèþÿÿƒÄ…À„Á
ÇÜY
…Ét7;Ùt‹L‚@…Éuóë(‹
ÔYWáÿ
ëÆD$
¡ÈYˆT$	…ÀˆL$tL$QÿЃÄ…ÀtT$¿
        ÆD$
ÆD$tŠD4WPèòÿÿƒÄFƒþrì‹Ç_^ƒÄÊL4jÿQèÿñÿÿ%ÿ
_^]3À[ƒÄÃÆD$ë¡Ì{ÆD$;Åt‰-Ì{‹B8˜àYu
_^]3À[ƒÄËD$áÿÿ
‹B‰L$‹J‹Rˆ\$…ÿ‰D$‰L$‰T$ t-¡Ä{…Àt$¹
ùPF
ùxi
‰D$ÿ%
_^]3À[ƒÄÊ\$,°ŠËÆD$IÒà
€eëŠ\$,°ŠËÆD$IÒàŠ
€eöÐ"Á;Õ¢€et¿Ï¿ÖQRf‰5xef‰=zeèQÿÿƒÄ‹D$%ÿ

<p>²ÑèþʨuøˆV‹D$ÆF
ÓýŠÊºÿ

<p>Ê
ȋƃàˆOúÁà‹È‹ÐÁùÁú
Ê
ȋƃàˆOû…
ÐFˆWüþ
ƒËÿV;ÈWˆD$‰D$‰L$Ž…
æÿ
ÓæŠJÆ‹t$æÿ
#ÇÓè3ÉUŠN‹é¹
‹‹QŠL‚‹T$ˆ
‹^‹Q‹L$ŠD‚‹T$ˆÆÿÐV‹t$‹…É…‚
UW‹|$#ÇÓè3ÉŠN‹é¹
ÓàŠN	Ø‹D$ÓàŠN
ÓàØ‹D$‰(éš
Š‘Áë݈‹O3ÛŠ^ŠL‘Áë݈‹O3ÛŠ^ŠL‘Áë݈ë]‹GŠNŠ\ÒëŠN‰D$ Š@f¶ÛÓãŠNÒèŠNf¶ÀÓà‹L$ ØŠŠNÒèŠN
f¶ÀÓàŠN	Ø‹D$ÓàŠN
ÓàØ‹D$f‰(‹\$‹Bë;ÑŒÜþÿÿ][_^ƒÄАì
ƒÂñ3ÉŠJÿ…ÉtÑñë…ö„
ƒÂñ3ÉŠJÿ…ÉtJñë…ö„¶
ƒÂñ3ÉŠJÿ…Ét	ÑñJë…ö„†
ƒÂñ3Éf‹Jþ…ÉtŠñë…ö„W
f‹zÁƒÂ…ÿ‰D$4„G
ŠZÁƒÂ…Ût‹|$`‹Ë‹é‹òøÓÁéó¥‹ÍƒáÃó¤ë…À„
ŠZÁƒÂ…Ût#‹|$`‹é‹ò<GÁéó¥‹Íƒáó¤ÑÃë…À„˜
ŠZÁƒÂ…Ût'‹|$`[‹ò,G‹øý‹éÁéó¥‹Íƒáó¤[ÑÃë…À„
f‹rùƒÂ…ö‰|$L‰t$H‰T$$„M
‰T$‹Ö#Ó‹ùÓê‹L$‰|$ ‹x‰\$<Óâ3ÉŠH‰L$‰T$D3ÒŠP‰T$‹×#ÓÓê‹L$Óâ3ÉŠH‰L$T3ÉŠH‰T$@‹P‰L$X‹L$<‹Ú#Ù‹L$TÓë‹L$XÓã‹L$(#Ñ‹L$TÓê‹L$XÓâ+Ó¯ÕÁêÓ‹\$Óê‹L$TÓâ‹L$(#ù‹ËÓï‹L$Óç‹L$@+ù¯ýÁïù‹L$Óï‹ËÓç#t$(׋|$ ‹ÏÓî‹L$‹\$DÓæ+ó¯õÁîóÓî‹ÏÓæ‹L$,ƒÁ‰L$,Ö‰Qü‹T$0J‰T$0…ãþÿÿ‹t$H‹|$L‹T$$²þë…ÿ„’	
ƒÂù3ÉŠJÿ‰|$<…ɉL$@‰T$$„Ž
3Ò‹ùŠP‰|$ ‰T$‹Ö#Ó‹xÓê‹L$‰\$LÓâ3ÉŠH‰L$‰T$D3ÒŠP‰T$‹×#ÓÓê‹L$Óâ3ÉŠH‰L$T3ÉŠH‰T$H‹P‰L$X‹L$L‹Ú#Ù‹L$TÓë‹L$XÓã‹L$(#Ñ‹L$TÓê‹L$XÓâ+Ó¯ÕÁêÓ‹\$Óê‹L$TÓâ‹L$(#ù‹ËÓï‹L$Óç‹L$H+ù¯ýÁïù‹L$Óï‹Ë‹\$DÓç#t$(׋|$ ‹ÏÓî‹L$Óæ+ó¯õÁîóÓî‹Ï‹|$0ƒÇ‰|$0ÓæÖ‹t$4‹ÊˆƒÆÁéÁêˆNþ‹L$,ˆVÿI‰t$4‰L$,…²þÿÿ‹L$@‹|$<‹T$$ÑùJë…ÿ„–
ŠZÁƒÂ…Û‰D$L‰\$T„1
ƒÂÁ3ÉŠJÿ‰D$X…ɉL$8t‹t$`<F~a‹Ú‹Á+߉D$T3À3Éf‹f‹;‹ð%øàæà
ƒÂù3ÉŠJÿ‰|$,‹ñ‰T$$…ö‰t$<„X
f‹3Ò‰t$(ŠP
‹p3É‹úŠH‹Ö‰L$#Ӌω|$ Óê‹L$‹x‰\$HÓâ3ÉŠH‰L$‰T$@3ÒŠP‰T$‹×#ÓÓê‹L$Óâ3ÉŠH‰L$T3ÉŠH‰T$D‹P‰L$X‹L$H‹Ú#Ù‹L$TÓë‹L$XÓã‹L$(#Ñ‹L$TÓê‹L$XÓâ+Ó¯ÕÁêÓ‹\$Óê‹L$TÓâ‹L$(#ù‹ËÓï‹L$Óç‹L$D+ù¯ýÁïù‹L$Óï‹ËÓç‹L$(׋|$ #ñ‹Ï‹\$@Óî‹L$Óæ+ó¯õÁîóÓî‹ÏÓæ‹L$8ƒÁ‰L$8Öf‰Qþ‹T$4J‰T$4…Øþÿÿ‹t$<‹|$,‹T$$rþë…ÿ„â
3ÛŠZÁƒÂ‰D$X…Û‰\$8„9
ƒÂÁ3ÉŠJÿ‰D$X…ɉL$8t‹t$`<F~a‹Ú‹Á+߉D$T3À3Éf‹f‹;‹ð%|àæà
ŠZÁƒÂ…ÛtG;D$X};‹|$03ö+ø‹Ë…ÿ~‹÷+Î…É~%‹|$X,+ý;Ï~‹Ï‹|$Tòý‹éÁéó¥‹Íƒáó¤ÓÃë…À„»
‹H‰\$3Û#ù‹L$ŠXÓï‰\$‹Ë3ÛŠX‰\$\3ÛŠXÓç‹H‰\$X‹Þ#Ù‹L$\Óë‹L$XÓã3ÉŠH‰L$3ÉŠH‰L$‹H#ñ‹L$Óî‹L$Óæ‹H‰t$8‹ò#ñ‹L$\Óî‹L$XÓæ+ó¯õÁîó‹ÚÓî‹L$\Óæ‹H#Ù‹L$Óë‹L$Óã+߯ÝÁëß‹|$Óë‹L$Óã‹H#Ñ‹ÏÓê‹L$ó‹\$8Óâ+Ó¯ÕÁêÓÓê‹ÏÓâ‹L$ ƒÁ‰L$ ò‹T$$‰qüJ‰T$$…öþÿÿ‹|$<‹\$@‹L$L‹t$(¹ßë…Û„Ž
ÁáÊ3ÒŠw‹ñŠW3ÉŠ‰\$3ÛŠXÁâÑ‹H‰\$‹Ú#Ù‹L$Óë‹L$Óã‹H‰\$83ÛŠX‰\$\3ÛŠX‰\$X‹Ú#Ù‹L$\Óë‹L$XÓã3ÉŠH‰L$‹H‰\$<3ÛŠX#Ñ‹ËÓê‹L$Óâ‹H‰T$@‹Ö#Ñ‹ËÓê‹L$Óâ‹L$@+ѯÕÁêÑ‹L$Óê‹Ë‹ÞÓâ‹H#Ù‹L$\Óë‹L$XÓã‹L$<+Ù¯ÝÁëÙ‹L$XÓë‹L$\ƒÇÓã#pÓ‹\$‹ËÓî‹L$Óæ‹L$8+ñ¯õÁîñ‹L$Óî‹ËÓæÖ‹t$(‹ÊˆWýÁéÁêˆOþ‹L$$ˆWÿƒÆI‰t$(‰L$$…¸þÿÿ‹|$ ‹\$‹L$LûZ‹T$4ë…ÿ„.	
3À3Éf‹f‹3‹Ð%øàâà
3ö‰\$f‹1‹H‹þ3ÛŠX#ù‹L$‰\$Óï‹Ë3ÛŠX‰\$\3ÛŠXÓç‹H‰\$X‹Þ#Ù‹L$\Óë‹L$XÓã3ÉŠH‰L$‹H‰\$43ÛŠX#ñ‹ËÓî‹L$Óæ‹H‰t$8‹ò#ñ‹ËÓî‹L$Óæ‹L$8+ñ¯õÁîñ‹L$Óî‹Ë‹ÚÓæ‹H#Ù‹L$\Óë‹L$XÓã‹L$4+Ù¯ÝÁëÙ‹L$XÓë‹L$\Óãó‹X#Ó‹\$‹ËÓê‹L$Óâ+ׯÕÁê×Óê‹ËÓâ‹L$,ƒÁ‰L$,ò‹T$(f‰qþJ‰T$(…éþÿÿ‹|$‹T$$‹L$LQúë…ÿ„k
3À3Éf‹f‹3‹Ð%|àâà
ˆHŠWˆPŠOˆHŠW
ˆP‹O‰H‹W‰P‹O‰H‹W‰P‹K‹S‹C‰L$‹K‰T$‹Sʉt$4…À‰L$ŽA
ÓíŠHÓåŠJÓíŠJ
ÓåŠHÝ‹h#îÓíŠHÓåŠJÓíŠJÓå‹L$ƒÁ‰L$Ýf‰Yþ‹L$ I‰L$ u‹L$_^][	А‹D$‰D$‹D$…ÀŽ±
Å‹j#ïÓíŠNÓíŠN
ÓåŠJ
Å‹j#ï%ÿÿ
Å‹j#ïÓíŠNÓíŠN
ÓåŠJ
Å‹j#ï%ÿÿ
Ý‹h#îÓíŠJÓíŠJ
ÓåŠH
Ý‹h#îÓí‹L$ƒÁ‰L$Áå݉Yü‹L$ I‰L$ u“‹L$_^][
¯N
ˆE
ÆE
Æ
Óå‹J#ÁŠJÓèŠJÝÓàŠNÓèŠNÓàŠN	Ø‹ÇÓàŠN
ÓàØ‹D$‰‹\$ƒÀƒÃ‰D$‹D$$H‰\$‰D$$…sÿÿÿ‹L$][_	^Ã_À^ЋL$‹T$…ÉŽ»
‹XƒÂ‹ù‰T$ ‹Ñçüÿÿ‹hÁéùŠH#ß#ïÓëŠHÁêâø
ÓãŠHÓíŠHÓåŠNÓíŠNÓåŠHÝ‹h#ïÓíŠHÓåŠNÓíŠNÓåŠN	ÓâŠN
ÝÓâ‹L$ƒÁ‰L$Ú‰Yü‹L$I‰L$…cÿÿÿ‹D$_^]Áà[͍
Óã‹J#éŠJÓíŠJÓåŠNÓíŠNÓå‹JÝ‹è#éŠJÓíŠJÁèÓåŠNÓíŠNÓåŠN	ÓàŠN
ÝÓàØ‹D$‰_üH‰D$u€‹D$_^][ÁàА‹D$VW‹|$PW3öÿ¼ ƒÄ;ÆuWh€èÊ{ÿÿƒÄ‹Æ_^ÃjPÇŒe
jèÿÿƒÄ‹Æ_^ËL$‹T$VW‹|$‹GP‹D$QRPÿ° ‹ðƒÄ…öu‹OöA t
jèØ€ÿÿƒÄ‹Æ_^ÃV‹t$…öt‹F…Àt
‹FPÿРƒÄVÿ
Pÿ
ƒÈÿ_^[‹å]Ã3Àf‹CÇ;ø‰E܍Ó
u‹T$‹D$‰V ‰F$¸
3ÀWf‹B‹|$Áçÿÿ
¸
‹I4‹P;ÊtWVèé¬ÿÿƒÄ…À}	_ƒÈÿ^ƒÄˁâ
T$‰T$ ;¸,
‰ƒÀOt‰ƒÀ‰ƒÀ‰ƒÀëç3Àf‹FЋD$$H‰D$$ë¯3Àf‹E…À„¼
‰ƒÀNt‰ƒÀ‰ƒÀ‰ƒÀëç‹t$$öÃt‹D$f‹L$(f‰LXþ‹D$ ‹\$(3Éf‹HÑNébÿÿÿ3Éf‹M¯Ï…Û‰L$$upöÂuköÁuf¨ubÁù3À‹ñf‹E‰D$$…À„Œ
‰ƒÀKt‰ƒÀ‰ƒÀ‰ƒÀëç‹D$ 3Éf‹H‹D$$ÑH‰D$$ë­3Àf‹E…Àt;‹èë‹L$$‹\$(ŠÃŠû‹Ã‹ñÁà‹úf‹ÃÁéó«‹Îƒáóª‹D$ 3Éf‹HÑMuÍ‹t$ Vè¢
‹D$4$þ‰D$4‹G‹O‹l$,‹WP‹GQ3ÉŠOR‹UP‹EQ‹L$HRPQèoòÿÿ‹ØƒÄ …Ûu_][ƒÄËV…Àt5‹S‹…Òt,‹‹p‹zÁá‹ÁÁéó¥‹Èƒáó¤‹L$4‹C‹|$4‹‹‹‰‹u
÷ÿÿM QSè
WVèmäÿÿƒÄ‹F;ÇtPèMÿÿƒÄ‰~‹F0;ÇtP芦ÿÿƒÄ‰~09~t
¡„zVPÿPTƒÄ‹F;Ç‹=
¾
öE

Çw`#h@!ÿ¡ƒÄ£wÇw
‹‰
 wë
Ç w
éýÿ‹T$‹D$RPj
Çøv
ÿ¢…Àtj
hÜ"èèEÿÿƒÄjj
ÿ¢…À£@wuhÄ"è¿EÿÿƒÄƒÈÿÃjèñ
ÿ¢Аh#èfEÿÿƒÄƒÈÿАU‹ìƒì0S‹]VW‹C‹KÆEÿ
Pÿ
è©òÿÿ£dz‹ÆÇhz
‹U
¸

<p>_^]3À[ƒÄË5„z‹D$0;Ãu‹D$4

çþÿÿ¿‰|$4èÍWÿÿèdÿÿ¡„z9˜4

_^]3À[ƒÄËD$4ƒà
<
…€
_^]3À[ƒÄËWƒÉ
‰èÅÿÿ‹„z3ɃÈÿƒÄ‹’,


ƒá€ùu‹€0
ƒá €ù u‹€0
á
á
‹D$ ‰D$ ‹J‹…Û‰\$u
_^]3À[ƒÄÊI‹t$(¸
‹èÇD$
Pÿ
Pÿ
SVè4
Pÿ
f‹Fƒø„¶
Pÿ
Vÿ
ÿÿƒÄƒÈÿÃ3É3ÒŠpŠƒÀf‰¤z3ÒŠpŠƒÀf‰¦z3Òf‹¢zA;Ê|Î3ÀАƒì‹L$SU‹-œz‹åÿÿ
%ÿ

<p>‰D$ÿ%

‹†˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ËL$‹‘˜
ÃÈÿÃötu"u8uguNu}u“u©u¿uÕuëuv‹D$‹ˆ˜
3ÒŠ‹ù‹¾‹œ–
3ÒŠ‹ù‹¾‹œ–
3ÒŠ‹éƒÇ‹®‹œ–
ÇD$
ÿt$ÿt jXÂ
Ñ
ÿ´¡

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ
Ö¿þ+è¬×Õæ¿É¿`-ákö?a+o ÕÏ¿ÇDEST
Ñ



-- Is DirectX 5.0 or later installed?

<p><p><p><p><p><p>===(=2=<=F=P=Z=c=h=n=x=‚=Œ=–= =ª=´=¾=È=Ò=Ü=æ=ð=ú=>>>">,>6>@>J>T>^>h>r>|>†>>š>¤>®>¸>Â>Ì>Ö>à>ê>ô>þ>???&?0???I?S?]?g?q?{?…??™?£?­?·?Á?Ë?Õ?ß?é?ó?ý?
77+787?7F7U7‡7•7Ÿ7ª7·7ë78-8<8™8¦8°8º8Ä8Î8Ø8â8ì8ö8
999(929<9F9P9Z9d9n9x9‚9Œ9–9 9ª9´9¾9È9Ò9Ü9æ9ð9ú9:::":,:6:@:I:N:T:^:h:r:|:†::š:¤:®:¸:Â:Ì:Ö:à:ê:ô:þ:;;;&;0;:;D;N;X;b;l;v;€;Š;”;ž;¨;²;¼;Æ;Ð;Ú;ä;î;ø;<<< <*<4<><H<R<\<f<p<z<„<Ž<˜<¢<¬<¶<À<Ê<Ô<û<=)=6=J=‰=•=¡=®=¸=Ë=Ó=à=å=ê=ï=ø=
6.626=6A6L6P6[6_6~6…6‹66š6ž6©6­6¸6¼6Ç6Ë6Ö6Ú6å6é6ô6ø677&7-73777B7F7Q7U7`7d7o7s7~7‚77‘7œ7 7¨7¬7´7¸7À7Ä7Ì7Ð7Ø7Ü7ä7è7ð7ô7ü7
;/;<;B;L;U;[;b;t;x;|;Â;±<Ì<ç<=<=j=®=Þ=ö=µ>ð>÷> ?R?
3333 3$3(3ä3ê3ð3ö3û34K4\4c4}4Ž4•4œ4£4²4Ò4ò4û45w5…55—55¬5³5½5ß5A6g6é6H7T7„7œ7§7¸7¿7Ö7Þ738ž;
959N9y9š9à9:$:O:n:’:ž:¤:ê:ö:8;=;D;I;O;T;];b;k;q;w;};;–;œ;Ð;×;ì;ø;þ;<<*<B<X<f<¡<µ<¿<Þ<è<÷<ÿ<=O=[=k=~==Ö=Ý=>%>,><>F>S>`>l>y>>‡>>Ø>?Z?e?u?”?Ä?Ý?î?
111!1*141]122212k2u2ˆ2•2Ÿ2Ç2Õ2ß2õ2û233333"3*3.33393A3G3n3y3 3°3»3Ð3ä3ô344$414:4h4›4¯4ü45*656<6N667B7_7g7v7…7‹7•7œ7±7â738q8}88¡8Ò8ë8÷8999-9A9G9‚9š9¤9µ9Ê9Õ9á9::9:P:Z:y:Ž:—:µ:Ó:â:î:;<;L;™;º;Û;ç;
<<'<b<}<‡<œ<´<¾<Ä<É<Ñ<ã<í<ò<==+=1=W=d=o=€=Š=‘=˜=Ñ=Ü=ä=ñ=
66X6¡6ª6Â6×6å6ú677+7>7E7T7Z7m7y7·7½7×7ä78<8C8H8Q8a8j8s8ƒ8”88·8ô8ü89999919B9_9‚9‰9Ž9œ9¢9§9Á9Í9Ó9Ü9è9ô9ú9:$:?:H:N:l:¼:Ô:ì:ÿ:;S;f; ;½;È;Ë<Ù<ü<Q=m=’=²=Â=J>Q>[>€>Ê>ß>?0?é?ü?
55"515F5M5m55ˆ5«5Æ5Ú5î56646D6^6€6¢6·6Æ6Ø6Ý6ê67
7'707]7¤7Â7ú8999"9/9>9Y9h9…9 9»9ã9
::(:/:8:O:r:®:Ð:
4b4j4½4ò4 6$6(6,6064686<6 at 6D6H6L6P6p6™6ã6ÿ677-757C7T7e7Æ7Õ7888#8=8b8j8™8æ89.9R9a9Ž9Ó9ë93:ù:;;);Œ=“=£=ª=¾=Å=ã=ê=ú=>>">

<p>1.1                  theora/win32/experimental/splayer/ReadMe.txt

Index: ReadMe.txt
===================================================================
05/23/03

Very simple port of the sample player for Windows, for testing.
Uses SDL and portaudio, and provides basic synchronization and correction
for audio latency. This version uses WMME as the audio output device. The
required SDL and portaudio libs/headers are supplied in the tree, as well
as some modified files (circular stream io for example.)

It can be invoked from the command line, or you can drop a Theora file over
the app icon for basic playback.

This example will be updated to a true Win32 app sometime in the future,
hope it is useful for basic testing now.

KNOWN ISSUE- Playback will drift out of synch if there is audio starvation,
and blank samples are written to the output ring buffer. 

mauricio at xiph.org

<p>1.1                  theora/win32/experimental/splayer/pastreamio.h

Index: pastreamio.h
===================================================================
#ifndef _PASTREAMIO_H
#define _PASTREAMIO_H

#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */

/*
 * $Id: pastreamio.h,v 1.1 2003/05/23 14:10:17 mauricio Exp $
 * PASTREAMIO.h
 * Modified version of Portable Audio Blocking read/write utility.
 *
 * Modified by Mauricio Piacentini http://www.tabuleiro.com
 * from the original PABLIO files
 * Modified to support only playback buffers, direct access
 * to the underlying stream time and remove blocking operations
 *
 * Original Author: Phil Burk, http://www.softsynth.com/portaudio/
 *
 * Include file for PASTREAMIO.
 * Built on top of PortAudio, the Portable Audio Library.
 * For more information see: http://www.audiomulch.com/portaudio/
 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge,
 * publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * Any person wishing to distribute modifications to the Software is
 * requested to send the modifications to the original developer so that
 * they can be incorporated into the canonical version.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "portaudio.h"
#include "ringbuffer.h"
#include <string.h>

typedef struct
{
    RingBuffer   outFIFO;
    PortAudioStream *stream;
    int          bytesPerFrame;
    int          samplesPerFrame;
}
PASTREAMIO_Stream;

/* Values for flags for OpenAudioStream(). */
/* Keep PABLIO ones*/

#define PASTREAMIO_READ     (1<<0)
#define PASTREAMIO_WRITE    (1<<1)
#define PASTREAMIO_READ_WRITE    (PABLIO_READ|PABLIO_WRITE)
#define PASTREAMIO_MONO     (1<<2)
#define PASTREAMIO_STEREO   (1<<3)

/************************************************************
 * Write data to ring buffer.
 * Will not return until all the data has been written.
 */
long WriteAudioStream( PASTREAMIO_Stream *aStream, void *data, long numFrames );

/************************************************************
 * Read data from ring buffer.
 * Will not return until all the data has been read.
 */
long ReadAudioStream( PASTREAMIO_Stream *aStream, void *data, long numFrames );

/************************************************************
 * Return the number of frames that could be written to the stream without
 * having to wait.
 */
long GetAudioStreamWriteable( PASTREAMIO_Stream *aStream );

/************************************************************
 * Return the number of frames that are available to be read from the
 * stream without having to wait.
 */
long GetAudioStreamReadable( PASTREAMIO_Stream *aStream );

/************************************************************
 * Opens a PortAudio stream with default characteristics.
 * Allocates PASTREAMIO_Stream structure.
 *
 * flags parameter can be an ORed combination of:
 *    PASTREAMIO_WRITE,
 *    and either PASTREAMIO_MONO or PASTREAMIO_STEREO
 */
PaError OpenAudioStream( PASTREAMIO_Stream **aStreamPtr, double sampleRate,
                         PaSampleFormat format, long flags );

PaError StartAudioStream( PASTREAMIO_Stream *aStream);

PaTimestamp GetAudioStreamTime( PASTREAMIO_Stream *aStream );

PaError CloseAudioStream( PASTREAMIO_Stream *aStream );

unsigned long RoundUpToNextPowerOf2( unsigned long n );

#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _PASTREAMIO_H */

<p><p>1.1                  theora/win32/experimental/splayer/pastreamio.c

Index: pastreamio.c
===================================================================
/*
 * $Id: pastreamio.c,v 1.1 2003/05/23 14:10:17 mauricio Exp $
 * PASTREAMIO.h
 * Modified version of Portable Audio Blocking read/write utility.
 *
 * Modified by Mauricio Piacentini http://www.tabuleiro.com
 * from the original PABLIO files
 * Modified to support only playback buffers, direct access
 * to the underlying stream time and remove blocking operations
 *
 * Original Author: Phil Burk, http://www.softsynth.com
 *
 * This program uses the PortAudio Portable Audio Library.
 * For more information see: http://www.audiomulch.com/portaudio/
 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge,
 * publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * Any person wishing to distribute modifications to the Software is
 * requested to send the modifications to the original developer so that
 * they can be incorporated into the canonical version.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "portaudio.h"
#include "ringbuffer.h"
#include "pastreamio.h"
#include <string.h>

/************************************************************************/
/******** Constants *****************************************************/
/************************************************************************/

#define FRAMES_PER_BUFFER    (256)

/************************************************************************/
/******** Prototypes ****************************************************/
/************************************************************************/

tatic int audioIOCallback( void *inputBuffer, void *outputBuffer,
                               unsigned long framesPerBuffer,
                               PaTimestamp outTime, void *userData );
static PaError PASTREAMIO_InitFIFO( RingBuffer *rbuf, long numFrames, long bytesPerFrame );
static PaError PASTREAMIO_TermFIFO( RingBuffer *rbuf );

/************************************************************************/
/******** Functions *****************************************************/
/************************************************************************/

/* Called from PortAudio.
 * Read and write data only if there is room in FIFOs.
 */
static int audioIOCallback( void *inputBuffer, void *outputBuffer,
                               unsigned long framesPerBuffer,
                               PaTimestamp outTime, void *userData )
{
    PASTREAMIO_Stream *data = (PASTREAMIO_Stream*)userData;
    long numBytes = data->bytesPerFrame * framesPerBuffer;
    (void) outTime;
        (void) inputBuffer;

    if( outputBuffer != NULL )
    {
        int i;
        int numRead = RingBuffer_Read( &data->outFIFO, outputBuffer, numBytes );
        /* Zero out remainder of buffer if we run out of data. */
        for( i=numRead; i<numBytes; i++ )
        {
            ((char *)outputBuffer)[i] = 0;
        }
    }

    return 0;
}

/* Allocate buffer. */
static PaError PASTREAMIO_InitFIFO( RingBuffer *rbuf, long numFrames, long bytesPerFrame )
{
    long numBytes = numFrames * bytesPerFrame;
    char *buffer = (char *) malloc( numBytes );
    if( buffer == NULL ) return paInsufficientMemory;
    memset( buffer, 0, numBytes );
    return (PaError) RingBuffer_Init( rbuf, numBytes, buffer );
}

/* Free buffer. */
static PaError PASTREAMIO_TermFIFO( RingBuffer *rbuf )
{
    if( rbuf->buffer ) free( rbuf->buffer );
    rbuf->buffer = NULL;
    return paNoError;
}

/************************************************************
 * Write data to ring buffer.
 * Will not return until all the data has been written.
 */
long WriteAudioStream( PASTREAMIO_Stream *aStream, void *data, long numFrames )
{
    long bytesWritten;
    char *p = (char *) data;
    long numBytes = aStream->bytesPerFrame * numFrames;
    while( numBytes > 0)
    {
        bytesWritten = RingBuffer_Write( &aStream->outFIFO, p, numBytes );
        numBytes -= bytesWritten;
        p += bytesWritten;
        if( numBytes > 0) Pa_Sleep(10);
    }
    return numFrames;
}

<p>/************************************************************
 * Return the number of frames that could be written to the stream without
 * having to wait.
 */
long GetAudioStreamWriteable( PASTREAMIO_Stream *aStream )
{
    int bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO );
    return bytesEmpty / aStream->bytesPerFrame;
}

<p><p>/************************************************************/
unsigned long RoundUpToNextPowerOf2( unsigned long n )
{
    long numBits = 0;
    if( ((n-1) & n) == 0) return n; /* Already Power of two. */
    while( n > 0 )
    {
        n= n>>1;
        numBits++;
    }
    return (1<<numBits);
}

/************************************************************
 * Opens a PortAudio stream with default characteristics.
 * Allocates PASTREAMIO_Stream structure.
 *
 * flags parameter can be an ORed combination of:
 *    PABLIO_WRITE, 
 *    and either PABLIO_MONO or PABLIO_STEREO
 */
PaError OpenAudioStream( PASTREAMIO_Stream **rwblPtr, double sampleRate,
                         PaSampleFormat format, long flags )
{
    long   bytesPerSample;
    long   doWrite = 0;
    PaError err;
    PASTREAMIO_Stream *aStream;
    long   minNumBuffers;
    long   numFrames;

    /* Allocate PASTREAMIO_Stream structure for caller. */
    aStream = (PASTREAMIO_Stream *) malloc( sizeof(PASTREAMIO_Stream) );
    if( aStream == NULL ) return paInsufficientMemory;
    memset( aStream, 0, sizeof(PASTREAMIO_Stream) );

    /* Determine size of a sample. */
    bytesPerSample = Pa_GetSampleSize( format );
    if( bytesPerSample < 0 )
    {
        err = (PaError) bytesPerSample;
        goto error;
    }
    aStream->samplesPerFrame = ((flags&PASTREAMIO_MONO) != 0) ? 1 : 2;
    aStream->bytesPerFrame = bytesPerSample * aStream->samplesPerFrame;

    /* Initialize PortAudio  */
    err = Pa_Initialize();
    if( err != paNoError ) goto error;

    /* Warning: numFrames must be larger than amount of data processed per interrupt
     *    inside PA to prevent glitches. Just to be safe, adjust size upwards.
     */
    minNumBuffers = 2 * Pa_GetMinNumBuffers( FRAMES_PER_BUFFER, sampleRate );
    numFrames = minNumBuffers * FRAMES_PER_BUFFER;
    numFrames = RoundUpToNextPowerOf2( numFrames );

    /* Initialize Ring Buffer */
    doWrite = ((flags & PASTREAMIO_WRITE) != 0);

    if(doWrite)
    {
        err = PASTREAMIO_InitFIFO( &aStream->outFIFO, numFrames, aStream->bytesPerFrame );
        if( err != paNoError ) goto error;
        /* Make Write FIFO appear full initially. 
        numBytes = RingBuffer_GetWriteAvailable( &aStream->outFIFO );
        RingBuffer_AdvanceWriteIndex( &aStream->outFIFO, numBytes );*/
    }

    /* Open a PortAudio stream that we will use to communicate with the underlying
     * audio drivers. */
    err = Pa_OpenStream(
              &aStream->stream,
              paNoDevice,
              0 ,
              format,
              NULL,
              Pa_GetDefaultOutputDeviceID() ,
              aStream->samplesPerFrame ,
              format,
              NULL,
              sampleRate,
              FRAMES_PER_BUFFER,
              minNumBuffers,
              paClipOff,       /* we won't output out of range samples so don't bother clipping them */
              audioIOCallback,
              aStream );
    if( err != paNoError ) goto error;

  //  err = Pa_StartStream( aStream->stream );
  //  if( err != paNoError ) goto error;

    *rwblPtr = aStream;
    return paNoError;

error:
    CloseAudioStream( aStream );
    *rwblPtr = NULL;
    return err;
}

PaError StartAudioStream( PASTREAMIO_Stream *aStream)
{
        PaError err;
        err = Pa_StartStream( aStream->stream );
    if( err != paNoError ) goto error;

    return paNoError;
error:
    CloseAudioStream( aStream );
    return err;
}

PaTimestamp GetAudioStreamTime( PASTREAMIO_Stream *aStream ){
  return Pa_StreamTime( aStream->stream ) ;
}

/************************************************************/
PaError CloseAudioStream( PASTREAMIO_Stream *aStream )
{
    PaError err;
    int bytesEmpty;
    int byteSize = aStream->outFIFO.bufferSize;

    /* If we are writing data, make sure we play everything written. */
    if( byteSize > 0 )
    {
        bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO );
        while( bytesEmpty < byteSize )
        {
            Pa_Sleep( 10 );
            bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO );
        }
    }

    err = Pa_StopStream( aStream->stream );
    if( err != paNoError ) goto error;
    err = Pa_CloseStream( aStream->stream );
    if( err != paNoError ) goto error;
    Pa_Terminate();

error:
    PASTREAMIO_TermFIFO( &aStream->outFIFO );
    free( aStream );
    return err;
}

<p><p>1.1                  theora/win32/experimental/splayer/.cvsignore

Index: .cvsignore
===================================================================
Debug
Release
*.exe
*.ncb
*.plg
*.opt
*.dep
*.mak
*.dsw

<p><p>--- >8 ----
List archives:  http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'cvs-request at xiph.org'
containing only the word 'unsubscribe' in the body.  No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.



More information about the commits mailing list