From bf87e5c6847587a2f6133fc82d82c498e42763c4 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Thu, 26 Dec 2024 23:04:02 +0000 Subject: [PATCH 1/9] Add GFX: device and some basic ioctls. --- neotron-os/src/commands/screen.rs | 211 +++++++++++---- neotron-os/src/program.rs | 432 ++++++++++++++++++++++++++---- 2 files changed, 532 insertions(+), 111 deletions(-) diff --git a/neotron-os/src/commands/screen.rs b/neotron-os/src/commands/screen.rs index f64b8e8..04ae19a 100644 --- a/neotron-os/src/commands/screen.rs +++ b/neotron-os/src/commands/screen.rs @@ -32,16 +32,10 @@ pub static MODE_ITEM: menu::Item = menu::Item { pub static GFX_ITEM: menu::Item = menu::Item { item_type: menu::ItemType::Callback { function: gfx_cmd, - parameters: &[ - menu::Parameter::Mandatory { - parameter_name: "new_mode", - help: Some("The new gfx mode to try"), - }, - menu::Parameter::Optional { - parameter_name: "filename", - help: Some("a file to display"), - }, - ], + parameters: &[menu::Parameter::Mandatory { + parameter_name: "new_mode", + help: Some("The new gfx mode to try"), + }], }, command: "gfx", help: Some("Test a graphics mode"), @@ -107,12 +101,13 @@ fn mode_cmd(_menu: &menu::Menu, item: &menu::Item, args: &[&str], _ctx } /// Called when the "gfx" command is executed +/// +/// Performs a selection of graphical tests fn gfx_cmd(_menu: &menu::Menu, item: &menu::Item, args: &[&str], ctx: &mut Ctx) { let Some(new_mode) = menu::argument_finder(item, args, "new_mode").unwrap() else { osprintln!("Missing arg"); return; }; - let file_name = menu::argument_finder(item, args, "filename").unwrap(); let Ok(mode_num) = new_mode.parse::() else { osprintln!("Invalid integer {:?}", new_mode); return; @@ -126,48 +121,11 @@ fn gfx_cmd(_menu: &menu::Menu, item: &menu::Item, args: &[&str], ctx: let old_ptr = (api.video_get_framebuffer)(); let buffer = ctx.tpa.as_slice_u8(); - let buffer_ptr = buffer.as_mut_ptr() as *mut u32; - if let Some(file_name) = file_name { - let Ok(file) = crate::FILESYSTEM.open_file(file_name, embedded_sdmmc::Mode::ReadOnly) - else { - osprintln!("No such file."); - return; - }; - let _ = file.read(buffer); - } else { - let (odd_pattern, even_pattern) = match mode.format() { - // This is alternating hearts and diamonds - Format::Text8x16 | Format::Text8x8 => ( - u32::from_le_bytes(*b"\x03\x0F\x04\x70"), - u32::from_le_bytes(*b"\x04\x70\x03\x0F"), - ), - // Can't do a checkerboard here - so stripes will do - Format::Chunky32 => (0x0000_0000, 0x0000_0001), - // These should produce black/white checkerboard, in the default - // palette - Format::Chunky16 => (0x0000_FFFF, 0xFFFF_0000), - Format::Chunky8 => (0x000F_000F, 0x0F00_0F00), - Format::Chunky4 => (0x0F0F_0F0F, 0xF0F0_F0F0), - Format::Chunky2 => (0x3333_3333, 0xCCCC_CCCC), - Format::Chunky1 => (0x5555_5555, 0xAAAA_AAAA), - _ => todo!(), - }; - // draw a dummy non-zero data. In Chunky1 this is a checkerboard. - let line_size_words = mode.line_size_bytes() / 4; - for row in 0..mode.vertical_lines() as usize { - let word = if (row % 2) == 0 { - even_pattern - } else { - odd_pattern - }; - for col in 0..line_size_words { - let idx = (row * line_size_words) + col; - unsafe { - buffer_ptr.add(idx).write_volatile(word); - } - } - } + if mode.frame_size_bytes() > buffer.len() { + osprintln!("Not enough space in TPA"); + return; } + let buffer_ptr = buffer.as_mut_ptr() as *mut u32; if let neotron_common_bios::FfiResult::Err(e) = unsafe { (api.video_set_mode)(mode, buffer_ptr) } @@ -175,9 +133,152 @@ fn gfx_cmd(_menu: &menu::Menu, item: &menu::Item, args: &[&str], ctx: osprintln!("Couldn't set mode {}: {:?}", mode_num, e); } - // Now wait for user input - while crate::STD_INPUT.lock().get_raw().is_none() { - // spin + let gen_value = |x: u16, y: u16, colour: u32| -> u64 { + (x as u64) << 48 | (y as u64) << 32 | (colour & 0xFFFFFF) as u64 + }; + + // plots a vertical colour stripe pattern. + let vertical = |handle| -> Result<(), neotron_api::Error> { + for y in 0..mode.vertical_lines() { + let mut colour = 0u32; + for x in 0..mode.horizontal_pixels() { + let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( + handle, + crate::program::GFX_COMMAND_CHUNKY_PLOT, + gen_value(x, y, colour), + ) + .into(); + result?; + colour = colour.wrapping_add(1) & 0xFFFFFF; + } + } + + // Now wait for user input + while crate::STD_INPUT.lock().get_raw().is_none() { + // spin + } + + Ok(()) + }; + + // plots a horizontal colour stripe pattern. + let horizontal = |handle| -> Result<(), neotron_api::Error> { + let mut colour = 0u32; + for y in 0..mode.vertical_lines() { + for x in 0..mode.horizontal_pixels() { + let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( + handle, + crate::program::GFX_COMMAND_CHUNKY_PLOT, + gen_value(x, y, colour), + ) + .into(); + result?; + } + colour = colour.wrapping_add(1) & 0xFFFFFF; + } + + // Now wait for user input + while crate::STD_INPUT.lock().get_raw().is_none() { + // spin + } + + Ok(()) + }; + + // plots a rolling stripe pattern. + let rolling = |handle| -> Result<(), neotron_api::Error> { + for y in 0..mode.vertical_lines() { + let mut colour = y as u32; + for x in 0..mode.horizontal_pixels() { + let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( + handle, + crate::program::GFX_COMMAND_CHUNKY_PLOT, + gen_value(x, y, colour), + ) + .into(); + result?; + colour = colour.wrapping_add(1) & 0xFFFFFF; + } + } + + // Now wait for user input + while crate::STD_INPUT.lock().get_raw().is_none() { + // spin + } + + Ok(()) + }; + + // plots a grid + let grid = |handle| -> Result<(), neotron_api::Error> { + let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( + handle, + crate::program::GFX_COMMAND_CLEAR_SCREEN, + 0, + ) + .into(); + result?; + + let width = mode.horizontal_pixels() / 10; + let height = mode.vertical_lines() / 10; + + for y in 0..mode.vertical_lines() { + if (y % height) == 0 || (y == mode.vertical_lines() - 1) { + // solid line + for x in 0..mode.horizontal_pixels() { + let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( + handle, + crate::program::GFX_COMMAND_CHUNKY_PLOT, + gen_value(x, y, 15), + ) + .into(); + result?; + } + } else { + // stripes + for x in 0..mode.horizontal_pixels() { + let colour = if (x % width) == 0 || (x == mode.horizontal_pixels() - 1) { + 15 + } else { + 0 + }; + let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( + handle, + crate::program::GFX_COMMAND_CHUNKY_PLOT, + gen_value(x, y, colour), + ) + .into(); + result?; + } + } + } + + // Now wait for user input + while crate::STD_INPUT.lock().get_raw().is_none() { + // spin + } + + Ok(()) + }; + + let handle: Result<_, _> = + (crate::program::CALLBACK_TABLE.open)("GFX:".into(), neotron_api::file::Flags::WRITE) + .into(); + if let Ok(handle) = handle { + if let Err(e) = vertical(handle) { + osprintln!("Draw failure on vertical: {:?}", e); + } + if let Err(e) = horizontal(handle) { + osprintln!("Draw failure on horizontal: {:?}", e); + } + if let Err(e) = rolling(handle) { + osprintln!("Draw failure on rolling: {:?}", e); + } + if let Err(e) = grid(handle) { + osprintln!("Draw failure on grid: {:?}", e); + } + // close the handle + let _ = (crate::program::CALLBACK_TABLE.close)(handle); } // Put it back as it was diff --git a/neotron-os/src/program.rs b/neotron-os/src/program.rs index 7cc1878..f6d3dd1 100644 --- a/neotron-os/src/program.rs +++ b/neotron-os/src/program.rs @@ -5,7 +5,7 @@ use neotron_api::FfiByteSlice; use crate::{fs, osprintln, refcell::CsRefCell, API, FILESYSTEM}; #[allow(unused)] -static CALLBACK_TABLE: neotron_api::Api = neotron_api::Api { +pub static CALLBACK_TABLE: neotron_api::Api = neotron_api::Api { open: api_open, close: api_close, write: api_write, @@ -45,6 +45,8 @@ pub enum OpenHandle { Closed, /// Represents the audio device, Audio, + /// Represents the framebuffer device + Gfx, } /// The open handle table @@ -399,6 +401,16 @@ extern "C" fn api_open( } } } + if path.as_str().eq_ignore_ascii_case("GFX:") { + match allocate_handle(OpenHandle::Gfx) { + Ok(n) => { + return neotron_api::Result::Ok(neotron_api::file::Handle::new(n as u8)); + } + Err(_f) => { + return neotron_api::Result::Err(neotron_api::Error::OutOfMemory); + } + } + } // OK, let's assume it's a file relative to the root of our one and only volume let f = match FILESYSTEM.open_file(path.as_str(), embedded_sdmmc::Mode::ReadOnly) { @@ -478,6 +490,10 @@ extern "C" fn api_write( OpenHandle::StdIn | OpenHandle::Closed => { neotron_api::Result::Err(neotron_api::Error::BadHandle) } + OpenHandle::Gfx => { + // TODO: Allow users to write to the screen + neotron_api::Result::Err(neotron_api::Error::Unimplemented) + } } } @@ -523,6 +539,10 @@ extern "C" fn api_read( OpenHandle::Stdout | OpenHandle::StdErr | OpenHandle::Closed => { neotron_api::Result::Err(neotron_api::Error::BadHandle) } + OpenHandle::Gfx => { + // TODO: allow users to read the contents of the screen + neotron_api::Result::Err(neotron_api::Error::Unimplemented) + } } } @@ -583,61 +603,9 @@ extern "C" fn api_ioctl( let Some(h) = open_handles.get_mut(fd.value() as usize) else { return neotron_api::Result::Err(neotron_api::Error::BadHandle); }; - let api = API.get(); - match (h, command) { - (OpenHandle::Audio, 0) => { - // Getting sample rate - let neotron_common_bios::FfiResult::Ok(config) = (api.audio_output_get_config)() else { - return neotron_api::Result::Err(neotron_api::Error::DeviceSpecific); - }; - let mut result: u64 = config.sample_rate_hz as u64; - let nibble = match config.sample_format.make_safe() { - Ok(neotron_common_bios::audio::SampleFormat::EightBitMono) => 0, - Ok(neotron_common_bios::audio::SampleFormat::EightBitStereo) => 1, - Ok(neotron_common_bios::audio::SampleFormat::SixteenBitMono) => 2, - Ok(neotron_common_bios::audio::SampleFormat::SixteenBitStereo) => 3, - _ => { - return neotron_api::Result::Err(neotron_api::Error::DeviceSpecific); - } - }; - result |= nibble << 60; - neotron_api::Result::Ok(result) - } - (OpenHandle::Audio, 1) => { - // Setting sample rate - let sample_rate = value as u32; - let format = match value >> 60 { - 0 => neotron_common_bios::audio::SampleFormat::EightBitMono, - 1 => neotron_common_bios::audio::SampleFormat::EightBitStereo, - 2 => neotron_common_bios::audio::SampleFormat::SixteenBitMono, - 3 => neotron_common_bios::audio::SampleFormat::SixteenBitStereo, - _ => { - return neotron_api::Result::Err(neotron_api::Error::InvalidArg); - } - }; - let config = neotron_common_bios::audio::Config { - sample_format: format.make_ffi_safe(), - sample_rate_hz: sample_rate, - }; - match (api.audio_output_set_config)(config) { - neotron_common_bios::FfiResult::Ok(_) => { - osprintln!("audio {}, {:?}", sample_rate, format); - neotron_api::Result::Ok(0) - } - neotron_common_bios::FfiResult::Err(_) => { - neotron_api::Result::Err(neotron_api::Error::DeviceSpecific) - } - } - } - (OpenHandle::Audio, 2) => { - // Setting sample space - match (api.audio_output_get_space)() { - neotron_common_bios::FfiResult::Ok(n) => neotron_api::Result::Ok(n as u64), - neotron_common_bios::FfiResult::Err(_) => { - neotron_api::Result::Err(neotron_api::Error::DeviceSpecific) - } - } - } + match h { + OpenHandle::Audio => ioctl_audio(h, command, value), + OpenHandle::Gfx => ioctl_gfx(h, command, value), _ => neotron_api::Result::Err(neotron_api::Error::InvalidArg), } } @@ -751,6 +719,358 @@ extern "C" fn api_malloc( /// Free some previously allocated memory extern "C" fn api_free(_ptr: *mut core::ffi::c_void, _size: usize, _alignment: usize) {} +/// Handle audio-specific ioctls +fn ioctl_audio(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Result { + let api = API.get(); + match command { + 0 => { + // Getting sample rate + let neotron_common_bios::FfiResult::Ok(config) = (api.audio_output_get_config)() else { + return neotron_api::Result::Err(neotron_api::Error::DeviceSpecific); + }; + let mut result: u64 = config.sample_rate_hz as u64; + let nibble = match config.sample_format.make_safe() { + Ok(neotron_common_bios::audio::SampleFormat::EightBitMono) => 0, + Ok(neotron_common_bios::audio::SampleFormat::EightBitStereo) => 1, + Ok(neotron_common_bios::audio::SampleFormat::SixteenBitMono) => 2, + Ok(neotron_common_bios::audio::SampleFormat::SixteenBitStereo) => 3, + _ => { + return neotron_api::Result::Err(neotron_api::Error::DeviceSpecific); + } + }; + result |= nibble << 60; + neotron_api::Result::Ok(result) + } + 1 => { + // Setting sample rate + let sample_rate = value as u32; + let format = match value >> 60 { + 0 => neotron_common_bios::audio::SampleFormat::EightBitMono, + 1 => neotron_common_bios::audio::SampleFormat::EightBitStereo, + 2 => neotron_common_bios::audio::SampleFormat::SixteenBitMono, + 3 => neotron_common_bios::audio::SampleFormat::SixteenBitStereo, + _ => { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + } + }; + let config = neotron_common_bios::audio::Config { + sample_format: format.make_ffi_safe(), + sample_rate_hz: sample_rate, + }; + match (api.audio_output_set_config)(config) { + neotron_common_bios::FfiResult::Ok(_) => { + osprintln!("audio {}, {:?}", sample_rate, format); + neotron_api::Result::Ok(0) + } + neotron_common_bios::FfiResult::Err(_) => { + neotron_api::Result::Err(neotron_api::Error::DeviceSpecific) + } + } + } + 2 => { + // Setting sample space + match (api.audio_output_get_space)() { + neotron_common_bios::FfiResult::Ok(n) => neotron_api::Result::Ok(n as u64), + neotron_common_bios::FfiResult::Err(_) => { + neotron_api::Result::Err(neotron_api::Error::DeviceSpecific) + } + } + } + _ => neotron_api::Result::Err(neotron_api::Error::InvalidArg), + } +} + +/// Clear the screen +/// +/// The command the colour, which is taken modulo the number of on-screen colours. +pub const GFX_COMMAND_CLEAR_SCREEN: u64 = 0; + +/// Plot a chunky pixel +/// +/// The command contains [ x | y | mode | colour ]. +/// +/// * `x` is 16 bits and marks the horizontal position (0 is left) +/// * `y` is 16 bits and marks the vertical position (0 is top) +/// * `mode` is 8 bits and is currently ignored +/// * `colour` is 24 bits, and is taken modulo the number of on-screen colours +pub const GFX_COMMAND_CHUNKY_PLOT: u64 = 1; + +/// Handle framebuffer-specific ioctls +fn ioctl_gfx(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Result { + let api = API.get(); + match command { + GFX_COMMAND_CLEAR_SCREEN => { + let colour = (value & 0xFFFFFF) as u32; + let fb_ptr = (api.video_get_framebuffer)(); + let video_mode = (api.video_get_mode)(); + let pixel_byte = match video_mode.format() { + // neotron_common_bios::video::Format::Chunky32 unsupported + // neotron_common_bios::video::Format::Chunky16 unsupported + neotron_common_bios::video::Format::Chunky8 => colour as u8, + neotron_common_bios::video::Format::Chunky4 => { + let nibble = (colour as u8) & 0x0F; + nibble << 4 | nibble + } + neotron_common_bios::video::Format::Chunky2 => { + let pair = (colour as u8) & 0x03; + pair << 6 | pair << 4 | pair << 2 | pair + } + neotron_common_bios::video::Format::Chunky1 => { + let bit = (colour as u8) & 0x01; + if bit != 0 { + 0xFF + } else { + 0x00 + } + } + _ => return neotron_api::Result::Err(neotron_api::Error::BadHandle), + }; + for y in 0..video_mode.vertical_lines() { + let line_start = + unsafe { fb_ptr.byte_add(video_mode.line_size_bytes() * (y as usize)) } + as *mut u8; + unsafe { + line_start.write_bytes(pixel_byte, video_mode.line_size_bytes()); + } + } + Ok(0).into() + } + GFX_COMMAND_CHUNKY_PLOT => { + // the position on screen + let x = (value >> 48) as u16; + let y = (value >> 32) as u16; + // whether to "set", "xor", "or", or "and" the pixel. + // currently only "set" is supported (0) + let _mode = (value >> 24) as u8; + // the colour to use + let colour = (value & 0xFFFFFF) as u32; + let fb_ptr = (api.video_get_framebuffer)(); + let video_mode = (api.video_get_mode)(); + if x >= video_mode.horizontal_pixels() { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + } + if y >= video_mode.vertical_lines() { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + } + // our video line starts here + let line_start = + unsafe { fb_ptr.byte_add(video_mode.line_size_bytes() * (y as usize)) } as *mut u8; + let result = match video_mode.format() { + // neotron_common_bios::video::Format::Chunky32 unsupported + // neotron_common_bios::video::Format::Chunky16 unsupported + neotron_common_bios::video::Format::Chunky8 => { + chunky_plot::<8>(line_start, x, colour) + } + neotron_common_bios::video::Format::Chunky4 => { + chunky_plot::<4>(line_start, x, colour) + } + neotron_common_bios::video::Format::Chunky2 => { + chunky_plot::<2>(line_start, x, colour) + } + neotron_common_bios::video::Format::Chunky1 => { + chunky_plot::<1>(line_start, x, colour) + } + _ => Err(neotron_api::Error::BadHandle), + }; + result.into() + } + _ => neotron_api::Result::Err(neotron_api::Error::InvalidArg), + } +} + +/// Plot a single pixel. +fn chunky_plot( + line_start: *mut u8, + x: u16, + colour: u32, +) -> Result { + // this is 8, 4, 2 or 1 + let pixels_per_byte = 8 / BPP; + // pick a byte in the line + let byte_ptr = unsafe { line_start.add(x as usize / pixels_per_byte as usize) }; + // load the byte + let mut byte = unsafe { byte_ptr.read() }; + // this is pixels_per_byte-1 to 0, because the left hand pixel has the upper-most bits + let pixel_in_byte = (pixels_per_byte - 1) - (x % pixels_per_byte as u16) as u8; + // This is 2, 4, 16 or 256 + let num_colours = (1 << BPP) as u32; + // this is 0b1, 0b11, 0xF or 0xFF + let pixel_mask = num_colours - 1; + // this marks the pixels of interest + let shifted_pixel_mask = (pixel_mask << (pixel_in_byte * BPP)) as u8; + // cap the colour + let shifted_new_colour = ((colour & pixel_mask) << (pixel_in_byte * BPP)) as u8; + // zero out the old colour + byte &= !shifted_pixel_mask; + // set the new colour + byte |= shifted_new_colour; + // write it back + unsafe { + byte_ptr.write(byte); + } + Ok(0) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn chunky1_test() { + let mut buffer = vec![0x00u8; (640 / 8) + 1]; + + _ = chunky_plot::<1>(buffer.as_mut_ptr(), 0, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<1>(buffer.as_mut_ptr(), 1, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<1>(buffer.as_mut_ptr(), 8, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<1>(buffer.as_mut_ptr(), 15, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b1000_0001, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<1>(buffer.as_mut_ptr(), 15, 0).unwrap(); + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + } + + #[test] + fn chunky2_test() { + let mut buffer = vec![0x00u8; (640 / 4) + 1]; + + _ = chunky_plot::<2>(buffer.as_mut_ptr(), 0, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<2>(buffer.as_mut_ptr(), 1, 2).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0110_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<2>(buffer.as_mut_ptr(), 1, 3).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0111_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<2>(buffer.as_mut_ptr(), 4, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0111_0000, 0b0100_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<2>(buffer.as_mut_ptr(), 7, 3).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0111_0000, 0b0100_0011, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + } + + #[test] + fn chunky4_test() { + let mut buffer = vec![0x00u8; (640 / 2) + 1]; + + _ = chunky_plot::<4>(buffer.as_mut_ptr(), 0, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<4>(buffer.as_mut_ptr(), 1, 2).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0001_0010, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<4>(buffer.as_mut_ptr(), 1, 3).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0001_0011, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<4>(buffer.as_mut_ptr(), 4, 1).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = chunky_plot::<4>(buffer.as_mut_ptr(), 7, 15).unwrap(); + assert_eq!( + &buffer[0..4], + [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_1111], + "Got {:02x?}", + &buffer[0..4] + ); + } + + #[test] + fn chunky8_test() { + let mut buffer = vec![0x00u8; 641]; + + _ = chunky_plot::<8>(buffer.as_mut_ptr(), 0, 1).unwrap(); + assert_eq!(&buffer[0..4], [1, 0, 0, 0]); + + _ = chunky_plot::<8>(buffer.as_mut_ptr(), 1, 2).unwrap(); + assert_eq!(&buffer[0..4], [1, 2, 0, 0]); + + _ = chunky_plot::<8>(buffer.as_mut_ptr(), 1, 255).unwrap(); + assert_eq!(&buffer[0..4], [1, 255, 0, 0]); + + _ = chunky_plot::<8>(buffer.as_mut_ptr(), 3, 127).unwrap(); + assert_eq!(&buffer[0..4], [1, 255, 0, 127],); + + _ = chunky_plot::<8>(buffer.as_mut_ptr(), 3, 255).unwrap(); + assert_eq!(&buffer[0..4], [1, 255, 0, 255],); + } +} + // =========================================================================== // End of file // =========================================================================== From df56e970060e77b632709681df43422448695dc3 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Fri, 27 Dec 2024 23:09:41 +0000 Subject: [PATCH 2/9] Move `gfx` command to be `vidtest` utility. Requires new neotron-sdk. Running an application now also caches and restores the current video mode (incase the app leaves it in a mess), which is done through the VGACONSOLE object so you can't write text to a framebuffer and ruin it. --- Cargo.lock | 11 +- Cargo.toml | 2 +- nbuild/src/main.rs | 7 + neotron-os/src/commands/mod.rs | 1 - neotron-os/src/commands/screen.rs | 251 ++---------------------------- neotron-os/src/program.rs | 42 +++++ neotron-os/src/vgaconsole.rs | 39 ++++- utilities/neoplay/src/main.rs | 2 +- utilities/vidtest/Cargo.toml | 12 ++ utilities/vidtest/README.md | 10 ++ utilities/vidtest/build.rs | 3 + utilities/vidtest/src/lib.rs | 200 ++++++++++++++++++++++++ utilities/vidtest/src/main.rs | 14 ++ 13 files changed, 348 insertions(+), 246 deletions(-) create mode 100644 utilities/vidtest/Cargo.toml create mode 100644 utilities/vidtest/README.md create mode 100644 utilities/vidtest/build.rs create mode 100644 utilities/vidtest/src/lib.rs create mode 100644 utilities/vidtest/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 5dd2778..f7bace9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -277,11 +277,11 @@ dependencies = [ [[package]] name = "neotron-sdk" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2043d6202942b6ebecbf02c95a0d1498bade2ffb287355af02fee6a5ab5de331" +source = "git+https://github.com/neotron-compute/neotron-sdk.git?branch=add-gfx-ioctl-defines#49509fce305a4d7cf956dcfcaba06a06a307fd7e" dependencies = [ "crossterm", "neotron-api 0.2.0", + "neotron-common-bios", "neotron-ffi", ] @@ -498,6 +498,13 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "vidtest" +version = "0.1.0" +dependencies = [ + "neotron-sdk", +] + [[package]] name = "vte" version = "0.12.1" diff --git a/Cargo.toml b/Cargo.toml index 466312f..bd3f472 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ exclude = [ ] [workspace.dependencies] -neotron-sdk = "0.2.0" +neotron-sdk = { git = "https://github.com/neotron-compute/neotron-sdk.git", branch = "add-gfx-ioctl-defines" } [profile.release] lto = true diff --git a/nbuild/src/main.rs b/nbuild/src/main.rs index b8c3331..68c7bc1 100644 --- a/nbuild/src/main.rs +++ b/nbuild/src/main.rs @@ -72,6 +72,13 @@ fn packages() -> Vec { kind: nbuild::PackageKind::Utility, testable: nbuild::Testable::No, }, + nbuild::Package { + name: "vidtest", + path: std::path::Path::new("./utilities/vidtest/Cargo.toml"), + output_template: Some("./target/{target}/{profile}/vidtest"), + kind: nbuild::PackageKind::Utility, + testable: nbuild::Testable::No, + }, // *** OS *** nbuild::Package { name: "Neotron OS", diff --git a/neotron-os/src/commands/mod.rs b/neotron-os/src/commands/mod.rs index 3c3324e..67eabd2 100644 --- a/neotron-os/src/commands/mod.rs +++ b/neotron-os/src/commands/mod.rs @@ -35,7 +35,6 @@ pub static OS_MENU: menu::Menu = menu::Menu { &fs::ROM_ITEM, &screen::CLS_ITEM, &screen::MODE_ITEM, - &screen::GFX_ITEM, &input::KBTEST_ITEM, &hardware::SHUTDOWN_ITEM, &sound::MIXER_ITEM, diff --git a/neotron-os/src/commands/screen.rs b/neotron-os/src/commands/screen.rs index 04ae19a..f8cf592 100644 --- a/neotron-os/src/commands/screen.rs +++ b/neotron-os/src/commands/screen.rs @@ -1,12 +1,6 @@ //! Screen-related commands for Neotron OS -use crate::{ - bios::{ - video::{Format, Mode}, - ApiResult, - }, - osprint, osprintln, Ctx, -}; +use crate::{bios::video::Mode, osprint, osprintln, Ctx}; pub static CLS_ITEM: menu::Item = menu::Item { item_type: menu::ItemType::Callback { @@ -29,18 +23,6 @@ pub static MODE_ITEM: menu::Item = menu::Item { help: Some("List/change video mode"), }; -pub static GFX_ITEM: menu::Item = menu::Item { - item_type: menu::ItemType::Callback { - function: gfx_cmd, - parameters: &[menu::Parameter::Mandatory { - parameter_name: "new_mode", - help: Some("The new gfx mode to try"), - }], - }, - command: "gfx", - help: Some("Test a graphics mode"), -}; - /// Called when the "cls" command is executed. fn cls_cmd(_menu: &menu::Menu, _item: &menu::Item, _args: &[&str], _ctx: &mut Ctx) { // Reset SGR, go home, clear screen, @@ -49,63 +31,8 @@ fn cls_cmd(_menu: &menu::Menu, _item: &menu::Item, _args: &[&str], _ct /// Called when the "mode" command is executed fn mode_cmd(_menu: &menu::Menu, item: &menu::Item, args: &[&str], _ctx: &mut Ctx) { - if let Some(new_mode) = menu::argument_finder(item, args, "new_mode").unwrap() { - let Ok(mode_num) = new_mode.parse::() else { - osprintln!("Invalid integer {:?}", new_mode); - return; - }; - let Some(mode) = Mode::try_from_u8(mode_num) else { - osprintln!("Invalid mode {:?}", new_mode); - return; - }; - let has_vga = { - let mut guard = crate::VGA_CONSOLE.lock(); - guard.as_mut().is_some() - }; - if !has_vga { - osprintln!("No VGA console."); - return; - } - let api = crate::API.get(); - match mode.format() { - Format::Text8x16 => {} - Format::Text8x8 => {} - _ => { - osprintln!("Not a text mode?"); - return; - } - } - if (api.video_mode_needs_vram)(mode) { - // The OS currently has no VRAM for text modes - osprintln!("That mode requires more VRAM than the BIOS has."); - return; - } - // # Safety - // - // It's always OK to pass NULl to this API. - match unsafe { (api.video_set_mode)(mode, core::ptr::null_mut()) } { - ApiResult::Ok(_) => { - let mut guard = crate::VGA_CONSOLE.lock(); - if let Some(console) = guard.as_mut() { - console.change_mode(mode); - } - osprintln!("Now in mode {}", mode.as_u8()); - } - ApiResult::Err(e) => { - osprintln!("Failed to change mode: {:?}", e); - } - } - } else { - print_modes(); - } -} - -/// Called when the "gfx" command is executed -/// -/// Performs a selection of graphical tests -fn gfx_cmd(_menu: &menu::Menu, item: &menu::Item, args: &[&str], ctx: &mut Ctx) { let Some(new_mode) = menu::argument_finder(item, args, "new_mode").unwrap() else { - osprintln!("Missing arg"); + print_modes(); return; }; let Ok(mode_num) = new_mode.parse::() else { @@ -116,174 +43,20 @@ fn gfx_cmd(_menu: &menu::Menu, item: &menu::Item, args: &[&str], ctx: osprintln!("Invalid mode {:?}", new_mode); return; }; - let api = crate::API.get(); - let old_mode = (api.video_get_mode)(); - let old_ptr = (api.video_get_framebuffer)(); - - let buffer = ctx.tpa.as_slice_u8(); - if mode.frame_size_bytes() > buffer.len() { - osprintln!("Not enough space in TPA"); + let mut lock = crate::VGA_CONSOLE.lock(); + let Some(vga_console) = lock.as_mut() else { + osprintln!("No VGA console."); return; - } - let buffer_ptr = buffer.as_mut_ptr() as *mut u32; - - if let neotron_common_bios::FfiResult::Err(e) = - unsafe { (api.video_set_mode)(mode, buffer_ptr) } - { - osprintln!("Couldn't set mode {}: {:?}", mode_num, e); - } - - let gen_value = |x: u16, y: u16, colour: u32| -> u64 { - (x as u64) << 48 | (y as u64) << 32 | (colour & 0xFFFFFF) as u64 }; - - // plots a vertical colour stripe pattern. - let vertical = |handle| -> Result<(), neotron_api::Error> { - for y in 0..mode.vertical_lines() { - let mut colour = 0u32; - for x in 0..mode.horizontal_pixels() { - let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( - handle, - crate::program::GFX_COMMAND_CHUNKY_PLOT, - gen_value(x, y, colour), - ) - .into(); - result?; - colour = colour.wrapping_add(1) & 0xFFFFFF; - } + // Passing a null pointer is OK here because the BIOS will either allocate + // space, or give us a blank screen. + match unsafe { vga_console.change_mode(mode, core::ptr::null_mut()) } { + Ok(_) => { + osprintln!("Changed to mode {}", mode_num); } - - // Now wait for user input - while crate::STD_INPUT.lock().get_raw().is_none() { - // spin + Err(e) => { + osprintln!("Failed to set mode {}: BIOS said {:?}", mode_num, e); } - - Ok(()) - }; - - // plots a horizontal colour stripe pattern. - let horizontal = |handle| -> Result<(), neotron_api::Error> { - let mut colour = 0u32; - for y in 0..mode.vertical_lines() { - for x in 0..mode.horizontal_pixels() { - let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( - handle, - crate::program::GFX_COMMAND_CHUNKY_PLOT, - gen_value(x, y, colour), - ) - .into(); - result?; - } - colour = colour.wrapping_add(1) & 0xFFFFFF; - } - - // Now wait for user input - while crate::STD_INPUT.lock().get_raw().is_none() { - // spin - } - - Ok(()) - }; - - // plots a rolling stripe pattern. - let rolling = |handle| -> Result<(), neotron_api::Error> { - for y in 0..mode.vertical_lines() { - let mut colour = y as u32; - for x in 0..mode.horizontal_pixels() { - let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( - handle, - crate::program::GFX_COMMAND_CHUNKY_PLOT, - gen_value(x, y, colour), - ) - .into(); - result?; - colour = colour.wrapping_add(1) & 0xFFFFFF; - } - } - - // Now wait for user input - while crate::STD_INPUT.lock().get_raw().is_none() { - // spin - } - - Ok(()) - }; - - // plots a grid - let grid = |handle| -> Result<(), neotron_api::Error> { - let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( - handle, - crate::program::GFX_COMMAND_CLEAR_SCREEN, - 0, - ) - .into(); - result?; - - let width = mode.horizontal_pixels() / 10; - let height = mode.vertical_lines() / 10; - - for y in 0..mode.vertical_lines() { - if (y % height) == 0 || (y == mode.vertical_lines() - 1) { - // solid line - for x in 0..mode.horizontal_pixels() { - let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( - handle, - crate::program::GFX_COMMAND_CHUNKY_PLOT, - gen_value(x, y, 15), - ) - .into(); - result?; - } - } else { - // stripes - for x in 0..mode.horizontal_pixels() { - let colour = if (x % width) == 0 || (x == mode.horizontal_pixels() - 1) { - 15 - } else { - 0 - }; - let result: Result<_, _> = (crate::program::CALLBACK_TABLE.ioctl)( - handle, - crate::program::GFX_COMMAND_CHUNKY_PLOT, - gen_value(x, y, colour), - ) - .into(); - result?; - } - } - } - - // Now wait for user input - while crate::STD_INPUT.lock().get_raw().is_none() { - // spin - } - - Ok(()) - }; - - let handle: Result<_, _> = - (crate::program::CALLBACK_TABLE.open)("GFX:".into(), neotron_api::file::Flags::WRITE) - .into(); - if let Ok(handle) = handle { - if let Err(e) = vertical(handle) { - osprintln!("Draw failure on vertical: {:?}", e); - } - if let Err(e) = horizontal(handle) { - osprintln!("Draw failure on horizontal: {:?}", e); - } - if let Err(e) = rolling(handle) { - osprintln!("Draw failure on rolling: {:?}", e); - } - if let Err(e) = grid(handle) { - osprintln!("Draw failure on grid: {:?}", e); - } - // close the handle - let _ = (crate::program::CALLBACK_TABLE.close)(handle); - } - - // Put it back as it was - unsafe { - (api.video_set_mode)(old_mode, old_ptr); } } diff --git a/neotron-os/src/program.rs b/neotron-os/src/program.rs index f6d3dd1..ecb3a67 100644 --- a/neotron-os/src/program.rs +++ b/neotron-os/src/program.rs @@ -302,6 +302,11 @@ impl TransientProgramArea { return Err(Error::NothingLoaded); } + // Record the current video mode + let api = API.get(); + let old_mode = (api.video_get_mode)(); + let old_ptr = (api.video_get_framebuffer)(); + // Setup the default file handles let mut open_handles = OPEN_HANDLES.lock(); open_handles[0] = OpenHandle::StdIn; @@ -332,6 +337,12 @@ impl TransientProgramArea { } drop(open_handles); + let mut lock = crate::VGA_CONSOLE.lock(); + if let Some(console) = lock.as_mut() { + // put the video mode back as it was + let _ = unsafe { console.change_mode(old_mode, old_ptr) }; + } + self.last_entry = 0; Ok(result) } @@ -795,6 +806,16 @@ pub const GFX_COMMAND_CLEAR_SCREEN: u64 = 0; /// * `colour` is 24 bits, and is taken modulo the number of on-screen colours pub const GFX_COMMAND_CHUNKY_PLOT: u64 = 1; +/// Change graphics mode +/// +/// The command contains the video mode in the upper 32 bits and a pointer to a +/// framebuffer in the lower 32 bits. +/// +/// The framebuffer pointer must point to a 32-bit aligned region of memory +/// that is large enough for the selected mode. If you pass `null`, then the OS +/// will attempt to allocate a framebuffer for you. +pub const GFX_COMMAND_CHANGE_MODE: u64 = 2; + /// Handle framebuffer-specific ioctls fn ioctl_gfx(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Result { let api = API.get(); @@ -852,6 +873,9 @@ fn ioctl_gfx(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Resu if y >= video_mode.vertical_lines() { return neotron_api::Result::Err(neotron_api::Error::InvalidArg); } + if fb_ptr.is_null() { + return neotron_api::Result::Err(neotron_api::Error::NotFound); + } // our video line starts here let line_start = unsafe { fb_ptr.byte_add(video_mode.line_size_bytes() * (y as usize)) } as *mut u8; @@ -874,6 +898,24 @@ fn ioctl_gfx(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Resu }; result.into() } + GFX_COMMAND_CHANGE_MODE => { + let mode = (value >> 32) as u8; + let Some(mode) = neotron_common_bios::video::Mode::try_from_u8(mode) else { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + }; + let ptr = value as u32 as usize as *mut u32; + let mut lock = crate::VGA_CONSOLE.lock(); + if let Some(console) = lock.as_mut() { + // change the video mode + match unsafe { console.change_mode(mode, ptr) } { + Ok(_) => neotron_api::Result::Ok(0), + Err(_) => neotron_api::Result::Err(neotron_api::Error::DeviceSpecific), + } + } else { + // there is no console to change the mode for + neotron_api::Result::Err(neotron_api::Error::NotFound) + } + } _ => neotron_api::Result::Err(neotron_api::Error::InvalidArg), } } diff --git a/neotron-os/src/vgaconsole.rs b/neotron-os/src/vgaconsole.rs index 1af3a36..24027a1 100644 --- a/neotron-os/src/vgaconsole.rs +++ b/neotron-os/src/vgaconsole.rs @@ -73,13 +73,36 @@ impl VgaConsole { /// Change the video mode /// - /// Non text modes are ignored. - pub fn change_mode(&mut self, mode: Mode) { + /// The `fb_ptr` is given to the BIOS. It can be null, or it must point to a + /// region big enough to handle the chosen graphics mode. + pub unsafe fn change_mode( + &mut self, + mode: Mode, + fb_ptr: *mut u32, + ) -> Result<(), neotron_common_bios::Error> { + // TODO: support bitmap text rendering whilst in graphics mode + + // Change mode with the BIOS and return the result + let api = crate::API.get(); + if let neotron_common_bios::FfiResult::Err(e) = (api.video_set_mode)(mode, fb_ptr) { + return Err(e); + } + // set up the console for this mode if let (Some(height), Some(width)) = (mode.text_height(), mode.text_width()) { + // it's a text mode self.inner.height = height as isize; self.inner.width = width as isize; + // get whatever buffer the BIOS chose to use + self.inner.addr = (api.video_get_framebuffer)(); self.clear(); + } else { + // it's a graphics mode - disable output + self.inner.height = 0; + self.inner.width = 0; + self.inner.addr = core::ptr::null_mut(); } + + Ok(()) } /// Clear the screen. @@ -245,6 +268,10 @@ impl ConsoleInner { /// /// Don't do this if the cursor is enabled. fn write_at(&mut self, row: isize, col: isize, glyph: u8, is_cursor: bool) { + if self.addr.is_null() { + // console disabled + return; + } assert!(row < self.height, "{} >= {}?", row, self.height); assert!(col < self.width, "{} => {}?", col, self.width); if !crate::IS_PANIC.load(core::sync::atomic::Ordering::Relaxed) && !is_cursor { @@ -276,6 +303,10 @@ impl ConsoleInner { /// /// Don't do this if the cursor is enabled. fn read_at(&mut self, row: isize, col: isize) -> u8 { + if self.addr.is_null() { + // console disabled - everything is a blank space + return b' '; + } assert!(row < self.height, "{} >= {}?", row, self.height); assert!(col < self.width, "{} => {}?", col, self.width); if !crate::IS_PANIC.load(core::sync::atomic::Ordering::Relaxed) { @@ -290,6 +321,10 @@ impl ConsoleInner { /// /// The bottom line will be all space characters. fn scroll_page(&mut self) { + if self.height == 0 && self.width == 0 { + // console disabled + return; + } let row_len_words = self.width / 2; unsafe { // Scroll rows[1..=height-1] to become rows[0..=height-2]. diff --git a/utilities/neoplay/src/main.rs b/utilities/neoplay/src/main.rs index 91773ec..b10b075 100644 --- a/utilities/neoplay/src/main.rs +++ b/utilities/neoplay/src/main.rs @@ -42,7 +42,7 @@ fn real_main() -> Result<(), neotron_sdk::Error> { // Set 16-bit stereo, 44.1 kHz let dsp_path = neotron_sdk::path::Path::new("AUDIO:")?; let dsp = neotron_sdk::File::open(dsp_path, neotron_sdk::Flags::empty())?; - if dsp.ioctl(1, 3 << 60 | 44100).is_err() { + if unsafe { dsp.ioctl(1, 3 << 60 | 44100).is_err() } { let _ = writeln!(stdout, "Failed to configure audio"); return neotron_sdk::Result::Err(neotron_sdk::Error::DeviceSpecific); } diff --git a/utilities/vidtest/Cargo.toml b/utilities/vidtest/Cargo.toml new file mode 100644 index 0000000..bae4b4d --- /dev/null +++ b/utilities/vidtest/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "vidtest" +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +authors = ["Jonathan 'theJPster' Pallant "] +description = "Video Test for Neotron systems" + +[dependencies] +neotron-sdk = { workspace = true } + +# See workspace for profile settings diff --git a/utilities/vidtest/README.md b/utilities/vidtest/README.md new file mode 100644 index 0000000..0d6bc4b --- /dev/null +++ b/utilities/vidtest/README.md @@ -0,0 +1,10 @@ +# VidTest + +Displays some patterns in framebuffer mode. + +Requires a 'mode' argument. + +```text +> rom vidtest +> run 5 +``` diff --git a/utilities/vidtest/build.rs b/utilities/vidtest/build.rs new file mode 100644 index 0000000..4fbd085 --- /dev/null +++ b/utilities/vidtest/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rustc-link-arg-bin=vidtest=-Tneotron-cortex-m.ld"); +} diff --git a/utilities/vidtest/src/lib.rs b/utilities/vidtest/src/lib.rs new file mode 100644 index 0000000..734429a --- /dev/null +++ b/utilities/vidtest/src/lib.rs @@ -0,0 +1,200 @@ +//! Logic for the vidtest utility + +#![no_std] +#![deny(missing_docs)] + +use core::{cell::UnsafeCell, fmt::Write}; + +// Big enough for Mode 5 (640x480 @ 16 colours) +struct RacyBuffer { + inner: UnsafeCell<[u32; 640 * 480 / 8]>, +} + +unsafe impl Sync for RacyBuffer {} + +static FRAMEBUFFER: RacyBuffer = RacyBuffer { + inner: UnsafeCell::new([0; 640 * 480 / 8]), +}; + +/// Entry point to the program +pub fn main() -> i32 { + let mut stdout = neotron_sdk::stdout(); + let Some(new_mode) = neotron_sdk::arg(0) else { + _ = writeln!(stdout, "Must supply a mode argument, like 7 for Mode 7"); + return -1; + }; + + let Ok(mode_num) = new_mode.parse::() else { + _ = writeln!(stdout, "Invalid integer {:?}", new_mode); + return -1; + }; + let Some(mode) = neotron_sdk::VideoMode::try_from_u8(mode_num) else { + _ = writeln!(stdout, "Invalid mode {:?}", new_mode); + return -1; + }; + + let free_space = core::mem::size_of_val(&FRAMEBUFFER); + if mode.frame_size_bytes() > free_space { + _ = writeln!( + stdout, + "Mode requires {} bytes, we have {} bytes", + mode.frame_size_bytes(), + free_space + ); + return -1; + } + + let handle: Result<_, _> = neotron_sdk::File::open( + neotron_sdk::path::Path::new("GFX:").unwrap(), + neotron_sdk::Flags::WRITE, + ); + if let Ok(handle) = handle { + if let Err(e) = unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHANGE_MODE, + neotron_sdk::ioctls::gfx::change_mode_value( + mode, + FRAMEBUFFER.inner.get() as *mut u32, + ), + ) + } { + _ = writeln!(stdout, "Mode change failure: {:?}", e); + return -1; + } + if let Err(e) = vertical(&handle, mode) { + _ = writeln!(stdout, "Draw failure on vertical: {:?}", e); + } + if let Err(e) = horizontal(&handle, mode) { + _ = writeln!(stdout, "Draw failure on horizontal: {:?}", e); + } + if let Err(e) = rolling(&handle, mode) { + _ = writeln!(stdout, "Draw failure on rolling: {:?}", e); + } + if let Err(e) = grid(&handle, mode) { + _ = writeln!(stdout, "Draw failure on grid: {:?}", e); + } + } + + 0 +} + +/// plots a vertical colour stripe pattern. +fn vertical( + handle: &neotron_sdk::File, + mode: neotron_sdk::VideoMode, +) -> Result<(), neotron_sdk::Error> { + for y in 0..mode.vertical_lines() { + let mut colour = 0u32; + for x in 0..mode.horizontal_pixels() { + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, + neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, colour), + )?; + } + + colour = colour.wrapping_add(1) & 0xFFFFFF; + } + } + + wait_for_key(); + + Ok(()) +} + +/// plots a horizontal colour stripe pattern. +fn horizontal( + handle: &neotron_sdk::File, + mode: neotron_sdk::VideoMode, +) -> Result<(), neotron_sdk::Error> { + let mut colour = 0u32; + for y in 0..mode.vertical_lines() { + for x in 0..mode.horizontal_pixels() { + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, + neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, colour), + )?; + } + } + colour = colour.wrapping_add(1) & 0xFFFFFF; + } + + wait_for_key(); + + Ok(()) +} + +/// plots a rolling stripe pattern. +fn rolling( + handle: &neotron_sdk::File, + mode: neotron_sdk::VideoMode, +) -> Result<(), neotron_sdk::Error> { + for y in 0..mode.vertical_lines() { + let mut colour = y as u32; + for x in 0..mode.horizontal_pixels() { + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, + neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, colour), + )?; + } + colour = colour.wrapping_add(1) & 0xFFFFFF; + } + } + + wait_for_key(); + + Ok(()) +} + +/// plots a grid +fn grid( + handle: &neotron_sdk::File, + mode: neotron_sdk::VideoMode, +) -> Result<(), neotron_sdk::Error> { + unsafe { handle.ioctl(neotron_sdk::ioctls::gfx::COMMAND_CLEAR_SCREEN, 0) }?; + + let width = mode.horizontal_pixels() / 10; + let height = mode.vertical_lines() / 10; + + for y in 0..mode.vertical_lines() { + if (y % height) == 0 || (y == mode.vertical_lines() - 1) { + // solid line + for x in 0..mode.horizontal_pixels() { + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, + neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, 15), + )?; + } + } + } else { + // stripes + for x in 0..mode.horizontal_pixels() { + if (x % width) == 0 || (x == mode.horizontal_pixels() - 1) { + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, + neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, 15), + )?; + } + } + } + } + } + + wait_for_key(); + + Ok(()) +} + +fn wait_for_key() { + let stdin = neotron_sdk::stdin(); + let mut buffer = [0u8; 1]; + while let Ok(0) = stdin.read(&mut buffer) { + // spin + } +} + +// End of file diff --git a/utilities/vidtest/src/main.rs b/utilities/vidtest/src/main.rs new file mode 100644 index 0000000..369ccfb --- /dev/null +++ b/utilities/vidtest/src/main.rs @@ -0,0 +1,14 @@ +#![cfg_attr(target_os = "none", no_std)] +#![cfg_attr(target_os = "none", no_main)] + +#[cfg(not(target_os = "none"))] +fn main() { + neotron_sdk::init(); +} + +#[no_mangle] +extern "C" fn neotron_main() -> i32 { + vidtest::main() +} + +// End of file From a7158de90aab71bec427697a35be21c91f318f4f Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Sat, 28 Dec 2024 15:22:48 +0000 Subject: [PATCH 3/9] nbuild strips utilities. --- nbuild/src/lib.rs | 55 ++++++++++++++++++++++++++++++++++++---------- nbuild/src/main.rs | 9 ++++++-- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/nbuild/src/lib.rs b/nbuild/src/lib.rs index a516b7a..a9bbfc0 100644 --- a/nbuild/src/lib.rs +++ b/nbuild/src/lib.rs @@ -128,17 +128,7 @@ where { let path = path.as_ref(); println!("Making binary of: {}", path.display()); - let output = std::process::Command::new("rustc") - .arg("--print") - .arg("target-libdir") - .output() - .expect("Failed to run rustc --print target-libdir"); - let sysroot = String::from_utf8(output.stdout).expect("sysroot path isn't UTF-8"); - let sysroot: std::path::PathBuf = sysroot.trim().into(); - let mut objcopy = sysroot.clone(); - objcopy.pop(); - objcopy.push("bin"); - objcopy.push("llvm-objcopy"); + let objcopy = tool_path("llvm-objcopy"); let mut command_line = std::process::Command::new(objcopy); command_line.args(["-O", "binary"]); command_line.arg(path); @@ -153,4 +143,47 @@ where } } +/// Make a binary version of an ELF file +pub fn strip_elf(input_path: P1, output_path: P2) -> Result<(), ProcessError> +where + P1: AsRef, + P2: AsRef, +{ + let input_path = input_path.as_ref(); + let output_path = output_path.as_ref(); + + println!( + "Stripping {} as {}", + input_path.display(), + output_path.display() + ); + let strip = tool_path("llvm-strip"); + let mut command_line = std::process::Command::new(strip); + command_line.arg(input_path); + command_line.arg("-o"); + command_line.arg(output_path); + println!("Running: {:?}", command_line); + let output = command_line.output().map_err(ProcessError::SpawnError)?; + if output.status.success() { + Ok(()) + } else { + Err(ProcessError::RunError(output.status)) + } +} + +/// Get the path where `llvm-objcopy` and friends live. +pub fn tool_path(tool: &str) -> std::path::PathBuf { + let output = std::process::Command::new("rustc") + .arg("--print") + .arg("target-libdir") + .output() + .expect("Failed to run rustc --print target-libdir"); + let sysroot = String::from_utf8(output.stdout).expect("sysroot path isn't UTF-8"); + let mut result: std::path::PathBuf = sysroot.trim().into(); + result.pop(); + result.push("bin"); + result.push(tool); + result +} + // End of file diff --git a/nbuild/src/main.rs b/nbuild/src/main.rs index 68c7bc1..c748582 100644 --- a/nbuild/src/main.rs +++ b/nbuild/src/main.rs @@ -140,10 +140,15 @@ fn binary(packages: &[nbuild::Package], start_address: &str, target: &str) { let package_output = package .output(target, "release") .expect("utilties should have an output"); - let contents = match std::fs::read(&package_output) { + let stripped = package_output.clone() + ".stripped"; + if let Err(e) = nbuild::strip_elf(&package_output, &stripped) { + eprintln!("Reading of {} failed: {}", stripped, e); + continue; + }; + let contents = match std::fs::read(&stripped) { Ok(contents) => contents, Err(e) => { - eprintln!("Reading of {} failed: {}", package_output, e); + eprintln!("Reading of {} failed: {}", stripped, e); continue; } }; From 4b99a32c893f8a834e3028fcee7ecd00f389e719 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Sat, 28 Dec 2024 18:27:55 +0000 Subject: [PATCH 4/9] Add line drawing. Only supports a single colour. --- neotron-os/src/program.rs | 254 ++++++++++++++++++++++++++--------- neotron-os/src/vgaconsole.rs | 12 ++ utilities/vidtest/src/lib.rs | 220 ++++++++++++++++++------------ 3 files changed, 341 insertions(+), 145 deletions(-) diff --git a/neotron-os/src/program.rs b/neotron-os/src/program.rs index ecb3a67..e90d6ac 100644 --- a/neotron-os/src/program.rs +++ b/neotron-os/src/program.rs @@ -46,7 +46,22 @@ pub enum OpenHandle { /// Represents the audio device, Audio, /// Represents the framebuffer device - Gfx, + Gfx(GfxState), +} + +/// State for when writing to a graphics device +pub struct GfxState { + cursor_x: u16, + cursor_y: u16, +} + +impl GfxState { + fn new() -> GfxState { + GfxState { + cursor_x: 0, + cursor_y: 0, + } + } } /// The open handle table @@ -304,6 +319,7 @@ impl TransientProgramArea { // Record the current video mode let api = API.get(); + // TODO: Use VgaConsole to do this? let old_mode = (api.video_get_mode)(); let old_ptr = (api.video_get_framebuffer)(); @@ -413,7 +429,8 @@ extern "C" fn api_open( } } if path.as_str().eq_ignore_ascii_case("GFX:") { - match allocate_handle(OpenHandle::Gfx) { + let initial_state = GfxState::new(); + match allocate_handle(OpenHandle::Gfx(initial_state)) { Ok(n) => { return neotron_api::Result::Ok(neotron_api::file::Handle::new(n as u8)); } @@ -501,7 +518,7 @@ extern "C" fn api_write( OpenHandle::StdIn | OpenHandle::Closed => { neotron_api::Result::Err(neotron_api::Error::BadHandle) } - OpenHandle::Gfx => { + OpenHandle::Gfx(_state) => { // TODO: Allow users to write to the screen neotron_api::Result::Err(neotron_api::Error::Unimplemented) } @@ -550,7 +567,7 @@ extern "C" fn api_read( OpenHandle::Stdout | OpenHandle::StdErr | OpenHandle::Closed => { neotron_api::Result::Err(neotron_api::Error::BadHandle) } - OpenHandle::Gfx => { + OpenHandle::Gfx(_state) => { // TODO: allow users to read the contents of the screen neotron_api::Result::Err(neotron_api::Error::Unimplemented) } @@ -616,7 +633,7 @@ extern "C" fn api_ioctl( }; match h { OpenHandle::Audio => ioctl_audio(h, command, value), - OpenHandle::Gfx => ioctl_gfx(h, command, value), + OpenHandle::Gfx(state) => ioctl_gfx(state, command, value), _ => neotron_api::Result::Err(neotron_api::Error::InvalidArg), } } @@ -816,14 +833,35 @@ pub const GFX_COMMAND_CHUNKY_PLOT: u64 = 1; /// will attempt to allocate a framebuffer for you. pub const GFX_COMMAND_CHANGE_MODE: u64 = 2; +/// Move the cursor +/// +/// The command contains [ x | y | ]. +pub const GFX_COMMAND_MOVE_CURSOR: u64 = 3; + +/// Draw a line +/// +/// The command contains [ x | y | mode | colour ]. +/// +/// * `x` is 16 bits and marks the final horizontal position (0 is left) +/// * `y` is 16 bits and marks the final vertical position (0 is top) +/// * `mode` is 8 bits and is currently ignored +/// * `colour` is 24 bits, and is taken modulo the number of on-screen colours +/// +/// The start position is the cursor position. The cursor is updated to the final position. +pub const GFX_COMMAND_DRAW_LINE: u64 = 4; + /// Handle framebuffer-specific ioctls -fn ioctl_gfx(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Result { - let api = API.get(); +fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Result { + let mut lock = crate::VGA_CONSOLE.lock(); + let Some(console) = lock.as_mut() else { + // there is no graphics console + return neotron_api::Result::Err(neotron_api::Error::NotFound); + }; match command { GFX_COMMAND_CLEAR_SCREEN => { let colour = (value & 0xFFFFFF) as u32; - let fb_ptr = (api.video_get_framebuffer)(); - let video_mode = (api.video_get_mode)(); + let fb_ptr = console.get_fb(); + let video_mode = console.get_mode(); let pixel_byte = match video_mode.format() { // neotron_common_bios::video::Format::Chunky32 unsupported // neotron_common_bios::video::Format::Chunky16 unsupported @@ -865,8 +903,8 @@ fn ioctl_gfx(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Resu let _mode = (value >> 24) as u8; // the colour to use let colour = (value & 0xFFFFFF) as u32; - let fb_ptr = (api.video_get_framebuffer)(); - let video_mode = (api.video_get_mode)(); + let fb_ptr = console.get_fb(); + let video_mode = console.get_mode(); if x >= video_mode.horizontal_pixels() { return neotron_api::Result::Err(neotron_api::Error::InvalidArg); } @@ -879,53 +917,146 @@ fn ioctl_gfx(_h: &mut OpenHandle, command: u64, value: u64) -> neotron_api::Resu // our video line starts here let line_start = unsafe { fb_ptr.byte_add(video_mode.line_size_bytes() * (y as usize)) } as *mut u8; - let result = match video_mode.format() { + let chunky_plot_func = match video_mode.format() { // neotron_common_bios::video::Format::Chunky32 unsupported // neotron_common_bios::video::Format::Chunky16 unsupported - neotron_common_bios::video::Format::Chunky8 => { - chunky_plot::<8>(line_start, x, colour) - } - neotron_common_bios::video::Format::Chunky4 => { - chunky_plot::<4>(line_start, x, colour) - } - neotron_common_bios::video::Format::Chunky2 => { - chunky_plot::<2>(line_start, x, colour) - } - neotron_common_bios::video::Format::Chunky1 => { - chunky_plot::<1>(line_start, x, colour) + neotron_common_bios::video::Format::Chunky8 => chunky_plot::<8>, + neotron_common_bios::video::Format::Chunky4 => chunky_plot::<4>, + neotron_common_bios::video::Format::Chunky2 => chunky_plot::<2>, + neotron_common_bios::video::Format::Chunky1 => chunky_plot::<1>, + _ => { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); } - _ => Err(neotron_api::Error::BadHandle), }; - result.into() + unsafe { + chunky_plot_func(line_start, x, colour); + } + neotron_api::Result::Ok(0) } GFX_COMMAND_CHANGE_MODE => { - let mode = (value >> 32) as u8; - let Some(mode) = neotron_common_bios::video::Mode::try_from_u8(mode) else { + let video_mode = (value >> 32) as u8; + let Some(video_mode) = neotron_common_bios::video::Mode::try_from_u8(video_mode) else { return neotron_api::Result::Err(neotron_api::Error::InvalidArg); }; let ptr = value as u32 as usize as *mut u32; - let mut lock = crate::VGA_CONSOLE.lock(); - if let Some(console) = lock.as_mut() { - // change the video mode - match unsafe { console.change_mode(mode, ptr) } { - Ok(_) => neotron_api::Result::Ok(0), - Err(_) => neotron_api::Result::Err(neotron_api::Error::DeviceSpecific), + // change the video mode + if unsafe { console.change_mode(video_mode, ptr) }.is_err() { + return neotron_api::Result::Err(neotron_api::Error::DeviceSpecific); + }; + // reset cursor on screen mode change + state.cursor_x = 0; + state.cursor_y = 0; + neotron_api::Result::Ok(0) + } + GFX_COMMAND_MOVE_CURSOR => { + let video_mode = console.get_mode(); + let new_x = (value >> 48) as u16; + let new_y = (value >> 32) as u16; + if new_x >= video_mode.horizontal_pixels() { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + } + if new_y >= video_mode.vertical_lines() { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + } + state.cursor_x = new_x; + state.cursor_y = new_y; + neotron_api::Result::Ok(0) + } + GFX_COMMAND_DRAW_LINE => { + let video_mode = console.get_mode(); + let fb_ptr = console.get_fb(); + let stride = video_mode.line_size_bytes(); + let new_x = (value >> 48) as u16; + let new_y = (value >> 32) as u16; + let colour = (value & 0xFFFFFF) as u32; + if new_x >= video_mode.horizontal_pixels() { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + } + if new_y >= video_mode.vertical_lines() { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); + } + // Adapted from https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#All_cases + let plot_line_func = match video_mode.format() { + // neotron_common_bios::video::Format::Chunky32 unsupported + // neotron_common_bios::video::Format::Chunky16 unsupported + neotron_common_bios::video::Format::Chunky8 => plot_line::<8>, + neotron_common_bios::video::Format::Chunky4 => plot_line::<4>, + neotron_common_bios::video::Format::Chunky2 => plot_line::<2>, + neotron_common_bios::video::Format::Chunky1 => plot_line::<1>, + _ => { + return neotron_api::Result::Err(neotron_api::Error::InvalidArg); } - } else { - // there is no console to change the mode for - neotron_api::Result::Err(neotron_api::Error::NotFound) + }; + unsafe { + plot_line_func( + fb_ptr as *mut u8, + stride, + state.cursor_x as i16, + state.cursor_y as i16, + new_x as i16, + new_y as i16, + colour, + ) } + + state.cursor_x = new_x; + state.cursor_y = new_y; + neotron_api::Result::Ok(0) } _ => neotron_api::Result::Err(neotron_api::Error::InvalidArg), } } -/// Plot a single pixel. -fn chunky_plot( - line_start: *mut u8, - x: u16, +/// Plot a line +/// +/// # Safety +/// +/// Ensure `fb_ptr` points to a buffer that is at least `stride * (y_max + 1)` +/// bytes long, where `y_max` is the larger of `y0` and `y1`. +unsafe fn plot_line( + fb_ptr: *mut u8, + stride: usize, + mut x0: i16, + mut y0: i16, + x1: i16, + y1: i16, colour: u32, -) -> Result { +) { + let dx = x1.abs_diff(x0) as i16; + let sx = if x0 < x1 { 1 } else { -1 }; + let dy = -(y1.abs_diff(y0) as i16); + let sy = if y0 < y1 { 1 } else { -1 }; + let line_offset = if y0 < y1 { + stride as isize + } else { + -(stride as isize) + }; + let mut error = dx + dy; + let mut line_start = unsafe { fb_ptr.add(stride * y0 as usize) }; + loop { + chunky_plot::(line_start, x0 as u16, colour); + if x0 == x1 && y0 == y1 { + break; + } + let e2 = error * 2; + if e2 >= dy { + error += dy; + x0 += sx; + } + if e2 <= dx { + error += dx; + y0 += sy; + line_start = line_start.offset(line_offset); + } + } +} + +/// Plot a single pixel. +/// +/// # Safety +/// +/// Ensure `line_start` points to a buffer that is at least `x * BPP / 8` bytes long. +unsafe fn chunky_plot(line_start: *mut u8, x: u16, colour: u32) { // this is 8, 4, 2 or 1 let pixels_per_byte = 8 / BPP; // pick a byte in the line @@ -950,7 +1081,6 @@ fn chunky_plot( unsafe { byte_ptr.write(byte); } - Ok(0) } #[cfg(test)] @@ -961,7 +1091,7 @@ mod tests { fn chunky1_test() { let mut buffer = vec![0x00u8; (640 / 8) + 1]; - _ = chunky_plot::<1>(buffer.as_mut_ptr(), 0, 1).unwrap(); + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 0, 1) }; assert_eq!( &buffer[0..4], [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -969,7 +1099,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<1>(buffer.as_mut_ptr(), 1, 1).unwrap(); + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 1, 1) }; assert_eq!( &buffer[0..4], [0b1100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -977,7 +1107,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<1>(buffer.as_mut_ptr(), 8, 1).unwrap(); + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 8, 1) }; assert_eq!( &buffer[0..4], [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], @@ -985,7 +1115,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<1>(buffer.as_mut_ptr(), 15, 1).unwrap(); + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 15, 1) }; assert_eq!( &buffer[0..4], [0b1100_0000, 0b1000_0001, 0b0000_0000, 0b0000_0000], @@ -993,7 +1123,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<1>(buffer.as_mut_ptr(), 15, 0).unwrap(); + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 15, 0) }; assert_eq!( &buffer[0..4], [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], @@ -1006,7 +1136,7 @@ mod tests { fn chunky2_test() { let mut buffer = vec![0x00u8; (640 / 4) + 1]; - _ = chunky_plot::<2>(buffer.as_mut_ptr(), 0, 1).unwrap(); + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 0, 1) }; assert_eq!( &buffer[0..4], [0b0100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -1014,7 +1144,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<2>(buffer.as_mut_ptr(), 1, 2).unwrap(); + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 1, 2) }; assert_eq!( &buffer[0..4], [0b0110_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -1022,7 +1152,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<2>(buffer.as_mut_ptr(), 1, 3).unwrap(); + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 1, 3) }; assert_eq!( &buffer[0..4], [0b0111_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -1030,7 +1160,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<2>(buffer.as_mut_ptr(), 4, 1).unwrap(); + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 4, 1) }; assert_eq!( &buffer[0..4], [0b0111_0000, 0b0100_0000, 0b0000_0000, 0b0000_0000], @@ -1038,7 +1168,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<2>(buffer.as_mut_ptr(), 7, 3).unwrap(); + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 7, 3) }; assert_eq!( &buffer[0..4], [0b0111_0000, 0b0100_0011, 0b0000_0000, 0b0000_0000], @@ -1051,7 +1181,7 @@ mod tests { fn chunky4_test() { let mut buffer = vec![0x00u8; (640 / 2) + 1]; - _ = chunky_plot::<4>(buffer.as_mut_ptr(), 0, 1).unwrap(); + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 0, 1) }; assert_eq!( &buffer[0..4], [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -1059,7 +1189,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<4>(buffer.as_mut_ptr(), 1, 2).unwrap(); + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 1, 2) }; assert_eq!( &buffer[0..4], [0b0001_0010, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -1067,7 +1197,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<4>(buffer.as_mut_ptr(), 1, 3).unwrap(); + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 1, 3) }; assert_eq!( &buffer[0..4], [0b0001_0011, 0b0000_0000, 0b0000_0000, 0b0000_0000], @@ -1075,7 +1205,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<4>(buffer.as_mut_ptr(), 4, 1).unwrap(); + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 4, 1) }; assert_eq!( &buffer[0..4], [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_0000], @@ -1083,7 +1213,7 @@ mod tests { &buffer[0..4] ); - _ = chunky_plot::<4>(buffer.as_mut_ptr(), 7, 15).unwrap(); + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 7, 15) }; assert_eq!( &buffer[0..4], [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_1111], @@ -1096,19 +1226,19 @@ mod tests { fn chunky8_test() { let mut buffer = vec![0x00u8; 641]; - _ = chunky_plot::<8>(buffer.as_mut_ptr(), 0, 1).unwrap(); + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 0, 1) }; assert_eq!(&buffer[0..4], [1, 0, 0, 0]); - _ = chunky_plot::<8>(buffer.as_mut_ptr(), 1, 2).unwrap(); + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 1, 2) }; assert_eq!(&buffer[0..4], [1, 2, 0, 0]); - _ = chunky_plot::<8>(buffer.as_mut_ptr(), 1, 255).unwrap(); + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 1, 255) }; assert_eq!(&buffer[0..4], [1, 255, 0, 0]); - _ = chunky_plot::<8>(buffer.as_mut_ptr(), 3, 127).unwrap(); + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 3, 127) }; assert_eq!(&buffer[0..4], [1, 255, 0, 127],); - _ = chunky_plot::<8>(buffer.as_mut_ptr(), 3, 255).unwrap(); + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 3, 255) }; assert_eq!(&buffer[0..4], [1, 255, 0, 255],); } } diff --git a/neotron-os/src/vgaconsole.rs b/neotron-os/src/vgaconsole.rs index 24027a1..e711b93 100644 --- a/neotron-os/src/vgaconsole.rs +++ b/neotron-os/src/vgaconsole.rs @@ -125,6 +125,18 @@ impl VgaConsole { } self.inner.cursor_enable(); } + + /// Get the current video mode + pub fn get_mode(&self) -> Mode { + let api = crate::API.get(); + (api.video_get_mode)() + } + + /// Get the framebuffer pointer + pub fn get_fb(&self) -> *mut u32 { + let api = crate::API.get(); + (api.video_get_framebuffer)() + } } // =========================================================================== diff --git a/utilities/vidtest/src/lib.rs b/utilities/vidtest/src/lib.rs index 734429a..68c70a2 100644 --- a/utilities/vidtest/src/lib.rs +++ b/utilities/vidtest/src/lib.rs @@ -61,39 +61,59 @@ pub fn main() -> i32 { _ = writeln!(stdout, "Mode change failure: {:?}", e); return -1; } - if let Err(e) = vertical(&handle, mode) { - _ = writeln!(stdout, "Draw failure on vertical: {:?}", e); - } - if let Err(e) = horizontal(&handle, mode) { - _ = writeln!(stdout, "Draw failure on horizontal: {:?}", e); - } - if let Err(e) = rolling(&handle, mode) { - _ = writeln!(stdout, "Draw failure on rolling: {:?}", e); - } if let Err(e) = grid(&handle, mode) { _ = writeln!(stdout, "Draw failure on grid: {:?}", e); } + if let Err(e) = stripes(&handle, mode) { + _ = writeln!(stdout, "Draw failure on stripes: {:?}", e); + } + if let Err(e) = radial(&handle, mode) { + _ = writeln!(stdout, "Draw failure on radial: {:?}", e); + } } 0 } -/// plots a vertical colour stripe pattern. -fn vertical( +/// plots some horizontal stripes, with all the colours +fn stripes( handle: &neotron_sdk::File, mode: neotron_sdk::VideoMode, ) -> Result<(), neotron_sdk::Error> { + let bpp = match mode.format() { + neotron_sdk::VideoFormat::Chunky8 => 8, + neotron_sdk::VideoFormat::Chunky4 => 4, + neotron_sdk::VideoFormat::Chunky2 => 2, + neotron_sdk::VideoFormat::Chunky1 => 1, + _ => return Err(neotron_sdk::Error::InvalidArg), + }; + let colours = 1 << bpp; + let height = mode.vertical_lines(); + let stripe_height = (height / (2 * colours)).max(1); + let mut colour_iter = (0..colours).cycle(); + let mut stripe_so_far = 0; + let mut colour = colour_iter.next().unwrap(); for y in 0..mode.vertical_lines() { - let mut colour = 0u32; - for x in 0..mode.horizontal_pixels() { - unsafe { - handle.ioctl( - neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, - neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, colour), - )?; - } - - colour = colour.wrapping_add(1) & 0xFFFFFF; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_MOVE_CURSOR, + neotron_sdk::ioctls::gfx::move_cursor_value(0, y), + ) + }?; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_DRAW_LINE, + neotron_sdk::ioctls::gfx::draw_line_value( + mode.horizontal_pixels() - 1, + y, + colour as u32, + ), + ) + }?; + stripe_so_far += 1; + if stripe_so_far == stripe_height { + stripe_so_far = 0; + colour = colour_iter.next().unwrap(); } } @@ -102,45 +122,53 @@ fn vertical( Ok(()) } -/// plots a horizontal colour stripe pattern. -fn horizontal( +/// plots a grid +fn grid( handle: &neotron_sdk::File, mode: neotron_sdk::VideoMode, ) -> Result<(), neotron_sdk::Error> { - let mut colour = 0u32; - for y in 0..mode.vertical_lines() { - for x in 0..mode.horizontal_pixels() { - unsafe { - handle.ioctl( - neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, - neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, colour), - )?; - } - } - colour = colour.wrapping_add(1) & 0xFFFFFF; - } - - wait_for_key(); + unsafe { handle.ioctl(neotron_sdk::ioctls::gfx::COMMAND_CLEAR_SCREEN, 0) }?; - Ok(()) -} + let width = mode.horizontal_pixels() / 10; + let height = mode.vertical_lines() / 10; + let y_max = mode.vertical_lines() - 1; + let x_max = mode.horizontal_pixels() - 1; + let colour = 15; + + // Horizontal + for y in (0..mode.vertical_lines()) + .filter(|&y| (y % height) == 0 || (y == mode.vertical_lines() - 1)) + { + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_MOVE_CURSOR, + neotron_sdk::ioctls::gfx::move_cursor_value(0, y), + ) + }?; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_DRAW_LINE, + neotron_sdk::ioctls::gfx::draw_line_value(x_max, y, colour), + ) + }?; + } -/// plots a rolling stripe pattern. -fn rolling( - handle: &neotron_sdk::File, - mode: neotron_sdk::VideoMode, -) -> Result<(), neotron_sdk::Error> { - for y in 0..mode.vertical_lines() { - let mut colour = y as u32; - for x in 0..mode.horizontal_pixels() { - unsafe { - handle.ioctl( - neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, - neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, colour), - )?; - } - colour = colour.wrapping_add(1) & 0xFFFFFF; - } + // Vertical + for x in (0..mode.horizontal_pixels()) + .filter(|&x| (x % width) == 0 || (x == mode.horizontal_pixels() - 1)) + { + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_MOVE_CURSOR, + neotron_sdk::ioctls::gfx::move_cursor_value(x, 0), + ) + }?; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_DRAW_LINE, + neotron_sdk::ioctls::gfx::draw_line_value(x, y_max, colour), + ) + }?; } wait_for_key(); @@ -148,40 +176,66 @@ fn rolling( Ok(()) } -/// plots a grid -fn grid( +/// plots a radial pattern +fn radial( handle: &neotron_sdk::File, mode: neotron_sdk::VideoMode, ) -> Result<(), neotron_sdk::Error> { unsafe { handle.ioctl(neotron_sdk::ioctls::gfx::COMMAND_CLEAR_SCREEN, 0) }?; - let width = mode.horizontal_pixels() / 10; - let height = mode.vertical_lines() / 10; + let mut colour = 1; - for y in 0..mode.vertical_lines() { - if (y % height) == 0 || (y == mode.vertical_lines() - 1) { - // solid line - for x in 0..mode.horizontal_pixels() { - unsafe { - handle.ioctl( - neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, - neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, 15), - )?; - } - } - } else { - // stripes - for x in 0..mode.horizontal_pixels() { - if (x % width) == 0 || (x == mode.horizontal_pixels() - 1) { - unsafe { - handle.ioctl( - neotron_sdk::ioctls::gfx::COMMAND_CHUNKY_PLOT, - neotron_sdk::ioctls::gfx::chunky_plot_value(x, y, 15), - )?; - } - } - } - } + for x in (0..mode.horizontal_pixels()).step_by(16) { + // plot from 0,0 to the bottom edge + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_MOVE_CURSOR, + neotron_sdk::ioctls::gfx::move_cursor_value(0, 0), + ) + }?; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_DRAW_LINE, + neotron_sdk::ioctls::gfx::draw_line_value(x, mode.vertical_lines() - 1, colour), + ) + }?; + colour += 1; + } + + // do the diagonal + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_MOVE_CURSOR, + neotron_sdk::ioctls::gfx::move_cursor_value(0, 0), + ) + }?; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_DRAW_LINE, + neotron_sdk::ioctls::gfx::draw_line_value( + mode.horizontal_pixels() - 1, + mode.vertical_lines() - 1, + colour, + ), + ) + }?; + colour += 1; + + for y in (0..mode.vertical_lines()).step_by(16).rev() { + // plot from 0,0 to the right hand edge + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_MOVE_CURSOR, + neotron_sdk::ioctls::gfx::move_cursor_value(0, 0), + ) + }?; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_DRAW_LINE, + neotron_sdk::ioctls::gfx::draw_line_value(mode.horizontal_pixels() - 1, y, colour), + ) + }?; + colour += 1; } wait_for_key(); From fe0d268e81fd40ca63a6408bbf7645671636ba5d Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Sat, 28 Dec 2024 20:51:06 +0000 Subject: [PATCH 5/9] Add some mode demos, and a palette IOCTL. --- Cargo.lock | 16 +- nbuild/src/main.rs | 14 ++ neotron-os/src/program.rs | 18 ++ utilities/desktop/Cargo.toml | 12 + utilities/desktop/README.md | 3 + utilities/desktop/build.rs | 3 + utilities/desktop/src/desktop.raw | Bin 0 -> 153600 bytes utilities/desktop/src/lib.rs | 103 +++++++++ utilities/desktop/src/main.rs | 14 ++ utilities/logo/Cargo.toml | 12 + utilities/logo/README.md | 3 + utilities/logo/build.rs | 3 + utilities/logo/src/lib.rs | 370 ++++++++++++++++++++++++++++++ utilities/logo/src/logo.raw | 241 +++++++++++++++++++ utilities/logo/src/main.rs | 14 ++ 15 files changed, 825 insertions(+), 1 deletion(-) create mode 100644 utilities/desktop/Cargo.toml create mode 100644 utilities/desktop/README.md create mode 100644 utilities/desktop/build.rs create mode 100644 utilities/desktop/src/desktop.raw create mode 100644 utilities/desktop/src/lib.rs create mode 100644 utilities/desktop/src/main.rs create mode 100644 utilities/logo/Cargo.toml create mode 100644 utilities/logo/README.md create mode 100644 utilities/logo/build.rs create mode 100644 utilities/logo/src/lib.rs create mode 100644 utilities/logo/src/logo.raw create mode 100644 utilities/logo/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index f7bace9..447d40d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,6 +93,13 @@ dependencies = [ "winapi", ] +[[package]] +name = "desktop" +version = "0.1.0" +dependencies = [ + "neotron-sdk", +] + [[package]] name = "embedded-hal" version = "1.0.0" @@ -171,6 +178,13 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "logo" +version = "0.1.0" +dependencies = [ + "neotron-sdk", +] + [[package]] name = "menu" version = "0.3.2" @@ -277,7 +291,7 @@ dependencies = [ [[package]] name = "neotron-sdk" version = "0.2.0" -source = "git+https://github.com/neotron-compute/neotron-sdk.git?branch=add-gfx-ioctl-defines#49509fce305a4d7cf956dcfcaba06a06a307fd7e" +source = "git+https://github.com/neotron-compute/neotron-sdk.git?branch=add-gfx-ioctl-defines#dc84465052e22328eb9526ba1edd93670228c5ee" dependencies = [ "crossterm", "neotron-api 0.2.0", diff --git a/nbuild/src/main.rs b/nbuild/src/main.rs index c748582..8585783 100644 --- a/nbuild/src/main.rs +++ b/nbuild/src/main.rs @@ -51,6 +51,13 @@ fn packages() -> Vec { testable: nbuild::Testable::All, }, // *** utilities *** + nbuild::Package { + name: "desktop", + path: std::path::Path::new("./utilities/desktop/Cargo.toml"), + output_template: Some("./target/{target}/{profile}/desktop"), + kind: nbuild::PackageKind::Utility, + testable: nbuild::Testable::No, + }, nbuild::Package { name: "flames", path: std::path::Path::new("./utilities/flames/Cargo.toml"), @@ -58,6 +65,13 @@ fn packages() -> Vec { kind: nbuild::PackageKind::Utility, testable: nbuild::Testable::No, }, + nbuild::Package { + name: "logo", + path: std::path::Path::new("./utilities/logo/Cargo.toml"), + output_template: Some("./target/{target}/{profile}/logo"), + kind: nbuild::PackageKind::Utility, + testable: nbuild::Testable::No, + }, nbuild::Package { name: "neoplay", path: std::path::Path::new("./utilities/neoplay/Cargo.toml"), diff --git a/neotron-os/src/program.rs b/neotron-os/src/program.rs index e90d6ac..cef4de0 100644 --- a/neotron-os/src/program.rs +++ b/neotron-os/src/program.rs @@ -850,6 +850,16 @@ pub const GFX_COMMAND_MOVE_CURSOR: u64 = 3; /// The start position is the cursor position. The cursor is updated to the final position. pub const GFX_COMMAND_DRAW_LINE: u64 = 4; +/// Set a palette entry +/// +/// The command contains [ | II | RR | GG | BB ] +/// +/// II, RR, GG and BB are 8-bit values where II is the index into the 256 long +/// palette, and RR, GG and BB are the 24-bit RGB colour for that index. +/// +/// Use [`set_palette_value`] to construct a value. +pub const GFX_COMMAND_SET_PALETTE: u64 = 5; + /// Handle framebuffer-specific ioctls fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Result { let mut lock = crate::VGA_CONSOLE.lock(); @@ -1003,6 +1013,14 @@ fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Res state.cursor_y = new_y; neotron_api::Result::Ok(0) } + GFX_COMMAND_SET_PALETTE => { + let index = (value >> 24) as u8; + let rgb_packed = (value & 0xFFFFFF) as u32; + let api = crate::API.get(); + let rgb_colour = neotron_common_bios::video::RGBColour::from_packed(rgb_packed); + (api.video_set_palette)(index, rgb_colour); + neotron_api::Result::Ok(0) + } _ => neotron_api::Result::Err(neotron_api::Error::InvalidArg), } } diff --git a/utilities/desktop/Cargo.toml b/utilities/desktop/Cargo.toml new file mode 100644 index 0000000..f15f0df --- /dev/null +++ b/utilities/desktop/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "desktop" +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +authors = ["Jonathan 'theJPster' Pallant "] +description = "Shows the Windows 95 desktop" + +[dependencies] +neotron-sdk = { workspace = true } + +# See workspace for profile settings diff --git a/utilities/desktop/README.md b/utilities/desktop/README.md new file mode 100644 index 0000000..84fc9b4 --- /dev/null +++ b/utilities/desktop/README.md @@ -0,0 +1,3 @@ +# Desktop + +Displays a raw 640x480 bitmap in 16 colour mode. diff --git a/utilities/desktop/build.rs b/utilities/desktop/build.rs new file mode 100644 index 0000000..19893f7 --- /dev/null +++ b/utilities/desktop/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rustc-link-arg-bin=desktop=-Tneotron-cortex-m.ld"); +} diff --git a/utilities/desktop/src/desktop.raw b/utilities/desktop/src/desktop.raw new file mode 100644 index 0000000000000000000000000000000000000000..03bae6002fc1bbddde4afdf3d2af3d3d7e484194 GIT binary patch literal 153600 zcmeI5&5z{9dBzz#T3H_UC4wOYzBqffff#epAv*Y=V-D-X3J5F#x@a$ffE9dL1e ze9#)uVGUy;x7rKnnAl!mjKE{9dmA7k3kf_uKwE%DYEAQh$@9KdELM>$vZ_e-$4u4q zkoCzXe|+kFi)?oFbQ(h>ur~zeMcA7?I;b6)EoHcT;h^?=Uv_qp%P^1p0?x^7Q|K@9 z3&1y>ZKV0zM1EoX5)Ma^UkE;Ab_)tynPV) z1@cq(500J&ZQ*)1n#t}vpP$UL>y0Al=;1qLIC^#xw1sQksFdG)eir$8YeC(8h8LMf ze*XLl?}2sX=Z$Z=V1DdFB0qn8;P)yBvImL$g7_Va9{eo!-vE5F{|bcB{`nJ}pIlDl zYZY(cd-IzqdY6-V;@$k(H&~p^kBV26pSK)v<5Y!B96kH<6OMzIXYu1pZ+_F_-T|%s zTgMiWKqL?eL;{gOBoGN~kHF*U6fcCw`I^^p;YC34TT6~bYeBV0#kGaNqIIQ0 zgk|42WkwM5(8GUgJ2#|Tr&kEkKeD~e6m>jh0-gi*4pnLVM~(yhC`OSy>d%QG^DAq{ zkxR+KDMsB_3z44&BSs^E11F$;v~*pfgFb(Iu0GkkHjzO;!9Bk&swx@HZO2`}vpmzr^BR4xYJK?=cSVT?4-?Nyp;{YWKh71y=lGo9Mlt``Uo) zU$Pv7A9;3?9rJ@Hk^Ct03Wf3XC;5>R&S_ET?+U@gp^Rt$g!{Pq{dX+?EBL{6l>UR1 z2tRU_0@*)=5&Z8}qGUgo$j{EkrR2Vx!C>&~H}EBa^hGczkcUDfS;WIiGFvok=|h(;iT0ARqbFY1MLOxVeIG8TnaM zR3m0)%r0s0y=a=bDeBKe)tH)H(%}1k2hdIB0Ril3V7+FVl$h;z#PsH_P+Uq{lnzufGk?9^1u_X$gLk zh$BBCRtZr`FJ%#mttq?$u1eM-)OnZr9`fVaV>|jUKORR%jbljZK*R%cBG$IdD*O`a z|GY>m%{usE;f3(^^iO!!Nw@{=cI>8UXh#6}VXGZYDl1>e5gZM`(;cbY1d%oGX z{wwGI>m0xELGZESNnvr2P!PwkL=rPvT{ z3<;`$8YMrBRK?cDSbEz($nF`YofPBemhqqDfJ4O5;`s5R!{rCBagg%R#j$2M@>Coh z9Xb-INFhTK|Gc0G#Su`A8!y|=I zel&bWI3g{oP~(RqDfr=7tNiFdL4~u48wFZtiXV}nx50v#Ga#8qNh&MWNGg83CE-7W z{Tt5+2J)K;FM=NcvGYsdd2xINrA*kn3`a>UQd;rh7cs>Txl}?SAx5Z)HG#s58Wl-i zi!|tQKo&xZrlh%ZDLf%Y+ThT^o8N5qhugR2!u-Ls7&j1f{o$~HE=y86U^*m3@xuPo zQYH$1R6!gWt&4x;Pyta(xQ&$`*PvR`ebD>x^+zGR(L9JZzhD3Qvx{5H1s(0#eEzJB zUq-BOD1wbd*2oWsD?`Cfv<_<(51+fZl`Q`J&jL;xKO96>@L+5} zh~uKAgo#px6(tBoeI~%|`2uMXekpYRoN&(DC$cB1SUl$B@xGqQYob=UaYwWGI;x3Q)~^_ zZ%l5F?4NM9h5ImnzrwJ886S)|@Dx{ZlonJF$rv1^i|kAsv8WG@Xo4V^08EV^jv-+x`iD(4Yvq`<*uM%TghSOoGC}sqr846#P>78V)#e zP*MDd32#7bCKH$nZpGT~e<1P=duIQ~=Py=uhZM_&-bq2ovhf)HB9hXy`4Kmm?d zBAcos$?#A`1T<*jN7boTAY3h|CsM;5{n@a>s^#Y!~y_8(LBA8Z80Ebb&n8C3s0 z%`f);Pu`RX{bcwgj9-DOajp0*0#4}Gn+O2=$#4JVcMJJTk!{qa_w8rz#6y|AC*b03i+z{0`OrF)GO~75vmkgC@Xn z`SmnSTWKzMnEn?Zv*M2_;&W80kqyOu7`U5|@;Gln8y?Dp+9 zjP#x)1PjytDSkkh5sCjIe?`!DmO z7c68qw9gtxSeeTfPf75x?b(0>6kVF{A|=*>@#{je&= z&Sg#!YqWo_<(EencP9HMz(#(W!rG(0`YRZb@@%2xS8D8wxARr<_S= z+kZ>_y+*@7Q-7-@$#c9`6`P2xZ3fYQ$-f2#(cJg*H>I_vh|-^S{kytzhsJ-mN{e{0 zy0KzwD3+yNOtd;>?r5>PPYB2viC?Ls)oX9R3IBVm%pu*e)b>Ju0nGF!41Y%4kEBwiLa=~fjYc0kQrnG-LjDYw!{1&C!{saL+eqU?0 zj`f!iGnm2EB%uYz6ATq)8tZZ!1wUBy(H(XjMnKL;{FGw;^!3-zy>{pJx4+f|*rq>?pW4PqkpNotCgbo^_HXs% z$&-`kZYPr`ngH3_ai6`QYh(ODbkhDoh@6AmQm~`Mr2Pv$IV-_3jNfcd!_KGGF-$pr zQF{g9Emq0W)Snptp^Neu5dI?PxHN>ErXJ3JYDW<#PV*uP;|g_Vw3C^CC}Q zueN;6p}+U;_z^w;JU;$Mvj;1Fr%Gb;lPAAjER!c6&&xc!B(_1DKUHlPk=^O({IRVU$k3Vew{(h;yoCIjIe!Eaz`JRG{@W0?joD@E!%D9Yb8K~Oh{?+XB zzr$C$=UMj4<8Lou zh*tHN;Xwlg{G-E?X4{|IK<__sm^CLdQ51@$O5(Ek2 zVEoR&?<=x@FTeZ1L4Oe7F3el!d$Np{rT-vAtUsWW{0N@tzvJ+G@cz#l^=H_>i`$lw~%I{qTE&3oQB=qICA$(ST`)Tpay%PM$ z^9BXc{6xS0cZuWYqb|RK?`M4T#Awod{p+WS?bY__t=76h{N@`xRLY_^x^LNk+wC7c zzh+9oHMP>)P3Q?3@sv#Qtc=e?3v&EtCF54$&o71a7Rx2$GiEQ=o*!Sdt7z3;+*v9f zjo~FNR=LPPq=?Fl)-AaK>Zs+-Z~71bG3aD|Cr>T?w_Q+%jC4sk#x>E=Q!=Xy`K%0W zS1aq-S_c`oVt;-F5P|renBBMRzl+ur50&7#4OGE{YxL~FWJM2KQ4T-4h6vVp`T(W; z6c$84&IDL?piArRA{rVBDyP^#_qr9&90UNR+I<2?FIx{mBhd3u@QC z16=9`sH0XOzv;t@>mYn3zti^94{L|#{_=~2o_(ezB!nE;H;$7tfIUM$B>Tr=BcB3^ z5k5Q_DB44!uzOsNCE{%VP>womPuu0U%l^x>>I+x>mEs`triC)81VmXzLaW{{+Mz7B z;!yq7;pzHYw4eI2l-#TKSIEY^Kq((ZEz0#a!ErZ09koW{*H0PSY287_t#}-Mr@^Ao z#5nRc4%hybR<0^EDltpR*Gl`RtYEd3Xkxaj)v0H=39O^mIQm<(%1BtTri%oWh)WUG zo-ZV5Y{!n+BFTyswbWAEl;s^{+=>JE@%$0%CI{l^e}z(-25Be}BR-`T79A~`su#7q zrN<530Cm(Fhu>+d1jHzhzi5P82YlgxaUXpv4r924a_E)<@@agBn*@9nyt=_R33!}H z-ZrLFx_oD3kQZ5iH5>$%_mKkZuyt z1qUL0eZdzW$c8SdowzopGP%J*oAz~wvfPS;^oLp3a-KDZW^~d**?(IFz*nf^<_g__ zp}KUD-Ipl`)-Yk7^#?Z{%1SYZXlmYw8RJpbp0$yzIjUpecV zji3Fjql6VCg+tmYb69_*DXPPMmo9Sof|n%5&X`+sT)Rf57NV8dVC(zKLMs!Wf*^is z)+2VHkQ^Kf4y@au)##T-F6pW+4#df6>_HI6ytaV4?wg{ zpMr7toksho_eP7t-IJ^^zU$lST?5Kg_x9Dk_ zw$j{c(|ih|{qvz!uR9XItq7>+o770{Y| zU-n4+JWLb53pQjpao!k%I^*vF`7esIJ`O)0`?t9~8#0_+I0{hQ|2ucaZB`tY-@<&e z*3@S6Y{=lLKfm5uuRV_byzJk=`g4@u?w)_KyXK(lkElNdRPj3;`&aLgemNuc-&Tuf z7DoNm^%w1*V&W4~{dZwXtTlBl^;e&}oj5Cg(f+l{4%6RXK5eL>_(lCS&{0|QMSikq z0$B2My$C=(dHvyk2~}&smoX=MKmMCz?vj&d=M4Z$eytYIEEM){9yEuI(MVj!?EUq} z4D*@JPv)4#q}GKMzX1E!^nGHbc&CWCj`6(y^&9QgYx|G?XaYOp*8ouQ^S6JMnPi-R zRVp2p{+=}eEcyA{zrpn9Y5xop;FAzq4A9>a9r$Dpel-P_{7e(qnv(XfKff^j;mQ7> zAgB8b;Rk>xb9CSuK*jHX?B7J_$ai@b%x?e5D&9#c$zpN_VY4Uvi>;KYrAO zsRLX2jc5Np`i*|Z^tklDp7w9Tvp&H`> z!xpk~UiRe&fXj1oB-#P=y8df$v zg`WDOO|t#7@f*SZ8S(?mngR#bUkV3o?Z18eFZ2g`t^7u?e^q>SA3UV}U|cTSPy;d-)#8`etWf*-{AJIg0I$jF$x^g z{^_VhJX`5`{q(n7{x@7O`HyYsuhM&)@J&b7U!Lj!d+Be!JbOj>Ukks%?Vl;XMtp_- zT%|9+|Lc7JC12?`X!`J*Ci5lkUO|7R`yJ2zneuDK7py;BR`z(78v^Xbj{vswa}@#V z$+~kpf%z4Qu}l`C0K5`g4`Ow0{PZwgmWLs`)bX;|G9ewJF?3y8oxk&yFupe*#1I z686uufIayEU~LNblAo&xTn z=jU&_{HpJ$r^Cj7H6oUb4D-A-6!qYz@4JXAenZ+nU4Heq)N;bEe;b%IW@W3)7{JI% zdE0Z$T}=HM`g{CX&ZAxS-+{(|N`BqFH}w8X6BLg;AN`U2!ymmKKc0db zbz!o9kHL~c$!{3@=Ow?9$A1>4KK#i3fgy%XodKt1c{A4+~CbB8eQ^=}hAU>~CW;}gOBWcO8P#wD`%_y0N%Vle&5?&~GL ztE9gkpML<|bQ&VRX#ZH>AK{A~LGrsw`s*?N)A)7T3$sGBf5e0MiSFxX{jQY%?P34$ z#VpZ%eep&6$K4V9g#66T>5z)!KY}D(Z~g0modl!()A@Dcs#Ul``U|&za_ABuzi9tR zQ3b!6y1Fy2kp9BQe_=ysh8yi4Fa%w>32j~>{e|1Vu%WZAzuff(wB?STUv}8%zv6_~ zmIK^>DTXgt*EZjgafS33ZvQlXz67KFE8VZe*r7PH_zLMS*!~s67s=1-8d&OY&+Xq# z{}OTK8|eM*pTWKY#m|D$q^Sgf!riSu~3t2RV-1_uoGf{zLZP#4>(aC>Y(5LVufOk}?y_)Zh`$ zin?Mu&-VTIj|9I7#(%JXHhuy2FWn^H`%#u8S>nqtp;=zjw9ucc^mp|9v)lDsx9n66 zrN8gpeG?PjCYBk43z=2dXF!M9UbFOI^rw!TBF)zy0r&sX&D|6fNK92kt?4s#d+0Aw z`rG&We~gbT_M(L!S8`h@{S}ye`N?*Nq`&z&LPkTjX8ncOzv|3-1I6|w>P8IW`YaFS`Zs^J z*`=7#lHXkJpc6P_x||hmy5Hr>EBN*{=?t?4IsUP`2F8m{>g_Q zzVp+&@4YvF`io!K_*qO;Q}%V!-|GE;yZfD&?mfSlfA_mK{YCp{z3V%>ym#-NTR;B& z%YXCxTR;BALrec{5}GCN+Uf7^``>x)JKucqrJuZX@5Q?oe$oEf1UNf;_nlim{NWGZ zdHJ2+-@TVu_*t~pls%08@Pj16f$zQlJ-Pe-i!Z+T(n~KL9o>83?#WXPbf4#6divi# zzxt}!!oH9H9+ubn9BbsaXcC$wZy5cl(c`}BZ(6xTZRQv4pVlp%qpJT#{W&w!D=L0* z{HJ4ajw^mqf6mPGiY32j|8y>{@sgj#*EVHeH~-rLQ}Oe%e-($`Gr70pKg_&aOgp)r zVhU7~BeL}Qi<^XI$uoYGsWP|>Nm|~fp56V4ibD;L?{Crcu_CO&Pe$d6CYIItdDuTy z^-?{`!V*l|g?M7tPSnS~Dxx-Q$#J05T_uPgrpzW>TB!1?pY86Pp8UGspi-k7jzbMU ze!zw~$fv}QW^c!mQBo`i%^>@y)X|ThQk#mX4L9d({rMO4Uz&Fuop_DFGr03~&_zt+ zx2T+Ir({2VPH$mUa!^-y6+itIbG8e9KuNP_V+DkeWvRbK^C@r4RhgTOvAYW+RZEZ+;L$c#Wy@AB0uwzvWqWk8RoqEbXQ4xBb)(g~+Ye z#zTM9bK8URzl-Km-k7U0`wgU(+Ehes*pgFY5t1_0LkO-~n{oJ^ zT26VBBy3ez?EuRQj><+WN!#Z0t=qr$zDuQL{|%R2*>aW4>1V9Y^9MNsfBkK6)Ru(LRxJ_?HH907 zl1$;Y6qyzKbX(QdxBn6~`VBbz`j+6Am-sY(6+0H1RDxFf%aKFYA8!6ZaV5WXlm1Sf zMbK{lto%$R87U*tvL8FLf6Nci@F(sY3~c{QrMaX+#qF}~&N|-xcPefg5I??yKs2bNLKj(w5R;=8_ayo?SHXPF~+wQD0 z4!=`p5mfD;It873t}2wbo>^a}$n2@z*uO^I6`AVb7mgCBS5uo%cse6zfmb7)8+NHM zj{Yhp$u0tvn1vzy%+a8;^j+|D))|RkU09AexI5q-uAcr*okdW!f5nBG&)U2iHuY>z zT}}JvDAOUTb@ok{3M2Jj`)RM0)G|D@+tk*%xeK1oIwSELLLXyqqmzwGg>m?uI*Xu5 zLEFiT_OGWvUF6kSXB_=4wj-f_@6yS}rNT)3dP-v}&0X+x))|N2X|#XEHLcHDU3_gt zKYib%Q(G<-#?hb4J70}Dkzc>_82Rml-=o{NZ~sfpG%EYoZ=VjSb)f#2}A;sKqL?eL;{gO zBoGNi0+GNl1lChA)y89*0-9$n!8!(K0_%dGfF~I`H^253F?Agf5;i$yjy7}7wTI&X zfcVkmVZ;yfuVMP#HBG-u*+@8S;F?$AS=)&pU=@?Ekwv7*#0p7Xb40C&ulNBLkmb-I z=z%8a<#}t>p3Q z#{L6-B>E2*fK&(kVhAS?-9$LM*fJ7`1R{Y*AQFfKB7sOC5{LvMfk+?{hy)^mNFWl3 z1R{Y*AQFfKB7sOC5{LvMfk+?{hy)^mJ_L+8V`9Ra0H&*pp$7qP;ITm@FeCxHc2~=# z`IY|OsmYK#zLjltO#HQ2E;rWwI9V=_hMm*v@TNgNv(n)L98fzyyE;Qkt{=biVMF`b z+{02={bfm7+k5K2G?n&n;mYbSgKMY(B!0un?`rY`xa1qjj}mgXx(K8GmP?oZo2E%} zGkG;xW-0v%gdoZKOGts`qNg79({m7U$uA>ep@&i@MNiG}^Ax=M!vCW4N`A;k4GNOq zCL!xrF8bNRgYCcRG6k^=FZ{X(t#y9i2d(cVe@ps9enP!CNkN+RmrdwTiSU~0kEnr- z;s+%nyXzW@E3d}Tq>6bw@k6#aLzO6d>3iUbj2u}abvD$_bZiU+Gd@tZOhe#@IT zlW!$&5>d8)=-`UqxzHai6JDHSMK56!edWj}?T{9Q|3Hr=X`xrL{mZBeBe4EHK;DDo zPQi~DDt@qiLT+FR8IlNB6r)W4aJc$QiB_RML=1i(JP`bdocL4x;Cm6ELPU6>^ye!* zu1|Y$P@(X@ywfGWWvc0K`QSnFAIS~q5B3j+kNYpgD#m|o{%8T!VNvK$_+(EB9<2US z@PqS^{sU2+9|}oi)PIe@{+A6PsSpN_gqTQ6m_U*K!Px#GB&7Zzsg#T#*+0A>KD-dv z{?Yh3rGZN&2>p3VthM^V>aRjZC7B;}SmX$zsz_dc_-m}Kg|_v>h!+0WvbTbtr7-Hx z?fTb(Ph5YrsmZ_0_EvkF->tt(>n(cdFCF&4uA=>8*W0{UE<CmM=5l* literal 0 HcmV?d00001 diff --git a/utilities/desktop/src/lib.rs b/utilities/desktop/src/lib.rs new file mode 100644 index 0000000..162389c --- /dev/null +++ b/utilities/desktop/src/lib.rs @@ -0,0 +1,103 @@ +//! Logic for the vidtest utility + +#![no_std] +#![deny(missing_docs)] + +use core::{cell::UnsafeCell, fmt::Write}; + +// Big enough for our Mode 5 (640 x 480 @ 4bpp) logo +struct RacyBuffer { + inner: UnsafeCell<[u8; 320 * 480]>, +} + +unsafe impl Sync for RacyBuffer {} + +static FRAMEBUFFER: RacyBuffer = RacyBuffer { + inner: UnsafeCell::new(*include_bytes!("desktop.raw")), +}; + +/// Entry point to the program +pub fn main() -> i32 { + let mut stdout = neotron_sdk::stdout(); + + let Some(mode) = neotron_sdk::VideoMode::try_from_u8(5) else { + _ = writeln!(stdout, "Invalid mode"); + return -1; + }; + + let handle: Result<_, _> = neotron_sdk::File::open( + neotron_sdk::path::Path::new("GFX:").unwrap(), + neotron_sdk::Flags::WRITE, + ); + let Ok(handle) = handle else { + return -1; + }; + unsafe { + // point at our canned data + if handle + .ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHANGE_MODE, + neotron_sdk::ioctls::gfx::change_mode_value( + mode, + FRAMEBUFFER.inner.get() as *mut u32, + ), + ) + .is_err() + { + return -2; + } + } + + for (index, entry) in PALETTE.iter().enumerate() { + unsafe { + // load the palette + if handle + .ioctl( + neotron_sdk::ioctls::gfx::COMMAND_SET_PALETTE, + neotron_sdk::ioctls::gfx::set_palette_value( + index as u8, + entry.0, + entry.1, + entry.2, + ), + ) + .is_err() + { + return -2; + } + } + } + + wait_for_key(); + + 0 +} + +fn wait_for_key() { + let stdin = neotron_sdk::stdin(); + let mut buffer = [0u8; 1]; + while let Ok(0) = stdin.read(&mut buffer) { + // spin + } +} + +static PALETTE: [(u8, u8, u8); 16] = [ + (0, 0, 0), + (136, 0, 0), + (255, 0, 0), + (0, 136, 0), + (0, 255, 0), + (136, 136, 0), + (255, 255, 0), + (0, 0, 136), + (0, 0, 255), + (0, 136, 136), + (0, 255, 255), + (136, 136, 136), + (187, 187, 187), + (255, 255, 255), + (0, 0, 0), + (0, 0, 0), +]; + +// End of file diff --git a/utilities/desktop/src/main.rs b/utilities/desktop/src/main.rs new file mode 100644 index 0000000..60dcddb --- /dev/null +++ b/utilities/desktop/src/main.rs @@ -0,0 +1,14 @@ +#![cfg_attr(target_os = "none", no_std)] +#![cfg_attr(target_os = "none", no_main)] + +#[cfg(not(target_os = "none"))] +fn main() { + neotron_sdk::init(); +} + +#[no_mangle] +extern "C" fn neotron_main() -> i32 { + desktop::main() +} + +// End of file diff --git a/utilities/logo/Cargo.toml b/utilities/logo/Cargo.toml new file mode 100644 index 0000000..e5d6c7e --- /dev/null +++ b/utilities/logo/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "logo" +version = "0.1.0" +edition = "2021" +license = "MIT OR Apache-2.0" +authors = ["Jonathan 'theJPster' Pallant "] +description = "Shows the Windows 95 boot-up logo" + +[dependencies] +neotron-sdk = { workspace = true } + +# See workspace for profile settings diff --git a/utilities/logo/README.md b/utilities/logo/README.md new file mode 100644 index 0000000..4a51e57 --- /dev/null +++ b/utilities/logo/README.md @@ -0,0 +1,3 @@ +# Logo + +Displays a raw 320x480 bitmap in 256 colour mode and rolls the palette. diff --git a/utilities/logo/build.rs b/utilities/logo/build.rs new file mode 100644 index 0000000..a8d2bc2 --- /dev/null +++ b/utilities/logo/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rustc-link-arg-bin=logo=-Tneotron-cortex-m.ld"); +} diff --git a/utilities/logo/src/lib.rs b/utilities/logo/src/lib.rs new file mode 100644 index 0000000..863879c --- /dev/null +++ b/utilities/logo/src/lib.rs @@ -0,0 +1,370 @@ +//! Logic for the vidtest utility + +#![no_std] +#![deny(missing_docs)] + +use core::{cell::UnsafeCell, fmt::Write}; + +// Big enough for our Mode 12 (320 x 480 @ 8bpp) logo +struct RacyBuffer { + inner: UnsafeCell<[u8; 320 * 480]>, +} + +unsafe impl Sync for RacyBuffer {} + +static FRAMEBUFFER: RacyBuffer = RacyBuffer { + inner: UnsafeCell::new(*include_bytes!("logo.raw")), +}; + +/// Entry point to the program +pub fn main() -> i32 { + let mut stdout = neotron_sdk::stdout(); + + // try 12 for 480-line mode, or 28 for 400-line mode + let Some(mode) = neotron_sdk::VideoMode::try_from_u8(12) else { + _ = writeln!(stdout, "Invalid mode"); + return -1; + }; + + let handle: Result<_, _> = neotron_sdk::File::open( + neotron_sdk::path::Path::new("GFX:").unwrap(), + neotron_sdk::Flags::WRITE, + ); + let Ok(handle) = handle else { + return -1; + }; + unsafe { + // point at our canned data + if handle + .ioctl( + neotron_sdk::ioctls::gfx::COMMAND_CHANGE_MODE, + neotron_sdk::ioctls::gfx::change_mode_value( + mode, + FRAMEBUFFER.inner.get() as *mut u32, + ), + ) + .is_err() + { + return -2; + } + } + + for (index, entry) in PALETTE.iter().enumerate() { + unsafe { + // load the palette + if handle + .ioctl( + neotron_sdk::ioctls::gfx::COMMAND_SET_PALETTE, + neotron_sdk::ioctls::gfx::set_palette_value( + index as u8, + entry.0, + entry.1, + entry.2, + ), + ) + .is_err() + { + return -2; + } + } + } + + wait_for_key_while_rolling(&handle); + + 0 +} + +fn wait_for_key_while_rolling(handle: &neotron_sdk::File) { + let stdin = neotron_sdk::stdin(); + let mut buffer = [0u8; 1]; + let mut indexes = (START_ROLL..=END_ROLL).cycle(); + while let Ok(0) = stdin.read(&mut buffer) { + for entry in PALETTE.iter().skip(START_ROLL) { + // roll the palette. + // each time around each palette entry goes in one place higher + unsafe { + if handle + .ioctl( + neotron_sdk::ioctls::gfx::COMMAND_SET_PALETTE, + neotron_sdk::ioctls::gfx::set_palette_value( + indexes.next().unwrap() as u8, + entry.0, + entry.1, + entry.2, + ), + ) + .is_err() + { + return; + } + } + } + // this causes the offset so it rolls + _ = indexes.next(); + neotron_sdk::delay(core::time::Duration::from_millis(100)); + } +} + +static PALETTE: [(u8, u8, u8); 256] = [ + (0, 0, 0), + (255, 255, 255), + (8, 8, 8), + (16, 16, 16), + (24, 24, 24), + (33, 33, 33), + (41, 41, 41), + (49, 49, 49), + (57, 57, 57), + (66, 66, 66), + (74, 74, 74), + (82, 82, 82), + (90, 90, 90), + (107, 107, 107), + (115, 115, 115), + (123, 123, 123), + (132, 132, 132), + (156, 156, 156), + (165, 165, 165), + (173, 173, 173), + (189, 189, 189), + (206, 206, 206), + (239, 239, 239), + (247, 247, 247), + (57, 49, 49), + (49, 41, 41), + (33, 24, 24), + (222, 165, 148), + (247, 222, 214), + (206, 181, 173), + (222, 181, 165), + (198, 57, 0), + (247, 214, 198), + (66, 49, 41), + (33, 16, 8), + (214, 66, 0), + (231, 165, 132), + (214, 148, 115), + (222, 107, 49), + (214, 99, 41), + (214, 74, 0), + (222, 74, 0), + (231, 148, 99), + (189, 148, 123), + (214, 107, 41), + (222, 90, 8), + (231, 132, 66), + (222, 107, 24), + (173, 82, 16), + (107, 49, 8), + (57, 24, 0), + (198, 82, 0), + (222, 90, 0), + (239, 206, 181), + (99, 57, 24), + (231, 107, 8), + (239, 189, 148), + (82, 41, 8), + (214, 107, 16), + (231, 115, 16), + (132, 66, 8), + (165, 74, 0), + (255, 148, 49), + (189, 99, 16), + (239, 189, 140), + (239, 165, 90), + (231, 132, 33), + (140, 74, 8), + (247, 181, 107), + (239, 148, 49), + (107, 74, 33), + (239, 189, 123), + (239, 165, 66), + (107, 66, 8), + (239, 173, 74), + (74, 66, 49), + (214, 165, 41), + (156, 123, 33), + (140, 123, 66), + (198, 156, 24), + (198, 189, 156), + (181, 148, 33), + (90, 74, 16), + (231, 181, 0), + (255, 198, 0), + (49, 41, 8), + (181, 148, 0), + (255, 206, 0), + (115, 107, 66), + (214, 198, 115), + (148, 123, 8), + (198, 165, 0), + (57, 49, 0), + (222, 206, 90), + (239, 214, 49), + (255, 222, 0), + (165, 156, 82), + (132, 123, 41), + (247, 222, 0), + (165, 156, 49), + (214, 198, 24), + (222, 206, 8), + (239, 222, 8), + (115, 107, 0), + (255, 239, 0), + (181, 173, 49), + (90, 90, 82), + (66, 66, 57), + (49, 49, 41), + (24, 24, 16), + (140, 148, 90), + (107, 115, 74), + (99, 115, 74), + (123, 140, 99), + (173, 214, 123), + (132, 140, 123), + (140, 198, 74), + (148, 173, 123), + (148, 181, 115), + (165, 206, 123), + (140, 189, 90), + (74, 107, 41), + (156, 198, 115), + (123, 181, 66), + (99, 156, 49), + (156, 198, 123), + (148, 198, 107), + (82, 132, 41), + (123, 189, 74), + (49, 74, 33), + (140, 148, 148), + (156, 165, 165), + (74, 107, 132), + (173, 198, 222), + (198, 214, 231), + (66, 74, 82), + (41, 57, 74), + (82, 132, 189), + (66, 99, 140), + (41, 74, 115), + (24, 82, 156), + (148, 173, 206), + (99, 140, 198), + (82, 123, 181), + (49, 99, 165), + (16, 41, 74), + (24, 66, 123), + (16, 57, 115), + (24, 74, 148), + (74, 115, 181), + (33, 74, 140), + (57, 66, 82), + (132, 156, 198), + (107, 140, 198), + (140, 156, 189), + (74, 107, 173), + (16, 57, 140), + (41, 49, 66), + (156, 173, 214), + (173, 181, 214), + (222, 222, 231), + (132, 132, 140), + (99, 99, 107), + (66, 66, 74), + (57, 57, 66), + (231, 231, 231), + (239, 231, 231), + (239, 239, 231), + (231, 239, 231), + (239, 247, 239), + (222, 239, 231), + (231, 239, 239), + (239, 247, 247), + (222, 231, 231), + (214, 231, 231), + (222, 239, 239), + (206, 231, 239), + (189, 214, 222), + (198, 222, 231), + (173, 214, 231), + (222, 239, 247), + (214, 231, 239), + (173, 206, 222), + (198, 214, 222), + (189, 222, 239), + (181, 214, 231), + (206, 222, 231), + (156, 198, 222), + (206, 231, 247), + (181, 206, 222), + (173, 214, 239), + (165, 206, 231), + (198, 222, 239), + (189, 214, 231), + (165, 198, 222), + (181, 214, 239), + (173, 206, 231), + (156, 189, 214), + (156, 198, 231), + (148, 189, 222), + (222, 231, 239), + (214, 231, 247), + (189, 206, 222), + (231, 239, 247), + (239, 247, 255), + (206, 214, 222), + (206, 222, 239), + (189, 214, 239), + (181, 206, 231), + (173, 206, 239), + (165, 198, 231), + (156, 189, 222), + (214, 222, 231), + (181, 198, 222), + (173, 198, 231), + (165, 189, 222), + (189, 206, 231), + (206, 222, 247), + (198, 214, 239), + (222, 231, 247), + (214, 222, 239), + (206, 214, 231), + (206, 214, 239), + (231, 231, 239), + (239, 239, 247), + (247, 247, 255), + (231, 231, 247), + (214, 214, 231), + (222, 222, 239), + (239, 231, 239), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (0, 0, 0), + (77, 127, 184), + (92, 137, 185), + (108, 146, 187), + (123, 155, 188), + (139, 164, 190), + (154, 173, 191), + (171, 182, 193), + (174, 184, 193), + (174, 184, 193), + (174, 184, 193), + (174, 184, 193), + (174, 184, 193), + (174, 184, 193), + (171, 182, 193), + (154, 173, 191), + (139, 164, 190), + (123, 155, 188), + (108, 146, 187), + (92, 137, 185), + (77, 127, 184), +]; + +const START_ROLL: usize = 236; +const END_ROLL: usize = 255; + +// End of file diff --git a/utilities/logo/src/logo.raw b/utilities/logo/src/logo.raw new file mode 100644 index 0000000..50013b3 --- /dev/null +++ b/utilities/logo/src/logo.raw @@ -0,0 +1,241 @@ +ÂÂÖ………ÖÄÄÄÄÐÐÐйÁÏÚÏÚÚÚÚÚÚÚÚÁÐÁÁÁÚÀÞÎÎÎÎÎÎÎÎÎÜܵÜÎÎÀÚÚÚÚÚÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÁÁ†ÀÎεµµÜÎÎÎÀÚÁÐÐÄÄ…………»ÂÂÂÂÂÂÂ……ĽÐÐÐÐÁÁÁÁÁÁÁÁÁÁÁÁØÁØÐÐØÁÁ†††ÎÎÎÜܵÈÈÈÈÛËËËËËËËËËËËËËÛËÛËËË´ËâËÛÛÈȵµµÜÎÎÎÚ†ÚÁØÐÐÐÐØÁÁÏÏÚÏÏÏÏÏÁÁÐÐÐÄÄÄÄÄÄÄÄÄÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Ä…ÄÄÄÐй¹ÁÏÏÚÚÚÚÚÚÚÚÁÐÁÁÁ††ÎÚÎÎÎÎÎÎÎÎÎÜεÜÎÎÚÀÚÚÚÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÏÁÚÚÎεµµµÎÎÎÀ†ÁÁÐÐÄÄÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ĽÐÐÐÁØÁÁÁÁÁÁÁÁØØØØÐÐÐÐØÁÁ†††ÎÎܵµÈÈÈÛ´ËËË´ËË´âË´ËÛÛÛÛËÛË´Ëâ´ÛÛÈȵȵÜÎÎÎÀ†ÚÁÁØÐÐÐÐÁÁÏÁÏÏÚÏÚÏÁϹÐÐÐÐÐÄÐÄÐÄÄÄĶÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ………ÖÄ…ÄÄÐÐйÁÏÁÚÚÚÚÚÚÚÚÏÁØÁ†Ú††ÎÎÎÜÜÎÎÎÎÎεεÎÎÀÚ†Ú†ÚÁØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÚ†ÀÎܵɵµÜÎÎÀÚÚÁÐнĶօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä½Ð½ÐØØÁÁÁÁÁÁÁØÁØÁØÐÐÐÐÐØÁ†††ÎÎÎÜÜÈÈÈÈÛËËË´ËËËâË´ËÛ´ÛÛ´âËÛËËËÛÛÈÛÈȵÜÜÎÎÎÚÚÁÁØÐÐÐÐØÁÁÚφÚÚÚÏÏÏÁ¹ÐÐÐÐÐÐÐÐÐÐÐÄÄĶ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…Ä…ÄÄÐйÁÁÏÚÚÚÚÚÚÚÚÁÁÁÁÁ††Ú†ÎܵµµÎÎÎÎÎÎܰÜÎÎÀÚÀÚ†ÁØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÁÏÚÚÀÎεɵɵÜÎÎΆÚÁØÐжֶօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ð½ÐØÁØØÁÁÁÁÁØÁØÁØÐÐÐÐÐÐØÁÁ††ÚÎÎܵÛÈÈÛËËËËËËËÛËÛËÛÛÈÛÛâ´âËÛËÛÈÈÈÈÛµµµÜÎÎÀ††ÁØØÐÐÐÐÐÁÏÚÚÀÚÀÚÏÏÁÁϹййÐÐÐÐÐÐÐÐÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÄÄÐÐÐÁÏÏÚÚÚÚÚÚÚÚÏÏÁÁ††††ÚÎܵµÉÜÎÎÎÎܵܵÎÎÚÀ†ÚÚÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÐÁÁÏÚ†ÀÚεɵɵÉÜÎÎÎÚ†ÁÐÐÐжֶ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶ÐÐÐØØÁÁÁÁÁÁØÁÁØØØÐÐÐÐÐÐØØÁ†ÚÝÎÎÜȵÈÈÛËËËÛËËËÛÛËÛ´ÈÛÛ´Ëâ´â´âÛÈÈÈÈȵÜÜÎÎÎÚ†ÁÁØÐÐÐÐØÁÏÚÀÚÚÀÚÏÏÏÏÁ¹Ð¹Ð¹ÐÐÐÐÐÐÐÐÐÐÄÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¿…ÄÄÄÐйÁÁÚÚÚÚÚÚÚÚÏÏÏÁÁÁ†††ÎεÛȵÜÎÎÎÎܵÜÜÎÎÀÚÀ†ÏÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÐÁÁφÚÚÀÎεµÈµÛµµÎÎÀÀÚÁØÐÐÐĶօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ö½ÐÐÁØØÁÁÁØØÁØØÁØÐÐÐÐÐÐÐÐØÁ††ÀÎεÈȵÛËËËËË´ËÛÛÛÛÈÈÛÈ´âÛ´â´ÛÛÈÈÈÈȵÜÜÎÎΆ††ÁØØÐÐÐÐÐÁÚÀÚÀÚÚÏÏÏÁÁÁ¹Ð¹ÐÐÐÐÐÐÐÐÐÐÐÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÄÐÐÐÁÏÏÚÚÚÚÚÏÏÏÏÏÏÁÁÁ††ÎܵÈÛµµÜÎÎÎÎܵÜÎÎÎÀÚÚ†ÁØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÚÚ²ÚÀÎεÛÈȵÉÜÎÎÎÚ†ÁÁØÐÐÐÖ¶…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¶ÕÐØÐÁØÁØÁØØØÁØØÐÐÐÐÐÐÐÐÐØÁ†ÚÝÎܵȵÛËËËËÛËËÛÛÈÈÈÈÈÈÛÛËÛÛÛÛÈÈÈÈÈȵµµÜÎÎÀ†ÚÁÁØÐÐÐÐÐÁÁÚÀÀÚÀÚÏÏÏÏÁÁÃÁйÐÐÐÐÐÐÐÐÐÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…Ä…ÄÐйØÁÏÏÏÚÏÏÏÏÏÏÏÁÁÁ†ÁÚÎܵÛÛÛµµÜÜεܵÜÜÎÎÚÀÚÚÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØ¹ÁÁÁÁÚÚ†ÚÀÎÎεµÈµÛµµÎÎÎÀÚ†ÁÐÐÐжօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Ö…ÐÐØØØÁÁÁØØØØØØÐнÐннÐÐÐÁ††ÀεµµÛÛËËËÛËÛÛÛÈÈÈÈÈÈÈÛËÛ´ÛÛÛÈÈÈÈÈȵµÜÎÎÎÚ†ÁÁØÐÐÐÐÐÐÁÚÀÚÀÚÚÏÏÏÏÁÁÁ¹ÃÐÐÐÐÐÐÐÐÐÐÐÐж………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂ…Ö…ÄÄÄÐйÁÏÏÏÏÏÏÏÏÁÏÁÏÁÁÁÁ†ÎεÈÛÈÛµµµµÜµÜµÜÎÎÎÀÚ†ÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÁÁÚφÚÀÎÎεÉȵ۵ÉÜÎÎÎÎÚ†ÁÁÐÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¶ÐÐØØÁØØØØØÁØØÐÐÐн½Ä½Ð½ÐÐØ††ÝεµµÛËËËÛËâ´ÈÈÈÈÈÈÈÈÛ´â´ÛÛÈÈÈÈÈÈȵµÜÜÎÎÀ†ÚÁÁØÐÐÐÐÐÐÁÚÀÀÀÚÚÏÏÏÏÁÁÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÂÂÂÂÂÂÂÂÂÖ……Ä…ÄÄÄÐйÁÏÏÏÏÏÏÁÁÁÏÁØÁØÁÚÎεÛÛ´ÈÛÈɵµµµÜµÜÎÎÎÚÚÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÁÁÁÚÚ†ÀÚÀÎÎÎεµÈÈÈɵµÎÎÎÎÀÚÁÐÐÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÐÐÐÐØØÁØØÁØØØÐÐÐнօ……½ÐÐÐÁÁÚÎܵܵÛË´ÛÛâ´ÈÈÛµÈÈÈÈÈÛÛÛÈÛÈÈÈÈÈÈÈȵÜÜÎÎΆÚÁÁØÐÐÐÐÐÐÐÁÚÀÚÀÚÏÏÏÏÁÁϹÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄ…Ä…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÂÂÂÂÂÂÂÂÂÂÒ……ÄÄÄÐÐйÁÁÏÏÏÏÏÁÁ¹ÐÁÐØÁÁ†ÚÎܵÛÛ´ÈÛÈÛµµµµÜµÜÎÎÀÀÚÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÁÁÁφÚÀÚÀÚÀÎÎÎεµÉȵȵÉܵÎÎÎÚ†ÚÁÐÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ĽÐÐÐÐÁØÁØØØØÐÐÐнնֶօÐÐØÁÁ†ÎµÜµÛËËÛÈ´ÛȵȵܵÈÈÈÈÛÈÈÈÈÈÈÈÈÈÈȵµÜÎÎΆÚÁÁØÐÐÐÐÐÐÐÁÏÀÚÀÚÏÏÏÏÁÁùÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÂÂÂÂÂÂÂÂÂÂ……Ö…ÄÄÄÐйÁÏÏÏÏφÁйÐÐÐÐØÁÁÚÎε۴ÛÛ´ÛÈÛȵµµÜµÎÎÎΆÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÁÚ†Ú†Ú²ÚÀÎÀÎÎÎÎÜεÈÉȵ۵ÜÎÎÎÎÀÚÁÁÁÐÐÐÐ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……½ÐÐÐÐØØØØØØÐÐÐÐÐн……………¶ÐÐÁÁ†ÎÜÜܵÛËÛÈÛÛÈɵµÜܵµÈÈÈÈÈÈÈÈÈÈÈÈÈȵµÜÎÎÎÚ†ÁÁØØÐÐÐÐÐйÁÚÚÀÚÚÏÏÏÁÁÃÐÐÐÐÐÄÄÄÄÄÐÐÐÐÐÐÐÄÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÂÂÂÂÂÂÂÂÂÂ………Ö¶ÄÄÐÐÐÁÁÏÏÏÏÏÁ¹ÐÐÐÐÐÐÁÁ†ÚÎÜÈÈ´ÛÛ´ÛÈȵɵµÜÎÎÎÎÚÁØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÁÁÁÁÚÁÚ†ÀÚÚÎÀÎÎÎÎÎÎܵÉÈȵȵµÜÜÎÎÎÀ†ÚÁÁÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÐÐÐÐÐÐØÐÐØÐØÐÐÐнօ………Ö½ÐÐØÁ†ÎÎεÛÛÛÈÛÈÛȵµÜÜܵÜÈÈÈÈÈÈÈÈÈÈÈÈȵµÜÜÎÎΆÚÁÁØÐÐÐÐÐÐÐØÁÚÀÚÚÏÏÏÁϹйÐÐÐÄÄÄÄÄÄÄÐÐÐÐÐÄÄ…Ä…Â…ÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂ……ĶÄÐÐйÁÏÏÏÏÁÏÁÐÐÐÄÐÐÐØÁ†ÀεµÛ´´´´ÛÈȵµÜµÜÎÎÎÀ†ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÚ†À†ÚÀÎÎÎÎÎÎÎÎÜܵµµÛÈȵµµÜÎÎÎÎÀÀ†ÏÁØÐÐÐ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶ÐÐÐÐÐÐÐÐØÐÐÐÐÐнօ…ÂÂ……нÐÁ†ÎÎÎܵÛÛµµÈÛµµÜÜÜÎÜܵÈÈÈÈÈÈÈÈÈÈÈȵȵÜÎÎÎÚÚÁÁØØÐÐÐÐÐÐйÏÚÚÀÏÏÏÁϹÃÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…ÄÄÄÐйÁÏÏÏÏÏÁÁÐÐÐĶÐÐÐØÁÚÎܵµÛ´ÛËÛÛȵµµÜµÜÜÎÎÚÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÚ†ÀÚÀÀÎÎÎÎÎÎÎεܰܵµÈÛȵÈɵÜÎÎÎÀÎÚÚÁÁÐÐж……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÐнÐÐÐÐÐÐÐÐÐÐÐнօ…ÂÂÂ……ÐÐÐÁÚÎÎεÛȵܵ۵µÜÜÎÎÎÜÜȵÈÈÈÈÈÈÈÈÈȵȵÜÜÎÎÚ†ÚÁÁØÐÐÐÐÐÐÐÐÁÏÀÚÚÏÏÁϹÐÐÐÐÐÄÄÄÄÄÄ…Ö……Ä…Ö¶Ö¶Ö……ÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂ………Ä…ÄÄÐÐÐÁÁÏÏÏÁÏÁÐÐÄÄÄÖ¶ÐÐÁ†ÀÎÎÜÈÛË´´ÛÛȵµµÜµÜÜÎÀÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÚ†ÚÚÀÚÎÎÎÎÎÎܵܵµµµÉȵȵ۵µÜ°ÎÎÀÎÀÚÚÚÁØÐÐÐ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶ÄÐÄÐÐÐÐÐÐÐÐÐÐнօ…ÂÂÂ……ÐÐÐØ†ÎÎÎܵȵܵµµÉÜÎÎÎÎÎεµÜµÈÈÈÈÈÈÈÈÛµµÜÜÎÎΆÚÁÁØÐÐÐÐÐÐÐÐÁÏÚÚÚÏÏÏÁ¹¹ÐÐÄÄÄÄÄÄ…Ö…Ö……………………………Â…ÂÂÂÂÂÂÂÂÂÂ…ÖÄÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÐÐйÁÏÏÏÏÁ¹ÐÐÐÄ…………ÄÐØ†ÎÎε۴˴ÛÛÛȵµµµµÜÎΆÁÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÁÚÚÀÀÀÎÎÎÎÎܰµµÜɵɵɵÈ۵ȵɵµÎÎÎÎÀÎÀ†ÚÁ¹ÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ĶĽÐÐÐÐÐÐÐÐн½Ö¶…ÂÂÂÂ…ÄÐÐÐÁÀÎÎε۵ÜεµÜÜÎÎÎÎÎÎÎÜܵܵÈÈÈÈÈÈÛµµÜÜÎÎΆÚÁÁØØÐÐÐÐÄÐÐÐÁÚÚÚÏÏÁÁ¹ÐÐÐÐÄÄÄÄÄÖÄÂÂÂÂÂÂÂ…………ÂÂÂ…Â…ÂÂÂÂÂÂÂÂÂ……ÄÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÖ¶ÄÄÐÐйÁÁÏÏÏÁÁÐÐжą……ÄÐÁ†ÞÎÜÈ´ËËËÛÛÛÈȵµµµÜÎÚÁÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÁÚ†ÚÚÀÎÎÎÎÎΰܵµµÈɵɵȵÛ۵۵ܵÎÎÎÎÀÚÚÚÚÁÁÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄąĽÄÐÐÐÐÐÐÐÐÄÕ……ÂÂÂÂ……ÐÐІÎÎÎܵµÜÎܵÜÎÎÎÎÎÎÎÎÜÜÜܵÈÈÈÈÈÈȵµÜµÜÎΆÚÁÁÁØÐÐÐÐÄÄÄÐÁÏÚÏÏÏÁϹÐÐÐÐÄÄÄÄÄÖ¶ÖÂÂÂÂÂÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂ………Ö¶ÄÄÐÐÐÁÏÏÏÁÁÁÐÐÐÄ……ÂÂ………ÐÁ†ÎÎÈÛ´Ë´ËÛÛÛÛÈȵÉÜÎÚÁÐÐÐÐÐÐÐÐÐÐÁÁÁÁÁÁÏÚ†Ú†ÎÎÎÎÎÎÎεµµÉȵÈȵ۵ÛÈÈȵµµÜÎÎÎÎÀÀÚ†ÚÁÁÐжօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ĶÖĶֽÐнÐÐнĽօÂÂÂÂ…ĶÐÁÀÎÎεµÜÎÎÜÜÎÎÎÎÎÎÎÎÎÎÎÎܵµÈÈÈÈȵµµµÜÎÎÀ†ÚÁÁØØÐÐÄÄÄÄÐÐÁÏÏÏÁÁÏÁ¹ÐÐÐÐÄÄÄÄÄÄÖ¶ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÖÄ…Ä…ÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÖÄÄÐÐÐÐÁÁÁÏÁÁ¹ÐÐÄÖ…ÂÂÂÂ……ІÚεÛËËËÛ´Û´ÈÛµÛÈÉÎÎÁØÐÐÐÐÐÐÐÐÁÁÁÁÁÏÚ†ÚÀÚÎÎÎεεµµµÛȵÛÛÈÛȵÛÈÛÈÛµµÜÎÎÎÎÚÀÞÀÚ†ÏÁÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÐÖ¶ÕĶÖÐÐ…ÐÄ…Ð…Ö…ÂÂÂÂÂ………ÐІÎÎÎεÜÎÎÎÎÎÎÎÎÎÞÎÎÎÎÎÎεµµµÈȵµµµÜÜÎÎΆÚÁÁÁÁÐÐÐÄ……ÄÐØÁÁÁÁÁÁÁÏÐÐÐÐÄÄÄÄÄÖ…ÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÖÄ…Ä…ÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¶ÖÄÐйÐÁÏÏÁÁÐÐÐÐÄÄ…ÂÂÂÂÂ…¶Ø†ÎεÛËË´Ë´â´ÛÛÛÛµµÎ†ÁÐÐÐÐÐÐÐÁÁÁÁÁφÚÀÚÀÎÎÎεܵɵÉÈÛÛÛÛ´ÛÈÛÈÈÛÛÛµµÜµÎÎÎÀÎÚÀÎÎÚÁÁØÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä…¶…Ä…Ö½¶…Ä……Ä…Ä……ÂÂÂÂÂ……ÄÐÁÎÎÎÎÎÎÎÀÎÎÎÎÞÀ††††ÎÎÎÎÎÜܵµÈÈȵܵÜÜÎÎÎÚ††ÁÁØØÐÐÐ……ÄÄÐÁÁÁÁÁÁÁϹÐÐÐÐÄÄÄÄÖÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ä…ÖÄ…Ä…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÄÄÐйÐÁÁÁÁ¹ÐÐÐÄÄ……ÂÂÂÂÂ…ÐÁ†ÎÜÈ´Ë´´Ë´â´´ÛÛÛµÎÚÁÐÐÐÐÐÐØÁÁÏÁÚÚÚ†ÚÀÎÎÎΰµÉµµÉÈÛÛ´Û´Û´ÛÛÛÈÛ´ÛȵµÜÎÎÎÀÚÀÚÎÎÀÚÁÐÐÐ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö………………………Ä…………ÂÂÂÂÂÂ……ÄÐÚÎÎÎÎÎÎÀÚÎÎÎÚ²Þ†††††ÎÎÎÎܵµµµÈµÜµÜµÎÎÎÀÚ†ÏÁÁØÐÐÐ………ÄÐÐÁÁÁÁÁÁÁÁÐÐÐÐÄÄÄÄÄ…Ö¶ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ä…ÖÄ…ÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÄÄÄÐÐйØÁÁÁйÐÐÐÄÖ…ÂÂÂÂÂ…ÐÁ†Úε۴ËÛ´â´Ë´´´ÛµÜÀÁÐÐÐÐÐÐÁÁÏÁÚ†ÚÀÚÎÎÎÎεÜɵÈÈÈÉÛ´Û´ÛËÛËÛÈÛÈÛÛÛµÜÜÎÎÎÎÀÚÀÎÎΆÁØÐÐ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………………………………ÂÂÂÂÂÂÂ…Ö½ÁÎÎÎÎÎÎÀÚÎÀ††††††††††ÞÎÎÎܵµµµµµµµµÜÎÎΆÚÚÁÁØÐÐÐÐ……ÄÐÐÁÁÁÁÁÁÁÁ¹ÐÐÐÄÄÄÄÄÄÄ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Ö¶Ö¶ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄÄÄÐÐØ¹ÁÁÁ¹ÐÐÐÄĶÖÂÂÂÂÂ…¶ÐÁ†ÀܵÈÛ´´´Ë´Ë´´ÛÛµÎÁÁÐÐÐÐÐÁÁÁÚÁÚ†ÚÎÎÎÎÎεµµÈÛÈÉÈÛÛË´ËÛËÛ´ÛÈÛ´ÛȵÜÜÎÎÎÀÚÀÞÎÎÎÀÁØÐÐ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÂÂÂ…………………………ÂÂÂÂÂÂÂ……¶ØÀÎÎÎÎÎÀ†ÀÚ††††††††††††ÎÎܵµµµµµÜµÜܵÎÎÚÚ†ÏÁØØÐÐÐ………ÐÐÁÁÁÁÁÁÁÁÁ¹ÐÐÐÄÄÄÄÄÄ…ÄÂÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Ö¶Ö¶ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÄÖÄÄÐйÐÁÏØÐ¹ÐÐÄÄÖ…ÂÂÂÂÂÂÄÐØÁ†ÎµµÈÛ´Ë´ËËË´´ÛµÎÚÁÁÐÐÐÁÁÁÚ†ÚÀÚÎÎÎÎÎܵɵÛÛÈÛÈÛ´´´ËËË´ËÛ´ÛÛ۴ȵÜÜÎÎÎÎÀÚÀÎÎÎÚÁØÐÐ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â……………ÂÂÂÂÂÂÂÂ…ІÎÎÎÎÎÀ†††††††††††††††ÎÎÎܵµµµµÜµµµµÎÎÀ††ÏÁÁØÐÐÐÐ…ÖÄÐØÁÁÁÁÁÁÁÁÁÐÐÐÐÄÄÄÄÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¶Ö¶ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÄÄÐÐйØÁ¹ÐÐÐÐÐĶÖÂÂÂÂÂÂ…ÐÐØÚÀεµÛ´Û´Û´Ë´´ÛµÎÎÚÁÁØÁÁÁÚ†ÀÚÚÎÎÎÎÎܵɵÉÛÛ´Û´´´ËË´Ë´Ë´ËÛ´ÛÛÈÛµÜÜÎÎÎÀÚ²ÚÎÜβÏÁØÐÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂ…ÄØÀÎÎÎÎÀ†Ú†††ÁÁ†††††††††ÚÎεµµµµÜµµµÜÜÎΆÚÁÁÁØÐÐÐÐ……ÄÐÐÁÁÁÁÁÁÁÁÁйÐÐÄÄÄÄÄÄÄ…ÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÖÄÖÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÖ¶ÄÐÐÐйÁÁ¹ÐÐÐÄÄÖ¶…ÂÂÂÂÂ…ÐÐØÁ†ÎÎܵÛÛ´´Û´ËÛ´ÛµÎÀ†ÁÁÁÁφÀÚÎÎÎÎÎεµµµÛÈÛ´Û´Û´ËËËËËË´Ë´ËÈÛÈÛȵµÎÎÎÎΆÚÎÎÎÎÚ†ÁÁж……Â……Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ІÎÎÎÎÚ†ÚÁÚÁÁÁÁÁÁ††ÁÁ†ÁںεµµµÜܵµµÜÜÎÎÀÚ†ÁÁØÐÐÐÐ…ÄÄÐÐÁÁÁÁÁÁÁÁÁйÐÐÐÐÄÄÄÄÄ…Ä…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÐÐйÐÁÁÁÐÐÐÐĶÖÂÂÂÂÂÂ…ÄÐÐÁÚ²ÎܵµÛÛ´´ËÛ´ÛÛµÜÎÚ†ÁÁÚ†ÀÚÎÎÎÎÎεÜɵÛÈÛ´ÛËÛË´ËËËËËËË´Ë´âÈÛÈÛµÜÜÎÎÎÎÚ†ÎÎÎÎÀÚÁØÐÐ………Â…ÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÁÎÎÎÎÀ†ÚÁÏÁÁØÁØÁÁÁÁØÁÁÚ†ÎÜܵµÜµÜµµÜÎÎÎÀ†ÁÁØØÐÐнÄÄÄÄÐÐÁÁÁÁÁÁÁÁйÐÐÐÐÐÐÄÄÄÄÄ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄ…ÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÐÐÐÐÁÁÁعÐÐÐÄÄ…ÖÂÂÂÂ……Ä½ÐØÁÚÎÎÜÉÈÛ´â´ÛÛÛÛȵÎÀ†Ú††ÀÚÎÎÎÎÎεÜɵµÛÛ´Û´´ËËËËËËËËËËË´â¯ÛÈ۵ȵÜÎÎÎÎΆÀÎÎÎÞ†ÚÁØÐ¶………¶……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÐÚµÎÀÚÚÁÁÁÁÁØØØÁØÁÁØÁÁ††ÎÎܵܵÜܵµµÜκچÚÁÁØÐÐнÄÄÄÄÐÐÐÐÁÁÁÁÁйÐÐÐÐÐÐÐÄÄÄÄąą»»ÂÂÂ…Ö¶ÖÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÖÄÐйÐÁÁÁÁÁÐÐÐÄÄ………Â…ÂÄ…ÄÐÐÁ†ÀÎܵÛÛ´´Û´ÛÛÛÛµÜÎÚ†ÚÀÚÎÎÎÎÎεܵµµÛÛ´Ë´ËËËËËËËËËËËËËËËÛÈ۵ȵµÜκÎÎÞ†ÝÎÎβچÁØÐÐ……ÄÖ…Â…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂĆÎÜÎÀÚ†ÁÁÁØØØÐ¹ØÁØØØÁÁÁÚÎÎÜܵÜεɵÜÎΆ†ÚÁÁÐÐÐÐÐÄÄÄÄÄÐÐÐÁÐÁÁÁعÐÁÐÐÐÐÐÐÐÄĶÖÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖĶÄÐĶÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄÄÐÐйÁÁÁÁÁ¹ÐÐÄÄÄ…Ö……Ö¶ÄнÐÁÁÚÎÎɵ۴۴ÛÈÛÛÈɵÎÎÎÎÎÎÎÎÎÜÎܵµµµÛÈ´Ë´ËËËËËËËËËËËËËËË´ËÛȵµµÜµÜκκÚÎÎÎÎÚ†ÚÁÁØÐąĶ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ØÎµÎÀÚ†ÁÁÁØÐÐÐØÐÁØØØÁØÁÚÀÎÎÎÎÎεµµÜÎΆÏÁÁØÐÐÐÐĶօÄÄÄÐÐØ¹ÁÐÁйعÐÐÐÐÐÐÐÐÄÄĶօ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶ÖÄÐÐÐÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÐÐÐØ¹ÁÁÁÁÁÁÐÐÐÄÄÄÄÖÄÄÐÐÐÐØÁ†ÀÎεµÛ´ÛÛÛÈÛÛȵµÜÎÎÎÎÎÎܵµµµµµÛÛ´Ë´ËËËËËËËËËËËËËËËËË´ÈȵܵÜÜÜκºÎºÞÎÜΆچÚÁÁнֶą…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÀµÎÚ††ÁÁÁØÐÐÐÐÁÁØØÐÐØÁ††ÎÎÎÎÎεµÛµÜΆÏÁÁØÐÐÐжÄÖ¶Ö¶ÐÐÐÐÐйÐÐÁйÐÐØÐÐÐÐÐÐÄÄ…Ö……Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÄÄÄÐйØÁÁÏÁÁÁÁ¹ÐÐÄÄÄÄÄÐÐÐÐÐÐÁÏÚÎÎÜÉÈÛÛÛÈÛÈÛÛȵµÎÎÎÎε°ÜµµµµÛ´´Ë´ËËËËËËËËËËËËËËËËËË´ÛÈȵܵµÜÜκºÎÎÎÜΆ†Ú††ÁØÐ½Ä…………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÁÎÜÀÚÏÁØÁØÐÐÐÐÐÁØØÐÐÐØÁÚÀÎÎÎÎÎεµµÜÎÚ†ÁÁØØÐÐжą…Ö¶ÄÐÐÐØÐØÐÁÐÐÁййØÐÐÐÐÄÄÖÄ………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÖÄÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÄÐÐйÁÁÁÏÁÏÁÁÐÐÐÐÐÐÐÐÐÐÐÐØÁÁ†ÚÎÎܵµÛÛÛÈÛÈÛȵµµÎܵµÜµµÉÈÉÛÛ´ËÛË´ËËËËËËËËËËËËËËËËË´ÈÈÈȵÜܵÜÎκºÎε܆††À†ÁØÐнж……Ä…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÐÀÜÎÚÁÁÁØÐÐÐÐÐÐÁÐÐÐÐÐØÁ†ÚÎÎÎÎÎεµÛÜÎÀ†ÁÁØÐÐнÄÄ…………ÄÐÐÐÐÐØÐÐÐÁÐÐÁØÁÐÐØÐÐÄжօ……Â……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÄÐÐØ¹ÁÏÁφÏÁÁÁÐÐÐÐÐÐÐØÐÁÁÁÁÁÚ²ÎÎܵÈÛÛÛÈÛÛÛµµÜµµÜɵÈÈÈÈÈÛ´ÛË´ËËËËËËËËËËËËËËËËËËËËËÈȵµµÜÜÜÜÎκºÜµÜº††Þ††ÁØÐÐнֶ………Ö……»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂ………Â…Â…ÂÂ…ÐÁÎÎÀ†ÁÁØØÐÐÐÐÐÁØÐÐÐÐÐØÁÚÀÀÎÀÚÎεÛÜÎÀ†ÚÁÁØÐÐÐÄ………ÂÖÄÄÐÐÐÐÐÐÐÐÐÐÁÁÏÁÁÐÁÐÐÐÐÄÖ…………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¶ÄÄÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÐÐÐÐØÁÁÁÁÁ†ÏÁÁÁÐÐÐÐÐØ¹ÁÁÁÁÁÁÁÚÀÎεµÛÈÛÛÛÈÛÈɵɵµµÈÛÛÛÛÛ´Ë´Ë´´ËËËËËËËËËËËËËËËËËËËËâÈÈȵÜܵÔÎÎÎÜܵÜΆ޺چÁÁعÐнֶօą…Ö»ÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä………ÂÂÂÂÂÂÂÂÂÂÂ…Ä…Ö…Ö…Ä…ÄÐÁÚÎÚ†ÏÁØÁÐØÐÐÐØÐÐÐÐÐÐØÁÁÚ²ÚÀ†Àε۵ÎΆÚÁÁØÐ½Ð¶………Â……Ä…ÐÐÐÐÐÐÐÐÐÁÁÏÁÁÁ¹ÐÁÐÐÄÄ………Ö…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¶ÖÄÐÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÖ¶ÄÄÐÐйØÁÁÏÁÁÁÏÁÁÁйع¹ØÁÁÏÁÁØÁÁÚÎÎÜÉÈÛÈÛÛÛÈÉÈɵµÉÈÛÛÛÛ´´â´ËËËËËËËËËËËËËËËËËËËËËËËËËÈÈÈȵÜÜÜÜκºÜÈ݆ܺκچÁÁÁÁÐж…¶Ä¶Ä……ÂÂ…»ÂÂÂÂÂÂÂ…Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä……¶Ö…Ö½ÐϲÚÚ†ÁØÁØÁÐÐÐÐÁÐÐÐÐÐÐÐÁÁÁÚ††ÚºÎÛµÎΆÚÁÁÐÐÐÐж…ÂÂ…ÂÖÄÄÐÐÐÐÐÐÐÐÁÁÏÚÁÁÁÁÁØÐÐÄ………Ö¶Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶ÖÄÄÐÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÄÐÐÐØ¹ØÁÁÏÁÏÁÏÁÁÁÁ¹ÁÁÁÁÁÁÏÁÁØÁÚÀÎεÛÈÛÈÛÈÛÈÉÈÛÈÈÛÛ´´´´Ë´ËËËËËËËËËËËËËËËËËËËËËËËËËâßÈÈÈȵÈÜÜÜÜܵµÜܺºÎκ†ÁÁÁÁнжֶЅąÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä…Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÄ…¶…Ö…Ö¶ÐÁ†Ú†ÚÁØÁØÁÐÐÐØÁØØÐÐÐÐÐÁÁÁÁÁ††ÚεµÜÎÀ†ÁÁÐÐÐÐж……Â…Â…¶ÖĶÐÐÐÐÐØÁÏÚÚÏÁÁÁÁØÐÐÄ…Ö…Ö…Ö¶……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ò¶ÄÄÐÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÄÄÐÐÐÐØ¹ÁÁÁÁÁÏÁÏÁÁÁÁÁÁÁÁÁφÏÁÁÁÚÚÀÎܵÛÈÛÈÛÈÛÈÛµÈÛÛ´Û´ÛË´ËËËËËËËËËËËËËËËËËËËËËËËËËËËËßÈÈÈÈÜÈÜÜÔÜÈȵÜκºÎÎÀ†Ú†ÁØÐ¶Ö½Ä½Ä¶……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÄ……Ö¶…Ö¶ÐÐÁÚ†ÚÁÁÁØÁÐÁÐÐÁÁØÐÐÐÐÐÐÁÁÁÁÁÁÚÀܵÜÎÀ†ÏÁØÐÐÐжօÂÂ……Â…ÄÄÐÐÐÐÐÐÁÁÚÁÏÁÁÁÁÁÐÐÐÄ…………Ä…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÖÄÄÐÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÄ…ÄÄÐÐÐÐØ¹ÁÁÁÁÁÏÁÏÁÁÁÁÁÁÁφφÏÁÚ†ÀÚÎεµÛµÛÈÛÛÛÈÛÛÛ´Û´ËË´ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËßÈÈÈÈÈÈÜÔÜÜÈȵÔÎÎÎÎÎÎΆچÁ½Ð¶Ä½Ð½Ö¶…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂ……ĶÐÄ……ÂÂÂÂÂÂÂÂÂ……Ķ……Ä…ÄĶÐÐØÁÁÚÁÁØÁØØÁÐØÁÁØØÐÐÐÐØÁÏÁÁÁÁÁ†ÎÎÎÚ†ÁÁÁÐÐÐÐÐÐÐ………Ö…Ö……ąĽÐÐÐÐÁÚ†ÏÁÏÁÏØÐ¹ÐĶÖÖÄÖ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÖÄÄÐйÐÐÁÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÄÄÐÐÐÐÐÐÁØÁÁÁÁÁÁÁÁÁØÁÁÁφφÚÁÚÚÀÚÎÎɵÈÛÛ´´ÛÛÛÛ´ÛËÛË´ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË«ßßÈÈÈÈÈäÔÜÈÈÈÜÜÜÎÜÜÎÎÀ††ØÐ½ÐÐÐÐж………Ò…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Â…Â………¶ÄÐÄ……ÂÂÂÂÂÂÂÂÂÂÂ……Ö…Ö…Ä…¶ÐÐÐÁÁ†ÁÁØÁعÁÐØÁÏÁÐÐÐÐÐÐÁÁÁÁÁÁφÀÎÎÀ†ÁÁØÐÐÐÐÐж……ÂÂ…………Ä…ÄÐÄÐÐÐÁÚ†ÏÁÏÁÏÁعÐжֶą……………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÐÐÐØ¹ØÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÄÐÐÐÐÐÐÐÁØÁØÁÁÁÁÁÁÁÐÁÁÁÚÚÚ†Ú†ÀÚÀÀÎÜÜÉÈÛÛ´´Û´Û´´Ë´ËË´ËËËËËËËËËËËËËËËËËËËËËËËËËËËË«ËßßßÈÈÈÈÈÜÈÈÈÈÜÜÜÔÎÜÜκÀ†ÁÐÐÐÐÐÐÐÄ……………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¶…………Â…ÖÄÐÐÄ………ÂÂÂÂÂÂÂÂÂÂÂ…Â……Ö…ÄĶÐÐÁÚÁÁÁÁØ¹ØØÁØÁÁØÐÐÐÐÐÐÁØØØÁØÁÀÎΆ†ÁÁØÐÐÐÐÄĶօ…Â……………ÄĽÄÐÐÐÁφÏÁÏÁÏÁØÐÐÐÄÖ¶Ö¶Ä…………ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÄÄÄйععÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ä…ÄÐÐÐÐÐÁйÐÁÁÁÁØÁÁعØÁÁÏÚÏÚ†ÚÚ†ÚÚÀÎεÛÛ´ÛË´Û´ÛË´Ë´ËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËË««ß«ßÈÈÈÈÈäÈßÈäÜÜÜÜÎܺκÚÁØÐÐÐÐÐжֶֶօ…Â…ÂÂÂÂÂÂÂ……Ö……¶Ö¶…………ĶÄÐж……ÂÂÂ……ÂÂÂÂÂÂÂÂÂ………Ä…ÄÐÄÐÁ†ÁÁØÁÐØÁÐØÁÁØÐÐÐÐÐÐÁØÁØÁØÁÚÎÚ††ÁÁÐÐÐжÄĽօ………Â………ĶÐнÐÐÐÁ†Ï†ÏÁÏÁÁÐÐÐÄÄÄÄÄÖ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÐÐÐйعØÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÄÄÐÐÐÐÐÐÐØÁØÁØÁÁÁÁÁعÁÁÁÁÚ†Ú†ÚÚ†ÚÚÀεµÛÛ´ÛË´Û´´Ë´ËËËËËËËËËËËËËË´Ë´Ë´ËËËËËËËËàààËË««ßß«ßÈÈÈ ÈÈßÈÈܵÜÜÜÜܺβ†¹ÐÐÐÐÐж¶…¶Ä¶Ö…¶ÂÂÂÂÒ¶……ąĶ¶ÕÄ……Ä…ÄÐÐÐÖ…Â…ÂÂ……ÂÂÂÂÂÂÂÂÂ……Ö…Ä…ÄÐØÁÚÁÁØØÐÁÐÁÁÁÁØÐÐÐÐÐÐØÁÐÐÐÁ†ÀΆ†ÁØÐÐнÐÐÄ…Ä……………………ąнÐÐÐÐÁÁÚ†ÏÁÏÁÁØÐÐÐÄÄÐÄÖ¶Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÐй¹ÁÁ¹ØÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÖÄĽÐÐÐÐйØÁØÁÁÁØÁйعÁÁÁÁÏÚÚ†ÚÚ†ÀÚÎεÈÛÛ´Û´´ËËËËËËËËËËËËËËËËË´Ë´â´ËËËËËËËËàààà«««ßßßßÈÈßßßÈÈÈäµÜÜÜÜκކÁÐÐÐÐÐÐąĶÐĶąҶ…҅¶…ÄÐÄĽÐÐЅĶÖÄÐÐÐÄ………Â……ÖÂÂÂÂÂÂÂÂÂÂ…Â…Ä…Ä…ÐÁ†ÁÁØÁÐØÐÁØÁØÐÐÐÐÐÐÐÐÐÐÐÐÁ†ÀÚ††ÁØÐÐÐÄÐ…Ä………Ä…Ä……ÖÄ…ÄжÐÄÐÐÁÁÚÁÚÁÏÁÁØÐÐÐÄÐÐÐÄÄÖ……Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÖÂÂÂÖÄÄÐйØÁÁÁÁ¹ÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ä…ÄÄÐÐÐÐØÐйØÁØÁÐÁйØÁÁÁÁÁÏÚφÏچچεµÈÛÛ´Û´´ËËËËËËËËËËËËËËË´´ÛâËâ´Ë´âËËËààààà«ßßßßßÈ«ßÈÈÈäÜÜÜÜÜκ†ÁؽÐÐÐÐÐĽĽÄĶօ…Ö……¶…ÄÐÐÐÐÐÐÐÐÐ…ÄÄÐÐÐÐ………Â……Ä…ÂÂÂÂÂÂÂÂÂÂÂ…Ä…Ä…ÐÐÁÁÁØÁÐÐÐÐÐÁØØÐÐÐÐÐÐÐÐÐÐÐÐÁÀ†††ÁØÐÐж¶…………………Ö……Ö¶ÖĽÄÐÐÐÐÐφÁÚÁÏÁÁØÐÐÐÄÐÐÐÐÄ…Ä………Ò…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÄÄÖÖÄÄÄ…ÐйÁÁÁÁÁÁÐÁÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÄÄÄÄÐÐÐÐØÐØ¹ØÁØÁععÐÁØÁÏÁÁÚφÏÚ†ÀÎÜɵÈÛ´´ÛË´ËËËËËËËËËËËËË´Û´ËÛâ´ËÛË´âËËËËààà««ßßßßßß«ßÈÈÈÈäµÜÜܺΆÁÐÐÐÐÐÐÐÐÐÐнÄĶą…¶…¶ÄÐÐÐÐÐÐйÐÐĶÐÐÐÐÐÖ…………Ä……ÂÂÂÂÂÂÂÂÂÂ………Ö…ÄÐÁÁÁÁÁÐÐÐÐÐÐØÐÐÐÐÐÐÐÐÐÐÐÐÐÁÚÀ†ÁÁØÐÐжÄÄ………………………Ö¶Ö¶ÄнÐÐÐÐφφÁÏÁÁÁÐÐÐÐÐÐÐÐжą……ÒÂ…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÄÄÄÄÄÄÄÄй¹ÁÁÁÁÁÁÁ¹ÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÄĶÐÐÐÐØ¹ØÁØÁعØÐÐÁйØÁÁÏÁÚÏÁÏÏÚÎεɵÈÛ´´´ËËËËËËËËËËË´Ë´Ë´ÛÛ´Û´â´âÈËËËËËàà««ß«ßß««ßßÈÈÈÈÜÜÜÜܺ†ÁØÐÐÐÐÐÐÐÐÐÐÐжĽֶ…ÄÄÐÐÐÐÐÐйÐÐÐÄÐÐÐÐж………ÖÄ…¶ÂÂÂÂÂÂÂÂÂÂÂ……Ö……ÄÐÁØØØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÚÀ†ÁÁÐÐÐÐÄĶ…………………………¶Ö¶Ä½ÄÐÐÐÁφφÏÚÁÏÁÐÐÐÐÐÐÐÐÐÄÄ…Ä………ÂÂ…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÄÄÄÄÄÄÄÄÐÐÐÁÁÁÁÁÁÁÁØÐÐÐлÂÂÂÂÂ………Ö¶ÄÄÄÐÐÐÐÐÐÐÁйÐÐÐÐйÐÁØÁÁÏÁÚÁÁÁÚÀÎܵµµÛ´Û´Ë´ËËËËËËËË´ËËË´Û´ÛÛÛÛ´ÛÛÛÛÛ«â«à«å«ßß««ßÈÈÈÈÈÜÜÔÜΆ†ØÐÐÐÐÐÐÐÐÐÐÐÐнĶֶÐÐÐÁØÐÐÐÐÁØØÐÐÐÐÐÐÐ…………¶…………ÂÂÂÂÂÂÂÂÂ……………ÖÐÐÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÚ†ÁØÐÐÐÐÐÄÄÄ………………………ÄֶнĽÄÐÁÁ†Ï†Ï†ÁÏÁÐÐÐÐÐÁÁ¹ÐÐÄÖÄ…Ö…………Â…ÂÂÂÂÂÂÂÂÂÂÂÂÄÄÐÄÐÄÐÄÐйÁÁÁÁÁÁÁÁÁ¹ØÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ö¶ÖÄÄÐÐÐÐÐÁÐÁعÐÐÐÐÐÐÐÁØÁÁÏÁÚÁÁÁÚÎÎܵÈÈÛ´â´ËËËËËËËËËË´´´â´ÛÛÛÛÛÛÛÛÛÛÛß«ËË«å«ß««ß­ÈßÈÈ®ÜܵܺÁØ½ÐØÐÐÐÐÐÐÐÐÐÐнЅÐÐÐÁØÁØÐØÐØÁعÐÐÐÐÐ……………Ö………ÂÂÂÂÂÂÂÂÂ…Â…ÂÂ…ÄÐÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÚ†ÁÁÐÐÐÐÐÐÐÄÄ……………………Ä…ÄÐÐÄÐÄйÁÚ†ÁφÏÁÁÐÐÐÐÐÁÁÁØÐÐĶÖÄ…Ö……………………ÂÂÂÂÂÂ……¶ÄÐÐÐÐÐÐй¹ØÁÁÁÁÁÁÁÁØÐÐÐÐÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÖÄÐÐÐÐÐÐØÐÁйÐÐÐÐÐÐÐØÁÁÁÏÁÚÁφÚÎεµµÈÛ´Û´ËËËËËËËË´ËËÛ´ÛÛÛÛÛÛÛÛÛÛÛÛÈß«å«å«««ßßÈßÈÈÈÔ®ÜÜÝ†ØØÐÐÁÐÐÐÐÐÐÐÐÐÐÐнÐÐÁÁÁÁØÁÁÁÁØÁØÐÐÐÐж……ÄÖ……¶……ÂÂÂÂÂÂÂÂ……ÂÂ…ÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÚ†ÁÁÐÐÐÐÐÐÐÄÐ…Ä………………Ä…ÄÐнÐÐйÁÁÁÚ†ÁÏÁÁØÐÐÐÐÁÏÁÁÐÐÐÄÖ¶ÖÄ…ÄÖÄ…………ÂÂÂÂÂÂ…ÄÄÄÐÐÐйй¹ÁÁÁÁÁÁÁÁÁÁعÐÐÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â……Ö¶ÄÐÐÐÐÐÐÐØÐÁйÐÐÐÐйÐÐÁÁÁ†ÁÁÁÚ†ÀεµÉµÛÛ´ËËËËËËËËËË´´´ÛÛÛÛÛÛÛÛÛÛÛÛÛÈß˫嫫««ßßßÈßÈÈäܵܺ†ØÐÐØÁÐÐÐÐÐÐÐÁØÐнÐÐØÁÁÁØÁØÁØÁÁÁعÐÐж…¶¶…¶………Ä…ÂÂÂÂÂÂÂÂ…ÂÂÂ…ÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐІ†ÏÁÐÐÐÄÐÄÄÄÐ…Ä…Ä…………ąнĽÄÐÐÁÁÁÁ†ÁÚÁÁÁÐÐÐÐÐÁÁÏÁÁÐÐÐÄÄÖ¶ÖÄ…Ä…Ä………ÂÂÂÂÂ……ÄÄÄÐй¹ÁÁÁÁÁÁÁÁÁÁÁÁÁعØÐÐÐÐÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Ö…ÄÐÐÐÐÐйØÐÁйÐÐÐÐÐ¹ÐØÁÁφÏÁÏÚÚÎεµÉÈÈÛ´ËËËËËËË´Ë´ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÈÈß«Ëà«å«««ßßßßÈÈÈ­ÜÈܺ†ÁÐÐÐÁÁØÐÐÐÐØÁÁØÐÐÐÐÁÁÁÁÁÁÁÁÁÁ†ÁÁØÐÐж¶…¶¶…¶…¶Ö…ÂÂÂÂÂ…Â……ÂÂ…ÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÁÁØÐÐÐÄÄÄÄÄÄ……Ä…Ò…………ÄÐĽÄÐÐÁÁÁÁÁÁÁÁÁÁÐÐÐÐÐÐØÏÁÁÐÐÐÄÐÖÄÖ¶ÖÄ…Ä…Ö…………ÂÂ……ÄÄÄÐÄÐйØÁÁÁÁÁÁÁÁÁØÁعØÐÐÐÐÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÄÄÐÐÐÐÐÐØ¹ØØ¹Ø¹ÐÐÐÐй¹ØÁÁÏÁÚÁÚÚÀÎܵµÉµÛÛ´ËËËËËËË´Û´´ÛÛÛÛÛÛÛÛÛÛÛÛÈÈÈß«àà«««å«ßßßßÈÈÈÈÜܺ†ÁØÐ¹ÁÁÐнÐÐØÁØØØÐÐØÁÁ†ÁÁÁÁÁÁ†ÁÁØÐÐÐÐÐĶą¶Ö¶Ä¶Ö…Â…Â…………ÂÂÂ…ÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁØÐÐÐÐÄÄÄÄÄÄÄÖ……Ö…Ö…ÖĶĽÄÐÐÁÁÁÁÁÁÁÁÁÁÐÐÐÐÐÐÁÁÁÏÁÐÐÐÐÐÐÄÄÖÄÄÄ…Ä…Ö……Â………Ä…ÄÐÄÐйÁÁÁÁÁÁÁÁÁÁÁÁйØÐÐÐÐÐÄÄ…ÂÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÄÄÄÐÐÐÐÐØÁÐÁÐØÐÐÐÐÐÐÐÁÁÁÁÁÁÚÁÚÚÎÎܵܵµÛÛ´ËË´´Ë´´´ÛÛÛÛÛÛÛÛÛÛµµµÛÈÈȫ߫àß««åßßßßßÈÈÈȵԆ†ÐÐØÁÁØÐÐÐÐÁÁÁØÁØÁØÁ†††ÁÁÁÁ†††ÁØØÐÐÐÐÐжą¶Ð½Ä……………¶…ÂÂÂ……ĽĽÐЅĶÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÐÐÐÐÐÄÄÄÄĶօ¶Ö…ÂÂ……ąжÐÐÐÁÁÁÁÁÁÁÁÁÐÐÐÐÐÐÐÁÁÁÏÁÁÐÐÐÐÐÐÐÐÐÖÄ…Ä…Ä…Ä………ÖÄ…ÄÄÄÐйÐÁÁÁÁÁÁÁÁÁعÐÁØÐÐÐÐÐÄÄ…Ö………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…օĶÄÐÐÐÐÁØÁØÁ¹Ø¹ÐÐÐÐÐÐÁÁÏÁÁÁÚÁÚÀÎΰÜܵÈÛÛ´´´Ë´â´Û´ÛÛÛÛÛÛÛµµµµµµÈÈÈß«àå«ßßßßßßÈÈÈÈÔº†ØÁÁ†ÁÁÐ½ÐØÁÁØÁÁØÁÁ†††††ÁÁ††††ÁØØÐÐÐÐÐÐнÄÐÐнֶ………Ö…Â…………ÖĽÄÐ…Ö…ÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁØÐÐÐÐÐÐÄÄÄĽֶօ…Â…ÂÖąĶÐÐÐÁ†ÁÁÁÁÁÁØØÐÐÐÐÐÐÁØÏÁÁÁйÐÐÐÐÐÐÐÄÐÄÄÄÄ…Ä…ÄÖÄ…ÄÄÄÄÄÐÐйÐÁÁØÁØÁÐÁÐØ¹ÐÐÐÐÐжÄÄÖÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶ÖĶÐÐÐÐÐÁØÁØÁÁعÐÐÐÐйÁÁÏÁÏÁÏÁÚÀÎÜÎÎܵµÛÛ´Û´Û´â´ÛÛÛÛÛÛɵµµÜܵÜÈÈÈß««àà  ßßßßßßßÈßÈÈÈܺ††ÁÁ††ÁÐÐÐØÁÁ†††Á†††††††††††††ÁØÁÐÐÐÐÐннÐÐÐÐÕÖ………¶Ö……………ÄÐÐÄ…Ä…ÄÐÐйÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐÐÄÄÄÄÖ¶Ö………ÂÂ……¶Ä¶ÄÐÐÁÁÁÁÁÁÁÁØÐÐÐÐÐÐÐÐйÁÁØØ¹Ð¹¹ÐÐÐÐÐÐÄÄÄÄ…Ä…Ä…Ä…Ä…ÄÄÄÐÐÐÁйÐÁ¹ÐÁÐÁÐÁÐÐÐÐÐÐÐÄÄÖÖ…Ä…Ö…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶ÄÄÄÐÐÐÐØÁÁÁÁØÁعÐÐÐÐÐÁÏÁÁÁÏÁφÚÎÎÎÎÎεÈÈÛÛÛ´Û´ÛÛÛÛÛÛɵµµÜÜÜÜÈÈÈÈß«««àà  ßßßßß«ßßßÈȵԺ††Á††ÁÐØØÁÁ††††††††††††††††Ú††ÁØØÐØÐÐÐÐÐÐÐÐнĶ…Ö……¶Ö……Ö¶ÐÐжąąÐйÐÐÐÐÐÐÐÐÐÐÐÐйÐÐÐÐÐÐÐÄÄÄÖ¶¶Ö………Â……¶ÖĶÄÐÐÁÁÁÁÁÁÁÁعÐÐÐÐÐÐÐ¹ÐØ¹Ø¹ÁÁÏØÁ¹ÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄ…ÄÄÄÄÐÐÐйÐÁÐØÁÐÁÐÁÐÐÐÐÐÐжąą…ÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÄÄÐÐÐйØÁÁÁÁÁÁÁÐÐÐÐÐÐÁÏÁÏÁÁÁφÀÎÎÀÎÎܵɵÛÛÛ´ÛÛÛÛÛÛÛµµµµµÜÜÜÈÈÈÈßß«­ ¡ßßßß߫߫߫ßÈÈÔºº†††ÚÁØÐØÁ†††††††††††††††††ºÀ†ÁØØØØÐØØØÁØÁÐÐÐ…Ä………¶Ö¶Ö……ÄÐнĶÄÐÐÐйÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÖÖ¶…………Ò…Ö¶ÖÄÐÐÁÁÁÁÁÁÁÁØÐÐÐÐÐÐÐÐÐй¹Ø¹Á¹ÁÁÁع¹ÐÐÐÐÄÄÄÄÄÄÄÄÄÄÖÄÄÄÄÐÐÐÐÁйÐÁÐйÐÐÐÐÐÐÐÐÐÐÄÄÄ………жąÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶…ÄÄÐÐÐÐÁÁÁÁÁÁÁÁÁÁÐÐÐÐÁÁÏÁÏÁÏÁÚÚÀÚÚÚÎÎεɵÛÈÛÛÛÛÛÛÛÛɵµÜÜÜÜÜÜÈÈ߫߫«à +ßßßßßß«â«ß«ßÈÜÔÎ݆²††ÐÁÁ†††††ºÝ†††††††††††Îº††Á†ÁÁØØÁÁÁÁØÐ½½¶………¶…¶Ö……ĽÐÐжÐÐÐÐÐÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄąĶօ……Ò…Ö¶ÖÄÐйØÁØÁÁÁÁØÁÐÐÐÐÐÐÐйÐÐйØÁÁÁÁ¹ÁعÐÐÐÐÐÐÐÄÐÐÐÐÄÄÄÄÄÄÄÐÐÐÐÐØÐÁعÐÐÐÐÐÐÐÐÐжÄÄÄ…………¹ÐÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶ÄÄÐÐÐÐÐØÁÁÁÁÏÁÁØÁØÐÐØÁÁÁÁÁÁÁÁÚ†ÚÀ†ÚÎÎεɵÈÛÛÛµÛɵɵµÜÜܵÜÜÜÈÈÈß««««« ¥«ß««ßÈ߫⫫«««ÈÈÜÔκκ†Á††††Ý†ÝºÝ݆††††††††²ÎÎ݆†ÁÁÁÁÁÁ†ÁØÁÐж…Ö¶……ÄÖ¶Ö¶ÐÐÐÐÐÐÐØ¹ÐÐÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄĶօ………ֶĶÐÐÐÁÐÁÁÁÁÁÁØÐÐÐÄÄÐÐÐÐÐÐйÐÏÁÁÁÁعÁÁйÐÐÐÐÐÐÄÐÐÐÐÄÄÄÄÄÄÐÐÄÐÐÐØÐÐÐÐÐÐÐÐÐÐнÄÄÄÄ…………¹ÐÐÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÐÐÐÐÐйØÁÁÁÁÚÁÁÁÁÁÁØØÁÏÁÏÁÏÁÚÚ††Ú†ÀÎÎÎܵµµÉµÛµÛµµµµÜÜÜܵܵÜÈÈÈß«««««å߫߫ßßßÈß߫߫«««ßÈÜÜÔÎÎↆ††ÝݺººÝÝ݆†††††††ÎÎܺ†††²††††ÁÁØÐн…………¶Ä½Ö…¶ÖÐÐØØÁÁÁÁØÐÁÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÖĶօ……ąĶÐÐÐÁÐÐÁÁÁÁØØÐÐÐÐÐÐÐÐÐÐÐйÐÁÁÁÁÁÁÁÁÁййÐÐÐÐÐÐÐÐÐÐÄÐÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄ……………ÂÂÁ¹ÐÄÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶…ÄÐÐÐÐÐйØÁÏÁ†ÏÁÁÁÁÁÁÁÁÁÏÁÏÁφÏÚÏÁφÀÎÎÎܵµµÉµÛµÉµÉÜÜÜܵܵܵÈÈȫ߫«ß«ß¥ßß«ßßßßÈ߫߫««««ßÈÈÔÜÔÜܺ††ÝݺºÝºÔºÝ݆††º††††ÎܵÎ݆²†††††ÁÁØÐ½½…Ö¶¶…½Ä…Ä…ÐÐÐÁÁÚ†ÚÁÁØÁÁÁÐÐÐÐÐÐÐÐÐÁÐÐÐÐÐÐÐÐÐÐÐÄÄĶÄօֶօĶÐÐйÐÐÁÁÁÁØÁÐÐÐÐÄÄÄÐÐÐÐÐÐÐÁØÁÁÁÁÁÁÁÁÁйÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÐÄÄÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄ…Ä…Ä……ÂÂÂÂÏÁÐÐÄÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶¶ÐÐÐÐÐÐÐÁØÁφ††ÁÚÁÁÁÁÁÏÁÏÁÏÁφÁÁÏÁÚÚÚÀÎÎεµµÉµÛµÉµÜÜÜÜܵµµÜÈÈß߫߫߫ßßßßßßß«ßßߥßÈÈßß««««««ßÈÈÈÔÜܵԺºÝººÔººÔÔÝ݆††Ý†††²ÎµÈβ†ÚºÎ²††ÁÁØÐ½½…¶Ðн¶½Ä…ÐÐØÁ†ÀÀÚ†ÁÁÁÁÁÁÐÐÐÐÐÐÐÐØÁÁÐØ¹ÐÐÐÐÐÐÐÐÄÄÄжֶֶĽÄÐÐÐÐÐÐØÁØÁ¹ÐÐÐÐÐÄÐÄÐÐÐÐÐÐÐÐÁÁÁÁÁÁÁÁعÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄ…Ä……ÂÂÂÂÂÁϹÐÐĶ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÐÐÐÁÐØÐÐÁÁÁφچÁÚ†ÏÁÏÁφÚÁÏÁÁ†ÁÁÏÁÚÚÚÚÎÎÎܵµµµµµÜÜÎÎÜܵÈȵÈÈÈß««ß«ßßßßß««ß«ßßߥߥÈÈȫ߫«««««ßÈÈȭȵµÔÔÔÔÔÔÔºÔÜÔÝ݆ݺ݆†ÎÜȵܲںκݺ†ÁÁØÐнÐÐÐÐÐÐÐÐÄÐØÁ†ÀÎÚ†Ú†ÏÁÁÁÁйÐÐÐÐÐØÁÁÁØÁعÐÐÐÐÐÐÐÄÄÐÄЅжжÐÐÐÐÐÐÐйÐÁÐÐÐÐÐÐÐÄÄÐÄÐÐÐÐÐÁÁØÁÁÁÁÁÁÁÁعйÐйÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÄÄÄÄÄ…Ö………ÂÂÂÂÂÂÚÁÏÁÐÐÄ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶Ð¹ØÁÁØØØÁÁÁφچÚÚ†Ú†ÚÁÁ†Ú†ÏÁÏÁÁÁÁÁ†††ÚÀÎÎܵÜܵܵÎÎÎÎÎܵÈÈÈÈßÈßß«ßßßßß«ßßßߥߥ߃ «««««ßÈÈÈÈÈÈÈÔÔÜÔÜ ÔÔÔÔÔÝ݆ºº††ºÜµÈÈÎÞ²ÎÎκ݆†ÁØÐ½ÐÐÐÐÐÐÐÐÐÐÐÁÁÚÎβÚÀÚ†ÚÁÁÁÐййÐÁØÏ†ÏÁÁÁØÐ¹ÐÐÐÐÐнÄÐÐÐÐÐÐÐÐÐÁÐ¹Ø¹ÐØÁÐÐÐÐÐÐÐÄÄÄÐÐÐÐÐйÐÁÁÁÁÁÁÁÁÁعйÐÁÐйÐÐÐÐÄÄÄÄ…Ä…Ä…ÄÄÄÐÐÐÐÐÄÄÄÄÖÄÄ…Ö………ÂÂÂÂÂÂÂÀÚÁÏÐÐÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÐйØÁÁØØÁØÁÁÚÚÚ†ÚÚÀÚ†Ú†Ú†Ú†ÏÁÏÁÁÁ†ÏÁφÚÀÎÎεÜܵÜÎÎÎÎÎÎÜÈÈÈÈÈ߫߫«ßßßßß«ßßßßßß «««««ßßßßÈßßÈ ä­ä­äÔÔÔäԺ݆Ý݆ºÎܵµÈκÎÎÔºº††ÁÁØ½ÐØØÁØÁØÐÐÐÐÁ؆ÚÚÀÚºÚ²Ú†ÚÁÁعÐÁØØÁÁ†Ú†ÚÁÁÁØÁØÐÐÐÐÐÐÐÐÐÐÐÐÁØÁÁÐÁعØÐÐÐÐÐÐÐÐÐÐÐÐÐÄÐÐÐÐØÁÁÁØÁÁÁÁÁÁÁÁйØÁйÐÐÐÐÄÄÄÄÄ…Ä…Ä…Ä…ÄÄÄÄÄÄÄÄÄÄÄÄÖ…Ö……Â…ÂÂÂÂÂÂÂÎÀÚÏÁ¹ÐÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂ……½ÐÁÐÁÁÁÁØÁØÁÁ†ÀÚÀ†Ú²Ú†Ú†Ú†ÚÁÁÁÁÁÁÁÁÏÁφÚÀÎÎÎÎÎܰÎÎÎÎκÜÜÈÈÈÈ«ßËßßßÈßßßßßßßߥß Ô««à«««ßßßßßßßÈ­È­ä­ Ô äÔºÝ݆ººÎܵܵµÎ²ÎÜκ݆†ÁÁÁØÁÁÁÁ†ÁÁØÐÐØØÁÚ†ÚÎÎÀÎÚ²Ú†ÚÁÁÐÁÁÁÁÁφÀÚ†ÁÁÁÁØÁÐÐÐÐÐÐÐÁÐÁ¹ÁÁÁÁØÁÁØØ¹ØÐÐÐÐÐÐÐÐÐÄÐÄÐÐÐÐйØÁÁÁÁÁÁÁÁÁÁØÁØÁÏÁعÐÐÐÐÄÄÄ…Ä…Ä…Ä…Ä…ÄÄÄÄÄÄÄÄ…ÄÖ¶…………µÎÀÏÏÁÐÄÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…………ÖÖнÐÁÁÁÁÁÁØÁÁÁÁÚÀÚÎÝÚ†Ú†Ú†Ú†ÚÁÁÏÁÁÁÁÁÏÁφÚÀÎÎÎܰÜÎÎÎÎκÎܵÈÈÈßËß«ßÈßßßßßßßߥߥ¡ «Ë««ß«ßßßß«ßÈÈÈ­­È ÔÔÈÔÔÝ݆ÝεÜÜܵµÎºÎÔººÝ†††ÁÁÁ†††††††ØØØÁÁ††Ú²ÎÎÎÎÎÚ†Ú†ÁÁÁÁÁÁÁ††Ú²Ú†ÁÁÁÁÁØÐÐÐÐÐÐÁØÁØÁ††ÏÁÁÁØÁÐØÐÐÐÐÐÐÐÐÐÐÐÄÐÐÐÐÐÐÁÁÁعÁÁÁÁÁÁÁ¹ØÁÏÁйÐÐÐÐÄÄÄ…Ä…Ä…Ä…Ä…Ä…ÄÄ…Ä…Ä…Ä…Ä…………µÎÎÀÁϹÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶……Ö…ÄÐÐÐÐÁÁÁÁÁÁÁØÁÁÁÚÀÚÎÎΆÚÀ††À†ÏÁÁÁÁÁÁÁÁÁÁÚÚÚÚÎÎÎÎÎÜÎÎÎÎκÎܵÈÈßß«ßßßÈßßßßÈßßߥ¥ + +‚«ß«à«ß«ß«ßßß߫߭ÈÈ­ß Ô ÈÔԺݺܵÜÜÎÎÜÜÎκܺºÝ††††††††ººÝ†††ØÁÁ†Ú††ÎÎÎÎÎÀÀÚ†ÚÁÁÁÁ†††ÚڲΆÚÁÚÁÁÁÁØÐÁØØÐÁÁÁÏÀÀÚÁÁÏÁÁØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÁÁÁÁÁÁÁÁÁÁ¹ØÁÏÁйÐÐÐÐÐÄĶօօ……Ö…Ö…Ä…ÄÄ…Ä…Ä…Ö………Â…ÂÂÂÂÂÂÂÂÂÂεÎÀÚÁÏÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶…¶Ö¶Ö½ÐØÁÁÁÁÁÁØÁÁÁÁ†ÚÎÎÎÞÎÚÚÀÚ†Ú†ÏÁÁ†ÁÁÁÁÁÁÁ†††ÚÀÎÎÎÎÎκκκÜÜÈÈÈ«ßßßÈÈÈßßßßßßßß ȫ˫߫««ß«ß«««ßÈß­È­È  È­ÔݺºµäκκÎÜÎÎÎκºº††††ÎººÎÎܺºÝ††††ÚÎÚÀεÜÎÎΆ†Ú²†ÏÁ†Ú†Ú†²ÚÎÚ††ÁÏÁÁÁÁÐØÁØÁÁφÚÎÎÀÚÁÁÏÁØÐÐÐÐÐÐØÐÐØÐÐÐÐÐÐÐØÁÁÁÁÁØÁÁÁÁÁعØÁÁÁйÐÐÐÐÐÄĶֶ……………………Ö…Ä…ÄÄ…Ä…Ö………ÂÂÂÂÂÂÂÂÂÂÂÂÂÎÎÜÎÀÚÁÏÐÐÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÖ¶Ö½ÄÐÐÐÁÁÁÁÁÁØÁÁÁÁ†ÚÎÎÎÎÎÀÚÀÚ†Ú†ÏÚÏÚÁÏÁÁÁÁÏÁÁÁÚÀÎÎÎÎÎκκκܵäÈÈßßßßÈßßßßÈ߫߫ ÔÈßß««««««ßßß«ßßßÈß­È  ­ÈÈÔºÔÜÈÜÎκÎÎܵººÔºº†††ºÎºÎÜܵÔÜÎΆ††ÝÎÎÎÎÜÛµÎÎÎÚ†ÀÚ†ÁÚÀ†Î†ÚÚºÀÀ†ÚÚÁÁÁÁØÁÁÁÏÁ††ÚÎÎΆÁÚÁÁØÁÐÐÐÐÐØ¹Ø¹Ø¹ØÐ¹ÁÁØÁÁÁÁÁÁÁÁÁØÁععйййÐÐÐÐÄÄÄ……………………Â……Ö…Ä…ÖÄ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÀÀÎÎÎÀÏÁÁÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖжÖÐÐÐйÁÁÁÁÁÁÁÁÁÁÚÚÀÎÎÜÎÎÎÚÀÚ†Ú†Ú†ÏÁÁÁÁÁÁÁÁÁφÚÀÀÎÎÎÀκκÎÔܵÈÈß«ÈßßÈßßßßßß«ß ÈÈ߫߫«ß߫߫߫«ßßÈßÈÈ  ÈÈÔÔÜÈÔÎÎÝÚºÎÜܺκԺݺºÜÜܵÈÈÈÈÜÜܺºÎÎÎÎÎܵÛÈÎÎΆÚβÚÚ†ÚκÀ†ÎÀÎÚ†††Ï†ÁÁÁÁÁÏÁÚ†ÚÀεÎÚ†ÁÁÁÁØÐÐØÐйØÁØÁØÁÁÁÁÁÁÁÁÁÁÁÁÁÁØÁйййййÐÐÐÐÄÄÄÖÄ…………Â…ÂÖÂ…………………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÀÚÀÎÎÀÚÁ¹ÐÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…ÖнÄÐÐÐØÁÁÁÁÁÁÁÁÁÁÁÚÀÎÎÜÎÎÎÀ†ÀÚÁÚ†Ú†ÚÁÏÁÁÁÁÏÁÁφÚÀÚÎÚÎÎκκÎÜÜÈÈÈßßßÈßßßßß߫߫ ¢ÈÈÈ߫߫««ßß߫˫«ßßßÈÈ­ ­ÈÈ­ÜÈÔÎÎβ†ÀεܺÔÔܺººÜÔµÈÈßßßÈÈÜÜÜÜÜÜÎÜÜܵËÈÜÎÎÚ²ÞΆÚÚºÎÎÞÀÝÎÀÀ†Ú††ÁÚφچ†Ú††ÚÎÎÜΆÏÁÁÁØÁØÁÐØ¹ÁÁÏÁÁÁÁÁÏÁÏÁÁÁÁÁÁÁÁÁÁÁ¹Ø¹Ð¹Ð¹Ð¹ÐÐÐÐÐÄÄÄÄ…………Â…Â…Â…Â……………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÚÀÀÀÀÀÚÏÁÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÄÐÐÐÐÐØØÁÁÁÁÁÁÁÁÁÁÁÚÚÀεܰÎÎÎÚÀÚÁÚ†ÚÁÚÁÁÁÁÁÁÁÁÁφÚÚÚÎÀºÎÞºÎÔÔÜÈÈÈÈߥ¥ß߫߫«µµÈÈÈßÈß«««â«««Ëà««ßßÈÈ­ ÈÈÈ­Üܺκچ†ÜÜÔÎÔÔÔÜÔÜ®ÈÈÈ߫˫ßÈÈȵÜÜÜܵµµÛËÛµÎΆںچÚÀÎÎÎÎÝÎÎÎÝÚ†ÚÁÚÁÚچφ†Ú†ÀÎεÀ†ÁÁÁÁÁØÁØÁ¹ÁÁφÏÁφÚÁÚÁÚ†ÁÚÁÁÁÁÁØÐÁÐÐÐйÐÐÐÐÐÐÐÄÐÄÄÖ…Ö…Â…Â…Â…Â…………………ÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÚÚÚÚÀÀÚÏÏÁÐÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÐÐÐйÐÁØÁÏÁÁÁÏÁÁÁÁÁ†ÚÎεܰÎÎÀÚÀÚÁÚÚÚ†ÏÁÁÁÁÁÁÁÁÁφچ†ÚÎκÎÝÎÔÜÈÈÈÈß.-4:LÈß««àà«ÈÈÈÈÈÈßÈ«ß˫˫ËËàààà«ßßߥ­­ÈßÈäÔÔÎβ††ÎµÜÜÔÔÜ®ÈÔ­Èß«Ëß˫˫ÈÈÈÈÈÜÜܵȵÛË˵ÜÀÚ²ÞºÚ†ÎÎÜκÎÎÎÎΆچÁ†ÏÁÁφچ†ÀÚεÎÚ†ÁÏÁÁÁÁØÁÁÁφÚÚ†Ú†Ú†Ú†Ú†Ú†ÁÏÁÏÁÁÁÐййÐйÐÐÐÐÐÄÐÄÐÄÄÖ………Ò…Â…Â…Â……Â……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÏÏÚÏÏÚÚÏÁÏÐÐÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÐÐØ¹ÁÁÁÚÁφ†ÁÏÁÏÁÁφÀÎܵÜÎÎÎÀÀ†ÚÁÚ†Ú†ÚÏÏÁÏÁÁÁÁÁÁÁÏچںކκÜÜÈÈÈÈ/44BA­«ßß«àËÈÈÈÈÈÈȫ߫«Ë«Ë«Ëବàà«««ßßÈßßÈ­ÜÜÔΆ†²ÜµÈÜÜÔ®äÈÈÈß«â«Ë«ààË«ßËßÈȵÜȵÈÛà´ÈÜÎÝںκÎÎεÜÎÎÎÎκچ††ÏÁÁÁ†Ú†Ú††ÀÎÎÎÀÚÁÁÏÁÁÁÁچφچÀچچچچچφÁÁÁÁÁÁÁÁййØÐÐÐÐÐÐÐÄÐÄÄÖ¶Ö…Â…ÂÖÂÖÂ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÏÏÏÏÏÏÏÏÁ¹ÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÐÐÐØÁÏÚÁÚ†ÏÁÚÁÏÁÏÁÁÚÚÎÎɵÜÎÎÎÀÀ†ÚÁÚ†Ú†ÚÁÚÁÁÁÁÁÁÁÁÁ†Ú†ÚºÝºÎÔÜÈÈÈÈ444EG«ß««àଫÈÈÈÈÔƒËààààààË««ßÈßÈ«ßÈÔÜܺݺÎÜÈÈÈ®ÔäÈßßß«««ààààß«ßËÈÈȵÈÈÈËàËÈÜÎÞºÎÎÎÎÎܵÜÎÎÜÎÎΆچچÁÁφ†Ï†Ú†ÚÎÎÀ†ÁÏÁÁÏÁÚÚ†Ú†Ú†ÀÚÀÚÚÚ†Ú†Ú†Ú†ÏÁÁÁÁØÁعØÐÁйÐÐÐÐÐÐÄÄÄÄÄÄÖ………ÒÂ……Â……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÏÁÁÁÏÏÁÏÏÁÁÐжÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÐÐØÁÁ†Ú†Ú†Ú†ÚÁ†ÁÏÁφÀεɵÜÎÎÎÀÚÁÚÁÚ†Ú†ÚÁÏÁÁÁÁÁÏÁÁÁÚÚ†ÚÝκÜÜÈÈÈß%444E5߫߫àààËÈÈÈÈ«Ëବ¬ààË««ßßß«ßÈÈ®ÜκÜܵÈÈÈÈ­ÈÈ«ßß«ààËàËà¬à««ËßßÈÈÈÈÈÛËàËȵκÎÎÜÎÎܵÛÜÎÜÎÜÎÎÚ††††ÁÁ†ÚÁ†Ú†ÚÀÎÎÚÁÁÁÏÁ†Á†ÚÚÀÚ†ÀÞÀÚÀÚ†Ú†Ú†Ú†ÏÁÁÁÁÁÁÁÁعÁعÐÐÐÐÐÐÐÄÄÄÄÖÄ………Â…Â…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÏÏÏÁÁÏÏÏÏÁÏÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÐÐÁ؆ڲÀ†ÚÀÀ†ÚÚÚÁÁÚÀÚÎεɵÜÎÎÀ²ÚÁÚ†ÚÚÚ†Ú†ÁÁÁÁÁÁÁÁÁÁ†À†ººÎÔµÈÈÈÈ.444L «ß««àà¬Ë´ÈÈÈ¢ Ëà¬à¬à¬àË««ßß«««ÈÈÈÜÜܵµÈÈÈßÈÈÈß««ß«àààËàà¬àß«ßßÈÈÈÈÈÈˬËÛÈÎÎÎÜÜÎÜܵ۵ÜܵÜÎΆ††††ÁÁÚ††Ú†Á†ÚÎÀ†ÁÁÏÁÚÁÏÚÚÀÚ²ÚºÚÚÀÚÀÚ†Ú†Ú†Ú†ÏÁÁÁÁÁÁÁ¹ØØ¹ÐÐÐÐÐÄÐÄÄÄĶą……Â…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÁÏÏÁÁÁÏÁÁÃÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÐÐÁÁ†Ú†ÀÚÚÀβÚÚ†ÚÁÚÀÀÎܵɵÜÎÎÀÚ†ÁÚÏÚÚÚ†ÚÁÁÁÁÁÁÁÁÁÁφچںÜÜÈÈÈ­,444AË«««ààààß߯ ƒËËà¬ààà¬àË««««««ßÈÈÈÈÈäÈȫ˫ßÈßß««ààà¬à«àààà««ßßÈÈÈÈÈÛààËÈÜÎÜܵÜÜÜÈÛÈÜÜܵÜΆچچÁ†ÀÀ††Ï††ÀΆÏÁÏÁÏÁÁÁÚ†ÚÚ†²ÚÀÚ†ÚÀÚÀ†ÚÁÚÁÁÁÁÏÁÁÁØÁÁÁÁÐÐÐÐÐÄÄĶĶÖÄ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂйÁ¹ÁÏÁÁÁÏÁ¹ÐÐÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÐØÁÁ†Ú†ÎÚÀÎÎÀÀÚ†ÚÁÀÀÎεµÉÜÎÎÎÚÚÚÁÚ†ÚÁÚ†ÚÚÏÏÁÏÁÁÁÁÁÁÁڲκµÈÈÈÈ¥¥¥ß«««««à¬¬«Ë«ßËËËàà¬ààËà«Ë«««««ßÈÈÈÈÈÈß˫˫ß߫૫àààààà«ßßßÈÈÈâË«ËàËÛÜÜܵÜܵµÈÛÈÜεµÜÎΆΆچÚκچ†ÚÚÎÎÚÁÏÁÏÁÏÁϲچ†ÚÚ†ÚÁφچÚφچÏÁÏÁÁÁÁÁÁÁØÁعÐÐÐÄÄĶֶֶֶ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÐй¹Ð¹¹ÏÁÏÁ¹ÐĶÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÐÁÁ†²ÚÚÎÞÎÎÎÀÀÚÀÚ†ÀÀÎÎܵÉÜÎÎÀÚ†Ú†Ú†Ú†Ú†Ú†ÏÚÁÁÁÁÁÁÁÁ†ÚºÎÜÈÈÈÈÈßß««««åààààËâ« ÈËËàËˬ¬ààËà«««àË«ßÈßÈßß«Ë˫˫߫àà«à¬¬àààà«ßßÈÈÈßË«àáàËßµÜܵµÜÜÜÈÛÈÜÜÜÈÜκކΆÚÎÎÎÎÚ††ÎÎΆÁÁÏÁÏÁÁÁÚÀÚ†ÚÁÚÁÁÁÁÁÚ††ÚÚÚ†ÏÁÏÁÏÁÁØÁÁعÐÐÐÐÄąĶօֶ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÐÐй¹ÐйÁÁ¹Ð¹ÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÖ…ÐÐÁÁÚ²†ÀÎÞÎÎÎÀÀÚÀÚ†ÀÀÎÎÜɵÎÎÎÀÚ†Ú†ÚÁÚ†Ú†Ú†ÏÁÏÁÁÁÁÏÁÁ†ÎεµÈÈÈßßßß«««àààËË«« ËËËËËàËààààËË«ËË૫߫߫«ËààààË«àà¬Ëà¬à¬àà¬à«««ßßÈÈßËËà¬ËËÈܵÈÜܵÜÈ˵ÜܵÈÜÎκÞÝΆεÎÎÝÚºÎÎΆÏÁÁÏÁÏØÁÀÚ†ÚÁÁ†ÁÏÁÁÁ†ÚچچφÏÁÏÁÁعØÐÁÐÐÐÐÐÄÄÄ…Ö¶Ö……………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÄÄÐÐйÐÐÐйÐÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ĶÐÐÁÁÚ†ÞÎÎÎÎÎÎÎÀÀÀÚÚÀÀÀÎÜɵÜÎÎÀÚ²Ú†ÚÁÚ†Ú†Ú†ÚÁÁÁÁÁÁÁÁÚ²ÎÜÈÈÈßßßß«««å«àààËËߣ‚ËËËËËËˬËàËà«Ëààà««««Ë«Ëàà¬ààààà¬àààà¬àààà¬à߫˫ÈßËËËàá¬àËÈÈÈÈÈÜܵÛÛÈܵÈÈÜܺ޺ÎÝÎÜÜÜÎκÎÎÎÀÁÁÏÁÁϹÁÏÚ†Ú†ÏÁÁÁÁÁÁÏÚ†Ú††ÚÁÏÁÁÁÁÁÁعØÐÐÐÐÐÄÄ…ÖĶօ……………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÐÐйÐÐÐÐÐÐÐÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÐÐØÁÁÚ²ÀÞÎÎÎÎÎÎÀÀÀÀÚÀÎÎÀÜɵÎÎÎÎÀÀÚ†Ú†ÚÚÚ†ÚÚÁÏÁÁÁÁÁÁ†ÚÎܵÈÈÈßßß««««ßËàË ¢¢¢¢ ‚àà¬àààà«àààà¬àà¬àବàà¬àà¬à¬à«à««ßßËàà¬á¬àËßÈÈȵÜÈÜÈ«ÜÜÈÈÛÈÎܺ޺ÎεµÜÜÎÎÎÜΆ†Ï†ÏÁÁÁÁÚ²Ú†ÚÁ†ÁÏÁÁÏÁ†Ú†ÏÏÁÁÁÏÁÁÁÁععÐÐÐÐÄąĶօ…Ö…Ö…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÐÐÐÐÐÐÐÐÐÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶……ÐÐØÁÁÚ†ÎÎÎÎÎÎÎÎÎÀÎÀÀÀÀÚÀµÉµÜÎÎÎÀÀÚ†Ú†Ú†Ú†ÚÚ†ÏÏÁÏÁÁ†²ÎεÈÈßßß«ßàà %%%%%%àËÔË m¬à¬àààààବ¬¬¬à¬¬¬àààààààà«ßààବ¬à«ÈÈÈäµµÈâÛµÜÈÛȵܺκκÜÈÛȵÜܵÜÎÀ††ÏÁÏÁÁÏÚÚ†ÚÁ††ÏÁÁÁÁÁÏÁÏÁÁÁÁÁÁÁÁÁÁÁÁØÐÐÐÐÐ…ÄÖ…Ö¶…ÖÂÖ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÐÐÐÐÐÄÄÐÄÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÐÐØÁÁÚÎÎÎÎÎÎÎÎÎÎÎÎÎÀÎÀÀÎÜɵÎÎÎÎÎÚÚ†Ú†ÚÁÚ†ÚÚ†ÏÚÁÁÁ†ÚÎÜܵÈÈßß߫˫3###/HËàà­´´ ¬¬¬¬à¬à¬àବ¬¬¬¬áᬬààà«Ëବáá¬àËßâßÈÈÈÈËßµÜÈßÛÈÜÜÎÜÎεÛÈÛȵµÈÜκچ†ÏÁÏÁÚÀ†Ú†ÚÁ†ÁÁÁÁÁÏÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ¹ØÐÐÐÄÄ…Ä………Ö…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÐÐÐÐÄÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÄÐÐÁÁ†ÀÎÎÎÎÎÎÎÎÎÎÎÎÎÀÎÀÚεȵÜÎÎÎÀÚÀ†Ú†Ú†Ú†ÚÚ†ÏÁÏÁÁÀÎεµÈÈßß««àà.#))(E8à¬àଫ««¯´ÈÛ´Ë ¬¬¬¬à¬¬¬¬¬¬àá¬à¬áààààà«à¬á¬ËË«ËßÈÈßËâµÈÈËȵÜÜÜÜÜÜÈËËÈÛÈÛȵÜÀ†Ú††ÏÁÏÀ†Ú†ÚÁ†ÁÁÁÁÁφÁÁÁÁÁÏÁÏÁÏÁÁÁÁØØÐÐÐÄÄÖÄ………Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÄÄÄÄÐÄÄÄÄÄÄ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶ÐÐÐÁÁ†ÀÎÎÎÎÎÎÎÎÎÎÎÎÎÀÎÀÎε۵µÜÎÀÀÚÀ†Ú†Ú†Ú†ÚÚ†ÚÁÚÚÀÎÎܵÈÈßßß«à¥')))4H5¬¬ààà«Ë߯ÈÈÈ´ƒ +«¬¬¬¬¬¬à¬àáà¬á¬¬áᬬàààବááàËààËßßËà«ÈÈâËßÈÜÜÜÜÜÈâËËËâ´ÛÈÜܺچÚÁÁÏÚÚÀ†Ú†Ú†ÁÁØØÁ†ÏÁØÁÁÁÁÁÁÁÁÏÁÁØÁÐÐÐÄÄ…¶…Ö…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÄÄÄÄÄÄÄÄ…ÖÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶ÐÐÐÁÁ†ÀÎÎÎÎÜÜεÎÎÎÎÎÎÎÎÎܵȵµÎÎÀÎÎÀÀ††Ú†ÚÚ†ÚÚφ†ÚÎεµÈÈÈ««àà5()))/HËàà¬à««ÛÈÈÈÛ ¡¬¬à¬¬á¬¬¬¬¬¬áà¬àààˬááàବààËËà«ÈßËËßÈÈÜÜÈäÈËàËËËâ«ÈÈÜÎÝÚ†ÚÁ†À²ÚÚ†Ú†ÁÁØÐÁÁÁÁÁÁØÁØÁÁÁÁÏÁÁÁÁÐÐÐÄÄ………Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÄÄÄÄÄÄÄÄÄÄ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÐÐÐØÁÁ†ÀÎÎÎÎÜÜÎÜÜÎÎÎÎÎÎÎÎε۵µÎÎÎÎÎÀÚÚ†Ú†ÚÚ†ÚÚÚÀÀÎÎÎÜÈÈßß«««))))BA«à¬¬à«Ë««´È´È¤ ¬¥ ¥¥¥¥­¥­¥È¥ßà¬à¬¬àବᬬààààˬááá¬à¬¬¬àËà¬ËßËàËËßÈäÈäÈÈààËËËËâÈÈÜÎÞ†Ú†ÚÀÚÎÚ†Ú††ÁÁÐÁØÁÚÁÁعØÁÁÁÁÁÁÁØØÐÐÐÄÖ……Ö………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÄÄÄÄÄÄÖÖ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶¶ÐÐÐÐÁÁ†ÀÎÎÎÎÎÜÎÜÜÎÎÎÎÎÎÎÎܵ۵µÜÎÎÎÎÎÚÀ†Ú†ÏÚ²ÚÀÎÀÎÎܵµÈÈßß*))))B$ବààà«ËËß´ß·à  ¬àà¬à¬ààବàà¬àà¬à¬àËàáááᬬ¬¬à¬àËËààËßÈÈÈÈÈËàààËËËßÈÈÜκچÚÀÚÎÚ†Ú†Ú†ÁÐÐÁÁÚÁÁØÁØÁØÁÁÁÁØØÐÐжą…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÄÄÄÄÄÄÄÄÄ…ÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÐÐÐÁÁÁÁÚÎÎÎÎÎÜÎܵÎÜÎÎÎÎÎÎεµµµÎÎÎÎÎÀ†À†Ú†ÚÚÀÞÀÎÎÎεµÈÈß««.''''B5«à¬à¬à«Ë«Ë˯Ë«¬ààà߃‚¡­¡‚Í««àááᬬà«à¬àà«ßÈÈÈÈßËàààËËâÈÈÜÎÞ†Ú†ÚÎÎÚÚ†Ú†ÁÁÐÁÁÚÚÁÁÁÁÁÐÁØÁØÐÐÐÐĶą…ÖÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÄÄÄÄÄÄÄÄÄÄ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶Ä½ÐйعÁÚÚÎÎÎÜÎܵÎÜÜÜÎÎÜÎÎÎÜܵɵÜÜÎÎÎΆÀ†Ú†ÚÚÀÎÎÎÎÔ ««Ë555555ßàବààË«ËË«ËÛ ¡­¡   £ + + + + + ¢¥ááá¬á¬áàà¬à¬àË«ßÈÈßËàËàËàËÈÛÈÜκÚÝÀÎÎÎÝÚ†††ÁÐÐÁÚ²†ÁÁÁÁعÐÐÐÐÐÐĶ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÄÄÄÄÄÄÄÄÄ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…½ÐÐÁعØÁÁÁÚÀÎÎÜÎܵܵܵÎÎÜÎÎÎÜܵȵµÜÎÎÎÎÎÀ†Ú†ÀÚÎÎÎÎ%'/'B È«à«àËËà¬à¬àà«ËË«â¯Ë£    ¡ + +  + ‚¬áá¬à¬à¬àËßßÈßËààËàËËßÈÈÜÎݺںÎÎÎΆچÁÁÐÁÚÀÚÁÏÁÏØÐÐÐÐÐж…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄÄÄÄÄÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÖ½ÐÐÁØÁÐØÁÏÚÎÎÎÜÎÜÜܵÜÜÜÎÎÎÎÎεµÈµµÜÎÎÎÎÎÀ†ÀÚÎÎÎÎÜ,))/H «ßàବàà«Ë«ËËËâÔ¬ à  k j  ߬ááᬬ¬¬àààËßßËààààËËßÛÈÈܺÎÎÎÎÜκ޲††ÁÐÁ†ÀΆÏÁÏÁÁÐÐнĶօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄÄÄÄÖ¶ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶ÕÐÁÁÁÁÁÐØÁÁÀÎÎÜÜÎܵܵµÜÎÎÎÎÎÎÜܵÈɵÜÎÎÎÎÎÞÀÎÎÎÎÎ-4-BAÈß«àààà¬à«ßßßßË´È‚‚‚‚‚‚ƒà¢Í¢ j áá¬à¬ààààË«ËàààËàËßÈÈäÜܺÜÜܵÜκچ†Á؆ÚÎÚ†ÏÁÁÁÐÐÐÐ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄÄÄÄÄ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÖÄÐÐØÁÁÁÁÐÁÁ†ÀÎÎÜÎÎܵܵµÜ°ÎÎÎÜεܵȵµÜÎÜÎÎÎÎÎÀÎÎÎ---J«ßßààà5%%%%%%*Ëâ´´´´´ËËËËËààà ¢ m j߬ବ¬ààààËàààààËßÈÈÈÈÜÜܵµÈÜÜÎÞ²††ØÁÚÎΆÚÁÏÁÁÐÐж……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶Ö…Ä…ÄÖ¶ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶Ä…ÐÐØÁÁÁعÐй†ÎÎÎÜܵÜɵܵܵÜÎÎÜÎÎܵ۵µÜÜÜÎÎÎÎÎÎÎÎ%---H5Èßßàààà.)))))#B$´ËâË´ËËËËËËËËଠÍ  + £ + + mj + ƒàବà¬àààà¬ààààËßßÈÈäÜÜÈÈÛȵܺÎ݆ÁÁÚºÎÚ†ÚÁÁÁ¹ÐÐÐÄ…ÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¶Ö…Ä…ÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÐÐØÁÁÁØÁ¹Ø¹ÁÀεµÜµµÉµÜµÜܵܰÎÜÎܵ۵µÜµÎÎÎÜܵÜÍ/)4)Aͥ߫ß«ààà'))())-H5ÈË´ËËËËËËËËËà¬ß +¥  +‡  + ¬à¬à¬à¬àବ¬àààßËÈÈÈÜÜÈÈÛßÈÜÜÎÎΆ††ÎÎÎÚ†ÏÁÁÁØÐÐÐÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÂÖÂÄ…Ä…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶ÄÐÐÐÐÐÁÁÁÁÁÁØÁÁÀÎܵܵµÉµµµµÎµÜ°ÎÎÎܵµÈµµÜܵܵܵÜ Èßßßßàà5))))))/HÍ«ËËË´Ë´Ë´ËËËËËm¢‡ + k ­à¬àààà¬àବààËßÈÈÈäÜÈÛËÈÈÜÎÎÎ݆†ÎÎÎΆÚÁÏÁÁÐÐÐÐÄ…ÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ…ÖÂÖÂÖ¶…¶ÄÐÐÐÐØØÁÁÁÁÁÁÁÁÀÎܵÜɵɵµµµÜ°Ü°ÎÎÎÜܵȵµµÜµµµµµÈÈÈÈÈÈßß«å«ßàààà))))))BA«ËËËËËËË´´´´ßË˃ ¢ +  + + «ààà¬àବà¬àËßÈßÈÜÈÈâËÈÈÜÜκކÎÎÜÎÎÀ†ÚÁÁعÐÐÐÄ…ÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÂÖ»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÐÐÐÐÐÁØÁÁÁÁÁÁÁ†ÀÎܵÜɵµµµµµÜ°ÜÎÎÎεܵȵȵÈÈÛÈÛÈÈÈÈßßß«å«å««àààà*))))))E$ËË«ËËËËâËâ«Ë´Ë« Í + + +  +ààà¬à¬¬àààßÈÈÈäÈßËâȵÜÜÜκÎܵÜκÀ†ÁÁÁÁÐÁØÐÄ…ÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶…ĶÄÐÐÐØÐÁØÁÁÁÁÁÁÁ†ÀÎÎܰܵܵɵÉÜÜÎÎÎÜεÜÉÈÛÈÈÛÈÛÈÛÈßßßß«å«å«««ààà&)))))-E5´«ËËËËËËË«ËËËËß   + ƒ m + àààବ¬àË«ßßÈÈÈËËßÈÜÜÜÜÎÎܵµÜÜΆچÏÁØÁØÁÐÄÄ…ÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖĶĶÄÐÐйÐÁØÁÁÁÁÁÁÁ†ÀÎÎܰÜɵµÛµÉÜÜÎÜÎÎÜÜܵÈÛÛ¯âÈËß˫߫ßß«å«å«Ëàà5()))))-E¥«â¥«m¢ m¢¡ k  ‚¥àବàààË«ßÈÈßËËËÈÜÜÜÜÜÜÈÛÛµÎÎÚ†ÚÁÁÁÁÁÐÐжą…ÂÂÂÂÂÂÂÂÂ…ÂÂ…ÂÂÂÂÂÂÂÂ…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄĶÄÄÄÐÐÐÐØØØÁÁ†ÁÚÁÁ†ÚÎÎÜÎܵÉÈȵµÎÜÎÜÎÜÎεÛÈ´â´ËËË«Ëßß«å«*.%**àà'''''''E«â¯%------'-/5«    ͬବàààËËßâËà«ßÈÈÈܵÈÈ´´ÈµÎº†Ú††Ï†ÚÁÐÐÄÄÐж……ÂÂÂÂÂÂ…ÂÄ…Ò…Â…Â……Ò…Ä…Ä…ÂÂÂÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ĶÄĶĶĽÐÐÐÐØÁÁÁÁ†ÚÁÏÁÚÀÎΰܵɵ۵µÜµÜµÎÜÜܵÛÈËËËËËË««ß««((##/.©àààà¦å ¦ååß߫˫&)))))))/H ´ ¢¢Í +‡k¤ m ¢¬¬¬à¬ààà«âËàà«ÈäÈÈÈÈÛËËËÛµÎÞ††ÚÁÚÚÁÁÐÄÐÐÐÐÄÖ……Â…ÂÖ…Ò¶…Ä…ÄÂ…ÄÒÄ…Ä…Ä…Ä…Â……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄĶÐĶĶÄÄÐÐÐÁØÁÁÁÁ†ÚÁ†Á†ÀÎܰܵ۵ɵµÜµÜµÎÎܵµÛËËËËË««««%((((EDËàààà«Ë«Ë«')))))))BAÈ«ààà«ß§¥§§  ‚k m + + + ¬à¬à¬ààËËààà«ÈÈÈÈÈÛËËËËȵÎÝÚ†ÚÚÎÀÁÐÐÐÐÐÐÐÄ……¿…Ö…¶Ö¶Ö¶…Ä…………¶ÖÄ…Ä…¶………Ö………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÐĶÐÄÄĶÄÐÐÐÐÁØÁÁÁÁÁ†ÁÚÁ†ÀÎܵµµÉµÉµµµµÜÜÜÎܵÈÛËË˫˫««ß.(((4H@«ààà«Ë«Ë()))))))B$««ààà«¥¨ß¦ß¢¡  + + + + + +¬à¬à¬àààà¬àßÈÈÈÈßËËàËÛÈÜÎÝÀÞÎÎβÁÐÐÐÐÐÐжֶ…Ä…Ö…¶Ö¶Ö¶…ÄÖ……Ö…………¶Ö¶Ö……Ö………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄֽжÐнĶÄÐÐÐйØÁÁÁ†Ï†Á†Ï†ÀÎܵܵµµÜµÉµµµÜÎܵÛÈ´ËËËà«¥'(((/J5Ëààà˫˫%)))))))4H««à«à««¥ß«¨ß§ ¢ ‡ + + + + + ¤¬à¬¬à¬à¬¬àà«ÈÈÈßËËàËËȵÜÎÎÎÎεΆÁÁÐÁ¹ÐÐÐÄ…Ö¶…¿…Ö……Ö¶ÖÄ…¶……………ÖÄÖ¶Ö¶ÖÄ…Ä…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…¶ÄÐжÄÄÐÐÄÄÐÐÐйÁÁÁ††Ï†Ï†ÁÚÀεµµÉµµµµÛµµÜܵµµÛÈË«Ëà«à«à«5-(((BJ¥àààËË&)))))))/JÈ߫૫«åߥ¦ß§«  + + + + + + àà¬à¬¬¬ËßÈÈÈâ«ËàËËÈÈܺÎÎܵÎÀÁÁØÁÁÁÐÐжֶֶ…ÖÂÂÖÂÖ¶Ö¶…Ö…Ä…ÄÄÖÄÖÄÖ¶ÖÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¶…ÄнÄÄÐÐÐÄÐÐÐÐÁÁÁÁÁ†Ï†Á†Á†ÚÀܵÜܵɵÈÛµµµÜµÛÈÛÈËË«ààË$#(((BAàààààààËË')))))))BA­ßÈߥååß娥¥¦¦«¥ +¡ + + + + + ¬àà¬à¬àËßßÈâ«ËàËËâȵÜÎܵµÎβ†ÏÏÁÁÁÐÐÄĶֶօ……ÖÂÖ¶Ö¶…Ö…ÄÖÄÄÖÄÄ…Ö¶Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂąĶÄÄÐÐÄÐÐÐÐйÐÁÁÁÁÁ††Ï†ÁÚÁ†ÚÀεÎܵɵÈÈÉܵµÉÛÈâ«Ëà«àà''&'.àààààà«))))))))E*Ëß *******%**$¨ P!6!6!!9" £ + + + + + ¬àà¬àË«ßâ«ËàËËËÈȵÜܵÉÜÜÎÀÚÚ†ÁÁÁÐÐĶֶօÒÂÂ…Ò…Ä…Ö¶Ö¶ÄÄÖÄÄÄÄÄÖÄ…Ö…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ąֶĶĽÐÐйÐйÁÁÁÁÁÁÁ†Á†ÁÚÁÁÚÀεεµÛµÛµÉµÉÈÛÈÈÈÍ à«ààËËËàààà©ààà%)))))))4J«ß444444444;H¥§È*000000003=C<12" + + + + + ¤¬à¬¬àËËË«ËËËàËßÈȵܵ۵µÎÎÚÀ²À†ÁØÐжֶօÖÂÂÂ…҅ĶֶÖÄÄÄÄÄÄÄÄÄÖÄ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶ÖąĶÄÄÐÐйÐÁØÁÁÁÁÁÁÁÁÁÁÁÚÁφÀεܵµÛµÛµÉµÛ¡¢ ‚à««ààààà¬à©©àà&)))))))-H ßß%444444444HGåÍÍ¥.7::::::777;;7:30<9" + + + + +£   ¬à¬¬ààà«àË«àËâßÈÈȵ۵ÜÎÎÞÎÎÀ†ÁØÐÐÄÄ…Ö¶Ö¶…Â…ÂօօĶÐÄÄÐÄÐÄÐÄÄÄ…Ö…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ĶÄжÄÐÐÐÐÁÁÁÁÁÁ†ÁÁÁ†ÁÁÁÁÁφÀεÜɵɵÉÈÛº ‚«à««àààà¬àà©©à'########A­ßÈ.444444444E5¥ B::::7:7:7:7:7;;7;:3C2 ‡ + + + + +  à¬ààààààËËàË«ßßÈÈÈÛÈÜÜÎÎÎÎβ†ÁÁÐж…Ä…Ö¶Ö……ÂÂÂÖ…ÄÄÐÄÐÐÐÐÐÐÄÐÄÄÄ…ÄÖ…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂ…ÂÂ……¶Ä¶Ä¶Ä¶ÐйÁÁÁÁÁφÁÁÁ†ÁÁÁÁÁφÀεµÉµÛµÉÈ««å«Ëààààà଩©à«       ¥«Ë:44444444;H­¢84:::::::::7:7777777;;9 + + + +‡ ¡àààààààààËËßßÈÈÈÛÈÜÜÎÎÎÜÎΆÁÁÐÐÐÄ……Ä…Ö…ÖÂÖÂÖ¶ÄÐÐÐÐйÐйÐÐÄÄÄ…Ä…ÄÂ…ÒÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…Â……Â……¶Ä¶ÄĶÄÐÐØ¹ØÐÁÁφ†ÁÁÁ†ÁÁÁÁÚ†ÀÎܵµµÉÈÉ¡ Í««ßËàà $$$$$$$8àààË««ß«444444444BD«¢$4::::::7:::::777777;:" ‡ + + + + + ààààààààË«ßÈÈÈÈÈÈÜÜÎܵÜβÚÁÁØÐжֶ…Ä…Ö…ÖÂÖ¶ÄÐÐййй¹ÐÐÐÄÄÄÄÄÖ…ÒÂ…Ò…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â…Â…ÂÂ…Â……¶Ä¶ÄĶÐÐÐÐÐÐÐÁÁÚ††Á†Á†ÁÁÁÁÚ†ÚÎܵµµÉÈ¢ ß˫߫«àààà$)))))#/*©ààààààË«àËË$444444444HGß¡ H4:::7:7:::7:7777777;0m + + + + +  ËààààààËâÈÈäÈÈÈÜÜÜܵÜÎÎÀÁÁØÐÐÐÖ¶Ö¶…Ä…Ä……ÄÄйÁÁÁÁعйÐÐÐÄÄÄÄÄ…Ä…ÒÂ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¶Ö……Ö…Ö………¶Ö¶¶ÄĽÐÐÐÄÐÐÁÁ†Ú†Á†Á†Á†ÁÁÁ†ÚÀÎܵµÝ +¡«ß«ß«ß«ààààà¬à.())))(H8àààààààà«àË.444444447H8Ë  + B7::::::7:7:7:777777;<k + + + + +  ßËààààààßÈäÈäµÜÜܵÈÜÜβ†ÁØØØÐ½¶Ö¶ÖÄ…Ä…ÄÄÐÐÁÁÁÏÁÏÁ¹¹Ð¹ÐÐÄÄÄÄÄÖ…Ä…ÖÂ…Ò…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………¶¶Ö¶Ö…Ö…Ö……ÖĶÐÄжÄÄÐÐÐÁÁ†Ï†††Á†Ï†ÁÁφÚÎÎܵßßßß«ßàà¬à¦/))))):H àààààààààààààË ,44444444/JÈ¢57::::::::::7:7777777;2mqx +¤ £ + + + ¡àËààààËßÈääÈÜÜܵȵÜꆆ†ÁÁ¹¹ÐÄ…Ö¶…Ä…ÄÐйÁÁÏÚÁÏÁÏÐÐÐÐÐÐÄÄÄÄÄÄÖ…ÄÂ………Ò…Ö…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………………Ö¶Ö¶¶…Ä…ÄÖ¶…ÄĽÐÐĶÄÐÐÐÁÁÁÁ†††††Ï†ÁÁÁ†ÚÎεÎÕÍÈßß«ßßßààà©54)))))/Hßààààààààààààà5-44444444BA« $4:::::::7:::7777777;:"kzrwp¤ +‡ + + + ¤ËàààËËßÈäÈÜÜܵäµÜꆆ†ÁÁÁÁÐжĶֶÖÐÐÐÁÁÏφÏÚÁÁ¹ÐÐÐÐÄÄÄÄÄ…Ä…ÄÖ…Ä…Ö¿¶Ä¶Ä…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÖÂÖ…¶Ö¶Ö½Ä…Ä…¶ÖÐ…ÐÄнÐĶÄÐ½ÐØÁÁ††Á†Á†††††Ú²ÀÎÎܵµÛÈâßßßßßßß«ààà¬à$))))))E*¬ààààààààààààà444444444HDâH4:::::7::7:77:77777;? +zwwrnk +‡ +  ßàààË«ßÈäÜÜÔµäµÜÎÎÞÀ†Ú†ÁÁÐÐÐÐ…Ö¶ÄÐÐÐÁÁÁÁÏÁÁÏÁÁÐÐÐÐÄÐÄÄÄÄÄ…Ä…ÄօĶÄÄÄÄÄÄ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Â…Ö…¶ÕÄĽннÐÄÐÐÐÐÐнĶÐÐÐÐÁÁÁ†Á†††††Ú††ÚºÀÎܵÈÈÈÈßßß«ßßßààà¬.))))))H8àààààààààà*444444444J5ߢ /4:::7:::::7:77777777Cpwww}wxj + k‚ààËàËßÈäÔÜäܵÜܺκÚÚ†ÏÁØÁнĽ¶ÐÐÐйÐÁÁÁÁÁÏÁÏÁ¹ÐÐÐÄÄÄÄÄÖ¶Ä…Ä…¿ÖÄÄÄÄÐÄÄÄÖ¶ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÂ……ÄÐÄսֽĽнÐÐÐÐÐÐÐнĶнÐÐÁÁÁ†Á†Á†††Ú†ÎÎκºÜµÈÈßßß«ßßßß«ààà/)))))4E«à§5555555 5¥àà¥/444444447EÈ ;::::::::7::::777777;9qr}ww}w~y ÍàààËßÈäÜäÈÜÜÜÜÎↆÚÁÁÁØÐÐÐÐÐÐÐÐ¹Ø¹ÐØÐÁØÁÏÁ¹ÐÐÐÄÄÄĶֶÖÄÄÄÄÄÐÐÐÐÐÐÐÄĶֶÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶¶ÄĽĽÐÐÐÐØÁÐØÐÐÐÐÐÐÐнÐÐÁÁÁ†††Á†††ÀÝκÎÎÜÜÈÈ­ßßßß‚à¬5A¥à/'/''/'/,5à '333333333E´$7:::::::7::7:7777777:" +vww}w}z~x¤àààËßÈÈäÈÜÜÜÜÜκÎÀ†Ú††ÁÁÁÁØÐÐÐÐÐÐÐÐÐÐÐйÁÁÁÐÐÐÄąąĶֶÄÄÐÄÐÐйÐÐÐÐÄÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…¶¶Ä½ÄÐÐÐÐÐÐØÐØÐÐÐÐÐÐÐнÐÐÁÁ††Ú††††ÝÎÎκÜÜÜÈÈÈß«ßß àààå        «*)))))))-E àà«ããã Ë‚ .;::::7::::7:7777777;?jww}w}zz~xtyàËËßÈÈ ÜÜäµµÜÎÎÚÀ†ÎÀÀ†ÚÁÁÁØÐÐÐÐÐÐÐÐÐÐÐÐйÐÐÄÄ…Ä…ÄÖÄÄÄÄÐÐйÁÏÁ¹¹ÐÐÐÄÄÖÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…օֶĽÐÐÐÐØÐÐØÁØÐÐÐÐÐÐÐÐÐÐØÁ††ÚÚ†††ÎÎÎÜÜܵäÈÈß«ßßÍ  à¬à¬àËà«àà«¥&4)))))#/AàààËË«ËàËß  + B4::::::7:7:::7777777Cpwww}w}z~xxt Ëàà«ËßÈäÈÈÈÈÜÜÎÎÎÎÎÎÀ†À†ÏÁعÐÐÐÐÐÐÐÐÐÐÐÁÐÐÐÐÄÄÄ…ÄÖÄÄÄÄÐйÏÁÏÁÏÁйÐÄÐÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶Ö…ÄÄÐÐÐÐØÐÐÐÐØÐÐÐÐÐÐØÐØÁÁ††Î²ÎºÎºÎÜÜÜÜÜÈÈßßß«ß + + ßàà¬àààà«à«Ë5/4))))))E$ààààààààà«à«ß¢;4:::::::7:::7:77777;9¤qr}ww}wz~xxx€yËàà«ßÈÈÈÈÈÜÜÜÎÎÎÎΆÚÀ†ÁÁعÐÐÐÐÐÐÐÐÐÐÐÐйÐÐÐÄÄ…Ö…ÄÄÐÐйÏÏÁÏÏÚÁÁ¹ÐÐÐÐÄ…Ä…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………ÖÕнÐÐÐÐÐÐÐÐÐÐÐÐÐÐØØÁØÁ††ÚºÎÎÎÎÎÜܵµµÈÈÈßßßß«¡  à¬ààààààà«à8:)))))))H$¬àààààààà««â@:4::::7::::7:7777777:" +xww}ww}z~~x€€t àààËßÈßÈÈÈäµµµÜÎβÀ††ÏÁØÐÐÐÐÐÐÐÐÐÐÐÐÐйÐÐÐÐÄ…Ä…ÄÐÐйÐÏÁÏÚÚÚÚÏÁ¹ÁÐÐÐÄÄÖÄÖÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ĶĶнÐнÐнÄÐÐÐÐÐÐÐØÁÁ††ÚÀÎÎÎÎÎÜܵÈÈÈÈÈÈßß««  àààààààààà«Ë*:)))))(-H ààààààààË«.4::::::7:7::7:77777;?jvwww}w}wz~xxxt{màààËßÈÈÈÈÈȵÜÜÎÎΆÚÁÁØÐ½ÐÐÐÐØÐÐÐÐÐÐййÐÐĶąÄÄÐйÏÁÏÚÀÀÀÀÚÏÏÁÃÐÐÐÐÄÄÄÄÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶…¶Ä¶¶…¶ÄÄ…¶ÄнÐÐØ¹ØÁ†ÚºÞÎÎÜÜÜÜܵÈÈÈÛßßß««Í¢àààààààààààà¦.4)())))/A¥àà 5555555555¥«¢ B4::::::::::7:7777777=¤oww}ww}wzzz~xx€t|m£¬ààËËßÈÈÈȵÜÜÎκ†ÚÁÁØÐÐнÐÐÁÐØÐØÐÐÐÐÐÐÐжÄÖ…ÖÄÄÐÐÐÁÏÀÀÎÎÀÀÀÏÏÁÁ¹Ð¹ÐÐÐÄÄĶÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂ………………ÄÐÐÄ………………¶Ä½ÐÐØÁ†ÚºÎÎÎÜÜܵܵÈÛÈâ«ß«ß«« àààààààààààË ,4)))))(EAàà¦&7////////B ¯  + ;:::::::7::7:7777777;1 +qwww}ww}wzz~xxx€t¬¬ààËßßÈÈÈÜÜÜÎÝÀ†††ÁØÐжÐÐØÐØÐØÐÐÐÐÐÐÐжą…Ò……ÐÐÐÁÏÀÎÎÎÎÎÀÀÏÏÏÁÁ¹ÐÐÐÐÄÄ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂÂ…Â…Ö…Ö…ÄÐÐÐнÐÖ¶………Ö…ÐÐÐÐÁÁ†ÎÎÎÎܵܵµÜÈÈâ«â«ß«« ¢ ààààààààààà5B)))))))E$¬à5/44444444BJ « Í  ¥«ß««ßßß$4:::::7::7::77777777:2 +xww}w}ww}zz~~xx€€€¬¬àËÈÈȵÜÔÎÎÀ†Ú†ÏÁÁÐÐнÐÐÐÐÐÐÐÐÐÐÐÐÄÄÖ¶…Â…ÄÄÐÐÁÏÀÎεµÎÎÀÀÚÏÏÁÏйÐÐÐÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â……¶¶…¶Ö…օĶÐÐÐÐÐÐнжÄÄ…¶Ä½ÐÐÐÁ†ÚÎÎÎÎÜܵäµÈ†žžžžØ«à«ààààààà«ààà$7)))))))E5àà744444444EG«‚‚‚¡ ¡ßH4:::::::7::7:777777;3mm vwww}w}wzzz~~xxx€€| á¬à«ßÈÈÈÈÜÜκβچÏÁØÐÐÐÐÐÐÐÐÐÐнжĶą…Â…ÄÄÐÐÁÏÀÎÎΰܵÎÎÀÀÚÁÏÁ¹ÐÐÐÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……օօօĶ¶Ä¶Ð½Ð½ÐÐØÐØÐÐÐĶÕĶÄÐÐÐØÁ†ÚÎÎÎÜÜÜܵÈȘ‰Õ««ààààààààËàà¬à'A¥à*/44444444J8«¢  B7:::::::::7:::77777;Cm£qzw}ww}w}}zzz~~xx€€ty‚á¬àË«ßßÈÈȵµÜÎΆÚÁÁÁÁÐÐÐÐÐÐÐÐÐÄÄ…Ä…Ä…Ö…ÄÖÄÐÐÁÚÀÎÎÎÎΰÎÎÎÎÀÏÏÁÁÐÐÐÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……օֶĶÐннÐÐÐÐÐÐØÐÐÐÐÄж…ĽÐÐÐÁ††²ÎÎÎÜܵäµÈÈŽ•›™ÔË«ààààààààà«à¬à          àà.444444447J5« 54:::::7::7::7:7777777I qwww}ww}wzzzz~~xx€€€{m̬à¬àààËËË«ÛȵµÎÎÀÀÚÁÁØÐÐÐÐÐж¶¶Ä…Ä…Ä…Ä…ÄÄÐÐÐÁÚÀÎÎÎÎÎÎÎÎÎÎÎÚÏÁÏÐÐÐÐÄÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…Ö¶ÐнннÐÐÐÐÐÐÐÐÐнÖÄąĽÐÐØÁ†ÚÎÎεÜܵäÈÞŽŒ˜È«àà©à©‚ àààààààâËàà/44444444BJ Í 84::::::7:::7:7:777777U¢nww}w}ww}wzzz~~xx€€€tÈàà¬à¬¬àààËËßÛÈÜÎβ†ÁÁÁØÐ½Ð¶½¶Ö¶Ö…Ä…Ä…Ä…ÄÐÐйÁÚÀÎÎÎÎÎÎÎÎÎÎÎÀÏÏÁ¹ÐÐÐÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ҅ĶжÐÐÐннÐÐÐÐÐÐнÄÖ¶……Ä½Ð½ÐØÁÁ†ÚÎÎܵµÈÈÛÅŽŒŒ‰Ë«ààà©©à¬à¬à¬ààààààààààB44444444EDA7:::7::::::::777777;3mxwww}w}w}zzz~~~xx€€€t Ëà¬à¬à¬ààËà«ÛȵµÜÎΆÁÁÐÐж…Ö…Ö¶……¶…¶…Ä…ÄÐÐйÁÚÀÎÎÎÎÎÀÀÀÀÀÀÀÚÏÁÁÐÐÐÄÄÄÖ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ĶÐÄнÐÐÐÐÖ½¶Ð½Ð½Ä………Â……Ö…ÐÐØØÁ††ÎÎÜÜÈÛÈÈ””‰Õ«ß««à©à©à©k ­à¬àà¬ààààààààà%;44444444H@ +¥B/:::::7:7:7:7:77777;0m qzw}ww}w}wzzzz~~xx€€€t¡ààà¬ààààààËËÈÈȵÎΆÁÁÐÐж………Ö………¶…¶…¶…ÄÐÐÐÁÏÚÀÎÎÎÎÎÀÀÀÚÀÀÚÚÏÁÁÐÐÐÐÄÄĶÖÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÄÕÄÕĽÐͶֶÖֽąÂÂÂÂÂ……¶ÐÐØÁÁ†††ÎÜܵÈÛ¯ŒŒŒ›Èâ««àààà©à©à à¬ààààà¬ààààààà.;4444444:H5«£¢ 4:::::7:::::::777777;I¢qwww}ww}wzzzz~~~xx€€€€UËààààààà˫˫ÈÈÜκ†ÁÁÐн¶……Ä…¶Ö¶Ö…ÄÖ…ÖÄÐÐÐÁÏÚÀÎÎÎÎÎÎÀÚÚÚÚÚÚÏÁϹÐÐÐÄÐÄÄĶօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ąĶÖÄ…¶Ö¶Ä……ÂÂÂÂÂÂÂ…ÄÐÐÐØÁ††ÎÎܵÛÈßËÕÅÕÕÝË˫૩à©à§¢kàààà¬ààààààààààB:4444444;H¦ 84:::::::7::7:7:7777779 vww}w}wwzzzz~~~xxx€€€{mÔË˫˫Ëß˫˫ÛȵÎΆÁÁн½Ä……Ä…Ä…¶Ö¶Ö¶ÄĶÐйÁÏÚÀÎÎÎÎÎÎÀÀÚÏÏÚÏÏÏÁÁ¹ÐÐÐÐÄÐÄÄÄÄÖ……Â…ÂÂÂÂ…ÂÂ…Â…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ĶжÖÄ…ÄÖ¶Ä…ÂÂÂ×ÂÂÂ……ÐÐÐØØ††ºÎܵÈßËËËàËà«Ë«àËà©à©  +¬à¬àààààà¬ààààB44444444BD A7:::::7::7::7:777777:mm xwww}w}w}zzzz~~xx€€€t +ßßßâ«ßßßßËßÈÈȵÎÀÚÁØÐÐĽĶ…Ä…Ä…¶Ö¶Ö¶ÐÐÐÁÁÏÚÀÀÎÎÎÎÎÀÀÚÏÏÏÏÏÏÏÏÁ¹¹ÐÐÐÐÐÄÐÄÄÄÄÄÄÄÄÄ…Ä…Ä…ÄÄĶÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………օĶÖÄ…¶Ö½¶…»…ÖÐнØÁÁ††ÎÜÜÈÈâËËàËààà«à«à«àà©k ­àààààààààààà¬à$;44444444H@ 4:::::7::7:7::77777770 szw}ww}wz}zzz~~~xxx{€tyßÛßÈßÈßÈ«««ßȵܺ††ÁÐÐÄÄąж…Ä…Ä…¶ÕÐÐÐÐÁÁÏÚÀÀÎÎÎÎÎÀÀÚÚÏÏÏÏÏÏÏÏÏÁϹ¹ÐÐÐÐÐÐÐÄÄÄÄÄÐÄÄÄÄÄÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………Ľ…Ö…¶Ä…ÖÂÂ×¶ÐÐÐØÁ††ÚºÜµÈÈËËËàààààà«à«ßà© «­   Í  ­­­­àà¬&333(3(3(3H5‡ 4:::::::7::::7777777;I qwww}ww}wzzz~~~~xx€€€€ÈÈÈÈÈßÈ«â«ßÈÈÈܺ†ØÊÐнжĶж…Ä…ÄÕÄÐÐÐÁÁÏÁÏÚÀÎÎÎÎÀÀÚÚÏÏÁÏÏÏÏÏÏÏÏÁÏÁ¹Ð¹ÐÐÐÐÄÐÄÐÐÐÐÐÐÐÐÐÐÐÐÐÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶………Äж…ÂÂÂÂ…ÄÐ½ÐØØ†ÀºÎÜÈÈÛËËàËàààààààßßßßßßßßàË k ‡ +¢­àॠl 84:::::7::7:7::77777779muww}w}wwzzzz~~~xxx€€€{mÍÈÈÈÈÈÈßÈ«ÈÈÈÈܵº††ÁØÐÐÐнжж…Ð…ÐÐÐÐйÁÁφÀÀÀÎÀÀÀÀÚÏÁÏÁÁÏÏÏÏÏÏÏÏÁÏÁ¹Ð¹ÐÐÐÐÐÐйййй¹¹¹¹ÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂ………Â……¶¶Ö……ÂÂ……ÐÐÐØØÁ††ÎܵÈÈËËËËààààààààÈ™ßॠk Ë «à¬¬¬¬àË««« D:::::::::::::777777;3xwww}w}zzzzzz~~xxx€€t ÈÈÈÈÈÈÈÈÈßÈÈÈÜÜκ†ÁÁÁعÐÐÐÐÐÐÐнÐÐÐØÐÁØÁÁ†ÏÚÀÎÀÎÀÚÏÏÏÁÁÏÁÁÏÏÏÏÏÏÁÏÁÁÃÁйÐйй¹ØÁÏÁÁÏÁÏÏÏÏÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÂÂֶнÖÂ……ÄÄÐÐÐÁ؆†ÎÜܵÈßËËËàààààààààÕ•›‰ß¥¥¥    Í «« à¬àààà­.7::::::7:7:7::77777;= szw}ww}wzzzzz~~~xxx{€tyÛÈÈÈÈÈÈÈÈÈÈȵÜκΆ†ÁÁØÁÐÐÐÐÐÐÐÐÐÐØÐÁعÁÏÁÏÚÀÀÀÀÚÀÚÁÏÁÏÁÁÐÁÁÏÏÏÏÏÏÏÏÏÁÁ¹¹Ð¹ÐϹÏÁÏÁÏÏÏÏÚÀÚÏÚÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂ……ÂÂÂÂÖÐÄ………Ä…ÐÐØÐØÁ††ÎܵÈÈËËËààààààààààà‰ŒŒ›˜à©à«à««  ààà¬ààà  Í4::::::::7::::7777777<qwww}ww}wzzz~~~~xx€€€€ÛÈÈÈÈÈÈÈÈßÈÈȵܺº†††ÁÁÁÁØÁØÁÁÁÁØÁØÁØÁÁÏÁÁÚÚÚÀÀÚÀÚÏÏÁÏÁÏйÐÁÁÏÏÏÏÏÏÏÁÏÁÁÁÁÁÏÁÏÁÏÏÚÚÀÀÀÀÀÀÀÀÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂ……ÂÂÂÂÂ…………Ö¶…ÐÐÐØÁØÁ††ÎܵÈÈËËàËàବàà¬àଘ›ŒŒŒ•Ÿ«àààà«à + ¬àà¬à  4:::::7:7::7:7:7777776vww}w}w}zzzzz~~xxx€€€{ÍÈßÈÈÈÈÈÈÈÈßÈÈȵÜÎÎↆ††ÁÁ†ÁÁ†Á†Á†ÁÁÏÁ†ÏÚÏÚÀÚÚ†ÚÏÁÁÁ¹¹Ð¹Ð¹¹ÏÁÏÏÏÏÏÏÏÏÏÁÏÏÏÚÚÀÀÀÀÀÀÀÎÎÎÎÎÀÀÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂ……ÂÂÂÂ…………ÂÖ¶½ÐØØØÁ††ÀºÜÜÈÈßËËàààààààà¬àߎŒŒŒÊààËàË  ¥àà¬ààm¢D::::::::::7::777777;:xwww}w}wzzzz~~~xxx€€€|m¤ÈßÈÈÈÈÈÈÈÈßÈßÈÈȵÜÎÎÀÀÀÀÚÚÚÚÀÚ†Ú††Á†Ú†ÚÚ†ÚÚ†ÚÀÚÚÁÁÏÁÐÐййÐÐÏÏÏÏÏÏÚÚÀÚÏÏÚÚÀÀÎÎÎÎÎÎÎÎÎÎÎÎÎÀÀÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂ……Â……ÂÂ…ÂÂÂ…Â…ÂÂ…½ÐÐØØÁ؆†ÝÎÜÜÈÈÛß«Ëààààààà¬Ê”ŒŒŒ‰Ôß«àààËË + à¡‚‚¤ E7::::::7:7:7:77777770 +szw}ww}wzzzz~~~~xxx€€ty¢ßÈßÈÈÈÈÈÈßÈßÈßÈȵܵÎÎÎÎÀÀÎÎÎκچ†††Á†Á†ÚÚÚÏÚ†Ú†ÏÏÁÁййÐÐй¹ÁÁÏÏÏÏÚÀÚÀÚÀÀÀÎÎεµµÜÎÎÎÎÎÎÎÎÀÀÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂÂ…Â…ÂÂ…ÂÂÂÂÂ……ÂÂÂÂÖÐÐÁØØÁ††ÎºÜÜÈÈÈËß«ËààààààŒŒŒŒŒ˜ß«««ààËËË  +‚à m¥¡ + + + ‚ 4:::::7::::::7:777777C qw}w}ww}zzzz~~~xxx€€€€ËÈÈÈÈäµäÈÈßÈßÈÈÈȵµÜÜÎÎÎÎÎÎÎÎΆچ†Á†Á†Ï†ÚÚÏÁÏÁÏÁÁÁййÐÐÐÐÐйÏÁÏÏÏÏÀÀÀÀÀÀÎÎÎεµµµÜÎÎÎÎÎÎÀÎÀÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂ……Â……Â……ÂÂ……Â…ÂÂÂ…ÐÐÐÁ†††ÎºÜܵäÈßß«ßàààààààšŒŒŒŒŒžßß«««««à«ËËËj +   «¥¥¥¥¥¥­ ¥    84::::::::7:7:7777777;Fvww}w}wz}zz~z~~xxx€€€{ß«ßßÈÈÈÈÈÈÈÈÈÈÈÈÈȵµµÜµÜµÜÜÜÎΆ†††ÁÁ†ÁÚφφÏÁÏÁÁÁϹÐÐÐÐÐÐÐйÐÁÏÁÏÏÚÏÀÀÀÀÀÀÎÎÎεÎÎÎÎÎÎÎÀÀÀÀÚÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂÂ…Â…Â……Â…ÂÂ…Â…Â…………¶ÐÐØÁ†ÎÎÎܵäÈÈâßßßßßßààààÈãÔ Ôäßßßß««å«à«Ëâ«  ß È¢¢¢¢ +  8::::::7:7:::7:777777:K¡xwww}w}wzzzz~~~xxx€€€| àà«««ßÈÈÈÈÈÈȵ۵µµÜµÜµÜÎÎÎÚ††ÁÁÁÁÁÁÁÁÏÏÁÏÁÏÁÁ¹ÐÐÐÐÐÐÐÐÐйÐÁÏÁÏÏÏÚÚÚÀÀÀÀÎÎÎÎÎÎÎÎÎÎÀÀÀÀÚÚÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂ……Â…ÂÂ…Â…………Â…Â………ÐÐÐØ†††ÎÜÜäÈÈÈÈÕ™ŽŽŽŸààààà«««ß«ß«ß««Ë«ß«ß«ß«¡  +‚00000003377777777777:k ‚zw}ww}w}zzzz~~xxx€€€ty à«««ß«È¯Ë´´´ÛÛÛÛÈɵµµµÜÎÎÎÚÁÏÁÁÁÁÁÁÏÁÁÏÁÁÁÁÐÐÐÐÐÐÐÐÐÄййÐÁÏÁÏÁÏÏÚÚÚÀÀÀÎÎÎÎÎÎÎÎÀÀÀÚÚÏÁÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂ…ÂÂ…Â……Â…Â…Â……ÂÂÂ…нÐÁ؆†ÎÎܵÜÈÈÈ™›Øàààà«««ß«ß«ßß««ß«ß«ß« « Í m + !!696=3:7;7770qwzw}ww}wzzz~~~~xx€€€€««ß««ËË«ËËËËË´ÛÛÈÛȵµÜÎÎÀ†ÚÁÁÁÁÁÁÁÁÁÁÁ¹¹Ð¹ÐÐÐÐÐÐÐÐÐÐÐййÐÁÁÁÏÁÏÏÏÏÚÚÀÀÎÎÎÎÀÀÀÀÀÚÚÏÏÁÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………Â…ÂÂÂÂÂ……Â…Â…ÂÂ…ÐÐÐØ†††ÝÎÔÜÈÈÈ䌛ŽÈààà««ß«««ßßßßßßßßß«ßÔ¥¢  £ ‚‚¢K61=4;7Fuww}w}w}}zzz~~~xxx€€€{à««««««ËËËËË´´âËÛÛȵµÜÜÎÎÎÚ†ÚÁÁÁØÁÁÁÁйÐййÐÐÄÐÐÐÄÐÄÐÐйййùÏÁÁÏÏÏÏÀÀÀÀÀÀÀÀÀÀÚÚÚÏÁÏ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â……Â……Â…ÂÂÂÂÂ…………ÂÂ…¶Ð½ÐÁÁ††ÎºÜÜÈÈȆŒŒ›˜ààààË«««Ý™«ß«ËßËßËâËßââß« ¢ ‡ +!C3Kxwzw}w}wzzz~~~xxxx€€€| ß««««««ËËËËËË´´ÛÈÈɵµÜÎÎÎÀ†ÚÁÁÁÁÁÁÁÁعйÐйÐÐÐÐÐÄÄÄÄÐÄÐÄÄÐÐÐйÁ¹ÏÁÁÏÏÏÚÚÀÀÀÀÀÀÀÀÚÚÏÏÏÁÄÖ…………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö………Â…ÂÂÂÂÂ…ÂÂ………………ÐÐÁ؆†ÝÎÜÜÈÈÈÈŸŒŒ•ž«ààààË«««Ë››™ßßß««ß«ßßßßßßßß ¢ + K + +szww}w}wz}zzz~~xxx€€€t ß«««««««««««ËËËË´ËÛÈÛµµµÜÎÎÎÎÀÚ†ÚÁÁÁÁÁÁÁÁØÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÐййÃÁÁÏÏÏÀÚÀÀÀÚÀÀÚÚÚÏÁÁÏÖ¶Ö…Ö……………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä…Ö………Â…ÂÂÂÂ…Â…ÂÖ………Ð½ÐØÁ††ÚºÎܵÈÈÈŽŒŒŒ›Êààà«««Ë««™›ŒŒ›ßßßßß«ßßßßßßßßß  ¢¢j¢swwzw}w}}zzz~~~xxx€€€€‚߫߫«««Ë«ËËËËËË´´ÛµÉܵÎÎÎÎÀÚÀÚ†ÏÁÁÏÁÁØÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐйй¹ÏÁÏÏÏÀÚÀÚÀÚÀÀÚÚÏÏÁÁÄÖ…Ö¶ÖÄÖÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÄÄ…Ö…Â…ÂÂÂÂ…Â…Â……Ä…ÄÐÐØØÁ†††ÎºÜäÈÈÈšššššÈà«««««««Ë«ß‰ŒŒŒŒ•ÕßßßßßßßßßßßßÈß­¢ ä  +‚¢vwww}w}w}wzz~~xxxx€€€{l«ß«ß««àËËËËË´ËÛȵµÉµÎÎÎÎÀÚ††ÏÁÁÁÁÁØÁÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐйй¹ÏÁÏÏÏÚÚÏÚÚÚÚÚÚÏÏÏÁÖ¶Ö¶Ö¶Ö¶ÖÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄ……………ÂÂÂÂ…Â…ÂÄ…ÄÕÐÐØÁ††ÚºÝÎܵäÈ­Í ¥ß«ß«àË«««««Ë«ËÝŒŒŒŒŒäÈßßßßßßßßß­ßßßjk ¡ vwwzw}w}w}}z~~xxx€€€€| È߫߫««««Ë«ËËËË´ËÛÛȵɵܰÎÎÎÀÚÚÚÁÁÁÁÁÁÁÐÐÐÐÐÄÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÁÏÁÏÏÏÏÏÏÏÚÚÚÏÏÏÏÏÄÖ¶Ö¶Ö¶ÄÄÄÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄÄÄ……ÂÂÂÂ…Â…Â……ÄÕнÐÁ؆††ÝºÜÜÈÈÈÈßßßßß««ËËß«««Ë«Ë«Å›ŒŒŒŒŒ›™ßÈßßßßßßßßßߥßß‚j¢k svwww}w}w}wzz~~xx€€€€ty ßßßß««««««««Ë«ËÈÛÈÛÈ۵ɵɰÜÎÎÀÚ†ÏÁÁÁÁÁÁØÐÐÐÐÐÄÐÄÄÄÄÄÄÄÄÄÄÄÖÄÄÖÄÄÄÄÄÄÄÄÄÐĹ¹¹ÏÁÏÏÏÏÏÏÏÏÏÏÏÏÏÏÖ¶Ö¶Ö¶ÄÄÄÄÄÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÒ…ÄÄÄÄÄÄÄ……ÂÂÂ…Â……ÄÐÐ½ÐØØ†††ÎÎÎÜÈÈÈÈÈßßßßßß«åË««««Ë«Ë«Ë˜ŒŒŒŒŒ›žÈßßßßßßßߥߥßßß Í  svwwwzw}w}}z~xx€x€€€€y«ßßßß«««««««ßÈÈÈÈÈÈÈ۵ɵµÜÎÎÎÀÚ†ÏÁÁÁÁÁØÐ¹ÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÖ…ÖÄÂÖ¶Ö…ÖÄÄÄÄÄÄÄÄÐй¹ÏÁÏÏÏÏÏÏÏÏÏÏÏÏÏ…Ö¶Ö¶ÖÄÄÄÄÄ…Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â…Â…Â………ÄÄÄÄ…Ä……Â…………………ÄÐÐØÁ†††ÎÎÎܵÈÈÈßßßß߫߫å«ß««ß«ß«ßâ«Ëß›ŒŒŒŒŒŒÊÈÈßßßßßßßßßßßߥ +m¥  +¡¢ ‚uzww}w}w}z~xx€€€€€{l ßßß߫߫߫߫ßßÈÈÈȵȵµµÉµÜµÎÎÎÎÚ†ÚÁÁÁØÁØÁÐÐÐÐÐÐÄÄÄÄÄÄ…Ä…ÖÄ…Ä…ÒÄÄÖ¶Ö¶ÖÄÖÄÄÄÄÄÄÐй¹ÏÁÁÁ¹ÁÁÏÏÏÏÏÏÏÖ¶Ö¶Ö¶ÄÄÄÄÄÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ö………ÂÂ…Â……ÄÄÄÄÄ…Ä……Â………Ö…ÄÄÐÐØÁ††ÀºÎÜÜÈÈÈßÈßßßß߫߫å«ßßßßßßßßßâ«ÈŒŒŒŒŒŒ Èßž›››››››››˜ß Íj¢m uvwwzw}}z~xx€€€€€|l ßß«ßß««ß«ß«ß«ÈÈÈȵµÜÜÜÜÜܰÎÎÎÎÀ†ÚÁÁÁÁÁØÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÖÄ…Ö……ĿҿҿÒÄ…¿ÖÄÄÄÄÄÄÐÐййù¹¹ÏÏÏÏÏÏÏ…Ö¶Ö¶ÄÄÄÄÄÖ¶Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä…Ö¶Ö¶…………ĶÄÄÄÄ…Ä………Ö……Ö¶Ö½ÐØÁ†††ÎÜܵµÈÈÈßÈßß««ß«ßßßÔ›››››Øß«â« ÜÜÔÝÊÍÍÈÈȘ•ŒŒŒŒŒ›×¥¥Í  + + ‚‚vww}w}z~xx€€€€t¢«ß߫߫߫߫߫ÈÈÈȵÜÜÎÜÎÜÎÎÎÎÎÎÎÀÚÁÁÁÁÁØÐÐÐÐÐÐÄÄÄÄÄÄÄÄ…Ö¶ÖÄÂÂÂÒÒÒÒÒÒÒÒÒÄ…¿ÒÄÄÄÄÄÄÄÐÐÐÐÐÐÐйÏÁÁÏÁÏÖ¶Ö¶ÄÄÄÄÄÄÄÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÄÖ¶Ö…Ö………………Ä…ÐÐÐÄÄÄ……Â……Ä…ÄÖ¶ÕÐØÁÁ†ÎÎÜܵÈÈßßß«ßß«ßßßßß«ŸŒŒäÈß«âËË«â«ßÈÈÈßÈ™ŒŒŒŒŒŒ•Ôßßßåßßß߫߫«  + ‚uzw}wzzxx€€€€ty ‚å««å«««««ß«ÈÈÈÜÜÎÎÎÎÎÎÎÎÎÎÎÀÚ†ÏÁÁÁØÐØÐÐÐÐÄÄÄÄÄÄÄÄ…ÄÄÖ¶Ö…ÒÖÒÒÒÒÒÒÒÒÒÒÄ…Ä…ÄÄÄÄÄÄÄÄÐÐÐÐÐÐйùÁÁÁ…Ö¶ÖÄÄÄÄÄÄĶօ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………¶ÖÄ…ÐÖÄÖÖÖÖ……………ĶÐÐÐÐÄÄ……………Ö…ÄÖÐÐØÁ†ÚºÎܵÈÈ߫߫ßß«ßßßß߫ߌŒŒŒ˜Èßß߫߫â«âÈÈÈÈßÝ•ŒŒŒŒŒŒŒ™­ßå«åßßßßß߫߫ß  ¡  £ ¢‚uzw}z~~xx€€€{m +«å«««««¯ÈȵµµÜÎÎÎÎÎÎÎÀÚÚÏÁÁÁعØÐÐÐнÄÄÄÄÄ…ÄÖÄÖÄ…Ö¶ÒÄÒÒÒÒÒÒÒÒÒÒÒÒÄ…¿¿ÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐйÐÁÁ…ÄÖ¶ÄÄÄÄÄÄÄÖ¶…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÖ………ÄĽÄÐÄÐÄÄÄÄÖÄ…………ÄÄÐÐÐÐÄÄ…Ö…Ö…Ä…ÄÕÐÁ†Ú²ÎÜÜÈÈÈËËËË««ßßßßßßß«™ŒŒŒŒ›žßÈÈßÈ«ÈßÈßÈÈÈßÈŸ›ŒŒŒŒŒŒŒßß«å«ßßßßßš  + ¡¡szwz~~xx€€€| ¥àËËß´ÛÛÈɵÜÎÎÎÀÀÚ†ÚÏÁÁÁØÁعÐÐÐÐÄÄÄÄÄÄÄ…ÄÖ¶ÖÄ…Ò¶ÒÒÒÒÒÒÒÒÒÒÒÒÒÒ¿…¿Ò¿ÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐ…Ö¶ÖÄÄÄÄÄÄÄ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÖÄ…ÄÐÐÐÐÐÐÐÐÐÐÐÐÄÖ……ÖÄÐÐÐÐÐ…ÄֶֶօąĽØÁ†ÎÎܵÈÈßË«à«à««ß«ßß߫ߌŒŒŒ›ØÈÈÈÈßÈßÈßÈßÈßÈߘŒŒŒŒŒŒ›Ÿßßßßå«ßß߫߫«ÔšŠŠŠŠŠŠŠŠŠ‹ˆ‘ + ¢ ¢szz~~xx€€t à««««ËȯÛÈÛȵÜÎÎÎÎÀÀÚÚÏÁÁÁÁÁÁÁÐÐÐжÄÄÄÄÄĶÄÖ¶Ö¶ÖÄ…¿ÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÄ…ÄÒ¿ÖÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐ…ÖÖÄÄÄÄÄÄÄÖÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÄÖÄ…ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÖ¶ÄÐÐÐÐÄÄ……ֶֶֶĽÐÐÁ†ÎεÈÈâËËàËà«àß«ßß«ßßÕŒŒŒŒŽ ÈÈÈßÈÈÈßÈÈÈÈÈßÈŽŒŒŒŒŒŒ›Ýßßßßßßßßßßßßßß¡¡‚‚‚ÈŽ‰‰Ž‰Ž™™Ž›Š‘ + ¢ ¢ j qzz~xx€€€yk‚àà««Ë߯ÛÈÛÈɵÜÎÎÎÎÀÚ†ÚÁÁÁÁÁÁØÐÁÐÐÐÄÄÄÄÄÄ…ÄÄÄÖ¶Ö¶ÂÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒ¿…Ä…ÄÒ¿ÒÄÖÄÖÄÄÄÄÄÄÐÐÐ……Ä…ÄÄÄÄÄÄÄ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄ…ÄÖÐÕÄÄÐÐÐÐÐÐÐйÐÐÐж…ÄÐÐÐÐÐÐÄÄÖ¶ÖÄÖ¶ÖÄÄÐÐÁ†ÎÎÜÈÈßËËËàËà««ßßß߫ߚŒŒŒŒ›˜ÈßÈÈÈÈÈÈÈÈÈÈÈßÈÝ•ŒŒŒŒŒŒŽ ßßŽŽŽŽŽŽŽŽŽ™™ßËß««ßßßßßßßßß׉މ‰‰Ž‰‰‰‰ŽŽ™™™ŽŽ‹  ‡ + ¢ j¢ q~~xxx€{kkààààà««ËË«Ë˴ȵµÎÎÎÀÚÀÚÏÚÁÁÁÁعØÐÐÐÐÄ…ÄÄÄ…ÄÄÄÖ¶Ö¶ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÄÒÄÒ¶Ò¶Ò¶Ò…ÖÄÄÄÄÄÐ…Ä…ÄÄÄÄÄÄÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂĽнÐÐÐÐÐÐÐÐÐйØÁÐÐÐÐÄÐÐÐÐÐÐÐÐ…¶Ö¶ÄÄ…ÄÄ½ÐØ†ÀÎεÈÈâ«Ë«Ô ÍÍßßß«ß«ÊšššššÊßßßßßÈÈÈÈÈÈÈÈÈßÅ›ŒŒŒŒŒŒŒ˜ßÈÍ•›››››››••‰ß¥ £‡ + + + + +Í•‰‰‰‰Ž‰‰Ž‰‰Ž‰ŽŽŽŽŽŽŽŽ¡ + + j ¢ ¢jj + q~xx€€|k ß੬àààà«àËËËËËËÛµÜÎÎÎÚÚ†ÏÏÁÁÁعØÐÐÐÐÄÄÄ…Ä…ÄÄÄÖ¶Ö¶Ö…ÂÖ¿ÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒ¿ÒÒÒÂÒÂÒÂÒÂÄÖÄÄÄÄÖ…ÄÖÄÄÄÄÄÄÄ…ÄÂÂÂÂÂÂÂÂÂÂÂÂÄÂÂÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÐÐÐÐÐØ¹ÐÐÐÐÄÖ¶ÖÄÄ…ÄÐÐÐÁ†ÎÎܵÈÈßËàƒ  ¥ß«ß«ß«à«Ë«ßÈÈÈÈÈÈÈÈßßߘŒŒŒŒŒŒŒŒ›ŸÈߟ•™¬mÍ™‰‰‰Ž‰‰‰‰‰‰Ž‰Ž‰ŽŽŽŽŽŽ‰¢l k ¢¢ ¢ +£o~xxt¤ à¬Ë«ËàËààààËË´ÈÉÜÎÎÎÀÚÏÁÁÏÁÁعØÐÐÐÄÄÄÄÄÄÄÄÄ…ÖÄÖ¶ÖÄÒ¿ÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÒÂÖ…Ä…ÄÂÖ…ÄÄÄÄÄÄÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÁÁÁÁÐÐÐÁÐÐÐØÐÐÄ…Ä…ÄÄÐÐÐØÁںεµÈâËË«£ ߫߫嫫«àà«à«â«ÈÈÈÈÈÈÈÈÈßÈ™ŒŒŒŒŒŒŒŒ›Üßߘ•ŒŒŒŒŒŒŒ•Ç«j݉‰‰‰Ž‰‰Ž‰‰‰‰ŽŽŽŽŽŽŽŽ›j + ¢¢ ¢ ¢ +  +|x€tp +¡«««««««ËËËËËË´ÛȵµµÎÎÀÚÚÏÏÁÏÁÁÐÐÐÐÐÄÄÄÄ…ÄÄÄÄÄÄÖ¶Ö¶Ö¶Ö¿Ò¿ÖÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÒÂÒÂÄ…Â…ÄÖÄÄÄÄÄÄÄÖÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÂÖÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÐÐÐØÐÁÐÐÐÄ……ÄÄÄ½ÐØÁ†ÚÎÎÜÈÈËËà ‚ß߫߫«àà«Ë«Ê×××××ןÜßßßÍÊÊÊÊÍÊÊÊÝÈÈÈŽŒŒŒŒŒŒŒ•Ð ؉‰‰Ž‰Ž‰‰‰ŽŽ‰‰ŽŽŽŽŽŽŽ„ mk  ¢ ¢ + k€x{ +«««ß«ßË«ËËË´ÛÛÈɵµÜµÎÎÀÚÚÏÚÁÁÁÁÐÐÐÐÄÄÄ…ÄÄÄÄÄÄÖÄÖ¶Ö¶ÖÂÖÂÖÂÖ…ÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÒÂÒ…ÖÂÂ…ÄÄÄÄÄÄÄÄÄ…ÂÂÂÂ҅¶ÄÐÐÐÐÐÐÐÐÐÐÐÐÐÁÁÁÁÏÁÁÁØÁÐÁÐØÐÐÄÄÄĽÐÐØÁ؆†ÎÎÈÈÛËËà˫߫««à«àààààÜ›•›•›ÝÈßÈËßâßËËËßßÈßÈ݉ŒŒŒŒŒŒŒ‰Ô k•‰‰‰‰‰‰Ž‰‰‰‰Ž‰ŽŽŽŽŽŽ„jm £‚aU ¢ ¢ + kt{k ­««««««Ë«ËË˴۴ȵµÜµÎÎÎÎÀÚÚ†ÏÚÁÁØÁÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄ…Ö¶Ö¶Ö¶ÄÂÒ¿…ÒÒÒÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÒÂÒ…ÂÂÂ…Ö¶ÖÄÖÄ…ÖÄÂÂÂÂ…ÒÂÂÂÂÂÂÂÂÂÂ…¶ÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁÁÁÏÁÁÁØÁÐÁÐÐжÖÄÐÐÐÐÁÁ††ÀÎܵÈÛËËà «ß««««àààààÕŒŒŒŒäÈßßßËß˫˫ËßßßÈÕ›ŒŒŒŒŒŒŒŒ™¬Í™‰‰‰‰Ž‰‰‰Ž‰ŽŽ‰ŽŽŽŽŽŽŽ‰ k s_eR + ¢ + p‡ ««««««ËËàËËË´ÛÈɵµÎÜÎÎÀÚÀÚÏÚÁÏÁÁÐÐÐÐÄÄÄÄÄÄÄÄÄÖÄÖÄ…Ö¶Ö¶Ö…Ä¿…¿…Ä…ÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…Ö¶ÖÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÂ…½ÐÐÐÐÐÐÐÐØ¹ØÁعØÁÁÁÏÁÁÁÁÁÁÐÐÐÐĶÐÐÐØÁÁÚÚÞÎÜÈÈâËËà ˫˫Ëàà¬à¬àŒŒŒŒŒŒ˜ÈßßßËßËß˫˫ËßÈߌŒŒŒŒŒŒŒ•Ë¡j䉉‰‰‰‰‰Ž‰‰‰‰‰‰‰ŽŽŽŽŽŽ› ¢`hhhZm£j¢¢j + ly k««««ßË«ËËËË´ÛȵµµÎµÎÎÎÀÚÚÏÚÁÏÁÁÁ¹ÐÐÄÄÄÄÄÄÄÄÄÄÄÄÖ…Ä…Ö¶Ö¶Ö…ÄÂÂ…Ä…Ä…ÄÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÂÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÐÐÐÐÐØÐ¹ÐÐÁÁÁÁÏØØÏÁÚÁÏÁÁÁØÐÐÐÄÐÐØÐ¹ÁÚ†ÀÎεÈÈÈËËà à««ààà¬ààŽŒŒŒŒŒŒ›ŸÈÈâ«ßËßâßË«ËßËßÈŽŒŒŒŒŒŒŒ•Æ ȉ‰‰‰Ž‰‰Ž‰‰Ž‰‰ŽŽŽŽŽŽŽ„ ihhhh[ +  ««««ß««¯ËËËËÛÛȵÉÜÎÜÎÜÎÎÀÚÚÏÏÚÏÁÁйÐÐÄÄÄÄÄÄÄÄÄÄÖ…ÄÖ…Ä…Ö¶Ö¶Ö…ÄÖÄ…ÄÂÄÒ¿ÒÒÒÒÒÂÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÐÐÐÐÐØØØÁÏØÁÁÁÁÏÁÏÁÚÁÏÁÁÁÐÐÐÐÐÐÐØØÁÁÚÎÎÜܵÈÛ«ËàÍ  ààà«Ëàà¬à¬ÈŒŒŒŒŒ›†ßßßâ«ßËßËßË«ËßߺŒŒŒŒŒŒŒ‰Îßkž‰‰‰‰‰‰‰Ž‰Ž‰‰‰ŽŽŽŽŽŽŽŽ¡j ¡dhhhhhbg m  «««ß߯߯ßËË´Û´ÛµµÜÜÎÎÎÎÎÎÀÚÚÏÚÏÁÁعÐÐÐÄÄÄÄÄÄÄÄÄÄÄÖ…ÄÖÄÄÄÒÄÖ¶Ö…Ä…Ä…ÄÒ¿ÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÐÐÁ¹ÁÁØÁÏÏÁÁÁÁÏÁÚÁÏÁÁÁعØÐÐÁØÁÐÁÁÁ†ÎÎεÈÈÈËËବ¬¬ààààËàààà¬àÕŒŒŒŒŒŒÈßÈßßâßßËßËßËßËßוŒŒŒŒŒŒŒŒ•ŽË˜‰‰‰‰‰Ž‰‰‰‰‰Ž‰Ž‰ŽŽŽŽŽ‰k fhhhhhhhZ +‡¢«««¨ß¯­ß¯ÈÈÈÛ¯ÛÈÛµÉÜÜÜÎÎÎÎÎÀÚÁÚÁÁÁÁ¹ÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÄÄÄÖ¶Ö…Ä…Ä…¿ÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÄÐØÁÏÁÁÏÁÏÏÏÁφÏÁÚÁÁÁØÁйÐÁÁÁØÁØÁÚÀÀÎÎܵÈâËˬà¬à¬àà«àà«à««ËàààŒŒŒŒŒŒ˜ßÈßȵÈÜÈäÈÈÈÈËßߘŒŒŒŒŒŒŒŒ›Ë¡l +Ô‰‰‰‰‰‰‰Ž‰‰Ž‰‰ŽŽŽŽŽŽŽŽ  ‡¢`bhhhhhhhhV l«««ßª­È­ÈÈÈÈÈÈȵµÜÜÎÎÎÎÎÎÎÀÀÚÚÏÁÁÁÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÒÄÄÖ¶Ö…Ä…Ä…¿ÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÐÁÁÁÏÁÁÏÁÏÁÏÁφچÚÏÁÁÁÁعÁÏÁÁÁÁÁÚÀÎÎεµÛËËବ¬àààààË߫߫ËàààŒŒŒŒŒŒ›žËßÈ™‰Ž™Ž™ŽŽ™˜ÈßÈŒŒŒŒŒŒŒŒŒ›Ò m 䉉‰‰‰Ž‰Ž‰‰‰‰‰ŽŽŽŽŽŽŽ„  +¢ihhhhhhhhhhVm««¨¥È­­®ÜÔµµµµµÜÜÎÎÎÎÎÎÎÎÎÎÚÚÁÁÁÐйÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ÄÄ¿¿ÒÄÖ…ÄÒ¿ÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…ÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÐÁÁÁÁÏÁÚÁÁÏÁφÏÁÚÁ†ÏÁÁØÁØÏÚÚÚÁÁφÀÎÎܵÈÈËËବᬬàààÍËàààšššššš™ÍßËÊ›››››››™ßÈÈššššššššššÉßÕ•‰‰‰‰‰‰‰‰Ž‰Ž‰Ž‰ŽŽŽŽŽŽ„  + dhhhhhhhhhhh[ «««¨­È­®®ÜÜÜÜÜÎÎÎÎÎÎÎÎÎÎÎÎÀÚÚÏÁÁ¹ÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĿҿҿֶÒÄ¿ÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÄÄÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÐÐÁÚÏÁÏÁÚÁÁφÚÚÚ†ÚφÁÁÁØÁÚ†ÚÁÚÁ†ÚÀÎεµÈÛ´Ëàବ¬à¬àà««àà«««ß««ËߌŒŒŒŒŒ«ßßßÈßßȯ´¨§Ëà™‰‰‰‰‰Ž‰Ž‰‰‰Ž‰ŽŽŽŽŽŽ‰  + fhhhhhhhhhhhhV ««ßª­È®ÔµÜ°ÎÜÎÎÎÎÎÎÎÎÎÎÎÀÚ†ÏÁÁйÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÖ¿ÒÄÖ¿¿ÒÒÒÒÒÒÒÒÒÒÂÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄ…Ä…ÄÄÄÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÐÁφφÏÁÚÁÁÏÚ†ÚÚ†ÚÁÁÁÁÁÏÚÚ†Ú†ÚÚÀÞÎÎÜܵÈÛËà¬à¬¬¬¬ààà ßß«ËààààààËËËËß™ŒŒŒŒŒŒŒŒØßßÈÈßß«Ëâ«Ë«Ëà«‚m ÈŽ‰‰‰‰‰‰‰‰Ž‰Ž‰ŽŽŽŽŽŽŽ + +¢nhhhhhhhhhh_hhhZ¬««¨ÈÈ­µ®ÜÜÜÎÎÜÎÎÎÎÎÎÎÎÎÀÀÚÚÏÁÁ¹ÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĿҿÖ¿ֿÒÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÄÄÄÄÄÐÐÐÐÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÐÐÁÁÏÁÚÚÁÏÁÏÁÁÚ†ÚÚÁÚÁÁÁÁÚ†ÚÀÚÚ†ÚÚÀÎÎεÈÛËËàà¬à¬¬àààÍÈßËààààààààËßÈ›ŒŒŒŒŒŒŒŒ›ä«ÈßÈß«ËßËË«à«ßËȉ‰‰‰‰‰‰‰Ž‰‰‰‰ŽŽŽŽŽŽŽ„ + ¢ihhhhhhhhhhh____gà«ß­Èµ®µÜµµÎÜÎÎÎÎÎÎÎÎÎÎÎÀÚÚÚÁÁйØÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÒ¶Ò¿ÒÒ¿ÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÄÐÄÄÐÐÐÐÐÐÐÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÖ…Ä…ÐÐÐÁÁÏÚφÁÏÁÚÚ†Ú†ÚÚÁÁÏÁÚÀÚ²Ú²ÚÚÚÀÎÎÎܵµÈÛËàààààà¬à¬à +äÈ««àààààààËË«ËÊŒŒŒŒŒŒŒ™ßßßÈß«âß«««Ë«â«ß +ƒÞ•‰‰‰‰‰Ž‰Ž‰‰‰Ž‰‰ŽŽŽŽŽŽ¢ + ihhhhhhhhhh_h____\Ôà©«««ÈÈȵܵÜÜÎÎÎÎÎÎÎÎÎÎÎÎÎÀÀ†ÏÁÁÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿¿Ö¿ÒÒÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÐÐÐÐÐÐÐÐйÐÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂ……ÄÖ…ÄÄÄÄÐÐÐØÁÁÏÚÏÁÁÁÁÚÚ†ÀÚÚÚÁÁÏÚÚÀÚÀÚ†Ú†ÀÎÎÎܵÈÈâËËËààààààààÈß«ËààààààààËËËžŒŒŒŒŒŒŒŒÈßÈßÈâ«ßËâ«Ëß«ßו‰‰‰‰‰‰‰‰Ž‰Ž‰‰ŽŽŽŽŽŽ‰ + + fhhhhhhhhhhh____hS +ଫßÈÈȵµÜµÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÚÚ†ÏÁÁÐÁÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĿҿҿÒÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂййÐÐÐйй¹¹ÐÐÄÄ…ÂÂÂÂÂÂÂÂ…ÖÄ…ÄÄÄÄÄÄÄÐØ¹ØÁÁÁÚÏÁÁÏÚÚÚÚÀ†ÚÚÚÚÀÚÚÀÚÀÚÀÚÎÎÎܵܵÛÛËËËàààààààà ƒßßËËàààààààËààà™ŒŒŒŒŒŒŒŒÕßÈßßßßßßßßßßßßß ‡ ¢¢¢ ÈŽ›‰‰‰‰Ž‰Ž‰‰‰‰‰ŽŽŽŽŽŽŽ‰ +¢n_hhhhhhhhhh______hVËàଫ««ßÈȵܵÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀÚ†ÚÁÁÁÐÐÁÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÐÄÐÄÄÐÐÄÄÄÄÄ¿¿ÒÒÒÒÒÒÒÒÒÒÒ¹ййÐÐÐйÁÏÁÏÐÐÐÄÄ……ÂÂÂÂÖÂÄ…ÄÄÄÄÄÄÐÐййÁφÏÁÏÁÚÚÚ†ÚÚÀÚ†ÚÀÎÎÀÎÎÀÀÚÎÎÎÜܵµµÈÛËËËàààààààÈͫ߫ËààààËàààààË›ŒŒŒŒŒŒŒ›ÔßÈ™ßßË ¥ß«Ë«ßßËßßÈß܉‰‰‰‰‰‰‰‰Ž‰Ž‰ŽŽŽŽŽŽ„  + ¢`hhhhhhhhhh_h______hRààà«««ÈÈȵÜÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀÚÀÚÏÁÁÁÁйÐÐÐÄÄÄÄÄÄÄÄÐÐÐй¹Ã¹Ã¹ÐÄÄÄÄÒÒÒÒÒÒÒÒÒÒÒÒÒÒ¹ÁϹع¹Ð¹ÁÏÁÏÁÁ¹ÐÐÄÄÖÄ………ÂÖ…ÄÄÄÄÄÄÄÐйÐÁÁÁÁÏÁÏÁÏÚÀÀÚÎÀÎÀÚÀÎÎÎÎÎÎÎÎÎÎܵµµµµÈÛËâËËËËËààààß¡¡¡Ë«ËËàËàËàËààààà†ŒŒŒŒŒŒŒ™ßßÈ›••••••••••ßß ¢¢¢¢ Ÿž•‰‰‰‰‰Ž‰Ž‰Ž‰‰‰ŽŽŽŽŽŽ‰„  + ihhhhhhhhhhh______W_e"Ëà«««È«Èµ®ÜÜÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀÚ†ÏÚÏÁÁÁعÐÐÐÄÄÄÄÄййÃÁÃÏÏϹùÐÄÄÄÄÒ¿ÒÒÒÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÏÁÏÁÁÏÁÏÁÁÏÁÏÁÏÁ¹ÐÐÄÄÄÄÄÖÄÄÄÄÄÄÄÄÐÐÐйÏÁÁÏÚÏÚÚ†ÀÎÎÎÎÎÎÎÎÎεÜεµµÜµµµÛÈÛÛÛÛËËËËËËËËàààààààààààËß˫߫ËààËàààààËŒŒŒŒŒŒŒŒ›È߆ŒŒŒŒŒŒŒŒŒŽßm˜•‰‰‰‰‰‰‰‰Ž‰‰‰ŽŽŽŽŽŽŽ‰  + ehhhhhhhhh_h_____WW__ZÈààà«««ÈȵµÜÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀÀÚÀÚÚÚÚÁÁÁ¹ÐÐÐÐй¹ÁÏÏÏÏÏÏÏÏÁϹùÐÄÄÄÄÖ¿ÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÏÁÁÁÏÁÏÏÁÏÁÁÏÁÁÁÏÁ¹ÐÐÐÄÄÄÄÄÄÄÄÄÄÐÐÐй¹ÁÁÏÏÏÚÀÚÀÀÎÎεµµÉµµµµµµµÉÈɵɵÛÛÛ´ËËËËËËËËËËàËàËËààààààËàËË߫˫Ëàà«àËàËàššššššššššÁâߟŒŒŒŒŒŒŒŒŒŒ˜Û܉‰‰‰‰‰‰Ž‰‰‰Ž‰Ž‰ŽŽŽŽŽ› ‡ n_hhhhhhhh_h______WWbWV  ààà««ß«ÈÈÈܵÎÜÎÎÎÎÜÎÜÎÎÎÎܰÜÎÎÎÀÚÀÀÀÚÚÚÏÁÁ¹¹¹ÁÏÏÏÚÀÀÀÀÀÀ¸¸ÏÏÏϹÐÐÄÄÄÒÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÁÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÁÏØ¹ÐÐÄÐÄÄÄÄÄÄÄÐйØÁÏÁÏÚÏÚÀÀÎÎÎÎÎεµµÈÈÈÛÈ۵ɵÈÉÛÛÈÛÛÛ´â´Ë´ËËËËËËàààËàËËàààààààËß‚ƒ«Ë«Ë˫˫ËàËÈÛ߫ߘŒŒŒŒŒŒŒŒŒÇß  ߉‰‰‰Ž‰‰‰Ž‰‰Ž‰ŽŽŽŽŽŽŠ + +¢`hhhhhhhhhh_h____WWbTWM àà«««ß¯ÈµµÜÜεܵµµµµÉµµµµµÉÜÎÎÎÎÎÎÎÎÀÀÚ†ÏÏÁÏÏÏÏÚÀÚÀÀÀÀÀÀÀÀÏÏÁùÐÄÄÄÄÒÒÒÒÒÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÏÁÁÏÏÏÏÏÏÏÏÏÏÏÏÏÏÁÁйÐÐÐÐÄÄÄÄÄÐÐйÁÏÚÏÚÚÚÀÎÎÎÎÎÎεÉÉÈÛÛÉÈÈÈȵÈÈÛȵÛÈÛÛÛ´ÛÛÛ´ËËËËËËËËËàààààààààËËË â«âËâËËËËËßËßËßߌŒŒŒŒŒŒŒŒ•Ð߇m‚Ý•‰‰‰‰‰‰‰‰Ž‰‰Ž‰ŽŽŽŽŽŽŽ„  + ¢ihhhhhhhhh_h______WWWTX Ëà«««ß¯ßÈȵµÜµÜµµÉÈÈÛÈÛÛÛÛÛÛµµµµµÎÜÎÎÎÎÎÀÚÚÚÏÚÏÚÀÀÀÎÎÎÎÎÀÀÀÀ¸Ï¹ÃÐÄÄÄÄ¿ÒÒÒÒÒÒ¹ÁϹÏÏÏÏÏÏÏÏÏÏÏÏÁÏÁ¹Ð¹ÐÐÐÐÄÐÐÄÐйØÏÚÏÏÚÀÀÎÎÎÎÎÎÎÎεɵµµµÉµÉµÉµµµÉµµÛÈÛÈȵÈÛÈÛÛ´ËËËËËËËàààààààààË ‚ßâ«â«ËËËË«ËßË߫݌ŒŒŒŒŒŒŒŒÜÍmו‰‰‰‰‰‰‰Ž‰‰‰‰Ž‰ŽŽŽŽŽ‰  + ehhhhhhhh_h______WWWWS ßàà«««ßß«ÈÈȵµµµµÈÈÛÛÛ´Ë´Ë´ËË´ÛÛÛÛÛÛɵµµÜÎÎÎÀÚÚÏÚÀÀÀÎÀÎÎÎÎÎÀÀÀ¸ÏϹ¹ÐÄÄ¿ÒÒÒÒÒÒÒÂÂÂÂÂÂÂÒÂÖ¹йÁÃÁÏÁÏÁÏÏÏÏÏÁÏÁ¹Ð¹Ð¹ÐÐÐÐÐÐÐйÐÁφÚÁÚÀÚÀÚÀÎÎÎÎÎÎÎÎܵܵܵܵÎÜÜÜÎÎÎܵÎÎÎÎܵµµµÈÈÈÈÛËËËËËààààààààßßâ«âËË˫˫ËßËßÅŒŒŒŒŒŒŒŒŒ™«Íމ‰‰‰‰Ž‰‰Ž‰Ž‰ŽŽŽŽŽŽŽ + qbhhhhhhhhh_h_____WWTWV ¢à«à«ß«ßÈßÈÈȵµµÈÛÛÈ´´ËËËËËËËËË´´Ë´´ÛÛÛÈɵÜÎÎÎÚ²ÚÀÀÎÎÎÎÎÎÎÎÀÀÀÀÏÁϹÐÄÄÄÒÒÒÂÒÒÒÂÂÂÂÂÒÂÂÖÄօ¹¹Ð¹ÁÐÁ¹Á¹ÁÁÏÁÁÁ¹¹Á¹Ð¹Ð¹Ð¹Ð¹Ð¹Ð¹ÁÏÚÏÏÏÚÚÀÚÚ†ÚÚÀÀÀÀÚÀÀÀÎÎÎÎÎÎÎÀÀÚÁÚÚÏÁφÁ†ÚÀÎÎÎÎÜܵÈÈÛËËËËààààààà‚¤­ßß«â«ËËË˫˫ËߢŒŒŒŒŒŒŒŒŒÇß +߉‰‰‰‰‰‰‰Ž‰‰‰Ž‰ŽŽŽŽŽŽŠ  + + `hhhhhhhh_hh_____WWWTWQ¢¡à૫߯ßÈÈÈȵ۵ÈÛ´´ËËËËËˬ¬ÌËËËËËËËË´ËÛÈɵµÎÎÀÚÀÀÎÀÎÎΰ°ÎÎÎÀÀÀÏÏÁ¹ÐÐÄÄÄ¿ÂÒÂÒÒÂÂÂÂÒÂÒ…Âֶօ¹йй¹Ð¹ÐÁйй¹¹Á¹¹Ð¹Ð¹Ð¹Ð¹Ð¹Ð¹ØÁφφÏÏÚÏÏÏÏÁÁÏÁÁÁÁÁÁÁÁÁÁÁÁÁÏÁÁØÐйØÐÁÐÁÁ†Á††ÎÎεµÈÈÈÈËËËËàààààà âÈßÈ«â«ËËËà«â«ËߌŒŒŒŒŒŒŒŒØß º•‰‰‰‰‰Ž‰Ž‰Ž‰‰‰Ž‰ŽŽŽŽ‰„j £ + ihhhhhhh_h_h_____WbTTTN àà«««ß«ÈÈȵÈÈÈÛ´´Ë´ËËËËÌËÌààËËËËËËËË´ËÛÈÛµµÎÎÀÀÀÀÎÀεμµÎÎÎÀÀÏÁϹÐÐÄÄÄÖÒÂÒÂÂÂÂÒÒÂÖ…ÖĶֶÖą¹¹Ð¹¹¹¹Ð¹Ð¹Ð¹¹Ð¹Ð¹Ð¹Ð¹Ð¹Ð¹Ð¹Ð¹ÐÁÏÁÏÁÁÁÏÁÏÁÏÁÁ¹¹ÐÁйÐÐÐÐÐÐÐÐÁÁÁÐÐÐÐÐÐÐØÁØÁÁÚ††ÎÎÎܵÈÈÛÛËËËËàààà૤ÈßÈßâËËËËËË˫˫܌ŒŒŒŒŒŒŒŒÜÍו‰‰‰‰‰‰‰‰‰‰‰ŽŽ‰ŽŽŽŽŽŽ¢ + £ ¢ehhhhhhhhhh______WWWWSo à«««ß¯ÈÈÈÈÈÛÛÛË´ËËËˬà̬ÌËËËàËËËËËË´ËÛÈÈÉÎÎÎÀÀÀÀΰÉÉɼÎÎÎÀÀÚÏÁϹÐÐÄÄ…¿ÂÂÒÂÂÒÂÒÖ¶Ö¶ÖĶֶֿÂÂÂÂÂÂÂÂй¹Ð¹Ð¹¹Ð¹Ð¹Ð¹¹ÐÁÐÁййййй¹ÏÁÁÏÁÏÁÏÁÏÁÏÏÏÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÁÁÁÁÁÚ†††ÎÎÎÎܵÈÈÈÈÛËËàààààâÈÈÈßßßß«ßßß««ËŸ”ŒŒŒŒŒŒŒŒŒ™«ÔŽ•‰‰‰‰‰Ž‰Ž‰‰ŽŽ‰ŽŽŽŽŽŽ‰  + ohhhhhhh_h_______WWWTW[¢ ««Ëß«´ÛÈÛÛËË´ËËËà¬Ë̬̬ବ¬¬ËààËËË´´ÛÛµµÎÎÎÎÀÎΰµÉɵ°ÎÎÀÀÀÏÏÁùÐÄÄÄ…ÒÂÒÒÒÂÖ¶ÖÄÄÄÄÄֶֶ¹й¹Ð¹ÐйййÐйййййййÁÏÁÏÏÏÏÏÏÁÏÏÏÀÚÀÚÁÏÐÐÐÐÐÐÐÐÐÐÁйÁÁÁÐÁØÐÁÐØØÁÁÁÚ††ÀÎÎÎܵܵÈÈÈËËËËËËàäÈ +ËßšŒŒŒŒŒŒŒŒŒŒÇâ ߉‰‰‰‰‰‰‰‰‰Ž‰ŽŽŽŽŽŽŽŽŠ  ‡ Nhhhhhhhh_h______WWWTWM¢¡àà«««Ëß«ËËËËËËËËବà̬Ì̬ÌÌ̬àˬËËËËË´ÛÈɵÎÎÎÎÀÎÎɵɼÎÎÎÎÀÀÏÏÏÁÃÐÐÄÄÖ¶ÒÂÒ…Ä…ÄÄÄÄ…Ä…ÄÖ¶ÂĹ¹Ð¹¹Ð¹ÐйÐÐÐÐÐÐÐййййй¹ÏÁÏÚÚÀÀÀÀÚÚÚÚÀÀÀÎÀÚÏÁйÐÐÁÐÁÐÁÁØÁØØÐÐÐÐйØÁÁÁÁÁÚ†Ú²ÎÎÎÜܵµÈÛÈÛËâËËà‚ßÈmâËÝššššššššššÍ« + Ô•‰‰‰‰‰‰‰Ž‰Ž‰‰ŽŽŽŽŽŽŽ‰„j + chhhhhhh_h_h_____WWWWTa¢«ËàËËËËËËËàà¬ÌÌÌ̬ÌÌ̬̬¬¬ÌˬˬËËËË´´ÛµÉµÎÎÎÎÎÎÜɵÉÎÎÎÎÀÀÀÚÏÏÁÃÐÄÄÄÄÄÖ¶ÄÄÄÄÄ…ÄÄ…Ä…ÄÖ¹йй¹Ð¹ÐÐÐÐÐÐÐÐÐÐййййÐÁÁÏÚÀÀÀÎÎÎÎÀÀÚÎÎÎÎÎÎÀÚÁÁÐÁÐØÐÁÐØ¹Ø¹ÐÁÐÐÁØÁÁÁφÚÚÚÀÀÎÎÎÎÎܵÈÈÈÛßÛËËËà­ÍÔßÍßà«àËàààà«««ß m•‰‰‰‰‰Ž‰‰‰‰‰ŽŽ‰ŽŽŽŽŽ¢ +m + dhhhhhhhhhh_____WWbTWS ¤¥àËËËàˬ̬¬Ì¬Ì¬Ì¬Ì̬á̬̬̬Ìà¬Ë¬ËËËË۴۵ɵÎÎÎÎΰÜɵÎÎÎÎÀÎÀÀÚÏÁÁÐÐÐÄÐÄÄÄÄÄÄÄ…Ä…Äąąą¹¹Ð¹Ð¹ÐÐÐÐÐÐÐÐÐÐÐÐÐÐй¹Ð¹ÐÁÏÏÁÚÀÀÎÎÎÎÎÎÎÎÎÎεɵÎÎÀÁÁйÐÁعÐйÐÁÐÁÁÁÁÁÚÚÚÀÀÎÀÎÎÎÎÎεµµÈÈÈÛÈâËËàËàà¬ààààËËßß ß«Ëààààààààà«ß«mÍ™‰‰‰‰‰‰‰Ž‰Ž‰‰‰ŽŽŽŽŽŽ‰¢ ofhhhhhh_h_______WWWTWV àààËà¬à¬à¬Ì¬á¬ÌÌÌ̬ÌÌÌ̬̬̬Ìà¬àËËË´ËÛÛȵɵΰÎÎΰܰÜÎÎÎÎÀÀÚÚÏÁÏÁÐÐÐÐÐÐÐÄÄÄ…Ä…Ä…Äąą…¹ййÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐй¹¹ÏÁÁÏÏÀÀÎÎεɵÉÎÎÎεɵɵÜÎÀÚÏÁÏÁÁÁÏÁÁÁÁÏÁφÚÚÀÀÎÎÎÎÎÎÜÎÎܵµµÈµÈÈÈÛ«ËËËààààààààà«ßË ¢ßË«ààààààààà««âȉ‰‰‰‰‰Ž‰‰‰‰Ž‰Ž‰ŽŽŽŽŽ›  Nhhhhhh_h_h______WWWTWM ¡ààà¬à¬ÌÌÌÌáááÌÌÌÌ̬Ì̬̬àËËËËËË´´ÛÛɵܵÎÎÎÎΰÜÎÎÎÎÀÎÀÀÚÀÚÏÏÁÁ¹ØÐÐÐжÖÄ…Ä…Ä…Öąą¹¹Ð¹Ð¹ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐйÏÁÏÁÏÏÀÀÀΰÉɵɵÉɵµµµÉµÉɵÜÎÎÀÚÚÚÚÚÚÚÚÚÀÚÀÚÀÀÚÎÎÎÎÎÎÎÎÜܵµÈȵȵÈÛËËËËËàààààààààà«ß‚ßßË«ËààËàààËËß« ¢Õ•‰‰‰‰‰‰‰‰Ž‰Ž‰ŽŽŽŽŽŽŽŽ„ +m chhhhhhhhh______WWbTWTN ««àËବÌáÌáÌáÌÌááÌÌ̬̬̬ÌàˬËàËËË´ÛÛÛɵɵµÜµÎÎÎÎÎÎÎÎÎÀÀÚÚ†ÚÚÚÚÁÁعÐÐÐÄÖ¶ÖÄ…Ä…Ä……Ä………ÂÂÂÂÂÂÂÂϹ¹Ð¹ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐййÏÁÏÏÚÚÀÎεÉÉÛÉÉÛµÉɵɵɵÉɵɵÜÎÎÀÀÀÀÀÀÎÀÎÚÀÚÚÀÀÎÎÎÎÎÎÎܵµÛµÈÛÈÛÛËËËËËàààààààààààËäÍ͉‰‰‰‰Ž‰Ž‰‰Ž‰Ž‰ŽŽŽŽŽŽ £ dhhhhhh_h__h____WWWTWSqͨ«««¬à¬Ì̬ááá¬ÌÌÌ̬Ì̬̬ÌËàËËËËËË´ËÛÛ۵ɵµÜ°ÎÎÎÎÎÎÎÎÎÀÀÚÀÚÚ†Ú†ÏÁÁÁÐÐÐÐĶֶÖÄ…Ö……Ö………ÂÂÂÂÂÂÂÂÂÁÁййÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐйÁÁÏÁÏÀÀÎÎÎÉÉÛÛÛÛÛÛ۵ɵɵÉܵÉÈÉɵÜÎÎÎÀÎÎÀÎÚÀÚÀÚÚÀÀÎÎÎÎÎܵµÛÛÛÛÈÛÛ´ËËËËËààËËËààààààßÈ‚Í ¡‚‚­™‰‰‰‰‰‰‰‰Ž‰‰‰‰ŽŽŽŽŽŽŽ‰  £pbhhhhhhh_h______WWWWW[¢ +««§¨««««Ëବ¬ÌÌáááá̬̬Ì̬Ìà¬ËàËËËËËË´ËÛÛÛɵɵµµÎÎÎÎÎÎÀÀÀÀÚÚÀÚ†Ú†ÚφÁÁعÐÐÄÄÖ¶Ö¶Ö…………Â…ÂÂÂÂÂÂÂÂÂÂÂϹ¹Ð¹ÐÐÐÐÐÐÄÄÄÐÐÐÐÐÐÐй¹ÏÁÏÏÚÀÎΰÉÉÛÉÛÛÛÛɵÉɵɵÜܵɵµÉÜÎÀÚÚÚÀÀÚÀÚÀÚÀÀÚÎÀÎÎÎܵÉÈÛËËËËËËËËàËËËËËËËËààààËËà ¢È«ß«ß߫߫ßßß­ ß߉‰‰‰‰Ž‰‰‰Ž‰Ž‰ŽŽŽŽŽŽ›  ‡Nhhhhhh_h_______W_WWTWM «¨§«¥ß««««àବ¬ÌáÌá¬Ì¬¬Ì¬Ì¬ÌàËàËËËËËË´´ÛÛÛȵµÉµÉµÎÎÎÎÎÀÀÚÚÚÚÀÚÚÏφφÚÁÏÁÐÐÐÐÐĶֶօÂÂ………ÂÂÂÂÂÂÂÂÂÂÂÂÁй¹ÐÐÐÐÐÐÄÄÄÄÄÄÐÐÐÐÐÐйÁÏÁÏÀÀÎÎÜÉÉÉÉÛÛÛÛ۵ɵɵµÎÎÎÜÜÜÜÎÎÎÚÀÀÚÚÀÚÀÚÎÎÎÎÎÎÎÎܵÛÈ´ËËËËËËËËàËËËËËËËËàËËààËà˂ȣ ‚ + + + ‚—‹‹‹Š››››‰ŽŽŽŽŽŽŽŽŽŽ„ + ‡chhhhhhhhh_______WWWTWa ««§¨¥«¥«ß«Ëˬà¬Ì¬áÌáá¬Ì¬¬Ì¬Ì¬Ë¬ËËËËË´´ÛÛÛÛµÉÉɵɵÎÎÎÎÎÀÚÚ†ÚÀÚÚÀ†ÚÏÚÁÏÁÏÁÁØÐÐÐÄÄÖ¶Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÐÐÐÄйÐÁÁÏÁÚÀÎΰÉÉÛÉÉÛÛÉÛɵɵɵÜÎÎÎÎÎÎÎÎÀÀÎÎÎÀÚÀÚÎÀÎÎÎÎÎÎΰܵÉÈÛÛ´Ë´âËËËËËËËâËËËËËËËËËàÔ ß‚‚ˆ‹‹›ŽŽŽŽŽŽ‰‡k ‡dhhhhhh_h_h_____WWWTWSX£ß«å§¥¥¥ßß«««àà¬Ì¬á¬áááÌ̬̬¬àËààËËË´Ë´ÛÛÛÛµÉÉɵµÉ°ÎÎÎÀÀÀÚÚÏÏÚÚÚÚÚÚÁÚÏÚÁÁÁÁÁÐÐÐÐÄ…Ä…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐй¹ÏÁÏÏÚÀÎܵɵÉÈÉÉÛµµÉµÉµÜÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÞÎÚÚÀÎÎÎÎܵµÛÈÛÛ´ÛËËËËÛ´ÈÛËâ«ÛßËËËËÈ “Š›‰ŽŽŽ‰‡ ehh_hh_h_h_____WWbTTWV  Ë߫߫«¥¥¥ßßß«ËËà¬à¬¬ÌÌÌÌ̬¬ÌàˬËËËËË´´Û´ÛµµÉɵɵÎÎÎÎÎÀÀÚÚÏÏÁÚÁÏÁÏÁÁÏÁÚÁÏÁÁÁØÐÐÐÐÄÄ…Ö……Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÐййÏÁÁÏÚÀÎÎɵÉÉɵ۵ÉɵɵÜÎÎÎÎÎÎÎÎÎÎεµµÜÎÎÎÎÎÎÀÚ†Ú†ÚÀÎεµÉÛ´Û´ÛÛ´â´âÛÈÈÈÈÈÈÈÈÈâËËËÍ‚‚‚‚‚‚‚¡È¡ƒmlkkˆ‹ŠŽ +£Xhhhh_hhhh______WWWWTWM ߫߫߫¦¨¥¥ß«ß«Ëàବ¬Ì¬Ì¬ÌÌ̬̬̬àËàËËË´ÛÛÛÛµÉɵµÜ°Î°ÎÎÎÀÚÚÚÏÏÁÏÁÏÁÁÁÁÁÁ†ÁÁÁÁØÐÐÐÐÐÄ…Ö…………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄ…Ä…Ö…ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÐйÐÁÏÁÏÚÀÀÎεÉÉÉÉÉɵÜɵÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀÀÎÚÚ†ÚÀÎÎÎܵµÛÛ´â´ÈÈÛÛÈÛÈȵµµµµµÜÈÈÈâËËËËËàààËßßÈßÈÈ Í  ‡Šˆ £Mhh_hh_h_______W_WWWTWa «ß«ß«ß¨ß¥ß¥ß««Ëà¬à¬ÌÌÌ̬ÌÌÌá¬ÌˬËËË´â´ÛÈɵɵÉܰÎÎÎÎÎÀÀÚÀφÏÏÁÁÁÁÁØÁÁÁÁÁÁÁØÐÐÐÐÐÐ…Ä…………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÄ…Ä…Ä…Ö…ÄÄÄÄÄÄÄÄÄÄÄÐÐÄй¹ÁÁÏÏÚÀÎÎεÉÉɵÉܰÎΰÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀ†ÚÚÀ†ÀÀÎÎÎܵµÛÈÛÈÛÈÛµÈÈÛÈ۵ܵÜÜÜܵÈÈÛÈâËâ«ËËËËßßßßÈÈ  ­¡‚mlj —dhhh_hh_h_______WWWTWSX¤߫߫߫ߥ¥¥ßßß«Ëàà¬ÌÌáá¬ÌáÌÌ̬ᬬËàËËË´ÛÛɵÉɵεÎÎÎÎÎÎÀÀÚÚÁÏÁÁÁÁÁÁØÁØÁØÁØÁØÁÐÐÐÐÐÄÄ…Ä……………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…Ä…Ä…¿…ÄÄÄÄÄÄÄÄÄÐÄÐйÐÁÁÏÏÏÏÀÀÎÎεÉÉɵÜÎÎÎÎÎÎÀÀÀÀÀÀÀÎÎÎÎÎÎÎÎÀÀÀÎÀÀÚÎÎεµÈÛÈÛÈÛµµµµµµµµµÎÜÎÎÎÎÜÜÈÈÈÈÈÛßËËËËßß«ÈÈÈÈ  ¤ +eh_hh_hh_______WWWWTW[ ȫ߫߫ߥ¥¥ß¥««ß«à¬¬¬ÌááÌ̬̬̬̬ÌˬËËË´´ÛȵÉɵɵÎÎΰÎÎÎÀÀÚÏÏÁÁÁÐÐÐØÁйÐÐØÁØÐÐÐÐÐÐÄÄ…Ä……………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÖ…Ä…Ä…Ä…ÄÄÄÄÄÄÄÄÄÐÐÐйÐÏÁÏÏÚÚÀÀÎÎεÉÉɵÎÎÎÎÎÀÚÚÚÀÎÀÎÎÎÎεεÎÎÎÎÎÎÎÎܵɵÛÛÈÛȵÜÜÎÜÎÎÎÎÎÎÎÎΆ†ÎÎÜܵÜÈÈÈÛËËËßÛßÈßÈÈÈ‚ƒ¤X_hh_hh_h_h_____WWWWTWV‡ «ß«ß«ß«¥ß¥ßßß««Ëàà¬Ìáá̬Ìàà¬Ìà¬Ë¬ËËË´Û´Û۵ɵɰÎÎÎÎÎÎÎÎÀÚÚÁÏÁÁййØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÂÄ…Ä…Ä…ÄÄÄÄÄÄÄÄÄÄÐÐйÐÁÁÏÁÏÏÀÚÀÎΰܵɵÎÎÎÎÎÀÚÀÚÀÀÀÎÎÎÎÜÎεÎÎܵܵÎÎÎܵµµµÜµÜÎÎÎÎÎÎÀÞÀÚ††††††††ÎÎÎÜÜÜÈÈÈÈßÈÛßÛÈÈßÈÈ Ô Zhh_h_h__h_____WWbTTTWa£Èßßß«ßßߥ߭ßßß«Ëବ¬Ìá̬¬ËËËËàËËàËË´´ÛÛÛÛÉÛµÉÉΰÎμ°ÎÎÎÀ†ÏÁÁÁعØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Â…Ä…Ä…Ä…ÄÄÄÄÄÄÄÄÄÄÐÐйÏÏÁÏÏÚÚÀÀÎÎΰܵÜÎÎÎÎÀÚÀÚÀÚÎÀÎÎÎܰµµÜµÜÎÜÎÎÎÎÎÀÎÎÎÎÎÚÚÚ††††††ÁÁÁØÁØÁØÁÁÚ†ÞÎÎÎÜܵÈÈÈÈÈÈÈÈßÈÈÔ ß¡‡`hhh_h_h_______WWWWTTSX¤ÈßÈßßßߥߥßÈ««ËËàˬ¬Ì̬ÌàËËËËËËËËË´´ÛÛÈÛµÛµÉÉɼΰÎÉÎÎÎÀÚÏÁÁÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÂÖ…Ä…Ä…ÄÖÄÄÄÄÄÄÄÄÐÐйØÁÁÏÏÏÚÀÀÀÎÎÎÎÎÎÎÎÎÀÀÚÀÚÀÚÎÎÎεɵɵµµÜÎÎÀÚÚÚÁÁÁ†Ú†ÁÁÁÁÁÁÁÁÁÁÁØÐÐÐÐÐÐÐÐÁÁ†††ÎºÎÎÜÜÜÜܵÈÈÈÈÈÈÍ¢‚å@fhh_________W_WWWTW[jÈßÈßÈßßÈßßßßßß««Ëà¬àବ¬ËËËË´´´´´´ÛÛÛÈÈɵɵÉÉɵΰΰ°ÎÎÎÀÚÚÏÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄ…Ä…ÄÖ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÂÄÂÄ…Ä…ÄÄÄÄÄÄÄÄÄÐÐÐÐÁÁÏÏÏÚÀÚÀÀÎÎÎÎÎÎÎÀÀÚÚÀÚÀÚÎÎÎܵɵɵÜÎÎÀÀÁÁÁÁÁÁÁÁÁÁÁØØÐÐÐØÐØÐÐÐж…нÐÕÐÐØØØÁ†††ÞºÜÜÜÜܵäÈÈÈää¡É^_hh_______WWWWTTWV  Ë«ÈÈßÈÈßß«ßÈß«ßËàà¬ËàËËËËË´´Û´â´ÛÛ´ÈȵȵɵɵÉÉÎÉΰÎÎÎÎÀÚÚÏÁÁØÐÐÐÐÐÐÄÄÐÄÐÐÐÐÄÄÄÄ…Ä…Ä…………Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………ÂÖ…Ä…Ä…ÄÄÄÄÄÄÄÐÄй¹ÁÏÏÏÚÀÚÀÀÀÀÀÀÀÀÀÀÚÚÀÚÚÀÚÀÎÎÎÎÎÎÎÎÎÀÚÁÏÁÁÐÁÐÐÐÐØÐÐÐÐĽÐÐÐÐÐÐж…………Ä…ÄÕÐÐÐÐØØÁ††ÎκκÜܵÜÈäȵ  + ‚ àYf___W__W_WWbTWTWa£ƒâÈÈßÈÈßÈ߫߫«ßËËà¬à¬ËËËË´ÛÛÛÈȵÈÈÈÈɵɵɵÉÉÉɵÎΰΰÎÎÎÀÚÏÁÁÁÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄ…ÄÄ…Ä…ÄÖ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…Ö…Â…ÂÄ…Ä…ÄÖÄÄÄÄÄÄÐÐÐйÏÁÏÚÀÚÀÚÚÀÚÀÚÀÚÏÏÚÏÚÚÚÚÁÚÁφ††ÚÁÁÁÁÐÐÐØÐÐÐÐÐÄÄÄÄÄ………ÐÐÐÐн…………………………Ä…¶½Ð½ÐØÁ††ÝÞºÎÎÜܵܵä܃ƒ‚‚¡¡‚äƒ jÌ5d_WWWWWWWWWWTTSXËÈÈÈÈßÈßß««ß«««àବààËË´ÛȵµµÜµÜÎܵµÜµÜɵɵɵΰÎÎÎÎÎÎÎÀÚÏÏÁÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ä…ÄÖ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÖÂÄ…ÂÖ…Ä…Ä…ÄÄÄÄÄÄÐÐÐйØÁÏÏÚÚÀÚÀÚÚÀÚÏÏÏÁÏÁÏÏÁÏÁÏÁÁÁÁÁÁÁÁØÐÐÐÐÐÐÄ………Â…Â……………Ä…Ð…ÐÐ………………………………………½ÐÐØÁ††††ÎÎÎÜÜÜÜÜܵܵÈÛßËËààËàËÈ¢l £ ÜLWWWWWWWbWTTWS ÈÛÈÈÈÈÈßÈ߫߫ËËàËବàËËË´ÛÈɵܰÎÎÎÎÎÎÎÎÎܵµÉܰÎÎÎÎÎÎÎÎÀÀÚÁÁÏÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ä…ÄÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶Ö…ÖÂ…Ò…Â…Â…ÖÄÄÄÄÄÐÐÐйÏÏÏÚÀÚÀÏÏÏÏÁÏÁÁÏÁÁÁÁÁÁÁÁÁØÁÐØÐÐÐÐÐąĶ……ÂÂÂÂÂÂÂÂÂ………Ä…Ö…………………………………………Ä…ÐÐØØÁ†††ÎκÜÜÎÜÜÜÜÜÈÈÈâ«ËàààËßÈ‚ + + + ¡`WWWWWWWWTTWV¢ÈÈÈÈÈÈßÈß«««ß«ààବ¬àËË˴ȵµÜ°ÎÜÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀÀÚÁÏÁ¹ÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…ÄÄÄ…ÄÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÖ¶Ò……ÂÂÂÂÂ…………ÄÄÐÐÐйÐÏÁÏÚÚÚÀÏÏÁÁÁÏÁÁ¹Á¹Ð¹Ð¹ØÁعÐйÐÐÐÐÄ………………ÂÂÂÂÂÂÂÂÂ…………………………………………………………………½ÐÐØØÁ†ÚºÞκÎÎÜÎÜÜÜÈÈÈâËààààËßÈ¢  + + + + Ÿ`SWWWWWTSWWg‚ÛÈÛÈÈÈßßß««««Ëàà¬à¬à¬àËËÛ۵ܰÜÎÎÎÎÎÎÀÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÀÀÚÚÏÁÁÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÄÄÄÄÄÄ…ÄÄÄ…Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö…ÂÂÂÂÂÂÂÂ…ÖÄÄÄÐÐйÐÁÁÏÏÏÏÏÏÏÁÏÁÁÁÐÐÐÐййÐÐÐÐÐÐÐÐÐÐĶօÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………………………………………………………Ö½ÐÐØÁ††ÚºÞκ޺ºÎÜÜÈÈâ«Ëàààà«ßä + + + + + ¡`SWWWWTWTTKÛÈÈÈÈÈÈß««««Ëàବ¬àËËËÛȵµÎÎÎÎÎÎÎÀÎÀÀÎÎÎÎÎÎÎÎÎÎÎÎÀÀÀÚÁÁÁÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄÄÄÐййÏÁÏÁÏÏÏÏÏÏÁÁ¹ÐÐÐйÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÖÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………………………………Ä…Ä…………………¶Ð½ÐÐØ†††Þº†Ýº†ÞºÜÜÈÈßËËààààËÈ m + + + + ¡NSWTTTTW[kµÈÈÛÈÈßßß««««àËàବ̬àËË´ÛµµÜÜÎÎÎÎÎÀÎÀÎÀÀÀÀÎÎÎÎÎÎÎÀÀÀÚÚÏÏÁ¹ÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÖ…Ä…ÄÄÄййÐÁÏÁÏÁÏÏÏÁÁÏÁÐÐÐÐÐÐÐÐÄÐÄÄÄÄÄÄ…ÄÄÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………………………Ä………Ä………Ä…………ֽнÐÁÁ††À†††††ÝκÜÈÈâËËàààà«È ¡‚‚‚‚¡‚߃¢  + + +£ +  ¢oSWTSWWV¢ÈÈÛÈÈßÈß«««ËàˬବàËàË´ÛȵµÎÜÎÎÎÀÀÀÎÀÎÀÚÚÀÎÀÎÎÎÎÀÀÚÏÏÁÁÁÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…Ö…Ö………Ö…ÄÄÄÐÐйÐÏÏÁÏÁÏÏÁÏÏÁÁйÐÐÐÄÐÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÄÐÄÄ………Ä…………Ä…Ä…ÄÄÄ……………¶Ö½ÐÐØÁ†††††††††ÝÎÜÈÈâËàààààßÈÈÈäÈäÈËàËßß«Ëß«ßÈÈ + ‡ +£ +  +‡XSWTTWFµÈÈÛÈÈßß«««àààà¬à¬Ë¬ËË´ÛµÉÜÜÎÎÎÎÀÀÎÀÎÀÚÀÚÀÀÎÎÎÎÎÀÀÏÁÏÁ¹ÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ä…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶Ö¿ÄÄÖ…¿ÄÄÄÄÐйй¹ÁÁÏÁÏÁÏÁÁÏÁÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄ…ÖÄ…Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¶ÄÐÐÐÐÐÄÄÄÄÄÖÄ…ÄÄÄÄÐÄÄÄÄ……ÄÖ¶ÄÐÐØØ††††ÁÁ††ÞºÎÜÈÈËËààààËßÈäÈÔÜÈ߫˫ßÈË«ßßÈÈÈÜÜËààß¡£ +£ + ¤ˆFTWTTFÕÈȴ߯ßÈ«««ààààà¬àËà¬ËËË´ÛÈܰÜÎÎÎÎÀÎÀÎÚÀÀÚÀÚÀÀÎÎÀÀÀÚÁÁ¹¹ÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÖÄÄÄÄÄÄÄÄÄÄÐÐÐййÁÏÁÏÁÏÁÏÏÁ¹ÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…ÖÄ…Ä…………Â……Â…ÂÂ…Â……ÄÄÐÐÐÐÐÐÐÐÐÄÐÐÄĶÐĽÄÐÄÄ…Ä……¶Ö¶ÐÐÐÁÁ†ÁÁØÁ†††ÎεÈÈâËààààËÈÈÈääÈÈÈßËßÈÈËßÈßÈÈÈÔÜßàà¬àà Í  + lFTWSÈȴȯßȫ߫«¬à¬¬àˬËËËË´âÛµµÜÎÎÎÎÎÀÀÎÀÎÚÚÀÚÀÚÀÀÀÀÀÚÏÁ¹ÐйÐÄÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÄÄÄÄÄÄÄÄÄÄÐÐй¹Ð¹ÐÁÁ¹ÐÏÁ¹¹¹ÐйÐÐÄÄÄÄÄÄÄÄÄօօօĶÖÄ…ÄÄÄÄÄÄÄÄÄÄ………ÄÄÐÐÐÐÐÁÐÁÐÐÐÐÐÐÐÐÐÄÄÖ¶Ö……Ä………Ö½ÐÐÐØÁ†ÁÁØÁ؆†ÎÎÜÜÈÈâËËËààËÈÈÈÈÜÜÈÈâ«ßÈßßßÈÈÈäÈÔÔ«àààà«ËßÔÈßß + gWV ÈÛÈÈ«Èß««ß«ààà¬à¬¬ËËËËËË´ÛȵܵÎÎÎÎÀÎÀÀÚÀÀÚÚÀÚÀÚÀÚÚÚÏÁùйÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä…ÄÄÄÄÄÄÄÄÐÐйй¹Ð¹Ð¹Ð¹Ð¹ÐÐйÐÐÐÄÄÄÄÄÄÄąֶֶֶօĶÖÄÄÄÐÐÐÐÐÐÄÄÄ…ÄÐÐÐÐÐÁÁÁÁÁÁÁÁÁÁØÐжօ………Ö¶ÖÄÐĶÐÐØÐØØÁØØØØÁÁ†ÎÎεÈÛËËàËàËâÈÈäÜÜäÈÈËâßÈÈßÈÈÈäÈäÔÜßàà¬à««ßÔÈßß«ßß  + VZ¡ÛÈȯȫÈß«««à¬à¬¬à¬ËËË´ÛÛȵµµÎÜÎÎÎÀÚÀÚÀÚÀÚÀÚÀÚÀÚÀÚÏÏÁ¹ÐÐÄÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ…ÄÄÄÄÐÐÐÄÐÐййй¹Ð¹Ð¹ÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÖÄÖÄ…Ö¶Ö¶ÖÄĶÄÄÐÐÐÐйØÐÐÐÄÄÐÐÐØÁÁÁÁÁÁÁÁÁÁÁÁØÐÐÐĶօÖֽннÐÐÐØØØÁØØÐÐÐØØÁ†ÞÎÜܵÈËËËËàËßÈäÈÜÜÜÈÈßËÈÜÈßÈÈÈäÈ ÔÔ«àà¬à«âÈ  ßßßß߫ߢ ¤U!ÛÈÈÈÈÈ«ß߫߫àବ¬¬ËàËËËÛÈÛµÉܰÎÎÎÎÎÀÚÀÚÀÚÀÚÀÚÀÚÀÚÏÁÁϹÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÖ…Ä…Ö…ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä…ÄÄÐÄÐÐÐÐйййй¹ÐÐÐÐÄÐÄÄÄÄÄÄÄÄ…ÄÄ…Ä…Ä…Ä…Ö¶ÖĶÄÖÄÐÐйÐÁÁ¹ÁÐÐÐÐÐÁÁÁÁÁÁÁÁÁÁÁÁÁÁØÐÐÐÐÐжÐÐÐÐÐÐÐÐÐÐÁØÐÁØÁÐÐÐÐÐÁÁÚºÎÎܵÛËËâËËâÈÈÜÜÜÜÜÈÈâßÈÜÈßÈäÈÔÈÜÔÜ«ààààß«ßÔÈÈÈß«ßßß«ßk µÈÈÈÈÈßÈ«ß߫߫¬à¬¬ààËËËÛÛ۵ɵµÜÎÎÎÎÀÚÀÚÀÚÀÚÀÚÚ†ÏÚÏÁÏÁ¹ÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÄÄÄÄÄÄÄÄÖÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÄÄÄÄÐÐÐÐÐÄйййÐйÐÐÄÄÄÄÄÄÖÄ…ÄÄÄÖÖÄ…Ä…Ä…Ä…ÖÄÄÄÄÄÄÐййÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁØÐÐØÐÐÐÐÐÐØÁØÁÁÁÁØÁØÁÁØÐнÐÐØÁ†ÚÝÎÜÜÈÛÛ´âËȵÜÜÜÜÔܵÈËÈÈÜÈÈÈÜäÜäµÜ «àà¬àËâÈ äÈßßßß«ßß«ßߢ  ÛÈÈÈÈȯßß߫߫«àà¬à¬ËËËËÛÈȵµÜÜÎÎÎÎÎÎÀÚÀÚÀÚÀÚÀÚÏÏÏÁÏÁ¹ÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÄÄÄÄÄÄÄÄÄ…ÄÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ä…ÄÄÐÐÐÐйййййÐÐÐÄÄ…ÄÖ…Ö¶ÖÄ…ÄֶօąąąĶÄÄÐÐÐÐÐй¹ØÁÏÏÏÁÁÁÁÁÁÁÁØÐÐÐÐÐÐÐÁÁÁÁÁÁÁÁÁÁÁÁØÁÁØÁØÁÁÁÁØÁØÁÐÐÐнÐÐØÁ†ÚºÎÜÈÈÈȴȵÜÎÜÜÎÜÜÈÛßÈÜÜÈÈÜܵÜääÜÈßààààß«ßÜ Èßßßßßß«ßßßÈȤ ¡´ÈÈȯÈßÈ߯߫ÈÈËËà¬ËËËËË´ÛÈɵµÎÜÎÎÎÎÀÚÀÚÀÚÀÚÀÚ†ÏÏÏÏÁ¹Ð¹ÐÐÄÄÄÄÄÄÄÄÄÄÄÄĿĿÄÄÄÄÄÄÄÐÄÄÄÄÄÄÄÄÖÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÄÄÄÄÐÐÐÄÐÄййййÐÐĶą…ÂÂ……ÖÄ…ÄÖ¶Ö…Ä…Ä…ÄÄÄÐÐÐÐÐÐÐÁØÏÏÏÏÏÏÏÁÁÁÁÁÁÐÐÐÐÐÐÐÐÁÁÁφÚÏÚ†Ú†ÁφÁÁÁÁÁÁÁÁØÁØÁØØÐ½ÐÐ½ÐØÁ††ÞÎܵȵÈÛÈÜκÎκÎÜÈÈÛÈÜÜÈÈܵÜÔÜܵÈËàˬà«ßÈääÈÈßßß«ßß«ßßßÈÈÍ Ÿ­ÈÈÈÈÈÈÈÈßÈÈßÈÈËËàËËËË´ÛÈȵÉܰÎÎÎÎÀÚÀÚÀÚÀÚÀÚÚφÏÁÁÁйÐÐÄÐÄÄÄÄÄÄÄÄÄÄĿĿÄÄÄÄÄÄÄÄÐÐÄÐÄÄÄÄÄÄ…Ä…ÂÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…Ö¶ÄÄÐÐÐÐÐÐÐÐйÐÐÐÐÄÄÖ…ÖÂÂÂÂÂÂÂÄ…ÄÖ¶Ö…Ä…ÄÄÄÄÐÐййÁÁÏÏÏÏÏÏÏÁÁÁÁØØÐÐÐÐÐÐÐÁÁÁÏÚ†ÀÀÚÀÀÀÚÀÚÀÚÚÚÁÏÁÁØÁØÁÁØÐ½Ð…ÐÐÐØØÁ††ÎÎÜÜܵÈÜκκÝÎÜÜÈÛÈÈÜܵÜÜÜÜÜÈÜÜÈ«àà¬à«âßµäÈÈßßßßß«ßßßÈÈÈÈä ÔÈÛÈÈÈÈÈÈÈÈÈÈÈÈÈÈËËËË´´ÛÛÛµµµµÎÎÎÎÎÀÀÚÀÚÀÚÀÚ†ÚÚÏÁÁ¹Ð¹ÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄ¿ÄÄÄÄÄÄÄÄÄÐÐÐÐÐÄÄÄÄÖÄ…Ä…Â…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÖ¶Ö¶ÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄ…ÖÂÂÂÂÂÂÂÂ…Ä…ÄÂÂÄ…Ä…ÄÄÐй¹¹ÁÁÏÏÏÏÏÏÏÏÏÁØÁØÐÐÐÐÐÐÐÐØÁÁφÀÀÎÎÎÎÎÎÎÎÀÀÀ††ÁÁÁØØØÁØÁØÐннÐÐÐÐØ††ÎÎÎÎÎܵÎÎÎÎÎÎÎÎܵÈÈÜÜܵÜÜÜܵÈÈÜÈËËËà«âÈÈäÈÈßßß«ßßß߫߭ȭÈßԤȴȴȯÈÈÈ­È­ÈÈÈÈÈÈÛËËË´ÈÛµÈɵÜÎÎÎÎÎÀÚÀÚÀÚÀÚÀÚÚÏÁÁÁÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄ¿ÄÄÄÄÄÄÄÐÐйĹÐÐÐÄÄÄÄÖÄ…ÄÖ¿…………Â………Â…Â……………Ö…ÂÂÂ…ÂÖÄÄÄÄÐÐÐÐÐÐÐÐÐÐÄÄ…Ö…ÂÂÂÂÂÂÂÂÂ…Ä…ÖÂ…Ä…ÄÄÄÐÐÐÐÁØÁÁÏÁÁÏÏÏÁÁØÐÐÐÐÐÐÐÐÐÐÁÁÏÚÀÚÀÎÎÎÎÎÜÎÎÎÀ†Ú†ÁÁÁÁÁÁÁØÁعÐÐÐÐÐÐÐÐØÁÁÚÎÎÎÎεÜÎÎÝÎÎÎÎÜÜÈÈÈÜÎܵÜÜÜÜܵܵäËËà¬àËßßäÈÈßÈßß«ßßß«ßÈÈ ÈÈßß߃Û¯â«ËÈ«ÈÈÈÈÈÈÈÈÈÈÈÈÛ´´ÛÛÈÈɵµµÎÎÎÎÎÀÎÚÀÚÀÚÀÚÀÚÁÁÁÐØÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄ¿ÄÄÄÄÄÐÐгййÐÐÐÄÄĶÖÄÖ¶Ö¿Ö………………Ö………Ö……Ä…ÄÂÂÂ………ÖÄÄÄÄÐÐÐÐÐÐÐÐÐÄÄÖ…ÂÂÂÂÂÂÂÂÂÂ……ÄÂ…Ò…Ä…ÄÄÄÄÐÐйØÁÁÁÁÁÁÁÁÁÐÐÐÐÐÐÐÐÐÐÁÁÁÚÀÚÎÎÎÎÎÎÎÀÎÚÀ†ÁÁÏÁÁÁÁÁÁÁÁÁÁØÁÐÐÐÐÐÐÐØÁÁ†ÚÎÎÎÎÜÎÎÞÎÎÎÎÎÎܵÈÈÎÎܵÜÜܵµÜµÜµßËàËßËÈÈäÈÈßß«ßßß«àßßß­ ßßßß« ´Û¯Û«ßÈÈ­ÈÈÈ­äµµµÛÛÈÛÈÛÛȵȵµµÜÎÎÎÎÀÚÀÚÀÚÀÚÀ†ÚÏÁÁÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄ¿ÄÄÄÄÄÐгйÃÁÃйÐÐÄÄÄÄÄÄÖÄ…ÄÖÄÖÄÒĶÄÖĶÄÄÄÄÄÂÂÂÂ………ÄÄÄÐÐÐÐÐÐÐÐÐÄÄÖÖ…ÂÂÂÂÂÂÂÂÂÂ…ÂÖ…Ò…Ä…ÄÖÄÄÄÐÐй¹Ð¹Ð¹ÐÁÁÁÁØÐÐÐØÐØÁØÁÁÏÚÀÎÎÎÎÎÀÀÚÚÚÁÁÁÏÁÁÁÁÁÁÁÁچφÏÁÁÁØÐØØØØÁÁÁ†²ÎÎÎÎÎÎÎÝÎÞÎÎÎÎÜÈÈÈÜÎܵܵµÜܵÜÜÜÛËà¬à«âÈÈÈÈßßßß«ßß«ßßß­Èßß߫߫ ¢ÔÛ¯Û«ÈÈÈÈÈ­ÈÈȵµµµµÈÛÈÛÈÛÈÈɵµÜ°ÎÎÎÎÀÀÚÀÚÀÚÀÚÀ†ÏÁØÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄ¿ÄÄÄÄÄгй¹Ð¹ÃÁÃÐÐÄÐÄÄÄÄÄÄÄÄÄÄĶֶÖÄÄÄÄÄÄÄÄÐÐÂÂÂ………ÄÄÄÐÐÐÐÐÐÐÐÐÐÄÄÄ………ÂÂÂÂÂÂÂÂÂÂ…Ä……Ö…Ä…ÄÄÄÄÄйعÁعйÁÁÁÁØÐÐÁÁÁÁÁÁÚÚÚÀÎÎÎÀ†ÚÚÁÁÁÁÁÁÁÁÁÁÁÁÁÁÏÚ†ÀÚÚ†ÏÁÁÁØÁÁÁÁØÁÁ†ÚÎÞÀÎÎÎÞÚ²ÎÎÎÎÎܵ۵ÜܵÈܵȵÜÜÜÎÜÈËˬËÈÈßÈÈÈÈßßßßß߫߫«ßߥßßßß«àà‡Û¯Û¯ÈÈÈÈÈ­ÈÈȵܵµµµµÈÛÈÛÛÉȵµµµÜÎÎÎÎÀÚÀÚÀÚÀÚÀ†ÚÁÁÁØÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄ¿ÄÄÄÄÄÐÐйÐùÃÁù¹ÃÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐ………Ö…Ö¶ÄÐÐÐÐÐÐÐÐÐÐÄÄÄ…Ä……ÂÂÂÂÂÂÂÂÂÂÖ…ÄÂÄÖ…Ä…ÄÄÄÐÐйÁÁÁйÐÁÁÏÁÁÁÁÏÁÚÚÚÚÚÀÎÀÎÚ†ÏÁÁÁØÐÐØÁÁÁÁÁÁÁÁÁφÀÚÀÀÚÚ†ÏÁÁÁÏÁÁÁÁÁÚ†ÀÚ²ÎÎÎΆÚÎÀÎÎÎεÛȵµÜȵµÈÈÜÜÜÎÎÜÈâËàËÈÛÈÈÈÈßȫ߫«««à«ßßßßߥ߫à˴˯ÛȯÈÈÈÈ ÈÜԵܵµÜÈȵÈ۵ȵ۵ܵÎÎÎÎÎÀÀÚÀÚÀÚÀÚÀÚÏÁÁÁÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄ¿ÄÄÄйй¹ÃÁÏÁÏÁÃù¹ÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐйÁÖ…Ö¶ÖÄÄÐÄÐÐÐÐÐÐÐÄÄÄÄÄÖ…Ä…ÂÂÂÂÂÂÂÂÂÂ…Ä…Ö……Ö…ÖÄÄÐÐйÐÁÁ¹¹Ð¹ÁφÚÚÏÚÚÚ²Ú†ÚÀ†ÚÚ†ÏÁÁÏÁÐÐÐÐÐØÁØÁØÁØÁÚ†ÀÚÎÚÎÚ†Ú†ÚÚ†ÚÁÁÁφ†ÚÎÀÀÎÎÎÎÚÎÀÎÎÎεÛÛÛȵµÈȵµÜÜÎκÎÎÈÛËàËÈÈÈÈÈÈÈßßß߫߫à«Ëßߥ¥¥¥¥«àà‚ËËË«ÛÈÈÈÈȮԵÜܵܵµµÛȵÈȵȵµµÎÜÎÎÎÀÞÀÀÚÀÚÀÚÀÚ†ÁÁØÁÁÁعØÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄĹйÃùÃÁÏÁÏÁÏϹÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄйÐÁÃÏÄÒ¶ÖÄÄÄÄÐÐÐÐÐÐÐÐÄÄÄÄÄÖÄ…ÖÂÂÂÂÂÂÂÂÂÂ…ÖÄÂÄ…Â…ÂÄÄÐÐÐййй¹ØÁÚÚÀÚÀÚÀÎÎÀÚ††ÚÁÁÁÐÐÐÐÐÐÐÐÐÐÐØÐÐÁÁÁφÚÚÀÚÀ†ÚÚ†ÚÁÁÏÁÚÚÚ†ÚÀÀÀÚÎÎÎÎÎÀÚÎÎÎÎܵ۴ÈÛÈÈȵÜÜÜÎκÞÝεÈâàËÈÈȵÈÈÈÈßßßß«åË૫ߥߥ¥¥åàË«‚ÔËËËÛ«ÈÈÈȭܵÜÔÜÎܵܵµÉȵÈÈÉÈɵµÎÎÎÎÎÀÚÀÚÚÀÚÀÚÀÚÁÁÁÁØÁÁعØÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄййÏÃÁÏÁÏÏÏÏÁϹùййÐÐÐÐÐÐÐÐгййØÃÁÁÏÄÄÖÄÄÄÄÐÄÐÐÐÄÐÐÄÄÄÄÄÖ¶ÖÄ…ÂÂÂÂÂÂÂÂÂ…Ä…Â…Â……ÂÖÄÄÐÐÐй¹Ð¹Ð¹ÁφÀÚÀÀÎÎÀÀÚ†ÏÁÁÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁØÁÁÁÚ†ÀÚÀ†Ú†ÏÁÁÁÁÁφچÚÀÚÎÀÎÎÎÎÎÎÚÎÚÎÎÎܵÛËÛÈɵÜÜÎÎÎ݆چÚÎÜÈÛàÛÈÈÈܵäÈÈÈÈßßß««àßߥ¥¥¥¥«à««¡¤ËËË´«ÛÈÈÈÈÈ®ÜÔµÜÎÜܵÜÉȵȵ۵ɵµÜÎÎÎÎÀÞÀÚÀÚÚÀÚÀ†ÚÁÏÁÁÁÁÁÁعØÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄй¹¹¹ÏÃÁÏÏÏÏÏÏÁÏÁÏÏÁÁÐÁ¹Ð¹Ð¹Ð¹ÐйÐϹÃÁÁÁÏÄÄÄÄÄÄÄÄÐÐÐÄÄÄÄÄÄÄÄÄÄÖ¶ÖÖÂÂÂÂÂÂÂ…………Ä…Ò…ÂÂÖ¶ÄÄÄÐÐÐй¹ØÁÁφÀÀÎÎÎÎÀÚÚ†ÏÁÐж……ÄÄĽĶÐÄÄÐÐÐÐØÁÁÁÁÁÚ†Ú†ÏÁÁÁÁÁÁØÁÁÚ†Ú²ÎÎÎÎÎܵÎÎÀÚÚÀÀÎÎÜÛË˴ȵÜÎÎÎΆ†††Ú†ÎµµÛË۵ȵÜܵäÈÈÈÈßßßË૫ߥ¥¥¥¥¦««« ËË˫۫ÈÈÈÈÔä®ÜÜÜÔÎܵµµÉȵȵ۵ɵµÜÎÎÎÀÀÚÀÚÀÚÚÀÚÀ†ÁÁÁÁÁÏÁÁÁØÁÐØÐÐÐÐÄÄÄÄÄÄÄÄÄÄÐй¹Ï¹ÁÃÁÏÀ¸ÀÏÏÏÏÏÏÏÏÏÏÁÁййй¹Ï¹¹ÏÁÏÏÏÏÐÄÄÄÄÄÄÐÐÐÐÄÄÄÄÄÄÄÄÄÖ¶Ö¶Ö…ÂÂÂÂÂÂ…ÂÖÄ…ÒÂ……Ö¶ÖÄÄÄÐÐÐÐÐÁÁÁÚÚÎÎÎÎÎÚÚ†ÏÁÁØÐ¶…ÂÂÂ………Ö………Ö¶ÄÐÐйØÁÁÁÁÁÏÁÏÁÁØÁØÁØÁÁφÚÀÀÎÎÎεµÉµÎÚ†††ÚÀÎÜÛËËÛµÎÚΆچ†††††††ÜµÛË۵ܵÜÜÜÜÔÜÈÈßÈß«à«ß¥¥¥¥¥§««« ´ËËË«ÈÈÈÈÈ­µÜÔÜÎÎÎÎܵɵÉÈÉȵ۵ÉܰÎÎÎÀÎÀÚÀÚÀÚÚÀ†ÏÁÁÁÏÁÁÏÁÁÁÁ¹ØÐÐÐÄÐÄÄÄÖÄÄÄÄÄйع¹Ã¹ÏÏÏÏÀÀÀÀÀÀÀÀÀÚÚÏÏÁÏÁùϹÏÁÁÁÏÏÏÏÏÏÐÐÄÐÐÄÐÄÐÐÄÄÄÄÄÄÄÄÄÄÄÖ¶Ö……ÂÂÂÂÂ…Â…Ä…ÒÂ…ÖÄ…Ö¶ÄÄÐÐÐйÁÁÏÚÎÎÎÎÚÚÚÁÁÁÁØÐÐ…ÂÂÂÂÂ……ÂÂ…………ÖĶÐÐØ¹ØÁÁÁÁÁÁÁØÐÐÐÐØ¹ÁÁÁφÚÀÎÎεÛÈÜÎÚÁÁÁφÀεÛË۵Ά†Ú†ÁÁÁÁÁÁ†ÁÚÎÜÈËÈܵÜÎÜÜÔÜÔÜÈÈÈȫ˫ßߥ¥¥¥§¦Ë«««ß Ê«ËË´Û¯ÈÈÈ®ÜÔµÜÜÔÜÎÜܵµÛµÉȵ۵µµµÎÎÎÎÀÀÚÀÚÀÚÀÚ†ÚÁÁÁÁÁÏÁÁÁÏÁÁعÐÐÐÄÄÄÄÄÄÄÄÄÄÄÐÐÃÁÃй¹ÃÁÏÀÀÀÀÀÀÎÀÎÀÀÚÏÏÁÏÁϹϹÏÁÏÏÏÏÏÏÁÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÖ¶Ö¶Ö………ÂÂ…Â………Ò…ÂÄ…ÄÖ¶ÖÄÄÐÐйÐÁφÀÚÀÚ†ÚÁÁÁÁØÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄÐÐÐÐÐÐÐÁÐÁØÐÐÐÐÐÐÐØØÁÁ†ÚÚÚÎεµÈÜΆÁÐÐÁÁÚÀεȵµÚÁØÁÁÁØØØÁÁØÁÁ†ÎεâµÜÎÎÎκÝݺÔÜÈäÈ߫˫ߥ¥¥¥¥§««ßÍÈÈËË˯ßÈÈÈÈÔÜÔÜÜÎÎÎÜÎܵµÉµÉȵɵµÜ°ÎÎÎÀÎÀÞÀÚ†Ú†Ú†ÁÁØÁÁÁÏÁÁÁÏÁÁÐÁÐÐÐÄÄÄÄÄÄÄÄÐÐĹÐÃÁ¹Ã¹¹ÏÏÏÀÀÀÀÎÎÎÎÎÎÀÚÏÏÁÏÏÏÁÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÖ¶Ö¶Ö¶……………Â…Â…Â…ÒÄ…Ä…ÄÄÄÄÐÐÐÐÐÁÁÚÚÚ†ÚÁÏÁÁÁÁÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ä…ÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐØ¹ÁÁÏÚ†ÀÎܵÜÎÚÁÐÐÐÐÁÁÚÀÎÜÜÎÚÁÐÐÐÁØÐÐØØØÁØÁÚÎÎÜÛµÎÎÎÎ݆††ÝºÔÔÔÈÈ«««ß­¥¥¥¥§«««««« È´´ËËÛ¯ÈÈÈÔÜÔÔÜÎÜÎÎÜܵµÈȵÈÉȵɵµÜÎÎÎÎÀÚÀÚÀÚÀÚ†ÏÁÁÁÁÁÁÁÁÁÁÁÏÁÁÐÐÐÄÄÄÄÄÄÄÄÄÄÄÐйй¹Ðù¹ÃÏÚÀÎÎÎΰÎÎÎÀÀ¸ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏϹÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÖ¶Ö¶Ö………Ö……Â…Â…Â…ÂÄ…Ä…ÄÄÄÐÐÐйØÁÁÁÁÁÁÁÐÁØÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â………Ö……ÄÐÐÐÐÐÐÐÐÐÐÐÁØÁÁÏÚÀÎÎÎÀ†ÁÐжÐÐØÁÚÀÀÀÚ†ÁÐ…ÐÐÐÐÐÐÐÐÐØÁÁ†ÎÚÎÈÜÚÝΆ†††††ÝºÜÔÔȫ߫߭­¥¥¥§¥à«ß««ß‚Û¯ËËË«ÛÈÈȵÔÜÜÎÜÎÎÎÎÜεÈÈÛµÈÉȵµµÎÜÎÎÎÎÀÚÀÚÀ†ÚÚÁÁØÁØÁÁÏÁÁÁÁÁÁÁØÐÐÐÄÄÄÄÄÄÄÄÄÄÐÐйÐÐÐййÏÏÀÎÎÎÎΰÎÎÎÀÀ¸ÀÏÏÏÏÏÏÏÏÏÏÏÏÏϹййÐÐÐÐÄÄÄÄÄÄÄÄÄÖ…ÄÖ¶Ö¶…ÖÄ…ÖÂÖ……ÒÄÖÄ…ÄÄÄÄÄÄÐÐÐÐййعÐÐÐÐÐÐÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÄÐÐÐÐÐÐÐÐÐÐØÁÁ†ÚÎÀ†ÁÁÁж…ÖÐÐÁÁÚÁ†ÁÁÁÐ………ÐÐÐ½Ð¶Ð½ÐØÁÁ††ÎÈΆ†††ÁØØÁ††ÝºÜÔÈß«ßßÈ ­¥¥¦¨«߫˫߫ Õ«Ë´ËâË«ÈÈÈȵÔÜܺÎÎÜÎܵµµÛÛ۵ȵ۵µÜÎÎÎÎÎÀÀÚÀÚÚ†ÚÁÁÁØÁØÁÁÏÁÁÁÏÁÁÁÐÐÐÄÄÄÄÄÄÄÄÄÄÄÐÄÐÐÐÐÄгй¹ÏÀÎÎÙÎÎÙÎÎÀÀÀÀÏÏÏÏÏÏÏÏÏÏÏÏÏùÐййÐÐÐÐÄÄÄÄÄ…ÄÖÄÖ…ÄÖ¶ÖÄ…ÖÄÂÖÂÖÂÖ…Ä…ÄÖÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÄÄÄÄĶ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö¶ÄÄÐÐÐÐÐÐÐÐÐÁÁφÁÁÐÐÐÐ…Ö…Ä¶ÐØÁÁйØÐÐ…ÂÂÂ…Ä………Ö…Ö½ØØÁ†ÚεÎÁÁÁØØÊØØØÁ†ºÔÔÜÈ߫߭­ ­¥¥¥««àË«ß˫߭´¯ËËË«ËÈÈÈÈäµÜÔÎÜÜÎܰܵÛÈ´´ÛÈȵÈɵÎÎÎÎÎÎÀÎÚÀÚÚ†ÁÁØÁÐÁÁÁÁÁÁÁÁÏÁÁØÐÐÄÄÄÄÄÄÄÄÄÄÄÐÐÐÄÄÄÄÄÄÄĹÏÏÀÎÀÀÀÀÀÎÀÀÀ¸Ï¸¸ÏÏÏÏÏÏÏÏÏÃù¹¹Ð¹ÐÐÐÐÄÄÄÄÄ…Ä…Ä…ÄÖ…ÄÖ¶ÖÄ…ÒÖÂÖÂ…ÒÄ…Ä…ÄÄÄÄÄÄÄÄÄÐÐÐÐÐÄÄ…Ä…Ä…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…օĶÄÐÐÐÐÐÐØÁÁÁÁÐж¶Ä…Ä……ÄÐÐÐÐÐÐÐÐÐ…ÂÂÂÂÂ……Â…Â…¶ÐÐÐØÏ†ÎΆÁÁØÐ½ÐØØØØ†ÝººÔÈßßÈ  ­­¥¥¥««ß«««««Ë¢«ÈËÈ««Ë߯ÈÈÈÜÜÜÜÎÎÎÜÎܵµÈÛ´ËËÛÛȵȵµÎÎÎÎÎÎÎÀÚÀÚÚÁÁÁØÐÐÁÁÁÏÁÁÁÁÏÁÁØÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄйÏÀÀÀ¸¸ÀÀÀÀÀÀ¸¸ÏÏÏÏÏÏÏÏÏÏÃÃùй¹Ð¹ÐÐÐÐÄÄÄÄÖ…Ä…Ä…ÄÖ…ÄÖ¶ÖÂ…Â…Â…ÂÂ…Ä…ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â……ĶÄÄÄÄÐÐÐÁÁØÐÐ…………Ä…Ä…ÄÄÐÐÐÐж………ÂÂÂÂÂÂÂÂÂÂÂ…ÄÐÐÐÁÁ†Î†ÁØÐ½Ð½ÐнØÁ†ÝºÜÈß«ÈÈ  ­¥¥¥ß««ßß«Ëß«««¢‚â«ÈËâË««ÈßÈȵÜܺÜÎÎεµÜµÛÛ´ËË´´ÛµÛµÜµÎÎÎÎÎÎÎÀ†Ú†ÁÁÁÁÐØÐÁÁÁÏÁÏÁÁÁعØÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÃÏÏÏÏÏÏÏÏÀÀÀ¸ÏÏÏÏÏÏÏÏÏÏÃÃÃù¹Ð¹¹ÐÐÐÐÄÄÄÄ…ÄÖ…Ä…Ä…ÄÖ…ÄÖ¶ÖÂÖÂÖÂÂÂ…ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…ÄÄ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Ö…ÄÖÐÐÐÐÐÐÐÄ…………¶…Ä………ĶÄÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¶ÐÐÁØÚΆÐнÄÕÐ½Ð½ÐØ†ÝݺÈÈßÈ Ô­­¥­¥«ß««ȫ˫«««ß˫⫫«ßÈÈÈÈÈÜÜÜÎÎÎÎܵܵµÈÛËËËËË´ÛÈ۵ܵÎÜÎÎÎÎÞÀ†ÏÁÁØÁÐÁØÁÁÁÁÁÁÁÁÁÁÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄйÃÏÃÃÃÃÃÏϸÏÏÏÏÏÏÏÏÏÏÏÃÏù¹Ð¹Ð¹Ð¹ÐÐÐÄÄÄÄ…ÄÖ…Ä…Ä…ÄÖ…ÄÂÂÖÂÒÂÖÂÖÄÄÄÄÄÄÄÄÄÖÄÄÄÄÄÄÄÄÖ¶Ö…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â………Ö¶ÄÐÐÐĶ…………………………………ÖÄ……ÂÂÂÂÂÂÓ»×ÂÂÂ×ÂÂÂÂÂ……ÐÐÐÁÎÁЅąֽнн؆††ºÜÈ«ÈäԠȥ­­ß«à«ËÈßË˫˫ȡȫ˫â«ß«ßÈÈÈȵÜÜÔÎÎÎεµµÉÈÛËËËËËË´ÛµÈɵµµÜÎÎÎÎÚÚÁÁÁÁÁØÐÐÁÁÁÁÁÁØÁÁØÁÐÐÐÐÄÐÄÐÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĹÃùùÃÃÏÏÏÏÏÏÏÏÏÏÏÏÏÏÃÃù¹Ð¹Ð¹ÐÐÐÐÄ…Ä…Ä…ÄÖ…Ä…Ä…ÄÖÂÖÂÂÂÂÂÂÒÂÖÄÄÄÄÄÄÖ¶Ä…ÄÄÖ¶ÄÄÄÄÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂ……ÄÄÄĶą…………………………………Ä……ÂÓÓÂÂ×Ó»Ó»×Ó×»ÓÓÂÂÂÂ…¶ÐÐÁ†Ø…………¶Ð¶Ð½ÐØÁ††ÝÜÈÈȵ ­¥È Èßß««ßßäÈà«ËË«­­ ¢«Ë«Ë«««ÈÈÈÈÈȵÜÜÎÎÎÎεɵµÈÛËËËËËË˴۵ȵܵ°ÜÜÎÎÎÚÁÁÁÁعØÐÐÐÁØÁØÁع¹ÐØÐÐÐÐÄÄÐÄÄÄÄÄÄÄÄÄÄÄ¿ÒÄ¿ÄÄÄÄÄÄÐÃÄÄÐùÃÏÃÏÏÏÏÏÏÏÏÏÃÃùÐйÐÐÐÐÐÐÐÄÄ…Ä…Ä…ÄÖ…Ä…Ä…ÂÖÂÂÂÂÂÂÂÂÖ¶Ö¶Ö…Ö…ÄÖ…Ä…Ö…ÖÄÄÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â……Â…ÄÄÄÄÄ…Ä………………Ä………ÂÖж…ÂÂÓ»×ÂÓ»Ó»Ó»Ó»Ó»ÂÓ×ÂÂÂ……¶Ø†Ð…………ֶնнØÁ††ºÜµÈÈÈÜÈÈ­ Èß«««ßßÔßËËËàà­­‚à«Ë««««ßßÈÈÈÈÈÜÜÜÎÎÎÎεµÈÉÛ´ËËààËË´ÛÛµÈɵܰÜÜÎÎÚ†ÏÁÁÁØÐÐÐØÐ¹Ð¹Ø¹ØÐØÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÄÖÖ¶ÒÄÒ¿Ä¿ÄÄÄÄÄÄÄÄĹÃÃÃÏÏÏÏÏÏÏÃÃÃÃÃÐÐйÐÐÐÐÐÐÄÄÄ…Ä…Ä…ÄÖ…Ä…Ò…ÂÂÂÂÂÂÂÂÂÂÖ¶Ö¶Ö…Ä…ÄÖÂ…¢‡‡¶Äą„‡‡Â¢ …ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…Â……ÄÄÄÄÄÄąĶ…………Ö¶…Â…ÐÐÄ…ÂÓÓÓ¡ÅÓ»ÓÓÓÓÓÂÓ»×»ÂÂ……ØÁÐ…………¶ÖĽÐÐØÁ†††ÜµÈȵ­ÈÈ  Èß߫߫ßÜßËààààÈ­« àà««««««ß«ÈÈÈȵÜÎÜÎÎÎܵÈÛÈÛËËˬ¬ÌËË´ÛÛµÈɵܵÎÎÎÀÚÁÁÁÁÁØÐÐÐØÐÁйعÐÐÐÐÐÐÐÄÄÄÐÄÄÄÄÄÄÄÄÖ¶ÖÖÂÒ¿ÒÒÒÒ¿¿ÄÄÄÄÄÄÄĹÃÃÃÃÏÃÃÃÏÃùÐÐÐÐÐÐÐÐÐÐÐÄ…ÄÄ…Ä…Ä……Ä…Ò…ÒÂÂÂÂÂÂÂÂÂÂÂÖ¶ÒÂÖÂÂÂ…ÒÒÄÄ……ÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…Â……ÄÄÄÄÄÄÄÄÄÄÖ¶Ö¶Ö¶……ÖÐÐÐ…ÂÂÓÓ¡ÅÆÅÓÓÓÓÂÓ»×»×ÂÂÂ…ÐØ¶Â…Â……¶…Ö½ØÁ†††ºÎÜÈÈÈÈÈÈ  ­ßß«ßßÈÔÈààààà­ «¥àà««««ß«ßÈßÈÈÜÜÜÎÎÎÜεÉÛÛÛ´Ëˬ̬¬àË´ÛÈÉÈɵÜÜÎÎÚ†ÏÁÁÁÁÐÐÐÐÐÐÐÁÐÐØØÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÄÖÄ¿ÒÒÂÒÂÒÂÒÒ¿¿¿¿¿ÄÄÄѹ¹ÃÃÃÏÃù¹Ã¹ÑÐÐÐÐÐÐÐÐÐÐÄÄ…ÖÄ…Ä………………ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ò…Ò‡ÖÄÄ……‚ÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â…Â…Â……Ö¶ÄÄÄÄÄÄÄÄÄÄÄÄĶօ…ÄÐÄ……ÂÂÂň¢‡Å‡‡ÅÓÂÓÓÓÓÓ»Ó¶ÐÖÂ………Ä……½ÐØÁ†††ÎºµÈÈÈÈÈÈÔÔÈÈß«ßßÈÔÈàààààÈ « ààààà«««ßÈßÈÈȵÜÎÜÎÜÜÜܵ۴۴ËËˬ̬¬ËËËÛÈÉȵµÎÎÎÀÚ†ÏÁÁØÁÐÐÐÐÐÐÐÐÐйÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄÖ…ÄÒÂÒÂÒÂÒÂÒÂÂÒÒÒÒÒ¿¿ÄÄѹ¹¹ÃÃùÐÐĹÄÐÐÐÐÐÐÐÐÐÄÄÄĶÖÄ…………ÂÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒÂ…ÒÅÄÐą„¡™…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…Â………¶ÖÄÄÄÄĶÄĶĶÄÄÖ¶ÄÐÐж…ÂÂÂÂÅšÇÇÅÅÓÓÓÓÓÓÓ×»×ÂÂÖÐ…ÂÂ…Ä………ÄÐÁÁ†ÚΆÎÜÈÈÈÈÈ ÔÔÈÈÈßÈßäÝßàààààà­Ô«¬¬àà««««ßÈÈÈȵµÜÎÎÜÎܵÉÈ´´ÛËËËà¬ÌËàËË´ÛÛÛµµµÎÎÀ†ÚÁÁÁÁØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄĶÖÂÂÒÂÒÂÒÂÂÂÂÂÂÂÂÒÂÒÂÒ¿ÄÑÃйĹÐÃÄÄÄÄÐÐÐÐÐÐÐÐÐÄÄÄ…Ä………ÂÒÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…š¶ÐÄą¤ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…Â……Ö¶Ö¶ÖÄÄжÐÄÐÐÄÐĶÄÐÐÐÐÄ……ÂÂÂÂÅ»ÓÓÅÇÓÓÓÓÓÓÓÓ×»ÂÂ…ÐÂÂ……Ö……ĽÐÁÁÁÚÎÎÎܵÈßÈÈÜÔÔÔÈßßÈÈÔÝÈàààààà­Ô« ¬à¬à««ßÈÈÈÈÈÈÜÜÎÎÜÜÜܵ۴˴ËËËàËà¬ËËË´´ÛÈÛµµÎÎÎÚ†ÚÁÁÁÁØÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÖÄÄÄÖÖÂÒÒÂÒ»ÒÂÒÂÒÂÒ¿ÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÄÄÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…… ¿ÐÐÖ…Âň‡ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…ÂÂ………Ö¶…¶ÄĶЅÐÐÐÐÐÐнÐн…Ä………ÂÂÂÓÓÅÅ»ÓÓÓÓÓÓÓÓ»ÓÂÂÂÄ…Â…Â………ÄÄÐÁÁÁ†À†ÎÎÜÈÛÈÜÔÜÔÜ ÈßÈÈÔÝ߬ààààà Ôßà««ß«ßßÈÈȵµÜÎÎÜÎܰµÛËË´ËËËËËËàËËËËË´ÛȵÜÜÎÎÀÚÁÁÏÁÁØÐÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄ…ÄÖÄĶÖÖÂÒ»ÆÂÒ»ÒÂÒ¿ÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……‡ÖÄÐąš¢‡ÂÂÅšš…¡ „šÂšł‡šÂÂ…š¢¢Ä………ÄÄ…‚„¢¡ÂнÐÐÐн‚¢¢¡Ó…Â…š‚˜šššÓš˜»ÓÓÓӻ»ÂÄ…Â…………ĶÐÁÁÁΆÚÎÎÜÈȵÜԺܮÜÈßÈÈÔÝÈàààààà­Ôß«¬à««ß«ÈÈÈȵÜÜÎÎÎÜÎܵ۴ËË´ËËËËËËàËËË´Û´ÈɵÜÎÎÚ†ÚÁÁÁÁØÐÐÐÐÐÐÐÐÐÐÄÄÄÄÄÖÄÖ…Ö…ÄÂÄÄÄÄ…¿Â»»Æ»Æ»ÒÂÒ¿ÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÄÄÄÄÄ…Ö………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………˜ÂÄÐÄ……š—ÂÂÅ…»ÂÓš¡ÆÂ š¡‡Ä„‚Ò…Ä…Å  ÅÐÐÐÐÅ ¤š¶…ˆÓ¢¢ÂÓÓÓÓÓ»×¶ÂÂ……ĶÐÐÐØÁÀÚ†ÀÞÎÈÈÜÜÎÔºÜÔÈÈÈÈÔÝ߬àààà­Ý¥©¡¬à«Ë««ßßÈȵµµÜÎÎÎÎÜεµÛË´Ë´ËËËËËËËËËËËÛÛµÉÜÎÎÎÚ†ÏÁÁØÁÐÐÐÐÐÐÐÐÐÐÄ…ÖÖÄ…Ö…Ö…Ö¿…ÄÄÄÖÂÒ»»»Ò»Ò»ÒÂÒ¿¿ÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÄÄÄ…Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………¶ÐÄÖÖ‡—ÂÂÅ…»—šÂ»‡ Ò¡—šÄ…Ä¢ — ÐÐØÁ ¤—¤…ĈÓÅÓÓÓ»×ÓÂÂ…ÂÂ…Â……ÄÄÐÐÐÐÁÚ†Ú†ÎÎȵÜÜκÜÔÜÈÈäÈÔÝßàà¬àààÈãÈà««ß«ÈÈȵÜÜÜÎÎÎÎÎÜÜÉÛ´ËËËËËËËËËËËË´´´ÈȵµÜÎÀÚÚÁÁÁÁÐØÐÐÐÐÐÐÐÐÄÄÖ¶Ö…Ä…ÂÂÒ…Ò…Ò¶ÄĶÖ»»»Ò»Æ»ÆÒÒ¿¿¿Ä¿ÄÄÄ¿ÐÐÐÐÐÐÐÐÄÄÄÄÄ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¿…¢¡¿ÄжÂˆÂ¤ÂÆÅ…Â‚ǚ¢»Â‡—¡‡Âš‡…ÄÂ…¡šÁÁšÂ…¡ÄÅšš˜šÓÓÓÓÓÓ»×»×ÂÂÂÂÂÂ……Ä…ÐÐØÐÐÁÁÏÁÚÀεµÜκ޺ÜÜÈÈäÈÝÝ߬ààààà­Ý­ß¬¬¬à«««ß«ÈȵµÜÜÎÎÎÎÎεµÈÛËËË´ËËËËËËË´ËËÛÛȵµÜÎΆ†ÏÁÁÁØÐØÐÐÐÐÐÐÄÄÖ¶ÖÂÖÂÖÖ…ÖÒÂÂ…ÖÄÐÄ…Ò»»»»»»»ÆÒÒ¿¿Ò¿¿¿ÄÄÐÐÐÐÐÐÐÐÐÄÄÄ…Ä…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö…¡‡ÄÄÄÖš¢»¤ÂÆÅ…Âńҡ‡¡¶……¡¶šÐÐй ÃÐ ‡ÐÐÐÐ —½ÐÄÐÆ»»Å¶ÇÅÓÓÓÓÓÓÓ»×»ÂÂÂÂÂÂÂ…ÄÄÐÐÐÐÁÁÁÁÁÁ†ÎܵÜκÝÎÜÔÈÈääºÝßà¬ààäͭ߬¬à«««Ë«âÈȵܵÜÜÎÜÎÎÎÜÉÈÛ´ËËËËËËËËËËË´´´ÛÈȵÜÎÎÚÚ†ÁÁØÁØÐØÐÐÐÐÄ…Ä…ÖÂÖÂÖÂÂÂÖÂÂÂÂÖÄÐÄÖ»»»»»Æ»ÒÒ¿¿ÒÒ¿Ò¿ÄÐÐÐÐÐÐÐÐÄÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¶…ÂÄÄ…¡Æ¤ÂÆÅ…šÂÂÂÅ‡š…‡¢Â……ÖÂÄ¡‡ÐÐÐТÁŸmšÐÐÐнÖÐÆÂÂŶ»ÓÓÓ»ÓÓÓÂÓ»×ÂÂÂÂÂÂÂÄ…ÄÐÐÐÐÐÁØÁØØÚ†ÎÜÜΆ†ÎÜÜÈÈ ÜÝÝßàà¬àËà­Ý­ßà¬à¬àà«««ËËÈÈȵÜÜÜÜÜÜÎÎܵÈÛ´ËËËËËËË´Ë´ËË´´ÛÈɵµÎÎÀ†ÏÁÁÁععØÐÐÐÄÄ……ÂÂÂÒÂÂ…ÖÂÂÂÒÖÂÄÐÄÄÖ»»»»ÆÂÒÒÒ¿ÒÒ¿ÒÄÐнÐÐÐÐÐÄÄÄ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Ö……š¶…Ä—Â¤ÂÆÅ…„‡Â—šÅ‡ˆÂ……ł҅……Ö¢‡Ä‚¤ÐÐÐÐÁÁÁÁƒ½ÐÐÐÁ½¤¡Ä…ÐÒÂÂŶÓÓÓÓÓÓÓ»Ó»×»ÂÂÂÂÂÂÂ…ÖÐÐÐÐÐÐйØÐÁÁÚεÜΆ†ÎܵÈÈÜ ºãÈàààËÈÍÈß«àà©©«««ËË«ËÈÈÈÜܰÜεÜÜÎÉÈÛÛ´ËËËËËËËËË´Û´â´ÛȵÜÜÎΆ†ÁÁØÁйØÐÐÐÐÄÖÖ……ÂÂÂÂ…Â……ÂÂÖÂÖÄÐÐÄ…Ò»»»»Æ»ÒÒÒÒÒÒÂÄÄÄÐÐÐÐÐÐÐÄ…Ä…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………… ¡ÂÖ…ÂÂ—ÂÆÅ……‡ÒšŇ¡ÂÂÂÂ………¶¡¤ÄšÄÐÐÐÐÁÁ‡ØÁÁÁØÁ¢¢ÐÄÐÒ…Â×¶»ÓÓÓÓÓÓÓÓÓÂÂÂÂÂÂÂÂÂÂ…ÄÐÐÐÐÐÐÐØÐÐÁÚÎεÎÀ†ÜµÜÈÜÜܺºßàà¬à«àÈÔ ß«àà©ààà«à««âÈÛ۴۵ܵܵµµµÜµµÈÛ´ËËËËËËËË´Û´â´ÛÛȵµÜÎÎÚ†ÁÁÁععØÐÐÐж……ÂÂÂÂÖÂÒÂ…ÒÂÒ…ÂÄÐÐÄÄ…Ò»»»»ÆÂÒÒÒÒÒÒÄÄÄÄÐÐÐÄÐÄÄÄ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………¡‡¿… ÒÂ¤ÂÆÅ…¤¡ÆÂ»»Â‡҅…š…………Öš…¤š¶ØÐÏ¢¢¹ÁØÁÁÁ ÄÄÐÄ……¶»Ó»ÓÓÓÓӻ»ÂÂÂÂÂÂÂÂÂ…ÄÄÄÐÐÐÐÐÐÐÐÁÁÚܵκÎÜȵµÜÜÜÔÜÈàà¬à««ÈÔ­È«à¬à¬à«à«ËÈ´ËÈÛ´ÈܵµµµµµµÎµÈÈÛ´ËËËËËËËË´â´ÛÛÈÛȵÜÎΆ†ÁÁØÁØÐØÐÐÐÐÐÖ¶ÂÂÂÂÂÂÂÂ…ÂÂÒ…ÄÖÄÄÐÐÄÖ»»»»ÒÂÒÒÒÂÂÄÄÄÄÄÄÄÐÄÄÄÖ¶…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………š×…¡¡ÒÂ¤ÂÆÅ…¡ÆÂÂÂÂ…ÂÂ…‡Ä҅šÅÂ………¶šŽ‚‡ÁØ¢¢ÏÁÁÁÁÁ¡‡ÐÐÐÖ¶Ö¶»ÂÓÓÓÓÓÓÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄÄÐÐÐÐÐÐÐÁÁÚµµÎÎεµÜµÜÜܺÔßËà¬à«ËßÔ ßßàà©ààË«ËÈÈÈ´ÛÛ۵ܵµÉܵܵÜÉÛÛ´ËËË´ËË´´ËÛâ´ÛÈȵµÜÎÎÚ†ÁÁØÐØØÐÐÐÐÐжօÂÂÂ…ÂÂÖÂ…ÖÂ……Ä…ÄÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÆ»Æ»ÂÂÒ»»Ä…Ä…ÄÄÄÄÄÄÄ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………š ÂÂ—ÂÆÅ…‚ÆÂÂ…ÂÂ…Â…‡Ä҅šÅ…………ÖšÅÐÄš ÅÁ¢ÁÁÁÁÏÁ¡‡ÐÐÐÄÐÄ…¶Â»ӻÓÓ»×ÂÂÂÂÂÂÂÂÂÂÂ………ÖÄÐÐÐÐÐÐÐØÁÚµÉÜÎÎȵÜÜÎÜÜÔÜÈËààà««ÈÔÈß«¬¬à©àà˫˫ÈÈÛâËË´µµµµµµÜµÎµµÈÛÛ´Ë´ËË´Ë´Ëâ´ÛÛÛµµµµÎΆÚÁÁØØØÐØÐÐÐÐÐÄ……ÂÂÂÂÂÂÂÂÂ…ÒÂ…ÖĶÐÄą»…Ä…Ä……ÄÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂ…………‡¡ÒÂ…Â¤ÂÆÅ…Â¡ÒÂ…Â……Â……‡Ä҅šÅ…………¶š…½ÐÐК  â¢ÏÚφÁÁ ÐÐÐÑÐж¶Â»×ÓÓÂÂÂÂÂÂÂÂÂÂÂÂ…………ÄÐÐÐÐÐÐÐÐØÁεÈÜÎÎȵÜÜκÜÜÜÈËËàË«âß Èßß«àààà«««ËâÈÈۯ˴ËÛµµµµÜµÜµÎܵÈÛÛ´Ë´ËË´Ë´´â´ÈȵµµÜÜÎΆÁÁÁØÐÐÐÐÐнжօÂÂÂÂÂÂÂÂ…Â…Â……ÖÄÄÐÄÖÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄ…Ä…ÄÄ…Ð…ÄÖ…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………¢ŠÒÂÂ¤ÂÆÅ…—¡Æ………Â…Ö‡ÄÒ……š¶………Ä‚½ÐÐÐÐÐÐ ½ ÏÁÚÁÁÏ¢¢¹ÐÐÄÐÐ…¶¶Â»×ÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÄÖĶÐÁÐÐÐÐÁÐÁÚÎÈÉÜÎεÜÎÎÝÎÜÜÜÈË«àËß«ÈÈÈß««à¬ààË«ËË«ÈÈÈÛ´Ë´´µµµÜµÜµÜ°ÎɵÈÈÍ·ÜËËË´Ë´´ÛÛÛµµÜµÜÎΆ…ŸÕØÐÐÐÐнÐÐÄ………ÂÂÂÂÂÂÂÂÂÂ…………ÄÄÄĶÖÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ö…………Ä……Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â……Òš—¡¡¿Â—ÂÒÅ…¢ Ò………¶ š…‡ÄÒ…ÂÅš…………Ö‡ÐÐŽÐÐØÁŸŸšÁÚÁÚÁÁ‡¡¹ÏÐÃØÐ…¶¶…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ö¶ÄÄÐÁØÐÐÐÁÁØÁڵɵÎÎܵÜÎΆ†ÎÜÜÈßËË«ßâÈÈÈÈß««àààËËË«ËÈÈÈÈÈÛ´ËË۵ܵµµÜµÜ°Ü†£‚ÛË´âËÛÈÛµµµÜ܃ ¢Å½ÐÐÐÐÄ………ÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄÐÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………‡ÂÂÂ¤ÂÆÅ…¡…………Ö¤šÄ‡ÄÒ…Â…£Ò……ÖÄ— ТØÐÐØÁņÏÁÁ…šÁφ¹ÐÐ…¶¶…ÂÂÂÂÂ…………ÂÂÂÂÂÂÂֶĶÐÐÁÁÐØÁÁÁÁÁεȵÜÎܵÎÎΆ†ÎÜÜÈ´ßËËÈÈÈÈÈÈß««ààààËËËËßÈȵµÈÈ´Ë´ÛµµµµµµÜ°ÜƒËËÛ´ÛÈÛµÜÕĽжÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂ…Â……ÄÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂÂ………………Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â…‡ŤÂÒҚ¶Ä…š……‡ÄÒ………¢¶ÖĶšš½¢ÐØØØ…ŸÁÏÚÁÁ¡½ÁÁ†ÁÐнš¶………Â……ÄÄÄ……ÂÂ…Â……ÄÐÄÐІÚÐÁÁÁÚÁφÜÛÈÉÎÎÜÎÎÀ†Ú²ÎÎÜÈÈÈËËÈÈÈÈÈÈÈß««ààààËËËß´ÈȵµµµÛ´Ë´ÈµµÜµÜµÜ¡ÛËÛÈÛµµ …ÐÄ…Ö…Â…ÂÂÂÂÂÂÂÂÂÂÂÂ………ÖÄÄÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂ…ÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â…‡Ò—¿Å………‡½Å‡ ÄćÄÒÄ……šÂÕ …К𽨅 ÁÁ¡š²ÏÏÁφ¹ØÐУ¡ÄÄ……ÄÄÐÐжą……Â…ÄÐÐÐÐÁÀ†ÁÁÏÚÚ†ÚÀµÛȵÎÎÎÎÀÚ††ÚºÎܵÈÈßÛÈÈÈÈÈÈÈÈ«ßËààËËËß´ÈȵµÜܵÈÛÛËÛµµµµµÜƒË´ÈÈۢĶą……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ķօ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÒš¡»Â¤¿Å……Äš¢¤š¶Ö‡Ä¿…Ä…¶„‡¢š½½½  ¢£š±ÁØ¢¢½ÏÚφÐÐØÁ¢¡¶ÄÐÐÐÐÐÐÄÄÖ¶Ö…ÖÐÐÐØÁÚÎÁÁÚ†ÚÀÚÀÎÛÛÛµÜÎÎÎÚ²ÚÚ†ÚÎÎÜÈÈÛÈÈÈÈÈÈÈÈÈß«ËËËËËËËÈÛȵµÜµµÉÈÛ´ÛÈÛµÛµ†ÔÛÛÛܤš¶Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ö…Ö…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Ś…£ÂÂ………¶¶ ¡Ä…¶‡Ä¿Ä…ÄÕ…‡¡ÐÐÐП‡ ØÁØÁš††Ï††¹ÁÁÐŶÐÐÁÕ‚‚‚¡¡¡¡¡ÁÐÐÁÁÁÏÎΆÏÀÚÀÚÀÀµÛÛȵÎÎÎÚ²Ú†ÚÚ†ÎÎÜܵÈÈÈȵÜÈȵÈÈÈ«ËËËËËÛÛȵµÜÜÜܵÛÛ´ÛÛÈÛȵŸ¡¡ÛÈÈ¡ ‚𡤅¶……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………¢¢…Â…Â…„Åš £¢ „ÕÄж¡¢¢ ¢¡Ò¶Ä…нţ£¡ÐÁØÁÁ†¢ ††Ï†Ú† ÏÁÁÁК¶ÑÁÁÐÁ¶ÁÁÁÚÚµÎÚÚÚÀÎÀÎÎÛ´ÛȵÎÎΆچڲچ†ÎÎܵȵܵÜܵµÜµÈÈÈËËËËËÈÈÛÈܵÜεµÈÛ´ËÛÛÛÈÕÎÎΰÉÊ ºÛµÚÎÞÀ†ÁÕ‚ÖÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂ…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÅÅ…»Åš½ÐÐПÄннÐЇŸÏÁØÁÁÁ††½ÅŸÊ††Ú†Ú†ÁйÁÁÁØÐÐÅšš¶ÁÁÁÐÁÃÁφ†ÎµÎÚÀÎÎÎÎεÛÛÛȵÎÎÀÚ†ÚÚÞ†Ú²ÎÎÎܵÜܵÜÜܵµÜµÈÈÈËËËÛÛÛÈÛµÜÜÜܵµÛÛ´´ÛËÛ ŸºÎÎÎÎÜÈ݂ۂÙÎΆ†ÁÁØÐ‡Ä……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…šš½Ðн½Ð¢¢Ä½Ð½Ð½…½ÁÁÁÁ†ÁÁÁ†††Ú†††Ú†Ú†ÁφÁÁÁÁÁØÁÁÁÁÚ†ÐÁÁÚ†ÚÀµÜÎÀÎÎÎÎÎÜÛ´ÛÈÛµÎÎÀ†À†ÀÀÚ†ÚÎÎÎܵÜÜÜÜÎÜÜÜÜܵÈÈÛÈËÈËÈÛµµÜÜεÜÉÛ´ËË´´ÈÎÎÎÎÎÎεȃ µ ÉÎÎÎÞ†ÁÁÁØÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¡ÄÐÐÐÐЇ£ÄÐÐÐÐÐÅÕÁØÁ†Á†ÁÁÏÁÁ†Ú†Ú†Ú†ÏÚ†ÏÁÁØÁØÁÁÁÚÚ†ÚÐÀ†ÀÚÀÜÛµÎÎÎεÜÎÉ´´ÛÛÈÜÎÎÎÚÀÀÚÚÀÚ†ÎκÎÜÜÎÜܺκÜÔÜܵÈÈÛâÛÈÛȵµÜÎܵµµÛ´´ËˈÎÎÎÎÎÎÎÜÉÛ‡£ÉÎÎÎΆ†ÁÁØÐš¶…»ÂÂÂÂÂÂÂÂÂÂÂÂ…‡ÑÐÐÐÐ……ÐÐÐØØ½ÁÁ†Á†Á†ÁÁ††Ú†††Ú†Ú††ÚÁÁÁÁÁÁÁÁÚ†ÀÚÀÐÀÀÚÀεÛÜÎܵµµµµÛË´ÛÈɵÎÎÀÚÚÀÀÀÚÚÚÀÎÎÎÜÎÎÎÜκÎÎÎκܵÈÈÈÛÛÈÛµµÜÜܵµµÛ´Ë´Ë´ ÎÎÎÎÎÎÎÎܵµÜÜÎÎÎΆ†ÁÁÁК‚ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…… ÑÐÐÐÐmÅÊÐØØØ‚Õ†ÁÁ†Á†Á†ÁÚÁ†Ú†††Ú†Ú†ÚÁÁÁÁÁÁÁÚ†ÀÚÎÚÐmÀÎÀÎÎÛȵܵÉÈÛµµÛËÛÈÛµÜÎÎÀÀÎÀÎÀÚ†Ú†ÎÞÎÎÎÎÎÎÎκÎÎÎÎÜܵÛÛÈÛÈȵµÜÎܵµÈÛË´Ë´Ë ÈÎÎÎÎÎÎÎܵµÝ¤¤µÜÎÎÎÎÚ††ÁØÁ…Ò…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ‚‡ÐÐÐÐØƒƒÐØØØØ£½Á†ÁÁ†Á†Á††Ú†††Ú††††Ú†ÏÁÚ†ÏÁÚ†ÀÎÎÀºÐÀºÎε´ÛܵÉÈÛÛÛÛË´ÛÛÈÉÜÎÎÎÎÎÎÎÎÀÎÚÀÎÀÎÎÎÎÎÎκ†ÞºÎºÎÜܵÈÛÈÛȵµµÜµµµÛÛ´Ë´ËÔÔÜÎÎÎÎÎÎÎεµÈ  µÜÜÎÎΆچÁÁØ…Ò»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐ½ÐØÁ‚¡¹ØÁØÁ¢¢ÕÁÁ††Á†Á†Áφچچچچ†ÚÁÚ†Ú†Ú²ÀÎÎÎÎÎÐÀÎε۴µÉµÈÛ´ÛÛ´Ë´ÛÛɵµÎÎÎÎÎÎÎÎÎÀÀÚÀºÀÎÎÎÎκچ†Ú†ÎÎÎÎÜÈÛÈÈÛµÉܵܵÛÈÛË´ËË£ÈɵÜÎÎÎÎÎÜܵµ‡µµÜÎÎÎÞ†††ÁØ…ƅ»»ÂÂÂÂÂÂÂÂÂÂÂÂÂÅÅÐØÁØ ¢ÁØØÁÊ£¡¤ÊÁ††††Á††Á†Ú†††Ú†Ú††Ú†Ú†Ú†Ú†ÎÎÎÎÎÎÎÐÈÙµÉÛÛȵÛÛ´Ë´´Ë´ÛÛÛȵܵÎÎÎεÎÎÎÎÀÎÞÀÎÎÎÎÎÎΆ†††ÚÝÎÎÎܵÈÛÛÈÛµµµµµÈÛ´´ËË´ ÛµµµÜÜÜÎÎܵÜÉÜÜÎÎÎΆ††ÁÁÁŸ¡ÆÂ»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ£š½ØØÁ‡£ØÁÁØÕŸƒƒƒƒƒƒƒƒÏ†††††††††††††Ú†Ú†Ú††Ú†Ú†ÚÀÀÎÎܵÜÎÎÐÈɵÈÛ´ÛÈÛ´ÛËË´ËËÛÛÛÛµµÜµÜµµµµÜÎÎÎÀÀÎÎÎÎÎÎÀΆ††††Ú†ÎÎεÛÈÛÛÈÛȵµÈÛÛ´Ëȵ˃ÛȵµµÜµÜÎÎܵ܃ÕÜÎÎÎÎÞ††ÁÁÁššÅ¢¡¹ØØØ¤Õ†Á†Ÿ Á†††Ú†††††††††††††Ú†††ŸƒšÊ†Ú††Ú†ÚÀÀηŸƒ†Ü¼ÐÈÉÈÛ´ÛÈÛÈÍÕ ´Û´ÛÛȵµÜµµÉµµÜÎÎÎÎÚÎÎÎÜÎÎÚÀÞ†††Ú†ÎÝÎεÈÛÈÈÔÊÊÝÈÛÛ´´Ë¡´ÛȵµµÜµÜÎܵɃ¡µÎÎÎΆچ†ÁØ¢¡ÐØÁŸŸÁ†Á‚¢Ð‚‚‚‚‚‚‚‚††‚‚‚‚‚‚š·Ú½ m£‚Ú†ÚÚÀ²ÎÝ‚£ ‚ÜÐȵÛÈÛȵ ¤ ¡Í´ÛÈʃƒƒƒƒƒ¼µÜÎÎÕƒƒƒƒƒÕÎÎÚ††ÕƒƒƒƒƒÕܵÔ‡‡ ƒÜ´Ë¡¡Ë¡âÛȵµµµÜµÜµÜµÎÎÎÎÎÞ†††Á……»Â‚‡ÃØØƒÚ†Ú¡¡Ð††mÁÕ£¡Ú†ÀÝΆÕmÈÉÈÛÈ݃ȴʵÎÜÎ ‡²ÚºÚ† Ÿ®Ÿj ´´ƒËÛÛȵµµµµÜε܃ÎÎÎΆ†††Á ¢Ò…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒšÐØØ‚¡Á††¢Ð††ʇ݆ÀÎ ÛÉÛÈ͇´¼µÜºÕºÀÚÕ†m‚´´â ÛÛÈÛµµÜµÜµÜÜÜ¡‚ÎΆچ†Á¢……»»Â»ÂÂÂÂÂÂÂÂÂÂÂÂÂÅŸÁØ¢Ú†ÁÊÐÚ†‚ +†ÎÀÛÉȺ É¡µÜÜÕÎÀº ´Û ÛÈÛȵµµÜµÜÜÎÎ  ¡ÎÚ††Ÿ£¢¶…»ÂšÁÁ¢‡À†Ê†Ð††‡Ÿ²Î ÛÛµ¡Õ ɵ΃ƒÎÎÚ£ÊÛÕµÈȵµµÜµÜµÜÎΟ ÊØ Â……»Â ‚ÃØ‡††m ÚІ†¡ÎÛÉÕ¢‚ µÜÜ‚¡ÎÎÀ£ ÈÔÛÛµµµµÜÜÜÎÎÕÊ¡½……»ÂÂÂÂÂÐØ¤ÊÝ †Ð††¢Î ÛÛ¢¡浆 ÎÎ΢Õµ£¡ÉµµµÜµÜÎÎÎÎÕº ¤Ÿ½Ð……»»»ÂÂÆ™ Ã…ŸºÚІ†‡†Û† ɵ‡ÜÎΣ¤‡µεµÜÜÎÜÎÎÎÊŸ²†¢…½Ð½……»Â—ØmƒÚ¢ƒÎÐÎÎm ¢Û‚¢‚É܆ÎÊ¡ÍÔ ÜŸ¡µÜÜÎÎÎÎÎΟ†Ú†¤Å½Ð……»»ÂÂÂÂÂÂÂÂÂ؃¡Î ŸÎÐÎÎ ƒ¡¡ÔÛÈ£ Í¢ÉÊŸÔŸµËË´Û  ƒÎºÙÎÎÎÎÎ΢Ÿ†½……»»Â‡½¡  ηÞÐÎΟ°Î¡¢¡´âÛ‚ ËËËÈ£ µÎµÛâˡ¢‚ÀÎÎÎΡÔÎÎÎνŅ…»»Â„Ÿ¢¡ ʇÎÎÐÎÎÎÎÎ ´ÛË¡ËË´Û‚¤É¡Î ºÈÛ´ÔÛµÉÜÜÎÎΆ ƒÕ š‡š ¤…»Â»»Â¡š‡ƒ ÎÎÐÎÎÎÜÎÜÎÛË⢣ÔËËËËÔ£΂ É ¤‡ÊܵÜÜÎÎÎÎÀ‚† ¤ƒÏÁÁŸ Òš¡¤ʇ¡‚ÎÎÐÎÎÎÎÜÜ ÈÛâË ËËËËâÍ Õ¤Ý ¢¢·ÎÎÎÀÀÞÀ ʆ£¢½ÏØØØÐЂ»»Â ΢‡ŸºÎÐÎÎÜÜÜÜ¢ÛËÛËËËËËË˃ ¡‡ŸºÀ†Ú†ÚØ φ ÁÁÁØÁØØØÐš„…‡ÎʺÎÐÜÎܵÜÈ ËÛËâËËËËËˤ‚ƒƒÀÚ†Ú††Ø ŸÏ†Ø½ÁÁØÁØØØØÐЂ…‡ ΃¤ºÜÎÐÜεܵÈÛËâ´ËËËËâË  Õ·ʆچچÁÏš‡¤¡Ú†ÁÁ…‚ØÁØÁØØØØØÐÐТ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…¢¡ÎŸ ÜÎÎÐÜεܵÈÛâ´ËËËË˴˺ÜφφÁÁÁ††ØŸ½ÚφÁ††ÐØØØØØØØØÐÐÐЂ҅…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………¡ƒºÎÜÎÐÜεÈÈÈËÛËËËËËËËË¡£ƒ µµ†Õ†ÁÁ†Á†ÁÁÁÁÁÁ†Á†Á†‚¢ØØØØØØØØÐÐÐÐй‡„Ð………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÂÂ…Â…ÂÂÂÂÂÂÂÂ…Â…Â…Â……šŸÎÀ¤¡µÎÜÐÜεÈÈÈÛËÛËËËËËËË‚ÊɵÜ‚φ†Á†Á†Á†Á††Á†Á†Á ¡ÃÐÐÐÐØÐÐØÐÐÐÐС ÄÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………Â…Â……ÂÂÂÂ…Â………………·ÎÎ ÎÜÎеÎÈÈÛÈ ËÛËÛËËËËË˃¤È ƒÈµµÉ¢ÏÁ†ÁÁÁÁ†Á†ÁÁ†Á†ÁÁ—šØÐÐÐÐÐØÐÐÐÐÐÐК‡Ä¶Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………ÖÄÖ………Â…ÂÂ…Â……Ö………Â…Â……¤ÎÎÎÊÜÜÎÐÜÎÈÈÈÈ ÛËÛˇËËËËÛË  Û ÕµµÜÜÎÕ‡†ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ½š¹ÐÐÐÐÐÐÐÐÐÐÐÐК‡ÄÖ¶Ö…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂ……ÖĶֶÖÄ………………Ö¶Ö¶Ö………Â…Â…‡¢ÎÎ΂ÝÜÎÜеÎÈÈÈÈ£ÈÛ´Û £´ËËËË裃 ÛÍȵÜÜκÎÕ‚ ¤¤ÁÁÁÁØÁØÁÁÁÁÁÁÁÁ؃ÐÐÐÐÐÐÐÐÐÐÐÐÐЃ ÄÄ………Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………Ö¶ÖÄÄĶ…ÄÖÖ…ÄÄÄÖ¶Ö…………………ÖÎÎÎ ÜÜÜÎÐÜÎÈȵÈÊÛÛÛ ÍËËËËÍÊâ ¡Û‚ µµµÜºÊŸƒ†ÎÚÕƒ‚¢¤Á¡¡ØÁÁØÁØÁÁÁÁÁÁ ¡ÐÐÐÐÐÐÐÐÐнÐÐЂ¢ÄÖ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ò……ÖĶĶÄÄÄÄÄ…Ä…Ä…ÄÄÄÄÄÖÖ……Ö…Ö¶‚‚ÎÎÎÕÜÎÜÎеÎÈÈÉÈ ‚ÈÛÈ ¡ËËËËÈâ ÉÛ‚¢‡¡Î††ÀÚÁ‚ ÁÁØÁÁØÁÁÁÁØÁØ¢ÐÐнÐнÐÐÐÐÐÐТÒ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………Ä…ÄÄÄÄÐÐÄÄÄ…ÄÄÄÄÄÄÄÄ…ÄÖÖ¶Ö¶ÖÔÎÎʃÜÜÎÜÐÜÎÈȵȵƒ£ÛË´È ¢â´‚ÕÈÕɇÕ†Ú†††Õ ¡š†ÁØÁØÁÁØÁ؃ÐÐÐнÐÐÐÐÐнĽš………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÖÄ…ÄÄÄÄÐÐÐÐÐÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ö¶Ö¶ÅÕºÎΆŸµÎÜÎеÎÈÈÈȃ Ü¢¡Í´ÛƒÔµÍÉ¢ Ÿ††ÁÊ š ÁØÁØÁØÁÁØÁ¤¡¡ÐÐÐÐÐĽжÄ͡Ņ…Â…ÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…Ö¶ÖÄÖÄÐÐÐÐÐÐÐÐÄÄÄÐÄÐÄÄÄÄ…¶Ä¶ÄÄÄФÊÎÎÎÎ ·ÜÜÎÎÐÜεÈÈÈ܃ ¤ÍâÛ‡ÈÈÜÎȃ ¢¢‡š½†ØÁØÁØÁÁ¡½ ÅнжÐĶĶÄŇօ…ÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ……Ä…Ö¶ÄÄÄÐÄÐйÐÐÐÐÄÐÄÐÄÐÄÄÄÄÖ¶ÄÄÄĶ¢¤ÎÎÎÎÜ ÎÎÎÜÎÐÜÎÈÈÛÈ· ÜÔ´ÛÛµµµÈ µÈºÕÊ ŸÁÁØØÁØš¢ØšÐÐÐ…ÄÖÄÄŤšÂ…ÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÄ…ÄÄÄÐÄййØÐÐÐÐÄÐĽÄÄÄÄ…ÄÖÄÄÄÄÄ¡ ÎÎÎÎ΂ ÎÎÎÎÎÐÜεȵÈ̓ÜÉ¡ÍÛÈÈÈ¢Ûµµ¡Èµµ¡ ÁØššÊÁؽņÁ‡ ÐÄ…Ä…£Â…ÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ……Ö¶ÖÄÄÄÐÄÐÐйع¹ÐÐÐÄÄÐÄÄÄÄ…Ä…ÄÄÄĶĚÀκÎ΂ÎÎÎÎÎÐÎεܵÈÊÜÜɺÛÈÛȵ¡Éܵ‚ƒÉµÜÊŸØÁÁ‡£¤ ÁØÁ££š¶ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ…Â…Ö¶Ö¶ÄÄÄÐÐÐÐÁÁÁÁØÐÐÐÐÄÐÐÄÄÄÄ…Ä…ÄĶĽš¡ÚÎÎÎÎÕÎκÎÎÐÎεµÜÈÕÜ‚‡ Üɵ·ÈÈÈÈÈÊܵÜÕÈܵ܂¡ÁØØØm¤ÐÁÁÁ†¡¿…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ…Â…Ö¶ÖÄÄÄÄÐÐÐйÁÏÁÏÁÐÐÐÐÐÄÄÄÄ…Ä…ÄÄÄÄÐÐÐ…šºÀÎÎηÕºÎÎÎÎÐÎÎÜܵÈÕÔ݇ƒ ÜÜÜÉ¡ÉÈÈȵÛÝܵܵŸܵÜÜÎΡÐØÁØÁ†¡ŸÁÁÁÁÁÁ¢Ò…»»ÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÂÒ…Â……ÄÖ¶ÖÄÄÄÐÐйØÁÏÏÁÁÐÐÐÐÄÄÄÄÄąąĶÐÐнÐmÕ†Þ†ÎÎÎ ÊÎÝÎÝÀÐÞÎÜÜÜÈÎÎÕ ·ÜÜÜܵ¡Éȵȵȵµ¤ Üܵܺ µÜµÜÎÎ΂¡ÃØÁØÁØØÁ¤·Á†ÁÁÁÁÁ¡¤ƅ»»ÂÂÂÂÂ…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Â……ÂÂÒÂ…ÖÄÖ¶ÄÄÄÄÄÐÐйÐÁÏφϹÐÐÐÐÄÄÄ……ÄÄÄĶÐнÐÐФ¤¤¤¤¤¤ Á†ÚÎÚÎΡ¤¤¤¤¤¤¤¢ÚÝÀ†ÎÚФ¤¤¤¤¤¤ ÎΤ¤¤¤¤¤¤ ÎÜÎÈ£ÊκºÕ ¢ÊÎܺÜÎÎ΃¤¢ÉȵȵµµµÜ¡¡ÜÜÜܵ¢¡ÉÜÜÎÎÎºÚ ¢ÁØØØÁØÁØØÁš ¤…†Á†Á†Á؆ÁÁ¤¿……»»ÂÂÂÂÒ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒ…Â…ÂÖÂÖÂÖÂÖÄ…Ö¶Ö¶ÄÄÄÄÄÐÐÐÁÁÁÚÏÁÁÐÐÐÐÄ…ÄÄÄ…Ä…ÄÄÐÐÐÐÐÐ……………ÕÕÕ½†††Ú††Þ†ÊÊÊÊÊʽ؆††††Ý†ÊÊÊÊÊÊÊÊÞ†ÊÊÊÊʷʆÜÎκÊÊÊÊÊÊÊʺÞÎÝΆƒ¡¢·ÎΆÊÊÊÊʷʺÎÎÜÎÎη‚  ÎɵµµµÜµÜÜÜÝÊ·Ê·ÊÎÜÎÜÜÜÝ·····ÎÜÜÎÎÎÎÎÝ݆Ÿ‚¢ ¢¢‚Å½ØØÐØÐÐÐÐÁØØÁšÁÁ†Á†Á†ÁÁ†ÁÁ‡‡¡……………»»»ÂÂÂ……Ò……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖÂÖÄÖÄÂÖ…ÖÂÄ…ÖĶÄÄÄÄÄÐÐÐÐй¹ÏÚÏÚÁÁÐÐÐÄ…Ä…Ä…Ä…Ä…ÄÐнÐÐÐÐ½ØØÁÁÁÁÁφ††ÚÚ†ÀÝÚ††††††††††††††††††††††ÎÞÎÎÎÎÎÎÎÎÎÎÞΆ݆††††Ú††Ú†ÚÀ†À†ººÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÜÎÎÎÎÙÜÜÜÜÜÜÜÜÜÜÎÎÜÜÎÎÜÎÎÜÎÎÜÜÜÜÜÜÜÜÜÎÎÎÎÎÝچφÏÁØÐÐØÁØØØÐØÐÐÐÐÐÐÁØØØÁØÁÁØÁÁ†ÁÁ†Á†Á†ÁÁ†ØØØÐÐÄÒ¿…………………»»ÂÂÂÂ……ÒÂ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ……Ö¶Ö¶ÖÄ…Ä…Ä…ÄÄÄÄÄÄÄÄÐÐÐÐйÐÁÏÁÚÁÏÁ¹ÐÐ…Ö…Ä…ÄÄÄ…ÄнÐÐÐÐÐÐÐÐÐØÁÁÁÁÁÁÚ†††††††††††††††††††††††††††††††ÞºÞÎÞºÎÝ݆݆†††††††††††Ú††††††Ú††ÞÝÎÝÞÝÎÝκÎÝÎÎÎÎÎÎÎÎÎÎÎÎÎÜÜÜÜÎÜÜÜÎÎÜÎÎÎÎÎÎÜÎÜÎÎÜÜÜÜÜÜÎÜÎÎÎÎÝÀ†††ÁÁØØØÐÐØÐÐÐØÐÐÐÐÐÐÐØÁØÁØØØØÁÁÁÁ†ÁÁ†Á†Á†ÁÁ†ÁØÐн…………………………»ÂÂÂÂÂÂÂÒÂÂÖÂ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……¶ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶ÖÄ…Ö¶Ö¶ÖÄ…ÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÏÏÁÚÚÚÏÁÐжօąÄÄÄ…ÄÄÐÐÐÐÐÐÐÐÐÐØ¹ØÁÁÁ†Á†Ú††††††††ÁÁ†††††††††††††††††††††ÞºÞºÞ††Ú†††††††††††††††††††††††Ú†††Ú†Ú†ÚÝÞÝÎÝÞºÞºÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÜÎÎÎÎÎÎÜÎÎÎÎÎÞ††††ÁØØÁØÐÐÐØÐÐÐØÐÐÐÐÐÐÁØÁØØØØÁÁ†††††ÁÁ†Á†Á†ÁÁØÁØÐÐÐ……………………Â…ÂÂÂÂÂÂÂÂÂÂÂÂÖ………Â…Â…ÂÂÂÂÂÂÂÂÂÂÂÂ………ĶֶÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…Ö¶ÖĶֶֶÄÄÄÄÄÄÄÄÐÄÐÐÐÐÐÐйÁÁÏÚÚÀÚÏÁÐÐ…………Ä…Ä…ÄÄĽÐÐÐÐÐÐÐÐÐÐØÁÁÁÁÁ†Á††Ú†††ÁÁÁ†ÁÁÁÁÁ†Á†Á†ÁÁÁÁÁ†Á†††††††††††Ú††††ÁÁÁÁÁÁÁÁÁÁÁ††††††††††††††††††††Ú†Ú†Ú²ÚÝÎÎÎÎÎÞÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÜÎÎÜÎÎÎÎÎÎݲچ††ÁÁØØÁØÐÐÐØÐØÐØÐÐÐÐÐØØØØØØØÁ†††††Á†ÁÁ†Á†Á†ÁÁØØÐ½Ð………………………Â…ÂÂÂÂÂÂÂÂÂÂ…Â……………Â…ÂÂÂÂÂÂÂÂÂÂÂ………Ö…ÄÖ¶ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶Ö¶Ö¶ÖÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÐÐÁÏÏÚÀÚÚÚÁÐÄ………ąąąĶÐÐÐÐÐÐÐÐÐÐÁÐÁÁÁØÁÁÁÁÁÁ†ÁÁ†Á†ÁÁÁ†Á†Á†Á†ÁØÁØØØÁÁ†Á†††††††††††ÁÁØØØØØØØØØØØÁØÁØÁØÁÁÁ†††††††††††Ú†Ú†Ú†Ú†Ú݆ÞΆÎÞÎÎÎÎÎÎÎÎÎÎÎÎÎκÎÎÎÎÎÎÎÎÎÜÎÎÎÎκÎÞÀ݆††ÁÁØØØØÐÐÐØÐØÐØÐØÐÐÐÐÁØØØØÁ††††††††Á†ÁÁ†Á†Á†ÁÁØØÐ½Ä…Ä…Ä……………ÂÂÂÂÂÂÂÂÂÂÂÂ…Ö…Ö………Â…ÂÂÂÂÂÂÂÂÂ………Ö¶Ä…ÄÖ¶ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ¶ÖÄÄÄÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐйÏÁÏÚÀÀÀÚÁ¹ÐÖ…Â……Ä…Ä…ÄÄÐÐÐÐÐÐÐÐÐØØÐÁØÁØÁØÁØÁÁÁÁÁÁÁØØØØØØØØØÁØØØÁØØØØØØÁ†ÁÁ†††††††ÁÁØØØÐÐÐØÐØÐØÐØØØØØØØØØ†ÁÁ†ÁÁÁ†Á†Á††††††††††Ú†††Ú††ÚÎÞÎÞÎÎÎÎκÞÝÎÞÎÞÎÎÎÎÎÎÎÎÎÎÎκ޺چچ††ÁÁØÁØÁØÐÐØØÐØÐØÐÐÐÐÐØÁØØØ††††††††Á†Á†ÁÁ†Á†Á†ÁØÁØÐ½Ð½ÄÖÐ…Ä……………ÂÂÂÂÂÂÂ……Ö¶Ö¶ÄÖÖ……ÂÂÂÂÂÂÂÂ…Â…Ö¶Ö¶ÄĶֶÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂօĶÄÄÄÄÄÄÄÐÐÐÐÐÐÐÐÐÐйÐÐÐÐÐÐÐÁÁÏÚÚÀÎÀÚÏÐÄ…………ąąĶÐÐÐÐÐÐÐÐÐÐØÐØÐ¹ØÐØÁØÁØØØØØØØØØØØØØØØØØØØØÐÐÐÐÐØØØØØÁÁÁÁÁÁÁÁØØØÐ½Ð½Ð½ÐнÐÊÐÐÐÐÐÐÐØØØØØØØÁØÁÁÁÁÁ†ÁÁÁ†Á††††††††††††Ý†ÝÞÝÞݲچچ²Ý†ÝÚÝÞÝÎÎÎÎÝÎÝÞ²Ú²Ú†††Á†ÁØØØØØÐÐÐÐØÐØÐØÐÐÐÐØØØØ††††††††Á†Á†Á††Á†Á†ÁÁÁØÁÐÐÐÐÖ¶ÄÐ…ÄÄ…………ÂÂÂÂÂ…ÂֶֶֶĶօ……Â…ÂÂ…ÂÂ…Ö¶ÖÄÄÄÄÖ¶Ö¶ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ĶÄÄÄÄÄÄÐÐÐÐÐÐÐйÐййй¹Ð¹ÐÐйÁÏÁÚÀÀÎÀÚÁÐÄ…ÂÂ……ÄÄÄÄÄÐÐÐÐÐÐÐÐÐØÐØÐØØÐØÐÐÐØØØØØØÐÐÐÐÐÐÐØÐÐØ½ÐÐÐÐнÐÐ½ÐØÐØØØØØÁØØØØ½Ð½½½Ð½½½½Ð½Ð½½½½½ÐØÐÐÐØÐØØØØØØØØØÁØØÁÁÁÁÁ††††††††††ÚÚÀ†Ú†Ú†ÚÚ†ÚÚÀ†Ú†Ú†ÀÝÚÝÚΆÀ†Ú††††††ÁÁØÁØØØÐÐÐØÐÐØÐØÐÐÐÐÐØØÁ؆††††††††Á†Á†ÁÁ†Á†Á†ÁÁÁØØÐнÐĶÄÄÄÄÄÄÖ………Â…Â…Ö¶Ö¶Ö¶Ö¶Ö¶Ö………Â…Â…………ÄÄÄ…ÄÄÄÄÖ¶Ö¶ÖÂÂÂÂÂÂÂÂÂÂÂÖÖÖÖ¿…ÄÄÄÄÄÐййййÐй¹ÁÃÁÏÁйййÐÏÁÏÚÀÎÀÀÚÐÄ…ÂÂÂ…Ä…ÄÄÄÐÐÐÐÐÐÐÐÐÐÐØÐØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐнÐÊÐннннÐÐ½Ø½ÐØØÐØÐØÐؽнօ………………ÄսнÐÕĽннÐÊÐÐÐÐØÐØÐØÐØÁØÁØÁØÁÁ†Á†ÁÁ††††††Ú†Ú††††Ú†††Ú†††ÚÝÀÝÀ†††††††††††Á†ÁØØÁØØÐÐÐÐØÐÐØÐØÐÐÐÐØØØÁ††††††††Á†††††ÁÁ†Á†Á†ÁÁØØÐÐнÐжÄÄÄ……Ä………ÂÂ………Ö¶Ö¶ÄÄĶֶօ………………ÄÖ…ÄÄÄÄÄÄĶֶֶÂÂÂÂÂÂÂÂÂÂÂąĶÖÄÄÄÄÐй¹ÐÁÐÁ¹¹Ð¹Á¹ÁÏÁÏÁÏÁϹйÐÁÁÏÚÀÀÎÎÀÁÐÄ…ÂÂÂ…ÖÄÄÄÐÐÐÐÐÐÐÐÐÐÐØÐØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐнÐнÐнн½½½Ð½Ð½½½ÐнÐÐÐÐØÐÐÐÐÐн…Õ……………………………Ö………ÐÕнннÐÐÐÐÐÐØÐÐÐØØØÁØÁØÁÁ†ÁÁÁÁ†††††††††††††††††††††Ú†Ú†Ú†††††††††Á†ÁØÁØØØØÐÐÐØÐØÐÐØÐØÐÐØÁØØØ†††††††Á†Á††††ÁÁÁ†Á†ÁÁÁÁØÐÐÐÐÐÐжÄÄÄÄ…Ä………………Ö¶Ö¶Ö¶ÄÄĶֶօ…………Ö…ÄÄ…ÄÄÄÄÄÄÖ¶Ö¶Ö¶ÂÂÂÂÂÂÂÂÂÂÄÄÄÄÄÄÄÄÄйÏÁÏÁϹÁ¹ÏÁÏÁÏÁÏÏÏÁÏÁϹÁÁÏÁÏÚÀÎÎÎÚÁÐÖÂÂÂ…Ö¶ÖÄÄÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐÐÐÐÐÐнн¶Ð½…½…¶Ð¶Ð…Ö¶…Ö…Ö¶…Õ¶Ö½½Ð½Ð½Ð½Ð½……………………………………………………Ä…½ÕÄÕн½Ð½Ð½ÐÐÐÐÐÐÐÐØØÁØØÁØÁØÁÁÁ††††††††††Á†††††††††††††††††Á†ÁÁÁ†ÁÁÁØÁØØØÐÐÐÐØÐØÐÐØÁØÁØØØØ†††††††††Á††††††††Á†Á†ÁÁØÁØÐÐÐнÐĶÄÄÄÄ…Ö……………ÄÖ¶Ö¶ÖÄÄÄĶֶօ…ÖÖ¶Ä…ÄÄÄÄÄÄÄ…ÄÖ¶Ö¶ÖÂÂÂÂÂÂÂÂÂÂÄÐÐÐÄÄÄÐйϹÏÁÏÁÏÁÁ¹ÏÁÏÁÏÏÏÏÏÁÏÁÏÁÏÁÏÚÀÀÎÎÀÏÐÄ…ÂÂ…Ö¶ÖÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐжжÐÖÖÖ……Ö……¶Ö¶……Ö…………………¶…ąֶн¶Ð½Ä½Ä……………ÂÂÂÂÂÂÂ……………………………………………Ö¶ÕÖ¶…½½½½½ÐÐÐÐÐØÁØØÁØÁØÁÁÁÁ††Á†ÁÁÁÁ†Á†ÁÁÁÁÁÁ†††††ÁÁÁÁ†Á†Á†ÁÁØØÁØÁØØÐÐÐÐÐØÐØÐÐØØØØÁØÁ††††††††Á††††††††††Á†Á†ÁÁØÁØÐÐÐÐнÄÄÄ…ÄÄ………………ĶֶֶÄÄÄÄĶֶÄÖ¶ÄÖ¶ÄÄÄÄÄÄÄÄÄ…ÄÖ¶Ö…ÂÂÂÂÂÂÂÂÂÂÐÄÐÐÐÐÐйÁÁÏÏÏÏÏÏÏÏÏÁÏÚÚÚÏÏÏÏÏÁÏÁÏÁÏÏÏÀÎÎÎÀÁÐÖÂÂÂ…ÄÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ…Ä………Ö…………………Ö………………………………………………………………………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………………………Ä…Ö…½Ð½Ð½ÐÐÐØØØØØØØØØÁÁÁÁÁ؆ØÁÁÁÁÁÁ†Á†Á†ÁÁÁÁÁ†ÁÁÁØÁØØØØØØØØÁØØÐØÐÐÐÐÐØÐØÐØØÁØØÁ؆††††††Á†Á††††††††††††Á†ÁÁØÁØÐÐÐÐжÄÄÄ…Ä……………օĶÖÄÄÄÄÄÄÄÄÄÖ¶ÄÖ¶ÄÄ…ÄÄÄÄÄÄ…ÄÄ…ÄÖ¶ÖÂÂÂÂÂÂÂÂÂÂйй¹Ð¹ÏÁÏÏÏÏÚÏÏÏÏÏÏÚÚÀÀÚÚÏÏÏÏÏÏÏÁÏÏÏÚÀÎÎÀÚÁÄ…ÂÂ…ÖÄÄÐÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄ………………………………………ÂÂÂ……………………………………………………………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………………………………………½½Ð½ÐÐÐÐØÐÐÐØÁØØØÁØØÁØÁØÁØÁØØØØØØØÁÁØÁÁØØØØÁØØÁØØÁØÁØØØØÐÐÐÐÐÐØÐØÐØÐÁØØØØÁ†††††ÁÁ†Á††††††††††††††Á†ÁÁعØÐÐÐÐÄÄÄ…Ä…Ö……………ąĶÄÄÄÄÄÄÄÄÄÄÄĶÖÄÄÄÄÄÄÄÄÄÄ…ÄÖ…Äօ¹йÁÁÁÏÁÏÁÏÚÚÀÚÚÚÏÚÚÀÀÀÚÀÚÏÏÏÏÏÏÁÏÏÏÚÀÀÎÎÀÏÐÄ…ÂÂ…ÄÖÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………ÂÂ……………Â………………………ÂÂÂ×ÂÂ×Â×ÂÂÂ×»ÓÂÂÂÂÂÂÂÂ…Â…Â………………………………Ä……½Ð½ÐÐÐÐÐÐÐÐØØÁØØØÁØÁØÁØÁØÁØØØÁÁØØØØØØÁØÁØØØÁØÁØØÁØÐÐØÐØÐÐÐÐÐÐØÐØÐØØÁØÁØØ†††††Á†Á†Á††††††††††††††ÁÁØÁØÐÐÐÐÐÄÄÄÄ…Ä…………………Ä…ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…ÄÖ………¹ÁÁÏÏÏÁÏÁÏÚÀÀÀÀÀÀÀÀÀÀÀÀÚÚÏÏÏÏÏÁÏÏÏÚÚÀÀÎÎÎÀÁж…Â…Ä…ÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………………ÂÂÂ××»Â×Â×»ÂÂ×ÂÓÂÂ×ÂÂÂÂÂÂÂÂÂÂÂ…Â…Â…………………………ֶнÐÐÐÐÐÐÐÐÐÐØØØØØÐØÐØÐØØØØÁØØØØÁØÁØØØØØØÐØÐØÐØØÐØÐÐØÐÐÐÐÐÐØÐØÐØÐØØÁØÁ؆†††††Á†Á†††††††††††††††ÁÁÁØÁØÐÐÐÐÄÄÄ…Ä…………………Ö¶Ä…ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ä………ÂÂÂÂÂÂÂÂÂÂÏÁÏÁÁÏÏÏÚÚÀÀÀÀÀÀÀÀÀÎÀÚÚÚÏÏÏÏÁÏÁÁÏÏÀÀÀÎÎÎÀÚÐÄÖ…ÂÖ…ÄÐÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐнą…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ×ÂÂ×ÓÂÓ»×ÂÓÂÂ×ÓÂÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………………ÕнÐнÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐÐØØØØØÐÐÐÐÐÐÐØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐØÐØØÁØÁ†††††Á†Á†Á†††††††Ú†Ú†††††Á†ÁØÁÐÐÐÐÄÄ…Ä…Ö…………Â……Ö¶ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä…Ä…Ä……ÂÂÂÂÂÂÂÂÂÂÏÏÁÏÏÏÏÚÚÀÀÀÀÀÎÎÎÎÎÀÀÏÏÁÁÁÏÁÏÁÏÁÏÚÀÀÎÎÎÎÀÁÐÄ……Â…ÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐж…ÂÂÂÂÂÂÂÂÂÂ×ÂÂÂÂ×ÂÂÂÂÂÂÂÂÂ×Â×ÂÂÂÂÂÂÂÂ××××ÂÓÂÓÓÂÓ»ÂÂÓ»×ÓÂÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â………Ö¶Õн½Ð½ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐØÁØØÁØÁ††††ÁÁ†Á†††††††††Ú†Ú†††Á†Á†ÁØÐÐÐÐÄÄÄ…Ö……ÂÂ……Â…¶Ö¶Ö¶Ö¶ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ…Ä………ÂÂÂÂÂÂÂÂÂÂÏÏÏÏÏÏÚÀÀÀÀÀÀÎÎÎÎÎÎÀÚÁÁÏÏÏÁÁÁÐÁÏÏÀÀÎÎÎÎÎÚÐÐÄ…Ö…ÄÖÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐнօÂÂÂÓÂ×ÂÂ×ÂÓÓÂ×ÂÂ×Â×Â×Â×Â×Â×»×ÂÂÂÂ×Â×Â××ÅÓÓÓÓÓÓÅÓÓÓÂÓ×»×Ó×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………Ö¶ÕнÕнÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐØØØÁØÁÁ††††Á†ÁÁ†Á†††††††††Ú†Ú††††ÁÁÁÁÐÐнÄÄÄÄ………Â…Â……Ö…ÖÖ¶Ö¶ÖÄÄÄÄÄÄÄÄÄÄÄÄÄÄÐÄÄÄÄÄ…ÄÖ………ÂÂÂÂÂÂÂÂÂÂÂÏÏÏÏÏÏÚÀÀÀÀÀÎÎÎÎÎÎÎÚÁÃÁÁÁ¹Á¹Ð¹ÁÁÚÀÎÎεÎÀϹÐÄÖ…Ä…ÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄ……ÂÂÓÂÓ»×Ó»ÓÂÓÓ»ÓÓ»×»×ÂÓÂÓ»×Â×»×Ó××Â×Â×ÂÓ×ÓÓÓÓÓÓÓÓÓÅÓÓÓ×»ÓÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………Ö¶……¶…ÐÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐØÁØØÁ†††††ÁÁ†ÁÁ†††††††††Ú†Ú†Ú†††Á†ÁØÁÐÐÐÄÄÖ…Ä…Â…Â…Â…Â……ÄÖ¶Ö¶Ö¶ÖÄÄÄÄÄÐÄÄÄÐÄÄÐÄÄÄ…Ä…Ä………ÂÂÂÂÂÂÂÂÂÂÂÏÏÏÏÏÚÚÀÀÀÀÎÎεµÎÎÀÏÁ¹¹¹ÐÐÐÐÐÐÁÏÀÎÎεÎÎÀÁÐжօÖÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐжÖÂÂÂÓÓÂ×»Ó×ÓÓÂ××Â××»×××Â×Â×ÓÓÂ×Â×»××××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ×»×ÓÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Ö¶……¶…нÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐØÐØÁØØ††††††ÁÁ†Á††††††††††Ú†††Ú†††ÁÁÁØÐÐÐÄ…Ä………ÖÂ…Â…Â…Â………ĶֶÖÄÄÄÄÐÐÐÐÐÐÐÐÄÄÄÄÄÄ…Ä…Ö……ÂÂÂÂÂÂÂÂÂÂÂÏÏÏÏÏÚÀÚÀÀÀÎΰܰÎÀÏÁ¹ÐÐÐÐÐÐÐйÏÏÀÎÎÎÎÎÎÏÁÐÄÖ¶Ö¶ÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÄÖ…ÂÂÓÂÓÓ»Ó»Ó×Ó×Ó×××Ó×××××»×ÅÂÅ×××Â×Â××××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÅ×»Â×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………Ö¶Ö…¶ÕнннннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐØÁØÁ؆††Á†Á†ÁÁ†ÁÁ†††††††††††††††Á†ÁÁØØÐÐÄÄ……ÄÂ……ÂÂÂÂ……Â……ÖÖ¶Ö¶ÄÄÄÐÄÐÐÐÐÐÐÐÐÐÄÄÄ…Ä…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÏÁÏÏÏÏÚÀÀÀÎεܰÎÀÏÁÐÐÐÐÐÐÐÐÐйÏÚÀÎÎÎÎÎÀÁÐжÖÖ¶ÖÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐжօ…ÂÂÓÓÂÓ×»ÓÓÓÓÓÓÓÂÓÂ××××××ÓÅ××ÓÂÓÅÓ×××××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÅÓÂ××ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………………Ö¶…ĽնнօÄÕннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÐØÁØÁ†††ÁÁ†Á†ÁÁ†††††††††††††††Ú†ÁÁ†ÁÁØÐнą……ÂÂÂÂÂÂÂÂÂ…Â………Ö¶Ö¶ÄÄÄÐÐÐÐÐÐÐÐÐÐÄÄÄÖ…Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÁÁÏÁÏÏÚÀÀÎÎÎΰÎÀÚÁÐÐÐÐÐÐÄÐÄÐйÏÚÚÀÀÀÀÀÁ¹ÐÄÖ¶ÖÄÄÄÄÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐÄ……ÂÂÂÓÂÓÓÓÓÓÓÓÓÓÓÓÓ×Å×××××ÓÅ×ÓÓ××ÓÓ×ÓÓ××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓÂÓÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………¶Ö¶……¶…¶…¶……¶……ÐÐÕнÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØØØÁ؆††††Á†Á†Á††††††††††††††Ú††††ÁÁØÁÐÐÐÄÄÄ…ÂÂÂÂÂÂÂÂÂÂ……………Ö¶Ö¶ÖÄÄÐÐÐÐÐÐÐÐÄÄÄÖ¶Ö……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÏÁÁÏÁÚÀÀÀÎÎÎÎÎÎÚÁ¹ÐÐÐÐÐÄÄÄÐйÁÏÏÀÚÀÀÚÚÁÐжÖÖ¶ÄÄÄÄÄÐÐÐÐÐÐÐÐÐÐÐØÐÐØÐÐÐÐÐÐÄ…ÂÂÂ×»ÓÂÓÓÓÓÓÓÓÓÓÓÓÓ×Ó×××Ó××ÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÅÂÂÓÂ××ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â…………………¶Ö¶Ö…¶…Ä…Ä……¶…½…¶ÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÁØÁ††††††Á†Á††††††††††††††††††Á†ÁÁÁØØÐÐÄÖÄ……ÂÂÂÂÂÂÂÂÂÂÂ…………Ö¶ÖÄÄÄÐÐÐÐÐÐÐÐÐÄĶօ…ÒÂÂÂÂÂÂÂÂÂÂÂÂÂÂйÁÁÏÏÚÀÎÎÎÎÎÎÚÁÁÐÐÐÄÄÄÄÄÄÄÐйÏÏÏÏÚÚÚÁ¹ÐÄÖ¶ÄÄ…ÄÄÄÄÄÄÐÐÐÐÐÐÐØØÐØÐÐÐÐÐÐÐÄ……ÂÂÂÂÓÂÓ»ÓÓÓÓÓÓÓÓÓÓ×Ó×Ó×ÓÓÓÓ×××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÂ×»×ÓÂÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………………¶Ö¶Ö…Ä…Ä…Ä……½ÕÐ…ÄÕÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÁ؆††††Á†Á†Á††††††††††††Ú††††††Á†ÁÁØÐÐÄ………ÄÂÂÂÂÂÂÂÂÂÂÂÒÂ………Ö¶ÖÄÄÄÄÐÄÐÐÐÄÄÄÄÖ¶……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÁÏÏÏÀÀÎÎÎÎÎÎÀÁ¹ÐÐÐÄĶąÄÄÐÐÁÁÏÏÏÏÚÏÏÁÐĶÖÖ…ÄÄÄÄÄÄÄÄÄÐÐÐÐÐÐÐØÐÁØÐÐÐÐÐÐÄ……ÂÂÂÂ×ÓÂÓÓÓÓÓÓÓÓÓÓÓÓ×Ó×ÓÓÓÓÓ××××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ×ÅÓÂ×Â×ÓÓ»×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Â……………Ö……………Ä…¶ÖÐнннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÁØÁØÁ†††ÁÁ†Á†ÁÁ††††††††††††††Ú†††ÁÁØÁнÄÄÄ………ÖÂÂÂÂÂÂÂÂÂ……Â………ĶÖÄÄÄÄÄÄÄÄÄÄĶą…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÐÁÏÚÀÀÎÎÎÎÀÀÁÁÐÐÐÄ…ÖÖ…ÄÄÄйÁÁÁÁÏÏÏÏÁÐÐÄÖ¶ÄÖ¶ÄÄÄÄÄÄÄÐÐÐÐÐÐÐØÐÁÐÐÐÐÐÐÐ………»×Ó»××ÓÓÓÓÓÓÓÓÓ×Ó×ÓÓÓÓÓ××××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ××ÂÂ××»ÂÂ×»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………………Ä…½ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØÁØÁ؆†††ÁÁ†Á†††††††††††††††††Ú†††ÁÁØÐÐÄÄÄÄÄÄÂÂÂÂÂÂÂÂÂÂÂÂ………օĶÄÄÄÄÄÄÄÄĶօ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂйÏÁÀÀÎÎÎÎÎÚÁÁÐÐÄÄ…Ö……Ä…ÄÄй¹¹ÁÁÁÁÁÁ¹ÐÄ…ÄÖ…ÄÄ…ÄÄ…Ä…ÄÄÐÐÐÐÐØÐÁÐÁÐÐÐÐÄ…Ä…ÂÂÂÂÂÂ×»ÓÓÓÓ×ÓÓÓÓÓÓÓÓÓ×ÓÓÓÓÓÓÓ××ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ××ÓÓÂ×Â×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………Ä…¶Ð½ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØØÁØØÁ††††Á†Á†ÁÁÁ†††††††††††Ú†Ú††Á†ÁÁØØÐÐÐÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂ…Â……Ä…Ö¶ÖÄÄ…ÄÄÄÄÖ………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂйÁÏÀÀÎÎÎÎÀÁϹÐÐÄ…ÂÂÂÒ…ÄÄÐйÐÐйÁÏÁ¹ÐÄ…Ä…ÄÖ…ÄÄ…ÄÄ…ÄÄÐÐÐÐÐÐÐØÐÁÐÐÐÐÄ…………»ÓÓÂÓ×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓ»×»ÂÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………Ä…¶ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØØÁ؆††††Á†Á†Á†††††††††††††Ú†Ú††Á†ÁÁØÁÐÐÐÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂ…Â……Ö…Ö¶Ö¶Ä…Ä…Ö……ÖÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÁÏÚÀÀÎÎÎÀÏÁ¹ÐÄÄ…ÂÂÂÂÂÄÖÄÐÐйÐййØÐĶօąÄÄ…ÄÖ…ÄÄÖÄÐÐÐÐØÐØÁÐÐÐÐÐÄ………ÂÂÂÂÂÂÂÓ×»ÓÓ×ÓÓÓÓÓÓÓÓÓÓ×ÓÓÓÓÓÓÓ×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂ×Å»Â×Â×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………ÄսнÐÐнÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØØÁØÁÁÁÁ†††Á†ÁÁ††††††††††††††Ú†††ÁÁÁØÁÁÁÐÐÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂ………………Ö…Ö…Ö……………¹ÁÏÚÀÎÎÀÀÏÁÐÐĶ…ÂÂÂÂÂÂ…ÄÐÐÐÐÐÐÐйÐÐÐÄÖ¶ÖÂÖ…ÖÄ…ÄÖ…Ö¶ÐÐÐÐØÐØÐÐÁÐÐÐж……ÂÂÂÂÂÂÂ×»ÓÓÓÓÓÓÓÓÓÅÓÓÅÓÓÓ×ÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂ×ÓÂÓ»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………Ö……ннннннннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÁØÁØÁÁ††††ÁÁ†ÁÁ††††††††††††††††Á††ÁÁÁÁØÁÐÄÄÄ…ÂÂÂÂÂÂÂÂÂÂÂÂ…Â………………………………»»»»ÐÁÏÏÀÀÀÚÏÁ¹ÐÄ…ÂÂÂÂÂÂÂÂÄÄÄÐÄÄÐÐÐÐÐÐÐÄ……ÖÂÖ…Ä…Ö¿……ĶÄÐÐÐÐÐØÐØÐÐÐÐж……ÂÂÂÂÂÂÂ×»×ÓÓÓÓÓÅÓÓÓÓÅÓÓÅÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓÓÂÂÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………ÄÕÐÕннннннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØØÁØÁ؆†††††ÁÁ†Á††††††††††††††††ÁÁÁ†ÁÁÁÁÐÐÐÄ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÒÂ…Â……Ö»»»»ÂÐÏÁÚÚÚÚÏÁÐÐÄ…ÂÂÂÂÂÂÂÂ…ÄÄÄÄÄÄÄÄÐÐÐÐÄ…Ö…ÂÖ………Ä……………ÄÄÐÐÐØÐÐØÐÐÐÐÐÐ……ÂÂÂÂÂ×Â×»×»ÓÓÓÓÓÓÓÓÓÓÓÅÓÓÓÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓ»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………Ä…Ä…¶ÕннннннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐØØÁ؆†††††††ÁÁ†Á†††††††††††††Á††Á†Á†ÁÁÁÁÐÄÄ…ÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………»»Â»»¹ÁÏÏÏÚÏÁÐÐÄ…ÂÂÂÂÂÂÂÂÂÖÄÄÄÄÄÄÄÄÐÄÐÄÄÖ…ÂÖÂ……Â…Ö……ÖÄÖÐÐÐÐÐØÐÐÐÐÐÐÐÄ…ÂÂÂÂÂ×Â×»×»ÓÓÓÓÓÓÓÓ×ÓÓÅÓÅÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂ×Â×Â×ÓÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………ąĽннннннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁØÁ††††††††††††Á†††††††††††††††ÁÁ†Á†ÁÁØÐЅ»»ÂÂйÁÏÁÁ¹ÐÐą»»ÂÂÂÖ¶Ä…Ö…ÄÄÄÄÄÄÄ……ÂÖÂ…Â……Ö…………ÄÄÐÐÐØÐÐÐÐÐÐÐÐÄ……ÂÂÂ×ÓÂÓ»×»×ÓÓÓÓÓ×Ó×Ó×Ó×Ó×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ»Ó»××ÓÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………ąĽнннннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐØÐØÁ؆††††††††††Á†Á†††Ú††††††††††Á†Á†ÁÁÁÁÐÄą»¹ÁÁÁϹÐÄą»»»»ÂÂ…Ä…Â…Ö…ÄÄÄÄÄ…ÖÂÒÂÖ…………ÂÂÖ…Ö¶ÄÐÐÐÐØÐÐÐÐÐж……ÂÂÂ×»ÂÓÂÓ»ÓÓÓÓÓÓÓÓ×Ó×Ó×Ó×Ó×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓ»×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………ąֽнннÐÐнÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐÐÐØÐÐÐØÁØØØÁØÁ؆†††††Á†ÁÁ††††††††††††Á†Á†ÁÁÁÁÐÐÐ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂй¹ÁÐÐÄą»»ÂÂÂÖ…ÂÂÂ…ÄÖÄÖ¶Ö…ÂÒÂÒ…Â………ÂÂ………ÄÄÐÐÐØÐÐÐÐÐÄ…Ö……»׻×ÓÂÓÓÓÓÓÓÓ×ÓÓ×Ó×Ó×ÓÓÓÓÅÓÅÓÓÓÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………………¶Ö¶Ð½Ð½Ð½Ð½Ð½ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐØØØÁØÁ††††††††Á††††††††††††ÁÁÁ†Á†ÁÁØÁÐÄą»ÐÐÐÐÐÄ……»»ÂÂ…ÂÂÂÂÒ……Ö¶ÖÂÂÂ…Ò…ÂÖ……ÂÂÂ……ÖÄÐÐÐÐÐÐÐÐÐÄ…Ä……»׻×ÓÓÓÓÓÓÓÅ×Ó×Ó×Ó×Ó×ÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………………¶Ö¶Ð½Ð½Ð½Ð½ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐØØØÁØÁØÁ†††††ÁÁ††††††††††††Á†Á†Á†ÁÁØÐÐ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÐÐÄą»»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÒÂ…ÖÂÂÂÂÂ…Â…ÂÂÂÂÖÂ………ÄÐÐÐØÐÐнąą…Â…ÂÂÂÂÂÂ×»ÓÓÓÓÓÓÓÓÓ×Ó×Ó×ÓÓÓÓÓÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………………………Ö¶…½Ð½Ð½Ð½Ð½ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐØÁØÁØÁ؆†††††Á††††Ú††††††Á†Á†Á†ÁÁØÁÐÐÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÐÐĶ…Â»»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÂÂÂÂÂÂ…Â…ÂÂÂÂÂ…ÂÂ…ÖÄÐÐÐÐÐÐÐÄÄ……ÂÂÂÂÂÂÂÂÂÓÂÓÓÓÓÓÓÓÓÅ×Ó×Ó×Ó×Ó×ÓÓÅÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÂÂ×Â×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â………………………ֶսнннÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØÁØÁØÁØÁ†††Á††††††††††ÁÁ†Á†Á†Á†ÁÁØÐÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÄÄ……»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÖÂ…ÂÂÂÂÂÂÂÂ……ÄÐÐÐÐÐÐÐÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÓÂÓÓÓÓÓÓÓÓÓ×Ó×Ó×Ó×Ó×ÓÓÓÅÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ×Â×»×ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……………………………ֶнннннÐÐÐÐÐÐÐÐØÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐØØØØØØÁ؆††††††††††††Á†ÁÁ†Á†Á†ÁÁØØÐÐÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÖ…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÖÂÂÂÂÂ…Â…ÄÄÐÐÐÐÐж……Â»ÓÂÓÓÓÓÓÓÓÓÅ×Ó×Ó×ÓÓÓ×Ó×ÓÓÓÓÓ×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ×Â×Â×»ÂÂÂÂÂÂÂÂÂÂÂÂ……………………………¶Ö½Ð½Ð½Ð½Ð½ÐÐÐÐÐÐÐØØÐÐÐÐÐÐÐØÐÐØÐØÐÐÐÐÐÐÐÐÐÐÐÐØÁØØÁ††††††††Á†Á†Á†Á††††††Á†ÁÁØÐÄ…ÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂÖÂÂÂÂ……Ö¶ÐÐÐÐÐÄÄÖ…ÂÂÂÂÂÂÂÂÂÂÂÓÂÓÓÓÓÓÓÓÓÓ×Ó×Ó×Ó×Ó×Ó×Ó×Ó×Ó×ÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓ»×ÂÂÂÂÂÂÂÂÂÂÂÂÂ…Â……………………Ö¶Ö½…½Ð½Ð½ÐÐÐÐÐÐÐØÁØÁØÐÐÐÐØÐØÁØÐÐØÐÐÐØÐÐÐØÐØÐØØÁØØ†††††††††††Á†Á†ÁÁ†††††ÁÁØÁÐÐ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…ÂÂÂÂ…ÂÂÂ…Â……ÄÄÐÄжą……»ÂÓÂÓÓÓÓÓÓÓÓÓ×Ó×Ó×Ó×Ó×Ó×Ó×Ó×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓÓÂ×Â×ÂÂÂÂÂÂÂÂÂÂÂÂ…Â………………Ö¶…¶Ö½Ð½Ð½ÐÐÐÐÐÐÐØÁØØÐØÐØÐØØØØØÐÐÐÐÐÐØÐØÐØÐØÐÐÐÐØØØØÁ؆††††Á†Á†Á††††††Á†ÁÁØÐ½ÄÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÖÂÂÂÂÂÂÂÖ…ֶĶąօ……ÂÂÂÂÂÂÂÂÂÂÓ×ÓÂÓÓÓÓÓÓÓÓÓÓÓ×Ó×Ó×Ó×Ó×Ó×Ó×Ó×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂ×ÂÂÂÂÂÂÂÂÂÂÂÂÂ…………………………Ä…¶Ö½Ð½ÐÐÐÐÐÐÐØÁØØØØØØÁØÁØÁØÐØÐÐÐÐÐÐØÐØÐØÐÐÐÐÐÐÁØØØÁ††††††Á†Á†Á††††††Á†ÁØØÐ¶…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÂÂÂÂÂÂÂÂ……ÄÖ¶Ö¶……………»»×ÓÂÓÓÓÓÓÓÓÓÓÓÓ×Ó×Ó×Ó×Ó×Ó×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÂÂÂÂÂÂÂÂÂÂÂ…Â…………………Ä…¶ÕÐнÐÐÐÐÐÐØØÁØÁØÁØØÁØÁØØØÐØÐÐÐØÐÐØÐØÐØÐÐÐÐÐÐÐØØØ†††††Á†Á†Á†Á††††††Á†ÁÐÐÐÖÄÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ………ÂÂÂÂÂÂÂ…Â……ÄÖ¶Ö………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÓÂÓÂÓÂÓÓÓÓÓÓÓ×ÓÓÓÓÓÓÓ×Ó×Ó×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÂÓÂÂ×»ÂÂÂÂÂÂÂ…………………………Ä…¶…Ðн½ÐÐÐÐÐØØÁØÁØÁØØÁØØÐÐØÐØÐÐÐØÐÐØÐØÐÐÐÐÐÐÐÐÐØÁ††††††††Á†Á††††††ÁÁÁÁØØÐÄÄ……»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ…Ò……ÂÂÂÂÂÂÂÂÂ………Ö¶Ö……»ÓÂÓÂÓÓ×ÓÓ×Ó×Ó×ÓÓ×ÓÓ×ÓÓÓ×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÓ×ÂÓÂÂÂÂÂÂÂ……………………………Ä…½Ð½Ð½ÐÐÐÐÐÁØØÁØÁØÁØØÁÐØÐÐØÐÐÐÐÐØÐÐØÐÐÐÐÐÐÐÐÐÐÁØÁ؆††††Á†Á†††††††††ÁÁÁØÐÐÄÄÖ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……ÂÂÂÂÂÂÂ……Â………Ö…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÓÂÓÅ×Ó×ÓÓ×Ó×Ó×ÓÓ×ÓÓ×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÂÂ×ÓÂÂÂÂÂÂÂ………………………Ä…Ä…½Ð½Ð½ÐÐÐÐØÐÐØØØÁØÁØÐØÐØÐÐØÐÐÐÐÐØÐÐØÐÐÐÐÐÐÐÐÐÐÁØÁ؆††††Á†Á††††††Ú†Á†ÁØØÐÐÐÄ…………ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ……Â…Ö…ÂÂÂÂÂÂÂ………………………Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÓÓÓÓÓ×Ó×ÓÓ×Ó×Ó×ÓÓ×ÓÓ×Ó×ÅÓ×ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ»×ÂÂÂÂÂÂ……………………………Ä…¶Õн½ÐÐÐÐØÐÐØÐØÐØÐØÐØÐØÐØÐÐÐÐÐÐØÐØÐÐØÐÐÐÐÐÐÐÐÐØÁØÁØÁÁ†Á†Á††††††††††ÁÁÁÐÐÐÐÐÐÄÄ………»»Â»Â»Â»ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÒÂ………Ö…………Â……Â…Â………Â…Â…ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÓ×Å×Ó×Ó×ÓÓ×Ó×Ó×ÓÓ×ÓÓ×Ó×Ó×ÓÓÅÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ×ÂÂÂÂÂ…Â…………………………ąąнÐнÐÐÐÐÐÐÐØÐØÐØÐØÐØÐØÐÐÐÐÐÐÐÐØÐØÐÐØÐÐÐØÁÐÐØÁØÁØÁ؆Á†Á†††††††††Ú†Á†ÁØÁÐÐÐÐÐÄÄÄ……ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþþþþþþþþþþþýþýýýýýýýýýýýýýýüýüüüüüüüüüüüüüüûüûûûûûûûûûûûûûûúûúúúúúúúúúúúúúúùúùùùùùùùùùùùùùùøùøøøøøøøøøøøøøø÷ø÷÷÷÷÷÷÷÷÷÷÷÷÷÷ö÷ööööööööööööööõöõõõõõõõõõõõõõõôõôôôôôôôôôôôôôôóôóóóóóóóóóóóóóóòóòòòòòòòòòòòòòòñòññññññññññññññðñððððððððððððððïðïïïïïïïïïïïïïïîïîîîîîîîîîîîîîîíîííííííííííííííìíììììììììììììììþÿÿþÿÿÿÿÿÿÿÿþÿþþÿþþÿþþþþþþþþýþýýþýýþýýýýýýýýüýüüýüüýüüüüüüüüûüûûüûûüûûûûûûûûúûúúûúúûúúúúúúúúùúùùúùùúùùùùùùùùøùøøùøøùøøøøøøøø÷ø÷÷ø÷÷ø÷÷÷÷÷÷÷÷ö÷öö÷öö÷ööööööööõöõõöõõöõõõõõõõõôõôôõôôõôôôôôôôôóôóóôóóôóóóóóóóóòóòòóòòóòòòòòòòòñòññòññòññññññññðñððñððñððððððððïðïïðïïðïïïïïïïïîïîîïîîïîîîîîîîîíîííîííîííííííííìíììíììíììììììììíìííÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþþþþþþþþþþþýþýýýýýýýýýýýýýýüýüüüüüüüüüüüüüüûüûûûûûûûûûûûûûûúûúúúúúúúúúúúúúúùúùùùùùùùùùùùùùùøùøøøøøøøøøøøøøø÷ø÷÷÷÷÷÷÷÷÷÷÷÷÷÷ö÷ööööööööööööööõöõõõõõõõõõõõõõõôõôôôôôôôôôôôôôôóôóóóóóóóóóóóóóóòóòòòòòòòòòòòòòòñòññññññññññññññðñððððððððððððððïðïïïïïïïïïïïïïïîïîîîîîîîîîîîîîîíîííííííííííííííìíììììììììììììììÿÿþÿþÿÿÿÿÿÿÿþÿþÿþþÿþÿþþþþþþþýþýþýýþýþýýýýýýýüýüýüüýüýüüüüüüüûüûüûûüûüûûûûûûûúûúûúúûúûúúúúúúúùúùúùùúùúùùùùùùùøùøùøøùøùøøøøøøø÷ø÷ø÷÷ø÷ø÷÷÷÷÷÷÷ö÷ö÷öö÷ö÷öööööööõöõöõõöõöõõõõõõõôõôõôôõôõôôôôôôôóôóôóóôóôóóóóóóóòóòóòòóòóòòòòòòòñòñòññòñòñññññññðñðñððñðñðððððððïðïðïïðïðïïïïïïïîïîïîîïîïîîîîîîîíîíîííîíîíííííííìíìíììíìíìììììììíìíìþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþþþþþþþþþþþýþýýýýýýýýýýýýýýüýüüüüüüüüüüüüüüûüûûûûûûûûûûûûûûúûúúúúúúúúúúúúúúùúùùùùùùùùùùùùùùøùøøøøøøøøøøøøøø÷ø÷÷÷÷÷÷÷÷÷÷÷÷÷÷ö÷ööööööööööööööõöõõõõõõõõõõõõõõôõôôôôôôôôôôôôôôóôóóóóóóóóóóóóóóòóòòòòòòòòòòòòòòñòññññññññññññññðñððððððððððððððïðïïïïïïïïïïïïïïîïîîîîîîîîîîîîîîíîííííííííííííííìíìììììììììììììÿþÿÿþÿÿÿÿÿÿÿÿþÿþþÿþþÿþþþþþþþþýþýýþýýþýýýýýýýýüýüüýüüýüüüüüüüüûüûûüûûüûûûûûûûûúûúúûúúûúúúúúúúúùúùùúùùúùùùùùùùùøùøøùøøùøøøøøøøø÷ø÷÷ø÷÷ø÷÷÷÷÷÷÷÷ö÷öö÷öö÷ööööööööõöõõöõõöõõõõõõõõôõôôõôôõôôôôôôôôóôóóôóóôóóóóóóóóòóòòóòòóòòòòòòòòñòññòññòññññññññðñððñððñððððððððïðïïðïïðïïïïïïïïîïîîïîîïîîîîîîîîíîííîííîííííííííìíììíììíììììììììíìíþÿÿþÿÿÿÿÿÿÿÿþÿÿþÿþþÿþþþþþþþþýþþýþýýþýýýýýýýýüýýüýüüýüüüüüüüüûüüûüûûüûûûûûûûûúûûúûúúûúúúúúúúúùúúùúùùúùùùùùùùùøùùøùøøùøøøøøøøø÷øø÷ø÷÷ø÷÷÷÷÷÷÷÷ö÷÷ö÷öö÷ööööööööõööõöõõöõõõõõõõõôõõôõôôõôôôôôôôôóôôóôóóôóóóóóóóóòóóòóòòóòòòòòòòòñòòñòññòññññññññðññðñððñððððððððïððïðïïðïïïïïïïïîïïîïîîïîîîîîîîîíîîíîííîííííííííìííìíììíììììììììíììí \ No newline at end of file diff --git a/utilities/logo/src/main.rs b/utilities/logo/src/main.rs new file mode 100644 index 0000000..672580b --- /dev/null +++ b/utilities/logo/src/main.rs @@ -0,0 +1,14 @@ +#![cfg_attr(target_os = "none", no_std)] +#![cfg_attr(target_os = "none", no_main)] + +#[cfg(not(target_os = "none"))] +fn main() { + neotron_sdk::init(); +} + +#[no_mangle] +extern "C" fn neotron_main() -> i32 { + logo::main() +} + +// End of file From f7ae07afed5f03030fb871ff05bf9dc320d1dcf4 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Sun, 29 Dec 2024 22:15:33 +0000 Subject: [PATCH 6/9] Reformat mode command. Now it fits on one screen. --- neotron-os/src/commands/screen.rs | 90 +++++++++++++++++++++++-------- 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/neotron-os/src/commands/screen.rs b/neotron-os/src/commands/screen.rs index f8cf592..d913be1 100644 --- a/neotron-os/src/commands/screen.rs +++ b/neotron-os/src/commands/screen.rs @@ -65,31 +65,77 @@ fn print_modes() { let api = crate::API.get(); let current_mode = (api.video_get_mode)(); let mut any_mode = false; - for mode_no in 0..255 { - // Note (unsafe): we'll test if it's right before we try and use it - let Some(m) = Mode::try_from_u8(mode_no) else { - continue; - }; - let is_supported = (api.video_is_valid_mode)(m); - if is_supported { - any_mode = true; - let is_current = if current_mode == m { "*" } else { " " }; - let text_rows = m.text_height(); - let text_cols = m.text_width(); - let f = m.format(); - let width = m.horizontal_pixels(); - let height = m.vertical_lines(); - let hz = m.frame_rate_hz(); - if let (Some(text_rows), Some(text_cols)) = (text_rows, text_cols) { - // It's a text mode - osprintln!("{mode_no:3}{is_current}: {width} x {height} @ {hz} Hz {f} ({text_cols} x {text_rows})"); - } else { - // It's a framebuffer mode - let f = m.format(); - osprintln!("{mode_no:3}{is_current}: {width} x {height} @ {hz} Hz {f}"); + + let formats = [ + ("T16 ", neotron_common_bios::video::Format::Text8x16), + ("T8 ", neotron_common_bios::video::Format::Text8x8), + ("C32 ", neotron_common_bios::video::Format::Chunky32), + ("C16 ", neotron_common_bios::video::Format::Chunky16), + ("C8 ", neotron_common_bios::video::Format::Chunky8), + ("C4 ", neotron_common_bios::video::Format::Chunky4), + ("C2 ", neotron_common_bios::video::Format::Chunky2), + ("C1 ", neotron_common_bios::video::Format::Chunky1), + ]; + + osprint!(" "); + for (name, _) in formats { + osprint!("{}", name); + } + osprintln!(); + + for scaling in [ + neotron_common_bios::video::Scaling::None, + neotron_common_bios::video::Scaling::DoubleHeight, + neotron_common_bios::video::Scaling::DoubleWidth, + neotron_common_bios::video::Scaling::DoubleWidthAndHeight, + ] { + for timing in [ + neotron_common_bios::video::Timing::T640x480, + neotron_common_bios::video::Timing::T640x400, + neotron_common_bios::video::Timing::T800x600, + ] { + // check if any formats work for this timing mode + let mut any_format = false; + for (_, format) in formats { + let m = neotron_common_bios::video::Mode::new_with_scaling(timing, format, scaling); + let is_supported = (api.video_is_valid_mode)(m); + if is_supported { + any_format = true; + break; + } + } + // if there's a valid format, print the line (otherwise skip it for brevity) + if any_format { + let basic_mode = neotron_common_bios::video::Mode::new_with_scaling( + timing, + neotron_common_bios::video::Format::Chunky1, + scaling, + ); + osprint!( + "{:03}x{:03}:", + basic_mode.horizontal_pixels(), + basic_mode.vertical_lines() + ); + for (_, format) in formats { + let m = + neotron_common_bios::video::Mode::new_with_scaling(timing, format, scaling); + let is_supported = (api.video_is_valid_mode)(m); + if is_supported { + osprint!( + "{:03}{}", + m.as_u8(), + if current_mode == m { "<" } else { " " } + ); + any_mode = true; + } else { + osprint!("--- "); + } + } + osprintln!(); } } } + if !any_mode { osprintln!("No valid modes found"); } From 03b53607bfa891574a6239c9b142d3ae1cd5a6c9 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Mon, 30 Dec 2024 12:47:10 +0000 Subject: [PATCH 7/9] Update CHANGELOG --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e183303..f8f8c05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ ## Unreleased changes ([Source](https://github.com/neotron-compute/neotron-os/tree/develop) | [Changes](https://github.com/neotron-compute/neotron-os/compare/v0.8.1...develop)) -* None +* Add `GFX:` device and some ioctls for mode changing, plotting pixels and drawing lines +* Add `nbuild` build system +* Add a ROMFS containing `neoplay`, `snake`, `vidtest`, `logo` and `desktop` utilities / demos ## v0.8.1 - 2024-05-17 ([Source](https://github.com/neotron-compute/neotron-os/tree/v0.8.1) | [Release](https://github.com/neotron-compute/neotron-os/releases/tag/v0.8.1)) From 6bc14f7beb1d9beddef59b73ccf9eff85d728619 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Mon, 30 Dec 2024 15:23:24 +0000 Subject: [PATCH 8/9] Move drawing code into VgaConsole. --- neotron-os/src/lib.rs | 6 +- neotron-os/src/program.rs | 343 +----------------- neotron-os/src/vgaconsole.rs | 669 +++++++++++++++++++++++++++++------ 3 files changed, 568 insertions(+), 450 deletions(-) diff --git a/neotron-os/src/lib.rs b/neotron-os/src/lib.rs index a63c2e4..f2f450a 100644 --- a/neotron-os/src/lib.rs +++ b/neotron-os/src/lib.rs @@ -414,11 +414,7 @@ pub extern "C" fn os_main(api: &bios::Api) -> ! { let (width, height) = (mode.text_width(), mode.text_height()); if let (Some(width), Some(height)) = (width, height) { - let mut vga = vgaconsole::VgaConsole::new( - (api.video_get_framebuffer)(), - width as isize, - height as isize, - ); + let mut vga = vgaconsole::VgaConsole::new((api.video_get_framebuffer)(), width, height); vga.clear(); let mut guard = VGA_CONSOLE.lock(); *guard = Some(vga); diff --git a/neotron-os/src/program.rs b/neotron-os/src/program.rs index cef4de0..2d1570d 100644 --- a/neotron-os/src/program.rs +++ b/neotron-os/src/program.rs @@ -870,39 +870,11 @@ fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Res match command { GFX_COMMAND_CLEAR_SCREEN => { let colour = (value & 0xFFFFFF) as u32; - let fb_ptr = console.get_fb(); - let video_mode = console.get_mode(); - let pixel_byte = match video_mode.format() { - // neotron_common_bios::video::Format::Chunky32 unsupported - // neotron_common_bios::video::Format::Chunky16 unsupported - neotron_common_bios::video::Format::Chunky8 => colour as u8, - neotron_common_bios::video::Format::Chunky4 => { - let nibble = (colour as u8) & 0x0F; - nibble << 4 | nibble - } - neotron_common_bios::video::Format::Chunky2 => { - let pair = (colour as u8) & 0x03; - pair << 6 | pair << 4 | pair << 2 | pair - } - neotron_common_bios::video::Format::Chunky1 => { - let bit = (colour as u8) & 0x01; - if bit != 0 { - 0xFF - } else { - 0x00 - } - } - _ => return neotron_api::Result::Err(neotron_api::Error::BadHandle), - }; - for y in 0..video_mode.vertical_lines() { - let line_start = - unsafe { fb_ptr.byte_add(video_mode.line_size_bytes() * (y as usize)) } - as *mut u8; - unsafe { - line_start.write_bytes(pixel_byte, video_mode.line_size_bytes()); - } + if let Err(e) = console.gfx_clear(colour) { + Err(e).into() + } else { + Ok(0).into() } - Ok(0).into() } GFX_COMMAND_CHUNKY_PLOT => { // the position on screen @@ -913,34 +885,11 @@ fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Res let _mode = (value >> 24) as u8; // the colour to use let colour = (value & 0xFFFFFF) as u32; - let fb_ptr = console.get_fb(); - let video_mode = console.get_mode(); - if x >= video_mode.horizontal_pixels() { - return neotron_api::Result::Err(neotron_api::Error::InvalidArg); - } - if y >= video_mode.vertical_lines() { - return neotron_api::Result::Err(neotron_api::Error::InvalidArg); - } - if fb_ptr.is_null() { - return neotron_api::Result::Err(neotron_api::Error::NotFound); - } - // our video line starts here - let line_start = - unsafe { fb_ptr.byte_add(video_mode.line_size_bytes() * (y as usize)) } as *mut u8; - let chunky_plot_func = match video_mode.format() { - // neotron_common_bios::video::Format::Chunky32 unsupported - // neotron_common_bios::video::Format::Chunky16 unsupported - neotron_common_bios::video::Format::Chunky8 => chunky_plot::<8>, - neotron_common_bios::video::Format::Chunky4 => chunky_plot::<4>, - neotron_common_bios::video::Format::Chunky2 => chunky_plot::<2>, - neotron_common_bios::video::Format::Chunky1 => chunky_plot::<1>, - _ => { - return neotron_api::Result::Err(neotron_api::Error::InvalidArg); - } - }; - unsafe { - chunky_plot_func(line_start, x, colour); + if let Err(e) = console.gfx_plot(x, y, colour) { + return neotron_api::Result::Err(e); } + state.cursor_x = x; + state.cursor_y = y; neotron_api::Result::Ok(0) } GFX_COMMAND_CHANGE_MODE => { @@ -953,7 +902,7 @@ fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Res if unsafe { console.change_mode(video_mode, ptr) }.is_err() { return neotron_api::Result::Err(neotron_api::Error::DeviceSpecific); }; - // reset cursor on screen mode change + // reset our cursor on screen mode change state.cursor_x = 0; state.cursor_y = 0; neotron_api::Result::Ok(0) @@ -973,47 +922,21 @@ fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Res neotron_api::Result::Ok(0) } GFX_COMMAND_DRAW_LINE => { - let video_mode = console.get_mode(); - let fb_ptr = console.get_fb(); - let stride = video_mode.line_size_bytes(); let new_x = (value >> 48) as u16; let new_y = (value >> 32) as u16; let colour = (value & 0xFFFFFF) as u32; - if new_x >= video_mode.horizontal_pixels() { - return neotron_api::Result::Err(neotron_api::Error::InvalidArg); - } - if new_y >= video_mode.vertical_lines() { - return neotron_api::Result::Err(neotron_api::Error::InvalidArg); - } - // Adapted from https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#All_cases - let plot_line_func = match video_mode.format() { - // neotron_common_bios::video::Format::Chunky32 unsupported - // neotron_common_bios::video::Format::Chunky16 unsupported - neotron_common_bios::video::Format::Chunky8 => plot_line::<8>, - neotron_common_bios::video::Format::Chunky4 => plot_line::<4>, - neotron_common_bios::video::Format::Chunky2 => plot_line::<2>, - neotron_common_bios::video::Format::Chunky1 => plot_line::<1>, - _ => { - return neotron_api::Result::Err(neotron_api::Error::InvalidArg); - } + if let Err(e) = + console.gfx_draw_line(state.cursor_x, state.cursor_y, new_x, new_y, colour) + { + return neotron_api::Result::Err(e); }; - unsafe { - plot_line_func( - fb_ptr as *mut u8, - stride, - state.cursor_x as i16, - state.cursor_y as i16, - new_x as i16, - new_y as i16, - colour, - ) - } - state.cursor_x = new_x; state.cursor_y = new_y; neotron_api::Result::Ok(0) } GFX_COMMAND_SET_PALETTE => { + // the console doesn't care about the palette so I guess we'll still + // do that here let index = (value >> 24) as u8; let rgb_packed = (value & 0xFFFFFF) as u32; let api = crate::API.get(); @@ -1025,242 +948,6 @@ fn ioctl_gfx(state: &mut GfxState, command: u64, value: u64) -> neotron_api::Res } } -/// Plot a line -/// -/// # Safety -/// -/// Ensure `fb_ptr` points to a buffer that is at least `stride * (y_max + 1)` -/// bytes long, where `y_max` is the larger of `y0` and `y1`. -unsafe fn plot_line( - fb_ptr: *mut u8, - stride: usize, - mut x0: i16, - mut y0: i16, - x1: i16, - y1: i16, - colour: u32, -) { - let dx = x1.abs_diff(x0) as i16; - let sx = if x0 < x1 { 1 } else { -1 }; - let dy = -(y1.abs_diff(y0) as i16); - let sy = if y0 < y1 { 1 } else { -1 }; - let line_offset = if y0 < y1 { - stride as isize - } else { - -(stride as isize) - }; - let mut error = dx + dy; - let mut line_start = unsafe { fb_ptr.add(stride * y0 as usize) }; - loop { - chunky_plot::(line_start, x0 as u16, colour); - if x0 == x1 && y0 == y1 { - break; - } - let e2 = error * 2; - if e2 >= dy { - error += dy; - x0 += sx; - } - if e2 <= dx { - error += dx; - y0 += sy; - line_start = line_start.offset(line_offset); - } - } -} - -/// Plot a single pixel. -/// -/// # Safety -/// -/// Ensure `line_start` points to a buffer that is at least `x * BPP / 8` bytes long. -unsafe fn chunky_plot(line_start: *mut u8, x: u16, colour: u32) { - // this is 8, 4, 2 or 1 - let pixels_per_byte = 8 / BPP; - // pick a byte in the line - let byte_ptr = unsafe { line_start.add(x as usize / pixels_per_byte as usize) }; - // load the byte - let mut byte = unsafe { byte_ptr.read() }; - // this is pixels_per_byte-1 to 0, because the left hand pixel has the upper-most bits - let pixel_in_byte = (pixels_per_byte - 1) - (x % pixels_per_byte as u16) as u8; - // This is 2, 4, 16 or 256 - let num_colours = (1 << BPP) as u32; - // this is 0b1, 0b11, 0xF or 0xFF - let pixel_mask = num_colours - 1; - // this marks the pixels of interest - let shifted_pixel_mask = (pixel_mask << (pixel_in_byte * BPP)) as u8; - // cap the colour - let shifted_new_colour = ((colour & pixel_mask) << (pixel_in_byte * BPP)) as u8; - // zero out the old colour - byte &= !shifted_pixel_mask; - // set the new colour - byte |= shifted_new_colour; - // write it back - unsafe { - byte_ptr.write(byte); - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn chunky1_test() { - let mut buffer = vec![0x00u8; (640 / 8) + 1]; - - _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 0, 1) }; - assert_eq!( - &buffer[0..4], - [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 1, 1) }; - assert_eq!( - &buffer[0..4], - [0b1100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 8, 1) }; - assert_eq!( - &buffer[0..4], - [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 15, 1) }; - assert_eq!( - &buffer[0..4], - [0b1100_0000, 0b1000_0001, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 15, 0) }; - assert_eq!( - &buffer[0..4], - [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - } - - #[test] - fn chunky2_test() { - let mut buffer = vec![0x00u8; (640 / 4) + 1]; - - _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 0, 1) }; - assert_eq!( - &buffer[0..4], - [0b0100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 1, 2) }; - assert_eq!( - &buffer[0..4], - [0b0110_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 1, 3) }; - assert_eq!( - &buffer[0..4], - [0b0111_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 4, 1) }; - assert_eq!( - &buffer[0..4], - [0b0111_0000, 0b0100_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 7, 3) }; - assert_eq!( - &buffer[0..4], - [0b0111_0000, 0b0100_0011, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - } - - #[test] - fn chunky4_test() { - let mut buffer = vec![0x00u8; (640 / 2) + 1]; - - _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 0, 1) }; - assert_eq!( - &buffer[0..4], - [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 1, 2) }; - assert_eq!( - &buffer[0..4], - [0b0001_0010, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 1, 3) }; - assert_eq!( - &buffer[0..4], - [0b0001_0011, 0b0000_0000, 0b0000_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 4, 1) }; - assert_eq!( - &buffer[0..4], - [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_0000], - "Got {:02x?}", - &buffer[0..4] - ); - - _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 7, 15) }; - assert_eq!( - &buffer[0..4], - [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_1111], - "Got {:02x?}", - &buffer[0..4] - ); - } - - #[test] - fn chunky8_test() { - let mut buffer = vec![0x00u8; 641]; - - _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 0, 1) }; - assert_eq!(&buffer[0..4], [1, 0, 0, 0]); - - _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 1, 2) }; - assert_eq!(&buffer[0..4], [1, 2, 0, 0]); - - _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 1, 255) }; - assert_eq!(&buffer[0..4], [1, 255, 0, 0]); - - _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 3, 127) }; - assert_eq!(&buffer[0..4], [1, 255, 0, 127],); - - _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 3, 255) }; - assert_eq!(&buffer[0..4], [1, 255, 0, 255],); - } -} - // =========================================================================== // End of file // =========================================================================== diff --git a/neotron-os/src/vgaconsole.rs b/neotron-os/src/vgaconsole.rs index e711b93..3304e9b 100644 --- a/neotron-os/src/vgaconsole.rs +++ b/neotron-os/src/vgaconsole.rs @@ -52,12 +52,13 @@ impl VgaConsole { false, ); - pub fn new(addr: *mut u32, width: isize, height: isize) -> VgaConsole { + pub fn new(addr: *mut u32, width_chars: u16, height_chars: u16) -> VgaConsole { VgaConsole { inner: ConsoleInner { addr, - width, - height, + width_chars, + height_chars, + mode: FramebufferMode::Text, row: 0, col: 0, attr: Self::DEFAULT_ATTR, @@ -79,27 +80,61 @@ impl VgaConsole { &mut self, mode: Mode, fb_ptr: *mut u32, - ) -> Result<(), neotron_common_bios::Error> { + ) -> Result<(), neotron_api::Error> { // TODO: support bitmap text rendering whilst in graphics mode // Change mode with the BIOS and return the result let api = crate::API.get(); - if let neotron_common_bios::FfiResult::Err(e) = (api.video_set_mode)(mode, fb_ptr) { - return Err(e); + if let neotron_common_bios::FfiResult::Err(_e) = (api.video_set_mode)(mode, fb_ptr) { + // BIOS says no + return Err(neotron_api::Error::DeviceSpecific); } - // set up the console for this mode - if let (Some(height), Some(width)) = (mode.text_height(), mode.text_width()) { - // it's a text mode - self.inner.height = height as isize; - self.inner.width = width as isize; - // get whatever buffer the BIOS chose to use - self.inner.addr = (api.video_get_framebuffer)(); - self.clear(); - } else { - // it's a graphics mode - disable output - self.inner.height = 0; - self.inner.width = 0; - self.inner.addr = core::ptr::null_mut(); + // get whatever buffer the BIOS chose to use + self.inner.addr = (api.video_get_framebuffer)(); + match mode.format() { + neotron_common_bios::video::Format::Text8x16 + | neotron_common_bios::video::Format::Text8x8 => { + self.inner.mode = FramebufferMode::Text; + // set up the console for this mode + self.inner.height_chars = mode.text_height().unwrap(); + self.inner.width_chars = mode.text_width().unwrap(); + self.clear(); + } + neotron_common_bios::video::Format::Chunky1 => { + self.inner.mode = FramebufferMode::Graphics { + width: mode.horizontal_pixels(), + height: mode.vertical_lines(), + format: FramebufferFormat::Chunky1, + stride: mode.line_size_bytes(), + }; + } + neotron_common_bios::video::Format::Chunky2 => { + self.inner.mode = FramebufferMode::Graphics { + width: mode.horizontal_pixels(), + height: mode.vertical_lines(), + format: FramebufferFormat::Chunky2, + stride: mode.line_size_bytes(), + }; + } + neotron_common_bios::video::Format::Chunky4 => { + self.inner.mode = FramebufferMode::Graphics { + width: mode.horizontal_pixels(), + height: mode.vertical_lines(), + format: FramebufferFormat::Chunky4, + stride: mode.line_size_bytes(), + }; + } + neotron_common_bios::video::Format::Chunky8 => { + self.inner.mode = FramebufferMode::Graphics { + width: mode.horizontal_pixels(), + height: mode.vertical_lines(), + format: FramebufferFormat::Chunky8, + stride: mode.line_size_bytes(), + }; + } + _ => { + return Err(neotron_api::Error::Unimplemented); + } } Ok(()) @@ -107,11 +142,9 @@ impl VgaConsole { /// Clear the screen. /// - /// Every character on the screen is replaced with an space (U+0020). + /// In text mode, every character on the screen is replaced with an space (U+0020). pub fn clear(&mut self) { - self.inner.cursor_disable(); self.inner.clear(); - self.inner.cursor_enable(); } /// Write a UTF-8 byte string to the console. @@ -133,16 +166,172 @@ impl VgaConsole { } /// Get the framebuffer pointer - pub fn get_fb(&self) -> *mut u32 { + fn get_fb(&self) -> *mut u32 { let api = crate::API.get(); (api.video_get_framebuffer)() } + + /// Clear the bitmap + /// + /// Returns an error if we're not in bitmap mode + pub fn gfx_clear(&mut self, colour: u32) -> Result<(), neotron_api::Error> { + let FramebufferMode::Graphics { + height, + format, + stride, + .. + } = &self.inner.mode + else { + return Err(neotron_api::Error::InvalidArg); + }; + let fb_ptr = self.get_fb(); + let pixel_byte = match format { + FramebufferFormat::Chunky8 => colour as u8, + FramebufferFormat::Chunky4 => { + let nibble = (colour as u8) & 0x0F; + nibble << 4 | nibble + } + FramebufferFormat::Chunky2 => { + let pair = (colour as u8) & 0x03; + pair << 6 | pair << 4 | pair << 2 | pair + } + FramebufferFormat::Chunky1 => { + let bit = (colour as u8) & 0x01; + if bit != 0 { + 0xFF + } else { + 0x00 + } + } + }; + for y in 0..*height { + let line_start = unsafe { fb_ptr.byte_add(*stride * (y as usize)) } as *mut u8; + unsafe { + line_start.write_bytes(pixel_byte, *stride); + } + } + Ok(()) + } + + /// Draw a line + /// + /// Draw a line between `x0, y0` and `x1, y1` in `colour` + /// + /// Returns an error if any of the points are off-screen. + pub fn gfx_draw_line( + &mut self, + x0: u16, + y0: u16, + x1: u16, + y1: u16, + colour: u32, + ) -> Result<(), neotron_api::Error> { + let FramebufferMode::Graphics { + width, + height, + format, + stride, + } = &self.inner.mode + else { + return Err(neotron_api::Error::InvalidArg); + }; + let fb_ptr = self.get_fb(); + if x0 >= *width { + return Err(neotron_api::Error::InvalidArg); + } + if y1 >= *height { + return Err(neotron_api::Error::InvalidArg); + } + if x1 >= *width { + return Err(neotron_api::Error::InvalidArg); + } + if y1 >= *height { + return Err(neotron_api::Error::InvalidArg); + } + let plot_line_func = match format { + FramebufferFormat::Chunky8 => plot_line::<8>, + FramebufferFormat::Chunky4 => plot_line::<4>, + FramebufferFormat::Chunky2 => plot_line::<2>, + FramebufferFormat::Chunky1 => plot_line::<1>, + }; + unsafe { + plot_line_func( + fb_ptr as *mut u8, + *stride, + x0 as i16, + y0 as i16, + x1 as i16, + y1 as i16, + colour, + ) + } + Ok(()) + } + + /// Plot a single pixel at `x, y` in `colour` + pub fn gfx_plot(&mut self, x: u16, y: u16, colour: u32) -> Result<(), neotron_api::Error> { + let FramebufferMode::Graphics { + width, + height, + format, + stride, + } = &self.inner.mode + else { + return Err(neotron_api::Error::InvalidArg); + }; + let fb_ptr = self.get_fb(); + if x >= *width { + return Err(neotron_api::Error::InvalidArg); + } + if y >= *height { + return Err(neotron_api::Error::InvalidArg); + } + if fb_ptr.is_null() { + return Err(neotron_api::Error::NotFound); + } + // our video line starts here + let line_start = unsafe { fb_ptr.byte_add(*stride * (y as usize)) } as *mut u8; + let chunky_plot_func = match format { + FramebufferFormat::Chunky8 => chunky_plot::<8>, + FramebufferFormat::Chunky4 => chunky_plot::<4>, + FramebufferFormat::Chunky2 => chunky_plot::<2>, + FramebufferFormat::Chunky1 => chunky_plot::<1>, + }; + unsafe { + chunky_plot_func(line_start, x, colour); + } + + Ok(()) + } } // =========================================================================== // Private types // =========================================================================== +#[derive(Debug, PartialEq, Eq)] +enum FramebufferMode { + Graphics { + /// width in pixels + width: u16, + /// height in pixels + height: u16, + /// pixel format + format: FramebufferFormat, + /// How many bytes per line? + stride: usize, + }, + Text, +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +enum FramebufferFormat { + Chunky1, + Chunky2, + Chunky4, + Chunky8, +} + /// Handles the inner details of where we are on screen. /// /// Separate from the parser, so it can be passed to the `advance` method. @@ -151,14 +340,16 @@ struct ConsoleInner { /// /// Always 32-bit aligned. addr: *mut u32, + /// our current screen format + mode: FramebufferMode, /// The width of the screen in characters - width: isize, + width_chars: u16, /// The height of the screen in characters - height: isize, + height_chars: u16, /// The current row position in characters - row: isize, + row: u16, /// The current column position in characters - col: isize, + col: u16, /// The attribute to apply to the next character we draw attr: Attr, /// Have we seen the ANSI 'bold' command? @@ -184,10 +375,14 @@ impl ConsoleInner { /// Replace the glyph at the current location with a cursor. fn cursor_enable(&mut self) { - self.cursor_depth -= 1; - if self.cursor_depth == 0 && self.cursor_wanted && self.cursor_holder.is_none() { + self.cursor_depth = self.cursor_depth.saturating_sub(1); + if self.cursor_depth == 0 + && self.cursor_wanted + && self.cursor_holder.is_none() + && self.mode == FramebufferMode::Text + { // Remember what was where our cursor is (unless the cursor is off-screen, when we make something up) - if self.row >= 0 && self.row < self.height && self.col >= 0 && self.col < self.width { + if self.row < self.height_chars && self.col < self.width_chars { let value = self.read(); self.write_at(self.row, self.col, b'_', true); self.cursor_holder = Some(value); @@ -200,7 +395,7 @@ impl ConsoleInner { /// Replace the cursor at the current location with its previous contents. fn cursor_disable(&mut self) { if let Some(glyph) = self.cursor_holder.take() { - if self.row >= 0 && self.row < self.height && self.col >= 0 && self.col < self.width { + if self.row < self.height_chars && self.col < self.width_chars { // cursor was on-screen, so restore it self.write(glyph); } @@ -211,27 +406,29 @@ impl ConsoleInner { /// Move the cursor relative to the current location. /// /// Clamps to the visible screen. - fn move_cursor_relative(&mut self, rows: isize, cols: isize) { - self.row += rows; - self.col += cols; - if self.row < 0 { + fn move_cursor_relative(&mut self, rows: i16, cols: i16) { + let new_row = self.row as i16 + rows; + if new_row < 0 { self.row = 0; + } else if new_row >= self.height_chars as i16 { + self.row = self.height_chars - 1; + } else { + self.row = new_row as u16; } - if self.col < 0 { + let new_col = self.col as i16 + cols; + if new_col < 0 { self.col = 0; - } - if self.row >= self.height { - self.row = self.height - 1; - } - if self.col >= self.width { - self.col = self.width - 1; + } else if new_col >= self.width_chars as i16 { + self.col = self.width_chars - 1; + } else { + self.col = new_col as u16; } } /// Move the cursor to the given location. /// /// Clamps to the visible screen. - fn move_cursor_absolute(&mut self, rows: isize, cols: isize) { + fn move_cursor_absolute(&mut self, rows: u16, cols: u16) { // move it self.row = rows; self.col = cols; @@ -249,11 +446,11 @@ impl ConsoleInner { /// We defer this so you can write the last char on the last line without /// causing it to scroll pre-emptively. fn scroll_as_required(&mut self) { - while self.col >= self.width { - self.col -= self.width; + while self.col >= self.width_chars { + self.col -= self.width_chars; self.row += 1; } - while self.row >= self.height { + while self.row >= self.height_chars { self.row -= 1; self.scroll_page(); } @@ -261,12 +458,14 @@ impl ConsoleInner { /// Blank the screen fn clear(&mut self) { - for row in 0..self.height { - for col in 0..self.width { + self.cursor_disable(); + for row in 0..self.height_chars { + for col in 0..self.width_chars { self.write_at(row, col, b' ', false); } } self.home(); + self.cursor_enable(); } /// Put a glyph at the current position on the screen. @@ -279,20 +478,21 @@ impl ConsoleInner { /// Put a glyph at a given position on the screen. /// /// Don't do this if the cursor is enabled. - fn write_at(&mut self, row: isize, col: isize, glyph: u8, is_cursor: bool) { - if self.addr.is_null() { - // console disabled + fn write_at(&mut self, row: u16, col: u16, glyph: u8, is_cursor: bool) { + if self.mode != FramebufferMode::Text { + // console disabled. + // TODO: support bitmap font rendering onto a graphical framebuffer return; } - assert!(row < self.height, "{} >= {}?", row, self.height); - assert!(col < self.width, "{} => {}?", col, self.width); + assert!(row < self.height_chars, "{} >= {}?", row, self.height_chars); + assert!(col < self.width_chars, "{} => {}?", col, self.width_chars); if !crate::IS_PANIC.load(core::sync::atomic::Ordering::Relaxed) && !is_cursor { assert!(self.cursor_holder.is_none()); } - let offset = ((row * self.width) + col) * 2; + let offset = ((row * self.width_chars) + col) * 2; let byte_addr = self.addr as *mut u8; - unsafe { core::ptr::write_volatile(byte_addr.offset(offset), glyph) }; + unsafe { core::ptr::write_volatile(byte_addr.add(offset as usize), glyph) }; let attr = if self.reverse { let new_fg = self.attr.bg().make_foreground(); let new_bg = self.attr.fg().make_background(); @@ -301,7 +501,7 @@ impl ConsoleInner { self.attr }; - unsafe { core::ptr::write_volatile(byte_addr.offset(offset + 1), attr.as_u8()) }; + unsafe { core::ptr::write_volatile(byte_addr.add(offset as usize + 1), attr.as_u8()) }; } /// Read a glyph at the current position @@ -314,41 +514,43 @@ impl ConsoleInner { /// Read a glyph at the given position /// /// Don't do this if the cursor is enabled. - fn read_at(&mut self, row: isize, col: isize) -> u8 { - if self.addr.is_null() { - // console disabled - everything is a blank space - return b' '; + fn read_at(&mut self, row: u16, col: u16) -> u8 { + if self.mode != FramebufferMode::Text { + // console disabled + // TODO: support bitmap font parsing off of a graphical framebuffer + return 0; } - assert!(row < self.height, "{} >= {}?", row, self.height); - assert!(col < self.width, "{} => {}?", col, self.width); + assert!(row < self.height_chars, "{} >= {}?", row, self.height_chars); + assert!(col < self.width_chars, "{} => {}?", col, self.width_chars); if !crate::IS_PANIC.load(core::sync::atomic::Ordering::Relaxed) { assert!(self.cursor_holder.is_none()); } - let offset = ((row * self.width) + col) * 2; + let offset = ((row * self.width_chars) + col) * 2; let byte_addr = self.addr as *const u8; - unsafe { core::ptr::read_volatile(byte_addr.offset(offset)) } + unsafe { core::ptr::read_volatile(byte_addr.add(offset as usize)) } } /// Move everyone on screen up one line, losing the top line. /// /// The bottom line will be all space characters. fn scroll_page(&mut self) { - if self.height == 0 && self.width == 0 { + if self.mode != FramebufferMode::Text { // console disabled + // TODO: support bitmap font rendering onto a graphical framebuffer return; } - let row_len_words = self.width / 2; + let row_len_words = self.width_chars / 2; unsafe { // Scroll rows[1..=height-1] to become rows[0..=height-2]. core::ptr::copy( - self.addr.offset(row_len_words), + self.addr.add(row_len_words as usize), self.addr, - (row_len_words * (self.height - 1)) as usize, + (row_len_words * (self.height_chars - 1)) as usize, ); } // Blank the bottom line of the screen (rows[height-1]). - for col in 0..self.width { - self.write_at(self.height - 1, col, b' ', false); + for col in 0..self.width_chars { + self.write_at(self.height_chars - 1, col, b' ', false); } } @@ -594,8 +796,8 @@ impl vte::Perform for ConsoleInner { action: char, ) { // Just in case you want a single parameter, here it is - let mut first = *params.iter().next().and_then(|s| s.first()).unwrap_or(&1) as isize; - let mut second = *params.iter().nth(1).and_then(|s| s.first()).unwrap_or(&1) as isize; + let mut first = *params.iter().next().and_then(|s| s.first()).unwrap_or(&1) as i32; + let mut second = *params.iter().nth(1).and_then(|s| s.first()).unwrap_or(&1) as i32; match action { 'm' => { @@ -691,42 +893,44 @@ impl vte::Perform for ConsoleInner { if first == 0 { first = 1; } - self.move_cursor_relative(-first, 0); + self.move_cursor_relative(-first as i16, 0); } 'B' => { // Cursor Down if first == 0 { first = 1; } - self.move_cursor_relative(first, 0); + self.move_cursor_relative(first as i16, 0); } 'C' => { // Cursor Forward if first == 0 { first = 1; } - self.move_cursor_relative(0, first); + self.move_cursor_relative(0, first as i16); } 'D' => { // Cursor Back if first == 0 { first = 1; } - self.move_cursor_relative(0, -first); + self.move_cursor_relative(0, -first as i16); } 'E' => { // Cursor next line if first == 0 { first = 1; } - self.move_cursor_absolute(self.row + first, 0); + self.move_cursor_relative(first as i16, 0); + self.move_cursor_absolute(self.row, 0); } 'F' => { // Cursor previous line if first == 0 { first = 1; } - self.move_cursor_absolute(self.row - first, 0); + self.move_cursor_relative(-first as i16, 0); + self.move_cursor_absolute(self.row, 0); } 'G' => { // Cursor horizontal absolute @@ -734,7 +938,7 @@ impl vte::Perform for ConsoleInner { first = 1; } // We are zero-indexed, ANSI is 1-indexed - self.move_cursor_absolute(self.row, first - 1); + self.move_cursor_absolute(self.row, (first - 1) as u16); } 'H' | 'f' => { // Cursor Position (or Horizontal Vertical Position) @@ -745,15 +949,15 @@ impl vte::Perform for ConsoleInner { second = 1; } // We are zero-indexed, ANSI is 1-indexed - self.move_cursor_absolute(first - 1, second - 1); + self.move_cursor_absolute((first - 1) as u16, (second - 1) as u16); } 'J' => { // Erase in Display match first { 0 => { // Erase the cursor through the end of the display - for row in 0..self.height { - for col in 0..self.width { + for row in 0..self.height_chars { + for col in 0..self.width_chars { if row > self.row || (row == self.row && col >= self.col) { self.write_at(row, col, b' ', false); } @@ -762,8 +966,8 @@ impl vte::Perform for ConsoleInner { } 1 => { // Erase from the beginning of the display through the cursor - for row in 0..self.height { - for col in 0..self.width { + for row in 0..self.height_chars { + for col in 0..self.width_chars { if row < self.row || (row == self.row && col <= self.col) { self.write_at(row, col, b' ', false); } @@ -772,8 +976,8 @@ impl vte::Perform for ConsoleInner { } 2 => { // Erase the complete display - for row in 0..self.height { - for col in 0..self.width { + for row in 0..self.height_chars { + for col in 0..self.width_chars { self.write_at(row, col, b' ', false); } } @@ -788,7 +992,7 @@ impl vte::Perform for ConsoleInner { match first { 0 => { // Erase the cursor through the end of the line - for col in self.col..self.width { + for col in self.col..self.width_chars { self.write_at(self.row, col, b' ', false); } } @@ -800,7 +1004,7 @@ impl vte::Perform for ConsoleInner { } 2 => { // Erase the complete line - for col in 0..self.width { + for col in 0..self.width_chars { self.write_at(self.row, col, b' ', false); } } @@ -836,7 +1040,83 @@ impl vte::Perform for ConsoleInner { // Private functions // =========================================================================== -// None +/// Plot a line +/// +/// Adapted from https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#All_cases +/// +/// # Safety +/// +/// Ensure `fb_ptr` points to a buffer that is at least `stride * (y_max + 1)` +/// bytes long, where `y_max` is the larger of `y0` and `y1`. +unsafe fn plot_line( + fb_ptr: *mut u8, + stride: usize, + mut x0: i16, + mut y0: i16, + x1: i16, + y1: i16, + colour: u32, +) { + let dx = x1.abs_diff(x0) as i16; + let sx = if x0 < x1 { 1 } else { -1 }; + let dy = -(y1.abs_diff(y0) as i16); + let sy = if y0 < y1 { 1 } else { -1 }; + let line_offset = if y0 < y1 { + stride as isize + } else { + -(stride as isize) + }; + let mut error = dx + dy; + let mut line_start = unsafe { fb_ptr.add(stride * y0 as usize) }; + loop { + chunky_plot::(line_start, x0 as u16, colour); + if x0 == x1 && y0 == y1 { + break; + } + let e2 = error * 2; + if e2 >= dy { + error += dy; + x0 += sx; + } + if e2 <= dx { + error += dx; + y0 += sy; + line_start = line_start.offset(line_offset); + } + } +} + +/// Plot a single pixel into one line of video. +/// +/// # Safety +/// +/// Ensure `line_start` points to a buffer that is at least `x * BPP / 8` bytes long. +unsafe fn chunky_plot(line_start: *mut u8, x: u16, colour: u32) { + // this is 8, 4, 2 or 1 + let pixels_per_byte = 8 / BPP; + // pick a byte in the line + let byte_ptr = unsafe { line_start.add(x as usize / pixels_per_byte as usize) }; + // load the byte + let mut byte = unsafe { byte_ptr.read() }; + // this is pixels_per_byte-1 to 0, because the left hand pixel has the upper-most bits + let pixel_in_byte = (pixels_per_byte - 1) - (x % pixels_per_byte as u16) as u8; + // This is 2, 4, 16 or 256 + let num_colours = (1 << BPP) as u32; + // this is 0b1, 0b11, 0xF or 0xFF + let pixel_mask = num_colours - 1; + // this marks the pixels of interest + let shifted_pixel_mask = (pixel_mask << (pixel_in_byte * BPP)) as u8; + // cap the colour + let shifted_new_colour = ((colour & pixel_mask) << (pixel_in_byte * BPP)) as u8; + // zero out the old colour + byte &= !shifted_pixel_mask; + // set the new colour + byte |= shifted_new_colour; + // write it back + unsafe { + byte_ptr.write(byte); + } +} // =========================================================================== // Public functions @@ -850,7 +1130,7 @@ impl vte::Perform for ConsoleInner { #[cfg(test)] mod tests { - use super::VgaConsole; + use super::{chunky_plot, VgaConsole}; const WIDTH: usize = 12; const HEIGHT: usize = 7; @@ -882,7 +1162,7 @@ mod tests { #[test] fn basic_print() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"Hello\n"); assert_eq!( print_buffer(&buffer), @@ -902,7 +1182,7 @@ mod tests { #[test] fn cr_overprint() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"0\r1\n"); // Second row assert_eq!(console.inner.row, 1); @@ -927,14 +1207,14 @@ mod tests { #[test] fn scroll() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"0\n"); console.write_bstr(b"1\n"); for _ in 0..HEIGHT - 1 { console.write_bstr(b"\n"); } // We are now off the bottom of the screen - assert_eq!(console.inner.row, HEIGHT as isize); + assert_eq!(console.inner.row, HEIGHT as u16); assert_eq!(console.inner.col, 0); // And the '1' is on the top row assert_eq!( @@ -953,7 +1233,7 @@ mod tests { #[test] fn home1() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print 0 and replace it with a 1 console.write_bstr(b"0\n\x1b[0;0H1\n"); // We are on the second row @@ -976,7 +1256,7 @@ mod tests { #[test] fn home2() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print 0 and replace it with a 1 console.write_bstr(b"0\n\x1b[1;1H1\n"); // And the '1' has replaced the '0' @@ -996,7 +1276,7 @@ mod tests { #[test] fn home3() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print 0 and replace it with a 1 console.write_bstr(b"0\n\x1b[H1\n"); // The '1' has replaced the '0' @@ -1019,7 +1299,7 @@ mod tests { #[test] fn movecursor() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print 0 and replace it with a 1 console.write_bstr(b"\x1b[2;2H1"); assert_eq!( @@ -1041,7 +1321,7 @@ mod tests { #[test] fn sgr_reset() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"\x1b[0m1"); assert_eq!( print_buffer(&buffer), @@ -1061,7 +1341,7 @@ mod tests { #[test] fn sgr_backgrounds() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // +-------+-----+-----+-----+-----+-----+-----+-----+ // + BLINK | BG2 | BG1 | BG0 | FG3 | FG2 | FG1 | FG0 | // +-------+-----+-----+-----+-----+-----+-----+-----+ @@ -1098,7 +1378,7 @@ mod tests { #[test] fn sgr_foregrounds() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // +-------+-----+-----+-----+-----+-----+-----+-----+ // + BLINK | BG2 | BG1 | BG0 | FG3 | FG2 | FG1 | FG0 | // +-------+-----+-----+-----+-----+-----+-----+-----+ @@ -1135,7 +1415,7 @@ mod tests { #[test] fn sgr_bold() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // +-------+-----+-----+-----+-----+-----+-----+-----+ // + BLINK | BG2 | BG1 | BG0 | FG3 | FG2 | FG1 | FG0 | // +-------+-----+-----+-----+-----+-----+-----+-----+ @@ -1174,7 +1454,7 @@ mod tests { #[test] fn sgr_all_three() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // +-------+-----+-----+-----+-----+-----+-----+-----+ // + BLINK | BG2 | BG1 | BG0 | FG3 | FG2 | FG1 | FG0 | // +-------+-----+-----+-----+-----+-----+-----+-----+ @@ -1206,7 +1486,7 @@ mod tests { #[test] fn cursor_up() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Go home, print 0\n then go up a line and replace the 0 with a 1 console.write_bstr(b"\x1b[H0\n\x1b[A1"); assert_eq!( @@ -1272,7 +1552,7 @@ mod tests { #[test] fn cursor_down() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Go home, go down 1 line, and print 0 console.write_bstr(b"\x1b[H\x1b[B0"); assert_eq!( @@ -1338,7 +1618,7 @@ mod tests { #[test] fn cursor_forward() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print .0.1.2..3 console.write_bstr(b"\x1b[C0"); console.write_bstr(b"\x1b[0C1"); @@ -1360,7 +1640,7 @@ mod tests { #[test] fn cursor_backwards() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print 123 then replace the 3 with a 4 console.write_bstr(b"123\x1b[D4"); assert_eq!( @@ -1418,7 +1698,7 @@ mod tests { #[test] fn cursor_next_line() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Go home, print xxx, go down 1 line, and print 0 console.write_bstr(b"\x1b[Hxxx\x1b[E0"); // We should have returned to col 0 for the '0' so are in col 1 @@ -1485,7 +1765,7 @@ mod tests { #[test] fn cursor_previous_line() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print xx, xx, 11, 22, 33, 456 on the first five lines // Then go back and replace 4 with 7, 3 with 8, 2 with 9 and the first x with 0 console.write_bstr(b"xx\nxx\n11\n22\n33\n456\x1b[F7\x1b[0F8\x1b[1F9\x1b[2F0"); @@ -1508,7 +1788,7 @@ mod tests { #[test] fn cursor_horizontal_absolute() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // Print 12345 the replace the 3 with a 9 console.write_bstr(b"12345\x1b[3G9"); assert_eq!( @@ -1529,7 +1809,7 @@ mod tests { #[test] fn cursor_position() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); // In row;col form. console.write_bstr(b"xxx\x1b[H0\x1b[;3H1\x1b[2;H2\x1b[3;4H3"); // the 4 should be in the right-hand column, and the 5 should wrap @@ -1553,7 +1833,7 @@ mod tests { #[test] fn erase_in_display_cursor_to_end() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"xxx\nxxx\n\x1b[2;2H"); assert_eq!(console.inner.row, 1); assert_eq!(console.inner.col, 1); @@ -1576,7 +1856,7 @@ mod tests { #[test] fn erase_in_display_start_to_cursor() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"xxx\nxxx\n\x1b[2;2H"); assert_eq!(console.inner.row, 1); assert_eq!(console.inner.col, 1); @@ -1599,7 +1879,7 @@ mod tests { #[test] fn erase_in_display_entire_screen() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"xxx\nxxx\n\x1b[2;2H"); assert_eq!(console.inner.row, 1); assert_eq!(console.inner.col, 1); @@ -1622,7 +1902,7 @@ mod tests { #[test] fn erase_in_line_cursor_to_end() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"xxx\nxxx\n\x1b[2;2H"); assert_eq!(console.inner.row, 1); assert_eq!(console.inner.col, 1); @@ -1645,7 +1925,7 @@ mod tests { #[test] fn erase_in_line_start_to_cursor() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"xxx\nxxx\n\x1b[2;2H"); assert_eq!(console.inner.row, 1); assert_eq!(console.inner.col, 1); @@ -1668,7 +1948,7 @@ mod tests { #[test] fn erase_in_line_entire_line() { let mut buffer = [0u32; WIDTH * HEIGHT / 2]; - let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as isize, HEIGHT as isize); + let mut console = VgaConsole::new(buffer.as_mut_ptr(), WIDTH as u16, HEIGHT as u16); console.write_bstr(b"xxx\nxxx\n\x1b[2;2H"); assert_eq!(console.inner.row, 1); assert_eq!(console.inner.col, 1); @@ -1687,6 +1967,161 @@ mod tests { assert_eq!(console.inner.row, 1); assert_eq!(console.inner.col, 1); } + + #[test] + fn chunky1_test() { + let mut buffer = vec![0x00u8; (640 / 8) + 1]; + + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 0, 1) }; + assert_eq!( + &buffer[0..4], + [0b1000_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 1, 1) }; + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 8, 1) }; + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 15, 1) }; + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b1000_0001, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<1>(buffer.as_mut_ptr(), 15, 0) }; + assert_eq!( + &buffer[0..4], + [0b1100_0000, 0b1000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + } + + #[test] + fn chunky2_test() { + let mut buffer = vec![0x00u8; (640 / 4) + 1]; + + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 0, 1) }; + assert_eq!( + &buffer[0..4], + [0b0100_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 1, 2) }; + assert_eq!( + &buffer[0..4], + [0b0110_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 1, 3) }; + assert_eq!( + &buffer[0..4], + [0b0111_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 4, 1) }; + assert_eq!( + &buffer[0..4], + [0b0111_0000, 0b0100_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<2>(buffer.as_mut_ptr(), 7, 3) }; + assert_eq!( + &buffer[0..4], + [0b0111_0000, 0b0100_0011, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + } + + #[test] + fn chunky4_test() { + let mut buffer = vec![0x00u8; (640 / 2) + 1]; + + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 0, 1) }; + assert_eq!( + &buffer[0..4], + [0b0001_0000, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 1, 2) }; + assert_eq!( + &buffer[0..4], + [0b0001_0010, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 1, 3) }; + assert_eq!( + &buffer[0..4], + [0b0001_0011, 0b0000_0000, 0b0000_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 4, 1) }; + assert_eq!( + &buffer[0..4], + [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_0000], + "Got {:02x?}", + &buffer[0..4] + ); + + _ = unsafe { chunky_plot::<4>(buffer.as_mut_ptr(), 7, 15) }; + assert_eq!( + &buffer[0..4], + [0b0001_0011, 0b0000_0000, 0b0001_0000, 0b0000_1111], + "Got {:02x?}", + &buffer[0..4] + ); + } + + #[test] + fn chunky8_test() { + let mut buffer = vec![0x00u8; 641]; + + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 0, 1) }; + assert_eq!(&buffer[0..4], [1, 0, 0, 0]); + + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 1, 2) }; + assert_eq!(&buffer[0..4], [1, 2, 0, 0]); + + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 1, 255) }; + assert_eq!(&buffer[0..4], [1, 255, 0, 0]); + + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 3, 127) }; + assert_eq!(&buffer[0..4], [1, 255, 0, 127],); + + _ = unsafe { chunky_plot::<8>(buffer.as_mut_ptr(), 3, 255) }; + assert_eq!(&buffer[0..4], [1, 255, 0, 255],); + } } // =========================================================================== From 0cd68249e7d4b03064355d47cdfa3b6f689d220b Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Mon, 30 Dec 2024 15:26:26 +0000 Subject: [PATCH 9/9] Add random line drawing to vidtest --- Cargo.lock | 2 +- utilities/snake/src/lib.rs | 6 ++--- utilities/vidtest/src/lib.rs | 43 ++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 447d40d..c330a0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,7 +291,7 @@ dependencies = [ [[package]] name = "neotron-sdk" version = "0.2.0" -source = "git+https://github.com/neotron-compute/neotron-sdk.git?branch=add-gfx-ioctl-defines#dc84465052e22328eb9526ba1edd93670228c5ee" +source = "git+https://github.com/neotron-compute/neotron-sdk.git?branch=add-gfx-ioctl-defines#645866224f5d4d74a8fc3884e4976a28be8b3b98" dependencies = [ "crossterm", "neotron-api 0.2.0", diff --git a/utilities/snake/src/lib.rs b/utilities/snake/src/lib.rs index b909126..83ce123 100644 --- a/utilities/snake/src/lib.rs +++ b/utilities/snake/src/lib.rs @@ -42,7 +42,7 @@ impl App { self.clear_screen(); self.title_screen(); - let mut seed: u16 = 0x4f34; + let mut seed: u32 = 0x4f34; 'outer: loop { 'inner: loop { @@ -419,8 +419,8 @@ impl Game { loop { // This isn't equally distributed. I don't really care. let pos = console::Position { - row: (neotron_sdk::rand() % self.height as u16) as u8, - col: (neotron_sdk::rand() % self.width as u16) as u8, + row: neotron_sdk::random_in(0..self.height as u32) as u8, + col: neotron_sdk::random_in(0..self.width as u32) as u8, }; if self.board.is_empty(pos) { return pos; diff --git a/utilities/vidtest/src/lib.rs b/utilities/vidtest/src/lib.rs index 68c70a2..30144ed 100644 --- a/utilities/vidtest/src/lib.rs +++ b/utilities/vidtest/src/lib.rs @@ -70,6 +70,9 @@ pub fn main() -> i32 { if let Err(e) = radial(&handle, mode) { _ = writeln!(stdout, "Draw failure on radial: {:?}", e); } + if let Err(e) = random_lines(&handle, mode) { + _ = writeln!(stdout, "Draw failure on random_lines: {:?}", e); + } } 0 @@ -243,6 +246,46 @@ fn radial( Ok(()) } +/// plots some random lines, with all the colours +fn random_lines( + handle: &neotron_sdk::File, + mode: neotron_sdk::VideoMode, +) -> Result<(), neotron_sdk::Error> { + neotron_sdk::srand(1); + + unsafe { handle.ioctl(neotron_sdk::ioctls::gfx::COMMAND_CLEAR_SCREEN, 0) }?; + let width_range = 0..mode.horizontal_pixels() as u32; + let height_range = 0..mode.vertical_lines() as u32; + + while !kbhit() { + let x0 = neotron_sdk::random_in(width_range.clone()); + let x1 = neotron_sdk::random_in(width_range.clone()); + let y0 = neotron_sdk::random_in(height_range.clone()); + let y1 = neotron_sdk::random_in(height_range.clone()); + let colour = neotron_sdk::random_in(0..(1 << 24)); + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_MOVE_CURSOR, + neotron_sdk::ioctls::gfx::move_cursor_value(x0 as u16, y0 as u16), + ) + }?; + unsafe { + handle.ioctl( + neotron_sdk::ioctls::gfx::COMMAND_DRAW_LINE, + neotron_sdk::ioctls::gfx::draw_line_value(x1 as u16, y1 as u16, colour), + ) + }?; + } + + Ok(()) +} + +fn kbhit() -> bool { + let stdin = neotron_sdk::stdin(); + let mut buffer = [0u8; 1]; + stdin.read(&mut buffer) != Ok(0) +} + fn wait_for_key() { let stdin = neotron_sdk::stdin(); let mut buffer = [0u8; 1];