Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1656 → Rev 1657

/unsupported/tags/rel_0_5/thdemo/fft.c
0,0 → 1,533
// FFT Part
/*
 
FFTPlay 1.0
-----------
 
This application reads data from the audio microphone and then put it
to the screen in a graphical oscilloscope-like form (both standard Hartik
SB driver and Alsa driver can be used).
 
The application also calculate a FFT on the latest values, and displays
the power spectrum in tho ways, one like an equalizator, and the other in a
2D form.
 
A resolution of 1024x768, 64K colors is used.
 
The task set is composed by these tasks and functions:
 
Self buffering functions (SB only)
----------------------------------
this function takes the samples read by the mic and then makes a window
with the last WINDATA_NSAMPLES samples. The window is then put in
the CAB windata.
 
Task raw and task mixer (ALSA only)
-----------------------------------
These tasks are used with the Alsa driver; because it doesn't support the
self-buffering mode, we have to do a forever cycle in witch we have to read
all the data. Then the data are managed like the self-buffering functions of
the SB driver or sent to the mixer task (with a STREAM mailbox) which makes
the window.
(This approach is not good for realtime...)
 
Task wave
---------
This task read the last window and then put it on the screen in a wave form
on the top of the screen.
The task's period is set to 40 ms (25 fps).
 
Task fft
--------
This task read the last window and then it computes the FFT.
With the FFT data it computes the power spectrum, whitch is sent to the
CAB pwrdata.
The task's period is set to 10 ms (good for the 2D story task).
This task is the only Hard Task.
 
Task equ
--------
This task read the last power spectrum and displays it in a graphical
form, like a hi-fi equalizator.
The Histograms can be white or coloured like the equ2D task (see EQU_SHADE)
The task's period is set to 40 ms (25 fps).
 
Task equ2D
----------
This task read the lasf power spectrum and displays it in a graphical
one-line form. Each pixel is a power coefficient, and its colour shade
from black (no power) to red (high power) passing through green and blue.
The task display the last EQU2D_WIDTH power lines.
The task's period is set to 10 ms (good for the 2D story task).
 
****************************************************************************
TASK LOAD
****************************************************************************
 
period wcet
task tick (ms) us %
--------------------------------------------------------
sound driver 24->3 12->1.5 200 0.016->0.133
wave 80 40 11500 0.2875
fft 20 10 3000 0.3000
equ 80 40 7000 0.1750
equ2D 20 10 500 0.0500
-------------
0.812 (last 4)
*/
 
#include "demo.h"
//#include <ll/ll.h>
 
//#include <kernel/types.h>
#include <kernel/model.h>
#include <kernel/func.h>
 
#include <modules/cabs.h>
 
//#include <string.h>
//#include <stdlib.h>
#include <semaphore.h>
 
//#include <drivers/keyb.h>
//#include <drivers/crtwin.h>
#include <drivers/glib.h>
#include <drivers/sound.h>
#include <rfftw.h>
 
/* CAB ports... */
CAB cab_windata; /* a window on the last WINDATA_DIM samples */
CAB cab_pwrdata; /* the last power spectrum */
 
/* for the cab_windata */
typedef struct {
int start;
SAMPLE sample[WINDATA_NSAMPLES];
} window;
 
/* for the cab_pwrdata */
typedef struct {
fftw_real p[PWR_NSAMPLES];
} power;
 
 
// win is global... because is used by raw_infun...
window win;
 
/*
This is the self-buffering function: read the samples and put their mean
value in a CAB
*/
int raw_infun(void *b)
{
int i;
char *w;
SAMPLE *audiobuf = (SAMPLE *)b;
 
for (i=0; i<rawdata_nsamples/2; i++) {
win.sample[win.start] = audiobuf[i];
win.start = (win.start+1) % WINDATA_NSAMPLES;
}
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
 
#if defined(NO_GRX)
cprintf("X"); //"XXX%d\n",win.sample[win.start]);
#endif
return 0;
}
 
 
 
void init_rawdata()
{
int i;
char *w;
 
win.start = 0;
for (i=0; i<WINDATA_NSAMPLES; i++)
win.sample[i] = 0;
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
}
 
 
 
 
 
TASK wave_task()
{
window *p;
int x,y;
int s;
 
while(1)
{
p = (window *)cab_getmes(cab_windata);
 
/* let's print the wave */
mutex_lock(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,white);
}
mutex_unlock(&mutex);
 
task_endcycle();
 
/* let's erase the wave */
mutex_lock(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,black);
}
mutex_unlock(&mutex);
 
cab_unget(cab_windata,(char *)p);
 
}
}
 
 
rfftw_plan plan;
 
void fft_close(void *arg)
{
rfftw_destroy_plan(plan);
}
 
 
TASK fft_task()
{
fftw_real in[FFT_NSAMPLES], out[FFT_NSAMPLES];
power power_spectrum;
 
#if defined(NO_GRX)
fftw_real max = 0.0;
#endif
 
char *m;
 
int k, i;
 
window *p;
 
plan = rfftw_create_plan(FFT_NSAMPLES, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
 
sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
while(1)
{
/* Let's prepare the intput FFT data */
p = (window *)cab_getmes(cab_windata);
 
for (k = 0, i = p->start;
k < FFT_NSAMPLES;
k++, i = (i+1)%WINDATA_NSAMPLES)
in[k] = p->sample[i]/FFT_SCALE;
 
cab_unget(cab_windata,(char *)p);
 
/* zero-padding if needed */
for (k=WINDATA_NSAMPLES; k < FFT_NSAMPLES; k++)
in[k] = 0.0;
 
rfftw_one(plan, in, out);
 
/* power spectrum computation */
power_spectrum.p[0] = out[0]*out[0]; /* DC component */
for (k = 1; k < PWR_NSAMPLES; ++k) /* (k < N/2 rounded up) */
power_spectrum.p[k] = out[k]*out[k] + out[FFT_NSAMPLES-k]*out[FFT_NSAMPLES-k];
if (FFT_NSAMPLES % 2 == 0) /* N is even */
power_spectrum.p[FFT_NSAMPLES/2] = out[FFT_NSAMPLES/2]*out[FFT_NSAMPLES/2]; /* Nyquist freq. */
 
m = cab_reserve(cab_pwrdata);
memcpy(m, &power_spectrum, sizeof(power));
cab_putmes(cab_pwrdata,m);
 
#if defined(NO_GRX)
max = 0.0;
for (k=0; k<PWR_NSAMPLES; k++)
if (power_spectrum.p[k] > max)
max = power_spectrum.p[k];
 
//cprintf("%f %f\n",max,(max / EQU_SCALE) );
#endif
 
task_endcycle();
 
}
}
 
/* structure is like the wave task... */
TASK equ_task()
{
power *p;
 
int x[PWR_NSAMPLES];
int y;
int s;
 
int r,g,b;
 
while(1)
{
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the lines */
mutex_lock(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
x[s] = (int)(p->p[s] / EQU_SCALE);
 
if (x[s] > EQU_HEIGHT)
x[s] = EQU_HEIGHT;
 
x[s] = EQU_X - x[s];
 
 
#if defined(EQU_SHADE)
 
/* like the task equ2d... */
r = (int)(p->p[s] / EQU2D_SCALE);
if (r > EQU2D_CLIP)
r = EQU2D_CLIP;
 
if (r< 64) g = r * 4;
else if (r<128) g = (128-r) * 4;
else g = 0;
 
if (r<128) b = 0;
else if (r<192) b = (r-128) * 4;
else b = (256-r) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,rgb16(r,g,b));
#else
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,white);
#endif
}
mutex_unlock(&mutex);
 
task_endcycle();
 
/* erase the lines... */
mutex_lock(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,black);
}
mutex_unlock(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
}
}
 
TASK equ2d_task()
{
power *p;
 
int pwrint;
 
int x = 0;
 
int y,s;
 
int r,g,b;
 
while(1)
{
 
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the line */
mutex_lock(&mutex);
 
for(y = EQU2D_Y, s = 0;
s < EQU2D_NSAMPLES;
y++, s++ )
{
pwrint = (int)(p->p[s] / EQU2D_SCALE);
 
if (pwrint > EQU2D_CLIP)
pwrint = EQU2D_CLIP;
 
r = pwrint;
 
if (pwrint< 64) g = pwrint * 4;
else if (pwrint<128) g = (128-pwrint) * 4;
else g = 0;
 
if (pwrint<128) b = 0;
else if (pwrint<192) b = (pwrint-128) * 4;
else b = (256-pwrint) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_plot(EQU2D_X+x,y,rgb16(r,g,b));
}
 
x = (x+1) % EQU2D_WIDTH;
grx_line(EQU2D_X+x,EQU2D_Y,EQU2D_X+x,EQU2D_Y+EQU2D_NSAMPLES-1,white);
 
mutex_unlock(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
task_endcycle();
}
}
 
 
void init_fftplay(int freq)
{
SOFT_TASK_MODEL m3, m4, m5, m6;
 
PID p3,p4,p5,p6;
 
cab_windata = cab_create("windata", sizeof(window), 5);
cab_pwrdata = cab_create("pwr", sizeof(power), 5);
 
/* Init the sound lib */
sound_init((rawdata_nsamples * sizeof(SAMPLE)), NULL);
sound_info();
 
/* Init the data used by the raw_infun */
init_rawdata();
 
/* Start the self-buffering sampling operation */
sound_setfun(raw_infun, (int (*)(void *))-1);
sound_sample(NULL, freq, 0, DMA_OP | PCM16 | MYFUN, NULL);
 
soft_task_default_model(m3);
soft_task_def_level(m3,1);
soft_task_def_period(m3, PERIOD_WAVE);
soft_task_def_met(m3, WCET_WAVE);
soft_task_def_ctrl_jet(m3);
soft_task_def_group(m3, 1);
p3 = task_create("wave", wave_task, &m3, NULL);
if (p3 == -1) {
grx_close();
perror("FFTPlay: Could not create task <wave>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m4);
soft_task_def_level(m4,1);
soft_task_def_period(m4, PERIOD_FFT);
soft_task_def_met(m4, WCET_FFT);
soft_task_def_group(m4, 1);
soft_task_def_stack(m4,32*1024);
soft_task_def_usemath(m4);
soft_task_def_ctrl_jet(m4);
p4 = task_create("fft", fft_task, &m4, NULL);
if (p4 == -1) {
grx_close();
perror("FFTPlay: Could not create task <fft>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m5);
soft_task_def_level(m5,1);
soft_task_def_period(m5, PERIOD_EQU);
soft_task_def_met(m5, WCET_EQU);
soft_task_def_group(m5, 1);
soft_task_def_stack(m5,32*1024);
soft_task_def_usemath(m5);
soft_task_def_ctrl_jet(m5);
p5 = task_create("equ", equ_task, &m5, NULL);
if (p5 == -1) {
grx_close();
perror("FFTPlay: Could not create task <equ>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <equ>\n");
sys_end();
}
 
soft_task_default_model(m6);
soft_task_def_level(m6,1);
soft_task_def_period(m6, PERIOD_EQU2D);
soft_task_def_met(m6, WCET_EQU2D);
soft_task_def_group(m6, 1);
soft_task_def_stack(m6,32*1024);
soft_task_def_usemath(m6);
soft_task_def_ctrl_jet(m6);
p6 = task_create("equ2D", equ2d_task, &m6, NULL);
if (p6 == -1) {
grx_close();
perror("FFTPlay: Could not create task <equ2d>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <equ2D>\n");
sys_end();
}
}
 
void scenario_fftplay(int f)
{
int i,y;
char s[50];
 
grx_line(0,WAVE_Y-WAVE_HEIGHT-1,383,WAVE_Y-WAVE_HEIGHT-1,red);
grx_line(0,WAVE_Y+WAVE_HEIGHT+1,383,WAVE_Y+WAVE_HEIGHT+1,red);
grx_line(0,EQU_Y-11 ,383,EQU_Y-11 ,red);
 
 
 
/* lines near the frequencies */
grx_line(EQU_X +1,EQU_Y,EQU_X +1,EQU_Y+EQU_NSAMPLES-1,red);
grx_line(EQU2D_X-1,EQU_Y,EQU2D_X-1,EQU_Y+EQU_NSAMPLES-1,red);
 
for (i=0; i<SCENARIO_NLABEL; i++)
{
y = (i*EQU_NSAMPLES)/(SCENARIO_NLABEL-1);
if (i == SCENARIO_NLABEL-1) y--;
grx_line(EQU_X +1,EQU_Y+y,EQU_X +4,EQU_Y+y,red);
grx_line(EQU2D_X-1,EQU_Y+y,EQU2D_X-4,EQU_Y+y,red);
 
itoa((i*f)/(SCENARIO_NLABEL-1),s);
grx_text(s,EQU_X+20,EQU_Y+y-8,white,black);
}
 
grx_text("Power Spectrum" , 0, EQU_Y-21, rgb16(0,0,255), black);
grx_text("Power Spectrum Story", EQU2D_X+EQU2D_WIDTH-160, EQU_Y-21, rgb16(0,0,255), black);
grx_text("Waveform" , 0, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
}
 
void compute_params(int *freq,WORD *nsamp)
{
if (*freq< 2000)
{
cprintf("WARNING: frequency less than 2000Hz\n ---> frequency set to 2000Hz\n");
*freq = 2000;
}
if (*freq<= 8000) { *nsamp = 64; return; } //128
if (*freq<=16000) { *nsamp = 64; return; } //256
if (*freq<=24000) { *nsamp = 64; return; } //512
if (*freq>48000)
{
cprintf("WARNING: frequency greather than 48000Hz\n ---> frequency set to 48000Hz\n");
*freq = 48000;
}
if (*freq<=48000) { *nsamp = 64; return; } //1024
}
 
/unsupported/tags/rel_0_5/thdemo/initfile.c
0,0 → 1,146
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
 
System initialization file
 
h3pi.c
 
This file is equal to hartik3.c plus the resources module...
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
//#define PI
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
 
#ifndef PI
#include "modules/rrsoft.h"
#endif
 
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 10000
//#define RRTICK 3000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
#ifdef PI
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
#else
RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
#endif
 
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
NOP_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
kern_printf("TIME=%ld\n",sys_gettime(NULL));
KEYB_init(NULL);
kern_printf("TIME=%ld\n",sys_gettime(NULL));
// KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
 
 
#ifdef PI
void app_mutex_init(mutex_t *m)
{
PI_mutexattr_t attr;
 
PI_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#else
void app_mutex_init(mutex_t *m)
{
NOP_mutexattr_t attr;
 
NOP_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#endif
/unsupported/tags/rel_0_5/thdemo/demo.c
0,0 → 1,260
/* Project: HARTIK 3.0 */
/* Description: Hard Real TIme Kernel for 386 & higher machines */
/* Author: Paolo Gai <pgai@rsk.it> */
/* Advanced Linux Sound Architecture (ALSA) */
/* Copyright (c) by Jaroslav Kysela <perex@jcu.cz> */
/* Luca Abeni */
/* FFTW by M. Frigo and S. G. Johnson */
 
/* Date: 08/09/1999 */
 
/* File: fftplay.c */
/* Revision: 1.00 (Kernel 0.1.4; Library 0.0.9; Util 0.0.4) */
 
 
 
#include "demo.h"
 
//#include <kernel/types.h>
//#include <kernel/model.h>
#include <kernel/func.h>
 
//#include <modules/cabs.h>
 
#include <string.h>
#include <stdlib.h>
 
#include <drivers/keyb.h>
//#include <drivers/crtwin.h>
#include <drivers/glib.h>
//#include <drivers/sound.h>
//#include <ports/rfftw.h>
 
 
 
/* Informations about the sampling rate and buffers */
WORD rawdata_nsamples;
WORD rawdata_buffer_size;
WORD rawdata_freq;
 
/* graphic mutex... */
mutex_t mutex;
 
/* useful colors... */
int white;
int black;
int red;
int gray;
 
void app_mutex_init(mutex_t *m);
 
 
static void version( void )
{
cprintf( "Hartik FFT Play 1.0\n" );
cprintf( "-----------------------\n" );
cprintf( "by Paolo Gai 1999\n" );
cprintf( " <pj@hartik.sssup.it>\n" );
cprintf( "-----------------------\n" );
}
 
void reverse(char s[])
{
int c, i, j;
 
for (i = 0, j = strlen(s)-1; i<j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
 
char * itoa(int n, char *s)
{
int i, sign;
 
if ((sign = n) < 0)
n = -n;
 
i = 0;
 
do
{
s[i++] = n % 10 + '0';
} while ((n /= 10) > 0);
 
if (sign < 0)
s[i++] = '-';
 
s[i] = 0;
 
reverse(s);
 
return s;
}
 
void display_jet(PID i)
{
char st[200];
TIME sum, max;
int n;
 
if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
if (n==0) n=1;
sprintf(st, "PID=%2d st=%3d Mean=%5d Max=%5d na=%10s",
(int)i,
(int)proc_table[i].status, (int)sum/n, (int)max,
proc_table[i].name);
mutex_lock(&mutex);
grx_text(st, 0, 400+i*8, 255, 0);
mutex_unlock(&mutex);
}
}
 
 
 
void scenario(int f)
{
grx_text("HARTIK 4.0 - LEGO Version" , 0,0, rgb16(0,255,0), black );
grx_text("Thesis Demo", 0,8, rgb16(0,255,0), black );
 
#ifdef FFT_ON
scenario_fftplay(f);
#endif
 
#ifdef FRAMEGRABBER_ON
scenario_framegrabber();
#endif
 
#ifdef JET_ON
scenario_jetcontrol();
#endif
 
#ifdef BALL_ON
scenario_ball();
#endif
}
 
 
void my_close(void *arg)
{
grx_close();
}
 
 
void endfun(KEY_EVT *k)
{
grx_close();
cprintf("Ctrl-Brk pressed! Ending...\n");
sys_end();
}
 
void zerofun(KEY_EVT *k)
{
int i;
for (i=0; i<MAX_PROC; i++) jet_delstat(i);
}
 
void printeventqueue(void *arg)
{
struct event *p;
extern struct event *firstevent;
 
kern_cli();
grx_close();
kern_cli();
for (p = firstevent; p != NULL; p = p->next) {
kern_printf("par:%d time:%ld.%ld p:%d handler:%d\n",
(int)p->par, p->time.tv_sec, p->time.tv_nsec/1000, (int)p, (int)p->handler);
}
kern_sti();
}
 
int main(int argc, char **argv)
{
int modenum;
 
int f;
 
KEY_EVT k;
 
srand(4);
 
version();
 
#ifdef FRAMEGRABBER_ON
if (argc == 1)
{
cprintf("type x fftplay <freq>");
return 0;
}
 
f = atoi(argv[1]);
compute_params(&f,&rawdata_nsamples);
#endif
 
keyb_set_map(itaMap);
k.flag = CNTR_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
k.flag = CNTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
k.flag = ALTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,zerofun);
k.flag = 0;
k.scan = KEY_ENT;
k.ascii = 13;
keyb_hook(k,endfun);
 
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
 
grx_init();
modenum = grx_getmode(640, 480, 16);
 
grx_setmode(modenum);
 
/* init the graphic mutex */
app_mutex_init(&mutex);
 
/* useful colors ... */
white = rgb16(255,255,255);
black = rgb16(0,0,0);
red = rgb16(255,0,0);
gray = rgb16(128,128,128);
 
scenario(f/2);
// grx_close();
// clear();
#ifdef FFT_ON
init_fftplay(f);
#endif
 
#ifdef FRAMEGRABBER_ON
init_framegrabber();
#endif
 
#ifdef JET_ON
init_jetcontrol();
#endif
 
#ifdef BALL_ON
init_ball();
#endif
 
group_activate(1);
 
#ifdef FRAMEGRABBER_ON
start_framegrabber();
#endif
 
return 0;
}
 
 
/unsupported/tags/rel_0_5/thdemo/fftplay.c
0,0 → 1,769
/* Project: HARTIK 3.0 */
/* Description: Hard Real TIme Kernel for 386 & higher machines */
/* Author: Paolo Gai <pgai@rsk.it> */
/* Advanced Linux Sound Architecture (ALSA) */
/* Copyright (c) by Jaroslav Kysela <perex@jcu.cz> */
/* Luca Abeni */
/* FFTW by M. Frigo and S. G. Johnson */
 
/* Date: 08/09/1999 */
 
/* File: fftplay.c */
/* Revision: 1.00 (Kernel 0.1.4; Library 0.0.9; Util 0.0.4) */
 
 
/*
 
FFTPlay 1.0
-----------
 
This application reads data from the audio microphone and then put it
to the screen in a graphical oscilloscope-like form (both standard Hartik
SB driver and Alsa driver can be used).
 
The application also calculate a FFT on the latest values, and displays
the power spectrum in tho ways, one like an equalizator, and the other in a
2D form.
 
A resolution of 1024x768, 64K colors is used.
 
The task set is composed by these tasks and functions:
 
Self buffering functions (SB only)
----------------------------------
this function takes the samples read by the mic and then makes a window
with the last WINDATA_NSAMPLES samples. The window is then put in
the CAB windata.
 
Task raw and task mixer (ALSA only)
-----------------------------------
These tasks are used with the Alsa driver; because it doesn't support the
self-buffering mode, we have to do a forever cycle in witch we have to read
all the data. Then the data are managed like the self-buffering functions of
the SB driver or sent to the mixer task (with a STREAM mailbox) which makes
the window.
(This approach is not good for realtime...)
 
Task wave
---------
This task read the last window and then put it on the screen in a wave form
on the top of the screen.
The task's period is set to 40 ms (25 fps).
 
Task fft
--------
This task read the last window and then it computes the FFT.
With the FFT data it computes the power spectrum, whitch is sent to the
CAB pwrdata.
The task's period is set to 10 ms (good for the 2D story task).
This task is the only Hard Task.
 
Task equ
--------
This task read the last power spectrum and displays it in a graphical
form, like a hi-fi equalizator.
The Histograms can be white or coloured like the equ2D task (see EQU_SHADE)
The task's period is set to 40 ms (25 fps).
 
Task equ2D
----------
This task read the lasf power spectrum and displays it in a graphical
one-line form. Each pixel is a power coefficient, and its colour shade
from black (no power) to red (high power) passing through green and blue.
The task display the last EQU2D_WIDTH power lines.
The task's period is set to 10 ms (good for the 2D story task).
 
****************************************************************************
TASK LOAD
****************************************************************************
 
period wcet
task tick (ms) us %
--------------------------------------------------------
sound driver 24->3 12->1.5 200 0.016->0.133
wave 80 40 11500 0.2875
fft 20 10 3000 0.3000
equ 80 40 7000 0.1750
equ2D 20 10 500 0.0500
-------------
0.812 (last 4)
*/
 
#include <ll/ll.h>
 
#include <kernel/types.h>
#include <kernel/model.h>
#include <kernel/func.h>
 
#include <modules/cabs.h>
 
#include <string.h>
#include <stdlib.h>
#include <semaphore.h>
 
#include <drivers/keyb.h>
#include <drivers/crtwin.h>
#include <drivers/glib.h>
#include <drivers/sound.h>
#include <ports/rfftw.h>
 
/* now the load constants... */
 
#define WCET_WAVE 11500
#define WCET_FFT 3000
#define WCET_EQU 500
#define WCET_EQU2D 500
 
#define PERIOD_WAVE 40000
#define PERIOD_FFT 10000
#define PERIOD_EQU 40000
#define PERIOD_EQU2D 10000
 
/* define if shorts critical sections wanted */
#define SHORT_CRITICAL_SECTIONS(x) \
if (!((x)%64)) \
{ \
sem_post(&mutex); \
sem_wait(&mutex); \
}
 
/* define if you want NRT or SOFT... */
#define TASK_TYPE SOFT
//#define TASK_TYPE NRT
 
 
 
/* Only 4 Debug... */
/*#define NO_GRX */
 
/* Samples are 16-bit signed integers */
typedef short SAMPLE;
#define MAX_SAMPLE 32768
 
/* Informations about the sampling rate and buffers */
WORD rawdata_nsamples;
WORD rawdata_buffer_size;
WORD rawdata_freq;
 
/* Numbers of samples of the sample window */
#define WINDATA_NSAMPLES 1024
 
/* task WAVE */
/* the point (wave_x,wave_y) is on the center left of the area... */
#define WAVE_NSAMPLES 1024
#define WAVE_X 0
#define WAVE_Y 130
#define WAVE_HEIGHT 80
 
/* task FFT */
#define FFT_NSAMPLES WINDATA_NSAMPLES
#define PWR_NSAMPLES (FFT_NSAMPLES/2+1)
 
/* task EQU */
/* the point (equ_x, equ_y) is the top right corner */
#define EQU_NSAMPLES PWR_NSAMPLES
#define EQU_X 170
#define EQU_Y 255
#define EQU_HEIGHT 170
#define EQU_SHADE
 
/* task EQU2D */
/* the point (equ2d_x, equ2d_y) is the top left corner */
#define EQU2D_NSAMPLES EQU_NSAMPLES
#define EQU2D_X 255
#define EQU2D_Y EQU_Y
#define EQU2D_WIDTH 768
#define EQU2D_CLIP 255
 
/* scenario */
#define SCENARIO_NLABEL 16
 
/* Scale factors */
#define FFT_SCALE (16384.0)
#define EQU_SCALE (32.0)
#define EQU2D_SCALE (8.0)
//#define EQU_SCALE (64.0)
//#define EQU2D_SCALE (16.0)
 
 
/* CAB ports... */
CAB cab_windata; /* a window on the last WINDATA_DIM samples */
CAB cab_pwrdata; /* the last power spectrum */
 
/* for the cab_windata */
typedef struct {
int start;
SAMPLE sample[WINDATA_NSAMPLES];
} window;
 
/* for the cab_pwrdata */
typedef struct {
fftw_real p[PWR_NSAMPLES];
} power;
 
/* graphic mutex... */
sem_t mutex;
 
// win is global... because is used by raw_infun...
window win;
 
 
 
/* useful colors... */
int white;
int black;
int red;
 
static void version( void )
{
cprintf( "Hartik FFT Play 1.0\n" );
cprintf( "-----------------------\n" );
cprintf( "by Paolo Gai 1999\n" );
cprintf( " <pj@hartik.sssup.it>\n" );
cprintf( "-----------------------\n" );
}
 
void reverse(char s[])
{
int c, i, j;
 
for (i = 0, j = strlen(s)-1; i<j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
 
char * itoa(int n, char *s)
{
int i, sign;
 
if ((sign = n) < 0)
n = -n;
 
i = 0;
 
do
{
s[i++] = n % 10 + '0';
} while ((n /= 10) > 0);
 
if (sign < 0)
s[i++] = '-';
 
s[i] = 0;
 
reverse(s);
 
return s;
}
 
 
 
/*
This is the self-buffering function: read the samples and put their mean
value in a CAB
*/
int raw_infun(void *b)
{
int i;
char *w;
SAMPLE *audiobuf = (SAMPLE *)b;
 
for (i=0; i<rawdata_nsamples/2; i++) {
win.sample[win.start] = audiobuf[i];
win.start = (win.start+1) % WINDATA_NSAMPLES;
}
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
 
#if defined(NO_GRX)
cprintf("X"); //"XXX%d\n",win.sample[win.start]);
#endif
return 0;
}
 
 
 
void init_rawdata()
{
int i;
char *w;
 
win.start = 0;
for (i=0; i<WINDATA_NSAMPLES; i++)
win.sample[i] = 0;
 
w = cab_reserve(cab_windata);
memcpy(w, &win, sizeof(window));
cab_putmes(cab_windata,w);
}
 
 
 
 
 
TASK wave_task()
{
window *p;
int x,y;
int s;
 
while(1)
{
p = (window *)cab_getmes(cab_windata);
 
/* let's print the wave */
sem_wait(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,white);
}
sem_post(&mutex);
 
task_endcycle();
 
/* let's erase the wave */
sem_wait(&mutex);
for(x = WAVE_X, s = p->start;
x < WAVE_X+WAVE_NSAMPLES;
x++, s = (s+1)%WINDATA_NSAMPLES )
{
y = WAVE_Y + (WAVE_HEIGHT * p->sample[s]) / MAX_SAMPLE;
SHORT_CRITICAL_SECTIONS(x);
grx_plot(x,y,black);
}
sem_post(&mutex);
 
cab_unget(cab_windata,(char *)p);
 
}
}
 
 
rfftw_plan plan;
 
void fft_close(void *arg)
{
rfftw_destroy_plan(plan);
}
 
 
TASK fft_task()
{
fftw_real in[FFT_NSAMPLES], out[FFT_NSAMPLES];
power power_spectrum;
 
#if defined(NO_GRX)
fftw_real max = 0.0;
#endif
 
char *m;
 
int k, i;
 
window *p;
 
plan = rfftw_create_plan(FFT_NSAMPLES, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
 
sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
while(1)
{
/* Let's prepare the intput FFT data */
p = (window *)cab_getmes(cab_windata);
 
for (k = 0, i = p->start;
k < FFT_NSAMPLES;
k++, i = (i+1)%WINDATA_NSAMPLES)
in[k] = p->sample[i]/FFT_SCALE;
 
cab_unget(cab_windata,(char *)p);
 
/* zero-padding if needed */
for (k=WINDATA_NSAMPLES; k < FFT_NSAMPLES; k++)
in[k] = 0.0;
 
rfftw_one(plan, in, out);
 
/* power spectrum computation */
power_spectrum.p[0] = out[0]*out[0]; /* DC component */
for (k = 1; k < PWR_NSAMPLES; ++k) /* (k < N/2 rounded up) */
power_spectrum.p[k] = out[k]*out[k] + out[FFT_NSAMPLES-k]*out[FFT_NSAMPLES-k];
if (FFT_NSAMPLES % 2 == 0) /* N is even */
power_spectrum.p[FFT_NSAMPLES/2] = out[FFT_NSAMPLES/2]*out[FFT_NSAMPLES/2]; /* Nyquist freq. */
 
m = cab_reserve(cab_pwrdata);
memcpy(m, &power_spectrum, sizeof(power));
cab_putmes(cab_pwrdata,m);
 
#if defined(NO_GRX)
max = 0.0;
for (k=0; k<PWR_NSAMPLES; k++)
if (power_spectrum.p[k] > max)
max = power_spectrum.p[k];
 
//cprintf("%f %f\n",max,(max / EQU_SCALE) );
#endif
 
task_endcycle();
 
}
}
 
/* structure is like the wave task... */
TASK equ_task()
{
power *p;
 
int x[PWR_NSAMPLES];
int y;
int s;
 
int r,g,b;
 
while(1)
{
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the lines */
sem_wait(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
x[s] = (int)(p->p[s] / EQU_SCALE);
 
if (x[s] > EQU_HEIGHT)
x[s] = EQU_HEIGHT;
 
x[s] = EQU_X - x[s];
 
 
#if defined(EQU_SHADE)
 
/* like the task equ2d... */
r = (int)(p->p[s] / EQU2D_SCALE);
if (r > EQU2D_CLIP)
r = EQU2D_CLIP;
 
if (r< 64) g = r * 4;
else if (r<128) g = (128-r) * 4;
else g = 0;
 
if (r<128) b = 0;
else if (r<192) b = (r-128) * 4;
else b = (256-r) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,rgb16(r,g,b));
#else
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,white);
#endif
}
sem_post(&mutex);
 
task_endcycle();
 
/* erase the lines... */
sem_wait(&mutex);
for(y = EQU_Y, s = 0;
s < EQU_NSAMPLES;
y++, s++ )
{
SHORT_CRITICAL_SECTIONS(y);
grx_line(EQU_X,y,x[s],y,black);
}
sem_post(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
}
}
 
TASK equ2d_task()
{
power *p;
 
int pwrint;
 
int x = 0;
 
int y,s;
 
int r,g,b;
 
while(1)
{
 
p = (power *)cab_getmes(cab_pwrdata);
 
/* print the line */
sem_wait(&mutex);
 
for(y = EQU2D_Y, s = 0;
s < EQU2D_NSAMPLES;
y++, s++ )
{
pwrint = (int)(p->p[s] / EQU2D_SCALE);
 
if (pwrint > EQU2D_CLIP)
pwrint = EQU2D_CLIP;
 
r = pwrint;
 
if (pwrint< 64) g = pwrint * 4;
else if (pwrint<128) g = (128-pwrint) * 4;
else g = 0;
 
if (pwrint<128) b = 0;
else if (pwrint<192) b = (pwrint-128) * 4;
else b = (256-pwrint) * 4;
 
SHORT_CRITICAL_SECTIONS(y);
grx_plot(EQU2D_X+x,y,rgb16(r,g,b));
}
 
x = (x+1) % EQU2D_WIDTH;
grx_line(EQU2D_X+x,EQU2D_Y,EQU2D_X+x,EQU2D_Y+EQU2D_NSAMPLES,white);
 
sem_post(&mutex);
 
cab_unget(cab_pwrdata,(char *)p);
 
task_endcycle();
}
}
 
TASK prova_task()
{
window *p;
 
while(1)
{
p = (window *)cab_getmes(cab_windata);
cprintf("%d %d %d\t", p->start /*sample[0]*/,p->sample[1],p->sample[2]);
cab_unget(cab_windata,(char *)p);
 
task_endcycle();
}
}
 
 
void scenario(int f)
{
int i,y;
char s[6];
 
grx_line(0,WAVE_Y-WAVE_HEIGHT-1,1023,WAVE_Y-WAVE_HEIGHT-1,red);
grx_line(0,WAVE_Y+WAVE_HEIGHT+1,1023,WAVE_Y+WAVE_HEIGHT+1,red);
grx_line(0,EQU_Y-11 ,1023,EQU_Y-11 ,red);
 
 
 
/* lines near the frequencies */
grx_line(EQU_X +1,EQU_Y,EQU_X +1,EQU_Y+EQU_NSAMPLES,red);
grx_line(EQU2D_X-1,EQU_Y,EQU2D_X-1,EQU_Y+EQU_NSAMPLES,red);
 
for (i=0; i<SCENARIO_NLABEL; i++)
{
y = (i*EQU_NSAMPLES)/(SCENARIO_NLABEL-1);
if (i == SCENARIO_NLABEL-1) y--;
grx_line(EQU_X +1,EQU_Y+y,EQU_X +10,EQU_Y+y,red);
grx_line(EQU2D_X-1,EQU_Y+y,EQU2D_X-10,EQU_Y+y,red);
 
itoa((i*f)/(SCENARIO_NLABEL-1),s);
grx_text(s,EQU_X+20,EQU_Y+y-8,white,black);
}
 
grx_text("FFTPlay 1.0 - by Paolo Gai 1999 <pj@hartik.sssup.it>", 0,8, rgb16(0,255,0), black );
grx_text("...press ENTER key to exit..." , 0,24, rgb16(0,255,0), black );
 
grx_text("FFT Power Spectrum", 0 , EQU_Y-21, rgb16(0,0,255), black);
grx_text("FFT Power Story", EQU2D_X+16, EQU_Y-21, rgb16(0,0,255), black);
grx_text("Waveform" , 0, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
 
}
 
 
 
 
void compute_params(int *freq,WORD *nsamp, WORD *per)
{
if (*freq< 2000)
{
cprintf("WARNING: frequency less than 2000Hz\n ---> frequency set to 2000Hz\n");
*freq = 2000;
}
if (*freq<= 8000) { *nsamp = 128; *per = 10; return; }
if (*freq<=16000) { *nsamp = 256; *per = 10; return; }
if (*freq<=24000) { *nsamp = 512; *per = 10; return; }
if (*freq>48000)
{
cprintf("WARNING: frequency greather than 48000Hz\n ---> frequency set to 48000Hz\n");
*freq = 48000;
}
if (*freq<=48000) { *nsamp = 1024;*per = 10; return; }
}
 
 
 
void my_close(void *arg)
{
grx_close();
}
 
 
void endfun(KEY_EVT *k)
{
cprintf("Ctrl-Brk pressed! Ending...\n");
sys_end();
}
 
int main(int argc, char **argv)
{
int modenum;
 
int f;
 
/* irq period... */
WORD period;
 
KEY_EVT k;
 
SOFT_TASK_MODEL m3, m4, m5, m6;
 
PID p3,p4,p5,p6;
 
version();
 
if (argc == 1)
{
cprintf("type x fftplay <freq>");
return 0;
}
 
f = atoi(argv[1]);
compute_params(&f,&rawdata_nsamples,&period);
 
keyb_set_map(itaMap);
k.flag = CNTR_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
k.flag = CNTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
 
cab_windata = cab_create("windata", sizeof(window), 4);
cab_pwrdata = cab_create("pwr", sizeof(power), 4);
 
/* Init the sound lib */
sound_init((rawdata_nsamples * sizeof(SAMPLE)), NULL);
sound_info();
 
/* Init the data used by the raw_infun */
init_rawdata();
 
/* Start the self-buffering sampling operation */
sound_setfun(raw_infun, (int (*)(void *))-1);
sound_sample(NULL, f, 0, DMA_OP | PCM16 | MYFUN, NULL);
 
cprintf("Press Enter...");
while (keyb_getchar() != 13);
 
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
#if !defined(NO_GRX)
grx_init();
modenum = grx_getmode(1024, 768, 16);
grx_setmode(modenum);
 
/* init the graphic mutex */
sem_init(&mutex, 0, 1);
 
/* useful colors ... */
white = rgb16(255,255,255);
black = rgb16(0,0,0);
red = rgb16(255,0,0);
 
scenario(f/2);
 
#endif
 
#if !defined(NO_GRX)
soft_task_default_model(m3);
soft_task_def_period(m3, PERIOD_WAVE);
soft_task_def_met(m3, WCET_WAVE);
soft_task_def_group(m3, 1);
p3 = task_create("wave", wave_task, &m3, NULL);
if (p3 == -1) {
perror("FFTPlay: Could not create task <wave>\n");
sys_end();
}
#endif
 
soft_task_default_model(m4);
soft_task_def_period(m4, PERIOD_FFT);
soft_task_def_met(m4, WCET_FFT);
soft_task_def_group(m4, 1);
soft_task_def_stack(m4,32*1024);
soft_task_def_usemath(m4);
p4 = task_create("fft", fft_task, &m4, NULL);
if (p4 == -1) {
perror("FFTPlay: Could not create task <fft>\n");
sys_end();
}
 
#if !defined(NO_GRX)
soft_task_default_model(m5);
soft_task_def_period(m5, PERIOD_EQU);
soft_task_def_met(m5, WCET_EQU);
soft_task_def_group(m5, 1);
soft_task_def_stack(m5,32*1024);
soft_task_def_usemath(m5);
p5 = task_create("equ", equ_task, &m5, NULL);
if (p5 == -1) {
perror("FFTPlay: Could not create task <equ>\n");
sys_end();
}
#endif
 
#if !defined(NO_GRX)
soft_task_default_model(m6);
soft_task_def_period(m6, PERIOD_EQU2D);
soft_task_def_met(m6, WCET_EQU2D);
soft_task_def_group(m6, 1);
soft_task_def_stack(m6,32*1024);
soft_task_def_usemath(m6);
p6 = task_create("equ2D", equ2d_task, &m5, NULL);
if (p6 == -1) {
perror("FFTPlay: Could not create task <equ2D>\n");
sys_end();
}
#else
/* Start the prova task */
//task_def_wcet(m6,1000);
//task_activate(task_create("prova",prova_task,TASK_TYPE,PERIODIC,200,&m6));
#endif
 
group_activate(1);
 
/* Wait until the user get bored */
while (keyb_getchar() != 13);
 
sys_end();
 
return 0;
}
 
 
/unsupported/tags/rel_0_5/thdemo/jetctrl.c
0,0 → 1,200
// JetControl
 
#include "demo.h"
#include "kernel/func.h"
 
TASK jetdummy_task(void *arg)
{
TIME now_dummy, last_dummy, diff_dummy, slice;
struct timespec now, last, diff;
int x = 0;
int height;
 
NULL_TIMESPEC(&last);
last_dummy = 0;
for (;;) {
task_nopreempt();
jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
sys_gettime(&now);
task_preempt();
 
SUBTIMESPEC(&now, &last, &diff);
slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
diff_dummy = now_dummy - last_dummy;
 
height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
 
TIMESPEC_ASSIGN(&last, &now);
last_dummy = now_dummy;
 
mutex_lock(&mutex);
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
mutex_unlock(&mutex);
 
x = (x+1)%JET_DUMMY_WIDTH;
 
task_endcycle();
}
}
 
 
TASK jetctrl_task(void *arg)
{
char st[50];
TIME sum, max;
int n;
 
PID i;
int printed = 0;
 
for (;;) {
for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
if (!n) n=1;
sprintf(st, "%6d %6d %10s", (int)sum/n, (int)max, proc_table[i].name);
mutex_lock(&mutex);
grx_text(st, 384, JET_Y_NAME+16+printed*8, gray, black);
mutex_unlock(&mutex);
printed++;
}
}
while (printed<JET_NTASK) {
mutex_lock(&mutex);
grx_text(" ",
384, JET_Y_NAME+16+printed*8, gray, black);
mutex_unlock(&mutex);
printed++;
}
task_endcycle();
}
}
 
TASK jetslide_task(void *arg)
{
TIME sum, curr, max;
 
TIME total[JET_NTASK];
int slides[JET_NTASK];
 
PID i;
int printed = 0;
 
for (;;) {
// Fill the total array in a nonpreemptive section
task_nopreempt();
for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
if (jet_getstat(i, &sum, NULL, NULL, &curr) != -1) {
total[printed] = sum+curr;
printed++;
}
}
task_preempt();
 
while (printed < JET_NTASK)
total[printed++] = 0;
 
// Compute the Max elapsed time
max = 0;
for (i=0; i<JET_NTASK; i++)
if (total[i] > max) max = total[i];
if (!max) max = 1;
 
// Compute the slides width
for (i=0; i<JET_NTASK; i++)
slides[i] = (int)( (((float)total[i])/max) * JET_SLIDE_WIDTH);
 
// print the data
mutex_lock(&mutex);
for (i=0; i<JET_NTASK; i++) {
grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
JET_SLIDE_X+slides[i], JET_Y_NAME+23+i*8, gray);
grx_box(JET_SLIDE_X+slides[i], JET_Y_NAME+16+i*8,
JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+23+i*8, black);
}
 
while (i<JET_NTASK) {
grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+20+i*8, black);
i++;
}
mutex_unlock(&mutex);
task_endcycle();
}
}
 
 
void scenario_jetcontrol(void)
{
grx_text("System load" , 384, 248, rgb16(0,0,255), black);
grx_line(384,258,639,258,red);
 
grx_text(" Mean Max Name Slide", 384, JET_Y_NAME, gray, black);
grx_line(384,JET_Y_NAME+10,639,JET_Y_NAME+10,gray);
 
grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, gray);
 
grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, gray, black);
grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, gray, black);
 
grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, gray);
grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, gray);
grx_line(384,258,639,258,red);
}
 
void init_jetcontrol(void)
{
SOFT_TASK_MODEL m3, m4, m5;
 
PID p3, p4, p5;
 
soft_task_default_model(m3);
soft_task_def_level(m3,1);
soft_task_def_period(m3, PERIOD_JETCTRL);
soft_task_def_met(m3, WCET_JETCTRL);
soft_task_def_ctrl_jet(m3);
soft_task_def_group(m3, 1);
p3 = task_create("jctrl", jetctrl_task, &m3, NULL);
if (p3 == -1) {
grx_close();
perror("FFTPlay: Could not create task <jetctrl>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m4);
soft_task_def_level(m4,1);
soft_task_def_period(m4, PERIOD_JETDUMMY);
soft_task_def_met(m4, WCET_JETDUMMY);
soft_task_def_group(m4, 1);
soft_task_def_usemath(m4);
soft_task_def_ctrl_jet(m4);
p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
if (p4 == -1) {
grx_close();
perror("FFTPlay: Could not create task <jetdummy>\n");
ll_abort(54);
sys_end();
}
 
soft_task_default_model(m5);
soft_task_def_level(m5,1);
soft_task_def_period(m5, PERIOD_JETSLIDE);
soft_task_def_met(m5, WCET_JETSLIDE);
soft_task_def_group(m5, 1);
soft_task_def_usemath(m5);
soft_task_def_ctrl_jet(m5);
p5 = task_create("jsli", jetslide_task, &m5, NULL);
if (p5 == -1) {
grx_close();
perror("FFTPlay: Could not create task <jetslide>\n");
ll_abort(54);
sys_end();
}
}
 
/unsupported/tags/rel_0_5/thdemo/camera.c
0,0 → 1,516
// framegrabber stuffs
 
/* File name ......... : ELABOR.C
* Project............ :
* Object ............ :
* Author ............ : Facchinetti Tullio
* Language .......... : C
* Compiler .......... : GNU C
* Operative system .. : MS-DOS/HARTIK
* Creation data ..... : 04/03/2000
* Last modify ....... : 19/11/99
*/
 
 
 
 
#include <kernel/func.h>
#include <modules/cabs.h>
#include <stdio.h>
#include <drivers/pxc.h>
#include "demo.h"
 
PID camera_PID;
PID tracking_PID;
 
static CAB frameCAB; // CAB di deposito delle immagini
static CAB trackingCAB; // CAB di deposito delle info di tracking
 
 
int img_border = 10;
int window_width = 40;
int window_height = 40;
TPixel pix_threshold = 128;
 
// a 256 grayscale palette
WORD gray_palette[256];
 
// the image to be putted on the screen
WORD converted_image[IMG_COL*IMG_ROW];
 
TDataObj sequence[N_FRAMES];
 
 
 
void border_up_function(KEY_EVT key)
{
img_border++;
}
 
void border_down_function(KEY_EVT key)
{
img_border--;
}
 
void threshold_up_function(KEY_EVT key)
{
char st[50];
pix_threshold++;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
grx_text(st, 400, 100, 255, 0);
mutex_unlock(&mutex);
}
 
void threshold_down_function(KEY_EVT key)
{
char st[50];
pix_threshold--;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
grx_text(st, 400, 100, 255, 0);
mutex_unlock(&mutex);
}
 
float distance(unsigned int x1, unsigned int y1,
unsigned int x2, unsigned int y2)
{
return(sqrt(((y2 - y1) * (y2 - y1)) + ((x2 - x1) * (x2 - x1))));
}
 
char scan_window_frame(TDataObj *data, TPixel *in_frame,
unsigned int xc, unsigned int yc, int border)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
int x1, y1, x2, y2; // Must be int!!!
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
x1 = MAX_NUM((xc - window_width / 2), (border));
y1 = MAX_NUM((yc - window_height / 2), (border));
x2 = MIN_NUM((xc + window_width / 2), (N_COL - border));
y2 = MIN_NUM((yc + window_height / 2), (N_ROW - border));
 
for (i = y1; i < y2; i++) {
for (j = x1; j < x2; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
// *(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
// *(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
char scan_all_frame(TDataObj *data, TPixel *in_frame)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
// In a single image scanning it performs thresholding and computation
for (i = img_border; i < N_ROW - img_border; i++) {
for (j = img_border; j < N_COL - img_border; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
// *(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
// *(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
void tracking(int top_frame, int *track_x, int *track_y, int *int_vx, int *int_vy, int time_to)
{
float vx, vy;
 
vx = (float)(sequence[top_frame - 1].xb - sequence[top_frame - 2].xb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vx *= 1000;
 
vy = (float)(sequence[top_frame - 1].yb - sequence[top_frame - 2].yb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vy *= 1000;
 
*track_x = sequence[top_frame - 1].xb + vx * time_to;
*track_y = sequence[top_frame - 1].yb + vy * time_to;
 
*int_vx = vx * 1000;
*int_vy = vy * 1000;
}
 
TASK tracking_task(void *arg)
{
// static unsigned int n_frame = 0;
char found;
TPixel *grabber_frame;
int top_frame = 0;
TDataObj current;
TTracking *track;
 
frameCAB = PXC_GetCab();
 
grabber_frame = cab_getmes(frameCAB);
 
// Executes first time
found = scan_all_frame(&current, grabber_frame);
if (found) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
}
 
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
 
while (1) {
// Acquisizione immagine corrente
grabber_frame = (TPixel *)cab_getmes(frameCAB);
track = (TTracking *)cab_reserve(trackingCAB);
 
// Estrazione della nuova trasformata sul frame corrente
if (found) {
found = scan_window_frame(&current, grabber_frame, current.xb, current.yb, img_border);
} else {
found = scan_all_frame(&current, grabber_frame);
}
 
track->found = found;
 
if (found) {
if (top_frame < N_FRAMES) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
} else {
top_frame = 0;
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
}
 
track->top_frame = top_frame;
memcpy(&track->current, &current, sizeof(TDataObj));
 
if (top_frame > 1) {
tracking(top_frame, &track->predx, &track->predy,
&track->vx, &track->vy, 100);
}
} else {
track->top_frame = top_frame = 0;
}
 
// Release CABs
cab_putmes(trackingCAB, (char *)track);
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
}
}
 
 
 
 
 
 
 
/*
*
*
*
* Camera task
*
*
*
*
*/
 
 
TASK camera_task(void *arg)
{
register int i,j,col,row;
static unsigned int n_frame = 0;
TPixel *grabber_frame;
TTracking *track;
char st[50];
 
// Inizializzazione del task
frameCAB = PXC_GetCab();
 
while (1) {
n_frame++;
sprintf(st, "frame n. %5d", n_frame);
 
grx_text(st, 400, 224, white, 0);
 
// Acquisizione immagine corrente
grabber_frame = cab_getmes(frameCAB);
 
for (i=1; i<IMG_ROW-1; i++)
for (j=0; j<IMG_COL; j++) {
col = (j*(N_COL-1))/(IMG_COL-1);
row = (i*(N_ROW-1))/(IMG_ROW-1);
converted_image[i*IMG_COL+j] = gray_palette[*(grabber_frame+row*N_COL+col)];
}
 
// Release CAB
cab_unget(frameCAB, grabber_frame);
 
for (j=0; j<IMG_COL; j++) {
converted_image[j] = gray_palette[0];
converted_image[(IMG_ROW-1)*IMG_COL+j] = gray_palette[0];
}
 
mutex_lock(&mutex);
grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
(BYTE *)converted_image);
mutex_unlock(&mutex);
 
track = (TTracking *)cab_getmes(trackingCAB);
 
if (track->found) {
mutex_lock(&mutex);
// sprintf(st, "found: %d", track->found);
// grx_text(st, 400, 280, 255, 0);
 
if (track->top_frame > 1) {
int px, py;
 
// sprintf(st, "top_frame %5d", track->top_frame);
// grx_text(st, 400, 270, 255, 0);
 
if (track->predx < img_border)
px = img_border;
else if (track->predx > N_COL-img_border)
px = N_COL-img_border;
else
px = track->predx;
 
if (track->predy < img_border)
py = img_border;
else if (track->predy > N_ROW-img_border)
py = N_ROW-img_border;
else
py = track->predy;
 
grx_disc(IMG_X+(px*2)/3, IMG_Y+(py*2)/3, 3, 127);
 
// grx_disc(IMG_X+(current.xb*2)/3, IMG_Y+(current.yb*2)/3, 3, 127);
grx_rect(IMG_X+(track->current.x1*2)/3, IMG_Y+(track->current.y1*2)/3,
IMG_X+(track->current.x2*2)/3, IMG_Y+(track->current.y2*2)/3, 127);
 
sprintf(st, "speed = (%5d, %5d) pix/s", track->vx, track->vy);
grx_text(st, 400, 232, white, 0);
}
mutex_unlock(&mutex);
}
cab_unget(trackingCAB, (char *)track);
 
task_endcycle();
}
}
 
 
 
 
 
/*
*
*
*
* Framegrabber Initialization
*
*
*
*
*/
 
void start_listener(TIME p);
 
void framegrabber_close(void *arg)
{
PXC_Close();
}
 
void scenario_framegrabber()
{
grx_text("Camera" , 384, WAVE_Y-WAVE_HEIGHT-10, rgb16(0,0,255), black);
grx_line(384,WAVE_Y-WAVE_HEIGHT-1,639,WAVE_Y-WAVE_HEIGHT-1,red);
}
 
void init_framegrabber(void)
{
register int i;
KEY_EVT my_key;
TIME period;
 
my_key.ascii = 'a';
my_key.scan = KEY_A;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_up_function);
 
my_key.ascii = 'z';
my_key.scan = KEY_Z;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_down_function);
 
my_key.ascii = 's';
my_key.scan = KEY_S;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_up_function);
 
my_key.ascii = 'x';
my_key.scan = KEY_X;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_down_function);
 
// Aggiusta la palette
for (i = 0; i < 256; i++)
gray_palette[i] = rgb16(i,i,i);
//for (i = 0; i < 256; i++)
// grx_setcolor(i, i/4, i/4, i/4);
 
mutex_lock(&mutex);
// grx_text("Grabber enabled: no test!", 10, 10, 255, 0);
 
// Some messages on screen
// grx_text("A-Z change threshold", 400, 240, 255, 0);
// grx_text("S-X change window borders", 400, 250, 255, 0);
mutex_unlock(&mutex);
 
period = PXC_Initiate(4);
 
if (!period) {
grx_close();
cprintf("Problemi nell'inizializzazione del framegrabber\n");
halt();
sys_end();
} else {
TTracking *trdata;
// tracking CAB init
trackingCAB = cab_create("trackingCAB", sizeof(TTracking), 3);
trdata = (TTracking *)cab_reserve(trackingCAB);
trdata->found = 0;
cab_putmes(trackingCAB, (char *)trdata);
 
start_listener(period);
}
 
sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
}
 
 
void start_listener(TIME period)
{
SOFT_TASK_MODEL m1, m2;
 
soft_task_default_model(m1);
soft_task_def_level(m1,1);
soft_task_def_met(m1,WCET_TRACKING);
soft_task_def_usemath(m1);
// soft_task_def_aperiodic(m1);
soft_task_def_period(m1,(PERIOD_TRACKING));
soft_task_def_group(m1,1);
soft_task_def_ctrl_jet(m1);
soft_task_def_skip_arrivals(m1);
tracking_PID = task_create("track", tracking_task, &m1, NULL);
if (tracking_PID == -1) {
grx_close();
perror("FFTPlay: Could not create task <tra>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <tracking>\n");
sys_end();
}
 
soft_task_default_model(m2);
soft_task_def_level(m2,1);
soft_task_def_met(m2,WCET_CAMERA);
soft_task_def_usemath(m2);
// soft_task_def_aperiodic(m2);
soft_task_def_period(m2,PERIOD_CAMERA);
soft_task_def_group(m2,1);
soft_task_def_ctrl_jet(m2);
// soft_task_def_skip_arrivals(m2);
camera_PID = task_create("cam", camera_task, &m2, NULL);
if (camera_PID == -1) {
grx_close();
perror("FFTPlay: Could not create task <came>\n");
ll_abort(54);
perror("FFTPlay: Could not create task <camera>\n");
sys_end();
}
 
}
 
void start_framegrabber()
{
// PXC_Push_Listener(tracking_PID,2);
PXC_Start();
}
/unsupported/tags/rel_0_5/thdemo/demo.h
0,0 → 1,280
 
 
#include <ll/ll.h>
#include <kernel/types.h>
#include <kernel/descr.h>
#include <math.h>
#include <drivers/glib.h>
#include <drivers/keyb.h>
 
 
#define FFT_ON
#define FRAMEGRABBER_ON
#define JET_ON
#define BALL_ON
 
/*
*
* WCET, Periods and Models
*
*/
 
 
/* define if you want NRT or SOFT... */
#define TASK_TYPE SOFT
//#define TASK_TYPE NRT
 
// on Celeron 366
#define WCET_WAVE 450
#define WCET_FFT 722
#define WCET_EQU 1000
#define WCET_EQU2D 318
 
#define PERIOD_WAVE 40000
#define PERIOD_FFT 3000
#define PERIOD_EQU 40000
#define PERIOD_EQU2D 3000
 
 
 
 
#define WCET_TRACKING 4000
#define WCET_CAMERA 7000
 
#define PERIOD_TRACKING 40000
#define PERIOD_CAMERA 40000
 
 
#define WCET_JETCTRL 2600
#define WCET_JETDUMMY 1000
#define WCET_JETSLIDE 1000
 
#define PERIOD_JETCTRL 100000
#define PERIOD_JETDUMMY 100000
#define PERIOD_JETSLIDE 100000
 
 
#define WCET_BALL 60
 
#define PERIOD_BALL 10000
 
 
/*
*
* Soundcard related defines
*
*/
 
 
/* Samples are 16-bit signed integers */
typedef short SAMPLE;
#define MAX_SAMPLE 32768
 
 
 
/*
*
* FFT defines
*
*/
 
/* Numbers of samples of the sample window */
#define WINDATA_NSAMPLES 512
 
/* task WAVE */
/* the point (wave_x,wave_y) is on the center left of the area... */
#define WAVE_NSAMPLES 384
#define WAVE_X 0
#define WAVE_Y 64
#define WAVE_HEIGHT 32
 
/* task FFT */
#define FFT_NSAMPLES 512
#define PWR_NSAMPLES (FFT_NSAMPLES/2+1)
 
/* task EQU */
/* the point (equ_x, equ_y) is the top right corner */
#define EQU_NSAMPLES PWR_NSAMPLES
#define EQU_X 64
#define EQU_Y 128
#define EQU_HEIGHT 64
#define EQU_SHADE
 
/* task EQU2D */
/* the point (equ2d_x, equ2d_y) is the top left corner */
#define EQU2D_NSAMPLES EQU_NSAMPLES
#define EQU2D_X 128
#define EQU2D_Y EQU_Y
#define EQU2D_WIDTH 255
#define EQU2D_CLIP 255
 
/* scenario */
#define SCENARIO_NLABEL 16
 
/* Scale factors */
#define FFT_SCALE (16384.0)
#define EQU_SCALE (32.0)
#define EQU2D_SCALE (8.0)
//#define EQU_SCALE (64.0)
//#define EQU2D_SCALE (16.0)
 
 
 
/* Informations about the sampling rate and buffers */
extern WORD rawdata_nsamples;
extern WORD rawdata_buffer_size;
extern WORD rawdata_freq;
 
 
 
/*
*
* Global Stuffs
*
*/
 
/* graphic mutex... */
extern mutex_t mutex;
 
/* useful colors... */
extern int white;
extern int black;
extern int red;
extern int gray;
 
/* define if shorts critical sections wanted */
#define SHORT_CRITICAL_SECTIONS(x) \
if (!((x)%64)) \
{ \
mutex_lock(&mutex); \
mutex_unlock(&mutex); \
}
 
void init_fftplay(int freq);
void init_framegrabber();
void init_jetcontrol();
void init_ball(void);
void start_framegrabber();
 
 
void scenario_jetcontrol(void);
void scenario_fftplay(int f);
void scenario_framegrabber();
void scenario_ball();
 
void compute_params(int *freq,WORD *nsamp);
 
char * itoa(int n, char *s);
 
/*
*
* Framegrabber stuffs
*
*/
 
// if defined... object black on a white background
#ifndef __BLACK_ON_WHITE
#define __BLACK_ON_WHITE
#endif
 
#define ABS_NUM(a) ((a >= 0) ? a : -a)
#define MIN_NUM(a, b) ((a < b) ? a : b)
#define MAX_NUM(a, b) ((a > b) ? a : b)
 
 
// Cols and rows of the framegrabber image
#define N_COL 384
#define N_ROW 288
#define N_BPS 8 // Bits per pixel
#define N_GRIGI 256
 
#define N_FRAMES 100
 
/* pixel of the video image */
#define IMG_COL 256
#define IMG_ROW 192
 
/* position of the video image */
#define IMG_X 384
#define IMG_Y 32
 
// I singoli pixel sono caratteri a 8 bit
typedef unsigned char TPixel;
 
typedef struct {
int x1, y1;
int x2, y2;
int xb, yb;
TIME time_stamp;
} TDataObj;
 
typedef struct {
int found;
int top_frame;
int vx,vy;
int predx;
int predy;
TDataObj current;
} TTracking;
 
 
float distance(unsigned int x1, unsigned int y1,
unsigned int x2, unsigned int y2);
 
char scan_all_frame(TDataObj *data, TPixel *in_frame);
 
char scan_window_frame(TDataObj *data, TPixel *in_frame,
unsigned int xc, unsigned int yc, int border);
 
void threshold_up_function(KEY_EVT key);
void threshold_down_function(KEY_EVT key);
 
void border_up_function(KEY_EVT key);
void border_down_function(KEY_EVT key);
 
void tracking(int top_frame, int *track_x, int *track_y, int *int_vx, int *int_vy, int time_to);
 
TASK elab_image_TASK(void);
 
 
 
/*
*
* JETCONTROL stuffs
*
*/
 
#define JET_NTASK 18
#define JET_Y_NAME 320
 
#define DUMMY_PID 1
 
#define JET_DUMMY_WIDTH 210
#define JET_DUMMY_HEIGHT 40
 
/* the point (x, y) is the top left corner */
#define JET_DUMMY_X 428
#define JET_DUMMY_Y 264
 
#define JET_SLIDE_WIDTH 50
#define JET_SLIDE_X 576
 
 
 
 
/*
*
* BALL stuffs
*
*/
 
// x and y corners are specified whithout consider a border of 3 pixels
#define BALL_Y 475 /* position of the floor */
#define BALL_HEIGHT 70 /* initial height of the ball */
#define BALL_XMIN 3 /* min position X of the ball */
#define BALL_XMAX 380 /* max position X of the ball */
#define BALL_VELX 5. /* horizontal ball velocity */
#define BALL_VYMIN 11. /* velocit… minima per suono */
#define BALL_MAX_P 50 /* max number of balls */
 
#define BALL_GROUP 2 /* task group of the balls */
/unsupported/tags/rel_0_5/thdemo/readme.txt
0,0 → 1,17
PJ's Thesis demo
----------------
 
This is my Thesis Demo. The demo works correctly on my PC :-)
(a celeron 366 Mhz), Probably It will have some problems with other slower PCs.
 
The demo simply reads data from the soundblaster, then print the sound wave, compute a power spectrun and display it on the screen.
 
Then there is another few tasks that reads data from a framegrabber and track a black image on a white board.
 
Moreover, there are some noise balls to test the system in overload conditions, and there are finally a few tasks that displays the system load.
 
If you have any problems using this demo, please contact pj@sssup.it
 
bye
 
Paolo
/unsupported/tags/rel_0_5/thdemo/camera2.c
0,0 → 1,424
// framegrabber stuffs
 
/* File name ......... : ELABOR.C
* Project............ :
* Object ............ :
* Author ............ : Facchinetti Tullio
* Language .......... : C
* Compiler .......... : GNU C
* Operative system .. : MS-DOS/HARTIK
* Creation data ..... : 04/03/2000
* Last modify ....... : 19/11/99
*/
 
 
 
 
#include <kernel/func.h>
#include <modules/cabs.h>
#include <stdio.h>
#include <drivers/pxc.h>
#include "demo.h"
 
PID image_elab_PID;
TIME periodo;
CAB PXC_CAB;
 
static CAB frameCAB; // CAB di deposito delle immagini
static TDataObj current, older;
 
// extern in INIT.C
int img_border = 10;
int window_width = 40;
int window_height = 40;
 
// a 256 grayscale palette
WORD gray_palette[256];
 
// the image to be putted on the screen
WORD converted_image[IMG_COL*IMG_ROW];
 
 
#ifdef __BLACK_ON_WHITE
TPixel pix_threshold = 64;
#else
TPixel pix_threshold = 243;
#endif
 
 
// Global for testing!!!
static char st[50];
TIME before;
 
TDataObj sequence[N_FRAMES];
int top_frame = 0;
 
double dist, speed;
 
static TPixel *grabber_frame;
 
void border_up_function(KEY_EVT key)
{
img_border++;
}
 
void border_down_function(KEY_EVT key)
{
img_border--;
}
 
void threshold_up_function(KEY_EVT key)
{
pix_threshold++;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
//grx_text(st, 400, 300, 255, 0);
mutex_unlock(&mutex);
}
 
void threshold_down_function(KEY_EVT key)
{
pix_threshold--;
sprintf(st, "threshold %4d", pix_threshold);
mutex_lock(&mutex);
//grx_text(st, 400, 300, 255, 0);
mutex_unlock(&mutex);
}
 
float distance(unsigned int x1, unsigned int y1,
unsigned int x2, unsigned int y2)
{
return(sqrt(((y2 - y1) * (y2 - y1)) + ((x2 - x1) * (x2 - x1))));
}
 
char scan_window_frame(TDataObj *data, TPixel *in_frame,
unsigned int xc, unsigned int yc, int border)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
int x1, y1, x2, y2; // Must be int!!!
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
x1 = MAX_NUM((xc - window_width / 2), (border));
y1 = MAX_NUM((yc - window_height / 2), (border));
x2 = MIN_NUM((xc + window_width / 2), (N_COL - border));
y2 = MIN_NUM((yc + window_height / 2), (N_ROW - border));
 
for (i = y1; i < y2; i++) {
for (j = x1; j < x2; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
*(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
*(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
char scan_all_frame(TDataObj *data, TPixel *in_frame)
{
unsigned long int offset;
unsigned int i, j;
TPixel pix;
double sum_x = 0.0, sum_y = 0.0;
unsigned int n_pix = 0;
char found;
 
data->x1 = N_COL;
data->y1 = N_ROW;
data->x2 = data->y2 = 0;
data->xb = data->yb = -1;
data->time_stamp = -1;
 
found = 0;
 
// In a single image scanning it performs thresholding and computation
for (i = img_border; i < N_ROW - img_border; i++) {
for (j = img_border; j < N_COL - img_border; j++) {
offset = i * N_COL + j;
pix = *(in_frame + offset);
 
#ifdef __BLACK_ON_WHITE
// Pixel found (object is black, background is white)
if (pix < pix_threshold) {
#else
// Pixel found (object is white, background is black)
if (pix > pix_threshold) {
#endif
data->time_stamp = sys_gettime(NULL);
found = 1;
n_pix++;
sum_x += j;
sum_y += i;
*(in_frame + offset) = 0;
if (i < data->y1)
data->y1 = i;
if (i > data->y2)
data->y2 = i;
if (j < data->x1)
data->x1 = j;
if (j > data->x2)
data->x2 = j;
 
} else {
*(in_frame + offset) = 255;
}
}
}
data->xb = sum_x / n_pix;
data->yb = sum_y / n_pix;
return(found);
}
 
void tracking(int *track_x, int *track_y, int time_to)
{
float vx, vy;
 
vx = (float)(sequence[top_frame - 1].xb - sequence[top_frame - 2].xb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vx *= 1000000;
 
vy = (float)(sequence[top_frame - 1].yb - sequence[top_frame - 2].yb) /
(float)(sequence[top_frame - 1].time_stamp - sequence[top_frame - 2].time_stamp);
vy *= 1000000;
 
(*track_x) = sequence[top_frame - 1].xb + vx * time_to;
(*track_y) = sequence[top_frame - 1].yb + vy * time_to;
 
sprintf(st, "speed = (%5d, %5d) pix/s", (int)vx, (int)vy);
mutex_lock(&mutex);
//grx_text(st, 400, 410, 255, 0);
mutex_unlock(&mutex);
}
 
void put_frame(TPixel *frame)
{
register int i,j,col,row;
 
for (i=0; i<IMG_ROW; i++)
for (j=0; j<IMG_COL; j++) {
col = (j*(N_COL-1))/(IMG_COL-1);
row = (i*(N_ROW-1))/(IMG_ROW-1);
converted_image[i*IMG_COL+j] = gray_palette[*(frame+row*N_COL+col)];
}
 
mutex_lock(&mutex);
//grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
// (BYTE *)converted_image);
mutex_unlock(&mutex);
}
 
 
TASK elab_image_TASK(void)
{
// register int i, j;
static unsigned int n_frame = 0;
char found;
int pred_x, pred_y;
 
// Inizializzazione del task
frameCAB = PXC_GetCab();
 
grabber_frame = cab_getmes(frameCAB);
 
// Executes first time
found = scan_all_frame(&current, grabber_frame);
// found =0;
if (found) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
}
 
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
 
while (1) {
 
// before = sys_gettime(NULL);
 
n_frame++;
sprintf(st, "frame n. %5d", n_frame);
 
mutex_lock(&mutex);
//grx_text(st, 400, 290, 255, 0);
 
sprintf(st, "top_frame %5d", top_frame);
//grx_text(st, 400, 270, 255, 0);
 
sprintf(st, "found: %d!", found);
//grx_text(st, 400, 280, 255, 0);
mutex_unlock(&mutex);
 
// Acquisizione immagine corrente
grabber_frame = cab_getmes(frameCAB);
 
// copy current in older
memcpy(&older, &current, sizeof(TDataObj));
 
// Estrazione della nuova trasformata sul frame corrente
if (found) {
found = scan_window_frame(&current, grabber_frame, current.xb, current.yb, img_border);
} else {
found = scan_all_frame(&current, grabber_frame);
}
 
// //grx_putimage(0, 0, N_COL - 1, N_ROW - 1, grabber_frame);
put_frame(grabber_frame);
 
if (found) {
if (top_frame < N_FRAMES) {
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
top_frame++;
} else {
top_frame = 0;
memcpy(&sequence[top_frame], &current, sizeof(TDataObj));
}
 
if (top_frame > 1) {
tracking(&pred_x, &pred_y, 100);
 
mutex_lock(&mutex);
// //grx_disc(IMG_X+(pred_x*2)/3, IMG_Y+(pred_y*2)/3, 3, 127);
 
//grx_disc(IMG_X+(current.xb*2)/3, IMG_Y+(current.yb*2)/3, 3, 127);
//grx_rect(IMG_X+(current.x1*2)/3, IMG_Y+(current.y1*2)/3,
// IMG_X+(current.x2*2)/3, IMG_Y+(current.y2*2)/3, 127);
mutex_unlock(&mutex);
 
}
} else {
top_frame = 0;
}
 
// Release CAB
cab_unget(frameCAB, grabber_frame);
 
// sprintf(st, "durata = %3d ms", (int)(sys_gettime(NULL) - before)/1000);
// mutex_lock(&mutex);
// //grx_text(st, 400, 400, 255, 0);
// mutex_unlock(&mutex);
 
task_endcycle();
}
}
 
 
void start_listener(void);
 
void framegrabber_close(void *arg)
{
PXC_Close();
}
 
void init_framegrabber(void)
{
register int i;
KEY_EVT my_key;
 
my_key.ascii = 'a';
my_key.scan = KEY_A;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_up_function);
 
my_key.ascii = 'z';
my_key.scan = KEY_Z;
keyb_hook(my_key, (void (*)(KEY_EVT *))threshold_down_function);
 
my_key.ascii = 's';
my_key.scan = KEY_S;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_up_function);
 
my_key.ascii = 'x';
my_key.scan = KEY_X;
keyb_hook(my_key, (void (*)(KEY_EVT *))border_down_function);
 
// Aggiusta la palette
for (i = 0; i < 256; i++)
gray_palette[i] = rgb16(i,i,i);
//for (i = 0; i < 256; i++)
// grx_setcolor(i, i/4, i/4, i/4);
 
mutex_lock(&mutex);
// grx_text("Grabber enabled: no test!", 10, 10, 255, 0);
 
// Some messages on screen
//grx_text("A-Z change threshold", 400, 240, 255, 0);
//grx_text("S-X change window borders", 400, 250, 255, 0);
mutex_unlock(&mutex);
 
periodo = PXC_Initiate(3);
PXC_CAB = PXC_GetCab();
 
if (!periodo) {
//grx_close();
cprintf("Problemi nell'inizializzazione del driver\n");
sys_end();
} else {
start_listener();
}
 
sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
}
 
 
void start_listener(void)
{
SOFT_TASK_MODEL m_soft;
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,IMAGING_WCET);
soft_task_def_usemath(m_soft);
soft_task_def_aperiodic(m_soft);
soft_task_def_period(m_soft,(periodo*3));
soft_task_def_group(m_soft,1);
soft_task_def_ctrl_jet(m_soft);
 
image_elab_PID = task_create("imaging", elab_image_TASK, &m_soft, NULL);
 
/* task_activate( image_elab_PID);
PXC_Push_Listener(image_elab_PID,2);
PXC_Start();*/
}
 
void start_framegrabber()
{
PXC_Push_Listener(image_elab_PID,2);
PXC_Start();
}
/unsupported/tags/rel_0_5/thdemo/ball.c
0,0 → 1,164
/*--------------------------------------------------------------*/
/* SIMULATION OF JUMPING BALLS */
/*--------------------------------------------------------------*/
 
/* CVS $Id: ball.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $ */
 
 
#include "demo.h"
#include <kernel/func.h>
#include <stdlib.h>
 
#define R 2 /* dimension of a ball */
#define G 9.8 /* acceleration of gravity */
 
static int ballexit = 0;
static int npc = 0; /* number of tasks created */
 
/*--------------------------------------------------------------*/
/* Periodic task for ball simulation */
/*--------------------------------------------------------------*/
 
TASK palla(int i)
{
int x, y; /* coordinate grafiche pallina */
int ox, oy; /* vecchia posizione pallina */
int x0, y0; /* posizione iniziale X pallina */
float vx, vy; /* velocit… della pallina */
float vy0; /* velocita' pallina al primo rimbalzo */
float ty, tx; /* variabile temporale */
float dt; /* incremento temporale */
 
y = oy = y0 = BALL_HEIGHT;
x = ox = x0 = BALL_XMIN;
 
vy0= sqrt(2. * G * (float)BALL_HEIGHT);
vy = 0;
vx = BALL_VELX + rand()%9;
tx = 0;
ty = 0;
dt = ((float)PERIOD_BALL)/100000;
 
while (1) {
y = y0 + vy*ty - .5*G*ty*ty;
x = x0 + vx * tx;
 
if (y < 0) {
y = 0;
 
if (vy == 0.0)
vy = vy0;
else if (vy < BALL_VYMIN)
vy = vy0 * (1.0 - (rand()%50)/100.0);
else
vy = 0.9 * vy;
 
ty = 0.0;
y0 = 0;
}
 
if (x > BALL_XMAX) {
tx = 0.0;
x0 = BALL_XMAX;
vx = -vx;
x = x0 + vx * tx;
}
 
if (x < BALL_XMIN) {
tx = 0.0;
x0 = BALL_XMIN;
vx = -vx;
x = x0 + vx * tx;
}
 
mutex_lock(&mutex);
grx_disc(ox, oy, R, 0);
ox = x;
oy = BALL_Y - y;
mutex_unlock(&mutex);
 
if (ballexit) {
npc--;
return 0;
}
 
mutex_lock(&mutex);
grx_disc(ox, oy, R, i);
mutex_unlock(&mutex);
 
{
int xxx;
for (xxx=0; xxx<10000; xxx++);
}
ty += dt;
tx += dt;
task_endcycle();
}
}
 
void killball(KEY_EVT *k)
{
ballexit = 1;
}
 
void ballfun(KEY_EVT *k)
{
SOFT_TASK_MODEL mp;
int r,g,b;
PID pid;
 
if (npc == BALL_MAX_P) return;
 
ballexit = 0;
 
r = 64 + rand()%192;
g = 64 + rand()%192;
b = 64 + rand()%192;
 
soft_task_default_model(mp);
soft_task_def_level(mp,1);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp, (void *)rgb16(r,g,b));
soft_task_def_group(mp, BALL_GROUP);
soft_task_def_met(mp, WCET_BALL);
soft_task_def_period(mp,PERIOD_BALL);
soft_task_def_usemath(mp);
pid = task_create("palla", palla, &mp, NULL);
if (pid != NIL) {
task_activate(pid);
npc++;
}
}
 
 
/*--------------------------------------------------------------*/
/* MAIN process */
/*--------------------------------------------------------------*/
 
void scenario_ball()
{
grx_text("Noise", 0, BALL_Y-BALL_HEIGHT-15, rgb16(0,0,255), black);
grx_line(0,BALL_Y-BALL_HEIGHT-6,383,BALL_Y-BALL_HEIGHT-6,red);
}
 
void init_ball(void)
{
KEY_EVT k;
 
mutex_lock(&mutex);
grx_rect(BALL_XMIN-R-1, BALL_Y-BALL_HEIGHT-R-1,
BALL_XMAX+R+1, BALL_Y+R+1, rgb16(0,200,0));
mutex_unlock(&mutex);
 
k.flag = 0;
k.scan = KEY_SPC;
k.ascii = ' ';
keyb_hook(k,ballfun);
 
k.flag = 0;
k.scan = KEY_BKS;
k.ascii = ' ';
keyb_hook(k,killball);
}
 
/*--------------------------------------------------------------*/
/unsupported/tags/rel_0_5/thdemo/ball2.c
0,0 → 1,156
/*--------------------------------------------------------------*/
/* SIMULATION OF JUMPING BALLS */
/*--------------------------------------------------------------*/
 
/* CVS $Id: ball2.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $ */
 
 
#include "demo.h"
#include <kernel/func.h>
#include <stdlib.h>
//#include <drivers/glib.h>
//#include <drivers/keyb.h>
//#include <math.h>
 
#define R 2 /* dimension of a ball */
#define G 9.8 /* acceleration of gravity */
#define BASE 30 /* position of the floor */
#define TOP 80 /* initial height of the ball */
#define XMIN 3 /* min position X of the ball */
#define XMAX 380 /* max position X of the ball */
#define VELX 5. /* horizontal ball velocity */
#define VMIN 11. /* velocit… minima per suono */
#define ESC 27 /* ASCII code of ESCAPE key */
#define MAX_P 50 /* max number of balls */
 
double v0[MAX_P]; /* impact velocity with floor */
 
/*--------------------------------------------------------------*/
/* Periodic task for ball simulation */
/*--------------------------------------------------------------*/
 
TASK palla(int i)
{
int x, y; /* coordinate grafiche pallina */
int ox, oy; /* vecchia posizione pallina */
int x0; /* posizione iniziale X pallina */
float vx, vy; /* velocit… della pallina */
float t, tx; /* variabile temporale */
float dt; /* incremento temporale */
double arg; /* variabile di appoggio */
 
y = oy = TOP;
x = ox = x0 = XMIN;
 
arg = 2. * G * (float)TOP;
vy = sqrt(arg);
vx = VELX;// + rand()%10;
tx = 0.0;
t = vy / G;
dt = 0.1;
 
while (1) {
y = TOP + vy*t - .5*G*t*t;
x = x0 + vx * tx;
 
if (y < BASE) {
t = 0.0;
v0[i] = .9 * v0[i];
// if (v0[i]<VMIN) {
 
// v0[i] = sqrt(2. * G * (float)TOP);
// v0[i] = sqrt(arg);// * (1-((float)(rand()%20))/100);
//vx = vx + rand()%5 - 2;
//tx = 0.0;
//x0 = x;
// }
 
vy = v0[i];
y = TOP + vy*t - .5*G*t*t;
}
 
 
if (x > XMAX) {
tx = 0.0;
x0 = XMAX;
vx = -vx;
x = x0 + vx * tx;
}
 
if (x < XMIN) {
tx = 0.0;
x0 = XMIN;
vx = -vx;
x = x0 + vx * tx;
}
y = 480-y;
 
mutex_lock(&mutex);
grx_disc(ox, oy, R, 0);
grx_disc(x, y, R, i);
mutex_unlock(&mutex);
 
oy = y; ox = x;
t += dt;
tx += dt;
task_endcycle();
}
}
 
 
void ballfun(KEY_EVT *k)
{
static int npc = 0; /* number of tasks created */
SOFT_TASK_MODEL mp;
int r,g,b;
PID pid;
 
if (npc == MAX_P) return;
 
r = 64 + rand()%192;
g = 64 + rand()%192;
b = 64 + rand()%192;
 
soft_task_default_model(mp);
soft_task_def_level(mp,1);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp, rgb16(r,g,b));
soft_task_def_group(mp, 1);
soft_task_def_met(mp, WCET_BALL);
soft_task_def_period(mp,PERIOD_BALL);
soft_task_def_usemath(mp);
pid = task_create("palla", palla, &mp, NULL);
if (pid != NIL) {
task_activate(pid);
npc++;
}
}
 
 
/*--------------------------------------------------------------*/
/* MAIN process */
/*--------------------------------------------------------------*/
 
 
void init_ball(void)
{
char c; /* character from keyboard */
int i; /* pressed number */
double arg; /* temporary variable */
KEY_EVT k;
 
arg = 2. * G * (float)TOP;
for (i=0; i<MAX_P; i++) v0[i] = sqrt(arg);
 
mutex_lock(&mutex);
grx_rect(XMIN-R-1, 480-TOP-BASE-R-1, XMAX+R+1, 480-BASE+R+1, 14);
mutex_unlock(&mutex);
 
k.flag = 0;
k.scan = KEY_SPC;
k.ascii = ' ';
keyb_hook(k,ballfun);
 
}
 
/*--------------------------------------------------------------*/
/unsupported/tags/rel_0_5/thdemo/camera4.c
0,0 → 1,168
// framegrabber stuffs
 
/* File name ......... : ELABOR.C
* Project............ :
* Object ............ :
* Author ............ : Facchinetti Tullio
* Language .......... : C
* Compiler .......... : GNU C
* Operative system .. : MS-DOS/HARTIK
* Creation data ..... : 04/03/2000
* Last modify ....... : 19/11/99
*/
 
 
 
 
#include <kernel/func.h>
#include <modules/cabs.h>
#include <stdio.h>
#include <drivers/pxc.h>
#include "demo.h"
 
PID image_elab_PID;
TIME periodo;
CAB PXC_CAB;
 
static CAB frameCAB; // CAB di deposito delle immagini
static TDataObj current, older;
 
// extern in INIT.C
int img_border = 10;
int window_width = 40;
int window_height = 40;
 
// a 256 grayscale palette
WORD gray_palette[256];
 
// the image to be putted on the screen
WORD converted_image[IMG_COL*IMG_ROW];
 
 
#ifdef __BLACK_ON_WHITE
TPixel pix_threshold = 64;
#else
TPixel pix_threshold = 243;
#endif
 
 
// Global for testing!!!
static char st[50];
TIME before;
 
TDataObj sequence[N_FRAMES];
int top_frame = 0;
 
double dist, speed;
 
static TPixel *grabber_frame;
 
void put_frame(TPixel *frame)
{
register int i,j,col,row;
 
for (i=1; i<IMG_ROW-1; i++)
for (j=0; j<IMG_COL; j++) {
col = (j*(N_COL-1))/(IMG_COL-1);
row = (i*(N_ROW-1))/(IMG_ROW-1);
converted_image[i*IMG_COL+j] = gray_palette[*(frame+row*N_COL+col)];
}
 
for (j=0; j<IMG_COL; j++) {
converted_image[j] = gray_palette[0];
converted_image[(IMG_ROW-1)*IMG_COL+j] = gray_palette[0];
}
 
mutex_lock(&mutex);
grx_putimage(IMG_X, IMG_Y, IMG_X+IMG_COL-1, IMG_Y+IMG_ROW-1,
(BYTE *)converted_image);
mutex_unlock(&mutex);
}
 
 
TASK elab_image_TASK(void)
{
// register int i, j;
static unsigned int n_frame = 0;
char found;
int pred_x, pred_y;
 
// Inizializzazione del task
frameCAB = PXC_GetCab();
 
while (1) {
n_frame++;
sprintf(st, "frame n. %5d", n_frame);
 
mutex_lock(&mutex);
grx_text(st, 400, 290, 255, 0);
mutex_unlock(&mutex);
 
// Acquisizione immagine corrente
grabber_frame = cab_getmes(frameCAB);
 
put_frame(grabber_frame);
 
// Release CAB
cab_unget(frameCAB, grabber_frame);
 
task_endcycle();
}
}
 
 
void start_listener(void);
 
void framegrabber_close(void *arg)
{
PXC_Close();
}
 
void init_framegrabber(void)
{
register int i;
KEY_EVT my_key;
 
// Aggiusta la palette
for (i = 0; i < 256; i++)
gray_palette[i] = rgb16(i,i,i);
 
periodo = PXC_Initiate(3);
PXC_CAB = PXC_GetCab();
 
if (!periodo) {
grx_close();
cprintf("Problemi nell'inizializzazione del driver\n");
sys_end();
} else {
start_listener();
}
 
sys_atrunlevel(framegrabber_close, NULL, RUNLEVEL_BEFORE_EXIT);
}
 
 
void start_listener(void)
{
SOFT_TASK_MODEL m_soft;
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,IMAGING_WCET);
soft_task_def_usemath(m_soft);
soft_task_def_aperiodic(m_soft);
soft_task_def_period(m_soft,(periodo));
soft_task_def_group(m_soft,1);
soft_task_def_ctrl_jet(m_soft);
 
image_elab_PID = task_create("imaging", elab_image_TASK, &m_soft, NULL);
 
/* task_activate( image_elab_PID);
PXC_Push_Listener(image_elab_PID,2);
PXC_Start();*/
}
 
void start_framegrabber()
{
PXC_Push_Listener(image_elab_PID,1);
PXC_Start();
}
/unsupported/tags/rel_0_5/thdemo/makefile
0,0 → 1,17
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= demo
 
include $(BASE)/config/example.mk
 
demo:
make -f $(SUBMAKE) APP=demo INIT= OTHEROBJS="fft.o camera.o initfile.o jetctrl.o ball.o" SHARKOPT="__FFT__ __OLDCHAR__ __PXC__ __GRX__"
 
 
/unsupported/tags/rel_0_5/tracer/utils/udpdump.c
0,0 → 1,216
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
* Copyright (C) 2002 Paolo Gai
* Copyright (C) 2002 Tomas Lenvall
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: udpdump.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
/* this example simply prints a Shark trace file */
 
// INCLUDES
#include <netinet/in.h>
#include "types.h"
#include "trace.h"
#include "util.h"
 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>/* close() */
#include <string.h> /* memset() */
#include <stdlib.h>
 
 
// GLOBALS
char server_ipaddr[20]; // Store the IP adress of the server
 
// DEFINES
#define LOCAL_SERVER_PORT 20000
#define MAX_MSG 10000
 
// FUNCTIONS
/* */
int dumpsys(trc_system_event_t *sys)
{
printf("%02i\n",sys->task);
return 0;
}
 
/* */
int dumpusr(trc_user_event_t *usr)
{
printf("%8li ",usr->n);
printf("\n");
return 0;
}
 
/* */
int dumpsem(trc_sem_event_t *sem)
{
printf("on [%i]\n",sem->id);
return 0;
}
 
/* */
int dumpfunc(trc_event_t *ev)
{
static int counter=0;
printf("\t%4i ",counter);
counter++;
printf("%12s ",format_time(ev->time));
printf("%-10s ",event_name(ev->event));
 
//printf("%08x\n",(unsigned)ev->sys.event);
//return 0;
switch(event_class(ev->event)) {
case TRC_CLASS_SYSTEM: return dumpsys(&ev->x.sys);
case TRC_CLASS_USER: return dumpusr(&ev->x.usr);
case TRC_CLASS_SEM: return dumpsem(&ev->x.sem);
}
printf("\nEVENT %i... CLASS %i UNKNOWN!\n",ev->event,event_class(ev->event));
return -1;
}
 
 
/* Use UDP/IP to receive the events from the client computer */
int main(int argc, char *argv[])
{
int sd, rc, n, cliLen;
struct sockaddr_in cliAddr, servAddr;
char msg[MAX_MSG];
 
// socket creation
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd < 0) {
printf("%s: cannot open socket \n",argv[0]);
exit(1);
}
 
// bind local server port
servAddr.sin_family = AF_INET;
 
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(LOCAL_SERVER_PORT);
 
rc = bind (sd, (struct sockaddr *)&servAddr,sizeof(servAddr));
if(rc < 0) {
printf("%s: cannot bind port number %d \n",
argv[0], LOCAL_SERVER_PORT);
exit(1);
}
 
while(1){
// init buffer
memset(msg, 0x0, MAX_MSG);
 
// receive message
cliLen = sizeof(cliAddr);
n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *)&cliAddr, &cliLen);
 
printf("Packet received, length %d, %d tracer events.\n", n,
*((short int *)msg));
if(n < 0) {
printf("%s: cannot receive data \n",argv[0]);
continue;
}
// Read the trace we got from the network
read_udp_trace(msg, dumpfunc);
}
 
return 0;
}
 
 
// test main: testing this program from a file (simulating a network package)
// ONLY USED FOR TESTING!!!
 
/*int main(int argc, char *argv[])
{
FILE* fin;
int nr_of_events = 0;
trc_event_t buffer;
char all_events[1000];
char tmpbuf[2];
 
if(argc != 2) {
printf("Missing filename!\n");
return -1;
}
 
// open the file and send event by event
fin = fopen(argv[1], "r");
if (fin == NULL) {
printf("Cannot open file\n");
return -1;
}
// check how many events
while (!feof(fin)) {
fread(&buffer, sizeof(trc_event_t), 1, fin);
nr_of_events++;
}
 
//printf("Nr of events: %d\n", nr_of_events);
 
rewind(fin); // start from the beginning again...
//strncpy(tmpbuf, itoa(nr_of_events), 2);
sprintf(tmpbuf, "%d", nr_of_events);
//printf("tmpbuf: %s\n", tmpbuf);
 
memset(all_events, 0, 1000);
memcpy(all_events, tmpbuf, 2);
printf("all_events(1): %s\n", all_events);
// read all tracer events and store them in an array
fread(all_events + 2, sizeof(trc_event_t), nr_of_events, fin);
fclose(fin);
 
printf("all_events(2): %s\n", all_events);
// send it to the event reader
read_trace(all_events, dumpfunc);
 
return 1;
}
*/
/unsupported/tags/rel_0_5/tracer/utils/jdump.c
0,0 → 1,470
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/*
* Copyright (C) 1999 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: jdump.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:44 $
*/
 
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
 
#include "types.h"
#include <trace.h>
#include "util.h"
 
/*
*
* This filter converts trace file formats from SHARK to JTRACER
*
*/
 
/* All times are dived by this costant. */
#define TIMESCALE 1
 
/* If defined dump on stdout the packets (in ascii) that will be written
* on the output file (the file of the tracer).
*/
 
#define DUMPOUT
 
/*
*
*
*
*/
 
int pippo=0;
 
int writeInt(int h, int x)
{
int y,res;
y=htonl(x);
res=write(h,&y,sizeof(int));
return res!=sizeof(int);
}
 
 
int writeStr(int h, char *s)
{
int res,size;
size=strlen(s);
writeInt(h,size);
res=write(h,s,size);
return res!=size;
}
 
/*
*
*/
 
#define TASK_ARRIVAL 0
#define TASK_SCHEDULE 1
#define TASK_DESCHEDULE 2
#define TASK_END 3
#define TASK_DLINEPOST 4
#define TASK_DLINESET 5
#define TASK_WAIT 6
#define TASK_SIGNAL 7
#define TASK_IDLE 8
#define TASK_NAME 9
 
#define EVT_NUMBER 10
 
char *eventsname[]={
"task_arrival",
"task_schedule",
"task_deschedule",
"task_end",
"task_dlinepost",
"task_dlineset",
"task_wait",
"task_signal",
"task_idle",
"task_name"
};
 
struct j_evt_prolog {
int type;
int time;
};
 
struct j_evt_task {
struct j_evt_prolog p;
int task;
};
 
struct j_evt_dlinepost {
struct j_evt_task t;
int taskD;
int taskD2;
};
 
struct j_evt_dlineset {
struct j_evt_task t;
int taskD;
};
 
struct j_evt_semaph {
struct j_evt_task t;
int res;
char *name;
};
 
struct j_evt_name {
struct j_evt_task t;
char *name;
};
 
/*
*
*/
 
int j_write_prolog(int h, void *ptr)
{
#ifdef DUMPOUT
printf("%10i ",((struct j_evt_prolog *)ptr)->time);
printf("%-18s ",eventsname[((struct j_evt_prolog *)ptr)->type]);
#endif
if (writeInt(h,((struct j_evt_prolog *)ptr)->type)) return -2;
if (writeInt(h,((struct j_evt_prolog *)ptr)->time)) return -3;
return 0;
}
 
int j_write_task(int h, void *ptr)
{
int res;
res=j_write_prolog(h,ptr);
#ifdef DUMPOUT
printf("tsk=%i ",((struct j_evt_task *)ptr)->task);
#endif
if (res) return res;
if (writeInt(h,((struct j_evt_task *)ptr)->task)) return -4;
return 0;
}
 
int j_write_dlinepost(int h, void *ptr)
{
int res;
res=j_write_task(h,ptr);
if (res) return res;
if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD)) return -5;
if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD2)) return -6;
return 0;
}
 
int j_write_dlineset(int h, void *ptr)
{
int res;
res=j_write_task(h,ptr);
if (res) return res;
if (writeInt(h,((struct j_evt_dlineset *)ptr)->taskD)) return -7;
return 0;
}
 
int j_write_semaph(int h, void *ptr)
{
int res;
res=j_write_task(h,ptr);
if (res) return res;
if (writeInt(h,((struct j_evt_semaph *)ptr)->res)) return -8;
if (writeStr(h,((struct j_evt_semaph *)ptr)->name)) return -9;
return 0;
}
 
int j_write_name(int h, void *ptr)
{
int res;
res=j_write_task(h,ptr);
#ifdef DUMPOUT
printf("name='%s' ",((struct j_evt_name *)ptr)->name);
#endif
if (res) return res;
if (writeStr(h,((struct j_evt_name *)ptr)->name)) return -10;
return 0;
}
int writeEvent(int h, void *ptr)
{
int res;
//printf("<%i>",((struct j_evt_prolog*)ptr)->type);
((struct j_evt_prolog*)ptr)->time/=TIMESCALE;
 
switch(((struct j_evt_prolog*)ptr)->type) {
case TASK_ARRIVAL:
case TASK_SCHEDULE:
case TASK_DESCHEDULE:
case TASK_END:
case TASK_IDLE:
res=j_write_task(h,ptr);
break;
case TASK_DLINEPOST:
res=j_write_dlinepost(h,ptr);
break;
case TASK_DLINESET:
res=j_write_dlineset(h,ptr);
break;
case TASK_WAIT:
case TASK_SIGNAL:
res=j_write_semaph(h,ptr);
break;
case TASK_NAME:
res=j_write_name(h,ptr);
break;
default:
return -1;
}
 
#ifdef DUMPOUT
printf(" \n");
#endif
 
return res;
}
 
/*
*
*
*
*/
 
#define MAX_PROC 150
 
//int activated[MAX_PROC];
 
int cxx=0;
/* write MAXC-1 events */
#define MAXC 10000
 
long lasttime;
 
int sys_event(int h, void *param)
{
static int prevtask=-1;
trc_event_t *ptr=(trc_event_t *)param;
struct j_evt_task evt;
 
evt.p.time=ptr->time;
evt.task=ptr->x.sys.task;
 
lasttime=ptr->time;
switch(ptr->event) {
case TRC_CREATE:
return 0;
 
case TRC_ACTIVATE:
case TRC_INTACTIVATION:
 
 
//activated[ptr->x.sys.task]=1;
 
 
evt.p.type=TASK_ARRIVAL;
break;
case TRC_DESTROY:
 
 
//activated[ptr->x.sys.task]=0;
 
 
 
return 0;
 
case TRC_DISABLE:
 
return 0;
case TRC_DELAY:
prevtask=-1;
evt.p.type=TASK_DESCHEDULE;
break;
case TRC_SLEEP:
prevtask=-1;
evt.p.type=TASK_DESCHEDULE;
break;
case TRC_ENDCYCLE:
prevtask=-1;
evt.p.type=TASK_END;
break;
 
case TRC_SCHEDULE:
if (prevtask!=-1) {
struct j_evt_task evt2;
int res;
evt2.p.time=ptr->time;
evt2.p.type=TASK_DESCHEDULE;
evt2.task=prevtask;
res=writeEvent(h,&evt2);
if (res!=0) return -1;
}
 
/*
if (!activated[ptr->x.sys.task]) {
struct j_evt_task evt2;
 
evt2.p.time=ptr->time-1;
evt2.task=ptr->x.sys.task;
evt2.p.type=TASK_ARRIVAL;
 
writeEvent(h,&evt2);
activated[ptr->x.sys.task]=1;
}
*/
 
evt.p.type=TASK_SCHEDULE;
prevtask=ptr->x.sys.task;
break;
 
default:
return 0;
}
 
cxx++;
if (cxx==MAXC) return -1;
 
return writeEvent(h,&evt);
}
 
 
int sem_event(int h,void *param)
{
//trc_event_t *ptr=(trc_event_t *)param;
//struct j_evt_semaph evt;
 
return 0;
/*
evt.t.p.time=ptr->x.norm.when;
evt.t.task=ptr->x.norm.who;
switch(ptr->what) {
case TRC_SEM_WAIT: evt.t.p.type=TASK_WAIT; break;
case TRC_SEM_SIGNAL: evt.t.p.type=TASK_SIGNAL; break;
case TRC_SEM_WAITNB: return 0;
default: return 0;
}
evt.res=1;
evt.name="NoName";
return j_write_semaph(h,&evt);
*/
}
 
/* -- */
 
#define MAX_PROC 150
int names[MAX_PROC];
 
int outfile;
 
int dumpfunc(trc_event_t *ptr)
{
//printf("{%i}",ptr->event);
 
if (!names[ptr->x.sys.task]) {
struct j_evt_name evtname;
static char name[24];
 
cxx++;
if (cxx==MAXC) return -1;
evtname.t.p.time=lasttime;
evtname.t.task=ptr->x.sys.task;
evtname.t.p.type=TASK_NAME;
sprintf(name,"task%03i",ptr->x.sys.task);
evtname.name=name;
writeEvent(outfile,&evtname);
names[ptr->x.sys.task]=1;
 
}
 
switch(event_class(ptr->event)) {
case TRC_CLASS_SYSTEM:
return sys_event(outfile,ptr);
case TRC_CLASS_SEM:
return 0;
return sem_event(outfile,ptr);
case TRC_CLASS_USER:
return 0;
}
return 0;
}
 
/*
*
*/
 
#ifndef O_BINARY
#define O_BINARY 0
#endif
 
int main(int argc, char *argv[])
{
int res;
int i;
 
if (argc!=3) {
fprintf(stderr,"missing filenames\n");
fprintf(stderr,"usage: jdump SHARKtracefilename JTRACERtracefilename\n");
return -1;
}
 
for (i=0;i<MAX_PROC;i++) {
names[i]=0;
//activated[i]=0;
}
 
outfile=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0777);
if (outfile==-1) {
perror("can't open outfile");
return -1;
}
res=read_trace(argv[1],dumpfunc);
close(outfile);
//fprintf(stderr,"result=%i",res);
return 0;
}
/unsupported/tags/rel_0_5/tracer/utils/util.h
0,0 → 1,58
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
* Copyright (C) 2002 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: util.h,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
#ifndef __UTIL_H
#define __UTIL_H
 
#include "types.h"
 
char *event_name(int evt);
char *event_hexdump(u_int8_t *ptr, int maxsize);
char *event_strdump(u_int8_t *ptr, int maxsize);
int event_class(int evt);
 
int read_trace(char *filename,int (*func)(trc_event_t *));
int read_udp_trace(void *msg, int (*func)(trc_event_t *));
 
char *format_time(long time);
 
#endif
/unsupported/tags/rel_0_5/tracer/utils/sa.c
0,0 → 1,120
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: sa.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
#include <netinet/in.h>
 
#include <stdlib.h>
#include <stdio.h>
#include "types.h"
#include <trace.h>
#include "util.h"
 
/* this file prints the distribution of (schedule_time - arrival_time) */
 
#define MAXX 50
#define PREC 100
#define DELTA ((double)MAXX/(double)PREC)
 
#include "distr.c"
 
int task;
long a=-1;
long s;
 
int safunc(trc_event_t *ev)
{
if (event_class(ev->event)!=TRC_CLASS_SYSTEM) return 0;
if (ev->x.sys.task!=task) return 0;
 
if (a==-1) {
if (ev->event==TRC_ACTIVATE||ev->event==TRC_INTACTIVATION)
a=ev->time;
} else {
if (ev->event==TRC_SCHEDULE) {
s=ev->time;
d_insert(s-a);
a=-1;
}
}
return 0;
}
 
/* -- */
 
int main(int argc, char *argv[])
{
int res;
if (argc!=4) {
fprintf(stderr,"usage: sa [tracefile] [pid] [outputfile]\n");
return -1;
}
 
d_init();
 
task=atoi(argv[2]);
res=read_trace(argv[1],safunc);
 
if (res==0) {
FILE *fout;
fout=fopen(argv[3],"wt");
if (fout==NULL) {
fprintf(stderr,"error writing output file!\n");
return 0;
}
d_dump(fout);
fclose(fout);
}
 
if (res!=0) {
fprintf(stderr,"error=%i\n",res);
perror("ERROR");
}
 
return 0;
}
 
 
 
 
 
 
 
/unsupported/tags/rel_0_5/tracer/utils/wait.c
0,0 → 1,95
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: wait.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
#include <stdio.h>
#include <stdlib.h>
#include "types.h"
#include <trace.h>
#include "util.h"
 
/* This demo computes the distribution of the wait times on disk requests */
 
#define MAXX 37000
#define PREC 37000
#define DELTA ((double)MAXX/(double)PREC)
 
#include "distr.c"
 
int task;
long a=-1;
 
int waitfunc(trc_event_t *ev)
{
if (event_class(ev->event)!=TRC_CLASS_USER) return 0;
if (ev->x.usr.n!=task) return 0;
if (ev->event==TRC_USER1) {
a=ev->time;
return 0;
}
if (ev->event==TRC_USER2) {
if (a!=-1) d_insert(ev->time-a);
a=-1;
}
return 0;
}
 
int main(int argc, char *argv[])
{
FILE *fout;
int res;
if (argc!=4) {
fprintf(stderr,"missing filename!\n");
return -1;
}
d_init();
task=atoi(argv[2]);
res=read_trace(argv[1],waitfunc);
if (res==0) {
fout=fopen(argv[3],"wt");
if (fout!=NULL) {
d_dump(fout);
fclose(fout);
} else
fprintf(stderr,"can't create output file!\n");
} else
fprintf(stderr,"read_trace error\n");
return 0;
}
/unsupported/tags/rel_0_5/tracer/utils/distr.c
0,0 → 1,83
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: distr.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
long t[PREC];
long counter;
long hoops;
long maxv=0;
 
void d_init(void)
{
int i;
hoops=counter=0;
for (i=0;i<PREC;i++) t[i]=0;
}
 
void d_insert(long d)
{
if (d>=MAXX) {
hoops++;
if (d>maxv) maxv=d;
return;
}
 
counter++;
t[(int)(d/DELTA)]++;
}
 
void d_dump(FILE *fout)
{
int i;
 
if (counter==0) {
fprintf(stderr,"nothing to write to the output file\n");
return;
}
if (hoops) {
fprintf(stderr,"%li values to big (max=%li)\n",hoops,maxv);
}
for (i=0;i<PREC;i++)
fprintf(fout,"%f %f\n",
DELTA/2.0+DELTA*i,
(double)t[i]/(double)counter
);
}
/unsupported/tags/rel_0_5/tracer/utils/road.c
0,0 → 1,96
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: road.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
#include <stdio.h>
#include <stdlib.h>
#include "types.h"
#include <trace.h>
#include "util.h"
 
 
/* this test prints the distribution of the HD seeks */
 
#define MAXX 1000
#define PREC 1000
#define DELTA ((double)MAXX/(double)PREC)
 
#include "distr.c"
 
int dumpusr(int event, trc_user_event_t *usr)
{
static long last=-1;
long d;
if (event!=TRC_USER0) return 0;
if (last!=-1) {
d=abs(last-usr->n);
d_insert(d);
}
last=usr->n;
return 0;
}
 
int dumpfunc(trc_event_t *ev)
{
if (event_class(ev->event)==TRC_CLASS_USER) dumpusr(ev->event,&ev->x.usr);
return 0;
}
 
int main(int argc, char *argv[])
{
FILE *fout;
int res;
if (argc!=3) {
fprintf(stderr,"missing filename!\n");
return -1;
}
d_init();
res=read_trace(argv[1],dumpfunc);
if (res==0) {
fout=fopen(argv[2],"wt");
if (fout!=NULL) {
d_dump(fout);
fclose(fout);
} else
fprintf(stderr,"can't create output file!\n");
} else
fprintf(stderr,"read_trace error\n");
return 0;
}
/unsupported/tags/rel_0_5/tracer/utils/types.h
0,0 → 1,55
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
* Copyright (C) 2002 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: types.h,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
#ifndef __TYPES_H__
#define __TYPES_H__
 
#include <sys/types.h>
 
/* when compiling under MSDOS, uncomment this three typedefs!!! */
 
//typedef unsigned char u_int8_t;
//typedef unsigned short u_int16_t;
//typedef unsigned long u_int32_t;
 
#include <types.h>
#endif
 
/unsupported/tags/rel_0_5/tracer/utils/tdump.c
0,0 → 1,115
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
* Copyright (C) 2002 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: tdump.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
/* this example simply prints a Shark trace file */
 
#include <netinet/in.h>
 
#include <stdio.h>
#include "types.h"
#include <trace.h>
#include "util.h"
 
int dumpsys(trc_system_event_t *sys)
{
/*
if (sys->event==TRC_SCHEDULE) {
//if (sys->prev!=65535)
// printf("%02i->%02i\n",sys->prev,sys->task);
//else
printf("??->%02i\n",sys->task);
return 0;
}
*/
printf("%02i\n",sys->task);
return 0;
}
 
int dumpusr(trc_user_event_t *usr)
{
printf("%8li ",usr->n);
printf("\n");
return 0;
}
 
int dumpsem(trc_sem_event_t *sem)
{
printf("on [%i]\n",sem->id);
return 0;
}
 
int dumpfunc(trc_event_t *ev)
{
static int counter=0;
printf("%4i ",counter);
counter++;
printf("%12s ",format_time(ev->time));
printf("%-10s ",event_name(ev->event));
 
//printf("%08x\n",(unsigned)ev->sys.event);
//return 0;
switch(event_class(ev->event)) {
case TRC_CLASS_SYSTEM: return dumpsys(&ev->x.sys);
case TRC_CLASS_USER: return dumpusr(&ev->x.usr);
case TRC_CLASS_SEM: return dumpsem(&ev->x.sem);
}
printf("\nEVENT %i... CLASS %i UNKNOWN!\n",ev->event,event_class(ev->event));
return -1;
}
 
int main(int argc, char *argv[])
{
int res;
if (argc!=2) {
fprintf(stderr,"missing filename!\n");
return -1;
}
 
res=read_trace(argv[1],dumpfunc);
 
//fprintf(stderr,"result=%i\n",res);
//fprintf(stderr,"size=%li\n",sizeof(trc_event_t));
return 0;
}
/unsupported/tags/rel_0_5/tracer/utils/makefile
0,0 → 1,70
#
# util -> compiles the tracer utilities under MSDOS/DJGPP
# util_linux -> compiles the tracer utilities under Linux
#
 
ifndef BASE
BASE=../../..
endif
 
.PHONY: util_dos util_linux clean
 
all:
@echo Targets: util_dos util_linux clean
@echo Note: udpdump is available only under linux
 
util_dos: tdump.exe jdump.exe sa.exe road.exe wait.exe
 
tdump.exe: tdump.c util.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace tdump.c util.c -o tdump.exe
 
jdump.exe: jdump.c util.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace jdump.c util.c -o jdump.exe
 
sa.exe: sa.c util.c distr.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace sa.c util.c -o sa.exe
 
road.exe: road.c util.c distr.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace road.c util.c -o road.exe
 
wait.exe: wait.c util.c distr.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace wait.c util.c -o wait.exe
 
 
util_linux: jdump tdump sa road wait udpdump
 
jdump: jdump.c util.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace -I$(BASE)/oslib jdump.c util.c -o jdump
 
tdump: tdump.c util.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace -I$(BASE)/oslib tdump.c util.c -o tdump
 
sa: sa.c util.c distr.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace -I$(BASE)/oslib sa.c util.c -o sa
 
road: road.c util.c distr.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace -I$(BASE)/oslib road.c util.c -o road
 
wait: wait.c util.c distr.c
gcc -s -Wimplicit-function-declaration -Wall \
-I$(BASE)/include/trace -I$(BASE)/oslib wait.c util.c -o wait
 
udpdump: udpdump.c util.c
gcc -Wimplicit-function-declaration -Wall -ggdb\
-I$(BASE)/include/trace -I$(BASE)/oslib udpdump.c util.c -o udpdump
 
 
 
clean:
rm -rf *.o jdump tdump sa road wait tdump.exe jdump.exe sa.exe road.exe wait.exe
 
 
/unsupported/tags/rel_0_5/tracer/utils/readme
0,0 → 1,13
This directory contains a set of utilities that can be used to interpret
the tracer output:
 
- tdump this example simply prints a Shark trace file
- jdump converts trace file formats from SHARK to JTRACER
- sa prints the distribution of (schedule_time - arrival_time)
- road prints the distribution of the HD seeks
- wait computes the distribution of the wait times on disk requests
 
Under Linux: to compile, type "make util_linux"
Under MSDOS: uncomment the three lines into types.h, then type "make util_dos"
 
PJ
/unsupported/tags/rel_0_5/tracer/utils/util.c
0,0 → 1,203
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
* Copyright (C) 2002 Paolo Gai
* Copyright (C) 2002 Tomas Lenvall
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: util.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
 
#include "types.h"
#include <trace.h>
#include <types.h>
 
static char *names[]={
"reserved",
"hoops",
/*--*/
"create",
"activate",
"schedule",
"delay",
"sleep",
"endcycle",
"destroy",
"intactiv",
"disable",
/*--*/
"user0",
"user1",
"user2",
"user3",
"user4",
"user5",
"user6",
"user7",
/*--*/
"wait",
"waitnb",
"signal"
};
 
int classtable[TRC_NUMCLASSES+1]={
TRC_F_TRACER,
TRC_F_SYSTEM,
TRC_F_USER,
TRC_F_SEM,
TRC_F_LAST
};
 
int event_class(int ev)
{
int i;
 
if (ev < 0 || ev >= TRC_NUMEVENTS)
return -1;
 
for (i = 0; i < TRC_NUMCLASSES; i++)
if (ev >= classtable[i] && ev < classtable[i+1])
return i;
 
return -1;
}
 
char *event_name(int ev)
{
if (ev<0||ev>=TRC_NUMEVENTS) return "unknown";
return names[ev];
}
 
char *event_hexdump(u_int8_t *ptr,int maxsize)
{
static char buffer[256];
int i;
for (i=0;i<maxsize;i++) sprintf(buffer+i*2,"%02x",*(ptr+i));
buffer[maxsize*2]='\0';
return buffer;
}
 
char *event_strdump(u_int8_t *ptr, int maxsize)
{
static char buffer[256];
memcpy(buffer,ptr,maxsize);
buffer[maxsize]='\0';
return buffer;
}
 
 
char *format_time(long time)
{
static char buffer[256];
if (time<1000l) {
sprintf(buffer,"%li",time);
return buffer;
}
if (time<1000000l) {
sprintf(buffer,"%li,%03li",time/1000l,time%1000l);
return buffer;
}
sprintf(buffer,"%li,%03li,%03li",
(time/1000000l),
(time%1000000l)/1000l,
time%1000l);
return buffer;
}
 
#ifndef O_BINARY
#define O_BINARY 0
#endif
 
int read_trace(char *filename,int (*func)(trc_event_t *))
{
trc_event_t buffer;
int fin;
int res;
fin=open(filename,O_RDONLY|O_BINARY);
if (fin==-1) return -1;
for (;;) {
res=read(fin,&buffer,sizeof(trc_event_t));
if (res!=sizeof(trc_event_t)) {
close(fin);
return res==0?0:-2;
}
res=(*func)(&buffer);
if (res!=0) {
close(fin);
return res;
}
}
close(fin);
return 0;
}
 
 
/* reads trace events from a udp message */
int read_udp_trace(char *msg, int (*func)(trc_event_t *))
{
short int events; // temporary storage of nr of events
int res;
 
/* message:
|2 bytes=nr of events|12 bytes=event 0|12 bytes=event 1|...
 
Note: the size of an event depends on the extra informations that
are put on the trc_event_t data structures. That size is
currently 12 bytes, but it can change if additional fields are
added to the trc_event_t structure. Including the
include/trace/types.h header ensures that the size used in this
application is coherent with the size of the compiled Shark
applications...
*/
events = *((short int *)msg);
 
msg += 2; // skip the 2 first bytes
 
for (;
events > 0;
events--, msg += sizeof(trc_event_t))
res = (*func)((trc_event_t *)msg);
 
return 1;
}
 
/unsupported/tags/rel_0_5/tracer/dfixed/initfile.c
0,0 → 1,115
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:44 $
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/rr.h"
#include "modules/cbs.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
#include "modules/nopm.h"
 
#include "drivers/keyb.h"
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
void mytracer_prologue(void);
void mytracer_epilogue(void);
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
mytracer_prologue();
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
CBS_register_level(CBS_ENABLE_ALL, 0);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
PC_register_module();
NPP_register_module();
SRP_register_module();
NOP_register_module();
NOPM_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
KEYB_PARMS keyb = BASE_KEYB;
extern void ctrlc_exit(KEY_EVT *k);
HARTPORT_init();
keyb_def_ctrlC(keyb, ctrlc_exit);
KEYB_init(&keyb);
 
mytracer_epilogue();
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/tracer/dfixed/dfixed.c
0,0 → 1,133
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: dfixed.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:44 $
*/
 
/*
* Example of tracer initialization.
*/
 
#include <ll/i386/cons.h>
 
#include <kernel/func.h>
#include <tracer.h>
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
#include <drivers/keyb.h>
 
#include <trace.h>
#include <queues.h>
 
#include <sys/mount.h>
#include <stddef.h>
 
 
void mytracer_prologue(void)
{
int myqueue;
TRC_PARMS p;
TRC_FIXED_PARMS f;
 
trc_default_parms(p);
trc_def_path(p,"");
 
trc_fixed_default_parms(f);
trc_fixed_def_filename(f,"fixed");
 
/* Tracer Initialization */
/* the first functions to call... parameters can be passed */
TRC_init_phase1(&p);
 
/* all the tracer queue types must be registered */
trc_register_dosfs_fixed_queue();
 
/* then, we create all the queues we need */
myqueue = trc_create_queue(TRC_DOSFS_FIXED_QUEUE,&f);
 
/* Then, we say that events must be sent to a particular queue */
trc_trace_class(TRC_CLASS_SYSTEM);
trc_assign_class_to_queue(TRC_CLASS_SYSTEM, myqueue);
}
 
void mytracer_epilogue(void)
{
TRC_init_phase2();
}
 
void ctrlc_exit(KEY_EVT *k)
{
sys_end();
}
 
void *mytask(void *arg)
{
int i;
 
for(i=0; i<10; i++) {
cprintf("%d ", i);
task_endcycle();
}
 
return 0;
}
 
int main(int argc,char *argv[])
{
SOFT_TASK_MODEL mp;
 
PID pid;
 
soft_task_default_model(mp);
soft_task_def_met(mp, 10000);
soft_task_def_period(mp,50000);
soft_task_def_usemath(mp);
 
cprintf("\nHello, world!\n");
 
pid = task_create("mytask", mytask, &mp, NULL);
 
if (pid != NIL) task_activate(pid);
 
return 0;
}
/unsupported/tags/rel_0_5/tracer/dfixed/makefile
0,0 → 1,21
#
#
#
 
ifndef BASE
BASE=../../..
endif
 
include $(BASE)/config/config.mk
 
PROGS= dfixed
 
include $(BASE)/config/example.mk
 
dfixed:
make -f $(SUBMAKE) BASE=$(BASE) APP=dfixed INIT= OTHEROBJS=initfile.o SHARKOPT=__OLDCHAR__
 
 
 
 
 
/unsupported/tags/rel_0_5/tracer/dfixed/readme
0,0 → 1,8
This is a simple test that uses the tracer.
 
The example simply creates a soft task that does 10 instances and then dies.
It uses a DOSFS Fixed queue to write the output on a file.
 
Enjoy,
 
PJ
/unsupported/tags/rel_0_5/tracer/small/test0.c
0,0 → 1,71
/*
*
*
*
*/
 
#include <kernel/func.h>
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
#include <drivers/keyb.h>
 
#include <sys/mount.h>
 
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
 
#include "common.h"
 
#define FILENAME "/TEMP/ALFA1.TXT"
 
#include <trace/trace.h>
#include <trace/queues.h>
 
int __register_sub_init_prologue(void)
{
TRC_init_phase1(NULL);
trc_register_fixed_queue();
trc_create_queue(TRC_FIXED_QUEUE,NULL);
return 0;
}
 
int main(int argc,char *argv[])
{
int h;
 
showmessage("A file is opened for reading while the tracer\n"
"with a fixed queue is runnig\n");
cprintf("OPENING %s\n",FILENAME);
h=open(FILENAME,O_RDONLY);
if (h>=0) {
char buffer[128];
int len;
cprintf("OPENED!\n");
 
cprintf("READING...\n");
len=read(h,buffer,sizeof(buffer));
cprintf("READ %i bytes\n",len);
memset(buffer,'\0',sizeof(buffer));
cprintf("buffer='%s'\n",buffer);
 
cprintf("READING...\n");
len=read(h,buffer,sizeof(buffer));
cprintf("READ %i bytes\n",len);
memset(buffer,'\0',sizeof(buffer));
cprintf("buffer='%s'\n",buffer);
 
close(h);
} else
cprintf("FAILED!\n");
waitend();
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/hello.c
0,0 → 1,209
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: hello.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:44 $
*/
 
/*
* Example of tracer initialization.
*/
 
#include <ll/i386/cons.h>
 
#include <kernel/func.h>
#include <tracer.h>
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
#include <drivers/keyb.h>
 
#include <trace.h>
#include <queues.h>
 
#include <sys/mount.h>
#include <stddef.h>
 
/*
this example use initfs.c to initialize the system; this file define
the following two function.
__kernel_register_levels__(), must initialize all kernel modules,
it has this structure:
 
{
__register_sub_init_prologue();
 
... modules initialization....
__register_sub_init();
}
 
__init__(void *arg) is called when the first task is created
and must call the main():
 
{
 
... drivers initialization ....
 
__bdev_sub_init();
__fs_sub_init();
 
call_main()
 
}
*/
 
/*
* This function is called before all other modules initialization because
* all modules that need the tracer must follow tracer initialization.
*/
int __register_sub_init_prologue(void)
{
/* the first functions to call... parameters can be passed */
TRC_init_phase1(NULL);
/* all the tracer queues must be registrated (in this case only */
/* a dummy queue is initialized) */
trc_register_dummy_queue();
/* the queues must be created (only one in this example) */
trc_create_queue(TRC_DUMMY_QUEUE,NULL);
/* events can be dispatch to a queue (nothing in this case) */
return 0;
}
 
/*
* This function is called after all other modules initialization
* functions... notjing to do.
*/
int __register_sub_init(void)
{
return 0;
}
 
__dev_t root_device;
__dev_t temp_device;
 
/*
* Now the system is running... we have to initialize the block device
* drivers
*/
int __bdev_sub_init(void)
{
BDEV_PARMS bdev=BASE_BDEV;
 
/* This to initialize the block device drivers... a NULL can be passed */
/* to the bdev_init() functions */
bdev_def_showinfo(bdev,FALSE);
bdev_init(&bdev);
 
/* The following phase ca be made in several way: we must decide the */
/* device that we want mount as root... we use the bdev_find_byname() */
/* functions to find a specific device */
root_device=bdev_find_byname("ide/hda1");
if (root_device<0) {
cprintf("can't find root device to mount on /!!!\n");
sys_end();
return -1;
}
 
/* Well, we want a device to mount into /TEMP */
temp_device=bdev_find_byname("ide/hdb3");
if (temp_device<0) {
cprintf("can't find a filesystem to mount on /TEMP!!!\n");
sys_end();
return -1;
}
return 0;
}
 
 
/*
* This is the real filesystem initialization!
*/
int __fs_sub_init(void)
{
FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
extern int libc_initialize(void);
int res;
struct mount_opts opts;
 
/* We set the root device and call the filesystem_init() function */
filesystem_def_rootdevice(fs,root_device);
filesystem_def_fs(fs,FS_MSDOS);
filesystem_def_showinfo(fs,FALSE);
filesystem_init(&fs);
 
/* We must initialize the libC if we use it */
libc_initialize();
 
/* We have choose to mount the second partiotion into the /TEMP */
/* directory with read/write privilegies (this step is not required) */
if (temp_device>=0) {
memset(&opts,0,sizeof(struct mount_opts));
opts.flags=MOUNT_FLAG_RW;
res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
if (res!=0) {
cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
}
}
 
/* NOW we call the tracer initialization phase 2!!! */
/* It must FOLLOW the filesystem initialization... (this function */
/* can be called after the call to filesystem_init() functions but */
/* we do it here because we want be able to write into the /TEMP */
/* directory! */
TRC_init_phase2();
return 0;
}
 
void ctrlc_exit(KEY_EVT *k)
{
sys_end();
}
 
int main(int argc,char *argv[])
{
cprintf("\nHello, world!\n");
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/treec1.c
0,0 → 1,220
/*
*
*
*
*/
 
#include <kernel/func.h>
#include <kernel/model.h>
 
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mount.h>
#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <semaphore.h>
#include <stdio.h>
#include <time.h>
 
#include "common.h"
 
#include <trace/trace.h>
#include <trace/queues.h>
 
 
int noscroll=0;
SEM console;
 
#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
 
TASK viewdir(void *prof);
sem_t actmutex,actsync;
char *globpathname;
PID globpid;
int counter=0,actcounter=0;
 
void activate_task(int prof, char *pathname)
{
char tname[32];
NRT_TASK_MODEL m;
PID pid;
 
REPEAT:
sem_wait(&actmutex);
 
if (actcounter>=MPROC) {
struct timespec delay;
delay.tv_sec = 0;
delay.tv_nsec = 10000000;
sem_signal(&actmutex);
nanosleep(&delay, NULL);
goto REPEAT;
}
globpathname=pathname;
counter++;
sprintf(tname,"tsk%i",counter);
 
nrt_task_default_model(m);
nrt_task_def_arg(m,(void*)counter);
globpid=pid=task_create(tname,viewdir,&m,NULL);
if (pid==-1) {
sem_wait(&console);
cprintf("can't create '%s'\n",tname);
perror("can't create task");
sem_signal(&console);
sys_end();
return;
}
task_activate(pid);
sem_wait(&actsync);
actcounter++;
 
sem_signal(&actmutex);
}
 
/*
*
*/
 
int filecounter=0;
 
TASK viewdir(void *pointer)
{
struct dirent *den;
struct stat st;
char *str;
DIR *d;
int res;
int x;
char pathname[1024];
PID mypid;
int prof=(int)pointer;
 
strcpy(pathname,globpathname);
mypid=globpid;
sem_signal(&actsync);
 
str=pathname+(x=strlen(pathname));
d=opendir(pathname);
if (d==NULL) {
sem_wait(&console);
cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
cprintf("errno: %i '%s'\n",errno,strerror(errno));
sem_signal(&console);
 
sys_end();
l1_exit(0);
goto END;
}
 
while ((den=readdir(d))!=NULL) {
 
if (x==1&&*pathname=='/')
strcat(pathname,den->d_name);
else
strcat(strcat(pathname,"/"),den->d_name);
 
sem_wait(&console);
if (noscroll) {
place(0,10);
cprintf(" ");
place(0,10);
}
cprintf("t%03i %s\n",prof,pathname);
filecounter++;
sem_signal(&console);
 
if (!strcmp(den->d_name,".")) goto SKIP;
if (!strcmp(den->d_name,"..")) goto SKIP;
 
res=stat(pathname,&st);
if (res!=0) {
sem_wait(&console);
cprintf("t%03i can't stat %s\n",prof,pathname);
cprintf("errno: %i '%s'\n",errno,strerror(errno));
sem_signal(&console);
 
sys_end();
l1_exit(0);
closedir(d);
goto END;
} else {
if (S_ISDIR(st.st_mode)) {
sem_wait(&console);
sem_signal(&console);
activate_task(prof,pathname);
}
}
 
SKIP:
*str='\0';
}
 
closedir(d);
 
END:
sem_wait(&actmutex);
actcounter--;
sem_signal(&actmutex);
 
return 0;
}
 
/*
*
*/
 
int __register_sub_init_prologue(void)
{
TRC_init_phase1(NULL);
trc_register_circular_queue();
trc_create_queue(TRC_CIRCULAR_QUEUE,NULL);
return 0;
}
 
/*
*
*/
 
int main(int argc,char *argv[])
{
// int res;
 
showmessage("This test show all filenames of a directory of an hardisk\n"
"recursively using a soft task for every directory.\n"
"The tracer with a circular queue is activated.\n");
 
sem_init(&console,0,1);
sem_init(&actmutex,0,1);
sem_init(&actsync,0,0);
 
activate_task(-1,FROMDIR);
 
{
struct timespec delay;
delay.tv_sec = 0;
delay.tv_nsec = 500000000;
for(;;) {
sem_wait(&actmutex);
if (actcounter==0) break;
sem_signal(&actmutex);
nanosleep(&delay, NULL);
}
}
 
cprintf("\nfiles: %i\n",filecounter);
waitend();
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/hello1.c
0,0 → 1,27
/*
*
*
*
*/
 
#include <ll/i386/cons.h>
#include <stddef.h>
 
#include <trace/trace.h>
#include <trace/queues.h>
 
int __register_sub_init_prologue(void)
{
TRC_init_phase1(NULL);
trc_register_dummy_queue();
trc_create_queue(TRC_DUMMY_QUEUE,NULL);
return 0;
}
 
int main(int argc,char *argv[])
{
cprintf("\nHello, world!\n");
cprintf("The tracer has been activated!\n");
cprintf("(No result are produced)\n\n");
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/treec2.c
0,0 → 1,233
/*
*
*
*
*/
 
#include <kernel/func.h>
#include <kernel/model.h>
 
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mount.h>
#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <semaphore.h>
#include <stdio.h>
#include <time.h>
 
#include "common.h"
 
#include <trace/trace.h>
#include <trace/queues.h>
 
#define sem_signal sem_post
 
int noscroll=0;
SEM console;
 
#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
 
TASK viewdir(void *prof);
sem_t actmutex,actsync;
char *globpathname;
PID globpid;
int counter=0,actcounter=0;
 
void activate_task(int prof, char *pathname)
{
char tname[32];
NRT_TASK_MODEL m;
PID pid;
 
REPEAT:
sem_wait(&actmutex);
 
if (actcounter>=MPROC) {
struct timespec delay;
delay.tv_sec = 0;
delay.tv_nsec = 10000000;
sem_signal(&actmutex);
nanosleep(&delay, NULL);
goto REPEAT;
}
globpathname=pathname;
counter++;
sprintf(tname,"tsk%i",counter);
 
nrt_task_default_model(m);
nrt_task_def_arg(m,(void*)counter);
globpid=pid=task_create(tname,viewdir,&m,NULL);
if (pid==-1) {
sem_wait(&console);
cprintf("can't create '%s'\n",tname);
perror("can't create task");
sem_signal(&console);
sys_end();
return;
}
task_activate(pid);
sem_wait(&actsync);
actcounter++;
 
sem_signal(&actmutex);
}
 
/*
*
*/
 
int filecounter=0;
 
TASK viewdir(void *pointer)
{
struct dirent *den;
struct stat st;
char *str;
DIR *d;
int res;
int x;
char pathname[1024];
PID mypid;
int prof=(int)pointer;
 
strcpy(pathname,globpathname);
mypid=globpid;
sem_signal(&actsync);
 
str=pathname+(x=strlen(pathname));
d=opendir(pathname);
if (d==NULL) {
sem_wait(&console);
cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
cprintf("errno: %i '%s'\n",errno,strerror(errno));
sem_signal(&console);
 
sys_end();
l1_exit(0);
goto END;
}
 
while ((den=readdir(d))!=NULL) {
 
if (x==1&&*pathname=='/')
strcat(pathname,den->d_name);
else
strcat(strcat(pathname,"/"),den->d_name);
 
sem_wait(&console);
if (noscroll) {
place(0,10);
cprintf(" ");
place(0,10);
}
cprintf("t%03i %s\n",prof,pathname);
filecounter++;
sem_signal(&console);
 
if (!strcmp(den->d_name,".")) goto SKIP;
if (!strcmp(den->d_name,"..")) goto SKIP;
 
res=stat(pathname,&st);
if (res!=0) {
sem_wait(&console);
cprintf("t%03i can't stat %s\n",prof,pathname);
cprintf("errno: %i '%s'\n",errno,strerror(errno));
sem_signal(&console);
 
sys_end();
l1_exit(0);
closedir(d);
goto END;
} else {
if (S_ISDIR(st.st_mode)) {
sem_wait(&console);
sem_signal(&console);
activate_task(prof,pathname);
}
}
 
SKIP:
*str='\0';
}
 
closedir(d);
 
END:
sem_wait(&actmutex);
actcounter--;
sem_signal(&actmutex);
 
return 0;
}
 
/*
*
*/
 
int __register_sub_init_prologue(void)
{
TRC_CIRCULAR_PARMS args;
int q;
TRC_init_phase1(NULL);
trc_register_circular_queue();
trc_circular_default_parms(args);
trc_circular_def_onlinetask(args);
q=trc_create_queue(TRC_CIRCULAR_QUEUE,&args);
 
trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
trc_trace_class(TRC_CLASS_SYSTEM);
return 0;
}
 
/*
*
*/
 
int main(int argc,char *argv[])
{
// int res;
 
showmessage("This test show all filenames of a directory of an hardisk\n"
"recursively using a soft task for every directory.\n"
"The tracer with a circular queue is activated that write\n"
"on hardisk online (while the system is running)\n");
 
sem_init(&console,0,1);
sem_init(&actmutex,0,1);
sem_init(&actsync,0,0);
 
activate_task(-1,FROMDIR);
//activate_task(-1,"/");
 
{
struct timespec delay;
delay.tv_sec = 0;
delay.tv_nsec = 500000000;
for(;;) {
sem_wait(&actmutex);
if (actcounter==0) break;
sem_signal(&actmutex);
nanosleep(&delay, NULL);
}
}
 
cprintf("\nfiles: %i\n",filecounter);
waitend();
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/hello2.c
0,0 → 1,30
/*
*
*
*
*/
 
#include <ll/i386/cons.h>
#include <stddef.h>
 
#include <trace/trace.h>
#include <trace/queues.h>
 
int __register_sub_init_prologue(void)
{
int q;
TRC_init_phase1(NULL);
trc_register_fixed_queue();
q=trc_create_queue(TRC_FIXED_QUEUE,NULL);
trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
trc_trace_class(TRC_CLASS_SYSTEM);
return 0;
}
 
int main(int argc,char *argv[])
{
cprintf("\nHello, world!\n");
cprintf("The tracer has been activated! Look at the results.\n");
cprintf("(A fixed queue has been created)\n\n");
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/treef1.c
0,0 → 1,224
/*
*
*
*
*/
 
#include <kernel/func.h>
#include <kernel/model.h>
 
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mount.h>
#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <semaphore.h>
#include <stdio.h>
#include <time.h>
 
#include "common.h"
 
#include <trace/trace.h>
#include <trace/queues.h>
 
#define sem_signal sem_post
 
int noscroll=0;
SEM console;
 
#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
 
TASK viewdir(void *prof);
sem_t actmutex,actsync;
char *globpathname;
PID globpid;
int counter=0,actcounter=0;
 
void activate_task(int prof, char *pathname)
{
char tname[32];
NRT_TASK_MODEL m;
PID pid;
 
REPEAT:
sem_wait(&actmutex);
 
if (actcounter>=MPROC) {
struct timespec delay;
delay.tv_sec = 0;
delay.tv_nsec = 10000000;
sem_signal(&actmutex);
nanosleep(&delay, NULL);
goto REPEAT;
}
globpathname=pathname;
counter++;
sprintf(tname,"tsk%i",counter);
 
nrt_task_default_model(m);
nrt_task_def_arg(m,(void*)counter);
globpid=pid=task_create(tname,viewdir,&m,NULL);
if (pid==-1) {
sem_wait(&console);
cprintf("can't create '%s'\n",tname);
perror("can't create task");
sem_signal(&console);
sys_end();
return;
}
task_activate(pid);
sem_wait(&actsync);
actcounter++;
 
sem_signal(&actmutex);
}
 
/*
*
*/
 
int filecounter=0;
 
TASK viewdir(void *pointer)
{
struct dirent *den;
struct stat st;
char *str;
DIR *d;
int res;
int x;
char pathname[1024];
PID mypid;
int prof=(int)pointer;
 
strcpy(pathname,globpathname);
mypid=globpid;
sem_signal(&actsync);
 
str=pathname+(x=strlen(pathname));
d=opendir(pathname);
if (d==NULL) {
sem_wait(&console);
cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
cprintf("errno: %i '%s'\n",errno,strerror(errno));
sem_signal(&console);
 
sys_end();
l1_exit(0);
goto END;
}
 
while ((den=readdir(d))!=NULL) {
 
if (x==1&&*pathname=='/')
strcat(pathname,den->d_name);
else
strcat(strcat(pathname,"/"),den->d_name);
 
sem_wait(&console);
if (noscroll) {
place(0,10);
cprintf(" ");
place(0,10);
}
cprintf("t%03i %s\n",prof,pathname);
filecounter++;
sem_signal(&console);
 
if (!strcmp(den->d_name,".")) goto SKIP;
if (!strcmp(den->d_name,"..")) goto SKIP;
 
res=stat(pathname,&st);
if (res!=0) {
sem_wait(&console);
cprintf("t%03i can't stat %s\n",prof,pathname);
cprintf("errno: %i '%s'\n",errno,strerror(errno));
sem_signal(&console);
 
sys_end();
l1_exit(0);
closedir(d);
goto END;
} else {
if (S_ISDIR(st.st_mode)) {
sem_wait(&console);
sem_signal(&console);
activate_task(prof,pathname);
}
}
 
SKIP:
*str='\0';
}
 
closedir(d);
 
END:
sem_wait(&actmutex);
actcounter--;
sem_signal(&actmutex);
 
return 0;
}
 
/*
*
*/
 
int __register_sub_init_prologue(void)
{
int q;
TRC_init_phase1(NULL);
trc_register_fixed_queue();
q=trc_create_queue(TRC_FIXED_QUEUE,NULL);
trc_assign_class_to_queue(TRC_CLASS_SYSTEM,q);
trc_trace_class(TRC_CLASS_SYSTEM);
return 0;
}
 
/*
*
*/
 
int main(int argc,char *argv[])
{
// int res;
 
showmessage("This test show all filenames of a directory of an hardisk\n"
"recursively using a soft task for every directory.\n"
"The tracer with a circular queue is activated.\n");
 
sem_init(&console,0,1);
sem_init(&actmutex,0,1);
sem_init(&actsync,0,0);
 
activate_task(-1,FROMDIR);
 
{
struct timespec delay;
delay.tv_sec = 0;
delay.tv_nsec = 500000000;
for(;;) {
sem_wait(&actmutex);
if (actcounter==0) break;
sem_signal(&actmutex);
nanosleep(&delay, NULL);
}
}
 
cprintf("\nfiles: %i\n",filecounter);
waitend();
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/common.c
0,0 → 1,133
 
#include <kernel/func.h>
#include <tracer.h>
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
#include <drivers/keyb.h>
 
#include <trace.h>
#include <queues.h>
 
#include <sys/mount.h>
 
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
 
int __register_sub_init(void)
{
return 0;
}
 
/* -- */
 
__dev_t root_device;
__dev_t temp_device;
 
int choose_root_callback(__dev_t dev,__uint8_t fs)
{
if (fs==FS_MSDOS) return dev;
return -1;
}
 
int choose_temp_callback(__dev_t dev,__uint8_t fs)
{
static int flag=0;
if (fs==FS_MSDOS) {
if (flag) return dev;
flag=1;
}
return -1;
}
 
/* -- */
 
extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
 
int __bdev_sub_init(void)
{
BDEV_PARMS bdev=BASE_BDEV;
bdev_def_showinfo(bdev,FALSE);
bdev_init(&bdev);
 
root_device=bdev_scan_devices(choose_root_callback);
if (root_device<0) {
cprintf("can't find root device to mount on /!!!\n");
sys_end();
return -1;
}
 
temp_device=bdev_scan_devices(choose_temp_callback);
if (temp_device<0) {
cprintf("can't find a filesystem to mount on /TEMP!!!\n");
}
return 0;
}
 
/* -- */
 
extern int libc_initialize(void);
 
int __fs_sub_init(void)
{
FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
struct mount_opts opts;
int res;
filesystem_def_rootdevice(fs,root_device);
filesystem_def_fs(fs,FS_MSDOS);
filesystem_def_showinfo(fs,FALSE);
 
 
//filesystem_init_prologue();
filesystem_init(&fs);
libc_initialize();
 
if (temp_device>=0) {
memset(&opts,0,sizeof(struct mount_opts));
opts.flags=MOUNT_FLAG_RW;
res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
if (res!=0) {
cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
}
}
TRC_init_phase2();
return 0;
}
 
/* -- */
 
void ctrlc_exit(KEY_EVT *k)
{
extern void dump_sem_table(void);
extern void dump_nop_table(void);
//dump_sem_table();
//dump_nop_table();
sys_end();
}
 
/* -- */
 
void showmessage(char *s)
{
cputs(s);
cprintf("Press [x] to begin...");
while (keyb_getchar()!='x');
cprintf("\n");
}
 
void waitend(void)
{
int c;
cprintf("Press [x] to exit...");
while ((c=keyb_getchar())!='x');
cprintf("\n");
}
/unsupported/tags/rel_0_5/tracer/small/simple.c
0,0 → 1,132
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Massimiliano Giorgi <massy@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: simple.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:44 $
*/
 
/*
* Example of simple tracer initialization.
*/
 
#include <ll/i386/cons.h>
 
#include <kernel/func.h>
#include <trace.h>
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
#include <drivers/keyb.h>
 
#include <trace.h>
 
#include <sys/mount.h>
#include <stddef.h>
 
#define ROOTDEVICE "ide/hda2"
 
int __register_sub_init_prologue(void)
{
int res;
/* tracer initialization phase 1 */
res=TRC_init_phase1_standard();
if (res!=0) {
cprintf("tracer initialization error (%i)!!!\n",res);
sys_end();
return -1;
}
return 0;
}
 
int __register_sub_init(void)
{
return 0;
}
 
__dev_t root_device;
 
int __bdev_sub_init(void)
{
/* block device initialization */
bdev_init(NULL);
 
/* choose root device */
root_device=bdev_find_byname(ROOTDEVICE);
if (root_device<0) {
cprintf("can't find root device to mount on /!!!\n");
sys_end();
return -1;
}
 
return 0;
}
 
int __fs_sub_init(void)
{
FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
extern int libc_initialize(void);
 
/* filesystems initialization */
filesystem_def_rootdevice(fs,root_device);
filesystem_def_fs(fs,FS_MSDOS);
filesystem_def_showinfo(fs,FALSE);
filesystem_init(&fs);
 
/* libC initialization */
libc_initialize();
 
/* tracer initialization phase 2 */
TRC_init_phase2_standard();
return 0;
}
 
void ctrlc_exit(KEY_EVT *k)
{
sys_end();
}
 
int main(int argc,char *argv[])
{
cprintf("\nSimple hello world (with tracer)!\n\n");
return 0;
}
/unsupported/tags/rel_0_5/tracer/small/makefile
0,0 → 1,29
#
#
#
 
ifndef BASE
BASE=../../..
endif
include $(BASE)/config/config.mk
 
PROGS= simple hello hello1 hello2 test0 treef1 treec1 treec2
 
include $(BASE)/config/example.mk
 
simple:
make -f $(SUBMAKE) BASE=$(BASE) APP=simple OTHEROBJS=initfs.o SHARKOPT=__OLDCHAR__
hello:
make -f $(SUBMAKE) BASE=$(BASE) APP=hello OTHEROBJS=initfs.o SHARKOPT=__OLDCHAR__
hello1:
make -f $(SUBMAKE) BASE=$(BASE) APP=hello1 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
hello2:
make -f $(SUBMAKE) BASE=$(BASE) APP=hello2 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
test0:
make -f $(SUBMAKE) BASE=$(BASE) APP=test0 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
treef1:
make -f $(SUBMAKE) BASE=$(BASE) APP=treef1 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
treec1:
make -f $(SUBMAKE) BASE=$(BASE) APP=treec1 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
treec2:
make -f $(SUBMAKE) BASE=$(BASE) APP=treec2 OTHEROBJS="initfs.o common.o" SHARKOPT=__OLDCHAR__
/unsupported/tags/rel_0_5/tracer/small/initfs.c
0,0 → 1,119
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: initfs.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:44 $
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/rr.h"
#include "modules/cbs.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
#include "modules/nopm.h"
 
#include "drivers/keyb.h"
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
extern int __register_sub_init_prologue(void);
extern int __register_sub_init(void);
 
__register_sub_init_prologue();
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
CBS_register_level(CBS_ENABLE_ALL, 0);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
PC_register_module();
NPP_register_module();
SRP_register_module();
NOP_register_module();
NOPM_register_module();
 
__register_sub_init();
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
KEYB_PARMS keyb = BASE_KEYB;
extern int __bdev_sub_init(void);
extern int __fs_sub_init(void);
extern void ctrlc_exit(KEY_EVT *k);
HARTPORT_init();
keyb_def_ctrlC(keyb, ctrlc_exit);
KEYB_init(&keyb);
 
__bdev_sub_init();
__fs_sub_init();
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/tracer/small/readme
0,0 → 1,27
This directory contains a set of tests that uses the Shark Filesystem and the tracer
 
treef1 - the test shows all filenames of a directory of an hardisk
recursively using a soft task for every directory.
The tracer with a circular queue is activated.
 
treec2 - the test shows all filenames of a directory of an hardisk
recursively using a soft task for every directory.
The tracer with a circular queue is activated that write
on hardisk online (while the system is running).
 
treec1 - This test show all filenames of a directory of an hardisk
recursively using a soft task for every directory.
The tracer with a circular queue is activated.
 
test0 - A file is opened for reading while the tracerwith a fixed
queue is runnig.
 
simple - Simple hello world (with tracer)!
 
hello - another hello world...
 
hello1 - another hello world with a dummy queue...
 
hello2 - another hello world with a fixed queue...
 
PJ
/unsupported/tags/rel_0_5/tracer/small/common.h
0,0 → 1,28
 
#ifndef _COMMON_H
#define _COMMON_H
 
#include <sys/types.h>
 
/*
#include <kernel/int_sem.h>
#define SEM internal_sem_t
#define sem_init internal_sem_init
#define sem_signal internal_sem_post
#define sem_wait internal_sem_wait
*/
 
#define SEM sem_t
#define sem_signal sem_post
 
extern __dev_t root_device;
extern __dev_t temp_device;
 
int choose_temp_callback(__dev_t dev,__uint8_t fs);
 
void showmessage(char *s);
void waitend(void);
 
#define FROMDIR "/TEMP"
 
#endif
/unsupported/tags/rel_0_5/tracer/udp/initfile.c
0,0 → 1,115
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/*
* CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:44 $
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/rr.h"
#include "modules/cbs.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
#include "modules/nopm.h"
 
#include "drivers/keyb.h"
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
void mytracer_prologue(void);
void mytracer_epilogue(void);
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
mytracer_prologue();
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
CBS_register_level(CBS_ENABLE_ALL, 0);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
PC_register_module();
NPP_register_module();
SRP_register_module();
NOP_register_module();
NOPM_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
KEYB_PARMS keyb = BASE_KEYB;
extern void ctrlc_exit(KEY_EVT *k);
HARTPORT_init();
keyb_def_ctrlC(keyb, ctrlc_exit);
KEYB_init(&keyb);
 
mytracer_epilogue();
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/tracer/udp/udptrace.c
0,0 → 1,159
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Massimiliano Giorgi
* Copyright (C) 2002 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* CVS : $Id: udptrace.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
*/
 
/*
* Example of tracer initialization.
*/
 
#include <ll/i386/cons.h>
 
#include <kernel/func.h>
 
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
 
#include <drivers/keyb.h>
#include <drivers/udpip.h>
 
#include <tracer.h>
#include <queues.h>
 
#include <sys/mount.h>
#include <stddef.h>
#include <string.h>
 
char myipaddr[15], toipaddr[15];
 
void mytracer_prologue(void)
{
int myqueue;
TRC_PARMS p;
TRC_UDP_PARMS u;
UDP_ADDR local, remote;
 
/* these are the IP numbers of my home PCs ;-) */
strcpy(myipaddr, "192.168.82.120");
strcpy(toipaddr, "192.168.82.20");
 
clear();
 
ip_str2addr(toipaddr,&(remote.s_addr));
remote.s_port = 20000; // htons is done automatically;
ip_str2addr(myipaddr,&(local.s_addr));
local.s_port = 20000; // htons is done automatically;
 
trc_default_parms(p);
trc_def_path(p,"");
 
trc_udp_default_parms(u,local,remote);
/* Tracer Initialization */
/* the first functions to call... parameters can be passed */
TRC_init_phase1(&p);
 
/* all the tracer queue types must be registered */
trc_register_udp_queue();
 
/* then, we create all the queues we need */
myqueue = trc_create_queue(TRC_UDP_QUEUE,&u);
 
/* Then, we say that events must be sent to a particular queue */
trc_trace_class(TRC_CLASS_SYSTEM);
trc_assign_class_to_queue(TRC_CLASS_SYSTEM, myqueue);
}
 
void mytracer_epilogue(void)
{
struct net_model m = net_base;
/* We want a task for TX mutual exclusion */
net_setmode(m, TXTASK);
/* We use UDP/IP stack */
net_setudpip(m, myipaddr, "255.255.255.255");
/* OK: let's start the NetLib! */
if (net_init(&m) == 1) {
cprintf("udptrace: Net Init OK...\n");
} else {
cprintf("udptrace: Net Init Failed...\n");
sys_abort(300);
}
TRC_init_phase2();
}
 
void ctrlc_exit(KEY_EVT *k)
{
sys_end();
}
 
void *mytask(void *arg)
{
int i;
 
for(i=0; i<10; i++) {
cprintf("%d\n", i);
task_endcycle();
}
 
return 0;
}
 
int main(int argc,char *argv[])
{
SOFT_TASK_MODEL mp;
 
PID pid;
 
soft_task_default_model(mp);
soft_task_def_met(mp, 10000);
soft_task_def_period(mp,50000);
soft_task_def_usemath(mp);
 
cprintf("\nHello, world!\n");
 
pid = task_create("mytask", mytask, &mp, NULL);
 
if (pid != NIL) task_activate(pid);
 
return 0;
}
/unsupported/tags/rel_0_5/tracer/udp/makefile
0,0 → 1,21
#
#
#
 
ifndef BASE
BASE=../../..
endif
 
include $(BASE)/config/config.mk
 
PROGS= udptrace
 
include $(BASE)/config/example.mk
 
udptrace:
make -f $(SUBMAKE) BASE=$(BASE) APP=udptrace INIT= OTHEROBJS=initfile.o OTHERINCL="-I$(BASE)/tracer/include" SHARKOPT=__OLDCHAR__
 
 
 
 
 
/unsupported/tags/rel_0_5/tracer/udp/readme
0,0 → 1,10
This is a simple test that uses the tracer.
 
The example assigns the IP address 192.168.1.2 to the machine, and
sends the tracer data to 192.168.1.1 using UDp, port 20000.
 
You can use demos/tracer/utils/udpdump to get the informations.
 
Enjoy,
 
PJ
/unsupported/tags/rel_0_5/tracer/makefile
0,0 → 1,11
.PHONY: all clean
 
all:
make -C dfixed
make -C small
make -C udp
 
clean:
make -C dfixed clean
make -C small clean
make -C udp clean
/unsupported/tags/rel_0_5/tracer/readme
0,0 → 1,14
This directory contains a set of sub directories containing all the tracer
examples and utilities.
 
Here a short description of the contents
 
utils - some small utilities that can read tracer files
dfixed - a small applications that defines a tracer queue.
At the end a file is written (using DOSFS).
small - a set of small examples of tracer usage (using the Shark Filesystem)
udp - a small application that sends its trace data through the network
 
Enjoy
 
PJ
/unsupported/tags/rel_0_5/rtdac4/test.c
0,0 → 1,53
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include "kernel/kern.h"
 
#include "drivers/shark_keyb26.h"
#include "rtdac4.h"
 
int main(int argc, char **argv)
{
 
char ch,buf_char[4];
short buf_short[2];
long prescaler;
 
RTDAC4_open();
 
RTDAC4_read_states(buf_char);
buf_short[0] = 0;
buf_short[1] = 0;
 
RTDAC4_set_motor(buf_short);
 
/* Reset encoders */
RTDAC4_ioctl(1, 0);
 
prescaler = 0;
 
/* Set prescaler */
RTDAC4_ioctl(2, prescaler);
 
ch = keyb_getch(BLOCK);
 
sys_end();
 
return 0;
 
}
/unsupported/tags/rel_0_5/rtdac4/rtdac4.c
0,0 → 1,142
#include "kernel/kern.h"
 
#define BASE_ADDRESS 0xDC00 // Base address of PCI card
#define MAX_SIGNAL 650 // Max output signal
 
int i;
int b;
short tempNbr1, tempNbr2, tempNbr3, tempNbr4, tempNbr5;
 
int RTDAC4_open() {
 
printk("Init RT-DAC4/PCI - Base Address (%x)\n",(int)(BASE_ADDRESS));
 
return 0;
}
 
int RTDAC4_close() {
 
return 0;
}
 
/* Reads state information into vector buf.
Angle address: BASE_ADDRESS + 8 (16 bits)
Cart address: BASE_ADDRESS + 12 (16 bits)
*/
int RTDAC4_read_states(char *buf) {
for (i=0; i<2; i++) {
*(buf + i) = inp(BASE_ADDRESS + 4 +8 + i);
*(buf + 2 + i) = inp(BASE_ADDRESS + 4 + 12 + i);
}
return 0;
}
 
/* Control the electric motor.
Max output when testing: 650.
Max to motor: 1023.
*/
int RTDAC4_set_motor(const short *buff) {
unsigned short dir;
unsigned short brake;
unsigned short readBack;
if (BASE_ADDRESS == 0)
return 0;
dir = inp(BASE_ADDRESS + 4*0x24); // ?
brake = inp(BASE_ADDRESS + 4*0x25); // ?
tempNbr1 = (short) buff[0];
tempNbr2 = (short) buff[1];
if(abs(tempNbr1) <= MAX_SIGNAL) {
outpw(BASE_ADDRESS + 4*0x21, ((short) abs((int) tempNbr1)));
readBack = inpw(BASE_ADDRESS + 4*0x21);
if (readBack == 0)
brake = brake | 0x01;
else
brake = brake & 0xFE;
if ((short) tempNbr1 < 0)
dir = dir | 0x01;
else
dir = dir & 0xFE;
}
if(abs(tempNbr2) <= MAX_SIGNAL) {
outpw(BASE_ADDRESS + 4*0x22, ((short) abs((int) tempNbr2)));
readBack = inpw(BASE_ADDRESS + 4*0x22);
if (readBack == 0)
brake = brake | 0x02;
else
brake = brake & 0xFD;
if ((short) tempNbr1 < 0)
dir = dir | 0x02;
else
dir = dir & 0xFD;
}
outpw(BASE_ADDRESS + 4*0x24, dir);
outpw(BASE_ADDRESS + 4*0x25, brake);
return 0;
}
 
int RTDAC4_ioctl(unsigned int request, unsigned long l) {
/**
* Reset Encoders
*/
if(request == 1) {
unsigned short aux;
tempNbr1 = 0;
tempNbr2 = 0;
tempNbr3 = 0;
tempNbr4 = 0;
tempNbr5 = 0;
if ( BASE_ADDRESS == 0 )
{
printk("RTDAC4 ERROR: Reset encoders: BASE_ADDRESS = 0\n");
return -1;
}
aux = inp(BASE_ADDRESS + 4*0x05);
if( tempNbr1 == 0 ) aux = aux & 0x00FE;
if( tempNbr1 == 1 ) aux = aux | 0x0001;
if( tempNbr2 == 0 ) aux = aux & 0x00FD;
if( tempNbr2 == 1 ) aux = aux | 0x0002;
if( tempNbr3 == 0 ) aux = aux & 0x00FB;
if( tempNbr3 == 1 ) aux = aux | 0x0004;
if( tempNbr4 == 0 ) aux = aux & 0x00F7;
if( tempNbr4 == 1 ) aux = aux | 0x0008;
if( tempNbr5 == 0 ) aux = aux & 0x00EF;
if( tempNbr5 == 1 ) aux = aux | 0x0010;
outp(BASE_ADDRESS + 4*0x05, aux);
aux = inp(BASE_ADDRESS + 4*0x05);
return 0;
}
/**
* Prescaler.
*/
else if(request == 2) {
tempNbr1 = (short) l;
if ( BASE_ADDRESS == 0 ) {
return -1;
}
if( ( tempNbr1 >= 0 ) && ( tempNbr1 <= 63 ) )
{
outp(BASE_ADDRESS + 4*0x18, tempNbr1);
}
return 0;
}
return 0;
}
 
/unsupported/tags/rel_0_5/rtdac4/initfile.c
0,0 → 1,164
/*
* Project: S.Ha.R.K
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
#include "modules/intdrive.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
 
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
 
#include <drivers/shark_linuxc26.h>
#include <drivers/shark_input26.h>
#include <drivers/shark_keyb26.h>
 
#define FRAME_BUFFER_DEVICE 0
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
/*+ Interrupt Server +*/
#define INTDRIVE_Q 1000
#define INTDRIVE_T 10000
#define INTDRIVE_FLAG 0
 
void call_shutdown_task(void *arg);
int device_drivers_init();
int device_drivers_close();
void set_shutdown_task();
TASK shutdown_task_body(void *arg);
 
PID shutdown_task_PID = 1;
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG);
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 1);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
PI_register_module();
PC_register_module();
NPP_register_module();
SRP_register_module();
NOP_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
/* Create the shutdown task. It will be activated at RUNLEVEL
SHUTDOWN */
set_shutdown_task();
 
/* Init the drivers */
device_drivers_init();
 
/* Set the shutdown task activation */
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN);
 
__call_main__(mb);
 
return (void *)0;
}
 
void set_shutdown_task() {
 
/* WARNING: the shutdown task is a background thread. It cannot execute
if the system is overloaded */
NRT_TASK_MODEL nrt;
 
nrt_task_default_model(nrt);
nrt_task_def_system(nrt);
 
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL);
if (shutdown_task_PID == NIL) {
sys_shutdown_message("Error: Cannot create shutdown task\n");
sys_end();
}
 
}
 
int device_drivers_init() {
 
KEYB_PARMS kparms = BASE_KEYB;
LINUXC26_register_module();
 
INPUT26_init();
 
keyb_def_ctrlC(kparms, NULL);
 
KEYB26_init(&kparms);
 
return 0;
 
}
 
int device_drivers_close() {
KEYB26_close();
INPUT26_close();
return 0;
}
 
#define SHUTDOWN_TIMEOUT_SEC 3
 
void call_shutdown_task(void *arg)
{
struct timespec t;
 
sys_gettime(&t);
t.tv_sec += SHUTDOWN_TIMEOUT_SEC;
 
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0);
 
task_activate(shutdown_task_PID);
}
 
TASK shutdown_task_body(void *arg) {
 
device_drivers_close();
 
sys_shutdown_message("-- S.Ha.R.K. Closed --\n");
 
sys_abort_shutdown(0);
 
return NULL;
 
}
/unsupported/tags/rel_0_5/rtdac4/rtdac4.h
0,0 → 1,25
#ifndef __RTDAC4__
#define __RTDAC4__
 
/* Open the RT-DAC4/PCI card */
int RTDAC4_open(void);
 
/* Close the RT-DAC4/PCI card */
int RTDAC4_close(void);
 
/* Reads state information into vector buf.
Angle address: BASE_ADDRESS + 8 (16 bits)
Cart address: BASE_ADDRESS + 12 (16 bits)
*/
int RTDAC4_read_states(char *buf);
 
/* Control the electric motor.
Max output when testing: 650.
Max to motor: 1023.
*/
int RTDAC4_set_motor(const short *buff);
 
/* IOCTL emulation */
int RTDAC4_ioctl(unsigned int request, unsigned long l);
 
#endif
/unsupported/tags/rel_0_5/rtdac4/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= test
 
include $(BASE)/config/example.mk
 
test:
make -f $(SUBMAKE) APP=test INIT= OTHEROBJS="initfile.o rtdac4.o" SHARKOPT="__LINUXC26__ __PCI__ __INPUT__"
 
/unsupported/tags/rel_0_5/oscilloscopio/osc.c
0,0 → 1,871
/*****************************************************************************
* Filename: osc.c *
* Author: Ghiro Andrea,Franchino Gianluca *
* Date: 09/2003 *
* Description: Oscilloscope and function generator for PCI6025E *
*----------------------------------------------------------------------------*
* Notes: Connect DAC output pin (21) to ADC input pins (3-18) and *
* watch the waveforms. *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2003 Ghiro Andrea,Franchino Gianluca
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#include <drivers/glib.h>
#include <drivers/keyb.h>
#include <math.h>
#include <drivers/pci6025e/dac.h>
#include <modules/hartport.h>
#include <modules/srp.h>
#include "adc.h"
 
#define MAX_VAL 500
#define NUM_POINT 20
#define GRAPH_PERIOD 50000
#define GRAPH_WCET 2000
#define WAVE_WCET 200
#define OSC_WCET 200
#define TASK_GROUP 1
#define CHFREQ_PERIOD 5000
#define CHFREQ_WCET 200
 
void drawInterface(void);
void endfun(KEY_EVT *);
void close_event(void *);
void createWaves(void);
void change_disp(KEY_EVT *);
void change_mode(KEY_EVT *);
void change_wave(KEY_EVT *);
void change_passo(KEY_EVT *);
void change_channel(KEY_EVT *);
void inc(KEY_EVT *);
void dec(KEY_EVT *);
 
TASK video_body(int);
TASK wave_body(int);
TASK osc_body(int);
TASK chfreq_body(int);
 
HARD_TASK_MODEL wave0;
HARD_TASK_MODEL chfreq;
HARD_TASK_MODEL osc;
SRP_RES_MODEL r;
SRP_mutexattr_t a;
 
PID wave0_pid;
PID chfreq_pid;
PID osc_pid;
 
mutex_t m1 ;
 
int black = rgb16(0,0,0),
white = rgb16(255, 255, 255);
 
int wave = 3,
varfun = 0,
varosc = 0,
flagch = 0,
channel = 0;
 
float vfun = 0,
vosc = 2.5,
ffun = 1,
tbase = 75,
yr[MAX_VAL],
yrdac[NUM_POINT],
ys[MAX_VAL],
ysdac[NUM_POINT],
yq[MAX_VAL],
yqdac[NUM_POINT];
 
BYTE disp = 0,
modefun= 0,
modeosc= 0,
lib = 0,
sys = 0;
 
short yoscold[MAX_VAL];
 
unsigned int period= 1e6/NUM_POINT;
unsigned int oscperiod = 1500;
 
int main(int argc, char **argv)
{
KEY_EVT k;
 
HARD_TASK_MODEL video;
PID video_pid;
 
int modenum;
 
k.flag = CNTR_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
k.flag = CNTL_BIT;
keyb_hook(k, endfun);
k.flag = 0;
k.scan = KEY_A;
k.ascii = 'a';
keyb_hook(k, change_disp);
 
k.flag = 0;
k.scan = KEY_S;
k.ascii = 's';
keyb_hook(k, change_mode);
 
k.flag = 0;
k.scan = KEY_F;
k.ascii = 'f';
keyb_hook(k, change_wave);
k.flag = 0;
k.scan = KEY_G;
k.ascii = 'g';
keyb_hook(k, change_wave);
k.flag = 0;
k.scan = KEY_H;
k.ascii = 'H';
keyb_hook(k, change_wave);
k.flag = 0;
k.scan = KEY_D;
k.ascii = 'd';
keyb_hook(k, change_passo);
 
k.flag = 0;
k.scan = KEY_J;
k.ascii = 'j';
keyb_hook(k, change_channel);
 
k.flag = 0;
k.scan = 78;
k.ascii = 43;
keyb_hook(k, inc);
 
k.flag = 0;
k.scan = 74;
k.ascii = 45;
keyb_hook(k, dec);
 
sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
 
/*initialize the srp mutex*/
SRP_mutexattr_default(a);
mutex_init(&m1,&a);
 
hard_task_default_model(wave0);
hard_task_def_wcet(wave0, WAVE_WCET);
hard_task_def_mit(wave0, period);
hard_task_def_group(wave0, TASK_GROUP);
if( (wave0_pid = task_create("Wave 0", wave_body, &wave0, NULL)) == NIL )
{
sys = 10;
sys_end();
}
 
hard_task_default_model(video);
hard_task_def_wcet(video, GRAPH_WCET);
hard_task_def_mit(video, GRAPH_PERIOD);
hard_task_def_group(video, TASK_GROUP);
SRP_res_default_model(r,2);
if( (video_pid = task_createn("Video task", video_body, &video, &r,
SRP_usemutex(&m1), NULL))== NIL )
{
sys = 12;
sys_end();
}
 
hard_task_default_model(osc);
hard_task_def_wcet(osc, OSC_WCET);
hard_task_def_mit(osc, oscperiod);
hard_task_def_group(osc, TASK_GROUP);
SRP_res_default_model(r,1);
if((osc_pid = task_createn("osc task", osc_body, &osc, &r,
SRP_usemutex(&m1), NULL))== NIL )
{
sys = 11;
sys_end();
}
 
hard_task_default_model(chfreq);
hard_task_def_wcet(chfreq, CHFREQ_WCET);
hard_task_def_mit(chfreq, CHFREQ_PERIOD);
hard_task_def_group(chfreq, TASK_GROUP);
if( (chfreq_pid = task_create("chfreq", chfreq_body, &chfreq, NULL)) == NIL )
{
sys = 13;
sys_end();
}
 
if(grx_init() == -1)
{
sys = 30;
sys_end();
}
 
if((modenum = grx_getmode(800, 600, 16)) == -1)
{
sys = 31;
sys_end();
}
 
if(pci_init() == -1)
{
sys = 20;
sys_end();
}
 
if(!reMap())
{
sys = 21;
sys_end();
}
 
grx_setmode(modenum);
 
createWaves();
drawInterface();
 
DAC_Init(); //Program the DAQ-STC AOTM
Configure_Board(channel); //Configure the board with the channel settings.
ADC_Init(); //Program the DAQ-STC AITM
group_activate(TASK_GROUP);
 
return 0;
}
 
void endfun(KEY_EVT *k)
{
sys_end();
}
 
void close_event(void *arg)
{
grx_close();
switch(sys)
{
case 0: cprintf("Regular End!\n"); break;
case 10: cprintf("Cannot create <wave 0> task!\n"); break;
case 11: cprintf("Cannot create <osc> task!\n"); break;
case 12: cprintf("Cannot create <video> task!\n"); break;
case 13: cprintf("Cannot create <chfreq> task!\n"); break;
case 14: cprintf("Cannot kill <wave 0> task!\n"); break;
case 15: cprintf("Cannot kill <osc> task\n");break;
case 20: cprintf("No PCI bus found!\n"); break;
case 21: cprintf("No NATIONAL PCI E-Series board found on PCI bus!\n");break;
case 30: cprintf("Cannot start graphic envirorment!\n"); break;
case 31: cprintf("800x600x16 video mode not supported!\n");break;
default: cprintf("Unknown exit event!\n"); break;
}
}
 
/*
* kill wave0 or osc when frequency change
*/
 
TASK chfreq_body(int w)
{
PORT p;
char msg[1];
p = port_create("activation",1,1,STREAM,WRITE);
 
while(1)
{
if(flagch == 1)
{
if(task_kill(wave0_pid)!=0)
{
sys=14;
sys_end();
}
hard_task_def_mit(wave0, period);
if( (wave0_pid = task_create("wave 0", wave_body, &wave0, NULL))== NIL )
{
sys = 10;
sys_end();
}
flagch = 0;
task_activate(wave0_pid);
}
 
if(flagch == 2)
{
if(task_kill(osc_pid)!=0)
{
sys=15;
sys_end();
}
hard_task_def_mit(osc, oscperiod);
if( (osc_pid = task_createn("osc", osc_body, &osc, &r,
SRP_usemutex(&m1), NULL))== NIL )
{
sys = 11;
sys_end();
}
flagch = 0;
msg[0]=1;
port_send(p,msg,NON_BLOCK);
}
task_endcycle();
}
}
 
/*
* acquisition of input samples
*/
 
TASK osc_body(int wv)
{
int i = 0 ;
short y = 0;
WORD Status = 0;
 
while(1)
{
mutex_lock(&m1);
if(lib)
{
mutex_unlock(&m1);
AI_Start_The_Acquisition();
do {
Status = DAQ_STC_Windowed_Mode_Read(AI_STATUS_1);
if (!( (Status & 0x1000) == 0x1000 ) )
y = Immediate_Readw(ADC_DATA_READ);
} while(((Status & 0x1000) == 0x1000));
y = (2.5/vosc)*(y-40)/20;
if(abs(y)<=100)
{
grx_plot(19+i,483-y,rgb16(255,255,0));
}
yoscold[i]=y;
i=(i+1)%500;
if(i==0)
{
mutex_lock(&m1);
lib=0;
mutex_unlock(&m1);
task_testcancel();
}
}
else mutex_unlock(&m1);
task_endcycle();
}
}
 
/*
* Sends out waves' samples
*/
 
TASK wave_body(int wv)
{
int i = 0;
int y = 0;
while(1)
{
if(wave==0)
{
y=vfun*(yrdac[i]*20);
y=(y & 0x0FFF);
}
if(wave==1)
{
y=vfun*(ysdac[i]*20);
y=(y & 0x0FFF);
}
if(wave==2)
{
y=vfun*(yqdac[i]*20);
y=(y & 0x0FFF);
}
DAC_output(DAC1,y);
i = (i + 1) % NUM_POINT;
task_testcancel();
task_endcycle();
}
}
 
/*
* Shows setting,wave,grid and clear display
*/
 
TASK video_body(int dummy)
{
BYTE dispold = 1,
modefunold = 1,
modeoscold = 1,
new = 0;
 
int waveold = 3,
varfunold = 2,
i = 0,
y = 0,
channelold = 16,
yold[MAX_VAL];
 
 
float vfunold = 1,
voscold = 1,
ffunold = 0,
tbaseold = 1;
char st[20];
 
PORT p;
char msg[1];
p=port_connect("activation",1,STREAM,READ);
 
while(1)
{
mutex_lock(&m1);
if(!lib)
{
mutex_unlock(&m1);
for(i=0;i<MAX_VAL;i++)
{
if(abs(yoscold[i])<=100)
{
grx_plot(19+i,483-yoscold[i],rgb16(0,0,0));
}
}
//OSCILLOSCOPE GRID
grx_line(19, 385, 519, 385, rgb16(150,150,150));
grx_line(19, 410, 519, 410, rgb16(150,150,150));
grx_line(19, 435, 519, 435, rgb16(150,150,150));
grx_line(19, 460, 519, 460, rgb16(150,150,150));
grx_line(19, 485, 519, 485, rgb16(150,150,150));
grx_line(19, 510, 519, 510, rgb16(150,150,150));
grx_line(19, 535, 519, 535, rgb16(150,150,150));
grx_line(19, 560, 519, 560, rgb16(150,150,150));
grx_line(19, 585, 519, 585, rgb16(150,150,150));
grx_line(19, 385, 19, 585, rgb16(150,150,150));
grx_line(69, 385, 69, 585, rgb16(150,150,150));
grx_line(119, 385, 119, 585, rgb16(150,150,150));
grx_line(169, 385, 169, 585, rgb16(150,150,150));
grx_line(219, 385, 219, 585, rgb16(150,150,150));
grx_line(269, 385, 269, 585, rgb16(150,150,150));
grx_line(319, 385, 319, 585, rgb16(150,150,150));
grx_line(369, 385, 369, 585, rgb16(150,150,150));
grx_line(419, 385, 419, 585, rgb16(150,150,150));
grx_line(469, 385, 469, 585, rgb16(150,150,150));
grx_line(519, 385, 519, 585, rgb16(150,150,150));
mutex_lock(&m1);
lib=1;
mutex_unlock(&m1);
port_receive(p,msg,NON_BLOCK);
if(msg[0]==1)
{
task_activate(osc_pid);
}
}
else mutex_unlock(&m1);
if(disp != dispold)
{
dispold = disp;
grx_disc(780,120,10,rgb16(255*(1-disp),0,0));
grx_disc(780,390,10,rgb16(0,255*disp,0));
}
if(modefun != modefunold)
{
modefunold = modefun;
grx_disc(780,237,5,rgb16(255*(1-modefun),0,0));
grx_disc(780,267,5,rgb16(255*(modefun),0,0));
}
if(modeosc != modeoscold)
{
modeoscold = modeosc;
grx_disc(780,502,5,rgb16(0,255*(1-modeosc),0));
grx_disc(780,532,5,rgb16(0,255*(modeosc),0));
}
if(wave != waveold)
{
waveold = wave;
grx_disc(730,127,3,rgb16(127*(1-wave)*(2-wave),0,0));
grx_disc(730,142,3,rgb16(254*wave*(2-wave),0,0));
grx_disc(730,157,3,rgb16(254*wave*(wave-1),0,0));
new=1;
}
if(varfun != varfunold)
{
varfunold = varfun;
grx_disc(675,292,3,rgb16(42*(1-varfun)*(2-varfun)*(3-varfun),0,0));
grx_disc(775,292,3,rgb16(126*varfun*(2-varfun)*(3-varfun),0,0));
grx_disc(675,307,3,rgb16(252*varfun*(varfun-1)*(3-varfun),0,0));
grx_disc(775,307,3,rgb16(42*varfun*(varfun-1)*(varfun-2),0,0));
}
 
if(channel != channelold)
{
sprintf(st,"%2d",channel);
grx_text(" ",660,470,black,white);
grx_text(st,660,470,black,white);
}
 
if(ffun != ffunold)
{
ffunold = ffun;
sprintf(st,"%10f",ffun);
grx_text(" ",660,265,black,white);
grx_text(st,660,265,black,white);
}
if(tbase != tbaseold)
{
tbaseold = tbase;
sprintf(st,"%10f",tbase);
grx_text(" ",660,530,black,white);
grx_text(st,660,530,black,white);
}
if(vfun != vfunold)
{
vfunold = vfun;
sprintf(st,"%3.1f",vfun);
grx_text(" ",660,235,black,white);
grx_text(st,660,235,black,white);
new=1;
}
if(vosc != voscold)
{
voscold = vosc;
sprintf(st,"%3.1f",vosc);
grx_text(" ",660,500,black,white);
grx_text(st,660,500,black,white);
}
if(new)
{
for(i=0; i<MAX_VAL; i++)
{
grx_plot(19+i, 215-yold[i],rgb16(0, 0, 0));
}
//FUNCTION GENERATOR GRID
grx_line(22, 115, 525, 115, rgb16(150,150,150));
grx_line(22, 165, 525, 165, rgb16(150,150,150));
grx_line(22, 265, 525, 265, rgb16(150,150,150));
grx_line(22, 315, 525, 315, rgb16(150,150,150));
grx_line(19, 110, 19, 320, rgb16(150,150,150));
grx_line(14, 215, 525, 215, rgb16(150,150,150));
if(wave==0)
{
for(i=0;i<MAX_VAL;i++)
{
y=(vfun)*yr[i];
grx_plot(19+i,215-y,rgb16(255,255,0));
yold[i]=y;
}
}
if(wave==1)
{
for(i=0;i<MAX_VAL;i++)
{
y=(vfun)*ys[i];
grx_plot(19+i,215-y,rgb16(255,255,0));
yold[i]=y;
}
}
if(wave==2)
{
for(i=0;i<MAX_VAL;i++)
{
y=(vfun)*yq[i];
grx_plot(19+i,215-y,rgb16(255,255,0));
yold[i]=y;
}
}
 
new=0;
}
task_endcycle();
}
}
 
/*
* create wave triangular,sinusoidal and square
*/
 
void createWaves(void)
{
float u=0,
qdac= 2*PI/NUM_POINT,
q = 2*PI/(MAX_VAL/2);
 
register int i;
 
BYTE direction=0;
/*create the vectors for the video task*/
for(i=0;i<MAX_VAL/2;i++)
{
yr[i]=yr[i+MAX_VAL/2]=u/10;
if(!direction) u += 1.613;
else u -= 1.613;
if(u >= 100) direction = 1;
if(u <= -101) direction = 0;
ys[i]=ys[i+MAX_VAL/2] = (sin(i*q)*10);
 
if((i>=(MAX_VAL/4) && i< (MAX_VAL/2))) yq[i]=yq[i+MAX_VAL/2]=0;
else yq[i]=yq[i+MAX_VAL/2]=10;
}
/*create the vectors for the wave_body task*/
direction=0;
u = 0;
for(i=0;i<NUM_POINT;i++)
{
yrdac[i]=u/10;
if(!direction) u += (400/NUM_POINT);
else u -= (400/NUM_POINT);
if(u >= 100) direction = 1;
if(u <= -100) direction = 0;
ysdac[i]=(sin(i*qdac)*10);
 
if((i>=(NUM_POINT/2) && i<NUM_POINT)) yqdac[i]=0;
else yqdac[i]=10;
}
}
 
/*
* select device (0 function generator,1 oscilloscope)
*/
 
void change_disp(KEY_EVT *k)
{
if(disp) disp = 0;
else disp = 1;
}
 
/*
* select volt or frequency
*/
 
void change_mode(KEY_EVT *k)
{
if(disp && modeosc) modeosc = 0;
else
if(disp && !modeosc) modeosc = 1;
else
if(!disp && modefun) modefun = 0;
else
if(!disp && !modefun) modefun =1;
}
 
/*
* select wave (0 triangular,1 sinusoindal,2 square
*/
 
void change_wave(KEY_EVT *k)
{
if(!disp && k->ascii =='f')
{
wave=0;
}
else
if(!disp && k->ascii =='g')
{
wave=1;
}
else
if(!disp && k->ascii =='h')
{
wave=2;
}
}
 
/*
* select increase or decrease step
*/
 
void change_passo(KEY_EVT *k)
{
if(!disp && modefun)
{
varfun=(varfun+1)%2;
}
}
 
/*
* select input channel
*/
 
void change_channel(KEY_EVT *k)
{
if(disp)
{
channel=(channel+1)%16;
Configure_Board(channel);
}
}
 
/*
* increase selected variable
*/
 
void inc(KEY_EVT *k)
{
if(disp && modeosc && tbase<300)
{
flagch=2;
switch(varosc)
{
case(0): tbase = tbase*2;
oscperiod=(tbase/50)*1000;
break;
}
}
else
if(disp && !modeosc && vosc<10) vosc += 0.1;
else
if(!disp && modefun && ffun<(1e6/(1020*NUM_POINT))-1)
{
flagch=1;
switch(varfun)
{
case(0): ffun += 1;
period = 1e6/(NUM_POINT*ffun);
break;
case(1): ffun += 10;
period = 1e6/(NUM_POINT*ffun);
break;
}
}
else
if(!disp && !modefun && vfun<10) vfun += 0.1;
}
 
/*
* decrease selected variable
*/
 
void dec(KEY_EVT *k)
{
if(disp && modeosc && tbase> 75)
{
flagch=2;
switch(varosc)
{
case(0): tbase = tbase/2;
oscperiod=(tbase/50)*1000;
break;
}
}
else
if(disp && !modeosc && vosc> 0.2) vosc -= 0.1;
else
if(!disp && modefun && ffun> 0)
{
flagch = 1;
switch(varfun)
{
case(0): ffun -= 1;
if(ffun == 0) period =1e6;
else
period = 1e6/(NUM_POINT*ffun);
break;
case(1): ffun -= 10;
if(ffun == 0) period =1e6;
else
period = 1e6/(NUM_POINT*ffun);
break;
}
}
else
if(!disp && !modefun && vfun> -10) vfun -= 0.1;
}
 
/*
* draw interface
*/
 
void drawInterface(void)
{
//TITLE
grx_rect(1, 1, 799, 69, rgb16(105, 0, 105));
grx_rect(2, 2, 798, 68, rgb16(155, 0, 155));
grx_rect(3, 3, 797, 67, rgb16(205, 0, 205));
grx_rect(4, 4, 796, 66, rgb16(255, 0, 255));
grx_text("Oscilloscope and function generator for PCI6025E",7, 10, rgb16(50, 255, 50), black);
grx_text("Pin ADC 3-18, DAC 21",7, 25, rgb16(0, 255, 255), black);
grx_text("A for select Oscilloscope or Function generator",7, 40, rgb16(0, 255, 255), black);
grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black);
 
//FUNCTION GENERATOR
grx_text("FUNCTION GENERATOR", 100, 92, rgb16(200, 200, 0), black);
grx_rect(1, 100, 549, 325, rgb16(0, 105, 0));
grx_rect(2, 101, 548, 324, rgb16(0, 155, 0));
grx_rect(3, 102, 547, 323, rgb16(0, 205, 0));
grx_rect(4, 103, 546, 322, rgb16(0, 255, 0));
grx_rect(579, 100, 799, 325, rgb16(0, 105, 0));
grx_rect(580, 101, 798, 324, rgb16(0, 155, 0));
grx_rect(581, 102, 797, 323, rgb16(0, 205, 0));
grx_rect(582, 103, 796, 322, rgb16(0, 255, 0));
grx_text("Wave selection",589,110,rgb16(0, 255, 0), black);
grx_text("f -->triangular",589,125,rgb16(200, 200, 0), black);
grx_text("g -->sin",589,140,rgb16(200, 200, 0), black);
grx_text("h -->square",589,155,rgb16(200, 200, 0), black);
grx_text("s -->select volt/freq",589,180,rgb16(200, 200, 0), black);
grx_text("+/- -->set volt/freq",589,195,rgb16(200, 200, 0), black);
grx_text("d -->frequency increase",589,210,rgb16(200, 200, 0),black);
grx_text("Vpicco V",589,235,rgb16(0, 255, 0),black);
grx_text("Freq Hz",589,265,rgb16(0, 255, 0),black);
grx_text("+/- 1 Hz",589,290,rgb16(0, 255, 0),black);
grx_text("+/- 10 HZ",689,290,rgb16(0, 255, 0),black);
//OSCILLOSCOPE
grx_text("OSCILLOSCOPE", 100, 362, rgb16(200, 200, 0), black);
grx_rect(1, 370, 549, 595, rgb16(105, 0, 0));
grx_rect(2, 371, 548, 594, rgb16(155, 0, 0));
grx_rect(3, 372, 547, 593, rgb16(205, 0, 0));
grx_rect(4, 373, 546, 592, rgb16(255, 0, 0));
grx_rect(579, 370, 799, 595, rgb16(105, 0, 0));
grx_rect(580, 371, 798, 594, rgb16(155, 0, 0));
grx_rect(581, 372, 797, 593, rgb16(205, 0, 0));
grx_rect(582, 373, 796, 592, rgb16(255, 0, 0));
grx_text("Scale selection",589,380,rgb16(255, 0, 0), black);
grx_text("s -->select volt/freq",589,400,rgb16(200, 200, 0), black);
grx_text("+/- -->set volt/freq",589,415,rgb16(200, 200, 0), black);
grx_text("j -->change channel",589,430,rgb16(200, 200, 0),black);
grx_text("Channel",589,470,rgb16(255, 0, 0),black);
grx_text("Volt/div V",589,500,rgb16(255, 0, 0),black);
grx_text("Time/div ms",589,530,rgb16(255, 0, 0),black);
 
//LABEL
grx_text("0 V", 555, 211, rgb16(0, 255, 0), black);
grx_text("+10", 555, 111, rgb16(0, 255, 0), black);
grx_text("+5", 555, 161, rgb16(0, 255, 0), black);
grx_text("-5", 555, 261, rgb16(0, 255, 0), black);
grx_text("-10", 555, 311, rgb16(0, 255 , 0), black);
grx_text("0 V", 555, 481, rgb16(255, 0, 0), black);
}
/unsupported/tags/rel_0_5/oscilloscopio/adc.c
0,0 → 1,400
/*****************************************************************************
* Filename: ADC.C *
* Author: Ghiro Andrea,Franchino Gianluca *
* Date: 06/06/2001 *
* Description: Analog 2 digital conversion functions *
*----------------------------------------------------------------------------*
* Notes: Funcion for one sample from Ch0 *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2003 Ghiro Andrea,Franchino Gianluca
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "adc.h"
 
/*
* Call this function to configure board options.
*/
 
void Configure_Board(BYTE numch)
{
WORD memhi;
/*
* Writing to register Write_Strobe_0_Register with address 82.
* Write_Strobe_0 <= 1
* New pattern = 0x0001
*/
DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_0,0x0001);
/*
* Writing to register Write_Strobe_1_Register with address 83.
* Write_Strobe_1 <= 1
* New pattern = 0x0001
*/
DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_1,0x0001);
 
/*
* Writing to register Config_Memory_High_Register with address 18.
* CM_Channel_Number <= channel_number (0)
* CM_Channel_Bank <= channel_bank (0)
* CM_Channel_Type <= channel_type_for_rev_b (3)
* New pattern = 0x3000
*/
memhi = 0x3000 | numch;
Immediate_Writew(ADC_CONFIG_HI,memhi);
 
/*
* Writing to register Config_Memory_Low_Register with address 16.
* CM_Last_Channel <= last_channel (1)
* CM_Trigger <= trigger (0)
* CM_AI_Gain <= ai_gain (1)
* CM_AI_Polarity <= ai_polarity (0)
* CM_AI_Dither_Enable <= ai_dither_enable (0)
* New pattern = 0x8001
*/
Immediate_Writew(ADC_CONFIG_LO,0x8100);
return;
}
 
/*
* program the ADC_STC
*/
void ADC_Init()
{
/*
* configure the timebase options.
*/
/*
* Writing to register Clock_and_FOUT_Register with address 56.
* Slow_Internal_Timebase <= p->msc_slow_int_tb_enable (1)
* Slow_Internal_Time_Divide_By_2 <= p->msc_slow_int_tb_divide_by_2 (1)
* Clock_To_Board <= p->msc_clock_to_board_enable (1)
* Clock_To_Board_Divide_By_2 <= p->msc_clock_to_board_divide_by_2 (1)
* New pattern = 0x1B00
*/
DAQ_STC_Windowed_Mode_Write(CLOCK_AND_FOUT,0x1B00);
 
/*
* clear the AI FIFO.
*/
/*
* Writing to register Write_Strobe_1_Register with address 83.
* Write_Strobe_1 <= 1
* New pattern = 0x0001
*/
DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_1,0x0001);
 
/*
* stop any activities in progress.
*/
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Reset <= 1
* New pattern = 0x0001
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0001);
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 1
* New pattern = 0x0010
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
 
/*
* Writing to register Interrupt_A_Ack_Register with address 2.
* AI_SC_TC_Error_Confirm <= 1
* AI_SC_TC_Interrupt_Ack <= 1
* AI_START1_Interrupt_Ack <= 1
* AI_START2_Interrupt_Ack <= 1
* AI_START_Interrupt_Ack <= 1
* AI_STOP_Interrupt_Ack <= 1
* AI_Error_Interrupt_Ack <= 1
* New pattern = 0x3F80
*/
DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK,0x3F80);
 
/*
* Writing to register AI_Command_1_Register with address 8.
* AI_Command_1_Register <= 0
* New pattern = 0x0000
*/
DAQ_STC_Windowed_Mode_Write(AI_COMMAND_1,0x0000);
 
/*
* Writing to register AI_Mode_1_Register with address 12.
* Reserved_One <= 1
* AI_Start_Stop <= 1
* New pattern = 0x000C
*/
DAQ_STC_Windowed_Mode_Write(AI_MODE_1,0x000C);
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 0
* AI_Configuration_End <= 1
* New pattern = 0x0100
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
 
/*
* setup the board.
*/
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 1
* New pattern = 0x0010
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
 
/*
* Writing to register Clock_and_FOUT_Register with address 56.
* AI_Source_Divide_By_2 <= p->ai_source_divide_by_2 (0)
* AI_Output_Divide_By_2 <= p->ai_output_divide_by_2 (1)
* New pattern = 0x1B80
*/
DAQ_STC_Windowed_Mode_Write(CLOCK_AND_FOUT,0x1B80);
 
/*
* Writing to register AI_Personal_Register with address 77.
* AI_CONVERT_Pulse_Timebase <= p->ai_convert_pulse_timebase (0)
* AI_CONVERT_Pulse_Width <= p->ai_convert_pulse_width (1)
* AI_FIFO_Flags_Polarity <= p->ai_fifo_flags_polarity (0)
* AI_LOCALMUX_CLK_Pulse_Width <= p->ai_localmux_clk_pulse_width (1)
* AI_AIFREQ_Polarity <= p->ai_aifreq_polarity (0)
* AI_SHIFTIN_Polarity <= p->ai_shiftin_polarity (0)
* AI_SHIFTIN_Pulse_Width <= p->ai_shiftin_pulse_width (1)
* AI_EOC_Polarity <= p->ai_eoc_polarity (0)
* AI_SOC_Polarity <= p->ai_soc_polarity (1)
* AI_Overrun_Mode <= p->ai_overrun_mode (1)
* New pattern = 0xA4A0
*/
DAQ_STC_Windowed_Mode_Write(AI_PERSONAL,0xA4A0);
 
/*
* Writing to register AI_Output_Control_Register with address 60.
* AI_CONVERT_Output_Select <= p->ai_convert_output_select (2)
* AI_SC_TC_Output_Select <= p->ai_sc_tc_output_select (3)
* AI_SCAN_IN_PROG_Output_Select <= p->ai_scan_in_prog_output_select (3)
* AI_LOCALMUX_CLK_Output_Select <= p->ai_localmux_clk_output_select (2)
* New pattern = 0x032E
*/
DAQ_STC_Windowed_Mode_Write(AI_OUTPUT_CONTROL,0x032E);
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 0
* AI_Configuration_End <= 1
* New pattern = 0x0100
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
 
/*
* access the first value in the configuration
* FIFO.
*/
/*
* Writing to register AI_Command_1_Register with address 8.
* AI_CONVERT_Pulse <= 1
* New pattern = 0x0001
*/
DAQ_STC_Windowed_Mode_Write(AI_COMMAND_1,0x0001);
/*
* setup for external hardware.
*/
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 1
* New pattern = 0x0010
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
 
/*
* Writing to register AI_Mode_2_Register with address 13.
* AI_External_MUX_Present <= 0
* New pattern = 0x0000
*/
DAQ_STC_Windowed_Mode_Write(AI_MODE_2,0x0000);
 
/*
* Writing to register AI_Output_Control_Register with address 60.
* AI_EXTMUX_CLK_Output_Select <= p->ai_extmux_clk_output_select (0)
* New pattern = 0x032E
*/
DAQ_STC_Windowed_Mode_Write(AI_OUTPUT_CONTROL,0x032E);
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 0
* AI_Configuration_End <= 1
* New pattern = 0x0100
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
 
/*
* enable or disable retriggering.
*/
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 1
* New pattern = 0x0010
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
 
/*
* Writing to register AI_Mode_1_Register with address 12.
* AI_Trigger_Once <= 1
* New pattern = 0x000D
*/
DAQ_STC_Windowed_Mode_Write(AI_MODE_1,0x000D);
 
/*
* Writing to register AI_Trigger_Select_Register with address 63.
* AI_START1_Select <= 0
* AI_START1_Polarity <= 0
* AI_START1_Edge <= 1
* AI_START1_Sync <= 1
* New pattern = 0x0060
*/
DAQ_STC_Windowed_Mode_Write(AI_TRIGGER_SELECT,0x0060);
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 0
* AI_Configuration_End <= 1
* New pattern = 0x0100
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
/*
* select the number of scans.
*/
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 1
* New pattern = 0x0010
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
 
DAQ_STC_Windowed_Mode_Write(AI_MODE_1,0x000F);
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 0
* AI_Configuration_End <= 1
* New pattern = 0x0100
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
/*
* select the scan start event.
*/
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 1
* New pattern = 0x0010
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
 
/*
* Writing to register AI_START_STOP_Select_Register with address 62.
* AI_START_Select <= 0
* AI_START_Edge <= 1
* AI_START_Sync <= 1
* AI_START_Polarity <= 0
* New pattern = 0x0060
*/
DAQ_STC_Windowed_Mode_Write(AI_START_STOP_SELECT,0x0060);
 
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 0
* AI_Configuration_End <= 1
* New pattern = 0x0100
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
/*
* select the end of scan event.
*/
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 1
* New pattern = 0x0010
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0010);
 
/*
* Writing to register AI_START_STOP_Select_Register with address 62.
* AI_STOP_Select <= p->ai_stop_select (19)
* AI_STOP_Edge <= 0
* AI_STOP_Polarity <= p->ai_stop_polarity (0)
* AI_STOP_Sync <= 1
* New pattern = 0x29E0
*/
DAQ_STC_Windowed_Mode_Write(AI_START_STOP_SELECT,0x29E0);
 
/*
* Writing to register Joint_Reset_Register with address 72.
* AI_Configuration_Start <= 0
* AI_Configuration_End <= 1
* New pattern = 0x0100
*/
DAQ_STC_Windowed_Mode_Write(JOINT_RESET,0x0100);
/*
* clear the AI FIFO.
*/
/*
* Writing to register Write_Strobe_1_Register with address 83.
* Write_Strobe_1 <= 1
* New pattern = 0x0001
*/
DAQ_STC_Windowed_Mode_Write(WRITE_STROBE_1,0x0001);
return;
}
 
/*
* Call this function to start the acquistion.
*/
 
void AI_Start_The_Acquisition()
{
/*
* Writing to register AI_Command_1_Register with address 8.
* AI_CONVERT_Pulse <= 1
* New pattern = 0x0001
*/
DAQ_STC_Windowed_Mode_Write(AI_COMMAND_1,0x0001);
return;
}
/*End of file: adc.c*/
 
 
 
 
/unsupported/tags/rel_0_5/oscilloscopio/initosc.c
0,0 → 1,69
/*
* Filename: Initosc.c
* Author: Ghiro Andrea, Franchino Gianluca
* Date: 09/03
* Description: this file is for osc
*/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2003 Ghiro Andrea Franchino Gianluca
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <kernel/kern.h>
#include <modules/edf.h>
#include <modules/cbs.h>
#include <modules/rr.h>
#include <modules/hartport.h>
#include <modules/dummy.h>
#include <modules/sem.h>
#include <modules/srp.h>
 
#include <drivers/keyb.h>
 
#define TICK 1000
#define RRTICK 5000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
SRP_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
/unsupported/tags/rel_0_5/oscilloscopio/readme.txt
0,0 → 1,0
Verione con tutti i task periodici Hard
/unsupported/tags/rel_0_5/oscilloscopio/makefile
0,0 → 1,18
#
#
# PCI6025E Examples and Test programs
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= osc
 
include $(BASE)/config/example.mk
 
osc:
make -f $(SUBMAKE) APP=osc OTHEROBJS="initosc.o adc.o" SHARKOPT="__6025E__ __OLDCHAR__ __GRX__"
 
/unsupported/tags/rel_0_5/oscilloscopio/adc.h
0,0 → 1,48
/*****************************************************************************
* Filename: ADC.H *
* Author: Ghiro Andrea,Franchino Gianluca *
* Date: 09/2003 *
* Description: Analog 2 digital conversion package header file *
*----------------------------------------------------------------------------*
* Notes: *
*****************************************************************************/
 
/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
*
* Copyright (C) 2003 Ghiro Andrea,Franchino Gianluca
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#ifndef _MY_ADC_H_
#define _MY_ADC_H_
 
#include <drivers/pci6025e/pci6025e.h>
#include <drivers/pci6025e/regconst.h>
#include "ll/sys/cdefs.h"
 
__BEGIN_DECLS
 
//Analog input releted functions
void Configure_Board(BYTE);
void ADC_Init(void);
void AI_Start_The_Acquisition(void);
 
__END_DECLS
#endif
/*End of file: adc.h*/
 
/unsupported/tags/rel_0_5/simcity/keyboard.c
0,0 → 1,49
/* ------------------ */
/* Keyboard handler */
/* ------------------ */
 
#include <drivers/keyb.h>
#include "include/keyfunct.h"
 
void keyb_h() {
KEY_EVT k;
keyb_set_map(itaMap);
/* Exit keys: ALT-X, ENTER */
k.flag = ALTL_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
k.flag = ALTR_BIT;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k, endfun);
k.flag = 0;
k.scan = KEY_ENT;
k.ascii = 13;
keyb_hook(k, endfun);
/* Create HARD cars */
k.flag = 0;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k, h_car_create);
/* kill hard cars*/
k.flag = 0;
k.scan = KEY_K;
k.ascii = 'k';
keyb_hook(k, h_car_kill);
//refresh map
k.flag=0;
k.scan = KEY_R;
k.ascii = 'r';
keyb_hook(k, refresh);
//create soft cars
k.flag=0;
k.scan = KEY_S;
k.ascii = 's';
keyb_hook(k, s_car_create);
//toggle sensors
k.flag=0;
k.scan = KEY_D;
k.ascii = 'd';
keyb_hook(k, sensor_switch);
}
/unsupported/tags/rel_0_5/simcity/include/constant.h
0,0 → 1,99
/*************************const.h*******************************/
// constants and new types declaration
#include <kernel/func.h>
#define CST
 
#define NO_SPRITE 8
 
 
#define GRAPH
#define SENSOR
#define MAX_CAR 10
#define MAX_TL 3
#define S_POINT 4
#define PERIOD_CAR 135000 //period for K62 350MHZ
//#define PERIOD_CAR 87000 //period for PIII 733MHZ
#define SPERIOD_CAR 13000
#define SCAR_WCET 4300
#define SECOND 1000000
#define TL_WCET 200
#define CAM_WCET 200
#define GAUGE_WCET 200
#define ARROW_WCET 100
//#define CAR_WCET 7700 //wcet for PIII 733MHZ
#define CAR_WCET 12400 //wcet for K62 350MHZ
#define ROW 30
#define COL 30
#define NCAR 24
#define W 640
#define H 480
#define SH 12
#define SW 12
#define MAX_DIST 50.0
#define NORM_DIST 15.0
#define COLL_DIST 25.0
#define MIN_SPEED 0.0
#define NORM_SPEED 4.0
#define MAX_SPEED 6.0
#define MAX_LOOK 50
#define LOOK_ANGLE 70
#define DIST_ANGLE 90
#define CORR_FACT 0.7
#define FRANTIC 0.0
#define POS_RAND
#define OBL_START 1
#define DEG_TO_RAD(x) ((float)x)/180.0*3.14
#define RAD_TO_DEG(x) ((float)x)/3.14*180.0
#define RANDDIR (rand()%3-1)
#define L 0
#define R 1
#define U 2
#define D 3
 
#define DRAW 1
#define CANCEL 0
#define VERTICAL 1
#define HORIZONTAL 0
 
#define STEER_LEFT 1
#define STEER_RIGHT -1
#define STRAIGHT 0
 
#define CAMX 670
#define CAMY 120
#define MAPX 8
#define MAPY 113
 
#define FREE 0
#define STOP 1
#define CAR 2
 
/*data types*/
 
typedef struct car_d {
int number;
float xpos,ypos;
int xp,yp;
float dist_obs,dist_sem;
float speed,middle,front,rear,somma;
int angle,sat;
char collision,boom,correggi,incrocio;
char dir,running;
struct car_d *next;
} car_data;
 
typedef struct {
int x,y;
} point;
 
typedef struct {
char vpos,hpos,tl_name[8];
point l,r,u,d;
PID pid;
DWORD period;
} tl_data;
 
 
typedef struct {
int xpos,ypos,angles;
} starting_set;
/unsupported/tags/rel_0_5/simcity/include/misc.h
0,0 → 1,18
//*****************************misc.h************************************
// miscellaneous useful functions
#ifndef CST
#include "constant.h"
#endif
 
int my_rint(float);
void fill_table();
void tl_init();
void set_start_point();
int returnCarIndex(int);
int find_col(int,int);
int find_tl(int,int,int);
int allinea(int);
int module(int,int,int,int);
int normalize(int);
 
 
/unsupported/tags/rel_0_5/simcity/include/draw.h
0,0 → 1,14
//****************************draw.h*******************************
// drawing functions
#ifndef CST
#include "constant.h"
#endif
 
void drawSprites(int,int,char,char);
void drawStreet(int,int);
void get_images();
void drawCar(int,int,int,char);
void bold_rect(WORD,WORD,WORD,WORD,BYTE,BYTE,BYTE);
void draw_scenario();
void draw_tl(int x,int y,DWORD img[SH][SW]);
void drawFaces(int,int,short);
/unsupported/tags/rel_0_5/simcity/include/simcity.h
0,0 → 1,77
/********************************simcity.h***************************/
// global variables and tasks bodies declaration
 
#include <kernel/func.h>
#include <semaphore.h>
#ifndef CST
#include "constant.h"
#endif
 
/*Global stuff*/
 
extern car_data car_data_array[MAX_CAR];
extern tl_data tl_data_array[MAX_TL];
 
//car starting points
extern starting_set starting_set_array[S_POINT];
 
// PID vectors
extern PID p_table[MAX_CAR];
extern PID c_table[MAX_CAR];
extern PID g_table[MAX_CAR];
extern PID a_table[MAX_CAR];
 
extern char kill_flag[MAX_CAR];
//graphic mutex
extern sem_t mutex;
 
//kill_flag mutexes
extern sem_t kill_mutex[MAX_CAR];
 
//various sprites
extern DWORD macchine[ROW][COL][NCAR];
extern DWORD strada[H][W];
extern BYTE street[H*W*2];
extern BYTE vbuf[MAX_CAR][ROW*COL*2];
extern BYTE clrcam[(ROW+2)*(COL+2)*2];
extern BYTE gauge_img[ROW*COL*2];
extern BYTE brk_gauge[ROW*COL*2];
extern BYTE arrow[3][ROW*COL*2];
extern DWORD sprites[ROW][COL][NO_SPRITE];
extern BYTE clrscr[800*600*2];
extern DWORD faces[2][74][47];
 
extern char sens;
//sine & cosine look-up tables
extern float cosine[360],sine[360];
 
//traffic light sprites
extern DWORD y_sem[4][SH][SW];
extern DWORD r_sem[4][SH][SW];
extern DWORD g_sem[4][SH][SW];
 
//useful colors
extern DWORD white;
extern DWORD black;
extern DWORD red;
extern DWORD gray;
extern DWORD blue;
extern DWORD green;
extern DWORD border;
extern DWORD tl_bg;
 
//task chain pointers
extern car_data *free_n,*busy_n,*free_o,*busy_o;
// car counter
extern short maxc;
 
/*function declaration */
 
/* task bodies*/
TASK car(car_data *);
TASK traffic_light(tl_data *);
TASK camera(int);
TASK gauge_c(int);
TASK blink_arrow(int);
TASK refresher(void *);
TASK killer(void *);
/unsupported/tags/rel_0_5/simcity/include/states.h
0,0 → 1,21
enum stati {
NORM,
INC1,
DX1,
STR1,
STR2,
SX1,
SX2,
SX3
} ;
 
enum sprite_type {
EXPL,
GAUGE,
ARR_OFF,
ARR_SX,
ARR_DX,
VECCHINA,
V_SPLAT,
GAUGE_ROTTO
};
/unsupported/tags/rel_0_5/simcity/include/proc.h
0,0 → 1,23
//***************************proc.h******************************
// task management functions
#ifndef CST
#include "constant.h"
#endif
 
 
int add();
void del(int);
void init_struct();
int del_o();
void gauge_create(char *,int);
void arrow_create(char *,int);
void killer_create();
void ref_create();
void cam_create(char *,int);
void stl_create(char *,int);
void h_create(char *,int);
void s_create(char *,int);
void killing(int);
 
 
 
/unsupported/tags/rel_0_5/simcity/include/car.h
0,0 → 1,10
//*****************************car.h********************************
// car management functions
#ifndef CST
#include "constant.h"
#endif
 
char collision_sensor(car_data *);
int sensore(car_data *);
void ch_spd(car_data *,char);
 
/unsupported/tags/rel_0_5/simcity/include/keyfunct.h
0,0 → 1,10
/*******************************keyfunct.h****************************/
// keyboard handler functions
#include <drivers/keyb.h>
 
void h_car_create(KEY_EVT *);
void s_car_create(KEY_EVT *);
void h_car_kill(KEY_EVT *);
void endfun(KEY_EVT *);
void refresh(KEY_EVT *);
void sensor_switch(KEY_EVT *);
/unsupported/tags/rel_0_5/simcity/sem/green_l.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/red_r.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/yellow_r.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/red_d.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/yellow_d.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/red_u.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/yellow_u.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/green_r.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/green_d.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/green_u.raw
0,0 → 1,0
€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/red_l.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/sem/yellow_l.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€
/unsupported/tags/rel_0_5/simcity/initfile.c
0,0 → 1,106
//****************************initfile.c*******************************
#define PI
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
 
#ifndef PI
#include "modules/rrsoft.h"
#endif
 
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
#include <drivers/keyb.h>
 
//#include "ll/i386/x-dos.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
//#define RRTICK 10000
#define RRTICK 2000
 
 
void getCars(void);
void getRoad(void);
void getSem(void);
void getSprites(void);
void getFaces(void);
void tl_pos();
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
 
// RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
// RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
 
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
NOP_register_module();
 
getFaces();
getCars();
getRoad();
getSem();
getSprites();
tl_pos();
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
 
 
#ifdef PI
void app_mutex_init(mutex_t *m)
{
PI_mutexattr_t attr;
 
PI_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#else
void app_mutex_init(mutex_t *m)
{
NOP_mutexattr_t attr;
 
NOP_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
#endif
/unsupported/tags/rel_0_5/simcity/proc.c
0,0 → 1,393
#include <drivers/glib.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "include/simcity.h"
#include "include/misc.h"
#include "include/proc.h"
 
int add() {
if(maxc>0 && maxc<MAX_CAR-1) {
busy_n->next=free_o;
busy_n=free_o;
free_o=free_o->next;
busy_n->next=NULL;
}
if(maxc==0) {
busy_n=busy_o=free_o;
free_o=free_o->next;
busy_n->next=NULL;
}
if(maxc==MAX_CAR-1) {
busy_n->next=free_o;
busy_n=free_o;
free_o=free_n=NULL;
busy_n->next=NULL;
}
if(maxc<MAX_CAR) {
maxc++;
return(busy_n->number);
} else
return(-1);
}
 
void del(int num) {
car_data *d,*db;
 
db=d=busy_o;
if(maxc>1) {
while((d->number)!=num) {
db=d;
d=d->next;
}
if(d==busy_n) {
db->next=NULL;
busy_n=db;
} else if(d==busy_o) {
busy_o=busy_o->next;
} else {
db->next=d->next;
}
if(maxc!=MAX_CAR) {
free_n->next=d;
free_n=d;
free_n->next=NULL;
}
else {
free_n=free_o=d;
}
}
else {
free_n->next=d;
free_n=d;
free_n->next=NULL;
busy_n=busy_o=NULL;
}
maxc--;
}
 
void init_struct() {
int i;
 
free_o=&(car_data_array[0]);
free_n=&(car_data_array[MAX_CAR-1]);
busy_n=busy_o=NULL;
for(i=0;i<MAX_CAR;i++)
car_data_array[i].number=i;
for(i=0;i<MAX_CAR;i++) {
if(i<MAX_CAR-1)
car_data_array[i].next=&(car_data_array[i+1]);
else
car_data_array[i].next=NULL;
}
maxc=0;
}
 
int del_o() {
 
if(maxc<MAX_CAR && maxc>1) {
free_n->next=busy_o;
free_n=busy_o;
busy_o=busy_o->next;
free_n->next=NULL;
} else
if(maxc==MAX_CAR) {
free_n=free_o=busy_o;
busy_o=busy_o->next;
free_n->next=NULL;
} else
if(maxc==1) {
free_n->next=busy_o;
free_n=busy_o;
free_n->next=NULL;
busy_o=busy_n=NULL;
}
if(maxc>0) {
maxc--;
return(free_n->number);
} else
return -1;
}
 
void gauge_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) num;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,GAUGE_WCET);
soft_task_def_period(stm,PERIOD_CAR);
soft_task_def_usemath(stm);
pid = task_create(name, gauge_c, &stm, NULL);
if (pid == NIL) {
grx_close();
perror("stl_create():Could not create task <Gauge_c>");
sys_abort(1);
}
g_table[num]=pid;
task_activate(pid);
}
 
 
void arrow_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) num;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,ARROW_WCET);
soft_task_def_period(stm,PERIOD_CAR*4);
pid = task_create(name,blink_arrow, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("stl_create():Could not create task <arrow>");
sys_abort(1);
}
a_table[num]=pid;
task_activate(pid);
}
 
void killer_create() {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) 0;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,1000);
soft_task_def_period(stm,5*SECOND);
pid = task_create("killer", killer, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("ref_create():Could not create task <killer>");
sys_abort(1);
}
task_activate(pid);
}
 
 
void ref_create() {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) 0;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,3000);
soft_task_def_period(stm,4*SECOND);
pid = task_create("Refresher", refresher, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("ref_create():Could not create task <refresher>");
sys_abort(1);
}
task_activate(pid);
}
 
void cam_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) num;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,CAM_WCET);
soft_task_def_period(stm,PERIOD_CAR);
pid = task_create(name, camera, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("stl_create():Could not create task <Camera>");
sys_abort(1);
}
c_table[num]=pid;
task_activate(pid);
}
 
void stl_create(char *name,int num) {
void *par;
PID pid;
SOFT_TASK_MODEL stm;
 
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
strcpy(tl_data_array[num].tl_name,name);
par=(void *) &(tl_data_array[num]);
soft_task_def_arg(stm,par);
soft_task_def_met(stm,TL_WCET);
soft_task_def_period(stm,tl_data_array[num].period);
pid = task_create(name, traffic_light, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("stl_create():Could not create task <Traffic Light>");
sys_abort(1);
}
tl_data_array[num].pid=pid;
task_activate(pid);
}
 
void h_create(char *name,int num) {
void *par;
PID pid;
int start_point=0;
short flag=0;
HARD_TASK_MODEL htm;
car_data cd,*d;
 
#ifdef POS_RAND
start_point=rand()%S_POINT;
if(busy_o!=NULL)
do {
flag=0;
d=busy_o;
do {
if(d->number!=num)
if(module(starting_set_array[start_point].xpos,d->xp,starting_set_array[start_point].ypos,d->yp)<256) {
start_point=(start_point+1)%S_POINT;
flag=1;
break;
}
d=d->next;
} while(d!=NULL);
} while(flag);
#endif
#ifndef POS_RAND
start_point=OBL_START;
#endif
 
cd.number=num;
cd.xpos=cd.xp=starting_set_array[start_point].xpos;
cd.ypos=cd.yp=starting_set_array[start_point].ypos;
cd.angle=starting_set_array[start_point].angles;
cd.speed=MIN_SPEED;
cd.dist_obs=MAX_DIST;
cd.collision=cd.boom=cd.correggi=cd.somma=0;
cd.dir=STRAIGHT;
car_data_array[num]=cd;
hard_task_default_model(htm);
hard_task_def_ctrl_jet(htm);
par=(void *) &(car_data_array[num]);
hard_task_def_arg(htm,par);
hard_task_def_wcet(htm, CAR_WCET);
hard_task_def_mit(htm,PERIOD_CAR);
hard_task_def_usemath(htm);
pid = task_create(name, car, &htm, NULL);
if (pid == NULL) {
grx_close();
perror("h_create():Could not create task <hard car>");
sys_abort(1);
}
else {
p_table[num]=pid;
sem_wait(&(kill_mutex[num]));
kill_flag[num]=0;
car_data_array[num].running=1;
sem_post(&(kill_mutex[num]));
task_activate(pid);
}
}
 
void s_create(char *name,int num) {
void *par;
PID pid;
int start_point=0;
SOFT_TASK_MODEL stm;
car_data cd,*d;
short flag=0;
 
#ifdef POS_RAND
start_point=rand()%S_POINT;
if(busy_o!=NULL)
do {
flag=0;
d=busy_o;
do {
if(d->number!=num)
if(module(starting_set_array[start_point].xpos,d->xp,starting_set_array[start_point].ypos,d->yp)<256) {
start_point=(start_point+1)%S_POINT;
flag=1;
break;
}
d=d->next;
} while(d!=NULL);
} while(flag);
#endif
#ifndef POS_RAND
start_point=OBL_START;
#endif
 
cd.number=num;
cd.xpos=cd.xp=starting_set_array[start_point].xpos;
cd.ypos=cd.yp=starting_set_array[start_point].ypos;
cd.angle=starting_set_array[start_point].angles;
cd.speed=MIN_SPEED;
cd.dist_obs=MAX_DIST;
cd.collision=cd.boom=cd.correggi=cd.somma=0;
cd.dir=STRAIGHT;
car_data_array[num]=cd;
soft_task_default_model(stm);
soft_task_def_level(stm,1);
soft_task_def_ctrl_jet(stm);
par=(void *) &(car_data_array[num]);;
soft_task_def_arg(stm,par);
soft_task_def_met(stm,SCAR_WCET);
soft_task_def_period(stm,SPERIOD_CAR);
soft_task_def_usemath(stm);
pid = task_create(name, car, &stm, NULL);
if (pid == NULL) {
grx_close();
perror("h_create():Could not create task <soft car>");
sys_abort(1);
}
else {
p_table[num]=pid;
sem_wait(&(kill_mutex[num]));
kill_flag[num]=0;
car_data_array[num].running=1;
sem_post(&(kill_mutex[num]));
task_activate(pid);
}
}
 
void killing(int num) {
PID car_to_kill,cam_to_kill,gauge_to_kill,a_to_kill;
int c;
 
c=car_data_array[num].number*46;
car_to_kill=p_table[num];
cam_to_kill=c_table[num];
gauge_to_kill=g_table[num];
a_to_kill=a_table[num];
sem_wait(&(kill_mutex[num]));
kill_flag[num]=1;
car_data_array[num].running=0;
sem_post(&(kill_mutex[num]));
task_kill(car_to_kill);
task_kill(cam_to_kill);
task_kill(gauge_to_kill);
task_kill(a_to_kill);
sem_wait(&mutex);
grx_putimage(car_data_array[num].xp-15,car_data_array[num].yp-15,car_data_array[num].xp+14,car_data_array[num].yp+14,vbuf[car_data_array[num].number]);
grx_putimage(CAMX-1,CAMY-1+c,CAMX+30,CAMY+30+c,clrcam);
grx_putimage(CAMX+40-1,CAMY-1+c,CAMX+40+30,CAMY+c+30,clrcam);
grx_putimage(CAMX+80-1,CAMY-1+c,CAMX+80+30,CAMY+c+30,clrcam);
grx_text(" ",CAMX,CAMY+c+30,black,black);
sem_post(&mutex);
}
/unsupported/tags/rel_0_5/simcity/car.c
0,0 → 1,175
#include <drivers/glib.h>
#include <stdlib.h>
#include <math.h>
#include "include/simcity.h"
#include "include/misc.h"
#include "include/car.h"
#include "include/draw.h"
 
char collision_sensor(car_data *cd) {
float i,dx,dx1,dy,dy1,deltax,deltay;
int colore,colore1;
int speed_done=0;
char col=FREE;
 
dx=cd->xpos+2.0*cosine[normalize(cd->angle+90)];
dy=cd->ypos-2.0*sine[normalize(cd->angle+90)];
dx1=cd->xpos-8.0*cosine[normalize(cd->angle+90)];
dy1=cd->ypos+8.0*sine[normalize(cd->angle+90)];
 
for (i=0.0;i<MAX_LOOK;i+=0.1) {
deltax=i*cosine[normalize(cd->angle)];
deltay=i*sine[normalize(cd->angle)];
sem_wait(&mutex);
colore=grx_getpixel(my_rint(dx+deltax),my_rint(dy-deltay));
colore1=grx_getpixel(my_rint(dx1+deltax),my_rint(dy1-deltay));
sem_post(&mutex);
if (((colore==white)||(colore1==white) || ((colore==red)||(colore1==red)))) {
if((colore==white)||(colore1==white))
col=STOP;
else
col=CAR;
cd->dist_obs=i;
cd->collision=1;
speed_done=1;
}
if (!speed_done) {
if (sens) {
sem_wait(&mutex);
grx_plot(my_rint(dx+deltax),my_rint(dy-deltay),gray);
grx_plot(my_rint(dx1+deltax),my_rint(dy1-deltay),gray);
sem_post(&mutex);
}
}
}
if (!speed_done) {
cd->collision=0;
cd->dist_obs=MAX_LOOK;
}
return col;
}
 
int sensore(car_data *cd) {
int col_front,col_rear,col_middle;
int done_front=0,done_rear=0,done_middle=0;
float front,rear,middle,store_middle;
int angolo;
float i;
float x1,y1,x05,y05;
float xs,ys,xs1,ys1;
float coordx,coordy,distx,disty;
 
cd->front=cd->rear=cd->middle=front=rear=middle=store_middle=NORM_DIST;
x1=cd->xpos-10.0*cosine[normalize(cd->angle)]; // coordinata sensore dietro
y1=cd->ypos+10.0*sine[normalize(cd->angle)];
 
x05=cd->xpos-5.0*cosine[normalize(cd->angle)]; // coordinata sensore mezzo
y05=cd->ypos+5.0*sine[normalize(cd->angle)];
 
for (i=0.0;i<MAX_DIST;i+=0.1) {
coordx=i*cosine[normalize(cd->angle-LOOK_ANGLE)];
coordy=i*sine[normalize(cd->angle-LOOK_ANGLE)];
distx=i*cosine[normalize(cd->angle-DIST_ANGLE)];
disty=i*sine[normalize(cd->angle-DIST_ANGLE)];
col_front=grx_getpixel(my_rint(cd->xpos+coordx),my_rint(cd->ypos-coordy));
col_rear=grx_getpixel(my_rint(x1+coordx),my_rint(y1-coordy));
col_middle=grx_getpixel(my_rint(x05+distx),my_rint(y05-disty));
if ((col_front==border) && !done_front) {
done_front=1;
cd->front=front=i;
}
if ((col_middle==border) && !done_middle) {
done_middle=1;
middle=cd->middle=i;
}
if ((col_rear==border) && !done_rear) {
done_rear=1;
cd->rear=rear=i;
}
if (sens) {
sem_wait(&mutex);
if (!done_front) {
grx_plot(my_rint(cd->xpos+coordx),my_rint(cd->ypos-coordy),gray);
}
if (!done_rear) {
grx_plot(my_rint(x1+coordx),my_rint(y1-coordy),blue);
}
if (!done_middle) {
grx_plot(my_rint(x05+distx),my_rint(y05-disty),green);
}
sem_post(&mutex);
}
}
 
if (!done_front) {
front=cd->front=MAX_DIST;
}
if (!done_rear) {
rear=cd->rear=MAX_DIST;
}
if (!done_middle) {
cd->middle=middle=MAX_DIST;
}
xs=cd->xpos+front*cosine[normalize(cd->angle-LOOK_ANGLE)];
xs1=x1+rear*cosine[normalize(cd->angle-LOOK_ANGLE)];
ys=cd->ypos-front*sine[normalize(cd->angle-LOOK_ANGLE)];
ys1=y1-rear*sine[normalize(cd->angle-LOOK_ANGLE)];
if (xs==xs1) {
angolo=90;
} else {
angolo=my_rint(RAD_TO_DEG(atan((-ys1+ys)/(xs1-xs))));
}
 
if (angolo<0) angolo+=360;
if (angolo>=360) angolo-=360;
 
if ((ys-ys1<0) && (xs1-xs>0)) {
angolo-=180;
}
if ((ys-ys1>=0) && (xs1-xs>0)) {
angolo+=180;
}
 
if ((xs1-xs==0) && (ys-ys1>0)) {
angolo=270;
}
 
if (abs(middle-NORM_DIST)>FRANTIC) {
cd->correggi=1;
} else {
cd->somma=0;
cd->correggi=0;
}
 
if (cd->correggi) {
if (middle>NORM_DIST) {
cd->somma-=CORR_FACT;
}
if (middle<NORM_DIST) {
cd->somma+=CORR_FACT;
}
}
angolo+=cd->somma;
return angolo;
}
 
void ch_spd(car_data *cd,char ob_type) {
float set_spd=0.0;
float bf;
 
if(cd->collision) {
if(ob_type==STOP)
bf=0.001;
else
bf=0.7;
set_spd=cd->speed-(MAX_LOOK-cd->dist_obs)*bf;
if(set_spd<0)
set_spd=0;
}
else {
set_spd=cd->speed+0.4;
if(set_spd>MAX_SPEED)
set_spd=MAX_SPEED;
}
cd->speed=set_spd;
}
/unsupported/tags/rel_0_5/simcity/reading.c
0,0 → 1,237
/********************************************reading.c******************************/
#include <kernel/func.h>
#include <drivers/glib.h>
#include <ll/i386/x-dos.h>
#include <stdlib.h>
#include <string.h>
#include "include/constant.h"
#define rgb rgb16
 
DWORD macchine[ROW][COL][NCAR];
DWORD strada[H][W];
DWORD sprites[ROW][COL][NO_SPRITE];
DWORD y_sem[4][SH][SW];
DWORD r_sem[4][SH][SW];
DWORD g_sem[4][SH][SW];
DWORD faces[2][74][47];
extern tl_data tl_data_array[MAX_TL];
 
char nomefile[17];
char nomestrada[17];
char nomesem[17];
char nomesprite[16];
 
void getSem() {
int i,j,k,count;
BYTE colore[3];
DOS_FILE *fp;
char letter[5];
 
strcpy(letter,"lrud");
strcpy(nomesem,"sem/green_ .raw");
 
//green traffic light....
for(k=0;k<4;k++) {
nomesem[10]=letter[k];
fp=DOS_fopen(nomesem,"r");
if(!fp) {
perror(nomesem);
sys_abort(1);
}
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
count=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(count!=3) break;
g_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
 
//red traffic light...
strcpy(nomesem,"sem/red_ .raw");
for(k=0;k<4;k++) {
nomesem[8]=letter[k];
fp=DOS_fopen(nomesem,"r");
if(!fp) {
perror(nomesem);
sys_abort(1);
}
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
count=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(count!=3) break;
r_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
 
//yellow traffic light...
strcpy(nomesem,"sem/yellow_ .raw");
for(k=0;k<4;k++) {
nomesem[11]=letter[k];
fp=DOS_fopen(nomesem,"r");
if(!fp) {
perror(nomesem);
sys_abort(1);
}
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
count=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(count!=3) break;
y_sem[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
}
 
void getCars() {
int i,j,k,l,index;
int tmp;
char id_car[3];
BYTE colore[3];
DOS_FILE *fp;
 
strcpy(nomefile,"img/car_XXXn.raw");
k=0;
for (index=0;index<360;index+=15) {
tmp=index;
for (l=2;l>=0;l--) {
id_car[l]=tmp%10+'0';
tmp/=10;
}
nomefile[8]=id_car[0];
nomefile[9]=id_car[1];
nomefile[10]=id_car[2];
fp=DOS_fopen(nomefile,"r");
if (!fp) {
perror(nomefile);
sys_abort(1);
}
 
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
DOS_fread(&colore,sizeof(BYTE),3,fp);
macchine[i][j][k]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
k++;
}
}
 
void getRoad() {
DOS_FILE *fp;
int i,j,test;
BYTE colore[3];
 
strcpy(nomestrada,"img/street.raw");
fp=DOS_fopen(nomestrada,"r");
if (!fp) {
perror(nomestrada);
sys_abort(1);
}
 
for (i=0;i<H;i++) {
for (j=0;j<W;j++) {
test=DOS_fread(&colore,sizeof(BYTE),3,fp);
if(test!=3) {
perror("Few bytes read!!!!!!\n");
 
}
strada[i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
}
 
void getSprites(void) {
int i,j,k;
DOS_FILE *fp;
BYTE colore[3];
 
strcpy(nomesprite,"sprite/sp_X.raw");
for (k=0;k<NO_SPRITE;k++) {
nomesprite[10]=k+'0';
fp=DOS_fopen(nomesprite,"r");
if (!fp) {
perror(nomesprite);
sys_abort(1);
}
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
DOS_fread(&colore,sizeof(BYTE),3,fp);
sprites[i][j][k]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
}
 
void tl_pos(void) {
DOS_FILE *fp;
int i;
char buf[7];
int dimx,dimy;
 
fp=DOS_fopen("sem.raw","r");
if (!fp) {
perror("sem.raw");
sys_abort(1);
}
buf[6]='\0';
for (i=0;i<MAX_TL;i++) {
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].u.x=dimx;
tl_data_array[i].u.y=dimy;
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].d.x=dimx;
tl_data_array[i].d.y=dimy;
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].l.x=dimx;
tl_data_array[i].l.y=dimy;
DOS_fread(&buf,sizeof(char),6,fp);
dimx=(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
dimy=(buf[3]-'0')*100+(buf[4]-'0')*10+(buf[5]-'0');
tl_data_array[i].r.x=dimx;
tl_data_array[i].r.y=dimy;
}
DOS_fclose(fp);
}
 
void getFaces(void) {
int i,j,k;
DOS_FILE *fp;
BYTE colore[3];
 
strcpy(nomesprite,"img/bbX.raw");
for (k=0;k<2;k++) {
nomesprite[6]=k+'0';
fp=DOS_fopen(nomesprite,"r");
if (!fp) {
perror(nomesprite);
sys_abort(1);
}
for (i=0;i<74;i++) {
for (j=0;j<47;j++) {
DOS_fread(&colore,sizeof(BYTE),3,fp);
faces[k][i][j]=rgb(colore[0],colore[1],colore[2]);
}
}
DOS_fclose(fp);
fp=0;
}
}
/unsupported/tags/rel_0_5/simcity/simcity.c
0,0 → 1,154
/************************** Simcity ************************/
// Main,initialization functions and global variables allocation
#include <kernel/func.h>
#include <string.h>
#include <stdlib.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
#include <kernel/kern.h>
#include <semaphore.h>
#include <math.h>
#include "include/constant.h"
#include "include/misc.h"
#include "include/draw.h"
#include "include/proc.h"
#define rgb rgb16
 
/* graphic mutex... */
sem_t mutex;
//kill flag mutexes
sem_t kill_mutex[MAX_CAR];
 
// various sprites to use with grx_putimage()....
BYTE vbuf[MAX_CAR][ROW*COL*2];
BYTE clrscr[800*600*2];
BYTE clrcam[(ROW+2)*(COL+2)*2];
BYTE gauge_img[ROW*COL*2];
BYTE brk_gauge[ROW*COL*2];
BYTE arrow[3][ROW*COL*2];
BYTE street[H*W*2];
 
//task chain pointers
car_data *free_n,*free_o,*busy_n,*busy_o;
 
// various sprites to plot
extern DWORD macchine[ROW][COL][NCAR];
extern DWORD sprites[ROW][COL][NO_SPRITE];
extern DWORD strada[H][W];
 
//resolution to use
WORD r=600;
WORD c=800;
BYTE bpp=16;
 
// useful colors...
DWORD white;
DWORD black;
DWORD red;
DWORD gray;
DWORD blue;
DWORD green;
DWORD border;
DWORD tl_bg;
 
//PID vectors
 
PID p_table[MAX_CAR];
PID c_table[MAX_CAR];
PID g_table[MAX_CAR];
PID a_table[MAX_CAR];
 
char kill_flag[MAX_CAR];
float cosine[360],sine[360];
 
// data structures
car_data car_data_array[MAX_CAR];
tl_data tl_data_array[MAX_TL];
starting_set starting_set_array[S_POINT];
 
void keyb_h(void);
 
static void version( void )
{
cprintf("\n\nDemo presented by\n");
cprintf("Aguzzi Marco\n");
cprintf(" &\n");
cprintf("Ferrari Fabio\n");
}
 
void my_close(void *arg)
{
grx_close();
kern_printf("Shutting down SIMCITY\n");
}
 
int main(int argc, char **argv)
{
int i;
char tl_name[4];
 
version();
 
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
//resetting kill flags
for(i=0;i<MAX_CAR;i++) {
p_table[i]=0;
kill_flag[i]=0;
}
 
// graphic mode initialization
#ifdef GRAPH
if (grx_init() < 1) {
kern_printf("Error initializing graphics\n");
sys_abort(1);
}
if (grx_open(c,r,bpp) < 0) {
kern_printf("GRX Open Err\n");
sys_abort(1);
}
get_images();
#endif
srand(sys_gettime(NULL));
 
//init the graphic mutex
sem_init(&mutex,1,1);
//init kill flag mutexes
for(i=0;i<MAX_CAR;i++) sem_init(&(kill_mutex[i]),1,1);
//fill sine & cosine lookup tables
fill_table();
/*init keys*/
keyb_h();
set_start_point();
tl_init();
init_struct();
 
/* useful colors ... */
white = rgb(255,255,255);
black = rgb(0,0,0);
red = rgb(255,0,0);
gray = rgb(210,210,210);
blue = rgb(0,0,220);
green = rgb(0,255,0);
border= rgb(128,128,128);
tl_bg= rgb(0,128,0);
#ifdef GRAPH
/* paint scenario*/
draw_scenario();
#endif
#ifndef GRAPH
cprintf("Main: max_tl:%d\n",MAX_TL);
#endif
 
//creating refresher,killer and traffic light processes...
ref_create();
killer_create();
for(i=0;i<MAX_TL;i++) {
sprintf(tl_name,"tl%d",i+1);
#ifndef GRAPH
cprintf("main:tname=%s",tl_name);
#endif
stl_create(tl_name,i);
}
return 0;
}
/unsupported/tags/rel_0_5/simcity/sprite/sp_6.raw
0,0 → 1,23
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿ
ÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*
/unsupported/tags/rel_0_5/simcity/sprite/sp_7.raw
0,0 → 1,0
vtvÀÀÀÀÀÀÀÀÀÂÀÂÂÀÂÂÀÂÀÀÀ'&'œ›œ•—•{{€€{{~~||{{€€µ´µKLKÂÀ‰Š‰~~RNRMNMRNRNONPOPRORaba~~¦¥¦vtv'''ÀÀÀ~~tutRQRÞÝÞÞÝÞXYXÞÛÞÞÛÞ¢¤¢XYX{{™™™˜˜˜ŠŽŠ€}€jljikiÞÛÞXWXÙÛÙÞÛÞÜÛÜÚÝÚXYXÁ¿ÁRMR€€KLKÂÀŠbbb…‰…ÞÛÞÞÝÞÚÛÚÚÛڅƒ…±°±ÞÜÞÞÛÞÞÛÞÞßÞMNMtut¦¥¦vtvqtq¦£¦WXW¥¤¥…ƒ…°°°ÚÜÚÙÛÙÞÛÞXYXÜÛÜÚÛÚÙÛÙÙÛÙXWXÞÝÞiiijljÀ¾À'%''''ÀÀÀlklÀÁÀÞÛÞÞÜÞÙÛÙXWXÞÜÞXWX………±¯±ÙÛÙÞÛÞÜÝÜÚÛÚÞÛÞÞÞޅ‡…š™š–˜–—›—š—šÞÝÞXWXÙÛÙÚÝÚ¯®¯………ÚÛÚÜÛÜXYXÜÛÜÚÝÚÚÛÚÞÜÞ¬¯¬………¶µ¶µ´µKLKŒ]b]ÚÛÚÜÝÜÞÛÞÙÛÙ±®±ÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞ¢¤¢€€ONOKNK‚¥£¥ÞÝÞÙÛÙÞÛÞÞÛÞXYXÞÝÞÜÛÜÙÛÙÙÜÙÞÛÞXXXXYXÞÛÞÜÛÜsss¦¦¦§¦§xsx¥¤¥ÚÛÚÜÛÜÚÛÚÚÝÚÚÛÚÚÛÚÜÛÜÚÛÚÚÛÚÞÛÞ,+,ÚÛÚÜÛÜÙÜÙÞÛÞsvs~~vtv¦¥¦swsXYX…ƒ…,,,ÙÜÙÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÜÙÞÛÞÞÝÞÞÛÞÙÝÙÞÛހƒ€”’”lllqqqvtvjij¾ÂÞÛÞÞÝÞXWXÞÛÞÙÛÙÙÛÙÙÝÙÞÛÞÚÛÚÚÜÚÞÛÞÙÛÙÙÛÙXYX,,,ÞÜÞÞÜޅ‡…š™š%&%qqqlllÀÁÀÙÛمƒ…±±±ÙÛÙÞÛÞÙÝÙÚÝÚÜÛÜÙÛÙÞÛÞÙÛÙÙÛÙÞÛÞÞÜÞXWXXXXXYXÞÝÞÙÛمˆ…š—š%%%'''™™™ŠˆŠÞÝÞÞÛހƒ€,,,ÞÛÞÚÜÚÜÛÜÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÙÛÙXWX,+,ÚÛÚÜÛÜÞÛÞada‹‹‹&&&ššš…‡…ÜÛÜÚÛÚÞÝÞÞÛÞÙÜÙÞÛÞÚÛÚÚÛÚÜÛÜÞÛÞÙÛÙÜÝÜÚÛÚÞÛÞÚÝÚÜÛÜÞÜÞ]`]Žb`b………±¯±ÞÛÞÙÛÙÙÛÙÞÛÞÜÛÜÞÝÞÙÛÙÜÝÜÚÛÚÞÝÞÞÛÞÙÛÙÜÝÜÞÛÞÙÛÙXWX¥¦¥‚ONO‹Œ‹abaÞÜÞÜÛÜÚÛÚÞÛÞÜÝÜÙÜÙÜÛÜÚÛÚÞÛÞÙÛÙÞÛÞÙÛÙÙÛÙÞÝÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÙÛÙÜÛÜÚÛÚ¢¢¢ƒƒƒKLKONO‚¥£¥ÚÝÚÜÛÜÞÛÞÙÝÙÙÛÙÚÛÚÜÛÜÞÛÞÙÜÙÞÛÞÙÛÙÞÛÞÚÛÚÜÛÜÙÛÙÚÝÚÜÛÜXWX…ƒ…,,,ÞÝÞÞÜÞsss¦¦¦KLKƒƒƒ¢¤¢ÞÛÞ¬®¬XWXÜÛÜÙÝÙÜÛÜÚÝÚÞÛÞÙÛÙÞÛÞÜÛÜÙÜÙÞÛÞÙÛÙXWXÞÝÞXXXÙÜÙÞÛÞquq§£§ONO‚¥£¥ÙÛÙ±®±………XYXÞÛÞÙÝÙÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙXWX…ƒ…±±±ÞÛÞÙÛÙsss¦¨¦KLKƒƒƒ¢¢¢XWX±®±ÜÛÜÙÛÙÞÛÞÞÝÞÚÛÚÜÛÜÞÛÞÙÛÙÜÛÜÚÝÚÞÛÞÙÝÙÙÛÙXYXsts¦¥¦ONO‚MNMÞÜÞÚÛÚÜÛÜÙÜÙÞÛÞÜÛÜÚÝÚÜÝÜÙÛÙÞÛÞÜÛÜÚÜÚÞÜÞÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞ¢¤¢XVX§£§KLKŒbbb½¾½ÂÀ½¾½ÀÀÀ¾À¾Â¾Â½¾½¾¿¾ÀÀÀÀÀÀ¾¾¾Â¾Â½¾½¾À¾À¾À½À½Â¿Â½À½ÂÀ½¾½½À½Â¾Â½À½½À½’’xwx¢¨¢
/unsupported/tags/rel_0_5/simcity/sprite/sp_0.raw
0,0 → 1,0
ÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÀÀÀÿÿÿÀÀÀÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿ€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿ€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€
/unsupported/tags/rel_0_5/simcity/sprite/sp_1.raw
0,0 → 1,0
vtvÀÀÀÀÀÀÀÀÀÂÀÂÂÀÂÂÀÂÀÀÀ'&'œ›œ•—•{{€€{{~~||{{€€µ´µKLKÂÀ‰Š‰~~RNRMNMRNRNONPOPRORaba~~¦¥¦vtv'''ÀÀÀ~~tutRQRÞÝÞÞÛÞÞÝÞXYXÞÛÞÞÛÞ¢¤¢XYX{{™™™˜˜˜ŠŽŠ€}€jljikiÞÛÞXWXÞÝÞÙÛÙÞÛÞÜÛÜÚÝÚXYXÁ¿ÁRMR€€KLKÂÀŠbbb…‰…ÞÛÞÞÝÞÚÛÚÚÛÚÚÛڅƒ…±°±ÞÜÞÞÛÞÞÛÞÞßÞMNMtut¦¥¦vtvqtq¦£¦WXW¥¤¥…ƒ…°°°ÚÜÚÙÛÙÞÛÞÞÛÞXYXÜÛÜÚÛÚÙÛÙÙÛÙXWXÞÝÞiiijljÀ¾À'%''''ÀÀÀlklÀÁÀÞÛÞÞÜÞÙÛÙXWXÞÜÞÙÛÙXWX………±¯±ÙÛÙÞÛÞÜÝÜÚÛÚÞÛÞÞÞޅ‡…š™š–˜–—›—š—šÞÝÞXWXÙÛÙÚÝÚ¯®¯………ÚÛÚÜÛÜXWXXYXÜÛÜÚÝÚÚÛÚ*+*ÞÜÞ¬¯¬………¶µ¶µ´µKLKŒ]b]ÚÛÚÜÝÜÞÛÞÙÛÙ±®±ÞÛÞÙÛÙÞÜÞÞÛÞÙÛÙÞÛÞÙÛÙ,+,ÚÝÚÜÛÜÞÛÞ¢¤¢€€ONOKNK‚¥£¥ÞÝÞÙÛÙÙÛÙÞÛÞÞÛÞXYXÞÝÞÜÛÜÚÛÚÙÛÙÞÛÞÙÜÙÞÛÞXXXXYXÞÛÞÜÛÜÚÝÚÞÜÞsss¦¦¦§¦§xsx¥¤¥ÚÛÚÜÛÜÞÝÞÚÛÚÚÝÚÚÛÚÚÛÚÜÛÜÞÛÞÚÝÚÚÛÚÚÛÚÞÛÞ,+,ÚÛÚÜÛÜÙÜÙÞÛÞsvs~~vtv¦¥¦swsXYX…ƒ…,,,ÙÜÙÞÛÞÙÛÙÞÛÞÙÛÙÜÛÜÚÜÚÙÛÙÞÛÞÞÛÞÙÜÙÞÛÞÞÝÞÞÛÞÙÝÙÞÛހƒ€”’”lllqqqvtvjij¾ÂÞÛÞÞÝÞXWXÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÝÙÞÛÞÚÛÚÚÛÚÚÜÚÞÛÞÙÛÙÙÛÙXYX,,,ÞÜÞÞÜޅ‡…š™š%&%qqqlllÀÁÀÙÛمƒ…±±±ÙÛÙÞÛÞÙÝÙÞÛÞÚÝÚÜÛÜÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÞÜÞXWXXXXXYXÞÝÞÙÛمˆ…š—š%%%'''™™™ŠˆŠÞÝÞÞÛހƒ€,,,ÞÛÞÚÜÚÜÛÜÙÛÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÞÝÞÙÛÙÙÛÙXWX,+,ÚÛÚÜÛÜÞÛÞada‹‹‹&&&ššš…‡…ÜÛÜÚÛÚÞÝÞÞÛÞÙÜÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÞÛÞÙÛÙÜÝÜÚÛÚÚÛÚÜÛÜÞÛÞÚÝÚÜÛÜÞÜÞÙÛÙÞÛÞÞÛÞ]`]Žb`b………±¯±ÞÛÞÙÛÙÙÛÙÞÛÞÚÛÚÜÛÜÞÝÞÙÛÙÜÝÜÚÛÚÞÝÞÙÛÙÞÛÞÙÛÙÜÝÜÚÛÚÙÛÙÜÛÜÚÛÚÞÛÞÙÛÙXWX¥¦¥‚ONO‹Œ‹abaÞÜÞÜÛÜÚÛÚÞÛÞÜÝÜÚÛÚÙÜÙÜÛÜÚÛÚÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÝÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÙÛÙÜÛÜÚÛÚ¢¢¢ƒƒƒKLKONO‚¥£¥ÚÝÚÜÛÜÞÛÞÙÝÙÙÛÙÞÛÞÚÛÚÜÛÜÞÛÞÙÜÙÞÛÞÙÛÙÞÛÞÙÛÙÞÝÞÚÛÚÜÛÜÙÛÙÚÝÚÜÛÜXWX…ƒ…,,,ÞÝÞÞÜÞsss¦¦¦KLKƒƒƒ¢¤¢ÞÛÞ¬®¬XWXÜÛÜÚÛÚÙÝÙÜÛÜÚÝÚÞÛÞÙÛÙÞÛÞÚÝÚÜÛÜÙÜÙÞÛÞÜÛÜÚÛÚÞÛÞÙÛÙXWXÞÝÞXXXÙÜÙÞÛÞquq§£§ONO‚¥£¥ÙÛÙ±®±………XYXÞÛÞÙÝÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÙÛÙÞÛÞÜÛÜÚÛÚÚÛÚÜÛÜÙÛÙÚÛÚÜÛÜXWX…ƒ…±±±ÞÛÞÙÛÙsss¦¨¦KLKƒƒƒ¢¢¢XWX±®±XWXÙÛÙÞÛÞÚÛÚÜÛÜÙÛÙÞÛÞÙÛÙÞÝÞÚÛÚÜÛÜÞÛÞÙÛÙÜÛÜÚÝÚÞÛÞÙÝÙXWX…ƒ…,,,ÙÛÙXYXsts¦¥¦ONO‚MNMÞÝÞÙÛÙÞÜÞÚÛÚÜÛÜÙÜÙÞÛÞÜÛÜÚÝÚÚÛÚÜÝÜÙÛÙÞÛÞÜÛÜÚÜÚÞÜÞÙÛÙÞÛÞÙÛÙÞÛÞÞÛÞÙÝÙÞÛÞÞÛÞ¢¤¢XVX§£§KLKŒbbb½¾½ÂÀ½¾½ÀÀÀ¾À¾Â¾Â½¾½¾¿¾ÀÀÀÀÀÀ¾¾¾Â¾Â½¾½¾À¾À¾À½À½Â¿Â½À½ÂÀ½¾½½À½Â¾Â½À½½À½’’xwx¢¨¢
/unsupported/tags/rel_0_5/simcity/sprite/sp_2.raw
0,0 → 1,0
ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/unsupported/tags/rel_0_5/simcity/sprite/sp_3.raw
0,0 → 1,0
ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿ@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿ@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/unsupported/tags/rel_0_5/simcity/sprite/sp_4.raw
0,0 → 1,0
ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@ÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÿÿÿÿÿ@@@ÀÀÀÀÀÀ@@@@@@@@@@@@ÀÀÀÀÀÀ@@@@@@@@@ÿÿ@@@ÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ@@@@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀ@@@ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/unsupported/tags/rel_0_5/simcity/sprite/sp_5.raw
0,0 → 1,26
ÿÿÿÿ
ÿÿÿÿÿÿ
ÿÀÿÿÀÿÿÀÿÿÀÿ
ÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@
ÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*~*~*~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜÜÜÜ܀€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜ܀€€€€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*
@@@@@@
@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
/unsupported/tags/rel_0_5/simcity/tasks.c
0,0 → 1,409
//*******************************tasks.c************************************
// task bodies
#include <drivers/glib.h>
#include <stdlib.h>
#include <string.h>
#include <kernel/func.h>
#include <drivers/glib.h>
#include <semaphore.h>
#include <math.h>
#include "include/simcity.h"
#include "include/states.h"
#include "include/draw.h"
#include "include/misc.h"
#include "include/car.h"
#include "include/proc.h"
#define rgb rgb16
 
/*extern starting_set starting_set_array[S_POINT];
extern short maxc; */
 
TASK killer(void *arg) {
short i,j=0;
DWORD col[3];
char flag=0;
 
col[0]=red;
col[1]=green;
col[2]=white;
 
while(1) {
if(maxc>0) {
for(i=0;i<MAX_CAR;i++) {
sem_wait(&(kill_mutex[i]));
if(car_data_array[i].boom && car_data_array[i].running) flag=1;
else flag=0;
sem_post(&(kill_mutex[i]));
if(flag) {
del(i);
killing(i);
}
}
}
j=(j+1)%3;
sem_wait(&mutex);
grx_text("Killer active!",CAMX,CAMY+MAX_CAR*46,col[j],black);
sem_post(&mutex);
task_endcycle();
}
}
 
 
TASK refresher(void *arg) {
int i;
tl_data *d;
 
while(1) {
sem_wait(&mutex);
grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
for(i=0;i<MAX_TL;i++) {
d=&(tl_data_array[i]);
if((d->vpos=='g')) {
draw_tl(d->u.x,d->u.y,g_sem[U]);
draw_tl(d->d.x,d->d.y,g_sem[D]);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
} else if(d->vpos=='y') {
draw_tl(d->u.x,d->u.y,y_sem[U]);
draw_tl(d->d.x,d->d.y,y_sem[D]);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
} else if(d->hpos=='g') {
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
draw_tl(d->l.x,d->l.y,g_sem[L]);
draw_tl(d->r.x,d->r.y,g_sem[R]);
} else if(d->hpos=='y') {
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
draw_tl(d->l.x,d->l.y,y_sem[L]);
draw_tl(d->r.x,d->r.y,y_sem[R]);
}
}
sem_post(&mutex);
task_endcycle();
}
}
 
TASK blink_arrow(int number) {
char ld=0,prev=0,dir=0;
short c;
BYTE *arrow_img;
 
c=number*46;
while(1) {
if(kill_flag[number]) {
return 0;
}
if(!car_data_array[number].boom) {
dir=car_data_array[number].dir+1;
if(dir==prev) {
ld=(ld+1)%2;
if(ld==1)
arrow_img=arrow[(int)dir];
else
arrow_img=arrow[1];
 
sem_wait(&mutex);
grx_putimage(CAMX+80,CAMY-1+c,CAMX+80+29,CAMY-1+c+29,arrow_img);
sem_post(&mutex);
} else {
prev=dir;
ld=0;
sem_wait(&mutex);
grx_putimage(CAMX+80,CAMY-1+c,CAMX+80+29,CAMY-1+c+29,arrow[(int)dir]);
sem_post(&mutex);
}
}
task_endcycle();
}
}
 
 
TASK gauge_c(int number) {
int c;
float angle,ro;
int x,y;
char vel[5];
 
c=number*46;
while(1) {
if(kill_flag[number]) {
return 0;
}
if(!car_data_array[number].boom) {
angle=180.0*car_data_array[number].speed/MAX_SPEED;
sprintf(vel,"%.1f",car_data_array[number].speed);
ro=9.0;
y=my_rint(ro*sine[my_rint(angle)]);
x=my_rint(ro*cosine[my_rint(angle)]);
sem_wait(&mutex);
grx_putimage(CAMX,CAMY+c,CAMX+29,CAMY+29+c,gauge_img);
grx_line(CAMX+14,CAMY-1+c+25,CAMX+14-x,CAMY-1+c+25-y,blue);
grx_text(vel,CAMX,CAMY+c+30,white,black);
sem_post(&mutex);
} else {
sem_wait(&mutex);
grx_putimage(CAMX,CAMY+c,CAMX+29,CAMY+29+c,brk_gauge);
sem_post(&mutex);
}
task_endcycle();
}
}
 
TASK camera(int number) {
int c;
 
c=number*46;
grx_rect(CAMX+40-1,CAMY-1+c,CAMX+40+30,CAMY+30+c,green);
while(1) {
if(kill_flag[number]) {
return 0;
}
sem_wait(&mutex);
grx_putimage(CAMX+40,CAMY+c,CAMX+40+29,CAMY+c+29,vbuf[number]);
sem_post(&mutex);
task_endcycle();
}
}
 
TASK traffic_light(tl_data *d) {
char hpos,vpos,flag;
 
flag=0;
vpos=d->vpos;
if(vpos=='g') {
hpos='r';
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
draw_tl(d->u.x,d->u.y,g_sem[U]);
draw_tl(d->d.x,d->d.y,g_sem[D]);
sem_post(&mutex);
#endif
} else {
vpos='r';
hpos='g';
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,g_sem[L]);
draw_tl(d->r.x,d->r.y,g_sem[R]);
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
sem_post(&mutex);
#endif
}
task_endcycle();
while(1) {
if(vpos=='g') {
vpos='y';
flag=1;
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->u.x,d->u.y,y_sem[U]);
draw_tl(d->d.x,d->d.y,y_sem[D]);
sem_post(&mutex);
#endif
}
if((vpos=='y')&&(!flag)) {
vpos='r';
hpos='g';
flag=1;
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->u.x,d->u.y,r_sem[U]);
draw_tl(d->d.x,d->d.y,r_sem[D]);
draw_tl(d->l.x,d->l.y,g_sem[L]);
draw_tl(d->r.x,d->r.y,g_sem[R]);
sem_post(&mutex);
#endif
}
if((vpos=='r')&&(!flag)) {
if(hpos=='g') {
hpos='y';
flag=1;
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,y_sem[L]);
draw_tl(d->r.x,d->r.y,y_sem[R]);
sem_post(&mutex);
#endif
}
if((hpos=='y')&&(!flag)) {
hpos='r';
vpos='g';
#ifdef GRAPH
sem_wait(&mutex);
draw_tl(d->l.x,d->l.y,r_sem[L]);
draw_tl(d->r.x,d->r.y,r_sem[R]);
draw_tl(d->u.x,d->u.y,g_sem[U]);
draw_tl(d->d.x,d->d.y,g_sem[D]);
sem_post(&mutex);
#endif
}
}
flag=0;
d->vpos=vpos;
d->hpos=hpos;
#ifndef GRAPH
sem_wait(&mutex);
cprintf("semaforo %s: verticale:%c orizz.:%c\n",d->tl_name,vpos,hpos);
sem_post(&mutex);
#endif
task_endcycle();
}
}
 
TASK car(car_data *cd) {
char ob_type=FREE;
int start_point,sat_angle=0;
int tl=0;
short stato=NORM,dir_flag=0;
 
sem_wait(&(kill_mutex[cd->number]));
while(kill_flag[cd->number]){
cd->running=0;
sem_post(&(kill_mutex[cd->number]));
return 0;
}
sem_post(&(kill_mutex[cd->number]));
while(1) {
sem_wait(&(kill_mutex[cd->number]));
while(kill_flag[cd->number]){
cd->running=0;
sem_post(&(kill_mutex[cd->number]));
return 0;
}
sem_post(&(kill_mutex[cd->number]));
if(cd->xp>630||cd->yp>590||cd->xp<18||cd->yp<MAPY+3) {
start_point=rand()%S_POINT;
if(start_point==2)
start_point++;
cd->xpos=cd->xp=starting_set_array[start_point].xpos;
cd->ypos=cd->yp=starting_set_array[start_point].ypos;
cd->angle=starting_set_array[start_point].angles;
}
if (!cd->boom) {
// Control State Machine
if(stato==NORM) {
cd->dir=STRAIGHT;
ob_type=collision_sensor(cd);
ch_spd(cd,ob_type);
if(cd->dist_obs<30 && ob_type==STOP) {
stato=INC1;
}
if(ob_type==FREE || cd->dist_obs>=27 || cd->speed>=2.0) {
cd->angle=sensore(cd);
cd->angle=normalize(cd->angle);
}
}
if(stato==INC1) {
tl=find_tl(cd->angle,cd->xp,cd->yp);
if(!dir_flag)
cd->dir=rand()%3-1;
if(find_col(cd->angle,tl)=='g') {
switch(cd->dir) {
case STEER_RIGHT:
stato=DX1;
break;
case STRAIGHT:
case STEER_LEFT:
stato=STR1;
break;
default:
stato=DX1;
}
} else {
cd->speed=0.0;
dir_flag=1;
}
}
if(stato==DX1) {
dir_flag=0;
cd->speed=4.0;
cd->angle=sensore(cd);
if(ob_type!=STOP)
stato=NORM;
else {
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
}
}
if(stato==STR1) {
dir_flag=0;
cd->angle=allinea(cd->angle);
sensore(cd);
cd->speed=4.0;
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
if(cd->middle==MAX_DIST) {
if(cd->dir==STRAIGHT)
stato=STR2;
else {
sat_angle=cd->angle+90;
stato=SX1;
}
}
}
if(stato==STR2) {
cd->speed=4.0;
sensore(cd);
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
if(abs(cd->front-cd->rear)<0.1 && ((cd->middle-NORM_DIST)<7.0))
stato=NORM;
}
if(stato==SX1) {
cd->speed=4.0;
sensore(cd);
ob_type=collision_sensor(cd);
if(ob_type==CAR)
ch_spd(cd,ob_type);
else {
cd->angle+=7;
if(cd->angle>=sat_angle) {
cd->angle=sat_angle;
}
}
if(abs(cd->front-cd->rear)<0.1 && ((cd->middle-NORM_DIST)<7.0))
stato=NORM;
}
}
if (cd->dist_obs<COLL_DIST && ob_type==CAR) {
cd->boom=1;
cd->speed=0.0;
}
sem_wait(&mutex);
grx_getimage(cd->xp-15,cd->yp-15,cd->xp+14,cd->yp+14,vbuf[cd->number]);
if (cd->boom==0) {
drawCar(cd->xp,cd->yp,cd->angle,DRAW);
}
if (cd->boom==1) {
drawSprites(cd->xp,cd->yp,0,DRAW);
}
sem_post(&mutex);
task_endcycle();
sem_wait(&mutex);
if (cd->boom==0) {
grx_putimage(cd->xp-15,cd->yp-15,cd->xp+14,cd->yp+14,vbuf[cd->number]);
} else {
drawSprites(cd->xp,cd->yp,0,CANCEL);
}
sem_post(&mutex);
sem_wait(&(kill_mutex[cd->number]));
while(kill_flag[cd->number]){
cd->running=0;
sem_post(&(kill_mutex[cd->number]));
return 0;
}
sem_post(&(kill_mutex[cd->number]));
cd->xpos+=cd->speed*cos(DEG_TO_RAD(cd->angle));
cd->ypos-=cd->speed*sin(DEG_TO_RAD(cd->angle));
cd->xp=my_rint(cd->xpos);
cd->yp=my_rint(cd->ypos);
}
}
/unsupported/tags/rel_0_5/simcity/keyfunct.c
0,0 → 1,85
/**************** Functions called by keyboard handler*********/
#include <drivers/keyb.h>
#include <drivers/glib.h>
#include <drivers/glib.h>
#include <stdlib.h>
#include <string.h>
#include "include/simcity.h"
#include "include/proc.h"
 
short maxc=0;
char sens=0;
 
extern starting_set starting_set_array[S_POINT];
 
void h_car_create(KEY_EVT *k)
{
char name[10];
int num;
 
if((maxc<MAX_CAR)) {
num=add();
if(num>=0) {
sprintf(name,"car%d",num);
h_create(name,num);
sprintf(name,"camera%d",num);
cam_create(name,num);
sprintf(name,"speed%d",num);
gauge_create(name,num);
sprintf(name,"arrow%d",num);
arrow_create(name,num);
}
}
}
 
void s_car_create(KEY_EVT *k)
{
char name[10];
int num;
 
if((maxc<MAX_CAR)) {
num=add();
if(num>=0) {
sprintf(name,"car%d",num);
h_create(name,num);
sprintf(name,"camera%d",num);
cam_create(name,num);
sprintf(name,"speed%d",num);
gauge_create(name,num);
sprintf(name,"arrow%d",num);
arrow_create(name,num);
}
}
}
 
void h_car_kill(KEY_EVT *k) {
int num;
 
if(maxc>0) {
num=del_o();
if(num>=0) {
killing(num);
}
}
}
 
void endfun(KEY_EVT *k)
{
grx_close();
cprintf("Brk command pressed! Ending...\n");
sys_end();
}
 
void refresh(KEY_EVT *k){
 
sem_wait(&mutex);
//heavy and obsolete.....
//draw_scenario();
grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
sem_post(&mutex);
}
 
void sensor_switch(KEY_EVT *k) {
if(sens==0) sens=1;
else sens=0;
}
/unsupported/tags/rel_0_5/simcity/misc.c
0,0 → 1,215
#include <math.h>
#include "include/misc.h"
#include "include/simcity.h"
 
int my_rint(float num) {
return (int)floor(num+0.5);
}
 
void fill_table(void) {
int i;
for (i=0;i<360;i++) {
sine[i]=sin(DEG_TO_RAD(i));
cosine[i]=cos(DEG_TO_RAD(i));
}
}
 
void tl_init() {
//MAPX,MAPY
char col[2];
short i;
 
col[0]='r';
col[1]='g';
for(i=0;i<MAX_TL;i++) {
tl_data_array[i].vpos=col[i%2];
tl_data_array[i].period=(i+3)*SECOND;
tl_data_array[i].l.x+=MAPX;
tl_data_array[i].l.y+=MAPY;
tl_data_array[i].r.x+=MAPX;
tl_data_array[i].r.y+=MAPY;
tl_data_array[i].u.x+=MAPX;
tl_data_array[i].u.y+=MAPY;
tl_data_array[i].d.x+=MAPX;
tl_data_array[i].d.y+=MAPY;
}
}
 
void set_start_point() {
//MAPX,MAPY
starting_set_array[0].xpos=607+MAPX;
starting_set_array[0].ypos=20+MAPY;
starting_set_array[0].angles=180;
starting_set_array[1].xpos=12+MAPX;
starting_set_array[1].ypos=62+MAPY;
starting_set_array[1].angles=0;
starting_set_array[2].xpos=260+MAPX;
starting_set_array[2].ypos=460+MAPY;
starting_set_array[2].angles=90;
starting_set_array[3].xpos=605+MAPX;
starting_set_array[3].ypos=205+MAPY;
starting_set_array[3].angles=180;
}
 
int returnCarIndex(int a) {
int indice=-1;
int angle;
 
angle=normalize(a);
if (((angle>=0) && (angle<=8)) || ((angle>353) && (angle<360))) { // 0 (+8 ; -7)
indice=0;
}
if ((angle<=23) && (angle>8)) { // 15
indice=1;
}
if ((angle<=38) && (angle>23)) { // 30
indice=2;
}
if ((angle<=53) && (angle>38)) { // 45
indice=3;
}
if ((angle<=68) && (angle>53)) { // 60
indice=4;
}
if ((angle<=83) && (angle>68)) { // 75
indice=5;
}
if ((angle<=98) && (angle>83)) { // 90
indice=6;
}
if ((angle<=113) && (angle>98)) { // 105
indice=7;
}
if ((angle<=128) && (angle>113)) { // 120
indice=8;
}
if ((angle<=143) && (angle>128)) { // 135
indice=9;
}
if ((angle<=158) && (angle>143)) { // 150
indice=10;
}
if ((angle<=173) && (angle>158)) { // 165
indice=11;
}
if ((angle<=188) && (angle>173)) { // 180
indice=12;
}
if ((angle<=203) && (angle>188)) { // 195
indice=13;
}
if ((angle<=218) && (angle>203)) { // 210
indice=14;
}
if ((angle<=233) && (angle>218)) { // 225
indice=15;
}
if ((angle<=248) && (angle>233)) { // 240
indice=16;
}
if ((angle<=263) && (angle>248)) { // 255
indice=17;
}
if ((angle<=278) && (angle>263)) { // 270
indice=18;
}
if ((angle<=293) && (angle>278)) { // 285
indice=19;
}
if ((angle<=308) && (angle>293)) { // 300
indice=20;
}
if ((angle<=323) && (angle>308)) { // 315
indice=21;
}
if ((angle<=338) && (angle>323)) { // 330
indice=22;
}
if ((angle<=353) && (angle>338)) { // 345
indice=23;
}
if (angle==360) {
indice=0;
}
return indice;
}
 
int normalize(int angle) {
if(angle<0)
return ((angle+360));
if(angle>=360)
return ((angle-360));
return angle;
}
 
int module(int x1,int x2,int y1,int y2) {
int x,y;
 
x=x1-x2;
y=y1-y2;
x*=x;
y*=y;
return x+y;
}
 
int allinea(int angle) {
int old_angle;
 
old_angle=normalize(angle);
if(old_angle<45)
old_angle=0;
else if(old_angle<135)
old_angle=90;
else if(old_angle<225)
old_angle=180;
else
old_angle=270;
return old_angle;
}
 
int find_tl(int angle,int xp,int yp) {
int a,min_tl,old_min,mins,i;
 
a=allinea(angle);
min_tl=old_min=10000;
for(mins=i=0;i<MAX_TL;i++) {
switch(a) {
case 0:
min_tl=module( xp,tl_data_array[i].l.x, yp,tl_data_array[i].l.y);
break;
case 90:
min_tl=module( xp,tl_data_array[i].d.x, yp,tl_data_array[i].d.y);
break;
case 180:
min_tl=module( xp,tl_data_array[i].r.x, yp,tl_data_array[i].r.y);
break;
case 270:
min_tl=module( xp,tl_data_array[i].u.x, yp,tl_data_array[i].u.y);
break;
default:
break;
}
if(min_tl<old_min) {
old_min=min_tl;
mins=i;
}
}
return mins;
}
 
int find_col(int angle,int tl) {
int min_tl=0,a;
 
a=allinea(angle);
switch(a) {
case 0:
case 180:
min_tl=tl_data_array[tl].hpos;
break;
case 90:
case 270:
min_tl=tl_data_array[tl].vpos;
break;
}
return min_tl;
}
/unsupported/tags/rel_0_5/simcity/sem.raw
0,0 → 1,0
199146290278187261299163441142537285427269538166193318290431178423298324
/unsupported/tags/rel_0_5/simcity/img/car_000n.raw
0,0 → 1,0
€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿ€ÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿ€
/unsupported/tags/rel_0_5/simcity/img/Bb0.raw
0,0 → 1,0
ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBZ9Rc„ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJ9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBsZÿÞçÎçÎçÎçÎ99cJ)))ZޜçÎï΄Œ!!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1kBïÎçÎçÎçÎçÎçÎçÎïÎïÎçÎïÖçÎçÎÿÞçÎïÎïÎsc)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZJscçÎïÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎïÖïÎïÎçÎçÎçÎçÎçÎÿÞïÎ{„ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ZRçÎçÎçÎçÎçÆçÆçÎçÆçÆçÎ÷ÖïÎçÎïÎïÖïÎçÎçÎçÎçÎïÎçÎçÎçÎïČÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)9B)!sZïÎçÎ÷ÖïÖçÎçÎçÆçÎçÆçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎïÖ9c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!1­”çÎçÎçÎïÎçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÆçÆçÎçÎçÎçÆïÎçÆçÎïÎçÎçÎçÎçÎçÎJBkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{kïÎçÎçÎïÎçÆçÆçÎçÆçÆçÎçÆçÎïÎçÎçÆçÎçÎçÎçÎïÎçÎçÆçÎçÎçÆçÎçÎçÎïÎçÎçÎïÎksÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎRZkÿÞçÎçÎçÆçÎçÎçÎçÆçÎçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçÎçÆçÎçÎïÎçÎçÎçÆïÎçÎçÎçÎçÎçÎçέµRRZkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎçÎçÆçÆçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆïÎçÎçÎçÎïÎçÎçÎçÎçÎçÎïÎçÆçÎçÎïք{!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ19ZïÎïÎçÎçÆçÆçÆçÎçÎçÆçÆçÆçÆçÎçÎçÆçÎçÎçÆçÎçÎçÎïÎçÎçÎçÎçÎçÎçÆçÎçÎçÆïÎçÎçÎçÎçÆçÆçÎçÎ1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎçÎçÆçÆçÆçÆçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçÎçÎïÎçÎçÎçÎçÎïÎçÆïÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎ99ÆÆÎÆÆÎÆÆÎÆÆÎ99BçÎçÎçÎçÆçÆÞ½çÎçÎçÎçÎçÆçÎçÎçÆçÎçÎçÎçÎïÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆïÎçÆçÎçÎçÎïÎçÎçÎïÎçÎ1ÆÆÎÆÆÎÆÆÎÆÆÎ9çÎçÎçÎçÆçÆçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÆïÎçÎïÎçÎçÎïÎçÎçÎçÆçÎïÎçÎçÎçÎçÆçÆçÎçÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ)ïÎçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÆçÎïÎçÎçÎçÆçÎçÎçÎïÎçÆçÎçÎ19ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{JçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎïÎçÆçÎïÎçÆçÎïÎçÆçÎçÆïÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎïÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎsZçÎçÎçÎçÎçÆçÆçÎçÆçÎçÎçÆçÎçÎçÆçÎçÎçÎçÎçÆïÎçÎçÎçÆçÎçÎçÎçÎçÎçÆçÎçÎçÎçÎçÎçÎçÎçÎçÎçέ”ÆÆÎÆÆÎÆÆÎÆÆε„ïÎçÎïÎçÆçÆçÎçÎçÎçÆçÎçÎçÎçÎçÆçÎçÆçÎçÎçÆçÆçÆçÎçÎçÎçÎçÎçÎçÆçÎçÆçÎçÎçÎçÎçÆçÎïÎçÎçÎçÎZRÆÆÎÆÆÎÆÆÎÆÆΜsçÎçÎçÎçÆçÆçÎçÎçÎçÎïÎçÆçÎçÎçÎïÎçÆçÎçÎçÆçÎïÎçÆçÆçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎïÎçÎçÎçÎçÎRÆÆÎÆÆÎÆÆÎJZB¥{çÎçÎçÆçÆçÆçÆçÆçÆçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçÆçÎçÎçÎçÎçÆçÎçÆçÎçÎçÎçÆçÆçÎïÎïÖçÎçÎçÎïÎçÎ¥ÞÆÆÎÆÆÎÆÆÎ¥„çÎçÎçÆçÆçÆçÎçÎçÎçÆçÆçÆçÎçÎçÆçÎçÆçÆçÎçÎçÆïÎçÆïÎçÎïÎçÎçÆçÆçÎçÆçÆïÎïÖÞÎçÎçÎïÎçÎçÎBJBkÆÆÎÆÆÎÆÆÎZskçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎçÎçÎçÆçÎçÎçÎïÎ÷ÖçÎçÎçÎçÎçÎçÎçÎçÎçÎçÆçÆçÆçÎçέ”ZJÞÎ÷ÖÿÞçÎBÆÆÎÆÆÎÆÆÎÆÆÎ!!JïÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÆçÎçÎçÎçÆçÎçÎïÎÿÞçƽ¥çÎÆÆçÎçÎçÎïÎçÎçÎÆÆ1ïÎçÎçÎ1c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎsZçÎçÎçÆçÆÞ½çÎçÆçÎçÎçÎçÎçÆçÆçÎçÎçÎïÎçČïÿ„ŒŒsïÎçÎ{JçÎçÎÆÆÿÞçÆç΄ŒÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ{kçÎçÎçÆçÆçÆÞÎçÎçÆÞÎÞ½çÎçÎçÎçÆçÎçÆçÎçÎkBïÿRsçÎ{„1sçÎçÎÆÆÞ½çÎçÎçÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎkBçÎçÎçÆÞ½çÆçÆçÎÞÎÞ½çÎçÎçÆçÎçÎçÆçÎç΄Œ1çÎïÖks„ŒçÎ{„)çÎçÎçΌsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΜsçÎçÎçÆçÆçÎÞÎçÆçÆçÎçÎçÆçÎçÆçÎçÎçÎRs!!{9J„kZk1JŒZJ!!1sc!sc!199BŒsZBk1J¥ŒÿZRZ9ZskÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΔkçÎçÎçÎçÆçÆçÆçÎçÆçÎçÆçÎçÎçÆçÎçÎ1ƄZç¥Rç¥Zç¥Zç¥Zï¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥R­ŒsZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ¥{çÎçÆçÎçÆÞ½çÆÞ½çÎÞÎçÎçÆïÎçÎçÎ)֔Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Zç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆν¥ïÎÞ½çÎçÆçÆÞÎçÎçÎçÆçÆçÆçÎçÎ11ƄZç¥Zç¥Zç¥Jï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1”kçÎÞ½çÎçÆçÆçÆçÎçÎÞ½çÆïÎÆÆsç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥R֔ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎޜçÎçÆçÎçÆÞ½ÞÎÞÎçÎçÎçÆçÎÞ½œcBç¥Zç¥Rç¥Rï¥Zç¥Zï¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆέ”çÎÞ½çÎçÆçÎçÆçÎÞ½çÆçÆçÎçÎç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥R”{BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïÎÞ½çÎçÆÞ½çÎÞÎçÎçÎçÆçÎïÎç¥Zç¥Rç¥Rï¥Rç¥Rç¥Rç­Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥ZƔBBkZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÆçÎçÎÞÎçÆÞ½çÎçÎçΌJ1ï¥Zç¥Rç¥Rç¥Rç¥Rç¥Zï¥Rç¥Zç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΌsçÎçÆçÎçÆçÆÞ½çÎçÎçÆçÆçÎç΄cBç¥Rï¥Jç¥Rç¥Zç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZRçÎÞ½çÆçÆÞ½çÎÞ½ÞÎçÆçÎçÎçÎç¥Rï¥Rç¥Jï¥Rï¥Zç¥Rç¥Rç¥Rç¥Zï¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥RZJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎÞ½çÆÞ½çÎçÎçÎçÆçÎçÎçÎ֔Zï¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rï¥ZJ1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïÎçÎÞ½çÆçÆÞÎÞ½ÞÎÞ½ïÎçÎçνsBï¥Rç¥Rï¥Rç¥Zk9¥{1ç¥Zï¥Rç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆçÆçÆçÎçÎçÆÞÎçÆçÎçεk9ç¥Zç¥Rï¥Rï¥Rç¥R­ŒJsZ)֔Jï¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Z¥{BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆÞ½çÆÞÎÞ½çÎçÆçÆçÎçνsBç¥Rç¥Rç¥Rç¥Rï¥Rï¥Z­ŒJ!!½„1ÿ­Rï¥Zç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥RkRB9ckÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΌsçÎÞ½çÆçÆçÆçÎçÆçÆïÎçÎçΜcBç¥Zç¥Rç¥Rç¥Rç¥Rï¥Rÿ­R”{B1)Œc)ç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥ZkJ!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÆçÆÞ½Þ½çÎçÆçÎçÎçÎcç¥Zï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Rï¥ZBkZ)ƄZç¥Jç¥Rç¥Zç¥Rç¥Rç¥Rç¥RRBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÆçÆçÎçÎçÎçÎçÎçÎkç¥Zï¥Rç¥Rç¥Jç¥Rç¥Rç¥Jï¥Rç¥Rç¥Z”{B1!RB!ç¥Rç¥Zç¥Rç¥Zç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎŒsçÎçÎçÆçÎçÎçÎ1¥µŒ!ïÎ{1)ï¥Jç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥R„cBŒc!֔Jç¥Rç¥Rï¥RccJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)kBçÎçÎçÆçÎçÎïÎZJ„JJÿ1)BƄZï¥Rç¥Rç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Jç¥Rç¥R”{B1)œs)ï¥RŒ„s19RJJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9ïÎçÎçÆçÎçÎ)BJ9RJBkRJJ1„cBï¥Jï¥Jç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥R­ŒJ¥kÿœ9ç¥Rç¥Rç¥Z”„R¥{BBB!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZZkçÎçÎçÎçÎçÎ9)kRBç¥Rç¥Rç¥Rï¥Rç¥Rç¥Rç¥Rç¥Zç¥Zç¥Rï¥Zï¥R­ŒJcœÿÿœ9ç¥Rç¥Rï¥Zç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎçÎçÎB)kRBç¥Rç¥Rç¥Rç¥Rç¥Rç¥Jç¥Rç¥Zç¥Zç¥Rç¥Rç¥Rï¥Zï¥Z”k9œœ„ÿÿÿµÖÿΌBç¥Rç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ÷½çÎïÎçÎcï¥Zç¥Rç¥Zï¥Rç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zï¥Rï¥R½„1ZskBkŒkcZççÖÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎ1))ç¥Rï¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rï¥R֔J)!ZskœµÖÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎçÎï¥Z1J)ç¥Rï¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zï¥Zç¥Zï¥Zç¥Rç¥Rï¥Rï¥Z­ŒJ„cBµ”cŒ„s)111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçÎçÎ1ç¥Zç¥Rç¥Zç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Jï¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rï¥Zç¥Rç¥ZRJJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBkŒkBçÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Rï¥Rç¥Rç¥Rç¥Rï¥Zç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rï¥Rç¥Rç¥Rç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBZRç¥Zç¥Rç¥Jç¥Rç¥Rï¥Rç¥Rç¥R֔Jç¥Rç¥Jç¥Rç¥Rç¥Zç¥Zç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥R!!1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Jï¥Zks9!!RZ1¥{Bç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥J„c!J!9sZ)ç¥Zç¥ZŒsZ)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZskç¥Rç¥Zç¥Rç¥Rç¥Jï¥Zç¥ZsZ)”„RcJ)ç¥Zç¥Rç¥Rç¥Rç¥Zç¥Rç¥ZŒc!ccJBB!ç¥Rç¥Z„cBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Jç¥Rç¥Rï¥Zç¥R­ŒJç¥Rks9ÿœ9ç¥Rç¥Rç¥Rç¥Zç¥R֔JB!ï¥Z1111!֔Jç¥Rç¥Z1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Z)„R)ï¥Zï¥Jÿœ9ÿ­Rÿ­Rï¥R{c1cJ){c1µ”cŒsZ{c1΄9ç¥ZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Zç¥Rç¥RkRBJZZÞï÷sZ)”{B”s1΄!ÿ­Rÿœ9ï¥Rµ„BƜcµ”c19!!1µŒ!µ„BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥Rï¥Z֔JJZBZsksµÿ19ÿÿÿœœ„œs½„1ÿµRÿµRÿµR)ÆÆÎÆÆÎ1!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Zç¥Jç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rï¥Z­ŒZ)BB1ÿÿÿ„ÿÿ1ÿÿÿ­ŒZç¥Zç¥Z99ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ç¥Rç¥Rç¥Rç¥R֔Jç¥Zç¥Rç¥Zç¥Zç¥Rç¥Rç¥Z”„R)))!!!Œ½ÆJZB”„R„sJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Z֔Z1BB!1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!ç¥Rç¥Zç¥Rç¥Jç¥Jç¥Zç¥Zç¥Zç¥Rç¥Rç¥Zç¥Rç¥Rç¥Rç¥Rç¥Z­ŒJkRB1)11!!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9ç¥Zç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥R„{RBJRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Rç¥Zç¥Zç¥Zç¥Zç¥Zç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Zç¥Rç¥R­ŒZ111JZZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1)Z9ç¥Zç¥Rç¥Rç¥Z֔Zç¥Rç¥Rç¥Zç¥Rç¥Zç¥Rç¥Zç¥Zç¥Rç¥Rï¥Jï¥Rç¥Rç¥Rç¥Zç¥Rç¥Rç¥Z„kZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥Zç¥Jç¥Rç¥Zç¥Rç¥Rç¥R„c!BB!ÆÆÎ){Jç¥Rç¥Zç¥Rç­Zï¥Zç¥Rç¥Rç¥R¥s!ccZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Rç¥Jç¥Rç¥Rç¥Rç¥ZsZ)))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBRZcJ)µ„Bç¥Rç¥Rç¥Zï¥Zç¥RskBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Rç¥Rç¥Zï¥Rç¥Rç¥Rç¥Rœs)ZskÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΔk9ï¥Rç¥Zµ”c1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBç¥Rç¥Rç¥Rç¥Rç¥Zç¥RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ΄9÷Œ)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎç¥Zç¥Rç¥RkBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎBJRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ
/unsupported/tags/rel_0_5/simcity/img/bb1.raw
0,0 → 1,0
ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZcc!)!911))111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ111J))91)Z))J)9))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJJ)19!9!)Z)c19)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)JJ)c1)))!91)!!)91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9)J)1c1B1Z!J191)91))J))!!ZZZkcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)9!)c1J)J)c1B1)!!91)!)9)))9)J11)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9JB))J)Z)9)9))!J!9))))91)9)kcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJ)1)1)J1Z)))J1)B1))91)!)91!!9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)1))1))9))!!J911))))1)J)!!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJ)))1)J)1)!!J))B191)1)!!9!)!cZBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1JJ)k1B1)!9!9)JJ!))9))9!9)!!)!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJ9)9)Z)))J!9)1B1))1)9!)J!)!!!RB9ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1)J!J)1)Z)Z)))9!J11J)9!J!)9!Z)Z))Z)Z)B1)1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9!Z)))!9!)))))!J)919)J!!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)B11)J19!J)B1Z)c1)91)91)J9J))!!9))1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)19)J1J)J)!)J19)J9911)91)911)9)J)9!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))9!9)9))!J)c1))9)91911))J!)9)Jk1Z)9!!!!)!ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)))!J!9)9))ZB1))J1))91!!))))ç­Bï­B)))sB9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)))9!)B1J!k1)J9J))))B19!)9!ç­Bç­Bç­Bç­Bç­Bç­Bç­BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)))sBc1sB1)­k!­c)1J1)B1))ç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­B1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)!)1)9!c1))ïœç­Bç­B)))J9)ç­Bç­Bç­Bç­J÷­Jç­Bç­Bç­Jç­B„RkcZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))çœ!ïœçœ!ç­Bç­Bç­Bÿ¥9))))))ç­Bç­Bç­Jç­Bï­Bç­JçµZç­Bç­Bç­Jç­B1B91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎB1k1ïœçœ!çœ!ç­Bç­Bï­Bç­Bç­Bç­B)))J9)ç­Bç­Bç­Bç¥9ç­Bç­Bç­Rïµkç­Bç­Bç­Bç­J))ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎk1„Bçœ!ïœçœ!ç­Bç¥9ç¥9ç­Jç­Bç­Bç¥9ޔ!”c!„Rç­Jç­Bç­Bç­Bç¥9ç­Bç­Bç­Rç­Rïµsïµsç­Bç­B)!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ))΄çœ!çœ!ç­Bç¥9ç­Bç­Bç­Bç­Bç­Bç­Bï­Bç¥9Þ­Jï­Bï­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Rïµkïµkïµsç­BZBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ï¥)ç¥9ç­Bç¥9ç­Bç­Jç­Bç­Bç¥9ç­Jç­Bï­Bç¥9ç­Bç­Jç­Bç­Bç­Jç­Bç­Bç­RçµZçµZçµsïµkïµkç­BÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœï¥)ç¥9ç­Bç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Bç­Bç­Jç­Jç­Bç­JçµZÞ­cïµkïµkïµsïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!çœ1çœ1ç¥9ç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Bç­Bç­Bç­Jç­JçµZÞ­cïµsïµkïµkïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!çœ1ç¥9ç­Bç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Jç¥9ç¥9ç­Jç­Bç­Jç­Jç­Bç­Bç­Jç­Rç­RïµkçµZçµsïµkïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ï¥)ç¥)çœ1ç­Bç­Bç­Bç­Jç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Bç­Jç­Jç­Jç­Jç­Rç­Jç­RçµZïµkïµsïµkïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!÷œ!çœ1ç¥9ç­Bç­Bç­Bç­Bç¥9ç­Jç­Jç­Jç­Bï­Bç­Bç­Bç­Bç­Jç­Bç­Jç­Rç­JçµZçµZçµZÞ­cïµkïµkïµk!)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœçœ1çœ1ç¥9ç¥9ç­Bç­Bç­J½œJ­Œ1ç­Bç­Jï­Bç­Bç­Bç­Bç­Bç­Jç­JÞ­J­”Rœ„B­ŒRÞ­cïµkïµkçµsïµk1)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœç¥)çœ1ç­Bç­Bç­Bï­Bç­Js1Ö¥Bç­Bç­Bç­Jç­Rç­Jç­B½œJΜRï½kçµZïµkïµs)1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç¥)ç¥9ç­Bç­Jç­Bç­JÿÖRÿÿcç¥9ç­Bç­Jïµkç­RÞ­J„„B1kBJkB”kBÿÆcçµZÞ­kçµZïµsïµkB91ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ1ç¥9ç­Bç­Bç¥9ÿ½JJ{B!ZB)c1ç¥9ç­Bç­RçµZç­RçµZ¥”B19!)çµZçµZïµkçµZÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!ç¥)ç¥9ç­Bç­Bç­Bÿ½J„BB1÷­Jç­Bç­RεkB1çµZµ”Bµ{JçµZçµZçµZÞ­kçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç¥)ç¥9ç­Bç­Bç­Bç­Bÿ½J½œJsB)ï­Bç­Jç­J­­kçµZçµZçµZçµZÞ­kçµZïµkï½kçµZçµZïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1ksçœ!ïœç¥)ç¥9ç­Bç­Bç­Jç­Jï­Bÿ½Jÿ½Jÿ½Jç­Bç­Bï­Bµ­{9çµZçµZç­RçµZçµZçµZÞ­cÞ­kÞ­cçµZïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ1ç¥9ç¥9ç­Bç­Jç­Jç­Bï­Bï­Bç­Bç­Bç­J½­sJJçµZçµZç­Rç­RçµZçµZï½kçµsçµZçµZçµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ)çœ!çœ!ïœç¥)ç¥9ç­Jç­Jç­Bç­Bç­J÷­Jç­Jç­Jç­Bç­BÞ­ccZc!9çµZç­RçµZçµZÞ­cïµkçµsÞ­cçµZïµsÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœç¥)ç¥9ç­Bç­Jç­Bÿ½JÖ¥B))çµZç­Jç­Bç­Bç­R½­s„„B1)­ŒRçµZçµZÞ­kçµZçµZçµZïµkÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ޔޔ!Þ¥1ç¥9ç­B÷­JΜRœs1çµZçµZçµZçµZçµZçµZçµZçµZ{ŒJçµZÞ­cï½kçµZçµZçµZJkBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJRsçœ!ÿ”çœ!ïœçœ1ç¥9ç¥9ÿ½J„Bç­RçµZçµZÞ­cçµZçµZs„cçµZçµZÞ­kÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJïœçœ!ïœç¥)Þ¥1ç¥9ÿ½J„BçµZçµZçµZœœk!ZBçµZçµZçµsçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎR{{çœ!ïœޔ!çœ1ç¥9ç­J½œJµ”BŒc1÷­c)1Þ­kçµZçµZJJ”B)çµZçµZçµZçµZçµZïµkçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœçœ!ç¥)Þ¥1ç­Bï­Bÿ½Jÿ½JÿÖR{9R!çµZµÞ­÷­JçµZçµZïµkÞ­cçµsçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!ïœç¥)ç¥9ç¥9ç­Bç­BÞ¥B÷­J¥”BÿÞ¥„ZïµkçµZçµZçµZçµZï½kÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1„Bçœ!ïœޔ!ç¥9Þ¥Bç­BÞ¥Bç­Bï­BÞ­Jc)9B)1÷­JçµZçµZÞ­cïµkïµkçµsçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœï¥)çœ1ç¥9ç­Bç­Jç­Bç­BçµZçµZçµZçµZçµZçµZçµZçµZÞ­cÞ­cçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ!ç¥9ç¥9ç¥9ç¥9ç¥9çµZçµZçµZçµZçµZçµZçµZçµZï½kçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!c„kç¥9ç¥9ç¥9ç¥9ç¥9¥{B1B!ksZcJ1çµZçµZçµZÞ­cçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ)ccïœçœ!½{!ç¥9ç¥9ç¥9¥”Bç¥9k{„s)Œc1çµZçµZï½kÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ1çœ!„Rÿ”ç¥9Ö¥B­”RkZBB1cBc9Jÿÿÿ9BR„cB9RZ{JJ„sBçµZÞ­cÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ9sBBJÿ”Ɣ11Zœ99)1{!)11J„9çµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!!9{R½sÿ”ÿ¥9µ”B­”RŒs9cJ1­”RçµZçµZΜRÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎk1çœ!ÿ”ÿ”ÿ¥9ÿ¥9ÿ¥9„„B)J1ZZ)BR)1))J1ZZ)ïµkçµZçµZï½k„sBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ÿ”ÿ”çœ1ï­Bÿ¥9ÿ½J¥”BŒs9sc)kk9„sB½œJçµZçµZÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!)ZœJÿ”ÿ”ï¥)ÿ¥9ï­B÷­J÷­J÷­Jÿ¥9÷­JçµZÿ½kÿ½kçµZçµZÞ­cÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ÿ”çœ!ç¥9ï­B÷­JçµZ÷­J÷­c÷­Jÿ½k÷Æ{÷Æ{ïµsÞ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœïœç¥9c)Œs9ïµsÞ­cÞ­cïµkïք­­k”„ZïµsçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ!)Zsÿ”çœ!ï¥)ZŒ9µ{Jç½{Þ­cçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ç­Bç¥9ç¥9ç¥9çµZçµZçµZïµkçµZçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!çœ!ïœç¥9ç­Jç­Jç­RçµZçµZÞ­kÞµsçµZçµZÞ­c1cBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJRskïœçœ!Þ¥1ç¥9Þ¥BÞ¥Bç­RÞ­cÞ­cïµkÞµsÞµsÞ­c­”RÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!Þ¥1Þ¥1Þ¥BÞ­Jç­RçµZÞ­cÞ­kçµsÞµsçµZ­ŒR)J1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆΜJÿ”Þ”!ޔ!ç¥9ç­Rç­RçµZÞ­kÞ­kçµsÞµsçµZ”„Z111ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎJJJJÿ”Þ”Þ¥1Þ¥BÞ­Jç­RΜRïµkÞ­kÞµsç½{çµZŒc1ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ޔ!ç¥9Ö¥BÞ­cÞ­cçµZïµkçµsç½{çµZ”kBÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!ïœޔ!çœ!Þ­Jç­RÞ­cÞ­cïµkïµsïµsçµZŒkJÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎçœ!çœ!ïœçœ!ïœÞ­cçµZÞ­cçµZÞ­cçµZçµZœ„B9ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎïœçœ!çœ!çœ!çœ!çµZçµZçµZçµZçµZçµZçµZçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZ„cJ1çµZçµZÞ­kçµZÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎZcc9B)9)ÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎÆÆÎ
/unsupported/tags/rel_0_5/simcity/img/car_210n.raw
0,0 → 1,0
€ÿ€ÿ€€€ÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€€€€€ÿÿ€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿ€
/unsupported/tags/rel_0_5/simcity/img/car_120n.raw
0,0 → 1,0
€ÿÿÿÿÿ€ÀÀÀÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿ€ÿÿÿÿÿ€€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿ€€€€€€€ÿÿ€€€€ÿ€€€€
/unsupported/tags/rel_0_5/simcity/img/car_030n.raw
0,0 → 1,0
€ÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€ÿÿ€€€€€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿ€€€ÿ€ÿ€
/unsupported/tags/rel_0_5/simcity/img/car_300n.raw
0,0 → 1,0
€€€€ÿ€€€€ÿÿ€€€€€€€ÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€€ÿÿÿÿÿ€ÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÀÀÀ€ÿÿÿÿÿ€
/unsupported/tags/rel_0_5/simcity/img/street.raw
0,0 → 1,0
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ­›Ñukÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãʵÓfPé=6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿޘ…å@-øF7ÝG@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÄ­ßTEû<.øI5ø;6èskÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ|kèC5î=0â[Fø<3í;6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܲ—å>5í@7×gWöÐÅÖD4ùB4ÜeYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×iU÷<4æ88ñ̼öýñ݅uõB3í@8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ Ší<,ð72Ý~yèäÙÞãÞôàØäF9÷@-Ó[Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖűÛPBöE3ÙA<ôáÙA=4;98øôì圃î@.èA4ؖ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ؆rï?0ë70䤛úûôŠ‰„‰†ˆüüôùïÚÔP>ü;,ãOMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿⱡßC7ìA1ÝVRûóïöùõ¦¡š911—“øùò髤ï?/ôC6ّÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØs\÷<5ã:3ê¾´ýüûÖØÔ=*830(z|üóñÕ`J÷C,áHBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿТŒí>7õ80×{küùôúøöUYRjYS) %®©¨LHDòíæá¶æ97êE+ßlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØYKó?6Û=5øÜÑüüùŸ™˜tsn“ˆ„%¬¥¥QPLññèýöíÝlfñ@,áE0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˗‚ñ93ì60睒üûöùüýÊÄÂòî蠙”P?;¾´±ÚÛÔóùïúúðïÐÆìA5û=*âjeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕO:ù?1ßIK÷òìúýüúýþûúôöñìB?<ˆ‚}SMJúüõóþïöüïûûñâ{nõ;)í=4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜmiøB0ì<'ð³°íÿúýøûûûýôþòž“ijhööô?;8¿¼÷ûíþùëúúìøáÒÚF2û>1Ú_Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã@8û;-æ`VøøðåêêêåæúøöááÚ820ÔÑÐèéç·´³RLK÷ôîõóéìëäúùïà•„î?-î72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêQLù;*â8,ôÏÈéèä%# ab]ÃÁ·TVLz{uvl('#èéçJHE±¢˜Àµ­©©öìãÙO9ý=1ÒXDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô<'ì>.ٍ€úý÷|poÏÍÌ©™Žmf`ëêé{pj)")ààÞ¦ mbVçäáD?:D66ôòï骚æB1ó9,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛP1ñI/ÙEEûêéÊÁÃ0WLNñîî1!0$%ñìí\ON)ÔÔÕxuk!³²´œ™— ……‰ûõñÅZKý82ÞC:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñE.ð:+ò«§÷ü÷º¿¶˜›’ÕÒÏååݍŒ‚¢¤Ÿûýù››ˆ‚‚ãáÞÊŇ~|µ´²ðîì~|uƒ€|ùúõê¾°àC5ô<6߆oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé88öD6óB2ÓaUï\]á`Oàg[ßfcä_Yêc`æciçnhêp_âtpÝuuÞnuåszÛxsèzÔ{oê€vã~è‚zíE8û@9ßC*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù<3ú>3û:0ü?5ý?6ü=3û=3ú=8ø=;ùA>ö;6ø?7÷=2ûB0ú@-ø@-ø@-ø@,ù<0ù@4ú=1ú:0ü<3ù?0üE3ù>3Øxeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿӅvÞb\ßbYê\Mí`Që]Nì\MêYIèTBæQ;æS;éP8êR7èO7æFBêHDá>:æB?èDAâE7ÞB2ÞA1áA2Ú9+Ù:*ã;.ß:0½dQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„BABBABÿÿÿÿÿÿÿÿÿBABBAB„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBABÿÿÿBABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABBABBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ­›Ñukÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBAB„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„BABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãʵÓfPé=6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABBABÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿޘ…å@-øF7ÝG@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÄ­ßTEû<.øI5ø;6èskÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ|kèC5î=0â[Fø<3í;6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܲ—å>5í@7×gWöÐÅÖD4ùB4ÜeYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×iU÷<4æ88ñ̼öýñ݅uõB3í@8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ Ší<,ð72Ý~yèäÙÞãÞôàØäF9÷@-Ó[Vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖűÛPBöE3ÙA<ôáÙA=4;98øôì圃î@.èA4ؖ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ؆rï?0ë70䤛úûôŠ‰„‰†ˆüüôùïÚÔP>ü;,ãOMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿⱡßC7ìA1ÝVRûóïöùõ¦¡š911—“øùò髤ï?/ôC6ّÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØs\÷<5ã:3ê¾´ýüûÖØÔ=*830(z|üóñÕ`J÷C,áHBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿТŒí>7õ80×{küùôúøöUYRjYS) %®©¨LHDòíæá¶æ97êE+ßlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØYKó?6Û=5øÜÑüüùŸ™˜tsn“ˆ„%¬¥¥QPLññèýöíÝlfñ@,áE0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˗‚ñ93ì60睒üûöùüýÊÄÂòî蠙”P?;¾´±ÚÛÔóùïúúðïÐÆìA5û=*âjeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕO:ù?1ßIK÷òìúýüúýþûúôöñìB?<ˆ‚}SMJúüõóþïöüïûûñâ{nõ;)í=4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜmiøB0ì<'ð³°íÿúýøûûûýôþòž“ijhööô?;8¿¼÷ûíþùëúúìøáÒÚF2û>1Ú_Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã@8û;-æ`VøøðåêêêåæúøöááÚ820ÔÑÐèéç·´³RLK÷ôîõóéìëäúùïà•„î?-î72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêQLù;*â8,ôÏÈéèä%# ab]ÃÁ·TVLz{uvl('#èéçJHE±¢˜Àµ­©©öìãÙO9ý=1ÒXDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô<'ì>.ٍ€úý÷|poÏÍÌ©™Žmf`ëêé{pj)")ààÞ¦ mbVçäáD?:D66ôòï骚æB1ó9,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛP1ñI/ÙEEûêéÊÁÃ0WLNñîî1!0$%ñìí\ON)ÔÔÕxuk!³²´œ™— ……‰ûõñÅZKý82ÞC:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñE.ð:+ò«§÷ü÷º¿¶˜›’ÕÒÏååݍŒ‚¢¤Ÿûýù››ˆ‚‚ãáÞÊŇ~|µ´²ðîì~|uƒ€|ùúõê¾°àC5ô<6߆oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé88öD6óB2ÓaUï\]á`Oàg[ßfcä_Yêc`æciçnhêp_âtpÝuuÞnuåszÛxsèzÔ{oê€vã~è‚zíE8û@9ßC*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù<3ú>3û:0ü?5ý?6ü=3û=3ú=8ø=;ùA>ö;6ø?7÷=2ûB0ú@-ø@-ø@-ø@,ù<0ù@4ú=1ú:0ü<3ù?0üE3ù>3Øxeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿӅvÞb\ßbYê\Mí`Që]Nì\MêYIèTBæQ;æS;éP8êR7èO7æFBêHDá>:æB?èDAâE7ÞB2ÞA1áA2Ú9+Ù:*ã;.ß:0½dQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„÷ó÷„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„„‚„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
/unsupported/tags/rel_0_5/simcity/img/car_240n.raw
0,0 → 1,0
€ÿ€€€€€€€€ÿÿ€€€€ÿ€€€€€€€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€€ÿÿÿÿÿ€€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿ€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿ€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿ€
/unsupported/tags/rel_0_5/simcity/img/car_015n.raw
0,0 → 1,0
€€€ÿ€€€ÿÿÿÿ€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€ÿ€€€ÿ€ÿ€€€
/unsupported/tags/rel_0_5/simcity/img/car_105n.raw
0,0 → 1,0
ÿÿÿÿÿÿ€ÿÿ€€€€€€ÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿ€€€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€
/unsupported/tags/rel_0_5/simcity/img/car_060n.raw
0,0 → 1,0
€ÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€ÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€ÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€€ÿÿÿÿÿ€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€€ÿÿ€€€€€€€€ÿ€
/unsupported/tags/rel_0_5/simcity/img/car_330n.raw
0,0 → 1,0
ÿ€ÿÿ€€€ÿ€€€€ÿ€€€€€€€€€ÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€ÿÿ€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€ÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€ÿÿÿ
/unsupported/tags/rel_0_5/simcity/img/car_150n.raw
0,0 → 1,0
ÿÿÿ€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€ÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€ÿÿ€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿ€€€€€€€€€ÿ€€€€ÿ€€€ÿÿ€ÿ
/unsupported/tags/rel_0_5/simcity/img/car_270n.raw
0,0 → 1,0
€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€ÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿ€€€€€€ÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
/unsupported/tags/rel_0_5/simcity/img/car_180n.raw
0,0 → 1,0
€ÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿ€ÿÿ€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿ€€€
/unsupported/tags/rel_0_5/simcity/img/car_045n.raw
0,0 → 1,0
€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÀÀÀ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿÿ€€€ÿ€€€€€€€€
/unsupported/tags/rel_0_5/simcity/img/car_315n.raw
0,0 → 1,0
€€€€€€ÿ€€€€€€€€ÿ€€€€€€ÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€ÿ€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€ÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€ÿÿÿ€€€€€€ÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€ÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿ€ÿÿÿ
/unsupported/tags/rel_0_5/simcity/img/car_090n.raw
0,0 → 1,0
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÀÀÀÀÀÀÿÿÿÿÿÀÀÀÀÀÀÿÿÿÀÀÀÀÀÀÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÀÀÀÀÀÀÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿ€ÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿ€€ÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿ€€ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ€ÿÿÿÿÿÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
/unsupported/tags/rel_0_5/simcity/img/car_225n.raw
0,0 → 1,0
€€€€€€€€ÿ€€€ÿÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€ÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿ€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÀÀÀ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€
/unsupported/tags/rel_0_5/simcity/img/car_135n.raw
0,0 → 1,0
ÿÿÿ€ÿÿÿÿÿÿ€€€ÀÀÀ€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿÿÿÿ€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿ€€€€€€ÿÿÿ€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿ€ÿ€€€ÿÿ€€€€€€ÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€ÿ€€€€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€ÿ€€€ÿÿÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿ€€€€€€ÿ€€€€€€ÿÿ€€€€€€ÿ€€€€€€ÿÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿ€€€€€€ÿ€€€€€€€€ÿ€€€€€€
/unsupported/tags/rel_0_5/simcity/img/old_sk.raw
0,0 → 1,23
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*~*~*
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿ
ÿÿÿ~*
ÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~*
/unsupported/tags/rel_0_5/simcity/img/car_165n.raw
0,0 → 1,0
€€€ÿÿÿÿ€€€ÿ€€ÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€ÿ€ÿ€€€ÿ€
/unsupported/tags/rel_0_5/simcity/img/car_255n.raw
0,0 → 1,0
ÿÿ€€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€ÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ€
/unsupported/tags/rel_0_5/simcity/img/car_345n.raw
0,0 → 1,0
€ÿ€€€ÿ€ÿ€€€ÿ€€€€€€€€€ÿÿ€€€€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€€ÿ€€€ÿÿ€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿ€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€€ÿÿ€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€ÿ€€€ÿÿ€€€€€€€€€€€€ÿÿ€€ÿ€€€ÿÿÿÿ€€€
/unsupported/tags/rel_0_5/simcity/img/old.raw
0,0 → 1,26
ÿÿÿÿ
ÿÿÿÿÿÿ
ÿÀÿÿÀÿÿÀÿÿÀÿ
ÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@
ÿÀÿÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿÿÀÿÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿ@@@@@@@@@@@@@@@@@@@@@@@@ÿÀÿÿÀÿ€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*~*~*~*€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*~*~*~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€ÜÜ܀€€€€€€€€~*
€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜÜÜÜ܀€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€ÜÜ܀€€€€€€€€€€€€€€€€€ÜÜ܀€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~*
@@@@@@
@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~*
/unsupported/tags/rel_0_5/simcity/img/car_075n.raw
0,0 → 1,0
€ÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿ€€€€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿ€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€ÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€€ÿÿ
/unsupported/tags/rel_0_5/simcity/img/car_195n.raw
0,0 → 1,0
€€€ÿ€ÿ€€€ÿ€ÿÿ€€€€€€ÿÿ€€€€€€€€€ÿ€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿ€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€ÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€€ÿÿÿ€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿ€€€ÿÿ€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€ÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€€€€€€ÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿ€€€€€€€€€€€€ÿÿ€€€ÿ€ÿÿÿÿ€€€ÿ€€€
/unsupported/tags/rel_0_5/simcity/img/car_285n.raw
0,0 → 1,0
€€€€€€ÿÿ€€€€€€ÿÿÿÿ€€€€€€€€ÿÿÿ€€€€€€€€€€€€€€€€€€ÿ€€€€€€€€€€€ÿÿÿÿÿÿÿÿ€€€€€€ÿ€€€€€€€ÿÿÿÿ€€€€€€€€€€€€€€ÿÿÿ€ÿ€€€€€€€€€€€€ÿÿÿÿÿÿ€€€ÿ€€€€€€ÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿ€€€€€€€€€ÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿ€€€ÿÿÿÿÿÿ€€€ÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿ€€€€€€ÿÿÿÿ€€€ÿÿÿÿ€€€€€€€€€€€€€€€ÿÿÿÿ€€€€€€€€€€€€ÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ€€€ÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿÿÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿ€€€€€€ÿÿ€ÿÿÿÿÿÿ
/unsupported/tags/rel_0_5/simcity/makefile
0,0 → 1,15
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= simcity
 
include $(BASE)/config/example.mk
 
simcity:
make -f $(SUBMAKE) APP=simcity INIT= OTHEROBJS="initfile.o keyboard.o keyfunct.o tasks.o reading.o misc.o draw.o proc.o car.o" SHARKOPT="__OLDCHAR__ __GRX__"
/unsupported/tags/rel_0_5/simcity/draw.c
0,0 → 1,139
#include <drivers/glib.h>
#include "include/draw.h"
#include "include/simcity.h"
#include "include/states.h"
#include "include/misc.h"
#define rgb rgb16
 
void draw_tl(int x,int y,DWORD img[SH][SW]) {
int i,j;
 
for(i=0;i<SH;i++) {
for(j=0;j<SW;j++) {
//if(img[i][j]==tl_bg) continue;
grx_plot(x+j,y+i,img[i][j]);
}
}
}
 
void draw_scenario() {
char msg1[35];
int color,fbg;
 
color=rgb(235,235,235);
fbg=rgb(198,198,206);
grx_putimage(0,0,799,599,clrscr);
bold_rect(0,0,300,100,0,0,(255-120));
bold_rect(656,102,799,599,(254-120),(255-120),0);
grx_putimage(MAPX,MAPY,MAPX+W-1,MAPY+H-1,street);
bold_rect(0,102,655,599,0,0,(255-120));
bold_rect(301,0,799,100,(255-120),0,0);
grx_box(308,8,791,92,fbg);
grx_text("Alt + x , Enter -> Stop SIMCITY",10,10,color,black);
sprintf(msg1,"c -> Create a new hard car (max %d)",MAX_CAR);
grx_text(msg1,10,20,color,black);
sprintf(msg1,"s -> Create a new soft car (max %d)",MAX_CAR);
grx_text(msg1,10,30,color,black);
grx_text("k -> Kill oldest car",10,40,color,black);
grx_text("r -> Refresh screen",10,50,color,black);
grx_text("d -> Toggle sensor",10,60,color,black);
grx_text("road spd",CAMX,CAMY-10,gray,black);
grx_text("Simcity is presented by",450,20,black,fbg);
grx_text(" Aguzzi Marco",450,50,rgb(200,140,5),fbg);
grx_text(" &",450,60,black,fbg);
grx_text(" Ferrari Fabio",450,70,rgb(120,40,226),fbg);
drawFaces(390,15,0);
drawFaces(640,15,1);
}
 
void bold_rect(WORD x1,WORD y1,WORD x2,WORD y2,BYTE r,BYTE g,BYTE b) {
int c1,c2,c3,c4;
 
if(r>=255) r=255;
if(g>=255) g=255;
if(b>=255) b=255;
 
c1=rgb(r,g,b);
c2=rgb((r+40),(g+40),(b+40));
c3=rgb((r+80),(g+80),(b+80));
c4=rgb((r+120),(g+120),(b+120));
grx_rect(x1,y1,x2,y2,c1);
grx_rect((x1+1),(y1+1),(x2-1),(y2-1),c2);
grx_rect((x1+2),(y1+2),(x2-2),(y2-2),c3);
grx_rect((x1+3),(y1+3),(x2-3),(y2-3),c4);
grx_rect((x1+4),(y1+4),(x2-4),(y2-4),c4);
grx_rect((x1+5),(y1+5),(x2-5),(y2-5),c3);
grx_rect((x1+6),(y1+6),(x2-6),(y2-6),c2);
grx_rect((x1+7),(y1+7),(x2-7),(y2-7),c1);
}
 
void drawCar(int x,int y,int angle,char mode) {
int i,j;
 
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
if (macchine[i][j][returnCarIndex(angle)]!=0) {
grx_plot(x+j-15,y+i-15,macchine[i][j][returnCarIndex(angle)]*mode);
}
}
}
}
 
 
void get_images() {
 
grx_getimage(0,0,799,599,clrscr);
drawStreet(0,0);
grx_getimage(0,0,639,479,street);
grx_putimage(0,0,799,599,clrscr);
grx_getimage(0,0,31,31,clrcam);
drawSprites(15,15,GAUGE,DRAW);
grx_getimage(0,0,29,29,gauge_img);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,ARR_OFF,DRAW);
grx_getimage(0,0,29,29,arrow[1]);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,ARR_SX,DRAW);
grx_getimage(0,0,29,29,arrow[2]);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,ARR_DX,DRAW);
grx_getimage(0,0,29,29,arrow[0]);
grx_putimage(0,0,30,30,clrcam);
drawSprites(15,15,GAUGE_ROTTO,DRAW);
grx_getimage(0,0,29,29,brk_gauge);
grx_putimage(0,0,30,30,clrcam);
 
}
 
void drawStreet(int x,int y) {
int i,j;
 
for (i=0;i<H;i++) {
for (j=0;j<W;j++) {
grx_plot(x+j,y+i,strada[i][j]);
}
}
}
 
void drawSprites(int x,int y,char number,char mode) {
int i,j;
 
for (i=0;i<ROW;i++) {
for (j=0;j<COL;j++) {
if (sprites[i][j][(int)number]!=0) {
grx_plot(x+j-15,y+i-15,sprites[i][j][(int)number]*mode);
}
}
}
}
 
void drawFaces(int x,int y,short face) {
int i,j;
 
for (i=0;i<74;i++) {
for (j=0;j<47;j++) {
grx_plot(x+j,y+i,faces[face][i][j]);
}
}
}
 
/unsupported/tags/rel_0_5/biliardo/initfil1.c
0,0 → 1,70
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
#include "modules/pi.h"
#include "modules/pc.h"
#include "modules/srp.h"
#include "modules/npp.h"
#include "modules/nop.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 2000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
 
SEM_register_module();
 
CABS_register_module();
 
PI_register_module();
NOP_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
 
void app_mutex_init(mutex_t *m)
{
PI_mutexattr_t attr;
 
PI_mutexattr_default(attr);
 
mutex_init(m, &attr);
}
 
/unsupported/tags/rel_0_5/biliardo/posizion.h
0,0 → 1,11
// definizione della struttura contenente la posizione delle palle
 
struct posizione {
float x;
float y;
float v;
float theta;
int col;
} ;
 
 
/unsupported/tags/rel_0_5/biliardo/biliardo.c
0,0 → 1,240
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: biliardo.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "biliardo.h"
#include <kernel/func.h>
#include <string.h>
#include <stdlib.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
 
/* graphic mutex... */
mutex_t mutex;
 
mutex_t palmutex;
mutex_t delmutex;
//mutex_t punmutex;
 
/* useful colors... */
int white;
int black;
int red;
int gray;
int green;
int lime;
int brown;
 
void app_mutex_init(mutex_t *m);
 
static void version( void )
{
cprintf( "S.Ha.R.K. San Martino Sicc. Demo 1.0\n" );
}
 
int myrand(int x)
{
return rand()%x;
}
 
void reverse(char s[])
{
int c, i, j;
 
for (i = 0, j = strlen(s)-1; i<j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
 
char * itoa(int n, char *s)
{
int i, sign;
 
if ((sign = n) < 0)
n = -n;
 
i = 0;
 
do
{
s[i++] = n % 10 + '0';
} while ((n /= 10) > 0);
 
if (sign < 0)
s[i++] = '-';
 
s[i] = 0;
 
reverse(s);
 
return s;
}
 
 
void scenario()
{
grx_text("S.Ha.R.K. - Biliardo rivisitato", 322,2, white, black );
grx_text("q : uscita",322, 18, gray, black );
grx_text("i : inizio partita",322,28, gray, black );
grx_text("Space : scocca il colpo" ,322,38, gray, black );
grx_text("a,z : calibra la forza" ,322,48, gray, black );
grx_text("Freccie : posiziona cursore" ,322,58, gray, black );
grx_text("Backspace : nuova partita" ,322,68, gray, black );
 
 
#ifdef JET_ON
scenario_jetcontrol();
#endif
 
#ifdef BALL_ON
scenario_ball();
#endif
}
 
 
void demo_exc_handler(int signo, siginfo_t *info, void *extra)
{
struct timespec t;
 
grx_close();
 
/* Default action for an kern exception is */
kern_cli();
ll_gettime(TIME_EXACT, &t),
kern_printf("\nS.Ha.R.K. Exception raised!!!"
"\nTime (s:ns) :%d:%d"
"\nException number:%d"
"\nPID :%d\n",
t.tv_sec, t.tv_nsec, info->si_value.sival_int,
info->si_task);
sys_end();
}
 
void my_close(void *arg)
{
grx_close();
kern_printf("Termine programma\n");
}
 
 
void endfun(KEY_EVT *k)
{
cprintf("Tasto q premuto, termine programma\n");
sys_end();
}
 
void zerofun(KEY_EVT *k)
{
int i;
for (i=0; i<MAX_PROC; i++) jet_delstat(i);
}
 
void printeventqueue(void *arg)
{
struct event *p;
extern struct event *firstevent;
 
kern_cli();
grx_close();
kern_cli();
for (p = firstevent; p != NULL; p = p->next) {
kern_printf("par:%d time:%d.%d p:%d handler:%d\n",
p->par, p->time.tv_sec, p->time.tv_nsec/1000, p, p->handler);
}
kern_sti();
}
 
int main(int argc, char **argv)
{
int modenum;
 
KEY_EVT k;
 
// Evento di termine programma
k.flag = 0;
k.scan = KEY_Q;
k.ascii = 'q';
keyb_hook(k,endfun);
 
//set_exchandler_grx();
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
grx_init();
modenum = grx_getmode(640, 480, 16);
 
grx_setmode(modenum);
 
/* init the graphic mutex */
app_mutex_init(&mutex);
 
/* useful colors ... */
white = rgb16(255,255,255);
black = rgb16(0,0,0);
red = rgb16(255,0,0);
gray = rgb16(128,128,128);
green = rgb16(0,128,0);
lime = rgb16(0,255,0);
brown = rgb16(128,0,0);
 
scenario();
 
init_jetcontrol();
 
app_mutex_init(&palmutex);
app_mutex_init(&delmutex);
init_ball();
 
initSched();
 
group_activate(JET_GROUP);
 
return 0;
}
 
 
/unsupported/tags/rel_0_5/biliardo/jetctrl.c
0,0 → 1,194
// ****************** JetControl ******************
 
#include "biliardo.h"
#include "kernel/func.h"
 
TASK jetdummy_task(void *arg)
{
TIME now_dummy, last_dummy, diff_dummy, slice;
struct timespec now, last, diff;
int x = 0;
int height;
 
NULL_TIMESPEC(&last);
last_dummy = 0;
for (;;) {
task_nopreempt();
jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
sys_gettime(&now);
task_preempt();
 
SUBTIMESPEC(&now, &last, &diff);
slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
diff_dummy = now_dummy - last_dummy;
 
height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
 
TIMESPEC_ASSIGN(&last, &now);
last_dummy = now_dummy;
 
mutex_lock(&mutex);
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
 
mutex_unlock(&mutex);
 
 
x = (x+1)%JET_DUMMY_WIDTH;
 
task_endcycle();
}
}
 
 
TASK jetctrl_task(void *arg)
{
char st[50];
TIME sum, max;
int n;
 
PID i;
int printed = 0;
 
for (;;) {
for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
if (!n) n=1;
sprintf(st, "%6d %6d %10s ", (int)sum/n, (int)max, proc_table[i].name);
mutex_lock(&mutex);
grx_text(st, JET_DUMMY_X-45, JET_Y_NAME+16+printed*8, gray, black);
mutex_unlock(&mutex);
printed++;
}
}
while (printed<JET_NTASK) {
mutex_lock(&mutex);
grx_text(" ",
JET_DUMMY_X-45, JET_Y_NAME+16+printed*8, gray, black);
mutex_unlock(&mutex);
printed++;
}
task_endcycle();
}
}
 
TASK jetslide_task(void *arg)
{
TIME sum, curr, max;
 
TIME total[JET_NTASK];
int slides[JET_NTASK];
 
PID i;
int printed = 0;
 
for (;;) {
// Fill the total array in a nonpreemptive section
task_nopreempt();
for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
if (jet_getstat(i, &sum, NULL, NULL, &curr) != -1) {
total[printed] = sum+curr;
printed++;
}
}
task_preempt();
 
while (printed < JET_NTASK)
total[printed++] = 0;
 
// Compute the Max elapsed time
max = 0;
for (i=0; i<JET_NTASK; i++)
if (total[i] > max) max = total[i];
if (!max) max = 1;
 
// Compute the slides width
for (i=0; i<JET_NTASK; i++)
slides[i] = (int)( (((float)total[i])/max) * JET_SLIDE_WIDTH);
 
// print the data
mutex_lock(&mutex);
for (i=0; i<JET_NTASK; i++) {
grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
JET_SLIDE_X+slides[i], JET_Y_NAME+23+i*8, gray);
grx_box(JET_SLIDE_X+slides[i], JET_Y_NAME+16+i*8,
JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+23+i*8, black);
}
 
while (i<JET_NTASK) {
grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+20+i*8, black);
i++;
}
mutex_unlock(&mutex);
task_endcycle();
}
}
 
 
void scenario_jetcontrol(void)
{
 
grx_text(" Medio Massimo Processo Slide", JET_DUMMY_X-40, JET_Y_NAME, gray, black);
grx_line(JET_DUMMY_X-40,JET_Y_NAME+10,JET_DUMMY_X+250,JET_Y_NAME+10,lime);
 
grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lime);
 
grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lime, black);
grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lime, black);
 
}
 
void init_jetcontrol(void)
{
SOFT_TASK_MODEL m3, m4, m5;
 
PID p3, p4, p5;
 
soft_task_default_model(m3);
soft_task_def_level(m3,1);
soft_task_def_period(m3, PERIOD_JETCTRL);
soft_task_def_met(m3, WCET_JETCTRL);
soft_task_def_ctrl_jet(m3);
soft_task_def_group(m3, JET_GROUP);
p3 = task_create("jctrl", jetctrl_task, &m3, NULL);
if (p3 == -1) {
grx_close();
perror("Could not create task <jetctrl>");
sys_end();
}
 
soft_task_default_model(m4);
soft_task_def_level(m4,1);
soft_task_def_period(m4, PERIOD_JETDUMMY);
soft_task_def_met(m4, WCET_JETDUMMY);
soft_task_def_group(m4, JET_GROUP);
soft_task_def_usemath(m4);
soft_task_def_ctrl_jet(m4);
p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
if (p4 == -1) {
grx_close();
perror("Could not create task <jetdummy>");
sys_end();
}
 
soft_task_default_model(m5);
soft_task_def_level(m5,1);
soft_task_def_period(m5, PERIOD_JETSLIDE);
soft_task_def_met(m5, WCET_JETSLIDE);
soft_task_def_group(m5, JET_GROUP);
soft_task_def_usemath(m5);
soft_task_def_ctrl_jet(m5);
p5 = task_create("jsli", jetslide_task, &m5, NULL);
if (p5 == -1) {
grx_close();
perror("Could not create task <jetslide>");
sys_end();
}
}
 
/unsupported/tags/rel_0_5/biliardo/demo.h
0,0 → 1,170
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: demo.h,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#include <ll/ll.h>
#include <kernel/types.h>
#include <kernel/descr.h>
#include <math.h>
#include <drivers/glib.h>
#include <drivers/keyb.h>
 
#include <modules/hartport.h>
#include <modules/sem.h>
 
#define JET_ON
#define BALL_ON
 
/*
*
* WCET, Periods and Models
*
*/
 
 
/* define if you want NRT or SOFT... */
#define TASK_TYPE SOFT
//#define TASK_TYPE NRT
 
#define WCET_JETCTRL 7500
#define WCET_JETDUMMY 200
#define WCET_JETSLIDE 2100
 
#define PERIOD_JETCTRL 100000
#define PERIOD_JETDUMMY 100000
#define PERIOD_JETSLIDE 100000
 
 
//#define WCET_BALL 100
#define WCET_BALL 500
 
#define PERIOD_BALL 25000
 
#define WCET_SCHED 450
 
#define PERIOD_SCHED 15000
 
/*
*
* Global Stuffs
*
*/
 
/* graphic mutex... */
extern mutex_t mutex;
 
/* sincronizzazione */
//extern sem_t pmutex;
extern mutex_t palmutex;
 
/* useful colors... */
extern int white;
extern int black;
extern int red;
extern int gray;
extern int green;
 
void init_jetcontrol();
void init_ball(void);
void scenario_jetcontrol();
void scenario_ball();
char *itoa(int n, char *s);
int myrand(int x);
 
void initSched(void);
void setPalla (int);
void inizioPartita (void);
void collisioneRilevata(int);
int controlloBuche (float, float, int);
void hardSched (void);
void hardball (void);
 
/*
*
* JETCONTROL stuffs
*
*/
 
#define JET_NTASK 15
#define JET_Y_NAME 170
 
#define DUMMY_PID 1
 
#define JET_DUMMY_WIDTH 210
#define JET_DUMMY_HEIGHT 80
 
/* the point (x, y) is the top left corner */
#define JET_DUMMY_X 428
#define JET_DUMMY_Y 65
 
#define JET_SLIDE_WIDTH 50
#define JET_SLIDE_X 576
 
 
 
 
/*
*
* BALL stuffs
*
*/
 
// x and y corners are specified whithout consider a border of 3 pixels
#define BALL_YMAX 390 /* position of the ceil */
#define BALL_Y 425 /* position of the floor */
#define BALL_VELY .1 /* vertical ball velocity */
#define BALL_HEIGHT 5 /* initial height of the ball */
#define BALL_XMIN 65 /* min position X of the ball */
#define BALL_XMAX 255 /* max position X of the ball */
#define BALL_VELX 0. /* horizontal ball velocity */
#define BALL_VYMIN 11. /* min ground speed */
#define BALL_MAX_P 11 /* max number of balls */
 
#define BALL_GROUP 2 /* task group of the balls */
 
#define COLLISION 1
#define NO_COLLISION 0
/unsupported/tags/rel_0_5/biliardo/palla.c
0,0 → 1,1169
/*--------------------------------------------------------------*/
/* BILIARDO: FILE CONTENENTE TASK PALLA E SCHEDULAZIONE */
/*--------------------------------------------------------------*/
 
#include <kernel/func.h>
#include <stdlib.h>
#include <math.h>
#include "biliardo.h"
#include "posizion.h"
 
#define R 4 // dimensioni della palla
#define RB 7 // dimensioni della buca
#define COD_FRECCIA 64
 
static int ballexit[BALL_MAX_P]; // controllo eliminazione task palla
static int npc = 0; // numero dei task palla in gioco
struct posizione PosPalla[BALL_MAX_P]; // posizione delle palle in gioco
int FlagPartita = 0;
int ch = 0, curs = 0;
int punteggio[2]; // punteggio relativo al giocatore
int giocatore = 0; // giocatore
int bForza;
 
 
TASK palla(int i) {
 
float oxf, oyf; // posizione precedente della palla
int col;
 
setPalla (i);
 
mutex_lock(&palmutex);
col = PosPalla[i].col;
oxf = PosPalla[i].x;
oyf = BALL_Y - PosPalla[i].y;
mutex_unlock(&palmutex);
 
mutex_lock(&mutex);
grx_disc(oxf, oyf, R, col);
grx_text(" ",432,85, black, black);
mutex_unlock(&mutex);
 
while (1) {
 
mutex_lock(&mutex);
grx_disc(oxf, oyf, R, 0);
// grx_line(oxf, oyf, oxf+vx, oyf-vy, 0);
mutex_unlock(&mutex);
 
mutex_lock(&palmutex);
oxf = PosPalla[i].x;
oyf = BALL_Y - PosPalla[i].y;
mutex_unlock(&palmutex);
 
mutex_lock (&delmutex);
if (ballexit[i]) {
npc--;
mutex_unlock (&delmutex);
return 0;
}
mutex_unlock (&delmutex);
 
mutex_lock(&mutex);
grx_disc(oxf, oyf, R, col);
// grx_line(oxf, oyf, oxf+vx, oyf-vy, col);
mutex_unlock(&mutex);
 
task_endcycle();
}
}
 
TASK sched() {
 
int i, j;
int k;
 
char strTmp[21];
struct posizione posIn[BALL_MAX_P];
struct posizione posOut[BALL_MAX_P];
struct posizione pos[BALL_MAX_P];
 
 
int flag, bBevuta = 0;
float dist = 0;
 
 
float dx, dy; // variazione coordinate
float dt; /* incremento temporale */
float modx, mody;
 
// angolo formato dalla retta passante per il baricentro delle palle in collisione
float thetaB1 = 0, thetaB2 = 0;
float tratto; //tratto percorso
float thetaO1, thetaO2;
 
float attr = 0.0021; // attrito applicato ad ogni palla
float acc;
float g = 9.86; // forza di gravit… utilizzata per il calcolo dell'attrito
float v0 = 0;
 
float xCurs, yCurs;
int bRiposiz = 1;
int punteggio[2];
int giocatore = 0;
int sign;
float v1x, v1y, v2x, v2y;
float phi;
float thetaV1, thetaV2;
float thetaBarOld1, thetaBarOld2;
// evita che venga segnalata pi— volte una collisione
int flag1coll[BALL_MAX_P];
// segna nella locazione di una palla con quale altra palla ha colliso
int flagCollCorr[BALL_MAX_P];
// ricorda per ogni palla quale Š stata la collisione precedente
int flagCollPrec[BALL_MAX_P];
int flagAgg[BALL_MAX_P];
int flagAggNum[BALL_MAX_P];
 
for (i=0; i<BALL_MAX_P; i++) {
flagCollPrec[i] = -1;
}
 
dt = ((float)PERIOD_BALL)/40000;
 
acc = attr * g;
 
flag = 1;
k = 0;
 
while (1) {
if (ch == 'i') {
punteggio[0] = 0, punteggio[1] = 0;
ch = 0;
}
 
if (FlagPartita) {
 
// inizio mutex
mutex_lock(&palmutex);
 
if (PosPalla[i].theta < 0)
PosPalla[i].theta += 2*PI;
else
if (PosPalla[i].theta > 2*PI)
PosPalla[i].theta -= 2*PI;
 
for(i=0; i<BALL_MAX_P; i++) {
flag1coll[i] = 0;
flagCollCorr[i] = -1;
flagAgg[i] = 0;
posIn[i].x = posOut[i].x = PosPalla[i].x;
posIn[i].y = posOut[i].y = PosPalla[i].y;
posIn[i].v = posOut[i].v = PosPalla[i].v;
posIn[i].theta = posOut[i].theta = PosPalla[i].theta;
 
 
}
 
mutex_unlock(&palmutex);
 
// fine mutex
 
for(i=0; i<BALL_MAX_P; i++) {
 
for(j=0; j<BALL_MAX_P; j++) {
 
if (i < j && flagCollCorr[i] == -1) {
 
if(posIn[i].x-R >= posIn[j].x-R && posIn[i].x-R <= posIn[j].x+R
&& posIn[i].y-R >= posIn[j].y-R && posIn[i].y-R <= posIn[j].y+R) {
 
flagCollCorr[i] = j;
flagCollCorr[j] = i;
break;
}
else
 
if(posIn[i].x-R >= posIn[j].x-R && posIn[i].x-R <= posIn[j].x+R
&& posIn[i].y+R >= posIn[j].y-R && posIn[i].y+R <= posIn[j].y+R) {
 
flagCollCorr[i] = j;
flagCollCorr[j] = i;
break;
}
else
 
if(posIn[i].x+R >= posIn[j].x-R && posIn[i].x+R <= posIn[j].x+R
&& posIn[i].y+R >= posIn[j].y-R && posIn[i].y+R <= posIn[j].y+R) {
 
flagCollCorr[i] = j;
flagCollCorr[j] = i;
break;
}
else
 
if(posIn[i].x+R >= posIn[j].x-R && posIn[i].x+R <= posIn[j].x+R
&& posIn[i].y-R >= posIn[j].y-R && posIn[i].y-R <= posIn[j].y+R) {
 
flagCollCorr[i] = j;
flagCollCorr[j] = i;
break;
}
else {
flagCollCorr[i] = -1;
flagCollPrec[i] = -1;
}
 
 
} // fine if(i!=j)
} // fine ciclo for(j)
 
 
if (flagCollCorr[i] != -1 && flagCollCorr[i] != flagCollPrec[i]) {
 
 
dist = sqrt(pow(posIn[i].x - posIn[flagCollCorr[i]].x,2)
+ pow(posIn[i].y - posIn[flagCollCorr[i]].y,2));
if (dist < 2*R) {
flagAgg[i] = 1;
flagAgg[flagCollCorr[i]] = 1;
dist = ceil (2*R-dist);
if ((int)dist%2 != 0)
dist += 1;
flagAggNum[i] = (int)dist/2;
 
}
 
// permette la sola collisione di due palle contemporaneamente
flag1coll[i] = 1;
 
flagCollPrec[i] = flagCollCorr[i];
 
}
 
} // fine ciclo for(i)
 
 
for(i=0; i<BALL_MAX_P; i++) { // inizio ciclo for calcolo collisioni
 
if (flag1coll[i]) {
 
if (flag1coll[0])
bBevuta = 0;
 
 
 
sign = 1;
modx = posIn[i].x - posIn[flagCollCorr[i]].x;
mody = posIn[i].y - posIn[flagCollCorr[i]].y;
if (modx*mody < 0) sign = 0;
if (modx < 0) modx = -modx;
if (mody < 0) mody = -mody;
 
// prima palla
if (posIn[i].x <= posIn[flagCollCorr[i]].x && posIn[i].y <= posIn[flagCollCorr[i]].y) {
// angolo formato dalla retta passante per il baricentro delle due palle
thetaB1 = atan (mody / modx);
 
if (flagAgg[i]) {
posOut[i].x -=flagAggNum[i], posOut[i].y -=flagAggNum[i];
flagAgg[i] = 0;
}
 
}
else
if (posIn[i].x >= posIn[flagCollCorr[i]].x && posIn[i].y <= posIn[flagCollCorr[i]].y) {
thetaB1 = PI - atan (mody / modx);
 
if (flagAgg[i]) {
posOut[i].x +=flagAggNum[i], posOut[i].y -=flagAggNum[i];
flagAgg[i] = 0;
}
 
}
else
if (posIn[i].x >= posIn[flagCollCorr[i]].x && posIn[i].y >= posIn[flagCollCorr[i]].y) {
thetaB1 = PI + atan (mody / modx);
 
if (flagAgg[i]) {
posOut[i].x +=flagAggNum[i], posOut[i].y +=flagAggNum[i];
flagAgg[i] = 0;
}
 
}
else
if (posIn[i].x <= posIn[flagCollCorr[i]].x && posIn[i].y >= posIn[flagCollCorr[i]].y) {
thetaB1 = 2*PI - atan (mody / modx);
 
if (flagAgg[i]) {
posOut[i].x -=flagAggNum[i], posOut[i].y +=flagAggNum[i];
flagAgg[i] = 0;
}
 
}
 
if (thetaB1 < 0)
thetaB1 += 2*PI;
else
if (thetaB1 > 2*PI)
thetaB1 -= 2*PI;
 
// seconda palla
if (posIn[i].x >= posIn[flagCollCorr[i]].x && posIn[i].y >= posIn[flagCollCorr[i]].y) {
// angolo formato dalla retta passante per il baricentro delle due palle
thetaB2 = atan (mody / modx);
}
else
if (posIn[i].x <= posIn[flagCollCorr[i]].x && posIn[i].y >= posIn[flagCollCorr[i]].y) {
thetaB2 = PI - atan (mody / modx);
}
else
if (posIn[i].x <= posIn[flagCollCorr[i]].x && posIn[i].y <= posIn[flagCollCorr[i]].y) {
thetaB2 = PI + atan (mody / modx);
}
else
if (posIn[i].x >= posIn[flagCollCorr[i]].x && posIn[i].y <= posIn[flagCollCorr[i]].y) {
thetaB2 = 2*PI - atan (mody / modx);
}
 
if (thetaB2 < 0)
thetaB2 += 2*PI;
else
if (thetaB2 > 2*PI)
thetaB2 -= 2*PI;
 
 
 
 
// aggiorno gli angoli rispetto al nuovo sistema di riferimento della prima palla
// con 0 in thetaB1-PI/2
posOut[i].theta = posIn[i].theta + PI/2 - thetaB1;
if (posOut[i].theta < 0)
posOut[i].theta += 2*PI;
else
if (posOut[i].theta > 2*PI)
posOut[i].theta -= 2*PI;
 
thetaO1 = posOut[i].theta;
 
// stessa cosa per la seconda palla con 0 in thetaB2-PI/2
posOut[flagCollCorr[i]].theta = posIn[flagCollCorr[i]].theta + PI/2 - thetaB2;
if (posOut[flagCollCorr[i]].theta < 0)
posOut[flagCollCorr[i]].theta += 2*PI;
else
if (posOut[flagCollCorr[i]].theta > 2*PI)
posOut[flagCollCorr[i]].theta -= 2*PI;
thetaO2 = posOut[flagCollCorr[i]].theta;
 
 
 
thetaBarOld1 = thetaB1;
thetaBarOld2 = thetaB2;
thetaB1 = PI/2;
thetaB2 = PI/2;
 
 
 
 
// Ho l'angolo formato dalle due palle => aggiorno gli angoli rispetto
// al nuovo sistema di riferimento
 
 
 
if (cos(posOut[i].theta) <= 0)
thetaV1 = PI - posOut[i].theta;
else
thetaV1 = -posOut[i].theta;
if (thetaV1 < 0)
thetaV1 = -thetaV1;
 
 
if (cos(posOut[flagCollCorr[i]].theta) <= 0)
thetaV2 = PI - posOut[flagCollCorr[i]].theta;
else
thetaV2 = -posOut[flagCollCorr[i]].theta;
if (thetaV2 < 0)
thetaV2 = -thetaV2;
 
 
 
v1x = posIn[i].v * pow(cos(thetaV1), 2);
v1y = posIn[i].v * pow(sin(thetaV1), 2);
v2x = posIn[flagCollCorr[i]].v * pow(cos(thetaV2), 2);
v2y = posIn[flagCollCorr[i]].v * pow(sin(thetaV2), 2);
 
// aggiusto i segni secondo il sistema della prima palla
if (cos(posOut[i].theta) < 0)
v1x = -v1x;
if (sin(posOut[i].theta) < 0)
v1y = -v1y;
if (cos(posOut[flagCollCorr[i]].theta) > 0)
v2x = -v2x;
if (sin(posOut[flagCollCorr[i]].theta) > 0)
v2y = -v2y;
 
if (!v1y && v2y > 0) {
v2y = 0;
}
 
if (v1y < 0 && v1y < v2y) {
v2y = v1y;
 
}
 
 
// nuovo modulo della velocit… della palla 1
posOut[i].v = sqrt(pow(v1x, 2) + pow(v2y, 2));
 
 
if (v1x) {
phi = atan (v2y / v1x);
if (phi < 0)
phi = -phi;
}
else
phi = PI/2;
 
if (v1x >= 0 && v2y >= 0) {
// primo quadrante
phi = phi;
}
else
if (v1x <= 0 && v2y >= 0) {
// secondo quadrante
phi = PI/2 + (PI/2-phi);
}
else
if (v1x <= 0 && v2y <= 0)
// terzo quadrante
phi = PI + phi;
else
if (v1x >= 0 && v2y <= 0)
// quarto quadrante
phi = 3*PI/2 + (PI/2-phi);
 
posOut[i].theta = phi;
 
 
if (posOut[i].theta > 2*PI )
posOut[i].theta = posOut[i].theta - 2*PI;
else
posOut[i].theta = posOut[i].theta;
 
 
 
// riporto tutto nel sistema di riferimento iniziale
posOut[i].theta += -PI/2 + thetaBarOld1;
if (posOut[i].theta < 0)
posOut[i].theta += 2*PI;
else
if (posOut[i].theta > 2*PI)
posOut[i].theta -= 2*PI;
posOut[flagCollCorr[i]].theta += (-PI/2 + thetaBarOld2);
if (posOut[flagCollCorr[i]].theta < 0)
posOut[flagCollCorr[i]].theta += 2*PI;
else
if (posOut[flagCollCorr[i]].theta > 2*PI)
posOut[flagCollCorr[i]].theta -= 2*PI;
 
 
 
 
thetaB1 = thetaBarOld1;
thetaB2 = thetaBarOld2;
 
 
/* if (flag2 < 4) {
 
itoa (i, strTmp);
grx_text(strTmp,322,185+flag2*22, gray, black );
itoa (flagCollCorr[i], strTmp);
grx_text(strTmp,322,195+flag2*22, gray, black );
 
sprintf (strTmp, "%f", posIn[i].theta*360/(2*PI));
grx_text(strTmp,342,185+flag2*22, gray, black );
sprintf (strTmp, "%f", posIn[flagCollCorr[i]].theta*360/(2*PI));
grx_text(strTmp,342,195+flag2*22, gray, black );
 
sprintf (strTmp, "%f", posOut[i].theta*360/(2*PI));
grx_text(strTmp,432,185+flag2*22, gray, black );
sprintf (strTmp, "%f", posOut[flagCollCorr[i]].theta*360/(2*PI));
grx_text(strTmp,432,195+flag2*22, gray, black );
 
sprintf (strTmp, "%f", thetaB1*360/(2*PI));
grx_text(strTmp,522,185+flag2*22, gray, black );
sprintf (strTmp, "%f", thetaB2*360/(2*PI));
grx_text(strTmp,522,195+flag2*22, gray, black );
// -----------------------
sprintf (strTmp, "%f", posIn[i].v);
grx_text(strTmp,322,290+flag2*22, gray, black );
sprintf (strTmp, "%f", posIn[flagCollCorr[i]].v);
grx_text(strTmp,322,300+flag2*22, gray, black );
 
sprintf (strTmp, "%f", v1x);
grx_text(strTmp,412,290+flag2*22, gray, black );
sprintf (strTmp, "%f", v2x);
grx_text(strTmp,412,300+flag2*22, gray, black );
 
sprintf (strTmp, "%f", v1y);
grx_text(strTmp,502,290+flag2*22, gray, black );
sprintf (strTmp, "%f", v2y);
grx_text(strTmp,502,300+flag2*22, gray, black );
 
sprintf (strTmp, "%f", posOut[i].v);
grx_text(strTmp,582,290+flag2*22, gray, black );
sprintf (strTmp, "%f", posOut[flagCollCorr[i]].v);
grx_text(strTmp,582,300+flag2*22, gray, black );
// -----------------------
sprintf (strTmp, "%f", thetaV1*360/(2*PI));
grx_text(strTmp,322,390+flag2*22, gray, black );
sprintf (strTmp, "%f", thetaV2*360/(2*PI));
grx_text(strTmp,322,400+flag2*22, gray, black );
 
sprintf (strTmp, "%f", thetaO1*360/(2*PI));
grx_text(strTmp,402,390+flag2*22, gray, black );
sprintf (strTmp, "%f", thetaO2*360/(2*PI));
grx_text(strTmp,412,400+flag2*22, gray, black );
 
flag2++;
}
*/
 
} // fine if flag1coll
 
 
 
 
 
// questo if fa i conti del movimento di ogni pallina
if(posOut[i].v > 0) {
 
posOut[i].v -= acc * dt;
 
tratto = posOut[i].v * dt -0.5*acc*dt*dt;
 
dx = (float) (tratto * cos(posOut[i].theta));
dy = (float) (tratto * sin(posOut[i].theta));
 
posOut[i].x += dx;
posOut[i].y += dy;
 
 
 
if (posOut[i].x > BALL_XMAX) {
posOut[i].x = BALL_XMAX;
posOut[i].theta = PI - posOut[i].theta;
}
 
if (posOut[i].x < BALL_XMIN) {
posOut[i].x = BALL_XMIN;
posOut[i].theta = PI - posOut[i].theta;
}
 
if (posOut[i].y > BALL_YMAX) {
posOut[i].y = BALL_YMAX;
posOut[i].theta = -posOut[i].theta;
}
 
if (posOut[i].y < 0) {
posOut[i].y = 0;
posOut[i].theta = -posOut[i].theta;
}
}
 
pos[i].x = posOut[i].x;
pos[i].y = posOut[i].y;
pos[i].v = posOut[i].v;
pos[i].theta = posOut[i].theta;
 
} //fine ciclo for calcolo collisioni
 
if (!pos[0].v && !pos[1].v && !pos[2].v && !pos[3].v && !pos[4].v && !pos[5].v &&
!pos[6].v && !pos[7].v && !pos[8].v && !pos[9].v && !pos[10].v) {
 
for (i=0; i<BALL_MAX_P; i++) {
flagCollPrec[i] = -1;
}
 
}
 
if (bRiposiz && flag) {
mutex_lock(&mutex);
grx_text("Modo riposizionamento palla bianca",322,85, white, black);
mutex_unlock(&mutex);
flag = 0;
}
 
// posizionamento palla 0
if (bRiposiz && curs) {
if (curs == 77 && pos[0].x+R/2 <= BALL_XMAX) pos[0].x += 3;
if (curs == 75 && pos[0].x-R >= BALL_XMIN) pos[0].x -= 3;
curs = 0;
}
 
// entra in modalit… calibrazione forza
if (ch == ' ' && !bForza && (!pos[0].v && !pos[1].v && !pos[2].v
&& !pos[3].v && !pos[4].v && !pos[5].v && !pos[6].v &&
!pos[7].v && !pos[8].v && !pos[9].v && !pos[10].v)) {
 
bForza = 1;
ch = 0, v0 = 3.5;
xCurs = pos[0].x, yCurs = BALL_Y-pos[0].y+10;
if (yCurs >= BALL_Y) yCurs = BALL_Y-pos[0].y;
 
mutex_lock(&mutex);
grx_text("Modo riposizionamento palla bianca",322,85, black, black);
grx_text("Modo calibrazione forza",322,85, white, black);
grx_text("Forza: ",322,95, white, black);
sprintf (strTmp, "%2f", v0);
grx_text(strTmp,402,95, red, black);
grx_line(xCurs-2, yCurs, xCurs+2, yCurs, red);
grx_line(xCurs, yCurs+2, xCurs, yCurs-2, red);
mutex_unlock(&mutex);
 
bRiposiz = 0;
}
 
// calibrazione forza
if (ch == 'a' && bForza) {
if (v0 < 7.5)
v0 += 0.3;
if (v0 > 7.5)
v0 = 7.5;
ch = 0;
 
mutex_lock(&mutex);
grx_text(" ",402,95, black, black);
sprintf (strTmp, "%2f", v0);
grx_text(strTmp,402,95, red, black);
mutex_unlock(&mutex);
}
else
if (ch == 'z' && bForza) {
if (v0 > 0)
v0 -= 0.1;
if (v0 < 0)
v0 = 0;
ch = 0;
 
mutex_lock(&mutex);
grx_text(" ",402,95, black, black);
sprintf (strTmp, "%2f", v0);
grx_text(strTmp,402,95, red, black);
mutex_unlock(&mutex);
 
}
 
// aggiusta il mirino
if (bForza && curs) {
mutex_lock(&mutex);
grx_line(xCurs-2, yCurs, xCurs+2, yCurs, black);
grx_line(xCurs, yCurs+2, xCurs, yCurs-2, black);
if (curs == 72 && yCurs >= BALL_Y-BALL_YMAX-1) yCurs -= 2;
if (curs == 80 && yCurs <= BALL_Y) yCurs += 2;
if (curs == 77 && xCurs <= BALL_XMAX) xCurs += 2;
if (curs == 75 && xCurs >= BALL_XMIN) xCurs -= 2;
grx_line(xCurs-2, yCurs, xCurs+2, yCurs, red);
grx_line(xCurs, yCurs+2, xCurs, yCurs-2, red);
mutex_unlock(&mutex);
curs = 0;
bRiposiz = 0;
 
}
 
// bevuta
if (!pos[0].v && bBevuta) {
pos[0].x = BALL_XMIN+100;
pos[0].y = 50;
pos[0].v = 0;
pos[0].theta = 0;
bRiposiz = 1;
flag = 1;
if (giocatore)
giocatore = 0;
else
giocatore = 1;
bBevuta = 0;
mutex_lock(&mutex);
grx_text("Modo riposizionamento palla bianca",322,85, white, black);
mutex_unlock(&mutex);
 
}
 
// scocca il colpo di stecca
if (bForza && ch == ' ') {
 
// mutex_lock(&palmutex);
pos[0].v = v0;
if (pos[0].x-xCurs)
pos[0].theta = atan ((BALL_Y-pos[0].y-yCurs)/(pos[0].x-xCurs));
else
pos[0].theta = PI/2;
 
if (pos[0].theta <0)
pos[0].theta = -pos[0].theta;
 
if (xCurs <= pos[0].x && yCurs >= BALL_Y-pos[0].y)
// primo quadrante
pos[0].theta = pos[0].theta;
else
if (xCurs >= pos[0].x && yCurs >= BALL_Y-pos[0].y)
// secondo quadrante
pos[0].theta = PI/2 + (PI/2-pos[0].theta);
else
if (xCurs >= pos[0].x && yCurs <= BALL_Y-pos[0].y)
// terzo quadrante
pos[0].theta = PI + pos[0].theta;
else
if (xCurs <= pos[0].x && yCurs <= BALL_Y-pos[0].y)
// quarto quadrante
pos[0].theta = 3*PI/2 + (PI/2-pos[0].theta);
 
 
// mutex_unlock(&palmutex);
mutex_lock(&mutex);
grx_line(xCurs-2, yCurs, xCurs+2, yCurs, black);
grx_line(xCurs, yCurs+2, xCurs, yCurs-2, black);
grx_text("Modo calibrazione forza",322,85, black, black);
grx_text("Forza: ",322,95, black, black);
grx_text(" ",402,95, black, black);
mutex_unlock(&mutex);
ch = bForza = 0;
v0 = 0;
bBevuta = 1;
}
 
if (ch == 'x') {
for (i=0; i<BALL_MAX_P; i++) {
flagCollPrec[i] = -1;
}
ch = 0;
 
}
 
itoa (giocatore, strTmp);
mutex_lock(&mutex);
grx_text(strTmp,432,110, red, black );
itoa (punteggio[giocatore], strTmp);
grx_text(strTmp,432,120, red, black );
mutex_unlock(&mutex);
 
 
// aggiornamento della posizione delle palle
mutex_lock(&palmutex);
 
for (i=0; i<BALL_MAX_P; i++) {
if (controlloBuche (pos[i].x, pos[i].y, i)) {
 
if (i) {
pos[i].x = -10;
pos[i].y = 30;
pos[i].v = 0;
pos[i].theta = 0;
punteggio[giocatore]++;
// itoa (npc, strTmp);
// grx_text(strTmp,322,285, black, red );
if (punteggio[giocatore] >= 5) {
 
itoa (punteggio[giocatore], strTmp);
 
if (punteggio[giocatore] > 5) {
mutex_lock(&mutex);
grx_text(strTmp,432,120, red, black );
grx_text("Vittoria giocatore:",432,85, red, black);
itoa (giocatore, strTmp);
grx_text(strTmp,592,85, red, black );
mutex_unlock(&mutex);
killball ();
}
if (punteggio[giocatore] == 5 && npc == 2) {
mutex_lock(&mutex);
grx_text(strTmp,432,120, red, black );
grx_text("Pareggio",432,85, red, black);
mutex_unlock(&mutex);
killball ();
}
}
}
else {
pos[i].x = BALL_XMIN+100;
pos[i].y = 50;
pos[i].v = 0;
pos[i].theta = 0;
 
mutex_lock (&delmutex);
ballexit[i] = 0;
mutex_unlock (&delmutex);
 
bRiposiz = 1;
flag = 1;
if (giocatore)
giocatore = 0;
else
giocatore = 1;
bBevuta = 0;
 
}
}
 
PosPalla[i].x = pos[i].x;
PosPalla[i].y = pos[i].y;
if (pos[i].v >= 0) {
PosPalla[i].v = pos[i].v;
if (pos[i].theta > 2*PI )
PosPalla[i].theta = pos[i].theta - 2*PI;
else
if (pos[i].theta < 0 )
PosPalla[i].theta = pos[i].theta + 2*PI;
else
PosPalla[i].theta = pos[i].theta;
}
else {
PosPalla[i].v = 0;
PosPalla[i].theta = 0;
}
}
 
mutex_unlock(&palmutex);
 
 
}
else {
bRiposiz = 1, flag = 1;
bBevuta = 0;
}
 
task_endcycle();
} // fine ciclo while esterno
 
}
 
void inizioPartita () {
if (!FlagPartita) {
hardball();
giocatore = 0;
punteggio[0] = 0;
punteggio[1] = 0;
FlagPartita = 1;
}
}
 
 
void killball() {
int i;
 
bForza = 0;
mutex_lock (&delmutex);
for (i=0; i<BALL_MAX_P; i++)
ballexit[i] = 1;
mutex_unlock (&delmutex);
FlagPartita = 0;
}
 
 
void assegnaForza(KEY_EVT *k) {
ch = k->ascii;
}
 
void movCursore (KEY_EVT *k) {
curs = k->ascii;
}
 
/*
void ballfun(KEY_EVT *k)
{
SOFT_TASK_MODEL mp;
int r,g,b;
PID pid;
char palla_str[]="palla ";
 
soft_task_default_model(mp);
soft_task_def_level(mp,1);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp);
soft_task_def_group(mp, BALL_GROUP);
soft_task_def_met(mp, WCET_BALL);
soft_task_def_period(mp,PERIOD_BALL);
soft_task_def_usemath(mp);
pid = task_create(palla_str, palla, &mp, NULL);
 
if (pid != NIL) {
task_activate(pid);
}
}
*/
 
// avvio dei task palla
void hardball()
{
HARD_TASK_MODEL mp;
 
PID pid;
char pallaStr[]="palla ";
int i;
 
if (npc == BALL_MAX_P) return;
 
for(i=0;i<BALL_MAX_P;i++) {
 
ballexit[i] = 0;
 
itoa(i,pallaStr+6);
 
hard_task_default_model(mp);
hard_task_def_ctrl_jet(mp);
hard_task_def_arg(mp, (void *)i);
hard_task_def_wcet(mp, WCET_BALL);
hard_task_def_mit(mp,PERIOD_BALL);
hard_task_def_group(mp, BALL_GROUP);
hard_task_def_usemath(mp);
pid = task_create(pallaStr, palla, &mp, NULL);
 
if (pid == NIL) {
grx_close();
perror("Could not create task <pallaEDF>");
sys_end();
}
else {
npc++;
}
}
group_activate (BALL_GROUP);
}
 
// avvio del task di contollo
void hardSched()
{
HARD_TASK_MODEL mp;
 
PID pid;
 
hard_task_default_model(mp);
hard_task_def_ctrl_jet(mp);
// hard_task_def_arg(mp, (void *)1);
hard_task_def_wcet(mp, WCET_SCHED);
hard_task_def_mit(mp, PERIOD_SCHED);
hard_task_def_usemath(mp);
pid = task_create("Schedular", sched, &mp, NULL);
if (pid == NIL) {
grx_close();
perror("Could not create task <Schedulatore>");
sys_end();
}
else
task_activate(pid);
}
 
 
 
/*--------------------------------------------------------------*/
/* MAIN process */
/*--------------------------------------------------------------*/
 
void scenario_ball()
{
int i;
 
 
// Margine dello schermo
grx_rect(0, 0, 639, 479, red);
 
grx_line(320,78,639,78,red);
grx_line(320,0,320,479,red);
 
// Tavolo da biliardo
grx_rect(60,30,260,430,lime);
for (i=1; i<27; i++) {
grx_rect(60-i,30-i,260+i,430+i,brown);
}
 
// buche del tavolo
grx_disc(62, 32, RB, black);
grx_disc(258, 32, RB, black);
grx_disc(62, 230, RB, black);
grx_disc(258, 230, RB, black);
grx_disc(62, 428, RB, black);
grx_disc(258, 428, RB, black);
 
grx_line(320,105,639,105,red);
grx_line(320,130,639,130,red);
grx_text("Giocatore:" ,322,110, red, black );
grx_text("Punteggio:" ,322,120, red, black );
 
}
 
void init_ball(void)
{
KEY_EVT k;
 
k.flag = 0;
k.scan = KEY_I;
k.ascii = 'i';
keyb_hook(k,assegnaForza);
keyb_hook(k,inizioPartita);
 
 
/* intercetta il tasto 'spazio' per passare in modo posizionamento
e modo forza, mi serve per dare un colpo di stecca */
 
k.flag = 0;
k.scan = KEY_SPC;
k.ascii = ' ';
keyb_hook(k,assegnaForza);
 
// inizia una nuova partita
k.flag = 0;
k.scan = KEY_BKS;
k.ascii = ' ';
keyb_hook(k,killball);
 
k.flag = 0;
k.scan = KEY_X;
k.ascii = 'x';
keyb_hook(k,assegnaForza);
 
 
k.flag = 0;
k.scan = KEY_A;
k.ascii = 'a';
keyb_hook(k,assegnaForza);
 
k.flag = 0;
k.scan = KEY_Z;
k.ascii = 'z';
keyb_hook(k,assegnaForza);
 
k.flag = COD_FRECCIA;
k.scan = 72;
k.ascii = 72;
keyb_hook(k,movCursore);
 
k.flag = COD_FRECCIA;
k.scan = 75;
k.ascii = 75;
keyb_hook(k,movCursore);
 
k.flag = COD_FRECCIA;
k.scan = 77;
k.ascii = 77;
keyb_hook(k,movCursore);
 
k.flag = COD_FRECCIA;
k.scan = 80;
k.ascii = 80;
keyb_hook(k,movCursore);
 
}
 
// inizializzzazione task di schedulazione
void initSched(void) {
 
hardSched();
}
 
// inizializzazione delle posizioni delle palle
void setPalla (int num) {
 
int nPalla = num;
 
nPalla++;
 
switch(nPalla) {
case 1:
PosPalla[nPalla-1].x = BALL_XMIN + 100;
PosPalla[nPalla-1].y = 50;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = white;
break;
case 2:
PosPalla[nPalla-1].x = BALL_XMIN + 100;
PosPalla[nPalla-1].y = 300;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 3:
PosPalla[nPalla-1].x = BALL_XMIN + 90;
PosPalla[nPalla-1].y = 310;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 4:
PosPalla[nPalla-1].x = BALL_XMIN + 110;
PosPalla[nPalla-1].y = 310;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 5:
PosPalla[nPalla-1].x = BALL_XMIN + 80;
PosPalla[nPalla-1].y = 320;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 6:
PosPalla[nPalla-1].x = BALL_XMIN + 100;
PosPalla[nPalla-1].y = 320;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 7:
PosPalla[nPalla-1].x = BALL_XMIN + 120;
PosPalla[nPalla-1].y = 320;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 8:
PosPalla[nPalla-1].x = BALL_XMIN + 70;
PosPalla[nPalla-1].y = 330;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 9:
PosPalla[nPalla-1].x = BALL_XMIN + 90;
PosPalla[nPalla-1].y = 330;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 10:
PosPalla[nPalla-1].x = BALL_XMIN + 110;
PosPalla[nPalla-1].y = 330;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
case 11:
PosPalla[nPalla-1].x = BALL_XMIN + 130;
PosPalla[nPalla-1].y = 330;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
default:
PosPalla[nPalla-1].x = BALL_XMIN;
PosPalla[nPalla-1].y = 0;
PosPalla[nPalla-1].v = 0;
PosPalla[nPalla-1].theta = 0;
PosPalla[nPalla-1].col = green;
break;
}
 
}
 
// controllo quando una palla finisce in buca
int controlloBuche (float x, float yRel, int i) {
 
float y;
 
y = BALL_Y - yRel;
if ((x <= 62+RB && y <= 32+RB) || (x >= 258-RB && y <= 32+RB) ||
(x <= 62+RB && (y >= 230-RB && y <= 230+RB)) || (x >= 258-RB && (y >= 230-RB && y <= 230+RB)) ||
(x <= 62+RB && y >= 428-RB) || (x >= 258-RB && y >= 428-RB)){
 
// palla in buca
mutex_lock (&delmutex);
ballexit[i] = 1;
mutex_unlock (&delmutex);
 
return (1);
}
return (0);
}
/unsupported/tags/rel_0_5/biliardo/biliardo.h
0,0 → 1,102
#include <ll/ll.h>
#include <kernel/types.h>
#include <kernel/descr.h>
#include <math.h>
#include <drivers/glib.h>
#include <drivers/keyb.h>
 
#include <modules/hartport.h>
#include <modules/sem.h>
 
#define JET_ON
#define BALL_ON
 
/*
*
* WCET, Periods and Models
*
*/
 
 
/* define if you want NRT or SOFT... */
#define TASK_TYPE SOFT
//#define TASK_TYPE NRT
 
#define WCET_JETCTRL 7500
#define WCET_JETDUMMY 200
#define WCET_JETSLIDE 2100
 
#define PERIOD_JETCTRL 100000
#define PERIOD_JETDUMMY 100000
#define PERIOD_JETSLIDE 100000
 
#define JET_GROUP 1
 
 
#define WCET_BALL 600
 
#define PERIOD_BALL 20000
 
#define WCET_SCHED 1200
 
#define PERIOD_SCHED 15000
 
 
/* graphic mutex... */
extern mutex_t mutex;
 
extern mutex_t palmutex;
extern mutex_t delmutex;
 
/* useful colors... */
extern int white;
extern int black;
extern int red;
extern int gray;
extern int green;
extern int lime;
extern int brown;
 
void init_jetcontrol();
void init_ball(void);
void scenario_jetcontrol();
void scenario_ball();
char *itoa(int n, char *s);
int myrand(int x);
 
void initSched(void);
void setPalla (int);
void inizioPartita (void);
void collisioneRilevata(int);
int controlloBuche (float, float, int);
void hardSched (void);
void hardball (void);
void killball (void);
void assegnaForza (KEY_EVT *);
 
 
#define JET_NTASK 15
#define JET_Y_NAME 260
 
#define DUMMY_PID 1
 
#define JET_DUMMY_WIDTH 250
#define JET_DUMMY_HEIGHT 80
 
#define JET_DUMMY_X 370
#define JET_DUMMY_Y 150
 
#define JET_SLIDE_WIDTH 50
#define JET_SLIDE_X 566
 
 
 
#define BALL_YMAX 390 /* position of the ceil */
#define BALL_Y 425 /* position of the floor */
#define BALL_XMIN 65 /* min position X of the ball */
#define BALL_XMAX 255 /* max position X of the ball */
#define BALL_MAX_P 11 // numero di palle
 
#define BALL_GROUP 2 // gruppo palla
 
 
/unsupported/tags/rel_0_5/biliardo/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS=biliardo
 
include $(BASE)/config/example.mk
 
biliardo:
make -f $(SUBMAKE) APP=biliardo INIT= OTHEROBJS="initfil1.o jetctrl.o palla.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
 
/unsupported/tags/rel_0_5/parport/initfile.c
0,0 → 1,120
/*
*
* Project:
* Parallel Port S.Ha.R.K. Project
*
* Module:
* Initfile.c
*
* Description:
* System initialization file
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors:
* Andrea Battistotti <btandrea@libero.it>
* Armando Leggio <a_leggio@hotmail.com>
*
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*
 
System initialization file
 
This file contains the 2 functions needed to initialize the system.
 
These functions register the following levels:
 
an EDF (Earliest Deadline First) level
a RR (Round Robin) level
a CBS (Costant Bandwidth Server) level
a Dummy level
 
It can accept these task models:
 
HARD_TASK_MODEL (wcet+mit) at level 0
SOFT_TASK_MODEL (met, period) at level 1
NRT_TASK_MODEL at level 2
 
This file is similar to the configuration of kernel/init/hartik3.c
 
TICK is set to 0 (one-shot timer is used)
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
/* #define TICK 100 */
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/parport/ppdemo.c
0,0 → 1,495
/*
*
* Project:
* Parallel Port S.Ha.R.K. Project
*
* Module:
* ppDemo.c
*
* Description:
* file contents description
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors:
* Andrea Battistotti <btandrea@libero.it>
* Armando Leggio <a_leggio@hotmail.com>
*
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*
*/
 
/**
------------
CVS : $Id: ppdemo.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
**/
 
/*
* Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/****************************************************************/
/* PERIODIC PROCESS TEST */
/****************************************************************/
 
 
#include <drivers/parport.h>
#include <drivers/keyb.h>
#include <drivers/glib.h>
 
#define TSK_PERIOD 250000 /*400000 ok for debug...*/
#define TSK_WCET 70000
 
#define YMENU 10 /* menu level */
#define XMIN 10
#define XMAX 630
#define YMIN 10
#define YMAX 470
#define ESC 27 /* ASCII code of ESCAPE key */
#define X0
#define GRXWND_COLS 33
#define GRXWND_LINS 15
 
 
 
void ppInitGrxWnd(void)
{
/* graphic preparation */
/* graphic card Initialization */
if (grx_init() < 1) {
sys_abort(1);
}
if (grx_open(640, 480, 8) < 0) {
kern_printf("GRX Err\n");
sys_abort(1);
}
kern_printf("Video card ok!\n");
/* The scenario */
 
// Background
grx_clear(6);
 
// Frame
grx_rect(XMIN-1, YMIN-1, XMAX+1, YMAX+1, 0);
 
// Window 1
grx_box(XMIN+14,YMIN+14,XMAX-317,YMAX-235,7); //window
grx_box(XMIN+17,YMIN+17,XMAX-320,YMAX-427,1); //bar
grx_box(XMIN+17,YMIN+42,XMAX- 320,YMAX-238,0); //workspace
grx_box(XMIN+286,YMIN+19,XMAX-322,YMAX-429,7);//button
grx_text("PPDemo", XMIN+30, YMIN+21, 15, 1); //title
grx_text("**********************************", XMIN+25, YMIN+55, 10, 0);
grx_text("* PARALLEL PORT DEMONSTRATION *", XMIN+25, YMIN+70, 10, 0);
grx_text("**********************************", XMIN+25, YMIN+85, 10, 0);
grx_text("Press ALT X to exit", XMIN+25, YMIN+115, 10, 0);
grx_text("other keys to communicate with", XMIN+25, YMIN+130, 10, 0);
grx_text("remote terminal", XMIN+25, YMIN+145, 10, 0);
grx_text("(c) Copyright 2002", XMIN+25, YMIN+190, 10, 0);
grx_text("Andrea Battistotti, Armando Leggio", XMIN+25, YMIN+205, 10, 0);
// Window 2
grx_box(XMIN+317,YMIN+14,XMAX-14,YMAX-235,7);
grx_box(XMIN+320,YMIN+17,XMAX-17,YMAX-427,1);
grx_box(XMIN+320,YMIN+42,XMAX-17,YMAX-238,0);
grx_box(XMIN+589,YMIN+19,XMAX-19,YMAX-429,7);
grx_text("Statistics", XMIN+333, YMIN+21, 15, 1);
 
}
 
 
void ppInitGrxWnd_b(void)
{
// Window 3
grx_box(XMIN+14,YMIN+243,XMAX-317,YMAX-6,7);
grx_box(XMIN+17,YMIN+246,XMAX-320,YMAX-198,1);
grx_box(XMIN+17,YMIN+271,XMAX-320,YMAX-9,0);
grx_box(XMIN+286,YMIN+248,XMAX-322,YMAX-200,7);
grx_text("Local Terminal", XMIN+30, YMIN+250, 15, 1);
 
// Window 4
grx_box(XMIN+317,YMIN+243,XMAX-14,YMAX-6,7);
grx_box(XMIN+320,YMIN+246,XMAX-17,YMAX-198,1);
grx_box(XMIN+320,YMIN+271,XMAX-17,YMAX-9,0);
grx_box(XMIN+589,YMIN+248,XMAX-19,YMAX-200,7);
grx_text("Remote Terminal", XMIN+333, YMIN+250, 15, 1);
 
}
 
 
void ppGrxWnd2(char *c) /* sys msg wind */
{
static int i,j;
static char sysmsg[GRXWND_LINS+1][GRXWND_COLS+1];
char s[2];
 
s[1]='\0';
 
while ((s[0]=*c++)) // *c != 0
{
sysmsg[i][j]=s[0] ;
switch (s[0])
{
case '\r': case '\n':
j=0;i++;
break;
 
case '\b':
if (j>0)
{
j--;s[0]=' ';
grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0);
//statistics grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0);
//statistics
}
break;
 
default:
grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0); //statistics
j++;
break;
 
}
if (j>=GRXWND_COLS)
{i++;
j=0;}
if (i>=GRXWND_LINS) {
s[0]=' ';
for (i=0;i<GRXWND_LINS;i++){
for (j=0;j<GRXWND_COLS;j++){
grx_text(s, XMIN+330+8*j, YMIN+49+10*i,10,0); //statistics
};
};
i=0; j=0;
};
} // end while
}
 
 
void ppGrxWnd3(char c)
{
static int i,j;
char talk[GRXWND_LINS+1][GRXWND_COLS+1];
char s[2];
s[1]='\0';
 
talk[i][j]=c;
s[0] = c;
switch (c)
{
case '\r': case '\n':
j=0;i++;
break;
 
 
case '\b':
if (j>0)
{
j--;s[0]=' ';
grx_text(s, XMIN+27+8*j, YMIN+278+10*i,10,0); //local term
 
}
break;
 
default:
grx_text(s, XMIN+27+8*j, YMIN+278+10*i,10,0); //local term
j++;
break;
 
}
if(j==GRXWND_COLS) {i++; j=0;};
if(i==GRXWND_LINS) {
s[0]=' ';
for (i=0;i<GRXWND_LINS;i++){
for (j=0;j<GRXWND_COLS;j++){
grx_text(s, XMIN+27+8*j, YMIN+278+10*i,10,0); //local term
};
};
i=0; j=0;
}
}
 
void ppGrxWnd4(char c)
{
static int i,j;
char talk[GRXWND_LINS][GRXWND_COLS];
char s[2];
s[1]='\0';
 
talk[i][j]=c;
s[0] = c;
switch (c)
{
case '\r': case '\n':
j=0;i++;break;
 
case '\b':
if (j>0)
{
j--;s[0]=' ';
grx_text(s, XMIN+330+8*j, YMIN+278+10*i,10,0); //remote term
}
break;
default:
grx_text(s, XMIN+330+8*j, YMIN+278+10*i,10,0); //remote term
j++;
break;
}
 
if(j==GRXWND_COLS) {i++; j=0;}
if(i==GRXWND_LINS) {
s[0]=' ';
for (i=0;i<GRXWND_LINS;i++){
for (j=0;j<GRXWND_COLS;j++){
grx_text(s, XMIN+330+8*j, YMIN+278+10*i,10,0); //remote term
};
};
i=0; j=0;
}
}
 
 
/***************************************************************/
 
TASK ppChat(void *arg)
{
char sysmsg[SYS_MSG_COLS+1];
long xposTx;
KEY_EVT k;
BYTE b;
k.ascii = 0;
xposTx=9430 ; // any 16 bit test value...
 
task_endcycle();
 
while (1) {
#if PP_DEBUG == 1
//kern_printf("ppchat \n");
#endif
/* read char buffer */
if (keyb_getcode(&k,NON_BLOCK))
{
/* if any send it to ppDrv ...*/
b=k.ascii;
#if PP_DEBUG == 1
kern_printf("Send char: %i , %c \n",b,b);
#endif
//kern_printf("--- Transmit value for xposTx: %d \n",xposTx);
//ppTxBytes( (BYTE *) &xposTx, sizeof(xposTx) );
ppGrxWnd3(b);
ppTxOneByte(b);
}
 
if (ppRxOneByte(&b)==PP_COMM_OK)
//if (ppRxBytes((BYTE *) &xposRx, sizeof(xposRx))==PP_COMM_OK)
{
ppGrxWnd4(b);
//kern_printf("%c",b);
//kern_printf("--- Received value for xposRx: %d \n", xposRx);
}
if (ppReadSysMsg(sysmsg)==PP_SYSMSG_OK) ppGrxWnd2(sysmsg);
 
/* ..and show it in upper screen..*/
task_endcycle();
}
}
 
 
/****************************************************************/
 
/* This function is called when Alt-X is pressed.
It simply shutdown the system using sys_end.
Note that the byebye() function is called only if we exit from
the system using sys_end()!!!!
*/
void my_end(KEY_EVT* e)
{
 
sys_end();
}
 
/******************************************************************/
 
/* This function is called when the system exit correctly after Alt-X.
It exits from the graphic mode and then it prints a small greeting.
Note that:
- The function calls grx_exit, so it must be registered using
RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
at that point the kernel is already returned in real mode!!!)
- When an exception is raised, the exception handler is called.
Since the exception handler already exits from the graphic mode,
this funcion has not to be called. For this reason:
. we registered byebye using the flag NO_AT_ABORT
. the exception handler exits using sys_abort; in that way byebye is
NOT called
*/
 
void byebye(void *arg)
{
grx_close();
kern_printf("Bye Bye!\n");
}
 
/****************************** MAIN ******************************/
 
int main(int argc, char **argv)
{
PID pid2, pid;
KEY_EVT emerg;
 
HARD_TASK_MODEL m2;
SOFT_TASK_MODEL mp;
 
/* Set the closing function */
sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
 
 
keyb_set_map(itaMap);
/* set the keyboard handler to exit correctly */
emerg.ascii = 'x';
emerg.scan = KEY_X;
emerg.flag = ALTL_BIT;
keyb_hook(emerg,my_end);
emerg.ascii = 'x';
emerg.scan = KEY_X;
emerg.flag = ALTR_BIT;
keyb_hook(emerg,my_end);
 
/* a small banner */
kern_printf("ppChat Demo\n");
kern_printf("Press Alt-X to exit\n");
 
/* graphics */
ppInitGrxWnd();
 
/* graphic card Initialization */
//kern_printf("Video card ok!\n");
 
 
/* ppDrv creation */
ppGrxWnd2("Initing Drv...\n");
ppInitDrv(ppGrxWnd2); /* pass output fnc for init debug...*/
 
ppInitGrxWnd_b();
 
 
/* MODEL TASK EXAMPLES */
soft_task_default_model(mp);
soft_task_def_level(mp,1);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp, (void *)0);
soft_task_def_group(mp, 1);
soft_task_def_met(mp, PPDRV_WCET);
soft_task_def_period(mp,PPDRV_PERIOD);
soft_task_def_usemath(mp);
pid = task_create("ppDrv", ppPollingSvr, &mp, NULL);
if (pid != NIL) task_activate(pid);
/**/
//hard_task_default_model(m1);
//hard_task_def_ctrl_jet (m1);
//hard_task_def_arg (m1, (void *)0);
//hard_task_def_wcet (m1, PPDRV_WCET);
//hard_task_def_mit (m1, PPDRV_PERIOD);
//hard_task_def_group (m1,1);
//pid1 = task_create("ppDrv", ppPollingSvr, &m1, NULL);
//if (pid1 == NIL) {/*grx_close();*/ perror("Could not create task <ppDrv>");sys_abort(1);}
//if(task_activate(pid1)==-1) {/*grx_close();*/ perror("Could not create task <ppDrv>");sys_abort(1);};
//(" Task ppDrv Activate...PID: %i\n",pid1);
// kern_printf("---------------------\n");
 
/* ppChat creation */
hard_task_default_model(m2);
hard_task_def_ctrl_jet (m2);
hard_task_def_arg (m2, (void *)1);
hard_task_def_wcet (m2, TSK_WCET);
hard_task_def_mit (m2, TSK_PERIOD);
hard_task_def_group (m2,2);
pid2 = task_create("ppChat", ppChat, &m2, NULL);
if (pid2 == NIL) {/*grx_close();*/ perror("Could not create task <ppChat>");sys_abort(1);}
task_activate(pid2);
//kern_printf("Task Chat Activate...PID: %i\n",pid2);
//kern_printf("---------------------\n");
 
 
/*
now the task main ends, but the system does not shutdown because
there are the three task ego1, ego2, and ego3 running.
The demo will finish if a Alt-X key is pressed.
*/
 
return 0;
}
 
/* MODEL TASK EXAMPLES (from jumpball demo)
 
SOFT_TASK_MODEL mp;
soft_task_default_model(mp);
soft_task_def_level(mp,1);
soft_task_def_ctrl_jet(mp);
soft_task_def_arg(mp, (void *)rgb16(r,g,b));
soft_task_def_group(mp, BALL_GROUP);
soft_task_def_met(mp, WCET_BALL);
soft_task_def_period(mp,PERIOD_BALL);
soft_task_def_usemath(mp);
pid = task_create(palla_str, palla, &mp, NULL);
 
if (pid != NIL) task_activate(pid);
 
 
HARD TASK EXAMPLES
 
HARD_TASK_MODEL mp;
 
hard_task_default_model(mp);
hard_task_def_ctrl_jet(mp);
hard_task_def_arg(mp, (void *)rgb16(r,g,b));
hard_task_def_wcet(mp, 380);
hard_task_def_mit(mp,PERIOD_BALL);
hard_task_def_usemath(mp);
pid = task_create("pallaEDF", palla, &mp, NULL);
if (pid != NIL) task_activate(pid);
*/
/unsupported/tags/rel_0_5/parport/readme.txt
0,0 → 1,27
Hi,
 
This directory contains a small demo that uses the Shark Parallel Port driver.
 
Full documentation is available on the Shark Web Page.
 
PJ
 
PS: The following text is the original text made by the authors.
------------------------------------------------------------------------------
 
Universita' degli Studi di Pavia
Facoltà di Ingegneria
Dipartimento di Informatica e Sistemistica
 
-------------------------------------------------------------
PARALLEL PORT SHARK PROJECT
COMUNICAZIONE TRA PERSONAL COMPUTER TRAMITE PORTA PARALLELA
-------------------------------------------------------------
Corso: Informatica Industriale - A.A. 2001/2002
Docente: Prof. Giorgio Buttazzo
Responsabili: Prof. Giorgio Buttazzo - Ing. Paolo Gai
 
Progetto: Parallel Port Shark Project
Autori: Andrea Battistotti, Armando Leggio
 
(C) Copyright 2002 Andrea Battistotti & Armando Leggio
/unsupported/tags/rel_0_5/parport/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= ppdemo
 
include $(BASE)/config/example.mk
 
ppdemo:
make -f $(SUBMAKE) APP=ppdemo INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __PPORT__ __GRX__"
 
/unsupported/tags/rel_0_5/static/initfile.c
0,0 → 1,81
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "static.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
STATIC_register_level();
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/static/test1st.c
0,0 → 1,129
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: test1st.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
 
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "static.h"
#include <math.h>
#include <string.h>
 
int theend = 0;
 
void *mytask(void *arg)
{
struct timespec t;
 
for (;;)
{
sys_gettime(&t);
 
cprintf("I am task %s at time %d.%d\n", (char *)arg, (int)t.tv_sec, (int)t.tv_nsec);
 
theend++;
 
if (theend > 10) sys_end();
 
task_endcycle();
}
 
}
 
 
int main(int argc, char **argv)
{
PID p1;
 
STATIC_TASK_MODEL m;
 
struct timespec my_time, h, o;
 
my_time.tv_nsec=0;
 
 
my_time.tv_sec = 0;
my_time.tv_nsec = 500000000;
static_task_default_model(m, my_time);
static_task_def_arg(m, "A");
 
p1 = task_create("TaskA",mytask,&m,NULL);
if (p1 == -1) {
perror("Could not create task <A> ...");
sys_end();
}
 
my_time.tv_sec = 1;
my_time.tv_nsec = 0;
static_task_default_model(m, my_time);
static_task_def_arg(m, "B");
 
p1 = task_create("TaskB",mytask,&m,NULL);
if (p1 == -1) {
perror("Could not create task <B> ...");
sys_end();
}
 
my_time.tv_sec = 1;
my_time.tv_nsec = 500000000;
static_task_default_model(m, my_time);
static_task_def_arg(m, "C");
 
p1 = task_create("TaskC",mytask,&m,NULL);
if (p1 == -1) {
perror("Could not create task <C> ...");
sys_end();
}
 
h.tv_sec = 3;
h.tv_nsec = 0;
 
o.tv_sec = 1;
o.tv_nsec = 0;
 
STATIC_start(0, &h, &o);
 
return 0;
}
 
/unsupported/tags/rel_0_5/static/static.c
0,0 → 1,262
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: static.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "static.h"
#include <ll/stdio.h>
#include <ll/string.h>
#include <kernel/model.h>
#include <kernel/descr.h>
#include <kernel/var.h>
#include <kernel/func.h>
 
#define STATIC_printf kern_printf
//#define STATIC_printf printk
 
/*+ Status used in the level +*/
#define STATIC_READY MODULE_STATUS_BASE /*+ - Ready status +*/
#define STATIC_IDLE MODULE_STATUS_BASE+4 /*+ to wait the deadline +*/
 
/*+ flags +*/
#define STATIC_FLAG_NORAISEEXC 2
 
/*+ the level redefinition for the Earliest Deadline First level +*/
typedef struct {
level_des l; /*+ the standard level descriptor +*/
 
IQUEUE mytable;
 
PID currenttask;
 
struct timespec hp;
struct timespec ref;
 
} STATIC_level_des;
 
static void STATIC_offset_activate(void *par)
{
PID p = (PID) par;
STATIC_level_des *lev;
 
lev = (STATIC_level_des *)level_table[proc_table[p].task_level];
 
lev->currenttask = p;
event_need_reschedule();
 
// STATIC_printf("(o p%d t%d)", p, (int)proc_table[p].timespec_priority.tv_sec);
}
 
static void STATIC_activateall(STATIC_level_des *lev)
{
PID my_table_index;
struct timespec x;
 
STATIC_printf("(A ");
 
for (my_table_index = iq_query_first(&lev->mytable);
my_table_index != NIL;
my_table_index = iq_query_next(my_table_index, &lev->mytable)) {
ADDTIMESPEC(&lev->ref,iq_query_timespec(my_table_index, &lev->mytable),&x);
kern_event_post(&x, STATIC_offset_activate,(void *)my_table_index);
 
STATIC_printf("|p%d t%d ",
my_table_index,
(int)iq_query_timespec(my_table_index, &lev->mytable)->tv_sec);
}
 
STATIC_printf(")");
 
}
 
static void STATIC_hyperperiod(void *par)
{
STATIC_level_des *lev;
struct timespec x;
 
lev = (STATIC_level_des *)level_table[(LEVEL)par];
 
STATIC_printf("(hp %d)", (int)lev->ref.tv_sec);
 
STATIC_activateall(lev);
 
ADDTIMESPEC(&lev->ref, &lev->hp, &x);
lev->ref = x;
 
kern_event_post(&x, STATIC_hyperperiod, par);
}
 
 
/* The scheduler only gets the first task in the queue */
static PID STATIC_public_scheduler(LEVEL l)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
return lev->currenttask;
}
 
static int STATIC_public_create(LEVEL l, PID p, TASK_MODEL *m)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
/* if the STATIC_task_create is called, then the pclass must be a
valid pclass. */
 
STATIC_TASK_MODEL *h = (STATIC_TASK_MODEL *)m;
 
if (m->pclass != STATIC_PCLASS) return -1;
if (m->level != 0 && m->level != l) return -1;
iq_query_timespec(p, &lev->mytable)->tv_sec = h->offset.tv_sec;
iq_query_timespec(p, &lev->mytable)->tv_nsec = h->offset.tv_nsec;
iq_timespec_insert(p,&lev->mytable);
 
return 0; /* OK, also if the task cannot be guaranteed... */
}
 
static void STATIC_public_dispatch(LEVEL l, PID p, int nostop)
{
}
 
static void STATIC_public_epilogue(LEVEL l, PID p)
{
}
 
static void STATIC_public_activate(LEVEL l, PID p)
{
}
 
static void STATIC_public_unblock(LEVEL l, PID p)
{
}
 
static void STATIC_public_block(LEVEL l, PID p)
{
}
 
static int STATIC_public_message(LEVEL l, PID p, void *m)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
lev->currenttask = NIL;
 
jet_update_endcycle(); /* Update the Jet data... */
 
return 0;
}
 
static void STATIC_public_end(LEVEL l, PID p)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
 
lev->currenttask = NIL;
 
iq_extract(p,&lev->mytable);
 
/* we finally put the task in the ready queue */
proc_table[p].status = FREE;
iq_insertfirst(p,&freedesc);
}
 
/* Registration functions */
 
/*+ Registration function:
int flags the init flags ... see STATIC.h +*/
LEVEL STATIC_register_level()
{
LEVEL l; /* the level that we register */
STATIC_level_des *lev; /* for readableness only */
 
printk("STATIC_register_level\n");
 
/* request an entry in the level_table */
l = level_alloc_descriptor(sizeof(STATIC_level_des));
 
lev = (STATIC_level_des *)level_table[l];
 
printk(" lev=%d\n",(int)lev);
 
/* fill the standard descriptor */
lev->l.public_scheduler = STATIC_public_scheduler;
lev->l.public_create = STATIC_public_create;
lev->l.public_end = STATIC_public_end;
lev->l.public_dispatch = STATIC_public_dispatch;
lev->l.public_epilogue = STATIC_public_epilogue;
lev->l.public_activate = STATIC_public_activate;
lev->l.public_unblock = STATIC_public_unblock;
lev->l.public_block = STATIC_public_block;
lev->l.public_message = STATIC_public_message;
 
/* fill the STATIC descriptor part */
 
iq_init(&lev->mytable, &freedesc, 0);
lev->currenttask = NIL;
 
NULL_TIMESPEC(&lev->hp);
NULL_TIMESPEC(&lev->ref);
 
return l;
}
 
void STATIC_start(LEVEL l, struct timespec *h, struct timespec *o)
{
STATIC_level_des *lev = (STATIC_level_des *)(level_table[l]);
struct timespec x;
 
kern_cli();
kern_gettime(&x);
lev->hp = *h;
 
ADDTIMESPEC(&x,o,&lev->ref);
STATIC_printf("(ST: ref:%d.%d x:%d.%d)\n",
(int)lev->ref.tv_sec, (int)lev->ref.tv_nsec,
(int)x.tv_sec, (int)x.tv_nsec);
 
kern_event_post(&x, STATIC_hyperperiod,(void *)l);
 
kern_sti();
}
 
 
/unsupported/tags/rel_0_5/static/static.h
0,0 → 1,117
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* Massimiliano Giorgi <massy@gandalf.sssup.it>
* Luca Abeni <luca@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: static.h,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:47 $
------------
 
Static scheduler demo (FIRST Project Hand-off)
 
**/
 
/*
* Copyright (C) 2001 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#ifndef __STATIC_H__
#define __STATIC_H__
 
#include <ll/ll.h>
#include <kernel/config.h>
#include <sys/types.h>
#include <kernel/types.h>
 
 
 
 
 
 
 
 
/*+ flags... +*/
 
/* no flags for the static scheduler */
 
 
 
 
#define STATIC_PCLASS 0x1000
 
#define STATIC_LEVELNAME "STATIC 1st Project"
#define STATIC_LEVEL_CODE 167
#define STATIC_LEVEL_VERSION 1
 
 
typedef struct {
TASK_MODEL t;
struct timespec offset;
} STATIC_TASK_MODEL;
 
#define static_task_default_model(m,o) \
task_default_model((m).t,STATIC_PCLASS), \
((m).offset).tv_sec = (o).tv_sec, \
((m).offset).tv_nsec = (o).tv_nsec
#define static_task_def_level(m,l) task_def_level((m).t,l)
#define static_task_def_arg(m,a) task_def_arg((m).t,a)
#define static_task_def_stack(m,s) task_def_stack((m).t,s)
#define static_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
#define static_task_def_group(m,g) task_def_group((m).t,g)
#define static_task_def_usemath(m) task_def_usemath((m).t)
#define static_task_def_system(m) task_def_system((m).t)
#define static_task_def_nokill(m) task_def_nokill((m).t)
#define static_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
#define static_task_def_joinable(m) task_def_joinable((m).t)
#define static_task_def_unjoinable(m) task_def_unjoinable((m).t)
 
 
 
 
 
/*+ Registration function:
int flags Options to be used in this level instance...
+*/
LEVEL STATIC_register_level(void);
 
void STATIC_start(LEVEL l, struct timespec *h, struct timespec *o);
 
#endif
 
/unsupported/tags/rel_0_5/static/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= test1st
 
include $(BASE)/config/example.mk
 
test1st:
make -f $(SUBMAKE) APP=test1st INIT= OTHEROBJS="initfile.o static.o" OTHERINCL= SHARKOPT=__OLDCHAR__
 
/unsupported/tags/rel_0_5/static/readme
0,0 → 1,16
STATIC Scheduling Module
------------------------
 
This is the scheduling module created on the FIRST Project Meeting in
Vasteras, July 2002.
 
The module accept a new Task Model called STATIC_TASK_MODEL that
contains the information about the starting time of a task. After
creating all the tasks, the static scheduling starts calling the
function static_start.
 
For comments, bugfixes & co, write to pj@sssup.it.
 
Bye
 
PJ
/unsupported/tags/rel_0_5/gps/initfile.c
0,0 → 1,167
/*
* Project: S.Ha.R.K
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/hardcbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
#include "modules/intdrive.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
 
#include <drivers/shark_linuxc26.h>
#include <drivers/shark_pci26.h>
#include <drivers/shark_input26.h>
#include <drivers/shark_keyb26.h>
#include <drivers/shark_fb26.h>
 
#define FRAME_BUFFER_DEVICE 0
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
/*+ Interrup Server */
#define INTDRIVE_Q 1000
#define INTDRIVE_T 10000
#define INTDRIVE_FLAG 0
 
void call_shutdown_task(void *arg);
int device_drivers_init();
int device_drivers_close();
void set_shutdown_task();
TASK shutdown_task_body(void *arg);
 
PID shutdown_task_PID = -1;
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
INTDRIVE_register_level(INTDRIVE_Q,INTDRIVE_T,INTDRIVE_FLAG);
EDF_register_level(EDF_ENABLE_ALL);
HCBS_register_level(HCBS_ENABLE_ALL, 1);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
set_shutdown_task();
 
device_drivers_init();
 
sys_atrunlevel(call_shutdown_task, NULL, RUNLEVEL_SHUTDOWN);
 
__call_main__(mb);
 
return (void *)0;
}
 
void set_shutdown_task() {
 
NRT_TASK_MODEL nrt;
 
nrt_task_default_model(nrt);
nrt_task_def_system(nrt);
 
shutdown_task_PID = task_create("Shutdown Task",shutdown_task_body,&nrt,NULL);
if (shutdown_task_PID == NIL) {
sys_shutdown_message("Error: Cannot create shutdown task\n");
sys_end();
}
 
}
 
int device_drivers_init() {
 
int res;
KEYB_PARMS kparms = BASE_KEYB;
LINUXC26_register_module();
 
PCI26_init();
 
INPUT26_init();
 
KEYB26_init(&kparms);
 
/*
FB26_init();
res = FB26_open(FRAME_BUFFER_DEVICE);
if (res) {
cprintf("Error: Cannot open graphical mode\n");
KEYB26_close();
INPUT26_close();
sys_end();
}
FB26_use_grx(FRAME_BUFFER_DEVICE);
FB26_setmode(FRAME_BUFFER_DEVICE,"640x480-16");
*/
return 0;
 
}
 
int device_drivers_close() {
//FB26_close(FRAME_BUFFER_DEVICE);
KEYB26_close();
INPUT26_close();
return 0;
}
 
#define SHUTDOWN_TIMEOUT_SEC 3
 
void call_shutdown_task(void *arg)
{
struct timespec t;
 
sys_gettime(&t);
t.tv_sec += SHUTDOWN_TIMEOUT_SEC;
 
/* Emergency timeout to exit from RUNLEVEL_SHUTDOWN */
kern_event_post(&t,(void *)((void *)sys_abort_shutdown),(void *)0);
 
task_activate(shutdown_task_PID);
}
 
TASK shutdown_task_body(void *arg) {
 
device_drivers_close();
 
sys_shutdown_message("-- S.Ha.R.K. Closed --\n");
 
sys_abort_shutdown(0);
 
return NULL;
 
}
/unsupported/tags/rel_0_5/gps/nmea.h
0,0 → 1,97
#define GPVTG "GPVTG"
#define GPGGA "GPGGA"
#define GPGSA "GPGSA"
#define GPGSV "GPGSV"
#define GPRMC "GPRMC"
#define PRWIZCH "PRWIZCH"
 
struct OUTDATA {
int fdin;
int fdout;
 
int last_update; /* When we got last data from GPS receiver */
 
long cmask;
char utc[20]; /* UTC date / time in format "mm/dd/yy hh:mm:ss" */
 
double latitude; /* Latitude and longitude in format "d.ddddd" */
 
double longitude;
 
char grid[7];
 
double altitude; /* Altitude in meters */
 
double speed; /* Speed over ground, knots */
 
double track; /* Track made good, degress True */
 
int satellites; /* Number of satellites used in solution */
 
int status; /* 0 = no fix, 1 = fix, 2 = dgps fix */
 
int mode; /* 1 = no fix, 2 = 2D, 3 = 3D */
 
double pdop; /* Position dilution of precision */
 
double hdop; /* Horizontal dilution of precision */
 
double vdop; /* Vertical dilution of precision */
 
int in_view; /* # of satellites in view */
 
int PRN[12]; /* PRN of satellite */
 
int elevation[12]; /* elevation of satellite */
 
int azimuth[12]; /* azimuth */
 
int ss[12]; /* signal strength */
 
int used[12]; /* used in solution */
 
int ZCHseen; /* flag */
 
int Zs[12]; /* for the rockwell PRWIZCH */
 
int Zv[12]; /* value */
 
int year;
 
int month;
 
int day;
 
int hours;
 
int minutes;
 
int seconds;
 
double separation;
 
double mag_var;
 
double course;
 
int seen[12];
 
int valid[12]; /* signal valid */
};
 
#define C_LATLON 1
#define C_SAT 2
#define C_ZCH 4
 
/* prototypes */
extern void doNMEA(short refNum);
extern void processGPVTG(char *sentence);
extern void processGPRMC(char *sentence);
extern void processGPGGA(char *sentence);
extern void processGPGSV(char *sentence);
extern void processPRWIZCH(char *sentence);
extern void processGPGSA(char *sentence);
extern void process_message(char *sentence);
extern void add_checksum(char *sentence);
extern short checksum(char *sentence);
extern struct OUTDATA gNMEAdata;
/unsupported/tags/rel_0_5/gps/gps.c
0,0 → 1,155
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Giacomo Guidi <giacomo@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
#include <kernel/kern.h>
#include <stdlib.h>
#include <math.h>
 
#include "nmea.h"
 
#include <drivers/shark_keyb26.h>
#include <drivers/shark_fb26.h>
 
/* Number of available COM links */
#define COM_LINKS 4
#define COM1 0
#define COM2 1
#define COM3 2
#define COM4 3
/* These values identify interrupt type */
#define RX_FULL 1
#define TX_EMPTY 2
#define LS_CHANGED 4
#define MS_CHANGED 8
 
/* Register displacements */
#define THR 0
#define RBR 0
#define IER 1
#define FCR 2
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6
#define SPad 7
/* Parity value */
#define NONE 0
#define ODD 1
#define EVEN 3
 
static unsigned int com_base[] = {0x03F8,0x02F8,0x03E8,0x02E8};
 
struct OUTDATA gNMEAdata;
 
unsigned int com_read(unsigned int port,unsigned int reg)
{
unsigned int b;
if (port > 3 || reg > 7) return(0);
b = ll_in(com_base[port]+reg);
return(b);
}
 
void com_write(unsigned int port,unsigned int reg,unsigned int value)
{
if (port > 3 || reg > 7) return;
ll_out(com_base[port]+reg,value);
}
 
void com_send(unsigned int port,BYTE b)
{
while ((com_read(port,LSR) & 32) == 0);
com_write(port,THR,b);
}
unsigned int com_receive(unsigned int port)
{
while ((com_read(port,LSR) & 1) == 0);
return(com_read(port,RBR));
}
 
int open_com(unsigned int port, DWORD speed, BYTE parity, BYTE len, BYTE stop)
{
unsigned long div,b_mask;
 
/* Now set up the serial link */
b_mask = (parity & 3) * 8 + (stop & 1) * 4 + ((len - 5) & 3);
div = 115200L / speed;
/* Clear serial interrupt enable register */
com_write(port,IER,0);
/* Empty input buffer */
com_read(port,RBR);
/* Activate DLAB bit for speed setting */
com_write(port,LCR,0x80);
/* Load baud divisor */
com_write(port,0,div & 0x00FF);
div >>= 8;
com_write(port,1,div & 0x00FF);
/* Load control word (parity,stop bit,bit len) */
com_write(port,LCR,b_mask);
/* Attiva OUT1 & OUT2 */
com_write(port,MCR,0x0C);
 
return 0;
 
}
 
 
int main(int argc, char **argv)
{
 
unsigned int ch,i;
char temp[100];
 
open_com(COM1,4800,NONE,8,0);
i = 0;
 
while(1) {
 
ch = com_receive(COM1);
temp[i] = ch;
if (ch == 13) {
temp[i] = 0;
cprintf("%s\n",temp);
process_message(temp + 1);
i = 0;
 
cprintf("Lat: %f Lon: %f Alt: %f Sat: %d View: %d Mod: %d Time: %s\n",
gNMEAdata.latitude,
gNMEAdata.longitude,
gNMEAdata.altitude,
gNMEAdata.satellites,
gNMEAdata.in_view,
gNMEAdata.mode,
gNMEAdata.utc);
ch = com_receive(COM1);
 
} else {
i++;
}
 
}
 
return 0;
 
}
 
/unsupported/tags/rel_0_5/gps/nmea_parse.c
0,0 → 1,279
#include <kernel/kern.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include "nmea.h"
 
extern struct OUTDATA gNMEAdata;
static void do_lat_lon(char *sentence, int begin);
static void do_grid(void);
static char *field(char *sentence, short n);
static void update_field_i(char *sentence, int fld, int *dest, int mask);
 
void processGPRMC(char *sentence)
{
char s[20], d[10];
int tmp;
 
sscanf(field(sentence, 9), "%s", d); /* Date: ddmmyy */
 
strncpy(s, d + 2, 2); /* copy month */
 
strncpy(s + 3, d, 2); /* copy date */
 
sscanf((d+4), "%2d", &tmp);
 
/* Tf.: Window the year from 1970 to 2069. This buys us some time. */
if (tmp < 70)
strncpy(s + 6, "20", 2); /* 21th century */
else
strncpy(s + 6, "19", 2); /* 20th century */
 
strncpy(s + 8, d + 4, 2); /* copy year */
 
sscanf(field(sentence, 1), "%s", d); /* Time: hhmmss */
 
strncpy(s + 11, d, 2); /* copy hours */
 
strncpy(s + 14, d + 2, 2); /* copy minutes */
 
strncpy(s + 17, d + 4, 2); /* copy seconds */
 
s[2] = s[5] = '/'; /* add the '/'s, ':'s, ' ' and string terminator */
 
s[10] = ' ';
s[13] = s[16] = ':';
s[19] = '\0';
 
strcpy(gNMEAdata.utc, s);
 
/* A = valid, V = invalid */
if (strcmp(field(sentence, 2), "V") == 0)
gNMEAdata.status = 0;
#if 0 /* Let the GGA sentence do the update so we catch diff fixes */
else
gNMEAdata.status = 0;
#endif
 
sscanf(field(sentence, 7), "%lf", &gNMEAdata.speed);
sscanf(field(sentence, 8), "%lf", &gNMEAdata.track);
 
do_lat_lon(sentence, 3);
do_grid();
 
}
 
/* ----------------------------------------------------------------------- */
 
void processGPVTG(char *sentence)
{
sscanf(field(sentence, 3), "%lf", &gNMEAdata.speed);
sscanf(field(sentence, 1), "%lf", &gNMEAdata.track);
}
 
/* ----------------------------------------------------------------------- */
 
void processGPGGA(char *sentence)
{
do_lat_lon(sentence, 2);
do_grid();
/* 0 = none, 1 = normal, 2 = diff */
sscanf(field(sentence, 6), "%d", &gNMEAdata.status);
if ((gNMEAdata.status > 0) && (gNMEAdata.mode < 2))
gNMEAdata.mode = 2;
if ((gNMEAdata.status < 1) && (gNMEAdata.mode > 1))
gNMEAdata.mode = 1;
sscanf(field(sentence, 7), "%d", &gNMEAdata.satellites);
sscanf(field(sentence, 9), "%lf", &gNMEAdata.altitude);
}
 
/* ----------------------------------------------------------------------- */
 
void processGPGSA(char *sentence)
{
 
/* 1 = none, 2 = 2d, 3 = 3d */
sscanf(field(sentence, 2), "%d", &gNMEAdata.mode);
if ((gNMEAdata.mode > 1) && (gNMEAdata.status < 1))
gNMEAdata.status = 1;
if ((gNMEAdata.mode < 2) && (gNMEAdata.status > 0))
gNMEAdata.status = 0;
sscanf(field(sentence, 15), "%lf", &gNMEAdata.pdop);
sscanf(field(sentence, 16), "%lf", &gNMEAdata.hdop);
sscanf(field(sentence, 17), "%lf", &gNMEAdata.vdop);
}
 
/* ----------------------------------------------------------------------- */
 
void processGPGSV(char *sentence)
{
int n, m, f = 4;
 
 
if (sscanf(field(sentence, 2), "%d", &n) < 1)
return;
update_field_i(sentence, 3, &gNMEAdata.in_view, C_SAT);
 
n = (n - 1) * 4;
m = n + 4;
 
while (n < gNMEAdata.in_view && n < m) {
update_field_i(sentence, f++, &gNMEAdata.PRN[n], C_SAT);
update_field_i(sentence, f++, &gNMEAdata.elevation[n], C_SAT);
update_field_i(sentence, f++, &gNMEAdata.azimuth[n], C_SAT);
if (*(field(sentence, f)))
update_field_i(sentence, f, &gNMEAdata.ss[n], C_SAT);
f++;
n++;
}
}
 
/* ----------------------------------------------------------------------- */
 
void processPRWIZCH(char *sentence)
{
int i;
 
for (i = 0; i < 12; i++) {
update_field_i(sentence, 2 * i + 1, &gNMEAdata.Zs[i], C_ZCH);
update_field_i(sentence, 2 * i + 2, &gNMEAdata.Zv[i], C_ZCH);
}
gNMEAdata.ZCHseen = 1;
}
 
/* ----------------------------------------------------------------------- */
 
static void do_lat_lon(char *sentence, int begin)
{
double lat, lon, d, m;
char str[20], *p;
int updated = 0;
 
 
if (*(p = field(sentence, begin + 0)) != '\0') {
strncpy(str, p, 20);
sscanf(p, "%lf", &lat);
m = 100.0 * modf(lat / 100.0, &d);
lat = d + m / 60.0;
p = field(sentence, begin + 1);
if (*p == 'S')
lat = -lat;
if (gNMEAdata.latitude != lat) {
gNMEAdata.latitude = lat;
gNMEAdata.cmask |= C_LATLON;
}
updated++;
}
if (*(p = field(sentence, begin + 2)) != '\0') {
strncpy(str, p, 20);
sscanf(p, "%lf", &lon);
m = 100.0 * modf(lon / 100.0, &d);
lon = d + m / 60.0;
 
p = field(sentence, begin + 3);
if (*p == 'W')
lon = -lon;
if (gNMEAdata.longitude != lon) {
gNMEAdata.longitude = lon;
gNMEAdata.cmask |= C_LATLON;
}
updated++;
}
if (updated == 2)
gNMEAdata.last_update = sys_gettime(NULL);
}
 
/* ----------------------------------------------------------------------- */
 
static void do_grid() {
double lat, lon;
 
lat = gNMEAdata.latitude;
lon = gNMEAdata.longitude;
 
gNMEAdata.grid[0] = 65 + (int)((180.0 + lon) / 20.0);
gNMEAdata.grid[1] = 65 + (int)((90.0 + lat) / 10.0);
gNMEAdata.grid[2] = 48 + (int)((180.0 + lon) / 2) % 10;
gNMEAdata.grid[3] = 48 + (int)(90.0 + lat) % 10;
gNMEAdata.grid[4] = 97 + ((int)(180.0 + lon) % 2) * 12 + (int)(((180.0 + lon) - (int)(180.0 + lon)) * 12);
gNMEAdata.grid[5] = 97 + (int)(((90.0 + lat) - (int)(90.0 + lat)) * 24);
gNMEAdata.grid[6] = '\0';
}
 
/* ----------------------------------------------------------------------- */
 
static void update_field_i(char *sentence, int fld, int *dest, int mask)
{
int tmp;
 
sscanf(field(sentence, fld), "%d", &tmp);
 
if (tmp != *dest) {
*dest = tmp;
gNMEAdata.cmask |= mask;
}
}
 
void process_message(char *sentence)
{
if (checksum(sentence)) {
if (strncmp(GPRMC, sentence, 5) == 0) {
processGPRMC(sentence);
} else if (strncmp(GPGGA, sentence, 5) == 0) {
processGPGGA(sentence);
} else if (strncmp(GPVTG, sentence, 5) == 0) {
processGPVTG(sentence);
} else if (strncmp(GPGSA, sentence, 5) == 0) {
processGPGSA(sentence);
} else if (strncmp(GPGSV, sentence, 5) == 0) {
processGPGSV(sentence);
} else if (strncmp(PRWIZCH, sentence, 7) == 0) {
processPRWIZCH(sentence);
} else {
cprintf("Unknown sentence: \"%s\"\n",sentence);
}
} else {
cprintf("Bad Checksum !\n");
}
}
 
/* ----------------------------------------------------------------------- */
 
short checksum(char *sentence)
{
unsigned char sum = '\0';
char c, *p = sentence, csum[3];
 
while ((c = *p++) != '*' && c != '\0')
sum ^= c;
 
sprintf(csum, "%02x", sum);
return (strncmp(csum, p, 2) == 0);
}
 
void add_checksum(char *sentence)
{
unsigned char sum = '\0';
char c, *p = sentence;
 
while ((c = *p++) != '*')
sum ^= c;
 
sprintf(p, "%02x\r\n", sum);
}
 
static char *field(char *sentence, short n)
{
static char result[100];
char *p = sentence;
 
while (n-- > 0)
while (*p++ != ',');
strcpy(result, p);
p = result;
while (*p && *p != ',' && *p != '*' && *p != '\r')
p++;
 
*p = '\0';
return result;
}
/unsupported/tags/rel_0_5/gps/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= gps
 
include $(BASE)/config/example.mk
 
gps:
make -f $(SUBMAKE) APP=gps INIT= OTHEROBJS="initfile.o nmea_parse.o" SHARKOPT="__LINUXC26__ __PCI__ __INPUT__ __FB__"
 
/unsupported/tags/rel_0_5/lights/simlight.c
0,0 → 1,482
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* U N I V E R S I T A D I P A V I A */
/* DIPARTIMENTO DI INFORMATICA e SISTEMSTICA */
/* corso di INFORMATICA INDUSTRIALE */
/* prof. G. Buttazzo */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* S I M L I G H T */
/* progetto con S.H.A.R.K. : */
/* SIMULAZIONE FARI DA PALCO / DISCOTECA */
/* (C) 2001 by G. Vadruccio */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
/*
* Copyright (C) 2001 G. Vadruccio
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <ll/ll.h>
#include <kernel/types.h>
#include <kernel/model.h>
#include <kernel/func.h>
#include <modules/cabs.h>
#include <string.h>
#include <stdlib.h>
#include <semaphore.h>
#include <drivers/keyb.h>
#include <drivers/crtwin.h>
#include <drivers/glib.h>
#include <drivers/sound.h>
#include <rfftw.h>
#include <math.h>
#include "blaster.h"
 
#define FFT_SCALE (16384.0) // fatt. scala usato dal task fft
 
typedef short SAMPLE; // campioni letti da SB a 16-bit
 
typedef struct { // per il CAB cab_camdata
int start;
SAMPLE sample[1000];
} campione;
 
typedef struct { // per il CAB cab_prwdata
fftw_real p[501];
} power;
 
typedef struct { // per il CAB cab_lightdata
int l[8];
} lights;
 
CAB cab_camdata; // CAB dati campionati dalla SB
CAB cab_pwrdata; // CAB dati spettro di potenza
CAB cab_lghdata; // CAB dati intensit… luci
sem_t mutex; // semaforo di mutua esclusione
campione cam; // struttura dei campioni
rfftw_plan plan; // usato dalla libreria fft
char fbuf[1000];
int flen,
WCET_FFT, WCET_LIV, WCET_LIGHT,
PERIOD_FFT, PERIOD_LIV, PERIOD_LIGHT,
AGCOP, MICLEV,
ATT1, ATT2, ATT3, ATT4, ATT5, ATT6, ATT7; // parametri letti da file ext.
 
 
void read_file(void) // funzione di lettura file di
{ // testo 'PARAM.DAT' contenente
int err; // i parametri di funzionamento
DOS_FILE *fp;
fp = DOS_fopen("param.dat","r");
if (!fp) {
err = DOS_error();
cprintf("Error %d opening param.dat...\n", err);
flen = 0;
return;
}
flen = DOS_fread(&fbuf, 1, 325, fp);
cprintf("Read %d bytes from orbit.dat\n", flen);
DOS_fclose(fp);
}
 
 
void get_par(void) // scansione dei parametri
{
int x = 0;
 
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &WCET_FFT); // lettura wcet task fft
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &PERIOD_FFT); // lettura periodo task fft
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &WCET_LIV); // lettura wcet task livelli
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &PERIOD_LIV); // lettura periodo task livelli
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &WCET_LIGHT); // lettura wcet task light
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &PERIOD_LIGHT); // lettura periodo task light
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &AGCOP); // lettura opzione AGC
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &MICLEV); // letura livello microfonico
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT1); // lettura attenuazione faro 1
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT2); // lettura attenuazione faro 2
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT3); // lettura attenuazione faro 3
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT4); // lettura attenuazione faro 4
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT5); // lettura attenuazione faro 5
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT6); // lettura attenuazione faro 6
while ((fbuf[x] != ':') && (x < flen)) x++;
x++;
sscanf(&fbuf[x], "%d", &ATT7); // lettura attenuazione faro 7
}
 
 
void set_new_palette(void) // funzione di preparazione della
{ // palette di colori usata
int k, j;
 
for (k=0; k<7; k++)
for (j=(k*36); j<=(k*36)+4; j++) grx_setcolor(j,0,0,0); // nero
for (k=252; k<256; k++) grx_setcolor(k,0,0,0); // nero
for (k=1; k<=31; k++) {
grx_setcolor(k+4,(k*2)+1,0,0); // sfumatura rosso FARO 1
grx_setcolor(k+40,(k*2)+1,(k*2)+1,0); // sfumatura giallo FARO 2
grx_setcolor(k+76,0,(k*2)+1,0); // sfumatura verde FARO 3
grx_setcolor(k+112,0,(k*2)+1,(k*2)+1); // sfumarura azzurra FARO 4
grx_setcolor(k+148,0,0,(k*2)+1); // sfumatura blu FARO 5
grx_setcolor(k+184,(k*2)+1,0,(k*2)+1); // sfumatura magenta FARO 6
grx_setcolor(k+220,(k*2)+1,(k*2)+1,(k*2)+1); // sfumatura bianco FARO 7
}
}
 
 
void crea_scenario(void) // funzione di creazione scenario
{ // (trave e campane del palco)
int j;
int cs=238;
 
for (j=0; j<16; j++) grx_line(40*j,12,(40*j)+20,0,cs);
for (j=0; j<16; j++) grx_line(40*j+20,0,(40*j)+40,12,cs);
grx_rect(0,0,639,12,cs);
for (j=0; j<7; j++) {
grx_line(49+(j*83),12,49+(j*83),35,cs);
grx_line(49+(j*83),35,55+(j*83),35,cs);
grx_box(52+(j*83),32,88+(j*83),59,cs);
grx_disc(70+(j*83),33,18,cs);
grx_line(84+(j*83),35,91+(j*83),35,cs);
grx_line(91+(j*83),35,91+(j*83),12,cs);
}
}
 
 
int raw_infun(void *b) // funzione di self-buffering per
{ // la lettura dei campioni da SB
int i; // e scrittura nel cab
char *w; // dei campioni
SAMPLE *audiobuf = (SAMPLE *)b;
 
for (i=0; i<500; i++) {
cam.sample[cam.start] = audiobuf[i];
cam.start = (cam.start+1) % 1000;
}
w = cab_reserve(cab_camdata);
memcpy(w, &cam, sizeof(campione));
cab_putmes(cab_camdata,w);
return 0;
}
 
 
void init_rawdata() // funzione per inizializzare
{ // il CAB dei campioni letti da SB
int i;
char *w;
 
cam.start = 0;
for (i=0; i<1000; i++)
cam.sample[i] = 0;
w = cab_reserve(cab_camdata);
memcpy(w, &cam, sizeof(campione));
cab_putmes(cab_camdata,w);
}
 
 
void fft_close(void *arg) // fun. in uscita da task fft_task
{
rfftw_destroy_plan(plan);
}
 
 
TASK fft_task() // task per calcolo della fft:
{ // legge dal CAB dei dati
fftw_real in[1000], out[1000]; // campionati e scrive nal CAB
power power_spectrum; // dello spettro di potenza
campione *p;
char *m;
int k, i;
 
plan = rfftw_create_plan(1000, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
sys_atrunlevel(fft_close, NULL, RUNLEVEL_BEFORE_EXIT);
while(1)
{
p = (campione *)cab_getmes(cab_camdata);// lettura CAB dati campionati
for (k = 0, i = p->start;
k < 1000;
k++, i = (i+1)%1000)
in[k] = p->sample[i]/FFT_SCALE;
cab_unget(cab_camdata,(char *)p);
rfftw_one(plan, in, out);
power_spectrum.p[0] = out[0]*out[0]; // calcolo spettro potenza
for (k = 1; k < 501; ++k)
power_spectrum.p[k] = out[k]*out[k] + out[1000-k]*out[1000-k];
power_spectrum.p[500] = out[500]*out[500]; // Nyquist freq.
m = cab_reserve(cab_pwrdata); // scrittura nel CAB dello spettro
memcpy(m, &power_spectrum, sizeof(power));
cab_putmes(cab_pwrdata,m);
task_endcycle();
}
}
 
 
TASK livello() // task per il calcolo dei livelli
{ // luminosi dei fari: legge dal
power *p; // CAB dello spettro di potenza
lights *l; // e dal CAB dei livelli luminosi
lights w; // e aggiorna il CAB dei livelli
char *m; // luminosi
int j[8]={0,0,0,0,0,0,0,0};
int k[8]={0,0,0,0,0,0,0,0};
int y[501];
int i;
long add;
while(1) {
p = (power *)cab_getmes(cab_pwrdata); // lettura del CAB dello spettro
l = (lights *)cab_getmes(cab_lghdata);// lettura CAB livelli luminosi
for (i=1; i<=7; i++) j[i]=l->l[i];
cab_unget(cab_lghdata,(char *)l);
for (i = 1; i < 501; i++) {
if ((int)(p->p[i])>650000) y[i]=650000; //controllo range distorsione
else y[i]=(int)(p->p[i]);
}
cab_unget(cab_pwrdata,(char *)p);
/***************** calocolo livello FARO 1 **************/
add=0;
for (i=1; i<4; i++) add+=(long)(y[i]);
k[1]=(int)(add/ATT1);
if (k[1]>31) k[1]=31;
if (k[1]<0) k[1]=0;
if ((k[1]-j[1])<13) w.l[1]=j[1]-(int)((j[1]/8)+1);
else w.l[1]=k[1];
if (w.l[1]>31) w.l[1]=31;
if (w.l[1]<0) w.l[1]=0;
/***************** calocolo livello FARO 2 **************/
add=0;
for (i=6; i<20; i++) add+=(long)(y[i]/1);
for (i=90; i<100; i++) add+=(long)(y[i]*3);
k[2]=(int)(add/ATT2);
if (k[2]<13) k[2]=0;
if (k[2]>31) k[2]=31;
if ((k[2]-j[2])<5) w.l[2]=j[2]-(int)((j[2]/10)+1);
else w.l[2]=k[2];
if (w.l[2]>31) w.l[2]=31;
if (w.l[2]<0) w.l[2]=0;
/***************** calocolo livello FARO 3 **************/
add=0;
for (i=13; i<40; i++) add+=(long)(y[i]);
k[3]=(int)(add/ATT3);
if (k[3]<13) k[3]=0;
if (k[3]>31) k[3]=31;
if ((k[3]-j[3])<8) w.l[3]=j[3]-3;
else w.l[3]=k[3];
if (w.l[3]>31) w.l[3]=31;
if (w.l[3]<0) w.l[3]=0;
/***************** calocolo livello FARO 4 **************/
add=0;
for (i=40; i<60; i++) add+=(long)(y[i]);
k[4]=(int)(add/ATT4);
if (k[4]<11) k[4]=0;
if (k[4]>31) k[4]=31;
if ((k[4]-j[4])<4) w.l[4]=j[4]-3;
else w.l[4]=j[4]+3;
if (w.l[4]>31) w.l[4]=31;
if (w.l[4]<0) w.l[4]=0;
/***************** calocolo livello FARO 5 **************/
add=0;
for (i=90; i<120; i++) add+=(long)(y[i]);
for (i=15; i<30; i++) add+=(long)(y[i]/6);
k[5]=(int)(add/ATT5);
if (k[5]<13) k[5]=0;
if (k[5]>31) k[5]=31;
if ((k[5]-j[5])<4) w.l[5]=j[5]-3;
else w.l[5]=k[5];
if (w.l[5]>31) w.l[5]=31;
if (w.l[5]<0) w.l[5]=0;
/***************** calocolo livello FARO 6 **************/
add=0;
for (i=170; i<230; i++) add+=(long)(y[i]);
k[6]=(int)(add/ATT6);
if (k[6]<13) k[6]=0;
if (k[6]>31) k[6]=31;
if ((k[6]-j[6])<6) w.l[6]=j[6]-(int)((j[6]/9)+1);
else w.l[6]=j[6]+((k[6]-j[6])/3);
if (w.l[6]>31) w.l[6]=31;
if (w.l[6]<0) w.l[6]=0;
/***************** calocolo livello FARO 7 **************/
add=0;
for (i=200; i<450; i++) add+=(long)(y[i]);
k[7]=(int)(add/ATT7);
if (k[7]<13) k[7]=0;
if (k[7]<13) k[7]=0;
if (k[7]>31) k[7]=31;
if ((k[7]-j[7])<5) w.l[7]=k[7]-(int)((j[7]/10)+1);
else w.l[7]=(int)((k[7]+j[7])/2);
if (w.l[7]>31) w.l[7]=31;
if (w.l[7]<0) w.l[7]=0;
 
m=cab_reserve(cab_lghdata); // scrittura CAB livelli luminosi
memcpy(m, &w, sizeof(lights));
cab_putmes(cab_lghdata,m);
task_endcycle();
}
}
 
 
TASK light(void *arg) // task per l'accensione grafica
{ // delle luci: legge dal CAB dei
lights *p; // livelli luminosi
int i = (int)arg; // i = n. del task
int a, c, pos, liv;
 
while(1) {
p = (lights *)cab_getmes(cab_lghdata);// lettura CAB livelli luminosi
liv=p->l[i]; // livello del faro selezionato
sem_wait(&mutex); // inizio sezione critica
c=((36*i)-32)+liv; // colore del faro selezionato
pos=(83*i)-13; // posizione del faro seleionato
grx_box(pos-14,60,pos+14,440,c); // disegna il raggio lumonoso
for (a=15; a<=18; a++) grx_line(pos-15,60,pos-a,440,c);
grx_line(pos-15,60,pos-19,440,c-1);
for (a=20; a<=22; a++) grx_line(pos-16,60,pos-a,440,c-1);
grx_line(pos-16,60,pos-23,440,c-2);
for (a=24; a<=26; a++) grx_line(pos-17,60,pos-a,440,c-2);
for (a=27; a<=30; a++) grx_line(pos-17,60,pos-a,440,c-3);
for (a=31; a<=34; a++) grx_line(pos-17,60,pos-a,440,c-3);
for (a=15; a<=18; a++) grx_line(pos+15,60,pos+a,440,c);
grx_line(pos+15,60,pos+19,440,c-1);
for (a=20; a<=22; a++) grx_line(pos+16,60,pos+a,440,c-1);
grx_line(pos+16,60,pos+23,440,c-2);
for (a=24; a<=26; a++) grx_line(pos+17,60,pos+a,440,c-2);
for (a=27; a<=30; a++) grx_line(pos+17,60,pos+a,440,c-3);
for (a=31; a<=34; a++) grx_line(pos+17,60,pos+a,440,c-3);
sem_post(&mutex); // fine sezione critica
cab_unget(cab_lghdata,(char *)p);
task_endcycle();
}
}
 
// funzione in uscita
void my_close(void *arg)
{
grx_close();
kern_printf("Bye Bye!\n");
}
 
 
int main(int argc, char **argv)
{
int modenum;
int f=48000; // frequenza di campionamento
int i=1;
HARD_TASK_MODEL m1, m2, m3;
PID p1, p2, p3;
 
cab_camdata = cab_create("camdata", sizeof(campione), 4);
cab_pwrdata = cab_create("pwr", sizeof(power), 4);
cab_lghdata = cab_create("lghdata", sizeof (lights),4);
read_file();
get_par();
sound_init((1000 * sizeof(SAMPLE)), NULL); // init sound card
sound_info(); // visualizza info sound card
init_rawdata(); // init dati usati da raw_infun
sbmixer_setoutput(0x01,ENABLE); // abilita output sonoro
sbmixer_setmiclev(MICLEV); // imposta sensibilt… input-mic
sbmixer_setAGC(AGCOP); // opzione guadagno automatico
sound_setfun(raw_infun, (int (*)(void *))-1); // inizia self-buffering
sound_sample(NULL, f, 0, DMA_OP | PCM16 | MYFUN, NULL);
cprintf("Press Enter...");
while (keyb_getchar() != 13); // premi un tasto per iniziare
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT); // fun in uscita
grx_init(); // attiva grafica
modenum = grx_getmode(640, 480, 8);
grx_setmode(modenum);
set_new_palette(); // prepara la palette
crea_scenario(); // crea lo scenario
sem_init(&mutex, 0, 1); // init graphics mutex
 
hard_task_default_model(m1); // define task m1 (fft)
hard_task_def_periodic(m1);
hard_task_def_mit(m1, PERIOD_FFT);
hard_task_def_wcet(m1, WCET_FFT);
hard_task_def_usemath(m1);
hard_task_def_group(m1, 1);
hard_task_def_stack(m1,32*1024);
p1 = task_create("fft", fft_task, &m1, NULL); // crea task m1 (fft)
if (p1 == -1) {
perror("Could not create task <fft>\n");
sys_end();
}
task_activate(p1); // attiva task m1 (fft)
 
hard_task_default_model(m2); // define task m2 (livello)
hard_task_def_periodic (m2);
hard_task_def_mit (m2, PERIOD_LIV);
hard_task_def_wcet (m2, WCET_LIV);
hard_task_def_usemath (m2);
hard_task_def_group (m2, 1);
hard_task_def_ctrl_jet (m2);
p2 = task_create("livello", livello, &m2, NULL); // crea task m2 (livello)
if (p2 == NIL) {
grx_close();
perror("Could not create task <livello>");
sys_abort(1);
}
task_activate(p2); // attiva task m2 (livello)
 
do {
hard_task_default_model(m3); // define 7 task m3 (light)
hard_task_def_periodic (m3);
hard_task_def_mit (m3, PERIOD_LIGHT);
hard_task_def_wcet (m3, WCET_LIGHT);
hard_task_def_usemath (m3);
hard_task_def_group (m3, 1);
hard_task_def_ctrl_jet (m3);
hard_task_def_arg (m3, (void *)i);
p3 = task_create("light", light, &m3, NULL); // crea 7 task m3 (light)
if (p3 == NIL) {
grx_close();
perror("Could not create task <light>");
sys_abort(1);
}
task_activate(p3); // attiva 7 task m3 (light)
i++;
} while (i<8);
 
while (keyb_getchar() != 13); // premere Invio per terminare
sys_end();
return 0;
}
 
 
/unsupported/tags/rel_0_5/lights/blaster.h
0,0 → 1,64
/*
* Copyright (C) 2000 Luca Abeni
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "semaphore.h"
 
 
typedef struct sb_device {
DWORD BaseAddress;
BYTE IntLine;
BYTE DMA8Channel;
BYTE DMA16Channel;
BYTE DSPVersionM;
BYTE DSPVersionm;
// WORD period;
// BYTE pwarning;
TASK_MODEL *m;
} SB_DEVICE;
 
typedef struct sound_buffer {
sem_t synchr;
BYTE synch;
struct dma_buff *sound_dma;
int (*fun)(struct dma_buff *buff);
} SOUND_BUFFER;
 
typedef struct rawfuncs {
int (*infun)(void *rawbuffer);
BYTE infunpresent;
int (*outfun)(void *rawbuffer);
BYTE outfunpresent;
} RAWFUNCS;
 
void sb_spkoff (void);
void sb_spkon (void);
int sb_init (void); // return 0 if ok or ENODEV otherwise
void sbmixer_setmiclev(BYTE level);
void sbmixer_setoutput(BYTE in, BYTE onoff);
void sbmixer_setinput(BYTE in, BYTE onoff);
void sbmixer_reset(void);
void sbmixer_setingainlev(BYTE level);
void sbmixer_setAGC(BYTE onoff);
void sb_setrate (int sps, BYTE i_o);
void sb_dmaop(BYTE i_o);
void sb_dma16op(BYTE i_o);
void sb_dmabuffop(BYTE i_o);
void sb_dma16buffop(BYTE i_o);
void sb_stopdsp(BYTE b);
void sb_show(void);
/unsupported/tags/rel_0_5/lights/initfile.c
0,0 → 1,88
/*
* Copyright (C) 2001 G. Vadruccio
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
// INITFILE.C per il programma SIMLIGHT
// Progetto SHARK
// Contiene le funzioni necessarie per inizializzare il sistema.
// Le funzioni registrano i moduli:
// EDF (Earliest Deadline First) level
// RR (Round Robin) level
// CBS (Costant Bandwidth Server) level
// Dummy level
// Task attivabili:
// HARD_TASK_MODEL (wcet+mit) at level 0
// SOFT_TASK_MODEL (met, period) at level 1
// NRT_TASK_MODEL at level 2
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 1000
 
/*+ RR tick in us +*/
#define RRTICK 1000
 
void read_file(void);
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
read_file();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/lights/param.dat
0,0 → 1,21
----------------------------------------------------
WCET_FFT: 2850
PERIOD_FFT: 30000
 
WCET_LIV: 2850
PERIOD_LIV: 30000
 
WCET_LIGHT: 3900
PERIOD_LIGHT: 43500
 
AGC: 0
MICLEV: 22
 
ATT1: 9500
ATT2: 1800
ATT3: 1600
ATT4: 100
ATT5: 400
ATT6: 300
ATT7: 200
----------------------------------------------------
/unsupported/tags/rel_0_5/lights/readme.txt
0,0 → 1,71
Simlight
--------
 
This project was done by Giancarlo Vadruccio, university of Pavia, as
an Assignment in the corse of Informatic Engineering.
 
Unfortunately part of the documentation is in italian, if you have any problem
please send me an e-mail.
 
Paolo
 
...and here is the original description...
 
S I M L I G H T
Progetto SHARK realizzato da Giancarlo Vadruccio.
 
- DESCRIZIONE DEL PROGRAMMA
Il programma simula graficamente l'azionamento automatico di luci pilotato da
un segnale audio collegato all'ingresso microfonico di una scheda audio Sound
Blaster 16. L'intensit… luminosa del faro dipende dalla potenza del segnale
audio e ogni faro Š sensibile ad una determinata gamma di frequenze sonore e
quindi di strumenti. Ciascun faro, infatti, Š azionato dal valore medio della
potenza di una determinata banda di frequenze. I fari sono disposti in ordine
da sinistra verso destra, dalle frequenze pi— basse (grancassa, basso, ecc..)
a quelle pi— alte (crash, piatti, charleston, ecc.).
 
- REQUISITI DI SISTEMA
Il programma Š stato realizzato su un sistema AMD DURON 800 MHz con bus di
memoria a 133 MHz, sul quale funziona correttamente. Su sistemi pi— lenti, al
fine di garantire la schedulabilit… dei processi, sarebbe necessario
aumentare il periodo di ogni task (e il wcet) rischiando per• di rendere meno
realistica la simulazione (periodo e wcet sono modificabili da file PARAM.DAT).
Inoltre Š necessario installare una scheda audio Sound Blaster 16 con i
relativi driver DOS.
Tutte le funzioni e librerie usate sono quelle standard di SHARK
(distribuzione Giugno 2001). Per usare il programma Š sufficiente lanciare
(dall'ambiente DOS/SHARK) il comando <X SIMLIGHT> dalla directory
dell'applicazione (se necessario ricompilare con il comando <MAKE> nella stessa
directory).
 
- SORGENTE SONORA
Come sorgente sonora Š possibile usare un lettore CD o un microfono. In
entrambi i casi l'uscita del segnale audio deve essere collegata all'ingresso
microfonico della scheda audio tramite un apposito cavetto di collegamento.
Se si usa un lettore CD, il cui segnale d'uscita Š molto pi— potente di quello
di un microfono, Š necessario disabilitare la funzione AGC (Automatic Gain
Control) modificando il file PARAM.DAT ed inoltre si deve regolare il volume
di uscita della sorgente in modo da avere una buona dinamica della simulazione:
un volume troppo alto saturerebbe i livelli di input facendo restare sempre
accesi i fari, viceversa un volume troppo basso non sarebbe sufficiente ad
accendere alcun faro. E' comunque possibile modificare la sensibilit…
dell'ingresso variando il parametro MICLEV nel file PARAM.DAT.
Se si usa un microfono come sorgente sonora Š necessario sia abilitare la
funzione AGC sia portare al livello massimo la sensibilit… dell'ingresso
modificando il parametro MICLEV, entrambi nel file PARAM.DAT.
 
- MODIFICA DEI PARAMETRI NEL FILE PARAM.DAT
Il file PARAM.DAT Š un file di testo contenente alcuni parametri
dell'applicazione. In particolare contiene: i valori del periodo e del wcet dei
task, la funzione AGC (0=disabilit., 1=abilit.), il valore della sensibilit…
dell'ingresso (range 0-31 : 0=min sensibilità, 31=max sensibilità), i valori
dell'attenuazione specifica di ogni faro espressi con un numero intero compreso
tra 1 (minima attenuazione) e n.
Questi ultimi valori dipendono dalla risposta in frequenza del particolare
lettore CD o microfono che si usa: se alcune frequenze sono + o - attenuate
di altre, alcuni fari risultano troppo luminosi e altri troppo poco. Variando
i valori dell'attenuazione specifica di ogni faro Š possibile correggere questo
comportamento (se un faro Š troppo acceso si deve aumentare il corrispondente
valore di attenuazione, viceversa se Š poco luminoso, lo si deve diminuire).
In ogni caso, prima di modificare questi parametri, si deve regolare in maniera
ottimale il livello del volume della sorgente audio come specificato prima.
/unsupported/tags/rel_0_5/lights/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= simlight
 
include $(BASE)/config/example.mk
 
simlight:
make -f $(SUBMAKE) APP=simlight INIT= OTHEROBJS="initfile.o " SHARKOPT="__FFT__ __OLDCHAR__ __GRX__"
 
/unsupported/tags/rel_0_5/perf/perf2.c
0,0 → 1,402
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: perf2.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:39 $
------------
 
Performance Test 2:
 
This test tries to measure the time spent into the event handlers.
It is based on test D.
 
WARNING: the symbol __PERF_TEST2__ must be defined into the file
kernel/config.h
 
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
 
int num_aster = 0;
#define ASTER_LIM 60
#define DISPLAY_MAX 15
#define ASTER_MAX 70
#define STAT_Y 9
 
#define PER_MAX 5
#define APER_MAX 8
 
#define PER_WCET 8200
#define APER_WCET 20400
#define CLOCK_WCET 1600
#define ASTER_WCET 1600
#define SOFT_MET 3300
 
#define APER_REP 22000
 
PID aper_table[APER_MAX];
 
int shutting_down = 0;
 
TASK asteroide(void)
{
int i;
int y = rand() % 7 + 1;
 
int load1,j;
 
char s[2];
 
s[0] = '*'; s[1] = 0;
 
for (;;) {
i = 1;
while (i < ASTER_LIM) {
load1 = 10000; //8000 + rand()%2000;
for (j=0; j<load1; j++) {
s[0] = '*' + rand() % 100;
puts_xy(i,y,rand()%15+1,s);
}
 
task_activate(aper_table[rand()%APER_MAX]);
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
}
//num_aster--;
}
 
TASK aper_asteroid(void *a)
{
int i;
int y = rand() % 7 + 1;
 
int load1,j;
int c;
 
char s[2];
 
c = (int)a;
s[0] = '*'; s[1] = 0;
 
for (;;) {
i = 1;
while (i < ASTER_LIM) {
load1 = APER_REP; //8000 + rand()%2000;
for (j=0; j<load1; j++) {
s[0] = '*' + rand() % 100;
puts_xy(i,y,rand()%15+1,s);
}
s[0] = c;
puts_xy(i,y,rand()%15+1,s);
 
if (shutting_down) {
kern_printf("±%d±",exec_shadow);
return 0;
}
 
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
}
}
 
TASK soft_aster(void)
{
int i;
int y = rand() % 7 + 1;
 
int load1,j;
 
char s[2];
 
s[0] = '*'; s[1] = 0;
 
/*for (;;)*/ {
i = 1;
while (i < ASTER_LIM) {
load1 = 1000 + rand()%9000;
for (j=0; j<load1; j++) {
s[0] = '*' + rand() % 100;
puts_xy(i,y,rand()%15+1,s);
}
s[0] = 1;
puts_xy(i,y,rand()%15+1,s);
 
task_activate(aper_table[rand()%APER_MAX]);
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
}
num_aster--;
return 0;
}
 
TASK aster()
{
PID p;
 
HARD_TASK_MODEL m;
SOFT_TASK_MODEL m_soft;
int r;
int x; // adaptive bandwidth...
 
srand(7);
 
hard_task_default_model(m);
hard_task_def_wcet(m,PER_WCET);
hard_task_def_ctrl_jet(m);
for (x=0; x<PER_MAX; x++) {
r = (rand() % 200);
hard_task_def_mit(m, (64+r)*1000);
p = task_create("per",asteroide,&m,NULL);
if (p!=-1) task_activate(p);
}
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,SOFT_MET);
soft_task_def_ctrl_jet(m_soft);
 
x = 64;
 
while (1) {
if (num_aster < ASTER_MAX) {
r = (rand() % 200);
 
soft_task_def_period(m_soft, (x+r)*1000);
p = task_create("aaa",soft_aster,&m_soft,NULL);
if (p == -1)
{
if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
printf_xy(62,3,WHITE,"adapt=%3u err=%d",
iq_query_first(&freedesc), errno);
}
else {
num_aster++;
printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
task_activate(p);
x /= 2;
if (x<50) x = 50;
}
}
task_endcycle();
}
}
 
TASK clock()
{
int s = 0, m = 0;
 
while(1) {
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
task_endcycle();
 
if (++s > 59) {
s = 0;
m++;
}
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
task_endcycle();
}
}
 
 
 
/* we consider the first ASTER_MAX + 2 tasks from the PID 2
and plot on the screen the elapsed times... */
TASK jetcontrol()
{
int i; /* a counter */
TIME sum, max, curr, last[5];
int nact;
int j; /* the elements set by jet_gettable */
PID p;
 
 
kern_cli();
printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
kern_sti();
 
for (;;) {
for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 ||
(proc_table[p].pclass & 0xFF00) == HARD_PCLASS) continue;
 
for (j=0; j<5; j++) last[j] = 0;
jet_gettable(p, &last[0], 5);
kern_cli();
if (proc_table[p].task_level == 4)
printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(4,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
else
printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
kern_sti();
i++;
}
}
}
 
void fine()
{
sys_end();
}
 
void exiting(void *arg)
{
kern_printf("EXITING");
shutting_down = 1;
}
 
TIME perftime_prol[10001];
TIME perftime_epil[10001];
int perftime_count = 0;
 
void perftest_stat(void *arg)
{
int i;
TIME d, sum=0, max=0;
 
for (i=0; i<9000; i++) {
d = perftime_epil[i]-perftime_prol[i];
sum += d;
if (max < d) max = d;
kern_printf("Û%ld %ldÛ",perftime_epil[i],perftime_prol[i]);
}
kern_printf("\n°°° perftime_count=%u sum=%lu max=%lu °°°\n",perftime_count, sum, max);
}
 
int main(int argc, char **argv)
{
PID p1,p2,p3; //,p4,p5,p6;
HARD_TASK_MODEL m;
// NRT_TASK_MODEL m_nrt;
SOFT_TASK_MODEL m_aper;
SOFT_TASK_MODEL m_soft;
int i;
struct timespec fineprg;
 
kern_cli();
 
kern_sti();
 
sys_atrunlevel(exiting, NULL, RUNLEVEL_SHUTDOWN);
sys_atrunlevel(perftest_stat, NULL, RUNLEVEL_BEFORE_EXIT);
 
hard_task_default_model(m);
hard_task_def_wcet(m,ASTER_WCET);
hard_task_def_mit(m,10000);
hard_task_def_group(m,1);
hard_task_def_ctrl_jet(m);
 
// nrt_task_default_model(m_nrt);
// nrt_task_def_group(m_nrt,1);
// nrt_task_def_ctrl_jet(m_nrt);
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,1000);
soft_task_def_period(m_soft,100000);
soft_task_def_group(m_soft,1);
soft_task_def_ctrl_jet(m_soft);
soft_task_def_aperiodic(m_soft);
 
 
p1 = task_create("Aster",aster,&m,NULL);
if (p1 == -1) {
perror("test7.c(main): Could not create task <aster> ...");
sys_end();
l1_exit(-1);
}
 
hard_task_def_mit(m,500000);
hard_task_def_wcet(m,CLOCK_WCET);
p2 = task_create("Clock",clock,&m,NULL);
if (p2 == -1) {
perror("test7.c(main): Could not create task <Clock> ...");
sys_end();
l1_exit(-1);
}
 
// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
if (p3 == -1) {
perror("test7.c(main): Could not create task <JetControl> ...");
sys_end();
l1_exit(-1);
}
 
soft_task_default_model(m_aper);
soft_task_def_wcet(m_aper,APER_WCET);
soft_task_def_ctrl_jet(m_aper);
soft_task_def_system(m_aper);
soft_task_def_aperiodic(m_aper);
 
for (i=0; i<APER_MAX; i++) {
soft_task_def_level(m_aper, i/4 + 2);
soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
if (aper_table[i] == -1) {
perror("test7.c(main): Could not create task <aper> ...");
sys_end();
l1_exit(-1);
}
}
 
task_nopreempt();
fineprg.tv_sec = 60;
fineprg.tv_nsec = 0;
kern_event_post(&fineprg,fine,NULL);
group_activate(1);
return 0;
}
 
/unsupported/tags/rel_0_5/perf/perf3.c
0,0 → 1,435
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: perf3.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:39 $
------------
 
Performance Test 3:
 
this test is based on test D.
 
the test creates some random events. each event measure the difference
beetween his activation time and thecurrent time.
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
 
int num_aster = 0;
#define ASTER_LIM 60
#define DISPLAY_MAX 15
#define ASTER_MAX 70
#define STAT_Y 9
 
#define PER_MAX 5
#define APER_MAX 8
 
#define PER_WCET 8200
#define APER_WCET 20400
#define CLOCK_WCET 1600
#define ASTER_WCET 1600
#define SOFT_MET 3300
 
#define APER_REP 22000
 
PID aper_table[APER_MAX];
 
int shutting_down = 0;
 
TASK asteroide(void)
{
int i;
int y = rand() % 7 + 1;
 
int load1,j;
 
char s[2];
 
s[0] = '*'; s[1] = 0;
 
for (;;) {
i = 1;
while (i < ASTER_LIM) {
load1 = 10000; //8000 + rand()%2000;
for (j=0; j<load1; j++) {
s[0] = '*' + rand() % 100;
puts_xy(i,y,rand()%15+1,s);
}
 
task_activate(aper_table[rand()%APER_MAX]);
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
}
//num_aster--;
}
 
TASK aper_asteroid(void *a)
{
int i;
int y = rand() % 7 + 1;
 
int load1,j;
int c;
 
char s[2];
 
c = (int)a;
s[0] = '*'; s[1] = 0;
 
for (;;) {
i = 1;
while (i < ASTER_LIM) {
load1 = APER_REP; //8000 + rand()%2000;
for (j=0; j<load1; j++) {
s[0] = '*' + rand() % 100;
puts_xy(i,y,rand()%15+1,s);
}
s[0] = c;
puts_xy(i,y,rand()%15+1,s);
 
if (shutting_down) {
kern_printf("±%d±",exec_shadow);
return 0;
}
 
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
}
}
 
TASK soft_aster(void)
{
int i;
int y = rand() % 7 + 1;
 
int load1,j;
 
char s[2];
 
s[0] = '*'; s[1] = 0;
 
/*for (;;)*/ {
i = 1;
while (i < ASTER_LIM) {
load1 = 1000 + rand()%9000;
for (j=0; j<load1; j++) {
s[0] = '*' + rand() % 100;
puts_xy(i,y,rand()%15+1,s);
}
s[0] = 1;
puts_xy(i,y,rand()%15+1,s);
 
task_activate(aper_table[rand()%APER_MAX]);
task_endcycle();
 
puts_xy(i,y,WHITE," ");
i++;
}
}
num_aster--;
return 0;
}
 
TASK aster()
{
PID p;
 
HARD_TASK_MODEL m;
SOFT_TASK_MODEL m_soft;
int r;
int x; // adaptive bandwidth...
 
srand(7);
 
hard_task_default_model(m);
hard_task_def_wcet(m,PER_WCET);
hard_task_def_ctrl_jet(m);
for (x=0; x<PER_MAX; x++) {
r = (rand() % 200);
hard_task_def_mit(m, (64+r)*1000);
p = task_create("per",asteroide,&m,NULL);
if (p!=-1) task_activate(p);
}
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,SOFT_MET);
soft_task_def_ctrl_jet(m_soft);
 
x = 64;
 
while (1) {
if (num_aster < ASTER_MAX) {
r = (rand() % 200);
 
soft_task_def_period(m_soft, (x+r)*1000);
p = task_create("aaa",soft_aster,&m_soft,NULL);
if (p == -1)
{
if (x < 500 && errno != ENO_AVAIL_TASK) x += 1;
printf_xy(62,3,WHITE,"adapt=%3u err=%d",
iq_query_first(&freedesc), errno);
}
else {
num_aster++;
printf_xy(62,3,WHITE,"adapt=%3u ",x);//,errno);
task_activate(p);
x /= 2;
if (x<50) x = 50;
}
}
task_endcycle();
}
}
 
TASK clock()
{
int s = 0, m = 0;
 
while(1) {
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
task_endcycle();
 
if (++s > 59) {
s = 0;
m++;
}
printf_xy(62,1,WHITE,"%2d:%2d ast=%d",m,s, num_aster);
printf_xy(62,2,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_usedbandwidth(4));
task_endcycle();
}
}
 
 
 
/* we consider the first ASTER_MAX + 2 tasks from the PID 2
and plot on the screen the elapsed times... */
TASK jetcontrol()
{
int i; /* a counter */
TIME sum, max, curr, last[5];
int nact;
int j; /* the elements set by jet_gettable */
PID p;
 
 
kern_cli();
printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
kern_sti();
 
for (;;) {
for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
if (jet_getstat(p, &sum, &max, &nact, &curr) == -1 ||
((proc_table[p].pclass & 0xFF00) == HARD_PCLASS)) continue;
 
for (j=0; j<5; j++) last[j] = 0;
jet_gettable(p, &last[0], 5);
kern_cli();
if (proc_table[p].task_level == 4)
printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)CBS_get_nact(4,p), (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
else
printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6d ³ %-6d ³ %-4d ³ %-7d ³ %-5d ³ %-5d ³ %-5d ³ %-5d ³ %-5d",
p, (int)sum/(nact==0 ? 1 : nact), (int)max, nact, (int)curr, (int)last[0], (int)last[1], (int)last[2], (int)last[3], (int)last[4]);
kern_sti();
i++;
}
}
}
 
void fine()
{
sys_end();
}
 
void exiting(void *arg)
{
kern_printf("EXITING");
shutting_down = 1;
}
 
 
 
 
 
struct timespec last_random_time;
TIME max=0;
TIME sum=0;
int n=0;
 
void random_event(void *arg)
{
struct timespec t, sub;
TIME delta;
 
// get the current time
kern_gettime(&t);
 
// compute the delta
SUBTIMESPEC(&t, &last_random_time, &sub);
delta = TIMESPEC2USEC(&sub);
 
// update the statistics
if (max < delta) max = delta;
sum += delta;
n++;
 
/* kern_printf("sub=%d.%d t=%d.%d last=%d.%d °\n",sub.tv_sec, sub.tv_nsec/1000,
t.tv_sec, t.tv_nsec/1000,
last_random_time.tv_sec, last_random_time.tv_nsec/1000);
*/ //return;
// create a new event
if (shutting_down)
return;
 
delta = (rand()%30000)+100;
ADDUSEC2TIMESPEC(delta, &t);
TIMESPEC_ASSIGN(&last_random_time, &t);
kern_event_post(&last_random_time, random_event, NULL);
}
 
void perftest_printdata(void *arg)
{
kern_printf("\n°°° max=%ld sum=%ld n=%d °°°",max,sum,n);
}
 
int main(int argc, char **argv)
{
PID p2; //p1,p3; //,p4,p5,p6;
HARD_TASK_MODEL m;
// NRT_TASK_MODEL m_nrt;
// SOFT_TASK_MODEL m_aper;
SOFT_TASK_MODEL m_soft;
int i;
struct timespec fineprg;
 
sys_atrunlevel(exiting, NULL, RUNLEVEL_SHUTDOWN);
sys_atrunlevel(perftest_printdata, NULL, RUNLEVEL_BEFORE_EXIT);
 
kern_printf("\n\n");
 
srand(1234);
NULL_TIMESPEC(&last_random_time);
i = rand()%30000+2000;
ADDUSEC2TIMESPEC(i, &last_random_time);
// last_random_time.tv_sec = 2;
// last_random_time.tv_nsec = 0;
kern_cli();
kern_event_post(&last_random_time, random_event, NULL);
kern_sti();
 
hard_task_default_model(m);
hard_task_def_wcet(m,ASTER_WCET);
hard_task_def_mit(m,10000);
hard_task_def_group(m,1);
hard_task_def_ctrl_jet(m);
 
// nrt_task_default_model(m_nrt);
// nrt_task_def_group(m_nrt,1);
// nrt_task_def_ctrl_jet(m_nrt);
 
soft_task_default_model(m_soft);
soft_task_def_met(m_soft,1000);
soft_task_def_period(m_soft,100000);
soft_task_def_group(m_soft,1);
soft_task_def_ctrl_jet(m_soft);
soft_task_def_aperiodic(m_soft);
 
/*
p1 = task_create("Aster",aster,&m,NULL);
if (p1 == -1) {
perror("test7.c(main): Could not create task <aster> ...");
sys_end();
l1_exit(-1);
}
*/
hard_task_def_mit(m,500000);
hard_task_def_wcet(m,CLOCK_WCET);
p2 = task_create("Clock",clock,&m,NULL);
if (p2 == -1) {
perror("test7.c(main): Could not create task <Clock> ...");
sys_end();
l1_exit(-1);
}
/*
// p3 = task_create("JetControl",jetcontrol,&m_nrt,NULL);
p3 = task_create("JetControl",jetcontrol,&m_soft,NULL);
if (p3 == -1) {
perror("test7.c(main): Could not create task <JetControl> ...");
sys_end();
l1_exit(-1);
}
 
soft_task_default_model(m_aper);
soft_task_def_wcet(m_aper,APER_WCET);
soft_task_def_ctrl_jet(m_aper);
soft_task_def_system(m_aper);
soft_task_def_aperiodic(m_aper);
 
for (i=0; i<APER_MAX; i++) {
soft_task_def_level(m_aper, i/4 + 2);
soft_task_def_arg(m_aper, (void *)(i/4 ? 'Û' : '±'));
aper_table[i] = task_create("aper",aper_asteroid,&m_aper,NULL);
if (aper_table[i] == -1) {
perror("test7.c(main): Could not create task <aper> ...");
sys_end();
l1_exit(-1);
}
}
*/
task_nopreempt();
fineprg.tv_sec = 6;
fineprg.tv_nsec = 0;
kern_event_post(&fineprg,fine,NULL);
group_activate(1);
return 0;
}
 
/unsupported/tags/rel_0_5/perf/perf4.c
0,0 → 1,112
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: perf4.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:39 $
------------
 
Performance test 1:
 
there is one RR task that is preempted N_EDF times by an EDF task.
 
the test prints the differences of the execution time.
 
the test have to be compiled with the one shot timer, and it does not
use any init file.
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/rr.h"
#include "modules/dummy.h"
#include "modules/pi.h"
 
#define TIMESPEC_N 100
#define RR_N 1000000000
#define EDF_N 2500
 
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(1000*1000*1000, RR_MAIN_NO, mb);
RR_register_level(10000, RR_MAIN_YES, mb);
dummy_register_level();
 
PI_register_module();
 
return 1200;
}
 
void *crash_RR(void *arg);
void *crash_EDF(void *arg);
 
void *__init__(void *arg)
{
TIME t1, t2;
PI_mutexattr_t a;
mutex_t m1;
int i;
 
PI_mutexattr_default(a);
 
mutex_init(&m1, &a);
 
t1 = sys_gettime(NULL);
for (i=0; i<1000; i++) {
mutex_lock(&m1);
mutex_unlock(&m1);
}
t2 = sys_gettime(NULL);
 
kern_printf("t1=%ld, t2=%ld\n",t1,t2);
 
return 0;
}
 
// not used !!!
int main(int argc, char **argv)
{
return 0;
}
/unsupported/tags/rel_0_5/perf/initfile.c
0,0 → 1,133
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:39 $
------------
 
System initialization file
 
The tick is set to TICK ms.
 
This file contains the 2 functions needed to initialize the system.
 
These functions register the following levels:
 
an EDF (Earliest Deadline First) level
a RR (Round Robin) level
a TBS (Total Bandwidth Server) level 0.1 Us
a TBS (Total Bandwidth Server) level 0.3 Us
a CBS (Constant Bandwidth Server) level
a Dummy level
 
The TBS bandwidth is TBS_NUM/TBS_DEN
 
 
It can accept these task models (into () the mandatory fields):
 
HARD_TASK_MODEL (wcet+mit) at level 0
NRT_TASK_MODEL at level 1
SOFT_TASK_MODEL (wcet, periodicity=APERIODIC) at level 2,3
SOFT_TASK_MODEL (met,period) at level 4
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/rr.h"
#include "modules/tbs.h"
#include "modules/cbs.h"
#include "modules/rrsoft.h"
#include "modules/dummy.h"
#include "drivers/keyb.h"
#include "modules/sem.h"
#include "modules/hartport.h"
 
/*+ sysyem tick in us +*/
//#define TICK 300
#define TICK 0
 
#define RRTICK 5000
#define TBS_NUM 1
#define TBS_DEN 10
 
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM, TBS_DEN);
TBS_register_level(TBS_ENABLE_ALL, 0, TBS_NUM*3, TBS_DEN);
CBS_register_level(CBS_ENABLE_ALL, 0);
 
/* RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD);
RR_register_level(RRTICK, RR_MAIN_NO, mb);
RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //tbs
RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //tbs
RR_register_level(RRTICK, RR_MAIN_YES, mb);
*/
 
dummy_register_level();
 
SEM_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
HARTPORT_init();
 
// KEYB_init(NULL);
 
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/perf/readme
0,0 → 1,10
Hi,
 
these are some performance tests that I used to get some rough values
for my master thesis.
 
For more informations, please look on the S.Ha.R.K. website.
 
Enjoy,
 
PJ
/unsupported/tags/rel_0_5/perf/makefile
0,0 → 1,22
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS+= perf1 perf2 perf3 perf4
 
include $(BASE)/config/example.mk
 
perf1:
make -f $(SUBMAKE) BASE=$(BASE) APP=perf1 INIT= OTHEROBJS= SHARKOPT=__OLDCHAR__
perf2:
make -f $(SUBMAKE) BASE=$(BASE) APP=perf2 INIT= OTHEROBJS=initfile.o SHARKOPT=__OLDCHAR__
perf3:
make -f $(SUBMAKE) BASE=$(BASE) APP=perf3 INIT= OTHEROBJS=initfile.o SHARKOPT=__OLDCHAR__
perf4:
make -f $(SUBMAKE) BASE=$(BASE) APP=perf4 INIT= OTHEROBJS= SHARKOPT=__OLDCHAR__
 
/unsupported/tags/rel_0_5/perf/perf1.c
0,0 → 1,187
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
 
/**
------------
CVS : $Id: perf1.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:39 $
------------
 
Performance test 1:
 
there is one RR task that is preempted N_EDF times by an EDF task.
 
the test prints the differences of the execution time.
 
the test have to be compiled with the one shot timer, and it does not
use any init file.
 
NOTE: after the task_sleep() removal, the test may be "not so correct".
That is because also the task end is accounted into the EDF time.
 
**/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#define TIMESPEC_N 100
#define RR_N 1000000000
#define EDF_N 2500
 
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
RR_register_level(1000*1000*1000, RR_MAIN_NO, mb);
RR_register_level(10000, RR_MAIN_YES, mb);
dummy_register_level();
 
return 300;
}
 
void *crash_RR(void *arg);
void *crash_EDF(void *arg);
 
void *__init__(void *arg)
{
int i;
 
PID p1,p2;
 
HARD_TASK_MODEL m_hard;
NRT_TASK_MODEL m_nrt;
 
TIME t[TIMESPEC_N];
 
// JET data
TIME sum, max, curr;
int nact;
 
 
 
hard_task_default_model(m_hard);
hard_task_def_mit (m_hard,2000);
hard_task_def_wcet (m_hard,1000);
hard_task_def_group (m_hard,1);
hard_task_def_ctrl_jet (m_hard);
 
nrt_task_default_model (m_nrt);
nrt_task_def_group (m_nrt,1);
nrt_task_def_ctrl_jet (m_nrt);
 
p1 = task_create("crash_EDF",crash_EDF,&m_hard,NULL);
if (p1 == -1) {
perror("Could not create task <crask_EDF> ...");
sys_end();
}
 
p2 = task_create("crash_RR",crash_RR,&m_nrt,NULL);
if (p2 == -1) {
perror("Could not create task <crask_RR> ...");
sys_end();
}
 
kern_cli();
/* timespec read time */
for (i=0; i<TIMESPEC_N; i++) {
t[i] = kern_gettime(NULL);
}
kern_sti();
 
kern_printf("\n");
for (i=0; i<TIMESPEC_N; i++) {
kern_printf("%d: %ld Û", i, t[i]);
}
kern_printf("\n");
 
task_activate(p2);
 
jet_getstat(p2, &sum, &max, &nact, &curr);
kern_printf("RR test (alone): sum=%ld, max=%ld, nact=%d, curr=%ld\n",
sum, max, nact, curr);
jet_delstat(p2);
 
group_activate(1);
 
jet_getstat(p2, &sum, &max, &nact, &curr);
kern_printf("\nRR test : sum=%ld, max=%ld, nact=%d, curr=%ld\n",
sum, max, nact, curr);
jet_getstat(p1, &sum, &max, &nact, &curr);
kern_printf("EDF test : sum=%ld, max=%ld, nact=%d, curr=%ld\n",
sum, max, nact, curr);
 
sys_end();
 
return 0;
}
 
void *crash_RR(void *arg)
{
int i;
 
for (;;) {
for (i=0; i<RR_N; i++);
task_endcycle();
}
return 0;
}
 
void *crash_EDF(void *arg)
{
int i;
 
for (i=0; i<EDF_N; i++)
task_endcycle();
 
return 0;
}
 
// not used!!!
int main(int argc, char **argv)
{
return 0;
}
 
 
 
 
/unsupported/tags/rel_0_5/telesco/initfile.c
0,0 → 1,133
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:39 $
------------
 
System initialization file
 
This file contains the 2 functions needed to initialize the system.
 
These functions register the following levels:
 
an EDF (Earliest Deadline First) level
a RR (Round Robin) level
a CBS (Costant Bandwidth Server) level
a Dummy level
 
It can accept these task models:
 
HARD_TASK_MODEL (wcet+mit) at level 0
SOFT_TASK_MODEL (met, period) at level 1
NRT_TASK_MODEL at level 2
 
This file is similar to the configuration of kernel/init/hartik3.c
 
TICK is set to 0 (one-shot timer is used)
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
int argc;
char *argv[100];
 
void read_cfg_file(int argc, char **argv);
 
int main(int argc, char **argv);
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
__compute_args__(mb, &argc, argv);
 
read_cfg_file(argc, argv);
 
//read_cfg_file(argc, argv);
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
//__call_main__(mb);
return (void *)main(argc,argv);
//return (void *)0;
}
 
/unsupported/tags/rel_0_5/telesco/tel.c
0,0 → 1,709
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Bera Marco mbera@libero.it
* Varasio Gabriele varasio@odino.unipv.it
*
* Universita' degli studi di Pavia
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/**
------------
CVS : $Id: tel.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:39 $
------------
**/
 
/*
* Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
/****************************************************************/
/* PERIODIC PROCESS TEST */
/****************************************************************/
 
#include <ll/i386/x-dos.h>
#include <kernel/kern.h>
#include <modules/cabs.h>
#include <drivers/glib.h>
#include <drivers/keyb.h>
#include <math.h>
#include <semaphore.h>
#include <stdlib.h>
#include "moon.h"
 
 
#define N_MAX_TELESCOPI 5
#define X0 10
#define pi 3.14
#define ex 2.71
#define NCAB N_MAX_TELESCOPI+1
#define dim_msg 8
#define dim_x 49
#define dim_y 49
#define radius 9
#define Y_TELESCOPI 300
/* task periods */
#define PERIOD_T1 80000
#define PERIOD_T4 100000
#define PERIOD_T5 100000
#define WCET_T 5000
int period_t1=0;
#define SOGLIA 8
 
char *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4","cab5","cab6"};
 
// posizioni dei telescopi e rispettivi poli
 
int x[5] = {100, 200, 300, 400,500};
//double poli[5]={-50,-30,-1, -20, -5};
double poli[5];
// guadagno proporzionale
double kp=0.0;
// flag per rilevare la pressione del tasto spazio
int numero_telescopi=0;
int flag=0;
KEY_EVT move_tasto;
// Immagini ausiliarie per il disegno della luna
BYTE lunabkg[900];
BYTE lunadest[900];
 
 
/* A semaphore used to access Video Cards in mutual exclusion */
sem_t mutex;
sem_t mutex_tasto;
 
/***************************************************************/
 
// cab necessari allo scambio delle coordinate dell'oggetto e delle
// immagini dei rispettivi telescopi
 
CAB cid[NCAB];
 
// vettori per memorizzare le immagini
BYTE videobuf[dim_x*dim_y];
BYTE videobuf1[dim_x*dim_y];
BYTE videobuf2[dim_x*dim_y];
BYTE videobuf3[dim_x*dim_y];
BYTE videobuf4[dim_x*dim_y];
BYTE videobuf5[dim_x*dim_y];
 
// Variabili per il disegno delle stelle sullo sfondo
int num_p;
int y_p[7];
int x_p[7];
int dim_p[7];
int col_p[7];
 
 
 
TASK media(void *arg)
{
char *p;
 
int i=0;
int j=0;
while(1)
{
p = cab_getmes(cid[1]);
memcpy(videobuf,p,dim_x*dim_y*sizeof(BYTE));
cab_unget(cid[1], p);
p = cab_getmes(cid[2]);
memcpy(videobuf1,p,dim_x*dim_y*sizeof(BYTE));
cab_unget(cid[2], p);
p = cab_getmes(cid[3]);
memcpy(videobuf2,p,dim_x*dim_y*sizeof(BYTE));
cab_unget(cid[3], p);
p = cab_getmes(cid[4]);
memcpy(videobuf4,p,dim_x*dim_y*sizeof(BYTE));
cab_unget(cid[4], p);
 
p = cab_getmes(cid[5]);
memcpy(videobuf5,p,dim_x*dim_y*sizeof(BYTE));
cab_unget(cid[5], p);
 
// calcolo media
 
for (i=0;i<dim_x;i++)
{
for(j=0;j<dim_y;j++)
{
videobuf3[i*dim_x+j]=(double)(videobuf[i*dim_x+j]+videobuf1[i*dim_x+j]+videobuf2[i*dim_x+j]+videobuf4[i*dim_x+j]+videobuf5[i*dim_x+j])/numero_telescopi;
}
}
 
// visualizza immagine mediata
sem_wait(&mutex);
grx_putimage(570,10,570+dim_x-1,10+dim_y-1,videobuf3);
sem_post(&mutex);
task_endcycle();
}
}
 
TASK move(void *arg)
{
//int i = (int)arg;
char *p;
int x_object=300; // posizione dell'oggetto da rilevare
int y_object=200;
// variabile contatore
int z=0;
char coord_x[dim_msg];
p = cab_reserve(cid[0]);
sprintf(coord_x,"%d %d",x_object,y_object);
memcpy(p,coord_x,dim_msg*sizeof(char));
cab_putmes(cid[0], p);
 
//Normalizzazione
for(z=0;z<900;z++)
{
if (luna[z]>0)
{
luna[z]=((luna[z])*16.0/255.0)+16;
}
 
}
 
 
task_endcycle();
while (1)
{
 
// Cancellazione Luna
sem_wait(&mutex);
grx_box(x_object-15,y_object-15,x_object+14,y_object+14,0);
sem_post(&mutex);
if (keyb_getcode(&move_tasto,NON_BLOCK))
{
if (move_tasto.ascii=='4')
x_object=x_object-5;
if (move_tasto.ascii=='6')
x_object=x_object+5;
if (move_tasto.ascii=='2')
y_object=y_object+5;
if (move_tasto.ascii=='8')
y_object=y_object-5;
if (move_tasto.ascii=='9'){
y_object=y_object-5;
x_object=x_object+5; }
if (move_tasto.ascii=='1'){
y_object=y_object+5;
x_object=x_object-5; }
if (move_tasto.ascii=='7'){
y_object=y_object-5;
x_object=x_object-5; }
if (move_tasto.ascii=='3'){
y_object=y_object+5;
x_object=x_object+5;}
if (move_tasto.ascii==' '){
sem_wait(&mutex_tasto);
flag=1;
if(numero_telescopi<N_MAX_TELESCOPI)
{
numero_telescopi++;
}
sem_post(&mutex_tasto);
}
//CONTROLLI SULLA POSIZIONE
if(y_object<(dim_y/2+70)) y_object=dim_y/2+70;
if(y_object>(240-dim_y/2)) y_object=(240-dim_y/2);
if(x_object<(dim_x/2+20 )) x_object=dim_x/2+20;
if(x_object>(630-dim_x/2-10)) x_object=(630-dim_x/2-10);
}
p = cab_reserve(cid[0]);
sprintf(coord_x,"%d %d",x_object,y_object);
memcpy(p,coord_x,dim_msg*sizeof(char));
cab_putmes(cid[0], p);
 
for(z=0;z<7;z++)
{
if (sqrt(pow((x_object-x_p[z]),2)+pow((y_object-y_p[z]),2))<20+dim_p[z]+radius)
grx_disc(x_p[z],y_p[z],dim_p[z],col_p[z]);
}
 
sem_wait(&mutex);
// Gestione sfondo
grx_getimage(x_object-15,y_object-15,x_object+14, y_object+14,lunabkg);
for(z=0;z<900;z++)
{
if( luna[z]==0 && lunabkg!=0 )
{
lunadest[z]=lunabkg[z];
}
else
{
lunadest[z]=luna[z];
}
}
grx_putimage(x_object-15,y_object-15,x_object+14, y_object+14,lunadest);
sem_post(&mutex);
task_endcycle();
}
}
 
 
TASK tele(void *arg)
{
int i = (int)arg;
int passi;
char s[100];
int x_object=300; // posizione dell'oggetto da rilevare
int y_object=200;
int x_start=500; // posizione iniziale dei telescopi
int y_start=190;
int x_current=x_start; // posizione corrente dei telescopi
int y_current=y_start;
int x_current_d[9];
int y_current_d[9];
int y= Y_TELESCOPI; // coordinata y dei telescopi
double alpha_new=atan((y-(double)y_current)/((x[i]-(double)x_current)));
double alpha=alpha_new;
double distance=0.0;
double alpha_target=0.0;
double tc=0.1;
double u=0.0;
double u_old=0.0;
double errore=0.0;
double delta_x=0;
double delta_y=0;
 
char *p;
//int j=0;
// indice matrice per aggiunta di rumore
int k=0;
int q=0;
double polo=poli[i];
int val=0;
 
 
 
BYTE videobuf[dim_x*dim_y];
 
passi = 0;
//srand(i);
//srand(i+sys_gettime(NULL));
alpha_target=atan((y-(double)y_object)/((double)x_object-x[i]));
sem_wait(&mutex);
grx_text("targ",4,340,12,0);
sprintf(s,"%f",poli[i]);
grx_text(s,x[i],y+60,12,0);
grx_text("polo",4,y+60,12,0);
grx_text("new",4,y+50,12,0);
sprintf(s,"%1.6f",alpha_target);
grx_text(s, x[i]-25,y+50,12,0);
grx_rect(x[i]-40,y+25,x[i]+40,y+85,2);
grx_rect(x[i]-40,y+90,x[i]+40,y+150,2);
sem_post(&mutex);
 
// Disegno telescopio
grx_disc(x[i],y,19,i+1);
grx_box( x[i]-19,y,x[i]+19,y+20,i+1);
 
 
task_endcycle();
 
while (1) {
// legge di controllo
passi++;
//sprintf(s,"%d",passi);
//grx_text(s, 50,110,12,0);
p = cab_getmes(cid[0]);
sscanf(p,"%d %d",&val,&y_object);
cab_unget(cid[0], p);
x_object=val;
alpha_target=atan((y-(double)y_object)/((double)x_object-x[i]));
if (alpha_target <0)
{
alpha_target=3.14+alpha_target;
}
errore=alpha_target-alpha_new;
u=u_old+kp*tc*errore;
//alpha_new=0.13*alpha+0.87*u;
alpha_new=(exp(polo*tc))*alpha+(1-exp(polo*tc))*u;
u_old=u;
alpha=alpha_new;
// implementazione dei limiti degli attuattori
if (alpha_new > 3.14)
alpha_new=3.14;
if (alpha_new <0)
alpha_new=0;
 
distance=sqrt(((y-y_object)*(y-y_object))+((x_object-x[i])*(x_object-x[i])));
sem_wait(&mutex);
// Cancello braccio telescopio
if (passi>1)
{
for (k=0; k<9 ; k++)
{
grx_line(delta_x,delta_y,x_current_d[k],y_current_d[k],0);
}
}
x_current=x[i]+distance*cos(alpha_new);
y_current=300-distance*sin(alpha_new);
 
// lettura immagine
grx_getimage(x_current-(dim_x/2),y_current-(dim_y/2),x_current+(dim_x/2),y_current+(dim_y/2),videobuf);
//aggiunta rumore
 
sem_post(&mutex);
for (k=0;k<dim_x;k++)
{
for(q=0;q<dim_y;q++)
{
int num=0;
num=rand();
num=(num%10)+1;
if (num>SOGLIA)
{
videobuf[k*dim_x+q]=videobuf[k*dim_x+q]+1;
}
}
}
sem_wait(&mutex);
 
grx_putimage(x[i]-25,y+92,x[i]-25+dim_x-1,y+92+dim_y-1,videobuf);
sprintf(s,"%3.4f",(180*(alpha_target/pi)));
grx_text(s, x[i]-25,y+40,12,0);
sprintf(s,"%3.4f",180*(alpha_new/pi));
grx_text(s, x[i]-25,y+50,12,0);
 
delta_x=x[i]+20*cos(alpha_new);
delta_y=y-20*sin(alpha_new);
 
for ( k=0; k<9 ; k++) {
x_current_d[k]=x[i]+50*cos(alpha_new+(k-4)*0.01);
y_current_d[k]=300-50*sin(alpha_new+(k-4)*0.01); }
 
// Disegno braccio telescopio
for(k=0 ; k<9 ; k++)
grx_line(delta_x,delta_y,x_current_d[k],y_current_d[k],i+1);
 
sem_post(&mutex);
// scrive immagine nel cab
p = cab_reserve(cid[i+1]);
memcpy(p,videobuf,dim_x*dim_y*sizeof(BYTE));
cab_putmes(cid[i+1], p);
 
task_endcycle();
 
}
 
}
 
 
/****************************************************************/
 
/* This is the exception handler. It is called when an exception
is raised.
It exits from the graphical mode, then it prints a message and
shutdown the kernel using sys_abort()
*/
 
void demo_exc_handler(int signo, siginfo_t *info, void *extra)
{
struct timespec t;
 
grx_close();
 
/* Default action for an kern exception is */
kern_cli();
ll_gettime(TIME_EXACT, &t),
kern_printf("\nS.Ha.R.K. Exception raised!!!"
"\nTime (s:ns) :%ld:%ld"
"\nException number:%d (numbers in include/bits/errno.h)"
"\nPID :%d\n",
t.tv_sec, t.tv_nsec, info->si_value.sival_int,
info->si_task);
sys_abort(1);
}
 
/******************************************************************/
 
/* This function is called when Alt-X is pressed.
It simply shutdown the system using sys_end.
Note that the byebye() function is called only if we exit from
the system using sys_end()!!!!
*/
void my_end(KEY_EVT* e)
{
sys_end();
}
 
/******************************************************************/
 
/* This function is called when the system exit correctly after Alt-X.
It exits from the graphic mode and then it prints a small greeting.
Note that:
- The function calls grx_exit, so it must be registered using
RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
at that point the kernel is already returned in real mode!!!)
- When an exception is raised, the exception handler is called.
Since the exception handler already exits from the graphic mode,
this funcion has not to be called. For this reason:
. we registered byebye using the flag NO_AT_ABORT
. the exception handler exits using sys_abort; in that way byebye is
NOT called
*/
 
void byebye(void *arg)
{
grx_close();
kern_printf("Bye Bye!\n");
}
 
/****************************** MAIN ******************************/
 
int main(int argc, char **argv)
{
PID pid1, pid4,pid5;
KEY_EVT emerg;
int i=0;
int z=0; // contatore per disegno dei pianeti
HARD_TASK_MODEL m1, m4,m5;
//FILE *fp;
 
struct sigaction action;
 
cid[0] = cab_create(cname[0], dim_msg, 5);
cid[1] = cab_create(cname[1], dim_x*dim_y, 3);
cid[2] = cab_create(cname[2], dim_x*dim_y, 3);
cid[3] = cab_create(cname[3], dim_x*dim_y, 3);
cid[4] = cab_create(cname[4], dim_x*dim_y, 4);
cid[5] = cab_create(cname[5], dim_x*dim_y, 3);
cid[6] = cab_create(cname[6], dim_x*dim_y, 3);
 
/*fp=fopen("file.txt","r");
fscanf(fp,"%d",a);
fclose(fp);
*/
 
/* Init the standard S.Ha.R.K. exception handler */
action.sa_flags = SA_SIGINFO; /* Set the signal action */
action.sa_sigaction = demo_exc_handler;
action.sa_handler = 0;
sigfillset(&action.sa_mask); /* we block all the other signals... */
 
if (sigaction(SIGHEXC, &action, NULL) == -1) { /* set the signal */
perror("Error initializing signals...");
sys_end();
}
 
/* Set the closing function */
sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT|NO_AT_ABORT);
 
/* Initializes the semaphore */
sem_init(&mutex,0,1);
 
/* graphic card Initialization */
if (grx_init() < 1) {
sys_abort(1);
}
 
if (grx_open(640, 480, 8) < 0) {
kern_printf("GRX Err\n");
sys_abort(1);
}
kern_printf("Video card ok!\n");
 
 
/* set the keyboard handler to exit correctly */
emerg.ascii = 'x';
emerg.scan = KEY_X;
emerg.flag = ALTL_BIT;
keyb_hook(emerg,my_end);
 
srand(i+sys_gettime(NULL));
 
emerg.ascii = 'x';
emerg.scan = KEY_X;
emerg.flag = ALTR_BIT;
keyb_hook(emerg,my_end);
sem_wait(&mutex);
/* a small banner */
grx_clear(0);
 
grx_text("REALTIME TELESCOPES di Marco Bera e Gabriele Varasio",8,8,WHITE,0);
grx_text("Premere Spazio per creare un telescopio",8,22,WHITE,0);
grx_text("Premere Alt-X per uscire",8,32,WHITE,0);
grx_text("Usare il tastierino numerico per muovere l'oggetto",8,42,WHITE,0);
 
// DISEGNARE BORDI
grx_rect(1,1,638,478,2);
grx_rect(558,1,638,61,2);
grx_rect(1,1,638,61,2);
 
 
// Disegno sfondo
for(z=0;z<7;z++)
{
num_p=rand();
y_p[z]=100+((num_p%130)+1);
x_p[z]=50+((num_p%540)+1);
dim_p[z]=2+((num_p%5)+1);
col_p[z]=((num_p%10)+1);
grx_disc(x_p[z],y_p[z],dim_p[z],col_p[z]);
}
sem_post(&mutex);
 
 
hard_task_default_model(m4);
hard_task_def_ctrl_jet (m4);
hard_task_def_arg (m4, (void *)3);
hard_task_def_wcet (m4, 19000);
hard_task_def_mit (m4, PERIOD_T4);
hard_task_def_group (m4,1);
pid4 = task_create("move", move, &m4, NULL);
if (pid4 == NIL) {
grx_close();
perror("Could not create task <move>");
sys_abort(1);
}
task_activate(pid4);
hard_task_default_model(m5);
hard_task_def_ctrl_jet (m5);
hard_task_def_arg (m5, (void *)3);
hard_task_def_wcet (m5, 19000);
hard_task_def_mit (m5, PERIOD_T5);
hard_task_def_group (m5,1);
pid5 = task_create("media", media, &m5, NULL);
 
if (pid5 == NIL) {
grx_close();
perror("Could not create task <move>");
sys_abort(1);
}
task_activate(pid5);
/* and finally we activate the three threads... */
 
 
do {
int val_flag=0;
sem_wait(&mutex_tasto);
val_flag=flag;
sem_post(&mutex_tasto);
 
if ((val_flag==1) && (i < N_MAX_TELESCOPI))
{
flag=0;
hard_task_default_model(m1);
hard_task_def_ctrl_jet (m1);
hard_task_def_arg (m1, (void *)i);
hard_task_def_wcet (m1, WCET_T);
// hard_task_def_mit (m1, PERIOD_T1);
hard_task_def_mit (m1, period_t1);
 
hard_task_def_group (m1,1);
pid1 = task_create("tele1", tele, &m1, NULL);
if (pid1 == NIL)
{
grx_close();
perror("Could not create task <tele1>");
sys_abort(1);
}
task_activate(pid1);
i++;
}
} while (1);
 
/*
now the task main ends, but the system does not shutdown because
there are others.
 
The demo will finish if a Alt-X key is pressed.
*/
 
return 0;
}
/*********** lettura da file ********************/
void read_cfg_file(int argc, char **argv)
{
int err;
DOS_FILE *fp;
char myfilebuf[1000];
int myfilebuf_length;
 
if (2)
{
fp = DOS_fopen("dati.cnf","r");
 
if (fp)
{
/* read up to 1000 chars */
myfilebuf_length = DOS_fread(&myfilebuf,1,1000,fp);
/* check for errors */
err = DOS_error();
cprintf("Read %d bytes...\n", myfilebuf_length);
if (err)
{
cprintf("Error %d reading file...Using default values\n", err);
}
else
{
//geti(myfilebuf, &pos, &NMouses); // Number of Mouses
sscanf(myfilebuf,"%lf %lf %lf %lf %lf %lf %d",&poli[0],&poli[1],&poli[2],&poli[3],&poli[4],&kp,&period_t1);
}
DOS_fclose(fp);
return;
}
else {
/* error!! */
err = DOS_error();
/* note that if you call DOS_error() here, it return 0!!! */
cprintf("Error %d opening myfile.txt...Using default values\n", err);
}
 
}
else {
cprintf("Wrong number of arguments...\n");
l1_exit(0);
}
}
 
 
/****************************************************************/
/unsupported/tags/rel_0_5/telesco/dati.cnf
0,0 → 1,3
-1 -20 -30 -40 -50 0.5 100000
# 5 poli kp(guadagno) periodo telescopio
 
/unsupported/tags/rel_0_5/telesco/makefile
0,0 → 1,16
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= tel
 
include $(BASE)/config/example.mk
 
tel:
make -f $(SUBMAKE) APP=tel INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
 
/unsupported/tags/rel_0_5/telesco/moon.h
0,0 → 1,43
// Immagine luna
BYTE luna[900]={
0, 0 , 0, 0, 0, 0, 0, 0, 4, 57, 212, 228, 204, 214, 235, 237, 208, 190, 179, 197, 229, 89, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 208, 213, 178, 155, 139, 129, 123, 169, 170, 173, 157,
191, 209, 236, 215, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 36, 103, 146, 116, 93, 143, 119, 96,
134, 123, 117, 120, 113, 102, 93, 156, 210, 184, 66, 4, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 83, 88,
72, 156, 144, 127, 99, 87, 91, 156, 158, 124, 144, 120, 109, 119, 175, 167, 180, 119, 3, 0,
0, 0, 0, 0, 0, 5, 56, 59, 63, 58, 138, 104, 71, 46, 55, 68, 79, 89, 172, 146, 141, 152, 110, 126,
134, 179, 148, 145, 134, 4, 0, 0, 0, 0, 4, 32, 58, 50, 49, 56, 105, 58, 38, 42, 45, 69, 64, 93,
144, 155, 157, 147, 95, 111, 122, 158, 162, 174, 171, 79, 4, 0, 0, 0, 4, 67, 49, 47, 54, 63,
51, 55, 43, 38, 48, 62, 55, 86, 89, 145, 92, 60, 99, 72, 97, 130, 184, 169, 195, 171, 3, 0, 0,
3, 77, 52, 37, 51, 72, 54, 63, 48, 46, 46, 48, 55, 54, 92, 95, 80, 55, 47, 47, 52, 56, 170, 187,
196, 190, 177, 190, 6, 0, 45, 84, 38, 40, 79, 73, 56, 43, 41, 46, 45, 51, 74, 98, 89, 68, 89,
46, 40, 48, 45, 38, 171, 176, 152, 165, 133, 157, 107, 3, 154, 42, 34, 42, 68, 66, 47, 52, 62,
55, 60, 50, 56, 50, 106, 127, 74, 38, 39, 58, 38, 42, 116, 87, 128, 148, 69, 59, 170, 2, 100,
41, 31, 38, 41, 53, 53, 62, 63, 64, 62, 65, 63, 58, 105, 71, 60, 57, 44, 43, 38, 36, 81, 58, 125,
205, 61, 43, 130, 37, 88, 39, 31, 33, 43, 52, 76, 66, 97, 116, 101, 96, 90, 56, 76, 47, 43, 135,
46, 87, 40, 30, 33, 37, 84, 152, 86, 43, 131, 81, 131, 36, 35, 33, 36, 53, 91, 73, 124, 145,
132, 95, 80, 50, 45, 45, 35, 49, 70, 59, 32, 30, 30, 30, 39, 75, 158, 92, 133, 138, 151, 41,
39, 38, 39, 82, 125, 59, 89, 98, 84, 64, 68, 40, 104, 107, 85, 78, 115, 75, 34, 43, 39, 36, 47,
78, 98, 142, 104, 122, 155, 49, 32, 36, 32, 57, 71, 58, 85, 97, 69, 49, 53, 40, 88, 124, 133,
169, 141, 94, 40, 40, 46, 53, 52, 81, 49, 77, 107, 122, 146, 79, 31, 38, 31, 37, 37, 51, 64,
59, 84, 72, 64, 96, 88, 132, 153, 158, 154, 149, 140, 109, 77, 125, 120, 54, 51, 59, 123, 86,
111, 122, 35, 44, 35, 34, 38, 63, 55, 55, 87, 76, 103, 133, 148, 146, 160, 151, 145, 163, 194,
92, 104, 136, 109, 54, 46, 65, 123, 53, 160, 144, 56, 46, 41, 39, 39, 91, 41, 47, 70, 75, 57,
112, 116, 140, 168, 179, 161, 164, 188, 123, 100, 145, 162, 87, 51, 111, 140, 5, 172, 148,
134, 86, 72, 75, 48, 50, 40, 45, 53, 106, 60, 108, 137, 135, 160, 157, 152, 169, 179, 191,
109, 70, 150, 122, 94, 104, 128, 4, 167, 144, 140, 103, 98, 116, 64, 56, 84, 62, 60, 59, 48,
80, 150, 143, 151, 187, 161, 147, 178, 219, 79, 69, 163, 132, 87, 108, 128, 0, 83, 195, 195,
125, 138, 67, 35, 106, 98, 90, 58, 44, 60, 131, 161, 152, 178, 157, 149, 164, 164, 177, 107,
119, 129, 119, 145, 133, 104, 0, 5, 181, 233, 190, 150, 78, 43, 62, 63, 87, 50, 53, 46, 81,
157, 187, 155, 181, 189, 145, 166, 211, 170, 137, 166, 189, 188, 164, 5, 0, 0, 5, 167, 175,
193, 193, 108, 114, 63, 118, 139, 125, 130, 202, 209, 221, 213, 180, 172, 201, 170, 175,
186, 177, 210, 236, 204, 14, 0, 0, 0, 3, 62, 166, 183, 166, 106, 139, 102, 129, 179, 206, 212,
240, 232, 224, 210, 208, 196, 173, 179, 177, 186, 191, 227, 185, 100, 2, 0, 0, 0, 0, 5, 125,
196, 143, 163, 169, 169, 152, 181, 212, 239, 241, 237, 234, 217, 180, 206, 188, 199, 188,
194, 202, 164, 120, 4, 0, 0, 0, 0, 0, 0, 5, 123, 180, 145, 147, 184, 184, 197, 223, 232, 224,
227, 227, 220, 190, 179, 192, 192, 197, 204, 165, 120, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 74, 162,
135, 153, 176, 178, 204, 235, 232, 235, 231, 212, 201, 190, 189, 196, 202, 189, 70, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 182, 167, 170, 184, 208, 218, 215, 206, 209, 179, 205, 196, 188,
184, 193, 12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 103, 202, 197, 201, 208, 235, 217, 203,
197, 188, 185, 217, 131, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 89, 130, 218,
195, 179, 165, 102, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/unsupported/tags/rel_0_5/autostr/autostr.c
0,0 → 1,1171
/***************************************************************************
**************************************************************************
*** Universita' di Pavia ***
*** Corso : Informatoca Industriale ***
**************************************************************************
*** Progetto : MONITORAGGIO AUTOSTRADA ***
**************************************************************************
*** Realizzato da : Nino Verzellesi e Quadrubbi Giacomo ***
**************************************************************************
***************************************************************************/
 
 
/* ----------------------------------------------------------------------------- */
 
#include <kernel/kern.h>
#include <drivers/glib.h>
#include <drivers/keyb.h>
#include <semaphore.h>
#include <stdlib.h>
#include <math.h>
 
/* ----------------------------------------------------------------------------- */
 
 
/********************* DEFINIZIONE DELLE COSTANTI **************************/
 
#define ESC 27 /* codice ASCII del tasto ESCAPE */
#define MAX_V 35 /* massimo numero di veicoli */
#define GRUPPO 1
#define LUNGCAMION 40 /* lunghezza del camion */
#define LARGCAMION 10 /* larghezza del camion */
#define LUNGLENTA 16 /* lunghezza della macchina lenta */
#define LARGLENTA 8 /* larghezza della macchina lenta */
#define LUNGVELOCE 20 /* lunghezza della macchina veloce */
#define LARGVELOCE 8 /* larghezza della macchina veloce */
#define DT 0.04 /* passo del campionamento */
#define CENTROCORSIA1 477 /* coordinata del centro della corsia 1 */
#define CENTROCORSIA2 459 /* coordinata del centro della corsia 2 */
#define CENTROCARREGGIATA 469 /* coordinata del centro della carreggiata */
 
 
/* ----------------------------------------------------------------------------- */
 
 
/****************** DEFINIZIONE DELLE VARIABILI GLOBALI ********************/
 
double tick = 1.0; /* system tick = 1 ms */
int periodo = 40000; /* periodo */
int wcet = 1000; /* deadline */
PID pid;
sem_t mutex; /* semaforo per la grafica */
sem_t strada; /* semaforo per le variabili corsia1 e corsia2 */
int MAX_X; /* dimensione x della modalita' di visualizzazione dello schermo */
int MAX_Y; /* dimensione y della modalita' di visualizzazione dello schermo */
short corsia1[40000]; /* vettore della corsia1 */
short corsia2[40000]; /* vettore della corsia2 */
int xelic; /* cordinata dell'elicottero */
char c; /* carattere da tastiera */
 
 
/* ----------------------------------------------------------------------------- */
 
 
/****************** FUNZIONE CHE DISEGNA I VEICOLI *************************/
 
void draw_veicolo(int x, int y, int colore,int lunghezza,int larghezza)
{
int u; /* indice di ciclo */
int v; /* variabile ausiliaria per la ricostruzione della segnaletica */
int xreal; /* coordinata di fine veicolo */
 
xreal=x-lunghezza; /* calcola la coordinata di fine veicolo */
if (xreal<0) /* la pone a zero nel caso in cui sia minore di zero (veicolo non ancora interamente entrato in autostrada) */
xreal=0;
 
/* disegna il veicolo nella posizione indicata e con il colore indicato */
sem_wait(&mutex);
grx_box(xreal,(int)(y-larghezza/2),x,(int)(y+larghezza/2),colore);
sem_post(&mutex);
 
/* ricostruisce la segnaletica orrizzontale della strada nel caso in cui si sta' cancellando il veicolo dalla posizione precedente (ridisegna solo quella parte che e' stata cancellata) */
if (colore==0)
for (u=xreal;u<x;u++)
{
v=u%8;
if ((v==0) || (v==1))
{
sem_wait(&mutex);
grx_plot(u,CENTROCARREGGIATA,rgb16(255,255,255));
sem_post(&mutex);
}
}
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/** FUNZIONE CHE CALCOLA LA DISTANZA DAL VEICOLO CHE PRECEDE SULLA CORSIA **/
 
int dist_ant(int pos_x,int pos_y,int distsic)
{
int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
int distant; /* distanza dal veicolo che ci precede */
int fine; /* variabile ausiliaria per capire se sto' arrivando alla fine della strada */
 
/* inizializzazione delle variabili */
libero=0;
distant=0;
 
/* calcola la distanza da un eventuale veicolo che ci precede */
sem_wait(&strada);
if (pos_y<CENTROCARREGGIATA) /* controlla se il veicolo e' nella prima corsia, altrimenti e' in seconda corsia */
while (libero==0 && distant<distsic) /* il calcolo della distanza da un veicolo che ci precede termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
{
fine=pos_x+distant; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
if (fine>40000)
distant=distsic;
else
if (corsia2[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
libero=1;
else
distant++;
}
else /* il veicolo e' nella seconda corsia */
while (libero==0 && distant<distsic) /* il calcolo della distanza da un veicolo che ci precede termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
{
fine=pos_x+distant; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
if (fine>40000)
distant=distsic;
else
if (corsia1[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
libero=1;
else
distant++;
}
sem_post(&strada);
 
return(distant); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/** FUNZIONE CHE CALCOLA LA DISTANZA ANTERIORE DESTRA DI UN VEICOLO CHE PRECEDE **/
 
int dist_ant_dx(int pos_x,int pos_y,int distsicdx)
{
int distantdx; /* distanza dal veicolo che ci precede a destra */
int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
int fine; /* variabile ausiliaria per capire se sto' arrivando alla fine della strada */
 
/* inizializzazione delle variabili */
libero=0;
distantdx=0;
 
sem_wait(&strada);
while (libero==0 && distantdx<distsicdx) /* il calcolo della distanza da un veicolo che ci precede a destra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
{
fine=pos_x+distantdx; /* nel caso in cui il veicolo sia giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
if (fine>40000)
distantdx=distsicdx;
else
if (corsia1[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
libero=1;
else
distantdx++;
}
sem_post(&strada);
 
return(distantdx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/** FUNZIONE CHE CALCOLA LA DISTANZA ANTERIORE SINISTRA DI UN VEICOLO CHE PRECEDE **/
 
int dist_ant_sx(int pos_x,int pos_y,int distsicsx)
{
int distantsx; /* distanza dal veicolo che ci precede a sinistra */
int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
int fine; /* variabile ausiliaria per capire se sto' arrivando alla fine della strada */
 
/* inizializzazione delle variabili */
libero=0;
distantsx=0;
 
sem_wait(&strada);
while (libero==0 && distantsx<distsicsx) /* il calcolo della distanza da un veicolo che ci precede a sinistra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
{
fine=pos_x+distantsx; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia preceduto da nessun veicolo */
if (fine>40000)
distantsx=distsicsx;
else
if (corsia2[fine]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
libero=1;
else
distantsx++;
}
sem_post(&strada);
 
return(distantsx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/** FUNZIONE CHE CALCOLA LA DISTANZA POSTERIORE SINISTRA DI UN VEICOLO CHE INSEGUE **/
 
int dist_postsx (int pos_x,int pos_y,int distsorp)
{
int distpostsx; /* distanza dal veicolo che ci insegue a sinistra */
int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
int inizio; /* variabile ausiliaria per capire se sono all'inizio della strada */
 
/* inizializzazione delle variabili */
distpostsx=0;
libero=0;
 
sem_wait(&strada);
while (libero==0 && distpostsx<distsorp) /* il calcolo della distanza da un veicolo che ci insegue a sinistra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
{
inizio=pos_x-distpostsx; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia insuguito da nessun veicolo */
if (inizio<0)
distpostsx=distsorp;
else
if (corsia2[inizio]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
libero=1;
else
distpostsx++;
}
sem_post(&strada);
 
return(distpostsx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/** FUNZIONE CHE CALCOLA LA DISTANZA POSTERIORE DESTRA DI UN VEICOLO CHE INSEGUE **/
 
int dist_postdx (int pos_x,int pos_y,int distrientro)
{
int distpostdx; /* distanza dal veicolo che ci insegue a destra */
int libero; /* variabile che indica se l'attuale posizione puntata dal veicolo e' libera */
int inizio; /* variabile ausiliaria per capire se sono all'inizio della strada */
 
/* inizializzazione delle variabili */
libero=0;
distpostdx=0;
 
sem_wait(&strada);
while (libero==0 && distpostdx<distrientro) /* il calcolo della distanza da un veicolo che ci insegue a destra termina quando viene trovato un veicolo o si raggiunge la lunghezza massima di visione del sensore */
{
inizio=pos_x-distpostdx; /* nel caso in cui il veicolo si giunto alla fine dell'autostrada si assume che il sensore ritorni un valore come nel caso in cui non sia inseguito da nessun veicolo */
if (inizio<0)
distpostdx=distrientro;
else
if (corsia1[inizio]!=0) /* se la strada e' occupata da un'altro veicolo pongo la variabile libero ad uno (strada occupata), altrimenti in caso contrario incremento la distanza analizzata dal sensore */
libero=1;
else
distpostdx++;
}
sem_post(&strada);
 
return(distpostdx); /* ritorna il valore della distanza misurata dal sensore , se non ha trovato nessun veicolo tale distanza e' pari alla massima lunghezza a cui puo' arrivare il sensore */
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/**************************** TASK AUTO LENTA ******************************/
 
TASK auto_lenta(void *arg)
{
int x; /* posizione x assunta dal veicolo */
int y; /* posizione y assunta dal veicolo */
int oxelic; /* posizione vecchia dell'elicottero */
int ox; /* posizione vecchia x dall'auto lenta */
int oy; /* posizione vecchia y dall'auto lenta */
int k; /* indice di ciclo */
int estremo; /* distanza massima a cui ci possiamo spostare dall'elicottero (sia a destra che a sinistra) */
int sorpasso; /* indica se il veicolo e' in fase di sorpasso */
int rientro; /* indica se il veicolo e' in fase di rientro */
int precedentedritto; /* distanza anteriore da un veicolo */
int od; /* vecchia distanza anteriore da un veicolo */
int tot; /* distanza massima raggiungibile del sensore posteriore sinistro */
int tot3; /* distanza massima raggiungibile del sensore anteriore destro */
int tot2; /* distanza massima raggiungibile del sensore posteriore destro */
int i = (int)arg;
int sensore_ant=200; /* distanza massima raggiungibile del sensore anteriore */
char stri[22]; /* vettore di caratteri */
char ostri[22]; /* vettore di caratteri */
float vcrociera; /* velocita' desiderata */
float vmax2=35.0; /* velocita' massima raggiungibile in seconda corsia */
float vmax1=25.0; /* velocita' massima raggiungibile in prima corsia */
float frenata=-7.0; /* valore massimo della frenata */
float amax=10.0; /* valore massimo dell'accellerazione */
float v; /* velocita' attuale */
float a; /* accellerazione attuale */
float ov; /* velocita' precedente */
float oa; /* accellerazione precedente */
 
/* inizializzazione delle variabili */
v=5.0;
a=0.0;
x=LUNGLENTA;
y=CENTROCORSIA1;
sorpasso=0;
rientro=0;
tot=100;
tot2=150;
tot3=100;
vcrociera=vmax1;
oa=a;
ov=v;
od=0;
oxelic=xelic;
estremo=(int)((MAX_X/2)-1);
 
while (1)
{
/* cancella il veicolo se era presente sull'autostrada vista dall'elicottero */
if (abs(oxelic-ox)<estremo)
draw_veicolo(ox-oxelic+estremo, oy, 0,LUNGLENTA,LARGLENTA);
 
/* salva le vecchie coordinate */
ox = x;
oy = y;
/* cancella il veicolo dalla vecchia posizione sulla corsia , andando a cancellarlo nel vettore della corsia in cui si trovava */
sem_wait(&strada);
for (k=0;k<LUNGLENTA;k++)
{
if ((oy<CENTROCORSIA1) && (oy>CENTROCORSIA2))
{
corsia1[ox-k]=0;
corsia2[ox-k]=0;
}
else
if (oy==CENTROCORSIA1)
corsia1[ox-k]=0;
else
if (oy==CENTROCORSIA2)
corsia2[ox-k]=0;
}
sem_post(&strada);
 
/* cancella tutte le vecchie informazioni che compaiono sullo schermo */
sprintf(stri,"posizione %d",(int)(ox*0.25));
sem_wait(&mutex);
grx_text(stri,70,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"a %nf",oa);
sem_wait(&mutex);
grx_text(ostri,300,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"v %nf",ov);
sem_wait(&mutex);
grx_text(ostri,200,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
/* legge la distanza dal sensore anteriore e nel caso in cui sia attaccato alla macchina che precede vengo eliminato */
precedentedritto=dist_ant(x,y,sensore_ant);
if (precedentedritto==1)
task_abort(i);
 
/* disegna il veicolo nella nuova posizione */
if (abs(xelic-x)<estremo)
draw_veicolo(x-xelic+estremo, y, rgb16(255,0,0),LUNGLENTA,LARGLENTA);
 
/* varia la massima distanza vista dal sensore posteriore sinistro a seconda della velocita' */
tot=(int)(v*4);
if (tot<50)
tot=50;
if (precedentedritto<100) /* ci siamo avvicinando troppo alla macchina che ci precede */
if ((sorpasso==0) && (dist_postsx(x,y,200)>tot)&&(dist_ant_sx(x,y,50)>40))
{
/* c'e' uno davanti e non sopraggiunge nessuno sulla corsia di sorpasso */
sorpasso=1;
rientro=0;
vcrociera=vmax2;
}
else
a=frenata; /* c'e qualcuno davanti ,ma non possiamo sorpassare */
else /* siamo lontani da un veicolo che ci precede o non ci precede nessuno */
if (v<vcrociera) /* accelleriamo gradualmente fino a portarci alla velocita' di crociera desiderata */
a=amax-(amax/vcrociera)*v;
else
if(v>vcrociera) /* freniamo per portarci al valore della velocita'di crociera */
a=frenata/3;
else
a=0.0; /* siamo alla velocita' di crociera */
 
/* controlla se e' possibile la manovra di rientro dal sorpasso, aggiustando tutti i parametri nel modo corretto */
if ((dist_postdx(x,y,200)>tot2) && (dist_ant_dx(x,y,200)>tot3) && (sorpasso==1))
{
rientro=1;
sorpasso=0;
vcrociera=vmax1;
}
/* aggiusta la cordinata y per far visualizzare il sorpasso o il rientro della macchina in modo graduale */
if(y>CENTROCORSIA2 && sorpasso==1)
y=y-1;
 
if(y<CENTROCORSIA1 && rientro==1)
y=y+1;
 
/* calcola la velocita' e nel caso di v elocita' negative la pone a zero (non sono permesse le retromarcie) */
v=v+a*DT;
if (v<0)
v=0.0;
 
/* calcola la cordinata x a cui si trova la macchina */
x=x+(int)((v*DT)/0.25);
 
/* scrive a video i nuovi parametri appena calcolati */
sprintf(stri,"posizione %d",(int)(x*0.25));
sem_wait(&mutex);
grx_text(stri,70,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"v %nf",v);
sem_wait(&mutex);
grx_text(ostri,200,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"a %nf",a);
sem_wait(&mutex);
grx_text(ostri,300,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
/* quando il veicolo arriva alla fine dell'autostrada viene eliminato */
if (x>=40000)
task_abort(i);
 
/* salva la nuova posizione del veicolo */
sem_wait(&strada);
for (k=0;k<LUNGLENTA;k++)
{
if ((y<CENTROCORSIA1) && (y>CENTROCORSIA2))
{
corsia2[x-k]=1;
corsia1[x-k]=1;
}
else
if (y==CENTROCORSIA1)
corsia1[x-k]=1;
else
if (y==CENTROCORSIA2)
corsia2[x-k]=1;
}
sem_post(&strada);
 
/* salvo i parametri che occorrono per il prossimo ciclo */
oxelic=xelic;
od=precedentedritto;
ov=v;
oa=a;
 
task_endcycle(); /* termina le operazioni che il task deve eseguire */
}
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/************************** TASK AUTO VELOCE *******************************/
 
TASK auto_veloce(void *arg)
{
int x; /* posizione x assunta dal veicolo */
int y; /* posizione y assunta dal veicolo */
int oxelic; /* posizione vecchia dell'elicottero */
int ox; /* posizione vecchia x dall'auto veloce */
int oy; /* posizione vecchia y dall'auto veloce */
int k; /* indice di ciclo */
int estremo; /* distanza massima a cui ci possiamo spostare dall'elicottero (sia a destra che a sinistra) */
int sorpasso; /* indica se il veicolo e' in fase di sorpasso */
int rientro; /* indica se il veicolo e' in fase di rientro */
int precedentedritto; /* distanza anteriore da un veicolo */
int od; /* vecchia distanza anteriore da un veicolo */
int tot; /* distanza massima raggiungibile del sensore posteriore sinistro */
int tot3; /* distanza massima raggiungibile del sensore anteriore destro */
int tot2; /* distanza massima raggiungibile del sensore posteriore destro */
int i = (int)arg;
int sensore_ant=200; /* distanza massima raggiungibile del sensore anteriore */
char stri[22]; /* vettore di caratteri */
char ostri[22]; /* vettore di caratteri */
float vcrociera; /* velocita' desiderata */
float vmax1=35.0; /* velocita' massima raggiungibile in prima corsia */
float vmax2=40.0; /* velocita' massima raggiungibile in seconda corsia */
float frenata=-7.0; /* valore massimo della frenata */
float amax=15.0; /* valore massimo del'accellerazione */
float v; /* velocita' attuale */
float a; /* accellerazione attuale */
float ov; /* velocita' precedente */
float oa; /* accellerazione precedente */
 
/* inizializzazione delle variabili */
v=5.0;
a=0.0;
x=LUNGVELOCE;
y=CENTROCORSIA1;
sorpasso=0;
rientro=0;
tot=100;
tot2=150;
tot3=100;
oa=a;
vcrociera=vmax1;
ov=v;
od=0;
oxelic=xelic;
estremo=(int)((MAX_X/2)-1);
 
while (1)
{
/* cancella il veicolo se era presente sull'autostrada vista dall'elicottero */
if (abs(oxelic-ox)<estremo)
draw_veicolo(ox-oxelic+estremo, oy, 0,LUNGVELOCE,LARGVELOCE);
 
/* salva le vecchie coordinate */
ox = x;
oy = y;
/* cancella il veicolo dalla vecchia posizione sulla corsia , andando a cancellarlo nel vettore della corsia in cui si trovava */
sem_wait(&strada);
for (k=0;k<LUNGVELOCE;k++)
{
if ((oy<CENTROCORSIA1) && (oy>CENTROCORSIA2))
{
corsia1[ox-k]=0;
corsia2[ox-k]=0;
}
else
if (oy==CENTROCORSIA1)
corsia1[ox-k]=0;
else
if (oy==CENTROCORSIA2)
corsia2[ox-k]=0;
}
sem_post(&strada);
 
/* cancella tutte le vecchie informazioni che compaiono sullo schermo */
sprintf(stri,"posizione %d",(int)(ox*0.25));
sem_wait(&mutex);
grx_text(stri,70,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"v %nf",ov);
sem_wait(&mutex);
grx_text(ostri,200,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"a %nf",oa);
sem_wait(&mutex);
grx_text(ostri,300,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
/* legge la distanza dal sensore anteriore e nel caso in cui sia attaccato alla macchina che precede vengo eliminato */
precedentedritto=dist_ant(x,y,sensore_ant);
if (precedentedritto==1)
task_abort(i);
 
/* disegna il veicolo nella nuova posizione */
if (abs(xelic-x)<estremo)
draw_veicolo(x-xelic+estremo, y, rgb16(0,255,0),LUNGVELOCE,LARGVELOCE);
 
 
/* varia la massima distanza vista dal sensore posteriore sinistro a seconda della velocita' */
tot=(int)(v*4);
if (tot<50)
tot=50;
 
if (precedentedritto<150) /* ci siamo avvicinando troppo alla macchina che ci precede */
if ((sorpasso==0) && (dist_postsx(x,y,200)>tot)&&(dist_ant_sx(x,y,50)>40))
{
/* c'e' uno davanti e non sopraggiunge nessuno sulla corsia di sorpasso */
sorpasso=1;
rientro=0;
vcrociera=vmax2;
}
else /* c'e qualcuno davanti ,ma non possiamo sorpassare */
a=frenata;
else /* siamo lontani da un veicolo che ci precede o non ci precede nessuno */
if (v<vcrociera) /* accelleriamo gradualmente fino a portarci alla velocita' di crociera desiderata */
a=amax-(amax/vcrociera)*v;
else
if(v>vcrociera) /* freniamo per portarci al valore della velocita'di crociera */
a=frenata/3;
else
a=0.0; /* siamo alla velocita' di crociera */
 
/* controlla se e' possibile la manovra di rientro dal sorpasso, aggiustando tutti i parametri nel modo corretto */
if ((dist_postdx(x,y,200)>tot2) && (dist_ant_dx(x,y,200)>tot3) && (sorpasso==1))
{
rientro=1;
sorpasso=0;
vcrociera=vmax1;
}
 
/* aggiusta la cordinata y per far visualizzare il sorpasso o il rientro della macchina in modo graduale */
if(y>CENTROCORSIA2 && sorpasso==1)
y=y-1;
 
if(y<CENTROCORSIA1 && rientro==1)
y=y+1;
 
/* calcola la velocita' e nel caso di v elocita' negative la pone a zero (non sono permesse le retromarcie) */
v=v+a*DT;
if (v<0)
v=0.0;
 
/* calcola la cordinata x a cui si trova la macchina */
x=x+(int)((v*DT)/0.25);
 
/* scrive a video i nuovi parametri appena calcolati */
sprintf(stri,"posizione %d",(int)(x*0.25));
sem_wait(&mutex);
grx_text(stri,70,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"v %nf",v);
sem_wait(&mutex);
grx_text(ostri,200,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"a %nf",a);
sem_wait(&mutex);
grx_text(ostri,300,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
/* quando il veicolo arriva alla fine dell'autostrada viene eliminato */
if (x>=40000)
task_abort(i);
 
/* salva la nuova posizione del veicolo */
sem_wait(&strada);
for (k=0;k<LUNGVELOCE;k++)
{
if ((y<CENTROCORSIA1) && (y>CENTROCORSIA2))
{
corsia2[x-k]=1;
corsia1[x-k]=1;
}
else
if (y==CENTROCORSIA1)
corsia1[x-k]=1;
else
if (y==CENTROCORSIA2)
corsia2[x-k]=1;
}
sem_post(&strada);
 
/* salvo i parametri che occorrono per il prossimo ciclo */
oxelic=xelic;
od=precedentedritto;
ov=v;
oa=a;
 
task_endcycle(); /* termina le operazioni che il task deve eseguire */
}
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/***************************** TASK AUTOCARRO ******************************/
 
TASK auto_carro(void *arg)
{
int x; /* posizione x assunta dal veicolo */
int y; /* posizione y assunta dal veicolo */
int oxelic; /* posizione vecchia dell'elicottero */
int ox; /* posizione vecchia x assunta dal camion */
int oy; /* posizione vecchia y assunta dal camion */
int k; /* indice di ciclo */
int estremo; /* distanza massima a cui ci possiamo spostare dall'elicottero (sia a destra che a sinistra) */
int sorpasso; /* indica se il veicolo e' in fase di sorpasso */
int rientro; /* indica se il veicolo e' in fase di rientro */
int precedentedritto; /* distanza anteriore da un veicolo */
int od; /* vecchia distanza anteriore da un veicolo */
int tot; /* distanza massima raggiungibile del sensore posteriore sinistro */
int tot3; /* distanza massima raggiungibile del sensore anteriore destro */
int tot2; /* distanza massima raggiungibile del sensore posteriore destro */
int i = (int)arg;
int sensore_ant=200; /* distanza massima raggiungibile del sensore anteriore */
char stri[22]; /* vettore di caratteri */
char ostri[22]; /* vettore di caratteri */
float vcrociera; /* velocita' desiderata */
float vmax1=15.0; /* velocita' massima raggiungibile in prima corsia */
float vmax2=20.0; /* velocita' massima raggiungibile in seconda corsia */
float frenata=-5.0; /* valore massimo della frenata */
float amax=3.0; /* valore massimo del'accellerazione */
float v; /* velocita' attuale */
float a; /* accellerazione attuale */
float ov; /* velocita' precedente */
float oa; /* accellerazione precedente */
 
/* inizializzazione delle variabili */
v=5.0;
a=0.0;
x=LUNGCAMION;
y=CENTROCORSIA1;
sorpasso=0;
rientro=0;
tot=100;
tot2=150;
tot3=100;
oa=a;
vcrociera=vmax1;
ov=v;
od=0;
oxelic=xelic;
estremo=(int)((MAX_X/2)-1);
 
while (1)
{
/* cancella il veicolo se era presente sull'autostrada vista dall'elicottero */
if (abs(oxelic-ox)<estremo)
draw_veicolo(ox-oxelic+estremo, oy, 0,LUNGCAMION,LARGCAMION);
 
/* salva le vecchie coordinate */
ox = x;
oy = y;
 
/* cancella il veicolo dalla vecchia posizione sulla corsia , andando a cancellarlo nel vettore della corsia in cui si trovava */
sem_wait(&strada);
for (k=0;k<LUNGCAMION;k++)
{
if ((oy<CENTROCORSIA1) && (oy>CENTROCORSIA2))
{
corsia1[ox-k]=0;
corsia2[ox-k]=0;
}
else
if (oy==CENTROCORSIA1)
corsia1[ox-k]=0;
else
if (oy==CENTROCORSIA2)
corsia2[ox-k]=0;
}
sem_post(&strada);
 
/* cancella tutte le vecchie informazioni che compaiono sullo schermo */
sprintf(stri,"posizione %d",(int)(ox*0.25));
sem_wait(&mutex);
grx_text(stri,70,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"v %nf",ov);
sem_wait(&mutex);
grx_text(ostri,200,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"a %nf",oa);
sem_wait(&mutex);
grx_text(ostri,300,50+i*10,rgb16(0,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
/* legge la distanza dal sensore anteriore e nel caso in cui sia attaccato alla macchina che precede vengo eliminato */
precedentedritto=dist_ant(x,y,sensore_ant);
if (precedentedritto==1)
task_abort(i);
 
/* disegna il veicolo nella nuova posizione */
if (abs(xelic-x)<estremo)
draw_veicolo(x-xelic+estremo, y, rgb16(0,0,255),LUNGCAMION,LARGCAMION);
 
/* varia la massima distanza vista dal sensore posteriore sinistro a seconda della velocita' */
tot=(int)(v*4);
if (tot<50)
tot=50;
 
if (precedentedritto<100) /* ci siamo avvicinando troppo alla macchina che ci precede */
if ((sorpasso==0) && (dist_postsx(x,y,200)>tot)&&(dist_ant_sx(x,y,50)>40))
{
/* c'e' uno davanti e non sopraggiunge nessuno sulla corsia di sorpasso */
sorpasso=1;
rientro=0;
vcrociera=vmax2;
}
else /* c'e qualcuno davanti ,ma non possiamo sorpassare */
a=frenata;
else /* siamo lontani da un veicolo che ci precede o non ci precede nessuno */
if (v<vcrociera) /* accelleriamo gradualmente fino a portarci alla velocita' di crociera desiderata */
a=amax-(amax/vcrociera)*v;
else
if(v>vcrociera) /* freniamo per portarci al valore della velocita'di crociera */
a=frenata/3;
else
a=0.0; /* siamo alla velocita' di crociera */
 
/* controlla se e' possibile la manovra di rientro dal sorpasso, aggiustando tutti i parametri nel modo corretto */
if ((dist_postdx(x,y,200)>tot2) && (dist_ant_dx(x,y,200)>tot3) && (sorpasso==1))
{
rientro=1;
sorpasso=0;
vcrociera=vmax1;
}
 
/* aggiusta la cordinata y per far visualizzare il sorpasso o il rientro della macchina in modo graduale */
if(y>CENTROCORSIA2 && sorpasso==1)
y=y-1;
 
if(y<CENTROCORSIA1 && rientro==1)
y=y+1;
 
/* calcola la velocita' e nel caso di v elocita' negative la pone a zero (non sono permesse le retromarcie) */
v=v+a*DT;
if (v<0)
v=0.0;
 
/* calcola la cordinata x a cui si trova la macchina */
x=x+(int)((v*DT)/0.25);
 
/* scrive a video i nuovi parametri appena calcolati */
sprintf(stri,"posizione %d",(int)(x*0.25));
sem_wait(&mutex);
grx_text(stri,70,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"v %nf",v);
sem_wait(&mutex);
grx_text(ostri,200,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(ostri,"a %nf",a);
sem_wait(&mutex);
grx_text(ostri,300,50+i*10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
/* quando il veicolo arriva alla fine dell'autostrada viene eliminato */
if (x>=40000)
task_abort(i);
 
/* salva la nuova posizione del veicolo */
sem_wait(&strada);
for (k=0;k<LUNGCAMION;k++)
{
if ((y<CENTROCORSIA1) && (y>CENTROCORSIA2))
{
corsia2[x-k]=1;
corsia1[x-k]=1;
}
else
if (y==CENTROCORSIA1)
corsia1[x-k]=1;
else
if (y==CENTROCORSIA2)
corsia2[x-k]=1;
}
sem_post(&strada);
 
/* salvo i parametri che occorrono per il prossimo ciclo */
oxelic=xelic;
od=precedentedritto;
ov=v;
oa=a;
 
task_endcycle(); /* termina le operazioni che il task deve eseguire */
}
}
 
 
/* ----------------------------------------------------------------------------- */
 
 
/***************************** TASK ELICOTTERO *****************************/
 
TASK eli_cottero(void *arg)
{
int i = (int)arg;
int oxelic; /* vecchia posizione dell'elicottero */
char stri[22]; /* vettore di caratteri */
char ostri[22]; /* vettore di caratteri */
 
/* disegna le scritte per l'indicatore a barra e finestra della posizione dell'elicottero */
sprintf(stri,"0 Km");
sem_wait(&mutex);
grx_text(stri,100,560,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(stri,"10 Km");
sem_wait(&mutex);
grx_text(stri,700,560,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
while (1)
{
oxelic=xelic; /* salva la posizione precedente dell'elicottero */
 
if (c == '+') /* sposta l'elicottero a destra (verso la fine dell'autostrada */
{
xelic=xelic+50;
if (xelic>40000-(int)((MAX_X/2)-1))
xelic=40000-(int)((MAX_X/2)-1);
}
else
if (c =='-') /* sposta l'elicottero a sinistra (verso l'inizio dell'autostrada */
{
xelic=xelic-30;
if (xelic<(int)((MAX_X/2)-1))
xelic=(int)((MAX_X/2)-1);
}
/* disegna le scritte innerenti all'elicottero e il valore della sua posizione (mediante scritta ed indicatore a barra con una finestra scorrevole) */
sprintf(stri,"- <- xelic %d -> +",(int)(xelic*0.25));
sprintf(ostri,"- <- xelic %d -> +",(int)(oxelic*0.25));
 
sem_wait(&mutex);
grx_text(ostri,MAX_X/2-50,500,rgb16(0,0,0),rgb16(0,0,0));
grx_text(stri,MAX_X/2-50,500,rgb16(255,255,255),rgb16(0,0,0));
grx_line(150,560,650,560,rgb16(255,255,255));
grx_rect((int)((oxelic-(MAX_X/2))/80+150),540,(int)((oxelic+(MAX_X/2))/80+150) ,580 ,rgb16(0,0,0));
grx_rect((int)((xelic-(MAX_X/2))/80+150),540,(int)((xelic+(MAX_X/2))/80+150) ,580 ,rgb16(255,255,255));
sem_post(&mutex);
 
c=' '; /* setta il carattere c */
 
task_endcycle(); /* termina le operazioni che il task deve eseguire */
}
}
 
 
/* -----------------------------------------------------------------------------*/
 
 
/************* FUNZIONE DI USCITA DAL SISTEMA ******************************/
 
void byebye(void *arg)
{ /* questa funzione e' chiamata quando il sistema esce */
grx_close(); /* chiude la grafica */
kern_printf("Ciao Ciao "); /* scrive il messaggio indicato sul terminale */
}
 
 
/* -----------------------------------------------------------------------------*/
 
 
/********************************* MAIN ************************************/
 
int main(int argc, char **argv)
{
int n_task = 0; /* numero di task creati */
int u;
int v;
char introduzione[100]; /* vettore di caratteri */
HARD_TASK_MODEL autolenta; /* task auto lenta */
HARD_TASK_MODEL autoveloce; /* task auto veloce */
HARD_TASK_MODEL autocarro; /* task camion */
HARD_TASK_MODEL elicottero; /* task elicottero */
 
 
/* inizializza le corsie dell'autostrada */
sem_wait(&strada);
for (u=0;u<=40000;u++)
{
corsia1[u]=0;
corsia2[u]=0;
}
sem_post(&strada);
 
/* Set the exception handler */
//set_exchandler_grx();
 
/* Set the closing function */
sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
 
/* inizializzazione grafica */
if (grx_init() < 1)
sys_abort(1);
 
/* scelta automatica della risoluzione applicabile con quella scheda video (scegliendola tra 800*600 e 1024*768 ) */
if(grx_getmode(1024,768,16)==-1)
{
if (grx_open(800, 600, 16) < 0)
{
kern_printf("GRX Err\n");
sys_abort(1);
}
MAX_X=800;
MAX_Y=600;
}
else
{
if (grx_open(1024,768, 16) < 0)
{
kern_printf("GRX Err\n");
sys_abort(1);
}
MAX_X=1024;
MAX_Y=768;
}
 
kern_printf("La scheda video va'!!\n");
 
/* posizione iniziale elicottero */
xelic=(int)((MAX_X/2)-1);
 
/* disegna lo scenario della strada ed il menu */
sprintf(introduzione,"Monitoraggio dei mezzi che transitano su una autostrada.");
sem_wait(&mutex);
grx_text(introduzione,50,10,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"Sviluppato da: Verzellesi Quadrubbi");
sem_wait(&mutex);
grx_text(introduzione,50,20,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"MENU");
sem_wait(&mutex);
grx_text(introduzione,480,70,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"s = macchina sportiva");
sem_wait(&mutex);
grx_text(introduzione,480,80,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"c = mezzo pesante");
sem_wait(&mutex);
grx_text(introduzione,480,90,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"l = macchina lenta");
sem_wait(&mutex);
grx_text(introduzione,480,100,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"+ = sposta l'elicottero verso destra");
sem_wait(&mutex);
grx_text(introduzione,480,110,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"- = sposta l'elicottero verso sinistra");
sem_wait(&mutex);
grx_text(introduzione,480,120,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"esc = uscita");
sem_wait(&mutex);
grx_text(introduzione,480,130,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"NOTA");
sem_wait(&mutex);
grx_text(introduzione,480,140,rgb16(255,0,0),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione,"Se i veicoli tamponano ");
sem_wait(&mutex);
grx_text(introduzione,480,150,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
sprintf(introduzione," vengono eliminati");
sem_wait(&mutex);
grx_text(introduzione,480,160,rgb16(255,255,255),rgb16(0,0,0));
sem_post(&mutex);
 
grx_line(1,450,MAX_X,450,rgb16(255,255,255));
grx_line(1,486,MAX_X,486,rgb16(255,255,255));
 
for (u=0;u<MAX_X;u++)
{
v=u%8;
if ((v==0) || (v==1))
{
sem_wait(&mutex);
grx_plot(u,CENTROCARREGGIATA,rgb16(255,255,255));
sem_post(&mutex);
}
}
 
n_task=0; /* inizializzazione del numero dei task */
 
/* definisce e crea il task elicottero */
kern_printf("elicottero");
hard_task_default_model (elicottero);
hard_task_def_ctrl_jet (elicottero);
hard_task_def_arg (elicottero, (void *)n_task);
hard_task_def_wcet (elicottero,wcet);
hard_task_def_mit (elicottero, periodo);
hard_task_def_group (elicottero, GRUPPO);
hard_task_def_usemath (elicottero);
pid = task_create ("elicottero",eli_cottero, &elicottero, NULL);
if (pid == NIL)
{
grx_close();
perror("Non si puo' creare il task");
sys_abort(1);
}
task_activate(pid);
 
n_task=1; /* incremente il numero dei task (ha creato l'elicottero */
/*Attesa di un carattere per creare un veicolo */
c = keyb_getch(BLOCK);
do {
if (((c == 'c')||(c=='s')||(c=='l')) && (n_task < MAX_V)) /* in base al tasto premuto crea il task opportuno */
{
if (c == 'l') /* definisce e crea il task autolenta */
{
kern_printf("lenta");
hard_task_default_model (autolenta);
hard_task_def_ctrl_jet (autolenta);
hard_task_def_arg (autolenta, (void *)n_task);
hard_task_def_wcet (autolenta, wcet);
hard_task_def_mit (autolenta, periodo);
hard_task_def_group (autolenta, GRUPPO);
hard_task_def_usemath (autolenta);
pid = task_create ("autolenta",auto_lenta, &autolenta, NULL);
}
else
if (c == 's') /* definisce e crea il task autoveloce */
{
hard_task_default_model (autoveloce);
hard_task_def_ctrl_jet (autoveloce);
hard_task_def_arg (autoveloce, (void *)n_task);
hard_task_def_wcet (autoveloce, wcet);
hard_task_def_mit (autoveloce, periodo);
hard_task_def_group (autoveloce, GRUPPO);
hard_task_def_usemath (autoveloce);
pid = task_create ("autoveloce",auto_veloce, &autoveloce, NULL);
}
else
if (c == 'c') /* definisce e crea il task autocarro */
{
hard_task_default_model (autocarro);
hard_task_def_ctrl_jet (autocarro);
hard_task_def_arg (autocarro, (void *)n_task);
hard_task_def_wcet (autocarro, wcet);
hard_task_def_mit (autocarro, periodo);
hard_task_def_group (autocarro, GRUPPO);
hard_task_def_usemath (autocarro);
pid = task_create ("camion",auto_carro, &autocarro, NULL);
}
 
if (pid == NIL) /* nel caso in non si possano creare dei task chiude la grafica e con un messaggio segnala l'errore */
{
grx_close();
perror("Non si puo' creare il task");
sys_abort(1);
}
 
task_activate(pid); /* attiva i task */
n_task++; /* incrementa il numero dei task creati */
}
 
c = keyb_getch(BLOCK);
 
} while (c != ESC); /* termino il tutto solo quando e' stato premuto il tasto esc */
 
sys_end(); /* esco dal sistema */
 
return 0;
}
/unsupported/tags/rel_0_5/autostr/initfile.c
0,0 → 1,120
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
------------
CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.1.1.1 $
Last update: $Date: 2004-05-24 18:03:44 $
------------
 
System initialization file
 
This file contains the 2 functions needed to initialize the system.
 
These functions register the following levels:
 
an EDF (Earliest Deadline First) level
a RR (Round Robin) level
a CBS (Costant Bandwidth Server) level
a Dummy level
 
It can accept these task models:
 
HARD_TASK_MODEL (wcet+mit) at level 0
SOFT_TASK_MODEL (met, period) at level 1
NRT_TASK_MODEL at level 2
 
This file is similar to the configuration of kernel/init/hartik3.c
 
TICK is set to 0 (one-shot timer is used)
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include "kernel/kern.h"
#include "modules/edf.h"
#include "modules/cbs.h"
#include "modules/rr.h"
#include "modules/dummy.h"
 
#include "modules/sem.h"
#include "modules/hartport.h"
#include "modules/cabs.h"
 
#include "drivers/keyb.h"
 
 
/*+ sysyem tick in us +*/
#define TICK 0
 
/*+ RR tick in us +*/
#define RRTICK 10000
 
TIME __kernel_register_levels__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
EDF_register_level(EDF_ENABLE_ALL);
CBS_register_level(CBS_ENABLE_ALL, 0);
RR_register_level(RRTICK, RR_MAIN_YES, mb);
dummy_register_level();
 
SEM_register_module();
 
CABS_register_module();
 
return TICK;
}
 
TASK __init__(void *arg)
{
struct multiboot_info *mb = (struct multiboot_info *)arg;
 
KEYB_PARMS kparms = BASE_KEYB;
 
HARTPORT_init();
 
keyb_def_ctrlC(kparms, NULL);
keyb_def_map(kparms,itaMap);
KEYB_init(&kparms);
 
__call_main__(mb);
 
return (void *)0;
}
 
/unsupported/tags/rel_0_5/autostr/makefile
0,0 → 1,17
#
#
#
 
ifndef BASE
BASE=../..
endif
include $(BASE)/config/config.mk
 
PROGS= autostr
 
include $(BASE)/config/example.mk
 
autostr:
make -f $(SUBMAKE) APP=autostr INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
 
 
/unsupported/tags/rel_0_5/joy/joy_test.c
0,0 → 1,131
 
/*
* Project: S.Ha.R.K.
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
*
* Authors : Paolo Gai <pj@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
 
/*
* Copyright (C) 2000 Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
 
#include <kernel/kern.h>
#include <kernel/func.h>
#include <stdlib.h>
#include <drivers/keyb.h>
#include <math.h>
 
#include "joy.h"
 
PID pid;
 
void endfun(KEY_EVT *k)
{
cprintf("Ctrl-Brk pressed! Ending...\n");
sys_end();
}
 
void my_close(void *arg)
{
int i;
TIME tmp;
 
kern_printf("Taskset Execution Time\n\n");
for (i=3; i<MAX_PROC; i++){
if (!jet_getstat(i, NULL, &tmp, NULL, NULL))
kern_printf("Task Name : %s - Max Time : %d\n", proc_table[i].name, (int)tmp);
}
}
 
 
TASK write()
{
JOY_STATE jsa;
 
while (1) {
get_joystick_A(&jsa);
place(2,4);
cprintf("The X coord. is: %3d and the Y coord. is: %3d of the joystick1\n", jsa.x, jsa.y);
place(2,12);
cprintf("The button 1, joystick 1 is: %3d\n", jsa.b1);
place(2,14);
cprintf("The button 2, joystick 1 is: %3d\n", jsa.b2);
 
task_endcycle();
}
return 0;
}
 
int main(int argc, char **argv)
{
SOFT_TASK_MODEL ms;
KEY_EVT k;
TIME seme;
 
JOY_BOUND jb;
 
k.flag = CNTR_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
 
k.flag = CNTL_BIT;
k.scan = KEY_C;
k.ascii = 'c';
keyb_hook(k,endfun);
 
seme = sys_gettime(NULL);
srand(seme);
 
sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
 
clear();
 
if (get_joystick_bound_A(&jb)) {
perror("Could not find Joystick.");
sys_end();
}
 
place(2,2);
cprintf("The X bounds are: [ %3d - %3d ] and the Y bounds are: [ %3d - %3d ]\n", jb.x_min,jb.x_max,jb.y_min,jb.y_max);
 
soft_task_default_model(ms);
soft_task_def_level(ms,1);
soft_task_def_ctrl_jet(ms);
soft_task_def_met(ms,100);
soft_task_def_period(ms,10000);
soft_task_def_usemath(ms);
pid = task_create("Write", write, &ms, NULL);
if (pid == NIL) {
perror("Could not create task <Write>");
sys_end();
} else {
task_activate(pid);
}
 
return 0;
}
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: tags/rel_0_5/joy/joy_grx.c
===================================================================
--- tags/rel_0_5/joy/joy_grx.c (nonexistent)
+++ tags/rel_0_5/joy/joy_grx.c (revision 1657)
@@ -0,0 +1,177 @@
+
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <kernel/kern.h>
+#include <kernel/func.h>
+#include <stdlib.h>
+#include <drivers/keyb.h>
+#include <drivers/glib.h>
+#include <semaphore.h>
+#include "modules/sem.h"
+#include "modules/hartport.h"
+
+#include <math.h>
+
+#include "joy.h"
+
+#define RGB_BLACK rgb16( 0, 0, 0)
+#define RGB_GRAY rgb16(127,127,127)
+#define RGB_WHITE rgb16(255,255,255)
+#define RGB_RED rgb16(255, 0, 0)
+#define RGB_GREEN rgb16( 0,255, 0)
+#define RGB_BLUE rgb16( 0, 0,255)
+#define RGB_YELLOW rgb16(255,255, 0)
+#define RGB_MAGENTA rgb16(255, 0,255)
+#define RGB_CYAN rgb16( 0,255,255)
+#define RGB_D_RED rgb16(127, 0, 0)
+#define RGB_D_GREEN rgb16( 0,127, 0)
+#define RGB_D_BLUE rgb16( 0, 0,127)
+#define RGB_D_YELLOW rgb16(127,127, 0)
+#define RGB_D_MAGENTA rgb16(127, 0,127)
+#define RGB_D_CYAN rgb16( 0,127,127)
+
+sem_t mx_mat, mx_grf; /* mutex semaphores */
+PID pid;
+JOY_BOUND jb;
+
+
+TASK write()
+{
+ int x = 319, y = 239;
+ float dx, dy;
+ JOY_STATE jsa;
+
+ clear();
+
+ dx = 640 / (jb.x_max - jb.x_min);
+ dy = 480 / (jb.y_max - jb.y_min);
+
+ while (1) {
+ sem_wait(&mx_grf);
+ grx_circle(10 + x, 10 + y, 9, RGB_BLACK);
+ sem_post(&mx_grf);
+
+ get_joystick_A(&jsa);
+
+ x = (jsa.x - jb.x_min) * dx;
+ y = (jsa.y - jb.y_min) * dy;
+
+ sem_wait(&mx_grf);
+ if (jsa.b1==1)
+ grx_circle(10 + dx * x, 10 + dy * y, 9, RGB_RED);
+ else
+ grx_circle(10 + dx * x, 10 + dy * y, 9, RGB_YELLOW);
+ sem_post(&mx_grf);
+
+ task_endcycle();
+ }
+ return 0;
+}
+
+void endfun(KEY_EVT *k)
+{
+ cprintf("Ctrl-Brk pressed! Ending...\n");
+ sys_end();
+}
+
+void my_close(void *arg)
+{
+ int i;
+ TIME tmp;
+
+ grx_close();
+ kern_printf("Taskset Execution Time\n\n");
+ for (i=3; i<MAX_PROC; i++){
+ if (!jet_getstat(i, NULL, &tmp, NULL, NULL))
+ kern_printf("Task Name : %s - Max Time : %d\n", proc_table[i].name, (int)tmp);
+ }
+}
+
+void init_graph() {
+ grx_box( 0, 0,639,479,RGB_BLACK);
+}
+
+int main(int argc, char **argv)
+{
+ SOFT_TASK_MODEL ms;
+ KEY_EVT k;
+ TIME seme;
+ int modenum;
+
+ k.flag = CNTR_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,endfun);
+
+ k.flag = CNTL_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,endfun);
+
+ sem_init(&mx_mat,0,1);
+ sem_init(&mx_grf,0,1);
+
+ seme = sys_gettime(NULL);
+ srand(seme);
+
+ sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ if (get_joystick_bound_A(&jb)) {
+ perror("Could not find Joystick.");
+ sys_end();
+ }
+
+ grx_init();
+ modenum = grx_getmode(640, 480, 16);
+ grx_setmode(modenum);
+ init_graph();
+
+ soft_task_default_model(ms);
+ soft_task_def_level(ms,1);
+ soft_task_def_ctrl_jet(ms);
+ soft_task_def_met(ms,100);
+ soft_task_def_period(ms,10000);
+ soft_task_def_usemath(ms);
+ pid = task_create("Write", write, &ms, NULL);
+ if (pid == NIL) {
+ grx_close();
+ perror("Could not create task <Write>");
+ sys_end();
+ } else {
+ task_activate(pid);
+ }
+
+ return 0;
+}
/tags/rel_0_5/joy/joy_grx.c
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: tags/rel_0_5/joy/initfile.c
===================================================================
--- tags/rel_0_5/joy/initfile.c (nonexistent)
+++ tags/rel_0_5/joy/initfile.c (revision 1657)
@@ -0,0 +1,84 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Paolo Gai <pj@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <kernel/kern.h>
+#include <kernel/func.h>
+#include <stdlib.h>
+#include <drivers/keyb.h>
+#include <semaphore.h>
+#include "modules/sem.h"
+#include "modules/hartport.h"
+
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0 //300
+
+/*+ RR tick in us +*/
+#define RRTICK 300
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ //keyb_set_map(itaMap);
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
/tags/rel_0_5/joy/initfile.c
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: tags/rel_0_5/joy/makefile
===================================================================
--- tags/rel_0_5/joy/makefile (nonexistent)
+++ tags/rel_0_5/joy/makefile (revision 1657)
@@ -0,0 +1,18 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= joy_hex joy_test joy_grx
+
+include $(BASE)/config/example.mk
+
+joy_grx:
+ make -f $(SUBMAKE) APP=joy_grx INIT= OTHEROBJS="initfile.o" SHARKOPT="__OLDCHAR__ __GRX__ __JOY__"
+
+joy_test:
+ make -f $(SUBMAKE) APP=joy_test INIT= OTHEROBJS="initfile.o" SHARKOPT="__OLDCHAR__ __JOY__"
/tags/rel_0_5/joy/makefile
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: tags/rel_0_5/joy/README
===================================================================
--- tags/rel_0_5/joy/README (nonexistent)
+++ tags/rel_0_5/joy/README (revision 1657)
@@ -0,0 +1,2 @@
+TODO
+
Index: tags/rel_0_5/robots/lab3.txt
===================================================================
--- tags/rel_0_5/robots/lab3.txt (nonexistent)
+++ tags/rel_0_5/robots/lab3.txt (revision 1657)
@@ -0,0 +1,11 @@
+3
+540 380 15 270
+510 380 15 270
+480 380 15 270
+380 300 400 5
+430 060 460 400 0
+350 100 430 130 0
+000 100 300 130 0
+150 200 430 230 0
+120 300 150 400 0
+
Index: tags/rel_0_5/robots/initfile.c
===================================================================
--- tags/rel_0_5/robots/initfile.c (nonexistent)
+++ tags/rel_0_5/robots/initfile.c (revision 1657)
@@ -0,0 +1,104 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:41 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:41 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2001 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_cfgfile(int);
+
+int argc;
+char *argv[100];
+
+void read_cfg_file(int argc, char **argv);
+
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(0);
+ CBS_register_level(0, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ read_cfg_file(argc, argv);
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *)main(argc,argv);
+}
Index: tags/rel_0_5/robots/lab1m.txt
===================================================================
--- tags/rel_0_5/robots/lab1m.txt (nonexistent)
+++ tags/rel_0_5/robots/lab1m.txt (revision 1657)
@@ -0,0 +1,9 @@
+1
+540 380 15 270
+380 300 400 5
+430 060 460 400 0
+350 100 430 130 0
+000 100 300 130 0
+150 200 430 230 0
+120 300 150 400 0
+
Index: tags/rel_0_5/robots/mouse2.c
===================================================================
--- tags/rel_0_5/robots/mouse2.c (nonexistent)
+++ tags/rel_0_5/robots/mouse2.c (revision 1657)
@@ -0,0 +1,933 @@
+/*--------------------------------------------------------------*/
+/* Title: Mouse */
+/* Autor: João Capucho */
+/* Date: 9/12/2000 */
+/* Description: */
+/* Simulation of small automats based on the */
+/* "micro-rato" conteste */
+/*--------------------------------------------------------------*/
+
+/*
+ * Copyright (C) 2001 João Capucho
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+// Includes
+#include <ll/i386/x-dos.h>
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <math.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#define sqr(x) (x*x)
+
+// Error Types
+#define OK 0
+#define MEMORY_ERROR -1
+#define ILEGAL_PARAMETER -2
+
+// Types of sensors and motors
+#define NONE 0
+#define OBSTACLE 1
+#define BEACON 2
+#define GROUND 3
+#define STEP 4
+
+// Maze limits
+#define LAB_XMIN 40
+#define LAB_XMAX 600
+#define LAB_YMIN 40
+#define LAB_YMAX 440
+
+#define MOTOR_RIGHT 1
+#define MOTOR_LEFT 0
+
+#define BACKCOLOR 0 // Background color
+#define OUTCOLOR 14 // Color of the outside walls
+#define FINISHCOLOR 7 // Finishin area color
+#define NONBLOCKCOLOR 14 // Non block boxs
+#define BLOCKCOLOR 13 // Block boxs
+
+#define BOX_BLOCK 1 // The box blocks the beacon
+#define BOX_NON_BLOCK 2 // The box doesn´t block the beacon
+
+#define MAX_MOUSES 5 // Maximum of mouses in the Maze
+#define MAX_BOXS 100 // Maximum of boxs in the Maze
+#define MAX_SENSORS 20 // Maximum of sensors in each mouse
+#define SENSOR_MIN_GROUND 0 // Minimum value of a ground sensor
+#define SENSOR_MAX_GROUND 255 // Maximum value of a ground sensor
+#define SENSOR_MIN_OBSTACLE 77 // Minimum value of a obstacle sensor
+#define SENSOR_MAX_OBSTACLE 128 // Maximum value of a obstacle sensor
+#define SENSOR_MIN_BEACON 77 // Minimum value of a beacon sensor
+#define SENSOR_MAX_BEACON 128 // Maximum value of a beacon sensor
+#define BEACON_INTENSITY 400 // Maximun intensity of the beacon
+
+#define MOUSE_PERIOD 20000 // Period
+#define CALC_PERIOD 2000 // Period
+#define REFEREE_PERIOD 1000 // Period of the referee
+#define REDRAW_MOUSE_PERIOD 25000 // Period for redraw mouse
+#define REDRAW_MAZE_PERIOD 100000 // Period for redraw maze
+#define MOUSEGROUP 511
+
+struct SENSOR
+{
+ int Type; // Tipe of sensor ( None - Obstacle - Beacon - Ground)
+ int Radius; // Distance from de center of the mouse
+ int Pos_Angle; // Angle between the sensor and the front of the mouse
+ int Dir; // Angle between the direction of the sensores and the front of the mouse
+ int Angle; // Half angle of visual field (between (Dir-Angle) and (Dir+Angle))
+ int Intensity; // Sensativity of the sensor
+ float Value; // Last value readed
+};
+
+struct MOTOR
+{
+ int Radius; // Distance from de center of the mouse
+ int V; // Current velocity
+ float Old_V; // Previews velocity
+};
+
+struct MOUSE
+{
+ float X, Y; // Current position of the center
+ float Old_X, Old_Y; // Previous position of the center
+ int Radius; // Size of the mouse ( every mouse is considered round )
+ float Dir; // Points to the front
+ float Old_Dir; // Previous front
+ int NSensors; // Number of sensors in the mouse
+ struct SENSOR Sensors[MAX_SENSORS]; // Pointer to the structer that contains the information of the sensors
+ struct MOTOR Motors[2]; // Pointer to the structer that contains the information of the motors
+ WORD NColision; // Total of colisions
+ WORD PColision; // Auxiliar for colisions
+ char Flag; // Initialization flag
+};
+
+
+
+struct BOX // Structer that represents the obstacles
+{ //in this case all the obstacles are boxs
+ int Type; // Type of the obstatcle
+ int X1, Y1, X2, Y2; // position of the box
+};
+
+struct SBEACON // Beacon information
+{
+ int Intensity; // Intensity of the beacon
+ int X, Y; // position of the beacon
+};
+
+struct MAZE
+{
+ int X1, Y1, X2, Y2; // limites of the maze
+ int NBoxs; // Number of objstacles in the maze
+ struct BOX Boxs[MAX_BOXS]; // Information about all thr obstacles
+ struct SBEACON Beacon; // Beacon data
+ int Radius; // Size of the finishing area
+};
+
+int Seno[360+90]; // Sine table
+int Tang[180]; // Tangente table
+int NMouses=0;
+struct MOUSE Mouse[MAX_MOUSES]; // Global variable that represents all the mouses
+struct MAZE Maze; // Global variable that represents the maze
+
+// Init_Maze - Initialize the Maze
+// Beacon_X - Coordinate X of the beacon
+// Beacon_Y - Coordinate Y of the beacon
+// Intensity - Intensity of the beacon
+// NBoxs - Number of boxs in the maze
+// Return: OK - Sucess
+
+int Init_Maze(int Beacon_X, int Beacon_Y, int Intensity, int NBoxs)
+{
+ int i;
+ Maze.X1=LAB_XMIN;
+ Maze.Y1=LAB_YMIN;
+ Maze.X2=LAB_XMAX;
+ Maze.Y2=LAB_YMAX;
+ Maze.Beacon.X=Beacon_X+LAB_XMIN;
+ Maze.Beacon.Y=Beacon_Y+LAB_YMIN;
+ if (Intensity<BEACON_INTENSITY)
+ Maze.Beacon.Intensity=Intensity;
+ else
+ Maze.Beacon.Intensity=BEACON_INTENSITY;
+ if (NBoxs<MAX_BOXS)
+ Maze.NBoxs=NBoxs;
+ else
+ Maze.NBoxs=MAX_BOXS;
+ Maze.Radius=50;
+ for(i=0; i < Maze.NBoxs; i++)
+ Maze.Boxs[i].Type=NONE;
+ return OK;
+}
+
+// Init_Box - Initialize data of the NBox obstacle
+// NBox - Identifier of the obstacle
+// X1 - Coordinate X
+// Y1 - Coordinate Y
+// X2 - Coordinate X
+// Y2 - Coordinate Y
+// Type - Type of the obstacle
+// Return: OK - Sucess
+
+int Init_Box(int NBox, int X1, int Y1, int X2, int Y2, int Type)
+{
+ Maze.Boxs[NBox].Type=Type;
+ if (X1<X2)
+ {
+ Maze.Boxs[NBox].X1=X1+LAB_XMIN;
+ Maze.Boxs[NBox].X2=X2+LAB_XMIN;
+ }
+ else
+ {
+ Maze.Boxs[NBox].X1=X2+LAB_XMIN;
+ Maze.Boxs[NBox].X2=X1+LAB_XMIN;
+ }
+ if (Y1<Y2)
+ {
+ Maze.Boxs[NBox].Y1=Y1+LAB_YMIN;
+ Maze.Boxs[NBox].Y2=Y2+LAB_YMIN;
+ }
+ else
+ {
+ Maze.Boxs[NBox].Y1=Y2+LAB_YMIN;
+ Maze.Boxs[NBox].Y2=Y1+LAB_YMIN;
+ }
+ return OK;
+}
+
+// Draw_Maze - Draws the outline of the maze and the obstacles
+// Return: OK - Sucess
+int Draw_Maze(void)
+{
+ int i;
+ grx_rect( Maze.X1, Maze.Y1, Maze.X2, Maze.Y2, OUTCOLOR);
+ grx_rect( Maze.X1-1, Maze.Y1+1, Maze.X2+1, Maze.Y2+1, OUTCOLOR);
+ grx_rect( Maze.X1-2, Maze.Y1+2, Maze.X2+2, Maze.Y2+2, OUTCOLOR);
+ grx_circle(Maze.Beacon.X, Maze.Beacon.Y, Maze.Radius, FINISHCOLOR);
+ grx_disc(Maze.Beacon.X, Maze.Beacon.Y, 10, 7);
+ for (i=0; i<Maze.NBoxs; i++)
+ {
+ if (Maze.Boxs[i].Type==BOX_NON_BLOCK)
+ grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
+ Maze.Boxs[i].X2, Maze.Boxs[i].Y2, NONBLOCKCOLOR);
+ if (Maze.Boxs[i].Type==BOX_BLOCK)
+ grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
+ Maze.Boxs[i].X2, Maze.Boxs[i].Y2, BLOCKCOLOR);
+ }
+ return OK;
+}
+
+int Init_Motor(int NMouse, int Motor, int Radius)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((Motor<0) || (Motor>=2))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].Motors[Motor].Radius=Radius;
+ Mouse[NMouse].Motors[Motor].V=0;
+ Mouse[NMouse].Motors[Motor].Old_V=0.0;
+ return OK;
+}
+
+// Init_Mouse - inicialize the parameters of each mouse
+// NMouse - Identifier of the mouse
+// X - Coordinate X of the center
+// Y - Coordinate Y of the center
+// Radius - Radius of the mouse (size)
+// Dir - Angle of direction in witch i will start
+// NSensors - Number of sensors in the mouse (all types)
+//
+// Return: OK - Sucess
+// ILEGAL_PARAMETER - If NMouse negative of greater than maximum number of mouses
+// Note: All the types of sensors and motors are initialize to NONE
+
+int Init_Mouse(int NMouse, int X, int Y, int Radius, int Dir, int NSensors)
+{
+ int i;
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NSensors<0) || (NSensors>MAX_SENSORS))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].X=(float)X+LAB_XMIN;
+ Mouse[NMouse].Y=(float)Y+LAB_YMIN;
+ Mouse[NMouse].Radius=Radius;
+ Mouse[NMouse].Dir=Dir;
+ Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
+ Mouse[NMouse].NSensors=NSensors;
+ Mouse[NMouse].Old_X=Mouse[NMouse].X;
+ Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
+ Mouse[NMouse].NColision=0;
+ Mouse[NMouse].PColision=0;
+ for(i=0; i < Mouse[NMouse].NSensors; i++)
+ Mouse[NMouse].Sensors[i].Type=NONE;
+
+ Init_Motor(NMouse, MOTOR_LEFT, 10);
+ Init_Motor(NMouse, MOTOR_RIGHT, -10);
+
+ return OK;
+}
+
+// Init_Sensor - Initializes the sensor information
+// NMouse - Identifier of the mouse
+// Sensor - Identifier of the sensor to be used
+// Type - Type of sensor ( Ground, obstacle or beacon sensor )
+// Radius and Pos_Angle - Polar coordinates to determen the sensor position
+// Dir - Diretion of the sensor ( angle between the front and the sensor )
+// Angle - Half of the visual range
+// Intensity - Maximun distance of detect
+int Init_Sensor(int NMouse, int Sensor, int Type, int Radius,
+ int Pos_Angle, int Dir, int Angle, int Intensity)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((Sensor<0) || (Sensor>=Mouse[NMouse].NSensors))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].Sensors[Sensor].Type=Type;
+ Mouse[NMouse].Sensors[Sensor].Radius=Radius;
+ Mouse[NMouse].Sensors[Sensor].Pos_Angle=Pos_Angle;
+ Mouse[NMouse].Sensors[Sensor].Dir=Dir;
+ Mouse[NMouse].Sensors[Sensor].Angle=Angle;
+ Mouse[NMouse].Sensors[Sensor].Intensity=Intensity;
+ if (Type == GROUND)
+ Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_GROUND;
+ if (Type == OBSTACLE)
+ Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_OBSTACLE;
+ if (Type == BEACON)
+ Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_BEACON;
+ return OK;
+}
+
+int Set_Motor_Vel(int NMouse, int NMotor, int Vel)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NMotor<0) || (NMotor>2))
+ return ILEGAL_PARAMETER;
+ Mouse[NMouse].Motors[NMotor].V=Vel;
+ return OK;
+}
+
+int Read_Sensor(int NMouse, int NSensor)
+{
+ int X, Y, Dir, cr, sr, AuxX, AuxY;
+ int Count, AuxCount, AngCount, AuxAngCount, RetColor, Intensity;
+ float Auxf;
+
+ /* Inicial verifications */
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
+ return ILEGAL_PARAMETER;
+
+ /* If Sensor Not define exit */
+ if ( Mouse[NMouse].Sensors[NSensor].Type == NONE )
+ return OK;
+
+ /* Calculate de position of the sensor and is direction */
+ Dir=(int)Mouse[NMouse].Old_Dir+Mouse[NMouse].Sensors[NSensor].Dir;
+ if (Dir >= 360)
+ Dir -= 360;
+ if (Dir < 0)
+ Dir += 360;
+ X= Mouse[NMouse].Old_X*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir+90]));
+ Y= Mouse[NMouse].Old_Y*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir]));
+
+ /* if the Sensor type is OBSTACLE */
+ if ( Mouse[NMouse].Sensors[NSensor].Type == OBSTACLE )
+ {
+ Intensity=Mouse[NMouse].Sensors[NSensor].Intensity;
+ AuxCount=Intensity;
+ /* Scan all the visual field */
+ for (AngCount=(-Mouse[NMouse].Sensors[NSensor].Angle);
+ AngCount<=Mouse[NMouse].Sensors[NSensor].Angle;
+ AngCount++)
+ {
+ AuxAngCount=Dir+AngCount;
+ if (AuxAngCount >= 360)
+ AuxAngCount -= 360;
+ if (AuxAngCount < 0)
+ AuxAngCount += 360;
+ sr=Seno[AuxAngCount];
+ cr=Seno[AuxAngCount+90];
+ Count=Mouse[NMouse].Radius-Mouse[NMouse].Sensors[NSensor].Radius+2;
+ AuxX = X+cr*Count;
+ AuxY = Y+sr*Count;
+ for (; Count<=AuxCount; Count++)
+ {
+ AuxX += cr;
+ AuxY += sr;
+ RetColor = grx_getpixel(AuxX >> 16, AuxY >> 16);
+ if ((RetColor != BACKCOLOR)&&(RetColor != FINISHCOLOR))
+ AuxCount=Count;
+ }
+ }
+ Count=Mouse[NMouse].Sensors[NSensor].Intensity;
+ Count*=Count;
+ AuxCount*=AuxCount;
+ Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)
+ *AuxCount)/Count;
+ Mouse[NMouse].Sensors[NSensor].Value=
+ (0.5*Mouse[NMouse].Sensors[NSensor].Value+0.5*(float)Count);
+ }
+ if ( Mouse[NMouse].Sensors[NSensor].Type == GROUND )
+ {
+ Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MIN_GROUND;
+ AuxX=abs((X>>16)-Maze.Beacon.X);
+ AuxY=abs((Y>>16)-Maze.Beacon.Y);
+ if ((AuxX>50) || (AuxY>50))
+ return OK;
+ if ((AuxX*AuxX+AuxY*AuxY)<Maze.Radius*Maze.Radius)
+ Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MAX_GROUND;
+ }
+
+ if ( Mouse[NMouse].Sensors[NSensor].Type == BEACON )
+ {
+ AuxX=(X>>16)-Maze.Beacon.X;
+ AuxY=(Y>>16)-Maze.Beacon.Y;
+ AngCount=0;
+ if (AuxX!=0)
+ {
+ AuxAngCount=(AuxY<<16)/AuxX;
+ if (AuxAngCount<0)
+ AngCount=90;
+ for (Count=AngCount;Count<AngCount+90;Count++)
+ {
+ if ((Tang[Count]<=AuxAngCount) && (Tang[Count+1]>AuxAngCount))
+ break;
+ }
+ }
+ else
+ Count=90;
+ if (AuxY<0)
+ Count+=180;
+ AuxAngCount=abs(180-abs(Dir-Count));
+ Count=SENSOR_MIN_BEACON;
+ if (AuxAngCount<Mouse[NMouse].Sensors[NSensor].Angle)
+ {
+ Count=AuxX*AuxX+AuxY*AuxY;
+ AuxCount=(int)((float)Maze.Beacon.Intensity*(1.0+(0.4*(float)AuxAngCount)/(float)Mouse[NMouse].Sensors[NSensor].Angle));
+ AuxCount*=AuxCount;
+ if (Count<AuxCount)
+ Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)*Count)/AuxCount;
+ else
+ Count=SENSOR_MIN_BEACON;
+ }
+ Auxf=0.5*((float)Count);
+ Auxf+=0.5*((float)Mouse[NMouse].Sensors[NSensor].Value);
+ Mouse[NMouse].Sensors[NSensor].Value=Auxf;
+ }
+ return OK;
+}
+
+int GetSensor(int NMouse, int NSensor)
+{
+ if ((NMouse<0) || (NMouse>=MAX_MOUSES))
+ return ILEGAL_PARAMETER;
+ if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
+ return ILEGAL_PARAMETER;
+ return (int)Mouse[NMouse].Sensors[NSensor].Value;
+}
+
+int Draw_Mouse(int NMouse, int Flag)
+{
+ int Color;
+ if (!Flag)
+ Color=BACKCOLOR;
+ else
+ {
+ Mouse[NMouse].Old_X=Mouse[NMouse].X;
+ Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
+ Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
+ Color=2;
+ }
+ grx_circle(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y, Mouse[NMouse].Radius, Color);
+ grx_line(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y,
+ Mouse[NMouse].Old_X+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir+90]) >> 16),
+ Mouse[NMouse].Old_Y+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir]) >> 16), Color);
+ return OK;
+}
+
+TASK Redraw_Mouse_Task(int NMouse)
+{
+ char str[40];
+ TIME dwTicks;
+ while(1)
+ {
+ dwTicks=sys_gettime(NULL);
+ Draw_Mouse(NMouse, FALSE);
+ Draw_Mouse(NMouse, TRUE);
+ sprintf(str,"Colision: %4d", (int)Mouse[NMouse].NColision);
+ grx_text(str, NMouse*150, 21, 7, 0);
+ sprintf(str,"Motor: %4d Sensor 0: %4d Sensor 1: %4d Sensor 2: %4d Sensor 3: %4d",
+ (int)Mouse[NMouse].Motors[0].Old_V+(int)Mouse[NMouse].Motors[1].Old_V,
+ (int)Mouse[NMouse].Sensors[0].Value, (int)Mouse[NMouse].Sensors[1].Value,
+ (int)Mouse[NMouse].Sensors[2].Value, (int)Mouse[NMouse].Sensors[3].Value);
+ if (NMouse==0)
+ grx_text(str, 1, 1, 7, 0);
+ sprintf(str,"Sensor 4: %4d Sensor 5: %4d Ticks: %4d",
+ (int)Mouse[NMouse].Sensors[4].Value, (int)Mouse[NMouse].Sensors[5].Value,
+ (int)(sys_gettime(NULL)-dwTicks)/1000);
+ if (NMouse==0)
+ grx_text(str, 1, 11, 7, 0);
+ task_endcycle();
+ }
+}
+
+TASK Redraw_Maze_Task(void)
+{
+ while(1)
+ {
+ Draw_Maze();
+ task_endcycle();
+ }
+}
+
+TASK Referee(void)
+{
+ int Counter, Box_Min_X, Box_Max_X ,Box_Min_Y, Box_Max_Y;
+ int deltaX, deltaY, Radius;
+ int Colision;
+ int NMouse;
+
+ while(1)
+ {
+ for(NMouse=0;NMouse<NMouses;NMouse++)
+ {
+ Colision=0;
+ Radius=Mouse[NMouse].Radius;
+ if(Mouse[NMouse].Y<(Maze.Y1+Radius))
+ Colision++;
+ if(Mouse[NMouse].Y>(Maze.Y2-Radius))
+ Colision++;
+ if(Mouse[NMouse].X<(Maze.X1+Radius))
+ Colision++;
+ if(Mouse[NMouse].X>(Maze.X2-Radius))
+ Colision++;
+ for(Counter=0; Counter<Maze.NBoxs; Counter++)
+ {
+ Box_Min_X=Maze.Boxs[Counter].X1-1;
+ Box_Max_X=Maze.Boxs[Counter].X2+1;
+ Box_Min_Y=Maze.Boxs[Counter].Y1-1;
+ Box_Max_Y=Maze.Boxs[Counter].Y2+1;
+ Radius=Mouse[NMouse].Radius;
+ if(Mouse[NMouse].Y<(Box_Min_Y-Radius))
+ continue;
+ if(Mouse[NMouse].Y>(Box_Max_Y+Radius))
+ continue;
+ if(Mouse[NMouse].X<(Box_Min_X-Radius))
+ continue;
+ if(Mouse[NMouse].X>(Box_Max_X+Radius))
+ continue;
+ if((Mouse[NMouse].X>=Box_Min_X) && (Mouse[NMouse].X<=Box_Max_X))
+ if((Mouse[NMouse].Y>=(Box_Min_Y-Radius))
+ && (Mouse[NMouse].Y<=(Box_Max_Y+Radius)))
+ Colision++;
+ if((Mouse[NMouse].Y>=Box_Min_Y) && (Mouse[NMouse].Y<=Box_Max_Y))
+ if((Mouse[NMouse].X>=(Box_Min_X-Radius))
+ && (Mouse[NMouse].X<=(Box_Max_X+Radius)))
+ Colision++;
+ Radius=sqr(Radius);
+ deltaX=sqr(Mouse[NMouse].X-Box_Min_X);
+ deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ deltaX=sqr(Mouse[NMouse].X-Box_Max_X);
+ deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
+ if(deltaX+deltaY<=Radius)
+ Colision++;
+ }
+ if (Mouse[NMouse].PColision && !Colision)
+ Mouse[NMouse].NColision++;
+
+ Mouse[NMouse].PColision=Colision;
+ }
+ task_endcycle();
+ }
+ return (void *)0;
+}
+
+TASK Calculate_Position(int NMouse)
+{
+ float w, v, dt;
+ int b;
+ while(1)
+ {
+ b=(Mouse[NMouse].Motors[MOTOR_LEFT].Radius-
+ Mouse[NMouse].Motors[MOTOR_RIGHT].Radius);
+ if (b<0)
+ b=-b;
+ w=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V-
+ Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
+ w/=(float)b;
+ v=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V+
+ Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
+ v/=2.0;
+ dt=CALC_PERIOD/1000000.0;
+ Mouse[NMouse].Dir += (180.0*w/PI)*dt;
+ if (Mouse[NMouse].Dir >= 360)
+ Mouse[NMouse].Dir -= 360;
+ if (Mouse[NMouse].Dir < 0)
+ Mouse[NMouse].Dir += 360;
+ v *= dt/65536.0;
+ b=(float)Seno[(int)Mouse[NMouse].Dir+90];
+ Mouse[NMouse].X += v*b;
+ b=(float)Seno[(int)Mouse[NMouse].Dir];
+ Mouse[NMouse].Y += v*b;
+ Mouse[NMouse].Motors[0].Old_V=
+ (0.8187*Mouse[NMouse].Motors[0].Old_V+
+ 0.1813*(float)Mouse[NMouse].Motors[0].V);
+ Mouse[NMouse].Motors[1].Old_V=
+ (0.8187*Mouse[NMouse].Motors[1].Old_V+
+ 0.1813*(float)Mouse[NMouse].Motors[1].V);
+ task_endcycle();
+ }
+}
+
+#define SENSOR_LEFT 0
+#define SENSOR_FRONT 1
+#define SENSOR_RIGTH 2
+#define SENSOR_GROUND 3
+#define SENSOR_B_LEFT 4
+#define SENSOR_B_RIGHT 5
+#define MAX_SPEED 50
+#define DIST_DIR GetSensor(NMouse, SENSOR_RIGTH)
+#define DIST_ESQ GetSensor(NMouse, SENSOR_LEFT)
+#define DIST_FRENTE GetSensor(NMouse, SENSOR_FRONT)
+#define FAROL_ESQ GetSensor(NMouse, SENSOR_B_LEFT)
+#define FAROL_DIR GetSensor(NMouse, SENSOR_B_RIGHT)
+#define FAROL_LIM_INF SENSOR_MIN_BEACON+5
+
+#define DIST0 88 //Distancia minima optima
+#define DIST1 DIST0 + 5 // 60%
+#define DIST2 DIST1 + 10 // PARADO
+#define DIST3 DIST2 + 10 // TRAS
+
+#define DISTMAX 120
+#define NENHUM 0
+#define ESQUERDA 1
+#define DIREITA 2
+#define contorno ContornoArr[NMouse]
+
+TASK MouseTask(int NMouse)
+{
+ int i;
+ //char str[100];
+ unsigned char flag;
+ static unsigned char ContornoArr[MAX_MOUSES];
+ signed char modulo;
+
+ Init_Sensor(NMouse, SENSOR_LEFT, OBSTACLE, 14, -45, -45, 25, 15); // Left
+ Init_Sensor(NMouse, SENSOR_FRONT, OBSTACLE, 14, 0, 0, 25, 15); // Center
+ Init_Sensor(NMouse, SENSOR_RIGTH, OBSTACLE, 14, 45, 45, 25, 15); // Rigth
+ Init_Sensor(NMouse, SENSOR_GROUND, GROUND, 10, 180, 180, 0, 20); // Ground
+ Init_Sensor(NMouse, SENSOR_B_LEFT, BEACON, 4, -45, -25, 30, 0); // Left
+ Init_Sensor(NMouse, SENSOR_B_RIGHT, BEACON, 4, 45, 25, 30, 0); // Rigth
+ contorno = NENHUM;
+ Mouse[NMouse].Flag=1;
+
+ while(1)
+ {
+ for(i=0; i<8; i++)
+ Read_Sensor(NMouse, i);
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED);
+
+ flag = ((DIST_DIR>DIST3) && contorno==ESQUERDA) ||
+ ((DIST_ESQ>DIST3) && contorno==DIREITA);
+
+ if ( (DIST_FRENTE>DISTMAX) || flag) {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
+ if (contorno == ESQUERDA)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
+ }
+ else {
+
+ // ---------------- Contorno da Esquerda ---------------
+ if (contorno!=DIREITA){
+ if (DIST_ESQ>DIST1) { // Sensor da esquerda
+ contorno = ESQUERDA;
+ if (DIST_ESQ>DIST3) {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
+ }
+ else
+ if (DIST_ESQ>DIST2)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, 10);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/4);
+ }
+ else
+ if (contorno== ESQUERDA) {
+ if(DIST_ESQ<DIST0)
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/10);
+ }
+ }
+
+ // ---------------- Contorno da Direita ---------------
+ if (contorno!=ESQUERDA){
+ if (DIST_DIR>DIST1) { // Sensor da direita
+ contorno = DIREITA;
+ if (DIST_DIR>DIST3) {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
+ }
+ else
+ if (DIST_DIR>DIST2)
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, 10);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/4);
+ }
+ else
+ if (contorno== DIREITA) {
+ if (DIST_DIR<DIST0)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/10);
+ }
+ }
+
+ // --------------- Desempancar contornos com o farol ------------
+
+ if ((contorno == ESQUERDA && FAROL_DIR > FAROL_ESQ && FAROL_DIR > FAROL_LIM_INF) ||
+ (contorno == DIREITA && FAROL_ESQ > FAROL_DIR && FAROL_ESQ > FAROL_LIM_INF) )
+ contorno = NENHUM;
+
+
+
+ if (contorno == NENHUM)
+ {
+ modulo = FAROL_DIR - FAROL_ESQ;
+ if (modulo < 0 )
+ modulo = - modulo;
+
+ // Se nao estiver na direçao certa, ajustar
+ if (modulo > 10) {
+ if (FAROL_DIR > FAROL_ESQ)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
+ }
+ else //velocidade controlada
+ if (modulo > 2) {
+ if (FAROL_DIR > FAROL_ESQ)
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*6/10);
+ else
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*6/10);
+ }
+ }
+ }
+ if (GetSensor(NMouse, SENSOR_GROUND)==SENSOR_MAX_GROUND)
+ {
+ Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
+ Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
+ }
+
+ task_endcycle();
+ }
+ return (void *)0;
+}
+
+void my_end(void *arg)
+{
+ grx_close();
+}
+
+/* --------------------------------- Main program -----------------------------*/
+
+int main(int argc, char *argv[])
+{
+ int i;
+ char c;
+ int pid;
+
+ HARD_TASK_MODEL mp;
+ SOFT_TASK_MODEL ms;
+
+ // char StrAux[15];
+
+ for (i=0; i<NMouses; i++)
+ Mouse[i].Flag=0;
+ for (i=0; i<(360+90); i++) // Inicializar a tabela de senos
+ Seno[i]=(int)(65536.0*sin((float)i/180.0*PI));
+
+ for (i=0; i<180; i++) // Inicializar a tabela de tangente
+ if (i!=90)
+ Tang[i]=(int)(((float)Seno[i]/(float)Seno[i+90])*65536.0);
+ else
+ Tang[i]=INT_MAX;
+
+ // Definir fun‡Æo de saida
+ sys_atrunlevel(my_end, (void *)NULL, RUNLEVEL_BEFORE_EXIT);
+
+ hard_task_default_model(mp);
+ hard_task_def_usemath(mp);
+ hard_task_def_group(mp, MOUSEGROUP);
+ hard_task_def_wcet(mp, 1); // wcet ignored by the configuration file!
+
+ soft_task_default_model(ms);
+ soft_task_def_group(ms, MOUSEGROUP);
+ soft_task_def_met(ms, 1000);
+
+ for (i=0;i<NMouses;i++)
+ {
+ hard_task_def_arg(mp, (void *)i);
+ soft_task_def_arg(ms, (void *)i);
+
+ hard_task_def_mit(mp, MOUSE_PERIOD);
+ pid = task_create("Mouse", MouseTask, &mp, NULL);
+ if (pid == NIL)
+ {
+ perror("Creating Mouse:");
+ sys_end();
+ }
+
+ hard_task_def_mit(mp, CALC_PERIOD);
+ pid = task_create("Calc", Calculate_Position, &mp, NULL);
+ if (pid == NIL)
+ {
+ perror("Creating Calc:");
+ sys_end();
+ }
+
+ soft_task_def_period(ms, REDRAW_MOUSE_PERIOD);
+ pid = task_create("Redraw_Mouse", Redraw_Mouse_Task, &ms, NULL);
+ if (pid == NIL)
+ {
+ perror("Creating Redraw_Moude:");
+ sys_end();
+ }
+ }
+
+ hard_task_def_mit(mp, REFEREE_PERIOD);
+ pid = task_create("Referee1", Referee, &mp, NULL);
+
+ hard_task_def_mit(mp, REDRAW_MAZE_PERIOD);
+ pid = task_create("Redraw_Maze", Redraw_Maze_Task, &mp, NULL);
+
+ grx_open(640,480,8);
+ group_activate(MOUSEGROUP);
+ do
+ {
+ c = keyb_getch(BLOCK);
+ } while (c != ESC);
+
+ task_nopreempt();
+ sys_end();
+ return 0;
+}
+
+/* the buffer b is scannedc to search for numbers
+ at the first non-number the function stops */
+void geti(char *b, int *pos, int *res)
+{
+ // skip first chars
+ while (!isdigit(b[*pos]))
+ (*pos)++;
+
+
+ // read the numbers
+ *res = 0;
+ do {
+ *res = (*res * 10) + b[*pos] - '0';
+ (*pos)++;
+ } while (isdigit(b[*pos]));
+}
+
+void read_cfg_file(int argc, char **argv)
+{
+ int i, err, Temp1, Temp2, Temp3, Temp4, Temp5;
+ DOS_FILE *fp;
+ char myfilebuf[1000];
+ int myfilebuf_length;
+
+ int pos = 0;
+
+ if (argc==2) {
+ fp = DOS_fopen(argv[1],"r");
+
+ if (fp) {
+ /* read up to 1000 chars */
+ myfilebuf_length = DOS_fread(&myfilebuf,1,1000,fp);
+
+ /* check for errors */
+ err = DOS_error();
+
+ cprintf("Read %d bytes...\n", myfilebuf_length);
+
+ if (err) {
+ cprintf("Error %d reading file...Using default values\n", err);
+ }
+ else
+ {
+ geti(myfilebuf, &pos, &NMouses); // Number of Mouses
+ for (i=0;i<NMouses;i++) {
+ geti(myfilebuf, &pos, &Temp1); // Mouse X coordinate
+ geti(myfilebuf, &pos, &Temp2); // Mouse Y coordinate
+ geti(myfilebuf, &pos, &Temp3); // Mouse radius
+ geti(myfilebuf, &pos, &Temp4); // Mouse orientation
+ Init_Mouse(i, Temp1, Temp2, Temp3, Temp4, 6);
+ }
+ geti(myfilebuf, &pos, &Temp1); // Beacon X coordinate
+ geti(myfilebuf, &pos, &Temp2); // Beacon Y coordinate
+ geti(myfilebuf, &pos, &Temp3); // Beacon intensity
+ geti(myfilebuf, &pos, &i); // Number of boxs
+ Init_Maze(Temp1, Temp2, Temp3, i);
+ for(; i>0; i--) {
+ geti(myfilebuf, &pos, &Temp1); // Box X1 Coordinate
+ geti(myfilebuf, &pos, &Temp2); // Box Y1 Coordinate
+ geti(myfilebuf, &pos, &Temp3); // Box X2 Coordinate
+ geti(myfilebuf, &pos, &Temp4); // Box Y2 Coordinate
+ geti(myfilebuf, &pos, &Temp5); // Type of Box
+ if (Temp5)
+ Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_BLOCK);
+ else
+ Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_NON_BLOCK);
+ }
+ DOS_fclose(fp);
+ return;
+ }
+ }
+ else {
+ /* error!! */
+ err = DOS_error();
+ /* note that if you call DOS_error() here, it return 0!!! */
+ cprintf("Error %d opening myfile.txt...Using default values\n", err);
+ }
+
+ // Default value if no file is passed
+ NMouses=2;
+ Init_Maze(500, 350, 400, 1);
+ Init_Box(0, 200, 200, 300, 250, BOX_NON_BLOCK);
+ Init_Mouse(0, 100, 100, 15, 45, 6);
+ Init_Mouse(1, 100, 150, 15, 90, 6);
+ }
+ else {
+ cprintf("Wrong number of arguments...\n");
+ l1_exit(0);
+ }
+}
Index: tags/rel_0_5/robots/lab.txt
===================================================================
--- tags/rel_0_5/robots/lab.txt (nonexistent)
+++ tags/rel_0_5/robots/lab.txt (revision 1657)
@@ -0,0 +1,10 @@
+2
+530 380 15 270
+480 380 15 270
+380 300 400 5
+430 060 460 400 0
+350 100 430 130 0
+000 100 300 130 0
+150 200 430 230 0
+120 300 150 400 0
+
Index: tags/rel_0_5/robots/makefile
===================================================================
--- tags/rel_0_5/robots/makefile (nonexistent)
+++ tags/rel_0_5/robots/makefile (revision 1657)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS = mouse2
+
+include $(BASE)/config/example.mk
+
+mouse2:
+ make -f $(SUBMAKE) APP=mouse2 INIT= OTHEROBJS="initfile.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
+
Index: tags/rel_0_5/robots/readme
===================================================================
--- tags/rel_0_5/robots/readme (nonexistent)
+++ tags/rel_0_5/robots/readme (revision 1657)
@@ -0,0 +1,9 @@
+Robots demo
+-----------
+
+This demo has been developed in the University of Alveiro, Portugal.
+
+See the included PDF files for more informations.
+
+Paolo
+pj@sssup.it
Index: tags/rel_0_5/auto/utils.c
===================================================================
--- tags/rel_0_5/auto/utils.c (nonexistent)
+++ tags/rel_0_5/auto/utils.c (revision 1657)
@@ -0,0 +1,131 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: utils.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+#include "include/auto.h"
+#include "include/utils.h"
+#include <string.h>
+#include <stdlib.h>
+
+float rand_01()
+{
+ return (((float)(rand()%20) / 100.0) + 0.8);
+}
+
+int rand_color()
+{
+ return (rand()%16);
+}
+
+int round(float value)
+{
+ return ((int)(value + 0.5));
+}
+
+void reverse(char s[]) {
+ int c, i, j;
+
+ for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
+ c = s[i];
+ s[i] = s[j];
+ s[j] = c;
+ }
+}
+
+char * itoa(int n, char *s) {
+ int i, sign;
+
+ if ((sign = n) < 0)
+ n = -n;
+ i = 0;
+
+ do {
+ s[i++] = n % 10 + '0';
+ } while ((n /= 10) > 0);
+
+ if (sign < 0)
+ s[i++] = '-';
+ s[i] = 0;
+
+ reverse(s);
+
+ return s;
+}
+
+time int2time(int t)
+{
+ time ts;
+
+ ts.dec = t % 10;
+ ts.sec = (t/10) % 60;
+ ts.min = (int)(t / 600);
+
+ return ts;
+}
+
+
+
+
+
+
+
+
+
+
+
Index: tags/rel_0_5/auto/include/utils.h
===================================================================
--- tags/rel_0_5/auto/include/utils.h (nonexistent)
+++ tags/rel_0_5/auto/include/utils.h (revision 1657)
@@ -0,0 +1,76 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: utils.h,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------ */
+/* Useful functions */
+/* ------------------ */
+
+#ifndef __UTILS_H_
+
+#define __UTILS_H_
+
+float rand_01();
+int rand_color();
+int round(float value);
+char * itoa(int n, char *s);
+void reverse(char s[]);
+time int2time(int t);
+
+#endif
Index: tags/rel_0_5/auto/include/const.h
===================================================================
--- tags/rel_0_5/auto/include/const.h (nonexistent)
+++ tags/rel_0_5/auto/include/const.h (revision 1657)
@@ -0,0 +1,141 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: const.h,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------ */
+/* Useful constants */
+/* ------------------ */
+
+#ifndef __CONST_H_
+
+#define __CONST_H_
+
+/* Screen dimensions */
+#define SCREEN_WIDTH 800
+#define SCREEN_HEIGHT 600
+#define SCREEN_BIT_COLORS 8
+
+/* Visible area */
+#define TEL_WIDTH 50
+#define TEL_HEIGHT 50
+
+/* Car dimensions */
+#define CAR_WIDTH 12
+#define CAR_HEIGHT 12
+#define CAR_W 8
+#define CAR_H 10
+
+/* Track dimensions */
+#define TRACK_WIDTH 500
+#define TRACK_HEIGHT 500
+
+/* Track position */
+#define TRACK_X1 0
+#define TRACK_Y1 0
+#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
+#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
+
+/* Max number of car on track */
+#define MAX_CAR_NUMBER 10
+#define DRIVERS_NUMBER 20
+#define MAX_DRIVER_NAME_LENGTH 20
+#define MAX_TRACK_NAME_LENGTH 20
+#define TRACK_NUMBER 4
+
+/* Lap direction */
+#define CLOCK 0
+#define ANTICLOCK 1
+
+/* Information display coords */
+#define CMD_WIDTH TRACK_WIDTH
+#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
+
+/* Car position limits */
+#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
+#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
+#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
+#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
+
+/* Road constants */
+#define LEFT_ONLY 10
+#define RIGHT_ONLY 11
+#define ROAD_OK 12
+#define NO_ROAD 13
+
+/* Collision constants */
+#define COLLISION_LEFT 20
+#define COLLISION_RIGHT 21
+#define COLLISION_BACK 22
+#define NO_COLL 0
+
+/* CAB constants */
+#define ROAD_MSG_DIM sizeof(road_info)
+#define ROAD_MSG_READER 4
+
+#define CAR_MSG_DIM sizeof(car_status)
+#define CAR_MSG_READER 5
+
+/* Tasks parameters */
+#define SENSOR_WCET 3000
+#define SENSOR_PERIOD 40000
+#define CONTROL_WCET 1000
+#define CONTROL_PERIOD 40000
+
+#endif
+
Index: tags/rel_0_5/auto/include/auto.h
===================================================================
--- tags/rel_0_5/auto/include/auto.h (nonexistent)
+++ tags/rel_0_5/auto/include/auto.h (revision 1657)
@@ -0,0 +1,188 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: auto.h,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------- */
+/* Useful structures */
+/* ------------------- */
+
+#ifndef __CAR_H_
+
+#define __CAR_H_
+
+#include <modules/cabs.h>
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/types.h>
+#include <drivers/keyb.h>
+#include <drivers/glib.h>
+#include <semaphore.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "const.h"
+
+#define degree_to_rad(a) ((M_PI/180.0)*(a))
+#define rad_to_degree(a) ((180.0/M_PI)*(a))
+
+typedef struct {
+ int x;
+ int y;
+} point;
+
+typedef struct {
+ float x,y;
+} point_f;
+
+typedef struct {
+ float mod;
+ float phase;
+} vector;
+
+typedef struct {
+ point_f pos;
+ float orient;
+} car_status;
+
+typedef struct {
+ int left_border;
+ int right_border;
+ int distance;
+ float curve;
+ point opps_list[MAX_CAR_NUMBER];
+ int opps_number;
+ int collision;
+ int flag;
+} road_info;
+
+typedef struct {
+ int left,center,right;
+} road_strip;
+
+typedef struct {
+ PID sensor_pid,control_pid;
+ int number;
+ char driver[MAX_DRIVER_NAME_LENGTH];
+ float max_speed, min_acc, max_acc;
+ float rage;
+ CAB road_status_cab;
+ CAB car_status_cab;
+ int color;
+} car_params;
+
+typedef struct {
+ char name[MAX_TRACK_NAME_LENGTH]; // il nome del file
+ point pole_pos; // la posizione di partenza
+ float pole_orient; // la direzione di partenza
+ int lap; // il senso di marcia: CLOCK, ANTICLOCK
+ int selected; // it's a flag marking the actually selected track
+} track;
+
+typedef struct {
+ int min;
+ int sec;
+ int dec;
+} time;
+
+extern car_params cars[MAX_CAR_NUMBER];
+extern char track_img[TRACK_WIDTH*TRACK_HEIGHT];
+extern track track_list[TRACK_NUMBER];
+
+/* ---------------------------------------- */
+/* Functions definition */
+/* ---------------------------------------- */
+
+/* CABs R/W functions */
+int set_car_status(car_status, CAB); // sends the new status according to the control law
+car_status get_car_status(CAB); // reads car status from a CAB
+int set_road_info(road_info, CAB); // sends the new road informations
+road_info get_road_info(CAB); // reads road status values from a CAB
+
+/* Keyboard functions */
+void keyb_handler();
+void endfun(KEY_EVT *);
+void my_close(void *);
+
+/* Display functions */
+void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
+void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
+void cmd_display();
+
+/* Closing function */
+void byebye();
+void error_msg();
+
+/* Tasks */
+TASK sensor(); // Camera car task
+TASK control(); // Car controller task
+TASK manual(); // Manual driving task
+TASK actuator(); // Graphic drawing task
+TASK info(); // Car informations display task
+
+/* Tasks management */
+void hard_car_create();
+void soft_car_create();
+void killcar();
+
+/* Tracks management */
+int track_init();
+
+#endif
+
Index: tags/rel_0_5/auto/tracks/monaco.raw
===================================================================
--- tags/rel_0_5/auto/tracks/monaco.raw (nonexistent)
+++ tags/rel_0_5/auto/tracks/monaco.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/tracks/brazil.raw
===================================================================
--- tags/rel_0_5/auto/tracks/brazil.raw (nonexistent)
+++ tags/rel_0_5/auto/tracks/brazil.raw (revision 1657)
@@ -0,0 +1,2 @@
+ +!"#
\ No newline at end of file
Index: tags/rel_0_5/auto/tracks/demo1.raw
===================================================================
--- tags/rel_0_5/auto/tracks/demo1.raw (nonexistent)
+++ tags/rel_0_5/auto/tracks/demo1.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/tracks/demo2.raw
===================================================================
--- tags/rel_0_5/auto/tracks/demo2.raw (nonexistent)
+++ tags/rel_0_5/auto/tracks/demo2.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/jetctrl.c
===================================================================
--- tags/rel_0_5/auto/jetctrl.c (nonexistent)
+++ tags/rel_0_5/auto/jetctrl.c (revision 1657)
@@ -0,0 +1,155 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: jetctrl.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * this file is directly derived from the demos/jumpball/jetctrl.c .
+ * I just added this controls to check when the system will become overloaded
+ */
+
+#define WCET_JETDUMMY 200
+#define PERIOD_JETDUMMY 100000
+#define DUMMY_PID 1
+
+#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
+#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
+
+/* the point (x, y) is the top left corner */
+#define JET_DUMMY_X (TRACK_X1+360)
+#define JET_DUMMY_Y (TRACK_Y2+32)
+
+// JetControl
+
+#include "semaphore.h"
+#include "include/const.h"
+#include "kernel/func.h"
+#include "drivers/glib.h"
+
+extern sem_t grx_mutex;
+
+/* useful colors... */
+int white;
+int black;
+extern int red;
+extern int lightgray;
+
+TASK jetdummy_task(void *arg)
+{
+ TIME now_dummy, last_dummy, diff_dummy, slice;
+ struct timespec now, last, diff;
+ int x = 0;
+ int height;
+
+ NULL_TIMESPEC(&last);
+ last_dummy = 0;
+ for (;;) {
+ task_nopreempt();
+ jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
+ sys_gettime(&now);
+ task_preempt();
+
+ SUBTIMESPEC(&now, &last, &diff);
+ slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
+ diff_dummy = now_dummy - last_dummy;
+
+ height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
+
+ TIMESPEC_ASSIGN(&last, &now);
+ last_dummy = now_dummy;
+
+ sem_wait(&grx_mutex);
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
+ JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
+ grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
+ JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
+ grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
+ JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
+ sem_post(&grx_mutex);
+
+ x = (x+1)%JET_DUMMY_WIDTH;
+
+ task_endcycle();
+ }
+}
+
+void init_jetcontrol(void)
+{
+ SOFT_TASK_MODEL m4;
+
+ PID p4;
+
+ /* useful colors ... */
+ white = WHITE;
+ black = BLACK;
+
+ /* scenario */
+ sem_wait(&grx_mutex);
+ grx_text("System load",
+ JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
+ grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
+ JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
+
+ grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
+ grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
+
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
+ grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
+ sem_post(&grx_mutex);
+
+ /* jetdummy task */
+ soft_task_default_model(m4);
+ soft_task_def_period(m4, PERIOD_JETDUMMY);
+ soft_task_def_met(m4, WCET_JETDUMMY);
+ soft_task_def_usemath(m4);
+ p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
+ if (p4 == -1) {
+ grx_close();
+ perror("Could not create task <jetdummy>");
+ sys_end();
+ }
+ task_activate(p4);
+}
+
Index: tags/rel_0_5/auto/cars/car2.raw
===================================================================
--- tags/rel_0_5/auto/cars/car2.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car2.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car3.raw
===================================================================
--- tags/rel_0_5/auto/cars/car3.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car3.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car4.raw
===================================================================
--- tags/rel_0_5/auto/cars/car4.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car4.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car5.raw
===================================================================
--- tags/rel_0_5/auto/cars/car5.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car5.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car6.raw
===================================================================
--- tags/rel_0_5/auto/cars/car6.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car6.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car7.raw
===================================================================
--- tags/rel_0_5/auto/cars/car7.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car7.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/boom.raw
===================================================================
--- tags/rel_0_5/auto/cars/boom.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/boom.raw (revision 1657)
@@ -0,0 +1 @@
+      
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car8.raw
===================================================================
--- tags/rel_0_5/auto/cars/car8.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car8.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car9.raw
===================================================================
--- tags/rel_0_5/auto/cars/car9.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car9.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car10.raw
===================================================================
--- tags/rel_0_5/auto/cars/car10.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car10.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/fumo.raw
===================================================================
--- tags/rel_0_5/auto/cars/fumo.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/fumo.raw (revision 1657)
@@ -0,0 +1 @@
+!!!!!!!!!!!!!!!!!!!!!!
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car11.raw
===================================================================
--- tags/rel_0_5/auto/cars/car11.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car11.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car12.raw
===================================================================
--- tags/rel_0_5/auto/cars/car12.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car12.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car13.raw
===================================================================
--- tags/rel_0_5/auto/cars/car13.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car13.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car14.raw
===================================================================
--- tags/rel_0_5/auto/cars/car14.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car14.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car15.raw
===================================================================
--- tags/rel_0_5/auto/cars/car15.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car15.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car0.raw
===================================================================
--- tags/rel_0_5/auto/cars/car0.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car0.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/cars/car1.raw
===================================================================
--- tags/rel_0_5/auto/cars/car1.raw (nonexistent)
+++ tags/rel_0_5/auto/cars/car1.raw (revision 1657)
@@ -0,0 +1 @@
+
\ No newline at end of file
Index: tags/rel_0_5/auto/auto.c
===================================================================
--- tags/rel_0_5/auto/auto.c (nonexistent)
+++ tags/rel_0_5/auto/auto.c (revision 1657)
@@ -0,0 +1,530 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: auto.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+
+int car_number;
+car_params cars[MAX_CAR_NUMBER];
+char drivers[DRIVERS_NUMBER][MAX_DRIVER_NAME_LENGTH] = {
+ "M.Schumacher",
+ "D.Coulthard",
+ "R.Schumacher",
+ "M.Hakkinen",
+ "R.Barrichello",
+ "J.P.Montoya",
+ "E.Irvine",
+ "J.Trulli",
+ "H.Frentzen",
+ "J.Villeneuve",
+ "J.Alesi",
+ "G.Fisichella",
+ "O.Panis",
+ "O.Wurz",
+ "J.Button",
+ "P.P.Diniz",
+ "P.De La Rosa",
+ "T.Marques",
+ "R.Zonta",
+ "G.Mazzacane"
+};
+
+extern char sprite[18][CAR_WIDTH*CAR_HEIGHT];
+
+/* Semaphores */
+sem_t grx_mutex;
+
+/* Useful colors */
+int red = rgb16(255, 0, 0);
+int green = rgb16( 0, 255, 0);
+int blue = rgb16( 0, 0, 255);
+int lightgray = rgb16(192, 192, 192);
+
+/* JetCTRL Initialization */
+void init_jetcontrol(void);
+
+/* -------------------------------------------------------*/
+
+/* --------------------- */
+/* Handling car status */
+/* --------------------- */
+
+int set_car_status(car_status cs, CAB cab_id) {
+ char *msg;
+
+ msg = cab_reserve(cab_id);
+ memcpy(msg, &cs, CAR_MSG_DIM);
+ return(cab_putmes(cab_id, msg));
+}
+
+car_status get_car_status(CAB cab_id) {
+ char *msg;
+ car_status status;
+
+ msg = cab_getmes(cab_id);
+ memcpy(&status, msg, CAR_MSG_DIM);
+ cab_unget(cab_id, msg);
+
+ return (status);
+}
+
+/* ---------------------------- */
+/* Handling road informations */
+/* ---------------------------- */
+
+int set_road_info(road_info info, CAB road_status_cab) {
+ char *msg;
+
+ msg = cab_reserve(road_status_cab);
+ memcpy(msg, &info, ROAD_MSG_DIM);
+ return(cab_putmes(road_status_cab, msg));
+}
+
+road_info get_road_info(CAB road_status_cab) {
+ char *msg;
+ road_info info;
+
+ msg = cab_getmes(road_status_cab);
+ memcpy(&info, msg, ROAD_MSG_DIM);
+ cab_unget(road_status_cab, msg);
+
+ return (info);
+}
+
+/* -------------------------------------------------------*/
+
+/* Closing function */
+void byebye()
+{
+ grx_close();
+
+ // we need clear to reposition the cursor in the right place after
+ // going back from the graphical mode.
+ clear();
+
+ kern_printf("Race is over!\n");
+}
+
+/* -------------------------------------------------------*/
+
+/* ------------------- */
+/* Hard car creation */
+/* ------------------- */
+
+void hard_car_create() {
+ car_params cp;
+ HARD_TASK_MODEL sensor_m, control_m;
+ PID sensor_pid, control_pid;
+ TIME seed; /* used to init the random seed */
+ int drv_ind;
+
+ if (car_number >= MAX_CAR_NUMBER) return;
+
+ /* Randomize!!!! */
+ seed = sys_gettime(NULL);
+ srand(seed);
+
+ /* CAB creation */
+ cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
+ cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
+
+ /* Car parameters initialization */
+ cp.max_speed = rand_01();
+ cp.min_acc = cp.max_speed;
+ cp.max_acc = cp.max_speed;
+ cp.rage = cp.max_speed;
+ cp.color = 3+car_number;
+ cp.number = car_number;
+ drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
+
+ /* Sets driver's name without duplications */
+ strcpy(cp.driver, drivers[drv_ind]);
+ while (!strcmp(cp.driver,"***"))
+ strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
+ strcpy(drivers[drv_ind],"***");
+
+ cars[car_number] = cp;
+
+ /* ------------ */
+ /* Task Calls */
+ /* ------------ */
+
+ /* sensor task creation */
+ hard_task_default_model(sensor_m);
+
+ hard_task_def_arg(sensor_m, (void *)car_number);
+ hard_task_def_wcet(sensor_m, SENSOR_WCET);
+ hard_task_def_mit(sensor_m, SENSOR_PERIOD);
+ hard_task_def_usemath(sensor_m);
+ sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
+ if(sensor_pid == -1)
+ sys_end();
+
+ /* control task creation */
+ hard_task_default_model(control_m);
+ hard_task_def_arg(control_m, (void *)car_number);
+ hard_task_def_wcet(control_m, CONTROL_WCET);
+ hard_task_def_mit(control_m, CONTROL_PERIOD);
+ hard_task_def_usemath(control_m);
+ control_pid = task_create("controller", control, &control_m, NULL);
+ if(control_pid == -1)
+ sys_end();
+
+ cars[car_number].sensor_pid = sensor_pid;
+ cars[car_number].control_pid = control_pid;
+ car_number++; // increases cars number
+
+ task_activate(sensor_pid);
+ task_activate(control_pid);
+}
+
+/* -------------------------------------------------------*/
+
+/* ------------------- */
+/* Soft car creation */
+/* ------------------- */
+
+void soft_car_create() {
+ car_params cp;
+ SOFT_TASK_MODEL sensor_m, control_m;
+ PID sensor_pid, control_pid;
+ TIME seed; /* used to init the random seed */
+ int drv_ind;
+
+ if (car_number >= MAX_CAR_NUMBER) return;
+
+ /* Randomize!!!! */
+ seed = sys_gettime(NULL);
+ srand(seed);
+
+ /* CAB creation */
+ cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
+ cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
+
+ /* Car parameters initialization */
+ cp.max_speed = rand_01();
+ cp.min_acc = cp.max_speed;
+ cp.max_acc = cp.max_speed;
+ cp.rage = cp.max_speed;
+ cp.color = 8+car_number;
+ cp.number = car_number;
+ drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
+
+ /* Sets driver's name without duplications */
+ strcpy(cp.driver, drivers[drv_ind]);
+ while (!strcmp(cp.driver,"***"))
+ strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
+ strcpy(drivers[drv_ind],"***");
+ cars[car_number] = cp;
+
+ /* ------------ */
+ /* Task Calls */
+ /* ------------ */
+
+ /* sensor task creation */
+ soft_task_default_model(sensor_m);
+
+ soft_task_def_arg(sensor_m, (void *)car_number);
+ soft_task_def_met(sensor_m, SENSOR_WCET);
+ soft_task_def_period(sensor_m, SENSOR_PERIOD);
+ soft_task_def_usemath(sensor_m);
+ sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
+ if(sensor_pid == -1)
+ sys_end();
+
+ /* control task creation */
+ soft_task_default_model(control_m);
+ soft_task_def_arg(control_m, (void *)car_number);
+ soft_task_def_met(control_m, CONTROL_WCET);
+ soft_task_def_period(control_m, CONTROL_PERIOD);
+ soft_task_def_usemath(control_m);
+ control_pid = task_create("controller", control, &control_m, NULL);
+ if(control_pid == -1)
+ sys_end();
+
+ cars[car_number].sensor_pid = sensor_pid;
+ cars[car_number].control_pid = control_pid;
+ car_number++; // increases cars number
+
+ task_activate(sensor_pid);
+ task_activate(control_pid);
+}
+
+/* -------------------------------------------------------*/
+
+/* ------------------- */
+/* The main function */
+/* ------------------- */
+
+int main(int argc, char **argv) {
+ TIME seed; /* used to init the random seed */
+
+ if (MAX_CAB < 30) {
+ cprintf("The application needs at least 30 CABS.\n"
+ "Please set the MAX_CAB #define to 30 or more...\n"
+ "...(see include/modules/cabs.h)\n");
+ sys_end();
+ }
+
+ /* Set the closing function */
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ /* Keyboard handling */
+ keyb_handler();
+ kern_printf("KEYBOARD initialized...\n");
+
+ /* Graphics mutex */
+ sem_init(&grx_mutex, 0, 1);
+
+ /* Graphics init */
+ grx_init();
+ grx_open(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BIT_COLORS);
+
+ /* Track drawing */
+ sem_wait(&grx_mutex);
+ grx_setcolor(46,0,0,0);
+ grx_setcolor(43,255,255,255);
+ grx_setcolor(26,255,74,33);
+ grx_setcolor(27,255,255,255);
+ grx_setcolor(1,8,8,8);
+ grx_setcolor(3,255,0,0);
+ grx_setcolor(28,255,50,0);
+ grx_setcolor(29,255,90,0);
+ grx_setcolor(30,255,130,0);
+ grx_setcolor(31,255,170,0);
+ grx_setcolor(32,255,210,0);
+ grx_setcolor(33,48,48,48);
+
+ grx_putimage(TRACK_X1, TRACK_Y1, TRACK_X2, TRACK_Y2, track_img);
+ sem_post(&grx_mutex);
+
+ /* Command and info display */
+ cmd_display();
+
+ /* JetCTRL Initialization */
+ init_jetcontrol();
+
+ /* Randomize!!!! */
+ seed = sys_gettime(NULL);
+ srand(seed);
+
+ car_number = 0;
+
+ /* ------------ */
+ /* Task Calls */
+ /* ------------ */
+
+ hard_car_create();
+
+ return 0;
+}
+
+/* -------------------------------------------------------*/
+
+void read_track(int i)
+{
+ DOS_FILE *f; // DOS file descriptor
+ int file_length;
+ int index;
+ char filename[100];
+ int err; // Error code
+
+ /* Init track_list */
+ track_init();
+
+ /* Set the selected track from track_list */
+ if (i < TRACK_NUMBER)
+ index = i;
+ else
+ index = 0;
+ cprintf("Selected index = %d\n", index);
+
+ strcpy(filename, strcat("tracks/", track_list[index].name));
+ cprintf("File to open = %s\n", filename);
+ track_list[index].selected = 1;
+
+ /* open the DOS file for reading (you can specify only "r" or "w") */
+ f = DOS_fopen(filename,"r");
+
+ /* check for open errors */
+ if (!f) {
+ err = DOS_error(); // error!!
+
+ /* note that if you call DOS_error() here, it return 0!!! */
+ cprintf("Error %d opening %s...\n", err, filename);
+ file_length = 0;
+ byebye();
+ return;
+ }
+
+ /* read track file */
+ file_length = DOS_fread(&track_img, 1, TRACK_WIDTH*TRACK_HEIGHT, f);
+
+ /* check for errors */
+ err = DOS_error();
+
+ cprintf("Read %d bytes from %s...\n", file_length, filename);
+
+ if (err) {
+ cprintf("Error %d reading %s...\n", err, filename);
+ file_length = 0;
+ /* there is not return because I want to close the file! */
+ }
+
+ /* Close the file */
+ cprintf("Closing file %s...\n", filename);
+ DOS_fclose(f);
+ cprintf("File %s closed successfully!\n", filename);
+
+}
+
+/* -------------------------------------------------------*/
+
+void read_sprites()
+{
+ /* DOS file descriptor */
+ DOS_FILE *f;
+ int myfilebuf_length,i;
+ char filename[100];
+
+ /* Error code */
+ int err;
+ i=0;
+
+ for ( i=0; i < 16; i++) {
+ sprintf(filename,"cars/car%d.raw",i);
+ f = DOS_fopen(filename,"r");
+
+ // check for open errors
+ if (!f) {
+ // error!!
+ err = DOS_error();
+
+ // note that if you call DOS_error() here, it return 0!!!
+ cprintf("Error %d opening %s...\n", err, filename);
+ myfilebuf_length = 0;
+ return;
+ }
+
+ // read from file
+ myfilebuf_length = DOS_fread(&sprite[i][0],1,CAR_WIDTH*CAR_HEIGHT,f);
+
+ // check for errors
+ err = DOS_error();
+
+ cprintf("Read %d bytes from %s...\n", myfilebuf_length, filename);
+
+ if (err) {
+ cprintf("Error %d reading %s...\n", err, filename);
+ myfilebuf_length = 0;
+ // there is not return because I want to close the file!
+ }
+
+ // Close the file
+ DOS_fclose(f);
+ }
+
+ f = DOS_fopen("cars/boom.raw","r");
+ if (!f) {
+ err = DOS_error();
+
+ cprintf("Error %d opening boom.raw...\n", err);
+ myfilebuf_length = 0;
+ return;
+ }
+
+ myfilebuf_length = DOS_fread(&sprite[16][0],1,CAR_WIDTH*CAR_HEIGHT,f);
+
+ err = DOS_error();
+
+ cprintf("Read %d bytes from boom.raw...\n", myfilebuf_length);
+
+ if (err) {
+ cprintf("Error %d reading boom.raw...\n", err);
+ myfilebuf_length = 0;
+ }
+
+ DOS_fclose(f);
+
+ f = DOS_fopen("cars/fumo.raw","r");
+ if (!f) {
+ err = DOS_error();
+
+ cprintf("Error %d opening fumo.raw...\n", err);
+ myfilebuf_length = 0;
+ return;
+ }
+
+ myfilebuf_length = DOS_fread(&sprite[17][0],1,CAR_WIDTH*CAR_HEIGHT,f);
+
+ err = DOS_error();
+
+ cprintf("Read %d bytes from fumo.raw...\n", myfilebuf_length);
+
+ if (err) {
+ cprintf("Error %d reading fumo.raw...\n", err);
+ myfilebuf_length = 0;
+ }
+
+ DOS_fclose(f);
+
+}
+
Index: tags/rel_0_5/auto/sensor.c
===================================================================
--- tags/rel_0_5/auto/sensor.c (nonexistent)
+++ tags/rel_0_5/auto/sensor.c (revision 1657)
@@ -0,0 +1,650 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: sensor.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------ */
+/* Camera car */
+/* ------------ */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+#include <drivers/glib.h>
+
+#define RADIUS 1
+#define TOLL_FACTOR 4.0
+#define MIN_DIFF 3
+#define ROAD_COLOR 27
+#define OFFROAD_COLOR 0
+#define DEBUG_COLOR GREEN
+#define OUT_OF_TRACK 230
+#define STRIP_DEFAULT TEL_WIDTH+1
+
+extern sem_t grx_mutex;
+extern car_params cars[MAX_CAR_NUMBER];
+
+void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor);
+void get_camera_car(BYTE *buffer, car_status status);
+int find_track(BYTE *image, road_info *info);
+int find_opps(BYTE *image, road_info *info);
+void find_collision(BYTE *image, road_info *info, car_status status);
+
+/* ----------------------------------------------------------------- */
+
+TASK sensor(int index) {
+ car_status actual_car_status; // the actual car state
+ road_info actual_road_info; // the actual road informations
+ BYTE image[TEL_WIDTH*TEL_HEIGHT]; // buffer contenente la visione della telecamera ruotata
+
+ point sq1, sq2;
+ point im1, im2;
+
+ CAB road_status_cab = cars[index].road_status_cab;
+ CAB car_status_cab = cars[index].car_status_cab;
+
+ // Draws display squares
+ sq1.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT;
+ sq1.y = TEL_HEIGHT*index + 1 + index;
+ sq2.x = sq1.x + TEL_WIDTH + 1;
+ sq2.y = sq1.y + TEL_HEIGHT + 1;
+
+ // Sets viewer coords
+ im1.x = sq1.x + 1;
+ im1.y = sq1.y + 1;
+ im2.x = im1.x + TEL_WIDTH - 1;
+ im2.y = im1.y + TEL_HEIGHT - 1;
+
+ // Inizializza il cab della strada
+ actual_road_info.left_border = TEL_WIDTH/2;
+ actual_road_info.right_border = TEL_WIDTH/2;
+ actual_road_info.distance = TEL_HEIGHT;
+ actual_road_info.curve = 0.0;
+ actual_road_info.opps_number = 0;
+ actual_road_info.flag = ROAD_OK;
+ actual_road_info.collision = NO_COLL;
+ set_road_info(actual_road_info, road_status_cab);
+
+ task_endcycle();
+
+ while(1) {
+ /* reads car informations */
+ actual_car_status = get_car_status(car_status_cab);
+
+ /* implementazione riconoscimento strada (sti cazzi!!!) */
+ get_camera_car(image, actual_car_status);
+ find_track(image, &actual_road_info);
+ find_opps(image, &actual_road_info);
+ find_collision(image, &actual_road_info, actual_car_status);
+
+ sem_wait(&grx_mutex);
+ grx_rect(sq1.x, sq1.y, sq2.x, sq2.y, cars[index].color);
+ grx_putimage(im1.x, im1.y, im2.x, im2.y, image);
+ sem_post(&grx_mutex);
+
+ /* sends informations to control task */
+ set_road_info(actual_road_info, road_status_cab);
+ task_endcycle();
+ }
+
+}
+
+/* ----------------------------------------------------------------- */
+
+void find_collision(BYTE *image, road_info *info, car_status status)
+{
+ point_f lt,rt,lb,rb,ct;
+ /* the lines used to scan the quadrilate */
+ point_f height_line[CAR_HEIGHT];
+ int i;
+ BYTE pix;
+
+ info->collision = NO_COLL;
+
+ ct.x = status.pos.x + (float)(CAR_HEIGHT/2 + 1) * cos(degree_to_rad(status.orient));
+ ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
+
+ lb.x = ct.x - (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ rb.x = ct.x + (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ lt.x = lb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
+ rt.x = rb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
+
+ lb.y = ct.y - (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ rb.y = ct.y + (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ lt.y = lb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
+ rt.y = rb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
+
+ sem_wait(&grx_mutex);
+ scanline(height_line,rb.x,rb.y,rt.x,rt.y,CAR_HEIGHT);
+ for (i=0; i < CAR_HEIGHT; i++) {
+ pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
+ if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
+ info->collision = COLLISION_RIGHT;
+ }
+ scanline(height_line,lb.x,lb.y,lt.x,lt.y,CAR_HEIGHT);
+ for (i=0; i < CAR_HEIGHT; i++) {
+ pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
+ if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
+ info->collision = COLLISION_LEFT;
+ }
+ sem_post(&grx_mutex);
+
+}
+
+/* ----------------------------------------------------------------- */
+
+/* Puts in a buffer the image viewed from the camera according to the car status */
+void get_camera_car(BYTE *buffer, car_status status) {
+ /*
+ * lt ------ rt
+ * | |
+ * | |
+ * lb --ct-- rb
+ */
+ point_f lt,rt,lb,rb,ct;
+ /* the lines used to scan the quadrilate */
+ point_f width_line[TEL_WIDTH];
+ point_f height_line[TEL_HEIGHT];
+ int i,j;
+ int tmpx,tmpy,tx,ty;
+ float x,y;
+ BYTE *row;
+
+ ct.x = status.pos.x + (float)(CAR_WIDTH/2 + 1) * cos(degree_to_rad(status.orient));
+ ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
+
+ /* for now the visual starts from the center of the car */
+ lb.x = ct.x - (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ rb.x = ct.x + (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
+ lt.x = lb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
+ rt.x = rb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
+
+ lb.y = ct.y - (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ rb.y = ct.y + (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
+ lt.y = lb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
+ rt.y = rb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
+
+ /* scan only 2 sense thanks to parallelism */
+ /* ^ <-(height)
+ * ! lt
+ * ! |
+ * ! |
+ * ! lb ------ rb )
+ * 0 -------------> <-(width
+ */
+ /* the width_line coordinates are relative, so in the for cycle
+ they are summarized to absolute height_line values */
+ scanline(width_line,0,0,rb.x - lb.x,rb.y - lb.y,TEL_WIDTH);
+ scanline(height_line,lb.x,lb.y,lt.x,lt.y,TEL_HEIGHT);
+
+ /* First fill row TEL_HEIGHT-1 of image and so on until row 0 */
+ sem_wait(&grx_mutex);
+ for (i=0; i < TEL_HEIGHT; i++) {
+ x = height_line[i].x;
+ y = height_line[i].y;
+ row = &buffer[TEL_WIDTH * (TEL_HEIGHT-1-i)];
+ for (j=0; j < TEL_WIDTH; j++) {
+ tmpx = round(x + width_line[j].x);
+ tmpy = round(y + width_line[j].y);
+
+ // Test rispetto ai bordi
+ if (tmpx >= 0 && tmpx < SCREEN_WIDTH && tmpy >= 0 && tmpy < SCREEN_HEIGHT) {
+ tx = tmpx - TRACK_X1-1;
+ ty = tmpy - TRACK_Y1-1;
+ if (tx >= 0 && tx < TRACK_WIDTH && ty >= 0 && ty < TRACK_HEIGHT)
+ row[j] = grx_getpixel(tmpx,tmpy);
+ else
+ row[j] = OUT_OF_TRACK;
+ } else {
+ row[j] = OUT_OF_TRACK;
+ }
+ }
+ }
+ sem_post(&grx_mutex);
+}
+
+/* ----------------------------------------------------------------- */
+
+void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor) {
+ int i;
+ float x,y;
+ float xstep,ystep;
+
+ xstep = (x2 - x1) / factor;
+ ystep = (y2 - y1) / factor;
+
+ // Start scan at <x1, y1>
+ x = x1;
+ y = y1;
+
+ for (i = 0; i < factor; i++) {
+ buffer[i].x = x;
+ buffer[i].y = y;
+ x += xstep;
+ y += ystep;
+ }
+}
+
+/* ----------------------------------------------------------------- */
+
+/*
+ * Approssima la curva quando non è più possibile farlo con la scansione
+ * orizzontale
+ * - image
+ * - index l'indice da cui cominciare la ricerca della curva
+ * - distance la distanza dalla curva
+ */
+float approx_curve(BYTE *image, int index, int distance, int d_center, road_strip *strips) {
+ BYTE *p,tmp;
+ int i,j,k,ctrl=0;
+ point ms_center,ct;
+
+ // Decide se la curva e' verso sinistra o verso destra
+ p = &image[(TEL_HEIGHT - index - 1) * TEL_WIDTH];
+
+ ms_center.x = strips[index-1].left;
+ for (i = 0; i < min(3,strips[index-1].left); i++) {
+ // La curva è a destra
+ tmp = *(p + round(ms_center.x) - i);
+ if (tmp != ROAD_COLOR) {
+ ms_center.x = strips[index-1].right;
+ break;
+ }
+ }
+
+ p += round(ms_center.x);
+ // Scandisce la colonna fino alla fine della strada
+ for (i = index; i < TEL_HEIGHT; i++, p -= TEL_WIDTH) {
+ if (*p != ROAD_COLOR) break;
+ }
+
+ // Imposta il nuovo max_scost empirico
+ ms_center.y = (i-1 + index) / 2;
+
+ // i-1 è l'indice dell'ultima riga bianca
+ p = &image[(TEL_HEIGHT - (i-1) - 1) * TEL_WIDTH + round(ms_center.x)];
+ // scandisce da destra a sinistra
+ if (round(ms_center.x) > 0) {
+ for (j = 0; j < (round(ms_center.x) - strips[index-1].left); j++, p--) {
+ if (*p != ROAD_COLOR) break;
+ // scandisce dall'alto in basso finchè non trova nero
+ for (k = i-1; k > index; k--) {
+ tmp = *(p + (i-1-k)*TEL_WIDTH);
+ if (tmp != ROAD_COLOR) {
+ ms_center.y = (k + index) / 2;
+ ctrl = 1;
+ break;
+ }
+ }
+ if (ctrl) break;
+ }
+ ct.x = ms_center.x - j/2;
+ ct.y = ms_center.y;
+ } else {
+ // scandisce da sinistra a destra
+ for (j = 0; j < (strips[index-1].right - round(ms_center.x)); j++, p++) {
+ if (*p != ROAD_COLOR) break;
+ // scandisce dall'alto in basso finchè non trova nero
+ for (k = i-1; k > index; k--) {
+ tmp = *(p + (i-1-k)*TEL_WIDTH);
+ if (tmp != ROAD_COLOR) {
+ ms_center.y = (k + index) / 2;
+ ctrl = 1;
+ break;
+ }
+ }
+ if (ctrl) break;
+ }
+ ct.x = ms_center.x + j/2;
+ ct.y = ms_center.y;
+ }
+
+ return rad_to_degree(atan2((double)(ct.y - distance),(double)(ct.x - d_center)));
+}
+
+/* ----------------------------------------------------------------- */
+
+int find_distance(road_strip *strips, int max_scost, int rett_tol) {
+ int i, distance;
+ int center_car = TEL_WIDTH/2;
+
+ // La distanza non puo' essere maggiore del max_scost
+ distance = max_scost;
+
+ for (i=1; i < max_scost; i++) {
+ // Calcola la distanza dalla curva
+ if (abs(strips[i].center - center_car) > rett_tol) {
+ distance = i;
+ break;
+ }
+ }
+ return distance;
+}
+
+/* ----------------------------------------------------------------- */
+
+/* Scandisce la linea row e inserisce nella strip index le informazioni.
+ * Ritorna 1 se trova entrambi i bordi, altrimenti 0
+ */
+int scan_strip(BYTE *row, int index, road_strip *strips) {
+ // Tiene conto della posizione dei bordi precedenti per trattare
+ // meglio il caso di curve molto strette, dove possono esistere
+ // 2 bordi destri o sinistri
+
+ // Per evitare problemi nei casi in cui siano possibili 2
+ // bordi destri o sinistri
+ int lfound = 0;
+ int rfound = 0;
+ int center_car = TEL_WIDTH/2;
+ int i;
+
+ // Parte dal secondo pixel e finisce al penultimo
+ for(i=1; i < (TEL_WIDTH-1); i++) {
+ // Se trova la strada controlla se si tratta di bordo
+ // destro o sinistro
+ if (row[i] == ROAD_COLOR) {
+ // bordo sinistro
+ if (row[i - 1] != ROAD_COLOR) {
+ // Se ho già trovato questo tipo di bordo cerco
+ // quello + plausibile ...
+ if (lfound) {
+ // Test sulla striscia precedente
+ if (index > 0) {
+ if (abs(i - strips[index-1].left) <
+ abs(strips[index].left - strips[index-1].left))
+ strips[index].left = i;
+ } else {
+ // Test sul centro della macchina
+ if (abs(i - center_car) < abs(strips[0].left - center_car))
+ strips[index].left = i;
+ }
+ lfound++;
+ } else {
+ // ... altrimenti lo inizializzo
+ strips[index].left = i;
+ lfound = 1;
+ }
+ // bordo destro
+ } else if ((row[i + 1] != ROAD_COLOR) && lfound) {
+ // Se ho già trovato questo tipo di bordo cerco
+ // quello + plausibile ...
+ if (rfound) {
+ // Test sulla striscia precedente
+ if (index > 0) {
+ if (abs(i - strips[index-1].right) <
+ abs(strips[index].right - strips[index-1].right))
+ strips[index].right = i;
+ } else {
+ // Test sul centro della macchina
+ if (abs(i - center_car) < abs(strips[0].right - center_car))
+ strips[index].right = i;
+ }
+ rfound++;
+ } else {
+ // ... altrimenti lo inizializzo
+ strips[index].right = i;
+ rfound = 1;
+ }
+ }
+ }
+ }
+
+ // Calcola il centro della strada se trova i bordi
+ if (lfound && rfound)
+ strips[index].center = (strips[index].left + strips[index].right) / 2;
+
+ return (lfound && rfound);
+}
+
+/* ----------------------------------------------------------------- */
+
+void where_am_i(BYTE *row, road_strip strip, road_info *info) {
+ int i;
+ int lfound = 0;
+ int rfound = 0;
+ int car_center = TEL_WIDTH/2;
+
+ for(i=1; i < (TEL_WIDTH-1); i++) {
+ // Se trova la strada controlla se si tratta di bordo
+ // destro o sinistro
+ if (row[i] == ROAD_COLOR) {
+ // bordo sinistro
+ if (row[i - 1] != ROAD_COLOR) {
+ strip.left = i;
+ lfound = 1;
+ break;
+ } else if (row[i + 1] != ROAD_COLOR) {
+ strip.right = i;
+ rfound = 1;
+ break;
+ }
+ }
+ }
+
+ if (lfound && rfound) {
+ info->flag = ROAD_OK;
+ }
+ else if (lfound && !rfound) info->flag = LEFT_ONLY;
+ else if (!lfound && rfound) info->flag = RIGHT_ONLY;
+ else {
+ if (row[car_center] == OFFROAD_COLOR) info->flag = NO_ROAD;
+ else info->flag = ROAD_OK;
+ }
+ info->left_border = car_center - strip.left;
+ info->right_border = strip.right - car_center;
+}
+
+/* ----------------------------------------------------------------- */
+
+/* Analizza l'immagine vista dalla telecamera inserendo le informazioni
+ * necessarie in info, ovvero la distanza dai bordi destro e sinistro,
+ * la distanza dalla prossima curva e il suo angolo di curvatura.
+ * Per il momento ritorna -1 se non riesce a trovare entrambi i bordi della
+ * strada; in futuro gestiremo anche questa situazione.
+ */
+int find_track(BYTE *image, road_info *info) {
+ // vettore contenente le informazioni su ogni striscia
+ road_strip strips[TEL_HEIGHT];
+ BYTE *row;
+ int car_center = TEL_WIDTH/2;
+ int max_scost=0;
+ int once_scost=0;
+ int j, rett_tol=0;
+
+ info->flag = ROAD_OK;
+
+ strips[0].left = STRIP_DEFAULT;
+ strips[0].right = STRIP_DEFAULT;
+ /* Tratta in modo personalizzato il primo tratto di strada per
+ inizializzare alcune variabili e per capire situazioni particolari */
+ row = &image[(TEL_HEIGHT - 1)*TEL_WIDTH];
+ // Se trova i bordi ...
+ if (scan_strip(row,0,strips)) {
+ // ... calcola i bordi della strada e ...
+ info->left_border = car_center - strips[0].left;
+ info->right_border = strips[0].right - car_center;
+ // ... inizializza la tolleranza per il rettilineo.
+ rett_tol = (strips[0].right - strips[0].left) / TOLL_FACTOR;
+ } else {
+ // Se non trova il bordo ...
+ // Mi sono perso, cercami la strada
+ where_am_i(row,strips[0],info);
+ return 1;
+ }
+
+ /* Ora controlla le altre strisce della strada */
+
+ for(j=1; j < TEL_HEIGHT ; j++) {
+ row = &image[(TEL_HEIGHT - j - 1)*TEL_WIDTH];
+ // Se trova i bordi ...
+ if (scan_strip(row, j, strips)) {
+ // ... aggiorna l'indice di max scostamento.
+ if (abs(strips[j].center - car_center) >
+ abs(strips[max_scost].center - car_center)
+ && abs(strips[j].center - car_center) > rett_tol) {
+
+ max_scost = j;
+ once_scost=1; // ha trovato almeno un max scost
+ }
+ } else {
+ // Se max_scost non è mai stato settato, prendo il max
+ if (!once_scost) {
+ max_scost = j-1;
+ once_scost = 1;
+ }
+
+ // se la distanza e il max_scost sono troppo vicini approssima la curva
+ info->distance = find_distance(strips, max_scost, rett_tol);
+ if ((max_scost - info->distance) < MIN_DIFF) {
+ info->curve = approx_curve(image, j, info->distance,
+ strips[info->distance].center,strips) - 90.0;
+ return 1;
+ }
+ break;
+ }
+ }
+
+ // Se max_scost non è mai stato settato, prendo il max
+ if (!once_scost) max_scost = TEL_HEIGHT-1;
+ max_scost = min(max_scost,TEL_HEIGHT-1);
+
+ info->distance = find_distance(strips,max_scost,rett_tol);
+
+ // calcola l'angolo di curvatura solo se il conto e' attendibile
+ if ((info->distance < (TEL_HEIGHT*0.9)) &&
+ ((max_scost - info->distance) >= MIN_DIFF))
+ info->curve = rad_to_degree(atan2((double)(max_scost - info->distance),
+ (double)(strips[max_scost].center - strips[info->distance].center)));
+ else {
+ // se i conti sono empirici, si guarda la posizione dei due centri
+ if (strips[max_scost].center > strips[info->distance].center)
+ info->curve = 88.0;
+ else if (strips[max_scost].center < strips[info->distance].center)
+ info->curve = 92.0;
+ else
+ info->curve = 90.0;
+ }
+ info->curve -= 90.0;
+ return 0;
+}
+
+/* ----------------------------------------------------------------- */
+
+int find_opps(BYTE *image, road_info *info)
+{
+ int i, j;
+ int l_limit, r_limit; // the opposite empiric limits
+ BYTE *row;
+ int car_center = TEL_WIDTH/2;
+ int opps_number = 0;
+
+ // by default it needs to scan the entire row
+ l_limit = TEL_WIDTH - 1;
+ r_limit = 0;
+
+ // Scans one row at a time
+ for(j=1; j<TEL_HEIGHT; j++) {
+ row = &image[(TEL_HEIGHT - j - 1) * TEL_WIDTH];
+
+ // if some of the previous row has been identified as a car...
+ if (opps_number > 0 &&
+ j < (info->opps_list[opps_number - 1].y + CAR_HEIGHT + 1)) {
+ // excludes CAR_HEIGHT lines from the bottom if the car
+ l_limit = (car_center + info->opps_list[opps_number - 1].x) - CAR_WIDTH;
+ r_limit = (car_center + info->opps_list[opps_number - 1].x) + CAR_WIDTH;
+ }
+ else {
+ // it needs to scan the entire row
+ l_limit = TEL_WIDTH - 1;
+ r_limit = 0;
+ }
+
+ // Scans the current row
+ for (i=0; i<TEL_WIDTH; i++) {
+ if( (i < l_limit || i > r_limit) &&
+ row[i] != ROAD_COLOR && row[i] != OFFROAD_COLOR &&
+ row[i] != DEBUG_COLOR && row[i] != OUT_OF_TRACK) {
+ // there is an opponent car!!
+ // stores its position
+ info->opps_list[opps_number].x = i - car_center; // left -, right +
+ info->opps_list[opps_number].y = j;
+
+ // increases number of opposites car in the sensor view range
+ opps_number++;
+ }
+ }
+ }
+
+ info->opps_number = opps_number;
+
+ return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: tags/rel_0_5/auto/readme
===================================================================
--- tags/rel_0_5/auto/readme (nonexistent)
+++ tags/rel_0_5/auto/readme (revision 1657)
@@ -0,0 +1,51 @@
+AUTO - Another Unuseful Track simulatOr
+---------------------------------------
+
+by Marco Dallera and Marco Fiocca, 2001
+
+---------------------------------------
+
+This project was done as a Lab assignment during the course of
+"Informatica Industriale" at the University of Pavia, Italy.
+
+It simulates a race between cars under a set of 4 tracks.
+
+The authors provided also some pages that describes the application
+(auto.ps, in italian, on the website).
+
+To run the application, just compile it and call "x auto th" where tn is
+the track number (0 to 4).
+
+Since the control algorithm is quite complex, you need a quite powerful
+machine. If you get an exception 8 (WCET violation), you need a faster PC.
+You can anyway run the application making "auto2", that uses RR instead of
+EDF or CBS, or "auto3", that uses the EDFACT Module (you need yo copy
+the edfact.c and edfact.h files in the application directory to do that).
+
+To be run, the application needs to be compiled with the
+#define MAX_CAB set to a number greater than 20 (see include/modules/cabs.h).
+
+The control algorithm of the cars is not yet perfect, and if you look to
+the race for a long time, sometimes some cars go in the wrong direction.
+If you find a better algorithm, send me a patch :-)
+
+The code you can find in this directory is the original code of the
+students except for the MAX_CAB test into main(), and for the idle time
+monitor (that I took from the jumpball example) that can be useful to know
+when the system is overloaded. For example, on my PC there is idle time until
+the system has 9 cars. The tenth make the PC overloaded until one of them
+crashes :-).
+
+Finally note that the WCET and PERIODS specified by the authors are not so
+correct, and with this setting you can run 8 cars maximum before crashing the
+system.
+
+Have a nice race...
+
+Paolo
+pj@sssup.it
+
+PS: Sometimes on my portable the demo crashes. I wonder why!... If someone
+finds why, please tell me, I will patch it...
+
+
Index: tags/rel_0_5/auto/initfil1.c
===================================================================
--- tags/rel_0_5/auto/initfil1.c (nonexistent)
+++ tags/rel_0_5/auto/initfil1.c (revision 1657)
@@ -0,0 +1,108 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil1.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_track(int);
+void read_sprites();
+
+int argc;
+char *argv[100];
+
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ if (argc == 2)
+ read_track(strtoi(argv[1], 10, NULL));
+ else
+ read_track(2);
+
+ read_sprites();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *)main(argc,argv);
+}
Index: tags/rel_0_5/auto/control.c
===================================================================
--- tags/rel_0_5/auto/control.c (nonexistent)
+++ tags/rel_0_5/auto/control.c (revision 1657)
@@ -0,0 +1,701 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: control.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------- */
+/* Car control */
+/* ------------- */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+
+#define TURN_QUANTUM 2
+#define KM 18.0 // pixel
+#define HOUR 3600.0 // seconds
+#define KPH (KM/HOUR) // 0.005 pixel/second
+#define HIGHWAY_LIMIT 6
+#define MAZE_LIMIT 45
+#define CURVE_LIMIT 25 // il limite della curva per cui imposta la traiettoria
+#define BORDER_LIMIT ((1.0 / params.rage) * 2.0)
+#define STEERING_LIMIT 3 // limite di sterzata
+
+/* Road state */
+#define HIGHWAY 1
+#define MIXED 2
+#define MAZE 3
+#define CENTER 10
+#define TOO_LEFT 11
+#define TOO_RIGHT 12
+
+/* Opponents relationship */
+#define ATTACK 20
+#define DEFENSE 21
+#define SUPERATTACK 22
+
+/* Car parameters */
+#define MAX_SPEED (300 * KPH)
+#define MIN_SPEED (10 * KPH)
+#define MIN_ACC (-0.1)
+#define MAX_ACC (0.02)
+
+extern sem_t grx_mutex;
+
+char track_img[TRACK_WIDTH*TRACK_HEIGHT];
+char sprite[18][CAR_WIDTH*CAR_HEIGHT];
+
+/* Display functions */
+void put_transimage(int x1, int y1, int x2, int y2, BYTE *img,int car_color, int color);
+void draw_car(point_f old_pos, car_status cs, int car_color, int fumo);
+void put_trackbox(int x1, int y1, int x2, int y2);
+void show_display(int, int, float, float, float, float);
+void car_crash(PID sp, PID cp, point_f old_pos, int free);
+
+/* ------------------------------------------------------------------ */
+
+TASK control(int index) {
+ int i = 0; // general purpose counter
+ car_status old_car_status; // the previous car state
+ car_status actual_car_status; // the actual car state
+ road_info actual_road_info; // the actual road informations
+ int road_state; // the state of the road: HIGHWAY, MIXED; MAZE
+ int car_align; // the car alignment with respect to road limits
+ int opps_state; // the relationship with other cars
+ float old_speed = 0; // the previous car speed value
+ float actual_speed = 0; // the actual car speed value
+ float old_acc = 0; // the previous acceleration value
+ float acc = 0; // the new acceleration
+ point polepos;
+
+ // Variabili che dipendono dal tipo di macchina
+ float max_speed; // maximum car speed
+ float min_acc; // minimum acceleration
+ float max_acc; // maximum acceleration
+
+ int killed = 0; // flag for killed cars
+ int crashed = 0; // flag for crashed cars
+
+ /* Timing variables */
+ float t = 0;
+ float dt = (float)CONTROL_PERIOD/100000.0; // time quantum
+ time ts = int2time(t);
+ float crash_t = 0;
+ time crash_ts = int2time(crash_t);
+ float bestlap = 999999999.9;
+ time bestlap_s = int2time(bestlap);
+ int bestlap_done = 0;
+ int laps = 0;
+
+ /* Display vars */
+ point spd_p, acc_p, time_p, drv_p;
+ char *txt;
+
+ /* Car data */
+ car_params params; // car data structure
+
+ /* ----------------------------------------------------- */
+
+ txt = (char *)malloc(15*sizeof(char));
+
+ params = cars[index];
+
+ max_speed = params.max_speed * MAX_SPEED; // maximum car speed
+ min_acc = params.min_acc * MIN_ACC; // minimum acceleration
+ max_acc = params.max_acc * MAX_ACC; // maximum acceleration
+
+ /* Get track data */
+ while (track_list[i].selected == 0)
+ i++;
+
+ /* Same pole for all */
+ polepos.x = track_list[i].pole_pos.x;
+ polepos.y = track_list[i].pole_pos.y;
+ actual_car_status.pos.x = polepos.x;
+ actual_car_status.pos.y = polepos.y;
+ actual_car_status.orient = track_list[i].pole_orient;
+ set_car_status(actual_car_status, params.car_status_cab);
+
+ /* Initialize old values */
+ old_car_status = actual_car_status;
+ old_acc = acc;
+ old_speed = actual_speed;
+
+ /* POWER IS NOTHING WITHOUT CONTROL */
+ while(1) {
+
+ if (crashed) {
+ crash_t += dt;
+ crash_ts = int2time(crash_t);
+ if (crash_ts.sec > 2) {
+ car_crash(params.sensor_pid,params.control_pid,
+ old_car_status.pos, 1);
+ killed=1;
+ }
+ }
+
+ else {
+
+ /* Reads road informations */
+ actual_road_info = get_road_info(params.road_status_cab);
+
+ /* Defines the state of the road */
+ if (fabs(actual_road_info.curve) < HIGHWAY_LIMIT ||
+ actual_road_info.distance > 0.9*TEL_HEIGHT) {
+ road_state = HIGHWAY;
+ } else if (fabs(actual_road_info.curve) > MAZE_LIMIT ||
+ actual_road_info.distance < 0.1*TEL_HEIGHT) {
+ road_state = MAZE;
+ } else {
+ road_state = MIXED;
+ }
+
+ /* Defines the car position whitin road borders */
+ if (actual_road_info.left_border < BORDER_LIMIT)
+ car_align = TOO_LEFT;
+ else if (actual_road_info.right_border < BORDER_LIMIT)
+ car_align = TOO_RIGHT;
+ else car_align = CENTER;
+
+ /* Sets the power percentage */
+ switch (road_state)
+ {
+ case HIGHWAY:
+ acc = max_acc; // tarella!!!!
+ break;
+ case MIXED:
+ actual_speed = params.rage * (((float)actual_road_info.distance/(float)TEL_HEIGHT) /
+ (fabs(actual_road_info.curve)/90.0)) * max_speed;
+ acc = (actual_speed - old_speed) / dt;
+ break;
+ case MAZE:
+ actual_speed = params.rage * (1.0 - (fabs(actual_road_info.curve)/90.0)) * max_speed;
+ acc = (actual_speed - old_speed) / dt;
+ break;
+ default:
+ acc = 0.0;
+ }
+
+ /* Can't go off road */
+ /* When car is near a border, it steers to come in */
+ switch (car_align)
+ {
+ case TOO_LEFT:
+ actual_car_status.orient -= TURN_QUANTUM;
+ break;
+ case TOO_RIGHT:
+ actual_car_status.orient += TURN_QUANTUM;
+ break;
+ }
+
+ if (road_state != HIGHWAY) {
+ // C'e' una curva vicina.
+ // Se la curva e' a destra si tiene vicino al bordo di sinistra
+ // per impostare la traiettoria migliore e viceversa
+ if (actual_road_info.curve < 0 && actual_road_info.left_border > BORDER_LIMIT
+ && fabs(actual_road_info.curve) > CURVE_LIMIT)
+ actual_car_status.orient += TURN_QUANTUM;
+ else if (actual_road_info.curve > 0 && actual_road_info.right_border > BORDER_LIMIT
+ && fabs(actual_road_info.curve) > CURVE_LIMIT)
+ actual_car_status.orient -= TURN_QUANTUM;
+
+ // Fa la curva dolcemente
+ if (actual_road_info.distance < ((1.0/params.rage) * (TEL_HEIGHT * 0.25))) {
+ actual_car_status.orient += actual_road_info.curve * (params.rage/8.0);
+ //actual_car_status.orient += actual_road_info.curve / 4.0;
+ }
+ }
+
+ /* Defines the state of interactions with other cars */
+ if (actual_road_info.opps_number > 0)
+ {
+ if (road_state == HIGHWAY && actual_road_info.opps_list[0].y > (TEL_HEIGHT/3.0))
+ opps_state = ATTACK;
+ else if (road_state == MAZE && actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0))
+ opps_state = DEFENSE;
+ else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/6.0) &&
+ actual_road_info.opps_list[0].x != 0 &&
+ (abs(actual_road_info.opps_list[0].x) < CAR_W/2)) {
+ // Defends and steers to avoid opponents
+ opps_state = DEFENSE;
+ acc *= -((TEL_HEIGHT/6.0) / (actual_road_info.opps_list[0].y));
+ actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
+ abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM/2;
+ }
+ else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0) &&
+ actual_road_info.opps_list[0].x != 0 &&
+ abs(actual_road_info.opps_list[0].x) < CAR_W/2) {
+ // Attacks and steers to override the opponent
+ opps_state = ATTACK;
+ actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
+ abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM;
+ }
+ else
+ opps_state = DEFENSE;
+
+ // Response to opponents positions
+ if (opps_state == ATTACK)
+ acc = max_acc;
+ else if (opps_state == DEFENSE)
+ acc *= 0.5;
+ }
+
+
+ /* Checking car position: road/offroad */
+ if (actual_road_info.left_border * actual_road_info.right_border < 0)
+ acc = 0.5 * min_acc;
+
+ if (actual_road_info.flag != ROAD_OK) {
+ switch (actual_road_info.flag) {
+ case LEFT_ONLY:
+ if (actual_road_info.left_border < 0)
+ actual_car_status.orient -= TURN_QUANTUM;
+ acc = 0.5 * max_acc;
+ break;
+ case RIGHT_ONLY:
+ if (actual_road_info.right_border < 0)
+ actual_car_status.orient += TURN_QUANTUM;
+ acc = 0.5 * max_acc;
+ break;
+ case NO_ROAD:
+ crashed = 1;
+ car_crash(params.sensor_pid,params.control_pid,
+ old_car_status.pos, 0);
+ break;
+ }
+ }
+
+ /* Checking collisions... */
+ if (actual_road_info.collision != NO_COLL) {
+ switch(actual_road_info.collision) {
+ case COLLISION_LEFT:
+ actual_car_status.orient -= TURN_QUANTUM;
+ acc *= (0.5 * params.rage);
+ break;
+ case COLLISION_RIGHT:
+ actual_car_status.orient += TURN_QUANTUM;
+ acc *= (0.5 * params.rage);
+ break;
+ }
+ }
+
+ /* Checking acceleration range... */
+ acc = max(min(max_acc,acc),min_acc);
+ actual_speed = old_speed + acc*dt;
+
+ /* Checking speed range... */
+ actual_speed = min(max(actual_speed,MIN_SPEED),max_speed);
+
+ /* Checking steering angle ... */
+ if (fabs(actual_car_status.orient - old_car_status.orient) >
+ STEERING_LIMIT) {
+ if ((actual_car_status.orient - old_car_status.orient) > 0)
+ actual_car_status.orient = old_car_status.orient + STEERING_LIMIT;
+ else
+ actual_car_status.orient = old_car_status.orient - STEERING_LIMIT;
+ }
+
+ /* Setting new car position... */
+ actual_car_status.pos.x += actual_speed * cos(degree_to_rad(actual_car_status.orient));
+ actual_car_status.pos.y -= actual_speed * sin(degree_to_rad(actual_car_status.orient));
+
+ /* Checking track limits... */
+ if (actual_car_status.pos.x < MIN_CAR_X)
+ actual_car_status.pos.x = MIN_CAR_X;
+ if (actual_car_status.pos.x > MAX_CAR_X)
+ actual_car_status.pos.x = MAX_CAR_X;
+ if (actual_car_status.pos.y < MIN_CAR_Y)
+ actual_car_status.pos.y = MIN_CAR_Y;
+ if (actual_car_status.pos.y > MAX_CAR_Y)
+ actual_car_status.pos.y = MAX_CAR_Y;
+
+ /* Sends new status to car_status_cab */
+ set_car_status(actual_car_status, params.car_status_cab);
+
+ if (!crashed) {
+ /* Updates car */
+ if (acc == min_acc)
+ draw_car(old_car_status.pos,actual_car_status, params.color, 1);
+ else
+ draw_car(old_car_status.pos,actual_car_status, params.color, 0);
+ }
+
+ /* Sets display points */
+ spd_p.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT + TEL_WIDTH + 9;
+ spd_p.y = TEL_HEIGHT*index + 1 + index + 1;
+ bar_display(spd_p, 70, 4, GREEN, actual_speed, max_speed, LIGHTGRAY, "Spd");
+
+ acc_p.x = spd_p.x;
+ acc_p.y = spd_p.y + 24;
+ bidir_bar_display(acc_p, 70, 4, GREEN, acc, max(fabs(min_acc), max_acc), LIGHTGRAY, "Acc");
+
+ sem_wait(&grx_mutex);
+
+ /* Displays driver's name */
+ drv_p.x = spd_p.x + 80;
+ drv_p.y = spd_p.y;
+ grx_text(params.driver, drv_p.x, drv_p.y, params.color, BLACK);
+
+ /* Displays timer */
+ time_p.x = spd_p.x + 80;
+ time_p.y = spd_p.y + 8;
+ if( (!bestlap_done) || (bestlap_done && t > 50))
+ {
+ /* Mins */
+ txt = itoa(ts.min, txt);
+ grx_text(txt, time_p.x, time_p.y, WHITE, BLACK);
+ grx_text(":", time_p.x + 8, time_p.y, WHITE, BLACK);
+ /* Secs */
+ txt = itoa(ts.sec, txt);
+ if (ts.sec < 10) {
+ grx_text("0", time_p.x+16, time_p.y, WHITE, BLACK);
+ grx_text(txt, time_p.x+24, time_p.y, WHITE, BLACK);
+ }
+ else
+ grx_text(txt, time_p.x+16, time_p.y, WHITE, BLACK);
+ /* Decs */
+ grx_text(":", time_p.x+32, time_p.y, WHITE, BLACK);
+ txt = itoa(ts.dec, txt);
+ grx_text(txt, time_p.x+40, time_p.y, WHITE, BLACK);
+ }
+
+ /* Displays the best lap */
+ if(bestlap_done == 1)
+ {
+ time_p.x = spd_p.x + 80;
+ time_p.y = spd_p.y + 16;
+ /* Mins */
+ txt = itoa(bestlap_s.min, txt);
+ grx_text(txt, time_p.x, time_p.y, YELLOW, BLACK);
+ grx_text(":", time_p.x + 8, time_p.y, YELLOW, BLACK);
+ /* Secs */
+ txt = itoa(bestlap_s.sec, txt);
+ if (bestlap_s.sec < 10) {
+ grx_text("0", time_p.x+16, time_p.y, YELLOW, BLACK);
+ grx_text(txt, time_p.x+24, time_p.y, YELLOW, BLACK);
+ }
+ else
+ grx_text(txt, time_p.x+16, time_p.y, YELLOW, BLACK);
+ /* Decs */
+ grx_text(":", time_p.x+32, time_p.y, YELLOW, BLACK);
+ txt = itoa(bestlap_s.dec, txt);
+ grx_text(txt, time_p.x+40, time_p.y, YELLOW, BLACK);
+ }
+
+ /* Displays lap number */
+ time_p.x = spd_p.x + 80;
+ time_p.y = spd_p.y + 24;
+ grx_text("Lap ", time_p.x, time_p.y, LIGHTGRAY, BLACK);
+ txt = itoa(laps, txt);
+ grx_text(txt, time_p.x+32, time_p.y, LIGHTGRAY, BLACK);
+
+ sem_post(&grx_mutex);
+
+ /* Control the best lap */
+ t += dt;
+ ts = int2time(t);
+
+ /* Finish line */
+ if ((track_list[i].lap == CLOCK &&
+ (actual_car_status.pos.x >= polepos.x) && (old_car_status.pos.x < polepos.x)
+ && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20)) ||
+ (track_list[i].lap == ANTICLOCK &&
+ (actual_car_status.pos.x <= polepos.x) && (old_car_status.pos.x > polepos.x)
+ && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20))) {
+ laps++; // increases lap number
+
+ bestlap = min(bestlap,t);
+ bestlap_s = int2time(bestlap);
+ bestlap_done = 1;
+ t = 0;
+ ts = int2time(t);
+ }
+
+ /* Updates old values */
+ old_car_status = actual_car_status;
+ old_acc = acc;
+ old_speed = actual_speed;
+
+ } // end crashed
+
+ task_endcycle();
+
+ // Esce se e' morto
+ if (killed) return 0;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void car_crash(PID sp, PID cp, point_f old_pos, int free)
+{
+ point p1, p2;
+ p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
+ p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
+ p2.x = p1.x + CAR_WIDTH + 1;
+ p2.y = p1.y + CAR_HEIGHT + 1;
+
+ sem_wait(&grx_mutex);
+ /* Find the track box to redraw */
+ put_trackbox(p1.x,p1.y,p2.x,p2.y);
+
+ if (free == 0) {
+ // Draw the explosion
+ put_transimage(p1.x+1,p1.y+1,p2.x-1,p2.y-1,&sprite[16][0],0,0);
+ }
+ else if (free == 1) {
+ // Delete the explosion
+ put_trackbox(p1.x,p1.y,p2.x,p2.y);
+ task_kill(sp);
+ task_kill(cp);
+ }
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+void draw_car(point_f old_pos, car_status cs, int car_color, int fumo)
+{
+ int index;
+ point p1, p2;
+ p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
+ p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
+ p2.x = p1.x + CAR_WIDTH + 1;
+ p2.y = p1.y + CAR_HEIGHT + 1;
+
+ sem_wait(&grx_mutex);
+ /* Find the track box to redraw */
+ put_trackbox(p1.x,p1.y,p2.x,p2.y);
+
+
+ p1.x = round(cs.pos.x) + (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
+ p1.y = round(cs.pos.y) - (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
+ p2.x = round(cs.pos.x) - (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
+ p2.y = round(cs.pos.y) + (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
+
+ index = ((((int)cs.orient%360)+360)%360);
+ index = (int)(index + 11.25)%360;
+ index /= 22.5;
+
+ put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
+ round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
+ &sprite[index][0], car_color, 0);
+ if (fumo)
+ put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
+ round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
+ &sprite[17][0], car_color, 0);
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+/* Copy a box of track_image to screen */
+void put_trackbox(int x1, int y1, int x2, int y2)
+{
+ int y;
+ int tx1,ty1,tx2,ty2;
+ BYTE *addr;
+
+ tx1 = x1-TRACK_X1+1;
+ ty1 = y1-TRACK_Y1;
+ tx2 = x2-TRACK_X1+1;
+ ty2 = y2-TRACK_Y1;
+
+ if (tx1 < 0) tx1 = 0;
+ if (ty1 < 0) ty1 = 0;
+ if (tx2 > TRACK_WIDTH-1) tx2 = TRACK_WIDTH-1;
+ if (ty2 > TRACK_HEIGHT-1) ty2 = TRACK_HEIGHT-1;
+
+ tx1 = max(tx1,0);
+ ty1 = max(ty1,0);
+ tx2 = min(tx2,TRACK_WIDTH-1);
+ ty2 = min(ty2,TRACK_HEIGHT-1);
+
+ addr = &track_img[0] + tx1 + TRACK_WIDTH * ty1;
+
+ x1 = max(0,x1);
+ y1 = max(0,y1);
+
+ for (y = y1; y <= y2; y++) {
+ grx_putimage(x1+1, y, x2, y, addr);
+ addr += TRACK_WIDTH;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void put_transimage(int x1, int y1, int x2, int y2, BYTE *img, int car_color,
+ int color)
+{
+ int x,y;
+ BYTE *addr;
+ addr = img;
+
+
+ for (y = y1; y < y2; y++) {
+ for ( x = x1; x < x2; x++, addr++) {
+ if (*addr != color) {
+ if (*addr == 26)
+ grx_plot(x,y,car_color);
+ else
+ grx_plot(x,y,*addr);
+
+ }
+ }
+ addr++;
+ }
+}
+
+/* ------------------------------------------------------------------ */
+
+void show_display(int rs, int ca, float speed, float max_speed,
+ float acc, float max_acc)
+{
+ point hw, mx, mz; // three road states
+ point tl, ct, tr; // three car alignments
+ point sp1, sp2; // speed display coordinates
+ point ap1, ap2; // acceleration display coordinates
+ int s_amp = 0;
+ int a_amp = 0;
+
+ /* Leds coordinates */
+ hw.x = 10;
+ hw.y = SCREEN_HEIGHT-50;
+ mx.x = 25;
+ mx.y = SCREEN_HEIGHT-50;
+ mz.x = 40;
+ mz.y = SCREEN_HEIGHT-50;
+ tl.x = 10;
+ tl.y = SCREEN_HEIGHT-35;
+ ct.x = 25;
+ ct.y = SCREEN_HEIGHT-35;
+ tr.x = 40;
+ tr.y = SCREEN_HEIGHT-35;
+ sp1.x = 10;
+ sp1.y = SCREEN_HEIGHT-75;
+ sp2.x = 110;
+ sp2.y = SCREEN_HEIGHT-65;
+ ap1.x = 10;
+ ap1.y = SCREEN_HEIGHT-90;
+ ap2.x = 110;
+ ap2.y = SCREEN_HEIGHT-80;
+
+ sem_wait(&grx_mutex);
+
+ /* Writes out controller titles */
+ grx_text("Road", mz.x+15, mz.y, YELLOW, BLACK);
+ grx_text("Curve", tr.x+15, tr.y, YELLOW, BLACK);
+ switch (rs)
+ {
+ case HIGHWAY:
+ grx_box(hw.x, hw.y, hw.x+10, hw.y+10, GREEN);
+ grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
+ grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
+ break;
+ case MIXED:
+ grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
+ grx_box(mx.x, mx.y, mx.x+10, mx.y+10, YELLOW);
+ grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
+ break;
+ case MAZE:
+ grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
+ grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
+ grx_box(mz.x, mz.y, mz.x+10, mz.y+10, RED);
+ break;
+ }
+
+ switch (ca)
+ {
+ case TOO_LEFT:
+ grx_box(tl.x, tl.y, tl.x+10, tl.y+10, RED);
+ grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
+ grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
+ break;
+ case TOO_RIGHT:
+ grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
+ grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
+ grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLUE);
+ break;
+ default:
+ grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
+ grx_box(ct.x, ct.y, ct.x+10, ct.y+10, WHITE);
+ grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
+ }
+
+ /* Draws speed display */
+ grx_text("Speed", sp1.x+120, sp1.y, YELLOW, BLACK);
+ grx_rect(sp1.x-1, sp1.y-1, sp2.x+1, sp2.y+1, GREEN);
+ /* Updates speed display */
+ grx_box(sp1.x, sp1.y, sp2.x, sp2.y, BLACK);
+ s_amp = round( (speed * (float)(sp2.x-sp1.x)) / max_speed );
+ grx_box(sp1.x, sp1.y, sp1.x+s_amp, sp2.y, LIGHTGRAY);
+
+ /* Draws acceleration display */
+ grx_text("Acceleration", ap1.x+120, ap1.y, YELLOW, BLACK);
+ grx_rect(ap1.x-1, ap1.y-1, ap2.x+1, ap2.y+1, GREEN);
+ /* Updates acceleration display */
+ grx_box(ap1.x, ap1.y, ap2.x, ap2.y, BLACK);
+ a_amp = round( (float)acc * (float)((ap2.x-ap1.x)/2) / (float)max_acc );
+ if (a_amp >= 0)
+ grx_box((ap1.x+ap2.x)/2, ap1.y, ((ap1.x+ap2.x)/2)+a_amp, ap2.y, LIGHTGRAY);
+ else
+ grx_box((ap1.x+ap2.x)/2+a_amp, ap1.y, ((ap1.x+ap2.x)/2), ap2.y, LIGHTGRAY);
+ grx_line((ap1.x+ap2.x)/2, ap1.y-2, (ap1.x+ap2.x)/2, ap2.y+2, WHITE);
+ sem_post(&grx_mutex);
+}
+
Index: tags/rel_0_5/auto/initfil2.c
===================================================================
--- tags/rel_0_5/auto/initfil2.c (nonexistent)
+++ tags/rel_0_5/auto/initfil2.c (revision 1657)
@@ -0,0 +1,108 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil2.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/rr.h"
+#include "modules/rrsoft.h"
+#include "modules/dummy.h"
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_track(int);
+void read_sprites();
+
+int argc;
+char *argv[100];
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ if (argc == 2)
+ read_track(strtoi(argv[1], 10, NULL));
+ else
+ read_track(0);
+
+ read_sprites();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *)main(argc,argv);
+}
+
+
+
+
Index: tags/rel_0_5/auto/initfil3.c
===================================================================
--- tags/rel_0_5/auto/initfil3.c (nonexistent)
+++ tags/rel_0_5/auto/initfil3.c (revision 1657)
@@ -0,0 +1,107 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfil3.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "edfact.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 2000
+
+void read_track(int);
+void read_sprites();
+
+int argc;
+char *argv[100];
+int main(int argc, char **argv);
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDFACT_register_level(0);
+ CBS_register_level(0, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ __compute_args__(mb, &argc, argv);
+
+ if (argc == 2)
+ read_track(strtoi(argv[1], 10, NULL));
+ else
+ read_track(2);
+
+ read_sprites();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ KEYB_init(&kparms);
+
+ return (void *) main(argc,argv);
+}
Index: tags/rel_0_5/auto/edfact.c
===================================================================
--- tags/rel_0_5/auto/edfact.c (nonexistent)
+++ tags/rel_0_5/auto/edfact.c (revision 1657)
@@ -0,0 +1,565 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: edfact.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2001 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "edfact.h"
+#include <ll/stdio.h>
+#include <ll/string.h>
+#include <kernel/model.h>
+#include <kernel/descr.h>
+#include <kernel/var.h>
+#include <kernel/func.h>
+
+//#define edfact_printf kern_printf
+#define edfact_printf printk
+
+/*+ Status used in the level +*/
+#define EDFACT_READY MODULE_STATUS_BASE /*+ - Ready status +*/
+#define EDFACT_IDLE MODULE_STATUS_BASE+4 /*+ to wait the deadline +*/
+
+/*+ flags +*/
+#define EDFACT_FLAG_NORAISEEXC 2
+
+/*+ the level redefinition for the Earliest Deadline First level +*/
+typedef struct {
+ level_des l; /*+ the standard level descriptor +*/
+
+ TIME period[MAX_PROC]; /*+ The task periods; the deadlines are
+ stored in the priority field +*/
+ int deadline_timer[MAX_PROC];
+ /*+ The task deadline timers +*/
+
+ struct timespec deadline_timespec[MAX_PROC];
+
+ int dline_miss[MAX_PROC]; /*+ Deadline miss counter +*/
+ int wcet_miss[MAX_PROC]; /*+ Wcet miss counter +*/
+
+ int nact[MAX_PROC]; /*+ Wcet miss counter +*/
+
+ int flag[MAX_PROC];
+ /*+ used to manage the JOB_TASK_MODEL and the
+ periodicity +*/
+
+ IQUEUE ready; /*+ the ready queue +*/
+
+ int flags; /*+ the init flags... +*/
+
+ bandwidth_t U; /*+ the used bandwidth +*/
+
+} EDFACT_level_des;
+
+
+static void EDFACT_timer_deadline(void *par);
+
+static void EDFACT_internal_activate(EDFACT_level_des *lev, PID p,
+ struct timespec *t)
+{
+ struct timespec *temp;
+
+ temp = iq_query_timespec(p, &lev->ready);
+
+ TIMESPEC_ASSIGN(temp,t);
+ ADDUSEC2TIMESPEC(lev->period[p], temp);
+
+ TIMESPEC_ASSIGN(&lev->deadline_timespec[p],
+ temp);
+
+ /* Insert task in the correct position */
+ proc_table[p].status = EDFACT_READY;
+ iq_timespec_insert(p,&lev->ready);
+
+ /* needed because when there is a wcet miss I disable CONTROL_CAP */
+ proc_table[p].control |= CONTROL_CAP;
+}
+
+static void EDFACT_timer_deadline(void *par)
+{
+ PID p = (PID) par;
+ EDFACT_level_des *lev;
+
+ lev = (EDFACT_level_des *)level_table[proc_table[p].task_level];
+
+ switch (proc_table[p].status) {
+ case EDFACT_IDLE:
+ edfact_printf("I%d",p);
+
+ EDFACT_internal_activate(lev,p, &lev->deadline_timespec[p]);
+
+ event_need_reschedule();
+ break;
+
+ default:
+ edfact_printf("D%d",p);
+ /* else, a deadline miss occurred!!! */
+ lev->dline_miss[p]++;
+
+ /* the task is into another state */
+ lev->nact[p]++;
+
+ /* Set the deadline timer */
+ ADDUSEC2TIMESPEC(lev->period[p], &lev->deadline_timespec[p]);
+ }
+
+ /* Set the deadline timer */
+ lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
+ EDFACT_timer_deadline,
+ (void *)p);
+
+}
+
+static void EDFACT_timer_guest_deadline(void *par)
+{
+ PID p = (PID) par;
+
+ edfact_printf("AAARRRGGGHHH!!!");
+ kern_raise(XDEADLINE_MISS,p);
+}
+
+
+/* The scheduler only gets the first task in the queue */
+static PID EDFACT_public_scheduler(LEVEL l)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ return iq_query_first(&lev->ready);
+}
+
+/* The on-line guarantee is enabled only if the appropriate flag is set... */
+static int EDFACT_public_guarantee(LEVEL l, bandwidth_t *freebandwidth)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ if (lev->flags & EDFACT_FAILED_GUARANTEE) {
+ *freebandwidth = 0;
+ return 0;
+ }
+ else
+ if (*freebandwidth >= lev->U) {
+ *freebandwidth -= lev->U;
+ return 1;
+ }
+ else
+ return 0;
+
+}
+
+static int EDFACT_public_create(LEVEL l, PID p, TASK_MODEL *m)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ HARD_TASK_MODEL *h;
+
+ if (m->pclass != HARD_PCLASS) return -1;
+ if (m->level != 0 && m->level != l) return -1;
+ h = (HARD_TASK_MODEL *)m;
+ if (!h->wcet || !h->mit || h->periodicity != PERIODIC) return -1;
+ /* now we know that m is a valid model */
+
+ lev->period[p] = h->mit;
+
+ lev->flag[p] = 0;
+ lev->deadline_timer[p] = -1;
+ lev->dline_miss[p] = 0;
+ lev->wcet_miss[p] = 0;
+ lev->nact[p] = 0;
+
+ /* Enable wcet check */
+ proc_table[p].avail_time = h->wcet;
+ proc_table[p].wcet = h->wcet;
+ proc_table[p].control |= CONTROL_CAP;
+
+ /* update the bandwidth... */
+ if (lev->flags & EDFACT_ENABLE_GUARANTEE) {
+ bandwidth_t b;
+ b = (MAX_BANDWIDTH / h->mit) * h->wcet;
+
+ /* really update lev->U, checking an overflow... */
+ if (MAX_BANDWIDTH - lev->U > b)
+ lev->U += b;
+ else
+ /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
+ in this case, we don't raise an exception... in fact, after the
+ EDFACT_task_create the task_create will call level_guarantee that return
+ -1... return -1 in EDFACT_task_create isn't correct, because:
+ . generally, the guarantee must be done when also the resources
+ are registered
+ . returning -1 will cause the task_create to return with an errno
+ ETASK_CREATE instead of ENO_GUARANTEE!!!
+
+ Why I use the flag??? because if the lev->U overflows, if i.e. I set
+ it to MAX_BANDWIDTH, I lose the correct allocated bandwidth...
+ */
+ lev->flags |= EDFACT_FAILED_GUARANTEE;
+ }
+
+ return 0; /* OK, also if the task cannot be guaranteed... */
+}
+
+static void EDFACT_public_detach(LEVEL l, PID p)
+{
+ /* the EDFACT level doesn't introduce any dinamic allocated new field.
+ we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
+ bandwidth */
+
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ if (lev->flags & EDFACT_FAILED_GUARANTEE)
+ lev->flags &= ~EDFACT_FAILED_GUARANTEE;
+ else
+ lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
+}
+
+static void EDFACT_public_dispatch(LEVEL l, PID p, int nostop)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* the task state is set EXE by the scheduler()
+ we extract the task from the ready queue
+ NB: we can't assume that p is the first task in the queue!!! */
+ iq_extract(p, &lev->ready);
+}
+
+static void EDFACT_public_epilogue(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* check if the wcet is finished... */
+ if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
+ /* wcet finished: disable wcet event and count wcet miss */
+ edfact_printf("W%d",p);
+ proc_table[p].control &= ~CONTROL_CAP;
+ lev->wcet_miss[p]++;
+ }
+
+ /* the task it returns into the ready queue... */
+ iq_timespec_insert(p,&lev->ready);
+ proc_table[p].status = EDFACT_READY;
+}
+
+static void EDFACT_public_activate(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ struct timespec t;
+
+ /* Test if we are trying to activate a non sleeping task */
+ /* save activation (only if needed... */
+ if (proc_table[p].status != SLEEP) {
+ /* a periodic task cannot be activated when it is already active */
+ kern_raise(XACTIVATION,p);
+ return;
+ }
+
+ kern_gettime(&t);
+ EDFACT_internal_activate(lev,p, &t);
+
+ /* Set the deadline timer */
+ lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
+ EDFACT_timer_deadline,
+ (void *)p);
+
+}
+
+static void EDFACT_public_unblock(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* Insert task in the coEDFect position */
+ proc_table[p].status = EDFACT_READY;
+ iq_timespec_insert(p,&lev->ready);
+}
+
+static void EDFACT_public_block(LEVEL l, PID p)
+{
+}
+
+static int EDFACT_public_message(LEVEL l, PID p, void *m)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+ struct timespec t;
+
+ /* we reset the capacity counters... */
+ proc_table[p].avail_time = proc_table[p].wcet;
+
+ if (lev->nact[p] > 0) {
+ edfact_printf("E%d",p);
+
+ /* Pending activation: reactivate the thread!!! */
+ lev->nact[p]--;
+
+ /* see also EDFACT_timer_deadline */
+ kern_gettime(&t);
+ EDFACT_internal_activate(lev,p, &t);
+
+ /* check if the deadline has already expired */
+ if (TIMESPEC_A_LT_B(iq_query_timespec(p, &lev->ready), &schedule_time)) {
+ /* count the deadline miss */
+ lev->dline_miss[p]++;
+ kern_event_delete(lev->deadline_timer[p]);
+ }
+
+ }
+ else {
+ edfact_printf("e%d",p);
+
+ /* the task has terminated his job before it consume the wcet. All OK! */
+ proc_table[p].status = EDFACT_IDLE;
+
+ /* when the deadline timer fire, it recognize the situation and set
+ correctly all the stuffs (like reactivation, etc... ) */
+ }
+
+ jet_update_endcycle(); /* Update the Jet data... */
+
+ return 0;
+}
+
+static void EDFACT_public_end(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ edfact_printf("Û%d",p);
+
+ /* we finally put the task in the ready queue */
+ proc_table[p].status = FREE;
+ iq_insertfirst(p,&freedesc);
+ /* and free the allocated bandwidth */
+ lev->U -= (MAX_BANDWIDTH/lev->period[p]) * proc_table[p].wcet;
+
+ if (lev->deadline_timer[p] != -1) {
+ edfact_printf("²%d",p);
+ kern_event_delete(lev->deadline_timer[p]);
+ }
+}
+
+
+/* Guest Functions
+ These functions manages a JOB_TASK_MODEL, that is used to put
+ a guest task in the EDFACT ready queue. */
+
+static void EDFACT_private_insert(LEVEL l, PID p, TASK_MODEL *m)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ JOB_TASK_MODEL *job;
+
+ if (m->pclass != JOB_PCLASS || (m->level != 0 && m->level != l) ) {
+ kern_raise(XINVALID_TASK, p);
+ return;
+ }
+
+ job = (JOB_TASK_MODEL *)m;
+
+ TIMESPEC_ASSIGN(iq_query_timespec(p, &lev->ready), &job->deadline);
+
+ lev->deadline_timer[p] = -1;
+ lev->dline_miss[p] = 0;
+ lev->wcet_miss[p] = 0;
+ lev->nact[p] = 0;
+
+ if (job->noraiseexc)
+ lev->flag[p] = EDFACT_FLAG_NORAISEEXC;
+ else {
+ lev->flag[p] = 0;
+ lev->deadline_timer[p] = kern_event_post(iq_query_timespec(p, &lev->ready),
+ EDFACT_timer_guest_deadline,
+ (void *)p);
+ }
+
+ lev->period[p] = job->period;
+
+ /* Insert task in the correct position */
+ iq_timespec_insert(p,&lev->ready);
+ proc_table[p].status = EDFACT_READY;
+
+ /* there is no bandwidth guarantee at this level, it is performed
+ by the level that inserts guest tasks... */
+}
+
+static void EDFACT_private_dispatch(LEVEL l, PID p, int nostop)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* the task state is set to EXE by the scheduler()
+ we extract the task from the ready queue
+ NB: we can't assume that p is the first task in the queue!!! */
+ iq_extract(p, &lev->ready);
+}
+
+static void EDFACT_private_epilogue(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ /* the task has been preempted. it returns into the ready queue... */
+ iq_timespec_insert(p,&lev->ready);
+ proc_table[p].status = EDFACT_READY;
+}
+
+static void EDFACT_private_extract(LEVEL l, PID p)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ //kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
+ if (proc_table[p].status == EDFACT_READY)
+ {
+ iq_extract(p, &lev->ready);
+ //kern_printf("(g_end rdy extr)");
+ }
+
+ /* we remove the deadline timer, because the slice is finished */
+ if (lev->deadline_timer[p] != NIL) {
+// kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
+ kern_event_delete(lev->deadline_timer[p]);
+ lev->deadline_timer[p] = NIL;
+ }
+
+}
+
+/* Registration functions */
+
+/*+ Registration function:
+ int flags the init flags ... see EDFACT.h +*/
+LEVEL EDFACT_register_level(int flags)
+{
+ LEVEL l; /* the level that we register */
+ EDFACT_level_des *lev; /* for readableness only */
+ PID i; /* a counter */
+
+ printk("EDFACT_register_level\n");
+
+ /* request an entry in the level_table */
+ l = level_alloc_descriptor(sizeof(EDFACT_level_des));
+
+ lev = (EDFACT_level_des *)level_table[l];
+
+ printk(" lev=%d\n",(int)lev);
+
+ /* fill the standard descriptor */
+ lev->l.private_insert = EDFACT_private_insert;
+ lev->l.private_extract = EDFACT_private_extract;
+ lev->l.private_dispatch = EDFACT_private_dispatch;
+ lev->l.private_epilogue = EDFACT_private_epilogue;
+
+ lev->l.public_scheduler = EDFACT_public_scheduler;
+ if (flags & EDFACT_ENABLE_GUARANTEE)
+ lev->l.public_guarantee = EDFACT_public_guarantee;
+ else
+ lev->l.public_guarantee = NULL;
+ lev->l.public_create = EDFACT_public_create;
+ lev->l.public_detach = EDFACT_public_detach;
+ lev->l.public_end = EDFACT_public_end;
+ lev->l.public_dispatch = EDFACT_public_dispatch;
+ lev->l.public_epilogue = EDFACT_public_epilogue;
+ lev->l.public_activate = EDFACT_public_activate;
+ lev->l.public_unblock = EDFACT_public_unblock;
+ lev->l.public_block = EDFACT_public_block;
+ lev->l.public_message = EDFACT_public_message;
+
+ /* fill the EDFACT descriptor part */
+ for(i=0; i<MAX_PROC; i++) {
+ lev->period[i] = 0;
+ lev->deadline_timer[i] = -1;
+ lev->flag[i] = 0;
+ lev->dline_miss[i] = 0;
+ lev->wcet_miss[i] = 0;
+ lev->nact[i] = 0;
+ }
+
+ iq_init(&lev->ready,&freedesc, 0);
+ lev->flags = flags & 0x07;
+ lev->U = 0;
+
+ return l;
+}
+
+bandwidth_t EDFACT_usedbandwidth(LEVEL l)
+{
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ return lev->U;
+}
+
+int EDFACT_get_dline_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ return lev->dline_miss[p];
+}
+
+int EDFACT_get_wcet_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ return lev->wcet_miss[p];
+}
+
+int EDFACT_get_nact(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ return lev->nact[p];
+}
+
+int EDFACT_reset_dline_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ lev->dline_miss[p] = 0;
+ return 0;
+}
+
+int EDFACT_reset_wcet_miss(PID p)
+{
+ LEVEL l = proc_table[p].task_level;
+ EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
+
+ lev->wcet_miss[p] = 0;
+ return 0;
+}
+
Index: tags/rel_0_5/auto/tracks.c
===================================================================
--- tags/rel_0_5/auto/tracks.c (nonexistent)
+++ tags/rel_0_5/auto/tracks.c (revision 1657)
@@ -0,0 +1,111 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: tracks.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* -------------- */
+/* Track loader */
+/* -------------- */
+
+#include "include/auto.h"
+#include "include/const.h"
+
+track track_list[TRACK_NUMBER];
+
+int track_init()
+{
+ track demo1;
+ track demo2;
+ track brazil;
+ track monaco;
+
+ strcpy(demo1.name, "demo1.raw");
+ demo1.pole_pos.x = 150;
+ demo1.pole_pos.y = 35;
+ demo1.pole_orient = 0.0;
+ demo1.lap = CLOCK;
+ demo1.selected = 0;
+
+ strcpy(demo2.name, "demo2.raw");
+ demo2.pole_pos.x = 150;
+ demo2.pole_pos.y = 30;
+ demo2.pole_orient = 0.0;
+ demo2.lap = CLOCK;
+ demo2.selected = 0;
+
+ strcpy(brazil.name, "brazil.raw");
+ brazil.pole_pos.x = 140;
+ brazil.pole_pos.y = 185;
+ brazil.pole_orient = 225.0;
+ brazil.lap = ANTICLOCK;
+ brazil.selected = 0;
+
+ strcpy(monaco.name, "monaco.raw");
+ monaco.pole_pos.x = 35;
+ monaco.pole_pos.y = 315;
+ monaco.pole_orient = 85.0;
+ monaco.lap = CLOCK;
+ monaco.selected = 0;
+
+ track_list[0] = demo1;
+ track_list[1] = demo2;
+ track_list[2] = brazil;
+ track_list[3] = monaco;
+
+ return 0;
+}
Index: tags/rel_0_5/auto/keyb.c
===================================================================
--- tags/rel_0_5/auto/keyb.c (nonexistent)
+++ tags/rel_0_5/auto/keyb.c (revision 1657)
@@ -0,0 +1,105 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: keyb.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------ */
+/* Keyboard handler */
+/* ------------------ */
+
+#include "include/auto.h"
+#include "include/const.h"
+
+
+void keyb_handler() {
+ KEY_EVT k;
+ keyb_set_map(itaMap);
+
+ /* Exit keys: ENTER */
+ k.flag = 0;
+ k.scan = KEY_ENT;
+ k.ascii = 13;
+ keyb_hook(k, endfun);
+
+ /* Creates a new HARD car */
+ k.flag = 0;
+ k.scan = KEY_H;
+ k.ascii = 'h';
+ keyb_hook(k, hard_car_create);
+
+ /* Creates a new SOFT car */
+ k.flag = 0;
+ k.scan = KEY_S;
+ k.ascii = 's';
+ keyb_hook(k, soft_car_create);
+}
+
+
+void endfun(KEY_EVT *k)
+{
+ grx_close();
+ cprintf("Ctrl-Brk pressed! Ending...\n");
+ sys_end();
+}
+
+
+void my_close(void *arg)
+{
+ kern_printf("my_close\n");
+}
+
Index: tags/rel_0_5/auto/edfact.h
===================================================================
--- tags/rel_0_5/auto/edfact.h (nonexistent)
+++ tags/rel_0_5/auto/edfact.h (revision 1657)
@@ -0,0 +1,152 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: edfact.h,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+
+ This file contains the server EDFACT (EDF with pending activations)
+
+ Title:
+ EDFACT
+
+ Task Models Accepted:
+ HARD_TASK_MODEL - Hard Tasks (only Periodic)
+ wcet field and mit field must be != 0. They are used to set the wcet
+ and period of the tasks.
+ periodicity field can be only PERIODIC
+ drel field is ignored
+
+ Guest Models Accepted:
+ JOB_TASK_MODEL - a single guest task activation
+ Identified by an absolute deadline and a period.
+ period field is ignored
+
+ Description:
+ This module schedule his tasks following the classic EDF scheme.
+ The task guarantee is based on the factor utilization approach.
+ The tasks scheduled are only periodic.
+ All the task are put in a queue and the scheduling is based on the
+ deadline value.
+ NO GUARANTEE is performed on guest tasks. The guarantee must be performed
+ by the level that inserts guest tasks in the EDF level.
+ If a task miss a deadline a counter is incremented.
+ If a task exausts the wcet a counter is incremented
+ No ZOMBIE support!!!!!!
+
+ Exceptions raised:
+ XUNVALID_GUEST XUNVALID_TASK
+ some primitives are not implemented:
+ task_sleep, task_delay, guest_endcycle, guest_sleep, guest_delay
+
+ XACTIVATION
+ If a task is actiated through task_activate or guest_activate more than
+ one time
+
+ Restrictions & special features:
+ - This level doesn't manage the main task.
+ - At init time we have to specify:
+ . guarantee check
+ (when all task are created the system will check that the task_set
+ will not use more than the available bandwidth)
+ - A function to return the used bandwidth of the level is provided.
+ - Functions to return and reset the nact, wcet and dline miss counters
+
+**/
+
+/*
+ * Copyright (C) 2001 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#ifndef __EDFACT_H__
+#define __EDFACT_H__
+
+#include <ll/ll.h>
+#include <kernel/config.h>
+#include <sys/types.h>
+#include <kernel/types.h>
+
+
+
+
+
+
+
+
+/*+ flags... +*/
+#define EDFACT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
+#define EDFACT_ENABLE_ALL 1
+
+#define EDFACT_FAILED_GUARANTEE 8 /*+ used in the module, unsettabl
+ in EDF_register_level... +*/
+
+
+
+
+
+#define ELASTIC_HARD_PCLASS 0x0600
+
+#define EDFACT_LEVELNAME "EDFACT base"
+#define EDFACT_LEVEL_CODE 166
+#define EDFACT_LEVEL_VERSION 1
+
+
+/*+ Registration function:
+ int flags Options to be used in this level instance...
+
+ returns the level number at which the module has been registered.
++*/
+LEVEL EDFACT_register_level(int flags);
+
+/*+ Returns the used bandwidth of a level +*/
+bandwidth_t EDFACT_usedbandwidth(LEVEL l);
+
+/*+ returns respectively the number of dline, wcet or nact; -1 if error +*/
+int EDFACT_get_dline_miss(PID p);
+int EDFACT_get_wcet_miss(PID p);
+int EDFACT_get_nact(PID p);
+
+/*+ resets respectively the number of dline, wcet miss; -1 if error +*/
+int EDFACT_reset_dline_miss(PID p);
+int EDFACT_reset_wcet_miss(PID p);
+
+#endif
+
Index: tags/rel_0_5/auto/info.c
===================================================================
--- tags/rel_0_5/auto/info.c (nonexistent)
+++ tags/rel_0_5/auto/info.c (revision 1657)
@@ -0,0 +1,154 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * Massimiliano Giorgi <massy@gandalf.sssup.it>
+ * Luca Abeni <luca@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+
+/**
+ ------------
+ CVS : $Id: info.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:39 $
+ ------------
+**/
+
+/*
+ * Copyright (C) 2000 Marco Dallera and Marco Fiocca
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * AUTO
+ *
+ * Another Unuseful Track simulatOr
+ *
+ * Authors: Marco Dallera
+ * Marco Fiocca
+ *
+ */
+
+/* ------------------- */
+/* Information panel */
+/* ------------------- */
+
+#include "include/auto.h"
+#include "include/const.h"
+#include "include/utils.h"
+
+extern sem_t grx_mutex;
+
+/* ------------------------------------------------------------------ */
+
+void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
+{
+ int background = BLACK;
+ int amp = 0;
+ point p2;
+
+ p2.x = p1.x + width;
+ p2.y = p1.y + height;
+
+ sem_wait(&grx_mutex);
+
+ grx_text(name, p1.x, p1.y + height + 3, color, background);
+ grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
+
+ grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
+ amp = abs(round( var * (float)(p2.x - p1.x) / max ));
+ grx_box(p1.x, p1.y, p1.x + amp, p2.y, color);
+
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
+{
+ int background = BLACK;
+ int amp = 0;
+ point p2;
+
+ p2.x = p1.x + width;
+ p2.y = p1.y + height;
+
+ sem_wait(&grx_mutex);
+
+ grx_text(name, p1.x, p1.y + height + 3, color, background);
+ grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
+
+ grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
+ amp = round( var * (float)((p2.x - p1.x)/2) / max );
+ if (amp >= 0)
+ grx_box((p1.x+p2.x)/2, p1.y, ((p1.x+p2.x)/2)+amp, p2.y, color);
+ else
+ grx_box((p1.x+p2.x)/2+amp, p1.y, ((p1.x+p2.x)/2), p2.y, color);
+ grx_line((p1.x+p2.x)/2, p1.y-2, (p1.x+p2.x)/2, p2.y+2, border);
+
+ sem_post(&grx_mutex);
+}
+
+/* ------------------------------------------------------------------ */
+
+void cmd_display()
+{
+ point p1;
+
+ p1.x = TRACK_X1;
+ p1.y = TRACK_Y2+3;
+
+ sem_wait(&grx_mutex);
+ grx_rect(p1.x, p1.y, p1.x+CMD_WIDTH, p1.y+CMD_HEIGHT, BLUE);
+ grx_rect(p1.x+1, p1.y+1, p1.x+CMD_WIDTH-1, p1.y+CMD_HEIGHT-1, CYAN);
+ grx_rect(p1.x+2, p1.y+2, p1.x+CMD_WIDTH-2, p1.y+CMD_HEIGHT-2, LIGHTBLUE);
+ grx_text("## Another Unuseful Track simulatOr ##",
+ p1.x+8, p1.y+8, YELLOW, BLACK);
+ grx_text("## -------------------------------- ##",
+ p1.x+8, p1.y+16, YELLOW, BLACK);
+ grx_text("Marco Dallera", p1.x+8, p1.y+24, GREEN, BLACK);
+ grx_text("marchicchio@libero.it", p1.x+120, p1.y+24, GREEN, BLACK);
+ grx_text("Marco Fiocca", p1.x+8, p1.y+32, GREEN, BLACK);
+ grx_text("marqinho@tiscalinet.it", p1.x+120, p1.y+32, GREEN, BLACK);
+
+ grx_text("Command keys ", p1.x+8, p1.y+48, LIGHTBLUE, BLACK);
+ grx_text("------------------------", p1.x+8, p1.y+56, LIGHTBLUE, BLACK);
+ grx_text("h create a HARD car", p1.x+8, p1.y+64, CYAN, BLACK);
+ grx_text("s create a SOFT car", p1.x+8, p1.y+72, CYAN, BLACK);
+ grx_text("ENTER exit to DOS", p1.x+8, p1.y+80, CYAN, BLACK);
+
+ sem_post(&grx_mutex);
+
+}
+
+/* ------------------------------------------------------------------ */
+
Index: tags/rel_0_5/auto/makefile
===================================================================
--- tags/rel_0_5/auto/makefile (nonexistent)
+++ tags/rel_0_5/auto/makefile (revision 1657)
@@ -0,0 +1,22 @@
+#
+# Auto Makefile
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= auto auto2 auto3
+
+include $(BASE)/config/example.mk
+
+auto:
+ make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil1.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o" SHARKOPT="__OLDCHAR__ __GRX__"
+
+auto2:
+ make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil2.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o" SHARKOPT="__OLDCHAR__ __GRX__"
+
+auto3:
+ make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil3.o sensor.o control.o keyb.o info.o utils.o tracks.o edfact.o jetctrl.o" SHARKOPT="__OLDCHAR__ __GRX__"
+
Index: tags/rel_0_5/eli/eli.h
===================================================================
--- tags/rel_0_5/eli/eli.h (nonexistent)
+++ tags/rel_0_5/eli/eli.h (revision 1657)
@@ -0,0 +1,173 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: eli.h,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:47 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 ALLEN-DESTRO and Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+/***************************************/
+/* Corso di Informatica Industriale */
+/* Libreria con le funzioni di disegno */
+/* Creata da ALLEN-DESTRO */
+/***************************************/
+
+//########################################
+// Librerie standard del linguaggio C
+//#######################################
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+//########################################
+// Librerie Hartik
+//########################################
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <ll/i386/cons.h>
+#include <semaphore.h>
+
+//########################################
+// Definizione delle costanti del programma
+//########################################
+
+#define PER_DISEGNA 100000
+#define PER_MOLLA 100000
+#define PER_KILL 200000
+#define G 10
+#define DIM_EL 12
+#define DIM_PESO 10
+#define COL_EL YELLOW
+
+
+#define X0min 4 // Ascissa minima della finestra grafica
+#define Y0min 4 // Ordinata minima della finestra grafica
+#define X0max 796 // Ascissa massima della finestra grafica
+#define Y0max 596 // Ordinata massima della finestra grafica
+#define TERRA 400 // Ordinata della pista di atteraggio
+#define COL_SFONDO 0 // Colore di sfondo della finestra grafica
+#define COL_TESTO 7 // Colore del testo della finestra grafica
+#define COL_CORNICE RED // Colore cornici della finestra grafica
+#define DELTA_COL 32
+
+
+// Valore di pigreco
+#define PIGRECO 3.14159
+
+#define ELICOTTERO_S(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
+ grx_box(x-dim,y,x+dim,y+dim,sfo); \
+ grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
+ grx_box(x-dim,y,x+(dim*2),y+(dim/3),col); \
+ grx_line(x-dim,y+dim/2,x+2*dim,y+dim/2,col); \
+ grx_circle(x+dim*2,y,dim/2,col); \
+ grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
+
+#define ELICOTTERO_D(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
+ grx_box(x-dim,y,x+dim,y+dim,sfo); \
+ grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
+ grx_box(x-(dim*2),y,x+dim,y+(dim/3),col); \
+ grx_line(x-2*dim,y+dim/2,x+dim,y+dim/2,col); \
+ grx_circle(x-dim*2,y,dim/2,col); \
+ grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
+
+#define PESO(x,y,dim,col) grx_box(x-dim,y,x+dim,y+2*dim,col)
+
+#define MOLLA(x,y1,y2,col) { \
+ int w; \
+ for (w=y1;w<y2;w=w+2) grx_line(x-3,w,x+3,w,col); \
+ }
+
+#define RUSPA_S(x,y,col,colvet) grx_box(x,y-20,x+2,y,col); \
+ grx_line(x,y-10,x+5,y-10,col); \
+ grx_box(x+5,y-30,x+20,y-5,col); \
+ grx_box(x+5,y-10,x+40,y-5,col); \
+ grx_disc(x+10,y-5,5,col); \
+ grx_disc(x+30,y-5,5,col); \
+ grx_box(x+5,y-25,x+12,y-15,colvet)
+
+#define RUSPA_D(x,y,col,colvet) grx_box(x-2,y-20,x,y,col); \
+ grx_line(x-5,y-10,x,y-10,col); \
+ grx_box(x-20,y-30,x-5,y-5,col); \
+ grx_box(x-40,y-10,x-5,y-5,col); \
+ grx_disc(x-10,y-5,5,col); \
+ grx_disc(x-30,y-5,5,col); \
+ grx_box(x-12,y-25,x-5,y-15,colvet)
+
+#define ESPLOSIONE(x,y) grx_box(x-2,y-2,x+1,y+1,RED+1); \
+ grx_box(x-5,y-5,x-4,y-3,RED+1); \
+ grx_box(x-6,y-2,x-4,y,RED+1); \
+ grx_box(x+3,y+4,x+4,y+7,RED+1); \
+ grx_box(x+5,y-6,x+8,y-4,RED+1); \
+ grx_box(x-10,y+10,x-8,y+8,RED+1); \
+ grx_box(x-1,y-10,x+1,y-8,RED+1); \
+ grx_box(x-13,y-1,x-10,y+1,RED+1); \
+ grx_box(x+8,y-7,x+10,y-5,RED+1); \
+ grx_box(x,y+6,x-1,y+8,RED+1); \
+ grx_box(x-DIM_PESO-1,y-1,x-DIM_PESO+1,y+1,RED+1); \
+ grx_box(x-DIM_PESO-1,y+2*DIM_PESO-1,x-DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
+ grx_box(x+DIM_PESO-1,y-1,x+DIM_PESO+1,y+1,RED+1); \
+ grx_box(x+DIM_PESO-1,y+2*DIM_PESO-1,x+DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
+ grx_box(x-1,y+DIM_PESO-1,x+1,y+DIM_PESO+1,RED+1); \
+ grx_box(x+4,y+DIM_PESO-1,x+6,y+DIM_PESO+1,RED+1); \
+
+//#define PULISCI(x,y) grx_box(x-14,y-11,x+DIM_PESO+2,y+2*DIM_PESO+2,COL_SFONDO)
+#define PULISCI(x,y,d) grx_disc(x,y,d,COL_SFONDO)
+
+/*********************************************************************/
+/* */
+/* Funzione per disegnare gli elementi statici */
+/* */
+/*********************************************************************/
+extern char tastiera;
+extern long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Massa;
+// Definizione del semaforo per l'utilizzo della modalità grafica
+extern sem_t mutex;
+
+TASK disegna_stato(int i);
+
+
+
Index: tags/rel_0_5/eli/initfile.c
===================================================================
--- tags/rel_0_5/eli/initfile.c (nonexistent)
+++ tags/rel_0_5/eli/initfile.c (revision 1657)
@@ -0,0 +1,100 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:47 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ HARTPORT_init();
+
+ KEYB_init(NULL);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/eli/eli.c
===================================================================
--- tags/rel_0_5/eli/eli.c (nonexistent)
+++ tags/rel_0_5/eli/eli.c (revision 1657)
@@ -0,0 +1,787 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: eli.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:47 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "eli.h"
+
+#include <time.h>
+
+//########################################
+// Definizione variabili globali
+//########################################
+char tastiera;
+long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Pos_x,Pos_y;
+long double Pos_pe_y[5];
+long double Pos_pe_x[5];
+long double T1=0;
+long double r;
+int n_peso=0;
+int peso_agganciato[5]={0,0,0,0,0};
+int pre_peso[5]={0,0,0,0,0};
+int libero_peso[5]={0,0,0,0,0};
+PID pid_peso[5];
+PID pid_ruspa[5];
+int x_r=200;
+int n_ruspa=5;
+int indietro;
+int eli_occ=0;
+int kill_p;
+
+//PID pid_r0,pid_r1,pid_r2,pid_r3,pid_r4;
+PID pid_kill_p,pid_pulisci_p,pid_kill_e,pid_pulisci_e;
+
+
+// Definizione del semaforo per l'utilizzo della modalita' grafica
+sem_t mutex;
+sem_t pu;
+
+
+
+
+//#######################################################################
+//############### DEFINIZIONE TASK ######################################
+//#######################################################################
+
+TASK kill_task(int i)
+{ int x,y,dim;
+ while (1)
+ {
+
+ if(i==1)
+ {
+ x=Pos_pe_x[kill_p];
+ y=Pos_pe_y[kill_p];
+ dim=25;
+ }
+ else
+ {
+ x=Pos_x;
+ y=Pos_y;
+ dim=35;
+ }
+
+ PULISCI(x,y,dim);
+ ESPLOSIONE(x,y);
+
+ sem_wait(&pu);
+
+ if(i==1) task_activate(pid_pulisci_p);
+ else task_activate(pid_pulisci_e);
+
+ task_endcycle();
+
+ }
+
+
+}
+
+TASK pulisci(int i)
+{
+ int x,y,dim;
+ struct timespec delay;
+
+ delay.tv_sec=0;
+ delay.tv_nsec=3000000;
+
+ while (1)
+ {
+
+ if(i==1)
+ {
+ x=Pos_pe_x[kill_p];
+ y=Pos_pe_y[kill_p];
+ dim=25;
+ }
+ else
+ {
+ x=Pos_x;
+ y=Pos_y;
+ dim=35;
+ }
+
+
+ nanosleep(&delay, NULL);
+ PULISCI(x,y,dim);
+
+ sem_post(&pu);
+
+ task_endcycle();
+ }
+}
+
+
+
+
+TASK elicottero(int i)
+{ long double x_old,x_new,y_old,y_new;
+ TIME us_old,us_new;
+ long double delta_T;
+ long double Fx,Fy,Ax,Ay,Vx,Vy,m_el;
+ int Destra_old,Destra_new;
+ // int uccidi,colore;
+ // int prova;
+
+ m_el=1;
+ Vx=0;Vy=0;
+ Ax=0;Ay=0;
+ Fx=0;Fy=0-m_el*G; // Fy=0;
+ x_old=150;
+ y_old=150;
+ Destra_old=1;
+ Destra_new=1;
+
+ us_old=sys_gettime(NULL);
+
+ while (1)
+ {
+
+ // prova=2;
+
+
+ us_new=sys_gettime(NULL);
+ delta_T=(us_new-us_old)/100000;
+ // if(delta_T<0.9) prova=1;
+ // if(delta_T<0) prova=4;
+ // if(delta_T>1.1) prova=3;
+
+
+ delta_T=1;
+ Ax=(Fx-(r*Vx))/m_el;
+ Ay=(Fy-(r*Vy)+m_el*G+T1)/m_el;
+ x_new=x_old+Vx*delta_T+0.5*Ax*delta_T*delta_T;
+ y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
+
+ // if(prova==1) {x_new=300; y_new=150;}
+ // if(prova==3) {x_new=150; y_new=300;}
+ // if(prova==2) {x_new=300; y_new=300;}
+ // if(prova==4) {x_new=400; y_new=400;}
+
+ Vx=Vx+Ax*delta_T;
+ Vy=Vy+Ay*delta_T;
+ if ((Vx>0)|| ((Vx==0) && (Destra_old==1))) Destra_new=1;
+ else Destra_new=0;
+
+ if ( ((y_new>=(Y0max-DIM_EL/2-2)) || ( (y_old<=400-DIM_EL/2-2) && (y_new>=400-DIM_EL/2-2) && (x_new>=X0min+151) && (x_new<=X0min+280) )) )
+ {
+ if ((x_new>=X0min+151) && (x_new<=X0min+280)) y_new=400-DIM_EL/2-2;
+ else y_new=Y0max-DIM_EL/2-2;
+ Vy=0;
+ Vx=0;
+ x_new=x_old;
+ Ay=0;
+ Ax=0;
+ }
+
+
+
+
+ sem_wait(&mutex);
+
+ /*
+ uccidi=0;
+
+ colore=grx_getpixel(x_new-2*DIM_EL,y_new-DIM_EL);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new+2*DIM_EL,y_new-DIM_EL);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new-2*DIM_EL,y_new+DIM_EL/2);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new+2*DIM_EL,y_new+DIM_EL/2);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ colore=grx_getpixel(x_new,y_new);
+ if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
+ */
+
+ if ((x_old>100) && (y_old>100) && (x_old<X0max) )
+ {
+ if (Destra_old==0) {ELICOTTERO_S(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
+ else {ELICOTTERO_D(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
+ }
+
+ if ((x_new>100) && (y_new>100) && (x_new<X0max) )
+ {
+ /*
+ if ( uccidi==1)
+ {
+ // grx_box(10,10,100,100,RED);
+ // task_activate(pid_kill_e);
+ // sem_post(&mutex);
+ // eli_occ=0;
+ sem_post(&mutex);
+ task_abort();
+ }
+ */
+
+
+ if (Destra_new==0) {ELICOTTERO_S(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
+ else {ELICOTTERO_D(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
+ }
+ sem_post(&mutex);
+
+ if (tastiera=='c') Fx=Fx+0.25;
+ if (tastiera=='z') Fx=Fx-0.25;
+ if (tastiera=='x') Fy=Fy+0.25;
+ if (tastiera=='s') Fy=Fy-0.25;
+
+ if (Fx>2) Fx=2;
+ if (Fx<-2) Fx=-2;
+ if (Fy>0) Fy=0;
+ if (Fy<-17.5) Fy=-17.5;
+
+ Forza_x=Fx;
+ Forza_y=Fy;
+ Acc_x=Ax;
+ Acc_y=Ay;
+ Velocita_x=Vx;
+ Velocita_y=Vy;
+ Pos_x=x_new;
+ Pos_y=y_new;
+
+
+ if ( (tastiera=='z') || (tastiera=='x') || (tastiera=='c') || (tastiera=='s') )
+ tastiera='q';
+
+
+ us_old=us_new;
+ x_old=x_new;
+ y_old=y_new;
+ Destra_old=Destra_new;
+
+ task_endcycle();
+ }
+}
+
+
+
+TASK peso(int i)
+{
+ long double delta_T;
+ long double Ay,Vy;
+ long double x_new,x_old,y_old,y_new;
+ int scelta=0;
+ int rit,colore,uccidi;
+ double m_peso[5]={0.5,0.4,0.3,0.1,0.6};
+ int delta_y1,delta_y2;
+
+
+ // PID pid;
+ // MODEL m = BASE_MODEL;
+
+ Vy=0;
+ Ay=0;
+
+ x_old=700-DIM_PESO-1;
+ y_old=Y0max-DIM_PESO*2-1;
+ delta_T=1;
+ x_new=700-DIM_PESO-1;
+
+ libero_peso[i]=0;
+
+ while (1 )
+ {
+ uccidi=0;
+
+ if (scelta==0 )
+ {
+
+ y_new=y_old;
+ if (x_new+DIM_PESO==x_r-1) x_new=x_new-1;
+ else x_new=x_new;
+ if (indietro==1) {scelta=1; libero_peso[i]=1;}
+ }
+
+ if (scelta==1 )
+ {
+ y_new=y_old;
+ x_new=x_old;
+ if (peso_agganciato[i]==1) scelta=2;
+ }
+ if (scelta==2)
+ {
+ eli_occ=1;
+ Ay=(m_peso[i]*G-(r*Vy)-T1)/m_peso[i];
+ if(peso_agganciato[i]==1) x_new=Pos_x;
+ else x_new=x_old;
+ y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
+ Vy=Vy+Ay*delta_T;
+
+ delta_y1=Y0max-y_new;
+ delta_y2=400-y_new;
+
+ if ( (y_new>=(Y0max-2*DIM_PESO-1)) || ( (y_old<400-2*DIM_PESO-1) && (y_new>=400-2*DIM_PESO-1) && (x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO) ) )
+ {
+ if ((x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO))
+ {
+ if (delta_y2<6) uccidi=1;
+ y_new=400-2*DIM_PESO-2;
+ }
+ else {
+ if (delta_y1<6) uccidi=1;
+ y_new=Y0max-2*DIM_PESO-2;
+ }
+ Vy=0;
+ if(peso_agganciato[i]==0) {scelta=3; rit=0;}
+ }
+ }
+ if (scelta==3)
+ {
+ x_new=x_new;
+ y_new=y_new;
+ eli_occ=0;
+ if (y_new==400-2*DIM_PESO-2) rit++;
+
+
+
+ if (rit==100) {
+ peso_agganciato[i]=0;
+ pre_peso[i]=0;
+ sem_wait(&mutex);
+ PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
+ sem_post(&mutex);
+
+ return NULL;
+ }
+
+ if(peso_agganciato[i]==1) scelta=2;
+ }
+
+ sem_wait(&mutex);
+
+
+ colore=grx_getpixel(x_new-DIM_PESO,y_new);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new+DIM_PESO,y_new);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new-DIM_PESO,y_new+2*DIM_PESO);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new+DIM_PESO,y_new+2*DIM_PESO);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+ colore=grx_getpixel(x_new,y_new+DIM_PESO);
+ if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
+
+
+
+ if ((x_old>100) && (y_old>100) && (x_old<X0max) )
+ {
+ PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
+ }
+
+ y_old=y_new;
+ x_old=x_new;
+ Pos_pe_y[i]=y_new;
+ Pos_pe_x[i]=x_new;
+
+
+ if ((x_new>100) && (y_new>100) && (x_new<X0max) )
+ {
+ if ( uccidi==1)
+ {
+ kill_p=i;
+ task_activate(pid_kill_p);
+ sem_post(&mutex);
+ eli_occ=0;
+ pre_peso[i]=0;
+ peso_agganciato[i]=0;
+ return NULL;
+ }
+
+ PESO(x_new,y_new,DIM_PESO,DELTA_COL+i*2);
+ }
+ sem_post(&mutex);
+
+
+ task_endcycle();
+ }
+
+
+}
+
+TASK ruspa(int i)
+{
+ int x,y,ii;
+ int end_peso[5]={370,420,470,520,570};
+
+ PID pid;
+ HARD_TASK_MODEL m_hard;
+
+ pre_peso[i]=1;
+
+ hard_task_default_model(m_hard);
+ hard_task_def_wcet(m_hard,1); // wcet ignored!!!
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ hard_task_def_usemath(m_hard);
+ hard_task_def_arg(m_hard,(void *)i);
+ pid=task_create("peso2",peso,&m_hard,NULL);
+ pid_peso[i]=pid;
+ task_activate(pid_peso[i]);
+
+
+ x=720;
+ y=Y0max;
+
+ indietro=0;
+ while (x!=end_peso[i]+DIM_PESO)
+ {
+ sem_wait(&mutex);
+ RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
+ RUSPA_S(x,y,YELLOW-1,LIGHTBLUE);
+ sem_post(&mutex);
+ x_r=x;
+ x--;
+ task_endcycle();
+ }
+ sem_wait(&mutex);
+ RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
+ sem_post(&mutex);
+ indietro=1;
+ while (x!=730 )
+ {
+ sem_wait(&mutex);
+ RUSPA_D(x-1+40,y,COL_SFONDO,COL_SFONDO);
+ RUSPA_D(x+40,y,YELLOW-1,LIGHTBLUE);
+ sem_post(&mutex);
+ x++;
+ task_endcycle();
+ }
+
+ ii=i+1;
+
+ while(ii>4)
+ {
+ n_ruspa=5;
+ if(pre_peso[4]==0){
+ ii=4;
+ if(pre_peso[3]==0){
+ ii=3;
+ if(pre_peso[2]==0){
+ ii=2;
+ if(pre_peso[1]==0){
+ ii=1;
+ if(pre_peso[0]==0){
+ ii=0;
+ }
+ }
+ }
+ }
+ }
+ task_endcycle();
+
+ }
+
+ hard_task_def_arg(m_hard,(void *)ii);
+ pid_ruspa[ii]=task_create("ruspa",ruspa,&m_hard,NULL);
+ task_activate(pid_ruspa[ii]);
+ n_ruspa=ii;
+
+ return NULL;
+}
+
+
+
+
+TASK molla(int i)
+{
+ double k=0.05;
+ double x,x_old,y1_old,y2_old;
+ double T1_old; //,T2_old;
+
+ x_old=Pos_x;
+ y1_old=Pos_y;
+ y2_old=Pos_pe_y[n_peso];
+
+ while (1)
+ {
+
+ sem_wait(&mutex);
+ if ((x_old>100-DIM_EL) && (y1_old>100-DIM_EL) && (x_old<X0max) )
+ {
+ MOLLA(x_old,y1_old+DIM_EL,y2_old,COL_SFONDO)
+ }
+ else if( (y2_old>100) && (x_old<X0max) && (x_old>100) )
+ {
+ MOLLA(x_old,X0min+100,y2_old,COL_SFONDO)
+ }
+
+ x_old=Pos_x;
+ y1_old=Pos_y;
+
+ if(peso_agganciato[n_peso]==0) y2_old=y1_old+20;
+ else y2_old=Pos_pe_y[n_peso];
+
+ if ((x_old>100) && (y1_old>100-DIM_EL) && (x_old<X0max) )
+ {
+ MOLLA(x_old,y1_old+DIM_EL,y2_old,RED)
+ }
+ else if( (y2_old>100) && (x_old<X0max) && (x_old>100))
+ {
+ MOLLA(x_old,X0min+100,y2_old,RED)
+ }
+ sem_post(&mutex);
+
+ x=y2_old-y1_old;
+ x=x-20;
+ T1=x*k;
+ T1_old=T1;
+
+ task_endcycle();
+
+ }
+}
+
+TASK seleziona(int i)
+{ int w,deltax,deltay,disegna;
+
+ eli_occ=0;
+ disegna=0;
+
+ while (1)
+ {
+ disegna=0;
+ for (w=0;w<5;w++)
+ {
+ deltax=Pos_pe_x[w]-Pos_x;
+ deltay=Pos_pe_y[w]-Pos_y-DIM_PESO-20+DIM_EL;
+ if ( (pre_peso[w]==1) && (eli_occ==0) && (deltax<4) && (deltax>-4) && (deltay<3) && (deltay>-3) )
+ {
+ disegna=1;
+ if ( (tastiera=='p') && (libero_peso[w]==1) )
+ {
+ eli_occ=1;
+ peso_agganciato[w]=1;
+ n_peso=w;
+
+ }
+ }
+ }
+
+ if(disegna==1)
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-90,Y0min+5,X0max-5,Y0min+95,RED);
+ // grx_text("Ok", X0max-40, Y0min+50, COL_TESTO, RED);
+ sem_post(&mutex);
+ } else
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-95,Y0min+5,X0max-5,Y0min+95,COL_SFONDO);
+ sem_post(&mutex);
+ }
+
+ if(eli_occ==1)
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,GREEN);
+ // grx_text("Go", X0max-35-100, Y0min+50, COL_TESTO, GREEN);
+ sem_post(&mutex);
+ } else
+ {
+ sem_wait(&mutex);
+ grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,COL_SFONDO);
+ sem_post(&mutex);
+ }
+
+
+ if (tastiera=='l') peso_agganciato[n_peso]=0;
+
+ task_endcycle();
+
+ }
+}
+
+
+//###############################################################
+// ##
+// Funzione di uscita dal programma ##
+// ##
+//################################################################
+void my_end(KEY_EVT* e)
+{
+ //####################################
+ // Sezione esecutiva della funzione ##
+ //####################################
+
+ grx_close();
+ cprintf("Ctrl-brk pressed!\n");
+ sys_end();
+} // Fine della funzionemy_end
+
+//################################################################
+// ##
+// Funzione di uscita dal programma ##
+// ##
+//################################################################
+void end()
+{
+ //####################################
+ // Sezione esecutiva della funzione ##
+ //####################################
+
+ grx_close();
+} // Fine della funzione my_end
+
+
+
+//##############################################################
+// ##
+// Main ##
+// ##
+//##############################################################
+int main()
+{
+ //########################################
+ // Sezione dichiarativa delle variabili ##
+ //########################################
+ // Identficativi di task generici
+ PID pid0, pid1, pid3, pid5; //, pid2,pid4,pid6;
+
+ HARD_TASK_MODEL m_hard;
+ NRT_TASK_MODEL m_nrt;
+
+ // Ascoltatore di eventi
+ KEY_EVT emerg;
+ // Contatori
+ int j;
+
+
+ //####################################
+ // Sezione esecutiva del main ##
+ //####################################
+
+ // Inizializzazione dei parametri hartik
+ sem_init(&mutex,0,1);
+ sem_init(&pu,0,1);
+
+ emerg.ascii = 'x';
+ emerg.scan = KEY_X;
+ emerg.flag = ALTL_BIT;
+ keyb_hook(emerg, my_end);
+ sys_atrunlevel(end, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ if (grx_open(800, 600, 8) < 0)
+ {
+ cprintf("GRX Err\n");
+ sys_abort(300);
+ }
+ cprintf("scheda ok\n");
+
+ r=0.1;
+
+ /* Disposizione degli elementi grafici statici */
+ sem_wait(&mutex);
+ draw_static();
+ sem_post(&mutex);
+
+ // Attivazione dei task
+ hard_task_default_model(m_hard);
+ hard_task_def_wcet(m_hard,1); // wcet ignored!!!
+ hard_task_def_usemath(m_hard);
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ pid0=task_create("elicottero",elicottero,&m_hard,NULL);
+ task_activate(pid0);
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ pid1=task_create("indicometro",disegna_stato,&m_hard,NULL);
+ task_activate(pid1);
+
+ hard_task_def_mit(m_hard,PER_MOLLA);
+ pid3=task_create("molla",molla,&m_hard,NULL);
+ task_activate(pid3);
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ pid5=task_create("seleziona",seleziona,&m_hard,NULL);
+ task_activate(pid5);
+
+
+ hard_task_def_mit(m_hard,PER_DISEGNA);
+ hard_task_def_arg(m_hard,0);
+ pid_ruspa[0]=task_create("ruspa",ruspa,&m_hard,NULL);
+ task_activate(pid_ruspa[0]);
+ n_ruspa=0;
+
+ nrt_task_default_model(m_nrt);
+ nrt_task_def_usemath(m_nrt);
+ nrt_task_def_arg(m_nrt,0);
+ pid_kill_e = task_create("kill_task",kill_task, &m_nrt, NULL);
+ pid_pulisci_e = task_create("pulisci",pulisci, &m_nrt, NULL);
+
+ nrt_task_def_arg(m_nrt,(void *)1);
+ pid_kill_p = task_create("kill_task",kill_task, &m_nrt, NULL);
+ pid_pulisci_p = task_create("pulisci",pulisci, &m_nrt, NULL);
+
+
+
+
+ do {
+ tastiera = keyb_getch(BLOCK);
+
+ } while(tastiera!=ESC);
+
+ task_kill(pid5);
+ task_kill(pid3);
+ task_kill(pid1);
+ task_kill(pid0);
+
+ task_kill(pid_kill_p);
+ task_kill(pid_kill_e);
+
+ if (n_ruspa!=5) task_kill(pid_ruspa[n_ruspa]);
+ for(j=0;j<5;j++) { if (pre_peso[j]==1) task_kill(pid_peso[j]); }
+
+ grx_close();
+ sys_end();
+
+ return 0;
+} // Fine del main
+
+/***************************<Fine del file>*******************************/
Index: tags/rel_0_5/eli/makefile
===================================================================
--- tags/rel_0_5/eli/makefile (nonexistent)
+++ tags/rel_0_5/eli/makefile (revision 1657)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= eli
+
+include $(BASE)/config/example.mk
+
+eli:
+ make -f $(SUBMAKE) APP=eli INIT= OTHEROBJS="initfile.o draw.o" OTHERINCL= SHARKOPT="__OLDCHAR__ __GRX__"
+
Index: tags/rel_0_5/eli/draw.c
===================================================================
--- tags/rel_0_5/eli/draw.c (nonexistent)
+++ tags/rel_0_5/eli/draw.c (revision 1657)
@@ -0,0 +1,519 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: draw.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:47 $
+ ------------
+
+ This file is similar to the configuration of Hartik 3.3.1
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "eli.h"
+
+void draw_static()
+{
+ int i;
+ /************************************/
+ /* Sezione esecutiva della funzione */
+ /************************************/
+
+ grx_rect(X0min,Y0min,X0max,Y0max,COL_CORNICE);
+ // grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
+ grx_line(X0min,Y0min+100,X0min+100,Y0min+100,COL_CORNICE);
+ // grx_line(X0min,Y0min+350,X0min+100,Y0min+350,COL_CORNICE);
+
+ grx_line(X0min+25,Y0min+100,X0min+25,Y0max,COL_CORNICE);
+ grx_line(X0min+50,Y0min+100,X0min+50,Y0max,COL_CORNICE);
+ grx_line(X0min+75,Y0min+100,X0min+75,Y0max,COL_CORNICE);
+
+ grx_line(X0min,Y0min+100+127,X0min+25,Y0min+100+127,LIGHTBLUE);
+ grx_line(X0min+50,Y0min+100+127,X0min+100,Y0min+100+127,LIGHTBLUE);
+ grx_line(X0min+50,Y0min+100+127+250,X0min+100,Y0min+100+127+250,LIGHTBLUE);
+
+
+ grx_box(X0min+101+50,400,X0min+230+50,Y0max-1,BROWN);
+ for(i=1;i<6;i++){
+ grx_box(X0min+101+50+38,400+35*i-10,X0min+101+50+48,400+35*i,CYAN);
+ grx_box(X0min+101+50+81,400+35*i-10,X0min+101+50+91,400+35*i,CYAN);
+ }
+ grx_box(X0min+101+50+60,Y0max-30,X0min+101+50+70,Y0max-1,GREEN);
+
+
+ grx_box(700,520,X0max-1,Y0max-1,CYAN);
+
+
+
+ grx_text("Fx", X0min+5, Y0min+90, COL_TESTO, COL_SFONDO);
+ grx_text("Fy", X0min+30, Y0min+90, COL_TESTO, COL_SFONDO);
+ grx_text("Ax", X0min+55, Y0min+90, COL_TESTO, COL_SFONDO);
+ grx_text("Ay", X0min+80, Y0min+90, COL_TESTO, COL_SFONDO);
+ // grx_text("M", X0min+10, Y0min+351, COL_TESTO, COL_SFONDO);
+ // grx_text("P", X0min+35, Y0min+351, COL_TESTO, COL_SFONDO);
+ grx_text("Vx", X0min+55, Y0min+351, COL_TESTO, COL_SFONDO);
+ grx_text("Vy", X0min+80, Y0min+351, COL_TESTO, COL_SFONDO);
+
+ grx_text("S : Su", X0min+110, Y0min+15, COL_TESTO, COL_SFONDO);
+ grx_text("Z : Sinistra", X0min+110, Y0min+25, COL_TESTO, COL_SFONDO);
+ grx_text("X : Giu", X0min+110, Y0min+35, COL_TESTO, COL_SFONDO);
+ grx_text("C : Destra", X0min+110, Y0min+45, COL_TESTO, COL_SFONDO);
+ grx_text("P : aggancia Peso", X0min+110, Y0min+55, COL_TESTO, COL_SFONDO);
+ grx_text("L : Libera peso", X0min+110, Y0min+65, COL_TESTO, COL_SFONDO);
+ grx_text("Esc : Usita Programma", X0min+110, Y0min+75, COL_TESTO, COL_SFONDO);
+
+
+} // Fine della funzione draw_static
+
+TASK disegna_stato(int i)
+{ //double j;
+
+ while (1)
+ {
+
+ sem_wait(&mutex);
+
+ grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
+
+ grx_box(700,565,770,Y0max-1,LIGHTCYAN);
+
+ grx_box(X0min+101+50,400,X0min+230+50,420,BROWN);
+
+
+ //####################### FORZA X #############################
+ if ( 0.25<=Forza_x) grx_box(7,Y0min+210,26,Y0min+220,GREEN);
+ else grx_box(7,Y0min+210,26,Y0min+220,COL_SFONDO);
+ if ( 0.5<=Forza_x) grx_box(7,Y0min+195,26,Y0min+205,GREEN);
+ else grx_box(7,Y0min+195,26,Y0min+205,COL_SFONDO);
+ if ( 0.75<=Forza_x) grx_box(7,Y0min+180,26,Y0min+190,GREEN);
+ else grx_box(7,Y0min+180,26,Y0min+190,COL_SFONDO);
+ if ( 1<=Forza_x) grx_box(7,Y0min+165,26,Y0min+175,GREEN);
+ else grx_box(7,Y0min+165,26,Y0min+175,COL_SFONDO);
+ if ( 1.25<=Forza_x) grx_box(7,Y0min+150,26,Y0min+160,GREEN);
+ else grx_box(7,Y0min+150,26,Y0min+160,COL_SFONDO);
+ if ( 1.50<=Forza_x) grx_box(7,Y0min+135,26,Y0min+145,YELLOW);
+ else grx_box(7,Y0min+135,26,Y0min+145,COL_SFONDO);
+ if ( 1.75<=Forza_x) grx_box(7,Y0min+120,26,Y0min+130,RED);
+ else grx_box(7,Y0min+120,26,Y0min+130,COL_SFONDO);
+ if ( 2<=Forza_x) grx_box(7,Y0min+105,26,Y0min+115,RED);
+ else grx_box(7,Y0min+105,26,Y0min+115,COL_SFONDO);
+ //########### ------
+ if (-0.25>=Forza_x) grx_box(7,Y0min+230,26,Y0min+240,GREEN);
+ else grx_box(7,Y0min+230,26,Y0min+240,COL_SFONDO);
+ if ( -0.5>=Forza_x) grx_box(7,Y0min+245,26,Y0min+255,GREEN);
+ else grx_box(7,Y0min+245,26,Y0min+255,COL_SFONDO);
+ if ( -0.75>=Forza_x) grx_box(7,Y0min+260,26,Y0min+270,GREEN);
+ else grx_box(7,Y0min+260,26,Y0min+270,COL_SFONDO);
+ if ( -1>=Forza_x) grx_box(7,Y0min+275,26,Y0min+285,GREEN);
+ else grx_box(7,Y0min+275,26,Y0min+285,COL_SFONDO);
+ if ( -1.25>=Forza_x) grx_box(7,Y0min+290,26,Y0min+300,GREEN);
+ else grx_box(7,Y0min+290,26,Y0min+300,COL_SFONDO);
+ if ( -1.50>=Forza_x) grx_box(7,Y0min+305,26,Y0min+315,YELLOW);
+ else grx_box(7,Y0min+305,26,Y0min+315,COL_SFONDO);
+ if ( -1.75>=Forza_x) grx_box(7,Y0min+320,26,Y0min+330,RED);
+ else grx_box(7,Y0min+320,26,Y0min+330,COL_SFONDO);
+ if ( -2>=Forza_x) grx_box(7,Y0min+335,26,Y0min+345,RED);
+ else grx_box(7,Y0min+335,26,Y0min+345,COL_SFONDO);
+ //####################### FORZA Y #############################
+ if ( -0.5>=Forza_y) grx_box(32,Y0min+340,51,Y0min+345,GREEN);
+ else grx_box(32,Y0min+340,51,Y0min+345,COL_SFONDO);
+ if ( -1>=Forza_y) grx_box(32,Y0min+333,51,Y0min+338,GREEN);
+ else grx_box(32,Y0min+333,51,Y0min+338,COL_SFONDO);
+ if ( -1.5>=Forza_y) grx_box(32,Y0min+326,51,Y0min+331,GREEN);
+ else grx_box(32,Y0min+326,51,Y0min+331,COL_SFONDO);
+ if ( -2>=Forza_y) grx_box(32,Y0min+319,51,Y0min+324,GREEN);
+ else grx_box(32,Y0min+319,51,Y0min+324,COL_SFONDO);
+ if ( -2.5>=Forza_y) grx_box(32,Y0min+312,51,Y0min+317,GREEN);
+ else grx_box(32,Y0min+312,51,Y0min+317,COL_SFONDO);
+ if ( -3>=Forza_y) grx_box(32,Y0min+305,51,Y0min+310,GREEN);
+ else grx_box(32,Y0min+305,51,Y0min+310,COL_SFONDO);
+ if ( -3.5>=Forza_y) grx_box(32,Y0min+298,51,Y0min+303,GREEN);
+ else grx_box(32,Y0min+298,51,Y0min+303,COL_SFONDO);
+ if ( -4>=Forza_y) grx_box(32,Y0min+291,51,Y0min+296,GREEN);
+ else grx_box(32,Y0min+291,51,Y0min+296,COL_SFONDO);
+ if ( -4.5>=Forza_y) grx_box(32,Y0min+284,51,Y0min+289,GREEN);
+ else grx_box(32,Y0min+284,51,Y0min+289,COL_SFONDO);
+ if ( -5>=Forza_y) grx_box(32,Y0min+277,51,Y0min+282,GREEN);
+ else grx_box(32,Y0min+277,51,Y0min+282,COL_SFONDO);
+ if ( -5.5>=Forza_y) grx_box(32,Y0min+270,51,Y0min+275,GREEN);
+ else grx_box(32,Y0min+270,51,Y0min+275,COL_SFONDO);
+ if ( -6>=Forza_y) grx_box(32,Y0min+263,51,Y0min+268,GREEN);
+ else grx_box(32,Y0min+263,51,Y0min+268,COL_SFONDO);
+ if ( -6.5>=Forza_y) grx_box(32,Y0min+256,51,Y0min+261,GREEN);
+ else grx_box(32,Y0min+256,51,Y0min+261,COL_SFONDO);
+ if ( -7>=Forza_y) grx_box(32,Y0min+249,51,Y0min+254,GREEN);
+ else grx_box(32,Y0min+249,51,Y0min+254,COL_SFONDO);
+ if ( -7.5>=Forza_y) grx_box(32,Y0min+242,51,Y0min+247,GREEN);
+ else grx_box(32,Y0min+242,51,Y0min+247,COL_SFONDO);
+ if ( -8>=Forza_y) grx_box(32,Y0min+235,51,Y0min+240,GREEN);
+ else grx_box(32,Y0min+235,51,Y0min+240,COL_SFONDO);
+ if ( -8.5>=Forza_y) grx_box(32,Y0min+228,51,Y0min+233,GREEN);
+ else grx_box(32,Y0min+228,51,Y0min+233,COL_SFONDO);
+ if ( -9>=Forza_y) grx_box(32,Y0min+221,51,Y0min+226,GREEN);
+ else grx_box(32,Y0min+221,51,Y0min+226,COL_SFONDO);
+ if ( -9.5>=Forza_y) grx_box(32,Y0min+214,51,Y0min+219,GREEN);
+ else grx_box(32,Y0min+214,51,Y0min+219,COL_SFONDO);
+ if ( -10>=Forza_y) grx_box(32,Y0min+207,51,Y0min+212,GREEN);
+ else grx_box(32,Y0min+207,51,Y0min+212,COL_SFONDO);
+ if ( -10.5>=Forza_y) grx_box(32,Y0min+200,51,Y0min+205,GREEN);
+ else grx_box(32,Y0min+200,51,Y0min+205,COL_SFONDO);
+ if ( -11>=Forza_y) grx_box(32,Y0min+193,51,Y0min+198,GREEN);
+ else grx_box(32,Y0min+193,51,Y0min+198,COL_SFONDO);
+ if ( -11.5>=Forza_y) grx_box(32,Y0min+186,51,Y0min+191,GREEN);
+ else grx_box(32,Y0min+186,51,Y0min+191,COL_SFONDO);
+ if ( -12>=Forza_y) grx_box(32,Y0min+179,51,Y0min+184,GREEN);
+ else grx_box(32,Y0min+179,51,Y0min+184,COL_SFONDO);
+ if ( -12.5>=Forza_y) grx_box(32,Y0min+172,51,Y0min+177,GREEN);
+ else grx_box(32,Y0min+172,51,Y0min+177,COL_SFONDO);
+ if ( -13>=Forza_y) grx_box(32,Y0min+165,51,Y0min+170,GREEN);
+ else grx_box(32,Y0min+165,51,Y0min+170,COL_SFONDO);
+ if ( -13.5>=Forza_y) grx_box(32,Y0min+158,51,Y0min+163,GREEN);
+ else grx_box(32,Y0min+158,51,Y0min+163,COL_SFONDO);
+ if ( -14>=Forza_y) grx_box(32,Y0min+151,51,Y0min+156,GREEN);
+ else grx_box(32,Y0min+151,51,Y0min+156,COL_SFONDO);
+ if ( -14.5>=Forza_y) grx_box(32,Y0min+144,51,Y0min+149,GREEN);
+ else grx_box(32,Y0min+144,51,Y0min+149,COL_SFONDO);
+ if ( -15>=Forza_y) grx_box(32,Y0min+137,51,Y0min+142,YELLOW);
+ else grx_box(32,Y0min+137,51,Y0min+142,COL_SFONDO);
+ if ( -15.5>=Forza_y) grx_box(32,Y0min+130,51,Y0min+135,YELLOW);
+ else grx_box(32,Y0min+130,51,Y0min+135,COL_SFONDO);
+ if ( -16>=Forza_y) grx_box(32,Y0min+123,51,Y0min+128,RED);
+ else grx_box(32,Y0min+123,51,Y0min+128,COL_SFONDO);
+ if ( -16.5>=Forza_y) grx_box(32,Y0min+116,51,Y0min+121,RED);
+ else grx_box(32,Y0min+116,51,Y0min+121,COL_SFONDO);
+ if ( -17>=Forza_y) grx_box(32,Y0min+109,51,Y0min+114,RED);
+ else grx_box(32,Y0min+109,51,Y0min+114,COL_SFONDO);
+ if ( -17.5>=Forza_y) grx_box(32,Y0min+102,51,Y0min+107,RED);
+ else grx_box(32,Y0min+102,51,Y0min+107,COL_SFONDO);
+
+ //####################### ACCELERAZIONE X #############################
+ if ( -2.125>=Acc_x)grx_box(56,Y0min+340,75,Y0min+345,RED);
+ else grx_box(55,Y0min+340,75,Y0min+345,COL_SFONDO);
+ if ( -2>=Acc_x) grx_box(56,Y0min+333,75,Y0min+338,RED);
+ else grx_box(56,Y0min+333,75,Y0min+338,COL_SFONDO);
+ if ( -1.875>=Acc_x)grx_box(56,Y0min+326,75,Y0min+331,RED);
+ else grx_box(56,Y0min+326,75,Y0min+331,COL_SFONDO);
+ if ( -1.750>=Acc_x) grx_box(56,Y0min+319,75,Y0min+324,YELLOW);
+ else grx_box(56,Y0min+319,75,Y0min+324,COL_SFONDO);
+ if ( -1.625>=Acc_x)grx_box(56,Y0min+312,75,Y0min+317,YELLOW);
+ else grx_box(56,Y0min+312,75,Y0min+317,COL_SFONDO);
+ if ( -1.5>=Acc_x) grx_box(56,Y0min+305,75,Y0min+310,GREEN);
+ else grx_box(56,Y0min+305,75,Y0min+310,COL_SFONDO);
+ if ( -1.375>=Acc_x)grx_box(56,Y0min+298,75,Y0min+303,GREEN);
+ else grx_box(56,Y0min+298,75,Y0min+303,COL_SFONDO);
+ if ( -1.250>=Acc_x) grx_box(56,Y0min+291,75,Y0min+296,GREEN);
+ else grx_box(56,Y0min+291,75,Y0min+296,COL_SFONDO);
+ if ( -1.125>=Acc_x)grx_box(56,Y0min+284,75,Y0min+289,GREEN);
+ else grx_box(56,Y0min+284,75,Y0min+289,COL_SFONDO);
+ if ( -1>=Acc_x) grx_box(56,Y0min+277,75,Y0min+282,GREEN);
+ else grx_box(56,Y0min+277,75,Y0min+282,COL_SFONDO);
+ if ( -0.875>=Acc_x)grx_box(56,Y0min+270,75,Y0min+275,GREEN);
+ else grx_box(56,Y0min+270,75,Y0min+275,COL_SFONDO);
+ if ( -0.750>=Acc_x) grx_box(56,Y0min+263,75,Y0min+268,GREEN);
+ else grx_box(56,Y0min+263,75,Y0min+268,COL_SFONDO);
+ if ( -0.625>=Acc_x)grx_box(56,Y0min+256,75,Y0min+261,GREEN);
+ else grx_box(56,Y0min+256,75,Y0min+261,COL_SFONDO);
+ if ( -0.5>=Acc_x) grx_box(56,Y0min+249,75,Y0min+254,GREEN);
+ else grx_box(56,Y0min+249,75,Y0min+254,COL_SFONDO);
+ if ( -0.375>=Acc_x)grx_box(56,Y0min+242,75,Y0min+247,GREEN);
+ else grx_box(56,Y0min+242,75,Y0min+247,COL_SFONDO);
+ if ( -0.250>=Acc_x) grx_box(56,Y0min+235,75,Y0min+240,GREEN);
+ else grx_box(56,Y0min+235,75,Y0min+240,COL_SFONDO);
+ if ( -0.125>=Acc_x)grx_box(56,Y0min+228,75,Y0min+233,GREEN);
+ else grx_box(56,Y0min+228,75,Y0min+233,COL_SFONDO);
+ //############# ------
+ if ( 0.125<=Acc_x) grx_box(56,Y0min+221,75,Y0min+226,GREEN);
+ else grx_box(56,Y0min+221,75,Y0min+226,COL_SFONDO);
+ if ( 0.250<=Acc_x)grx_box(56,Y0min+214,75,Y0min+219,GREEN);
+ else grx_box(56,Y0min+214,75,Y0min+219,COL_SFONDO);
+ if ( 0.375<=Acc_x) grx_box(56,Y0min+207,75,Y0min+212,GREEN);
+ else grx_box(56,Y0min+207,75,Y0min+212,COL_SFONDO);
+ if (0.5<=Acc_x)grx_box(56,Y0min+200,75,Y0min+205,GREEN);
+ else grx_box(56,Y0min+200,75,Y0min+205,COL_SFONDO);
+ if ( 0.625<=Acc_x) grx_box(56,Y0min+193,75,Y0min+198,GREEN);
+ else grx_box(56,Y0min+193,75,Y0min+198,COL_SFONDO);
+ if (0.750<=Acc_x)grx_box(56,Y0min+186,75,Y0min+191,GREEN);
+ else grx_box(56,Y0min+186,75,Y0min+191,COL_SFONDO);
+ if (0.875<=Acc_x) grx_box(56,Y0min+179,75,Y0min+184,GREEN);
+ else grx_box(56,Y0min+179,75,Y0min+184,COL_SFONDO);
+ if (1<=Acc_x)grx_box(56,Y0min+172,75,Y0min+177,GREEN);
+ else grx_box(56,Y0min+172,75,Y0min+177,COL_SFONDO);
+ if (1.125<=Acc_x) grx_box(56,Y0min+165,75,Y0min+170,GREEN);
+ else grx_box(56,Y0min+165,75,Y0min+170,COL_SFONDO);
+ if (1.250<=Acc_x)grx_box(56,Y0min+158,75,Y0min+163,GREEN);
+ else grx_box(56,Y0min+158,75,Y0min+163,COL_SFONDO);
+ if (1.375<=Acc_x) grx_box(56,Y0min+151,75,Y0min+156,GREEN);
+ else grx_box(56,Y0min+151,75,Y0min+156,COL_SFONDO);
+ if (1.5<=Acc_x)grx_box(56,Y0min+144,75,Y0min+149,GREEN);
+ else grx_box(56,Y0min+144,75,Y0min+149,COL_SFONDO);
+ if (1.625<=Acc_x) grx_box(56,Y0min+137,75,Y0min+142,YELLOW);
+ else grx_box(56,Y0min+137,75,Y0min+142,COL_SFONDO);
+ if (1.750<=Acc_x)grx_box(56,Y0min+130,75,Y0min+135,YELLOW);
+ else grx_box(56,Y0min+130,75,Y0min+135,COL_SFONDO);
+ if (1.875<=Acc_x) grx_box(56,Y0min+123,75,Y0min+128,RED);
+ else grx_box(56,Y0min+123,75,Y0min+128,COL_SFONDO);
+ if (2<=Acc_x)grx_box(56,Y0min+116,75,Y0min+121,RED);
+ else grx_box(56,Y0min+116,75,Y0min+121,COL_SFONDO);
+ if (2.125<=Acc_x) grx_box(56,Y0min+109,75,Y0min+114,RED);
+ else grx_box(56,Y0min+109,75,Y0min+114,COL_SFONDO);
+ //####################### ACCELERAZIONE Y #############################
+ if ( 2.5<=Acc_y) { grx_box(81,Y0min+340,100,Y0min+345,RED);
+ grx_box(81+5,Y0min+340+1,100-5,Y0min+345-1,BLUE);
+ }
+ else grx_box(81,Y0min+340,100,Y0min+345,COL_SFONDO);
+ if ( 2.200<=Acc_y) grx_box(81,Y0min+333,100,Y0min+338,RED);
+ else grx_box(81,Y0min+333,100,Y0min+338,COL_SFONDO);
+ if ( 1.950<=Acc_y) grx_box(81,Y0min+326,100,Y0min+331,RED);
+ else grx_box(81,Y0min+326,100,Y0min+331,COL_SFONDO);
+ if ( 1.750<=Acc_y) grx_box(81,Y0min+319,100,Y0min+324,YELLOW);
+ else grx_box(81,Y0min+319,100,Y0min+324,COL_SFONDO);
+ if ( 1.625<=Acc_y) grx_box(81,Y0min+312,100,Y0min+317,YELLOW);
+ else grx_box(81,Y0min+312,100,Y0min+317,COL_SFONDO);
+ if ( 1.5<=Acc_y) grx_box(81,Y0min+305,100,Y0min+310,GREEN);
+ else grx_box(81,Y0min+305,100,Y0min+310,COL_SFONDO);
+ if ( 1.375<=Acc_y) grx_box(81,Y0min+298,100,Y0min+303,GREEN);
+ else grx_box(81,Y0min+298,100,Y0min+303,COL_SFONDO);
+ if ( 1.250<=Acc_y) grx_box(81,Y0min+291,100,Y0min+296,GREEN);
+ else grx_box(81,Y0min+291,100,Y0min+296,COL_SFONDO);
+ if ( 1.125<=Acc_y) grx_box(81,Y0min+284,100,Y0min+289,GREEN);
+ else grx_box(81,Y0min+284,100,Y0min+289,COL_SFONDO);
+ if ( 1<=Acc_y) grx_box(81,Y0min+277,100,Y0min+282,GREEN);
+ else grx_box(81,Y0min+277,100,Y0min+282,COL_SFONDO);
+ if ( 0.875<=Acc_y) grx_box(81,Y0min+270,100,Y0min+275,GREEN);
+ else grx_box(81,Y0min+270,100,Y0min+275,COL_SFONDO);
+ if ( 0.750<=Acc_y) grx_box(81,Y0min+263,100,Y0min+268,GREEN);
+ else grx_box(81,Y0min+263,100,Y0min+268,COL_SFONDO);
+ if ( 0.625<=Acc_y) grx_box(81,Y0min+256,100,Y0min+261,GREEN);
+ else grx_box(81,Y0min+256,100,Y0min+261,COL_SFONDO);
+ if ( 0.5<=Acc_y) grx_box(81,Y0min+249,100,Y0min+254,GREEN);
+ else grx_box(81,Y0min+249,100,Y0min+254,COL_SFONDO);
+ if ( 0.375<=Acc_y) grx_box(81,Y0min+242,100,Y0min+247,GREEN);
+ else grx_box(81,Y0min+242,100,Y0min+247,COL_SFONDO);
+ if ( 0.25<=Acc_y) grx_box(81,Y0min+235,100,Y0min+240,GREEN);
+ else grx_box(81,Y0min+235,100,Y0min+240,COL_SFONDO);
+ if ( 0.125<=Acc_y) grx_box(81,Y0min+228,100,Y0min+233,GREEN);
+ else grx_box(81,Y0min+228,100,Y0min+233,COL_SFONDO);
+ //############# ------
+ if ( -0.125>=Acc_y) grx_box(81,Y0min+221,100,Y0min+226,GREEN);
+ else grx_box(81,Y0min+221,100,Y0min+226,COL_SFONDO);
+ if ( -0.250>=Acc_y) grx_box(81,Y0min+214,100,Y0min+219,GREEN);
+ else grx_box(81,Y0min+214,100,Y0min+219,COL_SFONDO);
+ if ( -0.375>=Acc_y) grx_box(81,Y0min+207,100,Y0min+212,GREEN);
+ else grx_box(81,Y0min+207,100,Y0min+212,COL_SFONDO);
+ if (-0.5>=Acc_y) grx_box(81,Y0min+200,100,Y0min+205,GREEN);
+ else grx_box(81,Y0min+200,100,Y0min+205,COL_SFONDO);
+ if ( -0.625>=Acc_y) grx_box(81,Y0min+193,100,Y0min+198,GREEN);
+ else grx_box(81,Y0min+193,100,Y0min+198,COL_SFONDO);
+ if (-0.750>=Acc_y) grx_box(81,Y0min+186,100,Y0min+191,GREEN);
+ else grx_box(81,Y0min+186,100,Y0min+191,COL_SFONDO);
+ if (-0.875>=Acc_y) grx_box(81,Y0min+179,100,Y0min+184,GREEN);
+ else grx_box(81,Y0min+179,100,Y0min+184,COL_SFONDO);
+ if (-1>=Acc_y) grx_box(81,Y0min+172,100,Y0min+177,GREEN);
+ else grx_box(81,Y0min+172,100,Y0min+177,COL_SFONDO);
+ if (-1.125>=Acc_y) grx_box(81,Y0min+165,100,Y0min+170,YELLOW);
+ else grx_box(81,Y0min+165,100,Y0min+170,COL_SFONDO);
+ if (-1.250>=Acc_y) grx_box(81,Y0min+158,100,Y0min+163,YELLOW);
+ else grx_box(81,Y0min+158,100,Y0min+163,COL_SFONDO);
+ if (-1.375>=Acc_y) grx_box(81,Y0min+151,100,Y0min+156,YELLOW);
+ else grx_box(81,Y0min+151,100,Y0min+156,COL_SFONDO);
+ if (-1.5>=Acc_y) grx_box(81,Y0min+144,100,Y0min+149,YELLOW);
+ else grx_box(81,Y0min+144,100,Y0min+149,COL_SFONDO);
+ if (-1.625>=Acc_y) grx_box(81,Y0min+137,100,Y0min+142,RED);
+ else grx_box(81,Y0min+137,100,Y0min+142,COL_SFONDO);
+ if (-1.750>=Acc_y) grx_box(81,Y0min+130,100,Y0min+135,RED);
+ else grx_box(81,Y0min+130,100,Y0min+135,COL_SFONDO);
+ if (-1.875>=Acc_y) grx_box(81,Y0min+123,100,Y0min+128,RED);
+ else grx_box(81,Y0min+123,100,Y0min+128,COL_SFONDO);
+ if (-2>=Acc_y) grx_box(81,Y0min+116,100,Y0min+121,RED);
+ else grx_box(81,Y0min+116,100,Y0min+121,COL_SFONDO);
+ if (-2.3>=Acc_y) grx_box(81,Y0min+109,100,Y0min+114,RED);
+ else grx_box(81,Y0min+109,100,Y0min+114,COL_SFONDO);
+ //####################### VELOCITA X #############################
+ //if ( -21.25>=Velocita_x)grx_box(56,Y0min+340+250,75,Y0min+345+250,RED);
+ //else grx_box(55,Y0min+340+250,75,Y0min+345+250,COL_SFONDO);
+ if ( -20>=Velocita_x) grx_box(56,Y0min+333+250,75,Y0min+338+250,RED);
+ else grx_box(56,Y0min+333+250,75,Y0min+338+250,COL_SFONDO);
+ if ( -18.75>=Velocita_x)grx_box(56,Y0min+326+250,75,Y0min+331+250,RED);
+ else grx_box(56,Y0min+326+250,75,Y0min+331+250,COL_SFONDO);
+ if ( -17.50>=Velocita_x)grx_box(56,Y0min+319+250,75,Y0min+324+250,YELLOW);
+ else grx_box(56,Y0min+319+250,75,Y0min+324+250,COL_SFONDO);
+ if ( -16.25>=Velocita_x)grx_box(56,Y0min+312+250,75,Y0min+317+250,YELLOW);
+ else grx_box(56,Y0min+312+250,75,Y0min+317+250,COL_SFONDO);
+ if ( -15>=Velocita_x) grx_box(56,Y0min+305+250,75,Y0min+310+250,GREEN);
+ else grx_box(56,Y0min+305+250,75,Y0min+310+250,COL_SFONDO);
+ if ( -13.75>=Velocita_x)grx_box(56,Y0min+298+250,75,Y0min+303+250,GREEN);
+ else grx_box(56,Y0min+298+250,75,Y0min+303+250,COL_SFONDO);
+ if ( -12.50>=Velocita_x)grx_box(56,Y0min+291+250,75,Y0min+296+250,GREEN);
+ else grx_box(56,Y0min+291+250,75,Y0min+296+250,COL_SFONDO);
+ if ( -11.25>=Velocita_x)grx_box(56,Y0min+284+250,75,Y0min+289+250,GREEN);
+ else grx_box(56,Y0min+284+250,75,Y0min+289+250,COL_SFONDO);
+ if ( -10>=Velocita_x) grx_box(56,Y0min+277+250,75,Y0min+282+250,GREEN);
+ else grx_box(56,Y0min+277+250,75,Y0min+282+250,COL_SFONDO);
+ if ( -8.75>=Velocita_x)grx_box(56,Y0min+270+250,75,Y0min+275+250,GREEN);
+ else grx_box(56,Y0min+270+250,75,Y0min+275+250,COL_SFONDO);
+ if ( -7.50>=Velocita_x)grx_box(56,Y0min+263+250,75,Y0min+268+250,GREEN);
+ else grx_box(56,Y0min+263+250,75,Y0min+268+250,COL_SFONDO);
+ if ( -6.25>=Velocita_x)grx_box(56,Y0min+256+250,75,Y0min+261+250,GREEN);
+ else grx_box(56,Y0min+256+250,75,Y0min+261+250,COL_SFONDO);
+ if ( -5>=Velocita_x) grx_box(56,Y0min+249+250,75,Y0min+254+250,GREEN);
+ else grx_box(56,Y0min+249+250,75,Y0min+254+250,COL_SFONDO);
+ if ( -3.75>=Velocita_x)grx_box(56,Y0min+242+250,75,Y0min+247+250,GREEN);
+ else grx_box(56,Y0min+242+250,75,Y0min+247+250,COL_SFONDO);
+ if ( -2.50>=Velocita_x)grx_box(56,Y0min+235+250,75,Y0min+240+250,GREEN);
+ else grx_box(56,Y0min+235+250,75,Y0min+240+250,COL_SFONDO);
+ if ( -1.25>=Velocita_x)grx_box(56,Y0min+228+250,75,Y0min+233+250,GREEN);
+ else grx_box(56,Y0min+228+250,75,Y0min+233+250,COL_SFONDO);
+ //############# ------
+ if ( 1.25<=Velocita_x) grx_box(56,Y0min+221+250,75,Y0min+226+250,GREEN);
+ else grx_box(56,Y0min+221+250,75,Y0min+226+250,COL_SFONDO);
+ if ( 2.50<=Velocita_x) grx_box(56,Y0min+214+250,75,Y0min+219+250,GREEN);
+ else grx_box(56,Y0min+214+250,75,Y0min+219+250,COL_SFONDO);
+ if ( 3.75<=Velocita_x) grx_box(56,Y0min+207+250,75,Y0min+212+250,GREEN);
+ else grx_box(56,Y0min+207+250,75,Y0min+212+250,COL_SFONDO);
+ if (5<=Velocita_x) grx_box(56,Y0min+200+250,75,Y0min+205+250,GREEN);
+ else grx_box(56,Y0min+200+250,75,Y0min+205+250,COL_SFONDO);
+ if ( 6.25<=Velocita_x) grx_box(56,Y0min+193+250,75,Y0min+198+250,GREEN);
+ else grx_box(56,Y0min+193+250,75,Y0min+198+250,COL_SFONDO);
+ if (7.50<=Velocita_x) grx_box(56,Y0min+186+250,75,Y0min+191+250,GREEN);
+ else grx_box(56,Y0min+186+250,75,Y0min+191+250,COL_SFONDO);
+ if (8.75<=Velocita_x) grx_box(56,Y0min+179+250,75,Y0min+184+250,GREEN);
+ else grx_box(56,Y0min+179+250,75,Y0min+184+250,COL_SFONDO);
+ if (10<=Velocita_x) grx_box(56,Y0min+172+250,75,Y0min+177+250,GREEN);
+ else grx_box(56,Y0min+172+250,75,Y0min+177+250,COL_SFONDO);
+ if (11.25<=Velocita_x) grx_box(56,Y0min+165+250,75,Y0min+170+250,GREEN);
+ else grx_box(56,Y0min+165+250,75,Y0min+170+250,COL_SFONDO);
+ if (12.50<=Velocita_x) grx_box(56,Y0min+158+250,75,Y0min+163+250,GREEN);
+ else grx_box(56,Y0min+158+250,75,Y0min+163+250,COL_SFONDO);
+ if (13.75<=Velocita_x) grx_box(56,Y0min+151+250,75,Y0min+156+250,GREEN);
+ else grx_box(56,Y0min+151+250,75,Y0min+156+250,COL_SFONDO);
+ if (15<=Velocita_x) grx_box(56,Y0min+144+250,75,Y0min+149+250,GREEN);
+ else grx_box(56,Y0min+144+250,75,Y0min+149+250,COL_SFONDO);
+ if (16.25<=Velocita_x) grx_box(56,Y0min+137+250,75,Y0min+142+250,YELLOW);
+ else grx_box(56,Y0min+137+250,75,Y0min+142+250,COL_SFONDO);
+ if (17.50<=Velocita_x) grx_box(56,Y0min+130+250,75,Y0min+135+250,YELLOW);
+ else grx_box(56,Y0min+130+250,75,Y0min+135+250,COL_SFONDO);
+ if (18.75<=Velocita_x) grx_box(56,Y0min+123+250,75,Y0min+128+250,RED);
+ else grx_box(56,Y0min+123+250,75,Y0min+128+250,COL_SFONDO);
+ if (20<=Velocita_x) grx_box(56,Y0min+116+250,75,Y0min+121+250,RED);
+ else grx_box(56,Y0min+116+250,75,Y0min+121+250,COL_SFONDO);
+ if (21.25<=Velocita_x) grx_box(56,Y0min+109+250,75,Y0min+114+250,RED);
+ else grx_box(56,Y0min+109+250,75,Y0min+114+250,COL_SFONDO);
+
+ //####################### VELOCITA Y #############################
+ // if ( 160<=Velocita_y)grx_box(81,Y0min+340+250,100,Y0min+345+250,RED);
+ // else grx_box(81,Y0min+340+250,100,Y0min+345+250,COL_SFONDO);
+ if ( 40<=Velocita_y) grx_box(81,Y0min+333+250,100,Y0min+338+250,RED);
+ else grx_box(81,Y0min+333+250,100,Y0min+338+250,COL_SFONDO);
+ if ( 37.5<=Velocita_y)grx_box(81,Y0min+326+250,100,Y0min+331+250,RED);
+ else grx_box(81,Y0min+326+250,100,Y0min+331+250,COL_SFONDO);
+ if ( 35<=Velocita_y)grx_box(81,Y0min+319+250,100,Y0min+324+250,YELLOW);
+ else grx_box(81,Y0min+319+250,100,Y0min+324+250,COL_SFONDO);
+ if ( 32.5<=Velocita_y)grx_box(81,Y0min+312+250,100,Y0min+317+250,YELLOW);
+ else grx_box(81,Y0min+312+250,100,Y0min+317+250,COL_SFONDO);
+ if ( 30<=Velocita_y) grx_box(81,Y0min+305+250,100,Y0min+310+250,GREEN);
+ else grx_box(81,Y0min+305+250,100,Y0min+310+250,COL_SFONDO);
+ if ( 27.5<=Velocita_y)grx_box(81,Y0min+298+250,100,Y0min+303+250,GREEN);
+ else grx_box(81,Y0min+298+250,100,Y0min+303+250,COL_SFONDO);
+ if ( 25<=Velocita_y)grx_box(81,Y0min+291+250,100,Y0min+296+250,GREEN);
+ else grx_box(81,Y0min+291+250,100,Y0min+296+250,COL_SFONDO);
+ if ( 22.5<=Velocita_y)grx_box(81,Y0min+284+250,100,Y0min+289+250,GREEN);
+ else grx_box(81,Y0min+284+250,100,Y0min+289+250,COL_SFONDO);
+ if ( 20<=Velocita_y) grx_box(81,Y0min+277+250,100,Y0min+282+250,GREEN);
+ else grx_box(81,Y0min+277+250,100,Y0min+282+250,COL_SFONDO);
+ if ( 17.5<=Velocita_y) grx_box(81,Y0min+270+250,100,Y0min+275+250,GREEN);
+ else grx_box(81,Y0min+270+250,100,Y0min+275+250,COL_SFONDO);
+ if ( 15<=Velocita_y) grx_box(81,Y0min+263+250,100,Y0min+268+250,GREEN);
+ else grx_box(81,Y0min+263+250,100,Y0min+268+250,COL_SFONDO);
+ if ( 12.5<=Velocita_y) grx_box(81,Y0min+256+250,100,Y0min+261+250,GREEN);
+ else grx_box(81,Y0min+256+250,100,Y0min+261+250,COL_SFONDO);
+ if ( 10<=Velocita_y) grx_box(81,Y0min+249+250,100,Y0min+254+250,GREEN);
+ else grx_box(81,Y0min+249+250,100,Y0min+254+250,COL_SFONDO);
+ if ( 7.5<=Velocita_y) grx_box(81,Y0min+242+250,100,Y0min+247+250,GREEN);
+ else grx_box(81,Y0min+242+250,100,Y0min+247+250,COL_SFONDO);
+ if ( 5<=Velocita_y) grx_box(81,Y0min+235+250,100,Y0min+240+250,GREEN);
+ else grx_box(81,Y0min+235+250,100,Y0min+240+250,COL_SFONDO);
+ if ( 2.5<=Velocita_y) grx_box(81,Y0min+228+250,100,Y0min+233+250,GREEN);
+ else grx_box(81,Y0min+228+250,100,Y0min+233+250,COL_SFONDO);
+ //############# ------
+ if (-2.5>=Velocita_y) grx_box(81,Y0min+221+250,100,Y0min+226+250,GREEN);
+ else grx_box(81,Y0min+221+250,100,Y0min+226+250,COL_SFONDO);
+ if (-5>=Velocita_y) grx_box(81,Y0min+214+250,100,Y0min+219+250,GREEN);
+ else grx_box(81,Y0min+214+250,100,Y0min+219+250,COL_SFONDO);
+ if (-7.5>=Velocita_y) grx_box(81,Y0min+207+250,100,Y0min+212+250,GREEN);
+ else grx_box(81,Y0min+207+250,100,Y0min+212+250,COL_SFONDO);
+ if (-10>=Velocita_y) grx_box(81,Y0min+200+250,100,Y0min+205+250,GREEN);
+ else grx_box(81,Y0min+200+250,100,Y0min+205+250,COL_SFONDO);
+ if (-12.5>=Velocita_y) grx_box(81,Y0min+193+250,100,Y0min+198+250,GREEN);
+ else grx_box(81,Y0min+193+250,100,Y0min+198+250,COL_SFONDO);
+ if (-15>=Velocita_y) grx_box(81,Y0min+186+250,100,Y0min+191+250,GREEN);
+ else grx_box(81,Y0min+186+250,100,Y0min+191+250,COL_SFONDO);
+ if (-17.5>=Velocita_y) grx_box(81,Y0min+179+250,100,Y0min+184+250,GREEN);
+ else grx_box(81,Y0min+179+250,100,Y0min+184+250,COL_SFONDO);
+ if (-20>=Velocita_y) grx_box(81,Y0min+172+250,100,Y0min+177+250,GREEN);
+ else grx_box(81,Y0min+172+250,100,Y0min+177+250,COL_SFONDO);
+ if (-22.5>=Velocita_y) grx_box(81,Y0min+165+250,100,Y0min+170+250,GREEN);
+ else grx_box(81,Y0min+165+250,100,Y0min+170+250,COL_SFONDO);
+ if (-25>=Velocita_y) grx_box(81,Y0min+158+250,100,Y0min+163+250,GREEN);
+ else grx_box(81,Y0min+158+250,100,Y0min+163+250,COL_SFONDO);
+ if (-27.5>=Velocita_y) grx_box(81,Y0min+151+250,100,Y0min+156+250,GREEN);
+ else grx_box(81,Y0min+151+250,100,Y0min+156+250,COL_SFONDO);
+ if (-30>=Velocita_y) grx_box(81,Y0min+144+250,100,Y0min+149+250,GREEN);
+ else grx_box(81,Y0min+144+250,100,Y0min+149+250,COL_SFONDO);
+ if (-32.5>=Velocita_y) grx_box(81,Y0min+137+250,100,Y0min+142+250,YELLOW);
+ else grx_box(81,Y0min+137+250,100,Y0min+142+250,COL_SFONDO);
+ if (-35>=Velocita_y) grx_box(81,Y0min+130+250,100,Y0min+135+250,YELLOW);
+ else grx_box(81,Y0min+130+250,100,Y0min+135+250,COL_SFONDO);
+ if (-37.5>=Velocita_y) grx_box(81,Y0min+123+250,100,Y0min+128+250,RED);
+ else grx_box(81,Y0min+123+250,100,Y0min+128+250,COL_SFONDO);
+ if (-40>=Velocita_y) grx_box(81,Y0min+116+250,100,Y0min+121+250,RED);
+ else grx_box(81,Y0min+116+250,100,Y0min+121+250,COL_SFONDO);
+ if (-42.5>=Velocita_y) grx_box(81,Y0min+109+250,100,Y0min+114+250,RED);
+ else grx_box(81,Y0min+109+250,100,Y0min+114+250,COL_SFONDO);
+
+
+ sem_post(&mutex);
+
+
+ task_endcycle();
+ }
+}
+
+
Index: tags/rel_0_5/kalm3d/initfile.c
===================================================================
--- tags/rel_0_5/kalm3d/initfile.c (nonexistent)
+++ tags/rel_0_5/kalm3d/initfile.c (revision 1657)
@@ -0,0 +1,120 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:47 $
+ ------------
+
+ System initialization file
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ an EDF (Earliest Deadline First) level
+ a RR (Round Robin) level
+ a CBS (Costant Bandwidth Server) level
+ a Dummy level
+
+ It can accept these task models:
+
+ HARD_TASK_MODEL (wcet+mit) at level 0
+ SOFT_TASK_MODEL (met, period) at level 1
+ NRT_TASK_MODEL at level 2
+
+ This file is similar to the configuration of kernel/init/hartik3.c
+
+ TICK is set to 0 (one-shot timer is used)
+*/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ keyb_def_map(kparms,itaMap);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/kalm3d/carrello.c
===================================================================
--- tags/rel_0_5/kalm3d/carrello.c (nonexistent)
+++ tags/rel_0_5/kalm3d/carrello.c (revision 1657)
@@ -0,0 +1,198 @@
+#include <math.h>
+
+#include <modules/hartport.h>
+#include <kernel/kern.h>
+#include <kernel/func.h>
+#include <ll/i386/x-dos.h>
+
+#include "drivers/pclab.h"
+
+#include "const.h"
+
+float vmax = 0.0, vmin = 0.0, vmaxth = 0.0, vminth = 0.0;
+
+int da_motor(float v)
+{
+
+ da_conv( 2.5 , 2 );
+ da_conv( v + 2.5 , 1 );
+
+ return(0);
+
+}
+
+float v2x(float v)
+{
+ float x;
+
+ x= LUNGH * (v-(vmax+vmin)/2 ) / (vmax-vmin);
+
+ return x;
+
+}
+
+float v2theta(float v)
+{
+ float theta;
+
+ theta=2.0*(THETAMAX/FCA) * (v-(vmaxth+vminth)/2 ) / (vmaxth-vminth);
+
+ return theta;
+
+}
+
+float bass1(float u)
+{
+ float y;
+ static float oldy=0;
+
+ y=(oldy + prm.WCUT * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECX(PERIOD_CARRELLO));
+ oldy=y;
+
+ return y;
+
+}
+
+float bass2(float u)
+{
+ float y;
+ static float oldy=0;
+
+ y=(oldy + prm.WCUT1 * DEADSECX(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECX(PERIOD_CARRELLO));
+ oldy=y;
+
+ return y;
+
+}
+
+float bass3(float u)
+{
+ float y;
+ static float oldy=0;
+
+ y=(oldy + prm.WCUT * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT * DEADSECTH(PERIOD_CARRELLO));
+ oldy=y;
+
+ return y;
+
+}
+
+float bass4(float u)
+{
+ float y;
+ static float oldy=0;
+
+ y=(oldy + prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO) *u)/(1+ prm.WCUT1 * DEADSECTH(PERIOD_CARRELLO));
+ oldy=y;
+
+ return y;
+
+}
+
+float dx(float u)
+{
+ static float oldu=0;
+ float y;
+
+ y=(u-oldu)/DEADSECX(PERIOD_CARRELLO);
+ oldu=u;
+
+ return y;
+
+}
+
+float dth(float u)
+{
+ static float oldu=0;
+ float y;
+
+ y=(u-oldu)/DEADSECTH(PERIOD_CARRELLO);
+ oldu=u;
+
+ return y;
+
+}
+
+TASK carrello(void)
+{
+ float y[2]={0,0}, yp[2]={0,0};
+ PORT px, pth;
+
+ float th_input = 0.0,arr_th_input[AVR],th_eff,av_th_input;
+ float x_input = 0.0,arr_x_input[AVR],x_eff,av_x_input;
+
+ int flag_th=1,flag_x=1,index_th=0,index_x=0;
+
+ int i;
+ float offset,vout,vout_total;
+
+ px = port_create("porta1",sizeof(float),1,STICK,WRITE);
+ pth = port_create("porta2",sizeof(float),1,STICK,WRITE);
+
+ while (1) {
+
+ task_nopreempt();
+ th_input=ad_conv(10);
+ task_preempt();
+
+ if(flag_th==1) {
+ for(i=0; i<AVR;++i) arr_th_input[i] = th_input;
+ flag_th=0;
+ }
+ av_th_input=0;
+ for(i=0;i<AVR;++i) av_th_input += arr_th_input[i];
+ av_th_input /= AVR ;
+
+ if(fabs(th_input-av_th_input)>=prm.NOISE) th_input=av_th_input;
+
+ arr_th_input[index_th]=th_input;
+ index_th = (index_th+1) % AVR ;
+
+ th_eff = v2theta(th_input);
+ y[1] = bass3(th_eff);
+ yp[1] = bass4(dth(y[1]));
+
+ task_nopreempt();
+ x_input=ad_conv(11);
+ task_preempt();
+
+ if(flag_x==1) {
+ for(i=0; i<AVR;++i) arr_x_input[i] = x_input;
+ flag_x=0;
+ }
+ av_x_input=0;
+ for(i=0;i<AVR;++i) av_x_input += arr_x_input[i];
+ av_x_input /= AVR;
+ if(fabs(x_input-av_x_input)>=prm.NOISE) x_input = av_x_input;
+
+ arr_x_input[index_x] = x_input;
+ index_x = (index_x+1) % AVR ;
+
+ x_eff = v2x(x_input);
+ y[0] = bass1(x_eff);
+ yp[0] = bass2(dx(y[0]));
+
+ vout = prm.COST * (prm.GUAD[0] * (y[0]-v2x((vmax+vmin)/2)) + prm.GUAD[1] * th_eff\
+ + prm.GUAD[2] * yp[0] + prm.GUAD[3] * yp[1]);
+
+ if(vout >= 0) offset=prm.OFFSVAL;
+ else offset=-prm.OFFSVAL;
+
+ vout_total = vout + offset;
+
+ if(vout_total >= VDANG ) vout_total = VDANG ;
+ if(vout_total <= -VDANG ) vout_total = -VDANG ;
+
+ da_motor(vout_total);
+
+ port_send(px, &y[0], NON_BLOCK);
+ port_send(pth, &y[1], NON_BLOCK);
+
+ task_endcycle();
+
+ }
+
+ port_delete(px);
+ port_delete(pth);
+
+} /* FINE DEL TASK CARRELLO */
Index: tags/rel_0_5/kalm3d/readme.txt
===================================================================
--- tags/rel_0_5/kalm3d/readme.txt (nonexistent)
+++ tags/rel_0_5/kalm3d/readme.txt (revision 1657)
@@ -0,0 +1,51 @@
+--------------------------------------
+Inverted Pendulum Demo with Mesa
+
+by
+
+Giacomo Guidi <giacomo@gandalf.sssup.it>
+
+Last update 17/03/2003
+--------------------------------------
+
+This is the old Inverted Pendulum control
+demo rewrited usigng the Mesa support
+
+The demo needs a PCL812 card present and
+the inv.pendulum hardware
+
+The graphic cards actually supported are:
+
+GEFORCE TNT TNT2 - driver name NV3
+RAGE128 RADEON - driver name R128
+SAVAGE VIRGE - driver neme SAVAGE
+
+--------------------------------------
+
+The demo is composed by:
+
+MAKEFILE The makefile used to compile the application
+README.TXT This file
+INITFILE.C The init file
+KALM3D.C The Inv.Pendulum Demo
+CARRELLO.C The control task
+
+--------------------------------------
+
+- To specify your card change the line
+
+#define CARD <driver name>
+
+- The demo calls the grx and off-screen Mesa functions.
+The resolution must be 16 bitsperpixel (64K colors) and
+the graphic access mode must be linear.
+
+- There are two buffers
+
+ The video buffer (video_buf)
+ The virtual buffer (rgb_565_buf)
+
+ copy_videomem_16to16 links these buffers
+
+
+
Index: tags/rel_0_5/kalm3d/const.h
===================================================================
--- tags/rel_0_5/kalm3d/const.h (nonexistent)
+++ tags/rel_0_5/kalm3d/const.h (revision 1657)
@@ -0,0 +1,36 @@
+#ifndef __CONST__
+#define __CONST__
+
+extern unsigned long int PERIOD_CARRELLO;
+extern unsigned long int PERIOD_DISEGNA;
+
+#define DEADSECX(x) (x * 1.0e-6 )
+#define DEADSECTH(x) (x * 1.0e-6 )
+
+#define PARAM {{ 1. , 300 , 0.79 , 23 },0.70 ,2.5 ,20.,20., 0.1, 1 , 1, 0.}
+
+#define LUNGH 35.0
+#define THETAMAX 45.0
+#define FCA 57.29578
+#define AVR 10
+#define VDANG 2.4
+#define NMAX 300
+#define SEC_ID 7.0
+#define MAXRUN_ID 9 //16
+
+struct Parametri{
+ float GUAD[4];
+ float COST;
+ float NOISE;
+ float WCUT;
+ float WCUT1;
+ float OFFSVAL;
+ int DEADLINE;
+ int SCAN;
+ float XTRASL;
+};
+
+extern struct Parametri prm;
+extern float vmax, vmin, vmaxth, vminth;
+
+#endif
Index: tags/rel_0_5/kalm3d/kalm3d.c
===================================================================
--- tags/rel_0_5/kalm3d/kalm3d.c (nonexistent)
+++ tags/rel_0_5/kalm3d/kalm3d.c (revision 1657)
@@ -0,0 +1,441 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Giacomo Guidi <giacomo@gandalf.sssup.it>
+ *
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+#include <ll/i386/defs.h>
+
+#include <drivers/glib.h>
+#include <drivers/pclab.h>
+
+#include <math.h>
+#include <stdlib.h>
+#include <kernel/log.h>
+#include <GL/osmesa.h>
+#include <GL/glut.h>
+
+#include <modules/hartport.h>
+#include <kernel/kern.h>
+#include <kernel/func.h>
+#include <ll/i386/x-dos.h>
+#include <drivers/keyb.h>
+
+#include "const.h"
+
+#define WIDTH 640
+#define HEIGHT 480
+#define BYTES_PP 2
+
+unsigned long int PERIOD_CARRELLO = 10000;
+unsigned long int PERIOD_DISEGNA = 80000;
+struct Parametri prm=PARAM;
+
+unsigned long int WCET_CARRELLO, WCET_DISEGNA;
+
+TASK carrello(void *);
+
+PID carrello_PID, disegna_PID;
+
+unsigned char *buffers = NULL;
+unsigned char *vbuf = NULL;
+OSMesaContext ctx;
+
+static GLfloat view_rotx = 170.0, view_roty = -200.0, view_rotz = 0.0;
+static GLfloat angle;
+
+GLUquadricObj *quadratic;
+
+static GLfloat SUP_W = 110.0;
+static GLfloat SUP_P = 30.0;
+
+extern void da_motor(float v);
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+void program_end(void)
+{
+
+ da_motor(0.0);
+
+ OSMesaDestroyContext(ctx);
+ free(buffers);
+
+ grx_close();
+
+ sys_end();
+
+}
+
+void program_key_end(KEY_EVT *k)
+{
+
+ sys_end();
+
+}
+
+static void draw_box(GLfloat p1x, GLfloat p1y ,GLfloat p1z, GLfloat p2x, GLfloat p2y, GLfloat p2z) {
+
+ glBegin(GL_QUADS);
+
+ // Front Face
+ glVertex3f(p1x, p1y, p1z);
+ glVertex3f(p2x, p1y, p1z);
+ glVertex3f(p2x, p2y, p1z);
+ glVertex3f(p1x, p2y, p1z);
+
+ // Back Face
+ glVertex3f(p1x, p1y, p2z);
+ glVertex3f(p1x, p2y, p2z);
+ glVertex3f(p2x, p2y, p2z);
+ glVertex3f(p2x, p1y, p2z);
+
+ // Top Face
+ glVertex3f(p1x, p2y, p2z);
+ glVertex3f(p1x, p2y, p1z);
+ glVertex3f(p2x, p2y, p1z);
+ glVertex3f(p2x, p2y, p2z);
+
+ // Bottom Face
+ glVertex3f(p1x, p1y, p2z);
+ glVertex3f(p2x, p1y, p2z);
+ glVertex3f(p2x, p1y, p1z);
+ glVertex3f(p1x, p1y, p1z);
+
+ // Right face
+ glVertex3f(p2x, p1y, p2z);
+ glVertex3f(p2x, p2y, p2z);
+ glVertex3f(p2x, p2y, p1z);
+ glVertex3f(p2x, p1y, p1z);
+
+ // Left Face
+ glVertex3f(p1x, p1y, p2z);
+ glVertex3f(p1x, p1y, p1z);
+ glVertex3f(p1x, p2y, p1z);
+ glVertex3f(p1x, p2y, p2z);
+
+ glEnd();
+
+}
+
+static void draw_carrello(GLfloat x_scene, GLfloat angle_scene) {
+
+ static GLfloat gl_white[3] = {1.0f, 1.0f, 1.0f};
+ static GLfloat gl_dark_gray[3] = {0.3f, 0.3f, 0.3f};
+ static GLfloat gl_gray[3] = {0.7f, 0.7f, 0.7f};
+
+ glPushMatrix();
+
+ glColor3fv(gl_dark_gray);
+
+ glShadeModel(GL_FLAT);
+
+ glTranslatef(x_scene, 0.0f, 0.0f);
+
+ draw_box(-6.0f, -6.0f, 9.0f, 6.0f, -2.0f, -9.0f);
+ draw_box(-6.0f, -2.0f, 9.0f, 6.0f, -1.0f, 4.0f);
+
+ glColor3fv(gl_white);
+
+ draw_box(-8.0f, -2.0f, -3.0f, 8.0f, -1.0f, -10.0f);
+
+ glColor3fv(gl_dark_gray);
+
+ draw_box(-5.0f, 1.0f, 8.0f, 5.0f, 9.0f, 6.0f);
+ draw_box(-5.0f,1.0f,-6.0f,5.0f,9.0f,-8.0f);
+ draw_box(-5.0f,-1.0f,8.0f,5.0f,1.0f,-8.0f);
+
+ glShadeModel(GL_SMOOTH);
+
+ glColor3fv(gl_white);
+
+ glTranslatef(0.0f, 4.5f, -6.0f);
+ gluCylinder(quadratic, 2.2f, 2.2f, 12.0f, 16, 16);
+
+ glColor3fv(gl_gray);
+
+ glTranslatef(0.0f, 0.0f, 6.0f);
+ glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+ glRotatef(angle_scene, 0.0f, 1.0f, 0.0f);
+ gluCylinder(quadratic, 1.3f, 1.3f, 160.0f, 16, 16);
+ glRotatef(-angle_scene, 0.0f, 1.0f, 0.0f);
+ glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+
+ glTranslatef(-4.0f, -2.5f, -6.0f);
+ gluCylinder(quadratic, 0.5f, 0.5f, 12.0f, 16, 16);
+
+ glTranslatef(8.0f, 0.0f, 0.0f);
+ gluCylinder(quadratic, 0.5f, 0.5f, 12.0f, 16, 16);
+
+ glPopMatrix();
+
+}
+
+static void draw_support() {
+
+ static GLfloat gl_dark_gray[3] = {0.3f, 0.3f, 0.3f};
+ static GLfloat gl_gray[3] = {0.7f, 0.7f, 0.7f};
+
+ glPushMatrix();
+
+ glColor3fv(gl_gray);
+
+ glShadeModel(GL_FLAT);
+
+ draw_box(-SUP_W/2, -0.1f, SUP_P/2, SUP_W/2, 0.1f, -SUP_P/2);
+
+ glColor3fv(gl_dark_gray);
+
+ draw_box(-SUP_W/2-3.0f, -0.1f, SUP_P/2, -SUP_W/2, 14.0f, -SUP_P/2-0.2f);
+ draw_box(SUP_W/2, -0.1f, SUP_P/2, SUP_W/2+3.0f, 14.0f, -SUP_P/2-0.2f);
+
+ glShadeModel(GL_SMOOTH);
+
+ glColor3fv(gl_gray);
+
+ glTranslatef(-SUP_W/2, 6.0f, 0.0f);
+ glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ gluCylinder(quadratic, 1.5f, 1.5f, SUP_W, 16, 16);
+
+ glPopMatrix();
+
+}
+
+static void draw(GLfloat prm_x, GLfloat prm_th)
+{
+
+ prm_x = -prm_x / LUNGH * (SUP_W-20.0f);
+ prm_th = -prm_th * FCA;
+
+ glPushMatrix();
+
+ glRotatef(view_rotx, 1.0f, 0.0f, 0.0f);
+ glRotatef(view_roty, 0.0f, 1.0f, 0.0f);
+ glRotatef(view_rotz, 0.0f, 0.0f, 1.0f);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glRotatef(angle, 0.0f, 1.0f, 0.0f);
+
+ draw_support();
+ glTranslatef(0.0f, 10.0f, -4.0f);
+ draw_carrello(prm_x,prm_th);
+
+ glPopMatrix();
+
+ glFinish();
+
+}
+
+static void init_gl()
+{
+
+ static GLfloat pos0[4] = {40.0f, -70.0f, 180.0f, 1.0f};
+
+ glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glViewport(0, 0, (GLint) WIDTH, (GLint) HEIGHT);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0f,(GLfloat)WIDTH/(GLfloat)HEIGHT,0.1f,250.0f);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0f, 30.0f, -120.0f);
+
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+
+ quadratic=gluNewQuadric();
+
+ glEnable(GL_AUTO_NORMAL);
+ glEnable(GL_COLOR_MATERIAL);
+ glEnable(GL_NORMALIZE);
+ glDepthFunc(GL_LEQUAL);
+
+}
+
+TASK disegna(void)
+{
+
+ PORT pr_x, pr_th;
+ float prm_x, prm_th;
+
+ char text[100];
+ TIME disegna_TIME, carrello_TIME;
+
+ pr_x = port_connect("porta1",sizeof(float),STICK,READ);
+ pr_th = port_connect("porta2",sizeof(float),STICK,READ);
+
+ //vbuf = malloc(WIDTH * HEIGHT * 2); //Debug line
+
+ while(1) {
+
+ port_receive(pr_x, &prm_x, BLOCK);
+ port_receive(pr_th, &prm_th, BLOCK);
+
+ angle += 0.2;
+
+ draw(prm_x,prm_th);
+
+ jet_gettable(carrello_PID, &carrello_TIME, 1);
+ jet_gettable(disegna_PID, &disegna_TIME, 1);
+
+ sprintf(text,"Hard Task Control PER:%6d us EX:%6d us",(int)PERIOD_CARRELLO,(int)carrello_TIME);
+ grx_text(text,10,5,rgb16(0,0,255),rgb16(255,255,255));
+ sprintf(text,"Hard Task Draw PER:%6d us EX:%6d us",(int)PERIOD_DISEGNA,(int)disegna_TIME);
+ grx_text(text,10,15,rgb16(0,0,255),rgb16(255,255,255));
+
+ memcpy(buffers,vbuf,WIDTH*HEIGHT*BYTES_PP);
+
+ task_endcycle();
+
+ }
+
+ port_disconnect(pr_x);
+ port_disconnect(pr_th);
+
+ sys_end();
+
+}
+
+static void screen()
+{
+ extern DWORD flbaddr;
+
+ /* graphic card Initialization */
+ if (grx_init() < 1) {
+ sys_abort(1);
+ }
+
+ if (grx_open(640, 480, 16) < 0) {
+ cprintf("GRX Err\n");
+ sys_abort(1);
+ }
+
+ vbuf = (unsigned char *)flbaddr;
+
+}
+
+void waitenter() {
+
+ KEY_EVT k;
+ char esc = FALSE;
+
+ while(!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii == 13) esc = TRUE;
+ }
+
+}
+
+
+void init_motor(void)
+{
+
+ da_motor(0.0);
+
+ cprintf("Calibrazione pendolo inverso...\n");
+
+ cprintf("Carr a sx e premi enter\n");
+ waitenter();
+ vmin=ad_conv(11);
+
+ cprintf("Carr a dx e premi enter\n");
+ waitenter();
+ vmax=ad_conv(11);
+
+ cprintf("Asta a sx e premi enter\n");
+ waitenter();
+ vminth=ad_conv(10);
+
+ cprintf("Asta a dx e premi enter\n");
+ waitenter();
+ vmaxth=ad_conv(10);
+
+ cprintf("Vxmax:%f Vxmin:%f Vthmax:%f Vthmin:%f\n",vmax,vmin,vmaxth,vminth);
+ waitenter();
+
+}
+
+int main (int argc, char *argv[])
+{
+ HARD_TASK_MODEL ht_carrello, ht_disegna;
+
+ WCET_CARRELLO =((long int) PERIOD_CARRELLO * (0.05));
+ WCET_DISEGNA =((long int) PERIOD_DISEGNA * (0.875));
+
+ clear();
+
+ sys_atrunlevel((void *) program_end,NULL, RUNLEVEL_BEFORE_EXIT);
+
+ hard_task_default_model(ht_carrello);
+ hard_task_def_wcet(ht_carrello,WCET_CARRELLO);
+ hard_task_def_mit(ht_carrello,PERIOD_CARRELLO);
+ hard_task_def_usemath(ht_carrello);
+ hard_task_def_group(ht_carrello,1);
+ hard_task_def_ctrl_jet(ht_carrello);
+
+ carrello_PID = task_create("carrello", carrello, &ht_carrello, NULL);
+ if (carrello_PID == -1) {
+ sys_end();
+ exit(4);
+ }
+
+ hard_task_default_model(ht_disegna);
+ hard_task_def_mit(ht_disegna,PERIOD_DISEGNA);
+ hard_task_def_wcet(ht_disegna,WCET_DISEGNA);
+ hard_task_def_group(ht_disegna,1);
+ hard_task_def_ctrl_jet(ht_disegna);
+ hard_task_def_usemath(ht_disegna);
+ hard_task_def_stack(ht_disegna,60000);
+
+ disegna_PID = task_create("disegna", disegna, &ht_disegna, NULL);
+ if (disegna_PID == -1) {
+ sys_end();
+ exit(4);
+ }
+
+ {
+ KEY_EVT k;
+ k.flag = ALTL_BIT;
+ k.scan = KEY_C;
+ k.ascii = 'c';
+ keyb_hook(k,program_key_end);
+ }
+
+ init_motor();
+
+ screen();
+
+ ctx = OSMesaCreateContext(OSMESA_RGB_565, NULL );
+
+ buffers = malloc(WIDTH*HEIGHT*BYTES_PP);
+
+ OSMesaMakeCurrent(ctx, buffers, GL_UNSIGNED_SHORT_5_6_5, WIDTH, HEIGHT);
+
+ init_gl();
+
+ group_activate(1);
+
+ return 0;
+
+}
Index: tags/rel_0_5/kalm3d/makefile
===================================================================
--- tags/rel_0_5/kalm3d/makefile (nonexistent)
+++ tags/rel_0_5/kalm3d/makefile (revision 1657)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS = kalm3d
+
+include $(BASE)/config/example.mk
+
+kalm3d:
+ make -f $(SUBMAKE) APP=kalm3d INIT= OTHEROBJS="initfile.o carrello.o" SHARKOPT="__OSMESA__ __PCLAB__ __OLDCHAR__ __GRX__"
+
Index: tags/rel_0_5/base_cpp/hello.cpp
===================================================================
--- tags/rel_0_5/base_cpp/hello.cpp (nonexistent)
+++ tags/rel_0_5/base_cpp/hello.cpp (revision 1657)
@@ -0,0 +1,72 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2003 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/*
+ CVS : $Id: hello.cpp,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
+
+ hello.c:
+
+ This test is a simple hello world function.
+
+*/
+
+#include "kernel/kern.h"
+
+class myHello {
+ int i;
+public:
+
+ myHello(int anumber)
+ {
+ i = anumber;
+ }
+
+ void myprint(void)
+ {
+ cprintf("myHello objecy prints %d.", i);
+ }
+};
+
+int main(int argc, char **argv)
+{
+ cprintf("Hello, world!\n");
+
+ myHello h(1234);
+
+ h.myprint();
+
+ return 0;
+}
Index: tags/rel_0_5/base_cpp/readme
===================================================================
--- tags/rel_0_5/base_cpp/readme (nonexistent)
+++ tags/rel_0_5/base_cpp/readme (revision 1657)
@@ -0,0 +1,8 @@
+This directory contains a few C++ demos:
+
+- hello.cpp - this is a simple hello world written in C++, similar to that in demos/base
+
+
+Initialization files:
+
+- ihello.c - same as in demos/base
Index: tags/rel_0_5/base_cpp/makefile
===================================================================
--- tags/rel_0_5/base_cpp/makefile (nonexistent)
+++ tags/rel_0_5/base_cpp/makefile (revision 1657)
@@ -0,0 +1,13 @@
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS = hello
+
+include $(BASE)/config/example.mk
+
+
+# Text applications
+hello:
+ make -f $(SUBMAKE) APP=hello INIT= OTHEROBJS="ihello.o" OTHERINCL=
Index: tags/rel_0_5/base_cpp/ihello.c
===================================================================
--- tags/rel_0_5/base_cpp/ihello.c (nonexistent)
+++ tags/rel_0_5/base_cpp/ihello.c (revision 1657)
@@ -0,0 +1,95 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/**
+ ------------
+ CVS : $Id: ihello.c,v 1.1.1.1 2004-05-24 18:03:47 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:47 $
+ ------------
+
+ The simplest initialization file
+
+ The tick is set to TICK ms.
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ a RR (Round Robin) level
+ a Dummy level
+
+ It can accept these task models:
+
+ NRT_TASK_MODEL at level 0
+
+**/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+
+#include "kernel/kern.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 300
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/fsdemo/gphoto.c
===================================================================
--- tags/rel_0_5/fsdemo/gphoto.c (nonexistent)
+++ tags/rel_0_5/fsdemo/gphoto.c (revision 1657)
@@ -0,0 +1,302 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: gphoto.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:44 $
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "mutex.h"
+#include "gphoto.h"
+
+#ifdef FULLCOLOR
+#define COLORFG rgb16(255,255,255)
+#define COLORBG rgb16(0,0,0)
+#else
+#define COLORFG 255
+#define COLORBG 0
+#endif
+
+#ifdef FULLCOLOR
+
+/* 16bits format 5:6:5 */
+/* 24bits format 8:8:8 */
+static void down24to16(int h ,
+ WORD *dst, BYTE *src,
+ int xs, int ys, int dx, int dy)
+{
+ WORD *pdst;
+ BYTE *psrc;
+ int x,y;
+ int n;
+
+ /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
+
+ for (y=0;y<dy;y++) {
+ psrc=src;
+ pdst=dst;
+
+ n=read(h,src,dx*3);
+ if (n!=dx*3) return;
+
+ for (x=0;x<dx;x++,psrc+=3,pdst++)
+ /* blue green red */
+ *pdst=((psrc[0]&0xf8)>>3)|((psrc[1]&0xfc)<<3)|((psrc[2]&0xf8)<<8);
+
+#ifndef NOGRX
+ grxlock();
+ grx_putimage(xs, ys+dy-y-1, xs+dx-1, ys+dy-y-1, dst);
+ grxunlock();
+#endif
+
+ }
+
+}
+
+#define downscaleimage(h,x,y,a,b,c,d) down24to16(h,(WORD*)x,y,a,b,c,d)
+
+#else
+
+static void down24to8(int h,
+ BYTE *dst, BYTE *src,
+ int xs, int ys, int dx, int dy)
+{
+ BYTE *pdst;
+ BYTE *psrc;
+ int x,y;
+ int n;
+
+ /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
+
+ for (y=0;y<dy;y++) {
+ psrc=src;
+ pdst=dst;
+
+ n=read(h,src,dx*3);
+ if (n!=dx*3) return;
+
+ for (x=0;x<dx;x++,psrc+=3,pdst++)
+ *pdst=(((int)psrc[0])*11+((int)psrc[1])*59+((int)psrc[2])*30)/100;
+
+#ifndef NOGRX
+ grxlock();
+ grx_putimage(xs, ys+dy-y-1, xs+dx-1, ys+dy-y-1, dst);
+ grxunlock();
+#endif
+
+ }
+}
+
+#define downscaleimage(h,x,y,a,b,c,d) down24to8(h,x,y,a,b,c,d)
+
+#endif
+
+/*
+ *
+ */
+
+struct taskinfo {
+ int h;
+ BYTE *dst,*src;
+ int x,y;
+ int dx,dy;
+};
+
+static TASK phototask(void *arg)
+{
+ struct taskinfo *p=(struct taskinfo *)arg;
+
+ downscaleimage(p->h,p->dst,p->src,p->x,p->y,p->dx,p->dy);
+
+ free(p->dst);
+ free(p->src);
+ close(p->h);
+
+ free(arg);
+
+ return NULL;
+}
+
+
+/*
+ *
+ */
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+int gphoto_show(char *title, char *pathname, int x, int y)
+{
+ NRT_TASK_MODEL model;
+ struct BITMAPFILEHEADER *bf;
+ struct BITMAPINFOHEADER *bi;
+ struct taskinfo *info;
+ BYTE *src,*dst;
+ long l;
+ int h,n;
+ int dx,dy;
+ PID pid;
+
+ bf=(struct BITMAPFILEHEADER *)malloc(sizeof(struct BITMAPFILEHEADER));
+ bi=(struct BITMAPINFOHEADER *)malloc(sizeof(struct BITMAPINFOHEADER));
+
+ if (bf==NULL||bi==NULL) return -11;
+
+ h=open(pathname,O_RDONLY);
+ if (h==-1) {
+ free(bf);
+ free(bi);
+ return -2;
+ }
+
+ n=read(h,bf,sizeof(struct BITMAPFILEHEADER));
+ if (n!=sizeof(struct BITMAPFILEHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ n=read(h,bi,sizeof(struct BITMAPINFOHEADER));
+ if (n!=sizeof(struct BITMAPINFOHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ //grx_close();
+
+ /*
+ cprintf("type: %c %c\n",bf->bfType&0xff,bf->bfType>>8);
+ cprintf("size: %li\n",bf->bfSize);
+ cprintf("tell: %li\n\n",bf->bfOffBits);
+
+ cprintf("bitcoutn: %i\n",bi->biBitCount);
+ cprintf("compress: %li\n",bi->biCompression);
+ cprintf("dx: %li\n",bi->biWidth);
+ cprintf("dy: %li\n",bi->biHeight);
+ */
+
+ //sys_end();
+ //return 0;
+
+ if (bf->bfType!='B'+256*'M'||
+ bi->biBitCount!=24||
+ bi->biCompression!=0||
+ bi->biWidth%4!=0) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -5;
+ }
+
+ dx=bi->biWidth;
+ dy=bi->biHeight;
+
+ src=(BYTE*)malloc(dx*3);
+ if (src==NULL) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ dst=(BYTE*)malloc(dx*2);
+ if (dst==NULL) {
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ l=lseek(h,bf->bfOffBits,SEEK_SET);
+ if (l!=bf->bfOffBits) {
+ free(dst);
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -7;
+ }
+
+#ifndef NOGRX
+ draw_frame(x,y,dx,dy);
+ grxlock();
+ grx_text(title,x,y-14,COLORFG,COLORBG);
+ grxunlock();
+#endif
+
+ free(bi);
+ free(bf);
+
+ info=(struct taskinfo *)malloc(sizeof(struct taskinfo));
+ if (info==NULL) {
+ free(dst);
+ free(src);
+ close(h);
+ return -8;
+ }
+ info->h=h;
+ info->src=src;
+ info->dst=dst;
+ info->x=x;
+ info->y=y;
+ info->dx=dx;
+ info->dy=dy;
+
+ nrt_task_default_model(model);
+ nrt_task_def_arg(model,info);
+ pid=task_create("Photo",phototask,&model,NULL);
+
+ return pid;
+}
Index: tags/rel_0_5/fsdemo/gclock.c
===================================================================
--- tags/rel_0_5/fsdemo/gclock.c (nonexistent)
+++ tags/rel_0_5/fsdemo/gclock.c (revision 1657)
@@ -0,0 +1,81 @@
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+#include <kernel/model.h>
+#include <kernel/types.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+
+#include "mutex.h"
+#include "gclock.h"
+
+#ifdef FULLCOLOR
+#define COLORFG rgb16(255,255,255)
+#define COLORBG rgb16(0,0,0)
+#else
+#define COLORFG 255
+#define COLORBG 0
+#endif
+
+struct info {
+ int x;
+ int y;
+};
+
+static TASK grxclock(struct info *ptr)
+{
+ char buffer[16];
+ int min,sec;
+
+ min=sec=0;
+ for (;;) {
+ sprintf(buffer,"%02i:%02i",min,sec);
+#ifndef NOGRX
+ grxlock();
+ grx_text(buffer,ptr->x,ptr->y,COLORFG,COLORBG);
+ grxunlock();
+#endif
+ sec++;
+ if (sec==60) {
+ sec=0;
+ min++;
+ if (min==60) min=0;
+ }
+ task_endcycle();
+ }
+ return NULL;
+}
+
+PID gclock_init(int x, int y)
+{
+ SOFT_TASK_MODEL model;
+ struct info *ptr;
+
+ ptr=(struct info *)malloc(sizeof(struct info));
+ if (ptr==NULL) return -1;
+ ptr->x=x+1;
+ ptr->y=y+1;
+
+#ifndef NOGRX
+ grxlock();
+ grx_box(x-1,y-1,x+GCLOCKDX-1,y+GCLOCKDY-1,COLORBG);
+ grx_rect(x-1,y-1,x+GCLOCKDX-1,y+GCLOCKDY-1,COLORFG);
+ grx_text("00:00",ptr->x,ptr->y,COLORFG,COLORBG);
+ grx_text("Clock",ptr->x,ptr->y-12,COLORFG,COLORBG);
+ grxunlock();
+#endif
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,5000);
+ soft_task_def_wcet(model,5000);
+ soft_task_def_period(model,1000000);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)ptr);
+ //soft_task_def_ctrl_jet(model);
+
+ return task_create("grxclock", grxclock, &model, NULL);
+}
Index: tags/rel_0_5/fsdemo/xread.c
===================================================================
--- tags/rel_0_5/fsdemo/xread.c (nonexistent)
+++ tags/rel_0_5/fsdemo/xread.c (revision 1657)
@@ -0,0 +1,240 @@
+/*
+ *
+ *
+ *
+ *
+ */
+
+#include "config.h"
+
+#include <ll/i386/cons.h>
+
+#include <kernel/func.h>
+#include <kernel/int_sem.h>
+#define seminit(s,v) internal_sem_init(s,v)
+#define semwait(s) internal_sem_wait(s)
+#define semsignal(s) internal_sem_post(s)
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <assert.h>
+
+#include "xread.h"
+
+/**/
+
+/*
+ */
+
+#ifndef ACTIVATE
+int x_fseek(FILE *file, long where, int from)
+{
+ return fseek(file,where,from);
+}
+
+size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
+{
+ return fread(buffer,size,n,file);
+}
+
+void x_init(void)
+{}
+
+int x_initbuffer(int group, FILE *f, int rate, int band)
+{
+ return XUNUSEDPID;
+}
+
+#endif
+
+#ifdef ACTIVATE
+int x_fseek(FILE *file, long where, int from)
+{
+ return -1;
+}
+
+#define BLOCKSIZE (512*4)
+#define BLOCKSPERBUFFER (BUFFERMAXSIZE/BLOCKSIZE)
+
+/* in millisecondi */
+#define PRELOAD 500
+
+struct xbuffer *table[OPEN_MAX];
+
+int end_counter=0;
+
+static TASK bufferfiller(void *arg)
+{
+ struct xbuffer *ptr=(struct xbuffer *)arg;
+ int n;
+
+ for (;;) {
+ if (freespace(ptr)>BLOCKSIZE+8) {
+ //assert(ptr->writeptr>=0);
+ //assert(ptr->writeptr+BLOCKSIZE<=BUFFERMAXSIZE);
+ n=read(ptr->handle,ptr->buffer+ptr->writeptr,BLOCKSIZE);
+#ifdef NOGRX
+ cprintf("²");
+#endif
+ kern_cli();
+ ptr->writeptr+=n;
+ /* ipotesi: non si legge mai piu' di BUFFERMAXSIZE */
+ if (ptr->writeptr>=BUFFERMAXSIZE) ptr->writeptr-=BUFFERMAXSIZE;
+ kern_sti();
+ if (n!=BLOCKSIZE) {
+ //cprintf("<XXX>");
+ break;
+ }
+ //assert(ptr->writeptr%512==0);
+ }
+ task_endcycle();
+ }
+
+ end_counter++;
+
+ return NULL;
+}
+
+void x_init(void)
+{
+ int i;
+ for (i=0;i<OPEN_MAX;i++) table[i]=NULL;
+}
+
+/* rate in bits/sec */
+/* band in percentuale *100 */
+int x_initbuffer(int group, FILE *f, int rate, int band)
+{
+#ifdef EDFSCHED
+ BDEDF_RES_MODEL resource;
+#endif
+#ifdef PSCANSCHED
+ BDPSCAN_RES_MODEL resource;
+#endif
+ SOFT_TASK_MODEL model;
+ struct xbuffer *ptr;
+ int handle;
+ int period,wcet;
+ int n,preload;
+ PID pid;
+
+ handle=fileno(f);
+ if (handle>OPEN_MAX||handle<0) return -11;
+
+ if (table[handle]!=NULL) return -2;
+
+ ptr=table[handle]=(struct xbuffer *)malloc(sizeof(struct xbuffer));
+ if (ptr==NULL) return -3;
+
+ ptr->handle=handle;
+ ptr->writeptr=ptr->readptr=0;
+ n=lseek(ptr->handle,0,SEEK_SET);
+ if (n!=0) {
+ cprintf("can't seek to 0\n");
+ return -12;
+ }
+
+ /* PRELOAD */
+ preload=rate*PRELOAD/8/1000;
+ if (preload<100*1024) preload=100*1024;
+ preload=(preload/BLOCKSIZE+1)*BLOCKSIZE;
+ if (preload>BUFFERMAXSIZE-BLOCKSIZE) return -4;
+ n=read(ptr->handle,ptr->buffer,preload);
+ if (n!=preload) {
+ cprintf("preload: request %li bytes (%li returned)\n",
+ (long)preload,(long)n);
+ return -5;
+ }
+ ptr->writeptr+=n;
+
+ //cprintf("%li bytes preloaded\n",(long)n);
+ if (rate==0) sys_abort(997);
+ period=1000000l*BLOCKSIZE/rate*8;
+ wcet=period*band/10000;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,wcet);
+ soft_task_def_wcet(model,wcet);
+ soft_task_def_period(model,period);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)ptr);
+ soft_task_def_group(model,group);
+
+#if defined(EDFSCHED)
+ BDEDF_res_default_model(resource);
+ BDEDF_res_def_dl(resource,period);
+ pid=task_createn("xfill", bufferfiller,(TASK_MODEL*)&model, &resource, NULL);
+#elif defined(PSCANSCHED)
+ BDPSCAN_res_default_model(resource);
+ BDPSCAN_res_def_priority(resource,0);
+ pid=task_createn("xfill", bufferfiller,(TASK_MODEL*)&model, &resource, NULL);
+#else
+ pid=task_create("xfill", bufferfiller, &model, NULL);
+#endif
+ if (pid!=-1) {
+ cprintf("task wcet=%10li period=%10li\n",(long)wcet,(long)period);
+ }
+
+ return pid;
+}
+
+size_t x_fread(void *buffer, size_t objsize, size_t n, FILE *file)
+{
+ struct xbuffer *ptr;
+ int size,sz;
+ int nv;
+
+ ptr=table[fileno(file)];
+ if (ptr==NULL) {
+ cprintf("x_fread with bad fd\n");
+ return 0;
+ }
+
+ size=objsize*n;
+ //cprintf("[for %i]",size);
+REDO:
+ if (filledspace(ptr)<size) {
+ /*
+ cprintf("x_fread called for %li bytes (%li available)\n",
+ (long)size,
+ (long)filledspace(ptr));
+ */
+ nv=n;
+ n=filledspace(ptr)/objsize;
+ if (n==0) {
+ struct timespec delay;
+ delay.tv_sec=0;
+ delay.tv_nsec=15000000;
+ n=nv;
+ nanosleep(&delay, 0);
+ goto REDO;
+ return 0;
+ }
+ size=objsize*n;
+ /*cprintf("%i will return\n",size);*/
+ }
+
+ sz=BUFFERMAXSIZE-ptr->readptr;
+ if (sz>=size) {
+ //cprintf("X");
+ memcpy(buffer,ptr->buffer+ptr->readptr,size);
+ } else {
+ //cprintf("Y");
+ memcpy(buffer,ptr->buffer+ptr->readptr,sz);
+ assert(size-sz>0);
+ memcpy(buffer+sz,ptr->buffer,size-sz);
+ }
+
+ kern_cli();
+ ptr->readptr+=size;
+ /* ipotesi: non si legge mai piu' di BUFFERMAXSIZE */
+ if (ptr->readptr>=BUFFERMAXSIZE) ptr->readptr-=BUFFERMAXSIZE;
+ kern_sti();
+
+ return n;
+}
+
+#endif
Index: tags/rel_0_5/fsdemo/initfile.c
===================================================================
--- tags/rel_0_5/fsdemo/initfile.c (nonexistent)
+++ tags/rel_0_5/fsdemo/initfile.c (revision 1657)
@@ -0,0 +1,119 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:44 $
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/cbs.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+#include "modules/nopm.h"
+
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ extern int __register_sub_init_prologue(void);
+ extern int __register_sub_init(void);
+
+ __register_sub_init_prologue();
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ PC_register_module();
+ NPP_register_module();
+ SRP_register_module();
+ NOP_register_module();
+ NOPM_register_module();
+
+ __register_sub_init();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ KEYB_PARMS keyb = BASE_KEYB;
+ extern int __bdev_sub_init(void);
+ extern int __fs_sub_init(void);
+ extern void ctrlc_exit(KEY_EVT *k);
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(keyb, ctrlc_exit);
+ KEYB_init(&keyb);
+
+ __bdev_sub_init();
+ __fs_sub_init();
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/fsdemo/gphoto.h
===================================================================
--- tags/rel_0_5/fsdemo/gphoto.h (nonexistent)
+++ tags/rel_0_5/fsdemo/gphoto.h (revision 1657)
@@ -0,0 +1,42 @@
+/*
+ *
+ *
+ */
+
+#ifndef __GPHOTO_H
+#define __GPHOTO_H
+
+#include <ll/sys/types.h>
+
+struct BITMAPFILEHEADER {
+ WORD bfType;
+ DWORD bfSize;
+ WORD bfReserved1;
+ WORD bfReserved2;
+ DWORD bfOffBits;
+} __attribute__((packed));
+
+struct BITMAPINFOHEADER {
+ DWORD biSize;
+ DWORD biWidth;
+ DWORD biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
+ DWORD biSizeImage;
+ DWORD biXPelsPerMeter;
+ DWORD biYPelsPerMeter;
+ DWORD biClrUsed;
+ DWORD biClrImportant;
+} __attribute__((packed));
+
+struct RGBQUAD {
+ BYTE rgbBlue;
+ BYTE rgbGreen;
+ BYTE rgbRed;
+ BYTE rgbReserverd;
+} __attribute__((packed));
+
+int gphoto_show(char *title, char *pathname, int x, int y);
+
+#endif
Index: tags/rel_0_5/fsdemo/gclock.h
===================================================================
--- tags/rel_0_5/fsdemo/gclock.h (nonexistent)
+++ tags/rel_0_5/fsdemo/gclock.h (revision 1657)
@@ -0,0 +1,13 @@
+
+
+#ifndef __GCLOCK_H
+#define __GCLOCK_H
+
+#include <kernel/types.h>
+
+PID gclock_init(int x, int y);
+
+#define GCLOCKDX (5*8+2)
+#define GCLOCKDY (1*8+2)
+
+#endif
Index: tags/rel_0_5/fsdemo/mutex.h
===================================================================
--- tags/rel_0_5/fsdemo/mutex.h (nonexistent)
+++ tags/rel_0_5/fsdemo/mutex.h (revision 1657)
@@ -0,0 +1,32 @@
+
+#ifndef __GRXMUTEX_H
+#define __GRXMUTEX_H
+
+#include "config.h"
+
+#ifdef GRXMUTEX
+
+#include <kernel/int_sem.h>
+
+#define g_sem_t internal_sem_t
+
+#define g_sem_init(s,value) internal_sem_init(s,value)
+#define g_sem_wait(s) internal_sem_wait(s)
+#define g_sem_signal(s) internal_sem_post(s)
+
+#else
+
+#define g_sem_t int
+
+#define g_sem_init(s,value)
+#define g_sem_wait(s)
+#define g_sem_signal(s)
+
+#endif
+
+extern g_sem_t grxsem;
+
+#define grxlock() g_sem_wait(&grxsem)
+#define grxunlock() g_sem_signal(&grxsem)
+
+#endif
Index: tags/rel_0_5/fsdemo/xread.h
===================================================================
--- tags/rel_0_5/fsdemo/xread.h (nonexistent)
+++ tags/rel_0_5/fsdemo/xread.h (revision 1657)
@@ -0,0 +1,46 @@
+
+#ifndef XREAD_H_
+#define XREAD_H_
+
+#include <stdio.h>
+
+#define BUFFERMAXSIZE (128*1024l)
+
+struct xbuffer {
+ int handle;
+ char buffer[BUFFERMAXSIZE+8];
+ int readptr;
+ int writeptr;
+};
+extern struct xbuffer *table[OPEN_MAX];
+
+void x_init(void);
+
+/* rate in bit/sec */
+/* band in percentuale */
+int x_initbuffer(int group, FILE *f, int rate, int band);
+
+#define XUNUSEDPID 5821
+
+/*
+ *
+ */
+
+static __inline__ int filledspace(struct xbuffer *ptr)
+{
+ int size;
+
+ if (ptr->writeptr==ptr->readptr) return 0;
+
+ size=ptr->writeptr-ptr->readptr;
+ if (size<0) size+=BUFFERMAXSIZE;
+
+ return size;
+}
+
+static __inline__ int freespace(struct xbuffer *ptr)
+{
+ return BUFFERMAXSIZE-filledspace(ptr);
+}
+
+#endif
Index: tags/rel_0_5/fsdemo/config.h
===================================================================
--- tags/rel_0_5/fsdemo/config.h (nonexistent)
+++ tags/rel_0_5/fsdemo/config.h (revision 1657)
@@ -0,0 +1,44 @@
+
+/*
+ *
+ */
+
+/* if def: does not use graphics */
+#define NOGRX 1
+#undef NOGRX
+
+/* if def: use a mutex for all graphics operations */
+#define GRXMUTEX 1
+#undef GRXMUTEX
+
+/* if def: use full color (16bits.. sigh) else use 8 bits/pixel grayscale */
+#define FULLCOLOR 1
+#undef FULLCOLOR
+
+/*
+ *
+ */
+
+/* if def: does not trace events (does not work) */
+#define NOTRACE 1
+//#undef NOTRACE
+
+/*
+ *
+ */
+
+/* if def: activate task buffering */
+#define ACTIVATE 1
+//#undef ACTIVATE
+
+/*
+ *
+ */
+
+/* if def: use bd_edf resource for I/O tasks */
+#define EDFSCHED 1
+#undef EDFSCHED
+
+/* if def: use bd_pscan resources for I/O tasks */
+#define PSCANSCHED 1
+#undef PSCANSCHED
Index: tags/rel_0_5/fsdemo/readme
===================================================================
--- tags/rel_0_5/fsdemo/readme (nonexistent)
+++ tags/rel_0_5/fsdemo/readme (revision 1657)
@@ -0,0 +1,21 @@
+S.Ha.R.K. FSDEMO
+
+This demo has been made as a thesis demo by Massimiliano Giorgi
+(massy@gandalf.sssup.it). The following is the translations of some itailan
+notes left my Massy. For any problems, please contact us
+shark-help@gandalf.sssup.it...
+
+bye
+
+Paolo
+
+----------------------------------------------------------------------------
+
+mplay is the demo I used during my thesis presentation.
+
+To use the demo you need a few mpeg files (those listed into mplay.c) into the directory /temp/m/ and some BMP photos into the directory /temp/b/
+
+Note that only BMP 24bpp images are supported. They MUST have a DIB header,
+with a line length mujltiple of 4 pixels!!!
+
+Massy
Index: tags/rel_0_5/fsdemo/gvideo.c
===================================================================
--- tags/rel_0_5/fsdemo/gvideo.c (nonexistent)
+++ tags/rel_0_5/fsdemo/gvideo.c (revision 1657)
@@ -0,0 +1,292 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: gvideo.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:44 $
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+
+#include "mpeg/video.h"
+#include "mpeg/util.h"
+#include "mpeg/dither.h"
+#include "mpeg/mpeg.h"
+
+#include "mutex.h"
+#include "gvideo.h"
+#include "gbuffer.h"
+#include "xread.h"
+
+#define STARTGROUP 513
+
+#define VIDEORATE 70
+#define READRATE 30
+
+/*
+ * colors
+ */
+
+#ifdef FULLCOLOR
+
+#define COLORFG rgb16(255,255,255)
+#define COLORBG rgb16(0,0,0)
+
+#define SP rgb16(0,128,0)
+#define FG rgb16(255,255,255)
+#define BG rgb16(0,0,0)
+
+#else
+
+/* for writing */
+#define COLORFG 255
+#define COLORBG 0
+
+/* for box */
+#define SP 128
+#define FG 255
+#define BG 0
+
+#endif
+
+/* border size (pixels) */
+#define BO 4
+
+/*
+ *
+ */
+
+#ifdef FULLCOLOR
+/* 16bits format 5:6:5 */
+/* 32bits format 8:8:8:0 */
+void down32to16(WORD *dst, BYTE *src, int size)
+{
+ int i;
+ return;
+ for (i=0;i<size;i+=4,dst++,src+=4)
+ /* blue green red */
+ *dst=((src[2]&0xf8)>>3)|((src[1]&0xfc)<<3)|((src[0]&0xf8)<<8);
+}
+#endif
+
+/*
+ *
+ */
+
+void draw_frame(int x, int y, int dx, int dy)
+{
+#ifndef NOGRX
+ grxlock();
+ grx_box(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,SP);
+ grx_rect(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,FG);
+ grx_box(x,y,x+dx-1,y+dy-1,BG);
+ grx_rect(x-1,y-1,x+dx,y+dy,FG);
+ grxunlock();
+#endif
+}
+
+struct info {
+ int x,y;
+ ImageDesc *img;
+};
+
+static TASK play(void *arg)
+{
+ struct info *ptr=(struct info*)arg;
+ int x1,y1,x2,y2;
+ BYTE *pixels; //,*image;
+ int moreframes;
+
+ pixels=(BYTE*)malloc(ptr->img->Size*sizeof(BYTE));
+#ifdef FULLCOLOR
+ image=(BYTE*)malloc(ptr->img->Size/2*sizeof(BYTE));
+#endif
+ x1=ptr->x;
+ y1=ptr->y;
+ x2=x1+ptr->img->Width-1;
+ y2=y1+ptr->img->Height-1;
+
+ moreframes=1;
+ for (;;) {
+ while (moreframes) {
+ moreframes=GetMPEGFrame(ptr->img,pixels);
+#ifndef NOGRX
+#ifdef FULLCOLOR
+ down32to16((WORD*)image,pixels,ptr->img->Size);
+ grxlock();
+ grx_putimage(x1, y1, x2, y2, pixels);
+ grxunlock();
+#else
+ grxlock();
+ grx_putimage(x1, y1, x2, y2, pixels);
+ grxunlock();
+#endif
+#else
+ cprintf("%c",'0');
+#endif
+ task_endcycle();
+ }
+ break;
+
+ //if (!loop) break;
+ //RewindMPEG (mpeg, img);
+ //SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
+ //moreframes = TRUE;
+ }
+
+ return NULL;
+}
+
+int gvideo_init(char *title, struct gvideoinfo *ptr)
+{
+ // static int groupcounter=0;
+ struct info *info;
+ SOFT_TASK_MODEL model;
+ FILE *fin;
+ PID pid,pid2;
+ ImageDesc *img;
+ int res;
+ int i;
+ int period,wcet;
+ int group;
+
+ img=(ImageDesc*)malloc(sizeof(ImageDesc));
+ if (img==NULL) return -3;
+ img->vid_stream=NULL;
+ img->Colormap=NULL;
+
+ info=(struct info*)malloc(sizeof(struct info));
+ if (info==NULL) return -11;
+ info->img=img;
+ info->x=ptr->x;
+ info->y=ptr->y;
+
+ fin=fopen(ptr->pathname, "r");
+ if (!fin) return -1;
+
+ //group=STARTGROUP+groupcounter++;
+ group=STARTGROUP;
+ pid2=x_initbuffer(group,fin,ptr->bitrate,ptr->band*READRATE);
+ if (pid2<0) return -2;
+
+#ifdef ACTIVATE
+ gbuffer_init(table[fileno(fin)],group,20+12,450);
+#else
+ gbuffer_init(NULL,group,20+12,450);
+#endif
+
+ res=OpenMPEG(fin,img);
+ if (!res) return -4;
+
+#ifdef FULLCOLOR
+ SetMPEGOption(img,MPEG_DITHER,HALF_COLOR_DITHER);
+#else
+ SetMPEGOption(img,MPEG_DITHER,GRAY_DITHER);
+#endif
+
+ //cprintf("colrmap size=%8i\n",img->ColormapSize);
+ //cprintf("picture rate=%8i\n",img->PictureRate);
+ //cprintf("bit rate =%8i\n",img->BitRate);
+
+#ifndef FULLCOLOR
+ if (group==STARTGROUP) {
+ ColormapEntry *cp;
+ cp=img->Colormap;
+ for (i=0;i<img->ColormapSize;i++) {
+#ifndef NOGRX
+ grxlock();
+ grx_setcolor (i,img->Colormap[i].red/4,
+ img->Colormap[i].green/4,
+ img->Colormap[i].blue/4);
+ grxunlock();
+#endif
+ }
+ }
+#endif
+
+ draw_frame(info->x,info->y,img->Width,img->Height);
+ ptr->w=img->Width;
+ ptr->h=img->Height;
+
+ {
+ char buffer[256];
+
+#ifndef NOGRX
+ grxlock();
+ grx_text(title,ptr->x,ptr->y-14,COLORFG,COLORBG);
+ grxunlock();
+ sprintf(buffer,"Average bit rate: %i.%03i Mb/s",
+ ptr->bitrate/1024/1024,(ptr->bitrate%(1024*1024))*1000/1024/1000);
+ grxlock();
+ grx_text(buffer,ptr->x,ptr->y+ptr->h+BO*2+2,COLORFG,COLORBG);
+ grxunlock();
+ sprintf(buffer,"Frame rate : %02.3f frame/sec",
+ (double)ptr->framerate/100.0);
+ grxlock();
+ grx_text(buffer,ptr->x,ptr->y+ptr->h+BO*2+2+9,COLORFG,COLORBG);
+ grxunlock();
+#endif
+ }
+
+ period=100000000/ptr->framerate;
+ wcet=period*ptr->band*VIDEORATE/10000;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,wcet);
+ soft_task_def_wcet(model,wcet);
+ soft_task_def_period(model,period);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)info);
+ soft_task_def_group(model,group);
+ soft_task_def_ctrl_jet(model);
+
+ pid=task_create("Video",play,&model,NULL);
+ if (pid==-1) return -6;
+
+ return group;
+}
Index: tags/rel_0_5/fsdemo/gbuffer.c
===================================================================
--- tags/rel_0_5/fsdemo/gbuffer.c (nonexistent)
+++ tags/rel_0_5/fsdemo/gbuffer.c (revision 1657)
@@ -0,0 +1,129 @@
+/*
+ *
+ *
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "mutex.h"
+#include "xread.h"
+
+#define PERIOD 250000
+#define WCET 1000
+
+#ifdef FULLCOLOR
+
+#define BARCOLOR rgb16(255,0,0)
+#define BARBG rgb16(0,0,0)
+
+#define TEXTCOLOR rgb16(255,255,255)
+#define TEXTBG rgb16(0,0,0)
+
+#else
+
+#define BARCOLOR 128
+#define BARBG 0
+
+#define TEXTCOLOR 255
+#define TEXTBG 0
+
+#endif
+
+//#define XC 700
+//#define YC 400
+#define LEN 100
+#define BORDER 8
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+struct taskinfo{
+ int XC,YC;
+ struct xbuffer *ptr;
+};
+
+static TASK monitorbuffer(void *arg)
+{
+ struct taskinfo *p=(struct taskinfo *)arg;
+ int XC,YC;
+ int oy,y;
+ struct xbuffer *ptr;
+ int sum,old;
+
+ ptr=p->ptr;
+ XC=p->XC;
+ YC=p->YC;
+
+ oy=YC+LEN-1;
+ for (;;) {
+ sum=freespace(ptr);
+#ifndef NOGRX
+ y=YC+LEN*sum/BUFFERMAXSIZE-1;
+ if (y!=oy) {
+ grxlock();
+ if (y<oy) grx_box(XC,y,XC+BORDER-1,oy,BARCOLOR);
+ else grx_box(XC,oy,XC+BORDER-1,y,BARBG);
+ grxunlock();
+ oy=y;
+ }
+#else
+ cprintf("@%i@",sum);
+#endif
+ old=sum;
+ task_endcycle();
+ }
+ return 0;
+}
+
+int gbuffer_init(struct xbuffer *ptr, int group, int XC, int YC)
+{
+ struct taskinfo *info;
+ SOFT_TASK_MODEL model;
+ PID pid;
+
+#ifdef ACTIVATE
+ info=(struct taskinfo *)malloc(sizeof(struct taskinfo));
+ if (info==NULL) sys_abort(912);
+ info->XC=XC;
+ info->YC=YC;
+ info->ptr=ptr;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,WCET);
+ soft_task_def_wcet(model,WCET);
+ soft_task_def_period(model,PERIOD);
+ soft_task_def_periodic(model);
+ soft_task_def_group(model,group);
+ soft_task_def_arg(model,(void*)info);
+ /*soft_task_def_group(model,group);*/
+
+ pid=task_create("bufferload",monitorbuffer,&model,NULL);
+ if (pid==-1) return -6;
+
+#else
+ pid=-1;
+#endif
+
+#ifndef NOGRX
+ draw_frame(XC,YC,BORDER,LEN);
+ grxlock();
+ grx_text("Buffer",XC-18,YC+LEN+BORDER*2,TEXTCOLOR,TEXTBG);
+ grx_text("100%",XC+BORDER*2+1,YC-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 75%",XC+BORDER*2+1,YC+LEN/4-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 50%",XC+BORDER*2+1,YC+LEN/4*2-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 25%",XC+BORDER*2+1,YC+LEN/4*3-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 0%",XC+BORDER*2+1,YC+LEN-4,TEXTCOLOR,TEXTBG);
+ grxunlock();
+#endif
+
+ return pid;
+}
+
Index: tags/rel_0_5/fsdemo/gvideo.h
===================================================================
--- tags/rel_0_5/fsdemo/gvideo.h (nonexistent)
+++ tags/rel_0_5/fsdemo/gvideo.h (revision 1657)
@@ -0,0 +1,22 @@
+/*
+ *
+ *
+ */
+
+#ifndef __GVIDEO_H
+#define __GVIDEO_H
+
+struct gvideoinfo {
+ int x,y;
+ int h,w; /* no fill */
+
+ char *pathname;
+
+ int bitrate; /* bytes/sec */
+ int framerate; /* frames/sec */
+ int band; /* CPU band in percent */
+};
+
+int gvideo_init(char *title, struct gvideoinfo *info);
+
+#endif
Index: tags/rel_0_5/fsdemo/mplay.c
===================================================================
--- tags/rel_0_5/fsdemo/mplay.c (nonexistent)
+++ tags/rel_0_5/fsdemo/mplay.c (revision 1657)
@@ -0,0 +1,393 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: mplay.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:44 $
+ */
+
+#include "config.h"
+
+//#include <ll/sys/types.h>
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+#include <drivers/glib.h>
+#include <drivers/gd.h>
+#include <drivers/keyb.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#include "gclock.h"
+#include "gvideo.h"
+#include "gload.h"
+#include "gbuffer.h"
+#include "gphoto.h"
+#include "mutex.h"
+#include "xread.h"
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+#ifndef NOGRX
+ grx_close();
+#endif
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
+
+/*
+ *
+ *
+ *
+ */
+
+int __register_sub_init_prologue(void)
+{
+ // int id;
+#ifndef NOTRACE
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ trc_trace_class(TRC_CLASS_USER);
+ trc_assign_class_to_queue(TRC_CLASS_USER,id);
+#endif
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+#if defined(EDFSCHED)
+ extern void BD_EDF_register_module(void);
+ BD_EDF_register_module();
+#elif defined(PSCANSCHED)
+ extern void BD_PSCAN_register_module(void);
+ BD_PSCAN_register_module();
+#endif
+ return 0;
+}
+
+dev_t root_device=-1;
+dev_t temp_device=-1;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,FALSE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ sys_shutdown_message("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+ */
+
+ return 0;
+}
+
+int __fs_sub_init(void)
+{
+ extern int libc_initialize(void);
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ // struct mount_opts opts;
+ // int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+ filesystem_init(&fs);
+
+ /*
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ } else
+ cprintf("mounted /TEMP rw\n");
+ }
+ */
+
+ libc_initialize();
+
+#ifndef NOTRACE
+ TRC_init_phase2();
+#endif
+
+ return 0;
+}
+
+/*
+ *
+ *
+ *
+ */
+
+struct {
+ char *filename;
+ int bitrate;
+ int framerate;
+} mpegs[16]={
+ /* 0 */
+ {"/temp/m/2jaeger.mpg", 573225, 3000}, /* 3.27 bad*/
+ {"/temp/m/alien.mpg", 289000, 2500}, /* 10.12 I */
+ {"/temp/m/b0.mpg", 1725251, 3000}, /* 3.33 IBBPBBPBBPBB */
+ {"/temp/m/canyon.mpg", 237194, 3000}, /* 58.60 IBBPBB */
+ /* 4 */
+ {"/temp/m/earth-ci.mpg", 974900, 2500}, /* 28.80 IBBPBB */
+ {"/temp/m/flower.mpg", 1147101, 2997}, /* 5.01 bad */
+ {"/temp/m/frisco.mpg", 397262, 3000}, /* 1.70 bad */
+ {"/temp/m/hulahoop.mpg", 684126, 3000}, /* 1.33 bad */
+ /* 8 */
+ {"/temp/m/iicm.mpg", 527308, 3000}, /* 26.70 bad */
+ {"/temp/m/micky.mpg", 711240, 3000}, /* 0.66 bad */
+ {"/temp/m/mobile.mpg", 114622, 2997}, /* 5.01 bad */
+ {"/temp/m/redsnigh.mpg", 597776, 2500}, /* 48.40 IBBBBBBBBBPBBBBBBBBB*/
+ /* 12 */
+ {"/temp/m/son.mpg", 1134335, 2500}, /* 6.92 IBBPBBPBBPBB */
+ {"/temp/m/stoelend.mpg", 2248942, 3000}, /* 0.53 IBBPBB */
+ {"/temp/m/sukhoi.mpg", 481521, 3000}, /* 25.47 I */
+ {"/temp/m/us.mpg", 681599, 3000} /* 24.37 IBBPBB */
+};
+
+#define DEFINDEX 3
+
+char *getfilename(int index)
+{
+ return mpegs[index%16].filename;
+}
+
+int getbitrate(int index)
+{
+ return mpegs[index%16].bitrate;
+}
+
+int getframerate(int index)
+{
+ return mpegs[index%16].framerate;
+}
+
+/*
+ *
+ *
+ *
+ */
+
+#ifdef FULLCOLOR
+
+#define TEXTCOLOR rgb16(0,255,0)
+#define TEXTCOLOR2 rgb16(255,255,255)
+#define TEXTBG rgb16(0,0,0)
+
+#else
+
+#define TEXTCOLOR 255
+#define TEXTCOLOR2 255
+#define TEXTBG 0
+
+#endif
+
+#define SCREENX 800
+#define SCREENY 600
+
+#define MAINSLEEP 20000
+
+g_sem_t grxsem;
+
+int main(int argc, char *argv[])
+{
+ struct gvideoinfo info;
+ KEY_EVT k;
+ int index;
+ int mode;
+ int esc;
+ int pid,grp;
+ // int i;
+ int sx=20;
+ PID ph1,ph2,ph3;
+
+ g_sem_init(&grxsem,1);
+
+ /*
+ if (argc<2) {
+ cprintf("Usage: %s mpegfileordinal\n",argv[0]);
+ sys_abort(301);
+ }
+ */
+
+ /* init the "file reader tasks" module */
+ x_init();
+
+ /* Init the graph... */
+#ifndef NOGRX
+ if (grx_init()==-1) {
+ cprintf("No init!!!\n");
+ sys_abort(255);
+ }
+#ifdef FULLCOLOR
+ mode=grx_getmode(SCREENX,SCREENY,16);
+#else
+ mode=grx_getmode(SCREENX,SCREENY,8);
+#endif
+ if (mode==-1) {
+ cprintf("Mode not present!!!\n");
+ sys_abort(255);
+ }
+#endif
+
+ cprintf("[hit enter to continue]\n");
+ esc=FALSE;
+ while (!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii==13) esc=TRUE;
+ }
+
+#ifndef NOGRX
+ if (grx_setmode(mode) == -1) {
+ cprintf("No SetMode!!!\n");
+ sys_abort(255);
+ }
+#endif
+
+#ifndef NOGRX
+ grx_text("HARTIK 4.0 (Lego)",12*2,22,TEXTCOLOR,TEXTBG);
+ grx_text("[Filesystem demo]",12*2,22+10,TEXTCOLOR,TEXTBG);
+
+ grx_text("Video : 8bit/pixel",250,450,TEXTCOLOR2,TEXTBG);
+ grx_text("Double buffer: YES",250,450+10,TEXTCOLOR2,TEXTBG);
+ grx_text("Algorithm : FCFS",250,450+20,TEXTCOLOR2,TEXTBG);
+#endif
+
+ pid=gclock_init(32+64+64,540);
+ task_activate(pid);
+
+ //for (i=0;i<argc-1;i++) {
+
+ //index=atoi(argv[i+1]);
+ index=4;
+
+ info.x=sx+30;
+ info.y=80;
+ info.pathname=getfilename(index);
+ info.bitrate=getbitrate(index);
+ info.framerate=getframerate(index);
+ info.band=25;
+
+ grp=gvideo_init("Video: earth.mpg", &info);
+ //if (grp>0) group_activate(grp);
+
+ sx+=info.w+15;
+ //}
+
+ pid=gload_init(1);
+ task_activate(pid);
+
+ ph1=gphoto_show("Photo: galaxy","/temp/b/ph2a.bmp",500,25);
+ ph2=gphoto_show("Photo: canyon","/temp/b/ph3a.bmp",500,225);
+ ph3=gphoto_show("Photo: nicole","/temp/b/ph7a.bmp",500,425);
+
+ if (grp>0) group_activate(grp);
+
+ esc=0;
+
+ {
+ struct timespec delay;
+
+ delay.tv_sec = MAINSLEEP/1000000;
+ delay.tv_nsec = (MAINSLEEP%1000000)*1000;
+
+ while (!esc) {
+ if (keyb_getcode(&k,NON_BLOCK)) {
+ if(k.ascii==13) esc=1;
+ else if (k.ascii=='a') task_activate(ph1);
+ else if (k.ascii=='s') task_activate(ph2);
+ else if (k.ascii=='d') task_activate(ph3);
+ }
+ nanosleep(&delay, NULL);
+ }
+ }
+
+#ifndef NOGRX
+ grx_close();
+#endif
+
+ sys_end();
+ return 0;
+}
Index: tags/rel_0_5/fsdemo/gbuffer.h
===================================================================
--- tags/rel_0_5/fsdemo/gbuffer.h (nonexistent)
+++ tags/rel_0_5/fsdemo/gbuffer.h (revision 1657)
@@ -0,0 +1,9 @@
+
+#ifndef __GBUFFER_H
+#define __GBUFFER_H
+
+#include "xread.h"
+
+int gbuffer_init(struct xbuffer *ptr, int group, int XC, int YC);
+
+#endif
Index: tags/rel_0_5/fsdemo/gload.c
===================================================================
--- tags/rel_0_5/fsdemo/gload.c (nonexistent)
+++ tags/rel_0_5/fsdemo/gload.c (revision 1657)
@@ -0,0 +1,113 @@
+/*
+ *
+ *
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "mutex.h"
+#include "gload.h"
+
+#define PERIOD 250000
+#define WCET 1000
+
+#ifdef FULLCOLOR
+
+#define BARCOLOR rgb16(255,0,0)
+#define BARBG rgb16(0,0,0)
+
+#define TEXTCOLOR rgb16(255,255,255)
+#define TEXTBG rgb16(0,0,0)
+
+#else
+
+#define BARCOLOR 128
+#define BARBG 0
+
+#define TEXTCOLOR 255
+#define TEXTBG 0
+
+#endif
+
+#define XC (32+64)
+#define YC 450
+#define LEN 100
+#define BOR 8
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+/* only for NRT task */
+static TASK monitorload(void *arg)
+{
+ int oy,y;
+ PID pid=(PID)arg;
+ TIME sum,old;
+ int res;
+
+ res=jet_getstat(pid,NULL,NULL,NULL,&old);
+ task_endcycle();
+
+ oy=YC+LEN-1;
+ for (;;) {
+ res=jet_getstat(pid,NULL,NULL,NULL,&sum);
+ if (res==-1) break;
+#ifndef NOGRX
+ y=YC+LEN*(sum-old)/PERIOD-1;
+ if (y!=oy) {
+ grxlock();
+ if (y<oy) grx_box(XC,y,XC+BOR-1,oy,BARCOLOR);
+ else grx_box(XC,oy,XC+BOR-1,y,BARBG);
+ grxunlock();
+ oy=y;
+ }
+#else
+ n++;
+ if (n%4==0)
+ cprintf("#%li,%i#",sum); //(1000-sum*1000/PERIOD);
+#endif
+ old=sum;
+ task_endcycle();
+ }
+ return 0;
+}
+
+int gload_init(int taskpid)
+{
+ SOFT_TASK_MODEL model;
+ PID pid;
+
+ soft_task_default_model(model);
+ soft_task_def_met(model,WCET);
+ soft_task_def_wcet(model,WCET);
+ soft_task_def_period(model,PERIOD);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)taskpid);
+ /*soft_task_def_group(model,group);*/
+
+ pid=task_create("load",monitorload,&model,NULL);
+ if (pid==-1) return -6;
+
+#ifndef NOGRX
+ draw_frame(XC,YC,BOR,LEN);
+ grxlock();
+ grx_text("Load",XC-10,YC+LEN+BOR*2,TEXTCOLOR,TEXTBG);
+ grx_text("100%",XC+BOR*2+1,YC-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 75%",XC+BOR*2+1,YC+LEN/4-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 50%",XC+BOR*2+1,YC+LEN/4*2-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 25%",XC+BOR*2+1,YC+LEN/4*3-4,TEXTCOLOR,TEXTBG);
+ grx_text(" 0%",XC+BOR*2+1,YC+LEN-4,TEXTCOLOR,TEXTBG);
+ grxunlock();
+#endif
+
+ return pid;
+}
+
Index: tags/rel_0_5/fsdemo/gphoto.ok
===================================================================
--- tags/rel_0_5/fsdemo/gphoto.ok (nonexistent)
+++ tags/rel_0_5/fsdemo/gphoto.ok (revision 1657)
@@ -0,0 +1,222 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Luca Abeni <luca@hartik.sssup.it>
+ * Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: gphoto.ok,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:44 $
+ */
+
+#include "config.h"
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+#include <kernel/const.h>
+
+#include <drivers/glib.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include "mutex.h"
+#include "gphoto.h"
+
+#ifdef FULLCOLOR
+
+/* 16bits format 5:6:5 */
+/* 24bits format 8:8:8 */
+static void down24to16(WORD *dst, BYTE *src, int dx, int dy)
+{
+ int x,y;
+ /* row must be multiple of 4!!! (there are 3 bytes per pixel!)*/
+ dst+=dx*(dy+1);
+ for (y=0;y<dy;y++) {
+ dst-=dx*2;
+ for (x=0;x<dx;x++,src+=3,dst++)
+ /* blue green red */
+ *dst=((src[0]&0xf8)>>3)|((src[1]&0xfc)<<3)|((src[2]&0xf8)<<8);
+ }
+}
+
+#define downscaleimage(x,y,z,k) down24to16((WORD*)x,y,z,k)
+
+#else
+
+static void down24to8(BYTE *dst, BYTE *src, int dx, int dy)
+{
+ int x,y;
+
+ dst+=dx*(dy+1);
+ for (y=0;y<dy;y++) {
+ dst-=dx*2;
+ for (x=0;x<dx;x++,src+=3,dst++)
+ *dst=(((int)src[0])*11+((int)src[1])*59+((int)src[2])*30)/100;
+ }
+}
+
+#define downscaleimage(x,y,z,k) down24to8(x,y,z,k)
+
+#endif
+
+/*
+ *
+ */
+
+extern void draw_frame(int x, int y, int dx, int dy);
+
+int gphoto_show(char *pathname, int x, int y)
+{
+ struct BITMAPFILEHEADER *bf;
+ struct BITMAPINFOHEADER *bi;
+ BYTE *src,*dst;
+ long l;
+ int h,n;
+ int dx,dy;
+
+ bf=(struct BITMAPFILEHEADER *)malloc(sizeof(struct BITMAPFILEHEADER));
+ bi=(struct BITMAPINFOHEADER *)malloc(sizeof(struct BITMAPINFOHEADER));
+
+ if (bf==NULL||bi==NULL) return -1;
+
+ h=open(pathname,O_RDONLY);
+ if (h==-1) {
+ free(bf);
+ free(bi);
+ return -2;
+ }
+
+ n=read(h,bf,sizeof(struct BITMAPFILEHEADER));
+ if (n!=sizeof(struct BITMAPFILEHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ n=read(h,bi,sizeof(struct BITMAPINFOHEADER));
+ if (n!=sizeof(struct BITMAPINFOHEADER)) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -4;
+ }
+
+ //grx_close();
+
+ /*
+ cprintf("type: %c %c\n",bf->bfType&0xff,bf->bfType>>8);
+ cprintf("size: %li\n",bf->bfSize);
+ cprintf("tell: %li\n\n",bf->bfOffBits);
+
+ cprintf("bitcoutn: %i\n",bi->biBitCount);
+ cprintf("compress: %li\n",bi->biCompression);
+ cprintf("dx: %li\n",bi->biWidth);
+ cprintf("dy: %li\n",bi->biHeight);
+ */
+
+ //sys_end();
+ //return 0;
+
+ if (bf->bfType!='B'+256*'M'||
+ bi->biBitCount!=24||
+ bi->biCompression!=0||
+ bi->biWidth%4!=0) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -5;
+ }
+
+ dx=bi->biWidth;
+ dy=bi->biHeight;
+
+ src=(BYTE*)malloc(dx*dy*3);
+ if (src==NULL) {
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ dst=(BYTE*)malloc(dx*dy*2);
+ if (dst==NULL) {
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -6;
+ }
+
+ l=lseek(h,bf->bfOffBits,SEEK_SET);
+ if (l!=bf->bfOffBits) {
+ free(dst);
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -7;
+ }
+
+ n=read(h,src,dx*dy*3);
+ if (n!=dx*dy*3) {
+ free(dst);
+ free(src);
+ close(h);
+ free(bf);
+ free(bi);
+ return -8;
+ }
+
+ downscaleimage(dst,src,dx,dy);
+
+#ifndef NOGRX
+ draw_frame(x,y,dx,dy);
+ grxlock();
+ grx_putimage(x, y, x+dx-1, y+dy-1, dst);
+ grxunlock();
+#endif
+
+ free(dst);
+ free(src);
+ close(h);
+ free(bi);
+ free(bf);
+
+ return 0;
+}
Index: tags/rel_0_5/fsdemo/oldmakefile
===================================================================
--- tags/rel_0_5/fsdemo/oldmakefile (nonexistent)
+++ tags/rel_0_5/fsdemo/oldmakefile (revision 1657)
@@ -0,0 +1,41 @@
+#
+#
+#
+# TO REMAKE BETTER
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+.PHONY: test all install depend clean cleanall
+
+C_INC+= -I$(BASE)/ports
+LINK_LIB+= -lmpeg
+LINK_DEP+= $(LIB_PATH)/libmpeg.a
+
+#test:: tserv tserv2
+test:: mplay
+
+clean::
+ rm -f *.o
+ rm -f mplay
+
+OBJS= mplay.o xread.o gclock.o gvideo.o gload.o gbuffer.o gphoto.o
+
+mplay: $(OBJS) $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) \
+ $(OBJS) \
+ $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mplay
+
+depend::
+ $(CC) $(C_OPT) -M $(OBJS:.o=.c) > deps
+
+deps:
+ $(CC) $(C_OPT) -M $(OBJS:.o=.c) > deps
+
+include deps
Index: tags/rel_0_5/fsdemo/gload.h
===================================================================
--- tags/rel_0_5/fsdemo/gload.h (nonexistent)
+++ tags/rel_0_5/fsdemo/gload.h (revision 1657)
@@ -0,0 +1,7 @@
+
+#ifndef __GLOAD_H
+#define __GLOAD_H
+
+int gload_init(int pid);
+
+#endif
Index: tags/rel_0_5/fsdemo/makefile
===================================================================
--- tags/rel_0_5/fsdemo/makefile (nonexistent)
+++ tags/rel_0_5/fsdemo/makefile (revision 1657)
@@ -0,0 +1,16 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= mplay
+
+include $(BASE)/config/example.mk
+
+mplay:
+ make -f $(SUBMAKE) APP=mplay INIT= OTHEROBJS="xread.o gclock.o gvideo.o gload.o gbuffer.o gphoto.o initfile.o" OTHERINCL="-I$(BASE)/ports" SHARKOPT="__OLDCHAR__ __GRX__"
+
Index: tags/rel_0_5/makefile
===================================================================
--- tags/rel_0_5/makefile (nonexistent)
+++ tags/rel_0_5/makefile (revision 1657)
@@ -0,0 +1,24 @@
+include ../shark.cfg
+
+
+dirs := $(filter-out CVS cvs makefile, $(wildcard *))
+p_all := $(addprefix prefixall_, $(dirs))
+p_install := $(addprefix prefixinstall_, $(dirs))
+p_clean := $(addprefix prefixclean_, $(dirs))
+pcleanall := $(addprefix prefixcleanall_, $(dirs))
+pdepend := $(addprefix prefixdepend_, $(dirs))
+
+
+.PHONY: all clean
+
+
+
+all: $(p_all)
+
+clean: $(p_clean)
+
+prefixall_%:
+ make -C $*
+
+prefixclean_%:
+ make -C $* clean
Index: tags/rel_0_5/oldexamples/stdio/test0.c
===================================================================
--- tags/rel_0_5/oldexamples/stdio/test0.c (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/test0.c (revision 1657)
@@ -0,0 +1,72 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ int res;
+ int c;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ fin=NULL;
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA1.TXT","r");
+ cprintf("opened!\n");
+
+ cprintf("res=%p\n",fin);
+
+ if (fin!=NULL) {
+
+ while (!feof(fin)) {
+
+ memset(buffer,'@',sizeof(buffer));
+
+ cprintf("reading...\n");
+ res=fread(buffer,1,sizeof(buffer)-1,fin);
+ cprintf("read!\n");
+
+ cprintf("res=%i\n",res);
+ buffer[res<sizeof(buffer)-1?res:sizeof(buffer)-1]='\0';
+ cprintf("'%s'\n",buffer);
+
+ }
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getch(BLOCK)) != 'x') ;
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/stdio/test1.c
===================================================================
--- tags/rel_0_5/oldexamples/stdio/test1.c (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/test1.c (revision 1657)
@@ -0,0 +1,67 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ char *s;
+ // int res;
+ int c;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA2.TXT","r");
+ cprintf("opened!\n");
+
+ if (fin!=NULL) {
+
+ while (!feof(fin)) {
+ cprintf("getting line...\n");
+ s=fgets(buffer,sizeof(buffer),fin);
+ cprintf("got!\n");
+ if (s==NULL) {
+ if (ferror(fin))
+ cprintf("error while using fgets()!\n");
+ break;
+ }
+ cprintf("'%s'\n",buffer);
+ }
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getchar()) != 'x') ;
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/stdio/test2.c
===================================================================
--- tags/rel_0_5/oldexamples/stdio/test2.c (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/test2.c (revision 1657)
@@ -0,0 +1,91 @@
+/*
+ *
+ *
+ *
+ */
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ char *s;
+ int res;
+ int c,n;
+ char ch;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA2.TXT","r");
+ cprintf("opened!\n");
+
+ if (fin!=NULL) {
+
+ n=-1;
+ cprintf("fscanf()ing...\n");
+ res=fscanf(fin,"number %i",&n);
+ cprintf("fscanf()ed...\n");
+ if (res!=1) {
+ cprintf("error on 1st fscanf() res=%i\n",res);
+ return 0;
+ }
+ cprintf("scanned number %i (exact 103)\n",n);
+
+ s=fgets(buffer,sizeof(buffer),fin);
+ if (s==NULL) {
+ cprintf("error on 1st fgets()\n");
+ return 0;
+ }
+ s=fgets(buffer,sizeof(buffer),fin);
+ if (s==NULL) {
+ cprintf("error on 2nd fgets()\n");
+ return 0;
+ }
+ s=fgets(buffer,sizeof(buffer),fin);
+ if (s==NULL) {
+ cprintf("error on 3rd fgets()\n");
+ return 0;
+ }
+
+ cprintf("fscanf()ing...\n");
+ res=fscanf(fin,"line %i error letter '%c'",&n,&ch);
+ cprintf("fscanf()ed...\n");
+ if (res!=2) {
+ cprintf("error on 2nd fscanf() res=%i\n",res);
+ return 0;
+ }
+ cprintf("scanned number %i (exact 205) characer '%c' (exact 'c')\n",n,ch);
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getchar()) != 'x') ;
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/stdio/test3.c
===================================================================
--- tags/rel_0_5/oldexamples/stdio/test3.c (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/test3.c (revision 1657)
@@ -0,0 +1,55 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ char *s;
+ // int res;
+ int c;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ sys_end();
+ return -1;
+ }
+ */
+
+ /*
+ *
+ */
+
+ printf("try using printf() to write on console!\n");
+ printf("second line of the test\n");
+ fprintf(stdout,"using fprintf() to write on stdout\n");
+ fprintf(stderr,"try using fprintf() to write on stderr!\n");
+ fprintf(stderr,"all this %i message are using ?printf() functions\n",4);
+
+ printf("now try to write a phrase and press [Enter] to finish\n");
+ s=fgets(buffer,sizeof(buffer),stdin);
+ if (s!=NULL) printf("you have typed: '%s'\n",s);
+
+ cprintf("[press 'x' to exit]\n");
+
+ while ((c = keyb_getchar()) != 'x') ;
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/stdio/test4.c
===================================================================
--- tags/rel_0_5/oldexamples/stdio/test4.c (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/test4.c (revision 1657)
@@ -0,0 +1,60 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <drivers/keyb.h>
+
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc,char *argv[])
+{
+ char buffer[256];
+ FILE *fin;
+ int res;
+ int c;
+ int flag=1;
+
+ /* prova di rewind() */
+
+ cprintf("opening...\n");
+ fin=fopen("/TEMP/ALFA1.TXT","r");
+ cprintf("opened!\n");
+
+ cprintf("res=%p\n",fin);
+
+ if (fin!=NULL) {
+
+ REDO:
+
+ while (!feof(fin)) {
+ cprintf("reading...\n");
+ res=fread(buffer,1,sizeof(buffer)-2,fin);
+ cprintf("read!\n");
+
+ cprintf("res=%i\n",res);
+ buffer[res<sizeof(buffer)-1?res:sizeof(buffer)-1]='\0';
+ cprintf("'%s'\n",buffer);
+ }
+
+ if (flag) {
+ flag=0;
+ cprintf("rewinding...\n");
+ rewind(fin);
+ cprintf("rewinded!\n");
+ goto REDO;
+ }
+
+ cprintf("closing...\n");
+ fclose(fin);
+ cprintf("closed!\n");
+ }
+
+ cprintf("[press 'x' to exit]\n");
+ while ((c = keyb_getch(BLOCK)) != 'x') ;
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/stdio/common.c
===================================================================
--- tags/rel_0_5/oldexamples/stdio/common.c (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/common.c (revision 1657)
@@ -0,0 +1,117 @@
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* -- */
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+/* -- */
+
+__dev_t root_device;
+__dev_t temp_device;
+
+int choose_root_callback(__dev_t dev,__uint8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+/* -- */
+
+//extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+
+ return 0;
+}
+
+/* -- */
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ }
+ }
+
+ return 0;
+}
+
+/* -- */
+
+
+/* -- */
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ //dump_sem_table();
+ //dump_nop_table();
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
Index: tags/rel_0_5/oldexamples/stdio/makefile
===================================================================
--- tags/rel_0_5/oldexamples/stdio/makefile (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/makefile (revision 1657)
@@ -0,0 +1,28 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS=test0 test1 test2 test3 test4
+OBJS=common.o
+
+include $(BASE)/config/example.mk
+
+test0:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=test0 INIT=initfs.o OTHEROBJS=common.o
+
+test1:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=test1 INIT=initfs.o OTHEROBJS=common.o
+
+test2:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=test2 INIT=initfs.o OTHEROBJS=common.o
+
+test3:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=test3 INIT=initfs.o OTHEROBJS=common.o
+
+test4:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=test4 INIT=initfs.o OTHEROBJS=common.o
Index: tags/rel_0_5/oldexamples/stdio/initfs.c
===================================================================
--- tags/rel_0_5/oldexamples/stdio/initfs.c (nonexistent)
+++ tags/rel_0_5/oldexamples/stdio/initfs.c (revision 1657)
@@ -0,0 +1,119 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: initfs.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:39 $
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/cbs.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+#include "modules/nopm.h"
+
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ extern int __register_sub_init_prologue(void);
+ extern int __register_sub_init(void);
+
+ __register_sub_init_prologue();
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ PC_register_module();
+ NPP_register_module();
+ SRP_register_module();
+ NOP_register_module();
+ NOPM_register_module();
+
+ __register_sub_init();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ KEYB_PARMS keyb = BASE_KEYB;
+ extern int __bdev_sub_init(void);
+ extern int __fs_sub_init(void);
+ extern void ctrlc_exit(KEY_EVT *k);
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(keyb, ctrlc_exit);
+ KEYB_init(&keyb);
+
+ __bdev_sub_init();
+ __fs_sub_init();
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/oldexamples/fs/test0.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/test0.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/test0.c (revision 1657)
@@ -0,0 +1,63 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/ALFA1.TXT"
+
+int main(int argc,char *argv[])
+{
+ int c;
+ int h;
+ // int res;
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_RDONLY);
+ if (h>=0) {
+ char buffer[128];
+ int len;
+ cprintf("OPENED!\n");
+
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+
+ //close(h);
+
+ } else
+ cprintf("FAILED!\n");
+
+ cprintf("Press [x] to exit\n");
+
+ while ((c = keyb_getchar()) != 'x') ;
+
+ //bdev_dump_status();
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/tree1.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/tree1.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/tree1.c (revision 1657)
@@ -0,0 +1,154 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#include "common.h"
+
+#define FROMDIR "/TEMP"
+
+char pathname[8192];
+
+int noscroll=1;
+
+static int counter=0;
+
+void viewdir(int prof)
+{
+ struct dirent *den;
+ struct stat st;
+ char *str;
+ DIR *d;
+ int res;
+ int x;
+ //int i;
+ //static int flag=0;
+
+ str=pathname+(x=strlen(pathname));
+ d=opendir(pathname);
+
+ if (d==NULL) {
+ cprintf("ERR: can't open dir %s (errno: %i)\n",pathname,errno);
+ return;
+ }
+
+ while ((den=readdir(d))!=NULL) {
+
+ {
+ //int c='p';
+ //c = keyb_getchar();
+ //if (c=='z') inode_stats();
+ }
+
+ if (x==1&&*pathname=='/')
+ strcat(pathname,den->d_name);
+ else
+ strcat(strcat(pathname,"/"),den->d_name);
+
+ /*
+ if (!strcmp(den->d_name,"eport.ror")) {
+ if (flag==0) debug_info_show(1);
+ flag++;
+ // inode_stats();
+ }
+ */
+
+ if (counter==22100) noscroll=0;
+
+ if (noscroll) {
+ place(0,10);
+ cprintf(" ");
+ place(0,10);
+ }
+ cprintf("%05i %s\n",++counter,pathname);
+ //dcache_stats();
+
+ if (!strcmp(den->d_name,".")) goto SKIP;
+ if (!strcmp(den->d_name,"..")) goto SKIP;
+
+ //goto SKIP;
+
+ /*
+ if (!strcmp("MSINH.C",den->d_name)) {
+ //if (!strcmp("WDIN32.OBJ",den->d_name)) {
+ cprintf(">>>START SHOWING DEBUG INFO<<<\n");
+ noscroll=0;
+ //inode_stats();
+ debug_info_show(1);
+ }
+ */
+
+ res=stat(pathname,&st);
+ if (res!=0) {
+ cprintf("can't stat %s\n",pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sys_end();
+ l1_exit(0);
+ } else {
+ if (S_ISDIR(st.st_mode)) {
+ viewdir(prof+1);
+ }
+
+ }
+
+ SKIP:
+ *str='\0';
+ }
+
+ closedir(d);
+}
+
+int main(int argc,char *argv[])
+{
+ // int res;
+
+ //if (noscroll) clear();
+
+ //strcpy(pathname,"/");
+ //viewdir(0);
+
+ showmessage("Try to show all filenames from a directory recursively\n"
+ "using one NRT task.\n");
+
+ noscroll=0;
+ strcpy(pathname,FROMDIR);
+ viewdir(0);
+
+ //dump_dentry_tree();
+
+ /*
+ *
+ */
+
+ /*
+ res=umount(temp_device);
+ //dump_dentry_tree();
+ if (res!=0) {
+ cprintf("can't unmount XXX on /TEMP\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ //sys_end();
+ return -1;
+ }
+ */
+
+ //bdev_dump_status();
+
+ sys_end();
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/test1.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/test1.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/test1.c (revision 1657)
@@ -0,0 +1,74 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+//#define FILENAME "/temp/ALFA1.TXT"
+
+#define FILENAME "/pippo.c"
+
+int leggi(int h)
+{
+ char buffer[124];
+ int len;
+
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer)-1);
+ cprintf("READ %i bytes\n",len);
+ cprintf("buffer='%s'\n",buffer);
+
+ return len;
+}
+
+int main(int argc,char *argv[])
+{
+ int h;
+
+ showmessage("Try lseek() using a file for reading.");
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_RDONLY);
+
+ if (h>=0) {
+ cprintf("OPENED!\n");
+
+ leggi(h);
+ leggi(h);
+ leggi(h);
+
+ cprintf("SEEK to 16\n");
+ lseek(h,16,SEEK_SET);
+
+ leggi(h);
+
+ cprintf("SEEK to %i\n",123*3+1);
+ lseek(h,123*3+1,SEEK_SET);
+
+ leggi(h);
+
+ } else
+ cprintf("FAILED!\n");
+
+ waitend();
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/tree2.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/tree2.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/tree2.c (revision 1657)
@@ -0,0 +1,275 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+#include <kernel/model.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+#include "common.h"
+
+#define NOSHOW
+#undef NOSHOW
+
+#define sem_signal sem_post
+
+int noscroll=0;
+sem_t console;
+
+#define MPROC ((50<(MAX_PROC-10))?50:MAX_PROC-10)
+//#define MWCET 1000l
+//#define MPERIOD (MWCET*(MPROC+10))
+
+TASK viewdir(void *prof);
+sem_t actmutex,actsync;
+char *globpathname;
+PID globpid;
+int counter=0,actcounter=0;
+
+void activate_task(int prof, char *pathname)
+{
+ char tname[32];
+ NRT_TASK_MODEL m;
+ PID pid;
+
+REPEAT:
+ sem_wait(&actmutex);
+
+ if (actcounter>=MPROC) {
+ sem_signal(&actmutex);
+ task_delay(10000);
+ goto REPEAT;
+ }
+
+ globpathname=pathname;
+ counter++;
+ sprintf(tname,"tsk%i",counter);
+
+ /*
+ printd("Û");
+ sem_wait(&console);
+ printd("Ü");
+ cprintf("%03i has called for ##%s##\n",prof,pathname);
+ sem_signal(&console);
+ */
+
+ nrt_task_default_model(m);
+ //soft_task_def_met(m,MWCET);
+ //soft_task_def_wcet(m,MWCET);
+ //soft_task_def_periodic(m);
+ nrt_task_def_arg(m,(void*)counter);
+ //soft_task_def_period(m,MPERIOD);
+
+ globpid=pid=task_create(tname,viewdir,&m,NULL);
+ if (pid==-1) {
+ sem_wait(&console);
+ cprintf("can't create '%s'\n",tname);
+ perror("can't create task");
+ sem_signal(&console);
+ sys_end();
+ return;
+ }
+ task_activate(pid);
+ sem_wait(&actsync);
+ actcounter++;
+
+ /*
+ printd("Û");
+ sem_wait(&console);
+ printd("Ü");
+ if (noscroll) place(0,9);
+ cprintf("task running: %5i/%5i --- task started: %5i\n",
+ actcounter,MAX_PROC,counter);
+ sem_signal(&console);
+ */
+
+ sem_signal(&actmutex);
+}
+
+/*
+ *
+ */
+
+int filecounter=0;
+
+TASK viewdir(void *pointer)
+{
+ struct dirent *den;
+ struct stat st;
+ char *str;
+ DIR *d;
+ int res;
+ int x;
+ char pathname[1024];
+ PID mypid;
+ int prof=(int)pointer;
+
+ strcpy(pathname,globpathname);
+ mypid=globpid;
+ sem_signal(&actsync);
+
+ //sem_wait(&console);
+ //cprintf("%03i on <%s>\n",prof,pathname);
+ //sem_signal(&console);
+
+ str=pathname+(x=strlen(pathname));
+ d=opendir(pathname);
+
+ if (d==NULL) {
+ sem_wait(&console);
+ cprintf("%03i ERR: can't open dir %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ goto END;
+ }
+
+ while ((den=readdir(d))!=NULL) {
+
+ if (x==1&&*pathname=='/')
+ strcat(pathname,den->d_name);
+ else
+ strcat(strcat(pathname,"/"),den->d_name);
+
+ sem_wait(&console);
+#ifndef NOSHOW
+ if (noscroll) {
+ place(0,10);
+ cprintf(" ");
+ place(0,10);
+ }
+ //cprintf("%03i(0_%03i) %s\n",prof,(int)mypid,pathname);
+ cprintf("t%03i %s\n",prof,pathname);
+#endif
+ filecounter++;
+ sem_signal(&console);
+
+ //if (*den->d_name=='.') {
+ // sem_wait(console,BLOCK);
+ // cprintf("%03i HAS FOUND <%s>\n",prof,den->d_name);
+ // sem_signal(console);
+ //}
+
+ if (!strcmp(den->d_name,".")) {
+ //sem_wait(console,BLOCK);
+ //cprintf("%03i skip for .\n",prof);
+ //sem_signal(console);
+ goto SKIP;
+ }
+ if (!strcmp(den->d_name,"..")) {
+ //sem_wait(console,BLOCK);
+ //cprintf("%03i skip for ..\n",prof);
+ //sem_signal(console);
+ goto SKIP;
+ }
+
+ res=stat(pathname,&st);
+ if (res!=0) {
+ sem_wait(&console);
+ cprintf("t%03i can't stat %s\n",prof,pathname);
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ sem_signal(&console);
+
+ sys_end();
+ l1_exit(0);
+
+ closedir(d);
+ goto END;
+ } else {
+ if (S_ISDIR(st.st_mode)) {
+ sem_wait(&console);
+ //if (den->d_name[0]=='.')
+ // cprintf("%03i called for <%s>\n",prof,den->d_name);
+ sem_signal(&console);
+ activate_task(prof,pathname);
+ }
+
+ }
+
+ SKIP:
+ *str='\0';
+ }
+
+ closedir(d);
+
+END:
+ sem_wait(&actmutex);
+ actcounter--;
+ sem_signal(&actmutex);
+
+ return 0;
+}
+
+int main(int argc,char *argv[])
+{
+ extern void dump_sem_table(void);
+ TIME stime,etime;
+ // int res;
+
+ /*
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+ */
+
+ /* mounting 2nd msdos partition on /TEMP */
+ /*
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ return -1;
+ }
+ */
+
+ /* clear screen */
+ //clear();
+
+ showmessage("This test show all filenames of a directory of an hardisk\n"
+ "recursively using a soft task for every directory.\n");
+
+ stime=sys_gettime(NULL);
+
+ sem_init(&console,0,1);
+ sem_init(&actmutex,0,1);
+ sem_init(&actsync,0,0);
+
+ //dump_sem_table();
+
+ //keyb_getchar();
+
+ activate_task(-1,"/TEMP");
+
+ for(;;) {
+ sem_wait(&actmutex);
+ if (actcounter==0) break;
+ sem_signal(&actmutex);
+ }
+
+ etime=sys_gettime(NULL);
+
+ cprintf("\nfiles: %i\n",filecounter);
+ cprintf("time : %li\n",etime-stime);
+
+ waitend();
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/test2.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/test2.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/test2.c (revision 1657)
@@ -0,0 +1,57 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <string.h>
+#include "common.c"
+
+int main(int argc,char *argv[])
+{
+ int res;
+ int c;
+ int h;
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ return -1;
+ }
+
+ /* mounting 2nd msdos partition on /TEMP */
+ res=mount(temp_device,FS_MSDOS,"/TEMP",NULL);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ //sys_end();
+ return -1;
+ }
+
+ /*
+ *
+ */
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_RDONLY);
+ if (h>=0) {
+ char buffer[128];
+ int len;
+ cprintf("OPENED!\n");
+ cprintf("READING...\n");
+ len=read(h,buffer,sizeof(buffer));
+ cprintf("READ %i bytes\n",len);
+ memset(buffer,'\0',sizeof(buffer));
+ cprintf("buffer='%s'\n",buffer);
+ } else
+ cprintf("FAILED!\n");
+
+ cprintf("Press [x] to exit\n");
+
+ while ((c = keyb_getchar()) != 'x');
+
+ bdev_dump_status();
+
+ sys_end();
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/hello.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/hello.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/hello.c (revision 1657)
@@ -0,0 +1,13 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+
+int main(int argc,char *argv[])
+{
+ cprintf("\nHello, world!\n\n");
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/testu.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/testu.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/testu.c (revision 1657)
@@ -0,0 +1,47 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/TESTW1.TXT"
+
+//#define FILENAME "/TEMP/CIR2"
+
+extern dev_t temp_device;
+
+int main(int argc,char *argv[])
+{
+ int res;
+
+ showmessage("Try to unlink (ie. delete) a file.\n");
+
+ cprintf("UNLINKING %s\n",FILENAME);
+ res=unlink(FILENAME);
+ if (res!=0) {
+ cprintf("FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ } else cprintf("OK!\n");
+
+ waitend();
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/testw0.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/testw0.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/testw0.c (revision 1657)
@@ -0,0 +1,54 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <ll/i386/cons.h>
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/TESTW0.TXT"
+
+extern dev_t temp_device;
+
+int main(int argc,char *argv[])
+{
+ int res;
+ // int c;
+ int h;
+
+ showmessage("Try to create and truncate a file.\n");
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_CREAT|O_WRONLY|O_TRUNC);
+ if (h!=-1) {
+ cprintf("CLOSING %s\n",FILENAME);
+ res=close(h);
+ if (res!=0) {
+ cprintf("CLOSE FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+ } else {
+ cprintf("FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+
+ waitend();
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/testw1.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/testw1.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/testw1.c (revision 1657)
@@ -0,0 +1,71 @@
+/*
+ *
+ *
+ *
+ */
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include "common.h"
+
+#define FILENAME "/TEMP/TESTW1.TXT"
+
+int scrivi(int h,char *buffer,int len)
+{
+ int res;
+ cprintf("WRITING...\n");
+ res=write(h,buffer,len);
+ cprintf("WRITTEN %i bytes\n",res);
+ if (res>0) {
+ buffer[res]='\0';
+ cprintf("(%s)\n",buffer);
+ } else cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ return res;
+}
+
+extern dev_t temp_device;
+
+int main(int argc,char *argv[])
+{
+ int res;
+ int h;
+
+ showmessage("Try to create and overwriting a file.\n");
+
+ cprintf("OPENING %s\n",FILENAME);
+ h=open(FILENAME,O_CREAT|O_WRONLY|O_TRUNC);
+
+ if (h>=0) {
+ cprintf("OPENED fd=%i!\n",h);
+
+ scrivi(h,"ABC ",3);
+
+ scrivi(h,"abcdefghilmnopqrstuvz ",21);
+
+ res=close(h);
+ if (res!=0) {
+ cprintf("CLOSE FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+ } else {
+ cprintf("FAILED!\n");
+ cprintf("errno: %i '%s'\n",errno,strerror(errno));
+ }
+
+ waitend();
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/fs/common.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/common.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/common.c (revision 1657)
@@ -0,0 +1,135 @@
+
+#include <kernel/func.h>
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <drivers/keyb.h>
+
+#include <sys/mount.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* -- */
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+/* -- */
+
+__dev_t root_device;
+__dev_t temp_device;
+
+int choose_root_callback(__dev_t dev,__uint8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+/* -- */
+
+//extern int bdev_scan_devices(int(*callback)(__dev_t,__uint8_t));
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+
+ return 0;
+}
+
+/* -- */
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ }
+ }
+
+ return 0;
+}
+
+/* -- */
+
+
+/* -- */
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ //dump_sem_table();
+ //dump_nop_table();
+ cprintf("CTRL-C pressed!\n");
+ sys_end();
+}
+
+/* -- */
+
+void showmessage(char *s)
+{
+ cputs(s);
+ cprintf("Press [x] to begin...");
+ while (keyb_getchar()!='x');
+ cprintf("\n");
+}
+
+void waitend(void)
+{
+ int c;
+ cprintf("Press [x] to exit...");
+ while ((c=keyb_getchar())!='x');
+ cprintf("\n");
+}
Index: tags/rel_0_5/oldexamples/fs/makefile
===================================================================
--- tags/rel_0_5/oldexamples/fs/makefile (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/makefile (revision 1657)
@@ -0,0 +1,45 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS=hello
+PROGS+=test0 test1
+PROGS+=testw0 testw1
+PROGS+=tree1 tree2
+PROGS+=testu
+OBJS=common.o
+
+include $(BASE)/config/example.mk
+
+#
+#
+#
+
+hello:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=hello INIT=initfs.o OTHEROBJS=common.o
+
+test0:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=test0 INIT=initfs.o OTHEROBJS=common.o
+
+test1:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=test1 INIT=initfs.o OTHEROBJS=common.o
+
+testu:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=testu INIT=initfs.o OTHEROBJS=common.o
+
+testw0:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=testw0 INIT=initfs.o OTHEROBJS=common.o
+
+testw1:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=testw1 INIT=initfs.o OTHEROBJS=common.o
+
+tree1:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=tree1 INIT=initfs.o OTHEROBJS=common.o
+
+tree2:
+ make -f $(SUBMAKE) BASE=$(BASE) APP=tree2 INIT=initfs.o OTHEROBJS=common.o
Index: tags/rel_0_5/oldexamples/fs/initfs.c
===================================================================
--- tags/rel_0_5/oldexamples/fs/initfs.c (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/initfs.c (revision 1657)
@@ -0,0 +1,119 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: initfs.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:39 $
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/cbs.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+#include "modules/nopm.h"
+
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ extern int __register_sub_init_prologue(void);
+ extern int __register_sub_init(void);
+
+ __register_sub_init_prologue();
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ PC_register_module();
+ NPP_register_module();
+ SRP_register_module();
+ NOP_register_module();
+ NOPM_register_module();
+
+ __register_sub_init();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ KEYB_PARMS keyb = BASE_KEYB;
+ extern int __bdev_sub_init(void);
+ extern int __fs_sub_init(void);
+ extern void ctrlc_exit(KEY_EVT *k);
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(keyb, ctrlc_exit);
+ KEYB_init(&keyb);
+
+ __bdev_sub_init();
+ __fs_sub_init();
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/oldexamples/fs/common.h
===================================================================
--- tags/rel_0_5/oldexamples/fs/common.h (nonexistent)
+++ tags/rel_0_5/oldexamples/fs/common.h (revision 1657)
@@ -0,0 +1,15 @@
+
+#ifndef _COMMON_H
+#define _COMMON_H
+
+#include <sys/types.h>
+
+extern __dev_t root_device;
+extern __dev_t temp_device;
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs);
+
+void showmessage(char *s);
+void waitend(void);
+
+#endif
Index: tags/rel_0_5/oldexamples/mpeg/mplay.c
===================================================================
--- tags/rel_0_5/oldexamples/mpeg/mplay.c (nonexistent)
+++ tags/rel_0_5/oldexamples/mpeg/mplay.c (revision 1657)
@@ -0,0 +1,512 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Luca Abeni <luca@hartik.sssup.it>
+ * Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: mplay.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:39 $
+ */
+
+#include <ll/sys/types.h>
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+
+//#include <hartik.h>
+#include <drivers/keyb.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+//#include <xdos.h>
+#include <drivers/glib.h>
+
+#include "mpeg/video.h"
+/*#include "proto.h"*/
+#include "mpeg/util.h"
+#include "mpeg/dither.h"
+#include "mpeg/mpeg.h"
+
+
+
+
+
+
+#include <drivers/keyb.h>
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ grx_close();
+ cprintf("CTRL-C pressed!\n");
+ grx_modeinfo();
+ sys_end();
+}
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+dev_t root_device;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ return 0;
+}
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ //struct mount_opts opts;
+
+ //memset(&opts,0,sizeof(struct mount_opts));
+ //opts.flags=MOUNT_FLAG_RW;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ return 0;
+}
+
+
+
+
+
+int x_fseek(FILE *file, long where, int from)
+{
+ return fseek(file,where,from);
+}
+
+size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
+{
+ return fread(buffer,size,n,file);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+TIME ttt;
+
+DWORD n;
+
+///* #define GPHBDIM 4097152 */
+//#define GPHBDIM 1000000
+
+//BYTE gphb[GPHBDIM]; /* Std Dim: 2M */
+//BYTE *nextphbyte = gphb;
+
+struct streamdescr {
+ FILE *f;
+ ImageDesc *i;
+ int x1, y1;
+} sd[10];
+
+#define SCREENX 800
+#define SCREENY 600
+
+void txtreset(void *dummy)
+{
+ grx_close();
+ grx_modeinfo();
+ /* cprintf("Total frames: %ld\n", i);
+ cprintf("Total time: %lu\n", t);*/
+ //cprintf("Frame rate: %lu\n", (n * 1000) / ttt);
+ /* cprintf("Max frame time: %lu\n", mft);*/
+}
+
+#define MAINSLEEP 20000
+
+void drawload(TIME l)
+{
+ #define LLPWINSIZE 20
+ int actl;
+// struct load l;
+ #define LOADX 500
+ #define LOADY 300
+ #define LOADYDIM 50
+ #define LOADXDIM 100
+ static int th = 0;
+ static int x = 0;
+ static int hy[LLPWINSIZE];
+ static int somma = 0;
+ int i;
+
+/* for (i = 0; i < LLPWINSIZE; i++) hy[i] = 0; */
+
+// load_actual(&l);
+// actl = (LOADYDIM * l.actual) / l.rif + 1;
+// {
+// char str[80];
+// sprintf(str,"%d",actl);
+// /*grx_text("Ciao", 200, 200, color16(31, 63, 31), 0);*/
+// grx_text(" ", 100, 400, 100, 0);
+// grx_text(str, 100, 400, 100,0);
+// }
+/* LowPass Filter */
+
+
+ actl=((long)l*LOADYDIM)/MAINSLEEP+1;
+
+ somma += actl - hy[th];
+ hy[th] = actl;
+ th = (th + 1) % LLPWINSIZE;
+ actl = somma / LLPWINSIZE;
+ grx_line(LOADX+x,LOADY,LOADX+x,(LOADY+LOADYDIM),0);
+ if (actl > LOADYDIM) actl = LOADYDIM;
+ grx_line(LOADX+x,(LOADY + actl),LOADX+x,(LOADY+LOADYDIM),255);
+
+ x = (x + 1) % LOADXDIM;
+
+}
+
+
+
+TASK play(void *arg)
+{
+ int i=(int)arg;
+ int loop = TRUE;
+ BYTE *pixels;
+ int moreframes = TRUE;
+ FILE *mpeg = sd[i].f;
+ ImageDesc *img = sd[i].i;
+ int x1, y1, x2, y2;
+
+ /*printf ("Task %d: Movie is %d x %d pixels\n", i, img->Width, img->Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img->PictureRate, img->BitRate);*/
+
+ pixels = (BYTE *) malloc(img->Size * sizeof(BYTE));
+ x1 = sd[i].x1;
+ y1 = sd[i].y1;
+ x2 = x1 + img->Width-1;
+ y2 = y1 + img->Height-1;
+ while (loop) { /* play the whole movie forever */
+ loop = 1;
+ n = 0;
+ ttt = sys_gettime(NULL);
+ while (moreframes) {
+ //cprintf("°");
+ moreframes = GetMPEGFrame (img, pixels);
+ grx_putimage(x1, y1, x2, y2, pixels);
+ n++;
+ task_endcycle();
+ }
+ ttt = sys_gettime(NULL) - ttt;
+ RewindMPEG (mpeg, img);
+ SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
+ moreframes = TRUE;
+ }
+
+ return 0;
+}
+
+
+
+int main(int argc, char *argv[])
+{
+ // SYS_PARMS sp = BASE_SYS;
+ KEY_EVT k;
+ // MODEL m = BASE_MODEL;
+ PID pid;
+
+ // DOS_FILE *Infile;
+// BYTE *mpegbuff[10], *p;
+// WORD res;
+// DWORD cnt[10];
+
+
+TIME sum;
+
+ SOFT_TASK_MODEL model;
+
+ FILE *mpeg;
+ ImageDesc img[10];
+ int full_color = FALSE;
+
+ int mode;
+ int esc;
+ int i;
+ int actx = 10, acty = 10;
+ ColormapEntry *cp;
+
+ //cprintf("file '%s'\n",argv[1]);
+
+ if (argc < 2) {
+ fprintf (stderr, "Usage: %s mpegfile\n", argv[0]);
+ sys_abort(301);
+ }
+
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ Infile = DOS_fopen(argv[i + 1], "r");
+ if (!Infile) {
+ cprintf("%s not found!!!\n", argv[i + 1]);
+ sys_abort(300);
+ }
+ cprintf("\n %s Opened!!!\n\n", argv[i + 1]);
+
+ mpegbuff[i] = nextphbyte;
+ p = mpegbuff[i]; cnt[i] = 0;
+ res = 0x1000;
+ while (res > 0) {
+ res = DOS_fread(p, 0x1000, 1, Infile);
+ cnt[i] += res;
+ p += res;
+ }
+ p += res;
+ nextphbyte = p;
+ }
+ */
+
+ /* OK, Now we can start the system!!! */
+ //sys_init(&sp);
+ //keyb_init(SOFT, 100);
+ // keyb_init(NULL);
+ // k.flag = CNTR_BIT;
+ // k.scan = KEY_C;
+ // k.ascii = 'c';
+ //keyb_excset(k,endfun);
+
+ //vfs_init();
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ vfs_assign(argv[i + 1], mpegbuff[i], cnt[i]);
+ }
+ */
+
+
+
+
+
+
+ /* Init the graph... */
+ if (grx_init() == -1) {
+ cprintf("No init!!!\n");
+ sys_abort(255);
+ }
+
+ mode = grx_getmode(SCREENX, SCREENY, 8);
+ cprintf("Mode num: %x\n", mode);
+ grx_cardinfo();
+ cprintf("[hit enter to continue]\n");
+ esc = FALSE;
+ while (!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii == 13) esc = TRUE;
+ }
+
+
+ if (mode == -1) {
+ cprintf("Mode not present!!!\n");
+ sys_abort(255);
+ }
+
+ if (grx_setmode(mode) == -1) {
+ cprintf("No SetMode!!!\n");
+ sys_abort(255);
+ }
+
+ //sys_atexit(txtreset,NULL,AFTER_EXIT);
+
+
+ //cprintf("Û0Û");
+
+ for (i = 0; i < argc - 1; i++) {
+ mpeg = fopen(argv[i + 1], "r");
+
+ if (!mpeg) {
+ perror (argv[1]);
+ sys_abort(301);
+ }
+
+
+ setvbuf(mpeg,NULL,_IOFBF,BUFSIZ*100);
+
+
+ //cprintf("Û0.5Û");
+
+ /* !!! */
+ img[i].vid_stream=NULL;
+ img[i].Colormap=NULL;
+
+ if (!OpenMPEG(mpeg, &(img[i]))) {
+ fprintf (stderr, "OpenMPEG on %s failed\n", argv[i + 1]);
+ sys_abort(301);
+ }
+
+
+ //cprintf("Û1Û");
+
+
+
+ SetMPEGOption (&(img[i]), MPEG_DITHER, GRAY_DITHER);
+ //SetMPEGOption (&(img[i]), MPEG_DITHER, FS4_DITHER);
+
+
+ /* SetMPEGOption(MPEG_DITHER, GRAY_DITHER); */
+
+ /* printf ("Movie is %d x %d pixels\n", img[i].Width, img[i].Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img[i].PictureRate, img[i].BitRate); */
+
+ //cprintf("Û2Û");
+
+ if (i == 0) {
+ cp = img[i].Colormap;
+
+ if (!full_color) {
+ int ii;
+
+ for (ii = 0; ii < img[i].ColormapSize; ii++) {
+
+
+ grx_setcolor (ii, img[i].Colormap[ii].red / 4,
+ img[i].Colormap[ii].green / 4,
+ img[i].Colormap[ii].blue / 4);
+
+
+ }
+
+ /*NO!!! Colormap is an array of short, setpalette wants an array of BYTE!!!*/
+ /* grx_setpalette(0, 255, img.Colormap);*/
+ }
+ }
+ if (actx + img[i].Width > SCREENX) {
+ actx = 10;
+ acty += 200;
+ }
+ sd[i].x1 = actx;
+ sd[i].y1 = acty;
+ sd[i].f = mpeg;
+ sd[i].i = &(img[i]);
+
+ //cprintf("Û3Û");
+
+ soft_task_default_model(model);
+ ////soft_task_def_system(model);
+ //soft_task_def_met(model,9000);
+ //soft_task_def_wcet(model,9000);
+ //soft_task_def_period(model,50000);
+
+ soft_task_def_met(model,5000);
+ soft_task_def_wcet(model,15000);
+ soft_task_def_period(model,40000);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)i);
+ soft_task_def_ctrl_jet(model);
+
+ //task_def_arg(m, i);
+ //task_def_wcet(m, 9000);
+ pid = task_create("video", play, &model, NULL);
+ if (pid == -1) {
+ cprintf(" task --> Not Guaranteed!!!\n");
+ sys_abort(20000);
+ }
+ task_activate(pid);
+
+ //cprintf("Û4Û");
+
+ actx += img[i].Width + 10;
+ }
+
+ /* play(0);*/
+ esc = FALSE;
+ //jet_delstat(pid);
+ while (!esc) {
+ if (keyb_getcode(&k,NON_BLOCK) && (k.ascii == 13)) esc = TRUE;
+ task_delay(MAINSLEEP);
+ //jet_getstat(pid,&sum,NULL,NULL,NULL);
+ //jet_delstat(pid);
+ //drawload(sum);
+ }
+
+ sys_abort(59000);
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/mpeg/mplay2.c
===================================================================
--- tags/rel_0_5/oldexamples/mpeg/mplay2.c (nonexistent)
+++ tags/rel_0_5/oldexamples/mpeg/mplay2.c (revision 1657)
@@ -0,0 +1,590 @@
+/*
+ * Project: HARTIK (HA-rd R-eal TI-me K-ernel)
+ *
+ * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
+ * Gerardo Lamastra <gerardo@sssup.it>
+ *
+ * Authors : Luca Abeni <luca@hartik.sssup.it>
+ * Massimiliano Giorgi <massy@hartik.sssup.it>
+ * (see authors.txt for full list of hartik's authors)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://hartik.sssup.it
+ */
+
+/*
+ * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: mplay2.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:39 $
+ */
+
+#include <ll/sys/types.h>
+
+#include <kernel/func.h>
+#include <kernel/const.h>
+
+//#include <hartik.h>
+#include <drivers/keyb.h>
+
+
+
+#include <trace/trace.h>
+#include <trace/queues.h>
+
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+//#include <xdos.h>
+#include <drivers/glib.h>
+
+#include "mpeg/video.h"
+/*#include "proto.h"*/
+#include "mpeg/util.h"
+#include "mpeg/dither.h"
+#include "mpeg/mpeg.h"
+
+
+
+
+
+
+
+
+//#define NOSHOW 1
+
+
+
+
+#include <drivers/keyb.h>
+
+
+int mustdied=0;
+
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ mustdied=1;
+#ifndef NOSHOW
+ grx_close();
+#endif
+ cprintf("CTRL-C pressed!\n");
+#ifndef NOSHOW
+ grx_modeinfo();
+#endif
+ sys_end();
+}
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+int __register_sub_init_prologue(void)
+{
+ int id;
+ TRC_init_phase1(NULL);
+ trc_register_fixed_queue();
+ id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
+ trc_trace_class(TRC_CLASS_USER);
+ trc_assign_class_to_queue(TRC_CLASS_USER,id);
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+dev_t root_device;
+dev_t temp_device;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int choose_temp_callback(__dev_t dev,__uint8_t fs)
+{
+ static int flag=0;
+ if (fs==FS_MSDOS) {
+ if (flag) return dev;
+ flag=1;
+ }
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,FALSE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ temp_device=bdev_scan_devices(choose_temp_callback);
+ if (temp_device<0) {
+ cprintf("can't find a filesystem to mount on /TEMP!!!\n");
+ }
+
+ return 0;
+}
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ struct mount_opts opts;
+ int res;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,FALSE);
+ filesystem_init(&fs);
+
+ if (temp_device>=0) {
+ memset(&opts,0,sizeof(struct mount_opts));
+ opts.flags=MOUNT_FLAG_RW;
+ res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
+ if (res!=0) {
+ cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
+ } else
+ cprintf("mounted /TEMP rw\n");
+
+ }
+
+ libc_initialize();
+
+ TRC_init_phase2();
+
+ return 0;
+}
+
+int x_fseek(FILE *file, long where, int from)
+{
+ return fseek(file,where,from);
+}
+
+size_t x_fread(void *buffer, size_t size, size_t n, FILE *file)
+{
+ return fread(buffer,size,n,file);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+TIME ttt;
+
+DWORD n[10];
+
+///* #define GPHBDIM 4097152 */
+//#define GPHBDIM 1000000
+
+//BYTE gphb[GPHBDIM]; /* Std Dim: 2M */
+//BYTE *nextphbyte = gphb;
+
+struct streamdescr {
+ FILE *f;
+ ImageDesc *i;
+ int x1, y1;
+} sd[10];
+
+#define SCREENX 800
+#define SCREENY 600
+
+void txtreset(void *dummy)
+{
+#ifndef NOSHOW
+ grx_close();
+ grx_modeinfo();
+ /* cprintf("Total frames: %ld\n", i);
+ cprintf("Total time: %lu\n", t);*/
+ //cprintf("Frame rate: %lu\n", (n * 1000) / ttt);
+ /* cprintf("Max frame time: %lu\n", mft);*/
+ /*
+ sys_status(READY_RT_STATUS | READY_NRT_STATUS | BLOCKED_STATUS |
+ IDLE_STATUS | SLEEP_STATUS | EXEC_STATUS);
+ */
+#endif
+}
+
+#define MAINSLEEP 20000
+
+void drawload(TIME l)
+{
+ #define LLPWINSIZE 20
+ int actl;
+// struct load l;
+ #define LOADX 500
+ #define LOADY 300
+ #define LOADYDIM 50
+ #define LOADXDIM 100
+ static int th = 0;
+ static int x = 0;
+ static int hy[LLPWINSIZE];
+ static int somma = 0;
+ int i;
+
+/* for (i = 0; i < LLPWINSIZE; i++) hy[i] = 0; */
+
+// load_actual(&l);
+// actl = (LOADYDIM * l.actual) / l.rif + 1;
+// {
+// char str[80];
+// sprintf(str,"%d",actl);
+// /*grx_text("Ciao", 200, 200, color16(31, 63, 31), 0);*/
+// grx_text(" ", 100, 400, 100, 0);
+// grx_text(str, 100, 400, 100,0);
+// }
+/* LowPass Filter */
+
+
+ actl=((long)l*LOADYDIM)/MAINSLEEP+1;
+
+ somma += actl - hy[th];
+ hy[th] = actl;
+ th = (th + 1) % LLPWINSIZE;
+ actl = somma / LLPWINSIZE;
+#ifndef NOSHOW
+ grx_line(LOADX+x,LOADY,LOADX+x,(LOADY+LOADYDIM),0);
+ if (actl > LOADYDIM) actl = LOADYDIM;
+ grx_line(LOADX+x,(LOADY + actl),LOADX+x,(LOADY+LOADYDIM),255);
+#endif
+ x = (x + 1) % LOADXDIM;
+
+}
+
+
+
+TASK play(void *arg)
+{
+ int i=(int)arg;
+ int loop = TRUE;
+ BYTE *pixels;
+ int moreframes = TRUE;
+ FILE *mpeg = sd[i].f;
+ ImageDesc *img = sd[i].i;
+ int x1, y1, x2, y2;
+
+ /*printf ("Task %d: Movie is %d x %d pixels\n", i, img->Width, img->Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img->PictureRate, img->BitRate);*/
+
+ pixels = (BYTE *) malloc(img->Size * sizeof(BYTE));
+ x1 = sd[i].x1;
+ y1 = sd[i].y1;
+ x2 = x1 + img->Width-1;
+ y2 = y1 + img->Height-1;
+ while (loop) { /* play the whole movie forever */
+ loop = 0;
+ n[i] = 0;
+ ttt = sys_gettime(NULL);
+ while (moreframes && n[i]<250) {
+
+ if (mustdied) break;
+
+#ifdef NOSHOW
+ cprintf("%c",'°'+i);
+#endif
+
+ moreframes = GetMPEGFrame (img, pixels);
+#ifndef NOSHOW
+ grx_putimage(x1, y1, x2, y2, pixels);
+#endif
+ n[i]++;
+ task_endcycle();
+ }
+ ttt = sys_gettime(NULL) - ttt;
+ if (!loop) break;
+ RewindMPEG (mpeg, img);
+ SetMPEGOption (img, MPEG_DITHER, GRAY_DITHER);
+ moreframes = TRUE;
+ }
+
+ return 0;
+}
+
+
+
+int main(int argc, char *argv[])
+{
+ // SYS_PARMS sp = BASE_SYS;
+ KEY_EVT k;
+ // MODEL m = BASE_MODEL;
+ PID pid;
+
+ // DOS_FILE *Infile;
+// BYTE *mpegbuff[10], *p;
+// WORD res;
+// DWORD cnt[10];
+
+
+TIME sum;
+
+ SOFT_TASK_MODEL model;
+
+ FILE *mpeg;
+ ImageDesc img[10];
+ int full_color = FALSE;
+
+ int mode;
+ int esc;
+ int i;
+ int actx = 10, acty = 10;
+ ColormapEntry *cp;
+
+ //cprintf("file '%s'\n",argv[1]);
+
+ if (argc < 2) {
+ fprintf (stderr, "Usage: %s mpegfile\n", argv[0]);
+ sys_abort(301);
+ }
+
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ Infile = DOS_fopen(argv[i + 1], "r");
+ if (!Infile) {
+ cprintf("%s not found!!!\n", argv[i + 1]);
+ sys_abort(300);
+ }
+ cprintf("\n %s Opened!!!\n\n", argv[i + 1]);
+
+ mpegbuff[i] = nextphbyte;
+ p = mpegbuff[i]; cnt[i] = 0;
+ res = 0x1000;
+ while (res > 0) {
+ res = DOS_fread(p, 0x1000, 1, Infile);
+ cnt[i] += res;
+ p += res;
+ }
+ p += res;
+ nextphbyte = p;
+ }
+ */
+
+ /* OK, Now we can start the system!!! */
+ //sys_init(&sp);
+ //keyb_init(SOFT, 100);
+ // keyb_init(NULL);
+ // k.flag = CNTR_BIT;
+ // k.scan = KEY_C;
+ // k.ascii = 'c';
+ //keyb_excset(k,endfun);
+
+ //vfs_init();
+ /*
+ for (i = 0; i < argc - 1; i++) {
+ vfs_assign(argv[i + 1], mpegbuff[i], cnt[i]);
+ }
+ */
+
+
+
+
+
+
+ /* Init the graph... */
+#ifndef NOSHOW
+
+ if (grx_init() == -1) {
+ cprintf("No init!!!\n");
+ sys_abort(255);
+ }
+
+ mode = grx_getmode(SCREENX, SCREENY, 8);
+ cprintf("Mode num: %x\n", mode);
+ grx_cardinfo();
+#endif
+
+ cprintf("[hit enter to continue]\n");
+ esc = FALSE;
+ while (!esc) {
+ keyb_getcode(&k,BLOCK);
+ if (k.ascii == 13) esc = TRUE;
+ }
+
+
+ if (mode == -1) {
+ cprintf("Mode not present!!!\n");
+ sys_abort(255);
+ }
+
+#ifndef NOSHOW
+ if (grx_setmode(mode) == -1) {
+ cprintf("No SetMode!!!\n");
+ sys_abort(255);
+ }
+#endif
+
+ //sys_atexit(txtreset,NULL,AFTER_EXIT);
+
+
+ //cprintf("Û0Û");
+
+ for (i = 0; i < argc - 1; i++) {
+ mpeg = fopen(argv[i + 1], "r");
+
+ if (!mpeg) {
+ perror (argv[1]);
+ sys_abort(301);
+ }
+
+ //cprintf("Û0.5Û");
+
+ /* !!! */
+ img[i].vid_stream=NULL;
+ img[i].Colormap=NULL;
+
+ if (!OpenMPEG(mpeg, &(img[i]))) {
+ fprintf (stderr, "OpenMPEG on %s failed\n", argv[i + 1]);
+ sys_abort(301);
+ }
+
+
+ //cprintf("Û1Û");
+
+
+
+ SetMPEGOption (&(img[i]), MPEG_DITHER, GRAY_DITHER);
+ //SetMPEGOption (&(img[i]), MPEG_DITHER, FS4_DITHER);
+
+
+ /* SetMPEGOption(MPEG_DITHER, GRAY_DITHER); */
+
+ /* printf ("Movie is %d x %d pixels\n", img[i].Width, img[i].Height);
+ printf ("Required picture rate = %d, required bit rate = %d\n",
+ img[i].PictureRate, img[i].BitRate); */
+
+ //cprintf("Û2Û");
+
+ if (i == 0) {
+ cp = img[i].Colormap;
+
+ if (!full_color) {
+ int ii;
+
+ for (ii = 0; ii < img[i].ColormapSize; ii++) {
+
+#ifndef NOSHOW
+
+ grx_setcolor (ii, img[i].Colormap[ii].red / 4,
+ img[i].Colormap[ii].green / 4,
+ img[i].Colormap[ii].blue / 4);
+
+#endif
+
+ }
+
+ /*NO!!! Colormap is an array of short, setpalette wants an array of BYTE!!!*/
+ /* grx_setpalette(0, 255, img.Colormap);*/
+ }
+ }
+ if (actx + img[i].Width > SCREENX) {
+ actx = 10;
+ acty += 200;
+ }
+ sd[i].x1 = actx;
+ sd[i].y1 = acty;
+ sd[i].f = mpeg;
+ sd[i].i = &(img[i]);
+
+ //cprintf("Û3Û");
+
+ soft_task_default_model(model);
+ ////soft_task_def_system(model);
+ //soft_task_def_met(model,9000);
+ //soft_task_def_wcet(model,9000);
+ //soft_task_def_period(model,50000);
+
+ soft_task_def_met(model,5000);
+ soft_task_def_wcet(model,5000);
+ soft_task_def_period(model,40000);
+ soft_task_def_periodic(model);
+ soft_task_def_arg(model,(void*)i);
+ soft_task_def_ctrl_jet(model);
+
+ //task_def_arg(m, i);
+ //task_def_wcet(m, 9000);
+ pid = task_create("Shower", play, &model, NULL);
+ if (pid == -1) {
+ cprintf(" task --> Not Guaranteed!!!\n");
+ sys_abort(20000);
+ }
+ task_activate(pid);
+
+ //cprintf("Û4Û");
+
+ actx += img[i].Width + 10;
+ }
+
+ /* play(0);*/
+ esc = FALSE;
+ //jet_delstat(pid);
+ while (!esc) {
+ if (keyb_getcode(&k,NON_BLOCK) && (k.ascii == 13)) esc = TRUE;
+ task_delay(MAINSLEEP);
+ //jet_getstat(pid,&sum,NULL,NULL,NULL);
+ //jet_delstat(pid);
+ //drawload(sum);
+ }
+
+ sys_abort(59000);
+
+ return 0;
+}
Index: tags/rel_0_5/oldexamples/mpeg/common.c
===================================================================
--- tags/rel_0_5/oldexamples/mpeg/common.c (nonexistent)
+++ tags/rel_0_5/oldexamples/mpeg/common.c (revision 1657)
@@ -0,0 +1,74 @@
+#include <drivers/keyb.h>
+
+void ctrlc_exit(KEY_EVT *k)
+{
+ extern void dump_sem_table(void);
+ extern void dump_nop_table(void);
+ grx_close();
+ cprintf("CTRL-C pressed!\n");
+ grx_modeinfo();
+ sys_end();
+}
+
+#include <fs/bdevinit.h>
+#include <fs/fsinit.h>
+#include <fs/bdev.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+int __register_sub_init_prologue(void)
+{
+ return 0;
+}
+
+int __register_sub_init(void)
+{
+ return 0;
+}
+
+dev_t root_device;
+
+int choose_root_callback(dev_t dev,u_int8_t fs)
+{
+ if (fs==FS_MSDOS) return dev;
+ return -1;
+}
+
+int __bdev_sub_init(void)
+{
+ BDEV_PARMS bdev=BASE_BDEV;
+
+ bdev_def_showinfo(bdev,TRUE);
+ bdev_init(&bdev);
+
+ root_device=bdev_scan_devices(choose_root_callback);
+ if (root_device<0) {
+ cprintf("can't find root device to mount on /!!!\n");
+ sys_end();
+ return -1;
+ }
+
+ return 0;
+}
+
+extern int libc_initialize(void);
+
+int __fs_sub_init(void)
+{
+ FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
+ //struct mount_opts opts;
+
+ //memset(&opts,0,sizeof(struct mount_opts));
+ //opts.flags=MOUNT_FLAG_RW;
+
+ filesystem_def_rootdevice(fs,root_device);
+ filesystem_def_fs(fs,FS_MSDOS);
+ filesystem_def_showinfo(fs,TRUE);
+ filesystem_init(&fs);
+
+ libc_initialize();
+
+ return 0;
+}
+
Index: tags/rel_0_5/oldexamples/mpeg/mpg123.c
===================================================================
--- tags/rel_0_5/oldexamples/mpeg/mpg123.c (nonexistent)
+++ tags/rel_0_5/oldexamples/mpeg/mpg123.c (revision 1657)
@@ -0,0 +1,219 @@
+
+#include "mpg123/mpg123.h"
+#include <stdlib.h>
+
+/* stub */
+FILE *http_open (char *url)
+{
+ return NULL;
+}
+
+
+
+static long rates[3][3] = {
+ { 32000,44100,48000 } ,
+ { 16000,22050,24000 } ,
+ { 8000,11025,12000 }
+};
+
+int supported_rates = 0;
+
+int outmode = DECODE_AUDIO;
+
+char *listname = NULL;
+long outscale = 32768;
+int checkrange = FALSE;
+int tryresync = TRUE;
+int quiet = FALSE;
+int verbose = 0;
+int doublespeed= 0;
+int halfspeed = 0;
+int shuffle = 0;
+int change_always = 1;
+int force_8bit = 0;
+int force_frequency = -1;
+long numframes = -1;
+long startFrame= 0;
+int usebuffer = 0;
+int frontend_type = 0;
+int remote = 0;
+int buffer_fd[2];
+int buffer_pid;
+
+
+static int intflag = FALSE;
+static int remflag = FALSE;
+
+
+static char remote_buffer[1024];
+static struct frame fr;
+static struct audio_info_struct ai;
+txfermem *buffermem;
+#define FRAMEBUFUNIT (18 * 64 * 4)
+
+void init_output(void)
+{
+ static int init_done = FALSE;
+
+ if (init_done)
+ return;
+ init_done = TRUE;
+
+ if (!(pcm_sample = (unsigned char *) malloc(audiobufsize * 2))) {
+ perror ("malloc()");
+ l1_exit (1);
+
+ }
+
+ if(outmode==DECODE_AUDIO) {
+ //if(audio_open(&ai) < 0) {
+ // perror("audio");
+ // exit(1);
+ // }
+ /* audio_set_rate (&ai); should already be done in audio_open() [OF] */
+ }
+}
+
+static void reset_audio_samplerate(void)
+{
+
+ //if (outmode == DECODE_AUDIO) {
+ /* audio_reset_parameters(&ai); */
+ /* close and re-open in order to flush
+ * the device's internal buffer before
+ * changing the sample rate. [OF]
+ */
+ //audio_close (&ai);
+ //if (audio_open(&ai) < 0) {
+ // perror("audio");
+ // exit(1);
+ // }
+ // }
+}
+
+void play_frame(int init,struct frame *fr)
+{
+ int clip;
+
+ if((fr->header_change && change_always) || init) {
+ int reset_audio = 0;
+
+ if(remote)
+ print_rheader(fr);
+
+ if (!quiet && init) {
+ if (verbose)
+ print_header(fr);
+ else
+ print_header_compact(fr);
+ }
+
+ if(force_frequency < 0) {
+ if(ai.rate != freqs[fr->sampling_frequency]>>(fr->down_sample)) {
+ ai.rate = freqs[fr->sampling_frequency]>>(fr->down_sample);
+ reset_audio = 1;
+ }
+ }
+ else if(ai.rate != force_frequency) {
+ ai.rate = force_frequency;
+ reset_audio = 1;
+ }
+
+ init_output();
+
+ if(reset_audio) {
+ reset_audio_samplerate();
+ if (intflag)
+ return;
+ }
+ }
+
+ if (fr->error_protection) {
+ getbits(16); /* crc */
+ }
+
+ clip = (fr->do_layer)(fr,outmode,&ai);
+
+ /*
+ if(clip > 0 && checkrange)
+ fprintf(stderr,"%d samples clipped\n", clip);
+ */
+}
+
+void audio_info_struct_init(struct audio_info_struct *ai)
+{
+ ai->rate = -1;
+ ai->gain = -1;
+ ai->output = -1;
+ ai->device = NULL;
+ ai->channels = -1;
+ ai->format = -1;
+}
+
+int audio_play_samples(struct audio_info_struct *ai, unsigned char *buf, int n)
+{
+ return 0;
+}
+
+
+int main(int argc,char *argv[])
+{
+ static char *fname="/MOSSE.MP3";
+ int result;
+ unsigned long frameNum = 0;
+ //struct timeval start_time, now;
+ unsigned long secdiff;
+ int init;
+
+
+ quiet=0;
+ verbose=1;
+
+ // DECODE_STDOUT stampa to 1
+ // DECODE_AUDIO chiama la audio_play_samples
+ // DECODE_BUFFER scrive su buffer_fd[1]
+ outmode = DECODE_AUDIO;
+
+ audio_info_struct_init(&ai);
+
+ fr.single = -1; /* both channels */
+ fr.synth = synth_1to1;
+ fr.down_sample = 0;
+
+ make_decode_tables(outscale);
+ init_layer2();
+ init_layer3(fr.down_sample);
+
+ open_stream(fname,-1);
+
+ //gettimeofday (&start_time, NULL);
+ read_frame_init();
+
+ init = 1;
+ for(frameNum=0;read_frame(&fr) && numframes && !intflag;frameNum++) {
+ if(frameNum < startFrame || (doublespeed && (frameNum % doublespeed))) {
+ if(fr.lay == 3)
+ set_pointer(512);
+ continue;
+ }
+ numframes--;
+ play_frame(init,&fr);
+ init = 0;
+ if (!(frameNum & 0xf))
+ fprintf(stderr, "\r{%4lu} ",frameNum);
+ }
+
+ close_stream();
+
+ {
+ /* This formula seems to work at least for
+ * MPEG 1.0/2.0 layer 3 streams.
+ */
+ int sfd = freqs[fr.sampling_frequency] * (fr.lsf + 1);
+ int secs = (frameNum * (fr.lay==1 ? 384 : 1152) + sfd / 2) / sfd;
+ fprintf(stderr,"[%d:%02d] Decoding of %s finished.\n", secs / 60,
+ secs % 60, fname);
+ }
+
+}
+
Index: tags/rel_0_5/oldexamples/mpeg/makefile
===================================================================
--- tags/rel_0_5/oldexamples/mpeg/makefile (nonexistent)
+++ tags/rel_0_5/oldexamples/mpeg/makefile (revision 1657)
@@ -0,0 +1,42 @@
+#
+#
+#
+# TO REMAKE BETTER
+#
+#
+
+ifndef BASE
+BASE=../../..
+endif
+include $(BASE)/config/config.mk
+include $(BASE)/config/libdep.mk
+
+.PHONY: test all install depend clean cleanall
+
+C_INC+= -I$(BASE)/ports
+LINK_LIB+= -lmpeg -lmp3
+LINK_DEP+= $(LIB_PATH)/libmpeg.a $(LIB_PATH)/libmp3.a
+
+test:: mplay mplay2 mpg123
+
+clean::
+ rm -f *.o
+ rm -f mplay
+ rm -f mplay2
+ rm -f mpg123
+
+mplay:mplay.o $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) mplay.o $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mplay
+
+mplay2:mplay2.o $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) mplay2.o $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mplay2
+
+mpg123:mpg123.o common.o $(LIB_PATH)/initfs.o $(LIB_DEP)
+ $(LD) $(LINK_OPT) $(LINK_STARTUP) \
+ mpg123.o common.o $(LIB_PATH)/initfs.o \
+ --start-group $(LINK_LIB) --end-group \
+ -o mpg123
Index: tags/rel_0_5/oldexamples/mpeg/initfs.c
===================================================================
--- tags/rel_0_5/oldexamples/mpeg/initfs.c (nonexistent)
+++ tags/rel_0_5/oldexamples/mpeg/initfs.c (revision 1657)
@@ -0,0 +1,119 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/*
+ * CVS : $Id: initfs.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
+ *
+ * File: $File$
+ * Revision: $Revision: 1.1.1.1 $
+ * Last update: $Date: 2004-05-24 18:03:39 $
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/rr.h"
+#include "modules/cbs.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+#include "modules/pi.h"
+#include "modules/pc.h"
+#include "modules/srp.h"
+#include "modules/npp.h"
+#include "modules/nop.h"
+#include "modules/nopm.h"
+
+#include "drivers/keyb.h"
+
+/*+ sysyem tick in us +*/
+#define TICK 1000
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ extern int __register_sub_init_prologue(void);
+ extern int __register_sub_init(void);
+
+ __register_sub_init_prologue();
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ PI_register_module();
+ PC_register_module();
+ NPP_register_module();
+ SRP_register_module();
+ NOP_register_module();
+ NOPM_register_module();
+
+ __register_sub_init();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+ KEYB_PARMS keyb = BASE_KEYB;
+ extern int __bdev_sub_init(void);
+ extern int __fs_sub_init(void);
+ extern void ctrlc_exit(KEY_EVT *k);
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(keyb, ctrlc_exit);
+ KEYB_init(&keyb);
+
+ __bdev_sub_init();
+ __fs_sub_init();
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/oldexamples/makefile
===================================================================
--- tags/rel_0_5/oldexamples/makefile (nonexistent)
+++ tags/rel_0_5/oldexamples/makefile (revision 1657)
@@ -0,0 +1,5 @@
+# fake makefile ;-)
+
+all:
+
+clean:
Index: tags/rel_0_5/soccer/soccer.c
===================================================================
--- tags/rel_0_5/soccer/soccer.c (nonexistent)
+++ tags/rel_0_5/soccer/soccer.c (revision 1657)
@@ -0,0 +1,1245 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: soccer.c,v 1.1.1.1 2004-05-24 18:03:45 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:45 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+/*--------------------------------------------------------------*/
+/* */
+/* S.Ha.R.K. SOCCER SIMULATOR 2001 */
+/* */
+/* */
+/*Autori: Merli Andrea */
+/* Zucchetti Alessandro */
+/*--------------------------------------------------------------*/
+
+#include <kernel/kern.h>
+#include <drivers/glib.h>
+#include <drivers/keyb.h>
+#include <semaphore.h>
+#include <stdlib.h>
+#include <math.h>
+#include <modules/cabs.h>
+#include <ll/sys/types.h>
+#include "images.h"
+#include "position.h"
+#include "iniziali.h"
+#include "calc.h"
+#include "calc2.h"
+#include "stadio.h"
+
+struct target{
+int x;
+int y;
+};
+
+void draw_calc(int x, int y, int c,int f); /*disegna i calciatori*/
+void draw_ball(int c); /*disegna la palla*/
+void draw_port(int c,int p,int yp,int xp); /*disegna i portieri*/
+void init_calc(); /*carica i task calc*/
+void init_position(int num,int *ox,int *oy); /*inizializza la posizione dei calciatori*/
+void init_calc_area(int i,int *x_min,int *x_max,int *y_min,int *y_max); /*inizializza la zona di campo die calciatori*/
+void get_target(int modo,int i,struct target * obj,int x_max,int x_min,int y_max,int y_min);/*seleziona l'obietivo dei calciatori*/
+void collision_detection(int i);/*gestisce le collisioni tra i calciatori*/
+int get_direction(int x,int y,int x2, int y2);
+void init_portiere(); /*carica i task portiere*/
+void init_ball(); /*carica il task ball*/
+void act_goal(); /*carica il task gol*/
+void draw_goal(); /*gestisce il tabellone facendo apparire la scritta GOAL!!*/
+void disegna_campo(); /*disegna il campo di gioco*/
+int yportiere(int y1, int y2);
+int xportiere(int x1, int x2);
+int goal_behaviour(int f); /*gestisce gli eventi in occasione di un gol*/
+int rigore=0;
+float t;
+double tick = 1.0; /* system tick = 1 ms */
+int xb=300,yb=300,xob=300,yob=300; /* coordinate globali della palla*/
+struct position pos_calc[MAX_P+2];
+PID pid_calc,pid_calc2,pid_ball,pid_port,pid_gol;
+sem_t mutex,mutex2;
+CAB cbi[4];
+
+
+/*--------------------------------------------------------------*/
+TASK ball(void *arg)
+{
+float dx=0, dy=0;//,df=0,dg=0;
+float acc =0.0; /*accelerazione*/
+float x; /*spostamento*/
+int g=10; /*accelerazione di gravit…*/
+float cattr=0.05; /*coeff di attrito tra palla e campo*/
+int col=1000;
+int ij=0;
+int r1=0,r2=0; /*gol segnati*/
+char tetaa[15];
+double r; /*angolo in radianti*/
+int flag =0; /*variabile generatrice di eventi*/
+int outy,outx; /*variabile per rilevare il rimbalzo della palla*/
+float vel1=0.0,vel2=0.0; /*variabili di velocita*/
+float tau = 1.0; /*tempo base*/
+char *m; /*modo*/
+char *a; /*angolo*/
+char *s; /*speed*/
+char modo;
+char *o; /*azione*/
+char azione;
+int teta=0;
+char velocita;
+char mode;
+ ij=0;
+ m = cab_getmes(cbi[0]);
+ mode = *m;
+ cab_unget(cbi[0],m);
+ if(mode==NO_BALL_MODE){
+ xb = xob =(XMIN+XMAX)/2;
+ yb = yob =(YMIN+YMAX)/2;
+ }
+ if(mode ==PENALTY_MODE_BLUE){
+
+ xb=700;
+ yb=(YMIN+YMAX)/2;
+ }
+ if(mode == PENALTY_MODE_WHITE){
+ xb=100;
+ yb=(YMIN+YMAX)/2;
+ }
+
+ sprintf(tetaa,"BLUE FC %3d AC WHITE %3d",(r1),(r2));
+ grx_text(tetaa,XMIN+270 ,YMENU+60, rgb16(255,255,255), rgb16(0,0,0));
+/***************************************************************************/
+ while (1) { //WHILE(1);
+ m = cab_getmes(cbi[0]);
+ mode = *m;
+ cab_unget(cbi[0],m);
+ /*posiziono la palla sul dischetto del rigore*/
+ if(mode ==PENALTY_MODE_BLUE){
+ xb=700;
+ yb=(YMIN+YMAX)/2;
+ }
+ if(mode == PENALTY_MODE_WHITE){
+ xb=100;
+ yb=(YMIN+YMAX)/2;
+ }
+ /*se rigore=NO_PENALTY si calcolano le coordinate della palla
+ in base alla velocit… e alla direzione del tiro*/
+ if(rigore ==NO_PENALTY){
+ a = cab_getmes(cbi[1]); /*direzione*/
+ cab_unget(cbi[1],a);
+ s = cab_getmes(cbi[2]); /*velocit…*/
+ velocita = *s;
+ cab_unget(cbi[2],s);
+ acc = (float)cattr * g;
+ r = (double)(36*(*a)/12) * PI / 180.;
+ if(mode==PASS_MODE){
+ vel1= velocita;
+ }
+ vel2 = vel1 - acc*tau;
+ if(vel2>0){
+ x = vel1 *tau -0.5*acc*tau*tau;
+ dx = (float)(x * cos(r));
+ dy = (float)(x * sin(r));
+ xb += dx;
+ yb += dy;
+ ij++;
+ outx = (xb > XMAX-2) || (xb < XMIN+2);
+ outy = (yb > YMAX-6) || (yb < YMIN+6);
+
+ if (outx || outy) {
+ if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)){
+ dx=0;
+ dy=0;
+ }
+ xb = xb - dx;
+ yb = yb - dy;
+ if (outx) teta = 60 - (*a);
+ if (outy) teta = 120-(*a);
+ if (teta > 120) teta -= 120;
+ if (teta < 0) teta += 120;
+ *a =(char)teta;
+ r = (double)(36*(*a)/12) * PI / 180.;
+ dx = (float)(x * cos(r));
+ dy = (float)(x * sin(r));
+ if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)){
+ dx=0;
+ dy=0;
+ }
+ xb += dx;
+ yb += dy;
+ }
+ modo = NO_BALL_MODE;
+ m = cab_reserve(cbi[0]);
+ *m = modo;
+ cab_putmes(cbi[0],m);
+
+ vel1 = vel2;
+ }
+ if (yb< YMIN+5) yb = yb+10;
+ if(xb< XMIN+5) xb = xb +10;
+ /*se c'Š un gol*/
+ if ((yb>=(YMIN+YMAX)/2-50) &&(yb<=(YMIN+YMAX)/2+50)&&((xb<=XMIN+7)||
+ (xb >=XMAX-7))){
+ /*aggiorno i risultati*/
+ if(xb<XMIN+50) r2++;
+ else r1++;
+ /*assegno alle variabili i valori di riposo*/
+ yb =(YMAX+YMIN)/2;
+ xb =(XMIN+XMAX)/2;
+ teta=0;
+ velocita=0;
+ flag =1;
+ }
+ /* in base al valore di flag modifico il tabellone*/
+ flag = goal_behaviour(flag);
+ /*scrivo il nuovo risultato nel tabellone*/
+ if (flag == 80){
+ sprintf(tetaa,"BLUE FC %3d AC WHITE %3d",(r1),(r2));
+ grx_text(tetaa,XMIN+270 ,YMENU+60, rgb16(255,255,255), rgb16(0,0,0));
+ flag =0;
+ o = cab_reserve(cbi[3]);
+ azione = NO_ACT; /*nessuna azione*/
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ modo = NO_BALL_MODE;
+ m = cab_reserve(cbi[0]);
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ }
+
+ }//fine if(rigore==NO_PENALTY)
+ draw_ball(0);
+ draw_ball(col);
+ xob = xb; yob = yb;
+
+ task_endcycle();
+ }
+
+}
+
+
+/*--------------------------------------------------------------*/
+
+
+
+/******************************************************************/
+
+TASK calc(void *arg){
+
+struct target obj;
+int ox=200, oy=200;
+int alpha=0;
+int teta;
+int col=0;
+char speed;
+char *s;
+char modo;
+char *m;
+char angolo;
+char *a;
+int i = (int)arg;
+int x_min=0,y_min=0;
+int x_max=0,y_max=0;
+/*Posiziono i calciatori nel punto iniziale*/
+
+ init_position(i,&ox,&oy);
+
+
+ /*Definisco l'area di gioco del calciatore basandomi sul suo PID*/
+
+ init_calc_area(i,&x_min,&x_max,&y_min,&y_max);
+
+while (1) {
+ m = cab_getmes(cbi[0]);
+ modo = *m;
+ cab_unget(cbi[0],m);
+
+ /*Individua l'obiettivo del calciatore a seconda del modo e del */
+ /*ruolo in PENALTY_MODE un calciatore va sul pallone gli altri */
+ /*ai lati del campo */
+ /*in NO_BALL_MODE l'obiettivo Š la palla se essa Š */
+ /*nell'area definita dalla funzione init_calc_area(..) */
+ /*altrimenti Š la posizione iniziale definita con init_position(.)*/
+
+
+ get_target(modo,i,&obj,x_max,x_min,y_max,y_min);
+
+ /*se raggiungo l'obbiettivo mi fermo*/
+ if(obj.x==pos_calc[i].x) pos_calc[i].dx=0;
+ if(obj.y==pos_calc[i].y) pos_calc[i].dy=0;
+
+ /*direzione tra il calciatore e l'obiettivo*/
+
+ alpha= get_direction(pos_calc[i].x,pos_calc[i].y,obj.x,obj.y);
+
+ /*direzione di corsa iniziale*/
+
+ pos_calc[i].dy = -VEL*sin((alpha*PI)/180);
+ pos_calc[i].dx = VEL*cos((alpha*PI)/180);
+
+
+ /*Per evitare che il calciatore corra prima dell'inizio della
+ partita gli impongo di non muoversi in posizione iniziale*/
+
+ if((obj.x==300)&&(obj.y==300)) {
+ pos_calc[i].dx=0;
+ pos_calc[i].dy=0;
+ }
+ /*velocità di corsa*/
+
+ pos_calc[i].x+=pos_calc[i].dx;
+ pos_calc[i].y+=pos_calc[i].dy;
+
+ /*verifico se mi trovo in una situazione di collisione con */
+ /*un altro calciatore */
+
+ collision_detection(i);
+
+
+
+ /*se il calciatore arriva sulla palla tira*/
+ if((modo==NO_BALL_MODE)||(i==7)||(i==2))
+ if(((pos_calc[i].x>=xb-27)&&(pos_calc[i].x<=xb+27))&&((pos_calc[i].y>=yb-27)&&(pos_calc[i].y<=yb+27)))
+ {
+
+ if((i==7)||(i==2)) rigore =NO_PENALTY;
+ modo = PASS_MODE;
+ m = cab_reserve(cbi[0]);
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ if(i<5){
+ a = cab_reserve(cbi[1]);
+ teta =(rand()%(90) + 135 );
+ if(teta >360) teta -= 360;
+ if (teta<0) teta += 360;
+ angolo = (char)(teta/3);
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ }
+ if(i>4){
+ a = cab_reserve(cbi[1]);
+ teta =(rand()%(90) -45);
+ if(teta >360) teta -= 360;
+ if (teta<0) teta += 360;
+ teta = (teta/3);
+ *a = teta;//angolo;
+ cab_putmes(cbi[1],a);
+ }
+ s = cab_reserve(cbi[2]);
+ speed=16;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+
+ }
+
+
+
+ draw_calc(ox, oy, CANC,0);
+
+ /*Disegna l'omino voltato nella direzione della palla*/
+ if(i<5){
+ DIREZ(alpha,col,158,203, RLEFT,pos_calc[i].x,pos_calc[i].y);/*runleft*/
+ DIREZ(alpha,col,249,292, RDOWN,pos_calc[i].x,pos_calc[i].y);/*rundown*/
+ DIREZ(alpha,col, 68,113, RUP,pos_calc[i].x,pos_calc[i].y);/*runup*/
+ DIREZ(alpha,col, 0, 23,RRIGHT,pos_calc[i].x,pos_calc[i].y);/*runright*/
+ DIREZ(alpha,col,337,360,RRIGHT,pos_calc[i].x,pos_calc[i].y);
+ DIREZ(alpha,col, 23, 68, RRUP,pos_calc[i].x,pos_calc[i].y);/*runrightup*/
+ DIREZ(alpha,col,113,158, RLUP,pos_calc[i].x,pos_calc[i].y);/*runleftup*/
+ DIREZ(alpha,col,203,249, RLDW,pos_calc[i].x,pos_calc[i].y);/*runleftdown*/
+ DIREZ(alpha,col,292,337, RRDW,pos_calc[i].x,pos_calc[i].y);/*runrightdown*/
+ }
+
+ if(i>4){
+
+ DIREZ(alpha,col,158,203, RLEFT2,pos_calc[i].x,pos_calc[i].y);/*runleft*/
+ DIREZ(alpha,col,249,292, RDOWN2,pos_calc[i].x,pos_calc[i].y);/*rundown*/
+ DIREZ(alpha,col, 68,113, RUP2,pos_calc[i].x,pos_calc[i].y);/*runup*/
+ DIREZ(alpha,col, 0, 23,RRIGHT2,pos_calc[i].x,pos_calc[i].y);/*runright*/
+ DIREZ(alpha,col,337,360,RRIGHT2,pos_calc[i].x,pos_calc[i].y);
+ DIREZ(alpha,col, 23, 68, RRUP2,pos_calc[i].x,pos_calc[i].y);/*runrightup*/
+ DIREZ(alpha,col,113,158, RLUP2,pos_calc[i].x,pos_calc[i].y);/*runleftup*/
+ DIREZ(alpha,col,203,249, RLDW2,pos_calc[i].x,pos_calc[i].y);/*runleftdown*/
+ DIREZ(alpha,col,292,337, RRDW2,pos_calc[i].x,pos_calc[i].y);/*runrightdown*/
+ }
+
+
+ ox =pos_calc[i].x; oy = pos_calc[i].y;
+
+ task_endcycle();
+ }
+}
+/****************************************************************/
+TASK gol(void *arg)
+{
+ while(1){
+ draw_goal();
+ task_endcycle();
+ }
+}
+/****************************************************************/
+TASK portiere(void *arg)
+{
+int yp,yp1,yp0,ypo_0=(YMAX+YMIN)/2,ypo_1=(YMAX+YMIN)/2;
+int xp0,xp1,xpo_0,xpo_1,xo0,xo1;
+int np= (int)arg;
+char speed;
+char *s;
+char modo;
+char *m;
+char angolo;
+char *a;
+
+ yp = (YMIN+YMAX)/2; /* y di attesa*/
+ yp0 = (YMIN+YMAX)/2;
+ yp1 = (YMIN+YMAX)/2;
+ xp0 = xpo_0 = XMIN+3; /* xp ascissa attuale portiere, xpo ascissa vecchia posizione portiere*/
+ xp1 = xpo_1 = XMAX-30;
+ xo0 = XMIN+3; /* x di attesa*/
+ xo1 = XMAX-30; /* x di attesa*/
+ draw_port(1,np,yp,xo0);
+ draw_port(1,np,yp,xo1);
+
+ while(1){
+ m = cab_getmes(cbi[0]);
+ modo = *m;
+ cab_unget(cbi[0],m);
+ /*in base alla posizione della palla si calcola la posizione del portiere*/
+ if ((np==0) && (xb < (XMIN+XMAX)/2) &&(xb > XMIN+150)){
+ yp0 = yportiere(yb,yp0);
+ xp0 = xportiere(xo0,xp0);
+ }
+ if ((np==0) &&(xb <= XMIN+150)){
+ yp0 = yportiere(yb,yp0);
+ xp0= xportiere(xb,xp0);
+ }
+ if ((np==0) && (xb > (XMIN+XMAX)/2)){
+ yp0 = yportiere(yp,yp0);
+ xp0 = xportiere(xo0,xp0);
+ }
+ /*il portiere non esce oltre questi limiti*/
+ if ((yp0< (YMIN+YMAX)/2-100)|| (yp0>(YMIN+YMAX)/2+100))
+ yp0 = ypo_0;
+ if(xp0> XMIN+150)
+ xp0 =xpo_0;
+
+ pos_calc[10].x = xp0;
+ pos_calc[10].y = yp0;
+
+ /*in base alla posizione della palla si calcola la posizione del portiere*/
+ if ((np==1) && (xb > (XMIN+XMAX)/2) && (xb< XMAX-150)){
+ yp1 = yportiere(yb,yp1);
+ xp1 = xportiere(xo1,xp1);
+ }
+ if ((np==1) && (xb >= XMAX-150)){
+ yp1 = yportiere(yb,yp1);
+ xp1 = xportiere(xb,xp1);
+ }
+ if ((np==1) && (xb < (XMIN+XMAX)/2)){
+ yp1 = yportiere(yp,yp1);
+ xp1 = xportiere(xo1,xp1);
+ }
+ /*il portiere non esce oltre questi limiti*/
+ if ((yp1< (YMIN+YMAX)/2-100)|| (yp1>(YMIN+YMAX)/2+100))
+ yp1 =ypo_1;
+ if(xp1 < XMAX-150)
+ xp1 =xpo_1;
+
+ pos_calc[11].x = xp1;
+ pos_calc[11].y = yp1;
+
+ /*in caso di rigore il portiere aspetta il tiro sulla linea della porta*/
+ if (rigore ==PENALTY) xp0= XMIN+3;
+
+ if ((np==0)){
+ draw_port(0,np,ypo_0,xpo_0);
+ draw_port(1,np,yp0,xp0);
+ ypo_0 = yp0;
+ xpo_0 =xp0;
+ }
+
+ /*in caso di rigore il portiere aspetta il tiro sulla linea della porta*/
+ if(rigore ==PENALTY) xp1= XMAX-30;
+
+ if((np==1)){
+ draw_port(0,np,ypo_1,xpo_1);
+ draw_port(1,np,yp1,xp1);
+ ypo_1 = yp1;
+ xpo_1 = xp1;
+ }
+
+ /*se para rinvia immediatamente*/
+ if( (yp0 >=yb-5) && (yp0<yb+20) && ((xb<=xp0+20)&&(xb>=xp0-30))){
+ m = cab_reserve(cbi[0]);
+ modo = PASS_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ a = cab_reserve(cbi[1]);
+ angolo =0;
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ s = cab_reserve(cbi[2]);
+ speed=20;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+ }
+ /*se para rinvia immediatamente*/
+ if((yp1 >=yb-5) && (yp1<yb+20) && (xb<=xp1+20)&&(xb>= xp1-30) ){
+ m = cab_reserve(cbi[0]);
+ modo = PASS_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ a = cab_reserve(cbi[1]);
+ angolo =60;
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ s = cab_reserve(cbi[2]);
+ speed=20;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+ }
+ task_endcycle();
+ }
+}
+
+/****************************************************************/
+/* This function is called when the system exits */
+void byebye(void *arg)
+{
+ grx_close();
+ kern_printf("Bye Bye!\n");
+}
+
+/****************************** MAIN ******************************/
+
+int main(int argc, char **argv)
+{
+
+
+ char c; /* character from keyboard */
+ int z=0;
+ int p=0;
+ int ij=0;
+ char modo;
+ char *m;
+ char *s;
+ char speed;
+ char *a;
+ char angolo;
+ char *o;
+ char azione;
+
+
+ TIME seme; /* used to init the random seed */
+
+ /* Set the closing function */
+ sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
+
+ /* graphic card Initialization */
+ if (grx_init() < 1) {
+ sys_abort(1);
+ }
+
+ if (grx_open(ORI_RES,VER_RES,COL_DEP) < 0) {
+ kern_printf("GRX Err\n");
+ sys_abort(1);
+ }
+ kern_printf("Video card ok!\n");
+ cbi[1] = cab_create("direzione",10,15);
+ cbi[0] = cab_create("modo",4,15);
+ cbi[2] = cab_create("velocita",10,15);
+ cbi[3] = cab_create("azione",3,3);
+ m = cab_reserve(cbi[0]);
+ modo = NO_BALL_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ a = cab_reserve(cbi[1]);
+ angolo =0;
+ *a = angolo;
+ cab_putmes(cbi[1],a);
+ s = cab_reserve(cbi[2]);
+ speed=0;
+ *s =speed;
+ cab_putmes(cbi[2],s);
+ o = cab_reserve(cbi[3]);
+ azione = NO_ACT;
+ *o = azione;
+ cab_putmes(cbi[3],o);
+
+ /* The scenario */
+
+ grx_box(0,0,ORI_RES,VER_RES,0);
+ disegna_campo();
+ for(p=0;p<scale_width;p++)
+ for(z=0;z<scale_height;z++){
+ grx_plot(100+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ grx_plot(550+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ }
+ for(p=0;p<faro_width;p++)
+ for(z=0;z<faro_height;z++){
+ grx_plot(0+p,0+z,rgb16(stadio_cmap[(unsigned char)faros_data[z*100+p]][0],stadio_cmap[(unsigned char)faros_data[z*100+p]][1],stadio_cmap[(unsigned char)faros_data[z*100+p]][2]));
+ grx_plot(700+p,0+z,rgb16(stadio_cmap[(unsigned char)farod_data[z*100+p]][0],stadio_cmap[(unsigned char)farod_data[z*100+p]][1],stadio_cmap[(unsigned char)farod_data[z*100+p]][2]));
+ }
+ for(p=0;p<schermo_width;p++)
+ for(z=0;z<schermo_height;z++){
+ grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
+ }
+ grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
+ /* The program waits a space to create a calc */
+ c = keyb_getch(BLOCK);
+
+ /* randomize!!!!*/
+ seme = sys_gettime(NULL);
+ srand(seme);
+
+ do {
+ if ((c == ' ') &&(ij==0)) {
+ init_ball();
+ init_calc();
+ init_portiere();
+ ij++;
+ }
+ if ((c== 'w')){m = cab_reserve(cbi[0]);
+ modo = PENALTY_MODE_WHITE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ rigore =PENALTY; }
+ if ((c== 'e')){m = cab_reserve(cbi[0]);
+ modo = PENALTY_MODE_BLUE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ rigore =PENALTY; }
+ if ((c == 'k')) {
+ group_kill(GROUP_PLAY);
+ group_kill(GROUP_SOFT);
+ group_kill(GROUP_BALL);
+ ij=0;
+ m = cab_reserve(cbi[0]);
+ modo = NO_BALL_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ disegna_campo();
+ for(p=0;p<scale_width;p++)
+ for(z=0;z<scale_height;z++){
+ grx_plot(100+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ grx_plot(550+p,0+z,rgb16(stadio_cmap[(unsigned char)scale_data[z*150+p]][0],stadio_cmap[(unsigned char)scale_data[z*150+p]][1],stadio_cmap[(unsigned char)scale_data[z*150+p]][2]));
+ }
+ for(p=0;p<faro_width;p++)
+ for(z=0;z<faro_height;z++){
+ grx_plot(0+p,0+z,rgb16(stadio_cmap[(unsigned char)faros_data[z*100+p]][0],stadio_cmap[(unsigned char)faros_data[z*100+p]][1],stadio_cmap[(unsigned char)faros_data[z*100+p]][2]));
+ grx_plot(700+p,0+z,rgb16(stadio_cmap[(unsigned char)farod_data[z*100+p]][0],stadio_cmap[(unsigned char)farod_data[z*100+p]][1],stadio_cmap[(unsigned char)farod_data[z*100+p]][2]));
+ }
+ grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
+ xb=(int)(XMAX-XMIN)/2;
+ yb=(int)(YMIN+YMAX)/2;
+ }
+ c = keyb_getch(BLOCK);
+ } while (c != ESC);
+
+
+
+ sys_end();
+
+ return 0;
+}
+
+/*--------------------------------------------------------------*/
+void draw_calc(int x, int y, int c,int f)
+{
+ int i,j;/*needed in the macro*/
+ sem_wait(&mutex);
+ if(c==CANC){
+
+ grx_box(x, y,x+27,y+27,SFONDO);
+ if((x>(XMIN+XMAX)/2-27) && (x<(XMIN+XMAX)/2+27)){
+ grx_line(XMIN+1,YMIN+1,XMAX-1,YMIN+1,rgb16(255,255,255));
+ grx_line(XMIN+1,YMAX-1,XMAX-1,YMAX-1,rgb16(255,255,255));
+ grx_line(XMIN+1,YMIN+1,XMIN+1,(YMIN+YMAX)/2-50,rgb16(255,255,255));
+ grx_line(XMIN+1,(YMIN+YMAX)/2+50,XMIN+1,YMAX-1,rgb16(255,255,255));
+ grx_line(XMAX-1,YMIN+1,XMAX-1,(YMIN+YMAX)/2-50,rgb16(255,255,255));
+ grx_line(XMAX-1,(YMIN+YMAX)/2+50,XMAX-1,YMAX-1,rgb16(255,255,255));
+ grx_line(((XMIN+XMAX)/2),YMIN,((XMIN+XMAX)/2),YMAX-1,rgb16(255,255,255));
+ grx_circle((XMIN+XMAX)/2,(YMIN+YMAX)/2,54,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/5,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,3*(YMIN+YMAX)/4-30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/10,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2+70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(XMIN+1,(YMIN+YMAX)/2-50,XMIN+1,(YMIN+YMAX)/2+50,rgb16(100,100,100));
+ grx_line(XMAX-1,(YMIN+YMAX)/2-50,XMAX-1,(YMIN+YMAX)/2+50,rgb16(100,100,100));
+ grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ }
+ }
+ else
+ if(c==RLEFT)
+ DIRDRAW(x,y,((unsigned char)runup_data[i*27+j]));
+ if(c==RLEFT+1)
+ DIRDRAW(x,y,((unsigned char)runup2_data[i*27+j]));
+ if(c==RDOWN)
+ DIRDRAW(x,y,((unsigned char)rundes2_data[i*27+j]));
+ if(c==RDOWN+1)
+ DIRDRAW(x,y,((unsigned char)rundes_data[i*27+j]));
+ if(c==RUP)
+ DIRDRAW(x,y,((unsigned char)runleft2_data[i*27+j]));
+ if(c==RUP+1)
+ DIRDRAW(x,y,((unsigned char)runleft_data[i*27+j]));
+ if(c==RRIGHT)
+ DIRDRAW(x,y,((unsigned char)rundown2_data[i*27+j]));
+ if(c==RRIGHT+1)
+ DIRDRAW(x,y,((unsigned char)rundown_data[i*27+j]));
+ if(c==RRUP)
+ DIRDRAW(x,y,((unsigned char)runld2_data[i*27+j]));
+ if(c==RRUP+1)
+ DIRDRAW(x,y,((unsigned char)runld_data[i*27+j]));
+ if(c==RLUP)
+ DIRDRAW(x,y,((unsigned char)runlu2_data[i*27+j]));
+ if(c==RLUP+1)
+ DIRDRAW(x,y,((unsigned char)runlu_data[i*27+j]));
+ if(c==RLDW)
+ DIRDRAW(x,y,((unsigned char)runru2_data[i*27+j]));
+ if(c==RLDW+1)
+ DIRDRAW(x,y,((unsigned char)runru_data[i*27+j]));
+ if(c==RRDW)
+ DIRDRAW(x,y,((unsigned char)runrd2_data[i*27+j]));
+ if(c==RRDW+1)
+ DIRDRAW(x,y,((unsigned char)runrd_data[i*27+j]));
+/**********************************************************************/
+ if(c==RLEFT2)
+ DIRDRAW(x,y,((unsigned char)B_runup_data[i*27+j]));
+ if(c==RLEFT2+1)
+ DIRDRAW(x,y,((unsigned char)B_runup2_data[i*27+j]));
+ if(c==RDOWN2)
+ DIRDRAW(x,y,((unsigned char)B_rundes2_data[i*27+j]));
+ if(c==RDOWN2+1)
+ DIRDRAW(x,y,((unsigned char)B_rundes_data[i*27+j]));
+ if(c==RUP2)
+ DIRDRAW(x,y,((unsigned char)B_runleft2_data[i*27+j]));
+ if(c==RUP2+1)
+ DIRDRAW(x,y,((unsigned char)B_runleft_data[i*27+j]));
+ if(c==RRIGHT2)
+ DIRDRAW(x,y,((unsigned char)B_rundown2_data[i*27+j]));
+ if(c==RRIGHT2+1)
+ DIRDRAW(x,y,((unsigned char)B_rundown_data[i*27+j]));
+ if(c==RRUP2)
+ DIRDRAW(x,y,((unsigned char)B_runld2_data[i*27+j]));
+ if(c==RRUP2+1)
+ DIRDRAW(x,y,((unsigned char)B_runld_data[i*27+j]));
+ if(c==RLUP2)
+ DIRDRAW(x,y,((unsigned char)B_runlu2_data[i*27+j]));
+ if(c==RLUP2+1)
+ DIRDRAW(x,y,((unsigned char)B_runlu_data[i*27+j]));
+ if(c==RLDW2)
+ DIRDRAW(x,y,((unsigned char)B_runru2_data[i*27+j]));
+ if(c==RLDW2+1)
+ DIRDRAW(x,y,((unsigned char)B_runru_data[i*27+j]));
+ if(c==RRDW2)
+ DIRDRAW(x,y,((unsigned char)B_runrd2_data[i*27+j]));
+ if(c==RRDW2+1)
+ DIRDRAW(x,y,((unsigned char)B_runrd_data[i*27+j]));
+ sem_post(&mutex);
+}
+/*--------------------------------------------------------------*/
+void draw_ball(int c)
+{
+ sem_wait(&mutex);
+ if(c==0)
+ grx_box(xob, yob,xob+5,yob+5,SFONDO);
+ else grx_putimage(xb, yb,xb+5,yb+5,pallone);
+ sem_post(&mutex);
+}
+void draw_port(int c,int p,int yp,int xp)
+{
+ int i,j;
+ sem_wait(&mutex);
+ if (c==0){
+ if(p==0){
+ /*ridisegna l'area*/
+ grx_box(xp,yp-15,xp+30,yp+25,SFONDO);
+ grx_line(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/5,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,3*(YMIN+YMAX)/4-30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line((XMIN+XMAX)/10,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(XMIN,(YMIN+YMAX)/2+70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ }
+ if(p==1){
+ /*ridisegna l'area*/
+ grx_box(xp,yp-15,xp+27,yp+25,SFONDO);
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,(YMIN+YMAX)/4+30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(4*(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2-70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_line(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ }
+ }
+ else{
+ if(p==0)
+ DIRDRAW(xp,yp,((unsigned char)portsx_data[i*27+j]));
+ if(p==1)
+ DIRDRAW(xp,yp,((unsigned char)portdx_data[i*27+j]));
+ }
+ sem_post(&mutex);
+}
+void init_ball(){
+ HARD_TASK_MODEL m_ball;
+ hard_task_default_model(m_ball);
+ hard_task_def_ctrl_jet (m_ball);
+ hard_task_def_arg (m_ball, (void *)0);
+ hard_task_def_wcet (m_ball, BALL_WCET);
+ hard_task_def_mit (m_ball, PERIOD_BALL);
+ hard_task_def_group (m_ball, GROUP_BALL);
+ hard_task_def_usemath (m_ball);
+ pid_ball = task_create("ball", ball, &m_ball, NULL);
+ if (pid_ball == NIL) {
+ grx_close();
+ perror("Could not create task <ball>");
+ sys_abort(1);
+ }
+
+ task_activate(pid_ball);
+}
+void init_calc(){
+ HARD_TASK_MODEL m_calc;
+ int i;
+ disegna_campo();
+ for(i=0;i<MAX_P;i++){
+ hard_task_default_model(m_calc);
+ hard_task_def_ctrl_jet (m_calc);
+ hard_task_def_arg (m_calc, (void *)i);
+ hard_task_def_wcet (m_calc, CALC_WCET);
+ hard_task_def_mit (m_calc, PERIOD_CALC);
+ hard_task_def_group (m_calc, GROUP_PLAY);
+ hard_task_def_usemath (m_calc);
+ pid_calc = task_create("calc", calc, &m_calc, NULL);
+ if (pid_calc == NIL) {
+ grx_close();
+ perror("Could not create task <calc>");
+ sys_abort(1);
+ }
+ task_activate(pid_calc);
+ }
+ }
+void act_goal(){
+
+
+ SOFT_TASK_MODEL m_goal;
+ soft_task_default_model(m_goal);
+ soft_task_def_arg (m_goal,(void*)0);
+ soft_task_def_met (m_goal, 1000);
+ soft_task_def_level (m_goal,1);
+ soft_task_def_ctrl_jet (m_goal);
+ soft_task_def_period (m_goal, 1200000);
+ soft_task_def_group (m_goal, GROUP_SOFT);
+ soft_task_def_usemath (m_goal);
+ soft_task_def_aperiodic(m_goal);
+
+ pid_gol = task_create("gol", gol, &m_goal, NULL);
+ if (pid_gol == NIL) {
+ grx_close();
+ perror("Could not create task <port>");
+ sys_abort(1);
+ }
+ task_activate(pid_gol);
+ }
+void init_portiere(){
+ HARD_TASK_MODEL m_port;
+ int g;
+ for(g=0;g<2;g++){
+ hard_task_default_model(m_port);
+ hard_task_def_arg (m_port, (void *)g);
+ hard_task_def_wcet (m_port, PORT_WCET);
+ hard_task_def_mit (m_port, PERIOD_PORT);
+ hard_task_def_group (m_port, GROUP_SOFT);
+ hard_task_def_usemath (m_port);
+ pid_port = task_create("portiere", portiere, &m_port, NULL);
+ if (pid_port == NIL) {
+ grx_close();
+ perror("Could not create task <port>");
+ sys_abort(1);
+ }
+ task_activate(pid_port);
+ }
+
+ }
+void draw_goal(){
+ int p,z;
+ char *m;
+ char modo;
+ char *o;
+ char azione;
+ m = cab_reserve(cbi[0]);
+ modo = NO_BALL_MODE;
+ *m = modo;
+ cab_putmes(cbi[0],m);
+ o = cab_getmes(cbi[3]);
+ azione = *o;
+ cab_unget(cbi[3],o);
+
+ /*scritta GOAL!!*/
+ if(azione == GOAL_ACT){
+ for(p=0;p<schermo_width;p++)
+ for(z=0;z<schermo_height;z++){
+ grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)goal1_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
+ }
+ o = cab_reserve(cbi[3]);
+ azione = 0;
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ }
+
+ /*risistema il menu sul tabellone*/
+ if (azione == MENU_ACT){
+ for(p=0;p<schermo_width;p++)
+ for(z=0;z<schermo_height;z++){
+ grx_plot(250+p,0+z,rgb16(stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][0],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][1],stadio_cmap[(unsigned char)schermo_data[z*schermo_width+p]][2]));
+ }
+ o = cab_reserve(cbi[3]);
+ azione = NO_ACT;
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ grx_text(" Simulation of Soccer", XMIN+260, YMENU+10, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" W rigore bianchi, E rigore blue", XMIN+260, YMENU+20, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" SPACE crea squadre, K kill all ", XMIN+260, YMENU+30, rgb16(255,255,255), rgb16(0,0,0));
+ grx_text(" ESC Return to MS-DOS ", XMIN+260, YMENU+40, 12, rgb16(255,255,255));
+ }
+}
+
+/*calcola la y del portiere in base alla yi in ingresso*/
+int yportiere(int yi,int yf){
+ int speedy =3;
+ int dy=0;
+ int yp;
+ /*Se sto per raggiungere la palla rallento*/
+ if(abs(yi-yf)<VEL) speedy=1;
+ /*se raggiungo la palla mi fermo*/
+ if(yi==yf)dy=0;
+ /*se palla in basso*/
+ if(yi>yf) dy= speedy;
+ /*se palla in alto*/
+ if(yi<yf) dy=-speedy;
+ yp =yf+dy;
+ return(yp);
+}
+/*calcola la x del portiere in base alla xi in ingresso*/
+int xportiere(int xi, int xf){
+ int speedx=3;
+ int dx=0;
+ int xp;
+ if(abs(xi-xf)<VEL) speedx=1;
+ if(xi==xf)dx=0;
+ if(xi>xf) dx= speedx;
+ if(xi<xf) dx=-speedx;
+ xp = xf +dx;
+ return(xp);
+}
+/*disegna il campo di gioco*/
+void disegna_campo(){
+ //grx_box(0,0,ORI_RES,VER_RES,0);
+ grx_box(XMIN, YMIN, XMAX, YMAX, SFONDO);
+ grx_rect(XMIN+1, YMIN+1, XMAX-1, YMAX-1, rgb16(255,255,255));
+ grx_line(((XMIN+XMAX)/2),YMIN,((XMIN+XMAX)/2),YMAX-1,rgb16(255,255,255));
+ grx_circle((XMIN+XMAX)/2,(YMIN+YMAX)/2,54,rgb16(255,255,255));
+ grx_rect(XMIN,(YMIN+YMAX)/4+30,(XMIN+XMAX)/5,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_rect(4*(XMIN+XMAX)/5,(YMIN+YMAX)/4+30,XMAX,3*(YMIN+YMAX)/4-30,rgb16(255,255,255));
+ grx_rect(XMIN,(YMIN+YMAX)/2-70,(XMIN+XMAX)/10,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_rect(9*(XMIN+XMAX)/10,(YMIN+YMAX)/2-70,XMAX,(YMIN+YMAX)/2+70,rgb16(255,255,255));
+ grx_box(XMIN,(YMIN+YMAX)/2-50,XMIN+2,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+ grx_box(XMAX-2,(YMIN+YMAX)/2-50,XMAX,(YMIN+YMAX)/2+50,rgb16(50,0,50));
+}
+void init_position(int num,int *ox,int *oy)
+{
+ if(num<5){
+ pos_calc[num].x = *ox = initial_calc_position[num].x+35;
+ pos_calc[num].y = *oy = initial_calc_position[num].y;
+ }
+ if(num==2){
+ pos_calc[num].x = *ox = initial_calc_position[num].x+100;
+ pos_calc[num].y = *oy = initial_calc_position[num].y;
+ }
+ if(num>4){
+ pos_calc[num].x = *ox = initial_calc_position[num-5].x;
+ pos_calc[num].y = *oy = initial_calc_position[num-5].y+35;
+ }
+ if(num==7){
+ pos_calc[num].x = *ox = initial_calc_position[num-5].x-100;
+ pos_calc[num].y = *oy = initial_calc_position[num-5].y;
+ }
+
+}
+void init_calc_area(int num,int *xmin,int *xmax,int *ymin,int *ymax){
+
+
+ switch(num)
+ {
+ case 0: /*attaccante bianchi*/
+ case 5: /*difensore blu*/
+ {
+ *xmin = XMIN;
+ *ymin = YMIN;
+ *xmax = 255;
+ *ymax = 305;
+ }
+ break;
+ case 1: /*attaccante bianchi*/
+ case 6: /*difensore blu*/
+ {
+ *xmin = XMIN;
+ *ymin = 295;
+ *xmax = 255;
+ *ymax = YMAX;
+ }
+ break;
+ case 2: /*centrocampisti*/
+ case 7:
+ {
+ *xmin = 255;
+ *ymin = YMIN;
+ *xmax = 525;
+ *ymax = YMAX;
+ } break;
+ case 3: /*attaccante blu*/
+ case 8: /*difensore bianco*/
+ {
+ *xmin = 525;
+ *ymin = YMIN;
+ *xmax = XMAX;
+ *ymax = 305;
+ }
+ break;
+ case 4: /*attaccante blu*/
+ case 9: /*difensore bianco*/
+ {
+ *xmin = 505;
+ *ymin = 305;
+ *xmax = XMAX;
+ *ymax = YMAX;
+ }
+ break;
+ default:
+ break;
+ }
+}
+void get_target(int modo,int i,struct target * obj,int x_max,int x_min,int y_max,int y_min){
+
+
+
+ if((modo==PENALTY_MODE_WHITE)||(modo==PENALTY_MODE_BLUE)){
+
+
+
+ if((i<5)){
+ obj->x = (XMAX)-100-50*i;
+ if(pos_calc[i].y>(YMAX+YMIN)/2)
+ obj->y = YMAX-60;
+ if(pos_calc[i].y<(YMAX+YMIN)/2)
+ obj->y = YMIN+60;
+ if(modo==PENALTY_MODE_WHITE){
+ if((i==2)){
+ obj->x = xb;
+ obj->y = yb;
+ }
+ }
+ }
+ if((i>4)){
+ obj->x = (XMIN)+100+50*i;
+ if(pos_calc[i].y>(YMAX+YMIN)/2)
+ obj->y = YMAX-60;
+ if(pos_calc[i].y<(YMAX+YMIN)/2)
+ obj->y = YMIN+60;
+ if(modo==PENALTY_MODE_BLUE){
+ if((i==7)){
+ obj->x = xb;
+ obj->y = yb;
+ }
+ }
+
+ }
+ }
+
+ if(modo==NO_BALL_MODE)
+ {
+
+ /*Valutazione se la palla sia in una zona di interesse per il */
+ /*calciatore */
+
+ if((xb>x_max)||(xb<x_min)||(yb>y_max)||(yb<y_min))
+ {
+ if(i<5)
+ {
+ obj->x=initial_calc_position[i].x;
+ obj->y=initial_calc_position[i].y;
+ }
+ if(i>4)
+ {
+ obj->x=initial_calc_position[i-5].x;
+ obj->y=initial_calc_position[i-5].y;
+ }
+ }
+ else
+ {
+ obj->x=xb;
+ obj->y=yb;
+ }
+ }
+
+
+
+
+}
+int get_direction(int x,int y,int x2,int y2){
+
+int ang=0;
+ if((abs(x-x2) !=0)){
+ if((x>x2)&&(y<=y2))
+ ang = 180+
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ if((x<x2)&&(y<y2))
+ ang = 360-
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ if((x<x2)&&(y>y2))
+ ang =
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ if((x>x2)&&(y>y2))
+ ang = 180-
+ atan((float)abs(y-y2)/
+ (float)abs(x-x2))*
+ 180/PI;
+ }
+
+return ang;
+
+}
+
+void collision_detection(int i){
+
+int j;
+
+
+for(j=0;j<MAX_P+2;j++){
+
+ if(i!=j){
+ if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x-27
+ && pos_calc[i].y<pos_calc[j].y && pos_calc[i].y>pos_calc[j].y-27)
+ {
+ pos_calc[i].y=pos_calc[j].y-27;
+ }
+ if(pos_calc[i].x<pos_calc[j].x && pos_calc[i].x>pos_calc[j].x-27
+ && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y-27)
+ {
+ pos_calc[i].x=pos_calc[j].x-27;
+ }
+ if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x-27
+ && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y)
+ {
+ pos_calc[i].y=pos_calc[j].y+27;
+ }
+ if(pos_calc[i].x<pos_calc[j].x+27 && pos_calc[i].x>pos_calc[j].x
+ && pos_calc[i].y<pos_calc[j].y+27 && pos_calc[i].y>pos_calc[j].y)
+ {
+ pos_calc[i].x=pos_calc[j].x+27;
+ }
+ }
+ }
+
+ /*Per impedire un calciatore esca dal campo*/
+
+ if(pos_calc[i].x>=XMAX-(pos_calc[i].dx+1)) pos_calc[i].x-=(pos_calc[i].dx+1);
+ if(pos_calc[i].x<=XMIN+(pos_calc[i].dx+1)) pos_calc[i].x+=(pos_calc[i].dx+1);
+ if(pos_calc[i].y>=YMAX-(pos_calc[i].dy+1)) pos_calc[i].y-=(pos_calc[i].dy+1);
+ if(pos_calc[i].y<=YMIN+(pos_calc[i].dy+1)) pos_calc[i].y+=(pos_calc[i].dy+1);
+}
+
+int goal_behaviour(int flag){
+char *o;
+char azione;
+
+ if (flag !=0) {
+ flag++;
+ yb =(YMAX+YMIN)/2;
+ xb =(XMIN+XMAX)/2;
+ }
+ if (flag==20){
+ yb =(YMAX+YMIN)/2;
+ xb =(XMIN+XMAX)/2;
+ /*seleziono l'azione da compiere sul tabellone*/
+ o = cab_reserve(cbi[3]);
+ azione = GOAL_ACT; /*scritta GOAL!!*/
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ /*carico il task gol*/
+ act_goal();
+ }
+ if (flag==65){
+ o = cab_reserve(cbi[3]);
+ azione = MENU_ACT; /*sistema il menu su tabellone*/
+ *o = azione;
+ cab_putmes(cbi[3],o);
+ /*carico il task gol*/
+ act_goal();
+ }
+
+ return(flag);
+}
+
Index: tags/rel_0_5/soccer/initfile.c
===================================================================
--- tags/rel_0_5/soccer/initfile.c (nonexistent)
+++ tags/rel_0_5/soccer/initfile.c (revision 1657)
@@ -0,0 +1,120 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: initfile.c,v 1.1.1.1 2004-05-24 18:03:45 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:45 $
+ ------------
+
+ System initialization file
+
+ This file contains the 2 functions needed to initialize the system.
+
+ These functions register the following levels:
+
+ an EDF (Earliest Deadline First) level
+ a RR (Round Robin) level
+ a CBS (Costant Bandwidth Server) level
+ a Dummy level
+
+ It can accept these task models:
+
+ HARD_TASK_MODEL (wcet+mit) at level 0
+ SOFT_TASK_MODEL (met, period) at level 1
+ NRT_TASK_MODEL at level 2
+
+ This file is similar to the configuration of kernel/init/hartik3.c
+
+ TICK is set to 0 (one-shot timer is used)
+*/
+
+/*
+ * Copyright (C) 2000 Paolo Gai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "kernel/kern.h"
+#include "modules/edf.h"
+#include "modules/cbs.h"
+#include "modules/rr.h"
+#include "modules/dummy.h"
+
+#include "modules/sem.h"
+#include "modules/hartport.h"
+#include "modules/cabs.h"
+
+#include "drivers/keyb.h"
+
+
+/*+ sysyem tick in us +*/
+#define TICK 0
+
+/*+ RR tick in us +*/
+#define RRTICK 10000
+
+TIME __kernel_register_levels__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ EDF_register_level(EDF_ENABLE_ALL);
+ CBS_register_level(CBS_ENABLE_ALL, 0);
+ RR_register_level(RRTICK, RR_MAIN_YES, mb);
+ dummy_register_level();
+
+ SEM_register_module();
+
+ CABS_register_module();
+
+ return TICK;
+}
+
+TASK __init__(void *arg)
+{
+ struct multiboot_info *mb = (struct multiboot_info *)arg;
+
+ KEYB_PARMS kparms = BASE_KEYB;
+
+ HARTPORT_init();
+
+ keyb_def_ctrlC(kparms, NULL);
+ keyb_def_map(kparms,itaMap);
+ KEYB_init(&kparms);
+
+ __call_main__(mb);
+
+ return (void *)0;
+}
+
Index: tags/rel_0_5/soccer/calc.h
===================================================================
--- tags/rel_0_5/soccer/calc.h (nonexistent)
+++ tags/rel_0_5/soccer/calc.h (revision 1657)
@@ -0,0 +1,1017 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: calc.h,v 1.1.1.1 2004-05-24 18:03:46 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:46 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/* GIMP header image file format (INDEXED): /mnt/disk/shark/base/images/runup//runup.h */
+
+//static unsigned int runup_width = 27;
+//static unsigned int runup_height = 27;
+
+
+/*Macro che disegan un calciatore che corre*/
+
+#define DIRDRAW(X,Y,D) \
+ for(i=0;i<27;i++)\
+ for(j=0;j<27;j++)\
+ grx_plot(X+i,Y+j,rgb16(cmap[D][0],cmap[D][1],cmap[D][2]));\
+ /* sprintf(a,"%d",f);\
+ grx_text(a,X+30,Y+30, rgb16(255,255,255), rgb16(0,0,0));*/
+/*Macro che calcola i parametri di draw_calc*/
+#define DIREZ(A,C,G,S,F,X,Y) \
+ if(col<12){\
+ if( (A<=S)&&(A>=G)){ \
+ if(C<=4) { \
+ draw_calc(X, Y, F,i); \
+ C++; \
+ } \
+ else if(C>4){ \
+ draw_calc(X,Y,F+1,i); \
+ C++; \
+ if(C==8)C=0; \
+ } \
+ }\
+ }
+
+/* Call this macro repeatedly. After each use, the pixel data can be extracted */
+
+#define HEADER_PIXEL(data,pixel) {\
+pixel[0] = runup_cmap[(unsigned char)data[0]][0]; \
+pixel[1] = runup_data_cmap[(unsigned char)data[0]][1]; \
+pixel[2] = runup_data_cmap[(unsigned char)data[0]][2]; \
+data ++; }
+
+static char cmap[256][3] = {
+ { 0, 0, 0},
+ { 0, 0, 64},
+ { 0, 0,128},
+ { 0, 0,255},
+ { 0, 32, 0},
+ { 0, 32, 64},
+ { 0, 32,128},
+ { 0, 32,255},
+ { 0, 64, 0},
+ { 0, 64, 64},
+ { 0, 64,128},
+ { 0, 64,255},
+ { 0, 96, 0},
+ { 0, 96, 64},
+ { 0, 96,128},
+ { 0, 96,255},
+ { 0,128, 0},
+ { 0,128, 64},
+ { 0,128,128},
+ { 0,128,255},
+ { 0,160, 0},
+ { 0,160, 64},
+ { 0,160,128},
+ { 0,160,255},
+ { 0,192, 0},
+ { 0,192, 64},
+ { 0,192,128},
+ { 0,192,255},
+ { 0,255, 0},
+ { 0,255, 64},
+ { 0,255,128},
+ { 0,255,255},
+ { 32, 0, 0},
+ { 32, 0, 64},
+ { 32, 0,128},
+ { 32, 0,255},
+ { 32, 32, 0},
+ { 32, 32, 64},
+ { 32, 32,128},
+ { 32, 32,255},
+ { 32, 64, 0},
+ { 32, 64, 64},
+ { 32, 64,128},
+ { 32, 64,255},
+ { 32, 96, 0},
+ { 32, 96, 64},
+ { 32, 96,128},
+ { 32, 96,255},
+ { 32,128, 0},
+ { 32,128, 64},
+ { 32,128,128},
+ { 32,128,255},
+ { 32,160, 0},
+ { 32,160, 64},
+ { 32,160,128},
+ { 32,160,255},
+ { 32,192, 0},
+ { 32,192, 64},
+ { 32,192,128},
+ { 32,192,255},
+ { 32,255, 0},
+ { 32,255, 64},
+ { 32,255,128},
+ { 32,255,255},
+ { 64, 0, 0},
+ { 64, 0, 64},
+ { 64, 0,128},
+ { 64, 0,255},
+ { 64, 32, 0},
+ { 64, 32, 64},
+ { 64, 32,128},
+ { 64, 32,255},
+ { 64, 64, 0},
+ { 64, 64, 64},
+ { 64, 64,128},
+ { 64, 64,255},
+ { 64, 96, 0},
+ { 64, 96, 64},
+ { 64, 96,128},
+ { 64, 96,255},
+ { 64,128, 0},
+ { 64,128, 64},
+ { 64,128,128},
+ { 64,128,255},
+ { 64,160, 0},
+ { 64,160, 64},
+ { 64,160,128},
+ { 64,160,255},
+ { 64,192, 0},
+ { 64,192, 64},
+ { 64,192,128},
+ { 64,192,255},
+ { 64,255, 0},
+ { 64,255, 64},
+ { 64,255,128},
+ { 64,255,255},
+ { 96, 0, 0},
+ { 96, 0, 64},
+ { 96, 0,128},
+ { 96, 0,255},
+ { 96, 32, 0},
+ { 96, 32, 64},
+ { 96, 32,128},
+ { 96, 32,255},
+ { 96, 64, 0},
+ { 96, 64, 64},
+ { 96, 64,128},
+ { 96, 64,255},
+ { 96, 96, 0},
+ { 96, 96, 64},
+ { 96, 96,128},
+ { 96, 96,255},
+ { 96,128, 0},
+ { 96,128, 64},
+ { 96,128,128},
+ { 96,128,255},
+ { 96,160, 0},
+ { 96,160, 64},
+ { 96,160,128},
+ { 96,160,255},
+ { 96,192, 0},
+ { 96,192, 64},
+ { 96,192,128},
+ { 96,192,255},
+ { 96,255, 0},
+ { 96,255, 64},
+ { 96,255,128},
+ { 96,255,255},
+ {128, 0, 0},
+ {128, 0, 64},
+ {128, 0,128},
+ {128, 0,255},
+ {128, 32, 0},
+ {128, 32, 64},
+ {128, 32,128},
+ {128, 32,255},
+ {128, 64, 0},
+ {128, 64, 64},
+ {128, 64,128},
+ {128, 64,255},
+ {128, 96, 0},
+ {128, 96, 64},
+ {128, 96,128},
+ {128, 96,255},
+ {128,128, 0},
+ {128,128, 64},
+ {128,128,128},
+ {128,128,255},
+ {128,160, 0},
+ {128,160, 64},
+ {128,160,128},
+ {128,160,255},
+ {128,192, 0},
+ {128,192, 64},
+ {128,192,128},
+ {128,192,255},
+ {128,255, 0},
+ {128,255, 64},
+ {128,255,128},
+ {128,255,255},
+ {160, 0, 0},
+ {160, 0, 64},
+ {160, 0,128},
+ {160, 0,255},
+ {160, 32, 0},
+ {160, 32, 64},
+ {160, 32,128},
+ {160, 32,255},
+ {160, 64, 0},
+ {160, 64, 64},
+ {160, 64,128},
+ {160, 64,255},
+ {160, 96, 0},
+ {160, 96, 64},
+ {160, 96,128},
+ {160, 96,255},
+ {160,128, 0},
+ {160,128, 64},
+ {160,128,128},
+ {160,128,255},
+ {160,160, 0},
+ {160,160, 64},
+ {160,160,128},
+ {160,160,255},
+ {160,192, 0},
+ {160,192, 64},
+ {160,192,128},
+ {160,192,255},
+ {160,255, 0},
+ {160,255, 64},
+ {160,255,128},
+ {160,255,255},
+ {192, 0, 0},
+ {192, 0, 64},
+ {192, 0,128},
+ {192, 0,255},
+ {192, 32, 0},
+ {192, 32, 64},
+ {192, 32,128},
+ {192, 32,255},
+ {192, 64, 0},
+ {192, 64, 64},
+ {192, 64,128},
+ {192, 64,255},
+ {192, 96, 0},
+ {192, 96, 64},
+ {192, 96,128},
+ {192, 96,255},
+ {192,128, 0},
+ {192,128, 64},
+ {192,128,128},
+ {192,128,255},
+ {192,160, 0},
+ {192,160, 64},
+ {192,160,128},
+ {192,160,255},
+ {192,192, 0},
+ {192,192, 64},
+ {192,192,128},
+ {192,192,255},
+ {192,255, 0},
+ {192,255, 64},
+ {192,255,128},
+ {192,255,255},
+ {255, 0, 0},
+ {255, 0, 64},
+ {255, 0,128},
+ {255, 0,255},
+ {255, 32, 0},
+ {255, 32, 64},
+ {255, 32,128},
+ {255, 32,255},
+ {255, 64, 0},
+ {255, 64, 64},
+ {255, 64,128},
+ {255, 64,255},
+ {255, 96, 0},
+ {255, 96, 64},
+ {255, 96,128},
+ {255, 96,255},
+ {255,128, 0},
+ {255,128, 64},
+ {255,128,128},
+ {255,128,255},
+ {255,160, 0},
+ {255,160, 64},
+ {255,160,128},
+ {255,160,255},
+ {255,192, 0},
+ {255,192, 64},
+ {255,192,128},
+ {255,192,255},
+ {255,255, 0},
+ {255,255, 64},
+ {255,255,128},
+ {255,255,255}
+ };
+static char runup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16, 0, 0,16,16,16,16, 0,255, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0,255,233, 0,16,16,16,16, 0,255,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0,233, 0, 0, 0, 0, 0,16, 0,233,233,233,233, 0,233, 0,16,16,16,16,16,16,16,16,16,
+ 16,16, 0, 0,255,255,255,255,255, 0, 0,233, 0,233, 0,233, 0, 0, 0, 0, 0,16,16,16,16,16,16,
+ 16,16, 0,255,255,255,255,255,255, 0, 0, 0,233, 0,233, 0,233, 0,255,255, 0, 0, 0,16,16,16,16,
+ 16,16,16, 0,255,255,255,255,255, 0, 0,233, 0,233, 0, 0, 0, 0,255,255,255,255,255, 0,16,16,16,
+ 16,16,16, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,233, 0, 0, 0,255,255,255,255,255,255, 0,16,16,
+ 16,16,16,16,16, 0, 0, 0, 0,255, 0, 0,233, 0, 0, 0, 0,255,255,255,255,255,255,255, 0, 0,16,
+ 16,16,16,16,16,16,16,16, 0, 0,255, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,233, 0,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,255, 0, 0,16,16, 0, 0,233, 0, 0,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,255, 0,255, 0, 0, 0,233,16,16, 0, 0, 0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0, 0,233,233, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255,255, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,255, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runup2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,255,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233,255, 0,16,16,16,16,0,233,255,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233,0,0,255,255,255,255,255,0,0,16,16,
+ 16,16,16,16,0,0,0,255,255,0,233,0,233,0,233,0,0,0,255,255,255,255,255,255,0,16,16,
+ 16,16,16,0,255,255,255,255,255,0,0,0,0,233,0,233,0,0,255,255,255,255,255,0,16,16,16,
+ 16,16,0,255,255,255,255,255,255,0,0,0,233,0,0,0,0,255,255,255,0,0,0,0,16,16,16,
+ 16,0,0,255,255,255,255,255,255,255,0,0,0,0,233,0,0,255,0,0,0,0,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0,255,255,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0,255,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0,255,0,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runru_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219,255,219,0,8,16,16,16,4,0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219,255,255,219,0,12,16,4,36,36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110,255,255,255,219,4,16,45,219,218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110,255,255,255,41,8,36,182,0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146,255,255,73,0,32,233,242,165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132,132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132,133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0,165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,110,0,0,0,0,0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,255,73,36,0,37,73,255,255,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219,255,255,255,255,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109,255,255,255,255,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4,73,255,255,255,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77,255,238,133,137,48,8,73,255,255,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146,255,255,101,72,16,4,0,73,255,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16,8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16,8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16,16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+ static char runru2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,4,100,137,255,255,255,255,37,73,4,16,12,12,12,12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,4,100,100,73,255,255,255,255,255,110,0,100,68,0,0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,8,32,32,0,73,255,255,255,255,73,64,100,32,165,165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,16,8,8,4,8,73,255,255,73,0,165,133,132,233,233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109,255,37,0,0,132,132,233,233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133,132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,4,109,255,238,68,73,73,73,0,0,64,32,201,0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,4,0,182,255,255,73,110,110,255,110,64,165,0,32,0,73,255,219,0,8,8,8,12,16,16,
+ 16,4,0,0,218,146,77,36,4,37,255,255,110,36,0,146,182,255,255,255,219,0,68,169,0,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219,218,255,255,255,255,219,68,246,77,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0,0,146,110,255,255,255,68,100,4,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12,12,0,0,110,219,219,37,4,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char rundes_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,255,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,255,255,233,0,0,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,255,255,233,0,0,255,255,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0,255,0,0,255,255,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,0,0,0,233, 0,233,233,255,0,255,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,0,0,0, 0,0,0,0,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 255,255,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 255,0,233,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char rundes2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 255,0,233,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 255,255,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,0,0,0, 0,0,0,0,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,0,0,0,233, 0,233,233,255,0,255,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0,255,0,0,255,255,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,255,255,233,0,0,255,255,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,255,255,233,0,0,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,255,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runrd_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16, 16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16, 8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16, 8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146,255,255,101,72,16, 4,0,73,255,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77,255,238,133,137,48, 8,73,255,255,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4, 73,255,255,255,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 255,255,255,255,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219,255, 255,255,255,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,255,73,36,0,37, 73,255,255,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37,255,110,0,0,0,0, 0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0, 165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132, 133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132, 132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146,255,255,73,0,32,233,242, 165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110,255,255,255,41,8,36,182, 0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110,255,255,255,219,4,16,45,219, 218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219,255,255,219,0,12,16,4,36, 36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219,255,219,0,8,16,16,16,4, 0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runrd2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12, 12,0,0,110,219,219,37,4,16,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0, 0,146,110,255,255,255,68,100,4,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219, 218,255,255,255,255,219,68,246,77,16,16,
+ 16,4,0,0,218,146,77,36,4,37,255,255,110,36,0,146, 182,255,255,255,219,0,68,169,0,16,16,
+ 16,16,4,0,182,255,255,73,110,110,255,110,64,165,0,32, 0,73,255,219,0,8,8,8,12,16,16,
+ 16,16,16,4,109,255,238,68,73,73,73,0,0,64,32,201, 0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133, 132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109,255,37,0,0,132,132,233, 233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,8,8,4,8,73,255,255,73,0,165,133,132,233, 233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,8,32,32,0,73,255,255,255,255,73,64,100,32,165, 165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,4,100,100,73,255,255,255,255,255,110,0,100,68,0, 0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,4,100,137,255,255,255,255,37,73,4,16,12,12,12, 12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char rundown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0,255,0,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0,255,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0,255,255,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0,255,255,255,255,255,255,255,0,0,0,0,233,0, 0,255,0,0,0,0,16,16,16,16,16,
+ 16,16,0,255,255,255,255,255,255,0,0,0,233,0,0,0, 0,255,255,255,0,0,0,0,16,16,16,
+ 16,16,16,0,255,255,255,255,255,0,0,0,0,233,0,233, 0,0,255,255,255,255,255,0,16,16,16,
+ 16,16,16,16,0,0,0,255,255,0,233,0,233,0,233,0, 0,0,255,255,255,255,255,255,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0,255,255,255,255,255,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233,255, 0,16,16,16,16,0,233,255,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 255,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char rundown2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,233,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,255,0,255,0,0,0,233,16,16,0,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,255,255,255,0,255,0,0,16,16,0,0,233,0,0,16,
+ 16,16,16,16,16,16,16,16,0,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0,233,0,16,
+ 16,16,16,16,16,0,0,0,0,255,0,0,233,0,0,0,0,255,255,255,255,255,255,255,0,0,16,
+ 16,16,16,0,0,0,0,255,255,255,0,0,0,0,233,0,0,0,255,255,255,255,255,255,0,16,16,
+ 16,16,16,0,255,255,255,255,255,0,0,233,0,233,0,0,0,0,255,255,255,255,255,0,16,16,16,
+ 16,16,0,255,255,255,255,255,255,0,0,0,233,0,233,0,233,0,255,255,0,0,0,16,16,16,16,
+ 16,16,0,0,255,255,255,255,255,0,0,233,0,233,0,233,0,0,0,0,0,16,16,16,16,16,16,
+ 16,16,0,233,0,0,0,0,0,16,0,233,233,233,233,0,233,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0,255,233,0,16,16,16,16,0,255,233,233,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,16,16,16,16,0,255,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char runld_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110,255,73,0,4,16,72,101,255,255, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182,255,255,73,8,48,137,133,238,255, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218,255,255,255,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37,255,255,255,255,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,255,255,255,255,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73,255,255,73,37,0,36,73,255, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 255,255,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41,255, 255,255,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 255,255,255,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219,255,255,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219,255,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runld2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,4,100,68,255,255,255,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,77,246,68,219,255,255,255,255,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,0,169,68,0,219,255,255,255,182,146,0,36,110,255, 255,37,4,36,77,146,218,0,0,4,16,
+ 16,16,12,8,8,8,0,219,255,73,0,32,0,165,64,110, 255,110,110,73,255,255,182,0,4,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238,255,109,4,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37,255,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73,255,255,73,8,4,8,8,16,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 255,255,255,255,73,0,32,32,8,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 255,255,255,255,255,73,100,100,4,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37,255,255,255,255,137,100,4,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,233, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,255,255,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,16, 233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,0, 0,233,255,255,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0,255,255,0, 0,233,255,255,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0,255,255, 0,0,255,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 255,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,255,0,255,233,233,0,233,0,0,0,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,0,0,0,0,0,0,0,255,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0,255,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,255,255,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0,255,255,255,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,255,233,0,255,0,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runleft2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,255,233,0,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,255,0,0,0,0,0,0,0,255,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,255,0,255,233,233,0,233,0,0,0,255,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0,255,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0,255,255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0,255,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0,255,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0,255,255,0,0,255,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0,255,255,0,0,233,255,255,255,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,0,0,233,255,255,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,255,255,255,255,0,16,233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,255,255,255,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,0,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,0,233,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char runlu_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219,255,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219,255,255,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 255,255,255,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41,255, 255,255,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 255,255,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73,255,255,73,37,0,36,73,255, 255,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,255,255,255,255,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37,255,255,255,255,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218,255,255,255,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182,255,255,73,8,48,137,133,238,255, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110,255,73,0,4,16,72,101,255,255, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char runlu2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37,255,255,255,255,137,100,4,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110,255,255,255,255,255,73,100,100,4,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73,255,255,255,255,73,0,32,32,8,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73,255,255,73,8,4,8,8,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37,255,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238,255,109,4,16,16,16,
+ 16,16,12,8,8,8,0,219,255,73,0,32,0,165,64,110, 255,110,110,73,255,255,182,0,4,16,16,
+ 16,16,0,169,68,0,219,255,255,255,182,146,0,36,110,255, 255,37,4,36,77,146,218,0,0,4,16,
+ 16,16,77,246,68,219,255,255,255,255,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,4,100,68,255,255,255,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+/*static char calcdes_data[] = {
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0,255, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0,255,255, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0,255, 0, 0, 0, 0,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0,255, 0, 0,233, 0,233, 0,233,233,255, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0,233, 0,233, 0,233,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0, 0,233, 0,233, 0,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0,255,255, 0, 0, 0, 0, 0,233, 0,233, 0, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0,255, 0, 0, 0,233, 0, 0,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 0,255,255, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0,255,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0,255,255,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0,255, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char calcdown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,255,0,0,0,0, 0,0,255,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,255,255,255,0,0,0,0, 0,0,255,255,0,0,0,16,16,16,16,
+ 16,16,16,16,16,0,255,255,255,255,255,0,0,0,0,0, 233,0,0,255,255,255,255,0,16,16,16,
+ 16,16,16,16,0,0,255,255,255,255,255,0,233,0,0,233, 0,0,0,255,255,255,255,0,0,16,16,
+ 16,16,16,16,0,255,255,255,255,255,255,0,0,0,233,0, 233,233,0,255,255,255,255,255,0,16,16,
+ 16,16,16,16,0,0,255,0,255,255,255,0,0,233,0,233, 0,233,0,255,255,0,255,0,0,16,16,
+ 16,16,16,16,0,233,0,16,0,255,255,0,233,0,233,0, 233,233,0,255,0,16,0,233,0,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char calcleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,233,233,0,0, 0,0,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,255,233,233,0,233,0,233, 0,0,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,233,0,233,0,233,0, 0,0,255,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,0,233,0,233,0,0, 0,0,255,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,233,0,233,0,0,0, 0,0,255,255,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,0,0,233,0, 0,0,255,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 255,255,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,255,255,255,255,255, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,255,255,255,255, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0,255,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char calcup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 255,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,0,233,0,16,0,255,255,0,233,0,233,0, 233,233,0,255,0,16,0,233,0,16,16,
+ 16,16,16,16,0,0,255,0,255,255,255,0,0,233,0,233, 0,233,0,255,255,0,255,0,0,16,16,
+ 16,16,16,16,0,255,255,255,255,255,255,0,0,0,233,0, 233,233,0,255,255,255,255,255,0,16,16,
+ 16,16,16,16,0,0,255,255,255,255,255,0,233,0,0,233, 0,0,0,255,255,255,255,0,0,16,16,
+ 16,16,16,16,16,0,255,255,255,255,255,0,0,0,0,0, 233,0,0,255,255,255,255,0,16,16,16,
+ 16,16,16,16,16,16,0,0,0,255,255,255,0,0,0,0, 0,0,255,255,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,255,255,0,0,0,0, 0,0,255,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,255,255,255,255, 255,255,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,255,255,255, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ }; */
+static char portsx_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,220,220,220, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,220,220,220,220, 220,220,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,220,220,0,0,0,0, 0,0,220,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,220,220,220,0,0,0,0, 0,0,220,220,0,0,0,16,16,16,16,
+ 16,16,16,16,16,0,220,220,220,220,220,0,0,0,0,0, 233,0,0,220,220,220,220,0,16,16,16,
+ 16,16,16,16,0,0,220,220,220,220,220,0,233,0,0,233, 0,0,0,220,220,220,220,0,0,16,16,
+ 16,16,16,16,0,220,220,220,220,220,220,0,0,0,233,0, 233,233,0,220,220,220,220,220,0,16,16,
+ 16,16,16,16,0,0,220,0,220,220,220,0,0,233,0,233, 0,233,0,220,220,0,220,0,0,16,16,
+ 16,16,16,16,0,233,0,16,0,220,220,0,233,0,233,0, 233,233,0,220,0,16,0,233,0,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 220,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char portdx_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 130,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,0,233,0,16,0,130,130,0,233,0,233,0, 233,233,0,130,0,16,0,233,0,16,16,
+ 16,16,16,16,0,0,130,0,130,130,130,0,0,233,0,233, 0,233,0,130,130,0,130,0,0,16,16,
+ 16,16,16,16,0,130,130,130,130,130,130,0,0,0,233,0, 233,233,0,130,130,130,130,130,0,16,16,
+ 16,16,16,16,0,0,130,130,130,130,130,0,233,0,0,233, 0,0,0,130,130,130,130,0,0,16,16,
+ 16,16,16,16,16,0,130,130,130,130,130,0,0,0,0,0, 233,0,0,130,130,130,130,0,16,16,16,
+ 16,16,16,16,16,16,0,0,0,130,130,130,0,0,0,0, 0,0,130,130,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,130,130,0,0,0,0, 0,0,130,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,130,130,130,130, 130,130,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,130,130,130, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+
Index: tags/rel_0_5/soccer/stadio.h
===================================================================
--- tags/rel_0_5/soccer/stadio.h (nonexistent)
+++ tags/rel_0_5/soccer/stadio.h (revision 1657)
@@ -0,0 +1,8435 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: stadio.h,v 1.1.1.1 2004-05-24 18:03:46 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:46 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+static unsigned int faro_width = 100;
+static unsigned int faro_height = 100;
+static unsigned int scale_width = 150;
+static unsigned int scale_height = 100;
+static unsigned int schermo_width = 300;
+static unsigned int schermo_height = 100;
+
+
+static char stadio_cmap[256][3] = {
+ { 0, 0, 0},
+ { 0, 0, 51},
+ { 0, 0,102},
+ { 0, 0,153},
+ { 0, 0,204},
+ { 0, 0,255},
+ { 51, 0, 0},
+ { 51, 0, 51},
+ { 51, 0,102},
+ { 51, 0,153},
+ { 51, 0,204},
+ { 51, 0,255},
+ {102, 0, 0},
+ {102, 0, 51},
+ {102, 0,102},
+ {102, 0,153},
+ {102, 0,204},
+ {102, 0,255},
+ {153, 0, 0},
+ {153, 0, 51},
+ {153, 0,102},
+ {153, 0,153},
+ {153, 0,204},
+ {153, 0,255},
+ {204, 0, 0},
+ {204, 0, 51},
+ {204, 0,102},
+ {204, 0,153},
+ {204, 0,204},
+ {204, 0,255},
+ {255, 0, 0},
+ {255, 0, 51},
+ {255, 0,102},
+ {255, 0,153},
+ {255, 0,204},
+ {255, 0,255},
+ { 0, 51, 0},
+ { 0, 51, 51},
+ { 0, 51,102},
+ { 0, 51,153},
+ { 0, 51,204},
+ { 0, 51,255},
+ { 51, 51, 0},
+ { 51, 51, 51},
+ { 51, 51,102},
+ { 51, 51,153},
+ { 51, 51,204},
+ { 51, 51,255},
+ {102, 51, 0},
+ {102, 51, 51},
+ {102, 51,102},
+ {102, 51,153},
+ {102, 51,204},
+ {102, 51,255},
+ {153, 51, 0},
+ {153, 51, 51},
+ {153, 51,102},
+ {153, 51,153},
+ {153, 51,204},
+ {153, 51,255},
+ {204, 51, 0},
+ {204, 51, 51},
+ {204, 51,102},
+ {204, 51,153},
+ {204, 51,204},
+ {204, 51,255},
+ {255, 51, 0},
+ {255, 51, 51},
+ {255, 51,102},
+ {255, 51,153},
+ {255, 51,204},
+ {255, 51,255},
+ { 0,102, 0},
+ { 0,102, 51},
+ { 0,102,102},
+ { 0,102,153},
+ { 0,102,204},
+ { 0,102,255},
+ { 51,102, 0},
+ { 51,102, 51},
+ { 51,102,102},
+ { 51,102,153},
+ { 51,102,204},
+ { 51,102,255},
+ {102,102, 0},
+ {102,102, 51},
+ {102,102,102},
+ {102,102,153},
+ {102,102,204},
+ {102,102,255},
+ {153,102, 0},
+ {153,102, 51},
+ {153,102,102},
+ {153,102,153},
+ {153,102,204},
+ {153,102,255},
+ {204,102, 0},
+ {204,102, 51},
+ {204,102,102},
+ {204,102,153},
+ {204,102,204},
+ {204,102,255},
+ {255,102, 0},
+ {255,102, 51},
+ {255,102,102},
+ {255,102,153},
+ {255,102,204},
+ {255,102,255},
+ { 0,153, 0},
+ { 0,153, 51},
+ { 0,153,102},
+ { 0,153,153},
+ { 0,153,204},
+ { 0,153,255},
+ { 51,153, 0},
+ { 51,153, 51},
+ { 51,153,102},
+ { 51,153,153},
+ { 51,153,204},
+ { 51,153,255},
+ {102,153, 0},
+ {102,153, 51},
+ {102,153,102},
+ {102,153,153},
+ {102,153,204},
+ {102,153,255},
+ {153,153, 0},
+ {153,153, 51},
+ {153,153,102},
+ {153,153,153},
+ {153,153,204},
+ {153,153,255},
+ {204,153, 0},
+ {204,153, 51},
+ {204,153,102},
+ {204,153,153},
+ {204,153,204},
+ {204,153,255},
+ {255,153, 0},
+ {255,153, 51},
+ {255,153,102},
+ {255,153,153},
+ {255,153,204},
+ {255,153,255},
+ { 0,204, 0},
+ { 0,204, 51},
+ { 0,204,102},
+ { 0,204,153},
+ { 0,204,204},
+ { 0,204,255},
+ { 51,204, 0},
+ { 51,204, 51},
+ { 51,204,102},
+ { 51,204,153},
+ { 51,204,204},
+ { 51,204,255},
+ {102,204, 0},
+ {102,204, 51},
+ {102,204,102},
+ {102,204,153},
+ {102,204,204},
+ {102,204,255},
+ {153,204, 0},
+ {153,204, 51},
+ {153,204,102},
+ {153,204,153},
+ {153,204,204},
+ {153,204,255},
+ {204,204, 0},
+ {204,204, 51},
+ {204,204,102},
+ {204,204,153},
+ {204,204,204},
+ {204,204,255},
+ {255,204, 0},
+ {255,204, 51},
+ {255,204,102},
+ {255,204,153},
+ {255,204,204},
+ {255,204,255},
+ { 0,255, 0},
+ { 0,255, 51},
+ { 0,255,102},
+ { 0,255,153},
+ { 0,255,204},
+ { 0,255,255},
+ { 51,255, 0},
+ { 51,255, 51},
+ { 51,255,102},
+ { 51,255,153},
+ { 51,255,204},
+ { 51,255,255},
+ {102,255, 0},
+ {102,255, 51},
+ {102,255,102},
+ {102,255,153},
+ {102,255,204},
+ {102,255,255},
+ {153,255, 0},
+ {153,255, 51},
+ {153,255,102},
+ {153,255,153},
+ {153,255,204},
+ {153,255,255},
+ {204,255, 0},
+ {204,255, 51},
+ {204,255,102},
+ {204,255,153},
+ {204,255,204},
+ {204,255,255},
+ {255,255, 0},
+ {255,255, 51},
+ {255,255,102},
+ {255,255,153},
+ {255,255,204},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255},
+ {255,255,255}
+ };
+static char farod_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,0,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,0,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,173,173,173,173,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,0,0,173,173,173,173,0,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,0,0,173,173,173,173,0,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,102,102,0,0,173,173,173,173,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,0,102,102,0,0,173,173,173,173,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,0,102,102,0,0,173,173,173,
+ 173,0,90,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,102,102,102,0,0,90,90,
+ 173,90,0,90,108,108,0,0,0,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,0,102,102,102,0,0,90,
+ 90,0,90,90,90,0,0,0,0,0,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,0,102,102,102,0,0,
+ 90,90,0,90,0,0,0,90,90,0,0,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,0,102,102,102,0,
+ 0,90,90,0,0,0,90,90,90,90,0,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,0,102,102,102,
+ 0,0,90,0,0,90,90,90,90,90,90,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,0,102,102,
+ 102,0,0,0,0,90,90,90,90,90,90,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,0,102,
+ 102,102,0,0,0,90,90,90,90,90,90,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,6,6,6,6,6,6,6,0,
+ 102,102,90,0,0,0,90,90,90,90,0,0,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,197,210,210,210,210,210,210,210,
+ 0,102,102,0,0,0,0,0,0,0,0,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,197,210,210,210,210,210,210,
+ 210,0,102,102,0,0,0,0,0,0,0,90,90,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,197,215,210,210,210,210,
+ 210,210,0,102,102,0,0,0,0,0,0,90,90,90,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,197,215,210,210,210,
+ 210,210,210,0,102,102,0,0,0,90,90,0,90,90,90,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,197,215,210,210,
+ 210,210,210,210,0,102,102,0,0,0,90,90,0,90,90,90,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,197,215,210,
+ 210,210,210,210,6,0,102,102,0,0,0,90,90,0,90,90,
+ 90,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,197,215,
+ 210,210,210,210,6,11,0,102,102,0,0,0,90,90,0,90,
+ 90,90,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,197,
+ 215,210,210,210,6,11,11,0,102,102,0,0,0,90,90,0,
+ 90,90,90,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 197,210,210,210,6,11,11,11,0,102,102,0,0,0,90,90,
+ 0,90,90,90,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,197,210,210,6,11,11,11,11,0,102,102,0,0,0,90,
+ 90,0,90,90,90,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,197,210,6,11,11,11,11,11,0,102,102,0,0,0,
+ 90,90,0,90,90,90,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,197,6,11,11,11,11,11,11,0,102,102,0,0,
+ 0,90,90,0,90,90,90,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,0,102,102,0,
+ 0,0,90,90,0,90,90,90,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,102,102,
+ 0,0,0,90,90,0,90,90,90,108,108,108,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,102,
+ 102,0,0,0,90,90,0,90,90,90,108,0,0,0,0,0,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
+ 102,102,0,0,0,90,90,0,90,90,0,0,0,90,90,0,
+ 0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,102,102,0,0,0,90,90,0,0,0,0,90,90,90,90,
+ 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,0,102,102,0,0,0,90,0,0,0,90,90,90,90,90,
+ 90,0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,0,102,102,0,0,0,0,0,90,90,90,90,90,90,
+ 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,6,6,6,
+ 6,6,6,0,102,102,0,0,0,0,90,90,90,90,90,90,
+ 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,197,210,210,
+ 210,210,210,210,0,102,102,0,0,0,90,90,90,90,90,90,
+ 90,90,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,197,210,
+ 210,210,210,210,210,0,102,102,0,0,0,90,90,90,90,90,
+ 90,0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,197,
+ 210,210,210,210,210,210,0,102,102,0,0,0,90,90,90,90,
+ 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 197,210,210,210,210,210,210,0,102,102,0,0,0,0,0,0,
+ 0,0,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,197,210,210,210,210,210,210,0,102,102,0,0,0,0,0,
+ 0,0,173,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,197,210,210,210,210,210,210,0,102,102,0,0,0,90,
+ 90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,197,210,210,210,210,210,210,0,102,102,0,0,0,
+ 90,90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,197,210,210,210,210,210,6,0,102,102,102,102,
+ 0,90,173,173,173,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,197,210,210,210,210,6,11,0,102,102,102,
+ 102,0,173,173,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,197,210,210,210,6,11,11,0,102,102,
+ 102,102,0,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,197,210,210,6,11,11,11,0,102,
+ 102,102,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,197,210,6,11,11,11,11,0,
+ 102,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,197,6,11,11,11,11,11,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,0,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,211,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,11,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,211,211,
+ 211,211,211,211,211,211,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,104,104,211,211,
+ 211,211,211,211,211,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,104,104,104,104,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,104,104,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108
+ };
+static char faros_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,0,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,173,173,173,173,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,0,173,173,173,173,0,0,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,0,173,173,173,173,0,0,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,173,173,173,173,0,0,102,102,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,173,173,173,173,0,0,102,102,0,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,90,0,173,173,173,173,0,0,102,102,0,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,0,0,0,108,108,
+ 90,0,90,173,90,90,0,0,102,102,102,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,0,0,0,0,0,90,
+ 90,90,0,90,90,0,0,102,102,102,0,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,0,0,90,90,0,0,0,
+ 90,0,90,90,0,0,102,102,102,0,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,0,90,90,90,90,0,0,
+ 0,90,90,0,0,102,102,102,0,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
+ 0,90,0,0,102,102,102,0,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
+ 0,0,0,102,102,102,0,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,90,90,90,90,90,90,0,
+ 0,0,102,102,102,0,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,0,0,90,90,90,90,0,0,
+ 0,90,102,102,0,6,6,6,6,6,6,6,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,0,0,0,0,0,0,0,
+ 0,102,102,0,210,210,210,210,210,210,210,197,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,90,90,0,0,0,0,0,0,0,
+ 102,102,0,210,210,210,210,210,210,210,197,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,90,90,90,0,0,0,0,0,0,102,
+ 102,0,210,210,210,210,210,210,215,197,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,90,90,90,0,90,90,0,0,0,102,102,
+ 0,210,210,210,210,210,210,215,197,11,11,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,90,90,90,0,90,90,0,0,0,102,102,0,
+ 210,210,210,210,210,210,215,197,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,90,90,90,0,90,90,0,0,0,102,102,0,6,
+ 210,210,210,210,210,215,197,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,90,90,90,0,90,90,0,0,0,102,102,0,11,6,
+ 210,210,210,210,215,197,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,90,90,90,0,90,90,0,0,0,102,102,0,11,11,6,
+ 210,210,210,215,197,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 90,90,90,0,90,90,0,0,0,102,102,0,11,11,11,6,
+ 210,210,210,197,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,90,
+ 90,90,0,90,90,0,0,0,102,102,0,11,11,11,11,6,
+ 210,210,197,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,90,90,
+ 90,0,90,90,0,0,0,102,102,0,11,11,11,11,11,6,
+ 210,197,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,90,90,90,
+ 0,90,90,0,0,0,102,102,0,11,11,11,11,11,11,6,
+ 197,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,90,90,90,0,
+ 90,90,0,0,0,102,102,0,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,0,0,0,108,108,108,90,90,90,0,90,
+ 90,0,0,0,102,102,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,0,0,0,0,0,108,90,90,90,0,90,90,
+ 0,0,0,102,102,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,0,0,90,90,0,0,0,90,90,0,90,90,0,
+ 0,0,102,102,0,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,0,0,90,90,90,90,0,0,0,0,90,90,0,0,
+ 0,102,102,0,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,0,90,90,90,90,90,90,0,0,0,90,0,0,0,
+ 102,102,0,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,90,90,90,90,90,90,90,90,0,0,0,0,0,102,
+ 102,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,90,90,90,90,90,90,90,90,0,0,0,0,102,102,
+ 0,6,6,6,6,6,6,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,90,90,90,90,90,90,90,90,0,0,0,102,102,0,
+ 210,210,210,210,210,210,197,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,0,90,90,90,90,90,90,0,0,0,102,102,0,210,
+ 210,210,210,210,210,197,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,0,0,90,90,90,90,0,0,0,102,102,0,210,210,
+ 210,210,210,210,197,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,0,0,0,0,0,0,0,0,102,102,0,210,210,210,
+ 210,210,210,197,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,173,0,0,0,0,0,0,0,102,102,0,210,210,210,210,
+ 210,210,197,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 173,173,173,90,90,0,0,0,102,102,0,210,210,210,210,210,
+ 210,197,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,173,
+ 173,173,90,90,0,0,0,102,102,0,210,210,210,210,210,210,
+ 197,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,173,
+ 173,173,90,0,102,102,102,102,0,6,210,210,210,210,210,197,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 173,173,0,102,102,102,102,0,11,6,210,210,210,210,197,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,102,102,102,102,0,11,11,6,210,210,210,197,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,102,102,102,0,11,11,11,6,210,210,197,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,102,0,11,11,11,11,6,210,197,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,11,11,11,11,11,6,197,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,211,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,211,211,211,211,211,211,211,211,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,
+ 104,211,211,211,211,211,211,211,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,0,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,
+ 104,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,104,
+ 104,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,104,
+ 104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108
+};
+static char scale_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,
+ 176,176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,
+ 176,176,176,176,176,11,11,11,11,176,176,176,176,176,176,176,
+ 176,176,11,11,11,11,176,176,176,176,176,176,176,176,176,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,176,176,176,176,176,176,176,176,176,
+ 11,11,11,11,176,176,176,176,176,176,176,176,176,11,11,11,
+ 11,176,176,176,176,176,176,176,176,176,11,11,11,11,176,176,
+ 176,176,176,176,176,176,176,11,11,11,11,176,176,176,176,176,
+ 176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,
+ 176,176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,
+ 176,176,176,176,176,0,11,11,0,176,176,176,176,176,176,176,
+ 176,176,0,11,11,0,176,176,176,176,176,176,176,176,176,0,
+ 11,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,11,0,176,176,176,176,176,176,176,176,176,
+ 0,11,11,0,176,176,176,176,176,176,176,176,176,0,11,11,
+ 0,176,176,176,176,176,176,176,176,176,0,11,11,0,176,176,
+ 176,176,176,176,176,176,176,0,11,11,0,176,176,176,176,176,
+ 176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,
+ 0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,
+ 0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,
+ 0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,0,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,0,0,0,0,0,0,0,0,0,0,
+ 0,11,11,0,0,0,0,0,0,0,0,0,0,0,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,
+ 0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,
+ 0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,38,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,38,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108
+};
+static char schermo_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108
+};
+/*
+static char goal2_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,215,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,215,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,215,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,181,215,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,215,181,
+ 181,181,181,181,215,215,181,181,181,181,181,181,181,181,215,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,215,215,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,215,181,
+ 181,181,181,181,215,181,215,181,181,181,181,181,181,181,181,181,
+ 215,215,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,215,215,215,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
+ 181,181,181,181,215,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,215,215,215,181,215,215,215,215,181,181,215,0,0,0,
+ 0,0,0,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
+ 181,181,181,181,181,215,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,215,181,181,181,215,0,0,215,215,215,
+ 215,215,215,0,0,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,215,215,215,215,
+ 215,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 215,181,181,181,181,215,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,215,0,0,215,215,215,0,215,
+ 215,215,215,215,215,0,0,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,215,215,215,215,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 215,181,181,181,181,181,215,181,181,181,215,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,0,215,0,215,215,0,0,0,
+ 215,215,0,215,215,215,215,0,215,215,215,215,215,215,181,215,
+ 181,181,181,215,215,215,215,215,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,215,181,181,181,181,215,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,0,0,0,0,215,0,0,0,
+ 215,0,0,0,215,215,215,0,181,181,181,181,181,181,215,215,
+ 215,215,215,215,215,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,215,181,181,181,181,215,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,0,215,0,0,0,215,0,0,0,
+ 215,0,0,0,215,215,0,215,0,181,215,215,215,215,181,181,
+ 215,181,181,181,181,215,215,215,215,215,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,215,181,181,181,181,215,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,0,215,0,0,0,215,215,0,215,
+ 215,0,0,0,215,0,0,0,0,215,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,215,215,215,215,215,215,
+ 215,215,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,0,215,215,215,0,215,215,215,215,215,
+ 215,215,0,215,215,0,0,0,215,0,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,215,215,215,215,215,215,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,215,181,181,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,0,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,0,0,0,215,0,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,0,215,215,215,215,0,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,215,181,181,181,0,215,215,0,215,215,215,215,215,215,
+ 215,215,215,215,215,215,0,215,215,0,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,215,
+ 215,215,215,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,215,215,215,0,215,0,0,0,215,215,215,215,215,
+ 0,215,215,215,215,215,215,215,215,0,215,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,
+ 215,215,215,181,215,181,0,215,0,0,0,215,215,215,215,0,
+ 0,0,215,215,215,215,215,215,215,0,181,215,215,215,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,0,215,0,0,0,215,215,215,215,0,
+ 0,0,215,215,0,215,215,215,215,0,181,181,181,181,215,215,
+ 181,181,181,215,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,0,215,215,215,215,215,0,
+ 0,0,215,0,0,0,215,215,0,181,181,181,181,181,181,181,
+ 215,215,181,181,215,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,215,215,215,0,215,215,
+ 0,215,215,0,0,0,215,215,0,181,181,181,181,181,181,181,
+ 181,181,215,215,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,0,215,215,215,0,0,0,215,
+ 215,215,215,0,0,0,215,0,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,0,215,215,215,215,0,215,215,215,215,215,215,215,
+ 215,215,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,0,215,215,215,0,0,0,215,
+ 215,215,215,215,0,215,215,0,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,181,215,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,0,0,215,0,0,0,215,
+ 215,215,215,215,215,0,0,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 181,215,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,0,0,0,215,215,
+ 215,215,215,0,0,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,0,0,0,
+ 0,0,0,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 181,215,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,181,215,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,215,215,0,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,0,215,215,215,215,0,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,0,0,0,0,215,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,215,215,0,215,215,215,215,0,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,0,215,215,215,215,0,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+ 215,215,215,215,215,215,215,215,215,215,215,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,215,215,215,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,215,0,0,0,0,0,0,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,215,215,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,215,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,215,215,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 215,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,215,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,215,215,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,215,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,215,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+ 181,181,181,181,181,181,181,181,181,181,181,181,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108
+};
+*/
+static char goal1_data[] = {
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+ 102,102,102,102,102,102,102,102,102,102,102,102,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,204,204,204,204,204,204,204,204,
+ 204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,0,0,0,0,0,0,0,0,0,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,0,0,0,0,0,0,0,0,0,0,0,0,204,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,
+ 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,204,204,204,204,204,204,204,204,204,204,
+ 204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,204,204,204,204,204,204,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,176,176,176,176,176,176,176,176,176,11,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 11,176,176,176,176,176,176,176,176,176,11,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,176,176,176,176,176,176,176,176,176,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,176,176,176,176,176,176,176,176,176,0,11,
+ 11,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 0,0,0,0,0,0,0,0,0,0,0,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+ 38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,38,38,38,38,38,38,38,38,
+ 38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,
+ 108,108,108,108,108,108,108,108,108,108,108,108
+ };
+
+
+
+
+
+
+
+
Index: tags/rel_0_5/soccer/calc2.h
===================================================================
--- tags/rel_0_5/soccer/calc2.h (nonexistent)
+++ tags/rel_0_5/soccer/calc2.h (revision 1657)
@@ -0,0 +1,693 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: calc2.h,v 1.1.1.1 2004-05-24 18:03:46 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:46 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/* GIMP header image file format (INDEXED): /mnt/disk/shark/base/images/runup//runup.h */
+static char B_runup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16, 0, 0,16,16,16,16, 0, 35, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0, 35,233, 0,16,16,16,16, 0, 35,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16, 0,233, 0, 0, 0, 0, 0,16, 0,233,233,233,233, 0,233, 0,16,16,16,16,16,16,16,16,16,
+ 16,16, 0, 0, 35, 35, 35, 35, 35, 0, 0,233, 0,233, 0,233, 0, 0, 0, 0, 0,16,16,16,16,16,16,
+ 16,16, 0, 35, 35, 35, 35, 35, 35, 0, 0, 0,233, 0,233, 0,233, 0, 35, 35, 0, 0, 0,16,16,16,16,
+ 16,16,16, 0, 35, 35, 35, 35, 35, 0, 0,233, 0,233, 0, 0, 0, 0, 35, 35, 35, 35, 35, 0,16,16,16,
+ 16,16,16, 0, 0, 0, 0, 35, 35, 35, 0, 0, 0, 0,233, 0, 0, 0, 35, 35, 35, 35, 35, 35, 0,16,16,
+ 16,16,16,16,16, 0, 0, 0, 0, 35, 0, 0,233, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0,16,
+ 16,16,16,16,16,16,16,16, 0, 0, 35, 0, 0, 0, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0,233, 0,16,
+ 16,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0, 35, 0, 0,16,16, 0, 0,233, 0, 0,16,
+ 16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 35, 0, 35, 0, 0, 0,233,16,16, 0, 0, 0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0, 0,233,233, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 35, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 35, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runup2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 35,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 35, 0,16,16,16,16,0,233, 35,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233,0,0, 35, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,0,0,0, 35, 35,0,233,0,233,0,233,0,0,0, 35, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,233,0,233,0,0, 35, 35, 35, 35, 35,0,16,16,16,
+ 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,0,0,0, 35, 35, 35,0,0,0,0,16,16,16,
+ 16,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,0,0,233,0,0, 35,0,0,0,0,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0, 35, 35,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0, 35,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0, 35,0, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runru_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219, 35,219,0,8,16,16,16,4,0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219, 35, 35,219,0,12,16,4,36,36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110, 35, 35, 35,219,4,16,45,219,218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110, 35, 35, 35,41,8,36,182,0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146, 35, 35,73,0,32,233,242,165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233,233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132,132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132,133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0,165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35,110,0,0,0,0,0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35, 35,73,36,0,37,73, 35, 35,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219, 35, 35, 35, 35,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 35, 35, 35, 35,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4,73, 35, 35, 35,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77, 35,238,133,137,48,8,73, 35, 35,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146, 35, 35,101,72,16,4,0,73, 35,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16,8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16,8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16,16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+ static char B_runru2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,4,100,137, 35, 35, 35, 35,37,73,4,16,12,12,12,12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,4,100,100,73, 35, 35, 35, 35, 35,110,0,100,68,0,0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,8,32,32,0,73, 35, 35, 35, 35,73,64,100,32,165,165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,16,8,8,4,8,73, 35, 35,73,0,165,133,132,233,233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109, 35,37,0,0,132,132,233,233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133,132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,4,109, 35,238,68,73,73,73,0,0,64,32,201,0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,4,0,182, 35, 35,73,110,110, 35,110,64,165,0,32,0,73, 35,219,0,8,8,8,12,16,16,
+ 16,4,0,0,218,146,77,36,4,37, 35, 35,110,36,0,146,182, 35, 35, 35,219,0,68,169,0,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219,218, 35, 35, 35, 35,219,68,246,77,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0,0,146,110, 35, 35, 35,68,100,4,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12,12,0,0,110,219,219,37,4,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_rundes_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35, 35,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0, 35, 35,233,0,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35, 35, 35,233,0,0, 35, 35,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0, 35,0,0, 35, 35,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35,0,0,0,233, 0,233,233, 35,0, 35,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35,0,0,0, 0,0,0,0, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35,0,233, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_rundes2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35,0,233, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35,0, 0,0,16,16,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35,0,0,0, 0,0,0,0, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35,0,0,0,233, 0,233,233, 35,0, 35,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,233,0,0, 233,0,233,233,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35,0,0,0,233, 0,233,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,0,233,0, 233,0,233,233,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 0,233,0,0,0,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,0, 35,0,0, 35, 35,0,0,0, 233,0,233,0,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35, 35, 35,233,0,0, 35, 35,0,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0, 35, 35,233,0,0,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,0,0,0,233,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35, 35,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runrd_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,0,4,16,16,16,16, 16,8,4,4,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,4,16,16,16, 8,32,100,100,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,36,218,182,109,4,16,16, 8,32,100,137,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,4,146, 35, 35,101,72,16, 4,0,73, 35,110,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,77, 35,238,133,137,48, 8,73, 35, 35,182,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,36,73,68,0,0,4, 73, 35, 35, 35,218,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,4,110,73,110,146,109, 35, 35, 35, 35,37,8,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,37,110,73,219,219, 35, 35, 35, 35,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35, 35,73,36,0,37, 73, 35, 35,73,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,37, 35,110,0,0,0,0, 0,73,110,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,110,64,0,132,100,0, 165,64,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,146,36,165,64,100,100,132, 133,100,100,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,146,0,0,32,100,32,132, 132,32,68,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,219,146,32,201,133,132,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,218,182,0,0,132,133,233, 233,165,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,0,146, 35, 35,73,0,32,233,242, 165,0,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,0,110, 35, 35, 35,41,8,36,182, 0,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,110, 35, 35, 35,219,4,16,45,219, 218,73,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,219, 35, 35,219,0,12,16,4,36, 36,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,219, 35,219,0,8,16,16,16,4, 0,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37,68,68,68,8,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,100,246,169,8,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,77,0,12,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runrd2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,8,4,0,8,8,16,16,16,16,
+ 16,16,12,16,16,16,16,16,16,16,16,16,12,12,16,12, 12,0,0,110,219,219,37,4,16,16,16,
+ 16,8,0,0,4,12,16,16,16,16,8,8,0,0,0,0, 0,146,110, 35, 35, 35,68,100,4,16,16,
+ 12,0,0,0,36,4,12,12,16,4,37,37,219,146,146,219, 218, 35, 35, 35, 35,219,68,246,77,16,16,
+ 16,4,0,0,218,146,77,36,4,37, 35, 35,110,36,0,146, 182, 35, 35, 35,219,0,68,169,0,16,16,
+ 16,16,4,0,182, 35, 35,73,110,110, 35,110,64,165,0,32, 0,73, 35,219,0,8,8,8,12,16,16,
+ 16,16,16,4,109, 35,238,68,73,73,73,0,0,64,32,201, 0,0,41,4,12,16,16,16,16,16,16,
+ 16,16,16,16,4,101,133,0,110,219,36,0,132,100,100,133, 132,32,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,72,137,0,146,219,0,0,100,100,32,132, 133,233,36,45,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,48,4,109, 35,37,0,0,132,132,233, 233,242,182,219,36,4,16,16,16,16,16,
+ 16,16,16,8,8,4,8,73, 35, 35,73,0,165,133,132,233, 233,165,0,218,36,0,16,16,16,16,16,
+ 16,16,8,32,32,0,73, 35, 35, 35, 35,73,64,100,32,165, 165,0,4,73,0,0,12,16,16,16,16,
+ 16,16,4,100,100,73, 35, 35, 35, 35, 35,110,0,100,68,0, 0,12,16,4,0,8,16,16,16,16,16,
+ 16,16,4,100,137, 35, 35, 35, 35,37,73,4,16,12,12,12, 12,16,16,16,12,16,16,16,16,16,16,
+ 16,16,12,0,0,110,182,218,37,8,4,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,8,12,12,8,12,12,8,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_rundown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0, 35,0, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0, 35,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0, 35, 35,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,0,0,233,0, 0, 35,0,0,0,0,16,16,16,16,16,
+ 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,0,0, 0, 35, 35, 35,0,0,0,0,16,16,16,
+ 16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,233,0,233, 0,0, 35, 35, 35, 35, 35,0,16,16,16,
+ 16,16,16,16,0,0,0, 35, 35,0,233,0,233,0,233,0, 0,0, 35, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0, 35, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 35, 0,16,16,16,16,0,233, 35,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 35,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_rundown2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,233,233,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0, 35,0, 35,0,0,0,233,16,16,0,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35,0, 35,0,0,16,16,0,0,233,0,0,16,
+ 16,16,16,16,16,16,16,16,0,0, 35,0,0,0,0,0, 35, 35,0,0,0,0,0,0,233,0,16,
+ 16,16,16,16,16,0,0,0,0, 35,0,0,233,0,0,0,0, 35, 35, 35, 35, 35, 35, 35,0,0,16,
+ 16,16,16,0,0,0,0, 35, 35, 35,0,0,0,0,233,0,0,0, 35, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,0, 35, 35, 35, 35, 35,0,0,233,0,233,0,0,0,0, 35, 35, 35, 35, 35,0,16,16,16,
+ 16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0,233,0,233,0, 35, 35,0,0,0,16,16,16,16,
+ 16,16,0,0, 35, 35, 35, 35, 35,0,0,233,0,233,0,233,0,0,0,0,0,16,16,16,16,16,16,
+ 16,16,0,233,0,0,0,0,0,16,0,233,233,233,233,0,233,0,16,16,16,16,16,16,16,16,16,
+ 16,16,0, 35,233,0,16,16,16,16,0, 35,233,233,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,16,16,16,16,0, 35,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_runld_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110, 35,73,0,4,16,72,101, 35, 35, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182, 35, 35,73,8,48,137,133,238, 35, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218, 35, 35, 35,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37, 35, 35, 35, 35,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37, 35, 35, 35, 35,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73, 35, 35,73,37,0,36,73, 35, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 35, 35,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41, 35, 35, 35,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 35, 35, 35,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219, 35, 35,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219, 35,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runld2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,4,100,68, 35, 35, 35,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,77,246,68,219, 35, 35, 35, 35,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,0,169,68,0,219, 35, 35, 35,182,146,0,36,110, 35, 35,37,4,36,77,146,218,0,0,4,16,
+ 16,16,12,8,8,8,0,219, 35,73,0,32,0,165,64,110, 35,110,110,73, 35, 35,182,0,4,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238, 35,109,4,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37, 35,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73, 35, 35,73,8,4,8,8,16,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 35, 35, 35, 35,73,0,32,32,8,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 35, 35, 35, 35, 35,73,100,100,4,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37, 35, 35, 35, 35,137,100,4,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,233, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16, 233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0, 0,233, 35, 35,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0, 35, 35,0, 0,233, 35, 35, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0, 35, 35, 0,0, 35,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0, 35,0, 35,233,233,0,233,0,0,0, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35,0,0,0,0,0,0,0, 35,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0, 35, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0, 35, 35, 35,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0, 35,233,0, 35,0,0,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runleft2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0, 35,233,0, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,0,0,0,16,16,0,0,0, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0, 35,0,0,0,0,0,0,0, 35,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0, 35,0, 35,233,233,0,233,0,0,0, 35,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,0,0,0,0,233,233,0,233,0,0,233,0, 35,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,233,0,233,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,233,233,0,233,0,233,0,0, 35,0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0,233,0,0,0,0,0,0, 35,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,0,233,0,0,0, 35, 35,0,0, 35,0,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,0,0,0, 35, 35,0,0,233, 35, 35, 35,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,0,0,233, 35, 35,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35,0,16,233,0,0,0,0,0,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35,0,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35,0,233,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,0,0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char B_runlu_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, 0,77,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8, 169,246,100,4,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,12,16,16,16,16,16,8, 68,68,68,37,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,0,0,4,16,16,16,8, 0,219, 35,219,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,0,36,36,4,16,12,0, 219, 35, 35,219,0,12,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,4,73,218,219,45,16,4,219, 35, 35, 35,110,4,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,4,0,182,36,8,41, 35, 35, 35,110,0,8,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,12,0,165,242,233,32,0,73, 35, 35,146,0,12,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,133,132,0,0, 182,218,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,0,165,233,233,132,133,201,32, 146,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,68,32,132,132,32,100,32,0, 0,146,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,12,100,100,133,132,100,100,64,165, 36,146,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,64,165,0,100,132,0,64, 110,219,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,4,110,73,0,0,0,0,0,110, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,73, 35, 35,73,37,0,36,73, 35, 35,37,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,8,37, 35, 35, 35, 35,219,219,73,110, 37,4,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,37, 35, 35, 35, 35,109,146,110,73,110, 4,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,218, 35, 35, 35,73,4,0,0,68,73, 36,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,182, 35, 35,73,8,48,137,133,238, 35, 77,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,8,110, 35,73,0,4,16,72,101, 35, 35, 146,4,12,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,137,100,32,8,16,16,4,109,182, 218,36,4,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,12,0,100,100,32,8,16,16,16,4,0, 0,0,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,4,4,8,16,16,16,16,16,4, 0,0,0,12,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,0,8,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,12,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char B_runlu2_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,8,12,12,8,12,12,8,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 4,8,37,218,182,110,0,0,12,16,16,
+ 16,16,16,16,16,16,12,16,16,16,12,12,12,12,16,4, 73,37, 35, 35, 35, 35,137,100,4,16,16,
+ 16,16,16,16,16,8,0,4,16,12,0,0,68,100,0,110, 35, 35, 35, 35, 35,73,100,100,4,16,16,
+ 16,16,16,16,12,0,0,73,4,0,165,165,32,100,64,73, 35, 35, 35, 35,73,0,32,32,8,16,16,
+ 16,16,16,16,16,0,36,218,0,165,233,233,132,133,165,0, 73, 35, 35,73,8,4,8,8,16,16,16,
+ 16,16,16,16,16,4,36,219,182,242,233,233,132,132,0,0, 37, 35,109,4,48,16,16,16,16,16,16,
+ 16,16,16,16,16,16,4,45,36,233,133,132,32,100,100,0, 0,219,146,0,137,72,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,8,32,132,133,100,100,132,0, 36,219,110,0,133,101,4,16,16,16,16,
+ 16,16,16,16,16,16,12,4,41,0,0,201,32,64,0,0, 73,73,73,68,238, 35,109,4,16,16,16,
+ 16,16,12,8,8,8,0,219, 35,73,0,32,0,165,64,110, 35,110,110,73, 35, 35,182,0,4,16,16,
+ 16,16,0,169,68,0,219, 35, 35, 35,182,146,0,36,110, 35, 35,37,4,36,77,146,218,0,0,4,16,
+ 16,16,77,246,68,219, 35, 35, 35, 35,218,219,146,146,219,37, 37,4,16,12,12,4,36,0,0,0,12,
+ 16,16,4,100,68, 35, 35, 35,110,146,0,0,0,0,0,8, 8,16,16,16,16,12,4,0,0,8,16,
+ 16,16,16,4,37,219,219,110,0,0,12,12,16,12,12,16, 16,16,16,16,16,16,16,16,12,16,16,
+ 16,16,16,16,8,8,0,4,8,12,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,12,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+/*
+static char portesx_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0,0,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,0, 100,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 100, 100,0,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0, 100, 100, 100,0,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,0,233,233,0,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,0,0,0,16,16,233,0,0,0, 100,0, 100,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,0,0,233,0,0,16,16,0,0, 100,0, 100, 100, 100, 100, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,0,233,0,0,0,0,0,0, 100, 100,0,0,0,0,0, 100,0,0,16,16,16,16,16,16,16,16,
+ 16,0,0, 100, 100, 100, 100, 100, 100, 100,0,0,0,0,233,0, 0, 100,0,0,0,0,16,16,16,16,16,
+ 16,16,0, 100, 100, 100, 100, 100, 100,0,0,0,233,0,0,0, 0, 100, 100, 100,0,0,0,0,16,16,16,
+ 16,16,16,0, 100, 100, 100, 100, 100,0,0,0,0,233,0,233, 0,0, 100, 100, 100, 100, 100,0,16,16,16,
+ 16,16,16,16,0,0,0, 100, 100,0,233,0,233,0,233,0, 0,0, 100, 100, 100, 100, 100, 100,0,16,16,
+ 16,16,16,16,16,16,0,0,0,0,0,233,0,233,0,233, 0,0, 100, 100, 100, 100, 100,0,0,16,16,
+ 16,16,16,16,16,16,16,16,16,0,233,0,233,233,233,233, 0,16,0,0,0,0,0,233,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,233,233,233, 100, 0,16,16,16,16,0,233, 100,0,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0, 100,0,16,16,16,16,0,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0, 100, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+
+
+static char calcdes_data[] = {
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 35, 0, 0, 0, 0,233,233,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 35, 0, 0,233, 0,233, 0,233,233, 35, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0,233, 0,233, 0,233,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0,233, 0,233, 0,233, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16, 0, 35, 35, 0, 0, 0, 0, 0,233, 0,233, 0, 0,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 35, 0, 0, 0,233, 0, 0,233, 0, 0,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16, 0, 0, 35, 35, 0, 0, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16, 0, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16, 0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16, 0, 0, 35, 0,233, 0,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16, 0, 0, 0, 0,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+
+ 16 ,16 ,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+ };
+
+static char calcdown_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35, 35,0,0,0,0, 0,0, 35,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,0,0,0, 35, 35, 35,0,0,0,0, 0,0, 35, 35,0,0,0,16,16,16,16,
+ 16,16,16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,0, 233,0,0, 35, 35, 35, 35,0,16,16,16,
+ 16,16,16,16,0,0, 35, 35, 35, 35, 35,0,233,0,0,233, 0,0,0, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0, 233,233,0, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,16,0,0, 35,0, 35, 35, 35,0,0,233,0,233, 0,233,0, 35, 35,0, 35,0,0,16,16,
+ 16,16,16,16,0,233,0,16,0, 35, 35,0,233,0,233,0, 233,233,0, 35,0,16,0,233,0,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char calcleft_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,233,233,0,0, 0,0, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0, 35,233,233,0,233,0,233, 0,0, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,233,0,233,0,233,0, 0,0, 35, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,233,0,233,0,233,0,0, 0,0, 35, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0,233,0,233,0,0,0, 0,0, 35, 35,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,0,0,233,0,0,233,0, 0,0, 35,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0, 35, 35,0,0,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0, 35, 35, 35, 35, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,233,0, 35,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };
+static char calcup_data[] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 0,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,0,0,233,233, 35,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,0,16,16,16,0,0,0,0,233,0,233, 233,0,0,0,16,16,16,0,16,16,16,
+ 16,16,16,16,0,233,0,16,0, 35, 35,0,233,0,233,0, 233,233,0, 35,0,16,0,233,0,16,16,
+ 16,16,16,16,0,0, 35,0, 35, 35, 35,0,0,233,0,233, 0,233,0, 35, 35,0, 35,0,0,16,16,
+ 16,16,16,16,0, 35, 35, 35, 35, 35, 35,0,0,0,233,0, 233,233,0, 35, 35, 35, 35, 35,0,16,16,
+ 16,16,16,16,0,0, 35, 35, 35, 35, 35,0,233,0,0,233, 0,0,0, 35, 35, 35, 35,0,0,16,16,
+ 16,16,16,16,16,0, 35, 35, 35, 35, 35,0,0,0,0,0, 233,0,0, 35, 35, 35, 35,0,16,16,16,
+ 16,16,16,16,16,16,0,0,0, 35, 35, 35,0,0,0,0, 0,0, 35, 35,0,0,0,16,16,16,16,
+ 16,16,16,16,16,16,16,16,0,0, 35, 35,0,0,0,0, 0,0, 35,0,0,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 35, 35, 35,0,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,0,0, 35, 35, 35, 0,0,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,16
+ };*/
+
Index: tags/rel_0_5/soccer/position.h
===================================================================
--- tags/rel_0_5/soccer/position.h (nonexistent)
+++ tags/rel_0_5/soccer/position.h (revision 1657)
@@ -0,0 +1,57 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: position.h,v 1.1.1.1 2004-05-24 18:03:46 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:46 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "iniziali.h"
+
+struct position{
+ int x;
+ int y;
+ float dx;
+ float dy;
+} initial_calc_position[]={{ORI_RES/5,VER_RES/5+100},{ORI_RES/5,8*VER_RES/10},{ORI_RES/2,VER_RES/2+40},{9*ORI_RES/10,VER_RES/5+100},{9*ORI_RES/10,8*VER_RES/10}};
+
+
Index: tags/rel_0_5/soccer/images.h
===================================================================
--- tags/rel_0_5/soccer/images.h (nonexistent)
+++ tags/rel_0_5/soccer/images.h (revision 1657)
@@ -0,0 +1,82 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: images.h,v 1.1.1.1 2004-05-24 18:03:45 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:45 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#define SFONDO rgb16(0,128,0)
+#define B 255 /*BIANCO*/
+#define V 16 /*verde*/
+#define M 200 /*marrone*/
+#define C 15 /*bianco*/
+#define G 14 /*Giallo*/
+#define N 0 /*NERO*/
+#define P 13 /*Rosa*/
+
+char pallone[64]={ V,V,V,V,V,V,V,V,
+ V,V,B,B,B,B,V,V,
+ V,N,B,B,B,B,N,V,
+ B,B,N,B,B,N,B,B,
+ B,B,B,N,N,B,B,B,
+ B,B,N,B,B,N,B,B,
+ V,N,B,B,B,B,N,V,
+ V,V,B,B,B,B,V,V,
+ };
+char goal_data[]={N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,G,G,G,G,N,G,G,G,N,G,G,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,N,N,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,N,G,G,N,G,N,G,N,G,G,G,N,G,N,N,N,N,
+ N,N,G,N,N,G,N,G,N,G,N,G,N,G,N,G,N,N,N,N,
+ N,N,G,G,G,G,N,G,G,G,N,G,N,G,N,G,G,G,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+ };
+
Index: tags/rel_0_5/soccer/readme
===================================================================
--- tags/rel_0_5/soccer/readme (nonexistent)
+++ tags/rel_0_5/soccer/readme (revision 1657)
@@ -0,0 +1,10 @@
+S.Ha.R.K. SOCCER Demo
+---------------------
+
+This demo has been developed by Merli Andrea and Zucchetti Alessandro
+in the context of an assignment during the course of industrial informatic
+at the University of Pavia, Italy.
+
+More informations in the soccer.ps file.
+
+Paolo
Index: tags/rel_0_5/soccer/makefile
===================================================================
--- tags/rel_0_5/soccer/makefile (nonexistent)
+++ tags/rel_0_5/soccer/makefile (revision 1657)
@@ -0,0 +1,17 @@
+#
+#
+#
+
+ifndef BASE
+BASE=../..
+endif
+include $(BASE)/config/config.mk
+
+PROGS= soccer
+
+include $(BASE)/config/example.mk
+
+soccer:
+ make -f $(SUBMAKE) APP=soccer INIT= OTHEROBJS="initfile.o" SHARKOPT="__OLDCHAR__ __GRX__"
+
+
Index: tags/rel_0_5/soccer/iniziali.h
===================================================================
--- tags/rel_0_5/soccer/iniziali.h (nonexistent)
+++ tags/rel_0_5/soccer/iniziali.h (revision 1657)
@@ -0,0 +1,100 @@
+/*
+ * Project: S.Ha.R.K.
+ *
+ * Coordinators:
+ * Giorgio Buttazzo <giorgio@sssup.it>
+ * Paolo Gai <pj@gandalf.sssup.it>
+ *
+ * Authors :
+ * Paolo Gai <pj@gandalf.sssup.it>
+ * (see the web pages for full authors list)
+ *
+ * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
+ *
+ * http://www.sssup.it
+ * http://retis.sssup.it
+ * http://shark.sssup.it
+ */
+
+/*
+ ------------
+ CVS : $Id: iniziali.h,v 1.1.1.1 2004-05-24 18:03:46 giacomo Exp $
+
+ File: $File$
+ Revision: $Revision: 1.1.1.1 $
+ Last update: $Date: 2004-05-24 18:03:46 $
+ ------------
+*/
+
+/*
+ * Copyright (C) 2000 Merli Andrea and Zucchetti Alessandro
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+
+#define YMENU 10 /* menu level */
+#define XMIN 1
+#define XMAX 799
+#define YMIN 100
+#define YMAX 599
+#define D 27
+#define VEL 10 /* linear velocity (def. = 6) */
+#define ANG 15 /* angolo massimo sterzata (15) */
+#define ESC 27 /* ASCII code of ESCAPE key */
+#define MAX_P 10 /* max number of calc */
+#define MAX_B 1
+#define GROUP_SOFT 4
+#define GROUP_PLAY 2
+#define GROUP_BALL 3
+#define PERIOD_BALL 30000
+#define PERIOD_CALC 100000
+#define PERIOD_PORT 30000
+#define CALC_WCET 5000
+#define PORT_WCET 4000
+#define BALL_WCET 5000
+#define BALL_RADIUS 5
+#define VER_RES 600
+#define ORI_RES 800
+#define COL_DEP 16
+#define FREE_MODE 0 /*il giocatore corre palla al piede*/
+#define PASS_MODE 1 /*il giocatore passa la palla rasoterra*/
+#define NO_BALL_MODE 4
+#define PENALTY_MODE_BLUE 5
+#define PENALTY_MODE_WHITE 6
+#define RESTART 6
+#define CANC 370
+#define RLEFT 1 /*RUN LEFT*/
+#define RDOWN 3 /*RUN DOWN*/
+#define RUP 5 /*RUN UP*/
+#define RRIGHT 7 /*RUN RIGHT*/
+#define RRUP 9 /*RUN RIGHT UP*/
+#define RRDW 15 /*RUN RIGHT DOWN*/
+#define RLUP 11 /*RUN LEFT UP*/
+#define RLDW 13 /*RUN LEFT DOWN*/
+#define RLEFT2 17 /*RUN LEFT*/
+#define RDOWN2 19 /*RUN DOWN*/
+#define RUP2 21 /*RUN UP*/
+#define RRIGHT2 23 /*RUN RIGHT*/
+#define RRUP2 25 /*RUN RIGHT UP*/
+#define RRDW2 27 /*RUN RIGHT DOWN*/
+#define RLUP2 29 /*RUN LEFT UP*/
+#define RLDW2 31 /*RUN LEFT DOWN*/
+#define NO_ACT 0
+#define GOAL_ACT 2
+#define MENU_ACT 3
+#define NO_PENALTY 0
+#define PENALTY 1