From cf8afee978e9ee2db04cd37779272c955cb2e4fa Mon Sep 17 00:00:00 2001 From: Kharif Date: Sat, 25 Jan 2025 10:51:55 +0100 Subject: [PATCH 01/18] synth / oscillator --- examples/synth/src/main.rs | 78 ++++-- .../osc.rs => oscillator/blep_table.rs} | 222 +---------------- examples/synth/src/oscillator/mod.rs | 192 ++++++++++++++ examples/synth/src/oscillator/osc.rs | 234 ++++++++++++++++++ examples/synth/src/synth/mod.rs | 210 ++++++++++------ examples/synth/src/synth/oscillator.rs | 127 ---------- 6 files changed, 622 insertions(+), 441 deletions(-) rename examples/synth/src/{synth/osc.rs => oscillator/blep_table.rs} (96%) create mode 100644 examples/synth/src/oscillator/mod.rs create mode 100644 examples/synth/src/oscillator/osc.rs delete mode 100644 examples/synth/src/synth/oscillator.rs diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index 13fa5f2..1f54750 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -1,55 +1,87 @@ -use rodio::source::Source; -use rodio::OutputStream; use std::sync::{Arc, Mutex}; +use std::time::Duration; + +use rodio::OutputStream; mod midi_keyboard; +mod oscillator; mod synth; use midi_keyboard::{MidiFrequency, MidiKeyboard, MidiNoteId}; -use synth::{Oscillator, Synth}; +use oscillator::Oscillator; +use synth::{AdvancedSynth, EnvelopeConfig}; -use rui::*; +use rui::Run; fn main() { - let (_stream, stream_handle) = OutputStream::try_default().unwrap(); - let synth = Arc::new(Mutex::new(Synth::new(stream_handle))); - let synth_clone = synth.clone(); - let synth_clone_update = synth.clone(); + // Create the audio output stream + let (_stream, stream_handle) = + OutputStream::try_default().expect("Failed to create output stream"); + + // Create a custom envelope configuration + let custom_envelope = EnvelopeConfig::builder() + .attack(Duration::from_millis(10)) + .decay(Duration::from_millis(50)) + .sustain(0.6) + .release(Duration::from_millis(100)) + .build() + .expect("Failed to create envelope configuration"); + + // Initialize the advanced synthesizer with custom default envelope + let synth = Arc::new(Mutex::new(AdvancedSynth::new( + stream_handle, + Some(custom_envelope), + ))); - std::thread::spawn(move || loop { - synth_clone_update.lock().unwrap().update(); + // Clone synthesizer references for different threads + let synth_update = synth.clone(); + let synth_note_begin = synth.clone(); + let synth_note_end = synth.clone(); + + // Spawn a dedicated thread for continuous synth updates + std::thread::spawn(move || { + loop { + synth_update.lock().unwrap().update(); + std::thread::sleep(Duration::from_millis(10)); // Prevent tight spinning + } }); - // Create and configure the MIDI keyboard + // Configure MIDI keyboard MidiKeyboard::new() .num_keys(25) .start_octave(4) .max_simultaneous_keys(5) .on_note_begin(move |event| { let note = event.note; + let mut synth = synth_note_begin.lock().unwrap(); - let mut synth = synth.lock().unwrap(); - - // Get the frequency of the note. + // Get the frequency of the pressed note let frequency: MidiFrequency = note.frequency(); - // Create an audio source for the note. - let audio_source = Oscillator::sawtooth_wave(frequency).amplify(1.0); + // Create an audio source with a sawtooth wave + let audio_source = Oscillator::square(frequency); - // Get the note id (u8) if you need it. 0 is the lowest note. 127 is the highest note. + // Get the note ID let source_id: MidiNoteId = note.id(); - // Send the audio source to the synth. - synth.play_source(Box::new(audio_source), source_id); + // Play the source with optional custom envelope + if let Err(e) = synth.play_source( + Box::new(audio_source), + source_id, + None, // Use default envelope + ) { + eprintln!("Failed to play source: {}", e); + } }) .on_note_end(move |event| { let note = event.note; - - let mut synth = synth_clone.lock().unwrap(); + let mut synth = synth_note_end.lock().unwrap(); let source_id: MidiNoteId = note.id(); - synth.release_source(source_id); + + if let Err(e) = synth.release_source(source_id) { + eprintln!("Failed to release source: {}", e); + } }) .show() - // .size([400.0, 200.0]) .run(); } diff --git a/examples/synth/src/synth/osc.rs b/examples/synth/src/oscillator/blep_table.rs similarity index 96% rename from examples/synth/src/synth/osc.rs rename to examples/synth/src/oscillator/blep_table.rs index 19a5468..27a2676 100644 --- a/examples/synth/src/synth/osc.rs +++ b/examples/synth/src/oscillator/blep_table.rs @@ -1,225 +1,5 @@ - -use std::f32::consts::PI; - -#[derive(Clone, Debug)] -pub struct AnalogOsc { - sample_rate: usize, - nyquist: f32, - conv: f32, - phase: f32, - prev_sync: f32, - future: [f32; FUTURE_SIZE], - future_index: usize, - prev_output: f32, -} - -const OVERSAMPLING: usize = 256; -const ZERO_CROSSINGS: usize = 16; -const TRANSITION_START: f32 = 8000.0; -const TRANSITION_END: f32 = 10000.0; -const FUTURE_SIZE: usize = ZERO_CROSSINGS * 2; -const BLEP_SIZE: usize = OVERSAMPLING * ZERO_CROSSINGS * 2 + 1; - -impl AnalogOsc { - pub fn new() -> AnalogOsc { - AnalogOsc { - sample_rate: 0, - nyquist: 0.0, - conv: 0.0, - phase: 0.0, - prev_sync: 0.0, - future: [0.0; FUTURE_SIZE], - future_index: 0, - prev_output: 0.0, - } - } - - pub fn set_sample_rate(&mut self, n: usize) { - // Avoid a potential data race. - if self.sample_rate != n { - self.sample_rate = n; - self.nyquist = n as f32 / 2.0; - self.conv = 1.0 / self.sample_rate as f32; - } - } - - pub fn tick_saw(&mut self, f: f32, sync: f32, shape: f32) -> f32 { - let f = f.min(self.nyquist); - let shape = shape.clamp(0.0, 1.0); - - let rate = f * self.conv; - - let mut output = 0.0; - - // Advance phase. - self.phase += rate; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - // Sync. - if sync > 0.0 && self.prev_sync <= 0.0 { - // Estimate how long ago zero-crossing happened - // via linear interpolation and intersection - // with x-axis. - let frames_since = sync / (sync - self.prev_sync); - - // Reset phase. - self.phase = frames_since * rate; - } - - self.prev_sync = sync; - - // Render bleps. - if f < TRANSITION_END { - // Compute phase of the second saw. - let mut aux_phase = self.phase + shape * 0.5; - if aux_phase >= 1.0 { - aux_phase -= 1.0; - } - - // Naive dual saw. - output = self.phase + aux_phase - 1.0; - - // If the function has decreased, add a blep. - if output < self.prev_output && rate > 0.0 { - let scale = self.prev_output - output + 2.0 * rate; - self.add_blep(f32::min(self.phase, aux_phase) / rate, scale); - } - - self.prev_output = output; - - // Correct with bleps. - output += self.future[self.future_index]; - self.future[self.future_index] = 0.0; - self.future_index = (self.future_index + 1) % FUTURE_SIZE; - - // Remove DC component based on frequency. - // 5.473 is emperically determined. - output -= (f / self.sample_rate as f32) * 5.473; - } - - // Render sine. - if f > TRANSITION_START { - let sine_gain = if f < TRANSITION_END { - (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) - } else { - 1.0 - }; - - output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); - } - - output - } - - #[allow(dead_code)] - pub fn process_saw(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { - let n = pitch.len(); - for i in 0..n { - out[i] = self.tick_saw(pitch[i], sync[i], shape[i]); - } - } - - pub fn tick_square(&mut self, f: f32, sync: f32, shape: f32) -> f32 { - let f = f.min(self.nyquist); - let shape = shape.min(1.0).max(0.0); - - let rate = f * self.conv; - - let mut output = 0.0; - - // Pulse width. - let pw = 0.5 * (1.0 - shape); - - // Advance phase. - self.phase += rate; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - // Sync. - if sync > 0.0 && self.prev_sync <= 0.0 { - // Estimate how long ago zero-crossing happened - // via linear interpolation and intersection - // with x-axis. - let frames_since = sync / (sync - self.prev_sync); - - // Reset phase. - self.phase = frames_since * rate; - } - - self.prev_sync = sync; - - // Render bleps. - if f < TRANSITION_END { - // Naive square. - output = if self.phase < pw { 1.0 } else { -1.0 }; - - if output != self.prev_output && rate > 0.0 { - if self.phase < pw { - self.add_blep(self.phase / rate, -2.0); - } else { - self.add_blep((self.phase - pw) / rate, 2.0); - } - } - - self.prev_output = output; - - // Correct with bleps. - output += self.future[self.future_index]; - self.future[self.future_index] = 0.0; - self.future_index = (self.future_index + 1) % FUTURE_SIZE; - } - - // Render sine. - if f > TRANSITION_START { - let sine_gain = if f < TRANSITION_END { - (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) - } else { - 1.0 - }; - - output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); - } - - output - } - - #[allow(dead_code)] - pub fn process_square(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { - let n = pitch.len(); - for i in 0..n { - out[i] = self.tick_square(pitch[i], sync[i], shape[i]); - } - } - - fn add_blep(&mut self, phase: f32, scale: f32) { - // Add a blep into the future buffer. - - let mut p = (phase * (OVERSAMPLING as f32)) as usize; // Convert to integer index outside the loop. - - let mut i = self.future_index; - - // Note: should be able to do one loop with modulo. Perhaps that was slower? - - while i < FUTURE_SIZE && p < BLEP_SIZE { - self.future[i] += BLEP_TABLE[p] * scale; - p += OVERSAMPLING; - i += 1; - } - - i = 0; - while i < self.future_index && p < BLEP_SIZE { - self.future[i] += BLEP_TABLE[p] * scale; - p += OVERSAMPLING; - i += 1; - } - } -} - #[allow(clippy::all)] -const BLEP_TABLE: [f32; BLEP_SIZE] = [ +pub const BLEP_TABLE: [f32; BLEP_SIZE] = [ 1.00000002216, 1.00000004418, 1.00000006604, diff --git a/examples/synth/src/oscillator/mod.rs b/examples/synth/src/oscillator/mod.rs new file mode 100644 index 0000000..6bccc0f --- /dev/null +++ b/examples/synth/src/oscillator/mod.rs @@ -0,0 +1,192 @@ +use rodio::source::Source; +use std::f32::consts::PI; + +/// Represents different wave types for audio synthesis +#[derive(Clone, Debug)] +pub enum WaveType { + Sine, + Square, + Sawtooth, + Triangle, +} + +/// Configuration parameters for oscillator generation +#[derive(Clone, Debug)] +pub struct OscillatorConfig { + sample_rate: u32, + anti_aliasing: bool, +} + +impl Default for OscillatorConfig { + fn default() -> Self { + Self { + sample_rate: 48000, + anti_aliasing: true, + } + } +} + +/// Advanced analog oscillator with high-quality wave generation +#[derive(Clone, Debug)] +pub struct AnalogOsc { + config: OscillatorConfig, + phase: f32, + nyquist: f32, + phase_increment: f32, + blep_table: Vec, +} + +impl AnalogOsc { + /// Create a new analog oscillator with default configuration + pub fn new() -> Self { + let config = OscillatorConfig::default(); + let nyquist = config.sample_rate as f32 / 2.0; + Self { + config, + phase: 0.0, + nyquist, + phase_increment: 0.0, + blep_table: Self::generate_blep_table(), + } + } + + /// Generate a high-quality BLEP (Band-Limited Step) table + fn generate_blep_table() -> Vec { + const BLEP_SIZE: usize = 1024; + const ZERO_CROSSINGS: usize = 16; + + (0..BLEP_SIZE) + .map(|i| { + let x = (i as f32 / BLEP_SIZE as f32 - 0.5) * ZERO_CROSSINGS as f32; + if x == 0.0 { + 1.0 + } else { + x.sin() / (PI * x) * (1.0 - (x / ZERO_CROSSINGS as f32).cos()) + } + }) + .collect() + } + + /// Generate a sawtooth wave sample with optional anti-aliasing + pub fn generate_sawtooth(&mut self, frequency: f32) -> f32 { + let frequency = frequency.min(self.nyquist); + self.phase_increment = frequency / self.config.sample_rate as f32; + + let mut output = 2.0 * self.phase - 1.0; + + if self.config.anti_aliasing { + self.apply_blep(&mut output); + } + + self.phase += self.phase_increment; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + output + } + + /// Generate a square wave sample with optional anti-aliasing + pub fn generate_square(&mut self, frequency: f32, pulse_width: f32) -> f32 { + let frequency = frequency.min(self.nyquist); + self.phase_increment = frequency / self.config.sample_rate as f32; + + let pw = pulse_width.clamp(0.0, 1.0); + let output = if self.phase < pw { 1.0 } else { -1.0 }; + + if self.config.anti_aliasing { + self.apply_blep(&mut output.clone()); + } + + self.phase += self.phase_increment; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + output + } + + /// Apply band-limited step correction + fn apply_blep(&mut self, output: &mut f32) { + // Basic BLEP application - this is a simplified implementation + // A more advanced version would interpolate and add correction + if self.phase < self.phase_increment { + let index = (self.phase / self.phase_increment * self.blep_table.len() as f32) as usize; + *output += self.blep_table.get(index).cloned().unwrap_or(0.0); + } + } +} + +/// Implements a flexible audio oscillator for different wave types +pub struct Oscillator { + freq: f32, + num_samples: usize, + wave_type: WaveType, + analog_osc: AnalogOsc, +} + +impl Oscillator { + /// Create oscillators for different wave types + pub fn sine(freq: f32) -> Self { + Self::new(freq, WaveType::Sine) + } + + pub fn square(freq: f32) -> Self { + Self::new(freq, WaveType::Square) + } + + pub fn sawtooth(freq: f32) -> Self { + Self::new(freq, WaveType::Sawtooth) + } + + pub fn triangle(freq: f32) -> Self { + Self::new(freq, WaveType::Triangle) + } + + /// Internal constructor for oscillators + fn new(freq: f32, wave_type: WaveType) -> Self { + Oscillator { + freq, + num_samples: 0, + wave_type, + analog_osc: AnalogOsc::new(), + } + } +} + +impl Iterator for Oscillator { + type Item = f32; + + fn next(&mut self) -> Option { + self.num_samples = self.num_samples.wrapping_add(1); + + Some(match self.wave_type { + WaveType::Sine => (2.0 * PI * self.freq * self.num_samples as f32 / 48000.0).sin(), + WaveType::Square => self.analog_osc.generate_square(self.freq, 0.5), + WaveType::Sawtooth => self.analog_osc.generate_sawtooth(self.freq), + WaveType::Triangle => { + // Derive triangle wave from sine wave + let sin_val = (2.0 * PI * self.freq * self.num_samples as f32 / 48000.0).sin(); + sin_val.asin() * 2.0 / PI + } + }) + } +} + +impl Source for Oscillator { + fn current_frame_len(&self) -> Option { + None + } + + fn channels(&self) -> u16 { + 1 + } + + fn sample_rate(&self) -> u32 { + 48000 + } + + fn total_duration(&self) -> Option { + None + } +} diff --git a/examples/synth/src/oscillator/osc.rs b/examples/synth/src/oscillator/osc.rs new file mode 100644 index 0000000..1f1442b --- /dev/null +++ b/examples/synth/src/oscillator/osc.rs @@ -0,0 +1,234 @@ +use std::f32::consts::PI; + +#[derive(Clone, Debug)] +pub struct AnalogOsc { + sample_rate: usize, + nyquist: f32, + conv: f32, + phase: f32, + prev_sync: f32, + future: [f32; FUTURE_SIZE], + future_index: usize, + prev_output: f32, + blep_table: [f32; BLEP_SIZE], +} + +const OVERSAMPLING: usize = 256; +const ZERO_CROSSINGS: usize = 16; +const TRANSITION_START: f32 = 8000.0; +const TRANSITION_END: f32 = 10000.0; +const FUTURE_SIZE: usize = ZERO_CROSSINGS * 2; +const BLEP_SIZE: usize = OVERSAMPLING * ZERO_CROSSINGS * 2 + 1; + +impl AnalogOsc { + pub fn new() -> AnalogOsc { + let blep_table = { + let mut table = [0.0; BLEP_SIZE]; + for i in 0..BLEP_SIZE { + let x = (i as f32 - (BLEP_SIZE as f32 - 1.0) / 2.0) / (OVERSAMPLING as f32); + table[i] = if x == 0.0 { + 1.0 + } else { + // Raised cosine windowed sinc function + x.sin() / (PI * x) * (1.0 - (x / (ZERO_CROSSINGS as f32)).cos()) + }; + } + table + }; + + AnalogOsc { + sample_rate: 0, + nyquist: 0.0, + conv: 0.0, + phase: 0.0, + prev_sync: 0.0, + future: [0.0; FUTURE_SIZE], + future_index: 0, + prev_output: 0.0, + blep_table, + } + } + + pub fn set_sample_rate(&mut self, n: usize) { + // Avoid a potential data race. + if self.sample_rate != n { + self.sample_rate = n; + self.nyquist = n as f32 / 2.0; + self.conv = 1.0 / self.sample_rate as f32; + } + } + + pub fn tick_saw(&mut self, f: f32, sync: f32, shape: f32) -> f32 { + let f = f.min(self.nyquist); + let shape = shape.clamp(0.0, 1.0); + + let rate = f * self.conv; + + let mut output = 0.0; + + // Advance phase. + self.phase += rate; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + // Sync. + if sync > 0.0 && self.prev_sync <= 0.0 { + // Estimate how long ago zero-crossing happened + // via linear interpolation and intersection + // with x-axis. + let frames_since = sync / (sync - self.prev_sync); + + // Reset phase. + self.phase = frames_since * rate; + } + + self.prev_sync = sync; + + // Render bleps. + if f < TRANSITION_END { + // Compute phase of the second saw. + let mut aux_phase = self.phase + shape * 0.5; + if aux_phase >= 1.0 { + aux_phase -= 1.0; + } + + // Naive dual saw. + output = self.phase + aux_phase - 1.0; + + // If the function has decreased, add a blep. + if output < self.prev_output && rate > 0.0 { + let scale = self.prev_output - output + 2.0 * rate; + self.add_blep(f32::min(self.phase, aux_phase) / rate, scale); + } + + self.prev_output = output; + + // Correct with bleps. + output += self.future[self.future_index]; + self.future[self.future_index] = 0.0; + self.future_index = (self.future_index + 1) % FUTURE_SIZE; + + // Remove DC component based on frequency. + // 5.473 is emperically determined. + output -= (f / self.sample_rate as f32) * 5.473; + } + + // Render sine. + if f > TRANSITION_START { + let sine_gain = if f < TRANSITION_END { + (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) + } else { + 1.0 + }; + + output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); + } + + output + } + + #[allow(dead_code)] + pub fn process_saw(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { + let n = pitch.len(); + for i in 0..n { + out[i] = self.tick_saw(pitch[i], sync[i], shape[i]); + } + } + + pub fn tick_square(&mut self, f: f32, sync: f32, shape: f32) -> f32 { + let f = f.min(self.nyquist); + let shape = shape.min(1.0).max(0.0); + + let rate = f * self.conv; + + let mut output = 0.0; + + // Pulse width. + let pw = 0.5 * (1.0 - shape); + + // Advance phase. + self.phase += rate; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + // Sync. + if sync > 0.0 && self.prev_sync <= 0.0 { + // Estimate how long ago zero-crossing happened + // via linear interpolation and intersection + // with x-axis. + let frames_since = sync / (sync - self.prev_sync); + + // Reset phase. + self.phase = frames_since * rate; + } + + self.prev_sync = sync; + + // Render bleps. + if f < TRANSITION_END { + // Naive square. + output = if self.phase < pw { 1.0 } else { -1.0 }; + + if output != self.prev_output && rate > 0.0 { + if self.phase < pw { + self.add_blep(self.phase / rate, -2.0); + } else { + self.add_blep((self.phase - pw) / rate, 2.0); + } + } + + self.prev_output = output; + + // Correct with bleps. + output += self.future[self.future_index]; + self.future[self.future_index] = 0.0; + self.future_index = (self.future_index + 1) % FUTURE_SIZE; + } + + // Render sine. + if f > TRANSITION_START { + let sine_gain = if f < TRANSITION_END { + (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) + } else { + 1.0 + }; + + output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); + } + + output + } + + #[allow(dead_code)] + pub fn process_square(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { + let n = pitch.len(); + for i in 0..n { + out[i] = self.tick_square(pitch[i], sync[i], shape[i]); + } + } + + fn add_blep(&mut self, phase: f32, scale: f32) { + // Add a blep into the future buffer. + + let mut p = (phase * (OVERSAMPLING as f32)) as usize; // Convert to integer index outside the loop. + + let mut i = self.future_index; + + // Note: should be able to do one loop with modulo. Perhaps that was slower? + + while i < FUTURE_SIZE && p < BLEP_SIZE { + self.future[i] += self.blep_table[p] * scale; + p += OVERSAMPLING; + i += 1; + } + + i = 0; + while i < self.future_index && p < BLEP_SIZE { + self.future[i] += self.blep_table[p] * scale; + p += OVERSAMPLING; + i += 1; + } + } +} diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs index 36ebc51..856aa7e 100644 --- a/examples/synth/src/synth/mod.rs +++ b/examples/synth/src/synth/mod.rs @@ -1,67 +1,121 @@ use std::collections::HashMap; -use std::time::Instant; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, Instant}; use rodio::source::Source; -use rodio::Sink; - -mod oscillator; -pub use oscillator::Oscillator; - -mod osc; -use osc::AnalogOsc; +use rodio::{OutputStreamHandle, Sink}; + +/// Represents the ADSR envelope parameters +#[derive(Clone, Debug)] +pub struct EnvelopeConfig { + attack: Duration, + decay: Duration, + sustain_level: f32, + release: Duration, +} -// The envelope state struct -struct EnvelopeState { - envelope: Envelope, - start_time: Instant, - is_releasing: bool, - release_start_time: Option, +impl EnvelopeConfig { + pub fn builder() -> EnvelopeConfigBuilder { + EnvelopeConfigBuilder::new() + } } -// The envelope struct -struct Envelope { - attack: f32, - decay: f32, - sustain: f32, - release: f32, +/// Builder for creating flexible envelope configurations +pub struct EnvelopeConfigBuilder { + attack: Option, + decay: Option, + sustain_level: Option, + release: Option, } -impl Envelope { - fn new(attack: f32, decay: f32, sustain: f32, release: f32) -> Envelope { - Envelope { - attack, - decay, - sustain, - release, +impl EnvelopeConfigBuilder { + fn new() -> Self { + Self { + attack: None, + decay: None, + sustain_level: None, + release: None, } } + + pub fn attack(mut self, duration: Duration) -> Self { + self.attack = Some(duration); + self + } + + pub fn decay(mut self, duration: Duration) -> Self { + self.decay = Some(duration); + self + } + + pub fn sustain(mut self, level: f32) -> Self { + self.sustain_level = Some(level.clamp(0.0, 1.0)); + self + } + + pub fn release(mut self, duration: Duration) -> Self { + self.release = Some(duration); + self + } + + pub fn build(self) -> Result { + Ok(EnvelopeConfig { + attack: self.attack.unwrap_or(Duration::from_millis(50)), + decay: self.decay.unwrap_or(Duration::from_millis(100)), + sustain_level: self.sustain_level.unwrap_or(0.7), + release: self.release.unwrap_or(Duration::from_millis(200)), + }) + } } -pub struct Synth { +/// Advanced synthesizer with improved envelope and audio management +pub struct AdvancedSynth { audio_sinks: HashMap, envelope_states: HashMap, - stream_handle: rodio::OutputStreamHandle, + stream_handle: OutputStreamHandle, + default_envelope: EnvelopeConfig, } -impl Synth { - pub fn new(stream_handle: rodio::OutputStreamHandle) -> Synth { - // let (_stream, stream_handle) = rodio::OutputStream::try_default().unwrap(); - // For some reason the above code would fail if it was in the new function +struct EnvelopeState { + config: EnvelopeConfig, + start_time: Instant, + is_releasing: bool, + release_start_time: Option, +} - Synth { +impl AdvancedSynth { + pub fn new( + stream_handle: OutputStreamHandle, + default_envelope: Option, + ) -> Self { + AdvancedSynth { audio_sinks: HashMap::new(), envelope_states: HashMap::new(), stream_handle, + default_envelope: default_envelope.unwrap_or_else(|| { + EnvelopeConfig::builder() + .attack(Duration::from_millis(50)) + .decay(Duration::from_millis(100)) + .sustain(0.7) + .release(Duration::from_millis(200)) + .build() + .expect("Default envelope configuration failed") + }), } } - pub fn play_source(&mut self, audio_source: Box + Send>, source_id: u8) { - let sink = Sink::try_new(&self.stream_handle).expect("Failed to create sink"); + pub fn play_source( + &mut self, + audio_source: Box + Send>, + source_id: u8, + envelope: Option, + ) -> Result<(), &'static str> { + let sink = Sink::try_new(&self.stream_handle).map_err(|_| "Failed to create audio sink")?; + sink.append(audio_source); - let envelope = Envelope::new(0.1, 0.2, 0.7, 1.3); // example envelope let envelope_state = EnvelopeState { - envelope, + config: envelope.unwrap_or_else(|| self.default_envelope.clone()), start_time: Instant::now(), is_releasing: false, release_start_time: None, @@ -69,55 +123,71 @@ impl Synth { self.audio_sinks.insert(source_id, sink); self.envelope_states.insert(source_id, envelope_state); + + Ok(()) } - pub fn release_source(&mut self, source_id: u8) { - if let Some(envelope_state) = self.envelope_states.get_mut(&source_id) { - envelope_state.is_releasing = true; - envelope_state.release_start_time = Some(Instant::now()); - } + pub fn release_source(&mut self, source_id: u8) -> Result<(), &'static str> { + self.envelope_states + .get_mut(&source_id) + .map(|state| { + state.is_releasing = true; + state.release_start_time = Some(Instant::now()); + }) + .ok_or("Source not found") } pub fn update(&mut self) { let now = Instant::now(); - - let mut to_remove = Vec::new(); + let mut sources_to_remove = Vec::new(); for (source_id, envelope_state) in self.envelope_states.iter_mut() { - let elapsed = now.duration_since(envelope_state.start_time).as_secs_f32(); - - let envelope = &envelope_state.envelope; - let sink = self.audio_sinks.get_mut(source_id).unwrap(); - - let volume = if elapsed < envelope.attack { - // Attack - elapsed / envelope.attack - } else if elapsed < envelope.attack + envelope.decay { - // Decay - 1.0 - (elapsed - envelope.attack) / envelope.decay * (1.0 - envelope.sustain) - } else if envelope_state.is_releasing { - // Release - let elapsed_since_released = now - .duration_since(envelope_state.release_start_time.unwrap()) - .as_secs_f32(); - envelope.sustain - elapsed_since_released / envelope.release * envelope.sustain - } else { - // Sustain - envelope.sustain + let sink = match self.audio_sinks.get_mut(source_id) { + Some(sink) => sink, + None => continue, }; + let volume = calculate_envelope_volume(now, envelope_state); sink.set_volume(volume); - if envelope_state.is_releasing && elapsed > envelope.release { - // This is done as a separate step to avoid a second mutable borrow of self.envelope_states - // First borrow is when .iter_mut() is called, second is when .remove() is called - to_remove.push(*source_id); + if is_source_completed(now, envelope_state) { + sources_to_remove.push(*source_id); } } - for source_id in to_remove { + for source_id in sources_to_remove { self.envelope_states.remove(&source_id); self.audio_sinks.remove(&source_id); } } } + +fn calculate_envelope_volume(now: Instant, envelope_state: &EnvelopeState) -> f32 { + let elapsed = now.duration_since(envelope_state.start_time); + let config = &envelope_state.config; + + match (elapsed, envelope_state.is_releasing) { + (t, false) if t < config.attack => (t.as_secs_f32() / config.attack.as_secs_f32()).min(1.0), + + (t, false) if t < config.attack + config.decay => { + let decay_elapsed = t - config.attack; + 1.0 - (decay_elapsed.as_secs_f32() / config.decay.as_secs_f32()) + * (1.0 - config.sustain_level) + } + + (_, true) => { + let release_time = now.duration_since(envelope_state.release_start_time.unwrap()); + (config.sustain_level + * (1.0 - release_time.as_secs_f32() / config.release.as_secs_f32())) + .max(0.0) + } + + _ => config.sustain_level, + } +} + +fn is_source_completed(now: Instant, envelope_state: &EnvelopeState) -> bool { + envelope_state.is_releasing + && now.duration_since(envelope_state.release_start_time.unwrap()) + >= envelope_state.config.release +} diff --git a/examples/synth/src/synth/oscillator.rs b/examples/synth/src/synth/oscillator.rs deleted file mode 100644 index 7a118ff..0000000 --- a/examples/synth/src/synth/oscillator.rs +++ /dev/null @@ -1,127 +0,0 @@ -// This file is for the Oscillator struct, which implements the rodio source trait. - -use rodio::source::Source; -use std::f32::consts::PI; - -use super::osc::AnalogOsc; - -const SAMPLE_RATE: u32 = 48000; // The sample rate of the audio in Hz. - -// The wave type of the oscillator -#[derive(Clone, Debug)] -enum WaveType { - Sine, - Square, - Sawtooth, - Triangle, -} - -#[derive(Clone, Debug)] -pub struct Oscillator { - freq: f32, - num_sample: usize, // The number of samples that have been played - wave_type: WaveType, - osc: AnalogOsc, -} - -// Allow dead code is used because main.rs doesn't use all of the wave types, just one of them -// Without this, the compiler would complain about unused code. -impl Oscillator { - #[allow(dead_code)] - pub fn sine_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new sine wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Sine, - osc - } - } - - #[allow(dead_code)] - pub fn square_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new square wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Square, - osc - } - } - - #[allow(dead_code)] - pub fn sawtooth_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new sawtooth wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Sawtooth, - osc - } - } - - #[allow(dead_code)] - pub fn triangle_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new triangle wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Triangle, - osc - } - } -} - -// Rodio requires that Iterator is implemented -// The next function is called every time a new sample is needed -impl Iterator for Oscillator { - type Item = f32; - - fn next(&mut self) -> Option { - self.num_sample = self.num_sample.wrapping_add(1); - - let t = self.num_sample as f32 / SAMPLE_RATE as f32; // Time - let value = 2.0 * PI * self.freq * t; - - match self.wave_type { - WaveType::Sine => Some(value.sin()), // Sine wave, no anti-aliasing needed - WaveType::Square => Some(self.osc.tick_square(self.freq, 0.0, 0.0)), - WaveType::Sawtooth => Some(self.osc.tick_saw(self.freq, 0.0, 0.0)), - WaveType::Triangle => Some(value.sin().asin()), // The arcsine of the sine wave makes it a triangle wave. The MinBLEP AA method doesn't support triangle waves. - } - } -} - -impl Source for Oscillator { - fn current_frame_len(&self) -> Option { - None - } - - fn channels(&self) -> u16 { - 1 // Mono, not stereo - } - - fn sample_rate(&self) -> u32 { - SAMPLE_RATE - } - - fn total_duration(&self) -> Option { - None // Will continue indefinitely until stopped - } -} From 339fd69dc9043cb1592949916776189f77275a2b Mon Sep 17 00:00:00 2001 From: Kharif Date: Sat, 25 Jan 2025 11:10:00 +0100 Subject: [PATCH 02/18] synth example --- examples/synth/src/oscillator/mod.rs | 167 +++++++++++++++++++++------ 1 file changed, 130 insertions(+), 37 deletions(-) diff --git a/examples/synth/src/oscillator/mod.rs b/examples/synth/src/oscillator/mod.rs index 6bccc0f..9e20770 100644 --- a/examples/synth/src/oscillator/mod.rs +++ b/examples/synth/src/oscillator/mod.rs @@ -1,4 +1,3 @@ -use rodio::source::Source; use std::f32::consts::PI; /// Represents different wave types for audio synthesis @@ -15,6 +14,10 @@ pub enum WaveType { pub struct OscillatorConfig { sample_rate: u32, anti_aliasing: bool, + oversampling: usize, + zero_crossings: usize, + transition_start: f32, + transition_end: f32, } impl Default for OscillatorConfig { @@ -22,10 +25,101 @@ impl Default for OscillatorConfig { Self { sample_rate: 48000, anti_aliasing: true, + oversampling: 256, + zero_crossings: 16, + transition_start: 8000.0, + transition_end: 10000.0, } } } +impl OscillatorConfig { + /// Create a new configuration with custom parameters + pub fn new() -> Self { + Self::default() + } + + /// Set sample rate + pub fn sample_rate(mut self, rate: u32) -> Self { + self.sample_rate = rate; + self + } + + /// Enable or disable anti-aliasing + pub fn anti_aliasing(mut self, enabled: bool) -> Self { + self.anti_aliasing = enabled; + self + } + + /// Set oversampling rate + pub fn oversampling(mut self, rate: usize) -> Self { + self.oversampling = rate; + self + } + + /// Set number of zero crossings + pub fn zero_crossings(mut self, crossings: usize) -> Self { + self.zero_crossings = crossings; + self + } + + /// Set transition start frequency + pub fn transition_start(mut self, start: f32) -> Self { + self.transition_start = start; + self + } + + /// Set transition end frequency + pub fn transition_end(mut self, end: f32) -> Self { + self.transition_end = end; + self + } +} + +/// BLEP (Band-Limited Step) Table Builder +pub struct BlepTableBuilder { + oversampling: usize, + zero_crossings: usize, +} + +impl BlepTableBuilder { + /// Create a new builder with custom configuration + pub fn new() -> Self { + Self { + oversampling: 256, + zero_crossings: 16, + } + } + + /// Set the oversampling rate + pub fn oversampling(mut self, rate: usize) -> Self { + self.oversampling = rate; + self + } + + /// Set the number of zero crossings + pub fn zero_crossings(mut self, crossings: usize) -> Self { + self.zero_crossings = crossings; + self + } + + /// Generate the BLEP table with the current configuration + pub fn generate(self) -> Vec { + let blep_size = self.oversampling * self.zero_crossings * 2 + 1; + (0..blep_size) + .map(|i| { + let x = (i as f32 / blep_size as f32 - 0.5) * self.zero_crossings as f32; + if x == 0.0 { + 1.0 + } else { + x.sin() / (std::f32::consts::PI * x) + * (1.0 - (x / self.zero_crossings as f32).cos()) + } + }) + .collect() + } +} + /// Advanced analog oscillator with high-quality wave generation #[derive(Clone, Debug)] pub struct AnalogOsc { @@ -37,36 +131,23 @@ pub struct AnalogOsc { } impl AnalogOsc { - /// Create a new analog oscillator with default configuration - pub fn new() -> Self { - let config = OscillatorConfig::default(); + /// Create a new analog oscillator with custom configuration + pub fn new(config: OscillatorConfig) -> Self { let nyquist = config.sample_rate as f32 / 2.0; + let blep_table = BlepTableBuilder::new() + .oversampling(config.oversampling) + .zero_crossings(config.zero_crossings) + .generate(); + Self { config, phase: 0.0, nyquist, phase_increment: 0.0, - blep_table: Self::generate_blep_table(), + blep_table, } } - /// Generate a high-quality BLEP (Band-Limited Step) table - fn generate_blep_table() -> Vec { - const BLEP_SIZE: usize = 1024; - const ZERO_CROSSINGS: usize = 16; - - (0..BLEP_SIZE) - .map(|i| { - let x = (i as f32 / BLEP_SIZE as f32 - 0.5) * ZERO_CROSSINGS as f32; - if x == 0.0 { - 1.0 - } else { - x.sin() / (PI * x) * (1.0 - (x / ZERO_CROSSINGS as f32).cos()) - } - }) - .collect() - } - /// Generate a sawtooth wave sample with optional anti-aliasing pub fn generate_sawtooth(&mut self, frequency: f32) -> f32 { let frequency = frequency.min(self.nyquist); @@ -92,10 +173,10 @@ impl AnalogOsc { self.phase_increment = frequency / self.config.sample_rate as f32; let pw = pulse_width.clamp(0.0, 1.0); - let output = if self.phase < pw { 1.0 } else { -1.0 }; + let mut output = if self.phase < pw { 1.0 } else { -1.0 }; if self.config.anti_aliasing { - self.apply_blep(&mut output.clone()); + self.apply_blep(&mut output); } self.phase += self.phase_increment; @@ -108,8 +189,6 @@ impl AnalogOsc { /// Apply band-limited step correction fn apply_blep(&mut self, output: &mut f32) { - // Basic BLEP application - this is a simplified implementation - // A more advanced version would interpolate and add correction if self.phase < self.phase_increment { let index = (self.phase / self.phase_increment * self.blep_table.len() as f32) as usize; *output += self.blep_table.get(index).cloned().unwrap_or(0.0); @@ -126,30 +205,40 @@ pub struct Oscillator { } impl Oscillator { - /// Create oscillators for different wave types + /// Create oscillators for different wave types with default configuration pub fn sine(freq: f32) -> Self { - Self::new(freq, WaveType::Sine) + Self::new(freq, WaveType::Sine, OscillatorConfig::default()) } pub fn square(freq: f32) -> Self { - Self::new(freq, WaveType::Square) + Self::new(freq, WaveType::Square, OscillatorConfig::default()) } pub fn sawtooth(freq: f32) -> Self { - Self::new(freq, WaveType::Sawtooth) + Self::new(freq, WaveType::Sawtooth, OscillatorConfig::default()) } pub fn triangle(freq: f32) -> Self { - Self::new(freq, WaveType::Triangle) + Self::new(freq, WaveType::Triangle, OscillatorConfig::default()) + } + + /// Create oscillators with custom configuration + pub fn new_with_config(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { + Oscillator { + freq, + num_samples: 0, + wave_type, + analog_osc: AnalogOsc::new(config), + } } /// Internal constructor for oscillators - fn new(freq: f32, wave_type: WaveType) -> Self { + fn new(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { Oscillator { freq, num_samples: 0, wave_type, - analog_osc: AnalogOsc::new(), + analog_osc: AnalogOsc::new(config), } } } @@ -161,19 +250,23 @@ impl Iterator for Oscillator { self.num_samples = self.num_samples.wrapping_add(1); Some(match self.wave_type { - WaveType::Sine => (2.0 * PI * self.freq * self.num_samples as f32 / 48000.0).sin(), + WaveType::Sine => (2.0 * PI * self.freq * self.num_samples as f32 + / self.analog_osc.config.sample_rate as f32) + .sin(), WaveType::Square => self.analog_osc.generate_square(self.freq, 0.5), WaveType::Sawtooth => self.analog_osc.generate_sawtooth(self.freq), WaveType::Triangle => { // Derive triangle wave from sine wave - let sin_val = (2.0 * PI * self.freq * self.num_samples as f32 / 48000.0).sin(); + let sin_val = (2.0 * PI * self.freq * self.num_samples as f32 + / self.analog_osc.config.sample_rate as f32) + .sin(); sin_val.asin() * 2.0 / PI } }) } } -impl Source for Oscillator { +impl rodio::Source for Oscillator { fn current_frame_len(&self) -> Option { None } @@ -183,7 +276,7 @@ impl Source for Oscillator { } fn sample_rate(&self) -> u32 { - 48000 + self.analog_osc.config.sample_rate } fn total_duration(&self) -> Option { From 49206b51b921ea1a1701ec46509791ffddcedc66 Mon Sep 17 00:00:00 2001 From: Kharif Date: Sat, 25 Jan 2025 12:12:41 +0100 Subject: [PATCH 03/18] synth modular envelopes --- examples/synth/src/envelope.rs | 183 ++++++++++++++++++++++++++++++ examples/synth/src/main.rs | 13 +-- examples/synth/src/synth.rs | 179 +++++++++++++++++++++++++++++ examples/synth/src/synth/mod.rs | 193 -------------------------------- 4 files changed, 368 insertions(+), 200 deletions(-) create mode 100644 examples/synth/src/envelope.rs create mode 100644 examples/synth/src/synth.rs delete mode 100644 examples/synth/src/synth/mod.rs diff --git a/examples/synth/src/envelope.rs b/examples/synth/src/envelope.rs new file mode 100644 index 0000000..afc7c15 --- /dev/null +++ b/examples/synth/src/envelope.rs @@ -0,0 +1,183 @@ +use std::time::{Duration, Instant}; + +/// Configuration for a standard ADSR (Attack, Decay, Sustain, Release) envelope +#[derive(Clone, Debug)] +pub struct ADSREnvelopeConfig { + attack: Duration, + decay: Duration, + sustain_level: f32, + release: Duration, +} + +impl ADSREnvelopeConfig { + pub fn builder() -> ADSREnvelopeConfigBuilder { + ADSREnvelopeConfigBuilder::new() + } +} + +/// Builder for creating flexible ADSR envelope configurations +pub struct ADSREnvelopeConfigBuilder { + attack: Option, + decay: Option, + sustain_level: Option, + release: Option, +} + +impl ADSREnvelopeConfigBuilder { + fn new() -> Self { + Self { + attack: None, + decay: None, + sustain_level: None, + release: None, + } + } + + pub fn attack(mut self, duration: Duration) -> Self { + self.attack = Some(duration); + self + } + + pub fn decay(mut self, duration: Duration) -> Self { + self.decay = Some(duration); + self + } + + pub fn sustain(mut self, level: f32) -> Self { + self.sustain_level = Some(level.clamp(0.0, 1.0)); + self + } + + pub fn release(mut self, duration: Duration) -> Self { + self.release = Some(duration); + self + } + + pub fn build(self) -> Result { + Ok(ADSREnvelopeConfig { + attack: self.attack.unwrap_or(Duration::from_millis(50)), + decay: self.decay.unwrap_or(Duration::from_millis(100)), + sustain_level: self.sustain_level.unwrap_or(0.7), + release: self.release.unwrap_or(Duration::from_millis(200)), + }) + } +} + +/// Concrete implementation of an ADSR envelope +pub struct ADSREnvelope { + config: ADSREnvelopeConfig, + start_time: Option, + release_start_time: Option, +} + +impl ADSREnvelope { + pub fn new(config: ADSREnvelopeConfig) -> Self { + Self { + config, + start_time: None, + release_start_time: None, + } + } + + pub fn start(&mut self) { + self.start_time = Some(Instant::now()); + self.release_start_time = None; + } + + pub fn release(&mut self) { + if let Some(start_time) = self.start_time { + if self.release_start_time.is_none() { + self.release_start_time = Some(Instant::now()); + } + } + } + + pub fn get_amplitude(&self, now: Instant) -> f32 { + // Require start_time to be set + let Some(start_time) = self.start_time else { + return 0.0; + }; + + let elapsed = now.duration_since(start_time); + + // Determine if in release phase + let is_releasing = self.release_start_time.is_some(); + + match (elapsed, is_releasing) { + // Attack phase: Linear ramp from 0 to 1 + (t, false) if t < self.config.attack => { + (t.as_secs_f32() / self.config.attack.as_secs_f32()).clamp(0.0, 1.0) + } + + // Decay phase: Linear ramp from 1 to sustain level + (t, false) if t < self.config.attack + self.config.decay => { + let decay_progress = + (t - self.config.attack).as_secs_f32() / self.config.decay.as_secs_f32(); + (1.0 - decay_progress * (1.0 - self.config.sustain_level)) + .clamp(self.config.sustain_level, 1.0) + } + + // Release phase: Linear ramp from sustain level to 0 + (_, true) => { + let Some(release_start) = self.release_start_time else { + return self.config.sustain_level; + }; + + let release_time = now.duration_since(release_start); + (self.config.sustain_level + * (1.0 - release_time.as_secs_f32() / self.config.release.as_secs_f32())) + .clamp(0.0, self.config.sustain_level) + } + + // Sustain phase + _ => self.config.sustain_level, + } + } + + pub fn is_finished(&self, now: Instant) -> bool { + // Envelope is finished if in release phase and release duration has passed + match (self.start_time, self.release_start_time) { + (Some(start), Some(release_start)) => { + now.duration_since(release_start) >= self.config.release + } + _ => false, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_adsr_envelope() { + let config = ADSREnvelopeConfig::builder() + .attack(Duration::from_millis(100)) + .decay(Duration::from_millis(50)) + .sustain(0.5) + .release(Duration::from_millis(100)) + .build() + .unwrap(); + + let mut envelope = ADSREnvelope::new(config); + + // Start the envelope + envelope.start(); + + // Immediately after start - amplitude should be 0 + let start = Instant::now(); + assert_eq!(envelope.get_amplitude(start), 0.0); + + // Simulate partial attack phase + let mid_attack = start + Duration::from_millis(50); + let amplitude = envelope.get_amplitude(mid_attack); + assert!( + amplitude > 0.0 && amplitude < 1.0, + "Amplitude during attack should be between 0 and 1" + ); + + // Simulate full attack phase completion + let end_attack = start + Duration::from_millis(100); + assert_eq!(envelope.get_amplitude(end_attack), 1.0); + } +} diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index 1f54750..78705fc 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -3,13 +3,15 @@ use std::time::Duration; use rodio::OutputStream; +mod envelope; mod midi_keyboard; mod oscillator; mod synth; +use envelope::ADSREnvelopeConfig; use midi_keyboard::{MidiFrequency, MidiKeyboard, MidiNoteId}; use oscillator::Oscillator; -use synth::{AdvancedSynth, EnvelopeConfig}; +use synth::Synth; use rui::Run; @@ -19,8 +21,8 @@ fn main() { OutputStream::try_default().expect("Failed to create output stream"); // Create a custom envelope configuration - let custom_envelope = EnvelopeConfig::builder() - .attack(Duration::from_millis(10)) + let custom_envelope = ADSREnvelopeConfig::builder() + .attack(Duration::from_millis(1000)) .decay(Duration::from_millis(50)) .sustain(0.6) .release(Duration::from_millis(100)) @@ -28,10 +30,7 @@ fn main() { .expect("Failed to create envelope configuration"); // Initialize the advanced synthesizer with custom default envelope - let synth = Arc::new(Mutex::new(AdvancedSynth::new( - stream_handle, - Some(custom_envelope), - ))); + let synth = Arc::new(Mutex::new(Synth::new(stream_handle, Some(custom_envelope)))); // Clone synthesizer references for different threads let synth_update = synth.clone(); diff --git a/examples/synth/src/synth.rs b/examples/synth/src/synth.rs new file mode 100644 index 0000000..5e1221d --- /dev/null +++ b/examples/synth/src/synth.rs @@ -0,0 +1,179 @@ +use std::collections::HashMap; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use rodio::source::Source; +use rodio::{OutputStreamHandle, Sink}; + +use crate::envelope::*; + +/// Advanced synthesizer with improved envelope and audio management +pub struct Synth { + audio_sources: HashMap, + stream_handle: OutputStreamHandle, + default_envelope_config: ADSREnvelopeConfig, +} + +impl Synth { + /// Create a new AdvancedSynth with optional default envelope configuration + pub fn new( + stream_handle: OutputStreamHandle, + default_envelope: Option, + ) -> Self { + Synth { + audio_sources: HashMap::new(), + stream_handle, + default_envelope_config: default_envelope.unwrap_or_else(|| { + ADSREnvelopeConfig::builder() + .attack(Duration::from_millis(50)) + .decay(Duration::from_millis(100)) + .sustain(0.7) + .release(Duration::from_millis(200)) + .build() + .expect("Default envelope configuration failed") + }), + } + } + + /// Play an audio source with optional custom envelope + pub fn play_source( + &mut self, + audio_source: Box + Send>, + source_id: u8, + envelope: Option, + ) -> Result<(), String> { + // Check if source ID is already in use + if self.audio_sources.contains_key(&source_id) { + return Err(format!("Source ID {} is already in use", source_id)); + } + + // Create a new sink + let sink = Sink::try_new(&self.stream_handle) + .map_err(|e| format!("Failed to create audio sink: {}", e))?; + + // Append the audio source to the sink + sink.append(audio_source); + + // Use provided envelope or default + let envelope_config = envelope.unwrap_or_else(|| self.default_envelope_config.clone()); + let mut envelope = ADSREnvelope::new(envelope_config); + + // Start the envelope + envelope.start(); + + // Store the sink and envelope + self.audio_sources.insert(source_id, (sink, envelope)); + + Ok(()) + } + + /// Release a specific audio source + pub fn release_source(&mut self, source_id: u8) -> Result<(), String> { + self.audio_sources + .get_mut(&source_id) + .map(|(_, envelope)| { + envelope.release(); + }) + .ok_or_else(|| "Source not found".to_string()) + } + + /// Update audio sources and their envelopes + pub fn update(&mut self) { + if self.audio_sources.is_empty() { + return; + } + + let now = Instant::now(); + let mut sources_to_remove = Vec::new(); + + // Update each source's volume based on its envelope + for (source_id, (sink, envelope)) in self.audio_sources.iter_mut() { + // Calculate current amplitude + let volume = envelope.get_amplitude(now); + sink.set_volume(volume); + + // Check if source is completed + if envelope.is_finished(now) { + sources_to_remove.push(*source_id); + } + } + + // Remove completed sources + for source_id in sources_to_remove { + self.audio_sources.remove(&source_id); + } + } +} + +// Example usage and basic tests +#[cfg(test)] +mod tests { + use super::*; + use rodio::{OutputStream, Source}; + use std::collections::vec_deque::VecDeque; + + // A simple test source that generates a constant tone + struct TestSource { + samples: VecDeque, + } + + impl TestSource { + fn new(duration: usize) -> Self { + Self { + samples: std::iter::repeat(1.0).take(duration).collect(), + } + } + } + + impl Iterator for TestSource { + type Item = f32; + fn next(&mut self) -> Option { + self.samples.pop_front() + } + } + + impl Source for TestSource { + fn current_frame_len(&self) -> Option { + Some(self.samples.len()) + } + + fn channels(&self) -> u16 { + 1 + } + fn sample_rate(&self) -> u32 { + 44100 + } + fn total_duration(&self) -> Option { + None + } + } + + #[test] + fn test_basic_synth_playback() { + // Create an output stream + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); + + // Create a synth + let mut synth = Synth::new( + stream_handle, + None, // Use default envelope + ); + + // Create a test audio source + let test_source = TestSource::new(1000); + + // Play the source + synth + .play_source( + Box::new(test_source), + 1, // source ID + None, + ) + .expect("Failed to play source"); + + // Update a few times to simulate envelope progression + for _ in 0..10 { + synth.update(); + } + } +} diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs deleted file mode 100644 index 856aa7e..0000000 --- a/examples/synth/src/synth/mod.rs +++ /dev/null @@ -1,193 +0,0 @@ -use std::collections::HashMap; -use std::sync::{Arc, Mutex}; -use std::time::{Duration, Instant}; - -use rodio::source::Source; -use rodio::{OutputStreamHandle, Sink}; - -/// Represents the ADSR envelope parameters -#[derive(Clone, Debug)] -pub struct EnvelopeConfig { - attack: Duration, - decay: Duration, - sustain_level: f32, - release: Duration, -} - -impl EnvelopeConfig { - pub fn builder() -> EnvelopeConfigBuilder { - EnvelopeConfigBuilder::new() - } -} - -/// Builder for creating flexible envelope configurations -pub struct EnvelopeConfigBuilder { - attack: Option, - decay: Option, - sustain_level: Option, - release: Option, -} - -impl EnvelopeConfigBuilder { - fn new() -> Self { - Self { - attack: None, - decay: None, - sustain_level: None, - release: None, - } - } - - pub fn attack(mut self, duration: Duration) -> Self { - self.attack = Some(duration); - self - } - - pub fn decay(mut self, duration: Duration) -> Self { - self.decay = Some(duration); - self - } - - pub fn sustain(mut self, level: f32) -> Self { - self.sustain_level = Some(level.clamp(0.0, 1.0)); - self - } - - pub fn release(mut self, duration: Duration) -> Self { - self.release = Some(duration); - self - } - - pub fn build(self) -> Result { - Ok(EnvelopeConfig { - attack: self.attack.unwrap_or(Duration::from_millis(50)), - decay: self.decay.unwrap_or(Duration::from_millis(100)), - sustain_level: self.sustain_level.unwrap_or(0.7), - release: self.release.unwrap_or(Duration::from_millis(200)), - }) - } -} - -/// Advanced synthesizer with improved envelope and audio management -pub struct AdvancedSynth { - audio_sinks: HashMap, - envelope_states: HashMap, - stream_handle: OutputStreamHandle, - default_envelope: EnvelopeConfig, -} - -struct EnvelopeState { - config: EnvelopeConfig, - start_time: Instant, - is_releasing: bool, - release_start_time: Option, -} - -impl AdvancedSynth { - pub fn new( - stream_handle: OutputStreamHandle, - default_envelope: Option, - ) -> Self { - AdvancedSynth { - audio_sinks: HashMap::new(), - envelope_states: HashMap::new(), - stream_handle, - default_envelope: default_envelope.unwrap_or_else(|| { - EnvelopeConfig::builder() - .attack(Duration::from_millis(50)) - .decay(Duration::from_millis(100)) - .sustain(0.7) - .release(Duration::from_millis(200)) - .build() - .expect("Default envelope configuration failed") - }), - } - } - - pub fn play_source( - &mut self, - audio_source: Box + Send>, - source_id: u8, - envelope: Option, - ) -> Result<(), &'static str> { - let sink = Sink::try_new(&self.stream_handle).map_err(|_| "Failed to create audio sink")?; - - sink.append(audio_source); - - let envelope_state = EnvelopeState { - config: envelope.unwrap_or_else(|| self.default_envelope.clone()), - start_time: Instant::now(), - is_releasing: false, - release_start_time: None, - }; - - self.audio_sinks.insert(source_id, sink); - self.envelope_states.insert(source_id, envelope_state); - - Ok(()) - } - - pub fn release_source(&mut self, source_id: u8) -> Result<(), &'static str> { - self.envelope_states - .get_mut(&source_id) - .map(|state| { - state.is_releasing = true; - state.release_start_time = Some(Instant::now()); - }) - .ok_or("Source not found") - } - - pub fn update(&mut self) { - let now = Instant::now(); - let mut sources_to_remove = Vec::new(); - - for (source_id, envelope_state) in self.envelope_states.iter_mut() { - let sink = match self.audio_sinks.get_mut(source_id) { - Some(sink) => sink, - None => continue, - }; - - let volume = calculate_envelope_volume(now, envelope_state); - sink.set_volume(volume); - - if is_source_completed(now, envelope_state) { - sources_to_remove.push(*source_id); - } - } - - for source_id in sources_to_remove { - self.envelope_states.remove(&source_id); - self.audio_sinks.remove(&source_id); - } - } -} - -fn calculate_envelope_volume(now: Instant, envelope_state: &EnvelopeState) -> f32 { - let elapsed = now.duration_since(envelope_state.start_time); - let config = &envelope_state.config; - - match (elapsed, envelope_state.is_releasing) { - (t, false) if t < config.attack => (t.as_secs_f32() / config.attack.as_secs_f32()).min(1.0), - - (t, false) if t < config.attack + config.decay => { - let decay_elapsed = t - config.attack; - 1.0 - (decay_elapsed.as_secs_f32() / config.decay.as_secs_f32()) - * (1.0 - config.sustain_level) - } - - (_, true) => { - let release_time = now.duration_since(envelope_state.release_start_time.unwrap()); - (config.sustain_level - * (1.0 - release_time.as_secs_f32() / config.release.as_secs_f32())) - .max(0.0) - } - - _ => config.sustain_level, - } -} - -fn is_source_completed(now: Instant, envelope_state: &EnvelopeState) -> bool { - envelope_state.is_releasing - && now.duration_since(envelope_state.release_start_time.unwrap()) - >= envelope_state.config.release -} From aa50219eef100097cef3a1b475ab994a00202f9a Mon Sep 17 00:00:00 2001 From: Kharif Date: Sat, 25 Jan 2025 19:47:00 +0100 Subject: [PATCH 04/18] synth --- .../src/{oscillator/mod.rs => oscillator.rs} | 0 examples/synth/src/oscillator/blep_table.rs | 8196 ----------------- examples/synth/src/oscillator/osc.rs | 234 - 3 files changed, 8430 deletions(-) rename examples/synth/src/{oscillator/mod.rs => oscillator.rs} (100%) delete mode 100644 examples/synth/src/oscillator/blep_table.rs delete mode 100644 examples/synth/src/oscillator/osc.rs diff --git a/examples/synth/src/oscillator/mod.rs b/examples/synth/src/oscillator.rs similarity index 100% rename from examples/synth/src/oscillator/mod.rs rename to examples/synth/src/oscillator.rs diff --git a/examples/synth/src/oscillator/blep_table.rs b/examples/synth/src/oscillator/blep_table.rs deleted file mode 100644 index 27a2676..0000000 --- a/examples/synth/src/oscillator/blep_table.rs +++ /dev/null @@ -1,8196 +0,0 @@ -#[allow(clippy::all)] -pub const BLEP_TABLE: [f32; BLEP_SIZE] = [ - 1.00000002216, - 1.00000004418, - 1.00000006604, - 1.00000008775, - 1.00000010929, - 1.00000013066, - 1.00000015186, - 1.00000017287, - 1.00000019369, - 1.00000021431, - 1.00000023473, - 1.00000025493, - 1.0000002749, - 1.00000029464, - 1.00000031413, - 1.00000033337, - 1.00000035234, - 1.00000037103, - 1.00000038942, - 1.0000004075, - 1.00000042527, - 1.00000044269, - 1.00000045976, - 1.00000047645, - 1.00000049275, - 1.00000050864, - 1.0000005241, - 1.0000005391, - 1.00000055363, - 1.00000056765, - 1.00000058114, - 1.00000059407, - 1.00000060642, - 1.00000061815, - 1.00000062923, - 1.00000063963, - 1.00000064931, - 1.00000065823, - 1.00000066636, - 1.00000067365, - 1.00000068006, - 1.00000068555, - 1.00000069006, - 1.00000069355, - 1.00000069596, - 1.00000069724, - 1.00000069733, - 1.00000069617, - 1.0000006937, - 1.00000068985, - 1.00000068455, - 1.00000067773, - 1.00000066932, - 1.00000065924, - 1.0000006474, - 1.00000063373, - 1.00000061813, - 1.00000060051, - 1.00000058077, - 1.00000055881, - 1.00000053454, - 1.00000050783, - 1.00000047859, - 1.00000044669, - 1.000000412, - 1.00000037441, - 1.00000033378, - 1.00000028998, - 1.00000024286, - 1.00000019228, - 1.00000013809, - 1.00000008012, - 1.00000001822, - 0.999999952219, - 0.999999881935, - 0.99999980719, - 0.999999727795, - 0.999999643558, - 0.999999554276, - 0.999999459742, - 0.999999359741, - 0.99999925405, - 0.999999142439, - 0.999999024672, - 0.999998900504, - 0.99999876968, - 0.99999863194, - 0.999998487014, - 0.999998334623, - 0.999998174481, - 0.999998006291, - 0.999997829748, - 0.999997644537, - 0.999997450334, - 0.999997246803, - 0.999997033601, - 0.999996810373, - 0.999996576753, - 0.999996332364, - 0.99999607682, - 0.999995809722, - 0.999995530659, - 0.99999523921, - 0.99999493494, - 0.999994617403, - 0.999994286139, - 0.999993940678, - 0.999993580533, - 0.999993205206, - 0.999992814185, - 0.999992406945, - 0.999991982944, - 0.999991541627, - 0.999991082426, - 0.999990604755, - 0.999990108013, - 0.999989591584, - 0.999989054837, - 0.999988497123, - 0.999987917776, - 0.999987316114, - 0.999986691438, - 0.99998604303, - 0.999985370155, - 0.999984672059, - 0.99998394797, - 0.999983197097, - 0.999982418629, - 0.999981611735, - 0.999980775564, - 0.999979909246, - 0.999979011889, - 0.999978082578, - 0.999977120381, - 0.999976124339, - 0.999975093473, - 0.999974026783, - 0.999972923242, - 0.999971781802, - 0.999970601392, - 0.999969380912, - 0.999968119243, - 0.999966815237, - 0.999965467722, - 0.9999640755, - 0.999962637345, - 0.999961152005, - 0.999959618201, - 0.999958034627, - 0.999956399947, - 0.999954712798, - 0.999952971786, - 0.999951175488, - 0.999949322452, - 0.999947411195, - 0.999945440202, - 0.999943407929, - 0.999941312796, - 0.999939153194, - 0.99993692748, - 0.999934633977, - 0.999932270975, - 0.999929836728, - 0.999927329457, - 0.999924747347, - 0.999922088545, - 0.999919351165, - 0.99991653328, - 0.999913632929, - 0.99991064811, - 0.999907576784, - 0.999904416873, - 0.999901166258, - 0.999897822781, - 0.999894384241, - 0.999890848399, - 0.99988721297, - 0.99988347563, - 0.999879634009, - 0.999875685696, - 0.999871628232, - 0.999867459117, - 0.999863175804, - 0.999858775698, - 0.99985425616, - 0.999849614503, - 0.999844847991, - 0.999839953841, - 0.999834929219, - 0.999829771243, - 0.999824476979, - 0.999819043444, - 0.999813467602, - 0.999807746363, - 0.999801876589, - 0.999795855082, - 0.999789678596, - 0.999783343825, - 0.999776847411, - 0.999770185937, - 0.999763355931, - 0.999756353864, - 0.999749176146, - 0.99974181913, - 0.999734279111, - 0.999726552319, - 0.999718634928, - 0.999710523048, - 0.999702212727, - 0.999693699949, - 0.999684980636, - 0.999676050645, - 0.999666905766, - 0.999657541726, - 0.999647954183, - 0.99963813873, - 0.99962809089, - 0.999617806119, - 0.999607279801, - 0.999596507252, - 0.999585483717, - 0.999574204368, - 0.999562664306, - 0.999550858557, - 0.999538782075, - 0.999526429739, - 0.999513796353, - 0.999500876642, - 0.999487665257, - 0.999474156772, - 0.99946034568, - 0.999446226396, - 0.999431793256, - 0.999417040514, - 0.999401962343, - 0.999386552833, - 0.999370805993, - 0.999354715746, - 0.999338275933, - 0.999321480307, - 0.999304322537, - 0.999286796203, - 0.9992688948, - 0.999250611733, - 0.999231940317, - 0.999212873779, - 0.999193405254, - 0.999173527786, - 0.999153234327, - 0.999132517734, - 0.999111370771, - 0.99908978611, - 0.999067756323, - 0.999045273889, - 0.999022331189, - 0.998998920505, - 0.998975034023, - 0.998950663827, - 0.998925801902, - 0.998900440131, - 0.998874570297, - 0.998848184079, - 0.998821273053, - 0.998793828692, - 0.998765842361, - 0.998737305322, - 0.998708208729, - 0.998678543631, - 0.998648300967, - 0.998617471566, - 0.99858604615, - 0.998554015329, - 0.998521369602, - 0.998488099357, - 0.998454194867, - 0.998419646294, - 0.998384443684, - 0.998348576969, - 0.998312035965, - 0.99827481037, - 0.998236889767, - 0.998198263618, - 0.998158921269, - 0.998118851945, - 0.998078044751, - 0.998036488669, - 0.997994172562, - 0.99795108517, - 0.997907215106, - 0.997862550864, - 0.99781708081, - 0.997770793184, - 0.997723676103, - 0.997675717554, - 0.997626905397, - 0.997577227365, - 0.997526671059, - 0.997475223952, - 0.997422873387, - 0.997369606575, - 0.997315410595, - 0.997260272394, - 0.997204178784, - 0.997147116445, - 0.997089071921, - 0.997030031623, - 0.996969981822, - 0.996908908657, - 0.996846798127, - 0.996783636093, - 0.996719408278, - 0.996654100268, - 0.996587697505, - 0.996520185293, - 0.996451548797, - 0.996381773036, - 0.996310842891, - 0.996238743098, - 0.996165458249, - 0.996090972795, - 0.996015271039, - 0.995938337142, - 0.995860155118, - 0.995780708835, - 0.995699982014, - 0.995617958229, - 0.995534620909, - 0.99544995333, - 0.995363938622, - 0.995276559767, - 0.995187799596, - 0.995097640789, - 0.995006065878, - 0.99491305724, - 0.994818597106, - 0.99472266755, - 0.994625250496, - 0.994526327717, - 0.99442588083, - 0.994323891299, - 0.994220340436, - 0.994115209397, - 0.994008479185, - 0.993900130646, - 0.993790144473, - 0.993678501201, - 0.993565181212, - 0.99345016473, - 0.993333431822, - 0.9932149624, - 0.993094736218, - 0.992972732873, - 0.992848931805, - 0.992723312295, - 0.992595853467, - 0.992466534288, - 0.992335333564, - 0.992202229946, - 0.992067201923, - 0.991930227827, - 0.991791285832, - 0.991650353951, - 0.991507410039, - 0.991362431791, - 0.991215396744, - 0.991066282276, - 0.990915065603, - 0.990761723785, - 0.990606233719, - 0.990448572147, - 0.990288715647, - 0.990126640641, - 0.98996232339, - 0.989795739997, - 0.989626866405, - 0.989455678397, - 0.989282151599, - 0.989106261478, - 0.98892798334, - 0.988747292335, - 0.988564163454, - 0.988378571529, - 0.988190491234, - 0.987999897088, - 0.987806763449, - 0.98761106452, - 0.987412774346, - 0.987211866815, - 0.98700831566, - 0.986802094459, - 0.98659317663, - 0.986381535441, - 0.986167144002, - 0.985949975268, - 0.985730002043, - 0.985507196975, - 0.98528153256, - 0.98505298114, - 0.984821514906, - 0.984587105897, - 0.984349726002, - 0.984109346957, - 0.983865940351, - 0.983619477622, - 0.983369930059, - 0.983117268804, - 0.98286146485, - 0.982602489046, - 0.982340312092, - 0.982074904544, - 0.981806236813, - 0.981534279168, - 0.981259001732, - 0.980980374487, - 0.980698367275, - 0.980412949796, - 0.980124091609, - 0.979831762138, - 0.979535930665, - 0.979236566337, - 0.978933638165, - 0.978627115025, - 0.978316965659, - 0.978003158674, - 0.977685662548, - 0.977364445626, - 0.977039476123, - 0.976710722127, - 0.976378151597, - 0.976041732366, - 0.975701432141, - 0.975357218506, - 0.975009058921, - 0.974656920725, - 0.974300771136, - 0.973940577254, - 0.973576306059, - 0.973207924418, - 0.972835399079, - 0.972458696678, - 0.97207778374, - 0.971692626677, - 0.971303191792, - 0.970909445281, - 0.970511353231, - 0.970108881628, - 0.96970199635, - 0.969290663176, - 0.968874847784, - 0.968454515753, - 0.968029632565, - 0.967600163606, - 0.96716607417, - 0.966727329458, - 0.966283894578, - 0.965835734554, - 0.96538281432, - 0.964925098727, - 0.96446255254, - 0.963995140446, - 0.96352282705, - 0.96304557688, - 0.962563354389, - 0.962076123956, - 0.961583849888, - 0.961086496422, - 0.960584027728, - 0.960076407908, - 0.959563601004, - 0.959045570993, - 0.958522281794, - 0.957993697268, - 0.957459781221, - 0.956920497408, - 0.956375809529, - 0.955825681238, - 0.955270076142, - 0.954708957804, - 0.954142289745, - 0.953570035446, - 0.952992158353, - 0.952408621873, - 0.951819389385, - 0.951224424234, - 0.950623689741, - 0.950017149199, - 0.949404765879, - 0.948786503033, - 0.948162323894, - 0.94753219168, - 0.946896069597, - 0.946253920841, - 0.945605708599, - 0.944951396056, - 0.944290946393, - 0.943624322792, - 0.942951488437, - 0.942272406521, - 0.941587040244, - 0.940895352816, - 0.940197307464, - 0.93949286743, - 0.938781995977, - 0.938064656391, - 0.937340811983, - 0.936610426093, - 0.935873462091, - 0.935129883384, - 0.934379653414, - 0.933622735665, - 0.932859093662, - 0.932088690979, - 0.931311491238, - 0.930527458113, - 0.929736555334, - 0.92893874669, - 0.928133996031, - 0.927322267273, - 0.926503524397, - 0.92567773146, - 0.924844852588, - 0.924004851988, - 0.923157693946, - 0.922303342834, - 0.92144176311, - 0.920572919322, - 0.919696776113, - 0.918813298222, - 0.917922450489, - 0.917024197858, - 0.916118505381, - 0.915205338219, - 0.914284661648, - 0.91335644106, - 0.912420641971, - 0.911477230017, - 0.910526170965, - 0.909567430712, - 0.90860097529, - 0.907626770869, - 0.906644783761, - 0.905654980422, - 0.904657327459, - 0.90365179163, - 0.902638339849, - 0.90161693919, - 0.900587556889, - 0.899550160351, - 0.898504717148, - 0.897451195031, - 0.896389561923, - 0.895319785933, - 0.894241835352, - 0.893155678661, - 0.892061284533, - 0.890958621838, - 0.889847659645, - 0.888728367227, - 0.887600714063, - 0.886464669845, - 0.885320204479, - 0.884167288088, - 0.883005891021, - 0.881835983848, - 0.880657537374, - 0.879470522635, - 0.878274910905, - 0.877070673699, - 0.875857782777, - 0.874636210149, - 0.873405928077, - 0.872166909079, - 0.870919125936, - 0.86966255169, - 0.868397159653, - 0.867122923409, - 0.865839816817, - 0.864547814016, - 0.86324688943, - 0.861937017768, - 0.860618174033, - 0.85929033352, - 0.857953471826, - 0.856607564849, - 0.855252588795, - 0.85388852018, - 0.852515335834, - 0.851133012908, - 0.849741528872, - 0.848340861525, - 0.846930988993, - 0.845511889738, - 0.84408354256, - 0.842645926601, - 0.841199021345, - 0.83974280663, - 0.838277262644, - 0.836802369934, - 0.835318109406, - 0.833824462333, - 0.832321410356, - 0.830808935486, - 0.829287020113, - 0.827755647007, - 0.826214799321, - 0.824664460595, - 0.823104614762, - 0.821535246149, - 0.819956339483, - 0.818367879894, - 0.816769852917, - 0.815162244499, - 0.813545041, - 0.811918229198, - 0.810281796295, - 0.808635729913, - 0.806980018108, - 0.805314649365, - 0.803639612609, - 0.801954897201, - 0.800260492947, - 0.798556390103, - 0.79684257937, - 0.79511905191, - 0.793385799338, - 0.791642813733, - 0.789890087638, - 0.788127614066, - 0.786355386501, - 0.784573398903, - 0.782781645711, - 0.780980121847, - 0.779168822719, - 0.777347744224, - 0.775516882753, - 0.773676235192, - 0.771825798928, - 0.769965571849, - 0.768095552351, - 0.766215739339, - 0.764326132232, - 0.762426730963, - 0.760517535986, - 0.758598548276, - 0.756669769337, - 0.754731201198, - 0.752782846422, - 0.750824708107, - 0.748856789889, - 0.746879095945, - 0.744891630998, - 0.742894400316, - 0.740887409719, - 0.738870665578, - 0.736844174823, - 0.73480794494, - 0.73276198398, - 0.730706300556, - 0.728640903849, - 0.726565803613, - 0.72448101017, - 0.722386534422, - 0.720282387847, - 0.718168582505, - 0.716045131039, - 0.713912046678, - 0.711769343239, - 0.709617035133, - 0.707455137361, - 0.705283665523, - 0.703102635815, - 0.700912065034, - 0.698711970583, - 0.696502370466, - 0.694283283298, - 0.692054728303, - 0.689816725315, - 0.687569294785, - 0.685312457778, - 0.683046235978, - 0.68077065169, - 0.67848572784, - 0.676191487978, - 0.673887956282, - 0.671575157554, - 0.66925311723, - 0.666921861374, - 0.664581416685, - 0.662231810496, - 0.659873070777, - 0.657505226136, - 0.655128305819, - 0.652742339715, - 0.650347358353, - 0.647943392909, - 0.645530475202, - 0.643108637698, - 0.640677913511, - 0.638238336404, - 0.635789940789, - 0.633332761732, - 0.630866834947, - 0.628392196806, - 0.625908884333, - 0.623416935206, - 0.620916387762, - 0.618407280993, - 0.615889654549, - 0.61336354874, - 0.610829004531, - 0.608286063552, - 0.605734768089, - 0.603175161091, - 0.600607286168, - 0.598031187591, - 0.595446910293, - 0.592854499871, - 0.590254002582, - 0.587645465347, - 0.585028935751, - 0.582404462039, - 0.579772093122, - 0.577131878573, - 0.574483868627, - 0.571828114183, - 0.569164666801, - 0.566493578705, - 0.563814902781, - 0.561128692574, - 0.558435002294, - 0.555733886808, - 0.553025401647, - 0.550309602998, - 0.547586547709, - 0.544856293287, - 0.542118897894, - 0.53937442035, - 0.536622920131, - 0.533864457368, - 0.531099092845, - 0.528326887998, - 0.525547904917, - 0.522762206341, - 0.519969855658, - 0.517170916904, - 0.514365454762, - 0.511553534559, - 0.508735222267, - 0.5059105845, - 0.50307968851, - 0.500242602192, - 0.497399394074, - 0.494550133321, - 0.491694889732, - 0.488833733736, - 0.485966736393, - 0.48309396939, - 0.480215505037, - 0.477331416271, - 0.474441776648, - 0.471546660342, - 0.468646142144, - 0.46574029746, - 0.462829202306, - 0.459912933307, - 0.456991567695, - 0.454065183305, - 0.451133858572, - 0.448197672531, - 0.44525670481, - 0.442311035633, - 0.439360745808, - 0.436405916734, - 0.433446630391, - 0.430482969338, - 0.427515016713, - 0.424542856226, - 0.421566572158, - 0.418586249355, - 0.415601973229, - 0.412613829748, - 0.40962190544, - 0.406626287382, - 0.403627063201, - 0.400624321069, - 0.397618149698, - 0.394608638339, - 0.391595876773, - 0.388579955312, - 0.385560964793, - 0.382538996573, - 0.379514142526, - 0.376486495036, - 0.373456146998, - 0.370423191809, - 0.367387723363, - 0.364349836052, - 0.361309624754, - 0.358267184835, - 0.35522261214, - 0.352176002989, - 0.349127454173, - 0.34607706295, - 0.343024927038, - 0.339971144609, - 0.336915814289, - 0.333859035147, - 0.330800906693, - 0.327741528873, - 0.324681002061, - 0.321619427057, - 0.318556905078, - 0.315493537756, - 0.31242942713, - 0.309364675642, - 0.30629938613, - 0.303233661823, - 0.300167606334, - 0.297101323657, - 0.294034918157, - 0.290968494569, - 0.287902157987, - 0.284836013861, - 0.28177016799, - 0.278704726517, - 0.275639795921, - 0.27257548301, - 0.269511894918, - 0.266449139096, - 0.263387323306, - 0.260326555615, - 0.257266944389, - 0.254208598284, - 0.251151626242, - 0.248096137483, - 0.245042241498, - 0.241990048045, - 0.238939667136, - 0.235891209038, - 0.232844784258, - 0.229800503544, - 0.226758477872, - 0.22371881844, - 0.220681636663, - 0.217647044165, - 0.214615152771, - 0.211586074499, - 0.208559921554, - 0.205536806323, - 0.202516841361, - 0.199500139391, - 0.196486813292, - 0.193476976091, - 0.190470740958, - 0.187468221199, - 0.184469530245, - 0.181474781646, - 0.178484089063, - 0.175497566263, - 0.172515327105, - 0.169537485539, - 0.166564155593, - 0.163595451368, - 0.16063148703, - 0.157672376799, - 0.154718234944, - 0.151769175775, - 0.148825313634, - 0.145886762884, - 0.142953637908, - 0.140026053093, - 0.137104122827, - 0.134187961488, - 0.131277683439, - 0.128373403015, - 0.125475234519, - 0.122583292209, - 0.119697690296, - 0.11681854293, - 0.113945964194, - 0.111080068095, - 0.108220968554, - 0.105368779403, - 0.10252361437, - 0.0996855870723, - 0.0968548110105, - 0.0940313995573, - 0.0912154659497, - 0.0884071232805, - 0.0856064844893, - 0.0828136623543, - 0.0800287694832, - 0.0772519183046, - 0.0744832210596, - 0.0717227897927, - 0.0689707363433, - 0.0662271723366, - 0.0634922091754, - 0.060765958031, - 0.0580485298342, - 0.055340035267, - 0.0526405847535, - 0.0499502884511, - 0.0472692562417, - 0.0445975977231, - 0.0419354221998, - 0.0392828386745, - 0.036639955839, - 0.0340068820656, - 0.0313837253981, - 0.0287705935431, - 0.0261675938609, - 0.023574833357, - 0.0209924186731, - 0.0184204560782, - 0.0158590514599, - 0.0133083103153, - 0.0107683377427, - 0.00823923843221, - 0.00572111665733, - 0.00321407626593, - 0.000718220671564, - -0.00176634715537, - -0.00423952469639, - -0.00670120989368, - -0.0091513011589, - -0.0115896973819, - -0.0140162979393, - -0.0164310027036, - -0.0188337120514, - -0.0212243268725, - -0.0236027485782, - -0.0259688791103, - -0.0283226209494, - -0.0306638771239, - -0.0329925512182, - -0.0353085473814, - -0.0376117703361, - -0.0399021253866, - -0.0421795184273, - -0.0444438559519, - -0.0466950450608, - -0.0489329934705, - -0.0511576095213, - -0.0533688021861, - -0.0555664810785, - -0.0577505564612, - -0.0599209392544, - -0.0620775410438, - -0.0642202740888, - -0.0663490513312, - -0.0684637864026, - -0.070564393633, - -0.0726507880589, - -0.074722885431, - -0.0767806022225, - -0.078823855637, - -0.0808525636162, - -0.0828666448481, - -0.0848660187748, - -0.0868506055999, - -0.0888203262969, - -0.0907751026164, - -0.0927148570939, - -0.0946395130576, - -0.0965489946356, - -0.0984432267639, - -0.100322135194, - -0.102185646498, - -0.104033688081, - -0.105866188184, - -0.107683075891, - -0.109484281139, - -0.111269734726, - -0.113039368313, - -0.114793114435, - -0.116530906507, - -0.118252678833, - -0.119958366608, - -0.121647905929, - -0.123321233802, - -0.124978288146, - -0.1266190078, - -0.128243332531, - -0.129851203043, - -0.131442560975, - -0.133017348918, - -0.134575510414, - -0.136116989964, - -0.137641733035, - -0.139149686067, - -0.140640796478, - -0.142115012667, - -0.143572284027, - -0.145012560943, - -0.146435794805, - -0.147841938006, - -0.149230943956, - -0.150602767081, - -0.151957362831, - -0.153294687687, - -0.154614699162, - -0.155917355811, - -0.157202617235, - -0.158470444082, - -0.159720798058, - -0.160953641928, - -0.162168939523, - -0.163366655743, - -0.164546756563, - -0.165709209037, - -0.166853981304, - -0.16798104259, - -0.169090363214, - -0.170181914592, - -0.171255669242, - -0.172311600784, - -0.173349683953, - -0.174369894592, - -0.175372209664, - -0.176356607253, - -0.177323066566, - -0.178271567939, - -0.179202092841, - -0.180114623874, - -0.18100914478, - -0.181885640442, - -0.182744096889, - -0.183584501297, - -0.184406841993, - -0.185211108457, - -0.185997291327, - -0.1867653824, - -0.187515374633, - -0.188247262151, - -0.188961040241, - -0.189656705363, - -0.190334255145, - -0.190993688391, - -0.191635005079, - -0.192258206363, - -0.192863294578, - -0.193450273238, - -0.194019147042, - -0.194569921869, - -0.195102604785, - -0.195617204044, - -0.196113729085, - -0.196592190537, - -0.197052600219, - -0.197494971141, - -0.197919317503, - -0.198325654699, - -0.198713999314, - -0.199084369127, - -0.199436783111, - -0.199771261432, - -0.200087825451, - -0.200386497722, - -0.200667301994, - -0.20093026321, - -0.201175407506, - -0.201402762212, - -0.201612355849, - -0.201804218133, - -0.20197837997, - -0.202134873456, - -0.20227373188, - -0.202394989716, - -0.202498682629, - -0.202584847469, - -0.202653522272, - -0.202704746256, - -0.202738559825, - -0.20275500456, - -0.202754123223, - -0.202735959753, - -0.202700559264, - -0.202647968041, - -0.202578233544, - -0.202491404398, - -0.202387530396, - -0.202266662493, - -0.202128852807, - -0.201974154615, - -0.201802622346, - -0.201614311584, - -0.201409279064, - -0.201187582664, - -0.200949281407, - -0.200694435457, - -0.200423106112, - -0.200135355803, - -0.199831248092, - -0.199510847664, - -0.199174220327, - -0.198821433005, - -0.198452553737, - -0.198067651668, - -0.197666797051, - -0.197250061238, - -0.196817516675, - -0.196369236901, - -0.195905296542, - -0.195425771303, - -0.194930737966, - -0.194420274387, - -0.193894459484, - -0.193353373241, - -0.192797096692, - -0.192225711927, - -0.191639302074, - -0.191037951306, - -0.190421744826, - -0.189790768863, - -0.189145110669, - -0.188484858512, - -0.187810101666, - -0.187120930409, - -0.186417436016, - -0.18569971075, - -0.184967847858, - -0.184221941564, - -0.18346208706, - -0.182688380501, - -0.181900918999, - -0.181099800613, - -0.180285124345, - -0.179456990129, - -0.178615498827, - -0.177760752222, - -0.176892853005, - -0.176011904773, - -0.175118012021, - -0.174211280129, - -0.173291815361, - -0.17235972485, - -0.171415116596, - -0.170458099455, - -0.169488783129, - -0.168507278161, - -0.167513695926, - -0.166508148618, - -0.165490749249, - -0.164461611632, - -0.163420850381, - -0.162368580892, - -0.161304919344, - -0.160229982682, - -0.159143888613, - -0.158046755594, - -0.156938702825, - -0.155819850235, - -0.15469031848, - -0.153550228926, - -0.152399703643, - -0.151238865396, - -0.150067837633, - -0.148886744476, - -0.147695710713, - -0.146494861783, - -0.145284323773, - -0.144064223401, - -0.142834688009, - -0.141595845555, - -0.140347824597, - -0.139090754288, - -0.137824764361, - -0.136549985122, - -0.135266547438, - -0.133974582726, - -0.132674222942, - -0.131365600572, - -0.130048848619, - -0.128724100592, - -0.127391490496, - -0.126051152824, - -0.124703222537, - -0.123347835064, - -0.121985126282, - -0.120615232509, - -0.119238290491, - -0.117854437392, - -0.116463810781, - -0.115066548623, - -0.113662789263, - -0.11225267142, - -0.11083633417, - -0.109413916938, - -0.107985559486, - -0.106551401899, - -0.105111584574, - -0.103666248211, - -0.102215533796, - -0.100759582593, - -0.0992985361311, - -0.0978325361922, - -0.0963617247984, - -0.0948862442006, - -0.0934062368663, - -0.0919218454675, - -0.0904332128681, - -0.0889404821123, - -0.0874437964117, - -0.0859432991336, - -0.0844391337884, - -0.0829314440173, - -0.0814203735799, - -0.079906066342, - -0.0783886662631, - -0.0768683173841, - -0.0753451638146, - -0.0738193497206, - -0.0722910193121, - -0.0707603168307, - -0.0692273865368, - -0.0676923726971, - -0.0661554195724, - -0.064616671405, - -0.0630762724057, - -0.0615343667419, - -0.0599910985244, - -0.0584466117954, - -0.0569010505156, - -0.0553545585516, - -0.0538072796635, - -0.0522593574924, - -0.0507109355473, - -0.0491621571931, - -0.0476131656379, - -0.0460641039202, - -0.0445151148965, - -0.0429663412287, - -0.0414179253717, - -0.0398700095606, - -0.0383227357983, - -0.0367762458431, - -0.0352306811961, - -0.0336861830884, - -0.0321428924692, - -0.0306009499931, - -0.0290604960075, - -0.0275216705402, - -0.0259846132873, - -0.0244494636006, - -0.0229163604753, - -0.0213854425374, - -0.019856848032, - -0.0183307148105, - -0.0168071803186, - -0.0152863815839, - -0.0137684552039, - -0.0122535373339, - -0.0107417636744, - -0.00923326945988, - -0.00772818944583, - -0.00622665789736, - -0.00472880857696, - -0.00323477473267, - -0.00174468908612, - -0.00025868382076, - 0.00122310943003, - 0.00270055959462, - 0.00417353617491, - 0.00564190925794, - 0.00710554952752, - 0.00856432827585, - 0.0100181174149, - 0.0114667894881, - 0.0129102176816, - 0.0143482758353, - 0.0157808384551, - 0.0172077807229, - 0.0186289785088, - 0.0200443083817, - 0.0214536476206, - 0.0228568742252, - 0.0242538669275, - 0.025644505202, - 0.0270286692769, - 0.0284062401448, - 0.0297770995732, - 0.0311411301153, - 0.0324982151205, - 0.0338482387445, - 0.0351910859604, - 0.0365266425682, - 0.0378547952058, - 0.0391754313585, - 0.0404884393696, - 0.0417937084501, - 0.0430911286886, - 0.0443805910615, - 0.0456619874422, - 0.0469352106116, - 0.0482001542666, - 0.0494567130308, - 0.0507047824629, - 0.0519442590666, - 0.0531750403, - 0.0543970245841, - 0.0556101113126, - 0.0568142008604, - 0.0580091945925, - 0.0591949948733, - 0.0603715050746, - 0.0615386295848, - 0.0626962738171, - 0.0638443442177, - 0.0649827482749, - 0.0661113945263, - 0.0672301925679, - 0.0683390530612, - 0.0694378877418, - 0.070526609427, - 0.0716051320234, - 0.0726733705345, - 0.0737312410685, - 0.0747786608453, - 0.0758155482039, - 0.0768418226099, - 0.0778574046621, - 0.0788622160996, - 0.079856179809, - 0.0808392198306, - 0.0818112613653, - 0.0827722307813, - 0.08372205562, - 0.0846606646028, - 0.0855879876369, - 0.0865039558216, - 0.0874085014541, - 0.0883015580354, - 0.0891830602759, - 0.0900529441011, - 0.0909111466569, - 0.0917576063152, - 0.092592262679, - 0.0934150565873, - 0.0942259301205, - 0.0950248266048, - 0.0958116906174, - 0.0965864679906, - 0.0973491058168, - 0.0980995524526, - 0.0988377575229, - 0.0995636719254, - 0.100277247834, - 0.100978438704, - 0.101667199273, - 0.102343485568, - 0.103007254908, - 0.103658465903, - 0.104297078465, - 0.104923053804, - 0.105536354435, - 0.10613694418, - 0.106724788169, - 0.107299852846, - 0.107862105968, - 0.108411516608, - 0.108948055159, - 0.109471693335, - 0.109982404173, - 0.110480162033, - 0.110964942602, - 0.111436722895, - 0.111895481257, - 0.11234119736, - 0.112773852212, - 0.11319342815, - 0.113599908845, - 0.113993279302, - 0.114373525862, - 0.114740636198, - 0.115094599319, - 0.115435405572, - 0.115763046636, - 0.116077515528, - 0.116378806597, - 0.116666915529, - 0.116941839344, - 0.117203576393, - 0.117452126363, - 0.117687490271, - 0.117909670464, - 0.118118670619, - 0.118314495743, - 0.118497152166, - 0.118666647547, - 0.118822990864, - 0.118966192421, - 0.119096263837, - 0.119213218053, - 0.119317069319, - 0.119407833204, - 0.119485526582, - 0.119550167637, - 0.119601775856, - 0.119640372028, - 0.119665978242, - 0.11967861788, - 0.119678315617, - 0.119665097416, - 0.119638990525, - 0.119600023472, - 0.119548226065, - 0.119483629382, - 0.11940626577, - 0.119316168844, - 0.119213373476, - 0.119097915795, - 0.11896983318, - 0.118829164259, - 0.118675948898, - 0.118510228202, - 0.118332044506, - 0.118141441369, - 0.117938463575, - 0.117723157118, - 0.117495569204, - 0.117255748241, - 0.117003743836, - 0.116739606785, - 0.116463389072, - 0.116175143857, - 0.115874925474, - 0.115562789422, - 0.115238792362, - 0.114902992103, - 0.114555447604, - 0.114196218958, - 0.113825367393, - 0.11344295526, - 0.113049046026, - 0.112643704269, - 0.112226995665, - 0.111798986988, - 0.111359746097, - 0.110909341926, - 0.110447844485, - 0.109975324839, - 0.109491855113, - 0.108997508473, - 0.108492359123, - 0.107976482296, - 0.107449954243, - 0.106912852227, - 0.106365254511, - 0.105807240353, - 0.105238889993, - 0.104660284644, - 0.104071506488, - 0.103472638658, - 0.102863765237, - 0.102244971241, - 0.101616342616, - 0.100977966222, - 0.100329929827, - 0.0996723220971, - 0.0990052325839, - 0.0983287517163, - 0.0976429707893, - 0.0969479819541, - 0.0962438782075, - 0.0955307533814, - 0.0948087021319, - 0.0940778199289, - 0.0933382030454, - 0.0925899485462, - 0.0918331542771, - 0.0910679188543, - 0.0902943416524, - 0.0895125227942, - 0.0887225631386, - 0.0879245642696, - 0.0871186284852, - 0.0863048587851, - 0.0854833588599, - 0.0846542330791, - 0.0838175864795, - 0.0829735247533, - 0.0821221542363, - 0.0812635818963, - 0.0803979153205, - 0.0795252627042, - 0.0786457328381, - 0.0777594350965, - 0.0768664794249, - 0.0759669763279, - 0.0750610368568, - 0.0741487725971, - 0.0732302956563, - 0.0723057186513, - 0.0713751546956, - 0.0704387173874, - 0.0694965207962, - 0.0685486794506, - 0.0675953083256, - 0.0666365228293, - 0.0656724387908, - 0.0647031724469, - 0.0637288404293, - 0.0627495597519, - 0.0617654477975, - 0.0607766223049, - 0.059783201356, - 0.0587853033626, - 0.0577830470536, - 0.0567765514614, - 0.055765935909, - 0.0547513199969, - 0.0537328235898, - 0.0527105668035, - 0.0516846699913, - 0.0506552537312, - 0.0496224388123, - 0.0485863462217, - 0.0475470971308, - 0.0465048128827, - 0.0454596149779, - 0.0444116250618, - 0.0433609649107, - 0.042307756419, - 0.0412521215852, - 0.040194182499, - 0.0391340613277, - 0.0380718803028, - 0.0370077617066, - 0.035941827859, - 0.0348742011038, - 0.0338050037954, - 0.0327343582857, - 0.0316623869103, - 0.0305892119753, - 0.0295149557442, - 0.0284397404239, - 0.0273636881522, - 0.0262869209837, - 0.025209560877, - 0.0241317296813, - 0.0230535491229, - 0.0219751407923, - 0.0208966261305, - 0.0198181264164, - 0.0187397627531, - 0.017661656055, - 0.0165839270344, - 0.0155066961888, - 0.0144300837877, - 0.0133542098592, - 0.0122791941775, - 0.0112051562495, - 0.0101322153023, - 0.00906049026979, - 0.00799009978024, - 0.00692116214325, - 0.00585379533701, - 0.00478811699559, - 0.00372424439623, - 0.00266229444668, - 0.00160238367266, - 0.000544628205254, - -0.000510856231544, - -0.0015639543333, - -0.00261455122753, - -0.00366253248601, - -0.00470778413709, - -0.0057501926779, - -0.00678964508651, - -0.00782602883404, - -0.00885923189671, - -0.0098891427678, - -0.0109156504696, - -0.0119386445651, - -0.0129580151701, - -0.0139736529647, - -0.0149854492048, - -0.015993295734, - -0.0169970849949, - -0.0179967100406, - -0.0189920645459, - -0.0199830428189, - -0.0209695398118, - -0.0219514511323, - -0.0229286730546, - -0.0239011025303, - -0.0248686371992, - -0.0258311754002, - -0.0267886161821, - -0.027740859314, - -0.028687805296, - -0.0296293553696, - -0.0305654115278, - -0.0314958765261, - -0.0324206538917, - -0.0333396479342, - -0.0342527637557, - -0.03515990726, - -0.0360609851632, - -0.0369559050028, - -0.0378445751476, - -0.038726904807, - -0.0396028040407, - -0.0404721837676, - -0.0413349557755, - -0.0421910327294, - -0.0430403281814, - -0.043882756579, - -0.0447182332738, - -0.0455466745307, - -0.0463679975358, - -0.0471821204054, - -0.0479889621939, - -0.0487884429024, - -0.0495804834863, - -0.0503650058641, - -0.0511419329242, - -0.0519111885335, - -0.052672697545, - -0.0534263858048, - -0.0541721801598, - -0.0549100084653, - -0.0556397995916, - -0.0563614834315, - -0.057074990907, - -0.0577802539761, - -0.0584772056397, - -0.0591657799479, - -0.0598459120065, - -0.0605175379836, - -0.0611805951153, - -0.061835021712, - -0.0624807571645, - -0.0631177419496, - -0.0637459176357, - -0.0643652268886, - -0.0649756134767, - -0.0655770222763, - -0.066169399277, - -0.0667526915865, - -0.0673268474353, - -0.067891816182, - -0.0684475483175, - -0.0689939954697, - -0.0695311104076, - -0.0700588470459, - -0.0705771604488, - -0.0710860068341, - -0.0715853435769, - -0.0720751292134, - -0.0725553234444, - -0.0730258871388, - -0.0734867823367, - -0.0739379722525, - -0.0743794212783, - -0.0748110949862, - -0.0752329601314, - -0.0756449846549, - -0.0760471376853, - -0.0764393895419, - -0.0768217117364, - -0.0771940769748, - -0.0775564591597, - -0.0779088333919, - -0.0782511759717, - -0.078583464401, - -0.0789056773839, - -0.0792177948282, - -0.0795197978468, - -0.0798116687579, - -0.0800933910863, - -0.0803649495639, - -0.0806263301299, - -0.0808775199316, - -0.0811185073242, - -0.0813492818711, - -0.0815698343437, - -0.0817801567211, - -0.0819802421899, - -0.0821700851437, - -0.0823496811824, - -0.0825190271112, - -0.08267812094, - -0.0828269618821, - -0.0829655503534, - -0.0830938879702, - -0.0832119775488, - -0.0833198231028, - -0.0834174298424, - -0.0835048041716, - -0.0835819536865, - -0.0836488871733, - -0.0837056146058, - -0.0837521471429, - -0.0837884971259, - -0.0838146780763, - -0.0838307046923, - -0.083836592846, - -0.0838323595806, - -0.0838180231067, - -0.083793602799, - -0.0837591191928, - -0.0837145939805, - -0.0836600500073, - -0.0835955112679, - -0.0835210029019, - -0.0834365511898, - -0.0833421835488, - -0.0832379285279, - -0.0831238158038, - -0.082999876176, - -0.0828661415617, - -0.0827226449912, - -0.0825694206023, - -0.0824065036358, - -0.0822339304293, - -0.0820517384124, - -0.0818599661004, - -0.0816586530894, - -0.0814478400496, - -0.0812275687199, - -0.0809978819016, - -0.0807588234519, - -0.0805104382781, - -0.0802527723307, - -0.0799858725969, - -0.079709787094, - -0.0794245648625, - -0.0791302559592, - -0.0788269114501, - -0.0785145834033, - -0.0781933248815, - -0.0778631899349, - -0.0775242335937, - -0.07717651186, - -0.0768200817009, - -0.0764550010397, - -0.0760813287489, - -0.0756991246413, - -0.0753084494625, - -0.0749093648824, - -0.0745019334866, - -0.0740862187683, - -0.0736622851197, - -0.073230197823, - -0.072790023042, - -0.0723418278131, - -0.0718856800361, - -0.0714216484658, - -0.070949802702, - -0.0704702131808, - -0.0699829511653, - -0.0694880887359, - -0.0689856987807, - -0.0684758549862, - -0.0679586318277, - -0.067434104559, - -0.0669023492028, - -0.0663634425411, - -0.0658174621044, - -0.0652644861623, - -0.064704593713, - -0.0641378644729, - -0.0635643788664, - -0.0629842180157, - -0.0623974637298, - -0.0618041984942, - -0.0612045054602, - -0.0605984684343, - -0.0599861718672, - -0.059367700843, - -0.0587431410684, - -0.0581125788615, - -0.057476101141, - -0.0568337954148, - -0.0561857497689, - -0.0555320528563, - -0.0548727938854, - -0.0542080626091, - -0.0535379493129, - -0.0528625448036, - -0.052181940398, - -0.051496227911, - -0.050805499644, - -0.0501098483735, - -0.0494093673392, - -0.0487041502319, - -0.0479942911824, - -0.0472798847491, - -0.0465610259061, - -0.0458378100317, - -0.0451103328958, - -0.0443786906484, - -0.0436429798073, - -0.042903297246, - -0.0421597401819, - -0.0414124061635, - -0.0406613930589, - -0.0399067990431, - -0.0391487225861, - -0.0383872624406, - -0.0376225176292, - -0.036854587433, - -0.0360835713784, - -0.0353095692253, - -0.0345326809545, - -0.0337530067555, - -0.0329706470137, - -0.0321857022985, - -0.0313982733506, - -0.0306084610696, - -0.0298163665015, - -0.0290220908264, - -0.0282257353459, - -0.0274274014709, - -0.0266271907087, - -0.0258252046508, - -0.0250215449606, - -0.0242163133607, - -0.0234096116205, - -0.0226015415437, - -0.0217922049559, - -0.0209817036924, - -0.0201701395853, - -0.0193576144515, - -0.01854423008, - -0.0177300882199, - -0.0169152905674, - -0.0160999387543, - -0.0152841343347, - -0.0144679787735, - -0.0136515734338, - -0.0128350195643, - -0.0120184182877, - -0.011201870588, - -0.0103854772984, - -0.00956933908922, - -0.00875355645588, - -0.0079382297065, - -0.00712345895003, - -0.00630934408421, - -0.00549598478353, - -0.00468348048728, - -0.00387193038766, - -0.0030614334179, - -0.00225208824039, - -0.00144399323494, - -0.000637246486994, - 0.000168054224043, - 0.00097181143646, - 0.00177392801784, - 0.00257430717663, - 0.00337285247358, - 0.00416946783327, - 0.00496405755541, - 0.00575652632626, - 0.00654677922982, - 0.0073347217591, - 0.00812025982727, - 0.00890329977872, - 0.00968374840012, - 0.0104615129314, - 0.0112365010765, - 0.0120086210146, - 0.0127777814102, - 0.0135438914247, - 0.0143068607262, - 0.0150665995004, - 0.0158230184613, - 0.0165760288612, - 0.0173255425012, - 0.0180714717416, - 0.0188137295118, - 0.0195522293204, - 0.0202868852655, - 0.0210176120445, - 0.0217443249637, - 0.0224669399484, - 0.0231853735522, - 0.0238995429672, - 0.0246093660327, - 0.0253147612453, - 0.0260156477679, - 0.0267119454389, - 0.0274035747815, - 0.0280904570124, - 0.0287725140515, - 0.0294496685297, - 0.0301218437986, - 0.0307889639387, - 0.0314509537678, - 0.0321077388501, - 0.0327592455038, - 0.0334054008098, - 0.03404613262, - 0.0346813695649, - 0.0353110410617, - 0.0359350773225, - 0.0365534093616, - 0.0371659690031, - 0.037772688889, - 0.038373502486, - 0.038968344093, - 0.0395571488483, - 0.0401398527368, - 0.040716392597, - 0.0412867061273, - 0.0418507318936, - 0.0424084093353, - 0.042959678772, - 0.04350448141, - 0.0440427593484, - 0.0445744555854, - 0.0450995140242, - 0.0456178794793, - 0.0461294976816, - 0.0466343152849, - 0.0471322798709, - 0.0476233399547, - 0.0481074449906, - 0.0485845453767, - 0.0490545924602, - 0.0495175385424, - 0.0499733368836, - 0.0504219417076, - 0.0508633082066, - 0.0512973925451, - 0.0517241518648, - 0.0521435442885, - 0.0525555289243, - 0.0529600658694, - 0.053357116214, - 0.0537466420452, - 0.0541286064501, - 0.0545029735196, - 0.0548697083516, - 0.0552287770541, - 0.0555801467484, - 0.0559237855719, - 0.0562596626808, - 0.056587748253, - 0.0569080134905, - 0.0572204306215, - 0.0575249729032, - 0.0578216146235, - 0.0581103311033, - 0.0583910986981, - 0.0586638947998, - 0.0589286978384, - 0.0591854872834, - 0.0594342436452, - 0.059674948476, - 0.0599075843714, - 0.060132134971, - 0.060348584959, - 0.0605569200653, - 0.060757127066, - 0.0609491937834, - 0.0611331090866, - 0.0613088628917, - 0.0614764461617, - 0.0616358509061, - 0.0617870701811, - 0.0619300980892, - 0.0620649297781, - 0.0621915614407, - 0.062309990314, - 0.0624202146784, - 0.0625222338563, - 0.0626160482111, - 0.0627016591463, - 0.0627790691032, - 0.0628482815602, - 0.0629093010306, - 0.0629621330608, - 0.0630067842285, - 0.0630432621406, - 0.0630715754311, - 0.0630917337583, - 0.0631037478029, - 0.0631076292649, - 0.0631033908615, - 0.0630910463234, - 0.0630706103927, - 0.0630420988192, - 0.0630055283575, - 0.0629609167635, - 0.0629082827908, - 0.0628476461875, - 0.0627790276921, - 0.06270244903, - 0.062617932909, - 0.0625255030158, - 0.0624251840116, - 0.0623170015277, - 0.0622009821608, - 0.0620771534693, - 0.0619455439675, - 0.0618061831216, - 0.0616591013446, - 0.0615043299912, - 0.0613419013525, - 0.0611718486511, - 0.0609942060355, - 0.0608090085747, - 0.0606162922525, - 0.0604160939618, - 0.0602084514991, - 0.0599934035581, - 0.059770989724, - 0.0595412504671, - 0.0593042271369, - 0.0590599619555, - 0.0588084980111, - 0.0585498792516, - 0.0582841504778, - 0.0580113573368, - 0.0577315463148, - 0.0574447647307, - 0.0571510607284, - 0.05685048327, - 0.0565430821284, - 0.0562289078801, - 0.0559080118976, - 0.0555804463417, - 0.0552462641544, - 0.0549055190504, - 0.0545582655099, - 0.0542045587704, - 0.0538444548188, - 0.0534780103832, - 0.0531052829248, - 0.0527263306296, - 0.0523412124, - 0.0519499878464, - 0.051552717279, - 0.0511494616984, - 0.0507402827879, - 0.0503252429041, - 0.049904405068, - 0.0494778329568, - 0.0490455908941, - 0.0486077438412, - 0.0481643573882, - 0.0477154977444, - 0.047261231729, - 0.0468016267623, - 0.0463367508557, - 0.0458666726024, - 0.0453914611683, - 0.0449111862815, - 0.0444259182235, - 0.0439357278189, - 0.0434406864261, - 0.042940865927, - 0.0424363387172, - 0.0419271776963, - 0.0414134562577, - 0.0408952482785, - 0.0403726281094, - 0.0398456705645, - 0.0393144509112, - 0.0387790448601, - 0.0382395285541, - 0.0376959785586, - 0.0371484718509, - 0.0365970858096, - 0.0360418982046, - 0.0354829871859, - 0.0349204312736, - 0.034354309347, - 0.0337847006342, - 0.0332116847012, - 0.0326353414412, - 0.032055751064, - 0.0314729940854, - 0.0308871513161, - 0.0302983038508, - 0.0297065330578, - 0.0291119205678, - 0.0285145482631, - 0.0279144982669, - 0.0273118529317, - 0.0267066948293, - 0.0260991067391, - 0.0254891716375, - 0.0248769726867, - 0.0242625932239, - 0.02364611675, - 0.0230276269188, - 0.0224072075262, - 0.0217849424984, - 0.0211609158816, - 0.0205352118308, - 0.0199079145982, - 0.0192791085231, - 0.0186488780199, - 0.0180173075677, - 0.017384481699, - 0.0167504849886, - 0.0161154020428, - 0.0154793174881, - 0.0148423159604, - 0.0142044820937, - 0.0135659005097, - 0.012926655806, - 0.0122868325458, - 0.0116465152467, - 0.0110057883697, - 0.0103647363084, - 0.00972344337807, - 0.00908199380471, - 0.00844047171436, - 0.00779896112212, - 0.00715754592145, - 0.00651630987337, - 0.00587533659568, - 0.00523470955231, - 0.00459451204262, - 0.00395482719074, - 0.00331573793497, - 0.00267732701719, - 0.00203967697234, - 0.00140287011793, - 0.000766988543539, - 0.000132114100414, - -0.000501671608894, - -0.00113428724088, - -0.00176565172135, - -0.00239568425572, - -0.00302430433914, - -0.00365143176668, - -0.00427698664342, - -0.00490088939449, - -0.00552306077507, - -0.00614342188031, - -0.00676189415524, - -0.00737839940455, - -0.00799285980242, - -0.00860519790216, - -0.00921533664592, - -0.00982319937424, - -0.0104287098356, - -0.0110317921958, - -0.0116323710475, - -0.0122303714195, - -0.0128257187858, - -0.0134183390752, - -0.01400815868, - -0.0145951044653, - -0.0151791037781, - -0.0157600844557, - -0.016337974835, - -0.0169127037614, - -0.0174842005968, - -0.0180523952289, - -0.0186172180793, - -0.0191786001121, - -0.0197364728423, - -0.0202907683441, - -0.0208414192589, - -0.0213883588036, - -0.0219315207788, - -0.0224708395762, - -0.0230062501872, - -0.0235376882099, - -0.0240650898574, - -0.0245883919653, - -0.0251075319987, - -0.0256224480603, - -0.0261330788974, - -0.026639363909, - -0.0271412431531, - -0.027638657354, - -0.0281315479086, - -0.028619856894, - -0.0291035270735, - -0.0295825019039, - -0.0300567255418, - -0.03052614285, - -0.0309906994038, - -0.0314503414976, - -0.0319050161506, - -0.0323546711133, - -0.032799254873, - -0.0332387166601, - -0.0336730064534, - -0.0341020749861, - -0.0345258737512, - -0.0349443550068, - -0.0353574717815, - -0.0357651778797, - -0.0361674278868, - -0.0365641771737, - -0.0369553819021, - -0.0373409990294, - -0.037720986313, - -0.0380953023148, - -0.0384639064062, - -0.0388267587718, - -0.0391838204139, - -0.0395350531568, - -0.0398804196502, - -0.0402198833738, - -0.0405534086406, - -0.0408809606006, - -0.0412025052443, - -0.0415180094065, - -0.0418274407689, - -0.0421307678642, - -0.0424279600782, - -0.0427189876535, - -0.0430038216919, - -0.0432824341574, - -0.0435547978786, - -0.0438208865513, - -0.0440806747407, - -0.044334137884, - -0.0445812522922, - -0.0448219951521, - -0.0450563445285, - -0.0452842793657, - -0.0455057794893, - -0.0457208256076, - -0.0459293993132, - -0.0461314830842, - -0.0463270602853, - -0.046516115169, - -0.0466986328765, - -0.0468745994385, - -0.047044001776, - -0.0472068277008, - -0.0473630659157, - -0.0475127060156, - -0.0476557384869, - -0.047792154708, - -0.0479219469495, - -0.0480451083735, - -0.0481616330339, - -0.0482715158757, - -0.0483747527348, - -0.048471340337, - -0.0485612762978, - -0.0486445591211, - -0.0487211881985, - -0.0487911638081, - -0.0488544871135, - -0.0489111601623, - -0.0489611858847, - -0.0490045680921, - -0.0490413114755, - -0.0490714216033, - -0.04909490492, - -0.0491117687438, - -0.0491220212647, - -0.0491256715422, - -0.0491227295028, - -0.0491132059379, - -0.049097112501, - -0.0490744617051, - -0.0490452669198, - -0.0490095423687, - -0.0489673031258, - -0.0489185651133, - -0.0488633450973, - -0.0488016606855, - -0.048733530323, - -0.048658973289, - -0.0485780096932, - -0.0484906604721, - -0.0483969473849, - -0.0482968930095, - -0.0481905207388, - -0.0480778547763, - -0.0479589201315, - -0.0478337426159, - -0.0477023488386, - -0.0475647662012, - -0.0474210228935, - -0.0472711478887, - -0.0471151709383, - -0.0469531225671, - -0.0467850340685, - -0.0466109374988, - -0.0464308656722, - -0.0462448521553, - -0.0460529312618, - -0.0458551380467, - -0.0456515083008, - -0.0454420785449, - -0.045226886024, - -0.0450059687012, - -0.0447793652519, - -0.0445471150575, - -0.0443092581992, - -0.0440658354521, - -0.0438168882782, - -0.0435624588203, - -0.0433025898956, - -0.0430373249887, - -0.0427667082452, - -0.0424907844647, - -0.0422095990943, - -0.0419231982209, - -0.0416316285652, - -0.0413349374737, - -0.0410331729119, - -0.0407263834574, - -0.0404146182917, - -0.0400979271937, - -0.0397763605317, - -0.039449969256, - -0.0391188048914, - -0.0387829195292, - -0.03844236582, - -0.0380971969653, - -0.0377474667101, - -0.0373932293345, - -0.0370345396463, - -0.0366714529723, - -0.0363040251506, - -0.0359323125222, - -0.0355563719231, - -0.0351762606754, - -0.0347920365796, - -0.0344037579057, - -0.0340114833851, - -0.0336152722017, - -0.0332151839837, - -0.0328112787948, - -0.0324036171257, - -0.0319922598852, - -0.0315772683914, - -0.0311587043631, - -0.0307366299109, - -0.0303111075284, - -0.0298822000829, - -0.0294499708069, - -0.0290144832888, - -0.0285758014641, - -0.0281339896059, - -0.0276891123163, - -0.027241234517, - -0.0267904214398, - -0.0263367386183, - -0.0258802518775, - -0.0254210273255, - -0.0249591313437, - -0.0244946305776, - -0.0240275919274, - -0.0235580825388, - -0.0230861697933, - -0.0226119212993, - -0.0221354048821, - -0.0216566885748, - -0.0211758406086, - -0.0206929294036, - -0.0202080235592, - -0.0197211918445, - -0.0192325031888, - -0.018742026672, - -0.0182498315154, - -0.0177559870719, - -0.0172605628162, - -0.0167636283358, - -0.0162652533211, - -0.0157655075556, - -0.015264460907, - -0.0147621833172, - -0.0142587447924, - -0.0137542153945, - -0.0132486652304, - -0.0127421644436, - -0.0122347832036, - -0.0117265916972, - -0.0112176601182, - -0.0107080586587, - -0.0101978574991, - -0.00968712679842, - -0.00917593668545, - -0.00866435724875, - -0.00815245852747, - -0.00764031050179, - -0.0071279830836, - -0.00661554610708, - -0.00610306931933, - -0.00559062237104, - -0.00507827480714, - -0.00456609605758, - -0.00405415542799, - -0.00354252209046, - -0.00303126507437, - -0.00252045325719, - -0.0020101553553, - -0.00150043991494, - -0.000991375303097, - -0.000483029698456, - 2.45289175845e-05, - 0.000531232769895, - 0.00103701429854, - 0.00154180616766, - 0.00204554127434, - 0.00254815275738, - 0.00304957400611, - 0.00354973866905, - 0.0040485806626, - 0.0045460341797, - 0.00504203369834, - 0.00553651399015, - 0.00602941012883, - 0.0065206574986, - 0.00701019180257, - 0.00749794907104, - 0.00798386566979, - 0.00846787830827, - 0.00894992404774, - 0.0094299403094, - 0.00990786488239, - 0.0103836359318, - 0.0108571920065, - 0.0113284720471, - 0.0117974153937, - 0.0122639617935, - 0.0127280514087, - 0.013189624824, - 0.0136486230537, - 0.01410498755, - 0.0145586602097, - 0.0150095833818, - 0.0154576998745, - 0.0159029529629, - 0.0163452863956, - 0.0167846444019, - 0.0172209716987, - 0.0176542134977, - 0.0180843155115, - 0.0185112239613, - 0.0189348855827, - 0.0193552476326, - 0.0197722578958, - 0.0201858646913, - 0.0205960168786, - 0.0210026638639, - 0.0214057556067, - 0.021805242625, - 0.0222010760023, - 0.0225932073928, - 0.0229815890276, - 0.0233661737204, - 0.0237469148728, - 0.0241237664804, - 0.024496683138, - 0.024865620045, - 0.0252305330107, - 0.0255913784596, - 0.0259481134365, - 0.0263006956114, - 0.0266490832846, - 0.0269932353915, - 0.0273331115073, - 0.0276686718516, - 0.0279998772934, - 0.0283266893549, - 0.0286490702163, - 0.02896698272, - 0.029280390375, - 0.0295892573604, - 0.0298935485299, - 0.0301932294157, - 0.030488266232, - 0.0307786258788, - 0.0310642759457, - 0.0313451847151, - 0.0316213211659, - 0.0318926549764, - 0.032159156528, - 0.0324207969079, - 0.0326775479122, - 0.0329293820491, - 0.0331762725411, - 0.0334181933281, - 0.0336551190702, - 0.0338870251497, - 0.0341138876735, - 0.0343356834761, - 0.0345523901208, - 0.0347639859025, - 0.0349704498494, - 0.0351717617248, - 0.035367902029, - 0.0355588520012, - 0.0357445936203, - 0.0359251096074, - 0.0361003834262, - 0.036270399285, - 0.0364351421372, - 0.0365945976829, - 0.0367487523695, - 0.0368975933927, - 0.0370411086972, - 0.0371792869771, - 0.0373121176767, - 0.0374395909911, - 0.0375616978659, - 0.037678429998, - 0.0377897798354, - 0.0378957405772, - 0.0379963061737, - 0.038091471326, - 0.038181231486, - 0.0382655828554, - 0.0383445223859, - 0.038418047778, - 0.0384861574807, - 0.0385488506904, - 0.0386061273502, - 0.0386579881486, - 0.0387044345187, - 0.0387454686368, - 0.038781093421, - 0.03881131253, - 0.0388361303614, - 0.03885555205, - 0.0388695834663, - 0.0388782312145, - 0.0388815026308, - 0.0388794057811, - 0.038871949459, - 0.0388591431834, - 0.0388409971968, - 0.0388175224619, - 0.0387887306602, - 0.0387546341883, - 0.0387152461562, - 0.0386705803837, - 0.0386206513979, - 0.0385654744304, - 0.0385050654137, - 0.0384394409783, - 0.0383686184498, - 0.0382926158447, - 0.0382114518679, - 0.0381251459084, - 0.0380337180361, - 0.037937188998, - 0.0378355802142, - 0.0377289137743, - 0.0376172124332, - 0.0375004996073, - 0.0373787993699, - 0.0372521364474, - 0.0371205362147, - 0.0369840246908, - 0.0368426285347, - 0.0366963750402, - 0.0365452921316, - 0.0363894083592, - 0.0362287528938, - 0.0360633555224, - 0.035893246643, - 0.0357184572597, - 0.0355390189772, - 0.0353549639959, - 0.0351663251065, - 0.0349731356849, - 0.0347754296861, - 0.0345732416395, - 0.0343666066429, - 0.0341555603567, - 0.0339401389986, - 0.0337203793373, - 0.0334963186871, - 0.0332679949019, - 0.0330354463688, - 0.0327987120025, - 0.0325578312389, - 0.0323128440291, - 0.032063790833, - 0.031810712613, - 0.0315536508276, - 0.0312926474251, - 0.0310277448369, - 0.0307589859712, - 0.0304864142059, - 0.0302100733827, - 0.0299300077996, - 0.0296462622043, - 0.029358881788, - 0.0290679121775, - 0.0287733994291, - 0.028475390021, - 0.0281739308467, - 0.0278690692077, - 0.0275608528065, - 0.0272493297391, - 0.0269345484881, - 0.0266165579153, - 0.0262954072543, - 0.0259711461035, - 0.0256438244181, - 0.0253134925032, - 0.0249802010061, - 0.0246440009085, - 0.0243049435197, - 0.0239630804683, - 0.0236184636947, - 0.0232711454439, - 0.0229211782571, - 0.0225686149646, - 0.0222135086777, - 0.0218559127812, - 0.021495880925, - 0.0211334670172, - 0.0207687252154, - 0.0204017099192, - 0.0200324757621, - 0.0196610776039, - 0.0192875705225, - 0.0189120098059, - 0.0185344509443, - 0.018154949622, - 0.0177735617097, - 0.0173903432559, - 0.0170053504793, - 0.0166186397605, - 0.0162302676343, - 0.0158402907809, - 0.0154487660186, - 0.0150557502949, - 0.0146613006792, - 0.014265474354, - 0.0138683286071, - 0.0134699208236, - 0.0130703084774, - 0.0126695491231, - 0.0122677003884, - 0.0118648199653, - 0.0114609656023, - 0.0110561950962, - 0.010650566284, - 0.0102441370348, - 0.00983696524164, - 0.00942910881337, - 0.00902062566659, - 0.00861157371755, - 0.0082020108741, - 0.00779199502759, - 0.0073815840448, - 0.00697083575996, - 0.00655980796667, - 0.00614855840993, - 0.00573714477813, - 0.00532562469507, - 0.00491405571203, - 0.00450249529983, - 0.00409100084092, - 0.00367962962148, - 0.00326843882359, - 0.00285748551736, - 0.00244682665313, - 0.00203651905369, - 0.00162661940652, - 0.00121718425607, - 0.000808269996037, - 0.000399932861746, - -7.77107752303e-06, - -0.000414785926115, - -0.00082105596957, - -0.00122652568215, - -0.00163113973434, - -0.00203484300028, - -0.00243758056521, - -0.00283929773283, - -0.00323994003264, - -0.00363945322725, - -0.0040377833196, - -0.0044348765602, - -0.00483067945427, - -0.00522513876889, - -0.00561820154005, - -0.00600981507967, - -0.0063999269826, - -0.00678848513355, - -0.00717543771394, - -0.00756073320875, - -0.0079443204133, - -0.00832614843997, - -0.00870616672483, - -0.00908432503434, - -0.00946057347184, - -0.00983486248408, - -0.0102071428676, - -0.0105773657754, - -0.0109454827228, - -0.011311445594, - -0.0116752066484, - -0.0120367185265, - -0.0123959342562, - -0.0127528072586, - -0.0131072913541, - -0.0134593407684, - -0.0138089101381, - -0.0141559545165, - -0.0145004293797, - -0.0148422906315, - -0.0151814946098, - -0.0155179980915, - -0.0158517582979, - -0.0161827329006, - -0.0165108800264, - -0.0168361582624, - -0.0171585266614, - -0.0174779447471, - -0.0177943725186, - -0.0181077704558, - -0.018418099524, - -0.0187253211788, - -0.0190293973708, - -0.0193302905499, - -0.0196279636705, - -0.0199223801954, - -0.0202135041005, - -0.0205012998788, - -0.0207857325451, - -0.0210667676397, - -0.0213443712329, - -0.0216185099286, - -0.0218891508684, - -0.0221562617356, - -0.0224198107587, - -0.0226797667151, - -0.0229360989349, - -0.023188777304, - -0.0234377722682, - -0.0236830548358, - -0.0239245965814, - -0.0241623696486, - -0.0243963467536, - -0.0246265011879, - -0.0248528068212, - -0.0250752381044, - -0.0252937700722, - -0.0255083783458, - -0.0257190391356, - -0.0259257292435, - -0.0261284260654, - -0.0263271075935, - -0.0265217524185, - -0.0267123397318, - -0.0268988493275, - -0.0270812616045, - -0.027259557568, - -0.0274337188319, - -0.0276037276198, - -0.0277695667671, - -0.0279312197226, - -0.0280886705493, - -0.0282419039265, - -0.0283909051506, - -0.0285356601363, - -0.028676155418, - -0.0288123781503, - -0.0289443161094, - -0.0290719576935, - -0.0291952919237, - -0.0293143084447, - -0.0294289975252, - -0.0295393500586, - -0.029645357563, - -0.0297470121817, - -0.0298443066836, - -0.0299372344627, - -0.0300257895388, - -0.0301099665569, - -0.0301897607873, - -0.0302651681253, - -0.030336185091, - -0.0304028088284, - -0.0304650371054, - -0.0305228683131, - -0.0305763014648, - -0.0306253361955, - -0.0306699727611, - -0.0307102120372, - -0.0307460555181, - -0.0307775053159, - -0.0308045641592, - -0.0308272353915, - -0.0308455229704, - -0.0308594314655, - -0.0308689660573, - -0.0308741325356, - -0.0308749372973, - -0.0308713873451, - -0.0308634902853, - -0.030851254326, - -0.0308346882752, - -0.0308138015381, - -0.0307886041155, - -0.0307591066013, - -0.0307253201799, - -0.0306872566241, - -0.0306449282923, - -0.030598348126, - -0.0305475296471, - -0.0304924869551, - -0.0304332347244, - -0.0303697882009, - -0.0303021631996, - -0.0302303761012, - -0.0301544438489, - -0.0300743839455, - -0.0299902144494, - -0.0299019539721, - -0.0298096216741, - -0.0297132372617, - -0.029612820983, - -0.0295083936249, - -0.0293999765086, - -0.0292875914865, - -0.0291712609377, - -0.0290510077643, - -0.0289268553876, - -0.0287988277437, - -0.0286669492792, - -0.0285312449477, - -0.0283917402045, - -0.0282484610031, - -0.0281014337905, - -0.0279506855023, - -0.0277962435588, - -0.0276381358602, - -0.0274763907814, - -0.0273110371682, - -0.0271421043317, - -0.0269696220439, - -0.0267936205325, - -0.0266141304762, - -0.0264311829996, - -0.0262448096679, - -0.026055042482, - -0.0258619138734, - -0.0256654566986, - -0.0254657042342, - -0.025262690171, - -0.0250564486094, - -0.0248470140531, - -0.0246344214043, - -0.0244187059576, - -0.0241999033948, - -0.0239780497791, - -0.0237531815493, - -0.0235253355142, - -0.0232945488469, - -0.0230608590788, - -0.0228243040936, - -0.0225849221219, - -0.0223427517348, - -0.022097831838, - -0.0218502016658, - -0.021599900775, - -0.0213469690392, - -0.0210914466417, - -0.0208333740705, - -0.0205727921111, - -0.0203097418408, - -0.0200442646223, - -0.0197764020975, - -0.0195061961807, - -0.0192336890529, - -0.0189589231549, - -0.0186819411811, - -0.0184027860729, - -0.0181215010124, - -0.0178381294158, - -0.0175527149268, - -0.0172653014101, - -0.0169759329449, - -0.0166846538184, - -0.0163915085188, - -0.016096541729, - -0.0157997983198, - -0.0155013233434, - -0.0152011620266, - -0.0148993597638, - -0.014595962111, - -0.0142910147783, - -0.0139845636237, - -0.0136766546461, - -0.0133673339786, - -0.0130566478817, - -0.0127446427365, - -0.0124313650381, - -0.0121168613886, - -0.0118011784901, - -0.0114843631385, - -0.0111664622162, - -0.0108475226854, - -0.0105275915813, - -0.0102067160055, - -0.00988494311869, - -0.00956232013437, - -0.00923889431172, - -0.00891471294892, - -0.0085898233763, - -0.00826427294954, - -0.00793810904295, - -0.00761137904258, - -0.00728413033954, - -0.00695641032319, - -0.00662826637439, - -0.00629974585875, - -0.00597089611991, - -0.00564176447281, - -0.00531239819702, - -0.00498284452997, - -0.00465315066036, - -0.00432336372145, - -0.00399353078445, - -0.00366369885187, - -0.00333391485092, - -0.00300422562696, - -0.00267467793691, - -0.00234531844271, - -0.00201619370482, - -0.0016873501757, - -0.00135883419339, - -0.00103069197503, - -0.000702969610455, - -0.000375713055814, - -4.89681272062e-05, - 0.000277219505644, - 0.000602804325689, - 0.000927740974823, - 0.00125198426012, - 0.00157548916004, - 0.00189821083059, - 0.00222010461146, - 0.00254112603214, - 0.00286123081796, - 0.00318037489613, - 0.00349851440173, - 0.00381560568363, - 0.00413160531048, - 0.00444647007647, - 0.00476015700726, - 0.00507262336571, - 0.00538382665764, - 0.00569372463755, - 0.00600227531425, - 0.00630943695648, - 0.00661516809851, - 0.00691942754562, - 0.00722217437959, - 0.00752336796414, - 0.0078229679503, - 0.00812093428172, - 0.0084172272, - 0.00871180724986, - 0.00900463528436, - 0.00929567247, - 0.00958488029184, - 0.00987222055844, - 0.0101576554069, - 0.0104411473078, - 0.0107226590699, - 0.011002153845, - 0.0112795951331, - 0.0115549467862, - 0.0118281730137, - 0.0120992383869, - 0.012368107843, - 0.0126347466902, - 0.0128991206115, - 0.0131611956695, - 0.0134209383105, - 0.0136783153687, - 0.0139332940702, - 0.0141858420374, - 0.0144359272929, - 0.0146835182634, - 0.0149285837835, - 0.0151710930999, - 0.0154110158747, - 0.0156483221895, - 0.0158829825487, - 0.0161149678835, - 0.0163442495549, - 0.0165707993576, - 0.0167945895228, - 0.0170155927224, - 0.0172337820711, - 0.0174491311307, - 0.0176616139122, - 0.0178712048796, - 0.0180778789524, - 0.0182816115086, - 0.0184823783876, - 0.0186801558928, - 0.0188749207946, - 0.0190666503325, - 0.0192553222181, - 0.0194409146372, - 0.0196234062525, - 0.0198027762056, - 0.0199790041197, - 0.0201520701012, - 0.0203219547423, - 0.0204886391226, - 0.0206521048116, - 0.0208123338699, - 0.0209693088516, - 0.0211230128057, - 0.0212734292778, - 0.0214205423119, - 0.0215643364516, - 0.0217047967417, - 0.0218419087296, - 0.0219756584665, - 0.0221060325087, - 0.0222330179186, - 0.0223566022659, - 0.0224767736286, - 0.0225935205937, - 0.0227068322583, - 0.0228166982302, - 0.0229231086288, - 0.0230260540855, - 0.0231255257441, - 0.0232215152618, - 0.023314014809, - 0.0234030170701, - 0.0234885152433, - 0.0235705030412, - 0.0236489746906, - 0.0237239249326, - 0.0237953490226, - 0.02386324273, - 0.0239276023383, - 0.0239884246445, - 0.024045706959, - 0.0240994471049, - 0.0241496434179, - 0.0241962947454, - 0.0242394004459, - 0.0242789603883, - 0.0243149749515, - 0.0243474450227, - 0.0243763719973, - 0.0244017577775, - 0.0244236047712, - 0.024441915891, - 0.0244566945528, - 0.0244679446747, - 0.0244756706757, - 0.0244798774739, - 0.0244805704853, - 0.0244777556223, - 0.0244714392916, - 0.0244616283932, - 0.024448330318, - 0.0244315529462, - 0.0244113046454, - 0.0243875942687, - 0.0243604311524, - 0.0243298251141, - 0.0242957864504, - 0.0242583259347, - 0.0242174548151, - 0.0241731848116, - 0.0241255281138, - 0.0240744973788, - 0.0240201057279, - 0.0239623667447, - 0.0239012944718, - 0.0238369034086, - 0.0237692085079, - 0.0236982251735, - 0.0236239692569, - 0.0235464570548, - 0.0234657053053, - 0.0233817311854, - 0.0232945523077, - 0.0232041867167, - 0.0231106528863, - 0.0230139697157, - 0.0229141565265, - 0.0228112330589, - 0.0227052194685, - 0.0225961363224, - 0.0224840045958, - 0.0223688456682, - 0.0222506813196, - 0.0221295337271, - 0.0220054254605, - 0.0218783794789, - 0.0217484191263, - 0.021615568128, - 0.0214798505865, - 0.0213412909773, - 0.0211999141445, - 0.0210557452974, - 0.0209088100054, - 0.0207591341943, - 0.0206067441417, - 0.0204516664728, - 0.0202939281559, - 0.0201335564978, - 0.0199705791399, - 0.0198050240527, - 0.0196369195322, - 0.0194662941947, - 0.0192931769722, - 0.019117597108, - 0.0189395841517, - 0.0187591679544, - 0.0185763786642, - 0.0183912467211, - 0.018203802852, - 0.0180140780663, - 0.0178221036504, - 0.0176279111632, - 0.0174315324306, - 0.017232999541, - 0.0170323448397, - 0.0168296009242, - 0.016624800639, - 0.0164179770702, - 0.0162091635407, - 0.0159983936048, - 0.0157857010427, - 0.0155711198559, - 0.0153546842612, - 0.0151364286859, - 0.0149163877623, - 0.0146945963224, - 0.0144710893922, - 0.014245902187, - 0.0140190701054, - 0.013790628724, - 0.0135606137923, - 0.0133290612265, - 0.013096007105, - 0.0128614876622, - 0.0126255392831, - 0.0123881984979, - 0.0121495019768, - 0.0119094865236, - 0.0116681890711, - 0.0114256466748, - 0.0111818965078, - 0.0109369758551, - 0.0106909221077, - 0.0104437727577, - 0.0101955653919, - 0.00994633768664, - 0.0096961274023, - 0.00944497237738, - 0.00919291052303, - 0.00893997981745, - 0.00868621830021, - 0.00843166406671, - 0.00817635526248, - 0.00792033007765, - 0.00766362674127, - 0.00740628351572, - 0.00714833869114, - 0.00688983057977, - 0.00663079751042, - 0.00637127782281, - 0.00611130986205, - 0.00585093197305, - 0.00559018249494, - 0.00532909975552, - 0.00506772206573, - 0.0048060877141, - 0.00454423496126, - 0.00428220203437, - 0.00402002712171, - 0.00375774836712, - 0.00349540386458, - 0.00323303165275, - 0.00297066970955, - 0.00270835594672, - 0.00244612820444, - 0.00218402424594, - 0.00192208175216, - 0.00166033831641, - 0.00139883143902, - 0.0011375985221, - 0.000876676864232, - 0.000616103655219, - 0.000355915970881, - 9.6150767848e-05, - -0.000163155121618, - -0.000421964994766, - -0.000680242283477, - -0.000937950559354, - -0.00119505353879, - -0.001451515088, - -0.00170729922803, - -0.00196237013973, - -0.00221669216868, - -0.00247022983012, - -0.00272294781385, - -0.00297481098902, - -0.00322578440898, - -0.00347583331605, - -0.00372492314627, - -0.00397301953408, - -0.00422008831702, - -0.00446609554033, - -0.00471100746158, - -0.00495479055521, - -0.00519741151703, - -0.00543883726873, - -0.0056790349623, - -0.00591797198441, - -0.00615561596083, - -0.00639193476064, - -0.00662689650062, - -0.00686046954938, - -0.00709262253159, - -0.00732332433213, - -0.00755254410016, - -0.00778025125319, - -0.00800641548107, - -0.00823100674996, - -0.00845399530625, - -0.00867535168039, - -0.00889504669076, - -0.00911305144741, - -0.00932933735576, - -0.00954387612033, - -0.00975663974829, - -0.00996760055309, - -0.010176731158, - -0.0103840044994, - -0.0105893938305, - -0.0107928727245, - -0.010994415078, - -0.011193995114, - -0.0113915873856, - -0.0115871667788, - -0.0117807085155, - -0.011972188157, - -0.0121615816066, - -0.0123488651126, - -0.0125340152715, - -0.0127170090302, - -0.0128978236895, - -0.0130764369063, - -0.0132528266964, - -0.0134269714373, - -0.0135988498703, - -0.0137684411035, - -0.013935724614, - -0.0141006802501, - -0.0142632882339, - -0.0144235291635, - -0.0145813840149, - -0.0147368341447, - -0.0148898612915, - -0.0150404475787, - -0.0151885755156, - -0.0153342280001, - -0.01547738832, - -0.0156180401549, - -0.0157561675782, - -0.0158917550584, - -0.0160247874609, - -0.0161552500494, - -0.0162831284875, - -0.0164084088401, - -0.0165310775749, - -0.0166511215632, - -0.0167685280817, - -0.0168832848134, - -0.0169953798487, - -0.0171048016865, - -0.0172115392354, - -0.017315581814, - -0.0174169191526, - -0.0175155413934, - -0.0176114390914, - -0.0177046032151, - -0.0177950251473, - -0.0178826966852, - -0.0179676100415, - -0.0180497578442, - -0.0181291331376, - -0.018205729382, - -0.0182795404545, - -0.0183505606486, - -0.0184187846751, - -0.0184842076613, - -0.0185468251517, - -0.0186066331076, - -0.018663627907, - -0.0187178063444, - -0.0187691656309, - -0.0188177033933, - -0.0188634176744, - -0.0189063069318, - -0.0189463700384, - -0.0189836062809, - -0.0190180153598, - -0.0190495973886, - -0.0190783528928, - -0.0191042828097, - -0.0191273884869, - -0.0191476716819, - -0.019165134561, - -0.0191797796981, - -0.0191916100738, - -0.0192006290743, - -0.0192068404902, - -0.0192102485151, - -0.0192108577444, - -0.019208673174, - -0.0192037001989, - -0.0191959446114, - -0.0191854126002, - -0.019172110748, - -0.0191560460307, - -0.019137225815, - -0.0191156578573, - -0.0190913503011, - -0.019064311676, - -0.0190345508952, - -0.0190020772536, - -0.0189669004263, - -0.0189290304656, - -0.0188884777999, - -0.0188452532307, - -0.0187993679309, - -0.0187508334422, - -0.0186996616732, - -0.0186458648962, - -0.018589455746, - -0.0185304472161, - -0.0184688526572, - -0.0184046857741, - -0.0183379606233, - -0.0182686916102, - -0.0181968934865, - -0.0181225813473, - -0.0180457706284, - -0.0179664771035, - -0.0178847168812, - -0.0178005064021, - -0.0177138624357, - -0.0176248020776, - -0.0175333427464, - -0.0174395021802, - -0.0173432984341, - -0.0172447498763, - -0.0171438751856, - -0.0170406933473, - -0.0169352236507, - -0.0168274856851, - -0.0167174993368, - -0.0166052847856, - -0.0164908625011, - -0.0163742532394, - -0.0162554780397, - -0.0161345582203, - -0.0160115153753, - -0.015886371371, - -0.015759148342, - -0.0156298686875, - -0.0154985550678, - -0.0153652304004, - -0.0152299178558, - -0.0150926408544, - -0.014953423062, - -0.0148122883862, - -0.0146692609724, - -0.0145243651999, - -0.0143776256777, - -0.0142290672407, - -0.0140787149457, - -0.013926594067, - -0.0137727300928, - -0.0136171487207, - -0.0134598758537, - -0.0133009375959, - -0.0131403602486, - -0.0129781703058, - -0.0128143944503, - -0.0126490595489, - -0.0124821926488, - -0.0123138209728, - -0.0121439719152, - -0.0119726730375, - -0.0117999520641, - -0.0116258368776, - -0.0114503555148, - -0.0112735361623, - -0.0110954071517, - -0.0109159969558, - -0.0107353341836, - -0.0105534475761, - -0.0103703660018, - -0.0101861184524, - -0.010000734038, - -0.00981424198282, - -0.0096266716208, - -0.00943805239082, - -0.00924841383238, - -0.009057785581, - -0.00886619736374, - -0.00867367899463, - -0.00848026037015, - -0.00828597146467, - -0.00809084232593, - -0.00789490307046, - -0.00769818387905, - -0.00750071499217, - -0.00730252670545, - -0.00710364936511, - -0.00690411336337, - -0.00670394913397, - -0.00650318714755, - -0.00630185790711, - -0.00609999194351, - -0.00589761981087, - -0.00569477208207, - -0.00549147934419, - -0.005287772194, - -0.00508368123341, - -0.00487923706501, - -0.0046744702875, - -0.00446941149122, - -0.00426409125368, - -0.00405854013503, - -0.00385278867365, - -0.00364686738162, - -0.00344080674034, - -0.00323463719606, - -0.00302838915545, - -0.00282209298121, - -0.00261577898768, - -0.00240947743644, - -0.00220321853193, - -0.00199703241715, - -0.0017909491693, - -0.00158499879545, - -0.00137921122827, - -0.00117361632174, - -0.000968243846871, - -0.000763123487499, - -0.000558284836041, - -0.000353757389306, - -0.000149570544309, - 5.4246405878e-05, - 0.000257664276264, - 0.000460653994047, - 0.000663186602702, - 0.000865233266042, - 0.00106676527226, - 0.00126775403792, - 0.001468171112, - 0.00166798817976, - 0.00186717706678, - 0.00206570974276, - 0.00226355832549, - 0.00246069508465, - 0.00265709244562, - 0.00285272299329, - 0.00304755947582, - 0.00324157480838, - 0.0034347420768, - 0.0036270345413, - 0.00381842564005, - 0.00400888899286, - 0.00419839840465, - 0.00438692786908, - 0.00457445157196, - 0.00476094389478, - 0.00494637941813, - 0.00513073292507, - 0.00531397940449, - 0.00549609405448, - 0.00567705228553, - 0.00585682972389, - 0.00603540221467, - 0.0062127458251, - 0.00638883684761, - 0.00656365180295, - 0.00673716744322, - 0.00690936075496, - 0.00708020896201, - 0.00724968952856, - 0.00741778016198, - 0.00758445881567, - 0.00774970369194, - 0.0079134932447, - 0.00807580618223, - 0.00823662146987, - 0.00839591833266, - 0.00855367625791, - 0.00870987499782, - 0.00886449457193, - 0.00901751526962, - 0.00916891765255, - 0.009318682557, - 0.00946679109623, - 0.00961322466279, - 0.00975796493071, - 0.00990099385776, - 0.0100422936876, - 0.0101818469517, - 0.0103196364718, - 0.0104556453616, - 0.0105898570287, - 0.0107222551768, - 0.0108528238072, - 0.0109815472212, - 0.0111084100211, - 0.0112333971125, - 0.0113564937059, - 0.0114776853182, - 0.0115969577743, - 0.0117142972088, - 0.0118296900671, - 0.0119431231074, - 0.0120545834016, - 0.0121640583369, - 0.0122715356172, - 0.0123770032637, - 0.0124804496171, - 0.012581863338, - 0.0126812334079, - 0.0127785491311, - 0.0128738001347, - 0.0129669763702, - 0.0130580681141, - 0.0131470659689, - 0.0132339608637, - 0.0133187440552, - 0.0134014071282, - 0.0134819419962, - 0.0135603409024, - 0.0136365964196, - 0.0137107014514, - 0.0137826492319, - 0.0138524333269, - 0.0139200476335, - 0.0139854863808, - 0.0140487441303, - 0.0141098157756, - 0.0141686965429, - 0.0142253819911, - 0.0142798680117, - 0.0143321508288, - 0.0143822269993, - 0.0144300934123, - 0.0144757472895, - 0.0145191861848, - 0.0145604079837, - 0.0145994109037, - 0.0146361934933, - 0.0146707546318, - 0.0147030935293, - 0.0147332097255, - 0.0147611030897, - 0.0147867738197, - 0.0148102224419, - 0.0148314498098, - 0.0148504571039, - 0.0148672458306, - 0.0148818178215, - 0.0148941752325, - 0.0149043205426, - 0.0149122565535, - 0.0149179863882, - 0.01492151349, - 0.0149228416215, - 0.0149219748632, - 0.0149189176127, - 0.0149136745831, - 0.0149062508018, - 0.0148966516095, - 0.0148848826583, - 0.0148709499106, - 0.0148548596377, - 0.0148366184179, - 0.0148162331356, - 0.014793710979, - 0.0147690594391, - 0.0147422863076, - 0.0147133996752, - 0.0146824079301, - 0.0146493197562, - 0.0146141441308, - 0.0145768903233, - 0.014537567893, - 0.0144961866871, - 0.0144527568387, - 0.014407288765, - 0.0143597931649, - 0.0143102810172, - 0.0142587635782, - 0.0142052523797, - 0.0141497592264, - 0.0140922961942, - 0.0140328756275, - 0.013971510137, - 0.0139082125973, - 0.0138429961445, - 0.0137758741737, - 0.0137068603366, - 0.0136359685391, - 0.0135632129385, - 0.0134886079411, - 0.0134121681995, - 0.0133339086102, - 0.0132538443106, - 0.0131719906763, - 0.0130883633188, - 0.0130029780822, - 0.0129158510409, - 0.0128269984963, - 0.0127364369744, - 0.0126441832224, - 0.0125502542063, - 0.012454667108, - 0.0123574393215, - 0.0122585884512, - 0.0121581323077, - 0.0120560889054, - 0.0119524764596, - 0.0118473133826, - 0.0117406182815, - 0.0116324099547, - 0.0115227073883, - 0.0114115297539, - 0.0112988964044, - 0.0111848268714, - 0.0110693408617, - 0.0109524582543, - 0.0108341990967, - 0.0107145836019, - 0.010593632145, - 0.01047136526, - 0.0103478036362, - 0.0102229681148, - 0.0100968796859, - 0.00996955948477, - 0.00984102878837, - 0.00971130901217, - 0.00958042170656, - 0.00944838855339, - 0.00931523136251, - 0.00918097206825, - 0.00904563272599, - 0.00890923550855, - 0.00877180270275, - 0.00863335670582, - 0.00849392002189, - 0.00835351525839, - 0.00821216512255, - 0.00806989241777, - 0.00792672004007, - 0.0077826709745, - 0.00763776829155, - 0.00749203514353, - 0.00734549476097, - 0.00719817044906, - 0.00705008558394, - 0.00690126360918, - 0.00675172803209, - 0.00660150242012, - 0.00645061039723, - 0.00629907564028, - 0.00614692187537, - 0.0059941728742, - 0.00584085245051, - 0.00568698445636, - 0.00553259277856, - 0.00537770133502, - 0.00522233407114, - 0.00506651495617, - 0.00491026797958, - 0.00475361714748, - 0.00459658647899, - 0.00443920000263, - 0.00428148175271, - 0.00412345576575, - 0.00396514607691, - 0.00380657671633, - 0.00364777170567, - 0.00348875505443, - 0.00332955075648, - 0.00317018278645, - 0.00301067509621, - 0.00285105161138, - 0.00269133622772, - 0.00253155280771, - 0.00237172517702, - 0.00221187712101, - 0.00205203238127, - 0.00189221465217, - 0.0017324475774, - 0.00157275474655, - 0.00141315969168, - 0.00125368588395, - 0.00109435673017, - 0.000935195569501, - 0.000776225670052, - 0.000617470225566, - 0.000458952352092, - 0.000300695084686, - 0.000142721374124, - -1.49459163556e-05, - -0.000172284014306, - -0.000329270241292, - -0.000485882016098, - -0.00064209685791, - -0.000797892389482, - -0.000953246340281, - -0.0011081365496, - -0.00126254096966, - -0.0014164376687, - -0.00156980483399, - -0.0017226207749, - -0.00187486392589, - -0.00202651284948, - -0.00217754623923, - -0.00232794292264, - -0.00247768186406, - -0.00262674216761, - -0.00277510307997, - -0.00292274399325, - -0.00306964444775, - -0.00321578413479, - -0.00336114289937, - -0.00350570074298, - -0.00364943782619, - -0.00379233447138, - -0.00393437116533, - -0.00407552856183, - -0.00421578748424, - -0.00435512892804, - -0.00449353406333, - -0.0046309842373, - -0.00476746097669, - -0.00490294599017, - -0.00503742117078, - -0.00517086859821, - -0.00530327054118, - -0.00543460945965, - -0.00556486800717, - -0.005694029033, - -0.00582207558435, - -0.00594899090851, - -0.00607475845497, - -0.00619936187751, - -0.00632278503624, - -0.00644501199958, - -0.00656602704631, - -0.00668581466744, - -0.00680435956815, - -0.00692164666965, - -0.00703766111102, - -0.00715238825101, - -0.00726581366979, - -0.00737792317067, - -0.00748870278182, - -0.00759813875787, - -0.00770621758159, - -0.00781292596539, - -0.00791825085293, - -0.00802217942055, - -0.00812469907881, - -0.00822579747384, - -0.00832546248879, - -0.00842368224515, - -0.00852044510404, - -0.00861573966751, - -0.00870955477979, - -0.00880187952843, - -0.0088927032455, - -0.0089820155087, - -0.00906980614241, - -0.00915606521875, - -0.00924078305861, - -0.00932395023252, - -0.00940555756168, - -0.00948559611876, - -0.00956405722877, - -0.00964093246986, - -0.00971621367409, - -0.00978989292813, - -0.00986196257398, - -0.00993241520957, - -0.0100012436894, - -0.010068441125, - -0.0101340008858, - -0.010197916599, - -0.0102601821506, - -0.0103207916855, - -0.0103797396079, - -0.0104370205819, - -0.0104926295311, - -0.0105465616398, - -0.0105988123523, - -0.0106493773737, - -0.0106982526696, - -0.0107454344666, - -0.0107909192519, - -0.0108347037738, - -0.0108767850412, - -0.0109171603238, - -0.0109558271518, - -0.0109927833162, - -0.0110280268679, - -0.0110615561182, - -0.011093369638, - -0.0111234662577, - -0.011151845067, - -0.0111785054142, - -0.011203446906, - -0.0112266694072, - -0.0112481730397, - -0.0112679581824, - -0.0112860254706, - -0.0113023757953, - -0.0113170103023, - -0.011329930392, - -0.0113411377185, - -0.0113506341885, - -0.0113584219611, - -0.0113645034466, - -0.0113688813056, - -0.0113715584483, - -0.0113725380335, - -0.0113718234675, - -0.0113694184033, - -0.0113653267394, - -0.0113595526187, - -0.0113521004276, - -0.0113429747946, - -0.0113321805893, - -0.011319722921, - -0.0113056071377, - -0.0112898388247, - -0.011272423803, - -0.0112533681286, - -0.0112326780903, - -0.0112103602092, - -0.0111864212364, - -0.0111608681521, - -0.0111337081637, - -0.0111049487047, - -0.0110745974326, - -0.0110426622277, - -0.0110091511913, - -0.0109740726442, - -0.0109374351248, - -0.0108992473872, - -0.0108595184002, - -0.0108182573445, - -0.0107754736119, - -0.0107311768025, - -0.0106853767237, - -0.0106380833877, - -0.0105893070098, - -0.0105390580066, - -0.0104873469937, - -0.0104341847839, - -0.0103795823852, - -0.0103235509988, - -0.0102661020167, - -0.0102072470199, - -0.0101469977763, - -0.0100853662382, - -0.0100223645407, - -0.00995800499893, - -0.00989230010612, - -0.00982526253135, - -0.00975690511725, - -0.00968724087769, - -0.00961628299552, - -0.0095440448202, - -0.00947053986548, - -0.00939578180702, - -0.00931978448002, - -0.00924256187678, - -0.00916412814429, - -0.0090844975818, - -0.00900368463832, - -0.00892170391018, - -0.00883857013852, - -0.00875429820675, - -0.00866890313803, - -0.00858240009277, - -0.00849480436598, - -0.00840613138477, - -0.0083163967057, - -0.0082256160122, - -0.00813380511197, - -0.00804097993428, - -0.0079471565274, - -0.00785235105587, - -0.00775657979786, - -0.0076598591425, - -0.00756220558715, - -0.0074636357347, - -0.00736416629088, - -0.00726381406149, - -0.00716259594969, - -0.00706052895325, - -0.0069576301618, - -0.00685391675402, - -0.00674940599493, - -0.00664411523309, - -0.0065380618978, - -0.00643126349629, - -0.00632373761097, - -0.00621550189659, - -0.00610657407745, - -0.00599697194456, - -0.00588671335282, - -0.00577581621824, - -0.00566429851505, - -0.00555217827293, - -0.00543947357412, - -0.00532620255062, - -0.00521238338136, - -0.00509803428933, - -0.00498317353876, - -0.00486781943227, - -0.00475199030805, - -0.00463570453698, - -0.00451898051985, - -0.00440183668446, - -0.00428429148283, - -0.00416636338834, - -0.00404807089291, - -0.00392943250415, - -0.00381046674258, - -0.00369119213876, - -0.00357162723051, - -0.00345179056005, - -0.00333170067126, - -0.00321137610681, - -0.0030908354054, - -0.00297009709898, - -0.00284917970991, - -0.00272810174827, - -0.00260688170901, - -0.00248553806923, - -0.00236408928543, - -0.00224255379074, - -0.00212094999221, - -0.00199929626807, - -0.00187761096502, - -0.00175591239554, - -0.00163421883514, - -0.00151254851976, - -0.00139091964303, - -0.00126935035365, - -0.00114785875269, - -0.00102646289104, - -0.000905180766705, - -0.000784030322239, - -0.000663029442141, - -0.000542195950273, - -0.000421547607293, - -0.000301102108102, - -0.000180877079311, - -6.08900767178e-05, - 5.88414171986e-05, - 0.000178299995767, - 0.000297468330595, - 0.000416329174024, - 0.000534865361573, - 0.00065305981435, - 0.000770895541463, - 0.000888355642398, - 0.00100542330939, - 0.00112208182976, - 0.00123831458827, - 0.00135410506938, - 0.0014694368596, - 0.0015842936497, - 0.00169865923699, - 0.00181251752755, - 0.0019258525384, - 0.00203864839974, - 0.00215088935706, - 0.00226255977331, - 0.002373644131, - 0.00248412703434, - 0.00259399321123, - 0.00270322751539, - 0.00281181492837, - 0.0029197405615, - 0.00302698965794, - 0.00313354759459, - 0.00323939988403, - 0.00334453217646, - 0.00344893026151, - 0.00355258007017, - 0.00365546767658, - 0.00375757929985, - 0.00385890130582, - 0.00395942020884, - 0.00405912267349, - 0.00415799551627, - 0.00425602570729, - 0.0043532003719, - 0.00444950679233, - 0.00454493240926, - 0.00463946482341, - 0.00473309179709, - 0.00482580125564, - 0.00491758128902, - 0.00500842015315, - 0.00509830627145, - 0.00518722823615, - 0.0052751748097, - 0.00536213492609, - 0.0054480976922, - 0.00553305238904, - 0.00561698847302, - 0.00569989557721, - 0.00578176351245, - 0.0058625822686, - 0.00594234201565, - 0.00602103310479, - 0.00609864606954, - 0.00617517162676, - 0.0062506006777, - 0.00632492430894, - 0.00639813379337, - 0.00647022059115, - 0.00654117635052, - 0.00661099290878, - 0.00667966229299, - 0.00674717672091, - 0.00681352860166, - 0.00687871053653, - 0.00694271531966, - 0.00700553593874, - 0.00706716557566, - 0.00712759760708, - 0.0071868256051, - 0.00724484333775, - 0.00730164476954, - 0.00735722406195, - 0.00741157557392, - 0.00746469386224, - 0.00751657368196, - 0.0075672099868, - 0.00761659792945, - 0.00766473286189, - 0.00771161033565, - 0.0077572261021, - 0.00780157611264, - 0.00784465651886, - 0.00788646367274, - 0.00792699412674, - 0.00796624463391, - 0.00800421214794, - 0.0080408938232, - 0.00807628701473, - 0.00811038927822, - 0.00814319836995, - 0.00817471224667, - 0.00820492906553, - 0.00823384718388, - 0.0082614651591, - 0.00828778174843, - 0.00831279590865, - 0.00833650679586, - 0.0083589137652, - 0.00838001637044, - 0.00839981436369, - 0.00841830769499, - 0.00843549651185, - 0.00845138115887, - 0.00846596217721, - 0.0084792403041, - 0.0084912164723, - 0.00850189180954, - 0.00851126763792, - 0.00851934547329, - 0.00852612702461, - 0.00853161419326, - 0.00853580907234, - 0.00853871394591, - 0.00854033128829, - 0.00854066376321, - 0.00853971422301, - 0.00853748570783, - 0.0085339814447, - 0.00852920484665, - 0.00852315951181, - 0.00851584922244, - 0.00850727794395, - 0.00849744982393, - 0.00848636919107, - 0.00847404055418, - 0.00846046860104, - 0.00844565819734, - 0.00842961438554, - 0.00841234238373, - 0.00839384758443, - 0.00837413555341, - 0.00835321202845, - 0.00833108291811, - 0.00830775430045, - 0.00828323242172, - 0.00825752369508, - 0.00823063469922, - 0.00820257217701, - 0.00817334303414, - 0.00814295433767, - 0.00811141331465, - 0.00807872735061, - 0.00804490398816, - 0.00800995092544, - 0.00797387601463, - 0.00793668726044, - 0.00789839281851, - 0.00785900099389, - 0.00781852023938, - 0.007776959154, - 0.00773432648132, - 0.00769063110777, - 0.00764588206108, - 0.00760008850848, - 0.00755325975507, - 0.00750540524208, - 0.00745653454514, - 0.0074066573725, - 0.0073557835633, - 0.00730392308574, - 0.00725108603533, - 0.00719728263303, - 0.00714252322342, - 0.00708681827288, - 0.00703017836769, - 0.0069726142122, - 0.00691413662689, - 0.0068547565465, - 0.00679448501808, - 0.00673333319912, - 0.00667131235551, - 0.00660843385969, - 0.0065447091886, - 0.00648014992175, - 0.00641476773919, - 0.00634857441954, - 0.00628158183797, - 0.00621380196416, - 0.00614524686028, - 0.00607592867895, - 0.00600585966119, - 0.00593505213432, - 0.00586351850995, - 0.00579127128185, - 0.00571832302391, - 0.00564468638799, - 0.00557037410185, - 0.00549539896707, - 0.00541977385687, - 0.00534351171402, - 0.00526662554873, - 0.00518912843649, - 0.00511103351593, - 0.0050323539867, - 0.0049531031073, - 0.00487329419292, - 0.00479294061331, - 0.00471205579059, - 0.00463065319712, - 0.0045487463533, - 0.0044663488254, - 0.00438347422343, - 0.00430013619891, - 0.00421634844274, - 0.00413212468299, - 0.00404747868274, - 0.0039624242379, - 0.00387697517504, - 0.00379114534917, - 0.00370494864162, - 0.00361839895783, - 0.00353151022516, - 0.00344429639076, - 0.00335677141935, - 0.00326894929106, - 0.00318084399931, - 0.00309246954855, - 0.00300383995219, - 0.00291496923039, - 0.00282587140791, - 0.00273656051196, - 0.00264705057007, - 0.00255735560791, - 0.00246748964719, - 0.00237746670351, - 0.00228730078423, - 0.00219700588636, - 0.00210659599444, - 0.00201608507841, - 0.00192548709155, - 0.00183481596837, - 0.00174408562249, - 0.00165330994462, - 0.00156250280045, - 0.00147167802858, - 0.00138084943849, - 0.00129003080851, - 0.00119923588374, - 0.00110847837405, - 0.00101777195206, - 0.000927130251143, - 0.000836566863416, - 0.000746095337763, - 0.000655729177861, - 0.000565481840216, - 0.000475366732211, - 0.000385397210173, - 0.00029558657744, - 0.000205948082453, - 0.000116494916847, - 2.72402135687e-05, - -6.18029550015e-05, - -0.000150621578911, - -0.000239202712483, - -0.000327533476152, - -0.000415601058283, - -0.000503392716976, - -0.000590895781858, - -0.000678097655861, - -0.000764985816976, - -0.000851547820007, - -0.000937771298294, - -0.00102364396543, - -0.00110915361696, - -0.00119428813204, - -0.00127903547516, - -0.00136338369771, - -0.00144732093969, - -0.00153083543126, - -0.00161391549438, - -0.00169654954435, - -0.00177872609142, - -0.00186043374228, - -0.00194166120163, - -0.00202239727364, - -0.00210263086348, - -0.00218235097876, - -0.00226154673099, - -0.002340207337, - -0.00241832212038, - -0.00249588051282, - -0.00257287205554, - -0.00264928640059, - -0.00272511331222, - -0.00280034266816, - -0.00287496446092, - -0.0029489687991, - -0.00302234590857, - -0.00309508613373, - -0.00316717993875, - -0.00323861790871, - -0.00330939075077, - -0.00337948929535, - -0.00344890449721, - -0.00351762743658, - -0.00358564932022, - -0.00365296148248, - -0.00371955538635, - -0.00378542262447, - -0.00385055492008, - -0.00391494412805, - -0.0039785822358, - -0.00404146136418, - -0.00410357376846, - -0.00416491183913, - -0.00422546810279, - -0.00428523522298, - -0.00434420600097, - -0.00440237337657, - -0.0044597304289, - -0.00451627037709, - -0.00457198658104, - -0.00462687254208, - -0.00468092190366, - -0.004734128452, - -0.0047864861167, - -0.00483798897133, - -0.00488863123404, - -0.00493840726808, - -0.00498731158236, - -0.00503533883192, - -0.00508248381844, - -0.00512874149068, - -0.00517410694493, - -0.00521857542541, - -0.00526214232467, - -0.00530480318391, - -0.0053465536934, - -0.00538738969272, - -0.00542730717108, - -0.00546630226759, - -0.00550437127152, - -0.00554151062248, - -0.00557771691066, - -0.00561298687699, - -0.00564731741326, - -0.0056807055623, - -0.00571314851803, - -0.00574464362558, - -0.00577518838132, - -0.00580478043291, - -0.0058334175793, - -0.00586109777071, - -0.00588781910861, - -0.00591357984562, - -0.0059383783855, - -0.00596221328295, - -0.00598508324355, - -0.00600698712358, - -0.00602792392985, - -0.0060478928195, - -0.00606689309975, - -0.00608492422772, - -0.00610198581009, - -0.00611807760288, - -0.00613319951107, - -0.00614735158833, - -0.00616053403661, - -0.00617274720579, - -0.0061839915933, - -0.00619426784364, - -0.00620357674798, - -0.0062119192437, - -0.00621929641386, - -0.00622570948674, - -0.00623115983528, - -0.00623564897654, - -0.00623917857114, - -0.00624175042263, - -0.00624336647692, - -0.00624402882163, - -0.00624373968541, - -0.00624250143732, - -0.00624031658608, - -0.00623718777939, - -0.0062331178032, - -0.00622810958092, - -0.00622216617268, - -0.00621529077452, - -0.00620748671758, - -0.00619875746729, - -0.00618910662249, - -0.00617853791457, - -0.00616705520661, - -0.00615466249241, - -0.00614136389567, - -0.00612716366892, - -0.00611206619269, - -0.00609607597442, - -0.00607919764757, - -0.00606143597051, - -0.00604279582558, - -0.00602328221797, - -0.00600290027471, - -0.00598165524357, - -0.00595955249199, - -0.00593659750594, - -0.00591279588878, - -0.00588815336019, - -0.00586267575494, - -0.00583636902176, - -0.00580923922213, - -0.00578129252909, - -0.00575253522604, - -0.00572297370548, - -0.00569261446777, - -0.00566146411991, - -0.00562952937422, - -0.00559681704708, - -0.00556333405763, - -0.00552908742648, - -0.00549408427432, - -0.00545833182066, - -0.00542183738246, - -0.00538460837274, - -0.00534665229925, - -0.00530797676305, - -0.00526858945714, - -0.00522849816506, - -0.00518771075945, - -0.00514623520064, - -0.00510407953523, - -0.00506125189459, - -0.00501776049347, - -0.00497361362847, - -0.00492881967664, - -0.00488338709391, - -0.00483732441367, - -0.00479064024524, - -0.00474334327233, - -0.00469544225159, - -0.00464694601102, - -0.0045978634485, - -0.00454820353018, - -0.00449797528898, - -0.00444718782303, - -0.00439585029411, - -0.00434397192607, - -0.00429156200327, - -0.004238629869, - -0.00418518492391, - -0.00413123662438, - -0.00407679448099, - -0.00402186805685, - -0.00396646696606, - -0.00391060087208, - -0.0038542794861, - -0.00379751256547, - -0.00374030991203, - -0.00368268137055, - -0.00362463682704, - -0.00356618620719, - -0.00350733947468, - -0.0034481066296, - -0.00338849770681, - -0.00332852277427, - -0.00326819193145, - -0.00320751530767, - -0.00314650306046, - -0.00308516537395, - -0.00302351245721, - -0.0029615545426, - -0.00289930188419, - -0.00283676475604, - -0.00277395345064, - -0.00271087827725, - -0.00264754956023, - -0.00258397763747, - -0.00252017285871, - -0.00245614558396, - -0.00239190618181, - -0.00232746502788, - -0.00226283250313, - -0.0021980189923, - -0.00213303488227, - -0.00206789056044, - -0.00200259641313, - -0.00193716282401, - -0.00187160017245, - -0.00180591883195, - -0.00174012916856, - -0.00167424153927, - -0.00160826629046, - -0.00154221375632, - -0.00147609425724, - -0.00140991809833, - -0.00134369556777, - -0.00127743693532, - -0.00121115245079, - -0.00114485234243, - -0.00107854681549, - -0.00101224605061, - -0.000945960202385, - -0.000879699397808, - -0.000813473734782, - -0.000747293280638, - -0.00068116807064, - -0.000615108106521, - -0.000549123355009, - -0.000483223746377, - -0.000417419172991, - -0.000351719487875, - -0.000286134503279, - -0.000220673989264, - -0.000155347672292, - -9.0165233825e-05, - -2.51363089403e-05, - 3.972951505e-05, - 0.000104422699965, - 0.00016893375811, - 0.000233253253624, - 0.000297371803811, - 0.000361280080464, - 0.000424968811174, - 0.00048842878063, - 0.000551650831905, - 0.000614625867731, - 0.00067734485176, - 0.000739798809815, - 0.000801978831129, - 0.000863876069563, - 0.000925481744823, - 0.000986787143656, - 0.00104778362103, - 0.00110846260133, - 0.00116881557946, - 0.00122883412204, - 0.00128850986854, - 0.00134783453234, - 0.00140679990187, - 0.00146539784172, - 0.00152362029366, - 0.00158145927772, - 0.00163890689326, - 0.00169595531995, - 0.00175259681884, - 0.00180882373329, - 0.00186462849002, - 0.00192000360003, - 0.00197494165959, - 0.00202943535114, - 0.00208347744424, - 0.00213706079645, - 0.00219017835426, - 0.0022428231539, - 0.00229498832227, - 0.00234666707772, - 0.00239785273091, - 0.0024485386856, - 0.00249871843947, - 0.00254838558486, - 0.00259753380953, - 0.00264615689746, - 0.00269424872948, - 0.00274180328406, - 0.00278881463798, - 0.00283527696696, - 0.00288118454639, - 0.00292653175191, - 0.00297131306006, - 0.00301552304889, - 0.00305915639853, - 0.00310220789178, - 0.00314467241466, - 0.00318654495692, - 0.00322782061261, - 0.00326849458052, - 0.00330856216472, - 0.00334801877498, - 0.00338685992727, - 0.00342508124414, - 0.00346267845515, - 0.00349964739727, - 0.00353598401527, - 0.00357168436207, - 0.00360674459905, - 0.00364116099644, - 0.00367492993356, - 0.00370804789916, - 0.00374051149167, - 0.00377231741943, - 0.00380346250097, - 0.00383394366521, - 0.00386375795165, - 0.00389290251056, - 0.00392137460315, - 0.00394917160169, - 0.00397629098968, - 0.00400273036195, - 0.00402848742472, - 0.00405355999571, - 0.00407794600421, - 0.00410164349108, - 0.0041246506088, - 0.00414696562147, - 0.0041685869048, - 0.00418951294609, - 0.00420974234415, - 0.0042292738093, - 0.00424810616321, - 0.00426623833886, - 0.00428366938042, - 0.00430039844308, - 0.00431642479295, - 0.00433174780686, - 0.00434636697217, - 0.00436028188662, - 0.00437349225805, - 0.00438599790423, - 0.00439779875254, - 0.00440889483977, - 0.00441928631179, - 0.00442897342329, - 0.00443795653742, - 0.00444623612551, - 0.00445381276666, - 0.00446068714744, - 0.00446686006148, - 0.00447233240905, - 0.00447710519671, - 0.00448117953682, - 0.00448455664714, - 0.00448723785037, - 0.00448922457364, - 0.00449051834807, - 0.00449112080824, - 0.00449103369167, - 0.0044902588383, - 0.00448879818995, - 0.00448665378973, - 0.00448382778148, - 0.00448032240918, - 0.00447614001636, - 0.00447128304544, - 0.00446575403713, - 0.00445955562979, - 0.00445269055874, - 0.0044451616556, - 0.00443697184761, - 0.00442812415693, - 0.0044186216999, - 0.00440846768634, - 0.00439766541882, - 0.00438621829188, - 0.00437412979127, - 0.00436140349319, - 0.00434804306349, - 0.00433405225686, - 0.00431943491604, - 0.00430419497098, - 0.00428833643799, - 0.00427186341893, - 0.00425478010032, - 0.00423709075247, - 0.00421879972861, - 0.00419991146401, - 0.00418043047504, - 0.0041603613583, - 0.00413970878966, - 0.00411847752336, - 0.00409667239103, - 0.00407429830076, - 0.00405136023616, - 0.00402786325533, - 0.00400381248993, - 0.00397921314415, - 0.00395407049377, - 0.00392838988506, - 0.00390217673387, - 0.00387543652451, - 0.00384817480879, - 0.00382039720493, - 0.00379210939654, - 0.00376331713154, - 0.00373402622114, - 0.00370424253869, - 0.00367397201871, - 0.0036432206557, - 0.00361199450312, - 0.00358029967225, - 0.00354814233112, - 0.00351552870337, - 0.00348246506715, - 0.003448957754, - 0.00341501314771, - 0.00338063768321, - 0.00334583784538, - 0.00331062016798, - 0.00327499123244, - 0.00323895766676, - 0.0032025261443, - 0.00316570338266, - 0.0031284961425, - 0.00309091122638, - 0.00305295547755, - 0.00301463577883, - 0.00297595905141, - 0.00293693225365, - 0.00289756237991, - 0.00285785645937, - 0.00281782155483, - 0.00277746476151, - 0.00273679320588, - 0.00269581404443, - 0.00265453446252, - 0.00261296167313, - 0.00257110291569, - 0.00252896545488, - 0.00248655657941, - 0.00244388360082, - 0.00240095385231, - 0.00235777468746, - 0.00231435347912, - 0.00227069761815, - 0.00222681451221, - 0.00218271158459, - 0.00213839627298, - 0.00209387602828, - 0.00204915831341, - 0.0020042506021, - 0.00195916037766, - 0.00191389513185, - 0.00186846236363, - 0.00182286957799, - 0.00177712428475, - 0.00173123399738, - 0.00168520623182, - 0.00163904850525, - 0.001592768335, - 0.00154637323728, - 0.00149987072604, - 0.00145326831184, - 0.0014065735006, - 0.00135979379251, - 0.00131293668083, - 0.00126600965076, - 0.00121902017825, - 0.0011719757289, - 0.00112488375678, - 0.00107775170331, - 0.00103058699613, - 0.000983397047952, - 0.000936189255465, - 0.000888970998198, - 0.000841749637416, - 0.000794532515011, - 0.000747326952407, - 0.000700140249461, - 0.000652979683379, - 0.000605852507632, - 0.000558765950884, - 0.000511727215922, - 0.000464743478596, - 0.000417821886764, - 0.000370969559246, - 0.000324193584783, - 0.000277501021005, - 0.000230898893408, - 0.000184394194334, - 0.000137993881964, - 9.17048793164e-05, - 4.55340732537e-05, - -5.1168650228e-07, - -4.64255883466e-05, - -9.22008597593e-05, - -0.000137830768263, - -0.000183308622377, - -0.000228627772554, - -0.000273781612115, - -0.000318763578173, - -0.000363567152545, - -0.000408185862658, - -0.000452613282443, - -0.000496843033219, - -0.000540868784574, - -0.000584684255222, - -0.000628283213866, - -0.00067165948004, - -0.000714806924943, - -0.000757719472267, - -0.00080039109901, - -0.000842815836281, - -0.000884987770091, - -0.000926901042137, - -0.000968549850574, - -0.00100992845078, - -0.00105103115608, - -0.00109185233855, - -0.00113238642965, - -0.00117262792102, - -0.00121257136515, - -0.00125221137608, - -0.00129154263008, - -0.00133055986632, - -0.00136925788753, - -0.00140763156064, - -0.00144567581744, - -0.00148338565516, - -0.00152075613712, - -0.00155778239332, - -0.001594459621, - -0.00163078308527, - -0.00166674811962, - -0.00170235012647, - -0.00173758457776, - -0.00177244701544, - -0.00180693305196, - -0.00184103837082, - -0.00187475872703, - -0.00190808994759, - -0.00194102793194, - -0.00197356865246, - -0.00200570815484, - -0.00203744255853, - -0.00206876805719, - -0.00209968091902, - -0.00213017748723, - -0.00216025418032, - -0.00218990749252, - -0.00221913399408, - -0.00224793033167, - -0.00227629322861, - -0.00230421948527, - -0.00233170597932, - -0.00235874966601, - -0.00238534757846, - -0.00241149682789, - -0.00243719460389, - -0.00246243817465, - -0.00248722488716, - -0.00251155216743, - -0.00253541752065, - -0.00255881853142, - -0.00258175286388, - -0.00260421826188, - -0.00262621254909, - -0.00264773362916, - -0.00266877948584, - -0.00268934818302, - -0.00270943786489, - -0.00272904675597, - -0.0027481731612, - -0.00276681546595, - -0.00278497213611, - -0.00280264171806, - -0.00281982283871, - -0.00283651420549, - -0.00285271460634, - -0.00286842290968, - -0.00288363806436, - -0.00289835909961, - -0.002912585125, - -0.00292631533032, - -0.00293954898552, - -0.00295228544058, - -0.00296452412543, - -0.00297626454979, - -0.00298750630305, - -0.0029982490541, - -0.00300849255118, - -0.0030182366217, - -0.00302748117204, - -0.00303622618738, - -0.00304447173142, - -0.00305221794625, - -0.00305946505202, - -0.00306621334678, - -0.00307246320613, - -0.00307821508302, - -0.00308346950744, - -0.0030882270861, - -0.00309248850218, - -0.00309625451497, - -0.00309952595954, - -0.00310230374643, - -0.00310458886128, - -0.00310638236447, - -0.00310768539075, - -0.00310849914884, - -0.00310882492107, - -0.00310866406295, - -0.00310801800276, - -0.00310688824111, - -0.00310527635056, - -0.00310318397509, - -0.0031006128297, - -0.00309756469995, - -0.00309404144143, - -0.00309004497933, - -0.00308557730792, - -0.00308064049003, - -0.00307523665658, - -0.00306936800599, - -0.00306303680372, - -0.00305624538166, - -0.00304899613761, - -0.00304129153474, - -0.00303313410096, - -0.00302452642842, - -0.00301547117285, - -0.00300597105299, - -0.00299602885002, - -0.00298564740688, - -0.00297482962773, - -0.00296357847723, - -0.00295189698, - -0.00293978821988, - -0.00292725533936, - -0.00291430153887, - -0.00290093007613, - -0.00288714426548, - -0.00287294747717, - -0.00285834313673, - -0.00284333472421, - -0.00282792577351, - -0.00281211987167, - -0.00279592065815, - -0.00277933182411, - -0.00276235711169, - -0.00274500031325, - -0.00272726527065, - -0.00270915587451, - -0.00269067606345, - -0.00267182982331, - -0.00265262118644, - -0.00263305423086, - -0.00261313307957, - -0.00259286189969, - -0.00257224490174, - -0.00255128633882, - -0.00252999050582, - -0.00250836173863, - -0.00248640441333, - -0.00246412294539, - -0.00244152178886, - -0.00241860543557, - -0.00239537841428, - -0.00237184528987, - -0.00234801066255, - -0.00232387916697, - -0.00229945547146, - -0.00227474427712, - -0.00224975031705, - -0.00222447835546, - -0.00219893318685, - -0.00217311963518, - -0.00214704255299, - -0.00212070682055, - -0.00209411734506, - -0.00206727905972, - -0.00204019692294, - -0.00201287591744, - -0.00198532104941, - -0.00195753734763, - -0.00192952986266, - -0.0019013036659, - -0.0018728638488, - -0.00184421552195, - -0.00181536381421, - -0.00178631387189, - -0.00175707085785, - -0.00172763995061, - -0.00169802634356, - -0.001668235244, - -0.00163827187235, - -0.00160814146124, - -0.00157784925466, - -0.00154740050711, - -0.00151680048268, - -0.00148605445426, - -0.00145516770262, - -0.00142414551559, - -0.00139299318717, - -0.00136171601668, - -0.00133031930791, - -0.00129880836825, - -0.00126718850786, - -0.00123546503878, - -0.00120364327413, - -0.00117172852722, - -0.00113972611072, - -0.00110764133583, - -0.00107547951141, - -0.00104324594316, - -0.0010109459328, - -0.000978584777211, - -0.000946167767615, - -0.000913700188757, - -0.000881187318076, - -0.000848634424887, - -0.000816046769567, - -0.00078342960274, - -0.000750788164473, - -0.000718127683471, - -0.000685453376276, - -0.000652770446473, - -0.000620084083895, - -0.00058739946384, - -0.000554721746288, - -0.00052205607512, - -0.000489407577347, - -0.000456781362341, - -0.000424182521075, - -0.000391616125357, - -0.000359087227084, - -0.00032660085749, - -0.000294162026408, - -0.000261775721527, - -0.000229446907663, - -0.000197180526036, - -0.000164981493546, - -0.000132854702062, - -0.000100805017712, - -6.883728018e-05, - -3.69563020144e-05, - -5.16686793417e-06, - 2.65262658519e-05, - 5.81183723229e-05, - 8.96047543157e-05, - 0.000120980745188, - 0.000152241709477, - 0.000183383043545, - 0.000214400176227, - 0.000245288569466, - 0.000276043718938, - 0.000306661154679, - 0.000337136441697, - 0.000367465180579, - 0.000397643008091, - 0.000427665597772, - 0.000457528660516, - 0.000487227945152, - 0.000516759239012, - 0.000546118368493, - 0.000575301199611, - 0.000604303638548, - 0.000633121632187, - 0.000661751168648, - 0.000690188277802, - 0.000718429031791, - 0.000746469545533, - 0.000774305977215, - 0.000801934528788, - 0.000829351446441, - 0.000856553021082, - 0.00088353558879, - 0.000910295531282, - 0.000936829276352, - 0.00096313329831, - 0.000989204118415, - 0.00101503830529, - 0.00104063247534, - 0.00106598329314, - 0.00109108747186, - 0.00111594177362, - 0.00114054300987, - 0.00116488804178, - 0.00118897378056, - 0.00121279718786, - 0.00123635527605, - 0.00125964510861, - 0.00128266380042, - 0.00130540851805, - 0.00132787648013, - 0.00135006495757, - 0.00137197127391, - 0.00139359280555, - 0.00141492698203, - 0.00143597128631, - 0.00145672325497, - 0.00147718047849, - 0.00149734060148, - 0.00151720132286, - 0.00153676039613, - 0.0015560156295, - 0.00157496488615, - 0.00159360608437, - 0.00161193719775, - 0.00162995625534, - 0.00164766134181, - 0.00166505059758, - 0.00168212221897, - 0.00169887445834, - 0.00171530562415, - 0.00173141408115, - 0.0017471982504, - 0.00176265660942, - 0.00177778769224, - 0.00179259008946, - 0.00180706244834, - 0.00182120347283, - 0.00183501192364, - 0.00184848661822, - 0.00186162643085, - 0.0018744302926, - 0.00188689719137, - 0.00189902617188, - 0.00191081633565, - 0.00192226684097, - 0.00193337690288, - 0.00194414579316, - 0.00195457284022, - 0.00196465742909, - 0.00197439900134, - 0.00198379705498, - 0.00199285114443, - 0.00200156088038, - 0.00200992592969, - 0.00201794601532, - 0.00202562091616, - 0.00203295046693, - 0.00203993455804, - 0.00204657313545, - 0.0020528662005, - 0.00205881380975, - 0.00206441607483, - 0.00206967316223, - 0.00207458529315, - 0.00207915274327, - 0.00208337584255, - 0.00208725497506, - 0.00209079057868, - 0.00209398314497, - 0.00209683321885, - 0.0020993413984, - 0.00210150833459, - 0.00210333473103, - 0.00210482134371, - 0.00210596898069, - 0.00210677850188, - 0.00210725081867, - 0.0021073868937, - 0.00210718774053, - 0.0021066544233, - 0.00210578805647, - 0.00210458980443, - 0.00210306088122, - 0.00210120255015, - 0.00209901612346, - 0.00209650296199, - 0.00209366447479, - 0.00209050211876, - 0.00208701739828, - 0.00208321186481, - 0.00207908711654, - 0.00207464479796, - 0.00206988659946, - 0.00206481425696, - 0.00205942955143, - 0.00205373430855, - 0.00204773039824, - 0.0020414197342, - 0.00203480427354, - 0.0020278860163, - 0.00202066700499, - 0.00201314932417, - 0.00200533509996, - 0.00199722649959, - 0.00198882573092, - 0.00198013504198, - 0.00197115672049, - 0.00196189309333, - 0.00195234652613, - 0.00194251942269, - 0.00193241422455, - 0.00192203341043, - 0.00191137949576, - 0.00190045503214, - 0.00188926260685, - 0.00187780484231, - 0.00186608439553, - 0.00185410395763, - 0.00184186625328, - 0.00182937404014, - 0.00181663010836, - 0.00180363728, - 0.00179039840851, - 0.00177691637816, - 0.00176319410345, - 0.00174923452865, - 0.0017350406271, - 0.00172061540079, - 0.00170596187966, - 0.00169108312111, - 0.00167598220942, - 0.00166066225513, - 0.0016451263945, - 0.0016293777889, - 0.00161341962426, - 0.00159725511045, - 0.00158088748071, - 0.00156431999105, - 0.00154755591965, - 0.00153059856631, - 0.00151345125177, - 0.00149611731721, - 0.00147860012357, - 0.00146090305099, - 0.0014430294982, - 0.00142498288191, - 0.00140676663621, - 0.00138838421196, - 0.00136983907621, - 0.00135113471153, - 0.00133227461547, - 0.0013132622999, - 0.00129410129045, - 0.00127479512585, - 0.00125534735733, - 0.00123576154806, - 0.00121604127246, - 0.00119619011565, - 0.00117621167281, - 0.00115610954859, - 0.00113588735647, - 0.00111554871818, - 0.00109509726306, - 0.0010745366275, - 0.00105387045427, - 0.00103310239196, - 0.00101223609435, - 0.000991275219815, - 0.000970223430704, - 0.000949084392761, - 0.000927861774502, - 0.000906559246626, - 0.000885180481408, - 0.000863729152104, - 0.000842208932355, - 0.00082062349559, - 0.000798976514435, - 0.000777271660122, - 0.000755512601896, - 0.000733703006434, - 0.000711846537252, - 0.000689946854132, - 0.000668007612533, - 0.000646032463016, - 0.000624025050671, - 0.00060198901454, - 0.000579927987048, - 0.000557845593439, - 0.000535745451204, - 0.000513631169526, - 0.000491506348718, - 0.000469374579669, - 0.00044723944329, - 0.000425104509963, - 0.000402973339001, - 0.000380849478099, - 0.000358736462801, - 0.000336637815957, - 0.0003145570472, - 0.000292497652411, - 0.000270463113198, - 0.000248456896375, - 0.000226482453445, - 0.000204543220087, - 0.000182642615652, - 0.000160784042652, - 0.000138970886264, - 0.000117206513835, - 9.54942743894e-05, - 7.38374981409e-05, - 5.22394960127e-05, - 3.07035591579e-05, - 9.23295848698e-06, - -1.21690558004e-05, - -3.34992546802e-05, - -5.47544307612e-05, - -7.59313987406e-05, - -9.70269958525e-05, - -0.000118038082311, - -0.000138961541751, - -0.000159794281662, - -0.000180533233813, - -0.000201175354682, - -0.00022171762587, - -0.000242157054515, - -0.0002624906737, - -0.000282715542855, - -0.000302828748152, - -0.000322827402899, - -0.000342708647923, - -0.00036246965195, - -0.000382107611981, - -0.000401619753657, - -0.000421003331628, - -0.000440255629902, - -0.000459373962201, - -0.000478355672307, - -0.000497198134395, - -0.000515898753376, - -0.000534454965213, - -0.000552864237253, - -0.000571124068534, - -0.000589231990099, - -0.000607185565297, - -0.000624982390079, - -0.000642620093289, - -0.000660096336952, - -0.000677408816545, - -0.000694555261275, - -0.000711533434343, - -0.000728341133199, - -0.000744976189801, - -0.000761436470859, - -0.000777719878071, - -0.000793824348364, - -0.000809747854114, - -0.000825488403374, - -0.00084104404008, - -0.000856412844265, - -0.000871592932258, - -0.000886582456879, - -0.000901379607626, - -0.000915982610859, - -0.000930389729971, - -0.000944599265562, - -0.000958609555596, - -0.000972418975559, - -0.000986025938608, - -0.00099942889571, - -0.00101262633578, - -0.00102561678582, - -0.001038398811, - -0.00105097101485, - -0.00106333203929, - -0.00107548056478, - -0.00108741531039, - -0.00109913503392, - -0.00111063853196, - -0.00112192463995, - -0.0011329922323, - -0.00114384022241, - -0.00115446756274, - -0.00116487324486, - -0.00117505629949, - -0.00118501579654, - -0.00119475084516, - -0.00120426059371, - -0.00121354422984, - -0.00122260098046, - -0.00123143011176, - -0.00124003092921, - -0.00124840277755, - -0.00125654504074, - -0.00126445714202, - -0.0012721385438, - -0.00127958874766, - -0.00128680729433, - -0.00129379376362, - -0.00130054777434, - -0.00130706898432, - -0.00131335709025, - -0.00131941182769, - -0.00132523297094, - -0.00133082033299, - -0.00133617376539, - -0.00134129315821, - -0.00134617843989, - -0.00135082957716, - -0.00135524657491, - -0.00135942947607, - -0.00136337836152, - -0.00136709334992, - -0.00137057459756, - -0.00137382229828, - -0.00137683668327, - -0.00137961802092, - -0.00138216661668, - -0.00138448281289, - -0.0013865669886, - -0.0013884195594, - -0.00139004097724, - -0.00139143173024, - -0.00139259234248, - -0.00139352337386, - -0.00139422541981, - -0.00139469911118, - -0.00139494511392, - -0.00139496412898, - -0.00139475689197, - -0.00139432417302, - -0.00139366677649, - -0.00139278554079, - -0.00139168133805, - -0.00139035507397, - -0.00138880768749, - -0.00138704015059, - -0.00138505346798, - -0.00138284867686, - -0.00138042684665, - -0.00137778907871, - -0.00137493650605, - -0.00137187029306, - -0.00136859163521, - -0.00136510175878, - -0.00136140192053, - -0.00135749340742, - -0.00135337753631, - -0.00134905565362, - -0.00134452913508, - -0.00133979938532, - -0.00133486783765, - -0.00132973595365, - -0.00132440522291, - -0.00131887716265, - -0.00131315331741, - -0.0013072352587, - -0.00130112458469, - -0.0012948229198, - -0.00128833191441, - -0.0012816532445, - -0.00127478861126, - -0.00126773974078, - -0.00126050838365, - -0.00125309631462, - -0.00124550533222, - -0.00123773725842, - -0.00122979393819, - -0.00122167723922, - -0.00121338905147, - -0.0012049312868, - -0.00119630587863, - -0.00118751478152, - -0.00117855997077, - -0.00116944344207, - -0.0011601672111, - -0.00115073331312, - -0.00114114380257, - -0.00113140075269, - -0.00112150625513, - -0.00111146241954, - -0.00110127137313, - -0.00109093526033, - -0.00108045624236, - -0.00106983649678, - -0.00105907821716, - -0.0010481836126, - -0.00103715490736, - -0.00102599434043, - -0.00101470416512, - -0.00100328664864, - -0.000991744071719, - -0.000980078728128, - -0.000968292924308, - -0.000956388978937, - -0.000944369222514, - -0.000932235996935, - -0.000919991655076, - -0.000907638560374, - -0.000895179086402, - -0.000882615616449, - -0.000869950543098, - -0.000857186267807, - -0.000844325200481, - -0.000831369759055, - -0.000818322369069, - -0.000805185463248, - -0.000791961481076, - -0.000778652868378, - -0.000765262076897, - -0.000751791563874, - -0.000738243791624, - -0.000724621227117, - -0.000710926341562, - -0.000697161609982, - -0.000683329510798, - -0.000669432525411, - -0.000655473137787, - -0.000641453834036, - -0.000627377102003, - -0.000613245430849, - -0.000599061310639, - -0.000584827231931, - -0.000570545685365, - -0.000556219161253, - -0.000541850149173, - -0.000527441137557, - -0.000512994613291, - -0.00049851306131, - -0.000483998964194, - -0.000469454801768, - -0.000454883050705, - -0.000440286184127, - -0.000425666671209, - -0.00041102697679, - -0.000396369560975, - -0.00038169687875, - -0.000367011379596, - -0.000352315507099, - -0.000337611698569, - -0.000322902384662, - -0.000308189988997, - -0.000293476927781, - -0.000278765609439, - -0.000264058434236, - -0.000249357793915, - -0.000234666071326, - -0.000219985640063, - -0.000205318864105, - -0.000190668097457, - -0.000176035683793, - -0.000161423956104, - -0.000146835236351, - -0.000132271835113, - -0.000117736051247, - -0.000103230171546, - -8.87564704011e-05, - -7.43172094659e-05, - -5.99146373264e-05, - -4.55509891719e-05, - -3.12284864696e-05, - -1.69493366433e-05, - -2.71573275512e-06, - 1.14701468112e-05, - 2.56061386603e-05, - 3.9690094694e-05, - 5.37198824161e-05, - 6.76933852337e-05, - 8.16085027552e-05, - 9.54631510833e-05, - 0.000109255263107, - 0.000122982788785, - 0.000136643695435, - 0.000150235968004, - 0.000163757609352, - 0.00017720664052, - 0.000190581100996, - 0.000203879048981, - 0.000217098561651, - 0.000230237735407, - 0.000243294686134, - 0.000256267549441, - 0.000269154480914, - 0.000281953656348, - 0.000294663271987, - 0.000307281544752, - 0.000319806712475, - 0.000332237034114, - 0.000344570789978, - 0.000356806281939, - 0.000368941833644, - 0.00038097579072, - 0.000392906520978, - 0.000404732414607, - 0.000416451884371, - 0.000428063365798, - 0.000439565317361, - 0.000450956220661, - 0.000462234580605, - 0.000473398925571, - 0.000484447807581, - 0.000495379802462, - 0.000506193510001, - 0.000516887554104, - 0.000527460582941, - 0.00053791126909, - 0.000548238309683, - 0.000558440426534, - 0.000568516366277, - 0.000578464900485, - 0.0005882848258, - 0.000597974964047, - 0.000607534162344, - 0.000616961293216, - 0.000626255254693, - 0.000635414970416, - 0.000644439389726, - 0.000653327487755, - 0.000662078265515, - 0.000670690749975, - 0.000679163994142, - 0.000687497077127, - 0.000695689104216, - 0.000703739206935, - 0.000711646543101, - 0.000719410296885, - 0.000727029678852, - 0.000734503926012, - 0.000741832301859, - 0.000749014096404, - 0.000756048626207, - 0.000762935234404, - 0.000769673290732, - 0.00077626219154, - 0.000782701359808, - 0.000788990245151, - 0.000795128323828, - 0.000801115098738, - 0.000806950099416, - 0.000812632882025, - 0.000818163029342, - 0.000823540150738, - 0.00082876388216, - 0.000833833886101, - 0.000838749851571, - 0.000843511494059, - 0.000848118555498, - 0.000852570804216, - 0.000856868034893, - 0.000861010068504, - 0.000864996752268, - 0.00086882795958, - 0.000872503589955, - 0.000876023568952, - 0.000879387848104, - 0.00088259640484, - 0.000885649242404, - 0.000888546389773, - 0.00089128790156, - 0.000893873857928, - 0.000896304364493, - 0.000898579552216, - 0.000900699577304, - 0.000902664621102, - 0.000904474889974, - 0.000906130615194, - 0.00090763205282, - 0.000908979483574, - 0.000910173212712, - 0.000911213569893, - 0.000912100909044, - 0.000912835608224, - 0.000913418069478, - 0.000913848718693, - 0.000914128005449, - 0.000914256402867, - 0.000914234407451, - 0.00091406253893, - 0.000913741340096, - 0.000913271376634, - 0.000912653236959, - 0.000911887532036, - 0.00091097489521, - 0.000909915982024, - 0.000908711470038, - 0.000907362058645, - 0.000905868468877, - 0.000904231443223, - 0.000902451745426, - 0.000900530160292, - 0.000898467493487, - 0.000896264571334, - 0.00089392224061, - 0.000891441368334, - 0.00088882284156, - 0.000886067567159, - 0.000883176471607, - 0.000880150500763, - 0.000876990619648, - 0.000873697812223, - 0.00087027308116, - 0.000866717447616, - 0.000863031950999, - 0.000859217648739, - 0.000855275616047, - 0.000851206945681, - 0.000847012747706, - 0.000842694149249, - 0.000838252294257, - 0.000833688343253, - 0.000829003473083, - 0.000824198876669, - 0.000819275762758, - 0.000814235355666, - 0.000809078895024, - 0.000803807635518, - 0.000798422846636, - 0.000792925812401, - 0.000787317831114, - 0.000781600215085, - 0.000775774290375, - 0.000769841396521, - 0.000763802886277, - 0.000757660125337, - 0.00075141449207, - 0.000745067377243, - 0.000738620183755, - 0.000732074326355, - 0.000725431231373, - 0.000718692336441, - 0.000711859090216, - 0.000704932952102, - 0.000697915391971, - 0.000690807889883, - 0.000683611935807, - 0.000676329029337, - 0.00066896067941, - 0.000661508404025, - 0.00065397372996, - 0.000646358192484, - 0.00063866333508, - 0.000630890709153, - 0.000623041873747, - 0.000615118395261, - 0.000607121847164, - 0.000599053809705, - 0.00059091586963, - 0.000582709619892, - 0.00057443665937, - 0.000566098592578, - 0.000557697029379, - 0.000549233584701, - 0.000540709878247, - 0.000532127534209, - 0.000523488180987, - 0.000514793450897, - 0.000506044979887, - 0.000497244407253, - 0.000488393375355, - 0.000479493529329, - 0.000470546516805, - 0.000461553987625, - 0.000452517593557, - 0.000443438988015, - 0.000434319825776, - 0.000425161762699, - 0.000415966455446, - 0.000406735561202, - 0.000397470737394, - 0.000388173641419, - 0.00037884593036, - 0.000369489260716, - 0.000360105288123, - 0.000350695667083, - 0.000341262050691, - 0.00033180609036, - 0.000322329435555, - 0.000312833733523, - 0.000303320629022, - 0.000293791764058, - 0.000284248777617, - 0.000274693305402, - 0.000265126979573, - 0.000255551428481, - 0.000245968276412, - 0.00023637914333, - 0.000226785644616, - 0.000217189390816, - 0.000207591987391, - 0.00019799503446, - 0.000188400126551, - 0.000178808852357, - 0.000169222794488, - 0.000159643529224, - 0.000150072626276, - 0.000140511648543, - 0.000130962151875, - 0.000121425684837, - 0.000111903788471, - 0.000102397996067, - 9.29098329314e-05, - 8.34408161564e-05, - 7.3992454397e-05, - 6.45662476449e-05, - 5.51636870073e-05, - 4.57862544868e-05, - 3.64354227641e-05, - 2.71126549829e-05, - 1.7819404537e-05, - 8.55711486014e-06, - -6.72780782418e-07, - -9.86885950005e-06, - -1.90297089793e-05, - -2.8153927685e-05, - -3.72401250583e-05, - -4.62869217137e-05, - -5.52929496311e-05, - -6.42568523468e-05, - -7.31772851421e-05, - -8.2052915229e-05, - -9.08824219326e-05, - -9.96644968714e-05, - -0.000108397844136, - -0.000117081180463, - -0.000125713235407, - -0.000134292751512, - -0.000142818484477, - -0.000151289203317, - -0.00015970369053, - -0.000168060742252, - -0.000176359168413, - -0.00018459779289, - -0.000192775453657, - -0.000200891002931, - -0.000208943307317, - -0.00021693124795, - -0.000224853720632, - -0.000232709635969, - -0.000240497919501, - -0.000248217511833, - -0.000255867368761, - -0.000263446461397, - -0.000270953776288, - -0.000278388315534, - -0.000285749096901, - -0.000293035153937, - -0.000300245536075, - -0.00030737930874, - -0.000314435553456, - -0.000321413367938, - -0.000328311866194, - -0.000335130178614, - -0.000341867452065, - -0.000348522849973, - -0.000355095552409, - -0.000361584756172, - -0.000367989674863, - -0.000374309538962, - -0.000380543595901, - -0.000386691110126, - -0.000392751363173, - -0.000398723653719, - -0.000404607297649, - -0.00041040162811, - -0.000416105995562, - -0.000421719767831, - -0.000427242330154, - -0.000432673085221, - -0.000438011453219, - -0.00044325687187, - -0.00044840879646, - -0.000453466699875, - -0.00045843007263, - -0.000463298422891, - -0.000468071276497, - -0.000472748176982, - -0.00047732868559, - -0.000481812381287, - -0.000486198860771, - -0.000490487738481, - -0.000494678646598, - -0.000498771235046, - -0.000502765171494, - -0.000506660141347, - -0.000510455847737, - -0.000514152011516, - -0.00051774837124, - -0.00052124468315, - -0.000524640721155, - -0.000527936276809, - -0.000531131159284, - -0.000534225195341, - -0.000537218229301, - -0.000540110123008, - -0.000542900755794, - -0.000545590024436, - -0.000548177843117, - -0.000550664143377, - -0.000553048874068, - -0.000555332001298, - -0.000557513508382, - -0.000559593395784, - -0.000561571681055, - -0.000563448398772, - -0.000565223600479, - -0.000566897354608, - -0.000568469746422, - -0.000569940877933, - -0.00057131086783, - -0.000572579851402, - -0.000573747980457, - -0.000574815423239, - -0.000575782364341, - -0.000576649004621, - -0.000577415561109, - -0.000578082266915, - -0.000578649371134, - -0.000579117138747, - -0.000579485850525, - -0.00057975580292, - -0.00057992730797, - -0.000580000693182, - -0.000579976301432, - -0.000579854490847, - -0.000579635634695, - -0.000579320121268, - -0.000578908353766, - -0.000578400750173, - -0.000577797743141, - -0.00057709977986, - -0.000576307321935, - -0.000575420845258, - -0.000574440839876, - -0.000573367809861, - -0.000572202273174, - -0.00057094476153, - -0.00056959582026, - -0.000568156008172, - -0.000566625897409, - -0.000565006073305, - -0.000563297134242, - -0.000561499691501, - -0.000559614369115, - -0.000557641803719, - -0.000555582644397, - -0.000553437552531, - -0.000551207201643, - -0.000548892277243, - -0.000546493476666, - -0.000544011508917, - -0.000541447094507, - -0.000538800965293, - -0.000536073864315, - -0.000533266545627, - -0.000530379774136, - -0.000527414325431, - -0.000524370985616, - -0.00052125055114, - -0.000518053828623, - -0.000514781634689, - -0.000511434795788, - -0.000508014148024, - -0.000504520536979, - -0.000500954817537, - -0.000497317853705, - -0.000493610518435, - -0.000489833693447, - -0.000485988269046, - -0.000482075143942, - -0.000478095225069, - -0.000474049427401, - -0.000469938673769, - -0.000465763894677, - -0.000461526028119, - -0.000457226019391, - -0.000452864820906, - -0.000448443392008, - -0.000443962698785, - -0.000439423713879, - -0.000434827416302, - -0.000430174791245, - -0.000425466829888, - -0.000420704529214, - -0.000415888891817, - -0.000411020925712, - -0.000406101644146, - -0.000401132065408, - -0.000396113212637, - -0.000391046113631, - -0.000385931800657, - -0.00038077131026, - -0.000375565683073, - -0.000370315963621, - -0.000365023200138, - -0.000359688444369, - -0.00035431275138, - -0.000348897179371, - -0.00034344278948, - -0.000337950645597, - -0.00033242181417, - -0.000326857364016, - -0.000321258366133, - -0.000315625893506, - -0.000309961020921, - -0.000304264824775, - -0.000298538382886, - -0.000292782774309, - -0.000286999079142, - -0.000281188378344, - -0.000275351753543, - -0.000269490286856, - -0.000263605060698, - -0.000257697157599, - -0.000251767660019, - -0.000245817650165, - -0.000239848209807, - -0.000233860420093, - -0.000227855361374, - -0.000221834113015, - -0.000215797753221, - -0.000209747358853, - -0.000203684005254, - -0.000197608766067, - -0.000191522713062, - -0.000185426915957, - -0.000179322442244, - -0.000173210357019, - -0.000167091722802, - -0.00016096759937, - -0.000154839043587, - -0.000148707109232, - -0.000142572846829, - -0.000136437303484, - -0.000130301522717, - -0.000124166544293, - -0.000118033404064, - -0.000111903133805, - -0.00010577676105, - -9.96553089327e-05, - -9.35397960311e-05, - -8.74312362065e-05, - -8.13306384484e-05, - -7.52390067207e-05, - -6.91573398073e-05, - -6.30866311606e-05, - -5.70278687522e-05, - -5.09820349219e-05, - -4.49501062325e-05, - -3.89330533213e-05, - -3.29318407579e-05, - -2.69474269003e-05, - -2.09807637537e-05, - -1.50327968305e-05, - -9.10446501279e-06, - -3.19670041504e-06, - 2.68957175054e-06, - 8.55343330697e-06, - 1.43939732441e-05, - 2.02102878492e-05, - 2.6001480834e-05, - 3.17666634625e-05, - 3.75049546746e-05, - 4.32154812096e-05, - 4.88973777275e-05, - 5.45497869281e-05, - 6.01718596689e-05, - 6.5762755081e-05, - 7.13216406827e-05, - 7.68476924924e-05, - 8.2340095138e-05, - 8.77980419663e-05, - 9.32207351494e-05, - 9.86073857882e-05, - 0.000103957214017, - 0.000109269449104, - 0.000114543329549, - 0.000119778103181, - 0.000124973027255, - 0.000130127368543, - 0.000135240403427, - 0.000140311417985, - 0.000145339708084, - 0.000150324579458, - 0.000155265347798, - 0.000160161338829, - 0.000165011888391, - 0.000169816342517, - 0.000174574057505, - 0.000179284399995, - 0.000183946747039, - 0.000188560486168, - 0.000193125015462, - 0.000197639743613, - 0.000202104089992, - 0.000206517484702, - 0.000210879368646, - 0.000215189193577, - 0.000219446422157, - 0.000223650528008, - 0.00022780099576, - 0.000231897321108, - 0.000235939010846, - 0.000239925582924, - 0.000243856566481, - 0.000247731501891, - 0.000251549940797, - 0.000255311446152, - 0.000259015592248, - 0.000262661964751, - 0.000266250160731, - 0.000269779788689, - 0.000273250468581, - 0.000276661831846, - 0.000280013521424, - 0.000283305191778, - 0.00028653650891, - 0.000289707150377, - 0.000292816805305, - 0.0002958651744, - 0.000298851969956, - 0.000301776915866, - 0.000304639747625, - 0.000307440212333, - 0.000310178068695, - 0.000312853087027, - 0.000315465049244, - 0.000318013748863, - 0.000320498990991, - 0.000322920592322, - 0.00032527838112, - 0.000327572197212, - 0.000329801891971, - 0.000331967328298, - 0.000334068380608, - 0.000336104934807, - 0.000338076888269, - 0.000339984149814, - 0.000341826639681, - 0.000343604289502, - 0.000345317042267, - 0.000346964852301, - 0.000348547685224, - 0.000350065517915, - 0.000351518338483, - 0.00035290614622, - 0.000354228951562, - 0.00035548677605, - 0.000356679652285, - 0.000357807623879, - 0.00035887074541, - 0.000359869082371, - 0.000360802711121, - 0.000361671718833, - 0.000362476203434, - 0.000363216273556, - 0.000363892048474, - 0.000364503658046, - 0.000365051242657, - 0.000365534953151, - 0.000365954950768, - 0.000366311407083, - 0.000366604503931, - 0.000366834433345, - 0.00036700139748, - 0.000367105608548, - 0.000367147288739, - 0.000367126670146, - 0.000367043994693, - 0.000366899514057, - 0.000366693489583, - 0.000366426192212, - 0.000366097902392, - 0.000365708909999, - 0.000365259514251, - 0.000364750023625, - 0.000364180755765, - 0.000363552037397, - 0.000362864204239, - 0.00036211760091, - 0.000361312580837, - 0.000360449506163, - 0.000359528747652, - 0.000358550684595, - 0.00035751570471, - 0.000356424204047, - 0.000355276586889, - 0.000354073265649, - 0.000352814660774, - 0.000351501200639, - 0.000350133321444, - 0.000348711467114, - 0.000347236089187, - 0.000345707646718, - 0.00034412660616, - 0.000342493441268, - 0.000340808632982, - 0.000339072669322, - 0.000337286045274, - 0.000335449262684, - 0.000333562830142, - 0.000331627262871, - 0.000329643082611, - 0.000327610817509, - 0.000325531002003, - 0.000323404176703, - 0.00032123088828, - 0.000319011689344, - 0.000316747138332, - 0.000314437799386, - 0.000312084242236, - 0.00030968704208, - 0.000307246779465, - 0.000304764040169, - 0.000302239415074, - 0.000299673500054, - 0.000297066895846, - 0.000294420207932, - 0.000291734046415, - 0.000289009025897, - 0.000286245765356, - 0.000283444888025, - 0.000280607021264, - 0.000277732796439, - 0.000274822848797, - 0.000271877817343, - 0.000268898344713, - 0.000265885077054, - 0.000262838663893, - 0.000259759758016, - 0.000256649015342, - 0.000253507094797, - 0.000250334658193, - 0.000247132370094, - 0.000243900897699, - 0.000240640910714, - 0.000237353081225, - 0.000234038083573, - 0.000230696594233, - 0.000227329291683, - 0.000223936856282, - 0.000220519970145, - 0.000217079317019, - 0.000213615582156, - 0.00021012945219, - 0.000206621615014, - 0.000203092759654, - 0.000199543576146, - 0.000195974755414, - 0.000192386989145, - 0.000188780969666, - 0.000185157389824, - 0.000181516942861, - 0.000177860322293, - 0.000174188221791, - 0.000170501335057, - 0.000166800355704, - 0.00016308597714, - 0.00015935889244, - 0.000155619794236, - 0.000151869374593, - 0.000148108324893, - 0.000144337335715, - 0.000140557096721, - 0.000136768296541, - 0.00013297162265, - 0.000129167761263, - 0.00012535739721, - 0.000121541213833, - 0.000117719892863, - 0.000113894114313, - 0.000110064556365, - 0.000106231895261, - 0.000102396805189, - 9.85599581742e-05, - 9.47220239738e-05, - 9.08836699653e-05, - 8.70455610408e-05, - 8.32083595008e-05, - 7.93727249482e-05, - 7.55393141839e-05, - 7.17087811037e-05, - 6.78817765943e-05, - 6.40589484322e-05, - 6.02409411821e-05, - 5.64283960973e-05, - 5.26219510201e-05, - 4.88222402837e-05, - 4.50298946152e-05, - 4.12455410392e-05, - 3.74698027823e-05, - 3.37032991792e-05, - 2.99466455791e-05, - 2.62004532543e-05, - 2.24653293078e-05, - 1.87418765842e-05, - 1.50306935809e-05, - 1.13323743589e-05, - 7.6475084575e-06, - 3.97668080754e-06, - 3.20471647219e-07, - -3.32054356145e-06, - -6.94579421467e-06, - -1.05547146489e-05, - -1.41467442196e-05, - -1.77213273811e-05, - -2.12779137638e-05, - -2.48159582505e-05, - -2.83349210526e-05, - -3.18342677823e-05, - -3.53134695275e-05, - -3.87720029225e-05, - -4.22093502181e-05, - -4.56249993508e-05, - -4.90184440116e-05, - -5.23891837116e-05, - -5.57367238476e-05, - -5.90605757664e-05, - -6.23602568284e-05, - -6.56352904671e-05, - -6.88852062514e-05, - -7.21095399436e-05, - -7.53078335576e-05, - -7.84796354136e-05, - -8.16245001958e-05, - -8.47419890042e-05, - -8.78316694075e-05, - -9.08931154942e-05, - -9.39259079227e-05, - -9.6929633969e-05, - -9.99038875742e-05, - -0.000102848269391, - -0.000105762386825, - -0.000108645854083, - -0.000111498292211, - -0.000114319329133, - -0.000117108599694, - -0.000119865745697, - -0.000122590415936, - -0.000125282266234, - -0.000127940959476, - -0.00013056616564, - -0.000133157561829, - -0.0001357148323, - -0.000138237668492, - -0.000140725769054, - -0.000143178839868, - -0.000145596594075, - -0.000147978752097, - -0.000150325041656, - -0.0001526351978, - -0.000154908962915, - -0.000157146086746, - -0.000159346326411, - -0.000161509446417, - -0.000163635218672, - -0.000165723422498, - -0.000167773844639, - -0.000169786279272, - -0.000171760528018, - -0.000173696399939, - -0.000175593711555, - -0.000177452286839, - -0.000179271957221, - -0.000181052561593, - -0.000182793946305, - -0.000184495965165, - -0.000186158479437, - -0.000187781357834, - -0.000189364476516, - -0.000190907719081, - -0.000192410976557, - -0.000193874147396, - -0.000195297137459, - -0.000196679860008, - -0.000198022235689, - -0.000199324192522, - -0.000200585665883, - -0.000201806598486, - -0.00020298694037, - -0.000204126648873, - -0.000205225688618, - -0.000206284031486, - -0.000207301656598, - -0.000208278550285, - -0.00020921470607, - -0.000210110124636, - -0.000210964813802, - -0.000211778788489, - -0.000212552070699, - -0.000213284689476, - -0.000213976680876, - -0.000214628087937, - -0.000215238960641, - -0.00021580935588, - -0.00021633933742, - -0.000216828975861, - -0.000217278348603, - -0.0002176875398, - -0.000218056640326, - -0.000218385747728, - -0.000218674966185, - -0.000218924406467, - -0.000219134185884, - -0.000219304428246, - -0.000219435263814, - -0.00021952682925, - -0.000219579267574, - -0.000219592728109, - -0.000219567366432, - -0.000219503344325, - -0.000219400829719, - -0.000219259996642, - -0.000219081025167, - -0.000218864101355, - -0.000218609417197, - -0.000218317170564, - -0.000217987565141, - -0.000217620810375, - -0.000217217121415, - -0.000216776719048, - -0.000216299829644, - -0.00021578668509, - -0.00021523752273, - -0.000214652585303, - -0.000214032120876, - -0.000213376382784, - -0.000212685629562, - -0.000211960124878, - -0.000211200137472, - -0.000210405941083, - -0.000209577814387, - -0.000208716040923, - -0.000207820909028, - -0.000206892711767, - -0.000205931746863, - -0.000204938316623, - -0.000203912727874, - -0.000202855291884, - -0.000201766324295, - -0.000200646145046, - -0.000199495078304, - -0.000198313452389, - -0.000197101599696, - -0.000195859856629, - -0.000194588563516, - -0.000193288064541, - -0.000191958707666, - -0.000190600844553, - -0.000189214830491, - -0.000187801024315, - -0.000186359788332, - -0.000184891488243, - -0.000183396493063, - -0.000181875175046, - -0.000180327909604, - -0.000178755075229, - -0.000177157053415, - -0.000175534228578, - -0.000173886987977, - -0.000172215721632, - -0.00017052082225, - -0.000168802685138, - -0.000167061708129, - -0.000165298291496, - -0.000163512837878, - -0.000161705752193, - -0.000159877441563, - -0.000158028315229, - -0.000156158784472, - -0.000154269262534, - -0.000152360164534, - -0.000150431907388, - -0.000148484909728, - -0.000146519591825, - -0.000144536375501, - -0.000142535684053, - -0.000140517942171, - -0.000138483575859, - -0.00013643301235, - -0.000134366680029, - -0.000132285008353, - -0.000130188427766, - -0.000128077369625, - -0.000125952266115, - -0.000123813550172, - -0.000121661655401, - -0.000119497015997, - -0.000117320066668, - -0.000115131242552, - -0.000112930979141, - -0.000110719712201, - -0.000108497877693, - -0.000106265911697, - -0.000104024250331, - -0.000101773329675, - -9.95135856952e-05, - -9.72454541639e-05, - -9.49693705847e-05, - -9.26857701153e-05, - -9.03950874922e-05, - -8.80977569551e-05, - -8.57942121704e-05, - -8.34848861582e-05, - -8.11702112158e-05, - -7.88506188454e-05, - -7.65265396796e-05, - -7.41984034076e-05, - -7.18666387045e-05, - -6.95316731563e-05, - -6.719393319e-05, - -6.4853844002e-05, - -6.25118294866e-05, - -6.01683121657e-05, - -5.78237131195e-05, - -5.54784519171e-05, - -5.31329465472e-05, - -5.07876133502e-05, - -4.84428669509e-05, - -4.60991201909e-05, - -4.37567840621e-05, - -4.14162676403e-05, - -3.90779780211e-05, - -3.67423202539e-05, - -3.44096972784e-05, - -3.2080509861e-05, - -2.9755156532e-05, - -2.74340335229e-05, - -2.5117534705e-05, - -2.28060515288e-05, - -2.04999729634e-05, - -1.81996854367e-05, - -1.59055727771e-05, - -1.36180161547e-05, - -1.13373940243e-05, - -9.06408206736e-06, - -6.79845313778e-06, - -4.54087720514e-06, - -2.29172130051e-06, - -5.13494620158e-08, - 2.17987731754e-06, - 4.40160114357e-06, - 6.61346727127e-06, - 8.81512415651e-06, - 1.10062235066e-05, - 1.31864203285e-05, - 1.53553729785e-05, - 1.75127432089e-05, - 1.96581962165e-05, - 2.17914006874e-05, - 2.39120288431e-05, - 2.60197564854e-05, - 2.81142630394e-05, - 3.01952315971e-05, - 3.22623489589e-05, - 3.43153056761e-05, - 3.63537960901e-05, - 3.83775183728e-05, - 4.03861745651e-05, - 4.23794706153e-05, - 4.43571164156e-05, - 4.63188258388e-05, - 4.8264316774e-05, - 5.01933111601e-05, - 5.21055350209e-05, - 5.40007184967e-05, - 5.58785958772e-05, - 5.77389056322e-05, - 5.95813904418e-05, - 6.14057972259e-05, - 6.32118771725e-05, - 6.49993857655e-05, - 6.67680828118e-05, - 6.85177324661e-05, - 7.02481032568e-05, - 7.19589681103e-05, - 7.3650104373e-05, - 7.53212938347e-05, - 7.69723227498e-05, - 7.86029818577e-05, - 8.02130664025e-05, - 8.18023761517e-05, - 8.33707154146e-05, - 8.49178930588e-05, - 8.64437225261e-05, - 8.79480218484e-05, - 8.94306136621e-05, - 9.08913252208e-05, - 9.23299884082e-05, - 9.37464397508e-05, - 9.51405204267e-05, - 9.65120762776e-05, - 9.78609578167e-05, - 9.91870202373e-05, - 0.00010049012342, - 0.000101770131938, - 0.000103026915067, - 0.000104260346783, - 0.000105470305773, - 0.000106656675432, - 0.00010781934387, - 0.00010895820391, - 0.000110073153092, - 0.000111164093668, - 0.000112230932602, - 0.000113273581572, - 0.000114291956962, - 0.000115285979859, - 0.000116255576052, - 0.000117200676021, - 0.000118121214936, - 0.000119017132645, - 0.000119888373671, - 0.000120734887199, - 0.00012155662707, - 0.000122353551765, - 0.000123125624403, - 0.00012387281272, - 0.00012459508906, - 0.000125292430364, - 0.00012596481815, - 0.000126612238503, - 0.000127234682056, - 0.000127832143977, - 0.000128404623946, - 0.000128952126143, - 0.000129474659224, - 0.000129972236305, - 0.00013044487494, - 0.0001308925971, - 0.000131315429153, - 0.000131713401838, - 0.000132086550247, - 0.000132434913794, - 0.000132758536198, - 0.000133057465453, - 0.000133331753804, - 0.000133581457718, - 0.000133806637861, - 0.000134007359067, - 0.000134183690308, - 0.00013433570467, - 0.000134463479318, - 0.00013456709547, - 0.000134646638361, - 0.000134702197216, - 0.000134733865215, - 0.00013474173946, - 0.000134725920945, - 0.000134686514516, - 0.000134623628844, - 0.000134537376382, - 0.000134427873336, - 0.000134295239624, - 0.000134139598843, - 0.000133961078228, - 0.000133759808617, - 0.000133535924411, - 0.000133289563539, - 0.000133020867412, - 0.00013272998089, - 0.000132417052235, - 0.000132082233079, - 0.000131725678375, - 0.000131347546358, - 0.000130947998505, - 0.000130527199491, - 0.000130085317144, - 0.000129622522407, - 0.000129138989288, - 0.000128634894822, - 0.000128110419021, - 0.000127565744835, - 0.000127001058101, - 0.000126416547503, - 0.000125812404522, - 0.00012518882339, - 0.000124546001049, - 0.000123884137095, - 0.000123203433741, - 0.000122504095762, - 0.000121786330449, - 0.000121050347565, - 0.000120296359292, - 0.000119524580186, - 0.000118735227124, - 0.000117928519261, - 0.000117104677976, - 0.000116263926824, - 0.00011540649149, - 0.000114532599733, - 0.000113642481339, - 0.000112736368074, - 0.000111814493629, - 0.000110877093571, - 0.000109924405294, - 0.000108956667967, - 0.000107974122484, - 0.000106977011411, - 0.000105965578938, - 0.000104940070826, - 0.000103900734356, - 0.000102847818276, - 0.000101781572756, - 0.000100702249328, - 9.96101008408e-05, - 9.85053814058e-05, - 9.7388346346e-05, - 9.6259252145e-05, - 9.51183563944e-05, - 9.39659177435e-05, - 9.28021958467e-05, - 9.16274513127e-05, - 9.0441945653e-05, - 8.92459412297e-05, - 8.8039701205e-05, - 8.68234894894e-05, - 8.55975706908e-05, - 8.43622100627e-05, - 8.31176734536e-05, - 8.1864227256e-05, - 8.06021383549e-05, - 7.9331674078e-05, - 7.80531021443e-05, - 7.67666906133e-05, - 7.54727078354e-05, - 7.41714224012e-05, - 7.28631030913e-05, - 7.15480188265e-05, - 7.0226438618e-05, - 6.88986315179e-05, - 6.75648665698e-05, - 6.62254127591e-05, - 6.4880538965e-05, - 6.35305139107e-05, - 6.21756061155e-05, - 6.08160838461e-05, - 5.94522150686e-05, - 5.80842674011e-05, - 5.6712508065e-05, - 5.53372038391e-05, - 5.39586210114e-05, - 5.2577025333e-05, - 5.1192681971e-05, - 4.9805855463e-05, - 4.84168096706e-05, - 4.70258077341e-05, - 4.56331120272e-05, - 4.42389841118e-05, - 4.28436846936e-05, - 4.14474735783e-05, - 4.0050609626e-05, - 3.86533507095e-05, - 3.72559536701e-05, - 3.58586742747e-05, - 3.44617671733e-05, - 3.30654858571e-05, - 3.16700826166e-05, - 3.02758085003e-05, - 2.88829132735e-05, - 2.74916453776e-05, - 2.61022518907e-05, - 2.47149784868e-05, - 2.33300693971e-05, - 2.19477673712e-05, - 2.05683136377e-05, - 1.91919478673e-05, - 1.78189081343e-05, - 1.64494308799e-05, - 1.5083750875e-05, - 1.37221011846e-05, - 1.23647131313e-05, - 1.10118162603e-05, - 9.66363830479e-06, - 8.32040515053e-06, - 6.98234080332e-06, - 5.64966735417e-06, - 4.32260494743e-06, - 3.0013717478e-06, - 1.68618390817e-06, - 3.77255538808e-07, - -9.25201324664e-07, - -2.22097675007e-06, - -3.50986294095e-06, - -4.79165426359e-06, - -6.06614727805e-06, - -7.33314076462e-06, - -8.59243575357e-06, - -9.84383555092e-06, - -1.10871457664e-05, - -1.23221743389e-05, - -1.35487315631e-05, - -1.4766630114e-05, - -1.59756850713e-05, - -1.71757139447e-05, - -1.83665366966e-05, - -1.95479757652e-05, - -2.07198560871e-05, - -2.18820051194e-05, - -2.30342528609e-05, - -2.41764318727e-05, - -2.5308377299e-05, - -2.64299268862e-05, - -2.75409210024e-05, - -2.86412026567e-05, - -2.97306175148e-05, - -3.08090139198e-05, - -3.18762429063e-05, - -3.2932158218e-05, - -3.39766163229e-05, - -3.50094764299e-05, - -3.60306005009e-05, - -3.70398532674e-05, - -3.80371022421e-05, - -3.90222177329e-05, - -3.99950728542e-05, - -4.09555435403e-05, - -4.1903508555e-05, - -4.28388495026e-05, - -4.37614508386e-05, - -4.46711998787e-05, - -4.55679868072e-05, - -4.64517046865e-05, - -4.73222494639e-05, - -4.81795199794e-05, - -4.90234179715e-05, - -4.98538480849e-05, - -5.06707178738e-05, - -5.14739378086e-05, - -5.22634212794e-05, - -5.30390846007e-05, - -5.38008470135e-05, - -5.45486306884e-05, - -5.52823607285e-05, - -5.60019651696e-05, - -5.67073749831e-05, - -5.73985240742e-05, - -5.80753492843e-05, - -5.8737790388e-05, - -5.93857900939e-05, - -6.00192940416e-05, - -6.06382508004e-05, - -6.12426118656e-05, - -6.18323316566e-05, - -6.24073675111e-05, - -6.29676796822e-05, - -6.35132313334e-05, - -6.40439885327e-05, - -6.45599202469e-05, - -6.50609983348e-05, - -6.55471975413e-05, - -6.60184954882e-05, - -6.6474872668e-05, - -6.69163124345e-05, - -6.73428009934e-05, - -6.77543273941e-05, - -6.81508835187e-05, - -6.85324640715e-05, - -6.88990665687e-05, - -6.92506913267e-05, - -6.95873414498e-05, - -6.99090228189e-05, - -7.02157440771e-05, - -7.05075166174e-05, - -7.07843545695e-05, - -7.10462747839e-05, - -7.12932968188e-05, - -7.15254429235e-05, - -7.17427380246e-05, - -7.19452097087e-05, - -7.21328882056e-05, - -7.23058063736e-05, - -7.24639996796e-05, - -7.2607506183e-05, - -7.27363665169e-05, - -7.28506238703e-05, - -7.29503239678e-05, - -7.30355150524e-05, - -7.31062478634e-05, - -7.31625756181e-05, - -7.32045539897e-05, - -7.32322410888e-05, - -7.32456974393e-05, - -7.32449859588e-05, - -7.32301719364e-05, - -7.32013230091e-05, - -7.31585091407e-05, - -7.31018025979e-05, - -7.30312779273e-05, - -7.29470119312e-05, - -7.28490836441e-05, - -7.27375743081e-05, - -7.26125673485e-05, - -7.24741483487e-05, - -7.23224050245e-05, - -7.21574271996e-05, - -7.19793067783e-05, - -7.17881377208e-05, - -7.15840160155e-05, - -7.13670396535e-05, - -7.11373086006e-05, - -7.0894924771e-05, - -7.06399919985e-05, - -7.03726160105e-05, - -7.00929043989e-05, - -6.98009665914e-05, - -6.94969138246e-05, - -6.91808591142e-05, - -6.88529172268e-05, - -6.85132046496e-05, - -6.81618395626e-05, - -6.77989418087e-05, - -6.74246328629e-05, - -6.7039035804e-05, - -6.66422752831e-05, - -6.62344774949e-05, - -6.58157701454e-05, - -6.53862824236e-05, - -6.49461449691e-05, - -6.44954898417e-05, - -6.40344504901e-05, - -6.35631617218e-05, - -6.3081759671e-05, - -6.25903817668e-05, - -6.20891667025e-05, - -6.15782544042e-05, - -6.10577859981e-05, - -6.05279037793e-05, - -5.99887511796e-05, - -5.94404727363e-05, - -5.88832140591e-05, - -5.83171217985e-05, - -5.77423436132e-05, - -5.71590281389e-05, - -5.65673249544e-05, - -5.59673845504e-05, - -5.53593582968e-05, - -5.47433984106e-05, - -5.41196579222e-05, - -5.34882906449e-05, - -5.28494511405e-05, - -5.22032946877e-05, - -5.15499772498e-05, - -5.08896554416e-05, - -5.02224864978e-05, - -4.95486282395e-05, - -4.88682390423e-05, - -4.81814778037e-05, - -4.7488503911e-05, - -4.67894772085e-05, - -4.6084557966e-05, - -4.53739068453e-05, - -4.46576848692e-05, - -4.39360533886e-05, - -4.32091740514e-05, - -4.2477208769e-05, - -4.1740319686e-05, - -4.0998669147e-05, - -4.02524196663e-05, - -3.95017338954e-05, - -3.87467745908e-05, - -3.79877045846e-05, - -3.72246867517e-05, - -3.64578839787e-05, - -3.56874591332e-05, - -3.49135750333e-05, - -3.41363944161e-05, - -3.33560799071e-05, - -3.25727939905e-05, - -3.17866989781e-05, - -3.09979569799e-05, - -3.02067298728e-05, - -2.94131792717e-05, - -2.86174665007e-05, - -2.78197525616e-05, - -2.70201981061e-05, - -2.62189634062e-05, - -2.54162083251e-05, - -2.46120922893e-05, - -2.38067742593e-05, - -2.30004127006e-05, - -2.2193165558e-05, - -2.13851902251e-05, - -2.05766435184e-05, - -1.97676816489e-05, - -1.89584601955e-05, - -1.81491340776e-05, - -1.73398575287e-05, - -1.65307840696e-05, - -1.57220664825e-05, - -1.49138567846e-05, - -1.41063062029e-05, - -1.32995651483e-05, - -1.24937831905e-05, - -1.16891090332e-05, - -1.08856904888e-05, - -1.00836744552e-05, - -9.28320689053e-06, - -8.48443278967e-06, - -7.6874961612e-06, - -6.89254000319e-06, - -6.09970628118e-06, - -5.30913590446e-06, - -4.52096870451e-06, - -3.7353434128e-06, - -2.95239763859e-06, - -2.1722678476e-06, - -1.39508934116e-06, - -6.20996235323e-07, - 1.49878560562e-07, - 9.17403362832e-07, - 1.68144773405e-06, - 2.44188250309e-06, - 3.19857978326e-06, - 3.9514129917e-06, - 4.70025686861e-06, - 5.44498749455e-06, - 6.18548230935e-06, - 6.92162012883e-06, - 7.65328116248e-06, - 8.38034703032e-06, - 9.10270077947e-06, - 9.82022690066e-06, - 1.05328113432e-05, - 1.1240341532e-05, - 1.19427063814e-05, - 1.26397963106e-05, - 1.33315032582e-05, - 1.40177206965e-05, - 1.46983436443e-05, - 1.53732686814e-05, - 1.60423939615e-05, - 1.67056192242e-05, - 1.73628458082e-05, - 1.80139766628e-05, - 1.86589163595e-05, - 1.92975711039e-05, - 1.99298487452e-05, - 2.05556587884e-05, - 2.11749124036e-05, - 2.17875224355e-05, - 2.23934034135e-05, - 2.29924715606e-05, - 2.35846448017e-05, - 2.41698427726e-05, - 2.47479868276e-05, - 2.53190000468e-05, - 2.5882807244e-05, - 2.64393349734e-05, - 2.69885115355e-05, - 2.75302669841e-05, - 2.80645331315e-05, - 2.85912435541e-05, - 2.91103335978e-05, - 2.96217403817e-05, - 3.01254028036e-05, - 3.06212615431e-05, - 3.11092590657e-05, - 3.15893396258e-05, - 3.20614492694e-05, - 3.25255358369e-05, - 3.29815489654e-05, - 3.34294400898e-05, - 3.38691624451e-05, - 3.43006710668e-05, - 3.4723922792e-05, - 3.51388762598e-05, - 3.55454919109e-05, - 3.59437319876e-05, - 3.6333560533e-05, - 3.67149433904e-05, - 3.7087848201e-05, - 3.74522444032e-05, - 3.78081032298e-05, - 3.81553977059e-05, - 3.84941026461e-05, - 3.88241946516e-05, - 3.91456521065e-05, - 3.94584551741e-05, - 3.97625857927e-05, - 4.00580276722e-05, - 4.03447662873e-05, - 4.06227888747e-05, - 4.08920844263e-05, - 4.11526436837e-05, - 4.14044591326e-05, - 4.16475249961e-05, - 4.18818372284e-05, - 4.21073935071e-05, - 4.2324193227e-05, - 4.25322374916e-05, - 4.27315291056e-05, - 4.2922072567e-05, - 4.3103874058e-05, - 4.32769414367e-05, - 4.34412842277e-05, - 4.35969136134e-05, - 4.37438424236e-05, - 4.3882085126e-05, - 4.40116578156e-05, - 4.41325782052e-05, - 4.42448656137e-05, - 4.43485409553e-05, - 4.44436267282e-05, - 4.45301470035e-05, - 4.4608127413e-05, - 4.46775951373e-05, - 4.47385788931e-05, - 4.47911089213e-05, - 4.48352169737e-05, - 4.48709363002e-05, - 4.48983016352e-05, - 4.49173491848e-05, - 4.49281166118e-05, - 4.49306430234e-05, - 4.49249689551e-05, - 4.49111363581e-05, - 4.4889188583e-05, - 4.48591703667e-05, - 4.48211278153e-05, - 4.47751083907e-05, - 4.4721160894e-05, - 4.46593354504e-05, - 4.45896834926e-05, - 4.45122577458e-05, - 4.44271122105e-05, - 4.43343021468e-05, - 4.42338840571e-05, - 4.41259156699e-05, - 4.40104559228e-05, - 4.3887564945e-05, - 4.37573040403e-05, - 4.36197356696e-05, - 4.34749234335e-05, - 4.33229320541e-05, - 4.31638273578e-05, - 4.29976762566e-05, - 4.28245467301e-05, - 4.26445078079e-05, - 4.24576295499e-05, - 4.22639830291e-05, - 4.20636403117e-05, - 4.18566744393e-05, - 4.16431594096e-05, - 4.14231701569e-05, - 4.11967825341e-05, - 4.09640732922e-05, - 4.07251200624e-05, - 4.04800013353e-05, - 4.02287964423e-05, - 3.99715855358e-05, - 3.97084495697e-05, - 3.94394702792e-05, - 3.91647301614e-05, - 3.88843124556e-05, - 3.85983011226e-05, - 3.83067808259e-05, - 3.80098369106e-05, - 3.77075553838e-05, - 3.74000228945e-05, - 3.70873267131e-05, - 3.67695547119e-05, - 3.64467953439e-05, - 3.61191376232e-05, - 3.57866711046e-05, - 3.54494858633e-05, - 3.51076724742e-05, - 3.4761321992e-05, - 3.44105259309e-05, - 3.40553762437e-05, - 3.3695965302e-05, - 3.33323858758e-05, - 3.29647311128e-05, - 3.25930945181e-05, - 3.22175699347e-05, - 3.18382515221e-05, - 3.14552337367e-05, - 3.10686113113e-05, - 3.06784792351e-05, - 3.02849327335e-05, - 2.98880672478e-05, - 2.94879784153e-05, - 2.9084762049e-05, - 2.86785141181e-05, - 2.82693307275e-05, - 2.78573080985e-05, - 2.74425425486e-05, - 2.70251304716e-05, - 2.66051683188e-05, - 2.61827525782e-05, - 2.57579797559e-05, - 2.53309463566e-05, - 2.49017488635e-05, - 2.44704837199e-05, - 2.40372473098e-05, - 2.36021359383e-05, - 2.31652458135e-05, - 2.27266730268e-05, - 2.22865135349e-05, - 2.18448631404e-05, - 2.14018174737e-05, - 2.09574719746e-05, - 2.05119218738e-05, - 2.00652621749e-05, - 1.9617587636e-05, - 1.91689927523e-05, - 1.87195717375e-05, - 1.82694185072e-05, - 1.78186266605e-05, - 1.73672894628e-05, - 1.69154998289e-05, - 1.64633503054e-05, - 1.60109330543e-05, - 1.55583398356e-05, - 1.51056619915e-05, - 1.46529904287e-05, - 1.42004156032e-05, - 1.37480275034e-05, - 1.32959156349e-05, - 1.28441690038e-05, - 1.23928761012e-05, - 1.19421248885e-05, - 1.14920027813e-05, - 1.1042596634e-05, - 1.05939927257e-05, - 1.01462767456e-05, - 9.69953377727e-06, - 9.25384828498e-06, - 8.80930409919e-06, - 8.36598440324e-06, - 7.92397171878e-06, - 7.48334789213e-06, - 7.04419408104e-06, - 6.60659074225e-06, - 6.17061761699e-06, - 5.73635371937e-06, - 5.30387732323e-06, - 4.87326594922e-06, - 4.44459635363e-06, - 4.0179445161e-06, - 3.59338562705e-06, - 3.17099407743e-06, - 2.75084344603e-06, - 2.333006489e-06, - 1.91755512946e-06, - 1.50456044545e-06, - 1.0940926608e-06, - 6.86221133916e-07, - 2.81014347903e-07, - -1.21460098645e-07, - -5.21135501863e-07, - -9.17946061607e-07, - -1.31182689067e-06, - -1.70271402489e-06, - -2.09054442912e-06, - -2.47525600816e-06, - -2.85678761469e-06, - -3.23507905575e-06, - -3.61007110183e-06, - -3.98170549398e-06, - -4.3499249518e-06, - -4.71467317875e-06, - -5.07589487087e-06, - -5.43353572269e-06, - -5.78754243286e-06, - -6.13786271209e-06, - -6.48444528673e-06, - -6.82723990608e-06, - -7.16619734709e-06, - -7.50126942073e-06, - -7.83240897473e-06, - -8.15956990041e-06, - -8.48270713605e-06, - -8.80177667151e-06, - -9.1167355516e-06, - -9.42754188116e-06, - -9.7341548273e-06, - -1.00365346234e-05, - -1.03346425719e-05, - -1.06284410477e-05, - -1.09178934995e-05, - -1.12029644534e-05, - -1.14836195146e-05, - -1.17598253691e-05, - -1.20315497856e-05, - -1.22987616167e-05, - -1.25614308009e-05, - -1.28195283624e-05, - -1.30730264123e-05, - -1.33218981497e-05, - -1.35661178609e-05, - -1.38056609207e-05, - -1.40405037907e-05, - -1.42706240212e-05, - -1.44960002477e-05, - -1.47166121924e-05, - -1.49324406622e-05, - -1.51434675471e-05, - -1.53496758193e-05, - -1.55510495317e-05, - -1.57475738145e-05, - -1.59392348755e-05, - -1.61260199956e-05, - -1.63079175264e-05, - -1.64849168889e-05, - -1.66570085691e-05, - -1.68241841152e-05, - -1.69864361343e-05, - -1.71437582892e-05, - -1.72961452929e-05, - -1.7443592907e-05, - -1.75860979355e-05, - -1.77236582211e-05, - -1.78562726409e-05, - -1.79839411014e-05, - -1.81066645326e-05, - -1.82244448843e-05, - -1.83372851195e-05, - -1.84451892089e-05, - -1.85481621267e-05, - -1.86462098419e-05, - -1.87393393147e-05, - -1.88275584891e-05, - -1.8910876286e-05, - -1.89893025977e-05, - -1.90628482795e-05, - -1.91315251443e-05, - -1.91953459545e-05, - -1.92543244144e-05, - -1.93084751638e-05, - -1.9357813769e-05, - -1.94023567159e-05, - -1.94421214019e-05, - -1.94771261273e-05, - -1.9507390087e-05, - -1.9532933363e-05, - -1.95537769145e-05, - -1.956994257e-05, - -1.95814530177e-05, - -1.95883317982e-05, - -1.9590603292e-05, - -1.95882927145e-05, - -1.95814261026e-05, - -1.95700303076e-05, - -1.95541329846e-05, - -1.9533762583e-05, - -1.95089483359e-05, - -1.94797202508e-05, - -1.94461090992e-05, - -1.94081464062e-05, - -1.93658644398e-05, - -1.9319296201e-05, - -1.92684754126e-05, - -1.92134365091e-05, - -1.91542146248e-05, - -1.90908455844e-05, - -1.90233658905e-05, - -1.89518127134e-05, - -1.88762238793e-05, - -1.87966378593e-05, - -1.87130937581e-05, - -1.86256313028e-05, - -1.85342908301e-05, - -1.84391132765e-05, - -1.83401401648e-05, - -1.82374135935e-05, - -1.81309762248e-05, - -1.80208712726e-05, - -1.79071424899e-05, - -1.7789834158e-05, - -1.76689910734e-05, - -1.75446585358e-05, - -1.74168823366e-05, - -1.72857087459e-05, - -1.71511845006e-05, - -1.70133567923e-05, - -1.68722732539e-05, - -1.67279819483e-05, - -1.65805313557e-05, - -1.64299703611e-05, - -1.62763482414e-05, - -1.61197146535e-05, - -1.5960119621e-05, - -1.57976135224e-05, - -1.56322470781e-05, - -1.54640713381e-05, - -1.52931376689e-05, - -1.51194977416e-05, - -1.49432035186e-05, - -1.47643072408e-05, - -1.45828614164e-05, - -1.43989188062e-05, - -1.42125324125e-05, - -1.40237554667e-05, - -1.3832641415e-05, - -1.3639243907e-05, - -1.34436167836e-05, - -1.32458140634e-05, - -1.30458899306e-05, - -1.28438987219e-05, - -1.26398949158e-05, - -1.24339331178e-05, - -1.22260680497e-05, - -1.20163545363e-05, - -1.18048474933e-05, - -1.15916019154e-05, - -1.13766728631e-05, - -1.11601154513e-05, - -1.09419848366e-05, - -1.07223362058e-05, - -1.05012247633e-05, - -1.02787057183e-05, - -1.0054834275e-05, - -9.82966561835e-06, - -9.60325490351e-06, - -9.37565724413e-06, - -9.14692769993e-06, - -8.91712126516e-06, - -8.68629285744e-06, - -8.4544973058e-06, - -8.22178933957e-06, - -7.98822357684e-06, - -7.75385451357e-06, - -7.51873651161e-06, - -7.28292378804e-06, - -7.04647040384e-06, - -6.80943025366e-06, - -6.57185705455e-06, - -6.33380433435e-06, - -6.09532542262e-06, - -5.85647343887e-06, - -5.61730128212e-06, - -5.37786162136e-06, - -5.13820688441e-06, - -4.898389248e-06, - -4.65846062814e-06, - -4.41847266952e-06, - -4.17847673551e-06, - -3.93852389902e-06, - -3.69866493322e-06, - -3.45895030041e-06, - -3.21943014425e-06, - -2.98015427957e-06, - -2.74117218368e-06, - -2.50253298639e-06, - -2.26428546291e-06, - -2.02647802294e-06, - -1.78915870341e-06, - -1.55237515886e-06, - -1.31617465393e-06, - -1.08060405513e-06, - -8.45709821284e-07, - -6.11537996908e-07, - -3.78134203727e-07, - -1.45543633145e-07, - 8.61889619674e-08, - 3.17019274387e-07, - 5.46903449639e-07, - 7.75798093877e-07, - 1.00366028055e-06, - 1.2304475574e-06, - 1.45611795388e-06, - 1.68062998673e-06, - 1.9039426673e-06, - 2.12601550786e-06, - 2.34680852795e-06, - 2.56628225981e-06, - 2.78439775525e-06, - 3.00111659091e-06, - 3.2164008742e-06, - 3.43021324845e-06, - 3.64251689877e-06, - 3.85327555719e-06, - 4.06245350726e-06, - 4.27001558923e-06, - 4.47592720543e-06, - 4.68015432387e-06, - 4.88266348364e-06, - 5.08342179839e-06, - 5.2823969614e-06, - 5.4795572485e-06, - 5.67487152325e-06, - 5.86830923976e-06, - 6.05984044644e-06, - 6.24943578931e-06, - 6.4370665156e-06, - 6.62270447671e-06, - 6.80632213079e-06, - 6.98789254627e-06, - 7.16738940376e-06, - 7.34478699926e-06, - 7.52006024585e-06, - 7.69318467619e-06, - 7.86413644449e-06, - 8.03289232865e-06, - 8.19942973163e-06, - 8.36372668334e-06, - 8.52576184185e-06, - 8.68551449462e-06, - 8.84296455983e-06, - 8.99809258725e-06, - 9.15087975928e-06, - 9.30130789123e-06, - 9.44935943215e-06, - 9.59501746511e-06, - 9.73826570771e-06, - 9.87908851169e-06, - 1.00174708632e-05, - 1.01533983823e-05, - 1.02868573232e-05, - 1.04178345732e-05, - 1.0546317652e-05, - 1.06722947116e-05, - 1.0795754535e-05, - 1.09166865346e-05, - 1.10350807518e-05, - 1.11509278554e-05, - 1.12642191401e-05, - 1.13749465247e-05, - 1.14831025504e-05, - 1.15886803793e-05, - 1.16916737921e-05, - 1.17920771859e-05, - 1.1889885572e-05, - 1.19850945731e-05, - 1.20777004214e-05, - 1.21676999559e-05, - 1.22550906186e-05, - 1.2339870453e-05, - 1.24220381001e-05, - 1.25015927953e-05, - 1.25785343653e-05, - 1.26528632249e-05, - 1.27245803729e-05, - 1.27936873892e-05, - 1.28601864297e-05, - 1.29240802241e-05, - 1.2985372071e-05, - 1.30440658334e-05, - 1.31001659351e-05, - 1.31536773565e-05, - 1.32046056297e-05, - 1.32529568339e-05, - 1.32987375909e-05, - 1.33419550609e-05, - 1.33826169364e-05, - 1.34207314385e-05, - 1.34563073111e-05, - 1.34893538161e-05, - 1.35198807274e-05, - 1.3547898327e-05, - 1.35734173982e-05, - 1.35964492204e-05, - 1.36170055642e-05, - 1.36350986848e-05, - 1.36507413168e-05, - 1.36639466678e-05, - 1.3674728413e-05, - 1.36831006888e-05, - 1.3689078087e-05, - 1.36926756482e-05, - 1.3693908856e-05, - 1.36927936302e-05, - 1.36893463208e-05, - 1.36835837017e-05, - 1.36755229634e-05, - 1.3665181707e-05, - 1.36525779373e-05, - 1.36377300565e-05, - 1.36206568567e-05, - 1.36013775138e-05, - 1.35799115801e-05, - 1.35562789775e-05, - 1.35304999906e-05, - 1.35025952596e-05, - 1.34725857732e-05, - 1.34404928613e-05, - 1.34063381882e-05, - 1.33701437453e-05, - 1.33319318429e-05, - 1.32917251048e-05, - 1.32495464591e-05, - 1.32054191319e-05, - 1.31593666395e-05, - 1.31114127812e-05, - 1.30615816315e-05, - 1.30098975332e-05, - 1.2956385089e-05, - 1.29010691552e-05, - 1.28439748328e-05, - 1.27851274609e-05, - 1.27245526091e-05, - 1.26622760693e-05, - 1.25983238484e-05, - 1.25327221607e-05, - 1.24654974206e-05, - 1.23966762343e-05, - 1.23262853926e-05, - 1.22543518635e-05, - 1.21809027839e-05, - 1.21059654524e-05, - 1.20295673218e-05, - 1.19517359913e-05, - 1.18724991985e-05, - 1.17918848124e-05, - 1.17099208254e-05, - 1.16266353462e-05, - 1.15420565916e-05, - 1.14562128792e-05, - 1.13691326202e-05, - 1.12808443113e-05, - 1.11913765279e-05, - 1.11007579159e-05, - 1.10090171846e-05, - 1.09161830996e-05, - 1.08222844748e-05, - 1.07273501656e-05, - 1.06314090609e-05, - 1.05344900767e-05, - 1.04366221484e-05, - 1.03378342229e-05, - 1.02381552531e-05, - 1.01376141891e-05, - 1.00362399718e-05, - 9.93406152572e-06, - 9.83110775277e-06, - 9.72740752403e-06, - 9.62298967377e-06, - 9.51788299186e-06, - 9.41211621786e-06, - 9.30571803337e-06, - 9.19871705607e-06, - 9.09114183278e-06, - 8.98302083263e-06, - 8.87438244068e-06, - 8.76525495219e-06, - 8.65566656494e-06, - 8.54564537367e-06, - 8.43521936422e-06, - 8.32441640619e-06, - 8.21326424749e-06, - 8.10179050847e-06, - 7.99002267537e-06, - 7.87798809487e-06, - 7.76571396788e-06, - 7.65322734386e-06, - 7.54055511554e-06, - 7.42772401252e-06, - 7.31476059634e-06, - 7.20169125457e-06, - 7.08854219578e-06, - 6.97533944405e-06, - 6.86210883372e-06, - 6.74887600427e-06, - 6.63566639525e-06, - 6.52250524136e-06, - 6.40941756735e-06, - 6.29642818339e-06, - 6.18356168025e-06, - 6.07084242488e-06, - 5.95829455552e-06, - 5.84594197717e-06, - 5.733808358e-06, - 5.62191712372e-06, - 5.51029145468e-06, - 5.39895428131e-06, - 5.28792828014e-06, - 5.17723586924e-06, - 5.06689920499e-06, - 4.9569401791e-06, - 4.84738041351e-06, - 4.7382412578e-06, - 4.62954378511e-06, - 4.52130879003e-06, - 4.4135567836e-06, - 4.3063079912e-06, - 4.19958234998e-06, - 4.09339950425e-06, - 3.9877788045e-06, - 3.88273930363e-06, - 3.77829975406e-06, - 3.67447860572e-06, - 3.57129400375e-06, - 3.46876378532e-06, - 3.36690547809e-06, - 3.2657362975e-06, - 3.16527314559e-06, - 3.06553260776e-06, - 2.96653095211e-06, - 2.86828412699e-06, - 2.77080775912e-06, - 2.67411715293e-06, - 2.57822728833e-06, - 2.48315281959e-06, - 2.3889080738e-06, - 2.29550705033e-06, - 2.20296341924e-06, - 2.1112905203e-06, - 2.02050136233e-06, - 1.9306086223e-06, - 1.84162464489e-06, - 1.7535614415e-06, - 1.66643069011e-06, - 1.58024373476e-06, - 1.49501158497e-06, - 1.41074491655e-06, - 1.32745407011e-06, - 1.24514905187e-06, - 1.16383953386e-06, - 1.08353485351e-06, - 1.00424401506e-06, - 9.25975688126e-07, - 8.48738209602e-07, - 7.72539584304e-07, - 6.97387484427e-07, - 6.23289251434e-07, - 5.50251896159e-07, - 4.78282100147e-07, - 4.07386216761e-07, - 3.37570271403e-07, - 2.68839963735e-07, - 2.0120066857e-07, - 1.34657436979e-07, - 6.92149981774e-08, - 4.8777604178e-09, - -5.83501866824e-08, - -1.2046507103e-07, - -1.81463435611e-07, - -2.4134213783e-07, - -3.00098346617e-07, - -3.57729540212e-07, - -4.14233504831e-07, - -4.69608332443e-07, - -5.23852417889e-07, - -5.76964457766e-07, - -6.28943446435e-07, - -6.79788674907e-07, - -7.29499727736e-07, - -7.78076480579e-07, - -8.25519097525e-07, - -8.71828028437e-07, - -9.17004006062e-07, - -9.61048043369e-07, - -1.00396142999e-06, - -1.04574573023e-06, - -1.08640277952e-06, - -1.12593468127e-06, - -1.16434380337e-06, - -1.20163277595e-06, - -1.23780448757e-06, - -1.27286208107e-06, - -1.30680895238e-06, - -1.3396487446e-06, - -1.37138534617e-06, - -1.40202288645e-06, - -1.43156573262e-06, - -1.46001848655e-06, - -1.48738597971e-06, - -1.51367327095e-06, - -1.53888564136e-06, - -1.56302859211e-06, - -1.58610783907e-06, - -1.60812930972e-06, - -1.62909913937e-06, - -1.64902366673e-06, - -1.66790943057e-06, - -1.68576316484e-06, - -1.70259179533e-06, - -1.71840243546e-06, - -1.73320238206e-06, - -1.74699911093e-06, - -1.75980027395e-06, - -1.77161369352e-06, - -1.78244735927e-06, - -1.79230942243e-06, - -1.80120819415e-06, - -1.80915213854e-06, - -1.81614987071e-06, - -1.82221015055e-06, - -1.82734187937e-06, - -1.83155409617e-06, - -1.83485597227e-06, - -1.8372568078e-06, - -1.83876602611e-06, - -1.83939317178e-06, - -1.83914790353e-06, - -1.83803999199e-06, - -1.83607931392e-06, - -1.83327584957e-06, - -1.82963967643e-06, - -1.82518096636e-06, - -1.81990998005e-06, - -1.81383706388e-06, - -1.80697264485e-06, - -1.79932722677e-06, - -1.79091138541e-06, - -1.78173576493e-06, - -1.77181107253e-06, - -1.76114807515e-06, - -1.7497575957e-06, - -1.73765050726e-06, - -1.72483772953e-06, - -1.71133022575e-06, - -1.69713899734e-06, - -1.68227507946e-06, - -1.66674953839e-06, - -1.65057346613e-06, - -1.63375797668e-06, - -1.6163142027e-06, - -1.59825329016e-06, - -1.57958639613e-06, - -1.56032468279e-06, - -1.54047931566e-06, - -1.52006145782e-06, - -1.49908226765e-06, - -1.47755289381e-06, - -1.45548447228e-06, - -1.4328881226e-06, - -1.40977494389e-06, - -1.38615601086e-06, - -1.36204237089e-06, - -1.33744504072e-06, - -1.312375002e-06, - -1.28684319867e-06, - -1.26086053287e-06, - -1.23443786215e-06, - -1.20758599587e-06, - -1.1803156923e-06, - -1.15263765443e-06, - -1.12456252821e-06, - -1.09610089805e-06, - -1.06726328553e-06, - -1.03806014407e-06, - -1.00850185802e-06, - -9.78598739154e-07, - -9.48361022823e-07, - -9.17798866684e-07, - -8.86922347343e-07, - -8.55741457695e-07, - -8.2426610426e-07, - -7.92506104963e-07, - -7.60471186023e-07, - -7.28170980624e-07, - -6.95615025359e-07, - -6.62812758456e-07, - -6.29773518224e-07, - -5.9650653994e-07, - -5.63020953859e-07, - -5.29325784093e-07, - -4.95429945735e-07, - -4.61342242852e-07, - -4.27071367604e-07, - -3.92625897572e-07, - -3.58014295099e-07, - -3.23244904399e-07, - -2.88325950448e-07, - -2.53265538763e-07, - -2.18071651847e-07, - -1.82752149192e-07, - -1.47314766163e-07, - -1.1176711201e-07, - -7.61166689678e-08, - -4.03707915986e-08, - -4.53670567779e-09, - 3.13784935813e-08, - 6.73678407503e-08, - 1.0342450274e-07, - 1.39541778355e-07, - 1.75713098849e-07, - 2.11932029592e-07, - 2.48192269514e-07, - 2.84487651991e-07, - 3.2081214496e-07, - 3.57159851694e-07, - 3.93525010134e-07, - 4.29901994337e-07, - 4.6628531325e-07, - 5.02669611491e-07, - 5.39049669013e-07, - 5.75420401328e-07, - 6.1177685895e-07, - 6.48114227064e-07, - 6.84427825415e-07, - 7.20713108082e-07, - 7.56965662707e-07, - 7.93181209935e-07, - 8.29355603305e-07, - 8.65484828028e-07, - 9.01565000544e-07, - 9.37592367523e-07, - 9.73563305418e-07, - 1.00947431902e-06, - 1.04532204137e-06, - 1.08110323149e-06, - 1.11681477444e-06, - 1.15245367949e-06, - 1.18801707916e-06, - 1.22350222742e-06, - 1.25890649938e-06, - 1.29422738926e-06, - 1.32946250897e-06, - 1.36460958666e-06, - 1.39966646506e-06, - 1.43463110025e-06, - 1.46950155977e-06, - 1.50427602086e-06, - 1.53895276833e-06, - 1.57353019403e-06, - 1.60800679361e-06, - 1.64238116529e-06, - 1.67665200745e-06, - 1.71081811762e-06, - 1.74487838944e-06, - 1.77883181085e-06, - 1.81267746224e-06, - 1.84641451406e-06, - 1.88004222457e-06, - 1.91355993795e-06, - 1.94696708145e-06, - 1.98026316345e-06, - 2.01344777173e-06, - 2.04652056945e-06, - 2.07948129416e-06, - 2.11232975544e-06, - 2.14506583096e-06, - 2.17768946564e-06, - 2.21020066804e-06, - 2.24259950832e-06, - 2.27488611571e-06, - 2.30706067539e-06, - 2.33912342651e-06, - 2.37107465906e-06, - 2.40291471165e-06, - 2.43464396843e-06, - 2.4662628566e-06, - 2.49777184358e-06, - 2.52917143473e-06, - 2.56046216951e-06, - 2.59164462046e-06, - 2.62271938933e-06, - 2.65368710395e-06, - 2.68454841623e-06, - 2.71530399976e-06, - 2.74595454597e-06, - 2.77650076164e-06, - 2.80694336707e-06, - 2.83728309203e-06, - 2.86752067391e-06, - 2.89765685457e-06, - 2.92769237775e-06, - 2.95762798619e-06, - 2.98746441862e-06, - 3.01720240803e-06, - 3.04684267805e-06, - 3.07638594021e-06, - 3.10583289198e-06, - 3.13518421391e-06, - 3.16444056592e-06, - 3.1936025866e-06, - 3.2226708887e-06, - 3.25164605797e-06, - 3.28052864995e-06, - 3.30931918735e-06, - 3.33801815788e-06, - 3.36662601186e-06, - 3.39514315917e-06, - 3.42356996763e-06, - 3.4519067601e-06, - 3.48015381224e-06, - 3.50831135021e-06, - 3.53637954875e-06, - 3.56435852855e-06, - 3.59224835411e-06, - 3.62004903165e-06, - 3.64776050688e-06, - 3.67538266355e-06, - 3.70291532059e-06, - 3.73035823076e-06, - 3.7577110783e-06, - 3.78497347742e-06, - 3.81214497047e-06, - 3.83922502567e-06, - 3.86621303627e-06, - 3.89310831794e-06, - 3.91991010817e-06, - 3.94661756375e-06, - 3.97322975965e-06, - 3.99974568821e-06, - 4.02616425699e-06, - 4.05248428748e-06, - 4.07870451458e-06, - 4.10482358437e-06, - 4.13084005402e-06, - 4.15675238996e-06, - 4.18255896761e-06, - 4.20825806957e-06, - 4.2338478855e-06, - 4.2593265116e-06, - 4.28469194869e-06, - 4.30994210254e-06, - 4.33507478304e-06, - 4.36008770388e-06, - 4.38497848165e-06, - 4.40974463589e-06, - 4.43438358932e-06, - 4.45889266587e-06, - 4.48326909264e-06, - 4.5075099987e-06, - 4.5316124152e-06, - 4.5555732755e-06, - 4.57938941556e-06, - 4.60305757444e-06, - 4.62657439382e-06, - 4.64993641847e-06, - 4.67314009822e-06, - 4.69618178645e-06, - 4.71905774224e-06, - 4.74176413023e-06, - 4.7642970219e-06, - 4.78665239645e-06, - 4.80882614129e-06, - 4.83081405345e-06, - 4.8526118408e-06, - 4.87421512307e-06, - 4.89561943307e-06, - 4.91682021797e-06, - 4.93781284117e-06, - 4.95859258309e-06, - 4.97915464381e-06, - 4.99949414356e-06, - 5.01960612531e-06, - 5.03948555597e-06, - 5.05912732895e-06, - 5.07852626552e-06, - 5.09767711732e-06, - 5.11657456836e-06, - 5.13521323686e-06, - 5.15358767794e-06, - 5.17169238567e-06, - 5.18952179607e-06, - 5.20707028884e-06, - 5.22433219019e-06, - 5.24130177582e-06, - 5.257973273e-06, - 5.27434086384e-06, - 5.29039868769e-06, - 5.3061408446e-06, - 5.32156139765e-06, - 5.33665437663e-06, - 5.35141378022e-06, - 5.36583358046e-06, - 5.37990772442e-06, - 5.39363013863e-06, - 5.40699473173e-06, - 5.41999539838e-06, - 5.43262602204e-06, - 5.44488047949e-06, - 5.45675264274e-06, - 5.46823638425e-06, - 5.4793255797e-06, - 5.49001411176e-06, - 5.50029587387e-06, - 5.51016477401e-06, - 5.51961473827e-06, - 5.52863971548e-06, - 5.53723368002e-06, - 5.54539063635e-06, - 5.55310462302e-06, - 5.56036971588e-06, - 5.56718003331e-06, - 5.57352973929e-06, - 5.5794130478e-06, - 5.58482422675e-06, - 5.58975760201e-06, - 5.59420756197e-06, - 5.59816856138e-06, - 5.60163512542e-06, - 5.60460185361e-06, - 5.60706342467e-06, - 5.60901460001e-06, - 5.61045022829e-06, - 5.61136524935e-06, - 5.61175469893e-06, - 5.61161371182e-06, - 5.61093752682e-06, - 5.60972149077e-06, - 5.60796106275e-06, - 5.60565181762e-06, - 5.60278945039e-06, - 5.59936978106e-06, - 5.59538875766e-06, - 5.59084246099e-06, - 5.58572710763e-06, - 5.5800390556e-06, - 5.57377480637e-06, - 5.5669310105e-06, - 5.55950447012e-06, - 5.55149214343e-06, - 5.54289114907e-06, - 5.53369876799e-06, - 5.52391244901e-06, - 5.51352981193e-06, - 5.50254865039e-06, - 5.49096693614e-06, - 5.47878282231e-06, - 5.46599464635e-06, - 5.45260093388e-06, - 5.43860040214e-06, - 5.42399196202e-06, - 5.40877472233e-06, - 5.3929479924e-06, - 5.37651128485e-06, - 5.35946431801e-06, - 5.34180701983e-06, - 5.32353952998e-06, - 5.3046622015e-06, - 5.28517560472e-06, - 5.26508052889e-06, - 5.24437798455e-06, - 5.22306920492e-06, - 5.2011556495e-06, - 5.17863900507e-06, - 5.15552118718e-06, - 5.13180434225e-06, - 5.10749084959e-06, - 5.08258332188e-06, - 5.05708460763e-06, - 5.03099779137e-06, - 5.00432619455e-06, - 4.97707337821e-06, - 4.94924314232e-06, - 4.92083952564e-06, - 4.89186680863e-06, - 4.86232951225e-06, - 4.83223239811e-06, - 4.80158046934e-06, - 4.77037896984e-06, - 4.73863338446e-06, - 4.70634943894e-06, - 4.67353309852e-06, - 4.64019056778e-06, - 4.60632828969e-06, - 4.57195294545e-06, - 4.5370714522e-06, - 4.50169096133e-06, - 4.46581885905e-06, - 4.42946276313e-06, - 4.39263052121e-06, - 4.35533020893e-06, - 4.31757012809e-06, - 4.27935880465e-06, - 4.24070498539e-06, - 4.20161763548e-06, - 4.16210593612e-06, - 4.1221792817e-06, - 4.08184727518e-06, - 4.04111972652e-06, - 4.00000664791e-06, - 3.95851825141e-06, - 3.91666494381e-06, - 3.87445732253e-06, - 3.83190617292e-06, - 3.78902246279e-06, - 3.74581733764e-06, - 3.70230211622e-06, - 3.65848828687e-06, - 3.61438750041e-06, - 3.57001156648e-06, - 3.52537244708e-06, - 3.48048225252e-06, - 3.43535323444e-06, - 3.38999778027e-06, - 3.34442840721e-06, - 3.29865775706e-06, - 3.2526985887e-06, - 3.20656377217e-06, - 3.16026628122e-06, - 3.11381918894e-06, - 3.06723565846e-06, - 3.02052893708e-06, - 2.9737123487e-06, - 2.92679928793e-06, - 2.87980321134e-06, - 2.83273763002e-06, - 2.78561610234e-06, - 2.73845222698e-06, - 2.69125963503e-06, - 2.6440519808e-06, - 2.59684293513e-06, - 2.54964617719e-06, - 2.50247538724e-06, - 2.45534423737e-06, - 2.40826638154e-06, - 2.36125545283e-06, - 2.31432504971e-06, - 2.26748873e-06, - 2.22076000322e-06, - 2.1741523214e-06, - 2.12767907104e-06, - 2.08135356417e-06, - 2.03518903108e-06, - 1.9891986115e-06, - 1.94339534676e-06, - 1.89779217175e-06, - 1.85240190576e-06, - 1.80723724574e-06, - 1.76231075888e-06, - 1.71763487289e-06, - 1.67322186928e-06, - 1.62908387702e-06, - 1.58523286387e-06, - 1.54168062871e-06, - 1.49843879582e-06, - 1.45551880804e-06, - 1.41293191935e-06, - 1.37068918848e-06, - 1.32880147319e-06, - 1.28727942517e-06, - 1.24613348351e-06, - 1.20537386927e-06, - 1.16501058112e-06, - 1.12505339089e-06, - 1.08551184042e-06, - 1.04639523513e-06, - 1.00771264222e-06, - 9.69472889079e-07, - 9.31684559169e-07, - 8.94355989711e-07, - 8.57495271789e-07, - 8.2111024946e-07, - 7.85208518428e-07, - 7.49797427368e-07, - 7.14884077935e-07, - 6.80475327974e-07, - 6.46577792973e-07, - 6.13197849497e-07, - 5.80341637857e-07, - 5.48015069546e-07, - 5.16223831126e-07, - 4.84973390669e-07, - 4.54269004968e-07, - 4.24115729758e-07, - 3.94518427593e-07, - 3.65481778064e-07, - 3.37010289786e-07, - 3.09108314389e-07, - 2.8178005862e-07, - 2.55029599661e-07, - 2.28860901785e-07, - 2.03277834787e-07, - 1.78284191188e-07, - 1.53883706666e-07, - 1.30080081484e-07, - 1.06877001249e-07, - 8.42781580079e-08, - 6.22872755596e-08, - 4.09081096775e-08, - 2.01444375625e-08, - 0.0, -]; diff --git a/examples/synth/src/oscillator/osc.rs b/examples/synth/src/oscillator/osc.rs deleted file mode 100644 index 1f1442b..0000000 --- a/examples/synth/src/oscillator/osc.rs +++ /dev/null @@ -1,234 +0,0 @@ -use std::f32::consts::PI; - -#[derive(Clone, Debug)] -pub struct AnalogOsc { - sample_rate: usize, - nyquist: f32, - conv: f32, - phase: f32, - prev_sync: f32, - future: [f32; FUTURE_SIZE], - future_index: usize, - prev_output: f32, - blep_table: [f32; BLEP_SIZE], -} - -const OVERSAMPLING: usize = 256; -const ZERO_CROSSINGS: usize = 16; -const TRANSITION_START: f32 = 8000.0; -const TRANSITION_END: f32 = 10000.0; -const FUTURE_SIZE: usize = ZERO_CROSSINGS * 2; -const BLEP_SIZE: usize = OVERSAMPLING * ZERO_CROSSINGS * 2 + 1; - -impl AnalogOsc { - pub fn new() -> AnalogOsc { - let blep_table = { - let mut table = [0.0; BLEP_SIZE]; - for i in 0..BLEP_SIZE { - let x = (i as f32 - (BLEP_SIZE as f32 - 1.0) / 2.0) / (OVERSAMPLING as f32); - table[i] = if x == 0.0 { - 1.0 - } else { - // Raised cosine windowed sinc function - x.sin() / (PI * x) * (1.0 - (x / (ZERO_CROSSINGS as f32)).cos()) - }; - } - table - }; - - AnalogOsc { - sample_rate: 0, - nyquist: 0.0, - conv: 0.0, - phase: 0.0, - prev_sync: 0.0, - future: [0.0; FUTURE_SIZE], - future_index: 0, - prev_output: 0.0, - blep_table, - } - } - - pub fn set_sample_rate(&mut self, n: usize) { - // Avoid a potential data race. - if self.sample_rate != n { - self.sample_rate = n; - self.nyquist = n as f32 / 2.0; - self.conv = 1.0 / self.sample_rate as f32; - } - } - - pub fn tick_saw(&mut self, f: f32, sync: f32, shape: f32) -> f32 { - let f = f.min(self.nyquist); - let shape = shape.clamp(0.0, 1.0); - - let rate = f * self.conv; - - let mut output = 0.0; - - // Advance phase. - self.phase += rate; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - // Sync. - if sync > 0.0 && self.prev_sync <= 0.0 { - // Estimate how long ago zero-crossing happened - // via linear interpolation and intersection - // with x-axis. - let frames_since = sync / (sync - self.prev_sync); - - // Reset phase. - self.phase = frames_since * rate; - } - - self.prev_sync = sync; - - // Render bleps. - if f < TRANSITION_END { - // Compute phase of the second saw. - let mut aux_phase = self.phase + shape * 0.5; - if aux_phase >= 1.0 { - aux_phase -= 1.0; - } - - // Naive dual saw. - output = self.phase + aux_phase - 1.0; - - // If the function has decreased, add a blep. - if output < self.prev_output && rate > 0.0 { - let scale = self.prev_output - output + 2.0 * rate; - self.add_blep(f32::min(self.phase, aux_phase) / rate, scale); - } - - self.prev_output = output; - - // Correct with bleps. - output += self.future[self.future_index]; - self.future[self.future_index] = 0.0; - self.future_index = (self.future_index + 1) % FUTURE_SIZE; - - // Remove DC component based on frequency. - // 5.473 is emperically determined. - output -= (f / self.sample_rate as f32) * 5.473; - } - - // Render sine. - if f > TRANSITION_START { - let sine_gain = if f < TRANSITION_END { - (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) - } else { - 1.0 - }; - - output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); - } - - output - } - - #[allow(dead_code)] - pub fn process_saw(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { - let n = pitch.len(); - for i in 0..n { - out[i] = self.tick_saw(pitch[i], sync[i], shape[i]); - } - } - - pub fn tick_square(&mut self, f: f32, sync: f32, shape: f32) -> f32 { - let f = f.min(self.nyquist); - let shape = shape.min(1.0).max(0.0); - - let rate = f * self.conv; - - let mut output = 0.0; - - // Pulse width. - let pw = 0.5 * (1.0 - shape); - - // Advance phase. - self.phase += rate; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - // Sync. - if sync > 0.0 && self.prev_sync <= 0.0 { - // Estimate how long ago zero-crossing happened - // via linear interpolation and intersection - // with x-axis. - let frames_since = sync / (sync - self.prev_sync); - - // Reset phase. - self.phase = frames_since * rate; - } - - self.prev_sync = sync; - - // Render bleps. - if f < TRANSITION_END { - // Naive square. - output = if self.phase < pw { 1.0 } else { -1.0 }; - - if output != self.prev_output && rate > 0.0 { - if self.phase < pw { - self.add_blep(self.phase / rate, -2.0); - } else { - self.add_blep((self.phase - pw) / rate, 2.0); - } - } - - self.prev_output = output; - - // Correct with bleps. - output += self.future[self.future_index]; - self.future[self.future_index] = 0.0; - self.future_index = (self.future_index + 1) % FUTURE_SIZE; - } - - // Render sine. - if f > TRANSITION_START { - let sine_gain = if f < TRANSITION_END { - (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) - } else { - 1.0 - }; - - output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); - } - - output - } - - #[allow(dead_code)] - pub fn process_square(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { - let n = pitch.len(); - for i in 0..n { - out[i] = self.tick_square(pitch[i], sync[i], shape[i]); - } - } - - fn add_blep(&mut self, phase: f32, scale: f32) { - // Add a blep into the future buffer. - - let mut p = (phase * (OVERSAMPLING as f32)) as usize; // Convert to integer index outside the loop. - - let mut i = self.future_index; - - // Note: should be able to do one loop with modulo. Perhaps that was slower? - - while i < FUTURE_SIZE && p < BLEP_SIZE { - self.future[i] += self.blep_table[p] * scale; - p += OVERSAMPLING; - i += 1; - } - - i = 0; - while i < self.future_index && p < BLEP_SIZE { - self.future[i] += self.blep_table[p] * scale; - p += OVERSAMPLING; - i += 1; - } - } -} From 75bb4ef46830d4ed714689ec4addd171a769be94 Mon Sep 17 00:00:00 2001 From: Kharif Date: Sat, 25 Jan 2025 20:18:56 +0100 Subject: [PATCH 05/18] synth fixed on_note_begin being called multiple times when dragging on a note --- examples/synth/src/main.rs | 2 ++ examples/synth/src/midi_keyboard.rs | 19 +++++++++++++--- examples/synth/src/synth.rs | 35 +++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index 78705fc..ab94aca 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -71,6 +71,8 @@ fn main() { ) { eprintln!("Failed to play source: {}", e); } + + println!("Note {:#?} pressed", note); }) .on_note_end(move |event| { let note = event.note; diff --git a/examples/synth/src/midi_keyboard.rs b/examples/synth/src/midi_keyboard.rs index 7056194..025762c 100644 --- a/examples/synth/src/midi_keyboard.rs +++ b/examples/synth/src/midi_keyboard.rs @@ -285,6 +285,7 @@ struct MidiKeyboardState { mouse_position: Option, mouse_dragging: bool, hovered_key: Option, + drag_pressed_keys: HashSet, } impl MidiKeyboardState { @@ -299,6 +300,7 @@ impl MidiKeyboardState { mouse_position: None, mouse_dragging: false, hovered_key: None, + drag_pressed_keys: HashSet::new(), } } @@ -528,6 +530,7 @@ impl MidiKeyboard { GestureState::Began => { if mouse_button == Some(MouseButton::Left) { cx[s].mouse_dragging = true; + cx[s].drag_pressed_keys.clear(); // Reset on drag start } } GestureState::Changed => { @@ -537,17 +540,27 @@ impl MidiKeyboard { } GestureState::Ended => { cx[s].mouse_dragging = false; + // Release all keys pressed during this drag + let keys_to_release = cx[s].drag_pressed_keys.clone(); + keys_to_release.into_iter().for_each(|key| { + let _ = cx[s].release_key(key); + }); + cx[s].drag_pressed_keys.clear(); } #[allow(unreachable_patterns)] _ => (), } - // Update key states if let Some(hovered_key) = cx[s].hovered_key { if cx[s].mouse_dragging { - if !cx[s].pressed_keys.contains(&hovered_key) { + // Check if the key is not pressed and hasn't been pressed during this drag + if !cx[s].pressed_keys.contains(&hovered_key) + && !cx[s].drag_pressed_keys.contains(&hovered_key) + { let default_velocity = cx[s].config.default_velocity; - let _ = cx[s].press_key(hovered_key, default_velocity); + if let Ok(()) = cx[s].press_key(hovered_key, default_velocity) { + cx[s].drag_pressed_keys.insert(hovered_key); + } } } else { if cx[s].pressed_keys.contains(&hovered_key) { diff --git a/examples/synth/src/synth.rs b/examples/synth/src/synth.rs index 5e1221d..0b3c6c4 100644 --- a/examples/synth/src/synth.rs +++ b/examples/synth/src/synth.rs @@ -61,12 +61,47 @@ impl Synth { // Start the envelope envelope.start(); + // Immediately set the initial volume + let now = Instant::now(); + let initial_volume = envelope.get_amplitude(now); + sink.set_volume(initial_volume); + // Store the sink and envelope self.audio_sources.insert(source_id, (sink, envelope)); Ok(()) } + // pub fn play_source( + // &mut self, + // audio_source: Box + Send>, + // source_id: u8, + // envelope: Option, + // ) -> Result<(), String> { + // // Remove existing source with the same ID to allow retriggering + // if self.audio_sources.contains_key(&source_id) { + // self.audio_sources.remove(&source_id); + // } + + // // Proceed to create and add the new source + // let sink = Sink::try_new(&self.stream_handle) + // .map_err(|e| format!("Failed to create audio sink: {}", e))?; + + // sink.append(audio_source); + + // let envelope_config = envelope.unwrap_or_else(|| self.default_envelope_config.clone()); + // let mut envelope = ADSREnvelope::new(envelope_config); + // envelope.start(); + + // let now = Instant::now(); + // let initial_volume = envelope.get_amplitude(now); + // sink.set_volume(initial_volume); + + // self.audio_sources.insert(source_id, (sink, envelope)); + + // Ok(()) + // } + /// Release a specific audio source pub fn release_source(&mut self, source_id: u8) -> Result<(), String> { self.audio_sources From 2d63b1bd6473fa480d47815f13aa12c82616289d Mon Sep 17 00:00:00 2001 From: Kharif Date: Thu, 30 Jan 2025 11:34:48 +0100 Subject: [PATCH 06/18] sync --- examples/synth/src/envelope.rs | 109 +++++++++++++++++++++++---------- examples/synth/src/main.rs | 8 +-- 2 files changed, 81 insertions(+), 36 deletions(-) diff --git a/examples/synth/src/envelope.rs b/examples/synth/src/envelope.rs index afc7c15..dac5222 100644 --- a/examples/synth/src/envelope.rs +++ b/examples/synth/src/envelope.rs @@ -1,3 +1,4 @@ +use std::cell::Cell; use std::time::{Duration, Instant}; /// Configuration for a standard ADSR (Attack, Decay, Sustain, Release) envelope @@ -66,67 +67,93 @@ impl ADSREnvelopeConfigBuilder { /// Concrete implementation of an ADSR envelope pub struct ADSREnvelope { config: ADSREnvelopeConfig, - start_time: Option, - release_start_time: Option, + start_time: Cell>, + release_start_time: Cell>, + release_start_amplitude: Cell, } impl ADSREnvelope { pub fn new(config: ADSREnvelopeConfig) -> Self { Self { config, - start_time: None, - release_start_time: None, + start_time: Cell::new(None), + release_start_time: Cell::new(None), + release_start_amplitude: Cell::new(0.0), } } - pub fn start(&mut self) { - self.start_time = Some(Instant::now()); - self.release_start_time = None; + pub fn start(&self) { + self.start_time.set(None); + self.release_start_time.set(None); + self.release_start_amplitude.set(0.0); } - pub fn release(&mut self) { - if let Some(start_time) = self.start_time { - if self.release_start_time.is_none() { - self.release_start_time = Some(Instant::now()); - } + pub fn release(&self) { + if self.start_time.get().is_some() && self.release_start_time.get().is_none() { + let now = Instant::now(); + self.release_start_time.set(Some(now)); + self.release_start_amplitude + .set(self.get_amplitude_internal(now, false)); } } pub fn get_amplitude(&self, now: Instant) -> f32 { - // Require start_time to be set - let Some(start_time) = self.start_time else { - return 0.0; + self.get_amplitude_internal(now, true) + } + + fn get_amplitude_internal(&self, now: Instant, clamp: bool) -> f32 { + // Set start_time if not set + let start_time = match self.start_time.get() { + Some(st) => st, + None => { + self.start_time.set(Some(now)); + return 0.0; + } }; let elapsed = now.duration_since(start_time); // Determine if in release phase - let is_releasing = self.release_start_time.is_some(); + let is_releasing = self.release_start_time.get().is_some(); match (elapsed, is_releasing) { // Attack phase: Linear ramp from 0 to 1 (t, false) if t < self.config.attack => { - (t.as_secs_f32() / self.config.attack.as_secs_f32()).clamp(0.0, 1.0) + let amp = t.as_secs_f32() / self.config.attack.as_secs_f32(); + if clamp { + amp.clamp(0.0, 1.0) + } else { + amp + } } // Decay phase: Linear ramp from 1 to sustain level (t, false) if t < self.config.attack + self.config.decay => { let decay_progress = (t - self.config.attack).as_secs_f32() / self.config.decay.as_secs_f32(); - (1.0 - decay_progress * (1.0 - self.config.sustain_level)) - .clamp(self.config.sustain_level, 1.0) + let amp = 1.0 - decay_progress * (1.0 - self.config.sustain_level); + if clamp { + amp.clamp(self.config.sustain_level, 1.0) + } else { + amp + } } - // Release phase: Linear ramp from sustain level to 0 + // Release phase: Linear ramp from current amplitude to 0 (_, true) => { - let Some(release_start) = self.release_start_time else { + let Some(release_start) = self.release_start_time.get() else { return self.config.sustain_level; }; let release_time = now.duration_since(release_start); - (self.config.sustain_level - * (1.0 - release_time.as_secs_f32() / self.config.release.as_secs_f32())) - .clamp(0.0, self.config.sustain_level) + let release_progress = + release_time.as_secs_f32() / self.config.release.as_secs_f32(); + let amp = self.release_start_amplitude.get() * (1.0 - release_progress); + if clamp { + amp.clamp(0.0, self.release_start_amplitude.get()) + } else { + amp + } } // Sustain phase @@ -135,9 +162,8 @@ impl ADSREnvelope { } pub fn is_finished(&self, now: Instant) -> bool { - // Envelope is finished if in release phase and release duration has passed - match (self.start_time, self.release_start_time) { - (Some(start), Some(release_start)) => { + match (self.start_time.get(), self.release_start_time.get()) { + (Some(_), Some(release_start)) => { now.duration_since(release_start) >= self.config.release } _ => false, @@ -159,14 +185,19 @@ mod tests { .build() .unwrap(); - let mut envelope = ADSREnvelope::new(config); + let envelope = ADSREnvelope::new(config); // Start the envelope envelope.start(); - // Immediately after start - amplitude should be 0 + // Check amplitude immediately after start (should be near 0.0) let start = Instant::now(); - assert_eq!(envelope.get_amplitude(start), 0.0); + let initial_amplitude = envelope.get_amplitude(start); + assert!( + initial_amplitude < 1e-5, + "Initial amplitude should be near 0.0, got {}", + initial_amplitude + ); // Simulate partial attack phase let mid_attack = start + Duration::from_millis(50); @@ -178,6 +209,22 @@ mod tests { // Simulate full attack phase completion let end_attack = start + Duration::from_millis(100); - assert_eq!(envelope.get_amplitude(end_attack), 1.0); + let amplitude = envelope.get_amplitude(end_attack); + assert!( + (amplitude - 1.0).abs() < 1e-5, + "Amplitude at end of attack should be approximately 1.0, got {}", + amplitude + ); + + // Test release during decay phase + let mid_decay = start + Duration::from_millis(125); + envelope.release(); + let release_start = envelope.release_start_time.get().unwrap(); + let release_progress = mid_decay.duration_since(release_start); + let amplitude = envelope.get_amplitude(mid_decay); + assert!( + amplitude < 1.0 && amplitude > 0.0, + "Amplitude should start from current level and release" + ); } } diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index ab94aca..b0d7c0a 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -23,9 +23,9 @@ fn main() { // Create a custom envelope configuration let custom_envelope = ADSREnvelopeConfig::builder() .attack(Duration::from_millis(1000)) - .decay(Duration::from_millis(50)) + .decay(Duration::from_millis(100)) .sustain(0.6) - .release(Duration::from_millis(100)) + .release(Duration::from_millis(1000)) .build() .expect("Failed to create envelope configuration"); @@ -58,7 +58,7 @@ fn main() { let frequency: MidiFrequency = note.frequency(); // Create an audio source with a sawtooth wave - let audio_source = Oscillator::square(frequency); + let audio_source = Oscillator::sine(frequency); // Get the note ID let source_id: MidiNoteId = note.id(); @@ -71,8 +71,6 @@ fn main() { ) { eprintln!("Failed to play source: {}", e); } - - println!("Note {:#?} pressed", note); }) .on_note_end(move |event| { let note = event.note; From c8dc7b7582628a12451af7bd3851c06b42a13cb7 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 12:08:26 +0100 Subject: [PATCH 07/18] synth example fix --- examples/synth/src/main.rs | 77 +- examples/synth/src/midi_keyboard.rs | 23 +- examples/synth/src/synth/mod.rs | 120 + examples/synth/src/{ => synth}/oscillator.rs | 0 examples/synth/{src => trash/new}/envelope.rs | 0 examples/synth/trash/new/main.rs | 86 + examples/synth/trash/new/midi_keyboard.rs | 629 ++ examples/synth/trash/new/oscillator.rs | 285 + examples/synth/{src => trash/new}/synth.rs | 4 +- examples/synth/trash/old/osc.rs | 8416 +++++++++++++++++ examples/synth/trash/old/oscillator.rs | 127 + 11 files changed, 9693 insertions(+), 74 deletions(-) create mode 100644 examples/synth/src/synth/mod.rs rename examples/synth/src/{ => synth}/oscillator.rs (100%) rename examples/synth/{src => trash/new}/envelope.rs (100%) create mode 100644 examples/synth/trash/new/main.rs create mode 100644 examples/synth/trash/new/midi_keyboard.rs create mode 100644 examples/synth/trash/new/oscillator.rs rename examples/synth/{src => trash/new}/synth.rs (98%) create mode 100644 examples/synth/trash/old/osc.rs create mode 100644 examples/synth/trash/old/oscillator.rs diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index b0d7c0a..493a4df 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -1,86 +1,55 @@ -use std::sync::{Arc, Mutex}; -use std::time::Duration; - +use rodio::source::Source; use rodio::OutputStream; +use std::sync::{Arc, Mutex}; -mod envelope; mod midi_keyboard; -mod oscillator; mod synth; -use envelope::ADSREnvelopeConfig; use midi_keyboard::{MidiFrequency, MidiKeyboard, MidiNoteId}; -use oscillator::Oscillator; -use synth::Synth; +use synth::{Oscillator, Synth}; -use rui::Run; +use rui::*; fn main() { - // Create the audio output stream - let (_stream, stream_handle) = - OutputStream::try_default().expect("Failed to create output stream"); - - // Create a custom envelope configuration - let custom_envelope = ADSREnvelopeConfig::builder() - .attack(Duration::from_millis(1000)) - .decay(Duration::from_millis(100)) - .sustain(0.6) - .release(Duration::from_millis(1000)) - .build() - .expect("Failed to create envelope configuration"); - - // Initialize the advanced synthesizer with custom default envelope - let synth = Arc::new(Mutex::new(Synth::new(stream_handle, Some(custom_envelope)))); + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); + let synth = Arc::new(Mutex::new(Synth::new(stream_handle))); + let synth_clone = synth.clone(); + let synth_clone_update = synth.clone(); - // Clone synthesizer references for different threads - let synth_update = synth.clone(); - let synth_note_begin = synth.clone(); - let synth_note_end = synth.clone(); - - // Spawn a dedicated thread for continuous synth updates - std::thread::spawn(move || { - loop { - synth_update.lock().unwrap().update(); - std::thread::sleep(Duration::from_millis(10)); // Prevent tight spinning - } + std::thread::spawn(move || loop { + synth_clone_update.lock().unwrap().update(); }); - // Configure MIDI keyboard + // Create and configure the MIDI keyboard MidiKeyboard::new() .num_keys(25) .start_octave(4) .max_simultaneous_keys(5) .on_note_begin(move |event| { let note = event.note; - let mut synth = synth_note_begin.lock().unwrap(); - // Get the frequency of the pressed note + let mut synth = synth.lock().unwrap(); + + // Get the frequency of the note. let frequency: MidiFrequency = note.frequency(); - // Create an audio source with a sawtooth wave - let audio_source = Oscillator::sine(frequency); + // Create an audio source for the note. + let audio_source = Oscillator::sawtooth(frequency).amplify(1.0); - // Get the note ID + // Get the note id (u8) if you need it. 0 is the lowest note. 127 is the highest note. let source_id: MidiNoteId = note.id(); - // Play the source with optional custom envelope - if let Err(e) = synth.play_source( - Box::new(audio_source), - source_id, - None, // Use default envelope - ) { - eprintln!("Failed to play source: {}", e); - } + // Send the audio source to the synth. + synth.play_source(Box::new(audio_source), source_id); }) .on_note_end(move |event| { let note = event.note; - let mut synth = synth_note_end.lock().unwrap(); - let source_id: MidiNoteId = note.id(); - if let Err(e) = synth.release_source(source_id) { - eprintln!("Failed to release source: {}", e); - } + let mut synth = synth_clone.lock().unwrap(); + let source_id: MidiNoteId = note.id(); + synth.release_source(source_id); }) .show() + // .size([400.0, 200.0]) .run(); } diff --git a/examples/synth/src/midi_keyboard.rs b/examples/synth/src/midi_keyboard.rs index 025762c..371e16b 100644 --- a/examples/synth/src/midi_keyboard.rs +++ b/examples/synth/src/midi_keyboard.rs @@ -285,7 +285,6 @@ struct MidiKeyboardState { mouse_position: Option, mouse_dragging: bool, hovered_key: Option, - drag_pressed_keys: HashSet, } impl MidiKeyboardState { @@ -300,7 +299,6 @@ impl MidiKeyboardState { mouse_position: None, mouse_dragging: false, hovered_key: None, - drag_pressed_keys: HashSet::new(), } } @@ -525,42 +523,31 @@ impl MidiKeyboard { cx[s].hovered_key = hovered_key_idx; }) - .drag(move |cx, offset, gesture_state, mouse_button| { + .drag_p(move |cx, local_position, gesture_state, mouse_button| { match gesture_state { GestureState::Began => { if mouse_button == Some(MouseButton::Left) { cx[s].mouse_dragging = true; - cx[s].drag_pressed_keys.clear(); // Reset on drag start } } GestureState::Changed => { if cx[s].mouse_position.is_some() { - cx[s].mouse_position = Some(cx[s].mouse_position.unwrap() + offset); + cx[s].mouse_position = Some(local_position); } } GestureState::Ended => { cx[s].mouse_dragging = false; - // Release all keys pressed during this drag - let keys_to_release = cx[s].drag_pressed_keys.clone(); - keys_to_release.into_iter().for_each(|key| { - let _ = cx[s].release_key(key); - }); - cx[s].drag_pressed_keys.clear(); } #[allow(unreachable_patterns)] _ => (), } + // Update key states if let Some(hovered_key) = cx[s].hovered_key { if cx[s].mouse_dragging { - // Check if the key is not pressed and hasn't been pressed during this drag - if !cx[s].pressed_keys.contains(&hovered_key) - && !cx[s].drag_pressed_keys.contains(&hovered_key) - { + if !cx[s].pressed_keys.contains(&hovered_key) { let default_velocity = cx[s].config.default_velocity; - if let Ok(()) = cx[s].press_key(hovered_key, default_velocity) { - cx[s].drag_pressed_keys.insert(hovered_key); - } + let _ = cx[s].press_key(hovered_key, default_velocity); } } else { if cx[s].pressed_keys.contains(&hovered_key) { diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs new file mode 100644 index 0000000..742c2a0 --- /dev/null +++ b/examples/synth/src/synth/mod.rs @@ -0,0 +1,120 @@ +use std::collections::HashMap; +use std::time::Instant; + +use rodio::source::Source; +use rodio::Sink; + +mod oscillator; +pub use oscillator::Oscillator; + +// The envelope state struct +struct EnvelopeState { + envelope: Envelope, + start_time: Instant, + is_releasing: bool, + release_start_time: Option, +} + +// The envelope struct +struct Envelope { + attack: f32, + decay: f32, + sustain: f32, + release: f32, +} + +impl Envelope { + fn new(attack: f32, decay: f32, sustain: f32, release: f32) -> Envelope { + Envelope { + attack, + decay, + sustain, + release, + } + } +} + +pub struct Synth { + audio_sinks: HashMap, + envelope_states: HashMap, + stream_handle: rodio::OutputStreamHandle, +} + +impl Synth { + pub fn new(stream_handle: rodio::OutputStreamHandle) -> Synth { + // let (_stream, stream_handle) = rodio::OutputStream::try_default().unwrap(); + // For some reason the above code would fail if it was in the new function + + Synth { + audio_sinks: HashMap::new(), + envelope_states: HashMap::new(), + stream_handle, + } + } + + pub fn play_source(&mut self, audio_source: Box + Send>, source_id: u8) { + let sink = Sink::try_new(&self.stream_handle).expect("Failed to create sink"); + sink.append(audio_source); + + let envelope = Envelope::new(0.7, 0.2, 0.7, 1.3); // example envelope + let envelope_state = EnvelopeState { + envelope, + start_time: Instant::now(), + is_releasing: false, + release_start_time: None, + }; + + self.audio_sinks.insert(source_id, sink); + self.envelope_states.insert(source_id, envelope_state); + } + + pub fn release_source(&mut self, source_id: u8) { + if let Some(envelope_state) = self.envelope_states.get_mut(&source_id) { + envelope_state.is_releasing = true; + envelope_state.release_start_time = Some(Instant::now()); + } + } + + pub fn update(&mut self) { + let now = Instant::now(); + + let mut to_remove = Vec::new(); + + for (source_id, envelope_state) in self.envelope_states.iter_mut() { + let elapsed = now.duration_since(envelope_state.start_time).as_secs_f32(); + + let envelope = &envelope_state.envelope; + let sink = self.audio_sinks.get_mut(source_id).unwrap(); + + let volume = if elapsed < envelope.attack { + // Attack + elapsed / envelope.attack + } else if elapsed < envelope.attack + envelope.decay { + // Decay + 1.0 - (elapsed - envelope.attack) / envelope.decay * (1.0 - envelope.sustain) + } else if envelope_state.is_releasing { + // Release + let elapsed_since_released = now + .duration_since(envelope_state.release_start_time.unwrap()) + .as_secs_f32(); + envelope.sustain - elapsed_since_released / envelope.release * envelope.sustain + } else { + // Sustain + envelope.sustain + }; + + sink.set_volume(volume); + + if envelope_state.is_releasing && elapsed > envelope.release { + // This is done as a separate step to avoid a second mutable borrow of self.envelope_states + // First borrow is when .iter_mut() is called, second is when .remove() is called + to_remove.push(*source_id); + } + } + + for source_id in to_remove { + self.envelope_states.remove(&source_id); + self.audio_sinks.remove(&source_id); + } + } +} diff --git a/examples/synth/src/oscillator.rs b/examples/synth/src/synth/oscillator.rs similarity index 100% rename from examples/synth/src/oscillator.rs rename to examples/synth/src/synth/oscillator.rs diff --git a/examples/synth/src/envelope.rs b/examples/synth/trash/new/envelope.rs similarity index 100% rename from examples/synth/src/envelope.rs rename to examples/synth/trash/new/envelope.rs diff --git a/examples/synth/trash/new/main.rs b/examples/synth/trash/new/main.rs new file mode 100644 index 0000000..6c83228 --- /dev/null +++ b/examples/synth/trash/new/main.rs @@ -0,0 +1,86 @@ +use std::sync::{Arc, Mutex}; +use std::time::Duration; + +use rodio::OutputStream; + +mod envelope; +mod midi_keyboard; +mod oscillator; +mod synth; + +use envelope::ADSREnvelopeConfig; +use midi_keyboard::{MidiFrequency, MidiKeyboard, MidiNoteId}; +use oscillator::Oscillator; +use synth::Synth; + +use rui::Run; + +fn main() { + // Create the audio output stream + let (_stream, stream_handle) = + OutputStream::try_default().expect("Failed to create output stream"); + + // Create a custom envelope configuration + let custom_envelope = ADSREnvelopeConfig::builder() + .attack(Duration::from_millis(1000)) + .decay(Duration::from_millis(100)) + .sustain(0.6) + .release(Duration::from_millis(1000)) + .build() + .expect("Failed to create envelope configuration"); + + // Initialize the advanced synthesizer with custom default envelope + let synth = Arc::new(Mutex::new(Synth::new(stream_handle, Some(custom_envelope)))); + + // Clone synthesizer references for different threads + let synth_update = synth.clone(); + let synth_note_begin = synth.clone(); + let synth_note_end = synth.clone(); + + // Spawn a dedicated thread for continuous synth updates + std::thread::spawn(move || { + loop { + synth_update.lock().unwrap().update(); + // std::thread::sleep(Duration::from_millis(1)); // Prevent tight spinning + } + }); + + // Configure MIDI keyboard + MidiKeyboard::new() + .num_keys(25) + .start_octave(4) + .max_simultaneous_keys(5) + .on_note_begin(move |event| { + let note = event.note; + let mut synth = synth_note_begin.lock().unwrap(); + + // Get the frequency of the pressed note + let frequency: MidiFrequency = note.frequency(); + + // Create an audio source with a sawtooth wave + let audio_source = Oscillator::sine(frequency); + + // Get the note ID + let source_id: MidiNoteId = note.id(); + + // Play the source with optional custom envelope + if let Err(e) = synth.play_source( + Box::new(audio_source), + source_id, + None, // Use default envelope + ) { + eprintln!("Failed to play source: {}", e); + } + }) + .on_note_end(move |event| { + let note = event.note; + let mut synth = synth_note_end.lock().unwrap(); + let source_id: MidiNoteId = note.id(); + + if let Err(e) = synth.release_source(source_id) { + eprintln!("Failed to release source: {}", e); + } + }) + .show() + .run(); +} diff --git a/examples/synth/trash/new/midi_keyboard.rs b/examples/synth/trash/new/midi_keyboard.rs new file mode 100644 index 0000000..025762c --- /dev/null +++ b/examples/synth/trash/new/midi_keyboard.rs @@ -0,0 +1,629 @@ +use core::f32; +use std::collections::HashSet; +use std::convert::TryFrom; +use std::sync::Arc; +use std::time::Instant; + +use rui::*; + +/// Type alias for MIDI note identifiers (0-127) +pub type MidiNoteId = u8; + +/// Type alias for MIDI note frequencies in Hz +pub type MidiFrequency = f32; + +/// Represents a MIDI note type (C, C#, D, etc.) without octave information +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum MidiNoteKind { + C, + CSharp, + D, + DSharp, + E, + F, + FSharp, + G, + GSharp, + A, + ASharp, + B, +} + +/// Extension methods for MIDI note conversion and manipulation +#[allow(dead_code)] +pub trait MidiNoteIdMethods { + /// Converts a MIDI note ID to a complete MIDI note with note type and octave + fn as_note(&self) -> MidiNote; + + /// Extracts the note type from a MIDI note ID + fn as_note_kind(&self) -> MidiNoteKind; + + /// Calculates the frequency in Hz for the given MIDI note ID + fn as_frequency(&self) -> MidiFrequency; +} + +impl MidiNoteIdMethods for MidiNoteId { + fn as_note(&self) -> MidiNote { + let note = MidiNoteKind::try_from(*self % 12).unwrap(); + let octave = *self / 12; + MidiNote::new(note, octave) + } + + fn as_note_kind(&self) -> MidiNoteKind { + self.as_note().note + } + + fn as_frequency(&self) -> MidiFrequency { + self.as_note().frequency() + } +} + +impl MidiNoteKind { + /// Converts the MIDI note type to its corresponding MIDI note identifier + pub fn to_midi_note_id(&self) -> MidiNoteId { + match self { + MidiNoteKind::C => 0, + MidiNoteKind::CSharp => 1, + MidiNoteKind::D => 2, + MidiNoteKind::DSharp => 3, + MidiNoteKind::E => 4, + MidiNoteKind::F => 5, + MidiNoteKind::FSharp => 6, + MidiNoteKind::G => 7, + MidiNoteKind::GSharp => 8, + MidiNoteKind::A => 9, + MidiNoteKind::ASharp => 10, + MidiNoteKind::B => 11, + } + } +} + +impl TryFrom for MidiNoteKind { + type Error = (); + + fn try_from(value: MidiNoteId) -> Result { + match value % 12 { + 0 => Ok(MidiNoteKind::C), + 1 => Ok(MidiNoteKind::CSharp), + 2 => Ok(MidiNoteKind::D), + 3 => Ok(MidiNoteKind::DSharp), + 4 => Ok(MidiNoteKind::E), + 5 => Ok(MidiNoteKind::F), + 6 => Ok(MidiNoteKind::FSharp), + 7 => Ok(MidiNoteKind::G), + 8 => Ok(MidiNoteKind::GSharp), + 9 => Ok(MidiNoteKind::A), + 10 => Ok(MidiNoteKind::ASharp), + 11 => Ok(MidiNoteKind::B), + _ => Err(()), + } + } +} + +/// Represents a complete MIDI note combining note type and octave +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct MidiNote { + /// The type of note (C, C#, D, etc.) + pub note: MidiNoteKind, + /// The octave number (0-10, where 4 contains middle C) + pub octave: u8, +} + +impl MidiNote { + /// Creates a new MIDI note with the specified note type and octave + /// + /// # Arguments + /// * `note` - The type of note (C, C#, D, etc.) + /// * `octave` - The octave number (0-10) + /// + /// # Returns + /// A new MidiNote instance + pub fn new(note: MidiNoteKind, octave: u8) -> Self { + assert!(octave <= 10, "Octave must be between 0 and 10"); + + Self { note, octave } + } + + /// Returns the MIDI note one octave lower + pub fn lower_octave(&self) -> Self { + Self { + note: self.note, + octave: self.octave.saturating_sub(1), + } + } + + /// Returns the MIDI note one octave higher + pub fn higher_octave(&self) -> Self { + Self { + note: self.note, + octave: (self.octave + 1).min(10), + } + } + + /// Returns the MIDI note one semitone lower + pub fn lower_semitone(&self) -> Self { + match self.note { + MidiNoteKind::C => Self { + note: MidiNoteKind::B, + octave: self.octave.saturating_sub(1), + }, + _ => Self { + note: MidiNoteKind::try_from(self.note as MidiNoteId - 1).unwrap(), + octave: self.octave, + }, + } + } + + /// Returns the MIDI note one semitone higher + pub fn higher_semitone(&self) -> Self { + match self.note { + MidiNoteKind::B => Self { + note: MidiNoteKind::C, + octave: (self.octave + 1).min(10), + }, + _ => Self { + note: MidiNoteKind::try_from(self.note as MidiNoteId + 1).unwrap(), + octave: self.octave, + }, + } + } + + /// Calculates the audio frequency of the MIDI note in Hz + pub fn frequency(&self) -> MidiFrequency { + 440.0 * f32::powf(2.0, (self.id() as f32 - 69.0) / 12.0) + } + + /// Returns the MIDI note identifier (0-127) + pub fn id(&self) -> MidiNoteId { + let note_id = self.note.to_midi_note_id(); + self.octave * 12 + note_id + } +} + +/// MIDI note event with velocity and timestamp +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct MidiNoteEvent { + /// The MIDI note details + pub note: MidiNote, + /// Note velocity (0-127) + pub velocity: MidiNoteId, + /// Timestamp of the note event + pub timestamp: Instant, +} + +/// Configuration builder for MIDI keyboard with advanced customization options +#[derive(Clone)] +pub struct MidiKeyboardConfig { + start_octave: MidiNoteId, + num_keys: MidiNoteId, + max_simultaneous_keys: u8, + default_velocity: u8, + note_begin_handler: Option>, + note_end_handler: Option>, +} + +impl MidiKeyboardConfig { + /// Creates a new MIDI keyboard configuration with default settings + /// + /// Default configuration: + /// - Start octave: 4 (middle C) + /// - Number of keys: 25 + /// - Maximum simultaneous keys: 10 + /// - No note begin/end handlers + pub fn new() -> Self { + Self { + start_octave: 4, + num_keys: 25, + max_simultaneous_keys: 10, + default_velocity: 127, + note_begin_handler: None, + note_end_handler: None, + } + } + + /// Sets the starting octave for the keyboard + /// + /// # Arguments + /// * `octave` - Octave to start from (0-10) + pub fn start_octave(mut self, octave: MidiNoteId) -> Self { + self.start_octave = octave.clamp(0, 10); + self + } + + /// Sets the total number of keys on the keyboard + /// + /// # Arguments + /// * `keys` - Number of keys (1-88) + pub fn num_keys(mut self, keys: MidiNoteId) -> Self { + self.num_keys = keys.clamp(1, 88); + self + } + + /// Sets the maximum number of keys that can be pressed simultaneously + /// + /// # Arguments + /// * `max_keys` - Maximum number of simultaneous key presses + pub fn max_simultaneous_keys(mut self, max_keys: MidiNoteId) -> Self { + self.max_simultaneous_keys = max_keys; + self + } + + /// Sets a handler for when a note begins (key press) + /// + /// # Arguments + /// * `handler` - Callback function for note begin events + pub fn on_note_begin( + mut self, + handler: impl Fn(MidiNoteEvent) + Send + Sync + 'static, + ) -> Self { + self.note_begin_handler = Some(Arc::new(handler)); + self + } + + /// Sets a handler for when a note ends (key release) + /// + /// # Arguments + /// * `handler` - Callback function for note end events + pub fn on_note_end(mut self, handler: impl Fn(MidiNoteEvent) + Send + Sync + 'static) -> Self { + self.note_end_handler = Some(Arc::new(handler)); + self + } + + /// Renders and displays the MIDI keyboard + pub fn show(self) -> impl View { + MidiKeyboard::show(self) + } +} + +/// Keyboard state management with advanced features +struct MidiKeyboardState { + keys: Vec>, + pressed_keys: HashSet, + config: MidiKeyboardConfig, + last_interaction: Instant, + keyboard_layout: Vec<(f32, f32, bool)>, // (x, width, is_black_key) + mouse_position: Option, + mouse_dragging: bool, + hovered_key: Option, + drag_pressed_keys: HashSet, +} + +impl MidiKeyboardState { + fn new(config: MidiKeyboardConfig) -> Self { + let keyboard_layout = Self::calculate_keyboard_layout(config.num_keys); + Self { + keys: vec![None; config.num_keys as usize], + pressed_keys: HashSet::new(), + config, + last_interaction: Instant::now(), + keyboard_layout, + mouse_position: None, + mouse_dragging: false, + hovered_key: None, + drag_pressed_keys: HashSet::new(), + } + } + + fn calculate_keyboard_layout(num_keys: MidiNoteId) -> Vec<(f32, f32, bool)> { + let mut layout = Vec::new(); + let mut white_key_count = 0; + let black_key_positions = [1, 3, 6, 8, 10]; // Relative positions of black keys + + for key_pos in 0..num_keys { + let key_in_octave = key_pos % 12; + + let is_black_key = black_key_positions.contains(&key_in_octave); + let x = if is_black_key { + // Precise black key positioning + white_key_count as f32 - 0.3 + } else { + let current_white_key = white_key_count; + white_key_count += 1; + current_white_key as f32 + }; + + layout.push(( + x, + if is_black_key { 0.6 } else { 1.0 }, // Narrower black keys + is_black_key, + )); + } + + layout + } + + fn num_white_keys(&self) -> usize { + self.keyboard_layout + .iter() + .filter(|&&(_, _, is_black_key)| !is_black_key) + .count() + } + + fn press_key(&mut self, index: MidiNoteId, velocity: MidiNoteId) -> Result<(), &'static str> { + if self.pressed_keys.len() as MidiNoteId >= self.config.max_simultaneous_keys { + // Release the oldest key to make room for the new one + let oldest_key = self + .keys + .iter() + .enumerate() + .filter_map(|(idx, key)| key.map(|_| idx as MidiNoteId)) + .min_by_key(|&idx| self.keys[idx as usize].unwrap().timestamp) + .unwrap(); + + let _ = self.release_key(oldest_key); + } + + if self.pressed_keys.contains(&index) { + return Err("Key already pressed"); + } + + let note_event = MidiNoteEvent { + note: self.calculate_note_for_index(index as usize), + velocity, + timestamp: Instant::now(), + }; + + self.keys[index as usize] = Some(note_event); + self.pressed_keys.insert(index); + self.last_interaction = Instant::now(); + + if let Some(handler) = &self.config.note_begin_handler { + handler(note_event); + } + + Ok(()) + } + + fn release_key(&mut self, index: MidiNoteId) -> Result<(), &'static str> { + if let Some(note_event) = self.keys[index as usize].take() { + self.pressed_keys.remove(&index); + self.last_interaction = Instant::now(); + + if let Some(handler) = &self.config.note_end_handler { + handler(note_event); + } + + Ok(()) + } else { + Err("No active key to release") + } + } + + fn calculate_note_for_index(&self, index: usize) -> MidiNote { + let note_kind = MidiNoteKind::try_from((index % 12) as MidiNoteId).unwrap(); + let octave = self.config.start_octave + (index / 12) as MidiNoteId; + MidiNote::new(note_kind, octave) + } + + fn release_not_pressed_keys(&mut self) { + let now = Instant::now(); + let release_time = now - self.last_interaction; + + let release_keys = self + .keys + .iter() + .enumerate() + .filter_map(|(idx, key)| { + if let Some(note_event) = key { + if now - note_event.timestamp > release_time { + Some(idx as MidiNoteId) + } else { + None + } + } else { + None + } + }) + .collect::>(); + + for key in release_keys { + let _ = self.release_key(key); + } + } +} + +/// Primary MIDI keyboard implementation +pub struct MidiKeyboard; + +impl MidiKeyboard { + /// Creates a new MIDI keyboard configuration with default settings + /// + /// Equivalent to `MidiKeyboardConfig::new()` + pub fn new() -> MidiKeyboardConfig { + MidiKeyboardConfig::new() + } + + /// Renders the MIDI keyboard based on the provided configuration + /// + /// # Arguments + /// * `config` - Configuration for the MIDI keyboard + pub fn show(config: MidiKeyboardConfig) -> impl View { + state( + move || MidiKeyboardState::new(config.clone()), + |s, _| { + canvas(move |cx, rect, vger| { + let total_white_keys = cx[s].num_white_keys(); + let white_key_width = rect.width() / total_white_keys as f32; + let key_height = rect.height(); + let black_key_height = key_height * 0.6; + + let mut hovered_key_idx: Option = None; + + // Calculate hovered key + if let Some(mouse_position) = cx[s].mouse_position { + for (index, (x, width, is_black_key)) in + cx[s].keyboard_layout.iter().enumerate() + { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + let key_y = if *is_black_key { + key_height - black_key_height + } else { + 0.0 + }; + let key_height_check = if *is_black_key { + black_key_height + } else { + key_height + }; + + if mouse_position.x >= key_x + && mouse_position.x <= key_x + key_width + && mouse_position.y >= key_y + && mouse_position.y <= key_y + key_height_check + { + // Prioritize black keys (they're rendered on top) + if *is_black_key { + hovered_key_idx = Some(index as MidiNoteId); + break; + } else if hovered_key_idx.is_none() { + hovered_key_idx = Some(index as MidiNoteId); + } + } + } + } + + // Draw white keys first (underneath) + for (index, (x, width, is_black_key)) in + cx[s].keyboard_layout.iter().enumerate() + { + if !is_black_key { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + + Self::draw_white_key( + vger, + key_x, + 0.0, + key_width, + key_height, + cx[s].keys[index].is_some(), + hovered_key_idx == Some(index as MidiNoteId), + ); + } + } + + // Draw black keys on top + for (index, (x, width, is_black_key)) in + cx[s].keyboard_layout.iter().enumerate() + { + if *is_black_key { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + + Self::draw_black_key( + vger, + key_x, + key_height - black_key_height, + key_width, + black_key_height, + cx[s].keys[index].is_some(), + hovered_key_idx == Some(index as MidiNoteId), + ); + } + } + + cx[s].hovered_key = hovered_key_idx; + }) + .drag(move |cx, offset, gesture_state, mouse_button| { + match gesture_state { + GestureState::Began => { + if mouse_button == Some(MouseButton::Left) { + cx[s].mouse_dragging = true; + cx[s].drag_pressed_keys.clear(); // Reset on drag start + } + } + GestureState::Changed => { + if cx[s].mouse_position.is_some() { + cx[s].mouse_position = Some(cx[s].mouse_position.unwrap() + offset); + } + } + GestureState::Ended => { + cx[s].mouse_dragging = false; + // Release all keys pressed during this drag + let keys_to_release = cx[s].drag_pressed_keys.clone(); + keys_to_release.into_iter().for_each(|key| { + let _ = cx[s].release_key(key); + }); + cx[s].drag_pressed_keys.clear(); + } + #[allow(unreachable_patterns)] + _ => (), + } + + if let Some(hovered_key) = cx[s].hovered_key { + if cx[s].mouse_dragging { + // Check if the key is not pressed and hasn't been pressed during this drag + if !cx[s].pressed_keys.contains(&hovered_key) + && !cx[s].drag_pressed_keys.contains(&hovered_key) + { + let default_velocity = cx[s].config.default_velocity; + if let Ok(()) = cx[s].press_key(hovered_key, default_velocity) { + cx[s].drag_pressed_keys.insert(hovered_key); + } + } + } else { + if cx[s].pressed_keys.contains(&hovered_key) { + let _ = cx[s].release_key(hovered_key); + } + } + } + cx[s].release_not_pressed_keys(); + }) + .hover_p(move |cx, hover_position| { + cx[s].mouse_position = Some(hover_position); + }) + .hover(move |cx, is_hovering| { + if !is_hovering { + cx[s].mouse_position = None; + } + }) + }, + ) + } + + // Draw methods remain the same as in the original implementation + fn draw_white_key( + vger: &mut Vger, + x: f32, + y: f32, + width: f32, + height: f32, + held: bool, + hovered: bool, + ) { + let color = if held { + vger::Color::new(0.8, 0.8, 0.8, 1.0) + } else if hovered { + vger::Color::new(0.85, 0.85, 0.85, 1.0) + } else { + vger::Color::new(1.0, 1.0, 1.0, 1.0) // Pure white for more realistic look + }; + let paint_index = vger.color_paint(color); + let rect = LocalRect::new(LocalPoint::new(x, y), LocalSize::new(width, height)); + + vger.fill_rect(rect, 0.0, paint_index); + } + + fn draw_black_key( + vger: &mut Vger, + x: f32, + y: f32, + width: f32, + height: f32, + held: bool, + hovered: bool, + ) { + let base_color = vger::Color::new(0.1, 0.1, 0.1, 1.0); + let color = if held { + vger::Color::new(0.3, 0.3, 0.3, 1.0) + } else if hovered { + vger::Color::new(0.2, 0.2, 0.2, 1.0) + } else { + base_color + }; + let paint_index = vger.color_paint(color); + let rect = LocalRect::new(LocalPoint::new(x, y), LocalSize::new(width, height)); + vger.fill_rect(rect, 0.1 * width, paint_index); // Add rounded corners + } +} diff --git a/examples/synth/trash/new/oscillator.rs b/examples/synth/trash/new/oscillator.rs new file mode 100644 index 0000000..9e20770 --- /dev/null +++ b/examples/synth/trash/new/oscillator.rs @@ -0,0 +1,285 @@ +use std::f32::consts::PI; + +/// Represents different wave types for audio synthesis +#[derive(Clone, Debug)] +pub enum WaveType { + Sine, + Square, + Sawtooth, + Triangle, +} + +/// Configuration parameters for oscillator generation +#[derive(Clone, Debug)] +pub struct OscillatorConfig { + sample_rate: u32, + anti_aliasing: bool, + oversampling: usize, + zero_crossings: usize, + transition_start: f32, + transition_end: f32, +} + +impl Default for OscillatorConfig { + fn default() -> Self { + Self { + sample_rate: 48000, + anti_aliasing: true, + oversampling: 256, + zero_crossings: 16, + transition_start: 8000.0, + transition_end: 10000.0, + } + } +} + +impl OscillatorConfig { + /// Create a new configuration with custom parameters + pub fn new() -> Self { + Self::default() + } + + /// Set sample rate + pub fn sample_rate(mut self, rate: u32) -> Self { + self.sample_rate = rate; + self + } + + /// Enable or disable anti-aliasing + pub fn anti_aliasing(mut self, enabled: bool) -> Self { + self.anti_aliasing = enabled; + self + } + + /// Set oversampling rate + pub fn oversampling(mut self, rate: usize) -> Self { + self.oversampling = rate; + self + } + + /// Set number of zero crossings + pub fn zero_crossings(mut self, crossings: usize) -> Self { + self.zero_crossings = crossings; + self + } + + /// Set transition start frequency + pub fn transition_start(mut self, start: f32) -> Self { + self.transition_start = start; + self + } + + /// Set transition end frequency + pub fn transition_end(mut self, end: f32) -> Self { + self.transition_end = end; + self + } +} + +/// BLEP (Band-Limited Step) Table Builder +pub struct BlepTableBuilder { + oversampling: usize, + zero_crossings: usize, +} + +impl BlepTableBuilder { + /// Create a new builder with custom configuration + pub fn new() -> Self { + Self { + oversampling: 256, + zero_crossings: 16, + } + } + + /// Set the oversampling rate + pub fn oversampling(mut self, rate: usize) -> Self { + self.oversampling = rate; + self + } + + /// Set the number of zero crossings + pub fn zero_crossings(mut self, crossings: usize) -> Self { + self.zero_crossings = crossings; + self + } + + /// Generate the BLEP table with the current configuration + pub fn generate(self) -> Vec { + let blep_size = self.oversampling * self.zero_crossings * 2 + 1; + (0..blep_size) + .map(|i| { + let x = (i as f32 / blep_size as f32 - 0.5) * self.zero_crossings as f32; + if x == 0.0 { + 1.0 + } else { + x.sin() / (std::f32::consts::PI * x) + * (1.0 - (x / self.zero_crossings as f32).cos()) + } + }) + .collect() + } +} + +/// Advanced analog oscillator with high-quality wave generation +#[derive(Clone, Debug)] +pub struct AnalogOsc { + config: OscillatorConfig, + phase: f32, + nyquist: f32, + phase_increment: f32, + blep_table: Vec, +} + +impl AnalogOsc { + /// Create a new analog oscillator with custom configuration + pub fn new(config: OscillatorConfig) -> Self { + let nyquist = config.sample_rate as f32 / 2.0; + let blep_table = BlepTableBuilder::new() + .oversampling(config.oversampling) + .zero_crossings(config.zero_crossings) + .generate(); + + Self { + config, + phase: 0.0, + nyquist, + phase_increment: 0.0, + blep_table, + } + } + + /// Generate a sawtooth wave sample with optional anti-aliasing + pub fn generate_sawtooth(&mut self, frequency: f32) -> f32 { + let frequency = frequency.min(self.nyquist); + self.phase_increment = frequency / self.config.sample_rate as f32; + + let mut output = 2.0 * self.phase - 1.0; + + if self.config.anti_aliasing { + self.apply_blep(&mut output); + } + + self.phase += self.phase_increment; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + output + } + + /// Generate a square wave sample with optional anti-aliasing + pub fn generate_square(&mut self, frequency: f32, pulse_width: f32) -> f32 { + let frequency = frequency.min(self.nyquist); + self.phase_increment = frequency / self.config.sample_rate as f32; + + let pw = pulse_width.clamp(0.0, 1.0); + let mut output = if self.phase < pw { 1.0 } else { -1.0 }; + + if self.config.anti_aliasing { + self.apply_blep(&mut output); + } + + self.phase += self.phase_increment; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + output + } + + /// Apply band-limited step correction + fn apply_blep(&mut self, output: &mut f32) { + if self.phase < self.phase_increment { + let index = (self.phase / self.phase_increment * self.blep_table.len() as f32) as usize; + *output += self.blep_table.get(index).cloned().unwrap_or(0.0); + } + } +} + +/// Implements a flexible audio oscillator for different wave types +pub struct Oscillator { + freq: f32, + num_samples: usize, + wave_type: WaveType, + analog_osc: AnalogOsc, +} + +impl Oscillator { + /// Create oscillators for different wave types with default configuration + pub fn sine(freq: f32) -> Self { + Self::new(freq, WaveType::Sine, OscillatorConfig::default()) + } + + pub fn square(freq: f32) -> Self { + Self::new(freq, WaveType::Square, OscillatorConfig::default()) + } + + pub fn sawtooth(freq: f32) -> Self { + Self::new(freq, WaveType::Sawtooth, OscillatorConfig::default()) + } + + pub fn triangle(freq: f32) -> Self { + Self::new(freq, WaveType::Triangle, OscillatorConfig::default()) + } + + /// Create oscillators with custom configuration + pub fn new_with_config(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { + Oscillator { + freq, + num_samples: 0, + wave_type, + analog_osc: AnalogOsc::new(config), + } + } + + /// Internal constructor for oscillators + fn new(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { + Oscillator { + freq, + num_samples: 0, + wave_type, + analog_osc: AnalogOsc::new(config), + } + } +} + +impl Iterator for Oscillator { + type Item = f32; + + fn next(&mut self) -> Option { + self.num_samples = self.num_samples.wrapping_add(1); + + Some(match self.wave_type { + WaveType::Sine => (2.0 * PI * self.freq * self.num_samples as f32 + / self.analog_osc.config.sample_rate as f32) + .sin(), + WaveType::Square => self.analog_osc.generate_square(self.freq, 0.5), + WaveType::Sawtooth => self.analog_osc.generate_sawtooth(self.freq), + WaveType::Triangle => { + // Derive triangle wave from sine wave + let sin_val = (2.0 * PI * self.freq * self.num_samples as f32 + / self.analog_osc.config.sample_rate as f32) + .sin(); + sin_val.asin() * 2.0 / PI + } + }) + } +} + +impl rodio::Source for Oscillator { + fn current_frame_len(&self) -> Option { + None + } + + fn channels(&self) -> u16 { + 1 + } + + fn sample_rate(&self) -> u32 { + self.analog_osc.config.sample_rate + } + + fn total_duration(&self) -> Option { + None + } +} diff --git a/examples/synth/src/synth.rs b/examples/synth/trash/new/synth.rs similarity index 98% rename from examples/synth/src/synth.rs rename to examples/synth/trash/new/synth.rs index 0b3c6c4..bb351bc 100644 --- a/examples/synth/src/synth.rs +++ b/examples/synth/trash/new/synth.rs @@ -42,9 +42,9 @@ impl Synth { source_id: u8, envelope: Option, ) -> Result<(), String> { - // Check if source ID is already in use + // Remove existing source with the same ID to allow retriggering if self.audio_sources.contains_key(&source_id) { - return Err(format!("Source ID {} is already in use", source_id)); + self.audio_sources.remove(&source_id); } // Create a new sink diff --git a/examples/synth/trash/old/osc.rs b/examples/synth/trash/old/osc.rs new file mode 100644 index 0000000..19a5468 --- /dev/null +++ b/examples/synth/trash/old/osc.rs @@ -0,0 +1,8416 @@ + +use std::f32::consts::PI; + +#[derive(Clone, Debug)] +pub struct AnalogOsc { + sample_rate: usize, + nyquist: f32, + conv: f32, + phase: f32, + prev_sync: f32, + future: [f32; FUTURE_SIZE], + future_index: usize, + prev_output: f32, +} + +const OVERSAMPLING: usize = 256; +const ZERO_CROSSINGS: usize = 16; +const TRANSITION_START: f32 = 8000.0; +const TRANSITION_END: f32 = 10000.0; +const FUTURE_SIZE: usize = ZERO_CROSSINGS * 2; +const BLEP_SIZE: usize = OVERSAMPLING * ZERO_CROSSINGS * 2 + 1; + +impl AnalogOsc { + pub fn new() -> AnalogOsc { + AnalogOsc { + sample_rate: 0, + nyquist: 0.0, + conv: 0.0, + phase: 0.0, + prev_sync: 0.0, + future: [0.0; FUTURE_SIZE], + future_index: 0, + prev_output: 0.0, + } + } + + pub fn set_sample_rate(&mut self, n: usize) { + // Avoid a potential data race. + if self.sample_rate != n { + self.sample_rate = n; + self.nyquist = n as f32 / 2.0; + self.conv = 1.0 / self.sample_rate as f32; + } + } + + pub fn tick_saw(&mut self, f: f32, sync: f32, shape: f32) -> f32 { + let f = f.min(self.nyquist); + let shape = shape.clamp(0.0, 1.0); + + let rate = f * self.conv; + + let mut output = 0.0; + + // Advance phase. + self.phase += rate; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + // Sync. + if sync > 0.0 && self.prev_sync <= 0.0 { + // Estimate how long ago zero-crossing happened + // via linear interpolation and intersection + // with x-axis. + let frames_since = sync / (sync - self.prev_sync); + + // Reset phase. + self.phase = frames_since * rate; + } + + self.prev_sync = sync; + + // Render bleps. + if f < TRANSITION_END { + // Compute phase of the second saw. + let mut aux_phase = self.phase + shape * 0.5; + if aux_phase >= 1.0 { + aux_phase -= 1.0; + } + + // Naive dual saw. + output = self.phase + aux_phase - 1.0; + + // If the function has decreased, add a blep. + if output < self.prev_output && rate > 0.0 { + let scale = self.prev_output - output + 2.0 * rate; + self.add_blep(f32::min(self.phase, aux_phase) / rate, scale); + } + + self.prev_output = output; + + // Correct with bleps. + output += self.future[self.future_index]; + self.future[self.future_index] = 0.0; + self.future_index = (self.future_index + 1) % FUTURE_SIZE; + + // Remove DC component based on frequency. + // 5.473 is emperically determined. + output -= (f / self.sample_rate as f32) * 5.473; + } + + // Render sine. + if f > TRANSITION_START { + let sine_gain = if f < TRANSITION_END { + (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) + } else { + 1.0 + }; + + output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); + } + + output + } + + #[allow(dead_code)] + pub fn process_saw(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { + let n = pitch.len(); + for i in 0..n { + out[i] = self.tick_saw(pitch[i], sync[i], shape[i]); + } + } + + pub fn tick_square(&mut self, f: f32, sync: f32, shape: f32) -> f32 { + let f = f.min(self.nyquist); + let shape = shape.min(1.0).max(0.0); + + let rate = f * self.conv; + + let mut output = 0.0; + + // Pulse width. + let pw = 0.5 * (1.0 - shape); + + // Advance phase. + self.phase += rate; + if self.phase >= 1.0 { + self.phase -= 1.0; + } + + // Sync. + if sync > 0.0 && self.prev_sync <= 0.0 { + // Estimate how long ago zero-crossing happened + // via linear interpolation and intersection + // with x-axis. + let frames_since = sync / (sync - self.prev_sync); + + // Reset phase. + self.phase = frames_since * rate; + } + + self.prev_sync = sync; + + // Render bleps. + if f < TRANSITION_END { + // Naive square. + output = if self.phase < pw { 1.0 } else { -1.0 }; + + if output != self.prev_output && rate > 0.0 { + if self.phase < pw { + self.add_blep(self.phase / rate, -2.0); + } else { + self.add_blep((self.phase - pw) / rate, 2.0); + } + } + + self.prev_output = output; + + // Correct with bleps. + output += self.future[self.future_index]; + self.future[self.future_index] = 0.0; + self.future_index = (self.future_index + 1) % FUTURE_SIZE; + } + + // Render sine. + if f > TRANSITION_START { + let sine_gain = if f < TRANSITION_END { + (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) + } else { + 1.0 + }; + + output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); + } + + output + } + + #[allow(dead_code)] + pub fn process_square(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { + let n = pitch.len(); + for i in 0..n { + out[i] = self.tick_square(pitch[i], sync[i], shape[i]); + } + } + + fn add_blep(&mut self, phase: f32, scale: f32) { + // Add a blep into the future buffer. + + let mut p = (phase * (OVERSAMPLING as f32)) as usize; // Convert to integer index outside the loop. + + let mut i = self.future_index; + + // Note: should be able to do one loop with modulo. Perhaps that was slower? + + while i < FUTURE_SIZE && p < BLEP_SIZE { + self.future[i] += BLEP_TABLE[p] * scale; + p += OVERSAMPLING; + i += 1; + } + + i = 0; + while i < self.future_index && p < BLEP_SIZE { + self.future[i] += BLEP_TABLE[p] * scale; + p += OVERSAMPLING; + i += 1; + } + } +} + +#[allow(clippy::all)] +const BLEP_TABLE: [f32; BLEP_SIZE] = [ + 1.00000002216, + 1.00000004418, + 1.00000006604, + 1.00000008775, + 1.00000010929, + 1.00000013066, + 1.00000015186, + 1.00000017287, + 1.00000019369, + 1.00000021431, + 1.00000023473, + 1.00000025493, + 1.0000002749, + 1.00000029464, + 1.00000031413, + 1.00000033337, + 1.00000035234, + 1.00000037103, + 1.00000038942, + 1.0000004075, + 1.00000042527, + 1.00000044269, + 1.00000045976, + 1.00000047645, + 1.00000049275, + 1.00000050864, + 1.0000005241, + 1.0000005391, + 1.00000055363, + 1.00000056765, + 1.00000058114, + 1.00000059407, + 1.00000060642, + 1.00000061815, + 1.00000062923, + 1.00000063963, + 1.00000064931, + 1.00000065823, + 1.00000066636, + 1.00000067365, + 1.00000068006, + 1.00000068555, + 1.00000069006, + 1.00000069355, + 1.00000069596, + 1.00000069724, + 1.00000069733, + 1.00000069617, + 1.0000006937, + 1.00000068985, + 1.00000068455, + 1.00000067773, + 1.00000066932, + 1.00000065924, + 1.0000006474, + 1.00000063373, + 1.00000061813, + 1.00000060051, + 1.00000058077, + 1.00000055881, + 1.00000053454, + 1.00000050783, + 1.00000047859, + 1.00000044669, + 1.000000412, + 1.00000037441, + 1.00000033378, + 1.00000028998, + 1.00000024286, + 1.00000019228, + 1.00000013809, + 1.00000008012, + 1.00000001822, + 0.999999952219, + 0.999999881935, + 0.99999980719, + 0.999999727795, + 0.999999643558, + 0.999999554276, + 0.999999459742, + 0.999999359741, + 0.99999925405, + 0.999999142439, + 0.999999024672, + 0.999998900504, + 0.99999876968, + 0.99999863194, + 0.999998487014, + 0.999998334623, + 0.999998174481, + 0.999998006291, + 0.999997829748, + 0.999997644537, + 0.999997450334, + 0.999997246803, + 0.999997033601, + 0.999996810373, + 0.999996576753, + 0.999996332364, + 0.99999607682, + 0.999995809722, + 0.999995530659, + 0.99999523921, + 0.99999493494, + 0.999994617403, + 0.999994286139, + 0.999993940678, + 0.999993580533, + 0.999993205206, + 0.999992814185, + 0.999992406945, + 0.999991982944, + 0.999991541627, + 0.999991082426, + 0.999990604755, + 0.999990108013, + 0.999989591584, + 0.999989054837, + 0.999988497123, + 0.999987917776, + 0.999987316114, + 0.999986691438, + 0.99998604303, + 0.999985370155, + 0.999984672059, + 0.99998394797, + 0.999983197097, + 0.999982418629, + 0.999981611735, + 0.999980775564, + 0.999979909246, + 0.999979011889, + 0.999978082578, + 0.999977120381, + 0.999976124339, + 0.999975093473, + 0.999974026783, + 0.999972923242, + 0.999971781802, + 0.999970601392, + 0.999969380912, + 0.999968119243, + 0.999966815237, + 0.999965467722, + 0.9999640755, + 0.999962637345, + 0.999961152005, + 0.999959618201, + 0.999958034627, + 0.999956399947, + 0.999954712798, + 0.999952971786, + 0.999951175488, + 0.999949322452, + 0.999947411195, + 0.999945440202, + 0.999943407929, + 0.999941312796, + 0.999939153194, + 0.99993692748, + 0.999934633977, + 0.999932270975, + 0.999929836728, + 0.999927329457, + 0.999924747347, + 0.999922088545, + 0.999919351165, + 0.99991653328, + 0.999913632929, + 0.99991064811, + 0.999907576784, + 0.999904416873, + 0.999901166258, + 0.999897822781, + 0.999894384241, + 0.999890848399, + 0.99988721297, + 0.99988347563, + 0.999879634009, + 0.999875685696, + 0.999871628232, + 0.999867459117, + 0.999863175804, + 0.999858775698, + 0.99985425616, + 0.999849614503, + 0.999844847991, + 0.999839953841, + 0.999834929219, + 0.999829771243, + 0.999824476979, + 0.999819043444, + 0.999813467602, + 0.999807746363, + 0.999801876589, + 0.999795855082, + 0.999789678596, + 0.999783343825, + 0.999776847411, + 0.999770185937, + 0.999763355931, + 0.999756353864, + 0.999749176146, + 0.99974181913, + 0.999734279111, + 0.999726552319, + 0.999718634928, + 0.999710523048, + 0.999702212727, + 0.999693699949, + 0.999684980636, + 0.999676050645, + 0.999666905766, + 0.999657541726, + 0.999647954183, + 0.99963813873, + 0.99962809089, + 0.999617806119, + 0.999607279801, + 0.999596507252, + 0.999585483717, + 0.999574204368, + 0.999562664306, + 0.999550858557, + 0.999538782075, + 0.999526429739, + 0.999513796353, + 0.999500876642, + 0.999487665257, + 0.999474156772, + 0.99946034568, + 0.999446226396, + 0.999431793256, + 0.999417040514, + 0.999401962343, + 0.999386552833, + 0.999370805993, + 0.999354715746, + 0.999338275933, + 0.999321480307, + 0.999304322537, + 0.999286796203, + 0.9992688948, + 0.999250611733, + 0.999231940317, + 0.999212873779, + 0.999193405254, + 0.999173527786, + 0.999153234327, + 0.999132517734, + 0.999111370771, + 0.99908978611, + 0.999067756323, + 0.999045273889, + 0.999022331189, + 0.998998920505, + 0.998975034023, + 0.998950663827, + 0.998925801902, + 0.998900440131, + 0.998874570297, + 0.998848184079, + 0.998821273053, + 0.998793828692, + 0.998765842361, + 0.998737305322, + 0.998708208729, + 0.998678543631, + 0.998648300967, + 0.998617471566, + 0.99858604615, + 0.998554015329, + 0.998521369602, + 0.998488099357, + 0.998454194867, + 0.998419646294, + 0.998384443684, + 0.998348576969, + 0.998312035965, + 0.99827481037, + 0.998236889767, + 0.998198263618, + 0.998158921269, + 0.998118851945, + 0.998078044751, + 0.998036488669, + 0.997994172562, + 0.99795108517, + 0.997907215106, + 0.997862550864, + 0.99781708081, + 0.997770793184, + 0.997723676103, + 0.997675717554, + 0.997626905397, + 0.997577227365, + 0.997526671059, + 0.997475223952, + 0.997422873387, + 0.997369606575, + 0.997315410595, + 0.997260272394, + 0.997204178784, + 0.997147116445, + 0.997089071921, + 0.997030031623, + 0.996969981822, + 0.996908908657, + 0.996846798127, + 0.996783636093, + 0.996719408278, + 0.996654100268, + 0.996587697505, + 0.996520185293, + 0.996451548797, + 0.996381773036, + 0.996310842891, + 0.996238743098, + 0.996165458249, + 0.996090972795, + 0.996015271039, + 0.995938337142, + 0.995860155118, + 0.995780708835, + 0.995699982014, + 0.995617958229, + 0.995534620909, + 0.99544995333, + 0.995363938622, + 0.995276559767, + 0.995187799596, + 0.995097640789, + 0.995006065878, + 0.99491305724, + 0.994818597106, + 0.99472266755, + 0.994625250496, + 0.994526327717, + 0.99442588083, + 0.994323891299, + 0.994220340436, + 0.994115209397, + 0.994008479185, + 0.993900130646, + 0.993790144473, + 0.993678501201, + 0.993565181212, + 0.99345016473, + 0.993333431822, + 0.9932149624, + 0.993094736218, + 0.992972732873, + 0.992848931805, + 0.992723312295, + 0.992595853467, + 0.992466534288, + 0.992335333564, + 0.992202229946, + 0.992067201923, + 0.991930227827, + 0.991791285832, + 0.991650353951, + 0.991507410039, + 0.991362431791, + 0.991215396744, + 0.991066282276, + 0.990915065603, + 0.990761723785, + 0.990606233719, + 0.990448572147, + 0.990288715647, + 0.990126640641, + 0.98996232339, + 0.989795739997, + 0.989626866405, + 0.989455678397, + 0.989282151599, + 0.989106261478, + 0.98892798334, + 0.988747292335, + 0.988564163454, + 0.988378571529, + 0.988190491234, + 0.987999897088, + 0.987806763449, + 0.98761106452, + 0.987412774346, + 0.987211866815, + 0.98700831566, + 0.986802094459, + 0.98659317663, + 0.986381535441, + 0.986167144002, + 0.985949975268, + 0.985730002043, + 0.985507196975, + 0.98528153256, + 0.98505298114, + 0.984821514906, + 0.984587105897, + 0.984349726002, + 0.984109346957, + 0.983865940351, + 0.983619477622, + 0.983369930059, + 0.983117268804, + 0.98286146485, + 0.982602489046, + 0.982340312092, + 0.982074904544, + 0.981806236813, + 0.981534279168, + 0.981259001732, + 0.980980374487, + 0.980698367275, + 0.980412949796, + 0.980124091609, + 0.979831762138, + 0.979535930665, + 0.979236566337, + 0.978933638165, + 0.978627115025, + 0.978316965659, + 0.978003158674, + 0.977685662548, + 0.977364445626, + 0.977039476123, + 0.976710722127, + 0.976378151597, + 0.976041732366, + 0.975701432141, + 0.975357218506, + 0.975009058921, + 0.974656920725, + 0.974300771136, + 0.973940577254, + 0.973576306059, + 0.973207924418, + 0.972835399079, + 0.972458696678, + 0.97207778374, + 0.971692626677, + 0.971303191792, + 0.970909445281, + 0.970511353231, + 0.970108881628, + 0.96970199635, + 0.969290663176, + 0.968874847784, + 0.968454515753, + 0.968029632565, + 0.967600163606, + 0.96716607417, + 0.966727329458, + 0.966283894578, + 0.965835734554, + 0.96538281432, + 0.964925098727, + 0.96446255254, + 0.963995140446, + 0.96352282705, + 0.96304557688, + 0.962563354389, + 0.962076123956, + 0.961583849888, + 0.961086496422, + 0.960584027728, + 0.960076407908, + 0.959563601004, + 0.959045570993, + 0.958522281794, + 0.957993697268, + 0.957459781221, + 0.956920497408, + 0.956375809529, + 0.955825681238, + 0.955270076142, + 0.954708957804, + 0.954142289745, + 0.953570035446, + 0.952992158353, + 0.952408621873, + 0.951819389385, + 0.951224424234, + 0.950623689741, + 0.950017149199, + 0.949404765879, + 0.948786503033, + 0.948162323894, + 0.94753219168, + 0.946896069597, + 0.946253920841, + 0.945605708599, + 0.944951396056, + 0.944290946393, + 0.943624322792, + 0.942951488437, + 0.942272406521, + 0.941587040244, + 0.940895352816, + 0.940197307464, + 0.93949286743, + 0.938781995977, + 0.938064656391, + 0.937340811983, + 0.936610426093, + 0.935873462091, + 0.935129883384, + 0.934379653414, + 0.933622735665, + 0.932859093662, + 0.932088690979, + 0.931311491238, + 0.930527458113, + 0.929736555334, + 0.92893874669, + 0.928133996031, + 0.927322267273, + 0.926503524397, + 0.92567773146, + 0.924844852588, + 0.924004851988, + 0.923157693946, + 0.922303342834, + 0.92144176311, + 0.920572919322, + 0.919696776113, + 0.918813298222, + 0.917922450489, + 0.917024197858, + 0.916118505381, + 0.915205338219, + 0.914284661648, + 0.91335644106, + 0.912420641971, + 0.911477230017, + 0.910526170965, + 0.909567430712, + 0.90860097529, + 0.907626770869, + 0.906644783761, + 0.905654980422, + 0.904657327459, + 0.90365179163, + 0.902638339849, + 0.90161693919, + 0.900587556889, + 0.899550160351, + 0.898504717148, + 0.897451195031, + 0.896389561923, + 0.895319785933, + 0.894241835352, + 0.893155678661, + 0.892061284533, + 0.890958621838, + 0.889847659645, + 0.888728367227, + 0.887600714063, + 0.886464669845, + 0.885320204479, + 0.884167288088, + 0.883005891021, + 0.881835983848, + 0.880657537374, + 0.879470522635, + 0.878274910905, + 0.877070673699, + 0.875857782777, + 0.874636210149, + 0.873405928077, + 0.872166909079, + 0.870919125936, + 0.86966255169, + 0.868397159653, + 0.867122923409, + 0.865839816817, + 0.864547814016, + 0.86324688943, + 0.861937017768, + 0.860618174033, + 0.85929033352, + 0.857953471826, + 0.856607564849, + 0.855252588795, + 0.85388852018, + 0.852515335834, + 0.851133012908, + 0.849741528872, + 0.848340861525, + 0.846930988993, + 0.845511889738, + 0.84408354256, + 0.842645926601, + 0.841199021345, + 0.83974280663, + 0.838277262644, + 0.836802369934, + 0.835318109406, + 0.833824462333, + 0.832321410356, + 0.830808935486, + 0.829287020113, + 0.827755647007, + 0.826214799321, + 0.824664460595, + 0.823104614762, + 0.821535246149, + 0.819956339483, + 0.818367879894, + 0.816769852917, + 0.815162244499, + 0.813545041, + 0.811918229198, + 0.810281796295, + 0.808635729913, + 0.806980018108, + 0.805314649365, + 0.803639612609, + 0.801954897201, + 0.800260492947, + 0.798556390103, + 0.79684257937, + 0.79511905191, + 0.793385799338, + 0.791642813733, + 0.789890087638, + 0.788127614066, + 0.786355386501, + 0.784573398903, + 0.782781645711, + 0.780980121847, + 0.779168822719, + 0.777347744224, + 0.775516882753, + 0.773676235192, + 0.771825798928, + 0.769965571849, + 0.768095552351, + 0.766215739339, + 0.764326132232, + 0.762426730963, + 0.760517535986, + 0.758598548276, + 0.756669769337, + 0.754731201198, + 0.752782846422, + 0.750824708107, + 0.748856789889, + 0.746879095945, + 0.744891630998, + 0.742894400316, + 0.740887409719, + 0.738870665578, + 0.736844174823, + 0.73480794494, + 0.73276198398, + 0.730706300556, + 0.728640903849, + 0.726565803613, + 0.72448101017, + 0.722386534422, + 0.720282387847, + 0.718168582505, + 0.716045131039, + 0.713912046678, + 0.711769343239, + 0.709617035133, + 0.707455137361, + 0.705283665523, + 0.703102635815, + 0.700912065034, + 0.698711970583, + 0.696502370466, + 0.694283283298, + 0.692054728303, + 0.689816725315, + 0.687569294785, + 0.685312457778, + 0.683046235978, + 0.68077065169, + 0.67848572784, + 0.676191487978, + 0.673887956282, + 0.671575157554, + 0.66925311723, + 0.666921861374, + 0.664581416685, + 0.662231810496, + 0.659873070777, + 0.657505226136, + 0.655128305819, + 0.652742339715, + 0.650347358353, + 0.647943392909, + 0.645530475202, + 0.643108637698, + 0.640677913511, + 0.638238336404, + 0.635789940789, + 0.633332761732, + 0.630866834947, + 0.628392196806, + 0.625908884333, + 0.623416935206, + 0.620916387762, + 0.618407280993, + 0.615889654549, + 0.61336354874, + 0.610829004531, + 0.608286063552, + 0.605734768089, + 0.603175161091, + 0.600607286168, + 0.598031187591, + 0.595446910293, + 0.592854499871, + 0.590254002582, + 0.587645465347, + 0.585028935751, + 0.582404462039, + 0.579772093122, + 0.577131878573, + 0.574483868627, + 0.571828114183, + 0.569164666801, + 0.566493578705, + 0.563814902781, + 0.561128692574, + 0.558435002294, + 0.555733886808, + 0.553025401647, + 0.550309602998, + 0.547586547709, + 0.544856293287, + 0.542118897894, + 0.53937442035, + 0.536622920131, + 0.533864457368, + 0.531099092845, + 0.528326887998, + 0.525547904917, + 0.522762206341, + 0.519969855658, + 0.517170916904, + 0.514365454762, + 0.511553534559, + 0.508735222267, + 0.5059105845, + 0.50307968851, + 0.500242602192, + 0.497399394074, + 0.494550133321, + 0.491694889732, + 0.488833733736, + 0.485966736393, + 0.48309396939, + 0.480215505037, + 0.477331416271, + 0.474441776648, + 0.471546660342, + 0.468646142144, + 0.46574029746, + 0.462829202306, + 0.459912933307, + 0.456991567695, + 0.454065183305, + 0.451133858572, + 0.448197672531, + 0.44525670481, + 0.442311035633, + 0.439360745808, + 0.436405916734, + 0.433446630391, + 0.430482969338, + 0.427515016713, + 0.424542856226, + 0.421566572158, + 0.418586249355, + 0.415601973229, + 0.412613829748, + 0.40962190544, + 0.406626287382, + 0.403627063201, + 0.400624321069, + 0.397618149698, + 0.394608638339, + 0.391595876773, + 0.388579955312, + 0.385560964793, + 0.382538996573, + 0.379514142526, + 0.376486495036, + 0.373456146998, + 0.370423191809, + 0.367387723363, + 0.364349836052, + 0.361309624754, + 0.358267184835, + 0.35522261214, + 0.352176002989, + 0.349127454173, + 0.34607706295, + 0.343024927038, + 0.339971144609, + 0.336915814289, + 0.333859035147, + 0.330800906693, + 0.327741528873, + 0.324681002061, + 0.321619427057, + 0.318556905078, + 0.315493537756, + 0.31242942713, + 0.309364675642, + 0.30629938613, + 0.303233661823, + 0.300167606334, + 0.297101323657, + 0.294034918157, + 0.290968494569, + 0.287902157987, + 0.284836013861, + 0.28177016799, + 0.278704726517, + 0.275639795921, + 0.27257548301, + 0.269511894918, + 0.266449139096, + 0.263387323306, + 0.260326555615, + 0.257266944389, + 0.254208598284, + 0.251151626242, + 0.248096137483, + 0.245042241498, + 0.241990048045, + 0.238939667136, + 0.235891209038, + 0.232844784258, + 0.229800503544, + 0.226758477872, + 0.22371881844, + 0.220681636663, + 0.217647044165, + 0.214615152771, + 0.211586074499, + 0.208559921554, + 0.205536806323, + 0.202516841361, + 0.199500139391, + 0.196486813292, + 0.193476976091, + 0.190470740958, + 0.187468221199, + 0.184469530245, + 0.181474781646, + 0.178484089063, + 0.175497566263, + 0.172515327105, + 0.169537485539, + 0.166564155593, + 0.163595451368, + 0.16063148703, + 0.157672376799, + 0.154718234944, + 0.151769175775, + 0.148825313634, + 0.145886762884, + 0.142953637908, + 0.140026053093, + 0.137104122827, + 0.134187961488, + 0.131277683439, + 0.128373403015, + 0.125475234519, + 0.122583292209, + 0.119697690296, + 0.11681854293, + 0.113945964194, + 0.111080068095, + 0.108220968554, + 0.105368779403, + 0.10252361437, + 0.0996855870723, + 0.0968548110105, + 0.0940313995573, + 0.0912154659497, + 0.0884071232805, + 0.0856064844893, + 0.0828136623543, + 0.0800287694832, + 0.0772519183046, + 0.0744832210596, + 0.0717227897927, + 0.0689707363433, + 0.0662271723366, + 0.0634922091754, + 0.060765958031, + 0.0580485298342, + 0.055340035267, + 0.0526405847535, + 0.0499502884511, + 0.0472692562417, + 0.0445975977231, + 0.0419354221998, + 0.0392828386745, + 0.036639955839, + 0.0340068820656, + 0.0313837253981, + 0.0287705935431, + 0.0261675938609, + 0.023574833357, + 0.0209924186731, + 0.0184204560782, + 0.0158590514599, + 0.0133083103153, + 0.0107683377427, + 0.00823923843221, + 0.00572111665733, + 0.00321407626593, + 0.000718220671564, + -0.00176634715537, + -0.00423952469639, + -0.00670120989368, + -0.0091513011589, + -0.0115896973819, + -0.0140162979393, + -0.0164310027036, + -0.0188337120514, + -0.0212243268725, + -0.0236027485782, + -0.0259688791103, + -0.0283226209494, + -0.0306638771239, + -0.0329925512182, + -0.0353085473814, + -0.0376117703361, + -0.0399021253866, + -0.0421795184273, + -0.0444438559519, + -0.0466950450608, + -0.0489329934705, + -0.0511576095213, + -0.0533688021861, + -0.0555664810785, + -0.0577505564612, + -0.0599209392544, + -0.0620775410438, + -0.0642202740888, + -0.0663490513312, + -0.0684637864026, + -0.070564393633, + -0.0726507880589, + -0.074722885431, + -0.0767806022225, + -0.078823855637, + -0.0808525636162, + -0.0828666448481, + -0.0848660187748, + -0.0868506055999, + -0.0888203262969, + -0.0907751026164, + -0.0927148570939, + -0.0946395130576, + -0.0965489946356, + -0.0984432267639, + -0.100322135194, + -0.102185646498, + -0.104033688081, + -0.105866188184, + -0.107683075891, + -0.109484281139, + -0.111269734726, + -0.113039368313, + -0.114793114435, + -0.116530906507, + -0.118252678833, + -0.119958366608, + -0.121647905929, + -0.123321233802, + -0.124978288146, + -0.1266190078, + -0.128243332531, + -0.129851203043, + -0.131442560975, + -0.133017348918, + -0.134575510414, + -0.136116989964, + -0.137641733035, + -0.139149686067, + -0.140640796478, + -0.142115012667, + -0.143572284027, + -0.145012560943, + -0.146435794805, + -0.147841938006, + -0.149230943956, + -0.150602767081, + -0.151957362831, + -0.153294687687, + -0.154614699162, + -0.155917355811, + -0.157202617235, + -0.158470444082, + -0.159720798058, + -0.160953641928, + -0.162168939523, + -0.163366655743, + -0.164546756563, + -0.165709209037, + -0.166853981304, + -0.16798104259, + -0.169090363214, + -0.170181914592, + -0.171255669242, + -0.172311600784, + -0.173349683953, + -0.174369894592, + -0.175372209664, + -0.176356607253, + -0.177323066566, + -0.178271567939, + -0.179202092841, + -0.180114623874, + -0.18100914478, + -0.181885640442, + -0.182744096889, + -0.183584501297, + -0.184406841993, + -0.185211108457, + -0.185997291327, + -0.1867653824, + -0.187515374633, + -0.188247262151, + -0.188961040241, + -0.189656705363, + -0.190334255145, + -0.190993688391, + -0.191635005079, + -0.192258206363, + -0.192863294578, + -0.193450273238, + -0.194019147042, + -0.194569921869, + -0.195102604785, + -0.195617204044, + -0.196113729085, + -0.196592190537, + -0.197052600219, + -0.197494971141, + -0.197919317503, + -0.198325654699, + -0.198713999314, + -0.199084369127, + -0.199436783111, + -0.199771261432, + -0.200087825451, + -0.200386497722, + -0.200667301994, + -0.20093026321, + -0.201175407506, + -0.201402762212, + -0.201612355849, + -0.201804218133, + -0.20197837997, + -0.202134873456, + -0.20227373188, + -0.202394989716, + -0.202498682629, + -0.202584847469, + -0.202653522272, + -0.202704746256, + -0.202738559825, + -0.20275500456, + -0.202754123223, + -0.202735959753, + -0.202700559264, + -0.202647968041, + -0.202578233544, + -0.202491404398, + -0.202387530396, + -0.202266662493, + -0.202128852807, + -0.201974154615, + -0.201802622346, + -0.201614311584, + -0.201409279064, + -0.201187582664, + -0.200949281407, + -0.200694435457, + -0.200423106112, + -0.200135355803, + -0.199831248092, + -0.199510847664, + -0.199174220327, + -0.198821433005, + -0.198452553737, + -0.198067651668, + -0.197666797051, + -0.197250061238, + -0.196817516675, + -0.196369236901, + -0.195905296542, + -0.195425771303, + -0.194930737966, + -0.194420274387, + -0.193894459484, + -0.193353373241, + -0.192797096692, + -0.192225711927, + -0.191639302074, + -0.191037951306, + -0.190421744826, + -0.189790768863, + -0.189145110669, + -0.188484858512, + -0.187810101666, + -0.187120930409, + -0.186417436016, + -0.18569971075, + -0.184967847858, + -0.184221941564, + -0.18346208706, + -0.182688380501, + -0.181900918999, + -0.181099800613, + -0.180285124345, + -0.179456990129, + -0.178615498827, + -0.177760752222, + -0.176892853005, + -0.176011904773, + -0.175118012021, + -0.174211280129, + -0.173291815361, + -0.17235972485, + -0.171415116596, + -0.170458099455, + -0.169488783129, + -0.168507278161, + -0.167513695926, + -0.166508148618, + -0.165490749249, + -0.164461611632, + -0.163420850381, + -0.162368580892, + -0.161304919344, + -0.160229982682, + -0.159143888613, + -0.158046755594, + -0.156938702825, + -0.155819850235, + -0.15469031848, + -0.153550228926, + -0.152399703643, + -0.151238865396, + -0.150067837633, + -0.148886744476, + -0.147695710713, + -0.146494861783, + -0.145284323773, + -0.144064223401, + -0.142834688009, + -0.141595845555, + -0.140347824597, + -0.139090754288, + -0.137824764361, + -0.136549985122, + -0.135266547438, + -0.133974582726, + -0.132674222942, + -0.131365600572, + -0.130048848619, + -0.128724100592, + -0.127391490496, + -0.126051152824, + -0.124703222537, + -0.123347835064, + -0.121985126282, + -0.120615232509, + -0.119238290491, + -0.117854437392, + -0.116463810781, + -0.115066548623, + -0.113662789263, + -0.11225267142, + -0.11083633417, + -0.109413916938, + -0.107985559486, + -0.106551401899, + -0.105111584574, + -0.103666248211, + -0.102215533796, + -0.100759582593, + -0.0992985361311, + -0.0978325361922, + -0.0963617247984, + -0.0948862442006, + -0.0934062368663, + -0.0919218454675, + -0.0904332128681, + -0.0889404821123, + -0.0874437964117, + -0.0859432991336, + -0.0844391337884, + -0.0829314440173, + -0.0814203735799, + -0.079906066342, + -0.0783886662631, + -0.0768683173841, + -0.0753451638146, + -0.0738193497206, + -0.0722910193121, + -0.0707603168307, + -0.0692273865368, + -0.0676923726971, + -0.0661554195724, + -0.064616671405, + -0.0630762724057, + -0.0615343667419, + -0.0599910985244, + -0.0584466117954, + -0.0569010505156, + -0.0553545585516, + -0.0538072796635, + -0.0522593574924, + -0.0507109355473, + -0.0491621571931, + -0.0476131656379, + -0.0460641039202, + -0.0445151148965, + -0.0429663412287, + -0.0414179253717, + -0.0398700095606, + -0.0383227357983, + -0.0367762458431, + -0.0352306811961, + -0.0336861830884, + -0.0321428924692, + -0.0306009499931, + -0.0290604960075, + -0.0275216705402, + -0.0259846132873, + -0.0244494636006, + -0.0229163604753, + -0.0213854425374, + -0.019856848032, + -0.0183307148105, + -0.0168071803186, + -0.0152863815839, + -0.0137684552039, + -0.0122535373339, + -0.0107417636744, + -0.00923326945988, + -0.00772818944583, + -0.00622665789736, + -0.00472880857696, + -0.00323477473267, + -0.00174468908612, + -0.00025868382076, + 0.00122310943003, + 0.00270055959462, + 0.00417353617491, + 0.00564190925794, + 0.00710554952752, + 0.00856432827585, + 0.0100181174149, + 0.0114667894881, + 0.0129102176816, + 0.0143482758353, + 0.0157808384551, + 0.0172077807229, + 0.0186289785088, + 0.0200443083817, + 0.0214536476206, + 0.0228568742252, + 0.0242538669275, + 0.025644505202, + 0.0270286692769, + 0.0284062401448, + 0.0297770995732, + 0.0311411301153, + 0.0324982151205, + 0.0338482387445, + 0.0351910859604, + 0.0365266425682, + 0.0378547952058, + 0.0391754313585, + 0.0404884393696, + 0.0417937084501, + 0.0430911286886, + 0.0443805910615, + 0.0456619874422, + 0.0469352106116, + 0.0482001542666, + 0.0494567130308, + 0.0507047824629, + 0.0519442590666, + 0.0531750403, + 0.0543970245841, + 0.0556101113126, + 0.0568142008604, + 0.0580091945925, + 0.0591949948733, + 0.0603715050746, + 0.0615386295848, + 0.0626962738171, + 0.0638443442177, + 0.0649827482749, + 0.0661113945263, + 0.0672301925679, + 0.0683390530612, + 0.0694378877418, + 0.070526609427, + 0.0716051320234, + 0.0726733705345, + 0.0737312410685, + 0.0747786608453, + 0.0758155482039, + 0.0768418226099, + 0.0778574046621, + 0.0788622160996, + 0.079856179809, + 0.0808392198306, + 0.0818112613653, + 0.0827722307813, + 0.08372205562, + 0.0846606646028, + 0.0855879876369, + 0.0865039558216, + 0.0874085014541, + 0.0883015580354, + 0.0891830602759, + 0.0900529441011, + 0.0909111466569, + 0.0917576063152, + 0.092592262679, + 0.0934150565873, + 0.0942259301205, + 0.0950248266048, + 0.0958116906174, + 0.0965864679906, + 0.0973491058168, + 0.0980995524526, + 0.0988377575229, + 0.0995636719254, + 0.100277247834, + 0.100978438704, + 0.101667199273, + 0.102343485568, + 0.103007254908, + 0.103658465903, + 0.104297078465, + 0.104923053804, + 0.105536354435, + 0.10613694418, + 0.106724788169, + 0.107299852846, + 0.107862105968, + 0.108411516608, + 0.108948055159, + 0.109471693335, + 0.109982404173, + 0.110480162033, + 0.110964942602, + 0.111436722895, + 0.111895481257, + 0.11234119736, + 0.112773852212, + 0.11319342815, + 0.113599908845, + 0.113993279302, + 0.114373525862, + 0.114740636198, + 0.115094599319, + 0.115435405572, + 0.115763046636, + 0.116077515528, + 0.116378806597, + 0.116666915529, + 0.116941839344, + 0.117203576393, + 0.117452126363, + 0.117687490271, + 0.117909670464, + 0.118118670619, + 0.118314495743, + 0.118497152166, + 0.118666647547, + 0.118822990864, + 0.118966192421, + 0.119096263837, + 0.119213218053, + 0.119317069319, + 0.119407833204, + 0.119485526582, + 0.119550167637, + 0.119601775856, + 0.119640372028, + 0.119665978242, + 0.11967861788, + 0.119678315617, + 0.119665097416, + 0.119638990525, + 0.119600023472, + 0.119548226065, + 0.119483629382, + 0.11940626577, + 0.119316168844, + 0.119213373476, + 0.119097915795, + 0.11896983318, + 0.118829164259, + 0.118675948898, + 0.118510228202, + 0.118332044506, + 0.118141441369, + 0.117938463575, + 0.117723157118, + 0.117495569204, + 0.117255748241, + 0.117003743836, + 0.116739606785, + 0.116463389072, + 0.116175143857, + 0.115874925474, + 0.115562789422, + 0.115238792362, + 0.114902992103, + 0.114555447604, + 0.114196218958, + 0.113825367393, + 0.11344295526, + 0.113049046026, + 0.112643704269, + 0.112226995665, + 0.111798986988, + 0.111359746097, + 0.110909341926, + 0.110447844485, + 0.109975324839, + 0.109491855113, + 0.108997508473, + 0.108492359123, + 0.107976482296, + 0.107449954243, + 0.106912852227, + 0.106365254511, + 0.105807240353, + 0.105238889993, + 0.104660284644, + 0.104071506488, + 0.103472638658, + 0.102863765237, + 0.102244971241, + 0.101616342616, + 0.100977966222, + 0.100329929827, + 0.0996723220971, + 0.0990052325839, + 0.0983287517163, + 0.0976429707893, + 0.0969479819541, + 0.0962438782075, + 0.0955307533814, + 0.0948087021319, + 0.0940778199289, + 0.0933382030454, + 0.0925899485462, + 0.0918331542771, + 0.0910679188543, + 0.0902943416524, + 0.0895125227942, + 0.0887225631386, + 0.0879245642696, + 0.0871186284852, + 0.0863048587851, + 0.0854833588599, + 0.0846542330791, + 0.0838175864795, + 0.0829735247533, + 0.0821221542363, + 0.0812635818963, + 0.0803979153205, + 0.0795252627042, + 0.0786457328381, + 0.0777594350965, + 0.0768664794249, + 0.0759669763279, + 0.0750610368568, + 0.0741487725971, + 0.0732302956563, + 0.0723057186513, + 0.0713751546956, + 0.0704387173874, + 0.0694965207962, + 0.0685486794506, + 0.0675953083256, + 0.0666365228293, + 0.0656724387908, + 0.0647031724469, + 0.0637288404293, + 0.0627495597519, + 0.0617654477975, + 0.0607766223049, + 0.059783201356, + 0.0587853033626, + 0.0577830470536, + 0.0567765514614, + 0.055765935909, + 0.0547513199969, + 0.0537328235898, + 0.0527105668035, + 0.0516846699913, + 0.0506552537312, + 0.0496224388123, + 0.0485863462217, + 0.0475470971308, + 0.0465048128827, + 0.0454596149779, + 0.0444116250618, + 0.0433609649107, + 0.042307756419, + 0.0412521215852, + 0.040194182499, + 0.0391340613277, + 0.0380718803028, + 0.0370077617066, + 0.035941827859, + 0.0348742011038, + 0.0338050037954, + 0.0327343582857, + 0.0316623869103, + 0.0305892119753, + 0.0295149557442, + 0.0284397404239, + 0.0273636881522, + 0.0262869209837, + 0.025209560877, + 0.0241317296813, + 0.0230535491229, + 0.0219751407923, + 0.0208966261305, + 0.0198181264164, + 0.0187397627531, + 0.017661656055, + 0.0165839270344, + 0.0155066961888, + 0.0144300837877, + 0.0133542098592, + 0.0122791941775, + 0.0112051562495, + 0.0101322153023, + 0.00906049026979, + 0.00799009978024, + 0.00692116214325, + 0.00585379533701, + 0.00478811699559, + 0.00372424439623, + 0.00266229444668, + 0.00160238367266, + 0.000544628205254, + -0.000510856231544, + -0.0015639543333, + -0.00261455122753, + -0.00366253248601, + -0.00470778413709, + -0.0057501926779, + -0.00678964508651, + -0.00782602883404, + -0.00885923189671, + -0.0098891427678, + -0.0109156504696, + -0.0119386445651, + -0.0129580151701, + -0.0139736529647, + -0.0149854492048, + -0.015993295734, + -0.0169970849949, + -0.0179967100406, + -0.0189920645459, + -0.0199830428189, + -0.0209695398118, + -0.0219514511323, + -0.0229286730546, + -0.0239011025303, + -0.0248686371992, + -0.0258311754002, + -0.0267886161821, + -0.027740859314, + -0.028687805296, + -0.0296293553696, + -0.0305654115278, + -0.0314958765261, + -0.0324206538917, + -0.0333396479342, + -0.0342527637557, + -0.03515990726, + -0.0360609851632, + -0.0369559050028, + -0.0378445751476, + -0.038726904807, + -0.0396028040407, + -0.0404721837676, + -0.0413349557755, + -0.0421910327294, + -0.0430403281814, + -0.043882756579, + -0.0447182332738, + -0.0455466745307, + -0.0463679975358, + -0.0471821204054, + -0.0479889621939, + -0.0487884429024, + -0.0495804834863, + -0.0503650058641, + -0.0511419329242, + -0.0519111885335, + -0.052672697545, + -0.0534263858048, + -0.0541721801598, + -0.0549100084653, + -0.0556397995916, + -0.0563614834315, + -0.057074990907, + -0.0577802539761, + -0.0584772056397, + -0.0591657799479, + -0.0598459120065, + -0.0605175379836, + -0.0611805951153, + -0.061835021712, + -0.0624807571645, + -0.0631177419496, + -0.0637459176357, + -0.0643652268886, + -0.0649756134767, + -0.0655770222763, + -0.066169399277, + -0.0667526915865, + -0.0673268474353, + -0.067891816182, + -0.0684475483175, + -0.0689939954697, + -0.0695311104076, + -0.0700588470459, + -0.0705771604488, + -0.0710860068341, + -0.0715853435769, + -0.0720751292134, + -0.0725553234444, + -0.0730258871388, + -0.0734867823367, + -0.0739379722525, + -0.0743794212783, + -0.0748110949862, + -0.0752329601314, + -0.0756449846549, + -0.0760471376853, + -0.0764393895419, + -0.0768217117364, + -0.0771940769748, + -0.0775564591597, + -0.0779088333919, + -0.0782511759717, + -0.078583464401, + -0.0789056773839, + -0.0792177948282, + -0.0795197978468, + -0.0798116687579, + -0.0800933910863, + -0.0803649495639, + -0.0806263301299, + -0.0808775199316, + -0.0811185073242, + -0.0813492818711, + -0.0815698343437, + -0.0817801567211, + -0.0819802421899, + -0.0821700851437, + -0.0823496811824, + -0.0825190271112, + -0.08267812094, + -0.0828269618821, + -0.0829655503534, + -0.0830938879702, + -0.0832119775488, + -0.0833198231028, + -0.0834174298424, + -0.0835048041716, + -0.0835819536865, + -0.0836488871733, + -0.0837056146058, + -0.0837521471429, + -0.0837884971259, + -0.0838146780763, + -0.0838307046923, + -0.083836592846, + -0.0838323595806, + -0.0838180231067, + -0.083793602799, + -0.0837591191928, + -0.0837145939805, + -0.0836600500073, + -0.0835955112679, + -0.0835210029019, + -0.0834365511898, + -0.0833421835488, + -0.0832379285279, + -0.0831238158038, + -0.082999876176, + -0.0828661415617, + -0.0827226449912, + -0.0825694206023, + -0.0824065036358, + -0.0822339304293, + -0.0820517384124, + -0.0818599661004, + -0.0816586530894, + -0.0814478400496, + -0.0812275687199, + -0.0809978819016, + -0.0807588234519, + -0.0805104382781, + -0.0802527723307, + -0.0799858725969, + -0.079709787094, + -0.0794245648625, + -0.0791302559592, + -0.0788269114501, + -0.0785145834033, + -0.0781933248815, + -0.0778631899349, + -0.0775242335937, + -0.07717651186, + -0.0768200817009, + -0.0764550010397, + -0.0760813287489, + -0.0756991246413, + -0.0753084494625, + -0.0749093648824, + -0.0745019334866, + -0.0740862187683, + -0.0736622851197, + -0.073230197823, + -0.072790023042, + -0.0723418278131, + -0.0718856800361, + -0.0714216484658, + -0.070949802702, + -0.0704702131808, + -0.0699829511653, + -0.0694880887359, + -0.0689856987807, + -0.0684758549862, + -0.0679586318277, + -0.067434104559, + -0.0669023492028, + -0.0663634425411, + -0.0658174621044, + -0.0652644861623, + -0.064704593713, + -0.0641378644729, + -0.0635643788664, + -0.0629842180157, + -0.0623974637298, + -0.0618041984942, + -0.0612045054602, + -0.0605984684343, + -0.0599861718672, + -0.059367700843, + -0.0587431410684, + -0.0581125788615, + -0.057476101141, + -0.0568337954148, + -0.0561857497689, + -0.0555320528563, + -0.0548727938854, + -0.0542080626091, + -0.0535379493129, + -0.0528625448036, + -0.052181940398, + -0.051496227911, + -0.050805499644, + -0.0501098483735, + -0.0494093673392, + -0.0487041502319, + -0.0479942911824, + -0.0472798847491, + -0.0465610259061, + -0.0458378100317, + -0.0451103328958, + -0.0443786906484, + -0.0436429798073, + -0.042903297246, + -0.0421597401819, + -0.0414124061635, + -0.0406613930589, + -0.0399067990431, + -0.0391487225861, + -0.0383872624406, + -0.0376225176292, + -0.036854587433, + -0.0360835713784, + -0.0353095692253, + -0.0345326809545, + -0.0337530067555, + -0.0329706470137, + -0.0321857022985, + -0.0313982733506, + -0.0306084610696, + -0.0298163665015, + -0.0290220908264, + -0.0282257353459, + -0.0274274014709, + -0.0266271907087, + -0.0258252046508, + -0.0250215449606, + -0.0242163133607, + -0.0234096116205, + -0.0226015415437, + -0.0217922049559, + -0.0209817036924, + -0.0201701395853, + -0.0193576144515, + -0.01854423008, + -0.0177300882199, + -0.0169152905674, + -0.0160999387543, + -0.0152841343347, + -0.0144679787735, + -0.0136515734338, + -0.0128350195643, + -0.0120184182877, + -0.011201870588, + -0.0103854772984, + -0.00956933908922, + -0.00875355645588, + -0.0079382297065, + -0.00712345895003, + -0.00630934408421, + -0.00549598478353, + -0.00468348048728, + -0.00387193038766, + -0.0030614334179, + -0.00225208824039, + -0.00144399323494, + -0.000637246486994, + 0.000168054224043, + 0.00097181143646, + 0.00177392801784, + 0.00257430717663, + 0.00337285247358, + 0.00416946783327, + 0.00496405755541, + 0.00575652632626, + 0.00654677922982, + 0.0073347217591, + 0.00812025982727, + 0.00890329977872, + 0.00968374840012, + 0.0104615129314, + 0.0112365010765, + 0.0120086210146, + 0.0127777814102, + 0.0135438914247, + 0.0143068607262, + 0.0150665995004, + 0.0158230184613, + 0.0165760288612, + 0.0173255425012, + 0.0180714717416, + 0.0188137295118, + 0.0195522293204, + 0.0202868852655, + 0.0210176120445, + 0.0217443249637, + 0.0224669399484, + 0.0231853735522, + 0.0238995429672, + 0.0246093660327, + 0.0253147612453, + 0.0260156477679, + 0.0267119454389, + 0.0274035747815, + 0.0280904570124, + 0.0287725140515, + 0.0294496685297, + 0.0301218437986, + 0.0307889639387, + 0.0314509537678, + 0.0321077388501, + 0.0327592455038, + 0.0334054008098, + 0.03404613262, + 0.0346813695649, + 0.0353110410617, + 0.0359350773225, + 0.0365534093616, + 0.0371659690031, + 0.037772688889, + 0.038373502486, + 0.038968344093, + 0.0395571488483, + 0.0401398527368, + 0.040716392597, + 0.0412867061273, + 0.0418507318936, + 0.0424084093353, + 0.042959678772, + 0.04350448141, + 0.0440427593484, + 0.0445744555854, + 0.0450995140242, + 0.0456178794793, + 0.0461294976816, + 0.0466343152849, + 0.0471322798709, + 0.0476233399547, + 0.0481074449906, + 0.0485845453767, + 0.0490545924602, + 0.0495175385424, + 0.0499733368836, + 0.0504219417076, + 0.0508633082066, + 0.0512973925451, + 0.0517241518648, + 0.0521435442885, + 0.0525555289243, + 0.0529600658694, + 0.053357116214, + 0.0537466420452, + 0.0541286064501, + 0.0545029735196, + 0.0548697083516, + 0.0552287770541, + 0.0555801467484, + 0.0559237855719, + 0.0562596626808, + 0.056587748253, + 0.0569080134905, + 0.0572204306215, + 0.0575249729032, + 0.0578216146235, + 0.0581103311033, + 0.0583910986981, + 0.0586638947998, + 0.0589286978384, + 0.0591854872834, + 0.0594342436452, + 0.059674948476, + 0.0599075843714, + 0.060132134971, + 0.060348584959, + 0.0605569200653, + 0.060757127066, + 0.0609491937834, + 0.0611331090866, + 0.0613088628917, + 0.0614764461617, + 0.0616358509061, + 0.0617870701811, + 0.0619300980892, + 0.0620649297781, + 0.0621915614407, + 0.062309990314, + 0.0624202146784, + 0.0625222338563, + 0.0626160482111, + 0.0627016591463, + 0.0627790691032, + 0.0628482815602, + 0.0629093010306, + 0.0629621330608, + 0.0630067842285, + 0.0630432621406, + 0.0630715754311, + 0.0630917337583, + 0.0631037478029, + 0.0631076292649, + 0.0631033908615, + 0.0630910463234, + 0.0630706103927, + 0.0630420988192, + 0.0630055283575, + 0.0629609167635, + 0.0629082827908, + 0.0628476461875, + 0.0627790276921, + 0.06270244903, + 0.062617932909, + 0.0625255030158, + 0.0624251840116, + 0.0623170015277, + 0.0622009821608, + 0.0620771534693, + 0.0619455439675, + 0.0618061831216, + 0.0616591013446, + 0.0615043299912, + 0.0613419013525, + 0.0611718486511, + 0.0609942060355, + 0.0608090085747, + 0.0606162922525, + 0.0604160939618, + 0.0602084514991, + 0.0599934035581, + 0.059770989724, + 0.0595412504671, + 0.0593042271369, + 0.0590599619555, + 0.0588084980111, + 0.0585498792516, + 0.0582841504778, + 0.0580113573368, + 0.0577315463148, + 0.0574447647307, + 0.0571510607284, + 0.05685048327, + 0.0565430821284, + 0.0562289078801, + 0.0559080118976, + 0.0555804463417, + 0.0552462641544, + 0.0549055190504, + 0.0545582655099, + 0.0542045587704, + 0.0538444548188, + 0.0534780103832, + 0.0531052829248, + 0.0527263306296, + 0.0523412124, + 0.0519499878464, + 0.051552717279, + 0.0511494616984, + 0.0507402827879, + 0.0503252429041, + 0.049904405068, + 0.0494778329568, + 0.0490455908941, + 0.0486077438412, + 0.0481643573882, + 0.0477154977444, + 0.047261231729, + 0.0468016267623, + 0.0463367508557, + 0.0458666726024, + 0.0453914611683, + 0.0449111862815, + 0.0444259182235, + 0.0439357278189, + 0.0434406864261, + 0.042940865927, + 0.0424363387172, + 0.0419271776963, + 0.0414134562577, + 0.0408952482785, + 0.0403726281094, + 0.0398456705645, + 0.0393144509112, + 0.0387790448601, + 0.0382395285541, + 0.0376959785586, + 0.0371484718509, + 0.0365970858096, + 0.0360418982046, + 0.0354829871859, + 0.0349204312736, + 0.034354309347, + 0.0337847006342, + 0.0332116847012, + 0.0326353414412, + 0.032055751064, + 0.0314729940854, + 0.0308871513161, + 0.0302983038508, + 0.0297065330578, + 0.0291119205678, + 0.0285145482631, + 0.0279144982669, + 0.0273118529317, + 0.0267066948293, + 0.0260991067391, + 0.0254891716375, + 0.0248769726867, + 0.0242625932239, + 0.02364611675, + 0.0230276269188, + 0.0224072075262, + 0.0217849424984, + 0.0211609158816, + 0.0205352118308, + 0.0199079145982, + 0.0192791085231, + 0.0186488780199, + 0.0180173075677, + 0.017384481699, + 0.0167504849886, + 0.0161154020428, + 0.0154793174881, + 0.0148423159604, + 0.0142044820937, + 0.0135659005097, + 0.012926655806, + 0.0122868325458, + 0.0116465152467, + 0.0110057883697, + 0.0103647363084, + 0.00972344337807, + 0.00908199380471, + 0.00844047171436, + 0.00779896112212, + 0.00715754592145, + 0.00651630987337, + 0.00587533659568, + 0.00523470955231, + 0.00459451204262, + 0.00395482719074, + 0.00331573793497, + 0.00267732701719, + 0.00203967697234, + 0.00140287011793, + 0.000766988543539, + 0.000132114100414, + -0.000501671608894, + -0.00113428724088, + -0.00176565172135, + -0.00239568425572, + -0.00302430433914, + -0.00365143176668, + -0.00427698664342, + -0.00490088939449, + -0.00552306077507, + -0.00614342188031, + -0.00676189415524, + -0.00737839940455, + -0.00799285980242, + -0.00860519790216, + -0.00921533664592, + -0.00982319937424, + -0.0104287098356, + -0.0110317921958, + -0.0116323710475, + -0.0122303714195, + -0.0128257187858, + -0.0134183390752, + -0.01400815868, + -0.0145951044653, + -0.0151791037781, + -0.0157600844557, + -0.016337974835, + -0.0169127037614, + -0.0174842005968, + -0.0180523952289, + -0.0186172180793, + -0.0191786001121, + -0.0197364728423, + -0.0202907683441, + -0.0208414192589, + -0.0213883588036, + -0.0219315207788, + -0.0224708395762, + -0.0230062501872, + -0.0235376882099, + -0.0240650898574, + -0.0245883919653, + -0.0251075319987, + -0.0256224480603, + -0.0261330788974, + -0.026639363909, + -0.0271412431531, + -0.027638657354, + -0.0281315479086, + -0.028619856894, + -0.0291035270735, + -0.0295825019039, + -0.0300567255418, + -0.03052614285, + -0.0309906994038, + -0.0314503414976, + -0.0319050161506, + -0.0323546711133, + -0.032799254873, + -0.0332387166601, + -0.0336730064534, + -0.0341020749861, + -0.0345258737512, + -0.0349443550068, + -0.0353574717815, + -0.0357651778797, + -0.0361674278868, + -0.0365641771737, + -0.0369553819021, + -0.0373409990294, + -0.037720986313, + -0.0380953023148, + -0.0384639064062, + -0.0388267587718, + -0.0391838204139, + -0.0395350531568, + -0.0398804196502, + -0.0402198833738, + -0.0405534086406, + -0.0408809606006, + -0.0412025052443, + -0.0415180094065, + -0.0418274407689, + -0.0421307678642, + -0.0424279600782, + -0.0427189876535, + -0.0430038216919, + -0.0432824341574, + -0.0435547978786, + -0.0438208865513, + -0.0440806747407, + -0.044334137884, + -0.0445812522922, + -0.0448219951521, + -0.0450563445285, + -0.0452842793657, + -0.0455057794893, + -0.0457208256076, + -0.0459293993132, + -0.0461314830842, + -0.0463270602853, + -0.046516115169, + -0.0466986328765, + -0.0468745994385, + -0.047044001776, + -0.0472068277008, + -0.0473630659157, + -0.0475127060156, + -0.0476557384869, + -0.047792154708, + -0.0479219469495, + -0.0480451083735, + -0.0481616330339, + -0.0482715158757, + -0.0483747527348, + -0.048471340337, + -0.0485612762978, + -0.0486445591211, + -0.0487211881985, + -0.0487911638081, + -0.0488544871135, + -0.0489111601623, + -0.0489611858847, + -0.0490045680921, + -0.0490413114755, + -0.0490714216033, + -0.04909490492, + -0.0491117687438, + -0.0491220212647, + -0.0491256715422, + -0.0491227295028, + -0.0491132059379, + -0.049097112501, + -0.0490744617051, + -0.0490452669198, + -0.0490095423687, + -0.0489673031258, + -0.0489185651133, + -0.0488633450973, + -0.0488016606855, + -0.048733530323, + -0.048658973289, + -0.0485780096932, + -0.0484906604721, + -0.0483969473849, + -0.0482968930095, + -0.0481905207388, + -0.0480778547763, + -0.0479589201315, + -0.0478337426159, + -0.0477023488386, + -0.0475647662012, + -0.0474210228935, + -0.0472711478887, + -0.0471151709383, + -0.0469531225671, + -0.0467850340685, + -0.0466109374988, + -0.0464308656722, + -0.0462448521553, + -0.0460529312618, + -0.0458551380467, + -0.0456515083008, + -0.0454420785449, + -0.045226886024, + -0.0450059687012, + -0.0447793652519, + -0.0445471150575, + -0.0443092581992, + -0.0440658354521, + -0.0438168882782, + -0.0435624588203, + -0.0433025898956, + -0.0430373249887, + -0.0427667082452, + -0.0424907844647, + -0.0422095990943, + -0.0419231982209, + -0.0416316285652, + -0.0413349374737, + -0.0410331729119, + -0.0407263834574, + -0.0404146182917, + -0.0400979271937, + -0.0397763605317, + -0.039449969256, + -0.0391188048914, + -0.0387829195292, + -0.03844236582, + -0.0380971969653, + -0.0377474667101, + -0.0373932293345, + -0.0370345396463, + -0.0366714529723, + -0.0363040251506, + -0.0359323125222, + -0.0355563719231, + -0.0351762606754, + -0.0347920365796, + -0.0344037579057, + -0.0340114833851, + -0.0336152722017, + -0.0332151839837, + -0.0328112787948, + -0.0324036171257, + -0.0319922598852, + -0.0315772683914, + -0.0311587043631, + -0.0307366299109, + -0.0303111075284, + -0.0298822000829, + -0.0294499708069, + -0.0290144832888, + -0.0285758014641, + -0.0281339896059, + -0.0276891123163, + -0.027241234517, + -0.0267904214398, + -0.0263367386183, + -0.0258802518775, + -0.0254210273255, + -0.0249591313437, + -0.0244946305776, + -0.0240275919274, + -0.0235580825388, + -0.0230861697933, + -0.0226119212993, + -0.0221354048821, + -0.0216566885748, + -0.0211758406086, + -0.0206929294036, + -0.0202080235592, + -0.0197211918445, + -0.0192325031888, + -0.018742026672, + -0.0182498315154, + -0.0177559870719, + -0.0172605628162, + -0.0167636283358, + -0.0162652533211, + -0.0157655075556, + -0.015264460907, + -0.0147621833172, + -0.0142587447924, + -0.0137542153945, + -0.0132486652304, + -0.0127421644436, + -0.0122347832036, + -0.0117265916972, + -0.0112176601182, + -0.0107080586587, + -0.0101978574991, + -0.00968712679842, + -0.00917593668545, + -0.00866435724875, + -0.00815245852747, + -0.00764031050179, + -0.0071279830836, + -0.00661554610708, + -0.00610306931933, + -0.00559062237104, + -0.00507827480714, + -0.00456609605758, + -0.00405415542799, + -0.00354252209046, + -0.00303126507437, + -0.00252045325719, + -0.0020101553553, + -0.00150043991494, + -0.000991375303097, + -0.000483029698456, + 2.45289175845e-05, + 0.000531232769895, + 0.00103701429854, + 0.00154180616766, + 0.00204554127434, + 0.00254815275738, + 0.00304957400611, + 0.00354973866905, + 0.0040485806626, + 0.0045460341797, + 0.00504203369834, + 0.00553651399015, + 0.00602941012883, + 0.0065206574986, + 0.00701019180257, + 0.00749794907104, + 0.00798386566979, + 0.00846787830827, + 0.00894992404774, + 0.0094299403094, + 0.00990786488239, + 0.0103836359318, + 0.0108571920065, + 0.0113284720471, + 0.0117974153937, + 0.0122639617935, + 0.0127280514087, + 0.013189624824, + 0.0136486230537, + 0.01410498755, + 0.0145586602097, + 0.0150095833818, + 0.0154576998745, + 0.0159029529629, + 0.0163452863956, + 0.0167846444019, + 0.0172209716987, + 0.0176542134977, + 0.0180843155115, + 0.0185112239613, + 0.0189348855827, + 0.0193552476326, + 0.0197722578958, + 0.0201858646913, + 0.0205960168786, + 0.0210026638639, + 0.0214057556067, + 0.021805242625, + 0.0222010760023, + 0.0225932073928, + 0.0229815890276, + 0.0233661737204, + 0.0237469148728, + 0.0241237664804, + 0.024496683138, + 0.024865620045, + 0.0252305330107, + 0.0255913784596, + 0.0259481134365, + 0.0263006956114, + 0.0266490832846, + 0.0269932353915, + 0.0273331115073, + 0.0276686718516, + 0.0279998772934, + 0.0283266893549, + 0.0286490702163, + 0.02896698272, + 0.029280390375, + 0.0295892573604, + 0.0298935485299, + 0.0301932294157, + 0.030488266232, + 0.0307786258788, + 0.0310642759457, + 0.0313451847151, + 0.0316213211659, + 0.0318926549764, + 0.032159156528, + 0.0324207969079, + 0.0326775479122, + 0.0329293820491, + 0.0331762725411, + 0.0334181933281, + 0.0336551190702, + 0.0338870251497, + 0.0341138876735, + 0.0343356834761, + 0.0345523901208, + 0.0347639859025, + 0.0349704498494, + 0.0351717617248, + 0.035367902029, + 0.0355588520012, + 0.0357445936203, + 0.0359251096074, + 0.0361003834262, + 0.036270399285, + 0.0364351421372, + 0.0365945976829, + 0.0367487523695, + 0.0368975933927, + 0.0370411086972, + 0.0371792869771, + 0.0373121176767, + 0.0374395909911, + 0.0375616978659, + 0.037678429998, + 0.0377897798354, + 0.0378957405772, + 0.0379963061737, + 0.038091471326, + 0.038181231486, + 0.0382655828554, + 0.0383445223859, + 0.038418047778, + 0.0384861574807, + 0.0385488506904, + 0.0386061273502, + 0.0386579881486, + 0.0387044345187, + 0.0387454686368, + 0.038781093421, + 0.03881131253, + 0.0388361303614, + 0.03885555205, + 0.0388695834663, + 0.0388782312145, + 0.0388815026308, + 0.0388794057811, + 0.038871949459, + 0.0388591431834, + 0.0388409971968, + 0.0388175224619, + 0.0387887306602, + 0.0387546341883, + 0.0387152461562, + 0.0386705803837, + 0.0386206513979, + 0.0385654744304, + 0.0385050654137, + 0.0384394409783, + 0.0383686184498, + 0.0382926158447, + 0.0382114518679, + 0.0381251459084, + 0.0380337180361, + 0.037937188998, + 0.0378355802142, + 0.0377289137743, + 0.0376172124332, + 0.0375004996073, + 0.0373787993699, + 0.0372521364474, + 0.0371205362147, + 0.0369840246908, + 0.0368426285347, + 0.0366963750402, + 0.0365452921316, + 0.0363894083592, + 0.0362287528938, + 0.0360633555224, + 0.035893246643, + 0.0357184572597, + 0.0355390189772, + 0.0353549639959, + 0.0351663251065, + 0.0349731356849, + 0.0347754296861, + 0.0345732416395, + 0.0343666066429, + 0.0341555603567, + 0.0339401389986, + 0.0337203793373, + 0.0334963186871, + 0.0332679949019, + 0.0330354463688, + 0.0327987120025, + 0.0325578312389, + 0.0323128440291, + 0.032063790833, + 0.031810712613, + 0.0315536508276, + 0.0312926474251, + 0.0310277448369, + 0.0307589859712, + 0.0304864142059, + 0.0302100733827, + 0.0299300077996, + 0.0296462622043, + 0.029358881788, + 0.0290679121775, + 0.0287733994291, + 0.028475390021, + 0.0281739308467, + 0.0278690692077, + 0.0275608528065, + 0.0272493297391, + 0.0269345484881, + 0.0266165579153, + 0.0262954072543, + 0.0259711461035, + 0.0256438244181, + 0.0253134925032, + 0.0249802010061, + 0.0246440009085, + 0.0243049435197, + 0.0239630804683, + 0.0236184636947, + 0.0232711454439, + 0.0229211782571, + 0.0225686149646, + 0.0222135086777, + 0.0218559127812, + 0.021495880925, + 0.0211334670172, + 0.0207687252154, + 0.0204017099192, + 0.0200324757621, + 0.0196610776039, + 0.0192875705225, + 0.0189120098059, + 0.0185344509443, + 0.018154949622, + 0.0177735617097, + 0.0173903432559, + 0.0170053504793, + 0.0166186397605, + 0.0162302676343, + 0.0158402907809, + 0.0154487660186, + 0.0150557502949, + 0.0146613006792, + 0.014265474354, + 0.0138683286071, + 0.0134699208236, + 0.0130703084774, + 0.0126695491231, + 0.0122677003884, + 0.0118648199653, + 0.0114609656023, + 0.0110561950962, + 0.010650566284, + 0.0102441370348, + 0.00983696524164, + 0.00942910881337, + 0.00902062566659, + 0.00861157371755, + 0.0082020108741, + 0.00779199502759, + 0.0073815840448, + 0.00697083575996, + 0.00655980796667, + 0.00614855840993, + 0.00573714477813, + 0.00532562469507, + 0.00491405571203, + 0.00450249529983, + 0.00409100084092, + 0.00367962962148, + 0.00326843882359, + 0.00285748551736, + 0.00244682665313, + 0.00203651905369, + 0.00162661940652, + 0.00121718425607, + 0.000808269996037, + 0.000399932861746, + -7.77107752303e-06, + -0.000414785926115, + -0.00082105596957, + -0.00122652568215, + -0.00163113973434, + -0.00203484300028, + -0.00243758056521, + -0.00283929773283, + -0.00323994003264, + -0.00363945322725, + -0.0040377833196, + -0.0044348765602, + -0.00483067945427, + -0.00522513876889, + -0.00561820154005, + -0.00600981507967, + -0.0063999269826, + -0.00678848513355, + -0.00717543771394, + -0.00756073320875, + -0.0079443204133, + -0.00832614843997, + -0.00870616672483, + -0.00908432503434, + -0.00946057347184, + -0.00983486248408, + -0.0102071428676, + -0.0105773657754, + -0.0109454827228, + -0.011311445594, + -0.0116752066484, + -0.0120367185265, + -0.0123959342562, + -0.0127528072586, + -0.0131072913541, + -0.0134593407684, + -0.0138089101381, + -0.0141559545165, + -0.0145004293797, + -0.0148422906315, + -0.0151814946098, + -0.0155179980915, + -0.0158517582979, + -0.0161827329006, + -0.0165108800264, + -0.0168361582624, + -0.0171585266614, + -0.0174779447471, + -0.0177943725186, + -0.0181077704558, + -0.018418099524, + -0.0187253211788, + -0.0190293973708, + -0.0193302905499, + -0.0196279636705, + -0.0199223801954, + -0.0202135041005, + -0.0205012998788, + -0.0207857325451, + -0.0210667676397, + -0.0213443712329, + -0.0216185099286, + -0.0218891508684, + -0.0221562617356, + -0.0224198107587, + -0.0226797667151, + -0.0229360989349, + -0.023188777304, + -0.0234377722682, + -0.0236830548358, + -0.0239245965814, + -0.0241623696486, + -0.0243963467536, + -0.0246265011879, + -0.0248528068212, + -0.0250752381044, + -0.0252937700722, + -0.0255083783458, + -0.0257190391356, + -0.0259257292435, + -0.0261284260654, + -0.0263271075935, + -0.0265217524185, + -0.0267123397318, + -0.0268988493275, + -0.0270812616045, + -0.027259557568, + -0.0274337188319, + -0.0276037276198, + -0.0277695667671, + -0.0279312197226, + -0.0280886705493, + -0.0282419039265, + -0.0283909051506, + -0.0285356601363, + -0.028676155418, + -0.0288123781503, + -0.0289443161094, + -0.0290719576935, + -0.0291952919237, + -0.0293143084447, + -0.0294289975252, + -0.0295393500586, + -0.029645357563, + -0.0297470121817, + -0.0298443066836, + -0.0299372344627, + -0.0300257895388, + -0.0301099665569, + -0.0301897607873, + -0.0302651681253, + -0.030336185091, + -0.0304028088284, + -0.0304650371054, + -0.0305228683131, + -0.0305763014648, + -0.0306253361955, + -0.0306699727611, + -0.0307102120372, + -0.0307460555181, + -0.0307775053159, + -0.0308045641592, + -0.0308272353915, + -0.0308455229704, + -0.0308594314655, + -0.0308689660573, + -0.0308741325356, + -0.0308749372973, + -0.0308713873451, + -0.0308634902853, + -0.030851254326, + -0.0308346882752, + -0.0308138015381, + -0.0307886041155, + -0.0307591066013, + -0.0307253201799, + -0.0306872566241, + -0.0306449282923, + -0.030598348126, + -0.0305475296471, + -0.0304924869551, + -0.0304332347244, + -0.0303697882009, + -0.0303021631996, + -0.0302303761012, + -0.0301544438489, + -0.0300743839455, + -0.0299902144494, + -0.0299019539721, + -0.0298096216741, + -0.0297132372617, + -0.029612820983, + -0.0295083936249, + -0.0293999765086, + -0.0292875914865, + -0.0291712609377, + -0.0290510077643, + -0.0289268553876, + -0.0287988277437, + -0.0286669492792, + -0.0285312449477, + -0.0283917402045, + -0.0282484610031, + -0.0281014337905, + -0.0279506855023, + -0.0277962435588, + -0.0276381358602, + -0.0274763907814, + -0.0273110371682, + -0.0271421043317, + -0.0269696220439, + -0.0267936205325, + -0.0266141304762, + -0.0264311829996, + -0.0262448096679, + -0.026055042482, + -0.0258619138734, + -0.0256654566986, + -0.0254657042342, + -0.025262690171, + -0.0250564486094, + -0.0248470140531, + -0.0246344214043, + -0.0244187059576, + -0.0241999033948, + -0.0239780497791, + -0.0237531815493, + -0.0235253355142, + -0.0232945488469, + -0.0230608590788, + -0.0228243040936, + -0.0225849221219, + -0.0223427517348, + -0.022097831838, + -0.0218502016658, + -0.021599900775, + -0.0213469690392, + -0.0210914466417, + -0.0208333740705, + -0.0205727921111, + -0.0203097418408, + -0.0200442646223, + -0.0197764020975, + -0.0195061961807, + -0.0192336890529, + -0.0189589231549, + -0.0186819411811, + -0.0184027860729, + -0.0181215010124, + -0.0178381294158, + -0.0175527149268, + -0.0172653014101, + -0.0169759329449, + -0.0166846538184, + -0.0163915085188, + -0.016096541729, + -0.0157997983198, + -0.0155013233434, + -0.0152011620266, + -0.0148993597638, + -0.014595962111, + -0.0142910147783, + -0.0139845636237, + -0.0136766546461, + -0.0133673339786, + -0.0130566478817, + -0.0127446427365, + -0.0124313650381, + -0.0121168613886, + -0.0118011784901, + -0.0114843631385, + -0.0111664622162, + -0.0108475226854, + -0.0105275915813, + -0.0102067160055, + -0.00988494311869, + -0.00956232013437, + -0.00923889431172, + -0.00891471294892, + -0.0085898233763, + -0.00826427294954, + -0.00793810904295, + -0.00761137904258, + -0.00728413033954, + -0.00695641032319, + -0.00662826637439, + -0.00629974585875, + -0.00597089611991, + -0.00564176447281, + -0.00531239819702, + -0.00498284452997, + -0.00465315066036, + -0.00432336372145, + -0.00399353078445, + -0.00366369885187, + -0.00333391485092, + -0.00300422562696, + -0.00267467793691, + -0.00234531844271, + -0.00201619370482, + -0.0016873501757, + -0.00135883419339, + -0.00103069197503, + -0.000702969610455, + -0.000375713055814, + -4.89681272062e-05, + 0.000277219505644, + 0.000602804325689, + 0.000927740974823, + 0.00125198426012, + 0.00157548916004, + 0.00189821083059, + 0.00222010461146, + 0.00254112603214, + 0.00286123081796, + 0.00318037489613, + 0.00349851440173, + 0.00381560568363, + 0.00413160531048, + 0.00444647007647, + 0.00476015700726, + 0.00507262336571, + 0.00538382665764, + 0.00569372463755, + 0.00600227531425, + 0.00630943695648, + 0.00661516809851, + 0.00691942754562, + 0.00722217437959, + 0.00752336796414, + 0.0078229679503, + 0.00812093428172, + 0.0084172272, + 0.00871180724986, + 0.00900463528436, + 0.00929567247, + 0.00958488029184, + 0.00987222055844, + 0.0101576554069, + 0.0104411473078, + 0.0107226590699, + 0.011002153845, + 0.0112795951331, + 0.0115549467862, + 0.0118281730137, + 0.0120992383869, + 0.012368107843, + 0.0126347466902, + 0.0128991206115, + 0.0131611956695, + 0.0134209383105, + 0.0136783153687, + 0.0139332940702, + 0.0141858420374, + 0.0144359272929, + 0.0146835182634, + 0.0149285837835, + 0.0151710930999, + 0.0154110158747, + 0.0156483221895, + 0.0158829825487, + 0.0161149678835, + 0.0163442495549, + 0.0165707993576, + 0.0167945895228, + 0.0170155927224, + 0.0172337820711, + 0.0174491311307, + 0.0176616139122, + 0.0178712048796, + 0.0180778789524, + 0.0182816115086, + 0.0184823783876, + 0.0186801558928, + 0.0188749207946, + 0.0190666503325, + 0.0192553222181, + 0.0194409146372, + 0.0196234062525, + 0.0198027762056, + 0.0199790041197, + 0.0201520701012, + 0.0203219547423, + 0.0204886391226, + 0.0206521048116, + 0.0208123338699, + 0.0209693088516, + 0.0211230128057, + 0.0212734292778, + 0.0214205423119, + 0.0215643364516, + 0.0217047967417, + 0.0218419087296, + 0.0219756584665, + 0.0221060325087, + 0.0222330179186, + 0.0223566022659, + 0.0224767736286, + 0.0225935205937, + 0.0227068322583, + 0.0228166982302, + 0.0229231086288, + 0.0230260540855, + 0.0231255257441, + 0.0232215152618, + 0.023314014809, + 0.0234030170701, + 0.0234885152433, + 0.0235705030412, + 0.0236489746906, + 0.0237239249326, + 0.0237953490226, + 0.02386324273, + 0.0239276023383, + 0.0239884246445, + 0.024045706959, + 0.0240994471049, + 0.0241496434179, + 0.0241962947454, + 0.0242394004459, + 0.0242789603883, + 0.0243149749515, + 0.0243474450227, + 0.0243763719973, + 0.0244017577775, + 0.0244236047712, + 0.024441915891, + 0.0244566945528, + 0.0244679446747, + 0.0244756706757, + 0.0244798774739, + 0.0244805704853, + 0.0244777556223, + 0.0244714392916, + 0.0244616283932, + 0.024448330318, + 0.0244315529462, + 0.0244113046454, + 0.0243875942687, + 0.0243604311524, + 0.0243298251141, + 0.0242957864504, + 0.0242583259347, + 0.0242174548151, + 0.0241731848116, + 0.0241255281138, + 0.0240744973788, + 0.0240201057279, + 0.0239623667447, + 0.0239012944718, + 0.0238369034086, + 0.0237692085079, + 0.0236982251735, + 0.0236239692569, + 0.0235464570548, + 0.0234657053053, + 0.0233817311854, + 0.0232945523077, + 0.0232041867167, + 0.0231106528863, + 0.0230139697157, + 0.0229141565265, + 0.0228112330589, + 0.0227052194685, + 0.0225961363224, + 0.0224840045958, + 0.0223688456682, + 0.0222506813196, + 0.0221295337271, + 0.0220054254605, + 0.0218783794789, + 0.0217484191263, + 0.021615568128, + 0.0214798505865, + 0.0213412909773, + 0.0211999141445, + 0.0210557452974, + 0.0209088100054, + 0.0207591341943, + 0.0206067441417, + 0.0204516664728, + 0.0202939281559, + 0.0201335564978, + 0.0199705791399, + 0.0198050240527, + 0.0196369195322, + 0.0194662941947, + 0.0192931769722, + 0.019117597108, + 0.0189395841517, + 0.0187591679544, + 0.0185763786642, + 0.0183912467211, + 0.018203802852, + 0.0180140780663, + 0.0178221036504, + 0.0176279111632, + 0.0174315324306, + 0.017232999541, + 0.0170323448397, + 0.0168296009242, + 0.016624800639, + 0.0164179770702, + 0.0162091635407, + 0.0159983936048, + 0.0157857010427, + 0.0155711198559, + 0.0153546842612, + 0.0151364286859, + 0.0149163877623, + 0.0146945963224, + 0.0144710893922, + 0.014245902187, + 0.0140190701054, + 0.013790628724, + 0.0135606137923, + 0.0133290612265, + 0.013096007105, + 0.0128614876622, + 0.0126255392831, + 0.0123881984979, + 0.0121495019768, + 0.0119094865236, + 0.0116681890711, + 0.0114256466748, + 0.0111818965078, + 0.0109369758551, + 0.0106909221077, + 0.0104437727577, + 0.0101955653919, + 0.00994633768664, + 0.0096961274023, + 0.00944497237738, + 0.00919291052303, + 0.00893997981745, + 0.00868621830021, + 0.00843166406671, + 0.00817635526248, + 0.00792033007765, + 0.00766362674127, + 0.00740628351572, + 0.00714833869114, + 0.00688983057977, + 0.00663079751042, + 0.00637127782281, + 0.00611130986205, + 0.00585093197305, + 0.00559018249494, + 0.00532909975552, + 0.00506772206573, + 0.0048060877141, + 0.00454423496126, + 0.00428220203437, + 0.00402002712171, + 0.00375774836712, + 0.00349540386458, + 0.00323303165275, + 0.00297066970955, + 0.00270835594672, + 0.00244612820444, + 0.00218402424594, + 0.00192208175216, + 0.00166033831641, + 0.00139883143902, + 0.0011375985221, + 0.000876676864232, + 0.000616103655219, + 0.000355915970881, + 9.6150767848e-05, + -0.000163155121618, + -0.000421964994766, + -0.000680242283477, + -0.000937950559354, + -0.00119505353879, + -0.001451515088, + -0.00170729922803, + -0.00196237013973, + -0.00221669216868, + -0.00247022983012, + -0.00272294781385, + -0.00297481098902, + -0.00322578440898, + -0.00347583331605, + -0.00372492314627, + -0.00397301953408, + -0.00422008831702, + -0.00446609554033, + -0.00471100746158, + -0.00495479055521, + -0.00519741151703, + -0.00543883726873, + -0.0056790349623, + -0.00591797198441, + -0.00615561596083, + -0.00639193476064, + -0.00662689650062, + -0.00686046954938, + -0.00709262253159, + -0.00732332433213, + -0.00755254410016, + -0.00778025125319, + -0.00800641548107, + -0.00823100674996, + -0.00845399530625, + -0.00867535168039, + -0.00889504669076, + -0.00911305144741, + -0.00932933735576, + -0.00954387612033, + -0.00975663974829, + -0.00996760055309, + -0.010176731158, + -0.0103840044994, + -0.0105893938305, + -0.0107928727245, + -0.010994415078, + -0.011193995114, + -0.0113915873856, + -0.0115871667788, + -0.0117807085155, + -0.011972188157, + -0.0121615816066, + -0.0123488651126, + -0.0125340152715, + -0.0127170090302, + -0.0128978236895, + -0.0130764369063, + -0.0132528266964, + -0.0134269714373, + -0.0135988498703, + -0.0137684411035, + -0.013935724614, + -0.0141006802501, + -0.0142632882339, + -0.0144235291635, + -0.0145813840149, + -0.0147368341447, + -0.0148898612915, + -0.0150404475787, + -0.0151885755156, + -0.0153342280001, + -0.01547738832, + -0.0156180401549, + -0.0157561675782, + -0.0158917550584, + -0.0160247874609, + -0.0161552500494, + -0.0162831284875, + -0.0164084088401, + -0.0165310775749, + -0.0166511215632, + -0.0167685280817, + -0.0168832848134, + -0.0169953798487, + -0.0171048016865, + -0.0172115392354, + -0.017315581814, + -0.0174169191526, + -0.0175155413934, + -0.0176114390914, + -0.0177046032151, + -0.0177950251473, + -0.0178826966852, + -0.0179676100415, + -0.0180497578442, + -0.0181291331376, + -0.018205729382, + -0.0182795404545, + -0.0183505606486, + -0.0184187846751, + -0.0184842076613, + -0.0185468251517, + -0.0186066331076, + -0.018663627907, + -0.0187178063444, + -0.0187691656309, + -0.0188177033933, + -0.0188634176744, + -0.0189063069318, + -0.0189463700384, + -0.0189836062809, + -0.0190180153598, + -0.0190495973886, + -0.0190783528928, + -0.0191042828097, + -0.0191273884869, + -0.0191476716819, + -0.019165134561, + -0.0191797796981, + -0.0191916100738, + -0.0192006290743, + -0.0192068404902, + -0.0192102485151, + -0.0192108577444, + -0.019208673174, + -0.0192037001989, + -0.0191959446114, + -0.0191854126002, + -0.019172110748, + -0.0191560460307, + -0.019137225815, + -0.0191156578573, + -0.0190913503011, + -0.019064311676, + -0.0190345508952, + -0.0190020772536, + -0.0189669004263, + -0.0189290304656, + -0.0188884777999, + -0.0188452532307, + -0.0187993679309, + -0.0187508334422, + -0.0186996616732, + -0.0186458648962, + -0.018589455746, + -0.0185304472161, + -0.0184688526572, + -0.0184046857741, + -0.0183379606233, + -0.0182686916102, + -0.0181968934865, + -0.0181225813473, + -0.0180457706284, + -0.0179664771035, + -0.0178847168812, + -0.0178005064021, + -0.0177138624357, + -0.0176248020776, + -0.0175333427464, + -0.0174395021802, + -0.0173432984341, + -0.0172447498763, + -0.0171438751856, + -0.0170406933473, + -0.0169352236507, + -0.0168274856851, + -0.0167174993368, + -0.0166052847856, + -0.0164908625011, + -0.0163742532394, + -0.0162554780397, + -0.0161345582203, + -0.0160115153753, + -0.015886371371, + -0.015759148342, + -0.0156298686875, + -0.0154985550678, + -0.0153652304004, + -0.0152299178558, + -0.0150926408544, + -0.014953423062, + -0.0148122883862, + -0.0146692609724, + -0.0145243651999, + -0.0143776256777, + -0.0142290672407, + -0.0140787149457, + -0.013926594067, + -0.0137727300928, + -0.0136171487207, + -0.0134598758537, + -0.0133009375959, + -0.0131403602486, + -0.0129781703058, + -0.0128143944503, + -0.0126490595489, + -0.0124821926488, + -0.0123138209728, + -0.0121439719152, + -0.0119726730375, + -0.0117999520641, + -0.0116258368776, + -0.0114503555148, + -0.0112735361623, + -0.0110954071517, + -0.0109159969558, + -0.0107353341836, + -0.0105534475761, + -0.0103703660018, + -0.0101861184524, + -0.010000734038, + -0.00981424198282, + -0.0096266716208, + -0.00943805239082, + -0.00924841383238, + -0.009057785581, + -0.00886619736374, + -0.00867367899463, + -0.00848026037015, + -0.00828597146467, + -0.00809084232593, + -0.00789490307046, + -0.00769818387905, + -0.00750071499217, + -0.00730252670545, + -0.00710364936511, + -0.00690411336337, + -0.00670394913397, + -0.00650318714755, + -0.00630185790711, + -0.00609999194351, + -0.00589761981087, + -0.00569477208207, + -0.00549147934419, + -0.005287772194, + -0.00508368123341, + -0.00487923706501, + -0.0046744702875, + -0.00446941149122, + -0.00426409125368, + -0.00405854013503, + -0.00385278867365, + -0.00364686738162, + -0.00344080674034, + -0.00323463719606, + -0.00302838915545, + -0.00282209298121, + -0.00261577898768, + -0.00240947743644, + -0.00220321853193, + -0.00199703241715, + -0.0017909491693, + -0.00158499879545, + -0.00137921122827, + -0.00117361632174, + -0.000968243846871, + -0.000763123487499, + -0.000558284836041, + -0.000353757389306, + -0.000149570544309, + 5.4246405878e-05, + 0.000257664276264, + 0.000460653994047, + 0.000663186602702, + 0.000865233266042, + 0.00106676527226, + 0.00126775403792, + 0.001468171112, + 0.00166798817976, + 0.00186717706678, + 0.00206570974276, + 0.00226355832549, + 0.00246069508465, + 0.00265709244562, + 0.00285272299329, + 0.00304755947582, + 0.00324157480838, + 0.0034347420768, + 0.0036270345413, + 0.00381842564005, + 0.00400888899286, + 0.00419839840465, + 0.00438692786908, + 0.00457445157196, + 0.00476094389478, + 0.00494637941813, + 0.00513073292507, + 0.00531397940449, + 0.00549609405448, + 0.00567705228553, + 0.00585682972389, + 0.00603540221467, + 0.0062127458251, + 0.00638883684761, + 0.00656365180295, + 0.00673716744322, + 0.00690936075496, + 0.00708020896201, + 0.00724968952856, + 0.00741778016198, + 0.00758445881567, + 0.00774970369194, + 0.0079134932447, + 0.00807580618223, + 0.00823662146987, + 0.00839591833266, + 0.00855367625791, + 0.00870987499782, + 0.00886449457193, + 0.00901751526962, + 0.00916891765255, + 0.009318682557, + 0.00946679109623, + 0.00961322466279, + 0.00975796493071, + 0.00990099385776, + 0.0100422936876, + 0.0101818469517, + 0.0103196364718, + 0.0104556453616, + 0.0105898570287, + 0.0107222551768, + 0.0108528238072, + 0.0109815472212, + 0.0111084100211, + 0.0112333971125, + 0.0113564937059, + 0.0114776853182, + 0.0115969577743, + 0.0117142972088, + 0.0118296900671, + 0.0119431231074, + 0.0120545834016, + 0.0121640583369, + 0.0122715356172, + 0.0123770032637, + 0.0124804496171, + 0.012581863338, + 0.0126812334079, + 0.0127785491311, + 0.0128738001347, + 0.0129669763702, + 0.0130580681141, + 0.0131470659689, + 0.0132339608637, + 0.0133187440552, + 0.0134014071282, + 0.0134819419962, + 0.0135603409024, + 0.0136365964196, + 0.0137107014514, + 0.0137826492319, + 0.0138524333269, + 0.0139200476335, + 0.0139854863808, + 0.0140487441303, + 0.0141098157756, + 0.0141686965429, + 0.0142253819911, + 0.0142798680117, + 0.0143321508288, + 0.0143822269993, + 0.0144300934123, + 0.0144757472895, + 0.0145191861848, + 0.0145604079837, + 0.0145994109037, + 0.0146361934933, + 0.0146707546318, + 0.0147030935293, + 0.0147332097255, + 0.0147611030897, + 0.0147867738197, + 0.0148102224419, + 0.0148314498098, + 0.0148504571039, + 0.0148672458306, + 0.0148818178215, + 0.0148941752325, + 0.0149043205426, + 0.0149122565535, + 0.0149179863882, + 0.01492151349, + 0.0149228416215, + 0.0149219748632, + 0.0149189176127, + 0.0149136745831, + 0.0149062508018, + 0.0148966516095, + 0.0148848826583, + 0.0148709499106, + 0.0148548596377, + 0.0148366184179, + 0.0148162331356, + 0.014793710979, + 0.0147690594391, + 0.0147422863076, + 0.0147133996752, + 0.0146824079301, + 0.0146493197562, + 0.0146141441308, + 0.0145768903233, + 0.014537567893, + 0.0144961866871, + 0.0144527568387, + 0.014407288765, + 0.0143597931649, + 0.0143102810172, + 0.0142587635782, + 0.0142052523797, + 0.0141497592264, + 0.0140922961942, + 0.0140328756275, + 0.013971510137, + 0.0139082125973, + 0.0138429961445, + 0.0137758741737, + 0.0137068603366, + 0.0136359685391, + 0.0135632129385, + 0.0134886079411, + 0.0134121681995, + 0.0133339086102, + 0.0132538443106, + 0.0131719906763, + 0.0130883633188, + 0.0130029780822, + 0.0129158510409, + 0.0128269984963, + 0.0127364369744, + 0.0126441832224, + 0.0125502542063, + 0.012454667108, + 0.0123574393215, + 0.0122585884512, + 0.0121581323077, + 0.0120560889054, + 0.0119524764596, + 0.0118473133826, + 0.0117406182815, + 0.0116324099547, + 0.0115227073883, + 0.0114115297539, + 0.0112988964044, + 0.0111848268714, + 0.0110693408617, + 0.0109524582543, + 0.0108341990967, + 0.0107145836019, + 0.010593632145, + 0.01047136526, + 0.0103478036362, + 0.0102229681148, + 0.0100968796859, + 0.00996955948477, + 0.00984102878837, + 0.00971130901217, + 0.00958042170656, + 0.00944838855339, + 0.00931523136251, + 0.00918097206825, + 0.00904563272599, + 0.00890923550855, + 0.00877180270275, + 0.00863335670582, + 0.00849392002189, + 0.00835351525839, + 0.00821216512255, + 0.00806989241777, + 0.00792672004007, + 0.0077826709745, + 0.00763776829155, + 0.00749203514353, + 0.00734549476097, + 0.00719817044906, + 0.00705008558394, + 0.00690126360918, + 0.00675172803209, + 0.00660150242012, + 0.00645061039723, + 0.00629907564028, + 0.00614692187537, + 0.0059941728742, + 0.00584085245051, + 0.00568698445636, + 0.00553259277856, + 0.00537770133502, + 0.00522233407114, + 0.00506651495617, + 0.00491026797958, + 0.00475361714748, + 0.00459658647899, + 0.00443920000263, + 0.00428148175271, + 0.00412345576575, + 0.00396514607691, + 0.00380657671633, + 0.00364777170567, + 0.00348875505443, + 0.00332955075648, + 0.00317018278645, + 0.00301067509621, + 0.00285105161138, + 0.00269133622772, + 0.00253155280771, + 0.00237172517702, + 0.00221187712101, + 0.00205203238127, + 0.00189221465217, + 0.0017324475774, + 0.00157275474655, + 0.00141315969168, + 0.00125368588395, + 0.00109435673017, + 0.000935195569501, + 0.000776225670052, + 0.000617470225566, + 0.000458952352092, + 0.000300695084686, + 0.000142721374124, + -1.49459163556e-05, + -0.000172284014306, + -0.000329270241292, + -0.000485882016098, + -0.00064209685791, + -0.000797892389482, + -0.000953246340281, + -0.0011081365496, + -0.00126254096966, + -0.0014164376687, + -0.00156980483399, + -0.0017226207749, + -0.00187486392589, + -0.00202651284948, + -0.00217754623923, + -0.00232794292264, + -0.00247768186406, + -0.00262674216761, + -0.00277510307997, + -0.00292274399325, + -0.00306964444775, + -0.00321578413479, + -0.00336114289937, + -0.00350570074298, + -0.00364943782619, + -0.00379233447138, + -0.00393437116533, + -0.00407552856183, + -0.00421578748424, + -0.00435512892804, + -0.00449353406333, + -0.0046309842373, + -0.00476746097669, + -0.00490294599017, + -0.00503742117078, + -0.00517086859821, + -0.00530327054118, + -0.00543460945965, + -0.00556486800717, + -0.005694029033, + -0.00582207558435, + -0.00594899090851, + -0.00607475845497, + -0.00619936187751, + -0.00632278503624, + -0.00644501199958, + -0.00656602704631, + -0.00668581466744, + -0.00680435956815, + -0.00692164666965, + -0.00703766111102, + -0.00715238825101, + -0.00726581366979, + -0.00737792317067, + -0.00748870278182, + -0.00759813875787, + -0.00770621758159, + -0.00781292596539, + -0.00791825085293, + -0.00802217942055, + -0.00812469907881, + -0.00822579747384, + -0.00832546248879, + -0.00842368224515, + -0.00852044510404, + -0.00861573966751, + -0.00870955477979, + -0.00880187952843, + -0.0088927032455, + -0.0089820155087, + -0.00906980614241, + -0.00915606521875, + -0.00924078305861, + -0.00932395023252, + -0.00940555756168, + -0.00948559611876, + -0.00956405722877, + -0.00964093246986, + -0.00971621367409, + -0.00978989292813, + -0.00986196257398, + -0.00993241520957, + -0.0100012436894, + -0.010068441125, + -0.0101340008858, + -0.010197916599, + -0.0102601821506, + -0.0103207916855, + -0.0103797396079, + -0.0104370205819, + -0.0104926295311, + -0.0105465616398, + -0.0105988123523, + -0.0106493773737, + -0.0106982526696, + -0.0107454344666, + -0.0107909192519, + -0.0108347037738, + -0.0108767850412, + -0.0109171603238, + -0.0109558271518, + -0.0109927833162, + -0.0110280268679, + -0.0110615561182, + -0.011093369638, + -0.0111234662577, + -0.011151845067, + -0.0111785054142, + -0.011203446906, + -0.0112266694072, + -0.0112481730397, + -0.0112679581824, + -0.0112860254706, + -0.0113023757953, + -0.0113170103023, + -0.011329930392, + -0.0113411377185, + -0.0113506341885, + -0.0113584219611, + -0.0113645034466, + -0.0113688813056, + -0.0113715584483, + -0.0113725380335, + -0.0113718234675, + -0.0113694184033, + -0.0113653267394, + -0.0113595526187, + -0.0113521004276, + -0.0113429747946, + -0.0113321805893, + -0.011319722921, + -0.0113056071377, + -0.0112898388247, + -0.011272423803, + -0.0112533681286, + -0.0112326780903, + -0.0112103602092, + -0.0111864212364, + -0.0111608681521, + -0.0111337081637, + -0.0111049487047, + -0.0110745974326, + -0.0110426622277, + -0.0110091511913, + -0.0109740726442, + -0.0109374351248, + -0.0108992473872, + -0.0108595184002, + -0.0108182573445, + -0.0107754736119, + -0.0107311768025, + -0.0106853767237, + -0.0106380833877, + -0.0105893070098, + -0.0105390580066, + -0.0104873469937, + -0.0104341847839, + -0.0103795823852, + -0.0103235509988, + -0.0102661020167, + -0.0102072470199, + -0.0101469977763, + -0.0100853662382, + -0.0100223645407, + -0.00995800499893, + -0.00989230010612, + -0.00982526253135, + -0.00975690511725, + -0.00968724087769, + -0.00961628299552, + -0.0095440448202, + -0.00947053986548, + -0.00939578180702, + -0.00931978448002, + -0.00924256187678, + -0.00916412814429, + -0.0090844975818, + -0.00900368463832, + -0.00892170391018, + -0.00883857013852, + -0.00875429820675, + -0.00866890313803, + -0.00858240009277, + -0.00849480436598, + -0.00840613138477, + -0.0083163967057, + -0.0082256160122, + -0.00813380511197, + -0.00804097993428, + -0.0079471565274, + -0.00785235105587, + -0.00775657979786, + -0.0076598591425, + -0.00756220558715, + -0.0074636357347, + -0.00736416629088, + -0.00726381406149, + -0.00716259594969, + -0.00706052895325, + -0.0069576301618, + -0.00685391675402, + -0.00674940599493, + -0.00664411523309, + -0.0065380618978, + -0.00643126349629, + -0.00632373761097, + -0.00621550189659, + -0.00610657407745, + -0.00599697194456, + -0.00588671335282, + -0.00577581621824, + -0.00566429851505, + -0.00555217827293, + -0.00543947357412, + -0.00532620255062, + -0.00521238338136, + -0.00509803428933, + -0.00498317353876, + -0.00486781943227, + -0.00475199030805, + -0.00463570453698, + -0.00451898051985, + -0.00440183668446, + -0.00428429148283, + -0.00416636338834, + -0.00404807089291, + -0.00392943250415, + -0.00381046674258, + -0.00369119213876, + -0.00357162723051, + -0.00345179056005, + -0.00333170067126, + -0.00321137610681, + -0.0030908354054, + -0.00297009709898, + -0.00284917970991, + -0.00272810174827, + -0.00260688170901, + -0.00248553806923, + -0.00236408928543, + -0.00224255379074, + -0.00212094999221, + -0.00199929626807, + -0.00187761096502, + -0.00175591239554, + -0.00163421883514, + -0.00151254851976, + -0.00139091964303, + -0.00126935035365, + -0.00114785875269, + -0.00102646289104, + -0.000905180766705, + -0.000784030322239, + -0.000663029442141, + -0.000542195950273, + -0.000421547607293, + -0.000301102108102, + -0.000180877079311, + -6.08900767178e-05, + 5.88414171986e-05, + 0.000178299995767, + 0.000297468330595, + 0.000416329174024, + 0.000534865361573, + 0.00065305981435, + 0.000770895541463, + 0.000888355642398, + 0.00100542330939, + 0.00112208182976, + 0.00123831458827, + 0.00135410506938, + 0.0014694368596, + 0.0015842936497, + 0.00169865923699, + 0.00181251752755, + 0.0019258525384, + 0.00203864839974, + 0.00215088935706, + 0.00226255977331, + 0.002373644131, + 0.00248412703434, + 0.00259399321123, + 0.00270322751539, + 0.00281181492837, + 0.0029197405615, + 0.00302698965794, + 0.00313354759459, + 0.00323939988403, + 0.00334453217646, + 0.00344893026151, + 0.00355258007017, + 0.00365546767658, + 0.00375757929985, + 0.00385890130582, + 0.00395942020884, + 0.00405912267349, + 0.00415799551627, + 0.00425602570729, + 0.0043532003719, + 0.00444950679233, + 0.00454493240926, + 0.00463946482341, + 0.00473309179709, + 0.00482580125564, + 0.00491758128902, + 0.00500842015315, + 0.00509830627145, + 0.00518722823615, + 0.0052751748097, + 0.00536213492609, + 0.0054480976922, + 0.00553305238904, + 0.00561698847302, + 0.00569989557721, + 0.00578176351245, + 0.0058625822686, + 0.00594234201565, + 0.00602103310479, + 0.00609864606954, + 0.00617517162676, + 0.0062506006777, + 0.00632492430894, + 0.00639813379337, + 0.00647022059115, + 0.00654117635052, + 0.00661099290878, + 0.00667966229299, + 0.00674717672091, + 0.00681352860166, + 0.00687871053653, + 0.00694271531966, + 0.00700553593874, + 0.00706716557566, + 0.00712759760708, + 0.0071868256051, + 0.00724484333775, + 0.00730164476954, + 0.00735722406195, + 0.00741157557392, + 0.00746469386224, + 0.00751657368196, + 0.0075672099868, + 0.00761659792945, + 0.00766473286189, + 0.00771161033565, + 0.0077572261021, + 0.00780157611264, + 0.00784465651886, + 0.00788646367274, + 0.00792699412674, + 0.00796624463391, + 0.00800421214794, + 0.0080408938232, + 0.00807628701473, + 0.00811038927822, + 0.00814319836995, + 0.00817471224667, + 0.00820492906553, + 0.00823384718388, + 0.0082614651591, + 0.00828778174843, + 0.00831279590865, + 0.00833650679586, + 0.0083589137652, + 0.00838001637044, + 0.00839981436369, + 0.00841830769499, + 0.00843549651185, + 0.00845138115887, + 0.00846596217721, + 0.0084792403041, + 0.0084912164723, + 0.00850189180954, + 0.00851126763792, + 0.00851934547329, + 0.00852612702461, + 0.00853161419326, + 0.00853580907234, + 0.00853871394591, + 0.00854033128829, + 0.00854066376321, + 0.00853971422301, + 0.00853748570783, + 0.0085339814447, + 0.00852920484665, + 0.00852315951181, + 0.00851584922244, + 0.00850727794395, + 0.00849744982393, + 0.00848636919107, + 0.00847404055418, + 0.00846046860104, + 0.00844565819734, + 0.00842961438554, + 0.00841234238373, + 0.00839384758443, + 0.00837413555341, + 0.00835321202845, + 0.00833108291811, + 0.00830775430045, + 0.00828323242172, + 0.00825752369508, + 0.00823063469922, + 0.00820257217701, + 0.00817334303414, + 0.00814295433767, + 0.00811141331465, + 0.00807872735061, + 0.00804490398816, + 0.00800995092544, + 0.00797387601463, + 0.00793668726044, + 0.00789839281851, + 0.00785900099389, + 0.00781852023938, + 0.007776959154, + 0.00773432648132, + 0.00769063110777, + 0.00764588206108, + 0.00760008850848, + 0.00755325975507, + 0.00750540524208, + 0.00745653454514, + 0.0074066573725, + 0.0073557835633, + 0.00730392308574, + 0.00725108603533, + 0.00719728263303, + 0.00714252322342, + 0.00708681827288, + 0.00703017836769, + 0.0069726142122, + 0.00691413662689, + 0.0068547565465, + 0.00679448501808, + 0.00673333319912, + 0.00667131235551, + 0.00660843385969, + 0.0065447091886, + 0.00648014992175, + 0.00641476773919, + 0.00634857441954, + 0.00628158183797, + 0.00621380196416, + 0.00614524686028, + 0.00607592867895, + 0.00600585966119, + 0.00593505213432, + 0.00586351850995, + 0.00579127128185, + 0.00571832302391, + 0.00564468638799, + 0.00557037410185, + 0.00549539896707, + 0.00541977385687, + 0.00534351171402, + 0.00526662554873, + 0.00518912843649, + 0.00511103351593, + 0.0050323539867, + 0.0049531031073, + 0.00487329419292, + 0.00479294061331, + 0.00471205579059, + 0.00463065319712, + 0.0045487463533, + 0.0044663488254, + 0.00438347422343, + 0.00430013619891, + 0.00421634844274, + 0.00413212468299, + 0.00404747868274, + 0.0039624242379, + 0.00387697517504, + 0.00379114534917, + 0.00370494864162, + 0.00361839895783, + 0.00353151022516, + 0.00344429639076, + 0.00335677141935, + 0.00326894929106, + 0.00318084399931, + 0.00309246954855, + 0.00300383995219, + 0.00291496923039, + 0.00282587140791, + 0.00273656051196, + 0.00264705057007, + 0.00255735560791, + 0.00246748964719, + 0.00237746670351, + 0.00228730078423, + 0.00219700588636, + 0.00210659599444, + 0.00201608507841, + 0.00192548709155, + 0.00183481596837, + 0.00174408562249, + 0.00165330994462, + 0.00156250280045, + 0.00147167802858, + 0.00138084943849, + 0.00129003080851, + 0.00119923588374, + 0.00110847837405, + 0.00101777195206, + 0.000927130251143, + 0.000836566863416, + 0.000746095337763, + 0.000655729177861, + 0.000565481840216, + 0.000475366732211, + 0.000385397210173, + 0.00029558657744, + 0.000205948082453, + 0.000116494916847, + 2.72402135687e-05, + -6.18029550015e-05, + -0.000150621578911, + -0.000239202712483, + -0.000327533476152, + -0.000415601058283, + -0.000503392716976, + -0.000590895781858, + -0.000678097655861, + -0.000764985816976, + -0.000851547820007, + -0.000937771298294, + -0.00102364396543, + -0.00110915361696, + -0.00119428813204, + -0.00127903547516, + -0.00136338369771, + -0.00144732093969, + -0.00153083543126, + -0.00161391549438, + -0.00169654954435, + -0.00177872609142, + -0.00186043374228, + -0.00194166120163, + -0.00202239727364, + -0.00210263086348, + -0.00218235097876, + -0.00226154673099, + -0.002340207337, + -0.00241832212038, + -0.00249588051282, + -0.00257287205554, + -0.00264928640059, + -0.00272511331222, + -0.00280034266816, + -0.00287496446092, + -0.0029489687991, + -0.00302234590857, + -0.00309508613373, + -0.00316717993875, + -0.00323861790871, + -0.00330939075077, + -0.00337948929535, + -0.00344890449721, + -0.00351762743658, + -0.00358564932022, + -0.00365296148248, + -0.00371955538635, + -0.00378542262447, + -0.00385055492008, + -0.00391494412805, + -0.0039785822358, + -0.00404146136418, + -0.00410357376846, + -0.00416491183913, + -0.00422546810279, + -0.00428523522298, + -0.00434420600097, + -0.00440237337657, + -0.0044597304289, + -0.00451627037709, + -0.00457198658104, + -0.00462687254208, + -0.00468092190366, + -0.004734128452, + -0.0047864861167, + -0.00483798897133, + -0.00488863123404, + -0.00493840726808, + -0.00498731158236, + -0.00503533883192, + -0.00508248381844, + -0.00512874149068, + -0.00517410694493, + -0.00521857542541, + -0.00526214232467, + -0.00530480318391, + -0.0053465536934, + -0.00538738969272, + -0.00542730717108, + -0.00546630226759, + -0.00550437127152, + -0.00554151062248, + -0.00557771691066, + -0.00561298687699, + -0.00564731741326, + -0.0056807055623, + -0.00571314851803, + -0.00574464362558, + -0.00577518838132, + -0.00580478043291, + -0.0058334175793, + -0.00586109777071, + -0.00588781910861, + -0.00591357984562, + -0.0059383783855, + -0.00596221328295, + -0.00598508324355, + -0.00600698712358, + -0.00602792392985, + -0.0060478928195, + -0.00606689309975, + -0.00608492422772, + -0.00610198581009, + -0.00611807760288, + -0.00613319951107, + -0.00614735158833, + -0.00616053403661, + -0.00617274720579, + -0.0061839915933, + -0.00619426784364, + -0.00620357674798, + -0.0062119192437, + -0.00621929641386, + -0.00622570948674, + -0.00623115983528, + -0.00623564897654, + -0.00623917857114, + -0.00624175042263, + -0.00624336647692, + -0.00624402882163, + -0.00624373968541, + -0.00624250143732, + -0.00624031658608, + -0.00623718777939, + -0.0062331178032, + -0.00622810958092, + -0.00622216617268, + -0.00621529077452, + -0.00620748671758, + -0.00619875746729, + -0.00618910662249, + -0.00617853791457, + -0.00616705520661, + -0.00615466249241, + -0.00614136389567, + -0.00612716366892, + -0.00611206619269, + -0.00609607597442, + -0.00607919764757, + -0.00606143597051, + -0.00604279582558, + -0.00602328221797, + -0.00600290027471, + -0.00598165524357, + -0.00595955249199, + -0.00593659750594, + -0.00591279588878, + -0.00588815336019, + -0.00586267575494, + -0.00583636902176, + -0.00580923922213, + -0.00578129252909, + -0.00575253522604, + -0.00572297370548, + -0.00569261446777, + -0.00566146411991, + -0.00562952937422, + -0.00559681704708, + -0.00556333405763, + -0.00552908742648, + -0.00549408427432, + -0.00545833182066, + -0.00542183738246, + -0.00538460837274, + -0.00534665229925, + -0.00530797676305, + -0.00526858945714, + -0.00522849816506, + -0.00518771075945, + -0.00514623520064, + -0.00510407953523, + -0.00506125189459, + -0.00501776049347, + -0.00497361362847, + -0.00492881967664, + -0.00488338709391, + -0.00483732441367, + -0.00479064024524, + -0.00474334327233, + -0.00469544225159, + -0.00464694601102, + -0.0045978634485, + -0.00454820353018, + -0.00449797528898, + -0.00444718782303, + -0.00439585029411, + -0.00434397192607, + -0.00429156200327, + -0.004238629869, + -0.00418518492391, + -0.00413123662438, + -0.00407679448099, + -0.00402186805685, + -0.00396646696606, + -0.00391060087208, + -0.0038542794861, + -0.00379751256547, + -0.00374030991203, + -0.00368268137055, + -0.00362463682704, + -0.00356618620719, + -0.00350733947468, + -0.0034481066296, + -0.00338849770681, + -0.00332852277427, + -0.00326819193145, + -0.00320751530767, + -0.00314650306046, + -0.00308516537395, + -0.00302351245721, + -0.0029615545426, + -0.00289930188419, + -0.00283676475604, + -0.00277395345064, + -0.00271087827725, + -0.00264754956023, + -0.00258397763747, + -0.00252017285871, + -0.00245614558396, + -0.00239190618181, + -0.00232746502788, + -0.00226283250313, + -0.0021980189923, + -0.00213303488227, + -0.00206789056044, + -0.00200259641313, + -0.00193716282401, + -0.00187160017245, + -0.00180591883195, + -0.00174012916856, + -0.00167424153927, + -0.00160826629046, + -0.00154221375632, + -0.00147609425724, + -0.00140991809833, + -0.00134369556777, + -0.00127743693532, + -0.00121115245079, + -0.00114485234243, + -0.00107854681549, + -0.00101224605061, + -0.000945960202385, + -0.000879699397808, + -0.000813473734782, + -0.000747293280638, + -0.00068116807064, + -0.000615108106521, + -0.000549123355009, + -0.000483223746377, + -0.000417419172991, + -0.000351719487875, + -0.000286134503279, + -0.000220673989264, + -0.000155347672292, + -9.0165233825e-05, + -2.51363089403e-05, + 3.972951505e-05, + 0.000104422699965, + 0.00016893375811, + 0.000233253253624, + 0.000297371803811, + 0.000361280080464, + 0.000424968811174, + 0.00048842878063, + 0.000551650831905, + 0.000614625867731, + 0.00067734485176, + 0.000739798809815, + 0.000801978831129, + 0.000863876069563, + 0.000925481744823, + 0.000986787143656, + 0.00104778362103, + 0.00110846260133, + 0.00116881557946, + 0.00122883412204, + 0.00128850986854, + 0.00134783453234, + 0.00140679990187, + 0.00146539784172, + 0.00152362029366, + 0.00158145927772, + 0.00163890689326, + 0.00169595531995, + 0.00175259681884, + 0.00180882373329, + 0.00186462849002, + 0.00192000360003, + 0.00197494165959, + 0.00202943535114, + 0.00208347744424, + 0.00213706079645, + 0.00219017835426, + 0.0022428231539, + 0.00229498832227, + 0.00234666707772, + 0.00239785273091, + 0.0024485386856, + 0.00249871843947, + 0.00254838558486, + 0.00259753380953, + 0.00264615689746, + 0.00269424872948, + 0.00274180328406, + 0.00278881463798, + 0.00283527696696, + 0.00288118454639, + 0.00292653175191, + 0.00297131306006, + 0.00301552304889, + 0.00305915639853, + 0.00310220789178, + 0.00314467241466, + 0.00318654495692, + 0.00322782061261, + 0.00326849458052, + 0.00330856216472, + 0.00334801877498, + 0.00338685992727, + 0.00342508124414, + 0.00346267845515, + 0.00349964739727, + 0.00353598401527, + 0.00357168436207, + 0.00360674459905, + 0.00364116099644, + 0.00367492993356, + 0.00370804789916, + 0.00374051149167, + 0.00377231741943, + 0.00380346250097, + 0.00383394366521, + 0.00386375795165, + 0.00389290251056, + 0.00392137460315, + 0.00394917160169, + 0.00397629098968, + 0.00400273036195, + 0.00402848742472, + 0.00405355999571, + 0.00407794600421, + 0.00410164349108, + 0.0041246506088, + 0.00414696562147, + 0.0041685869048, + 0.00418951294609, + 0.00420974234415, + 0.0042292738093, + 0.00424810616321, + 0.00426623833886, + 0.00428366938042, + 0.00430039844308, + 0.00431642479295, + 0.00433174780686, + 0.00434636697217, + 0.00436028188662, + 0.00437349225805, + 0.00438599790423, + 0.00439779875254, + 0.00440889483977, + 0.00441928631179, + 0.00442897342329, + 0.00443795653742, + 0.00444623612551, + 0.00445381276666, + 0.00446068714744, + 0.00446686006148, + 0.00447233240905, + 0.00447710519671, + 0.00448117953682, + 0.00448455664714, + 0.00448723785037, + 0.00448922457364, + 0.00449051834807, + 0.00449112080824, + 0.00449103369167, + 0.0044902588383, + 0.00448879818995, + 0.00448665378973, + 0.00448382778148, + 0.00448032240918, + 0.00447614001636, + 0.00447128304544, + 0.00446575403713, + 0.00445955562979, + 0.00445269055874, + 0.0044451616556, + 0.00443697184761, + 0.00442812415693, + 0.0044186216999, + 0.00440846768634, + 0.00439766541882, + 0.00438621829188, + 0.00437412979127, + 0.00436140349319, + 0.00434804306349, + 0.00433405225686, + 0.00431943491604, + 0.00430419497098, + 0.00428833643799, + 0.00427186341893, + 0.00425478010032, + 0.00423709075247, + 0.00421879972861, + 0.00419991146401, + 0.00418043047504, + 0.0041603613583, + 0.00413970878966, + 0.00411847752336, + 0.00409667239103, + 0.00407429830076, + 0.00405136023616, + 0.00402786325533, + 0.00400381248993, + 0.00397921314415, + 0.00395407049377, + 0.00392838988506, + 0.00390217673387, + 0.00387543652451, + 0.00384817480879, + 0.00382039720493, + 0.00379210939654, + 0.00376331713154, + 0.00373402622114, + 0.00370424253869, + 0.00367397201871, + 0.0036432206557, + 0.00361199450312, + 0.00358029967225, + 0.00354814233112, + 0.00351552870337, + 0.00348246506715, + 0.003448957754, + 0.00341501314771, + 0.00338063768321, + 0.00334583784538, + 0.00331062016798, + 0.00327499123244, + 0.00323895766676, + 0.0032025261443, + 0.00316570338266, + 0.0031284961425, + 0.00309091122638, + 0.00305295547755, + 0.00301463577883, + 0.00297595905141, + 0.00293693225365, + 0.00289756237991, + 0.00285785645937, + 0.00281782155483, + 0.00277746476151, + 0.00273679320588, + 0.00269581404443, + 0.00265453446252, + 0.00261296167313, + 0.00257110291569, + 0.00252896545488, + 0.00248655657941, + 0.00244388360082, + 0.00240095385231, + 0.00235777468746, + 0.00231435347912, + 0.00227069761815, + 0.00222681451221, + 0.00218271158459, + 0.00213839627298, + 0.00209387602828, + 0.00204915831341, + 0.0020042506021, + 0.00195916037766, + 0.00191389513185, + 0.00186846236363, + 0.00182286957799, + 0.00177712428475, + 0.00173123399738, + 0.00168520623182, + 0.00163904850525, + 0.001592768335, + 0.00154637323728, + 0.00149987072604, + 0.00145326831184, + 0.0014065735006, + 0.00135979379251, + 0.00131293668083, + 0.00126600965076, + 0.00121902017825, + 0.0011719757289, + 0.00112488375678, + 0.00107775170331, + 0.00103058699613, + 0.000983397047952, + 0.000936189255465, + 0.000888970998198, + 0.000841749637416, + 0.000794532515011, + 0.000747326952407, + 0.000700140249461, + 0.000652979683379, + 0.000605852507632, + 0.000558765950884, + 0.000511727215922, + 0.000464743478596, + 0.000417821886764, + 0.000370969559246, + 0.000324193584783, + 0.000277501021005, + 0.000230898893408, + 0.000184394194334, + 0.000137993881964, + 9.17048793164e-05, + 4.55340732537e-05, + -5.1168650228e-07, + -4.64255883466e-05, + -9.22008597593e-05, + -0.000137830768263, + -0.000183308622377, + -0.000228627772554, + -0.000273781612115, + -0.000318763578173, + -0.000363567152545, + -0.000408185862658, + -0.000452613282443, + -0.000496843033219, + -0.000540868784574, + -0.000584684255222, + -0.000628283213866, + -0.00067165948004, + -0.000714806924943, + -0.000757719472267, + -0.00080039109901, + -0.000842815836281, + -0.000884987770091, + -0.000926901042137, + -0.000968549850574, + -0.00100992845078, + -0.00105103115608, + -0.00109185233855, + -0.00113238642965, + -0.00117262792102, + -0.00121257136515, + -0.00125221137608, + -0.00129154263008, + -0.00133055986632, + -0.00136925788753, + -0.00140763156064, + -0.00144567581744, + -0.00148338565516, + -0.00152075613712, + -0.00155778239332, + -0.001594459621, + -0.00163078308527, + -0.00166674811962, + -0.00170235012647, + -0.00173758457776, + -0.00177244701544, + -0.00180693305196, + -0.00184103837082, + -0.00187475872703, + -0.00190808994759, + -0.00194102793194, + -0.00197356865246, + -0.00200570815484, + -0.00203744255853, + -0.00206876805719, + -0.00209968091902, + -0.00213017748723, + -0.00216025418032, + -0.00218990749252, + -0.00221913399408, + -0.00224793033167, + -0.00227629322861, + -0.00230421948527, + -0.00233170597932, + -0.00235874966601, + -0.00238534757846, + -0.00241149682789, + -0.00243719460389, + -0.00246243817465, + -0.00248722488716, + -0.00251155216743, + -0.00253541752065, + -0.00255881853142, + -0.00258175286388, + -0.00260421826188, + -0.00262621254909, + -0.00264773362916, + -0.00266877948584, + -0.00268934818302, + -0.00270943786489, + -0.00272904675597, + -0.0027481731612, + -0.00276681546595, + -0.00278497213611, + -0.00280264171806, + -0.00281982283871, + -0.00283651420549, + -0.00285271460634, + -0.00286842290968, + -0.00288363806436, + -0.00289835909961, + -0.002912585125, + -0.00292631533032, + -0.00293954898552, + -0.00295228544058, + -0.00296452412543, + -0.00297626454979, + -0.00298750630305, + -0.0029982490541, + -0.00300849255118, + -0.0030182366217, + -0.00302748117204, + -0.00303622618738, + -0.00304447173142, + -0.00305221794625, + -0.00305946505202, + -0.00306621334678, + -0.00307246320613, + -0.00307821508302, + -0.00308346950744, + -0.0030882270861, + -0.00309248850218, + -0.00309625451497, + -0.00309952595954, + -0.00310230374643, + -0.00310458886128, + -0.00310638236447, + -0.00310768539075, + -0.00310849914884, + -0.00310882492107, + -0.00310866406295, + -0.00310801800276, + -0.00310688824111, + -0.00310527635056, + -0.00310318397509, + -0.0031006128297, + -0.00309756469995, + -0.00309404144143, + -0.00309004497933, + -0.00308557730792, + -0.00308064049003, + -0.00307523665658, + -0.00306936800599, + -0.00306303680372, + -0.00305624538166, + -0.00304899613761, + -0.00304129153474, + -0.00303313410096, + -0.00302452642842, + -0.00301547117285, + -0.00300597105299, + -0.00299602885002, + -0.00298564740688, + -0.00297482962773, + -0.00296357847723, + -0.00295189698, + -0.00293978821988, + -0.00292725533936, + -0.00291430153887, + -0.00290093007613, + -0.00288714426548, + -0.00287294747717, + -0.00285834313673, + -0.00284333472421, + -0.00282792577351, + -0.00281211987167, + -0.00279592065815, + -0.00277933182411, + -0.00276235711169, + -0.00274500031325, + -0.00272726527065, + -0.00270915587451, + -0.00269067606345, + -0.00267182982331, + -0.00265262118644, + -0.00263305423086, + -0.00261313307957, + -0.00259286189969, + -0.00257224490174, + -0.00255128633882, + -0.00252999050582, + -0.00250836173863, + -0.00248640441333, + -0.00246412294539, + -0.00244152178886, + -0.00241860543557, + -0.00239537841428, + -0.00237184528987, + -0.00234801066255, + -0.00232387916697, + -0.00229945547146, + -0.00227474427712, + -0.00224975031705, + -0.00222447835546, + -0.00219893318685, + -0.00217311963518, + -0.00214704255299, + -0.00212070682055, + -0.00209411734506, + -0.00206727905972, + -0.00204019692294, + -0.00201287591744, + -0.00198532104941, + -0.00195753734763, + -0.00192952986266, + -0.0019013036659, + -0.0018728638488, + -0.00184421552195, + -0.00181536381421, + -0.00178631387189, + -0.00175707085785, + -0.00172763995061, + -0.00169802634356, + -0.001668235244, + -0.00163827187235, + -0.00160814146124, + -0.00157784925466, + -0.00154740050711, + -0.00151680048268, + -0.00148605445426, + -0.00145516770262, + -0.00142414551559, + -0.00139299318717, + -0.00136171601668, + -0.00133031930791, + -0.00129880836825, + -0.00126718850786, + -0.00123546503878, + -0.00120364327413, + -0.00117172852722, + -0.00113972611072, + -0.00110764133583, + -0.00107547951141, + -0.00104324594316, + -0.0010109459328, + -0.000978584777211, + -0.000946167767615, + -0.000913700188757, + -0.000881187318076, + -0.000848634424887, + -0.000816046769567, + -0.00078342960274, + -0.000750788164473, + -0.000718127683471, + -0.000685453376276, + -0.000652770446473, + -0.000620084083895, + -0.00058739946384, + -0.000554721746288, + -0.00052205607512, + -0.000489407577347, + -0.000456781362341, + -0.000424182521075, + -0.000391616125357, + -0.000359087227084, + -0.00032660085749, + -0.000294162026408, + -0.000261775721527, + -0.000229446907663, + -0.000197180526036, + -0.000164981493546, + -0.000132854702062, + -0.000100805017712, + -6.883728018e-05, + -3.69563020144e-05, + -5.16686793417e-06, + 2.65262658519e-05, + 5.81183723229e-05, + 8.96047543157e-05, + 0.000120980745188, + 0.000152241709477, + 0.000183383043545, + 0.000214400176227, + 0.000245288569466, + 0.000276043718938, + 0.000306661154679, + 0.000337136441697, + 0.000367465180579, + 0.000397643008091, + 0.000427665597772, + 0.000457528660516, + 0.000487227945152, + 0.000516759239012, + 0.000546118368493, + 0.000575301199611, + 0.000604303638548, + 0.000633121632187, + 0.000661751168648, + 0.000690188277802, + 0.000718429031791, + 0.000746469545533, + 0.000774305977215, + 0.000801934528788, + 0.000829351446441, + 0.000856553021082, + 0.00088353558879, + 0.000910295531282, + 0.000936829276352, + 0.00096313329831, + 0.000989204118415, + 0.00101503830529, + 0.00104063247534, + 0.00106598329314, + 0.00109108747186, + 0.00111594177362, + 0.00114054300987, + 0.00116488804178, + 0.00118897378056, + 0.00121279718786, + 0.00123635527605, + 0.00125964510861, + 0.00128266380042, + 0.00130540851805, + 0.00132787648013, + 0.00135006495757, + 0.00137197127391, + 0.00139359280555, + 0.00141492698203, + 0.00143597128631, + 0.00145672325497, + 0.00147718047849, + 0.00149734060148, + 0.00151720132286, + 0.00153676039613, + 0.0015560156295, + 0.00157496488615, + 0.00159360608437, + 0.00161193719775, + 0.00162995625534, + 0.00164766134181, + 0.00166505059758, + 0.00168212221897, + 0.00169887445834, + 0.00171530562415, + 0.00173141408115, + 0.0017471982504, + 0.00176265660942, + 0.00177778769224, + 0.00179259008946, + 0.00180706244834, + 0.00182120347283, + 0.00183501192364, + 0.00184848661822, + 0.00186162643085, + 0.0018744302926, + 0.00188689719137, + 0.00189902617188, + 0.00191081633565, + 0.00192226684097, + 0.00193337690288, + 0.00194414579316, + 0.00195457284022, + 0.00196465742909, + 0.00197439900134, + 0.00198379705498, + 0.00199285114443, + 0.00200156088038, + 0.00200992592969, + 0.00201794601532, + 0.00202562091616, + 0.00203295046693, + 0.00203993455804, + 0.00204657313545, + 0.0020528662005, + 0.00205881380975, + 0.00206441607483, + 0.00206967316223, + 0.00207458529315, + 0.00207915274327, + 0.00208337584255, + 0.00208725497506, + 0.00209079057868, + 0.00209398314497, + 0.00209683321885, + 0.0020993413984, + 0.00210150833459, + 0.00210333473103, + 0.00210482134371, + 0.00210596898069, + 0.00210677850188, + 0.00210725081867, + 0.0021073868937, + 0.00210718774053, + 0.0021066544233, + 0.00210578805647, + 0.00210458980443, + 0.00210306088122, + 0.00210120255015, + 0.00209901612346, + 0.00209650296199, + 0.00209366447479, + 0.00209050211876, + 0.00208701739828, + 0.00208321186481, + 0.00207908711654, + 0.00207464479796, + 0.00206988659946, + 0.00206481425696, + 0.00205942955143, + 0.00205373430855, + 0.00204773039824, + 0.0020414197342, + 0.00203480427354, + 0.0020278860163, + 0.00202066700499, + 0.00201314932417, + 0.00200533509996, + 0.00199722649959, + 0.00198882573092, + 0.00198013504198, + 0.00197115672049, + 0.00196189309333, + 0.00195234652613, + 0.00194251942269, + 0.00193241422455, + 0.00192203341043, + 0.00191137949576, + 0.00190045503214, + 0.00188926260685, + 0.00187780484231, + 0.00186608439553, + 0.00185410395763, + 0.00184186625328, + 0.00182937404014, + 0.00181663010836, + 0.00180363728, + 0.00179039840851, + 0.00177691637816, + 0.00176319410345, + 0.00174923452865, + 0.0017350406271, + 0.00172061540079, + 0.00170596187966, + 0.00169108312111, + 0.00167598220942, + 0.00166066225513, + 0.0016451263945, + 0.0016293777889, + 0.00161341962426, + 0.00159725511045, + 0.00158088748071, + 0.00156431999105, + 0.00154755591965, + 0.00153059856631, + 0.00151345125177, + 0.00149611731721, + 0.00147860012357, + 0.00146090305099, + 0.0014430294982, + 0.00142498288191, + 0.00140676663621, + 0.00138838421196, + 0.00136983907621, + 0.00135113471153, + 0.00133227461547, + 0.0013132622999, + 0.00129410129045, + 0.00127479512585, + 0.00125534735733, + 0.00123576154806, + 0.00121604127246, + 0.00119619011565, + 0.00117621167281, + 0.00115610954859, + 0.00113588735647, + 0.00111554871818, + 0.00109509726306, + 0.0010745366275, + 0.00105387045427, + 0.00103310239196, + 0.00101223609435, + 0.000991275219815, + 0.000970223430704, + 0.000949084392761, + 0.000927861774502, + 0.000906559246626, + 0.000885180481408, + 0.000863729152104, + 0.000842208932355, + 0.00082062349559, + 0.000798976514435, + 0.000777271660122, + 0.000755512601896, + 0.000733703006434, + 0.000711846537252, + 0.000689946854132, + 0.000668007612533, + 0.000646032463016, + 0.000624025050671, + 0.00060198901454, + 0.000579927987048, + 0.000557845593439, + 0.000535745451204, + 0.000513631169526, + 0.000491506348718, + 0.000469374579669, + 0.00044723944329, + 0.000425104509963, + 0.000402973339001, + 0.000380849478099, + 0.000358736462801, + 0.000336637815957, + 0.0003145570472, + 0.000292497652411, + 0.000270463113198, + 0.000248456896375, + 0.000226482453445, + 0.000204543220087, + 0.000182642615652, + 0.000160784042652, + 0.000138970886264, + 0.000117206513835, + 9.54942743894e-05, + 7.38374981409e-05, + 5.22394960127e-05, + 3.07035591579e-05, + 9.23295848698e-06, + -1.21690558004e-05, + -3.34992546802e-05, + -5.47544307612e-05, + -7.59313987406e-05, + -9.70269958525e-05, + -0.000118038082311, + -0.000138961541751, + -0.000159794281662, + -0.000180533233813, + -0.000201175354682, + -0.00022171762587, + -0.000242157054515, + -0.0002624906737, + -0.000282715542855, + -0.000302828748152, + -0.000322827402899, + -0.000342708647923, + -0.00036246965195, + -0.000382107611981, + -0.000401619753657, + -0.000421003331628, + -0.000440255629902, + -0.000459373962201, + -0.000478355672307, + -0.000497198134395, + -0.000515898753376, + -0.000534454965213, + -0.000552864237253, + -0.000571124068534, + -0.000589231990099, + -0.000607185565297, + -0.000624982390079, + -0.000642620093289, + -0.000660096336952, + -0.000677408816545, + -0.000694555261275, + -0.000711533434343, + -0.000728341133199, + -0.000744976189801, + -0.000761436470859, + -0.000777719878071, + -0.000793824348364, + -0.000809747854114, + -0.000825488403374, + -0.00084104404008, + -0.000856412844265, + -0.000871592932258, + -0.000886582456879, + -0.000901379607626, + -0.000915982610859, + -0.000930389729971, + -0.000944599265562, + -0.000958609555596, + -0.000972418975559, + -0.000986025938608, + -0.00099942889571, + -0.00101262633578, + -0.00102561678582, + -0.001038398811, + -0.00105097101485, + -0.00106333203929, + -0.00107548056478, + -0.00108741531039, + -0.00109913503392, + -0.00111063853196, + -0.00112192463995, + -0.0011329922323, + -0.00114384022241, + -0.00115446756274, + -0.00116487324486, + -0.00117505629949, + -0.00118501579654, + -0.00119475084516, + -0.00120426059371, + -0.00121354422984, + -0.00122260098046, + -0.00123143011176, + -0.00124003092921, + -0.00124840277755, + -0.00125654504074, + -0.00126445714202, + -0.0012721385438, + -0.00127958874766, + -0.00128680729433, + -0.00129379376362, + -0.00130054777434, + -0.00130706898432, + -0.00131335709025, + -0.00131941182769, + -0.00132523297094, + -0.00133082033299, + -0.00133617376539, + -0.00134129315821, + -0.00134617843989, + -0.00135082957716, + -0.00135524657491, + -0.00135942947607, + -0.00136337836152, + -0.00136709334992, + -0.00137057459756, + -0.00137382229828, + -0.00137683668327, + -0.00137961802092, + -0.00138216661668, + -0.00138448281289, + -0.0013865669886, + -0.0013884195594, + -0.00139004097724, + -0.00139143173024, + -0.00139259234248, + -0.00139352337386, + -0.00139422541981, + -0.00139469911118, + -0.00139494511392, + -0.00139496412898, + -0.00139475689197, + -0.00139432417302, + -0.00139366677649, + -0.00139278554079, + -0.00139168133805, + -0.00139035507397, + -0.00138880768749, + -0.00138704015059, + -0.00138505346798, + -0.00138284867686, + -0.00138042684665, + -0.00137778907871, + -0.00137493650605, + -0.00137187029306, + -0.00136859163521, + -0.00136510175878, + -0.00136140192053, + -0.00135749340742, + -0.00135337753631, + -0.00134905565362, + -0.00134452913508, + -0.00133979938532, + -0.00133486783765, + -0.00132973595365, + -0.00132440522291, + -0.00131887716265, + -0.00131315331741, + -0.0013072352587, + -0.00130112458469, + -0.0012948229198, + -0.00128833191441, + -0.0012816532445, + -0.00127478861126, + -0.00126773974078, + -0.00126050838365, + -0.00125309631462, + -0.00124550533222, + -0.00123773725842, + -0.00122979393819, + -0.00122167723922, + -0.00121338905147, + -0.0012049312868, + -0.00119630587863, + -0.00118751478152, + -0.00117855997077, + -0.00116944344207, + -0.0011601672111, + -0.00115073331312, + -0.00114114380257, + -0.00113140075269, + -0.00112150625513, + -0.00111146241954, + -0.00110127137313, + -0.00109093526033, + -0.00108045624236, + -0.00106983649678, + -0.00105907821716, + -0.0010481836126, + -0.00103715490736, + -0.00102599434043, + -0.00101470416512, + -0.00100328664864, + -0.000991744071719, + -0.000980078728128, + -0.000968292924308, + -0.000956388978937, + -0.000944369222514, + -0.000932235996935, + -0.000919991655076, + -0.000907638560374, + -0.000895179086402, + -0.000882615616449, + -0.000869950543098, + -0.000857186267807, + -0.000844325200481, + -0.000831369759055, + -0.000818322369069, + -0.000805185463248, + -0.000791961481076, + -0.000778652868378, + -0.000765262076897, + -0.000751791563874, + -0.000738243791624, + -0.000724621227117, + -0.000710926341562, + -0.000697161609982, + -0.000683329510798, + -0.000669432525411, + -0.000655473137787, + -0.000641453834036, + -0.000627377102003, + -0.000613245430849, + -0.000599061310639, + -0.000584827231931, + -0.000570545685365, + -0.000556219161253, + -0.000541850149173, + -0.000527441137557, + -0.000512994613291, + -0.00049851306131, + -0.000483998964194, + -0.000469454801768, + -0.000454883050705, + -0.000440286184127, + -0.000425666671209, + -0.00041102697679, + -0.000396369560975, + -0.00038169687875, + -0.000367011379596, + -0.000352315507099, + -0.000337611698569, + -0.000322902384662, + -0.000308189988997, + -0.000293476927781, + -0.000278765609439, + -0.000264058434236, + -0.000249357793915, + -0.000234666071326, + -0.000219985640063, + -0.000205318864105, + -0.000190668097457, + -0.000176035683793, + -0.000161423956104, + -0.000146835236351, + -0.000132271835113, + -0.000117736051247, + -0.000103230171546, + -8.87564704011e-05, + -7.43172094659e-05, + -5.99146373264e-05, + -4.55509891719e-05, + -3.12284864696e-05, + -1.69493366433e-05, + -2.71573275512e-06, + 1.14701468112e-05, + 2.56061386603e-05, + 3.9690094694e-05, + 5.37198824161e-05, + 6.76933852337e-05, + 8.16085027552e-05, + 9.54631510833e-05, + 0.000109255263107, + 0.000122982788785, + 0.000136643695435, + 0.000150235968004, + 0.000163757609352, + 0.00017720664052, + 0.000190581100996, + 0.000203879048981, + 0.000217098561651, + 0.000230237735407, + 0.000243294686134, + 0.000256267549441, + 0.000269154480914, + 0.000281953656348, + 0.000294663271987, + 0.000307281544752, + 0.000319806712475, + 0.000332237034114, + 0.000344570789978, + 0.000356806281939, + 0.000368941833644, + 0.00038097579072, + 0.000392906520978, + 0.000404732414607, + 0.000416451884371, + 0.000428063365798, + 0.000439565317361, + 0.000450956220661, + 0.000462234580605, + 0.000473398925571, + 0.000484447807581, + 0.000495379802462, + 0.000506193510001, + 0.000516887554104, + 0.000527460582941, + 0.00053791126909, + 0.000548238309683, + 0.000558440426534, + 0.000568516366277, + 0.000578464900485, + 0.0005882848258, + 0.000597974964047, + 0.000607534162344, + 0.000616961293216, + 0.000626255254693, + 0.000635414970416, + 0.000644439389726, + 0.000653327487755, + 0.000662078265515, + 0.000670690749975, + 0.000679163994142, + 0.000687497077127, + 0.000695689104216, + 0.000703739206935, + 0.000711646543101, + 0.000719410296885, + 0.000727029678852, + 0.000734503926012, + 0.000741832301859, + 0.000749014096404, + 0.000756048626207, + 0.000762935234404, + 0.000769673290732, + 0.00077626219154, + 0.000782701359808, + 0.000788990245151, + 0.000795128323828, + 0.000801115098738, + 0.000806950099416, + 0.000812632882025, + 0.000818163029342, + 0.000823540150738, + 0.00082876388216, + 0.000833833886101, + 0.000838749851571, + 0.000843511494059, + 0.000848118555498, + 0.000852570804216, + 0.000856868034893, + 0.000861010068504, + 0.000864996752268, + 0.00086882795958, + 0.000872503589955, + 0.000876023568952, + 0.000879387848104, + 0.00088259640484, + 0.000885649242404, + 0.000888546389773, + 0.00089128790156, + 0.000893873857928, + 0.000896304364493, + 0.000898579552216, + 0.000900699577304, + 0.000902664621102, + 0.000904474889974, + 0.000906130615194, + 0.00090763205282, + 0.000908979483574, + 0.000910173212712, + 0.000911213569893, + 0.000912100909044, + 0.000912835608224, + 0.000913418069478, + 0.000913848718693, + 0.000914128005449, + 0.000914256402867, + 0.000914234407451, + 0.00091406253893, + 0.000913741340096, + 0.000913271376634, + 0.000912653236959, + 0.000911887532036, + 0.00091097489521, + 0.000909915982024, + 0.000908711470038, + 0.000907362058645, + 0.000905868468877, + 0.000904231443223, + 0.000902451745426, + 0.000900530160292, + 0.000898467493487, + 0.000896264571334, + 0.00089392224061, + 0.000891441368334, + 0.00088882284156, + 0.000886067567159, + 0.000883176471607, + 0.000880150500763, + 0.000876990619648, + 0.000873697812223, + 0.00087027308116, + 0.000866717447616, + 0.000863031950999, + 0.000859217648739, + 0.000855275616047, + 0.000851206945681, + 0.000847012747706, + 0.000842694149249, + 0.000838252294257, + 0.000833688343253, + 0.000829003473083, + 0.000824198876669, + 0.000819275762758, + 0.000814235355666, + 0.000809078895024, + 0.000803807635518, + 0.000798422846636, + 0.000792925812401, + 0.000787317831114, + 0.000781600215085, + 0.000775774290375, + 0.000769841396521, + 0.000763802886277, + 0.000757660125337, + 0.00075141449207, + 0.000745067377243, + 0.000738620183755, + 0.000732074326355, + 0.000725431231373, + 0.000718692336441, + 0.000711859090216, + 0.000704932952102, + 0.000697915391971, + 0.000690807889883, + 0.000683611935807, + 0.000676329029337, + 0.00066896067941, + 0.000661508404025, + 0.00065397372996, + 0.000646358192484, + 0.00063866333508, + 0.000630890709153, + 0.000623041873747, + 0.000615118395261, + 0.000607121847164, + 0.000599053809705, + 0.00059091586963, + 0.000582709619892, + 0.00057443665937, + 0.000566098592578, + 0.000557697029379, + 0.000549233584701, + 0.000540709878247, + 0.000532127534209, + 0.000523488180987, + 0.000514793450897, + 0.000506044979887, + 0.000497244407253, + 0.000488393375355, + 0.000479493529329, + 0.000470546516805, + 0.000461553987625, + 0.000452517593557, + 0.000443438988015, + 0.000434319825776, + 0.000425161762699, + 0.000415966455446, + 0.000406735561202, + 0.000397470737394, + 0.000388173641419, + 0.00037884593036, + 0.000369489260716, + 0.000360105288123, + 0.000350695667083, + 0.000341262050691, + 0.00033180609036, + 0.000322329435555, + 0.000312833733523, + 0.000303320629022, + 0.000293791764058, + 0.000284248777617, + 0.000274693305402, + 0.000265126979573, + 0.000255551428481, + 0.000245968276412, + 0.00023637914333, + 0.000226785644616, + 0.000217189390816, + 0.000207591987391, + 0.00019799503446, + 0.000188400126551, + 0.000178808852357, + 0.000169222794488, + 0.000159643529224, + 0.000150072626276, + 0.000140511648543, + 0.000130962151875, + 0.000121425684837, + 0.000111903788471, + 0.000102397996067, + 9.29098329314e-05, + 8.34408161564e-05, + 7.3992454397e-05, + 6.45662476449e-05, + 5.51636870073e-05, + 4.57862544868e-05, + 3.64354227641e-05, + 2.71126549829e-05, + 1.7819404537e-05, + 8.55711486014e-06, + -6.72780782418e-07, + -9.86885950005e-06, + -1.90297089793e-05, + -2.8153927685e-05, + -3.72401250583e-05, + -4.62869217137e-05, + -5.52929496311e-05, + -6.42568523468e-05, + -7.31772851421e-05, + -8.2052915229e-05, + -9.08824219326e-05, + -9.96644968714e-05, + -0.000108397844136, + -0.000117081180463, + -0.000125713235407, + -0.000134292751512, + -0.000142818484477, + -0.000151289203317, + -0.00015970369053, + -0.000168060742252, + -0.000176359168413, + -0.00018459779289, + -0.000192775453657, + -0.000200891002931, + -0.000208943307317, + -0.00021693124795, + -0.000224853720632, + -0.000232709635969, + -0.000240497919501, + -0.000248217511833, + -0.000255867368761, + -0.000263446461397, + -0.000270953776288, + -0.000278388315534, + -0.000285749096901, + -0.000293035153937, + -0.000300245536075, + -0.00030737930874, + -0.000314435553456, + -0.000321413367938, + -0.000328311866194, + -0.000335130178614, + -0.000341867452065, + -0.000348522849973, + -0.000355095552409, + -0.000361584756172, + -0.000367989674863, + -0.000374309538962, + -0.000380543595901, + -0.000386691110126, + -0.000392751363173, + -0.000398723653719, + -0.000404607297649, + -0.00041040162811, + -0.000416105995562, + -0.000421719767831, + -0.000427242330154, + -0.000432673085221, + -0.000438011453219, + -0.00044325687187, + -0.00044840879646, + -0.000453466699875, + -0.00045843007263, + -0.000463298422891, + -0.000468071276497, + -0.000472748176982, + -0.00047732868559, + -0.000481812381287, + -0.000486198860771, + -0.000490487738481, + -0.000494678646598, + -0.000498771235046, + -0.000502765171494, + -0.000506660141347, + -0.000510455847737, + -0.000514152011516, + -0.00051774837124, + -0.00052124468315, + -0.000524640721155, + -0.000527936276809, + -0.000531131159284, + -0.000534225195341, + -0.000537218229301, + -0.000540110123008, + -0.000542900755794, + -0.000545590024436, + -0.000548177843117, + -0.000550664143377, + -0.000553048874068, + -0.000555332001298, + -0.000557513508382, + -0.000559593395784, + -0.000561571681055, + -0.000563448398772, + -0.000565223600479, + -0.000566897354608, + -0.000568469746422, + -0.000569940877933, + -0.00057131086783, + -0.000572579851402, + -0.000573747980457, + -0.000574815423239, + -0.000575782364341, + -0.000576649004621, + -0.000577415561109, + -0.000578082266915, + -0.000578649371134, + -0.000579117138747, + -0.000579485850525, + -0.00057975580292, + -0.00057992730797, + -0.000580000693182, + -0.000579976301432, + -0.000579854490847, + -0.000579635634695, + -0.000579320121268, + -0.000578908353766, + -0.000578400750173, + -0.000577797743141, + -0.00057709977986, + -0.000576307321935, + -0.000575420845258, + -0.000574440839876, + -0.000573367809861, + -0.000572202273174, + -0.00057094476153, + -0.00056959582026, + -0.000568156008172, + -0.000566625897409, + -0.000565006073305, + -0.000563297134242, + -0.000561499691501, + -0.000559614369115, + -0.000557641803719, + -0.000555582644397, + -0.000553437552531, + -0.000551207201643, + -0.000548892277243, + -0.000546493476666, + -0.000544011508917, + -0.000541447094507, + -0.000538800965293, + -0.000536073864315, + -0.000533266545627, + -0.000530379774136, + -0.000527414325431, + -0.000524370985616, + -0.00052125055114, + -0.000518053828623, + -0.000514781634689, + -0.000511434795788, + -0.000508014148024, + -0.000504520536979, + -0.000500954817537, + -0.000497317853705, + -0.000493610518435, + -0.000489833693447, + -0.000485988269046, + -0.000482075143942, + -0.000478095225069, + -0.000474049427401, + -0.000469938673769, + -0.000465763894677, + -0.000461526028119, + -0.000457226019391, + -0.000452864820906, + -0.000448443392008, + -0.000443962698785, + -0.000439423713879, + -0.000434827416302, + -0.000430174791245, + -0.000425466829888, + -0.000420704529214, + -0.000415888891817, + -0.000411020925712, + -0.000406101644146, + -0.000401132065408, + -0.000396113212637, + -0.000391046113631, + -0.000385931800657, + -0.00038077131026, + -0.000375565683073, + -0.000370315963621, + -0.000365023200138, + -0.000359688444369, + -0.00035431275138, + -0.000348897179371, + -0.00034344278948, + -0.000337950645597, + -0.00033242181417, + -0.000326857364016, + -0.000321258366133, + -0.000315625893506, + -0.000309961020921, + -0.000304264824775, + -0.000298538382886, + -0.000292782774309, + -0.000286999079142, + -0.000281188378344, + -0.000275351753543, + -0.000269490286856, + -0.000263605060698, + -0.000257697157599, + -0.000251767660019, + -0.000245817650165, + -0.000239848209807, + -0.000233860420093, + -0.000227855361374, + -0.000221834113015, + -0.000215797753221, + -0.000209747358853, + -0.000203684005254, + -0.000197608766067, + -0.000191522713062, + -0.000185426915957, + -0.000179322442244, + -0.000173210357019, + -0.000167091722802, + -0.00016096759937, + -0.000154839043587, + -0.000148707109232, + -0.000142572846829, + -0.000136437303484, + -0.000130301522717, + -0.000124166544293, + -0.000118033404064, + -0.000111903133805, + -0.00010577676105, + -9.96553089327e-05, + -9.35397960311e-05, + -8.74312362065e-05, + -8.13306384484e-05, + -7.52390067207e-05, + -6.91573398073e-05, + -6.30866311606e-05, + -5.70278687522e-05, + -5.09820349219e-05, + -4.49501062325e-05, + -3.89330533213e-05, + -3.29318407579e-05, + -2.69474269003e-05, + -2.09807637537e-05, + -1.50327968305e-05, + -9.10446501279e-06, + -3.19670041504e-06, + 2.68957175054e-06, + 8.55343330697e-06, + 1.43939732441e-05, + 2.02102878492e-05, + 2.6001480834e-05, + 3.17666634625e-05, + 3.75049546746e-05, + 4.32154812096e-05, + 4.88973777275e-05, + 5.45497869281e-05, + 6.01718596689e-05, + 6.5762755081e-05, + 7.13216406827e-05, + 7.68476924924e-05, + 8.2340095138e-05, + 8.77980419663e-05, + 9.32207351494e-05, + 9.86073857882e-05, + 0.000103957214017, + 0.000109269449104, + 0.000114543329549, + 0.000119778103181, + 0.000124973027255, + 0.000130127368543, + 0.000135240403427, + 0.000140311417985, + 0.000145339708084, + 0.000150324579458, + 0.000155265347798, + 0.000160161338829, + 0.000165011888391, + 0.000169816342517, + 0.000174574057505, + 0.000179284399995, + 0.000183946747039, + 0.000188560486168, + 0.000193125015462, + 0.000197639743613, + 0.000202104089992, + 0.000206517484702, + 0.000210879368646, + 0.000215189193577, + 0.000219446422157, + 0.000223650528008, + 0.00022780099576, + 0.000231897321108, + 0.000235939010846, + 0.000239925582924, + 0.000243856566481, + 0.000247731501891, + 0.000251549940797, + 0.000255311446152, + 0.000259015592248, + 0.000262661964751, + 0.000266250160731, + 0.000269779788689, + 0.000273250468581, + 0.000276661831846, + 0.000280013521424, + 0.000283305191778, + 0.00028653650891, + 0.000289707150377, + 0.000292816805305, + 0.0002958651744, + 0.000298851969956, + 0.000301776915866, + 0.000304639747625, + 0.000307440212333, + 0.000310178068695, + 0.000312853087027, + 0.000315465049244, + 0.000318013748863, + 0.000320498990991, + 0.000322920592322, + 0.00032527838112, + 0.000327572197212, + 0.000329801891971, + 0.000331967328298, + 0.000334068380608, + 0.000336104934807, + 0.000338076888269, + 0.000339984149814, + 0.000341826639681, + 0.000343604289502, + 0.000345317042267, + 0.000346964852301, + 0.000348547685224, + 0.000350065517915, + 0.000351518338483, + 0.00035290614622, + 0.000354228951562, + 0.00035548677605, + 0.000356679652285, + 0.000357807623879, + 0.00035887074541, + 0.000359869082371, + 0.000360802711121, + 0.000361671718833, + 0.000362476203434, + 0.000363216273556, + 0.000363892048474, + 0.000364503658046, + 0.000365051242657, + 0.000365534953151, + 0.000365954950768, + 0.000366311407083, + 0.000366604503931, + 0.000366834433345, + 0.00036700139748, + 0.000367105608548, + 0.000367147288739, + 0.000367126670146, + 0.000367043994693, + 0.000366899514057, + 0.000366693489583, + 0.000366426192212, + 0.000366097902392, + 0.000365708909999, + 0.000365259514251, + 0.000364750023625, + 0.000364180755765, + 0.000363552037397, + 0.000362864204239, + 0.00036211760091, + 0.000361312580837, + 0.000360449506163, + 0.000359528747652, + 0.000358550684595, + 0.00035751570471, + 0.000356424204047, + 0.000355276586889, + 0.000354073265649, + 0.000352814660774, + 0.000351501200639, + 0.000350133321444, + 0.000348711467114, + 0.000347236089187, + 0.000345707646718, + 0.00034412660616, + 0.000342493441268, + 0.000340808632982, + 0.000339072669322, + 0.000337286045274, + 0.000335449262684, + 0.000333562830142, + 0.000331627262871, + 0.000329643082611, + 0.000327610817509, + 0.000325531002003, + 0.000323404176703, + 0.00032123088828, + 0.000319011689344, + 0.000316747138332, + 0.000314437799386, + 0.000312084242236, + 0.00030968704208, + 0.000307246779465, + 0.000304764040169, + 0.000302239415074, + 0.000299673500054, + 0.000297066895846, + 0.000294420207932, + 0.000291734046415, + 0.000289009025897, + 0.000286245765356, + 0.000283444888025, + 0.000280607021264, + 0.000277732796439, + 0.000274822848797, + 0.000271877817343, + 0.000268898344713, + 0.000265885077054, + 0.000262838663893, + 0.000259759758016, + 0.000256649015342, + 0.000253507094797, + 0.000250334658193, + 0.000247132370094, + 0.000243900897699, + 0.000240640910714, + 0.000237353081225, + 0.000234038083573, + 0.000230696594233, + 0.000227329291683, + 0.000223936856282, + 0.000220519970145, + 0.000217079317019, + 0.000213615582156, + 0.00021012945219, + 0.000206621615014, + 0.000203092759654, + 0.000199543576146, + 0.000195974755414, + 0.000192386989145, + 0.000188780969666, + 0.000185157389824, + 0.000181516942861, + 0.000177860322293, + 0.000174188221791, + 0.000170501335057, + 0.000166800355704, + 0.00016308597714, + 0.00015935889244, + 0.000155619794236, + 0.000151869374593, + 0.000148108324893, + 0.000144337335715, + 0.000140557096721, + 0.000136768296541, + 0.00013297162265, + 0.000129167761263, + 0.00012535739721, + 0.000121541213833, + 0.000117719892863, + 0.000113894114313, + 0.000110064556365, + 0.000106231895261, + 0.000102396805189, + 9.85599581742e-05, + 9.47220239738e-05, + 9.08836699653e-05, + 8.70455610408e-05, + 8.32083595008e-05, + 7.93727249482e-05, + 7.55393141839e-05, + 7.17087811037e-05, + 6.78817765943e-05, + 6.40589484322e-05, + 6.02409411821e-05, + 5.64283960973e-05, + 5.26219510201e-05, + 4.88222402837e-05, + 4.50298946152e-05, + 4.12455410392e-05, + 3.74698027823e-05, + 3.37032991792e-05, + 2.99466455791e-05, + 2.62004532543e-05, + 2.24653293078e-05, + 1.87418765842e-05, + 1.50306935809e-05, + 1.13323743589e-05, + 7.6475084575e-06, + 3.97668080754e-06, + 3.20471647219e-07, + -3.32054356145e-06, + -6.94579421467e-06, + -1.05547146489e-05, + -1.41467442196e-05, + -1.77213273811e-05, + -2.12779137638e-05, + -2.48159582505e-05, + -2.83349210526e-05, + -3.18342677823e-05, + -3.53134695275e-05, + -3.87720029225e-05, + -4.22093502181e-05, + -4.56249993508e-05, + -4.90184440116e-05, + -5.23891837116e-05, + -5.57367238476e-05, + -5.90605757664e-05, + -6.23602568284e-05, + -6.56352904671e-05, + -6.88852062514e-05, + -7.21095399436e-05, + -7.53078335576e-05, + -7.84796354136e-05, + -8.16245001958e-05, + -8.47419890042e-05, + -8.78316694075e-05, + -9.08931154942e-05, + -9.39259079227e-05, + -9.6929633969e-05, + -9.99038875742e-05, + -0.000102848269391, + -0.000105762386825, + -0.000108645854083, + -0.000111498292211, + -0.000114319329133, + -0.000117108599694, + -0.000119865745697, + -0.000122590415936, + -0.000125282266234, + -0.000127940959476, + -0.00013056616564, + -0.000133157561829, + -0.0001357148323, + -0.000138237668492, + -0.000140725769054, + -0.000143178839868, + -0.000145596594075, + -0.000147978752097, + -0.000150325041656, + -0.0001526351978, + -0.000154908962915, + -0.000157146086746, + -0.000159346326411, + -0.000161509446417, + -0.000163635218672, + -0.000165723422498, + -0.000167773844639, + -0.000169786279272, + -0.000171760528018, + -0.000173696399939, + -0.000175593711555, + -0.000177452286839, + -0.000179271957221, + -0.000181052561593, + -0.000182793946305, + -0.000184495965165, + -0.000186158479437, + -0.000187781357834, + -0.000189364476516, + -0.000190907719081, + -0.000192410976557, + -0.000193874147396, + -0.000195297137459, + -0.000196679860008, + -0.000198022235689, + -0.000199324192522, + -0.000200585665883, + -0.000201806598486, + -0.00020298694037, + -0.000204126648873, + -0.000205225688618, + -0.000206284031486, + -0.000207301656598, + -0.000208278550285, + -0.00020921470607, + -0.000210110124636, + -0.000210964813802, + -0.000211778788489, + -0.000212552070699, + -0.000213284689476, + -0.000213976680876, + -0.000214628087937, + -0.000215238960641, + -0.00021580935588, + -0.00021633933742, + -0.000216828975861, + -0.000217278348603, + -0.0002176875398, + -0.000218056640326, + -0.000218385747728, + -0.000218674966185, + -0.000218924406467, + -0.000219134185884, + -0.000219304428246, + -0.000219435263814, + -0.00021952682925, + -0.000219579267574, + -0.000219592728109, + -0.000219567366432, + -0.000219503344325, + -0.000219400829719, + -0.000219259996642, + -0.000219081025167, + -0.000218864101355, + -0.000218609417197, + -0.000218317170564, + -0.000217987565141, + -0.000217620810375, + -0.000217217121415, + -0.000216776719048, + -0.000216299829644, + -0.00021578668509, + -0.00021523752273, + -0.000214652585303, + -0.000214032120876, + -0.000213376382784, + -0.000212685629562, + -0.000211960124878, + -0.000211200137472, + -0.000210405941083, + -0.000209577814387, + -0.000208716040923, + -0.000207820909028, + -0.000206892711767, + -0.000205931746863, + -0.000204938316623, + -0.000203912727874, + -0.000202855291884, + -0.000201766324295, + -0.000200646145046, + -0.000199495078304, + -0.000198313452389, + -0.000197101599696, + -0.000195859856629, + -0.000194588563516, + -0.000193288064541, + -0.000191958707666, + -0.000190600844553, + -0.000189214830491, + -0.000187801024315, + -0.000186359788332, + -0.000184891488243, + -0.000183396493063, + -0.000181875175046, + -0.000180327909604, + -0.000178755075229, + -0.000177157053415, + -0.000175534228578, + -0.000173886987977, + -0.000172215721632, + -0.00017052082225, + -0.000168802685138, + -0.000167061708129, + -0.000165298291496, + -0.000163512837878, + -0.000161705752193, + -0.000159877441563, + -0.000158028315229, + -0.000156158784472, + -0.000154269262534, + -0.000152360164534, + -0.000150431907388, + -0.000148484909728, + -0.000146519591825, + -0.000144536375501, + -0.000142535684053, + -0.000140517942171, + -0.000138483575859, + -0.00013643301235, + -0.000134366680029, + -0.000132285008353, + -0.000130188427766, + -0.000128077369625, + -0.000125952266115, + -0.000123813550172, + -0.000121661655401, + -0.000119497015997, + -0.000117320066668, + -0.000115131242552, + -0.000112930979141, + -0.000110719712201, + -0.000108497877693, + -0.000106265911697, + -0.000104024250331, + -0.000101773329675, + -9.95135856952e-05, + -9.72454541639e-05, + -9.49693705847e-05, + -9.26857701153e-05, + -9.03950874922e-05, + -8.80977569551e-05, + -8.57942121704e-05, + -8.34848861582e-05, + -8.11702112158e-05, + -7.88506188454e-05, + -7.65265396796e-05, + -7.41984034076e-05, + -7.18666387045e-05, + -6.95316731563e-05, + -6.719393319e-05, + -6.4853844002e-05, + -6.25118294866e-05, + -6.01683121657e-05, + -5.78237131195e-05, + -5.54784519171e-05, + -5.31329465472e-05, + -5.07876133502e-05, + -4.84428669509e-05, + -4.60991201909e-05, + -4.37567840621e-05, + -4.14162676403e-05, + -3.90779780211e-05, + -3.67423202539e-05, + -3.44096972784e-05, + -3.2080509861e-05, + -2.9755156532e-05, + -2.74340335229e-05, + -2.5117534705e-05, + -2.28060515288e-05, + -2.04999729634e-05, + -1.81996854367e-05, + -1.59055727771e-05, + -1.36180161547e-05, + -1.13373940243e-05, + -9.06408206736e-06, + -6.79845313778e-06, + -4.54087720514e-06, + -2.29172130051e-06, + -5.13494620158e-08, + 2.17987731754e-06, + 4.40160114357e-06, + 6.61346727127e-06, + 8.81512415651e-06, + 1.10062235066e-05, + 1.31864203285e-05, + 1.53553729785e-05, + 1.75127432089e-05, + 1.96581962165e-05, + 2.17914006874e-05, + 2.39120288431e-05, + 2.60197564854e-05, + 2.81142630394e-05, + 3.01952315971e-05, + 3.22623489589e-05, + 3.43153056761e-05, + 3.63537960901e-05, + 3.83775183728e-05, + 4.03861745651e-05, + 4.23794706153e-05, + 4.43571164156e-05, + 4.63188258388e-05, + 4.8264316774e-05, + 5.01933111601e-05, + 5.21055350209e-05, + 5.40007184967e-05, + 5.58785958772e-05, + 5.77389056322e-05, + 5.95813904418e-05, + 6.14057972259e-05, + 6.32118771725e-05, + 6.49993857655e-05, + 6.67680828118e-05, + 6.85177324661e-05, + 7.02481032568e-05, + 7.19589681103e-05, + 7.3650104373e-05, + 7.53212938347e-05, + 7.69723227498e-05, + 7.86029818577e-05, + 8.02130664025e-05, + 8.18023761517e-05, + 8.33707154146e-05, + 8.49178930588e-05, + 8.64437225261e-05, + 8.79480218484e-05, + 8.94306136621e-05, + 9.08913252208e-05, + 9.23299884082e-05, + 9.37464397508e-05, + 9.51405204267e-05, + 9.65120762776e-05, + 9.78609578167e-05, + 9.91870202373e-05, + 0.00010049012342, + 0.000101770131938, + 0.000103026915067, + 0.000104260346783, + 0.000105470305773, + 0.000106656675432, + 0.00010781934387, + 0.00010895820391, + 0.000110073153092, + 0.000111164093668, + 0.000112230932602, + 0.000113273581572, + 0.000114291956962, + 0.000115285979859, + 0.000116255576052, + 0.000117200676021, + 0.000118121214936, + 0.000119017132645, + 0.000119888373671, + 0.000120734887199, + 0.00012155662707, + 0.000122353551765, + 0.000123125624403, + 0.00012387281272, + 0.00012459508906, + 0.000125292430364, + 0.00012596481815, + 0.000126612238503, + 0.000127234682056, + 0.000127832143977, + 0.000128404623946, + 0.000128952126143, + 0.000129474659224, + 0.000129972236305, + 0.00013044487494, + 0.0001308925971, + 0.000131315429153, + 0.000131713401838, + 0.000132086550247, + 0.000132434913794, + 0.000132758536198, + 0.000133057465453, + 0.000133331753804, + 0.000133581457718, + 0.000133806637861, + 0.000134007359067, + 0.000134183690308, + 0.00013433570467, + 0.000134463479318, + 0.00013456709547, + 0.000134646638361, + 0.000134702197216, + 0.000134733865215, + 0.00013474173946, + 0.000134725920945, + 0.000134686514516, + 0.000134623628844, + 0.000134537376382, + 0.000134427873336, + 0.000134295239624, + 0.000134139598843, + 0.000133961078228, + 0.000133759808617, + 0.000133535924411, + 0.000133289563539, + 0.000133020867412, + 0.00013272998089, + 0.000132417052235, + 0.000132082233079, + 0.000131725678375, + 0.000131347546358, + 0.000130947998505, + 0.000130527199491, + 0.000130085317144, + 0.000129622522407, + 0.000129138989288, + 0.000128634894822, + 0.000128110419021, + 0.000127565744835, + 0.000127001058101, + 0.000126416547503, + 0.000125812404522, + 0.00012518882339, + 0.000124546001049, + 0.000123884137095, + 0.000123203433741, + 0.000122504095762, + 0.000121786330449, + 0.000121050347565, + 0.000120296359292, + 0.000119524580186, + 0.000118735227124, + 0.000117928519261, + 0.000117104677976, + 0.000116263926824, + 0.00011540649149, + 0.000114532599733, + 0.000113642481339, + 0.000112736368074, + 0.000111814493629, + 0.000110877093571, + 0.000109924405294, + 0.000108956667967, + 0.000107974122484, + 0.000106977011411, + 0.000105965578938, + 0.000104940070826, + 0.000103900734356, + 0.000102847818276, + 0.000101781572756, + 0.000100702249328, + 9.96101008408e-05, + 9.85053814058e-05, + 9.7388346346e-05, + 9.6259252145e-05, + 9.51183563944e-05, + 9.39659177435e-05, + 9.28021958467e-05, + 9.16274513127e-05, + 9.0441945653e-05, + 8.92459412297e-05, + 8.8039701205e-05, + 8.68234894894e-05, + 8.55975706908e-05, + 8.43622100627e-05, + 8.31176734536e-05, + 8.1864227256e-05, + 8.06021383549e-05, + 7.9331674078e-05, + 7.80531021443e-05, + 7.67666906133e-05, + 7.54727078354e-05, + 7.41714224012e-05, + 7.28631030913e-05, + 7.15480188265e-05, + 7.0226438618e-05, + 6.88986315179e-05, + 6.75648665698e-05, + 6.62254127591e-05, + 6.4880538965e-05, + 6.35305139107e-05, + 6.21756061155e-05, + 6.08160838461e-05, + 5.94522150686e-05, + 5.80842674011e-05, + 5.6712508065e-05, + 5.53372038391e-05, + 5.39586210114e-05, + 5.2577025333e-05, + 5.1192681971e-05, + 4.9805855463e-05, + 4.84168096706e-05, + 4.70258077341e-05, + 4.56331120272e-05, + 4.42389841118e-05, + 4.28436846936e-05, + 4.14474735783e-05, + 4.0050609626e-05, + 3.86533507095e-05, + 3.72559536701e-05, + 3.58586742747e-05, + 3.44617671733e-05, + 3.30654858571e-05, + 3.16700826166e-05, + 3.02758085003e-05, + 2.88829132735e-05, + 2.74916453776e-05, + 2.61022518907e-05, + 2.47149784868e-05, + 2.33300693971e-05, + 2.19477673712e-05, + 2.05683136377e-05, + 1.91919478673e-05, + 1.78189081343e-05, + 1.64494308799e-05, + 1.5083750875e-05, + 1.37221011846e-05, + 1.23647131313e-05, + 1.10118162603e-05, + 9.66363830479e-06, + 8.32040515053e-06, + 6.98234080332e-06, + 5.64966735417e-06, + 4.32260494743e-06, + 3.0013717478e-06, + 1.68618390817e-06, + 3.77255538808e-07, + -9.25201324664e-07, + -2.22097675007e-06, + -3.50986294095e-06, + -4.79165426359e-06, + -6.06614727805e-06, + -7.33314076462e-06, + -8.59243575357e-06, + -9.84383555092e-06, + -1.10871457664e-05, + -1.23221743389e-05, + -1.35487315631e-05, + -1.4766630114e-05, + -1.59756850713e-05, + -1.71757139447e-05, + -1.83665366966e-05, + -1.95479757652e-05, + -2.07198560871e-05, + -2.18820051194e-05, + -2.30342528609e-05, + -2.41764318727e-05, + -2.5308377299e-05, + -2.64299268862e-05, + -2.75409210024e-05, + -2.86412026567e-05, + -2.97306175148e-05, + -3.08090139198e-05, + -3.18762429063e-05, + -3.2932158218e-05, + -3.39766163229e-05, + -3.50094764299e-05, + -3.60306005009e-05, + -3.70398532674e-05, + -3.80371022421e-05, + -3.90222177329e-05, + -3.99950728542e-05, + -4.09555435403e-05, + -4.1903508555e-05, + -4.28388495026e-05, + -4.37614508386e-05, + -4.46711998787e-05, + -4.55679868072e-05, + -4.64517046865e-05, + -4.73222494639e-05, + -4.81795199794e-05, + -4.90234179715e-05, + -4.98538480849e-05, + -5.06707178738e-05, + -5.14739378086e-05, + -5.22634212794e-05, + -5.30390846007e-05, + -5.38008470135e-05, + -5.45486306884e-05, + -5.52823607285e-05, + -5.60019651696e-05, + -5.67073749831e-05, + -5.73985240742e-05, + -5.80753492843e-05, + -5.8737790388e-05, + -5.93857900939e-05, + -6.00192940416e-05, + -6.06382508004e-05, + -6.12426118656e-05, + -6.18323316566e-05, + -6.24073675111e-05, + -6.29676796822e-05, + -6.35132313334e-05, + -6.40439885327e-05, + -6.45599202469e-05, + -6.50609983348e-05, + -6.55471975413e-05, + -6.60184954882e-05, + -6.6474872668e-05, + -6.69163124345e-05, + -6.73428009934e-05, + -6.77543273941e-05, + -6.81508835187e-05, + -6.85324640715e-05, + -6.88990665687e-05, + -6.92506913267e-05, + -6.95873414498e-05, + -6.99090228189e-05, + -7.02157440771e-05, + -7.05075166174e-05, + -7.07843545695e-05, + -7.10462747839e-05, + -7.12932968188e-05, + -7.15254429235e-05, + -7.17427380246e-05, + -7.19452097087e-05, + -7.21328882056e-05, + -7.23058063736e-05, + -7.24639996796e-05, + -7.2607506183e-05, + -7.27363665169e-05, + -7.28506238703e-05, + -7.29503239678e-05, + -7.30355150524e-05, + -7.31062478634e-05, + -7.31625756181e-05, + -7.32045539897e-05, + -7.32322410888e-05, + -7.32456974393e-05, + -7.32449859588e-05, + -7.32301719364e-05, + -7.32013230091e-05, + -7.31585091407e-05, + -7.31018025979e-05, + -7.30312779273e-05, + -7.29470119312e-05, + -7.28490836441e-05, + -7.27375743081e-05, + -7.26125673485e-05, + -7.24741483487e-05, + -7.23224050245e-05, + -7.21574271996e-05, + -7.19793067783e-05, + -7.17881377208e-05, + -7.15840160155e-05, + -7.13670396535e-05, + -7.11373086006e-05, + -7.0894924771e-05, + -7.06399919985e-05, + -7.03726160105e-05, + -7.00929043989e-05, + -6.98009665914e-05, + -6.94969138246e-05, + -6.91808591142e-05, + -6.88529172268e-05, + -6.85132046496e-05, + -6.81618395626e-05, + -6.77989418087e-05, + -6.74246328629e-05, + -6.7039035804e-05, + -6.66422752831e-05, + -6.62344774949e-05, + -6.58157701454e-05, + -6.53862824236e-05, + -6.49461449691e-05, + -6.44954898417e-05, + -6.40344504901e-05, + -6.35631617218e-05, + -6.3081759671e-05, + -6.25903817668e-05, + -6.20891667025e-05, + -6.15782544042e-05, + -6.10577859981e-05, + -6.05279037793e-05, + -5.99887511796e-05, + -5.94404727363e-05, + -5.88832140591e-05, + -5.83171217985e-05, + -5.77423436132e-05, + -5.71590281389e-05, + -5.65673249544e-05, + -5.59673845504e-05, + -5.53593582968e-05, + -5.47433984106e-05, + -5.41196579222e-05, + -5.34882906449e-05, + -5.28494511405e-05, + -5.22032946877e-05, + -5.15499772498e-05, + -5.08896554416e-05, + -5.02224864978e-05, + -4.95486282395e-05, + -4.88682390423e-05, + -4.81814778037e-05, + -4.7488503911e-05, + -4.67894772085e-05, + -4.6084557966e-05, + -4.53739068453e-05, + -4.46576848692e-05, + -4.39360533886e-05, + -4.32091740514e-05, + -4.2477208769e-05, + -4.1740319686e-05, + -4.0998669147e-05, + -4.02524196663e-05, + -3.95017338954e-05, + -3.87467745908e-05, + -3.79877045846e-05, + -3.72246867517e-05, + -3.64578839787e-05, + -3.56874591332e-05, + -3.49135750333e-05, + -3.41363944161e-05, + -3.33560799071e-05, + -3.25727939905e-05, + -3.17866989781e-05, + -3.09979569799e-05, + -3.02067298728e-05, + -2.94131792717e-05, + -2.86174665007e-05, + -2.78197525616e-05, + -2.70201981061e-05, + -2.62189634062e-05, + -2.54162083251e-05, + -2.46120922893e-05, + -2.38067742593e-05, + -2.30004127006e-05, + -2.2193165558e-05, + -2.13851902251e-05, + -2.05766435184e-05, + -1.97676816489e-05, + -1.89584601955e-05, + -1.81491340776e-05, + -1.73398575287e-05, + -1.65307840696e-05, + -1.57220664825e-05, + -1.49138567846e-05, + -1.41063062029e-05, + -1.32995651483e-05, + -1.24937831905e-05, + -1.16891090332e-05, + -1.08856904888e-05, + -1.00836744552e-05, + -9.28320689053e-06, + -8.48443278967e-06, + -7.6874961612e-06, + -6.89254000319e-06, + -6.09970628118e-06, + -5.30913590446e-06, + -4.52096870451e-06, + -3.7353434128e-06, + -2.95239763859e-06, + -2.1722678476e-06, + -1.39508934116e-06, + -6.20996235323e-07, + 1.49878560562e-07, + 9.17403362832e-07, + 1.68144773405e-06, + 2.44188250309e-06, + 3.19857978326e-06, + 3.9514129917e-06, + 4.70025686861e-06, + 5.44498749455e-06, + 6.18548230935e-06, + 6.92162012883e-06, + 7.65328116248e-06, + 8.38034703032e-06, + 9.10270077947e-06, + 9.82022690066e-06, + 1.05328113432e-05, + 1.1240341532e-05, + 1.19427063814e-05, + 1.26397963106e-05, + 1.33315032582e-05, + 1.40177206965e-05, + 1.46983436443e-05, + 1.53732686814e-05, + 1.60423939615e-05, + 1.67056192242e-05, + 1.73628458082e-05, + 1.80139766628e-05, + 1.86589163595e-05, + 1.92975711039e-05, + 1.99298487452e-05, + 2.05556587884e-05, + 2.11749124036e-05, + 2.17875224355e-05, + 2.23934034135e-05, + 2.29924715606e-05, + 2.35846448017e-05, + 2.41698427726e-05, + 2.47479868276e-05, + 2.53190000468e-05, + 2.5882807244e-05, + 2.64393349734e-05, + 2.69885115355e-05, + 2.75302669841e-05, + 2.80645331315e-05, + 2.85912435541e-05, + 2.91103335978e-05, + 2.96217403817e-05, + 3.01254028036e-05, + 3.06212615431e-05, + 3.11092590657e-05, + 3.15893396258e-05, + 3.20614492694e-05, + 3.25255358369e-05, + 3.29815489654e-05, + 3.34294400898e-05, + 3.38691624451e-05, + 3.43006710668e-05, + 3.4723922792e-05, + 3.51388762598e-05, + 3.55454919109e-05, + 3.59437319876e-05, + 3.6333560533e-05, + 3.67149433904e-05, + 3.7087848201e-05, + 3.74522444032e-05, + 3.78081032298e-05, + 3.81553977059e-05, + 3.84941026461e-05, + 3.88241946516e-05, + 3.91456521065e-05, + 3.94584551741e-05, + 3.97625857927e-05, + 4.00580276722e-05, + 4.03447662873e-05, + 4.06227888747e-05, + 4.08920844263e-05, + 4.11526436837e-05, + 4.14044591326e-05, + 4.16475249961e-05, + 4.18818372284e-05, + 4.21073935071e-05, + 4.2324193227e-05, + 4.25322374916e-05, + 4.27315291056e-05, + 4.2922072567e-05, + 4.3103874058e-05, + 4.32769414367e-05, + 4.34412842277e-05, + 4.35969136134e-05, + 4.37438424236e-05, + 4.3882085126e-05, + 4.40116578156e-05, + 4.41325782052e-05, + 4.42448656137e-05, + 4.43485409553e-05, + 4.44436267282e-05, + 4.45301470035e-05, + 4.4608127413e-05, + 4.46775951373e-05, + 4.47385788931e-05, + 4.47911089213e-05, + 4.48352169737e-05, + 4.48709363002e-05, + 4.48983016352e-05, + 4.49173491848e-05, + 4.49281166118e-05, + 4.49306430234e-05, + 4.49249689551e-05, + 4.49111363581e-05, + 4.4889188583e-05, + 4.48591703667e-05, + 4.48211278153e-05, + 4.47751083907e-05, + 4.4721160894e-05, + 4.46593354504e-05, + 4.45896834926e-05, + 4.45122577458e-05, + 4.44271122105e-05, + 4.43343021468e-05, + 4.42338840571e-05, + 4.41259156699e-05, + 4.40104559228e-05, + 4.3887564945e-05, + 4.37573040403e-05, + 4.36197356696e-05, + 4.34749234335e-05, + 4.33229320541e-05, + 4.31638273578e-05, + 4.29976762566e-05, + 4.28245467301e-05, + 4.26445078079e-05, + 4.24576295499e-05, + 4.22639830291e-05, + 4.20636403117e-05, + 4.18566744393e-05, + 4.16431594096e-05, + 4.14231701569e-05, + 4.11967825341e-05, + 4.09640732922e-05, + 4.07251200624e-05, + 4.04800013353e-05, + 4.02287964423e-05, + 3.99715855358e-05, + 3.97084495697e-05, + 3.94394702792e-05, + 3.91647301614e-05, + 3.88843124556e-05, + 3.85983011226e-05, + 3.83067808259e-05, + 3.80098369106e-05, + 3.77075553838e-05, + 3.74000228945e-05, + 3.70873267131e-05, + 3.67695547119e-05, + 3.64467953439e-05, + 3.61191376232e-05, + 3.57866711046e-05, + 3.54494858633e-05, + 3.51076724742e-05, + 3.4761321992e-05, + 3.44105259309e-05, + 3.40553762437e-05, + 3.3695965302e-05, + 3.33323858758e-05, + 3.29647311128e-05, + 3.25930945181e-05, + 3.22175699347e-05, + 3.18382515221e-05, + 3.14552337367e-05, + 3.10686113113e-05, + 3.06784792351e-05, + 3.02849327335e-05, + 2.98880672478e-05, + 2.94879784153e-05, + 2.9084762049e-05, + 2.86785141181e-05, + 2.82693307275e-05, + 2.78573080985e-05, + 2.74425425486e-05, + 2.70251304716e-05, + 2.66051683188e-05, + 2.61827525782e-05, + 2.57579797559e-05, + 2.53309463566e-05, + 2.49017488635e-05, + 2.44704837199e-05, + 2.40372473098e-05, + 2.36021359383e-05, + 2.31652458135e-05, + 2.27266730268e-05, + 2.22865135349e-05, + 2.18448631404e-05, + 2.14018174737e-05, + 2.09574719746e-05, + 2.05119218738e-05, + 2.00652621749e-05, + 1.9617587636e-05, + 1.91689927523e-05, + 1.87195717375e-05, + 1.82694185072e-05, + 1.78186266605e-05, + 1.73672894628e-05, + 1.69154998289e-05, + 1.64633503054e-05, + 1.60109330543e-05, + 1.55583398356e-05, + 1.51056619915e-05, + 1.46529904287e-05, + 1.42004156032e-05, + 1.37480275034e-05, + 1.32959156349e-05, + 1.28441690038e-05, + 1.23928761012e-05, + 1.19421248885e-05, + 1.14920027813e-05, + 1.1042596634e-05, + 1.05939927257e-05, + 1.01462767456e-05, + 9.69953377727e-06, + 9.25384828498e-06, + 8.80930409919e-06, + 8.36598440324e-06, + 7.92397171878e-06, + 7.48334789213e-06, + 7.04419408104e-06, + 6.60659074225e-06, + 6.17061761699e-06, + 5.73635371937e-06, + 5.30387732323e-06, + 4.87326594922e-06, + 4.44459635363e-06, + 4.0179445161e-06, + 3.59338562705e-06, + 3.17099407743e-06, + 2.75084344603e-06, + 2.333006489e-06, + 1.91755512946e-06, + 1.50456044545e-06, + 1.0940926608e-06, + 6.86221133916e-07, + 2.81014347903e-07, + -1.21460098645e-07, + -5.21135501863e-07, + -9.17946061607e-07, + -1.31182689067e-06, + -1.70271402489e-06, + -2.09054442912e-06, + -2.47525600816e-06, + -2.85678761469e-06, + -3.23507905575e-06, + -3.61007110183e-06, + -3.98170549398e-06, + -4.3499249518e-06, + -4.71467317875e-06, + -5.07589487087e-06, + -5.43353572269e-06, + -5.78754243286e-06, + -6.13786271209e-06, + -6.48444528673e-06, + -6.82723990608e-06, + -7.16619734709e-06, + -7.50126942073e-06, + -7.83240897473e-06, + -8.15956990041e-06, + -8.48270713605e-06, + -8.80177667151e-06, + -9.1167355516e-06, + -9.42754188116e-06, + -9.7341548273e-06, + -1.00365346234e-05, + -1.03346425719e-05, + -1.06284410477e-05, + -1.09178934995e-05, + -1.12029644534e-05, + -1.14836195146e-05, + -1.17598253691e-05, + -1.20315497856e-05, + -1.22987616167e-05, + -1.25614308009e-05, + -1.28195283624e-05, + -1.30730264123e-05, + -1.33218981497e-05, + -1.35661178609e-05, + -1.38056609207e-05, + -1.40405037907e-05, + -1.42706240212e-05, + -1.44960002477e-05, + -1.47166121924e-05, + -1.49324406622e-05, + -1.51434675471e-05, + -1.53496758193e-05, + -1.55510495317e-05, + -1.57475738145e-05, + -1.59392348755e-05, + -1.61260199956e-05, + -1.63079175264e-05, + -1.64849168889e-05, + -1.66570085691e-05, + -1.68241841152e-05, + -1.69864361343e-05, + -1.71437582892e-05, + -1.72961452929e-05, + -1.7443592907e-05, + -1.75860979355e-05, + -1.77236582211e-05, + -1.78562726409e-05, + -1.79839411014e-05, + -1.81066645326e-05, + -1.82244448843e-05, + -1.83372851195e-05, + -1.84451892089e-05, + -1.85481621267e-05, + -1.86462098419e-05, + -1.87393393147e-05, + -1.88275584891e-05, + -1.8910876286e-05, + -1.89893025977e-05, + -1.90628482795e-05, + -1.91315251443e-05, + -1.91953459545e-05, + -1.92543244144e-05, + -1.93084751638e-05, + -1.9357813769e-05, + -1.94023567159e-05, + -1.94421214019e-05, + -1.94771261273e-05, + -1.9507390087e-05, + -1.9532933363e-05, + -1.95537769145e-05, + -1.956994257e-05, + -1.95814530177e-05, + -1.95883317982e-05, + -1.9590603292e-05, + -1.95882927145e-05, + -1.95814261026e-05, + -1.95700303076e-05, + -1.95541329846e-05, + -1.9533762583e-05, + -1.95089483359e-05, + -1.94797202508e-05, + -1.94461090992e-05, + -1.94081464062e-05, + -1.93658644398e-05, + -1.9319296201e-05, + -1.92684754126e-05, + -1.92134365091e-05, + -1.91542146248e-05, + -1.90908455844e-05, + -1.90233658905e-05, + -1.89518127134e-05, + -1.88762238793e-05, + -1.87966378593e-05, + -1.87130937581e-05, + -1.86256313028e-05, + -1.85342908301e-05, + -1.84391132765e-05, + -1.83401401648e-05, + -1.82374135935e-05, + -1.81309762248e-05, + -1.80208712726e-05, + -1.79071424899e-05, + -1.7789834158e-05, + -1.76689910734e-05, + -1.75446585358e-05, + -1.74168823366e-05, + -1.72857087459e-05, + -1.71511845006e-05, + -1.70133567923e-05, + -1.68722732539e-05, + -1.67279819483e-05, + -1.65805313557e-05, + -1.64299703611e-05, + -1.62763482414e-05, + -1.61197146535e-05, + -1.5960119621e-05, + -1.57976135224e-05, + -1.56322470781e-05, + -1.54640713381e-05, + -1.52931376689e-05, + -1.51194977416e-05, + -1.49432035186e-05, + -1.47643072408e-05, + -1.45828614164e-05, + -1.43989188062e-05, + -1.42125324125e-05, + -1.40237554667e-05, + -1.3832641415e-05, + -1.3639243907e-05, + -1.34436167836e-05, + -1.32458140634e-05, + -1.30458899306e-05, + -1.28438987219e-05, + -1.26398949158e-05, + -1.24339331178e-05, + -1.22260680497e-05, + -1.20163545363e-05, + -1.18048474933e-05, + -1.15916019154e-05, + -1.13766728631e-05, + -1.11601154513e-05, + -1.09419848366e-05, + -1.07223362058e-05, + -1.05012247633e-05, + -1.02787057183e-05, + -1.0054834275e-05, + -9.82966561835e-06, + -9.60325490351e-06, + -9.37565724413e-06, + -9.14692769993e-06, + -8.91712126516e-06, + -8.68629285744e-06, + -8.4544973058e-06, + -8.22178933957e-06, + -7.98822357684e-06, + -7.75385451357e-06, + -7.51873651161e-06, + -7.28292378804e-06, + -7.04647040384e-06, + -6.80943025366e-06, + -6.57185705455e-06, + -6.33380433435e-06, + -6.09532542262e-06, + -5.85647343887e-06, + -5.61730128212e-06, + -5.37786162136e-06, + -5.13820688441e-06, + -4.898389248e-06, + -4.65846062814e-06, + -4.41847266952e-06, + -4.17847673551e-06, + -3.93852389902e-06, + -3.69866493322e-06, + -3.45895030041e-06, + -3.21943014425e-06, + -2.98015427957e-06, + -2.74117218368e-06, + -2.50253298639e-06, + -2.26428546291e-06, + -2.02647802294e-06, + -1.78915870341e-06, + -1.55237515886e-06, + -1.31617465393e-06, + -1.08060405513e-06, + -8.45709821284e-07, + -6.11537996908e-07, + -3.78134203727e-07, + -1.45543633145e-07, + 8.61889619674e-08, + 3.17019274387e-07, + 5.46903449639e-07, + 7.75798093877e-07, + 1.00366028055e-06, + 1.2304475574e-06, + 1.45611795388e-06, + 1.68062998673e-06, + 1.9039426673e-06, + 2.12601550786e-06, + 2.34680852795e-06, + 2.56628225981e-06, + 2.78439775525e-06, + 3.00111659091e-06, + 3.2164008742e-06, + 3.43021324845e-06, + 3.64251689877e-06, + 3.85327555719e-06, + 4.06245350726e-06, + 4.27001558923e-06, + 4.47592720543e-06, + 4.68015432387e-06, + 4.88266348364e-06, + 5.08342179839e-06, + 5.2823969614e-06, + 5.4795572485e-06, + 5.67487152325e-06, + 5.86830923976e-06, + 6.05984044644e-06, + 6.24943578931e-06, + 6.4370665156e-06, + 6.62270447671e-06, + 6.80632213079e-06, + 6.98789254627e-06, + 7.16738940376e-06, + 7.34478699926e-06, + 7.52006024585e-06, + 7.69318467619e-06, + 7.86413644449e-06, + 8.03289232865e-06, + 8.19942973163e-06, + 8.36372668334e-06, + 8.52576184185e-06, + 8.68551449462e-06, + 8.84296455983e-06, + 8.99809258725e-06, + 9.15087975928e-06, + 9.30130789123e-06, + 9.44935943215e-06, + 9.59501746511e-06, + 9.73826570771e-06, + 9.87908851169e-06, + 1.00174708632e-05, + 1.01533983823e-05, + 1.02868573232e-05, + 1.04178345732e-05, + 1.0546317652e-05, + 1.06722947116e-05, + 1.0795754535e-05, + 1.09166865346e-05, + 1.10350807518e-05, + 1.11509278554e-05, + 1.12642191401e-05, + 1.13749465247e-05, + 1.14831025504e-05, + 1.15886803793e-05, + 1.16916737921e-05, + 1.17920771859e-05, + 1.1889885572e-05, + 1.19850945731e-05, + 1.20777004214e-05, + 1.21676999559e-05, + 1.22550906186e-05, + 1.2339870453e-05, + 1.24220381001e-05, + 1.25015927953e-05, + 1.25785343653e-05, + 1.26528632249e-05, + 1.27245803729e-05, + 1.27936873892e-05, + 1.28601864297e-05, + 1.29240802241e-05, + 1.2985372071e-05, + 1.30440658334e-05, + 1.31001659351e-05, + 1.31536773565e-05, + 1.32046056297e-05, + 1.32529568339e-05, + 1.32987375909e-05, + 1.33419550609e-05, + 1.33826169364e-05, + 1.34207314385e-05, + 1.34563073111e-05, + 1.34893538161e-05, + 1.35198807274e-05, + 1.3547898327e-05, + 1.35734173982e-05, + 1.35964492204e-05, + 1.36170055642e-05, + 1.36350986848e-05, + 1.36507413168e-05, + 1.36639466678e-05, + 1.3674728413e-05, + 1.36831006888e-05, + 1.3689078087e-05, + 1.36926756482e-05, + 1.3693908856e-05, + 1.36927936302e-05, + 1.36893463208e-05, + 1.36835837017e-05, + 1.36755229634e-05, + 1.3665181707e-05, + 1.36525779373e-05, + 1.36377300565e-05, + 1.36206568567e-05, + 1.36013775138e-05, + 1.35799115801e-05, + 1.35562789775e-05, + 1.35304999906e-05, + 1.35025952596e-05, + 1.34725857732e-05, + 1.34404928613e-05, + 1.34063381882e-05, + 1.33701437453e-05, + 1.33319318429e-05, + 1.32917251048e-05, + 1.32495464591e-05, + 1.32054191319e-05, + 1.31593666395e-05, + 1.31114127812e-05, + 1.30615816315e-05, + 1.30098975332e-05, + 1.2956385089e-05, + 1.29010691552e-05, + 1.28439748328e-05, + 1.27851274609e-05, + 1.27245526091e-05, + 1.26622760693e-05, + 1.25983238484e-05, + 1.25327221607e-05, + 1.24654974206e-05, + 1.23966762343e-05, + 1.23262853926e-05, + 1.22543518635e-05, + 1.21809027839e-05, + 1.21059654524e-05, + 1.20295673218e-05, + 1.19517359913e-05, + 1.18724991985e-05, + 1.17918848124e-05, + 1.17099208254e-05, + 1.16266353462e-05, + 1.15420565916e-05, + 1.14562128792e-05, + 1.13691326202e-05, + 1.12808443113e-05, + 1.11913765279e-05, + 1.11007579159e-05, + 1.10090171846e-05, + 1.09161830996e-05, + 1.08222844748e-05, + 1.07273501656e-05, + 1.06314090609e-05, + 1.05344900767e-05, + 1.04366221484e-05, + 1.03378342229e-05, + 1.02381552531e-05, + 1.01376141891e-05, + 1.00362399718e-05, + 9.93406152572e-06, + 9.83110775277e-06, + 9.72740752403e-06, + 9.62298967377e-06, + 9.51788299186e-06, + 9.41211621786e-06, + 9.30571803337e-06, + 9.19871705607e-06, + 9.09114183278e-06, + 8.98302083263e-06, + 8.87438244068e-06, + 8.76525495219e-06, + 8.65566656494e-06, + 8.54564537367e-06, + 8.43521936422e-06, + 8.32441640619e-06, + 8.21326424749e-06, + 8.10179050847e-06, + 7.99002267537e-06, + 7.87798809487e-06, + 7.76571396788e-06, + 7.65322734386e-06, + 7.54055511554e-06, + 7.42772401252e-06, + 7.31476059634e-06, + 7.20169125457e-06, + 7.08854219578e-06, + 6.97533944405e-06, + 6.86210883372e-06, + 6.74887600427e-06, + 6.63566639525e-06, + 6.52250524136e-06, + 6.40941756735e-06, + 6.29642818339e-06, + 6.18356168025e-06, + 6.07084242488e-06, + 5.95829455552e-06, + 5.84594197717e-06, + 5.733808358e-06, + 5.62191712372e-06, + 5.51029145468e-06, + 5.39895428131e-06, + 5.28792828014e-06, + 5.17723586924e-06, + 5.06689920499e-06, + 4.9569401791e-06, + 4.84738041351e-06, + 4.7382412578e-06, + 4.62954378511e-06, + 4.52130879003e-06, + 4.4135567836e-06, + 4.3063079912e-06, + 4.19958234998e-06, + 4.09339950425e-06, + 3.9877788045e-06, + 3.88273930363e-06, + 3.77829975406e-06, + 3.67447860572e-06, + 3.57129400375e-06, + 3.46876378532e-06, + 3.36690547809e-06, + 3.2657362975e-06, + 3.16527314559e-06, + 3.06553260776e-06, + 2.96653095211e-06, + 2.86828412699e-06, + 2.77080775912e-06, + 2.67411715293e-06, + 2.57822728833e-06, + 2.48315281959e-06, + 2.3889080738e-06, + 2.29550705033e-06, + 2.20296341924e-06, + 2.1112905203e-06, + 2.02050136233e-06, + 1.9306086223e-06, + 1.84162464489e-06, + 1.7535614415e-06, + 1.66643069011e-06, + 1.58024373476e-06, + 1.49501158497e-06, + 1.41074491655e-06, + 1.32745407011e-06, + 1.24514905187e-06, + 1.16383953386e-06, + 1.08353485351e-06, + 1.00424401506e-06, + 9.25975688126e-07, + 8.48738209602e-07, + 7.72539584304e-07, + 6.97387484427e-07, + 6.23289251434e-07, + 5.50251896159e-07, + 4.78282100147e-07, + 4.07386216761e-07, + 3.37570271403e-07, + 2.68839963735e-07, + 2.0120066857e-07, + 1.34657436979e-07, + 6.92149981774e-08, + 4.8777604178e-09, + -5.83501866824e-08, + -1.2046507103e-07, + -1.81463435611e-07, + -2.4134213783e-07, + -3.00098346617e-07, + -3.57729540212e-07, + -4.14233504831e-07, + -4.69608332443e-07, + -5.23852417889e-07, + -5.76964457766e-07, + -6.28943446435e-07, + -6.79788674907e-07, + -7.29499727736e-07, + -7.78076480579e-07, + -8.25519097525e-07, + -8.71828028437e-07, + -9.17004006062e-07, + -9.61048043369e-07, + -1.00396142999e-06, + -1.04574573023e-06, + -1.08640277952e-06, + -1.12593468127e-06, + -1.16434380337e-06, + -1.20163277595e-06, + -1.23780448757e-06, + -1.27286208107e-06, + -1.30680895238e-06, + -1.3396487446e-06, + -1.37138534617e-06, + -1.40202288645e-06, + -1.43156573262e-06, + -1.46001848655e-06, + -1.48738597971e-06, + -1.51367327095e-06, + -1.53888564136e-06, + -1.56302859211e-06, + -1.58610783907e-06, + -1.60812930972e-06, + -1.62909913937e-06, + -1.64902366673e-06, + -1.66790943057e-06, + -1.68576316484e-06, + -1.70259179533e-06, + -1.71840243546e-06, + -1.73320238206e-06, + -1.74699911093e-06, + -1.75980027395e-06, + -1.77161369352e-06, + -1.78244735927e-06, + -1.79230942243e-06, + -1.80120819415e-06, + -1.80915213854e-06, + -1.81614987071e-06, + -1.82221015055e-06, + -1.82734187937e-06, + -1.83155409617e-06, + -1.83485597227e-06, + -1.8372568078e-06, + -1.83876602611e-06, + -1.83939317178e-06, + -1.83914790353e-06, + -1.83803999199e-06, + -1.83607931392e-06, + -1.83327584957e-06, + -1.82963967643e-06, + -1.82518096636e-06, + -1.81990998005e-06, + -1.81383706388e-06, + -1.80697264485e-06, + -1.79932722677e-06, + -1.79091138541e-06, + -1.78173576493e-06, + -1.77181107253e-06, + -1.76114807515e-06, + -1.7497575957e-06, + -1.73765050726e-06, + -1.72483772953e-06, + -1.71133022575e-06, + -1.69713899734e-06, + -1.68227507946e-06, + -1.66674953839e-06, + -1.65057346613e-06, + -1.63375797668e-06, + -1.6163142027e-06, + -1.59825329016e-06, + -1.57958639613e-06, + -1.56032468279e-06, + -1.54047931566e-06, + -1.52006145782e-06, + -1.49908226765e-06, + -1.47755289381e-06, + -1.45548447228e-06, + -1.4328881226e-06, + -1.40977494389e-06, + -1.38615601086e-06, + -1.36204237089e-06, + -1.33744504072e-06, + -1.312375002e-06, + -1.28684319867e-06, + -1.26086053287e-06, + -1.23443786215e-06, + -1.20758599587e-06, + -1.1803156923e-06, + -1.15263765443e-06, + -1.12456252821e-06, + -1.09610089805e-06, + -1.06726328553e-06, + -1.03806014407e-06, + -1.00850185802e-06, + -9.78598739154e-07, + -9.48361022823e-07, + -9.17798866684e-07, + -8.86922347343e-07, + -8.55741457695e-07, + -8.2426610426e-07, + -7.92506104963e-07, + -7.60471186023e-07, + -7.28170980624e-07, + -6.95615025359e-07, + -6.62812758456e-07, + -6.29773518224e-07, + -5.9650653994e-07, + -5.63020953859e-07, + -5.29325784093e-07, + -4.95429945735e-07, + -4.61342242852e-07, + -4.27071367604e-07, + -3.92625897572e-07, + -3.58014295099e-07, + -3.23244904399e-07, + -2.88325950448e-07, + -2.53265538763e-07, + -2.18071651847e-07, + -1.82752149192e-07, + -1.47314766163e-07, + -1.1176711201e-07, + -7.61166689678e-08, + -4.03707915986e-08, + -4.53670567779e-09, + 3.13784935813e-08, + 6.73678407503e-08, + 1.0342450274e-07, + 1.39541778355e-07, + 1.75713098849e-07, + 2.11932029592e-07, + 2.48192269514e-07, + 2.84487651991e-07, + 3.2081214496e-07, + 3.57159851694e-07, + 3.93525010134e-07, + 4.29901994337e-07, + 4.6628531325e-07, + 5.02669611491e-07, + 5.39049669013e-07, + 5.75420401328e-07, + 6.1177685895e-07, + 6.48114227064e-07, + 6.84427825415e-07, + 7.20713108082e-07, + 7.56965662707e-07, + 7.93181209935e-07, + 8.29355603305e-07, + 8.65484828028e-07, + 9.01565000544e-07, + 9.37592367523e-07, + 9.73563305418e-07, + 1.00947431902e-06, + 1.04532204137e-06, + 1.08110323149e-06, + 1.11681477444e-06, + 1.15245367949e-06, + 1.18801707916e-06, + 1.22350222742e-06, + 1.25890649938e-06, + 1.29422738926e-06, + 1.32946250897e-06, + 1.36460958666e-06, + 1.39966646506e-06, + 1.43463110025e-06, + 1.46950155977e-06, + 1.50427602086e-06, + 1.53895276833e-06, + 1.57353019403e-06, + 1.60800679361e-06, + 1.64238116529e-06, + 1.67665200745e-06, + 1.71081811762e-06, + 1.74487838944e-06, + 1.77883181085e-06, + 1.81267746224e-06, + 1.84641451406e-06, + 1.88004222457e-06, + 1.91355993795e-06, + 1.94696708145e-06, + 1.98026316345e-06, + 2.01344777173e-06, + 2.04652056945e-06, + 2.07948129416e-06, + 2.11232975544e-06, + 2.14506583096e-06, + 2.17768946564e-06, + 2.21020066804e-06, + 2.24259950832e-06, + 2.27488611571e-06, + 2.30706067539e-06, + 2.33912342651e-06, + 2.37107465906e-06, + 2.40291471165e-06, + 2.43464396843e-06, + 2.4662628566e-06, + 2.49777184358e-06, + 2.52917143473e-06, + 2.56046216951e-06, + 2.59164462046e-06, + 2.62271938933e-06, + 2.65368710395e-06, + 2.68454841623e-06, + 2.71530399976e-06, + 2.74595454597e-06, + 2.77650076164e-06, + 2.80694336707e-06, + 2.83728309203e-06, + 2.86752067391e-06, + 2.89765685457e-06, + 2.92769237775e-06, + 2.95762798619e-06, + 2.98746441862e-06, + 3.01720240803e-06, + 3.04684267805e-06, + 3.07638594021e-06, + 3.10583289198e-06, + 3.13518421391e-06, + 3.16444056592e-06, + 3.1936025866e-06, + 3.2226708887e-06, + 3.25164605797e-06, + 3.28052864995e-06, + 3.30931918735e-06, + 3.33801815788e-06, + 3.36662601186e-06, + 3.39514315917e-06, + 3.42356996763e-06, + 3.4519067601e-06, + 3.48015381224e-06, + 3.50831135021e-06, + 3.53637954875e-06, + 3.56435852855e-06, + 3.59224835411e-06, + 3.62004903165e-06, + 3.64776050688e-06, + 3.67538266355e-06, + 3.70291532059e-06, + 3.73035823076e-06, + 3.7577110783e-06, + 3.78497347742e-06, + 3.81214497047e-06, + 3.83922502567e-06, + 3.86621303627e-06, + 3.89310831794e-06, + 3.91991010817e-06, + 3.94661756375e-06, + 3.97322975965e-06, + 3.99974568821e-06, + 4.02616425699e-06, + 4.05248428748e-06, + 4.07870451458e-06, + 4.10482358437e-06, + 4.13084005402e-06, + 4.15675238996e-06, + 4.18255896761e-06, + 4.20825806957e-06, + 4.2338478855e-06, + 4.2593265116e-06, + 4.28469194869e-06, + 4.30994210254e-06, + 4.33507478304e-06, + 4.36008770388e-06, + 4.38497848165e-06, + 4.40974463589e-06, + 4.43438358932e-06, + 4.45889266587e-06, + 4.48326909264e-06, + 4.5075099987e-06, + 4.5316124152e-06, + 4.5555732755e-06, + 4.57938941556e-06, + 4.60305757444e-06, + 4.62657439382e-06, + 4.64993641847e-06, + 4.67314009822e-06, + 4.69618178645e-06, + 4.71905774224e-06, + 4.74176413023e-06, + 4.7642970219e-06, + 4.78665239645e-06, + 4.80882614129e-06, + 4.83081405345e-06, + 4.8526118408e-06, + 4.87421512307e-06, + 4.89561943307e-06, + 4.91682021797e-06, + 4.93781284117e-06, + 4.95859258309e-06, + 4.97915464381e-06, + 4.99949414356e-06, + 5.01960612531e-06, + 5.03948555597e-06, + 5.05912732895e-06, + 5.07852626552e-06, + 5.09767711732e-06, + 5.11657456836e-06, + 5.13521323686e-06, + 5.15358767794e-06, + 5.17169238567e-06, + 5.18952179607e-06, + 5.20707028884e-06, + 5.22433219019e-06, + 5.24130177582e-06, + 5.257973273e-06, + 5.27434086384e-06, + 5.29039868769e-06, + 5.3061408446e-06, + 5.32156139765e-06, + 5.33665437663e-06, + 5.35141378022e-06, + 5.36583358046e-06, + 5.37990772442e-06, + 5.39363013863e-06, + 5.40699473173e-06, + 5.41999539838e-06, + 5.43262602204e-06, + 5.44488047949e-06, + 5.45675264274e-06, + 5.46823638425e-06, + 5.4793255797e-06, + 5.49001411176e-06, + 5.50029587387e-06, + 5.51016477401e-06, + 5.51961473827e-06, + 5.52863971548e-06, + 5.53723368002e-06, + 5.54539063635e-06, + 5.55310462302e-06, + 5.56036971588e-06, + 5.56718003331e-06, + 5.57352973929e-06, + 5.5794130478e-06, + 5.58482422675e-06, + 5.58975760201e-06, + 5.59420756197e-06, + 5.59816856138e-06, + 5.60163512542e-06, + 5.60460185361e-06, + 5.60706342467e-06, + 5.60901460001e-06, + 5.61045022829e-06, + 5.61136524935e-06, + 5.61175469893e-06, + 5.61161371182e-06, + 5.61093752682e-06, + 5.60972149077e-06, + 5.60796106275e-06, + 5.60565181762e-06, + 5.60278945039e-06, + 5.59936978106e-06, + 5.59538875766e-06, + 5.59084246099e-06, + 5.58572710763e-06, + 5.5800390556e-06, + 5.57377480637e-06, + 5.5669310105e-06, + 5.55950447012e-06, + 5.55149214343e-06, + 5.54289114907e-06, + 5.53369876799e-06, + 5.52391244901e-06, + 5.51352981193e-06, + 5.50254865039e-06, + 5.49096693614e-06, + 5.47878282231e-06, + 5.46599464635e-06, + 5.45260093388e-06, + 5.43860040214e-06, + 5.42399196202e-06, + 5.40877472233e-06, + 5.3929479924e-06, + 5.37651128485e-06, + 5.35946431801e-06, + 5.34180701983e-06, + 5.32353952998e-06, + 5.3046622015e-06, + 5.28517560472e-06, + 5.26508052889e-06, + 5.24437798455e-06, + 5.22306920492e-06, + 5.2011556495e-06, + 5.17863900507e-06, + 5.15552118718e-06, + 5.13180434225e-06, + 5.10749084959e-06, + 5.08258332188e-06, + 5.05708460763e-06, + 5.03099779137e-06, + 5.00432619455e-06, + 4.97707337821e-06, + 4.94924314232e-06, + 4.92083952564e-06, + 4.89186680863e-06, + 4.86232951225e-06, + 4.83223239811e-06, + 4.80158046934e-06, + 4.77037896984e-06, + 4.73863338446e-06, + 4.70634943894e-06, + 4.67353309852e-06, + 4.64019056778e-06, + 4.60632828969e-06, + 4.57195294545e-06, + 4.5370714522e-06, + 4.50169096133e-06, + 4.46581885905e-06, + 4.42946276313e-06, + 4.39263052121e-06, + 4.35533020893e-06, + 4.31757012809e-06, + 4.27935880465e-06, + 4.24070498539e-06, + 4.20161763548e-06, + 4.16210593612e-06, + 4.1221792817e-06, + 4.08184727518e-06, + 4.04111972652e-06, + 4.00000664791e-06, + 3.95851825141e-06, + 3.91666494381e-06, + 3.87445732253e-06, + 3.83190617292e-06, + 3.78902246279e-06, + 3.74581733764e-06, + 3.70230211622e-06, + 3.65848828687e-06, + 3.61438750041e-06, + 3.57001156648e-06, + 3.52537244708e-06, + 3.48048225252e-06, + 3.43535323444e-06, + 3.38999778027e-06, + 3.34442840721e-06, + 3.29865775706e-06, + 3.2526985887e-06, + 3.20656377217e-06, + 3.16026628122e-06, + 3.11381918894e-06, + 3.06723565846e-06, + 3.02052893708e-06, + 2.9737123487e-06, + 2.92679928793e-06, + 2.87980321134e-06, + 2.83273763002e-06, + 2.78561610234e-06, + 2.73845222698e-06, + 2.69125963503e-06, + 2.6440519808e-06, + 2.59684293513e-06, + 2.54964617719e-06, + 2.50247538724e-06, + 2.45534423737e-06, + 2.40826638154e-06, + 2.36125545283e-06, + 2.31432504971e-06, + 2.26748873e-06, + 2.22076000322e-06, + 2.1741523214e-06, + 2.12767907104e-06, + 2.08135356417e-06, + 2.03518903108e-06, + 1.9891986115e-06, + 1.94339534676e-06, + 1.89779217175e-06, + 1.85240190576e-06, + 1.80723724574e-06, + 1.76231075888e-06, + 1.71763487289e-06, + 1.67322186928e-06, + 1.62908387702e-06, + 1.58523286387e-06, + 1.54168062871e-06, + 1.49843879582e-06, + 1.45551880804e-06, + 1.41293191935e-06, + 1.37068918848e-06, + 1.32880147319e-06, + 1.28727942517e-06, + 1.24613348351e-06, + 1.20537386927e-06, + 1.16501058112e-06, + 1.12505339089e-06, + 1.08551184042e-06, + 1.04639523513e-06, + 1.00771264222e-06, + 9.69472889079e-07, + 9.31684559169e-07, + 8.94355989711e-07, + 8.57495271789e-07, + 8.2111024946e-07, + 7.85208518428e-07, + 7.49797427368e-07, + 7.14884077935e-07, + 6.80475327974e-07, + 6.46577792973e-07, + 6.13197849497e-07, + 5.80341637857e-07, + 5.48015069546e-07, + 5.16223831126e-07, + 4.84973390669e-07, + 4.54269004968e-07, + 4.24115729758e-07, + 3.94518427593e-07, + 3.65481778064e-07, + 3.37010289786e-07, + 3.09108314389e-07, + 2.8178005862e-07, + 2.55029599661e-07, + 2.28860901785e-07, + 2.03277834787e-07, + 1.78284191188e-07, + 1.53883706666e-07, + 1.30080081484e-07, + 1.06877001249e-07, + 8.42781580079e-08, + 6.22872755596e-08, + 4.09081096775e-08, + 2.01444375625e-08, + 0.0, +]; diff --git a/examples/synth/trash/old/oscillator.rs b/examples/synth/trash/old/oscillator.rs new file mode 100644 index 0000000..7a118ff --- /dev/null +++ b/examples/synth/trash/old/oscillator.rs @@ -0,0 +1,127 @@ +// This file is for the Oscillator struct, which implements the rodio source trait. + +use rodio::source::Source; +use std::f32::consts::PI; + +use super::osc::AnalogOsc; + +const SAMPLE_RATE: u32 = 48000; // The sample rate of the audio in Hz. + +// The wave type of the oscillator +#[derive(Clone, Debug)] +enum WaveType { + Sine, + Square, + Sawtooth, + Triangle, +} + +#[derive(Clone, Debug)] +pub struct Oscillator { + freq: f32, + num_sample: usize, // The number of samples that have been played + wave_type: WaveType, + osc: AnalogOsc, +} + +// Allow dead code is used because main.rs doesn't use all of the wave types, just one of them +// Without this, the compiler would complain about unused code. +impl Oscillator { + #[allow(dead_code)] + pub fn sine_wave(freq: f32) -> Oscillator { + + let mut osc = AnalogOsc::new(); + osc.set_sample_rate(SAMPLE_RATE as usize); + + // Create a new sine wave oscillator + Oscillator { + freq, + num_sample: 0, + wave_type: WaveType::Sine, + osc + } + } + + #[allow(dead_code)] + pub fn square_wave(freq: f32) -> Oscillator { + + let mut osc = AnalogOsc::new(); + osc.set_sample_rate(SAMPLE_RATE as usize); + + // Create a new square wave oscillator + Oscillator { + freq, + num_sample: 0, + wave_type: WaveType::Square, + osc + } + } + + #[allow(dead_code)] + pub fn sawtooth_wave(freq: f32) -> Oscillator { + + let mut osc = AnalogOsc::new(); + osc.set_sample_rate(SAMPLE_RATE as usize); + + // Create a new sawtooth wave oscillator + Oscillator { + freq, + num_sample: 0, + wave_type: WaveType::Sawtooth, + osc + } + } + + #[allow(dead_code)] + pub fn triangle_wave(freq: f32) -> Oscillator { + + let mut osc = AnalogOsc::new(); + osc.set_sample_rate(SAMPLE_RATE as usize); + + // Create a new triangle wave oscillator + Oscillator { + freq, + num_sample: 0, + wave_type: WaveType::Triangle, + osc + } + } +} + +// Rodio requires that Iterator is implemented +// The next function is called every time a new sample is needed +impl Iterator for Oscillator { + type Item = f32; + + fn next(&mut self) -> Option { + self.num_sample = self.num_sample.wrapping_add(1); + + let t = self.num_sample as f32 / SAMPLE_RATE as f32; // Time + let value = 2.0 * PI * self.freq * t; + + match self.wave_type { + WaveType::Sine => Some(value.sin()), // Sine wave, no anti-aliasing needed + WaveType::Square => Some(self.osc.tick_square(self.freq, 0.0, 0.0)), + WaveType::Sawtooth => Some(self.osc.tick_saw(self.freq, 0.0, 0.0)), + WaveType::Triangle => Some(value.sin().asin()), // The arcsine of the sine wave makes it a triangle wave. The MinBLEP AA method doesn't support triangle waves. + } + } +} + +impl Source for Oscillator { + fn current_frame_len(&self) -> Option { + None + } + + fn channels(&self) -> u16 { + 1 // Mono, not stereo + } + + fn sample_rate(&self) -> u32 { + SAMPLE_RATE + } + + fn total_duration(&self) -> Option { + None // Will continue indefinitely until stopped + } +} From 6c9700f5a951de907fc74d5b0fd051de37c39c08 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 12:17:02 +0100 Subject: [PATCH 08/18] synth --- examples/synth/src/main.rs | 2 +- examples/synth/src/midi_keyboard.rs | 278 ++++++++++++---------------- examples/synth/src/synth/mod.rs | 2 +- 3 files changed, 120 insertions(+), 162 deletions(-) diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index 493a4df..0c42b44 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -22,7 +22,7 @@ fn main() { // Create and configure the MIDI keyboard MidiKeyboard::new() - .num_keys(25) + .num_keys(127) .start_octave(4) .max_simultaneous_keys(5) .on_note_begin(move |event| { diff --git a/examples/synth/src/midi_keyboard.rs b/examples/synth/src/midi_keyboard.rs index 371e16b..3837540 100644 --- a/examples/synth/src/midi_keyboard.rs +++ b/examples/synth/src/midi_keyboard.rs @@ -114,60 +114,14 @@ impl MidiNote { /// /// # Arguments /// * `note` - The type of note (C, C#, D, etc.) - /// * `octave` - The octave number (0-10) + /// * `octave` - The octave number /// /// # Returns /// A new MidiNote instance pub fn new(note: MidiNoteKind, octave: u8) -> Self { - assert!(octave <= 10, "Octave must be between 0 and 10"); - Self { note, octave } } - /// Returns the MIDI note one octave lower - pub fn lower_octave(&self) -> Self { - Self { - note: self.note, - octave: self.octave.saturating_sub(1), - } - } - - /// Returns the MIDI note one octave higher - pub fn higher_octave(&self) -> Self { - Self { - note: self.note, - octave: (self.octave + 1).min(10), - } - } - - /// Returns the MIDI note one semitone lower - pub fn lower_semitone(&self) -> Self { - match self.note { - MidiNoteKind::C => Self { - note: MidiNoteKind::B, - octave: self.octave.saturating_sub(1), - }, - _ => Self { - note: MidiNoteKind::try_from(self.note as MidiNoteId - 1).unwrap(), - octave: self.octave, - }, - } - } - - /// Returns the MIDI note one semitone higher - pub fn higher_semitone(&self) -> Self { - match self.note { - MidiNoteKind::B => Self { - note: MidiNoteKind::C, - octave: (self.octave + 1).min(10), - }, - _ => Self { - note: MidiNoteKind::try_from(self.note as MidiNoteId + 1).unwrap(), - octave: self.octave, - }, - } - } - /// Calculates the audio frequency of the MIDI note in Hz pub fn frequency(&self) -> MidiFrequency { 440.0 * f32::powf(2.0, (self.id() as f32 - 69.0) / 12.0) @@ -440,85 +394,90 @@ impl MidiKeyboard { move || MidiKeyboardState::new(config.clone()), |s, _| { canvas(move |cx, rect, vger| { + // Pre-calculate commonly used values let total_white_keys = cx[s].num_white_keys(); let white_key_width = rect.width() / total_white_keys as f32; let key_height = rect.height(); let black_key_height = key_height * 0.6; - let mut hovered_key_idx: Option = None; - - // Calculate hovered key - if let Some(mouse_position) = cx[s].mouse_position { - for (index, (x, width, is_black_key)) in - cx[s].keyboard_layout.iter().enumerate() - { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - let key_y = if *is_black_key { - key_height - black_key_height - } else { - 0.0 - }; - let key_height_check = if *is_black_key { - black_key_height - } else { - key_height - }; - - if mouse_position.x >= key_x - && mouse_position.x <= key_x + key_width - && mouse_position.y >= key_y - && mouse_position.y <= key_y + key_height_check - { - // Prioritize black keys (they're rendered on top) - if *is_black_key { - hovered_key_idx = Some(index as MidiNoteId); - break; - } else if hovered_key_idx.is_none() { - hovered_key_idx = Some(index as MidiNoteId); - } - } - } - } - - // Draw white keys first (underneath) - for (index, (x, width, is_black_key)) in - cx[s].keyboard_layout.iter().enumerate() - { - if !is_black_key { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - - Self::draw_white_key( - vger, - key_x, - 0.0, - key_width, - key_height, - cx[s].keys[index].is_some(), - hovered_key_idx == Some(index as MidiNoteId), - ); - } + // Create paint indices once for reuse + let white_paint = vger.color_paint(vger::Color::new(1.0, 1.0, 1.0, 1.0)); + let white_held_paint = vger.color_paint(vger::Color::new(0.8, 0.8, 0.8, 1.0)); + let white_hover_paint = + vger.color_paint(vger::Color::new(0.85, 0.85, 0.85, 1.0)); + let black_paint = vger.color_paint(vger::Color::new(0.1, 0.1, 0.1, 1.0)); + let black_held_paint = vger.color_paint(vger::Color::new(0.3, 0.3, 0.3, 1.0)); + let black_hover_paint = vger.color_paint(vger::Color::new(0.2, 0.2, 0.2, 1.0)); + + // Calculate hovered key using binary search for mouse position + let hovered_key_idx = if let Some(mouse_position) = cx[s].mouse_position { + Self::find_hovered_key( + &cx[s].keyboard_layout, + mouse_position, + white_key_width, + key_height, + black_key_height, + ) + } else { + None + }; + + // Batch render white keys + let white_keys: Vec<_> = cx[s] + .keyboard_layout + .iter() + .enumerate() + .filter(|(_, (_, _, is_black))| !is_black) + .collect(); + + for (index, (x, width, _)) in white_keys { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + let is_held = cx[s].keys[index].is_some(); + let is_hovered = hovered_key_idx == Some(index as MidiNoteId); + + let paint = if is_held { + white_held_paint + } else if is_hovered { + white_hover_paint + } else { + white_paint + }; + + let rect = LocalRect::new( + LocalPoint::new(key_x, 0.0), + LocalSize::new(key_width, key_height), + ); + vger.fill_rect(rect, 0.0, paint); } - // Draw black keys on top - for (index, (x, width, is_black_key)) in - cx[s].keyboard_layout.iter().enumerate() - { - if *is_black_key { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - - Self::draw_black_key( - vger, - key_x, - key_height - black_key_height, - key_width, - black_key_height, - cx[s].keys[index].is_some(), - hovered_key_idx == Some(index as MidiNoteId), - ); - } + // Batch render black keys + let black_keys: Vec<_> = cx[s] + .keyboard_layout + .iter() + .enumerate() + .filter(|(_, (_, _, is_black))| *is_black) + .collect(); + + for (index, (x, width, _)) in black_keys { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + let is_held = cx[s].keys[index].is_some(); + let is_hovered = hovered_key_idx == Some(index as MidiNoteId); + + let paint = if is_held { + black_held_paint + } else if is_hovered { + black_hover_paint + } else { + black_paint + }; + + let rect = LocalRect::new( + LocalPoint::new(key_x, key_height - black_key_height), + LocalSize::new(key_width, black_key_height), + ); + vger.fill_rect(rect, 0.1 * key_width, paint); } cx[s].hovered_key = hovered_key_idx; @@ -569,48 +528,47 @@ impl MidiKeyboard { ) } - // Draw methods remain the same as in the original implementation - fn draw_white_key( - vger: &mut Vger, - x: f32, - y: f32, - width: f32, - height: f32, - held: bool, - hovered: bool, - ) { - let color = if held { - vger::Color::new(0.8, 0.8, 0.8, 1.0) - } else if hovered { - vger::Color::new(0.85, 0.85, 0.85, 1.0) - } else { - vger::Color::new(1.0, 1.0, 1.0, 1.0) // Pure white for more realistic look - }; - let paint_index = vger.color_paint(color); - let rect = LocalRect::new(LocalPoint::new(x, y), LocalSize::new(width, height)); + fn find_hovered_key( + keyboard_layout: &[(f32, f32, bool)], + mouse_position: LocalPoint, + white_key_width: f32, + key_height: f32, + black_key_height: f32, + ) -> Option { + // First check black keys (they're on top) + let black_key = keyboard_layout + .iter() + .enumerate() + .filter(|(_, (_, _, is_black))| *is_black) + .find(|(_, (x, width, _))| { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + let key_y = key_height - black_key_height; + + mouse_position.x >= key_x + && mouse_position.x <= key_x + key_width + && mouse_position.y >= key_y + && mouse_position.y <= key_y + black_key_height + }) + .map(|(index, _)| index as MidiNoteId); - vger.fill_rect(rect, 0.0, paint_index); - } + if black_key.is_some() { + return black_key; + } - fn draw_black_key( - vger: &mut Vger, - x: f32, - y: f32, - width: f32, - height: f32, - held: bool, - hovered: bool, - ) { - let base_color = vger::Color::new(0.1, 0.1, 0.1, 1.0); - let color = if held { - vger::Color::new(0.3, 0.3, 0.3, 1.0) - } else if hovered { - vger::Color::new(0.2, 0.2, 0.2, 1.0) - } else { - base_color - }; - let paint_index = vger.color_paint(color); - let rect = LocalRect::new(LocalPoint::new(x, y), LocalSize::new(width, height)); - vger.fill_rect(rect, 0.1 * width, paint_index); // Add rounded corners + keyboard_layout + .iter() + .enumerate() + .filter(|(_, (_, _, is_black))| !is_black) + .find(|(_, (x, width, _))| { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + + mouse_position.x >= key_x + && mouse_position.x <= key_x + key_width + && mouse_position.y >= 0.0 + && mouse_position.y <= key_height + }) + .map(|(index, _)| index as MidiNoteId) } } diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs index 742c2a0..4d80252 100644 --- a/examples/synth/src/synth/mod.rs +++ b/examples/synth/src/synth/mod.rs @@ -56,7 +56,7 @@ impl Synth { let sink = Sink::try_new(&self.stream_handle).expect("Failed to create sink"); sink.append(audio_source); - let envelope = Envelope::new(0.7, 0.2, 0.7, 1.3); // example envelope + let envelope = Envelope::new(0.1, 0.2, 0.7, 1.3); // example envelope let envelope_state = EnvelopeState { envelope, start_time: Instant::now(), From a8d20c0408e1246b81dacaefcab346f11dea26ce Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 12:21:01 +0100 Subject: [PATCH 09/18] synth --- examples/synth/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index 0c42b44..493a4df 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -22,7 +22,7 @@ fn main() { // Create and configure the MIDI keyboard MidiKeyboard::new() - .num_keys(127) + .num_keys(25) .start_octave(4) .max_simultaneous_keys(5) .on_note_begin(move |event| { From b01fe6d6a041485740503da1804858c778eeb862 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 12:30:26 +0100 Subject: [PATCH 10/18] synth --- examples/synth/src/synth/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs index 4d80252..a5c502c 100644 --- a/examples/synth/src/synth/mod.rs +++ b/examples/synth/src/synth/mod.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::time::Instant; +use std::time::{Duration, Instant}; use rodio::source::Source; use rodio::Sink; From 2ece81b219c6143b94ca25c5cc535b0d4c155d82 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 13:46:37 +0100 Subject: [PATCH 11/18] synth --- examples/synth/Cargo.toml | 8 +- examples/synth/src/midi_keyboard.rs | 42 +- examples/synth/trash/new/envelope.rs | 230 - examples/synth/trash/new/main.rs | 86 - examples/synth/trash/new/midi_keyboard.rs | 629 -- examples/synth/trash/new/oscillator.rs | 285 - examples/synth/trash/new/synth.rs | 214 - examples/synth/trash/old/osc.rs | 8416 --------------------- examples/synth/trash/old/oscillator.rs | 127 - 9 files changed, 28 insertions(+), 10009 deletions(-) delete mode 100644 examples/synth/trash/new/envelope.rs delete mode 100644 examples/synth/trash/new/main.rs delete mode 100644 examples/synth/trash/new/midi_keyboard.rs delete mode 100644 examples/synth/trash/new/oscillator.rs delete mode 100644 examples/synth/trash/new/synth.rs delete mode 100644 examples/synth/trash/old/osc.rs delete mode 100644 examples/synth/trash/old/oscillator.rs diff --git a/examples/synth/Cargo.toml b/examples/synth/Cargo.toml index 83c6211..6e94728 100644 --- a/examples/synth/Cargo.toml +++ b/examples/synth/Cargo.toml @@ -6,6 +6,8 @@ publish = false [dependencies] rui = { workspace = true } -palette = "0.7.6" -enterpolation = "0.2" -rodio = { version = "0.20.1", default-features = false, features = ["symphonia-all"] } +# palette = "0.7.6" +# enterpolation = "0.2" +rodio = { version = "0.20.1", default-features = false, features = [ + "symphonia-all", +] } diff --git a/examples/synth/src/midi_keyboard.rs b/examples/synth/src/midi_keyboard.rs index 3837540..3a2d6a5 100644 --- a/examples/synth/src/midi_keyboard.rs +++ b/examples/synth/src/midi_keyboard.rs @@ -239,6 +239,7 @@ struct MidiKeyboardState { mouse_position: Option, mouse_dragging: bool, hovered_key: Option, + current_drag_key: Option, } impl MidiKeyboardState { @@ -253,6 +254,7 @@ impl MidiKeyboardState { mouse_position: None, mouse_dragging: false, hovered_key: None, + current_drag_key: None, } } @@ -482,40 +484,42 @@ impl MidiKeyboard { cx[s].hovered_key = hovered_key_idx; }) - .drag_p(move |cx, local_position, gesture_state, mouse_button| { - match gesture_state { + .drag_p( + move |cx, local_position, gesture_state, mouse_button| match gesture_state { GestureState::Began => { if mouse_button == Some(MouseButton::Left) { cx[s].mouse_dragging = true; + cx[s].current_drag_key = cx[s].hovered_key; + if let Some(current_drag_key) = cx[s].current_drag_key { + let default_velocity = cx[s].config.default_velocity; + let _ = cx[s].press_key(current_drag_key, default_velocity); + } } } GestureState::Changed => { if cx[s].mouse_position.is_some() { cx[s].mouse_position = Some(local_position); + if cx[s].current_drag_key != cx[s].hovered_key { + if let Some(preview_drag_key) = cx[s].current_drag_key { + let _ = cx[s].release_key(preview_drag_key); + } + cx[s].current_drag_key = cx[s].hovered_key; + if let Some(current_drag_key) = cx[s].current_drag_key { + let default_velocity = cx[s].config.default_velocity; + let _ = cx[s].press_key(current_drag_key, default_velocity); + } + } } } GestureState::Ended => { cx[s].mouse_dragging = false; + cx[s].current_drag_key = None; + cx[s].release_not_pressed_keys(); } #[allow(unreachable_patterns)] _ => (), - } - - // Update key states - if let Some(hovered_key) = cx[s].hovered_key { - if cx[s].mouse_dragging { - if !cx[s].pressed_keys.contains(&hovered_key) { - let default_velocity = cx[s].config.default_velocity; - let _ = cx[s].press_key(hovered_key, default_velocity); - } - } else { - if cx[s].pressed_keys.contains(&hovered_key) { - let _ = cx[s].release_key(hovered_key); - } - } - } - cx[s].release_not_pressed_keys(); - }) + }, + ) .hover_p(move |cx, hover_position| { cx[s].mouse_position = Some(hover_position); }) diff --git a/examples/synth/trash/new/envelope.rs b/examples/synth/trash/new/envelope.rs deleted file mode 100644 index dac5222..0000000 --- a/examples/synth/trash/new/envelope.rs +++ /dev/null @@ -1,230 +0,0 @@ -use std::cell::Cell; -use std::time::{Duration, Instant}; - -/// Configuration for a standard ADSR (Attack, Decay, Sustain, Release) envelope -#[derive(Clone, Debug)] -pub struct ADSREnvelopeConfig { - attack: Duration, - decay: Duration, - sustain_level: f32, - release: Duration, -} - -impl ADSREnvelopeConfig { - pub fn builder() -> ADSREnvelopeConfigBuilder { - ADSREnvelopeConfigBuilder::new() - } -} - -/// Builder for creating flexible ADSR envelope configurations -pub struct ADSREnvelopeConfigBuilder { - attack: Option, - decay: Option, - sustain_level: Option, - release: Option, -} - -impl ADSREnvelopeConfigBuilder { - fn new() -> Self { - Self { - attack: None, - decay: None, - sustain_level: None, - release: None, - } - } - - pub fn attack(mut self, duration: Duration) -> Self { - self.attack = Some(duration); - self - } - - pub fn decay(mut self, duration: Duration) -> Self { - self.decay = Some(duration); - self - } - - pub fn sustain(mut self, level: f32) -> Self { - self.sustain_level = Some(level.clamp(0.0, 1.0)); - self - } - - pub fn release(mut self, duration: Duration) -> Self { - self.release = Some(duration); - self - } - - pub fn build(self) -> Result { - Ok(ADSREnvelopeConfig { - attack: self.attack.unwrap_or(Duration::from_millis(50)), - decay: self.decay.unwrap_or(Duration::from_millis(100)), - sustain_level: self.sustain_level.unwrap_or(0.7), - release: self.release.unwrap_or(Duration::from_millis(200)), - }) - } -} - -/// Concrete implementation of an ADSR envelope -pub struct ADSREnvelope { - config: ADSREnvelopeConfig, - start_time: Cell>, - release_start_time: Cell>, - release_start_amplitude: Cell, -} - -impl ADSREnvelope { - pub fn new(config: ADSREnvelopeConfig) -> Self { - Self { - config, - start_time: Cell::new(None), - release_start_time: Cell::new(None), - release_start_amplitude: Cell::new(0.0), - } - } - - pub fn start(&self) { - self.start_time.set(None); - self.release_start_time.set(None); - self.release_start_amplitude.set(0.0); - } - - pub fn release(&self) { - if self.start_time.get().is_some() && self.release_start_time.get().is_none() { - let now = Instant::now(); - self.release_start_time.set(Some(now)); - self.release_start_amplitude - .set(self.get_amplitude_internal(now, false)); - } - } - - pub fn get_amplitude(&self, now: Instant) -> f32 { - self.get_amplitude_internal(now, true) - } - - fn get_amplitude_internal(&self, now: Instant, clamp: bool) -> f32 { - // Set start_time if not set - let start_time = match self.start_time.get() { - Some(st) => st, - None => { - self.start_time.set(Some(now)); - return 0.0; - } - }; - - let elapsed = now.duration_since(start_time); - - // Determine if in release phase - let is_releasing = self.release_start_time.get().is_some(); - - match (elapsed, is_releasing) { - // Attack phase: Linear ramp from 0 to 1 - (t, false) if t < self.config.attack => { - let amp = t.as_secs_f32() / self.config.attack.as_secs_f32(); - if clamp { - amp.clamp(0.0, 1.0) - } else { - amp - } - } - - // Decay phase: Linear ramp from 1 to sustain level - (t, false) if t < self.config.attack + self.config.decay => { - let decay_progress = - (t - self.config.attack).as_secs_f32() / self.config.decay.as_secs_f32(); - let amp = 1.0 - decay_progress * (1.0 - self.config.sustain_level); - if clamp { - amp.clamp(self.config.sustain_level, 1.0) - } else { - amp - } - } - - // Release phase: Linear ramp from current amplitude to 0 - (_, true) => { - let Some(release_start) = self.release_start_time.get() else { - return self.config.sustain_level; - }; - - let release_time = now.duration_since(release_start); - let release_progress = - release_time.as_secs_f32() / self.config.release.as_secs_f32(); - let amp = self.release_start_amplitude.get() * (1.0 - release_progress); - if clamp { - amp.clamp(0.0, self.release_start_amplitude.get()) - } else { - amp - } - } - - // Sustain phase - _ => self.config.sustain_level, - } - } - - pub fn is_finished(&self, now: Instant) -> bool { - match (self.start_time.get(), self.release_start_time.get()) { - (Some(_), Some(release_start)) => { - now.duration_since(release_start) >= self.config.release - } - _ => false, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_adsr_envelope() { - let config = ADSREnvelopeConfig::builder() - .attack(Duration::from_millis(100)) - .decay(Duration::from_millis(50)) - .sustain(0.5) - .release(Duration::from_millis(100)) - .build() - .unwrap(); - - let envelope = ADSREnvelope::new(config); - - // Start the envelope - envelope.start(); - - // Check amplitude immediately after start (should be near 0.0) - let start = Instant::now(); - let initial_amplitude = envelope.get_amplitude(start); - assert!( - initial_amplitude < 1e-5, - "Initial amplitude should be near 0.0, got {}", - initial_amplitude - ); - - // Simulate partial attack phase - let mid_attack = start + Duration::from_millis(50); - let amplitude = envelope.get_amplitude(mid_attack); - assert!( - amplitude > 0.0 && amplitude < 1.0, - "Amplitude during attack should be between 0 and 1" - ); - - // Simulate full attack phase completion - let end_attack = start + Duration::from_millis(100); - let amplitude = envelope.get_amplitude(end_attack); - assert!( - (amplitude - 1.0).abs() < 1e-5, - "Amplitude at end of attack should be approximately 1.0, got {}", - amplitude - ); - - // Test release during decay phase - let mid_decay = start + Duration::from_millis(125); - envelope.release(); - let release_start = envelope.release_start_time.get().unwrap(); - let release_progress = mid_decay.duration_since(release_start); - let amplitude = envelope.get_amplitude(mid_decay); - assert!( - amplitude < 1.0 && amplitude > 0.0, - "Amplitude should start from current level and release" - ); - } -} diff --git a/examples/synth/trash/new/main.rs b/examples/synth/trash/new/main.rs deleted file mode 100644 index 6c83228..0000000 --- a/examples/synth/trash/new/main.rs +++ /dev/null @@ -1,86 +0,0 @@ -use std::sync::{Arc, Mutex}; -use std::time::Duration; - -use rodio::OutputStream; - -mod envelope; -mod midi_keyboard; -mod oscillator; -mod synth; - -use envelope::ADSREnvelopeConfig; -use midi_keyboard::{MidiFrequency, MidiKeyboard, MidiNoteId}; -use oscillator::Oscillator; -use synth::Synth; - -use rui::Run; - -fn main() { - // Create the audio output stream - let (_stream, stream_handle) = - OutputStream::try_default().expect("Failed to create output stream"); - - // Create a custom envelope configuration - let custom_envelope = ADSREnvelopeConfig::builder() - .attack(Duration::from_millis(1000)) - .decay(Duration::from_millis(100)) - .sustain(0.6) - .release(Duration::from_millis(1000)) - .build() - .expect("Failed to create envelope configuration"); - - // Initialize the advanced synthesizer with custom default envelope - let synth = Arc::new(Mutex::new(Synth::new(stream_handle, Some(custom_envelope)))); - - // Clone synthesizer references for different threads - let synth_update = synth.clone(); - let synth_note_begin = synth.clone(); - let synth_note_end = synth.clone(); - - // Spawn a dedicated thread for continuous synth updates - std::thread::spawn(move || { - loop { - synth_update.lock().unwrap().update(); - // std::thread::sleep(Duration::from_millis(1)); // Prevent tight spinning - } - }); - - // Configure MIDI keyboard - MidiKeyboard::new() - .num_keys(25) - .start_octave(4) - .max_simultaneous_keys(5) - .on_note_begin(move |event| { - let note = event.note; - let mut synth = synth_note_begin.lock().unwrap(); - - // Get the frequency of the pressed note - let frequency: MidiFrequency = note.frequency(); - - // Create an audio source with a sawtooth wave - let audio_source = Oscillator::sine(frequency); - - // Get the note ID - let source_id: MidiNoteId = note.id(); - - // Play the source with optional custom envelope - if let Err(e) = synth.play_source( - Box::new(audio_source), - source_id, - None, // Use default envelope - ) { - eprintln!("Failed to play source: {}", e); - } - }) - .on_note_end(move |event| { - let note = event.note; - let mut synth = synth_note_end.lock().unwrap(); - let source_id: MidiNoteId = note.id(); - - if let Err(e) = synth.release_source(source_id) { - eprintln!("Failed to release source: {}", e); - } - }) - .show() - .run(); -} diff --git a/examples/synth/trash/new/midi_keyboard.rs b/examples/synth/trash/new/midi_keyboard.rs deleted file mode 100644 index 025762c..0000000 --- a/examples/synth/trash/new/midi_keyboard.rs +++ /dev/null @@ -1,629 +0,0 @@ -use core::f32; -use std::collections::HashSet; -use std::convert::TryFrom; -use std::sync::Arc; -use std::time::Instant; - -use rui::*; - -/// Type alias for MIDI note identifiers (0-127) -pub type MidiNoteId = u8; - -/// Type alias for MIDI note frequencies in Hz -pub type MidiFrequency = f32; - -/// Represents a MIDI note type (C, C#, D, etc.) without octave information -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum MidiNoteKind { - C, - CSharp, - D, - DSharp, - E, - F, - FSharp, - G, - GSharp, - A, - ASharp, - B, -} - -/// Extension methods for MIDI note conversion and manipulation -#[allow(dead_code)] -pub trait MidiNoteIdMethods { - /// Converts a MIDI note ID to a complete MIDI note with note type and octave - fn as_note(&self) -> MidiNote; - - /// Extracts the note type from a MIDI note ID - fn as_note_kind(&self) -> MidiNoteKind; - - /// Calculates the frequency in Hz for the given MIDI note ID - fn as_frequency(&self) -> MidiFrequency; -} - -impl MidiNoteIdMethods for MidiNoteId { - fn as_note(&self) -> MidiNote { - let note = MidiNoteKind::try_from(*self % 12).unwrap(); - let octave = *self / 12; - MidiNote::new(note, octave) - } - - fn as_note_kind(&self) -> MidiNoteKind { - self.as_note().note - } - - fn as_frequency(&self) -> MidiFrequency { - self.as_note().frequency() - } -} - -impl MidiNoteKind { - /// Converts the MIDI note type to its corresponding MIDI note identifier - pub fn to_midi_note_id(&self) -> MidiNoteId { - match self { - MidiNoteKind::C => 0, - MidiNoteKind::CSharp => 1, - MidiNoteKind::D => 2, - MidiNoteKind::DSharp => 3, - MidiNoteKind::E => 4, - MidiNoteKind::F => 5, - MidiNoteKind::FSharp => 6, - MidiNoteKind::G => 7, - MidiNoteKind::GSharp => 8, - MidiNoteKind::A => 9, - MidiNoteKind::ASharp => 10, - MidiNoteKind::B => 11, - } - } -} - -impl TryFrom for MidiNoteKind { - type Error = (); - - fn try_from(value: MidiNoteId) -> Result { - match value % 12 { - 0 => Ok(MidiNoteKind::C), - 1 => Ok(MidiNoteKind::CSharp), - 2 => Ok(MidiNoteKind::D), - 3 => Ok(MidiNoteKind::DSharp), - 4 => Ok(MidiNoteKind::E), - 5 => Ok(MidiNoteKind::F), - 6 => Ok(MidiNoteKind::FSharp), - 7 => Ok(MidiNoteKind::G), - 8 => Ok(MidiNoteKind::GSharp), - 9 => Ok(MidiNoteKind::A), - 10 => Ok(MidiNoteKind::ASharp), - 11 => Ok(MidiNoteKind::B), - _ => Err(()), - } - } -} - -/// Represents a complete MIDI note combining note type and octave -#[derive(Clone, Copy, Debug, PartialEq)] -pub struct MidiNote { - /// The type of note (C, C#, D, etc.) - pub note: MidiNoteKind, - /// The octave number (0-10, where 4 contains middle C) - pub octave: u8, -} - -impl MidiNote { - /// Creates a new MIDI note with the specified note type and octave - /// - /// # Arguments - /// * `note` - The type of note (C, C#, D, etc.) - /// * `octave` - The octave number (0-10) - /// - /// # Returns - /// A new MidiNote instance - pub fn new(note: MidiNoteKind, octave: u8) -> Self { - assert!(octave <= 10, "Octave must be between 0 and 10"); - - Self { note, octave } - } - - /// Returns the MIDI note one octave lower - pub fn lower_octave(&self) -> Self { - Self { - note: self.note, - octave: self.octave.saturating_sub(1), - } - } - - /// Returns the MIDI note one octave higher - pub fn higher_octave(&self) -> Self { - Self { - note: self.note, - octave: (self.octave + 1).min(10), - } - } - - /// Returns the MIDI note one semitone lower - pub fn lower_semitone(&self) -> Self { - match self.note { - MidiNoteKind::C => Self { - note: MidiNoteKind::B, - octave: self.octave.saturating_sub(1), - }, - _ => Self { - note: MidiNoteKind::try_from(self.note as MidiNoteId - 1).unwrap(), - octave: self.octave, - }, - } - } - - /// Returns the MIDI note one semitone higher - pub fn higher_semitone(&self) -> Self { - match self.note { - MidiNoteKind::B => Self { - note: MidiNoteKind::C, - octave: (self.octave + 1).min(10), - }, - _ => Self { - note: MidiNoteKind::try_from(self.note as MidiNoteId + 1).unwrap(), - octave: self.octave, - }, - } - } - - /// Calculates the audio frequency of the MIDI note in Hz - pub fn frequency(&self) -> MidiFrequency { - 440.0 * f32::powf(2.0, (self.id() as f32 - 69.0) / 12.0) - } - - /// Returns the MIDI note identifier (0-127) - pub fn id(&self) -> MidiNoteId { - let note_id = self.note.to_midi_note_id(); - self.octave * 12 + note_id - } -} - -/// MIDI note event with velocity and timestamp -#[derive(Clone, Copy, Debug, PartialEq)] -pub struct MidiNoteEvent { - /// The MIDI note details - pub note: MidiNote, - /// Note velocity (0-127) - pub velocity: MidiNoteId, - /// Timestamp of the note event - pub timestamp: Instant, -} - -/// Configuration builder for MIDI keyboard with advanced customization options -#[derive(Clone)] -pub struct MidiKeyboardConfig { - start_octave: MidiNoteId, - num_keys: MidiNoteId, - max_simultaneous_keys: u8, - default_velocity: u8, - note_begin_handler: Option>, - note_end_handler: Option>, -} - -impl MidiKeyboardConfig { - /// Creates a new MIDI keyboard configuration with default settings - /// - /// Default configuration: - /// - Start octave: 4 (middle C) - /// - Number of keys: 25 - /// - Maximum simultaneous keys: 10 - /// - No note begin/end handlers - pub fn new() -> Self { - Self { - start_octave: 4, - num_keys: 25, - max_simultaneous_keys: 10, - default_velocity: 127, - note_begin_handler: None, - note_end_handler: None, - } - } - - /// Sets the starting octave for the keyboard - /// - /// # Arguments - /// * `octave` - Octave to start from (0-10) - pub fn start_octave(mut self, octave: MidiNoteId) -> Self { - self.start_octave = octave.clamp(0, 10); - self - } - - /// Sets the total number of keys on the keyboard - /// - /// # Arguments - /// * `keys` - Number of keys (1-88) - pub fn num_keys(mut self, keys: MidiNoteId) -> Self { - self.num_keys = keys.clamp(1, 88); - self - } - - /// Sets the maximum number of keys that can be pressed simultaneously - /// - /// # Arguments - /// * `max_keys` - Maximum number of simultaneous key presses - pub fn max_simultaneous_keys(mut self, max_keys: MidiNoteId) -> Self { - self.max_simultaneous_keys = max_keys; - self - } - - /// Sets a handler for when a note begins (key press) - /// - /// # Arguments - /// * `handler` - Callback function for note begin events - pub fn on_note_begin( - mut self, - handler: impl Fn(MidiNoteEvent) + Send + Sync + 'static, - ) -> Self { - self.note_begin_handler = Some(Arc::new(handler)); - self - } - - /// Sets a handler for when a note ends (key release) - /// - /// # Arguments - /// * `handler` - Callback function for note end events - pub fn on_note_end(mut self, handler: impl Fn(MidiNoteEvent) + Send + Sync + 'static) -> Self { - self.note_end_handler = Some(Arc::new(handler)); - self - } - - /// Renders and displays the MIDI keyboard - pub fn show(self) -> impl View { - MidiKeyboard::show(self) - } -} - -/// Keyboard state management with advanced features -struct MidiKeyboardState { - keys: Vec>, - pressed_keys: HashSet, - config: MidiKeyboardConfig, - last_interaction: Instant, - keyboard_layout: Vec<(f32, f32, bool)>, // (x, width, is_black_key) - mouse_position: Option, - mouse_dragging: bool, - hovered_key: Option, - drag_pressed_keys: HashSet, -} - -impl MidiKeyboardState { - fn new(config: MidiKeyboardConfig) -> Self { - let keyboard_layout = Self::calculate_keyboard_layout(config.num_keys); - Self { - keys: vec![None; config.num_keys as usize], - pressed_keys: HashSet::new(), - config, - last_interaction: Instant::now(), - keyboard_layout, - mouse_position: None, - mouse_dragging: false, - hovered_key: None, - drag_pressed_keys: HashSet::new(), - } - } - - fn calculate_keyboard_layout(num_keys: MidiNoteId) -> Vec<(f32, f32, bool)> { - let mut layout = Vec::new(); - let mut white_key_count = 0; - let black_key_positions = [1, 3, 6, 8, 10]; // Relative positions of black keys - - for key_pos in 0..num_keys { - let key_in_octave = key_pos % 12; - - let is_black_key = black_key_positions.contains(&key_in_octave); - let x = if is_black_key { - // Precise black key positioning - white_key_count as f32 - 0.3 - } else { - let current_white_key = white_key_count; - white_key_count += 1; - current_white_key as f32 - }; - - layout.push(( - x, - if is_black_key { 0.6 } else { 1.0 }, // Narrower black keys - is_black_key, - )); - } - - layout - } - - fn num_white_keys(&self) -> usize { - self.keyboard_layout - .iter() - .filter(|&&(_, _, is_black_key)| !is_black_key) - .count() - } - - fn press_key(&mut self, index: MidiNoteId, velocity: MidiNoteId) -> Result<(), &'static str> { - if self.pressed_keys.len() as MidiNoteId >= self.config.max_simultaneous_keys { - // Release the oldest key to make room for the new one - let oldest_key = self - .keys - .iter() - .enumerate() - .filter_map(|(idx, key)| key.map(|_| idx as MidiNoteId)) - .min_by_key(|&idx| self.keys[idx as usize].unwrap().timestamp) - .unwrap(); - - let _ = self.release_key(oldest_key); - } - - if self.pressed_keys.contains(&index) { - return Err("Key already pressed"); - } - - let note_event = MidiNoteEvent { - note: self.calculate_note_for_index(index as usize), - velocity, - timestamp: Instant::now(), - }; - - self.keys[index as usize] = Some(note_event); - self.pressed_keys.insert(index); - self.last_interaction = Instant::now(); - - if let Some(handler) = &self.config.note_begin_handler { - handler(note_event); - } - - Ok(()) - } - - fn release_key(&mut self, index: MidiNoteId) -> Result<(), &'static str> { - if let Some(note_event) = self.keys[index as usize].take() { - self.pressed_keys.remove(&index); - self.last_interaction = Instant::now(); - - if let Some(handler) = &self.config.note_end_handler { - handler(note_event); - } - - Ok(()) - } else { - Err("No active key to release") - } - } - - fn calculate_note_for_index(&self, index: usize) -> MidiNote { - let note_kind = MidiNoteKind::try_from((index % 12) as MidiNoteId).unwrap(); - let octave = self.config.start_octave + (index / 12) as MidiNoteId; - MidiNote::new(note_kind, octave) - } - - fn release_not_pressed_keys(&mut self) { - let now = Instant::now(); - let release_time = now - self.last_interaction; - - let release_keys = self - .keys - .iter() - .enumerate() - .filter_map(|(idx, key)| { - if let Some(note_event) = key { - if now - note_event.timestamp > release_time { - Some(idx as MidiNoteId) - } else { - None - } - } else { - None - } - }) - .collect::>(); - - for key in release_keys { - let _ = self.release_key(key); - } - } -} - -/// Primary MIDI keyboard implementation -pub struct MidiKeyboard; - -impl MidiKeyboard { - /// Creates a new MIDI keyboard configuration with default settings - /// - /// Equivalent to `MidiKeyboardConfig::new()` - pub fn new() -> MidiKeyboardConfig { - MidiKeyboardConfig::new() - } - - /// Renders the MIDI keyboard based on the provided configuration - /// - /// # Arguments - /// * `config` - Configuration for the MIDI keyboard - pub fn show(config: MidiKeyboardConfig) -> impl View { - state( - move || MidiKeyboardState::new(config.clone()), - |s, _| { - canvas(move |cx, rect, vger| { - let total_white_keys = cx[s].num_white_keys(); - let white_key_width = rect.width() / total_white_keys as f32; - let key_height = rect.height(); - let black_key_height = key_height * 0.6; - - let mut hovered_key_idx: Option = None; - - // Calculate hovered key - if let Some(mouse_position) = cx[s].mouse_position { - for (index, (x, width, is_black_key)) in - cx[s].keyboard_layout.iter().enumerate() - { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - let key_y = if *is_black_key { - key_height - black_key_height - } else { - 0.0 - }; - let key_height_check = if *is_black_key { - black_key_height - } else { - key_height - }; - - if mouse_position.x >= key_x - && mouse_position.x <= key_x + key_width - && mouse_position.y >= key_y - && mouse_position.y <= key_y + key_height_check - { - // Prioritize black keys (they're rendered on top) - if *is_black_key { - hovered_key_idx = Some(index as MidiNoteId); - break; - } else if hovered_key_idx.is_none() { - hovered_key_idx = Some(index as MidiNoteId); - } - } - } - } - - // Draw white keys first (underneath) - for (index, (x, width, is_black_key)) in - cx[s].keyboard_layout.iter().enumerate() - { - if !is_black_key { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - - Self::draw_white_key( - vger, - key_x, - 0.0, - key_width, - key_height, - cx[s].keys[index].is_some(), - hovered_key_idx == Some(index as MidiNoteId), - ); - } - } - - // Draw black keys on top - for (index, (x, width, is_black_key)) in - cx[s].keyboard_layout.iter().enumerate() - { - if *is_black_key { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - - Self::draw_black_key( - vger, - key_x, - key_height - black_key_height, - key_width, - black_key_height, - cx[s].keys[index].is_some(), - hovered_key_idx == Some(index as MidiNoteId), - ); - } - } - - cx[s].hovered_key = hovered_key_idx; - }) - .drag(move |cx, offset, gesture_state, mouse_button| { - match gesture_state { - GestureState::Began => { - if mouse_button == Some(MouseButton::Left) { - cx[s].mouse_dragging = true; - cx[s].drag_pressed_keys.clear(); // Reset on drag start - } - } - GestureState::Changed => { - if cx[s].mouse_position.is_some() { - cx[s].mouse_position = Some(cx[s].mouse_position.unwrap() + offset); - } - } - GestureState::Ended => { - cx[s].mouse_dragging = false; - // Release all keys pressed during this drag - let keys_to_release = cx[s].drag_pressed_keys.clone(); - keys_to_release.into_iter().for_each(|key| { - let _ = cx[s].release_key(key); - }); - cx[s].drag_pressed_keys.clear(); - } - #[allow(unreachable_patterns)] - _ => (), - } - - if let Some(hovered_key) = cx[s].hovered_key { - if cx[s].mouse_dragging { - // Check if the key is not pressed and hasn't been pressed during this drag - if !cx[s].pressed_keys.contains(&hovered_key) - && !cx[s].drag_pressed_keys.contains(&hovered_key) - { - let default_velocity = cx[s].config.default_velocity; - if let Ok(()) = cx[s].press_key(hovered_key, default_velocity) { - cx[s].drag_pressed_keys.insert(hovered_key); - } - } - } else { - if cx[s].pressed_keys.contains(&hovered_key) { - let _ = cx[s].release_key(hovered_key); - } - } - } - cx[s].release_not_pressed_keys(); - }) - .hover_p(move |cx, hover_position| { - cx[s].mouse_position = Some(hover_position); - }) - .hover(move |cx, is_hovering| { - if !is_hovering { - cx[s].mouse_position = None; - } - }) - }, - ) - } - - // Draw methods remain the same as in the original implementation - fn draw_white_key( - vger: &mut Vger, - x: f32, - y: f32, - width: f32, - height: f32, - held: bool, - hovered: bool, - ) { - let color = if held { - vger::Color::new(0.8, 0.8, 0.8, 1.0) - } else if hovered { - vger::Color::new(0.85, 0.85, 0.85, 1.0) - } else { - vger::Color::new(1.0, 1.0, 1.0, 1.0) // Pure white for more realistic look - }; - let paint_index = vger.color_paint(color); - let rect = LocalRect::new(LocalPoint::new(x, y), LocalSize::new(width, height)); - - vger.fill_rect(rect, 0.0, paint_index); - } - - fn draw_black_key( - vger: &mut Vger, - x: f32, - y: f32, - width: f32, - height: f32, - held: bool, - hovered: bool, - ) { - let base_color = vger::Color::new(0.1, 0.1, 0.1, 1.0); - let color = if held { - vger::Color::new(0.3, 0.3, 0.3, 1.0) - } else if hovered { - vger::Color::new(0.2, 0.2, 0.2, 1.0) - } else { - base_color - }; - let paint_index = vger.color_paint(color); - let rect = LocalRect::new(LocalPoint::new(x, y), LocalSize::new(width, height)); - vger.fill_rect(rect, 0.1 * width, paint_index); // Add rounded corners - } -} diff --git a/examples/synth/trash/new/oscillator.rs b/examples/synth/trash/new/oscillator.rs deleted file mode 100644 index 9e20770..0000000 --- a/examples/synth/trash/new/oscillator.rs +++ /dev/null @@ -1,285 +0,0 @@ -use std::f32::consts::PI; - -/// Represents different wave types for audio synthesis -#[derive(Clone, Debug)] -pub enum WaveType { - Sine, - Square, - Sawtooth, - Triangle, -} - -/// Configuration parameters for oscillator generation -#[derive(Clone, Debug)] -pub struct OscillatorConfig { - sample_rate: u32, - anti_aliasing: bool, - oversampling: usize, - zero_crossings: usize, - transition_start: f32, - transition_end: f32, -} - -impl Default for OscillatorConfig { - fn default() -> Self { - Self { - sample_rate: 48000, - anti_aliasing: true, - oversampling: 256, - zero_crossings: 16, - transition_start: 8000.0, - transition_end: 10000.0, - } - } -} - -impl OscillatorConfig { - /// Create a new configuration with custom parameters - pub fn new() -> Self { - Self::default() - } - - /// Set sample rate - pub fn sample_rate(mut self, rate: u32) -> Self { - self.sample_rate = rate; - self - } - - /// Enable or disable anti-aliasing - pub fn anti_aliasing(mut self, enabled: bool) -> Self { - self.anti_aliasing = enabled; - self - } - - /// Set oversampling rate - pub fn oversampling(mut self, rate: usize) -> Self { - self.oversampling = rate; - self - } - - /// Set number of zero crossings - pub fn zero_crossings(mut self, crossings: usize) -> Self { - self.zero_crossings = crossings; - self - } - - /// Set transition start frequency - pub fn transition_start(mut self, start: f32) -> Self { - self.transition_start = start; - self - } - - /// Set transition end frequency - pub fn transition_end(mut self, end: f32) -> Self { - self.transition_end = end; - self - } -} - -/// BLEP (Band-Limited Step) Table Builder -pub struct BlepTableBuilder { - oversampling: usize, - zero_crossings: usize, -} - -impl BlepTableBuilder { - /// Create a new builder with custom configuration - pub fn new() -> Self { - Self { - oversampling: 256, - zero_crossings: 16, - } - } - - /// Set the oversampling rate - pub fn oversampling(mut self, rate: usize) -> Self { - self.oversampling = rate; - self - } - - /// Set the number of zero crossings - pub fn zero_crossings(mut self, crossings: usize) -> Self { - self.zero_crossings = crossings; - self - } - - /// Generate the BLEP table with the current configuration - pub fn generate(self) -> Vec { - let blep_size = self.oversampling * self.zero_crossings * 2 + 1; - (0..blep_size) - .map(|i| { - let x = (i as f32 / blep_size as f32 - 0.5) * self.zero_crossings as f32; - if x == 0.0 { - 1.0 - } else { - x.sin() / (std::f32::consts::PI * x) - * (1.0 - (x / self.zero_crossings as f32).cos()) - } - }) - .collect() - } -} - -/// Advanced analog oscillator with high-quality wave generation -#[derive(Clone, Debug)] -pub struct AnalogOsc { - config: OscillatorConfig, - phase: f32, - nyquist: f32, - phase_increment: f32, - blep_table: Vec, -} - -impl AnalogOsc { - /// Create a new analog oscillator with custom configuration - pub fn new(config: OscillatorConfig) -> Self { - let nyquist = config.sample_rate as f32 / 2.0; - let blep_table = BlepTableBuilder::new() - .oversampling(config.oversampling) - .zero_crossings(config.zero_crossings) - .generate(); - - Self { - config, - phase: 0.0, - nyquist, - phase_increment: 0.0, - blep_table, - } - } - - /// Generate a sawtooth wave sample with optional anti-aliasing - pub fn generate_sawtooth(&mut self, frequency: f32) -> f32 { - let frequency = frequency.min(self.nyquist); - self.phase_increment = frequency / self.config.sample_rate as f32; - - let mut output = 2.0 * self.phase - 1.0; - - if self.config.anti_aliasing { - self.apply_blep(&mut output); - } - - self.phase += self.phase_increment; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - output - } - - /// Generate a square wave sample with optional anti-aliasing - pub fn generate_square(&mut self, frequency: f32, pulse_width: f32) -> f32 { - let frequency = frequency.min(self.nyquist); - self.phase_increment = frequency / self.config.sample_rate as f32; - - let pw = pulse_width.clamp(0.0, 1.0); - let mut output = if self.phase < pw { 1.0 } else { -1.0 }; - - if self.config.anti_aliasing { - self.apply_blep(&mut output); - } - - self.phase += self.phase_increment; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - output - } - - /// Apply band-limited step correction - fn apply_blep(&mut self, output: &mut f32) { - if self.phase < self.phase_increment { - let index = (self.phase / self.phase_increment * self.blep_table.len() as f32) as usize; - *output += self.blep_table.get(index).cloned().unwrap_or(0.0); - } - } -} - -/// Implements a flexible audio oscillator for different wave types -pub struct Oscillator { - freq: f32, - num_samples: usize, - wave_type: WaveType, - analog_osc: AnalogOsc, -} - -impl Oscillator { - /// Create oscillators for different wave types with default configuration - pub fn sine(freq: f32) -> Self { - Self::new(freq, WaveType::Sine, OscillatorConfig::default()) - } - - pub fn square(freq: f32) -> Self { - Self::new(freq, WaveType::Square, OscillatorConfig::default()) - } - - pub fn sawtooth(freq: f32) -> Self { - Self::new(freq, WaveType::Sawtooth, OscillatorConfig::default()) - } - - pub fn triangle(freq: f32) -> Self { - Self::new(freq, WaveType::Triangle, OscillatorConfig::default()) - } - - /// Create oscillators with custom configuration - pub fn new_with_config(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { - Oscillator { - freq, - num_samples: 0, - wave_type, - analog_osc: AnalogOsc::new(config), - } - } - - /// Internal constructor for oscillators - fn new(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { - Oscillator { - freq, - num_samples: 0, - wave_type, - analog_osc: AnalogOsc::new(config), - } - } -} - -impl Iterator for Oscillator { - type Item = f32; - - fn next(&mut self) -> Option { - self.num_samples = self.num_samples.wrapping_add(1); - - Some(match self.wave_type { - WaveType::Sine => (2.0 * PI * self.freq * self.num_samples as f32 - / self.analog_osc.config.sample_rate as f32) - .sin(), - WaveType::Square => self.analog_osc.generate_square(self.freq, 0.5), - WaveType::Sawtooth => self.analog_osc.generate_sawtooth(self.freq), - WaveType::Triangle => { - // Derive triangle wave from sine wave - let sin_val = (2.0 * PI * self.freq * self.num_samples as f32 - / self.analog_osc.config.sample_rate as f32) - .sin(); - sin_val.asin() * 2.0 / PI - } - }) - } -} - -impl rodio::Source for Oscillator { - fn current_frame_len(&self) -> Option { - None - } - - fn channels(&self) -> u16 { - 1 - } - - fn sample_rate(&self) -> u32 { - self.analog_osc.config.sample_rate - } - - fn total_duration(&self) -> Option { - None - } -} diff --git a/examples/synth/trash/new/synth.rs b/examples/synth/trash/new/synth.rs deleted file mode 100644 index bb351bc..0000000 --- a/examples/synth/trash/new/synth.rs +++ /dev/null @@ -1,214 +0,0 @@ -use std::collections::HashMap; -use std::sync::Arc; -use std::time::{Duration, Instant}; - -use rodio::source::Source; -use rodio::{OutputStreamHandle, Sink}; - -use crate::envelope::*; - -/// Advanced synthesizer with improved envelope and audio management -pub struct Synth { - audio_sources: HashMap, - stream_handle: OutputStreamHandle, - default_envelope_config: ADSREnvelopeConfig, -} - -impl Synth { - /// Create a new AdvancedSynth with optional default envelope configuration - pub fn new( - stream_handle: OutputStreamHandle, - default_envelope: Option, - ) -> Self { - Synth { - audio_sources: HashMap::new(), - stream_handle, - default_envelope_config: default_envelope.unwrap_or_else(|| { - ADSREnvelopeConfig::builder() - .attack(Duration::from_millis(50)) - .decay(Duration::from_millis(100)) - .sustain(0.7) - .release(Duration::from_millis(200)) - .build() - .expect("Default envelope configuration failed") - }), - } - } - - /// Play an audio source with optional custom envelope - pub fn play_source( - &mut self, - audio_source: Box + Send>, - source_id: u8, - envelope: Option, - ) -> Result<(), String> { - // Remove existing source with the same ID to allow retriggering - if self.audio_sources.contains_key(&source_id) { - self.audio_sources.remove(&source_id); - } - - // Create a new sink - let sink = Sink::try_new(&self.stream_handle) - .map_err(|e| format!("Failed to create audio sink: {}", e))?; - - // Append the audio source to the sink - sink.append(audio_source); - - // Use provided envelope or default - let envelope_config = envelope.unwrap_or_else(|| self.default_envelope_config.clone()); - let mut envelope = ADSREnvelope::new(envelope_config); - - // Start the envelope - envelope.start(); - - // Immediately set the initial volume - let now = Instant::now(); - let initial_volume = envelope.get_amplitude(now); - sink.set_volume(initial_volume); - - // Store the sink and envelope - self.audio_sources.insert(source_id, (sink, envelope)); - - Ok(()) - } - - // pub fn play_source( - // &mut self, - // audio_source: Box + Send>, - // source_id: u8, - // envelope: Option, - // ) -> Result<(), String> { - // // Remove existing source with the same ID to allow retriggering - // if self.audio_sources.contains_key(&source_id) { - // self.audio_sources.remove(&source_id); - // } - - // // Proceed to create and add the new source - // let sink = Sink::try_new(&self.stream_handle) - // .map_err(|e| format!("Failed to create audio sink: {}", e))?; - - // sink.append(audio_source); - - // let envelope_config = envelope.unwrap_or_else(|| self.default_envelope_config.clone()); - // let mut envelope = ADSREnvelope::new(envelope_config); - // envelope.start(); - - // let now = Instant::now(); - // let initial_volume = envelope.get_amplitude(now); - // sink.set_volume(initial_volume); - - // self.audio_sources.insert(source_id, (sink, envelope)); - - // Ok(()) - // } - - /// Release a specific audio source - pub fn release_source(&mut self, source_id: u8) -> Result<(), String> { - self.audio_sources - .get_mut(&source_id) - .map(|(_, envelope)| { - envelope.release(); - }) - .ok_or_else(|| "Source not found".to_string()) - } - - /// Update audio sources and their envelopes - pub fn update(&mut self) { - if self.audio_sources.is_empty() { - return; - } - - let now = Instant::now(); - let mut sources_to_remove = Vec::new(); - - // Update each source's volume based on its envelope - for (source_id, (sink, envelope)) in self.audio_sources.iter_mut() { - // Calculate current amplitude - let volume = envelope.get_amplitude(now); - sink.set_volume(volume); - - // Check if source is completed - if envelope.is_finished(now) { - sources_to_remove.push(*source_id); - } - } - - // Remove completed sources - for source_id in sources_to_remove { - self.audio_sources.remove(&source_id); - } - } -} - -// Example usage and basic tests -#[cfg(test)] -mod tests { - use super::*; - use rodio::{OutputStream, Source}; - use std::collections::vec_deque::VecDeque; - - // A simple test source that generates a constant tone - struct TestSource { - samples: VecDeque, - } - - impl TestSource { - fn new(duration: usize) -> Self { - Self { - samples: std::iter::repeat(1.0).take(duration).collect(), - } - } - } - - impl Iterator for TestSource { - type Item = f32; - fn next(&mut self) -> Option { - self.samples.pop_front() - } - } - - impl Source for TestSource { - fn current_frame_len(&self) -> Option { - Some(self.samples.len()) - } - - fn channels(&self) -> u16 { - 1 - } - fn sample_rate(&self) -> u32 { - 44100 - } - fn total_duration(&self) -> Option { - None - } - } - - #[test] - fn test_basic_synth_playback() { - // Create an output stream - let (_stream, stream_handle) = OutputStream::try_default().unwrap(); - - // Create a synth - let mut synth = Synth::new( - stream_handle, - None, // Use default envelope - ); - - // Create a test audio source - let test_source = TestSource::new(1000); - - // Play the source - synth - .play_source( - Box::new(test_source), - 1, // source ID - None, - ) - .expect("Failed to play source"); - - // Update a few times to simulate envelope progression - for _ in 0..10 { - synth.update(); - } - } -} diff --git a/examples/synth/trash/old/osc.rs b/examples/synth/trash/old/osc.rs deleted file mode 100644 index 19a5468..0000000 --- a/examples/synth/trash/old/osc.rs +++ /dev/null @@ -1,8416 +0,0 @@ - -use std::f32::consts::PI; - -#[derive(Clone, Debug)] -pub struct AnalogOsc { - sample_rate: usize, - nyquist: f32, - conv: f32, - phase: f32, - prev_sync: f32, - future: [f32; FUTURE_SIZE], - future_index: usize, - prev_output: f32, -} - -const OVERSAMPLING: usize = 256; -const ZERO_CROSSINGS: usize = 16; -const TRANSITION_START: f32 = 8000.0; -const TRANSITION_END: f32 = 10000.0; -const FUTURE_SIZE: usize = ZERO_CROSSINGS * 2; -const BLEP_SIZE: usize = OVERSAMPLING * ZERO_CROSSINGS * 2 + 1; - -impl AnalogOsc { - pub fn new() -> AnalogOsc { - AnalogOsc { - sample_rate: 0, - nyquist: 0.0, - conv: 0.0, - phase: 0.0, - prev_sync: 0.0, - future: [0.0; FUTURE_SIZE], - future_index: 0, - prev_output: 0.0, - } - } - - pub fn set_sample_rate(&mut self, n: usize) { - // Avoid a potential data race. - if self.sample_rate != n { - self.sample_rate = n; - self.nyquist = n as f32 / 2.0; - self.conv = 1.0 / self.sample_rate as f32; - } - } - - pub fn tick_saw(&mut self, f: f32, sync: f32, shape: f32) -> f32 { - let f = f.min(self.nyquist); - let shape = shape.clamp(0.0, 1.0); - - let rate = f * self.conv; - - let mut output = 0.0; - - // Advance phase. - self.phase += rate; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - // Sync. - if sync > 0.0 && self.prev_sync <= 0.0 { - // Estimate how long ago zero-crossing happened - // via linear interpolation and intersection - // with x-axis. - let frames_since = sync / (sync - self.prev_sync); - - // Reset phase. - self.phase = frames_since * rate; - } - - self.prev_sync = sync; - - // Render bleps. - if f < TRANSITION_END { - // Compute phase of the second saw. - let mut aux_phase = self.phase + shape * 0.5; - if aux_phase >= 1.0 { - aux_phase -= 1.0; - } - - // Naive dual saw. - output = self.phase + aux_phase - 1.0; - - // If the function has decreased, add a blep. - if output < self.prev_output && rate > 0.0 { - let scale = self.prev_output - output + 2.0 * rate; - self.add_blep(f32::min(self.phase, aux_phase) / rate, scale); - } - - self.prev_output = output; - - // Correct with bleps. - output += self.future[self.future_index]; - self.future[self.future_index] = 0.0; - self.future_index = (self.future_index + 1) % FUTURE_SIZE; - - // Remove DC component based on frequency. - // 5.473 is emperically determined. - output -= (f / self.sample_rate as f32) * 5.473; - } - - // Render sine. - if f > TRANSITION_START { - let sine_gain = if f < TRANSITION_END { - (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) - } else { - 1.0 - }; - - output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); - } - - output - } - - #[allow(dead_code)] - pub fn process_saw(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { - let n = pitch.len(); - for i in 0..n { - out[i] = self.tick_saw(pitch[i], sync[i], shape[i]); - } - } - - pub fn tick_square(&mut self, f: f32, sync: f32, shape: f32) -> f32 { - let f = f.min(self.nyquist); - let shape = shape.min(1.0).max(0.0); - - let rate = f * self.conv; - - let mut output = 0.0; - - // Pulse width. - let pw = 0.5 * (1.0 - shape); - - // Advance phase. - self.phase += rate; - if self.phase >= 1.0 { - self.phase -= 1.0; - } - - // Sync. - if sync > 0.0 && self.prev_sync <= 0.0 { - // Estimate how long ago zero-crossing happened - // via linear interpolation and intersection - // with x-axis. - let frames_since = sync / (sync - self.prev_sync); - - // Reset phase. - self.phase = frames_since * rate; - } - - self.prev_sync = sync; - - // Render bleps. - if f < TRANSITION_END { - // Naive square. - output = if self.phase < pw { 1.0 } else { -1.0 }; - - if output != self.prev_output && rate > 0.0 { - if self.phase < pw { - self.add_blep(self.phase / rate, -2.0); - } else { - self.add_blep((self.phase - pw) / rate, 2.0); - } - } - - self.prev_output = output; - - // Correct with bleps. - output += self.future[self.future_index]; - self.future[self.future_index] = 0.0; - self.future_index = (self.future_index + 1) % FUTURE_SIZE; - } - - // Render sine. - if f > TRANSITION_START { - let sine_gain = if f < TRANSITION_END { - (f - TRANSITION_START) / (TRANSITION_END - TRANSITION_START) - } else { - 1.0 - }; - - output = (1.0 - sine_gain) * output + sine_gain * (f32::sin(self.phase * 2.0 * PI)); - } - - output - } - - #[allow(dead_code)] - pub fn process_square(&mut self, pitch: &[f32], sync: &[f32], shape: &[f32], out: &mut [f32]) { - let n = pitch.len(); - for i in 0..n { - out[i] = self.tick_square(pitch[i], sync[i], shape[i]); - } - } - - fn add_blep(&mut self, phase: f32, scale: f32) { - // Add a blep into the future buffer. - - let mut p = (phase * (OVERSAMPLING as f32)) as usize; // Convert to integer index outside the loop. - - let mut i = self.future_index; - - // Note: should be able to do one loop with modulo. Perhaps that was slower? - - while i < FUTURE_SIZE && p < BLEP_SIZE { - self.future[i] += BLEP_TABLE[p] * scale; - p += OVERSAMPLING; - i += 1; - } - - i = 0; - while i < self.future_index && p < BLEP_SIZE { - self.future[i] += BLEP_TABLE[p] * scale; - p += OVERSAMPLING; - i += 1; - } - } -} - -#[allow(clippy::all)] -const BLEP_TABLE: [f32; BLEP_SIZE] = [ - 1.00000002216, - 1.00000004418, - 1.00000006604, - 1.00000008775, - 1.00000010929, - 1.00000013066, - 1.00000015186, - 1.00000017287, - 1.00000019369, - 1.00000021431, - 1.00000023473, - 1.00000025493, - 1.0000002749, - 1.00000029464, - 1.00000031413, - 1.00000033337, - 1.00000035234, - 1.00000037103, - 1.00000038942, - 1.0000004075, - 1.00000042527, - 1.00000044269, - 1.00000045976, - 1.00000047645, - 1.00000049275, - 1.00000050864, - 1.0000005241, - 1.0000005391, - 1.00000055363, - 1.00000056765, - 1.00000058114, - 1.00000059407, - 1.00000060642, - 1.00000061815, - 1.00000062923, - 1.00000063963, - 1.00000064931, - 1.00000065823, - 1.00000066636, - 1.00000067365, - 1.00000068006, - 1.00000068555, - 1.00000069006, - 1.00000069355, - 1.00000069596, - 1.00000069724, - 1.00000069733, - 1.00000069617, - 1.0000006937, - 1.00000068985, - 1.00000068455, - 1.00000067773, - 1.00000066932, - 1.00000065924, - 1.0000006474, - 1.00000063373, - 1.00000061813, - 1.00000060051, - 1.00000058077, - 1.00000055881, - 1.00000053454, - 1.00000050783, - 1.00000047859, - 1.00000044669, - 1.000000412, - 1.00000037441, - 1.00000033378, - 1.00000028998, - 1.00000024286, - 1.00000019228, - 1.00000013809, - 1.00000008012, - 1.00000001822, - 0.999999952219, - 0.999999881935, - 0.99999980719, - 0.999999727795, - 0.999999643558, - 0.999999554276, - 0.999999459742, - 0.999999359741, - 0.99999925405, - 0.999999142439, - 0.999999024672, - 0.999998900504, - 0.99999876968, - 0.99999863194, - 0.999998487014, - 0.999998334623, - 0.999998174481, - 0.999998006291, - 0.999997829748, - 0.999997644537, - 0.999997450334, - 0.999997246803, - 0.999997033601, - 0.999996810373, - 0.999996576753, - 0.999996332364, - 0.99999607682, - 0.999995809722, - 0.999995530659, - 0.99999523921, - 0.99999493494, - 0.999994617403, - 0.999994286139, - 0.999993940678, - 0.999993580533, - 0.999993205206, - 0.999992814185, - 0.999992406945, - 0.999991982944, - 0.999991541627, - 0.999991082426, - 0.999990604755, - 0.999990108013, - 0.999989591584, - 0.999989054837, - 0.999988497123, - 0.999987917776, - 0.999987316114, - 0.999986691438, - 0.99998604303, - 0.999985370155, - 0.999984672059, - 0.99998394797, - 0.999983197097, - 0.999982418629, - 0.999981611735, - 0.999980775564, - 0.999979909246, - 0.999979011889, - 0.999978082578, - 0.999977120381, - 0.999976124339, - 0.999975093473, - 0.999974026783, - 0.999972923242, - 0.999971781802, - 0.999970601392, - 0.999969380912, - 0.999968119243, - 0.999966815237, - 0.999965467722, - 0.9999640755, - 0.999962637345, - 0.999961152005, - 0.999959618201, - 0.999958034627, - 0.999956399947, - 0.999954712798, - 0.999952971786, - 0.999951175488, - 0.999949322452, - 0.999947411195, - 0.999945440202, - 0.999943407929, - 0.999941312796, - 0.999939153194, - 0.99993692748, - 0.999934633977, - 0.999932270975, - 0.999929836728, - 0.999927329457, - 0.999924747347, - 0.999922088545, - 0.999919351165, - 0.99991653328, - 0.999913632929, - 0.99991064811, - 0.999907576784, - 0.999904416873, - 0.999901166258, - 0.999897822781, - 0.999894384241, - 0.999890848399, - 0.99988721297, - 0.99988347563, - 0.999879634009, - 0.999875685696, - 0.999871628232, - 0.999867459117, - 0.999863175804, - 0.999858775698, - 0.99985425616, - 0.999849614503, - 0.999844847991, - 0.999839953841, - 0.999834929219, - 0.999829771243, - 0.999824476979, - 0.999819043444, - 0.999813467602, - 0.999807746363, - 0.999801876589, - 0.999795855082, - 0.999789678596, - 0.999783343825, - 0.999776847411, - 0.999770185937, - 0.999763355931, - 0.999756353864, - 0.999749176146, - 0.99974181913, - 0.999734279111, - 0.999726552319, - 0.999718634928, - 0.999710523048, - 0.999702212727, - 0.999693699949, - 0.999684980636, - 0.999676050645, - 0.999666905766, - 0.999657541726, - 0.999647954183, - 0.99963813873, - 0.99962809089, - 0.999617806119, - 0.999607279801, - 0.999596507252, - 0.999585483717, - 0.999574204368, - 0.999562664306, - 0.999550858557, - 0.999538782075, - 0.999526429739, - 0.999513796353, - 0.999500876642, - 0.999487665257, - 0.999474156772, - 0.99946034568, - 0.999446226396, - 0.999431793256, - 0.999417040514, - 0.999401962343, - 0.999386552833, - 0.999370805993, - 0.999354715746, - 0.999338275933, - 0.999321480307, - 0.999304322537, - 0.999286796203, - 0.9992688948, - 0.999250611733, - 0.999231940317, - 0.999212873779, - 0.999193405254, - 0.999173527786, - 0.999153234327, - 0.999132517734, - 0.999111370771, - 0.99908978611, - 0.999067756323, - 0.999045273889, - 0.999022331189, - 0.998998920505, - 0.998975034023, - 0.998950663827, - 0.998925801902, - 0.998900440131, - 0.998874570297, - 0.998848184079, - 0.998821273053, - 0.998793828692, - 0.998765842361, - 0.998737305322, - 0.998708208729, - 0.998678543631, - 0.998648300967, - 0.998617471566, - 0.99858604615, - 0.998554015329, - 0.998521369602, - 0.998488099357, - 0.998454194867, - 0.998419646294, - 0.998384443684, - 0.998348576969, - 0.998312035965, - 0.99827481037, - 0.998236889767, - 0.998198263618, - 0.998158921269, - 0.998118851945, - 0.998078044751, - 0.998036488669, - 0.997994172562, - 0.99795108517, - 0.997907215106, - 0.997862550864, - 0.99781708081, - 0.997770793184, - 0.997723676103, - 0.997675717554, - 0.997626905397, - 0.997577227365, - 0.997526671059, - 0.997475223952, - 0.997422873387, - 0.997369606575, - 0.997315410595, - 0.997260272394, - 0.997204178784, - 0.997147116445, - 0.997089071921, - 0.997030031623, - 0.996969981822, - 0.996908908657, - 0.996846798127, - 0.996783636093, - 0.996719408278, - 0.996654100268, - 0.996587697505, - 0.996520185293, - 0.996451548797, - 0.996381773036, - 0.996310842891, - 0.996238743098, - 0.996165458249, - 0.996090972795, - 0.996015271039, - 0.995938337142, - 0.995860155118, - 0.995780708835, - 0.995699982014, - 0.995617958229, - 0.995534620909, - 0.99544995333, - 0.995363938622, - 0.995276559767, - 0.995187799596, - 0.995097640789, - 0.995006065878, - 0.99491305724, - 0.994818597106, - 0.99472266755, - 0.994625250496, - 0.994526327717, - 0.99442588083, - 0.994323891299, - 0.994220340436, - 0.994115209397, - 0.994008479185, - 0.993900130646, - 0.993790144473, - 0.993678501201, - 0.993565181212, - 0.99345016473, - 0.993333431822, - 0.9932149624, - 0.993094736218, - 0.992972732873, - 0.992848931805, - 0.992723312295, - 0.992595853467, - 0.992466534288, - 0.992335333564, - 0.992202229946, - 0.992067201923, - 0.991930227827, - 0.991791285832, - 0.991650353951, - 0.991507410039, - 0.991362431791, - 0.991215396744, - 0.991066282276, - 0.990915065603, - 0.990761723785, - 0.990606233719, - 0.990448572147, - 0.990288715647, - 0.990126640641, - 0.98996232339, - 0.989795739997, - 0.989626866405, - 0.989455678397, - 0.989282151599, - 0.989106261478, - 0.98892798334, - 0.988747292335, - 0.988564163454, - 0.988378571529, - 0.988190491234, - 0.987999897088, - 0.987806763449, - 0.98761106452, - 0.987412774346, - 0.987211866815, - 0.98700831566, - 0.986802094459, - 0.98659317663, - 0.986381535441, - 0.986167144002, - 0.985949975268, - 0.985730002043, - 0.985507196975, - 0.98528153256, - 0.98505298114, - 0.984821514906, - 0.984587105897, - 0.984349726002, - 0.984109346957, - 0.983865940351, - 0.983619477622, - 0.983369930059, - 0.983117268804, - 0.98286146485, - 0.982602489046, - 0.982340312092, - 0.982074904544, - 0.981806236813, - 0.981534279168, - 0.981259001732, - 0.980980374487, - 0.980698367275, - 0.980412949796, - 0.980124091609, - 0.979831762138, - 0.979535930665, - 0.979236566337, - 0.978933638165, - 0.978627115025, - 0.978316965659, - 0.978003158674, - 0.977685662548, - 0.977364445626, - 0.977039476123, - 0.976710722127, - 0.976378151597, - 0.976041732366, - 0.975701432141, - 0.975357218506, - 0.975009058921, - 0.974656920725, - 0.974300771136, - 0.973940577254, - 0.973576306059, - 0.973207924418, - 0.972835399079, - 0.972458696678, - 0.97207778374, - 0.971692626677, - 0.971303191792, - 0.970909445281, - 0.970511353231, - 0.970108881628, - 0.96970199635, - 0.969290663176, - 0.968874847784, - 0.968454515753, - 0.968029632565, - 0.967600163606, - 0.96716607417, - 0.966727329458, - 0.966283894578, - 0.965835734554, - 0.96538281432, - 0.964925098727, - 0.96446255254, - 0.963995140446, - 0.96352282705, - 0.96304557688, - 0.962563354389, - 0.962076123956, - 0.961583849888, - 0.961086496422, - 0.960584027728, - 0.960076407908, - 0.959563601004, - 0.959045570993, - 0.958522281794, - 0.957993697268, - 0.957459781221, - 0.956920497408, - 0.956375809529, - 0.955825681238, - 0.955270076142, - 0.954708957804, - 0.954142289745, - 0.953570035446, - 0.952992158353, - 0.952408621873, - 0.951819389385, - 0.951224424234, - 0.950623689741, - 0.950017149199, - 0.949404765879, - 0.948786503033, - 0.948162323894, - 0.94753219168, - 0.946896069597, - 0.946253920841, - 0.945605708599, - 0.944951396056, - 0.944290946393, - 0.943624322792, - 0.942951488437, - 0.942272406521, - 0.941587040244, - 0.940895352816, - 0.940197307464, - 0.93949286743, - 0.938781995977, - 0.938064656391, - 0.937340811983, - 0.936610426093, - 0.935873462091, - 0.935129883384, - 0.934379653414, - 0.933622735665, - 0.932859093662, - 0.932088690979, - 0.931311491238, - 0.930527458113, - 0.929736555334, - 0.92893874669, - 0.928133996031, - 0.927322267273, - 0.926503524397, - 0.92567773146, - 0.924844852588, - 0.924004851988, - 0.923157693946, - 0.922303342834, - 0.92144176311, - 0.920572919322, - 0.919696776113, - 0.918813298222, - 0.917922450489, - 0.917024197858, - 0.916118505381, - 0.915205338219, - 0.914284661648, - 0.91335644106, - 0.912420641971, - 0.911477230017, - 0.910526170965, - 0.909567430712, - 0.90860097529, - 0.907626770869, - 0.906644783761, - 0.905654980422, - 0.904657327459, - 0.90365179163, - 0.902638339849, - 0.90161693919, - 0.900587556889, - 0.899550160351, - 0.898504717148, - 0.897451195031, - 0.896389561923, - 0.895319785933, - 0.894241835352, - 0.893155678661, - 0.892061284533, - 0.890958621838, - 0.889847659645, - 0.888728367227, - 0.887600714063, - 0.886464669845, - 0.885320204479, - 0.884167288088, - 0.883005891021, - 0.881835983848, - 0.880657537374, - 0.879470522635, - 0.878274910905, - 0.877070673699, - 0.875857782777, - 0.874636210149, - 0.873405928077, - 0.872166909079, - 0.870919125936, - 0.86966255169, - 0.868397159653, - 0.867122923409, - 0.865839816817, - 0.864547814016, - 0.86324688943, - 0.861937017768, - 0.860618174033, - 0.85929033352, - 0.857953471826, - 0.856607564849, - 0.855252588795, - 0.85388852018, - 0.852515335834, - 0.851133012908, - 0.849741528872, - 0.848340861525, - 0.846930988993, - 0.845511889738, - 0.84408354256, - 0.842645926601, - 0.841199021345, - 0.83974280663, - 0.838277262644, - 0.836802369934, - 0.835318109406, - 0.833824462333, - 0.832321410356, - 0.830808935486, - 0.829287020113, - 0.827755647007, - 0.826214799321, - 0.824664460595, - 0.823104614762, - 0.821535246149, - 0.819956339483, - 0.818367879894, - 0.816769852917, - 0.815162244499, - 0.813545041, - 0.811918229198, - 0.810281796295, - 0.808635729913, - 0.806980018108, - 0.805314649365, - 0.803639612609, - 0.801954897201, - 0.800260492947, - 0.798556390103, - 0.79684257937, - 0.79511905191, - 0.793385799338, - 0.791642813733, - 0.789890087638, - 0.788127614066, - 0.786355386501, - 0.784573398903, - 0.782781645711, - 0.780980121847, - 0.779168822719, - 0.777347744224, - 0.775516882753, - 0.773676235192, - 0.771825798928, - 0.769965571849, - 0.768095552351, - 0.766215739339, - 0.764326132232, - 0.762426730963, - 0.760517535986, - 0.758598548276, - 0.756669769337, - 0.754731201198, - 0.752782846422, - 0.750824708107, - 0.748856789889, - 0.746879095945, - 0.744891630998, - 0.742894400316, - 0.740887409719, - 0.738870665578, - 0.736844174823, - 0.73480794494, - 0.73276198398, - 0.730706300556, - 0.728640903849, - 0.726565803613, - 0.72448101017, - 0.722386534422, - 0.720282387847, - 0.718168582505, - 0.716045131039, - 0.713912046678, - 0.711769343239, - 0.709617035133, - 0.707455137361, - 0.705283665523, - 0.703102635815, - 0.700912065034, - 0.698711970583, - 0.696502370466, - 0.694283283298, - 0.692054728303, - 0.689816725315, - 0.687569294785, - 0.685312457778, - 0.683046235978, - 0.68077065169, - 0.67848572784, - 0.676191487978, - 0.673887956282, - 0.671575157554, - 0.66925311723, - 0.666921861374, - 0.664581416685, - 0.662231810496, - 0.659873070777, - 0.657505226136, - 0.655128305819, - 0.652742339715, - 0.650347358353, - 0.647943392909, - 0.645530475202, - 0.643108637698, - 0.640677913511, - 0.638238336404, - 0.635789940789, - 0.633332761732, - 0.630866834947, - 0.628392196806, - 0.625908884333, - 0.623416935206, - 0.620916387762, - 0.618407280993, - 0.615889654549, - 0.61336354874, - 0.610829004531, - 0.608286063552, - 0.605734768089, - 0.603175161091, - 0.600607286168, - 0.598031187591, - 0.595446910293, - 0.592854499871, - 0.590254002582, - 0.587645465347, - 0.585028935751, - 0.582404462039, - 0.579772093122, - 0.577131878573, - 0.574483868627, - 0.571828114183, - 0.569164666801, - 0.566493578705, - 0.563814902781, - 0.561128692574, - 0.558435002294, - 0.555733886808, - 0.553025401647, - 0.550309602998, - 0.547586547709, - 0.544856293287, - 0.542118897894, - 0.53937442035, - 0.536622920131, - 0.533864457368, - 0.531099092845, - 0.528326887998, - 0.525547904917, - 0.522762206341, - 0.519969855658, - 0.517170916904, - 0.514365454762, - 0.511553534559, - 0.508735222267, - 0.5059105845, - 0.50307968851, - 0.500242602192, - 0.497399394074, - 0.494550133321, - 0.491694889732, - 0.488833733736, - 0.485966736393, - 0.48309396939, - 0.480215505037, - 0.477331416271, - 0.474441776648, - 0.471546660342, - 0.468646142144, - 0.46574029746, - 0.462829202306, - 0.459912933307, - 0.456991567695, - 0.454065183305, - 0.451133858572, - 0.448197672531, - 0.44525670481, - 0.442311035633, - 0.439360745808, - 0.436405916734, - 0.433446630391, - 0.430482969338, - 0.427515016713, - 0.424542856226, - 0.421566572158, - 0.418586249355, - 0.415601973229, - 0.412613829748, - 0.40962190544, - 0.406626287382, - 0.403627063201, - 0.400624321069, - 0.397618149698, - 0.394608638339, - 0.391595876773, - 0.388579955312, - 0.385560964793, - 0.382538996573, - 0.379514142526, - 0.376486495036, - 0.373456146998, - 0.370423191809, - 0.367387723363, - 0.364349836052, - 0.361309624754, - 0.358267184835, - 0.35522261214, - 0.352176002989, - 0.349127454173, - 0.34607706295, - 0.343024927038, - 0.339971144609, - 0.336915814289, - 0.333859035147, - 0.330800906693, - 0.327741528873, - 0.324681002061, - 0.321619427057, - 0.318556905078, - 0.315493537756, - 0.31242942713, - 0.309364675642, - 0.30629938613, - 0.303233661823, - 0.300167606334, - 0.297101323657, - 0.294034918157, - 0.290968494569, - 0.287902157987, - 0.284836013861, - 0.28177016799, - 0.278704726517, - 0.275639795921, - 0.27257548301, - 0.269511894918, - 0.266449139096, - 0.263387323306, - 0.260326555615, - 0.257266944389, - 0.254208598284, - 0.251151626242, - 0.248096137483, - 0.245042241498, - 0.241990048045, - 0.238939667136, - 0.235891209038, - 0.232844784258, - 0.229800503544, - 0.226758477872, - 0.22371881844, - 0.220681636663, - 0.217647044165, - 0.214615152771, - 0.211586074499, - 0.208559921554, - 0.205536806323, - 0.202516841361, - 0.199500139391, - 0.196486813292, - 0.193476976091, - 0.190470740958, - 0.187468221199, - 0.184469530245, - 0.181474781646, - 0.178484089063, - 0.175497566263, - 0.172515327105, - 0.169537485539, - 0.166564155593, - 0.163595451368, - 0.16063148703, - 0.157672376799, - 0.154718234944, - 0.151769175775, - 0.148825313634, - 0.145886762884, - 0.142953637908, - 0.140026053093, - 0.137104122827, - 0.134187961488, - 0.131277683439, - 0.128373403015, - 0.125475234519, - 0.122583292209, - 0.119697690296, - 0.11681854293, - 0.113945964194, - 0.111080068095, - 0.108220968554, - 0.105368779403, - 0.10252361437, - 0.0996855870723, - 0.0968548110105, - 0.0940313995573, - 0.0912154659497, - 0.0884071232805, - 0.0856064844893, - 0.0828136623543, - 0.0800287694832, - 0.0772519183046, - 0.0744832210596, - 0.0717227897927, - 0.0689707363433, - 0.0662271723366, - 0.0634922091754, - 0.060765958031, - 0.0580485298342, - 0.055340035267, - 0.0526405847535, - 0.0499502884511, - 0.0472692562417, - 0.0445975977231, - 0.0419354221998, - 0.0392828386745, - 0.036639955839, - 0.0340068820656, - 0.0313837253981, - 0.0287705935431, - 0.0261675938609, - 0.023574833357, - 0.0209924186731, - 0.0184204560782, - 0.0158590514599, - 0.0133083103153, - 0.0107683377427, - 0.00823923843221, - 0.00572111665733, - 0.00321407626593, - 0.000718220671564, - -0.00176634715537, - -0.00423952469639, - -0.00670120989368, - -0.0091513011589, - -0.0115896973819, - -0.0140162979393, - -0.0164310027036, - -0.0188337120514, - -0.0212243268725, - -0.0236027485782, - -0.0259688791103, - -0.0283226209494, - -0.0306638771239, - -0.0329925512182, - -0.0353085473814, - -0.0376117703361, - -0.0399021253866, - -0.0421795184273, - -0.0444438559519, - -0.0466950450608, - -0.0489329934705, - -0.0511576095213, - -0.0533688021861, - -0.0555664810785, - -0.0577505564612, - -0.0599209392544, - -0.0620775410438, - -0.0642202740888, - -0.0663490513312, - -0.0684637864026, - -0.070564393633, - -0.0726507880589, - -0.074722885431, - -0.0767806022225, - -0.078823855637, - -0.0808525636162, - -0.0828666448481, - -0.0848660187748, - -0.0868506055999, - -0.0888203262969, - -0.0907751026164, - -0.0927148570939, - -0.0946395130576, - -0.0965489946356, - -0.0984432267639, - -0.100322135194, - -0.102185646498, - -0.104033688081, - -0.105866188184, - -0.107683075891, - -0.109484281139, - -0.111269734726, - -0.113039368313, - -0.114793114435, - -0.116530906507, - -0.118252678833, - -0.119958366608, - -0.121647905929, - -0.123321233802, - -0.124978288146, - -0.1266190078, - -0.128243332531, - -0.129851203043, - -0.131442560975, - -0.133017348918, - -0.134575510414, - -0.136116989964, - -0.137641733035, - -0.139149686067, - -0.140640796478, - -0.142115012667, - -0.143572284027, - -0.145012560943, - -0.146435794805, - -0.147841938006, - -0.149230943956, - -0.150602767081, - -0.151957362831, - -0.153294687687, - -0.154614699162, - -0.155917355811, - -0.157202617235, - -0.158470444082, - -0.159720798058, - -0.160953641928, - -0.162168939523, - -0.163366655743, - -0.164546756563, - -0.165709209037, - -0.166853981304, - -0.16798104259, - -0.169090363214, - -0.170181914592, - -0.171255669242, - -0.172311600784, - -0.173349683953, - -0.174369894592, - -0.175372209664, - -0.176356607253, - -0.177323066566, - -0.178271567939, - -0.179202092841, - -0.180114623874, - -0.18100914478, - -0.181885640442, - -0.182744096889, - -0.183584501297, - -0.184406841993, - -0.185211108457, - -0.185997291327, - -0.1867653824, - -0.187515374633, - -0.188247262151, - -0.188961040241, - -0.189656705363, - -0.190334255145, - -0.190993688391, - -0.191635005079, - -0.192258206363, - -0.192863294578, - -0.193450273238, - -0.194019147042, - -0.194569921869, - -0.195102604785, - -0.195617204044, - -0.196113729085, - -0.196592190537, - -0.197052600219, - -0.197494971141, - -0.197919317503, - -0.198325654699, - -0.198713999314, - -0.199084369127, - -0.199436783111, - -0.199771261432, - -0.200087825451, - -0.200386497722, - -0.200667301994, - -0.20093026321, - -0.201175407506, - -0.201402762212, - -0.201612355849, - -0.201804218133, - -0.20197837997, - -0.202134873456, - -0.20227373188, - -0.202394989716, - -0.202498682629, - -0.202584847469, - -0.202653522272, - -0.202704746256, - -0.202738559825, - -0.20275500456, - -0.202754123223, - -0.202735959753, - -0.202700559264, - -0.202647968041, - -0.202578233544, - -0.202491404398, - -0.202387530396, - -0.202266662493, - -0.202128852807, - -0.201974154615, - -0.201802622346, - -0.201614311584, - -0.201409279064, - -0.201187582664, - -0.200949281407, - -0.200694435457, - -0.200423106112, - -0.200135355803, - -0.199831248092, - -0.199510847664, - -0.199174220327, - -0.198821433005, - -0.198452553737, - -0.198067651668, - -0.197666797051, - -0.197250061238, - -0.196817516675, - -0.196369236901, - -0.195905296542, - -0.195425771303, - -0.194930737966, - -0.194420274387, - -0.193894459484, - -0.193353373241, - -0.192797096692, - -0.192225711927, - -0.191639302074, - -0.191037951306, - -0.190421744826, - -0.189790768863, - -0.189145110669, - -0.188484858512, - -0.187810101666, - -0.187120930409, - -0.186417436016, - -0.18569971075, - -0.184967847858, - -0.184221941564, - -0.18346208706, - -0.182688380501, - -0.181900918999, - -0.181099800613, - -0.180285124345, - -0.179456990129, - -0.178615498827, - -0.177760752222, - -0.176892853005, - -0.176011904773, - -0.175118012021, - -0.174211280129, - -0.173291815361, - -0.17235972485, - -0.171415116596, - -0.170458099455, - -0.169488783129, - -0.168507278161, - -0.167513695926, - -0.166508148618, - -0.165490749249, - -0.164461611632, - -0.163420850381, - -0.162368580892, - -0.161304919344, - -0.160229982682, - -0.159143888613, - -0.158046755594, - -0.156938702825, - -0.155819850235, - -0.15469031848, - -0.153550228926, - -0.152399703643, - -0.151238865396, - -0.150067837633, - -0.148886744476, - -0.147695710713, - -0.146494861783, - -0.145284323773, - -0.144064223401, - -0.142834688009, - -0.141595845555, - -0.140347824597, - -0.139090754288, - -0.137824764361, - -0.136549985122, - -0.135266547438, - -0.133974582726, - -0.132674222942, - -0.131365600572, - -0.130048848619, - -0.128724100592, - -0.127391490496, - -0.126051152824, - -0.124703222537, - -0.123347835064, - -0.121985126282, - -0.120615232509, - -0.119238290491, - -0.117854437392, - -0.116463810781, - -0.115066548623, - -0.113662789263, - -0.11225267142, - -0.11083633417, - -0.109413916938, - -0.107985559486, - -0.106551401899, - -0.105111584574, - -0.103666248211, - -0.102215533796, - -0.100759582593, - -0.0992985361311, - -0.0978325361922, - -0.0963617247984, - -0.0948862442006, - -0.0934062368663, - -0.0919218454675, - -0.0904332128681, - -0.0889404821123, - -0.0874437964117, - -0.0859432991336, - -0.0844391337884, - -0.0829314440173, - -0.0814203735799, - -0.079906066342, - -0.0783886662631, - -0.0768683173841, - -0.0753451638146, - -0.0738193497206, - -0.0722910193121, - -0.0707603168307, - -0.0692273865368, - -0.0676923726971, - -0.0661554195724, - -0.064616671405, - -0.0630762724057, - -0.0615343667419, - -0.0599910985244, - -0.0584466117954, - -0.0569010505156, - -0.0553545585516, - -0.0538072796635, - -0.0522593574924, - -0.0507109355473, - -0.0491621571931, - -0.0476131656379, - -0.0460641039202, - -0.0445151148965, - -0.0429663412287, - -0.0414179253717, - -0.0398700095606, - -0.0383227357983, - -0.0367762458431, - -0.0352306811961, - -0.0336861830884, - -0.0321428924692, - -0.0306009499931, - -0.0290604960075, - -0.0275216705402, - -0.0259846132873, - -0.0244494636006, - -0.0229163604753, - -0.0213854425374, - -0.019856848032, - -0.0183307148105, - -0.0168071803186, - -0.0152863815839, - -0.0137684552039, - -0.0122535373339, - -0.0107417636744, - -0.00923326945988, - -0.00772818944583, - -0.00622665789736, - -0.00472880857696, - -0.00323477473267, - -0.00174468908612, - -0.00025868382076, - 0.00122310943003, - 0.00270055959462, - 0.00417353617491, - 0.00564190925794, - 0.00710554952752, - 0.00856432827585, - 0.0100181174149, - 0.0114667894881, - 0.0129102176816, - 0.0143482758353, - 0.0157808384551, - 0.0172077807229, - 0.0186289785088, - 0.0200443083817, - 0.0214536476206, - 0.0228568742252, - 0.0242538669275, - 0.025644505202, - 0.0270286692769, - 0.0284062401448, - 0.0297770995732, - 0.0311411301153, - 0.0324982151205, - 0.0338482387445, - 0.0351910859604, - 0.0365266425682, - 0.0378547952058, - 0.0391754313585, - 0.0404884393696, - 0.0417937084501, - 0.0430911286886, - 0.0443805910615, - 0.0456619874422, - 0.0469352106116, - 0.0482001542666, - 0.0494567130308, - 0.0507047824629, - 0.0519442590666, - 0.0531750403, - 0.0543970245841, - 0.0556101113126, - 0.0568142008604, - 0.0580091945925, - 0.0591949948733, - 0.0603715050746, - 0.0615386295848, - 0.0626962738171, - 0.0638443442177, - 0.0649827482749, - 0.0661113945263, - 0.0672301925679, - 0.0683390530612, - 0.0694378877418, - 0.070526609427, - 0.0716051320234, - 0.0726733705345, - 0.0737312410685, - 0.0747786608453, - 0.0758155482039, - 0.0768418226099, - 0.0778574046621, - 0.0788622160996, - 0.079856179809, - 0.0808392198306, - 0.0818112613653, - 0.0827722307813, - 0.08372205562, - 0.0846606646028, - 0.0855879876369, - 0.0865039558216, - 0.0874085014541, - 0.0883015580354, - 0.0891830602759, - 0.0900529441011, - 0.0909111466569, - 0.0917576063152, - 0.092592262679, - 0.0934150565873, - 0.0942259301205, - 0.0950248266048, - 0.0958116906174, - 0.0965864679906, - 0.0973491058168, - 0.0980995524526, - 0.0988377575229, - 0.0995636719254, - 0.100277247834, - 0.100978438704, - 0.101667199273, - 0.102343485568, - 0.103007254908, - 0.103658465903, - 0.104297078465, - 0.104923053804, - 0.105536354435, - 0.10613694418, - 0.106724788169, - 0.107299852846, - 0.107862105968, - 0.108411516608, - 0.108948055159, - 0.109471693335, - 0.109982404173, - 0.110480162033, - 0.110964942602, - 0.111436722895, - 0.111895481257, - 0.11234119736, - 0.112773852212, - 0.11319342815, - 0.113599908845, - 0.113993279302, - 0.114373525862, - 0.114740636198, - 0.115094599319, - 0.115435405572, - 0.115763046636, - 0.116077515528, - 0.116378806597, - 0.116666915529, - 0.116941839344, - 0.117203576393, - 0.117452126363, - 0.117687490271, - 0.117909670464, - 0.118118670619, - 0.118314495743, - 0.118497152166, - 0.118666647547, - 0.118822990864, - 0.118966192421, - 0.119096263837, - 0.119213218053, - 0.119317069319, - 0.119407833204, - 0.119485526582, - 0.119550167637, - 0.119601775856, - 0.119640372028, - 0.119665978242, - 0.11967861788, - 0.119678315617, - 0.119665097416, - 0.119638990525, - 0.119600023472, - 0.119548226065, - 0.119483629382, - 0.11940626577, - 0.119316168844, - 0.119213373476, - 0.119097915795, - 0.11896983318, - 0.118829164259, - 0.118675948898, - 0.118510228202, - 0.118332044506, - 0.118141441369, - 0.117938463575, - 0.117723157118, - 0.117495569204, - 0.117255748241, - 0.117003743836, - 0.116739606785, - 0.116463389072, - 0.116175143857, - 0.115874925474, - 0.115562789422, - 0.115238792362, - 0.114902992103, - 0.114555447604, - 0.114196218958, - 0.113825367393, - 0.11344295526, - 0.113049046026, - 0.112643704269, - 0.112226995665, - 0.111798986988, - 0.111359746097, - 0.110909341926, - 0.110447844485, - 0.109975324839, - 0.109491855113, - 0.108997508473, - 0.108492359123, - 0.107976482296, - 0.107449954243, - 0.106912852227, - 0.106365254511, - 0.105807240353, - 0.105238889993, - 0.104660284644, - 0.104071506488, - 0.103472638658, - 0.102863765237, - 0.102244971241, - 0.101616342616, - 0.100977966222, - 0.100329929827, - 0.0996723220971, - 0.0990052325839, - 0.0983287517163, - 0.0976429707893, - 0.0969479819541, - 0.0962438782075, - 0.0955307533814, - 0.0948087021319, - 0.0940778199289, - 0.0933382030454, - 0.0925899485462, - 0.0918331542771, - 0.0910679188543, - 0.0902943416524, - 0.0895125227942, - 0.0887225631386, - 0.0879245642696, - 0.0871186284852, - 0.0863048587851, - 0.0854833588599, - 0.0846542330791, - 0.0838175864795, - 0.0829735247533, - 0.0821221542363, - 0.0812635818963, - 0.0803979153205, - 0.0795252627042, - 0.0786457328381, - 0.0777594350965, - 0.0768664794249, - 0.0759669763279, - 0.0750610368568, - 0.0741487725971, - 0.0732302956563, - 0.0723057186513, - 0.0713751546956, - 0.0704387173874, - 0.0694965207962, - 0.0685486794506, - 0.0675953083256, - 0.0666365228293, - 0.0656724387908, - 0.0647031724469, - 0.0637288404293, - 0.0627495597519, - 0.0617654477975, - 0.0607766223049, - 0.059783201356, - 0.0587853033626, - 0.0577830470536, - 0.0567765514614, - 0.055765935909, - 0.0547513199969, - 0.0537328235898, - 0.0527105668035, - 0.0516846699913, - 0.0506552537312, - 0.0496224388123, - 0.0485863462217, - 0.0475470971308, - 0.0465048128827, - 0.0454596149779, - 0.0444116250618, - 0.0433609649107, - 0.042307756419, - 0.0412521215852, - 0.040194182499, - 0.0391340613277, - 0.0380718803028, - 0.0370077617066, - 0.035941827859, - 0.0348742011038, - 0.0338050037954, - 0.0327343582857, - 0.0316623869103, - 0.0305892119753, - 0.0295149557442, - 0.0284397404239, - 0.0273636881522, - 0.0262869209837, - 0.025209560877, - 0.0241317296813, - 0.0230535491229, - 0.0219751407923, - 0.0208966261305, - 0.0198181264164, - 0.0187397627531, - 0.017661656055, - 0.0165839270344, - 0.0155066961888, - 0.0144300837877, - 0.0133542098592, - 0.0122791941775, - 0.0112051562495, - 0.0101322153023, - 0.00906049026979, - 0.00799009978024, - 0.00692116214325, - 0.00585379533701, - 0.00478811699559, - 0.00372424439623, - 0.00266229444668, - 0.00160238367266, - 0.000544628205254, - -0.000510856231544, - -0.0015639543333, - -0.00261455122753, - -0.00366253248601, - -0.00470778413709, - -0.0057501926779, - -0.00678964508651, - -0.00782602883404, - -0.00885923189671, - -0.0098891427678, - -0.0109156504696, - -0.0119386445651, - -0.0129580151701, - -0.0139736529647, - -0.0149854492048, - -0.015993295734, - -0.0169970849949, - -0.0179967100406, - -0.0189920645459, - -0.0199830428189, - -0.0209695398118, - -0.0219514511323, - -0.0229286730546, - -0.0239011025303, - -0.0248686371992, - -0.0258311754002, - -0.0267886161821, - -0.027740859314, - -0.028687805296, - -0.0296293553696, - -0.0305654115278, - -0.0314958765261, - -0.0324206538917, - -0.0333396479342, - -0.0342527637557, - -0.03515990726, - -0.0360609851632, - -0.0369559050028, - -0.0378445751476, - -0.038726904807, - -0.0396028040407, - -0.0404721837676, - -0.0413349557755, - -0.0421910327294, - -0.0430403281814, - -0.043882756579, - -0.0447182332738, - -0.0455466745307, - -0.0463679975358, - -0.0471821204054, - -0.0479889621939, - -0.0487884429024, - -0.0495804834863, - -0.0503650058641, - -0.0511419329242, - -0.0519111885335, - -0.052672697545, - -0.0534263858048, - -0.0541721801598, - -0.0549100084653, - -0.0556397995916, - -0.0563614834315, - -0.057074990907, - -0.0577802539761, - -0.0584772056397, - -0.0591657799479, - -0.0598459120065, - -0.0605175379836, - -0.0611805951153, - -0.061835021712, - -0.0624807571645, - -0.0631177419496, - -0.0637459176357, - -0.0643652268886, - -0.0649756134767, - -0.0655770222763, - -0.066169399277, - -0.0667526915865, - -0.0673268474353, - -0.067891816182, - -0.0684475483175, - -0.0689939954697, - -0.0695311104076, - -0.0700588470459, - -0.0705771604488, - -0.0710860068341, - -0.0715853435769, - -0.0720751292134, - -0.0725553234444, - -0.0730258871388, - -0.0734867823367, - -0.0739379722525, - -0.0743794212783, - -0.0748110949862, - -0.0752329601314, - -0.0756449846549, - -0.0760471376853, - -0.0764393895419, - -0.0768217117364, - -0.0771940769748, - -0.0775564591597, - -0.0779088333919, - -0.0782511759717, - -0.078583464401, - -0.0789056773839, - -0.0792177948282, - -0.0795197978468, - -0.0798116687579, - -0.0800933910863, - -0.0803649495639, - -0.0806263301299, - -0.0808775199316, - -0.0811185073242, - -0.0813492818711, - -0.0815698343437, - -0.0817801567211, - -0.0819802421899, - -0.0821700851437, - -0.0823496811824, - -0.0825190271112, - -0.08267812094, - -0.0828269618821, - -0.0829655503534, - -0.0830938879702, - -0.0832119775488, - -0.0833198231028, - -0.0834174298424, - -0.0835048041716, - -0.0835819536865, - -0.0836488871733, - -0.0837056146058, - -0.0837521471429, - -0.0837884971259, - -0.0838146780763, - -0.0838307046923, - -0.083836592846, - -0.0838323595806, - -0.0838180231067, - -0.083793602799, - -0.0837591191928, - -0.0837145939805, - -0.0836600500073, - -0.0835955112679, - -0.0835210029019, - -0.0834365511898, - -0.0833421835488, - -0.0832379285279, - -0.0831238158038, - -0.082999876176, - -0.0828661415617, - -0.0827226449912, - -0.0825694206023, - -0.0824065036358, - -0.0822339304293, - -0.0820517384124, - -0.0818599661004, - -0.0816586530894, - -0.0814478400496, - -0.0812275687199, - -0.0809978819016, - -0.0807588234519, - -0.0805104382781, - -0.0802527723307, - -0.0799858725969, - -0.079709787094, - -0.0794245648625, - -0.0791302559592, - -0.0788269114501, - -0.0785145834033, - -0.0781933248815, - -0.0778631899349, - -0.0775242335937, - -0.07717651186, - -0.0768200817009, - -0.0764550010397, - -0.0760813287489, - -0.0756991246413, - -0.0753084494625, - -0.0749093648824, - -0.0745019334866, - -0.0740862187683, - -0.0736622851197, - -0.073230197823, - -0.072790023042, - -0.0723418278131, - -0.0718856800361, - -0.0714216484658, - -0.070949802702, - -0.0704702131808, - -0.0699829511653, - -0.0694880887359, - -0.0689856987807, - -0.0684758549862, - -0.0679586318277, - -0.067434104559, - -0.0669023492028, - -0.0663634425411, - -0.0658174621044, - -0.0652644861623, - -0.064704593713, - -0.0641378644729, - -0.0635643788664, - -0.0629842180157, - -0.0623974637298, - -0.0618041984942, - -0.0612045054602, - -0.0605984684343, - -0.0599861718672, - -0.059367700843, - -0.0587431410684, - -0.0581125788615, - -0.057476101141, - -0.0568337954148, - -0.0561857497689, - -0.0555320528563, - -0.0548727938854, - -0.0542080626091, - -0.0535379493129, - -0.0528625448036, - -0.052181940398, - -0.051496227911, - -0.050805499644, - -0.0501098483735, - -0.0494093673392, - -0.0487041502319, - -0.0479942911824, - -0.0472798847491, - -0.0465610259061, - -0.0458378100317, - -0.0451103328958, - -0.0443786906484, - -0.0436429798073, - -0.042903297246, - -0.0421597401819, - -0.0414124061635, - -0.0406613930589, - -0.0399067990431, - -0.0391487225861, - -0.0383872624406, - -0.0376225176292, - -0.036854587433, - -0.0360835713784, - -0.0353095692253, - -0.0345326809545, - -0.0337530067555, - -0.0329706470137, - -0.0321857022985, - -0.0313982733506, - -0.0306084610696, - -0.0298163665015, - -0.0290220908264, - -0.0282257353459, - -0.0274274014709, - -0.0266271907087, - -0.0258252046508, - -0.0250215449606, - -0.0242163133607, - -0.0234096116205, - -0.0226015415437, - -0.0217922049559, - -0.0209817036924, - -0.0201701395853, - -0.0193576144515, - -0.01854423008, - -0.0177300882199, - -0.0169152905674, - -0.0160999387543, - -0.0152841343347, - -0.0144679787735, - -0.0136515734338, - -0.0128350195643, - -0.0120184182877, - -0.011201870588, - -0.0103854772984, - -0.00956933908922, - -0.00875355645588, - -0.0079382297065, - -0.00712345895003, - -0.00630934408421, - -0.00549598478353, - -0.00468348048728, - -0.00387193038766, - -0.0030614334179, - -0.00225208824039, - -0.00144399323494, - -0.000637246486994, - 0.000168054224043, - 0.00097181143646, - 0.00177392801784, - 0.00257430717663, - 0.00337285247358, - 0.00416946783327, - 0.00496405755541, - 0.00575652632626, - 0.00654677922982, - 0.0073347217591, - 0.00812025982727, - 0.00890329977872, - 0.00968374840012, - 0.0104615129314, - 0.0112365010765, - 0.0120086210146, - 0.0127777814102, - 0.0135438914247, - 0.0143068607262, - 0.0150665995004, - 0.0158230184613, - 0.0165760288612, - 0.0173255425012, - 0.0180714717416, - 0.0188137295118, - 0.0195522293204, - 0.0202868852655, - 0.0210176120445, - 0.0217443249637, - 0.0224669399484, - 0.0231853735522, - 0.0238995429672, - 0.0246093660327, - 0.0253147612453, - 0.0260156477679, - 0.0267119454389, - 0.0274035747815, - 0.0280904570124, - 0.0287725140515, - 0.0294496685297, - 0.0301218437986, - 0.0307889639387, - 0.0314509537678, - 0.0321077388501, - 0.0327592455038, - 0.0334054008098, - 0.03404613262, - 0.0346813695649, - 0.0353110410617, - 0.0359350773225, - 0.0365534093616, - 0.0371659690031, - 0.037772688889, - 0.038373502486, - 0.038968344093, - 0.0395571488483, - 0.0401398527368, - 0.040716392597, - 0.0412867061273, - 0.0418507318936, - 0.0424084093353, - 0.042959678772, - 0.04350448141, - 0.0440427593484, - 0.0445744555854, - 0.0450995140242, - 0.0456178794793, - 0.0461294976816, - 0.0466343152849, - 0.0471322798709, - 0.0476233399547, - 0.0481074449906, - 0.0485845453767, - 0.0490545924602, - 0.0495175385424, - 0.0499733368836, - 0.0504219417076, - 0.0508633082066, - 0.0512973925451, - 0.0517241518648, - 0.0521435442885, - 0.0525555289243, - 0.0529600658694, - 0.053357116214, - 0.0537466420452, - 0.0541286064501, - 0.0545029735196, - 0.0548697083516, - 0.0552287770541, - 0.0555801467484, - 0.0559237855719, - 0.0562596626808, - 0.056587748253, - 0.0569080134905, - 0.0572204306215, - 0.0575249729032, - 0.0578216146235, - 0.0581103311033, - 0.0583910986981, - 0.0586638947998, - 0.0589286978384, - 0.0591854872834, - 0.0594342436452, - 0.059674948476, - 0.0599075843714, - 0.060132134971, - 0.060348584959, - 0.0605569200653, - 0.060757127066, - 0.0609491937834, - 0.0611331090866, - 0.0613088628917, - 0.0614764461617, - 0.0616358509061, - 0.0617870701811, - 0.0619300980892, - 0.0620649297781, - 0.0621915614407, - 0.062309990314, - 0.0624202146784, - 0.0625222338563, - 0.0626160482111, - 0.0627016591463, - 0.0627790691032, - 0.0628482815602, - 0.0629093010306, - 0.0629621330608, - 0.0630067842285, - 0.0630432621406, - 0.0630715754311, - 0.0630917337583, - 0.0631037478029, - 0.0631076292649, - 0.0631033908615, - 0.0630910463234, - 0.0630706103927, - 0.0630420988192, - 0.0630055283575, - 0.0629609167635, - 0.0629082827908, - 0.0628476461875, - 0.0627790276921, - 0.06270244903, - 0.062617932909, - 0.0625255030158, - 0.0624251840116, - 0.0623170015277, - 0.0622009821608, - 0.0620771534693, - 0.0619455439675, - 0.0618061831216, - 0.0616591013446, - 0.0615043299912, - 0.0613419013525, - 0.0611718486511, - 0.0609942060355, - 0.0608090085747, - 0.0606162922525, - 0.0604160939618, - 0.0602084514991, - 0.0599934035581, - 0.059770989724, - 0.0595412504671, - 0.0593042271369, - 0.0590599619555, - 0.0588084980111, - 0.0585498792516, - 0.0582841504778, - 0.0580113573368, - 0.0577315463148, - 0.0574447647307, - 0.0571510607284, - 0.05685048327, - 0.0565430821284, - 0.0562289078801, - 0.0559080118976, - 0.0555804463417, - 0.0552462641544, - 0.0549055190504, - 0.0545582655099, - 0.0542045587704, - 0.0538444548188, - 0.0534780103832, - 0.0531052829248, - 0.0527263306296, - 0.0523412124, - 0.0519499878464, - 0.051552717279, - 0.0511494616984, - 0.0507402827879, - 0.0503252429041, - 0.049904405068, - 0.0494778329568, - 0.0490455908941, - 0.0486077438412, - 0.0481643573882, - 0.0477154977444, - 0.047261231729, - 0.0468016267623, - 0.0463367508557, - 0.0458666726024, - 0.0453914611683, - 0.0449111862815, - 0.0444259182235, - 0.0439357278189, - 0.0434406864261, - 0.042940865927, - 0.0424363387172, - 0.0419271776963, - 0.0414134562577, - 0.0408952482785, - 0.0403726281094, - 0.0398456705645, - 0.0393144509112, - 0.0387790448601, - 0.0382395285541, - 0.0376959785586, - 0.0371484718509, - 0.0365970858096, - 0.0360418982046, - 0.0354829871859, - 0.0349204312736, - 0.034354309347, - 0.0337847006342, - 0.0332116847012, - 0.0326353414412, - 0.032055751064, - 0.0314729940854, - 0.0308871513161, - 0.0302983038508, - 0.0297065330578, - 0.0291119205678, - 0.0285145482631, - 0.0279144982669, - 0.0273118529317, - 0.0267066948293, - 0.0260991067391, - 0.0254891716375, - 0.0248769726867, - 0.0242625932239, - 0.02364611675, - 0.0230276269188, - 0.0224072075262, - 0.0217849424984, - 0.0211609158816, - 0.0205352118308, - 0.0199079145982, - 0.0192791085231, - 0.0186488780199, - 0.0180173075677, - 0.017384481699, - 0.0167504849886, - 0.0161154020428, - 0.0154793174881, - 0.0148423159604, - 0.0142044820937, - 0.0135659005097, - 0.012926655806, - 0.0122868325458, - 0.0116465152467, - 0.0110057883697, - 0.0103647363084, - 0.00972344337807, - 0.00908199380471, - 0.00844047171436, - 0.00779896112212, - 0.00715754592145, - 0.00651630987337, - 0.00587533659568, - 0.00523470955231, - 0.00459451204262, - 0.00395482719074, - 0.00331573793497, - 0.00267732701719, - 0.00203967697234, - 0.00140287011793, - 0.000766988543539, - 0.000132114100414, - -0.000501671608894, - -0.00113428724088, - -0.00176565172135, - -0.00239568425572, - -0.00302430433914, - -0.00365143176668, - -0.00427698664342, - -0.00490088939449, - -0.00552306077507, - -0.00614342188031, - -0.00676189415524, - -0.00737839940455, - -0.00799285980242, - -0.00860519790216, - -0.00921533664592, - -0.00982319937424, - -0.0104287098356, - -0.0110317921958, - -0.0116323710475, - -0.0122303714195, - -0.0128257187858, - -0.0134183390752, - -0.01400815868, - -0.0145951044653, - -0.0151791037781, - -0.0157600844557, - -0.016337974835, - -0.0169127037614, - -0.0174842005968, - -0.0180523952289, - -0.0186172180793, - -0.0191786001121, - -0.0197364728423, - -0.0202907683441, - -0.0208414192589, - -0.0213883588036, - -0.0219315207788, - -0.0224708395762, - -0.0230062501872, - -0.0235376882099, - -0.0240650898574, - -0.0245883919653, - -0.0251075319987, - -0.0256224480603, - -0.0261330788974, - -0.026639363909, - -0.0271412431531, - -0.027638657354, - -0.0281315479086, - -0.028619856894, - -0.0291035270735, - -0.0295825019039, - -0.0300567255418, - -0.03052614285, - -0.0309906994038, - -0.0314503414976, - -0.0319050161506, - -0.0323546711133, - -0.032799254873, - -0.0332387166601, - -0.0336730064534, - -0.0341020749861, - -0.0345258737512, - -0.0349443550068, - -0.0353574717815, - -0.0357651778797, - -0.0361674278868, - -0.0365641771737, - -0.0369553819021, - -0.0373409990294, - -0.037720986313, - -0.0380953023148, - -0.0384639064062, - -0.0388267587718, - -0.0391838204139, - -0.0395350531568, - -0.0398804196502, - -0.0402198833738, - -0.0405534086406, - -0.0408809606006, - -0.0412025052443, - -0.0415180094065, - -0.0418274407689, - -0.0421307678642, - -0.0424279600782, - -0.0427189876535, - -0.0430038216919, - -0.0432824341574, - -0.0435547978786, - -0.0438208865513, - -0.0440806747407, - -0.044334137884, - -0.0445812522922, - -0.0448219951521, - -0.0450563445285, - -0.0452842793657, - -0.0455057794893, - -0.0457208256076, - -0.0459293993132, - -0.0461314830842, - -0.0463270602853, - -0.046516115169, - -0.0466986328765, - -0.0468745994385, - -0.047044001776, - -0.0472068277008, - -0.0473630659157, - -0.0475127060156, - -0.0476557384869, - -0.047792154708, - -0.0479219469495, - -0.0480451083735, - -0.0481616330339, - -0.0482715158757, - -0.0483747527348, - -0.048471340337, - -0.0485612762978, - -0.0486445591211, - -0.0487211881985, - -0.0487911638081, - -0.0488544871135, - -0.0489111601623, - -0.0489611858847, - -0.0490045680921, - -0.0490413114755, - -0.0490714216033, - -0.04909490492, - -0.0491117687438, - -0.0491220212647, - -0.0491256715422, - -0.0491227295028, - -0.0491132059379, - -0.049097112501, - -0.0490744617051, - -0.0490452669198, - -0.0490095423687, - -0.0489673031258, - -0.0489185651133, - -0.0488633450973, - -0.0488016606855, - -0.048733530323, - -0.048658973289, - -0.0485780096932, - -0.0484906604721, - -0.0483969473849, - -0.0482968930095, - -0.0481905207388, - -0.0480778547763, - -0.0479589201315, - -0.0478337426159, - -0.0477023488386, - -0.0475647662012, - -0.0474210228935, - -0.0472711478887, - -0.0471151709383, - -0.0469531225671, - -0.0467850340685, - -0.0466109374988, - -0.0464308656722, - -0.0462448521553, - -0.0460529312618, - -0.0458551380467, - -0.0456515083008, - -0.0454420785449, - -0.045226886024, - -0.0450059687012, - -0.0447793652519, - -0.0445471150575, - -0.0443092581992, - -0.0440658354521, - -0.0438168882782, - -0.0435624588203, - -0.0433025898956, - -0.0430373249887, - -0.0427667082452, - -0.0424907844647, - -0.0422095990943, - -0.0419231982209, - -0.0416316285652, - -0.0413349374737, - -0.0410331729119, - -0.0407263834574, - -0.0404146182917, - -0.0400979271937, - -0.0397763605317, - -0.039449969256, - -0.0391188048914, - -0.0387829195292, - -0.03844236582, - -0.0380971969653, - -0.0377474667101, - -0.0373932293345, - -0.0370345396463, - -0.0366714529723, - -0.0363040251506, - -0.0359323125222, - -0.0355563719231, - -0.0351762606754, - -0.0347920365796, - -0.0344037579057, - -0.0340114833851, - -0.0336152722017, - -0.0332151839837, - -0.0328112787948, - -0.0324036171257, - -0.0319922598852, - -0.0315772683914, - -0.0311587043631, - -0.0307366299109, - -0.0303111075284, - -0.0298822000829, - -0.0294499708069, - -0.0290144832888, - -0.0285758014641, - -0.0281339896059, - -0.0276891123163, - -0.027241234517, - -0.0267904214398, - -0.0263367386183, - -0.0258802518775, - -0.0254210273255, - -0.0249591313437, - -0.0244946305776, - -0.0240275919274, - -0.0235580825388, - -0.0230861697933, - -0.0226119212993, - -0.0221354048821, - -0.0216566885748, - -0.0211758406086, - -0.0206929294036, - -0.0202080235592, - -0.0197211918445, - -0.0192325031888, - -0.018742026672, - -0.0182498315154, - -0.0177559870719, - -0.0172605628162, - -0.0167636283358, - -0.0162652533211, - -0.0157655075556, - -0.015264460907, - -0.0147621833172, - -0.0142587447924, - -0.0137542153945, - -0.0132486652304, - -0.0127421644436, - -0.0122347832036, - -0.0117265916972, - -0.0112176601182, - -0.0107080586587, - -0.0101978574991, - -0.00968712679842, - -0.00917593668545, - -0.00866435724875, - -0.00815245852747, - -0.00764031050179, - -0.0071279830836, - -0.00661554610708, - -0.00610306931933, - -0.00559062237104, - -0.00507827480714, - -0.00456609605758, - -0.00405415542799, - -0.00354252209046, - -0.00303126507437, - -0.00252045325719, - -0.0020101553553, - -0.00150043991494, - -0.000991375303097, - -0.000483029698456, - 2.45289175845e-05, - 0.000531232769895, - 0.00103701429854, - 0.00154180616766, - 0.00204554127434, - 0.00254815275738, - 0.00304957400611, - 0.00354973866905, - 0.0040485806626, - 0.0045460341797, - 0.00504203369834, - 0.00553651399015, - 0.00602941012883, - 0.0065206574986, - 0.00701019180257, - 0.00749794907104, - 0.00798386566979, - 0.00846787830827, - 0.00894992404774, - 0.0094299403094, - 0.00990786488239, - 0.0103836359318, - 0.0108571920065, - 0.0113284720471, - 0.0117974153937, - 0.0122639617935, - 0.0127280514087, - 0.013189624824, - 0.0136486230537, - 0.01410498755, - 0.0145586602097, - 0.0150095833818, - 0.0154576998745, - 0.0159029529629, - 0.0163452863956, - 0.0167846444019, - 0.0172209716987, - 0.0176542134977, - 0.0180843155115, - 0.0185112239613, - 0.0189348855827, - 0.0193552476326, - 0.0197722578958, - 0.0201858646913, - 0.0205960168786, - 0.0210026638639, - 0.0214057556067, - 0.021805242625, - 0.0222010760023, - 0.0225932073928, - 0.0229815890276, - 0.0233661737204, - 0.0237469148728, - 0.0241237664804, - 0.024496683138, - 0.024865620045, - 0.0252305330107, - 0.0255913784596, - 0.0259481134365, - 0.0263006956114, - 0.0266490832846, - 0.0269932353915, - 0.0273331115073, - 0.0276686718516, - 0.0279998772934, - 0.0283266893549, - 0.0286490702163, - 0.02896698272, - 0.029280390375, - 0.0295892573604, - 0.0298935485299, - 0.0301932294157, - 0.030488266232, - 0.0307786258788, - 0.0310642759457, - 0.0313451847151, - 0.0316213211659, - 0.0318926549764, - 0.032159156528, - 0.0324207969079, - 0.0326775479122, - 0.0329293820491, - 0.0331762725411, - 0.0334181933281, - 0.0336551190702, - 0.0338870251497, - 0.0341138876735, - 0.0343356834761, - 0.0345523901208, - 0.0347639859025, - 0.0349704498494, - 0.0351717617248, - 0.035367902029, - 0.0355588520012, - 0.0357445936203, - 0.0359251096074, - 0.0361003834262, - 0.036270399285, - 0.0364351421372, - 0.0365945976829, - 0.0367487523695, - 0.0368975933927, - 0.0370411086972, - 0.0371792869771, - 0.0373121176767, - 0.0374395909911, - 0.0375616978659, - 0.037678429998, - 0.0377897798354, - 0.0378957405772, - 0.0379963061737, - 0.038091471326, - 0.038181231486, - 0.0382655828554, - 0.0383445223859, - 0.038418047778, - 0.0384861574807, - 0.0385488506904, - 0.0386061273502, - 0.0386579881486, - 0.0387044345187, - 0.0387454686368, - 0.038781093421, - 0.03881131253, - 0.0388361303614, - 0.03885555205, - 0.0388695834663, - 0.0388782312145, - 0.0388815026308, - 0.0388794057811, - 0.038871949459, - 0.0388591431834, - 0.0388409971968, - 0.0388175224619, - 0.0387887306602, - 0.0387546341883, - 0.0387152461562, - 0.0386705803837, - 0.0386206513979, - 0.0385654744304, - 0.0385050654137, - 0.0384394409783, - 0.0383686184498, - 0.0382926158447, - 0.0382114518679, - 0.0381251459084, - 0.0380337180361, - 0.037937188998, - 0.0378355802142, - 0.0377289137743, - 0.0376172124332, - 0.0375004996073, - 0.0373787993699, - 0.0372521364474, - 0.0371205362147, - 0.0369840246908, - 0.0368426285347, - 0.0366963750402, - 0.0365452921316, - 0.0363894083592, - 0.0362287528938, - 0.0360633555224, - 0.035893246643, - 0.0357184572597, - 0.0355390189772, - 0.0353549639959, - 0.0351663251065, - 0.0349731356849, - 0.0347754296861, - 0.0345732416395, - 0.0343666066429, - 0.0341555603567, - 0.0339401389986, - 0.0337203793373, - 0.0334963186871, - 0.0332679949019, - 0.0330354463688, - 0.0327987120025, - 0.0325578312389, - 0.0323128440291, - 0.032063790833, - 0.031810712613, - 0.0315536508276, - 0.0312926474251, - 0.0310277448369, - 0.0307589859712, - 0.0304864142059, - 0.0302100733827, - 0.0299300077996, - 0.0296462622043, - 0.029358881788, - 0.0290679121775, - 0.0287733994291, - 0.028475390021, - 0.0281739308467, - 0.0278690692077, - 0.0275608528065, - 0.0272493297391, - 0.0269345484881, - 0.0266165579153, - 0.0262954072543, - 0.0259711461035, - 0.0256438244181, - 0.0253134925032, - 0.0249802010061, - 0.0246440009085, - 0.0243049435197, - 0.0239630804683, - 0.0236184636947, - 0.0232711454439, - 0.0229211782571, - 0.0225686149646, - 0.0222135086777, - 0.0218559127812, - 0.021495880925, - 0.0211334670172, - 0.0207687252154, - 0.0204017099192, - 0.0200324757621, - 0.0196610776039, - 0.0192875705225, - 0.0189120098059, - 0.0185344509443, - 0.018154949622, - 0.0177735617097, - 0.0173903432559, - 0.0170053504793, - 0.0166186397605, - 0.0162302676343, - 0.0158402907809, - 0.0154487660186, - 0.0150557502949, - 0.0146613006792, - 0.014265474354, - 0.0138683286071, - 0.0134699208236, - 0.0130703084774, - 0.0126695491231, - 0.0122677003884, - 0.0118648199653, - 0.0114609656023, - 0.0110561950962, - 0.010650566284, - 0.0102441370348, - 0.00983696524164, - 0.00942910881337, - 0.00902062566659, - 0.00861157371755, - 0.0082020108741, - 0.00779199502759, - 0.0073815840448, - 0.00697083575996, - 0.00655980796667, - 0.00614855840993, - 0.00573714477813, - 0.00532562469507, - 0.00491405571203, - 0.00450249529983, - 0.00409100084092, - 0.00367962962148, - 0.00326843882359, - 0.00285748551736, - 0.00244682665313, - 0.00203651905369, - 0.00162661940652, - 0.00121718425607, - 0.000808269996037, - 0.000399932861746, - -7.77107752303e-06, - -0.000414785926115, - -0.00082105596957, - -0.00122652568215, - -0.00163113973434, - -0.00203484300028, - -0.00243758056521, - -0.00283929773283, - -0.00323994003264, - -0.00363945322725, - -0.0040377833196, - -0.0044348765602, - -0.00483067945427, - -0.00522513876889, - -0.00561820154005, - -0.00600981507967, - -0.0063999269826, - -0.00678848513355, - -0.00717543771394, - -0.00756073320875, - -0.0079443204133, - -0.00832614843997, - -0.00870616672483, - -0.00908432503434, - -0.00946057347184, - -0.00983486248408, - -0.0102071428676, - -0.0105773657754, - -0.0109454827228, - -0.011311445594, - -0.0116752066484, - -0.0120367185265, - -0.0123959342562, - -0.0127528072586, - -0.0131072913541, - -0.0134593407684, - -0.0138089101381, - -0.0141559545165, - -0.0145004293797, - -0.0148422906315, - -0.0151814946098, - -0.0155179980915, - -0.0158517582979, - -0.0161827329006, - -0.0165108800264, - -0.0168361582624, - -0.0171585266614, - -0.0174779447471, - -0.0177943725186, - -0.0181077704558, - -0.018418099524, - -0.0187253211788, - -0.0190293973708, - -0.0193302905499, - -0.0196279636705, - -0.0199223801954, - -0.0202135041005, - -0.0205012998788, - -0.0207857325451, - -0.0210667676397, - -0.0213443712329, - -0.0216185099286, - -0.0218891508684, - -0.0221562617356, - -0.0224198107587, - -0.0226797667151, - -0.0229360989349, - -0.023188777304, - -0.0234377722682, - -0.0236830548358, - -0.0239245965814, - -0.0241623696486, - -0.0243963467536, - -0.0246265011879, - -0.0248528068212, - -0.0250752381044, - -0.0252937700722, - -0.0255083783458, - -0.0257190391356, - -0.0259257292435, - -0.0261284260654, - -0.0263271075935, - -0.0265217524185, - -0.0267123397318, - -0.0268988493275, - -0.0270812616045, - -0.027259557568, - -0.0274337188319, - -0.0276037276198, - -0.0277695667671, - -0.0279312197226, - -0.0280886705493, - -0.0282419039265, - -0.0283909051506, - -0.0285356601363, - -0.028676155418, - -0.0288123781503, - -0.0289443161094, - -0.0290719576935, - -0.0291952919237, - -0.0293143084447, - -0.0294289975252, - -0.0295393500586, - -0.029645357563, - -0.0297470121817, - -0.0298443066836, - -0.0299372344627, - -0.0300257895388, - -0.0301099665569, - -0.0301897607873, - -0.0302651681253, - -0.030336185091, - -0.0304028088284, - -0.0304650371054, - -0.0305228683131, - -0.0305763014648, - -0.0306253361955, - -0.0306699727611, - -0.0307102120372, - -0.0307460555181, - -0.0307775053159, - -0.0308045641592, - -0.0308272353915, - -0.0308455229704, - -0.0308594314655, - -0.0308689660573, - -0.0308741325356, - -0.0308749372973, - -0.0308713873451, - -0.0308634902853, - -0.030851254326, - -0.0308346882752, - -0.0308138015381, - -0.0307886041155, - -0.0307591066013, - -0.0307253201799, - -0.0306872566241, - -0.0306449282923, - -0.030598348126, - -0.0305475296471, - -0.0304924869551, - -0.0304332347244, - -0.0303697882009, - -0.0303021631996, - -0.0302303761012, - -0.0301544438489, - -0.0300743839455, - -0.0299902144494, - -0.0299019539721, - -0.0298096216741, - -0.0297132372617, - -0.029612820983, - -0.0295083936249, - -0.0293999765086, - -0.0292875914865, - -0.0291712609377, - -0.0290510077643, - -0.0289268553876, - -0.0287988277437, - -0.0286669492792, - -0.0285312449477, - -0.0283917402045, - -0.0282484610031, - -0.0281014337905, - -0.0279506855023, - -0.0277962435588, - -0.0276381358602, - -0.0274763907814, - -0.0273110371682, - -0.0271421043317, - -0.0269696220439, - -0.0267936205325, - -0.0266141304762, - -0.0264311829996, - -0.0262448096679, - -0.026055042482, - -0.0258619138734, - -0.0256654566986, - -0.0254657042342, - -0.025262690171, - -0.0250564486094, - -0.0248470140531, - -0.0246344214043, - -0.0244187059576, - -0.0241999033948, - -0.0239780497791, - -0.0237531815493, - -0.0235253355142, - -0.0232945488469, - -0.0230608590788, - -0.0228243040936, - -0.0225849221219, - -0.0223427517348, - -0.022097831838, - -0.0218502016658, - -0.021599900775, - -0.0213469690392, - -0.0210914466417, - -0.0208333740705, - -0.0205727921111, - -0.0203097418408, - -0.0200442646223, - -0.0197764020975, - -0.0195061961807, - -0.0192336890529, - -0.0189589231549, - -0.0186819411811, - -0.0184027860729, - -0.0181215010124, - -0.0178381294158, - -0.0175527149268, - -0.0172653014101, - -0.0169759329449, - -0.0166846538184, - -0.0163915085188, - -0.016096541729, - -0.0157997983198, - -0.0155013233434, - -0.0152011620266, - -0.0148993597638, - -0.014595962111, - -0.0142910147783, - -0.0139845636237, - -0.0136766546461, - -0.0133673339786, - -0.0130566478817, - -0.0127446427365, - -0.0124313650381, - -0.0121168613886, - -0.0118011784901, - -0.0114843631385, - -0.0111664622162, - -0.0108475226854, - -0.0105275915813, - -0.0102067160055, - -0.00988494311869, - -0.00956232013437, - -0.00923889431172, - -0.00891471294892, - -0.0085898233763, - -0.00826427294954, - -0.00793810904295, - -0.00761137904258, - -0.00728413033954, - -0.00695641032319, - -0.00662826637439, - -0.00629974585875, - -0.00597089611991, - -0.00564176447281, - -0.00531239819702, - -0.00498284452997, - -0.00465315066036, - -0.00432336372145, - -0.00399353078445, - -0.00366369885187, - -0.00333391485092, - -0.00300422562696, - -0.00267467793691, - -0.00234531844271, - -0.00201619370482, - -0.0016873501757, - -0.00135883419339, - -0.00103069197503, - -0.000702969610455, - -0.000375713055814, - -4.89681272062e-05, - 0.000277219505644, - 0.000602804325689, - 0.000927740974823, - 0.00125198426012, - 0.00157548916004, - 0.00189821083059, - 0.00222010461146, - 0.00254112603214, - 0.00286123081796, - 0.00318037489613, - 0.00349851440173, - 0.00381560568363, - 0.00413160531048, - 0.00444647007647, - 0.00476015700726, - 0.00507262336571, - 0.00538382665764, - 0.00569372463755, - 0.00600227531425, - 0.00630943695648, - 0.00661516809851, - 0.00691942754562, - 0.00722217437959, - 0.00752336796414, - 0.0078229679503, - 0.00812093428172, - 0.0084172272, - 0.00871180724986, - 0.00900463528436, - 0.00929567247, - 0.00958488029184, - 0.00987222055844, - 0.0101576554069, - 0.0104411473078, - 0.0107226590699, - 0.011002153845, - 0.0112795951331, - 0.0115549467862, - 0.0118281730137, - 0.0120992383869, - 0.012368107843, - 0.0126347466902, - 0.0128991206115, - 0.0131611956695, - 0.0134209383105, - 0.0136783153687, - 0.0139332940702, - 0.0141858420374, - 0.0144359272929, - 0.0146835182634, - 0.0149285837835, - 0.0151710930999, - 0.0154110158747, - 0.0156483221895, - 0.0158829825487, - 0.0161149678835, - 0.0163442495549, - 0.0165707993576, - 0.0167945895228, - 0.0170155927224, - 0.0172337820711, - 0.0174491311307, - 0.0176616139122, - 0.0178712048796, - 0.0180778789524, - 0.0182816115086, - 0.0184823783876, - 0.0186801558928, - 0.0188749207946, - 0.0190666503325, - 0.0192553222181, - 0.0194409146372, - 0.0196234062525, - 0.0198027762056, - 0.0199790041197, - 0.0201520701012, - 0.0203219547423, - 0.0204886391226, - 0.0206521048116, - 0.0208123338699, - 0.0209693088516, - 0.0211230128057, - 0.0212734292778, - 0.0214205423119, - 0.0215643364516, - 0.0217047967417, - 0.0218419087296, - 0.0219756584665, - 0.0221060325087, - 0.0222330179186, - 0.0223566022659, - 0.0224767736286, - 0.0225935205937, - 0.0227068322583, - 0.0228166982302, - 0.0229231086288, - 0.0230260540855, - 0.0231255257441, - 0.0232215152618, - 0.023314014809, - 0.0234030170701, - 0.0234885152433, - 0.0235705030412, - 0.0236489746906, - 0.0237239249326, - 0.0237953490226, - 0.02386324273, - 0.0239276023383, - 0.0239884246445, - 0.024045706959, - 0.0240994471049, - 0.0241496434179, - 0.0241962947454, - 0.0242394004459, - 0.0242789603883, - 0.0243149749515, - 0.0243474450227, - 0.0243763719973, - 0.0244017577775, - 0.0244236047712, - 0.024441915891, - 0.0244566945528, - 0.0244679446747, - 0.0244756706757, - 0.0244798774739, - 0.0244805704853, - 0.0244777556223, - 0.0244714392916, - 0.0244616283932, - 0.024448330318, - 0.0244315529462, - 0.0244113046454, - 0.0243875942687, - 0.0243604311524, - 0.0243298251141, - 0.0242957864504, - 0.0242583259347, - 0.0242174548151, - 0.0241731848116, - 0.0241255281138, - 0.0240744973788, - 0.0240201057279, - 0.0239623667447, - 0.0239012944718, - 0.0238369034086, - 0.0237692085079, - 0.0236982251735, - 0.0236239692569, - 0.0235464570548, - 0.0234657053053, - 0.0233817311854, - 0.0232945523077, - 0.0232041867167, - 0.0231106528863, - 0.0230139697157, - 0.0229141565265, - 0.0228112330589, - 0.0227052194685, - 0.0225961363224, - 0.0224840045958, - 0.0223688456682, - 0.0222506813196, - 0.0221295337271, - 0.0220054254605, - 0.0218783794789, - 0.0217484191263, - 0.021615568128, - 0.0214798505865, - 0.0213412909773, - 0.0211999141445, - 0.0210557452974, - 0.0209088100054, - 0.0207591341943, - 0.0206067441417, - 0.0204516664728, - 0.0202939281559, - 0.0201335564978, - 0.0199705791399, - 0.0198050240527, - 0.0196369195322, - 0.0194662941947, - 0.0192931769722, - 0.019117597108, - 0.0189395841517, - 0.0187591679544, - 0.0185763786642, - 0.0183912467211, - 0.018203802852, - 0.0180140780663, - 0.0178221036504, - 0.0176279111632, - 0.0174315324306, - 0.017232999541, - 0.0170323448397, - 0.0168296009242, - 0.016624800639, - 0.0164179770702, - 0.0162091635407, - 0.0159983936048, - 0.0157857010427, - 0.0155711198559, - 0.0153546842612, - 0.0151364286859, - 0.0149163877623, - 0.0146945963224, - 0.0144710893922, - 0.014245902187, - 0.0140190701054, - 0.013790628724, - 0.0135606137923, - 0.0133290612265, - 0.013096007105, - 0.0128614876622, - 0.0126255392831, - 0.0123881984979, - 0.0121495019768, - 0.0119094865236, - 0.0116681890711, - 0.0114256466748, - 0.0111818965078, - 0.0109369758551, - 0.0106909221077, - 0.0104437727577, - 0.0101955653919, - 0.00994633768664, - 0.0096961274023, - 0.00944497237738, - 0.00919291052303, - 0.00893997981745, - 0.00868621830021, - 0.00843166406671, - 0.00817635526248, - 0.00792033007765, - 0.00766362674127, - 0.00740628351572, - 0.00714833869114, - 0.00688983057977, - 0.00663079751042, - 0.00637127782281, - 0.00611130986205, - 0.00585093197305, - 0.00559018249494, - 0.00532909975552, - 0.00506772206573, - 0.0048060877141, - 0.00454423496126, - 0.00428220203437, - 0.00402002712171, - 0.00375774836712, - 0.00349540386458, - 0.00323303165275, - 0.00297066970955, - 0.00270835594672, - 0.00244612820444, - 0.00218402424594, - 0.00192208175216, - 0.00166033831641, - 0.00139883143902, - 0.0011375985221, - 0.000876676864232, - 0.000616103655219, - 0.000355915970881, - 9.6150767848e-05, - -0.000163155121618, - -0.000421964994766, - -0.000680242283477, - -0.000937950559354, - -0.00119505353879, - -0.001451515088, - -0.00170729922803, - -0.00196237013973, - -0.00221669216868, - -0.00247022983012, - -0.00272294781385, - -0.00297481098902, - -0.00322578440898, - -0.00347583331605, - -0.00372492314627, - -0.00397301953408, - -0.00422008831702, - -0.00446609554033, - -0.00471100746158, - -0.00495479055521, - -0.00519741151703, - -0.00543883726873, - -0.0056790349623, - -0.00591797198441, - -0.00615561596083, - -0.00639193476064, - -0.00662689650062, - -0.00686046954938, - -0.00709262253159, - -0.00732332433213, - -0.00755254410016, - -0.00778025125319, - -0.00800641548107, - -0.00823100674996, - -0.00845399530625, - -0.00867535168039, - -0.00889504669076, - -0.00911305144741, - -0.00932933735576, - -0.00954387612033, - -0.00975663974829, - -0.00996760055309, - -0.010176731158, - -0.0103840044994, - -0.0105893938305, - -0.0107928727245, - -0.010994415078, - -0.011193995114, - -0.0113915873856, - -0.0115871667788, - -0.0117807085155, - -0.011972188157, - -0.0121615816066, - -0.0123488651126, - -0.0125340152715, - -0.0127170090302, - -0.0128978236895, - -0.0130764369063, - -0.0132528266964, - -0.0134269714373, - -0.0135988498703, - -0.0137684411035, - -0.013935724614, - -0.0141006802501, - -0.0142632882339, - -0.0144235291635, - -0.0145813840149, - -0.0147368341447, - -0.0148898612915, - -0.0150404475787, - -0.0151885755156, - -0.0153342280001, - -0.01547738832, - -0.0156180401549, - -0.0157561675782, - -0.0158917550584, - -0.0160247874609, - -0.0161552500494, - -0.0162831284875, - -0.0164084088401, - -0.0165310775749, - -0.0166511215632, - -0.0167685280817, - -0.0168832848134, - -0.0169953798487, - -0.0171048016865, - -0.0172115392354, - -0.017315581814, - -0.0174169191526, - -0.0175155413934, - -0.0176114390914, - -0.0177046032151, - -0.0177950251473, - -0.0178826966852, - -0.0179676100415, - -0.0180497578442, - -0.0181291331376, - -0.018205729382, - -0.0182795404545, - -0.0183505606486, - -0.0184187846751, - -0.0184842076613, - -0.0185468251517, - -0.0186066331076, - -0.018663627907, - -0.0187178063444, - -0.0187691656309, - -0.0188177033933, - -0.0188634176744, - -0.0189063069318, - -0.0189463700384, - -0.0189836062809, - -0.0190180153598, - -0.0190495973886, - -0.0190783528928, - -0.0191042828097, - -0.0191273884869, - -0.0191476716819, - -0.019165134561, - -0.0191797796981, - -0.0191916100738, - -0.0192006290743, - -0.0192068404902, - -0.0192102485151, - -0.0192108577444, - -0.019208673174, - -0.0192037001989, - -0.0191959446114, - -0.0191854126002, - -0.019172110748, - -0.0191560460307, - -0.019137225815, - -0.0191156578573, - -0.0190913503011, - -0.019064311676, - -0.0190345508952, - -0.0190020772536, - -0.0189669004263, - -0.0189290304656, - -0.0188884777999, - -0.0188452532307, - -0.0187993679309, - -0.0187508334422, - -0.0186996616732, - -0.0186458648962, - -0.018589455746, - -0.0185304472161, - -0.0184688526572, - -0.0184046857741, - -0.0183379606233, - -0.0182686916102, - -0.0181968934865, - -0.0181225813473, - -0.0180457706284, - -0.0179664771035, - -0.0178847168812, - -0.0178005064021, - -0.0177138624357, - -0.0176248020776, - -0.0175333427464, - -0.0174395021802, - -0.0173432984341, - -0.0172447498763, - -0.0171438751856, - -0.0170406933473, - -0.0169352236507, - -0.0168274856851, - -0.0167174993368, - -0.0166052847856, - -0.0164908625011, - -0.0163742532394, - -0.0162554780397, - -0.0161345582203, - -0.0160115153753, - -0.015886371371, - -0.015759148342, - -0.0156298686875, - -0.0154985550678, - -0.0153652304004, - -0.0152299178558, - -0.0150926408544, - -0.014953423062, - -0.0148122883862, - -0.0146692609724, - -0.0145243651999, - -0.0143776256777, - -0.0142290672407, - -0.0140787149457, - -0.013926594067, - -0.0137727300928, - -0.0136171487207, - -0.0134598758537, - -0.0133009375959, - -0.0131403602486, - -0.0129781703058, - -0.0128143944503, - -0.0126490595489, - -0.0124821926488, - -0.0123138209728, - -0.0121439719152, - -0.0119726730375, - -0.0117999520641, - -0.0116258368776, - -0.0114503555148, - -0.0112735361623, - -0.0110954071517, - -0.0109159969558, - -0.0107353341836, - -0.0105534475761, - -0.0103703660018, - -0.0101861184524, - -0.010000734038, - -0.00981424198282, - -0.0096266716208, - -0.00943805239082, - -0.00924841383238, - -0.009057785581, - -0.00886619736374, - -0.00867367899463, - -0.00848026037015, - -0.00828597146467, - -0.00809084232593, - -0.00789490307046, - -0.00769818387905, - -0.00750071499217, - -0.00730252670545, - -0.00710364936511, - -0.00690411336337, - -0.00670394913397, - -0.00650318714755, - -0.00630185790711, - -0.00609999194351, - -0.00589761981087, - -0.00569477208207, - -0.00549147934419, - -0.005287772194, - -0.00508368123341, - -0.00487923706501, - -0.0046744702875, - -0.00446941149122, - -0.00426409125368, - -0.00405854013503, - -0.00385278867365, - -0.00364686738162, - -0.00344080674034, - -0.00323463719606, - -0.00302838915545, - -0.00282209298121, - -0.00261577898768, - -0.00240947743644, - -0.00220321853193, - -0.00199703241715, - -0.0017909491693, - -0.00158499879545, - -0.00137921122827, - -0.00117361632174, - -0.000968243846871, - -0.000763123487499, - -0.000558284836041, - -0.000353757389306, - -0.000149570544309, - 5.4246405878e-05, - 0.000257664276264, - 0.000460653994047, - 0.000663186602702, - 0.000865233266042, - 0.00106676527226, - 0.00126775403792, - 0.001468171112, - 0.00166798817976, - 0.00186717706678, - 0.00206570974276, - 0.00226355832549, - 0.00246069508465, - 0.00265709244562, - 0.00285272299329, - 0.00304755947582, - 0.00324157480838, - 0.0034347420768, - 0.0036270345413, - 0.00381842564005, - 0.00400888899286, - 0.00419839840465, - 0.00438692786908, - 0.00457445157196, - 0.00476094389478, - 0.00494637941813, - 0.00513073292507, - 0.00531397940449, - 0.00549609405448, - 0.00567705228553, - 0.00585682972389, - 0.00603540221467, - 0.0062127458251, - 0.00638883684761, - 0.00656365180295, - 0.00673716744322, - 0.00690936075496, - 0.00708020896201, - 0.00724968952856, - 0.00741778016198, - 0.00758445881567, - 0.00774970369194, - 0.0079134932447, - 0.00807580618223, - 0.00823662146987, - 0.00839591833266, - 0.00855367625791, - 0.00870987499782, - 0.00886449457193, - 0.00901751526962, - 0.00916891765255, - 0.009318682557, - 0.00946679109623, - 0.00961322466279, - 0.00975796493071, - 0.00990099385776, - 0.0100422936876, - 0.0101818469517, - 0.0103196364718, - 0.0104556453616, - 0.0105898570287, - 0.0107222551768, - 0.0108528238072, - 0.0109815472212, - 0.0111084100211, - 0.0112333971125, - 0.0113564937059, - 0.0114776853182, - 0.0115969577743, - 0.0117142972088, - 0.0118296900671, - 0.0119431231074, - 0.0120545834016, - 0.0121640583369, - 0.0122715356172, - 0.0123770032637, - 0.0124804496171, - 0.012581863338, - 0.0126812334079, - 0.0127785491311, - 0.0128738001347, - 0.0129669763702, - 0.0130580681141, - 0.0131470659689, - 0.0132339608637, - 0.0133187440552, - 0.0134014071282, - 0.0134819419962, - 0.0135603409024, - 0.0136365964196, - 0.0137107014514, - 0.0137826492319, - 0.0138524333269, - 0.0139200476335, - 0.0139854863808, - 0.0140487441303, - 0.0141098157756, - 0.0141686965429, - 0.0142253819911, - 0.0142798680117, - 0.0143321508288, - 0.0143822269993, - 0.0144300934123, - 0.0144757472895, - 0.0145191861848, - 0.0145604079837, - 0.0145994109037, - 0.0146361934933, - 0.0146707546318, - 0.0147030935293, - 0.0147332097255, - 0.0147611030897, - 0.0147867738197, - 0.0148102224419, - 0.0148314498098, - 0.0148504571039, - 0.0148672458306, - 0.0148818178215, - 0.0148941752325, - 0.0149043205426, - 0.0149122565535, - 0.0149179863882, - 0.01492151349, - 0.0149228416215, - 0.0149219748632, - 0.0149189176127, - 0.0149136745831, - 0.0149062508018, - 0.0148966516095, - 0.0148848826583, - 0.0148709499106, - 0.0148548596377, - 0.0148366184179, - 0.0148162331356, - 0.014793710979, - 0.0147690594391, - 0.0147422863076, - 0.0147133996752, - 0.0146824079301, - 0.0146493197562, - 0.0146141441308, - 0.0145768903233, - 0.014537567893, - 0.0144961866871, - 0.0144527568387, - 0.014407288765, - 0.0143597931649, - 0.0143102810172, - 0.0142587635782, - 0.0142052523797, - 0.0141497592264, - 0.0140922961942, - 0.0140328756275, - 0.013971510137, - 0.0139082125973, - 0.0138429961445, - 0.0137758741737, - 0.0137068603366, - 0.0136359685391, - 0.0135632129385, - 0.0134886079411, - 0.0134121681995, - 0.0133339086102, - 0.0132538443106, - 0.0131719906763, - 0.0130883633188, - 0.0130029780822, - 0.0129158510409, - 0.0128269984963, - 0.0127364369744, - 0.0126441832224, - 0.0125502542063, - 0.012454667108, - 0.0123574393215, - 0.0122585884512, - 0.0121581323077, - 0.0120560889054, - 0.0119524764596, - 0.0118473133826, - 0.0117406182815, - 0.0116324099547, - 0.0115227073883, - 0.0114115297539, - 0.0112988964044, - 0.0111848268714, - 0.0110693408617, - 0.0109524582543, - 0.0108341990967, - 0.0107145836019, - 0.010593632145, - 0.01047136526, - 0.0103478036362, - 0.0102229681148, - 0.0100968796859, - 0.00996955948477, - 0.00984102878837, - 0.00971130901217, - 0.00958042170656, - 0.00944838855339, - 0.00931523136251, - 0.00918097206825, - 0.00904563272599, - 0.00890923550855, - 0.00877180270275, - 0.00863335670582, - 0.00849392002189, - 0.00835351525839, - 0.00821216512255, - 0.00806989241777, - 0.00792672004007, - 0.0077826709745, - 0.00763776829155, - 0.00749203514353, - 0.00734549476097, - 0.00719817044906, - 0.00705008558394, - 0.00690126360918, - 0.00675172803209, - 0.00660150242012, - 0.00645061039723, - 0.00629907564028, - 0.00614692187537, - 0.0059941728742, - 0.00584085245051, - 0.00568698445636, - 0.00553259277856, - 0.00537770133502, - 0.00522233407114, - 0.00506651495617, - 0.00491026797958, - 0.00475361714748, - 0.00459658647899, - 0.00443920000263, - 0.00428148175271, - 0.00412345576575, - 0.00396514607691, - 0.00380657671633, - 0.00364777170567, - 0.00348875505443, - 0.00332955075648, - 0.00317018278645, - 0.00301067509621, - 0.00285105161138, - 0.00269133622772, - 0.00253155280771, - 0.00237172517702, - 0.00221187712101, - 0.00205203238127, - 0.00189221465217, - 0.0017324475774, - 0.00157275474655, - 0.00141315969168, - 0.00125368588395, - 0.00109435673017, - 0.000935195569501, - 0.000776225670052, - 0.000617470225566, - 0.000458952352092, - 0.000300695084686, - 0.000142721374124, - -1.49459163556e-05, - -0.000172284014306, - -0.000329270241292, - -0.000485882016098, - -0.00064209685791, - -0.000797892389482, - -0.000953246340281, - -0.0011081365496, - -0.00126254096966, - -0.0014164376687, - -0.00156980483399, - -0.0017226207749, - -0.00187486392589, - -0.00202651284948, - -0.00217754623923, - -0.00232794292264, - -0.00247768186406, - -0.00262674216761, - -0.00277510307997, - -0.00292274399325, - -0.00306964444775, - -0.00321578413479, - -0.00336114289937, - -0.00350570074298, - -0.00364943782619, - -0.00379233447138, - -0.00393437116533, - -0.00407552856183, - -0.00421578748424, - -0.00435512892804, - -0.00449353406333, - -0.0046309842373, - -0.00476746097669, - -0.00490294599017, - -0.00503742117078, - -0.00517086859821, - -0.00530327054118, - -0.00543460945965, - -0.00556486800717, - -0.005694029033, - -0.00582207558435, - -0.00594899090851, - -0.00607475845497, - -0.00619936187751, - -0.00632278503624, - -0.00644501199958, - -0.00656602704631, - -0.00668581466744, - -0.00680435956815, - -0.00692164666965, - -0.00703766111102, - -0.00715238825101, - -0.00726581366979, - -0.00737792317067, - -0.00748870278182, - -0.00759813875787, - -0.00770621758159, - -0.00781292596539, - -0.00791825085293, - -0.00802217942055, - -0.00812469907881, - -0.00822579747384, - -0.00832546248879, - -0.00842368224515, - -0.00852044510404, - -0.00861573966751, - -0.00870955477979, - -0.00880187952843, - -0.0088927032455, - -0.0089820155087, - -0.00906980614241, - -0.00915606521875, - -0.00924078305861, - -0.00932395023252, - -0.00940555756168, - -0.00948559611876, - -0.00956405722877, - -0.00964093246986, - -0.00971621367409, - -0.00978989292813, - -0.00986196257398, - -0.00993241520957, - -0.0100012436894, - -0.010068441125, - -0.0101340008858, - -0.010197916599, - -0.0102601821506, - -0.0103207916855, - -0.0103797396079, - -0.0104370205819, - -0.0104926295311, - -0.0105465616398, - -0.0105988123523, - -0.0106493773737, - -0.0106982526696, - -0.0107454344666, - -0.0107909192519, - -0.0108347037738, - -0.0108767850412, - -0.0109171603238, - -0.0109558271518, - -0.0109927833162, - -0.0110280268679, - -0.0110615561182, - -0.011093369638, - -0.0111234662577, - -0.011151845067, - -0.0111785054142, - -0.011203446906, - -0.0112266694072, - -0.0112481730397, - -0.0112679581824, - -0.0112860254706, - -0.0113023757953, - -0.0113170103023, - -0.011329930392, - -0.0113411377185, - -0.0113506341885, - -0.0113584219611, - -0.0113645034466, - -0.0113688813056, - -0.0113715584483, - -0.0113725380335, - -0.0113718234675, - -0.0113694184033, - -0.0113653267394, - -0.0113595526187, - -0.0113521004276, - -0.0113429747946, - -0.0113321805893, - -0.011319722921, - -0.0113056071377, - -0.0112898388247, - -0.011272423803, - -0.0112533681286, - -0.0112326780903, - -0.0112103602092, - -0.0111864212364, - -0.0111608681521, - -0.0111337081637, - -0.0111049487047, - -0.0110745974326, - -0.0110426622277, - -0.0110091511913, - -0.0109740726442, - -0.0109374351248, - -0.0108992473872, - -0.0108595184002, - -0.0108182573445, - -0.0107754736119, - -0.0107311768025, - -0.0106853767237, - -0.0106380833877, - -0.0105893070098, - -0.0105390580066, - -0.0104873469937, - -0.0104341847839, - -0.0103795823852, - -0.0103235509988, - -0.0102661020167, - -0.0102072470199, - -0.0101469977763, - -0.0100853662382, - -0.0100223645407, - -0.00995800499893, - -0.00989230010612, - -0.00982526253135, - -0.00975690511725, - -0.00968724087769, - -0.00961628299552, - -0.0095440448202, - -0.00947053986548, - -0.00939578180702, - -0.00931978448002, - -0.00924256187678, - -0.00916412814429, - -0.0090844975818, - -0.00900368463832, - -0.00892170391018, - -0.00883857013852, - -0.00875429820675, - -0.00866890313803, - -0.00858240009277, - -0.00849480436598, - -0.00840613138477, - -0.0083163967057, - -0.0082256160122, - -0.00813380511197, - -0.00804097993428, - -0.0079471565274, - -0.00785235105587, - -0.00775657979786, - -0.0076598591425, - -0.00756220558715, - -0.0074636357347, - -0.00736416629088, - -0.00726381406149, - -0.00716259594969, - -0.00706052895325, - -0.0069576301618, - -0.00685391675402, - -0.00674940599493, - -0.00664411523309, - -0.0065380618978, - -0.00643126349629, - -0.00632373761097, - -0.00621550189659, - -0.00610657407745, - -0.00599697194456, - -0.00588671335282, - -0.00577581621824, - -0.00566429851505, - -0.00555217827293, - -0.00543947357412, - -0.00532620255062, - -0.00521238338136, - -0.00509803428933, - -0.00498317353876, - -0.00486781943227, - -0.00475199030805, - -0.00463570453698, - -0.00451898051985, - -0.00440183668446, - -0.00428429148283, - -0.00416636338834, - -0.00404807089291, - -0.00392943250415, - -0.00381046674258, - -0.00369119213876, - -0.00357162723051, - -0.00345179056005, - -0.00333170067126, - -0.00321137610681, - -0.0030908354054, - -0.00297009709898, - -0.00284917970991, - -0.00272810174827, - -0.00260688170901, - -0.00248553806923, - -0.00236408928543, - -0.00224255379074, - -0.00212094999221, - -0.00199929626807, - -0.00187761096502, - -0.00175591239554, - -0.00163421883514, - -0.00151254851976, - -0.00139091964303, - -0.00126935035365, - -0.00114785875269, - -0.00102646289104, - -0.000905180766705, - -0.000784030322239, - -0.000663029442141, - -0.000542195950273, - -0.000421547607293, - -0.000301102108102, - -0.000180877079311, - -6.08900767178e-05, - 5.88414171986e-05, - 0.000178299995767, - 0.000297468330595, - 0.000416329174024, - 0.000534865361573, - 0.00065305981435, - 0.000770895541463, - 0.000888355642398, - 0.00100542330939, - 0.00112208182976, - 0.00123831458827, - 0.00135410506938, - 0.0014694368596, - 0.0015842936497, - 0.00169865923699, - 0.00181251752755, - 0.0019258525384, - 0.00203864839974, - 0.00215088935706, - 0.00226255977331, - 0.002373644131, - 0.00248412703434, - 0.00259399321123, - 0.00270322751539, - 0.00281181492837, - 0.0029197405615, - 0.00302698965794, - 0.00313354759459, - 0.00323939988403, - 0.00334453217646, - 0.00344893026151, - 0.00355258007017, - 0.00365546767658, - 0.00375757929985, - 0.00385890130582, - 0.00395942020884, - 0.00405912267349, - 0.00415799551627, - 0.00425602570729, - 0.0043532003719, - 0.00444950679233, - 0.00454493240926, - 0.00463946482341, - 0.00473309179709, - 0.00482580125564, - 0.00491758128902, - 0.00500842015315, - 0.00509830627145, - 0.00518722823615, - 0.0052751748097, - 0.00536213492609, - 0.0054480976922, - 0.00553305238904, - 0.00561698847302, - 0.00569989557721, - 0.00578176351245, - 0.0058625822686, - 0.00594234201565, - 0.00602103310479, - 0.00609864606954, - 0.00617517162676, - 0.0062506006777, - 0.00632492430894, - 0.00639813379337, - 0.00647022059115, - 0.00654117635052, - 0.00661099290878, - 0.00667966229299, - 0.00674717672091, - 0.00681352860166, - 0.00687871053653, - 0.00694271531966, - 0.00700553593874, - 0.00706716557566, - 0.00712759760708, - 0.0071868256051, - 0.00724484333775, - 0.00730164476954, - 0.00735722406195, - 0.00741157557392, - 0.00746469386224, - 0.00751657368196, - 0.0075672099868, - 0.00761659792945, - 0.00766473286189, - 0.00771161033565, - 0.0077572261021, - 0.00780157611264, - 0.00784465651886, - 0.00788646367274, - 0.00792699412674, - 0.00796624463391, - 0.00800421214794, - 0.0080408938232, - 0.00807628701473, - 0.00811038927822, - 0.00814319836995, - 0.00817471224667, - 0.00820492906553, - 0.00823384718388, - 0.0082614651591, - 0.00828778174843, - 0.00831279590865, - 0.00833650679586, - 0.0083589137652, - 0.00838001637044, - 0.00839981436369, - 0.00841830769499, - 0.00843549651185, - 0.00845138115887, - 0.00846596217721, - 0.0084792403041, - 0.0084912164723, - 0.00850189180954, - 0.00851126763792, - 0.00851934547329, - 0.00852612702461, - 0.00853161419326, - 0.00853580907234, - 0.00853871394591, - 0.00854033128829, - 0.00854066376321, - 0.00853971422301, - 0.00853748570783, - 0.0085339814447, - 0.00852920484665, - 0.00852315951181, - 0.00851584922244, - 0.00850727794395, - 0.00849744982393, - 0.00848636919107, - 0.00847404055418, - 0.00846046860104, - 0.00844565819734, - 0.00842961438554, - 0.00841234238373, - 0.00839384758443, - 0.00837413555341, - 0.00835321202845, - 0.00833108291811, - 0.00830775430045, - 0.00828323242172, - 0.00825752369508, - 0.00823063469922, - 0.00820257217701, - 0.00817334303414, - 0.00814295433767, - 0.00811141331465, - 0.00807872735061, - 0.00804490398816, - 0.00800995092544, - 0.00797387601463, - 0.00793668726044, - 0.00789839281851, - 0.00785900099389, - 0.00781852023938, - 0.007776959154, - 0.00773432648132, - 0.00769063110777, - 0.00764588206108, - 0.00760008850848, - 0.00755325975507, - 0.00750540524208, - 0.00745653454514, - 0.0074066573725, - 0.0073557835633, - 0.00730392308574, - 0.00725108603533, - 0.00719728263303, - 0.00714252322342, - 0.00708681827288, - 0.00703017836769, - 0.0069726142122, - 0.00691413662689, - 0.0068547565465, - 0.00679448501808, - 0.00673333319912, - 0.00667131235551, - 0.00660843385969, - 0.0065447091886, - 0.00648014992175, - 0.00641476773919, - 0.00634857441954, - 0.00628158183797, - 0.00621380196416, - 0.00614524686028, - 0.00607592867895, - 0.00600585966119, - 0.00593505213432, - 0.00586351850995, - 0.00579127128185, - 0.00571832302391, - 0.00564468638799, - 0.00557037410185, - 0.00549539896707, - 0.00541977385687, - 0.00534351171402, - 0.00526662554873, - 0.00518912843649, - 0.00511103351593, - 0.0050323539867, - 0.0049531031073, - 0.00487329419292, - 0.00479294061331, - 0.00471205579059, - 0.00463065319712, - 0.0045487463533, - 0.0044663488254, - 0.00438347422343, - 0.00430013619891, - 0.00421634844274, - 0.00413212468299, - 0.00404747868274, - 0.0039624242379, - 0.00387697517504, - 0.00379114534917, - 0.00370494864162, - 0.00361839895783, - 0.00353151022516, - 0.00344429639076, - 0.00335677141935, - 0.00326894929106, - 0.00318084399931, - 0.00309246954855, - 0.00300383995219, - 0.00291496923039, - 0.00282587140791, - 0.00273656051196, - 0.00264705057007, - 0.00255735560791, - 0.00246748964719, - 0.00237746670351, - 0.00228730078423, - 0.00219700588636, - 0.00210659599444, - 0.00201608507841, - 0.00192548709155, - 0.00183481596837, - 0.00174408562249, - 0.00165330994462, - 0.00156250280045, - 0.00147167802858, - 0.00138084943849, - 0.00129003080851, - 0.00119923588374, - 0.00110847837405, - 0.00101777195206, - 0.000927130251143, - 0.000836566863416, - 0.000746095337763, - 0.000655729177861, - 0.000565481840216, - 0.000475366732211, - 0.000385397210173, - 0.00029558657744, - 0.000205948082453, - 0.000116494916847, - 2.72402135687e-05, - -6.18029550015e-05, - -0.000150621578911, - -0.000239202712483, - -0.000327533476152, - -0.000415601058283, - -0.000503392716976, - -0.000590895781858, - -0.000678097655861, - -0.000764985816976, - -0.000851547820007, - -0.000937771298294, - -0.00102364396543, - -0.00110915361696, - -0.00119428813204, - -0.00127903547516, - -0.00136338369771, - -0.00144732093969, - -0.00153083543126, - -0.00161391549438, - -0.00169654954435, - -0.00177872609142, - -0.00186043374228, - -0.00194166120163, - -0.00202239727364, - -0.00210263086348, - -0.00218235097876, - -0.00226154673099, - -0.002340207337, - -0.00241832212038, - -0.00249588051282, - -0.00257287205554, - -0.00264928640059, - -0.00272511331222, - -0.00280034266816, - -0.00287496446092, - -0.0029489687991, - -0.00302234590857, - -0.00309508613373, - -0.00316717993875, - -0.00323861790871, - -0.00330939075077, - -0.00337948929535, - -0.00344890449721, - -0.00351762743658, - -0.00358564932022, - -0.00365296148248, - -0.00371955538635, - -0.00378542262447, - -0.00385055492008, - -0.00391494412805, - -0.0039785822358, - -0.00404146136418, - -0.00410357376846, - -0.00416491183913, - -0.00422546810279, - -0.00428523522298, - -0.00434420600097, - -0.00440237337657, - -0.0044597304289, - -0.00451627037709, - -0.00457198658104, - -0.00462687254208, - -0.00468092190366, - -0.004734128452, - -0.0047864861167, - -0.00483798897133, - -0.00488863123404, - -0.00493840726808, - -0.00498731158236, - -0.00503533883192, - -0.00508248381844, - -0.00512874149068, - -0.00517410694493, - -0.00521857542541, - -0.00526214232467, - -0.00530480318391, - -0.0053465536934, - -0.00538738969272, - -0.00542730717108, - -0.00546630226759, - -0.00550437127152, - -0.00554151062248, - -0.00557771691066, - -0.00561298687699, - -0.00564731741326, - -0.0056807055623, - -0.00571314851803, - -0.00574464362558, - -0.00577518838132, - -0.00580478043291, - -0.0058334175793, - -0.00586109777071, - -0.00588781910861, - -0.00591357984562, - -0.0059383783855, - -0.00596221328295, - -0.00598508324355, - -0.00600698712358, - -0.00602792392985, - -0.0060478928195, - -0.00606689309975, - -0.00608492422772, - -0.00610198581009, - -0.00611807760288, - -0.00613319951107, - -0.00614735158833, - -0.00616053403661, - -0.00617274720579, - -0.0061839915933, - -0.00619426784364, - -0.00620357674798, - -0.0062119192437, - -0.00621929641386, - -0.00622570948674, - -0.00623115983528, - -0.00623564897654, - -0.00623917857114, - -0.00624175042263, - -0.00624336647692, - -0.00624402882163, - -0.00624373968541, - -0.00624250143732, - -0.00624031658608, - -0.00623718777939, - -0.0062331178032, - -0.00622810958092, - -0.00622216617268, - -0.00621529077452, - -0.00620748671758, - -0.00619875746729, - -0.00618910662249, - -0.00617853791457, - -0.00616705520661, - -0.00615466249241, - -0.00614136389567, - -0.00612716366892, - -0.00611206619269, - -0.00609607597442, - -0.00607919764757, - -0.00606143597051, - -0.00604279582558, - -0.00602328221797, - -0.00600290027471, - -0.00598165524357, - -0.00595955249199, - -0.00593659750594, - -0.00591279588878, - -0.00588815336019, - -0.00586267575494, - -0.00583636902176, - -0.00580923922213, - -0.00578129252909, - -0.00575253522604, - -0.00572297370548, - -0.00569261446777, - -0.00566146411991, - -0.00562952937422, - -0.00559681704708, - -0.00556333405763, - -0.00552908742648, - -0.00549408427432, - -0.00545833182066, - -0.00542183738246, - -0.00538460837274, - -0.00534665229925, - -0.00530797676305, - -0.00526858945714, - -0.00522849816506, - -0.00518771075945, - -0.00514623520064, - -0.00510407953523, - -0.00506125189459, - -0.00501776049347, - -0.00497361362847, - -0.00492881967664, - -0.00488338709391, - -0.00483732441367, - -0.00479064024524, - -0.00474334327233, - -0.00469544225159, - -0.00464694601102, - -0.0045978634485, - -0.00454820353018, - -0.00449797528898, - -0.00444718782303, - -0.00439585029411, - -0.00434397192607, - -0.00429156200327, - -0.004238629869, - -0.00418518492391, - -0.00413123662438, - -0.00407679448099, - -0.00402186805685, - -0.00396646696606, - -0.00391060087208, - -0.0038542794861, - -0.00379751256547, - -0.00374030991203, - -0.00368268137055, - -0.00362463682704, - -0.00356618620719, - -0.00350733947468, - -0.0034481066296, - -0.00338849770681, - -0.00332852277427, - -0.00326819193145, - -0.00320751530767, - -0.00314650306046, - -0.00308516537395, - -0.00302351245721, - -0.0029615545426, - -0.00289930188419, - -0.00283676475604, - -0.00277395345064, - -0.00271087827725, - -0.00264754956023, - -0.00258397763747, - -0.00252017285871, - -0.00245614558396, - -0.00239190618181, - -0.00232746502788, - -0.00226283250313, - -0.0021980189923, - -0.00213303488227, - -0.00206789056044, - -0.00200259641313, - -0.00193716282401, - -0.00187160017245, - -0.00180591883195, - -0.00174012916856, - -0.00167424153927, - -0.00160826629046, - -0.00154221375632, - -0.00147609425724, - -0.00140991809833, - -0.00134369556777, - -0.00127743693532, - -0.00121115245079, - -0.00114485234243, - -0.00107854681549, - -0.00101224605061, - -0.000945960202385, - -0.000879699397808, - -0.000813473734782, - -0.000747293280638, - -0.00068116807064, - -0.000615108106521, - -0.000549123355009, - -0.000483223746377, - -0.000417419172991, - -0.000351719487875, - -0.000286134503279, - -0.000220673989264, - -0.000155347672292, - -9.0165233825e-05, - -2.51363089403e-05, - 3.972951505e-05, - 0.000104422699965, - 0.00016893375811, - 0.000233253253624, - 0.000297371803811, - 0.000361280080464, - 0.000424968811174, - 0.00048842878063, - 0.000551650831905, - 0.000614625867731, - 0.00067734485176, - 0.000739798809815, - 0.000801978831129, - 0.000863876069563, - 0.000925481744823, - 0.000986787143656, - 0.00104778362103, - 0.00110846260133, - 0.00116881557946, - 0.00122883412204, - 0.00128850986854, - 0.00134783453234, - 0.00140679990187, - 0.00146539784172, - 0.00152362029366, - 0.00158145927772, - 0.00163890689326, - 0.00169595531995, - 0.00175259681884, - 0.00180882373329, - 0.00186462849002, - 0.00192000360003, - 0.00197494165959, - 0.00202943535114, - 0.00208347744424, - 0.00213706079645, - 0.00219017835426, - 0.0022428231539, - 0.00229498832227, - 0.00234666707772, - 0.00239785273091, - 0.0024485386856, - 0.00249871843947, - 0.00254838558486, - 0.00259753380953, - 0.00264615689746, - 0.00269424872948, - 0.00274180328406, - 0.00278881463798, - 0.00283527696696, - 0.00288118454639, - 0.00292653175191, - 0.00297131306006, - 0.00301552304889, - 0.00305915639853, - 0.00310220789178, - 0.00314467241466, - 0.00318654495692, - 0.00322782061261, - 0.00326849458052, - 0.00330856216472, - 0.00334801877498, - 0.00338685992727, - 0.00342508124414, - 0.00346267845515, - 0.00349964739727, - 0.00353598401527, - 0.00357168436207, - 0.00360674459905, - 0.00364116099644, - 0.00367492993356, - 0.00370804789916, - 0.00374051149167, - 0.00377231741943, - 0.00380346250097, - 0.00383394366521, - 0.00386375795165, - 0.00389290251056, - 0.00392137460315, - 0.00394917160169, - 0.00397629098968, - 0.00400273036195, - 0.00402848742472, - 0.00405355999571, - 0.00407794600421, - 0.00410164349108, - 0.0041246506088, - 0.00414696562147, - 0.0041685869048, - 0.00418951294609, - 0.00420974234415, - 0.0042292738093, - 0.00424810616321, - 0.00426623833886, - 0.00428366938042, - 0.00430039844308, - 0.00431642479295, - 0.00433174780686, - 0.00434636697217, - 0.00436028188662, - 0.00437349225805, - 0.00438599790423, - 0.00439779875254, - 0.00440889483977, - 0.00441928631179, - 0.00442897342329, - 0.00443795653742, - 0.00444623612551, - 0.00445381276666, - 0.00446068714744, - 0.00446686006148, - 0.00447233240905, - 0.00447710519671, - 0.00448117953682, - 0.00448455664714, - 0.00448723785037, - 0.00448922457364, - 0.00449051834807, - 0.00449112080824, - 0.00449103369167, - 0.0044902588383, - 0.00448879818995, - 0.00448665378973, - 0.00448382778148, - 0.00448032240918, - 0.00447614001636, - 0.00447128304544, - 0.00446575403713, - 0.00445955562979, - 0.00445269055874, - 0.0044451616556, - 0.00443697184761, - 0.00442812415693, - 0.0044186216999, - 0.00440846768634, - 0.00439766541882, - 0.00438621829188, - 0.00437412979127, - 0.00436140349319, - 0.00434804306349, - 0.00433405225686, - 0.00431943491604, - 0.00430419497098, - 0.00428833643799, - 0.00427186341893, - 0.00425478010032, - 0.00423709075247, - 0.00421879972861, - 0.00419991146401, - 0.00418043047504, - 0.0041603613583, - 0.00413970878966, - 0.00411847752336, - 0.00409667239103, - 0.00407429830076, - 0.00405136023616, - 0.00402786325533, - 0.00400381248993, - 0.00397921314415, - 0.00395407049377, - 0.00392838988506, - 0.00390217673387, - 0.00387543652451, - 0.00384817480879, - 0.00382039720493, - 0.00379210939654, - 0.00376331713154, - 0.00373402622114, - 0.00370424253869, - 0.00367397201871, - 0.0036432206557, - 0.00361199450312, - 0.00358029967225, - 0.00354814233112, - 0.00351552870337, - 0.00348246506715, - 0.003448957754, - 0.00341501314771, - 0.00338063768321, - 0.00334583784538, - 0.00331062016798, - 0.00327499123244, - 0.00323895766676, - 0.0032025261443, - 0.00316570338266, - 0.0031284961425, - 0.00309091122638, - 0.00305295547755, - 0.00301463577883, - 0.00297595905141, - 0.00293693225365, - 0.00289756237991, - 0.00285785645937, - 0.00281782155483, - 0.00277746476151, - 0.00273679320588, - 0.00269581404443, - 0.00265453446252, - 0.00261296167313, - 0.00257110291569, - 0.00252896545488, - 0.00248655657941, - 0.00244388360082, - 0.00240095385231, - 0.00235777468746, - 0.00231435347912, - 0.00227069761815, - 0.00222681451221, - 0.00218271158459, - 0.00213839627298, - 0.00209387602828, - 0.00204915831341, - 0.0020042506021, - 0.00195916037766, - 0.00191389513185, - 0.00186846236363, - 0.00182286957799, - 0.00177712428475, - 0.00173123399738, - 0.00168520623182, - 0.00163904850525, - 0.001592768335, - 0.00154637323728, - 0.00149987072604, - 0.00145326831184, - 0.0014065735006, - 0.00135979379251, - 0.00131293668083, - 0.00126600965076, - 0.00121902017825, - 0.0011719757289, - 0.00112488375678, - 0.00107775170331, - 0.00103058699613, - 0.000983397047952, - 0.000936189255465, - 0.000888970998198, - 0.000841749637416, - 0.000794532515011, - 0.000747326952407, - 0.000700140249461, - 0.000652979683379, - 0.000605852507632, - 0.000558765950884, - 0.000511727215922, - 0.000464743478596, - 0.000417821886764, - 0.000370969559246, - 0.000324193584783, - 0.000277501021005, - 0.000230898893408, - 0.000184394194334, - 0.000137993881964, - 9.17048793164e-05, - 4.55340732537e-05, - -5.1168650228e-07, - -4.64255883466e-05, - -9.22008597593e-05, - -0.000137830768263, - -0.000183308622377, - -0.000228627772554, - -0.000273781612115, - -0.000318763578173, - -0.000363567152545, - -0.000408185862658, - -0.000452613282443, - -0.000496843033219, - -0.000540868784574, - -0.000584684255222, - -0.000628283213866, - -0.00067165948004, - -0.000714806924943, - -0.000757719472267, - -0.00080039109901, - -0.000842815836281, - -0.000884987770091, - -0.000926901042137, - -0.000968549850574, - -0.00100992845078, - -0.00105103115608, - -0.00109185233855, - -0.00113238642965, - -0.00117262792102, - -0.00121257136515, - -0.00125221137608, - -0.00129154263008, - -0.00133055986632, - -0.00136925788753, - -0.00140763156064, - -0.00144567581744, - -0.00148338565516, - -0.00152075613712, - -0.00155778239332, - -0.001594459621, - -0.00163078308527, - -0.00166674811962, - -0.00170235012647, - -0.00173758457776, - -0.00177244701544, - -0.00180693305196, - -0.00184103837082, - -0.00187475872703, - -0.00190808994759, - -0.00194102793194, - -0.00197356865246, - -0.00200570815484, - -0.00203744255853, - -0.00206876805719, - -0.00209968091902, - -0.00213017748723, - -0.00216025418032, - -0.00218990749252, - -0.00221913399408, - -0.00224793033167, - -0.00227629322861, - -0.00230421948527, - -0.00233170597932, - -0.00235874966601, - -0.00238534757846, - -0.00241149682789, - -0.00243719460389, - -0.00246243817465, - -0.00248722488716, - -0.00251155216743, - -0.00253541752065, - -0.00255881853142, - -0.00258175286388, - -0.00260421826188, - -0.00262621254909, - -0.00264773362916, - -0.00266877948584, - -0.00268934818302, - -0.00270943786489, - -0.00272904675597, - -0.0027481731612, - -0.00276681546595, - -0.00278497213611, - -0.00280264171806, - -0.00281982283871, - -0.00283651420549, - -0.00285271460634, - -0.00286842290968, - -0.00288363806436, - -0.00289835909961, - -0.002912585125, - -0.00292631533032, - -0.00293954898552, - -0.00295228544058, - -0.00296452412543, - -0.00297626454979, - -0.00298750630305, - -0.0029982490541, - -0.00300849255118, - -0.0030182366217, - -0.00302748117204, - -0.00303622618738, - -0.00304447173142, - -0.00305221794625, - -0.00305946505202, - -0.00306621334678, - -0.00307246320613, - -0.00307821508302, - -0.00308346950744, - -0.0030882270861, - -0.00309248850218, - -0.00309625451497, - -0.00309952595954, - -0.00310230374643, - -0.00310458886128, - -0.00310638236447, - -0.00310768539075, - -0.00310849914884, - -0.00310882492107, - -0.00310866406295, - -0.00310801800276, - -0.00310688824111, - -0.00310527635056, - -0.00310318397509, - -0.0031006128297, - -0.00309756469995, - -0.00309404144143, - -0.00309004497933, - -0.00308557730792, - -0.00308064049003, - -0.00307523665658, - -0.00306936800599, - -0.00306303680372, - -0.00305624538166, - -0.00304899613761, - -0.00304129153474, - -0.00303313410096, - -0.00302452642842, - -0.00301547117285, - -0.00300597105299, - -0.00299602885002, - -0.00298564740688, - -0.00297482962773, - -0.00296357847723, - -0.00295189698, - -0.00293978821988, - -0.00292725533936, - -0.00291430153887, - -0.00290093007613, - -0.00288714426548, - -0.00287294747717, - -0.00285834313673, - -0.00284333472421, - -0.00282792577351, - -0.00281211987167, - -0.00279592065815, - -0.00277933182411, - -0.00276235711169, - -0.00274500031325, - -0.00272726527065, - -0.00270915587451, - -0.00269067606345, - -0.00267182982331, - -0.00265262118644, - -0.00263305423086, - -0.00261313307957, - -0.00259286189969, - -0.00257224490174, - -0.00255128633882, - -0.00252999050582, - -0.00250836173863, - -0.00248640441333, - -0.00246412294539, - -0.00244152178886, - -0.00241860543557, - -0.00239537841428, - -0.00237184528987, - -0.00234801066255, - -0.00232387916697, - -0.00229945547146, - -0.00227474427712, - -0.00224975031705, - -0.00222447835546, - -0.00219893318685, - -0.00217311963518, - -0.00214704255299, - -0.00212070682055, - -0.00209411734506, - -0.00206727905972, - -0.00204019692294, - -0.00201287591744, - -0.00198532104941, - -0.00195753734763, - -0.00192952986266, - -0.0019013036659, - -0.0018728638488, - -0.00184421552195, - -0.00181536381421, - -0.00178631387189, - -0.00175707085785, - -0.00172763995061, - -0.00169802634356, - -0.001668235244, - -0.00163827187235, - -0.00160814146124, - -0.00157784925466, - -0.00154740050711, - -0.00151680048268, - -0.00148605445426, - -0.00145516770262, - -0.00142414551559, - -0.00139299318717, - -0.00136171601668, - -0.00133031930791, - -0.00129880836825, - -0.00126718850786, - -0.00123546503878, - -0.00120364327413, - -0.00117172852722, - -0.00113972611072, - -0.00110764133583, - -0.00107547951141, - -0.00104324594316, - -0.0010109459328, - -0.000978584777211, - -0.000946167767615, - -0.000913700188757, - -0.000881187318076, - -0.000848634424887, - -0.000816046769567, - -0.00078342960274, - -0.000750788164473, - -0.000718127683471, - -0.000685453376276, - -0.000652770446473, - -0.000620084083895, - -0.00058739946384, - -0.000554721746288, - -0.00052205607512, - -0.000489407577347, - -0.000456781362341, - -0.000424182521075, - -0.000391616125357, - -0.000359087227084, - -0.00032660085749, - -0.000294162026408, - -0.000261775721527, - -0.000229446907663, - -0.000197180526036, - -0.000164981493546, - -0.000132854702062, - -0.000100805017712, - -6.883728018e-05, - -3.69563020144e-05, - -5.16686793417e-06, - 2.65262658519e-05, - 5.81183723229e-05, - 8.96047543157e-05, - 0.000120980745188, - 0.000152241709477, - 0.000183383043545, - 0.000214400176227, - 0.000245288569466, - 0.000276043718938, - 0.000306661154679, - 0.000337136441697, - 0.000367465180579, - 0.000397643008091, - 0.000427665597772, - 0.000457528660516, - 0.000487227945152, - 0.000516759239012, - 0.000546118368493, - 0.000575301199611, - 0.000604303638548, - 0.000633121632187, - 0.000661751168648, - 0.000690188277802, - 0.000718429031791, - 0.000746469545533, - 0.000774305977215, - 0.000801934528788, - 0.000829351446441, - 0.000856553021082, - 0.00088353558879, - 0.000910295531282, - 0.000936829276352, - 0.00096313329831, - 0.000989204118415, - 0.00101503830529, - 0.00104063247534, - 0.00106598329314, - 0.00109108747186, - 0.00111594177362, - 0.00114054300987, - 0.00116488804178, - 0.00118897378056, - 0.00121279718786, - 0.00123635527605, - 0.00125964510861, - 0.00128266380042, - 0.00130540851805, - 0.00132787648013, - 0.00135006495757, - 0.00137197127391, - 0.00139359280555, - 0.00141492698203, - 0.00143597128631, - 0.00145672325497, - 0.00147718047849, - 0.00149734060148, - 0.00151720132286, - 0.00153676039613, - 0.0015560156295, - 0.00157496488615, - 0.00159360608437, - 0.00161193719775, - 0.00162995625534, - 0.00164766134181, - 0.00166505059758, - 0.00168212221897, - 0.00169887445834, - 0.00171530562415, - 0.00173141408115, - 0.0017471982504, - 0.00176265660942, - 0.00177778769224, - 0.00179259008946, - 0.00180706244834, - 0.00182120347283, - 0.00183501192364, - 0.00184848661822, - 0.00186162643085, - 0.0018744302926, - 0.00188689719137, - 0.00189902617188, - 0.00191081633565, - 0.00192226684097, - 0.00193337690288, - 0.00194414579316, - 0.00195457284022, - 0.00196465742909, - 0.00197439900134, - 0.00198379705498, - 0.00199285114443, - 0.00200156088038, - 0.00200992592969, - 0.00201794601532, - 0.00202562091616, - 0.00203295046693, - 0.00203993455804, - 0.00204657313545, - 0.0020528662005, - 0.00205881380975, - 0.00206441607483, - 0.00206967316223, - 0.00207458529315, - 0.00207915274327, - 0.00208337584255, - 0.00208725497506, - 0.00209079057868, - 0.00209398314497, - 0.00209683321885, - 0.0020993413984, - 0.00210150833459, - 0.00210333473103, - 0.00210482134371, - 0.00210596898069, - 0.00210677850188, - 0.00210725081867, - 0.0021073868937, - 0.00210718774053, - 0.0021066544233, - 0.00210578805647, - 0.00210458980443, - 0.00210306088122, - 0.00210120255015, - 0.00209901612346, - 0.00209650296199, - 0.00209366447479, - 0.00209050211876, - 0.00208701739828, - 0.00208321186481, - 0.00207908711654, - 0.00207464479796, - 0.00206988659946, - 0.00206481425696, - 0.00205942955143, - 0.00205373430855, - 0.00204773039824, - 0.0020414197342, - 0.00203480427354, - 0.0020278860163, - 0.00202066700499, - 0.00201314932417, - 0.00200533509996, - 0.00199722649959, - 0.00198882573092, - 0.00198013504198, - 0.00197115672049, - 0.00196189309333, - 0.00195234652613, - 0.00194251942269, - 0.00193241422455, - 0.00192203341043, - 0.00191137949576, - 0.00190045503214, - 0.00188926260685, - 0.00187780484231, - 0.00186608439553, - 0.00185410395763, - 0.00184186625328, - 0.00182937404014, - 0.00181663010836, - 0.00180363728, - 0.00179039840851, - 0.00177691637816, - 0.00176319410345, - 0.00174923452865, - 0.0017350406271, - 0.00172061540079, - 0.00170596187966, - 0.00169108312111, - 0.00167598220942, - 0.00166066225513, - 0.0016451263945, - 0.0016293777889, - 0.00161341962426, - 0.00159725511045, - 0.00158088748071, - 0.00156431999105, - 0.00154755591965, - 0.00153059856631, - 0.00151345125177, - 0.00149611731721, - 0.00147860012357, - 0.00146090305099, - 0.0014430294982, - 0.00142498288191, - 0.00140676663621, - 0.00138838421196, - 0.00136983907621, - 0.00135113471153, - 0.00133227461547, - 0.0013132622999, - 0.00129410129045, - 0.00127479512585, - 0.00125534735733, - 0.00123576154806, - 0.00121604127246, - 0.00119619011565, - 0.00117621167281, - 0.00115610954859, - 0.00113588735647, - 0.00111554871818, - 0.00109509726306, - 0.0010745366275, - 0.00105387045427, - 0.00103310239196, - 0.00101223609435, - 0.000991275219815, - 0.000970223430704, - 0.000949084392761, - 0.000927861774502, - 0.000906559246626, - 0.000885180481408, - 0.000863729152104, - 0.000842208932355, - 0.00082062349559, - 0.000798976514435, - 0.000777271660122, - 0.000755512601896, - 0.000733703006434, - 0.000711846537252, - 0.000689946854132, - 0.000668007612533, - 0.000646032463016, - 0.000624025050671, - 0.00060198901454, - 0.000579927987048, - 0.000557845593439, - 0.000535745451204, - 0.000513631169526, - 0.000491506348718, - 0.000469374579669, - 0.00044723944329, - 0.000425104509963, - 0.000402973339001, - 0.000380849478099, - 0.000358736462801, - 0.000336637815957, - 0.0003145570472, - 0.000292497652411, - 0.000270463113198, - 0.000248456896375, - 0.000226482453445, - 0.000204543220087, - 0.000182642615652, - 0.000160784042652, - 0.000138970886264, - 0.000117206513835, - 9.54942743894e-05, - 7.38374981409e-05, - 5.22394960127e-05, - 3.07035591579e-05, - 9.23295848698e-06, - -1.21690558004e-05, - -3.34992546802e-05, - -5.47544307612e-05, - -7.59313987406e-05, - -9.70269958525e-05, - -0.000118038082311, - -0.000138961541751, - -0.000159794281662, - -0.000180533233813, - -0.000201175354682, - -0.00022171762587, - -0.000242157054515, - -0.0002624906737, - -0.000282715542855, - -0.000302828748152, - -0.000322827402899, - -0.000342708647923, - -0.00036246965195, - -0.000382107611981, - -0.000401619753657, - -0.000421003331628, - -0.000440255629902, - -0.000459373962201, - -0.000478355672307, - -0.000497198134395, - -0.000515898753376, - -0.000534454965213, - -0.000552864237253, - -0.000571124068534, - -0.000589231990099, - -0.000607185565297, - -0.000624982390079, - -0.000642620093289, - -0.000660096336952, - -0.000677408816545, - -0.000694555261275, - -0.000711533434343, - -0.000728341133199, - -0.000744976189801, - -0.000761436470859, - -0.000777719878071, - -0.000793824348364, - -0.000809747854114, - -0.000825488403374, - -0.00084104404008, - -0.000856412844265, - -0.000871592932258, - -0.000886582456879, - -0.000901379607626, - -0.000915982610859, - -0.000930389729971, - -0.000944599265562, - -0.000958609555596, - -0.000972418975559, - -0.000986025938608, - -0.00099942889571, - -0.00101262633578, - -0.00102561678582, - -0.001038398811, - -0.00105097101485, - -0.00106333203929, - -0.00107548056478, - -0.00108741531039, - -0.00109913503392, - -0.00111063853196, - -0.00112192463995, - -0.0011329922323, - -0.00114384022241, - -0.00115446756274, - -0.00116487324486, - -0.00117505629949, - -0.00118501579654, - -0.00119475084516, - -0.00120426059371, - -0.00121354422984, - -0.00122260098046, - -0.00123143011176, - -0.00124003092921, - -0.00124840277755, - -0.00125654504074, - -0.00126445714202, - -0.0012721385438, - -0.00127958874766, - -0.00128680729433, - -0.00129379376362, - -0.00130054777434, - -0.00130706898432, - -0.00131335709025, - -0.00131941182769, - -0.00132523297094, - -0.00133082033299, - -0.00133617376539, - -0.00134129315821, - -0.00134617843989, - -0.00135082957716, - -0.00135524657491, - -0.00135942947607, - -0.00136337836152, - -0.00136709334992, - -0.00137057459756, - -0.00137382229828, - -0.00137683668327, - -0.00137961802092, - -0.00138216661668, - -0.00138448281289, - -0.0013865669886, - -0.0013884195594, - -0.00139004097724, - -0.00139143173024, - -0.00139259234248, - -0.00139352337386, - -0.00139422541981, - -0.00139469911118, - -0.00139494511392, - -0.00139496412898, - -0.00139475689197, - -0.00139432417302, - -0.00139366677649, - -0.00139278554079, - -0.00139168133805, - -0.00139035507397, - -0.00138880768749, - -0.00138704015059, - -0.00138505346798, - -0.00138284867686, - -0.00138042684665, - -0.00137778907871, - -0.00137493650605, - -0.00137187029306, - -0.00136859163521, - -0.00136510175878, - -0.00136140192053, - -0.00135749340742, - -0.00135337753631, - -0.00134905565362, - -0.00134452913508, - -0.00133979938532, - -0.00133486783765, - -0.00132973595365, - -0.00132440522291, - -0.00131887716265, - -0.00131315331741, - -0.0013072352587, - -0.00130112458469, - -0.0012948229198, - -0.00128833191441, - -0.0012816532445, - -0.00127478861126, - -0.00126773974078, - -0.00126050838365, - -0.00125309631462, - -0.00124550533222, - -0.00123773725842, - -0.00122979393819, - -0.00122167723922, - -0.00121338905147, - -0.0012049312868, - -0.00119630587863, - -0.00118751478152, - -0.00117855997077, - -0.00116944344207, - -0.0011601672111, - -0.00115073331312, - -0.00114114380257, - -0.00113140075269, - -0.00112150625513, - -0.00111146241954, - -0.00110127137313, - -0.00109093526033, - -0.00108045624236, - -0.00106983649678, - -0.00105907821716, - -0.0010481836126, - -0.00103715490736, - -0.00102599434043, - -0.00101470416512, - -0.00100328664864, - -0.000991744071719, - -0.000980078728128, - -0.000968292924308, - -0.000956388978937, - -0.000944369222514, - -0.000932235996935, - -0.000919991655076, - -0.000907638560374, - -0.000895179086402, - -0.000882615616449, - -0.000869950543098, - -0.000857186267807, - -0.000844325200481, - -0.000831369759055, - -0.000818322369069, - -0.000805185463248, - -0.000791961481076, - -0.000778652868378, - -0.000765262076897, - -0.000751791563874, - -0.000738243791624, - -0.000724621227117, - -0.000710926341562, - -0.000697161609982, - -0.000683329510798, - -0.000669432525411, - -0.000655473137787, - -0.000641453834036, - -0.000627377102003, - -0.000613245430849, - -0.000599061310639, - -0.000584827231931, - -0.000570545685365, - -0.000556219161253, - -0.000541850149173, - -0.000527441137557, - -0.000512994613291, - -0.00049851306131, - -0.000483998964194, - -0.000469454801768, - -0.000454883050705, - -0.000440286184127, - -0.000425666671209, - -0.00041102697679, - -0.000396369560975, - -0.00038169687875, - -0.000367011379596, - -0.000352315507099, - -0.000337611698569, - -0.000322902384662, - -0.000308189988997, - -0.000293476927781, - -0.000278765609439, - -0.000264058434236, - -0.000249357793915, - -0.000234666071326, - -0.000219985640063, - -0.000205318864105, - -0.000190668097457, - -0.000176035683793, - -0.000161423956104, - -0.000146835236351, - -0.000132271835113, - -0.000117736051247, - -0.000103230171546, - -8.87564704011e-05, - -7.43172094659e-05, - -5.99146373264e-05, - -4.55509891719e-05, - -3.12284864696e-05, - -1.69493366433e-05, - -2.71573275512e-06, - 1.14701468112e-05, - 2.56061386603e-05, - 3.9690094694e-05, - 5.37198824161e-05, - 6.76933852337e-05, - 8.16085027552e-05, - 9.54631510833e-05, - 0.000109255263107, - 0.000122982788785, - 0.000136643695435, - 0.000150235968004, - 0.000163757609352, - 0.00017720664052, - 0.000190581100996, - 0.000203879048981, - 0.000217098561651, - 0.000230237735407, - 0.000243294686134, - 0.000256267549441, - 0.000269154480914, - 0.000281953656348, - 0.000294663271987, - 0.000307281544752, - 0.000319806712475, - 0.000332237034114, - 0.000344570789978, - 0.000356806281939, - 0.000368941833644, - 0.00038097579072, - 0.000392906520978, - 0.000404732414607, - 0.000416451884371, - 0.000428063365798, - 0.000439565317361, - 0.000450956220661, - 0.000462234580605, - 0.000473398925571, - 0.000484447807581, - 0.000495379802462, - 0.000506193510001, - 0.000516887554104, - 0.000527460582941, - 0.00053791126909, - 0.000548238309683, - 0.000558440426534, - 0.000568516366277, - 0.000578464900485, - 0.0005882848258, - 0.000597974964047, - 0.000607534162344, - 0.000616961293216, - 0.000626255254693, - 0.000635414970416, - 0.000644439389726, - 0.000653327487755, - 0.000662078265515, - 0.000670690749975, - 0.000679163994142, - 0.000687497077127, - 0.000695689104216, - 0.000703739206935, - 0.000711646543101, - 0.000719410296885, - 0.000727029678852, - 0.000734503926012, - 0.000741832301859, - 0.000749014096404, - 0.000756048626207, - 0.000762935234404, - 0.000769673290732, - 0.00077626219154, - 0.000782701359808, - 0.000788990245151, - 0.000795128323828, - 0.000801115098738, - 0.000806950099416, - 0.000812632882025, - 0.000818163029342, - 0.000823540150738, - 0.00082876388216, - 0.000833833886101, - 0.000838749851571, - 0.000843511494059, - 0.000848118555498, - 0.000852570804216, - 0.000856868034893, - 0.000861010068504, - 0.000864996752268, - 0.00086882795958, - 0.000872503589955, - 0.000876023568952, - 0.000879387848104, - 0.00088259640484, - 0.000885649242404, - 0.000888546389773, - 0.00089128790156, - 0.000893873857928, - 0.000896304364493, - 0.000898579552216, - 0.000900699577304, - 0.000902664621102, - 0.000904474889974, - 0.000906130615194, - 0.00090763205282, - 0.000908979483574, - 0.000910173212712, - 0.000911213569893, - 0.000912100909044, - 0.000912835608224, - 0.000913418069478, - 0.000913848718693, - 0.000914128005449, - 0.000914256402867, - 0.000914234407451, - 0.00091406253893, - 0.000913741340096, - 0.000913271376634, - 0.000912653236959, - 0.000911887532036, - 0.00091097489521, - 0.000909915982024, - 0.000908711470038, - 0.000907362058645, - 0.000905868468877, - 0.000904231443223, - 0.000902451745426, - 0.000900530160292, - 0.000898467493487, - 0.000896264571334, - 0.00089392224061, - 0.000891441368334, - 0.00088882284156, - 0.000886067567159, - 0.000883176471607, - 0.000880150500763, - 0.000876990619648, - 0.000873697812223, - 0.00087027308116, - 0.000866717447616, - 0.000863031950999, - 0.000859217648739, - 0.000855275616047, - 0.000851206945681, - 0.000847012747706, - 0.000842694149249, - 0.000838252294257, - 0.000833688343253, - 0.000829003473083, - 0.000824198876669, - 0.000819275762758, - 0.000814235355666, - 0.000809078895024, - 0.000803807635518, - 0.000798422846636, - 0.000792925812401, - 0.000787317831114, - 0.000781600215085, - 0.000775774290375, - 0.000769841396521, - 0.000763802886277, - 0.000757660125337, - 0.00075141449207, - 0.000745067377243, - 0.000738620183755, - 0.000732074326355, - 0.000725431231373, - 0.000718692336441, - 0.000711859090216, - 0.000704932952102, - 0.000697915391971, - 0.000690807889883, - 0.000683611935807, - 0.000676329029337, - 0.00066896067941, - 0.000661508404025, - 0.00065397372996, - 0.000646358192484, - 0.00063866333508, - 0.000630890709153, - 0.000623041873747, - 0.000615118395261, - 0.000607121847164, - 0.000599053809705, - 0.00059091586963, - 0.000582709619892, - 0.00057443665937, - 0.000566098592578, - 0.000557697029379, - 0.000549233584701, - 0.000540709878247, - 0.000532127534209, - 0.000523488180987, - 0.000514793450897, - 0.000506044979887, - 0.000497244407253, - 0.000488393375355, - 0.000479493529329, - 0.000470546516805, - 0.000461553987625, - 0.000452517593557, - 0.000443438988015, - 0.000434319825776, - 0.000425161762699, - 0.000415966455446, - 0.000406735561202, - 0.000397470737394, - 0.000388173641419, - 0.00037884593036, - 0.000369489260716, - 0.000360105288123, - 0.000350695667083, - 0.000341262050691, - 0.00033180609036, - 0.000322329435555, - 0.000312833733523, - 0.000303320629022, - 0.000293791764058, - 0.000284248777617, - 0.000274693305402, - 0.000265126979573, - 0.000255551428481, - 0.000245968276412, - 0.00023637914333, - 0.000226785644616, - 0.000217189390816, - 0.000207591987391, - 0.00019799503446, - 0.000188400126551, - 0.000178808852357, - 0.000169222794488, - 0.000159643529224, - 0.000150072626276, - 0.000140511648543, - 0.000130962151875, - 0.000121425684837, - 0.000111903788471, - 0.000102397996067, - 9.29098329314e-05, - 8.34408161564e-05, - 7.3992454397e-05, - 6.45662476449e-05, - 5.51636870073e-05, - 4.57862544868e-05, - 3.64354227641e-05, - 2.71126549829e-05, - 1.7819404537e-05, - 8.55711486014e-06, - -6.72780782418e-07, - -9.86885950005e-06, - -1.90297089793e-05, - -2.8153927685e-05, - -3.72401250583e-05, - -4.62869217137e-05, - -5.52929496311e-05, - -6.42568523468e-05, - -7.31772851421e-05, - -8.2052915229e-05, - -9.08824219326e-05, - -9.96644968714e-05, - -0.000108397844136, - -0.000117081180463, - -0.000125713235407, - -0.000134292751512, - -0.000142818484477, - -0.000151289203317, - -0.00015970369053, - -0.000168060742252, - -0.000176359168413, - -0.00018459779289, - -0.000192775453657, - -0.000200891002931, - -0.000208943307317, - -0.00021693124795, - -0.000224853720632, - -0.000232709635969, - -0.000240497919501, - -0.000248217511833, - -0.000255867368761, - -0.000263446461397, - -0.000270953776288, - -0.000278388315534, - -0.000285749096901, - -0.000293035153937, - -0.000300245536075, - -0.00030737930874, - -0.000314435553456, - -0.000321413367938, - -0.000328311866194, - -0.000335130178614, - -0.000341867452065, - -0.000348522849973, - -0.000355095552409, - -0.000361584756172, - -0.000367989674863, - -0.000374309538962, - -0.000380543595901, - -0.000386691110126, - -0.000392751363173, - -0.000398723653719, - -0.000404607297649, - -0.00041040162811, - -0.000416105995562, - -0.000421719767831, - -0.000427242330154, - -0.000432673085221, - -0.000438011453219, - -0.00044325687187, - -0.00044840879646, - -0.000453466699875, - -0.00045843007263, - -0.000463298422891, - -0.000468071276497, - -0.000472748176982, - -0.00047732868559, - -0.000481812381287, - -0.000486198860771, - -0.000490487738481, - -0.000494678646598, - -0.000498771235046, - -0.000502765171494, - -0.000506660141347, - -0.000510455847737, - -0.000514152011516, - -0.00051774837124, - -0.00052124468315, - -0.000524640721155, - -0.000527936276809, - -0.000531131159284, - -0.000534225195341, - -0.000537218229301, - -0.000540110123008, - -0.000542900755794, - -0.000545590024436, - -0.000548177843117, - -0.000550664143377, - -0.000553048874068, - -0.000555332001298, - -0.000557513508382, - -0.000559593395784, - -0.000561571681055, - -0.000563448398772, - -0.000565223600479, - -0.000566897354608, - -0.000568469746422, - -0.000569940877933, - -0.00057131086783, - -0.000572579851402, - -0.000573747980457, - -0.000574815423239, - -0.000575782364341, - -0.000576649004621, - -0.000577415561109, - -0.000578082266915, - -0.000578649371134, - -0.000579117138747, - -0.000579485850525, - -0.00057975580292, - -0.00057992730797, - -0.000580000693182, - -0.000579976301432, - -0.000579854490847, - -0.000579635634695, - -0.000579320121268, - -0.000578908353766, - -0.000578400750173, - -0.000577797743141, - -0.00057709977986, - -0.000576307321935, - -0.000575420845258, - -0.000574440839876, - -0.000573367809861, - -0.000572202273174, - -0.00057094476153, - -0.00056959582026, - -0.000568156008172, - -0.000566625897409, - -0.000565006073305, - -0.000563297134242, - -0.000561499691501, - -0.000559614369115, - -0.000557641803719, - -0.000555582644397, - -0.000553437552531, - -0.000551207201643, - -0.000548892277243, - -0.000546493476666, - -0.000544011508917, - -0.000541447094507, - -0.000538800965293, - -0.000536073864315, - -0.000533266545627, - -0.000530379774136, - -0.000527414325431, - -0.000524370985616, - -0.00052125055114, - -0.000518053828623, - -0.000514781634689, - -0.000511434795788, - -0.000508014148024, - -0.000504520536979, - -0.000500954817537, - -0.000497317853705, - -0.000493610518435, - -0.000489833693447, - -0.000485988269046, - -0.000482075143942, - -0.000478095225069, - -0.000474049427401, - -0.000469938673769, - -0.000465763894677, - -0.000461526028119, - -0.000457226019391, - -0.000452864820906, - -0.000448443392008, - -0.000443962698785, - -0.000439423713879, - -0.000434827416302, - -0.000430174791245, - -0.000425466829888, - -0.000420704529214, - -0.000415888891817, - -0.000411020925712, - -0.000406101644146, - -0.000401132065408, - -0.000396113212637, - -0.000391046113631, - -0.000385931800657, - -0.00038077131026, - -0.000375565683073, - -0.000370315963621, - -0.000365023200138, - -0.000359688444369, - -0.00035431275138, - -0.000348897179371, - -0.00034344278948, - -0.000337950645597, - -0.00033242181417, - -0.000326857364016, - -0.000321258366133, - -0.000315625893506, - -0.000309961020921, - -0.000304264824775, - -0.000298538382886, - -0.000292782774309, - -0.000286999079142, - -0.000281188378344, - -0.000275351753543, - -0.000269490286856, - -0.000263605060698, - -0.000257697157599, - -0.000251767660019, - -0.000245817650165, - -0.000239848209807, - -0.000233860420093, - -0.000227855361374, - -0.000221834113015, - -0.000215797753221, - -0.000209747358853, - -0.000203684005254, - -0.000197608766067, - -0.000191522713062, - -0.000185426915957, - -0.000179322442244, - -0.000173210357019, - -0.000167091722802, - -0.00016096759937, - -0.000154839043587, - -0.000148707109232, - -0.000142572846829, - -0.000136437303484, - -0.000130301522717, - -0.000124166544293, - -0.000118033404064, - -0.000111903133805, - -0.00010577676105, - -9.96553089327e-05, - -9.35397960311e-05, - -8.74312362065e-05, - -8.13306384484e-05, - -7.52390067207e-05, - -6.91573398073e-05, - -6.30866311606e-05, - -5.70278687522e-05, - -5.09820349219e-05, - -4.49501062325e-05, - -3.89330533213e-05, - -3.29318407579e-05, - -2.69474269003e-05, - -2.09807637537e-05, - -1.50327968305e-05, - -9.10446501279e-06, - -3.19670041504e-06, - 2.68957175054e-06, - 8.55343330697e-06, - 1.43939732441e-05, - 2.02102878492e-05, - 2.6001480834e-05, - 3.17666634625e-05, - 3.75049546746e-05, - 4.32154812096e-05, - 4.88973777275e-05, - 5.45497869281e-05, - 6.01718596689e-05, - 6.5762755081e-05, - 7.13216406827e-05, - 7.68476924924e-05, - 8.2340095138e-05, - 8.77980419663e-05, - 9.32207351494e-05, - 9.86073857882e-05, - 0.000103957214017, - 0.000109269449104, - 0.000114543329549, - 0.000119778103181, - 0.000124973027255, - 0.000130127368543, - 0.000135240403427, - 0.000140311417985, - 0.000145339708084, - 0.000150324579458, - 0.000155265347798, - 0.000160161338829, - 0.000165011888391, - 0.000169816342517, - 0.000174574057505, - 0.000179284399995, - 0.000183946747039, - 0.000188560486168, - 0.000193125015462, - 0.000197639743613, - 0.000202104089992, - 0.000206517484702, - 0.000210879368646, - 0.000215189193577, - 0.000219446422157, - 0.000223650528008, - 0.00022780099576, - 0.000231897321108, - 0.000235939010846, - 0.000239925582924, - 0.000243856566481, - 0.000247731501891, - 0.000251549940797, - 0.000255311446152, - 0.000259015592248, - 0.000262661964751, - 0.000266250160731, - 0.000269779788689, - 0.000273250468581, - 0.000276661831846, - 0.000280013521424, - 0.000283305191778, - 0.00028653650891, - 0.000289707150377, - 0.000292816805305, - 0.0002958651744, - 0.000298851969956, - 0.000301776915866, - 0.000304639747625, - 0.000307440212333, - 0.000310178068695, - 0.000312853087027, - 0.000315465049244, - 0.000318013748863, - 0.000320498990991, - 0.000322920592322, - 0.00032527838112, - 0.000327572197212, - 0.000329801891971, - 0.000331967328298, - 0.000334068380608, - 0.000336104934807, - 0.000338076888269, - 0.000339984149814, - 0.000341826639681, - 0.000343604289502, - 0.000345317042267, - 0.000346964852301, - 0.000348547685224, - 0.000350065517915, - 0.000351518338483, - 0.00035290614622, - 0.000354228951562, - 0.00035548677605, - 0.000356679652285, - 0.000357807623879, - 0.00035887074541, - 0.000359869082371, - 0.000360802711121, - 0.000361671718833, - 0.000362476203434, - 0.000363216273556, - 0.000363892048474, - 0.000364503658046, - 0.000365051242657, - 0.000365534953151, - 0.000365954950768, - 0.000366311407083, - 0.000366604503931, - 0.000366834433345, - 0.00036700139748, - 0.000367105608548, - 0.000367147288739, - 0.000367126670146, - 0.000367043994693, - 0.000366899514057, - 0.000366693489583, - 0.000366426192212, - 0.000366097902392, - 0.000365708909999, - 0.000365259514251, - 0.000364750023625, - 0.000364180755765, - 0.000363552037397, - 0.000362864204239, - 0.00036211760091, - 0.000361312580837, - 0.000360449506163, - 0.000359528747652, - 0.000358550684595, - 0.00035751570471, - 0.000356424204047, - 0.000355276586889, - 0.000354073265649, - 0.000352814660774, - 0.000351501200639, - 0.000350133321444, - 0.000348711467114, - 0.000347236089187, - 0.000345707646718, - 0.00034412660616, - 0.000342493441268, - 0.000340808632982, - 0.000339072669322, - 0.000337286045274, - 0.000335449262684, - 0.000333562830142, - 0.000331627262871, - 0.000329643082611, - 0.000327610817509, - 0.000325531002003, - 0.000323404176703, - 0.00032123088828, - 0.000319011689344, - 0.000316747138332, - 0.000314437799386, - 0.000312084242236, - 0.00030968704208, - 0.000307246779465, - 0.000304764040169, - 0.000302239415074, - 0.000299673500054, - 0.000297066895846, - 0.000294420207932, - 0.000291734046415, - 0.000289009025897, - 0.000286245765356, - 0.000283444888025, - 0.000280607021264, - 0.000277732796439, - 0.000274822848797, - 0.000271877817343, - 0.000268898344713, - 0.000265885077054, - 0.000262838663893, - 0.000259759758016, - 0.000256649015342, - 0.000253507094797, - 0.000250334658193, - 0.000247132370094, - 0.000243900897699, - 0.000240640910714, - 0.000237353081225, - 0.000234038083573, - 0.000230696594233, - 0.000227329291683, - 0.000223936856282, - 0.000220519970145, - 0.000217079317019, - 0.000213615582156, - 0.00021012945219, - 0.000206621615014, - 0.000203092759654, - 0.000199543576146, - 0.000195974755414, - 0.000192386989145, - 0.000188780969666, - 0.000185157389824, - 0.000181516942861, - 0.000177860322293, - 0.000174188221791, - 0.000170501335057, - 0.000166800355704, - 0.00016308597714, - 0.00015935889244, - 0.000155619794236, - 0.000151869374593, - 0.000148108324893, - 0.000144337335715, - 0.000140557096721, - 0.000136768296541, - 0.00013297162265, - 0.000129167761263, - 0.00012535739721, - 0.000121541213833, - 0.000117719892863, - 0.000113894114313, - 0.000110064556365, - 0.000106231895261, - 0.000102396805189, - 9.85599581742e-05, - 9.47220239738e-05, - 9.08836699653e-05, - 8.70455610408e-05, - 8.32083595008e-05, - 7.93727249482e-05, - 7.55393141839e-05, - 7.17087811037e-05, - 6.78817765943e-05, - 6.40589484322e-05, - 6.02409411821e-05, - 5.64283960973e-05, - 5.26219510201e-05, - 4.88222402837e-05, - 4.50298946152e-05, - 4.12455410392e-05, - 3.74698027823e-05, - 3.37032991792e-05, - 2.99466455791e-05, - 2.62004532543e-05, - 2.24653293078e-05, - 1.87418765842e-05, - 1.50306935809e-05, - 1.13323743589e-05, - 7.6475084575e-06, - 3.97668080754e-06, - 3.20471647219e-07, - -3.32054356145e-06, - -6.94579421467e-06, - -1.05547146489e-05, - -1.41467442196e-05, - -1.77213273811e-05, - -2.12779137638e-05, - -2.48159582505e-05, - -2.83349210526e-05, - -3.18342677823e-05, - -3.53134695275e-05, - -3.87720029225e-05, - -4.22093502181e-05, - -4.56249993508e-05, - -4.90184440116e-05, - -5.23891837116e-05, - -5.57367238476e-05, - -5.90605757664e-05, - -6.23602568284e-05, - -6.56352904671e-05, - -6.88852062514e-05, - -7.21095399436e-05, - -7.53078335576e-05, - -7.84796354136e-05, - -8.16245001958e-05, - -8.47419890042e-05, - -8.78316694075e-05, - -9.08931154942e-05, - -9.39259079227e-05, - -9.6929633969e-05, - -9.99038875742e-05, - -0.000102848269391, - -0.000105762386825, - -0.000108645854083, - -0.000111498292211, - -0.000114319329133, - -0.000117108599694, - -0.000119865745697, - -0.000122590415936, - -0.000125282266234, - -0.000127940959476, - -0.00013056616564, - -0.000133157561829, - -0.0001357148323, - -0.000138237668492, - -0.000140725769054, - -0.000143178839868, - -0.000145596594075, - -0.000147978752097, - -0.000150325041656, - -0.0001526351978, - -0.000154908962915, - -0.000157146086746, - -0.000159346326411, - -0.000161509446417, - -0.000163635218672, - -0.000165723422498, - -0.000167773844639, - -0.000169786279272, - -0.000171760528018, - -0.000173696399939, - -0.000175593711555, - -0.000177452286839, - -0.000179271957221, - -0.000181052561593, - -0.000182793946305, - -0.000184495965165, - -0.000186158479437, - -0.000187781357834, - -0.000189364476516, - -0.000190907719081, - -0.000192410976557, - -0.000193874147396, - -0.000195297137459, - -0.000196679860008, - -0.000198022235689, - -0.000199324192522, - -0.000200585665883, - -0.000201806598486, - -0.00020298694037, - -0.000204126648873, - -0.000205225688618, - -0.000206284031486, - -0.000207301656598, - -0.000208278550285, - -0.00020921470607, - -0.000210110124636, - -0.000210964813802, - -0.000211778788489, - -0.000212552070699, - -0.000213284689476, - -0.000213976680876, - -0.000214628087937, - -0.000215238960641, - -0.00021580935588, - -0.00021633933742, - -0.000216828975861, - -0.000217278348603, - -0.0002176875398, - -0.000218056640326, - -0.000218385747728, - -0.000218674966185, - -0.000218924406467, - -0.000219134185884, - -0.000219304428246, - -0.000219435263814, - -0.00021952682925, - -0.000219579267574, - -0.000219592728109, - -0.000219567366432, - -0.000219503344325, - -0.000219400829719, - -0.000219259996642, - -0.000219081025167, - -0.000218864101355, - -0.000218609417197, - -0.000218317170564, - -0.000217987565141, - -0.000217620810375, - -0.000217217121415, - -0.000216776719048, - -0.000216299829644, - -0.00021578668509, - -0.00021523752273, - -0.000214652585303, - -0.000214032120876, - -0.000213376382784, - -0.000212685629562, - -0.000211960124878, - -0.000211200137472, - -0.000210405941083, - -0.000209577814387, - -0.000208716040923, - -0.000207820909028, - -0.000206892711767, - -0.000205931746863, - -0.000204938316623, - -0.000203912727874, - -0.000202855291884, - -0.000201766324295, - -0.000200646145046, - -0.000199495078304, - -0.000198313452389, - -0.000197101599696, - -0.000195859856629, - -0.000194588563516, - -0.000193288064541, - -0.000191958707666, - -0.000190600844553, - -0.000189214830491, - -0.000187801024315, - -0.000186359788332, - -0.000184891488243, - -0.000183396493063, - -0.000181875175046, - -0.000180327909604, - -0.000178755075229, - -0.000177157053415, - -0.000175534228578, - -0.000173886987977, - -0.000172215721632, - -0.00017052082225, - -0.000168802685138, - -0.000167061708129, - -0.000165298291496, - -0.000163512837878, - -0.000161705752193, - -0.000159877441563, - -0.000158028315229, - -0.000156158784472, - -0.000154269262534, - -0.000152360164534, - -0.000150431907388, - -0.000148484909728, - -0.000146519591825, - -0.000144536375501, - -0.000142535684053, - -0.000140517942171, - -0.000138483575859, - -0.00013643301235, - -0.000134366680029, - -0.000132285008353, - -0.000130188427766, - -0.000128077369625, - -0.000125952266115, - -0.000123813550172, - -0.000121661655401, - -0.000119497015997, - -0.000117320066668, - -0.000115131242552, - -0.000112930979141, - -0.000110719712201, - -0.000108497877693, - -0.000106265911697, - -0.000104024250331, - -0.000101773329675, - -9.95135856952e-05, - -9.72454541639e-05, - -9.49693705847e-05, - -9.26857701153e-05, - -9.03950874922e-05, - -8.80977569551e-05, - -8.57942121704e-05, - -8.34848861582e-05, - -8.11702112158e-05, - -7.88506188454e-05, - -7.65265396796e-05, - -7.41984034076e-05, - -7.18666387045e-05, - -6.95316731563e-05, - -6.719393319e-05, - -6.4853844002e-05, - -6.25118294866e-05, - -6.01683121657e-05, - -5.78237131195e-05, - -5.54784519171e-05, - -5.31329465472e-05, - -5.07876133502e-05, - -4.84428669509e-05, - -4.60991201909e-05, - -4.37567840621e-05, - -4.14162676403e-05, - -3.90779780211e-05, - -3.67423202539e-05, - -3.44096972784e-05, - -3.2080509861e-05, - -2.9755156532e-05, - -2.74340335229e-05, - -2.5117534705e-05, - -2.28060515288e-05, - -2.04999729634e-05, - -1.81996854367e-05, - -1.59055727771e-05, - -1.36180161547e-05, - -1.13373940243e-05, - -9.06408206736e-06, - -6.79845313778e-06, - -4.54087720514e-06, - -2.29172130051e-06, - -5.13494620158e-08, - 2.17987731754e-06, - 4.40160114357e-06, - 6.61346727127e-06, - 8.81512415651e-06, - 1.10062235066e-05, - 1.31864203285e-05, - 1.53553729785e-05, - 1.75127432089e-05, - 1.96581962165e-05, - 2.17914006874e-05, - 2.39120288431e-05, - 2.60197564854e-05, - 2.81142630394e-05, - 3.01952315971e-05, - 3.22623489589e-05, - 3.43153056761e-05, - 3.63537960901e-05, - 3.83775183728e-05, - 4.03861745651e-05, - 4.23794706153e-05, - 4.43571164156e-05, - 4.63188258388e-05, - 4.8264316774e-05, - 5.01933111601e-05, - 5.21055350209e-05, - 5.40007184967e-05, - 5.58785958772e-05, - 5.77389056322e-05, - 5.95813904418e-05, - 6.14057972259e-05, - 6.32118771725e-05, - 6.49993857655e-05, - 6.67680828118e-05, - 6.85177324661e-05, - 7.02481032568e-05, - 7.19589681103e-05, - 7.3650104373e-05, - 7.53212938347e-05, - 7.69723227498e-05, - 7.86029818577e-05, - 8.02130664025e-05, - 8.18023761517e-05, - 8.33707154146e-05, - 8.49178930588e-05, - 8.64437225261e-05, - 8.79480218484e-05, - 8.94306136621e-05, - 9.08913252208e-05, - 9.23299884082e-05, - 9.37464397508e-05, - 9.51405204267e-05, - 9.65120762776e-05, - 9.78609578167e-05, - 9.91870202373e-05, - 0.00010049012342, - 0.000101770131938, - 0.000103026915067, - 0.000104260346783, - 0.000105470305773, - 0.000106656675432, - 0.00010781934387, - 0.00010895820391, - 0.000110073153092, - 0.000111164093668, - 0.000112230932602, - 0.000113273581572, - 0.000114291956962, - 0.000115285979859, - 0.000116255576052, - 0.000117200676021, - 0.000118121214936, - 0.000119017132645, - 0.000119888373671, - 0.000120734887199, - 0.00012155662707, - 0.000122353551765, - 0.000123125624403, - 0.00012387281272, - 0.00012459508906, - 0.000125292430364, - 0.00012596481815, - 0.000126612238503, - 0.000127234682056, - 0.000127832143977, - 0.000128404623946, - 0.000128952126143, - 0.000129474659224, - 0.000129972236305, - 0.00013044487494, - 0.0001308925971, - 0.000131315429153, - 0.000131713401838, - 0.000132086550247, - 0.000132434913794, - 0.000132758536198, - 0.000133057465453, - 0.000133331753804, - 0.000133581457718, - 0.000133806637861, - 0.000134007359067, - 0.000134183690308, - 0.00013433570467, - 0.000134463479318, - 0.00013456709547, - 0.000134646638361, - 0.000134702197216, - 0.000134733865215, - 0.00013474173946, - 0.000134725920945, - 0.000134686514516, - 0.000134623628844, - 0.000134537376382, - 0.000134427873336, - 0.000134295239624, - 0.000134139598843, - 0.000133961078228, - 0.000133759808617, - 0.000133535924411, - 0.000133289563539, - 0.000133020867412, - 0.00013272998089, - 0.000132417052235, - 0.000132082233079, - 0.000131725678375, - 0.000131347546358, - 0.000130947998505, - 0.000130527199491, - 0.000130085317144, - 0.000129622522407, - 0.000129138989288, - 0.000128634894822, - 0.000128110419021, - 0.000127565744835, - 0.000127001058101, - 0.000126416547503, - 0.000125812404522, - 0.00012518882339, - 0.000124546001049, - 0.000123884137095, - 0.000123203433741, - 0.000122504095762, - 0.000121786330449, - 0.000121050347565, - 0.000120296359292, - 0.000119524580186, - 0.000118735227124, - 0.000117928519261, - 0.000117104677976, - 0.000116263926824, - 0.00011540649149, - 0.000114532599733, - 0.000113642481339, - 0.000112736368074, - 0.000111814493629, - 0.000110877093571, - 0.000109924405294, - 0.000108956667967, - 0.000107974122484, - 0.000106977011411, - 0.000105965578938, - 0.000104940070826, - 0.000103900734356, - 0.000102847818276, - 0.000101781572756, - 0.000100702249328, - 9.96101008408e-05, - 9.85053814058e-05, - 9.7388346346e-05, - 9.6259252145e-05, - 9.51183563944e-05, - 9.39659177435e-05, - 9.28021958467e-05, - 9.16274513127e-05, - 9.0441945653e-05, - 8.92459412297e-05, - 8.8039701205e-05, - 8.68234894894e-05, - 8.55975706908e-05, - 8.43622100627e-05, - 8.31176734536e-05, - 8.1864227256e-05, - 8.06021383549e-05, - 7.9331674078e-05, - 7.80531021443e-05, - 7.67666906133e-05, - 7.54727078354e-05, - 7.41714224012e-05, - 7.28631030913e-05, - 7.15480188265e-05, - 7.0226438618e-05, - 6.88986315179e-05, - 6.75648665698e-05, - 6.62254127591e-05, - 6.4880538965e-05, - 6.35305139107e-05, - 6.21756061155e-05, - 6.08160838461e-05, - 5.94522150686e-05, - 5.80842674011e-05, - 5.6712508065e-05, - 5.53372038391e-05, - 5.39586210114e-05, - 5.2577025333e-05, - 5.1192681971e-05, - 4.9805855463e-05, - 4.84168096706e-05, - 4.70258077341e-05, - 4.56331120272e-05, - 4.42389841118e-05, - 4.28436846936e-05, - 4.14474735783e-05, - 4.0050609626e-05, - 3.86533507095e-05, - 3.72559536701e-05, - 3.58586742747e-05, - 3.44617671733e-05, - 3.30654858571e-05, - 3.16700826166e-05, - 3.02758085003e-05, - 2.88829132735e-05, - 2.74916453776e-05, - 2.61022518907e-05, - 2.47149784868e-05, - 2.33300693971e-05, - 2.19477673712e-05, - 2.05683136377e-05, - 1.91919478673e-05, - 1.78189081343e-05, - 1.64494308799e-05, - 1.5083750875e-05, - 1.37221011846e-05, - 1.23647131313e-05, - 1.10118162603e-05, - 9.66363830479e-06, - 8.32040515053e-06, - 6.98234080332e-06, - 5.64966735417e-06, - 4.32260494743e-06, - 3.0013717478e-06, - 1.68618390817e-06, - 3.77255538808e-07, - -9.25201324664e-07, - -2.22097675007e-06, - -3.50986294095e-06, - -4.79165426359e-06, - -6.06614727805e-06, - -7.33314076462e-06, - -8.59243575357e-06, - -9.84383555092e-06, - -1.10871457664e-05, - -1.23221743389e-05, - -1.35487315631e-05, - -1.4766630114e-05, - -1.59756850713e-05, - -1.71757139447e-05, - -1.83665366966e-05, - -1.95479757652e-05, - -2.07198560871e-05, - -2.18820051194e-05, - -2.30342528609e-05, - -2.41764318727e-05, - -2.5308377299e-05, - -2.64299268862e-05, - -2.75409210024e-05, - -2.86412026567e-05, - -2.97306175148e-05, - -3.08090139198e-05, - -3.18762429063e-05, - -3.2932158218e-05, - -3.39766163229e-05, - -3.50094764299e-05, - -3.60306005009e-05, - -3.70398532674e-05, - -3.80371022421e-05, - -3.90222177329e-05, - -3.99950728542e-05, - -4.09555435403e-05, - -4.1903508555e-05, - -4.28388495026e-05, - -4.37614508386e-05, - -4.46711998787e-05, - -4.55679868072e-05, - -4.64517046865e-05, - -4.73222494639e-05, - -4.81795199794e-05, - -4.90234179715e-05, - -4.98538480849e-05, - -5.06707178738e-05, - -5.14739378086e-05, - -5.22634212794e-05, - -5.30390846007e-05, - -5.38008470135e-05, - -5.45486306884e-05, - -5.52823607285e-05, - -5.60019651696e-05, - -5.67073749831e-05, - -5.73985240742e-05, - -5.80753492843e-05, - -5.8737790388e-05, - -5.93857900939e-05, - -6.00192940416e-05, - -6.06382508004e-05, - -6.12426118656e-05, - -6.18323316566e-05, - -6.24073675111e-05, - -6.29676796822e-05, - -6.35132313334e-05, - -6.40439885327e-05, - -6.45599202469e-05, - -6.50609983348e-05, - -6.55471975413e-05, - -6.60184954882e-05, - -6.6474872668e-05, - -6.69163124345e-05, - -6.73428009934e-05, - -6.77543273941e-05, - -6.81508835187e-05, - -6.85324640715e-05, - -6.88990665687e-05, - -6.92506913267e-05, - -6.95873414498e-05, - -6.99090228189e-05, - -7.02157440771e-05, - -7.05075166174e-05, - -7.07843545695e-05, - -7.10462747839e-05, - -7.12932968188e-05, - -7.15254429235e-05, - -7.17427380246e-05, - -7.19452097087e-05, - -7.21328882056e-05, - -7.23058063736e-05, - -7.24639996796e-05, - -7.2607506183e-05, - -7.27363665169e-05, - -7.28506238703e-05, - -7.29503239678e-05, - -7.30355150524e-05, - -7.31062478634e-05, - -7.31625756181e-05, - -7.32045539897e-05, - -7.32322410888e-05, - -7.32456974393e-05, - -7.32449859588e-05, - -7.32301719364e-05, - -7.32013230091e-05, - -7.31585091407e-05, - -7.31018025979e-05, - -7.30312779273e-05, - -7.29470119312e-05, - -7.28490836441e-05, - -7.27375743081e-05, - -7.26125673485e-05, - -7.24741483487e-05, - -7.23224050245e-05, - -7.21574271996e-05, - -7.19793067783e-05, - -7.17881377208e-05, - -7.15840160155e-05, - -7.13670396535e-05, - -7.11373086006e-05, - -7.0894924771e-05, - -7.06399919985e-05, - -7.03726160105e-05, - -7.00929043989e-05, - -6.98009665914e-05, - -6.94969138246e-05, - -6.91808591142e-05, - -6.88529172268e-05, - -6.85132046496e-05, - -6.81618395626e-05, - -6.77989418087e-05, - -6.74246328629e-05, - -6.7039035804e-05, - -6.66422752831e-05, - -6.62344774949e-05, - -6.58157701454e-05, - -6.53862824236e-05, - -6.49461449691e-05, - -6.44954898417e-05, - -6.40344504901e-05, - -6.35631617218e-05, - -6.3081759671e-05, - -6.25903817668e-05, - -6.20891667025e-05, - -6.15782544042e-05, - -6.10577859981e-05, - -6.05279037793e-05, - -5.99887511796e-05, - -5.94404727363e-05, - -5.88832140591e-05, - -5.83171217985e-05, - -5.77423436132e-05, - -5.71590281389e-05, - -5.65673249544e-05, - -5.59673845504e-05, - -5.53593582968e-05, - -5.47433984106e-05, - -5.41196579222e-05, - -5.34882906449e-05, - -5.28494511405e-05, - -5.22032946877e-05, - -5.15499772498e-05, - -5.08896554416e-05, - -5.02224864978e-05, - -4.95486282395e-05, - -4.88682390423e-05, - -4.81814778037e-05, - -4.7488503911e-05, - -4.67894772085e-05, - -4.6084557966e-05, - -4.53739068453e-05, - -4.46576848692e-05, - -4.39360533886e-05, - -4.32091740514e-05, - -4.2477208769e-05, - -4.1740319686e-05, - -4.0998669147e-05, - -4.02524196663e-05, - -3.95017338954e-05, - -3.87467745908e-05, - -3.79877045846e-05, - -3.72246867517e-05, - -3.64578839787e-05, - -3.56874591332e-05, - -3.49135750333e-05, - -3.41363944161e-05, - -3.33560799071e-05, - -3.25727939905e-05, - -3.17866989781e-05, - -3.09979569799e-05, - -3.02067298728e-05, - -2.94131792717e-05, - -2.86174665007e-05, - -2.78197525616e-05, - -2.70201981061e-05, - -2.62189634062e-05, - -2.54162083251e-05, - -2.46120922893e-05, - -2.38067742593e-05, - -2.30004127006e-05, - -2.2193165558e-05, - -2.13851902251e-05, - -2.05766435184e-05, - -1.97676816489e-05, - -1.89584601955e-05, - -1.81491340776e-05, - -1.73398575287e-05, - -1.65307840696e-05, - -1.57220664825e-05, - -1.49138567846e-05, - -1.41063062029e-05, - -1.32995651483e-05, - -1.24937831905e-05, - -1.16891090332e-05, - -1.08856904888e-05, - -1.00836744552e-05, - -9.28320689053e-06, - -8.48443278967e-06, - -7.6874961612e-06, - -6.89254000319e-06, - -6.09970628118e-06, - -5.30913590446e-06, - -4.52096870451e-06, - -3.7353434128e-06, - -2.95239763859e-06, - -2.1722678476e-06, - -1.39508934116e-06, - -6.20996235323e-07, - 1.49878560562e-07, - 9.17403362832e-07, - 1.68144773405e-06, - 2.44188250309e-06, - 3.19857978326e-06, - 3.9514129917e-06, - 4.70025686861e-06, - 5.44498749455e-06, - 6.18548230935e-06, - 6.92162012883e-06, - 7.65328116248e-06, - 8.38034703032e-06, - 9.10270077947e-06, - 9.82022690066e-06, - 1.05328113432e-05, - 1.1240341532e-05, - 1.19427063814e-05, - 1.26397963106e-05, - 1.33315032582e-05, - 1.40177206965e-05, - 1.46983436443e-05, - 1.53732686814e-05, - 1.60423939615e-05, - 1.67056192242e-05, - 1.73628458082e-05, - 1.80139766628e-05, - 1.86589163595e-05, - 1.92975711039e-05, - 1.99298487452e-05, - 2.05556587884e-05, - 2.11749124036e-05, - 2.17875224355e-05, - 2.23934034135e-05, - 2.29924715606e-05, - 2.35846448017e-05, - 2.41698427726e-05, - 2.47479868276e-05, - 2.53190000468e-05, - 2.5882807244e-05, - 2.64393349734e-05, - 2.69885115355e-05, - 2.75302669841e-05, - 2.80645331315e-05, - 2.85912435541e-05, - 2.91103335978e-05, - 2.96217403817e-05, - 3.01254028036e-05, - 3.06212615431e-05, - 3.11092590657e-05, - 3.15893396258e-05, - 3.20614492694e-05, - 3.25255358369e-05, - 3.29815489654e-05, - 3.34294400898e-05, - 3.38691624451e-05, - 3.43006710668e-05, - 3.4723922792e-05, - 3.51388762598e-05, - 3.55454919109e-05, - 3.59437319876e-05, - 3.6333560533e-05, - 3.67149433904e-05, - 3.7087848201e-05, - 3.74522444032e-05, - 3.78081032298e-05, - 3.81553977059e-05, - 3.84941026461e-05, - 3.88241946516e-05, - 3.91456521065e-05, - 3.94584551741e-05, - 3.97625857927e-05, - 4.00580276722e-05, - 4.03447662873e-05, - 4.06227888747e-05, - 4.08920844263e-05, - 4.11526436837e-05, - 4.14044591326e-05, - 4.16475249961e-05, - 4.18818372284e-05, - 4.21073935071e-05, - 4.2324193227e-05, - 4.25322374916e-05, - 4.27315291056e-05, - 4.2922072567e-05, - 4.3103874058e-05, - 4.32769414367e-05, - 4.34412842277e-05, - 4.35969136134e-05, - 4.37438424236e-05, - 4.3882085126e-05, - 4.40116578156e-05, - 4.41325782052e-05, - 4.42448656137e-05, - 4.43485409553e-05, - 4.44436267282e-05, - 4.45301470035e-05, - 4.4608127413e-05, - 4.46775951373e-05, - 4.47385788931e-05, - 4.47911089213e-05, - 4.48352169737e-05, - 4.48709363002e-05, - 4.48983016352e-05, - 4.49173491848e-05, - 4.49281166118e-05, - 4.49306430234e-05, - 4.49249689551e-05, - 4.49111363581e-05, - 4.4889188583e-05, - 4.48591703667e-05, - 4.48211278153e-05, - 4.47751083907e-05, - 4.4721160894e-05, - 4.46593354504e-05, - 4.45896834926e-05, - 4.45122577458e-05, - 4.44271122105e-05, - 4.43343021468e-05, - 4.42338840571e-05, - 4.41259156699e-05, - 4.40104559228e-05, - 4.3887564945e-05, - 4.37573040403e-05, - 4.36197356696e-05, - 4.34749234335e-05, - 4.33229320541e-05, - 4.31638273578e-05, - 4.29976762566e-05, - 4.28245467301e-05, - 4.26445078079e-05, - 4.24576295499e-05, - 4.22639830291e-05, - 4.20636403117e-05, - 4.18566744393e-05, - 4.16431594096e-05, - 4.14231701569e-05, - 4.11967825341e-05, - 4.09640732922e-05, - 4.07251200624e-05, - 4.04800013353e-05, - 4.02287964423e-05, - 3.99715855358e-05, - 3.97084495697e-05, - 3.94394702792e-05, - 3.91647301614e-05, - 3.88843124556e-05, - 3.85983011226e-05, - 3.83067808259e-05, - 3.80098369106e-05, - 3.77075553838e-05, - 3.74000228945e-05, - 3.70873267131e-05, - 3.67695547119e-05, - 3.64467953439e-05, - 3.61191376232e-05, - 3.57866711046e-05, - 3.54494858633e-05, - 3.51076724742e-05, - 3.4761321992e-05, - 3.44105259309e-05, - 3.40553762437e-05, - 3.3695965302e-05, - 3.33323858758e-05, - 3.29647311128e-05, - 3.25930945181e-05, - 3.22175699347e-05, - 3.18382515221e-05, - 3.14552337367e-05, - 3.10686113113e-05, - 3.06784792351e-05, - 3.02849327335e-05, - 2.98880672478e-05, - 2.94879784153e-05, - 2.9084762049e-05, - 2.86785141181e-05, - 2.82693307275e-05, - 2.78573080985e-05, - 2.74425425486e-05, - 2.70251304716e-05, - 2.66051683188e-05, - 2.61827525782e-05, - 2.57579797559e-05, - 2.53309463566e-05, - 2.49017488635e-05, - 2.44704837199e-05, - 2.40372473098e-05, - 2.36021359383e-05, - 2.31652458135e-05, - 2.27266730268e-05, - 2.22865135349e-05, - 2.18448631404e-05, - 2.14018174737e-05, - 2.09574719746e-05, - 2.05119218738e-05, - 2.00652621749e-05, - 1.9617587636e-05, - 1.91689927523e-05, - 1.87195717375e-05, - 1.82694185072e-05, - 1.78186266605e-05, - 1.73672894628e-05, - 1.69154998289e-05, - 1.64633503054e-05, - 1.60109330543e-05, - 1.55583398356e-05, - 1.51056619915e-05, - 1.46529904287e-05, - 1.42004156032e-05, - 1.37480275034e-05, - 1.32959156349e-05, - 1.28441690038e-05, - 1.23928761012e-05, - 1.19421248885e-05, - 1.14920027813e-05, - 1.1042596634e-05, - 1.05939927257e-05, - 1.01462767456e-05, - 9.69953377727e-06, - 9.25384828498e-06, - 8.80930409919e-06, - 8.36598440324e-06, - 7.92397171878e-06, - 7.48334789213e-06, - 7.04419408104e-06, - 6.60659074225e-06, - 6.17061761699e-06, - 5.73635371937e-06, - 5.30387732323e-06, - 4.87326594922e-06, - 4.44459635363e-06, - 4.0179445161e-06, - 3.59338562705e-06, - 3.17099407743e-06, - 2.75084344603e-06, - 2.333006489e-06, - 1.91755512946e-06, - 1.50456044545e-06, - 1.0940926608e-06, - 6.86221133916e-07, - 2.81014347903e-07, - -1.21460098645e-07, - -5.21135501863e-07, - -9.17946061607e-07, - -1.31182689067e-06, - -1.70271402489e-06, - -2.09054442912e-06, - -2.47525600816e-06, - -2.85678761469e-06, - -3.23507905575e-06, - -3.61007110183e-06, - -3.98170549398e-06, - -4.3499249518e-06, - -4.71467317875e-06, - -5.07589487087e-06, - -5.43353572269e-06, - -5.78754243286e-06, - -6.13786271209e-06, - -6.48444528673e-06, - -6.82723990608e-06, - -7.16619734709e-06, - -7.50126942073e-06, - -7.83240897473e-06, - -8.15956990041e-06, - -8.48270713605e-06, - -8.80177667151e-06, - -9.1167355516e-06, - -9.42754188116e-06, - -9.7341548273e-06, - -1.00365346234e-05, - -1.03346425719e-05, - -1.06284410477e-05, - -1.09178934995e-05, - -1.12029644534e-05, - -1.14836195146e-05, - -1.17598253691e-05, - -1.20315497856e-05, - -1.22987616167e-05, - -1.25614308009e-05, - -1.28195283624e-05, - -1.30730264123e-05, - -1.33218981497e-05, - -1.35661178609e-05, - -1.38056609207e-05, - -1.40405037907e-05, - -1.42706240212e-05, - -1.44960002477e-05, - -1.47166121924e-05, - -1.49324406622e-05, - -1.51434675471e-05, - -1.53496758193e-05, - -1.55510495317e-05, - -1.57475738145e-05, - -1.59392348755e-05, - -1.61260199956e-05, - -1.63079175264e-05, - -1.64849168889e-05, - -1.66570085691e-05, - -1.68241841152e-05, - -1.69864361343e-05, - -1.71437582892e-05, - -1.72961452929e-05, - -1.7443592907e-05, - -1.75860979355e-05, - -1.77236582211e-05, - -1.78562726409e-05, - -1.79839411014e-05, - -1.81066645326e-05, - -1.82244448843e-05, - -1.83372851195e-05, - -1.84451892089e-05, - -1.85481621267e-05, - -1.86462098419e-05, - -1.87393393147e-05, - -1.88275584891e-05, - -1.8910876286e-05, - -1.89893025977e-05, - -1.90628482795e-05, - -1.91315251443e-05, - -1.91953459545e-05, - -1.92543244144e-05, - -1.93084751638e-05, - -1.9357813769e-05, - -1.94023567159e-05, - -1.94421214019e-05, - -1.94771261273e-05, - -1.9507390087e-05, - -1.9532933363e-05, - -1.95537769145e-05, - -1.956994257e-05, - -1.95814530177e-05, - -1.95883317982e-05, - -1.9590603292e-05, - -1.95882927145e-05, - -1.95814261026e-05, - -1.95700303076e-05, - -1.95541329846e-05, - -1.9533762583e-05, - -1.95089483359e-05, - -1.94797202508e-05, - -1.94461090992e-05, - -1.94081464062e-05, - -1.93658644398e-05, - -1.9319296201e-05, - -1.92684754126e-05, - -1.92134365091e-05, - -1.91542146248e-05, - -1.90908455844e-05, - -1.90233658905e-05, - -1.89518127134e-05, - -1.88762238793e-05, - -1.87966378593e-05, - -1.87130937581e-05, - -1.86256313028e-05, - -1.85342908301e-05, - -1.84391132765e-05, - -1.83401401648e-05, - -1.82374135935e-05, - -1.81309762248e-05, - -1.80208712726e-05, - -1.79071424899e-05, - -1.7789834158e-05, - -1.76689910734e-05, - -1.75446585358e-05, - -1.74168823366e-05, - -1.72857087459e-05, - -1.71511845006e-05, - -1.70133567923e-05, - -1.68722732539e-05, - -1.67279819483e-05, - -1.65805313557e-05, - -1.64299703611e-05, - -1.62763482414e-05, - -1.61197146535e-05, - -1.5960119621e-05, - -1.57976135224e-05, - -1.56322470781e-05, - -1.54640713381e-05, - -1.52931376689e-05, - -1.51194977416e-05, - -1.49432035186e-05, - -1.47643072408e-05, - -1.45828614164e-05, - -1.43989188062e-05, - -1.42125324125e-05, - -1.40237554667e-05, - -1.3832641415e-05, - -1.3639243907e-05, - -1.34436167836e-05, - -1.32458140634e-05, - -1.30458899306e-05, - -1.28438987219e-05, - -1.26398949158e-05, - -1.24339331178e-05, - -1.22260680497e-05, - -1.20163545363e-05, - -1.18048474933e-05, - -1.15916019154e-05, - -1.13766728631e-05, - -1.11601154513e-05, - -1.09419848366e-05, - -1.07223362058e-05, - -1.05012247633e-05, - -1.02787057183e-05, - -1.0054834275e-05, - -9.82966561835e-06, - -9.60325490351e-06, - -9.37565724413e-06, - -9.14692769993e-06, - -8.91712126516e-06, - -8.68629285744e-06, - -8.4544973058e-06, - -8.22178933957e-06, - -7.98822357684e-06, - -7.75385451357e-06, - -7.51873651161e-06, - -7.28292378804e-06, - -7.04647040384e-06, - -6.80943025366e-06, - -6.57185705455e-06, - -6.33380433435e-06, - -6.09532542262e-06, - -5.85647343887e-06, - -5.61730128212e-06, - -5.37786162136e-06, - -5.13820688441e-06, - -4.898389248e-06, - -4.65846062814e-06, - -4.41847266952e-06, - -4.17847673551e-06, - -3.93852389902e-06, - -3.69866493322e-06, - -3.45895030041e-06, - -3.21943014425e-06, - -2.98015427957e-06, - -2.74117218368e-06, - -2.50253298639e-06, - -2.26428546291e-06, - -2.02647802294e-06, - -1.78915870341e-06, - -1.55237515886e-06, - -1.31617465393e-06, - -1.08060405513e-06, - -8.45709821284e-07, - -6.11537996908e-07, - -3.78134203727e-07, - -1.45543633145e-07, - 8.61889619674e-08, - 3.17019274387e-07, - 5.46903449639e-07, - 7.75798093877e-07, - 1.00366028055e-06, - 1.2304475574e-06, - 1.45611795388e-06, - 1.68062998673e-06, - 1.9039426673e-06, - 2.12601550786e-06, - 2.34680852795e-06, - 2.56628225981e-06, - 2.78439775525e-06, - 3.00111659091e-06, - 3.2164008742e-06, - 3.43021324845e-06, - 3.64251689877e-06, - 3.85327555719e-06, - 4.06245350726e-06, - 4.27001558923e-06, - 4.47592720543e-06, - 4.68015432387e-06, - 4.88266348364e-06, - 5.08342179839e-06, - 5.2823969614e-06, - 5.4795572485e-06, - 5.67487152325e-06, - 5.86830923976e-06, - 6.05984044644e-06, - 6.24943578931e-06, - 6.4370665156e-06, - 6.62270447671e-06, - 6.80632213079e-06, - 6.98789254627e-06, - 7.16738940376e-06, - 7.34478699926e-06, - 7.52006024585e-06, - 7.69318467619e-06, - 7.86413644449e-06, - 8.03289232865e-06, - 8.19942973163e-06, - 8.36372668334e-06, - 8.52576184185e-06, - 8.68551449462e-06, - 8.84296455983e-06, - 8.99809258725e-06, - 9.15087975928e-06, - 9.30130789123e-06, - 9.44935943215e-06, - 9.59501746511e-06, - 9.73826570771e-06, - 9.87908851169e-06, - 1.00174708632e-05, - 1.01533983823e-05, - 1.02868573232e-05, - 1.04178345732e-05, - 1.0546317652e-05, - 1.06722947116e-05, - 1.0795754535e-05, - 1.09166865346e-05, - 1.10350807518e-05, - 1.11509278554e-05, - 1.12642191401e-05, - 1.13749465247e-05, - 1.14831025504e-05, - 1.15886803793e-05, - 1.16916737921e-05, - 1.17920771859e-05, - 1.1889885572e-05, - 1.19850945731e-05, - 1.20777004214e-05, - 1.21676999559e-05, - 1.22550906186e-05, - 1.2339870453e-05, - 1.24220381001e-05, - 1.25015927953e-05, - 1.25785343653e-05, - 1.26528632249e-05, - 1.27245803729e-05, - 1.27936873892e-05, - 1.28601864297e-05, - 1.29240802241e-05, - 1.2985372071e-05, - 1.30440658334e-05, - 1.31001659351e-05, - 1.31536773565e-05, - 1.32046056297e-05, - 1.32529568339e-05, - 1.32987375909e-05, - 1.33419550609e-05, - 1.33826169364e-05, - 1.34207314385e-05, - 1.34563073111e-05, - 1.34893538161e-05, - 1.35198807274e-05, - 1.3547898327e-05, - 1.35734173982e-05, - 1.35964492204e-05, - 1.36170055642e-05, - 1.36350986848e-05, - 1.36507413168e-05, - 1.36639466678e-05, - 1.3674728413e-05, - 1.36831006888e-05, - 1.3689078087e-05, - 1.36926756482e-05, - 1.3693908856e-05, - 1.36927936302e-05, - 1.36893463208e-05, - 1.36835837017e-05, - 1.36755229634e-05, - 1.3665181707e-05, - 1.36525779373e-05, - 1.36377300565e-05, - 1.36206568567e-05, - 1.36013775138e-05, - 1.35799115801e-05, - 1.35562789775e-05, - 1.35304999906e-05, - 1.35025952596e-05, - 1.34725857732e-05, - 1.34404928613e-05, - 1.34063381882e-05, - 1.33701437453e-05, - 1.33319318429e-05, - 1.32917251048e-05, - 1.32495464591e-05, - 1.32054191319e-05, - 1.31593666395e-05, - 1.31114127812e-05, - 1.30615816315e-05, - 1.30098975332e-05, - 1.2956385089e-05, - 1.29010691552e-05, - 1.28439748328e-05, - 1.27851274609e-05, - 1.27245526091e-05, - 1.26622760693e-05, - 1.25983238484e-05, - 1.25327221607e-05, - 1.24654974206e-05, - 1.23966762343e-05, - 1.23262853926e-05, - 1.22543518635e-05, - 1.21809027839e-05, - 1.21059654524e-05, - 1.20295673218e-05, - 1.19517359913e-05, - 1.18724991985e-05, - 1.17918848124e-05, - 1.17099208254e-05, - 1.16266353462e-05, - 1.15420565916e-05, - 1.14562128792e-05, - 1.13691326202e-05, - 1.12808443113e-05, - 1.11913765279e-05, - 1.11007579159e-05, - 1.10090171846e-05, - 1.09161830996e-05, - 1.08222844748e-05, - 1.07273501656e-05, - 1.06314090609e-05, - 1.05344900767e-05, - 1.04366221484e-05, - 1.03378342229e-05, - 1.02381552531e-05, - 1.01376141891e-05, - 1.00362399718e-05, - 9.93406152572e-06, - 9.83110775277e-06, - 9.72740752403e-06, - 9.62298967377e-06, - 9.51788299186e-06, - 9.41211621786e-06, - 9.30571803337e-06, - 9.19871705607e-06, - 9.09114183278e-06, - 8.98302083263e-06, - 8.87438244068e-06, - 8.76525495219e-06, - 8.65566656494e-06, - 8.54564537367e-06, - 8.43521936422e-06, - 8.32441640619e-06, - 8.21326424749e-06, - 8.10179050847e-06, - 7.99002267537e-06, - 7.87798809487e-06, - 7.76571396788e-06, - 7.65322734386e-06, - 7.54055511554e-06, - 7.42772401252e-06, - 7.31476059634e-06, - 7.20169125457e-06, - 7.08854219578e-06, - 6.97533944405e-06, - 6.86210883372e-06, - 6.74887600427e-06, - 6.63566639525e-06, - 6.52250524136e-06, - 6.40941756735e-06, - 6.29642818339e-06, - 6.18356168025e-06, - 6.07084242488e-06, - 5.95829455552e-06, - 5.84594197717e-06, - 5.733808358e-06, - 5.62191712372e-06, - 5.51029145468e-06, - 5.39895428131e-06, - 5.28792828014e-06, - 5.17723586924e-06, - 5.06689920499e-06, - 4.9569401791e-06, - 4.84738041351e-06, - 4.7382412578e-06, - 4.62954378511e-06, - 4.52130879003e-06, - 4.4135567836e-06, - 4.3063079912e-06, - 4.19958234998e-06, - 4.09339950425e-06, - 3.9877788045e-06, - 3.88273930363e-06, - 3.77829975406e-06, - 3.67447860572e-06, - 3.57129400375e-06, - 3.46876378532e-06, - 3.36690547809e-06, - 3.2657362975e-06, - 3.16527314559e-06, - 3.06553260776e-06, - 2.96653095211e-06, - 2.86828412699e-06, - 2.77080775912e-06, - 2.67411715293e-06, - 2.57822728833e-06, - 2.48315281959e-06, - 2.3889080738e-06, - 2.29550705033e-06, - 2.20296341924e-06, - 2.1112905203e-06, - 2.02050136233e-06, - 1.9306086223e-06, - 1.84162464489e-06, - 1.7535614415e-06, - 1.66643069011e-06, - 1.58024373476e-06, - 1.49501158497e-06, - 1.41074491655e-06, - 1.32745407011e-06, - 1.24514905187e-06, - 1.16383953386e-06, - 1.08353485351e-06, - 1.00424401506e-06, - 9.25975688126e-07, - 8.48738209602e-07, - 7.72539584304e-07, - 6.97387484427e-07, - 6.23289251434e-07, - 5.50251896159e-07, - 4.78282100147e-07, - 4.07386216761e-07, - 3.37570271403e-07, - 2.68839963735e-07, - 2.0120066857e-07, - 1.34657436979e-07, - 6.92149981774e-08, - 4.8777604178e-09, - -5.83501866824e-08, - -1.2046507103e-07, - -1.81463435611e-07, - -2.4134213783e-07, - -3.00098346617e-07, - -3.57729540212e-07, - -4.14233504831e-07, - -4.69608332443e-07, - -5.23852417889e-07, - -5.76964457766e-07, - -6.28943446435e-07, - -6.79788674907e-07, - -7.29499727736e-07, - -7.78076480579e-07, - -8.25519097525e-07, - -8.71828028437e-07, - -9.17004006062e-07, - -9.61048043369e-07, - -1.00396142999e-06, - -1.04574573023e-06, - -1.08640277952e-06, - -1.12593468127e-06, - -1.16434380337e-06, - -1.20163277595e-06, - -1.23780448757e-06, - -1.27286208107e-06, - -1.30680895238e-06, - -1.3396487446e-06, - -1.37138534617e-06, - -1.40202288645e-06, - -1.43156573262e-06, - -1.46001848655e-06, - -1.48738597971e-06, - -1.51367327095e-06, - -1.53888564136e-06, - -1.56302859211e-06, - -1.58610783907e-06, - -1.60812930972e-06, - -1.62909913937e-06, - -1.64902366673e-06, - -1.66790943057e-06, - -1.68576316484e-06, - -1.70259179533e-06, - -1.71840243546e-06, - -1.73320238206e-06, - -1.74699911093e-06, - -1.75980027395e-06, - -1.77161369352e-06, - -1.78244735927e-06, - -1.79230942243e-06, - -1.80120819415e-06, - -1.80915213854e-06, - -1.81614987071e-06, - -1.82221015055e-06, - -1.82734187937e-06, - -1.83155409617e-06, - -1.83485597227e-06, - -1.8372568078e-06, - -1.83876602611e-06, - -1.83939317178e-06, - -1.83914790353e-06, - -1.83803999199e-06, - -1.83607931392e-06, - -1.83327584957e-06, - -1.82963967643e-06, - -1.82518096636e-06, - -1.81990998005e-06, - -1.81383706388e-06, - -1.80697264485e-06, - -1.79932722677e-06, - -1.79091138541e-06, - -1.78173576493e-06, - -1.77181107253e-06, - -1.76114807515e-06, - -1.7497575957e-06, - -1.73765050726e-06, - -1.72483772953e-06, - -1.71133022575e-06, - -1.69713899734e-06, - -1.68227507946e-06, - -1.66674953839e-06, - -1.65057346613e-06, - -1.63375797668e-06, - -1.6163142027e-06, - -1.59825329016e-06, - -1.57958639613e-06, - -1.56032468279e-06, - -1.54047931566e-06, - -1.52006145782e-06, - -1.49908226765e-06, - -1.47755289381e-06, - -1.45548447228e-06, - -1.4328881226e-06, - -1.40977494389e-06, - -1.38615601086e-06, - -1.36204237089e-06, - -1.33744504072e-06, - -1.312375002e-06, - -1.28684319867e-06, - -1.26086053287e-06, - -1.23443786215e-06, - -1.20758599587e-06, - -1.1803156923e-06, - -1.15263765443e-06, - -1.12456252821e-06, - -1.09610089805e-06, - -1.06726328553e-06, - -1.03806014407e-06, - -1.00850185802e-06, - -9.78598739154e-07, - -9.48361022823e-07, - -9.17798866684e-07, - -8.86922347343e-07, - -8.55741457695e-07, - -8.2426610426e-07, - -7.92506104963e-07, - -7.60471186023e-07, - -7.28170980624e-07, - -6.95615025359e-07, - -6.62812758456e-07, - -6.29773518224e-07, - -5.9650653994e-07, - -5.63020953859e-07, - -5.29325784093e-07, - -4.95429945735e-07, - -4.61342242852e-07, - -4.27071367604e-07, - -3.92625897572e-07, - -3.58014295099e-07, - -3.23244904399e-07, - -2.88325950448e-07, - -2.53265538763e-07, - -2.18071651847e-07, - -1.82752149192e-07, - -1.47314766163e-07, - -1.1176711201e-07, - -7.61166689678e-08, - -4.03707915986e-08, - -4.53670567779e-09, - 3.13784935813e-08, - 6.73678407503e-08, - 1.0342450274e-07, - 1.39541778355e-07, - 1.75713098849e-07, - 2.11932029592e-07, - 2.48192269514e-07, - 2.84487651991e-07, - 3.2081214496e-07, - 3.57159851694e-07, - 3.93525010134e-07, - 4.29901994337e-07, - 4.6628531325e-07, - 5.02669611491e-07, - 5.39049669013e-07, - 5.75420401328e-07, - 6.1177685895e-07, - 6.48114227064e-07, - 6.84427825415e-07, - 7.20713108082e-07, - 7.56965662707e-07, - 7.93181209935e-07, - 8.29355603305e-07, - 8.65484828028e-07, - 9.01565000544e-07, - 9.37592367523e-07, - 9.73563305418e-07, - 1.00947431902e-06, - 1.04532204137e-06, - 1.08110323149e-06, - 1.11681477444e-06, - 1.15245367949e-06, - 1.18801707916e-06, - 1.22350222742e-06, - 1.25890649938e-06, - 1.29422738926e-06, - 1.32946250897e-06, - 1.36460958666e-06, - 1.39966646506e-06, - 1.43463110025e-06, - 1.46950155977e-06, - 1.50427602086e-06, - 1.53895276833e-06, - 1.57353019403e-06, - 1.60800679361e-06, - 1.64238116529e-06, - 1.67665200745e-06, - 1.71081811762e-06, - 1.74487838944e-06, - 1.77883181085e-06, - 1.81267746224e-06, - 1.84641451406e-06, - 1.88004222457e-06, - 1.91355993795e-06, - 1.94696708145e-06, - 1.98026316345e-06, - 2.01344777173e-06, - 2.04652056945e-06, - 2.07948129416e-06, - 2.11232975544e-06, - 2.14506583096e-06, - 2.17768946564e-06, - 2.21020066804e-06, - 2.24259950832e-06, - 2.27488611571e-06, - 2.30706067539e-06, - 2.33912342651e-06, - 2.37107465906e-06, - 2.40291471165e-06, - 2.43464396843e-06, - 2.4662628566e-06, - 2.49777184358e-06, - 2.52917143473e-06, - 2.56046216951e-06, - 2.59164462046e-06, - 2.62271938933e-06, - 2.65368710395e-06, - 2.68454841623e-06, - 2.71530399976e-06, - 2.74595454597e-06, - 2.77650076164e-06, - 2.80694336707e-06, - 2.83728309203e-06, - 2.86752067391e-06, - 2.89765685457e-06, - 2.92769237775e-06, - 2.95762798619e-06, - 2.98746441862e-06, - 3.01720240803e-06, - 3.04684267805e-06, - 3.07638594021e-06, - 3.10583289198e-06, - 3.13518421391e-06, - 3.16444056592e-06, - 3.1936025866e-06, - 3.2226708887e-06, - 3.25164605797e-06, - 3.28052864995e-06, - 3.30931918735e-06, - 3.33801815788e-06, - 3.36662601186e-06, - 3.39514315917e-06, - 3.42356996763e-06, - 3.4519067601e-06, - 3.48015381224e-06, - 3.50831135021e-06, - 3.53637954875e-06, - 3.56435852855e-06, - 3.59224835411e-06, - 3.62004903165e-06, - 3.64776050688e-06, - 3.67538266355e-06, - 3.70291532059e-06, - 3.73035823076e-06, - 3.7577110783e-06, - 3.78497347742e-06, - 3.81214497047e-06, - 3.83922502567e-06, - 3.86621303627e-06, - 3.89310831794e-06, - 3.91991010817e-06, - 3.94661756375e-06, - 3.97322975965e-06, - 3.99974568821e-06, - 4.02616425699e-06, - 4.05248428748e-06, - 4.07870451458e-06, - 4.10482358437e-06, - 4.13084005402e-06, - 4.15675238996e-06, - 4.18255896761e-06, - 4.20825806957e-06, - 4.2338478855e-06, - 4.2593265116e-06, - 4.28469194869e-06, - 4.30994210254e-06, - 4.33507478304e-06, - 4.36008770388e-06, - 4.38497848165e-06, - 4.40974463589e-06, - 4.43438358932e-06, - 4.45889266587e-06, - 4.48326909264e-06, - 4.5075099987e-06, - 4.5316124152e-06, - 4.5555732755e-06, - 4.57938941556e-06, - 4.60305757444e-06, - 4.62657439382e-06, - 4.64993641847e-06, - 4.67314009822e-06, - 4.69618178645e-06, - 4.71905774224e-06, - 4.74176413023e-06, - 4.7642970219e-06, - 4.78665239645e-06, - 4.80882614129e-06, - 4.83081405345e-06, - 4.8526118408e-06, - 4.87421512307e-06, - 4.89561943307e-06, - 4.91682021797e-06, - 4.93781284117e-06, - 4.95859258309e-06, - 4.97915464381e-06, - 4.99949414356e-06, - 5.01960612531e-06, - 5.03948555597e-06, - 5.05912732895e-06, - 5.07852626552e-06, - 5.09767711732e-06, - 5.11657456836e-06, - 5.13521323686e-06, - 5.15358767794e-06, - 5.17169238567e-06, - 5.18952179607e-06, - 5.20707028884e-06, - 5.22433219019e-06, - 5.24130177582e-06, - 5.257973273e-06, - 5.27434086384e-06, - 5.29039868769e-06, - 5.3061408446e-06, - 5.32156139765e-06, - 5.33665437663e-06, - 5.35141378022e-06, - 5.36583358046e-06, - 5.37990772442e-06, - 5.39363013863e-06, - 5.40699473173e-06, - 5.41999539838e-06, - 5.43262602204e-06, - 5.44488047949e-06, - 5.45675264274e-06, - 5.46823638425e-06, - 5.4793255797e-06, - 5.49001411176e-06, - 5.50029587387e-06, - 5.51016477401e-06, - 5.51961473827e-06, - 5.52863971548e-06, - 5.53723368002e-06, - 5.54539063635e-06, - 5.55310462302e-06, - 5.56036971588e-06, - 5.56718003331e-06, - 5.57352973929e-06, - 5.5794130478e-06, - 5.58482422675e-06, - 5.58975760201e-06, - 5.59420756197e-06, - 5.59816856138e-06, - 5.60163512542e-06, - 5.60460185361e-06, - 5.60706342467e-06, - 5.60901460001e-06, - 5.61045022829e-06, - 5.61136524935e-06, - 5.61175469893e-06, - 5.61161371182e-06, - 5.61093752682e-06, - 5.60972149077e-06, - 5.60796106275e-06, - 5.60565181762e-06, - 5.60278945039e-06, - 5.59936978106e-06, - 5.59538875766e-06, - 5.59084246099e-06, - 5.58572710763e-06, - 5.5800390556e-06, - 5.57377480637e-06, - 5.5669310105e-06, - 5.55950447012e-06, - 5.55149214343e-06, - 5.54289114907e-06, - 5.53369876799e-06, - 5.52391244901e-06, - 5.51352981193e-06, - 5.50254865039e-06, - 5.49096693614e-06, - 5.47878282231e-06, - 5.46599464635e-06, - 5.45260093388e-06, - 5.43860040214e-06, - 5.42399196202e-06, - 5.40877472233e-06, - 5.3929479924e-06, - 5.37651128485e-06, - 5.35946431801e-06, - 5.34180701983e-06, - 5.32353952998e-06, - 5.3046622015e-06, - 5.28517560472e-06, - 5.26508052889e-06, - 5.24437798455e-06, - 5.22306920492e-06, - 5.2011556495e-06, - 5.17863900507e-06, - 5.15552118718e-06, - 5.13180434225e-06, - 5.10749084959e-06, - 5.08258332188e-06, - 5.05708460763e-06, - 5.03099779137e-06, - 5.00432619455e-06, - 4.97707337821e-06, - 4.94924314232e-06, - 4.92083952564e-06, - 4.89186680863e-06, - 4.86232951225e-06, - 4.83223239811e-06, - 4.80158046934e-06, - 4.77037896984e-06, - 4.73863338446e-06, - 4.70634943894e-06, - 4.67353309852e-06, - 4.64019056778e-06, - 4.60632828969e-06, - 4.57195294545e-06, - 4.5370714522e-06, - 4.50169096133e-06, - 4.46581885905e-06, - 4.42946276313e-06, - 4.39263052121e-06, - 4.35533020893e-06, - 4.31757012809e-06, - 4.27935880465e-06, - 4.24070498539e-06, - 4.20161763548e-06, - 4.16210593612e-06, - 4.1221792817e-06, - 4.08184727518e-06, - 4.04111972652e-06, - 4.00000664791e-06, - 3.95851825141e-06, - 3.91666494381e-06, - 3.87445732253e-06, - 3.83190617292e-06, - 3.78902246279e-06, - 3.74581733764e-06, - 3.70230211622e-06, - 3.65848828687e-06, - 3.61438750041e-06, - 3.57001156648e-06, - 3.52537244708e-06, - 3.48048225252e-06, - 3.43535323444e-06, - 3.38999778027e-06, - 3.34442840721e-06, - 3.29865775706e-06, - 3.2526985887e-06, - 3.20656377217e-06, - 3.16026628122e-06, - 3.11381918894e-06, - 3.06723565846e-06, - 3.02052893708e-06, - 2.9737123487e-06, - 2.92679928793e-06, - 2.87980321134e-06, - 2.83273763002e-06, - 2.78561610234e-06, - 2.73845222698e-06, - 2.69125963503e-06, - 2.6440519808e-06, - 2.59684293513e-06, - 2.54964617719e-06, - 2.50247538724e-06, - 2.45534423737e-06, - 2.40826638154e-06, - 2.36125545283e-06, - 2.31432504971e-06, - 2.26748873e-06, - 2.22076000322e-06, - 2.1741523214e-06, - 2.12767907104e-06, - 2.08135356417e-06, - 2.03518903108e-06, - 1.9891986115e-06, - 1.94339534676e-06, - 1.89779217175e-06, - 1.85240190576e-06, - 1.80723724574e-06, - 1.76231075888e-06, - 1.71763487289e-06, - 1.67322186928e-06, - 1.62908387702e-06, - 1.58523286387e-06, - 1.54168062871e-06, - 1.49843879582e-06, - 1.45551880804e-06, - 1.41293191935e-06, - 1.37068918848e-06, - 1.32880147319e-06, - 1.28727942517e-06, - 1.24613348351e-06, - 1.20537386927e-06, - 1.16501058112e-06, - 1.12505339089e-06, - 1.08551184042e-06, - 1.04639523513e-06, - 1.00771264222e-06, - 9.69472889079e-07, - 9.31684559169e-07, - 8.94355989711e-07, - 8.57495271789e-07, - 8.2111024946e-07, - 7.85208518428e-07, - 7.49797427368e-07, - 7.14884077935e-07, - 6.80475327974e-07, - 6.46577792973e-07, - 6.13197849497e-07, - 5.80341637857e-07, - 5.48015069546e-07, - 5.16223831126e-07, - 4.84973390669e-07, - 4.54269004968e-07, - 4.24115729758e-07, - 3.94518427593e-07, - 3.65481778064e-07, - 3.37010289786e-07, - 3.09108314389e-07, - 2.8178005862e-07, - 2.55029599661e-07, - 2.28860901785e-07, - 2.03277834787e-07, - 1.78284191188e-07, - 1.53883706666e-07, - 1.30080081484e-07, - 1.06877001249e-07, - 8.42781580079e-08, - 6.22872755596e-08, - 4.09081096775e-08, - 2.01444375625e-08, - 0.0, -]; diff --git a/examples/synth/trash/old/oscillator.rs b/examples/synth/trash/old/oscillator.rs deleted file mode 100644 index 7a118ff..0000000 --- a/examples/synth/trash/old/oscillator.rs +++ /dev/null @@ -1,127 +0,0 @@ -// This file is for the Oscillator struct, which implements the rodio source trait. - -use rodio::source::Source; -use std::f32::consts::PI; - -use super::osc::AnalogOsc; - -const SAMPLE_RATE: u32 = 48000; // The sample rate of the audio in Hz. - -// The wave type of the oscillator -#[derive(Clone, Debug)] -enum WaveType { - Sine, - Square, - Sawtooth, - Triangle, -} - -#[derive(Clone, Debug)] -pub struct Oscillator { - freq: f32, - num_sample: usize, // The number of samples that have been played - wave_type: WaveType, - osc: AnalogOsc, -} - -// Allow dead code is used because main.rs doesn't use all of the wave types, just one of them -// Without this, the compiler would complain about unused code. -impl Oscillator { - #[allow(dead_code)] - pub fn sine_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new sine wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Sine, - osc - } - } - - #[allow(dead_code)] - pub fn square_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new square wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Square, - osc - } - } - - #[allow(dead_code)] - pub fn sawtooth_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new sawtooth wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Sawtooth, - osc - } - } - - #[allow(dead_code)] - pub fn triangle_wave(freq: f32) -> Oscillator { - - let mut osc = AnalogOsc::new(); - osc.set_sample_rate(SAMPLE_RATE as usize); - - // Create a new triangle wave oscillator - Oscillator { - freq, - num_sample: 0, - wave_type: WaveType::Triangle, - osc - } - } -} - -// Rodio requires that Iterator is implemented -// The next function is called every time a new sample is needed -impl Iterator for Oscillator { - type Item = f32; - - fn next(&mut self) -> Option { - self.num_sample = self.num_sample.wrapping_add(1); - - let t = self.num_sample as f32 / SAMPLE_RATE as f32; // Time - let value = 2.0 * PI * self.freq * t; - - match self.wave_type { - WaveType::Sine => Some(value.sin()), // Sine wave, no anti-aliasing needed - WaveType::Square => Some(self.osc.tick_square(self.freq, 0.0, 0.0)), - WaveType::Sawtooth => Some(self.osc.tick_saw(self.freq, 0.0, 0.0)), - WaveType::Triangle => Some(value.sin().asin()), // The arcsine of the sine wave makes it a triangle wave. The MinBLEP AA method doesn't support triangle waves. - } - } -} - -impl Source for Oscillator { - fn current_frame_len(&self) -> Option { - None - } - - fn channels(&self) -> u16 { - 1 // Mono, not stereo - } - - fn sample_rate(&self) -> u32 { - SAMPLE_RATE - } - - fn total_duration(&self) -> Option { - None // Will continue indefinitely until stopped - } -} From 0b8593001fb82c41f3efe158803731bbf64d96ec Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 13:57:08 +0100 Subject: [PATCH 12/18] synth --- examples/synth/src/main.rs | 2 ++ examples/synth/src/synth/mod.rs | 15 +++++++++------ examples/synth/src/synth/oscillator.rs | 26 -------------------------- 3 files changed, 11 insertions(+), 32 deletions(-) diff --git a/examples/synth/src/main.rs b/examples/synth/src/main.rs index 493a4df..9a85f44 100644 --- a/examples/synth/src/main.rs +++ b/examples/synth/src/main.rs @@ -30,6 +30,8 @@ fn main() { let mut synth = synth.lock().unwrap(); + // let notes = note + 1 + 3 + 5; + // Get the frequency of the note. let frequency: MidiFrequency = note.frequency(); diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs index a5c502c..b758843 100644 --- a/examples/synth/src/synth/mod.rs +++ b/examples/synth/src/synth/mod.rs @@ -74,7 +74,6 @@ impl Synth { envelope_state.release_start_time = Some(Instant::now()); } } - pub fn update(&mut self) { let now = Instant::now(); @@ -97,7 +96,7 @@ impl Synth { let elapsed_since_released = now .duration_since(envelope_state.release_start_time.unwrap()) .as_secs_f32(); - envelope.sustain - elapsed_since_released / envelope.release * envelope.sustain + envelope.sustain * (1.0 - (elapsed_since_released / envelope.release).min(1.0)) } else { // Sustain envelope.sustain @@ -105,10 +104,14 @@ impl Synth { sink.set_volume(volume); - if envelope_state.is_releasing && elapsed > envelope.release { - // This is done as a separate step to avoid a second mutable borrow of self.envelope_states - // First borrow is when .iter_mut() is called, second is when .remove() is called - to_remove.push(*source_id); + // Check if the note should be removed after release + if envelope_state.is_releasing { + let elapsed_since_released = now + .duration_since(envelope_state.release_start_time.unwrap()) + .as_secs_f32(); + if elapsed_since_released >= envelope.release { + to_remove.push(*source_id); + } } } diff --git a/examples/synth/src/synth/oscillator.rs b/examples/synth/src/synth/oscillator.rs index 9e20770..c7b46fa 100644 --- a/examples/synth/src/synth/oscillator.rs +++ b/examples/synth/src/synth/oscillator.rs @@ -16,8 +16,6 @@ pub struct OscillatorConfig { anti_aliasing: bool, oversampling: usize, zero_crossings: usize, - transition_start: f32, - transition_end: f32, } impl Default for OscillatorConfig { @@ -27,8 +25,6 @@ impl Default for OscillatorConfig { anti_aliasing: true, oversampling: 256, zero_crossings: 16, - transition_start: 8000.0, - transition_end: 10000.0, } } } @@ -62,18 +58,6 @@ impl OscillatorConfig { self.zero_crossings = crossings; self } - - /// Set transition start frequency - pub fn transition_start(mut self, start: f32) -> Self { - self.transition_start = start; - self - } - - /// Set transition end frequency - pub fn transition_end(mut self, end: f32) -> Self { - self.transition_end = end; - self - } } /// BLEP (Band-Limited Step) Table Builder @@ -222,16 +206,6 @@ impl Oscillator { Self::new(freq, WaveType::Triangle, OscillatorConfig::default()) } - /// Create oscillators with custom configuration - pub fn new_with_config(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { - Oscillator { - freq, - num_samples: 0, - wave_type, - analog_osc: AnalogOsc::new(config), - } - } - /// Internal constructor for oscillators fn new(freq: f32, wave_type: WaveType, config: OscillatorConfig) -> Self { Oscillator { From b7f568ad30efbe500431c37f9d8b4972bb6a7f08 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 14:03:12 +0100 Subject: [PATCH 13/18] synth --- examples/synth/src/synth/mod.rs | 74 +++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs index b758843..83ea61e 100644 --- a/examples/synth/src/synth/mod.rs +++ b/examples/synth/src/synth/mod.rs @@ -7,15 +7,14 @@ use rodio::Sink; mod oscillator; pub use oscillator::Oscillator; -// The envelope state struct struct EnvelopeState { envelope: Envelope, start_time: Instant, is_releasing: bool, release_start_time: Option, + release_start_volume: Option, // Track starting volume for release } -// The envelope struct struct Envelope { attack: f32, decay: f32, @@ -42,9 +41,6 @@ pub struct Synth { impl Synth { pub fn new(stream_handle: rodio::OutputStreamHandle) -> Synth { - // let (_stream, stream_handle) = rodio::OutputStream::try_default().unwrap(); - // For some reason the above code would fail if it was in the new function - Synth { audio_sinks: HashMap::new(), envelope_states: HashMap::new(), @@ -56,12 +52,13 @@ impl Synth { let sink = Sink::try_new(&self.stream_handle).expect("Failed to create sink"); sink.append(audio_source); - let envelope = Envelope::new(0.1, 0.2, 0.7, 1.3); // example envelope + let envelope = Envelope::new(0.8, 0.2, 0.7, 1.3); let envelope_state = EnvelopeState { envelope, start_time: Instant::now(), is_releasing: false, release_start_time: None, + release_start_volume: None, }; self.audio_sinks.insert(source_id, sink); @@ -70,51 +67,76 @@ impl Synth { pub fn release_source(&mut self, source_id: u8) { if let Some(envelope_state) = self.envelope_states.get_mut(&source_id) { + let now = Instant::now(); + let elapsed = now.duration_since(envelope_state.start_time).as_secs_f32(); + let envelope = &envelope_state.envelope; + + // Calculate current volume at release time + let current_volume = if elapsed < envelope.attack { + // Attack phase + elapsed / envelope.attack + } else if elapsed < envelope.attack + envelope.decay { + // Decay phase + 1.0 - (elapsed - envelope.attack) / envelope.decay * (1.0 - envelope.sustain) + } else { + // Sustain phase + envelope.sustain + }; + envelope_state.is_releasing = true; - envelope_state.release_start_time = Some(Instant::now()); + envelope_state.release_start_time = Some(now); + envelope_state.release_start_volume = Some(current_volume); } } + pub fn update(&mut self) { let now = Instant::now(); - let mut to_remove = Vec::new(); for (source_id, envelope_state) in self.envelope_states.iter_mut() { - let elapsed = now.duration_since(envelope_state.start_time).as_secs_f32(); - - let envelope = &envelope_state.envelope; let sink = self.audio_sinks.get_mut(source_id).unwrap(); + let envelope = &envelope_state.envelope; - let volume = if elapsed < envelope.attack { - // Attack - elapsed / envelope.attack - } else if elapsed < envelope.attack + envelope.decay { - // Decay - 1.0 - (elapsed - envelope.attack) / envelope.decay * (1.0 - envelope.sustain) - } else if envelope_state.is_releasing { - // Release - let elapsed_since_released = now + let volume = if envelope_state.is_releasing { + // Release phase - use captured start volume and release time + let elapsed_release = now .duration_since(envelope_state.release_start_time.unwrap()) .as_secs_f32(); - envelope.sustain * (1.0 - (elapsed_since_released / envelope.release).min(1.0)) + + let start_volume = envelope_state.release_start_volume.unwrap(); + let t = (elapsed_release / envelope.release).min(1.0); + start_volume * (1.0 - t) } else { - // Sustain - envelope.sustain + // Calculate based on ADSR phases + let elapsed = now.duration_since(envelope_state.start_time).as_secs_f32(); + + if elapsed < envelope.attack { + // Attack phase + elapsed / envelope.attack + } else if elapsed < envelope.attack + envelope.decay { + // Decay phase + 1.0 - (elapsed - envelope.attack) / envelope.decay * (1.0 - envelope.sustain) + } else { + // Sustain phase + envelope.sustain + } }; sink.set_volume(volume); - // Check if the note should be removed after release + // Check if release is complete if envelope_state.is_releasing { - let elapsed_since_released = now + let elapsed_release = now .duration_since(envelope_state.release_start_time.unwrap()) .as_secs_f32(); - if elapsed_since_released >= envelope.release { + + if elapsed_release >= envelope.release { to_remove.push(*source_id); } } } + // Cleanup completed sounds for source_id in to_remove { self.envelope_states.remove(&source_id); self.audio_sinks.remove(&source_id); From 12c9ae5d456bbd3aa33f91036d31fd5af4552262 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 14:14:41 +0100 Subject: [PATCH 14/18] removed mouse position from context since this is not the right way to handle it --- examples/synth/src/midi_keyboard.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/synth/src/midi_keyboard.rs b/examples/synth/src/midi_keyboard.rs index 3a2d6a5..a016434 100644 --- a/examples/synth/src/midi_keyboard.rs +++ b/examples/synth/src/midi_keyboard.rs @@ -526,6 +526,7 @@ impl MidiKeyboard { .hover(move |cx, is_hovering| { if !is_hovering { cx[s].mouse_position = None; + println!("stopped hovering"); } }) }, From 6359666801145cf9d033ef8ab2f5c461372c9203 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 14:24:25 +0100 Subject: [PATCH 15/18] added a new key event for handling both presses and releases --- src/context.rs | 4 ---- src/event.rs | 23 ++++++++++++++++------- src/views/focus.rs | 2 +- src/views/key.rs | 2 +- src/winit_event_loop.rs | 23 +++++++++++++++-------- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/context.rs b/src/context.rs index 75bd67b..e531619 100644 --- a/src/context.rs +++ b/src/context.rs @@ -71,9 +71,6 @@ pub struct Context { /// Current mouse button for event handling. pub(crate) mouse_button: Option, - /// Current mouse position. - pub mouse_position: Option, - /// Mouse button state. pub mouse_buttons: MouseButtons, @@ -141,7 +138,6 @@ impl Context { touches: [ViewId::default(); 16], starts: [LocalPoint::zero(); 16], previous_position: [LocalPoint::zero(); 16], - mouse_position: None, mouse_button: None, mouse_buttons: Default::default(), key_mods: Default::default(), diff --git a/src/event.rs b/src/event.rs index 31739e6..98334af 100644 --- a/src/event.rs +++ b/src/event.rs @@ -25,16 +25,19 @@ pub enum Event { position: LocalPoint, }, - // /// Mouse Move. - // MouseMove { - // position: LocalPoint, - // delta: LocalOffset, - // }, + /// Called when the mouse gets outside the window + MouseLeftWindow, + /// Menu command. Command(String), - /// Key press. - Key(Key), + /// Key press. (Deprecated) + KeyEvent(Key), + + /// Key Event + Key { key: Key, state: ElementState }, + + /// Key Event /// Animation. Anim, @@ -74,6 +77,12 @@ pub struct KeyboardModifiers { pub command: bool, } +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum ElementState { + Pressed, + Released, +} + #[derive(Copy, Clone, Debug)] pub enum Key { Character(char), diff --git a/src/views/focus.rs b/src/views/focus.rs index 86b3c35..d017754 100644 --- a/src/views/focus.rs +++ b/src/views/focus.rs @@ -27,7 +27,7 @@ where cx.set_dirty(); } } - Event::Key(Key::Escape) => { + Event::KeyEvent(Key::Escape) => { if cx.focused_id == Some(vid) { cx.focused_id = None; cx.set_dirty(); diff --git a/src/views/key.rs b/src/views/key.rs index 1618cd9..f98e66c 100644 --- a/src/views/key.rs +++ b/src/views/key.rs @@ -31,7 +31,7 @@ where cx: &mut Context, actions: &mut Vec>, ) { - if let Event::Key(key) = &event { + if let Event::KeyEvent(key) = &event { actions.push(Box::new((self.func)(cx, key.clone()))); } } diff --git a/src/winit_event_loop.rs b/src/winit_event_loop.rs index b7c0bc1..dd5e848 100644 --- a/src/winit_event_loop.rs +++ b/src/winit_event_loop.rs @@ -11,8 +11,8 @@ use winit::event_loop::EventLoopProxy; use winit::{ application::ApplicationHandler, event::{ - DeviceEvent, DeviceId, ElementState, KeyEvent as WKeyEvent, MouseButton as WMouseButton, - Touch, TouchPhase, WindowEvent, + DeviceEvent, DeviceId, ElementState as wElementState, KeyEvent as WKeyEvent, + MouseButton as WMouseButton, Touch, TouchPhase, WindowEvent, }, event_loop::{ActiveEventLoop, ControlFlow, EventLoop}, keyboard, @@ -264,7 +264,7 @@ where } WindowEvent::MouseInput { state, button, .. } => { match state { - ElementState::Pressed => { + wElementState::Pressed => { self.cx.mouse_button = match button { WMouseButton::Left => Some(MouseButton::Left), WMouseButton::Right => Some(MouseButton::Right), @@ -289,7 +289,7 @@ where process_event(&mut self.cx, &self.view, &event, &window) } } - ElementState::Released => { + wElementState::Released => { self.cx.mouse_button = None; match button { @@ -356,8 +356,6 @@ where ] .into(); - self.cx.mouse_position = Some(self.mouse_position); - // let event = Event::TouchMove { // id: 0, // position: self.mouse_position, @@ -407,8 +405,17 @@ where _ => None, }; - if let (Some(key), ElementState::Pressed) = (key, key_event.state) { - self.cx.process(&self.view, &Event::Key(key)) + if let (Some(key), wElementState::Pressed) = (key, key_event.state) { + self.cx.process(&self.view, &Event::KeyEvent(key)) + } + + if let Some(key) = key { + let state = match key_event.state { + wElementState::Pressed => ElementState::Pressed, + wElementState::Released => ElementState::Released, + }; + + self.cx.process(&self.view, &Event::Key { key, state }) } } From 8ec360d0ae04b5c65f67095ddccc86820a5f96e1 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 14:46:44 +0100 Subject: [PATCH 16/18] keyboard released event + modifier --- src/event.rs | 14 ++++++-------- src/modifiers.rs | 30 ++++++++++++++++++++++++------ src/views/focus.rs | 2 +- src/views/key.rs | 37 +++++++++++++++++++++++++++++++++---- src/winit_event_loop.rs | 11 +++-------- 5 files changed, 67 insertions(+), 27 deletions(-) diff --git a/src/event.rs b/src/event.rs index 98334af..b911f58 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,7 +1,7 @@ use crate::*; /// User interface event. -#[derive(Clone, Debug)] +#[derive(Clone, PartialEq, Debug)] pub enum Event { /// Touch event, or mouse down. TouchBegin { @@ -31,13 +31,11 @@ pub enum Event { /// Menu command. Command(String), - /// Key press. (Deprecated) - KeyEvent(Key), + /// Key press. + Key(Key), - /// Key Event - Key { key: Key, state: ElementState }, - - /// Key Event + /// Key released. + KeyReleased(Key), /// Animation. Anim, @@ -83,7 +81,7 @@ pub enum ElementState { Released, } -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, PartialEq, Debug)] pub enum Key { Character(char), diff --git a/src/modifiers.rs b/src/modifiers.rs index 836749f..f140087 100644 --- a/src/modifiers.rs +++ b/src/modifiers.rs @@ -30,7 +30,9 @@ pub trait Modifiers: View + Sized { } /// Calls a function in response to a drag. - fn drag) + Clone + 'static>( + fn drag< + F: Fn(&mut Context, LocalOffset, GestureState, Option) + Clone + 'static, + >( self, f: F, ) -> Drag> { @@ -38,7 +40,9 @@ pub trait Modifiers: View + Sized { } /// Calls a function in response to a drag. Version which passes the position. - fn drag_p) + Clone + 'static>( + fn drag_p< + F: Fn(&mut Context, LocalPoint, GestureState, Option) + Clone + 'static, + >( self, f: F, ) -> Drag> { @@ -98,13 +102,21 @@ pub trait Modifiers: View + Sized { /// Calls a function with the view's geometry after layout runs. /// Currently only the view's size is returned. - fn geom(self, f: F) -> Geom { + fn geom( + self, + f: F, + ) -> Geom { Geom::new(self, f) } /// Responds to keyboard events fn key(self, f: F) -> KeyView { - KeyView::new(self, f) + KeyView::new_pressed(self, f) + } + + /// Responds to keyboard events + fn key_released(self, f: F) -> KeyView { + KeyView::new_released(self, f) } /// Applies an offset to the view in local space. @@ -128,7 +140,10 @@ pub trait Modifiers: View + Sized { } /// Calls a function in response to a tap. - fn tap A + Clone + 'static>(self, f: F) -> Tap> { + fn tap A + Clone + 'static>( + self, + f: F, + ) -> Tap> { Tap::new(self, TapAdapter { f }) } @@ -139,7 +154,10 @@ pub trait Modifiers: View + Sized { } /// Version of `tap` which passes the tap position and mouse button. - fn tap_p) -> A + Clone + 'static>( + fn tap_p< + A: 'static, + F: Fn(&mut Context, LocalPoint, Option) -> A + Clone + 'static, + >( self, f: F, ) -> Tap> { diff --git a/src/views/focus.rs b/src/views/focus.rs index d017754..86b3c35 100644 --- a/src/views/focus.rs +++ b/src/views/focus.rs @@ -27,7 +27,7 @@ where cx.set_dirty(); } } - Event::KeyEvent(Key::Escape) => { + Event::Key(Key::Escape) => { if cx.focused_id == Some(vid) { cx.focused_id = None; cx.set_dirty(); diff --git a/src/views/key.rs b/src/views/key.rs index f98e66c..288fafa 100644 --- a/src/views/key.rs +++ b/src/views/key.rs @@ -1,11 +1,19 @@ use crate::*; use std::any::Any; +/// Describes if the KeyView action should trigger when pressing or releasing a key +#[derive(Clone)] +pub enum KeyViewKind { + Pressed, + Released, +} + /// Struct for the `key` modifier. #[derive(Clone)] pub struct KeyView { child: V, func: F, + kind: KeyViewKind, } impl KeyView @@ -13,8 +21,20 @@ where V: View, F: Fn(&mut Context, Key) -> A + Clone + 'static, { - pub fn new(v: V, f: F) -> Self { - KeyView { child: v, func: f } + pub fn new_pressed(v: V, f: F) -> Self { + KeyView { + child: v, + func: f, + kind: KeyViewKind::Pressed, + } + } + + pub fn new_released(v: V, f: F) -> Self { + KeyView { + child: v, + func: f, + kind: KeyViewKind::Released, + } } } @@ -31,8 +51,17 @@ where cx: &mut Context, actions: &mut Vec>, ) { - if let Event::KeyEvent(key) = &event { - actions.push(Box::new((self.func)(cx, key.clone()))); + match self.kind { + KeyViewKind::Pressed => { + if let Event::Key(key) = &event { + actions.push(Box::new((self.func)(cx, key.clone()))); + } + } + KeyViewKind::Released => { + if let Event::KeyReleased(key) = &event { + actions.push(Box::new((self.func)(cx, key.clone()))); + } + } } } diff --git a/src/winit_event_loop.rs b/src/winit_event_loop.rs index dd5e848..7aea793 100644 --- a/src/winit_event_loop.rs +++ b/src/winit_event_loop.rs @@ -406,16 +406,11 @@ where }; if let (Some(key), wElementState::Pressed) = (key, key_event.state) { - self.cx.process(&self.view, &Event::KeyEvent(key)) + self.cx.process(&self.view, &Event::Key(key)) } - if let Some(key) = key { - let state = match key_event.state { - wElementState::Pressed => ElementState::Pressed, - wElementState::Released => ElementState::Released, - }; - - self.cx.process(&self.view, &Event::Key { key, state }) + if let (Some(key), wElementState::Released) = (key, key_event.state) { + self.cx.process(&self.view, &Event::KeyReleased(key)) } } From fac07dc0b3249c79725c2ce7a1a636285f42d7b5 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 14:55:06 +0100 Subject: [PATCH 17/18] synth --- examples/synth/src/midi_keyboard.rs | 266 +++++++++++++++------------- 1 file changed, 141 insertions(+), 125 deletions(-) diff --git a/examples/synth/src/midi_keyboard.rs b/examples/synth/src/midi_keyboard.rs index a016434..e62fadd 100644 --- a/examples/synth/src/midi_keyboard.rs +++ b/examples/synth/src/midi_keyboard.rs @@ -392,117 +392,118 @@ impl MidiKeyboard { /// # Arguments /// * `config` - Configuration for the MIDI keyboard pub fn show(config: MidiKeyboardConfig) -> impl View { - state( - move || MidiKeyboardState::new(config.clone()), - |s, _| { - canvas(move |cx, rect, vger| { - // Pre-calculate commonly used values - let total_white_keys = cx[s].num_white_keys(); - let white_key_width = rect.width() / total_white_keys as f32; - let key_height = rect.height(); - let black_key_height = key_height * 0.6; - - // Create paint indices once for reuse - let white_paint = vger.color_paint(vger::Color::new(1.0, 1.0, 1.0, 1.0)); - let white_held_paint = vger.color_paint(vger::Color::new(0.8, 0.8, 0.8, 1.0)); - let white_hover_paint = - vger.color_paint(vger::Color::new(0.85, 0.85, 0.85, 1.0)); - let black_paint = vger.color_paint(vger::Color::new(0.1, 0.1, 0.1, 1.0)); - let black_held_paint = vger.color_paint(vger::Color::new(0.3, 0.3, 0.3, 1.0)); - let black_hover_paint = vger.color_paint(vger::Color::new(0.2, 0.2, 0.2, 1.0)); - - // Calculate hovered key using binary search for mouse position - let hovered_key_idx = if let Some(mouse_position) = cx[s].mouse_position { - Self::find_hovered_key( - &cx[s].keyboard_layout, - mouse_position, - white_key_width, - key_height, - black_key_height, - ) - } else { - None - }; - - // Batch render white keys - let white_keys: Vec<_> = cx[s] - .keyboard_layout - .iter() - .enumerate() - .filter(|(_, (_, _, is_black))| !is_black) - .collect(); - - for (index, (x, width, _)) in white_keys { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - let is_held = cx[s].keys[index].is_some(); - let is_hovered = hovered_key_idx == Some(index as MidiNoteId); - - let paint = if is_held { - white_held_paint - } else if is_hovered { - white_hover_paint + focus(move |has_focus| { + let config = config.clone(); + state( + move || MidiKeyboardState::new(config.clone()), + move |s, _| { + canvas(move |cx, rect, vger| { + // Pre-calculate commonly used values + let total_white_keys = cx[s].num_white_keys(); + let white_key_width = rect.width() / total_white_keys as f32; + let key_height = rect.height(); + let black_key_height = key_height * 0.6; + + // Create paint indices once for reuse + let white_paint = vger.color_paint(vger::Color::new(1.0, 1.0, 1.0, 1.0)); + let white_held_paint = + vger.color_paint(vger::Color::new(0.8, 0.8, 0.8, 1.0)); + let white_hover_paint = + vger.color_paint(vger::Color::new(0.85, 0.85, 0.85, 1.0)); + let black_paint = vger.color_paint(vger::Color::new(0.1, 0.1, 0.1, 1.0)); + let black_held_paint = + vger.color_paint(vger::Color::new(0.3, 0.3, 0.3, 1.0)); + let black_hover_paint = + vger.color_paint(vger::Color::new(0.2, 0.2, 0.2, 1.0)); + + // Calculate hovered key using binary search for mouse position + let hovered_key_idx = if let Some(mouse_position) = cx[s].mouse_position { + Self::find_hovered_key( + &cx[s].keyboard_layout, + mouse_position, + white_key_width, + key_height, + black_key_height, + ) } else { - white_paint + None }; - let rect = LocalRect::new( - LocalPoint::new(key_x, 0.0), - LocalSize::new(key_width, key_height), - ); - vger.fill_rect(rect, 0.0, paint); - } - - // Batch render black keys - let black_keys: Vec<_> = cx[s] - .keyboard_layout - .iter() - .enumerate() - .filter(|(_, (_, _, is_black))| *is_black) - .collect(); - - for (index, (x, width, _)) in black_keys { - let key_x = x * white_key_width; - let key_width = white_key_width * width; - let is_held = cx[s].keys[index].is_some(); - let is_hovered = hovered_key_idx == Some(index as MidiNoteId); - - let paint = if is_held { - black_held_paint - } else if is_hovered { - black_hover_paint - } else { - black_paint - }; - - let rect = LocalRect::new( - LocalPoint::new(key_x, key_height - black_key_height), - LocalSize::new(key_width, black_key_height), - ); - vger.fill_rect(rect, 0.1 * key_width, paint); - } + // Batch render white keys + let white_keys: Vec<_> = cx[s] + .keyboard_layout + .iter() + .enumerate() + .filter(|(_, (_, _, is_black))| !is_black) + .collect(); + + for (index, (x, width, _)) in white_keys { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + let is_held = cx[s].keys[index].is_some(); + let is_hovered = hovered_key_idx == Some(index as MidiNoteId); + + let paint = if is_held { + white_held_paint + } else if is_hovered { + white_hover_paint + } else { + white_paint + }; + + let rect = LocalRect::new( + LocalPoint::new(key_x, 0.0), + LocalSize::new(key_width, key_height), + ); + vger.fill_rect(rect, 0.0, paint); + } - cx[s].hovered_key = hovered_key_idx; - }) - .drag_p( - move |cx, local_position, gesture_state, mouse_button| match gesture_state { - GestureState::Began => { - if mouse_button == Some(MouseButton::Left) { - cx[s].mouse_dragging = true; - cx[s].current_drag_key = cx[s].hovered_key; - if let Some(current_drag_key) = cx[s].current_drag_key { - let default_velocity = cx[s].config.default_velocity; - let _ = cx[s].press_key(current_drag_key, default_velocity); - } - } + // Batch render black keys + let black_keys: Vec<_> = cx[s] + .keyboard_layout + .iter() + .enumerate() + .filter(|(_, (_, _, is_black))| *is_black) + .collect(); + + for (index, (x, width, _)) in black_keys { + let key_x = x * white_key_width; + let key_width = white_key_width * width; + let is_held = cx[s].keys[index].is_some(); + let is_hovered = hovered_key_idx == Some(index as MidiNoteId); + + let paint = if is_held { + black_held_paint + } else if is_hovered { + black_hover_paint + } else { + black_paint + }; + + let rect = LocalRect::new( + LocalPoint::new(key_x, key_height - black_key_height), + LocalSize::new(key_width, black_key_height), + ); + vger.fill_rect(rect, 0.1 * key_width, paint); } - GestureState::Changed => { - if cx[s].mouse_position.is_some() { - cx[s].mouse_position = Some(local_position); - if cx[s].current_drag_key != cx[s].hovered_key { - if let Some(preview_drag_key) = cx[s].current_drag_key { - let _ = cx[s].release_key(preview_drag_key); - } + + cx[s].hovered_key = hovered_key_idx; + }) + // .key(move |cx, k| { + // if has_focus { + // println!("key pressed: {:#?}", k); + // } + // }) + // .key_released(move |cx, k| { + // if has_focus { + // println!("key released: {:#?}", k); + // } + // }) + .drag_p(move |cx, local_position, gesture_state, mouse_button| { + match gesture_state { + GestureState::Began => { + if mouse_button == Some(MouseButton::Left) { + cx[s].mouse_dragging = true; cx[s].current_drag_key = cx[s].hovered_key; if let Some(current_drag_key) = cx[s].current_drag_key { let default_velocity = cx[s].config.default_velocity; @@ -510,27 +511,42 @@ impl MidiKeyboard { } } } + GestureState::Changed => { + if cx[s].mouse_position.is_some() { + cx[s].mouse_position = Some(local_position); + if cx[s].current_drag_key != cx[s].hovered_key { + if let Some(preview_drag_key) = cx[s].current_drag_key { + let _ = cx[s].release_key(preview_drag_key); + } + cx[s].current_drag_key = cx[s].hovered_key; + if let Some(current_drag_key) = cx[s].current_drag_key { + let default_velocity = cx[s].config.default_velocity; + let _ = + cx[s].press_key(current_drag_key, default_velocity); + } + } + } + } + GestureState::Ended => { + cx[s].mouse_dragging = false; + cx[s].current_drag_key = None; + cx[s].release_not_pressed_keys(); + } + #[allow(unreachable_patterns)] + _ => (), } - GestureState::Ended => { - cx[s].mouse_dragging = false; - cx[s].current_drag_key = None; - cx[s].release_not_pressed_keys(); + }) + .hover_p(move |cx, hover_position| { + cx[s].mouse_position = Some(hover_position); + }) + .hover(move |cx, is_hovering| { + if !is_hovering { + cx[s].mouse_position = None; } - #[allow(unreachable_patterns)] - _ => (), - }, - ) - .hover_p(move |cx, hover_position| { - cx[s].mouse_position = Some(hover_position); - }) - .hover(move |cx, is_hovering| { - if !is_hovering { - cx[s].mouse_position = None; - println!("stopped hovering"); - } - }) - }, - ) + }) + }, + ) + }) } fn find_hovered_key( From acde64379f972be9ad845082d1bf3a2abc74c1b8 Mon Sep 17 00:00:00 2001 From: asdfghj Date: Thu, 30 Jan 2025 14:57:51 +0100 Subject: [PATCH 18/18] synth cleanup --- examples/synth/src/midi_keyboard.rs | 2 +- examples/synth/src/synth/mod.rs | 2 +- examples/synth/src/synth/oscillator.rs | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/synth/src/midi_keyboard.rs b/examples/synth/src/midi_keyboard.rs index e62fadd..fb92b71 100644 --- a/examples/synth/src/midi_keyboard.rs +++ b/examples/synth/src/midi_keyboard.rs @@ -392,7 +392,7 @@ impl MidiKeyboard { /// # Arguments /// * `config` - Configuration for the MIDI keyboard pub fn show(config: MidiKeyboardConfig) -> impl View { - focus(move |has_focus| { + focus(move |_| { let config = config.clone(); state( move || MidiKeyboardState::new(config.clone()), diff --git a/examples/synth/src/synth/mod.rs b/examples/synth/src/synth/mod.rs index 83ea61e..09ce156 100644 --- a/examples/synth/src/synth/mod.rs +++ b/examples/synth/src/synth/mod.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::time::{Duration, Instant}; +use std::time::Instant; use rodio::source::Source; use rodio::Sink; diff --git a/examples/synth/src/synth/oscillator.rs b/examples/synth/src/synth/oscillator.rs index c7b46fa..6124803 100644 --- a/examples/synth/src/synth/oscillator.rs +++ b/examples/synth/src/synth/oscillator.rs @@ -29,6 +29,7 @@ impl Default for OscillatorConfig { } } +#[allow(dead_code)] impl OscillatorConfig { /// Create a new configuration with custom parameters pub fn new() -> Self { @@ -188,6 +189,7 @@ pub struct Oscillator { analog_osc: AnalogOsc, } +#[allow(dead_code)] impl Oscillator { /// Create oscillators for different wave types with default configuration pub fn sine(freq: f32) -> Self {