OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /or1k/tags/stable/mp3/sw/mad-xess
    from Rev 392 to Rev 1765
    Reverse comparison

Rev 392 → Rev 1765

/simmem.cfg
0,0 → 1,3
00000000 00200000 flash 0 5 5
40000000 00000010 RAM 2 1 1
80000000 00200000 RAM 1 1 2
/sim.cfg
0,0 → 1,89
/* sim.cfg -- Simulator configuration script file
Copyright (C) 2001, Marko Mlinar, markom@opencores.org
 
This file is part of OpenRISC 1000 Architectural Simulator.
 
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
section memory
memory_table_file = "simmem.cfg"
/*random_seed = 12345
type = random*/
pattern = 0x00
type = unknown /* Fastest */
end
 
section cpu
ver = 0x1200
rev = 0x0001
/* upr = */
superscalar = 0
hazards = 0
history = 0
dependstats = 0
dependency = 0
slp = 0
btic_sim = 0
bpb = 0
end
 
section debug
/*enabled = 0
gdb_enabled = 0*/
server_port = 9999
end
 
section sim
debug = 0
verbose = 0
profile = 0
prof_fn = "sim.profile"
/* iprompt = 0 */
exe_log = 1
exe_log_fn = "executed.log"
end
 
section mc
enabled = 0
baseaddr = 0xa0000000
POC = 0x00000008 /* Power on configuration register */
end
 
section uart
enabled = 0
nuarts = 1
device 0
baseaddr = 0x80000000
rxfile = "/tmp/uart0.rx"
txfile = "/tmp/uart0.tx"
jitter = -1 /* async behaviour */
enddevice
end
 
section dma
enabled = 0
ndmas = 1
device 0
baseaddr = 0x90000000
irq = 4
enddevice
end
 
section VAPI
enabled = 0
end
sim.cfg Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: README =================================================================== --- README (nonexistent) +++ README (revision 1765) @@ -0,0 +1,24 @@ +This is MP3 decoder for OpenRISC configured for the xess board. + +Make the mp3 player with: + + ./makes2 songs/Beethoven-fuer_elise-16.mp3 songs/Moonlight-16.mp3 + +This should build mp3 decoder for or32 and also put these two +songs in the memory image. + +You get three outputs: + +- minimad : this is executable in COFF binary format that you can use +on the simulator (type "sim minimad", uncomment the OR1K_SIM define +in config.h to get PCM output in a file audiosim.pcm, which you can hear +using command "play -t raw -r 22050 -s w -f s -c 2 audiosim.pcm") + +- minimad.s2 : this is srecord siutable to be merged with bitstream (*.exo) +that is burned into flash memory in xess board +(type "../utils/merge2srec xfpga_top.exo minimad.s2" to get out.exo and then +load this to xess board) + +- minimad.mem : this file is used to initialize flash model for the RTL +simulation (sim/ncsim/run/run_sim is expecting this file so you have to +build this decoder before you run the simulation).
README Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: minimad.c =================================================================== --- minimad.c (nonexistent) +++ minimad.c (revision 1765) @@ -0,0 +1,416 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: minimad.c,v 1.4 2001-11-07 10:44:11 simons Exp $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef EMBED +#include +#include +#include +#include +#include +#include +#endif +#include "audio.h" +#include "mad.h" +#include "fsyst.h" + +volatile int button; +//#define OR1K_SIM + +#define AUDIO_DBG 0 + +#if AUDIO_DBG +extern unsigned short wave_dump[(0x40000/2)]; +extern int wave_seg_index[0x10000]; +extern int wave_seg_nb; +extern int wave_index; +#endif + +#define SRAM_BASE 0x80000000 +#define SUCCESS_CODE 0x11223344 +#define REG32(x) (*(volatile unsigned long *)(x)) +#ifdef OR1K_SIM +#define BUTTON_STATE (0) +#else +#define BUTTON_STATE (!((*((volatile unsigned long *)0x40000000)) & 0x80000000)) +#endif + +void report1(unsigned long value) +{ + unsigned long spr = 0x1234; + asm("l.mtspr\t\t%0,%1,0x0" : : "r" (spr), "r" (value)); + return; +} +/* +int test_button(void) +{ + if(BUTTON_STATE) { + button = 1; + return 0; + } + else { + if(button == 1) { + while(1) { + int l = 0; + int i,j,k; + for(i = 0; i < 3; i++) { + for(j = 0; j < 100000; j++) + k = BUTTON_STATE; + l += k; + } + if(l == 0) { + button = 0; + return 1; + } + } + } + else { + button = 0; + return 0; + } + } + return 0; +} +*/ +int test_button(void) +{ + if(BUTTON_STATE) + while(1) { + int l = 0; + int i,j,k; + for(i = 0; i < 3; i++) { + for(j = 0; j < 100000; j++) + k = BUTTON_STATE; + l += k; + } + if(l == 0) { + button = 0; + return 1; + } + } + return 0; +} + +# ifdef EMBED +int main(); + +void c_reset() +{ + register unsigned long i asm("r5"); + register int longgggjump asm("r3"); + register unsigned long main_ofs asm("r4"); +// memcpy((void *)0x80000000, (void *)0, 0x1000); +/* for (i=0x100; i < 0x13000; i+=4) + *(unsigned long *)(0x80000000+i) = *(unsigned long *)(0x0+i); + main_ofs = (unsigned long)main; + asm("l.movhi r3,0x8000"); + asm("l.add r3,r3,%0" : : "r" (main_ofs)); + asm("l.jr r3"); + asm("l.nop"); +*/ + main(0,0); +} +# endif + +/* Root file location. */ +unsigned char *root_file; + +static int nchan = 0, speed = 0; +# ifndef EMBED +FILE *fo; +int output_s(unsigned char const *ptr, unsigned int len); +# endif + +static void +output(struct mad_pcm *pcm) +{ + unsigned int nchannels; +# ifndef EMBED + union audio_control control; +# endif + mad_fixed_t *ch1, *ch2; + + nchannels = pcm->channels; + + if (nchannels != nchan || speed != pcm->samplerate) + { +# ifndef EMBED + control.command = AUDIO_COMMAND_CONFIG; + + control.config.channels = nchannels; + control.config.speed = pcm->samplerate; + printf ("%i ", pcm->samplerate); + if (audio_oss(&control) == -1) + return; +# endif + nchan = nchannels; + speed = pcm->samplerate; + } + ch1 = &pcm->samples[0][0]; + ch2 = &pcm->samples[1][0]; + + if (nchan == 1) + ch2 = ch1; + + { + unsigned char data[MAX_NSAMPLES * 4 * 2]; + unsigned int len; + + len = audio_pcm_s16le(data, pcm->length, ch1, ch2); +# ifndef EMBED + output_s(data, len); +# endif + } + return; +} +#ifdef EMBED +void report(unsigned long value) +{ + unsigned long spr = 0x1234; + asm("l.mtspr\t\t%0,%1,0x0" : : "r" (spr), "r" (value)); + return; +} +#endif + +struct mad_pcm pcm; +/* Generates beep of 32 samples with sampling frequency + freq, vould = 0..31. */ +static void genbeep (int freq, int volume) +{ + int o = MAD_F_ONE/256 * volume, i; + pcm.length = 32; + pcm.samplerate = freq; + pcm.channels = 1; + for (i = 0; i < 8; i++) + { + pcm.samples[0][i] = i * o; +// report(i); + } + for (i = 0; i < 8; i++) + pcm.samples[0][i+8] = (8 - i) * o; + output (&pcm); + for (i = 0; i < 16; i++) + pcm.samples[0][16+i] = -pcm.samples[0][i]; + output (&pcm); +} + +static void short_beep () +{ + int i; + for (i = 0; i < 5; i++) + genbeep(44100, 8); +} + +/* private message buffer */ + +struct buffer { + unsigned char *start; + unsigned long length; +}; + +/* 2. called when more input is needed; refill stream buffer */ + +static +enum mad_flow input(void *data, + struct mad_stream *stream) +{ + struct buffer *buffer = data; + + if (!buffer->length) + return MAD_FLOW_STOP; + + mad_stream_buffer(stream, buffer->start, buffer->length); + + buffer->length = 0; + + return MAD_FLOW_CONTINUE; +} + +/* 4. called to handle a decoding error */ + +static +enum mad_flow error(void *data, + struct mad_stream *stream, + struct mad_frame *frame) +{ +#ifndef EMBED + struct buffer *buffer = data; + fprintf(stderr, "decoding error 0x%04x at byte offset %u\n", + stream->error, stream->this_frame - buffer->start); +#endif + + return MAD_FLOW_STOP; +} + +/* 5. put it all together */ + +static +int decode(unsigned char *start, unsigned long length) +{ + struct buffer buffer; + struct mad_decoder decoder; + int result = 0; + + buffer.start = start; + buffer.length = length; + + /* configure input, and error functions */ + + mad_decoder_init(&decoder, &buffer, + input, error); + + /* start the decoder */ + + result = mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC); + + mad_decoder_finish(&decoder); + + return result; +} + +#ifndef EMBED +static void *init_flash (char *filename) +{ + struct stat f_stat; + void *flash; + FILE *f = fopen (filename, "rb"); + if (!f) + return NULL; + stat (filename, &f_stat); + flash = malloc (f_stat.st_size); + if (!flash) + return NULL; + if (fread (flash, 1, f_stat.st_size, f) != f_stat.st_size) + return NULL; + fclose (f); + return flash; +} +#else +extern unsigned char flash_data[]; +#endif + + +void __main() {} + +int main(int argc, char *argv[]) +{ + int i; + int result; + + +#ifndef EMBED + union audio_control control; + if (argc != 2) + { + printf ("Usage: minimad image_file.mfs\n"); + return 1; + } + if (!(root_file = (char *) init_flash (argv[1]))) + { + fprintf (stderr, "Error loading image file '%s'\n", argv[1]); + return 2; + } + + control.command = AUDIO_COMMAND_INIT; + control.init.path = NULL; + if (audio_oss(&control) == -1) { + printf("audio %s\n", audio_error); + return 3; + } + fo = fopen ("audio.pcm", "wb+"); +#else + /* In EMBEDDED applications we have flash data linked. */ + root_file = &flash_data[0]; +#ifdef OR1K_SIM + asm volatile ("l.mtspr r0,r0,0x0FFFD"); +#endif +#endif + button = 0; + + + for (i = 1;; i++) { + struct file_struct *fs, *datat; + fs = find_track_no (i, ROOT_FILE); +// if (!fs) break; + if(!fs) { + i = 1; + fs = find_track_no (i, ROOT_FILE); + } + datat = track_data (fs); + short_beep(); + +# ifndef EMBED + { + unsigned u, v; + u = swap(datat->length); + v = swap(datat->data[0]); + printf ("Track %u: %s\n", i, track_name (fs)); + printf ("%08x:%08x:%08x\n", datat->data[0], v, u); + } +# endif + result = decode((unsigned char *)&datat->data[0], swap(datat->length) - sizeof(struct file_struct) + sizeof (unsigned int)); + if(result != 1) { + while(!test_button()); + } + } + + short_beep(); +#ifndef EMBED + control.command = AUDIO_COMMAND_FINISH; + if (audio_oss(&control) == -1) { + printf("audio %s\n", audio_error); + return 3; + } + free (root_file); + printf ("Done.\n"); + fclose (fo); +#else +#ifdef OR1K_SIM + asm volatile("l.mtspr r0,r0,0x0FFFF"); +#endif +#endif + +#if AUDIO_DBG +report1(wave_index); +report1(wave_seg_nb); + +report1(wave_seg_index[10]); +report1(wave_dump[wave_seg_index[10]]); + +report1(wave_seg_index[11]); +report1(wave_dump[wave_seg_index[11]]); + +report1(wave_seg_index[12]); +report1(wave_dump[wave_seg_index[12]]); +#endif + +while(1) { + REG32(SRAM_BASE + 0x00) = (SUCCESS_CODE >> 0) & 0x000000ff; + REG32(SRAM_BASE + 0x40) = (SUCCESS_CODE >> 8) & 0x000000ff; + REG32(SRAM_BASE + 0x80) = (SUCCESS_CODE >> 16) & 0x000000ff; + REG32(SRAM_BASE + 0xc0) = (SUCCESS_CODE >> 24) & 0x000000ff; + } + return 0; +} +
minimad.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: _ansi.h =================================================================== --- _ansi.h (nonexistent) +++ _ansi.h (revision 1765) @@ -0,0 +1,71 @@ +/* Provide support for both ANSI and non-ANSI environments. */ + +/* Some ANSI environments are "broken" in the sense that __STDC__ cannot be + relied upon to have it's intended meaning. Therefore we must use our own + concoction: _HAVE_STDC. Always use _HAVE_STDC instead of __STDC__ in newlib + sources! + + To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will + "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header + files aren't affected). */ + +#ifndef _ANSIDECL_H_ +#define _ANSIDECL_H_ + +#include + +/* First try to figure out whether we really are in an ANSI C environment. */ +/* FIXME: This probably needs some work. Perhaps sys/config.h can be + prevailed upon to give us a clue. */ + +#ifdef __STDC__ +#define _HAVE_STDC +#endif + +#ifdef _HAVE_STDC +#define _PTR void * +#define _AND , +#define _NOARGS void +#define _CONST const +#define _VOLATILE volatile +#define _SIGNED signed +#define _DOTS , ... +#define _VOID void +#define _EXFUN(name, proto) name proto +#define _DEFUN(name, arglist, args) name(args) +#define _DEFUN_VOID(name) name(_NOARGS) +#define _CAST_VOID (void) +#ifndef _LONG_DOUBLE +#define _LONG_DOUBLE long double +#endif +#ifndef _PARAMS +#define _PARAMS(paramlist) paramlist +#endif +#else +#define _PTR char * +#define _AND ; +#define _NOARGS +#define _CONST +#define _VOLATILE +#define _SIGNED +#define _DOTS +#define _VOID void +#define _EXFUN(name, proto) name() +#define _DEFUN(name, arglist, args) name arglist args; +#define _DEFUN_VOID(name) name() +#define _CAST_VOID +#define _LONG_DOUBLE double +#ifndef _PARAMS +#define _PARAMS(paramlist) () +#endif +#endif + +/* Support gcc's __attribute__ facility. */ + +#ifdef __GNUC__ +#define _ATTRIBUTE(attrs) __attribute__ (attrs) +#else +#define _ATTRIBUTE(attrs) +#endif + +#endif /* _ANSIDECL_H_ */
_ansi.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: xess.ld =================================================================== --- xess.ld (nonexistent) +++ xess.ld (revision 1765) @@ -0,0 +1,30 @@ +MEMORY + { + reset : ORIGIN = 0x00000100, LENGTH = 0x00001f00 + ram : ORIGIN = 0x80000000, LENGTH = 0x00200000 + } + +SECTIONS +{ + .reset : + { + *(.reset) + _src_beg = .; + } > reset + .text : + AT ( ADDR (.reset) + SIZEOF (.reset) ) + { + _dst_beg = .; + *(.text) + } > ram + .data : + AT ( ADDR (.reset) + SIZEOF (.reset) + SIZEOF (.text)) + { + *(.data) + _dst_end = .; + } > ram + .bss : + { + *(.bss) + } > ram +}
xess.ld Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: makes2 =================================================================== --- makes2 (nonexistent) +++ makes2 (revision 1765) @@ -0,0 +1,8 @@ +#!/bin/sh +../utils/loader tmp.mfs $@ +../utils/bin2c < tmp.mfs > flash.c +make +or32-rtems-objcopy -O binary minimad minimad.bin +../utils/bin2srec minimad.bin > minimad.s2 +../utils/bin2flimg 1 minimad.bin > minimad.mem +
makes2 Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: audio.c =================================================================== --- audio.c (nonexistent) +++ audio.c (revision 1765) @@ -0,0 +1,171 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: audio.c,v 1.3 2001-11-06 17:01:07 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "audio.h" +# include "mad.h" + +#ifndef EMBED +# include +# include +extern FILE *fo; +int printf(char *fmt, ...); +#endif + +char const *audio_error; + +static mad_fixed_t left_err, right_err; + +#define AUDIO_DBG 0 + +#if AUDIO_DBG +//unsigned short wave_dump[(0x40000/2)]; +//int wave_seg_index[0x10000]; +int wave_seg_nb = 0; +int wave_index = 0; +#endif + +/* + * NAME: audio_linear_dither() + * DESCRIPTION: generic linear sample quantize and dither routine + */ +inline +signed long audio_linear_dither(unsigned int bits, mad_fixed_t sample, + mad_fixed_t *error, struct audio_stats *stats) +{ + mad_fixed_t quantized; + + /* dither */ + sample += *error; + +# if 1 + /* clip */ + quantized = sample; + if (sample >= stats->peak_sample) { + if (sample >= MAD_F_ONE) { + quantized = MAD_F_ONE - 1; + ++stats->clipped_samples; + if (sample - quantized > stats->peak_clipping && + mad_f_abs(*error) < (MAD_F_ONE >> (MAD_F_FRACBITS + 1 - bits))) + stats->peak_clipping = sample - quantized; + } + stats->peak_sample = quantized; + } + else if (sample < -stats->peak_sample) { + if (sample < -MAD_F_ONE) { + quantized = -MAD_F_ONE; + ++stats->clipped_samples; + if (quantized - sample > stats->peak_clipping && + mad_f_abs(*error) < (MAD_F_ONE >> (MAD_F_FRACBITS + 1 - bits))) + stats->peak_clipping = quantized - sample; + } + stats->peak_sample = -quantized; + } +# else + /* clip */ + quantized = sample; + if (sample >= MAD_F_ONE) + quantized = MAD_F_ONE - 1; + else if (sample < -MAD_F_ONE) + quantized = -MAD_F_ONE; +# endif + + /* quantize */ + quantized &= ~((1L << (MAD_F_FRACBITS + 1 - bits)) - 1); + + /* error */ + *error = sample - quantized; + + /* scale */ + return quantized >> (MAD_F_FRACBITS + 1 - bits); +} + + +static struct audio_stats stats; + +/* + * NAME: audio_pcm_s16le() + * DESCRIPTION: write a block of signed 16-bit little-endian PCM samples + */ +unsigned int audio_pcm_s16le(unsigned char *data, unsigned int nsamples, + mad_fixed_t const *left, mad_fixed_t const *right) +{ + unsigned int len; + register signed int sample0, sample1; + + len = nsamples; +#if AUDIO_DBG +// wave_seg_index[wave_seg_nb] = wave_index; +// wave_seg_nb++; +report(wave_index); +#endif + + while (len--) { + sample0 = audio_linear_dither(16, *left++, &left_err, &stats); + sample1 = audio_linear_dither(16, *right++, &right_err, &stats); + +#ifdef EMBED +#ifdef OR1K +#ifndef OR1K_SIM + *(volatile unsigned short *)0x40000000 = sample0; +// *(volatile unsigned long *)0x40000000 = sample0; +// *(volatile unsigned long *)0x40000000 = sample1; +// *(volatile unsigned long *)0x40000000 = sample1; + +#if AUDIO_DBG +// wave_dump[wave_index] = (unsigned short)sample0; + wave_index++; +// wave_dump[wave_index] = (unsigned short)sample1; + wave_index++; +#endif + +#else +// asm volatile("l.mtspr r0,%0,0x01234" : : "r" (sample0 | (sample1 << 16))); + asm volatile("l.mtspr r0,%0,0x0FFFE" : : "r" (sample0 >> 0)); + asm volatile("l.mtspr r0,%0,0x0FFFE" : : "r" (sample0 >> 8)); + asm volatile("l.mtspr r0,%0,0x0FFFE" : : "r" (sample1 >> 0)); + asm volatile("l.mtspr r0,%0,0x0FFFE" : : "r" (sample1 >> 8)); +#endif +#else + printf("l.mtspr (0x0000FFFE) <- %x\n", (sample0 >> 0)); + printf("l.mtspr (0x0000FFFE) <- %x\n", (sample0 >> 8)); + printf("l.mtspr (0x0000FFFE) <- %x\n", (sample1 >> 0)); + printf("l.mtspr (0x0000FFFE) <- %x\n", (sample1 >> 8)); +#endif +#else + data[0] = sample0 >> 0; + data[1] = sample0 >> 8; + data[2] = sample1 >> 0; + data[3] = sample1 >> 8; + if (fo) { + fputc (data[0], fo); + fputc (data[1], fo); + fputc (data[2], fo); + fputc (data[3], fo); + } + data += 4; +#endif + } + return nsamples * 2 * 2; +}
audio.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: reset.S =================================================================== --- reset.S (nonexistent) +++ reset.S (revision 1765) @@ -0,0 +1,162 @@ + .section .reset + .extern _main + .extern _src_beg + .extern _dst_beg + .extern _dst_end + .extern _main + .extern _c_reset + +_reset: + l.nop + l.nop + l.movhi r0, 0x0 + l.slli r0,r0,16 + l.addi r1,r0,0x0 + l.addi r2,r0,0x0 + l.addi r3,r0,0x0 + l.addi r4,r0,0x0 + l.addi r5,r0,0x0 + l.addi r6,r0,0x0 + l.addi r7,r0,0x0 + l.addi r8,r0,0x0 + l.addi r9,r0,0x1234 + l.addi r10,r0,0x0 + l.addi r11,r0,0x0 + l.addi r12,r0,0x0 + l.addi r13,r0,0x0 + l.addi r14,r0,0x0 + l.addi r15,r0,0x0 + l.addi r16,r0,0x0 + l.addi r17,r0,0x0 + l.addi r18,r0,0x0 + l.addi r19,r0,0x0 + l.addi r20,r0,0x0 + l.addi r21,r0,0x0 + l.addi r22,r0,0x0 + l.addi r23,r0,0x0 + l.addi r24,r0,0x0 + l.addi r25,r0,0x0 + l.addi r26,r0,0x0 + l.addi r27,r0,0x0 + l.addi r28,r0,0x0 + l.addi r29,r0,0x0 + l.addi r30,r0,0x0 + l.addi r31,r0,0x0 + + /* Copy form flash to sram */ + + l.movhi r3,hi(_src_beg) + l.ori r3,r3,lo(_src_beg) + l.movhi r4,hi(_dst_beg) + l.ori r4,r4,lo(_dst_beg) + l.movhi r5,hi(_dst_end) + l.ori r5,r5,lo(_dst_end) + l.sub r5,r5,r4 + l.sfeqi r5,0 + l.bf 2f + l.nop +1: l.lwz r6,0(r3) + l.sw 0(r4),r6 + l.addi r3,r3,4 + l.addi r4,r4,4 + l.addi r5,r5,-4 + l.sfgtsi r5,0 + l.bf 1b + l.nop + +2: + + /* Verify sram data */ +/* l.movhi r3,hi(_src_beg) + l.ori r3,r3,lo(_src_beg) + l.addi r3,r3,4 + l.movhi r4,hi(_dst_beg) + l.ori r4,r4,lo(_dst_beg) + l.addi r4,r4,4 + l.movhi r5,hi(_dst_end) + l.ori r5,r5,lo(_dst_end) + l.sub r5,r5,r4 + l.sfeqi r5,0 + l.bf 2f + l.nop +1: l.lwz r6,0(r3) + l.lwz r7,0(r4) + l.sfeq r6,r7 + l.bnf img_err + l.nop + l.addi r3,r3,4 + l.addi r4,r4,4 + l.addi r5,r5,-4 + l.sfgtsi r5,0 + l.bf 1b + l.nop +2: +*/ + l.movhi r1,hi(0x80200000) + l.addi r1,r1,lo(0x80200000) + l.addi r1,r1,-4 + + l.movhi r2,hi(_main) + l.ori r2,r2,lo(_main) + l.jr r2 + l.addi r2,r0,0 + +img_err: + l.movhi r15,hi(0x80000000) + l.addi r15,r15,lo(0x80000000) + + l.addi r8,r6,0 + l.addi r9,r7,0 + l.addi r10,r3,0 + l.addi r11,r4,0 + + l.sw 0(r15),r8 + + l.srli r8,r8,8 + l.sw 0(r15),r8 + + l.srli r8,r8,8 + l.sw 0(r15),r8 + + l.srli r8,r8,8 + l.sw 0(r15),r8 + + l.sw 0(r15),r10 + + l.srli r10,r10,8 + l.sw 0(r15),r10 + + l.srli r10,r10,8 + l.sw 0(r15),r10 + + l.srli r10,r10,8 + l.sw 0(r15),r10 + + + l.sw 0(r15),r9 + + l.srli r9,r9,8 + l.sw 0(r15),r9 + + l.srli r9,r9,8 + l.sw 0(r15),r9 + + l.srli r9,r9,8 + l.sw 0(r15),r9 + + l.sw 0(r15),r11 + + l.srli r11,r11,8 + l.sw 0(r15),r11 + + l.srli r11,r11,8 + l.sw 0(r15),r11 + + l.srli r11,r11,8 + l.sw 0(r15),r11 + + l.addi r8,r0,0xee + l.sw 0(r15),r8 + + l.j img_err + l.nop
reset.S Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: memmove.c =================================================================== --- memmove.c (nonexistent) +++ memmove.c (revision 1765) @@ -0,0 +1,148 @@ +/* +FUNCTION + <>---move possibly overlapping memory + +INDEX + memmove + +ANSI_SYNOPSIS + #include + void *memmove(void *<[dst]>, const void *<[src]>, size_t <[length]>); + +TRAD_SYNOPSIS + #include + void *memmove(<[dst]>, <[src]>, <[length]>) + void *<[dst]>; + void *<[src]>; + size_t <[length]>; + +DESCRIPTION + This function moves <[length]> characters from the block of + memory starting at <<*<[src]>>> to the memory starting at + <<*<[dst]>>>. <> reproduces the characters correctly + at <<*<[dst]>>> even if the two areas overlap. + + +RETURNS + The function returns <[dst]> as passed. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + memmove ansi pure +*/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef EMBED +#include +#include <_ansi.h> +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* How many bytes are copied each iteration of the 4X unrolled loop. */ +#define BIGBLOCKSIZE (sizeof (long) << 2) + +/* How many bytes are copied each iteration of the word copy loop. */ +#define LITTLEBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the byte copier. */ +#define TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE) + +/*SUPPRESS 20*/ +_PTR +_DEFUN (memmove, (dst_void, src_void, length), + _PTR dst_void _AND + _CONST _PTR src_void _AND + size_t length) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *dst = dst_void; + _CONST char *src = src_void; + + if (src < dst && dst < src + length) + { + /* Have to copy backwards */ + src += length; + dst += length; + while (length--) + { + *--dst = *--src; + } + } + else + { + while (length--) + { + *dst++ = *src++; + } + } + + return dst_void; +#else + char *dst = dst_void; + _CONST char *src = src_void; + long *aligned_dst; + _CONST long *aligned_src; + int len = length; + + if (src < dst && dst < src + len) + { + /* Destructive overlap...have to copy backwards */ + src += len; + dst += len; + while (len--) + { + *--dst = *--src; + } + } + else + { + /* Use optimizing algorithm for a non-destructive copy to closely + match memcpy. If the size is small or either SRC or DST is unaligned, + then punt into the byte copy loop. This should be rare. */ + if (!TOO_SMALL(len) && !UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* Copy 4X long words at a time if possible. */ + while (len >= BIGBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + len -= BIGBLOCKSIZE; + } + + /* Copy one long word at a time if possible. */ + while (len >= LITTLEBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + len -= LITTLEBLOCKSIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (len--) + { + *dst++ = *src++; + } + } + + return dst_void; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} +#endif
memmove.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: audio.h =================================================================== --- audio.h (nonexistent) +++ audio.h (revision 1765) @@ -0,0 +1,105 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: audio.h,v 1.3 2001-11-06 17:01:07 simons Exp $ + */ + +# ifndef AUDIO_H +# define AUDIO_H + +# include "mad.h" + +# define MAX_NSAMPLES (1152 * 3) /* allow for resampled frame */ + +enum audio_command { + AUDIO_COMMAND_INIT, + AUDIO_COMMAND_CONFIG, + AUDIO_COMMAND_FINISH +}; + +enum audio_mode { + AUDIO_MODE_ROUND = 0x0001, + AUDIO_MODE_DITHER = 0x0002 +}; + +struct audio_stats { + unsigned long clipped_samples; + mad_fixed_t peak_clipping; + mad_fixed_t peak_sample; +}; + +union audio_control { + enum audio_command command; + + struct audio_init { + enum audio_command command; + char const *path; + } init; + + struct audio_config { + enum audio_command command; + unsigned int channels; + unsigned int speed; + } config; + + struct audio_play { + enum audio_command command; + unsigned int nsamples; + mad_fixed_t const *samples[2]; + enum audio_mode mode; + struct audio_stats *stats; + } play; + + struct audio_finish { + enum audio_command command; + } finish; +}; + +extern char const *audio_error; + +typedef int audio_ctlfunc_t(union audio_control *); + +audio_ctlfunc_t *audio_output(char const **); + +audio_ctlfunc_t audio_oss; +audio_ctlfunc_t audio_empeg; +audio_ctlfunc_t audio_sun; +audio_ctlfunc_t audio_win32; + +audio_ctlfunc_t audio_raw; +audio_ctlfunc_t audio_wave; +audio_ctlfunc_t audio_snd; +audio_ctlfunc_t audio_hex; +audio_ctlfunc_t audio_null; + +signed long audio_linear_round(unsigned int, mad_fixed_t, + struct audio_stats *); +signed long audio_linear_dither(unsigned int, mad_fixed_t, mad_fixed_t *, + struct audio_stats *); + +unsigned int audio_pcm_s16le(unsigned char *, unsigned int, + mad_fixed_t const *, mad_fixed_t const *); + +unsigned char audio_mulaw_round(mad_fixed_t); +unsigned char audio_mulaw_dither(mad_fixed_t, mad_fixed_t *); + +unsigned int audio_pcm_mulaw(unsigned char *, unsigned int, + mad_fixed_t const *, mad_fixed_t const *, + enum audio_mode, struct audio_stats *); + +# endif
audio.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/layer3.c =================================================================== --- libmad/layer3.c (nonexistent) +++ libmad/layer3.c (revision 1765) @@ -0,0 +1,2412 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: layer3.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# ifndef EMBED +# include +# include +# include +# ifdef HAVE_LIMITS_H +# include +# else +# define CHAR_BIT 8 +# endif +#else + +# define assert(x) +# define CHAR_BIT 8 +#endif + +# include "fixed.h" +# include "bit.h" +# include "stream.h" +# include "frame.h" +# include "huffman.h" +# include "layer3.h" + +/* --- Layer III ----------------------------------------------------------- */ + +enum { + count1table_select = 0x01, + scalefac_scale = 0x02, + preflag = 0x04, + mixed_block_flag = 0x08 +}; + +struct sideinfo { + unsigned int main_data_begin; + unsigned int private_bits; + + unsigned char scfsi[2]; + + struct granule { + struct channel { + /* from side info */ + unsigned short part2_3_length; + unsigned short big_values; + unsigned short global_gain; + unsigned short scalefac_compress; + + unsigned char flags; + unsigned char block_type; + unsigned char table_select[3]; + unsigned char subblock_gain[3]; + unsigned char region0_count; + unsigned char region1_count; + + /* from main_data */ + unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */ + } ch[2]; + } gr[2]; +}; + +/* + * scalefactor bit lengths + * derived from section 2.4.2.7 of ISO/IEC 11172-3 + */ +static +struct { + unsigned char slen1; + unsigned char slen2; +} const sflen_table[16] = { + { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, + { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, + { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 }, + { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 } +}; + +/* + * number of LSF scalefactor band values + * derived from section 2.4.3.2 of ISO/IEC 13818-3 + */ +static +unsigned char const nsfb_table[6][3][4] = { + { { 6, 5, 5, 5 }, + { 9, 9, 9, 9 }, + { 6, 9, 9, 9 } }, + + { { 6, 5, 7, 3 }, + { 9, 9, 12, 6 }, + { 6, 9, 12, 6 } }, + + { { 11, 10, 0, 0 }, + { 18, 18, 0, 0 }, + { 15, 18, 0, 0 } }, + + { { 7, 7, 7, 0 }, + { 12, 12, 12, 0 }, + { 6, 15, 12, 0 } }, + + { { 6, 6, 6, 3 }, + { 12, 9, 9, 6 }, + { 6, 12, 9, 6 } }, + + { { 8, 8, 5, 0 }, + { 15, 12, 9, 0 }, + { 6, 18, 9, 0 } } +}; + +/* + * MPEG-1 scalefactor band widths + * derived from Table B.8 of ISO/IEC 11172-3 + */ +static +unsigned char const sfb_48000_long[] = { + 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, + 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192 +}; + +static +unsigned char const sfb_44100_long[] = { + 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, + 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158 +}; + +static +unsigned char const sfb_32000_long[] = { + 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, + 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26 +}; + +static +unsigned char const sfb_48000_short[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14, + 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 +}; + +static +unsigned char const sfb_44100_short[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, + 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 +}; + +static +unsigned char const sfb_32000_short[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20, + 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 +}; + +static +unsigned char const sfb_48000_mixed[] = { + /* long */ 4, 4, 4, 4, 4, 4, 6, 6, + /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10, + 10, 10, 12, 12, 12, 14, 14, 14, 16, 16, + 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 +}; + +static +unsigned char const sfb_44100_mixed[] = { + /* long */ 4, 4, 4, 4, 4, 4, 6, 6, + /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, + 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, + 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 +}; + +static +unsigned char const sfb_32000_mixed[] = { + /* long */ 4, 4, 4, 4, 4, 4, 6, 6, + /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12, + 12, 12, 16, 16, 16, 20, 20, 20, 26, 26, + 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 +}; + +/* + * MPEG-2 scalefactor band widths + * derived from Table B.2 of ISO/IEC 13818-3 + */ +static +unsigned char const sfb_24000_long[] = { + 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, + 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 +}; + +static +unsigned char const sfb_22050_long[] = { + 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, + 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 +}; + +# define sfb_16000_long sfb_22050_long + +static +unsigned char const sfb_24000_short[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, + 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, + 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 +}; + +static +unsigned char const sfb_22050_short[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, + 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18, + 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 +}; + +static +unsigned char const sfb_16000_short[] = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, + 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, + 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 +}; + +static +unsigned char const sfb_24000_mixed[] = { + /* long */ 6, 6, 6, 6, 6, 6, + /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, + 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, + 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 +}; + +static +unsigned char const sfb_22050_mixed[] = { + /* long */ 6, 6, 6, 6, 6, 6, + /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10, + 10, 10, 14, 14, 14, 18, 18, 18, 26, 26, + 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 +}; + +static +unsigned char const sfb_16000_mixed[] = { + /* long */ 6, 6, 6, 6, 6, 6, + /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, + 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, + 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 +}; + +/* + * MPEG 2.5 scalefactor band widths + * derived from public sources + */ +# define sfb_12000_long sfb_16000_long +# define sfb_11025_long sfb_12000_long + +static +unsigned char const sfb_8000_long[] = { + 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, + 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 +}; + +# define sfb_12000_short sfb_16000_short +# define sfb_11025_short sfb_12000_short + +static +unsigned char const sfb_8000_short[] = { + 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, + 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, + 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 +}; + +# define sfb_12000_mixed sfb_16000_mixed +# define sfb_11025_mixed sfb_12000_mixed + +/* the 8000 Hz short block scalefactor bands do not break after the first 36 + frequency lines, so this is probably wrong */ +static +unsigned char const sfb_8000_mixed[] = { + /* long */ 12, 12, 12, + /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, + 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 +}; + +static +struct { + unsigned char const *l; + unsigned char const *s; + unsigned char const *m; +} const sfbwidth_table[9] = { + { sfb_48000_long, sfb_48000_short, sfb_48000_mixed }, + { sfb_44100_long, sfb_44100_short, sfb_44100_mixed }, + { sfb_32000_long, sfb_32000_short, sfb_32000_mixed }, + { sfb_24000_long, sfb_24000_short, sfb_24000_mixed }, + { sfb_22050_long, sfb_22050_short, sfb_22050_mixed }, + { sfb_16000_long, sfb_16000_short, sfb_16000_mixed }, + { sfb_12000_long, sfb_12000_short, sfb_12000_mixed }, + { sfb_11025_long, sfb_11025_short, sfb_11025_mixed }, + { sfb_8000_long, sfb_8000_short, sfb_8000_mixed } +}; + +/* + * scalefactor band preemphasis (used only when preflag is set) + * derived from Table B.6 of ISO/IEC 11172-3 + */ +static +unsigned char const pretab[22] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 +}; + +/* + * table for requantization + * + * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3) + * MM: shortened table + */ +#define RQ_START_BITS 7 +static +struct fixedfloat { + unsigned long mantissa : 27; + unsigned short exponent : 5; +} const rq_table[512] = { +# include "rq_short.dat" +}; + +/* + * fractional powers of two + * used for requantization and joint stereo decoding + * + * root_table[3 + x] = 2^(x/4) + */ +static +mad_fixed_t const root_table[7] = { + MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */, + MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */, + MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */, + MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */, + MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */, + MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */, + MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */ +}; + +/* + * coefficients for aliasing reduction + * derived from Table B.9 of ISO/IEC 11172-3 + * + * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 } + * cs[i] = 1 / sqrt(1 + c[i]^2) + * ca[i] = c[i] / sqrt(1 + c[i]^2) + */ +static +mad_fixed_t const cs[8] = { + +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */, + +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */, + +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */, + +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */ +}; + +static +mad_fixed_t const ca[8] = { + -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */, + -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */, + -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */, + -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */ +}; + +/* + * IMDCT coefficients for short blocks + * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3 + * + * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1)) + * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1)) + */ +static +mad_fixed_t const imdct_s[6][6] = { +# include "imdct_s.dat" +}; + +# if !defined(ASO_IMDCT) +/* + * windowing coefficients for long blocks + * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 + * + * window_l[i] = sin((PI / 36) * (i + 1/2)) + */ +static +mad_fixed_t const window_l[36] = { + MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */, + MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */, + MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */, + MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, + MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */, + MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */, + + MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */, + MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */, + MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */, + MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */, + MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */, + + MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */, + MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */, + MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */, + MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */, + MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */, + MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */, +}; +# endif /* ASO_IMDCT */ + +/* + * windowing coefficients for short blocks + * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 + * + * window_s[i] = sin((PI / 12) * (i + 1/2)) + */ +static +mad_fixed_t const window_s[12] = { + MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */, + MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */, + MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */, + MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, + MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */, +}; + +/* + * coefficients for intensity stereo processing + * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 + * + * is_ratio[i] = tan(i * (PI / 12)) + * is_table[i] = is_ratio[i] / (1 + is_ratio[i]) + */ +static +mad_fixed_t const is_table[7] = { + MAD_F(0x00000000) /* 0.000000000 */, + MAD_F(0x0361962f) /* 0.211324865 */, + MAD_F(0x05db3d74) /* 0.366025404 */, + MAD_F(0x08000000) /* 0.500000000 */, + MAD_F(0x0a24c28c) /* 0.633974596 */, + MAD_F(0x0c9e69d1) /* 0.788675135 */, + MAD_F(0x10000000) /* 1.000000000 */ +}; + +/* + * coefficients for LSF intensity stereo processing + * derived from section 2.4.3.2 of ISO/IEC 13818-3 + * + * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) + * is_lsf_table[1][i] = (1 / sqrt(2))^(i + 1) + */ +static +mad_fixed_t const is_lsf_table[2][15] = { + { + MAD_F(0x0d744fcd) /* 0.840896415 */, + MAD_F(0x0b504f33) /* 0.707106781 */, + MAD_F(0x09837f05) /* 0.594603558 */, + MAD_F(0x08000000) /* 0.500000000 */, + MAD_F(0x06ba27e6) /* 0.420448208 */, + MAD_F(0x05a8279a) /* 0.353553391 */, + MAD_F(0x04c1bf83) /* 0.297301779 */, + MAD_F(0x04000000) /* 0.250000000 */, + MAD_F(0x035d13f3) /* 0.210224104 */, + MAD_F(0x02d413cd) /* 0.176776695 */, + MAD_F(0x0260dfc1) /* 0.148650889 */, + MAD_F(0x02000000) /* 0.125000000 */, + MAD_F(0x01ae89fa) /* 0.105112052 */, + MAD_F(0x016a09e6) /* 0.088388348 */, + MAD_F(0x01306fe1) /* 0.074325445 */ + }, { + MAD_F(0x0b504f33) /* 0.707106781 */, + MAD_F(0x08000000) /* 0.500000000 */, + MAD_F(0x05a8279a) /* 0.353553391 */, + MAD_F(0x04000000) /* 0.250000000 */, + MAD_F(0x02d413cd) /* 0.176776695 */, + MAD_F(0x02000000) /* 0.125000000 */, + MAD_F(0x016a09e6) /* 0.088388348 */, + MAD_F(0x01000000) /* 0.062500000 */, + MAD_F(0x00b504f3) /* 0.044194174 */, + MAD_F(0x00800000) /* 0.031250000 */, + MAD_F(0x005a827a) /* 0.022097087 */, + MAD_F(0x00400000) /* 0.015625000 */, + MAD_F(0x002d413d) /* 0.011048543 */, + MAD_F(0x00200000) /* 0.007812500 */, + MAD_F(0x0016a09e) /* 0.005524272 */ + } +}; + +/* + * NAME: III_sideinfo() + * DESCRIPTION: decode frame side information from a bitstream + */ +static +enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch, + int lsf, struct sideinfo *si, + unsigned int *data_bitlen, + unsigned int *priv_bitlen) +{ + unsigned int ngr, gr, ch, i; + enum mad_error result = 0; + + *data_bitlen = 0; + *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3); + + si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9); + si->private_bits = mad_bit_read(ptr, *priv_bitlen); + + ngr = 1; + if (!lsf) { + ngr = 2; + + for (ch = 0; ch < nch; ++ch) + si->scfsi[ch] = mad_bit_read(ptr, 4); + } + + for (gr = 0; gr < ngr; ++gr) { + struct granule *granule = &si->gr[gr]; + + for (ch = 0; ch < nch; ++ch) { + struct channel *channel = &granule->ch[ch]; + + channel->part2_3_length = mad_bit_read(ptr, 12); + channel->big_values = mad_bit_read(ptr, 9); + channel->global_gain = mad_bit_read(ptr, 8); + channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4); + + *data_bitlen += channel->part2_3_length; + + if (channel->big_values > 288 && result == 0) + result = MAD_ERROR_BADBIGVALUES; + + channel->flags = 0; + + /* window_switching_flag */ + if (mad_bit_read(ptr, 1)) { + channel->block_type = mad_bit_read(ptr, 2); + + if (channel->block_type == 0 && result == 0) + result = MAD_ERROR_BADBLOCKTYPE; + + if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0) + result = MAD_ERROR_BADSCFSI; + + channel->region0_count = 7; + channel->region1_count = 36; + + if (mad_bit_read(ptr, 1)) + channel->flags |= mixed_block_flag; + else if (channel->block_type == 2) + channel->region0_count = 8; + + for (i = 0; i < 2; ++i) + channel->table_select[i] = mad_bit_read(ptr, 5); + +# if defined(DEBUG) + channel->table_select[2] = 4; /* not used */ +# endif + + for (i = 0; i < 3; ++i) + channel->subblock_gain[i] = mad_bit_read(ptr, 3); + } + else { + channel->block_type = 0; + + for (i = 0; i < 3; ++i) + channel->table_select[i] = mad_bit_read(ptr, 5); + + channel->region0_count = mad_bit_read(ptr, 4); + channel->region1_count = mad_bit_read(ptr, 3); + } + + /* [preflag,] scalefac_scale, count1table_select */ + channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3); + } + } + + return result; +} + +/* + * NAME: III_scalefactors_lsf() + * DESCRIPTION: decode channel scalefactors for LSF from a bitstream + */ +static +unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr, + struct channel *channel, + struct channel *gr1ch, int mode_extension) +{ + struct mad_bitptr start; + unsigned int scalefac_compress, index, slen[4], part, n, i; + unsigned char const *nsfb; + + start = *ptr; + + scalefac_compress = channel->scalefac_compress; + index = (channel->block_type == 2) ? + ((channel->flags & mixed_block_flag) ? 2 : 1) : 0; + + if (!((mode_extension & 0x1) && gr1ch)) { + if (scalefac_compress < 400) { + slen[0] = (scalefac_compress >> 4) / 5; + slen[1] = (scalefac_compress >> 4) % 5; + slen[2] = (scalefac_compress % 16) >> 2; + slen[3] = scalefac_compress % 4; + + nsfb = nsfb_table[0][index]; + } + else if (scalefac_compress < 500) { + scalefac_compress -= 400; + + slen[0] = (scalefac_compress >> 2) / 5; + slen[1] = (scalefac_compress >> 2) % 5; + slen[2] = scalefac_compress % 4; + slen[3] = 0; + + nsfb = nsfb_table[1][index]; + } + else { + scalefac_compress -= 500; + + slen[0] = scalefac_compress / 3; + slen[1] = scalefac_compress % 3; + slen[2] = 0; + slen[3] = 0; + + channel->flags |= preflag; + + nsfb = nsfb_table[2][index]; + } + + n = 0; + for (part = 0; part < 4; ++part) { + for (i = 0; i < nsfb[part]; ++i) + channel->scalefac[n++] = mad_bit_read(ptr, slen[part]); + } + + while (n < 39) + channel->scalefac[n++] = 0; + } + else { /* (mode_extension & 0x1) && gr1ch (i.e. ch == 1) */ + scalefac_compress >>= 1; + + if (scalefac_compress < 180) { + slen[0] = scalefac_compress / 36; + slen[1] = (scalefac_compress % 36) / 6; + slen[2] = (scalefac_compress % 36) % 6; + slen[3] = 0; + + nsfb = nsfb_table[3][index]; + } + else if (scalefac_compress < 244) { + scalefac_compress -= 180; + + slen[0] = (scalefac_compress % 64) >> 4; + slen[1] = (scalefac_compress % 16) >> 2; + slen[2] = scalefac_compress % 4; + slen[3] = 0; + + nsfb = nsfb_table[4][index]; + } + else { + scalefac_compress -= 244; + + slen[0] = scalefac_compress / 3; + slen[1] = scalefac_compress % 3; + slen[2] = 0; + slen[3] = 0; + + nsfb = nsfb_table[5][index]; + } + + n = 0; + for (part = 0; part < 4; ++part) { + unsigned int max, is_pos; + + max = (1 << slen[part]) - 1; + + for (i = 0; i < nsfb[part]; ++i) { + is_pos = mad_bit_read(ptr, slen[part]); + + channel->scalefac[n] = is_pos; + gr1ch->scalefac[n++] = (is_pos == max); + } + } + + while (n < 39) { + channel->scalefac[n] = 0; + gr1ch->scalefac[n++] = 0; /* apparently not illegal */ + } + } + + return mad_bit_length(&start, ptr); +} + +/* + * NAME: III_scalefactors() + * DESCRIPTION: decode channel scalefactors of one granule from a bitstream + */ +static +unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel, + struct channel const *gr0ch, unsigned int scfsi) +{ + struct mad_bitptr start; + unsigned int slen1, slen2, sfbi; + + start = *ptr; + + slen1 = sflen_table[channel->scalefac_compress].slen1; + slen2 = sflen_table[channel->scalefac_compress].slen2; + + if (channel->block_type == 2) { + unsigned int nsfb; + + sfbi = 0; + + nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3; + while (nsfb--) + channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1); + + nsfb = 6 * 3; + while (nsfb--) + channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2); + + nsfb = 1 * 3; + while (nsfb--) + channel->scalefac[sfbi++] = 0; + } + else { /* channel->block_type != 2 */ + if (scfsi & 0x8) { + for (sfbi = 0; sfbi < 6; ++sfbi) + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + else { + for (sfbi = 0; sfbi < 6; ++sfbi) + channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); + } + + if (scfsi & 0x4) { + for (sfbi = 6; sfbi < 11; ++sfbi) + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + else { + for (sfbi = 6; sfbi < 11; ++sfbi) + channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); + } + + if (scfsi & 0x2) { + for (sfbi = 11; sfbi < 16; ++sfbi) + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + else { + for (sfbi = 11; sfbi < 16; ++sfbi) + channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); + } + + if (scfsi & 0x1) { + for (sfbi = 16; sfbi < 21; ++sfbi) + channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; + } + else { + for (sfbi = 16; sfbi < 21; ++sfbi) + channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); + } + + channel->scalefac[21] = 0; + } + + return mad_bit_length(&start, ptr); +} + +/* + * NAME: III_exponents() + * DESCRIPTION: calculate scalefactor exponents + */ +static +void III_exponents(struct channel const *channel, + unsigned char const *sfbwidth, signed int exponents[39]) +{ + signed int gain; + unsigned int scalefac_multiplier, sfbi; + + gain = (signed int) channel->global_gain - 210; + scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1; + + if (channel->block_type == 2) { + unsigned int l; + signed int gain0, gain1, gain2; + + sfbi = l = 0; + + if (channel->flags & mixed_block_flag) { + unsigned int premask; + + premask = (channel->flags & preflag) ? ~0 : 0; + + /* long block subbands 0-1 */ + + while (l < 36) { + exponents[sfbi] = gain - + (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) << + scalefac_multiplier); + + l += sfbwidth[sfbi++]; + } + } + + /* this is probably wrong for 8000 Hz short/mixed blocks */ + + gain0 = gain - 8 * (signed int) channel->subblock_gain[0]; + gain1 = gain - 8 * (signed int) channel->subblock_gain[1]; + gain2 = gain - 8 * (signed int) channel->subblock_gain[2]; + + while (l < 576) { + exponents[sfbi + 0] = gain0 - + (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier); + exponents[sfbi + 1] = gain1 - + (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier); + exponents[sfbi + 2] = gain2 - + (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier); + + l += 3 * sfbwidth[sfbi]; + sfbi += 3; + } + } + else { /* channel->block_type != 2 */ + if (channel->flags & preflag) { + for (sfbi = 0; sfbi < 22; ++sfbi) { + exponents[sfbi] = gain - + (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) << + scalefac_multiplier); + } + } + else { + for (sfbi = 0; sfbi < 22; ++sfbi) { + exponents[sfbi] = gain - + (signed int) (channel->scalefac[sfbi] << scalefac_multiplier); + } + } + } +} + +/* + * NAME: III_requantize() + * DESCRIPTION: requantize one (positive) value + */ +static +mad_fixed_t III_requantize(unsigned int value, signed int exp) +{ + mad_fixed_t requantized; + signed int frac; + struct fixedfloat const *power; + + /* + * long blocks: + * xr[i] = sign(is[i]) * abs(is[i])^(4/3) * + * 2^((1/4) * (global_gain - 210)) * + * 2^-(scalefac_multiplier * + * (scalefac_l[sfb] + preflag * pretab[sfb])) + * + * short blocks: + * xr[i] = sign(is[i]) * abs(is[i])^(4/3) * + * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) * + * 2^-(scalefac_multiplier * scalefac_s[sfb][w]) + * + * where: + * scalefac_multiplier = (scalefac_scale + 1) / 2 + */ + + frac = exp % 4; + exp /= 4; + + /* MM: recalculation for short table */ + if (value < (1 << RQ_START_BITS)) + power = &rq_table[value]; + else { + int bits = 0, tmp = value; + while (tmp != 0) { + tmp <<= 1; + bits++; + } + bits -= RQ_START_BITS; + value &= ~((1 << bits) - 1); + power = &rq_table[value]; + } + + requantized = power->mantissa; + exp += power->exponent; + + if (exp < 0) { + if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) { + /* underflow */ + requantized = 0; + } + else + requantized >>= -exp; + } + else { + if (exp >= 5) { + /* overflow */ +# if defined(DEBUG) + fprintf(stderr, "requantize overflow (%f * 2^%d)\n", + mad_f_todouble(requantized), exp); +# endif + requantized = MAD_F_MAX; + } + else + requantized <<= exp; + } + + return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized; +} + +/* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */ +# define MASK(cache, sz, bits) \ + (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1)) +# define MASK1BIT(cache, sz) \ + ((cache) & (1 << ((sz) - 1))) + +/* + * NAME: III_huffdecode() + * DESCRIPTION: decode Huffman code words of one channel of one granule + */ +static +enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576], + struct channel *channel, + unsigned char const *sfbwidth, + unsigned int part2_length) +{ + signed int exponents[39], exp; + signed int const *expptr; + struct mad_bitptr peek; + signed int bits_left, cachesz; + register mad_fixed_t *xrptr; + mad_fixed_t const *sfbound; + register unsigned long bitcache; + + bits_left = (signed) channel->part2_3_length - (signed) part2_length; + if (bits_left < 0) + return MAD_ERROR_BADPART3LEN; + + III_exponents(channel, sfbwidth, exponents); + + peek = *ptr; + mad_bit_skip(ptr, bits_left); + + /* align bit reads to byte boundaries */ + cachesz = mad_bit_bitsleft(&peek); + cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7; + + bitcache = mad_bit_read(&peek, cachesz); + bits_left -= cachesz; + + xrptr = &xr[0]; + + /* big_values */ + { + unsigned int region, rcount; + struct hufftable const *entry; + union huffpair const *table; + unsigned int linbits, startbits, big_values, reqhits; + mad_fixed_t reqcache[16]; + + sfbound = xrptr + *sfbwidth++; + rcount = channel->region0_count + 1; + + entry = &mad_huff_pair_table[channel->table_select[region = 0]]; + table = entry->table; + linbits = entry->linbits; + startbits = entry->startbits; + + if (table == 0) + return MAD_ERROR_BADHUFFTABLE; + + expptr = &exponents[0]; + exp = *expptr++; + reqhits = 0; + + big_values = channel->big_values; + + while (big_values-- && cachesz + bits_left > 0) { + union huffpair const *pair; + unsigned int clumpsz, value; + register mad_fixed_t requantized; + + if (xrptr == sfbound) { + sfbound += *sfbwidth++; + + /* change table if region boundary */ + + if (--rcount == 0) { + if (region == 0) + rcount = channel->region1_count + 1; + else + rcount = 0; /* all remaining */ + + entry = &mad_huff_pair_table[channel->table_select[++region]]; + table = entry->table; + linbits = entry->linbits; + startbits = entry->startbits; + + if (table == 0) + return MAD_ERROR_BADHUFFTABLE; + } + + if (exp != *expptr) { + exp = *expptr; + reqhits = 0; + } + + ++expptr; + } + + if (cachesz < 21) { + unsigned int bits; + + bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7; + bitcache = (bitcache << bits) | mad_bit_read(&peek, bits); + cachesz += bits; + bits_left -= bits; + } + + /* hcod (0..19) */ + + clumpsz = startbits; + pair = &table[MASK(bitcache, cachesz, clumpsz)]; + + while (!pair->final) { + cachesz -= clumpsz; + + clumpsz = pair->ptr.bits; + pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)]; + } + + cachesz -= pair->value.hlen; + + { + int xy_sel; + + /* MM: joint x and y */ + value = pair->value.x; + + /* x (0..14) and y (0..14) and x (0..1) and y (0..1) */ + for (xy_sel = 0; xy_sel < 2; xy_sel++) { + if (value == 0) + xrptr[xy_sel] = 0; + else { + if (value == 15 && linbits) { + if (cachesz < linbits + 2 - xy_sel) { + bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); + cachesz += 16; + bits_left -= 16; + } + + value += MASK(bitcache, cachesz, linbits); + cachesz -= linbits; + + requantized = III_requantize(value, exp); + } + else { + if (reqhits & (1 << value)) + requantized = reqcache[value]; + else { + reqhits |= (1 << value); + requantized = reqcache[value] = III_requantize(value, exp); + } + } + xrptr[xy_sel] = MASK1BIT(bitcache, cachesz--) ? + -requantized : requantized; + } + value = pair->value.y; + } + } + + xrptr += 2; + } + } + + if (cachesz + bits_left < 0) + return MAD_ERROR_BADHUFFDATA; /* big_values overrun */ + + /* count1 */ + { + union huffquad const *table; + register mad_fixed_t requantized; + + table = mad_huff_quad_table[channel->flags & count1table_select]; + + requantized = III_requantize(1, exp); + + while (cachesz + bits_left > 0 && xrptr <= &xr[572]) { + union huffquad const *quad; + + /* hcod (1..6) */ + + if (cachesz < 10) { + bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); + cachesz += 16; + bits_left -= 16; + } + + quad = &table[MASK(bitcache, cachesz, 4)]; + + /* quad tables guaranteed to have at most one extra lookup */ + if (!quad->final) { + cachesz -= 4; + + quad = &table[quad->ptr.offset + + MASK(bitcache, cachesz, quad->ptr.bits)]; + } + + cachesz -= quad->value.hlen; + + /* MM: code joined */ + { + int sel_12; + int vw_xy_sel = *((int *) &quad->value); + for (sel_12 = 0; sel_12 < 2; sel_12++) { + if (xrptr == sfbound) { + sfbound += *sfbwidth++; + + if (exp != *expptr) { + exp = *expptr; + requantized = III_requantize(1, exp); + } + + ++expptr; + } + { + int tmp = MASK1BIT(bitcache, cachesz--) ? -requantized : requantized; + + /* v (0..1) or x (0..1) */ + xrptr[0] = vw_xy_sel&4 ? tmp : 0; + + /* w (0..1) or y (0..1) */ + xrptr[1] = vw_xy_sel&8 ? tmp : 0; + } + xrptr += 2; + vw_xy_sel >>= 2; + } + } + } + + if (cachesz + bits_left < 0) { +# if 0 && defined(DEBUG) + fprintf(stderr, "huffman count1 overrun (%d bits)\n", + -(cachesz + bits_left)); +# endif + + /* technically the bitstream is misformatted, but apparently + some encoders are just a bit sloppy with stuffing bits */ + + xrptr -= 4; + } + } + + assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT); + +# if 0 && defined(DEBUG) + if (bits_left < 0) + fprintf(stderr, "read %d bits too many\n", -bits_left); + else if (cachesz + bits_left > 0) + fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left); +# endif + + /* rzero */ + while (xrptr < &xr[576]) { + xrptr[0] = 0; + xrptr[1] = 0; + + xrptr += 2; + } + + return 0; +} + +# undef MASK +# undef MASK1BIT + +/* + * NAME: III_reorder() + * DESCRIPTION: reorder frequency lines of a short block into subband order + */ +static +void III_reorder(mad_fixed_t xr[576], struct channel const *channel, + unsigned char const sfbwidth[39]) +{ + mad_fixed_t tmp[32][3][6]; + unsigned int sb, l, sfbi, f, w, sbw[3], sw[3]; + + /* this is probably wrong for 8000 Hz mixed blocks */ + + if (channel->flags & mixed_block_flag) + sb = 2, sfbi = 3 * 3; + else + sb = 0, sfbi = 0; + + for (w = 0; w < 3; ++w) { + sbw[w] = sb; + sw[w] = 0; + } + + f = sfbwidth[sfbi]; + w = 0; + + for (l = 18 * sb; l < 576; ++l) { + tmp[sbw[w]][w][sw[w]++] = xr[l]; + + if (sw[w] == 6) { + sw[w] = 0; + ++sbw[w]; + } + + if (--f == 0) { + if (++w == 3) + w = 0; + + f = sfbwidth[++sfbi]; + } + } + + memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t)); +} + +/* + * NAME: III_stereo() + * DESCRIPTION: perform joint stereo processing on a granule + */ +static +enum mad_error III_stereo(mad_fixed_t xr[2][576], + struct granule const *granule, + struct mad_header *header, + unsigned char const *sfbwidth) +{ + short modes[39]; + unsigned int sfbi, l, n, i; + + enum { + i_stereo = 0x1, + ms_stereo = 0x2 + }; + + if (granule->ch[0].block_type != + granule->ch[1].block_type || + (granule->ch[0].flags & mixed_block_flag) != + (granule->ch[1].flags & mixed_block_flag)) + return MAD_ERROR_BADSTEREO; + + for (i = 0; i < 39; ++i) + modes[i] = header->mode_extension; + + /* intensity stereo */ + + if (header->mode_extension & i_stereo) { + struct channel const *right_ch = &granule->ch[1]; + mad_fixed_t const *right_xr = xr[1]; + unsigned int is_pos; + + header->flags |= MAD_FLAG_I_STEREO; + + /* first determine which scalefactor bands are to be processed */ + + if (right_ch->block_type == 2) { + unsigned int lower, start, max, bound[3], w; + + lower = start = max = bound[0] = bound[1] = bound[2] = 0; + + sfbi = l = 0; + + if (right_ch->flags & mixed_block_flag) { + while (l < 36) { + n = sfbwidth[sfbi++]; + + for (i = 0; i < n; ++i) { + if (right_xr[i]) { + lower = sfbi; + break; + } + } + + right_xr += n; + l += n; + } + + start = sfbi; + } + + w = 0; + while (l < 576) { + n = sfbwidth[sfbi++]; + + for (i = 0; i < n; ++i) { + if (right_xr[i]) { + max = bound[w] = sfbi; + break; + } + } + + right_xr += n; + l += n; + w = (w + 1) % 3; + } + + if (max) + lower = start; + + /* long blocks */ + + for (i = 0; i < lower; ++i) + modes[i] = header->mode_extension & ~i_stereo; + + /* short blocks */ + + w = 0; + for (i = start; i < max; ++i) { + if (i < bound[w]) + modes[i] = header->mode_extension & ~i_stereo; + + w = (w + 1) % 3; + } + } + else { /* right_ch->block_type != 2 */ + unsigned int bound; + + bound = 0; + for (sfbi = l = 0; l < 576; l += n) { + n = sfbwidth[sfbi++]; + + for (i = 0; i < n; ++i) { + if (right_xr[i]) { + bound = sfbi; + break; + } + } + + right_xr += n; + } + + for (i = 0; i < bound; ++i) + modes[i] = header->mode_extension & ~i_stereo; + } + + /* now do the actual processing */ + + if (header->flags & MAD_FLAG_LSF_EXT) { + unsigned char const *illegal_pos = granule[1].ch[1].scalefac; + mad_fixed_t const *lsf_scale; + + /* intensity_scale */ + lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1]; + + for (sfbi = l = 0; l < 576; ++sfbi, l += n) { + n = sfbwidth[sfbi]; + + if (!(modes[sfbi] & i_stereo)) + continue; + + if (illegal_pos[sfbi]) { + modes[sfbi] &= ~i_stereo; + continue; + } + + is_pos = right_ch->scalefac[sfbi]; + + for (i = 0; i < n; ++i) { + register mad_fixed_t left; + + left = xr[0][l + i]; + + if (is_pos == 0) + xr[1][l + i] = left; + else { + register mad_fixed_t opposite; + + opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]); + + if (is_pos & 1) { + xr[0][l + i] = opposite; + xr[1][l + i] = left; + } + else + xr[1][l + i] = opposite; + } + } + } + } + else { /* !(header->flags & MAD_FLAG_LSF_EXT) */ + for (sfbi = l = 0; l < 576; ++sfbi, l += n) { + n = sfbwidth[sfbi]; + + if (!(modes[sfbi] & i_stereo)) + continue; + + is_pos = right_ch->scalefac[sfbi]; + + if (is_pos >= 7) { /* illegal intensity position */ + modes[sfbi] &= ~i_stereo; + continue; + } + + for (i = 0; i < n; ++i) { + register mad_fixed_t left; + + left = xr[0][l + i]; + + xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]); + xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]); + } + } + } + } + + /* middle/side stereo */ + + if (header->mode_extension & ms_stereo) { + register mad_fixed_t invsqrt2; + + header->flags |= MAD_FLAG_MS_STEREO; + + invsqrt2 = root_table[3 + -2]; + + for (sfbi = l = 0; l < 576; ++sfbi, l += n) { + n = sfbwidth[sfbi]; + + if (modes[sfbi] != ms_stereo) + continue; + + for (i = 0; i < n; ++i) { + register mad_fixed_t m, s; + + m = xr[0][l + i]; + s = xr[1][l + i]; + + xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */ + xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */ + } + } + } + + return 0; +} + +/* + * NAME: III_aliasreduce() + * DESCRIPTION: perform frequency line alias reduction + */ +static +void III_aliasreduce(mad_fixed_t xr[576], int lines) +{ + mad_fixed_t const *bound; + int i; + + bound = &xr[lines]; + for (xr += 18; xr < bound; xr += 18) { + for (i = 0; i < 8; ++i) { + register mad_fixed_t *aptr, *bptr, a, b; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + + aptr = &xr[-1 - i]; + bptr = &xr[ i]; + + a = *aptr; + b = *bptr; + +# if defined(ASO_ZEROCHECK) + if (a | b) { +# endif + MAD_F_ML0(hi, lo, a, cs[i]); + MAD_F_MLA(hi, lo, -b, ca[i]); + + *aptr = MAD_F_MLZ(hi, lo); + + MAD_F_ML0(hi, lo, b, cs[i]); + MAD_F_MLA(hi, lo, a, ca[i]); + + *bptr = MAD_F_MLZ(hi, lo); +# if defined(ASO_ZEROCHECK) + } +# endif + } + } +} + +# if defined(ASO_IMDCT) +void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int); +# else +/* + * NAME: imdct36 + * DESCRIPTION: perform X[18]->x[36] IMDCT + */ +static inline +void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) +{ + mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; + mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + + MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8)); + MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa)); + + t6 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa)); + MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8)); + + t0 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549)); + + x[7] = MAD_F_MLZ(hi, lo); + x[10] = -x[7]; + + MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0)); + + x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0; + + t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15]; + t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17]; + + MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8)); + MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa)); + + x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0; + + MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346)); + + t1 = MAD_F_MLZ(hi, lo) + t6; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890)); + + x[6] = MAD_F_MLZ(hi, lo) + t1; + x[11] = -x[6]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2)); + + x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad)); + + x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1; + + MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa)); + MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8)); + + t7 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0)); + + t2 = MAD_F_MLZ(hi, lo); + + MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5)); + + x[5] = MAD_F_MLZ(hi, lo); + x[12] = -x[5]; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352)); + + x[0] = MAD_F_MLZ(hi, lo) + t2; + x[17] = -x[0]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962)); + + x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2; + + MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549)); + + t3 = MAD_F_MLZ(hi, lo) + t7; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd)); + + x[8] = MAD_F_MLZ(hi, lo) + t3; + x[9] = -x[8]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284)); + + x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779)); + + x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3; + + MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8)); + MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa)); + + t4 = MAD_F_MLZ(hi, lo) - t7; + + MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa)); + MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8)); + + x[4] = MAD_F_MLZ(hi, lo) + t4; + x[13] = -x[4]; + + MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2)); + MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346)); + + x[1] = MAD_F_MLZ(hi, lo) + t4; + x[16] = -x[1]; + + MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2)); + + x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4; + + MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549)); + MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346)); + MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0)); + MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2)); + + t5 = MAD_F_MLZ(hi, lo) - t6; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807)); + + x[2] = MAD_F_MLZ(hi, lo) + t5; + x[15] = -x[2]; + + MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e)); + MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245)); + + x[3] = MAD_F_MLZ(hi, lo) + t5; + x[14] = -x[3]; + + MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd)); + MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890)); + MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5)); + MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245)); + MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807)); + MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352)); + MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad)); + MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779)); + MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284)); + MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2)); + MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962)); + MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e)); + + x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5; +} + +/* + * NAME: III_imdct_l() + * DESCRIPTION: perform IMDCT and windowing for long blocks + */ +static +void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], + unsigned int block_type) +{ + unsigned int i; + + /* IMDCT */ + + imdct36(X, z); + + /* windowing */ + + switch (block_type) { + case 0: /* normal window */ +# if defined(ASO_INTERLEAVE1) + { + register mad_fixed_t tmp1, tmp2; + + tmp1 = window_l[0]; + tmp2 = window_l[1]; + + for (i = 0; i < 34; i += 2) { + z[i + 0] = mad_f_mul(z[i + 0], tmp1); + tmp1 = window_l[i + 2]; + z[i + 1] = mad_f_mul(z[i + 1], tmp2); + tmp2 = window_l[i + 3]; + } + + z[34] = mad_f_mul(z[34], tmp1); + z[35] = mad_f_mul(z[35], tmp2); + } +# elif defined(ASO_INTERLEAVE2) + { + register mad_fixed_t tmp1, tmp2; + + tmp1 = z[0]; + tmp2 = window_l[0]; + + for (i = 0; i < 35; ++i) { + z[i] = mad_f_mul(tmp1, tmp2); + tmp1 = z[i + 1]; + tmp2 = window_l[i + 1]; + } + + z[35] = mad_f_mul(tmp1, tmp2); + } +# elif 1 + for (i = 0; i < 36; i += 4) { + z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); + z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); + z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); + z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]); + } +# else + for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); +# endif + break; + + case 1: /* start block */ + for (i = 0; i < 18; ++i) z[i] = mad_f_mul(z[i], window_l[i]); + /* (i = 18; i < 24; ++i) z[i] unchanged */ + for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]); + for (i = 30; i < 36; ++i) z[i] = 0; + break; + + case 3: /* stop block */ + for (i = 0; i < 6; ++i) z[i] = 0; + for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]); + /* (i = 12; i < 18; ++i) z[i] unchanged */ + for (i = 18; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); + break; + } +} +# endif /* ASO_IMDCT */ + +/* + * NAME: III_imdct_s() + * DESCRIPTION: perform IMDCT and windowing for short blocks + */ +static +void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36]) +{ + mad_fixed_t y[36], *yptr; + mad_fixed_t const *wptr; + int w, i; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + + /* IMDCT */ + + yptr = &y[0]; + + for (w = 0; w < 3; ++w) { + register mad_fixed_t const (*s)[6]; + + s = imdct_s; + + for (i = 0; i < 3; ++i) { + MAD_F_ML0(hi, lo, X[0], (*s)[0]); + MAD_F_MLA(hi, lo, X[1], (*s)[1]); + MAD_F_MLA(hi, lo, X[2], (*s)[2]); + MAD_F_MLA(hi, lo, X[3], (*s)[3]); + MAD_F_MLA(hi, lo, X[4], (*s)[4]); + MAD_F_MLA(hi, lo, X[5], (*s)[5]); + + yptr[i + 0] = MAD_F_MLZ(hi, lo); + yptr[5 - i] = -yptr[i + 0]; + + ++s; + + MAD_F_ML0(hi, lo, X[0], (*s)[0]); + MAD_F_MLA(hi, lo, X[1], (*s)[1]); + MAD_F_MLA(hi, lo, X[2], (*s)[2]); + MAD_F_MLA(hi, lo, X[3], (*s)[3]); + MAD_F_MLA(hi, lo, X[4], (*s)[4]); + MAD_F_MLA(hi, lo, X[5], (*s)[5]); + + yptr[ i + 6] = MAD_F_MLZ(hi, lo); + yptr[11 - i] = yptr[i + 6]; + + ++s; + } + + yptr += 12; + X += 6; + } + + /* windowing, overlapping and concatenation */ + + yptr = &y[0]; + wptr = &window_s[0]; + + for (i = 0; i < 6; ++i) { + z[i + 0] = 0; + z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]); + + MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]); + MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]); + + z[i + 12] = MAD_F_MLZ(hi, lo); + + MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]); + MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]); + + z[i + 18] = MAD_F_MLZ(hi, lo); + + z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]); + z[i + 30] = 0; + + ++yptr; + ++wptr; + } +} + +/* + * NAME: III_overlap() + * DESCRIPTION: perform overlap-add of windowed IMDCT outputs + */ +static +void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18], + mad_fixed_t sample[18][32], unsigned int sb) +{ + unsigned int i; + +# if defined(ASO_INTERLEAVE2) + { + register mad_fixed_t tmp1, tmp2; + + tmp1 = overlap[0]; + tmp2 = overlap[1]; + + for (i = 0; i < 16; i += 2) { + sample[i + 0][sb] = output[i + 0] + tmp1; + overlap[i + 0] = output[i + 0 + 18]; + tmp1 = overlap[i + 2]; + + sample[i + 1][sb] = output[i + 1] + tmp2; + overlap[i + 1] = output[i + 1 + 18]; + tmp2 = overlap[i + 3]; + } + + sample[16][sb] = output[16] + tmp1; + overlap[16] = output[16 + 18]; + sample[17][sb] = output[17] + tmp2; + overlap[17] = output[17 + 18]; + } +# elif 0 + for (i = 0; i < 18; i += 2) { + sample[i + 0][sb] = output[i + 0] + overlap[i + 0]; + overlap[i + 0] = output[i + 0 + 18]; + + sample[i + 1][sb] = output[i + 1] + overlap[i + 1]; + overlap[i + 1] = output[i + 1 + 18]; + } +# else + for (i = 0; i < 18; ++i) { + sample[i][sb] = output[i] + overlap[i]; + overlap[i] = output[i + 18]; + } +# endif +} + +/* + * NAME: III_overlap_z() + * DESCRIPTION: perform "overlap-add" of zero IMDCT outputs + */ +static inline +void III_overlap_z(mad_fixed_t overlap[18], + mad_fixed_t sample[18][32], unsigned int sb) +{ + unsigned int i; + +# if defined(ASO_INTERLEAVE2) + { + register mad_fixed_t tmp1, tmp2; + + tmp1 = overlap[0]; + tmp2 = overlap[1]; + + for (i = 0; i < 16; i += 2) { + sample[i + 0][sb] = tmp1; + overlap[i + 0] = 0; + tmp1 = overlap[i + 2]; + + sample[i + 1][sb] = tmp2; + overlap[i + 1] = 0; + tmp2 = overlap[i + 3]; + } + + sample[16][sb] = tmp1; + overlap[16] = 0; + sample[17][sb] = tmp2; + overlap[17] = 0; + } +# else + for (i = 0; i < 18; ++i) { + sample[i][sb] = overlap[i]; + overlap[i] = 0; + } +# endif +} + +/* + * NAME: III_freqinver() + * DESCRIPTION: perform subband frequency inversion for odd sample lines + */ +static +void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb) +{ + unsigned int i; + +# if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2) + { + register mad_fixed_t tmp1, tmp2; + + tmp1 = sample[1][sb]; + tmp2 = sample[3][sb]; + + for (i = 1; i < 13; i += 4) { + sample[i + 0][sb] = -tmp1; + tmp1 = sample[i + 4][sb]; + sample[i + 2][sb] = -tmp2; + tmp2 = sample[i + 6][sb]; + } + + sample[13][sb] = -tmp1; + tmp1 = sample[17][sb]; + sample[15][sb] = -tmp2; + sample[17][sb] = -tmp1; + } +# else + for (i = 1; i < 18; i += 2) + sample[i][sb] = -sample[i][sb]; +# endif +} + +/* + * NAME: III_decode() + * DESCRIPTION: decode frame main_data + */ +static +int III_decode(struct mad_bitptr *ptr, struct mad_frame *frame, + struct sideinfo *si, unsigned int nch) +{ + struct mad_header *header = &frame->header; + unsigned int sfreqi, ngr, gr; + + { + unsigned int sfreq; + + sfreq = header->samplerate; + if (header->flags & MAD_FLAG_MPEG_2_5_EXT) + sfreq *= 2; + + /* 48000 => 0, 44100 => 1, 32000 => 2, + 24000 => 3, 22050 => 4, 16000 => 5 */ + sfreqi = ((sfreq >> 7) & 0x000f) + + ((sfreq >> 15) & 0x0001) - 8; + + if (header->flags & MAD_FLAG_MPEG_2_5_EXT) + sfreqi += 3; + } + + /* scalefactors, Huffman decoding, requantization */ + + ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2; + + for (gr = 0; gr < ngr; ++gr) { + struct granule *granule = &si->gr[gr]; + unsigned char const *sfbwidth = 0; + mad_fixed_t xr[2][576]; + unsigned int ch; + enum mad_error error; + + for (ch = 0; ch < nch; ++ch) { + struct channel *channel = &granule->ch[ch]; + unsigned int part2_length; + + sfbwidth = sfbwidth_table[sfreqi].l; + if (channel->block_type == 2) { + sfbwidth = (channel->flags & mixed_block_flag) ? + sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s; + } + + if (header->flags & MAD_FLAG_LSF_EXT) { + part2_length = III_scalefactors_lsf(ptr, channel, + ch == 0 ? 0 : &si->gr[1].ch[1], + header->mode_extension); + } + else { + part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch], + gr == 0 ? 0 : si->scfsi[ch]); + } + + error = III_huffdecode(ptr, xr[ch], channel, sfbwidth, part2_length); + if (error) + return error; + } + + /* joint stereo processing */ + + if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) { + error = III_stereo(xr, granule, header, sfbwidth); + if (error) + return error; + } + + /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */ + + for (ch = 0; ch < nch; ++ch) { + struct channel const *channel = &granule->ch[ch]; + mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr]; + unsigned int sb, l, i, sblimit; + mad_fixed_t output[36]; + + if (channel->block_type == 2) { + III_reorder(xr[ch], channel, sfbwidth_table[sfreqi].s); + +# if !defined(OPT_STRICT) + /* + * According to ISO/IEC 11172-3, "Alias reduction is not applied for + * granules with block_type == 2 (short block)." However, other + * sources suggest alias reduction should indeed be performed on the + * lower two subbands of mixed blocks. Most other implementations do + * this, so by default we will too. + */ + if (channel->flags & mixed_block_flag) + III_aliasreduce(xr[ch], 36); +# endif + } + else + III_aliasreduce(xr[ch], 576); + + l = 0; + + /* subbands 0-1 */ + + if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) { + unsigned int block_type; + + block_type = channel->block_type; + if (channel->flags & mixed_block_flag) + block_type = 0; + + /* long blocks */ + for (sb = 0; sb < 2; ++sb, l += 18) { + III_imdct_l(&xr[ch][l], output, block_type); + III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); + } + } + else { + /* short blocks */ + for (sb = 0; sb < 2; ++sb, l += 18) { + III_imdct_s(&xr[ch][l], output); + III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); + } + } + + III_freqinver(sample, 1); + + /* (nonzero) subbands 2-31 */ + + i = 576; + while (i > 36 && xr[ch][i - 1] == 0) + --i; + + sblimit = 32 - (576 - i) / 18; + + if (channel->block_type != 2) { + /* long blocks */ + for (sb = 2; sb < sblimit; ++sb, l += 18) { + III_imdct_l(&xr[ch][l], output, channel->block_type); + III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); + + if (sb & 1) + III_freqinver(sample, sb); + } + } + else { + /* short blocks */ + for (sb = 2; sb < sblimit; ++sb, l += 18) { + III_imdct_s(&xr[ch][l], output); + III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); + + if (sb & 1) + III_freqinver(sample, sb); + } + } + + /* remaining (zero) subbands */ + + for (sb = sblimit; sb < 32; ++sb) { + III_overlap_z((*frame->overlap)[ch][sb], sample, sb); + + if (sb & 1) + III_freqinver(sample, sb); + } + } + } + + return 0; +} + +unsigned char g_main_data[MAD_BUFFER_MDLEN]; +mad_fixed_t g_frame_overlap [2][32][18]; + +/* + * NAME: layer->III() + * DESCRIPTION: decode a single Layer III frame + */ +int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame) +{ + struct mad_header *header = &frame->header; + unsigned int nch, priv_bitlen, next_md_begin = 0; + unsigned int si_len, data_bitlen, md_len; + unsigned int frame_space, frame_used, frame_free; + struct mad_bitptr ptr; + struct sideinfo si; + enum mad_error error; + int result = 0; + + /* allocate Layer III dynamic structures */ + + if (!stream->main_data) + stream->main_data = (unsigned char *)stream->buffer; //&g_main_data; + frame->overlap = &g_frame_overlap; + + nch = MAD_NCHANNELS(header); + si_len = (header->flags & MAD_FLAG_LSF_EXT) ? + (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32); + + /* check frame sanity */ + + if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) < + (signed int) si_len) { + stream->error = MAD_ERROR_BADFRAMELEN; + stream->md_len = 0; + return -1; + } + + /* check CRC word */ + + if (header->flags & MAD_FLAG_PROTECTION) { + header->crc_check = + mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check); + + if (header->crc_check != header->crc_target && + !(frame->options & MAD_OPTION_IGNORECRC)) { + stream->error = MAD_ERROR_BADCRC; + result = -1; + } + } + + /* decode frame side information */ + + error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT, + &si, &data_bitlen, &priv_bitlen); + if (error && result == 0) { + stream->error = error; + result = -1; + } + + header->flags |= priv_bitlen; + header->private_bits |= si.private_bits; + + /* find main_data of next frame */ + + { + struct mad_bitptr peek; + unsigned long header; + + mad_bit_init(&peek, stream->next_frame); + + header = mad_bit_read(&peek, 32); + if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) { + if (!(header & 0x00010000L)) /* protection_bit */ + mad_bit_skip(&peek, 16); /* crc_check */ + + next_md_begin = + mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8); + } + + mad_bit_finish(&peek); + } + + /* find main_data of this frame */ + + frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr); + + if (next_md_begin > si.main_data_begin + frame_space) + next_md_begin = 0; + + md_len = si.main_data_begin + frame_space - next_md_begin; + + frame_used = 0; + + if (si.main_data_begin == 0) { + ptr = stream->ptr; + stream->md_len = 0; + + frame_used = md_len; + } + else { + if (si.main_data_begin > stream->md_len) { + if (result == 0) { + stream->error = MAD_ERROR_BADDATAPTR; + result = -1; + } + } + else { + mad_bit_init(&ptr, + stream->main_data + stream->md_len - si.main_data_begin); + + if (md_len > si.main_data_begin) { + assert(stream->md_len + md_len - + si.main_data_begin <= MAD_BUFFER_MDLEN); + + memcpy(stream->main_data + stream->md_len, + mad_bit_nextbyte(&stream->ptr), + frame_used = md_len - si.main_data_begin); + stream->md_len += frame_used; + } + } + } + + frame_free = frame_space - frame_used; + + /* decode main_data */ + + if (result == 0) { + error = III_decode(&ptr, frame, &si, nch); + if (error) { + stream->error = error; + result = -1; + } + } + + /* designate ancillary bits */ + + stream->anc_ptr = ptr; + stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen; + + /* fprintf(stderr, + "main_data_begin:%u, md_len:%u, frame_free:%u, " + "data_bitlen:%u, anc_bitlen: %u\n", + si.main_data_begin, md_len, frame_free, + data_bitlen, stream->anc_bitlen);*/ + + /* preload main_data buffer with up to 511 bytes for next frame(s) */ + + if (frame_free >= next_md_begin) { + memcpy(stream->main_data, + stream->next_frame - next_md_begin, next_md_begin); + + stream->md_len = next_md_begin; + } + else { + if (md_len < si.main_data_begin) { + unsigned int extra; + extra = si.main_data_begin - md_len; + if (extra + frame_free > next_md_begin) + extra = next_md_begin - frame_free; + + if (extra < stream->md_len) { + memmove(stream->main_data, + stream->main_data + stream->md_len - extra, extra); + stream->md_len = extra; + } + } + else + stream->md_len = 0; + + memcpy(stream->main_data + stream->md_len, + stream->next_frame - frame_free, frame_free); + stream->md_len += frame_free; + } + return result; +}
libmad/layer3.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/frame.h =================================================================== --- libmad/frame.h (nonexistent) +++ libmad/frame.h (revision 1765) @@ -0,0 +1,115 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: frame.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_FRAME_H +# define LIBMAD_FRAME_H + +# include "fixed.h" +# include "timer.h" +# include "stream.h" + +enum mad_layer { + MAD_LAYER_I = 1, /* Layer I */ + MAD_LAYER_II = 2, /* Layer II */ + MAD_LAYER_III = 3 /* Layer III */ +}; + +enum mad_mode { + MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ + MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ + MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ + MAD_MODE_STEREO = 3 /* normal LR stereo */ +}; + +enum mad_emphasis { + MAD_EMPHASIS_NONE = 0, /* no emphasis */ + MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ + MAD_EMPHASIS_CCITT_J_17 = 3 /* CCITT J.17 emphasis */ +}; + +struct mad_frame { + struct mad_header { + enum mad_layer layer; /* audio layer (1, 2, or 3) */ + enum mad_mode mode; /* channel mode (see above) */ + int mode_extension; /* additional mode info */ + enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ + + unsigned long bitrate; /* stream bitrate (bps) */ + unsigned int samplerate; /* sampling frequency (Hz) */ + + unsigned short crc_check; /* frame CRC accumulator */ + unsigned short crc_target; /* final target CRC checksum */ + + int flags; /* flags (see below) */ + int private_bits; /* private bits (see below) */ + + mad_timer_t duration; /* audio playing time of frame */ + } header; + + int options; /* decoding options (from stream) */ + + mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ + mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ +}; + +# define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) +# define MAD_NSBSAMPLES(header) \ + ((header)->layer == MAD_LAYER_I ? 12 : \ + (((header)->layer == MAD_LAYER_III && \ + ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) + +enum { + MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ + MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ + + MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ + MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ + MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ + MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ + + MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ + MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ + MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ + + MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ + MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ + MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ +}; + +enum { + MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ + MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ +}; + +void mad_header_init(struct mad_header *); + +# define mad_header_finish(header) /* nothing */ + +int mad_header_decode(struct mad_header *, struct mad_stream *); + +void mad_frame_init(struct mad_frame *); +void mad_frame_finish(struct mad_frame *); + +int mad_frame_decode(struct mad_frame *, struct mad_stream *); + +void mad_frame_mute(struct mad_frame *); + +# endif
libmad/frame.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/fixed.c =================================================================== --- libmad/fixed.c (nonexistent) +++ libmad/fixed.c (revision 1765) @@ -0,0 +1,37 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: fixed.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# include "fixed.h" + +/* + * NAME: fixed->abs() + * DESCRIPTION: return absolute value of a fixed-point number + */ +mad_fixed_t mad_f_abs(mad_fixed_t x) +{ + return x < 0 ? -x : x; +}
libmad/fixed.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/stream.h =================================================================== --- libmad/stream.h (nonexistent) +++ libmad/stream.h (revision 1765) @@ -0,0 +1,102 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: stream.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_STREAM_H +# define LIBMAD_STREAM_H + +# include "bit.h" + +# define MAD_BUFFER_GUARD 8 +# define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) + +enum mad_error { + MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ + MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ + + MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ + + MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ + MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ + MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ + MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ + MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ + + MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ + MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ + MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ + MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ + MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ + MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ + MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ + MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ + MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ + MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ + MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ + MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ +}; + +# define MAD_RECOVERABLE(error) ((error) & 0xff00) + +struct mad_stream { + unsigned char const *buffer; /* input bitstream buffer */ + unsigned char const *bufend; /* end of buffer */ + unsigned long skiplen; /* bytes to skip before next frame */ + + int sync; /* stream sync found */ + unsigned long freerate; /* free bitrate (fixed) */ + + unsigned char const *this_frame; /* start of current frame */ + unsigned char const *next_frame; /* start of next frame */ + struct mad_bitptr ptr; /* current processing bit pointer */ + + struct mad_bitptr anc_ptr; /* ancillary bits pointer */ + unsigned int anc_bitlen; /* number of ancillary bits */ + + unsigned char (*main_data); + /* Layer III main_data() */ + unsigned int md_len; /* bytes in main_data */ + + int options; /* decoding options (see below) */ + enum mad_error error; /* error code (see above) */ +}; + +enum { + MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ + MAD_OPTION_HALFSAMPLERATE = 0x0002, /* generate PCM at 1/2 sample rate */ +# if 0 /* not yet implemented */ + MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ + MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ + MAD_OPTION_SINGLECHANNEL = 0x0030, /* combine channels */ +# endif +}; + +void mad_stream_init(struct mad_stream *); +void mad_stream_finish(struct mad_stream *); + +# define mad_stream_options(stream, opts) ((stream)->options = (opts)) + +void mad_stream_buffer(struct mad_stream *, + unsigned char const *, unsigned long); +void mad_stream_skip(struct mad_stream *, unsigned long); + +int mad_stream_sync(struct mad_stream *); + +# endif
libmad/stream.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/layer3.h =================================================================== --- libmad/layer3.h (nonexistent) +++ libmad/layer3.h (revision 1765) @@ -0,0 +1,30 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: layer3.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_LAYER3_H +# define LIBMAD_LAYER3_H + +# include "stream.h" +# include "frame.h" + +int mad_layer_III(struct mad_stream *, struct mad_frame *); + +# endif
libmad/layer3.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/fixed.h =================================================================== --- libmad/fixed.h (nonexistent) +++ libmad/fixed.h (revision 1765) @@ -0,0 +1,454 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: fixed.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_FIXED_H +# define LIBMAD_FIXED_H + +# if SIZEOF_INT >= 4 +typedef signed int mad_fixed_t; + +typedef signed int mad_fixed64hi_t; +typedef unsigned int mad_fixed64lo_t; +# else +typedef signed long mad_fixed_t; + +typedef signed long mad_fixed64hi_t; +typedef unsigned long mad_fixed64lo_t; +# endif + +/* + * Fixed-point format: 0xABBBBBBB + * A == whole part (sign + 3 bits) + * B == fractional part (28 bits) + * + * Values are signed two's complement, so the effective range is: + * 0x80000000 to 0x7fffffff + * -8.0 to +7.9999999962747097015380859375 + * + * The smallest representable value is: + * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) + * + * 28 bits of fractional accuracy represent about + * 8.6 digits of decimal accuracy. + * + * Fixed-point numbers can be added or subtracted as normal + * integers, but multiplication requires shifting the 64-bit result + * from 56 fractional bits back to 28 (and rounding.) + * + * Changing the definition of MAD_F_FRACBITS is only partially + * supported, and must be done with care. + */ + +# define MAD_F_FRACBITS 28 + +# if MAD_F_FRACBITS == 28 +# define MAD_F(x) ((mad_fixed_t) (x##L)) +# else +# if MAD_F_FRACBITS < 28 +# warning "MAD_F_FRACBITS < 28" +# define MAD_F(x) ((mad_fixed_t) \ + (((x##L) + \ + (1L << (28 - MAD_F_FRACBITS - 1))) >> \ + (28 - MAD_F_FRACBITS))) +# elif MAD_F_FRACBITS > 28 +# error "MAD_F_FRACBITS > 28 not currently supported" +# define MAD_F(x) ((mad_fixed_t) \ + ((x##L) << (MAD_F_FRACBITS - 28))) +# endif +# endif + +# define MAD_F_MIN ((mad_fixed_t) -0x80000000L) +# define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) + +# define MAD_F_ONE MAD_F(0x10000000) + +#ifndef EMBED +# define mad_f_tofixed(x) ((mad_fixed_t) \ + ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) +# define mad_f_todouble(x) ((double) \ + ((x) / (double) (1L << MAD_F_FRACBITS))) +#endif + +# define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) +# define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) + /* (x should be positive) */ + +# define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) + +# define mad_f_add(x, y) ((x) + (y)) +# define mad_f_sub(x, y) ((x) - (y)) + +# if defined(FPM_64BIT) + +/* + * This version should be the most accurate if 64-bit (long long) types are + * supported by the compiler, although it may not be the most efficient. + */ +# if defined(OPT_ACCURACY) +# define mad_f_mul(x, y) \ + ((mad_fixed_t) \ + ((((signed long long) (x) * (y)) + \ + (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) +# else +# define mad_f_mul(x, y) \ + ((mad_fixed_t) (((signed long long) (x) * (y)) >> MAD_F_SCALEBITS)) +# endif + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- Intel --------------------------------------------------------------- */ +# elif defined(FPM_INTEL) + +/* + * This Intel version is fast and accurate; the disposition of the least + * significant bit depends on OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("imull %3" \ + : "=a" (lo), "=d" (hi) \ + : "%a" (x), "rm" (y) \ + : "cc") + +# if defined(OPT_ACCURACY) +/* + * This gives best accuracy but is not very fast. + */ +# define MAD_F_MLA(hi, lo, x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + MAD_F_MLX(__hi, __lo, (x), (y)); \ + asm ("addl %2,%0\n\t" \ + "adcl %3,%1" \ + : "=rm" (lo), "=rm" (hi) \ + : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ + : "cc"); \ + }) +# endif /* OPT_ACCURACY */ + +# if defined(OPT_ACCURACY) +/* + * Surprisingly, this is faster than SHRD followed by ADC. + */ +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed64hi_t __hi_; \ + mad_fixed64lo_t __lo_; \ + mad_fixed_t __result; \ + asm ("addl %4,%2\n\t" \ + "adcl %5,%3" \ + : "=rm" (__lo_), "=rm" (__hi_) \ + : "0" (lo), "1" (hi), \ + "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ + : "cc"); \ + asm ("shrdl %3,%2,%1" \ + : "=rm" (__result) \ + : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) +# else +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + asm ("shrdl %3,%2,%1" \ + : "=rm" (__result) \ + : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) +# endif /* OPT_ACCURACY */ + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- ARM ----------------------------------------------------------------- */ + +# elif defined(FPM_ARM) + +/* + * This ARM V4 version is as accurate as FPM_64BIT but much faster. The + * least significant bit is properly rounded at no CPU cycle cost! + */ +# if 1 +/* + * There's a bug somewhere, possibly in the compiler, that sometimes makes + * this necessary instead of the default implementation via MAD_F_MLX and + * mad_f_scale64. It may be related to the use (or lack) of + * -finline-functions and/or -fstrength-reduce. + * + * This is also apparently faster than MAD_F_MLX/mad_f_scale64. + */ +# define mad_f_mul(x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + mad_fixed_t __result; \ + asm ("smull %0, %1, %3, %4\n\t" \ + "movs %0, %0, lsr %5\n\t" \ + "adc %2, %0, %1, lsl %6" \ + : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ + : "%r" (x), "r" (y), \ + "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) +# endif + +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("smull %0, %1, %2, %3" \ + : "=&r" (lo), "=&r" (hi) \ + : "%r" (x), "r" (y)) + +# define MAD_F_MLA(hi, lo, x, y) \ + asm ("smlal %0, %1, %2, %3" \ + : "+r" (lo), "+r" (hi) \ + : "%r" (x), "r" (y)) + +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + asm ("movs %0, %1, lsr %3\n\t" \ + "adc %0, %0, %2, lsl %4" \ + : "=r" (__result) \ + : "r" (lo), "r" (hi), \ + "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- MIPS ---------------------------------------------------------------- */ + +# elif defined(FPM_MIPS) + +/* + * This MIPS version is fast and accurate; the disposition of the least + * significant bit depends on OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("mult %2,%3" \ + : "=l" (lo), "=h" (hi) \ + : "%r" (x), "r" (y)) + +# if defined(HAVE_MADD_ASM) +# define MAD_F_MLA(hi, lo, x, y) \ + asm ("madd %2,%3" \ + : "+l" (lo), "+h" (hi) \ + : "%r" (x), "r" (y)) +# elif defined(HAVE_MADD16_ASM) +/* + * This loses significant accuracy due to the 16-bit integer limit in the + * multiply/accumulate instruction. + */ +# define MAD_F_ML0(hi, lo, x, y) \ + asm ("mult %2,%3" \ + : "=l" (lo), "=h" (hi) \ + : "%r" ((x) >> 12), "r" ((y) >> 16)) +# define MAD_F_MLA(hi, lo, x, y) \ + asm ("madd16 %2,%3" \ + : "+l" (lo), "+h" (hi) \ + : "%r" ((x) >> 12), "r" ((y) >> 16)) +# define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) +# endif + +# if defined(OPT_SPEED) +# define mad_f_scale64(hi, lo) \ + ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) +# define MAD_F_SCALEBITS MAD_F_FRACBITS +# endif + +/* --- SPARC --------------------------------------------------------------- */ + +# elif defined(FPM_SPARC) + +/* + * This SPARC V8 version is fast and accurate; the disposition of the least + * significant bit depends on OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("smul %2, %3, %0\n\t" \ + "rd %%y, %1" \ + : "=r" (lo), "=r" (hi) \ + : "%r" (x), "rI" (y)) + +/* --- PowerPC ------------------------------------------------------------- */ + +# elif defined(FPM_PPC) + +/* + * This PowerPC version is tuned for the 4xx embedded processors. It is + * effectively a tuned version of FPM_64BIT. It is a little faster and just + * as accurate. The disposition of the least significant bit depends on + * OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("mulhw %1, %2, %3\n\t" \ + "mullw %0, %2, %3" \ + : "=&r" (lo), "=&r" (hi) \ + : "%r" (x), "r" (y)) + +# define MAD_F_MLA(hi, lo, x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + MAD_F_MLX(__hi, __lo, (x), (y)); \ + asm ("addc %0, %2, %3\n\t" \ + "adde %1, %4, %5" \ + : "=r" (lo), "=r" (hi) \ + : "%r" (__lo), "0" (lo), "%r" (__hi), "1" (hi)); \ + }) + +# if defined(OPT_ACCURACY) +/* + * This is accurate and ~2 - 2.5 times slower than the unrounded version. + * + * The __volatile__ improves the generated code by another 5% (fewer spills + * to memory); eventually they should be removed. + */ +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + mad_fixed64hi_t __hi_; \ + mad_fixed64lo_t __lo_; \ + asm __volatile__ ("addc %0, %2, %4\n\t" \ + "addze %1, %3" \ + : "=r" (__lo_), "=r" (__hi_) \ + : "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1))); \ + asm __volatile__ ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ + "rlwimi %0, %1,32-%3,%3,31" \ + : "=&r" (__result) \ + : "r" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)); \ + __result; \ + }) +# else +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + asm ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ + "rlwimi %0, %1,32-%3,%3,31" \ + : "=r" (__result) \ + : "r" (lo), "r" (hi), "I" (MAD_F_SCALEBITS)); \ + __result; \ + }) +# endif /* OPT_ACCURACY */ + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* ------ OR32 ------------------------------------------------------------- */ + +# elif defined(FPM_OR32) + +/* We assume here that we always call macros in following sequence: + MAD_F_ML0 + MAD_F_MLA + ... + MAD_F_MLA + MAD_F_MLX +*/ + +# define MAD_F_MLX(hi, lo, x, y) \ + asm volatile ("l.mac %0,%1" : : "%r" (x), "r" (y)) + +# define MAD_F_MLA(hi, lo, x, y) MAX_F_MLX(hi, lo, x, y) + + +# define MAX_F_ML0(hi, lo, x, y) MAX_F_MLX(hi, lo, x, y) + +# define MAX_F_MLZ(hi, lo, x, y) \ + asm volatile ("l.macrc %0" : "=r" (lo)) + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- Default ------------------------------------------------------------- */ + +# elif defined(FPM_DEFAULT) + +/* + * This version is the most portable but it loses significant accuracy. + * Furthermore, accuracy is biased against the second argument, so care + * should be taken when ordering operands. + * + * The scale factors are constant as this is not used with SSO. + * + * Pre-rounding is required to stay within the limits of compliance. + */ +# define mad_f_mul(x, y) ( (((x) + (1L << 11)) >> 12) * \ + (((y) + (1L << 15)) >> 16) ) +/*# define mad_f_mul(x, y) ((x)+(y))*/ +/* --- Default 16 ------------------------------------------------------------- */ + +# elif defined(FPM_DEFAULT16) + +/* + * This version is the most portable but it loses significant accuracy. + * Furthermore, accuracy is biased against the second argument, so care + * should be taken when ordering operands. + * + * The scale factors are constant as this is not used with SSO. + * + * Pre-rounding is required to stay within the limits of compliance. + */ +# define mad_f_mul(x, y) (( (((x) + (1L << 15)) >> 16) * \ + (((y) + (1L << 15)) >> 16) ) << 4) +/* ------------------------------------------------------------------------- */ + +# else +# error "no FPM selected" +# endif + +/* default implementations */ + +# if !defined(mad_f_mul) +# define mad_f_mul(x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + MAD_F_MLX(__hi, __lo, (x), (y)); \ + mad_f_scale64(__hi, __lo); \ + }) +# endif + +# if !defined(MAD_F_MLA) +# define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) +# define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) +# define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) +# endif + +# if !defined(MAD_F_ML0) +# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) +# endif + +# if !defined(MAD_F_MLZ) +# define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) +# endif + +# if !defined(mad_f_scale64) +# if defined(OPT_ACCURACY) +# define mad_f_scale64(hi, lo) \ + ((((mad_fixed_t) \ + (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ + ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) +# else +# define mad_f_scale64(hi, lo) \ + ((mad_fixed_t) \ + (((hi) << (32 - MAD_F_SCALEBITS)) | \ + ((lo) >> MAD_F_SCALEBITS))) +# endif +# define MAD_F_SCALEBITS MAD_F_FRACBITS +# endif + +/* miscellaneous C routines */ + +mad_fixed_t mad_f_abs(mad_fixed_t); + +# endif
libmad/fixed.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/synth.c =================================================================== --- libmad/synth.c (nonexistent) +++ libmad/synth.c (revision 1765) @@ -0,0 +1,765 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: synth.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# include "fixed.h" +# include "frame.h" +# include "synth.h" +# include "../audio.h" + +#ifndef EMBED +# include +#endif + +/* + * NAME: synth->mute() + * DESCRIPTION: zero all polyphase filterbank values, resetting synthesis + */ +void mad_synth_mute(struct mad_synth *synth) +{ + unsigned int ch, s, v; + + for (ch = 0; ch < 2; ++ch) { + for (s = 0; s < 16; ++s) { + for (v = 0; v < 8; ++v) { + synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] = + synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0; + } + } + } +} + +/* + * NAME: synth->init() + * DESCRIPTION: initialize synth struct + */ +inline void mad_synth_init(struct mad_synth *synth) +{ + mad_synth_mute(synth); + + synth->phase = 0; + + synth->pcm.samplerate = 0; + synth->pcm.channels = 0; + synth->pcm.length = 0; +} + +/* + * An optional optimization called here the Subband Synthesis Optimization + * (SSO) improves the performance of subband synthesis at the expense of + * accuracy. + * + * The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such + * that extra scaling and rounding are not necessary. This often allows the + * compiler to use faster 32-bit multiply-accumulate instructions instead of + * explicit 64-bit multiply, shift, and add instructions. + * + * SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t + * values requires the result to be right-shifted 28 bits to be properly + * scaled to the same fixed-point format. Right shifts can be applied at any + * time to either operand or to the result, so the optimization involves + * careful placement of these shifts to minimize the loss of accuracy. + * + * First, a 14-bit shift is applied with rounding at compile-time to the D[] + * table of coefficients for the subband synthesis window. This only loses 2 + * bits of accuracy because the lower 12 bits are always zero. A second + * 12-bit shift occurs after the DCT calculation. This loses 12 bits of + * accuracy. Finally, a third 2-bit shift occurs just before the sample is + * saved in the PCM buffer. 14 + 12 + 2 == 28 bits. + */ + +/* FPM_DEFAULT without OPT_SSO will actually lose accuracy and performance */ + +# if defined(FPM_DEFAULT) && !defined(OPT_SSO) +# define OPT_SSO +# endif + +/* second SSO shift, with rounding */ + +# if defined(OPT_SSO) +# define SHIFT(x) (((x) + (1L << 11)) >> 12) +# else +# define SHIFT(x) (x) +# endif + +/* possible DCT speed optimization */ + +# if defined(OPT_SPEED) && defined(MAD_F_MLX) +# define OPT_DCTO +# define MUL(x, y) \ + ({ mad_fixed64hi_t hi; \ + mad_fixed64lo_t lo; \ + MAD_F_MLX(hi, lo, (x), (y)); \ + hi << (32 - MAD_F_SCALEBITS - 3); \ + }) +# else +# undef OPT_DCTO +# define MUL(x, y) mad_f_mul((x), (y)) +# endif + +/* + * NAME: dct32() + * DESCRIPTION: perform fast in[32]->out[32] DCT + */ +static +void dct32(mad_fixed_t const in[32], unsigned int slot, + mad_fixed_t lo[16][8], mad_fixed_t hi[16][8]) +{ + mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; + mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; + mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23; + mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31; + mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39; + mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47; + mad_fixed_t t48, t49, t50, t51, t52, t53, t54, t55; + mad_fixed_t t56, t57, t58, t59, t60, t61, t62, t63; + mad_fixed_t t64, t65, t66, t67, t68, t69, t70, t71; + mad_fixed_t t72, t73, t74, t75, t76, t77, t78, t79; + mad_fixed_t t80, t81, t82, t83, t84, t85, t86, t87; + mad_fixed_t t88, t89, t90, t91, t92, t93, t94, t95; + mad_fixed_t t96, t97, t98, t99, t100, t101, t102, t103; + mad_fixed_t t104, t105, t106, t107, t108, t109, t110, t111; + mad_fixed_t t112, t113, t114, t115, t116, t117, t118, t119; + mad_fixed_t t120, t121, t122, t123, t124, t125, t126, t127; + mad_fixed_t t128, t129, t130, t131, t132, t133, t134, t135; + mad_fixed_t t136, t137, t138, t139, t140, t141, t142, t143; + mad_fixed_t t144, t145, t146, t147, t148, t149, t150, t151; + mad_fixed_t t152, t153, t154, t155, t156, t157, t158, t159; + mad_fixed_t t160, t161, t162, t163, t164, t165, t166, t167; + mad_fixed_t t168, t169, t170, t171, t172, t173, t174, t175; + mad_fixed_t t176; + + /* costab[i] = cos(PI / (2 * 32) * i) */ + +# if defined(OPT_DCTO) + enum { + costab1 = MAD_F(0x7fd8878e), + costab2 = MAD_F(0x7f62368f), + costab3 = MAD_F(0x7e9d55fc), + costab4 = MAD_F(0x7d8a5f40), + costab5 = MAD_F(0x7c29fbee), + costab6 = MAD_F(0x7a7d055b), + costab7 = MAD_F(0x78848414), + costab8 = MAD_F(0x7641af3d), + costab9 = MAD_F(0x73b5ebd1), + costab10 = MAD_F(0x70e2cbc6), + costab11 = MAD_F(0x6dca0d14), + costab12 = MAD_F(0x6a6d98a4), + costab13 = MAD_F(0x66cf8120), + costab14 = MAD_F(0x62f201ac), + costab15 = MAD_F(0x5ed77c8a), + costab16 = MAD_F(0x5a82799a), + costab17 = MAD_F(0x55f5a4d2), + costab18 = MAD_F(0x5133cc94), + costab19 = MAD_F(0x4c3fdff4), + costab20 = MAD_F(0x471cece7), + costab21 = MAD_F(0x41ce1e65), + costab22 = MAD_F(0x3c56ba70), + costab23 = MAD_F(0x36ba2014), + costab24 = MAD_F(0x30fbc54d), + costab25 = MAD_F(0x2b1f34eb), + costab26 = MAD_F(0x25280c5e), + costab27 = MAD_F(0x1f19f97b), + costab28 = MAD_F(0x18f8b83c), + costab29 = MAD_F(0x12c8106f), + costab30 = MAD_F(0x0c8bd35e), + costab31 = MAD_F(0x0647d97c) + }; +# else + enum { + costab1 = MAD_F(0x0ffb10f2), /* 0.998795456 */ + costab2 = MAD_F(0x0fec46d2), /* 0.995184727 */ + costab3 = MAD_F(0x0fd3aac0), /* 0.989176510 */ + costab4 = MAD_F(0x0fb14be8), /* 0.980785280 */ + costab5 = MAD_F(0x0f853f7e), /* 0.970031253 */ + costab6 = MAD_F(0x0f4fa0ab), /* 0.956940336 */ + costab7 = MAD_F(0x0f109082), /* 0.941544065 */ + costab8 = MAD_F(0x0ec835e8), /* 0.923879533 */ + costab9 = MAD_F(0x0e76bd7a), /* 0.903989293 */ + costab10 = MAD_F(0x0e1c5979), /* 0.881921264 */ + costab11 = MAD_F(0x0db941a3), /* 0.857728610 */ + costab12 = MAD_F(0x0d4db315), /* 0.831469612 */ + costab13 = MAD_F(0x0cd9f024), /* 0.803207531 */ + costab14 = MAD_F(0x0c5e4036), /* 0.773010453 */ + costab15 = MAD_F(0x0bdaef91), /* 0.740951125 */ + costab16 = MAD_F(0x0b504f33), /* 0.707106781 */ + costab17 = MAD_F(0x0abeb49a), /* 0.671558955 */ + costab18 = MAD_F(0x0a267993), /* 0.634393284 */ + costab19 = MAD_F(0x0987fbfe), /* 0.595699304 */ + costab20 = MAD_F(0x08e39d9d), /* 0.555570233 */ + costab21 = MAD_F(0x0839c3cd), /* 0.514102744 */ + costab22 = MAD_F(0x078ad74e), /* 0.471396737 */ + costab23 = MAD_F(0x06d74402), /* 0.427555093 */ + costab24 = MAD_F(0x061f78aa), /* 0.382683432 */ + costab25 = MAD_F(0x0563e69d), /* 0.336889853 */ + costab26 = MAD_F(0x04a5018c), /* 0.290284677 */ + costab27 = MAD_F(0x03e33f2f), /* 0.242980180 */ + costab28 = MAD_F(0x031f1708), /* 0.195090322 */ + costab29 = MAD_F(0x0259020e), /* 0.146730474 */ + costab30 = MAD_F(0x01917a6c), /* 0.098017140 */ + costab31 = MAD_F(0x00c8fb30) /* 0.049067674 */ + }; +# endif + + t0 = in[0] + in[31]; t16 = MUL(in[0] - in[31], costab1); + t1 = in[15] + in[16]; t17 = MUL(in[15] - in[16], costab31); + + t41 = t16 + t17; + t59 = MUL(t16 - t17, costab2); + t33 = t0 + t1; + t50 = MUL(t0 - t1, costab2); + + t2 = in[7] + in[24]; t18 = MUL(in[7] - in[24], costab15); + t3 = in[8] + in[23]; t19 = MUL(in[8] - in[23], costab17); + + t42 = t18 + t19; + t60 = MUL(t18 - t19, costab30); + t34 = t2 + t3; + t51 = MUL(t2 - t3, costab30); + + t4 = in[3] + in[28]; t20 = MUL(in[3] - in[28], costab7); + t5 = in[12] + in[19]; t21 = MUL(in[12] - in[19], costab25); + + t43 = t20 + t21; + t61 = MUL(t20 - t21, costab14); + t35 = t4 + t5; + t52 = MUL(t4 - t5, costab14); + + t6 = in[4] + in[27]; t22 = MUL(in[4] - in[27], costab9); + t7 = in[11] + in[20]; t23 = MUL(in[11] - in[20], costab23); + + t44 = t22 + t23; + t62 = MUL(t22 - t23, costab18); + t36 = t6 + t7; + t53 = MUL(t6 - t7, costab18); + + t8 = in[1] + in[30]; t24 = MUL(in[1] - in[30], costab3); + t9 = in[14] + in[17]; t25 = MUL(in[14] - in[17], costab29); + + t45 = t24 + t25; + t63 = MUL(t24 - t25, costab6); + t37 = t8 + t9; + t54 = MUL(t8 - t9, costab6); + + t10 = in[6] + in[25]; t26 = MUL(in[6] - in[25], costab13); + t11 = in[9] + in[22]; t27 = MUL(in[9] - in[22], costab19); + + t46 = t26 + t27; + t64 = MUL(t26 - t27, costab26); + t38 = t10 + t11; + t55 = MUL(t10 - t11, costab26); + + t12 = in[2] + in[29]; t28 = MUL(in[2] - in[29], costab5); + t13 = in[13] + in[18]; t29 = MUL(in[13] - in[18], costab27); + + t47 = t28 + t29; + t65 = MUL(t28 - t29, costab10); + t39 = t12 + t13; + t56 = MUL(t12 - t13, costab10); + + t14 = in[5] + in[26]; t30 = MUL(in[5] - in[26], costab11); + t15 = in[10] + in[21]; t31 = MUL(in[10] - in[21], costab21); + + t48 = t30 + t31; + t66 = MUL(t30 - t31, costab22); + t40 = t14 + t15; + t57 = MUL(t14 - t15, costab22); + + t69 = t33 + t34; t89 = MUL(t33 - t34, costab4); + t70 = t35 + t36; t90 = MUL(t35 - t36, costab28); + t71 = t37 + t38; t91 = MUL(t37 - t38, costab12); + t72 = t39 + t40; t92 = MUL(t39 - t40, costab20); + t73 = t41 + t42; t94 = MUL(t41 - t42, costab4); + t74 = t43 + t44; t95 = MUL(t43 - t44, costab28); + t75 = t45 + t46; t96 = MUL(t45 - t46, costab12); + t76 = t47 + t48; t97 = MUL(t47 - t48, costab20); + + t78 = t50 + t51; t100 = MUL(t50 - t51, costab4); + t79 = t52 + t53; t101 = MUL(t52 - t53, costab28); + t80 = t54 + t55; t102 = MUL(t54 - t55, costab12); + t81 = t56 + t57; t103 = MUL(t56 - t57, costab20); + + t83 = t59 + t60; t106 = MUL(t59 - t60, costab4); + t84 = t61 + t62; t107 = MUL(t61 - t62, costab28); + t85 = t63 + t64; t108 = MUL(t63 - t64, costab12); + t86 = t65 + t66; t109 = MUL(t65 - t66, costab20); + + t113 = t69 + t70; + t114 = t71 + t72; + + /* 0 */ hi[15][slot] = SHIFT(t113 + t114); + /* 16 */ lo[ 0][slot] = SHIFT(MUL(t113 - t114, costab16)); + + t115 = t73 + t74; + t116 = t75 + t76; + + t32 = t115 + t116; + + /* 1 */ hi[14][slot] = SHIFT(t32); + + t118 = t78 + t79; + t119 = t80 + t81; + + t58 = t118 + t119; + + /* 2 */ hi[13][slot] = SHIFT(t58); + + t121 = t83 + t84; + t122 = t85 + t86; + + t67 = t121 + t122; + + t49 = (t67 << 1) - t32; + + /* 3 */ hi[12][slot] = SHIFT(t49); + + t125 = t89 + t90; + t126 = t91 + t92; + + t93 = t125 + t126; + + /* 4 */ hi[11][slot] = SHIFT(t93); + + t128 = t94 + t95; + t129 = t96 + t97; + + t98 = t128 + t129; + + t68 = (t98 << 1) - t49; + + /* 5 */ hi[10][slot] = SHIFT(t68); + + t132 = t100 + t101; + t133 = t102 + t103; + + t104 = t132 + t133; + + t82 = (t104 << 1) - t58; + + /* 6 */ hi[ 9][slot] = SHIFT(t82); + + t136 = t106 + t107; + t137 = t108 + t109; + + t110 = t136 + t137; + + t87 = (t110 << 1) - t67; + + t77 = (t87 << 1) - t68; + + /* 7 */ hi[ 8][slot] = SHIFT(t77); + + t141 = MUL(t69 - t70, costab8); + t142 = MUL(t71 - t72, costab24); + t143 = t141 + t142; + + /* 8 */ hi[ 7][slot] = SHIFT(t143); + /* 24 */ lo[ 8][slot] = + SHIFT((MUL(t141 - t142, costab16) << 1) - t143); + + t144 = MUL(t73 - t74, costab8); + t145 = MUL(t75 - t76, costab24); + t146 = t144 + t145; + + t88 = (t146 << 1) - t77; + + /* 9 */ hi[ 6][slot] = SHIFT(t88); + + t148 = MUL(t78 - t79, costab8); + t149 = MUL(t80 - t81, costab24); + t150 = t148 + t149; + + t105 = (t150 << 1) - t82; + + /* 10 */ hi[ 5][slot] = SHIFT(t105); + + t152 = MUL(t83 - t84, costab8); + t153 = MUL(t85 - t86, costab24); + t154 = t152 + t153; + + t111 = (t154 << 1) - t87; + + t99 = (t111 << 1) - t88; + + /* 11 */ hi[ 4][slot] = SHIFT(t99); + + t157 = MUL(t89 - t90, costab8); + t158 = MUL(t91 - t92, costab24); + t159 = t157 + t158; + + t127 = (t159 << 1) - t93; + + /* 12 */ hi[ 3][slot] = SHIFT(t127); + + t160 = (MUL(t125 - t126, costab16) << 1) - t127; + + /* 20 */ lo[ 4][slot] = SHIFT(t160); + /* 28 */ lo[12][slot] = + SHIFT((((MUL(t157 - t158, costab16) << 1) - t159) << 1) - t160); + + t161 = MUL(t94 - t95, costab8); + t162 = MUL(t96 - t97, costab24); + t163 = t161 + t162; + + t130 = (t163 << 1) - t98; + + t112 = (t130 << 1) - t99; + + /* 13 */ hi[ 2][slot] = SHIFT(t112); + + t164 = (MUL(t128 - t129, costab16) << 1) - t130; + + t166 = MUL(t100 - t101, costab8); + t167 = MUL(t102 - t103, costab24); + t168 = t166 + t167; + + t134 = (t168 << 1) - t104; + + t120 = (t134 << 1) - t105; + + /* 14 */ hi[ 1][slot] = SHIFT(t120); + + t135 = (MUL(t118 - t119, costab16) << 1) - t120; + + /* 18 */ lo[ 2][slot] = SHIFT(t135); + + t169 = (MUL(t132 - t133, costab16) << 1) - t134; + + t151 = (t169 << 1) - t135; + + /* 22 */ lo[ 6][slot] = SHIFT(t151); + + t170 = (((MUL(t148 - t149, costab16) << 1) - t150) << 1) - t151; + + /* 26 */ lo[10][slot] = SHIFT(t170); + /* 30 */ lo[14][slot] = + SHIFT((((((MUL(t166 - t167, costab16) << 1) - + t168) << 1) - t169) << 1) - t170); + + t171 = MUL(t106 - t107, costab8); + t172 = MUL(t108 - t109, costab24); + t173 = t171 + t172; + + t138 = (t173 << 1) - t110; + + t123 = (t138 << 1) - t111; + + t139 = (MUL(t121 - t122, costab16) << 1) - t123; + + t117 = (t123 << 1) - t112; + + /* 15 */ hi[ 0][slot] = SHIFT(t117); + + t124 = (MUL(t115 - t116, costab16) << 1) - t117; + + /* 17 */ lo[ 1][slot] = SHIFT(t124); + + t131 = (t139 << 1) - t124; + + /* 19 */ lo[ 3][slot] = SHIFT(t131); + + t140 = (t164 << 1) - t131; + + /* 21 */ lo[ 5][slot] = SHIFT(t140); + + t174 = (MUL(t136 - t137, costab16) << 1) - t138; + + t155 = (t174 << 1) - t139; + + t147 = (t155 << 1) - t140; + + /* 23 */ lo[ 7][slot] = SHIFT(t147); + + t156 = (((MUL(t144 - t145, costab16) << 1) - t146) << 1) - t147; + + /* 25 */ lo[ 9][slot] = SHIFT(t156); + + t175 = (((MUL(t152 - t153, costab16) << 1) - t154) << 1) - t155; + + t165 = (t175 << 1) - t156; + + /* 27 */ lo[11][slot] = SHIFT(t165); + + t176 = (((((MUL(t161 - t162, costab16) << 1) - + t163) << 1) - t164) << 1) - t165; + + /* 29 */ lo[13][slot] = SHIFT(t176); + /* 31 */ lo[15][slot] = + SHIFT((((((((MUL(t171 - t172, costab16) << 1) - + t173) << 1) - t174) << 1) - t175) << 1) - t176); + + /* + * Totals: + * 80 multiplies + * 80 additions + * 119 subtractions + * 49 shifts (not counting SSO) + */ +} + +# undef MUL +# undef SHIFT + +/* third SSO shift and/or D[] optimization preshift */ + +# if defined(OPT_SSO) +# if MAD_F_FRACBITS != 28 +# error "MAD_F_FRACBITS must be 28 to use OPT_SSO" +# endif +# define ML0(hi, lo, x, y) ((lo) = (x) * (y)) +# define MLA(hi, lo, x, y) ((lo) += (x) * (y)) +# define MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) +# define SHIFT(x) ((x) >> 2) +# define PRESHIFT(x) ((MAD_F(x) + (1L << 13)) >> 14) +# else +# define ML0(hi, lo, x, y) MAD_F_ML0((hi), (lo), (x), (y)) +# define MLA(hi, lo, x, y) MAD_F_MLA((hi), (lo), (x), (y)) +# define MLZ(hi, lo) MAD_F_MLZ((hi), (lo)) +# define SHIFT(x) (x) +# if defined(MAD_F_SCALEBITS) +# undef MAD_F_SCALEBITS +# define MAD_F_SCALEBITS (MAD_F_FRACBITS - 12) +# define PRESHIFT(x) (MAD_F(x) >> 12) +# else +# define PRESHIFT(x) MAD_F(x) +# endif +# endif + +static +mad_fixed_t const D[17][32] = { +# include "D.dat" +}; + +/* 3. called to process output */ + +int speed = 0, nchan = 0; + +# ifndef EMBED +int output_s(unsigned char const *ptr, unsigned int len); +# endif + +static inline void +output(struct mad_pcm *pcm) +{ + unsigned int nchannels; + union audio_control control; + mad_fixed_t *ch1, *ch2; + + nchannels = pcm->channels; + + if (nchannels != nchan || speed != pcm->samplerate) + { +# ifndef EMBED + control.command = AUDIO_COMMAND_CONFIG; + + control.config.channels = nchannels; + control.config.speed = pcm->samplerate; + + if (audio_oss(&control) == -1) + return; +# endif + nchan = nchannels; + speed = pcm->samplerate; + } + ch1 = &pcm->samples[0][0]; + ch2 = &pcm->samples[1][0]; + + if (nchan == 1) + ch2 = ch1; + + { + unsigned char data[MAX_NSAMPLES * 4 * 2]; + unsigned int len; + + len = audio_pcm_s16le(data, pcm->length, ch1, ch2); +# ifndef EMBED + output_s(data, len); +# endif + } + return; +} + +# if defined(ASO_SYNTH) +void synth_full(struct mad_synth *, struct mad_frame const *, + unsigned int, unsigned int); +# else +/* + * NAME: synth->full() + * DESCRIPTION: perform full frequency PCM synthesis + */ +static inline +void synth_full(struct mad_synth *synth, struct mad_frame const *frame, + unsigned int nch, unsigned int ns) +{ + unsigned int phase, ch, s, sb, pe, po; + mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8]; + mad_fixed_t const (*sbsample)[36][32]; + register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; + register mad_fixed_t const (*Dptr)[32], *ptr; + register mad_fixed64hi_t hi; + register mad_fixed64lo_t lo; + + phase = synth->phase; + + for (s = 0; s < ns; ++s) { + for (ch = 0; ch < nch; ++ch) { + sbsample = &frame->sbsample[ch]; + filter = &synth->filter[ch]; + pcm1 = synth->pcm.samples[ch]; + + dct32((*sbsample)[s], phase >> 1, + (*filter)[0][phase & 1], (*filter)[1][phase & 1]); + + pe = phase & ~1; + po = ((phase - 1) & 0xf) | 1; + + /* calculate 32 samples */ + + fe = &(*filter)[0][ phase & 1][0]; + fx = &(*filter)[0][~phase & 1][0]; + fo = &(*filter)[1][~phase & 1][0]; + + Dptr = &D[0]; + + ptr = *Dptr + pe; + ML0(hi, lo, (*fe)[0], ptr[ 0]); + MLA(hi, lo, (*fe)[1], ptr[14]); + MLA(hi, lo, (*fe)[2], ptr[12]); + MLA(hi, lo, (*fe)[3], ptr[10]); + MLA(hi, lo, (*fe)[4], ptr[ 8]); + MLA(hi, lo, (*fe)[5], ptr[ 6]); + MLA(hi, lo, (*fe)[6], ptr[ 4]); + MLA(hi, lo, (*fe)[7], ptr[ 2]); + + ptr = *Dptr + po; + MLA(hi, lo, (*fx)[0], -ptr[ 0]); + MLA(hi, lo, (*fx)[1], -ptr[14]); + MLA(hi, lo, (*fx)[2], -ptr[12]); + MLA(hi, lo, (*fx)[3], -ptr[10]); + MLA(hi, lo, (*fx)[4], -ptr[ 8]); + MLA(hi, lo, (*fx)[5], -ptr[ 6]); + MLA(hi, lo, (*fx)[6], -ptr[ 4]); + MLA(hi, lo, (*fx)[7], -ptr[ 2]); + + *pcm1++ = SHIFT(MLZ(hi, lo)); + + pcm2 = pcm1 + 30; + + for (sb = 1; sb < 16; ++sb) { + ++fe; + ++Dptr; + + /* D[32 - sb][i] == -D[sb][31 - i] */ + + ptr = *Dptr + pe; + ML0(hi, lo, (*fe)[7], ptr[ 2]); + MLA(hi, lo, (*fe)[6], ptr[ 4]); + MLA(hi, lo, (*fe)[5], ptr[ 6]); + MLA(hi, lo, (*fe)[4], ptr[ 8]); + MLA(hi, lo, (*fe)[3], ptr[10]); + MLA(hi, lo, (*fe)[2], ptr[12]); + MLA(hi, lo, (*fe)[1], ptr[14]); + MLA(hi, lo, (*fe)[0], ptr[ 0]); + + ptr = *Dptr + po; + MLA(hi, lo, (*fo)[0], -ptr[ 0]); + MLA(hi, lo, (*fo)[1], -ptr[14]); + MLA(hi, lo, (*fo)[2], -ptr[12]); + MLA(hi, lo, (*fo)[3], -ptr[10]); + MLA(hi, lo, (*fo)[4], -ptr[ 8]); + MLA(hi, lo, (*fo)[5], -ptr[ 6]); + MLA(hi, lo, (*fo)[6], -ptr[ 4]); + MLA(hi, lo, (*fo)[7], -ptr[ 2]); + + *pcm1++ = SHIFT(MLZ(hi, lo)); + + ptr = *Dptr - po; + ML0(hi, lo, (*fo)[7], ptr[31 - 2]); + MLA(hi, lo, (*fo)[6], ptr[31 - 4]); + MLA(hi, lo, (*fo)[5], ptr[31 - 6]); + MLA(hi, lo, (*fo)[4], ptr[31 - 8]); + MLA(hi, lo, (*fo)[3], ptr[31 - 10]); + MLA(hi, lo, (*fo)[2], ptr[31 - 12]); + MLA(hi, lo, (*fo)[1], ptr[31 - 14]); + MLA(hi, lo, (*fo)[0], ptr[31 - 16]); + + ptr = *Dptr - pe; + MLA(hi, lo, (*fe)[0], ptr[31 - 16]); + MLA(hi, lo, (*fe)[1], ptr[31 - 14]); + MLA(hi, lo, (*fe)[2], ptr[31 - 12]); + MLA(hi, lo, (*fe)[3], ptr[31 - 10]); + MLA(hi, lo, (*fe)[4], ptr[31 - 8]); + MLA(hi, lo, (*fe)[5], ptr[31 - 6]); + MLA(hi, lo, (*fe)[6], ptr[31 - 4]); + MLA(hi, lo, (*fe)[7], ptr[31 - 2]); + + *pcm2-- = SHIFT(MLZ(hi, lo)); + + ++fo; + } + + ++Dptr; + + ptr = *Dptr + po; + ML0(hi, lo, (*fo)[0], ptr[ 0]); + MLA(hi, lo, (*fo)[1], ptr[14]); + MLA(hi, lo, (*fo)[2], ptr[12]); + MLA(hi, lo, (*fo)[3], ptr[10]); + MLA(hi, lo, (*fo)[4], ptr[ 8]); + MLA(hi, lo, (*fo)[5], ptr[ 6]); + MLA(hi, lo, (*fo)[6], ptr[ 4]); + MLA(hi, lo, (*fo)[7], ptr[ 2]); + + *pcm1 = SHIFT(-MLZ(hi, lo)); + } + + phase = (phase + 1) % 16; + + synth->pcm.length = 32; + output (&synth->pcm); + } +} +# endif + +/* + * NAME: synth->frame() + * DESCRIPTION: perform PCM synthesis of frame subband samples + */ +void inline mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame) +{ + unsigned int nch, ns; + + nch = MAD_NCHANNELS(&frame->header); + ns = MAD_NSBSAMPLES(&frame->header); + + synth->pcm.samplerate = frame->header.samplerate; + synth->pcm.channels = nch; + synth->pcm.length = 32 * ns; + + synth_full(synth, frame, nch, ns); + + synth->phase = (synth->phase + ns) % 16; +}
libmad/synth.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/global.h =================================================================== --- libmad/global.h (nonexistent) +++ libmad/global.h (revision 1765) @@ -0,0 +1,45 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: global.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_GLOBAL_H +# define LIBMAD_GLOBAL_H + +/* conditional debugging */ + +# if defined(DEBUG) && defined(NDEBUG) +# error "cannot define both DEBUG and NDEBUG" +# endif + +# if defined(DEBUG) +# include +# endif + +/* conditional features */ + +# if defined(OPT_SPEED) && defined(OPT_ACCURACY) +# error "cannot optimize for both speed and accuracy" +# endif + +# if defined(OPT_SPEED) && !defined(OPT_SSO) +# define OPT_SSO 1 +# endif + +# endif
libmad/global.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/decoder.c =================================================================== --- libmad/decoder.c (nonexistent) +++ libmad/decoder.c (revision 1765) @@ -0,0 +1,134 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: decoder.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# include "stream.h" +# include "frame.h" +# include "synth.h" +# include "decoder.h" + +extern int test_button(void); + +inline void mad_decoder_init(struct mad_decoder *decoder, void *data, + enum mad_flow (*input_func)(void *, struct mad_stream *), + enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *frame)) +{ + decoder->mode = -1; + + decoder->options = 0; + + decoder->sync = 0; + + decoder->cb_data = data; + + decoder->input_func = input_func; + decoder->error_func = error_func; +} + +inline +int mad_decoder_finish(struct mad_decoder *decoder) +{ + return 0; +} + + +/* Both parameters are required. */ +inline static +int run_sync(struct mad_decoder *decoder) +{ + enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); + void *error_data; + int bad_last_frame = 0; + struct mad_stream *stream; + struct mad_frame *frame; + struct mad_synth *synth; + int result = 0; + + error_func = decoder->error_func; + error_data = decoder->cb_data; + + stream = &decoder->sync->stream; + frame = &decoder->sync->frame; + synth = &decoder->sync->synth; + + mad_stream_init(stream); + mad_frame_init(frame); + mad_synth_init(synth); + + mad_stream_options(stream, decoder->options); + + do { + switch (decoder->input_func(decoder->cb_data, stream)) { + case MAD_FLOW_STOP: + goto done; + case MAD_FLOW_BREAK: + goto fail; + case MAD_FLOW_IGNORE: + continue; + case MAD_FLOW_CONTINUE: + break; + } + + while (1) { + if (mad_frame_decode(frame, stream) == -1) { + if (!MAD_RECOVERABLE(stream->error)) + break; + + error_func(error_data, stream, frame); + goto done; + } + else + bad_last_frame = 0; + + mad_synth_frame(synth, frame); + if(test_button()) + return 1; + } + } + while (stream->error == MAD_ERROR_BUFLEN); + + fail: + result = -1; + + done: + mad_synth_finish(synth); + mad_frame_finish(frame); + mad_stream_finish(stream); + + return result; +} + +inline int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode) +{ + int result; + struct dec_sync_struct sync; + decoder->sync = &sync; + + result = run_sync(decoder); + + decoder->sync = 0; + return result; +}
libmad/decoder.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/mad.h =================================================================== --- libmad/mad.h (nonexistent) +++ libmad/mad.h (revision 1765) @@ -0,0 +1,928 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * If you would like to negotiate alternate licensing terms, you may do + * so by contacting the author: Robert Leslie + */ + +# define FPM_DEFAULT + +# define SIZEOF_INT 2 +# define SIZEOF_LONG 4 +# define SIZEOF_LONG_LONG 8 + +/* Id: fixed.h,v 1.1.1.1 2001/06/19 11:12:37 markom Exp */ + +# ifndef LIBMAD_FIXED_H +# define LIBMAD_FIXED_H + +# if SIZEOF_INT >= 4 +typedef signed int mad_fixed_t; + +typedef signed int mad_fixed64hi_t; +typedef unsigned int mad_fixed64lo_t; +# else +typedef signed long mad_fixed_t; + +typedef signed long mad_fixed64hi_t; +typedef unsigned long mad_fixed64lo_t; +# endif + +/* + * Fixed-point format: 0xABBBBBBB + * A == whole part (sign + 3 bits) + * B == fractional part (28 bits) + * + * Values are signed two's complement, so the effective range is: + * 0x80000000 to 0x7fffffff + * -8.0 to +7.9999999962747097015380859375 + * + * The smallest representable value is: + * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) + * + * 28 bits of fractional accuracy represent about + * 8.6 digits of decimal accuracy. + * + * Fixed-point numbers can be added or subtracted as normal + * integers, but multiplication requires shifting the 64-bit result + * from 56 fractional bits back to 28 (and rounding.) + * + * Changing the definition of MAD_F_FRACBITS is only partially + * supported, and must be done with care. + */ + +# define MAD_F_FRACBITS 28 + +# if MAD_F_FRACBITS == 28 +# define MAD_F(x) ((mad_fixed_t) (x##L)) +# else +# if MAD_F_FRACBITS < 28 +# warning "MAD_F_FRACBITS < 28" +# define MAD_F(x) ((mad_fixed_t) \ + (((x##L) + \ + (1L << (28 - MAD_F_FRACBITS - 1))) >> \ + (28 - MAD_F_FRACBITS))) +# elif MAD_F_FRACBITS > 28 +# error "MAD_F_FRACBITS > 28 not currently supported" +# define MAD_F(x) ((mad_fixed_t) \ + ((x##L) << (MAD_F_FRACBITS - 28))) +# endif +# endif + +# define MAD_F_MIN ((mad_fixed_t) -0x80000000L) +# define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) + +# define MAD_F_ONE MAD_F(0x10000000) + +#ifndef EMBED +# define mad_f_tofixed(x) ((mad_fixed_t) \ + ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) +# define mad_f_todouble(x) ((double) \ + ((x) / (double) (1L << MAD_F_FRACBITS))) +#endif + +# define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) +# define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) + /* (x should be positive) */ + +# define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) + +# define mad_f_add(x, y) ((x) + (y)) +# define mad_f_sub(x, y) ((x) - (y)) + +# if defined(FPM_64BIT) + +/* + * This version should be the most accurate if 64-bit (long long) types are + * supported by the compiler, although it may not be the most efficient. + */ +# if defined(OPT_ACCURACY) +# define mad_f_mul(x, y) \ + ((mad_fixed_t) \ + ((((signed long long) (x) * (y)) + \ + (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) +# else +# define mad_f_mul(x, y) \ + ((mad_fixed_t) (((signed long long) (x) * (y)) >> MAD_F_SCALEBITS)) +# endif + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- Intel --------------------------------------------------------------- */ +# elif defined(FPM_INTEL) + +/* + * This Intel version is fast and accurate; the disposition of the least + * significant bit depends on OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("imull %3" \ + : "=a" (lo), "=d" (hi) \ + : "%a" (x), "rm" (y) \ + : "cc") + +# if defined(OPT_ACCURACY) +/* + * This gives best accuracy but is not very fast. + */ +# define MAD_F_MLA(hi, lo, x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + MAD_F_MLX(__hi, __lo, (x), (y)); \ + asm ("addl %2,%0\n\t" \ + "adcl %3,%1" \ + : "=rm" (lo), "=rm" (hi) \ + : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ + : "cc"); \ + }) +# endif /* OPT_ACCURACY */ + +# if defined(OPT_ACCURACY) +/* + * Surprisingly, this is faster than SHRD followed by ADC. + */ +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed64hi_t __hi_; \ + mad_fixed64lo_t __lo_; \ + mad_fixed_t __result; \ + asm ("addl %4,%2\n\t" \ + "adcl %5,%3" \ + : "=rm" (__lo_), "=rm" (__hi_) \ + : "0" (lo), "1" (hi), \ + "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ + : "cc"); \ + asm ("shrdl %3,%2,%1" \ + : "=rm" (__result) \ + : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) +# else +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + asm ("shrdl %3,%2,%1" \ + : "=rm" (__result) \ + : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) +# endif /* OPT_ACCURACY */ + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- ARM ----------------------------------------------------------------- */ + +# elif defined(FPM_ARM) + +/* + * This ARM V4 version is as accurate as FPM_64BIT but much faster. The + * least significant bit is properly rounded at no CPU cycle cost! + */ +# if 1 +/* + * There's a bug somewhere, possibly in the compiler, that sometimes makes + * this necessary instead of the default implementation via MAD_F_MLX and + * mad_f_scale64. It may be related to the use (or lack) of + * -finline-functions and/or -fstrength-reduce. + * + * This is also apparently faster than MAD_F_MLX/mad_f_scale64. + */ +# define mad_f_mul(x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + mad_fixed_t __result; \ + asm ("smull %0, %1, %3, %4\n\t" \ + "movs %0, %0, lsr %5\n\t" \ + "adc %2, %0, %1, lsl %6" \ + : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ + : "%r" (x), "r" (y), \ + "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) +# endif + +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("smull %0, %1, %2, %3" \ + : "=&r" (lo), "=&r" (hi) \ + : "%r" (x), "r" (y)) + +# define MAD_F_MLA(hi, lo, x, y) \ + asm ("smlal %0, %1, %2, %3" \ + : "+r" (lo), "+r" (hi) \ + : "%r" (x), "r" (y)) + +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + asm ("movs %0, %1, lsr %3\n\t" \ + "adc %0, %0, %2, lsl %4" \ + : "=r" (__result) \ + : "r" (lo), "r" (hi), \ + "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ + : "cc"); \ + __result; \ + }) + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- MIPS ---------------------------------------------------------------- */ + +# elif defined(FPM_MIPS) + +/* + * This MIPS version is fast and accurate; the disposition of the least + * significant bit depends on OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("mult %2,%3" \ + : "=l" (lo), "=h" (hi) \ + : "%r" (x), "r" (y)) + +# if defined(HAVE_MADD_ASM) +# define MAD_F_MLA(hi, lo, x, y) \ + asm ("madd %2,%3" \ + : "+l" (lo), "+h" (hi) \ + : "%r" (x), "r" (y)) +# elif defined(HAVE_MADD16_ASM) +/* + * This loses significant accuracy due to the 16-bit integer limit in the + * multiply/accumulate instruction. + */ +# define MAD_F_ML0(hi, lo, x, y) \ + asm ("mult %2,%3" \ + : "=l" (lo), "=h" (hi) \ + : "%r" ((x) >> 12), "r" ((y) >> 16)) +# define MAD_F_MLA(hi, lo, x, y) \ + asm ("madd16 %2,%3" \ + : "+l" (lo), "+h" (hi) \ + : "%r" ((x) >> 12), "r" ((y) >> 16)) +# define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) +# endif + +# if defined(OPT_SPEED) +# define mad_f_scale64(hi, lo) \ + ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) +# define MAD_F_SCALEBITS MAD_F_FRACBITS +# endif + +/* --- SPARC --------------------------------------------------------------- */ + +# elif defined(FPM_SPARC) + +/* + * This SPARC V8 version is fast and accurate; the disposition of the least + * significant bit depends on OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("smul %2, %3, %0\n\t" \ + "rd %%y, %1" \ + : "=r" (lo), "=r" (hi) \ + : "%r" (x), "rI" (y)) + +/* --- PowerPC ------------------------------------------------------------- */ + +# elif defined(FPM_PPC) + +/* + * This PowerPC version is tuned for the 4xx embedded processors. It is + * effectively a tuned version of FPM_64BIT. It is a little faster and just + * as accurate. The disposition of the least significant bit depends on + * OPT_ACCURACY via mad_f_scale64(). + */ +# define MAD_F_MLX(hi, lo, x, y) \ + asm ("mulhw %1, %2, %3\n\t" \ + "mullw %0, %2, %3" \ + : "=&r" (lo), "=&r" (hi) \ + : "%r" (x), "r" (y)) + +# define MAD_F_MLA(hi, lo, x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + MAD_F_MLX(__hi, __lo, (x), (y)); \ + asm ("addc %0, %2, %3\n\t" \ + "adde %1, %4, %5" \ + : "=r" (lo), "=r" (hi) \ + : "%r" (__lo), "0" (lo), "%r" (__hi), "1" (hi)); \ + }) + +# if defined(OPT_ACCURACY) +/* + * This is accurate and ~2 - 2.5 times slower than the unrounded version. + * + * The __volatile__ improves the generated code by another 5% (fewer spills + * to memory); eventually they should be removed. + */ +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + mad_fixed64hi_t __hi_; \ + mad_fixed64lo_t __lo_; \ + asm __volatile__ ("addc %0, %2, %4\n\t" \ + "addze %1, %3" \ + : "=r" (__lo_), "=r" (__hi_) \ + : "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1))); \ + asm __volatile__ ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ + "rlwimi %0, %1,32-%3,%3,31" \ + : "=&r" (__result) \ + : "r" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)); \ + __result; \ + }) +# else +# define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ + asm ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ + "rlwimi %0, %1,32-%3,%3,31" \ + : "=r" (__result) \ + : "r" (lo), "r" (hi), "I" (MAD_F_SCALEBITS)); \ + __result; \ + }) +# endif /* OPT_ACCURACY */ + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* ------ OR32 ------------------------------------------------------------- */ + +# elif defined(FPM_OR32) + +/* We assume here that we always call macros in following sequence: + MAD_F_ML0 + MAD_F_MLA + ... + MAD_F_MLA + MAD_F_MLX +*/ + +# define MAD_F_MLX(hi, lo, x, y) \ + asm volatile ("l.mac %0,%1" : : "%r" (x), "r" (y)) + +# define MAD_F_MLA(hi, lo, x, y) MAX_F_MLX(hi, lo, x, y) + +# define MAX_F_ML0(hi, lo, x, y) MAX_F_MLX(hi, lo, x, y) + +# define MAX_F_MLZ(hi, lo, x, y) \ + asm volatile ("l.macrc %0" : "=r" (lo)) + +# define MAD_F_SCALEBITS MAD_F_FRACBITS + +/* --- Default ------------------------------------------------------------- */ + +# elif defined(FPM_DEFAULT) + +/* + * This version is the most portable but it loses significant accuracy. + * Furthermore, accuracy is biased against the second argument, so care + * should be taken when ordering operands. + * + * The scale factors are constant as this is not used with SSO. + * + * Pre-rounding is required to stay within the limits of compliance. + */ +# define mad_f_mul(x, y) ( (((x) + (1L << 11)) >> 12) * \ + (((y) + (1L << 15)) >> 16) ) +/*# define mad_f_mul(x, y) ((x)+(y))*/ +/* --- Default 16 ------------------------------------------------------------- */ + +# elif defined(FPM_DEFAULT16) + +/* + * This version is the most portable but it loses significant accuracy. + * Furthermore, accuracy is biased against the second argument, so care + * should be taken when ordering operands. + * + * The scale factors are constant as this is not used with SSO. + * + * Pre-rounding is required to stay within the limits of compliance. + */ +# define mad_f_mul(x, y) (( (((x) + (1L << 15)) >> 16) * \ + (((y) + (1L << 15)) >> 16) ) << 4) +/* ------------------------------------------------------------------------- */ + +# else +# error "no FPM selected" +# endif + +/* default implementations */ + +# if !defined(mad_f_mul) +# define mad_f_mul(x, y) \ + ({ mad_fixed64hi_t __hi; \ + mad_fixed64lo_t __lo; \ + MAD_F_MLX(__hi, __lo, (x), (y)); \ + mad_f_scale64(__hi, __lo); \ + }) +# endif + +# if !defined(MAD_F_MLA) +# define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) +# define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) +# define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) +# endif + +# if !defined(MAD_F_ML0) +# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) +# endif + +# if !defined(MAD_F_MLZ) +# define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) +# endif + +# if !defined(mad_f_scale64) +# if defined(OPT_ACCURACY) +# define mad_f_scale64(hi, lo) \ + ((((mad_fixed_t) \ + (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ + ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) +# else +# define mad_f_scale64(hi, lo) \ + ((mad_fixed_t) \ + (((hi) << (32 - MAD_F_SCALEBITS)) | \ + ((lo) >> MAD_F_SCALEBITS))) +# endif +# define MAD_F_SCALEBITS MAD_F_FRACBITS +# endif + +/* miscellaneous C routines */ + +mad_fixed_t mad_f_abs(mad_fixed_t); + +# endif + +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: mad.h,v 1.1 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_BIT_H +# define LIBMAD_BIT_H + +struct mad_bitptr { + unsigned char const *byte; + unsigned short cache; + unsigned short left; +}; + +void mad_bit_init(struct mad_bitptr *, unsigned char const *); + +# define mad_bit_finish(bitptr) /* nothing */ + +unsigned int mad_bit_length(struct mad_bitptr const *, + struct mad_bitptr const *); + +# define mad_bit_bitsleft(bitptr) ((bitptr)->left) +unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); + +void mad_bit_skip(struct mad_bitptr *, unsigned int); +unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); +void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); + +unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); + +# endif + +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: mad.h,v 1.1 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_TIMER_H +# define LIBMAD_TIMER_H + +typedef struct { + signed long seconds; /* whole seconds */ + unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ +} mad_timer_t; + +extern mad_timer_t const mad_timer_zero; + +# define MAD_TIMER_RESOLUTION 352800000UL + +enum mad_units { + MAD_UNITS_HOURS = -2, + MAD_UNITS_MINUTES = -1, + MAD_UNITS_SECONDS = 0, + + /* metric units */ + + MAD_UNITS_DECISECONDS = 10, + MAD_UNITS_CENTISECONDS = 100, + MAD_UNITS_MILLISECONDS = 1000, + + /* audio sample units */ + + MAD_UNITS_8000_HZ = 8000, + MAD_UNITS_11025_HZ = 11025, + MAD_UNITS_12000_HZ = 12000, + + MAD_UNITS_16000_HZ = 16000, + MAD_UNITS_22050_HZ = 22050, + MAD_UNITS_24000_HZ = 24000, + + MAD_UNITS_32000_HZ = 32000, + MAD_UNITS_44100_HZ = 44100, + MAD_UNITS_48000_HZ = 48000, + + /* video frame/field units */ + + MAD_UNITS_24_FPS = 24, + MAD_UNITS_25_FPS = 25, + MAD_UNITS_30_FPS = 30, + MAD_UNITS_48_FPS = 48, + MAD_UNITS_50_FPS = 50, + MAD_UNITS_60_FPS = 60, + + /* CD audio frames */ + + MAD_UNITS_75_FPS = 75, + + /* video drop-frame units */ + + MAD_UNITS_23_976_FPS = -24, + MAD_UNITS_24_975_FPS = -25, + MAD_UNITS_29_97_FPS = -30, + MAD_UNITS_47_952_FPS = -48, + MAD_UNITS_49_95_FPS = -50, + MAD_UNITS_59_94_FPS = -60 +}; + +# define mad_timer_reset(timer) (*(timer) = mad_timer_zero) + +int mad_timer_compare(mad_timer_t, mad_timer_t); + +# define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) + +void mad_timer_negate(mad_timer_t *); +mad_timer_t mad_timer_abs(mad_timer_t); + +void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); +void mad_timer_add(mad_timer_t *, mad_timer_t); +void mad_timer_multiply(mad_timer_t *, signed long); + +signed long mad_timer_count(mad_timer_t, enum mad_units); +unsigned long mad_timer_fraction(mad_timer_t, unsigned long); +void mad_timer_string(mad_timer_t, char *, char const *, + enum mad_units, enum mad_units, unsigned long); + +# endif + +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: mad.h,v 1.1 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_STREAM_H +# define LIBMAD_STREAM_H + + +# define MAD_BUFFER_GUARD 8 +# define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) + +enum mad_error { + MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ + MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ + + MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ + + MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ + MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ + MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ + MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ + MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ + + MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ + MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ + MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ + MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ + MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ + MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ + MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ + MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ + MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ + MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ + MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ + MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ +}; + +# define MAD_RECOVERABLE(error) ((error) & 0xff00) + +struct mad_stream { + unsigned char const *buffer; /* input bitstream buffer */ + unsigned char const *bufend; /* end of buffer */ + unsigned long skiplen; /* bytes to skip before next frame */ + + int sync; /* stream sync found */ + unsigned long freerate; /* free bitrate (fixed) */ + + unsigned char const *this_frame; /* start of current frame */ + unsigned char const *next_frame; /* start of next frame */ + struct mad_bitptr ptr; /* current processing bit pointer */ + + struct mad_bitptr anc_ptr; /* ancillary bits pointer */ + unsigned int anc_bitlen; /* number of ancillary bits */ + + unsigned char (*main_data); + /* Layer III main_data() */ + unsigned int md_len; /* bytes in main_data */ + + int options; /* decoding options (see below) */ + enum mad_error error; /* error code (see above) */ +}; + +enum { + MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ + MAD_OPTION_HALFSAMPLERATE = 0x0002, /* generate PCM at 1/2 sample rate */ +# if 0 /* not yet implemented */ + MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ + MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ + MAD_OPTION_SINGLECHANNEL = 0x0030, /* combine channels */ +# endif +}; + +void mad_stream_init(struct mad_stream *); +void mad_stream_finish(struct mad_stream *); + +# define mad_stream_options(stream, opts) ((stream)->options = (opts)) + +void mad_stream_buffer(struct mad_stream *, + unsigned char const *, unsigned long); +void mad_stream_skip(struct mad_stream *, unsigned long); + +int mad_stream_sync(struct mad_stream *); + +# endif + +/* Id: frame.h,v 1.1.1.1 2001/06/19 11:12:42 markom Exp */ + +# ifndef LIBMAD_FRAME_H +# define LIBMAD_FRAME_H + +enum mad_layer { + MAD_LAYER_I = 1, /* Layer I */ + MAD_LAYER_II = 2, /* Layer II */ + MAD_LAYER_III = 3 /* Layer III */ +}; + +enum mad_mode { + MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ + MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ + MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ + MAD_MODE_STEREO = 3 /* normal LR stereo */ +}; + +enum mad_emphasis { + MAD_EMPHASIS_NONE = 0, /* no emphasis */ + MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ + MAD_EMPHASIS_CCITT_J_17 = 3 /* CCITT J.17 emphasis */ +}; + +struct mad_frame { + struct mad_header { + enum mad_layer layer; /* audio layer (1, 2, or 3) */ + enum mad_mode mode; /* channel mode (see above) */ + int mode_extension; /* additional mode info */ + enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ + + unsigned long bitrate; /* stream bitrate (bps) */ + unsigned int samplerate; /* sampling frequency (Hz) */ + + unsigned short crc_check; /* frame CRC accumulator */ + unsigned short crc_target; /* final target CRC checksum */ + + int flags; /* flags (see below) */ + int private_bits; /* private bits (see below) */ + + mad_timer_t duration; /* audio playing time of frame */ + } header; + + int options; /* decoding options (from stream) */ + + mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */ + mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ +}; + +# define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) +# define MAD_NSBSAMPLES(header) \ + ((header)->layer == MAD_LAYER_I ? 12 : \ + (((header)->layer == MAD_LAYER_III && \ + ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) + +enum { + MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ + MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ + + MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ + MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ + MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ + MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ + + MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ + MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ + MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ + + MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ + MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ + MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ +}; + +enum { + MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ + MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ +}; + +void mad_header_init(struct mad_header *); + +# define mad_header_finish(header) /* nothing */ + +int mad_header_decode(struct mad_header *, struct mad_stream *); + +void mad_frame_init(struct mad_frame *); +void mad_frame_finish(struct mad_frame *); + +int mad_frame_decode(struct mad_frame *, struct mad_stream *); + +void mad_frame_mute(struct mad_frame *); + +# endif + +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: mad.h,v 1.1 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_SYNTH_H +# define LIBMAD_SYNTH_H + + +struct mad_synth { + mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ + /* [ch][eo][peo][s][v] */ + + unsigned int phase; /* current processing phase */ + + struct mad_pcm { + unsigned int samplerate; /* sampling frequency (Hz) */ + unsigned short channels; /* number of channels */ + unsigned short length; /* number of samples per channel */ + mad_fixed_t samples[2][32]; /* PCM output samples */ + } pcm; +}; + +void mad_synth_init(struct mad_synth *); + +# define mad_synth_finish(synth) /* nothing */ + +void mad_synth_mute(struct mad_synth *); + +void mad_synth_frame(struct mad_synth *, struct mad_frame const *); + +# endif + +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: mad.h,v 1.1 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_DECODER_H +# define LIBMAD_DECODER_H + + +enum mad_decoder_mode { + MAD_DECODER_MODE_SYNC = 0, + MAD_DECODER_MODE_ASYNC +}; + +enum mad_flow { + MAD_FLOW_CONTINUE = 0x0000, + MAD_FLOW_STOP = 0x0010, + MAD_FLOW_BREAK = 0x0011, + MAD_FLOW_IGNORE = 0x0020 +}; + +struct mad_decoder { + enum mad_decoder_mode mode; + + int options; + + struct { + long pid; + int in; + int out; + } async; + + struct dec_sync_struct { + struct mad_stream stream; + struct mad_frame frame; + struct mad_synth synth; + } *sync; + + void *cb_data; + + enum mad_flow (*input_func)(void *, struct mad_stream *); + enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); +}; + +void mad_decoder_init(struct mad_decoder *, void *, + enum mad_flow (*)(void *, struct mad_stream *), + enum mad_flow (*)(void *, struct mad_stream *, struct mad_frame *frame)); +int mad_decoder_finish(struct mad_decoder *); + +# define mad_decoder_options(decoder, opts) ((decoder)->options = (opts)) + +int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); +int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); + +# endif + Index: libmad/imdct_s.dat =================================================================== --- libmad/imdct_s.dat (nonexistent) +++ libmad/imdct_s.dat (revision 1765) @@ -0,0 +1,62 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: imdct_s.dat,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + + /* 0 */ { MAD_F(0x09bd7ca0) /* 0.608761429 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x0216a2a2) /* -0.130526192 */, + MAD_F(0x0fdcf549) /* 0.991444861 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + -MAD_F(0x0cb19346) /* -0.793353340 */ }, + + /* 6 */ { -MAD_F(0x0cb19346) /* -0.793353340 */, + MAD_F(0x061f78aa) /* 0.382683432 */, + MAD_F(0x0fdcf549) /* 0.991444861 */, + MAD_F(0x0216a2a2) /* 0.130526192 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x09bd7ca0) /* -0.608761429 */ }, + + /* 1 */ { MAD_F(0x061f78aa) /* 0.382683432 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + MAD_F(0x0ec835e8) /* 0.923879533 */ }, + + /* 7 */ { -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + MAD_F(0x061f78aa) /* 0.382683432 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + MAD_F(0x061f78aa) /* 0.382683432 */ }, + + /* 2 */ { MAD_F(0x0216a2a2) /* 0.130526192 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + MAD_F(0x09bd7ca0) /* 0.608761429 */, + -MAD_F(0x0cb19346) /* -0.793353340 */, + MAD_F(0x0ec835e8) /* 0.923879533 */, + -MAD_F(0x0fdcf549) /* -0.991444861 */ }, + + /* 8 */ { -MAD_F(0x0fdcf549) /* -0.991444861 */, + -MAD_F(0x0ec835e8) /* -0.923879533 */, + -MAD_F(0x0cb19346) /* -0.793353340 */, + -MAD_F(0x09bd7ca0) /* -0.608761429 */, + -MAD_F(0x061f78aa) /* -0.382683432 */, + -MAD_F(0x0216a2a2) /* -0.130526192 */ }
libmad/imdct_s.dat Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/D.dat =================================================================== --- libmad/D.dat (nonexistent) +++ libmad/D.dat (revision 1765) @@ -0,0 +1,607 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: D.dat,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +/* + * These are the coefficients for the subband synthesis window. This is a + * reordered version of Table B.3 from ISO/IEC 11172-3. + * + * Every value is parameterized so that shift optimizations can be made at + * compile-time. For example, every value can be right-shifted 12 bits to + * minimize multiply instruction times without any loss of accuracy. + */ + + { PRESHIFT(0x00000000) /* 0.000000000 */, /* 0 */ + -PRESHIFT(0x0001d000) /* -0.000442505 */, + PRESHIFT(0x000d5000) /* 0.003250122 */, + -PRESHIFT(0x001cb000) /* -0.007003784 */, + PRESHIFT(0x007f5000) /* 0.031082153 */, + -PRESHIFT(0x01421000) /* -0.078628540 */, + PRESHIFT(0x019ae000) /* 0.100311279 */, + -PRESHIFT(0x09271000) /* -0.572036743 */, + PRESHIFT(0x1251e000) /* 1.144989014 */, + PRESHIFT(0x09271000) /* 0.572036743 */, + PRESHIFT(0x019ae000) /* 0.100311279 */, + PRESHIFT(0x01421000) /* 0.078628540 */, + PRESHIFT(0x007f5000) /* 0.031082153 */, + PRESHIFT(0x001cb000) /* 0.007003784 */, + PRESHIFT(0x000d5000) /* 0.003250122 */, + PRESHIFT(0x0001d000) /* 0.000442505 */, + + PRESHIFT(0x00000000) /* 0.000000000 */, + -PRESHIFT(0x0001d000) /* -0.000442505 */, + PRESHIFT(0x000d5000) /* 0.003250122 */, + -PRESHIFT(0x001cb000) /* -0.007003784 */, + PRESHIFT(0x007f5000) /* 0.031082153 */, + -PRESHIFT(0x01421000) /* -0.078628540 */, + PRESHIFT(0x019ae000) /* 0.100311279 */, + -PRESHIFT(0x09271000) /* -0.572036743 */, + PRESHIFT(0x1251e000) /* 1.144989014 */, + PRESHIFT(0x09271000) /* 0.572036743 */, + PRESHIFT(0x019ae000) /* 0.100311279 */, + PRESHIFT(0x01421000) /* 0.078628540 */, + PRESHIFT(0x007f5000) /* 0.031082153 */, + PRESHIFT(0x001cb000) /* 0.007003784 */, + PRESHIFT(0x000d5000) /* 0.003250122 */, + PRESHIFT(0x0001d000) /* 0.000442505 */ }, + + { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 1 */ + -PRESHIFT(0x0001f000) /* -0.000473022 */, + PRESHIFT(0x000da000) /* 0.003326416 */, + -PRESHIFT(0x00207000) /* -0.007919312 */, + PRESHIFT(0x007d0000) /* 0.030517578 */, + -PRESHIFT(0x0158d000) /* -0.084182739 */, + PRESHIFT(0x01747000) /* 0.090927124 */, + -PRESHIFT(0x099a8000) /* -0.600219727 */, + PRESHIFT(0x124f0000) /* 1.144287109 */, + PRESHIFT(0x08b38000) /* 0.543823242 */, + PRESHIFT(0x01bde000) /* 0.108856201 */, + PRESHIFT(0x012b4000) /* 0.073059082 */, + PRESHIFT(0x0080f000) /* 0.031478882 */, + PRESHIFT(0x00191000) /* 0.006118774 */, + PRESHIFT(0x000d0000) /* 0.003173828 */, + PRESHIFT(0x0001a000) /* 0.000396729 */, + + -PRESHIFT(0x00001000) /* -0.000015259 */, + -PRESHIFT(0x0001f000) /* -0.000473022 */, + PRESHIFT(0x000da000) /* 0.003326416 */, + -PRESHIFT(0x00207000) /* -0.007919312 */, + PRESHIFT(0x007d0000) /* 0.030517578 */, + -PRESHIFT(0x0158d000) /* -0.084182739 */, + PRESHIFT(0x01747000) /* 0.090927124 */, + -PRESHIFT(0x099a8000) /* -0.600219727 */, + PRESHIFT(0x124f0000) /* 1.144287109 */, + PRESHIFT(0x08b38000) /* 0.543823242 */, + PRESHIFT(0x01bde000) /* 0.108856201 */, + PRESHIFT(0x012b4000) /* 0.073059082 */, + PRESHIFT(0x0080f000) /* 0.031478882 */, + PRESHIFT(0x00191000) /* 0.006118774 */, + PRESHIFT(0x000d0000) /* 0.003173828 */, + PRESHIFT(0x0001a000) /* 0.000396729 */ }, + + { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 2 */ + -PRESHIFT(0x00023000) /* -0.000534058 */, + PRESHIFT(0x000de000) /* 0.003387451 */, + -PRESHIFT(0x00245000) /* -0.008865356 */, + PRESHIFT(0x007a0000) /* 0.029785156 */, + -PRESHIFT(0x016f7000) /* -0.089706421 */, + PRESHIFT(0x014a8000) /* 0.080688477 */, + -PRESHIFT(0x0a0d8000) /* -0.628295898 */, + PRESHIFT(0x12468000) /* 1.142211914 */, + PRESHIFT(0x083ff000) /* 0.515609741 */, + PRESHIFT(0x01dd8000) /* 0.116577148 */, + PRESHIFT(0x01149000) /* 0.067520142 */, + PRESHIFT(0x00820000) /* 0.031738281 */, + PRESHIFT(0x0015b000) /* 0.005294800 */, + PRESHIFT(0x000ca000) /* 0.003082275 */, + PRESHIFT(0x00018000) /* 0.000366211 */, + + -PRESHIFT(0x00001000) /* -0.000015259 */, + -PRESHIFT(0x00023000) /* -0.000534058 */, + PRESHIFT(0x000de000) /* 0.003387451 */, + -PRESHIFT(0x00245000) /* -0.008865356 */, + PRESHIFT(0x007a0000) /* 0.029785156 */, + -PRESHIFT(0x016f7000) /* -0.089706421 */, + PRESHIFT(0x014a8000) /* 0.080688477 */, + -PRESHIFT(0x0a0d8000) /* -0.628295898 */, + PRESHIFT(0x12468000) /* 1.142211914 */, + PRESHIFT(0x083ff000) /* 0.515609741 */, + PRESHIFT(0x01dd8000) /* 0.116577148 */, + PRESHIFT(0x01149000) /* 0.067520142 */, + PRESHIFT(0x00820000) /* 0.031738281 */, + PRESHIFT(0x0015b000) /* 0.005294800 */, + PRESHIFT(0x000ca000) /* 0.003082275 */, + PRESHIFT(0x00018000) /* 0.000366211 */ }, + + { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 3 */ + -PRESHIFT(0x00026000) /* -0.000579834 */, + PRESHIFT(0x000e1000) /* 0.003433228 */, + -PRESHIFT(0x00285000) /* -0.009841919 */, + PRESHIFT(0x00765000) /* 0.028884888 */, + -PRESHIFT(0x0185d000) /* -0.095169067 */, + PRESHIFT(0x011d1000) /* 0.069595337 */, + -PRESHIFT(0x0a7fe000) /* -0.656219482 */, + PRESHIFT(0x12386000) /* 1.138763428 */, + PRESHIFT(0x07ccb000) /* 0.487472534 */, + PRESHIFT(0x01f9c000) /* 0.123474121 */, + PRESHIFT(0x00fdf000) /* 0.061996460 */, + PRESHIFT(0x00827000) /* 0.031845093 */, + PRESHIFT(0x00126000) /* 0.004486084 */, + PRESHIFT(0x000c4000) /* 0.002990723 */, + PRESHIFT(0x00015000) /* 0.000320435 */, + + -PRESHIFT(0x00001000) /* -0.000015259 */, + -PRESHIFT(0x00026000) /* -0.000579834 */, + PRESHIFT(0x000e1000) /* 0.003433228 */, + -PRESHIFT(0x00285000) /* -0.009841919 */, + PRESHIFT(0x00765000) /* 0.028884888 */, + -PRESHIFT(0x0185d000) /* -0.095169067 */, + PRESHIFT(0x011d1000) /* 0.069595337 */, + -PRESHIFT(0x0a7fe000) /* -0.656219482 */, + PRESHIFT(0x12386000) /* 1.138763428 */, + PRESHIFT(0x07ccb000) /* 0.487472534 */, + PRESHIFT(0x01f9c000) /* 0.123474121 */, + PRESHIFT(0x00fdf000) /* 0.061996460 */, + PRESHIFT(0x00827000) /* 0.031845093 */, + PRESHIFT(0x00126000) /* 0.004486084 */, + PRESHIFT(0x000c4000) /* 0.002990723 */, + PRESHIFT(0x00015000) /* 0.000320435 */ }, + + { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 4 */ + -PRESHIFT(0x00029000) /* -0.000625610 */, + PRESHIFT(0x000e3000) /* 0.003463745 */, + -PRESHIFT(0x002c7000) /* -0.010848999 */, + PRESHIFT(0x0071e000) /* 0.027801514 */, + -PRESHIFT(0x019bd000) /* -0.100540161 */, + PRESHIFT(0x00ec0000) /* 0.057617187 */, + -PRESHIFT(0x0af15000) /* -0.683914185 */, + PRESHIFT(0x12249000) /* 1.133926392 */, + PRESHIFT(0x075a0000) /* 0.459472656 */, + PRESHIFT(0x0212c000) /* 0.129577637 */, + PRESHIFT(0x00e79000) /* 0.056533813 */, + PRESHIFT(0x00825000) /* 0.031814575 */, + PRESHIFT(0x000f4000) /* 0.003723145 */, + PRESHIFT(0x000be000) /* 0.002899170 */, + PRESHIFT(0x00013000) /* 0.000289917 */, + + -PRESHIFT(0x00001000) /* -0.000015259 */, + -PRESHIFT(0x00029000) /* -0.000625610 */, + PRESHIFT(0x000e3000) /* 0.003463745 */, + -PRESHIFT(0x002c7000) /* -0.010848999 */, + PRESHIFT(0x0071e000) /* 0.027801514 */, + -PRESHIFT(0x019bd000) /* -0.100540161 */, + PRESHIFT(0x00ec0000) /* 0.057617187 */, + -PRESHIFT(0x0af15000) /* -0.683914185 */, + PRESHIFT(0x12249000) /* 1.133926392 */, + PRESHIFT(0x075a0000) /* 0.459472656 */, + PRESHIFT(0x0212c000) /* 0.129577637 */, + PRESHIFT(0x00e79000) /* 0.056533813 */, + PRESHIFT(0x00825000) /* 0.031814575 */, + PRESHIFT(0x000f4000) /* 0.003723145 */, + PRESHIFT(0x000be000) /* 0.002899170 */, + PRESHIFT(0x00013000) /* 0.000289917 */ }, + + { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 5 */ + -PRESHIFT(0x0002d000) /* -0.000686646 */, + PRESHIFT(0x000e4000) /* 0.003479004 */, + -PRESHIFT(0x0030b000) /* -0.011886597 */, + PRESHIFT(0x006cb000) /* 0.026535034 */, + -PRESHIFT(0x01b17000) /* -0.105819702 */, + PRESHIFT(0x00b77000) /* 0.044784546 */, + -PRESHIFT(0x0b619000) /* -0.711318970 */, + PRESHIFT(0x120b4000) /* 1.127746582 */, + PRESHIFT(0x06e81000) /* 0.431655884 */, + PRESHIFT(0x02288000) /* 0.134887695 */, + PRESHIFT(0x00d17000) /* 0.051132202 */, + PRESHIFT(0x0081b000) /* 0.031661987 */, + PRESHIFT(0x000c5000) /* 0.003005981 */, + PRESHIFT(0x000b7000) /* 0.002792358 */, + PRESHIFT(0x00011000) /* 0.000259399 */, + + -PRESHIFT(0x00001000) /* -0.000015259 */, + -PRESHIFT(0x0002d000) /* -0.000686646 */, + PRESHIFT(0x000e4000) /* 0.003479004 */, + -PRESHIFT(0x0030b000) /* -0.011886597 */, + PRESHIFT(0x006cb000) /* 0.026535034 */, + -PRESHIFT(0x01b17000) /* -0.105819702 */, + PRESHIFT(0x00b77000) /* 0.044784546 */, + -PRESHIFT(0x0b619000) /* -0.711318970 */, + PRESHIFT(0x120b4000) /* 1.127746582 */, + PRESHIFT(0x06e81000) /* 0.431655884 */, + PRESHIFT(0x02288000) /* 0.134887695 */, + PRESHIFT(0x00d17000) /* 0.051132202 */, + PRESHIFT(0x0081b000) /* 0.031661987 */, + PRESHIFT(0x000c5000) /* 0.003005981 */, + PRESHIFT(0x000b7000) /* 0.002792358 */, + PRESHIFT(0x00011000) /* 0.000259399 */ }, + + { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 6 */ + -PRESHIFT(0x00031000) /* -0.000747681 */, + PRESHIFT(0x000e4000) /* 0.003479004 */, + -PRESHIFT(0x00350000) /* -0.012939453 */, + PRESHIFT(0x0066c000) /* 0.025085449 */, + -PRESHIFT(0x01c67000) /* -0.110946655 */, + PRESHIFT(0x007f5000) /* 0.031082153 */, + -PRESHIFT(0x0bd06000) /* -0.738372803 */, + PRESHIFT(0x11ec7000) /* 1.120223999 */, + PRESHIFT(0x06772000) /* 0.404083252 */, + PRESHIFT(0x023b3000) /* 0.139450073 */, + PRESHIFT(0x00bbc000) /* 0.045837402 */, + PRESHIFT(0x00809000) /* 0.031387329 */, + PRESHIFT(0x00099000) /* 0.002334595 */, + PRESHIFT(0x000b0000) /* 0.002685547 */, + PRESHIFT(0x00010000) /* 0.000244141 */, + + -PRESHIFT(0x00001000) /* -0.000015259 */, + -PRESHIFT(0x00031000) /* -0.000747681 */, + PRESHIFT(0x000e4000) /* 0.003479004 */, + -PRESHIFT(0x00350000) /* -0.012939453 */, + PRESHIFT(0x0066c000) /* 0.025085449 */, + -PRESHIFT(0x01c67000) /* -0.110946655 */, + PRESHIFT(0x007f5000) /* 0.031082153 */, + -PRESHIFT(0x0bd06000) /* -0.738372803 */, + PRESHIFT(0x11ec7000) /* 1.120223999 */, + PRESHIFT(0x06772000) /* 0.404083252 */, + PRESHIFT(0x023b3000) /* 0.139450073 */, + PRESHIFT(0x00bbc000) /* 0.045837402 */, + PRESHIFT(0x00809000) /* 0.031387329 */, + PRESHIFT(0x00099000) /* 0.002334595 */, + PRESHIFT(0x000b0000) /* 0.002685547 */, + PRESHIFT(0x00010000) /* 0.000244141 */ }, + + { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 7 */ + -PRESHIFT(0x00035000) /* -0.000808716 */, + PRESHIFT(0x000e3000) /* 0.003463745 */, + -PRESHIFT(0x00397000) /* -0.014022827 */, + PRESHIFT(0x005ff000) /* 0.023422241 */, + -PRESHIFT(0x01dad000) /* -0.115921021 */, + PRESHIFT(0x0043a000) /* 0.016510010 */, + -PRESHIFT(0x0c3d9000) /* -0.765029907 */, + PRESHIFT(0x11c83000) /* 1.111373901 */, + PRESHIFT(0x06076000) /* 0.376800537 */, + PRESHIFT(0x024ad000) /* 0.143264771 */, + PRESHIFT(0x00a67000) /* 0.040634155 */, + PRESHIFT(0x007f0000) /* 0.031005859 */, + PRESHIFT(0x0006f000) /* 0.001693726 */, + PRESHIFT(0x000a9000) /* 0.002578735 */, + PRESHIFT(0x0000e000) /* 0.000213623 */, + + -PRESHIFT(0x00002000) /* -0.000030518 */, + -PRESHIFT(0x00035000) /* -0.000808716 */, + PRESHIFT(0x000e3000) /* 0.003463745 */, + -PRESHIFT(0x00397000) /* -0.014022827 */, + PRESHIFT(0x005ff000) /* 0.023422241 */, + -PRESHIFT(0x01dad000) /* -0.115921021 */, + PRESHIFT(0x0043a000) /* 0.016510010 */, + -PRESHIFT(0x0c3d9000) /* -0.765029907 */, + PRESHIFT(0x11c83000) /* 1.111373901 */, + PRESHIFT(0x06076000) /* 0.376800537 */, + PRESHIFT(0x024ad000) /* 0.143264771 */, + PRESHIFT(0x00a67000) /* 0.040634155 */, + PRESHIFT(0x007f0000) /* 0.031005859 */, + PRESHIFT(0x0006f000) /* 0.001693726 */, + PRESHIFT(0x000a9000) /* 0.002578735 */, + PRESHIFT(0x0000e000) /* 0.000213623 */ }, + + { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 8 */ + -PRESHIFT(0x0003a000) /* -0.000885010 */, + PRESHIFT(0x000e0000) /* 0.003417969 */, + -PRESHIFT(0x003df000) /* -0.015121460 */, + PRESHIFT(0x00586000) /* 0.021575928 */, + -PRESHIFT(0x01ee6000) /* -0.120697021 */, + PRESHIFT(0x00046000) /* 0.001068115 */, + -PRESHIFT(0x0ca8d000) /* -0.791213989 */, + PRESHIFT(0x119e9000) /* 1.101211548 */, + PRESHIFT(0x05991000) /* 0.349868774 */, + PRESHIFT(0x02578000) /* 0.146362305 */, + PRESHIFT(0x0091a000) /* 0.035552979 */, + PRESHIFT(0x007d1000) /* 0.030532837 */, + PRESHIFT(0x00048000) /* 0.001098633 */, + PRESHIFT(0x000a1000) /* 0.002456665 */, + PRESHIFT(0x0000d000) /* 0.000198364 */, + + -PRESHIFT(0x00002000) /* -0.000030518 */, + -PRESHIFT(0x0003a000) /* -0.000885010 */, + PRESHIFT(0x000e0000) /* 0.003417969 */, + -PRESHIFT(0x003df000) /* -0.015121460 */, + PRESHIFT(0x00586000) /* 0.021575928 */, + -PRESHIFT(0x01ee6000) /* -0.120697021 */, + PRESHIFT(0x00046000) /* 0.001068115 */, + -PRESHIFT(0x0ca8d000) /* -0.791213989 */, + PRESHIFT(0x119e9000) /* 1.101211548 */, + PRESHIFT(0x05991000) /* 0.349868774 */, + PRESHIFT(0x02578000) /* 0.146362305 */, + PRESHIFT(0x0091a000) /* 0.035552979 */, + PRESHIFT(0x007d1000) /* 0.030532837 */, + PRESHIFT(0x00048000) /* 0.001098633 */, + PRESHIFT(0x000a1000) /* 0.002456665 */, + PRESHIFT(0x0000d000) /* 0.000198364 */ }, + + { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 9 */ + -PRESHIFT(0x0003f000) /* -0.000961304 */, + PRESHIFT(0x000dd000) /* 0.003372192 */, + -PRESHIFT(0x00428000) /* -0.016235352 */, + PRESHIFT(0x00500000) /* 0.019531250 */, + -PRESHIFT(0x02011000) /* -0.125259399 */, + -PRESHIFT(0x003e6000) /* -0.015228271 */, + -PRESHIFT(0x0d11e000) /* -0.816864014 */, + PRESHIFT(0x116fc000) /* 1.089782715 */, + PRESHIFT(0x052c5000) /* 0.323318481 */, + PRESHIFT(0x02616000) /* 0.148773193 */, + PRESHIFT(0x007d6000) /* 0.030609131 */, + PRESHIFT(0x007aa000) /* 0.029937744 */, + PRESHIFT(0x00024000) /* 0.000549316 */, + PRESHIFT(0x0009a000) /* 0.002349854 */, + PRESHIFT(0x0000b000) /* 0.000167847 */, + + -PRESHIFT(0x00002000) /* -0.000030518 */, + -PRESHIFT(0x0003f000) /* -0.000961304 */, + PRESHIFT(0x000dd000) /* 0.003372192 */, + -PRESHIFT(0x00428000) /* -0.016235352 */, + PRESHIFT(0x00500000) /* 0.019531250 */, + -PRESHIFT(0x02011000) /* -0.125259399 */, + -PRESHIFT(0x003e6000) /* -0.015228271 */, + -PRESHIFT(0x0d11e000) /* -0.816864014 */, + PRESHIFT(0x116fc000) /* 1.089782715 */, + PRESHIFT(0x052c5000) /* 0.323318481 */, + PRESHIFT(0x02616000) /* 0.148773193 */, + PRESHIFT(0x007d6000) /* 0.030609131 */, + PRESHIFT(0x007aa000) /* 0.029937744 */, + PRESHIFT(0x00024000) /* 0.000549316 */, + PRESHIFT(0x0009a000) /* 0.002349854 */, + PRESHIFT(0x0000b000) /* 0.000167847 */ }, + + { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 10 */ + -PRESHIFT(0x00044000) /* -0.001037598 */, + PRESHIFT(0x000d7000) /* 0.003280640 */, + -PRESHIFT(0x00471000) /* -0.017349243 */, + PRESHIFT(0x0046b000) /* 0.017257690 */, + -PRESHIFT(0x0212b000) /* -0.129562378 */, + -PRESHIFT(0x0084a000) /* -0.032379150 */, + -PRESHIFT(0x0d78a000) /* -0.841949463 */, + PRESHIFT(0x113be000) /* 1.077117920 */, + PRESHIFT(0x04c16000) /* 0.297210693 */, + PRESHIFT(0x02687000) /* 0.150497437 */, + PRESHIFT(0x0069c000) /* 0.025817871 */, + PRESHIFT(0x0077f000) /* 0.029281616 */, + PRESHIFT(0x00002000) /* 0.000030518 */, + PRESHIFT(0x00093000) /* 0.002243042 */, + PRESHIFT(0x0000a000) /* 0.000152588 */, + + -PRESHIFT(0x00002000) /* -0.000030518 */, + -PRESHIFT(0x00044000) /* -0.001037598 */, + PRESHIFT(0x000d7000) /* 0.003280640 */, + -PRESHIFT(0x00471000) /* -0.017349243 */, + PRESHIFT(0x0046b000) /* 0.017257690 */, + -PRESHIFT(0x0212b000) /* -0.129562378 */, + -PRESHIFT(0x0084a000) /* -0.032379150 */, + -PRESHIFT(0x0d78a000) /* -0.841949463 */, + PRESHIFT(0x113be000) /* 1.077117920 */, + PRESHIFT(0x04c16000) /* 0.297210693 */, + PRESHIFT(0x02687000) /* 0.150497437 */, + PRESHIFT(0x0069c000) /* 0.025817871 */, + PRESHIFT(0x0077f000) /* 0.029281616 */, + PRESHIFT(0x00002000) /* 0.000030518 */, + PRESHIFT(0x00093000) /* 0.002243042 */, + PRESHIFT(0x0000a000) /* 0.000152588 */ }, + + { -PRESHIFT(0x00003000) /* -0.000045776 */, /* 11 */ + -PRESHIFT(0x00049000) /* -0.001113892 */, + PRESHIFT(0x000d0000) /* 0.003173828 */, + -PRESHIFT(0x004ba000) /* -0.018463135 */, + PRESHIFT(0x003ca000) /* 0.014801025 */, + -PRESHIFT(0x02233000) /* -0.133590698 */, + -PRESHIFT(0x00ce4000) /* -0.050354004 */, + -PRESHIFT(0x0ddca000) /* -0.866363525 */, + PRESHIFT(0x1102f000) /* 1.063217163 */, + PRESHIFT(0x04587000) /* 0.271591187 */, + PRESHIFT(0x026cf000) /* 0.151596069 */, + PRESHIFT(0x0056c000) /* 0.021179199 */, + PRESHIFT(0x0074e000) /* 0.028533936 */, + -PRESHIFT(0x0001d000) /* -0.000442505 */, + PRESHIFT(0x0008b000) /* 0.002120972 */, + PRESHIFT(0x00009000) /* 0.000137329 */, + + -PRESHIFT(0x00003000) /* -0.000045776 */, + -PRESHIFT(0x00049000) /* -0.001113892 */, + PRESHIFT(0x000d0000) /* 0.003173828 */, + -PRESHIFT(0x004ba000) /* -0.018463135 */, + PRESHIFT(0x003ca000) /* 0.014801025 */, + -PRESHIFT(0x02233000) /* -0.133590698 */, + -PRESHIFT(0x00ce4000) /* -0.050354004 */, + -PRESHIFT(0x0ddca000) /* -0.866363525 */, + PRESHIFT(0x1102f000) /* 1.063217163 */, + PRESHIFT(0x04587000) /* 0.271591187 */, + PRESHIFT(0x026cf000) /* 0.151596069 */, + PRESHIFT(0x0056c000) /* 0.021179199 */, + PRESHIFT(0x0074e000) /* 0.028533936 */, + -PRESHIFT(0x0001d000) /* -0.000442505 */, + PRESHIFT(0x0008b000) /* 0.002120972 */, + PRESHIFT(0x00009000) /* 0.000137329 */ }, + + { -PRESHIFT(0x00003000) /* -0.000045776 */, /* 12 */ + -PRESHIFT(0x0004f000) /* -0.001205444 */, + PRESHIFT(0x000c8000) /* 0.003051758 */, + -PRESHIFT(0x00503000) /* -0.019577026 */, + PRESHIFT(0x0031a000) /* 0.012115479 */, + -PRESHIFT(0x02326000) /* -0.137298584 */, + -PRESHIFT(0x011b5000) /* -0.069168091 */, + -PRESHIFT(0x0e3dd000) /* -0.890090942 */, + PRESHIFT(0x10c54000) /* 1.048156738 */, + PRESHIFT(0x03f1b000) /* 0.246505737 */, + PRESHIFT(0x026ee000) /* 0.152069092 */, + PRESHIFT(0x00447000) /* 0.016708374 */, + PRESHIFT(0x00719000) /* 0.027725220 */, + -PRESHIFT(0x00039000) /* -0.000869751 */, + PRESHIFT(0x00084000) /* 0.002014160 */, + PRESHIFT(0x00008000) /* 0.000122070 */, + + -PRESHIFT(0x00003000) /* -0.000045776 */, + -PRESHIFT(0x0004f000) /* -0.001205444 */, + PRESHIFT(0x000c8000) /* 0.003051758 */, + -PRESHIFT(0x00503000) /* -0.019577026 */, + PRESHIFT(0x0031a000) /* 0.012115479 */, + -PRESHIFT(0x02326000) /* -0.137298584 */, + -PRESHIFT(0x011b5000) /* -0.069168091 */, + -PRESHIFT(0x0e3dd000) /* -0.890090942 */, + PRESHIFT(0x10c54000) /* 1.048156738 */, + PRESHIFT(0x03f1b000) /* 0.246505737 */, + PRESHIFT(0x026ee000) /* 0.152069092 */, + PRESHIFT(0x00447000) /* 0.016708374 */, + PRESHIFT(0x00719000) /* 0.027725220 */, + -PRESHIFT(0x00039000) /* -0.000869751 */, + PRESHIFT(0x00084000) /* 0.002014160 */, + PRESHIFT(0x00008000) /* 0.000122070 */ }, + + { -PRESHIFT(0x00004000) /* -0.000061035 */, /* 13 */ + -PRESHIFT(0x00055000) /* -0.001296997 */, + PRESHIFT(0x000bd000) /* 0.002883911 */, + -PRESHIFT(0x0054c000) /* -0.020690918 */, + PRESHIFT(0x0025d000) /* 0.009231567 */, + -PRESHIFT(0x02403000) /* -0.140670776 */, + -PRESHIFT(0x016ba000) /* -0.088775635 */, + -PRESHIFT(0x0e9be000) /* -0.913055420 */, + PRESHIFT(0x1082d000) /* 1.031936646 */, + PRESHIFT(0x038d4000) /* 0.221984863 */, + PRESHIFT(0x026e7000) /* 0.151962280 */, + PRESHIFT(0x0032e000) /* 0.012420654 */, + PRESHIFT(0x006df000) /* 0.026840210 */, + -PRESHIFT(0x00053000) /* -0.001266479 */, + PRESHIFT(0x0007d000) /* 0.001907349 */, + PRESHIFT(0x00007000) /* 0.000106812 */, + + -PRESHIFT(0x00004000) /* -0.000061035 */, + -PRESHIFT(0x00055000) /* -0.001296997 */, + PRESHIFT(0x000bd000) /* 0.002883911 */, + -PRESHIFT(0x0054c000) /* -0.020690918 */, + PRESHIFT(0x0025d000) /* 0.009231567 */, + -PRESHIFT(0x02403000) /* -0.140670776 */, + -PRESHIFT(0x016ba000) /* -0.088775635 */, + -PRESHIFT(0x0e9be000) /* -0.913055420 */, + PRESHIFT(0x1082d000) /* 1.031936646 */, + PRESHIFT(0x038d4000) /* 0.221984863 */, + PRESHIFT(0x026e7000) /* 0.151962280 */, + PRESHIFT(0x0032e000) /* 0.012420654 */, + PRESHIFT(0x006df000) /* 0.026840210 */, + -PRESHIFT(0x00053000) /* -0.001266479 */, + PRESHIFT(0x0007d000) /* 0.001907349 */, + PRESHIFT(0x00007000) /* 0.000106812 */ }, + + { -PRESHIFT(0x00004000) /* -0.000061035 */, /* 14 */ + -PRESHIFT(0x0005b000) /* -0.001388550 */, + PRESHIFT(0x000b1000) /* 0.002700806 */, + -PRESHIFT(0x00594000) /* -0.021789551 */, + PRESHIFT(0x00192000) /* 0.006134033 */, + -PRESHIFT(0x024c8000) /* -0.143676758 */, + -PRESHIFT(0x01bf2000) /* -0.109161377 */, + -PRESHIFT(0x0ef69000) /* -0.935195923 */, + PRESHIFT(0x103be000) /* 1.014617920 */, + PRESHIFT(0x032b4000) /* 0.198059082 */, + PRESHIFT(0x026bc000) /* 0.151306152 */, + PRESHIFT(0x00221000) /* 0.008316040 */, + PRESHIFT(0x006a2000) /* 0.025909424 */, + -PRESHIFT(0x0006a000) /* -0.001617432 */, + PRESHIFT(0x00075000) /* 0.001785278 */, + PRESHIFT(0x00007000) /* 0.000106812 */, + + -PRESHIFT(0x00004000) /* -0.000061035 */, + -PRESHIFT(0x0005b000) /* -0.001388550 */, + PRESHIFT(0x000b1000) /* 0.002700806 */, + -PRESHIFT(0x00594000) /* -0.021789551 */, + PRESHIFT(0x00192000) /* 0.006134033 */, + -PRESHIFT(0x024c8000) /* -0.143676758 */, + -PRESHIFT(0x01bf2000) /* -0.109161377 */, + -PRESHIFT(0x0ef69000) /* -0.935195923 */, + PRESHIFT(0x103be000) /* 1.014617920 */, + PRESHIFT(0x032b4000) /* 0.198059082 */, + PRESHIFT(0x026bc000) /* 0.151306152 */, + PRESHIFT(0x00221000) /* 0.008316040 */, + PRESHIFT(0x006a2000) /* 0.025909424 */, + -PRESHIFT(0x0006a000) /* -0.001617432 */, + PRESHIFT(0x00075000) /* 0.001785278 */, + PRESHIFT(0x00007000) /* 0.000106812 */ }, + + { -PRESHIFT(0x00005000) /* -0.000076294 */, /* 15 */ + -PRESHIFT(0x00061000) /* -0.001480103 */, + PRESHIFT(0x000a3000) /* 0.002487183 */, + -PRESHIFT(0x005da000) /* -0.022857666 */, + PRESHIFT(0x000b9000) /* 0.002822876 */, + -PRESHIFT(0x02571000) /* -0.146255493 */, + -PRESHIFT(0x0215c000) /* -0.130310059 */, + -PRESHIFT(0x0f4dc000) /* -0.956481934 */, + PRESHIFT(0x0ff0a000) /* 0.996246338 */, + PRESHIFT(0x02cbf000) /* 0.174789429 */, + PRESHIFT(0x0266e000) /* 0.150115967 */, + PRESHIFT(0x00120000) /* 0.004394531 */, + PRESHIFT(0x00662000) /* 0.024932861 */, + -PRESHIFT(0x0007f000) /* -0.001937866 */, + PRESHIFT(0x0006f000) /* 0.001693726 */, + PRESHIFT(0x00006000) /* 0.000091553 */, + + -PRESHIFT(0x00005000) /* -0.000076294 */, + -PRESHIFT(0x00061000) /* -0.001480103 */, + PRESHIFT(0x000a3000) /* 0.002487183 */, + -PRESHIFT(0x005da000) /* -0.022857666 */, + PRESHIFT(0x000b9000) /* 0.002822876 */, + -PRESHIFT(0x02571000) /* -0.146255493 */, + -PRESHIFT(0x0215c000) /* -0.130310059 */, + -PRESHIFT(0x0f4dc000) /* -0.956481934 */, + PRESHIFT(0x0ff0a000) /* 0.996246338 */, + PRESHIFT(0x02cbf000) /* 0.174789429 */, + PRESHIFT(0x0266e000) /* 0.150115967 */, + PRESHIFT(0x00120000) /* 0.004394531 */, + PRESHIFT(0x00662000) /* 0.024932861 */, + -PRESHIFT(0x0007f000) /* -0.001937866 */, + PRESHIFT(0x0006f000) /* 0.001693726 */, + PRESHIFT(0x00006000) /* 0.000091553 */ }, + + { -PRESHIFT(0x00005000) /* -0.000076294 */, /* 16 */ + -PRESHIFT(0x00068000) /* -0.001586914 */, + PRESHIFT(0x00092000) /* 0.002227783 */, + -PRESHIFT(0x0061f000) /* -0.023910522 */, + -PRESHIFT(0x0002d000) /* -0.000686646 */, + -PRESHIFT(0x025ff000) /* -0.148422241 */, + -PRESHIFT(0x026f7000) /* -0.152206421 */, + -PRESHIFT(0x0fa13000) /* -0.976852417 */, + PRESHIFT(0x0fa13000) /* 0.976852417 */, + PRESHIFT(0x026f7000) /* 0.152206421 */, + PRESHIFT(0x025ff000) /* 0.148422241 */, + PRESHIFT(0x0002d000) /* 0.000686646 */, + PRESHIFT(0x0061f000) /* 0.023910522 */, + -PRESHIFT(0x00092000) /* -0.002227783 */, + PRESHIFT(0x00068000) /* 0.001586914 */, + PRESHIFT(0x00005000) /* 0.000076294 */, + + -PRESHIFT(0x00005000) /* -0.000076294 */, + -PRESHIFT(0x00068000) /* -0.001586914 */, + PRESHIFT(0x00092000) /* 0.002227783 */, + -PRESHIFT(0x0061f000) /* -0.023910522 */, + -PRESHIFT(0x0002d000) /* -0.000686646 */, + -PRESHIFT(0x025ff000) /* -0.148422241 */, + -PRESHIFT(0x026f7000) /* -0.152206421 */, + -PRESHIFT(0x0fa13000) /* -0.976852417 */, + PRESHIFT(0x0fa13000) /* 0.976852417 */, + PRESHIFT(0x026f7000) /* 0.152206421 */, + PRESHIFT(0x025ff000) /* 0.148422241 */, + PRESHIFT(0x0002d000) /* 0.000686646 */, + PRESHIFT(0x0061f000) /* 0.023910522 */, + -PRESHIFT(0x00092000) /* -0.002227783 */, + PRESHIFT(0x00068000) /* 0.001586914 */, + PRESHIFT(0x00005000) /* 0.000076294 */ }
libmad/D.dat Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/synth.h =================================================================== --- libmad/synth.h (nonexistent) +++ libmad/synth.h (revision 1765) @@ -0,0 +1,50 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: synth.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_SYNTH_H +# define LIBMAD_SYNTH_H + +# include "fixed.h" +# include "frame.h" + +struct mad_synth { + mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ + /* [ch][eo][peo][s][v] */ + + unsigned int phase; /* current processing phase */ + + struct mad_pcm { + unsigned int samplerate; /* sampling frequency (Hz) */ + unsigned short channels; /* number of channels */ + unsigned short length; /* number of samples per channel */ + mad_fixed_t samples[2][32]; /* PCM output samples */ + } pcm; +}; + +void mad_synth_init(struct mad_synth *); + +# define mad_synth_finish(synth) /* nothing */ + +void mad_synth_mute(struct mad_synth *); + +void mad_synth_frame(struct mad_synth *, struct mad_frame const *); + +# endif
libmad/synth.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/config.h =================================================================== --- libmad/config.h (nonexistent) +++ libmad/config.h (revision 1765) @@ -0,0 +1,102 @@ +/* config.h. Generated automatically by configure. */ +/* config.h.in. Generated automatically from configure.in by autoheader. */ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: config.h,v 1.6 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_CONFIG_H +# define LIBMAD_CONFIG_H + +/***************************************************************************** + * Definitions selected automatically by `configure' * + *****************************************************************************/ + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define if you have that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define as __inline if that's what the C compiler calls it. */ +/* #undef inline */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to optimize for speed over accuracy. */ +/* #undef OPT_SPEED */ + +/* Define to optimize for accuracy over speed. */ +/* #undef OPT_ACCURACY */ + +/* Define to enable a fast subband synthesis approximation optimization. */ +/* #undef OPT_SSO */ + +/* Define to influence a strict interpretation of the ISO/IEC standards, + even if this is in opposition with best accepted practices. */ +/* #undef OPT_STRICT */ + +/* Define if your MIPS CPU supports a 2-operand MADD instruction. */ +/* #undef HAVE_MADD_ASM */ + +/* Define if your MIPS CPU supports a 2-operand MADD16 instruction. */ +/* #undef HAVE_MADD16_ASM */ + +/* Define to enable diagnostic debugging support. */ +/* #undef DEBUG */ + +/* Define to disable debugging assertions. */ +/* #undef NDEBUG */ + +/* Define to enable experimental code. */ +/* #undef EXPERIMENTAL */ + +/* Define if we have embedded application. */ +#define EMBED 1 + +/* The number of bytes in a int. */ +#define SIZEOF_INT 2 + +/* The number of bytes in a long. */ +#define SIZEOF_LONG 4 + +/* The number of bytes in a long long. */ +#define SIZEOF_LONG_LONG 8 + +/* Define if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Name of package */ +#define PACKAGE "libmad" + +/* Version number of package */ +#define VERSION "0.13.0b" + +/***************************************************************************** + * End of automatically configured definitions * + *****************************************************************************/ + +# endif
libmad/config.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/decoder.h =================================================================== --- libmad/decoder.h (nonexistent) +++ libmad/decoder.h (revision 1765) @@ -0,0 +1,74 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: decoder.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_DECODER_H +# define LIBMAD_DECODER_H + +# include "stream.h" +# include "frame.h" +# include "synth.h" + +enum mad_decoder_mode { + MAD_DECODER_MODE_SYNC = 0, + MAD_DECODER_MODE_ASYNC +}; + +enum mad_flow { + MAD_FLOW_CONTINUE = 0x0000, + MAD_FLOW_STOP = 0x0010, + MAD_FLOW_BREAK = 0x0011, + MAD_FLOW_IGNORE = 0x0020 +}; + +struct mad_decoder { + enum mad_decoder_mode mode; + + int options; + + struct { + long pid; + int in; + int out; + } async; + + struct dec_sync_struct { + struct mad_stream stream; + struct mad_frame frame; + struct mad_synth synth; + } *sync; + + void *cb_data; + + enum mad_flow (*input_func)(void *, struct mad_stream *); + enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); +}; + +void mad_decoder_init(struct mad_decoder *, void *, + enum mad_flow (*)(void *, struct mad_stream *), + enum mad_flow (*)(void *, struct mad_stream *, struct mad_frame *frame)); +int mad_decoder_finish(struct mad_decoder *); + +# define mad_decoder_options(decoder, opts) ((decoder)->options = (opts)) + +int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); +int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); + +# endif
libmad/decoder.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/acconfig.h =================================================================== --- libmad/acconfig.h (nonexistent) +++ libmad/acconfig.h (revision 1765) @@ -0,0 +1,66 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: acconfig.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_CONFIG_H +# define LIBMAD_CONFIG_H + +/***************************************************************************** + * Definitions selected automatically by `configure' * + *****************************************************************************/ +@TOP@ + +/* Define to optimize for speed over accuracy. */ +#undef OPT_SPEED + +/* Define to optimize for accuracy over speed. */ +#undef OPT_ACCURACY + +/* Define to enable a fast subband synthesis approximation optimization. */ +#undef OPT_SSO + +/* Define to influence a strict interpretation of the ISO/IEC standards, + even if this is in opposition with best accepted practices. */ +#undef OPT_STRICT + +/* Define if your MIPS CPU supports a 2-operand MADD instruction. */ +#undef HAVE_MADD_ASM + +/* Define if your MIPS CPU supports a 2-operand MADD16 instruction. */ +#undef HAVE_MADD16_ASM + +/* Define to enable diagnostic debugging support. */ +#undef DEBUG + +/* Define to disable debugging assertions. */ +#undef NDEBUG + +/* Define to enable experimental code. */ +#undef EXPERIMENTAL + +/* Define if we have embedded application. */ +#undef EMBED + +@BOTTOM@ +/***************************************************************************** + * End of automatically configured definitions * + *****************************************************************************/ + +# endif
libmad/acconfig.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/bit.c =================================================================== --- libmad/bit.c (nonexistent) +++ libmad/bit.c (revision 1765) @@ -0,0 +1,216 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: bit.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# define CHAR_BIT 8 + +# include "bit.h" + +/* + * This is the lookup table for computing the CRC-check word. + * As described in section 2.4.3.1 and depicted in Figure A.9 + * of ISO/IEC 11172-3, the generator polynomial is: + * + * G(X) = X^16 + X^15 + X^2 + 1 + */ +static +unsigned short const crc_table[256] = { + 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, + 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, + 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, + 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, + 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, + 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, + 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, + 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, + + 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, + 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, + 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, + 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, + 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, + 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, + 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, + 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, + + 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, + 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, + 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, + 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, + 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, + 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, + 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, + 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, + + 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, + 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, + 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, + 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, + 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, + 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, + 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, + 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 +}; + +# define CRC_POLY 0x8005 + +/* + * NAME: bit->init() + * DESCRIPTION: initialize bit pointer struct + */ +void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte) +{ + bitptr->byte = byte; + bitptr->cache = 0; + bitptr->left = CHAR_BIT; +} + +/* + * NAME: bit->length() + * DESCRIPTION: return number of bits between start and end points + */ +unsigned int mad_bit_length(struct mad_bitptr const *begin, + struct mad_bitptr const *end) +{ + return begin->left + + CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left); +} + +/* + * NAME: bit->nextbyte() + * DESCRIPTION: return pointer to next unprocessed byte + */ +unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr) +{ + return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1; +} + +/* + * NAME: bit->skip() + * DESCRIPTION: advance bit pointer + */ +void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len) +{ + bitptr->byte += len / CHAR_BIT; + bitptr->left -= len % CHAR_BIT; + + if (bitptr->left > CHAR_BIT) { + bitptr->byte++; + bitptr->left += CHAR_BIT; + } + + if (bitptr->left < CHAR_BIT) + bitptr->cache = *bitptr->byte; +} + +/* + * NAME: bit->read() + * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value + */ +unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) +{ + register unsigned long value; + + if (bitptr->left == CHAR_BIT) + bitptr->cache = *bitptr->byte; + + if (len < bitptr->left) { + value = (bitptr->cache & ((1 << bitptr->left) - 1)) >> + (bitptr->left - len); + bitptr->left -= len; + + return value; + } + + /* remaining bits in current byte */ + + value = bitptr->cache & ((1 << bitptr->left) - 1); + len -= bitptr->left; + + bitptr->byte++; + bitptr->left = CHAR_BIT; + + /* more bytes */ + + while (len >= CHAR_BIT) { + value = (value << CHAR_BIT) | *bitptr->byte++; + len -= CHAR_BIT; + } + + if (len > 0) { + bitptr->cache = *bitptr->byte; + + value = (value << len) | (bitptr->cache >> (CHAR_BIT - len)); + bitptr->left -= len; + } + + return value; +} + +# if 0 +/* + * NAME: bit->write() + * DESCRIPTION: write an arbitrary number of bits + */ +void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len, + unsigned long value) +{ + unsigned char *ptr; + + ptr = (unsigned char *) bitptr->byte; + + /* ... */ +} +# endif + +/* + * NAME: bit->crc() + * DESCRIPTION: compute CRC-check word + */ +unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len, + unsigned short init) +{ + register unsigned int crc, data; + +# if CHAR_BIT == 8 + for (crc = init; len >= 8; len -= 8) { + crc = (crc << 8) ^ + crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; + } +# else + crc = init; +# endif + + while (len--) { + data = mad_bit_read(&bitptr, 1) ^ (crc >> 15); + + crc <<= 1; + if (data & 1) + crc ^= CRC_POLY; + } + + return crc & 0xffff; +}
libmad/bit.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/timer.c =================================================================== --- libmad/timer.c (nonexistent) +++ libmad/timer.c (revision 1765) @@ -0,0 +1,487 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: timer.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# ifndef EMBED +# include +# include +# else +# define assert(x) +# endif + +# include "timer.h" + +mad_timer_t const mad_timer_zero = { 0, 0 }; + +/* + * NAME: timer->compare() + * DESCRIPTION: indicate relative order of two timers + */ +int mad_timer_compare(mad_timer_t timer1, mad_timer_t timer2) +{ + signed long diff; + + diff = timer1.seconds - timer2.seconds; + if (diff < 0) + return -1; + else if (diff > 0) + return +1; + + diff = timer1.fraction - timer2.fraction; + if (diff < 0) + return -1; + else if (diff > 0) + return +1; + + return 0; +} + +/* + * NAME: timer->negate() + * DESCRIPTION: invert the sign of a timer + */ +void mad_timer_negate(mad_timer_t *timer) +{ + timer->seconds = -timer->seconds; + + if (timer->fraction) { + timer->seconds -= 1; + timer->fraction = MAD_TIMER_RESOLUTION - timer->fraction; + } +} + +/* + * NAME: timer->abs() + * DESCRIPTION: return the absolute value of a timer + */ +mad_timer_t mad_timer_abs(mad_timer_t timer) +{ + if (mad_timer_sign(timer) < 0) + mad_timer_negate(&timer); + + return timer; +} + +/* + * NAME: reduce_timer() + * DESCRIPTION: carry timer fraction into seconds + */ +static +void reduce_timer(mad_timer_t *timer) +{ + timer->seconds += timer->fraction / MAD_TIMER_RESOLUTION; + timer->fraction %= MAD_TIMER_RESOLUTION; +} + +/* + * NAME: gcd() + * DESCRIPTION: compute greatest common denominator + */ +static +unsigned long gcd(unsigned long num1, unsigned long num2) +{ + unsigned long tmp; + + while (num2) { + tmp = num2; + num2 = num1 % num2; + num1 = tmp; + } + + return num1; +} + +/* + * NAME: reduce_rational() + * DESCRIPTION: convert rational expression to lowest terms + */ +static +void reduce_rational(unsigned long *numer, unsigned long *denom) +{ + unsigned long factor; + + factor = gcd(*numer, *denom); + + assert(factor != 0); + + *numer /= factor; + *denom /= factor; +} + +/* + * NAME: scale_rational() + * DESCRIPTION: solve numer/denom == ?/scale avoiding overflowing + */ +static +unsigned long scale_rational(unsigned long numer, unsigned long denom, + unsigned long scale) +{ + reduce_rational(&numer, &denom); + reduce_rational(&scale, &denom); + + assert(denom != 0); + + if (denom < scale) + return numer * (scale / denom) + numer * (scale % denom) / denom; + if (denom < numer) + return scale * (numer / denom) + scale * (numer % denom) / denom; + + return numer * scale / denom; +} + +/* + * NAME: timer->set() + * DESCRIPTION: set timer to specific value + */ +void mad_timer_set(mad_timer_t *timer, unsigned long seconds, + unsigned long fraction, unsigned long fracparts) +{ + timer->seconds = seconds; + + if (fraction == 0) + fracparts = 0; + else if (fracparts == 0) { + fracparts = fraction; + fraction = 1; + } + + switch (fracparts) { + case 0: + timer->fraction = 0; + break; + + case MAD_TIMER_RESOLUTION: + timer->fraction = fraction; + break; + + case 8000: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 8000); + break; + + case 11025: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 11025); + break; + + case 12000: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 12000); + break; + + case 16000: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 16000); + break; + + case 22050: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 22050); + break; + + case 24000: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 24000); + break; + + case 32000: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 32000); + break; + + case 44100: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 44100); + break; + + case 48000: + timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 48000); + break; + + default: + timer->fraction = + scale_rational(fraction, fracparts, MAD_TIMER_RESOLUTION); + break; + } + + if (timer->fraction >= MAD_TIMER_RESOLUTION) + reduce_timer(timer); +} + +/* + * NAME: timer->add() + * DESCRIPTION: add one timer to another + */ +void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) +{ + timer->seconds += incr.seconds; + timer->fraction += incr.fraction; + + if (timer->fraction >= MAD_TIMER_RESOLUTION) + reduce_timer(timer); +} + +/* + * NAME: timer->multiply() + * DESCRIPTION: multiply a timer by a scalar value + */ +void mad_timer_multiply(mad_timer_t *timer, signed long scalar) +{ + mad_timer_t addend; + unsigned long factor; + + factor = scalar; + if (scalar < 0) { + mad_timer_negate(timer); + factor = -scalar; + } + + addend = *timer; + *timer = mad_timer_zero; + + while (factor) { + if (factor & 1) + mad_timer_add(timer, addend); + + mad_timer_add(&addend, addend); + factor >>= 1; + } +} + +/* + * NAME: timer->count() + * DESCRIPTION: return timer value in selected units + */ +signed long mad_timer_count(mad_timer_t timer, enum mad_units units) +{ + switch (units) { + case MAD_UNITS_HOURS: + return timer.seconds / 60 / 60; + + case MAD_UNITS_MINUTES: + return timer.seconds / 60; + + case MAD_UNITS_SECONDS: + return timer.seconds; + + case MAD_UNITS_DECISECONDS: + case MAD_UNITS_CENTISECONDS: + case MAD_UNITS_MILLISECONDS: + + case MAD_UNITS_8000_HZ: + case MAD_UNITS_11025_HZ: + case MAD_UNITS_12000_HZ: + case MAD_UNITS_16000_HZ: + case MAD_UNITS_22050_HZ: + case MAD_UNITS_24000_HZ: + case MAD_UNITS_32000_HZ: + case MAD_UNITS_44100_HZ: + case MAD_UNITS_48000_HZ: + + case MAD_UNITS_24_FPS: + case MAD_UNITS_25_FPS: + case MAD_UNITS_30_FPS: + case MAD_UNITS_48_FPS: + case MAD_UNITS_50_FPS: + case MAD_UNITS_60_FPS: + case MAD_UNITS_75_FPS: + return timer.seconds * (signed long) units + + (signed long) scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, + units); + + case MAD_UNITS_23_976_FPS: + case MAD_UNITS_24_975_FPS: + case MAD_UNITS_29_97_FPS: + case MAD_UNITS_47_952_FPS: + case MAD_UNITS_49_95_FPS: + case MAD_UNITS_59_94_FPS: + return (mad_timer_count(timer, -units) + 1) * 1000 / 1001; + } + + /* unsupported units */ + return 0; +} + +/* + * NAME: timer->fraction() + * DESCRIPTION: return fractional part of timer in arbitrary terms + */ +unsigned long mad_timer_fraction(mad_timer_t timer, unsigned long fracparts) +{ + timer = mad_timer_abs(timer); + + switch (fracparts) { + case 0: + return MAD_TIMER_RESOLUTION / timer.fraction; + + case MAD_TIMER_RESOLUTION: + return timer.fraction; + + default: + return scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, fracparts); + } +} + +#ifndef EMBED +/* + * NAME: timer->string() + * DESCRIPTION: write a string representation of a timer using a template + */ +void mad_timer_string(mad_timer_t timer, + char *dest, char const *format, enum mad_units units, + enum mad_units fracunits, unsigned long subparts) +{ + unsigned long hours, minutes, seconds, sub; + unsigned int frac; + + timer = mad_timer_abs(timer); + + seconds = timer.seconds; + frac = sub = 0; + + switch (fracunits) { + case MAD_UNITS_HOURS: + case MAD_UNITS_MINUTES: + case MAD_UNITS_SECONDS: + break; + + case MAD_UNITS_DECISECONDS: + case MAD_UNITS_CENTISECONDS: + case MAD_UNITS_MILLISECONDS: + + case MAD_UNITS_8000_HZ: + case MAD_UNITS_11025_HZ: + case MAD_UNITS_12000_HZ: + case MAD_UNITS_16000_HZ: + case MAD_UNITS_22050_HZ: + case MAD_UNITS_24000_HZ: + case MAD_UNITS_32000_HZ: + case MAD_UNITS_44100_HZ: + case MAD_UNITS_48000_HZ: + + case MAD_UNITS_24_FPS: + case MAD_UNITS_25_FPS: + case MAD_UNITS_30_FPS: + case MAD_UNITS_48_FPS: + case MAD_UNITS_50_FPS: + case MAD_UNITS_60_FPS: + case MAD_UNITS_75_FPS: + { + unsigned long fracparts; + + fracparts = MAD_TIMER_RESOLUTION / fracunits; + + frac = timer.fraction / fracparts; + sub = scale_rational(timer.fraction % fracparts, fracparts, subparts); + } + break; + + case MAD_UNITS_23_976_FPS: + case MAD_UNITS_24_975_FPS: + case MAD_UNITS_29_97_FPS: + case MAD_UNITS_47_952_FPS: + case MAD_UNITS_49_95_FPS: + case MAD_UNITS_59_94_FPS: + /* drop-frame encoding */ + /* N.B. this is only well-defined for MAD_UNITS_29_97_FPS */ + { + unsigned long frame, cycle, d, m; + + frame = mad_timer_count(timer, fracunits); + + cycle = -fracunits * 60 * 10 - (10 - 1) * 2; + + d = frame / cycle; + m = frame % cycle; + frame += (10 - 1) * 2 * d; + if (m > 2) + frame += 2 * ((m - 2) / (cycle / 10)); + + frac = frame % -fracunits; + seconds = frame / -fracunits; + } + break; + } + + switch (units) { + case MAD_UNITS_HOURS: + minutes = seconds / 60; + hours = minutes / 60; + + sprintf(dest, format, + hours, + (unsigned int) (minutes % 60), + (unsigned int) (seconds % 60), + frac, sub); + break; + + case MAD_UNITS_MINUTES: + minutes = seconds / 60; + + sprintf(dest, format, + minutes, + (unsigned int) (seconds % 60), + frac, sub); + break; + + case MAD_UNITS_SECONDS: + sprintf(dest, format, + seconds, + frac, sub); + break; + + case MAD_UNITS_23_976_FPS: + case MAD_UNITS_24_975_FPS: + case MAD_UNITS_29_97_FPS: + case MAD_UNITS_47_952_FPS: + case MAD_UNITS_49_95_FPS: + case MAD_UNITS_59_94_FPS: + if (fracunits < 0) { + /* not yet implemented */ + sub = 0; + } + + /* fall through */ + + case MAD_UNITS_DECISECONDS: + case MAD_UNITS_CENTISECONDS: + case MAD_UNITS_MILLISECONDS: + + case MAD_UNITS_8000_HZ: + case MAD_UNITS_11025_HZ: + case MAD_UNITS_12000_HZ: + case MAD_UNITS_16000_HZ: + case MAD_UNITS_22050_HZ: + case MAD_UNITS_24000_HZ: + case MAD_UNITS_32000_HZ: + case MAD_UNITS_44100_HZ: + case MAD_UNITS_48000_HZ: + + case MAD_UNITS_24_FPS: + case MAD_UNITS_25_FPS: + case MAD_UNITS_30_FPS: + case MAD_UNITS_48_FPS: + case MAD_UNITS_50_FPS: + case MAD_UNITS_60_FPS: + case MAD_UNITS_75_FPS: + sprintf(dest, format, mad_timer_count(timer, units), sub); + break; + } +} + +#endif
libmad/timer.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/bit.h =================================================================== --- libmad/bit.h (nonexistent) +++ libmad/bit.h (revision 1765) @@ -0,0 +1,47 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: bit.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_BIT_H +# define LIBMAD_BIT_H + +struct mad_bitptr { + unsigned char const *byte; + unsigned short cache; + unsigned short left; +}; + +void mad_bit_init(struct mad_bitptr *, unsigned char const *); + +# define mad_bit_finish(bitptr) /* nothing */ + +unsigned int mad_bit_length(struct mad_bitptr const *, + struct mad_bitptr const *); + +# define mad_bit_bitsleft(bitptr) ((bitptr)->left) +unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); + +void mad_bit_skip(struct mad_bitptr *, unsigned int); +unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); +void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); + +unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); + +# endif
libmad/bit.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/huffman.c =================================================================== --- libmad/huffman.c (nonexistent) +++ libmad/huffman.c (revision 1765) @@ -0,0 +1,3087 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: huffman.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# include "huffman.h" + +/* + * These are the Huffman code words for Layer III. + * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3. + * + * These tables support decoding up to 4 Huffman code bits at a time. + */ + +# define V(v, w, x, y, hlen) { { 1, hlen, v, w, x, y } } +# define PTR(offs, bits) { ptr: { 0, bits, offs } } + +static +union huffquad const hufftabA[] = { + /* 0000 */ PTR(16, 2), + /* 0001 */ PTR(20, 2), + /* 0010 */ PTR(24, 1), + /* 0011 */ PTR(26, 1), + /* 0100 */ V(0, 0, 1, 0, 4), + /* 0101 */ V(0, 0, 0, 1, 4), + /* 0110 */ V(0, 1, 0, 0, 4), + /* 0111 */ V(1, 0, 0, 0, 4), + /* 1000 */ V(0, 0, 0, 0, 1), + /* 1001 */ V(0, 0, 0, 0, 1), + /* 1010 */ V(0, 0, 0, 0, 1), + /* 1011 */ V(0, 0, 0, 0, 1), + /* 1100 */ V(0, 0, 0, 0, 1), + /* 1101 */ V(0, 0, 0, 0, 1), + /* 1110 */ V(0, 0, 0, 0, 1), + /* 1111 */ V(0, 0, 0, 0, 1), + + /* 0000 ... */ + /* 00 */ V(1, 0, 1, 1, 2), /* 16 */ + /* 01 */ V(1, 1, 1, 1, 2), + /* 10 */ V(1, 1, 0, 1, 2), + /* 11 */ V(1, 1, 1, 0, 2), + + /* 0001 ... */ + /* 00 */ V(0, 1, 1, 1, 2), /* 20 */ + /* 01 */ V(0, 1, 0, 1, 2), + /* 10 */ V(1, 0, 0, 1, 1), + /* 11 */ V(1, 0, 0, 1, 1), + + /* 0010 ... */ + /* 0 */ V(0, 1, 1, 0, 1), /* 24 */ + /* 1 */ V(0, 0, 1, 1, 1), + + /* 0011 ... */ + /* 0 */ V(1, 0, 1, 0, 1), /* 26 */ + /* 1 */ V(1, 1, 0, 0, 1) +}; + +static +union huffquad const hufftabB[] = { + /* 0000 */ V(1, 1, 1, 1, 4), + /* 0001 */ V(1, 1, 1, 0, 4), + /* 0010 */ V(1, 1, 0, 1, 4), + /* 0011 */ V(1, 1, 0, 0, 4), + /* 0100 */ V(1, 0, 1, 1, 4), + /* 0101 */ V(1, 0, 1, 0, 4), + /* 0110 */ V(1, 0, 0, 1, 4), + /* 0111 */ V(1, 0, 0, 0, 4), + /* 1000 */ V(0, 1, 1, 1, 4), + /* 1001 */ V(0, 1, 1, 0, 4), + /* 1010 */ V(0, 1, 0, 1, 4), + /* 1011 */ V(0, 1, 0, 0, 4), + /* 1100 */ V(0, 0, 1, 1, 4), + /* 1101 */ V(0, 0, 1, 0, 4), + /* 1110 */ V(0, 0, 0, 1, 4), + /* 1111 */ V(0, 0, 0, 0, 4) +}; + +# undef V +# undef PTR + +# define V(x, y, hlen) { { 1, hlen, x, y } } +# define PTR(offs, bits) { ptr: { 0, bits, offs } } + +static +union huffpair const hufftab0[] = { + /* */ V(0, 0, 0) +}; + +static +union huffpair const hufftab1[] = { + /* 000 */ V(1, 1, 3), + /* 001 */ V(0, 1, 3), + /* 010 */ V(1, 0, 2), + /* 011 */ V(1, 0, 2), + /* 100 */ V(0, 0, 1), + /* 101 */ V(0, 0, 1), + /* 110 */ V(0, 0, 1), + /* 111 */ V(0, 0, 1) +}; + +static +union huffpair const hufftab2[] = { + /* 000 */ PTR(8, 3), + /* 001 */ V(1, 1, 3), + /* 010 */ V(0, 1, 3), + /* 011 */ V(1, 0, 3), + /* 100 */ V(0, 0, 1), + /* 101 */ V(0, 0, 1), + /* 110 */ V(0, 0, 1), + /* 111 */ V(0, 0, 1), + + /* 000 ... */ + /* 000 */ V(2, 2, 3), /* 8 */ + /* 001 */ V(0, 2, 3), + /* 010 */ V(1, 2, 2), + /* 011 */ V(1, 2, 2), + /* 100 */ V(2, 1, 2), + /* 101 */ V(2, 1, 2), + /* 110 */ V(2, 0, 2), + /* 111 */ V(2, 0, 2) +}; + +static +union huffpair const hufftab3[] = { + /* 000 */ PTR(8, 3), + /* 001 */ V(1, 0, 3), + /* 010 */ V(1, 1, 2), + /* 011 */ V(1, 1, 2), + /* 100 */ V(0, 1, 2), + /* 101 */ V(0, 1, 2), + /* 110 */ V(0, 0, 2), + /* 111 */ V(0, 0, 2), + + /* 000 ... */ + /* 000 */ V(2, 2, 3), /* 8 */ + /* 001 */ V(0, 2, 3), + /* 010 */ V(1, 2, 2), + /* 011 */ V(1, 2, 2), + /* 100 */ V(2, 1, 2), + /* 101 */ V(2, 1, 2), + /* 110 */ V(2, 0, 2), + /* 111 */ V(2, 0, 2) +}; + +static +union huffpair const hufftab5[] = { + /* 000 */ PTR(8, 4), + /* 001 */ V(1, 1, 3), + /* 010 */ V(0, 1, 3), + /* 011 */ V(1, 0, 3), + /* 100 */ V(0, 0, 1), + /* 101 */ V(0, 0, 1), + /* 110 */ V(0, 0, 1), + /* 111 */ V(0, 0, 1), + + /* 000 ... */ + /* 0000 */ PTR(24, 1), /* 8 */ + /* 0001 */ V(3, 2, 4), + /* 0010 */ V(3, 1, 3), + /* 0011 */ V(3, 1, 3), + /* 0100 */ V(1, 3, 4), + /* 0101 */ V(0, 3, 4), + /* 0110 */ V(3, 0, 4), + /* 0111 */ V(2, 2, 4), + /* 1000 */ V(1, 2, 3), + /* 1001 */ V(1, 2, 3), + /* 1010 */ V(2, 1, 3), + /* 1011 */ V(2, 1, 3), + /* 1100 */ V(0, 2, 3), + /* 1101 */ V(0, 2, 3), + /* 1110 */ V(2, 0, 3), + /* 1111 */ V(2, 0, 3), + + /* 000 0000 ... */ + /* 0 */ V(3, 3, 1), /* 24 */ + /* 1 */ V(2, 3, 1) +}; + +static +union huffpair const hufftab6[] = { + /* 0000 */ PTR(16, 3), + /* 0001 */ PTR(24, 1), + /* 0010 */ PTR(26, 1), + /* 0011 */ V(1, 2, 4), + /* 0100 */ V(2, 1, 4), + /* 0101 */ V(2, 0, 4), + /* 0110 */ V(0, 1, 3), + /* 0111 */ V(0, 1, 3), + /* 1000 */ V(1, 1, 2), + /* 1001 */ V(1, 1, 2), + /* 1010 */ V(1, 1, 2), + /* 1011 */ V(1, 1, 2), + /* 1100 */ V(1, 0, 3), + /* 1101 */ V(1, 0, 3), + /* 1110 */ V(0, 0, 3), + /* 1111 */ V(0, 0, 3), + + /* 0000 ... */ + /* 000 */ V(3, 3, 3), /* 16 */ + /* 001 */ V(0, 3, 3), + /* 010 */ V(2, 3, 2), + /* 011 */ V(2, 3, 2), + /* 100 */ V(3, 2, 2), + /* 101 */ V(3, 2, 2), + /* 110 */ V(3, 0, 2), + /* 111 */ V(3, 0, 2), + + /* 0001 ... */ + /* 0 */ V(1, 3, 1), /* 24 */ + /* 1 */ V(3, 1, 1), + + /* 0010 ... */ + /* 0 */ V(2, 2, 1), /* 26 */ + /* 1 */ V(0, 2, 1) +}; + +static +union huffpair const hufftab7[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 2), + /* 0011 */ V(1, 1, 4), + /* 0100 */ V(0, 1, 3), + /* 0101 */ V(0, 1, 3), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(52, 2), /* 16 */ + /* 0001 */ PTR(56, 1), + /* 0010 */ PTR(58, 1), + /* 0011 */ V(1, 5, 4), + /* 0100 */ V(5, 1, 4), + /* 0101 */ PTR(60, 1), + /* 0110 */ V(5, 0, 4), + /* 0111 */ PTR(62, 1), + /* 1000 */ V(2, 4, 4), + /* 1001 */ V(4, 2, 4), + /* 1010 */ V(1, 4, 3), + /* 1011 */ V(1, 4, 3), + /* 1100 */ V(4, 1, 3), + /* 1101 */ V(4, 1, 3), + /* 1110 */ V(4, 0, 3), + /* 1111 */ V(4, 0, 3), + + /* 0001 ... */ + /* 0000 */ V(0, 4, 4), /* 32 */ + /* 0001 */ V(2, 3, 4), + /* 0010 */ V(3, 2, 4), + /* 0011 */ V(0, 3, 4), + /* 0100 */ V(1, 3, 3), + /* 0101 */ V(1, 3, 3), + /* 0110 */ V(3, 1, 3), + /* 0111 */ V(3, 1, 3), + /* 1000 */ V(3, 0, 3), + /* 1001 */ V(3, 0, 3), + /* 1010 */ V(2, 2, 3), + /* 1011 */ V(2, 2, 3), + /* 1100 */ V(1, 2, 2), + /* 1101 */ V(1, 2, 2), + /* 1110 */ V(1, 2, 2), + /* 1111 */ V(1, 2, 2), + + /* 0010 ... */ + /* 00 */ V(2, 1, 1), /* 48 */ + /* 01 */ V(2, 1, 1), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 00 */ V(5, 5, 2), /* 52 */ + /* 01 */ V(4, 5, 2), + /* 10 */ V(5, 4, 2), + /* 11 */ V(5, 3, 2), + + /* 0000 0001 ... */ + /* 0 */ V(3, 5, 1), /* 56 */ + /* 1 */ V(4, 4, 1), + + /* 0000 0010 ... */ + /* 0 */ V(2, 5, 1), /* 58 */ + /* 1 */ V(5, 2, 1), + + /* 0000 0101 ... */ + /* 0 */ V(0, 5, 1), /* 60 */ + /* 1 */ V(3, 4, 1), + + /* 0000 0111 ... */ + /* 0 */ V(4, 3, 1), /* 62 */ + /* 1 */ V(3, 3, 1) +}; + +# if 0 +/* this version saves 8 entries (16 bytes) at the expense of + an extra lookup in 4 out of 36 cases */ +static +union huffpair const hufftab8[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 2), + /* 0010 */ V(1, 2, 4), + /* 0011 */ V(2, 1, 4), + /* 0100 */ V(1, 1, 2), + /* 0101 */ V(1, 1, 2), + /* 0110 */ V(1, 1, 2), + /* 0111 */ V(1, 1, 2), + /* 1000 */ V(0, 1, 3), + /* 1001 */ V(0, 1, 3), + /* 1010 */ V(1, 0, 3), + /* 1011 */ V(1, 0, 3), + /* 1100 */ V(0, 0, 2), + /* 1101 */ V(0, 0, 2), + /* 1110 */ V(0, 0, 2), + /* 1111 */ V(0, 0, 2), + + /* 0000 ... */ + /* 0000 */ PTR(36, 3), /* 16 */ + /* 0001 */ PTR(44, 2), + /* 0010 */ PTR(48, 1), + /* 0011 */ V(1, 5, 4), + /* 0100 */ V(5, 1, 4), + /* 0101 */ PTR(50, 1), + /* 0110 */ PTR(52, 1), + /* 0111 */ V(2, 4, 4), + /* 1000 */ V(4, 2, 4), + /* 1001 */ V(1, 4, 4), + /* 1010 */ V(4, 1, 3), + /* 1011 */ V(4, 1, 3), + /* 1100 */ V(0, 4, 4), + /* 1101 */ V(4, 0, 4), + /* 1110 */ V(2, 3, 4), + /* 1111 */ V(3, 2, 4), + + /* 0001 ... */ + /* 00 */ PTR(54, 2), /* 32 */ + /* 01 */ V(2, 2, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(5, 5, 3), /* 36 */ + /* 001 */ V(5, 4, 3), + /* 010 */ V(4, 5, 2), + /* 011 */ V(4, 5, 2), + /* 100 */ V(5, 3, 1), + /* 101 */ V(5, 3, 1), + /* 110 */ V(5, 3, 1), + /* 111 */ V(5, 3, 1), + + /* 0000 0001 ... */ + /* 00 */ V(3, 5, 2), /* 44 */ + /* 01 */ V(4, 4, 2), + /* 10 */ V(2, 5, 1), + /* 11 */ V(2, 5, 1), + + /* 0000 0010 ... */ + /* 0 */ V(5, 2, 1), /* 48 */ + /* 1 */ V(0, 5, 1), + + /* 0000 0101 ... */ + /* 0 */ V(3, 4, 1), /* 50 */ + /* 1 */ V(4, 3, 1), + + /* 0000 0110 ... */ + /* 0 */ V(5, 0, 1), /* 52 */ + /* 1 */ V(3, 3, 1), + + /* 0001 00 ... */ + /* 00 */ V(1, 3, 2), /* 54 */ + /* 01 */ V(3, 1, 2), + /* 10 */ V(0, 3, 2), + /* 11 */ V(3, 0, 2), +}; +# else +static +union huffpair const hufftab8[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ V(1, 2, 4), + /* 0011 */ V(2, 1, 4), + /* 0100 */ V(1, 1, 2), + /* 0101 */ V(1, 1, 2), + /* 0110 */ V(1, 1, 2), + /* 0111 */ V(1, 1, 2), + /* 1000 */ V(0, 1, 3), + /* 1001 */ V(0, 1, 3), + /* 1010 */ V(1, 0, 3), + /* 1011 */ V(1, 0, 3), + /* 1100 */ V(0, 0, 2), + /* 1101 */ V(0, 0, 2), + /* 1110 */ V(0, 0, 2), + /* 1111 */ V(0, 0, 2), + + /* 0000 ... */ + /* 0000 */ PTR(48, 3), /* 16 */ + /* 0001 */ PTR(56, 2), + /* 0010 */ PTR(60, 1), + /* 0011 */ V(1, 5, 4), + /* 0100 */ V(5, 1, 4), + /* 0101 */ PTR(62, 1), + /* 0110 */ PTR(64, 1), + /* 0111 */ V(2, 4, 4), + /* 1000 */ V(4, 2, 4), + /* 1001 */ V(1, 4, 4), + /* 1010 */ V(4, 1, 3), + /* 1011 */ V(4, 1, 3), + /* 1100 */ V(0, 4, 4), + /* 1101 */ V(4, 0, 4), + /* 1110 */ V(2, 3, 4), + /* 1111 */ V(3, 2, 4), + + /* 0001 ... */ + /* 0000 */ V(1, 3, 4), /* 32 */ + /* 0001 */ V(3, 1, 4), + /* 0010 */ V(0, 3, 4), + /* 0011 */ V(3, 0, 4), + /* 0100 */ V(2, 2, 2), + /* 0101 */ V(2, 2, 2), + /* 0110 */ V(2, 2, 2), + /* 0111 */ V(2, 2, 2), + /* 1000 */ V(0, 2, 2), + /* 1001 */ V(0, 2, 2), + /* 1010 */ V(0, 2, 2), + /* 1011 */ V(0, 2, 2), + /* 1100 */ V(2, 0, 2), + /* 1101 */ V(2, 0, 2), + /* 1110 */ V(2, 0, 2), + /* 1111 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(5, 5, 3), /* 48 */ + /* 001 */ V(5, 4, 3), + /* 010 */ V(4, 5, 2), + /* 011 */ V(4, 5, 2), + /* 100 */ V(5, 3, 1), + /* 101 */ V(5, 3, 1), + /* 110 */ V(5, 3, 1), + /* 111 */ V(5, 3, 1), + + /* 0000 0001 ... */ + /* 00 */ V(3, 5, 2), /* 56 */ + /* 01 */ V(4, 4, 2), + /* 10 */ V(2, 5, 1), + /* 11 */ V(2, 5, 1), + + /* 0000 0010 ... */ + /* 0 */ V(5, 2, 1), /* 60 */ + /* 1 */ V(0, 5, 1), + + /* 0000 0101 ... */ + /* 0 */ V(3, 4, 1), /* 62 */ + /* 1 */ V(4, 3, 1), + + /* 0000 0110 ... */ + /* 0 */ V(5, 0, 1), /* 64 */ + /* 1 */ V(3, 3, 1) +}; +# endif + +static +union huffpair const hufftab9[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 3), + /* 0010 */ PTR(40, 2), + /* 0011 */ PTR(44, 2), + /* 0100 */ PTR(48, 1), + /* 0101 */ V(1, 2, 4), + /* 0110 */ V(2, 1, 4), + /* 0111 */ V(2, 0, 4), + /* 1000 */ V(1, 1, 3), + /* 1001 */ V(1, 1, 3), + /* 1010 */ V(0, 1, 3), + /* 1011 */ V(0, 1, 3), + /* 1100 */ V(1, 0, 3), + /* 1101 */ V(1, 0, 3), + /* 1110 */ V(0, 0, 3), + /* 1111 */ V(0, 0, 3), + + /* 0000 ... */ + /* 0000 */ PTR(50, 1), /* 16 */ + /* 0001 */ V(3, 5, 4), + /* 0010 */ V(5, 3, 4), + /* 0011 */ PTR(52, 1), + /* 0100 */ V(4, 4, 4), + /* 0101 */ V(2, 5, 4), + /* 0110 */ V(5, 2, 4), + /* 0111 */ V(1, 5, 4), + /* 1000 */ V(5, 1, 3), + /* 1001 */ V(5, 1, 3), + /* 1010 */ V(3, 4, 3), + /* 1011 */ V(3, 4, 3), + /* 1100 */ V(4, 3, 3), + /* 1101 */ V(4, 3, 3), + /* 1110 */ V(5, 0, 4), + /* 1111 */ V(0, 4, 4), + + /* 0001 ... */ + /* 000 */ V(2, 4, 3), /* 32 */ + /* 001 */ V(4, 2, 3), + /* 010 */ V(3, 3, 3), + /* 011 */ V(4, 0, 3), + /* 100 */ V(1, 4, 2), + /* 101 */ V(1, 4, 2), + /* 110 */ V(4, 1, 2), + /* 111 */ V(4, 1, 2), + + /* 0010 ... */ + /* 00 */ V(2, 3, 2), /* 40 */ + /* 01 */ V(3, 2, 2), + /* 10 */ V(1, 3, 1), + /* 11 */ V(1, 3, 1), + + /* 0011 ... */ + /* 00 */ V(3, 1, 1), /* 44 */ + /* 01 */ V(3, 1, 1), + /* 10 */ V(0, 3, 2), + /* 11 */ V(3, 0, 2), + + /* 0100 ... */ + /* 0 */ V(2, 2, 1), /* 48 */ + /* 1 */ V(0, 2, 1), + + /* 0000 0000 ... */ + /* 0 */ V(5, 5, 1), /* 50 */ + /* 1 */ V(4, 5, 1), + + /* 0000 0011 ... */ + /* 0 */ V(5, 4, 1), /* 52 */ + /* 1 */ V(0, 5, 1) +}; + +static +union huffpair const hufftab10[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 2), + /* 0011 */ V(1, 1, 4), + /* 0100 */ V(0, 1, 3), + /* 0101 */ V(0, 1, 3), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(52, 3), /* 16 */ + /* 0001 */ PTR(60, 2), + /* 0010 */ PTR(64, 3), + /* 0011 */ PTR(72, 1), + /* 0100 */ PTR(74, 2), + /* 0101 */ PTR(78, 2), + /* 0110 */ PTR(82, 2), + /* 0111 */ V(1, 7, 4), + /* 1000 */ V(7, 1, 4), + /* 1001 */ PTR(86, 1), + /* 1010 */ PTR(88, 2), + /* 1011 */ PTR(92, 2), + /* 1100 */ V(1, 6, 4), + /* 1101 */ V(6, 1, 4), + /* 1110 */ V(6, 0, 4), + /* 1111 */ PTR(96, 1), + + /* 0001 ... */ + /* 0000 */ PTR(98, 1), /* 32 */ + /* 0001 */ PTR(100, 1), + /* 0010 */ V(1, 4, 4), + /* 0011 */ V(4, 1, 4), + /* 0100 */ V(4, 0, 4), + /* 0101 */ V(2, 3, 4), + /* 0110 */ V(3, 2, 4), + /* 0111 */ V(0, 3, 4), + /* 1000 */ V(1, 3, 3), + /* 1001 */ V(1, 3, 3), + /* 1010 */ V(3, 1, 3), + /* 1011 */ V(3, 1, 3), + /* 1100 */ V(3, 0, 3), + /* 1101 */ V(3, 0, 3), + /* 1110 */ V(2, 2, 3), + /* 1111 */ V(2, 2, 3), + + /* 0010 ... */ + /* 00 */ V(1, 2, 2), /* 48 */ + /* 01 */ V(2, 1, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(7, 7, 3), /* 52 */ + /* 001 */ V(6, 7, 3), + /* 010 */ V(7, 6, 3), + /* 011 */ V(5, 7, 3), + /* 100 */ V(7, 5, 3), + /* 101 */ V(6, 6, 3), + /* 110 */ V(4, 7, 2), + /* 111 */ V(4, 7, 2), + + /* 0000 0001 ... */ + /* 00 */ V(7, 4, 2), /* 60 */ + /* 01 */ V(5, 6, 2), + /* 10 */ V(6, 5, 2), + /* 11 */ V(3, 7, 2), + + /* 0000 0010 ... */ + /* 000 */ V(7, 3, 2), /* 64 */ + /* 001 */ V(7, 3, 2), + /* 010 */ V(4, 6, 2), + /* 011 */ V(4, 6, 2), + /* 100 */ V(5, 5, 3), + /* 101 */ V(5, 4, 3), + /* 110 */ V(6, 3, 2), + /* 111 */ V(6, 3, 2), + + /* 0000 0011 ... */ + /* 0 */ V(2, 7, 1), /* 72 */ + /* 1 */ V(7, 2, 1), + + /* 0000 0100 ... */ + /* 00 */ V(6, 4, 2), /* 74 */ + /* 01 */ V(0, 7, 2), + /* 10 */ V(7, 0, 1), + /* 11 */ V(7, 0, 1), + + /* 0000 0101 ... */ + /* 00 */ V(6, 2, 1), /* 78 */ + /* 01 */ V(6, 2, 1), + /* 10 */ V(4, 5, 2), + /* 11 */ V(3, 5, 2), + + /* 0000 0110 ... */ + /* 00 */ V(0, 6, 1), /* 82 */ + /* 01 */ V(0, 6, 1), + /* 10 */ V(5, 3, 2), + /* 11 */ V(4, 4, 2), + + /* 0000 1001 ... */ + /* 0 */ V(3, 6, 1), /* 86 */ + /* 1 */ V(2, 6, 1), + + /* 0000 1010 ... */ + /* 00 */ V(2, 5, 2), /* 88 */ + /* 01 */ V(5, 2, 2), + /* 10 */ V(1, 5, 1), + /* 11 */ V(1, 5, 1), + + /* 0000 1011 ... */ + /* 00 */ V(5, 1, 1), /* 92 */ + /* 01 */ V(5, 1, 1), + /* 10 */ V(3, 4, 2), + /* 11 */ V(4, 3, 2), + + /* 0000 1111 ... */ + /* 0 */ V(0, 5, 1), /* 96 */ + /* 1 */ V(5, 0, 1), + + /* 0001 0000 ... */ + /* 0 */ V(2, 4, 1), /* 98 */ + /* 1 */ V(4, 2, 1), + + /* 0001 0001 ... */ + /* 0 */ V(3, 3, 1), /* 100 */ + /* 1 */ V(0, 4, 1) +}; + +static +union huffpair const hufftab11[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 3), + /* 0100 */ V(1, 2, 4), + /* 0101 */ PTR(72, 1), + /* 0110 */ V(1, 1, 3), + /* 0111 */ V(1, 1, 3), + /* 1000 */ V(0, 1, 3), + /* 1001 */ V(0, 1, 3), + /* 1010 */ V(1, 0, 3), + /* 1011 */ V(1, 0, 3), + /* 1100 */ V(0, 0, 2), + /* 1101 */ V(0, 0, 2), + /* 1110 */ V(0, 0, 2), + /* 1111 */ V(0, 0, 2), + + /* 0000 ... */ + /* 0000 */ PTR(74, 2), /* 16 */ + /* 0001 */ PTR(78, 3), + /* 0010 */ PTR(86, 2), + /* 0011 */ PTR(90, 1), + /* 0100 */ PTR(92, 2), + /* 0101 */ V(2, 7, 4), + /* 0110 */ V(7, 2, 4), + /* 0111 */ PTR(96, 1), + /* 1000 */ V(7, 1, 3), + /* 1001 */ V(7, 1, 3), + /* 1010 */ V(1, 7, 4), + /* 1011 */ V(7, 0, 4), + /* 1100 */ V(3, 6, 4), + /* 1101 */ V(6, 3, 4), + /* 1110 */ V(6, 0, 4), + /* 1111 */ PTR(98, 1), + + /* 0001 ... */ + /* 0000 */ PTR(100, 1), /* 32 */ + /* 0001 */ V(1, 5, 4), + /* 0010 */ V(6, 2, 3), + /* 0011 */ V(6, 2, 3), + /* 0100 */ V(2, 6, 4), + /* 0101 */ V(0, 6, 4), + /* 0110 */ V(1, 6, 3), + /* 0111 */ V(1, 6, 3), + /* 1000 */ V(6, 1, 3), + /* 1001 */ V(6, 1, 3), + /* 1010 */ V(5, 1, 4), + /* 1011 */ V(3, 4, 4), + /* 1100 */ V(5, 0, 4), + /* 1101 */ PTR(102, 1), + /* 1110 */ V(2, 4, 4), + /* 1111 */ V(4, 2, 4), + + /* 0010 ... */ + /* 0000 */ V(1, 4, 4), /* 48 */ + /* 0001 */ V(4, 1, 4), + /* 0010 */ V(0, 4, 4), + /* 0011 */ V(4, 0, 4), + /* 0100 */ V(2, 3, 3), + /* 0101 */ V(2, 3, 3), + /* 0110 */ V(3, 2, 3), + /* 0111 */ V(3, 2, 3), + /* 1000 */ V(1, 3, 2), + /* 1001 */ V(1, 3, 2), + /* 1010 */ V(1, 3, 2), + /* 1011 */ V(1, 3, 2), + /* 1100 */ V(3, 1, 2), + /* 1101 */ V(3, 1, 2), + /* 1110 */ V(3, 1, 2), + /* 1111 */ V(3, 1, 2), + + /* 0011 ... */ + /* 000 */ V(0, 3, 3), /* 64 */ + /* 001 */ V(3, 0, 3), + /* 010 */ V(2, 2, 2), + /* 011 */ V(2, 2, 2), + /* 100 */ V(2, 1, 1), + /* 101 */ V(2, 1, 1), + /* 110 */ V(2, 1, 1), + /* 111 */ V(2, 1, 1), + + /* 0101 ... */ + /* 0 */ V(0, 2, 1), /* 72 */ + /* 1 */ V(2, 0, 1), + + /* 0000 0000 ... */ + /* 00 */ V(7, 7, 2), /* 74 */ + /* 01 */ V(6, 7, 2), + /* 10 */ V(7, 6, 2), + /* 11 */ V(7, 5, 2), + + /* 0000 0001 ... */ + /* 000 */ V(6, 6, 2), /* 78 */ + /* 001 */ V(6, 6, 2), + /* 010 */ V(4, 7, 2), + /* 011 */ V(4, 7, 2), + /* 100 */ V(7, 4, 2), + /* 101 */ V(7, 4, 2), + /* 110 */ V(5, 7, 3), + /* 111 */ V(5, 5, 3), + + /* 0000 0010 ... */ + /* 00 */ V(5, 6, 2), /* 86 */ + /* 01 */ V(6, 5, 2), + /* 10 */ V(3, 7, 1), + /* 11 */ V(3, 7, 1), + + /* 0000 0011 ... */ + /* 0 */ V(7, 3, 1), /* 90 */ + /* 1 */ V(4, 6, 1), + + /* 0000 0100 ... */ + /* 00 */ V(4, 5, 2), /* 92 */ + /* 01 */ V(5, 4, 2), + /* 10 */ V(3, 5, 2), + /* 11 */ V(5, 3, 2), + + /* 0000 0111 ... */ + /* 0 */ V(6, 4, 1), /* 96 */ + /* 1 */ V(0, 7, 1), + + /* 0000 1111 ... */ + /* 0 */ V(4, 4, 1), /* 98 */ + /* 1 */ V(2, 5, 1), + + /* 0001 0000 ... */ + /* 0 */ V(5, 2, 1), /* 100 */ + /* 1 */ V(0, 5, 1), + + /* 0001 1101 ... */ + /* 0 */ V(4, 3, 1), /* 102 */ + /* 1 */ V(3, 3, 1) +}; + +static +union huffpair const hufftab12[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 2), + /* 0100 */ PTR(68, 3), + /* 0101 */ PTR(76, 1), + /* 0110 */ V(1, 2, 4), + /* 0111 */ V(2, 1, 4), + /* 1000 */ PTR(78, 1), + /* 1001 */ V(0, 0, 4), + /* 1010 */ V(1, 1, 3), + /* 1011 */ V(1, 1, 3), + /* 1100 */ V(0, 1, 3), + /* 1101 */ V(0, 1, 3), + /* 1110 */ V(1, 0, 3), + /* 1111 */ V(1, 0, 3), + + /* 0000 ... */ + /* 0000 */ PTR(80, 2), /* 16 */ + /* 0001 */ PTR(84, 1), + /* 0010 */ PTR(86, 1), + /* 0011 */ PTR(88, 1), + /* 0100 */ V(5, 6, 4), + /* 0101 */ V(3, 7, 4), + /* 0110 */ PTR(90, 1), + /* 0111 */ V(2, 7, 4), + /* 1000 */ V(7, 2, 4), + /* 1001 */ V(4, 6, 4), + /* 1010 */ V(6, 4, 4), + /* 1011 */ V(1, 7, 4), + /* 1100 */ V(7, 1, 4), + /* 1101 */ PTR(92, 1), + /* 1110 */ V(3, 6, 4), + /* 1111 */ V(6, 3, 4), + + /* 0001 ... */ + /* 0000 */ V(4, 5, 4), /* 32 */ + /* 0001 */ V(5, 4, 4), + /* 0010 */ V(4, 4, 4), + /* 0011 */ PTR(94, 1), + /* 0100 */ V(2, 6, 3), + /* 0101 */ V(2, 6, 3), + /* 0110 */ V(6, 2, 3), + /* 0111 */ V(6, 2, 3), + /* 1000 */ V(6, 1, 3), + /* 1001 */ V(6, 1, 3), + /* 1010 */ V(1, 6, 4), + /* 1011 */ V(6, 0, 4), + /* 1100 */ V(3, 5, 4), + /* 1101 */ V(5, 3, 4), + /* 1110 */ V(2, 5, 4), + /* 1111 */ V(5, 2, 4), + + /* 0010 ... */ + /* 0000 */ V(1, 5, 3), /* 48 */ + /* 0001 */ V(1, 5, 3), + /* 0010 */ V(5, 1, 3), + /* 0011 */ V(5, 1, 3), + /* 0100 */ V(3, 4, 3), + /* 0101 */ V(3, 4, 3), + /* 0110 */ V(4, 3, 3), + /* 0111 */ V(4, 3, 3), + /* 1000 */ V(5, 0, 4), + /* 1001 */ V(0, 4, 4), + /* 1010 */ V(2, 4, 3), + /* 1011 */ V(2, 4, 3), + /* 1100 */ V(4, 2, 3), + /* 1101 */ V(4, 2, 3), + /* 1110 */ V(1, 4, 3), + /* 1111 */ V(1, 4, 3), + + /* 0011 ... */ + /* 00 */ V(3, 3, 2), /* 64 */ + /* 01 */ V(4, 1, 2), + /* 10 */ V(2, 3, 2), + /* 11 */ V(3, 2, 2), + + /* 0100 ... */ + /* 000 */ V(4, 0, 3), /* 68 */ + /* 001 */ V(0, 3, 3), + /* 010 */ V(3, 0, 2), + /* 011 */ V(3, 0, 2), + /* 100 */ V(1, 3, 1), + /* 101 */ V(1, 3, 1), + /* 110 */ V(1, 3, 1), + /* 111 */ V(1, 3, 1), + + /* 0101 ... */ + /* 0 */ V(3, 1, 1), /* 76 */ + /* 1 */ V(2, 2, 1), + + /* 1000 ... */ + /* 0 */ V(0, 2, 1), /* 78 */ + /* 1 */ V(2, 0, 1), + + /* 0000 0000 ... */ + /* 00 */ V(7, 7, 2), /* 80 */ + /* 01 */ V(6, 7, 2), + /* 10 */ V(7, 6, 1), + /* 11 */ V(7, 6, 1), + + /* 0000 0001 ... */ + /* 0 */ V(5, 7, 1), /* 84 */ + /* 1 */ V(7, 5, 1), + + /* 0000 0010 ... */ + /* 0 */ V(6, 6, 1), /* 86 */ + /* 1 */ V(4, 7, 1), + + /* 0000 0011 ... */ + /* 0 */ V(7, 4, 1), /* 88 */ + /* 1 */ V(6, 5, 1), + + /* 0000 0110 ... */ + /* 0 */ V(7, 3, 1), /* 90 */ + /* 1 */ V(5, 5, 1), + + /* 0000 1101 ... */ + /* 0 */ V(0, 7, 1), /* 92 */ + /* 1 */ V(7, 0, 1), + + /* 0001 0011 ... */ + /* 0 */ V(0, 6, 1), /* 94 */ + /* 1 */ V(0, 5, 1) +}; + +static +union huffpair const hufftab13[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 2), + /* 0100 */ V(1, 1, 4), + /* 0101 */ V(0, 1, 4), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(68, 4), /* 16 */ + /* 0001 */ PTR(84, 4), + /* 0010 */ PTR(100, 4), + /* 0011 */ PTR(116, 4), + /* 0100 */ PTR(132, 4), + /* 0101 */ PTR(148, 4), + /* 0110 */ PTR(164, 3), + /* 0111 */ PTR(172, 3), + /* 1000 */ PTR(180, 3), + /* 1001 */ PTR(188, 3), + /* 1010 */ PTR(196, 3), + /* 1011 */ PTR(204, 3), + /* 1100 */ PTR(212, 1), + /* 1101 */ PTR(214, 2), + /* 1110 */ PTR(218, 3), + /* 1111 */ PTR(226, 1), + + /* 0001 ... */ + /* 0000 */ PTR(228, 2), /* 32 */ + /* 0001 */ PTR(232, 2), + /* 0010 */ PTR(236, 2), + /* 0011 */ PTR(240, 2), + /* 0100 */ V(8, 1, 4), + /* 0101 */ PTR(244, 1), + /* 0110 */ PTR(246, 1), + /* 0111 */ PTR(248, 1), + /* 1000 */ PTR(250, 2), + /* 1001 */ PTR(254, 1), + /* 1010 */ V(1, 5, 4), + /* 1011 */ V(5, 1, 4), + /* 1100 */ PTR(256, 1), + /* 1101 */ PTR(258, 1), + /* 1110 */ PTR(260, 1), + /* 1111 */ V(1, 4, 4), + + /* 0010 ... */ + /* 0000 */ V(4, 1, 3), /* 48 */ + /* 0001 */ V(4, 1, 3), + /* 0010 */ V(0, 4, 4), + /* 0011 */ V(4, 0, 4), + /* 0100 */ V(2, 3, 4), + /* 0101 */ V(3, 2, 4), + /* 0110 */ V(1, 3, 3), + /* 0111 */ V(1, 3, 3), + /* 1000 */ V(3, 1, 3), + /* 1001 */ V(3, 1, 3), + /* 1010 */ V(0, 3, 3), + /* 1011 */ V(0, 3, 3), + /* 1100 */ V(3, 0, 3), + /* 1101 */ V(3, 0, 3), + /* 1110 */ V(2, 2, 3), + /* 1111 */ V(2, 2, 3), + + /* 0011 ... */ + /* 00 */ V(1, 2, 2), /* 64 */ + /* 01 */ V(2, 1, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 0000 */ PTR(262, 4), /* 68 */ + /* 0001 */ PTR(278, 4), + /* 0010 */ PTR(294, 4), + /* 0011 */ PTR(310, 3), + /* 0100 */ PTR(318, 2), + /* 0101 */ PTR(322, 2), + /* 0110 */ PTR(326, 3), + /* 0111 */ PTR(334, 2), + /* 1000 */ PTR(338, 1), + /* 1001 */ PTR(340, 2), + /* 1010 */ PTR(344, 2), + /* 1011 */ PTR(348, 2), + /* 1100 */ PTR(352, 2), + /* 1101 */ PTR(356, 2), + /* 1110 */ V(1, 15, 4), + /* 1111 */ V(15, 1, 4), + + /* 0000 0001 ... */ + /* 0000 */ V(15, 0, 4), /* 84 */ + /* 0001 */ PTR(360, 1), + /* 0010 */ PTR(362, 1), + /* 0011 */ PTR(364, 1), + /* 0100 */ V(14, 2, 4), + /* 0101 */ PTR(366, 1), + /* 0110 */ V(1, 14, 4), + /* 0111 */ V(14, 1, 4), + /* 1000 */ PTR(368, 1), + /* 1001 */ PTR(370, 1), + /* 1010 */ PTR(372, 1), + /* 1011 */ PTR(374, 1), + /* 1100 */ PTR(376, 1), + /* 1101 */ PTR(378, 1), + /* 1110 */ V(12, 6, 4), + /* 1111 */ V(3, 13, 4), + + /* 0000 0010 ... */ + /* 0000 */ PTR(380, 1), /* 100 */ + /* 0001 */ V(2, 13, 4), + /* 0010 */ V(13, 2, 4), + /* 0011 */ V(1, 13, 4), + /* 0100 */ V(11, 7, 4), + /* 0101 */ PTR(382, 1), + /* 0110 */ PTR(384, 1), + /* 0111 */ V(12, 3, 4), + /* 1000 */ PTR(386, 1), + /* 1001 */ V(4, 11, 4), + /* 1010 */ V(13, 1, 3), + /* 1011 */ V(13, 1, 3), + /* 1100 */ V(0, 13, 4), + /* 1101 */ V(13, 0, 4), + /* 1110 */ V(8, 10, 4), + /* 1111 */ V(10, 8, 4), + + /* 0000 0011 ... */ + /* 0000 */ V(4, 12, 4), /* 116 */ + /* 0001 */ V(12, 4, 4), + /* 0010 */ V(6, 11, 4), + /* 0011 */ V(11, 6, 4), + /* 0100 */ V(3, 12, 3), + /* 0101 */ V(3, 12, 3), + /* 0110 */ V(2, 12, 3), + /* 0111 */ V(2, 12, 3), + /* 1000 */ V(12, 2, 3), + /* 1001 */ V(12, 2, 3), + /* 1010 */ V(5, 11, 3), + /* 1011 */ V(5, 11, 3), + /* 1100 */ V(11, 5, 4), + /* 1101 */ V(8, 9, 4), + /* 1110 */ V(1, 12, 3), + /* 1111 */ V(1, 12, 3), + + /* 0000 0100 ... */ + /* 0000 */ V(12, 1, 3), /* 132 */ + /* 0001 */ V(12, 1, 3), + /* 0010 */ V(9, 8, 4), + /* 0011 */ V(0, 12, 4), + /* 0100 */ V(12, 0, 3), + /* 0101 */ V(12, 0, 3), + /* 0110 */ V(11, 4, 4), + /* 0111 */ V(6, 10, 4), + /* 1000 */ V(10, 6, 4), + /* 1001 */ V(7, 9, 4), + /* 1010 */ V(3, 11, 3), + /* 1011 */ V(3, 11, 3), + /* 1100 */ V(11, 3, 3), + /* 1101 */ V(11, 3, 3), + /* 1110 */ V(8, 8, 4), + /* 1111 */ V(5, 10, 4), + + /* 0000 0101 ... */ + /* 0000 */ V(2, 11, 3), /* 148 */ + /* 0001 */ V(2, 11, 3), + /* 0010 */ V(10, 5, 4), + /* 0011 */ V(6, 9, 4), + /* 0100 */ V(10, 4, 3), + /* 0101 */ V(10, 4, 3), + /* 0110 */ V(7, 8, 4), + /* 0111 */ V(8, 7, 4), + /* 1000 */ V(9, 4, 3), + /* 1001 */ V(9, 4, 3), + /* 1010 */ V(7, 7, 4), + /* 1011 */ V(7, 6, 4), + /* 1100 */ V(11, 2, 2), + /* 1101 */ V(11, 2, 2), + /* 1110 */ V(11, 2, 2), + /* 1111 */ V(11, 2, 2), + + /* 0000 0110 ... */ + /* 000 */ V(1, 11, 2), /* 164 */ + /* 001 */ V(1, 11, 2), + /* 010 */ V(11, 1, 2), + /* 011 */ V(11, 1, 2), + /* 100 */ V(0, 11, 3), + /* 101 */ V(11, 0, 3), + /* 110 */ V(9, 6, 3), + /* 111 */ V(4, 10, 3), + + /* 0000 0111 ... */ + /* 000 */ V(3, 10, 3), /* 172 */ + /* 001 */ V(10, 3, 3), + /* 010 */ V(5, 9, 3), + /* 011 */ V(9, 5, 3), + /* 100 */ V(2, 10, 2), + /* 101 */ V(2, 10, 2), + /* 110 */ V(10, 2, 2), + /* 111 */ V(10, 2, 2), + + /* 0000 1000 ... */ + /* 000 */ V(1, 10, 2), /* 180 */ + /* 001 */ V(1, 10, 2), + /* 010 */ V(10, 1, 2), + /* 011 */ V(10, 1, 2), + /* 100 */ V(0, 10, 3), + /* 101 */ V(6, 8, 3), + /* 110 */ V(10, 0, 2), + /* 111 */ V(10, 0, 2), + + /* 0000 1001 ... */ + /* 000 */ V(8, 6, 3), /* 188 */ + /* 001 */ V(4, 9, 3), + /* 010 */ V(9, 3, 2), + /* 011 */ V(9, 3, 2), + /* 100 */ V(3, 9, 3), + /* 101 */ V(5, 8, 3), + /* 110 */ V(8, 5, 3), + /* 111 */ V(6, 7, 3), + + /* 0000 1010 ... */ + /* 000 */ V(2, 9, 2), /* 196 */ + /* 001 */ V(2, 9, 2), + /* 010 */ V(9, 2, 2), + /* 011 */ V(9, 2, 2), + /* 100 */ V(5, 7, 3), + /* 101 */ V(7, 5, 3), + /* 110 */ V(3, 8, 2), + /* 111 */ V(3, 8, 2), + + /* 0000 1011 ... */ + /* 000 */ V(8, 3, 2), /* 204 */ + /* 001 */ V(8, 3, 2), + /* 010 */ V(6, 6, 3), + /* 011 */ V(4, 7, 3), + /* 100 */ V(7, 4, 3), + /* 101 */ V(5, 6, 3), + /* 110 */ V(6, 5, 3), + /* 111 */ V(7, 3, 3), + + /* 0000 1100 ... */ + /* 0 */ V(1, 9, 1), /* 212 */ + /* 1 */ V(9, 1, 1), + + /* 0000 1101 ... */ + /* 00 */ V(0, 9, 2), /* 214 */ + /* 01 */ V(9, 0, 2), + /* 10 */ V(4, 8, 2), + /* 11 */ V(8, 4, 2), + + /* 0000 1110 ... */ + /* 000 */ V(7, 2, 2), /* 218 */ + /* 001 */ V(7, 2, 2), + /* 010 */ V(4, 6, 3), + /* 011 */ V(6, 4, 3), + /* 100 */ V(2, 8, 1), + /* 101 */ V(2, 8, 1), + /* 110 */ V(2, 8, 1), + /* 111 */ V(2, 8, 1), + + /* 0000 1111 ... */ + /* 0 */ V(8, 2, 1), /* 226 */ + /* 1 */ V(1, 8, 1), + + /* 0001 0000 ... */ + /* 00 */ V(3, 7, 2), /* 228 */ + /* 01 */ V(2, 7, 2), + /* 10 */ V(1, 7, 1), + /* 11 */ V(1, 7, 1), + + /* 0001 0001 ... */ + /* 00 */ V(7, 1, 1), /* 232 */ + /* 01 */ V(7, 1, 1), + /* 10 */ V(5, 5, 2), + /* 11 */ V(0, 7, 2), + + /* 0001 0010 ... */ + /* 00 */ V(7, 0, 2), /* 236 */ + /* 01 */ V(3, 6, 2), + /* 10 */ V(6, 3, 2), + /* 11 */ V(4, 5, 2), + + /* 0001 0011 ... */ + /* 00 */ V(5, 4, 2), /* 240 */ + /* 01 */ V(2, 6, 2), + /* 10 */ V(6, 2, 2), + /* 11 */ V(3, 5, 2), + + /* 0001 0101 ... */ + /* 0 */ V(0, 8, 1), /* 244 */ + /* 1 */ V(8, 0, 1), + + /* 0001 0110 ... */ + /* 0 */ V(1, 6, 1), /* 246 */ + /* 1 */ V(6, 1, 1), + + /* 0001 0111 ... */ + /* 0 */ V(0, 6, 1), /* 248 */ + /* 1 */ V(6, 0, 1), + + /* 0001 1000 ... */ + /* 00 */ V(5, 3, 2), /* 250 */ + /* 01 */ V(4, 4, 2), + /* 10 */ V(2, 5, 1), + /* 11 */ V(2, 5, 1), + + /* 0001 1001 ... */ + /* 0 */ V(5, 2, 1), /* 254 */ + /* 1 */ V(0, 5, 1), + + /* 0001 1100 ... */ + /* 0 */ V(3, 4, 1), /* 256 */ + /* 1 */ V(4, 3, 1), + + /* 0001 1101 ... */ + /* 0 */ V(5, 0, 1), /* 258 */ + /* 1 */ V(2, 4, 1), + + /* 0001 1110 ... */ + /* 0 */ V(4, 2, 1), /* 260 */ + /* 1 */ V(3, 3, 1), + + /* 0000 0000 0000 ... */ + /* 0000 */ PTR(388, 3), /* 262 */ + /* 0001 */ V(15, 15, 4), + /* 0010 */ V(14, 15, 4), + /* 0011 */ V(13, 15, 4), + /* 0100 */ V(14, 14, 4), + /* 0101 */ V(12, 15, 4), + /* 0110 */ V(13, 14, 4), + /* 0111 */ V(11, 15, 4), + /* 1000 */ V(15, 11, 4), + /* 1001 */ V(12, 14, 4), + /* 1010 */ V(13, 12, 4), + /* 1011 */ PTR(396, 1), + /* 1100 */ V(14, 12, 3), + /* 1101 */ V(14, 12, 3), + /* 1110 */ V(13, 13, 3), + /* 1111 */ V(13, 13, 3), + + /* 0000 0000 0001 ... */ + /* 0000 */ V(15, 10, 4), /* 278 */ + /* 0001 */ V(12, 13, 4), + /* 0010 */ V(11, 14, 3), + /* 0011 */ V(11, 14, 3), + /* 0100 */ V(14, 11, 3), + /* 0101 */ V(14, 11, 3), + /* 0110 */ V(9, 15, 3), + /* 0111 */ V(9, 15, 3), + /* 1000 */ V(15, 9, 3), + /* 1001 */ V(15, 9, 3), + /* 1010 */ V(14, 10, 3), + /* 1011 */ V(14, 10, 3), + /* 1100 */ V(11, 13, 3), + /* 1101 */ V(11, 13, 3), + /* 1110 */ V(13, 11, 3), + /* 1111 */ V(13, 11, 3), + + /* 0000 0000 0010 ... */ + /* 0000 */ V(8, 15, 3), /* 294 */ + /* 0001 */ V(8, 15, 3), + /* 0010 */ V(15, 8, 3), + /* 0011 */ V(15, 8, 3), + /* 0100 */ V(12, 12, 3), + /* 0101 */ V(12, 12, 3), + /* 0110 */ V(10, 14, 4), + /* 0111 */ V(9, 14, 4), + /* 1000 */ V(8, 14, 3), + /* 1001 */ V(8, 14, 3), + /* 1010 */ V(7, 15, 4), + /* 1011 */ V(7, 14, 4), + /* 1100 */ V(15, 7, 2), + /* 1101 */ V(15, 7, 2), + /* 1110 */ V(15, 7, 2), + /* 1111 */ V(15, 7, 2), + + /* 0000 0000 0011 ... */ + /* 000 */ V(13, 10, 2), /* 310 */ + /* 001 */ V(13, 10, 2), + /* 010 */ V(10, 13, 3), + /* 011 */ V(11, 12, 3), + /* 100 */ V(12, 11, 3), + /* 101 */ V(15, 6, 3), + /* 110 */ V(6, 15, 2), + /* 111 */ V(6, 15, 2), + + /* 0000 0000 0100 ... */ + /* 00 */ V(14, 8, 2), /* 318 */ + /* 01 */ V(5, 15, 2), + /* 10 */ V(9, 13, 2), + /* 11 */ V(13, 9, 2), + + /* 0000 0000 0101 ... */ + /* 00 */ V(15, 5, 2), /* 322 */ + /* 01 */ V(14, 7, 2), + /* 10 */ V(10, 12, 2), + /* 11 */ V(11, 11, 2), + + /* 0000 0000 0110 ... */ + /* 000 */ V(4, 15, 2), /* 326 */ + /* 001 */ V(4, 15, 2), + /* 010 */ V(15, 4, 2), + /* 011 */ V(15, 4, 2), + /* 100 */ V(12, 10, 3), + /* 101 */ V(14, 6, 3), + /* 110 */ V(15, 3, 2), + /* 111 */ V(15, 3, 2), + + /* 0000 0000 0111 ... */ + /* 00 */ V(3, 15, 1), /* 334 */ + /* 01 */ V(3, 15, 1), + /* 10 */ V(8, 13, 2), + /* 11 */ V(13, 8, 2), + + /* 0000 0000 1000 ... */ + /* 0 */ V(2, 15, 1), /* 338 */ + /* 1 */ V(15, 2, 1), + + /* 0000 0000 1001 ... */ + /* 00 */ V(6, 14, 2), /* 340 */ + /* 01 */ V(9, 12, 2), + /* 10 */ V(0, 15, 1), + /* 11 */ V(0, 15, 1), + + /* 0000 0000 1010 ... */ + /* 00 */ V(12, 9, 2), /* 344 */ + /* 01 */ V(5, 14, 2), + /* 10 */ V(10, 11, 1), + /* 11 */ V(10, 11, 1), + + /* 0000 0000 1011 ... */ + /* 00 */ V(7, 13, 2), /* 348 */ + /* 01 */ V(13, 7, 2), + /* 10 */ V(4, 14, 1), + /* 11 */ V(4, 14, 1), + + /* 0000 0000 1100 ... */ + /* 00 */ V(12, 8, 2), /* 352 */ + /* 01 */ V(13, 6, 2), + /* 10 */ V(3, 14, 1), + /* 11 */ V(3, 14, 1), + + /* 0000 0000 1101 ... */ + /* 00 */ V(11, 9, 1), /* 356 */ + /* 01 */ V(11, 9, 1), + /* 10 */ V(9, 11, 2), + /* 11 */ V(10, 10, 2), + + /* 0000 0001 0001 ... */ + /* 0 */ V(11, 10, 1), /* 360 */ + /* 1 */ V(14, 5, 1), + + /* 0000 0001 0010 ... */ + /* 0 */ V(14, 4, 1), /* 362 */ + /* 1 */ V(8, 12, 1), + + /* 0000 0001 0011 ... */ + /* 0 */ V(6, 13, 1), /* 364 */ + /* 1 */ V(14, 3, 1), + + /* 0000 0001 0101 ... */ + /* 0 */ V(2, 14, 1), /* 366 */ + /* 1 */ V(0, 14, 1), + + /* 0000 0001 1000 ... */ + /* 0 */ V(14, 0, 1), /* 368 */ + /* 1 */ V(5, 13, 1), + + /* 0000 0001 1001 ... */ + /* 0 */ V(13, 5, 1), /* 370 */ + /* 1 */ V(7, 12, 1), + + /* 0000 0001 1010 ... */ + /* 0 */ V(12, 7, 1), /* 372 */ + /* 1 */ V(4, 13, 1), + + /* 0000 0001 1011 ... */ + /* 0 */ V(8, 11, 1), /* 374 */ + /* 1 */ V(11, 8, 1), + + /* 0000 0001 1100 ... */ + /* 0 */ V(13, 4, 1), /* 376 */ + /* 1 */ V(9, 10, 1), + + /* 0000 0001 1101 ... */ + /* 0 */ V(10, 9, 1), /* 378 */ + /* 1 */ V(6, 12, 1), + + /* 0000 0010 0000 ... */ + /* 0 */ V(13, 3, 1), /* 380 */ + /* 1 */ V(7, 11, 1), + + /* 0000 0010 0101 ... */ + /* 0 */ V(5, 12, 1), /* 382 */ + /* 1 */ V(12, 5, 1), + + /* 0000 0010 0110 ... */ + /* 0 */ V(9, 9, 1), /* 384 */ + /* 1 */ V(7, 10, 1), + + /* 0000 0010 1000 ... */ + /* 0 */ V(10, 7, 1), /* 386 */ + /* 1 */ V(9, 7, 1), + + /* 0000 0000 0000 0000 ... */ + /* 000 */ V(15, 14, 3), /* 388 */ + /* 001 */ V(15, 12, 3), + /* 010 */ V(15, 13, 2), + /* 011 */ V(15, 13, 2), + /* 100 */ V(14, 13, 1), + /* 101 */ V(14, 13, 1), + /* 110 */ V(14, 13, 1), + /* 111 */ V(14, 13, 1), + + /* 0000 0000 0000 1011 ... */ + /* 0 */ V(10, 15, 1), /* 396 */ + /* 1 */ V(14, 9, 1) +}; + +static +union huffpair const hufftab15[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 4), + /* 0100 */ PTR(80, 4), + /* 0101 */ PTR(96, 3), + /* 0110 */ PTR(104, 3), + /* 0111 */ PTR(112, 2), + /* 1000 */ PTR(116, 1), + /* 1001 */ PTR(118, 1), + /* 1010 */ V(1, 1, 3), + /* 1011 */ V(1, 1, 3), + /* 1100 */ V(0, 1, 4), + /* 1101 */ V(1, 0, 4), + /* 1110 */ V(0, 0, 3), + /* 1111 */ V(0, 0, 3), + + /* 0000 ... */ + /* 0000 */ PTR(120, 4), /* 16 */ + /* 0001 */ PTR(136, 4), + /* 0010 */ PTR(152, 4), + /* 0011 */ PTR(168, 4), + /* 0100 */ PTR(184, 4), + /* 0101 */ PTR(200, 3), + /* 0110 */ PTR(208, 3), + /* 0111 */ PTR(216, 4), + /* 1000 */ PTR(232, 3), + /* 1001 */ PTR(240, 3), + /* 1010 */ PTR(248, 3), + /* 1011 */ PTR(256, 3), + /* 1100 */ PTR(264, 2), + /* 1101 */ PTR(268, 3), + /* 1110 */ PTR(276, 3), + /* 1111 */ PTR(284, 2), + + /* 0001 ... */ + /* 0000 */ PTR(288, 2), /* 32 */ + /* 0001 */ PTR(292, 2), + /* 0010 */ PTR(296, 2), + /* 0011 */ PTR(300, 2), + /* 0100 */ PTR(304, 2), + /* 0101 */ PTR(308, 2), + /* 0110 */ PTR(312, 2), + /* 0111 */ PTR(316, 2), + /* 1000 */ PTR(320, 1), + /* 1001 */ PTR(322, 1), + /* 1010 */ PTR(324, 1), + /* 1011 */ PTR(326, 2), + /* 1100 */ PTR(330, 1), + /* 1101 */ PTR(332, 1), + /* 1110 */ PTR(334, 2), + /* 1111 */ PTR(338, 1), + + /* 0010 ... */ + /* 0000 */ PTR(340, 1), /* 48 */ + /* 0001 */ PTR(342, 1), + /* 0010 */ V(9, 1, 4), + /* 0011 */ PTR(344, 1), + /* 0100 */ PTR(346, 1), + /* 0101 */ PTR(348, 1), + /* 0110 */ PTR(350, 1), + /* 0111 */ PTR(352, 1), + /* 1000 */ V(2, 8, 4), + /* 1001 */ V(8, 2, 4), + /* 1010 */ V(1, 8, 4), + /* 1011 */ V(8, 1, 4), + /* 1100 */ PTR(354, 1), + /* 1101 */ PTR(356, 1), + /* 1110 */ PTR(358, 1), + /* 1111 */ PTR(360, 1), + + /* 0011 ... */ + /* 0000 */ V(2, 7, 4), /* 64 */ + /* 0001 */ V(7, 2, 4), + /* 0010 */ V(6, 4, 4), + /* 0011 */ V(1, 7, 4), + /* 0100 */ V(5, 5, 4), + /* 0101 */ V(7, 1, 4), + /* 0110 */ PTR(362, 1), + /* 0111 */ V(3, 6, 4), + /* 1000 */ V(6, 3, 4), + /* 1001 */ V(4, 5, 4), + /* 1010 */ V(5, 4, 4), + /* 1011 */ V(2, 6, 4), + /* 1100 */ V(6, 2, 4), + /* 1101 */ V(1, 6, 4), + /* 1110 */ PTR(364, 1), + /* 1111 */ V(3, 5, 4), + + /* 0100 ... */ + /* 0000 */ V(6, 1, 3), /* 80 */ + /* 0001 */ V(6, 1, 3), + /* 0010 */ V(5, 3, 4), + /* 0011 */ V(4, 4, 4), + /* 0100 */ V(2, 5, 3), + /* 0101 */ V(2, 5, 3), + /* 0110 */ V(5, 2, 3), + /* 0111 */ V(5, 2, 3), + /* 1000 */ V(1, 5, 3), + /* 1001 */ V(1, 5, 3), + /* 1010 */ V(5, 1, 3), + /* 1011 */ V(5, 1, 3), + /* 1100 */ V(0, 5, 4), + /* 1101 */ V(5, 0, 4), + /* 1110 */ V(3, 4, 3), + /* 1111 */ V(3, 4, 3), + + /* 0101 ... */ + /* 000 */ V(4, 3, 3), /* 96 */ + /* 001 */ V(2, 4, 3), + /* 010 */ V(4, 2, 3), + /* 011 */ V(3, 3, 3), + /* 100 */ V(4, 1, 2), + /* 101 */ V(4, 1, 2), + /* 110 */ V(1, 4, 3), + /* 111 */ V(0, 4, 3), + + /* 0110 ... */ + /* 000 */ V(2, 3, 2), /* 104 */ + /* 001 */ V(2, 3, 2), + /* 010 */ V(3, 2, 2), + /* 011 */ V(3, 2, 2), + /* 100 */ V(4, 0, 3), + /* 101 */ V(0, 3, 3), + /* 110 */ V(1, 3, 2), + /* 111 */ V(1, 3, 2), + + /* 0111 ... */ + /* 00 */ V(3, 1, 2), /* 112 */ + /* 01 */ V(3, 0, 2), + /* 10 */ V(2, 2, 1), + /* 11 */ V(2, 2, 1), + + /* 1000 ... */ + /* 0 */ V(1, 2, 1), /* 116 */ + /* 1 */ V(2, 1, 1), + + /* 1001 ... */ + /* 0 */ V(0, 2, 1), /* 118 */ + /* 1 */ V(2, 0, 1), + + /* 0000 0000 ... */ + /* 0000 */ PTR(366, 1), /* 120 */ + /* 0001 */ PTR(368, 1), + /* 0010 */ V(14, 14, 4), + /* 0011 */ PTR(370, 1), + /* 0100 */ PTR(372, 1), + /* 0101 */ PTR(374, 1), + /* 0110 */ V(15, 11, 4), + /* 0111 */ PTR(376, 1), + /* 1000 */ V(13, 13, 4), + /* 1001 */ V(10, 15, 4), + /* 1010 */ V(15, 10, 4), + /* 1011 */ V(11, 14, 4), + /* 1100 */ V(14, 11, 4), + /* 1101 */ V(12, 13, 4), + /* 1110 */ V(13, 12, 4), + /* 1111 */ V(9, 15, 4), + + /* 0000 0001 ... */ + /* 0000 */ V(15, 9, 4), /* 136 */ + /* 0001 */ V(14, 10, 4), + /* 0010 */ V(11, 13, 4), + /* 0011 */ V(13, 11, 4), + /* 0100 */ V(8, 15, 4), + /* 0101 */ V(15, 8, 4), + /* 0110 */ V(12, 12, 4), + /* 0111 */ V(9, 14, 4), + /* 1000 */ V(14, 9, 4), + /* 1001 */ V(7, 15, 4), + /* 1010 */ V(15, 7, 4), + /* 1011 */ V(10, 13, 4), + /* 1100 */ V(13, 10, 4), + /* 1101 */ V(11, 12, 4), + /* 1110 */ V(6, 15, 4), + /* 1111 */ PTR(378, 1), + + /* 0000 0010 ... */ + /* 0000 */ V(12, 11, 3), /* 152 */ + /* 0001 */ V(12, 11, 3), + /* 0010 */ V(15, 6, 3), + /* 0011 */ V(15, 6, 3), + /* 0100 */ V(8, 14, 4), + /* 0101 */ V(14, 8, 4), + /* 0110 */ V(5, 15, 4), + /* 0111 */ V(9, 13, 4), + /* 1000 */ V(15, 5, 3), + /* 1001 */ V(15, 5, 3), + /* 1010 */ V(7, 14, 3), + /* 1011 */ V(7, 14, 3), + /* 1100 */ V(14, 7, 3), + /* 1101 */ V(14, 7, 3), + /* 1110 */ V(10, 12, 3), + /* 1111 */ V(10, 12, 3), + + /* 0000 0011 ... */ + /* 0000 */ V(12, 10, 3), /* 168 */ + /* 0001 */ V(12, 10, 3), + /* 0010 */ V(11, 11, 3), + /* 0011 */ V(11, 11, 3), + /* 0100 */ V(13, 9, 4), + /* 0101 */ V(8, 13, 4), + /* 0110 */ V(4, 15, 3), + /* 0111 */ V(4, 15, 3), + /* 1000 */ V(15, 4, 3), + /* 1001 */ V(15, 4, 3), + /* 1010 */ V(3, 15, 3), + /* 1011 */ V(3, 15, 3), + /* 1100 */ V(15, 3, 3), + /* 1101 */ V(15, 3, 3), + /* 1110 */ V(13, 8, 3), + /* 1111 */ V(13, 8, 3), + + /* 0000 0100 ... */ + /* 0000 */ V(14, 6, 3), /* 184 */ + /* 0001 */ V(14, 6, 3), + /* 0010 */ V(2, 15, 3), + /* 0011 */ V(2, 15, 3), + /* 0100 */ V(15, 2, 3), + /* 0101 */ V(15, 2, 3), + /* 0110 */ V(6, 14, 4), + /* 0111 */ V(15, 0, 4), + /* 1000 */ V(1, 15, 3), + /* 1001 */ V(1, 15, 3), + /* 1010 */ V(15, 1, 3), + /* 1011 */ V(15, 1, 3), + /* 1100 */ V(9, 12, 3), + /* 1101 */ V(9, 12, 3), + /* 1110 */ V(12, 9, 3), + /* 1111 */ V(12, 9, 3), + + /* 0000 0101 ... */ + /* 000 */ V(5, 14, 3), /* 200 */ + /* 001 */ V(10, 11, 3), + /* 010 */ V(11, 10, 3), + /* 011 */ V(14, 5, 3), + /* 100 */ V(7, 13, 3), + /* 101 */ V(13, 7, 3), + /* 110 */ V(4, 14, 3), + /* 111 */ V(14, 4, 3), + + /* 0000 0110 ... */ + /* 000 */ V(8, 12, 3), /* 208 */ + /* 001 */ V(12, 8, 3), + /* 010 */ V(3, 14, 3), + /* 011 */ V(6, 13, 3), + /* 100 */ V(13, 6, 3), + /* 101 */ V(14, 3, 3), + /* 110 */ V(9, 11, 3), + /* 111 */ V(11, 9, 3), + + /* 0000 0111 ... */ + /* 0000 */ V(2, 14, 3), /* 216 */ + /* 0001 */ V(2, 14, 3), + /* 0010 */ V(10, 10, 3), + /* 0011 */ V(10, 10, 3), + /* 0100 */ V(14, 2, 3), + /* 0101 */ V(14, 2, 3), + /* 0110 */ V(1, 14, 3), + /* 0111 */ V(1, 14, 3), + /* 1000 */ V(14, 1, 3), + /* 1001 */ V(14, 1, 3), + /* 1010 */ V(0, 14, 4), + /* 1011 */ V(14, 0, 4), + /* 1100 */ V(5, 13, 3), + /* 1101 */ V(5, 13, 3), + /* 1110 */ V(13, 5, 3), + /* 1111 */ V(13, 5, 3), + + /* 0000 1000 ... */ + /* 000 */ V(7, 12, 3), /* 232 */ + /* 001 */ V(12, 7, 3), + /* 010 */ V(4, 13, 3), + /* 011 */ V(8, 11, 3), + /* 100 */ V(13, 4, 2), + /* 101 */ V(13, 4, 2), + /* 110 */ V(11, 8, 3), + /* 111 */ V(9, 10, 3), + + /* 0000 1001 ... */ + /* 000 */ V(10, 9, 3), /* 240 */ + /* 001 */ V(6, 12, 3), + /* 010 */ V(12, 6, 3), + /* 011 */ V(3, 13, 3), + /* 100 */ V(13, 3, 2), + /* 101 */ V(13, 3, 2), + /* 110 */ V(13, 2, 2), + /* 111 */ V(13, 2, 2), + + /* 0000 1010 ... */ + /* 000 */ V(2, 13, 3), /* 248 */ + /* 001 */ V(0, 13, 3), + /* 010 */ V(1, 13, 2), + /* 011 */ V(1, 13, 2), + /* 100 */ V(7, 11, 2), + /* 101 */ V(7, 11, 2), + /* 110 */ V(11, 7, 2), + /* 111 */ V(11, 7, 2), + + /* 0000 1011 ... */ + /* 000 */ V(13, 1, 2), /* 256 */ + /* 001 */ V(13, 1, 2), + /* 010 */ V(5, 12, 3), + /* 011 */ V(13, 0, 3), + /* 100 */ V(12, 5, 2), + /* 101 */ V(12, 5, 2), + /* 110 */ V(8, 10, 2), + /* 111 */ V(8, 10, 2), + + /* 0000 1100 ... */ + /* 00 */ V(10, 8, 2), /* 264 */ + /* 01 */ V(4, 12, 2), + /* 10 */ V(12, 4, 2), + /* 11 */ V(6, 11, 2), + + /* 0000 1101 ... */ + /* 000 */ V(11, 6, 2), /* 268 */ + /* 001 */ V(11, 6, 2), + /* 010 */ V(9, 9, 3), + /* 011 */ V(0, 12, 3), + /* 100 */ V(3, 12, 2), + /* 101 */ V(3, 12, 2), + /* 110 */ V(12, 3, 2), + /* 111 */ V(12, 3, 2), + + /* 0000 1110 ... */ + /* 000 */ V(7, 10, 2), /* 276 */ + /* 001 */ V(7, 10, 2), + /* 010 */ V(10, 7, 2), + /* 011 */ V(10, 7, 2), + /* 100 */ V(10, 6, 2), + /* 101 */ V(10, 6, 2), + /* 110 */ V(12, 0, 3), + /* 111 */ V(0, 11, 3), + + /* 0000 1111 ... */ + /* 00 */ V(12, 2, 1), /* 284 */ + /* 01 */ V(12, 2, 1), + /* 10 */ V(2, 12, 2), + /* 11 */ V(5, 11, 2), + + /* 0001 0000 ... */ + /* 00 */ V(11, 5, 2), /* 288 */ + /* 01 */ V(1, 12, 2), + /* 10 */ V(8, 9, 2), + /* 11 */ V(9, 8, 2), + + /* 0001 0001 ... */ + /* 00 */ V(12, 1, 2), /* 292 */ + /* 01 */ V(4, 11, 2), + /* 10 */ V(11, 4, 2), + /* 11 */ V(6, 10, 2), + + /* 0001 0010 ... */ + /* 00 */ V(3, 11, 2), /* 296 */ + /* 01 */ V(7, 9, 2), + /* 10 */ V(11, 3, 1), + /* 11 */ V(11, 3, 1), + + /* 0001 0011 ... */ + /* 00 */ V(9, 7, 2), /* 300 */ + /* 01 */ V(8, 8, 2), + /* 10 */ V(2, 11, 2), + /* 11 */ V(5, 10, 2), + + /* 0001 0100 ... */ + /* 00 */ V(11, 2, 1), /* 304 */ + /* 01 */ V(11, 2, 1), + /* 10 */ V(10, 5, 2), + /* 11 */ V(1, 11, 2), + + /* 0001 0101 ... */ + /* 00 */ V(11, 1, 1), /* 308 */ + /* 01 */ V(11, 1, 1), + /* 10 */ V(11, 0, 2), + /* 11 */ V(6, 9, 2), + + /* 0001 0110 ... */ + /* 00 */ V(9, 6, 2), /* 312 */ + /* 01 */ V(4, 10, 2), + /* 10 */ V(10, 4, 2), + /* 11 */ V(7, 8, 2), + + /* 0001 0111 ... */ + /* 00 */ V(8, 7, 2), /* 316 */ + /* 01 */ V(3, 10, 2), + /* 10 */ V(10, 3, 1), + /* 11 */ V(10, 3, 1), + + /* 0001 1000 ... */ + /* 0 */ V(5, 9, 1), /* 320 */ + /* 1 */ V(9, 5, 1), + + /* 0001 1001 ... */ + /* 0 */ V(2, 10, 1), /* 322 */ + /* 1 */ V(10, 2, 1), + + /* 0001 1010 ... */ + /* 0 */ V(1, 10, 1), /* 324 */ + /* 1 */ V(10, 1, 1), + + /* 0001 1011 ... */ + /* 00 */ V(0, 10, 2), /* 326 */ + /* 01 */ V(10, 0, 2), + /* 10 */ V(6, 8, 1), + /* 11 */ V(6, 8, 1), + + /* 0001 1100 ... */ + /* 0 */ V(8, 6, 1), /* 330 */ + /* 1 */ V(4, 9, 1), + + /* 0001 1101 ... */ + /* 0 */ V(9, 4, 1), /* 332 */ + /* 1 */ V(3, 9, 1), + + /* 0001 1110 ... */ + /* 00 */ V(9, 3, 1), /* 334 */ + /* 01 */ V(9, 3, 1), + /* 10 */ V(7, 7, 2), + /* 11 */ V(0, 9, 2), + + /* 0001 1111 ... */ + /* 0 */ V(5, 8, 1), /* 338 */ + /* 1 */ V(8, 5, 1), + + /* 0010 0000 ... */ + /* 0 */ V(2, 9, 1), /* 340 */ + /* 1 */ V(6, 7, 1), + + /* 0010 0001 ... */ + /* 0 */ V(7, 6, 1), /* 342 */ + /* 1 */ V(9, 2, 1), + + /* 0010 0011 ... */ + /* 0 */ V(1, 9, 1), /* 344 */ + /* 1 */ V(9, 0, 1), + + /* 0010 0100 ... */ + /* 0 */ V(4, 8, 1), /* 346 */ + /* 1 */ V(8, 4, 1), + + /* 0010 0101 ... */ + /* 0 */ V(5, 7, 1), /* 348 */ + /* 1 */ V(7, 5, 1), + + /* 0010 0110 ... */ + /* 0 */ V(3, 8, 1), /* 350 */ + /* 1 */ V(8, 3, 1), + + /* 0010 0111 ... */ + /* 0 */ V(6, 6, 1), /* 352 */ + /* 1 */ V(4, 7, 1), + + /* 0010 1100 ... */ + /* 0 */ V(7, 4, 1), /* 354 */ + /* 1 */ V(0, 8, 1), + + /* 0010 1101 ... */ + /* 0 */ V(8, 0, 1), /* 356 */ + /* 1 */ V(5, 6, 1), + + /* 0010 1110 ... */ + /* 0 */ V(6, 5, 1), /* 358 */ + /* 1 */ V(3, 7, 1), + + /* 0010 1111 ... */ + /* 0 */ V(7, 3, 1), /* 360 */ + /* 1 */ V(4, 6, 1), + + /* 0011 0110 ... */ + /* 0 */ V(0, 7, 1), /* 362 */ + /* 1 */ V(7, 0, 1), + + /* 0011 1110 ... */ + /* 0 */ V(0, 6, 1), /* 364 */ + /* 1 */ V(6, 0, 1), + + /* 0000 0000 0000 ... */ + /* 0 */ V(15, 15, 1), /* 366 */ + /* 1 */ V(14, 15, 1), + + /* 0000 0000 0001 ... */ + /* 0 */ V(15, 14, 1), /* 368 */ + /* 1 */ V(13, 15, 1), + + /* 0000 0000 0011 ... */ + /* 0 */ V(15, 13, 1), /* 370 */ + /* 1 */ V(12, 15, 1), + + /* 0000 0000 0100 ... */ + /* 0 */ V(15, 12, 1), /* 372 */ + /* 1 */ V(13, 14, 1), + + /* 0000 0000 0101 ... */ + /* 0 */ V(14, 13, 1), /* 374 */ + /* 1 */ V(11, 15, 1), + + /* 0000 0000 0111 ... */ + /* 0 */ V(12, 14, 1), /* 376 */ + /* 1 */ V(14, 12, 1), + + /* 0000 0001 1111 ... */ + /* 0 */ V(10, 14, 1), /* 378 */ + /* 1 */ V(0, 15, 1) +}; + +static +union huffpair const hufftab16[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ PTR(64, 2), + /* 0100 */ V(1, 1, 4), + /* 0101 */ V(0, 1, 4), + /* 0110 */ V(1, 0, 3), + /* 0111 */ V(1, 0, 3), + /* 1000 */ V(0, 0, 1), + /* 1001 */ V(0, 0, 1), + /* 1010 */ V(0, 0, 1), + /* 1011 */ V(0, 0, 1), + /* 1100 */ V(0, 0, 1), + /* 1101 */ V(0, 0, 1), + /* 1110 */ V(0, 0, 1), + /* 1111 */ V(0, 0, 1), + + /* 0000 ... */ + /* 0000 */ PTR(68, 3), /* 16 */ + /* 0001 */ PTR(76, 3), + /* 0010 */ PTR(84, 2), + /* 0011 */ V(15, 15, 4), + /* 0100 */ PTR(88, 2), + /* 0101 */ PTR(92, 1), + /* 0110 */ PTR(94, 4), + /* 0111 */ V(15, 2, 4), + /* 1000 */ PTR(110, 1), + /* 1001 */ V(1, 15, 4), + /* 1010 */ V(15, 1, 4), + /* 1011 */ PTR(112, 4), + /* 1100 */ PTR(128, 4), + /* 1101 */ PTR(144, 4), + /* 1110 */ PTR(160, 4), + /* 1111 */ PTR(176, 4), + + /* 0001 ... */ + /* 0000 */ PTR(192, 4), /* 32 */ + /* 0001 */ PTR(208, 3), + /* 0010 */ PTR(216, 3), + /* 0011 */ PTR(224, 3), + /* 0100 */ PTR(232, 3), + /* 0101 */ PTR(240, 3), + /* 0110 */ PTR(248, 3), + /* 0111 */ PTR(256, 3), + /* 1000 */ PTR(264, 2), + /* 1001 */ PTR(268, 2), + /* 1010 */ PTR(272, 1), + /* 1011 */ PTR(274, 2), + /* 1100 */ PTR(278, 2), + /* 1101 */ PTR(282, 1), + /* 1110 */ V(5, 1, 4), + /* 1111 */ PTR(284, 1), + + /* 0010 ... */ + /* 0000 */ PTR(286, 1), /* 48 */ + /* 0001 */ PTR(288, 1), + /* 0010 */ PTR(290, 1), + /* 0011 */ V(1, 4, 4), + /* 0100 */ V(4, 1, 4), + /* 0101 */ PTR(292, 1), + /* 0110 */ V(2, 3, 4), + /* 0111 */ V(3, 2, 4), + /* 1000 */ V(1, 3, 3), + /* 1001 */ V(1, 3, 3), + /* 1010 */ V(3, 1, 3), + /* 1011 */ V(3, 1, 3), + /* 1100 */ V(0, 3, 4), + /* 1101 */ V(3, 0, 4), + /* 1110 */ V(2, 2, 3), + /* 1111 */ V(2, 2, 3), + + /* 0011 ... */ + /* 00 */ V(1, 2, 2), /* 64 */ + /* 01 */ V(2, 1, 2), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0000 0000 ... */ + /* 000 */ V(14, 15, 3), /* 68 */ + /* 001 */ V(15, 14, 3), + /* 010 */ V(13, 15, 3), + /* 011 */ V(15, 13, 3), + /* 100 */ V(12, 15, 3), + /* 101 */ V(15, 12, 3), + /* 110 */ V(11, 15, 3), + /* 111 */ V(15, 11, 3), + + /* 0000 0001 ... */ + /* 000 */ V(10, 15, 2), /* 76 */ + /* 001 */ V(10, 15, 2), + /* 010 */ V(15, 10, 3), + /* 011 */ V(9, 15, 3), + /* 100 */ V(15, 9, 3), + /* 101 */ V(15, 8, 3), + /* 110 */ V(8, 15, 2), + /* 111 */ V(8, 15, 2), + + /* 0000 0010 ... */ + /* 00 */ V(7, 15, 2), /* 84 */ + /* 01 */ V(15, 7, 2), + /* 10 */ V(6, 15, 2), + /* 11 */ V(15, 6, 2), + + /* 0000 0100 ... */ + /* 00 */ V(5, 15, 2), /* 88 */ + /* 01 */ V(15, 5, 2), + /* 10 */ V(4, 15, 1), + /* 11 */ V(4, 15, 1), + + /* 0000 0101 ... */ + /* 0 */ V(15, 4, 1), /* 92 */ + /* 1 */ V(15, 3, 1), + + /* 0000 0110 ... */ + /* 0000 */ V(15, 0, 1), /* 94 */ + /* 0001 */ V(15, 0, 1), + /* 0010 */ V(15, 0, 1), + /* 0011 */ V(15, 0, 1), + /* 0100 */ V(15, 0, 1), + /* 0101 */ V(15, 0, 1), + /* 0110 */ V(15, 0, 1), + /* 0111 */ V(15, 0, 1), + /* 1000 */ V(3, 15, 2), + /* 1001 */ V(3, 15, 2), + /* 1010 */ V(3, 15, 2), + /* 1011 */ V(3, 15, 2), + /* 1100 */ PTR(294, 4), + /* 1101 */ PTR(310, 3), + /* 1110 */ PTR(318, 3), + /* 1111 */ PTR(326, 3), + + /* 0000 1000 ... */ + /* 0 */ V(2, 15, 1), /* 110 */ + /* 1 */ V(0, 15, 1), + + /* 0000 1011 ... */ + /* 0000 */ PTR(334, 2), /* 112 */ + /* 0001 */ PTR(338, 2), + /* 0010 */ PTR(342, 2), + /* 0011 */ PTR(346, 1), + /* 0100 */ PTR(348, 2), + /* 0101 */ PTR(352, 2), + /* 0110 */ PTR(356, 1), + /* 0111 */ PTR(358, 2), + /* 1000 */ PTR(362, 2), + /* 1001 */ PTR(366, 2), + /* 1010 */ PTR(370, 2), + /* 1011 */ V(14, 3, 4), + /* 1100 */ PTR(374, 1), + /* 1101 */ PTR(376, 1), + /* 1110 */ PTR(378, 1), + /* 1111 */ PTR(380, 1), + + /* 0000 1100 ... */ + /* 0000 */ PTR(382, 1), /* 128 */ + /* 0001 */ PTR(384, 1), + /* 0010 */ PTR(386, 1), + /* 0011 */ V(0, 13, 4), + /* 0100 */ PTR(388, 1), + /* 0101 */ PTR(390, 1), + /* 0110 */ PTR(392, 1), + /* 0111 */ V(3, 12, 4), + /* 1000 */ PTR(394, 1), + /* 1001 */ V(1, 12, 4), + /* 1010 */ V(12, 0, 4), + /* 1011 */ PTR(396, 1), + /* 1100 */ V(14, 2, 3), + /* 1101 */ V(14, 2, 3), + /* 1110 */ V(2, 14, 4), + /* 1111 */ V(1, 14, 4), + + /* 0000 1101 ... */ + /* 0000 */ V(13, 3, 4), /* 144 */ + /* 0001 */ V(2, 13, 4), + /* 0010 */ V(13, 2, 4), + /* 0011 */ V(13, 1, 4), + /* 0100 */ V(3, 11, 4), + /* 0101 */ PTR(398, 1), + /* 0110 */ V(1, 13, 3), + /* 0111 */ V(1, 13, 3), + /* 1000 */ V(12, 4, 4), + /* 1001 */ V(6, 11, 4), + /* 1010 */ V(12, 3, 4), + /* 1011 */ V(10, 7, 4), + /* 1100 */ V(2, 12, 3), + /* 1101 */ V(2, 12, 3), + /* 1110 */ V(12, 2, 4), + /* 1111 */ V(11, 5, 4), + + /* 0000 1110 ... */ + /* 0000 */ V(12, 1, 4), /* 160 */ + /* 0001 */ V(0, 12, 4), + /* 0010 */ V(4, 11, 4), + /* 0011 */ V(11, 4, 4), + /* 0100 */ V(6, 10, 4), + /* 0101 */ V(10, 6, 4), + /* 0110 */ V(11, 3, 3), + /* 0111 */ V(11, 3, 3), + /* 1000 */ V(5, 10, 4), + /* 1001 */ V(10, 5, 4), + /* 1010 */ V(2, 11, 3), + /* 1011 */ V(2, 11, 3), + /* 1100 */ V(11, 2, 3), + /* 1101 */ V(11, 2, 3), + /* 1110 */ V(1, 11, 3), + /* 1111 */ V(1, 11, 3), + + /* 0000 1111 ... */ + /* 0000 */ V(11, 1, 3), /* 176 */ + /* 0001 */ V(11, 1, 3), + /* 0010 */ V(0, 11, 4), + /* 0011 */ V(11, 0, 4), + /* 0100 */ V(6, 9, 4), + /* 0101 */ V(9, 6, 4), + /* 0110 */ V(4, 10, 4), + /* 0111 */ V(10, 4, 4), + /* 1000 */ V(7, 8, 4), + /* 1001 */ V(8, 7, 4), + /* 1010 */ V(10, 3, 3), + /* 1011 */ V(10, 3, 3), + /* 1100 */ V(3, 10, 4), + /* 1101 */ V(5, 9, 4), + /* 1110 */ V(2, 10, 3), + /* 1111 */ V(2, 10, 3), + + /* 0001 0000 ... */ + /* 0000 */ V(9, 5, 4), /* 192 */ + /* 0001 */ V(6, 8, 4), + /* 0010 */ V(10, 1, 3), + /* 0011 */ V(10, 1, 3), + /* 0100 */ V(8, 6, 4), + /* 0101 */ V(7, 7, 4), + /* 0110 */ V(9, 4, 3), + /* 0111 */ V(9, 4, 3), + /* 1000 */ V(4, 9, 4), + /* 1001 */ V(5, 7, 4), + /* 1010 */ V(6, 7, 3), + /* 1011 */ V(6, 7, 3), + /* 1100 */ V(10, 2, 2), + /* 1101 */ V(10, 2, 2), + /* 1110 */ V(10, 2, 2), + /* 1111 */ V(10, 2, 2), + + /* 0001 0001 ... */ + /* 000 */ V(1, 10, 2), /* 208 */ + /* 001 */ V(1, 10, 2), + /* 010 */ V(0, 10, 3), + /* 011 */ V(10, 0, 3), + /* 100 */ V(3, 9, 3), + /* 101 */ V(9, 3, 3), + /* 110 */ V(5, 8, 3), + /* 111 */ V(8, 5, 3), + + /* 0001 0010 ... */ + /* 000 */ V(2, 9, 2), /* 216 */ + /* 001 */ V(2, 9, 2), + /* 010 */ V(9, 2, 2), + /* 011 */ V(9, 2, 2), + /* 100 */ V(7, 6, 3), + /* 101 */ V(0, 9, 3), + /* 110 */ V(1, 9, 2), + /* 111 */ V(1, 9, 2), + + /* 0001 0011 ... */ + /* 000 */ V(9, 1, 2), /* 224 */ + /* 001 */ V(9, 1, 2), + /* 010 */ V(9, 0, 3), + /* 011 */ V(4, 8, 3), + /* 100 */ V(8, 4, 3), + /* 101 */ V(7, 5, 3), + /* 110 */ V(3, 8, 3), + /* 111 */ V(8, 3, 3), + + /* 0001 0100 ... */ + /* 000 */ V(6, 6, 3), /* 232 */ + /* 001 */ V(2, 8, 3), + /* 010 */ V(8, 2, 2), + /* 011 */ V(8, 2, 2), + /* 100 */ V(4, 7, 3), + /* 101 */ V(7, 4, 3), + /* 110 */ V(1, 8, 2), + /* 111 */ V(1, 8, 2), + + /* 0001 0101 ... */ + /* 000 */ V(8, 1, 2), /* 240 */ + /* 001 */ V(8, 1, 2), + /* 010 */ V(8, 0, 2), + /* 011 */ V(8, 0, 2), + /* 100 */ V(0, 8, 3), + /* 101 */ V(5, 6, 3), + /* 110 */ V(3, 7, 2), + /* 111 */ V(3, 7, 2), + + /* 0001 0110 ... */ + /* 000 */ V(7, 3, 2), /* 248 */ + /* 001 */ V(7, 3, 2), + /* 010 */ V(6, 5, 3), + /* 011 */ V(4, 6, 3), + /* 100 */ V(2, 7, 2), + /* 101 */ V(2, 7, 2), + /* 110 */ V(7, 2, 2), + /* 111 */ V(7, 2, 2), + + /* 0001 0111 ... */ + /* 000 */ V(6, 4, 3), /* 256 */ + /* 001 */ V(5, 5, 3), + /* 010 */ V(0, 7, 2), + /* 011 */ V(0, 7, 2), + /* 100 */ V(1, 7, 1), + /* 101 */ V(1, 7, 1), + /* 110 */ V(1, 7, 1), + /* 111 */ V(1, 7, 1), + + /* 0001 1000 ... */ + /* 00 */ V(7, 1, 1), /* 264 */ + /* 01 */ V(7, 1, 1), + /* 10 */ V(7, 0, 2), + /* 11 */ V(3, 6, 2), + + /* 0001 1001 ... */ + /* 00 */ V(6, 3, 2), /* 268 */ + /* 01 */ V(4, 5, 2), + /* 10 */ V(5, 4, 2), + /* 11 */ V(2, 6, 2), + + /* 0001 1010 ... */ + /* 0 */ V(6, 2, 1), /* 272 */ + /* 1 */ V(1, 6, 1), + + /* 0001 1011 ... */ + /* 00 */ V(6, 1, 1), /* 274 */ + /* 01 */ V(6, 1, 1), + /* 10 */ V(0, 6, 2), + /* 11 */ V(6, 0, 2), + + /* 0001 1100 ... */ + /* 00 */ V(5, 3, 1), /* 278 */ + /* 01 */ V(5, 3, 1), + /* 10 */ V(3, 5, 2), + /* 11 */ V(4, 4, 2), + + /* 0001 1101 ... */ + /* 0 */ V(2, 5, 1), /* 282 */ + /* 1 */ V(5, 2, 1), + + /* 0001 1111 ... */ + /* 0 */ V(1, 5, 1), /* 284 */ + /* 1 */ V(0, 5, 1), + + /* 0010 0000 ... */ + /* 0 */ V(3, 4, 1), /* 286 */ + /* 1 */ V(4, 3, 1), + + /* 0010 0001 ... */ + /* 0 */ V(5, 0, 1), /* 288 */ + /* 1 */ V(2, 4, 1), + + /* 0010 0010 ... */ + /* 0 */ V(4, 2, 1), /* 290 */ + /* 1 */ V(3, 3, 1), + + /* 0010 0101 ... */ + /* 0 */ V(0, 4, 1), /* 292 */ + /* 1 */ V(4, 0, 1), + + /* 0000 0110 1100 ... */ + /* 0000 */ V(12, 14, 4), /* 294 */ + /* 0001 */ PTR(400, 1), + /* 0010 */ V(13, 14, 3), + /* 0011 */ V(13, 14, 3), + /* 0100 */ V(14, 9, 3), + /* 0101 */ V(14, 9, 3), + /* 0110 */ V(14, 10, 4), + /* 0111 */ V(13, 9, 4), + /* 1000 */ V(14, 14, 2), + /* 1001 */ V(14, 14, 2), + /* 1010 */ V(14, 14, 2), + /* 1011 */ V(14, 14, 2), + /* 1100 */ V(14, 13, 3), + /* 1101 */ V(14, 13, 3), + /* 1110 */ V(14, 11, 3), + /* 1111 */ V(14, 11, 3), + + /* 0000 0110 1101 ... */ + /* 000 */ V(11, 14, 2), /* 310 */ + /* 001 */ V(11, 14, 2), + /* 010 */ V(12, 13, 2), + /* 011 */ V(12, 13, 2), + /* 100 */ V(13, 12, 3), + /* 101 */ V(13, 11, 3), + /* 110 */ V(10, 14, 2), + /* 111 */ V(10, 14, 2), + + /* 0000 0110 1110 ... */ + /* 000 */ V(12, 12, 2), /* 318 */ + /* 001 */ V(12, 12, 2), + /* 010 */ V(10, 13, 3), + /* 011 */ V(13, 10, 3), + /* 100 */ V(7, 14, 3), + /* 101 */ V(10, 12, 3), + /* 110 */ V(12, 10, 2), + /* 111 */ V(12, 10, 2), + + /* 0000 0110 1111 ... */ + /* 000 */ V(12, 9, 3), /* 326 */ + /* 001 */ V(7, 13, 3), + /* 010 */ V(5, 14, 2), + /* 011 */ V(5, 14, 2), + /* 100 */ V(11, 13, 1), + /* 101 */ V(11, 13, 1), + /* 110 */ V(11, 13, 1), + /* 111 */ V(11, 13, 1), + + /* 0000 1011 0000 ... */ + /* 00 */ V(9, 14, 1), /* 334 */ + /* 01 */ V(9, 14, 1), + /* 10 */ V(11, 12, 2), + /* 11 */ V(12, 11, 2), + + /* 0000 1011 0001 ... */ + /* 00 */ V(8, 14, 2), /* 338 */ + /* 01 */ V(14, 8, 2), + /* 10 */ V(9, 13, 2), + /* 11 */ V(14, 7, 2), + + /* 0000 1011 0010 ... */ + /* 00 */ V(11, 11, 2), /* 342 */ + /* 01 */ V(8, 13, 2), + /* 10 */ V(13, 8, 2), + /* 11 */ V(6, 14, 2), + + /* 0000 1011 0011 ... */ + /* 0 */ V(14, 6, 1), /* 346 */ + /* 1 */ V(9, 12, 1), + + /* 0000 1011 0100 ... */ + /* 00 */ V(10, 11, 2), /* 348 */ + /* 01 */ V(11, 10, 2), + /* 10 */ V(14, 5, 2), + /* 11 */ V(13, 7, 2), + + /* 0000 1011 0101 ... */ + /* 00 */ V(4, 14, 1), /* 352 */ + /* 01 */ V(4, 14, 1), + /* 10 */ V(14, 4, 2), + /* 11 */ V(8, 12, 2), + + /* 0000 1011 0110 ... */ + /* 0 */ V(12, 8, 1), /* 356 */ + /* 1 */ V(3, 14, 1), + + /* 0000 1011 0111 ... */ + /* 00 */ V(6, 13, 1), /* 358 */ + /* 01 */ V(6, 13, 1), + /* 10 */ V(13, 6, 2), + /* 11 */ V(9, 11, 2), + + /* 0000 1011 1000 ... */ + /* 00 */ V(11, 9, 2), /* 362 */ + /* 01 */ V(10, 10, 2), + /* 10 */ V(14, 1, 1), + /* 11 */ V(14, 1, 1), + + /* 0000 1011 1001 ... */ + /* 00 */ V(13, 4, 1), /* 366 */ + /* 01 */ V(13, 4, 1), + /* 10 */ V(11, 8, 2), + /* 11 */ V(10, 9, 2), + + /* 0000 1011 1010 ... */ + /* 00 */ V(7, 11, 1), /* 370 */ + /* 01 */ V(7, 11, 1), + /* 10 */ V(11, 7, 2), + /* 11 */ V(13, 0, 2), + + /* 0000 1011 1100 ... */ + /* 0 */ V(0, 14, 1), /* 374 */ + /* 1 */ V(14, 0, 1), + + /* 0000 1011 1101 ... */ + /* 0 */ V(5, 13, 1), /* 376 */ + /* 1 */ V(13, 5, 1), + + /* 0000 1011 1110 ... */ + /* 0 */ V(7, 12, 1), /* 378 */ + /* 1 */ V(12, 7, 1), + + /* 0000 1011 1111 ... */ + /* 0 */ V(4, 13, 1), /* 380 */ + /* 1 */ V(8, 11, 1), + + /* 0000 1100 0000 ... */ + /* 0 */ V(9, 10, 1), /* 382 */ + /* 1 */ V(6, 12, 1), + + /* 0000 1100 0001 ... */ + /* 0 */ V(12, 6, 1), /* 384 */ + /* 1 */ V(3, 13, 1), + + /* 0000 1100 0010 ... */ + /* 0 */ V(5, 12, 1), /* 386 */ + /* 1 */ V(12, 5, 1), + + /* 0000 1100 0100 ... */ + /* 0 */ V(8, 10, 1), /* 388 */ + /* 1 */ V(10, 8, 1), + + /* 0000 1100 0101 ... */ + /* 0 */ V(9, 9, 1), /* 390 */ + /* 1 */ V(4, 12, 1), + + /* 0000 1100 0110 ... */ + /* 0 */ V(11, 6, 1), /* 392 */ + /* 1 */ V(7, 10, 1), + + /* 0000 1100 1000 ... */ + /* 0 */ V(5, 11, 1), /* 394 */ + /* 1 */ V(8, 9, 1), + + /* 0000 1100 1011 ... */ + /* 0 */ V(9, 8, 1), /* 396 */ + /* 1 */ V(7, 9, 1), + + /* 0000 1101 0101 ... */ + /* 0 */ V(9, 7, 1), /* 398 */ + /* 1 */ V(8, 8, 1), + + /* 0000 0110 1100 0001 ... */ + /* 0 */ V(14, 12, 1), /* 400 */ + /* 1 */ V(13, 13, 1) +}; + +static +union huffpair const hufftab24[] = { + /* 0000 */ PTR(16, 4), + /* 0001 */ PTR(32, 4), + /* 0010 */ PTR(48, 4), + /* 0011 */ V(15, 15, 4), + /* 0100 */ PTR(64, 4), + /* 0101 */ PTR(80, 4), + /* 0110 */ PTR(96, 4), + /* 0111 */ PTR(112, 4), + /* 1000 */ PTR(128, 4), + /* 1001 */ PTR(144, 4), + /* 1010 */ PTR(160, 3), + /* 1011 */ PTR(168, 2), + /* 1100 */ V(1, 1, 4), + /* 1101 */ V(0, 1, 4), + /* 1110 */ V(1, 0, 4), + /* 1111 */ V(0, 0, 4), + + /* 0000 ... */ + /* 0000 */ V(14, 15, 4), /* 16 */ + /* 0001 */ V(15, 14, 4), + /* 0010 */ V(13, 15, 4), + /* 0011 */ V(15, 13, 4), + /* 0100 */ V(12, 15, 4), + /* 0101 */ V(15, 12, 4), + /* 0110 */ V(11, 15, 4), + /* 0111 */ V(15, 11, 4), + /* 1000 */ V(15, 10, 3), + /* 1001 */ V(15, 10, 3), + /* 1010 */ V(10, 15, 4), + /* 1011 */ V(9, 15, 4), + /* 1100 */ V(15, 9, 3), + /* 1101 */ V(15, 9, 3), + /* 1110 */ V(15, 8, 3), + /* 1111 */ V(15, 8, 3), + + /* 0001 ... */ + /* 0000 */ V(8, 15, 4), /* 32 */ + /* 0001 */ V(7, 15, 4), + /* 0010 */ V(15, 7, 3), + /* 0011 */ V(15, 7, 3), + /* 0100 */ V(6, 15, 3), + /* 0101 */ V(6, 15, 3), + /* 0110 */ V(15, 6, 3), + /* 0111 */ V(15, 6, 3), + /* 1000 */ V(5, 15, 3), + /* 1001 */ V(5, 15, 3), + /* 1010 */ V(15, 5, 3), + /* 1011 */ V(15, 5, 3), + /* 1100 */ V(4, 15, 3), + /* 1101 */ V(4, 15, 3), + /* 1110 */ V(15, 4, 3), + /* 1111 */ V(15, 4, 3), + + /* 0010 ... */ + /* 0000 */ V(3, 15, 3), /* 48 */ + /* 0001 */ V(3, 15, 3), + /* 0010 */ V(15, 3, 3), + /* 0011 */ V(15, 3, 3), + /* 0100 */ V(2, 15, 3), + /* 0101 */ V(2, 15, 3), + /* 0110 */ V(15, 2, 3), + /* 0111 */ V(15, 2, 3), + /* 1000 */ V(15, 1, 3), + /* 1001 */ V(15, 1, 3), + /* 1010 */ V(1, 15, 4), + /* 1011 */ V(15, 0, 4), + /* 1100 */ PTR(172, 3), + /* 1101 */ PTR(180, 3), + /* 1110 */ PTR(188, 3), + /* 1111 */ PTR(196, 3), + + /* 0100 ... */ + /* 0000 */ PTR(204, 4), /* 64 */ + /* 0001 */ PTR(220, 3), + /* 0010 */ PTR(228, 3), + /* 0011 */ PTR(236, 3), + /* 0100 */ PTR(244, 2), + /* 0101 */ PTR(248, 2), + /* 0110 */ PTR(252, 2), + /* 0111 */ PTR(256, 2), + /* 1000 */ PTR(260, 2), + /* 1001 */ PTR(264, 2), + /* 1010 */ PTR(268, 2), + /* 1011 */ PTR(272, 2), + /* 1100 */ PTR(276, 2), + /* 1101 */ PTR(280, 3), + /* 1110 */ PTR(288, 2), + /* 1111 */ PTR(292, 2), + + /* 0101 ... */ + /* 0000 */ PTR(296, 2), /* 80 */ + /* 0001 */ PTR(300, 3), + /* 0010 */ PTR(308, 2), + /* 0011 */ PTR(312, 3), + /* 0100 */ PTR(320, 1), + /* 0101 */ PTR(322, 2), + /* 0110 */ PTR(326, 2), + /* 0111 */ PTR(330, 1), + /* 1000 */ PTR(332, 2), + /* 1001 */ PTR(336, 1), + /* 1010 */ PTR(338, 1), + /* 1011 */ PTR(340, 1), + /* 1100 */ PTR(342, 1), + /* 1101 */ PTR(344, 1), + /* 1110 */ PTR(346, 1), + /* 1111 */ PTR(348, 1), + + /* 0110 ... */ + /* 0000 */ PTR(350, 1), /* 96 */ + /* 0001 */ PTR(352, 1), + /* 0010 */ PTR(354, 1), + /* 0011 */ PTR(356, 1), + /* 0100 */ PTR(358, 1), + /* 0101 */ PTR(360, 1), + /* 0110 */ PTR(362, 1), + /* 0111 */ PTR(364, 1), + /* 1000 */ PTR(366, 1), + /* 1001 */ PTR(368, 1), + /* 1010 */ PTR(370, 2), + /* 1011 */ PTR(374, 1), + /* 1100 */ PTR(376, 2), + /* 1101 */ V(7, 3, 4), + /* 1110 */ PTR(380, 1), + /* 1111 */ V(7, 2, 4), + + /* 0111 ... */ + /* 0000 */ V(4, 6, 4), /* 112 */ + /* 0001 */ V(6, 4, 4), + /* 0010 */ V(5, 5, 4), + /* 0011 */ V(7, 1, 4), + /* 0100 */ V(3, 6, 4), + /* 0101 */ V(6, 3, 4), + /* 0110 */ V(4, 5, 4), + /* 0111 */ V(5, 4, 4), + /* 1000 */ V(2, 6, 4), + /* 1001 */ V(6, 2, 4), + /* 1010 */ V(1, 6, 4), + /* 1011 */ V(6, 1, 4), + /* 1100 */ PTR(382, 1), + /* 1101 */ V(3, 5, 4), + /* 1110 */ V(5, 3, 4), + /* 1111 */ V(4, 4, 4), + + /* 1000 ... */ + /* 0000 */ V(2, 5, 4), /* 128 */ + /* 0001 */ V(5, 2, 4), + /* 0010 */ V(1, 5, 4), + /* 0011 */ PTR(384, 1), + /* 0100 */ V(5, 1, 3), + /* 0101 */ V(5, 1, 3), + /* 0110 */ V(3, 4, 4), + /* 0111 */ V(4, 3, 4), + /* 1000 */ V(2, 4, 3), + /* 1001 */ V(2, 4, 3), + /* 1010 */ V(4, 2, 3), + /* 1011 */ V(4, 2, 3), + /* 1100 */ V(3, 3, 3), + /* 1101 */ V(3, 3, 3), + /* 1110 */ V(1, 4, 3), + /* 1111 */ V(1, 4, 3), + + /* 1001 ... */ + /* 0000 */ V(4, 1, 3), /* 144 */ + /* 0001 */ V(4, 1, 3), + /* 0010 */ V(0, 4, 4), + /* 0011 */ V(4, 0, 4), + /* 0100 */ V(2, 3, 3), + /* 0101 */ V(2, 3, 3), + /* 0110 */ V(3, 2, 3), + /* 0111 */ V(3, 2, 3), + /* 1000 */ V(1, 3, 2), + /* 1001 */ V(1, 3, 2), + /* 1010 */ V(1, 3, 2), + /* 1011 */ V(1, 3, 2), + /* 1100 */ V(3, 1, 2), + /* 1101 */ V(3, 1, 2), + /* 1110 */ V(3, 1, 2), + /* 1111 */ V(3, 1, 2), + + /* 1010 ... */ + /* 000 */ V(0, 3, 3), /* 160 */ + /* 001 */ V(3, 0, 3), + /* 010 */ V(2, 2, 2), + /* 011 */ V(2, 2, 2), + /* 100 */ V(1, 2, 1), + /* 101 */ V(1, 2, 1), + /* 110 */ V(1, 2, 1), + /* 111 */ V(1, 2, 1), + + /* 1011 ... */ + /* 00 */ V(2, 1, 1), /* 168 */ + /* 01 */ V(2, 1, 1), + /* 10 */ V(0, 2, 2), + /* 11 */ V(2, 0, 2), + + /* 0010 1100 ... */ + /* 000 */ V(0, 15, 1), /* 172 */ + /* 001 */ V(0, 15, 1), + /* 010 */ V(0, 15, 1), + /* 011 */ V(0, 15, 1), + /* 100 */ V(14, 14, 3), + /* 101 */ V(13, 14, 3), + /* 110 */ V(14, 13, 3), + /* 111 */ V(12, 14, 3), + + /* 0010 1101 ... */ + /* 000 */ V(14, 12, 3), /* 180 */ + /* 001 */ V(13, 13, 3), + /* 010 */ V(11, 14, 3), + /* 011 */ V(14, 11, 3), + /* 100 */ V(12, 13, 3), + /* 101 */ V(13, 12, 3), + /* 110 */ V(10, 14, 3), + /* 111 */ V(14, 10, 3), + + /* 0010 1110 ... */ + /* 000 */ V(11, 13, 3), /* 188 */ + /* 001 */ V(13, 11, 3), + /* 010 */ V(12, 12, 3), + /* 011 */ V(9, 14, 3), + /* 100 */ V(14, 9, 3), + /* 101 */ V(10, 13, 3), + /* 110 */ V(13, 10, 3), + /* 111 */ V(11, 12, 3), + + /* 0010 1111 ... */ + /* 000 */ V(12, 11, 3), /* 196 */ + /* 001 */ V(8, 14, 3), + /* 010 */ V(14, 8, 3), + /* 011 */ V(9, 13, 3), + /* 100 */ V(13, 9, 3), + /* 101 */ V(7, 14, 3), + /* 110 */ V(14, 7, 3), + /* 111 */ V(10, 12, 3), + + /* 0100 0000 ... */ + /* 0000 */ V(12, 10, 3), /* 204 */ + /* 0001 */ V(12, 10, 3), + /* 0010 */ V(11, 11, 3), + /* 0011 */ V(11, 11, 3), + /* 0100 */ V(8, 13, 3), + /* 0101 */ V(8, 13, 3), + /* 0110 */ V(13, 8, 3), + /* 0111 */ V(13, 8, 3), + /* 1000 */ V(0, 14, 4), + /* 1001 */ V(14, 0, 4), + /* 1010 */ V(0, 13, 3), + /* 1011 */ V(0, 13, 3), + /* 1100 */ V(14, 6, 2), + /* 1101 */ V(14, 6, 2), + /* 1110 */ V(14, 6, 2), + /* 1111 */ V(14, 6, 2), + + /* 0100 0001 ... */ + /* 000 */ V(6, 14, 3), /* 220 */ + /* 001 */ V(9, 12, 3), + /* 010 */ V(12, 9, 2), + /* 011 */ V(12, 9, 2), + /* 100 */ V(5, 14, 2), + /* 101 */ V(5, 14, 2), + /* 110 */ V(11, 10, 2), + /* 111 */ V(11, 10, 2), + + /* 0100 0010 ... */ + /* 000 */ V(14, 5, 2), /* 228 */ + /* 001 */ V(14, 5, 2), + /* 010 */ V(10, 11, 3), + /* 011 */ V(7, 13, 3), + /* 100 */ V(13, 7, 2), + /* 101 */ V(13, 7, 2), + /* 110 */ V(14, 4, 2), + /* 111 */ V(14, 4, 2), + + /* 0100 0011 ... */ + /* 000 */ V(8, 12, 2), /* 236 */ + /* 001 */ V(8, 12, 2), + /* 010 */ V(12, 8, 2), + /* 011 */ V(12, 8, 2), + /* 100 */ V(4, 14, 3), + /* 101 */ V(2, 14, 3), + /* 110 */ V(3, 14, 2), + /* 111 */ V(3, 14, 2), + + /* 0100 0100 ... */ + /* 00 */ V(6, 13, 2), /* 244 */ + /* 01 */ V(13, 6, 2), + /* 10 */ V(14, 3, 2), + /* 11 */ V(9, 11, 2), + + /* 0100 0101 ... */ + /* 00 */ V(11, 9, 2), /* 248 */ + /* 01 */ V(10, 10, 2), + /* 10 */ V(14, 2, 2), + /* 11 */ V(1, 14, 2), + + /* 0100 0110 ... */ + /* 00 */ V(14, 1, 2), /* 252 */ + /* 01 */ V(5, 13, 2), + /* 10 */ V(13, 5, 2), + /* 11 */ V(7, 12, 2), + + /* 0100 0111 ... */ + /* 00 */ V(12, 7, 2), /* 256 */ + /* 01 */ V(4, 13, 2), + /* 10 */ V(8, 11, 2), + /* 11 */ V(11, 8, 2), + + /* 0100 1000 ... */ + /* 00 */ V(13, 4, 2), /* 260 */ + /* 01 */ V(9, 10, 2), + /* 10 */ V(10, 9, 2), + /* 11 */ V(6, 12, 2), + + /* 0100 1001 ... */ + /* 00 */ V(12, 6, 2), /* 264 */ + /* 01 */ V(3, 13, 2), + /* 10 */ V(13, 3, 2), + /* 11 */ V(2, 13, 2), + + /* 0100 1010 ... */ + /* 00 */ V(13, 2, 2), /* 268 */ + /* 01 */ V(1, 13, 2), + /* 10 */ V(7, 11, 2), + /* 11 */ V(11, 7, 2), + + /* 0100 1011 ... */ + /* 00 */ V(13, 1, 2), /* 272 */ + /* 01 */ V(5, 12, 2), + /* 10 */ V(12, 5, 2), + /* 11 */ V(8, 10, 2), + + /* 0100 1100 ... */ + /* 00 */ V(10, 8, 2), /* 276 */ + /* 01 */ V(9, 9, 2), + /* 10 */ V(4, 12, 2), + /* 11 */ V(12, 4, 2), + + /* 0100 1101 ... */ + /* 000 */ V(6, 11, 2), /* 280 */ + /* 001 */ V(6, 11, 2), + /* 010 */ V(11, 6, 2), + /* 011 */ V(11, 6, 2), + /* 100 */ V(13, 0, 3), + /* 101 */ V(0, 12, 3), + /* 110 */ V(3, 12, 2), + /* 111 */ V(3, 12, 2), + + /* 0100 1110 ... */ + /* 00 */ V(12, 3, 2), /* 288 */ + /* 01 */ V(7, 10, 2), + /* 10 */ V(10, 7, 2), + /* 11 */ V(2, 12, 2), + + /* 0100 1111 ... */ + /* 00 */ V(12, 2, 2), /* 292 */ + /* 01 */ V(5, 11, 2), + /* 10 */ V(11, 5, 2), + /* 11 */ V(1, 12, 2), + + /* 0101 0000 ... */ + /* 00 */ V(8, 9, 2), /* 296 */ + /* 01 */ V(9, 8, 2), + /* 10 */ V(12, 1, 2), + /* 11 */ V(4, 11, 2), + + /* 0101 0001 ... */ + /* 000 */ V(12, 0, 3), /* 300 */ + /* 001 */ V(0, 11, 3), + /* 010 */ V(3, 11, 2), + /* 011 */ V(3, 11, 2), + /* 100 */ V(11, 0, 3), + /* 101 */ V(0, 10, 3), + /* 110 */ V(1, 10, 2), + /* 111 */ V(1, 10, 2), + + /* 0101 0010 ... */ + /* 00 */ V(11, 4, 1), /* 308 */ + /* 01 */ V(11, 4, 1), + /* 10 */ V(6, 10, 2), + /* 11 */ V(10, 6, 2), + + /* 0101 0011 ... */ + /* 000 */ V(7, 9, 2), /* 312 */ + /* 001 */ V(7, 9, 2), + /* 010 */ V(9, 7, 2), + /* 011 */ V(9, 7, 2), + /* 100 */ V(10, 0, 3), + /* 101 */ V(0, 9, 3), + /* 110 */ V(9, 0, 2), + /* 111 */ V(9, 0, 2), + + /* 0101 0100 ... */ + /* 0 */ V(11, 3, 1), /* 320 */ + /* 1 */ V(8, 8, 1), + + /* 0101 0101 ... */ + /* 00 */ V(2, 11, 2), /* 322 */ + /* 01 */ V(5, 10, 2), + /* 10 */ V(11, 2, 1), + /* 11 */ V(11, 2, 1), + + /* 0101 0110 ... */ + /* 00 */ V(10, 5, 2), /* 326 */ + /* 01 */ V(1, 11, 2), + /* 10 */ V(11, 1, 2), + /* 11 */ V(6, 9, 2), + + /* 0101 0111 ... */ + /* 0 */ V(9, 6, 1), /* 330 */ + /* 1 */ V(10, 4, 1), + + /* 0101 1000 ... */ + /* 00 */ V(4, 10, 2), /* 332 */ + /* 01 */ V(7, 8, 2), + /* 10 */ V(8, 7, 1), + /* 11 */ V(8, 7, 1), + + /* 0101 1001 ... */ + /* 0 */ V(3, 10, 1), /* 336 */ + /* 1 */ V(10, 3, 1), + + /* 0101 1010 ... */ + /* 0 */ V(5, 9, 1), /* 338 */ + /* 1 */ V(9, 5, 1), + + /* 0101 1011 ... */ + /* 0 */ V(2, 10, 1), /* 340 */ + /* 1 */ V(10, 2, 1), + + /* 0101 1100 ... */ + /* 0 */ V(10, 1, 1), /* 342 */ + /* 1 */ V(6, 8, 1), + + /* 0101 1101 ... */ + /* 0 */ V(8, 6, 1), /* 344 */ + /* 1 */ V(7, 7, 1), + + /* 0101 1110 ... */ + /* 0 */ V(4, 9, 1), /* 346 */ + /* 1 */ V(9, 4, 1), + + /* 0101 1111 ... */ + /* 0 */ V(3, 9, 1), /* 348 */ + /* 1 */ V(9, 3, 1), + + /* 0110 0000 ... */ + /* 0 */ V(5, 8, 1), /* 350 */ + /* 1 */ V(8, 5, 1), + + /* 0110 0001 ... */ + /* 0 */ V(2, 9, 1), /* 352 */ + /* 1 */ V(6, 7, 1), + + /* 0110 0010 ... */ + /* 0 */ V(7, 6, 1), /* 354 */ + /* 1 */ V(9, 2, 1), + + /* 0110 0011 ... */ + /* 0 */ V(1, 9, 1), /* 356 */ + /* 1 */ V(9, 1, 1), + + /* 0110 0100 ... */ + /* 0 */ V(4, 8, 1), /* 358 */ + /* 1 */ V(8, 4, 1), + + /* 0110 0101 ... */ + /* 0 */ V(5, 7, 1), /* 360 */ + /* 1 */ V(7, 5, 1), + + /* 0110 0110 ... */ + /* 0 */ V(3, 8, 1), /* 362 */ + /* 1 */ V(8, 3, 1), + + /* 0110 0111 ... */ + /* 0 */ V(6, 6, 1), /* 364 */ + /* 1 */ V(2, 8, 1), + + /* 0110 1000 ... */ + /* 0 */ V(8, 2, 1), /* 366 */ + /* 1 */ V(1, 8, 1), + + /* 0110 1001 ... */ + /* 0 */ V(4, 7, 1), /* 368 */ + /* 1 */ V(7, 4, 1), + + /* 0110 1010 ... */ + /* 00 */ V(8, 1, 1), /* 370 */ + /* 01 */ V(8, 1, 1), + /* 10 */ V(0, 8, 2), + /* 11 */ V(8, 0, 2), + + /* 0110 1011 ... */ + /* 0 */ V(5, 6, 1), /* 374 */ + /* 1 */ V(6, 5, 1), + + /* 0110 1100 ... */ + /* 00 */ V(1, 7, 1), /* 376 */ + /* 01 */ V(1, 7, 1), + /* 10 */ V(0, 7, 2), + /* 11 */ V(7, 0, 2), + + /* 0110 1110 ... */ + /* 0 */ V(3, 7, 1), /* 380 */ + /* 1 */ V(2, 7, 1), + + /* 0111 1100 ... */ + /* 0 */ V(0, 6, 1), /* 382 */ + /* 1 */ V(6, 0, 1), + + /* 1000 0011 ... */ + /* 0 */ V(0, 5, 1), /* 384 */ + /* 1 */ V(5, 0, 1) +}; + +# undef V +# undef PTR + +/* external tables */ + +union huffquad const *const mad_huff_quad_table[2] = { hufftabA, hufftabB }; + +struct hufftable const mad_huff_pair_table[32] = { + /* 0 */ { hufftab0, 0, 0 }, + /* 1 */ { hufftab1, 0, 3 }, + /* 2 */ { hufftab2, 0, 3 }, + /* 3 */ { hufftab3, 0, 3 }, + /* 4 */ { 0 /* not used */ }, + /* 5 */ { hufftab5, 0, 3 }, + /* 6 */ { hufftab6, 0, 4 }, + /* 7 */ { hufftab7, 0, 4 }, + /* 8 */ { hufftab8, 0, 4 }, + /* 9 */ { hufftab9, 0, 4 }, + /* 10 */ { hufftab10, 0, 4 }, + /* 11 */ { hufftab11, 0, 4 }, + /* 12 */ { hufftab12, 0, 4 }, + /* 13 */ { hufftab13, 0, 4 }, + /* 14 */ { 0 /* not used */ }, + /* 15 */ { hufftab15, 0, 4 }, + /* 16 */ { hufftab16, 1, 4 }, + /* 17 */ { hufftab16, 2, 4 }, + /* 18 */ { hufftab16, 3, 4 }, + /* 19 */ { hufftab16, 4, 4 }, + /* 20 */ { hufftab16, 6, 4 }, + /* 21 */ { hufftab16, 8, 4 }, + /* 22 */ { hufftab16, 10, 4 }, + /* 23 */ { hufftab16, 13, 4 }, + /* 24 */ { hufftab24, 4, 4 }, + /* 25 */ { hufftab24, 5, 4 }, + /* 26 */ { hufftab24, 6, 4 }, + /* 27 */ { hufftab24, 7, 4 }, + /* 28 */ { hufftab24, 8, 4 }, + /* 29 */ { hufftab24, 9, 4 }, + /* 30 */ { hufftab24, 11, 4 }, + /* 31 */ { hufftab24, 13, 4 } +};
libmad/huffman.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/timer.h =================================================================== --- libmad/timer.h (nonexistent) +++ libmad/timer.h (revision 1765) @@ -0,0 +1,100 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: timer.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_TIMER_H +# define LIBMAD_TIMER_H + +typedef struct { + signed long seconds; /* whole seconds */ + unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ +} mad_timer_t; + +extern mad_timer_t const mad_timer_zero; + +# define MAD_TIMER_RESOLUTION 352800000UL + +enum mad_units { + MAD_UNITS_HOURS = -2, + MAD_UNITS_MINUTES = -1, + MAD_UNITS_SECONDS = 0, + + /* metric units */ + + MAD_UNITS_DECISECONDS = 10, + MAD_UNITS_CENTISECONDS = 100, + MAD_UNITS_MILLISECONDS = 1000, + + /* audio sample units */ + + MAD_UNITS_8000_HZ = 8000, + MAD_UNITS_11025_HZ = 11025, + MAD_UNITS_12000_HZ = 12000, + + MAD_UNITS_16000_HZ = 16000, + MAD_UNITS_22050_HZ = 22050, + MAD_UNITS_24000_HZ = 24000, + + MAD_UNITS_32000_HZ = 32000, + MAD_UNITS_44100_HZ = 44100, + MAD_UNITS_48000_HZ = 48000, + + /* video frame/field units */ + + MAD_UNITS_24_FPS = 24, + MAD_UNITS_25_FPS = 25, + MAD_UNITS_30_FPS = 30, + MAD_UNITS_48_FPS = 48, + MAD_UNITS_50_FPS = 50, + MAD_UNITS_60_FPS = 60, + + /* CD audio frames */ + + MAD_UNITS_75_FPS = 75, + + /* video drop-frame units */ + + MAD_UNITS_23_976_FPS = -24, + MAD_UNITS_24_975_FPS = -25, + MAD_UNITS_29_97_FPS = -30, + MAD_UNITS_47_952_FPS = -48, + MAD_UNITS_49_95_FPS = -50, + MAD_UNITS_59_94_FPS = -60 +}; + +# define mad_timer_reset(timer) (*(timer) = mad_timer_zero) + +int mad_timer_compare(mad_timer_t, mad_timer_t); + +# define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) + +void mad_timer_negate(mad_timer_t *); +mad_timer_t mad_timer_abs(mad_timer_t); + +void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); +void mad_timer_add(mad_timer_t *, mad_timer_t); +void mad_timer_multiply(mad_timer_t *, signed long); + +signed long mad_timer_count(mad_timer_t, enum mad_units); +unsigned long mad_timer_fraction(mad_timer_t, unsigned long); +void mad_timer_string(mad_timer_t, char *, char const *, + enum mad_units, enum mad_units, unsigned long); + +# endif
libmad/timer.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/rq_short.dat =================================================================== --- libmad/rq_short.dat (nonexistent) +++ libmad/rq_short.dat (revision 1765) @@ -0,0 +1,574 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: rq_short.dat,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +/* + * This is the lookup table used to compute x^(4/3) for Layer III + * requantization. To maintain the best possible accuracy, the value is + * stored as a normalized mantissa with exponent. The requantization + * algorithm recombines these parts with appropriate scaling. + */ + +/* Table shortened by MM. */ + + /* 0 */ { MAD_F(0x00000000) /* 0.000000000 */, 0 }, + /* 1 */ { MAD_F(0x04000000) /* 0.250000000 */, 2 }, + /* 2 */ { MAD_F(0x050a28be) /* 0.314980262 */, 3 }, + /* 3 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 4 }, + /* 4 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 4 }, + /* 5 */ { MAD_F(0x04466275) /* 0.267183742 */, 5 }, + /* 6 */ { MAD_F(0x05738c72) /* 0.340710111 */, 5 }, + /* 7 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 5 }, + /* 8 */ { MAD_F(0x04000000) /* 0.250000000 */, 6 }, + /* 9 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 6 }, + /* 10 */ { MAD_F(0x0562d694) /* 0.336630420 */, 6 }, + /* 11 */ { MAD_F(0x061dae96) /* 0.382246578 */, 6 }, + /* 12 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 6 }, + /* 13 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 6 }, + /* 14 */ { MAD_F(0x0437be65) /* 0.263609310 */, 7 }, + /* 15 */ { MAD_F(0x049fc824) /* 0.289009227 */, 7 }, + + /* 16 */ { MAD_F(0x050a28be) /* 0.314980262 */, 7 }, + /* 17 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 7 }, + /* 18 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 7 }, + /* 19 */ { MAD_F(0x06566361) /* 0.396090870 */, 7 }, + /* 20 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 7 }, + /* 21 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 7 }, + /* 22 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 7 }, + /* 23 */ { MAD_F(0x04168b05) /* 0.255503674 */, 8 }, + /* 24 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 8 }, + /* 25 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 8 }, + /* 26 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 8 }, + /* 27 */ { MAD_F(0x05100000) /* 0.316406250 */, 8 }, + /* 28 */ { MAD_F(0x05506451) /* 0.332126919 */, 8 }, + /* 29 */ { MAD_F(0x05918e15) /* 0.348035890 */, 8 }, + /* 30 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 8 }, + /* 31 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 8 }, + + /* 32 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 8 }, + /* 33 */ { MAD_F(0x069d9400) /* 0.413471222 */, 8 }, + /* 34 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 8 }, + /* 35 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 8 }, + /* 36 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 8 }, + /* 37 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 8 }, + /* 38 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 8 }, + /* 39 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 9 }, + /* 40 */ { MAD_F(0x04466275) /* 0.267183742 */, 9 }, + /* 41 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 9 }, + /* 42 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 9 }, + /* 43 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 9 }, + /* 44 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 9 }, + /* 45 */ { MAD_F(0x05007b49) /* 0.312617576 */, 9 }, + /* 46 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 9 }, + /* 47 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 9 }, + + /* 48 */ { MAD_F(0x05738c72) /* 0.340710111 */, 9 }, + /* 49 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 9 }, + /* 50 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 9 }, + /* 51 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 9 }, + /* 52 */ { MAD_F(0x0610b982) /* 0.379083164 */, 9 }, + /* 53 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 9 }, + /* 54 */ { MAD_F(0x0660db91) /* 0.398646895 */, 9 }, + /* 55 */ { MAD_F(0x06894c90) /* 0.408520284 */, 9 }, + /* 56 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 9 }, + /* 57 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 9 }, + /* 58 */ { MAD_F(0x07041636) /* 0.438497744 */, 9 }, + /* 59 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 9 }, + /* 60 */ { MAD_F(0x075722ef) /* 0.458773552 */, 9 }, + /* 61 */ { MAD_F(0x078102b8) /* 0.468996735 */, 9 }, + /* 62 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 9 }, + /* 63 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 9 }, + + /* 64 */ { MAD_F(0x04000000) /* 0.250000000 */, 10 }, + /* 65 */ { MAD_F(0x04156381) /* 0.255221850 */, 10 }, + /* 66 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 10 }, + /* 67 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 10 }, + /* 68 */ { MAD_F(0x045635cf) /* 0.271047409 */, 10 }, + /* 69 */ { MAD_F(0x046c083e) /* 0.276375048 */, 10 }, + /* 70 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 10 }, + /* 71 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 10 }, + /* 72 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 10 }, + /* 73 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 10 }, + /* 74 */ { MAD_F(0x04dab524) /* 0.303395408 */, 10 }, + /* 75 */ { MAD_F(0x04f12624) /* 0.308874267 */, 10 }, + /* 76 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 10 }, + /* 77 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 10 }, + /* 78 */ { MAD_F(0x053511cb) /* 0.325456423 */, 10 }, + /* 79 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 10 }, + + /* 80 */ { MAD_F(0x0562d694) /* 0.336630420 */, 10 }, + /* 81 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 10 }, + /* 82 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 10 }, + /* 83 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 10 }, + /* 84 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 10 }, + /* 85 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 10 }, + /* 86 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 10 }, + /* 87 */ { MAD_F(0x0606012b) /* 0.376465960 */, 10 }, + /* 88 */ { MAD_F(0x061dae96) /* 0.382246578 */, 10 }, + /* 89 */ { MAD_F(0x06357302) /* 0.388049134 */, 10 }, + /* 90 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 10 }, + /* 91 */ { MAD_F(0x0665402d) /* 0.399719406 */, 10 }, + /* 92 */ { MAD_F(0x067d4896) /* 0.405586801 */, 10 }, + /* 93 */ { MAD_F(0x06956753) /* 0.411475493 */, 10 }, + /* 94 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 10 }, + /* 95 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 10 }, + + /* 96 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 10 }, + /* 97 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 10 }, + /* 98 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 10 }, + /* 99 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 10 }, + /* 100 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 10 }, + /* 101 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 10 }, + /* 102 */ { MAD_F(0x07724f64) /* 0.465407744 */, 10 }, + /* 103 */ { MAD_F(0x078b4514) /* 0.471501425 */, 10 }, + /* 104 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 10 }, + /* 105 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 10 }, + /* 106 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 10 }, + /* 107 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 10 }, + /* 108 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 11 }, + /* 109 */ { MAD_F(0x04115aca) /* 0.254236974 */, 11 }, + /* 110 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 11 }, + /* 111 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 11 }, + + /* 112 */ { MAD_F(0x0437be65) /* 0.263609310 */, 11 }, + /* 113 */ { MAD_F(0x04449dee) /* 0.266752177 */, 11 }, + /* 114 */ { MAD_F(0x04518733) /* 0.269904329 */, 11 }, + /* 115 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 11 }, + /* 116 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 11 }, + /* 117 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 11 }, + /* 118 */ { MAD_F(0x04858c83) /* 0.282604707 */, 11 }, + /* 119 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 11 }, + /* 120 */ { MAD_F(0x049fc824) /* 0.289009227 */, 11 }, + /* 121 */ { MAD_F(0x04acf402) /* 0.292224893 */, 11 }, + /* 122 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 11 }, + /* 123 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 11 }, + /* 124 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 11 }, + /* 125 */ { MAD_F(0x04e20000) /* 0.305175781 */, 11 }, + /* 126 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 11 }, + /* 127 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 11 }, + + /* 128 */ { MAD_F(0x050a28be) /* 0.314980262 */, 11 }, + /* 130 */ { MAD_F(0x05251b73) /* 0.321559381 */, 11 }, + /* 132 */ { MAD_F(0x054031a0) /* 0.328172327 */, 11 }, + /* 134 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 11 }, + /* 136 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 11 }, + /* 138 */ { MAD_F(0x0592456d) /* 0.348210741 */, 11 }, + /* 140 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 11 }, + /* 142 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 11 }, + /* 144 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 11 }, + /* 146 */ { MAD_F(0x060190ee) /* 0.375382356 */, 11 }, + /* 148 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 11 }, + /* 150 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 11 }, + /* 152 */ { MAD_F(0x06566361) /* 0.396090870 */, 11 }, + /* 154 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 11 }, + /* 156 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 11 }, + /* 158 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 11 }, + + /* 160 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 11 }, + /* 162 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 11 }, + /* 164 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 11 }, + /* 166 */ { MAD_F(0x0720a087) /* 0.445465593 */, 11 }, + /* 168 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 11 }, + /* 170 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 11 }, + /* 172 */ { MAD_F(0x07791620) /* 0.467062117 */, 11 }, + /* 174 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 11 }, + /* 176 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 11 }, + /* 178 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 11 }, + /* 180 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 11 }, + /* 182 */ { MAD_F(0x0407673f) /* 0.251807447 */, 12 }, + /* 184 */ { MAD_F(0x04168b05) /* 0.255503674 */, 12 }, + /* 186 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 12 }, + /* 188 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 12 }, + /* 190 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 12 }, + + /* 192 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 12 }, + /* 194 */ { MAD_F(0x04630eed) /* 0.274184158 */, 12 }, + /* 196 */ { MAD_F(0x047285a2) /* 0.277959474 */, 12 }, + /* 198 */ { MAD_F(0x048209d3) /* 0.281747652 */, 12 }, + /* 200 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 12 }, + /* 202 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 12 }, + /* 204 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 12 }, + /* 206 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 12 }, + /* 208 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 12 }, + /* 210 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 12 }, + /* 212 */ { MAD_F(0x04f01963) /* 0.308617963 */, 12 }, + /* 214 */ { MAD_F(0x05000655) /* 0.312506041 */, 12 }, + /* 216 */ { MAD_F(0x05100000) /* 0.316406250 */, 12 }, + /* 218 */ { MAD_F(0x0520064f) /* 0.320318516 */, 12 }, + /* 220 */ { MAD_F(0x0530192e) /* 0.324242764 */, 12 }, + /* 222 */ { MAD_F(0x0540388a) /* 0.328178922 */, 12 }, + + /* 224 */ { MAD_F(0x05506451) /* 0.332126919 */, 12 }, + /* 226 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 12 }, + /* 228 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 12 }, + /* 230 */ { MAD_F(0x05813162) /* 0.344041237 */, 12 }, + /* 232 */ { MAD_F(0x05918e15) /* 0.348035890 */, 12 }, + /* 234 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 12 }, + /* 236 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 12 }, + /* 238 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 12 }, + /* 240 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 12 }, + /* 242 */ { MAD_F(0x05e41105) /* 0.368180294 */, 12 }, + /* 244 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 12 }, + /* 246 */ { MAD_F(0x060564b1) /* 0.376316732 */, 12 }, + /* 248 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 12 }, + /* 250 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 12 }, + /* 252 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 12 }, + /* 254 */ { MAD_F(0x064896a7) /* 0.392721798 */, 12 }, + + /* 256 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 12 }, + /* 260 */ { MAD_F(0x067b737c) /* 0.405139433 */, 12 }, + /* 264 */ { MAD_F(0x069d9400) /* 0.413471222 */, 12 }, + /* 268 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 12 }, + /* 272 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 12 }, + /* 276 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 12 }, + /* 280 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 12 }, + /* 284 */ { MAD_F(0x074ac575) /* 0.455754717 */, 12 }, + /* 288 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 12 }, + /* 292 */ { MAD_F(0x07913641) /* 0.472952132 */, 12 }, + /* 296 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 12 }, + /* 300 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 12 }, + /* 304 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 12 }, + /* 308 */ { MAD_F(0x041002a1) /* 0.253908756 */, 13 }, + /* 312 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 13 }, + /* 316 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 13 }, + + /* 320 */ { MAD_F(0x04466275) /* 0.267183742 */, 13 }, + /* 324 */ { MAD_F(0x0458a989) /* 0.271646056 */, 13 }, + /* 328 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 13 }, + /* 332 */ { MAD_F(0x047d716a) /* 0.280625739 */, 13 }, + /* 336 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 13 }, + /* 340 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 13 }, + /* 344 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 13 }, + /* 348 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 13 }, + /* 352 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 13 }, + /* 356 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 13 }, + /* 360 */ { MAD_F(0x05007b49) /* 0.312617576 */, 13 }, + /* 364 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 13 }, + /* 368 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 13 }, + /* 372 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 13 }, + /* 376 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 13 }, + /* 380 */ { MAD_F(0x05603321) /* 0.335986261 */, 13 }, + + /* 384 */ { MAD_F(0x05738c72) /* 0.340710111 */, 13 }, + /* 388 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 13 }, + /* 392 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 13 }, + /* 396 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 13 }, + /* 400 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 13 }, + /* 404 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 13 }, + /* 408 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 13 }, + /* 412 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 13 }, + /* 416 */ { MAD_F(0x0610b982) /* 0.379083164 */, 13 }, + /* 420 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 13 }, + /* 424 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 13 }, + /* 428 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 13 }, + /* 432 */ { MAD_F(0x0660db91) /* 0.398646895 */, 13 }, + /* 436 */ { MAD_F(0x06750c26) /* 0.403576041 */, 13 }, + /* 440 */ { MAD_F(0x06894c90) /* 0.408520284 */, 13 }, + /* 444 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 13 }, + + /* 448 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 13 }, + /* 452 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 13 }, + /* 456 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 13 }, + /* 460 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 13 }, + /* 464 */ { MAD_F(0x07041636) /* 0.438497744 */, 13 }, + /* 468 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 13 }, + /* 472 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 13 }, + /* 476 */ { MAD_F(0x07424946) /* 0.453683161 */, 13 }, + /* 480 */ { MAD_F(0x075722ef) /* 0.458773552 */, 13 }, + /* 484 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 13 }, + /* 488 */ { MAD_F(0x078102b8) /* 0.468996735 */, 13 }, + /* 492 */ { MAD_F(0x079608ae) /* 0.474129372 */, 13 }, + /* 496 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 13 }, + /* 500 */ { MAD_F(0x07c04056) /* 0.484436356 */, 13 }, + /* 504 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 13 }, + /* 508 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 13 }, + + /* 512 */ { MAD_F(0x04000000) /* 0.250000000 */, 14 }, + /* 520 */ { MAD_F(0x04156381) /* 0.255221850 */, 14 }, + /* 528 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 14 }, + /* 536 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 14 }, + /* 544 */ { MAD_F(0x045635cf) /* 0.271047409 */, 14 }, + /* 552 */ { MAD_F(0x046c083e) /* 0.276375048 */, 14 }, + /* 560 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 14 }, + /* 568 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 14 }, + /* 576 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 14 }, + /* 584 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 14 }, + /* 592 */ { MAD_F(0x04dab524) /* 0.303395408 */, 14 }, + /* 600 */ { MAD_F(0x04f12624) /* 0.308874267 */, 14 }, + /* 608 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 14 }, + /* 616 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 14 }, + /* 624 */ { MAD_F(0x053511cb) /* 0.325456423 */, 14 }, + /* 632 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 14 }, + + /* 640 */ { MAD_F(0x0562d694) /* 0.336630420 */, 14 }, + /* 648 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 14 }, + /* 656 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 14 }, + /* 664 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 14 }, + /* 672 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 14 }, + /* 680 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 14 }, + /* 688 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 14 }, + /* 696 */ { MAD_F(0x0606012b) /* 0.376465960 */, 14 }, + /* 704 */ { MAD_F(0x061dae96) /* 0.382246578 */, 14 }, + /* 712 */ { MAD_F(0x06357302) /* 0.388049134 */, 14 }, + /* 720 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 14 }, + /* 728 */ { MAD_F(0x0665402d) /* 0.399719406 */, 14 }, + /* 736 */ { MAD_F(0x067d4896) /* 0.405586801 */, 14 }, + /* 744 */ { MAD_F(0x06956753) /* 0.411475493 */, 14 }, + /* 752 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 14 }, + /* 760 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 14 }, + + /* 768 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 14 }, + /* 776 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 14 }, + /* 784 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 14 }, + /* 792 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 14 }, + /* 800 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 14 }, + /* 808 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 14 }, + /* 816 */ { MAD_F(0x07724f64) /* 0.465407744 */, 14 }, + /* 824 */ { MAD_F(0x078b4514) /* 0.471501425 */, 14 }, + /* 832 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 14 }, + /* 840 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 14 }, + /* 848 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 14 }, + /* 856 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 14 }, + /* 864 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 15 }, + /* 872 */ { MAD_F(0x04115aca) /* 0.254236974 */, 15 }, + /* 880 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 15 }, + /* 888 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 15 }, + + /* 896 */ { MAD_F(0x0437be65) /* 0.263609310 */, 15 }, + /* 904 */ { MAD_F(0x04449dee) /* 0.266752177 */, 15 }, + /* 912 */ { MAD_F(0x04518733) /* 0.269904329 */, 15 }, + /* 920 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 15 }, + /* 928 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 15 }, + /* 936 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 15 }, + /* 944 */ { MAD_F(0x04858c83) /* 0.282604707 */, 15 }, + /* 952 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 15 }, + /* 960 */ { MAD_F(0x049fc824) /* 0.289009227 */, 15 }, + /* 968 */ { MAD_F(0x04acf402) /* 0.292224893 */, 15 }, + /* 976 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 15 }, + /* 984 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 15 }, + /* 992 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 15 }, + /* 1000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 15 }, + /* 1008 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 15 }, + /* 1016 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 15 }, + + /* 1024 */ { MAD_F(0x050a28be) /* 0.314980262 */, 15 }, + /* 1040 */ { MAD_F(0x05251b73) /* 0.321559381 */, 15 }, + /* 1056 */ { MAD_F(0x054031a0) /* 0.328172327 */, 15 }, + /* 1072 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 15 }, + /* 1088 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 15 }, + /* 1104 */ { MAD_F(0x0592456d) /* 0.348210741 */, 15 }, + /* 1120 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 15 }, + /* 1136 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 15 }, + /* 1152 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 15 }, + /* 1168 */ { MAD_F(0x060190ee) /* 0.375382356 */, 15 }, + /* 1184 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 15 }, + /* 1200 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 15 }, + /* 1216 */ { MAD_F(0x06566361) /* 0.396090870 */, 15 }, + /* 1232 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 15 }, + /* 1248 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 15 }, + /* 1264 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 15 }, + + /* 1280 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 15 }, + /* 1296 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 15 }, + /* 1312 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 15 }, + /* 1328 */ { MAD_F(0x0720a087) /* 0.445465593 */, 15 }, + /* 1344 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 15 }, + /* 1360 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 15 }, + /* 1376 */ { MAD_F(0x07791620) /* 0.467062117 */, 15 }, + /* 1392 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 15 }, + /* 1408 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 15 }, + /* 1424 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 15 }, + /* 1440 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 15 }, + /* 1456 */ { MAD_F(0x0407673f) /* 0.251807447 */, 16 }, + /* 1472 */ { MAD_F(0x04168b05) /* 0.255503674 */, 16 }, + /* 1488 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 16 }, + /* 1504 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 16 }, + /* 1520 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 16 }, + + /* 1536 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 16 }, + /* 1552 */ { MAD_F(0x04630eed) /* 0.274184158 */, 16 }, + /* 1568 */ { MAD_F(0x047285a2) /* 0.277959474 */, 16 }, + /* 1584 */ { MAD_F(0x048209d3) /* 0.281747652 */, 16 }, + /* 1600 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 16 }, + /* 1616 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 16 }, + /* 1632 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 16 }, + /* 1648 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 16 }, + /* 1664 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 16 }, + /* 1680 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 16 }, + /* 1696 */ { MAD_F(0x04f01963) /* 0.308617963 */, 16 }, + /* 1712 */ { MAD_F(0x05000655) /* 0.312506041 */, 16 }, + /* 1728 */ { MAD_F(0x05100000) /* 0.316406250 */, 16 }, + /* 1744 */ { MAD_F(0x0520064f) /* 0.320318516 */, 16 }, + /* 1760 */ { MAD_F(0x0530192e) /* 0.324242764 */, 16 }, + /* 1776 */ { MAD_F(0x0540388a) /* 0.328178922 */, 16 }, + + /* 1792 */ { MAD_F(0x05506451) /* 0.332126919 */, 16 }, + /* 1808 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 16 }, + /* 1824 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 16 }, + /* 1840 */ { MAD_F(0x05813162) /* 0.344041237 */, 16 }, + /* 1856 */ { MAD_F(0x05918e15) /* 0.348035890 */, 16 }, + /* 1872 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 16 }, + /* 1888 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 16 }, + /* 1904 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 16 }, + /* 1920 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 16 }, + /* 1936 */ { MAD_F(0x05e41105) /* 0.368180294 */, 16 }, + /* 1952 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 16 }, + /* 1968 */ { MAD_F(0x060564b1) /* 0.376316732 */, 16 }, + /* 1984 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 16 }, + /* 2000 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 16 }, + /* 2016 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 16 }, + /* 2032 */ { MAD_F(0x064896a7) /* 0.392721798 */, 16 }, + + /* 2048 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 16 }, + /* 2080 */ { MAD_F(0x067b737c) /* 0.405139433 */, 16 }, + /* 2112 */ { MAD_F(0x069d9400) /* 0.413471222 */, 16 }, + /* 2144 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 16 }, + /* 2176 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 16 }, + /* 2208 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 16 }, + /* 2240 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 16 }, + /* 2272 */ { MAD_F(0x074ac575) /* 0.455754717 */, 16 }, + /* 2304 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 16 }, + /* 2336 */ { MAD_F(0x07913641) /* 0.472952132 */, 16 }, + /* 2368 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 16 }, + /* 2400 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 16 }, + /* 2432 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 16 }, + /* 2464 */ { MAD_F(0x041002a1) /* 0.253908756 */, 17 }, + /* 2496 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 17 }, + /* 2528 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 17 }, + + /* 2560 */ { MAD_F(0x04466275) /* 0.267183742 */, 17 }, + /* 2592 */ { MAD_F(0x0458a989) /* 0.271646056 */, 17 }, + /* 2624 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 17 }, + /* 2656 */ { MAD_F(0x047d716a) /* 0.280625739 */, 17 }, + /* 2688 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 17 }, + /* 2720 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 17 }, + /* 2752 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 17 }, + /* 2784 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 17 }, + /* 2816 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 17 }, + /* 2848 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 17 }, + /* 2880 */ { MAD_F(0x05007b49) /* 0.312617576 */, 17 }, + /* 2912 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 17 }, + /* 2944 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 17 }, + /* 2976 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 17 }, + /* 3008 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 17 }, + /* 3040 */ { MAD_F(0x05603321) /* 0.335986261 */, 17 }, + + /* 3072 */ { MAD_F(0x05738c72) /* 0.340710111 */, 17 }, + /* 3104 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 17 }, + /* 3136 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 17 }, + /* 3168 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 17 }, + /* 3200 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 17 }, + /* 3232 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 17 }, + /* 3264 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 17 }, + /* 3296 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 17 }, + /* 3328 */ { MAD_F(0x0610b982) /* 0.379083164 */, 17 }, + /* 3360 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 17 }, + /* 3392 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 17 }, + /* 3424 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 17 }, + /* 3456 */ { MAD_F(0x0660db91) /* 0.398646895 */, 17 }, + /* 3488 */ { MAD_F(0x06750c26) /* 0.403576041 */, 17 }, + /* 3520 */ { MAD_F(0x06894c90) /* 0.408520284 */, 17 }, + /* 3552 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 17 }, + + /* 3584 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 17 }, + /* 3616 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 17 }, + /* 3648 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 17 }, + /* 3680 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 17 }, + /* 3712 */ { MAD_F(0x07041636) /* 0.438497744 */, 17 }, + /* 3744 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 17 }, + /* 3776 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 17 }, + /* 3808 */ { MAD_F(0x07424946) /* 0.453683161 */, 17 }, + /* 3840 */ { MAD_F(0x075722ef) /* 0.458773552 */, 17 }, + /* 3872 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 17 }, + /* 3904 */ { MAD_F(0x078102b8) /* 0.468996735 */, 17 }, + /* 3936 */ { MAD_F(0x079608ae) /* 0.474129372 */, 17 }, + /* 3968 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 17 }, + /* 4000 */ { MAD_F(0x07c04056) /* 0.484436356 */, 17 }, + /* 4032 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 17 }, + /* 4064 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 17 }, + + /* 4096 */ { MAD_F(0x04000000) /* 0.250000000 */, 18 }, + /* 4160 */ { MAD_F(0x04156381) /* 0.255221850 */, 18 }, + /* 4224 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 18 }, + /* 4288 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 18 }, + /* 4352 */ { MAD_F(0x045635cf) /* 0.271047409 */, 18 }, + /* 4416 */ { MAD_F(0x046c083e) /* 0.276375048 */, 18 }, + /* 4480 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 18 }, + /* 4544 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 18 }, + /* 4608 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 18 }, + /* 4672 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 18 }, + /* 4736 */ { MAD_F(0x04dab524) /* 0.303395408 */, 18 }, + /* 4800 */ { MAD_F(0x04f12624) /* 0.308874267 */, 18 }, + /* 4864 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 18 }, + /* 4928 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 18 }, + /* 4992 */ { MAD_F(0x053511cb) /* 0.325456423 */, 18 }, + /* 5056 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 18 }, + + /* 5120 */ { MAD_F(0x0562d694) /* 0.336630420 */, 18 }, + /* 5184 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 18 }, + /* 5248 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 18 }, + /* 5312 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 18 }, + /* 5376 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 18 }, + /* 5440 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 18 }, + /* 5504 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 18 }, + /* 5568 */ { MAD_F(0x0606012b) /* 0.376465960 */, 18 }, + /* 5632 */ { MAD_F(0x061dae96) /* 0.382246578 */, 18 }, + /* 5696 */ { MAD_F(0x06357302) /* 0.388049134 */, 18 }, + /* 5760 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 18 }, + /* 5824 */ { MAD_F(0x0665402d) /* 0.399719406 */, 18 }, + /* 5888 */ { MAD_F(0x067d4896) /* 0.405586801 */, 18 }, + /* 5952 */ { MAD_F(0x06956753) /* 0.411475493 */, 18 }, + /* 6016 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 18 }, + /* 6080 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 18 }, + + /* 6144 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 18 }, + /* 6208 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 18 }, + /* 6272 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 18 }, + /* 6336 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 18 }, + /* 6400 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 18 }, + /* 6464 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 18 }, + /* 6528 */ { MAD_F(0x07724f64) /* 0.465407744 */, 18 }, + /* 6592 */ { MAD_F(0x078b4514) /* 0.471501425 */, 18 }, + /* 6656 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 18 }, + /* 6720 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 18 }, + /* 6784 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 18 }, + /* 6848 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 18 }, + /* 6912 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 19 }, + /* 6976 */ { MAD_F(0x04115aca) /* 0.254236974 */, 19 }, + /* 7040 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 19 }, + /* 7104 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 19 }, + + /* 7168 */ { MAD_F(0x0437be65) /* 0.263609310 */, 19 }, + /* 7232 */ { MAD_F(0x04449dee) /* 0.266752177 */, 19 }, + /* 7296 */ { MAD_F(0x04518733) /* 0.269904329 */, 19 }, + /* 7360 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 19 }, + /* 7424 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 19 }, + /* 7488 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 19 }, + /* 7552 */ { MAD_F(0x04858c83) /* 0.282604707 */, 19 }, + /* 7616 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 19 }, + /* 7680 */ { MAD_F(0x049fc824) /* 0.289009227 */, 19 }, + /* 7744 */ { MAD_F(0x04acf402) /* 0.292224893 */, 19 }, + /* 7808 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 19 }, + /* 7872 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 19 }, + /* 7936 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 19 }, + /* 8000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 19 }, + /* 8064 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 19 }, + /* 8128 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 19 }, +
libmad/rq_short.dat Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/huffman.h =================================================================== --- libmad/huffman.h (nonexistent) +++ libmad/huffman.h (revision 1765) @@ -0,0 +1,66 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: huffman.h,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifndef LIBMAD_HUFFMAN_H +# define LIBMAD_HUFFMAN_H + +union huffquad { + struct { + unsigned short final : 1; + unsigned short hlen : 3; + unsigned short v : 1; + unsigned short w : 1; + unsigned short x : 1; + unsigned short y : 1; + } value; + struct { + unsigned short final : 1; + unsigned short bits : 3; + unsigned short offset : 12; + } ptr; + unsigned short final : 1; +}; + +union huffpair { + struct { + unsigned short final : 1; + unsigned short hlen : 3; + unsigned short x : 4; + unsigned short y : 4; + } value; + struct { + unsigned short final : 1; + unsigned short bits : 3; + unsigned short offset : 12; + } ptr; + unsigned short final : 1; +}; + +struct hufftable { + union huffpair const *table; + unsigned short linbits; + unsigned short startbits; +}; + +extern union huffquad const *const mad_huff_quad_table[2]; +extern struct hufftable const mad_huff_pair_table[32]; + +# endif
libmad/huffman.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/frame.c =================================================================== --- libmad/frame.c (nonexistent) +++ libmad/frame.c (revision 1765) @@ -0,0 +1,467 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: frame.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# include "bit.h" +# include "stream.h" +# include "frame.h" +# include "timer.h" +# include "layer3.h" + +static +unsigned char const bitrate_table_2k[2][15] = { + /* MPEG-1 */ + { 0/2, 32/2, 40/2, 48/2, 56/2, 64/2, 80/2, 96/2, /* Layer III */ + 112/2, 128/2, 160/2, 192/2, 224/2, 256/2, 320/2 }, + + /* MPEG-2 LSF */ + { 0/2, 8/2, 16/2, 24/2, 32/2, 40/2, 48/2, 56/2, /* Layers */ + 64/2, 80/2, 96/2, 112/2, 128/2, 144/2, 160/2 } /* II & III */ +}; + +static +unsigned short const samplerate_table[3] = { 44100, 48000, 32000 }; + +/* + * NAME: header->init() + * DESCRIPTION: initialize header struct + */ +inline void mad_header_init(struct mad_header *header) +{ + header->crc_check = 0; + header->crc_target = 0; +} + +/* + * NAME: frame->init() + * DESCRIPTION: initialize frame struct + */ +inline void mad_frame_init(struct mad_frame *frame) +{ + mad_header_init(&frame->header); + + frame->options = 0; + + frame->overlap = 0; + mad_frame_mute(frame); +} + +/* + * NAME: frame->finish() + * DESCRIPTION: deallocate any dynamic memory associated with frame + */ +inline void mad_frame_finish(struct mad_frame *frame) +{ + mad_header_finish(&frame->header); +} + +/* + * NAME: decode_header() + * DESCRIPTION: read header data and following CRC word + */ +inline static +int decode_header(struct mad_header *header, struct mad_stream *stream) +{ + unsigned int index; + + header->flags = 0; + header->private_bits = 0; + + /* header() */ + + /* syncword */ + mad_bit_skip(&stream->ptr, 11); + + /* MPEG 2.5 indicator (really part of syncword) */ + if (mad_bit_read(&stream->ptr, 1) == 0) + header->flags |= MAD_FLAG_MPEG_2_5_EXT; + + /* ID */ + if (mad_bit_read(&stream->ptr, 1) == 0) + header->flags |= MAD_FLAG_LSF_EXT; + else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { + stream->error = MAD_ERROR_LOSTSYNC; + return -1; + } + + /* layer */ + header->layer = 4 - mad_bit_read(&stream->ptr, 2); + + if (header->layer != 3) { + stream->error = MAD_ERROR_BADLAYER; + return -1; + } + + /* protection_bit */ + if (mad_bit_read(&stream->ptr, 1) == 0) { + header->flags |= MAD_FLAG_PROTECTION; + header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff); + } + + /* bitrate_index */ + index = mad_bit_read(&stream->ptr, 4); + + if (index == 15) { + stream->error = MAD_ERROR_BADBITRATE; + return -1; + } + + if (header->flags & MAD_FLAG_LSF_EXT) + header->bitrate = 2000 * bitrate_table_2k[1][index]; + else + header->bitrate = 2000 * bitrate_table_2k[0][index]; + + /* sampling_frequency */ + index = mad_bit_read(&stream->ptr, 2); + + if (index == 3) { + stream->error = MAD_ERROR_BADSAMPLERATE; + return -1; + } + + header->samplerate = samplerate_table[index]; + + if (header->flags & MAD_FLAG_LSF_EXT) { + header->samplerate /= 2; + + if (header->flags & MAD_FLAG_MPEG_2_5_EXT) + header->samplerate /= 2; + } + + /* padding_bit */ + if (mad_bit_read(&stream->ptr, 1)) + header->flags |= MAD_FLAG_PADDING; + + /* private_bit */ + if (mad_bit_read(&stream->ptr, 1)) + header->private_bits |= MAD_PRIVATE_HEADER; + + /* mode */ + header->mode = 3 - mad_bit_read(&stream->ptr, 2); + + /* mode_extension */ + header->mode_extension = mad_bit_read(&stream->ptr, 2); + + /* copyright */ + if (mad_bit_read(&stream->ptr, 1)) + header->flags |= MAD_FLAG_COPYRIGHT; + + /* original/copy */ + if (mad_bit_read(&stream->ptr, 1)) + header->flags |= MAD_FLAG_ORIGINAL; + + /* emphasis */ + header->emphasis = mad_bit_read(&stream->ptr, 2); + + if (header->emphasis == 2) { + stream->error = MAD_ERROR_BADEMPHASIS; + return -1; + } + + /* error_check() */ + + /* crc_check */ + if (header->flags & MAD_FLAG_PROTECTION) + header->crc_target = mad_bit_read(&stream->ptr, 16); + + return 0; +} + +/* + * NAME: free_bitrate() + * DESCRIPTION: attempt to discover the bitstream's free bitrate + */ +inline static +int free_bitrate(struct mad_stream *stream, struct mad_header const *header) +{ + struct mad_bitptr keep_ptr; + unsigned long rate = 0; + unsigned int pad_slot, slots_per_frame; + unsigned char const *ptr = 0; + + keep_ptr = stream->ptr; + + pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; + slots_per_frame = (header->layer == MAD_LAYER_III && + (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; + + while (mad_stream_sync(stream) == 0) { + struct mad_stream peek_stream; + struct mad_header peek_header; + + peek_stream = *stream; + peek_header = *header; + + if (decode_header(&peek_header, &peek_stream) == 0 && + peek_header.layer == header->layer && + peek_header.samplerate == header->samplerate) { + unsigned int N; + + ptr = mad_bit_nextbyte(&stream->ptr); + + N = ptr - stream->this_frame; + + if (header->layer == MAD_LAYER_I) { + rate = (unsigned long) header->samplerate * + (N - 4 * pad_slot + 4) / 48 / 1000; + } + else { + rate = (unsigned long) header->samplerate * + (N - pad_slot + 1) / slots_per_frame / 1000; + } + + if (rate >= 8) + break; + } + + mad_bit_skip(&stream->ptr, 8); + } + + stream->ptr = keep_ptr; + + if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) { + stream->error = MAD_ERROR_LOSTSYNC; + return -1; + } + + stream->freerate = rate * 1000; + +# if 0 && defined(DEBUG) + fprintf(stderr, "free bitrate == %lu\n", stream->freerate); +# endif + + return 0; +} + +/* + * NAME: header->decode() + * DESCRIPTION: read the next frame header from the stream + */ +int mad_header_decode(struct mad_header *header, struct mad_stream *stream) +{ + register unsigned char const *ptr, *end; + unsigned int pad_slot, N; + + ptr = stream->next_frame; + end = stream->bufend; + + if (ptr == 0) { + stream->error = MAD_ERROR_BUFPTR; + goto fail; + } + + /* stream skip */ + if (stream->skiplen) { + if (!stream->sync) + ptr = stream->this_frame; + + if (end - ptr < stream->skiplen) { + stream->skiplen -= end - ptr; + stream->next_frame = end; + + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } + + ptr += stream->skiplen; + stream->skiplen = 0; + + stream->sync = 1; + } + + sync: + /* synchronize */ + if (stream->sync) { + if (end - ptr < MAD_BUFFER_GUARD) { + stream->next_frame = ptr; + + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } + else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { + /* mark point where frame sync word was expected */ + stream->this_frame = ptr; + stream->next_frame = ptr + 1; + + stream->error = MAD_ERROR_LOSTSYNC; + goto fail; + } + } + else { + mad_bit_init(&stream->ptr, ptr); + + if (mad_stream_sync(stream) == -1) { + if (end - stream->next_frame >= MAD_BUFFER_GUARD) + stream->next_frame = end - MAD_BUFFER_GUARD; + + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } + + ptr = mad_bit_nextbyte(&stream->ptr); + } + + /* begin processing */ + stream->this_frame = ptr; + stream->next_frame = ptr + 1; /* possibly bogus sync word */ + + mad_bit_init(&stream->ptr, stream->this_frame); + + if (decode_header(header, stream) == -1) + goto fail; + + /* calculate frame duration */ + mad_timer_set(&header->duration, 0, + 32 * MAD_NSBSAMPLES(header), header->samplerate); + + /* calculate free bit rate */ + if (header->bitrate == 0) { + if ((!stream->sync || !stream->freerate) && + free_bitrate(stream, header) == -1) + goto fail; + + header->bitrate = stream->freerate; + header->flags |= MAD_FLAG_FREEFORMAT; + } + + /* calculate beginning of next frame */ + pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; + + if (header->layer == MAD_LAYER_I) + N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4; + else { + unsigned int slots_per_frame; + + slots_per_frame = (header->layer == MAD_LAYER_III && + (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; + + N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot; + } + + /* verify there is enough data left in buffer to decode this frame */ + if (N + MAD_BUFFER_GUARD > end - stream->this_frame) { + stream->next_frame = stream->this_frame; + + stream->error = MAD_ERROR_BUFLEN; + goto fail; + } + + stream->next_frame = stream->this_frame + N; + + if (!stream->sync) { + /* check that a valid frame header follows this frame */ + + ptr = stream->next_frame; + if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { + ptr = stream->next_frame = stream->this_frame + 1; + goto sync; + } + + stream->sync = 1; + } + + header->flags |= MAD_FLAG_INCOMPLETE; + + return 0; + + fail: + stream->sync = 0; + + return -1; +} + +/* + * NAME: frame->decode() + * DESCRIPTION: decode a single frame from a bitstream + */ +int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream) +{ + frame->options = stream->options; + + /* header() */ + /* error_check() */ + + if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) && + mad_header_decode(&frame->header, stream) == -1) + goto fail; + + /* audio_data() */ + + frame->header.flags &= ~MAD_FLAG_INCOMPLETE; + + if (frame->header.layer != 3) + goto fail; + if (mad_layer_III(stream, frame) == -1) { + if (!MAD_RECOVERABLE(stream->error)) + stream->next_frame = stream->this_frame; + + goto fail; + } + + /* ancillary_data() */ + + if (frame->header.layer != MAD_LAYER_III) { + struct mad_bitptr next_frame; + + mad_bit_init(&next_frame, stream->next_frame); + + stream->anc_ptr = stream->ptr; + stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame); + + mad_bit_finish(&next_frame); + } + + return 0; + + fail: + stream->anc_bitlen = 0; + return -1; +} + +/* + * NAME: frame->mute() + * DESCRIPTION: zero all subband values so the frame becomes silent + */ +void mad_frame_mute(struct mad_frame *frame) +{ + unsigned int s, sb; + + for (s = 0; s < 36; ++s) { + for (sb = 0; sb < 32; ++sb) { + frame->sbsample[0][s][sb] = + frame->sbsample[1][s][sb] = 0; + } + } + + if (frame->overlap) { + for (s = 0; s < 18; ++s) { + for (sb = 0; sb < 32; ++sb) { + (*frame->overlap)[0][sb][s] = + (*frame->overlap)[1][sb][s] = 0; + } + } + } +}
libmad/frame.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/stream.c =================================================================== --- libmad/stream.c (nonexistent) +++ libmad/stream.c (revision 1765) @@ -0,0 +1,116 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: stream.c,v 1.3 2001-11-06 17:01:28 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "global.h" + +# include "bit.h" +# include "stream.h" + +/* + * NAME: stream->init() + * DESCRIPTION: initialize stream struct + */ +inline void mad_stream_init(struct mad_stream *stream) +{ + stream->buffer = 0; + stream->bufend = 0; + stream->skiplen = 0; + + stream->sync = 0; + stream->freerate = 0; + + stream->this_frame = 0; + stream->next_frame = 0; + mad_bit_init(&stream->ptr, 0); + + mad_bit_init(&stream->anc_ptr, 0); + stream->anc_bitlen = 0; + + stream->main_data = 0; + stream->md_len = 0; + + stream->options = 0; + stream->error = 0; +} + +/* + * NAME: stream->finish() + * DESCRIPTION: deallocate any dynamic memory associated with stream + */ +inline void mad_stream_finish(struct mad_stream *stream) +{ + mad_bit_finish(&stream->anc_ptr); + mad_bit_finish(&stream->ptr); +} + +/* + * NAME: stream->buffer() + * DESCRIPTION: set stream buffer pointers + */ +inline void mad_stream_buffer(struct mad_stream *stream, + unsigned char const *buffer, unsigned long length) +{ + stream->buffer = buffer; + stream->bufend = buffer + length; + + stream->this_frame = buffer; + stream->next_frame = buffer; + + stream->sync = 1; + + mad_bit_init(&stream->ptr, buffer); +} + +/* + * NAME: stream->skip() + * DESCRIPTION: arrange to skip bytes before the next frame + */ +static void mad_stream_skip(struct mad_stream *stream, unsigned long length) +{ + stream->skiplen += length; +} + +/* + * NAME: stream->sync() + * DESCRIPTION: locate the next stream sync word + */ +int mad_stream_sync(struct mad_stream *stream) +{ + register unsigned char const *ptr, *end; + + ptr = mad_bit_nextbyte(&stream->ptr); + end = stream->bufend; + + while (ptr < end - 1 && + !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) + ++ptr; + + if (end - ptr < MAD_BUFFER_GUARD) + return -1; + + mad_bit_init(&stream->ptr, ptr); + + return 0; +}
libmad/stream.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: libmad/Makefile =================================================================== --- libmad/Makefile (nonexistent) +++ libmad/Makefile (revision 1765) @@ -0,0 +1,59 @@ +CC = or32-rtems-gcc +AS = or32-rtems-as +AR = or32-rtems-ar +RUNLIB = or32-rtems-ranlib + +LIBMAD_OBJ = fixed.o \ + bit.o \ + timer.o \ + stream.o \ + frame.o \ + synth.o \ + decoder.o \ + layer3.o \ + huffman.o + +CC_OPTS = -DHAVE_CONFIG_H -DFPM_DEFAULT -fno-delayed-branch -Wall -nostdlib \ + -g -O -fforce-mem -fforce-addr -fthread-jumps -fcse-follow-jumps \ + -fcse-skip-blocks -fexpensive-optimizations -fregmove -fschedule-insns2 \ + -I. -I./../ + +all: libmad.a + +libmad.a: $(LIBMAD_OBJ) + $(AR) cru libmad.a $(LIBMAD_OBJ) + $(RUNLIB) libmad.a + +fixed.o: fixed.c config.h global.h fixed.h + $(CC) $(CC_OPTS) -c -o fixed.o fixed.c + +bit.o: bit.c config.h global.h bit.h + $(CC) $(CC_OPTS) -c -o bit.o bit.c + +timer.o: timer.c config.h global.h timer.h + $(CC) $(CC_OPTS) -c -o timer.o timer.c + +stream.o: stream.c config.h global.h bit.h stream.h + $(CC) $(CC_OPTS) -c -o stream.o stream.c + +frame.o: frame.c config.h global.h bit.h stream.h frame.h fixed.h timer.h layer3.h + $(CC) $(CC_OPTS) -c -o frame.o frame.c + +synth.o: synth.c config.h global.h fixed.h frame.h timer.h stream.h bit.h synth.h \ + ../audio.h mad.h D.dat + $(CC) $(CC_OPTS) -c -o synth.o synth.c + +decoder.o: decoder.c config.h global.h stream.h bit.h frame.h fixed.h timer.h \ + synth.h decoder.h + $(CC) $(CC_OPTS) -c -o decoder.o decoder.c + +layer3.o: layer3.c config.h global.h fixed.h bit.h stream.h frame.h timer.h \ + huffman.h layer3.h rq_short.dat imdct_s.dat + $(CC) $(CC_OPTS) -c -o layer3.o layer3.c + +huffman.o: huffman.c config.h global.h huffman.h + $(CC) $(CC_OPTS) -c -o huffman.o huffman.c + +clean: + rm -rf $(LIBMAD_OBJ) libmad.a *~ *.bak +
libmad/Makefile Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: fsyst.c =================================================================== --- fsyst.c (nonexistent) +++ fsyst.c (revision 1765) @@ -0,0 +1,102 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifndef EMBED +# include +# include +#else +# warning assert checking disabled +# define assert(x) +#endif + +#include "fsyst.h" + +/* Return next file. */ + +inline struct file_struct * +next_file (struct file_struct *file) { + return (struct file_struct *)((unsigned char *)file + swap(file->length)); +} + +/* Returns file, that holds track number. */ + +struct file_struct * +find_track_no (int no, struct file_struct *root) { + assert(swap(root->type) == FT_ROOT); + while (swap(root->type) != FT_END) { + if (swap(root->type) == FT_TRACK_NO && swap(root->data[0]) == no) + return root; + root = next_file (root); + } + return 0; +} + +/* Returns track name from file struct, pointing at FT_TRACK_NO. */ + +char * +track_name (struct file_struct *fs) { + assert(swap(fs->type) == FT_TRACK_NO); + fs = next_file (fs); + if (swap(fs->type) == FT_TRACK_NAME) + return (char *)&fs->data[0]; + else + return ""; +} + +/* Returns track data from file struct, pointing at FT_TRACK_NO. */ + +struct file_struct * +track_data (struct file_struct *fs) { + assert(swap(fs->type) == FT_TRACK_NO); + fs = next_file (fs); + if (swap(fs->type) == FT_TRACK_NAME) + fs = next_file (fs); + assert (swap(fs->type) == FT_TRACK_DATA); + return fs; +} + +/* Finds last record. */ + +inline struct file_struct * +end_file (struct file_struct *root) { + assert(swap(root->type) == FT_ROOT); + while (swap(root->type) != FT_END) + root = next_file (root); + return root; +} + +/* Adds file to the end of file list. Returns new file address, if + sucessful, otherwise NULL. */ + +struct file_struct * +add_file (struct file_struct *root, struct file_struct *file) { + struct file_struct *end = end_file (root); + memcpy (end, file, file->length); + file = end; + end = next_file (end); + end->type = swap(FT_END); + end->length = swap(0); + return file; +} + +/* Initializes filesystem at root. */ + +void +init_fsyst (struct file_struct *root) { + root->type = swap(FT_ROOT); + root->length = swap(sizeof (struct file_struct) - sizeof (unsigned int)); + root = next_file (root); + root->type = swap(FT_END); + root->length = swap(0); +} + +#ifndef EMBED +unsigned int swap (unsigned int x) { + return (x & 0xFF) << 24 + | (x & 0xFF00) << 8 + | (x & 0xFF0000) >> 8 + | (x & 0xFF000000) >> 24; +} +#endif +
fsyst.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: config.h =================================================================== --- config.h (nonexistent) +++ config.h (revision 1765) @@ -0,0 +1,100 @@ +/* config.h. Generated automatically by configure. */ +/* config.h.in. Generated automatically from configure.in by autoheader. */ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: config.h,v 1.6 2001-11-06 17:01:07 simons Exp $ + */ + +# ifndef CONFIG_H +# define CONFIG_H + +/***************************************************************************** + * Definitions selected automatically by `configure' * + *****************************************************************************/ + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define if you don't have vprintf but do have _doprnt. */ +/* #undef HAVE_DOPRNT */ + +/* Define if you have a working `mmap' system call. */ +/* #undef HAVE_MMAP */ + +/* Define if you have the vprintf function. */ +/* #undef HAVE_VPRINTF */ + +/* Define as __inline if that's what the C compiler calls it. */ +/* #undef inline */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to be the name of your default audio output module. */ +#define AUDIO_DEFAULT audio_null + +/* Define if you have mmap() and you want to use it. */ +#define USE_MMAP 1 + +/* Define to enable diagnostic debugging support. */ +/* #undef DEBUG */ + +/* Define to disable debugging assertions. */ +/* #undef NDEBUG */ + +/* Define to enable experimental code. */ +/* #undef EXPERIMENTAL */ + +#define EMBED 1 + +/* Define to enable pcm output trogh or1ksim simulator */ +/*#define OR1K_SIM 1*/ + +/* Define if you have the getpagesize function. */ +/* #undef HAVE_GETPAGESIZE */ + +/* Define if you have the madvise function. */ +/* #undef HAVE_MADVISE */ + +/* Define if you have the strcasecmp function. */ +#define HAVE_STRCASECMP 1 + +/* Define if you have the strncasecmp function. */ +#define HAVE_STRNCASECMP 1 + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have the efence library (-lefence). */ +/* #undef HAVE_LIBEFENCE */ + +/* Name of package */ +#define PACKAGE "mad" + +/* Version number of package */ +#define VERSION "0.13.0b" + +/***************************************************************************** + * End of automatically configured definitions * + *****************************************************************************/ + +# endif
config.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: fsyst.h =================================================================== --- fsyst.h (nonexistent) +++ fsyst.h (revision 1765) @@ -0,0 +1,56 @@ + + +/* Where does filesystem start */ +extern unsigned char *root_file; +#define ROOT_FILE ((struct file_struct *)root_file)//0x20000) + +enum enum_file_type { + /* Must be first file. */ + FT_ROOT, + /* Track number. */ + FT_TRACK_NO, + /* Track name. */ + FT_TRACK_NAME, + /* Track data. */ + FT_TRACK_DATA, + /* Last record. */ + FT_END +}; + +struct file_struct { + /* Length of file, including header. */ + unsigned int length; + + /* File type. */ + enum enum_file_type type; + + /* Actual file data. */ + unsigned int data[1]; +}; + +#define HEADER_SIZE (sizeof (struct file_struct) - sizeof (unsigned int)) + +/* Returns file, that holds track number. */ +extern struct file_struct *find_track_no (int no, struct file_struct *root); + +/* Returns track name from file struct, pointing at FT_TRACK_NO. */ +extern char *track_name (struct file_struct *fs); + +/* Returns track data from file struct, pointing at FT_TRACK_NO. */ +extern struct file_struct *track_data (struct file_struct *fs); + +/* Finds last record. */ +extern struct file_struct * end_file (struct file_struct *root); + +/* Adds file to the end of file list. Returns new file address, if + sucessful, otherwise NULL. */ +extern struct file_struct *add_file (struct file_struct *root, + struct file_struct *file); +/* Initializes filesystem at root. */ +extern void init_fsyst (struct file_struct *root); + +#ifdef EMBED +#define swap(x) (x) +#else +extern unsigned int swap (unsigned int x); +#endif
fsyst.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: acconfig.h =================================================================== --- acconfig.h (nonexistent) +++ acconfig.h (revision 1765) @@ -0,0 +1,73 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: acconfig.h,v 1.3 2001-11-06 17:01:07 simons Exp $ + */ + +# ifndef CONFIG_H +# define CONFIG_H + +/***************************************************************************** + * Definitions selected automatically by `configure' * + *****************************************************************************/ +@TOP@ + +/* Define to the name of the distribution. */ +#undef PACKAGE + +/* Define to the version of the distribution. */ +#undef VERSION + +/* Define to be the name of your default audio output module. */ +#define AUDIO_DEFAULT 0 + +/* Define if you have mmap() and you want to use it. */ +#undef USE_MMAP + +/* Define to 1 if NLS is requested. */ +#undef ENABLE_NLS + +/* Define as 1 if you have catgets and don't want to use GNU gettext. */ +#undef HAVE_CATGETS + +/* Define as 1 if you have gettext and don't want to use GNU gettext. */ +#undef HAVE_GETTEXT + +/* Define if your locale.h file contains LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define as 1 if you have the stpcpy function. */ +#undef HAVE_STPCPY + +/* Define to enable diagnostic debugging support. */ +#undef DEBUG + +/* Define to disable debugging assertions. */ +#undef NDEBUG + +/* Define to enable experimental code. */ +#undef EXPERIMENTAL + +#undef EMBED + +@BOTTOM@ +/***************************************************************************** + * End of automatically configured definitions * + *****************************************************************************/ + +# endif
acconfig.h Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: audio_oss.c =================================================================== --- audio_oss.c (nonexistent) +++ audio_oss.c (revision 1765) @@ -0,0 +1,163 @@ +/* + * mad - MPEG audio decoder + * Copyright (C) 2000-2001 Robert Leslie + * + * 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 + * + * $Id: audio_oss.c,v 1.3 2001-11-06 17:01:07 simons Exp $ + */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +#ifndef EMBED +# include +# include +# include +# include +# include + +# include "mad.h" +# include "audio.h" + +# if !defined(AFMT_S32_NE) +# if defined(WORDS_BIGENDIAN) +# define AFMT_S32_NE AFMT_S32_BE +# else +# define AFMT_S32_NE AFMT_S32_LE +# endif +# endif + +# if !defined(AFMT_S16_NE) +# if defined(WORDS_BIGENDIAN) +# define AFMT_S16_NE AFMT_S16_BE +# else +# define AFMT_S16_NE AFMT_S16_LE +# endif +# endif + +# if !defined(SNDCTL_DSP_CHANNELS) && defined(SOUND_PCM_WRITE_CHANNELS) +# define SNDCTL_DSP_CHANNELS SOUND_PCM_WRITE_CHANNELS +# endif + +# define AUDIO_DEVICE "/dev/dsp" + +static int sfd; +static unsigned int (*audio_pcm)(unsigned char *, unsigned int, + mad_fixed_t const *, mad_fixed_t const *); +inline static +int init(struct audio_init *init) +{ + if (init->path == 0) + init->path = AUDIO_DEVICE; + + sfd = open(init->path, O_WRONLY); + if (sfd == -1) { + audio_error = ":"; + return -1; + } + + return 0; +} + +inline static +int config(struct audio_config *config) +{ + int format; + + if (ioctl(sfd, SNDCTL_DSP_SYNC, 0) == -1) { + audio_error = ":ioctl(SNDCTL_DSP_SYNC)"; + return -1; + } + + format = AFMT_S16_NE; + + if (ioctl(sfd, SNDCTL_DSP_SETFMT, &format) == -1) { + audio_error = ":ioctl(SNDCTL_DSP_SETFMT)"; + return -1; + } + + audio_pcm = audio_pcm_s16le; + + if (ioctl(sfd, SNDCTL_DSP_CHANNELS, &config->channels) == -1) { + audio_error = ":ioctl(SNDCTL_DSP_CHANNELS)"; + return -1; + } + + if (ioctl(sfd, SNDCTL_DSP_SPEED, &config->speed) == -1) { + audio_error = ":ioctl(SNDCTL_DSP_SPEED)"; + return -1; + } + + return 0; +} + +inline +int output_s(unsigned char const *ptr, unsigned int len) +{ + while (len) { + int wrote; + + wrote = write(sfd, ptr, len); + if (wrote == -1) { + if (errno == EINTR) { + printf("."); + continue; + } + else { + audio_error = ":write"; + return -1; + } + } + + ptr += wrote; + len -= wrote; + } + + return 0; +} + +inline static +int finish(struct audio_finish *finish) +{ + int result = 0; + + if (close(sfd) == -1 && result == 0) { + audio_error = ":close"; + result = -1; + } + + return result; +} + +inline int audio_oss(union audio_control *control) +{ + audio_error = 0; + + switch (control->command) { + case AUDIO_COMMAND_INIT: + return init(&control->init); + + case AUDIO_COMMAND_CONFIG: + return config(&control->config); + + case AUDIO_COMMAND_FINISH: + return finish(&control->finish); + } + + return 0; +} +#endif
audio_oss.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: memcpy.c =================================================================== --- memcpy.c (nonexistent) +++ memcpy.c (revision 1765) @@ -0,0 +1,116 @@ +/* +FUNCTION + <>---copy memory regions + +ANSI_SYNOPSIS + #include + void* memcpy(void *<[out]>, const void *<[in]>, size_t <[n]>); + +TRAD_SYNOPSIS + void *memcpy(<[out]>, <[in]>, <[n]> + void *<[out]>; + void *<[in]>; + size_t <[n]>; + +DESCRIPTION + This function copies <[n]> bytes from the memory region + pointed to by <[in]> to the memory region pointed to by + <[out]>. + + If the regions overlap, the behavior is undefined. + +RETURNS + <> returns a pointer to the first byte of the <[out]> + region. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + memcpy ansi pure + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef EMBED +#include <_ansi.h> +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* How many bytes are copied each iteration of the 4X unrolled loop. */ +#define BIGBLOCKSIZE (sizeof (long) << 2) + +/* How many bytes are copied each iteration of the word copy loop. */ +#define LITTLEBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the byte copier. */ +#define TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE) + +_PTR +_DEFUN (memcpy, (dst0, src0, len0), + _PTR dst0 _AND + _CONST _PTR src0 _AND + size_t len0) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *dst = (char *) dst0; + char *src = (char *) src0; + + _PTR save = dst0; + + while (len0--) + { + *dst++ = *src++; + } + + return save; +#else + char *dst = dst0; + _CONST char *src = src0; + long *aligned_dst; + _CONST long *aligned_src; + int len = len0; + + /* If the size is small, or either SRC or DST is unaligned, + then punt into the byte copy loop. This should be rare. */ + if (!TOO_SMALL(len) && !UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* Copy 4X long words at a time if possible. */ + while (len >= BIGBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + len -= BIGBLOCKSIZE; + } + + /* Copy one long word at a time if possible. */ + while (len >= LITTLEBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + len -= LITTLEBLOCKSIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (len--) + *dst++ = *src++; + + return dst0; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} +#endif
memcpy.c Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: Makefile =================================================================== --- Makefile (nonexistent) +++ Makefile (revision 1765) @@ -0,0 +1,71 @@ +CC = or32-rtems-gcc +AS = or32-rtems-as +AR = or32-rtems-ar +RUNLIB = or32-rtems-ranlib + +SUBDIRS = libmad + +MAD_OBJ = reset.o \ + minimad.o \ + fsyst.o \ + audio_oss.o \ + audio.o \ + memcpy.o \ + memmove.o \ + flash.o + + +CC_OPTS = -DHAVE_CONFIG_H -fno-delayed-branch -Wall -nostdlib \ + -I. -I./libmad/ + +#LD_OPTS = -T xess.ld -L/home/simons/or1k/lib/gcc-lib/or32-rtems/2.95.2/ +LD_OPTS = -T xess.ld + +all: + @set fnord $(MAKEFLAGS); amf=$$2; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + $(MAKE) $(AM_MAKEFLAGS) "minimad" || exit 1; \ + +minimad: $(MAD_OBJ) libmad/libmad.a + $(CC) $(LD_OPTS) -o minimad $(MAD_OBJ) libmad/libmad.a + +reset.o: reset.S + $(CC) $(CC_OPTS) -c -o reset.o reset.S + +minimad.o: minimad.c config.h audio.h libmad/mad.h fsyst.h + $(CC) $(CC_OPTS) -c -o minimad.o minimad.c + +fsyst.o: fsyst.c config.h fsyst.h + $(CC) $(CC_OPTS) -c -o fsyst.o fsyst.c + +audio_oss.o: audio_oss.c config.h + $(CC) $(CC_OPTS) -c -o audio_oss.o audio_oss.c + +audio.o: audio.c config.h audio.h libmad/mad.h + $(CC) $(CC_OPTS) -c -o audio.o audio.c + +memcpy.o: memcpy.c config.h _ansi.h + $(CC) $(CC_OPTS) -c -o memcpy.o memcpy.c + +memmove.o: memmove.c config.h + $(CC) $(CC_OPTS) -c -o memmove.o memmove.c + +flash.o: flash.c config.h + $(CC) $(CC_OPTS) -c -o flash.o flash.c + + +clean: + @set fnord $(MAKEFLAGS); amf=$$2; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + rm -rf $(MAD_OBJ) minimad *~ *.bak +
Makefile Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: songs/Beethoven-Symphony_No_5_in_C_Minor-16.mp3 =================================================================== --- songs/Beethoven-Symphony_No_5_in_C_Minor-16.mp3 (nonexistent) +++ songs/Beethoven-Symphony_No_5_in_C_Minor-16.mp3 (revision 1765) @@ -0,0 +1,2525 @@ + H""PUËxz"' Ows AF '$C /_24ʧ?H܂,.;&XuOz. *t8ik4$";+ ДVԅyb VJF&p)H" +:!wSS/[ ,A" +ҹ`qPȆǣn7,N{?|[9  *aq*NT†ecF~c;zu@b  !&͐Hq Ç`+eMѤdV[,}Pp7tL  ɐYHvaBGlC^JTM{a2,ǀ3HM$" YpHEq uYcj F5nUGUy +Q&zqӀ(:~8m7_c4C +E\,:r  ִbpJޠPw/Js#ΰ3]Voɀ"l!6$㴖i= +  +*zPqԂǛb262TMf@.[HC^], @6Q"`Hp +@3!htfj+Sh-'X9t +*ɐyDp؆xzx:,+X4<6MvإY + pyDp2 {M&gTZ)w=@FIvجCd ִxp[+p=4s7{ztE%.`" .XyqXV4cL#Zv8!Lv!k = H *͸IFqh~rzLpxL!<HX"EH/f "zqBO`g97F̥fY.n\-7< j챢 +(ZpD]ڜvWf Q9iX6" +X0qaHwv}2

6Xtris bVH~P&`M|HTѰAej  +͐`qϨG[=p B}N?`@ B:TՎq_ J  *8aqN2ퟱ+ݙ,Y2i)" +g6P" XIq3@ +0 +·4lm;[[O9&0 j(JL(zd(Sty1!O:yTud + +8K +L)T8~ :lMk 05"K + f(B(lEt7|)@(kנ"ِIL} +2QaN8 Pa 0OZ$ ѐIL(traX7FFk 6Ma!5ӏЉBYM  ٘1DpTWǵqI#= +R| xJp|Jֲ]j8y V'_J?"" Y +0q"LsKF7`ʟr+id$Y}F-UOML $ JNLPlbsIjl l +rq=f(Y*]&e + &HHr@8x@Ps[{q@뢝Y +  +ٸHpYEب||͆^ᛵa#"-yp;m!1oQNZNٰA=[Ԥ~G@'Iw 1 ѐIDp#׼/וp@hb WGr^ScqQ5 3 fѐK(DwH_&3S?GW +pJ(NZ= 5 !&zDqzfk_t`L>A5xCH 7zph߹G:p: +ts":`ap>GG܉Rޯ3 z@m?0'Gto_D @ JIqfn8>#+lXBYD.g'|+s\ BaJp,ݬˀ`9YLJ2Υ#.{, G Ƽapab;Cd wʘTXb"I HX0pdt;>Pԗ`XtVyB + KЦɐYL<DtjgG::9(WoP$a0 N ! +X0p- K1חECH +HY#CG P ! +pIp uM@A庐?}i3z\(0|A(#"R YŐ1pRVT6B DrȭKazAm TIL^;\MP~4ecة%))/}}OR [ɐYLN4ŸqXiی B +5ݱ< ^hzDLؿs_Jv8]`!R#CT]J3rʙNξXf +"cpbJL7|A߳Kt[NƳmCP=w3>c/ݭ^ i *ј1DpsBL7 ť!$_# +p5SUsNeۄr`6] kbp<||i!B# +f7.X}ŷd~w n zp-4++"}I*1Cfp.D"q ƼYpQXnV@}TwB9gS@|1 tJpZU: +uv D{~Bp>R xμbpӵB57MAE'?98pT2HJ { zL +Y J T͆+-we15 AqRU"}ɐHp3 +eN$sXxEC|zmDDu āiŐHpXaصiCzsFэTpM Ć^ŐJ(79 wP9e|h7g ĉ0ƸHp\ cFoHZFSw"ďILV4*9LN0/&6j+`F~_ß8 ēJp#E c%va?@X*1CiH ėYprE0/ An%QZ^%)7SĄ90eH5+ ě &IDqy&~^B5">ȪҟYh$D/ "ĝ +Zp_.T$ +jzk[{*׉(i Ġ ɐYLBBxJutoh8}8fPS ģ ɘXp]ί4-۵0H: Sx ĥ yDp3DZ+~ +a@ } =HV"Ĩθyp{39tRKbFQʅ@ lK) + Ĭ&zq}4O\%\0<l{g$:Dǚ\) į ! +IDpYԓC[oDt)3ஃ_M>~@ ı ŘIDq4\tl\p1C^'Muph7mbs,f~."ij  +bpzD= +:T}$m*/},i;YX ĶxYNLCULFi.yn\bjΧ78^_3 yAk Ļ (yLmX](2t2TܣЀ,<8l%g ľ zpG^؈>?迆ឱ + 3fEÊ" Jp4_ ס[vϝba+`Z ʼaDpݙ^Sz}[#RjsJUѬ pƴbp~ڒdH|;Sba ,9ƃ>|o xZL*z +K QiY0~ m\kX Pr:" Y +pIDpm?vD鄺M 2?NW|%eꮴ zpjH/v39Z("AB??  +zDpkj  䌡 o"GAҔK xXp,8 .:BL<8(UgSsR߾ ЪxLߢWP\$IKJFqB5N}(#owݣ>+" APiDq &T EOXQ H!kQܔOE + zp@ஂj#_F<`EKlkq& \i YDpr`0MAp:\3\bl+ hPZqGw@"qPnV{H<|\" +1*Hp++հ[G- Ccm̿ (bDqJJlŽ +F7\>E bpT@ `4N1E +P#`nGW ئzLN*Đ$@ԕK;")իv'g7IZl" &XIDqþ3; + 5QQJ +|-DL΂ +'N ưPypS<=]JW܍%a&ksJ~ n +*aFq"75&5RC}ln^$ +x!§ ΠzFpLf^@,q.Iso9#~N\%" *IDp02A@(¥s2N VPߏΙK +cqdea)FS)5qTa0;\c853 (zLD3ǀ0#Md( cF4u0JC~ zp2^혣u+<<Rz–vE"|" +YDL.2a(f͵2 H76nFF{'ڳ aL$,(OD]*d-㢞 +g",.$ + zNLdr4cN $r0,$y=Up39 ʜ0zp^ĪuZ}ٕyN'=w!" + zqH7M}?3P_pyjՁFhG +ӕ ƶDG XL "k4|IuŔ,H^ghpU <DH a0zqЀ,Dϓ?!Gqa*!Iы Ftq %E[Hbaf]@InY7MJ#a"ĬNqk񵘲#SM (&P𭄊3>נJ }0Mfo@s 9 ^|L9 āILVH&@)aˎfvox8an(/ddlS;u ć +yq-2I?@'uCH; ĐNJL%tG>fK8U ;'ɄB/\Vu? ė +ִbDqM MA +V*`Ledt5lOu Ē *zsP$t +".@','L'qVE\ +"Ċ *Yp \vJUY@sRy US"wC-f3 Ċ !*XqDmw-`;@0O C"{s ČvIImic+&~d 9f_J6\܏+UD ď`vaH# Rab@հDQ-%3Qyxmfhf"Ĕ +zp +a, |լ4i!*rZ5] č +y.ѐ0q_j\ +8E mF{tTWSQ ĊJDL5ސLpHZeK N"Vmy ĎrٸIH";vX*xB>]A9 +{EcYI"Ē.Hs'Z9r`* +B"]vsC +Gs|S Ė `pީYwSgWy*빎PDҍO Ę 8ap3[P<\`,p^h5ZQo[ӉQd>-` Ě "(zFq9pVIJBM˔!ibL( 8"Ē bK)~mzP{VHYYO_-$R Ėzp-n2\Op_lk5ޏPe ĚILуڴPpLpy;`}]JH +RIGKU Ğ(Hpkq>B˟WS5w,,(׀4M; ġ Hp0Bv֫|^53CX$NQ%.h!{'c!w"ģ A6(`qKs0m՟MŮNƽ(or!IwM$µ Ħ P`p%uN^}3⺌<=@ [_%Zby ĩ zL/&ro +w(Ԁ̭PmX?yQPڳrU ĬXHpJUo>-RV!J)QA??^mn "į IbDpdTT!V'9Eд4"a]W.` ı{Dp'C`){x8ۜW2ܟ_Oʀ ĵbDp0ا-: ` c3nZ?\veC@H"ĺ @BpB ^*dV:˯էuɀci Ľ2p͢ċq:o߶Ӄ3Hۈ ZpHsY93ko]WFvӧ@|q !6aDqH1du?"<?K[‐p8E""ѐXpCt'oo'%ػ%@ +#TU Ő2 +ppQFة)~L"pNQĩSx >ѐIDq>`F/mf@e;/FPh?z :pJq{XO}NtUTh{ZmьQ2KA"j" Q:ŘIqb} n&\RN`J |GK2 ɐ2pgC EPǨNdDNRr +z) :ɐIDqh-@nM 8!c֦Tw;D_ pIDpstA@qUm,S!9KD^" 16xIDqlM.YE<}f;: '> +ޔ`Q {LoA8@A/-v!6ղT;{ јIDp#i@$aѲ)6R +$#vUoa 6͘Yqo@ev79 QphbTJBG.K" +x{Dq]F@鈮N$&g`VJcTkNb @ pzDLW@$!,#UV{quW:x3)pOx +:xbqFoJ*,sm%8%E⏮LCYKi :8Hq[=7@(<0|MqN@T=]jP۾" + xJpo01wYfe3AH2 +z. +F3 (IDr/h$*TnXV1g +B\WP0[G ڴzpjJ԰ß.*yqg? 8^ab6%t 6ŘXqUڥp霤oLHaҴ6^G{cC~Rȶ>" +6ɘIDqQpae%ݎ(Qf h!R2Mx%dU IpțUGX +"=ZW#* f[3 2Iꡛ" cDp%d):Cym+'q 3:(>Ww Jp$K"Q,Uqo +5^m5" 6PyqNyh ` +2"ņm6ַ$ ; }WPq +9:yqgσ + sXb BEB9Y+w1߿ 6`q` +( / A!{YP!33dΎF9 xpG%lA@4lm* Y]a^v݄^3z" 9:ոHqkPw + jX(692oHw_I +!6asTD%4 +*@#34z>#* miKYu6 Zpzx@:y^w B _L{6' Jp@]J +i'k.f1t}4v֥[ϜK" +Q68bqS7E~B08P?ï|G2¯zݥ :IDq`):ni/ hh!.hM;-7 6YDqkڢ"0w,Xx U/I!@YF(_b7f5 6aqq%c +gɪ@YovJA yJpđ`p +/{ `ls)Kl( +/V?" +Q6xq=hB@Ә|=o$:%-Hfs~WU'~6 `yL $NNv1Եu7\p>sr +>yq̀08b*i-H،ת[|1~ ޽yDpD:;uYS\hߪz +>XJqnd+jW P=*8U|/Q0Uj.Ȃ5 ap|M>4T"y&3AAs!vdPkSIu3 +!:aq(@ȦhY-|t4ȡolη|p$j}?" +>JDq K(\{o@ AScCAYaVq' Xfc(_! +8] +^2Y!YU +1z +p~lwx$uu(kV'=>wP[h +Y6jqE߀L;T~+M{2wiwM'" P͸9FpGPYP)[Rtb,c +AUN뙪ÚY ްZp S6NٽyX(}nxkeЯ +:XbquЀaۥCTۮ̌]6v]S')JqM :Řbq$$5|FvÆ2,`blnުA~" 6ɘyqQ-S"e@:Skhqma@zRʄ_ 6zJqr p\+-XC$bGjY|#h M + ɐYDp&0Adc` +WCm~ +a6{JqaJ̀(v 3ݠVT}@վPX*,6Q" x޸{Dp낼TB,*@+`Gc-6 \FK +V(? +Q:8yDq@ٶ W ]ժk/v7 + X0pv'u dNfa+ A=Gjs :8Hq@.UPaK @z8PU7/;J" c +q+poqD;; S^3k<7}kƵ- xZNLQ|:O[i:mLNjP,7?kO|W? (bNL +$ n$MX;9 +NdI +P2DpKY@@HM:pj ]9F{ze" Q6IDq@ %j{t'tmhc4]߶QvvTn +!:pbq*4|:z`ю)+hdӛ5ut {L_ +\sɉPH!+7^&\T {M + 4Hi!ڕF,ܣkOa ؀" +`8{ +LřX>T,20 &ؤ5!+A(!@) bpr> u1 i +L T%ZT~ ޸xaDp݄\ XN?P'ЂdBb! +8yprh\T%w5_{{_" +XzDpx ʹ>#Rjqj)8ibmB~ XaDpNOD* wzƤ1 J+5#.[a>U ڝpzDpu*RQJ")f~B' +>aqڼ1ꋌGv:B(a~ l!B" XYp}[ 6MЩ(TGg9<,wEފ zp+P`=M@~BPڶUݒr~ +2 :0yq] pǀhPEdz6;cA֎4 ژ8{Jpy`1'n 7^^k};fj" +A:cDqw  dxNq;/0y)Wu >XIqwxc5E1U4kIVjb e}ʎ3 ypfxhX%,@DI\б0!jXPV 6xqp }VϤCC;|x6o7J=@ xyDp?GPl'vMNop/w2D +WLw"K"`pQ*NԠqNHd!A ~"C꫓S +Y:zq Y4smĂ5vAzDc pzNLH?JŃe]#)F`􀟉yK |zJL20;G.̆# %d:ƙ^xn" (ބyp@vK@ij)[3}! ^ +`|Lrq9~Pθ9_8B^&{g 8^{()Cd$`P +TKn8ZuBP] f{ +)Q`x;ChMD 7 QI^G H G" +HapAȜ%@ypTܪE2?6!o "HqpԚVa $*4 7CVN8.g*8f aDr` b4Cc3ڹua +`aFpLɀARY κ}Ь]Ro7d`C" H|zp9B n9:P[n Ҏ8lE1a%DŽo !BIq;* X_eDD + +x/m-~ +FM@ !&Hp)X%亖W)4. *=(*o[t $ bpwM"ݥ`@hl&J9$GQ)x+Gڊ]I3)o^" H}cDpG!0  ),og_ԥ"W &aDp90B,~R0 *XIDqf~~`!0si}g_E" +A&0IJp˃\x4l`(%]-P:w+]|}[j) +PIDp)I߰|a +4 -=D'&v7OG NV]  +YpFP0Dw>:CQQ֏[:Ĺ( +8ʖbp5_H@17[y|mO"" +YJcDq7dؒpu{Yq,MMkj  +01p*@b̍ +A3 _7t+3Z?ѰET +a"Jq9,@.U|.13;%`5qg +z7 ʌ[Dp Q-xy 9p0C %$7ˀr4Q" [JrDd ZQ :OMI JXAq]{;"!:6YCy9 P?_O?׬0 +i0[Dp΀!# +(o;Q(`ꎚ XCDpم\ pKE)@",]HK~zpH#" *xIp/  mEn"\Q ֓7S+= L2倴B@r2 :L:tVW AJp x`G@) n#pP0A?֢ + cDqeG7(*6oâ_~Y*" +!"XIqBŊp@Z7)X߆b/£-'DoDs RpYAU#Mڧ KI/qg>3fs7b!3 +8{Dpr:@@7WFA{_ aÍ*jOw4:o4 xHp>p΀ά 똰+wFy_" +"apI 0 )u9؏ ֢2"}> A&XIDp1wcL71^zd̺-S;77&+ +Q"Xzp@t<@Yd2q5.gH+տ ވjpymـ|K =c> {8GG`N" +Šq+1j_=*Wl$ֶ!5oB25D XcJp鬔gSUN,٨g߾꺠s" + Dpg0}gbw?+ɢUL&"f" V83Z$"2H8@r@ ^iGNM(gJk +8҉h|qԎ D5 l= +8*h4zS:+ PjpWxYY"W`TkYcfM "xZqcLg:P&}z;A-um{ + cFppsxåB1._vo+#hvVs;" @IDp]mI0 >&E}N5>+oOj +`ޑ3Dpd +9/mz8"@ +B$#RGӎz Hp,&۴԰@(%EuQg&~u;{LVϗF! +:X1FqTh m2{8z8c|y" 8Jq9-G֤jk]K?1HYQh 8XpQ`P]t֖L!ag&bN7}B; jDp +6' PhT1JUW$BЊv_ ڕaDqtE?ɰ-q$;<~@@WGC" 6Iqv89[uXl* 2 +>hC-ԉ'{ߣ + 6bqސ@tPm@I 4 uRO?=MJg b +(Ӷ Wg*ю} +Aap p +y +bU#uevH7t" + paqzÛϡae0 +6I-2%?E7TS :0qݿEE ^YM|~RSF꒓ :aqJ7~`3xLq`ccR :0HqnBvKdh׀- ?b59t*uFo" +168`qJazzLwIToj673[ 8HqeCOπj͝9?v;Oݔ 6zqJ30JB5 y{Dӹ]ܥh!Ѿ7 2yq؀x*F-¥o,qӲt~n" 68aDq9$"~gve!Ns/7"_? + +16XHq8<(HRI +)Tn@d$cݺ :`q8dYA09*X1()l+x5s=p"P X1q(aeف$"&m>b@B!+" !"X1Dp}9}A< +"na"C+BQ0 +`XAp"I[;pQ X]@ 6B> &0IpXe{d&sT~o~_P +Q*XIDqp@/!.N-`}e hx$8C|N" @XQL"ǚ[YJG<éMDG*N&wrcr +9JqF?F ؐAB43;H/A + 8IJp a3h*E:P)0?nߵо .IDq +x T ZGF;r'O7a" +.bpoz@Q_=5HLokR +# 1DLO/*y l-\owGy +֙PKJqpsИ׀,z7 u}<#zC"@ 1DqXpx5w m|b$A&z7_ƛe *Jpr" +.Jq̤A@e [m9X"\V@~4BnF G &`bDq@6Қ`rXEje2MtWG/Z "0ADq`15Y Hh#V,1Ig 8BDLeʊȐaXaȵP +@ĄG2SJ>" +1.bq?<1B + Hj +pv)8r2i-H .IqOS?S@r>(_Q_I q.IqW@.1E x4p΁R?C"T +!2KJqqÀ +!Ԡ%ov$/Sd4\" +Hҙbp}[PNbNGFMɒx"yiF +a>1Nq'Ӷ6jxmIP18xoAwCxH :)q4q@6Mڋ8xf.Rk2\ۢ-4z :*q(x R$IrH \e(ʕ=I" +Q6Iq m<_WA:C[$y̶s| i6Iqܲx`P}z|f1 :iqpF  t3iE0oQFxZ~Qz C0 q>IDq"~r4)'L<!Au߈.A" +>aq(ߴFXKp4䊆- EO +[s 6Iq PW0 +ڈRh~̍9JQjO 6Jq  ') C!𷾍oeST+ :01Dqr!t@>y!~)<,Шѧxԟ txM" +16Iq +@RLfzkH>ȭNFf 6bq0@PB9d*B> /e}^LQ- :aqC> ‰wcLKMp"&>ٺ+ۨg][ :8XqE09i8p\H М8" >8YDq[$n~" " +<2 /&] +aBIqx0 4Pl-,NZo=_B*ho :XIDqbt +5VZ9K!! >8IqRt$ +XDp%{MѺgw" >01DqAROY bq,-TKŔ gGn +? :X1qIzȀذ8[H%O|0#@5Jܟ šJLvHhS@Q +° :K?? &8IqP-V2 q(l۶^!" :yDqM 51@p%jGwS9; + 01pr 6EDĻFxe_AO [ 0Ip&< -TqdJ1/Sí@ :X0qՆpy 0]61Rܼ0)sCFX[2")pNogq ugk>|9X=cA p:p![O C*Hppʝʷb[[t! XDp\`վGmw8r=[YYQ^1<2 +PIpC U†4:.K +yez+;" I"Jpt>4 keDp(n=Qچk.:) JCNqؿ:Ts`\P0 YS !2 +pP0D⿞88HF*AF-J9Fb F )p>\2/ATKS)PF" 8IDpaw2bm D+ry((.gr} PKDpbB?g`ЄK@R; b^RF" 1.bpAN" PJDL X:^8㭉uS8G !.X1qPp H*BtҠk^?l%PS X1Dp2' &%зM +UDw!֣" 1 +(p휚01B{4MO^ +~&(# .yDpݰb$0m!a%S{p_vM g +bNpHK`)`6?Vÿe +JDpqB[=@g3@x5%;G#6WPw" YJADqJI>X 3LL2g 8.ChUgè߾ +J(1q؂( q5,_3`6C/ JX)Jq 9P|C:I̢um:b`` +yqrPeh̵`o x5WHxl=" +Q +ZpӼcx-w/CS{ִN&?  +X9Jq{ +:021Pp)_ƞ%w`T +*ADp9o X $1;''ZxC} +b_\c &0ApHĆF (LP9قz" +!*YJq~ +d_p1#3P PD꺦;5=  +jpz~C?@` i4?I^lU3i]? +9.0yqGf & :gL>vG >pADqԣ\ L Bu +;;z>~MH }y" qJ8IqWwI `ljAfgn$_JЋ- >cRĻ :(qA0 &)2!s+TC.Eʑ7 :)DqSyT 7s2"TynF *9q0F"e qR#uAum" *Yq>D1辐TEhN %}P(u" + +82pꉉ l 9+f,(*HO; :p`i`A@\D6P/V*8$ +FXAqZ%u)p/Cm#";JpT;TxP5 +C8Ow?}? +bpI+L8`-DSG2;% X1pII 944G3A5v &83Dp?:~)C}K,LjCq.l|B" YJ)Dq%> + bExj@ !J*qdЃ'0E4%u$~Uy +U' _' &1pbU@1au +Ic8=NX$ J02qo4}cC !cԻjoV'" +*81pWojXc!1bXBw + + a:6΁ JpU+|bl D(dt,9Z6gם X* +pv[Ԉ*Sl HGURy *IpڍSBP + +G\0<^W5 ܿ" +I.@cNq"&O&0 +æ>BedħbyP .8Aqu0MJ@Xj0.efߐzz& *iqGT@ (O\;I#=4!I Q.XJp~uD$D@FDaß]@v' yRqc kDp8Ԑ:gC$~Y[X]F " AJX9qσ ‚!K`ʪm(wOˣxr +J2 ƶ0Zpo PP  +L0GG"龭տ + *X*pv p,m"SGfը/# +H!7 +PZpzuP<3 +Rcdz%$^?!" I +1pK@8?>KD@wt *%?R^&o?GTo .Zp+01¦b3WS@$s6";Ԅ _( J0[Dq"x: +fZENބd J1q >듀_@4 s֮Mws|5"/m| +" AJIDq w9 ޠ"AoAtM +9JZqNY9wH8He栿Fף)S +zp8oH#(R IR[ׅ_C *0Jpogj1F oLx3e~c=_" + &Iq_<&h ʅeUWu/A"b_^@OU 芠SLֈoQEd`@BiO8\b)}q^E1 +J8ADq:;-vs#xs>6t0,-jl YDpԁ:V1?R;knHenC-" +*2p6/|V֨Ʋ/mDXyFXȂ@ *1q'tdQAzo},J7HOjJ+rh +AJ8YDqIJS'CsRՀ33( ‹Z%q +Q0qPۻ~uzܠ""QI)Y! +bUKn;"JX{ qg~TLYT`v GCQ^3#a9* jDp51!RѿbV̠vFW#CN  "YJqJ5C"r/4Dަ!)6EG (IDp>p6gR֐󝂬]IeYA" 1DpqCfaІQb 1ɔ BqO ŐIL(`H:!#d,uK#5+ +>XbPqu՞xW\";r%usS 1Npmü^#DN1SjԍJs`80C" јHp|<(+ۨg+Xq6S&G G&A KLbhXƅ.npu썫ͣD_ " ͘1L]vuw]]̀;`76aȢf +0ɐJpKꃯWNKdĈȌ!H > Ld̂e"{p@S;.77ȟ T~.R*ȡh{ apoM`Qvau0EW@c\HD ZqALB+g"֫B0΀0Uzf Jp'4GuߝnQ(cjo<~J" bPL&zTͶq:CJ>fQ_P9u "Iq8p蕃Wq*;veMU 3g("@ pIp\ K1> ji +ԼW^~KJ .0qn?H >Т_@ڐA;e1IZ" XШIp8N.`T>\lP% a%KB[dlԼ[.ִء+ bDLEѴezDNmak0GQ/e"8 + ).X`q)PM[C.$v( PB$H +)&{q,ə';~CU蠟ǰB|G"ľ ybJpD5B;8Ř#F:{"h0e JRLKKh" \g@ K + ab W/ 0ܨJJL'aY>ܰv1N zΰFµbh6@ VK$e1;ݗ;5:bg@(3Q…k ȪIL&@0kB +Dςv" A +Hp+.+l`qi^IgfwsSC IH +b +ek9׋VxN8' OLS8 IpU R5sVhmw;I7Эm6 `rbUo:2O4-a$;x +J|ZT"JLLi +Q%PPB)UDo/*g[5 rѐIHF,v0N8ȈNJT" +z;5K-r-59/ bLLڢ Ds]q5@]^nseLAWį `μypۙ'8 W< Е5S̰5)1 Eua{" +8ʼ{pF<D.:b\t3S|;#*aɻO'jin (yL**E¢Rr2&LT'VX- +! +͘Hq`;WMy#r>Al>CM&2ld (Ip7AXY&8b⣎]qxO8<)x78" +JDMz]v:@@]%aG)L.`B99+ ,'Ȉ< Pbp0H7.A퓅 u%c[IbpVʯ& +ŘHp(X?UȌ"[2Fq+ M&q 0Jp4lLq&6w @>(@0D$svɺS'"Bq]?<'QHT +bp=켅\ ļB{q;=[G2 )W>0`Ch< ě +iF͘bFq̈J?R +ˠD8L! +P b[@h Č +i(JFqg'ݪ|y@j$AH釣oUd3 "ĉ JDL! 6>TE k PPE Č(IpXTj 0ӂPUB#XŽ V:? Đ bq2~D4Qt6F(pTo,Cr1s` ĒZJLΌl$0(D(XUzU8ׁd"ĕ (zFLQ*Gua_;EkH(h{=P=J$\d Ę rKH`Y!Ze250fk +{lN?b#A ězbLH?YK7A9Xt}@N>*NE, +> ğ`L#懑% >V\3UQAAM1Z"ģvc HBȈڶO$G%j +`Hv!sdf\茜%A ĪئbPLסvz"hkEϱ+У5 ĭv(zLH +䬬"F@TP^ܜCSMB"IJr(zLHVh*q5=qEg51EF1V= Ķ~bLH_*%x'ejӥrl,0mhn Ļ IL%`#ΛY`ss{w9ėX@#? :e# Ľ 8IqCfGu:;5QUg j"Ŀvc Hk([3&F6Z<v̓,pAG1 *#<0 v[H)&7%(eBw= U[ (zLLX/><݂qFhKI rz[AWX ~zLHSLrME6 p2|CZ +0ahpڅ" +8fPbL)t-QoWM舥CbLhgz9A{h +{qJe^ɿ +^JBd3׫{ Ļ a:zFs +b3~mqdֆ\Bvzxx^T׌_ İa>{q{sj +K+Qz9/0 <%>Z"ĕ Q>8yqVw[ ,r$6|#6?֊32 )+ ċ Ip7('Wܑ`#> "a7|5Kǐ9XY7nJl ċIpkźGW T9>}~m@nGYHt Ď(Xp`Jl@e +ѴnPC\)Eͧ۵ Ē JDL0  ̅򻾔ӵöV űtp@5&"Ĕ (JpFë7@*/;JȂ"Q37 Ę ZLLȱHj/-a點Yw(,Aɀp :=j Ě0JDLʇּ!aXaToZ{K|N}`407+645 Ġ 1L?#V5\/Á! 1R*A8#2K"s6¥K޼"Ģ 8(aLSMȹ)p2,p@v5h{x^ ĥ YL6m{Fu wC{i + " BGs`4w ħزݐILQ( ުz~MAc5>pT@< Ľ !FIDq)$ RjB_˫oICMB @t0>R ĿypZ=~eh[z^E*=$'!뀞C& FՐHqAM,j:o80 +:RGma" bJLj̨lK 0ͷwfݘ+&o JXHqfv= Ԁ <=H̯rowgXF2V ɸ@pť;D{s5. ?ܩk%t"w̮ Jո1DqB_V?? :(TaCǺ_" ͐aDpW%@gNcJFضಜX3nGf(7Ew/ XHp70L#D'ձYhko +=S ɐzL9aA +@( +^xkwCW zDL,$=siE"JCA;[[h" (ip/` pfXVҶ,^ǘ:](/ ɸHp7@.ٓ8@De5l>CJ=DA XIDL?*5QIQu֧JݍSY J +p6;&5 @+hRi.Xלq#t<@v" JpJXu&'h!eO3_U5PR +!JJ +q@!`ZfZ?co&wWkXG' XYp 8 +ФP2 A>)] t9'4w\ЃU0, bpSA-|"#g]pݓz/x,7" KNp<P@OF B~]34<$M{O_ FIq sRrU + Jzq*.Q@*HjSdt^R7+? XcJpnq )= V~P d&q7s%R +{NpH XJ ;eQUhtЀ4_" 9{Np +h`@䂓i Quɯ3a`oT +AJXcJq[aఞEC0'_SIC"LxB J@aqp +JpYQ~c +UuфT_@1ɨ JXIDq.~>x|dYu'K]P|$" +9FX2q  +ڃ`1M59ᡖz*P J8KNq8? Wn?"3nE# 0 aXKJp@9RffT/!3~'/ +p +!N8bqPĤ$欚+&T dgop`3S)B XYp %(ЙAY;x篞3JRF7" +yJ{Nq +\,iHn]:dAj1 Xap5!,PD@ej72nU?J%TN)$ cNpso\PA 6*LwC@Zf18; 8JpY0D5hjnk|o ޠQ" +QJ8KTq/3.xP8LJ瞰pƂPIns + J8Jq[&1r +&(b+@@j +AJcZq 8M!gY_xj%{ˀg FXKNqQ$j +6=Qd@&'@\"= Ըy" XJpP;5λ&!ؘLB]D?1G +9J8KTqX +CmC9t +(*/P JcNq/>% +`g*|*Z$K% + !~ 8Jp?(p>ߞU4U`؟SB1 " JJq?dp`fX q`A +>~J +JJqABBo֎i , d +G JXaZqߖ +&HЄ2I.h/0ěh J8aqWu (`<>ܐnn0 +6,aG &" +XcTpD,K|ASy;? +?m|] +dpn QXKTpd +hx +M,(Rl}AUQbO +JXKTq *qu]nl2[ I~oEzB7c;7 0Ipc(`$Q"Cz3{]vpWS" +!J KZqb@afpF&")-qefL;R٢q NKNq@q,Jw(/<oGC/ꦾ xKTp/&@g@X:Q7q,nMe3# @KTpǰf/GRS +l 1{s&" +9FXJqoQ +u@$hP \D(0`&p Л\9 X1JpfZ++v*vQd@0J%7U a٫ a[ JXHqLG[^=+HU>ŕMl5,^: -( +YJXJqks'wbP'pX- +VvkKEfi I" @XapUHaɃqE +0cTܹC- + +zp|ӧ{*/ + %`7[&SrHj NxrqQH@ʊ b&^@k? ĢBXzq/ )HU@L")4CѾ( *.S"zTj"ĉ yp`W@EEdbAH%Pn Ċ ѐb +Lv§@`T険cBVм~}Bza Č٘2 +Lf%1lk3dI()ߠqwo԰ Đ  +ոYDqGO4Ph(|lѿl#W]"ȍ@m"ĒzpUh[-uYES(L6a^ ė +6јIqИ1~;+M3x(ɹo7PNH-8 ē :ݘHqPGjQAE7kGҢ~ +=Mg2S ĕ >٘IDqOY1w"f +(ZWzPݏz/: }o&"ėȸyDp=g`$=W +R%q}CVn'# ě(zp.<\>P`FkL( +_ +{P Ğhz +p,?3l.k"8)e D0}b ģ +a6{sP`Ę%'DRn6W! 1}Q@"Ĕ y +yp`+(YFJ)SUBU^mF`Rl% Ė +ՐJpb:i1)p X 2vct0™ ę̠yp.6IJ5v+;3c#A`chj Ĝ :ј`q]pQуPJ8 %Y]F;*V Ğ İzp܃DU)j$S46vS>O5h"Ġ x1L[-u+j8'FFZ />救R Ģ.{q U%f%g08TEjOOkJ{kiQ Ď Jp5ibRm]w>9?vR đzpBh-H-*`!H +%Ma "Ĕ A*80pwQ#Ha ]Q<@L0 ė +0qjm4N6I^ }3t^3B$H ě*ШYqK #MhG8So߹?o8n'h@U[! Ğ Ш1M6DoПM9U@(10^:2 "Ġ XJJLl`A{%ADVRL3+,H<(Oki ĢݘIDp+ip۫jS8 Xݵb.un[՘ ĥ*8Hq;՛OLwI +E[80-b +6 ĩ +8IDpר[Ru雨Wq` +d3t "l^!]z"Ĭ 1YDp:7PXHyul?%{iF}Oqr?_t' įpIDpm=:ԧ뵓=p&Es?_?J IJ  +8JpK&聢c9*rbL|NATە?P ĴِIDpK7KCa^ֳ =bj"ķ !ZpQ=K +Q &Iq|?jLE>BߩN:ong]a% ِHpF_G7; 1P,v Zu8  +ݸJp >`(?3iBCihJͣN!"ȸJpzSSx"Acˡ`^ꙕUuNm8 *PJpS@A5UJ{Agշ+ ĠJrAńG@6HJ- &T<޺`Lړ cTpCA>o .N\eO4Ekkjs\65ө" XKTpd:jpclc/&b +FX1wL + KLd:Ca +՗)1!5Fm>?} +9 +8KTpQ`?$g^rU9`{n\^| +!PKTqM+$5Ie)lkK< lV~" [Tp@K +MDŰpC:F*3_~h{T +A0cqAO@27imo,GCg-֪s< XJpr8M)&]}p"{ .ipf@e :i{H~w7l, zp, L|E]rwZgP~č" zZp@ r0*D(~MwR_RG +8JqY JNl˸,s+pף{= ypPGt|Ч -" +i;G<[`ߚSZf {TpAG]b+14\>M8nv'" bq dۨj>Fyqtq; +u͘ Xbpuώ ‚:ט\t2|5M +޼bp]MDU 6ZiSS.pV +^ SK `Xap٨;&KY Gsb֚9&mSm" *zs'I+3[6& sO +*0{ZqbSqB:0>IE8m7*L)gSہ*zԕ4~ ŐZq./`=Α@N_0NܛC` +paq5rEblTA1_*&P c멭O" 0bL**, +.zp90?x +^SI*PŧDp6y}kܳo (RL43$ Y+2b5 +8,͠OZI@ Y>Pf +@hzpp` NZl}"g(hjsthնV%" ypٙ 866#`x_7?\G"@7At XarR[@z\`8Kʦ0w_N_a *ITqƋhn@6 +FK#24ϙtq ⼰bps뙐@@asnp36Sz9 oؾc:!" yTp(؀i' +$7N J8Co HaZpX}J܈L*$n1eگ=KQ* BL .P|&[u"ޣ3&РYbgz +!X1Jp9&@ M"~ΖQ:uPo" +Y*xzpL +81㒈q;{ZS&7TB$A X1Jp@&pUVicCۯInK7|;|q  zpԱ A!J+Mss%X{(n`΄_ a +I + pa87P@v&UZ75@D F3ր3fE" pyp͈i0M8e~m79O星R +INpp`8 @r*TuJ\eOT"~ yp rrA/ynL"#EB]4?=@qVӠ +2{Np]PLchEsyC]@5=* " +)0{JpTD@P +[{eq%n*9 0{Jp9Y G QM밣{a*X-Nݴ; +bp, +p۵<f%riaxSgPyt ayrıPe aǂ$N +ްƲsT봬ʩ͐Do" + +XpPwf`kE8OǸٮ tpe?* +P{Laà5쐪&m@eq-M" (LP\$ GQux*e(- 6W(˖cjdd +Np:@@@ ]!sV|Ym .yps66!2uC4PM ;#o 8|NL{jU!:%~ +(Au+(,o=b;" +ޘPp`!0GZčLj,ckVpT{ +Js ޜPapI&<6`A)nTn J< &yp)4  DQݦy$ҳS zX + Xbpߩgq!'!QNYo%ʩ v|Þ2~ +' A" +*zqaa5&`f1 +P)CH3 &apy'@ h(]xkc~3cղeS߿5 +yp=K@ՇFn#=7 *aq*%0F@v"tG/>D€ (XyH `ܞ&hcBY*"1 cTp4wEboLy)+ԒBzg" XJ +p)F@C YHWdŤyPI6* XJq:'O@$ !)7%“Nv  +8bpA ԛApl`_OOAmC1" |(cq7hг00#&p>7@Za ބzNp=0#<3ˡ4EVnf%%+i !:aqoJbZSjl)sT[#G@dS1 8IDpDqਇ @.e"f b=Ht}x;eԪ" +|z +rGځ#)O; d]O; 꿰G| ހbqJ@* +dF\!:ڤN۩]:s + 2NM1ШEH@OZPav'(gt-@ ڑPHq0F'նr!tZ. BCB}|2;" .IDq͡ +C7T%n 0'AHfV) :8IDq4 >2G^~_.V (Jp#} >EÕ}x&)V-,O7lP BIJq0nJfN%2 :\`j i +IpGQpLL|Z͂(B& =;[*I[" :bq`g4(UbC\ºʇ 6aJq 4 u LUbJMJ`@Ȁ:K +!:yqa6@j~8GMES xzL\S _ U\l 5b H߉ +1-" *tyqC6e \g,C%Dۮ1N Y&HqL +Pa";$ⶂb?a3FҬh +aq3? +e~tPj7SA'k3/iʈ &p`pK-N?@P!c1Ā)DNu#S?芍e" 9XHq?AO@  yy4OR2YoV .@bq9DJ'#D' h`S7X_ 1*@bq=sX@%UW=j ++( +.Iq$֐(7{ P8A2'D(1Ll" +.aDqКUАB n(y>Ji .H1q\kq$Y]hE[B=տ + +:XYqT@igcTfU85 + +J +p&WͨR +Te`dǿB(1?[H" !Jp³߰9 ҭ +2Dg?EA^ *aDpmp0¬M"c@S@qać>TCZ+ +*PyJq(.P2µpY 8S璵 +N-= +C3 PyDqR.ۃm +x }J#R[" +&Hyqa_@0 +ɖB&FG8ᚌ}B/H?L 81q +4iHZ; (- đ 1Dqķ(#)qy}Z+:@ v0IHy(PCTOz +2T9O#|A=o" + 60zqW@qǒ' #Hzo}Pgs\ +.xq p[@0@q(EV j `Ϧzdn#  +aDp0-L+뚕hԉLoʜ]$+ +*aJqJ0 iX09 0ќ:ocbEJ" +8Hqݐm%@wߑj_ .AqLlI-@-:i +Q +' 0*o=B/ +x1qR rAC83Ga!Zg?E' 8IDq& +fuI߫[r" +i +HKpT2Ʉ +[-RRCh Z4m-[i@ "Jq2+nt %RR27Md&H *p2Dq;`s&+2ȃB׍U] +~z(eYnm_j *HpD} 8vla`5AFWtj܁lq5" Q"pHpu`Yä/=}b*:Ls:* ތzLpPf赀x|̍/+ E&U +"yJqt)k62 {cչꪭtG +Paq՝D^j-ÇTNm@+?J# ϭ8" +Y.aDq{K<,QiPZR1m̙A17M ҌB +pP`×~0qCTUv@LV40$ y +aprZC^JFx@@|a5?+i= +I +ZDq5h&~";{5SsvM=h,y,D" *Hqb g +>$<|$ҿUv\ +3S bFp9`s>@x5*)l@F&Tr^ +C M! 7gs +E(ؖsX8N) PLbup + (ɚ=bzqT#7֋Dl +XPzq;!@j&am Г"q 'sv˽" (CL#}0g! c8l>OZ> 0dV + +8IqT -UNB=!DPFTLA;  R $~TU('Aa+Yc[瀽h-Yj +a.yq‡)Pl(;PU + U3)a,(:." ZLLfZ1@HbeUDƗG"'5 +a +81ps! +p6ɘJk1,G~2oЬ̆oz.$8/ n2R(iP_ 8s>-H,ie62+S^i̭ +`nx2D)S2f@<̵CɅ)B+VѺb^v~gئ" (CL>IRH"M6HeqNo2X6\F +!.XaDq +1yN4~ 9sʦZG ) "IJqfj?QZkw1.ۘ4 Ҥ1DpWVؐ0dT}cAVY .0bpKA%:It@0byKS[vGK˾" +Y.aDqXjY00hR\:fgK^W@ֶ\ *8HqҀ¥@8BƍV2bM!g pbDp$\(yQ4sXE0d9.D/]N,/ XPaFp]>F"jF(M䵨E,6hqJP" Ґ0`p]6^@>,ӍDX8;Re_59GE1 + 0bpKlj+Є ]1 $t$qS1L jJP(Q6zf3&IȺ)$L{dG +`ހzp$ݕhx$LJl!Xnc 3E}d"ބaDpWQ$A(BN<<24o(?i +Y6IDqA##7&"3j$1R/P1uzCb :Hq(Xhr\gHuq$KuAߩqoKk 6aqQIGћ@{t]oCQƿ6C" +|cFp,Dc$T@|LQ6+->w2]]XD + 2aq)Y + +[)cX0/5YO_l /O Y6PIq`@0aAVqɁϚgD :aDqBD +]YQ32Lof8 .HaJqJ6 *72Δ2pm`{NA(NJx+XC" apܠ@P (!+c}Jzo37k`GVVw +.aDq +4U8jEV) 0\A?Օ{p ! +PXp*|G9>^Pﲠ%BQ>;z# .Hxp `LwrJ$wALk7*ޱ()" +Y*XIDq܂~@ _  #fT2qR$ߐ! JLޏilBнrX¨*XB).* +7. yq)Ђ +%t1Q#Ԑ=C(~+nпs7 +!(ypv`k]?AF]dVG nXs" Y&aq^]j , D +4YSՙ]3M *zqDIo*J+L{|e2@^a+|OE bq:7XO` p X6FX>19?LC®QH .JsWFD& 4@fQܵ&=.;b¯" +!.bJqI25pAmbCpcxT =|A/ `qm*BykWeM!dLe%W<# +S 6PIqķtD~c:-P7' + .KDqM@捏`" $~-N=L" A68DqAz% +**\@ d&2g@ޥ] +Q.HcJq}`H`DU\ɮzE 0Yp(y@9 \3(DNoz'=?1 +Y*|{DqTpG0,++j +QPv," P8Hq@z?3H#\ {MX4 + *Pyp.ȆOqЙ +/U@@ +1-NJY$ Y.pHqg<< ":  G? p~Y +8HpxG)Ȁ@WJbOqw9F7g T$ٟ" 0apyv02⨬#U(Iq 1Kg +1 +yDp`%X +7̏'%ǂA"յoDҎut@ cL7?@T7m19 h5Mje6! ! +8Hpqg ⠏(-Bhrʏ] 6./US" PrC I@W$yL5/޷Cs7$tg +XIDqɜg0V~ `\R mj+uJV< ❐IDpC(N$`s◑U +;?|tТM6 +1 +8Xpx~Հ "_dM<agS?N!35 " + X0qV7  ! +U +q罔MAO:请 SHEiF1Ͳ܆`y 7X=S7ĺ + + +Yq3@c82n'v}_T'4m|G 80pϻ5h> j0 X}F/i" +apA9D,`m8@4T +\:ԩ yDq3`Xx+I jCMot mص.Zh:P (aDp;p &{ʅ% &-;o0 +ʈzqh,!ת>R s gȭ" &xQDqY}_DL(bk|V=+k?<􎥬>׆ٗaC +A.8Hq&*ҰapL&$J2 Iq'?Xl7^PEa)X?3j%s^O aqU,ncfD=iaU@Bx:u" @P:FM0IM)3v  +EF=9|vR5u 60YDqċ 4t,1u +o[y@wNt + pbpҷ.<*-"tJzMM$`W: 辔JDL_ +A4ܒ*q)2IL_GO +_'TB0 +9&bq0Ð||_Ab&* s)YUl$**%?PJ&" + *Pb +q1W$0Wa?0,#*;b&7zŖeYΏ{ ! +xHpkY"l0ƽ1@+} ,#u* ar_\ DK@,,!Yiiw uL[;J ”{L*<[ +BrHaktŽ]M<.<" 辜0ZNLqoƔ,:FMs{93 +P}, x{L6N3y agzE_ė\ט^R ޔbpKEpH $$!ĆӸ X p{LU;Hv{6`aFS%s׭p7alI" +Y.xb +qD} h.^C<."#ngk>)C%]GԠ) V% cL +n0G1kJ]23ncFp + XHq&o*$p= b"_Kt=[t)] ! +bp`/z@70]5|kM/q[a/ +Y"JpCADH40V@kfֿJ4t >m b KLśrI8p@}qtSäwr؎OU" +A&pJp@* /VL X#_Pj;]F~sȏ X1L;::)+g.&PE2r +JpV}`) ZQCNGzb: ʘzDp  ^9K4# j +Az!nA܁B" +(ʘKp u>hZ: VzF?$F~OA ֱ2pT`#!>JJ 捹>J)2\ڏ PcMk0\L=shbB&ti+> o Μ({p+9䭀M[ FrAjbsP[3S" +Hʡz +pPVȨ1$M=:ǤP܊c(W֌ HH2D:L7[k]wPG ]k +i2pIq`!2銦bEJ J~yhiMAz IpJqqOp.WB +(Ԫ%+_ؙ^" + KDq mt +nd$ԶDXӘf G\ M~ FXIDq)0VcVa5!YFّ:^t٣c_ϷK 2p}@:;*"}`6I/8H\u=>S E~ 1pF-(FPPm|f +FAbSP" +1qq\8Ed`$zr7/DyjP + :X1Dq4CR;BZmEֶ0Rf7kd JpqDZ@BC>G_ +_ʿ)? 3Dp VLbc!LS7׈QqB*" +!.KDp(Q@ +P>(U?io/0 !Xp3`Vm6z錍EҜchlkCù_ØD9M IDqhn^pE8cPtFܷ0|2w\.6 o8 q1p!0Fl+VW8W$`B Վ.E +!Kp6rРQ@Сrmށ*-1)e@B" brHu<(i|HPHAC27u"&z 2MN^\akLf"y=>]m& +!XHq@~@8\ܧTBhFk Ϟ{=j/ ^2D(PHL:ljdGk=q-fĻߩ;]N" +.bqFD{I>#H-,y} Le㷞셡vMu KL4 w! ,K[!uH +IDqlPmɐMm +7 +qVzN {p} NK@}2{REr>"cqfsO )KAI +]BYr +{qi2)(fa/9 )`<Gdzg@9 ☨zp@ Ġ`4J8$u;zmR vXJLH XoB00ķ˄ ڕܹɭקl]" +XIp* +;*P"ɓuB*5to bXJF)6 t e⽍-HгTV,HeqD ^c(Ei{LG(EN8 L] (zp +KiyM\ds6pH^`d< K" +QXap_Kƹ=8R/Z??+Gm2zZ r({HлGfx.' U9:*4C$ +9yDpdl'ao؝Ase @3#< ,1 I>Pzqݻp%E,V +0 <2.4ۡIR" +.yq@NgvdXD\題8yV,  +HIJp}sLjڐxb VL1-`(ּmD$ :yqU bI3w{KۤoB +` oMSM {L0%'٭@DZa@ËVlB@1 ޮt" +XHqN'ӕRhP@zpƑE PIu4 BzqEx9 +7 x̴ׯG\ +j cr)qu,A*tB +RjYeP8~:! ʹDp[~@DҾA O< S:=F{ 0pjpwFCݍ-JjѤ44_:"KL@3#!Kg18<}GA#p +܈To Ip"L&8D %~;yJY Ǡ6 Iri޽Yũ%j.m@W{U,wЗD :͸0quP:X"Y #vn.m +^V bppIp2QD@pZ6oJ" bpѕH& `q 26KZFC3*|*g=n :͸HqYC .n=BH,Q1"(peLv KL^KXn9MB=yJ7F%x1=l[9؎? PZp|k@!Â̑:GP'\y%u\oC>ېz" +a:XJqTO/ƧycAzz_wֽͥ +Y:ZqA#@4!_'Ï#S 7K?} T鉎V KDpy`D +pA"ȂZ{\wىN7K + :XIDq2@!+D"D B_Om" Y:ŸIpzѭb61J6!|Wi6 軷_ +PJpB1`psk(ɬśV'B Kp*0#c* a`=y:h ǚ/ +`xJq^EO/ AZ *rz +;J[" "1DqzօpP"d)6DX}~qW JpZd`Ȼ{LB1roqH7f1&?B cqw  4vPWMƆ +I>cvKL +cqCv;PI +d%|\J +߾-Y4™SET" Jpdnp{&V֧Q΄#pO4c4?Wy PIpVNތ12;c3B  PJLNގi^P%ˊM +`(zR? +Sj Ȫ{LxRi:<@Ac-ߨo0,6V>_" +@JDM̫&/r= (nmHӁ } yJ8zJqW<_vԅ[/Pՠ΀Qdײd,{ .2p:SSʍ*m@ !NR#w (yp=|O=;@YCdfp~" 0HL"vQّ(!* jmvq-P F0zq4H@Mz`P((M9-JQx753s. +QFpxqC) +ݥ@&Ņu jDL5=.ˆ`܃hD +7LH,º~ +qJJNq` w6A_"^4lɻ" +bqw#oa +qɼ )/G(]ez +Д 1Dpw.`PVPS荨Q0חgm'[>x[ JDp[0TU@V)іF*lM7j bJLvz  Dt2'AEBe +*fPw9}"͐HpZ!aDk#diL@+R}/06  +ap (2Z\P.ko\׿xwnF iJpxÏ>DQQEYI׺OT> ؖcL@ +nu8fcy]ubiZgD@C" ƴz +pgr8 23@R:S97AG3' 6HpCX P-(4G5+ +7 +0e + :ap刀5behw_ьr*^1vڲ q(Jpf;fsrO4atT;H"i +aDpݵAASITMՉu8m!Y-VWj*US +>8bJq/gqQ"*c@<Ǘ7%鯧5_3 :IqƮzc5ĊaBa@5yu>s HyL[%1׵:V?B +hA A&{ qa¼?4Bbk3g 39@u@S'2pE 48"`p-֓ )Zv:_Tw2,LQƑ,9,c$A!Of"JpH9"ka ःI6Шe$LxK{. +1 bq(wt/ݾ=萂\8-<"=@tNko +!X1Dqo&a*ۼMlC"\;R+`ܿPK"{( zPq"GZp& #m쇍V RBஎsVG" *1q$4$]r@?I? +1X% IqnEeRTemk pIJp41t!}#? pДX~^UP5BPCL;3 J +q4Lfh?/rn?sliB`]#>:~&o1ae" PIDp & `iPC*Nc @B:@D ڸINq9kz- (B{E̗o*Y@( 9JbVqM5@vI\nH+7j2MPE?&  +IapExzgi|aBvA6uTCE"  +pJ +p ͎$r(G1&:)!-G dA x :J (pK.# mmR3X)$#UɉE:  +JJq12,bd}a[![ +axypTv<`UZ߁ F>m  ŐHqUɵՑ(XjkQF5_|Lf/U@& +  6qH/r彙ł +\P./5'.0B@#" +ɐIpi15E +z&* ;MK~^ ĸYqV 4+˪=!3W-Z+"*.o  +pJp"呛Db記ipHp-1$Tq 趽PJJL7t7가fF]@O3 <֝q Y2{rXUO2W;wf.Iq1m^w%L.n_"ij +bJp3o +;n.eEpAJ6($ER<) ij(Ip^ + 89f,xA‡z0Tw ) ĶA +ZpxKga#۫=J@H8z#$ ļ(aL$&þ?m-D;2|R@c!_o"̰aJqA^6sOK1 ")CAXon  +yDqHv ap|ml2Ye꽒D_KlګʸYV " 8JDL:¹E0j5BDH v۪_iLg-[p !bp̣#] juRu. 3b(D+ JJp k&B^_\s#Pה`0а JL ZKC;ni emQWq@U0z"6{qI5'{' +t.\=$uqA]Fx\no 2pQLMṨ" 0 AmatLhCJf@h .ѐ1DqQŝT١?DY0ݽ(ć@h ʸIp 8]Mgve?5ؑP-6B" ŐHqJeQj/"(;S@P @}* [w .{qX9O\- ټR aC߬~ZW! Ĺ +.ɘJqSf +D7ˀ,5C% Ĩ*ݐDqz_ݜw#59'}7!wA/"ī Q +٘IJpVfѩޑb q@$c\I [?_{ ĭ*ՈJ +q(Ġv LqfSuS\mTA İ XIDp"*rÌȕ#ٳ!'] +bSW`~K: IJ2Bq6qGqDFMo +CSJj"ĵ ̨1p}diK)q]&H7XPQ* ĸ.8Hqa]3aqtQ9h1: gQDE1!! Ļ ȰJp0+?+aU1ic8vi4\ ľ .PHqnn[QA7&D/WyV vՊ@RG2" HIp^WT"V0*)J$ȊE  +̰1Jpպ4N ֿ--ɥl;sv=ȑ~ Ip21A=̃cqY 34 _+P p1q@)IjglT(j9F"mhI=a " Y.pIq8jؓ+/( ZqIFU .XIDpnrZ$,~~7̄aud +4Sy &cqrIv( |oРT)iz`>!P Ŀ! +JpR#$2[KWg +3>m~TLD" 9Jp1Dq5ꂳ)~Wʦ "~øPŶGEg(7 " +8K +pgtu!L5 $/U IDp;KD38dAJz +F7Ƀ,ֱ  +ԨJ +pՆ q2*A +3^~  +PIp; +&"|8wſҏ f JDq~$#J(iHVy@>0:o 7%O +" ԰Ip^Qo`xl@LZ#b?\Opj.9h ؚpILX܁_ Г,4Av\FzYHZ BHqy~g,À`.&X +_{K IDpen߭8B ƒ;Ǭ.GE߼}1" 1>8Hq4{߿0@RgIM|{g5 4oN%; bPL#DV@ L:@)H*q[[yDՅ + 9>zDqړ7PL(Lr=C”4({Ci BX0q`L,eB^nrԭZa GN8" )Bِ0qUi,l Җ%Ez5O >pAq$h@`Z"k8k!IY!G:R.F𒹛 ڼbp0862+(R/j`j5 +ڝXyxG ј0q7~1A\% 8Yڧ|C4(|]+" Hp_Ff9V7{Ƈhy.=CFkB@ v +YɘIpuEZg% +şm5=o+ALb +HcX Ր0p @~<=mM$!Sww0 *m4Fՙ)X +)xIpA"iYfsK-h3{qRo$3adw6 +@;th +Fxyq: 9 +~ ~ 隖0  +IJpD:NA!>;yi9>/ݨb3 +JDqOǀA:f)yd0}"_y=:`ȮI (JDqBY#ؠOc\")5_1b5 +՘1Jpvq-DEEx .8M&7t3lS5ə? +ȸIpL z]B>g ʏrA'%׫ Ip񠬗`4T K,@wFJ\$&޽s]!" +F({q|4&RoSPvqq_&p=rC2].l JDp*Ѯ@ivU$7+I[d_JU| Jp\گS8-f& iv-4nǂpKC:( Jpudta e3KiaC}X;:f'"bJp +7$9 ^ 5ͥ狎Qc;,ķp x1pΊ=bRAޒ*Ufh*1cY q +zqPncP"R[|r7=mmiof֦ 1LzDo05@`vĄQe8 K`su~ A(IpZr:CP5*w&]8&),s{P" zpoX'@"D T +pQ! + +H(Kp<>W367CYN1zxhqa h~ȨIH`Ӝ`UsBő,A >( +#d.# QNcsYfQ~\%viC9y{$Ґ'FL " H82 +LPHxEhb4nq7.{rp{A/,j 1p*zd +X`%~ 7+>7- M 81L atکsS(yj9>#qȿrk JJqaeKkiJ29^M ;X" +A +XIDqWaFhz9K9V9n3 JL m[/tK틛Pq$s6FaNb=bzՕ 8ѐ:JHܛ;^@IVyCLpYxح?<K FZDqС+&HbOKTFk>7͜$ ЪZNM:Bix 8On"S,`" FɘIqA@Ht6*&Fj "#UIэ9O諒 Vݘ$EWZ3\Ã[H"T,gdşx ѐ@q:\Ugr:i\m`QQ@ԣwk1J * xIH ڍ~Wz$"q-*?S1n" 2NM:qGll;b6Ju!k!mL\!r4 r81DH$c`~τ×fd+du$3-Zb +XK +qp2Wꃟ [ HFWmUK#1hy=.1mFs@H" bL +5 +k99_bwv?9 ȪqI(f 2q4ن- +}xw"h?$r(SG L hJ[-$CrEf`C2`$-;XAF Ī Jȱ@2 +T$lXF0LvRlYR$y2⍉ ĠrIIdHזK E5/f 2ܼ1rX "ģcL3ހ :@Z Q'm Ĩ vݐIH5 qZn+贻TO7qT Ī(aLV&?S +Ă5"#(f1X=FoMO ĭ!qkbkYWF~. "ď AyqcԀ#2@0F:(叄7S2.o +C9 ˎ^A ĒvPzFH1?SH—xed4j/|{ ĕتzLL txd-޸" a݉CclXPbJ& Ę bDpdIsapԌm>m!u8B2Di"Ě ѐILF{[TM'd֔D&qB˚B ěN{qE3֠(R"$"sg`.wP;dCaӰE!8g(Vvi % Ē .1Nq@9` ) MTk*麄dvQBppMy  ĔIL{WB=/tEdLsi}v ė 1L3a + +:8+CS"ęx(JLL`}ApR q><\Ls)}$ ğ &1qs2q)Fy~6#1?K?/ekgL[Zΰ $ ļِILE,_|])Ixzu)իQa?묘<1)"Ŀаap JhI}|9ㆷ܀mˋ JDpScݲ;O4Ԡ{Tslϗ"zJM? E#gOH}=&g)Vґ_T `K +L)CIpSk +4sSq^?n bJpАTXuc/*eڧv[忶 + *ȸJqP%xc +zP6M2F;] ̰IpCps@ne m2 qL!_*Nct" *HJ +qwSaxW$ Oys%c•Փ̚ +!2Jp9*j@ӔN`DbZN.6ys *p1pO@Xy6#P`3콵_ *JNpD\DGn &IL>VE~ş" +PJpmAB(PK%f>v&6w Hq*S>aIղ HCy{ +ȸaqePYpY[rH/:ϛ$$ڡ3d !:1Dq_b@@?@~bg&-1|&˿EjɌ`" @IpKG r180,B7+h1B9Y7d' *x1Jqw`/ +*"w7Gt]?r3 ZTq$ҴqYṃ"lIĹAJF @BPLS PE?iS+{of] iA7e" HĸJTq2Ҁ%P,UQ F +[u ݸ0pm`@81 +@|i7nF?7|ڻ\ +X1DqQ@ 0 X1ݳb57Ƽ|oؑ *P2q}ßpsLE+MT}kQ7e " ZTLd I2Vt08u m]IrE +XxBq&ڐYF@.?*[:ZCڢRn )LY0(vMY R]ݜęu~:o +.81qCx4`1ku +J276Svu" 0͐2JL@ـ}; :J>m_HT +1*JDq?X@ +#c +4k1FvdQi +nٻ + 2Dp]*+w +/[efHOLBy7N* JRL3ܨ:㈃M"p,"VO߉AC +>wE" *ȰITp@2٪D/$ICTOKp- ?/zB< +*x1NqU@5@F'Tf ;GyRO;YaSc X0pC(@.bHpRX1khzWU =ܿSR +Qɘb +q\q(Dl +: /";']" a*Hqi2$ )`Ph<-vQsV, hJJLQ U y WyaBT>~e + PJ +Ljo;(3+&5⯯ Bј1$Ⱥ6HEM!hsro 1pAH("oHH'6l@wh[ڬyK` +Mpf*" 9Ip:$$"Bh4ׄ&α3 +M6^z  +Hp@ԫRhvB&Y`0j0R58 +AJHqh@xdUe|GJAn +aq#Gl 4PX^̢t"d`vnp" i +Kq@:s#R}qEՓ܄&= +WTv +JDpp>3i>5WbpPf|,UuW7 JDpE@DP`vEGrS? 69o{{ܼfo˙ 0bDLE/ A;3j.i!{K79i" + +XJDqDNސ"p60h)KgQd JqzA eh[q1"i!ݨ+)8'm^z +J٘Jq@O@D( +E #yzp~WPrhAc! zJL\rQ$Ŋ\;2zպ'" +aXyqE8:.N}OMsNTRK4O+ +JpλԀV 5sj=|wB64*lUWitdcuecQ? +1:xHq;1 ERK|4b{5}A> +bJpQp҄.`9e!d48s]0?C* bFpzR@T^pt~b,:e" (Ip!VဆA + +CtH!DB#П Ip!*6)^YʤFZOa 0qNUB+ +ItJa 4- " +Hq0^x ."kͣp@63KK4++]\ p1Ll4V +@ +`T,#uuG< +1 +x0q/԰ >=!?qwKG(3i Ipݴ +Ba1e-"g +D.u" + +xJq1Xxn1bh7fJn( ! +Hpۈy #NnqBX 'bMQo"}(lo +F8Hq[XR@0AT &M&JV `ύh&_{ Jp z+XJl1`ĬuSNX>$@C?|" +QJ81q {HHV5L&$V]DWmѢ> ALC䕅8šT֊L +l1!9[* + +xIqWЁL!ƕ舲h{OxFCZ/ +аJDq$M%=e!´NY<^yBQ`[S" QݐIp.q9CI64fv00L + Шbpz(c!byA&R[#3w7Ep&wñE76  +pIpƀHp9\AeJ>5{%_%Q +9Hp;e"D0&Lu3(8]3 [" ШKLotBi$!c|}8mzhJbo +ئJJO6q~2O\ǻB5:| ? 2PL5"!'ŧa`.gA2/a +Ip{ܝJA]y]@~}'O>4a\" +1qKWBK, 6B5Qt#K%? +IJJq`9= 0P@w ^VtR Iq8!HXLA$C<qBzu\k'U- +pJFpt#zP82BtVH1XJ" 8IMW!$arx*(aHM q0>BMGl;ckA HpOoGˈ j5a g"_1vS%ao܊ c L +ҽ|B6.dj(κk:%"bFL[=c7*-JjuHCEXm2r, apwP5ႋl#VyP]3j`qC@( ȭN ̸Hp:V` +5Fx\h.S + @Hpw\^_b&BKLkOU<9" +aqt@&$#;VHz7Si֋{qʮfmʧ Ip w'\fgbr toƂ0UcF6П} ƸzDpN]`9 vĴz MC5G 0`p%_3t8h9=U+RA0$Lci" YXHqr0zF$PX#(P3`ס'0 +aB`qBK HB;@&@W l2;TȦ,;QePP p0b +Lz1pL7MBb's)O1Rt*Td +yJp}`1𔼮18Tl DNЩ`f~ K" ѸHpY%y@zVjsZ,"K~i5?F zVL[ԁ VSVV"ooXv? +'y5Z ʼxp]8 $hHLF2̧$('usgT8I= XaL,~L6i)@']b }tفS @" XzLkp +\AG'/d!enpN~w + ư`p +:Nj-tQguxݾs5_30 zLLz>'Ж$/ct'ȓLj$'KأeD +XbRL@a8J ثRXM`" 0(JLN˗;Ԡ.#8 ˌx'/EƤ߰V<\8 +ڤypR@HZz> 2gւrW{ Ơyp], `(lQE( i :8 +yp +Ay1JO݆_sn zm1]" ȦzPNMҝyZPdpI 4|hg ++ T<_8O;l(((Y0ڞ _[tn"ġNd -ra>a^`t̕%ԃ)BYE9! J !*bPqΚ#!_RƝ犁bh#}XTi @ +0KFp@b뿉ܠ 8apzTec6>E4ʀ:LIr҉{>r;\"@ b +pO)R%D Q=3xTxB +I B !.Ipy.L'!]k_ +4}MG D2L1|C/ +6eŷϽSQL1 Gzp FHrͳe݄Ί>Zu34ݾ(v儀 K Iq Ⴤ +/V"}6/s=Uo3|8"N YݘIpO +;R\F7Vٟ#U#$b]` P՘Ipx!/*ϖ +V/~ӲdG09dSP S Ȩb +p]PϡEm?fP!-Z@I@ %5ݫv UJp8H5o*N1ԃ@'8}7Mz@"X XX1FpTjjpis +FFs 49ߢ Z ! +ap_ +`Iί,qpP p]Hp̦9Dʼn + +q|2$]"a I.ոADpQ3(co`8y\wqƐ'tK",t; cf(K("\@ E;D<{lnQhyž¿81 j ո0p'(0 +RcEzM(p= ?Eh6h[׊ m ѸHL@:ãO.yYH|ݽZ Yp :"oypHcĬ'wݩ0!%p sŐaJL h32(Xg-CV⸛PAwF~= w*ɸIDqgi~kk.Y8k-g<2)J +톌t {  +aqa-ϩ"QV+r4bǀ $mC@"~ ½bL|I%|̿>Eiryna&#ef ĂzPL2PׯAt$Z^MBg0^O>@B03 Ć zL!Gd1DʣRtT_Vr1ТZѭ)0`8y!P V XApԀslW%}T@=iBd i( X XJp@AZIKK,H~Z3.NƵh"[ PIDp_oյJ޵%km"@.˓9Ey ]2^qG~TI'֒[cQ0 Fͤ`*n 9 X2p#[_b 2g8T€9A".]ƪk@ ; εIFpFX"6s% r\炬Z.!d"= 8dL_19_t α` CdO PDk961ߪ @ zp5&Ч#:l`> BʰypO~g Ov$#XPD@ F.(~q&HGwe=Ξ"[si0AvFE34"- XXBp_`LZjK3`J0!?A`@(7 / KDp@GA6y%Y@42!sv 1 .PKJqF?Ճ5H uQ>'jH 3"[Dpdҽ +jGpg 2]P9@Jov8ёgo"7 8ƨP|Jp*>Jr7taeyj@&O(FJ-D^ : ͸2poDZ#/ !tXqM⃗ +gGv+, <ʰ(dp+ J~ G\r>^q +UNooZϝ + +N ?X2p9T1Xy>``=@S+~Xni{lJ"B +{L0P|ʔ@ :J[[%=:b㧹C @X0poL0 xBCGbw@q@1B C ! +X1p^G:e  b50Ё6.l2ozݬz E Yp>(B;ED ؝\Hvn2'.w3} "G ) +pbp7~fk@jVFx +KԢ J +hJr ܸΜF&? %?0E[ N pKDpn ?i."(Ԅl ? + + P +Ip{%>T_Cx + +K S  +zpn)"#YWt#`>zu["U IXYpv`--MF\GYTmOӥU WJXhq}W.&7T(:u!Ҁ %Fqq&"Ky Zʤ(Dp^73+0P-KP] ^ +zp~;~ތ48ĭ}S2nڔ8_"a 9kJpBA_J +(albk d  +zpfGӂ@@'H5e\e_~ g  +kDp}gIj;Ɨb3N}uio歟Oҋ j  +xIp~$`SUGaqJPIL_u% v芜~LSf)ܖ |5w&@@CA̿;"y HX0p\V}4/=[:$D|;jZ<0 J { IPjp>P5+N1T1F(4 + @s%1 | arRQw&$T;mh5L2 q &~TpFEyG.E|jeRG/9"e Q*H< +p$}@DFb +ٳs-ר&> gPE@+ ăqkNpG}G$p Ssbh* Ĉ*{TqPC$4#̜`C"ċ &jp_HBG\Fƾ,SQtɌ+ Ď&Xjp=E>cFи`HASP5oНAoˀ ē +l +pdž'`m7R']^ _z!< ė{Np@Dn,p rRm?(R4BU("Ě I&H|ptg4z: Dl!̣]>{>K?JT ĜHzrd=QU3Za4O;@g +bш-€h3 ğcJp-O'~<^o>3O"ZZf d ģ)bpE/ms<-@3gw8.b+dUye"ĩcL*[q(4)Djt$*!Vv/6 İ 8Zp9C'RbvA4f"} IJ .XkDpp eZZd\Rul.{'#"Ĵ @|p"8 vAyʪ4 +6$^ ķ>SDqQ,x*YHz=[U«3яЀF_ ĺB{DqPPX#c +6[[90j ĽB[DqpTM!ڣυ(SY A" @ʭ{DpZ{J/`3=u|c+qFX n]M *kJp?:z iޝ@@ݵJ-)E TLw2z榭bb``?fV NG8c lp? +J<6H<)_χ9WQQe!Dn1 8zp_GM:hj@ +Hd@n1" BXLq7 +#PoUGylG6m`̧E_ ޘ|pA@t a$$,Ƣ}K,<ޣ?BG xzpgӇ@J)oړ#`Ҋ0mMf L- *XLpQˠ[()?U5 YjO;"|O"ޘ|Dpo.1R+^99)5gHoa[f_u2 pyrb2o\Od /&uA)]B]> BX[DqG1@S|&c- +imX?_ lper@( Q *Z;HOMY" +AFzqS^ +*m- X+!@o#pSݿ X|p8`R P@Rg9Hr2dW2*U .SDpoT + E" ]iNըuY +ڲz~ {Dqs|pd)_D]ףN:'_536e" p&vʁ0EῘYs22 pƌ{Dpsee ~{>-ܐyo>P_+ +SDp0%sm`eW"̂3/XÚڣi\  XJqk +Nw\LM_m7" 8kDqJ 3 gw!ౢg +/v/x` `ʌ{DpXAEDU +mHVg7Z8 .Yp]E +Jf'Vf(a^Y\ؗ3=^8r *aqA'Jԣ`viJmHW. vG" +*{DqRߌ`]* q +)+ +OT35QٿAH_ .paqxeN,Fʂde5>89 +sDo GRp +(ʍzpbNd7+Fx+r] f>a( u yDq F-B +2(D'?" + &Pyq!>wZkq8 Le.0wۥ XHqC4`A @@%cQƒq 7, "HqP\OBP\.v]蚯׵5Cs6*Gʢ A"YrHEAK + +7%wD +$mR`" +"bp!M E'uHh%_NVB@/" "HZqWǀD1|3j1*k8F~S}ewl +Y" bpW0gWׄ}!/ 0zpY +(،zrdٔ&Ggz[W0V3{ + :XIDq+# 5?8gq9' yp3R `^vĂ#P3;rAtT]" +I>Jq4 \ +S76h 3z} :Zqc +vprW+R_|pT0}Bad 601Dq}NrU8TioQ8}E;H? +9>8IDqr(`Q|ꘃ1CQNol8oҎoR\" +!>IqH Ҧ;%xQb~}E >8q12@@Dp +(AϷԿ$o2 + :8Bq@;?rq$_ 07#2>KNT'J  ;L(10Sr@yU@xrz}(" )>{JqWPDR%h6.2q?@9#aCFaێX?W +A>XaDq" :0K.0F6#FQg]" :zqF}<@N\_f[O֬!s :ap~ZL$ p* *0aJqp\-H Dl*8H-qJ?f~ JXIqۀ.UY8#Oa1C+~s)Ƹ ! +:p]t +M5dBtáG +RGse͚! +" +JzqNͿ`7c@B#+i^>j5#79uo +g YqR "H?OS; *XIDq1 +]ޖfp18;~ .)Dq"A"?fؙd4RCln" + HJqP,%|qejxKldw +u( +Y&hIDqO)6@!f#D9~R\8tF &2q ,fЎh6URG|izS +80cj +a*pJJq芰QgY& 6iۻ5R{6/@"*1qLbH6C7AY8 |^e^x-R +hPIq a  рcL"k6{_󹩣&?y ЖKLd! YOҚŶ4k2B;g= ƔJDpg3Q%OBqA*1@t/" + cHTb<҃f%/FE{N *Ѷ 0JDLFsNe VB g"6]R_Q_) 0b(BP+BHqRY}) !3br)[Z-Sف' +96IDqӵ:lS?6'@jGƃ|WRH%3^Ȇ/G# " bp/όe*q ҁ(fAhлP9jMSN ޠbpn(Bí#Ǒ89w%K '+ zpQjI^ڴUbm2 KҸ@$B +(|DpbLPov ͭQy: ~" P{DqtCl8eQrX5:50ԥ8^~?D PKJp9 (Pw9hj -djo\Kzh KDq(S0R˦^K{npc +AxZp \!2NJP1XRGP[hFhwZ69's~3w"  |s_¸?$R !*lcx=g xzq=rTgLEmPLl]^|&os}_ {Jp5Bs4{妦 + OtJM6 :_ x{Dpހ ˠa2%k rĤgD ҃0Mi>," ({pr`V0%KsP2Q,ť3ͳrmQe YqtQoBXym =Z-&l;~ +F bLI2_+7,!D`uǼڠnfWǶt +I*Xzqצ:!` ! +f1- \m^ Ơp{Dp(K +5P`~)}t4: +C{" +0XzDL X5G +#Y~"x ^*^3; +Yq".x`4>/OOV~I {Dp;V o 5;m>{FVxxujz3Wi +!&zpkYPf *C>xDqO ;HD 681Dqܷ]< hsMEMJ}lb֢ ΡJNpێ9II:A11䎚4'Ӭwں] +" .8IJq"ܰz[d +80 ",g__:pKƯaj XHpyTˀz*o$$/hjj80=~Uhe(% .XJqRP?ѳqEJGۗ" (KNOPaCTKdnAc OKԽ꒮ ⱘ1py=8 7p> t((jI=by+_\x_ +0JpAcЀSf@H0D2tAeDh ʹ1DpLȀ@Oʙ6҆4^8 +_:e" +6aDq*.XzrO/'ۻpq~P9P IDp +0J9㯁frL'1/iBk9N4z XbNLwp? NUB D_Q(ayɑ; [ʮT JqTvFDI_izm@ȸf3PIn" HpIpfu? )nuCh^ +fQ[~+ + xJDL`!StI#=3 +ENpD$C1kjOf IL=@C da>Cr-%GFwVR +0JqPߋET .ToMec2*w|rzn1:" ʤPbp8F8I6B+冹Y9sоrwu ژzDpcS`!Dl +eE +LU"Ѣcn*j: ƨPbp Ө 4`:A+}]a!th>hQ澅k +IDpX ! JDg:nOP۳A" + +bq_`H-xƑ0D2D:j~5} pxZprt@4pvۤe, +]JWrԜ xZp6@H86񛨐pl $]?&ٟeRh +Yp +AL2`N`1Zpgyms?a_W1" Ipڂ`VYTE@D`\CNc}, YZqWs paPܹITcPT +;%~njqLh +&Xapo}u48es&n22#$$l_BK?n  +Jp\D7TSU۷$a_Q5*ctPLu" +Xbp?P + +P 6 !B ?Y̳Zh,  +JpJ%}z +Þ}Hɏھ@V +0zpgݎp@qbq -su /_>7 XZ +qP!*p84!s4~σ +M" qzp@ @8<}7e3%Ӻ[FSG]?4p +a +XzJpͺ0\!:r=Iw|t,iEm[{y[8 8bLwG0GPR! +ū>!} Y.8{qDemA +D&?VJNk ! .Jq>9#R @ν!ԉڬ__" .Jq> @+D.RY G(J| ԗܶ[ +I2KNq3F +J~`\SH>Dպ#fS *xKDq`@$qZpDL&k=h +6%?an3U 2BpЂ1i??z7$V#󼯹 " 2xCJqHek> +͙Y^vAKDv@|MLw|3 .0cJqyV|t +ZR]D#ær  + 2h[NqRt$r lIҙpxMDojF .d +qiP 4?({t;uj +^Dj3" +.bqj@!AXX @(j +Yqg +/ pKDpTRR#aGE+b"% piFow| .PIDq'L$'N+q$$L9% &Qo=K` + .1p͟Ű +UC4$3WZ8" .cTr($<XN|hW@q=]i? +.(cqd- +|j*`+W)aPc˷y +Zp@{@$UPK*,0)~f PcTq/0,Ŀ(}%Ka)YiǓ" *zr9H +hH6PNoƝ-Iѕ$ +.bqZ *'א.RLYwhH6X&5e Q +brAkq +9b +6یpFF3&J7 zpAu0IRWj)Xx?Kح7" + &8Iq +=ŏR$9u|ǫy8,H#Z  +Zp֡ +ouRa.~ŢiDvV +Z +p÷"P4 X1|~u3 C#w .AqD #2BAam;PYͮ {~" +3JpFJ @w@sy5!2}1PnE 6XIDq2C]EB|( +Fb=>mFev½ h)LRj:Y鏉JisO')_ͯSPs +I>3DqJ00?1R%23ޘnG1" 9>82q |<X@ӥ%BXIDq`%""ow!9ZO jpOlA@l弲nah7_# e*" 8Ip#AA +pƿ; OR?$4p0 +A8Bpp^@8` \NNz,_{.LxVR + :XINq[`@hukp@fdB X0L{V| ʄHYjKX.sHX3]3" +JVLBb)ek +[B;9LO +! +XJpb,"YId0|Lo4":$frT9{ 1L 갔@0Ņs) pTu^~^ J2Dq0?BAy +>W0_ղD3œɻ`" +JXIDqݾd"D +d+YBT8XDAdk qXIpe=EHS`p$캁`@Qn +X1Dp$1 i$`Kaz{g 2pRͨBD +d|,Q @QV/oMIt" +! +81JpJT5h29ZX s ;]ş7 2L +bJ" +'2[mz !R4 +.1Tq& +x!d3i+r xapn(FmM(tq~V7M .Hp>HtMZ 40!J}Qʀ# +9S" +0MTQ4022$碇CcJM_X:O9j @汐0pD@X)P\P$nx8Ck!Ezz=6ºX +9*X0q`N=*;t,aLMk )orm!}>R 0IL{0&[M舆IyPp +/R" +y2INq]" I]XAVlз*BY<'[ .0q <P$ض KTcg{HjPGG?o AL$7h5WA"?>4ʒ12+X +8Hq1*J7  @va~]Un +ժByOU`" (JpdII8E@]e "1}h>p+Supn"w +28Z +qZB;,D%tF܂@Pj6g 1NLhٔTD#qT͕0Ѝӓ(l8ɤYP 2XZq좉Â6EfjŷYWK$ +S + K" 81q;@Mb .IDpފAd,_kR28]gL'*! ʤ{p=@*T tTV(H=$\4b*w" +pZp!4:j *\pmٌ~oI}ʡZ .aDq ʍ Y-S nv> +#;[/z ʠzDpה=V0ӑ85jr_t s_lv3z[W +({pvZ >E$'FRIBt?ouD" +@zDpGP 0ܚ75X}S +AcDqG8$4|S1`IJ*f# +W" +&pbpd +c +2V6ERkoFk;iýL ʭJq[OYlpiQ("\ō>d-i%ğO .IqB˖X.5&;JV7ӘVfp@ .Pzp|e2ڄAnf{|wsKм?E *1q BXwCC-N)" +*zJq*8`Hd@tvAI,ʌ>:SI +1*Pzq +K! Qȁ m.oU& +ԇ y&KDq5 @49$$rƸj iR#QO7uE{=^ +pbp]w,ԽMz7Ďհ[b_+ir +a&2px2>|,LT>B@W˩vz #RT#i"{LgJq /tTKf(ժ^ѵ +ʞKpq*?yԎ\(7 u3lVC?ԍ {pA2 @ @>evȮ +00IDq>QcF38Hw" + &XHpwfS@(P RTEğ~ ~c +Hy `̂TiHz07(Xd3}# +XIp=~VNQS-8/}*s08R ({pw `";A $>?{" +Q&3Dq:TJ@ؙ 4qG)tQj KL*(s:` \D?v)T +*bpTe7X(P1}ռ;t *X1Dp!ޯ^ +kO{ٖüc OC5>Er?:L4" + 2q4i!@5r=IjHoMry^_C X2qTp^uR?"*03/*- pYp40$mǖP8 fa?_?3*)I XJq +kj:]"io̭U" +aKp懀?bx@^P!|vtEs PKDp{ :]u~8lT߫)BȨIY3m +a*xJq"&ʍ VA9' 5r}zn_f X@p>QPʌOC`B"-ʵO*꜀j" F81Dqg=,f}` + gvu#uo + *3Dq)0A3t +0Z`|p#3ڃն݀ &8ADq B.F?8>1Ѣ/|$E +!:XIpv5f@.Tх5YNWT" KJpd +Ͼw'aĿ֞gZ +a&p9q`fg(ZV"dZt[4( 1Dpj@8E`uj#Uf*N@ҧۉo6` +0IDp0@Zj݀ +<h$F +l31" HʮPIDp3 +D̟(\~}񦢉VٽDU 0apBGN$ue 䢓r$oAv "8zq,ɀv+%h{1I$") +< 68iq䴺o (Z> 4ʾdGQ-=ȕO" {L)b`-&g^"uKp8X( +X0p+lWUcDwUM]Q4Do .Iq5Eʜzr(8@bxr j* +) Μbp]hţm$}K;ڹgi© JDLBm$8 *;6t5;'V" +*8IpOq:W+zQ(l$re pf2F(ݜA;LEhʋ`j2 {L}hЀxAcE57R ~Y\A~( +IDq_6YJ1F3^5Jm[u/Rby/" 8HqZr*g:նˬ_i7Fw ҥpzJpo($|䦐4Kzn-cV1=-Br ȲzJL檷p1"oϰQK[O² zJLcD6(`K8( @#֣4-MٝHz" 8YDqoHѬ[Fh=B_wO Z]Y1ﱾ +!cDp=Mi= 9a@GTRO%Fn 2#܇" cFq΁H+ L,K iGѧ@ܣ񶁚Old> Π(cpa 38M`1B} |!6#" KL}@ ,2 ph0:o 5rR3n+0 IDq:P4i\8Hi Bo}Ռ5 cpڥC,RQnH$>&_$b`5? &0qL΀` Y~ }Iy* KpU,P>" +Jp* 1a +,IK8J?4_VY %S XK L4굩VyAXB &I$?`Y +Y.0bq:ܰ 4}ŌŊe$s#A2 ƠIJpȈ Lf$;$gr*H+zg3GV6Fy+" +9. bJs }B`= /z@j[?v{ દ8JLH,鏤E:zltJ%Z (&nc 2pALx`8,g1AtE^gE:X]=No + cFpɐ R* .@XJ=D{ W ?" :Hqچ3`G#¬) 9]AF`jZ_/)qTA KLPHVh*.˨TopJLZyD 6IDqGT4ZL =#IJSi*J*tm jgLe JDL9#AV4Vi%2$Q^᧴`.A" :JqE 8D.ˀNpTB!2^J}^Xmb &ZqeXCAʌ2$F2ۃx3 c NGȩ+P#L .0KDqfgB}9; 7 Us[C KN|{[@2te +,^@?OK{T֙-}B" +QJq^^,ueDSY;gI29|?]' XaL/0 $8fCA8VBxA]9 +*XBq& "LC-ҽ9E9QvS|" X0JL 66ڞ7RxxOڛ~-kU}JP{" +XPbq@N@9ܒDghPAwWޡݐ ~ ILWoQVЁv~mCQ{=v Ѵ7/=J +`({pؐ`H {@3 Efqu2iqw9{S ж0[L7 &veT^/ƶEd" +q*Jq}G!aEpHV0+h2ڎUzzt">? HcpEI\\6JQX #FPg &IDp +bⰾÉH0%=E(^' !X0p;:;Q<0w=i[0ږ[ ꍿ" +ZpЍ +\j[@T~ci Hz(z F2q`Q=C)\Z5nEr;{NWF;Qg „py`I}dUfQ0AR%qX?EgJ xYDpX, + ` ㄇ' OX=Dmno Ƙ{NpK' Իvh}/U2o%V`'Ê" +*Pbq78`r$hkڼwJoOx7Bd] ! +zp +8HҠl5 A!!չ*~0yN +PZpTgljlm{sZ_ y +Yp1KܠH1Dho ʤJpm`}sl݊t,̎ fKY>Q]" +q.bq꿸TRP +C:cTVw:kw~ pJq̖pI?D8FE\G1} +Ϫ X0p1u򀀀K-)0fjΪoU *81p]0wYty"=@F<З"t>ng]a407" .p1DpuWU8 ڃhEG3ͨ +!.PKJq;. +ѡta~>ňm)mQ}FCQ8p HZpDP=8 +}F +x9߄GkcE^ +xJp2dB@դFa Zk +aKQyI{" A.Jq &ZǢ7% qS7,W^4nV +@HJDpx# +@D#XDB|@@&N_M "XJqΡ: LX" g!kpe +@[DpL4va4P!%w֨>SB" P2JL0SƆ@AZ})q *3: JxIq!! cL +pU + r +VlB FIqIG^y,CG,ퟢL +a&Jp +5g$d8f +A=a]X" @Ιhb +pZQ%@ +y,p3.JnE +@ʞbp& 0zb 3Z^;FNY ] JX1q )4 I +9ݴ-?/~.Di h2DLhѹ`u5YOp~30?հfN7" .01Dp!Hs +*%m\Sd\ *jDquQ`^=Vr(lvٲ7 "XHp| +86\XEDK6KCUՄ]!E߿M .80qOhHsk 5?;J,/ܙ~ +Xz< â" +a*JJq5#Q&^x ydm G &0q:`\!J5!W5/1?Žq +!&0cJqK+F,DNPkYQE]~,7 P I*P3Dq9S͖`*,{GҖ] +FjGc0:;yz" +A.1p U<85c% +/R?}NLw폆 xJp5HOB2MBa](Ha䝬zW5: }K Jpw~% %:oh״EB[V]fH +a"7T0Λ{yN +2JqקK DSF h_y~o4.c" +(zpma/)- +O5cDG4D:k *PJq3 &}I/EVulbz\C^Fo# 1 +Jp_Goc 7RLEA +uY m9 +VBz+ ʱIp^ X +T(@X?ᢊm*޹F" *({q'CsY`Gk;l? +a.Xbq|?5@?R7&-ùEkP͍ .Hbq;bQ 8ƪ}DjA-Αm^^}5 +.bqWDM \k hMOŤ&Š4}߹ȁ([س" Y*xIJq= 7@cꠈ[ +zfBwF\ +*BDqj lhfJpPsm\OILR?V^j PrXII}! +WA4R)16pgh"|9ŏ9]8` +JpU @4)fp\P6\Ro7'?" 𲥸JLbt cfӪkq(: Z\aGW?#ނg PbLr@F'D-R+R=n6V-Lg)D xIpCv +sibŔ8UV|V < Pbq\ +AK5Pqbd0 ;1Fr#\" +(PzFH\`ј @Qx>,[}27-} (zDpmŀ(M/cuLI]2ls/Q[w)T zpǀ-r= D)UJ"⤹#CwS4;w# +PJqGCB%: '0Qf pɀƺ.f'_O" ΔPbpxlO7e  EKRΤ_Gvt +00Jp/>!p"ڪC6lx6^ +NO* PΐPKp2N>6|D@AHƵK| -O ꐨKDrDHl X{%:"o=ɷ$ ѧп" +aIph0*t*rדPﭮRx@xc JYq_09uQ$ ݘ $lŗC +*XKDpw#D],xG tE;~1[} XZLX`>M +dB`Ƃ9@ x0M"ѓf" +q +| +pu!Lz?)A-0S!7j<͹8|3z) PJp`  + " 1 +x[Jpp^\Gߝ4T'}#tu +j +1*zq[?g By\Gauzs,9 +#? IDpbQ0p']/|-*<rjFF3́ßR~9a .IqC= +sI [D~W;_" !&X1q9 k>;AJp@8f*mCD/F= &cqypЀ8딴(fMV?kP_8&_ +. {q"Q@% 9AɎ0:P aPbpW00–/ + Hu`y{@" ޔbpK `v4fokZ[oe +&J +pH I8f@2VB/& ƜzpJ@D [5z .X1Dq~h˜ M1(0>ĹSjտg~J +ʟE" 楐)pQ<2R 0™Q`<>G +# +0❐Zpd;@1ܨ6I1l* g~> D +>Iq + + +i,Han? X8p&#dd:Y>&БN8oY" +:8Bq+!`C|$&PbEӼՄ_ bp ݅@ 1U@7S +T95' +9.IDqN#I|]©zﲌ'y\Mպ xiDp ` "0*|#8*`j1T/i~" XHpA;n8# +kpZ+ou[#xb +Yq7⋗ @9 njA%z)k} >X1Dqp@`t؏E.|#Ѵ#{tۧ9:, *XXqK1 +@$ȊwéXŸ⺶H'Kl" +.xaDqtCmoj $`yllo]TJf;R  J +qF@3'^C0"o +M-w + ⩘bq~< :Nh:,mLE}#_sy !.XHq&auJ7rJq#p" +*8IDpoyd 898=.!9r_nfoS4 *XHqڀ i: +\e(ErƒSPz z +pTJLZbx4 1ڔ?KћD *bq'!GI\ @Ɋ䰚>G߫" .aq+ +HLQo + :S>Ca#1jտlo *IpT4wm/%툿" +BYqQ:.@2ܒɌc7spMn1uD XYq?XgE5`'`O|)%2 +2?;U*~f XYDp?;HGfY.񒂣Y:i6NRx˫z +!.pbDp8K0f*OZl Y[!/^`LI" 1*zDr#7ο#8[ +4Lj%Dg>ͧX֢P +Q&pJJp `GS_r~6 T 躭)LGZ^bž&ePzD +)*Jp0C`Q90vàX +KJwʟ#XY,>" .[ +sTdv cA1J)Resu|/3 .bq.Ɲ EŹgA^ 8IJqVP")@F *(1Ý~]U;}L !*81DpP *'u OR@ %⺘o~F" +Q.zDpON*P +Qyʠ( VꂛҁI f8)D(bA +}j Waa'h"'o@M +I>Zq@?(: +qJi|.o7 !:XHqFC PKf09Kг?Po=ҡ~~ +:X)Dqx`!<0}xDLg MdY" !68qM̀ +7-C;uMnozu +9:Jqr \JܾC.-ӑb/ >XIDq V!T3 0%07~]܊D ?q >Iqk<.;$ޒSEd2Kn%49|Q- + +X)Jq~a hTg> BL } XYpׇE׏LՔPb +mr۳q~H " +*1q;X* ~@ ˄X\- ݫ + (ZDp +?\͇1Fk#7d1{m.VǍ+ . *HpVԱ`:DחjMhfE" +F8Iq=Wq `>i2H\s.B)]8kD0 Yp lb*"b&!/ڰj  +ayp 9#"|I_>O/t Ipj0zPB DNE!_v1^v +g" +A +({Npf:qӁΞ%%ңQjƼj + +JquQ@,@P: +P P12z ʴYpddG Y`12𱺰lƬ +Z¨Q2 +9*Ypkw.HP@r}M&*7v:@" +ZDp G醌*sZlhX!PWsKI4 RG !8p<}@0ȷ '49S +<ʠ <e7( +! +8IpPPx PI<6 qoV Vz$  +9pzj~2#V2|$|币>^Ԟ5!o7" +.[Jqui8hKR5S~ሌz  +P:p:S%ʍȸy(ž\w~x24  +A*zqu07,T*Tc&>x~cVżo)ȍ +yp 82eQ 08}Hʠ^}" !8PpŌB`\9pΤK:孾Y9Az +_ك (jqQ?DoxPTE  yJp'G +pʊs + 0u|ٽ]L#o +aJpO;DkfP7/zV;GvN" !:yqW<(=ɀQ`i{"RhZ*e HJp%#`T.ӢF;-7ųf +:Zq@ !%eF~%hC f7 >yDqjXDhLi# Axlb _(M jDq2I_f*3`!KO`'vVG" +BXyqOZɇ+)` R]E&/we'Ҩ 6XHqq%cApʜMrWC ž9Tf +:8YDq͊v |52o1ݑ3J9= nvDr 6Yqi[0XX&G P.T" +q>8IDqgnJFL!Փq3nrW`Z +*yqt`6F8>PE'?5twy &iqyA@8@+iqBaBO'AQO#_b +͘QNqF` e^ޡ +q}1*\q54b" + &Hyp}l +T +n5Gy ŐJDLuguˎ-@̎ja3>˙=WfnN~ hbDp@' G20A< ``:7+) +*XIq"w:P4`pJ#.ynS [WW`ʧ"XIJpɀH 'S&bN/7Gt͎42NF} +@zpaڸr5X-"xY &Jqly̑"4-T,&Hfhixłv, +.HJDqJFp0k+ RQoZux\S" +!.80qZ(3`@Z$_'c +Q~8  +ZpIá,fY&ۿ9wgűѿ +b +p +RuF'3A$r̚9R58!~  +b +qm61ijC0R" 6H Se" +`zFp| +%iR`dR#p{ OEI .͘apq䑀oR:3vK8-I"Qp?  + 8J +LzXΚ]P Hlaۋ wˠ y +zJp1MWFEI6 +PE*1픇Un'P+ٵao" +zp !i O셃z&u(uVO +8jpH$t\_ya# 4`|h!+wo? ͐QL]M #ͷj8mN +PyqNgVL`Գf}{:-me" 9pIDq_$Ph +?iLGd"/9Ч;o +`JJqϮ.;; YO:4Q/! 0Iph$ sT`S5AoΘ' -L +*IJqSwԠ` +~恒>E)!$֨fMiWK" 2pz)N+2F] z-0+)3J;~#Р pJJp(p>А1w_p0F$0jWap_c>dobV *@J +sN88+kPC1`|} ᆫ>q򗺻 82pof +`bb([QNp|17gO-BC" +i&@Ks7 +@`J~ O" +:Iq-_2P]1ehN~Qh^Z 6pHq qFN$R~tLa +[[h ɵsk) 6IJqˑfUB>"XŅ޾Gp4Ǫg :INq?򨄀Rf[B +=U{!Ys鄅" +):yqNPh#lSH%Hv>"?sG1M i>8Xqmt$8q%2g[w8o}$+q + 8yp@"XO2€+ jiDŰkP%0 8iJp``VAR8z19i0u +y:IqvBRܡdkL<-_>Sj|yI" IJpHدXEN* +R0L +>Hq}~sL@"CX7toSoFm/ 82DL Z†ˠDجWNI{2'AX 81pUn q@X*aW?|6>-9۠2N" xIDq["萌 hX\-^"fvp_f" +.IJqB>ƂIAbMoO_Ыbn +#R$9 2Dp݁*d"JPmVkr3]:!حm\ +`81q[qW,ޛI}T^Ojƈ&`ʯ]Q JJL G!_ޭ>#VǞAK" +*Iq]`?ʢUG[t8F, ^Tǚoa 2ȸIqk[)kMajymaӭt`*{ JJp׋PFrU^b%T[/:$f}_;tP + +Jpeb +E0ﰃ!D*yWbe竛+g"JpeX, to,LRӢG(w' +.hYqFʬ` `5PZvՕ`4}m24?  +ZpKhz\( #PVi(@,/y Jaqb8VwP^PB,ղ?" +YHpC @z#@Oj:h  +Ր0pr@sC#S@:PX㖾O&cMSNsN +)*IJpqpl L +YLFΔmGT'p\Ig[u 8BLTb"0 4GtGҸSЁ-~rN" I +Hp;@($dN~@Y>?M Aoarނ ΨIJp\zP`f ) +2 +X61Iky>E Aq:ĀΈ1q T0 +@t?(k qnlڇq_B3')k3 :8AJq7j(8cʇ>Pۂw >PIJqܠ$`BF0 L*O&c߮w:t" +16Yq[ǰl;A"8hRbS? :yJq d`p_¶;+Cg蒲s aNp1@YK{ ˷ޚ >HqL6UP/$W,(CHzzX" pZpGU]p`kKm3SrurYA&Tv +)>X +qE!q#v6—{X-]IL :8Hqv#>n`vQ܋O?@\Efw\ pYPp=$@:RnQ HE/d 0pTm- P(5W\=nA +QEFw|" +2 +q}|5uLI,&?+aNSeM P3 +Lw]G41JeLWO +ݘ1Jq +asB |C`3\ob!bo Bp0^TR+D?`8BH5v|7B}  " +y*xbqf- `@Sdjb +|}F2]h+q .89Dqkrp XHoIU/{"~GSv .8YDq0ЭL \e$@,M_7j ,̫Wбc *yDqYJBb)=`HNnyt +Ob~0" IJpk20C!5YEJ6|̼`Xud .0q!@U@"Dg'us?;Vw9H+b޿t XILY񖨏OJΕ +oVAo0 3LO`JaM!O./?wzv3?" +Q:82q~`R-^6G~ԥ\p9B c 0pGP@ Y`ݜXyq/j3ȅ0Вi$M9o#+r+ŧ&+˦H :aql\JTM 2U syo>S=w p+LE|=` y`,L0Ar[%T1R3 +>aNqGld~f]E^UeGd +Ш`q,z̢ +80TAGw{OL2D 80q_z삠 d3YPQ7P:l6 +xbNpf-@BT8(Run" Xbq iv̱!3k/$V;yHVPۂβo# +!81Dp؋u 馥;8)v5- +^w?!. "IDpm``g15f>⦍a=.~+]sX`*P +"80p^mM)X e +$B+F&D{2" X82LC=̦b\ľD4 6Aq(.7ϔ 80q@j 2,o%(sEHqcP[ڡ&c 8IpE$ԐŃ%RK%;=vB 81L?o pL,`R@W" :yq-U 0` jhr8;‹d2[a F? +1pAFq@f&MT0rC#ߣ!/; 8BLLE zT炅 J#<ʿPes~_E= "1DpY5 p28cT +܇&∾Mn" Y +ب2qE.#BrZ#2L:.!OYyՑ *1Jq[TjQ00 +  +WSh[gM}ά} +681Dqߐp m ťKBc_+N^YT *P1q_`R2p$ctɚ Uk1̾ZT`" +Y2IqeB~/l~h4D*cWv;[،5 .1Dq3pd)@XLk+V,*8Z͍" *0IJqA +h,Ui *+rz(r," *81q@EfVDXrуPbH<׿ [G/6 1DqC(  Œ#B>AZH" +1*8JDqd@{́Ɏe>QV-{iQ4Q qJpb7@RT1c`6-O(A/CiFU ڐJJMqA@mtT,%.ge}# j嘩BDrv pZqN&ܨ, Ux7@qa{a" +ƞ#Ӷ~" +).Jqc0}W5Qu49q|12X +1.8J +qxB (Xd> +4AONvYR/? IqT0 _$$,bΙ/;o8ݨi JNpj܂ 4,\"PA߰W߆-" +bpA@HkhuiXCq,쓂:7T *bqLq% )>@\~2\Z3M;xߪ p8IL8 d +0*UCxiyKwzW3 bpk#H6R.tlSCBN":f" +Q.zDqԑ!o, +ǥ#Yb\[p !ڐIDqlǿ|_̿d/M~`C8 &aJq:h@Hܵb qWЀ,_@CwW i*8IJp&fI.uT?# ʽ[.ݠF|FI9" +! +bpfz-?HE +YZɀ +#CQ/)&J +Y.8IqcY[K+~o`asB ^#! FXcqmyZB+<Ŏ#$w'\Fu)M^)˱ 1pl(†mzbgp7m$u5C>U?(." 81p`pb T +IhPS+]I_`m1 b XHpk#NST;Q|K__`蝜 !.paJq&<)Rg}q'E<av4" (l  2cpiE:W"5âbȄ`!.q" +ITq|r +j0iSH +l'0*f a2ݐ0q#p=~&Y_$IQ-ɩ#_  +82po_( +'oAwQÂCy\ѳ2 xIL]~pUFFVmPÔI3bT +e=_"*Iq+r cdĄ| |3H 6cqiQ,hOC@wwy WRNA3O\" Aѐ0p(gUz*ƙB cSJ*-4Z$*Dp  +ADp%ӝ@jb# y6 8Oj  YLahT +y9C>q-Ę8.* Yp$!A7AUZ5(Ǖe`" +bPsW']M[U`[#m4 +.N%Ơb߹ + JLpjBtDZ+~i>]'CO~78 A2p8tQb'AK:Xu\} INq=mvR! p +Slp +,٘r" .0pr4ENCyX |ZQiuƨ*s꒰}|2 8XpAsz L,Y 1RFPP̻+u< .X0q*f#"1Z#w5aC+ۺzƕ3w Qt! !ZJp6*@٥BՑi3} :" I6xB +qՃZ + m;ݽj92*T6  ѐIL!@BA;OÍ$8uya5j|7 + К[L 6/Tf~w,,UliW[ :{q9.r0]} +~xO<|l!" @apN._s7(ki40engh~% "Ipj'4CXSm |[EAY Hp0LH q+^PTLo%z*¶k Ĩ2 +pcCn=4\3f[~" 2MP +H" +K(ĺVO67t 9:{qWgHFHMWLrB ĻH1Jp1 +L@Z@ga7H B V#t; 6͐IDq>]aq~Qڧ.Y0p"; 8B4"ڧ" YpfKe/ef^`YbpmdnG٫ `xJq@ + i8* WCj(_h6 Ļ + :JFsSvPI/Tp2 +@Aܕ8xY]=$Bhz ĭ`1p>`=(2i(0P@U8K$>+r6(܁7"IJ Y*2q_AUҘ`Ia*魻]TKUQO'}d ĴY2aq,ÄXeO)(N.}mw_"ڙ |R\ ĹIDp'-"*pnٙCsв) +vʻI<" ļ ݘIDp~E! Z Ovћgf-@K?B6"u"ľ 9.(IJpNk8J%Q*"pZ$ ЊՐJNL$%w#ƘD_=NEUQz@Zvw~!BI Hpc#:W)[J}\&&6( YQ37 JFL2ٱڿTJ@d!X +1Uè" XJpD/FSr3յzd`!dģe(6Z P(J L'>ޮjnƽpda0?rQ$$-) JpurDԵ(g Ta{: +~u .bq0B;+@A:)ID&2K34" J +p(; + + |8L;YoS Jp29;>´3w\TYY +.hbqT_nX4I &"K O!Lb 1]- +1"Hq0J"Pd1,jIq ܭYKDٴ b㏹%V, fxbD)|x`zd;"q"$>癐Q@H' ͐aq21D +:j;}S^62(v(zs F8yqUZ}e̪N MڝY Bb ނ"ľzLLlE!iTc~vB*FDJz rbFHaC(fO"-$h'/7,ㄡeh ԨBPL+ +[`mk )D٘v +9w IDLZ2璂g@u +NBbزAE z %"XHLs#w0 + qW[t bp  E~m_EN<|8$I1!t ȨJLiq"5` cҨ\imoܲScT bpl0r05sH 0HDl^1CO| +bG " Y +PJq Zp OU +l(%0P;R4Q5E%) IL=? + ķGb1Bi>;8/psUE]r Zq&-CB,aJ+ 06hjݲUZ 0ILz?\̫JW=2W +{M+Cw#7VT3h" cLrg4d^`=#JTYhJ ILo];|U2 .Owgp(!6!x ȊJLV8lBxt-_cS*0 ǢQ<4bd㔝 iPbJqzZ#/yvh" ІzPI|MfW!&c;y6aH k~ 2t0$ (IL1X8 xn'%co8ϻ5a (JL@m9S K OҨ#u +,ԓ 8aqZ3\qU?^J_u'En X," +FbLq'HV1.܈= ajEh?* NXbJq6qq^VO^_cA0/͢&kCN*. +$Z<^ ĽxZLHkHcY*vh'Wˑ> B4 ԨZLLVt{kjs|;Tu&O+<6K6" PШbVL|+P+io +lu|?:;AAV$Up\ ȚԨjL Zޚ0'r@@D`TPnW JFLɠG>geHȄi`{2>DoX( A| ِIDpQ7ݺXLWXCP;0s^{s2}l"4Q" ѐIpQ˨a<[JF7>Ã6O=NK Ț(cLC`0`ޔ&]jqGշd2ʘ IDp%K,mj""NUFD>ߗA ʼZNpwPD1(DZ.{qQxNkpsg6(hq-p& ĽIpcڑOz p醇 +? (N͔ ِ1LXU0aoNh.F2au`"ȚbNLI&XE(Q +5mɶ !E{B9q :(Js(?,q;S}A)d-"i!b bNLJ8s C1kP=?Яd @|+ob Ր2JIDf0}Ȯ_$CPr\0yY]" 8cM=Š(Dmвi̤#Mb,W#t( ؾp0L; /ǀxhں% WzH x1JqWtPe[1A@feɧG6_:TX% "PJ +q3?cEVA%@ +明 W$*e3r""IJq2aH:-:X&J4*( p1JMTP#Rt['sG<bQSJ2Ck" +!ɀIq޼=~ `nO‘ +K݃3ا)Ή hIDq}JN)򠣄Z PA@/I@{a~L Q"zq(C Q4VP(}wp}?rӡ +i bJqPd fb26wlD{ _Znep" h1q]?05 i_n~hLE;z~9ĭg +`2Dq7 =28/ficd +b[Xi_/ .80pM@J:ɪnAQE89xIA3;* 2pO|@,،Lϖ ֽgp9*Ґp^EMǾ" +Q2x2pN,45@ `&D +{eXx0qugQY? +XIDpo0P娡%3LA8svw} 8IDpd +?XzB +j7G)~־ 1q4@6|Զ.:kZpI3YaJ]" +@JqZp}N*S|^niC~in-vQ +@Zp|P !Ï 'Wo m wZ* Ԩ2 +M0qH&8vT0ꭥo=,k!ޜ ݐ1p]IQyxLsaaJ\~V ?WQg" )@asG8!B @JVr3 +IPJNqU9VFt9EA8jrHعWY(Zf 0Mgw8r4ł_v)XZUR * )*p1qe${A!j +ŭ >%jڰޅ" +QHIq@3}W:?<ꏌb{{ 1Jp\^@X>1paSRق&(" PqJ|<#`qUɂ * HIpY!CMRP&tҚJ iҘ$k_Vpv> +JTpꣻ 8k`A 8$iVMH[amo X1qnQ`0݀rLÀʂvi + 6" (bJp'"Y7/`ej^s|pLΡsةى +`BNqPNHp"'C5ZtŽg5t1_ 0pՑEPZ$rwOct(!Ɔŵ:9=t + ̠KJpr4 +d|NH>{( >T@z !*IJqfz%u +a,x2F8llwWK;;?j" +9&Hq( + y@i# +΂ '%nQ4T + i.Yqz,YU>**4s;ʡ)~`X .0p.?tL'?QTg_D5Hj Pp1Jp^nĤ?$vpz'd9gE<\" +HILB)D 3x D+P8 1!/BD"TZ 0prNV \{WU`m?Pr +6Cؘyw,3[9 .{p!0CGf"iY19U:Tp1ԟ J +q*_zPL5ts uCf|G>԰d PIJLNB& + Ücl1Չk"cW&" QpJp+[L`)mV>; g +aAf PYL +|f<Jx] +mg!rџ4 !IDph>bF SkY +dSѼ aШHqv(f`zK0 +VsoGmIꚞ4mD[K"Hpaש.F<,ۉN λa XZ +01LgX0{"Bf꺰C\ + PBqG'0.@Q +|8qPM:R2413 IqZz8/e&8 "/:;sd;7" +JXHq ,j@:bw  z2*i AJPbDq)NEBY;\*U38,>pg hJ +L@`(_Y +d14ⱋCk\MtV ШJDqxk#ӡXV.G;NMΈt9" b +psoKB pl2xÉEqDwzV0 ШIpp|@-0$B"&hʧ\hfBIA}k ՐIJpX`IŅ@钡 }Ą[o,(g" +!JјyDq'u@Hv,«3~Z^ƕF" J՘IDqd@b#ͪ4YNLpMq8^T ѐIpb +Uw1/6W Q@u +W0 pHpWB~̷}?CD +:t.]=y +xz +q8UZʍa}-ӴJub9|K"" @PJqt\&Q"Ip"("]@ډzG"Trl55ffcFG 2ј`qDF6@M2 +D L +ga:oW$W +.s`} JL$ %4/f8?0j݊ +ʍ Ў(ILʇ0[~a +S5ҨS٘"JJLO sFP[o-(y(8L &sT 0ZLHf ߒAv0WA8#i$G*^p˜i +&X`p;w< 65Iۑ M1& -6]2 jy(aqLc{lf+t0I3$&" 1apl~pfWXw0Qu-b%2 +& +"bq<:*[0njhZI(I,[`HEw p1L3e`AfOcypo|41V_ Y> q_/n6<|2H$X@zf?ϛ"Ip(#d0.:ZF܌a AQ嬣b? PHL`h7K`AWϑSmQ_ n `pB@Dk: +(uHٸgڨeB%Y XZLL2 gRBc{ ʼyqE8|)YPܛ)]H[8W qRwP=1D]<c2I(#ϙ +(aLGƟZF 2ﮔvLphʨ +RbG ypyys  5C a4j8:?ݰ" @pXp?z9|&rʎc>6'-NFj-(( аyLvZ,Oaa S?0I153]B Њݐ0L2?M<0o;jS-\:F{w 0YLbTkeEfr{z?6Nep" Iа1q  /H Qh,q 7||vFﮠ2Sh, + Ap?hݱ[̱Z.٦|MنJF}?$p9r% bLL$?#Mz7uvMJo +4. IM\FVtǚw$>GyV5jR Z" :{qWqdDӨY>Ȅ2c%yY`q znl ٘2qHi0嶒mcHNlB+GH Kp +ή +`;rhs7~`)5A6\Êq%hJ Jp({SvD$s5Sl\CEJe7=" bDpw=p6ǚi Xare'&,]u ȨzL:POokP(E#VҪa *ݐHqottjؠȀBLl[ɀ I'3 0IH G}rיZ$1@( +&8}ٽV" bplkhB}NZF^BZ(oI4rdU IL#;@6_SѣWi BJf&AG_NP Jpx3^ >J@&T,U +xL/<78#L +"ɐIqK.i~XpzoKŎBxU l<" @XIM +.@(R#۞?!ƓxCLr"ZC +> JJL"F2Z%&D.HI`*I,O JPLa8;xi.@- +;,&" hzNMyVpB mfO@|G٠Z("Uo.ώ ɐ1DqM/yw@<bbL +]Y͎g @JLLA,P!"" ;|g;|+@ `{ q_xY].0E<ʢ ;<[;V0nh" XՐILZ]r\3=2KZteE,0$9@V ՘HpCK40<ʁe`,Ժ.oаN+ 5 JHZFP5>=(I\Po #'cr qy ȊJ LՆvem.P qx4g0\ + ".{q +EP0qiwg'BzWc_ xJp{"t ah]("Ob=F0 2p>{uX +GlgPQN~7 `1HC@=Z; EQ;] ~디'01"`μIpꪐTI@|ާS"FUVW #\" P<  >pȧRr>Y߻Y Tb)[C +}\ ĸALU)W!Lo׆=*?qU]uj rP Ļ٘1LLyer +-|@1;dSӿA$("ľ 0ݘHqCDAș3T@!t4Z@  :3 8HpBeB. +W#atujB%B&m'BV\`SSR .Yqr@غ荘ER"ZޭLx&{" I.bqy<$Ʊ E"^̦-宄)a8!e ILצv&1Kf65d':eP+ .Jq3.TCIC!Ni9kڋ9R !.IDqS]Wk{l{s=oe)U_/-"NbLq~ӌ lpDwz0g!'hj" Ŀ +1qzTWxœd̏+ǀ"FC ļ1pza$7"Z9H_rփ +Ʌa  +ZpqkufR~ok4+$ pA *"zp`6= 3w ߫-Y@0"rlj( Hpptċo Ab]} +vkN IDp}̶(uL:ɔ?E%FO(Ԛ bPL~pL9EM RHat~⳻" bp7? +%DAp% q+k ̰J +pMNIX B2 R py=هoc1 јJLl,{ :a^^ ܮm_F JNpsn#$ icF&%~(P&57nZNʁ"̨YL #5vh<"eA,}^"-Z"W# PaNL)?Q,‘b ݁t7oȂߡrS% IDpȀ |%R^_{5cV X8p GHKzv+hdkq!E!a ߩ" +9z +pɘ2@ivmm*Q*> s F# xyLn\$}'"'٢)$>(%7`7I?_L +YapI I0+kUp g)T( bpX\q1<,X%@Ef%ij 7ěN" +JɐIqJF^D=28g)uJ7>[ 81L#;Y7KƢ:.KD +7Rd QxHq +iP .U`JET,'̋' + IJp8W$,괓*GӈYRO<>#a" YIDqAM`W4shM]Z7 J͘1q#Bp"i$0\cm oCA +JXyDq"z"(9tq&'j>"F;36_'1(!. b +pT,kYFTyq5YI:#/$%ѕ" +YJ͘IDq&uG,!i]SH_ +D;GOB + Jp68 ]`,`ԉ|*g6?}ڽH *PJDp8Ky Da\K(᱃ܿQ$myfYz .x1Dp'X@(-O +؆Gn!p" + +Ip%fT7XU +mgof.,QQހ< 2pE bNUhPbo>{ZE /D7 x0p `Md%@3(yLBԍa 1*Jp4΀o;:Lo`eHlT f@ +" )Zpz Ipfi + Ӌ.T Kg{ &( bLh4o=,1a ;Uѝ/qT89 Ip@D0T߈n2,d9ATB]"P 0Jp  +RWWN%tSʏKv" +İZp& (;4z\&{͛{$fA ѐ1LRˊ3r" PJNL&h-ʄZC$r\@l<5ܒZ[h9 ͐JpYȀ1D{@b`&D 8IKSxQ 8Hp*ad D}IϞ{lխKT0ձZζ 880L/(z @BAn胤MBK" +A&1quB 0Y;(K/;pˈ +0ѐ2p{etzoQڍ ޢmǼfc% ZJL94=1`-*tUp#|JյC ՘Yp1]c@ + G('k6W=mq" *ѐIqWj @q7(T ;"o;/Գb>fc *p2qC1FdʕUl@PAw 4Xb<խVB= +*͘Jq +~@<PCe8`m {zbUU.) @cLLcU&̸e(IZpKLKxl0C sU" +*ȰJqU`m*P +0*cEјG(l .ѐIqTA =҉R$b3Iqj Hq#<9|&B=@2%ƴ3V+n}n zpŖm`Pll@ݸTW " !(zqGa"(RЖ8#CX$ Qft Hp'GY)0o+ ^r :`X9[A ٘YJp?փB"{rcX +ʀҨC2Na; XIL;zYu&D.K ,XLt +@`Z:.Y" +Zp+t8@B^crb0Nx~: .Jr'@ JJ6<hc:w),< y2̸2Fq +`f@`- $pĠ Ip Ki68p8|n7WeH-}E[ ШapCX3Oe.`[ - `J?b- *" J +pE7& +ܶ PyD\1G˲*q@'r>j B8Hqo~d8Ʉ) +^C%7DiFZ{ 8HpKޠX >GBlTn橀i?/i p0L]@HHuzXsbT:] dE|fh"#y^" +&xypLTl AJl3Cgpʷw( Pap)8WCs0_RyC>4m>m`:vDϥ .Pxp @2B門h )l07Xœ$b YL1| |m[XPgB]f" +QJzq0CУ0-ta Xtf'7{+l߼E?M JX0qI00JaӋ;lQ GLbP +@ZNpy@Q×QTS,M~3" +FɘJq$ Vo2F5Q3xL$/3<[~ ͐JpyeDt +eBUqsԟpWK +JXHq *Ŵ6Kl66 d$S!j3U ͘IJpTA4f +HcdL3$ C70" +IFX0q +P{nx]W=-z +C-  +8IDp@ *$&{0 +W=y}B } + +6K +JpB(Z~ba -7@Ǫ9@Ed@N!Pn PIpKq=f"KPkPm." +FɘIqHEK*p` 0 [)>-= +!JX0qj2 MGmKz#ߚy}aY\@Y3aa JDp#0k=3O{l]|e,#lۗA0 :pA~yIiqx#&HMhrQVwF" +1F8IqPCjcTЧ8qxе$2 + X2pN.H6uf!BVrU̪:o 4w 8b +pyDDڨڡ@(;}mHJ_tA%nI + İ{p_#Ѐ "~*9(Bʉyu'[vg9I" +Y.ݸIqxPrcstfP;'C! !*KJq]dԊb<>,ęGBwqw{KtK &J +pm +򕓑W|6kB hAlv\1A= *ȸIqfT)qu>O>'un"KLubp6(Bɟ*2Ĉ +BZ3C_ +q&xJp(R{Uu7́2 +Uu¨ *X0p1_ÜJ +J\#Eho Jp9s(~9S&;^XqQ +x" + ʸbpe պ9 GM nj \ʉ| HJpfԤ 0D{M&sE2yk+E + ͐Hp؄5@ jǃ.c:eIi:#LJEwER ј)LG,JXNMK0zMJ~/C ѐJDL w 1HhQD͊&~>= +E+L-u" +cp}洯B @qChƏCm8ʘ7 ઼JLL)د@0(c z=děAg#L~٫. +Jpo`fʥ9ĸh`eoo[o[ hcFpA>wP^-4RH}DǬpUmQa1h" +A͘IpȽO#?\&0a60˃4rS? z ɐ2p}-}@0W4L]㇡ݭ>R:A hp2psVEhfjɃA57Կo3鳭oo +*81Dq'X'͇/jt EBH ~ou" IpZ62'& +z +ٌG3r 8HbTpNv# +.!^%C$]k/nW XƼZNpȀBBMqM"rjKT!B|I)* +Uʾ ѐYpaOD  csU~'\_>D!bE" +*ŘaqW +&^bsKP~:/R *ȨJJq?( 7 +x82x1'M +Q*0q@ &%mCι сJY{² hJJp̯]y@(( z +G&> v" +*KJqpDj;ڦ6XLFMG ͈b +po !74Qӷj*xfϩn .՘Jq. !0'ѺCMjmB]4Lw+tg *Yq{U@XAcTQ:dkdѢZ3" +!*bpH&.Y.>QHu3}NQHoïj jX(6bD`zґ+JƊ15 o +bz2 +Q.Hz +qgX(삆 +kICܭ#.=>[r:QU+ .ِIqoxkD$D<}Y +7TzwHLϱG˿x" +2bqNQ +H`cI4{!+Na16Xg[;;uf#: 1DpھpkHhܸ<IG6BCQ KJpPz\\ .8/!Eߍ|j\(K~ f2R(X15 g(s2|qQć0Hwv)" (Jpk.HQl| + x趚>}L`oq .(J +p !bRB#Oh0+C]Q +!*Jq(.FKބa'5yy*T fѐI( 5!: k(Q\mz G +μbJp} . `] S35dݎr6" P͐1Dq󁵰 $$xjByLhaT&2 oזV6 +*ɘIpnX|P8xl8ddJ=6 }HG 4Ţ .XHq7A26O W`EJ}]QTU +A2JqMV#Y zx=|fL~M4>:+OO" .JqQpTEC[lf\x ZQY%| +^p_N HqP r\0[l[ݶ}7%}Z5 ƸbpF1~ 88 +I'ћT3^vV3@d ͸IDpt A'@ܺ07",,H:nA +&ګ" 1*`q H +"emW,%h@,p5_#LKP {Jp;| ~1aV3\G?Zbk({| zp`R-&UG},w/8gg.g/ +.XzDqz}J8(MKM#qsus{vR?" 0IpPEdTPLra>ˍ*G˞Q i.0`rQh [ׂ*% +(OT +,K1φ>P +y.PyJqX+Is5rHuN:f5Anγ@\~Kq:B Papt{yH|yWu^lQߔ)`q4 ·kL*" .Pb +qy8!5K-B5Xs~%!M ē (Bp`t-|У>0?De(p, ĕ JpQX|N+$ rcD҈[dKd7 Ę XIDp$990A(P2pJPeJ)G["Ě XȰZDp>%CpG̘+`v!€ã jDI͗%Aj Ĝ ٘0pTUIY@d(GRb@ѩmja^ʺM Ğ +(K q.A۴€8wi3ڒ;(GuYs& Đ :8Hq76(g\뺜ln"ĉ PJpďU ﲷ +#d6dXM1:޶UO ċPbp &|&jC}5@ϏEb +  ĐIDpppK=0`d%cNF~7E ŀ8 ē.81Dq,^@BT0 o߭u/#4$ l8|"Ė +bDpp*-R: GYfJ8KhD|x8%\^. ę&PYDq^=m2[5OC1T'#2l Ĝ +XIDpJW^ר[.:K?< + ğ(Jp +;!_2wÿo?@RrQ1V+i3 ĢIDp;W]HvaAS5q(#[F"Ħ zprʭ-@P.|K)^{ ĩ ʼzp'ru8N + (@^36O,$h īѐaDp͔Ht̪Y.>sR3+I. įƼzp/` BudS:"A_ ϻHNѿ"IJ .8`q' P9`ϻT0Lڇ0;љrhsQ ĵ ͐HpD09@i֦yT)LySq{ݡH0(#Ȁ ķH(arɮ{E|6GG fGk5 (4, ļzq9qTbREPͻxC78  px " .Ő`q2KޑGE2ރQT!\ˀ4bX02 ͸IDpCyWf\{s1vRPQ?@ "Qlx> ɸIDpKGkv$<҆lo~ +x>h<¸\<7 άzptvDJ:Z[, XoXku&j +" @ʴap- YY5 z@ AN)W)Xx +4a XHpܮxK/_#y_?'̕6fPf 0 (bpńx^q-qL[kK90>otv-e"Ĝ>qT[@$0"]b(W\XB eIB{q dPȠ&ޤrׇy!h J 1Dp `Q k^Q@*ĕ[ PrD'`mCʆzeO] K +FXKql >o=`DyϮL<&,ZT . ;Y +Ap&}09B%pH]HYJؑ"3q +ҕ"@aDpw6 DI2 +/,떮;o D BpLOq`(ǦVW,r%dyp F !.0HpI3!Pl\(³toaC Hhب0pMm4 +gmdB TՐ2JLɵAͭ,6)J +4Trϙ%8 X PJ +p m9zwRTeʼnhé=zE"R!LMq "ZxbFM݇aFƉ&DBNx @́ONaƁ ` ѐJp38p6Ciׂġ\ sf> cPJ +pRF8ͰdK +2-WBJ)ܿ&9 gIqpyD@D,OY z^cb"k 9*80qD:ܨahX@NR~ߓ?e0 n(Jq/Hd!({u^_C\)`FV r1pH="V +;Tn>j:5l<% u*xHqD0VE77Ge" +#m"x Y +zpP@%q\F7\k:"՜|?H`$TzҪw#P z.8@pvoď_Ac%70nMJS" u }ƴHp +~ +rŨ: N҇A{C;i āPHpߘ/&nߡ[@V-.!U]#N"Ą `pot}8Qp1ft(&LE] ćxLI3[tC4Q u^)PŎ{A1 ċ  +ypQpDt6$Ue0Ix9#pެ č .HqE'c , "1>t4Vwԣ$bU""ď A +yp_J@:7(I״%5%}ع|}9YG Ē (zpԒQ?7)$D S{Ky(G Ĕ ypJ{ik2wDk{MZt)0{TAp% ė yL$=, 5BdD74ߙ~`Iƙ*"ę 9*8Hp>B' ,1Y:-_տCH`R$>0O Ĝ bJLYɰjh=HwG<;+ dQJbǼ Ğ { L@mC׌h~.@ +fvPI`uہ iS~g Į(aDpeW4UHj_Ҫ +$]iYv"ı !Ip_s 0<0.㝪#`rA>?=^ӊ Ĵ !*Hq@P]ěpCj=oflb;ӊ  ĶzDLZĺ3CX"&jT_9UڅĆ. ĺxL굥Z Fa0 yZ=l3}>W,@"ľ Yp=JC 1ςq~-)&#o(*r +a;- `p̒)y 62ٕےuc xxp>Ht26Pݩ@,ʅU62nn PbFL_&$5`*U'&$_$;Xu" 9 +xp`e= +/<ɘzR+R1D,(p x`L]3[^C܍v AE6prH$$y ! +z +qez :% c̓(C 6Ya׏ yLpH EP'xo:ЗFj'f" aL+Had +`-")(D41ؘLAL P1uE  +xp^P6_>ajޫ /3 +OB,ά ⁐xpҪ2UP\T&˘t|1P밬j,iI')tC ZX1%6HoLN +ĕڊPnE@:pe$"ppzJHB!U1/G m(>[ 9k~ + +xp DHJuc3G`]ݕ lzFL̐ʀVa6iml+ -kT/x xl(yH9U=@oL .oIGAd.wj_ו +(pyqb`ְ'wm RT=z:OM +" tyL8N\/Z@ ˛|{!k̻2Q/< dNM~6E) bQP;o~]C|{ pyq|1AR;ʈAxG3bF j hFp`-G!GE ȫ%-ҋ\#8V*N f" apPDpasM$`w2`駮ctuI +PXXp Ѭ R@&~" %\,wC!-6&UC lPyL,Q@5#r(U@n>]9:N;Yv" 8\(DLMH2?^ٓɃU#w9D &503 TFL +=IDl ,S: +Q&5 +M]J dyLf߰lN%H3aI'гPj] ئlyLMCGK@a K1`OA-j" VmbL$L ( z8(8%2P`O(^ +(hyLdOLhD@1!㌜Q.c)B myL%b`i ^"=? XyM؄ RbF +%7@{Πc t VJ;hJ-" +8\OZ#r8d&li{Yɀ,/@ %ĂTcwL7 X>48){0`Ab1PgI b u$QVT  F0ЈhL/(4t0@&48 + +q*xqp6~ +W5{>E]B.BtM3t"yDp-\1+Fޙ ܳ +:X zB ¼yu_ ּbDpM%C[mӱIAk&8!H-D^_ΣÉͳ   +X8Fpxҙտt6ae)j[[xq+ {L#WXap=R zdr<^jBZ" A.aDpڋ +"{ > +5HfGjs5%W  Y&z +q>HQú,@^@\"@oԟ4s +L`{ŀhpuGQ(Sn (ܳlGK? *ypzƪeR[D@.0*$(QRk" A*ո9Fpm5OrX +3yqjٶf( ت[L;r@6>@o2(hJŠ+!wEM +  (bI +_| +;N]cw +$ggQo` +.PypKtbK XHhV -J|{ĸ +} " 8V8J$N5MZT<@,Y0gɲ  ՘Xqne]R4-jpP\KI.q% ~{Hex@i +)kOXåGgY= $ ŐJDL'0ȣ?uncT ) ِIqLPQz]]jfe'8LǧIt , !81DpF Zv?= +$3= @5". Ipw(n~ +! %1 Mdڴd\ 1ȊJLŴQ~QX+˻@ hȠLFDqskk 4hbTL-JQZU +Q>/CG=_ +D 9fY(~~ +g.뒹bkl1dϦ"= .aqڟT2~&P3uURL]3P @ !&ypf%nI<%-lȐ{%E81_ BЦzLoQ !궉 b_}/"׋U EaDpC.X%C"6HqKuƊz#*WFgf 4"H 0bDp@hXf +FAw +=V \:AAc K (aDpU0E'")YsyT +4p  M ͐aFLu3;g r~#ӑrj\LcB +@L( O8IJL=L}23w`ؖhnA L7N?H"ց +B"U Q +ZDp2+jT);ʕ;L(:4.Aڢȡn WJDLR\fOUjպE]FA2!Qb [@(JL~UM2tMN +҃Cvx+56sS aYJp>r]`hΎƾ +UB@^f͐SN"eb +L]Q'%0qHb|l.s0H jaDp٥(l47P |iGH%o7:@ m8ʼJ +phA!?b&K~F/1ӠmdLo_ sIpN$jx6" OD7;]XB +~"w Q*ZDpqĄ@imC5Y_󂢠!2OJ y ʸzptD/P-.T ^-A5u:\%L { yJpVˣ86|x`$D^Z8 } !.Hpzk⎞A"kne[.D + '^"Őapjs45C2b_@`kYvVIYHIjo@sS3 ă*͐IDp̹_Oļ{‹@²g&d} +V + Ć aDpf9 +@<>CP'`uj6[1e' ĈƼbpG56:Mn S5Aη_壟0?"Č zpL + 12S5ŧqXȍ)u; ď *xHq_EL>:b(F.6D#h đ bp@L-f*>#g0Ϡ|*P* + ēʼ(yp62"Hx:UZQV!d'vuGgsS? '@y"ė Y +bp!`Xq?nk6φY5%2=,o ' ę Ip99I_Y;t%X2\ܳrj6As ě HILu&C_KL)śC7w>3[ ĜapqY+n +y kW¿iƷ#jGܩaO`8D"ğ IqetPvٲ +=Xv1vڜY)IA4LN ĢȮHLAD@˷Q62U\b,[ * ĥZJp^?mx7&0g)  (>%ME..KTq ĨzpDmDgC6 &/g^}TD~.wD"īƸyJp _}@_@$#C )1S@~ģ7] į vHA/ۄ]F +%Q!%'ڪ+D[~W ı ptAmg*8-t~s%1iz׬(K{H ij *yDp(]V.z]4Av-߇P_@\a"ĵ *ŐIp)#|`%grCh5|y dt~|Д+! ĸ꼨IDp CLdԗH"s]U5ЈLщ3 ļpJpEZ}"s %@ +!phڌ= pIDqء0xLž\>#wcm zLfyGyu +vs({C + ;_PE/G"!c" 9JphN_LzC* &d !͸2p3}G镹|ˀxDy8Pm &ZDq0pw| # |&D= 8zH8v/Ryj +{/+"" *(zpf@H `@f1b@F$&oJm*[ &0yqR8PgLGsXkqqvsu|~{ߋ pTqB(.4V(NVӛ'J ypb(j]3B +8L~)" +y28yDq-/N:&f&t4@'kmbB1 &0Ip*0j4o|<ڂա1ʺϺZV &:px, @9yn*d%rSqWZӶ *Iqʀ%A&1qi{ޢP-K" Q +IDp;HE\ lp 9H5fH&Άf"k +IDq꜁a0d& i tp7U15: (zTLugE=H8 lxR*tm*3vreA;q q +IDq2⠝h*V80CD'BYYj?zI!" +IapD 2fҸ^;_\0 k 誤zNL*04¹rl|ATtY5BƎ@Qo +a&aDpE3Gcaͻ%0 +&w)LW; bL :ZF&OFLƒz%dC ߕ-" +Θ{p5p2%lks]:Nhicv/ i +ap>dT!TĖILʰJU ڴ9U^8 p{LBs"{J +|QsDƥU䦲f2 +PʐzqҜFJ jK|e EP1qUJ8g˂CKk%A؜Ut/mfY ĨJTL2S 1IUZN.:>%&^Bs֬("ī ՐYp;ۃ3@v- 2SQ`jM1nN 1X įzp +\'A#!sn9V[PRM(qaj IJbJV([8^9{\ئ8lH Ĺ >01q=^L+ /J +AcP"Ļbp&cdn(2qfcf;mvא$p04N Ŀڼz +p{'0L1?+}KoF٨`8i0Q, YDp-*ߐJ*oB1@$Xz& zpPc:)ԽM_yiՇT]PX" 1͸Jpf#R> +'K&@J`ƪB^в8 !:8IqE}D(~.x%-B/W~7 >81DqF,>p؀EH`A@o[ :X0q(mo(pchsp +Q.?LUaʐ" A6xIqSTrjpṝx]= tXY )^ yp|Ȕ Q +۬P|a_Zj~F ILP³#/XCsۓ$/lJ*﫿 0cDpjg聁҇HjM''|Ϳ7}a" (JH3|q&u]ɏk[BP"+ {LA`X,ktyT$Tt$Xj6Zl'~%= ͐ILvStq7Q.R\< (߀D. B PaqJ4&EI7tk8tꨲBW$oy z" :xyq6!(<R Ua0MGɂ3U}hNF xapʀ +$4e]&+ȕK*ղt !zJq^ԀA \YI )>L +y6׬N=eg +Q:Xaq?w86Xp?k0H;Ӎ뿍 h5|q-m" 8aDp$!Dq h<:Bnq_NaqI&H[U_Q^ :aDqȦ(ɣ1gRG{м:5Zrx + 6ɘIDq +G׀AJ$}0RȮ5ؓ! Ip{u[B&:y6aA|ʿ(ٍ-O}PՊKXP؉׆;R3z 8IDp *}-`ZzgY;}@iR + +޴zpau@ Gv;rڕ&f4w ȂyH"?'f,|Ўvɟ z:7o" Q68zDq[8磔Xlsf[ƁPc^c] 6ɸIDqܖHB=l$0^rhBq';Z9ݯ}܄ 6aqFl  tHTWDKƮR&o` IDp{-:@rm"F;7=/R7" +9ZqzhV0"N>lL [3*dw :ŘZq=F>p elTmA{逺[V۫e[ ޴zp~=\^3RwM"LSiu:YX +1:ɘJq>_gd4ٳI 1EA~ GL)" + ޼XyJp$A$#c4_4O@Y +uR~l PڸaDp\4!+mZnq}y! LFR7 +>xxq:tGZ7 یZE(^d +õwNe :Őxqw$7Nz +,];.:qH%PP)> +" +LL%*18 +=:r`W@3kS5ԁL(1 +QyDq8x0(@MjD(*`rP7dinnKAE aDpoGc@I%':1R\k\xj51 +>zDq~)~Κev1tW&t +hR  +O] ;"JpZ@`2R +" +&Ahÿ UVf +Q>as_V ť:T@̾p@rqi" ILdJΞ;mwXcO/~v(q"o IpR\ F6Y@/ȡVEg=2[" 6aqS~S7:;3ȸM9_~ +i~u_ {Jpբ;\68$cM׸zV1VF +6Zq}r +na0L!=黛F# ^K(i &kF,:D{KѽF;]?" +6Iqo*;$rj^2To2w? :IqVh^5q=>\FVi΅ZkӾT :͘IDqj%x0AɀZ,TZF6 B'O@o~ +:zDqF%TpNz ~˦FMOY;m" ڸyp&@$\cp333 oYb)œW +Y6bq{ȁ@@Y#3x>ɘBqզ8o+ŘTLf*smP-T ]v; ޴zp1@B. +isi3x~ڏj^" +>XyDqU¡Q`i*%B v[ xbpKO`À!8{po-e/v'ߓW ILނgLU\G}D!AӖ] :xIqO2p8m'-&M,5Qǝ=wtnKS" :XYq/*L۠}0ؠKM碨\B|~ח JDp3x<@E#4G giJ/~%: bperQ08߆kUFmm :ŘIq% +'5X.fMbSPq'^3ׅ." +({pQS[f8gGӋ2E +!"IqCh`_&Y51QT-x2U-H 2Xxq%s<?8vtb?Aɠcz- + :X1q .X!' +NG'[ . +] 7- P@~" IDq$2 ÒL6'xB0OWP +Pzq>rƤsڅ\V͢<& j-| ڱIDp p*v/N#< +Wvzj&SdD ޜzp2{9H6+ o5 w9*a_/+h" +A:8aq3ڔETk@a +|Jny2Ά$"oqf ֜zpV*}po|hӖ:v[0&U CW+.Q: ڤXzpnT@ۀrB͎ʭ$mŤSKUԙ,{ >XaJqǴ:@:J&m(B3l:T*B_~'" 辐({L*ɒ 3l8Tl>7od& ڜXzpz"@ bUSv +*8׾%Qz >Xbq]@NN 3"ǁ685;yކo ޘPzpk"( }H@d_/ +[6]e?" +X{LgUN +t=,jtcMWi%dx yDpp+2D\Bѳ#%&7z#} +XzDpm"**h +fFQ:p54TOb apn( (C(pG!O2UT_Ӧ" +I>aDqlZu\& Vje m3h_) :Hq %ƉɎU,32q8$ gwо; +`xJLFKx~@k6TtVu,L;"5 ބ(zp>= P X5>8=5MMz7?f" +"zp@bcB"@ilr(N[(Y#B?\K p^XA)`q.o8.) ӂDB7Gio +6 P`pf` +x=*p.0O%81k&ڧ |zqL1y@}*,b8r?KR=4J/BTC+" X|zpkA>pQ­#<@8'p;!LzQj +FaDq Be%`$EʁΉZRzSf#f"6J# "Hp`1@p0Ɨ2[7PγǦ1q +xpX`yq(@ Z4*xax#+('8" +!&XHp"=P @c9] EVW?;#r Hp4 DilB*3Ps#joƻu&ܮ!j *IDq7q``i;F'8<8.M@<<!G JHq`GvA (Ln#ͱeP/(o][" 0ΈaDq8<Sa./ ` + +ZoU]Ŀ XJLdDQ\fL~DGA MӶ+ +S~ *XHpT@ @,Hy8Fǹ@o:?a?榧" +*yDp"B)siz#57M;' IpQ;C@88<Ҭ`mt `)b!C5mbH5 +.PIDpP PVf 9]ƹ} wFWR &IDqC@`!`z$8GѼ! +( {Npgw 8c`*zbS" +q"X1p#>\t0 8p.H.[M1V +^t"}T +PaDp+'H+{I^fqZtK)D­V PHpV#sא}4W~;Α*TSR{ .Ip0"91 {]Av-U4ԋo^Up" A&X@pE) A„ +盘>0?e + +XbpK6 0,^qbփp.˝E+4 +PIDpI8^<“"ɪaM>ٲY 8 JHq1Dp1?H(rرOK(j7" +9hJpĞ/@qᷡ6U"Hb^a- QJYq)PLt)L: Eb?C>}* + +&PIp6?c"cB$H, HoB? + +8YDqtppB~|$3/?R)݌:۷ί" + J0YJqXTJ:h9YI]m'o?Ua1ld  +Ip#$ "4 XX޼J`$GvW +yJ0Yq +a @G~h#j y.;BJ?O{ a +IpS@9 ^RmK~i3xnl;}" +`@{JpPT~w5,ـ$҄/*! !*PJpAVbؐ8'_so]AP۟D? +i ZqnΤ/mӺ + 5=/VG> *1Jpx !+b2h +NU;" JX1qn]@( hcOԾ-|s +1JX[Dqp0p*0ZYC6rNd~ٙ~ƌ XJp4AqR0VPP +f7_w?!? X2pThJػcE|H>N F{xA" +Paq,,px`vwj_T';1 XJqE f/Y`c׀< +]UGev;i !8JqILh^kp˯pWn1o0۞ {JpI6t '@V`T +!ỷE%zuj" PKDp\,`@1CPˈxvnrgwE x0p{t}ŀiRbpPz:W"zqC{" +ykDqDl 7s]Aj_Q2ލ2Q: q&XZpTp]) +;ەX +#{z3IC +!"Xaq>%t Tt0".η\l#~q j6( @|8pT I}\[u1! ճ6" +XYq +@XQT)@WsJ2 XkDq*9K@`o- U?渙jX: + Xjp Ͷ1e7]8T,sDb7D6WV +A*XJqLr6@!P ֹER}Zz3>" +jq<+PVK|Ш584b~`*F̥3 XJHAم^L +pީ{GU &Xap_Ô6V +G +NB?B+ "X@ql@'#gX{"q02Gh" +&ap5RL^UYCXͻj X)Dq"Ȃ# +\A:CɬBz;'ቓ Jrnh1VG6-T{yFA &HJq|1>`ntD$5p.뗖}# +͘;ڿ_" +0bp_pun@p 3m2r$N KHd)Tr!Y0.`oQ3m rG PJ +p8yno"u|L͞B?NX>h ґpKDq!*#v +QBVt^‡D[O2" +9&P3q=E`x0!em5YÁOPlqڷmgtRW'' &(bq`ZZ^ at"9XGIڿJ ֕Ipu` XC~dݩ%5GXF?~ +8ҙIq5e(D1 ` B."EoXG~)" 0q|~*̀?Rؐ@t7\ƨC!ݎ 81DpzAG]F) ^v'(|)\~X#k IpV@Zp"W-6F1$h1Sr񾀦~SoǨ, ip6 +hE x寀yCX_ܢfAv>/" +`yqvh  ED;g_2<_/x<}0 +80qByg` +g`s…9py)n- 6zqP 5) -I> <@LZ|ߛg +a:Jqg7\`}>~D.D:S tɹLQO" H0ps)J4Aw$H"/]s?uE 081DqN `(@t?>I1qL.v! +AHqj!J t"H K2zB(/xϕu). +68IDq*tPR! IDCT,[܂ww"6yDqh`t0y+kG9[fA GSn C~? + 8`qmRPYGpqPWj"/A;; !:8HqՉR@Q̀r%˖} Vy;8 +ބ +p@Tmh +W豰e6~o`" jLjuW.cu,aPd({7n +!6bJq`T4Y' +aB΄+gm ܪނ 6yq` `:b~1_ >e /A" 2X`qcPa" 3iZk#U(/L]u5gZ" PX1L UP 2G`Jy뢘[CR>2:p:4e +pbp8%ui *A4SƱ2nxssG>muA {DpYx0*=A/fz7: +Pap h ygbWt),S p &ZpW`0!d rfh,GoǛ6omB" YptPf!4VouWK~:xv 8IDp3TDn1yh@: ~9G IDpI +'\vB#zYPT +IDpK{J +.{ aoZi?*\L" +!.INq0x`}rR2`28@e +!-;7Sb *8Ipg(us.@P| (3*O ~3z +aKDqF |<`@t":O!V 0q?,? 8aTp+Xh@A*bOԚ}&" +&JJq KUp2 +V \-4,=U_ 9p0@Y0H P!xlH\|7:] %j .Iq.@(0)kMF(LlT}QVgz4 ap&`W#IE1sz*I;PW_P[?G" &0Iq()MtCICoev@?khAt +a.IDq΃ETXg*d"dʖ[stujD .8ADpR}Ok`cήcx|Eߖ$ +Ro !.IDqMRp@ E/K>罷ޞ0@B" +a.zqUK(Q}^y 0j@i7RVD/ 2kDq7R ۊiT, +4 +?bh{ +.JqھlQA[*c +?3!¶7 +>Jqt^qO :Iq;}\y50D'.#KSo44]" Q6@IsY  ]m@u~ +ks/ +)>zDqv(8%XIq[[cb^:T({~~Mp",D >Yq݊N)TZ dJH5*Qs7xoYn" +q6Iq| "pT@ +xª,ѡ G? +k 1p +D)vH+D u]/nORhhpgV i>8IDqhp2%Kr*7$]۠}FlZ@ +6aq"@--Y |p_~6`S2u" 88YLd+ip `uz^tNȵM?y|$ +I:jDq#h 45@" 'F [.6,&yU̮3 ADp +fm ER 90w/,`;*> :zJqHB(O|9ɰBcO<.P" :IqDt + ߴ FD "?c +Io# >@bs爸$Ϩ'@=R2' +g+fz vsz :ZDqqch4 /ޝ!.W1/Ky +>01qe<<\(JtƣgCi|zqFt՟P":Rqr*iBjQj(Oz+&" +:KDq"pH1`?e90&~uП_ 9pFఐ Hwax?!LNޮ| +QJ1Dq!`ezcs`69s}[X!lQ P2p!H@za^}-aiB-P 81pf}"X3.Pgo?tt<m0*" +A81p~pI*:}n Z~yBS "03Jp3J@ B0ӄrDl8Bz; +81p5*VW+. Kg0tR9QGI I1pSE@E>رZjOW ABp`6 +jB MЄV75\hg8< cDp +t@`,ˡ7FRERh&uԃ6r~C +*0Ip*]z3|1xh +۹ˎ/v +" ).aJqF?)w2 A `p4pH+4p&g JpHq6@>i(ޅ_Pq,Xv"qW 0Ip×B}z0"\:aV$U,"1T 02Lx?.&/Mt0ͤ/iQ1u(" +.Dq>3'P!UBO !Jaq)ʃ۰#+ޣg;|"%ЭFk JZq:{$ 0)4@sw P% +(36o_ JQDqwdA 4{IYR +!BI6.fröS" A +hZp5Ԕ@i EnMn& |@'7 J:q@ >Eģt +gEy] Jp9q_ wl@7C)7w]HAo( aDp +@B]tvho_h}G:9 ?" +.AJpZ`dR"XgL&: !JBqx: ]Gj`5t #JxS.=+x J2qUI`% HF[ +m3HLo8R |^ " + +P1p, +W1'A%'m +=Bg` +YpYPdSGXNcp,pQK?W +'W J0qwD0O1H" +wڥo' +YpxF} *$92 +޾" +Zpڊ/ " B +d3ghW[^?܊ ⡈:Dp31Д@@a1pn} +~?"kigyQ *ip{up$2qGT<} +SAGP *jDq[o&iCE_qU.dmE +z +>1qv0K08Jq([9i~ϕ.GAG +:YqqGE@ ʋG~|Wl vʺ " )pAհ{̡cs?\tp~G~ :QqQItm`r +ðX]'RkS pRp?̀hW$Ðȶ=!.>S?' +6Jq@I g47GyKY/" : +p!Ŀŀ(|nx'06d11=N@FH +aF8*q". ְ i!("fO XFL ؀ +!l\e'(8ǒDpS~*, *cJps& +H/_ yMtl%/^$OQ *IqoGF( WQ4xf@U8q?" FBq ~0`;ri"e`$*G3D"?3?:  +CDp'@O+@+_fqh#xbGrQ +X1DpS "i\,^i~t!JTA`" +!&8ZqIrXIt qr#@4(7 *zp9ŦA[lH6 +C*'C{vv$+TF~0 X*pYI3B-K,R QSDlj2A* X2L&'>D7kc݊S=ucyTT紾PDPs " I.8YDpF Zϓ,!ZOW@@\RnPX ⵐ0p m7_ ?הB1~T XvhJ F{s۽O<F͸:N0%Ӄ%Ӥ Qpxj;pYb*Swzӝ}P d"QpjOPt#㓩j >nƩvhB?ʜ "QpkT`^Kq{0"D}eJ]AULg) &9Dpl8 I=(|Ccl> ]u2@I8 1L`X.+Vo9V9?(E( ad68" !"J +qqR /c\%@%%R Y"Jq3ҢG=6ԭ$~pL>'lşg pĨ1pJJe@(P"pC,q 1N[CWVrV-@CFC(A#\bzq" A"8(qYTe `$.Yժt[ +{6r: JVL:y5X&BHXs5d 2HC1 &{q#%TX + +2H@<߮ ij +"٘1DpbLݜT[r{向cY +@r,x*Ri"ıȮpJJLM[9+_`j`6_"R ĵ͐ILK2pfN]4<`3R-rY*!P/C ĸĨIL_- .Myꇶ +(:  ļ*bVq6+t a(|0T `Yw[=] Ĩ +&̸Jpy(iW7Ŵ†+Helو\[!sDI"Ĥ (X0pAq~x6T +0d +XDT4 FĘه +uH ħ "PHp:*TN.dhg ĪJDL&KD3J9jбJ,}n+P 9J'n ĭ +(9FYެ0 +6Hj([؅ [f$:G"ī48c=YjITP먻7 +Gľj՛ r @_# F.Dg]R}Wh4_{j iXPALtåBaT1S lHi n +bDq?6i]p[n`&yjhG䨑K^ǧE"r JpwjKbLqA[bR +'$E% vِaLQX"fGKH"K_e +#Bt1 zap,~z(-諙T18v ā bJpV#=~]M*,+n?0"ă ِIDp I޻#>4q+`U3DXu ć +bqxD6Tx22fY-ĄCU ĉ !1pP|)4 D{o +hQ +mb? ċq +Iqv'Lmq㟠xI6sc("ĐJ LU/BEfZ:0,ԽV{TA ĕIpfj#ȣ J vF5…kH!D#d  ę޸bpKsIT"Jx YVyaz3JyA˷1䴍{q0.jUѿTy sO tQ:{q1(ptx{Hg]GՌ5GywOFPF U +JFp.b·+~tZU =$>Ŗ7QHo P1DpR>p}I{CHΰ8K "TZDpt@ML-Ä;M)tD—TWIJ4V + z vPzHqf:3e+ :*4W$oDӣqǐ }0bFLqY:UUYM"<%֗wo(4 +w"Ā 1zDpd/ ͦDe@M*_Hc6 ă~JFHwQWq1&F-aHPVa3, ĆFŐa$N]+@$H@LhS!82Bd uV Ċ PJp/: gKF?X7!\1ݾX?u= _ ĔJ +L"OШO_~n&Ђ;䀰ė™}-= Ę ެypi#jȴ3ťNd/ѐJȀI˶T!#J*M ĚrbJH/,#>8c=Hn#pS*dWA"ĝ +.q*=V쾌8<2Jqj#QVp#=0p:)R+N l +XJFp>v}o]Z*ak@ $M14s"i >8JqB-l;L"„d4`'gL[eVc `  +Jpd'ׅp+ψn+6l 8Rm1(DG bخِILCN8zbT +@'b' ebpʅj*X:o + Bc>_@"iZL +_ƍգ +?t2{}te@p % oIpRnib"wxS.pj@ -(F rbJLsʜ~BJZ$LE0߆u +@o vQ +apWB.Ԫo3D<nRnp.Є&Tu"{ PPb +pJyv(1?ؚjÚGd=UB4[ !S }yL[{-vV" YVʎ伡 ăHpo@)$ZyƆ*ʪ#> Ć0Yp.F|u1"Ċz +p^ΐ gN8qS8C"2#?·dE3J ĎJxaDqBc +> qX Ȁヲ7S:? +p+ đHZp0*\Jl:Bwt]؃ϧ/`; Ėyp >Ngl|GKǏ{vFg)"ę HѐaDp@0R+kKroʿ,<0 +0!2-I ě ոHp"1%u~}DR ?4UC|D Ğ !JѐIDq0ߙ `x|g + 0MceҊ I ĠZٸI$+ETPhgN}> Ya*hŒNg"Ħ 1X0p;ETCCZm6Ht2Ge{=l}҇ ĩ F8Iq`-6O400 Y+.Cv"* ī XIFLWgv72g '$`7̔T ĭJ͐IDq0Y aa?V6!s"İ !FX8q$; J'_f)g a ij誴zTL@йM2vkn .N~21BH 53 ĶŐ0p2FyҜ9QO0#5>MZQ ĺ͸ADpy +4?L:8+F*waP.,"ĽFŐXq"cxAɔU>B9*p=%P6Y ɸXpSn(Pw|DT!eпt +Bc@`?w Yp) ̘[˿Pa(ގ]Xn58 (zp@z7{ ?OItq! >ޖ)`a_ݼ ઽaL %0I$pxZx #d>&a b +p8F1QE1 +"E21L7_\ !JIDq"G``< +1QcM(Z]h@6o4" PIpk` tmN@Ę`fkQ"0;- XHpP$*35a {; : J +pƮB`JdО%q((_3W:@: KTpaD<IW$#y_߉ĉ] W\S;" !FBqpxp2Pӊ}Pnar-< PJpAJp@%-3' ɩ?X'knpE. +XIp*P2lp dߡDuQ +@GO|WH(9 FZq5\ +n׽5:+P𪧻Ac" +" +HXYp_r`k03@DXzj)qQH&[_T6 !yNp3a(# vF&Fp +Uޯ1Łn XIJpcuhxSLVe~˥t/(݄KFJ X[Np 7!@p@@nbnobO)v8A" XHpyƣ_w*b Xbp&f`G"z~ʀ0cRH<& +!FXcNq6D*(#@6T4G Lf Ā XJp+'%8*tp8LE,wI$}a%/M@4C" +8dp `p|p 3(%48@$ߝj4 + 8KTpD`@4R%3q~ē J82q Cʚ6w# +@3?ѕ-ʢ JXIqGw\t`r0\R2& +sߨJR" +qJ8KTqU ̀+"=wr>AP?4x XKTpV` +e*) /Pq4\P JX2qDĿ/jA@!?@0MIĎ + JXIqă4pa.d6[Y*FG$Sy!^8" +xZpC |~N~EzhP4i0Tϩ + Xbpơ?FNS*Y.37w) JpCH ( O Ȇ +Cx62gQ +IXKNpdQM).T#usĿ' +J"XJp d#1۶_/wY3O 9{ +qXKNp0GLK + +ښA3IrUQ IcZpA 6Dcy^JTO&wPJ'VZbȄ X{pݬV4j7Pcz:9Q#: +NV( "2P{s3kF (>HO&oAP ` +6Xyqk'<@0NrP"bu漲Q}^Hv ĿȶcJLpSucSuoV߿4ٽ 0YqK1@9cY w_Z7B 6٘Hq ;jgAeN%RͿ8  As3B" !yp=:#s+/*'Fe8@q +1:zPq*Q rV60Dd@= Ľ +bp@aa812~$ԇ8IXA>=]_ڡn >JqQbX–qd8C!v{za(d9t !>8`q A 働RpO)MA~N*eKlx"zpvh: dLm +h[Ч 8JL;nVǫ%ā};뢂.cK\e >IqV_,Ke.YCf4}ېΰ77]GE#e.zԣ) Hqe +*% uvX\yl(" )0pb`o ;rj-Go D1)\'9X. ap!FQBlV! ͘INqy!h|l"!̲ A} _+ XaNqDf iZtAO 娹|V` ]W *X0qI906 BŭP}ܠ'sj1R]U>" + +ɘIqFrH;QԻ$QW]\NΦko}q.ZP ȸaTpA|gr[/TWM(oPro +Azp$:k3X*lfWP\gUG ypciz).s%YeGМZS};[~Fk" + HzpX74&;n\MdJʂ=5"? ͐bLY@᪕VQ1{H +'u& +9*ɘyqHo:`/d0"y^" EWK.c +pzp߬&ooZP^{5xЯ xYp!,츀D8$P"ds>h"M<" +*PapCP>n"O''qww(uv aIp K(0R@Y7YLPx +pbpFX1|= +oؔ#eᒩ/ElYD ap +L æMeYp3_H?36" )xJp'jh. L.f}A {Fv'bwB"ܬ,: , 20qBA hɓyT"+x@Ms$ 8hc߿tpz=3  ؒhfL]TC'v%F)!@i%[w1^X$  lfLO&`Y_F'cT.!+[ +4u +oD ց8Mpj1SMX$wtg 8hLM{u" XhPNLj2!<~ɷږѧ6rR W;`8~pw ` ց\p4z֓hۂ` +6 +}‰`lln $ u5 +qH֪o@`3^ڙ3JMzI(7u  eNNL|sp?@"&GHo҄! E'蹋" \MNp[k3_@&u覚n`X&C0;-ِ)* `P4p&B2\>lqG9YnM !xX(NNЗ 8$ HBPdl!@] & ʒXcpgc˃xOΩzPuW;Mʐ`" + +|~NqhŜUUشjT95yWʀZ +ΞX4p-D4W]*f?4`&͛e  +LDq8OMǓ@r7?@@$$#,n@ ΍5p0/M>F6@|SFa"  +Lq$_7,VuPDfQfH6 Ή]p!=g^ Ɍ@)  ʅ5pF p%=5XTX>ϫ( Ή4Np'H +2;d|@2x.t0޵IL"# H}Mp?P1LqXՍ.#7,b| +h< A ΅M +p@@RǦ +3P%@ZT[F7?ݽ DʉLpFX neiDT $wYF."Gʍ5pFФ'c^E9V~;/1#DTSϸ K +8cJqnIM+VTp32S] C NL_Ltcp:O&t N$ Z2y E ֥4JpG*Ұ/^w.5 {[Ii~^"G YMq J@F0UlXq=*INR>E I ֮x3Dp4湖U9"*ߝ >#[`j KP|6L(!ޫxptcOθُ 0t P NLaȜYOO!SZ& X;ހ<f"R PxNL!qo \¸8@(YSi|z/ T/␀^ T`LMvJ"X%wZFdRE`$;oR YaBƚq(XdoNp !c$^ 2>[Nq Ȓ*ʝ'? +"kX`P%D0qA"5 )hKJpcn"qƞ`s8(w$Fa 8 x3JpczMćrR;wPjxD +H[ :ֶx2p;w8IkSwUo4$'_: =ֲxJp Gc7 CUH>6b:o"@ @֡4 +p5; S?mg(˨:RZ?> +b C֞XLJp'_T\2-k2І^][=rtK F +|RpO( +)0F@aG\OgLIj>g  ( KLi2qU&wne{쇖ѾTTd("* 8œNLXvUJ=Fqh|p-}heqg>pg0 +P -ȾXDL.|a ܕtO߫}N7ʨJ@co  0>3Dq<[*)6~f߯_S4d2 +A6{7%Q 4PLDr%|sI~2S!(2Evqn2"8 XNNL?1,C_ K~ΐ%p W,ll < N +Lݗrti#˰+ڟl@ > +~p4PRyXBhA4[Bay4*5P - )LNqR +@EqeVP a)fN!f"' XLDp@:'qT,A:smhN۩WoG5 d * KJq26| c0STJ?}LPgĠq , !5qy޿8 q ݞHRᐰ CH . !"X4pRk`(B^b ; XJFLj1 Pw;Uޠ1(RRX `MRDC"; pݧ|^oV+ѭL&鷁Chɼ'EF < 8bpPq/= d>!m  zOC8s' >ؾcLYJЀ +b-8oAaA*& AJp;oHTq7@>VIsF"D @ZJpo*Ym`5$|*C7ۨwX GxYpٚ-K]>)Tb!?{yW K ¥JL ;B&FN5e&-4q/b M¨xKL!H>EZS2"pgUvz2 + P xkLщA>H~l!\ĉ>)ۨ:-~r[n"R xkL~qºsr[Ҍldo^uؔ U8bp䀩.U{`f?>]OM)o %I 6 X X{L!`‰tTY:#ޯLE +8gJn3f' +S [ X{LcI7AYEU'5?q0 zʢHkbA}J"] PX{Jqt5!|W~rx-Z@$ZpT3#g _ P{LWgB$xyrw a.Sԯ' azq}Tgx[Ġ f)TpH(%_ eXZJpa@l }HxBA$:zw^>2"j Xxzpa?ɀҡ(%Su_ lPbr@o7!P".__L}D p xz +pNF1L6mUL|  r zp;kJ~ ,kK5Σ`H`c%"t 0XzpŐa1И I*uI}l{r|$ wXbp>i6muWo_%;-Ȓ zxzpObt Y- +g:Ma=ҍ? }vX{HF~EqKfRCⴐM~T!"Ā辔X{LڐM wbP(?TXUj# Ą ʭzLp&7amŢO{GCӕT@*7` ~XzL}j$Si'zr GUx8?˨;X Ă XLcAր#u7q,:3"Ą ƘDrjA&W[(!?P0sGLes,-} +>aBd Ĉv8{H3}㝘є@aFem*\- ċyp/n?KgmC羀`#-ÍXs&{ ĎvH+r(w-% +[Px86Q"Ē HPLp_S|0:q3Y Ĕ +pڜPp?FwgX.̯2 mZjx#0^,X ą8yp,M7 +_Ά4hti]"ċ (֩X{Np +rNW.l2@ +Z7L!n?fp Ď ҲzpA`YC-oFHɢT:7?m ĐBXzqQq +gq"($Is( +Z-nh ēBaqe6Wa9pG<(VtPl 9O"Ė +`Pzr@Xxz˘eYN JOD2xq^G0 Ĕ zpp~{v:Ӻkf?."r +$ ė8ap<ҮB< ެokQ!2 Ě apɟ &5!-*J$,L "ĜPbN&G;XYۦ*H.L)@ӤHIIAp# Ġྶ8bNLLLOPSv+jYׇ76 ģ "apjVm + + T@ҩ'bV՞W7 ĥؾzLW_LK+>Z bR&u[c"Ĩ @K +L?9$-aƏɔ0CH']VNJ īBxfqG~Ph`O*p{opKDqP9sZO?F:zּpg +Շ ĕ P{Jp# TBSA*g +쉾*>Wu"ė 1KJp1NR%WcܭiG5uJ FӠʀJP5 Ě XcDp-Db)>V_&튽7?ꤐF{!H ĜJph^=ᆬ52],?S= m ğ ֵbpX`J4;R ٛ뾀`eO(@* Ģ JpL;N|TFAgr s-%"Ĥ AKDpFQI~o.@P$̾ a! M ħ ~ +LF9#(M-leQRrJQaP Ī ֤pKDpZ\ߧOo~8w- L@|K! +/F Ĭ xKL;hڈV]`AfmKrGmԜnpҫ"Į YcDp tE%fy1 PPp{V_@ İжJLb?*Aw@ 5+R7.Tpe6t38Z ij !X{DpGf}F@׀& +H|`lX7Wjܯ^A0'D5ެ@ˬ' ľyaDqk(,&DnR5%9kܦ"wc0p" XpcLgnx> %8j/:; +o>`M`f αyp@˭нӭ@y +l]> Ebޠ {H%'5\68K @?Wm_< x{HjL`ȃOBr(vҨ[03KO >" +80 +pV! BQ<˅>~GC5 Ŀ aJp7xLL +^p7CPoh!Ny}R:t ֵXcJpNBEeroGn]uSd4! B8IDq|o<߮#y :IODF"B{NqBAxԾ:Zu?h{=kYm1<V;j_ ֩Pzp#/5u0c|q\086f ڬbpxf_W̐b삃̍ s @ֵPzpN 'Q"wތF_"Fm" Q:DqiYpĉdd& At@@ >8Dq0UC^,T'T#3ԅ`N=" 9:8yJqJh/'2Ud &lF>BڗVQߕw5 :xq*.<lRddك+p58* ޭpTck˰*Dbk=*0a Bq6'ȹ2ܮjAл-0f" QBzqmG}j`eo95}X7W d]1HӢU ְNpM6a931 Z>0mN hDpmOHsPX.2Ԅ}b"Ҷ ־XypO7@]@\= +er +E2N" ֶ„pK8sT\vDJoi`&Yl0 螭NLB}i|ZJr:Tt(tENάьo ֱ{Dp^Nj3LAGmƘ]q9 ^f(ܳ`^j6L~6%㹊%*.Mߠvݔ" YXZpx1%@NGT9(Sra4F ڤX{Dpŀ @^_Ft^}02DvCnu& {Jso>z@èЎZ; +vUtKh{ x{Dp +!Y2Q[?" Axzq:LdDo}H6Dﻚ40 +YX{DpyTR x1"e& +je] X1pK,D +{Td¤|^ P<@۪.ҕ@Wo +Qx{DpGG|l06g Fv]`u$p%" IxJqqj1!躹< O*r2i~ Pޤzp[г|-p=ӡ~M+Mα+o^ 椸Žp۠UӐ=$I1f=oXھ 7 {Jqf@i-UTgؐk[g׸" +8q#?d5Bc#2 +B^)%QPb X{Jqy;CYs>봺: Ų_u*?oG!; {DL`;3 $IC8/vK})W` +{Jpc~&nNR!w.^-[ " +ҤP{p|2t?: JSD7FHX\ghZZ=- ֤q?~@GVIH#IH3Q?S ڰzrwJޜ0L:H2%N<|/ +!B8aq@ߛuаF!7Z6" +֜NpP =HږL[%3Lk +Tp: ҨzpC#m kʖ҉0PFzl흥?O +Np_w?g'M<ktk"⨍ X{ +LwGdp+֘R]=\C($<]wh" {Np/%HfʹhS +`` + ֠JpЀ +8$Y;!P[ۖk-K 0~ +L_-xٵ\wq<`9NH|Iۄ?t? ֩|Jp!7kJJ0W sF[fN?" 𶥘~JLE<k>[ tdum<{ q˸{ ض~ +LC~mEoҤ@>T,zlX.p ֶX|pdoo@m#0Z`}"^a +8{Np  @ԄxL \ѻ" +֪8|pO@坢d]K9d ȍS ҭKDpE7&P3̖ 3um ~qA7N'("bpxΗN~GF LDqqL02N XJ!BJ-n" ΥdpG=42<:DzS/sJ>3s  +X3Dp}[ۈ!6l]KGnL8&2Y=o ʪXLp +EMt + +̠"Z@ v7Ы cDqneD"P|IAy\![VT޶" LDq":0w푀p)rtr,w*ץH >r}z"Z +ʘfNpWywt]n">QH}(=o Lq-@%ڱzIB(jt{.JOo?t1q (NZNycxzX#ED *4PI5/" +@֔xMp S6`ŋ4N\@A@#Isx<+ ֪xLpRۣ~:'P PN7=)Ѳ&m3$Q ȒNLwڨI hM3l b*G@ 蒚XNNL^Hٿ-ug:ˎ +a +xfq:-fgb顿hjB3| Ɲ4p[B`=#)Y~Mۮ +!" ڐfpzԈN0ډ^JpS9~]? ڔpQ~`g#h@HbK¢R#] xLLgL9Ej^#+Թ 1DP ЎNLU-xmGy}g>!kAJ +[5D;" X֢XMpƤ>,QoʀP&hJOD%F ֞X4Npgx;*zZo,ńzh:̄UG'! |6pCY[$>0-a5Qm !68#5 ~p>Җ&ypIIǛ.tc"֘dNpXfG`J 0bRR ]bǼ=A_ 3Np +R" &kWCUKDqɀmђ5 +&FBEA%Ko@pae PNNL?JR i/(86Mfܖ,Eƻ^ LpHjj pQ똺,+P=Q" XLJL$t?oA@ԀX$)1+f +q8Mz?~e X6L8SŐ + d<ĊʿTtyq|{zzU 6FH?@ $l>*"]~Y[zնG1 XKTq〈 ::OJT8F46vZ53kA" QLDprʸDɁAZ${D 4p1ҤT{1C,\P +ӎ&:9Q X3Jq~80րxx^ Wh a+s΢4wܥ0 XLp:ƄX +$ibBvj$)9VyH¿" IXLDqɀd +9P=6~N[\ F +XLDpRH)@oBrɛ=E5 HFA" +5,(ׂ={ 84p_邂X +kȈ +@X kK `1ZK p{pƿv^!7#b\)@OO~gt" (¾X2L3fu;Ջ P8")q4I$hQ[ bpe_`OwjK%54@fVSqm 莩{L'@5a"7HXκd~!ب +X{Jp86zj>"HI*>>3_|" +`zp>l @ +k8{|I +Z]yƵ J XapH[Ӳ+cF`@xNLd X{Np4ԑiB^[딂!0zB>o {Lڶ`~U3CRl52g/>, {L#PgIt[uM_-w2҈g" +XX{MA6z̆97 %.o + >_ zL*_`$GUa:PS +8( Luvc +FJ,i,EW"(%T!d2,2u ֵzppU%uj-Ja/Xy/A!{ ڭyp)$ F@^8#hdF::  " B{Dq,rЀ3Zp Tis$w- >zqP*AgPjF&g-K#U +Xapʀ"e5"GjpOбQL^ XIDp,#] +3;$`G R[ՖeS" 80{LOXh<&;&3c,(%LԂ]ܰzm~8- xzptpO2_v=|ج==_-@8I Bpe@*G_Əmgp #D PyqA1zw~?ͳ|o +?A@9s<\§y" +8yp Bzr߿(2 @Z9":x 8IDpKY-n >z{BFVaB‹ B~rP=zpG/^ސY,+ +7#|2,g !>ŸIqӭ~ TT|ʀ'E+6*" )3p׵'AcsV.Im$AUֆz>fW+! JpGgw*e@B7FZ*MO xq!C5N?4 XZp +]m[e b$$ +! +8q-u@ +ұԜ +*T$n +դ-Y ҤP{DrGlU21AMU1z%}w>JϚB +zqmpYM+߫}KA@ф{*'gmg#" {L n`D|w +<4W5@ +bvqY% P{H/A_;Ԃ}zvXWp)# 6(AO ^VNX3\ + + +Xzp= |7Q+YI9R:-[T_D" +ڔXzp_}N%An[ea[T%6&9=3 ڡJDp0>(Dm +t6q5^w,f +ڜx{Dp*}-yL=O!ؤ3\p("Njp6mWvѻ XcDp`e Ar>2˃Qb +%!ab}j{}eޢ" zpA0~|`1al&Qnr@ :ӊGo +x{DpV/ +@ +m8ys"∃n|ջ {L['AM(CVjMoEִM̭I +xzp|@l"\X)N- k^U3ooA"xzpe yls52V_ +x{Dp@_ H X@GpP +wm%uj X{Dp @ + 3XX*.-oj V^!9 8PzDNк +](VR`v@*o:+" +X|p5%_;ɶBO&p'}~(fXN:C@R +@zp|5q!>Y۲CwWnb x{DLFe<ZQZA[ K9ݔK?G +Xyp)t& +CR0* d-kzGb" P{Nun䀀kgG&,5pVuI}p/萭 ŒPL!@ q\7 +pi$ӕC& (LT + DŅ%T& +n/yL X{L˥tO߁h*fV +m{,ykiL" +X{Dp=W><7ŞNK`" ',_o {L}@7ټ&m܇iqE +"u(j5B{k L H +D9*FUZ:G0>FRu2G xL=A!f%qY]0E|ڎݗY" +08L[ N$c#BRī[ǔ%Z {LѳՠZ7Kйvh ${ ҐyrH ][Ns&ŀ|>h + |N4Hzs n8vfN 5cqPgo" +P~L +/B ]2plI7\ծ? p~JLߠ +ѹ"OLӫ+~gHR;#f +8~L?Q05_95s, XƊL|fC??5&8c3t8"&6Wd րP}qhˀZAQDqxN\ih7` ڍdpF/3ڵ:{ gTp&hU[`ҢD P~L:Fz_͇dۇ!cvq" +fMh pMM19nY%<2(o\@7 ȆNHHm0k|xٖi~k/=S +ʉep ѼN|vП!P%GB +Rp頝pP ʒXLDp,t{sX?%*TrRId8" +eqվ{C.dॷ +:ea,jz}xA6f +@p0~DL +l1XLEveA,ԞEH6 |xfJLP`&(`2"Uu5g--n |fNNڼ- +/*6Z]dT΀ERdԨm" +hڀP|r@HP60l*k۱l @ B.qFA;] fM! +K! EQP Qn PNLXpڙQ$',dPp`T21)y = ڐx5 +p(N*Հn*hP* +076gdR +ځMp2` ; +:/#W5LmѸp~U>" PօMq<`r[9E~Qf=$:}:po +}Mp*(+`.#k8@>-Hdo pNX2p$0꼦d U5 +wڰm*I/ +|~FL[n@+躉sw0qg;W&ô" +ʉMp\@@`#/C2u/b NH۲`.̡,Z\W}fաCis@d`=,pJ +(lxfLPu9N`@%~g(Uqԏ=$ +xxLq@ hb'ӥkg +=Ww7 " +txep8``ZE0ā4 +ݺ ydq1A X hb4['G˘#.ȗK_O +XlfLD?c9Ou07) c3;I5& +P(fPN{PMhӀ5QQQB+nh(!$3!" FNLc[@POm^jbJ +1€!@[t ʈxNJp[Uc@(qLdVl ډ5p  )EAיhABtnw % xxep1(_(^9@4DԄv#"&" pepGefQZjO}9pWx$qg^q }M +p?L$X4&^Ui䧡d%䚓cb XL'.jiyyaKǓY$cRU XKJL*{꥿  @د +&9.S_ÿao&"nxN(fN3_JP$ZDϭ)Ht nN(Bu$yZJ`ʨ J-0^ +On xPN +NY}G_ &2hpQ"VK0AZaq& tPNNL[ ydbU̷D#ݪyw3?ϫ" @nN$(O {"U1)7%PwT8U`,kX{[! ТN +Lb`cc5'2)C +|g&[%: L fLxL!jvBg)Mm)NCw2ռv*f •LLO@#hKJ$F܆prnQwӳċ"fTJ!^0Ķ9i"OӠK-8B |8Np0JPT` IyG~pq~{~` |NVHʶw'@1^@ +Rn9pÑ5_pP xNJL`VF<Y&TeD"oZ7o" t~NCC2zfR2^Tlַ +8|NDL(GN &cc'Eӌ'o=. +𒙸NLoo`tdu&S?&.dHIdow(q NL=@%C,;, +֞<?ĥ EBȀ pNL6rwB|wZFt ȂO;" ryNPH0 y +h%Br&1wO +tNVL +&j&}Ip#Iay@/ 0p֞p1pvfÉpe-<?x +C +zTp\o'=hN %U?2nBxTN" 0ꝸ{Jp{aQPoQ`0wˎ]8YU Xap. SDaʢ;!ЏUK.TP_N xzpAm@iH %^ +Y xzJpW8Ѣ;x Q8A,#% zpF_; ~j;`' XL" XzpovDUEP` 5Gn՝h|5 Xp_-ɀ0Sghi Y %Ӈgͷ x{LRSjW#Se +qi4Ɯ8?^,wD~ ؎cLc[xEnDt:֛IgX_=" xzpH3j<:Cb+6-V,,~^258K xyqe58k?FĠc#]+?6d-7ik|!{A(|Px xŒXL4szTRR +sK!]Jt + X +LO +9 w +}p@$@ +8LC ᖣqBd_<{c/ER6ߧyWp\" (8LHȀ +\8_SDz5Iyп +XLE@x)$`3 +CbRpu3|" LxyR{ac=@;u( vi+Q@ ݥϤd XM/? 5 UP!K" +XLCrR |!̀4UI-?[ 0N3u`/; l jֈ)j邺j4d;{p Pڥ{Np(7y%w"Ũ4ɂrMA_' ڭp +@ p!7#a&bH%AVU}" ֘qMր(Am)%0OzF<}o fGdY ֪8{Np3K~?끬KE +i_!4\ ڝXpERLs\>{S;?#l[0 +'0=lv;>UL ژDpPZGS6j)mܘ FS;଀:O4" ֙XDp>m2ޅ + r~ad6iX +8zp|(҃>@7Yak(%Jh Xq+;m?Ԡ0|:9^vhAiTr~In Pzp߀5?)-ePfXp(:P}@" (yp{ !MKص}x&y yb Z +pݔ6&v>.,!THI!8 zp +-tN$~0D#|c'GQ ꭸyp%@ӂn? + +=$T.:+E3E:d" 8zpO߿zP$kP:f7MBjYje) pypÍ}9.p KcvFyTba+^ 9BXc +q^?PBE@F(EښU$[| +BKJqF@at`($_5/-j-%_R(Sz" PKDpAX +=j[s:3 e'&}H*Ķx! KDpZ~ H\q/ d-h^9i JL~7n ׁqh#eLM4_ ֱcDpA}axFao޲D#x[)ؤa ְxKDpo9`kJxO!xTcqQ:yI +Ossb=?" xdDpm +RJA`. Eji-O)-t&^ ֘8|pPDӀn +2FaٟDT򼫧 KDpӑ`*` +^XT`Gz\%nwd XcJpHĴGI`4W(X~mu +m" +aX|pm9݋Z ]+ `/Da랥䳨U/Q: dp WӌB>e*ȒPEٻU0ro7 +x{Dq䥀`2֗ H@+[bNdja^'" @֥x{Dp9Wh~0Hjȧ+GM]Q O} +`֘p:Wf`B.- #5>u7J ֠Pqls5+5e!Ts*K7yP E" +(~LDnfR +I":XiCW}) زX~ +L}߀:F(W"fmWXF])u ~HI/T\^$"mzt ҲXDpQ7zHdCm8)EZ (\9 " ) +{DqK;h`V=xz#"Yu +lB زLDLcԐ֛sJZڊaU ~_6 +~DLP.Q{}4&fQh2i 8c +OԴg` KL>&:"X + JȀ*ٟ(ԋ+" + +q=@J0G.TdIZߟP j(~V*M Pù`Q"0i6U*uA# +`xfLtzd-䥊b `"rDrm7 HƌL_<3P!q;04X9xQwM| cԗ" r~H]A,g5,!Ue߭VSPIgl7 jK(IUXnljWʍy +`:X*83_ x|q7'2@Q&&v(~pJVXKs +x~ +LrvHU= ,IvVKǫl^ xfLcJAYE* W˧ba#bS)nh ҔxDpp +@6OS^ư,L + Z Hrx{Hc< +Y+X{efDnҁ." +0~ +J7 A*a9Br:+},Hxu +[߭V +X~ L#s +dR.,;aYLEx hN͑YPOA& GUocJy,rxS_" +XLqP?{X ++`_rݢIr +{Dp  1)aI +i@ 8V<` +/4u;T ' X{L(őD?5Bv3~\3 ڤxzpN ՎQBljbd^%:/"کzq(䀁^dr`Da01 G?2)Ϯ? ֱzp־r 5nh|ttɆc=:zv Ҡ„p(O$ ~X]]Wfn 0zr~_`Iר1v#" k?" +֝X{JpOH[Xì~gj#66/zR#' ژDpր#iE>L+?L@cd}ہ}3~ Jp +2!øci`@#t_ +zqGy(I^nUtTjb,|e+ .Mya" Xֵcpo=%h0%(fMjE7= ڭdp7 l~ +xwJԕZ\:̊Xj~Y +8~LIȍvJ9ز '*+ZZ ֥}pD 976. +L6odx" 8ڥcJppW +C"nH(ND#P@/ +P}pZ惂9 +BQA:_  ڱKDpkZ/)fRSQȀQ) /r, Y~Lpu?ɲP +Ȁh8 )2@7`C" I +Lq>ht>',b#HpO/"_>) ʠxLp?&%w(3Rs kD9:%iGI=_%  +xLqd7r,W +Y]i CJƮ+ ΥKDpcC㬆Z>i jDsi-'5P" HƞXMpB +5GcP'mqU*@˯S ʚXLpa )KE媒*~=q ʥLq|ᰀȲ2)-S7|^E|65JS ΠdqvB߭CSpvΗ[4*_SJӥI" ʜPMp8>>ұ|m4[^x +IxMq$2O +px +&2[ITpŘ0Xӣ` x6NLا@΀:T! +2Y}2ѣo?o ֔x^p=? 펤 M* NR + ڙ]pa{L4U Mҳ! à8W+3u@_2" +֞X4NpE3Hu0<8& 2E ! +h~MkP3ҔR3D:XTP/:?ɣ NLpcSxAhZj)@EBLPfE3 ƝLpѿFؓ|iK4"a  +L9c¨R&t" ʌxe +pR֯)Xy&fd9&޾S&WͤlM Α8Lp +AƲj$3"CNn-:k~@@9mBƶ ʍM +pY*\Jl?@m$҂ ΍}pb0/ҳ;::)( +"Z%G"v1|" +Α4px1u ̟0ڿw XAb*֤CB xƞp/fƯe^'-0@LDऑ" HڔxLpA0Y.sN+}n6A!vlBZ2&Y ҌPMp66 +_I5P)@ NHHHl}2 !.a]kJ# " +`€NL+YXD+/7J Be. ~x6HL@ eIwVCZo7^8 +  +XLp:DƙmF"̗pR\YO ֍XMpO7 Y +f!z4fȋ+'&Ux" +0™6LBۤnQtd +:3s{i +`–XKLrJjU20+8Z:CXGن2{ym NLdb +OgMx)֏ڥKi‡ ŒN +Lo@ڀ0mK[")ZؗH +C$ɲ4Q" 8Nq1',Ljmϣ +@5МhZc@ p~xNHY0 Yꡞ X{LhcdE8ґAėk'K0Y xzp[`}~a:&3E2 Cd14Tu|O оX{Lz: +6MҐ2Jr\Ʈ X{Luon+IXVD= +tij{4JxAcuRq" HxypQC*(D!D-gYM~Yo} xzDpRyE=HAT6&:zc4^_# ˜x~ +Lށ*бv`īy.I?sеtW Xzp裹0;s7"ƶ: 0ew;@Qڄ" +xp҈ +{ n7@u +=!L{LN< X{LL[96~r-o)簅XCfFfGf DpwY.tJ+F۝ֵw9ױ X{L:z7 SLV&Տ-q +A|&" +p>2eg+!%m"^/"<" {NGِ[ AKDG_%{0Mz:pW+ + L +% +m 9xkSP$s7 XL,ᄚ< +^7 (P7+@wF" +PL?-|!LօcF> +1QW xL>7\~L=DtZ(sPQ[fG +XLR_G(?2$%ePC+[iI' X0N QxU0e(ЩLͼ9Ւ" ʔ8p>b?8`ܗ@1r +{xYѸ3jՊL {L`  Dob]7}~4' 8Lɀy3 A +dH)"URKʘ} +P XL׽NL,%+*Ś|!}*;" ȎN }`v4Od$W>8Cͤy ~8H񠞞ΰ}ۓpeVGvX̖f3󧍿 ~ ؒLwX3$&XTbz41@DCV3b +~_\] PN[/R\qU$TP(&}O#k" +`֪8Jph7[ lи͕haTǬ&<dC\} + ֱp +%A`(̥fHr.(r$UNu4 ֜Jpް%|}Lr?b?%@<)Ng% ֤XJp + ߅'Z=Lp#Bҡ" +x֘NpfPM)^H(ZkU +S`d^t%BxC' ֦„pbh=ASm?*LѶE Tq/ PDroGo0]XaqXM1p+7o +Ppn~n}8a`'PEVҡQ e\" XXaDpʺ `ˎiD" q\A M 0yr@^7tӪ"$X9v%dAoRR[ yq\WCF=L-.oZ܀2 f XzpIP"c㈢!䵺\+!=XE\" Pzp\) b6 +l¿t `gi +6V XpypF5n7Ԟw +Tল6^5T%% 8yp˝Vg5$`u߽aO~# BXqli&}o'o~ KVW213!Su" 0NZ^$x^6͚BudMpz"#X.-YK3$ 0cJpS99`e B}eaG'(ޚyݭ XcDp^࿿ +C@^l 1 dls =Ramcޮ P~LL~@A f*6E \&]ev36|+C" !X{DpUn +йqሠ>b[(wlaC P~ +LeoЁd +C d?@@R,g`Q/FP ֬xcDp?J(0}&RcQR +* ֩cDp(]uMšCX-Dq/cq  PdLz 5\ P_=.v;" Hڰx{Dpޝ` Auiz +.2L>fz;д9 ֩{Jp ᕨcE B #CM_-֘ {Dp0`(-fKh,Kl@r5an-R" +Pڠ0r_h_@ԣk9*7z C- +|Ds p֤r@t'6_=6]4"nSH{_'|s + ڨNpd@lh!pPaI ?q 7Թ~u کX{DpWmgS {Lx[a2P&{")j + a{ в0N뵧!D !]6Q3~\0A +L/\*av׍[D %%" 0ʭ{DpV@]I+@_ڂ(B6yGQ {Dp)KX;η}56(9 +O iJs0VL#D_? P:lK? XIp&pOj_ P> O.f6S" !Xbpf75q倩,(v@)Z2 bpx?0fz̀:*a {LPjXv7KZBXu/ KDpS}`ɀTZO*YrIJ 3N. "3" 8ֱcDp1]PݒNzC;,ŎX`oX;}> ֱcDp??d1.I΅NC+M.wC PX1L[~a?}+a^ +{y@94 XZ +pǟG3~U]w}jh11x6aM" HzpQΰ#`nRDx(UΎe\BG{ xbp3 LڶA[}(Ӂ'5xO xypW@.)lr>/C "JDpl|iRÀ Tz@ d6z +" XcpN_@:r@av0$*Ţ!ţN: `XzpUfy V:w;:AFd~yAϻoQO XzpV&2H9.&KS z +p4}ɀ[s6UǍX2; +q xzpzI"i랠 $s3(b)tS5jSz" +xzppf3L x +P .D0yz)S7 ¤X[LmOvbDXL`ھ7% +8xzpսF@=%9 OŗǺ5^t~t xypkȀ4rЈ N- uȮQ_te" Xzp +H\ f2 "۔34NU0 Dp$>B0"]*fSMuRj~IC8v 08{DptӠwojmKy3Fͅq2xd0i7 +PXzpd4h/`_ѕ +C(5N&m-z" {Ld>[n@ e2c +iC"XE *f XLⵓ} m/CB +#l(@RW. $gT ؎8L}?ga {BI {#L1W/Ԧ{u1 + L9 +{4We yItp3:PB?N" XLu2lW>cw@k>\ Ss LS``D^TZm]L~~7 [V; ؎X +LUd R)v3'~vqP% Jc$ȓrԷ^sZeoЀ>3>`"!Bqm*WG c|1} 5r8 e#±u`J 1JpRMS^ +N  +ю4 + bpcȔQ?;80 HI|X !{Dp0NU+ZRw27]qͤC֚&!Xc" 8֤{DpB.,@BxdDHZ!rͺlz ֜cJp{/PPߘCt;Խ@_[ ( ֭KDpoݜ@2T=N 'vAyL `cqm0;-|jOP_Cz;@H"!>X~Zq5"2*v~G}XLq[ l8yG +%hfCGXe[P ޝM8g=`2M` *YfbD .ψvBݒ d (('ߢ +aYq"Ğ (YXA~]E/yߏߣ[ ĕ µL +L(jvY4/|/>Pz.3 ėྱLLAg}'594Z}sاg .< Ě ©x4 +L>d5p٨ԬR7,nZy*("Ĝ X¡NL(,Ģ8".K8x +[Y Ğ PNNL* H%#AԤw]ZZ` Ġ ~6H0p= <E뎮0<ٚ5M~&  Ģ ~NHYcό;V꣒[+ğ@`5"Ĥ ڔfVqBB: DH3Jg[}\7H`$BZ ĠЎXKLҁX;sfaG&Xր̯ކos[j H"ģ 8֭LpD ~k3(6c2 Ħڭ{Jp{Go_c&4c u83IV ĩ֮XLqunv'?\'ed3pu֊BL(&R Ĭ֮X[Np|Q>޾p#];lP5B-n> į ڥ|pO_9QtaBV*=;nOG"ı @֪XzpPZT*+HlSl:7 ĴڲXKDpYZ@O)x4VJgu'  ķڲXap@?EPNNvZ7+'( ĺ ֡{Jp0&3ŊhQ2o)Q_"ļ (֥ap5L`l"[@e'2%``/ Ŀ ڢX{Dp9W͍m&CMvq:^q8~ ֦Xbp @|*NJ`bdg2?@ XcL8 KvBX*knS`ˤ4d`t? y" Axzq2XGɔF:fT[7?q0 + ȎXcLY) +=R{h̡qd(s`XS `αzNp:(4Ḣ[SJDfnm] XzLs^ŷ| ֔p: g1 ca3/c)B#4 Xap (o jaI_S|f +%SO XYpf:OrNgEoU77z(ZIH0<s +k" Hֶ0zp!eDE6Ҋ0' !ИEip5u 8cL2A֍ԣuRf {L  8  }#%EtoC *XIqÄ9p.~p8 %N>" PK(zU[ߥ6%tͥe\WP4fr}% lh)Lx1u@D}+xM&5;" Ĝ +2Y8R++:x̀g81@&ߡmް ė8Ip%RXȶQ&)mO^poAR"ě @~LrŪ4 +#pr>`*)__/ Ğ8KJp]1w_ GVwQyD +r#@4 ġ {Dp +>!GqG%hİ ĤI>xfqo7=IX2)a󐞔 l^e> ĉֽxKDp` +p79vz_M@}"Č ҹXKJpʀWĸA`su:%pA ďּCDpE h8P|;A8SG^(qnS?N ēa>KDq*P,H1X)ӭ=i$9>%7o Ę ¬8{LEE5#CNi2 Sœ ĚָXKDpE딯H J7jq@d`r-:iA"ĝ ´XKL`ɉ(AbO 4@ eT"sQ ġXcDpFɬ/xX%??ª¤=z + Ĥ>XKDq$tSbCzeu +0AL2{} ħ薤~ +L8gÀl!>i +fr5"Ī ҰX[Jpxh oQ]X +gيo: lSe6 ĭ ڰ|Jp?8ˡ0`zCgap +&d^Q^ į xKLWP:qUF8Uq8h7'S +"ĵ (cLKJWyn1 +2 j:h?|k ĸ 8{Dp Ma!% +!Qڛ巃y@@H ĺXZp|*b0d:Aa?OV/j]w>oi6 ľ`¬{LChwO5 +`@8W.;H" HX{LuLHC<[0XX$.Fe`+Q 0yrM22r{ΎGR9Hq`7p ⹚ ҴPyDrVjiv])~~RRkT ֹiDp[w +V4}b@^Ss "¨X{L0| 2OB;c~)_`r 膤{HLÉڅA3gV pj{ (ޖ?AoE 0`$ qu&ʒ!B1? y/@5 +" yJp`qA:!]hH#4pPUc  +8yDp$74rjK{ޢ]pp1CGV.&:2  +xDp@¿1 ~9$`W$Q _woX xpbˀ{I֦L°Me.KMҠo +'I6@ P" zpqؤ Qɾ>gCTpo;/@!D  +Xxp>TM. +`Q +)zlGH>5:h + +8 +pk-X&BW7]_l}jz +@3&r2 ¹dLyFf  FWĹz7K2q,," AX[DpM%8 &oU6/NZ&T82hF]Ntd ؎؎ +L +ZZgS]oK XkDp[@ "(kZ H&> +o"  +|pP%hL|~{_`̀1"ĭؾ~ +LjaSJĻol㥏#vBv0DmV ıYcpp'EM@`G ĞXJq5VFLT"DvO@! +T Dv> ġ !JqtE]Z>wWKQ~ߊpP\ dPܜX6`2G"ģXJpBi2(;G%HnlYZ"T:eC~ ħ r{HUBSmG\pSuB ſP줙B@uN ĩ vxcH󸈴>pգFz- ib@@LjQ ī !KDqa,&zv .+T:ȁG?7~nh ĭ 8cLQc~%C/%Qpפǎ"į HX{L7 +ׯ +"tƵߑ4 oU= ıЮ0cN:b`2{On +RP֦?L{ Ĵ 8bDLFCo-[ca.P\*jdS'Jޫİ Ķ cDqQ(sҹ+E`C"C:eoR]DD,kL2/+"ĸ 1bq sFALM\T`+/[%h8`; Ļzpqxs@bR ARE.@ A2N ľⱐzp99G.x_gd+ .|.!) Xyq "Z\LL8|oG񀗁cĶt" @x{Dpw7C $*$Dߣ2?HbBK.N!L 8zq)^Q'Ԁ vE +mF}p< zqDuo[ /|[ ҳY "L + 潘zDpU[yw.ABhqpm}HtI`~ +Lb@Fj*m" QXzq؀6 74岨x=fWr"̀! ްzp +C5- >#F[E:~ {L4T09w'ZZyW o >XcDqe`cJqKJ!-*uĚo` cNpO d ] A$|_~ +|Np\o_* n]I8O{'ѻo\8R'" + 0{DpTh B`SB(D _XSغOƵ" XJph MPP2j +>j/\ +֤P{Np_ur@c@;r+Ɖ::J/?Fl ְXcJpU^0x:R0|G=PZq@LP+s>q6tIj= ֵcDpzwPc.pD:=(ǹ[.7~&" +XJp9G +| +|X RHp.O^dOokG~ PcL}H8BPDFY7euAl +x{Dpר[nhAVN$s( јo2F`9r{= !ZpAA +<qj>M +a +lS)4Sҟ,x" +a8|p%; +zր:!;`0,ˊõ~7ʇ{ X{L i@qq/αs?_+`0KꛖX2 ڬzp 1o"#.dkS/9ccPED >{NqI]N??(7 fF,Dz! ڬHNpgtp_Gy0')^pzy_Y" ڹzJpև$֖aGָ X3p -Gu: +iNEKhuPA XJpз2vPh.dw.VHً^e]' ֬}pwuw0R0Qqߋ +ۉo" Hڹ{JpL8Zds笶r=B44͏ų Xdp#/@({nO{E%?#*j7' ֵ[Jpؐ37'>0E: &μT_ ڱdpb"2/ޏ&(p7&/" +~L}^  5W> da*D( +V BXjqg@W\ۅ+CBPO<ţ +X{LoWs +Ub(ǀ?R*P 0; Baq( 63J5`l΢MP" +Bʚq3(;T[1^QXqhjS (L?@ dws, +?D~ o >yq  +i5&T5U.X7 ҺXbJpzu +8,0./5:|ՈG" +`֬|pf3c40k +̋bujt ֵ{Jp^,Qk7Y0 g지P/" +֠P~JpԀ ?{*B;t\Z)L ̮4!;Q| "zp-((q=𕤶( Y,cӥG +Hp=Ѐ0+yc5-X8KIsnrqG IpU(­ Q̓2"+s&VOH +`ڨ}p[:,M_2b>gUTL[Kߤ ʹ4 +pNa0<Z:vVJS^LtPw ʹJp\r0dDдA_QLB@ ʱLpBItD +JQ]!|$RPP"ಾX2LզmR0#8l=$(֧Za{Z5oMo ʨLrGtIďh8 +Oj7' ζXKTp=8߶WpFP3%"d*EXфW6Y8 ʺXBpY#$gmjI@ =3H^S" +ʤ4pzh_T@:X:]-14=WrzV7 ڱLpH?P 8 D/`wsv<\Z͉b{ 84pMp p8Ede##QDt+&ɫU*oԗ +֩KZpրH8SC#(^""M~r " ֘}pW +ޣ@(Ԧ]J& >\(D4I#3LPao ڠLpOw[AJ2o(xrcO@ p+UNu"I? ֥LpV`*OA+'֧Qm`FpRf.Rt 8NLQߚ`STy#q \ [3z"V" ڡLprހ(AS Hd#Bٻ^f` +k' ҥKJpo,LR + jU䡢!YdK|y +ʠLrF~&y؝4T#p̨ZIs~  ʤ(LDpC01*ȩ<*6Kd Ei#fmE" +֩Lp Ւ@p 8+H+~s_ eqsuKC0-Wqk2UX|;pŕR[s Lpu,s"KI>tTb֋ɂ_J/" @ʙLpNY26}D,oQу +@ΐ}pPajBc{%H:`ţԿ}OAУ +KDpK?>yf +DAQHdT$مѠ ʔfNpPlJqx 3%Ǵ9." HڠLpA +Db&Rb'`>K Vκ.ڽbޏQ +֩4Jp +&MfxQ#P%H4گ\c کL +py_02eV("p E@S +ҝdpou@t/$P&;JA~ݠLH#6 `֦XLDp>r@ѯ0Xj{Ha<#" +a| +pj̿5 3(h|`?ɚ|6u ֙Lp<7!M)(  +X4p׿ 8x,!쒁GCR<}ۭE ʢXLpWyO@TC7 +\ F~,SeV|g" +aLp7w.p g -MDi'F" UWe- (} +qMՇ#0'*o +2%$'ud +ΙcDpp4#P3{Y +Hƍep((:={`|1"Zo{vB |q42k4<\ڢ_=J7p +괗D1" QdpWSJgi: +F,\ vH fL~p +z*tMI^w] V zd 8ڠLJr302USK~yx8-&";`/ +hΙL +p/p*-*8/Cl0Lݺl" 8Ιdp-4e@WHC@A"=fm +X}pw)f9gH@*T;c ƦXKDpPN^TKT#ZDZ9ϟ^ƣ; +u ~NLמvIe.wW_N1@nZF',2BÄ&J!$" +h֕fTp˨_kQbQ +(FJk9>]p1 HֈPMp&"o + +M|uPs + ҖXLp} F7?&@` L3"A1^C*  +4qSc}f3@dUq'Bȟ6" +9Lp߹?`T7> +0:S U& O +(ΔMp +G"ԋuFƪ]Dr؟9D  +Mp4n,?lSYl: TL(ތw ʥ3DpfXn@EYhq0EԈIu|E" I +Lp8ˀ 0@+c2tнc3Rx((zs9 ΙLpe/u PDoy7b 1/=mvO;_` +KDqD :G}G(ilVd[]PZ ʄ(5r)@`"RvDgE +@z- +ʦXcpj} C$*fZ7Hp +A;pO$^L;" ʡMpG`=pЉ΢hF@H>ao +QLqHoTrTq~Ϫw {YP@ NL~&l~ .ġ,WISncġZ + +Lp 1Ih4*+Cq&%SjØ" QMq>p + +# +b. +ɣ+ +|epoƉa'K&h@ +Yi~L_E ʕ4pC%UɍB+,@K 3!0K +~L+@ K#B(Jًw2"`Hz" @fNL01}@ +X\NQS*S@d@ <'7i ʀPMp(ðl@6D d;;%;x + +LDpa/Y%4k"taY2Q~~vc qPMs_@`:6vj@eɱ.e%" +YtPe +qP裦 qȊ`yHr% ʉMp,Xϗr*;DE9:z +10]n |xeqAim h :%,m, +@I' ҢXKpzQe ~-^:Lt4:Q{' " pڕ~pw BC,34LH`ScDfۣڟ^< ҪX4pNsߓ.CSN@%gQ 3L0[};zUF$dQU''œ%dY ֙MpW)U_P¹HL!p v(" (֑Mp>Ϭl@ p7SBp@0)>NGE?OQ t~LP +1]9 Usʁed{N-Azy +`օMp2-t0c|d̈p'u=U X֪Xpop@JOǠ`M dS_" (N +Lݓ=@5E`|.*FMj3se,خ nc( *zP\itTіKO6*  x2pՏŅD+N, 4]{mfLUZM3ZеcUM*, +xpep(& ؼ1idEQm'Uqm}g" ֞xKDp+w*7$LEj7ٵ? 3R'aBK +XօdpJ`,bQPcԱRU.yc~/AOo օEphh#gqvb46">\:1ѿ% šXN Lm6|PAL鉏.r:ʕhF찦iTu ׫}" NMG4xw hQ!#wLHA8g~,:fM XfHX#E7螀rDC 9S@i V XXNLtf7G- + +lp(` FU$O~ooo+R&];" xNN@#GqMɍ` 33g +Z/%@ +xfTL2= sP!@&ھ:"z 肅XN +H<ۇ [ +A2>̈E>o0bf lqxBq0>>2+zԘC 騯$.3" rNH.کi,J^4zs/T +OR: vNVH*$Iԁ_Qm]nj@GC +aH ⑘5 +p2reZv)IH`eϳ(@NwHKlN LpP&(N~3&dD~[v?ɀ \R-" 8Pep; +2e~!? + @!t ,d rPfVHJ5 LǻG>GlS5h"$.+ خXLJL`)DDpP2j@Xq( rNXI{ +\%bޞ!+G|)4_抯 +XypKPlfaUK2 3 +_v" @xJ +p0=i2tlx@(RC~ cL(S5Qp~n RMYw ++ xzpD_ +HCYx:(Ca/sJBO xypȧȀ8k5e~1SɼVɧC5ȵW" (x{Jp{]2z-UP'6)zSܿAr/w Xzp$)u OB,%-uIYMʲU8 Xzpz y_(T+#o#mQ +xzp%Ҷ`%.n?,e-A+S!ބx" x{Lӓ@?SNg6aHӖ oL(Ҿ PrZcXhBfd::/ 0X{Lc}! +N8Es|~Z\7-  +N@o9 F,Q%H֚www;" +`8L=NX)YN,)A +"k\8#w ȒXLkku /9蒑uxCP1 NYsK. +3Daѷ,ujJ +XJpsS~_)rY&b;xBz/Ez1%76" 0N$G + #/"} +>ckFf)N. 蒈8LG_Rnq)nAҀŴ xN?Lfy&FH.=1 '\jQ ؎XL< C]9<ŕvOV*GB" +`L=s>ClIh >t!kQ +~pjM vXH_ ! Mmϲ` +j˹B ? 8LjkնA%v\ 坩W`&*.d ȎX +LJ-eʇv<&g9Kah" PXLJe`_Bj2"zG9s 8L_7I `[L0z \\ Wc/ XL^J$$\9N%y 7w ޘxpwu;-}wiM +'*D{" ֭zq@J(P !&b,x^[6GV1d% ֠XDpk WsICJURoN6J ԓ ֜DpX/ 5D(Q4}`6߆GR҇ ک{Jph§P6oԀ vt XIa{pIx" HxL#ь/Jh& b0QB\) „pG U0cVՎQ_Rd/@FՓ +0֩zpo_"%Zfs"1k7T +YpChư!h=ͩ)wt!N[cHep" 8ypq2Hve>ѬB #ަ +K9' zp?mGon&r~ +>| Xzp~Ñ>P㹭R @YйEy4N! yDp ǒYe~n)o9 + T)pK/М" )aqe'4S.7}F kss=(g yq*ȋf:7' +@EI 쮉08 ݷ Pzp|DKe2S ;Իh|7&QZ Bcq|' +1ȸ.`Ţt>4rO^x XKJp&LQr5낶" !!Fe G/itJuSyRYqI P{L} W,!paLPˀ⋫yy*s ֬X{DpVˮ`AR ]3@"K06R" @~L+S.ST@ۀGiS!Դ12Z3/S-EH ֬cDp[r޲ x>ڣϻ+Sx6b 8NL_Y-\YC4B"HVTt?~ ~LF# +tPJ@d:%&.܍N" +`x{LF\p5Z$SS#4k^xfO X{L!@,Qf(ð$TQ +yz) X{Dp-w4dhǨG{6{?MI:櫖 {Lt |&(OHjBp&wѺj" 8|Dp~'D?~6g>[ 8[XVM/fvc^ x{Dp,?򀁀 +Cw*rfR!|.;wn zp;$% >Zdq1FP 0WZ\>u" Ʃypj + e ~ +NS)YRÐ|h%ׯ + ~XHE6+%B6ZLڤϩ> PHu"ܚWoEIPb] ^f27#+-܏= ڭzp[H鑬/̬C2_Ӡ" ڜ8pK^z'.Wn?hs,ܓO} xe ڥ +p{er;l_T=@wHWEZ_UڅP 8p jz i#Z(wa+{\H ݸ ֤XypzP &gm, Ǎ!K[ Y!5ss" +)p;Ҁ{ W;xI*Ҧ'ѡ ȶzL [Sk)uɢBQ\eUߘUzF +LYX}NG_i"+Jf"s8/7h ض|LGn%0j5ub// {7̣mMu" 趤|L6w j=|=+'&H\.;m ~JL}^_,KDxB++F|}\X. 8|L%=o3=BnfP;c$$otQ ޠp/[p aR$,$2>@ +ȋ;m@_" +p +SjBzc|t%ʐz 8DpGGpcRr8J"*O}ѻOnwI +JpmU}2Jy#h3 kb& +(Lr 5MF LLz}/5" 0vx~H2b?8ePx_-3)#\&W +PrPHCh!~Y~'ra}&>LK}$ r( HChn$PoQ,#K,ʦ v8~HgS@,ƻM ~x~ +H]ﺐ& Q&!2+jaXjcY PP{Nؿ6ZQ&l'3SؾqL<. + X{L{kBݬ♨HDCZP=8?բ5"Lɨ-ә:њ/?Qp,j,@Qeާ5 P{L.y_k+9愸/AjC-^#B-! + LQHEbQΐ43Q^cz3z! {Nſ +-ġz RҺ8`Xp?" 8LZ +|$kd4xz + '&GoR[ῠ {L`\^X!"YyB??c +ژXzpv4P2qeSN͐ ?")Z + ֠P{JqWcu^]ˤ;YAL-/?" +ڔXJp@% f + Tsٌg Ҕ8DpACL@wMKTɰkgz>V ֔Dp> Ya>J*u +[N)C +8ҌpMh.Q/@M;|\+3b yhU" +ֈpb㽝`׀̍c7Ak(a[$/,m ֐8Dp + sZ$rQ\ri/J2TJ$: +(ڈ8pzizrXNp~7@LJD ֐x{Dp?`LLaae6j+ƥk6>U!_~1" +h(~JL;zȀ4!kTsFX +i_8]A {L~o`XZp +ls bc ֘}ptel +"ct"ORLH +Mk/9s ~ +LzНKGA7E +`o!KB`E/" }pD FB  JˌI\.Vh[;Bݗ Ȳ +L.@V{1y4ޭ} X|p'xwnoHf +067m +{L%kK\-PlfZK{f_" ʥNq?ŀ6K5bԼ(FC8@}bJdz-i ʩ|p_ Ջ!r`*i^sHB# pʘXdp +H-:aQU'qJ@l:ݍJ + Ό~pg0P AdQ +Fn:@`&ڝP䫩" @ʠcp]`D:>`;*U9CbŕC r +HMq8b UݳgVƆ1ME[}Pvfo ʐ8|pc &`Ҳ I8Kd0p譕uT + +3Lր󏖹[m0RdJրs KL#1~RA+SҟMG@wHiϙm%" +ڥLpԀBQK b0W[ + ஥N +LO +8X@ +u|>!tH1;n^ e +q- ;倀!_U_ȅF%ٴK ҝdpD +G+#Cŝշ + +Lr5I7" +ҙe +p|ot2'؍ۓ)(3BIjZ)- (~NL^50j84hll ʔNDq`%@00$+J<7@L +k: ʝdp9FB@ˉ#Fٹh +t]Gֿ"ʈes}.г%gsBޚuDN.{Sc +΄XfDp`*7.,q)+hZVdȃ.+ ΑMp1pyL@ 'DLfh=ro(^ ʍLpX4+t0jer@ 0,S *" XNHfeȀ3A a̎P2"&+^ + ʞXLp[K@3\ *I)g`.l/{ +֌~Tq(ci7QQ84Fv@ r (NL  +X;?-=S4%1\:ੑ KHNZƇ@U+Yd1py\,%!oƞڨ&CP" ֞XKDp\)l^2t zb`}6 +w dLgYϤr\ 0iA$gVXeU(ʍۇUd} ֙LDp|`/rN:\^#8M_E +fj ֑Lp4/ODZ.*38MN\*d_rqb" 8KMO|؂J5nEC/LÜo +Q +fL@$ С4Iո5'qɷ4>OWF XKLQ@s +WiDA$_){MosF 膐NJHOOp2*%H:î2j͜)Oms'" +>dqET%K L4pzٿu0\S XN +LOG +%BhqDxjYwz5@ ؾNNLA@p SWo+YqBi޹Vaso +>XMq.5;R@2%®3HReJ<}J" +¢X{Lb6j@@(,cTn(Neަj$/k fNLPN`TmMfb7ar?zo9kZv „(N +LC^8@?LJ:2X4 ?=ew +(MrK_W;|o7Aa@O"y4ńs:``7WJ" +fNLKbV@6 VFx#l?q NLRёG t6 +ƗB?l+j1 u b rn Ep*ۂr@``W/ӎr1 t0Nq>1E]BrMOaR)cÅ;aiQ" pfNm}@@2Vdմjd`4w +( Xq!JJn%Tu \d i7 + (NNW)FqUϋ'wޤu1zD7Mz; 辘{L + (BW'(xRKs;=X^ X{Lԓ>@ +MAفk۴ۙLW>" +PX{po~C7*}؟qD@{+v ȾX~L'Ћ? +vX۰"sJnEG`KaAv| 0L[쿒 Ok`U")$ +oT'.̉mW XqKjZ +ȣFX-A2gm5S" +0X~LдBWUV8άDՑ*es\^h X~L + +WjR/G%?! |K xpu=`vE3tU|qQ2~s,"ܰB? 8 +L5Cs'T c)XUAn?k|SJx<" +P8Dp=i:j<,LFho^'+ {L|ҴuxzcuHDph,n!h +„LOHje`/82"3\kF4H 8HOM v-i*,gaID;ir4<" +HˆXL_u@ (% +pW"5]){T״k8} ~XHZ2  MaOt1&(< +UiiO +8LgځpIf0Nľ mYDsVj 莔{L>#KToEqUI{q҈ Dn " +xL9@Y/kQWQ r{Z]~p= 8L@ nN!бFzGh)$hFK ؎8LϩOOeIgnY\ X iYn= +I 8Dp~|?{ҕ\FYj+pCv'"  L%}@ 2&U++bp"aM8U{ ЦXL?:aAhs 7n{ִS/ XL~ԐO}Zv-.*M[jR"^޷6ɺ +~8H?Z'yXՍdl-SG/ " 莘XL{ ->A% 9g13e|q٣; xL[_f4lP6[^L9 xǥ{7 + Ў8L=LU5S4Dc7Vt(X9x XL1@ + +-R)R"i0̚Zb3/*oQ" +֠XDp6@2 `>%ᇹoHв ֶXypw(zJIT,\ULC#?^)ڊQOn Ҡ{Npǹ/3DZl ,rw4=< ֔Nq/qMb\Uԉ +V0p@0뀎" ڜDrEƆ +p~NP ,(" 8Dp6KB$Pz=<9+[C@f`뙊- ڔJp%DM@<9oO +Rh|͑ Jr*%4O4gh  keqx"I"Fq +A?Ȁ +vew\u((u>Q Xap1n@"G0 l$-:ϑ ]s zp_[Gl60 Djpjp `caq> xzp_Q"QOBZcv0g.'.բE" @ypHH&D*JJ'Nΰ.NT41dM!٘ XaDpÄJ2bWNK%("%jPDpw)9 ypmWdڤo_\%r!XKm + +  {LG]%@h`L;cC+jpТ;d"F{qU[1|f}@Fs"I!=[(# !KDpz1~F, +0!BRԝ]MAs:\& PcL-`b~H82Z?ъS)j%5дB xKDpI1.T261tVTF + JDL ->7e~VS, PI%׻ԆpͳpN" (ֵcDp.Sm@t+eH4E8z/ !xcDpD *%EQH.Ntx[)j{ö | ֬xKJp}gˀ[?hn +%)d }iݷ +֔0|p M|7&ZY1h!8Ys+~:^" YXcDpw09ȓ,Q +Ī- /?^N +֤x{Dp +`QB&&#UbVmfK~ +P|q`JdH kb!K[TO Ⱦx|DL6 N9bR +y{0ʎA " IX|Dpf/h5Ntr'F^4yG Y1 жx~ +LOH A%KzRB6NGޏz.%~ zpW$eƴS Fz`} {DpC5h_.e`v(-GJ6߿J" +qx{q?jxsk86/Q &l͖wk5 ȊP~ +Lm (C#L.-f[__ZAJ Jx{$!w~l+ +aP2+"\tX;? YX +QxpĀ.\G4Qjh1 &!?" @(LPί5tut!Th&aHRR+on +Q{DpվΠ @a] n+,iW N{$с@ +Yz- 1dt4)~w}!L` 0{MgzYl +if:2jg}`" ֱypg +$W5ND&9t84:\Q>4s}D> ֨ypNW^Q=v1 5s{}H + ֠JpVC!,͌?"6m\T/ ֩XpdQ;v` 7߼-K'Ɠ5|ɍ7" +zpm \'mdLG# m*Ps:ӟ^&-k(z HڤypnȀ2pvX4.ٝ@RɴH|Fn +֘JpoWF0k30- Bu_ԕ +zqz 9$M4DD@aibnEZ6N|" + {DqUO@E rP6*Ge0Zx6׾ڎ 8|Dp8H{ +b°37Uj( fSu N X{Jp{[}b~.'DPFzF/yulUC zp7Fj#Xp&֔ƋO,~Ib xbDpѽFSS*\+>aW5"6c" +Xp'wzbY=K{k*l( XLM?z +@ ɵ8Cֹ$1 +Sq Xzp +|{HXlJ hPġz™fi xzDp?ˀ + C, +{D +2IXf8S9^"`" +X{pcXX@SܖpZ* !r=$5d~= xzpQ߾`GIY4%FC29V#@ZV. + DpNDx*(@bD˞T7 7 о0 +MŴiёـ̱Pj CHF[yW" +HŒ8Lшt x֜Ҷ'Dm4 A}z~ +hP{L;NJaDqn +QOr4 hljΖY XL:tVc1PYАib:ʮ 0L5QWl?V?%Es6mJ}m%" +LvƏ‡arA4Z̑]&*8 ؎L6>`@Jtxdz&^ETqW `0N`(l>LZZIVn-} +XL@H9k/.0U,b@eWpvz;"iBXqmT_Bn FrRmc߃$0 +BcTqUVie$y"J?Ytv}`3|X Ŀ ֤`{Dp ,kCtυL)W~, ֭{Jp)= 6ma:CENThP~4" IH{Jp$ IȁIPVty"þDw?.GgJ đ Y8|/Ѐ +n1!ab sEpT? r ē cJq+Ezfs=Z#k֛׵ECQ ĕ Lq/>O|cX8&KD,{ +vn"ė )xLqsWZS/#Jnˋ6# Ě 杘dp@!WeEɚ[ Ĝ ޲YOGOgƗdf"p0TP -C" Ğdh!lMS amF,L1C"c +>Yh[N,:,]uں9sh4FEKx S dL9ݟzS[[`Z35/ U@±KJLH Ur/C24LAm&8 [3DpUvʿ@ @;.7]eu +"^ 8LL7qߖE*v˗'L$U1+-s2@ a !:XKDq27ёW%@7ܞv?4N +:`\ c ~XdH0V4S6:-FHمOخO43\7mD:$1 e~YPҳ lt"il! BIO^ŭש/;`T)cb /Y8tғ8d&Bx:뮴WRXgQ 2 Dpֱ5֕J١?~5߂@ـz1y9, 4XcDp4%oFbHa%DzA! 7 XLDq^}O +T `#HKm dx+ZI": (־XKDp+9Po޷hvVYmL@"\@cu =ҹLp>.<a€R}Ĉ++ݗ @ڭ{Npߠ7È ;ɢ{og|O+ CںX;Dpڀ'w~͚0hz %#rkj06BY( +"G ڶXJp@#};CyH症9:,"7lL J ־XcNpCpv:Å+%: +ho LֲXap:VښGC6WF?ʾ(OCO  O ֲX{JpsžY3AӔ4)-c`@)"Q H֮8bpBҙPlR(#d?_lGg S Xzq[V0^nٓѝ&?@% (#B U ҭap0o[l"3($<OےHN WҲXyJpJǫ&$j5$3,Vu6Z% " +/"[xc +Lڲ-~|3,|wXsP +G! +;l~!Uh(zLTu a v{JH4uI3(]x9 Hep=Fa'TO d LqVTv#!;sDg}qFzAh|2"f8zL|}$e@cle?|k+P j v8{HҀ3Qiքd/ +`aeo~ l 8zDLh"5`Pr+ la|_d,N nx{L + {'\ɋP8f a {L0_'Z)zC)SBwPejO dXZp/('Zd +!ȡ +rE{"g8apEޏ, HNCa1pP @5 +2b&8Hh + kֺ8zpnbIDDcCzLY 2VoԢ( nYI6PO%܇ rth;OKZP),mP УC + `XY#i"7 +2($4%1F4~ٱgP&0 PܮDP 3X[Jp&v,cvоP' BbPJŎ 6 cNpMC'*>?l V.`7 8 8[Dp DM=t'`-X`aU +/,ƀA": XcDpHGգ_(\Ze! +g }sg =*aq`(~U#gH@J-A[ib @.[Dq\OɲP^?߀J/BS%0O Dq2X~qs泃6>}sΣ"=M-_;^"- 9cJp;ri*)/w-^K;2sdXr 4cLff :@<^,zS(B"` 8ֱpLp9R &;@t\bRbQ-I."; 8ڱdp!Ts )nYDy >ֵxLJpQ@>vYn[Qj5 A9M(%8\MT&NMHO1t%"rvu"5^h DYٺ4L*" 8½q(W?h8qp@Vv ֠=OeUm XKDpRb Ѩ$#9A~N(D(#O1-  ָ\Dp +0?UlJu r  ½xcL. +>iyGk /tീWej +K +p ~XcH~}E)q XȆT ]18 |*?" Pְ|DpVUA(/@ *^7\Ct0bs /Za Fvӗ{ixIU|Olp% S )8{LLbCXA\vy币4T}`)DO -ؒX{L7vjೂO6|M!Y- F +@`D"0Ⱦ{L'BtP޿E~ +z\;a=󊲁 4 X[Dp> v]}ԁL+|Jdv-9 6>8bq7`_lBF+*ez3 \%f[ 9 bp,uN))?og`V7O i陊j"< {LpΠKI@{P=4D"NOy ? zDLH$2m怀n +ͩ/) Dﺳ~GM + AzJL+[nZ<S&ͥ1xCNk 'G| E zDLXmaF&2 +JJy_rx'5u"G袤P{Lb` +11ki& wIPhb KXypAvncSf`f BO\7 1c AR0 N Mx5'؞i1rŬKVRi:~6m PPZ\Q'O;Tg" I +8ewH yδHl(2xdJ  !q4:4wo@_ R+Z I1`o   +xp)?v0A%0HD,XL r~յX> =:(Q;??o'"! Q +Xzpr ѭFbq)12Dd5%_ #q +/І8 +_V/B23/ &Xxq ܹ ~!@mHi֖X3mqx쿹P ))FPqrDbCAxKϠ{ն vI,"uAك  {DpdSKCW' #:A%"M" 9X|pHν|S'0<2:v*ik1˺B  +YOǴOFK݊ +5Z~y`1o\ ԂɌ8էwo  >9d[-G(m X?? C" !Ř{DpfsAzHXt_$8Л  ´LNLH2Jt3u7Z ;$j[WX7 !>Ÿ{Dq+* +}̛ }߄pp)ͅ ±x~L$C]V$?r##=v}@ +b,7V:R" + I{Dpl)2P߾M|O`Qj ˴r+6  ¶KL +<ٰ[S}`!0V4qUbK2  +{pl\ڞy5Q2t_q0;ǀԉ +XJp|X.GsoUQ?b*,p !.? k" )XZp A?Koo;Xp:GȀ%  ѸKDpt>LhLǽO+W1`L`:AgPz`]  vKHX򰪥T Q6ؓMH}ȍpc8hO ({DsfI +FS[{;#KBn˼#ʒ7;I,  x{LAg5k<Ɛ^jMX.CԉӱDѕ PJqOD=pÚU""b0ߣ=KzYb"" PZp:zSy 0 +CMD6CVϝ $ XADp`|69"31J/sunf%i * &X{JLԓt0x +ȀҳK͙(h$H>A=A?gKv0Tt ɘypQlH33>MG/Py0P'\Q+3" Xbp>Bh`Enёc|?d K-M 8Yp}6ܓ{T0t.nycNOQ>'Iz6 ڽPzpkWƿ|;Bmy].cs^ 0/ BPzq{ῠ S*Ma*<"BXZq?Ƹ<,W =r_ `$ 1B~q'UWcP$c.{~K XKDpHWxk;fw X֎< 貽XcL-lڞ1z/~_@ Œ 4R`1" P[Dpc +a$ql7ˀP&D? ŸKDp\ %s6մTy}yp\3 XKDp&@uNG2#-5Dg8Pv  ֽJpGx;[:u;2d+Gaˆ+'k")"cqf]MCn1p.{3L`&  X2p4{g-d]dV_!?X`@  L +p4Pm !<(]'?;*[@ Jq+ + * ǨĽV 0hM" Q8KDpBqV{р c" ]F_&C +KDpKD(x#wnپKX 0P +! +:8JqIRmx?oG8D*BL 8KDpSsִ oOG(hSA!*X#" ([L,MϜ XGP!C΃q$ Ǚxg  yɐKJp*P6aV_ +CB +mXT#p)<  ֽhKJps@K0 FVZA9P.3=:  cNpQP)O!6T>) ANeC"ִHbp=!* \6wt3Q]e*WO bpܸ >x +|KH JO126Yv- #֬(cNpP. +%2&-:HU1_G\摿¶/y &H~LBUjЯ]6/ʀ c# + cDpSx$NΔg7W8+ӔvڭP0,mb"- (ֵKDpd;IUew16 +ʶ)v,` 0 XBp̯2<ڑmmNe@6p" +|xar 2 ɸIpB`p[1s}َL)dQXB 4 !8Jpk\o`ju4ۣ/ԋt "6 ~ +L%C>ukOlJ '; 9ڬ{DpҝV)*tڪh?Mzj HQ;Z j12{r < ڤDp'OwFټHh1d+;?ĐeS$qP ; ? +XbqOk|tD'%ĵ\1!vS&V"B H0| +LܗmŇ[W +7?,9/`C.b D +0pzޮ?_jsqCAQZ 7 !>P{JqI +l|>9T=l,j)4+̝ 9 ڵX{JpTViz +GzoPT;Y"{$q "< (ִ{Dp]|w꡿z]knB, ԟ ? apA4䀁\HF_J +(p)6-o} A x{DpCOoRNSy p*jY*r?[ C ֬{Np4~+#A$f\RYR 8&B9E|҂ޔ"E IBŘIqIZ&W$e&9lʦwD!;Hu^0 GF0qv0c 3B_G * BXYq:#q{vh9 +..wbN]kp: , !BpzqjRxdne$(? l". >zq}GTrK|pejwOCz}<` u#XZo 18yp$ucmgź`($pG6G 4ֹp{NpTL+4#ſ` T7͌lZ 7ypkN_: z47q0C҉8*'Z": +B8kq7^z"3Bu ^ͤ 6X2p.k]n@@aٟV)6.j@ 9 Xd +L_]YL'  +B@Ī3ϱ4VۑĂP* ;XZp>goW # +5:DgP)W"> ڹx|p.+@gc]܀)o-)3P^_:_ A ֽ{Jp(JkVe!5۬1`ѻa!{ CX\Dp"|^dbEm4w F{L nĈ;ȎoEwQP"K XX{Jp-369tC*H# +x#㽝~@ Mֹzp@g94e\@oȗ Ae4? ( PP{Jp{RtExWoȬ촦J c`@U. S ڹypxQl,4=kZXK; O N "U ֵNpN66:FOۊ5N>8Ft2g" XXyJpFXz,2_X:+=J`Q [ֲypwϰ܁?ꈔP 9yS% Mm&R"} ^Bƒsm7CF@hTWQi$0?Lrx"A QX{Dq?/&r Lq§3(P0!j Cֽ|pqk8jR=,`: +ɺ*3#! Gֵ{Jp@6P3d_ 7e2h! J ֹ|p`(졊dNA*z7"L Xڭ{DpM/yw69H^]Q]ozB^ N|Jp +4ۋT;ʧ/*aXE ɨw` Q ֹOBˬp̶pY6R2{ɴ3 S\ q=^b׫0q" +&X Ź*[ߡ B타>5GZݘƗ?\ B XKJpz?3c@ +.jajѾ(k"f/=( DXLJq[ȀOfYZLt7AK3?KԵ="GֵKNp({:c*A_η{@wL;P K ڭLp8bIZ7@2N֩/אS g$ Mڶ8CJp0[C Q7$@%BGKWP1r` P𒩐\L!,og)@!8!Eh+0W"S PҥXcJp$/p :ya(|ވB"m@(y_#=5" U^ +LAĀ^96.\ +_V y^PyQ Y XʨLpH1[=mv!8 aT\PI Zʨ\pD8 hH{ؿF9Z|B˨L԰jT^@(K3is "g @XcJp?rT`/q-9Bu& x~r9  jʩLp`DX3 "&Q8]cT޳dvRt mʾYM B(zܪ$ pk3xϭ*ĿՆɫ0;( WFQ>"7 HYHhW}EN@6T#su 9 LNq=jrmn'! 1#1y8/ ; 8N +LCzFX +Z;@3w 68^f?Kh aκXLpvCʀ#\2W)LhC"d ! +dq]_7Hƀ4NUD~Hp g ڮX4pIt y +eY[@Z"Iya]0n i +XDDp_t<5KQ0@@B=Hz"Ţ| lέ3Dp0Y5.f`(j=7OwmXR"o 8ΝepcHҋHO$޿T&PlA Ā r +\qULPj$lX޿r?GG): uʪXLJpa3 +$L._Yoj `53t x X3L͖(b| ć ΐ(LpY5~ *?3f(_h8ו;@M ĉ ʔM +p#SY D^',F*Qcmv;}M ċ6LUH Bk ! +FynD"ď Q +4p@`>4O9IY;i_ đ(NL uء_w8Z;ڛ9q .s=n% ĕXKL's3lCppcS#\IO ę 6JLKQ$Q/ iJghC+B"ě ILp9xP4( +d%,kywp@ ` lB ĝ |NLO*߅"'prBOâ?^hb,'M$ ğ KLR@N_wN ġ ʄepT!_Mf[Sy_t%J>"ģ +(MsDgֵ?ˎvU`@򴔩1kQ| ħ NLjj!F9e S@ă(#kݻ` ĩ  +|PM +q`hN7Aj4miJRD ) īƍLDpݔԄalOaHD(cAP_[X&["Į !dDqUZ̎O<8'@ gQ^R ı ƍLpά;6< +0tVH23ffV;>f ij RXX$wԂ } m-H8PAq2 ĵ fL^hWo:԰@&ik"]:M|Z}u ĵ NL$΀S\q 6-'jYb̄HJ"ķPNLs]!L"|p)QD +@_{ +bY ĻPNL .6[ 3Qcٱ @AC ĿPրMsn[(PYzK @teô( #w" 8ʈxNpP~G,.^ฦf&(" r;EJ NLz͹g6-W$?p=ooy ҉4p +.J4C58 (SHZ()e]u%R +Xy} +pZڿ.P6FQ>]Z +=[ +7)2/" ʆXLp¿?`P,5R_[ VHs4hޝ6ee p~L oL1`2&aj3Fno xNLM)B=z4 t dZef}X뭦 Xnf*xq9p|0LBR16/FIeMy" +x|PLr`ʍ0DMO2㕡h ցLp3ŀ  +72]v OQɠKn&]Bt ցLpwȌ4sb + +,x y +~) dDp 8 L\;fh'r!" +օLpf>1$XqHSEQ>-SRܪQ0@N(F ~|NHf23P)dz[s*0g`@1f 0D tfNH3TNr3*eߜ?Jh @1wyH +qXNL+j@_8Hzd0_ lM;^0" NMdp"EӸJ g +wT B4 ކ8q-cYmG|F0p09fCa rN H gM LϦ(Y"ЪLDLQ/{erac0>` !q . EQ rNH2ߨqX`6PW6u vl(fH1G;'?J 8Pe /Po\ XDL19/*_ +pDW=c)4H}"d(fL +&Aޡ>2ƃ$S6'n X{L仼rЋG +Z0Z/{DPW 0„NZL}@/q6Qs +\<Ծ[" +w ȎXcL#@{%YnM/jl +q3qc_/ Œ8{L/?t쵷NFw"bTKH_" Px{Np?# Y"ܕ-tCǒa-{Ul0K 莌x{LB_8 ;yx9B*܉@g\TWyR| 辈8~Lk( Wbx Ɩ%5~j+ x~LM62J)Ydq~,vr5sP6" +0xp&oP,umjmJ+g"?/ xqK o4wU}tfоMK*W(I XLK@=e J)Hn;$m_܆;P' P~L&_RǚC/55դPkgu.m?" PNPB@ k RayJqj@x` 辀NC! + R\([CQG=cjonkg sOGJv +}FtFVM+c_tx?) +P +LN22BkvdKP@6PkUяFK" +L26aDppXDoRsM_۪ +h„X +Lլց̣*}*y hjH󅾱h +e PL$?1$O bPUM&_}+ ЎxLځZTQug`PBҰ:&*E60i" 8{L~r{QHCz-u !S굶VPJ0 NѤ +ʥ26`$ +m7F~[ {Jp?҇-")@WUBzdp| L'O03.LjpSaq4]^Z['utx06" LΕu*)pb,`dH44VEXPI[x_ÿ + L +K ?o8A`N/Q(%:~3 + Ơpz@2ܦ,i1T*Od8ȜKK@8 XLPH +-NT =Z dޓ{kNfw" xLD+/#e9'E%4)Zw1))^ +LX# Pġ$k\#R6tN3(]# xL [0_)qW,ی$w8058xNO ЎJLڍ~XcVn0,0IJ1ڙ +C) +V2aK" 0L}Qn.1 Q_ʱq +P L@5o1e1b NRE0F5}3 ? ֩{Jq} y0X–J[-;Rx֡G~ ֝Dq wH hqj_w4PM4-S+zu" ڙXDp7T? ԜʔW!cxA%1u|` + ֐X +p4TC?7K!A}t 2>-%<(ңh ֡xzpTboGU +7$R`D42O + +`ڌp*(O/@  xE@9.$=n^" (L`sbߎM~H]&i^E?S +8q0VLiy2a$G P~ XaDpo2 l9#U MT#;W XIpAVv.T.)㕥;i 9k=" XxzpK~;p@uYTᶢVhVEz-f= {L5Y!{(OP+Pֽ@> z {JpfMzO6΀F +vSAM7̓?9N+Wwt 8zpu%џZ`Fep|%2>-S]u:=" @zp=sܾ +@"9K bDAY/j=A9 +>~q5o`a۱W'WE`Рv^oMk> n0~(O^L|3L\ Veh*)Me#F~ + KDp.ORdS*[q śϷs 1?' xcL=*;- 0NJ|kk?f6).w>giP"Т~LtVdh,5.FSsР4f#?dI xKDLV:*TL0Bmcwt&qñy8 ֠X{Jp +~B(5~9C;yXByWSAC%7/ +֘X|Dp+7 enD`|ayO}ڥ " P~L$X+Nh).`G +󄺊{^ո P~LC}@*pQFP) e3rx7p2 x{HCBާ} @+h|#d9)c:LbZ_ {N pg{ Z>+еDbPM|kGS" 8LS%}@,Xs}~Ј°E~}3t ֥{DpO_ 7xlC% ;DȮ}UxJt |DL:/rC9@:M5" +Ӓՙ +x~L- 2J_P4T@ZTڜ]ECg" ! +x{Dq? gKԭ&0 dJfK*#~]҆PHT +xLc &lpysNPi"WEťmbse q +xzqPheeذ +`Vx~g4~ x|LR-x<`lB +hL_tBqgb" +ax{Dp|O& EP܅*qMJv] ؂PHpZUb$\3T<;#Bvc# + X +L_A]c +J<Ќe_]]3g `P{N~gJKfV2j M 5y" ”x{Lޠ_<iv8ZiY{bQ"~o ֤xzp?Q51?HLFb©xH:=S3Jg} + ֘X{Jqon<0"V{2βKt1^G_qdE) ֘X{q0j+/ )Q\\=3jdtY5B" X8{Le=ɫXrmf. +P(HOn ywJ ֜Xzpo?!t XR(p`2I>lH +B\(r\ ֔{pW^l :L^`ǀ 5rػ7 +Jsf 3?% +lr6dNџBh" 貐{N@ XOewA@H2QU/G ~PJ [ . _խ7 +1)(`%Mۼm?;} x~ +Lpffc˜j +a[7x_ XfHZX@GHzL K#VLU0_Ӊ[g'[@a" + 8qqǦ!P`0h7Y"Zx͆- ODD ಪ8dL1}7b@p,d +4G8Ы88LP53'3yx +X8p+M7) +Kj Dp>2dy8f6" +(YDX|RkO4j]\t˒Er7<x2S-3Čt''ؓ'Y +]Hө"B P~Hmٸ3mWlB_K"{Pmj?67V D P~DL=[D +< .BPOR*t* +$6џh}y/ FXcDLOZ +XS: nP9 I 8~HRG7Ɠ){L'39 + !2U< "K^~L(E @36"4@Iߛl+iC$RU?R.uZpZѤ¶G@ņM j rP~H؏<'JEAETB).h +՜q?- l rxcH(Sh;Cu !vy,E@ o rx~HA@ ea4($gPKOUΏVU"qrPJTIRZJ{Ge, u xH<GPMJ6̬1nˊ0$Q\+QP wrx{H:JIr^8nT0LVð { rXH܉Ӱs?jQ8 謘"} XxL`Y-XF _/oK/5L xz(HHrtgFl?[l(QE^c Ą LfjKp=i7 (Ar!hA|'pv}SY Ć X{LO&cb&YnZs8][}g{pJ"ĉ 0XL>K߾\GfIjx%1#C4ηҎ?~ ČX{L%FD ~Mpf@-`#dp}@NM@^ ĐLv@$ _V讂S2j;Pֵ;v X Ĕ XL:(t΅E,gx}H/d_ߠ"Ė XDLMiȚ LzQ"f}zKg_om Ę LY9!ne 9 }D6(Š Ě莠x{Lk +r į cL/O:@&3Ld%;l{W[Sy2$R@o ı~PLO B fq 1' [~r"ĵ 8֠Xdp=`.V5i#[=- 1ڗ{y@ ĸ~ +LlXNXK͂[O_Q``#X@ ĻҪ8LDp- S|7_ +`֮?"?ɀaI ľ ~JLA ؐR + 6hsxf58= v~" X0~LӲF ĺҤΉ<@C$ ~LI8ŽXk=y`4|4J 膺XKHoB9c:9 /_@@ˀ"@P  ک|p˗grN&s +대yP‘" XXNLpOXkiRAw'NqϦ`Jʃ ؊XcLRB%6b % +c|9Zr&^9!2 >g xfL\5c:t JH.A f-R!^l ƚX{Dqj9 4)r|}` CGMlq" dL1mPXP5k+ۥ4!eLv[Who֋ ʦXBq\49D*{:)ͷvGHq ~ +La? +p<[KIn#h + ĭv` Ȓ(fLsWڋe_D[ +@IDN~bEDd/[Y PfNL]sPCLUFWpi:-g1GQSK" (֙LDqu~{peW\v$12Ԋj@9 n* ڍe +p:KćR&S@]X8j*l f +Lmri +tvmً_64 !v "1! x~L|T6_P< x~L>`p +$󝬹7ԫ-Vu& " +fNLHhIP\?Fa֔&_W{| n6(K6Lǚ>KÏ|pwϛ +n|xNb(` dBa$M FL0Mtj,p pfZLskCDLm3guYH! B[L" +xxLp0 lD#`i%pJrIP?`AmWP5G NLlBk:cAFsL>fqPd 6 +L @atf?',k!HmMFQ1zD žX3MAlAioFD9gnS<0e:~" +X6MEYV |f!ܲr\2I²$^CL_ 6Hy0,3Z6.ڌ4 h41afZ + |NLRa3άYP2?x`E@)Xj |NTLb12ȧRuh}@ +CpqVx4S,"xNLZ¶n$k;$ XJlP%z&%lj +htfTLmhnox?1I"oA)P +!@l t4 `pfRH;u-@`*Ye7νRi +}~Dq3vʎ_6<󼶕Z$LsC5O"vfRHh lLdҙVl% +6F6B\uN}FlR rPf +H,&a@Hm9p4 }"z rP~PJ-I(za,B`œ$Fg[ XapLpџS"peT0h8.Up x{Lu +H +ocфAbr!ɺdLV xzpc%빘 +p5P_%{鯟-A x0{Nc} +vFrG%$4VV֝Gf" (xzq}'g-F*+Wи_2T1R + Xzqޤ>|"RP} Tk`beĉrXQp_A? +x{NpP;Ku+s +ܧC*-:VX͞*O(W/ X{Lط6 J&KHĺTb;2Ar" +XXp7byNӈNm}RF[^? ؾ8~ +LS` h<]ƳR$ud6LBch:F ˆ0L0Oڊ>`}*U\ߌ}* h”X{LʈDp@_8IIAZQ?w" +ྀNCbOG~ +J!6Kԗ$h1#^0 Ў8 +L,:wE +P! a^tQC ˜X{L/_1TA~L,D #uVE  +ŒxL|M@c݋ =$)ll5͡nKzp"~H;E`eYX<;$TuIA&?—pxQ +8LUtPߐ^9&kɼ6q*/wz XLpDw)" JErE(K XL (x@n~S-9d,#ӌs%_N" ؎XDLKh_*8NEQFZC XXLRҀ`ڌAj9]$6 |~jp%'P +@XL[nn2@uvs]\ow" Pک{Lpy w +ũj80:72}[m ֭yprFR +dŐdHZV*aI$w ֘DpsqT * v 0ˀùC[i ֔8|pETбA8j1`̐&MfT" ֡Jp3ΨY(@]208W +H֙Jpk8bbo{ĉs_@S.'dvq]\ ڙP{Dr͋}di#  /rL~qBA< apdzQ;`9ѣLB@9" PXap=A5`A>[1taԇq4ۣ| {JpÕ@+SeO{yVR3 莡{L d9_A`'+b[P! x{LBlcG>)vVg" 8bpd.Qa H!g\xX5-kwx- zpR6j}e%D|哒6 Ρd\߽o {Jpy?) -w%AgWP2EfPH xap-+*Eeք(z"pT:B8i]w?PH5" ~ NW[Xi&l"c2:ⰄN9-R?Qz ྵKL ۑIv.OZ}GQ9Pް+ +S ؞X{L[n n X'UNHbҦGvѴD X{Dp__fC+203ɣ`ïłjfdg +xXcLoT߀:>),:pnAe$PIgz߷NT" X|DL:6 +Lc5 + 5>K4H,)g'( +X~L᠀Kן X #dp~5k P~ +LjP| H{@UIp},5+9ԏG՞ +X{Dp> +ow MKF#NpKݻ9ز`A}6i4" ֘X|Dp[R/Z^"{2VȬѵMu4P p֥{Dp<;3:cr" W]3C9q D(b zXDHn-_(/4х qsjݼ ֠x{DpO|` ]v?U d([W$k9.~pu" ֙|Dp } +(Qv1aIH0 |bI!mU]7} xL?ŀ?pfsOTDq/FȍN|x5X 0~xH,,!5|ɧKgLB70%EwXW 芠x{L;+v[l]VmBKG> + +xDq|$=8yuƐ)pp) ?{Wă x{H저  <*/VPXcPڣahQO=j" +xĄq +vY_GD' +Nk x{Dq A 0(Uac}_дBw {L2 ̠PNFHe ʌyv3-~#6 +x{Lb;ܑ[tWBsHy|]I6|" ڤxzpB605vOeo3DOsI +s ڝJpE my\BPa W XlZ:S>SA زXL?N~~F Csw*hw.} 8L`%K`` E}(0} 9sK@׵" +֌8pu@F0L3Ԅ&i78}%5Zuv95% ֔Dr7CP +?l$ +RuȏpfFOYd ȎNF(G?5/ =LJhdk*-Hfͭ_Lh +M +ژX{pGPZY]N4MIgL6ԮjPHQͤ" ȲXcL[E܍2 @H"eOȺ4- j}⯃q P +Lmvt +; +J8 c{o +(NLGӨ"Ըx7Ŵ44K־jѣ {L:~.vNJE,=ǪM1U7]s*" 趌0 +LȭԻ$ ޼NY@ A25 QLoO +rXHF9 f-)nLRͮH79ݘ(' 0 +LֈY1zքQ+b ~ V}" +xXLYСP¢g;E cH{ш! LPqM/$0&)p$1:9 ;Ѳ~ XcL~)^H,ܲ#7kGr^W ضx|Lҭ 傿kYԶS  h3%CW" |VMV^KHd1Z72*A2̓=bz *:E +x©cL,0 #,-P9`O%&<ِu xcL#ْ1KaUruŬ&ꬸa^jV6o XzpC1 +$ju8t'n/1ɔ X{Lh'<m-Cʾ411ֆG" +8LB$89%o^#ݑMWY坂Qj X{L @ +ZtW]g'?Q*vڪD09NG +P~L.dr/ ˼+FXo,lu +Z߂ ȾX{L|mD!Ι&4=2X:ͽR" @8{Li%!R@c3)]tEjߊCq +~NKUܭ#+[CX)Mn`B| 0~N>_,.e)¸^"5}TDh/M ^8(r( "fvp"F㞃2aU" 8Dp}?0mC\D.Kr;RյjTo? b~( ґT`*{`FA Ѽhv-@0b!6 оxL~! V;>m%~WYm ˆXLSm|6<(#F +R̼EZ'{;G" +xˆXL{7x +׀L +@qJL@U/y}$i ྀ8L7$ $)`41]F~([`@ Œx{LDOP# ty>.e(:q4]{ +x8Lz _! /4+%+5EOi_jp" xLŴcE0!22/d+߹5GV+ + €XLmդeGa +{3h,!+3q65A_wy]9 |PL<[e`O!$Pt&zLSYB" rq 0| NWte=^H!L303)joJ7" +€XL +@rjJB(/vV{/ xL٬jvn`b Ifl}NUhTBDP+`Й Tj 0L]vO& ^p5|\fugӱ(" +|XLS +HBXB\jdQE3\1"辄XM&> q],ap.A"6 L +|XL/!ZBcGsC%V: +eg txL-pyD˹J +,NrRUȣ оlXLgy_mp! XXdHANOж" 8pXLqQǽf_ɂ@ "ӷRqd?F)vQgX0 +d8L :(2p 8R崑$,5Ơ9 \LlkсyWhwn"<+-fO@`Ζ vxxHA-atJ 䜦%ܔDη_EH8G" +0hxLhp{ :%'I#A~Pcj[I +j x{p bֈ5gh2Jw{ԝT |y PƞqBMFV4VڅG8wz@ zE Ħ (|pdɉ젮aNh;DHyRP+q"Ĩ 8{DpE-[; 'PIuI>@l ĬඤXLs?Vu6ΒÜETBifXT.X彟 į ڜXDpK> +#r"A'd%թF įВX{L%q_0^/h6z& +ɡ0^* rtB.>"IJ X֔xzpg_%'Z5O(`iö~] Ĵ ╘bpTK5>ΚH$ȣ:& Fʴr)؝1 Ķ|{N?(1}ibClw@^7lgbS^J( ĹXJqxN4y &Pob10 Ľr({H#P.p Fl4G) d|"p(q@LA%"BmDsр@a* Ĉ +(Nq8 Q]s\Y +$BGo7 w {Lԫ#NR{xG +@p,^% #t zzqp( HKA8'2L q;R`6"} 0{N367G^Ȭ|` @6pȯi;A> ĀؒzL]!V/ރ_ F)._FUC#`8 ă  +cDpWmA +ݯ[Ⱦ`fBIDe>QW Ć !8{JqȂ9)ٜZrHk3rTlm(X."Ĉ Q +bp'=Kd294eRI8|J^[v'ru Ċyqŭ_^(I=Hi1[C5mǣ č{LujmBF@ /@Rck(U Đ1q_( +GY z|{ѿ.3 0!"f aX{q 5TlcLq`| +sN;!ٍ \cDpcgPAqoyȱ@@k;l-T<1ʪg _޽bp4\M/@ T|8I +4bFN b X~L +-ٓdn.@@"¨?i + +"d QzqtP<,hеLh$]@W” f X{L>˰ҪrQ1i> C#|0A +皹W5 h xK +LƋFd,H F QG5r'F j KLϩ"x7B8^:;oMϳCF4{ "l 0ڙap?O4PhݐF& o ֮X2p= Gyhamqlc  r{L4(a\5 xAR Ӏ#SI v +q8K+tI>6H@4Nb>:j +5"l8yJp\3>S!hp^H&VXbPHT# ` p zpP puZ^/S'N +p= ! rFX~q%L(G0HaoA;X@ZŁ# Y KDqAr6=̼v1_? +4 pаS"[ )cDpLf+OX%]R]0!XV^tS ^ X\Dq:uO_(FR lB7tg a歘KDpi¿o +/%R ]HAh#<0~p ecDqQߩu1.ޏd +8}ub؞?"h XJqQUk,Z +MW.\|_?#lg} l v^ +H@2XpqnPٲhB"Uk~|ͼv3 o cDpO,ِLe } :rg r XK +L{zUX;@z_hy?oO?Yt!"t I8cDq%mJv`WA*85x vJp<zoC7?O[oF> -!ɓs y讠~LpY#%:}9n ~vf-|D&B |ިJrgs RjR)ū P$ C" 9x{JqKQ5sS0?̂V(}}6O5ˮv Ă pL2_wd@j^ʟ#^" Q*QO Ą 8Zp/?,9^NI!TnQ9 ĆP{Lhv<ސ{۵&pn Ń| +;x"ĊЪ(L[3+F.|"*d7rjHhw};~9? Ď洸zp@=@(hkb2Bz7_ Ē L? wr.4 P&R~8D Ĕư{DpqҽԦGM8O-: +>T8 + ė X{L^ΒD}ҿԢW(MOufO!@@"ę X{DpC&Y> (#-n(mK;Ѥw(/ ĝ Xzpre&`"f)FoU;$ ğzqAWc:+'P& +5P!.8] ĢX[L׏q 7Jظ'ЀzKh`2?W"Ħ 0xLS>Onr~*[,B&TTZd\2Y ĩxyqr +"[" l! $h\:wg?bS C$$dF0 Ĭ {Jp^ÇtY|ZOtSG: Į8L |WK{R4ֿ&"ı 8ƬOsBiG6C&%xZ ٶfaP Ĵ|3n/;IZx@ ʆ8O8 i Q.Y8oWɘ%f}>2Ǟ * o b bpt?S/Ԁg- H +G*Xޥ"d A +8|pշx@1FOST,:7_b? gⵘzpo"ѯY.zn7(=IGt k[Jpwɀgd^iN9 md +Ǭ[$P= n p'{:Q62^%=]!هM@"p [LDě<$cgSyꝁ|ŀ s x{Lr'ޝ/鸯VRP tt++=.1 vؚ8{L -j=XJ4 ݰd"2ۡrЁ=^ y ʺXIpK +ujz"#:j pQXy',A:i"| H{L+ ژ)IJБ|G+i?I P ~ zqkPcxeJobkL v y|qOi?'w@ofL mCR/`%! k Lq\@D-CT mvw9( "n X֭|p#[ã\-kX%>ݮ +/zK peqJ)ܜq!\V~C"7dh@ !.ONs sX<pXWǗ,`|3M$j֚6 v X3q'v "7N66ΟDg?"m QdJq8$:wpJ}v* o ֽdp5=В5F"xֹLpo-C[f"Ą )Lqչ>W< +ٸ. YKĖ&-SU ć ֶXJp =G|oWd;ѠHU_5? ĉֺX{Jpwp>1ԆS8 Uσv׷ۤHw Čֱyp(p7|F֠<bE~!Os"Đ ְx{Jpp3#%L[2*dUHbo`P Ĕ`֬Xzp4LD@6cE@@0HFˇ$ ę ֱ{Jp h(ؖI$ЙA3WgX`$a%.w%zk ĜֱypNV%9޽5=xdc;AmbS"Ġ֠JqI哯.C Tca1륳GQΧPCտ2|| ĤNhq,pnh9" jϭ{p̵ty/ P +>|qL@=v z+9 }=*SXz L[LA +p5hYsw7&Xݟ P°~L`gXɶdJuހ?~@@Ř "SHFBk|l + cֽx5~k: X XLpyӠBҵWD:)=R6c0e Z µx{L$$ +U65cݫ*|;)i \~{H87j>1vD +9Xxj奝őGR"_ 0²{Lm:1c_#=[zw| +Bwy O b bLv{ö2L۸|3xeZt=oB|mw, d b8k(JeN}]@YP=w"08\rrg fXzpn= +7B@X:5B!8XlK=["j Lw h„Ăomտ7ձWd{( m{LB&DgWkbL0T!N +M>Fl p PL1pHcd Zxzd3) s YO\6u *"u B cFr{(zRLWJFʩOz 9J " .(ƿ=**ց +<%2bcL 3uA6  {NpJӬvTs!@os}avq6cT5vN  .XJq=GBr1r=@ & ƾXzp ]YTK*lhE۬()!"( @ʱDp/гrø*">/7SQs7FL_ᐈ# 7 + άp,10%oАsKEHӱ]3 -*zq`X'B ܔ⁴5[ V. 1 .XJ +q0'Ȃ>.QC;/ +nn@C4H] +ฐV"4ƬXpGtlԲҐ8`9CJDߎ - 8 !.M(3 jƤᴠD+8BQ Yq12r :h^]G  y1(R©xjTHE79#mIj*_0YV;"ʸkr ho&D”T*+uuM]C#_ܑX ά|p#UDpƂ%A=CʗR,=䥤 άOlGk{u6u%\1-;?r@!u  ($߲?" (¸d]m 5?Nc_M"XAp  ŘKJqJtC6h%ժ Jj^ίQ0`B 8Jp94# 1yY`u: rW2 + P{qhFrfAPh X[," P@cLk;WA7ru[tnT9U@mwȀȰ&G  ¤[L_ w2'n%uzY_ 3tHGY  [Dp袋R)ZPYuJ*#ڠCl +ly7 KLpdP;ҽ303/UgHx,"cq%,Xp +؇p|2->[sz@!  NLd6VlWJ +T=ꁓ߭u  X3Dq,.P?lx)LNmNFڴ9?G +Vi0:( +ֽPlr +3@riںuü`Lv2" + 8dL?:9H\3.K7Ԡ  +G2 f LDqJJ Iv[@;Ol8Z?WZ0K  8KDp:S; *y lEog.D p{NLX;8W-%AU +#bra!= !.KqEbZSTIƩ9H|C " XPKNpS2TK֑!A/mr  Ѹap&vmOOqQ8?8:7z}1h G  {Np8%P5$#i0R򯋻ʀ@:m ɸCLöz"D Gs[iKkUAH" .Xjq0"Sd~2n(+2eeE Řjpf Q$7tkս^s] 9T< ^R2  ɸ[LH_#ve`bG̀@aT>`  +XKDp8 lhZTk숎+_ސwdY}" PXKDpZEil +nL]߆d@<-Y  ͘3Jq%Ƭ׭wNw% +珆95,Sw SJL͖C ՞!\}*+"zs XCDpVVK/^3SXP0Gi6g/"XBpQekoԤkؽ@,zEb 崫Sw XD +p #U_,8LsBrjZD߅W- +ְ{r~=_X?À]2p +#ƎdX@/\_mƢq  cLLꇢ @ +R +oD<][+1Ǿܰ{" @ڽXLDp% @~8nH\_Kf +lO 𾸸{LQdL t+ +gʛzW @> #°{L (?f;~X & X~ +L + c{^D>ń5x'ڳN"="( 8n +H\YdDtUIiH +jnJ໪t}NSI2$ + µ{LnpFDe3Xݚ-*Ae -ZC$ѧFR5d8u?4Ҝ8D4)7Ļ 0XpN|I{)<{qX +솸OZH!" QcqU7v8ρNh + ŘKDp1뱟ٿ߉t<, Fq6'dE_ց [DpOQ/X!ԑ([Ra0Ɋ6kU6 XCDpg}:)nKT0adޗY-%:M" X޹[Dpߨ$D :Rc{ lL5u@ Jq80]BB&FB&W?|P $歘dp4%!8BYۦ@D T?Ai 8 '(CNޙRJVA8rrv[g2w88(s\"-2q"sZSni#vUG#[!X @q9 >49D)r !J ;Xip +eknhS @jfN > ʵ[Dp'߯#cP$)٠KҔEYL A.XkJqV%,(CivؙDw5EEE-)·F"D{LH֖-_D,S(}c I"X{p6Ӎ,`tO}PL3 9 , xINq$eqq/!- p( . J +pS +Žը`k[1`@"0 Z +p[dTa8 +y_&?z@gTõNxf 3 Xap_ rf3~ ??N -$v 5 !xypQ<@{di^ `. La 7yp''^]<J%G5F"; PbpB/Hbj~O'@!p$h-OϬс? >{L +(N +w`T=Rbȉ˯(.| +N B{ +L,r`:y+"ѽNRvcϑ- F PcL# 6 +."kDSON"H Px{Lh>s M2j#y^o\|OΓE + JЎ8{NLbՆ଻\iծi_^̷3zrU35)h M{N`Va֋`kwz0C)+ Q 8ip}Wh "VґQ=__e Kyu@"T PX[L pxѢX0Mҩm? +,H V `8zqCrA٠`Q"2ܨ O +28{pwoOmn6&"Q(X +[W ? !.XxpMG.YHɀps8XŽKa~"A 928BpfD'PIzS2؎03|c@l1ǵT D SLBV(o8 UC2W' F +"XYJqۍ}@1#iDM=`< ޚ~"7.Plqgܛ:|06'!u +, ; dpcD槜&TQNNX?|SC  = .0zqM)=%R4"E_ 0nJm~f6%=V;t` Y ODLH0=n>՛1[ze@xq"S X8KLI,lh_wۛR7ߩ5N\ + UXBpl@:<]8 o#i X 8KDpAn͍9R_f+"ɠ'& ZbqfnV7?VCҠ&q#`־` ] 8cJp=޿{50LF M JQM7\"` 98cDp|B74± +yÀP?sv cbpA\hck.TQG`N + g 8kDq{KO"w úZ@4ݎ5j^?>TF i 8bq)NLS +Hŗęo}77"kLcݲ|T>3Bg:?UߗS- opzp +8I>0˅-]&/O~~7L r 湘yp^vܫƠ/quxـm"ā 8bLTCi-SWߊ ]p-JlTj kb ĄLӠWk^0eŅڧTRO ć ƹap9tm.g +*3i$ȏ o ĉ Ƶ{Jp<6v" BP9 `'Y{OS#i"ċ X{LSQbDL8Af?ȏ9p^OTJi' LC Ď x{L4g8;>o5FzPp I2B6Y?!. ={Dp{qFG +ƺvkYWdf} @ cNL_~\=7ڤ5Z^Ϟ#tH Bp°{LP6@.PԽihcή;D[\,"G|NL L\'e| =႘F +݈;@g Lx{DpQծPJ +M#Y$ԧ ljPl,dύ O O(R"cts' +Ss68EWkϼo QL  .=:ցB `." Qő(gIWSjP!4IA`9USzFKP)֟'-D7 ֺ8KNpfmmWU CYx~" (ֺX4JpmB52 " cKV*,ޓQ/-EF  ־XJp:643C COR'fhMA&  ־XKPp֊$f2ZCt"1 X8[Dp&`|c ?#53rMS 3 OYE. ~ kp',Z\iMS˖!US)4I 6|Yˆl  0:&gKV|Q0R >wnKS@nW" PH{Np;9AXyAk84= T޳ݗW&[]-n L8|2yCxFp '0cDs`@A8nmT9yP~[~" + !\pMj(HZAKScmM +{}h5>`9|)Ps - 潘KDp +E%.H^6 ƕW0Ė / cLMYIPFƓ<_c^StZ;"1 XyDp.YxqsJ +1UQm+?րfs\i, 4XYp=jȧ? za h}@aӓ[$ 7 B{Jq6^IG 9 zp7EAOTL{JaT!r&";Bzq;^J]J]ShO$Ob+AGd`B%B"%3kƷt ?P{L2lwu F`ZTt&ujqc7@ = BHzp4oẀwt!jF 9A E jpw@7X KɎar+EDG"G X޶zpuO ;.E.AxfVNޯP>> IⰨ{Dr2g&Rxkh\.VmM/E{/go|^t MZpCdvdP DB>YMYW# E b QzpHf,a󟉟Pm-@6*\gqmu"Tjpq!~cF5'L$MȈg! +!/a6 X8ypMpc{ȘˀQ .1-. [[L>A:w ߣMi6 +$ Թ _ 8jpB:BͫՔW7+h0@PB +v"a +pڨ{ +p0>~)Gr态D:x#?&z _Bɘiq.lXu֮ ΗDR-o[ bڹXyp|BRh3!K86 ?\*A[% eִzp"p u,x⾪yvD#'"i !zpwu4gRu + 0[7BT lұXjp"^#HLndR@!FMe4PA oQOVn]2մ sDhesL(Iu!+2)MV¤ "9 PY8=ߟIs[Qs&i66zxq ;ྱXcLeTJh@u~,1rNaLUĹY > ¬kL}Է2x.qe +%EH ͳ|U @ ¨|L3jW=~;فU=?Wn~"C H|Dp}H' +-)r+:m E |phN~!mlrDHU5]-? G8\p܍KQU6Q[N 0} L °XfM`=IsUnź7`L H"N I +XYp;v~0@܍Gt@ۨC Dr P {JpZ>=BN{?W(~C~P5) R 8DqUHL|G?aoo;bk TpFGpr +^d?!_|wov~fp "W ֱ`{JpFBVɓ4M_4m(V +ǡ"6@JR ^HDpY=e0ohA9e$H4*ʂ2W b +YcqRgA0G28Gĩw%s("_ Q[Jq g*]Gi@U0ew8  a XJpDRVs; &(9v+zV\P.d}!Ƞ3u d !"8zpdoј[VEb6}6` +#Gg9 f x{Lqʫ{-eTDͨz}O;"h"^qGG~Ǧ}qrը9,ҠG߆D B !cDq߶0Q5@?X~_ӵG D8[Dqnߖ/ -NC(}OH0 G8[DpP +̂|MIڃΗC3A,ͥWp=jwq0ʍV(MT"H 0XIpl3cKf\.$%Bl?|엨 KXKJLK@L!.:gVً n NJDp[ɦmH.NJ΅Ѿ}[<[ Q XXKDpE*T z&h$@/ǔv+Q?GqP@"R Y*XKDqP +mEN"Fce$փAۛ. T XLp֍t3\3x'C|<̀#iPjNL@ V XJpR6@X}GʌI` +8 XXcDpk805KC.`'*S;\V/E1W"[ Y"Jp4D:Au(|QH",/73jmCt&Ȟh%d ] !PbqҤ=hbz}b5불`>\e9ܷv# _ptTER*;+8O`&u^;R$F :NL1,[/Y+K@e#6ߛ6 ?"=𮰸6 +L蕃u[1@':&89?ўF -xcL$QT-n6#rMT,&3L۾w8 2Q>^q +GrίA`Z-3E֠o, hX2Lw&/, rRHp壥䞐0yi"3JpnEZ$a⟠r\ˣl- 3LNG%u;* @Qө,r&Xn +0} {qZu&?XE걹&M  XJp\)ZcT-Gjf8?RP">PZDsTO Hjjyo7K_f+0M XP[L +;-p-|#dI!@!$ "Kqf|;[>Yo]&a"28o8  83Dp#^ĝ+-W/x|/MQxk" PXLgP +٭ +'zB C6fg.yR X2qC,qUi +cnb+B;;}<Հ]K_ XcJq+ + +Ԡ`Dگ5QO@b/#hW`.8 +D  XIplm‡y؀26vX" Y8ypmz`:r`@!Il{b}qAr^_ XIDp=6oC)0txtW"WO X>1U@ PXbpT{Q0ʏ|luviKkc|%<4`T ZXZ$ +w[ wT$~"0z`)_" @6Lம`/Y1=,i +i qhY8b|՟4 ؞X3LV{ΧPmfM` ,F㵹d/E +" AјKDpEL2< c)}|7O*OW*X 8KDpbu2(ND_09x RA@p B8[Dq"`6Rȃ%MSJg^.;A52zp 882p։ƜfYo(41~SUˆX" + 8P~L哥fMs.5Q b50eD +vX1Hr6oLC\Hzl46V  X2płl&oe)@3"$$4"0cmo ⹐Kq sSxbCǀJ4I.E7+w9  YI8׀&2~ޥI@ +.dqy3Hx~\"8+}=t$  >8}Nh}Y l6 +QƜuQJА >XKJq@J"H^U1j^;X-VkXP,  P3Jpi6TCh]M4}bK7YQgȀ@X8{d" Y>KqdotXEr=?ѿ@=vKWA@@* ѐ1LVNҗsܿWVodc߷ +BZ  PcDp)-Ṗ9UP%[۠t(D fX*X('iQjۅ&2d^W}1H`!" +8Ap^wVcimY>9T~9!O +  +ֽxcp +ܝ +B:\Jf"hc1,:H 9A  KL\[ͥ}qgzjATmW}妺@p Hո3Dp;e +GՒ/ڷՇ4p" +8JpY"sӕM^noz +mg.mU V  !.cq0j";Nw[Ͳ =՗^'p ŸCJp2|rk_I}m*[ր)c- CL!c1LD+j_?$]@l3" @3Np2dStrLԏ(1 ;>?걦b@hx  X3DpRLGЗ%&VIE_b0@䑮 X3JpT#Gu7'uקX .z";]2XL  ҵ5p?^ +~V G=UX" Kp'\/{.Hbu_29 + HɐKL5]q&ش| 1#npƻXyN X{LGbƞ!=w>r[tp/`Ə+ + {LXA *YVq)=S]E'+Lp23Q" cL!lԣιٔűp)4kԂŁ  >{qCPqoHjKu5}ժSR(7 + x^NMUԯ#IS_q[boܧ +@P 8^L\l.ALGM57>L@@~7" + PµpNL;j,_!;u"X<F[s!!0 r4R;%  +CNb8`KL0#Ɠq"0;`:00c + KJpj &7__􀩲0.ɗM  bpq $/I.W*U܀볃 vzDK " @xKNpPH{myޯ(O^jBIV %A*  XJp<s?|u@ r:fϪY]k@  µKL; +svOӔh{TIP+R$Q_ ¹xLL +v\zPLo*$mŴʽ;" @xKDpRiW[n(,ݗl1t +Mm6  KN$ow1 YޑDkJ0 +r.z "ت~L`L>\HgR`zN!0yN*3q % °{L GՊh{6{ppˣvſL"' (8{L3nc 3 +_8E`b=>-  * {LDb6SkTRDL +J]}CV2ސ[ , P~Lbmz_sV!J; 4&m . x{L8s;'RSQ77)`b +\"1 PP~L2hFbx]J7ݰa +&"\- 3^60)X2ጼڥy^ +9ReG1 6{Lh{3zxyr![Tyu0ݫi ) :PfN+VhSoѮNWEZ)#V] 6_ >ȖcL#gMNksKͪtlhaYYȢ"AcNOsq?Q eU'Jq禓kx߯A0M&;>Lū0 F থ3L3v8OM̙}LKekp߂Ѣ EতX^L&*0 C(z@E#+ H(fDL%d=mM"09Zg  ^<,=o"L (NLP6r#V +VN802ɟEh[5 O pL^n=TXNqf?$Bq G zp<9/228A* BYPW?W> Izp1o؞Unk3?.?t$hL"L bp2i2S17 +]i^ ?оKLSOFRj_6d@*G!|V v!X`"B QbqHD dmNԏ@jy0BEB[{ D NPLe yݶx"d +;z31 :3H&lkwyH"2R˭Aۛ9|Fg >K&HJ +z@,^4@gۍaKue +"BЎ6LSxFn{P\W/?lKY9'<>@-#J Fڜpp͹`'Lr|DQSXX9/M @ 2Ő{Jp'*H|;zT l'?V 5 ڽpzpιϣ/7uGuI+F6w :"7cLsC5[CW*)oʈ2@ < 8֭xcq¤P%MuX;`o( Ţъ2 2 83Dp˖(`«?ķY @XzLf[^mP@a(:gP&D99-avݜ @ XzJL|oJ}`6^p֗VMykQKC@"B XL{Y}>3ޘy4FV&` D +q  M"NzGO@>9  aU8h,+ 4 JdHunY9cWej*rCo(Ϊ&.rĄ 6f(3(tCT]i~̟!(!="9 @xKLfFNwAv0^)L_ < ־XJp ]peg\V}Lfߠj0 > p֩~p2YZ$K@u +>AA|-N2e= a 3XbqAI0GbB~KVi`uX:x'Ga"6 XڬpCg|U"?G?(@ >$`@}4"gCsISn 8 8{L +03Xubmwo}:=BN]_ : Ȏ(~ L3`ΰʟ@,N$@#1E 9V83$U-F/5oXn9Iޚs_Ns"=ֺXKDp` + &'TNEfo̳M^Qxu2 AX3LMB'eWZK굈O(y`%,"( D 楐NpSq}>]x[&˜$0ҫ 8ⱸKJqi޴B,/pb=8&HiIYZ'T ;⭸cDq3ursc 15O@CQbOKR7T"> X⩸KDq,6Laf~TVF (]b5C @B~qD,@AF 6K:]_' >XJqȕZC{,p8_Szx' " ֱKDpK @4yd>ǧުUNK1ɳ"$ 0Ÿ2pp%ci( s͋!50֦o-. 'iB{qs{乤SܟYխ5fkPX|/8a9f  0cLNЅ<r.B]wIz~e?`9P<  {LЅ"e(#E3֛0̵:?GI-@Za" @°KL +ۆ Zޭ)^7ko~dTT ZFq/eGf&P>l]D)I? X3 +LX'=_e\nE&XAlXʖX r[JZ8K<89A5lj" + 3L"\F:^;|j]S̀H9 R6 + CLQxm'CvD9)DLgpx#FG̽{kT$5 q~8) I" 8OCd~Gk8.QkF!jl$) M<. PbNno9 P!+jifgFRKHn<ϓр`? Ȫ8NLH?IiP!Zgl :MGu -LA ^Xk0(M]Y6n +<ãLեI` +qt8ĥ  +fLQ"NeTCBPt}.J LNpUP*UvWn7RD\|V]" XKNp8V^'vBYe9 XPKLi>' +*5}`mJ@`FBXR:?  +XXJpCÍ3?Я-!a@M < =  ¹KL +'ix>@{}@(,~0ui$w"NL}7IƩdX4DqE}¿p`pT`iY%LԺ7  ֠fp s3$8ku\Dܐ~EZ=|i" X{DpО Fݬ(EףC{0&yF#S*  {Jq4(Ё]=EԼ~Qע2^~V  ¬~NL轥`(ж@ -B7M"'f *  8KJpUQcUt'XZR% +ULY" 0cLpd4lC6!xLrw4zU<;V  ¨{L3o# {Szp+,J@|Ʒ/m m x[JpZ@è?m_ " xzpi oWesP" 0/fr+[G $ +8ڬX|PpU;=0y"i>` R5n0չCqG " Hڤ(}p遭oA#&р=Ql[`ݝAb+l ڵdprZ +>W@u< Ac3  +ؒ(~LLM񾃬q8L ;}+1rŰ=Zxy ʹ|Dp)j0N&Թd[O&PPCCv" ʽcDp-[BҀ-!L禠C.IN ʹ\pHvtX >x)ช)ȭF4Ǧ0;Hc  8(~L"81@_4rڡ ɚZGV[ !X3Jp(KN0\Kᾒl +&N8ۿ"% @XfLð7jFr)Tm=ڞF cQ?@s+ ( ~LHa?pQ Mw8p܅[r;~^:.64BÎ * p~L`57wЇ ׀WTn %<Îo #ত(~ +Lp-h K84 +(}~VQ ^}"& X֭cDpPk`t7x*G+P+wҀ (xKLMBygU內-^bَ~$<vL + 6 NlѶL#"y +Zke+\nQ_Mn + XKDpqnXabLa AKf/jg@~ ". (֨xMp㦣%%3}<ӉXi"S 1 ںX3Dp$D$NU=~ "C]OU 4 XLplE䭆͔Js9D5Qf[%#` ( XNL@%w^ZfFN5OifAv@P8"* Hβxdp<Pi:O9H^jub_{4q , ʠKDpi%PVd6._46*5W> +G n . کdpuۃ)tF!T {wۣԟG (6VLVy)חYQZqN]If)-֮#", 8NL +QRۦVؓ.WWKT.0pF?( /xKL)!P, ^LAp +]z(Z=u17FQw? 2 Xp݀&t9X aL[ ~ B) ) !>XJq@+-[NɴqhI3jN]"+ IKDpB#^!R"<-OAh7΍dI" - hLDp> <LnU +m'd֜3>@% / ڱ4Jq@-y΍MQ%uB :?*0r@ . ұdNpWeM8J/g.D̯nB@P8"1 XPNLG: 0aOՑAd [ԡ 3 XL螕[y~C  ]QF:g,fd 5蒭NL@\3 RMA$  PijE!8 8 ʱKDpGnB@+שJw.C NN)Ƴc`%`": 8x6JH?֋z@`&!0-jSa'(5 =ʐ(dp5SVXq> +`:S2Hɋ @ NNH`ɧq` hm B0spc@<Lq[u72 B !X3DqP]ԯNG6N&C`y:8afC"| 0xNL*Srj7˩2Bk(EeN X3Jqs=&CR =e?."fr d>} ĂҚXKDp3=U?6 )"Nddw ąt(NL3@}_` %EHZf>`3_ĂKx"ĉ 0l(~L:|Nz>s(/5J["RE"E&v` Č ځLp?+P>(0Q P"6) .n ̚]9 Ď uLpʖ,DQ HTbu&II~q`JWt+ Đ ҁLp4 &faQҳp܀C`J]h}8"{R"ē}4NpcE +f'p5ogo2 gX W ė ց4pһsql@ +oD湟z AB* ę hMqVլNLy( ?0 ZVk Ĝ qMq _PI5&󈿧/@ r^0pXGE"Ğ֊XKJp}D naIzF=~z+ +Ki=*;b Ģ `fq vbǺkLC~|۷Zi*C Ĥ`fNqiV%,:P^"0rA^ Q[m{ ĨdMq?}*R&0} `Cm+[QXтm"ī @`(eqζ\cF~SϫZL uhzNl[ Į\fL#Mf+\v<4B/X,: k ı\fL4&{?9$]It9,P]fd4 Ĵ|NN&\#iSeDu -<\sTWb"ĸ X~ZLIGoe?u{zsas|_'"% ħОxfNMX<0ao/"Cbaƅ1kIRe)Su ĪxLL38񡟃I.|'Ptk-R ĭ N +L +1wi_HLvƭn(@whaS="į ֑KDp\BK[($A=eD$r! IJ yNNLjl\3wJ(5n:6 ĴdNLb@L@=/erm +'v>] ķ֊XLpgE@ah4T<'4* +~bp +Kh"ĺ h}qIcL @@/ $46ڟB ĽО|N L`'"0}e ƪ: +iIֵ80 +ВNPMl(P@d!fj! p ~@h ĻؒX6 +Ll-GeqH% "Z4 +PPZ"ľ ڙ4pTL"" /SB_`B!X րPMq",| k{El o4 ֞XKJq%*p@Q9: +RY +~/f ڒX5 +piDXC!*̀\4lH@GJiݰ" H҉4p؅oWLԉ,)4o:m\27JfK ږX4p"8`Ġ +D(!ete<ŷ ֊X4qvvbP :< LHSˑ9Å= aX p@@OgGJm.Wk/ IJXNL e3 +Z>a#ʮ:/"O"Ķ XƑLp*힮n+P#/u%.gV ĸxNNL8҃-+unVyq(~( ļ NJH +!чæD .I;k]VP- ľ ʍLpH]FO@7ă)[,)2Et" 8xNL3xt+$GF 芅6L;b@ұoK P( +&[hG hXNH|j^[ւJ~6PZq\E#Y7x ƢX3DpKi;(P\ [`Xـ0gvӟ@ U +"x~qõ&z - +@XGC.g īҲX4poҐoL (:O7oO + ĮВPNZLQxW\ŧ*'N3U;fu ı ڢXLp7Mr  +aNM r괝?M駢"ij Xڙ5p7 #P4cand +C)l~?ֻ ĵ֢X4p@"`JLo[ Eo@]` ĸҢX4p"5t,(,P?b Cvf6%޲k# ļ tNq:v%\i׺r| _bԲ C"ľ PڒXp'Q  IClb{@ +E-:tv ֒XKNpudkSZF ++PM 6F(( څMp7Fb$\?GRWJ@ R-" p4qƍt[k0g4A_eM˰&@Ol" 8چXdp-x Ry7%to* 32ʱDiL.ET8 ֎XKNp@ jOizQ*dx:"= օLp 98ŇSHKp-}姯W h(Lp1 0a'zjRNe@gRz /" h(pL*P4PcP "_GX( qLp+`I̱Щ!HzI2驷k. dMplSN |j#Keg%:& d(LpP_֠x5fv4A2p"4 +h2@;m" ddp^ˀ@HF%@p;0̓J H\NL; +Y +םMK@X=YTZ +~XLqa9@ +&y)mu"4fEj@"wF x}LpCTWMYّ̩#r`3?BqZ +u" ~X4p_  ƅ&>ENM.h. +mMpt`!HRŁjb7Ur%KpǼT h5qO1*@fZ5 8]uV?# +XqMpCXcm" +ܩd0 XX8%" +i5pJ1_ڀ8@ %?`;)ya?hl XMqH <( $Ez +j r9H"T T~qe}Gàh[i_vQjN`~X4VAhk35 T~qk + Tr_i)g|NcOJ}2L" jXM +pbVh+da0DHڴq@{2j nXLp?tq}0*ctŒ =. i5p@))WԐMYyPH:ٔ讪 +XTNpVq{*7B-D2&X\2M%Aŋ" P~Lޛm@qql7h\`k~gwv!/t1 +@TfZL2w4 hs(Y4Ghu34- +K׬=J XP]pN/On@ ͜@Zd"\f?q `LbL-%'0|R&& h1l(NډDҏɥ ]|p:]DU˫ <Au&,7Rх~_" +lN/~zdzx +;M!g7/wK'%>s +l~PLcm<ghY!dx> {ޓҰ |x4pYb`s ݘAX CdEn& hN}2p$  QV!ྒྷoD_ _" +PhxM +pњH `ڱgf~W0*C1.n(!6vM3G? nmNN(kQ_6n]j +`"&̫ mTCzt X{MhM GĒM7,a['Ƕe" xfL%/^?fl8P*L-W_ xNNL755FI ǂ$"dkgd`/ ؒ|xfL0c @R/ @ + +\bt4ٿH3o ؒlfLE8 +837}\1Eu`z" +pPfrV'U])>V*"$<zs뚡# +d(fq@۝ׄ‡&Ȁ d &if%9I hPfq& +ܭV]@,A˃jKPyG25w# xuM +pKn'0J`BNnr!$I2mD hhPMNq +_P5Ek@T" +hxNJp 7| -haSO]$$hZ)M~.t l~L(l.9,TJ"D{~J2}; І6 +H "zc$YCã3OײNu xPNL'Ď747.͉^鿶" ʀxLpXB* OѬGP\ADPD@~ Ɓ5p_,@Bn"EFnه\گ.S &[Ё VyJr$r{ "4@3Z!=;  +}MpM +/։XL Le%Hzg33&fJ6B`" dPfLH4L (I']? `(fLGq" Fp>8 1h5: ʞXcDp`B 'jr8|b+mU ؎NJLmޠ`-t%zyԎ X*^Gwo" 8ҍ5 +p:Qr+tO`:m"?jѨ+ p(fLƀ? .q3 !)s'J@ +a}M +qc\L#!&YHQM$- +y+? L `xMs$lau}@Bܓ˧hXw" +qMpJxUC@OPNc t(8a%ȫ +uMpP'a4 Vsqp[>|0|L{ɀ y4Dpɀ I[2#v3H*0 +'1}fj!i }L}߰,aƜBQeњڃX 96 u" x~ZHɫ',yٹ +>gZY̻z7 xPfL?`p`!ZMc }; 6|pÉ +Mcfz h|PMsfA?:-L[pJ=wht#&R5 pPNTH:i_B b˖T'ר4" +! +}MqZL{0(A9ZٿMǍ_n +)  lPfLwFh}-X[W +@^ 1oq pNLfT@-Dԏ/倀}cl*4?5)M +hNL*sQ~cVNc@@0Z^ay/Ի+"ڎX~p`Hx@ Af nDȀfNexA NMӿLc~H8"D^M5`,D ; 6LQy, fRV^.R}\&4 ڞXLp*0#8jhxxdȲ嘅 +{j"pNLJa$8+y䃁b`i %jX2 Ў(NTLoF˯d8%#>1#ê`D ֍M +p;3~aWPx4A*S(4Z ցMqC[Kg/&ش q6IE&" +x֒X5p?U0@ۗtY~x?MN + ڢX{p G!Ѝ< a0jq`) %6 ڢXLp@L(^Dw^E ڕLpt@U eB F_7 c] +$ܾoJ" HڑepOz3 L<֨Fݜȯs |Pepdc\PDg;)lߊ˱< Α\pD +B@v6bfBg*i5k  +5 ʊXM +p{ +Ԡ3h`4 JE(~@ +d*ԥyto" +p}4p^QPy*UH'ձV<5f}9պ))yń5 ƉMqƍ,7.iR +PNL_զq',(XЁUTP0(Hn XNJL/@W`I"ĐEӋv&} PfPLJG  lFR2@e  " +yx" +aMTqpѕ@-9Q-썹yadQ@^cҕ~ tfL'gq*XOӸU!{};@H L烙` C!o􅠺? 1Ne0qa@UP":36=D5}7o/ ě |qop +ѦzjX\J5_‚O ē ! +5qp` HBN' icFb@"ĕ QLqy}0l-! Y X0En[o#(7 ė  +X4pN3bi +'L$ Ğ ΦXLpI7ëZ,=Yi +P4Ӻ`A Ġ +X4NpjN1#_:~uOW@!NP ĢXL " v +ڢ"\I,#@"Ħ +KLx*hF"ҿNQ`@!fH ĥ +~pϊ#5:MW^ +}@5 "1? ġ xIp +5+@'*TЧ`0#Z"SHy ģ֙3Jp߄PbP?8wlJ'"Ħ YHLp5?]e28{K>) ͼDC@m-I Ĩ ֪x3Dp_Vµ&v& gc]  Ī ֚84 +pL|.pYR/ _܈տQ0Z&bS Ĭ֞P4Jpɤ!B˻zۤ{^ տQ?hc-F "İ XL(@ +?(-``~ Ĵ 6LLB/a EAt 1֌6"Ķ @XpR}Ȣp{2K/HHF3 ĹX{px&C_LG 00Sd ġ !3NqqYVwzhp?`t[?P@СP|ێ ģ4p!DD6C}j?t#g† k>"Ħ )XLDp^εc?E'QPkڀZm,# +1Ypl= ĩ 4q|1+*uG +hAL.HȳŅkKoY īvX6 +Ht;zi + 6iϜ*bi5Xl; Į XKDpxbE:ǪÎ +eJ"İX,p!F[SػGP(!/zVU6 ĴXJq~Gr?0jdVǚXX=0:k`m ķ +@p$>R sMBJ .s/~)ٽF ĵJpg*ȍ ĽxZDp%>4]9x}qe?oÒp)8{ Ip8BT!FXqG7@B~d +( {L఍FͶܓQzZ r Dy8t>< +" 0X{L9tf=nmrv9񲗸=wJ v5 ޤXzpAn%'@P2†5Z " {LڮBy~e-%X +dzⱝxwhzc  xJFLľ.m@ `xz|@0's"IpRc7"1.o$9?J_Ȁɜ XZpWF@cL5,/<1T`ڐaӨ퀆iE8 ֨xbq^qTKJ84Kpì]kv +x0*3' µILfod8 +Q8[t/," 8{LrlʅLm\=cjHze?Vg ¨xzJL5ˆ+zq@IoUm ({NF +9TҾHU68D QON:άo Xb +LrY7 +TQ;, +8 +s" +Lcʀ@-EtCT{ F d}X ~B~V `X{ +L }` @ h^x)58Qա> Ȓ{N&C9p@9Luȏ y*\hޘd0EGK +­zDLy@`'d314=j)~t8 W7 xx{LQHIٗv5.H[saP\ݟ AdT)" +@L `5ڬ] +3$M-fphaByG3h\:xD.M&0dw~I" +@{L{:;rQ2-+/*^`-ϽCQ9>4"İ c +LN7 ,RX(jLAxti ij "xypX9dԪnpI_! ؀#?obd ĵ8yJLwqF%y<]弣%P Jˁ Ĺ zq!@]9wFe7> mZOs ra7@t"Ļ¤{NY4Q*$h@:8tq# ĿBPzsE2j>ή/oO9ܷ0d& ħ ({Np ޗ(w{묄 T(iD! F ħְ@KNp{Q(5D g X"&x>x1z4*yt ĪPKDpvڦCd՞無I +!xRQZ:VzQ"Į QJp{Y/\\yM0;.ozjN İJpsvD%-I"@|?IV1YwO ^<ڐw Ĵ֬8cJpe0=RgVT,X<-~׫ ķ ֨X{Dpk`򏷢Q fƙ#ì~ǣEu>"Ĺ ֜|Jr1+iљX彉#mAjQ=:>0 ļ cLYQ"ίIgΤ{u } ľ~LWB]\ (ХC淋 +ɀ=@\ XJp-ۃ3*q@.Yo7MrhnEE"!,@" PX{LP'Z 塉v]@is.  +{Dq(2^Ꝧ59;$0^H9& X{DpvݞfAO.AY ޜe2u"k2#V 8cDp7L]q4xvn'+p5+H2zx +P\R" +8cDq3QԪ7ߺ"}I/([S0 0{LWBNs0 ~HpU٨T= +.v"J;  +Xap쑾X- +Ά*6ۥbc=Hj) ZLD};n,|k[8h25SM " {L4 +ԝF? *EaV^ f6, KHx&{Ѐ+j)Hݙ1a'G^) H' {Hj3jjĖh +H48{m/ ʾXap:޾ +lûf#p爡ލ67" {L"޿" !'(IDrꫜIyȇ+A a +yp[%OJ2D~a +n(gO { +Lή@"&['xJ;Cd<'P/VE 8zpչ +ק#aIA.tzDb[  ֭X{Jp@ +eq]F&& 5x~ ڱzp0pb TYI [" +:Xzqwl`n%_"#1󻉂>6Gj ⽘ypzD853"g֩LB5W! :yqp}B`?:\wdhУ>:V/<&I +!>Xʊq'sBx"H ]| E!([\:: `oC" :XqXΰ|A'45毝m[,{jGA 8| +L17owp}95 ]fi ʄpK;9?lLP +wdN,( pUrkVG-`*0(;Y`"9FĐqo?Qׯ?cKS03A. #@Ǚ Jp6fJ7_R_@*ԸBUzz Ȟ ~Nt꾹3 M+%q RG4j\F 覨~L7@ +}pQÉ +7i=[1 bj3Nnl" X֩Dp?P @5^HrYlJ 뮮q XypN7ŀƨ5"b$SMnI!K< ֭p{DpM|Ph\z"B26Z%Y7 ֺX{Dp>DO $'22AD%3Mo:Ēr2" +@zph%@yR.Lmp@ѡeٕι+uk? !{Jq*S1jO{tĄubԊ}UR x|Dp_C#Li|DpI6%Gˏ ⽸{Dp}b +ODiBU!3()e:d߼v! X|q GrUTt9){3Nr?zyHE " +xcDpY"'Ho1.\Xv׸ՋP}] X{DpcVyd| +/U4އ +9pp @x=_gw$)5Z8 + `֤XcDp{ kP )Mڈ\3?R&?<)" +X|p`~ ٱrC@(`|ƂD2ʶ ~L@PXL9!F󪁍~ +a)6#YILZ த{Lz8X Dsag$3wOR_&Ԛy XZq +C +sdb'mhJj? +i&u" +Ix{JqUA\yed9[n + Xp. -o +uKam32ćT6yެ_ݿ yq`Voj@\zl4 +ϯ)N; +x{Dq9Z/fR8迈q<4 0fo8R~" +ޘ8{DpFw[pð>QW6q0j P8zpU2)rULNdwe+[R + +Nq>M +Q%"g3!? 8Dp Sڦu2?k#Q{]50u" 8zpSpLʙl5!Gr?u"F ֬x{p?*%kav/!+hH"DǓZ~jz ڱzp(ρ^ƈ6\ځ4EC#Jv_ ڨyp~ @KldoRo2@E]k" H֬zpu5Q`V(V0xP}? ֬yJp aCn>UC +k["L߿ +XҡXNpy>>t*N-Q8Ry@%O/f& ֜NrA=ᰠfyy&6߀~/QFFUۛ/" +ڤ{JpP VrN#Axp7  RE_ET[ `ڵ{pmX(&CΔ5h2VOSUu|+Pu Dp9 +/ /f"Sǎ|Q.VWr0 ~DL񻰡9 %q[ѩ" +a"|DpQޢl7Ճ@(60;$ : +£FH;h ڲXdpg'W:E\u @8S?} +֜x|p)S ox#FUH FRV کdJp; $: ʈfPp " 8c&Z.d5d+I;Q ʡLp_@ +TJn@7`hOP]t" ΙLp_]Jo aYOE!6vi)~y +(eqTl'䋀 l@R8Kh@6 Lq{Z_EPRz'0#0?#QE+MS> +M +qj&@M%OjfhV$ v{" +ʉLp!VYU`2H+nA!EnYEBJTO ʑMpk4?p.Qn\[<7ҹ] +HΑp~Pp,iR_p`ZFz,^ +AԵd@˟A X3DpsdJ弐OyXɀ%⸎ +h ʡ5p_(ahmQX6"ն xKDqN + h e@v".TVs ֡DpV}@p`c-(-s" 8NL;($hh pU DK GM ڌ~Ppw8 x_gY&̙ܣJ LNp}LpKcXAi%4L=2%]% ~| 3Jp%(X n-2=MU),TzK" Y4pg/&CB!Z-pk4\P 'P P3JpLu `V~GVq]- +֙KPpˬ@h.KuA4{ $Z/q ֮CJp|R'&;PTrORI4 <07"" 3L ]|sj6oNh %n\S$ >8fqDp+_ޣ,8†ְͭzfiD|  +84DphP\|F@^`yPKm X6 +Lw7gP\D5)c1onV5" 0™PNLV_cNǎwV0B4&`%GqX@ DpL|[V }[hg$7=iX оXLJLmH~|Gz@@&ĢFc2. 6 +H6H @0 $×X2." (²X3L@!zOހ1Qf(i|mS ~q֐j`=ncc< +yTw&+jd 4qBA+ u 8 xC|È(SúHx} KDp_$TP8 +`Hխra0׹ }U" QE +qro4}pրp}r%Z@j6O\7 !4pQ7LMʱt&)M! !Lq+hYt(9g + (Б0)@ X4Dpm+|n9D2[PeTy"cE| +~1" @83DpmA#.yD֣O؆6X:? +NL+? +@"TEr!4*QJCyMw Xap) +B)~&-@8d! X{DpQ~OCUrf؂PI ^c}^r7# xcL=:EߺgG (!p= k|3p 8Lц ;ZG(ڨzFa@" ڠX{Jp7fL@JBRJ#3LL`@-*w +5ҢMṽ5 xDpsfj" pZIY?W. 1%B8 X{Dp'}%!0~'+J LRe œXL8Zha"C|_ˀhc^{l%!|" P{L'@mE  ۰G[N@ 6  px{L@# Dc?m5G%!҈W xPpW},Ĉ@\n1:Qxuh-Qs֙~ 8zDL''jT6.  Q=x9X{4a" HzpqOȵ +p.j\Q>@V v{Hg}~CA6@Cp\1&5iig P +LЋn?B;z|3URvfb9po ЮzL7jh'rX]P@"}?d" H{Dpoxv +o$dTYPRx3-{ Hzp_ K1\GeP%'xnf@Ɖ apd 楰 +V+|`CtG? ֹPzr70")P$$%2V,̈&?یPq=" ڹyp'WF(@q,]&\_fj-f15o B8Yq}> `th0evgG QR ֩H{Np}y WS\@XP/>&mXKW% ک{Jpuj@H`x_ +=y_ʖ;~Q" >J +q#N!@>+E2)WD}'좱r +8zpy0@/ lC*D^P +i +w[# Xypn ע(#QP_*߮[ + {LbEIN]^VjI[" PXIpy@jcNql|(- OA,ĠN@49G_UYZ ֬({JpZVuL*p!0DR(d1uw7G bp9PyjcZmCl0=uzw$ (q)" AP{Npڿ8hHT\!F᪉V"˗ۉ XKDph׿@Jl-7s)c5OW" X[L9R@kY 4ct.)KPt ({H V12Mmȩ;^o>-Ѹ ֠{Dp][P`x ,=}R<`ЇBo 8{Dp, +$;a>R s'Z~lS߷O" +֘Ąpj~@^Wr9(1Por/tT/F6 {L=Ue C\ 6 0! ˆH +!X{Dp +Z* +hp+X ٽ#V$-  +{qI&0 f,%;z/~ۑPqڲTV" +@X{LLw$ +LXq|!EZn(5mAT1J 0{q_ *R_#N&~cމ<7Z ȆX{HȾ`'#Raq#+$JȅuC*F cLo~ +\d<eеˆmħ=^o" +ʠxp.@2݌X9[4d%Y.`^n~ P{L@ތ$ , pe`=^H7 +X{HRzgf4ըfH- ±Ӊz<^+ cLh +o;U* lT|Lg{Ju>U" +`Jph7r_3zuV'*Y3pH%"Üm ^x ֵxyp@b<=YTg;eKC ں8apL C51D~8!f;ZMl@Φ" +IBxyqkO\ 8 (@YĚ+ 9ܷz pֵPyr4|& Bdy|7 +'F-_M +Q +rO;䍡X$'F!(&+||9?hG {Jp$1!&WqGhu(|٣E:" y{pFxZKd ޫ~h0 !xcDq~a.N6%$g8AC7@0 ޺8KDpFNT P(%(uolIGI.2%ڰm\oռ ֭xbpgMO@ ov8TLDrA" +ֺ8JpqjzB傸0ңI}'+ pQ;Ё*RWۏ6?+qˊZ/ +>B Ipܩox ZkD> @H% 7gK*@G +xbJp5A%H◇2YHL;ޟ" PxJJpOƀ<vn!!Y +꩘Jp"=r*XKJ_"/.g ! +xIp!pBT%#@6 +`R%j#g4 K "xbp >C7](Hp> Iq?9`t[đVk + )ulzW/V" Xbq@kXSDsH3h.B<#Z[V@C +YxzJp+}`>"R)lqԲE +c1 +1۽Z¿ x{ +Lխ+Bʬ*@ʋE9_X3636>/|w +yzp2$khFKig>X̮kٞcz" xzpnH'д&S<$ +e Dkj XzJp@@K'q`M3cHT_7{_ou + 8zp* +Hk(d[l`Dxp d +O ˜LJA@"@#JA ";~xe5u94ߤ7,С a8zql\Vog~=_~`"Fu+ + L \HFzSF? I6 .x"Bx{q#Q&ui4f๛+o@ gX !cJp ƫ7mFL[%WL%BBU8b$g @{Jp+*d9⮲]մ?퍀(bn,/C +)>(X !{JpřtNFV% .$s[bx" AXcDp +ID ++ahbGԪעz?o zpb*lh +q0X׵)GoL ЦP{L@`2H(,"4S4 {L (=.9@C_ަߗ_o(R0,"ABX~q\C!Dh>[@Օ?KJ Ľ3Jqg'PiٚOar @)SOfV ޺XJp;p|MkPh5p鼀 ɚ0VBu A+Э >LqUE) +gϜ1j`{" LpSOIW-*-RhZ1 KDp:Yо ~0`,ς,xآ>> Q(,6| Șq;.pVEd&L#p hs熊M`0C>( 8dgA +"Ē `8Zs @ (mI6A\Z_ Č LNLt0ۑ:р-K5^\O@-+yS ϬL +L G6 ȝVTJ}5EZ^ đ LL#& E;i8t5O2"5 +R 0"ē P¡XNNL/Jy/_~67[lHUWfgQCUxhy3Bpg ĕXKDp͍A1Ni,kv"@Z ęXKDpڠl>R1)V_ Ĝ¡T8gwP0`0(]1Og\ $ I5"ğ|Ԟ#HZt0&-9fdz}ol eY8_wH ՐlhTN&h!ىHm| hֽKJp~`a킯>$xOu7. kX|pN @F ^- ¤M7_3N!v"n XֱcNpan +$gdQ69\M)z?tW#:@ pX\ +q +!/+^CZ8dQ)}-&A@@+ s8KL +oX-v$d >+Q@b@? w XLDLࣵ82 ZMK'@  y ڲ8cDp #I)Y{穰C +K'"{ P֩|JpyɰAl)+`/c3 } ֲXbp.DA< | ++M\w FOzb F ֶ8cJp9PBɣ%_Wx#dV4r#;$|a Ă ֶbp۲Ǖʝ%gK@DJP g'ly~"Ą X֩cJp>VH #~5N \/)37c{! Ć XIqRoX p&Bt(Aj.aMx~ ĉڶXINpnTWU( HJJN č֮XZp}`s@˚)"R V?} Ofh ė DL;z:P̵~z?Xj#H ę 8{LE W'P> 50(G*?ݬn#îk+N"ě X{Lhlt4]A֡~u;el}vdk3 ĞXzL'.k5#~Y/vPb? her ġʮ{DpǓ +fIK (3+Eb, ĤpbK*`lɈvX'}*D0k+O"ĩ ֜ q`/d'^,'6%C:;\>2m ģzDpa0wfoo7t_ w Ħ Һ8{JpЬBWԟ|8 bgt.sq Ĩ ְ{DpA`mm<=.,kA %/"ĪXKDp1$F`qBR\4,0TZ8F\6ZS Įyp]72(Ҡ8l ı8{Dp> +L?u127,-bs ĴO8n_6RLmg+i Ep4"ķ@ +ͨGY (rX?e2L3v p 928ڷ@tdRbIr r__\*_H;ط j X{JpdL`g9S(=C06V`X]_K}_\ l X3LWB$mPe9@y~-__p"oKL36F +Yq胫ӷտ8H=` s.cNqDf#[{eD`0=a734lC v !.{DqMIeB˙0r&ح>X 7( ]FS x.XKNqػgп +ᩤ  =Op6ka(M7"{.8|VqT\ GTGH^"E|W c 83DpR~ H +D5đ߰H,AK~ fڹXdp +P]@9q`'ɠT˩l\WQ) iֹX4pY+IyT3jaMX +Tk"l )8cDpAz_2eT wBz o־X4pKԉAE LεcAp!(] s .[Jqf0NcWBnD`FHTs1 u *X4qyT"Y!dqXco{VPt`6zȦG"w 8XIp%|>$eVO.WEGfލ[DjSI704 zAFl0s[iU`Pg"(Ó502eϏf] $ ֽXLppml15YR ̸Pz`NJ; & XKL@hI*ˠOz5<#ZSӡںB8m"(¸KNt惐8`l͇q}/?Ezqp-!` -LpOR.znGͭ?Azk..}աiT6yV 0°cL8+rrFպi H/z`᜖ׄk/ 3 X{L_tҴ珣SQڭ@ ຣha 5¬0~ +LL ͐ގWVq*}@b7(w^l("8 X8dDpw~3j[5,gOyh2,u :¬0cN^rg>x1 ]rhA?&Oؘi24JYYw/ >¬(~Nʿtjb +;oH=XʫB# B °f +L:~ U07$6֎,!WguO?Y2"E HX{L۷ `)$DR2[j{ʕr +O7 Gؾ{L+QdbJ$9:0فsO= J 8{Jpd>g*]  5"aj1| L {L ,f[GjQ'd"N P {Ln Bj{)ϦBp#FޠY@[2 PZp.@Lpv0r8lHn:#7W騁_| S ¨[Lt/z& +?A +#- +W U xzDLj}4}нo2aR%A`Lr] U"X ¬{ +LW0;w.^;`@`3a`} ; [xapxwVQA #b6LCDC ` x{ +LB=ntBeO`s$l,X.!)Z b iDp2M9N6 + )ʡBJ bf "d zDLzƎ>?M\ߚfxDj.2EÂP| g ({L7k|H9{4k i qG DR"HhVÞi⼯XG k  +Dpִ)[s,8xv菷Ld ծ{?"{ +p>0p"ksU5L} +hk  +qH9 +ƃc oW@ oXzq 8Pic`ʯ~QOwaL6 +'x r8|Dp&,pFSFvoV@ 6-$"v Q{Dp̖ޘ\{~+-o@P5_VkCAdL x8|L B.=NL&Y*_5#Q77\* | +8zp>N4M5`oԿ 9O O^mfb3u@?h4uݶz"ăLA@q>Dh]&+g I !Yx>?l87P(2Ÿ3U:z KLLpSF Rֵ{DpX䊒6?q7| ?5vn}@C \@* V83Lg&|W8lv._Uv*e Y ­p{L 6x0-m5y>`"[ ¨{Lhԁ>BN(M2_/`L ^ {pT#jFǨ9ϵ=?2= J!z% V cJp)R`z4/{\7#.j#t XXCDpLdKRE}-g(`2&<*j"[ Xɸbp(E ( +)n+0brz24m$ ] PKJq*E +~%WQXޠ0.Nj1K1H> _ vfHyWOo0^ +)x'+(#f6Ԡ axZp7;?f"h" +.L` +M[\ŻПE dxdqWmȞxDz]25릩b}u"gXKLGoǀ\K7* DF,*VS㮝O/Zo} lJq@qKC*RhIIeu:>oE uO` o XKJq<*_`ϑEJUK}B\z qȮ8zDLif(&fqZ/ڏN(UN? +N"t ޵KDpU>&KRνqK`j@tc wbqQ(QJux"q +{I]#" z XJp^G: MXBw-Y& Z;ĉi |cDp0??A9_-C񎋠h P" bq_G3n%6#^9\tB0&V Ă8PcJ[Yo@HμXtb_ Ĉ bpʍ.Qχ"P2'08p P68I>) Ċ Xbq~"( ћrӭ"Čyqŭ%Xt +AP! +1&Hx,wĒ7 ~ Đ {LC/>^w!kL Ē ެ8{Dp2 +3m٥U|Ak~Tcw*3K Ĕ8[LEwu +P_g54*9%j. "Ę +I0{rI\*ߴb:ƣ-;X,3;y/V'WP89o Ċ Hڵpp]|ʆ?ooSd<F׭6>@vr8*aP ă BzqP@:(~:$'Tio9 ąָzp@C0T/ի"Sd("ĉ 0ڰpj*6t'V@`)L$/=oC! Č ֵyp6gbhL%"Ĕ @{L}w7\?*#=b9@܍3ny] KQo ėBX{qc1qp :X9d0& 㢹E ąP|Lb `E>3 ÀqC3$U|o ĉ¸{L+'#<L{)!(/Fl"Č x{Dpvu +@3%͓Գqf:CZ ďִ|rHK@ +P'1<#IrbIBq֖w ē ֱX{DpJo?py.'*NhI`? ĕ zp۬ Z"D)&&Kc60 +"ė X½{Lf:2<@bkt.occA~-siM^ ęBx{q`2 *lQ?{r` @>&⊛%NE }pKJq +i ]C5wo¼PH`-d2 +@) Ā !KDpFGy/ +pّL~#J/"Ă Y"cJp=`!p>6.$ +- ē +BdNq}CLYoblSt53A"BL'3a Ă ŰJp9_:N0ѪF `XcdX ǁDd"ą YKJp.\^Ʒ2i #N!H.ѭH䁄kbiSt^ ć cLԾ +w~ +}x kEY^ ĉ KDpc +6X_iBbnyrөȭ ċ ֹcDpSu"uSj.hP8H+fe.݇ č ּxKDpmG4 1dE(PA#9Χ[z7"ď @ְPcJpH27 +!X+y%'-޵*B @X4R Ē ɸIp-Vs5t`S7j>G՝'9$"Ok Ĕ KDp`x{CSGo/N5oխVMl|A ĖҽZp+K:@%iK7瓟/\toP 2l *"ęcL+x^NNDGl"Zm`[ Ğ(~Hމ.i=فTb:@B">!Zې ĢXJp`"(ѡUoimӠ}[@_ृH40pCV ĥ +zpFBM޳k)g>o5(T<*"Ĩ XP{LQ5u'0xw?z(7 6lDr0 Ī {L h'"= .߂~ȀP-T4Rp Ĭ X{Dqd+3j]P^oꃿ@KwxUS@L Į +X{Dq>n^.D~%_ %48< +8)("İ +{p咯HWOOu{rUF-(gg@'Y* Ĭ ھ8yp_?'7pG=E2(Ȩ/ Į {Jp4HW^p1IUPӧQ İ ҵxzpD;Z4q%Ji*ixڊvPPԦ"IJ ֶzpꚚ:ңr +-U:;#X:4M ĵ Bzq^ܓXNFYof<=Ts5m((ո ĸڨ{JpC7oGWbC>a ZHs2g{ ļ ֵap^D /X{JqO7 Ȁ 3-nt?Y1[MZ|7 BXzq/ +亀@K9ʁcG116Yo ֵ{DpފhPHmQ32,MBnhZ\^ +yB~q=`h +pa,e3_|5l >"ĸ (XKDp('bذʫYYEnҙO}Fw" Ļ ־XdDpWc\ G.Sc4P.;jAG?+{-w Ľ XKDp9qu$&ȉoI'RU 0 Ŀ XKDpZ2?"(C 63L" @ҹDp87{ݔwq@ *. c7e ڵKDp󮵩? +p^TSfX xdDq|ϣC!K;[H@Bq伢y >XZqh@GԀu@7r+9c@wsU^A" Hڵ{Dp>Hk5U⷇ΞJ +~嶁 زzJLh0K@UDSbu -+ ֱDpW6H2RQc~f1N\MkW{ 0zLyW(5 +o~XyqRo満`lL1in\!hޣ +0ڹzDpX0~f?”e隆5$~Ѡ=/ XcDp0GUΨfJϭlh8" ({L7&1zġV +K0>"8N8n-P ҵ|p?G[@X?x=0;U&KevHG +ֱ|NpMm7@u"17c2ѥ _ ھX| +p #]nR9'p4a"YL`8' +P֩p`"P +K'G<R}:dONc]TL" 8ھXcDpK]N$*HauA ^I !r9?5' - +@|p urRT"YCLx~]nw XcDph:Opǘd;I`w'W/_F? 0X\p &[vR-jVD}*&S$" +X֠}ps:LU\TwS +&Z+aX8 ж~JLt;м+)ljoTkp%`( (~L>BzͺMo@P΀U + ֲX|pP9V[cFGÝ@`@f|[ZF"bLsN ]^?;a@h5A]3 +}pg?T91S%E& Ȗ~LrSX) c@LLTSӧ "Kpv@ޣo-x"* S$FCV)ٚ" CLS C4 I) +foR &nT Jp{:Bm<7|_Q`YCJ ںXCDpÀ:`F+B Q,8olJN ^d KL[`0@N"[#<opA" ڮXKJp@ V 4E@`4i%Tt@,QヶThk ؒXbLh[鮧qHOꏮwc +=?4 +j" +aBKJq +`u0֊,zHIH0 +KA81@L>7 pKNWw&)u9b Z + +捽 +Lp}@2 .EE%,Ho[ - κxKJpG[鉲%>E8.RO`M" +Hʩ\pE/:.F$Ld9b,̭ok 5_ ضXK +LE@M=8!2[U%'A& te)K@;*Z +8ʜMpK &Z<%mOA#̐Z}NqWO XJpeBY\hR&AIQl@Ѡizp +" 8LNp?{g: +HC|V>J,hFu%aowʿ +`ʡ\p^ɠ.җ6(n?j!(|Rd̔'P ʜdp!3`I>ƑUy@m~~6~#wM XʩLpu?L!ՊEP + +Ho uE6" +HΪ8KDp|Jkoxujdwގ X4pPbԎ +*Gc3G4$ӀS_} +ڌ}p{ɛ/2h@x#$$<A 趥KL`o"gP,+Ĩ/. Fe& U +XMp6?mPGU}זC:sS," @dpH +H-z%s ;Q/j + Mp +|"UlhTǪĒT H +%? ڔdp\[ziN +$4C@s7d ڡLJp@Na6P^a-36 +?" LDp׻8P(靪F5~{T6Tf@N=} xdDpP ([nB2&2]M ڝLpkoBNR,epb%@;s&V) +Pΐ^DpQW.8Yd X0[aq󦤱I 3DpL,'v@`s,3b@ ab0" ʌ}pG35Eu~i~w8i,XhmE$ +" 趍X~L N:I$fʀa3 KAH "E dpouuw;_@ \hTdW/ Δdp倂ȒD~b3R;Q" +ʈ~LsoWcy>Pd;^l3,\=1? ֹ3Jp*'d G03) pyyIz eq. L2H|*efq= NNL:m@mGƪ @=|S " PҥLp= uPN6!Npّ@ui.z ک4pZ.倀1yQ@j8A-= xکKDp?p5{ˤ cP>_az +8֌X}pWzɀ0\04"5)"Cޏ" ֙dNp.W3+#K$'ǓP?e}Z ֈ}pM` +0o!g G旑cO +ʺXKDp^6RH #M + +pG> _S XCDq7B`k0ͤD 9&{Q΀_A" +Hʡdpmjm8 +\×ʢ́O(SA7ͼ y +X3Dqq0a+{V, 6t1wW% +Bdqʀ\ +iրm$UT pʝLp'=Dz$37`HK@v ?`O" B{JqT.Cd3)Jߜբl5 |p%Io? ~PL+N+O8yv" + (&="' ~LLi{I#7Z|y +evEѼ̀" +!Lq$K|@ +ҁ8#ȝsv%Kw ʔ|p P0 +2Fke!4kF Νep(aAHiԷb ʘX\p~\ѿ `0Γ%y. d{X(k" +ƌ} +pA ] +} @-䉭`xͨ ʌP|p;C?p.[sQY EL3A ʐ(~p5d>#^bOcǥ>w76h_5T Υdpʷp00`df9>Դ" A +X3Dqgs2Gbn +:P]~M.4ݺ>'<- Δe +p./5ف4!:'B8bDC- +A +dpOD)`pfG! +I&×h|UZ۽P Θ\rz@&!\-VQ4()EF" +P~Np68"|tLO85dDk]j KDpHZ  YTSyuudi"/Jz x֠X^ p8T>QMCj$3]`}oLߡ> `Ҡ4pYPafHsM+Di)n0" ֱLp<^f@\h@nHYK53t ־xKDp(umP2H*3 i1\1Ә "M +p7p ( D`j  b<\-Kb0 ֺXcDpF +@@] m84rIWW ΕMpć+@ +Q>"@ޙ\rKũ LqXdX\*ԉb?" 9 +LquAs.r"` ptBY +=pJ}E +I +Lq@7&}`ʀ% Wʗ3ͭ6;| ƌM +pW:۾V v1)6g29+nT&; +ʄxE +pJP`=D*ҹ"h bN1rH +" @ʌ|pQwh@=F{ =[T `Αp~q?@v;N"t  +"xO+: NL<}`&Vrim8.(cC NLWO7@OlXN rxbnik\O" ((fL]:`ր%"U^Cx dQZv` +P֍dpW*@ +#Z/6z8P{^4Yϭ NNLĿ Ik!Sj߇ 8^٩?]?~(G ډep`QW!C$ʒya*Fd-=;~" +|MqHg/Se}5 sitЬ{bP ʢXzp@@5\4uMX82 i2A&Uf MqJLf&gBD + yolOHAJ2 t~LMX +@]6< q:S$!cDJ$m" +xxNq"veٚ5#F(Wy?<=Ջ lNL(9\٠88UeSj(XI/ +톩rYDj +pPfJLU`06*%AE@#B(B%tv_~u +t} +sgP *$#bf׳~umz*yA5?p" +tx~JLZ" (4Lg\ܮ8W`b@H8 +` tPfq5?F}ߜ@4@c#D/xpENg tfTsF5Et\3NDbWJY,j,? +h(~pbz F? XVѭ rnZHXFsmF" +XL>mh@ `[EvI+!\֡c +ڷzIu ࢀ~MGp& GjnPĜfv) ֍LpQϕ@ɹgA@t_QA΁9OMώw"m=PԊ h~|8NNHh΄o;Bw-ѼjB#XO pfNLxL3o-g(t^R + +t~L%;ߧ,@߀6bʖ\eHIӌ+"8ޅqֈnh{n + $W Fo~[j,aARww< rPN HU#q7(&Az ij()O.9` XNNL9@- Xd+<+ gGC(s XNLHBx?Tn-ɒL!2fu,&1?LIt$q „XNL&cgtQjE൝=%k" XvNNHN˯>F@ *0'~1ɾoe?̷>L xXNTLԛ䀀P xKO7"/eJPa2NM `p(NMEz͵P3Tb!e(m @|- hr}NH!$ +ebЏVT_RH'% + .?" +|~^L/gQ jY U8OWMbH@iC 辈fLYs ]OP2סy:\ٯ X{L_ } HGػ0\Y\(V7l , x{L/tf֝Dã)qn]힡" x{Ls3),4Y"NC90j>N}N +x{Nq ,G\8Ԗ BQ-6!V/A Ȏ8{Lnr l'^y%~{Luw +Xx~L_1ȨU +^.AxhAJZ&" x{L&H+Ҡ;;GG7 N.B +Pt(LVRwH1jkuL +t$+Gc +ޙ X{LH D.dWxvH4j +{L@CSj.3ஐphHXUa _" Œ8LR@ MUXɰEu_x{s&mD8d1:B+{I54UӃo ^(N*>nP!٣I X>Jtdi[x KLfw%%(FuUrq +xPSw3-Z?  \ No newline at end of file Index: songs/Moonlight-16.mp3 =================================================================== --- songs/Moonlight-16.mp3 (nonexistent) +++ songs/Moonlight-16.mp3 (revision 1765) @@ -0,0 +1,2719 @@ + H 'H NH"uH ĝH H H0OLb"H ɣn +\$= +`dѷ @Ő H10ĠAǤqPiJLu2bJx +.p4 H`XA@ЍF  +,9%@ H&hP2(`bD(&;\0Hs!@Nj"Hnv9B@ +@(D`0 HO2b1w6 Y=FHB2<6ՃKfٚ99l`A5:lb_ /@A?Ixz@0>gϢ@%TʢJ&\Y.R e"S<@h%W]  +8zxR0t\7 zR]n`GH,=]N<5]  (N +=Z,928KNE@ן a†'|[@-  ֝q +t6Ý/џRl7ʿ/m"؊xLS4ȓ'[|z4'Tze`eu\ + ֐X{Dp{TSdA[0ԕG8@_Il ҜxpzƆ(H ?X4ѝҏB\Ӱ (NSB\:mDn,F%Za ;" ֐xDpU2T̢8o @ + +^Ô6́׵T\P PNfET/&f +tݠ|TV + + xHx'z, 7Bj!)$="~~ xLV_ uD#KB)޺xp\\ƾQBQhij"! HvXH;g]s}, +t_d~[+C7 ʝ #x +LOP3l$P_ :ܺ{}K@ 'nxK(jw7jldg IS=MUJn; +xLV,8? 9 :F+> +DCn}m"/ nxfV(?Sô#p7r*=*m\ !pL$ 2PNPdtSj}gR + + +?X=tuޮ< 6nPf *s -xmʿ?H٧14 (Ҕx„pREрsGd + A{N{^$ Avx{HMumR! +!w-S_2iASTL E xLmJRQ-{K]?G~fh G֘Pzr mqX† 9}g~*p739G"KzPJ c,4~| ?E?r-[@s3WQ P~xHN7ۓfAGǸ2ÁI@C ɓᝄ T~x{HT TFHvd G +22r!D.2 XzxHcSkim!@1Sp {6a +v"\ 8xL؋ډ~V-O +,ؚFB@J _֔Drv;[two1Lƥ>$bh|A f x{L:6PVz^ a,CI7k;$Ҥ= h ~xHO}%A#j=\эN} jxx{DL +&2`I?m@O}y9_`ݜo"ozx{HK,oNK' M22<3)S T޼P" s zPHo +yd{tm03C $ZW  unPK+ +e;>OlHчgFP飼 y~xPH3"6ƀ(DP`NBM"|xKJL` +#%QjޤYlxxR)$9ETF Ā PLSM=EaVI ?B߅$V %H ĂnXN (f Fo tHzH%;85}y ąȶPNpҀxi8QGkd T +Z.a"ĈPN +~qmnv +V֨ Q-I R +8 2r^e čp|(L^z]+w`Щq6I:88zpw~[ Ē nK((qgM {%^#,킖GmJ + ĔnPfZ(#WRBm=&:KHA) $@T"ė PL^D[x\65C\޾P=uh5 ęrx{I=Qb*b/ǔrZ!{8F{]N ʹ1 ĝ r|PHaA3xեgdb NlSFU$^xZ Z +6 Ġ jN(d=SBW~5An?ړ9b! +q*Z"Ģ蒈x{L`aD<xїvƸFZ=* 5,8]z- Ħ xLn?=h#ꔮXyQ Hє"zF"\(D Ĩ nxf(IM]g+9 r9Bέ$@D>}zW ĪڐxzqtW" +t$¬Tͮx8S){"ĭ @nx{(XϦ hfwy:[ҽT|8@j+ЯQw İ| +N X9YqrzRIѰ:<W" ĵrtH +LFH0xKRDQ 6_i +ce Ĺjx{(?\ d Mn_@Iձ8Wg.z "ļ 0nx~(B, +lHuSQiBH~!EVv 1D Ŀ xL/".ܬ-T,dW_R*š$ r|P +HV@!STG(I:L[lA@ nxP(//ZϳFP9սoRe +8Ǥ x!i0s4" Xj[(lTaM +Jղ)Xk}X$u`' + nxP~()Y $"^9- Bl;%dJ4F {L6.dMw%ɡ}`;U'crhjW rp(H3жoR$穫6N2[i2"ƈPyrEz~d5f@ +Cs=@B͉_l3ˋg r{H' +^p2cfSf$K:!U +: j{(Xo^8k,1K$OP}_*]gȭ" H{L dpӖT6 +!&WN#e`-x ~HDݽ  .?~ix\W7+1үXX*Y XzPHаKhqCQ㣠΄n%XGA ~HTDԶ`쩒:EK؆ fDxO&" +`~pPHQߤ O+(69zF nx~T(8aΠT%I0&~R">9RדoCn ~xP +H5nk%`7n>pg&!GA"x Jf$CeH`2c ?͔߲~}*" HzxHa- +nʞq#a+b rbZV@д$۟zO z}H' x"FZg PY`1cB$0^P*2 ~|PHx$ +i; 5Hwi.~o=> ~xPH@}T#oHdJJ Xl +LvLڐ Uk"AAih%"Kk7 pt0L=%\ +/XЎ،o jj;9ڌyɶ" dLN, oX혇1RR +6,D3AL l0L> ` /fbbb[@bI" HyL2@}zvlƂD0}?q>[^ pPLC[1_HXm|/¡N0௖< zl H2v- &@2(Xmp@oaz 7 zt( H  i4ۥ p$VDiU@OFW" PLMz@q| 2FaC~oal bt"*z ftϣſ +y}5:*Ɖ* +|XL &;mB?0f2eFt]8-h `lLfoiGYX)m.[z +rΌN0" +XtP +LӘ@)_ `8#ICUw,4 Т|PL')5*ud!C)*fUOz/h˨O О|PNG?rT,|XH Tp.UGAVb" +(^x{(GjO*GC-Mxt(N- rxH-X˕\.02ydԄ6;[cۊ Ȣl(LiA59#WL5, +v\H.}Eė |LqN)m޷鬝%ȣa/s;0yCTs" +}ʄp:.شdS,hHۏU] @zNR< +`BáJ2TYRw`~遏3+: Ґxyp_w=;! دKyu( + ґzpB;m?fG@d>Jr" |NVpPiIrꗯ(kX~M[F7 +XxLKڀ9-ŐJHPYL8HQ᨝1 ~p(I}JX! xPLAa-PFR^dX.' 3O e~@8gSs" +Px{LٳҤGV(StVS +@KذeNM)j| vxHE[0>Dg@f2TSgFqPD8 О8{L 3U7UDAqQ.G^5SMl vt(HoR7*IχRS~87QaJ/Vl" +{LqS 9XzH3b)8 8~t(J@XrhÒݞ7dnM7AXN vhJP6,b1jda~Rf$: ^K(7 2hME{&vE)=_8P" ֍Dp6_Scp&]E_TbN5u +/E~ +Lp  +Xf&EĈAf0V +guMe Liޠ.H\GLf+ԝYܝS вXL.v~MF + )*쵒xԨiP`6 x OH Uq^-;ǃ#uz+#4rR" +Hp(Nފ t JI@mj,؜\/.5 ~p0H 4vTW Ҵ/UƛO {LcͷX&KYF55/PF dn1ӿ +}LOW&eYB`՘&FI0=E]Ol#"w0"~lHPm=T㣡9_U\'-a/G +ڀPzr)vE u-ĬK|N2OUE riťdDj rpPHЍ`>6 *1!+ tPLV``]` +t"V/Mr?H|,LG" +l(L?QoPFff\o]//FbnՕ վ rp(J@VT![~:9\Z `hL9q`_`r|Ŕvra:a0~$Mz-I2+(V +r`HEh 9m k(\@tEZjI xyL`ʀ[hW%t +Td>y>^" +nx{([U +-TaI_xQ4&o(ฅƗ j( rxzDH`ڀ]P!} E +ʋi(Yk vxzJHi)]_5&aPz7r}RԻ8Z˥x +rx +Hvp=w.iXעPkQ~Le " +H|xL -Q`)Q ;=MWv~aᴦI rxHgmh +I534aƣ@yGӣs_8G +rPJ] -NȞ)oUae@,J+{Sj[*< rx{DHWe$;ˡ7o$+(RU6" x{L3 +L)|ȓ#d%G +E$D) ؚbLm +5%` +FxB9F6,h% Cm ~|P{JJ! Tto ' (%>ϕ" ~tPH Fd5Z +W!PLj\o]0" zp( J$ +jC\ZuC<2ubyMf>M +xx~LҠ9~þTՔثVX98- xPLE@ +& "hN~]QjLF\ZG: ZK$Wà-+B;!1qG" rh(H'V +4ө(YL~7Dmݞ}J< ؞}{L?u7 ZLBy GJPq 8rxP +Hi +1,nqQmWbz5 ~XcH 5h +YIiZh ,N=*NU" +^}N(lk8B;| 6zaFI9izZCk8[8C rzDHeva0w/`lZX_'|83o= +~pP H_] +ѪYp冞 +Ecv+8m#E `x{LPA@i_&aVvDhO6Z߰" +@LD䀍0}W V1x [W2cʄXT9:_ rPJ=4 UqŽ(20CTBFvQP +뵶@ڥ? +rXH`u% Sl QBBO,艡w] ضDL +yQ 8, 'UZ@_Xld," +(tPLǚ]_193Pq'z @ +nN((wW +)"t(I(.ŚX= +m rlH*?5̝"UjC; + +^Jٺ +0tPLW D +bRzU3YW6+ n3(M~%`4n es +tv&[" +}Lm +ȊE]A!Z]JCH'3n( n6(޺=~(0+^w c EN{z:O @p(N,=txG̠< 0A8) +m׃# vtPH/!su +eKm1C3u-x M" +`L8U0pN 8lF6HSmC>(N zDL%w_/O`@t,7^Tz {L^hMpB|8SX3Q?-9 蒶X{LD~jQyQXlI˧Fڈ1J5" (x{M߅1*+08T`g Ln>` +vo0jk>+("V غx{L5  +ŐFa=4jToJDHtE8oR xzNLQ_P}+st8 i9,qݵ*<.}" +ΤxzFp("(H F8:7&`nృu/, +XxLgWY^H/"7G?v + ʨxyDpڝXp +̣,Iv"5 Rw_ +XLgW irDanO"`˩61^^" ΠxzptU+/41Ȓ- j!ԚZpТb +X +L + +ٌV ceg8pJn =2LLF߾cuT ʠxDp +YyofTAp.P +?%" +pʔX{pOB?-8+H,U  ~455 8L'm +d e) tfܾg"C+D' ಜx{L +Df{ +audBz=%,%f +FK LuJHḒ@dFfC^E5"L% +j" +~X{H +3!OdN6 +! b^Ei6[PKO~za ֡p31F5Lh`hhPdPdrT Ȳx{LSjeˀh iEl`xRqA HԂ ^{(2SzM;gk`̔lϏ6vT" +0P{N$  @˱4©y)4ׇ5?8 +xL{@@@ k(GB,CFPA xxbL Bvs .]v' 1y:T Ȗ(Mun 5r"5qJJ/Gv +5" + x{LH+h; +pLHo"8ZΔ*ñrwSz:t{ xLvA 'l9bZq7T'fߵI +fx{(+B@$0@ rYbu 4?F Ȗx +LŎ +ajC!ydȔٰ!i H" +Hx{L*z@_zͶS(@'B0 rx$О +LTXѽ#s˙+$eO4 #%Lu) fx{( +xhd_V j&ղ䌔|żr 0@NwG ?`BYKb1 Ξ:XV 1" x{LinĀve GFd@z>?ACPÁ6 ЎPLzP +]"tZ%,M㊧2Lp\ zxzFH@ag2 )h&,f5+_n:W1x x O NW$Qh+t/l%ĘpzY nH" +XnX~(j/3\0-4S eˏetwV02ŘW& L \6.T N + "Ag + 0L-@;h3 Eq +AT6) +g5,ͧ3 PM*Ԁkl +G KY s_R# x{L5(@=4Q>89 +4`A" +xL;<~`09F8Əх< x{LŐ +5_{1[DWr\ g%d65[® zPJ# +LEc9,BJ$/U +\η1= x{LkmJ4@- ٭Hy4,ʼnY쩞%)G D"!" ~XzH(h  ulǀĠ\E oU ;gs܈jt;( ~x{H), ~Xg&1 D x{LSPͰ/X] oC#㲪+&xPҢ;" + {Lۙ|ܖ+EVbK]hv-1R;(ʝH PLhSE` ޮ ]ׄ}4Qu߈ L҇}Հ~rm8V9pa= +xLtҧmFU yH PK4YFBV6(J yx"PN5z} O8v|JĉĦa+Ll +{LG] +32!CL'a;=JV8fDR]0 ~xHjB~F֠L-Rh ??aGZQ +x{L@hR +_tF4O 'Ye,:VAi" 0XLq&O`2ڏMސ[  O ؎x{LʘSX E1PAA~ݏ?Z_]TO0 0G" XrHn6L|KITD:oFI@!B7˧ĠP{Z*_9X] ΐXzqn +^h+pPba8Huj%" +(xL7)z4,*4z 挦Xw?QĔ v8{Ho> UHEU6慺Wa*0i zXH@Ri@q ;O9q XCS=3)^ 8L[Ut0ؾ8!^K{!M/" +@n{(Zw2c2[/Uxء`w;I x{ +L_X U43× 57G].=.PSg {N@5 +4@R%8!AQpn NFݝX 5y"MA%Q`- " +HL?, +Q+TV/4ma7@bA ({N?=1w]sNs\/NVEpKIZ߄ +(Lu8YA=ZU(~38շ Lַ? cq'}%uH\I" + {L+; +9IfСm\[H&4}AAi<[H vH}LTX ;!3)--r}3 ~PHM@ +|,H:"n܃ j Mu0F{ ~xH# @@ dv[W}SmrRc}dAP" {LM0T.֍sN*X՝$AB?n- +8L +cot> Nc}H(;woW (jf*"8XEo8L0k|&X)EYK +zXHL +۽wJϋna#)d"?'" +(XL +ة((1-s*3{$% 䴮 PL +vҲ7P63p eTV#Й&· PLJ@ .㔑 Ob>ⶪX*o +]W pP{M* 3Mj^֡$5" +[[]" + Lv%W~ocib>l)DG*_{kf + zPHDlРWzXbdavQ=%7 `~ J `_8TՄL=)2jL +zxPHhzrm+ +a> + +.]" ~PHOv@ &: ! Ri/˒5?0#uCT |(No#r +P֯!" +z{HM?n-CBu +r6F"b;-I(Ԋ9 zDLWe]̤AEU\k:3Qx`9P" +x{L}+niM + ot#V?ʠ +eY ҐxpYH;JBb`X(L˅n卖 ЖPLq3h +VdɢbCi #jX GC +Xv|PHz1th5^mԘe8[In)[x1:" LguI6"< &kyy2BᵙA#)6lw +HPL}mT{)cY)+7`̱?IK_ 蚀(L6 73 ןrP .v j" +vHߘDձ!@J)#InUgSE@x,; 袄PLw.܋sP1976ѕ + +8zL`t2 k3h3ax ] {LBGr;W8EC2#Z|'" 8Ly]gEQZK#)4N^ + +08L(""@HJBYق EŶ&'1~U? вLܙ}@{.g":+F185#2k^Kg زLa҃rvԯk҆ k%]9)6!W" PLQz ~$9+;㏔J_:ybלH' +LЇԂ@\^bnQ{X;5h< ڕxp-$} 3nEҕØ2G:~{h\40A +8L|@;(I0'#p7g)wM dGh<" ֈDpy%?>qHΞk2x( +ػ7)/ U|I `Jr/n ,`2y? };QSl3 „p7@ 4 +D]0֤: ضLWMUi $#\ +֋J(" @0LҗIXi2 ~0ݗr;J0dT5/ +|LP9zŁF6J2&j \s +~ ضLؠ~U#B' >>gp3|ȣ ؖbFM>[@~~A2%Zi$9(b_+o" RLLnZuo}Ɵ4F +cȍZ- PzFMf|@oV XHBĀ91]Y\*+04=L4 RQ ~XPHߩveЮ ˇ)#}NfV:*kx { +L=2 +|"|yNG#]ߩ@j?]^0Z=9,a xcL%@11t22PQTI.wp,@p?c zx{Hԯ˳ +ȄY=5dt 4d +PvX{HRej@(](R eqm d 9>+" X{LTm2 +cl4_cN4r҉pEC3D, xcLX}C2{Ebm#N#X⶘ʌtj} PxcLC7%^ 7}>, K" + AU +u (LgƢjs(WL@I5LsҨٹ%[" Lާm6:W,F8Aި[қ43/U XLPe} c'siڸ ntEFMS% ++ z8H@ +Zԥ}C_7hCWyzN +; +LJg}:A=S-ZjH5YQC` +x{L( tȰz Z +8%&-O> rXH5 + +|'xl)f2֟ ufCv" + 0NxX U*Зv3)Dq$' +XzLA{4"`% 9|)ė͢ ߢb @xzDL#Q +},3? +`n>(s#ybcm} X +L,Viq{+A+\(|9na;" +0bJL +A~CK°INnp2\blB[ 8cLz4cI`yl0jA}n?] z8{HY *L +1Sx&oM^[K x{ +Ls >bAERI$r)u" +XLx)X^VcBab9 WTuh>l X{L6>\[GGgtq^ԡDDrs7As +0XLZn9Pl\]07l<\wOe <z `~X{H-nbjE|uLAF(`J}fO uF_w PLLp|/n,^L"#K?7:=Lm4" LPo(3ޱ4Iь:"Oi +̑~\ ȶx{DLCҀr3vHeX![iU(2oVT 8LG]*bvbn!ƒ0$ ֔XzDpPVIկ*h *Rj=G." XL"\< /drh\Bsڧ3pX9 iXzp=Ǹ[p&p]M("F~Fl +8A +yXDp}M۟wt82>Ѩ;=M5핈7S {L8% 7R 8UBnYn,IBQi\ݦ}J[" ~x{H[FvrlI2-PznIt K:T ҜxzDpQXRRJ+UE-f[ڴM} ~PH=}6)$N1,PW9e(ȹM z{H>ր1KD8*#xlcInFjהzu" zXH?/ְ×t?.qtCݠ| ~H-X43" %։*׸7rpd2n`4eD_vw +P8L,RdQ0,KWQRM/= M7h U` +!EX: d,?#0K:" +zPH܊(Y`T`g<#Cn F"otO +0L_-.l]+30 +2TL]\ #}/ L fT+Pb*H#ǗeH 럨 zpe@sNإuĸ+1:M" +XL$#)@@$ڼZ%C0 n(g@cqLdQHtnQU -?B uh ಙ{ +LW!`b:Pp {L  \؂UE l%̿@ U;t" Ж8zJLy^1TmN=B# 2@}$>\ +0{LyHE ;ԩPi0B\SAyh\E_ zDLYP +esLe uFrC ؎XL +uM@!I~'c<=[w>rd%WAq" @X{Ly`kB.n\]$ +﴾% + xL_)Y?tE$YGG'ه hxLG=:SaI2F8DtΫAyUW{ + xL*+ +12 +7\XLYUy +" Px{Lӄv = :/WcGcEb!%Ȇ0 ؎x{L-  N2DPQ4g +%Eg ΨXypң@ @%!6^H|taVխ+Q[r xX{L7.PV@H\Gy8hU5R}^$@@! 誨x{M ,r )71F6<%ȵPC" +x{Lէ +TL#Djx_:˫O j{(w*xD+r7 jsV& zx{Hs 5tHcpP'YcTb`2D0ic. + xHR>m|pI`%M\e]э1"zU"jX{(vР +'e {( F9wj[F> +p{N7 \ + +@O: ?̔s&0ɃS510l 8H>wNipvUsⴤlg!'d! X{Loju)@6(k +O $p62-화" Jk#g@VGD0X2zesu}ݾ zJ n)Xa hЂ}$U(ͰW +Sqp8e +p8Hy*E\0l@Ȑh"/ v8{H?w+9UB>njhJ{f" x{LSZ0}RIHy h(lc[ +xLQj9pu. 5}ԣ +fT[n{ۂ h¬xzLX!V:'髽9MĂokU= z zX{H[L/p,meAZ3F/|rVR옚" x{LI+&TZ\>7kW4-dٔ; ¤x{L(;}nY1[rsMi)R*M +X{ L?89'G)F7U\ɟ +QXcJp ~x~H'DzA͘EiZWGE~z{[@Q" +9xDq';6ؠ:WRuNb;PL x~x~H@Рz TSv8\18 i0 ~x~H8๢1̈\$5#`_=pH02y Ψxp~Hv 7D)4W!!Jp096GPҘ" zx~Hy>HV9ZEUnF 1M: + X{Hܕ0>'CCZs P#U؅m5 x{LG^z $(l>$E9V2Tk2Ql2 +X{Heor5~^K+R-Ů "L7C" (jx~(@!(*6m-̿"`sg +(zX{HJؠo:Td~)QXE$p+8 ΜxDp +ҡD)#ttw-^DU +bn ʤxzpxFKRV3$.V0F" +HX~L[`<DR6*3gΙ7s78Gx rX{Ho|I+h0è]tsy*2q6 + xL`+x f*gה$A{mc2S7Z ΨxyDpO{Xd:H@ +ѣYy]X\rh" +xL~oO)8z&cX@(1;nɠ X{Lhy5,f'!r'[9ڡSXܤ +xLqHqYG#~).cI(+-$뢂 ؒxLuTTج;MPY2#VSaW" + xDq +< /('D +6R. +_-= 9T vQ + +xLDoV hZT?&(U 0z8{H&w8qC`T ]}E'4Gb +xLwhԕYCb-0Xp_H,Jӧo" +Hq9Β=~$ IF#ւ;b +1 +=`" x{FLM??ߗyPɞUX;"9ka Μxyp*{w|9FR2DAMfM_[ yz^4[ ˜x{L,|D_Pˁl_ ^ zpc-~kxߣL\ɭ~#x\" 8LbG@&~~BAtvC FQ n;KXӽ u zX{H5?X>܉sE>vfQ0& +L~YcZRaP'NU{ذC1 +* ЎX{L5?Ѐ +߁2 3I2F&+CCD&xH" PX{L7Z%KIP\L#; >0U>0/ X0cN@o~‹V@dTUՐMq0ّ +- ~X{HEs Čb\⤥+ 8--54 + Lt1@z1D`C_k>ʇˌ8qy" 8~{H24y R~**u(lQ{86A +zK z{Ho@)H@Q`y"<3aoPW3,s4Iv h0L7@܉Q͈įb5T,{ +ےt ~X{Hr + >KRn\#>хFz" +X8~ Hn (K c(nT'-UL|#5M {L—9#6[*{/{A̚ V?R +X~ +L]OsBX saW'bgո9rhrw NLU(ԐfʠV +i +3$JVD\)t" +`VHO05 ps +ȄM9P6$uZN!FfC ~LojvA%TJÐӨ +̴0i<m +ʘpdV-~SQ: v4a!'Rl/ fLr']VDF I[xC4=Wb}"s +0" +~~HUWҺ%gM*<Zfb&G \DLej B%Q@;QTxWDzW +ˆ~LSR)r ړ'LäPBf/ ְ{ XDp.ҸaaĎ I¡5ԭCisR:Rݧ"ΘXzpm/p#'\H0g3YU1 +~^Hg/(02u⤦W4V# ΔX{Dpa|}LAJw|rNtR/{2Pw +f8f(͵}`a29PhAB +]uy1WFѕ" + {L>v a :WIBDɂe(xqj}qR>p# ~Lr4zt$^*0FؓqT4|]+*-M j{(,vh)ڳRcn/oz?J PP{NV[$?ش2y81YUrR>1)n" +X{ps=uIVu̾6ь "焣H X{ +Le| %!W( 6Y$gPCI +xY z0J՟ +A`*co+lz ~xzVH4JbNGj j^5 (.&'&" +`xpdmHR[?o xzFLվTx= X V eΗFdѲJ ¤xLt\>AF(HrAZ6 +E;zz; jX{(ӽ@D)yJ)K)(2Eղ" HΤxzpPP; jb(<-01Yhf e1z zrg"7~}J.X^`!'u +8xzpz`TNW, ܋]`h|z,^Z xc +L,޳`  +Hfa eHFۮ|3A" +Т{Lҳ꿁`й 8\rC_UiOu[&\O3(7 zDpU%||[xJC*cT^S-`Ʃnp P{NWf?l%BJ6jIFƿiK5U XzDp覘 BɌAN殄G.N(݉AI +vH2lX h$9"H<,ZFd~" @8{LnM <Uiwlhq^vѡuC?){Ͳ {LpG h +yT60έg}:#yASoF +`8L#B0 +q# k6_PQyrvБE  @^c(Kޝ  R@i$$Fê=ItsQk" ({LЗilQpaV-30v]:ĚpmJd jXS( +Ѐ}Smh2{8^Io[Ŗ p{N@N|E8/h#M??S F X{L\USn r8zLH 72.ꆣ.a/4K7 +\$w\+ +" +~LýwVƪ5 +PM&fMq䲰͖ר3u zZJDy;Xkkȸr]eC7&noM +XDq+.|FkF1&&Poub ucK XLDLeo5bJ5w +:$mΤc3d # +t" +ʘxJpbݖƔE?U@h9b*3}kW7 PΥp  +RXlQ$ܨ .YA= + ʔ{DpAAp)*rk!CݜdKIP_yۊk˳A X~Lb; +h!)#d0,Fԋng +\;Gz" +PΌp{F;XSnG%ÒG>z~ Δ(Dr'Qa(BG2D*fy?!/E@I^H +ʍp1x",AQgT֤+L@'>M ʘPDq+3 Pd%oɛk88͜dF" +zp;֠yW%(jeA(nMT&޿NON xfL )YO(M̻r:7 +AD ʦXbpvsk:Yl̓\bpĸe?gA? z~HȨ"K@{7aYҞVB[ +ICzu" zP{Ho?֠ QD ]=g^3&$IA ~L[\}0R$JhK,l|]%*m= X{LhP!^z 3r=c 'R6Ɱe PL#> Q@I^"MEցo{" +HΔxDpE ~DQz].>n<Rnock?S}\ v{HhrYt5 _ +B>(>tAP Μx{pT / +>M؂N-TbK) x{Lސv+CD jAbGeswM" x{Lְ+h!Ug'ua`@?wZ"ɛ ΘzDre E3G"R)ͅ.n0[|N +HXzp#}@D nNI>[ +RmQNMtB{v*<d v{ H<~І7fk<,)ct< *!ArTD: +XҔx{piP<]jD%xTF^y ɍf;?HYH E= zHn} t;?l +5$QE&@`dcn\uq=_" +Lt@XR$ + بZD)s+? xL̋0n$*W9b }MVʚ|LHS$ rx{H`?ԍ2)ՙ2(-i'Dݼk zJs.d-j.:!AƩx|"J)7AO ȞP +LMq +aɊ@ 8]La싗ʓ" ТPLZf$NEr,jW4a +l># + ʜxzpЀ|3 1: +'ePU4Ӆeqp:Qzy` {Lq@Fv^%L%Du`4x\?}Jt +pƕDpcԀ8Zz(pΨʈRXhF$̛" ІPHCorwQn8Ij" +`֙zpĻ} +h5oa|CfN/# 蒙L+zz 03ʓ)i4X$dv/QxaF +@{ +Lrm`އC*]SO ; Vx[$Чoր 0 +#JJA80FVP P! * +(PL1c@l32+?+.}d(IS x{Lw*1UC]Rameا2u7J"Zx{$QRQi21odCp84L\bJB +xHV*+ +Pi%G|MZ>\(^y zx{HKm}Z߀' D:d9E➙4)Wإ zzVHk#hqRĶM=z*˞K'`ߗ bXc(Wd>Or(Tgb"g7' +YH1kT x" +H{Lf +%~,v̭^ + RuҲ*n\*jK{ zIJ] :9Պ=4:PiIs[z +Pf{(ܤ/E{bT%~*Cqf]*6 ȒaL-~ OAďXڵR݆k#ї[" +0{M5=GxV2l7 qLU`̆ 5 j{(|>{!_]FiyX^?V XLWaXf2Ev +3 +-&ڒ6ͫ鎑 xzJL[` 593eJHT?%tgFA%<" ΥyNp`wl +i$|FT?Sp' 8LwЀ?Cʳ$!BnUYsX\ ЮX{LZں"~n%LL= 62 +k.jnn%;%o XLW|vOC&`-BH'R""qV&q>Hg^ (X{L@ +Ia*=q^"hnmij. X{L~-KX>Hq՜h(dxVQ jK" +Xʐ8pS:3IOrh(s0:q&%#\Y ΄rφ~) /`.8N +ҸgAKOU[n X{LV+e ?(0-% +`}dݨʠ q +md j0{(?| :H.퇂zU>m~" +΄Pq@iW +2Y1 6O yr PX{L~ ª14;S!܃tĘ: zzLJ"9MBFf9PCwF?~Q # +ʄ0p@Vs H`7MA%L>X3oqʩE-)Öϐ, { +L+@/g-u.%0b\lrQb%|$hw? +8Lmj @L'➌@TfKi" @XzDL;(PS0 grg {4PIYS +8jX~(t:jAƠB~`¹&CR] ΘXzp@?{G +1 +bBCB@Mqt Nԝ@-e&^t%^ w1E5U +ߤS" fX{(sFvV0-B^t)llG$T! r0{ JB A@S\%HW=/EG- << +P8L/jn;l#)M0㋱h "vJ vx{Hn֔bUЙL[L'뢱OcFG'; +rX{Hr$;$Cq{p7bS1!v" +0vXHjv(whhQ)О8$TX Dtİn Ȫ0L#Pz`n3ńHBZGTzmZR(U/c# rx{H3ysS,ZQ)BHda? +8X +L+ʿ@}h6<_tQPG-`<.Yr}" +L3q@/yB!` +G= =ep  +LA6n9 ,Ds:Yuv+- L@00 +$XK1DT*lֱOv# x{L?+puL APL5Uؖ}ހEGp" L-EѴ3 61lV+# XW[/K5 覌XLj}@ S$[ݸCR2N4kB* XyL@? (X+E I&Xެx1#XS)n l{ X{ +L?K0G O +7@+ettS" ʈPzDpfNNVԚkHl8a5`,0Wc3"u +xbLH `>hL +&ڕ20DMۚ,-`L' ʉzDpcKzaHDKM8v$ST ʌPr`GƁCgC N\hdRڵ y >" Ȫ(N}ya" -%|SL+-qԩ]+W +`ʐxzpW+]_;[sm2YTdH;dޭ vX H, Ya3WLOVPv7=V +{L/ MR7i- -J\9>RN2x*~7I~" +0L6 +Dru MHmWlb3FhF jN)R +`;F~T8\x%.;?? +XLI`=ӥxoe) +r亍K6& ʝzpt[hk(=fӅgp U2L2"tOfJus" +PʕzDp . N`iZS Gĉlb (H` 0f`BBu ؎Hܷ.O9,{ +8αpX.Dn4\8'TܞwkdL + ֨XzDpT +J +"ۗ)6/mZV" XֱzDqrl,䀺*҉+ dJWS? ~xHGIr9\9:2db=/kF bc(,#+$c%?pf=7I8Oi ҤPzrBVx(Qr]Qh ۨ.YĚZ`" XzLH+B- #๹V -0JMƨ* PN="2f@QUmL:9?:>xNc? ֤xzp?X +$I`pQF$:9uX Ўx{ L:V_ +Jg| 9Q +݉ʩ`射" Hnx{({-P9*G <$6ѽ׍ prC ЊX LKi)bH5Y*%i=:IJ} ЎxzDL(5*J#\TG4M\f~\  N50 cj`tXrA QŸ#5 R<" +p֘P{rEAVz +$V˳&`)Ɖ$ +)cARx h^xc(O= ɚsbeTTq2(֞ϮN@ +8xL&~O LpB΃yH nx{(Qݽ`(>eiM7O p4ƝA "jx{(1"? +C)lG`sH{{q +rPH$/Q./ES06۠ + P{L纀Ỵp/hLΗF9ꐍpHJ4 x{L(q)Wphή@',E+?Z&++D1 +zDL׊ "VjT [,<\S?*\Un`" +rx +H'u!0`#䡵\SBI<ϔt PL.c@_q&k\e\(82(,K xzJLH= ,^b"Hҥs1EQaESOr + vx{HV>}DᄭiÐ{&D}#[Y" n0{*/1G&gۜnYO,Dy1C/ +vH7H@$tV?D<%P58Vbutn Hrx{ H\js?E@9\(vRA1w NBO[Re$Aw6:W@XJZAZk" PvP{JSXIE +/f4B+=N0o Nܞ:fx)02dߥ9d? (nx~(Ă䤠Ȱz h8G:m'z bLLMSvNiZͲ|tF&-A@Q qo" +x{LR} (ht4McIr޽\y`5; ҡzpg@ +""0+!E12w0 A#yު zJLs?PDP@#8bo09{ ~zRJ-͓&\t0 pg}HeO҇" +֘xpf*}U='gBiOqh#́ +x{L]w\`<  .Xd::*fF˦8D ZK${j0:u"aJL; S& P{J-G@ F"l% +Iz]|>$^" +@zxcHo.6<7#S8C IOC1[ *RA@ XbDL +7EJ|eQPGrz[O6 hx{L{Y@ +p 4amY|&""Hס'MJ hz{Jw ++0L8yD:>O=` +杸zpF]uQb4#ks>yҺm=|}ZT)l" 8ʘ{r{c/+ݙVDA$bQF/ځY:B+ + +zp R-Q;z +#9(K]???fj `xzp'  +Vxba2HۗEe]Tn;BC2) xzpn:,+)uQKl=6t?" +nx{(Hh5W! BV}rT_aRR9 x{Luf j6\ OX xvx{H\FՀ?^轜ip-,|3Ό xzppTSĬLOve~ +riBŎ + " {L.)B~{ +o"B-37 nx{(H oaRa0X"ʱhU3J${F rP{JjR&Z=JlpnۈOLJS<| +P{Ns╥/%ݼ#DPX6[gI<" +xzp jR9* +хrAchͬvhʣ84 ТX{L4А0F]̹;=Vd'uuzgŚt] X{ +LuVhDE" +B0(Ԟ~ +.80 + ~X{HjH@H{q3Pse/Jb" ~HT`.欹zq;(h}Yezu) +~ H_$O`He]({ڿ˗ފ. ~{H*X>nu7j)8`dnXHL¹D$ 8~{J8WuJxG9#ENp~:N}hK +PnxK(4Y  +83hahTU??I" P{N~>}@h +'mcQw,682Nzp v{HS= +RKo_дӳ,!V]Z}K*L{ ʘxbpҰX=,zA-ᄡ9o#qR| ~HDe` [.u$]6,?>" XZXc$@nʀ5%+$> +g㌿BǙbp.; ʄP{Dsal@-kՍ( t}xp4f$.|_ ؒx{Lpj٠*1+)lA (3fd",9 ඐxLkr"7gLLR VP=t" L즷,/D/n$ISm$4p Kt8 ȲXLu7 7 +=BjGrxf{y# 蒄Nq+vk2,'@d36^Wkh5oBI PLxe?=K`2:h ^G7L?" +~PH;݀3u'ұe7Đ8J; 0vPH }>MrOfBLm÷r8z ~H_Cn;]1{EFsv6{2m]*_ +֙zpk !m[I!,CSV!Qt䔃WbO0G" xL~D ue@3 0JVΞ;6O‘r. +Hjx^)`Pz'Nl#H#gy ڍp* 0mdG|M q瘾 +XLmAG)]t0?A:+IC" Lm1qq6G#Z^dKNj,Ec +Xx{L P O?maTʲ%Q5Q*4zoX P{LnA=@%1[l%T!3B9 ~1 QŇ ΐx{DpT$q?ݍԱYԖ8" |(NPր ( 0 ^)1f>\vN5 ~x{ H,@${ +huVg6:T1 x{ +Lg=~hIvxMқ& ;`M3}QfRRDh ~|PHfU"+Pb aH`(F*( +" t(HB8EùPhcG 9Utg vx{HE7T  H `JY`+U~thqs h{LO $`HQ,H ]ܣXD&-S rzJHw)ޠQ-BL4=ݏzpF5Q4Y" XxypA`#|&ؤ +`^}F1?YFa +pLrOv1i +ptH@g%w{_ v{HU~cM%2\>DLY16;pr z|8{HQH1 Y86iEal Ɲ%D" zNL ЀD)*dfmYu֦5G `xM$zCUfL'%U^ _FxOEj + ҕzp1K  x99¢lRa_sPY zH?ڰFR K0AP9F:2]ԕ"" ТPJNOW%t8Yw嗵v` e +{eyxRn +`z{HW_Ѐ +Ck6m6*tBJ8v zDLVw.nZX( + 3ҕ/ʼ|J`  +p{LQdJ +| +8tB9P" `nP~R(F I5PM9 +wѼ_όjJ +HtL:yyI¥8J$,wF` -GYJ  +Ly qLvFBuoniK#;!?|> +NLw0S;ͲQ c.=nB2aL&5/ ؞t(M hB33(X"ꚖmSt" +O>WTbS´̈ъ/"w +߈!z `L)@ %.IB +,.#e]cR- tMG7ʀ)N:2$"bM)*5D +j PLR_j@]JAF;K-" 蒄PLO"Q@xR E̔e4/Vʳ_+O +XL̚C15Ag)/N .,{ nf(j_2|2{zȩ*=fч>nj ȶPLS-'U*nʛ 0Tesjtϸ j(F&" PLV@q@1YVcZkr +XL>?@0ƖM 'qgz W3>8 dP nXN(ayH7re{`2i r:e`V jxN(Cœ5 ;I&C8 +bl1 + +e$" +֕zpSRΪ@N@Ss:? +œHid 莈XL?Ɯ:S$Z=3M} PnX6( =H0ȗo1tP +jWxqUIFu ~xHQ}lسoHNi2Ӿ" ඉLff5(12MFn!NYJy@!+ rxHq-nm4-:`wˬTϛ^ غX{L[Փ.#hqbZ=\WX +0⥐zJq߻րJv+8^g#|>Ǜ" HX`pƒ~55&P-uq~^_9 pXHp~,~>bH +pV9J&s6_ +{po)(c.>n:+W~ny޺'oߎ+", ޙyp F7b;dQ` *-sfl?.~}G +y:8{NqzuYR;,. 21~fϟdy8(_ |sR^ OEn1V_Mٞ^dҝ" +╘zp_~P cLÕP*`P%":d!]b9U XJq r H,w-2#$8X7I +NATڙKfhE΂5}& =q+UŖ;G72i xzpPY^_yo4DyL-OU'" +`0Lɠ�@Q?")Ɛ +l,uߨuv'~7K {Lq`z`3gՐcE@Kycx60 +PL_!Vp*,DCQt&)ʳ.3 „pAP +v$yap +Bʶ&\w0"ec" +Hx{L]rb` +Z},-9(3)$VB\ߥ= xpGb`mtѠ=h%U9jǧ̅Cf0lD xzqp,< _8ڎ{>-ya" +AXzpJW ۱$@'CG5EFԆue +7 xNL5K9H2;vl*Dxd˜ +؃ 2V9g yp~.۶anWH)_P8 + {L/_.Hey!=A|A/2~NN" +֐„pI4Ss%KE* L^EeȬS[PPNa`F{E9 貑LK  MP.5 +Z?N2 +~H +}fՍ׈YL8$b3teC?" @L %emsf?Wa}YGyzY +8╸p63ژ*4䍴|_' P{L ߣJ*nrˆ6 h$ىeO\ +{s@ +pvgf **ӋaړrO?\@"[L + XWqܤMGtܜ,Jjsu>u +♐z +pbA9P<WFVôQ+`T!? ❘yp("''Zs(8IǛ$42iWn xzp +Ⴡ c!~xͬsPN" +!>yq%!EUD9cckFdˣεw XypTV>J4&q0Ͷrlbɒj +`XJp. +K0$fnk sd.[-iZ ❘yp;_ +p%6K$hR\W0BZ˽" +hJpX +{T?ʲǼ}oFju7'5 XLUp40ߔ_7~* ȊKLz ހevF_ 7j$EעA-8_/n +⩘p47^H0~l{rG2փ" +XPp1X 5PFrBUpSZTo ⽸ap7:F(MOA4ِ +PPpoy`cL3r{I&JQZ]W+ xzNpXP܈ xQ'z%dxDRˡ_" +XXzpa &:tU|ѺJJ5W=` hxypGÀ_;fVz ̺@L$1{Od^J? PzDpF?@AcL+YԪܔ'+DB:: xzJp 7 +y'`^: 0LFSXCMw"ypzg2Z,WAXCa*@ UZ8d_F +:8qo-f"9_f[rj: +PzX~Hlu|` @/rDkDah+\$Z0fd6Q ^~X(]M? +y4La^r P<9Χh" ඐX~L',?!Sy(atdȟu ضX~L?~ ;VEfsP11!&MG zcVH@: +xu:+X]DWeAv? ʑpRz];۱Cdj4boTt|`"." zpoހ .UY_&06 +6XBu}zZ> + ȶP~LFԀ +4X>CT61$c ޝz +p9^ )wVqUpL)$?r"C PޠyrB?Q@6]LCP<P"^KmSQ" +P8L@2eB,\$XGUB=^ e<+ {H +Oze7  FGmHˮWH{ +8zDp~y /CG5Rzeh]Q֕x ~L,G WX g@J a/?&" + xzpF (Hd?Ea<[1D}#H;v쌪 ⡸yDp%  SVq?Se!6. +JPYrgT+i +zqP$JDBN>U⅛$msLl=U ඕ{L{7_g +FY& +r iC +](H+QSǐ" {Ll' 2",\c3r`$WX +hn~(wu> $ Xpdjh9TUCRk1jRe ޙzDq@0noRpfMyš'tdwR ^P{(B?i~T3R2B1UOy" +ބ0q~Q0t6G1%CC-g +܈!+e PLGY)_!z ;a*/-ʺ _z + ♸zpXԼ9~YeIC`Z!e%偍S:2ea>V¿| cL?&{@'v,01 \#J ڥI%` P" +8晸zDp\} Fp}h?:uw8] Xzqh +U`7v6h_~pH taDP^AD8 ({N ܙrh4 +YSE|.Z^ Xyp% %N2 I+R&a")0D" +PʌDr &֍1Bl8cīJE PxzLdd&wef(.9En1303S/L1 +Lݨ.Ì@&Ŝ;f@vx: rH> $)Mݦh\"|ᖢ/5J-G$J3" +0PL;ѨfU9-aj!zlT"ig< P({N]r efU*Kd +(L +S@ w6xLF`*ևvf4­ +Q ΀Dp!گH1'YC&&.("w3%0* 0{L_@v2dD +z/$2?cgTu " pn8~(ն @3$gp +8!/*; +nx,4 +X{L +TWa;{qr"TAKNdz 0{L*:R +v_@%<!~f[֭4 ʕxp6lɀvt5kz&#YR)?,F*P,u!%" hv|(J +㽶 :lǯAK?1c<ږB +8ΐxyp1gnB/_޽Ƞo I% Ɲzp͝?О`2os,#<q-G<F=- ʐPDq}M `9*eGL+(` + M" +ʑzp3̀ +(F +KM=S+}Ε@S ʔxpW 2mn5aRAςu*a-Ӗ3 +0~PH&2­erx0 u@`'p2HIVez ʑp-`ջK(䗟t!sDGPy"&Ժ90" @ƙyDpJ`E ^*E& [@ATUx +HƑ„p-5~LPe_'_:JDW ^N()ȵ- "!@j&@GD"V +@t(q + e%,# CªPÐ &j +D" +ƕzp RN64cO7SqtP?\yַda ʈxp9S) p%:_1-6@~B3Q ʝyDp?v\0Xqi4A-w1SO4XzP+< +ƑpwȀ*A)E\(Ji›:sR-"ʝxpX:ր 8BCd?(u4 +PPLU KҰCEU3/7(AG x{LW}r@ hrZF0 ~iMg{bhr ތxyp}j +FȟHCHr4&&ab{" Z(&豈.MujE]?@bS- 8kmkKk[ ^x(ۖ`5 gcV&Q^Q4?.Qqm9+-I + {Lҷb #XF\0؉Y]/8ѷ x{L @<;!Y y|ZXP!G?Rr*" +XxM0!k?. +"DŽhID$FbĪq bP(*c} p nɗhDz.0qP N +˜d$p&qSVZ l# +LH]а`,1D"x?;]" X{L֟ޟr$f +gsUʔ:)evXYD zPHqX퀀K K-8 (,2 +[Z ~x{H +o" O?w+LbSj8u?' PLr.X !q/ +hJJ.ڰu z"sx1֭T +pΌzDp +04mr4MCw$30:j݈ p΄8p% :y:m$'@" +IߎIG^H xFL(1J@&AҋF#V~TJ +΍yp?ܐ Bp'$d :!bFX`<oy" ^K(2 :]+iJQ!뤷YͯiT^ {LH(mٖwuȟ b bC |FL69$@3)j<'bW[bUa" +xPp +k\G#~a!*Tdor3Xܥ r(JbmY_ + +Ԉ\=^54_s k] +{Lv_Z  7倀 Pqd<;*xϩ ~cH)T¯"^qȦ#10ȝ" +XaLpKޠT0\a|3 LE3Wqv 0⭸zp\g +Q'M|?UPk(boM Jpo,@}I0 +Vx~Hיfq yp3=@1113d֌P xMpguoB["8apw0 +v8 +X}a$jguПX ⩘zpЀ&eV y<4:Dց4R_O:' >8{Jq1g@5R~Ԭ@ +Qi6UWc +Ppu`xץ \ bAYꘙg9 +BUd]\ ޕzpô@i\)Sw O$,+ dCCJM$[̭8 XCLF:j`nE" +_F.Eʹu +DpVJsaewu@ A! z" H~DLa~.X[*ٞh fe $,d48] +{L01Utym0M AgMt9]K JL~P":Ӎ!PAfƳ;` +HΑDpƒ}g`z.zIZ8w +[P(g/" 8晘„p8 ~ $pD/~2nOcP X`poBQ"cb"Nqn_ +zJp ]}t<;vΌd9{ ⭸z +po T|B +2?`8K棡" +p~@,&8lw2 +{_e-:"rYB)؛ :yq"V0sQ(𖎩}vOP Xzpc+Hhsf-MY9-X˭_ +0pi-Pa&UJݍPIP0LIZQ" Xyp 1P(4&9?i8*[Չޯ  + 杸zp=*l1`D1xܼ T<{o zDqF?"CX + N'e\Q { rF=G}` +C /lH'KT J&?h9;"zp8˛9yj`%r7j :bq9Àu/5gDj zmYo"o? Pbp&0g +Zxch)hfg4j1w +I:bqP&P %H?H5T“b]d3o" XXINp4;{ˀgU8o_O y:zqzP +XmY$ d +m+IT̵ U.a (pw}$ģUeڈ̐A(S CSup Xz +p?P +ANoPfE/" @Xzpg'PZͿD%>#97it]# +Xޡzp`wԀKJ&g,1*&hki' (Dp.uh2ELh3~EY=]| +8DpP?YJ pabz2O}C „pOn +$H$P 0#e,Ɠ +c Xzp + +3l3nL,X(c=[gK" XJp +ezOт'.Rcx8c^mzy+ XJp@Հ:"v*e +SJ< g`r}GZG Xzp47 +İl{JJ|tj@mJ#$9-YyW?>n" zqq1iTD|hmo*m+ 8JpyP%2"c8TpDق Xp!`j!FZiAq@s_N5 +٠y9 j?7 xyp3݀|" d$+bY1Frܹ| +0Xz +p5 vD\rHpKQ?͟| Ppk3 NP4BP̀$ Ɩq [" 8Šp +p!'ړ BL°a=] pC} f#3-Z~,sDHGgGнM H(Jp@g IB%"RStT䋞uWv - XŽp["BE>;E!yRnク" +╘zp +o_"4 w E a* "G? ⥸bpo`AKeK#G[09 V8q 2p +zp_\b t)'9gt3 >Xzq? +t\~+mvI< T%q%/?" 0ap6z@G&y:DK`+ݥNTn7c} +A:{Jq~_D)((q*wj +.(Z|i >8{Jq@aAqmg\IΤ> +:yq?$Os1K0N.d '" @Xzp`c`;\TEô M + ʸ<4W^a) +>xyq7c _Bd] er*:^N p@@۟$rx[~ zNp;iɍ4}1W 8a?Ay7" xbp"ip I/yl;[i zp*X1+ wb7S +v& ❸zp7ހ6v*#"k*gH=sh(K {Dp? ΓHe +]k .rIϤx'" @8zpޞ%TW96`0'pJw?FyOC + Xzp/7ޠ`,pHn +gi}&ix~ 0L;,,p!!ue)qd :zq脈L?I(FǤ??'" P⡸zpճw)> >!'3jS@w {Dp۫xT݄`myv%6 ku M?c ∰p70@*8c9du] Lc)uBb8g ⡸apf +YгCP`x{-# +`捘{Npx'VI8ۦsFčJe!u~in" 8x{Jpf~a4关!a7瀘p*@/ +_\ +):x{Jqb\a/-6ԱoRuC p{qҟ$N_c +ۥ5xa>@@i3cy? ڕxpa*nw!ǫ2bkihF@>%V" xp['1Pk +_T0M6fF ޑpz -~DW ֲva1 +ԚsW ♘pn~ +j"u4g,P N*f)b4o 8pM?} h5Vوu&0%=#)diߺRo{" pXyp!)#8Z4@] HzUowj/< +`敘p : z!!++`^t9 ТzL@8:VW5luZ̨BnnL0+N'嫔M) +XxJp-<yeF + kE- +bŒE" X晘ypΆ"gP E6o"귏Xā_gC rRWPQ81˨f *ˊv+z ♸yp l5v@;eYR +G XyDp +w+~w +K 8Zi9ޢ" +`LM0-xZcݢX˷OSe$ ? "({qOp8~Lkf:@Ru-ԡ) KLH?nKYmW +%&'~< +"4v}eFd{ cLC?B3>BHwJOAtc8xEO" 辠ZNoFH(~n! +PbDh]JZD? XqڙF1qԝ Z |gN/1ܪ5D*f + PL_9䥀748ˁhɄ Nuh@ X|Lz$u0 =^(cldӻ=_" +(ZL?`:|K#,%q}@ GIG[Am z?OG 8DqO1ق>,aq>1'  XDpp;qxrݚEa4` +jj +"Ff'  q >_) R</9YH +[ƍʳ" 0r>7U@N¥%<̳BU$ PDq!Ї"oI6CU 4HIp;_ XzpfၺX +/A((}+n{;bO rz|(h%ڂPՇ A`fl(yO" +8pͽ?L _BL`:tH)4:n:ES LrO;6fVYf +3<İ/̋:KD_ N? VrĄ+b۟tfK&475 8ĊL\ h#W4_rg>>i*eE?" 辘Lv4Ȁ c$*n*A \uvY 8DpI@B(C$+Ȫ@,V4'9}RC 1# Nğ1ol!OT`x#4BMM>XEQk +!JqO?h&О5N'sYZ<$ " 8 +L~#3jBZb?!l~<ʂ'T{7m +H~L"P9~(OѦ.4F'd*ZՒ_3V8ڿ 辤X|Lk; F 2~'H4,eA3 +LTt +Ѝݢc Ⱦ8|L|X~# t,,}صRewb&€Ab~" +`XDpUOwQFZ[(Q-CMV(wexMFrZvxXK~* x{LeyOQ0]GpKxfS?{lk" +6O +)XqmaAj]^eG +uctJg_QO Xzp`=Des26WUc|Dw XJJLr|L"+S ZIrQn/4Zo=N" + P~JL`Fu Z~qUi#%Xl;6 ~L*7U[!ysz] +.=?& 0~DLހ$3 ?{bJzlz)-uSF +q;T3ҰI YR6(; 凝7" H~JL/oödTLЪR|@Oc ~ +NY.!(pK$ORk|վg/ rzL+dE2(E",2IQ!X;v Θpʀ1AMdhhb̈]sZA?g" p~ +L~߾+ j  0 +Wη?/ + Dr~XCQLXDQ$BkOaZͧWvN۽ ʘp=Mh 8fE ne"i,5uyye_ v0~H_P##6k`p1fԳ7z .fQ" +ΌDp{>VZ~L^Z&jNiЬ=Qv jo? Όp* +MdIC@FtdbaXpT3Or X[L_//z}وV3޷TK$tCWGx +@~LĀPYRM28zJsO _z" v8Hҿ@SbJ8,84!1lN_B L Wo=Ryq_LhyN XpC]y.ŲT1KQZ[1Nxeh ~PVH_~&| c' +4pD{(% n[&銒% 8as" X~8Hҷ.$ +4'p!C7'0'-7?O_[ Δ0Dr ]!W_W)O5H}Y +xNLuաD`okϐxUuஙċ%7_ x{L/-{f'_bFc" +8xLѥ k0w 8А5X +ݻ˘OQV XJLf:S5^ +&X婽#— x{Lt_vDqOxQ~Qf:QW vX +H?KL  'yÀ~:P -8A\T 4" +ƐXDpG 4 mC ^xo)3Ҝ> x{Lt?%@=sbf/72 ;J +0x{L@ǹ'@zxDƛS'u ȎxLgj@}<e<ǠZMJyWQ +" 8x{LUV +HT1"7}'eQ}+qܲ + x +L W1 +)]l +lcB`nP+o3zs ȎxLBà}A͜8m~CL-ֳ?[&9 m x{L)@z+1@}i,4[~" +vPJ{ݪ8SPO:(>/|+ `֜Xzpwˀzdڋ(w)>:9vll~fs59Mk 0N"QnzF`%`Aj o5*2ygo" +Θx{Dp^`(xd)^9 +Ax +J%" XLED">s +z qTOq@_ +^Ƌ +aXzpQxUUd,1j1zCc ~HT)=>5g~: eH~cA7 xL:::YcMMFp"W$l61yD/3q" nX{(mQn Wuk {҆ + x{L, A%46p6jGHH7PmGc_yW εypv>8p* +cr=/m~ Πp 4<⊭Od +AS9=vo9n/ ΠxpbN 8Ii[.s-goK +" +ΘxDpFIlS*ǑR*!q`#10/T, PfJNaMHH`.%\I}Su +zxNĩ +~0~^H7@jj~3X3AR͛k:h xN +LnUDe3肸lr`(ىrAIZ)?swo" +~N߯;moq`)ŷ1ǘ2Sxw,ԁU? ȦXfDL9vμqĪK Q' rw}fѯ xzpU  !0|bkcf̶.e ~xNHH(IhJꅈ'٪Mh{1" Ɣx{Dpi5RBpm +3@>eȻ?cH +ƌXDpe, +S}`}LZO(A4аb x{LWg5\ x16B +(ƐxpүAsʀdC +$Oc + ýy|" ~P{H +w@y0˒'2Ca&F{BEo ຤xKL J5 `~~`sw!̶wwSv X{ +p8P;16ǣs3Q qA;fF,R8k#Vg:y" Hⱘyp=G`)T Dt3M6#i9IP2(ʞB XIDpx/I!' U>̪eURRu3R ⩐zpP&9']r^*0$`6eqgF +app;I atTY0 "ӫÓ" 8x`p@ʠn_:Dw@X_ü̦0}ͧ +pzpz0;CmyI _- zp, T<=0/Ph1<r[ hxapޠ6&v%,P1.=̍Dk" +`PJpx??;wx/+Jr@ZRHB_S2p= xyJpoxf y#2&CXAŧj#^ XDp/.pfx}'58x4L[rH Xypo٠fLBR*~]$VP(PPrC" ⱸyNpa@`.WhRg}U +"~kv95: zpÏ@1AX+vvab%qMig3{7oW zJpU᫼p,Խ" Zɶ~~pvd :Xzqݜvvr + rãm4T"zqL",&|ԭ3d#aWш0+ +hXz +p tKn'4FB]yܨvv_c| p)H,@.Nƒo +:wW"c.cYWB*p|k xyp jaa1@0XOwm^2Sη" + xpm'wE(FAKelZ;j"g,=! 薜xcLt]eH3IȄl9OxlyHr EY ^x(AgeO93tFCXOSq)ԫs-g +x{ +Lb!&@XW;F .ӈ^-?  +L$'1 {8 +8xfBj" +XLjn أ`Hkg +82W'? nx~ (M)*)Zd'@Io5W +Xp3mPfɒ +u +$(Qq>2DF#6 pOE1cxނJuf;=jenl8" +`Xzp>eYg9Ղ0 N c6ޏ}> 楸yDp$t̡p4a]1Wa#. +AXp!/]u ;9 8@9"Yp~zC" ޙyp B`+*ПS|78a7yVb_B+TW" +ޔXyp;Nwu@paBZ6-d3&̋&oݾQ `(NHۆ=J8PK#3՟3> +XDpϾc Jqb}+Z<0RM|> +|a 桸apoF-D +9-M}ny(='" {L>`15hhI1)2gw] P m +X{Lվ )&BfqS +VL=/_?d xcL7ٺcI#d )HلTY'ez7 +X8zp Ө +U\aԿG#j.E?vAQ|or" +XLdр, =|_BkidUVQ\ ꃶ zpVWbFR^6aPW^4_T] +WGu {L[3{%< +#e xzDp6G%K%-`}uVRљ +" ޔXzDp/f@ykA6;m_=-\tڨvD6 yp+S4%9y؆ ;?Bh {L' +@%NcE[Ӂ:@ MA X{LMz `p Ո IBbJ)" + XzDp>Dj@`*;nowmJFǶo/ ZL7Ԁ:>e/קk' /aZ E놏G +rX~H!Vr7q'ήv5t'S {Lul@ +9<iJV*<<+ӛ'" 0{LC4b5q^Ľ]'[D!5lKK)[/5 +PXcL-mdT"/ =:Gwqu?ž cLm +3D{m<ܪJLLYY-/C +8數zpZQP n<'#XM!џ*V?" 躙bDLN:Ϡ4m)9aUD]1د^ں<-[ ޘZDpQ OO(ޫGb>,U5# 0ޘPzDrm h(Z/5J_RJ`Wq~ X[Lji KXX_ST/= + !H_g" + X{L*XiI۸W"6?So`Tƒ0R:ZE xbDpo> ɬʫ>ƭ +{;[]^6q>$G |Ly/`7YL K(8&(Pl\u!@@(S ȲXcLo:ODh9xV? +9Bׂ<0ߐEq" {Ly<Ѐ  {ՌYpdDlN +[hv;f ֙zDqEz@ + +]2"L&? + L)܇o㩙V +e4/Ɍՠ(r? 8Lv>  +,*W +j*h9P0" +0Ljy.*ɩ$Bh +&&:fg xrJ7Vm`~% +R"Gz^ 8o жNLZu +l(/P2H 8`x  ڐ8pX,b 6PFY8' izqA<7DJ'XQHf7{+w)_J Pzs@(,hR$j8u<5Rɷ.r;ң +!x„p3+X5I +Z*X!zT[rb+~7 xyDpUgQ22P`i,`jBrs\' xypb=HaAGk_~!H]" +xzDp:y7P5SRv'!FǃoOwe$ ʤxzDp@;hD zB8[BmXE ƠxypR +IڻOٺQ܅U?{-Y x{L,zIY$e-!eBÐXEgQk" xypo^ ` ldbr +Efjf xzp?'2b@0ˊI]~oQig0"$ ʠxzpA5!xtM9̄޽ xzDp|}x ԡyQiID(2i@w\|TN" PΜxzDp)>a~qCN2h,,Nwk~ + PzpxP6"B̊\&HjP apw nPxzq9 8Kڔ'7& c&>z" Bzq?:]/)A⸌[2վF +< +XbpZssdPʀvmQ +0jmU(Va$ iBx{Dqe&>Ⱦݱg@1 +tA +cE/"|_ˑ9/ +BXcDq}` +r@Rqtf6QjNiQ}(GeQ" 8zLov\$ZVDFW Q{T ^_ +9 +{JpGQ!.) +Xy$sC|6?q? x{LF2.Xi(N`P(Ms_s:o xXbL'HO +f!P~D< UIo" +aBxzqhO>屇]xb`:| 袲XbNL IG$`>IJb@羢ugGQ J[( +QBx{Dq_wL=L8 {L CojO xZJLYwHl+EC*P 6fjq" +`ʜxzpżY+XN䡊CGEU) +R=%A XbLVD X!oM +.*,J'/.e + xyp*qfBM)a̾`(~tf} 08 zJLLt@ +Bq}a> cq00ּBf +" Ȣx{L |Ad I4?ñ᠜#bbkJu\J ȢzLG +^$- +TG 4aڻ,{ zLգS/ N9S+{ +<ջu + ʔzpHcJ5 $9 }>=" +X{LOyaM֧\:Gq۬f( P{Lnr7y&;ơzº%7 hk{u] +`ʌX{Dp9&r` +g'P@XDx1u:o"͹Q5ڴ_ѕ ОX{Ls`&YBXLNxYmJFj z(HK)n`2IeI5fc%" +Hj8{(?BU2F.Xs*T4D8_Q +~KH[XAiHQޑy7(kH) jJF(O +JjN$ +lcH"ID +iBxbqA? 8> HIѷ"9Lh"pФȶ`$|" BXIqWz9(leZ$MH2D0i$q ʙIpe<τ-GPq9cOQ2nn;ow ΕbptڰHe aH ̃g X( +'?@g p2JL)]pxup CWZ^wˇ^c" ʀP{Dpe Sy"_>bIv$5! +jK(r[/<@f:dl~eyZ +_ jc(ˢ|O1q2^R}Cʢw + ΄x{Dp׷ +e,4^ PLՐCuFk%j4.;rȀY"XLs5-TvXAJu(w +Μ8Dp&@-Dۡ"g36^5CQO Xpݾ|~;(Bb(k. Mt]Lȭz3^ XLoؠm^rʫ +]Cd" +XDp bϟK@g{L/O2g X +L'ƀ bEi~;:LRU +ќ r0JAGb{ַ?KCX+QG? +֐p(V`FF$SH.Ϝs+}9" vH2ĵ )JH9+ K0M:V}e2?Q|; ֘XDp|i$b p!R1MS/Y}J9 rXHrFb]B}F(D$|?  v8H34VT=_-Yݑ +D)fX" ֘Xp֚ɀmkrjnE9<m n0~*@r2Uu]< +\yXЍ󂏺cPo] xLzw "Cr"KJHY}QGkN- vXHY)h~cNؼRp9ZAĈ" +@XLX+Pmq9>Xӂ=ς?ߪU=0 r0J7e@/Sx|~5~c󿍴.,g rXHH)mQFJ护- +f߃΄hu~x?ǖ xM[tP9 h\oXu9%kNؕ" 8{Hmb YPE5/) i6.˥} EeN xLt,x'8-aׄxW*FJ;1pm +x{Leoe;Ud>(@ؗ.+<<pUiwTpa)0 hxzDL>8b >VD2W+X|\"B +hxL6h- &Tqp\UQj_= x" +0Δxzp{u d]ɖeB18G=A?u[=+ X{L?[Tɏ +|툚uzv%g 0Hb`pJ 2IzR^6a+C ^xc(2U`Th^iK}{ + w}}I" + XLjl԰  (HX +x+s)<M xzDL +v򙹶 ` z0r`ɪcZfsK}D +vXHs83 0-_D8\p j; жxzDL=+*4(2F&H5v 9X" +XXLΟ + + PFf;+s0 +T-C3/ ඈXL{k]}nڔ3h`#<zyC~CG 躩bL-&2<ibX鰛#󢋧_? +PژX{pC*Z[61tryr⋉gFӉ|" @8L}('`j ܊rJy1i:al7} +L~ aPl6QDqDK&dS +t?S!5e +XDpDL0z#Xg,–q킏er ؎XLwrlDfPcob.LҶm6a(O1a&9s +`Dpey/*̀}pG#a[!" HڐXDpE@uڋa!BH +\$A> '' +g 0L,24+2)?4LELr X{L̀)z> ni` +պ ,d zHԡ)A].j 7C#8&OZ" +rxHyVmep{8X$ɲUqkpby ʜXzpWjoF\!;]?)jY +xX{DpcY&s:B&)qd_˟ӿ (0DrMU3ֱ]|vrEİvȋ̏Sn^" +Hx{L Whΰ>abj#U>N>*94rYt8Fj rX{HK}vBy Ԃش/ vm5/o?l XzpG +&70y"**ZR/-/~p `8yp)dDyb%:}3\Q벜XD +8{DpA4xilA&(l䪐刯w(y r{H5]vsBيn{K< + ^ +7΃" آ8{L51Z}%ma,{yv +xzp@~q֏F@N։49Ht1P}' 8~HN_P3YKפuXHˠ&]ً+@L׫y_ rX{HO_2P$(gpCc+*gQaO+_" PX{L\gr%K"2)tڴ-A:Ԍ6#GBWnm> X„pTL +me.%4hīp0J +քp1W0X_!FI@MO +W1~W" (8L + p +JagR3+%j3N`I8)hb~{ +`ք8Dpd +jTDpN>f<`Ů{$R XL +uPLAaqHDZ& +]c Y +0„p5A3}(X$VVd:t"" rx0H@AMwE6+ e yA%D ypA@6`QA>kXa?} 8rPJt +M^O+4oX +7>xJ/uB (PLu꾐=vqxkDv#c>Fgs" ~ +L;w w+85R?⌓K*EcOCYᱹQ Ρ{Dp?w7z47QR@ +f܅ѪKwi~J +"{Dpx_fƙW5ݒ~BAUED+_T xzpΪ, .\& PE C|P%" +`PLـL#䩄}.D] reH. + x{LTouqb4, +S*-~ eEVNK8F4 +0pDroLh5J P<;Pʪq/ rJJ*ץ`3K/UGfJ)T +rαQ" A&DpjVdo{&=G +8zr!|\J,\:T0PqY0OIhċ_P% +8xzLTwry:([L"H)Fa" x{L obRjɳX<J XڞsX* P{LV!@ _X[ɻ1V3 l1? +zp!Ԁ)Ϗ£ڒ0]ex? Xx{L*aPm6QP&z! j9&"Gɠ" xxzL>ꀀ% #k|EC+h?CSxv +8xzpejJ +=8bj4՜C.% +xzLZ ' Ϊ(X`C~P?aR ڕyp$UC߀%UGЀ_ߑC/Ǭ< }" +`x{LP3^MI'FšF q+3Dp} |0{LJ#.ٷaܣǮ|TEPb˭8"31y +{L^ 'ɀOraZIO ' ~/o֞ XrPzJJܗ/{ +6vb.4hO7 ѝ +ІX{HzX]ݰa1*oé ډv4Qhd9"bLoONTvY 9cI~7 ֪XypM|-{#2v B=wMH L +H@7OEWbp_UHXf~*~a +u ȒLdzց4?R[= +"-\M˒bU= " XLo;F{0Q@6!4R> LT䖰penC%cbn:LGY] Dr}ȍ8Ηx b(Nc՚T Dpc7rH +nV,Rb/$ 'v|iuv +S" |LϤܢh 3)AJy[ ڄĊpoZ;g0ow7+o\IǪ 8NLy +h˨tjTieJTA/Pڝ{ +`X„p\4nz@R1anC) nX{((1cRd=Wmbx폕[Q" +y*XzqnMuGo{8=UOx `ڔxypw_B i rBIP"z2N5X<+ + XLK~[P49,_B* +6E˩KTt[ x{LB9P1:E3 )CjKM֏?" +8XLn1KH5z_MyKY8!Dx7jqxʄk3ݷo x{L@k)@!# Lg?/(8 xapa DYD +g1RVq.ȣ1lsr {L}_o@ xъ C],t@" XL]5Z Cv +I܄ +,aXX;jo ֈzq^"k!=u}z:Z-u^o0g* vJj]YSy$ЄMV4R +,47 + XJL`vYK!~N3 (Ϩj;u'Ӥ*{" +(|8LHb"+[&.;A8J]n + r8{ +H  J, ] 3掯?c' xDpJ +|& +&7/[)e:'ʓm# ضX{L'6aM9c1@n4_\wpD"زX{ +LP \fh:lGD^_j פ[Q +0 +N" "?T1 +1 O+1 +nm/O pzq_Ӟ=@,}m%/ +> FYڇ# 8zqi- wkPgn)\ +Qg +չW恖" +H8Dqiޠ adLZ裿ʘ"6ݛCVnnt XL + q0gf2ț]ٟ>b`Ws?n +X{Luf@ +PgU-G6`QN= ֌zp,ہӛ*w2jJ3Fe$nY> 8pP_ }H.G@yǽX" + 8L4[}s;B1\LF2gE{ x0LZ2 +u;Y@PhC( +G| +8L@ <}a>I&$e&^N7ގ |8LK)l,O~ +TkhD,DZ^ֺf2" {DpѤ0ı$ieny4Q|/Az ֈXyp6^ETn/A"?8!k^ ֍ypҳ*A5ln̋s *wy> |0{N撓6vhB@`8&XI%D2" +x|8zp6dn]U h򼛅mJVA ce: ypCa 3!ɋ)N\Սna{|0-EiB |{Dr󟤀߁~2 +E" +/@Qt +G( XzLA/.uDtzf +?z,$eM" +PڄXzqV 4<2cʓK !0E- xcLwJ +D6b3AO8)5]O+_ +JpP;&=4,S$JK%PH؟ LN\MX++# B4'ǨpDt" +X{L )+FgR?ʓ>Gfj `x +H6Z;3s5]bⶠ@.S'v xL_xQ2G@hSBvrHL xLOi؝it%hMB(J΃ug" 肠xHeodSQe:&ȺX9^[EbZP1 @xzLf)(B#TT =MuL8 =;u xLrR +0?c3}@;;?0>,qk xH?71G @1}sT3sgQ" xL{ɥiT eR#? x{LYk ٨jĐ!PJ.YJQ ݉u1 + XLz~ h4%~d.b4>_4KbgVO +`xLMe7.v +))_ ~Y!thm㛨:yhPL" @{ +LS^ + 4^OHp[=]aݞ50= x0{NFH C`@ۋLmd/?@b?+; +@xLԲ( vqGmHftvfZͭlc}SM P{Nu04@!vDlRtyB)W3fmMEGΈ" ~xHC++E + q@YXۤEqXAq xH5%b<"`L7~~)YnCAHa- P{N +~(:Hxx<W /aȵS x{L"E/{Qf\OLح"M?yBa" +XxH k +8Zl/֜ű?rMD x{Ljܰ(N~I6TnĐ<0> жx{L-F] ĉ=k'~ː.u1%3gs H~XzH{. AѤZ6=Ktd+jzo-W" +Pzsc $ %X͆kCϐ!:!',2W4 xyLwJ$Awq`M(UWIZ?lohVI + PLS)me#R[S7M +H +_Qn Ȭٍ_ + PLVe@,5XN qO}~!#^U" (NζWDZ ǽ=$7~1J)W +zJMštVM-#eת`NO[+SS +O vxzH +8m/)ֺl?Ut"i @X{HSPC-j +Yۨi LqrkFE< +XxH!gw +ui ҅o-ٕ޷fH5޸" PaJLuz@{3Ok:v6т M2jף}L~U ֐xzDpᒍ?L`X)RcbRzQc> pxzJLr++%`gv_Ie#f?7 PL}+p5'`*b9`U`SHr" +HXLbݛXFg4a22餟ҹC}ڼwZ 8LO;1[ bI4Kl᳄'=@C< pXLK'Mc$7GE  t?RV8I: +0Nۜ$ +VTeh¦A`2X;" +֔xpYgXEeL4*A|%>Qf^Ve x +L+V #Xh:ߠlkBB]1 +0XpR}ؐ-U&eQtxf5tl x{L@ +I@9Z; +~*x!=|^" +8x{L=:|DeS'%RCi P xLT]b  +_>a TI YEgV10J ژxypFnmȐd2G\; "t.a4vK2Xk ඔxzNL1  4](I@԰;Q"ضxyLjps7)" + x{L|P0"'Y (uV$WC`Yb xZJLo㣘="|l@e36H? %u(W +~x{He-/wmXVNSa^ x{HwwX + xEZ JaYVLUM'}9l뵉N" xyDp { mk}8/T Z# (oaYFߏ (zr&z=%0XE7$BBe%bzU {J.X 2*b8bB\&Q0X1yZ xzNMנEpJj-4M8tUП#SP Xo*qa"薜xzLhp#t.HfH3q/a u%徃 +8P{NjNʒ +#`#7>d- 2 XaL.6iqA^^9zLE HoRdƹs +~x{H}DE:8t2lz&E Յ{6`N"'" bpe'KZ@6E+@£2,rM"#Q= +xKL( +7A!ZHi[`i4۩~x +'6 ({Jx$6]:9Azq'WnCܓʏeV1,VQ +x{LI{ +h>|]A0ţ%| +jE$tLI" +~X{HN] HC;I9|}m/E V_P xcMJJ6t)h/j;K(T{NvdB +xcL{;hwaï% J1X?j>WrD2 w PbNN"؊Uncpжn=dڱ" +HX{H>@ vlU`G,Ԍ+35AQQRN\ zxJDH؏Hra㡍kNfEZ:>| +(~xcHMz mǾh4yhsDDrCJ> +w `vx{HfM=͘-1W3Ry5:@h +x +Lr@GuM`gK7 +5#vn,'" XXLzH;m/)Y# rY޷= +kZk + aw 貌xLcR ԥGL`GwRWo'ui8At`e. vXHMHؓ[ q2%m(^%W5Rv xvxH6Ҁ-0;E5rf<W}yuJ: +" +`xLd{- 0V.L(ܱ+@E!, ߔ|A nxN(+vd~9թ%>&yÐ# +8x +LđypSߜ6UNbj6eE @P{N~9˶d(vj+ XH,"}V@SH" +`֌xpMvxz,W1f jRq^]B xnxN(u@9܊KDq='*g]7tPw |PLHEWX 9M +-#ڤ?} +J>\l,1 jxf(Td/50LD6bu)Ξ+`a q" xL.m'P%i.%K7Orέ xL`Y;E+ Qd!D*֦Z ju +PLX( g%JP2t?m hN Oi +qMjΧXC6RTuL +j)" +x{HJHO|V$0r w$ZAxK ~x{H\9 U4n MJ&(tlqD + xHj{Z"I 挼kSL;BO+%B 薌x|JLPԓR +ΊXVdZH +53p4!" xypv~xQ0 +VբMa>[Gf"'~'KCp +(x +Hf)H+ͺPڭ)aߊջ{z]Ru 蚐xzL`]h\i!#QxMI-'tG' +(x{Lw{j +C#>YNG4ʆyT" +PXH )&,K4`ڠ\\i& xP M( @6bD-A%E"kFL-'&:[jȎ${m +(x{Hu@K%b۟s?#ݽwQWsF] vx{HnR;b]ʀ\ݦcvmꮯtηGY" +xLNx r/2_@ռ[ Ȃc +H;-T=(_& j%o_xX: + P~Hњj+!t4@$-9y!Rط)g P{NS $a_!@ӆkB<ʽK" +x{L?g+Md 28JvU9)Қ +X xKLwd h% bHN 5\zj :^OE {L*[, +;yq^M[emqZ#9[ +x{LP\`Zo J[Ҳg."w+" zxKHR)m챪-Om  +(82(,q+, x{L/Mj[J3RIۮ.ᒡa xz +Lgnʀ)h\y_5Juχ?, `x{L'\ѭ`_i$KU0S]b]" +Px{ +L*TYrVcrkd(JlKաqju$ КbLПv5.]ع 8Mt +@x{ +L{`.F_J(Wnn2m-^ߨ( Pv0cJze @5Nz+r3~7W" +x{L^` +|}9Ns 19EC pxLv% oJd$ԾZ!-Jt] +XL+M} h'ň˜('hm;ikxP9l nXf +(Enypng.)x4xG+yI-=h| ~|Hy͉"hujW !GU z;/" +XʄXp)jK\8hHN0+§_9:w:pT^ n8f(:@WLJ*;-m9nQ<֬Fs %P زLTZ̫V\!4Hr]@ivmϡ `xL;+h}g5@gFǩX˪ )=f(" +8~X H#ΗPxoW!X{bA\0 pxL F? N\>?!6n\҄zcL ~xDHrTkNl z@@O% +'5 8y~ nXK((tH" +U!\i1J" xzMť*ě 5rZZNlX-Py"$i1U +!CĚh^# @Žs + n9V[ /cyG m" pzq,cR!g;'EB*T@h47ߡ rA> +מ.Ix1D"7T[G.P Jpv +~mHToƔFQ\cxńvЉC ֌PJp="3%0 +0[kB)" pyDp75Pept#6+>9[ԛX# + _w +`XNpy@ +)JtlCX @ n 0Dp,>[bpϜ _Rt9e? +8p,> +k͊K)DGFPAR_;g/" +ڄPpMX0 X+7/5~~Wg yDp%gv3*`A XXU&+i 誐x~ +LP Y^!R0rSa_O7eO PJpvW +7K)H- CY_L\&" NrCKf*:&Oby[ քPpBrḽFsҴц)̒dߕ[mJ x~H_ !)٪T CTF-^8h h֐Xp9PbHetUI=z " zpԺ%16(a +]LV2)VM S +@|(p;zP@7.?:X'|8x'ºb/R A ~X{Ho?`.UUCB@?@r殸etG p~@ +A/9Nf\" @zL%r@B +0lKPF1T#R.s +@ҌxpEYDYCOS#UTDU6AFW@õ ք(r|܆ȲT=uIh 1W;&o ҎXpQBޤvL$'P~" u +sqy/UUO" Pҕzp/ goTAJ +U 'V$9 +X{ +p/-.΄ltܛw{\ed8ޅ_ | +LT 4:MjWMƾkXU\meQ xpրՍisYqB&KϘ^" +8քXpر} 3H1n]n>A]cxx|Ndy ֌Xzp`Ͽ5^'z(Z*qK{ Ȇ8{HP+@j!T(IF̨R_ ++|y + x{LG^}Xҕ Rb¯D6=P / 8{LoOf`?)xQL=I]$Kx:8?" + ֈzp8|,Mr'@ǀt">k7\߿;q +XL<2Vcƌ<$v( +*fVʿ ֈJqъHΩ`ᨔ\P.0,rduG XL^\?W,G6^z3@p62H2" + քXps)O(f4% R*񬃞j0L" Ҍ0r' Q8FRM'cy*$@9 0Ґ(Jp[ʙZ$# #5v,ʀraPo ت{Lp +^Y^ Otr!KtŦ8ʔ aqj ʻZHlqo`BzaԿB?i" + ڥ{Tp0LնӕP =<>9`2 Np79n +NS}>Q?,=)va X֝Žpܣ34aɆDT7LG*ȿ p ”qŀr51j;M +".) &FUHW8" +`pϥC hӲxk.1HO`SwUM xTqyP +5.`rhu }[B pyr@A8.cdN +\aSR0MC*Ϙ- +a@ZpB_@<3 HPN{:(IAE~P'" Pq,]|aa,J0MWpjt%CQ^8K +HҠ(Np`u0#ᔐ4D?w ֬Pbp\-{J@Q^&l7ώ4oHW hֱbNpUH+ꐀZ +%Dg6"" +A0zp:>s+prDX]/,do0? ҬzNpH!RTS%H<9H79$ +~ +zq6&GǍC8ԃ}eGYj}N^ ֲzDp_D RКpʕ&jfBW>" +H{q 0ݨT74C0T䨏 H֤8zpo \9]vh- +|sgo,_ ҭ{p hI +"r2kMht zq@}#$xADjnF" +xq|E*O!.C2> +!Lm"Ye͝lϢ7F XyDqoP*Hs RuH><=bwȼE zpoG &jI;?-SG`2ԭ%I zDp  +;P DQ ^" +֜zpGԀ)73(P|`Nͧ/3 xHmAvYH3[1KA ֡XDpT()E)qx@rp,;j{BJ ֘zp +@2zGT8ցL2Y~r%" ֥p;ِcjK/] A%/=PG3 ֜8zDpi` +LODS4Npx99g'=17C Ҥxyp~"b#ik"q.=`%婩o7+p +ҘXDpĀW@@%!Xĸ@T˙T񸧕z" HҠxzDpp ig::H!.{r +,0`r4<{l#?qOk (q_X,51 +W)\[ cE +X8Npği+/bS Y +L͊)/(}nxT" zNr=7ڀ m7'M$fy&8NK prW:yZ)fMp0,4&hC(ˠv +zNslK a)R40K 2uDH4KE/ i +zNr|n ,J&e;xAT" +8 +r@U  <;Lmm(_T[ {LKiO$/$ +t:^ .&& JL+ܥ mvpӎ@!M< XLހ W3  UɨG^2d` ”XbNL?}uBo +yjyf&طdS,=Uo { +Lyg;RK77I/1c%v?" @0Dpo4K8[\Xź}3x& +P8{L(ՠk_p %ڣ fB&0_7Cl œX{L,[~(p78k̢`Bn$_ +H0{L'W8F i$'o!^5_"肜xcHG; +Jxqʥ ni6nf'p}9/Dy +*" p֌8pUMƛ2?p3an~T|ĢIG鷃 ڐDp_7[_E_&PiJ.5@\YsRl ҌP{pɀ4Q +38$Abb$ơ;doQ ЖLm +3 U}RA5v[Vj:o5ѿkYW" Ґ8zp@ :e {3])[Siw + ֔XzpG U|59tcBi3QYvVmy ҄q,bH >J0|A5ҦqQxVs +{HL]@c.5I탅n5Foo> " 0֌zpR#(̀jr" ֔xz +pN\ b (Tv9TeM_Gn] ֔xypNR 54e[{1}o1";H- PyNsC@ij($)艀~ +(zNp;2N&p(%pV)巇zBh_>v" 0z +re@0.bx^03n?slyc: +XypWE2R)Ws-?Ck).Od О8bJL> %@ /Uw(BGl8_  +s 4o_c~ 8zNpwmTAk+1&!R]" +`zNpR78KiA'`,D8]n/+uM cLrk +e 9El nCX0G+Vjg* pGT܀uҍF6 +2h՗2 +w@b- +8{Lqk /5`ӱ*+_Jf#n <1*c*C"PypJn +tğ<;Exd +4oiӝ +X{L`vъ4<313 ȖX{Lu:Ewz}h@.uƚ:sAuă< ŒX{L`VYrF:B|-'Zea" +0X{LtIᒨ(څ;v]?yH ȾPzNN7([ +u榃=+q}BH0d X0zrSY԰a<F#eV%;tg +H@0LWBj +”{Lt!b#U|ܙC\7S:}ĕ"XyDpOȀbGu\O +͂oU;# +ҐXzp@u'e'>MH7 +w}GO P~Lws՝5-R(EH-w(r X{L +l uE#Eh8sܪ˝#o>" @0{L)8nL -h NSAG+ : +HX{HoSu +3am s(õkrE,gKTz X{LSID} 2Q<'0 + +™s+Qj? + XzDqu ?Sb9uR] +_" ZNLsuvg9nT}knϹ +^+; +R +HX{L܂kVPu!\Fa\{+B$x( ֙JpӎV> +D[!dȉ(* r +{L!/δ['/'*//ӺY" PҝbpNxXnlk )85>X~R@MK +xcLmi +E"PD+tg0H R ֔Xzp7WII>^< ZV7Q C l ֘xaDpr9nM^(cI + yLowߣx" +0|(p&B6Eb-Ñ ]_㳒 JL_*JHS(v`gD@f;AxZ KLU&+0YI2S:]w`DÏB/Q 0LfϨ +*QMWpC TfAwLE" +XcL~%>#Ұq2A,uOT70؅h ֕zp [qF,P8DrZ?Q;yrP Жx{LNA\Ԧj +g-ȧ* +HզcԞ5~ho ҐxJDp YjA)Tp%]Ij +mJ\ +.VuC" 薌x{Lژ| X?ֆJYێ?+΁nO քPzpo/j[,pJFt + }O 0br{e4+QvR5oa򏪄^ +҈x{pOf*"J]G$v6ܯ\>+gM4M g_ xNpj40lw3`b4I!BS@?" 8zNpO%ay—1TA W+j "<]G zpu%cƌ +E}G&  NpO=@ +[^24SAtq>^py*/CO" 8(pE@J5aY4tt +'*bE? +HNpXR!h;p`/Wk%yk6ïI: p?YX"_3x}"\ 0yq; 7'RE|l8 M]c2^}wԃw " + r?PMA (4`r](5<9X9qU# 8zpN@ՑǗʭa=o,dysjv yqG -^/2|n}?ؼ u +H֐{p@=c6H] +# +ͻ<,dAsR" ֐pkz,s%qތE&=xIt*T @r[}`po _YC܇ȋgCW ҌhNpA~PpkVAn#[!eg= +K~A.\d+p ڈ p@TS,SbO?ֺM" +!H{pMF00g0pEc*A? І|H@ +uZ_n@EL5WT[= +X{Jp`X|9]vKR.Y#q.y/tj: xyp?oX +0Ɔe=BBؗ$<$" +0pp~YoiL;YѣB:n;YD +hp `M0lܻQ>DCZn@:0r@ yp.)yX0F)/Ag .keuX/ zpA_9;rs~/;m&[ݟ)@` + hp„p _YC":դrߗ۝7" +0zpQnQ=O%cS坕#r +8zp=@Yҳ V'=go8z{OBQ &ypwū CډD TZiԹJ( +- pzDp*WG=_9P+uUsYvȁ7" +cL&-@^L*h):b5Ԫ*HX +V/6 +fLz3Wz&dĢ&4dt5( ְ(bpcm-Xn,XL{WѶdD {r򗨀05;A%f,{ևkiPs1P)T&" {TpRޠa¢c t?Du Ї̂9E {Tqo*7!T +cxd ;I|7|89f- {Tr/P F݊Ie3K ++8=N1 0֝p g45idY#(0&ι(" +0 zry_PArݙ1łLnPLv9 +`p7'ylʵZ3^[{) + F bq@ P1UCw*ʭxo +(@p7nbQ&8my'{{ZA" +p@ `^WW)Rif`=OT ֠yDp(@Itpy5FiJ 0i&F<ܤ.D_˫ځ. +ұ{ +p_";|P&1m? l +tҎ ~ {ZqA`!aIV nN@bCF.G" +pzNq@p3EXg`R|uB\ Ҭp 0;(φyGUE2Yrmuz˂ ֽyp_0 +by xlg_="@ +HNq?e$Nhm]d&$V641{UUe" xpo@! 9S*G,V&F.G? +X֤0Dp6App> +A`a KlUüg ְHzJp_EvbePt/"ruXW zDs05A$!KvKC 7 +̎?'" ֬8zNpI]P X +|r4&r}O ֩`pwɀ o$y}gq2^?$9;bB s!郎̇)؜}{M*qv+VT9 +qx 󾐂@o^J=<"D!:Mq[eTuu/F" ֤Dpf[yj..":QQEBE + s=`:>&@$ I +ve}<ށ_ HҤ8zDp_ 4G5ZCms +x +L?P[;TQMW5BtAC1.S-ó?" + Ҡ0pf` `(s\Zœ +/9 + ֬zDp,2nd1vCabStL_"2"| ֨zpߕ1.DbxpDL7)i_9 yzpzL +},+Vbu;jS\ 8&-|9 ֜ +rSTx;X +hTqx0e(Uû" +!*{DqΩ1Yt*.uVP&*G%\5̵ + ֱyp^NX u(P CkMI[f +HLӈO°&"\p!pmZ_w ֭ypQ(|,le\5fzH_Wo" {L]uPzWDG0"M3CP!}:uw Ҝzr.>#nHAk5 ڹF{3} +(֥{DpJ@R]TQ\K5@:v ֜X{p~ǞoLZYu#`)̗ݙZ 8 +Lb0NsڶIc#OXgv&L-qa +ҜpCngq(.A%YWW\"߰!C'" +֜p(?[}`v8'fŎӯf]sQAF7 ҤDpcz.G؁J.]aI}q ȶzJL8uq3d |2,I !c(QIx?K + {p}ld<bB + H(" @ +L(`5x! fmPd3 +X֜XDpX`9=A(83,>1#(&4HKsc'h X{L6|^ p/PsfJ1$F"3{ вL.ndDg/= O형8#" ֤XypQ N<(Q14)Рd''N pbL~Ո@"%]$Y`uX.p0QmQG4 (zVNv + +$`8LyQzԀ zPHM!մDIf3230OW;" +`xzDpFV98t2 ֜aӍm +=Ŕy yqp}o O> +)]tAO@ `PbNN3Ԁe$Id +¯7#  + ʴxypWST)GΥVgi$qC;FEe:2" YLDux)N43[.f2ɪg?D, ڵxpNm#/-5lj.w}_ى, xJDp=b4@F>lŏ`"Bm zJLMY0p>A⬣:򺖌͗E 1z(" +8XzRL< !94LV,ivF}k΢l3B ʰxzp?pW +&qcdG1Nj2؂G S‚ `ҬXzDp%z:ߠielJ.6y‘pI hC +ʨXzDpOP$u$a)iw)2b&.E/RS*" { +Lp]zXWxl/ aV. +@ҨxzpXl)Ȁxǰ#iApLʣja|"H@A>U ({H,WfthӡtK^DSCxy xyL:gQ2[@ + ) ƪ, +|,bYk" + {Ml$ f-p9mힽ[ɳ?u"u14 ֵyp ~iOa(.0RSEB߱dc-U&?8 +֤XypկXx 0>\fL6vDuݨ# தXzNLZZLxgh4gaL +V&A`T kA}[ x{LXL5?H Tرx+$BQRca`2N8>B'" XLvun eMMq&y©2ʏ< +ҩzDp} cKJC0>Ms$,ڸ坚m5 zPHz nܱM'/ +v=j{5 +ҤXzNpܺM Œ-fTɱ +d9Sؽ" ȖX{L ii08+Sv6!ڪ"cQ]EՕ ڨXJp?@lMScPladD}z7 ڬXDpwwz"Da5V0^5 L + +Q6aO0+2  X YYFS r{HF +!* cUO{ygig XL׻} V(=3Q]QO:3![, +" ಠXLӜP-n"0e +F(*qRUlę X{L x&v31%'T:Q [s 8X +LH3TJe4\}MЎ;؟Qs + ڜ8pӱC 1ҕ(1nc,ok +t*J" 8{LpZ0,ma"_Ƃ Њ XDLP,"4H ,;}2. hX{Lu>4L,_R>W^}9* dX +" 0zJNbmRn oҀ= 9.V((Y豥43u pΘ0qVQ??-$\`(xZ?G hpc;@ L`\,}7Lf_Q" YXyqD` $vr0M[oU~ x„q>@ŀ>B0Swc)}[ +0x +q:*|#5a,~Py4v@b ʤxp$ {l ' +92=3_ ypG Q0$&C(@HqdnG +-U}T" Ψxzpr@d؈Tt Fت(멊) + xzp/hh±iP XP|# + җMQ` +  zp1? Z臾 v7`*vt0 xzpk@Q1t1H#:2 xʤxyp}R]JO`*O@5O ucI xbpo3X37=V'؀]oۘі/ + x{ +p2:y-OA0;#AB㩀'"ʰxaDpF@'ѥ FJ`^:jroP* +X +qz80YLXVx#`5u)q!{tWP Xz +pѠ̨ղkAxZԬ*0!SnlA:gLB +8q`A<<f!UD7ɒݙ, ;" Pzp!<ղ0YBZ ХNN> +9Ju +XzJq I#h'lzs3d*zB Ƙq9nUm#"45ucά ʤxp'JB1 +]u'k::~^3z +C" ʨxzDp=7,w"pӃ#M, +8"1*~ ʤxzDp`W2b}y7b@NUfO?W ʨxzDp2`/jx3FX(Kdj4РA<1ϲխ_ ʨPyr LM9I4%b7QY" +xzDqa^Ga|Vޣ-ngw97>z ʹap'$J˻cQ=O}K]P!/jcH xqJ æ_EE?PAkWwqr-s! xyqh_{0u*eQga}SL=Vc" +HʘxzDpU6WPpu%imh\~+ ƠPypj.Tm.nzo%!-bp=#N2na4 aP{q~4-;yO0tjmt_~ !Őzq_|lXiMNhG*e)~+" Yxxqv& ƀ7?J&jE!ꤗ'Ҡm|. !xq= ,5jdtQaG'b[ۣ P xq?h2Gxe,:@iwbzE +># Őys Xg9x-#mhmȢwp-V%a1H" Yyq GQHZ$Bx㺸f\圂]~ ʴx{Jp7@8HS 9`|ڂwVߙ.w q >`&O~Ijԩȕ`*#^訕{2a xzqO4 61wP{Qec;>L|c" ʸ +py@`jYO*$} +炧D3mAE*9> aq1〄=T5Mtы5U#|\ άPz +r Ng(vݓ +l, +"l~aƤ? +`xzJp?@>|K +&H9n#up*"/IuRtTw" +ʠxzDp_|)Xw-Vy`CL{,l8 yp3|M):OxX +xyJq`.̦p+9:qpˀyn?XW^Pc ƭyp%eɄ%". KN +:_hΏ Pys?K\!ȄVAh9kO" + xypמ !< Bq1JhMo6XM=_I yq?<$eTfh~"ܛރA= !yJqGA1TXWY;֥ӿ9#ɬ4 +ʠxyp1T̀ <$+_C@ċPzv"" +ʩypGy vL˘}[IB^9z^% ʜxzDpw`te{;`n*.+3U^ ʜ({p$Jx˰=eK4Vt-3V x{pɀ@dHѩ}~|8 wwg۲ϧ"dcX24++u/ " +ʘX{pQ6Bp=N{zz3 !xbDq05a=eWE), ̽j6ub˝ +zpZnh;SEsUFr_C% ʘ0zpEg-70Qtya-~;ݝ0Ǿߟ" +ʔ8{pI J@(bVd21f| zqߒ=B|Ž"C@dFl[+f ʜPzp ` Ud~M )qbq"嶭Cϟ" f +Xʔp}˴CYW)hJ" HʤzDp>?}!L&HjqoĤ| ʘ(rD( +\AO/ +5"$tlkñV| +ʔ8pwA{ +%20s-ˁ}+#AЁ Xz +qyRc僔mjJd8kKZUh3 " +8qރR^k[B)R.;Tmn.V|Pu/O hΜXp +Wys eeRÐQae4N5Ŋ> Xq‡V 8˃#V%pAؕ4*[9WU 8qO +iB47"Ȫ%.:~PVM" zX{H +@ +P{?+*0$7MK|L +8ʘXpnӂ5 Fோ\6 +;hj~mo yX +qg—Edrs:xґ$Qo1N " +YxJq?h' *ʱ^Sw2AH$'QץwȺ Xqг1"FM[Ζ7 + Θ8pO ,U)v/3 +0̡tvn& Pzs 7lVP2 $O^ҫҷ" +QPrL5|q"$1:.as3M, xq(MJs VJF&l0:n}4_h# ΜxzDp" +Vi;(asBQɷ{Q xzDq,o'\7N}ŠezH7J&S" @ʠxpkl/gX[&K:ۋo:\90 +Axzp#_8}UF=d +r [#3 h' Yxzq~D +hw%*b0K7~!a@͇8ڷ*/P xzpzӠ*7\#Q-[UQ-+ޯ4" +ʐPp|+3hO# biDdHA pfx(\Ȁ#z936.(!EwC +XʘxzFp 4(UkB;.xM#Rjֳ~z ʤxyp?ps ԰*Qpؗvv,x輚 +xqfȀxp2b3PLj}" (ʘxzDp`@k&GVK>4PQAj&_x1? +HʡzDp~~  +fBt4nO0V/ ʭzp'_p+ԸL2Cov&Xv Y +!Ąqߥ-@ɘ &wRvz^.6)y\3u" H8{H_<@P49rH鮎qc`myEf Xzp| ȓV +"GB<t+k~A5 +Yx{DpGu"U`5 74%t !zq| +yWD>+"ߘ;v)Y1vѦ3u" ؂{HM7DԑP-htLpp)H&1mo +0 LW'[fNVА$wcƂ 袠x{L+|AZWZE‘OSd +I8zp^X؀Nq %X>ϡymрP" @8{HZpiahwiP2[a)诈ll X{L ^$R.[[FnОa*% +PL{`(čfŁ-CC8P X{Lհpto*n/$HG BؽCp~" +œX{ +LeoW# =@ aOϩr$Gm$ P߈{ 9.{q> +遊3Ūƚ#>o̐!1/g zp/Ff4f(kJE bJp墁9oܔpSrS T$דm_%"{Br7-" 8bqx%}@ \ +б:,'h[^doA`$ JDp;.~,zݕ<2ljZQY@ߕO ְzDpxԳhLo`@K6, +J[ +uKVT$ zNp% [i`goT{ߵTʟ "֬zpPEOd=;BzFÔQ*F +h>KH;7d@ +p2ᶐg" +7M;S+rY7~V{ zqR@01liE@,cV_xiGɪEA+0nl/ +8֠NpP7,ԜXGID<߆xh" zp@`*n +R2n1&`"^g~' {L`<*{ۙTNtO}+\FsY^g h֜pޟX$5{ݪXl®kYi+7  p/@x4y04wԉ~M?g" ֜{p@ȠS4$vaSrBm\Lz  pސ1i +@-/_`rT;G>R ֘{p> #L&δEdzJ + h|LZɁQqu-" + +r@xetz #E Z^ +HGk@Ϙ ADr}DoɕؙM==SkrxTNa4a FП a0zDrV|Bűr^`o~eI? +apBv'U׼Pqx~A(MmЀ 8Dp9@"?#$ +3f&II>Z\c]b#" AbDpc=@@*Ǩh 5j+?U ҭ8zpVpnՌKA*sےiz +8֤xzp@@ +,YsqL +\&"=PQ3(5G ֤Xpx@2n3sX +P3sS- + +X\bE]j" ֤Xzp +Z#@ J +y_8EB ֤Xpu +f~5&*z|$OJ жzLsa3~2+\}NvİrvCB!o- +a8p_ +` Ka;%JL> M|h 7]~" 0Ҩzp @)6m9qKL +7Aʖe +H֐q΀_51nAlne +Cl8\&qڔ] {L0Ѷ=r@jٻ"8\#>Z~ Ҙ8{pæP7A`%$*zhXP +O~JA" +֜XDpu絷$@s1k +w $A篗{ w ҨXbp?!w@3tK9`ԗp[@9c +`ڠxzpOt ZVw +tZSa5Mp>CLw Hqñ$Cn+NA= WH 1" ڽ{ptOcy6kr'a@V\8[~7?^ LӒon4/rG'~,{R p4|o 趸L#HHȆ[R9/7>ߛZ~ L7רdzoڽyI|{6Msx" + L.#N)Ŵ% 'eVdO Xkp7G]g1O@%/sO!Y pO*[k[7x[4 xy4a73 ڬpM 81E_TޟH]LQ" ֬prk}{ +ipRZʁ':A#?, ڨp7eX??]!GI³B{w$~ +\' ڤDpZ& g?6FQO.PL%lrxh 7 PLdjwoT\x1+qKl~&(Y?7o|" + Lhm=rT@q N\r*wzx ȶLTӹ3ic |)P26 ڨp] ?|&KJA~'#a̼{m?Ӑ DpOAtl?iC9rIY]6 `a1NG*e J H!<5LC*+|Ӎ*3p2= +Dq_/L-=2-V8EЙ+"( 8LJ7tmAQrV +k鲮q\=Z=<J" + p`URB8|{ʟ ಜN7`"x±}'Xy ̳z L @q)!2b̜}ekC; @LcK#u'z(wU9~(|B0 sۋ" +`L=}nOp? Yu+2Gc\C}+ pSf@j8ܥV %t-=5 Dp@Gp +NQOU +Hp* "%|rp *>Eb"C@"֜zpQY2~l9`\20~H>48Z{/ +L7mcp͠-3 +1#\Nˤw ?' pS>9 +k<e3mz X{ +L5H^;TR P!n~g:\S +P{ +s&NOTX:K:TtHVX7 hxyp/ +HV};% ʨxzp ,C7V5Z%(Uu$t" xyq` ʔzp+ɀVG<dn- ܲA=Y cbMez XzDpujW4(]ErTC\DTΰ~k'n x{Dp>TV׸:hrlS]<2'- +h" +(ʐ8{p/Ap[\Pliq~ ƌr= ,YKV*K]G0$EZ> X{Dp Ok)JmhT=R֥2VJ(cӝeSe X{H5gJA0|ʩ Ѿ#s" +8pS|6NAA 8Vr` x +(o XDp?y Nڳ҄Z*% +V1z| +P8pjeĬ,TUV/Grj8" +ˆXJL ޿SU`<p$qpEY"w XypI<# cHe@A)J~-Pq +BtHjRF'/ +xp޾YsZ#GtƱ\Q>tNlM ΔxpPo +P- =M7iY.m:8m" +ŒxJL_փ %*,eKǧED=EK ΔxzpNPՠw;+ɁB!VDcX dw ʌPqoZV MgJ!@BrqٿeΏ0ZtN[ ΘX{Dpؠƪ 4 + +D\{Ϭc_[`" ʌxDp@Ƚ@~ۆ$pI֞2<5[쌧 v ʈPĄq#Ј +nɮ~hwRonz 5;] h0HWhƇ%ڋ* #z] +ΈXDp&01|7kp+o0]91^ņ^c!. X{HԲ̀ggI2xGW霙30US)V(" +P~{Hp1P% +fukJ>X XHC2Pep&gx3O*b)?S78 X{H]$@U>^`E^.]j犻Keh@g XzLw?pmS!jiE-=@m_YoGc\" ȂJhGY{ik@**ƜQcml_ ~X{H5P._:Δ~3hxDĶDRrԀot +Y3|F +H?7>^ =%̧!롪@j'?WQo Тx{ +Lo3 eV +({@ sɗvzc" P{Lѿ>룕3+-kjB״Ϭ5 +@ʔ(p@`PmE5|j^~ R +s?V qh[|qC͚5xA䱙EfqQ xDq{. 5aJL >~" YxŠqhr,@7s $J$EyQ- zqy2cHɬ`Ըkn +xq} Wtf]ȓX( c$ `R2sga ʥzp=6y\d)%]lnjl}KU;" +IxDqO/i0,nSV?vk zqwH.}Ay[0;/sF&rZr/}G +`ʔxDpN@ĺCPJ!5z 3wh ʠxzp`*1 f`@,م +X>V" +ΐxDpGBXKAaP9$2W67@FEjGA ʐPDp+<uE(Dxm։UjrDa!a'E hxyp%ֶ5M k Θx„p~` +.vDy;bK~I= +̛tى" +ʘx{Dp'A*xJP^BE\g`|4'ԂKc x|JL;SZd!(j޲Xo+ ʜx{DpW@ WQV@2G(JCSCUV + +&/% +Pqvyu͢Y M V]L$jE"0zrO!S)C;'0Ə{ؔH0M +xp˶r 4۠1T_ߚt+r xLF +bAQ +]:l<dz".}̯zt Оx~L +&nP9 + ބN铸S'}40[7:P" HxH!0>K83]͉Lg +Aph=(x Lt^(#ч w +p8hx,!i_ + XzpN~>_b ॎ9"\U"մW]\ {L1aJA +C4 _ :" ΌPDpoߨިRB&[Qs$2߽ +|(q.?6hl#k[T~2^ {Hu&ph-)2Tw'*pǫ3w&z&g Jsy +d4g$HWqedƱ7ʻI" +`ʐx|Dpj{Po"01S,%Z8~,)3o5փ ʘxzp!` +$b @2*,K6G:c& +xΔx|DpA@9̑ +䚂T^+dpZib.$ `Μxyp_'ke^-a$+6 +<2^G|;" + ʄPpjW +T/Yʛp$!&(`\n 7 |ĄqFA  +R +%CF$ö\m[߄? +e9Ckk}?s" +Hx(qo<"PdC. u٭M PʈPDpr@=6f;%eY DPzƭD3c. Όx{Dp/!ؐP j53n{.Iv  ʌxzprHA /NNV)zM0ww۟" tqqL?gSC $E xT]a"/ +PxPpl +YI 3pJIʀݰ8m +چ7 Δx{Dp2<؀h_9]O=_~SUf(M +`ʐxypwS (r~ GW,zg{ [v|~%T" ʘP{Dr蒷u;ϿPvN +s8gQ΅h'.VV ~P{ +K.EI0,vXsL{%nCwQ ( @zx{H^E HG:I!"l +cg~A zxHڊ^(/JTV' TU':Oz*" +xL7Q +.Kӊ)@OI,L~`/3&D4 PLv +@;(K*PۨY3џzKΙX xypxbT䯄) q&@dh՝X6 jx(M +Z:Gab؃c W_nȏ" |P +L%_<RܺkZ]rD(V4;5 ƌx{Dpon +bƠW&Lt`rJGXZIwxLG- X|(N$O?ډ +K0]1]%; ʈxFp5Gɾ.@ ʅC؎墆1hLzX7fq" +x{DpNP7.rO`Eo;bIOX{JC[O xLy*9DB0;FG~MM +ƄPps:԰ +"cqO9~_bCr"ށwz 螈PLpnBQ@rJcL+ r" + xDpu88 pћ1!mZCd{1̭ck@7wz ~x{HiNetbN{_c jx(q- ljFZY +4ZPrDO??dmѶ + Le 0 `?p$D6zfw9I_t~_" +Xƌxp] @ 7YSG2Lp$.ceI`!bID 薔xLo +1:Kb.澨U)'Q&䃣 +Px +L@0 q7R2D +Y2K]M~'k4 ƕ{Dp&@<Ebё`lyoG=s/" +Ɛxp0l?@$vO/}M%8b.K7j +l ʙDpl o<䛗Hah7M2:+g6K 0ʀ(s`xB9ˤ(! maXB:` x(pU,/ !7,#Jd> " +P}NLjvY0<]W0[Eʝ-oƦ> ƙ|pI]o?W DZmLhl4u5 +xDq/X>SjEe=uz)=WI: ʠx{DpI9pi??RBvJ=L;A`&" +HҔx{Dpt? + +qn+@hH@|vM.2 xHvR#-w"0 +NTGHet) LڽФͰC8iإ\S'<& hx{Lcu ݠRXLB8މDe{Zj cT,}" +xDphb] | mfVMdnўP<"TWv zx{ +HW3zT$'+ + eQ xjx~ (wI44yѮ@,5SRq +ʔx{DpHnDzʓW,,2’jgd9VJj ƔxDp&Kh;y!ހ'vvT/[|Q +j{" +@fX~ (~+4]"RxкuxA^B h~{H|I~l`A˕ FN)wW*ȃ +~IFg>hʮxIa̠iR 4HR;3x>y fP(hDT +oJ!&덳z }u|" +~|XH(F? ޙ6++ESm"#1# `~x{Hހ0)EE蜠;"?+ON<9I +jx~ +(H[ 0=x\aAyDU5! ~XH/*4݅ +*Ķ~" 0~x~ +H,y.K=eH,JJt-]KAH՛k +8~x{I@tr[ƭnSbe@B  `jP{*HhaK`\ >w 29 b(s-`4Z̖"v+d X{L&t% P}92x;+!vh[_ x +L +Z +mA`} 'W+lY Qn" +zXH[ +Ȁ+@/  u2s:I4wpN] zxH"| +KYqszO8R :ZcE$U +~xH]@8 "|%ZAj0#P? 8x{ +Lp@P{YX1B]AWFZX0rJ" +ʔPp?8!2Ie,5@ׇgO<=ӵ>I ȒPL J ?("Xه{D@IQuN , x{M*j\*H_5Cx(kޔpp t~/E +XLe]e#t\udr4)72" Px{L7U7 dlkHEخW5P z +xMb,*8R@K.3z̸X8dJKeu' px{L?=T PJ.Zө]c/; xnx() +G`*K, ѦtHzN#^` 0c" +ΐXDpA,Ā=܀`y0Y% /Id-L#|;A( xMoၲsܱgũW. +r&qhxAL@ +pXM7cxd굃x>&,P2rro @xLtΊ҉#c0)ۦky" +@xL<; +Ǔ 3/p2kj(bK; +XLOnNM\WU8p\QF诎~~5cD{ _"B P{LQ @GDe,yVbax=" |Lz=  bqBrb,ͺ:ɬ :3Vq'爓 +P{LF^T}d@^sW竺 >= ࢥ{ +L` 7~.TB["Qd$%UTo LL7{,.TAPJgS}4l[Mּ9"u" +ʐXp>([-L 4J4)T`f zP~^H + nF$ׅh + PNL + 5uDkrG\PЫi!8=;n  xNL +>h%g1uT,xh`5m@a4gj" Ɯr5'C'VY0.`odDX ";]u ^x^(=|J?A +5ҙxgWm ʄ(q)nҀ5>"OTT ETizpGۏE ʌPpqm==0j_85x]2 녤و}"Ɯrހ,ġSHʌs#KGfnw} +|(p@0t#uԣH@u+&Jݧɞ ~ZH +̀!+m@i Jת +@ƔxzpK;TGQd 3ìM7" +Xʙ{pȊ% 4jD7PF\%!>M] +;a#K ʠxbpW(;jq!J=`xn'.kAO.Rh ʕzDp +nD/ qN^m1] xbDpO81u@ +2bp@6.H1R녺HG7=" ʝzpOY~nXh$A,!Zؙ +Ɛxzpؾ C7Qps5 {u֗w cND}cR6"@RgDgea'I_~/{ +hƑ{Fp\J +HODf7@.Xik" +p~ +L +Q]`8+dRaؕA`Ieӥ@r cL-59u|HRIxz[b7*" |L6èx~}19,1 8{ ΕbFpמ3n"BVdlF WO_7#x" ʙzDpҵ +P_@cY +÷B%aE +?p +XrXKHւ@l]|ƖWZ/q.7Ԯ%Y vp," X0~ +LoE5-#AQ^3# @Ɯ{ ~8~ZH%MTNnCάf?, ΘXDpQKu"KeʭD:*Y О8~DLg 8<>X9: %&Yp F*"ʙXDp=%t50͢b('[E8>l +HrްzLGza@nxHΨXh}Agj ʔDpS@S4 Th㖿4 ~Lq` Z_sqfOH@aaD@" ʙp|u'(SIy{eyÈb_u +y ʙpW4(c `%F&EhCNZ~Rm ΡDpzN[Fk#a&&Em5O:0|h; +~8~Hى@+R?h!JBh1 + bk$7 +" XΔxpe7MJ$TjFla)u锜 +~ L^o3ٗζ# +0H.v@%;7h.j`qWgD(s;: XcH2D0[e)@#˕R +" +a +zp t: 5IIQ򺝓*yj ؾ{L9@L)Y*Ü<''i4끃,;M 0{HV>tNc0/Td>wPX<1 H7 ʔzpL&=LJg@bUGR +K9[AN."=wު" +H{Lt"1Q°B:e/^uۃ~b£Eߩ ΘxJp| 1\JV!d@X +Mf1&i/ +XX{H +0)FB wܔ5*xW߬ 0{LbP7}VN0Jո=oP +vРL" zJqc ,.[E8zV%  9+&w( xLg'Y#UGiz3==IB Ιpy?pI'*9%"'Ba]*XL N@E)*A#F<tmz VEKM: " {L|L yNpz [Tgٖ#o92 +{LOV,N=EeuEw XzNL? `*k0  +XzRL>' p0tӥR"ج^W. +`{Dp}Հp6/t< ن΂M-%v>p Pj+(` I~N0hИ? +?܀aװ6 +ئX|Lf.,?S js]U2(gk" XfNLhc(ROf̂>L QAR8d`5;  ~NLQQ 0- +HH4Ăr:,vXܞ +ƎL\L \p o rC%ڏBK ~DLq)ˑ%Hs)qA꛱n" +ʉPpQMOL w'I$=PkF-" H~fHR~T# k Py(K&6uz&O +ʀDp!HZMϥ"$ayHiC\/q@ zP~H1Xp4vfV"# %"kGW +P^JLfXδi#CKNH )pOGJ^" +zpP\'򁀝W\rx@U X|LڽwC`0p#а95j@Q2 pʍ{DpцS$9V ( n+ "4Bf +(Xpde>(lU5G0 \"B%+Z" +ƙzptS#!'P)B + + ސp便 + +sQ@#vʟꆛe5 + +iBcq@N s&X)t=$4>Kj >Aqծ1'C̺fD )14q?c" YBKNp?/F{@cqIb_N BcDqɀ0a̫q%@빥%F V !BPJq'pCmi@ՇEK͞{п BPbq +4JwnRg8?2AT[lyM*n" QBP2q9ՙ& Ǻ:q؊/) BXJq@4ysYAZʗ2caU)O`gW ȢKLJ p +@VA>e-S +!B| +q ׍5)!Ӗ|.ue{.43 + B0|q BD0aH{K~s1<oBj3y ژKNp.Q6U6pTVgOrݓH? B|Jq?)xLhEMㆎ_" BcDq' µb + +EsiΟΎN +E. +FXJDqS $~qH(h;nM /o ʶ8yDpj;mI`)BXqXfE{D|LC:` +L_%fɜg3$P444clO`o" +Bzqo>X^C#Pk>Q?8-? B8yDq`KzˁfrǠ:9$(~/ +ʕPJp}`rq XZ@cFte + W FaDqR^f +ʡ3 +V۩n" + ʈ{pW&E~ǰ uj+ γv̎5[ ʙyp}k>NrmB@- K]#sNO G +Xp{0@!erA嬗tz?RCߨ ֙xzp[bUHver5tT [5^" +ΉXzpZ20ķ.r\&!7b}XF/ǤЧ ʑpߠ@)x֔[y2<$H 6LAm# Ζ8{Dp +~^I&Z9IK ŗ@Fo ʐzptSq@4ulS=~?Y?" Hʕp:u?$!:InCdgW o!ÃS+'({ +ʕ{q:^@5w(.FtNv]w ތO ʥp)bgVlʫYD,Q2< ʥDp>)HXZmi +gPC͗VzH" ABDq@-ν"-M]yLW_S tҞ +8Ξp+uπYWxgȊh6z5~ ~~^HqO+H$i,qjo ʡzpGM>HP)"vC,1fGD⮧'U +`~NL/JN2ƥQyS " z{HW`72$&KE9 +PzP^HAٱ/@ܰ#E:ju ΪXzp +G@ ?SP6W%^ +0ʝDp{.Um|s`KbWn ߂?" +ʝ{Dp~ӗ\7z͊2%a 9dК rxcHp|$A϶݅1va}  +Bzq-<\#i +Bޮh^f뾧~0 Bq$xa3[4|)UL1dZuL" @~XcH'r(}} G`:sv0a6 + BXyq?$t!pƁ'WͪAȯZt BXyq ∤%3B@X+0752^ʈ-/ + rK KVn. ŢXLZt7uwB" {qF7>EК +ִ6)֎쳌$suH dq +p ttQ 晒N~!5_Q{fP% 浸Jp~E?>)f"(&B>J- LDqFD +#jmxo7)N`N" AXJp9oˀBRl\[>)YHԥЯIDzT +I + XKpU#HRkWzZcOI6Ϳ +=o XcJpR% |HnndwA%w g 桸KNpo( +0%0 +N +l"[:.t7o" +❸dZp >K+l>l X͎֥cXPw 3L[x +|R}jK+fcN`? LTso%`,K08a` ť rCn {s F j8{ +s򼈀Q< \ ,xZn +  讄X +L~Y"ذ%ٝ" KLZЀPbXn@:!vAAe78Bm +ҁ{Dp +% vy69#?`S}SAp n# x +L`}J *>ܒHFzt:HH:\ +{Np|CpR*5ZuISu xbt=" ґ{JpAp:pĕ+aeOw7LGC% + +8t(L(v7JɍdC +6B<6 hךb ت~ +L}@)x I'hOVVvۥCҵ~" } ~ Mj9uTG8.а7Oʊn2#C" ЮLH +f}2i؉B)z) $TTS Zx{$'%[ʀzF 9Yz&`+!7hK: +- 肤JrSF#U%^+h[cLxO2 નXL[j:1qVflP,2k6$v" HxzDLp[jz|q~∡t)rFne +XzDp0-Pi$y{0fP1—<.vh*Ri XHr&mSP +-!JZt+jGZ^X ȪX +L5(id^LC'svvB(آ" 8HRuRBQhX/qU]'ra#s< Xp )5JKp tvXݨD]@ }dp Xp-@0 n8L +J0l(z$ XzPH{kt>̼ QE#[,h&ՅP"=h" +X +Ld9媔c.NBR:8P[:D rXNHՠujK,>DZGպql +HX{H >+aSԤ.[8'_F ڰxypa@l:vY?k愥e_.ns:7" 0xLOԐt9ƇU]X)?FIC +`XLPp1Vg/XoՐW]/1iQ0o 8Lnv8i'aSyQV+$ۥ +Xp~(ũkltoaHW~nGf" +(8L~>pLecK&'ZBB@y4% ಘL: + wBr#RI7kJrWځhNFF2~C9?# +q +r ԀD](8q +BVRRѻ" Xzqe~3 +o2MQFd(-bvT xzDp`02q-UX9 +#佰&DX9=nqnGM  ¤xL? `Re L̤_[iՔY;V& ~x{ HY@m"(&"BOamaRryiZjo" +XzpAZ\-@ 2 +_|/O;+AmԿ#W PrA~ +mDhDB:|7őiEa_A5 0{Nހ,؅:H<WBjO +Q{poVuؾ\8:EOs7eN4~J];" (X{L|E@ Q6JBÊe"c x/ +)XzJpWMvѩ8v-. +ˁYWf=j I{sGu{VĆBxID2ǵ.f + ҜXp E"."BsuBTځ߇XB)_$x zDpvQUtSK@LQip+!cW[5" +)Xzp¿ڀI0y*('- +8\': Ҝ8pX + +xلDO*9݃s XzDp<Lu:v| Z7tۦ)ba7˟ X{DpP@m .Xa,2 +TQf" 8DpVy/e`93aiU|)ʖo "& ҠXzDpp^ -/d':UO5zEfF~ ͑ 认XkL%d>e[S ]ꐧz:W_Q +Q8zDqM5TݠyT+k R:a͉ī{8߭x7P"({ NӇ|a$x/@ wGw_lE:?+ bp|UH`|'9Һs|ElC~&bGG ͸IJp; f쾰!a%R?7 Ҵ{ +r.D} "<\Emw+=FjA]6Ѻ" zr>@|LCŎUn6l>"ȽaFz7 ҼXzDp,P5#@橈+enYjEc C=ɸYDqS +SPgA*BN.OpuFq'o +hXzpJT~vi,T(/QރMW +ߗ *Ypow9 ?7wh$D{y?Ýk] `7<" XzL#di0w IHHaBu *zp;i~uو 6 +G._@BZxFVR?V, +P{LmՀq6\;2R +UCgT\, zJp!UH`|7XK6 '%Wg" +0{ +pg z v $BQIU9rj<]@q{% + ڤxzJpq]>ǔKuqvA^.k]v~@n ЖzNL͌O6r,<+RP8ha^T0')$b[Qo ȚzLNOw|7+*'xvCD:Fi7~{)п" +)xbp?kHj ,#֭YrRu Xzp>$53NCK:;",2MZQ=]| X[Lj޴'b OaD,H&,Vٶ7gԃ +O"~HZP {LG~ciu h C(ecShYS" +X|Jp +~6FEòmUY}XD ΔDpgÀl/7;r"Bʨ~MP(& xDpnʟFŀ,x-6d{6g\ǘdiR" +nx~(lv^ DNX@?Gz]Z."rPj x{Dp;vPjMbgdM9=L<Y +XpSϐed@0/_&FVܣbO/T1P؅;| xH2j/:GEUTo֮ٳU (L:ƹރ" nxf (D=*  RЫ|B W #4xuzB +Xjx (Dx\v6RDb +׺>o @J[$L#ubߩ2tDygocMӨ7 x~Ls@T2앥&0)s̮Lj'?V" bqc76b0v5[IZv6?  ( +N7@ ]Sւr O?5:&~?I AP{Jr_S a2pAFV@`y 4TTu?9[ +qp?2GfѢ,)|)Ϡn em,2/" +ҐJpj77J Ux[5I4np}\F^?X? X|qS7 qiOtFT$j3)k.nw X{ +p'"Ҁy%n/A`.(5MG7S*g6 ࢤKL +8{.kjvAnvԚƦQϾ !BXzq? +8ʁᢡ6(\HB _]O=ݑkn +c"~LVD0S1"Qa!*0к +ElKSm +v- Т`cL?5;఑*."21޵$T`Wf:W +IFJq@~2]j18qn 9 +Pw x{ +LX[ISvl:N- +}ywFރo] +Bb +ql⠗U8 (FLXM ||S" ࢌLb:⠄6ܻc`,Z{/tuh-\ FXzqJvtJʜBeVS&g-Rw" ؊L&*MR^l$ b9JC2u ~X{HZ t.:bNvGTO75{%%Z" +YzDp) 6VTb*4D࢞$3 +{ +LU Q +K$CG SHJ5b(c yL|\(֟BRafb5 v4H +Q>fSXF + L[5:zzG.Jg*U$kġ0Y9" HVLmWa!E$q +2ˍ^@(D] +L1nUn"M3}yT "XЇ XyHeI ШBnWж"P~JLһX=6ɋVc4( +g1kNVd +ʜx{Dp]^\fNL'VDJ'Lv{zM' ʭp@I8g1?^< +y|Ꭹ& +8ʝzpT) C\Ȫ 嫇-gv1 3: ~P~^H/nGSg" +m+ARU}![FT/" j{(#K-vYjP˓8D]( !@rUpG hbK(:W"G-6!^'ABn 01?ώO +I +xzpoU~ u,Ӳ,v>z-/3=' Q nP{(F\Ԉc +T*:<5bȧ˨"0Pn" +8rx{H9O'9CA5zFa>;ċ4a_Ѐ `r{Hnުt'|Zme)ko2HX/ ʔxyp{+T ɖ @:&́<_т!Gmŏ ࢌx{L7=N; X۳CA`sW{_U*wG" ({L]z@7c{9DS‰/GZ +@zPH1K,3np# Q"8!Icw@Y0t L.|/&0}&@Uep%DlQ_&~1R {L'qz(tjBC`3 +> +?蚶" LE;ܭE5ݛxA{cA. zNLM?#~ԮF}RpJ4TF5kF x{LU|avu#I.p1|XީKށ1 +zLWjPoZntr/Q2XVW͍<#" + Xzpr7nQG[_$1o5kuZo Ȏ8zDL 61cuN9=y;egDPg +@{LQm}npG f͞X +W5o߰< ? (ʙxp#s쪑6,Hd(xe\ +[@E" +@xDL1݌ߒ>bzV\:Iى}€ۛКݱ%j + ΖXbpo'0T;;1)z*/)@o8 ʜxyp?'(cXˤBJTR@ +%솿p +({Lb?QoxS^-QG +2K>S"" +ΌxzpO(IK&AaIBA'( 1 L +;C*F'@2i/"qȐ%,|< ТJLl2ӋUin' +$\d^J[ ~L"7FR.]{*V!SH=N(_ш" +`ΐxpը?ۯ"/>)>n\ ʞ8„p,7uJ@Lwjg@tg3& ՠK ʐxDpy숀 +v;R˟<)[y.F +L ʈDqTUc'8Tg%)@2q|" ΄XDp?Ȩ:Y#2Mn,MpDMsɳ{ž #?j ʝ +p{PĒmڊL]–1*\*,{9!P ʑq04~-UV77,ЃdL +x֚L . M$52t-r 袌PL^@ qn?$vҐK2"L/QӈSuːbb" +(Όxp'p[vLՄ}K0w0:~#$| xL=p3r稠BZ }mn:3W 8~ ^JZK([E$`+a}` +ʔxzps?׀1fLe?A@U0j=kZ" +Pjf()N MvruOZAc"IѾSXH# PL7! `/G5T5k)Mqg'yYw"5 ȊxcLC7L)BHѮdˌY¦а; ƙzp&& >S@-4Rئ%i7Y-f9" +ʌxp~%X HOd<1÷~&p k(WD& XzHE +P (gt/QƠ($a0 +W'ch / +Ɛx„p7 O[A +*Uyͨ]%vI `~zH]4~ +SÏ⏃ I2s/xtZSi" + fxK(mT40"̆aς~剰YM |(LuG%V7-x}Rs0b*sx!Te p{L|W@ +l3, B;(Ʃ: ȪxPL18g +i5BW:@j0" |PL;37ؕS$cTd"<y2 7|F.{ |PL˵nꁀˑ&O(PF!? +S^ӄlrm fxK(K!x" +΍zp38mPX`\+|NQij3 ֐ Ѫ! 讑zNLF{} +?ZL8n1KX +@|PL7T_y$f˄nG? + Ιbplp`7M$Vo V rGCto" +XzLd*dr0qK\& ƥǛ[= {LC'&=&d\U? _>WT +Xʕ{JpGz?( +ޅ6)SXE" +P~8~Hq#IEȋh*D̲-3ќ^$9P,s 袍~ +L=Ctcgλ?_b7Nc^\PP +w +HztP^HLʖ g|B* t秣 'B ƌxp% <nrsP#2/7Q +8ʈxp Vu ǕwKx"BP0qbR5sqFym İyB(~qDk, =ƃ[Pa;'OA@"@ ę F@Jq fQ)P<ӟ +~+GJC ěFcNqj# M=6To6)(#8l"Ğ FcNq7qZG(At <^G` ġB[Jq}*c}Ao) `1 +^׶G+ Ĥ BXKNp:SyQ070@%Fq6vx`*w Ħ>cNqA^ } % Zq^Jn +s*Hh"ĩ BLqU??>%L(L)#'W)f&~ ĭ BcNq?@R3(e%&dVhRrc0W į !FXJq;. ~{.!%,~_Ցe?OC?W ı FKJq& +QrC`?QIs*oB"ĴFcNq`VcYbFyN_Љ>M_@ ĸ FcDq|:xDl(LT10r{w ĺBcNsPސ`$3JP񀀀O ľ +p{Npo1B`41C? ஝PcL򿑀e3.A' ^|A`D " X{LD߫ \>v*dX#V g^ 誡cLȀ+˵l3[pctAشg\J!o تzL*&4^X , xS^QF ʔ{Jpiސ_=sBwA\H:MU" ʔzpz}L=U쎛S%rG8uU.(`Ի ʕzp9+ɀ rRYuXc$zk#FD ʔ{Jrԫ>ٻ()fCZu;d 6Kݼk +1Bx{Dq?y XɒzCA/s:mnM" +abpIwz﯉QA42ɲ$D*,7*"z ʾXypr@9ex?f9'];FiO) +~LGJ?EznE!e F+[O ΥPDpp0?)tj2T-̌ +%ms%Y" +8pA ;,8Z#~C) z8fHg>^Ab)GxCu@οyۖGyG X|L7Op +`>[]x!@>UFU ލ| z~Hp5f~p( "iz%AC" BDq K<eLž|9vl +/V!%:= ʡDp?`H!,B@>y5PWDq+Ѩ7 [DL+ G@5-8HVT-eA|ro +Bq|` 3#t{RAN, R*K_;uѿ" !ByqvzWLiho@s%].ɿO~?Èjy3\C +(L~@Q]HC+͘a XMV|G Bxyqޥ䢣\B5ŇM,~V> ʲxaDp}8|orBm a䇮qȯ +!BXqܬ + +[*rm%tc4elL" Q +yp<0xzR6]RP ``801 0zp~H݃N.Y? rR#@R!9 +BXqfpͷde0 +0DZL8 qi)Ts&7 @6M5"crK}Sݺ_Dh0QFgdQz cqL7GW( mA"\;KAf ɸ2p?*LEDJBPK #wWqN XJp-?YݟX|d %*^)7Q_"湘[Jp><2\B`F0JYLVO+qP0k XKNp@# +nYdw&I9y@- 8KNp0VG0sD xܨEn< P[NpćzD@%g,~Vn?yqPo" XIpX'ۃlZM + +ԇ˻&S{901t KNqd@1&clbX. s5>TWZaI +cTq 4Ls˃UB5d1LceTEXǯ&%v {TqVJˀߪV[5-SBPw" Ip$( 5SP8ޕ Vih5tޯ 1cTq}q5K#tS)Dw +afq?* K7X + 'd$Rg>t|&f:lH_A XJpm> O!L{8nXt]b" +cZqK5l E4"݀I +oDVLz XJJL5w#6qŦ? FAXmh +8bp%@qۗ4*O+%& z +L†vR_t͚ &@P-k1YMї" +LĿ( ܵ -PwExE]nˊ JppW#qN| _dmTUb^1nMF 趜LwA9@3듒gERBYo +xNpϭ %4a!(l ppUm&]" PDq-@pU;xh;)%Mju7 +`Jp@y3s@f5H #P FQ !Jq}+9tJ'm"Iƪ`Aec7'nG(W + ┠Ċp:ԤDx1M˾⫚7Q_-" XxTL %^.p d@öz +!Nq߿l|2,NNDF7[ 3 XDpܧz(̭3`c&Mz;N? 𶐸L{z!s< PHuԊ뒛ɡF +" pLAy^>Qק`>G>ſ +(┸JpVe {KYߎ$WE!}uwu8 aq, ZmL`=&w bn*1E!nj m:" +zp E!P *>\ '*noAg ypHwyp</&opxLbʌ:÷ +zp m]iwNF] +f |GWz +Qzp"`8 j>訊ь s-yQJ_. !XapF~y`Q%W݀P +B7=(\C" +9NpaX~.8^D +tH5@'B Q1a'+y yp6@ϫ pڏDTtT:'QD Xyp/vM_huv7 Rs텏 +֚0zp$P琩 +Lm_DhˍxXa" XXzpdjD`C{m34GC|F ҬbqV`3ey;ګ`\0'*3ks= hjO ppѼPt%U9\6MW` zJLSQ +tT4XE;:(=GO" XzL}g 0j0~%Vr" +Dq7W` "FdJ i4T˗6`T|1Lryգw y8q_}Qp` @1Y|7'LOT/s 10zDs&m?7b F|4CIWZoe +aXzNqڎ G p@ۤxE= ߧG" +Xq.ӧP}ѝj%ED`˨ݬ7 &_| zq88UȰ.E0;O!m= +8{q8а%R1F"5QZAw8egVn 8{ +LpNp>SN" +y$_ %e&Olc]oy@" Xqz?^16!6Hm-x-.r7!u8 +a8{q߂-3븟N&}_ir,9%-xcg XyqpYCؕkBh1g!>2)̕u/iy q@ +UBeGRZGQ" qV7@ +7V]5BDUb沲ոK +q xy:] + Mwyl֨z7* A +qN!tCkCr-m.L咞? +ڨrc(|㚕 Z_y@96`5o" +8q߃`x&OBhZ|OÔn yqBp6V`cff=(DE P +Ll+j *ʹw~Oj%WO~B +!Xzq/ ZMp<$҂ٺIK27 +gB(" IXzq'g3 ]0 )kD'3c^xl(5EN]/ PZDLA #5v>r("C {r0z.b޺K|+e>_ Xzp 8ԕG5 'դn7u'F" ڬzrk ;pC~|°3$!!2fktT-½F7 +8{p e{^!Wg@)^1eEx& ȮP{NT\2Nc +pʀ<z( +X0{p4"Atl2Tgn Quzէ"8{L6m qqx4sh!NrJ 0{r=m5n}Bs 8% + + zsur|Tθ)j,y`G p֤{DpxFA` bݼ[IDX v9P + p: +QeaI QQx. 0&86)6"r"ypkyo[W=II +Xzphh~Q~t'@ 0hЭ"h, +H>kg||gVvrS`y/H:D@P Ğݙ(TeNr!>Рoo7~x6 #l&E)SMUT[ ġBzDqVhH?ǿ09'ߓ@ɬ áx Ĥ XbLZ ~&n&ʝ%/ ZSZZܟbz"Ħ0bL\V.#GFUY KЖ^"2'D( Ī BXYq||W?_@~˶"I$P@˳[mj ĭ 0{L9V/N2 "5EI̺V+^ İȚXJL ׆wV~V pND*u|Dx,>Cq"ij HPzVLבs3Lts*e Oty:7ٹ ĵ 8zp@>6= $&uzm<,O-': ķXzL ;`q778 +xjq|Fl7k!g҂N~@z9B XIDpWԳ=WڟVzX.5ۛB.(1п{پ9&**{ 0yrA\9<J : 9A} 8TL5#Axr_@~Ԧf:*ݵo XZDp]_j~-8gձg拢sϩh^|B" P8{TL=5 +d2Ph5KEp; жjL~;^@`f!Ɂ0 $XẊ?@kO# P{LaHcaYO^ ]H(ʈg|- xzJLd@ {bڬ{,'#w_" I*XzDpDgЁ +6by#@yɓ#s;l], Ҽapp@Xh/#F/`BOJ/v#3Th? bDpcy0 0&Cđ8; dxshQ*  XiDpE=@0=#C\SaNV0v}~Chgb7nP%n" +ZL)"[A-QbQ p\>1H 8{Lٗf djVqX}-?Y ڼZ +pE@ ԟ)NZH24y75E9U ּzJpf8ԫFV}L$xAHk47" +XbJp_؃|K'+E?'fcҨ:o]_ zpޠW/2rDa 8HH݈ڲU u! Pqffyp[:9*B?y_x X֬zNr7ɹ +)Cu?\k lób[R" +!@pvCޠRfGr(4p/|#fә*f +{ H{ +q3M@qwխ?{}oLwR_ + ֨Np]Ǩ/Iӌ k(mAšX1 HzNp\O5)C +~>" +(pV @ `',wѕ +%8B›B6+ .aDqg*9֎lrF)@0!lɛ ֬~pg $T +pغM2f5<7\{ ɸBponP߈@ +x1bD + dՓ/R?BD" ɘcDpO +' oDt7vwkyǐ  Xz +LV80$0aGҵ)*0A P h·X< Ÿbp?PHnY"E0&V ~C zp~WC<" +P{rI/]{kPٯXI|]bM 7 2xbpK'H(  6oB޲@XLְ >IB 3 yL6ga);URn+޴~j]P8Gc^ G`"+Ѿ#=^hULrJ"ĩ (Y(GԸ|$jhr>DŔ֧]KvB Ĭ XcDpvwTT@a@6i+h.X_]d ĮΰXcDp{N Haƀ𞇄f;d.ia=EL ı x{Lue1~\yQAzLOu˷xQ +? @("ijXcDpJ7ƥ">PHT'L 0ǽ]*? Tu ĸcTNEC#g챑k*9Jh(| +H1l ļ ΰ{DpȱOnCp; riW# ľʴXzp"&cLcԙUeT6`{,'8 "XDqK>jz +4=E sY*C` ΨDp4W-Ws b,+ +r: nXn ( 3/ +-t["I!'|LB؃( z8~ HB` uz_ +5 J tԱaꖥ-S0'" X{L/Q&VeYSru@2cNnFܭ /f زx~L8+@x +FcA$,"7JuK/=nهw ʘX{pA@KE}3Cu9B@㮢4ڷM+0 0f +NQgFane@ȹxdO_7" PzrDŽv#^Vk8I-yab#Cժ ҨX{DpДbLaE +4z*j + zp'4b8qn z(!&'!\iJ67 Ҡ8|p50!zC*)9A8n8 {-{PM" 0{Js:ʅt& Mzэmʦ 2όL +Ҙ|pjF.tusy~rIh +[-9/~ Xyp  + 7Cw _Lo~/5~I Ҡ8|Dp @D/*m)= +W~6]a>" {Nq`hcḖB@6k&=5To[k7jv ʔ|pQ`\ ETfNPKW60D^f#,WչW q dȹm <+&peYQh} |Ds H ]Gru#%wu85M?h5| +!8{qzðVN=7p H+YHާ+3i>" +q6CccBhdYct,9'zx&=#b XcDqc-е9|d^#` 3 +ubbZ 8{DpF%1kgsk'E4TeÑU#~ + |pR;C~94@$D` +G +" q3,t5?l 8 aD1eh H^B x{Dp]sf˼ˋR`VTTp4M hڜ({p +, & դMt8r\*s?Z FKq_ e.Æ:pTUj4R8t~" YBxIqo:kj&Rvz8>- BŰZq~@ Jy$$$XJLKf̱W*> BŰJq +P.C "l>.n1Ζ+צ44䯢 BzqE1YK)ám=hs@ƍ+0ȣf" 1Fbq8F#!7>SG2O'Cx!ܡKfm>h  +zp,'c2-,fqcFgTG05)]) q +{Np%0ZU +f EsJW + +P{NpH&a !ý6HaGHʣG" +BKJqp(φ;SlykO3W~견wƑ BXbq_ǀt&ȦE`yf7WTT+}^ + +{p~W`7dO:M_*= }-&*#z +! + p0 _1 +ȮVxI و [@sPto" (cL_`&q.N{}"TKz_ +!BDq?2R uޜO9M4d +ԄEC8Zk tA BP{q n[@J=M_xh\CUBm! XڽypЀ¬nGlPuLm d6Z S9;qέQ" +@ҴxbJpC|<='G5b(LN&QlN}ur >yq/Mʂ,V8 ^HY(^JdIҴw} ʹap7Ssu܇U&`к\@Tdf6`^[ +ʱzpo:2b,˨ۜ.zDJ%[1j-oQ"ʨzpw!Ui;#J$ "X$ɡ4^N +ʝP +pڋwemx,4f0ڃ? zNLN+X@66\MNF|UPxP +9<҅ + +xp}@J@7?8QYdɚ,"ت{LT +0 4!'c6okcEDBq +@Μp2ʌp9 ++,Hp3(?x +8zp_} ^>ZތOPkn+UL? +Dp˃OHBZkN-ʁ7)pP`'a=߽Mѿ" X{Lվ6`r,9QSo7hj1# +ΜDp^LZ30<D,NUb_}9| ~PcHE%:?FE\;-Y&7$ 8ypsP-"*arGU_ +F3N(d|G Bxzq0$8KkRE8.mD@54 +}By!%@tL֠" 覩{L5 P%;U!hPgEFq&4{cO ʨzpN.Pyil(M$FaEbt{ގ] ʵYpnOK2Q­Y! +EE&N(u,7 BaDq_AfBc (`鶉#:bnpF"XJFH' `qsOX5un_ +BzJq@<%PJ5hFƓ+P=>2: bLg%$@TpVnzȓ#o qw + p{ L8oPhTQ@rեW_;=" QBYDqik RTF:؋.4N6 j{(?` dlhmȣ!MC*YOW5%(FA+ xapw? +J88~<m p娭\9E8 {L$٣@p;^ڴj*4#i8'q]" +x{L̷ : +i$qp}"kXR=t۫ تp[Lv|+=ux/ۋP͝k̗;6A RXK$[>կ(s(GJɅNquF>~ nPK(?=ҠDӶܭI$>E(p뉃" +z{Hs1u ti=7(a + z{Hጷ +)]761:\x=;aC +`ʝzp?ĜفCiҡL5qž`Z + n" +xʔrW\ +燂|rRlg7_f9 + X{L]9@;z2l9i,~[t) ʝxzpo:ٖx+z-hd _-t˺ߘ?>y7 Xc +LeB +^WftC& vm+ӏ" +^Lź@`6dBpZ)*]M}s +y XJJL?q~`? +řρsΘhBKX}l#V 誔8L_.?HR{7:=;6(At2 +ʝzDpߖ +JY+SL2MWN~y " X{L~E4.PB} XnHv~<7 + {Lߠ +ɨ80("f'& dCm cLy ;Z4+#4tEY- +B {L ^ԮmLX8g#PAq[^O?" +hxL?7ڲ"xIe;Zw&z/?{i XcL/!5m'+;U:)"- \$ +Tìz ʠ0{pA|+"Dt9Y +Q?N: ʜ8Jp}xސcp7Nkٷ@VAx,ĉ^#Ɇr!۩$n, z8~HWލr~R_LD,jJga߆_ +Dq +LcU4=]  !&S}}" !Xzp5k N'RM1-amf+Ve& +DpZ, +p5uAjCp,f9p:7,K QPzsZl >Q ;<@a,oLTdV' +~Ldϻ|8)yA8? Q'Kz"ʠXp92]-jO`Wz,qB` Hp +ʙDpZU,)zYo8 ~9eQZ2 +J {L.-~z~#'C +]-7-Z# {LL8vF@D +O\ o; DuWӊ +8ޠ({ r~# <:Xb@y%uZ" B{q>MoOȇx"ar(pKAd1 B bs$+0 }pKlS h9c<8r[Hubo B{Nq4wCp?6@l-)\BC}=Paq0`=Ǜ`g8IK= 0@' +_1 xhzNL, I)dJEBOf@`EgM,L,Z> BbqB,gʈ@}@F!=bw-^K$wӖg +ڡ|pB=?7x3<] +/y^| >KJq*x+ĆauN#32 +H~L]␟W +|R7#.[u1lX +|(m~_" @P{LR>߬7K`XITg-M? +cDpC,G[[^k˺šܳo]G ¨XcLF*_"Rxv> qZeeTӪy1w {L9_F:v'Ba(  + @a" +{p +tu)Qj@܁9nEM8a.ˮ#w ~XcH(o\B-(ζVA1XcyY`Cvi~z œcNo +n"JSPY&ڟFF +Bcq|MC,#cgU~guA0" +H{LOW`?V0+H"h]Db!  c +L}보r +*QM`DϿǀc} 8{LPuJ!bq +惜0q6,u0T 8{L[6\;a+gAv%3Ϡ +" +8{pyv@(.i(|sstN7O%8L& œX{L"(' ///fްVz h ྘({LS/Ȁy00g@ 71A.zԤ|1i +0Xzp}/:A/p>bC5dgz§R_" +⠸{pѿK:&u|X1eOn + zJp|>7ܹґ2uP5Bge%)LF œ{L1LKf_҇)FCWYطM bNr@*}lZUT" ☨zNp4> (q-VcXT#&St^o FbNqW,>Ԇbc8,rG-3Q ,Dz煮ߎ zJpyO~@!TGA(KhhJ)o AByqzߨ,1d+%:3 7 +$}i[z~O" +X{ +p+NB!^ 4 +#!B3Rl"mإѰ +/ yBzJqp!8wL9EhʲҋԎ~ VQ zDp]4jZ@&Nm P?" +apxϯ5 +l~Bor8h!2,\PR So +0{L)߫ + q/b!AٴbѦ'})" Ȣ8L툵.X1hfA2H2JLzE'WCWP$ +f; P{L +س@S4V egi- qK ⡘zpz/`6:%RD:'}h?eJ pX{Lz@  -F&B8& dY+̎S\" +q>|Dq伀[T@ X0aiuW+)nljO ~8H[ˀ[4(fiB.G)›f0I ;ʰ LXFj|)7c)Qko{I=8'/ P{qL(VA@0Z'QS\"v,ǧM@o {p?6UL( +P?\UJN#2a_"?" +0{rQ-06_T+}aUa8|1 ┨p}0+"i,wr݉xxz,}# HcLJW |LpYUXks +qEŸ;N.'x&gr E:p?g" +zsd +d ӴD]\z5dNC}o +{q˗  8އSM|!@4jm { +p;+R pmxl<_ ;0 {pDn,]z XE$ +CW6f0iw" +Y +pr.k_(~{Q[I >TpЗIϱa  +ypׯP?r??I`=DMʨ= YҒ)u +iFzqq>oQ~>3hDM, xLabt1>2z_ɀ +L&!T *|K#Ղ" +8ڭJ qv_4 }#JPf +K3B}> +yF3qԹ;ϛ.n=&qt +W|f FbDq {s + +0:CBktW3aȿ3/ BhcDq0 :d`6P2@"L{%W P @{L,Al)PEkAh |Mu?PwU3" 1>paq8DL9F⯭^r7z' Bpyq<4rpVKϺɂc: +1[uU 袸hzNL|M* FLJZf3]xI(5E BpzqoFձY:mWںd DY:%9G" FJqϨ~TQpTY}a@z? qB0{Jq ZT✓euCRj-?B3GNq' BXc +q7yɥxvx"x *UE;mi{ ({LOAd.UDڑa6o#\A_^,'" +Q +P{p )m|v +Oj|$+FL}-] P{LNy+ +xIVC_Ӫ>_ BJq +<\js\E[!E@( J +X{Loef@~8;iNn0@/IʍU25F" +BX{q@@@*@p~U^MEa?{`3o: ؚPzPLB" +1fK cd8[:y)GKѿ +ڬxzpKV_fRӃ2P/1} +BzqߞDl i!&SJ04{KA?" P~zDH*_}Hn>V=|wLlB~/_ +BX{DqxLI[Ee,$zv! zXzFH+34 !~~ + +zDpY&_'=;Ŏ%^xor\b4'W BXzDq_a gi& !\)TjG-m XXyp~֠u7ͮF".ŬGt^],/W + BXzqs`\ez $hr̯`R~&tn.n" XXzpWI)j, 9l_zXK7! xzNpQϒ`e$rOr67Y~@)n = PzpX_0^\<"6! +5mtn~ 0{L?Akm ! (Qiwګ" +Xzpc?ᗁ:"q> \ÞEWn> Xzp1ߨU$ِ?> +#P$eV'1cw xbpoSTFc`hΒa Kr1=ķ9?J +@Xzpտ*anJ ơa.d? Bz +qie*M7)fvWn" PXzp7)X > 09f+m@zتn+PyL-~4 0zDp*Ha86Ӭ&5ps| %fur/= Xzp$/폞 +٦Mu~4lVS BXaq7=75 +x.P=[6|[8˪eEWN" +QBXz +q4wyO#u j3s㕞!ud%pj} Xyp '@GFJ l#nDɘm?)! +08{L~  +PC58uʅBV3kur(W X{Lfa@{ g mK!5mA" xzpݧd} ¼ǽɘ7KFس~ Ȗ(Nn) 0`?4aoo).{cLʤ +XzpScQn݁jKFzUt3=[nq xzL_%@;vɔm xEg: 6k0" PN%>S;@F +"#y%% +}& +PҠXzpq]!6쬡sL%l.VlyR=[ vXHQ$}`/cfؖ7%05UE L7P+ϑ +zX{H1Gi^^Q9>us/Af2)cvW" P~XH: + +Ř9[f@q )umb" + xL=+wE ҡ4k/́aHq7 ~x{I3*R.lc:#*w)uH s3a@ +0LQX(+V%f4@{х\k⬭Rܲ" ҜX{Dp$_KT hJɀ[S +kY XҠxJp<,2RRyW}^[ G +x{L`4ޤu(&jhUvލ zPHr%hh`+B҈`fjTe}" +@PzJp +ȧ z̃v鄸}$2H9[vJq 8zp U +ͽRٟBV`TqiuL^ xzpA5U;,.}0䧈%2<5hks~ yp  B'TB ;z]޾" +zp}p~;`i +sC?OK(H xapA!&#b4)K[DP|yOVE~⮯o +QPzp|%FAd3D⠬{8C_2 PzppOg U`6WhBcM9="!qۋmx6" +H(p_ +yTCkR^CbDz£Fwq z +pՔ+:G-/8n4;WE zF1ϧ ޘxzpN`@A&\`6IW4IΣ1ٕ p-&@ fڽ Lj@r+%:ޘw?IZ`" Xzp9"@"XZ@9]@~cLO)z xzp=a>4x;ZoI`)/*o2o Xzp@e:S;=$%_-!eiO[e + bpu-@+}$ןH(D} j[n" 8{LXȴ}捲7rFǙ&Ʀri. +azJqF\~GT=ŌcxxqpUL%5 ྼ{JLk\@L l|aӬ`+tq-I\` ¨L~S_GA +aD.;c@USy" о8~L@\eD\$k6OEgIfCu呭Z XLf FRW8h]m |&JTm XDpl?Iqlė懃PXw6HM޼ оx{LSs$puk(8t229'?O?M PL[EG0 ~W.OPq$|W(:+¥c~" +p +L7ddڼ}!,Ȕ8Fa9B%6 piE}DcVV>#[u'RLw ¨0{NN#?ёA'c *Px=ƌ]d9E +(Jr~S +`ishl7B*L& +N" + Dp/bO>?:j."LQf=W]e X|JLկ (Ope'D20P +ɎU" 8p7B@~{PG.'*9j8hy XL%Lʁt 7䰙|ķ)"}E*" + N#A~PETIɋCdjb'7L 8 +Lø2xcAT)=V@# +a)2kuz 8N +FFNh@ y~`;?X +8yp\ X/D b?6t*N&jR.*" 辠XJL>D@cd*BH~F{Br|p_ ~L0 -Xd#e384X Bs XqVW@N(ӂ0VPܩLL0PZ5[~ X{L`fs*އ + +Mod ʓK:G'=~X" Ȏ8LsμB$|w=E(X 3 !*K)E px{L[ M ~5RH) OߠF ֜Xzpg@dj0]囉@D̵Cd7K&v + 0L~cQa$|SAgMe}" XcL O`V(PKG3JQPc%Tg +ƤXzDp_2aV2^Efu]\8{yP1* ypo>$8exSYF;Qi[ ؾp~L>(U*a[2.KnG|J+Q x{JLC)JP +2\+4՜K +@~JLx7vq<.t zuә \-" p{L<G"SIxHIُ:rS +o +0p_Fc"ľ6p)1V&r fP{( ?̀~:,!F +O +!Jח +xq[MZݠ~)5QJyș{!nOd?k" +Xƌ0p*Edkc^aJ˹vN2_cխ XcLo+MT^l-u{1ܨ + x{LENwIXab6sBqG;&!H  +x{LF]o@ʥ}wWU +r*ACQ1'(" PX{LzY@Q70_ _k;YĤ,#L)Գl X{L UY`BziU j\OAϕ~x6OD +0L!BYt2B3y*x}K" 0L{*S`@mjЪ- +:c^O3 +0LCxq<-[UF[8[Zq[_ L8. 9u0|v7i1LVZ Vx{$6@)tl:AĪ-&#a1 +ǤE +1xDp֩>+`@/2HevxOq]D" +x{LjnޒvG~Upj>5'](# x{Lw@}!,\$IUB`僇(Z#nOct7 ֜Xzp SǩNaB((}$S ҠxDpՑ +k>Jd#pϕK +hQc" +x +L[ ~IPY]-%䚳JO[ x{L#bu$L@Q5Zq`/'e^Ux +XL>@ j>0%tkN{8бq3  \ No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.